ZGlmZiAtLWdpdCBhLy5naXRodWIvSVNTVUVfVEVNUExBVEUvYnVnX3JlcG9ydC5tZCBiLy5naXRodWIvSVNTVUVfVEVNUExBVEUvYnVnX3JlcG9ydC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzZmZWMxCi0tLSAvZGV2L251bGwKKysrIGIvLmdpdGh1Yi9JU1NVRV9URU1QTEFURS9idWdfcmVwb3J0Lm1kCkBAIC0wLDAgKzEsMzUgQEAKKy0tLQorbmFtZTogQnVnIHJlcG9ydAorYWJvdXQ6IENyZWF0ZSBhIHJlcG9ydCB0byBoZWxwIHVzIGltcHJvdmUKK3RpdGxlOiAnJworbGFiZWxzOiAnJworYXNzaWduZWVzOiAnJworCistLS0KKworKipDYXV0aW9uKioKK1RoZSBJc3N1ZXMgYXJlIHN0cmljdGx5IGxpbWl0ZWQgZm9yIHRoZSByZXBvcnRpbmcgb2YgcHJvYmxlbSBlbmNvdW50ZXJlZCB3aXRoIHRoZSBzb2Z0d2FyZSBwcm92aWRlZCBpbiB0aGlzIHByb2plY3QuCitGb3IgYW55IG90aGVyIHByb2JsZW0gcmVsYXRlZCB0byB0aGUgU1RNMzIgcHJvZHVjdCwgdGhlIHBlcmZvcm1hbmNlLCB0aGUgaGFyZHdhcmUgY2hhcmFjdGVyaXN0aWNzIGFuZCBib2FyZHMsIHRoZSB0b29scyB0aGUgZW52aXJvbm1lbnQgaW4gZ2VuZXJhbCwgcGxlYXNlIHBvc3QgYSB0b3BpYyBpbiB0aGUgW1NUIENvbW11bml0eS9TVE0zMiBNQ1VzIGZvcnVtXShodHRwczovL2NvbW11bml0eS5zdC5jb20vcy9ncm91cC8wRjkwWDAwMDAwMEFYc0FTQVcvc3RtMzItbWN1cykgCisKKyoqRGVzY3JpYmUgdGhlIHNldC11cCoqCisgKiBUaGUgYm9hcmQgKGVpdGhlciBTVCBSUE4gcmVmZXJlbmNlIG9yIHlvdXIgY3VzdG9tIGJvYXJkKQorICogSURFIG9yIGF0IGxlYXN0IHRoZSBjb21waWxlciBhbmQgaXRzIHZlcnNpb24KKworKipEZXNjcmliZSB0aGUgYnVnKioKK0EgY2xlYXIgYW5kIGNvbmNpc2UgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGUgYnVnIGlzLgorCisqKkhvdyBUbyBSZXByb2R1Y2UqKgorMS4gSW5kaWNhdGUgdGhlIGdsb2JhbCBiZWhhdmlvciBvZiB5b3VyIGFwcGxpY2F0aW9uIHByb2plY3QKKworMi4gVGhlIG1vZHVsZXMgdGhhdCB5b3Ugc3VzcGVjdCB0byBiZSB0aGUgY2F1c2Ugb2YgdGhlIHByb2JsZW0gKERyaXZlciwgQlNQLCBNVyAuLi4pCisKKzMuIFRoZSB1c2UgY2FzZSB0aGF0IGdlbmVyYXRlcyB0aGUgcHJvYmxlbQorCis0LiBIb3cgd2UgY2FuIHJlcHJvZHVjZSB0aGUgcHJvYmxlbQorCisKKyoqQWRkaXRpb25hbCBjb250ZXh0KioKK0lmIHlvdSBoYXZlIGEgZmlyc3QgYW5hbHlzaXMgb3IgcGF0Y2ggY29ycmVjdGlvbiwgdGhhbmsgeW91IHRvIHNoYXJlIHlvdXIgcHJvcG9zYWwuCisKKyoqU2NyZWVuc2hvdHMqKgorSWYgYXBwbGljYWJsZSwgYWRkIHNjcmVlbnNob3RzIHRvIGhlbHAgZXhwbGFpbiB5b3VyIHByb2JsZW0uCmRpZmYgLS1naXQgYS8uZ2l0aHViL0lTU1VFX1RFTVBMQVRFL290aGVyLWlzc3VlLm1kIGIvLmdpdGh1Yi9JU1NVRV9URU1QTEFURS9vdGhlci1pc3N1ZS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTY0ODYxCi0tLSAvZGV2L251bGwKKysrIGIvLmdpdGh1Yi9JU1NVRV9URU1QTEFURS9vdGhlci1pc3N1ZS5tZApAQCAtMCwwICsxLDIyIEBACistLS0KK25hbWU6ICdPdGhlciBJc3N1ZSAnCithYm91dDogR2VuZXJpYyBpc3N1ZSBkZXNjcmlwdGlvbgordGl0bGU6ICcnCitsYWJlbHM6ICcnCithc3NpZ25lZXM6ICcnCisKKy0tLQorCisqKkNhdXRpb24qKgorVGhlIElzc3VlcyBhcmUgc3RyaWN0bHkgbGltaXRlZCBmb3IgdGhlIHJlcG9ydGluZyBvZiBwcm9ibGVtIGVuY291bnRlcmVkIHdpdGggdGhlIHNvZnR3YXJlIHByb3ZpZGVkIGluIHRoaXMgcHJvamVjdC4KK0ZvciBhbnkgb3RoZXIgcHJvYmxlbSByZWxhdGVkIHRvIHRoZSBTVE0zMiBwcm9kdWN0LCB0aGUgcGVyZm9ybWFuY2UsIHRoZSBoYXJkd2FyZSBjaGFyYWN0ZXJpc3RpY3MgYW5kIGJvYXJkcywgdGhlIHRvb2xzIHRoZSBlbnZpcm9ubWVudCBpbiBnZW5lcmFsLCBwbGVhc2UgcG9zdCBhIHRvcGljIGluIHRoZSBbU1QgQ29tbXVuaXR5L1NUTTMyIE1DVXMgZm9ydW1dKGh0dHBzOi8vY29tbXVuaXR5LnN0LmNvbS9zL2dyb3VwLzBGOTBYMDAwMDAwQVhzQVNBVy9zdG0zMi1tY3VzKSAKKworKipEZXNjcmliZSB0aGUgc2V0LXVwKioKKyAqIFRoZSBib2FyZCAoZWl0aGVyIFNUIFJQTiByZWZlcmVuY2Ugb3IgeW91ciBjdXN0b20gYm9hcmQpCisgKiBJREUgb3IgYXQgbGVhc3QgdGhlIGNvbXBpbGVyIGFuZCBpdHMgdmVyc2lvbgorCisqKkFkZGl0aW9uYWwgY29udGV4dCoqCitJZiB5b3UgaGF2ZSBhIGZpcnN0IGFuYWx5c2lzIG9yIGEgcGF0Y2ggcHJvcG9zYWwsIHRoYW5rIHlvdSB0byBzaGFyZSB5b3VyIHByb3Bvc2FsLgorCisqKlNjcmVlbnNob3RzKioKK0lmIGFwcGxpY2FibGUsIGFkZCBzY3JlZW5zaG90cyB0byBoZWxwIGV4cGxhaW4geW91ciBwcm9ibGVtLgpkaWZmIC0tZ2l0IGEvLmdpdGh1Yi9QVUxMX1JFUVVFU1RfVEVNUExBVEUubWQgYi8uZ2l0aHViL1BVTExfUkVRVUVTVF9URU1QTEFURS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjFkYTA2Ci0tLSAvZGV2L251bGwKKysrIGIvLmdpdGh1Yi9QVUxMX1JFUVVFU1RfVEVNUExBVEUubWQKQEAgLTAsMCArMSw4IEBACisjIyBJTVBPUlRBTlQgSU5GT1JNQVRJT04gCisKKyMjIyBDb250cmlidXRvciBMaWNlbnNlIEFncmVlbWVudCAoQ0xBKQorKiBUaGUgUHVsbCBSZXF1ZXN0IGZlYXR1cmUgd2lsbCBiZSBjb25zaWRlcmVkIGJ5IFNUTWljcm9lbGVjdHJvbmljcyBvbmx5IGFmdGVyIGEgKipDb250cmlidXRvciBMaWNlbnNlIEFncmVlbWVudCAoQ0xBKSoqIG1lY2hhbmlzbSBoYXMgYmVlbiBkZXBsb3llZC4KKyogV2UgYXJlIGN1cnJlbnRseSB3b3JraW5nIG9uIHRoZSBzZXQtdXAgb2YgdGhpcyBwcm9jZWR1cmUuIAorICAKKworCmRpZmYgLS1naXQgYS9DT0RFX09GX0NPTkRVQ1QubWQgYi9DT0RFX09GX0NPTkRVQ1QubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk1MmIwNAotLS0gL2Rldi9udWxsCisrKyBiL0NPREVfT0ZfQ09ORFVDVC5tZApAQCAtMCwwICsxLDc2IEBACisjIENvbnRyaWJ1dG9yIENvdmVuYW50IENvZGUgb2YgQ29uZHVjdAorCisjIyBPdXIgUGxlZGdlCisKK0luIHRoZSBpbnRlcmVzdCBvZiBmb3N0ZXJpbmcgYW4gb3BlbiBhbmQgd2VsY29taW5nIGVudmlyb25tZW50LCB3ZSBhcworY29udHJpYnV0b3JzIGFuZCBtYWludGFpbmVycyBwbGVkZ2UgdG8gbWFraW5nIHBhcnRpY2lwYXRpb24gaW4gb3VyIHByb2plY3QgYW5kCitvdXIgY29tbXVuaXR5IGEgaGFyYXNzbWVudC1mcmVlIGV4cGVyaWVuY2UgZm9yIGV2ZXJ5b25lLCByZWdhcmRsZXNzIG9mIGFnZSwgYm9keQorc2l6ZSwgZGlzYWJpbGl0eSwgZXRobmljaXR5LCBzZXggY2hhcmFjdGVyaXN0aWNzLCBnZW5kZXIgaWRlbnRpdHkgYW5kIGV4cHJlc3Npb24sCitsZXZlbCBvZiBleHBlcmllbmNlLCBlZHVjYXRpb24sIHNvY2lvLWVjb25vbWljIHN0YXR1cywgbmF0aW9uYWxpdHksIHBlcnNvbmFsCithcHBlYXJhbmNlLCByYWNlLCByZWxpZ2lvbiwgb3Igc2V4dWFsIGlkZW50aXR5IGFuZCBvcmllbnRhdGlvbi4KKworIyMgT3VyIFN0YW5kYXJkcworCitFeGFtcGxlcyBvZiBiZWhhdmlvciB0aGF0IGNvbnRyaWJ1dGVzIHRvIGNyZWF0aW5nIGEgcG9zaXRpdmUgZW52aXJvbm1lbnQKK2luY2x1ZGU6CisKKyogVXNpbmcgd2VsY29taW5nIGFuZCBpbmNsdXNpdmUgbGFuZ3VhZ2UKKyogQmVpbmcgcmVzcGVjdGZ1bCBvZiBkaWZmZXJpbmcgdmlld3BvaW50cyBhbmQgZXhwZXJpZW5jZXMKKyogR3JhY2VmdWxseSBhY2NlcHRpbmcgY29uc3RydWN0aXZlIGNyaXRpY2lzbQorKiBGb2N1c2luZyBvbiB3aGF0IGlzIGJlc3QgZm9yIHRoZSBjb21tdW5pdHkKKyogU2hvd2luZyBlbXBhdGh5IHRvd2FyZHMgb3RoZXIgY29tbXVuaXR5IG1lbWJlcnMKKworRXhhbXBsZXMgb2YgdW5hY2NlcHRhYmxlIGJlaGF2aW9yIGJ5IHBhcnRpY2lwYW50cyBpbmNsdWRlOgorCisqIFRoZSB1c2Ugb2Ygc2V4dWFsaXplZCBsYW5ndWFnZSBvciBpbWFnZXJ5IGFuZCB1bndlbGNvbWUgc2V4dWFsIGF0dGVudGlvbiBvcgorIGFkdmFuY2VzCisqIFRyb2xsaW5nLCBpbnN1bHRpbmcvZGVyb2dhdG9yeSBjb21tZW50cywgYW5kIHBlcnNvbmFsIG9yIHBvbGl0aWNhbCBhdHRhY2tzCisqIFB1YmxpYyBvciBwcml2YXRlIGhhcmFzc21lbnQKKyogUHVibGlzaGluZyBvdGhlcnMnIHByaXZhdGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYSBwaHlzaWNhbCBvciBlbGVjdHJvbmljCisgYWRkcmVzcywgd2l0aG91dCBleHBsaWNpdCBwZXJtaXNzaW9uCisqIE90aGVyIGNvbmR1Y3Qgd2hpY2ggY291bGQgcmVhc29uYWJseSBiZSBjb25zaWRlcmVkIGluYXBwcm9wcmlhdGUgaW4gYQorIHByb2Zlc3Npb25hbCBzZXR0aW5nCisKKyMjIE91ciBSZXNwb25zaWJpbGl0aWVzCisKK1Byb2plY3QgbWFpbnRhaW5lcnMgYXJlIHJlc3BvbnNpYmxlIGZvciBjbGFyaWZ5aW5nIHRoZSBzdGFuZGFyZHMgb2YgYWNjZXB0YWJsZQorYmVoYXZpb3IgYW5kIGFyZSBleHBlY3RlZCB0byB0YWtlIGFwcHJvcHJpYXRlIGFuZCBmYWlyIGNvcnJlY3RpdmUgYWN0aW9uIGluCityZXNwb25zZSB0byBhbnkgaW5zdGFuY2VzIG9mIHVuYWNjZXB0YWJsZSBiZWhhdmlvci4KKworUHJvamVjdCBtYWludGFpbmVycyBoYXZlIHRoZSByaWdodCBhbmQgcmVzcG9uc2liaWxpdHkgdG8gcmVtb3ZlLCBlZGl0LCBvcgorcmVqZWN0IGNvbW1lbnRzLCBjb21taXRzLCBjb2RlLCB3aWtpIGVkaXRzLCBpc3N1ZXMsIGFuZCBvdGhlciBjb250cmlidXRpb25zCit0aGF0IGFyZSBub3QgYWxpZ25lZCB0byB0aGlzIENvZGUgb2YgQ29uZHVjdCwgb3IgdG8gYmFuIHRlbXBvcmFyaWx5IG9yCitwZXJtYW5lbnRseSBhbnkgY29udHJpYnV0b3IgZm9yIG90aGVyIGJlaGF2aW9ycyB0aGF0IHRoZXkgZGVlbSBpbmFwcHJvcHJpYXRlLAordGhyZWF0ZW5pbmcsIG9mZmVuc2l2ZSwgb3IgaGFybWZ1bC4KKworIyMgU2NvcGUKKworVGhpcyBDb2RlIG9mIENvbmR1Y3QgYXBwbGllcyBib3RoIHdpdGhpbiBwcm9qZWN0IHNwYWNlcyBhbmQgaW4gcHVibGljIHNwYWNlcword2hlbiBhbiBpbmRpdmlkdWFsIGlzIHJlcHJlc2VudGluZyB0aGUgcHJvamVjdCBvciBpdHMgY29tbXVuaXR5LiBFeGFtcGxlcyBvZgorcmVwcmVzZW50aW5nIGEgcHJvamVjdCBvciBjb21tdW5pdHkgaW5jbHVkZSB1c2luZyBhbiBvZmZpY2lhbCBwcm9qZWN0IGUtbWFpbAorYWRkcmVzcywgcG9zdGluZyB2aWEgYW4gb2ZmaWNpYWwgc29jaWFsIG1lZGlhIGFjY291bnQsIG9yIGFjdGluZyBhcyBhbiBhcHBvaW50ZWQKK3JlcHJlc2VudGF0aXZlIGF0IGFuIG9ubGluZSBvciBvZmZsaW5lIGV2ZW50LiBSZXByZXNlbnRhdGlvbiBvZiBhIHByb2plY3QgbWF5IGJlCitmdXJ0aGVyIGRlZmluZWQgYW5kIGNsYXJpZmllZCBieSBwcm9qZWN0IG1haW50YWluZXJzLgorCisjIyBFbmZvcmNlbWVudAorCitJbnN0YW5jZXMgb2YgYWJ1c2l2ZSwgaGFyYXNzaW5nLCBvciBvdGhlcndpc2UgdW5hY2NlcHRhYmxlIGJlaGF2aW9yIG1heSBiZQorcmVwb3J0ZWQgYnkgY29udGFjdGluZyB0aGUgcHJvamVjdCB0ZWFtIGF0IGh0dHBzOi8vd3d3LnN0LmNvbS9jb250ZW50L3N0X2NvbS9lbi9jb250YWN0LXVzLmh0bWwuIEFsbAorY29tcGxhaW50cyB3aWxsIGJlIHJldmlld2VkIGFuZCBpbnZlc3RpZ2F0ZWQgYW5kIHdpbGwgcmVzdWx0IGluIGEgcmVzcG9uc2UgdGhhdAoraXMgZGVlbWVkIG5lY2Vzc2FyeSBhbmQgYXBwcm9wcmlhdGUgdG8gdGhlIGNpcmN1bXN0YW5jZXMuIFRoZSBwcm9qZWN0IHRlYW0gaXMKK29ibGlnYXRlZCB0byBtYWludGFpbiBjb25maWRlbnRpYWxpdHkgd2l0aCByZWdhcmQgdG8gdGhlIHJlcG9ydGVyIG9mIGFuIGluY2lkZW50LgorRnVydGhlciBkZXRhaWxzIG9mIHNwZWNpZmljIGVuZm9yY2VtZW50IHBvbGljaWVzIG1heSBiZSBwb3N0ZWQgc2VwYXJhdGVseS4KKworUHJvamVjdCBtYWludGFpbmVycyB3aG8gZG8gbm90IGZvbGxvdyBvciBlbmZvcmNlIHRoZSBDb2RlIG9mIENvbmR1Y3QgaW4gZ29vZAorZmFpdGggbWF5IGZhY2UgdGVtcG9yYXJ5IG9yIHBlcm1hbmVudCByZXBlcmN1c3Npb25zIGFzIGRldGVybWluZWQgYnkgb3RoZXIKK21lbWJlcnMgb2YgdGhlIHByb2plY3QncyBsZWFkZXJzaGlwLgorCisjIyBBdHRyaWJ1dGlvbgorCitUaGlzIENvZGUgb2YgQ29uZHVjdCBpcyBhZGFwdGVkIGZyb20gdGhlIFtDb250cmlidXRvciBDb3ZlbmFudF1baG9tZXBhZ2VdLCB2ZXJzaW9uIDEuNCwKK2F2YWlsYWJsZSBhdCBodHRwczovL3d3dy5jb250cmlidXRvci1jb3ZlbmFudC5vcmcvdmVyc2lvbi8xLzQvY29kZS1vZi1jb25kdWN0Lmh0bWwKKworW2hvbWVwYWdlXTogaHR0cHM6Ly93d3cuY29udHJpYnV0b3ItY292ZW5hbnQub3JnCisKK0ZvciBhbnN3ZXJzIHRvIGNvbW1vbiBxdWVzdGlvbnMgYWJvdXQgdGhpcyBjb2RlIG9mIGNvbmR1Y3QsIHNlZQoraHR0cHM6Ly93d3cuY29udHJpYnV0b3ItY292ZW5hbnQub3JnL2ZhcQpkaWZmIC0tZ2l0IGEvQ09OVFJJQlVUSU5HLm1kIGIvQ09OVFJJQlVUSU5HLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMjdjZDcKLS0tIC9kZXYvbnVsbAorKysgYi9DT05UUklCVVRJTkcubWQKQEAgLTAsMCArMSwyMSBAQAorIyMgQ29udHJpYnV0aW5nIGd1aWRlCitUaGlzIGRvY3VtZW50IHNlcnZlcyBhcyBhIGNoZWNrbGlzdCBiZWZvcmUgY29udHJpYnV0aW5nIHRvIHRoaXMgcmVwb3NpdG9yeS4KK0l0IGluY2x1ZGVzIGxpbmtzIHRvIHJlYWQgdXAgb24gaWYgdG9waWNzIGFyZSB1bmNsZWFyIHRvIHlvdS4KKworVGhpcyBndWlkZSBtYWlubHkgZm9jdXNlcyBvbiB0aGUgcHJvcGVyIHVzZSBvZiBHaXQuCisKKyMjIyAxLiBCZWZvcmUgb3BlbmluZyBhbiBpc3N1ZQorVG8gcmVwb3J0IGEgYnVnL3JlcXVlc3QgcGxlYXNlIGZpbGUgYW4gaXNzdWUgaW4gdGhlIHJpZ2h0IHJlcG9zaXRvcnkKKyhleGFtcGxlIGZvciBbc3RtMzJmM3h4X2hhbF9kcml2ZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9TVE1pY3JvZWxlY3Ryb25pY3Mvc3RtMzJmM3h4X2hhbF9kcml2ZXIvaXNzdWVzL25ldy9jaG9vc2UpKS4KK0J1dCBjaGVjayB0aGUgZm9sbG93aW5nIGJveGVzIGJlZm9yZSBwb3N0aW5nIGFuIGlzc3VlOgorCistIFsgXSBgTWFrZSBzdXJlIHlvdSBhcmUgdXNpbmcgdGhlIGxhdGVzdCBjb21taXQgKG1ham9yIHJlbGVhc2VzIGFyZSBUYWdnZWQsIGJ1dCBjb3JyZWN0aW9ucyBhcmUgYXZhaWxhYmxlIGFzIG5ldyBjb21taXRzKS5gCistIFsgXSBgTWFrZSBzdXJlIHlvdXIgaXNzdWUgaXMgYSBxdWVzdGlvbi9mZWVkYmFjay9zdWdnZXN0aW9ucyBSRUxBVEVEIFRPIHRoZSBzb2Z0d2FyZSBwcm92aWRlZCBpbiB0aGlzIHJlcG8uYCBPdGhlcndpc2UsIGl0IHNob3VsZCBiZSBkaXNjdXNzZWQgb24gdGhlIFtTVCBDb21tdW5pdHkvU1RNMzIgTUNVcyBmb3J1bV0oaHR0cHM6Ly9jb21tdW5pdHkuc3QuY29tL3MvZ3JvdXAvMEY5MFgwMDAwMDBBWHNBU0FXL3N0bTMyLW1jdXMpLgorLSBbIF0gYE1ha2Ugc3VyZSB5b3VyIGlzc3VlIGlzIG5vdCBhbHJlYWR5IHJlcG9ydGVkL2ZpeGVkIG9uIEdpdEh1YiBvciBkaXNjdXNzZWQgb24gYSBwcmV2aW91cyBJc3N1ZS5gIFBsZWFzZSByZWZlciB0byB0aGlzIFtkYXNoYm9hcmRdKGh0dHBzOi8vZ2l0aHViLmNvbS9vcmdzL1NUTWljcm9lbGVjdHJvbmljcy9wcm9qZWN0cy8yKSBmb3IgdGhlIGxpc3Qgb2YgaXNzdWVzIGFuZCBwdWxsLXJlcXVlc3RzLiBEbyBub3QgZm9yZ2V0IHRvIGJyb3dzZSBpbnRvIHRoZSAqKmNsb3NlZCoqIGlzc3Vlcy4KKworCisjIyMgMi4gUG9zdGluZyB0aGUgaXNzdWUKK1doZW4geW91IGhhdmUgY2hlY2tlZCB0aGUgcHJldmlvdXMgYm94ZXMuIFlvdSB3aWxsIGZpbmQgdHdvIHRlbXBsYXRlcyBJc3N1ZXMgKEJ1ZyBSZXBvcnQgb3IgT3RoZXIgSXNzdWUpIGF2YWlsYWJsZSBpbiB0aGUgKipJc3N1ZXMqKiB0YWIgb2YgdGhlIHJlcG8KKworIyMjIDMuIFB1bGwgUmVxdWVzdHMKK0ZvciB0aGUgbW9tZW50LCB0aGUgUHVsbCBSZXF1ZXN0IGZlYXR1cmUgaXMgbm90IGRlcGxveWVkLiBTVE1pY3JvbGVjdHJvbmljcyBpcyB3b3JraW5nIG9uIGEgQ29udHJpYnV0b3IgTGljZW5zZSBBZ3JlZW1lbnQgcHJvY2VkdXJlCmRpZmYgLS1naXQgYS9JbmMvTGVnYWN5L3N0bTMyX2hhbF9sZWdhY3kuaCBiL0luYy9MZWdhY3kvc3RtMzJfaGFsX2xlZ2FjeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYzZlMzIKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvTGVnYWN5L3N0bTMyX2hhbF9sZWdhY3kuaApAQCAtMCwwICsxLDMzNzEgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMl9oYWxfbGVnYWN5LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFRoaXMgZmlsZSBjb250YWlucyBhbGlhc2VzIGRlZmluaXRpb24gZm9yIHRoZSBTVE0zMkN1YmUgSEFMIGNvbnN0YW50cworICAqICAgICAgICAgIG1hY3JvcyBhbmQgZnVuY3Rpb25zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTcgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJfSEFMX0xFR0FDWQorI2RlZmluZSBTVE0zMl9IQUxfTEVHQUNZCisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBIQUxfQUVTX0FsaWFzZWRfRGVmaW5lcyBIQUwgQ1JZUCBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBBRVNfRkxBR19SREVSUiAgICAgICAgICAgICAgICAgIENSWVBfRkxBR19SREVSUgorI2RlZmluZSBBRVNfRkxBR19XUkVSUiAgICAgICAgICAgICAgICAgIENSWVBfRkxBR19XUkVSUgorI2RlZmluZSBBRVNfQ0xFQVJGTEFHX0NDRiAgICAgICAgICAgICAgIENSWVBfQ0xFQVJGTEFHX0NDRgorI2RlZmluZSBBRVNfQ0xFQVJGTEFHX1JERVJSICAgICAgICAgICAgIENSWVBfQ0xFQVJGTEFHX1JERVJSCisjZGVmaW5lIEFFU19DTEVBUkZMQUdfV1JFUlIgICAgICAgICAgICAgQ1JZUF9DTEVBUkZMQUdfV1JFUlIKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfQURDX0FsaWFzZWRfRGVmaW5lcyBIQUwgQURDIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19SRVNPTFVUSU9OMTJiICAgICAgICAgICAgICAgQURDX1JFU09MVVRJT05fMTJCCisjZGVmaW5lIEFEQ19SRVNPTFVUSU9OMTBiICAgICAgICAgICAgICAgQURDX1JFU09MVVRJT05fMTBCCisjZGVmaW5lIEFEQ19SRVNPTFVUSU9OOGIgICAgICAgICAgICAgICAgQURDX1JFU09MVVRJT05fOEIKKyNkZWZpbmUgQURDX1JFU09MVVRJT042YiAgICAgICAgICAgICAgICBBRENfUkVTT0xVVElPTl82QgorI2RlZmluZSBPVlJfREFUQV9PVkVSV1JJVFRFTiAgICAgICAgICAgIEFEQ19PVlJfREFUQV9PVkVSV1JJVFRFTgorI2RlZmluZSBPVlJfREFUQV9QUkVTRVJWRUQgICAgICAgICAgICAgIEFEQ19PVlJfREFUQV9QUkVTRVJWRUQKKyNkZWZpbmUgRU9DX1NJTkdMRV9DT05WICAgICAgICAgICAgICAgICBBRENfRU9DX1NJTkdMRV9DT05WCisjZGVmaW5lIEVPQ19TRVFfQ09OViAgICAgICAgICAgICAgICAgICAgQURDX0VPQ19TRVFfQ09OVgorI2RlZmluZSBFT0NfU0lOR0xFX1NFUV9DT05WICAgICAgICAgICAgIEFEQ19FT0NfU0lOR0xFX1NFUV9DT05WCisjZGVmaW5lIFJFR1VMQVJfR1JPVVAgICAgICAgICAgICAgICAgICAgQURDX1JFR1VMQVJfR1JPVVAKKyNkZWZpbmUgSU5KRUNURURfR1JPVVAgICAgICAgICAgICAgICAgICBBRENfSU5KRUNURURfR1JPVVAKKyNkZWZpbmUgUkVHVUxBUl9JTkpFQ1RFRF9HUk9VUCAgICAgICAgICBBRENfUkVHVUxBUl9JTkpFQ1RFRF9HUk9VUAorI2RlZmluZSBBV0RfRVZFTlQgICAgICAgICAgICAgICAgICAgICAgIEFEQ19BV0RfRVZFTlQKKyNkZWZpbmUgQVdEMV9FVkVOVCAgICAgICAgICAgICAgICAgICAgICBBRENfQVdEMV9FVkVOVAorI2RlZmluZSBBV0QyX0VWRU5UICAgICAgICAgICAgICAgICAgICAgIEFEQ19BV0QyX0VWRU5UCisjZGVmaW5lIEFXRDNfRVZFTlQgICAgICAgICAgICAgICAgICAgICAgQURDX0FXRDNfRVZFTlQKKyNkZWZpbmUgT1ZSX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICBBRENfT1ZSX0VWRU5UCisjZGVmaW5lIEpRT1ZGX0VWRU5UICAgICAgICAgICAgICAgICAgICAgQURDX0pRT1ZGX0VWRU5UCisjZGVmaW5lIEFMTF9DSEFOTkVMUyAgICAgICAgICAgICAgICAgICAgQURDX0FMTF9DSEFOTkVMUworI2RlZmluZSBSRUdVTEFSX0NIQU5ORUxTICAgICAgICAgICAgICAgIEFEQ19SRUdVTEFSX0NIQU5ORUxTCisjZGVmaW5lIElOSkVDVEVEX0NIQU5ORUxTICAgICAgICAgICAgICAgQURDX0lOSkVDVEVEX0NIQU5ORUxTCisjZGVmaW5lIFNZU0NGR19GTEFHX1NFTlNPUl9BREMgICAgICAgICAgQURDX0ZMQUdfU0VOU09SCisjZGVmaW5lIFNZU0NGR19GTEFHX1ZSRUZfQURDICAgICAgICAgICAgQURDX0ZMQUdfVlJFRklOVAorI2RlZmluZSBBRENfQ0xPQ0tQUkVTQ0FMRVJfUENMS19ESVYxICAgIEFEQ19DTE9DS19TWU5DX1BDTEtfRElWMQorI2RlZmluZSBBRENfQ0xPQ0tQUkVTQ0FMRVJfUENMS19ESVYyICAgIEFEQ19DTE9DS19TWU5DX1BDTEtfRElWMgorI2RlZmluZSBBRENfQ0xPQ0tQUkVTQ0FMRVJfUENMS19ESVY0ICAgIEFEQ19DTE9DS19TWU5DX1BDTEtfRElWNAorI2RlZmluZSBBRENfQ0xPQ0tQUkVTQ0FMRVJfUENMS19ESVY2ICAgIEFEQ19DTE9DS19TWU5DX1BDTEtfRElWNgorI2RlZmluZSBBRENfQ0xPQ0tQUkVTQ0FMRVJfUENMS19ESVY4ICAgIEFEQ19DTE9DS19TWU5DX1BDTEtfRElWOAorI2RlZmluZSBBRENfRVhURVJOQUxUUklHMF9UNl9UUkdPICAgICAgIEFEQ19FWFRFUk5BTFRSSUdDT05WX1Q2X1RSR08KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJRzFfVDIxX0NDMiAgICAgICBBRENfRVhURVJOQUxUUklHQ09OVl9UMjFfQ0MyCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUcyX1QyX1RSR08gICAgICAgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDJfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHM19UMl9DQzQgICAgICAgIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyX0NDNAorI2RlZmluZSBBRENfRVhURVJOQUxUUklHNF9UMjJfVFJHTyAgICAgIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyMl9UUkdPCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUc3X0VYVF9JVDExICAgICAgQURDX0VYVEVSTkFMVFJJR0NPTlZfRVhUX0lUMTEKKyNkZWZpbmUgQURDX0NMT0NLX0FTWU5DICAgICAgICAgICAgICAgICBBRENfQ0xPQ0tfQVNZTkNfRElWMQorI2RlZmluZSBBRENfRVhURVJOQUxUUklHX0VER0VfTk9ORSAgICAgIEFEQ19FWFRFUk5BTFRSSUdDT05WRURHRV9OT05FCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfRURHRV9SSVNJTkcgICAgQURDX0VYVEVSTkFMVFJJR0NPTlZFREdFX1JJU0lORworI2RlZmluZSBBRENfRVhURVJOQUxUUklHX0VER0VfRkFMTElORyAgIEFEQ19FWFRFUk5BTFRSSUdDT05WRURHRV9GQUxMSU5HCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfRURHRV9SSVNJTkdGQUxMSU5HIEFEQ19FWFRFUk5BTFRSSUdDT05WRURHRV9SSVNJTkdGQUxMSU5HCisjZGVmaW5lIEFEQ19TQU1QTEVUSU1FXzJDWUNMRV81ICAgICAgICAgQURDX1NBTVBMRVRJTUVfMkNZQ0xFU181CisKKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9CVVNZX1JFRyAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19CVVNZCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfQlVTWV9JTkogICAgICAgICAgSEFMX0FEQ19TVEFURV9JTkpfQlVTWQorI2RlZmluZSBIQUxfQURDX1NUQVRFX0VPQ19SRUcgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVHX0VPQworI2RlZmluZSBIQUxfQURDX1NUQVRFX0VPQ19JTkogICAgICAgICAgIEhBTF9BRENfU1RBVEVfSU5KX0VPQworI2RlZmluZSBIQUxfQURDX1NUQVRFX0VSUk9SICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwKKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9CVVNZICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX0JVU1lfSU5URVJOQUwKKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9BV0QgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX0FXRDEKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0NFQ19BbGlhc2VkX0RlZmluZXMgSEFMIENFQyBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fSEFMX0NFQ19HRVRfSVQgX19IQUxfQ0VDX0dFVF9GTEFHCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0NPTVBfQWxpYXNlZF9EZWZpbmVzIEhBTCBDT01QIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIENPTVBfV0lORE9XTU9ERV9ESVNBQkxFRCAgICAgICBDT01QX1dJTkRPV01PREVfRElTQUJMRQorI2RlZmluZSBDT01QX1dJTkRPV01PREVfRU5BQkxFRCAgICAgICAgQ09NUF9XSU5ET1dNT0RFX0VOQUJMRQorI2RlZmluZSBDT01QX0VYVElfTElORV9DT01QMV9FVkVOVCAgICAgQ09NUF9FWFRJX0xJTkVfQ09NUDEKKyNkZWZpbmUgQ09NUF9FWFRJX0xJTkVfQ09NUDJfRVZFTlQgICAgIENPTVBfRVhUSV9MSU5FX0NPTVAyCisjZGVmaW5lIENPTVBfRVhUSV9MSU5FX0NPTVAzX0VWRU5UICAgICBDT01QX0VYVElfTElORV9DT01QMworI2RlZmluZSBDT01QX0VYVElfTElORV9DT01QNF9FVkVOVCAgICAgQ09NUF9FWFRJX0xJTkVfQ09NUDQKKyNkZWZpbmUgQ09NUF9FWFRJX0xJTkVfQ09NUDVfRVZFTlQgICAgIENPTVBfRVhUSV9MSU5FX0NPTVA1CisjZGVmaW5lIENPTVBfRVhUSV9MSU5FX0NPTVA2X0VWRU5UICAgICBDT01QX0VYVElfTElORV9DT01QNgorI2RlZmluZSBDT01QX0VYVElfTElORV9DT01QN19FVkVOVCAgICAgQ09NUF9FWFRJX0xJTkVfQ09NUDcKKyNpZiBkZWZpbmVkKFNUTTMyTDApCisjZGVmaW5lIENPTVBfTFBUSU1DT05ORUNUSU9OX0VOQUJMRUQgICAoKHVpbnQzMl90KTB4MDAwMDAwMDNVKSAgICAvKiE8IENPTVBYIG91dHB1dCBnZW5lcmljIG5hbWluZzogY29ubmVjdGVkIHRvIExQVElNIGlucHV0IDEgZm9yIENPTVAxLCBMUFRJTSBpbnB1dCAyIGZvciBDT01QMiAqLworI2VuZGlmCisjZGVmaW5lIENPTVBfT1VUUFVUX0NPTVA2VElNMk9DUkVGQ0xSICBDT01QX09VVFBVVF9DT01QNl9USU0yT0NSRUZDTFIKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorI2RlZmluZSBDT01QX09VVFBVVF9USU0zSUMxICAgICAgICAgICAgQ09NUF9PVVRQVVRfQ09NUDFfVElNM0lDMQorI2RlZmluZSBDT01QX09VVFBVVF9USU0zT0NSRUZDTFIgICAgICAgQ09NUF9PVVRQVVRfQ09NUDFfVElNM09DUkVGQ0xSCisjZW5kaWYgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJMMCkgfHwgZGVmaW5lZChTVE0zMkw0KQorI2RlZmluZSBDT01QX1dJTkRPV01PREVfRU5BQkxFICAgICAgICAgQ09NUF9XSU5ET1dNT0RFX0NPTVAxX0lOUFVUX1BMVVNfQ09NTU9OCisKKyNkZWZpbmUgQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9JTzEgICAgICBDT01QX0lOUFVUX1BMVVNfSU8xCisjZGVmaW5lIENPTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU8yICAgICAgQ09NUF9JTlBVVF9QTFVTX0lPMgorI2RlZmluZSBDT01QX05PTklOVkVSVElOR0lOUFVUX0lPMyAgICAgIENPTVBfSU5QVVRfUExVU19JTzMKKyNkZWZpbmUgQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9JTzQgICAgICBDT01QX0lOUFVUX1BMVVNfSU80CisjZGVmaW5lIENPTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU81ICAgICAgQ09NUF9JTlBVVF9QTFVTX0lPNQorI2RlZmluZSBDT01QX05PTklOVkVSVElOR0lOUFVUX0lPNiAgICAgIENPTVBfSU5QVVRfUExVU19JTzYKKworI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUXzFfNFZSRUZJTlQgIENPTVBfSU5QVVRfTUlOVVNfMV80VlJFRklOVAorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUXzFfMlZSRUZJTlQgIENPTVBfSU5QVVRfTUlOVVNfMV8yVlJFRklOVAorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUXzNfNFZSRUZJTlQgIENPTVBfSU5QVVRfTUlOVVNfM180VlJFRklOVAorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX1ZSRUZJTlQgICAgIENPTVBfSU5QVVRfTUlOVVNfVlJFRklOVAorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX0RBQzFfQ0gxICAgIENPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDEKKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9EQUMxX0NIMiAgICBDT01QX0lOUFVUX01JTlVTX0RBQzFfQ0gyCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfREFDMSAgICAgICAgQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMQorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX0RBQzIgICAgICAgIENPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDIKKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzEgICAgICAgICBDT01QX0lOUFVUX01JTlVTX0lPMQorI2lmIGRlZmluZWQoU1RNMzJMMCkKKy8qIElzc3VlIGZpeGVkIG9uIFNUTTMyTDAgQ09NUCBkcml2ZXI6IG9ubHkgMiBkZWRpY2F0ZWQgSU8gKElPMSBhbmQgSU8yKSwgICAgICovCisvKiBJTzIgd2FzIHdyb25nbHkgYXNzaWduZWQgdG8gSU8gc2hhcmVkIHdpdGggREFDIGFuZCBJTzMgd2FzIGNvcnJlc3BvbmRpbmcgICAqLworLyogdG8gdGhlIHNlY29uZCBkZWRpY2F0ZWQgSU8gKG9ubHkgZm9yIENPTVAyKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzIgICAgICAgICBDT01QX0lOUFVUX01JTlVTX0RBQzFfQ0gyCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfSU8zICAgICAgICAgQ09NUF9JTlBVVF9NSU5VU19JTzIKKyNlbHNlCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfSU8yICAgICAgICAgQ09NUF9JTlBVVF9NSU5VU19JTzIKKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzMgICAgICAgICBDT01QX0lOUFVUX01JTlVTX0lPMworI2VuZGlmCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfSU80ICAgICAgICAgQ09NUF9JTlBVVF9NSU5VU19JTzQKKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzUgICAgICAgICBDT01QX0lOUFVUX01JTlVTX0lPNQorCisjZGVmaW5lIENPTVBfT1VUUFVUTEVWRUxfTE9XICAgICAgICAgICAgQ09NUF9PVVRQVVRfTEVWRUxfTE9XCisjZGVmaW5lIENPTVBfT1VUUFVUTEVWRUxfSElHSCAgICAgICAgICAgQ09NUF9PVVRQVVRfTEVWRUxfSElHSAorCisvKiBOb3RlOiBMaXRlcmFsICJDT01QX0ZMQUdfTE9DSyIga2VwdCBmb3IgbGVnYWN5IHB1cnBvc2UuICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgVG8gY2hlY2sgQ09NUCBsb2NrIHN0YXRlLCB1c2UgbWFjcm8gIl9fSEFMX0NPTVBfSVNfTE9DS0VEKCkiLiAgICAgICAgKi8KKyNpZiBkZWZpbmVkKENPTVBfQ1NSX0xPQ0spCisjZGVmaW5lIENPTVBfRkxBR19MT0NLICAgICAgICAgICAgICAgICBDT01QX0NTUl9MT0NLCisjZWxpZiBkZWZpbmVkKENPTVBfQ1NSX0NPTVAxTE9DSykKKyNkZWZpbmUgQ09NUF9GTEFHX0xPQ0sgICAgICAgICAgICAgICAgIENPTVBfQ1NSX0NPTVAxTE9DSworI2VsaWYgZGVmaW5lZChDT01QX0NTUl9DT01QeExPQ0spCisjZGVmaW5lIENPTVBfRkxBR19MT0NLICAgICAgICAgICAgICAgICBDT01QX0NTUl9DT01QeExPQ0sKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkw0KQorI2RlZmluZSBDT01QX0JMQU5LSU5HU1JDRV9USU0xT0M1ICAgICAgICBDT01QX0JMQU5LSU5HU1JDX1RJTTFfT0M1X0NPTVAxCisjZGVmaW5lIENPTVBfQkxBTktJTkdTUkNFX1RJTTJPQzMgICAgICAgIENPTVBfQkxBTktJTkdTUkNfVElNMl9PQzNfQ09NUDEKKyNkZWZpbmUgQ09NUF9CTEFOS0lOR1NSQ0VfVElNM09DMyAgICAgICAgQ09NUF9CTEFOS0lOR1NSQ19USU0zX09DM19DT01QMQorI2RlZmluZSBDT01QX0JMQU5LSU5HU1JDRV9USU0zT0M0ICAgICAgICBDT01QX0JMQU5LSU5HU1JDX1RJTTNfT0M0X0NPTVAyCisjZGVmaW5lIENPTVBfQkxBTktJTkdTUkNFX1RJTThPQzUgICAgICAgIENPTVBfQkxBTktJTkdTUkNfVElNOF9PQzVfQ09NUDIKKyNkZWZpbmUgQ09NUF9CTEFOS0lOR1NSQ0VfVElNMTVPQzEgICAgICAgQ09NUF9CTEFOS0lOR1NSQ19USU0xNV9PQzFfQ09NUDIKKyNkZWZpbmUgQ09NUF9CTEFOS0lOR1NSQ0VfTk9ORSAgICAgICAgICAgQ09NUF9CTEFOS0lOR1NSQ19OT05FCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJMMCkKKyNkZWZpbmUgQ09NUF9NT0RFX0hJR0hTUEVFRCAgICAgICAgICAgICAgQ09NUF9QT1dFUk1PREVfTUVESVVNU1BFRUQKKyNkZWZpbmUgQ09NUF9NT0RFX0xPV1NQRUVEICAgICAgICAgICAgICAgQ09NUF9QT1dFUk1PREVfVUxUUkFMT1dQT1dFUgorI2Vsc2UKKyNkZWZpbmUgQ09NUF9NT0RFX0hJR0hTUEVFRCAgICAgICAgICAgICAgQ09NUF9QT1dFUk1PREVfSElHSFNQRUVECisjZGVmaW5lIENPTVBfTU9ERV9NRURJVU1TUEVFRCAgICAgICAgICAgIENPTVBfUE9XRVJNT0RFX01FRElVTVNQRUVECisjZGVmaW5lIENPTVBfTU9ERV9MT1dQT1dFUiAgICAgICAgICAgICAgIENPTVBfUE9XRVJNT0RFX0xPV1BPV0VSCisjZGVmaW5lIENPTVBfTU9ERV9VTFRSQUxPV1BPV0VSICAgICAgICAgIENPTVBfUE9XRVJNT0RFX1VMVFJBTE9XUE9XRVIKKyNlbmRpZgorCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0NPUlRFWF9BbGlhc2VkX0RlZmluZXMgSEFMIENPUlRFWCBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9DT1JURVhfU1lTVElDS0NMS19DT05GSUcgSEFMX1NZU1RJQ0tfQ0xLU291cmNlQ29uZmlnCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9DUkNfQWxpYXNlZF9EZWZpbmVzIEhBTCBDUkMgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBDUkNfT1VUUFVUREFUQV9JTlZFUlNJT05fRElTQUJMRUQgICAgQ1JDX09VVFBVVERBVEFfSU5WRVJTSU9OX0RJU0FCTEUKKyNkZWZpbmUgQ1JDX09VVFBVVERBVEFfSU5WRVJTSU9OX0VOQUJMRUQgICAgIENSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9FTkFCTEUKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfREFDX0FsaWFzZWRfRGVmaW5lcyBIQUwgREFDIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgREFDMV9DSEFOTkVMXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFDX0NIQU5ORUxfMQorI2RlZmluZSBEQUMxX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUNfQ0hBTk5FTF8yCisjZGVmaW5lIERBQzJfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBQ19DSEFOTkVMXzEKKyNkZWZpbmUgREFDX1dBVkVfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgREFDX1dBVkVfTk9JU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFDX0NSX1dBVkUxXzAKKyNkZWZpbmUgREFDX1dBVkVfVFJJQU5HTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFDX0NSX1dBVkUxXzEKKyNkZWZpbmUgREFDX1dBVkVHRU5FUkFUSU9OX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgREFDX1dBVkVfTk9ORQorI2RlZmluZSBEQUNfV0FWRUdFTkVSQVRJT05fTk9JU0UgICAgICAgICAgICAgICAgICAgICAgICBEQUNfV0FWRV9OT0lTRQorI2RlZmluZSBEQUNfV0FWRUdFTkVSQVRJT05fVFJJQU5HTEUgICAgICAgICAgICAgICAgICAgICBEQUNfV0FWRV9UUklBTkdMRQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9ETUFfQWxpYXNlZF9EZWZpbmVzIEhBTCBETUEgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX1JFTUFQRE1BX0FEQ19ETUFfQ0gyICAgICAgICAgICAgICAgIERNQV9SRU1BUF9BRENfRE1BX0NIMgorI2RlZmluZSBIQUxfUkVNQVBETUFfVVNBUlQxX1RYX0RNQV9DSDQgICAgICAgICAgRE1BX1JFTUFQX1VTQVJUMV9UWF9ETUFfQ0g0CisjZGVmaW5lIEhBTF9SRU1BUERNQV9VU0FSVDFfUlhfRE1BX0NINSAgICAgICAgICBETUFfUkVNQVBfVVNBUlQxX1JYX0RNQV9DSDUKKyNkZWZpbmUgSEFMX1JFTUFQRE1BX1RJTTE2X0RNQV9DSDQgICAgICAgICAgICAgIERNQV9SRU1BUF9USU0xNl9ETUFfQ0g0CisjZGVmaW5lIEhBTF9SRU1BUERNQV9USU0xN19ETUFfQ0gyICAgICAgICAgICAgICBETUFfUkVNQVBfVElNMTdfRE1BX0NIMgorI2RlZmluZSBIQUxfUkVNQVBETUFfVVNBUlQzX0RNQV9DSDMyICAgICAgICAgICAgRE1BX1JFTUFQX1VTQVJUM19ETUFfQ0gzMgorI2RlZmluZSBIQUxfUkVNQVBETUFfVElNMTZfRE1BX0NINiAgICAgICAgICAgICAgRE1BX1JFTUFQX1RJTTE2X0RNQV9DSDYKKyNkZWZpbmUgSEFMX1JFTUFQRE1BX1RJTTE3X0RNQV9DSDcgICAgICAgICAgICAgIERNQV9SRU1BUF9USU0xN19ETUFfQ0g3CisjZGVmaW5lIEhBTF9SRU1BUERNQV9TUEkyX0RNQV9DSDY3ICAgICAgICAgICAgICBETUFfUkVNQVBfU1BJMl9ETUFfQ0g2NworI2RlZmluZSBIQUxfUkVNQVBETUFfVVNBUlQyX0RNQV9DSDY3ICAgICAgICAgICAgRE1BX1JFTUFQX1VTQVJUMl9ETUFfQ0g2NworI2RlZmluZSBIQUxfUkVNQVBETUFfSTJDMV9ETUFfQ0g3NiAgICAgICAgICAgICAgRE1BX1JFTUFQX0kyQzFfRE1BX0NINzYKKyNkZWZpbmUgSEFMX1JFTUFQRE1BX1RJTTFfRE1BX0NINiAgICAgICAgICAgICAgIERNQV9SRU1BUF9USU0xX0RNQV9DSDYKKyNkZWZpbmUgSEFMX1JFTUFQRE1BX1RJTTJfRE1BX0NINyAgICAgICAgICAgICAgIERNQV9SRU1BUF9USU0yX0RNQV9DSDcKKyNkZWZpbmUgSEFMX1JFTUFQRE1BX1RJTTNfRE1BX0NINiAgICAgICAgICAgICAgIERNQV9SRU1BUF9USU0zX0RNQV9DSDYKKworI2RlZmluZSBJU19IQUxfUkVNQVBETUEgICAgICAgICAgICAgICAgICAgICAgICAgIElTX0RNQV9SRU1BUAorI2RlZmluZSBfX0hBTF9SRU1BUERNQV9DSEFOTkVMX0VOQUJMRSAgICAgICAgICAgIF9fSEFMX0RNQV9SRU1BUF9DSEFOTkVMX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SRU1BUERNQV9DSEFOTkVMX0RJU0FCTEUgICAgICAgICAgIF9fSEFMX0RNQV9SRU1BUF9DSEFOTkVMX0RJU0FCTEUKKworI2lmIGRlZmluZWQoU1RNMzJMNCkKKworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJMCAgICAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTAKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRVhUSTEgICAgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkxCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEkyICAgICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJMgorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJMyAgICAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTMKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRVhUSTQgICAgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEk0CisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEk1ICAgICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJNQorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJNiAgICAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTYKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRVhUSTcgICAgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEk3CisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEk4ICAgICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJOAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJOSAgICAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTkKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRVhUSTEwICAgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkxMAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJMTEgICAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTExCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEkxMiAgICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJMTIKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRVhUSTEzICAgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkxMworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJMTQgICAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTE0CisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEkxNSAgICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJMTUKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRE1BTVVYMV9DSDBfRVZUICBIQUxfRE1BTVVYMV9SRVFfR0VOX0RNQU1VWDFfQ0gwX0VWVAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9ETUFNVVgxX0NIMV9FVlQgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRE1BTVVYMV9DSDFfRVZUCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0RNQU1VWDFfQ0gyX0VWVCAgSEFMX0RNQU1VWDFfUkVRX0dFTl9ETUFNVVgxX0NIMl9FVlQKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRE1BTVVYMV9DSDNfRVZUICBIQUxfRE1BTVVYMV9SRVFfR0VOX0RNQU1VWDFfQ0gzX0VWVAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9MUFRJTTFfT1VUICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fTFBUSU0xX09VVAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9MUFRJTTJfT1VUICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fTFBUSU0yX09VVAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9EU0lfVEUgICAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRFNJX1RFCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0RTSV9FT1QgICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9EU0lfRU9UCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0RNQTJEX0VPVCAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9ETUEyRF9FT1QKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fTFREQ19JVCAgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0xURENfSVQKKworI2RlZmluZSBIQUxfRE1BTVVYX1JFUVVFU1RfR0VOX05PX0VWRU5UICAgICAgICAgIEhBTF9ETUFNVVhfUkVRX0dFTl9OT19FVkVOVAorI2RlZmluZSBIQUxfRE1BTVVYX1JFUVVFU1RfR0VOX1JJU0lORyAgICAgICAgICAgIEhBTF9ETUFNVVhfUkVRX0dFTl9SSVNJTkcKKyNkZWZpbmUgSEFMX0RNQU1VWF9SRVFVRVNUX0dFTl9GQUxMSU5HICAgICAgICAgICBIQUxfRE1BTVVYX1JFUV9HRU5fRkFMTElORworI2RlZmluZSBIQUxfRE1BTVVYX1JFUVVFU1RfR0VOX1JJU0lOR19GQUxMSU5HICAgIEhBTF9ETUFNVVhfUkVRX0dFTl9SSVNJTkdfRkFMTElORworCisjZW5kaWYgLyogU1RNMzJMNCAqLworCisjaWYgZGVmaW5lZChTVE0zMkg3KQorCisjZGVmaW5lIERNQV9SRVFVRVNUX0RBQzEgRE1BX1JFUVVFU1RfREFDMV9DSDEKKyNkZWZpbmUgRE1BX1JFUVVFU1RfREFDMiBETUFfUkVRVUVTVF9EQUMxX0NIMgorCisjZGVmaW5lIEJETUFfUkVRVUVTVF9MUF9VQVJUMV9SWCBCRE1BX1JFUVVFU1RfTFBVQVJUMV9SWAorI2RlZmluZSBCRE1BX1JFUVVFU1RfTFBfVUFSVDFfVFggQkRNQV9SRVFVRVNUX0xQVUFSVDFfVFgKKworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9ETUFNVVgxX0NIMF9FVlQgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9ETUFNVVgxX0NIMF9FVlQKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRE1BTVVYMV9DSDFfRVZUICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRE1BTVVYMV9DSDFfRVZUCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0RNQU1VWDFfQ0gyX0VWVCAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0RNQU1VWDFfQ0gyX0VWVAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9MUFRJTTFfT1VUICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9MUFRJTTFfT1VUCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0xQVElNMl9PVVQgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0xQVElNMl9PVVQKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fTFBUSU0zX09VVCAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fTFBUSU0zX09VVAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJMCAgICAgICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJMAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9USU0xMl9UUkdPICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9USU0xMl9UUkdPCisKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fRE1BTVVYMl9DSDBfRVZUICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fRE1BTVVYMl9DSDBfRVZUCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0RNQU1VWDJfQ0gxX0VWVCAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0RNQU1VWDJfQ0gxX0VWVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9ETUFNVVgyX0NIMl9FVlQgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9ETUFNVVgyX0NIMl9FVlQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fRE1BTVVYMl9DSDNfRVZUICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fRE1BTVVYMl9DSDNfRVZUCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0RNQU1VWDJfQ0g0X0VWVCAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0RNQU1VWDJfQ0g0X0VWVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9ETUFNVVgyX0NINV9FVlQgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9ETUFNVVgyX0NINV9FVlQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fRE1BTVVYMl9DSDZfRVZUICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fRE1BTVVYMl9DSDZfRVZUCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0xQVUFSVDFfUlhfV0tVUCAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0xQVUFSVDFfUlhfV0tVUAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9MUFVBUlQxX1RYX1dLVVAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9MUFVBUlQxX1RYX1dLVVAKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fTFBUSU0yX1dLVVAgICAgICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fTFBUSU0yX1dLVVAKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fTFBUSU0yX09VVCAgICAgICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fTFBUSU0yX09VVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9MUFRJTTNfV0tVUCAgICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9MUFRJTTNfV0tVUAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9MUFRJTTNfT1VUICAgICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9MUFRJTTNfT1VUCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0xQVElNNF9XS1VQICAgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0xQVElNNF9XS1VQCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0xQVElNNV9XS1VQICAgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0xQVElNNV9XS1VQCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0kyQzRfV0tVUCAgICAgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0kyQzRfV0tVUAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9TUEk2X1dLVVAgICAgICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9TUEk2X1dLVVAKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fQ09NUDFfT1VUICAgICAgICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fQ09NUDFfT1VUCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0NPTVAyX09VVCAgICAgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0NPTVAyX09VVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9SVENfV0tVUCAgICAgICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9SVENfV0tVUAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9FWFRJMCAgICAgICAgICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9FWFRJMAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9FWFRJMiAgICAgICAgICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9FWFRJMgorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9JMkM0X0lUX0VWVCAgICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9JMkM0X0lUX0VWVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9TUEk2X0lUICAgICAgICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9TUEk2X0lUCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0xQVUFSVDFfVFhfSVQgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0xQVUFSVDFfVFhfSVQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fTFBVQVJUMV9SWF9JVCAgICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fTFBVQVJUMV9SWF9JVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9BREMzX0lUICAgICAgICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9BREMzX0lUCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0FEQzNfQVdEMV9PVVQgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0FEQzNfQVdEMV9PVVQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fQkRNQV9DSDBfSVQgICAgICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fQkRNQV9DSDBfSVQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fQkRNQV9DSDFfSVQgICAgICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fQkRNQV9DSDFfSVQKKworI2RlZmluZSBIQUxfRE1BTVVYX1JFUVVFU1RfR0VOX05PX0VWRU5UICAgICAgICAgICAgSEFMX0RNQU1VWF9SRVFfR0VOX05PX0VWRU5UCisjZGVmaW5lIEhBTF9ETUFNVVhfUkVRVUVTVF9HRU5fUklTSU5HICAgICAgICAgICAgICBIQUxfRE1BTVVYX1JFUV9HRU5fUklTSU5HCisjZGVmaW5lIEhBTF9ETUFNVVhfUkVRVUVTVF9HRU5fRkFMTElORyAgICAgICAgICAgICBIQUxfRE1BTVVYX1JFUV9HRU5fRkFMTElORworI2RlZmluZSBIQUxfRE1BTVVYX1JFUVVFU1RfR0VOX1JJU0lOR19GQUxMSU5HICAgICAgSEFMX0RNQU1VWF9SRVFfR0VOX1JJU0lOR19GQUxMSU5HCisKKyNlbmRpZiAvKiBTVE0zMkg3ICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0ZMQVNIX0FsaWFzZWRfRGVmaW5lcyBIQUwgRkxBU0ggQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBUWVBFUFJPR1JBTV9CWVRFICAgICAgICAgICAgICBGTEFTSF9UWVBFUFJPR1JBTV9CWVRFCisjZGVmaW5lIFRZUEVQUk9HUkFNX0hBTEZXT1JEICAgICAgICAgIEZMQVNIX1RZUEVQUk9HUkFNX0hBTEZXT1JECisjZGVmaW5lIFRZUEVQUk9HUkFNX1dPUkQgICAgICAgICAgICAgIEZMQVNIX1RZUEVQUk9HUkFNX1dPUkQKKyNkZWZpbmUgVFlQRVBST0dSQU1fRE9VQkxFV09SRCAgICAgICAgRkxBU0hfVFlQRVBST0dSQU1fRE9VQkxFV09SRAorI2RlZmluZSBUWVBFRVJBU0VfU0VDVE9SUyAgICAgICAgICAgICBGTEFTSF9UWVBFRVJBU0VfU0VDVE9SUworI2RlZmluZSBUWVBFRVJBU0VfUEFHRVMgICAgICAgICAgICAgICBGTEFTSF9UWVBFRVJBU0VfUEFHRVMKKyNkZWZpbmUgVFlQRUVSQVNFX1BBR0VFUkFTRSAgICAgICAgICAgRkxBU0hfVFlQRUVSQVNFX1BBR0VTCisjZGVmaW5lIFRZUEVFUkFTRV9NQVNTRVJBU0UgICAgICAgICAgIEZMQVNIX1RZUEVFUkFTRV9NQVNTRVJBU0UKKyNkZWZpbmUgV1JQU1RBVEVfRElTQUJMRSAgICAgICAgICAgICAgT0JfV1JQU1RBVEVfRElTQUJMRQorI2RlZmluZSBXUlBTVEFURV9FTkFCTEUgICAgICAgICAgICAgICBPQl9XUlBTVEFURV9FTkFCTEUKKyNkZWZpbmUgSEFMX0ZMQVNIX1RJTUVPVVRfVkFMVUUgICAgICAgRkxBU0hfVElNRU9VVF9WQUxVRQorI2RlZmluZSBPQkVYX1BDUk9QICAgICAgICAgICAgICAgICAgICBPUFRJT05CWVRFX1BDUk9QCisjZGVmaW5lIE9CRVhfQk9PVENPTkZJRyAgICAgICAgICAgICAgIE9QVElPTkJZVEVfQk9PVENPTkZJRworI2RlZmluZSBQQ1JPUFNUQVRFX0RJU0FCTEUgICAgICAgICAgICBPQl9QQ1JPUF9TVEFURV9ESVNBQkxFCisjZGVmaW5lIFBDUk9QU1RBVEVfRU5BQkxFICAgICAgICAgICAgIE9CX1BDUk9QX1NUQVRFX0VOQUJMRQorI2RlZmluZSBUWVBFRVJBU0VEQVRBX0JZVEUgICAgICAgICAgICBGTEFTSF9UWVBFRVJBU0VEQVRBX0JZVEUKKyNkZWZpbmUgVFlQRUVSQVNFREFUQV9IQUxGV09SRCAgICAgICAgRkxBU0hfVFlQRUVSQVNFREFUQV9IQUxGV09SRAorI2RlZmluZSBUWVBFRVJBU0VEQVRBX1dPUkQgICAgICAgICAgICBGTEFTSF9UWVBFRVJBU0VEQVRBX1dPUkQKKyNkZWZpbmUgVFlQRVBST0dSQU1EQVRBX0JZVEUgICAgICAgICAgRkxBU0hfVFlQRVBST0dSQU1EQVRBX0JZVEUKKyNkZWZpbmUgVFlQRVBST0dSQU1EQVRBX0hBTEZXT1JEICAgICAgRkxBU0hfVFlQRVBST0dSQU1EQVRBX0hBTEZXT1JECisjZGVmaW5lIFRZUEVQUk9HUkFNREFUQV9XT1JEICAgICAgICAgIEZMQVNIX1RZUEVQUk9HUkFNREFUQV9XT1JECisjZGVmaW5lIFRZUEVQUk9HUkFNREFUQV9GQVNUQllURSAgICAgIEZMQVNIX1RZUEVQUk9HUkFNREFUQV9GQVNUQllURQorI2RlZmluZSBUWVBFUFJPR1JBTURBVEFfRkFTVEhBTEZXT1JEICBGTEFTSF9UWVBFUFJPR1JBTURBVEFfRkFTVEhBTEZXT1JECisjZGVmaW5lIFRZUEVQUk9HUkFNREFUQV9GQVNUV09SRCAgICAgIEZMQVNIX1RZUEVQUk9HUkFNREFUQV9GQVNUV09SRAorI2RlZmluZSBQQUdFU0laRSAgICAgICAgICAgICAgICAgICAgICBGTEFTSF9QQUdFX1NJWkUKKyNkZWZpbmUgVFlQRVBST0dSQU1fRkFTVEJZVEUgICAgICAgICAgRkxBU0hfVFlQRVBST0dSQU1fQllURQorI2RlZmluZSBUWVBFUFJPR1JBTV9GQVNUSEFMRldPUkQgICAgICBGTEFTSF9UWVBFUFJPR1JBTV9IQUxGV09SRAorI2RlZmluZSBUWVBFUFJPR1JBTV9GQVNUV09SRCAgICAgICAgICBGTEFTSF9UWVBFUFJPR1JBTV9XT1JECisjZGVmaW5lIFZPTFRBR0VfUkFOR0VfMSAgICAgICAgICAgICAgIEZMQVNIX1ZPTFRBR0VfUkFOR0VfMQorI2RlZmluZSBWT0xUQUdFX1JBTkdFXzIgICAgICAgICAgICAgICBGTEFTSF9WT0xUQUdFX1JBTkdFXzIKKyNkZWZpbmUgVk9MVEFHRV9SQU5HRV8zICAgICAgICAgICAgICAgRkxBU0hfVk9MVEFHRV9SQU5HRV8zCisjZGVmaW5lIFZPTFRBR0VfUkFOR0VfNCAgICAgICAgICAgICAgIEZMQVNIX1ZPTFRBR0VfUkFOR0VfNAorI2RlZmluZSBUWVBFUFJPR1JBTV9GQVNUICAgICAgICAgICAgICBGTEFTSF9UWVBFUFJPR1JBTV9GQVNUCisjZGVmaW5lIFRZUEVQUk9HUkFNX0ZBU1RfQU5EX0xBU1QgICAgIEZMQVNIX1RZUEVQUk9HUkFNX0ZBU1RfQU5EX0xBU1QKKyNkZWZpbmUgV1JQQVJFQV9CQU5LMV9BUkVBQSAgICAgICAgICAgT0JfV1JQQVJFQV9CQU5LMV9BUkVBQQorI2RlZmluZSBXUlBBUkVBX0JBTksxX0FSRUFCICAgICAgICAgICBPQl9XUlBBUkVBX0JBTksxX0FSRUFCCisjZGVmaW5lIFdSUEFSRUFfQkFOSzJfQVJFQUEgICAgICAgICAgIE9CX1dSUEFSRUFfQkFOSzJfQVJFQUEKKyNkZWZpbmUgV1JQQVJFQV9CQU5LMl9BUkVBQiAgICAgICAgICAgT0JfV1JQQVJFQV9CQU5LMl9BUkVBQgorI2RlZmluZSBJV0RHX1NUREJZX0ZSRUVaRSAgICAgICAgICAgICBPQl9JV0RHX1NUREJZX0ZSRUVaRQorI2RlZmluZSBJV0RHX1NUREJZX0FDVElWRSAgICAgICAgICAgICBPQl9JV0RHX1NUREJZX1JVTgorI2RlZmluZSBJV0RHX1NUT1BfRlJFRVpFICAgICAgICAgICAgICBPQl9JV0RHX1NUT1BfRlJFRVpFCisjZGVmaW5lIElXREdfU1RPUF9BQ1RJVkUgICAgICAgICAgICAgIE9CX0lXREdfU1RPUF9SVU4KKyNkZWZpbmUgRkxBU0hfRVJST1JfTk9ORSAgICAgICAgICAgICAgSEFMX0ZMQVNIX0VSUk9SX05PTkUKKyNkZWZpbmUgRkxBU0hfRVJST1JfUkQgICAgICAgICAgICAgICAgSEFMX0ZMQVNIX0VSUk9SX1JECisjZGVmaW5lIEZMQVNIX0VSUk9SX1BHICAgICAgICAgICAgICAgIEhBTF9GTEFTSF9FUlJPUl9QUk9HCisjZGVmaW5lIEZMQVNIX0VSUk9SX1BHUCAgICAgICAgICAgICAgIEhBTF9GTEFTSF9FUlJPUl9QR1MKKyNkZWZpbmUgRkxBU0hfRVJST1JfV1JQICAgICAgICAgICAgICAgSEFMX0ZMQVNIX0VSUk9SX1dSUAorI2RlZmluZSBGTEFTSF9FUlJPUl9PUFRWICAgICAgICAgICAgICBIQUxfRkxBU0hfRVJST1JfT1BUVgorI2RlZmluZSBGTEFTSF9FUlJPUl9PUFRWVVNSICAgICAgICAgICBIQUxfRkxBU0hfRVJST1JfT1BUVlVTUgorI2RlZmluZSBGTEFTSF9FUlJPUl9QUk9HICAgICAgICAgICAgICBIQUxfRkxBU0hfRVJST1JfUFJPRworI2RlZmluZSBGTEFTSF9FUlJPUl9PUCAgICAgICAgICAgICAgICBIQUxfRkxBU0hfRVJST1JfT1BFUkFUSU9OCisjZGVmaW5lIEZMQVNIX0VSUk9SX1BHQSAgICAgICAgICAgICAgIEhBTF9GTEFTSF9FUlJPUl9QR0EKKyNkZWZpbmUgRkxBU0hfRVJST1JfU0laRSAgICAgICAgICAgICAgSEFMX0ZMQVNIX0VSUk9SX1NJWkUKKyNkZWZpbmUgRkxBU0hfRVJST1JfU0laICAgICAgICAgICAgICAgSEFMX0ZMQVNIX0VSUk9SX1NJWkUKKyNkZWZpbmUgRkxBU0hfRVJST1JfUEdTICAgICAgICAgICAgICAgSEFMX0ZMQVNIX0VSUk9SX1BHUworI2RlZmluZSBGTEFTSF9FUlJPUl9NSVMgICAgICAgICAgICAgICBIQUxfRkxBU0hfRVJST1JfTUlTCisjZGVmaW5lIEZMQVNIX0VSUk9SX0ZBU1QgICAgICAgICAgICAgIEhBTF9GTEFTSF9FUlJPUl9GQVNUCisjZGVmaW5lIEZMQVNIX0VSUk9SX0ZXV0VSUiAgICAgICAgICAgIEhBTF9GTEFTSF9FUlJPUl9GV1dFUlIKKyNkZWZpbmUgRkxBU0hfRVJST1JfTk9UWkVSTyAgICAgICAgICAgSEFMX0ZMQVNIX0VSUk9SX05PVFpFUk8KKyNkZWZpbmUgRkxBU0hfRVJST1JfT1BFUkFUSU9OICAgICAgICAgSEFMX0ZMQVNIX0VSUk9SX09QRVJBVElPTgorI2RlZmluZSBGTEFTSF9FUlJPUl9FUlMgICAgICAgICAgICAgICBIQUxfRkxBU0hfRVJST1JfRVJTCisjZGVmaW5lIE9CX1dER19TVyAgICAgICAgICAgICAgICAgICAgIE9CX0lXREdfU1cKKyNkZWZpbmUgT0JfV0RHX0hXICAgICAgICAgICAgICAgICAgICAgT0JfSVdER19IVworI2RlZmluZSBPQl9TREFEQzEyX1ZERF9NT05JVE9SX1NFVCAgICBPQl9TREFDRF9WRERfTU9OSVRPUl9TRVQKKyNkZWZpbmUgT0JfU0RBREMxMl9WRERfTU9OSVRPUl9SRVNFVCAgT0JfU0RBQ0RfVkREX01PTklUT1JfUkVTRVQKKyNkZWZpbmUgT0JfUkFNX1BBUklUWV9DSEVDS19TRVQgICAgICAgT0JfU1JBTV9QQVJJVFlfU0VUCisjZGVmaW5lIE9CX1JBTV9QQVJJVFlfQ0hFQ0tfUkVTRVQgICAgIE9CX1NSQU1fUEFSSVRZX1JFU0VUCisjZGVmaW5lIElTX09CX1NEQURDMTJfVkREX01PTklUT1IgICAgIElTX09CX1NEQUNEX1ZERF9NT05JVE9SCisjZGVmaW5lIE9CX1JEUF9MRVZFTDAgICAgICAgICAgICAgICAgIE9CX1JEUF9MRVZFTF8wCisjZGVmaW5lIE9CX1JEUF9MRVZFTDEgICAgICAgICAgICAgICAgIE9CX1JEUF9MRVZFTF8xCisjZGVmaW5lIE9CX1JEUF9MRVZFTDIgICAgICAgICAgICAgICAgIE9CX1JEUF9MRVZFTF8yCisjaWYgZGVmaW5lZChTVE0zMkcwKQorI2RlZmluZSBPQl9CT09UX0xPQ0tfRElTQUJMRSAgICAgICAgICBPQl9CT09UX0VOVFJZX0ZPUkNFRF9OT05FCisjZGVmaW5lIE9CX0JPT1RfTE9DS19FTkFCTEUgICAgICAgICAgIE9CX0JPT1RfRU5UUllfRk9SQ0VEX0ZMQVNICisjZWxzZQorI2RlZmluZSBPQl9CT09UX0VOVFJZX0ZPUkNFRF9OT05FICAgICBPQl9CT09UX0xPQ0tfRElTQUJMRQorI2RlZmluZSBPQl9CT09UX0VOVFJZX0ZPUkNFRF9GTEFTSCAgICBPQl9CT09UX0xPQ0tfRU5BQkxFCisjZW5kaWYKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfSlBFR19BbGlhc2VkX01hY3JvcyBIQUwgSlBFRyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKFNUTTMySDcpCisjZGVmaW5lIF9fSEFMX1JDQ19KUEVHX0NMS19FTkFCTEUgICAgICAgICAgICAgICBfX0hBTF9SQ0NfSlBHREVDRU5fQ0xLX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfSlBFR19DTEtfRElTQUJMRSAgICAgICAgICAgICAgX19IQUxfUkNDX0pQR0RFQ0VOX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19KUEVHX0ZPUkNFX1JFU0VUICAgICAgICAgICAgICBfX0hBTF9SQ0NfSlBHREVDUlNUX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fSEFMX1JDQ19KUEVHX1JFTEVBU0VfUkVTRVQgICAgICAgICAgICBfX0hBTF9SQ0NfSlBHREVDUlNUX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX0pQRUdfQ0xLX1NMRUVQX0VOQUJMRSAgICAgICAgIF9fSEFMX1JDQ19KUEdERUNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfSlBFR19DTEtfU0xFRVBfRElTQUJMRSAgICAgICAgX19IQUxfUkNDX0pQR0RFQ19DTEtfU0xFRVBfRElTQUJMRQorI2VuZGlmIC8qIFNUTTMySDcgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfU1lTQ0ZHX0FsaWFzZWRfRGVmaW5lcyBIQUwgU1lTQ0ZHIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgSEFMX1NZU0NGR19GQVNUTU9ERVBMVVNfSTJDX1BBOSAgICBJMkNfRkFTVE1PREVQTFVTX1BBOQorI2RlZmluZSBIQUxfU1lTQ0ZHX0ZBU1RNT0RFUExVU19JMkNfUEExMCAgIEkyQ19GQVNUTU9ERVBMVVNfUEExMAorI2RlZmluZSBIQUxfU1lTQ0ZHX0ZBU1RNT0RFUExVU19JMkNfUEI2ICAgIEkyQ19GQVNUTU9ERVBMVVNfUEI2CisjZGVmaW5lIEhBTF9TWVNDRkdfRkFTVE1PREVQTFVTX0kyQ19QQjcgICAgSTJDX0ZBU1RNT0RFUExVU19QQjcKKyNkZWZpbmUgSEFMX1NZU0NGR19GQVNUTU9ERVBMVVNfSTJDX1BCOCAgICBJMkNfRkFTVE1PREVQTFVTX1BCOAorI2RlZmluZSBIQUxfU1lTQ0ZHX0ZBU1RNT0RFUExVU19JMkNfUEI5ICAgIEkyQ19GQVNUTU9ERVBMVVNfUEI5CisjZGVmaW5lIEhBTF9TWVNDRkdfRkFTVE1PREVQTFVTX0kyQzEgICAgICAgSTJDX0ZBU1RNT0RFUExVU19JMkMxCisjZGVmaW5lIEhBTF9TWVNDRkdfRkFTVE1PREVQTFVTX0kyQzIgICAgICAgSTJDX0ZBU1RNT0RFUExVU19JMkMyCisjZGVmaW5lIEhBTF9TWVNDRkdfRkFTVE1PREVQTFVTX0kyQzMgICAgICAgSTJDX0ZBU1RNT0RFUExVU19JMkMzCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgTExfRk1DX0FsaWFzZWRfRGVmaW5lcyBMTCBGTUMgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGNvbXBhdGliaWxpdHkgcHVycG9zZQorICAqIEB7CisgICovCisjaWYgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyRjcpIHx8IGRlZmluZWQoU1RNMzJINykKKyNkZWZpbmUgRk1DX05BTkRfUENDX1dBSVRfRkVBVFVSRV9ESVNBQkxFICAgICAgIEZNQ19OQU5EX1dBSVRfRkVBVFVSRV9ESVNBQkxFCisjZGVmaW5lIEZNQ19OQU5EX1BDQ19XQUlUX0ZFQVRVUkVfRU5BQkxFICAgICAgICBGTUNfTkFORF9XQUlUX0ZFQVRVUkVfRU5BQkxFCisjZGVmaW5lIEZNQ19OQU5EX1BDQ19NRU1fQlVTX1dJRFRIXzggICAgICAgICAgICBGTUNfTkFORF9NRU1fQlVTX1dJRFRIXzgKKyNkZWZpbmUgRk1DX05BTkRfUENDX01FTV9CVVNfV0lEVEhfMTYgICAgICAgICAgIEZNQ19OQU5EX01FTV9CVVNfV0lEVEhfMTYKKyNlbGlmIGRlZmluZWQoU1RNMzJGMSkgfHwgZGVmaW5lZChTVE0zMkYyKSB8fCBkZWZpbmVkKFNUTTMyRjMpIHx8IGRlZmluZWQoU1RNMzJGNCkKKyNkZWZpbmUgRk1DX05BTkRfV0FJVF9GRUFUVVJFX0RJU0FCTEUgICAgICAgICAgIEZNQ19OQU5EX1BDQ19XQUlUX0ZFQVRVUkVfRElTQUJMRQorI2RlZmluZSBGTUNfTkFORF9XQUlUX0ZFQVRVUkVfRU5BQkxFICAgICAgICAgICAgRk1DX05BTkRfUENDX1dBSVRfRkVBVFVSRV9FTkFCTEUKKyNkZWZpbmUgRk1DX05BTkRfTUVNX0JVU19XSURUSF84ICAgICAgICAgICAgICAgIEZNQ19OQU5EX1BDQ19NRU1fQlVTX1dJRFRIXzgKKyNkZWZpbmUgRk1DX05BTkRfTUVNX0JVU19XSURUSF8xNiAgICAgICAgICAgICAgIEZNQ19OQU5EX1BDQ19NRU1fQlVTX1dJRFRIXzE2CisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTExfRlNNQ19BbGlhc2VkX0RlZmluZXMgTEwgRlNNQyBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIEZTTUNfTk9SU1JBTV9UWVBFREVGICAgICAgICAgICAgICAgICAgICAgIEZTTUNfTk9SU1JBTV9UeXBlRGVmCisjZGVmaW5lIEZTTUNfTk9SU1JBTV9FWFRFTkRFRF9UWVBFREVGICAgICAgICAgICAgIEZTTUNfTk9SU1JBTV9FWFRFTkRFRF9UeXBlRGVmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9HUElPX0FsaWFzZWRfTWFjcm9zIEhBTCBHUElPIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgR0VUX0dQSU9fU09VUkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19HRVRfSU5ERVgKKyNkZWZpbmUgR0VUX0dQSU9fSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19HRVRfSU5ERVgKKworI2lmIGRlZmluZWQoU1RNMzJGNCkKKyNkZWZpbmUgR1BJT19BRjEyX1NETU1DICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19BRjEyX1NESU8KKyNkZWZpbmUgR1BJT19BRjEyX1NETU1DMSAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19BRjEyX1NESU8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkY3KQorI2RlZmluZSBHUElPX0FGMTJfU0RJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0FGMTJfU0RNTUMxCisjZGVmaW5lIEdQSU9fQUYxMl9TRE1NQyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQUYxMl9TRE1NQzEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkw0KQorI2RlZmluZSBHUElPX0FGMTJfU0RJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0FGMTJfU0RNTUMxCisjZGVmaW5lIEdQSU9fQUYxMl9TRE1NQyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQUYxMl9TRE1NQzEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkg3KQorI2RlZmluZSBHUElPX0FGN19TRElPMSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0FGN19TRE1NQzEKKyNkZWZpbmUgR1BJT19BRjhfU0RJTzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19BRjhfU0RNTUMxCisjZGVmaW5lIEdQSU9fQUYxMl9TRElPMSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQUYxMl9TRE1NQzEKKyNkZWZpbmUgR1BJT19BRjlfU0RJTzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19BRjlfU0RNTUMyCisjZGVmaW5lIEdQSU9fQUYxMF9TRElPMiAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQUYxMF9TRE1NQzIKKyNkZWZpbmUgR1BJT19BRjExX1NESU8yICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19BRjExX1NETU1DMgorI2VuZGlmCisKKyNkZWZpbmUgR1BJT19BRjBfTFBUSU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19BRjBfTFBUSU0xCisjZGVmaW5lIEdQSU9fQUYxX0xQVElNICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQUYxX0xQVElNMQorI2RlZmluZSBHUElPX0FGMl9MUFRJTSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0FGMl9MUFRJTTEKKworI2lmIGRlZmluZWQoU1RNMzJMMCkgfHwgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyRjQpIHx8IGRlZmluZWQoU1RNMzJGMikgfHwgZGVmaW5lZChTVE0zMkY3KSB8fCBkZWZpbmVkKFNUTTMyRzQpCisjZGVmaW5lICBHUElPX1NQRUVEX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fU1BFRURfRlJFUV9MT1cKKyNkZWZpbmUgIEdQSU9fU1BFRURfTUVESVVNICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19TUEVFRF9GUkVRX01FRElVTQorI2RlZmluZSAgR1BJT19TUEVFRF9GQVNUICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX1NQRUVEX0ZSRVFfSElHSAorI2RlZmluZSAgR1BJT19TUEVFRF9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX1NQRUVEX0ZSRVFfVkVSWV9ISUdICisjZW5kaWYgLyogU1RNMzJMMCB8fCBTVE0zMkw0IHx8IFNUTTMyRjQgfHwgU1RNMzJGMiB8fCBTVE0zMkY3IHx8IFNUTTMyRzQgKi8KKworI2lmIGRlZmluZWQoU1RNMzJMMSkKKyAjZGVmaW5lICBHUElPX1NQRUVEX1ZFUllfTE9XICAgIEdQSU9fU1BFRURfRlJFUV9MT1cKKyAjZGVmaW5lICBHUElPX1NQRUVEX0xPVyAgICAgICAgIEdQSU9fU1BFRURfRlJFUV9NRURJVU0KKyAjZGVmaW5lICBHUElPX1NQRUVEX01FRElVTSAgICAgIEdQSU9fU1BFRURfRlJFUV9ISUdICisgI2RlZmluZSAgR1BJT19TUEVFRF9ISUdIICAgICAgICBHUElPX1NQRUVEX0ZSRVFfVkVSWV9ISUdICisjZW5kaWYgLyogU1RNMzJMMSAqLworCisjaWYgZGVmaW5lZChTVE0zMkYwKSB8fCBkZWZpbmVkKFNUTTMyRjMpIHx8IGRlZmluZWQoU1RNMzJGMSkKKyAjZGVmaW5lICBHUElPX1NQRUVEX0xPVyAgICBHUElPX1NQRUVEX0ZSRVFfTE9XCisgI2RlZmluZSAgR1BJT19TUEVFRF9NRURJVU0gR1BJT19TUEVFRF9GUkVRX01FRElVTQorICNkZWZpbmUgIEdQSU9fU1BFRURfSElHSCAgIEdQSU9fU1BFRURfRlJFUV9ISUdICisjZW5kaWYgLyogU1RNMzJGMCB8fCBTVE0zMkYzIHx8IFNUTTMyRjEgKi8KKworI2RlZmluZSBHUElPX0FGNl9ERlNETSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0FGNl9ERlNETTEKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0hSVElNX0FsaWFzZWRfTWFjcm9zIEhBTCBIUlRJTSBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIEhSVElNX1RJTURFTEFZRURQUk9URUNUSU9OX0RJU0FCTEVEICAgICAgICAgICBIUlRJTV9USU1FUl9BX0JfQ19ERUxBWUVEUFJPVEVDVElPTl9ESVNBQkxFRAorI2RlZmluZSBIUlRJTV9USU1ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVET1VUMV9FRVY2OCAgSFJUSU1fVElNRVJfQV9CX0NfREVMQVlFRFBST1RFQ1RJT05fREVMQVlFRE9VVDFfRUVWNgorI2RlZmluZSBIUlRJTV9USU1ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVET1VUMl9FRVY2OCAgSFJUSU1fVElNRVJfQV9CX0NfREVMQVlFRFBST1RFQ1RJT05fREVMQVlFRE9VVDJfRUVWNgorI2RlZmluZSBIUlRJTV9USU1ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVEQk9USF9FRVY2OCAgSFJUSU1fVElNRVJfQV9CX0NfREVMQVlFRFBST1RFQ1RJT05fREVMQVlFREJPVEhfRUVWNgorI2RlZmluZSBIUlRJTV9USU1ERUxBWUVEUFJPVEVDVElPTl9CQUxBTkNFRF9FRVY2OCAgICAgSFJUSU1fVElNRVJfQV9CX0NfREVMQVlFRFBST1RFQ1RJT05fQkFMQU5DRURfRUVWNgorI2RlZmluZSBIUlRJTV9USU1ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVET1VUMV9ERUVWNzkgSFJUSU1fVElNRVJfQV9CX0NfREVMQVlFRFBST1RFQ1RJT05fREVMQVlFRE9VVDFfREVFVjcKKyNkZWZpbmUgSFJUSU1fVElNREVMQVlFRFBST1RFQ1RJT05fREVMQVlFRE9VVDJfREVFVjc5IEhSVElNX1RJTUVSX0FfQl9DX0RFTEFZRURQUk9URUNUSU9OX0RFTEFZRURPVVQyX0RFRVY3CisjZGVmaW5lIEhSVElNX1RJTURFTEFZRURQUk9URUNUSU9OX0RFTEFZRURCT1RIX0VFVjc5ICBIUlRJTV9USU1FUl9BX0JfQ19ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVEQk9USF9FRVY3CisjZGVmaW5lIEhSVElNX1RJTURFTEFZRURQUk9URUNUSU9OX0JBTEFOQ0VEX0VFVjc5ICAgICBIUlRJTV9USU1FUl9BX0JfQ19ERUxBWUVEUFJPVEVDVElPTl9CQUxBTkNFRF9FRVY3CisKKyNkZWZpbmUgX19IQUxfSFJUSU1fU2V0Q291bnRlciAgICAgICAgX19IQUxfSFJUSU1fU0VUQ09VTlRFUgorI2RlZmluZSBfX0hBTF9IUlRJTV9HZXRDb3VudGVyICAgICAgICBfX0hBTF9IUlRJTV9HRVRDT1VOVEVSCisjZGVmaW5lIF9fSEFMX0hSVElNX1NldFBlcmlvZCAgICAgICAgIF9fSEFMX0hSVElNX1NFVFBFUklPRAorI2RlZmluZSBfX0hBTF9IUlRJTV9HZXRQZXJpb2QgICAgICAgICBfX0hBTF9IUlRJTV9HRVRQRVJJT0QKKyNkZWZpbmUgX19IQUxfSFJUSU1fU2V0Q2xvY2tQcmVzY2FsZXIgX19IQUxfSFJUSU1fU0VUQ0xPQ0tQUkVTQ0FMRVIKKyNkZWZpbmUgX19IQUxfSFJUSU1fR2V0Q2xvY2tQcmVzY2FsZXIgX19IQUxfSFJUSU1fR0VUQ0xPQ0tQUkVTQ0FMRVIKKyNkZWZpbmUgX19IQUxfSFJUSU1fU2V0Q29tcGFyZSAgICAgICAgX19IQUxfSFJUSU1fU0VUQ09NUEFSRQorI2RlZmluZSBfX0hBTF9IUlRJTV9HZXRDb21wYXJlICAgICAgICBfX0hBTF9IUlRJTV9HRVRDT01QQVJFCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9JMkNfQWxpYXNlZF9EZWZpbmVzIEhBTCBJMkMgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJDX0RVQUxBRERSRVNTX0RJU0FCTEVEICAgICAgICAgICAgICAgIEkyQ19EVUFMQUREUkVTU19ESVNBQkxFCisjZGVmaW5lIEkyQ19EVUFMQUREUkVTU19FTkFCTEVEICAgICAgICAgICAgICAgICBJMkNfRFVBTEFERFJFU1NfRU5BQkxFCisjZGVmaW5lIEkyQ19HRU5FUkFMQ0FMTF9ESVNBQkxFRCAgICAgICAgICAgICAgICBJMkNfR0VORVJBTENBTExfRElTQUJMRQorI2RlZmluZSBJMkNfR0VORVJBTENBTExfRU5BQkxFRCAgICAgICAgICAgICAgICAgSTJDX0dFTkVSQUxDQUxMX0VOQUJMRQorI2RlZmluZSBJMkNfTk9TVFJFVENIX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgSTJDX05PU1RSRVRDSF9ESVNBQkxFCisjZGVmaW5lIEkyQ19OT1NUUkVUQ0hfRU5BQkxFRCAgICAgICAgICAgICAgICAgICBJMkNfTk9TVFJFVENIX0VOQUJMRQorI2RlZmluZSBJMkNfQU5BTE9HRklMVEVSX0VOQUJMRUQgICAgICAgICAgICAgICAgSTJDX0FOQUxPR0ZJTFRFUl9FTkFCTEUKKyNkZWZpbmUgSTJDX0FOQUxPR0ZJTFRFUl9ESVNBQkxFRCAgICAgICAgICAgICAgIEkyQ19BTkFMT0dGSUxURVJfRElTQUJMRQorI2lmIGRlZmluZWQoU1RNMzJGMCkgfHwgZGVmaW5lZChTVE0zMkYxKSB8fCBkZWZpbmVkKFNUTTMyRjMpIHx8IGRlZmluZWQoU1RNMzJHMCkgfHwgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyTDEpIHx8IGRlZmluZWQoU1RNMzJGNykKKyNkZWZpbmUgSEFMX0kyQ19TVEFURV9NRU1fQlVTWV9UWCAgICAgICAgICAgICAgIEhBTF9JMkNfU1RBVEVfQlVTWV9UWAorI2RlZmluZSBIQUxfSTJDX1NUQVRFX01FTV9CVVNZX1JYICAgICAgICAgICAgICAgSEFMX0kyQ19TVEFURV9CVVNZX1JYCisjZGVmaW5lIEhBTF9JMkNfU1RBVEVfTUFTVEVSX0JVU1lfVFggICAgICAgICAgICBIQUxfSTJDX1NUQVRFX0JVU1lfVFgKKyNkZWZpbmUgSEFMX0kyQ19TVEFURV9NQVNURVJfQlVTWV9SWCAgICAgICAgICAgIEhBTF9JMkNfU1RBVEVfQlVTWV9SWAorI2RlZmluZSBIQUxfSTJDX1NUQVRFX1NMQVZFX0JVU1lfVFggICAgICAgICAgICAgSEFMX0kyQ19TVEFURV9CVVNZX1RYCisjZGVmaW5lIEhBTF9JMkNfU1RBVEVfU0xBVkVfQlVTWV9SWCAgICAgICAgICAgICBIQUxfSTJDX1NUQVRFX0JVU1lfUlgKKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfSVJEQV9BbGlhc2VkX0RlZmluZXMgSEFMIElSREEgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVJEQV9PTkVfQklUX1NBTVBMRV9ESVNBQkxFRCAgICAgICAgICAgIElSREFfT05FX0JJVF9TQU1QTEVfRElTQUJMRQorI2RlZmluZSBJUkRBX09ORV9CSVRfU0FNUExFX0VOQUJMRUQgICAgICAgICAgICAgSVJEQV9PTkVfQklUX1NBTVBMRV9FTkFCTEUKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfSVdER19BbGlhc2VkX0RlZmluZXMgSEFMIElXREcgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgS1JfS0VZX1JFTE9BRCAgICAgICAgICAgICAgICAgICBJV0RHX0tFWV9SRUxPQUQKKyNkZWZpbmUgS1JfS0VZX0VOQUJMRSAgICAgICAgICAgICAgICAgICBJV0RHX0tFWV9FTkFCTEUKKyNkZWZpbmUgS1JfS0VZX0VXQSAgICAgICAgICAgICAgICAgICAgICBJV0RHX0tFWV9XUklURV9BQ0NFU1NfRU5BQkxFCisjZGVmaW5lIEtSX0tFWV9EV0EgICAgICAgICAgICAgICAgICAgICAgSVdER19LRVlfV1JJVEVfQUNDRVNTX0RJU0FCTEUKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0xQVElNX0FsaWFzZWRfRGVmaW5lcyBIQUwgTFBUSU0gQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBMUFRJTV9DTE9DS1NBTVBMRVRJTUVfRElSRUNUVFJBTlNJU1RJT04gTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FX0RJUkVDVFRSQU5TSVRJT04KKyNkZWZpbmUgTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FXzJUUkFOU0lTVElPTlMgICAgIExQVElNX0NMT0NLU0FNUExFVElNRV8yVFJBTlNJVElPTlMKKyNkZWZpbmUgTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FXzRUUkFOU0lTVElPTlMgICAgIExQVElNX0NMT0NLU0FNUExFVElNRV80VFJBTlNJVElPTlMKKyNkZWZpbmUgTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FXzhUUkFOU0lTVElPTlMgICAgIExQVElNX0NMT0NLU0FNUExFVElNRV84VFJBTlNJVElPTlMKKworI2RlZmluZSBMUFRJTV9DTE9DS1BPTEFSSVRZX1JJU0lOR0VER0UgICAgICAgICAgTFBUSU1fQ0xPQ0tQT0xBUklUWV9SSVNJTkcKKyNkZWZpbmUgTFBUSU1fQ0xPQ0tQT0xBUklUWV9GQUxMSU5HRURHRSAgICAgICAgIExQVElNX0NMT0NLUE9MQVJJVFlfRkFMTElORworI2RlZmluZSBMUFRJTV9DTE9DS1BPTEFSSVRZX0JPVEhFREdFUyAgICAgICAgICAgTFBUSU1fQ0xPQ0tQT0xBUklUWV9SSVNJTkdfRkFMTElORworCisjZGVmaW5lIExQVElNX1RSSUdTQU1QTEVUSU1FX0RJUkVDVFRSQU5TSVNUSU9OICBMUFRJTV9UUklHU0FNUExFVElNRV9ESVJFQ1RUUkFOU0lUSU9OCisjZGVmaW5lIExQVElNX1RSSUdTQU1QTEVUSU1FXzJUUkFOU0lTVElPTlMgICAgICBMUFRJTV9UUklHU0FNUExFVElNRV8yVFJBTlNJVElPTlMKKyNkZWZpbmUgTFBUSU1fVFJJR1NBTVBMRVRJTUVfNFRSQU5TSVNUSU9OUyAgICAgIExQVElNX1RSSUdTQU1QTEVUSU1FXzRUUkFOU0lUSU9OUworI2RlZmluZSBMUFRJTV9UUklHU0FNUExFVElNRV84VFJBTlNJU1RJT05TICAgICAgTFBUSU1fVFJJR1NBTVBMRVRJTUVfOFRSQU5TSVRJT05TCisKKy8qIFRoZSBmb2xsb3dpbmcgMyBkZWZpbml0aW9uIGhhdmUgYWxzbyBiZWVuIHByZXNlbnQgaW4gYSB0ZW1wb3JhcnkgdmVyc2lvbiBvZiBscHRpbS5oICovCisvKiBUaGV5IG5lZWQgdG8gYmUgcmVuYW1lZCBhbHNvIHRvIHRoZSByaWdodCBuYW1lLCBqdXN0IGluIGNhc2UgKi8KKyNkZWZpbmUgTFBUSU1fVFJJR1NBTVBMRVRJTUVfMlRSQU5TSVRJT04gICAgICAgIExQVElNX1RSSUdTQU1QTEVUSU1FXzJUUkFOU0lUSU9OUworI2RlZmluZSBMUFRJTV9UUklHU0FNUExFVElNRV80VFJBTlNJVElPTiAgICAgICAgTFBUSU1fVFJJR1NBTVBMRVRJTUVfNFRSQU5TSVRJT05TCisjZGVmaW5lIExQVElNX1RSSUdTQU1QTEVUSU1FXzhUUkFOU0lUSU9OICAgICAgICBMUFRJTV9UUklHU0FNUExFVElNRV84VFJBTlNJVElPTlMKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfTkFORF9BbGlhc2VkX0RlZmluZXMgSEFMIE5BTkQgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX05BTkRfUmVhZF9QYWdlICAgICAgICAgICAgICBIQUxfTkFORF9SZWFkX1BhZ2VfOGIKKyNkZWZpbmUgSEFMX05BTkRfV3JpdGVfUGFnZSAgICAgICAgICAgICBIQUxfTkFORF9Xcml0ZV9QYWdlXzhiCisjZGVmaW5lIEhBTF9OQU5EX1JlYWRfU3BhcmVBcmVhICAgICAgICAgSEFMX05BTkRfUmVhZF9TcGFyZUFyZWFfOGIKKyNkZWZpbmUgSEFMX05BTkRfV3JpdGVfU3BhcmVBcmVhICAgICAgICBIQUxfTkFORF9Xcml0ZV9TcGFyZUFyZWFfOGIKKworI2RlZmluZSBOQU5EX0FkZHJlc3NUeXBlZGVmICAgICAgICAgICAgIE5BTkRfQWRkcmVzc1R5cGVEZWYKKworI2RlZmluZSBfX0FSUkFZX0FERFJFU1MgICAgICAgICAgICAgICAgIEFSUkFZX0FERFJFU1MKKyNkZWZpbmUgX19BRERSXzFzdF9DWUNMRSAgICAgICAgICAgICAgICBBRERSXzFTVF9DWUNMRQorI2RlZmluZSBfX0FERFJfMm5kX0NZQ0xFICAgICAgICAgICAgICAgIEFERFJfMk5EX0NZQ0xFCisjZGVmaW5lIF9fQUREUl8zcmRfQ1lDTEUgICAgICAgICAgICAgICAgQUREUl8zUkRfQ1lDTEUKKyNkZWZpbmUgX19BRERSXzR0aF9DWUNMRSAgICAgICAgICAgICAgICBBRERSXzRUSF9DWUNMRQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfTk9SX0FsaWFzZWRfRGVmaW5lcyBIQUwgTk9SIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIE5PUl9TdGF0dXNUeXBlZGVmICAgICAgICAgICAgICBIQUxfTk9SX1N0YXR1c1R5cGVEZWYKKyNkZWZpbmUgTk9SX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgIEhBTF9OT1JfU1RBVFVTX1NVQ0NFU1MKKyNkZWZpbmUgTk9SX09OR09JTkcgICAgICAgICAgICAgICAgICAgIEhBTF9OT1JfU1RBVFVTX09OR09JTkcKKyNkZWZpbmUgTk9SX0VSUk9SICAgICAgICAgICAgICAgICAgICAgIEhBTF9OT1JfU1RBVFVTX0VSUk9SCisjZGVmaW5lIE5PUl9USU1FT1VUICAgICAgICAgICAgICAgICAgICBIQUxfTk9SX1NUQVRVU19USU1FT1VUCisKKyNkZWZpbmUgX19OT1JfV1JJVEUgICAgICAgICAgICAgICAgICAgIE5PUl9XUklURQorI2RlZmluZSBfX05PUl9BRERSX1NISUZUICAgICAgICAgICAgICAgTk9SX0FERFJfU0hJRlQKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX09QQU1QX0FsaWFzZWRfRGVmaW5lcyBIQUwgT1BBTVAgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBPUEFNUF9OT05JTlZFUlRJTkdJTlBVVF9WUDAgICAgICAgICAgIE9QQU1QX05PTklOVkVSVElOR0lOUFVUX0lPMAorI2RlZmluZSBPUEFNUF9OT05JTlZFUlRJTkdJTlBVVF9WUDEgICAgICAgICAgIE9QQU1QX05PTklOVkVSVElOR0lOUFVUX0lPMQorI2RlZmluZSBPUEFNUF9OT05JTlZFUlRJTkdJTlBVVF9WUDIgICAgICAgICAgIE9QQU1QX05PTklOVkVSVElOR0lOUFVUX0lPMgorI2RlZmluZSBPUEFNUF9OT05JTlZFUlRJTkdJTlBVVF9WUDMgICAgICAgICAgIE9QQU1QX05PTklOVkVSVElOR0lOUFVUX0lPMworCisjZGVmaW5lIE9QQU1QX1NFQ19OT05JTlZFUlRJTkdJTlBVVF9WUDAgICAgICAgT1BBTVBfU0VDX05PTklOVkVSVElOR0lOUFVUX0lPMAorI2RlZmluZSBPUEFNUF9TRUNfTk9OSU5WRVJUSU5HSU5QVVRfVlAxICAgICAgIE9QQU1QX1NFQ19OT05JTlZFUlRJTkdJTlBVVF9JTzEKKyNkZWZpbmUgT1BBTVBfU0VDX05PTklOVkVSVElOR0lOUFVUX1ZQMiAgICAgICBPUEFNUF9TRUNfTk9OSU5WRVJUSU5HSU5QVVRfSU8yCisjZGVmaW5lIE9QQU1QX1NFQ19OT05JTlZFUlRJTkdJTlBVVF9WUDMgICAgICAgT1BBTVBfU0VDX05PTklOVkVSVElOR0lOUFVUX0lPMworCisjZGVmaW5lIE9QQU1QX0lOVkVSVElOR0lOUFVUX1ZNMCAgICAgICAgICAgICAgT1BBTVBfSU5WRVJUSU5HSU5QVVRfSU8wCisjZGVmaW5lIE9QQU1QX0lOVkVSVElOR0lOUFVUX1ZNMSAgICAgICAgICAgICAgT1BBTVBfSU5WRVJUSU5HSU5QVVRfSU8xCisKKyNkZWZpbmUgSU9QQU1QX0lOVkVSVElOR0lOUFVUX1ZNMCAgICAgICAgICAgICBPUEFNUF9JTlZFUlRJTkdJTlBVVF9JTzAKKyNkZWZpbmUgSU9QQU1QX0lOVkVSVElOR0lOUFVUX1ZNMSAgICAgICAgICAgICBPUEFNUF9JTlZFUlRJTkdJTlBVVF9JTzEKKworI2RlZmluZSBPUEFNUF9TRUNfSU5WRVJUSU5HSU5QVVRfVk0wICAgICAgICAgIE9QQU1QX1NFQ19JTlZFUlRJTkdJTlBVVF9JTzAKKyNkZWZpbmUgT1BBTVBfU0VDX0lOVkVSVElOR0lOUFVUX1ZNMSAgICAgICAgICBPUEFNUF9TRUNfSU5WRVJUSU5HSU5QVVRfSU8xCisKKyNkZWZpbmUgT1BBTVBfSU5WRVJUSU5HSU5QVVRfVklOTSAgICAgICAgICAgICBPUEFNUF9TRUNfSU5WRVJUSU5HSU5QVVRfSU8xCisKKyNkZWZpbmUgT1BBTVBfUEdBQ09OTkVDVF9OTyAgICAgICAgICAgICAgICAgICBPUEFNUF9QR0FfQ09OTkVDVF9JTlZFUlRJTkdJTlBVVF9OTworI2RlZmluZSBPUEFNUF9QR0FDT05ORUNUX1ZNMCAgICAgICAgICAgICAgICAgIE9QQU1QX1BHQV9DT05ORUNUX0lOVkVSVElOR0lOUFVUX0lPMAorI2RlZmluZSBPUEFNUF9QR0FDT05ORUNUX1ZNMSAgICAgICAgICAgICAgICAgIE9QQU1QX1BHQV9DT05ORUNUX0lOVkVSVElOR0lOUFVUX0lPMQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9JMlNfQWxpYXNlZF9EZWZpbmVzIEhBTCBJMlMgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJTX1NUQU5EQVJEX1BISUxMSVBTICAgICAgSTJTX1NUQU5EQVJEX1BISUxJUFMKKyNpZiBkZWZpbmVkKFNUTTMyRjcpCisgICNkZWZpbmUgSTJTX0NMT0NLX1NZU0NMSyAgICAgICAgICAgSTJTX0NMT0NLX1BMTAorI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9QQ0NBUkRfQWxpYXNlZF9EZWZpbmVzIEhBTCBQQ0NBUkQgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworLyogQ29tcGFjdCBGbGFzaC1BVEEgcmVnaXN0ZXJzIGRlc2NyaXB0aW9uICovCisjZGVmaW5lIENGX0RBVEEgICAgICAgICAgICAgICAgICAgICAgIEFUQV9EQVRBCisjZGVmaW5lIENGX1NFQ1RPUl9DT1VOVCAgICAgICAgICAgICAgIEFUQV9TRUNUT1JfQ09VTlQKKyNkZWZpbmUgQ0ZfU0VDVE9SX05VTUJFUiAgICAgICAgICAgICAgQVRBX1NFQ1RPUl9OVU1CRVIKKyNkZWZpbmUgQ0ZfQ1lMSU5ERVJfTE9XICAgICAgICAgICAgICAgQVRBX0NZTElOREVSX0xPVworI2RlZmluZSBDRl9DWUxJTkRFUl9ISUdIICAgICAgICAgICAgICBBVEFfQ1lMSU5ERVJfSElHSAorI2RlZmluZSBDRl9DQVJEX0hFQUQgICAgICAgICAgICAgICAgICBBVEFfQ0FSRF9IRUFECisjZGVmaW5lIENGX1NUQVRVU19DTUQgICAgICAgICAgICAgICAgIEFUQV9TVEFUVVNfQ01ECisjZGVmaW5lIENGX1NUQVRVU19DTURfQUxURVJOQVRFICAgICAgIEFUQV9TVEFUVVNfQ01EX0FMVEVSTkFURQorI2RlZmluZSBDRl9DT01NT05fREFUQV9BUkVBICAgICAgICAgICBBVEFfQ09NTU9OX0RBVEFfQVJFQQorCisvKiBDb21wYWN0IEZsYXNoLUFUQSBjb21tYW5kcyAqLworI2RlZmluZSBDRl9SRUFEX1NFQ1RPUl9DTUQgICAgICAgICAgICBBVEFfUkVBRF9TRUNUT1JfQ01ECisjZGVmaW5lIENGX1dSSVRFX1NFQ1RPUl9DTUQgICAgICAgICAgIEFUQV9XUklURV9TRUNUT1JfQ01ECisjZGVmaW5lIENGX0VSQVNFX1NFQ1RPUl9DTUQgICAgICAgICAgIEFUQV9FUkFTRV9TRUNUT1JfQ01ECisjZGVmaW5lIENGX0lERU5USUZZX0NNRCAgICAgICAgICAgICAgIEFUQV9JREVOVElGWV9DTUQKKworI2RlZmluZSBQQ0NBUkRfU3RhdHVzVHlwZWRlZiAgICAgICAgICBIQUxfUENDQVJEX1N0YXR1c1R5cGVEZWYKKyNkZWZpbmUgUENDQVJEX1NVQ0NFU1MgICAgICAgICAgICAgICAgSEFMX1BDQ0FSRF9TVEFUVVNfU1VDQ0VTUworI2RlZmluZSBQQ0NBUkRfT05HT0lORyAgICAgICAgICAgICAgICBIQUxfUENDQVJEX1NUQVRVU19PTkdPSU5HCisjZGVmaW5lIFBDQ0FSRF9FUlJPUiAgICAgICAgICAgICAgICAgIEhBTF9QQ0NBUkRfU1RBVFVTX0VSUk9SCisjZGVmaW5lIFBDQ0FSRF9USU1FT1VUICAgICAgICAgICAgICAgIEhBTF9QQ0NBUkRfU1RBVFVTX1RJTUVPVVQKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1JUQ19BbGlhc2VkX0RlZmluZXMgSEFMIFJUQyBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIEZPUk1BVF9CSU4gICAgICAgICAgICAgICAgICBSVENfRk9STUFUX0JJTgorI2RlZmluZSBGT1JNQVRfQkNEICAgICAgICAgICAgICAgICAgUlRDX0ZPUk1BVF9CQ0QKKworI2RlZmluZSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX05vbmUgICAgIFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfTk9ORQorI2RlZmluZSBSVENfVEFNUEVSRVJBU0VCQUNLVVBfRElTQUJMRUQgIFJUQ19UQU1QRVJfRVJBU0VfQkFDS1VQX0RJU0FCTEUKKyNkZWZpbmUgUlRDX1RBTVBFUk1BU0tfRkxBR19ESVNBQkxFRCAgICBSVENfVEFNUEVSTUFTS19GTEFHX0RJU0FCTEUKKyNkZWZpbmUgUlRDX1RBTVBFUk1BU0tfRkxBR19FTkFCTEVEICAgICBSVENfVEFNUEVSTUFTS19GTEFHX0VOQUJMRQorCisjZGVmaW5lIFJUQ19NQVNLVEFNUEVSRkxBR19ESVNBQkxFRCAgICAgUlRDX1RBTVBFUk1BU0tfRkxBR19ESVNBQkxFCisjZGVmaW5lIFJUQ19NQVNLVEFNUEVSRkxBR19FTkFCTEVEICAgICAgUlRDX1RBTVBFUk1BU0tfRkxBR19FTkFCTEUKKyNkZWZpbmUgUlRDX1RBTVBFUkVSQVNFQkFDS1VQX0VOQUJMRUQgICBSVENfVEFNUEVSX0VSQVNFX0JBQ0tVUF9FTkFCTEUKKyNkZWZpbmUgUlRDX1RBTVBFUjFfMl9JTlRFUlJVUFQgICAgICAgICBSVENfQUxMX1RBTVBFUl9JTlRFUlJVUFQKKyNkZWZpbmUgUlRDX1RBTVBFUjFfMl8zX0lOVEVSUlVQVCAgICAgICBSVENfQUxMX1RBTVBFUl9JTlRFUlJVUFQKKworI2RlZmluZSBSVENfVElNRVNUQU1QUElOX1BDMTMgIFJUQ19USU1FU1RBTVBQSU5fREVGQVVMVAorI2RlZmluZSBSVENfVElNRVNUQU1QUElOX1BBMCBSVENfVElNRVNUQU1QUElOX1BPUzEKKyNkZWZpbmUgUlRDX1RJTUVTVEFNUFBJTl9QSTggUlRDX1RJTUVTVEFNUFBJTl9QT1MxCisjZGVmaW5lIFJUQ19USU1FU1RBTVBQSU5fUEMxICAgUlRDX1RJTUVTVEFNUFBJTl9QT1MyCisKKyNkZWZpbmUgUlRDX09VVFBVVF9SRU1BUF9QQzEzICBSVENfT1VUUFVUX1JFTUFQX05PTkUKKyNkZWZpbmUgUlRDX09VVFBVVF9SRU1BUF9QQjE0ICBSVENfT1VUUFVUX1JFTUFQX1BPUzEKKyNkZWZpbmUgUlRDX09VVFBVVF9SRU1BUF9QQjIgICBSVENfT1VUUFVUX1JFTUFQX1BPUzEKKworI2RlZmluZSBSVENfVEFNUEVSUElOX1BDMTMgUlRDX1RBTVBFUlBJTl9ERUZBVUxUCisjZGVmaW5lIFJUQ19UQU1QRVJQSU5fUEEwICBSVENfVEFNUEVSUElOX1BPUzEKKyNkZWZpbmUgUlRDX1RBTVBFUlBJTl9QSTggIFJUQ19UQU1QRVJQSU5fUE9TMQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1NNQVJUQ0FSRF9BbGlhc2VkX0RlZmluZXMgSEFMIFNNQVJUQ0FSRCBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfTkFDS19FTkFCTEVEICAgICAgICAgICAgICAgICAgU01BUlRDQVJEX05BQ0tfRU5BQkxFCisjZGVmaW5lIFNNQVJUQ0FSRF9OQUNLX0RJU0FCTEVEICAgICAgICAgICAgICAgICBTTUFSVENBUkRfTkFDS19ESVNBQkxFCisKKyNkZWZpbmUgU01BUlRDQVJEX09ORUJJVF9TQU1QTElOR19ESVNBQkxFRCAgICAgIFNNQVJUQ0FSRF9PTkVfQklUX1NBTVBMRV9ESVNBQkxFCisjZGVmaW5lIFNNQVJUQ0FSRF9PTkVCSVRfU0FNUExJTkdfRU5BQkxFRCAgICAgICBTTUFSVENBUkRfT05FX0JJVF9TQU1QTEVfRU5BQkxFCisjZGVmaW5lIFNNQVJUQ0FSRF9PTkVCSVRfU0FNUExJTkdfRElTQUJMRSAgICAgICBTTUFSVENBUkRfT05FX0JJVF9TQU1QTEVfRElTQUJMRQorI2RlZmluZSBTTUFSVENBUkRfT05FQklUX1NBTVBMSU5HX0VOQUJMRSAgICAgICAgU01BUlRDQVJEX09ORV9CSVRfU0FNUExFX0VOQUJMRQorCisjZGVmaW5lIFNNQVJUQ0FSRF9USU1FT1VUX0RJU0FCTEVEICAgICAgICAgICAgICBTTUFSVENBUkRfVElNRU9VVF9ESVNBQkxFCisjZGVmaW5lIFNNQVJUQ0FSRF9USU1FT1VUX0VOQUJMRUQgICAgICAgICAgICAgICBTTUFSVENBUkRfVElNRU9VVF9FTkFCTEUKKworI2RlZmluZSBTTUFSVENBUkRfTEFTVEJJVF9ESVNBQkxFRCAgICAgICAgICAgICAgU01BUlRDQVJEX0xBU1RCSVRfRElTQUJMRQorI2RlZmluZSBTTUFSVENBUkRfTEFTVEJJVF9FTkFCTEVEICAgICAgICAgICAgICAgU01BUlRDQVJEX0xBU1RCSVRfRU5BQkxFCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1NNQlVTX0FsaWFzZWRfRGVmaW5lcyBIQUwgU01CVVMgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01CVVNfRFVBTEFERFJFU1NfRElTQUJMRUQgICAgICBTTUJVU19EVUFMQUREUkVTU19ESVNBQkxFCisjZGVmaW5lIFNNQlVTX0RVQUxBRERSRVNTX0VOQUJMRUQgICAgICAgU01CVVNfRFVBTEFERFJFU1NfRU5BQkxFCisjZGVmaW5lIFNNQlVTX0dFTkVSQUxDQUxMX0RJU0FCTEVEICAgICAgU01CVVNfR0VORVJBTENBTExfRElTQUJMRQorI2RlZmluZSBTTUJVU19HRU5FUkFMQ0FMTF9FTkFCTEVEICAgICAgIFNNQlVTX0dFTkVSQUxDQUxMX0VOQUJMRQorI2RlZmluZSBTTUJVU19OT1NUUkVUQ0hfRElTQUJMRUQgICAgICAgIFNNQlVTX05PU1RSRVRDSF9ESVNBQkxFCisjZGVmaW5lIFNNQlVTX05PU1RSRVRDSF9FTkFCTEVEICAgICAgICAgU01CVVNfTk9TVFJFVENIX0VOQUJMRQorI2RlZmluZSBTTUJVU19BTkFMT0dGSUxURVJfRU5BQkxFRCAgICAgIFNNQlVTX0FOQUxPR0ZJTFRFUl9FTkFCTEUKKyNkZWZpbmUgU01CVVNfQU5BTE9HRklMVEVSX0RJU0FCTEVEICAgICBTTUJVU19BTkFMT0dGSUxURVJfRElTQUJMRQorI2RlZmluZSBTTUJVU19QRUNfRElTQUJMRUQgICAgICAgICAgICAgIFNNQlVTX1BFQ19ESVNBQkxFCisjZGVmaW5lIFNNQlVTX1BFQ19FTkFCTEVEICAgICAgICAgICAgICAgU01CVVNfUEVDX0VOQUJMRQorI2RlZmluZSBIQUxfU01CVVNfU1RBVEVfU0xBVkVfTElTVEVOICAgIEhBTF9TTUJVU19TVEFURV9MSVNURU4KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1NQSV9BbGlhc2VkX0RlZmluZXMgSEFMIFNQSSBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBTUElfVElNT0RFX0RJU0FCTEVEICAgICAgICAgICAgIFNQSV9USU1PREVfRElTQUJMRQorI2RlZmluZSBTUElfVElNT0RFX0VOQUJMRUQgICAgICAgICAgICAgIFNQSV9USU1PREVfRU5BQkxFCisKKyNkZWZpbmUgU1BJX0NSQ0NBTENVTEFUSU9OX0RJU0FCTEVEICAgICBTUElfQ1JDQ0FMQ1VMQVRJT05fRElTQUJMRQorI2RlZmluZSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFRCAgICAgIFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUKKworI2RlZmluZSBTUElfTlNTX1BVTFNFX0RJU0FCTEVEICAgICAgICAgIFNQSV9OU1NfUFVMU0VfRElTQUJMRQorI2RlZmluZSBTUElfTlNTX1BVTFNFX0VOQUJMRUQgICAgICAgICAgIFNQSV9OU1NfUFVMU0VfRU5BQkxFCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1RJTV9BbGlhc2VkX0RlZmluZXMgSEFMIFRJTSBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBDQ0VSX0NDeEVfTUFTSyAgICAgICAgICAgICAgICAgICBUSU1fQ0NFUl9DQ3hFX01BU0sKKyNkZWZpbmUgQ0NFUl9DQ3hORV9NQVNLICAgICAgICAgICAgICAgICAgVElNX0NDRVJfQ0N4TkVfTUFTSworCisjZGVmaW5lIFRJTV9ETUFCYXNlX0NSMSAgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX0NSMQorI2RlZmluZSBUSU1fRE1BQmFzZV9DUjIgICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9DUjIKKyNkZWZpbmUgVElNX0RNQUJhc2VfU01DUiAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfU01DUgorI2RlZmluZSBUSU1fRE1BQmFzZV9ESUVSICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9ESUVSCisjZGVmaW5lIFRJTV9ETUFCYXNlX1NSICAgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX1NSCisjZGVmaW5lIFRJTV9ETUFCYXNlX0VHUiAgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX0VHUgorI2RlZmluZSBUSU1fRE1BQmFzZV9DQ01SMSAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9DQ01SMQorI2RlZmluZSBUSU1fRE1BQmFzZV9DQ01SMiAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9DQ01SMgorI2RlZmluZSBUSU1fRE1BQmFzZV9DQ0VSICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9DQ0VSCisjZGVmaW5lIFRJTV9ETUFCYXNlX0NOVCAgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX0NOVAorI2RlZmluZSBUSU1fRE1BQmFzZV9QU0MgICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9QU0MKKyNkZWZpbmUgVElNX0RNQUJhc2VfQVJSICAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfQVJSCisjZGVmaW5lIFRJTV9ETUFCYXNlX1JDUiAgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX1JDUgorI2RlZmluZSBUSU1fRE1BQmFzZV9DQ1IxICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9DQ1IxCisjZGVmaW5lIFRJTV9ETUFCYXNlX0NDUjIgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX0NDUjIKKyNkZWZpbmUgVElNX0RNQUJhc2VfQ0NSMyAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfQ0NSMworI2RlZmluZSBUSU1fRE1BQmFzZV9DQ1I0ICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9DQ1I0CisjZGVmaW5lIFRJTV9ETUFCYXNlX0JEVFIgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX0JEVFIKKyNkZWZpbmUgVElNX0RNQUJhc2VfRENSICAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfRENSCisjZGVmaW5lIFRJTV9ETUFCYXNlX0RNQVIgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX0RNQVIKKyNkZWZpbmUgVElNX0RNQUJhc2VfT1IxICAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfT1IxCisjZGVmaW5lIFRJTV9ETUFCYXNlX0NDTVIzICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX0NDTVIzCisjZGVmaW5lIFRJTV9ETUFCYXNlX0NDUjUgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX0NDUjUKKyNkZWZpbmUgVElNX0RNQUJhc2VfQ0NSNiAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfQ0NSNgorI2RlZmluZSBUSU1fRE1BQmFzZV9PUjIgICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9PUjIKKyNkZWZpbmUgVElNX0RNQUJhc2VfT1IzICAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfT1IzCisjZGVmaW5lIFRJTV9ETUFCYXNlX09SICAgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX09SCisKKyNkZWZpbmUgVElNX0V2ZW50U291cmNlX1VwZGF0ZSAgICAgICAgICAgVElNX0VWRU5UU09VUkNFX1VQREFURQorI2RlZmluZSBUSU1fRXZlbnRTb3VyY2VfQ0MxICAgICAgICAgICAgICBUSU1fRVZFTlRTT1VSQ0VfQ0MxCisjZGVmaW5lIFRJTV9FdmVudFNvdXJjZV9DQzIgICAgICAgICAgICAgIFRJTV9FVkVOVFNPVVJDRV9DQzIKKyNkZWZpbmUgVElNX0V2ZW50U291cmNlX0NDMyAgICAgICAgICAgICAgVElNX0VWRU5UU09VUkNFX0NDMworI2RlZmluZSBUSU1fRXZlbnRTb3VyY2VfQ0M0ICAgICAgICAgICAgICBUSU1fRVZFTlRTT1VSQ0VfQ0M0CisjZGVmaW5lIFRJTV9FdmVudFNvdXJjZV9DT00gICAgICAgICAgICAgIFRJTV9FVkVOVFNPVVJDRV9DT00KKyNkZWZpbmUgVElNX0V2ZW50U291cmNlX1RyaWdnZXIgICAgICAgICAgVElNX0VWRU5UU09VUkNFX1RSSUdHRVIKKyNkZWZpbmUgVElNX0V2ZW50U291cmNlX0JyZWFrICAgICAgICAgICAgVElNX0VWRU5UU09VUkNFX0JSRUFLCisjZGVmaW5lIFRJTV9FdmVudFNvdXJjZV9CcmVhazIgICAgICAgICAgIFRJTV9FVkVOVFNPVVJDRV9CUkVBSzIKKworI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMVRyYW5zZmVyICAgICBUSU1fRE1BQlVSU1RMRU5HVEhfMVRSQU5TRkVSCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF8yVHJhbnNmZXJzICAgIFRJTV9ETUFCVVJTVExFTkdUSF8yVFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF8zVHJhbnNmZXJzICAgIFRJTV9ETUFCVVJTVExFTkdUSF8zVFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF80VHJhbnNmZXJzICAgIFRJTV9ETUFCVVJTVExFTkdUSF80VFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF81VHJhbnNmZXJzICAgIFRJTV9ETUFCVVJTVExFTkdUSF81VFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF82VHJhbnNmZXJzICAgIFRJTV9ETUFCVVJTVExFTkdUSF82VFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF83VHJhbnNmZXJzICAgIFRJTV9ETUFCVVJTVExFTkdUSF83VFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF84VHJhbnNmZXJzICAgIFRJTV9ETUFCVVJTVExFTkdUSF84VFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF85VHJhbnNmZXJzICAgIFRJTV9ETUFCVVJTVExFTkdUSF85VFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF8xMFRyYW5zZmVycyAgIFRJTV9ETUFCVVJTVExFTkdUSF8xMFRSQU5TRkVSUworI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMTFUcmFuc2ZlcnMgICBUSU1fRE1BQlVSU1RMRU5HVEhfMTFUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzEyVHJhbnNmZXJzICAgVElNX0RNQUJVUlNUTEVOR1RIXzEyVFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF8xM1RyYW5zZmVycyAgIFRJTV9ETUFCVVJTVExFTkdUSF8xM1RSQU5TRkVSUworI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMTRUcmFuc2ZlcnMgICBUSU1fRE1BQlVSU1RMRU5HVEhfMTRUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzE1VHJhbnNmZXJzICAgVElNX0RNQUJVUlNUTEVOR1RIXzE1VFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF8xNlRyYW5zZmVycyAgIFRJTV9ETUFCVVJTVExFTkdUSF8xNlRSQU5TRkVSUworI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMTdUcmFuc2ZlcnMgICBUSU1fRE1BQlVSU1RMRU5HVEhfMTdUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzE4VHJhbnNmZXJzICAgVElNX0RNQUJVUlNUTEVOR1RIXzE4VFJBTlNGRVJTCisKKyNpZiBkZWZpbmVkKFNUTTMyTDApCisjZGVmaW5lIFRJTTIyX1RJMV9HUElPMSAgIFRJTTIyX1RJMV9HUElPCisjZGVmaW5lIFRJTTIyX1RJMV9HUElPMiAgIFRJTTIyX1RJMV9HUElPCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJGMykKKyNkZWZpbmUgSVNfVElNX0hBTExfSU5URVJGQUNFX0lOU1RBTkNFICAgSVNfVElNX0hBTExfU0VOU09SX0lOVEVSRkFDRV9JTlNUQU5DRQorI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9UU0NfQWxpYXNlZF9EZWZpbmVzIEhBTCBUU0MgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVFNDX1NZTkNfUE9MX0ZBTEwgICAgICAgIFRTQ19TWU5DX1BPTEFSSVRZX0ZBTExJTkcKKyNkZWZpbmUgVFNDX1NZTkNfUE9MX1JJU0VfSElHSCAgIFRTQ19TWU5DX1BPTEFSSVRZX1JJU0lORworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfVUFSVF9BbGlhc2VkX0RlZmluZXMgSEFMIFVBUlQgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9PTkVCSVRfU0FNUExJTkdfRElTQUJMRUQgICBVQVJUX09ORV9CSVRfU0FNUExFX0RJU0FCTEUKKyNkZWZpbmUgVUFSVF9PTkVCSVRfU0FNUExJTkdfRU5BQkxFRCAgICBVQVJUX09ORV9CSVRfU0FNUExFX0VOQUJMRQorI2RlZmluZSBVQVJUX09ORV9CSVRfU0FNUExFX0RJU0FCTEVEICAgIFVBUlRfT05FX0JJVF9TQU1QTEVfRElTQUJMRQorI2RlZmluZSBVQVJUX09ORV9CSVRfU0FNUExFX0VOQUJMRUQgICAgIFVBUlRfT05FX0JJVF9TQU1QTEVfRU5BQkxFCisKKyNkZWZpbmUgX19IQUxfVUFSVF9PTkVCSVRfRU5BQkxFICAgICAgICBfX0hBTF9VQVJUX09ORV9CSVRfU0FNUExFX0VOQUJMRQorI2RlZmluZSBfX0hBTF9VQVJUX09ORUJJVF9ESVNBQkxFICAgICAgIF9fSEFMX1VBUlRfT05FX0JJVF9TQU1QTEVfRElTQUJMRQorCisjZGVmaW5lIF9fRElWX1NBTVBMSU5HMTYgICAgICAgICAgICAgICAgVUFSVF9ESVZfU0FNUExJTkcxNgorI2RlZmluZSBfX0RJVk1BTlRfU0FNUExJTkcxNiAgICAgICAgICAgIFVBUlRfRElWTUFOVF9TQU1QTElORzE2CisjZGVmaW5lIF9fRElWRlJBUV9TQU1QTElORzE2ICAgICAgICAgICAgVUFSVF9ESVZGUkFRX1NBTVBMSU5HMTYKKyNkZWZpbmUgX19VQVJUX0JSUl9TQU1QTElORzE2ICAgICAgICAgICBVQVJUX0JSUl9TQU1QTElORzE2CisKKyNkZWZpbmUgX19ESVZfU0FNUExJTkc4ICAgICAgICAgICAgICAgICBVQVJUX0RJVl9TQU1QTElORzgKKyNkZWZpbmUgX19ESVZNQU5UX1NBTVBMSU5HOCAgICAgICAgICAgICBVQVJUX0RJVk1BTlRfU0FNUExJTkc4CisjZGVmaW5lIF9fRElWRlJBUV9TQU1QTElORzggICAgICAgICAgICAgVUFSVF9ESVZGUkFRX1NBTVBMSU5HOAorI2RlZmluZSBfX1VBUlRfQlJSX1NBTVBMSU5HOCAgICAgICAgICAgIFVBUlRfQlJSX1NBTVBMSU5HOAorCisjZGVmaW5lIF9fRElWX0xQVUFSVCAgICAgICAgICAgICAgICAgICAgVUFSVF9ESVZfTFBVQVJUCisKKyNkZWZpbmUgVUFSVF9XQUtFVVBNRVRIT0RFX0lETEVMSU5FICAgICBVQVJUX1dBS0VVUE1FVEhPRF9JRExFTElORQorI2RlZmluZSBVQVJUX1dBS0VVUE1FVEhPREVfQUREUkVTU01BUksgIFVBUlRfV0FLRVVQTUVUSE9EX0FERFJFU1NNQVJLCisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBIQUxfVVNBUlRfQWxpYXNlZF9EZWZpbmVzIEhBTCBVU0FSVCBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIFVTQVJUX0NMT0NLX0RJU0FCTEVEICAgICAgICAgICAgVVNBUlRfQ0xPQ0tfRElTQUJMRQorI2RlZmluZSBVU0FSVF9DTE9DS19FTkFCTEVEICAgICAgICAgICAgIFVTQVJUX0NMT0NLX0VOQUJMRQorCisjZGVmaW5lIFVTQVJUTkFDS19FTkFCTEVEICAgICAgICAgICAgICAgVVNBUlRfTkFDS19FTkFCTEUKKyNkZWZpbmUgVVNBUlROQUNLX0RJU0FCTEVEICAgICAgICAgICAgICBVU0FSVF9OQUNLX0RJU0FCTEUKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1dXREdfQWxpYXNlZF9EZWZpbmVzIEhBTCBXV0RHIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIENGUl9CQVNFICAgICAgICAgICAgICAgICAgICBXV0RHX0NGUl9CQVNFCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0NBTl9BbGlhc2VkX0RlZmluZXMgSEFMIENBTiBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBDQU5fRmlsdGVyRklGTzAgICAgICAgICAgICAgQ0FOX0ZJTFRFUl9GSUZPMAorI2RlZmluZSBDQU5fRmlsdGVyRklGTzEgICAgICAgICAgICAgQ0FOX0ZJTFRFUl9GSUZPMQorI2RlZmluZSBDQU5fSVRfUlFDUDAgICAgICAgICAgICAgICAgQ0FOX0lUX1RNRQorI2RlZmluZSBDQU5fSVRfUlFDUDEgICAgICAgICAgICAgICAgQ0FOX0lUX1RNRQorI2RlZmluZSBDQU5fSVRfUlFDUDIgICAgICAgICAgICAgICAgQ0FOX0lUX1RNRQorI2RlZmluZSBJTkFLX1RJTUVPVVQgICAgICAgICAgICAgICAgQ0FOX1RJTUVPVVRfVkFMVUUKKyNkZWZpbmUgU0xBS19USU1FT1VUICAgICAgICAgICAgICAgIENBTl9USU1FT1VUX1ZBTFVFCisjZGVmaW5lIENBTl9UWFNUQVRVU19GQUlMRUQgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpCisjZGVmaW5lIENBTl9UWFNUQVRVU19PSyAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpCisjZGVmaW5lIENBTl9UWFNUQVRVU19QRU5ESU5HICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0VUSF9BbGlhc2VkX0RlZmluZXMgSEFMIEVUSCBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIFZMQU5fVEFHICAgICAgICAgICAgICAgIEVUSF9WTEFOX1RBRworI2RlZmluZSBNSU5fRVRIX1BBWUxPQUQgICAgICAgICBFVEhfTUlOX0VUSF9QQVlMT0FECisjZGVmaW5lIE1BWF9FVEhfUEFZTE9BRCAgICAgICAgIEVUSF9NQVhfRVRIX1BBWUxPQUQKKyNkZWZpbmUgSlVNQk9fRlJBTUVfUEFZTE9BRCAgICAgRVRIX0pVTUJPX0ZSQU1FX1BBWUxPQUQKKyNkZWZpbmUgTUFDTUlJQVJfQ1JfTUFTSyAgICAgICAgRVRIX01BQ01JSUFSX0NSX01BU0sKKyNkZWZpbmUgTUFDQ1JfQ0xFQVJfTUFTSyAgICAgICAgRVRIX01BQ0NSX0NMRUFSX01BU0sKKyNkZWZpbmUgTUFDRkNSX0NMRUFSX01BU0sgICAgICAgRVRIX01BQ0ZDUl9DTEVBUl9NQVNLCisjZGVmaW5lIERNQU9NUl9DTEVBUl9NQVNLICAgICAgIEVUSF9ETUFPTVJfQ0xFQVJfTUFTSworCisjZGVmaW5lIEVUSF9NTUNDUiAgICAgICAgICAgICAgMHgwMDAwMDEwMFUKKyNkZWZpbmUgRVRIX01NQ1JJUiAgICAgICAgICAgICAweDAwMDAwMTA0VQorI2RlZmluZSBFVEhfTU1DVElSICAgICAgICAgICAgIDB4MDAwMDAxMDhVCisjZGVmaW5lIEVUSF9NTUNSSU1SICAgICAgICAgICAgMHgwMDAwMDEwQ1UKKyNkZWZpbmUgRVRIX01NQ1RJTVIgICAgICAgICAgICAweDAwMDAwMTEwVQorI2RlZmluZSBFVEhfTU1DVEdGU0NDUiAgICAgICAgIDB4MDAwMDAxNENVCisjZGVmaW5lIEVUSF9NTUNUR0ZNU0NDUiAgICAgICAgMHgwMDAwMDE1MFUKKyNkZWZpbmUgRVRIX01NQ1RHRkNSICAgICAgICAgICAweDAwMDAwMTY4VQorI2RlZmluZSBFVEhfTU1DUkZDRUNSICAgICAgICAgIDB4MDAwMDAxOTRVCisjZGVmaW5lIEVUSF9NTUNSRkFFQ1IgICAgICAgICAgMHgwMDAwMDE5OFUKKyNkZWZpbmUgRVRIX01NQ1JHVUZDUiAgICAgICAgICAweDAwMDAwMUM0VQorCisjZGVmaW5lIEVUSF9NQUNfVFhGSUZPX0ZVTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMDAwMDBVICAvKiBUeCBGSUZPIGZ1bGwgKi8KKyNkZWZpbmUgRVRIX01BQ19UWEZJRk9OT1RfRU1QVFkgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMFUgIC8qIFR4IEZJRk8gbm90IGVtcHR5ICovCisjZGVmaW5lIEVUSF9NQUNfVFhGSUZPX1dSSVRFX0FDVElWRSAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAwMDBVICAvKiBUeCBGSUZPIHdyaXRlIGFjdGl2ZSAqLworI2RlZmluZSBFVEhfTUFDX1RYRklGT19JRExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgLyogVHggRklGTyByZWFkIHN0YXR1czogSWRsZSAqLworI2RlZmluZSBFVEhfTUFDX1RYRklGT19SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwVSAgLyogVHggRklGTyByZWFkIHN0YXR1czogUmVhZCAodHJhbnNmZXJyaW5nIGRhdGEgdG8gdGhlIE1BQyB0cmFuc21pdHRlcikgKi8KKyNkZWZpbmUgRVRIX01BQ19UWEZJRk9fV0FJVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMFUgIC8qIFR4IEZJRk8gcmVhZCBzdGF0dXM6IFdhaXRpbmcgZm9yIFR4U3RhdHVzIGZyb20gTUFDIHRyYW5zbWl0dGVyICovCisjZGVmaW5lIEVUSF9NQUNfVFhGSUZPX1dSSVRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzMDAwMDBVICAvKiBUeCBGSUZPIHJlYWQgc3RhdHVzOiBXcml0aW5nIHRoZSByZWNlaXZlZCBUeFN0YXR1cyBvciBmbHVzaGluZyB0aGUgVHhGSUZPICovCisjZGVmaW5lIEVUSF9NQUNfVFJBTlNNSVNTSU9OX1BBVVNFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDBVICAvKiBNQUMgdHJhbnNtaXR0ZXIgaW4gcGF1c2UgKi8KKyNkZWZpbmUgRVRIX01BQ19UUkFOU01JVEZSQU1FQ09OVFJPTExFUl9JRExFICAgICAgICAgICAgMHgwMDAwMDAwMFUgIC8qIE1BQyB0cmFuc21pdCBmcmFtZSBjb250cm9sbGVyOiBJZGxlICovCisjZGVmaW5lIEVUSF9NQUNfVFJBTlNNSVRGUkFNRUNPTlRST0xMRVJfV0FJVElORyAgICAgICAgIDB4MDAwMjAwMDBVICAvKiBNQUMgdHJhbnNtaXQgZnJhbWUgY29udHJvbGxlcjogV2FpdGluZyBmb3IgU3RhdHVzIG9mIHByZXZpb3VzIGZyYW1lIG9yIElGRy9iYWNrb2ZmIHBlcmlvZCB0byBiZSBvdmVyICovCisjZGVmaW5lIEVUSF9NQUNfVFJBTlNNSVRGUkFNRUNPTlRST0xMRVJfR0VOUkFUSU5HX1BDRiAgIDB4MDAwNDAwMDBVICAvKiBNQUMgdHJhbnNtaXQgZnJhbWUgY29udHJvbGxlcjogR2VuZXJhdGluZyBhbmQgdHJhbnNtaXR0aW5nIGEgUGF1c2UgY29udHJvbCBmcmFtZSAoaW4gZnVsbCBkdXBsZXggbW9kZSkgKi8KKyNkZWZpbmUgRVRIX01BQ19UUkFOU01JVEZSQU1FQ09OVFJPTExFUl9UUkFOU0ZFUlJJTkcgICAgMHgwMDA2MDAwMFUgIC8qIE1BQyB0cmFuc21pdCBmcmFtZSBjb250cm9sbGVyOiBUcmFuc2ZlcnJpbmcgaW5wdXQgZnJhbWUgZm9yIHRyYW5zbWlzc2lvbiAqLworI2RlZmluZSBFVEhfTUFDX01JSV9UUkFOU01JVF9BQ1RJVkUgICAgICAgICAgIDB4MDAwMTAwMDBVICAvKiBNQUMgTUlJIHRyYW5zbWl0IGVuZ2luZSBhY3RpdmUgKi8KKyNkZWZpbmUgRVRIX01BQ19SWEZJRk9fRU1QVFkgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgLyogUnggRklGTyBmaWxsIGxldmVsOiBlbXB0eSAqLworI2RlZmluZSBFVEhfTUFDX1JYRklGT19CRUxPV19USFJFU0hPTEQgICAgICAgIDB4MDAwMDAxMDBVICAvKiBSeCBGSUZPIGZpbGwgbGV2ZWw6IGZpbGwtbGV2ZWwgYmVsb3cgZmxvdy1jb250cm9sIGRlLWFjdGl2YXRlIHRocmVzaG9sZCAqLworI2RlZmluZSBFVEhfTUFDX1JYRklGT19BQk9WRV9USFJFU0hPTEQgICAgICAgIDB4MDAwMDAyMDBVICAvKiBSeCBGSUZPIGZpbGwgbGV2ZWw6IGZpbGwtbGV2ZWwgYWJvdmUgZmxvdy1jb250cm9sIGFjdGl2YXRlIHRocmVzaG9sZCAqLworI2RlZmluZSBFVEhfTUFDX1JYRklGT19GVUxMICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMDBVICAvKiBSeCBGSUZPIGZpbGwgbGV2ZWw6IGZ1bGwgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjEpCisjZWxzZQorI2RlZmluZSBFVEhfTUFDX1JFQURDT05UUk9MTEVSX0lETEUgICAgICAgICAgIDB4MDAwMDAwMDBVICAvKiBSeCBGSUZPIHJlYWQgY29udHJvbGxlciBJRExFIHN0YXRlICovCisjZGVmaW5lIEVUSF9NQUNfUkVBRENPTlRST0xMRVJfUkVBRElOR19EQVRBICAgMHgwMDAwMDAyMFUgIC8qIFJ4IEZJRk8gcmVhZCBjb250cm9sbGVyIFJlYWRpbmcgZnJhbWUgZGF0YSAqLworI2RlZmluZSBFVEhfTUFDX1JFQURDT05UUk9MTEVSX1JFQURJTkdfU1RBVFVTIDB4MDAwMDAwNDBVICAvKiBSeCBGSUZPIHJlYWQgY29udHJvbGxlciBSZWFkaW5nIGZyYW1lIHN0YXR1cyAob3IgdGltZS1zdGFtcCkgKi8KKyNlbmRpZgorI2RlZmluZSBFVEhfTUFDX1JFQURDT05UUk9MTEVSX0ZMVVNISU5HICAgICAgIDB4MDAwMDAwNjBVICAvKiBSeCBGSUZPIHJlYWQgY29udHJvbGxlciBGbHVzaGluZyB0aGUgZnJhbWUgZGF0YSBhbmQgc3RhdHVzICovCisjZGVmaW5lIEVUSF9NQUNfUlhGSUZPX1dSSVRFX0FDVElWRSAgICAgICAgICAgMHgwMDAwMDAxMFUgIC8qIFJ4IEZJRk8gd3JpdGUgY29udHJvbGxlciBhY3RpdmUgKi8KKyNkZWZpbmUgRVRIX01BQ19TTUFMTF9GSUZPX05PVEFDVElWRSAgICAgICAgICAweDAwMDAwMDAwVSAgLyogTUFDIHNtYWxsIEZJRk8gcmVhZCAvIHdyaXRlIGNvbnRyb2xsZXJzIG5vdCBhY3RpdmUgKi8KKyNkZWZpbmUgRVRIX01BQ19TTUFMTF9GSUZPX1JFQURfQUNUSVZFICAgICAgICAweDAwMDAwMDAyVSAgLyogTUFDIHNtYWxsIEZJRk8gcmVhZCBjb250cm9sbGVyIGFjdGl2ZSAqLworI2RlZmluZSBFVEhfTUFDX1NNQUxMX0ZJRk9fV1JJVEVfQUNUSVZFICAgICAgIDB4MDAwMDAwMDRVICAvKiBNQUMgc21hbGwgRklGTyB3cml0ZSBjb250cm9sbGVyIGFjdGl2ZSAqLworI2RlZmluZSBFVEhfTUFDX1NNQUxMX0ZJRk9fUldfQUNUSVZFICAgICAgICAgIDB4MDAwMDAwMDZVICAvKiBNQUMgc21hbGwgRklGTyByZWFkIC8gd3JpdGUgY29udHJvbGxlcnMgYWN0aXZlICovCisjZGVmaW5lIEVUSF9NQUNfTUlJX1JFQ0VJVkVfUFJPVE9DT0xfQUNUSVZFICAgMHgwMDAwMDAwMVUgIC8qIE1BQyBNSUkgcmVjZWl2ZSBwcm90b2NvbCBlbmdpbmUgYWN0aXZlICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0RDTUlfQWxpYXNlZF9EZWZpbmVzIEhBTCBEQ01JIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9EQ01JX0VSUk9SX09WRiAgICAgIEhBTF9EQ01JX0VSUk9SX09WUgorI2RlZmluZSBEQ01JX0lUX09WRiAgICAgICAgICAgICBEQ01JX0lUX09WUgorI2RlZmluZSBEQ01JX0ZMQUdfT1ZGUkkgICAgICAgICBEQ01JX0ZMQUdfT1ZSUkkKKyNkZWZpbmUgRENNSV9GTEFHX09WRk1JICAgICAgICAgRENNSV9GTEFHX09WUk1JCisKKyNkZWZpbmUgSEFMX0RDTUlfQ29uZmlnQ1JPUCAgICAgSEFMX0RDTUlfQ29uZmlnQ3JvcAorI2RlZmluZSBIQUxfRENNSV9FbmFibGVDUk9QICAgICBIQUxfRENNSV9FbmFibGVDcm9wCisjZGVmaW5lIEhBTF9EQ01JX0Rpc2FibGVDUk9QICAgIEhBTF9EQ01JX0Rpc2FibGVDcm9wCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyTDQpIHx8IGRlZmluZWQoU1RNMzJGNykgfHwgZGVmaW5lZChTVE0zMkY0Mjd4eCkgfHwgZGVmaW5lZChTVE0zMkY0Mzd4eCkgXAorICB8fCBkZWZpbmVkKFNUTTMyRjQyOXh4KSB8fCBkZWZpbmVkKFNUTTMyRjQzOXh4KSB8fCBkZWZpbmVkKFNUTTMyRjQ2OXh4KSB8fCBkZWZpbmVkKFNUTTMyRjQ3OXh4KQorLyoqIEBkZWZncm91cCBIQUxfRE1BMkRfQWxpYXNlZF9EZWZpbmVzIEhBTCBETUEyRCBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBETUEyRF9BUkdCODg4OCAgICAgICAgICBETUEyRF9PVVRQVVRfQVJHQjg4ODgKKyNkZWZpbmUgRE1BMkRfUkdCODg4ICAgICAgICAgICAgRE1BMkRfT1VUUFVUX1JHQjg4OAorI2RlZmluZSBETUEyRF9SR0I1NjUgICAgICAgICAgICBETUEyRF9PVVRQVVRfUkdCNTY1CisjZGVmaW5lIERNQTJEX0FSR0IxNTU1ICAgICAgICAgIERNQTJEX09VVFBVVF9BUkdCMTU1NQorI2RlZmluZSBETUEyRF9BUkdCNDQ0NCAgICAgICAgICBETUEyRF9PVVRQVVRfQVJHQjQ0NDQKKworI2RlZmluZSBDTV9BUkdCODg4OCAgICAgICAgICAgICBETUEyRF9JTlBVVF9BUkdCODg4OAorI2RlZmluZSBDTV9SR0I4ODggICAgICAgICAgICAgICBETUEyRF9JTlBVVF9SR0I4ODgKKyNkZWZpbmUgQ01fUkdCNTY1ICAgICAgICAgICAgICAgRE1BMkRfSU5QVVRfUkdCNTY1CisjZGVmaW5lIENNX0FSR0IxNTU1ICAgICAgICAgICAgIERNQTJEX0lOUFVUX0FSR0IxNTU1CisjZGVmaW5lIENNX0FSR0I0NDQ0ICAgICAgICAgICAgIERNQTJEX0lOUFVUX0FSR0I0NDQ0CisjZGVmaW5lIENNX0w4ICAgICAgICAgICAgICAgICAgIERNQTJEX0lOUFVUX0w4CisjZGVmaW5lIENNX0FMNDQgICAgICAgICAgICAgICAgIERNQTJEX0lOUFVUX0FMNDQKKyNkZWZpbmUgQ01fQUw4OCAgICAgICAgICAgICAgICAgRE1BMkRfSU5QVVRfQUw4OAorI2RlZmluZSBDTV9MNCAgICAgICAgICAgICAgICAgICBETUEyRF9JTlBVVF9MNAorI2RlZmluZSBDTV9BOCAgICAgICAgICAgICAgICAgICBETUEyRF9JTlBVVF9BOAorI2RlZmluZSBDTV9BNCAgICAgICAgICAgICAgICAgICBETUEyRF9JTlBVVF9BNAorLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAgLyogU1RNMzJMNCB8fCAgU1RNMzJGNyovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1BQUF9BbGlhc2VkX0RlZmluZXMgSEFMIFBQUCBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEhBTF9DUllQX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBDUllQIEFsaWFzZWQgRnVuY3Rpb25zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX0NSWVBfQ29tcHV0YXRpb25DcGx0Q2FsbGJhY2sgICAgIEhBTF9DUllQRXhfQ29tcHV0YXRpb25DcGx0Q2FsbGJhY2sKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0hBU0hfQWxpYXNlZF9GdW5jdGlvbnMgSEFMIEhBU0ggQWxpYXNlZCBGdW5jdGlvbnMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfSEFTSF9TVEFURVR5cGVEZWYgICAgICAgIEhBTF9IQVNIX1N0YXRlVHlwZURlZgorI2RlZmluZSBIQUxfSEFTSFBoYXNlVHlwZURlZiAgICAgICAgIEhBTF9IQVNIX1BoYXNlVHlwZURlZgorI2RlZmluZSBIQUxfSE1BQ19NRDVfRmluaXNoICAgICAgICAgIEhBTF9IQVNIX01ENV9GaW5pc2gKKyNkZWZpbmUgSEFMX0hNQUNfU0hBMV9GaW5pc2ggICAgICAgICBIQUxfSEFTSF9TSEExX0ZpbmlzaAorI2RlZmluZSBIQUxfSE1BQ19TSEEyMjRfRmluaXNoICAgICAgIEhBTF9IQVNIX1NIQTIyNF9GaW5pc2gKKyNkZWZpbmUgSEFMX0hNQUNfU0hBMjU2X0ZpbmlzaCAgICAgICBIQUxfSEFTSF9TSEEyNTZfRmluaXNoCisKKy8qSEFTSCBBbGdvcml0aG0gU2VsZWN0aW9uKi8KKworI2RlZmluZSBIQVNIX0FsZ29TZWxlY3Rpb25fU0hBMSAgICAgIEhBU0hfQUxHT1NFTEVDVElPTl9TSEExCisjZGVmaW5lIEhBU0hfQWxnb1NlbGVjdGlvbl9TSEEyMjQgICAgSEFTSF9BTEdPU0VMRUNUSU9OX1NIQTIyNAorI2RlZmluZSBIQVNIX0FsZ29TZWxlY3Rpb25fU0hBMjU2ICAgIEhBU0hfQUxHT1NFTEVDVElPTl9TSEEyNTYKKyNkZWZpbmUgSEFTSF9BbGdvU2VsZWN0aW9uX01ENSAgICAgICBIQVNIX0FMR09TRUxFQ1RJT05fTUQ1CisKKyNkZWZpbmUgSEFTSF9BbGdvTW9kZV9IQVNIICAgICAgICAgSEFTSF9BTEdPTU9ERV9IQVNICisjZGVmaW5lIEhBU0hfQWxnb01vZGVfSE1BQyAgICAgICAgIEhBU0hfQUxHT01PREVfSE1BQworCisjZGVmaW5lIEhBU0hfSE1BQ0tleVR5cGVfU2hvcnRLZXkgIEhBU0hfSE1BQ19LRVlUWVBFX1NIT1JUS0VZCisjZGVmaW5lIEhBU0hfSE1BQ0tleVR5cGVfTG9uZ0tleSAgIEhBU0hfSE1BQ19LRVlUWVBFX0xPTkdLRVkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBHZW5lcmljIEFsaWFzZWQgRnVuY3Rpb25zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX0VuYWJsZURCR1NsZWVwTW9kZSBIQUxfREJHTUNVX0VuYWJsZURCR1NsZWVwTW9kZQorI2RlZmluZSBIQUxfRGlzYWJsZURCR1NsZWVwTW9kZSBIQUxfREJHTUNVX0Rpc2FibGVEQkdTbGVlcE1vZGUKKyNkZWZpbmUgSEFMX0VuYWJsZURCR1N0b3BNb2RlIEhBTF9EQkdNQ1VfRW5hYmxlREJHU3RvcE1vZGUKKyNkZWZpbmUgSEFMX0Rpc2FibGVEQkdTdG9wTW9kZSBIQUxfREJHTUNVX0Rpc2FibGVEQkdTdG9wTW9kZQorI2RlZmluZSBIQUxfRW5hYmxlREJHU3RhbmRieU1vZGUgSEFMX0RCR01DVV9FbmFibGVEQkdTdGFuZGJ5TW9kZQorI2RlZmluZSBIQUxfRGlzYWJsZURCR1N0YW5kYnlNb2RlIEhBTF9EQkdNQ1VfRGlzYWJsZURCR1N0YW5kYnlNb2RlCisjZGVmaW5lIEhBTF9EQkdfTG93UG93ZXJDb25maWcoUGVyaXBoLCBjbWQpICgoKGNtZCk9PUVOQUJMRSk/IEhBTF9EQkdNQ1VfREJHX0VuYWJsZUxvd1Bvd2VyQ29uZmlnKFBlcmlwaCkgOiBIQUxfREJHTUNVX0RCR19EaXNhYmxlTG93UG93ZXJDb25maWcoUGVyaXBoKSkKKyNkZWZpbmUgSEFMX1ZSRUZJTlRfT3V0cHV0U2VsZWN0ICBIQUxfU1lTQ0ZHX1ZSRUZJTlRfT3V0cHV0U2VsZWN0CisjZGVmaW5lIEhBTF9Mb2NrX0NtZChjbWQpICgoKGNtZCk9PUVOQUJMRSkgPyBIQUxfU1lTQ0ZHX0VuYWJsZV9Mb2NrX1ZSRUZJTlQoKSA6IEhBTF9TWVNDRkdfRGlzYWJsZV9Mb2NrX1ZSRUZJTlQoKSkKKyNpZiBkZWZpbmVkKFNUTTMyTDApCisjZWxzZQorI2RlZmluZSBIQUxfVlJFRklOVF9DbWQoY21kKSAoKChjbWQpPT1FTkFCTEUpPyBIQUxfU1lTQ0ZHX0VuYWJsZVZSRUZJTlQoKSA6IEhBTF9TWVNDRkdfRGlzYWJsZVZSRUZJTlQoKSkKKyNlbmRpZgorI2RlZmluZSBIQUxfQURDX0VuYWJsZUJ1ZmZlcl9DbWQoY21kKSAgKCgoY21kKT09RU5BQkxFKSA/IEhBTF9BRENFeF9FbmFibGVWUkVGSU5UKCkgOiBIQUxfQURDRXhfRGlzYWJsZVZSRUZJTlQoKSkKKyNkZWZpbmUgSEFMX0FEQ19FbmFibGVCdWZmZXJTZW5zb3JfQ21kKGNtZCkgKCgoY21kKT09RU5BQkxFKSA/ICBIQUxfQURDRXhfRW5hYmxlVlJFRklOVFRlbXBTZW5zb3IoKSA6IEhBTF9BRENFeF9EaXNhYmxlVlJFRklOVFRlbXBTZW5zb3IoKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0ZMQVNIX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBGTEFTSCBBbGlhc2VkIEZ1bmN0aW9ucyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIEZMQVNIX0hhbGZQYWdlUHJvZ3JhbSAgICAgIEhBTF9GTEFTSEV4X0hhbGZQYWdlUHJvZ3JhbQorI2RlZmluZSBGTEFTSF9FbmFibGVSdW5Qb3dlckRvd24gICBIQUxfRkxBU0hFeF9FbmFibGVSdW5Qb3dlckRvd24KKyNkZWZpbmUgRkxBU0hfRGlzYWJsZVJ1blBvd2VyRG93biAgSEFMX0ZMQVNIRXhfRGlzYWJsZVJ1blBvd2VyRG93bgorI2RlZmluZSBIQUxfREFUQV9FRVBST01FeF9VbmxvY2sgICBIQUxfRkxBU0hFeF9EQVRBRUVQUk9NX1VubG9jaworI2RlZmluZSBIQUxfREFUQV9FRVBST01FeF9Mb2NrICAgICBIQUxfRkxBU0hFeF9EQVRBRUVQUk9NX0xvY2sKKyNkZWZpbmUgSEFMX0RBVEFfRUVQUk9NRXhfRXJhc2UgICAgSEFMX0ZMQVNIRXhfREFUQUVFUFJPTV9FcmFzZQorI2RlZmluZSBIQUxfREFUQV9FRVBST01FeF9Qcm9ncmFtICBIQUxfRkxBU0hFeF9EQVRBRUVQUk9NX1Byb2dyYW0KKworIC8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0kyQ19BbGlhc2VkX0Z1bmN0aW9ucyBIQUwgSTJDIEFsaWFzZWQgRnVuY3Rpb25zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX0kyQ0V4X0FuYWxvZ0ZpbHRlcl9Db25maWcgICAgICAgICBIQUxfSTJDRXhfQ29uZmlnQW5hbG9nRmlsdGVyCisjZGVmaW5lIEhBTF9JMkNFeF9EaWdpdGFsRmlsdGVyX0NvbmZpZyAgICAgICAgSEFMX0kyQ0V4X0NvbmZpZ0RpZ2l0YWxGaWx0ZXIKKyNkZWZpbmUgSEFMX0ZNUEkyQ0V4X0FuYWxvZ0ZpbHRlcl9Db25maWcgICAgICBIQUxfRk1QSTJDRXhfQ29uZmlnQW5hbG9nRmlsdGVyCisjZGVmaW5lIEhBTF9GTVBJMkNFeF9EaWdpdGFsRmlsdGVyX0NvbmZpZyAgICAgSEFMX0ZNUEkyQ0V4X0NvbmZpZ0RpZ2l0YWxGaWx0ZXIKKworI2RlZmluZSBIQUxfSTJDRmFzdE1vZGVQbHVzQ29uZmlnKFNZU0NGR19JMkNGYXN0TW9kZVBsdXMsIGNtZCkgKCgoY21kKT09RU5BQkxFKT8gSEFMX0kyQ0V4X0VuYWJsZUZhc3RNb2RlUGx1cyhTWVNDRkdfSTJDRmFzdE1vZGVQbHVzKTogSEFMX0kyQ0V4X0Rpc2FibGVGYXN0TW9kZVBsdXMoU1lTQ0ZHX0kyQ0Zhc3RNb2RlUGx1cykpCisgLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfUFdSX0FsaWFzZWQgSEFMIFBXUiBBbGlhc2VkIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX1BXUl9QVkRDb25maWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QV1JfQ29uZmlnUFZECisjZGVmaW5lIEhBTF9QV1JfRGlzYWJsZUJrVXBSZWcgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUFdSRXhfRGlzYWJsZUJrVXBSZWcKKyNkZWZpbmUgSEFMX1BXUl9EaXNhYmxlRmxhc2hQb3dlckRvd24gICAgICAgICAgICAgICAgIEhBTF9QV1JFeF9EaXNhYmxlRmxhc2hQb3dlckRvd24KKyNkZWZpbmUgSEFMX1BXUl9EaXNhYmxlVmRkaW8yTW9uaXRvciAgICAgICAgICAgICAgICAgIEhBTF9QV1JFeF9EaXNhYmxlVmRkaW8yTW9uaXRvcgorI2RlZmluZSBIQUxfUFdSX0VuYWJsZUJrVXBSZWcgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BXUkV4X0VuYWJsZUJrVXBSZWcKKyNkZWZpbmUgSEFMX1BXUl9FbmFibGVGbGFzaFBvd2VyRG93biAgICAgICAgICAgICAgICAgIEhBTF9QV1JFeF9FbmFibGVGbGFzaFBvd2VyRG93bgorI2RlZmluZSBIQUxfUFdSX0VuYWJsZVZkZGlvMk1vbml0b3IgICAgICAgICAgICAgICAgICAgSEFMX1BXUkV4X0VuYWJsZVZkZGlvMk1vbml0b3IKKyNkZWZpbmUgSEFMX1BXUl9QVkRfUFZNX0lSUUhhbmRsZXIgICAgICAgICAgICAgICAgICAgIEhBTF9QV1JFeF9QVkRfUFZNX0lSUUhhbmRsZXIKKyNkZWZpbmUgSEFMX1BXUl9QVkRMZXZlbENvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QV1JfQ29uZmlnUFZECisjZGVmaW5lIEhBTF9QV1JfVmRkaW8yTW9uaXRvcl9JUlFIYW5kbGVyICAgICAgICAgICAgICBIQUxfUFdSRXhfVmRkaW8yTW9uaXRvcl9JUlFIYW5kbGVyCisjZGVmaW5lIEhBTF9QV1JfVmRkaW8yTW9uaXRvckNhbGxiYWNrICAgICAgICAgICAgICAgICBIQUxfUFdSRXhfVmRkaW8yTW9uaXRvckNhbGxiYWNrCisjZGVmaW5lIEhBTF9QV1JFeF9BY3RpdmF0ZU92ZXJEcml2ZSAgICAgICAgICAgICAgICAgICBIQUxfUFdSRXhfRW5hYmxlT3ZlckRyaXZlCisjZGVmaW5lIEhBTF9QV1JFeF9EZWFjdGl2YXRlT3ZlckRyaXZlICAgICAgICAgICAgICAgICBIQUxfUFdSRXhfRGlzYWJsZU92ZXJEcml2ZQorI2RlZmluZSBIQUxfUFdSRXhfRGlzYWJsZVNEQURDQW5hbG9nICAgICAgICAgICAgICAgICAgSEFMX1BXUkV4X0Rpc2FibGVTREFEQworI2RlZmluZSBIQUxfUFdSRXhfRW5hYmxlU0RBRENBbmFsb2cgICAgICAgICAgICAgICAgICAgSEFMX1BXUkV4X0VuYWJsZVNEQURDCisjZGVmaW5lIEhBTF9QV1JFeF9QVk1Db25maWcgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUFdSRXhfQ29uZmlnUFZNCisKKyNkZWZpbmUgUFdSX01PREVfTk9STUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXUl9QVkRfTU9ERV9OT1JNQUwKKyNkZWZpbmUgUFdSX01PREVfSVRfUklTSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXUl9QVkRfTU9ERV9JVF9SSVNJTkcKKyNkZWZpbmUgUFdSX01PREVfSVRfRkFMTElORyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXUl9QVkRfTU9ERV9JVF9GQUxMSU5HCisjZGVmaW5lIFBXUl9NT0RFX0lUX1JJU0lOR19GQUxMSU5HICAgICAgICAgICAgICAgICAgICBQV1JfUFZEX01PREVfSVRfUklTSU5HX0ZBTExJTkcKKyNkZWZpbmUgUFdSX01PREVfRVZFTlRfUklTSU5HICAgICAgICAgICAgICAgICAgICAgICAgIFBXUl9QVkRfTU9ERV9FVkVOVF9SSVNJTkcKKyNkZWZpbmUgUFdSX01PREVfRVZFTlRfRkFMTElORyAgICAgICAgICAgICAgICAgICAgICAgIFBXUl9QVkRfTU9ERV9FVkVOVF9GQUxMSU5HCisjZGVmaW5lIFBXUl9NT0RFX0VWRU5UX1JJU0lOR19GQUxMSU5HICAgICAgICAgICAgICAgICBQV1JfUFZEX01PREVfRVZFTlRfUklTSU5HX0ZBTExJTkcKKworI2RlZmluZSBDUl9PRkZTRVRfQkIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdSX0NSX09GRlNFVF9CQgorI2RlZmluZSBDU1JfT0ZGU0VUX0JCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdSX0NTUl9PRkZTRVRfQkIKKyNkZWZpbmUgUE1PREVfQklUX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19CSVRfTlVNQkVSCisjZGVmaW5lIENSX1BNT0RFX0JCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUl9WT1NfQkIKKworI2RlZmluZSBEQlBfQml0TnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJQX0JJVF9OVU1CRVIKKyNkZWZpbmUgUFZERV9CaXROdW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBWREVfQklUX05VTUJFUgorI2RlZmluZSBQTU9ERV9CaXROdW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1PREVfQklUX05VTUJFUgorI2RlZmluZSBFV1VQX0JpdE51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVdVUF9CSVRfTlVNQkVSCisjZGVmaW5lIEZQRFNfQml0TnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERTX0JJVF9OVU1CRVIKKyNkZWZpbmUgT0RFTl9CaXROdW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ERU5fQklUX05VTUJFUgorI2RlZmluZSBPRFNXRU5fQml0TnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0RTV0VOX0JJVF9OVU1CRVIKKyNkZWZpbmUgTVJMVkRTX0JpdE51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1STFZEU19CSVRfTlVNQkVSCisjZGVmaW5lIExQTFZEU19CaXROdW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUExWRFNfQklUX05VTUJFUgorI2RlZmluZSBCUkVfQml0TnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlJFX0JJVF9OVU1CRVIKKworI2RlZmluZSBQV1JfTU9ERV9FVlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdSX1BWRF9NT0RFX05PUk1BTAorCisgLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfU01CVVNfQWxpYXNlZF9GdW5jdGlvbnMgSEFMIFNNQlVTIEFsaWFzZWQgRnVuY3Rpb25zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX1NsYXZlX0xpc3Rlbl9JVCAgICAgICAgICBIQUxfU01CVVNfRW5hYmxlTGlzdGVuX0lUCisjZGVmaW5lIEhBTF9TTUJVU19TbGF2ZUFkZHJDYWxsYmFjayAgICAgICAgSEFMX1NNQlVTX0FkZHJDYWxsYmFjaworI2RlZmluZSBIQUxfU01CVVNfU2xhdmVMaXN0ZW5DcGx0Q2FsbGJhY2sgIEhBTF9TTUJVU19MaXN0ZW5DcGx0Q2FsbGJhY2sKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1NQSV9BbGlhc2VkX0Z1bmN0aW9ucyBIQUwgU1BJIEFsaWFzZWQgRnVuY3Rpb25zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX1NQSV9GbHVzaFJ4RmlmbyAgICAgICAgICAgICAgICBIQUxfU1BJRXhfRmx1c2hSeEZpZm8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1RJTV9BbGlhc2VkX0Z1bmN0aW9ucyBIQUwgVElNIEFsaWFzZWQgRnVuY3Rpb25zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX1RJTV9ETUFEZWxheVB1bHNlQ3BsdCAgICAgICAgICAgICAgICAgICAgICAgVElNX0RNQURlbGF5UHVsc2VDcGx0CisjZGVmaW5lIEhBTF9USU1fRE1BRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9ETUFFcnJvcgorI2RlZmluZSBIQUxfVElNX0RNQUNhcHR1cmVDcGx0ICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fRE1BQ2FwdHVyZUNwbHQKKyNkZWZpbmUgSEFMX1RJTUV4X0RNQUNvbW11dGF0aW9uQ3BsdCAgICAgICAgICAgICAgICAgICAgVElNRXhfRE1BQ29tbXV0YXRpb25DcGx0CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9VQVJUX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBVQVJUIEFsaWFzZWQgRnVuY3Rpb25zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX1VBUlRfV2FrZXVwQ2FsbGJhY2sgSEFMX1VBUlRFeF9XYWtldXBDYWxsYmFjaworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfTFREQ19BbGlhc2VkX0Z1bmN0aW9ucyBIQUwgTFREQyBBbGlhc2VkIEZ1bmN0aW9ucyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9MVERDX0xpbmVFdmVuQ2FsbGJhY2sgSEFMX0xURENfTGluZUV2ZW50Q2FsbGJhY2sKKyNkZWZpbmUgSEFMX0xURENfUmVsYW9kICAgICAgICAgICBIQUxfTFREQ19SZWxvYWQKKyNkZWZpbmUgSEFMX0xURENfU3RydWN0SW5pdEZyb21WaWRlb0NvbmZpZyAgSEFMX0xURENFeF9TdHJ1Y3RJbml0RnJvbVZpZGVvQ29uZmlnCisjZGVmaW5lIEhBTF9MVERDX1N0cnVjdEluaXRGcm9tQWRhcHRlZENvbW1hbmRDb25maWcgIEhBTF9MVERDRXhfU3RydWN0SW5pdEZyb21BZGFwdGVkQ29tbWFuZENvbmZpZworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIEhBTF9QUFBfQWxpYXNlZF9GdW5jdGlvbnMgSEFMIFBQUCBBbGlhc2VkIEZ1bmN0aW9ucyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEhBTF9BRVNfQWxpYXNlZF9NYWNyb3MgSEFMIENSWVAgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBBRVNfSVRfQ0MgICAgICAgICAgICAgICAgICAgICAgQ1JZUF9JVF9DQworI2RlZmluZSBBRVNfSVRfRVJSICAgICAgICAgICAgICAgICAgICAgQ1JZUF9JVF9FUlIKKyNkZWZpbmUgQUVTX0ZMQUdfQ0NGICAgICAgICAgICAgICAgICAgIENSWVBfRkxBR19DQ0YKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0FsaWFzZWRfTWFjcm9zIEhBTCBHZW5lcmljIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfR0VUX0JPT1RfTU9ERSAgICAgICAgICAgICAgICAgICBfX0hBTF9TWVNDRkdfR0VUX0JPT1RfTU9ERQorI2RlZmluZSBfX0hBTF9SRU1BUE1FTU9SWV9GTEFTSCAgICAgICAgICAgICAgIF9fSEFMX1NZU0NGR19SRU1BUE1FTU9SWV9GTEFTSAorI2RlZmluZSBfX0hBTF9SRU1BUE1FTU9SWV9TWVNURU1GTEFTSCAgICAgICAgIF9fSEFMX1NZU0NGR19SRU1BUE1FTU9SWV9TWVNURU1GTEFTSAorI2RlZmluZSBfX0hBTF9SRU1BUE1FTU9SWV9TUkFNICAgICAgICAgICAgICAgIF9fSEFMX1NZU0NGR19SRU1BUE1FTU9SWV9TUkFNCisjZGVmaW5lIF9fSEFMX1JFTUFQTUVNT1JZX0ZNQyAgICAgICAgICAgICAgICAgX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX0ZNQworI2RlZmluZSBfX0hBTF9SRU1BUE1FTU9SWV9GTUNfU0RSQU0gICAgICAgICAgIF9fSEFMX1NZU0NGR19SRU1BUE1FTU9SWV9GTUNfU0RSQU0KKyNkZWZpbmUgX19IQUxfUkVNQVBNRU1PUllfRlNNQyAgICAgICAgICAgICAgICBfX0hBTF9TWVNDRkdfUkVNQVBNRU1PUllfRlNNQworI2RlZmluZSBfX0hBTF9SRU1BUE1FTU9SWV9RVUFEU1BJICAgICAgICAgICAgIF9fSEFMX1NZU0NGR19SRU1BUE1FTU9SWV9RVUFEU1BJCisjZGVmaW5lIF9fSEFMX0ZNQ19CQU5LICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfU1lTQ0ZHX0ZNQ19CQU5LCisjZGVmaW5lIF9fSEFMX0dFVF9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfU1lTQ0ZHX0dFVF9GTEFHCisjZGVmaW5lIF9fSEFMX0NMRUFSX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgX19IQUxfU1lTQ0ZHX0NMRUFSX0ZMQUcKKyNkZWZpbmUgX19IQUxfVlJFRklOVF9PVVRfRU5BQkxFICAgICAgICAgICAgICBfX0hBTF9TWVNDRkdfVlJFRklOVF9PVVRfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1ZSRUZJTlRfT1VUX0RJU0FCTEUgICAgICAgICAgICAgX19IQUxfU1lTQ0ZHX1ZSRUZJTlRfT1VUX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX1NSQU0yX1dSUF9FTkFCTEUgICAgICAgICBfX0hBTF9TWVNDRkdfU1JBTTJfV1JQXzBfMzFfRU5BQkxFCisKKyNkZWZpbmUgU1lTQ0ZHX0ZMQUdfVlJFRl9SRUFEWSAgICAgICAgICAgICAgICBTWVNDRkdfRkxBR19WUkVGSU5UX1JFQURZCisjZGVmaW5lIFNZU0NGR19GTEFHX1JDNDggICAgICAgICAgICAgICAgICAgICAgUkNDX0ZMQUdfSFNJNDgKKyNkZWZpbmUgSVNfU1lTQ0ZHX0ZBU1RNT0RFUExVU19DT05GSUcgICAgICAgICBJU19JMkNfRkFTVE1PREVQTFVTCisjZGVmaW5lIFVGQl9NT0RFX0JpdE51bWJlciAgICAgICAgICAgICAgICAgICAgVUZCX01PREVfQklUX05VTUJFUgorI2RlZmluZSBDTVBfUERfQml0TnVtYmVyICAgICAgICAgICAgICAgICAgICAgIENNUF9QRF9CSVRfTlVNQkVSCisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBIQUxfQURDX0FsaWFzZWRfTWFjcm9zIEhBTCBBREMgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBfX0FEQ19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQURDX0VOQUJMRQorI2RlZmluZSBfX0FEQ19ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQURDX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfQURDX0VOQUJMSU5HX0NPTkRJVElPTlMgICAgICAgICAgICAgICAgICAgIEFEQ19FTkFCTElOR19DT05ESVRJT05TCisjZGVmaW5lIF9fSEFMX0FEQ19ESVNBQkxJTkdfQ09ORElUSU9OUyAgICAgICAgICAgICAgICAgICBBRENfRElTQUJMSU5HX0NPTkRJVElPTlMKKyNkZWZpbmUgX19IQUxfQURDX0lTX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19JU19FTkFCTEUKKyNkZWZpbmUgX19BRENfSVNfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19JU19FTkFCTEUKKyNkZWZpbmUgX19IQUxfQURDX0lTX1NPRlRXQVJFX1NUQVJUX1JFR1VMQVIgICAgICAgICAgICAgIEFEQ19JU19TT0ZUV0FSRV9TVEFSVF9SRUdVTEFSCisjZGVmaW5lIF9fSEFMX0FEQ19JU19TT0ZUV0FSRV9TVEFSVF9JTkpFQ1RFRCAgICAgICAgICAgICBBRENfSVNfU09GVFdBUkVfU1RBUlRfSU5KRUNURUQKKyNkZWZpbmUgX19IQUxfQURDX0lTX0NPTlZFUlNJT05fT05HT0lOR19SRUdVTEFSX0lOSkVDVEVEIEFEQ19JU19DT05WRVJTSU9OX09OR09JTkdfUkVHVUxBUl9JTkpFQ1RFRAorI2RlZmluZSBfX0hBTF9BRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX1JFR1VMQVIgICAgICAgICAgQURDX0lTX0NPTlZFUlNJT05fT05HT0lOR19SRUdVTEFSCisjZGVmaW5lIF9fSEFMX0FEQ19JU19DT05WRVJTSU9OX09OR09JTkdfSU5KRUNURUQgICAgICAgICBBRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX0lOSkVDVEVECisjZGVmaW5lIF9fSEFMX0FEQ19JU19DT05WRVJTSU9OX09OR09JTkcgICAgICAgICAgICAgICAgICBBRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HCisjZGVmaW5lIF9fSEFMX0FEQ19DTEVBUl9FUlJPUkNPREUgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0xFQVJfRVJST1JDT0RFCisKKyNkZWZpbmUgX19IQUxfQURDX0dFVF9SRVNPTFVUSU9OICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19HRVRfUkVTT0xVVElPTgorI2RlZmluZSBfX0hBTF9BRENfSlNRUl9SSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0pTUVJfUksKKyNkZWZpbmUgX19IQUxfQURDX0NGR1JfQVdEMUNIICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0FXRDFDSF9TSElGVAorI2RlZmluZSBfX0hBTF9BRENfQ0ZHUl9BV0QyM0NSICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfQVdEMjNDUgorI2RlZmluZSBfX0hBTF9BRENfQ0ZHUl9JTkpFQ1RfQVVUT19DT05WRVJTSU9OICAgICAgICAgICAgQURDX0NGR1JfSU5KRUNUX0FVVE9fQ09OVkVSU0lPTgorI2RlZmluZSBfX0hBTF9BRENfQ0ZHUl9JTkpFQ1RfQ09OVEVYVF9RVUVVRSAgICAgICAgICAgICAgQURDX0NGR1JfSU5KRUNUX0NPTlRFWFRfUVVFVUUKKyNkZWZpbmUgX19IQUxfQURDX0NGR1JfSU5KRUNUX0RJU0NDT05USU5VT1VTICAgICAgICAgICAgIEFEQ19DRkdSX0lOSkVDVF9ESVNDQ09OVElOVU9VUworI2RlZmluZSBfX0hBTF9BRENfQ0ZHUl9SRUdfRElTQ0NPTlRJTlVPVVMgICAgICAgICAgICAgICAgQURDX0NGR1JfUkVHX0RJU0NDT05USU5VT1VTCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSX0RJU0NPTlRJTlVPVVNfTlVNICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9ESVNDT05USU5VT1VTX05VTQorI2RlZmluZSBfX0hBTF9BRENfQ0ZHUl9BVVRPV0FJVCAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfQVVUT1dBSVQKKyNkZWZpbmUgX19IQUxfQURDX0NGR1JfQ09OVElOVU9VUyAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0NPTlRJTlVPVVMKKyNkZWZpbmUgX19IQUxfQURDX0NGR1JfT1ZFUlJVTiAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX09WRVJSVU4KKyNkZWZpbmUgX19IQUxfQURDX0NGR1JfRE1BQ09OVFJFUSAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0RNQUNPTlRSRVEKKyNkZWZpbmUgX19IQUxfQURDX0NGR1JfRVhUU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0VYVFNFTF9TRVQKKyNkZWZpbmUgX19IQUxfQURDX0pTUVJfSkVYVFNFTCAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19KU1FSX0pFWFRTRUxfU0VUCisjZGVmaW5lIF9fSEFMX0FEQ19PRlJfQ0hBTk5FTCAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfT0ZSX0NIQU5ORUwKKyNkZWZpbmUgX19IQUxfQURDX0RJRlNFTF9DSEFOTkVMICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19ESUZTRUxfQ0hBTk5FTAorI2RlZmluZSBfX0hBTF9BRENfQ0FMRkFDVF9ESUZGX1NFVCAgICAgICAgICAgICAgICAgICAgICAgQURDX0NBTEZBQ1RfRElGRl9TRVQKKyNkZWZpbmUgX19IQUxfQURDX0NBTEZBQ1RfRElGRl9HRVQgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DQUxGQUNUX0RJRkZfR0VUCisjZGVmaW5lIF9fSEFMX0FEQ19UUlhfSElHSFRIUkVTSE9MRCAgICAgICAgICAgICAgICAgICAgICBBRENfVFJYX0hJR0hUSFJFU0hPTEQKKworI2RlZmluZSBfX0hBTF9BRENfT0ZGU0VUX1NISUZUX1JFU09MVVRJT04gICAgICAgICAgICAgICAgQURDX09GRlNFVF9TSElGVF9SRVNPTFVUSU9OCisjZGVmaW5lIF9fSEFMX0FEQ19BV0QxVEhSRVNIT0xEX1NISUZUX1JFU09MVVRJT04gICAgICAgICBBRENfQVdEMVRIUkVTSE9MRF9TSElGVF9SRVNPTFVUSU9OCisjZGVmaW5lIF9fSEFMX0FEQ19BV0QyM1RIUkVTSE9MRF9TSElGVF9SRVNPTFVUSU9OICAgICAgICBBRENfQVdEMjNUSFJFU0hPTERfU0hJRlRfUkVTT0xVVElPTgorI2RlZmluZSBfX0hBTF9BRENfQ09NTU9OX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NPTU1PTl9SRUdJU1RFUgorI2RlZmluZSBfX0hBTF9BRENfQ09NTU9OX0NDUl9NVUxUSSAgICAgICAgICAgICAgICAgICAgICAgQURDX0NPTU1PTl9DQ1JfTVVMVEkKKyNkZWZpbmUgX19IQUxfQURDX01VTFRJTU9ERV9JU19FTkFCTEVEICAgICAgICAgICAgICAgICAgIEFEQ19NVUxUSU1PREVfSVNfRU5BQkxFCisjZGVmaW5lIF9fQURDX01VTFRJTU9ERV9JU19FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICBBRENfTVVMVElNT0RFX0lTX0VOQUJMRQorI2RlZmluZSBfX0hBTF9BRENfTk9OTVVMVElNT0RFX09SX01VTFRJTU9ERU1BU1RFUiAgICAgICAgQURDX05PTk1VTFRJTU9ERV9PUl9NVUxUSU1PREVNQVNURVIKKyNkZWZpbmUgX19IQUxfQURDX0NPTU1PTl9BRENfT1RIRVIgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DT01NT05fQURDX09USEVSCisjZGVmaW5lIF9fSEFMX0FEQ19NVUxUSV9TTEFWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfTVVMVElfU0xBVkUKKworI2RlZmluZSBfX0hBTF9BRENfU1FSMV9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NRUjFfTF9TSElGVAorI2RlZmluZSBfX0hBTF9BRENfSlNRUl9KTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0pTUVJfSkxfU0hJRlQKKyNkZWZpbmUgX19IQUxfQURDX0pTUVJfUktfSkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19KU1FSX1JLX0pMCisjZGVmaW5lIF9fSEFMX0FEQ19DUjFfRElTQ09OVElOVU9VU19OVU0gICAgICAgICAgICAgICAgICBBRENfQ1IxX0RJU0NPTlRJTlVPVVNfTlVNCisjZGVmaW5lIF9fSEFMX0FEQ19DUjFfU0NBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ1IxX1NDQU5fU0VUCisjZGVmaW5lIF9fSEFMX0FEQ19DT05WQ1lDTEVTX01BWF9SQU5HRSAgICAgICAgICAgICAgICAgICBBRENfQ09OVkNZQ0xFU19NQVhfUkFOR0UKKyNkZWZpbmUgX19IQUxfQURDX0NMT0NLX1BSRVNDQUxFUl9SQU5HRSAgICAgICAgICAgICAgICAgIEFEQ19DTE9DS19QUkVTQ0FMRVJfUkFOR0UKKyNkZWZpbmUgX19IQUxfQURDX0dFVF9DTE9DS19QUkVTQ0FMRVIgICAgICAgICAgICAgICAgICAgIEFEQ19HRVRfQ0xPQ0tfUFJFU0NBTEVSCisKKyNkZWZpbmUgX19IQUxfQURDX1NRUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19TUVIxCisjZGVmaW5lIF9fSEFMX0FEQ19TTVBSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU01QUjEKKyNkZWZpbmUgX19IQUxfQURDX1NNUFIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19TTVBSMgorI2RlZmluZSBfX0hBTF9BRENfU1FSM19SSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NRUjNfUksKKyNkZWZpbmUgX19IQUxfQURDX1NRUjJfUksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19TUVIyX1JLCisjZGVmaW5lIF9fSEFMX0FEQ19TUVIxX1JLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU1FSMV9SSworI2RlZmluZSBfX0hBTF9BRENfQ1IyX0NPTlRJTlVPVVMgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NSMl9DT05USU5VT1VTCisjZGVmaW5lIF9fSEFMX0FEQ19DUjFfRElTQ09OVElOVU9VUyAgICAgICAgICAgICAgICAgICAgICBBRENfQ1IxX0RJU0NPTlRJTlVPVVMKKyNkZWZpbmUgX19IQUxfQURDX0NSMV9TQ0FOQ09OViAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DUjFfU0NBTkNPTlYKKyNkZWZpbmUgX19IQUxfQURDX0NSMl9FT0NTZWxlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgIEFEQ19DUjJfRU9DU2VsZWN0aW9uCisjZGVmaW5lIF9fSEFMX0FEQ19DUjJfRE1BQ29udFJlcSAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ1IyX0RNQUNvbnRSZXEKKyNkZWZpbmUgX19IQUxfQURDX0pTUVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19KU1FSCisKKyNkZWZpbmUgX19IQUxfQURDX0NIU0VMUl9DSEFOTkVMICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DSFNFTFJfQ0hBTk5FTAorI2RlZmluZSBfX0hBTF9BRENfQ0ZHUjFfUkVHX0RJU0NDT05USU5VT1VTICAgICAgICAgICAgICAgQURDX0NGR1IxX1JFR19ESVNDQ09OVElOVU9VUworI2RlZmluZSBfX0hBTF9BRENfQ0ZHUjFfQVVUT09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1IxX0FVVE9PRkYKKyNkZWZpbmUgX19IQUxfQURDX0NGR1IxX0FVVE9XQUlUICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9BVVRPV0FJVAorI2RlZmluZSBfX0hBTF9BRENfQ0ZHUjFfQ09OVElOVU9VUyAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1IxX0NPTlRJTlVPVVMKKyNkZWZpbmUgX19IQUxfQURDX0NGR1IxX09WRVJSVU4gICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9PVkVSUlVOCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSMV9TQ0FORElSICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfU0NBTkRJUgorI2RlZmluZSBfX0hBTF9BRENfQ0ZHUjFfRE1BQ09OVFJFUSAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1IxX0RNQUNPTlRSRVEKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfREFDX0FsaWFzZWRfTWFjcm9zIEhBTCBEQUMgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9ESFIxMlIxX0FMSUdORU1FTlQgICAgICAgICAgICAgICAgICAgICAgICBEQUNfREhSMTJSMV9BTElHTk1FTlQKKyNkZWZpbmUgX19IQUxfREhSMTJSMl9BTElHTkVNRU5UICAgICAgICAgICAgICAgICAgICAgICAgREFDX0RIUjEyUjJfQUxJR05NRU5UCisjZGVmaW5lIF9fSEFMX0RIUjEyUkRfQUxJR05FTUVOVCAgICAgICAgICAgICAgICAgICAgICAgIERBQ19ESFIxMlJEX0FMSUdOTUVOVAorI2RlZmluZSBJU19EQUNfR0VORVJBVEVfV0FWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU19EQUNfV0FWRQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9EQkdNQ1VfQWxpYXNlZF9NYWNyb3MgSEFMIERCR01DVSBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU0xX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTEKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNMV9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTEKKyNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTJfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMgorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU0yX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNMgorI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNM19EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0zCisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTNfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0zCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU00X0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTQKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNNF9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTQKKyNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTVfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNNQorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU01X0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNNQorI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNNl9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU02CisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTZfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU02CisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU03X0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTcKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNN19EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTcKKyNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTThfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNOAorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU04X0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNOAorCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU05X0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTkKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNOV9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTkKKyNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTEwX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTEwCisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTEwX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNMTAKKyNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTExX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTExCisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTExX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNMTEKKyNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTEyX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTEyCisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTEyX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNMTIKKyNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTEzX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTEzCisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTEzX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNMTMKKyNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTE0X0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTE0CisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTE0X0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNMTQKKyNkZWZpbmUgX19IQUxfRlJFRVpFX0NBTjJfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfQ0FOMgorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9DQU4yX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfQ0FOMgorCisKKyNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTE1X0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTE1CisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTE1X0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNMTUKKyNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTE2X0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTE2CisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTE2X0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNMTYKKyNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTE3X0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTE3CisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTE3X0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNMTcKKyNkZWZpbmUgX19IQUxfRlJFRVpFX1JUQ19EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9SVEMKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfUlRDX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfUlRDCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9XV0RHX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1dXREcKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfV1dER19EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1dXREcKKyNkZWZpbmUgX19IQUxfRlJFRVpFX0lXREdfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfSVdERworI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9JV0RHX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfSVdERworI2RlZmluZSBfX0hBTF9GUkVFWkVfSTJDMV9USU1FT1VUX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0kyQzFfVElNRU9VVAorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9JMkMxX1RJTUVPVVRfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9JMkMxX1RJTUVPVVQKKyNkZWZpbmUgX19IQUxfRlJFRVpFX0kyQzJfVElNRU9VVF9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9JMkMyX1RJTUVPVVQKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfSTJDMl9USU1FT1VUX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfSTJDMl9USU1FT1VUCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9JMkMzX1RJTUVPVVRfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfSTJDM19USU1FT1VUCisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX0kyQzNfVElNRU9VVF9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX0kyQzNfVElNRU9VVAorI2RlZmluZSBfX0hBTF9GUkVFWkVfQ0FOMV9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9DQU4xCisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX0NBTjFfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9DQU4xCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9MUFRJTTFfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfTFBUSU0xCisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX0xQVElNMV9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX0xQVElNMQorI2RlZmluZSBfX0hBTF9GUkVFWkVfTFBUSU0yX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0xQVElNMgorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9MUFRJTTJfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9MUFRJTTIKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfQ09NUF9BbGlhc2VkX01hY3JvcyBIQUwgQ09NUCBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjaWYgZGVmaW5lZChTVE0zMkYzKQorI2RlZmluZSBDT01QX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9FTkFCTEUKKyNkZWZpbmUgQ09NUF9TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfRElTQUJMRQorI2RlZmluZSBDT01QX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9MT0NLCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KSB8fCBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfUklTSU5HX0lUX0VOQUJMRShfX0VYVElMSU5FX18pICAgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX1JJU0lOR19JVF9ESVNBQkxFKF9fRVhUSUxJTkVfXykgICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNCkgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9GQUxMSU5HX0lUX0VOQUJMRShfX0VYVElMSU5FX18pICAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVA2X0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRkFMTElOR19JVF9ESVNBQkxFKF9fRVhUSUxJTkVfXykgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNCkgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVA2X0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0VOQUJMRV9JVChfX0VYVElMSU5FX18pICAgICAgICAgICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9FTkFCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVA2X0VYVElfRU5BQkxFX0lUKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9ESVNBQkxFX0lUKF9fRVhUSUxJTkVfXykgICAgICAgICAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0RJU0FCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVA2X0VYVElfRElTQUJMRV9JVCgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfR0VUX0ZMQUcoX19GTEFHX18pICAgICAgICAgICAgICAgKCgoX19GTEFHX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfR0VUX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRkxBR19fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0dFVF9GTEFHKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QNl9FWFRJX0dFVF9GTEFHKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9DTEVBUl9GTEFHKF9fRkxBR19fKSAgICAgICAgICAgICAoKChfX0ZMQUdfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9DTEVBUl9GTEFHKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZMQUdfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9DTEVBUl9GTEFHKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QNl9FWFRJX0NMRUFSX0ZMQUcoKSkKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4QykKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX1JJU0lOR19JVF9FTkFCTEUoX19FWFRJTElORV9fKSAgICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVA2X0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9SSVNJTkdfSVRfRElTQUJMRShfX0VYVElMSU5FX18pICAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QNl9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0ZBTExJTkdfSVRfRU5BQkxFKF9fRVhUSUxJTkVfXykgICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVA2X0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRkFMTElOR19JVF9ESVNBQkxFKF9fRVhUSUxJTkVfXykgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRU5BQkxFX0lUKF9fRVhUSUxJTkVfXykgICAgICAgICAgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0VOQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0VOQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9FTkFCTEVfSVQoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0RJU0FCTEVfSVQoX19FWFRJTElORV9fKSAgICAgICAgICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0RJU0FCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVA2X0VYVElfRElTQUJMRV9JVCgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfR0VUX0ZMQUcoX19GTEFHX18pICAgICAgICAgICAgICAgKCgoX19GTEFHX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfR0VUX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRkxBR19fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0dFVF9GTEFHKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZMQUdfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9HRVRfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9HRVRfRkxBRygpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfQ0xFQVJfRkxBRyhfX0ZMQUdfXykgICAgICAgICAgICAgKCgoX19GTEFHX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfQ0xFQVJfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19GTEFHX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfQ0xFQVJfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19GTEFHX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNCkgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfQ0xFQVJfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9DTEVBUl9GTEFHKCkpCisjIGVuZGlmCisjIGlmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9SSVNJTkdfSVRfRU5BQkxFKF9fRVhUSUxJTkVfXykgICAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMykgPyBfX0hBTF9DT01QX0NPTVAzX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNCkgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNSkgPyBfX0hBTF9DT01QX0NPTVA1X0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNikgPyBfX0hBTF9DT01QX0NPTVA2X0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QN19FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfUklTSU5HX0lUX0RJU0FCTEUoX19FWFRJTElORV9fKSAgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMykgPyBfX0hBTF9DT01QX0NPTVAzX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA1KSA/IF9fSEFMX0NPTVBfQ09NUDVfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNikgPyBfX0hBTF9DT01QX0NPTVA2X0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDdfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9GQUxMSU5HX0lUX0VOQUJMRShfX0VYVElMSU5FX18pICAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAzKSA/IF9fSEFMX0NPTVBfQ09NUDNfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNCkgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDUpID8gX19IQUxfQ09NUF9DT01QNV9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA2KSA/IF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QN19FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0ZBTExJTkdfSVRfRElTQUJMRShfX0VYVElMSU5FX18pICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMykgPyBfX0hBTF9DT01QX0NPTVAzX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDUpID8gX19IQUxfQ09NUF9DT01QNV9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNikgPyBfX0hBTF9DT01QX0NPTVA2X0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVA3X0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0VOQUJMRV9JVChfX0VYVElMSU5FX18pICAgICAgICAgICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9FTkFCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAzKSA/IF9fSEFMX0NPTVBfQ09NUDNfRVhUSV9FTkFCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9FTkFCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA1KSA/IF9fSEFMX0NPTVBfQ09NUDVfRVhUSV9FTkFCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA2KSA/IF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9FTkFCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVA3X0VYVElfRU5BQkxFX0lUKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9ESVNBQkxFX0lUKF9fRVhUSUxJTkVfXykgICAgICAgICAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRElTQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAzKSA/IF9fSEFMX0NPTVBfQ09NUDNfRVhUSV9ESVNBQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNCkgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRElTQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDUpID8gX19IQUxfQ09NUF9DT01QNV9FWFRJX0RJU0FCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA2KSA/IF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9ESVNBQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QN19FWFRJX0RJU0FCTEVfSVQoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0dFVF9GTEFHKF9fRkxBR19fKSAgICAgICAgICAgICAgICgoKF9fRkxBR19fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0dFVF9GTEFHKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZMQUdfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9HRVRfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19GTEFHX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMykgPyBfX0hBTF9DT01QX0NPTVAzX0VYVElfR0VUX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRkxBR19fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0dFVF9GTEFHKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZMQUdfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA1KSA/IF9fSEFMX0NPTVBfQ09NUDVfRVhUSV9HRVRfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19GTEFHX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNikgPyBfX0hBTF9DT01QX0NPTVA2X0VYVElfR0VUX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVA3X0VYVElfR0VUX0ZMQUcoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0NMRUFSX0ZMQUcoX19GTEFHX18pICAgICAgICAgICAgICgoKF9fRkxBR19fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0NMRUFSX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRkxBR19fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0NMRUFSX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRkxBR19fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDMpID8gX19IQUxfQ09NUF9DT01QM19FWFRJX0NMRUFSX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRkxBR19fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0NMRUFSX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRkxBR19fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDUpID8gX19IQUxfQ09NUF9DT01QNV9FWFRJX0NMRUFSX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRkxBR19fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDYpID8gX19IQUxfQ09NUF9DT01QNl9FWFRJX0NMRUFSX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVA3X0VYVElfQ0xFQVJfRkxBRygpKQorIyBlbmRpZgorIyBpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fGRlZmluZWQoU1RNMzJGMzc4eHgpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9SSVNJTkdfSVRfRU5BQkxFKF9fRVhUSUxJTkVfXykgICAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfUklTSU5HX0lUX0RJU0FCTEUoX19FWFRJTElORV9fKSAgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRkFMTElOR19JVF9FTkFCTEUoX19FWFRJTElORV9fKSAgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVAyX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRkFMTElOR19JVF9ESVNBQkxFKF9fRVhUSUxJTkVfXykgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9FTkFCTEVfSVQoX19FWFRJTElORV9fKSAgICAgICAgICAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9JVCgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRElTQUJMRV9JVChfX0VYVElMSU5FX18pICAgICAgICAgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0RJU0FCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9JVCgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfR0VUX0ZMQUcoX19GTEFHX18pICAgICAgICAgICAgICAgKCgoX19GTEFHX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfR0VUX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVAyX0VYVElfR0VUX0ZMQUcoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0NMRUFSX0ZMQUcoX19GTEFHX18pICAgICAgICAgICAgICgoKF9fRkxBR19fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0NMRUFSX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVAyX0VYVElfQ0xFQVJfRkxBRygpKQorIyBlbmRpZgorI2Vsc2UKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX1JJU0lOR19JVF9FTkFCTEUoX19FWFRJTElORV9fKSAgICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVAyX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9SSVNJTkdfSVRfRElTQUJMRShfX0VYVElMSU5FX18pICAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9GQUxMSU5HX0lUX0VOQUJMRShfX0VYVElMSU5FX18pICAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9GQUxMSU5HX0lUX0RJU0FCTEUoX19FWFRJTElORV9fKSAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0VOQUJMRV9JVChfX0VYVElMSU5FX18pICAgICAgICAgICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9FTkFCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVAyX0VYVElfRU5BQkxFX0lUKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9ESVNBQkxFX0lUKF9fRVhUSUxJTkVfXykgICAgICAgICAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRElTQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX0lUKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9HRVRfRkxBRyhfX0ZMQUdfXykgICAgICAgICAgICAgICAoKChfX0ZMQUdfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9HRVRfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9HRVRfRkxBRygpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfQ0xFQVJfRkxBRyhfX0ZMQUdfXykgICAgICAgICAgICAgKCgoX19GTEFHX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfQ0xFQVJfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9DTEVBUl9GTEFHKCkpCisjZW5kaWYKKworI2RlZmluZSBfX0hBTF9DT01QX0dFVF9FWFRJX0xJTkUgIENPTVBfR0VUX0VYVElfTElORQorCisjaWYgZGVmaW5lZChTVE0zMkwwKSB8fCBkZWZpbmVkKFNUTTMyTDQpCisvKiBOb3RlOiBPbiB0aGVzZSBTVE0zMiBmYW1pbGllcywgdGhlIG9ubHkgYXJndW1lbnQgb2YgdGhpcyBtYWNybyAgICAgICAgICAgICAqLworLyogICAgICAgaXMgQ09NUF9GTEFHX0xPQ0suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIFRoaXMgbWFjcm8gaXMgcmVwbGFjZWQgYnkgX19IQUxfQ09NUF9JU19MT0NLRUQgd2l0aCBvbmx5IEhBTCBoYW5kbGUgICovCisvKiAgICAgICBhcmd1bWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX0hBTF9DT01QX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgKF9fSEFMX0NPTVBfSVNfTE9DS0VEKF9fSEFORExFX18pKQorI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChTVE0zMkwwKSB8fCBkZWZpbmVkKFNUTTMyTDQpCisvKiogQGRlZmdyb3VwIEhBTF9DT01QX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBDT01QIEFsaWFzZWQgRnVuY3Rpb25zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX0NPTVBfU3RhcnRfSVQgICAgICAgSEFMX0NPTVBfU3RhcnQgLyogRnVuY3Rpb24gY29uc2lkZXJlZCBhcyBsZWdhY3kgYXMgRVhUSSBldmVudCBvciBJVCBjb25maWd1cmF0aW9uIGlzIGRvbmUgaW50byBIQUxfQ09NUF9Jbml0KCkgKi8KKyNkZWZpbmUgSEFMX0NPTVBfU3RvcF9JVCAgICAgICAgSEFMX0NPTVBfU3RvcCAgLyogRnVuY3Rpb24gY29uc2lkZXJlZCBhcyBsZWdhY3kgYXMgRVhUSSBldmVudCBvciBJVCBjb25maWd1cmF0aW9uIGlzIGRvbmUgaW50byBIQUxfQ09NUF9Jbml0KCkgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYKKworLyoqIEBkZWZncm91cCBIQUxfREFDX0FsaWFzZWRfTWFjcm9zIEhBTCBEQUMgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX0RBQ19XQVZFKFdBVkUpICgoKFdBVkUpID09IERBQ19XQVZFX05PTkUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChXQVZFKSA9PSBEQUNfV0FWRV9OT0lTRSl8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICgoV0FWRSkgPT0gREFDX1dBVkVfVFJJQU5HTEUpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9GTEFTSF9BbGlhc2VkX01hY3JvcyBIQUwgRkxBU0ggQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX1dSUEFSRUEgICAgICAgICAgSVNfT0JfV1JQQVJFQQorI2RlZmluZSBJU19UWVBFUFJPR1JBTSAgICAgIElTX0ZMQVNIX1RZUEVQUk9HUkFNCisjZGVmaW5lIElTX1RZUEVQUk9HUkFNRkxBU0ggSVNfRkxBU0hfVFlQRVBST0dSQU0KKyNkZWZpbmUgSVNfVFlQRUVSQVNFICAgICAgICBJU19GTEFTSF9UWVBFRVJBU0UKKyNkZWZpbmUgSVNfTkJTRUNUT1JTICAgICAgICBJU19GTEFTSF9OQlNFQ1RPUlMKKyNkZWZpbmUgSVNfT0JfV0RHX1NPVVJDRSAgICBJU19PQl9JV0RHX1NPVVJDRQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9JMkNfQWxpYXNlZF9NYWNyb3MgSEFMIEkyQyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgX19IQUxfSTJDX1JFU0VUX0NSMiAgICAgICAgICAgICBJMkNfUkVTRVRfQ1IyCisjZGVmaW5lIF9fSEFMX0kyQ19HRU5FUkFURV9TVEFSVCAgICAgICAgSTJDX0dFTkVSQVRFX1NUQVJUCisjaWYgZGVmaW5lZChTVE0zMkYxKQorI2RlZmluZSBfX0hBTF9JMkNfRlJFUV9SQU5HRSAgICAgICAgICAgIEkyQ19GUkVRUkFOR0UKKyNlbHNlCisjZGVmaW5lIF9fSEFMX0kyQ19GUkVRX1JBTkdFICAgICAgICAgICAgSTJDX0ZSRVFfUkFOR0UKKyNlbmRpZiAvKiBTVE0zMkYxICovCisjZGVmaW5lIF9fSEFMX0kyQ19SSVNFX1RJTUUgICAgICAgICAgICAgSTJDX1JJU0VfVElNRQorI2RlZmluZSBfX0hBTF9JMkNfU1BFRURfU1RBTkRBUkQgICAgICAgIEkyQ19TUEVFRF9TVEFOREFSRAorI2RlZmluZSBfX0hBTF9JMkNfU1BFRURfRkFTVCAgICAgICAgICAgIEkyQ19TUEVFRF9GQVNUCisjZGVmaW5lIF9fSEFMX0kyQ19TUEVFRCAgICAgICAgICAgICAgICAgSTJDX1NQRUVECisjZGVmaW5lIF9fSEFMX0kyQ183QklUX0FERF9XUklURSAgICAgICAgSTJDXzdCSVRfQUREX1dSSVRFCisjZGVmaW5lIF9fSEFMX0kyQ183QklUX0FERF9SRUFEICAgICAgICAgSTJDXzdCSVRfQUREX1JFQUQKKyNkZWZpbmUgX19IQUxfSTJDXzEwQklUX0FERFJFU1MgICAgICAgICBJMkNfMTBCSVRfQUREUkVTUworI2RlZmluZSBfX0hBTF9JMkNfMTBCSVRfSEVBREVSX1dSSVRFICAgIEkyQ18xMEJJVF9IRUFERVJfV1JJVEUKKyNkZWZpbmUgX19IQUxfSTJDXzEwQklUX0hFQURFUl9SRUFEICAgICBJMkNfMTBCSVRfSEVBREVSX1JFQUQKKyNkZWZpbmUgX19IQUxfSTJDX01FTV9BRERfTVNCICAgICAgICAgICBJMkNfTUVNX0FERF9NU0IKKyNkZWZpbmUgX19IQUxfSTJDX01FTV9BRERfTFNCICAgICAgICAgICBJMkNfTUVNX0FERF9MU0IKKyNkZWZpbmUgX19IQUxfSTJDX0ZSRVFSQU5HRSAgICAgICAgICAgICBJMkNfRlJFUVJBTkdFCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9JMlNfQWxpYXNlZF9NYWNyb3MgSEFMIEkyUyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfSTJTX0lOU1RBTkNFICAgICAgICAgICAgICAgICBJU19JMlNfQUxMX0lOU1RBTkNFCisjZGVmaW5lIElTX0kyU19JTlNUQU5DRV9FWFQgICAgICAgICAgICAgSVNfSTJTX0FMTF9JTlNUQU5DRV9FWFQKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfSVJEQV9BbGlhc2VkX01hY3JvcyBIQUwgSVJEQSBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgX19JUkRBX0RJU0FCTEUgICAgICAgICAgICAgICAgICBfX0hBTF9JUkRBX0RJU0FCTEUKKyNkZWZpbmUgX19JUkRBX0VOQUJMRSAgICAgICAgICAgICAgICAgICBfX0hBTF9JUkRBX0VOQUJMRQorCisjZGVmaW5lIF9fSEFMX0lSREFfR0VUQ0xPQ0tTT1VSQ0UgICAgICAgSVJEQV9HRVRDTE9DS1NPVVJDRQorI2RlZmluZSBfX0hBTF9JUkRBX01BU0tfQ09NUFVUQVRJT04gICAgIElSREFfTUFTS19DT01QVVRBVElPTgorI2RlZmluZSBfX0lSREFfR0VUQ0xPQ0tTT1VSQ0UgICAgICAgICAgIElSREFfR0VUQ0xPQ0tTT1VSQ0UKKyNkZWZpbmUgX19JUkRBX01BU0tfQ09NUFVUQVRJT04gICAgICAgICBJUkRBX01BU0tfQ09NUFVUQVRJT04KKworI2RlZmluZSBJU19JUkRBX09ORUJJVF9TQU1QTEUgICAgICAgICAgIElTX0lSREFfT05FX0JJVF9TQU1QTEUKKworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0lXREdfQWxpYXNlZF9NYWNyb3MgSEFMIElXREcgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9JV0RHX0VOQUJMRV9XUklURV9BQ0NFU1MgIElXREdfRU5BQkxFX1dSSVRFX0FDQ0VTUworI2RlZmluZSBfX0hBTF9JV0RHX0RJU0FCTEVfV1JJVEVfQUNDRVNTIElXREdfRElTQUJMRV9XUklURV9BQ0NFU1MKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBIQUxfTFBUSU1fQWxpYXNlZF9NYWNyb3MgSEFMIExQVElNIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBfX0hBTF9MUFRJTV9FTkFCTEVfSU5URVJSVVBUICAgIF9fSEFMX0xQVElNX0VOQUJMRV9JVAorI2RlZmluZSBfX0hBTF9MUFRJTV9ESVNBQkxFX0lOVEVSUlVQVCAgIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQKKyNkZWZpbmUgX19IQUxfTFBUSU1fR0VUX0lUU1RBVFVTICAgICAgICBfX0hBTF9MUFRJTV9HRVRfSVRfU09VUkNFCisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBIQUxfT1BBTVBfQWxpYXNlZF9NYWNyb3MgSEFMIE9QQU1QIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19PUEFNUF9DU1JfT1BBWFBEICAgICAgICAgICAgICAgIE9QQU1QX0NTUl9PUEFYUEQKKyNkZWZpbmUgX19PUEFNUF9DU1JfUzNTRUxYICAgICAgICAgICAgICAgIE9QQU1QX0NTUl9TM1NFTFgKKyNkZWZpbmUgX19PUEFNUF9DU1JfUzRTRUxYICAgICAgICAgICAgICAgIE9QQU1QX0NTUl9TNFNFTFgKKyNkZWZpbmUgX19PUEFNUF9DU1JfUzVTRUxYICAgICAgICAgICAgICAgIE9QQU1QX0NTUl9TNVNFTFgKKyNkZWZpbmUgX19PUEFNUF9DU1JfUzZTRUxYICAgICAgICAgICAgICAgIE9QQU1QX0NTUl9TNlNFTFgKKyNkZWZpbmUgX19PUEFNUF9DU1JfT1BBWENBTF9MICAgICAgICAgICAgIE9QQU1QX0NTUl9PUEFYQ0FMX0wKKyNkZWZpbmUgX19PUEFNUF9DU1JfT1BBWENBTF9IICAgICAgICAgICAgIE9QQU1QX0NTUl9PUEFYQ0FMX0gKKyNkZWZpbmUgX19PUEFNUF9DU1JfT1BBWExQTSAgICAgICAgICAgICAgIE9QQU1QX0NTUl9PUEFYTFBNCisjZGVmaW5lIF9fT1BBTVBfQ1NSX0FMTF9TV0lUQ0hFUyAgICAgICAgICBPUEFNUF9DU1JfQUxMX1NXSVRDSEVTCisjZGVmaW5lIF9fT1BBTVBfQ1NSX0FOQVdTRUxYICAgICAgICAgICAgICBPUEFNUF9DU1JfQU5BV1NFTFgKKyNkZWZpbmUgX19PUEFNUF9DU1JfT1BBWENBTE9VVCAgICAgICAgICAgIE9QQU1QX0NTUl9PUEFYQ0FMT1VUCisjZGVmaW5lIF9fT1BBTVBfT0ZGU0VUX1RSSU1fQklUU1BPU0lUSU9OICBPUEFNUF9PRkZTRVRfVFJJTV9CSVRTUE9TSVRJT04KKyNkZWZpbmUgX19PUEFNUF9PRkZTRVRfVFJJTV9TRVQgICAgICAgICAgIE9QQU1QX09GRlNFVF9UUklNX1NFVAorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1BXUl9BbGlhc2VkX01hY3JvcyBIQUwgUFdSIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFZEX0VWRU5UX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfRVZFTlQKKyNkZWZpbmUgX19IQUxfUFZEX0VWRU5UX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9FVkVOVAorI2RlZmluZSBfX0hBTF9QVkRfRVhUSV9GQUxMSU5HVFJJR0dFUl9ESVNBQkxFICAgICAgICAgICAgICAgICAgICBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfUFZEX0VYVElfRkFMTElOR1RSSUdHRVJfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfUFZEX0VYVElfUklTSU5HVFJJR0dFUl9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfUFZEX0VYVElfUklTSU5HVFJJR0dFUl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRQorI2RlZmluZSBfX0hBTF9QVk1fRVZFTlRfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9QV1JfUFZNX0VWRU5UX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUFZNX0VWRU5UX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUFdSX1BWTV9FVkVOVF9FTkFCTEUKKyNkZWZpbmUgX19IQUxfUFZNX0VYVElfRkFMTElOR1RSSUdHRVJfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgX19IQUxfUFdSX1BWTV9FWFRJX0ZBTExJTkdUUklHR0VSX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUFZNX0VYVElfRkFMTElOR1RSSUdHRVJfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgX19IQUxfUFdSX1BWTV9FWFRJX0ZBTExJTkdUUklHR0VSX0VOQUJMRQorI2RlZmluZSBfX0hBTF9QVk1fRVhUSV9SSVNJTkdUUklHR0VSX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICBfX0hBTF9QV1JfUFZNX0VYVElfUklTSU5HVFJJR0dFUl9ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1BWTV9FWFRJX1JJU0lOR1RSSUdHRVJfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1BXUl9QVk1fRVhUSV9SSVNJTkdUUklHR0VSX0VOQUJMRQorI2RlZmluZSBfX0hBTF9QV1JfSU5URVJOQUxXQUtFVVBfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUFdSRXhfRGlzYWJsZUludGVybmFsV2FrZVVwTGluZQorI2RlZmluZSBfX0hBTF9QV1JfSU5URVJOQUxXQUtFVVBfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUFdSRXhfRW5hYmxlSW50ZXJuYWxXYWtlVXBMaW5lCisjZGVmaW5lIF9fSEFMX1BXUl9QVUxMX1VQX0RPV05fQ09ORklHX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgIEhBTF9QV1JFeF9EaXNhYmxlUHVsbFVwUHVsbERvd25Db25maWcKKyNkZWZpbmUgX19IQUxfUFdSX1BVTExfVVBfRE9XTl9DT05GSUdfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgSEFMX1BXUkV4X0VuYWJsZVB1bGxVcFB1bGxEb3duQ29uZmlnCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9DTEVBUl9FR0RFX1RSSUdHRVIoKSAgICAgICAgICAgICAgICAgIGRvIHsgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKTtfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKTsgfSB3aGlsZSgwKQorI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfRVZFTlRfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9FVkVOVAorI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfRVZFTlRfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX0VWRU5UCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9GQUxMSU5HVFJJR0dFUl9ESVNBQkxFICAgICAgICAgICAgICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRQorI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfRkFMTElOR1RSSUdHRVJfRU5BQkxFICAgICAgICAgICAgICAgICBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRQorI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfUklTSU5HVFJJR0dFUl9ESVNBQkxFICAgICAgICAgICAgICAgICBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRQorI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfUklTSU5HVFJJR0dFUl9FTkFCTEUgICAgICAgICAgICAgICAgICBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX1JJU0lOR19FREdFCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9TRVRfRkFMTElOR19FR0RFX1RSSUdHRVIgICAgICAgICAgICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9TRVRfUklTSU5HX0VER0VfVFJJR0dFUiAgICAgICAgICAgICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfUFdSX1BWTV9ESVNBQkxFKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8geyBIQUxfUFdSRXhfRGlzYWJsZVBWTTEoKTtIQUxfUFdSRXhfRGlzYWJsZVBWTTIoKTtIQUxfUFdSRXhfRGlzYWJsZVBWTTMoKTtIQUxfUFdSRXhfRGlzYWJsZVBWTTQoKTsgfSB3aGlsZSgwKQorI2RlZmluZSBfX0hBTF9QV1JfUFZNX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7IEhBTF9QV1JFeF9FbmFibGVQVk0xKCk7SEFMX1BXUkV4X0VuYWJsZVBWTTIoKTtIQUxfUFdSRXhfRW5hYmxlUFZNMygpO0hBTF9QV1JFeF9FbmFibGVQVk00KCk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgX19IQUxfUFdSX1NSQU0yQ09OVEVOVF9QUkVTRVJWRV9ESVNBQkxFICAgICAgICAgICAgICAgICAgSEFMX1BXUkV4X0Rpc2FibGVTUkFNMkNvbnRlbnRSZXRlbnRpb24KKyNkZWZpbmUgX19IQUxfUFdSX1NSQU0yQ09OVEVOVF9QUkVTRVJWRV9FTkFCTEUgICAgICAgICAgICAgICAgICAgSEFMX1BXUkV4X0VuYWJsZVNSQU0yQ29udGVudFJldGVudGlvbgorI2RlZmluZSBfX0hBTF9QV1JfVkRESU8yX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUFdSRXhfRGlzYWJsZVZkZElPMgorI2RlZmluZSBfX0hBTF9QV1JfVkRESU8yX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUFdSRXhfRW5hYmxlVmRkSU8yCisjZGVmaW5lIF9fSEFMX1BXUl9WRERJTzJfRVhUSV9DTEVBUl9FR0RFX1RSSUdHRVIgICAgICAgICAgICAgICAgIF9fSEFMX1BXUl9WRERJTzJfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRQorI2RlZmluZSBfX0hBTF9QV1JfVkRESU8yX0VYVElfU0VUX0ZBTExJTkdfRUdERV9UUklHR0VSICAgICAgICAgICBfX0hBTF9QV1JfVkRESU8yX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRQorI2RlZmluZSBfX0hBTF9QV1JfVkREVVNCX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUFdSRXhfRGlzYWJsZVZkZFVTQgorI2RlZmluZSBfX0hBTF9QV1JfVkREVVNCX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUFdSRXhfRW5hYmxlVmRkVVNCCisKKyNpZiBkZWZpbmVkIChTVE0zMkY0KQorI2RlZmluZSBfX0hBTF9QVkRfRVhUSV9FTkFCTEVfSVQoUFdSX0VYVElfTElORV9QVkQpICAgICAgICAgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9JVCgpCisjZGVmaW5lIF9fSEFMX1BWRF9FWFRJX0RJU0FCTEVfSVQoUFdSX0VYVElfTElORV9QVkQpICAgICAgICBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9JVCgpCisjZGVmaW5lIF9fSEFMX1BWRF9FWFRJX0dFVF9GTEFHKFBXUl9FWFRJX0xJTkVfUFZEKSAgICAgICAgICBfX0hBTF9QV1JfUFZEX0VYVElfR0VUX0ZMQUcoKQorI2RlZmluZSBfX0hBTF9QVkRfRVhUSV9DTEVBUl9GTEFHKFBXUl9FWFRJX0xJTkVfUFZEKSAgICAgICAgX19IQUxfUFdSX1BWRF9FWFRJX0NMRUFSX0ZMQUcoKQorI2RlZmluZSBfX0hBTF9QVkRfRVhUSV9HRU5FUkFURV9TV0lUKFBXUl9FWFRJX0xJTkVfUFZEKSAgICAgX19IQUxfUFdSX1BWRF9FWFRJX0dFTkVSQVRFX1NXSVQoKQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfUFZEX0VYVElfQ0xFQVJfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUFdSX1BWRF9FWFRJX0NMRUFSX0ZMQUcKKyNkZWZpbmUgX19IQUxfUFZEX0VYVElfRElTQUJMRV9JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfSVQKKyNkZWZpbmUgX19IQUxfUFZEX0VYVElfRU5BQkxFX0lUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9JVAorI2RlZmluZSBfX0hBTF9QVkRfRVhUSV9HRU5FUkFURV9TV0lUICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9QV1JfUFZEX0VYVElfR0VORVJBVEVfU1dJVAorI2RlZmluZSBfX0hBTF9QVkRfRVhUSV9HRVRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9QV1JfUFZEX0VYVElfR0VUX0ZMQUcKKyNlbmRpZiAvKiBTVE0zMkY0ICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1JDQ19BbGlhc2VkIEhBTCBSQ0MgQWxpYXNlZCBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgUkNDX1N0b3BXYWtlVXBDbG9ja19NU0kgICAgIFJDQ19TVE9QX1dBS0VVUENMT0NLX01TSQorI2RlZmluZSBSQ0NfU3RvcFdha2VVcENsb2NrX0hTSSAgICAgUkNDX1NUT1BfV0FLRVVQQ0xPQ0tfSFNJCisKKyNkZWZpbmUgSEFMX1JDQ19DQ1NDYWxsYmFjayBIQUxfUkNDX0NTU0NhbGxiYWNrCisjZGVmaW5lIEhBTF9SQzQ4X0VuYWJsZUJ1ZmZlcl9DbWQoY21kKSAoKChjbWQpPT1FTkFCTEUpID8gSEFMX1JDQ0V4X0VuYWJsZUhTSTQ4X1ZSRUZJTlQoKSA6IEhBTF9SQ0NFeF9EaXNhYmxlSFNJNDhfVlJFRklOVCgpKQorCisjZGVmaW5lIF9fQURDX0NMS19ESVNBQkxFICAgICAgICAgIF9fSEFMX1JDQ19BRENfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19BRENfQ0xLX0VOQUJMRSAgICAgICAgICAgX19IQUxfUkNDX0FEQ19DTEtfRU5BQkxFCisjZGVmaW5lIF9fQURDX0NMS19TTEVFUF9ESVNBQkxFICAgIF9fSEFMX1JDQ19BRENfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19BRENfQ0xLX1NMRUVQX0VOQUJMRSAgICAgX19IQUxfUkNDX0FEQ19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fQURDX0ZPUkNFX1JFU0VUICAgICAgICAgIF9fSEFMX1JDQ19BRENfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19BRENfUkVMRUFTRV9SRVNFVCAgICAgICAgX19IQUxfUkNDX0FEQ19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQURDMV9DTEtfRElTQUJMRSAgICAgICAgIF9fSEFMX1JDQ19BREMxX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fQURDMV9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19BREMxX0NMS19FTkFCTEUKKyNkZWZpbmUgX19BREMxX0ZPUkNFX1JFU0VUICAgICAgICAgX19IQUxfUkNDX0FEQzFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19BREMxX1JFTEVBU0VfUkVTRVQgICAgICAgX19IQUxfUkNDX0FEQzFfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0FEQzFfQ0xLX1NMRUVQX0VOQUJMRSAgICBfX0hBTF9SQ0NfQURDMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fQURDMV9DTEtfU0xFRVBfRElTQUJMRSAgIF9fSEFMX1JDQ19BREMxX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fQURDMl9DTEtfRElTQUJMRSAgICAgICAgIF9fSEFMX1JDQ19BREMyX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fQURDMl9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19BREMyX0NMS19FTkFCTEUKKyNkZWZpbmUgX19BREMyX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BREMyX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQURDMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19BREMyX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19BREMzX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19BREMzX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fQURDM19DTEtfRU5BQkxFIF9fSEFMX1JDQ19BREMzX0NMS19FTkFCTEUKKyNkZWZpbmUgX19BREMzX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BREMzX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQURDM19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19BREMzX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19BRVNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0FFU19DTEtfRElTQUJMRQorI2RlZmluZSBfX0FFU19DTEtfRU5BQkxFIF9fSEFMX1JDQ19BRVNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0FFU19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfQUVTX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fQUVTX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0FFU19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fQUVTX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BRVNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19BRVNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQUVTX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19DUllQX0NMS19TTEVFUF9FTkFCTEUgICAgICBfX0hBTF9SQ0NfQ1JZUF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fQ1JZUF9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX0NSWVBfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19DUllQX0NMS19FTkFCTEUgIF9fSEFMX1JDQ19DUllQX0NMS19FTkFCTEUKKyNkZWZpbmUgX19DUllQX0NMS19ESVNBQkxFICBfX0hBTF9SQ0NfQ1JZUF9DTEtfRElTQUJMRQorI2RlZmluZSBfX0NSWVBfRk9SQ0VfUkVTRVQgICAgICAgX19IQUxfUkNDX0NSWVBfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19DUllQX1JFTEVBU0VfUkVTRVQgIF9fSEFMX1JDQ19DUllQX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19BRklPX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19BRklPX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fQUZJT19DTEtfRU5BQkxFIF9fSEFMX1JDQ19BRklPX0NMS19FTkFCTEUKKyNkZWZpbmUgX19BRklPX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BRklPX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQUZJT19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19BRklPX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19BSEJfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0FIQl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0FIQl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19BSEJfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0FIQjFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0FIQjFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19BSEIxX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0FIQjFfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0FIQjJfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0FIQjJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19BSEIyX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0FIQjJfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0FIQjNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0FIQjNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19BSEIzX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0FIQjNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0FQQjFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0FQQjFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19BUEIxX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0FQQjFfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0FQQjJfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0FQQjJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19BUEIyX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0FQQjJfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0JLUF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQktQX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fQktQX0NMS19FTkFCTEUgX19IQUxfUkNDX0JLUF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fQktQX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19CS1BfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19CS1BfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQktQX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19DQU4xX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19DQU4xX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fQ0FOMV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19DQU4xX0NMS19FTkFCTEUKKyNkZWZpbmUgX19DQU4xX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19DQU4xX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fQ0FOMV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19DQU4xX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19DQU4xX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19DQU4xX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQ0FOMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19DQU4xX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19DQU5fQ0xLX0RJU0FCTEUgICAgICAgICBfX0hBTF9SQ0NfQ0FOMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX0NBTl9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19DQU4xX0NMS19FTkFCTEUKKyNkZWZpbmUgX19DQU5fRk9SQ0VfUkVTRVQgICAgICAgICBfX0hBTF9SQ0NfQ0FOMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0NBTl9SRUxFQVNFX1JFU0VUICAgICAgIF9fSEFMX1JDQ19DQU4xX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19DQU4yX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19DQU4yX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fQ0FOMl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19DQU4yX0NMS19FTkFCTEUKKyNkZWZpbmUgX19DQU4yX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19DQU4yX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQ0FOMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19DQU4yX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19DRUNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0NFQ19DTEtfRElTQUJMRQorI2RlZmluZSBfX0NFQ19DTEtfRU5BQkxFIF9fSEFMX1JDQ19DRUNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0NPTVBfQ0xLX0RJU0FCTEUgICAgICAgIF9fSEFMX1JDQ19DT01QX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fQ09NUF9DTEtfRU5BQkxFICAgICAgICAgX19IQUxfUkNDX0NPTVBfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0NPTVBfRk9SQ0VfUkVTRVQgICAgICAgIF9fSEFMX1JDQ19DT01QX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQ09NUF9SRUxFQVNFX1JFU0VUICAgICAgX19IQUxfUkNDX0NPTVBfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0NPTVBfQ0xLX1NMRUVQX0VOQUJMRSAgIF9fSEFMX1JDQ19DT01QX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19DT01QX0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfQ09NUF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0NFQ19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQ0VDX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQ0VDX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0NFQ19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQ1JDX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19DUkNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19DUkNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQ1JDX0NMS19FTkFCTEUKKyNkZWZpbmUgX19DUkNfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0NSQ19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0NSQ19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19DUkNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0NSQ19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQ1JDX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQ1JDX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0NSQ19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fREFDX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19EQUNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19EQUNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfREFDX0NMS19FTkFCTEUKKyNkZWZpbmUgX19EQUNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0RBQ19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0RBQ19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19EQUNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0RBQzFfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0RBQzFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19EQUMxX0NMS19FTkFCTEUgX19IQUxfUkNDX0RBQzFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0RBQzFfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0RBQzFfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19EQUMxX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0RBQzFfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0RBQzFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0RBQzFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19EQUMxX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0RBQzFfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0RCR01DVV9DTEtfRU5BQkxFICAgICBfX0hBTF9SQ0NfREJHTUNVX0NMS19FTkFCTEUKKyNkZWZpbmUgX19EQkdNQ1VfQ0xLX0RJU0FCTEUgICAgIF9fSEFMX1JDQ19EQkdNQ1VfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19EQkdNQ1VfRk9SQ0VfUkVTRVQgICAgX19IQUxfUkNDX0RCR01DVV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0RCR01DVV9SRUxFQVNFX1JFU0VUICBfX0hBTF9SQ0NfREJHTUNVX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19ERlNETV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfREZTRE1fQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19ERlNETV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19ERlNETV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fREZTRE1fQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0RGU0RNX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fREZTRE1fQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfREZTRE1fQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0RGU0RNX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19ERlNETV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0RGU0RNX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0RGU0RNX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19ETUExX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19ETUExX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fRE1BMV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19ETUExX0NMS19FTkFCTEUKKyNkZWZpbmUgX19ETUExX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19ETUExX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fRE1BMV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19ETUExX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19ETUExX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19ETUExX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fRE1BMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19ETUExX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19ETUEyX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19ETUEyX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fRE1BMl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19ETUEyX0NMS19FTkFCTEUKKyNkZWZpbmUgX19ETUEyX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19ETUEyX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fRE1BMl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19ETUEyX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19ETUEyX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19ETUEyX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fRE1BMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19ETUEyX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19FVEhNQUNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0VUSE1BQ19DTEtfRElTQUJMRQorI2RlZmluZSBfX0VUSE1BQ19DTEtfRU5BQkxFIF9fSEFMX1JDQ19FVEhNQUNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0VUSE1BQ19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfRVRITUFDX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fRVRITUFDX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0VUSE1BQ19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fRVRITUFDUlhfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0VUSE1BQ1JYX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fRVRITUFDUlhfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfRVRITUFDUlhfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0VUSE1BQ1RYX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19FVEhNQUNUWF9DTEtfRElTQUJMRQorI2RlZmluZSBfX0VUSE1BQ1RYX0NMS19FTkFCTEUgX19IQUxfUkNDX0VUSE1BQ1RYX0NMS19FTkFCTEUKKyNkZWZpbmUgX19GSVJFV0FMTF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfRklSRVdBTExfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19GSVJFV0FMTF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19GSVJFV0FMTF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fRkxBU0hfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0ZMQVNIX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fRkxBU0hfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfRkxBU0hfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0ZMQVNIX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19GTEFTSF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0ZMQVNIX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0ZMQVNIX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19GTEFTSF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfRkxBU0hfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19GTEFTSF9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19GTEFTSF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fRkxJVEZfQ0xLX0RJU0FCTEUgICAgICAgX19IQUxfUkNDX0ZMSVRGX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fRkxJVEZfQ0xLX0VOQUJMRSAgICAgICAgX19IQUxfUkNDX0ZMSVRGX0NMS19FTkFCTEUKKyNkZWZpbmUgX19GTElURl9GT1JDRV9SRVNFVCAgICAgICBfX0hBTF9SQ0NfRkxJVEZfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19GTElURl9SRUxFQVNFX1JFU0VUICAgICBfX0hBTF9SQ0NfRkxJVEZfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0ZMSVRGX0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19GTElURl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fRkxJVEZfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0ZMSVRGX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fRk1DX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19GTUNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19GTUNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfRk1DX0NMS19FTkFCTEUKKyNkZWZpbmUgX19GTUNfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0ZNQ19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0ZNQ19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19GTUNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0ZNQ19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfRk1DX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fRk1DX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0ZNQ19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fRlNNQ19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfRlNNQ19DTEtfRElTQUJMRQorI2RlZmluZSBfX0ZTTUNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfRlNNQ19DTEtfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0FfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9BX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0FfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfR1BJT0FfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0dQSU9BX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19HUElPQV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0dQSU9BX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0dQSU9BX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19HUElPQV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0FfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19HUElPQV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19HUElPQV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0JfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9CX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0JfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfR1BJT0JfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0dQSU9CX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19HUElPQl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0dQSU9CX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0dQSU9CX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19HUElPQl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0JfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19HUElPQl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19HUElPQl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0NfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9DX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0NfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfR1BJT0NfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0dQSU9DX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19HUElPQ19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0dQSU9DX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0dQSU9DX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19HUElPQ19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0NfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19HUElPQ19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19HUElPQ19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0RfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9EX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0RfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfR1BJT0RfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0dQSU9EX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19HUElPRF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0dQSU9EX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0dQSU9EX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19HUElPRF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0RfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19HUElPRF9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19HUElPRF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0VfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9FX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0VfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfR1BJT0VfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0dQSU9FX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19HUElPRV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0dQSU9FX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0dQSU9FX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19HUElPRV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0VfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19HUElPRV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19HUElPRV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0ZfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9GX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0ZfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfR1BJT0ZfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0dQSU9GX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19HUElPRl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0dQSU9GX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0dQSU9GX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19HUElPRl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0ZfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19HUElPRl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19HUElPRl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0dfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9HX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0dfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfR1BJT0dfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0dQSU9HX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19HUElPR19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0dQSU9HX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0dQSU9HX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19HUElPR19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0dfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19HUElPR19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19HUElPR19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0hfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9IX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0hfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfR1BJT0hfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0dQSU9IX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19HUElPSF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0dQSU9IX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0dQSU9IX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19HUElPSF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0hfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19HUElPSF9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19HUElPSF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fSTJDMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfSTJDMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX0kyQzFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfSTJDMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fSTJDMV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfSTJDMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0kyQzFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfSTJDMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fSTJDMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfSTJDMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0kyQzFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfSTJDMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fSTJDMl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfSTJDMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX0kyQzJfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfSTJDMl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fSTJDMl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfSTJDMl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0kyQzJfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfSTJDMl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fSTJDMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfSTJDMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0kyQzJfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfSTJDMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fSTJDM19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfSTJDM19DTEtfRElTQUJMRQorI2RlZmluZSBfX0kyQzNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfSTJDM19DTEtfRU5BQkxFCisjZGVmaW5lIF9fSTJDM19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfSTJDM19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0kyQzNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfSTJDM19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fSTJDM19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfSTJDM19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0kyQzNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfSTJDM19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fTENEX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19MQ0RfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19MQ0RfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfTENEX0NMS19FTkFCTEUKKyNkZWZpbmUgX19MQ0RfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0xDRF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0xDRF9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19MQ0RfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0xDRF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfTENEX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fTENEX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0xDRF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fTFBUSU0xX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19MUFRJTTFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19MUFRJTTFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfTFBUSU0xX0NMS19FTkFCTEUKKyNkZWZpbmUgX19MUFRJTTFfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0xQVElNMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0xQVElNMV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19MUFRJTTFfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0xQVElNMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfTFBUSU0xX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fTFBUSU0xX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0xQVElNMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fTFBUSU0yX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19MUFRJTTJfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19MUFRJTTJfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfTFBUSU0yX0NMS19FTkFCTEUKKyNkZWZpbmUgX19MUFRJTTJfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0xQVElNMl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0xQVElNMl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19MUFRJTTJfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0xQVElNMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfTFBUSU0yX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fTFBUSU0yX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0xQVElNMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fTFBVQVJUMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfTFBVQVJUMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX0xQVUFSVDFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfTFBVQVJUMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fTFBVQVJUMV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfTFBVQVJUMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0xQVUFSVDFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfTFBVQVJUMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fTFBVQVJUMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfTFBVQVJUMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0xQVUFSVDFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfTFBVQVJUMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fT1BBTVBfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX09QQU1QX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fT1BBTVBfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfT1BBTVBfQ0xLX0VOQUJMRQorI2RlZmluZSBfX09QQU1QX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19PUEFNUF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX09QQU1QX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX09QQU1QX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19PUEFNUF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfT1BBTVBfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19PUEFNUF9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19PUEFNUF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fT1RHRlNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX09UR0ZTX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fT1RHRlNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfT1RHRlNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX09UR0ZTX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19PVEdGU19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX09UR0ZTX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX09UR0ZTX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19PVEdGU19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfT1RHRlNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19PVEdGU19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19PVEdGU19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fUFdSX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19QV1JfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19QV1JfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfUFdSX0NMS19FTkFCTEUKKyNkZWZpbmUgX19QV1JfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1BXUl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1BXUl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19QV1JfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1BXUl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfUFdSX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fUFdSX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1BXUl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fUVNQSV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfUVNQSV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1FTUElfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfUVNQSV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fUVNQSV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfUVNQSV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1FTUElfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfUVNQSV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fUVNQSV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfUVNQSV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1FTUElfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfUVNQSV9SRUxFQVNFX1JFU0VUCisKKyNpZiBkZWZpbmVkKFNUTTMyV0IpCisjZGVmaW5lIF9fSEFMX1JDQ19RU1BJX0NMS19ESVNBQkxFICAgICAgICAgICAgX19IQUxfUkNDX1FVQURTUElfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX1FTUElfQ0xLX0VOQUJMRSAgICAgICAgICAgICBfX0hBTF9SQ0NfUVVBRFNQSV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19RU1BJX0NMS19TTEVFUF9ESVNBQkxFICAgICAgX19IQUxfUkNDX1FVQURTUElfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX1FTUElfQ0xLX1NMRUVQX0VOQUJMRSAgICAgICBfX0hBTF9SQ0NfUVVBRFNQSV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19RU1BJX0ZPUkNFX1JFU0VUICAgICAgICAgICAgX19IQUxfUkNDX1FVQURTUElfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX1FTUElfUkVMRUFTRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfUVVBRFNQSV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fSEFMX1JDQ19RU1BJX0lTX0NMS19FTkFCTEVEICAgICAgICAgX19IQUxfUkNDX1FVQURTUElfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19IQUxfUkNDX1FTUElfSVNfQ0xLX0RJU0FCTEVEICAgICAgICBfX0hBTF9SQ0NfUVVBRFNQSV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19IQUxfUkNDX1FTUElfSVNfQ0xLX1NMRUVQX0VOQUJMRUQgICBfX0hBTF9SQ0NfUVVBRFNQSV9JU19DTEtfU0xFRVBfRU5BQkxFRAorI2RlZmluZSBfX0hBTF9SQ0NfUVNQSV9JU19DTEtfU0xFRVBfRElTQUJMRUQgIF9fSEFMX1JDQ19RVUFEU1BJX0lTX0NMS19TTEVFUF9ESVNBQkxFRAorI2RlZmluZSBRU1BJX0lSUUhhbmRsZXIgUVVBRFNQSV9JUlFIYW5kbGVyCisjZW5kaWYgLyogX19IQUxfUkNDX1FVQURTUElfQ0xLX0VOQUJMRSAqLworCisjZGVmaW5lIF9fUk5HX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19STkdfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19STkdfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfUk5HX0NMS19FTkFCTEUKKyNkZWZpbmUgX19STkdfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1JOR19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1JOR19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19STkdfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1JOR19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfUk5HX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fUk5HX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1JOR19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fU0FJMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU0FJMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NBSTFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfU0FJMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fU0FJMV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfU0FJMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1NBSTFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfU0FJMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fU0FJMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfU0FJMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1NBSTFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfU0FJMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fU0FJMl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU0FJMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NBSTJfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfU0FJMl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fU0FJMl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfU0FJMl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1NBSTJfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfU0FJMl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fU0FJMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfU0FJMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1NBSTJfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfU0FJMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fU0RJT19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU0RJT19DTEtfRElTQUJMRQorI2RlZmluZSBfX1NESU9fQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfU0RJT19DTEtfRU5BQkxFCisjZGVmaW5lIF9fU0RNTUNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1NETU1DX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fU0RNTUNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfU0RNTUNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1NETU1DX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19TRE1NQ19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1NETU1DX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1NETU1DX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19TRE1NQ19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfU0RNTUNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19TRE1NQ19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19TRE1NQ19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fU1BJMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU1BJMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NQSTFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfU1BJMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fU1BJMV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfU1BJMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1NQSTFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfU1BJMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fU1BJMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfU1BJMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1NQSTFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfU1BJMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fU1BJMl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU1BJMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NQSTJfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfU1BJMl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fU1BJMl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfU1BJMl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1NQSTJfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfU1BJMl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fU1BJMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfU1BJMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1NQSTJfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfU1BJMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fU1BJM19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU1BJM19DTEtfRElTQUJMRQorI2RlZmluZSBfX1NQSTNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfU1BJM19DTEtfRU5BQkxFCisjZGVmaW5lIF9fU1BJM19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfU1BJM19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1NQSTNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfU1BJM19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fU1BJM19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfU1BJM19GT1JDRV9SRVNFVAorI2RlZmluZSBfX1NQSTNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfU1BJM19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fU1JBTV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU1JBTV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NSQU1fQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfU1JBTV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fU1JBTTFfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NSQU0xX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fU1JBTTFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfU1JBTTFfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1NSQU0yX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19TUkFNMl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1NSQU0yX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1NSQU0yX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19TV1BNSTFfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1NXUE1JMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NXUE1JMV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19TV1BNSTFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1NXUE1JMV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfU1dQTUkxX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fU1dQTUkxX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1NXUE1JMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fU1dQTUkxX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19TV1BNSTFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19TV1BNSTFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfU1dQTUkxX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19TWVNDRkdfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1NZU0NGR19DTEtfRElTQUJMRQorI2RlZmluZSBfX1NZU0NGR19DTEtfRU5BQkxFIF9fSEFMX1JDQ19TWVNDRkdfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1NZU0NGR19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfU1lTQ0ZHX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fU1lTQ0ZHX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1NZU0NGR19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fU1lTQ0ZHX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19TWVNDRkdfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19TWVNDRkdfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfU1lTQ0ZHX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19USU0xX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0xX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNMV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0xX0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU0xX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19USU0xX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVElNMV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19USU0xX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU0xX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU0xX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0xX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19USU0xMF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNMTBfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xMF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0xMF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMTBfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTEwX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTBfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTBfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTExX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0xMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTExX0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTExX0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU0xMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU0xMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0xMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTJfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTEyX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNMTJfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNMTJfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTEyX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU0xMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTEyX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTTEyX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19USU0xM19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNMTNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xM19DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0xM19DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMTNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTEzX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTE0X0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0xNF9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTE0X0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTE0X0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU0xNF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTRfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU0xNF9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0xNF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTVfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTE1X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNMTVfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNMTVfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTE1X0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19USU0xNV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTE1X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTE1X0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU0xNV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTVfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU0xNV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0xNV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTZfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTE2X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNMTZfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNMTZfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTE2X0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19USU0xNl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTE2X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTE2X0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU0xNl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTZfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU0xNl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0xNl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTdfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTE3X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNMTdfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNMTdfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTE3X0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19USU0xN19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTE3X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTE3X0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU0xN19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTdfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU0xN19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0xN19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTJfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNMl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNMl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTJfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVElNMl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTJfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNM19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNM19DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNM19DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNM19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNM19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVElNM19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNM19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNM19GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNM19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNNF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNNF9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTRfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNNF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNNF9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNNF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTRfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVElNNF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNNF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNNF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTRfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNNF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNNV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNNV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTVfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNNV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNNV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNNV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTVfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVElNNV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNNV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNNV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTVfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNNV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNNl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNNl9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTZfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNNl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNNl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNNl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTZfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVElNNl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNNl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNNl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTZfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNNl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNN19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNN19DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTdfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNN19DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNN19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNN19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTdfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVElNN19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNN19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNN19GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTdfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNN19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNOF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNOF9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTThfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNOF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNOF9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNOF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTThfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVElNOF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNOF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNOF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTThfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNOF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNOV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNOV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTlfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNOV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNOV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNOV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTlfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNOV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVFNDX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19UU0NfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19UU0NfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVFNDX0NMS19FTkFCTEUKKyNkZWZpbmUgX19UU0NfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1RTQ19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RTQ19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19UU0NfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RTQ19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVFNDX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVFNDX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RTQ19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVUFSVDRfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1VBUlQ0X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVUFSVDRfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVUFSVDRfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1VBUlQ0X0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19VQVJUNF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1VBUlQ0X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1VBUlQ0X0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19VQVJUNF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVUFSVDRfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VQVJUNF9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19VQVJUNF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVUFSVDVfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1VBUlQ1X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVUFSVDVfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVUFSVDVfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1VBUlQ1X0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19VQVJUNV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1VBUlQ1X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1VBUlQ1X0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19VQVJUNV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVUFSVDVfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VQVJUNV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19VQVJUNV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVVNBUlQxX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19VU0FSVDFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVVNBUlQxX0NMS19FTkFCTEUKKyNkZWZpbmUgX19VU0FSVDFfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1VTQVJUMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1VTQVJUMV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19VU0FSVDFfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1VTQVJUMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVVNBUlQxX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVVNBUlQxX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1VTQVJUMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVVNBUlQyX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19VU0FSVDJfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDJfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVVNBUlQyX0NMS19FTkFCTEUKKyNkZWZpbmUgX19VU0FSVDJfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1VTQVJUMl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1VTQVJUMl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19VU0FSVDJfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1VTQVJUMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVVNBUlQyX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVVNBUlQyX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1VTQVJUMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVVNBUlQzX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19VU0FSVDNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVVNBUlQzX0NMS19FTkFCTEUKKyNkZWZpbmUgX19VU0FSVDNfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1VTQVJUM19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1VTQVJUM19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19VU0FSVDNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1VTQVJUM19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVVNBUlQzX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVVNBUlQzX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1VTQVJUM19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVVNBUlQ0X0NMS19ESVNBQkxFICAgICAgICBfX0hBTF9SQ0NfVUFSVDRfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDRfQ0xLX0VOQUJMRSAgICAgICAgIF9fSEFMX1JDQ19VQVJUNF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVVNBUlQ0X0NMS19TTEVFUF9FTkFCTEUgICBfX0hBTF9SQ0NfVUFSVDRfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1VTQVJUNF9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1VBUlQ0X0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVVNBUlQ0X0ZPUkNFX1JFU0VUICAgICAgICBfX0hBTF9SQ0NfVUFSVDRfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VU0FSVDRfUkVMRUFTRV9SRVNFVCAgICAgIF9fSEFMX1JDQ19VQVJUNF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVVNBUlQ1X0NMS19ESVNBQkxFICAgICAgICBfX0hBTF9SQ0NfVUFSVDVfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDVfQ0xLX0VOQUJMRSAgICAgICAgIF9fSEFMX1JDQ19VQVJUNV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVVNBUlQ1X0NMS19TTEVFUF9FTkFCTEUgICBfX0hBTF9SQ0NfVUFSVDVfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1VTQVJUNV9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1VBUlQ1X0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVVNBUlQ1X0ZPUkNFX1JFU0VUICAgICAgICBfX0hBTF9SQ0NfVUFSVDVfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VU0FSVDVfUkVMRUFTRV9SRVNFVCAgICAgIF9fSEFMX1JDQ19VQVJUNV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVVNBUlQ3X0NMS19ESVNBQkxFICAgICAgICBfX0hBTF9SQ0NfVUFSVDdfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDdfQ0xLX0VOQUJMRSAgICAgICAgIF9fSEFMX1JDQ19VQVJUN19DTEtfRU5BQkxFCisjZGVmaW5lIF9fVVNBUlQ3X0ZPUkNFX1JFU0VUICAgICAgICBfX0hBTF9SQ0NfVUFSVDdfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VU0FSVDdfUkVMRUFTRV9SRVNFVCAgICAgIF9fSEFMX1JDQ19VQVJUN19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVVNBUlQ4X0NMS19ESVNBQkxFICAgICAgICBfX0hBTF9SQ0NfVUFSVDhfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDhfQ0xLX0VOQUJMRSAgICAgICAgIF9fSEFMX1JDQ19VQVJUOF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVVNBUlQ4X0ZPUkNFX1JFU0VUICAgICAgICBfX0hBTF9SQ0NfVUFSVDhfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VU0FSVDhfUkVMRUFTRV9SRVNFVCAgICAgIF9fSEFMX1JDQ19VQVJUOF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVVNCX0NMS19ESVNBQkxFICAgICAgICAgX19IQUxfUkNDX1VTQl9DTEtfRElTQUJMRQorI2RlZmluZSBfX1VTQl9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19VU0JfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1VTQl9GT1JDRV9SRVNFVCAgICAgICAgIF9fSEFMX1JDQ19VU0JfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VU0JfQ0xLX1NMRUVQX0VOQUJMRSAgICBfX0hBTF9SQ0NfVVNCX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19VU0JfQ0xLX1NMRUVQX0RJU0FCTEUgICBfX0hBTF9SQ0NfVVNCX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVVNCX09UR19GU19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVVNCX09UR19GU19DTEtfRElTQUJMRQorI2RlZmluZSBfX1VTQl9PVEdfRlNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVVNCX09UR19GU19DTEtfRU5BQkxFCisjZGVmaW5lIF9fVVNCX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1VTQl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fV1dER19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfV1dER19DTEtfRElTQUJMRQorI2RlZmluZSBfX1dXREdfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfV1dER19DTEtfRU5BQkxFCisjZGVmaW5lIF9fV1dER19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfV1dER19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1dXREdfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfV1dER19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fV1dER19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfV1dER19GT1JDRV9SRVNFVAorI2RlZmluZSBfX1dXREdfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfV1dER19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMjFfQ0xLX0VOQUJMRSAgIF9fSEFMX1JDQ19USU0yMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMjFfQ0xLX0RJU0FCTEUgICBfX0hBTF9SQ0NfVElNMjFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0yMV9GT1JDRV9SRVNFVCAgIF9fSEFMX1JDQ19USU0yMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTIxX1JFTEVBU0VfUkVTRVQgIF9fSEFMX1JDQ19USU0yMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMjFfQ0xLX1NMRUVQX0VOQUJMRSAgIF9fSEFMX1JDQ19USU0yMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNMjFfQ0xLX1NMRUVQX0RJU0FCTEUgICBfX0hBTF9SQ0NfVElNMjFfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU0yMl9DTEtfRU5BQkxFICAgX19IQUxfUkNDX1RJTTIyX0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU0yMl9DTEtfRElTQUJMRSAgIF9fSEFMX1JDQ19USU0yMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTIyX0ZPUkNFX1JFU0VUICAgX19IQUxfUkNDX1RJTTIyX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMjJfUkVMRUFTRV9SRVNFVCAgX19IQUxfUkNDX1RJTTIyX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19USU0yMl9DTEtfU0xFRVBfRU5BQkxFICAgX19IQUxfUkNDX1RJTTIyX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU0yMl9DTEtfU0xFRVBfRElTQUJMRSAgIF9fSEFMX1JDQ19USU0yMl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0NSU19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQ1JTX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fQ1JTX0NMS19FTkFCTEUgX19IQUxfUkNDX0NSU19DTEtfRU5BQkxFCisjZGVmaW5lIF9fQ1JTX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19DUlNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19DUlNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfQ1JTX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19DUlNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0NSU19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0NSU19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19DUlNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1JDQ19CQUNLVVBSRVNFVF9GT1JDRSBfX0hBTF9SQ0NfQkFDS1VQUkVTRVRfRk9SQ0UKKyNkZWZpbmUgX19SQ0NfQkFDS1VQUkVTRVRfUkVMRUFTRSBfX0hBTF9SQ0NfQkFDS1VQUkVTRVRfUkVMRUFTRQorCisjZGVmaW5lIF9fVVNCX09UR19GU19GT1JDRV9SRVNFVCAgX19IQUxfUkNDX1VTQl9PVEdfRlNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VU0JfT1RHX0ZTX1JFTEVBU0VfUkVTRVQgIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19VU0JfT1RHX0ZTX0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19VU0JfT1RHX0ZTX0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfVVNCX09UR19GU19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1VTQl9PVEdfSFNfQ0xLX0RJU0FCTEUgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVVNCX09UR19IU19DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0NMS19FTkFCTEUKKyNkZWZpbmUgX19VU0JfT1RHX0hTX1VMUElfQ0xLX0VOQUJMRSAgX19IQUxfUkNDX1VTQl9PVEdfSFNfVUxQSV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVVNCX09UR19IU19VTFBJX0NMS19ESVNBQkxFICBfX0hBTF9SQ0NfVVNCX09UR19IU19VTFBJX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNOV9DTEtfU0xFRVBfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19USU05X0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU05X0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfVElNOV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTEwX0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19USU0xMF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNMTBfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19USU0xMF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTExX0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19USU0xMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNMTFfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19USU0xMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0VUSE1BQ1BUUF9DTEtfU0xFRVBfRU5BQkxFICBfX0hBTF9SQ0NfRVRITUFDUFRQX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19FVEhNQUNQVFBfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19FVEhNQUNQVFBfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19FVEhNQUNQVFBfQ0xLX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfRVRITUFDUFRQX0NMS19FTkFCTEUKKyNkZWZpbmUgX19FVEhNQUNQVFBfQ0xLX0RJU0FCTEUgICAgICAgICAgX19IQUxfUkNDX0VUSE1BQ1BUUF9DTEtfRElTQUJMRQorI2RlZmluZSBfX0hBU0hfQ0xLX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfSEFTSF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fSEFTSF9GT1JDRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfSEFTSF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0hBU0hfUkVMRUFTRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfSEFTSF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fSEFTSF9DTEtfU0xFRVBfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19IQVNIX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19IQVNIX0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfSEFTSF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0hBU0hfQ0xLX0RJU0FCTEUgICAgICAgICAgICBfX0hBTF9SQ0NfSEFTSF9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NQSTVfQ0xLX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfU1BJNV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fU1BJNV9DTEtfRElTQUJMRSAgICAgICAgICAgICAgX19IQUxfUkNDX1NQSTVfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19TUEk1X0ZPUkNFX1JFU0VUICAgICAgICAgIF9fSEFMX1JDQ19TUEk1X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fU1BJNV9SRUxFQVNFX1JFU0VUICAgICAgICAgIF9fSEFMX1JDQ19TUEk1X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19TUEk1X0NMS19TTEVFUF9FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX1NQSTVfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1NQSTVfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19TUEk1X0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fU1BJNl9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19TUEk2X0NMS19FTkFCTEUKKyNkZWZpbmUgX19TUEk2X0NMS19ESVNBQkxFICAgICAgICAgIF9fSEFMX1JDQ19TUEk2X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fU1BJNl9GT1JDRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfU1BJNl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1NQSTZfUkVMRUFTRV9SRVNFVCAgICAgICAgIF9fSEFMX1JDQ19TUEk2X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19TUEk2X0NMS19TTEVFUF9FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX1NQSTZfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1NQSTZfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19TUEk2X0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fTFREQ19DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19MVERDX0NMS19FTkFCTEUKKyNkZWZpbmUgX19MVERDX0NMS19ESVNBQkxFICAgICAgICAgIF9fSEFMX1JDQ19MVERDX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fTFREQ19GT1JDRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfTFREQ19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0xURENfUkVMRUFTRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfTFREQ19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fTFREQ19DTEtfU0xFRVBfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19MVERDX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19FVEhNQUNfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX0VUSE1BQ19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fRVRITUFDX0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfRVRITUFDX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fRVRITUFDVFhfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX0VUSE1BQ1RYX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19FVEhNQUNUWF9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX0VUSE1BQ1RYX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fRVRITUFDUlhfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX0VUSE1BQ1JYX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19FVEhNQUNSWF9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX0VUSE1BQ1JYX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVElNMTJfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX1RJTTEyX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU0xMl9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1RJTTEyX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVElNMTNfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX1RJTTEzX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU0xM19DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1RJTTEzX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVElNMTRfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX1RJTTE0X0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU0xNF9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1RJTTE0X0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fQktQU1JBTV9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19CS1BTUkFNX0NMS19FTkFCTEUKKyNkZWZpbmUgX19CS1BTUkFNX0NMS19ESVNBQkxFICAgICAgICAgIF9fSEFMX1JDQ19CS1BTUkFNX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fQktQU1JBTV9DTEtfU0xFRVBfRU5BQkxFICBfX0hBTF9SQ0NfQktQU1JBTV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fQktQU1JBTV9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX0JLUFNSQU1fQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19DQ01EQVRBUkFNRU5fQ0xLX0VOQUJMRSAgX19IQUxfUkNDX0NDTURBVEFSQU1FTl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fQ0NNREFUQVJBTUVOX0NMS19ESVNBQkxFICBfX0hBTF9SQ0NfQ0NNREFUQVJBTUVOX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVVNBUlQ2X0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX1VTQVJUNl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVVNBUlQ2X0NMS19ESVNBQkxFICAgICAgICAgIF9fSEFMX1JDQ19VU0FSVDZfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDZfRk9SQ0VfUkVTRVQgICAgICAgIF9fSEFMX1JDQ19VU0FSVDZfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VU0FSVDZfUkVMRUFTRV9SRVNFVCAgICAgICAgX19IQUxfUkNDX1VTQVJUNl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVVNBUlQ2X0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19VU0FSVDZfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1VTQVJUNl9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1VTQVJUNl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1NQSTRfQ0xLX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfU1BJNF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fU1BJNF9DTEtfRElTQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfU1BJNF9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NQSTRfRk9SQ0VfUkVTRVQgICAgICAgICAgX19IQUxfUkNDX1NQSTRfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19TUEk0X1JFTEVBU0VfUkVTRVQgICAgICAgIF9fSEFMX1JDQ19TUEk0X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19TUEk0X0NMS19TTEVFUF9FTkFCTEUgICBfX0hBTF9SQ0NfU1BJNF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fU1BJNF9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1NQSTRfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPSV9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19HUElPSV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0lfQ0xLX0RJU0FCTEUgICAgICAgICAgX19IQUxfUkNDX0dQSU9JX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0lfRk9SQ0VfUkVTRVQgICAgICAgICAgX19IQUxfUkNDX0dQSU9JX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0lfUkVMRUFTRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfR1BJT0lfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0dQSU9JX0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19HUElPSV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0lfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19HUElPSV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0dQSU9KX0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX0dQSU9KX0NMS19FTkFCTEUKKyNkZWZpbmUgX19HUElPSl9DTEtfRElTQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfR1BJT0pfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPSl9GT1JDRV9SRVNFVCAgICAgICAgIF9fSEFMX1JDQ19HUElPSl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0dQSU9KX1JFTEVBU0VfUkVTRVQgICAgICAgICAgX19IQUxfUkNDX0dQSU9KX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19HUElPSl9DTEtfU0xFRVBfRU5BQkxFICBfX0hBTF9SQ0NfR1BJT0pfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0dQSU9KX0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfR1BJT0pfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPS19DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19HUElPS19DTEtfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0tfQ0xLX0RJU0FCTEUgICAgICAgICAgX19IQUxfUkNDX0dQSU9LX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0tfUkVMRUFTRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfR1BJT0tfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0dQSU9LX0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19HUElPS19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0tfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19HUElPS19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0VUSF9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19FVEhfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0VUSF9DTEtfRElTQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfRVRIX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fRENNSV9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19EQ01JX0NMS19FTkFCTEUKKyNkZWZpbmUgX19EQ01JX0NMS19ESVNBQkxFICAgICAgICAgIF9fSEFMX1JDQ19EQ01JX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fRENNSV9GT1JDRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfRENNSV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0RDTUlfUkVMRUFTRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfRENNSV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fRENNSV9DTEtfU0xFRVBfRU5BQkxFICAgX19IQUxfUkNDX0RDTUlfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0RDTUlfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19EQ01JX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVUFSVDdfQ0xLX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfVUFSVDdfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1VBUlQ3X0NMS19ESVNBQkxFICAgICAgICAgIF9fSEFMX1JDQ19VQVJUN19DTEtfRElTQUJMRQorI2RlZmluZSBfX1VBUlQ3X1JFTEVBU0VfUkVTRVQgICAgICAgX19IQUxfUkNDX1VBUlQ3X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19VQVJUN19GT1JDRV9SRVNFVCAgICAgICBfX0hBTF9SQ0NfVUFSVDdfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VQVJUN19DTEtfU0xFRVBfRU5BQkxFICBfX0hBTF9SQ0NfVUFSVDdfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1VBUlQ3X0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfVUFSVDdfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19VQVJUOF9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19VQVJUOF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVUFSVDhfQ0xLX0RJU0FCTEUgICAgICAgICAgX19IQUxfUkNDX1VBUlQ4X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVUFSVDhfRk9SQ0VfUkVTRVQgICAgICAgICAgX19IQUxfUkNDX1VBUlQ4X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVUFSVDhfUkVMRUFTRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfVUFSVDhfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1VBUlQ4X0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19VQVJUOF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVUFSVDhfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19VQVJUOF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX09UR0hTX0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19PVEdIU19DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1VTQl9PVEdfSFNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19PVEdIU19GT1JDRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfVVNCX09UR19IU19GT1JDRV9SRVNFVAorI2RlZmluZSBfX09UR0hTX1JFTEVBU0VfUkVTRVQgICAgICAgICAgX19IQUxfUkNDX1VTQl9PVEdfSFNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX09UR0hTVUxQSV9DTEtfU0xFRVBfRU5BQkxFICBfX0hBTF9SQ0NfVVNCX09UR19IU19VTFBJX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19PVEdIU1VMUElfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1VMUElfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX09UR0hTX0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX09UR0hTX0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfVVNCX09UR19IU19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfT1RHSFNfSVNfQ0xLX1NMRUVQX0VOQUJMRUQgX19IQUxfUkNDX1VTQl9PVEdfSFNfSVNfQ0xLX1NMRUVQX0VOQUJMRUQKKyNkZWZpbmUgX19IQUxfUkNDX09UR0hTX0lTX0NMS19TTEVFUF9ESVNBQkxFRCBfX0hBTF9SQ0NfVVNCX09UR19IU19JU19DTEtfU0xFRVBfRElTQUJMRUQKKyNkZWZpbmUgX19IQUxfUkNDX09UR0hTX0ZPUkNFX1JFU0VUICAgICAgICAgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fSEFMX1JDQ19PVEdIU19SRUxFQVNFX1JFU0VUICAgICAgICAgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX09UR0hTVUxQSV9DTEtfU0xFRVBfRU5BQkxFICAgICAgX19IQUxfUkNDX1VTQl9PVEdfSFNfVUxQSV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19PVEdIU1VMUElfQ0xLX1NMRUVQX0RJU0FCTEUgICAgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1VMUElfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX09UR0hTVUxQSV9JU19DTEtfU0xFRVBfRU5BQkxFRCAgX19IQUxfUkNDX1VTQl9PVEdfSFNfVUxQSV9JU19DTEtfU0xFRVBfRU5BQkxFRAorI2RlZmluZSBfX0hBTF9SQ0NfT1RHSFNVTFBJX0lTX0NMS19TTEVFUF9ESVNBQkxFRCBfX0hBTF9SQ0NfVVNCX09UR19IU19VTFBJX0lTX0NMS19TTEVFUF9ESVNBQkxFRAorI2RlZmluZSBfX1NSQU0zX0NMS19TTEVFUF9FTkFCTEUgICAgICAgX19IQUxfUkNDX1NSQU0zX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19DQU4yX0NMS19TTEVFUF9FTkFCTEUgICAgICAgIF9fSEFMX1JDQ19DQU4yX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19DQU4yX0NMS19TTEVFUF9ESVNBQkxFICAgICAgIF9fSEFMX1JDQ19DQU4yX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fREFDX0NMS19TTEVFUF9FTkFCTEUgICAgICAgICBfX0hBTF9SQ0NfREFDX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19EQUNfQ0xLX1NMRUVQX0RJU0FCTEUgICAgICAgIF9fSEFMX1JDQ19EQUNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19BREMyX0NMS19TTEVFUF9FTkFCTEUgICAgICAgIF9fSEFMX1JDQ19BREMyX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19BREMyX0NMS19TTEVFUF9ESVNBQkxFICAgICAgIF9fSEFMX1JDQ19BREMyX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fQURDM19DTEtfU0xFRVBfRU5BQkxFICAgICAgICBfX0hBTF9SQ0NfQURDM19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fQURDM19DTEtfU0xFRVBfRElTQUJMRSAgICAgICBfX0hBTF9SQ0NfQURDM19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0ZTTUNfRk9SQ0VfUkVTRVQgICAgICAgICAgICAgX19IQUxfUkNDX0ZTTUNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19GU01DX1JFTEVBU0VfUkVTRVQgICAgICAgICAgIF9fSEFMX1JDQ19GU01DX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19GU01DX0NMS19TTEVFUF9FTkFCTEUgICAgICAgIF9fSEFMX1JDQ19GU01DX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19GU01DX0NMS19TTEVFUF9ESVNBQkxFICAgICAgIF9fSEFMX1JDQ19GU01DX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fU0RJT19GT1JDRV9SRVNFVCAgICAgICAgICAgICBfX0hBTF9SQ0NfU0RJT19GT1JDRV9SRVNFVAorI2RlZmluZSBfX1NESU9fUkVMRUFTRV9SRVNFVCAgICAgICAgICAgX19IQUxfUkNDX1NESU9fUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1NESU9fQ0xLX1NMRUVQX0RJU0FCTEUgICAgICAgX19IQUxfUkNDX1NESU9fQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19TRElPX0NMS19TTEVFUF9FTkFCTEUgICAgICAgIF9fSEFMX1JDQ19TRElPX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19ETUEyRF9DTEtfRU5BQkxFICAgICAgICAgICAgIF9fSEFMX1JDQ19ETUEyRF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fRE1BMkRfQ0xLX0RJU0FCTEUgICAgICAgICAgICBfX0hBTF9SQ0NfRE1BMkRfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19ETUEyRF9GT1JDRV9SRVNFVCAgICAgICAgICAgIF9fSEFMX1JDQ19ETUEyRF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0RNQTJEX1JFTEVBU0VfUkVTRVQgICAgICAgICAgX19IQUxfUkNDX0RNQTJEX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19ETUEyRF9DTEtfU0xFRVBfRU5BQkxFICAgICAgIF9fSEFMX1JDQ19ETUEyRF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fRE1BMkRfQ0xLX1NMRUVQX0RJU0FCTEUgICAgICBfX0hBTF9SQ0NfRE1BMkRfQ0xLX1NMRUVQX0RJU0FCTEUKKworLyogYWxpYXMgZGVmaW5lIG1haW50YWluZWQgZm9yIGxlZ2FjeSAqLworI2RlZmluZSBfX0hBTF9SQ0NfT1RHRlNfRk9SQ0VfUkVTRVQgICAgX19IQUxfUkNDX1VTQl9PVEdfRlNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX09UR0ZTX1JFTEVBU0VfUkVTRVQgIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX1JFTEVBU0VfUkVTRVQKKworI2RlZmluZSBfX0FEQzEyX0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX0FEQzEyX0NMS19FTkFCTEUKKyNkZWZpbmUgX19BREMxMl9DTEtfRElTQUJMRSAgICAgICAgIF9fSEFMX1JDQ19BREMxMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX0FEQzM0X0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX0FEQzM0X0NMS19FTkFCTEUKKyNkZWZpbmUgX19BREMzNF9DTEtfRElTQUJMRSAgICAgICAgIF9fSEFMX1JDQ19BREMzNF9DTEtfRElTQUJMRQorI2RlZmluZSBfX0RBQzJfQ0xLX0VOQUJMRSAgICAgICAgICAgX19IQUxfUkNDX0RBQzJfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0RBQzJfQ0xLX0RJU0FCTEUgICAgICAgICAgX19IQUxfUkNDX0RBQzJfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xOF9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19USU0xOF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMThfQ0xLX0RJU0FCTEUgICAgICAgICBfX0hBTF9SQ0NfVElNMThfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xOV9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19USU0xOV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMTlfQ0xLX0RJU0FCTEUgICAgICAgICBfX0hBTF9SQ0NfVElNMTlfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0yMF9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19USU0yMF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMjBfQ0xLX0RJU0FCTEUgICAgICAgICBfX0hBTF9SQ0NfVElNMjBfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19IUlRJTTFfQ0xLX0VOQUJMRSAgICAgICAgIF9fSEFMX1JDQ19IUlRJTTFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0hSVElNMV9DTEtfRElTQUJMRSAgICAgICAgX19IQUxfUkNDX0hSVElNMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NEQURDMV9DTEtfRU5BQkxFICAgICAgICAgX19IQUxfUkNDX1NEQURDMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fU0RBREMyX0NMS19FTkFCTEUgICAgICAgICBfX0hBTF9SQ0NfU0RBREMyX0NMS19FTkFCTEUKKyNkZWZpbmUgX19TREFEQzNfQ0xLX0VOQUJMRSAgICAgICAgIF9fSEFMX1JDQ19TREFEQzNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1NEQURDMV9DTEtfRElTQUJMRSAgICAgICAgX19IQUxfUkNDX1NEQURDMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NEQURDMl9DTEtfRElTQUJMRSAgICAgICAgX19IQUxfUkNDX1NEQURDMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NEQURDM19DTEtfRElTQUJMRSAgICAgICAgX19IQUxfUkNDX1NEQURDM19DTEtfRElTQUJMRQorCisjZGVmaW5lIF9fQURDMTJfRk9SQ0VfUkVTRVQgICAgICAgICBfX0hBTF9SQ0NfQURDMTJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19BREMxMl9SRUxFQVNFX1JFU0VUICAgICAgIF9fSEFMX1JDQ19BREMxMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQURDMzRfRk9SQ0VfUkVTRVQgICAgICAgICBfX0hBTF9SQ0NfQURDMzRfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19BREMzNF9SRUxFQVNFX1JFU0VUICAgICAgIF9fSEFMX1JDQ19BREMzNF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fREFDMl9GT1JDRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfREFDMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0RBQzJfUkVMRUFTRV9SRVNFVCAgICAgICAgX19IQUxfUkNDX0RBQzJfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTE4X0ZPUkNFX1JFU0VUICAgICAgICAgX19IQUxfUkNDX1RJTTE4X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMThfUkVMRUFTRV9SRVNFVCAgICAgICBfX0hBTF9SQ0NfVElNMThfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTE5X0ZPUkNFX1JFU0VUICAgICAgICAgX19IQUxfUkNDX1RJTTE5X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTlfUkVMRUFTRV9SRVNFVCAgICAgICBfX0hBTF9SQ0NfVElNMTlfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTIwX0ZPUkNFX1JFU0VUICAgICAgICAgX19IQUxfUkNDX1RJTTIwX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMjBfUkVMRUFTRV9SRVNFVCAgICAgICBfX0hBTF9SQ0NfVElNMjBfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0hSVElNMV9GT1JDRV9SRVNFVCAgICAgICAgX19IQUxfUkNDX0hSVElNMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0hSVElNMV9SRUxFQVNFX1JFU0VUICAgICAgX19IQUxfUkNDX0hSVElNMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fU0RBREMxX0ZPUkNFX1JFU0VUICAgICAgICBfX0hBTF9SQ0NfU0RBREMxX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fU0RBREMyX0ZPUkNFX1JFU0VUICAgICAgICBfX0hBTF9SQ0NfU0RBREMyX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fU0RBREMzX0ZPUkNFX1JFU0VUICAgICAgICBfX0hBTF9SQ0NfU0RBREMzX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fU0RBREMxX1JFTEVBU0VfUkVTRVQgICAgICBfX0hBTF9SQ0NfU0RBREMxX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19TREFEQzJfUkVMRUFTRV9SRVNFVCAgICAgIF9fSEFMX1JDQ19TREFEQzJfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1NEQURDM19SRUxFQVNFX1JFU0VUICAgICAgX19IQUxfUkNDX1NEQURDM19SRUxFQVNFX1JFU0VUCisKKyNkZWZpbmUgX19BREMxX0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19BREMxX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fQURDMV9JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfQURDMV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19BREMxMl9JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19BREMxMl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0FEQzEyX0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX0FEQzEyX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0FEQzM0X0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX0FEQzM0X0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fQURDMzRfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfQURDMzRfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fQ0VDX0lTX0NMS19FTkFCTEVEICAgICAgICBfX0hBTF9SQ0NfQ0VDX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fQ0VDX0lTX0NMS19ESVNBQkxFRCAgICAgICBfX0hBTF9SQ0NfQ0VDX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0NSQ19JU19DTEtfRU5BQkxFRCAgICAgICAgX19IQUxfUkNDX0NSQ19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0NSQ19JU19DTEtfRElTQUJMRUQgICAgICAgX19IQUxfUkNDX0NSQ19JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19EQUMxX0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19EQUMxX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fREFDMV9JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfREFDMV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19EQUMyX0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19EQUMyX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fREFDMl9JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfREFDMl9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19ETUExX0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19ETUExX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fRE1BMV9JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfRE1BMV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19ETUEyX0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19ETUEyX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fRE1BMl9JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfRE1BMl9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19GTElURl9JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19GTElURl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0ZMSVRGX0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX0ZMSVRGX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0ZNQ19JU19DTEtfRU5BQkxFRCAgICAgICAgX19IQUxfUkNDX0ZNQ19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0ZNQ19JU19DTEtfRElTQUJMRUQgICAgICAgX19IQUxfUkNDX0ZNQ19JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19HUElPQV9JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19HUElPQV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0dQSU9BX0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX0dQSU9BX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0dQSU9CX0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX0dQSU9CX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fR1BJT0JfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfR1BJT0JfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fR1BJT0NfSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfR1BJT0NfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19HUElPQ19JU19DTEtfRElTQUJMRUQgICAgIF9fSEFMX1JDQ19HUElPQ19JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19HUElPRF9JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19HUElPRF9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0dQSU9EX0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX0dQSU9EX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0dQSU9FX0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX0dQSU9FX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fR1BJT0VfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfR1BJT0VfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fR1BJT0ZfSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfR1BJT0ZfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19HUElPRl9JU19DTEtfRElTQUJMRUQgICAgIF9fSEFMX1JDQ19HUElPRl9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19HUElPR19JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19HUElPR19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0dQSU9HX0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX0dQSU9HX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0dQSU9IX0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX0dQSU9IX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fR1BJT0hfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfR1BJT0hfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fSFJUSU0xX0lTX0NMS19FTkFCTEVEICAgICBfX0hBTF9SQ0NfSFJUSU0xX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fSFJUSU0xX0lTX0NMS19ESVNBQkxFRCAgICBfX0hBTF9SQ0NfSFJUSU0xX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0kyQzFfSVNfQ0xLX0VOQUJMRUQgICAgICAgX19IQUxfUkNDX0kyQzFfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19JMkMxX0lTX0NMS19ESVNBQkxFRCAgICAgIF9fSEFMX1JDQ19JMkMxX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0kyQzJfSVNfQ0xLX0VOQUJMRUQgICAgICAgX19IQUxfUkNDX0kyQzJfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19JMkMyX0lTX0NMS19ESVNBQkxFRCAgICAgIF9fSEFMX1JDQ19JMkMyX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0kyQzNfSVNfQ0xLX0VOQUJMRUQgICAgICAgX19IQUxfUkNDX0kyQzNfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19JMkMzX0lTX0NMS19ESVNBQkxFRCAgICAgIF9fSEFMX1JDQ19JMkMzX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1BXUl9JU19DTEtfRU5BQkxFRCAgICAgICAgX19IQUxfUkNDX1BXUl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1BXUl9JU19DTEtfRElTQUJMRUQgICAgICAgX19IQUxfUkNDX1BXUl9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19TWVNDRkdfSVNfQ0xLX0VOQUJMRUQgICAgIF9fSEFMX1JDQ19TWVNDRkdfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19TWVNDRkdfSVNfQ0xLX0RJU0FCTEVEICAgIF9fSEFMX1JDQ19TWVNDRkdfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fU1BJMV9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfU1BJMV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1NQSTFfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1NQSTFfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fU1BJMl9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfU1BJMl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1NQSTJfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1NQSTJfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fU1BJM19JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfU1BJM19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1NQSTNfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1NQSTNfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fU1BJNF9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfU1BJNF9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1NQSTRfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1NQSTRfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fU0RBREMxX0lTX0NMS19FTkFCTEVEICAgICBfX0hBTF9SQ0NfU0RBREMxX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fU0RBREMxX0lTX0NMS19ESVNBQkxFRCAgICBfX0hBTF9SQ0NfU0RBREMxX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1NEQURDMl9JU19DTEtfRU5BQkxFRCAgICAgX19IQUxfUkNDX1NEQURDMl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1NEQURDMl9JU19DTEtfRElTQUJMRUQgICAgX19IQUxfUkNDX1NEQURDMl9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19TREFEQzNfSVNfQ0xLX0VOQUJMRUQgICAgIF9fSEFMX1JDQ19TREFEQzNfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19TREFEQzNfSVNfQ0xLX0RJU0FCTEVEICAgIF9fSEFMX1JDQ19TREFEQzNfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fU1JBTV9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfU1JBTV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1NSQU1fSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1NSQU1fSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNMV9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfVElNMV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTFfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1RJTTFfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNMl9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfVElNMl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTJfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1RJTTJfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNM19JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfVElNM19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTNfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1RJTTNfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNNF9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfVElNNF9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTRfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1RJTTRfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNNV9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfVElNNV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTVfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1RJTTVfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNNl9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfVElNNl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTZfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1RJTTZfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNN19JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfVElNN19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTdfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1RJTTdfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNOF9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfVElNOF9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTThfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1RJTThfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNMTJfSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfVElNMTJfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19USU0xMl9JU19DTEtfRElTQUJMRUQgICAgIF9fSEFMX1JDQ19USU0xMl9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19USU0xM19JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19USU0xM19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTEzX0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX1RJTTEzX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1RJTTE0X0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX1RJTTE0X0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVElNMTRfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfVElNMTRfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNMTVfSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfVElNMTVfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19USU0xNV9JU19DTEtfRElTQUJMRUQgICAgIF9fSEFMX1JDQ19USU0xNV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19USU0xNl9JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19USU0xNl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTE2X0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX1RJTTE2X0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1RJTTE3X0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX1RJTTE3X0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVElNMTdfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfVElNMTdfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNMThfSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfVElNMThfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19USU0xOF9JU19DTEtfRElTQUJMRUQgICAgIF9fSEFMX1JDQ19USU0xOF9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19USU0xOV9JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19USU0xOV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTE5X0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX1RJTTE5X0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1RJTTIwX0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX1RJTTIwX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVElNMjBfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfVElNMjBfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVFNDX0lTX0NMS19FTkFCTEVEICAgICAgICBfX0hBTF9SQ0NfVFNDX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVFNDX0lTX0NMS19ESVNBQkxFRCAgICAgICBfX0hBTF9SQ0NfVFNDX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1VBUlQ0X0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX1VBUlQ0X0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVUFSVDRfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfVUFSVDRfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVUFSVDVfSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfVUFSVDVfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19VQVJUNV9JU19DTEtfRElTQUJMRUQgICAgIF9fSEFMX1JDQ19VQVJUNV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19VU0FSVDFfSVNfQ0xLX0VOQUJMRUQgICAgIF9fSEFMX1JDQ19VU0FSVDFfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19VU0FSVDFfSVNfQ0xLX0RJU0FCTEVEICAgIF9fSEFMX1JDQ19VU0FSVDFfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVVNBUlQyX0lTX0NMS19FTkFCTEVEICAgICBfX0hBTF9SQ0NfVVNBUlQyX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVVNBUlQyX0lTX0NMS19ESVNBQkxFRCAgICBfX0hBTF9SQ0NfVVNBUlQyX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1VTQVJUM19JU19DTEtfRU5BQkxFRCAgICAgX19IQUxfUkNDX1VTQVJUM19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1VTQVJUM19JU19DTEtfRElTQUJMRUQgICAgX19IQUxfUkNDX1VTQVJUM19JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19VU0JfSVNfQ0xLX0VOQUJMRUQgICAgICAgIF9fSEFMX1JDQ19VU0JfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19VU0JfSVNfQ0xLX0RJU0FCTEVEICAgICAgIF9fSEFMX1JDQ19VU0JfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fV1dER19JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfV1dER19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1dXREdfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1dXREdfSVNfQ0xLX0RJU0FCTEVECisKKyNpZiBkZWZpbmVkKFNUTTMyRjQpCisjZGVmaW5lIF9fSEFMX1JDQ19TRE1NQzFfRk9SQ0VfUkVTRVQgICAgICAgX19IQUxfUkNDX1NESU9fRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX1NETU1DMV9SRUxFQVNFX1JFU0VUICAgICBfX0hBTF9SQ0NfU0RJT19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fSEFMX1JDQ19TRE1NQzFfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX1NESU9fQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfU0RNTUMxX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19TRElPX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19TRE1NQzFfQ0xLX0VOQUJMRSAgICAgICAgX19IQUxfUkNDX1NESU9fQ0xLX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfU0RNTUMxX0NMS19ESVNBQkxFICAgICAgIF9fSEFMX1JDQ19TRElPX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19TRE1NQzFfSVNfQ0xLX0VOQUJMRUQgICAgX19IQUxfUkNDX1NESU9fSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19IQUxfUkNDX1NETU1DMV9JU19DTEtfRElTQUJMRUQgICBfX0hBTF9SQ0NfU0RJT19JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgU2RtbWMxQ2xvY2tTZWxlY3Rpb24gICAgICAgICAgICAgICBTZGlvQ2xvY2tTZWxlY3Rpb24KKyNkZWZpbmUgUkNDX1BFUklQSENMS19TRE1NQzEgICAgICAgICAgICAgICBSQ0NfUEVSSVBIQ0xLX1NESU8KKyNkZWZpbmUgUkNDX1NETU1DMUNMS1NPVVJDRV9DTEs0OCAgICAgICAgICBSQ0NfU0RJT0NMS1NPVVJDRV9DSzQ4CisjZGVmaW5lIFJDQ19TRE1NQzFDTEtTT1VSQ0VfU1lTQ0xLICAgICAgICAgUkNDX1NESU9DTEtTT1VSQ0VfU1lTQ0xLCisjZGVmaW5lIF9fSEFMX1JDQ19TRE1NQzFfQ09ORklHICAgICAgICAgICAgX19IQUxfUkNDX1NESU9fQ09ORklHCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfU0RNTUMxX1NPVVJDRSAgICAgICAgX19IQUxfUkNDX0dFVF9TRElPX1NPVVJDRQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUTTMyRjcpIHx8IGRlZmluZWQoU1RNMzJMNCkKKyNkZWZpbmUgX19IQUxfUkNDX1NESU9fRk9SQ0VfUkVTRVQgICAgICAgICBfX0hBTF9SQ0NfU0RNTUMxX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fSEFMX1JDQ19TRElPX1JFTEVBU0VfUkVTRVQgICAgICAgX19IQUxfUkNDX1NETU1DMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fSEFMX1JDQ19TRElPX0NMS19TTEVFUF9FTkFCTEUgICAgX19IQUxfUkNDX1NETU1DMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19TRElPX0NMS19TTEVFUF9ESVNBQkxFICAgX19IQUxfUkNDX1NETU1DMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfU0RJT19DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19TRE1NQzFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfU0RJT19DTEtfRElTQUJMRSAgICAgICAgIF9fSEFMX1JDQ19TRE1NQzFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX1NESU9fSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfU0RNTUMxX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fSEFMX1JDQ19TRElPX0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX1NETU1DMV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgU2Rpb0Nsb2NrU2VsZWN0aW9uICAgICAgICAgICAgICAgICBTZG1tYzFDbG9ja1NlbGVjdGlvbgorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1NESU8gICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfU0RNTUMxCisjZGVmaW5lIF9fSEFMX1JDQ19TRElPX0NPTkZJRyAgICAgICAgICAgICAgX19IQUxfUkNDX1NETU1DMV9DT05GSUcKKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9TRElPX1NPVVJDRSAgICAgICAgICBfX0hBTF9SQ0NfR0VUX1NETU1DMV9TT1VSQ0UKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkY3KQorI2RlZmluZSBSQ0NfU0RJT0NMS1NPVVJDRV9DTEs0OCAgICAgICAgICAgICBSQ0NfU0RNTUMxQ0xLU09VUkNFX0NMSzQ4CisjZGVmaW5lIFJDQ19TRElPQ0xLU09VUkNFX1NZU0NMSyAgICAgICAgICAgUkNDX1NETU1DMUNMS1NPVVJDRV9TWVNDTEsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkg3KQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19IU19DTEtfRU5BQkxFKCkgICAgICAgICAgICAgIF9fSEFMX1JDQ19VU0IxX09UR19IU19DTEtfRU5BQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfSFNfVUxQSV9DTEtfRU5BQkxFKCkgICAgICAgICBfX0hBTF9SQ0NfVVNCMV9PVEdfSFNfVUxQSV9DTEtfRU5BQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfSFNfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAgICBfX0hBTF9SQ0NfVVNCMV9PVEdfSFNfQ0xLX0RJU0FCTEUoKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19IU19VTFBJX0NMS19ESVNBQkxFKCkgICAgICAgIF9fSEFMX1JDQ19VU0IxX09UR19IU19VTFBJX0NMS19ESVNBQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfSFNfRk9SQ0VfUkVTRVQoKSAgICAgICAgICAgICBfX0hBTF9SQ0NfVVNCMV9PVEdfSFNfRk9SQ0VfUkVTRVQoKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19IU19SRUxFQVNFX1JFU0VUKCkgICAgICAgICAgIF9fSEFMX1JDQ19VU0IxX09UR19IU19SRUxFQVNFX1JFU0VUKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfSFNfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICAgICBfX0hBTF9SQ0NfVVNCMV9PVEdfSFNfQ0xLX1NMRUVQX0VOQUJMRSgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1VMUElfQ0xLX1NMRUVQX0VOQUJMRSgpICAgX19IQUxfUkNDX1VTQjFfT1RHX0hTX1VMUElfQ0xLX1NMRUVQX0VOQUJMRSgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgICAgX19IQUxfUkNDX1VTQjFfT1RHX0hTX0NMS19TTEVFUF9ESVNBQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfSFNfVUxQSV9DTEtfU0xFRVBfRElTQUJMRSgpICBfX0hBTF9SQ0NfVVNCMV9PVEdfSFNfVUxQSV9DTEtfU0xFRVBfRElTQUJMRSgpCisKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfRlNfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgIF9fSEFMX1JDQ19VU0IyX09UR19GU19DTEtfRU5BQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfRlNfVUxQSV9DTEtfRU5BQkxFKCkgICAgICAgIF9fSEFMX1JDQ19VU0IyX09UR19GU19VTFBJX0NMS19FTkFCTEUoKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19GU19DTEtfRElTQUJMRSgpICAgICAgICAgICAgX19IQUxfUkNDX1VTQjJfT1RHX0ZTX0NMS19ESVNBQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfRlNfVUxQSV9DTEtfRElTQUJMRSgpICAgICAgIF9fSEFMX1JDQ19VU0IyX09UR19GU19VTFBJX0NMS19ESVNBQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfRlNfRk9SQ0VfUkVTRVQoKSAgICAgICAgICAgIF9fSEFMX1JDQ19VU0IyX09UR19GU19GT1JDRV9SRVNFVCgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX1JFTEVBU0VfUkVTRVQoKSAgICAgICAgICBfX0hBTF9SQ0NfVVNCMl9PVEdfRlNfUkVMRUFTRV9SRVNFVCgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgICBfX0hBTF9SQ0NfVVNCMl9PVEdfRlNfQ0xLX1NMRUVQX0VOQUJMRSgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX1VMUElfQ0xLX1NMRUVQX0VOQUJMRSgpICBfX0hBTF9SQ0NfVVNCMl9PVEdfRlNfVUxQSV9DTEtfU0xFRVBfRU5BQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfRlNfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgIF9fSEFMX1JDQ19VU0IyX09UR19GU19DTEtfU0xFRVBfRElTQUJMRSgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX1VMUElfQ0xLX1NMRUVQX0RJU0FCTEUoKSBfX0hBTF9SQ0NfVVNCMl9PVEdfRlNfVUxQSV9DTEtfU0xFRVBfRElTQUJMRSgpCisjZW5kaWYKKworI2RlZmluZSBfX0hBTF9SQ0NfSTJTQ0xLICAgICAgICAgICAgX19IQUxfUkNDX0kyU19DT05GSUcKKyNkZWZpbmUgX19IQUxfUkNDX0kyU0NMS19DT05GSUcgICAgIF9fSEFMX1JDQ19JMlNfQ09ORklHCisKKyNkZWZpbmUgX19SQ0NfUExMU1JDICAgICAgICAgICAgICAgIFJDQ19HRVRfUExMX09TQ1NPVVJDRQorCisjZGVmaW5lIElTX1JDQ19NU0lSQU5HRSAgICAgICAgICAgICBJU19SQ0NfTVNJX0NMT0NLX1JBTkdFCisjZGVmaW5lIElTX1JDQ19SVENDTEtfU09VUkNFICAgICAgICBJU19SQ0NfUlRDQ0xLU09VUkNFCisjZGVmaW5lIElTX1JDQ19TWVNDTEtfRElWICAgICAgICAgICBJU19SQ0NfSENMSworI2RlZmluZSBJU19SQ0NfSENMS19ESVYgICAgICAgICAgICAgSVNfUkNDX1BDTEsKKyNkZWZpbmUgSVNfUkNDX1BFUklQSENMSyAgICAgICAgICAgIElTX1JDQ19QRVJJUEhDTE9DSworCisjZGVmaW5lIFJDQ19JVF9IU0kxNCAgICAgICAgICAgICAgICBSQ0NfSVRfSFNJMTRSRFkKKworI2RlZmluZSBSQ0NfSVRfQ1NTTFNFICAgICAgICAgICAgICAgUkNDX0lUX0xTRUNTUworI2RlZmluZSBSQ0NfSVRfQ1NTSFNFICAgICAgICAgICAgICAgUkNDX0lUX0NTUworCisjZGVmaW5lIFJDQ19QTExNVUxfMyAgICAgICAgICAgICAgICBSQ0NfUExMX01VTDMKKyNkZWZpbmUgUkNDX1BMTE1VTF80ICAgICAgICAgICAgICAgIFJDQ19QTExfTVVMNAorI2RlZmluZSBSQ0NfUExMTVVMXzYgICAgICAgICAgICAgICAgUkNDX1BMTF9NVUw2CisjZGVmaW5lIFJDQ19QTExNVUxfOCAgICAgICAgICAgICAgICBSQ0NfUExMX01VTDgKKyNkZWZpbmUgUkNDX1BMTE1VTF8xMiAgICAgICAgICAgICAgIFJDQ19QTExfTVVMMTIKKyNkZWZpbmUgUkNDX1BMTE1VTF8xNiAgICAgICAgICAgICAgIFJDQ19QTExfTVVMMTYKKyNkZWZpbmUgUkNDX1BMTE1VTF8yNCAgICAgICAgICAgICAgIFJDQ19QTExfTVVMMjQKKyNkZWZpbmUgUkNDX1BMTE1VTF8zMiAgICAgICAgICAgICAgIFJDQ19QTExfTVVMMzIKKyNkZWZpbmUgUkNDX1BMTE1VTF80OCAgICAgICAgICAgICAgIFJDQ19QTExfTVVMNDgKKworI2RlZmluZSBSQ0NfUExMRElWXzIgICAgICAgICAgICAgICAgUkNDX1BMTF9ESVYyCisjZGVmaW5lIFJDQ19QTExESVZfMyAgICAgICAgICAgICAgICBSQ0NfUExMX0RJVjMKKyNkZWZpbmUgUkNDX1BMTERJVl80ICAgICAgICAgICAgICAgIFJDQ19QTExfRElWNAorCisjZGVmaW5lIElTX1JDQ19NQ09TT1VSQ0UgICAgICAgICAgICBJU19SQ0NfTUNPMVNPVVJDRQorI2RlZmluZSBfX0hBTF9SQ0NfTUNPX0NPTkZJRyAgICAgICAgX19IQUxfUkNDX01DTzFfQ09ORklHCisjZGVmaW5lIFJDQ19NQ09fTk9ESVYgICAgICAgICAgICAgICBSQ0NfTUNPRElWXzEKKyNkZWZpbmUgUkNDX01DT19ESVYxICAgICAgICAgICAgICAgIFJDQ19NQ09ESVZfMQorI2RlZmluZSBSQ0NfTUNPX0RJVjIgICAgICAgICAgICAgICAgUkNDX01DT0RJVl8yCisjZGVmaW5lIFJDQ19NQ09fRElWNCAgICAgICAgICAgICAgICBSQ0NfTUNPRElWXzQKKyNkZWZpbmUgUkNDX01DT19ESVY4ICAgICAgICAgICAgICAgIFJDQ19NQ09ESVZfOAorI2RlZmluZSBSQ0NfTUNPX0RJVjE2ICAgICAgICAgICAgICAgUkNDX01DT0RJVl8xNgorI2RlZmluZSBSQ0NfTUNPX0RJVjMyICAgICAgICAgICAgICAgUkNDX01DT0RJVl8zMgorI2RlZmluZSBSQ0NfTUNPX0RJVjY0ICAgICAgICAgICAgICAgUkNDX01DT0RJVl82NAorI2RlZmluZSBSQ0NfTUNPX0RJVjEyOCAgICAgICAgICAgICAgUkNDX01DT0RJVl8xMjgKKyNkZWZpbmUgUkNDX01DT1NPVVJDRV9OT05FICAgICAgICAgIFJDQ19NQ08xU09VUkNFX05PQ0xPQ0sKKyNkZWZpbmUgUkNDX01DT1NPVVJDRV9MU0kgICAgICAgICAgIFJDQ19NQ08xU09VUkNFX0xTSQorI2RlZmluZSBSQ0NfTUNPU09VUkNFX0xTRSAgICAgICAgICAgUkNDX01DTzFTT1VSQ0VfTFNFCisjZGVmaW5lIFJDQ19NQ09TT1VSQ0VfU1lTQ0xLICAgICAgICBSQ0NfTUNPMVNPVVJDRV9TWVNDTEsKKyNkZWZpbmUgUkNDX01DT1NPVVJDRV9IU0kgICAgICAgICAgIFJDQ19NQ08xU09VUkNFX0hTSQorI2RlZmluZSBSQ0NfTUNPU09VUkNFX0hTSTE0ICAgICAgICAgUkNDX01DTzFTT1VSQ0VfSFNJMTQKKyNkZWZpbmUgUkNDX01DT1NPVVJDRV9IU0k0OCAgICAgICAgIFJDQ19NQ08xU09VUkNFX0hTSTQ4CisjZGVmaW5lIFJDQ19NQ09TT1VSQ0VfSFNFICAgICAgICAgICBSQ0NfTUNPMVNPVVJDRV9IU0UKKyNkZWZpbmUgUkNDX01DT1NPVVJDRV9QTExDTEtfRElWMSAgIFJDQ19NQ08xU09VUkNFX1BMTENMSworI2RlZmluZSBSQ0NfTUNPU09VUkNFX1BMTENMS19OT0RJViAgUkNDX01DTzFTT1VSQ0VfUExMQ0xLCisjZGVmaW5lIFJDQ19NQ09TT1VSQ0VfUExMQ0xLX0RJVjIgICBSQ0NfTUNPMVNPVVJDRV9QTExDTEtfRElWMgorCisjaWYgZGVmaW5lZChTVE0zMkw0KQorI2RlZmluZSBSQ0NfUlRDQ0xLU09VUkNFX05PX0NMSyAgICAgUkNDX1JUQ0NMS1NPVVJDRV9OT05FCisjZWxpZiBkZWZpbmVkKFNUTTMyV0IpIHx8IGRlZmluZWQoU1RNMzJHMCkgfHwgZGVmaW5lZChTVE0zMkc0KQorI2Vsc2UKKyNkZWZpbmUgUkNDX1JUQ0NMS1NPVVJDRV9OT05FICAgICAgIFJDQ19SVENDTEtTT1VSQ0VfTk9fQ0xLCisjZW5kaWYKKworI2RlZmluZSBSQ0NfVVNCQ0xLX1BMTFNBSTEgICAgICAgICAgUkNDX1VTQkNMS1NPVVJDRV9QTExTQUkxCisjZGVmaW5lIFJDQ19VU0JDTEtfUExMICAgICAgICAgICAgICBSQ0NfVVNCQ0xLU09VUkNFX1BMTAorI2RlZmluZSBSQ0NfVVNCQ0xLX01TSSAgICAgICAgICAgICAgUkNDX1VTQkNMS1NPVVJDRV9NU0kKKyNkZWZpbmUgUkNDX1VTQkNMS1NPVVJDRV9QTExDTEsgICAgIFJDQ19VU0JDTEtTT1VSQ0VfUExMCisjZGVmaW5lIFJDQ19VU0JQTExDTEtfRElWMSAgICAgICAgICBSQ0NfVVNCQ0xLU09VUkNFX1BMTAorI2RlZmluZSBSQ0NfVVNCUExMQ0xLX0RJVjFfNSAgICAgICAgUkNDX1VTQkNMS1NPVVJDRV9QTExfRElWMV81CisjZGVmaW5lIFJDQ19VU0JQTExDTEtfRElWMiAgICAgICAgICBSQ0NfVVNCQ0xLU09VUkNFX1BMTF9ESVYyCisjZGVmaW5lIFJDQ19VU0JQTExDTEtfRElWMyAgICAgICAgICBSQ0NfVVNCQ0xLU09VUkNFX1BMTF9ESVYzCisKKyNkZWZpbmUgSFNJT05fQml0TnVtYmVyICAgICAgICBSQ0NfSFNJT05fQklUX05VTUJFUgorI2RlZmluZSBIU0lPTl9CSVROVU1CRVIgICAgICAgIFJDQ19IU0lPTl9CSVRfTlVNQkVSCisjZGVmaW5lIEhTRU9OX0JpdE51bWJlciAgICAgICAgUkNDX0hTRU9OX0JJVF9OVU1CRVIKKyNkZWZpbmUgSFNFT05fQklUTlVNQkVSICAgICAgICBSQ0NfSFNFT05fQklUX05VTUJFUgorI2RlZmluZSBNU0lPTl9CSVROVU1CRVIgICAgICAgIFJDQ19NU0lPTl9CSVRfTlVNQkVSCisjZGVmaW5lIENTU09OX0JpdE51bWJlciAgICAgICAgUkNDX0NTU09OX0JJVF9OVU1CRVIKKyNkZWZpbmUgQ1NTT05fQklUTlVNQkVSICAgICAgICBSQ0NfQ1NTT05fQklUX05VTUJFUgorI2RlZmluZSBQTExPTl9CaXROdW1iZXIgICAgICAgIFJDQ19QTExPTl9CSVRfTlVNQkVSCisjZGVmaW5lIFBMTE9OX0JJVE5VTUJFUiAgICAgICAgUkNDX1BMTE9OX0JJVF9OVU1CRVIKKyNkZWZpbmUgUExMSTJTT05fQml0TnVtYmVyICAgICBSQ0NfUExMSTJTT05fQklUX05VTUJFUgorI2RlZmluZSBJMlNTUkNfQml0TnVtYmVyICAgICAgIFJDQ19JMlNTUkNfQklUX05VTUJFUgorI2RlZmluZSBSVENFTl9CaXROdW1iZXIgICAgICAgIFJDQ19SVENFTl9CSVRfTlVNQkVSCisjZGVmaW5lIFJUQ0VOX0JJVE5VTUJFUiAgICAgICAgUkNDX1JUQ0VOX0JJVF9OVU1CRVIKKyNkZWZpbmUgQkRSU1RfQml0TnVtYmVyICAgICAgICBSQ0NfQkRSU1RfQklUX05VTUJFUgorI2RlZmluZSBCRFJTVF9CSVROVU1CRVIgICAgICAgIFJDQ19CRFJTVF9CSVRfTlVNQkVSCisjZGVmaW5lIFJUQ1JTVF9CSVROVU1CRVIgICAgICAgUkNDX1JUQ1JTVF9CSVRfTlVNQkVSCisjZGVmaW5lIExTSU9OX0JpdE51bWJlciAgICAgICAgUkNDX0xTSU9OX0JJVF9OVU1CRVIKKyNkZWZpbmUgTFNJT05fQklUTlVNQkVSICAgICAgICBSQ0NfTFNJT05fQklUX05VTUJFUgorI2RlZmluZSBMU0VPTl9CaXROdW1iZXIgICAgICAgIFJDQ19MU0VPTl9CSVRfTlVNQkVSCisjZGVmaW5lIExTRU9OX0JJVE5VTUJFUiAgICAgICAgUkNDX0xTRU9OX0JJVF9OVU1CRVIKKyNkZWZpbmUgTFNFQllQX0JJVE5VTUJFUiAgICAgICBSQ0NfTFNFQllQX0JJVF9OVU1CRVIKKyNkZWZpbmUgUExMU0FJT05fQml0TnVtYmVyICAgICBSQ0NfUExMU0FJT05fQklUX05VTUJFUgorI2RlZmluZSBUSU1QUkVfQml0TnVtYmVyICAgICAgIFJDQ19USU1QUkVfQklUX05VTUJFUgorI2RlZmluZSBSTVZGX0JpdE51bWJlciAgICAgICAgIFJDQ19STVZGX0JJVF9OVU1CRVIKKyNkZWZpbmUgUk1WRl9CSVROVU1CRVIgICAgICAgICBSQ0NfUk1WRl9CSVRfTlVNQkVSCisjZGVmaW5lIFJDQ19DUjJfSFNJMTRUUklNX0JpdE51bWJlciBSQ0NfSFNJMTRUUklNX0JJVF9OVU1CRVIKKyNkZWZpbmUgQ1JfQllURTJfQUREUkVTUyAgICAgICBSQ0NfQ1JfQllURTJfQUREUkVTUworI2RlZmluZSBDSVJfQllURTFfQUREUkVTUyAgICAgIFJDQ19DSVJfQllURTFfQUREUkVTUworI2RlZmluZSBDSVJfQllURTJfQUREUkVTUyAgICAgIFJDQ19DSVJfQllURTJfQUREUkVTUworI2RlZmluZSBCRENSX0JZVEUwX0FERFJFU1MgICAgIFJDQ19CRENSX0JZVEUwX0FERFJFU1MKKyNkZWZpbmUgREJQX1RJTUVPVVRfVkFMVUUgICAgICBSQ0NfREJQX1RJTUVPVVRfVkFMVUUKKyNkZWZpbmUgTFNFX1RJTUVPVVRfVkFMVUUgICAgICBSQ0NfTFNFX1RJTUVPVVRfVkFMVUUKKworI2RlZmluZSBDUl9IU0lPTl9CQiAgICAgICAgICAgIFJDQ19DUl9IU0lPTl9CQgorI2RlZmluZSBDUl9DU1NPTl9CQiAgICAgICAgICAgIFJDQ19DUl9DU1NPTl9CQgorI2RlZmluZSBDUl9QTExPTl9CQiAgICAgICAgICAgIFJDQ19DUl9QTExPTl9CQgorI2RlZmluZSBDUl9QTExJMlNPTl9CQiAgICAgICAgIFJDQ19DUl9QTExJMlNPTl9CQgorI2RlZmluZSBDUl9NU0lPTl9CQiAgICAgICAgICAgIFJDQ19DUl9NU0lPTl9CQgorI2RlZmluZSBDU1JfTFNJT05fQkIgICAgICAgICAgIFJDQ19DU1JfTFNJT05fQkIKKyNkZWZpbmUgQ1NSX0xTRU9OX0JCICAgICAgICAgICBSQ0NfQ1NSX0xTRU9OX0JCCisjZGVmaW5lIENTUl9MU0VCWVBfQkIgICAgICAgICAgUkNDX0NTUl9MU0VCWVBfQkIKKyNkZWZpbmUgQ1NSX1JUQ0VOX0JCICAgICAgICAgICBSQ0NfQ1NSX1JUQ0VOX0JCCisjZGVmaW5lIENTUl9SVENSU1RfQkIgICAgICAgICAgUkNDX0NTUl9SVENSU1RfQkIKKyNkZWZpbmUgQ0ZHUl9JMlNTUkNfQkIgICAgICAgICBSQ0NfQ0ZHUl9JMlNTUkNfQkIKKyNkZWZpbmUgQkRDUl9SVENFTl9CQiAgICAgICAgICBSQ0NfQkRDUl9SVENFTl9CQgorI2RlZmluZSBCRENSX0JEUlNUX0JCICAgICAgICAgIFJDQ19CRENSX0JEUlNUX0JCCisjZGVmaW5lIENSX0hTRU9OX0JCICAgICAgICAgICAgUkNDX0NSX0hTRU9OX0JCCisjZGVmaW5lIENTUl9STVZGX0JCICAgICAgICAgICAgUkNDX0NTUl9STVZGX0JCCisjZGVmaW5lIENSX1BMTFNBSU9OX0JCICAgICAgICAgUkNDX0NSX1BMTFNBSU9OX0JCCisjZGVmaW5lIERDS0NGR1JfVElNUFJFX0JCICAgICAgUkNDX0RDS0NGR1JfVElNUFJFX0JCCisKKyNkZWZpbmUgX19IQUxfUkNDX0NSU19FTkFCTEVfRlJFUV9FUlJPUl9DT1VOVEVSICAgICBfX0hBTF9SQ0NfQ1JTX0ZSRVFfRVJST1JfQ09VTlRFUl9FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX0NSU19ESVNBQkxFX0ZSRVFfRVJST1JfQ09VTlRFUiAgICBfX0hBTF9SQ0NfQ1JTX0ZSRVFfRVJST1JfQ09VTlRFUl9ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfRU5BQkxFX0FVVE9NQVRJQ19DQUxJQiAgICAgICAgX19IQUxfUkNDX0NSU19BVVRPTUFUSUNfQ0FMSUJfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfRElTQUJMRV9BVVRPTUFUSUNfQ0FMSUIgICAgICAgX19IQUxfUkNDX0NSU19BVVRPTUFUSUNfQ0FMSUJfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0NBTENVTEFURV9SRUxPQURWQUxVRSAgICAgICAgIF9fSEFMX1JDQ19DUlNfUkVMT0FEVkFMVUVfQ0FMQ1VMQVRFCisKKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9JVF9TT1VSQ0UgICAgICAgICAgICAgICAgICAgICBfX0hBTF9SQ0NfR0VUX0lUCisKKyNkZWZpbmUgUkNDX0NSU19TWU5DV0FSTSAgICAgICBSQ0NfQ1JTX1NZTkNXQVJOCisjZGVmaW5lIFJDQ19DUlNfVFJJTU9WICAgICAgICAgUkNDX0NSU19UUklNT1ZGCisKKyNkZWZpbmUgUkNDX1BFUklQSENMS19DSzQ4ICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19DTEs0OAorI2RlZmluZSBSQ0NfQ0s0OENMS1NPVVJDRV9QTExRICAgICAgICAgICBSQ0NfQ0xLNDhDTEtTT1VSQ0VfUExMUQorI2RlZmluZSBSQ0NfQ0s0OENMS1NPVVJDRV9QTExTQUlQICAgICAgICBSQ0NfQ0xLNDhDTEtTT1VSQ0VfUExMU0FJUAorI2RlZmluZSBSQ0NfQ0s0OENMS1NPVVJDRV9QTExJMlNRICAgICAgICBSQ0NfQ0xLNDhDTEtTT1VSQ0VfUExMSTJTUQorI2RlZmluZSBJU19SQ0NfQ0s0OENMS1NPVVJDRSAgICAgICAgICAgICBJU19SQ0NfQ0xLNDhDTEtTT1VSQ0UKKyNkZWZpbmUgUkNDX1NESU9DTEtTT1VSQ0VfQ0s0OCAgICAgICAgICAgUkNDX1NESU9DTEtTT1VSQ0VfQ0xLNDgKKworI2RlZmluZSBfX0hBTF9SQ0NfREZTRE1fQ0xLX0VOQUJMRSAgICAgICAgICAgICBfX0hBTF9SQ0NfREZTRE0xX0NMS19FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX0RGU0RNX0NMS19ESVNBQkxFICAgICAgICAgICAgX19IQUxfUkNDX0RGU0RNMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfREZTRE1fSVNfQ0xLX0VOQUJMRUQgICAgICAgICBfX0hBTF9SQ0NfREZTRE0xX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fSEFMX1JDQ19ERlNETV9JU19DTEtfRElTQUJMRUQgICAgICAgIF9fSEFMX1JDQ19ERlNETTFfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fSEFMX1JDQ19ERlNETV9GT1JDRV9SRVNFVCAgICAgICAgICAgIF9fSEFMX1JDQ19ERlNETTFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX0RGU0RNX1JFTEVBU0VfUkVTRVQgICAgICAgICAgX19IQUxfUkNDX0RGU0RNMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fSEFMX1JDQ19ERlNETV9DTEtfU0xFRVBfRU5BQkxFICAgICAgIF9fSEFMX1JDQ19ERlNETTFfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfREZTRE1fQ0xLX1NMRUVQX0RJU0FCTEUgICAgICBfX0hBTF9SQ0NfREZTRE0xX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19ERlNETV9JU19DTEtfU0xFRVBfRU5BQkxFRCAgIF9fSEFMX1JDQ19ERlNETTFfSVNfQ0xLX1NMRUVQX0VOQUJMRUQKKyNkZWZpbmUgX19IQUxfUkNDX0RGU0RNX0lTX0NMS19TTEVFUF9ESVNBQkxFRCAgX19IQUxfUkNDX0RGU0RNMV9JU19DTEtfU0xFRVBfRElTQUJMRUQKKyNkZWZpbmUgRGZzZG1DbG9ja1NlbGVjdGlvbiAgICAgICAgIERmc2RtMUNsb2NrU2VsZWN0aW9uCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfREZTRE0gICAgICAgICBSQ0NfUEVSSVBIQ0xLX0RGU0RNMQorI2RlZmluZSBSQ0NfREZTRE1DTEtTT1VSQ0VfUENMSyAgICAgUkNDX0RGU0RNMUNMS1NPVVJDRV9QQ0xLMgorI2RlZmluZSBSQ0NfREZTRE1DTEtTT1VSQ0VfU1lTQ0xLICAgUkNDX0RGU0RNMUNMS1NPVVJDRV9TWVNDTEsKKyNkZWZpbmUgX19IQUxfUkNDX0RGU0RNX0NPTkZJRyAgICAgIF9fSEFMX1JDQ19ERlNETTFfQ09ORklHCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfREZTRE1fU09VUkNFICBfX0hBTF9SQ0NfR0VUX0RGU0RNMV9TT1VSQ0UKKyNkZWZpbmUgUkNDX0RGU0RNMUNMS1NPVVJDRV9QQ0xLICAgIFJDQ19ERlNETTFDTEtTT1VSQ0VfUENMSzIKKyNkZWZpbmUgUkNDX1NXUE1JMUNMS1NPVVJDRV9QQ0xLICAgIFJDQ19TV1BNSTFDTEtTT1VSQ0VfUENMSzEKKyNkZWZpbmUgUkNDX0xQVElNMUNMS1NPVVJDRV9QQ0xLICAgIFJDQ19MUFRJTTFDTEtTT1VSQ0VfUENMSzEKKyNkZWZpbmUgUkNDX0xQVElNMkNMS1NPVVJDRV9QQ0xLICAgIFJDQ19MUFRJTTJDTEtTT1VSQ0VfUENMSzEKKworI2RlZmluZSBSQ0NfREZTRE0xQVVESU9DTEtTT1VSQ0VfSTJTQVBCMSAgICBSQ0NfREZTRE0xQVVESU9DTEtTT1VSQ0VfSTJTMQorI2RlZmluZSBSQ0NfREZTRE0xQVVESU9DTEtTT1VSQ0VfSTJTQVBCMiAgICBSQ0NfREZTRE0xQVVESU9DTEtTT1VSQ0VfSTJTMgorI2RlZmluZSBSQ0NfREZTRE0yQVVESU9DTEtTT1VSQ0VfSTJTQVBCMSAgICBSQ0NfREZTRE0yQVVESU9DTEtTT1VSQ0VfSTJTMQorI2RlZmluZSBSQ0NfREZTRE0yQVVESU9DTEtTT1VSQ0VfSTJTQVBCMiAgICBSQ0NfREZTRE0yQVVESU9DTEtTT1VSQ0VfSTJTMgorI2RlZmluZSBSQ0NfREZTRE0xQ0xLU09VUkNFX0FQQjIgICAgICAgICAgICBSQ0NfREZTRE0xQ0xLU09VUkNFX1BDTEsyCisjZGVmaW5lIFJDQ19ERlNETTJDTEtTT1VSQ0VfQVBCMiAgICAgICAgICAgIFJDQ19ERlNETTJDTEtTT1VSQ0VfUENMSzIKKyNkZWZpbmUgUkNDX0ZNUEkyQzFDTEtTT1VSQ0VfQVBCICAgICAgICAgICAgUkNDX0ZNUEkyQzFDTEtTT1VSQ0VfUENMSzEKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfUk5HX0FsaWFzZWRfTWFjcm9zIEhBTCBSTkcgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSAgSEFMX1JOR19SZWFkeUNhbGxiYWNrKF9fSEFORExFX18pICBIQUxfUk5HX1JlYWR5RGF0YUNhbGxiYWNrKChfX0hBTkRMRV9fKSwgdWludDMyX3QgcmFuZG9tMzJiaXQpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1JUQ19BbGlhc2VkX01hY3JvcyBIQUwgUlRDIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkIChTVE0zMkcwKSB8fCBkZWZpbmVkIChTVE0zMkw1KSB8fCBkZWZpbmVkIChTVE0zMkw0MTJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMNDIyeHgpIHx8IGRlZmluZWQgKFNUTTMyV0wpCisjZWxzZQorI2RlZmluZSBfX0hBTF9SVENfQ0xFQVJfRkxBRyAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9SVENfRVhUSV9DTEVBUl9GTEFHCisjZW5kaWYKKyNkZWZpbmUgX19IQUxfUlRDX0RJU0FCTEVfSVQgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUlRDX0VYVElfRElTQUJMRV9JVAorI2RlZmluZSBfX0hBTF9SVENfRU5BQkxFX0lUICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9SVENfRVhUSV9FTkFCTEVfSVQKKworI2lmIGRlZmluZWQgKFNUTTMyRjEpCisjZGVmaW5lIF9fSEFMX1JUQ19FWFRJX0NMRUFSX0ZMQUcoUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkgIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0NMRUFSX0ZMQUcoKQorCisjZGVmaW5lIF9fSEFMX1JUQ19FWFRJX0VOQUJMRV9JVChSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKSAgIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0VOQUJMRV9JVCgpCisKKyNkZWZpbmUgX19IQUxfUlRDX0VYVElfRElTQUJMRV9JVChSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKSAgX19IQUxfUlRDX0FMQVJNX0VYVElfRElTQUJMRV9JVCgpCisKKyNkZWZpbmUgX19IQUxfUlRDX0VYVElfR0VUX0ZMQUcoUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkgICAgX19IQUxfUlRDX0FMQVJNX0VYVElfR0VUX0ZMQUcoKQorCisjZGVmaW5lIF9fSEFMX1JUQ19FWFRJX0dFTkVSQVRFX1NXSVQoUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkgICBfX0hBTF9SVENfQUxBUk1fRVhUSV9HRU5FUkFURV9TV0lUKCkKKyNlbHNlCisjZGVmaW5lIF9fSEFMX1JUQ19FWFRJX0NMRUFSX0ZMQUcoX19FWFRJX0xJTkVfXykgICgoKF9fRVhUSV9MSU5FX18pID09IFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpID8gX19IQUxfUlRDX0FMQVJNX0VYVElfQ0xFQVJfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19FWFRJX0xJTkVfXykgPT0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkgPyBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9DTEVBUl9GTEFHKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9SVENfVEFNUEVSX1RJTUVTVEFNUF9FWFRJX0NMRUFSX0ZMQUcoKSkpCisjZGVmaW5lIF9fSEFMX1JUQ19FWFRJX0VOQUJMRV9JVChfX0VYVElfTElORV9fKSAgICgoKF9fRVhUSV9MSU5FX18pICA9PSBSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKSA/IF9fSEFMX1JUQ19BTEFSTV9FWFRJX0VOQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0VYVElfTElORV9fKSA9PSBSVENfRVhUSV9MSU5FX1dBS0VVUFRJTUVSX0VWRU5UKSA/IF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0VOQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9FTkFCTEVfSVQoKSkpCisjZGVmaW5lIF9fSEFMX1JUQ19FWFRJX0RJU0FCTEVfSVQoX19FWFRJX0xJTkVfXykgICgoKF9fRVhUSV9MSU5FX18pID09IFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpID8gX19IQUxfUlRDX0FMQVJNX0VYVElfRElTQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0VYVElfTElORV9fKSA9PSBSVENfRVhUSV9MSU5FX1dBS0VVUFRJTUVSX0VWRU5UKSA/IF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0RJU0FCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfRElTQUJMRV9JVCgpKSkKKyNkZWZpbmUgX19IQUxfUlRDX0VYVElfR0VUX0ZMQUcoX19FWFRJX0xJTkVfXykgICAgKCgoX19FWFRJX0xJTkVfXykgPT0gUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkgPyBfX0hBTF9SVENfQUxBUk1fRVhUSV9HRVRfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0VYVElfTElORV9fKSA9PSBSVENfRVhUSV9MSU5FX1dBS0VVUFRJTUVSX0VWRU5UKSA/IF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0dFVF9GTEFHKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9SVENfVEFNUEVSX1RJTUVTVEFNUF9FWFRJX0dFVF9GTEFHKCkpKQorI2RlZmluZSBfX0hBTF9SVENfRVhUSV9HRU5FUkFURV9TV0lUKF9fRVhUSV9MSU5FX18pICAgKCgoX19FWFRJX0xJTkVfXykgPT0gUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkgPyBfX0hBTF9SVENfQUxBUk1fRVhUSV9HRU5FUkFURV9TV0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0VYVElfTElORV9fKSA9PSBSVENfRVhUSV9MSU5FX1dBS0VVUFRJTUVSX0VWRU5UKSA/IF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0dFTkVSQVRFX1NXSVQoKSA6ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9HRU5FUkFURV9TV0lUKCkpKQorI2VuZGlmICAgLyogU1RNMzJGMSAqLworCisjZGVmaW5lIElTX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTX1JUQ19BTEFSTQorI2RlZmluZSBJU19BTEFSTV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU19SVENfQUxBUk1fTUFTSworI2RlZmluZSBJU19UQU1QRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU19SVENfVEFNUEVSCisjZGVmaW5lIElTX1RBTVBFUl9FUkFTRV9NT0RFICAgICAgICAgICAgICAgICAgICAgIElTX1JUQ19UQU1QRVJfRVJBU0VfTU9ERQorI2RlZmluZSBJU19UQU1QRVJfRklMVEVSICAgICAgICAgICAgICAgICAgICAgICAgICBJU19SVENfVEFNUEVSX0ZJTFRFUgorI2RlZmluZSBJU19UQU1QRVJfSU5URVJSVVBUICAgICAgICAgICAgICAgICAgICAgICBJU19SVENfVEFNUEVSX0lOVEVSUlVQVAorI2RlZmluZSBJU19UQU1QRVJfTUFTS0ZMQUdfU1RBVEUgICAgICAgICAgICAgICAgICBJU19SVENfVEFNUEVSX01BU0tGTEFHX1NUQVRFCisjZGVmaW5lIElTX1RBTVBFUl9QUkVDSEFSR0VfRFVSQVRJT04gICAgICAgICAgICAgIElTX1JUQ19UQU1QRVJfUFJFQ0hBUkdFX0RVUkFUSU9OCisjZGVmaW5lIElTX1RBTVBFUl9QVUxMVVBfU1RBVEUgICAgICAgICAgICAgICAgICAgIElTX1JUQ19UQU1QRVJfUFVMTFVQX1NUQVRFCisjZGVmaW5lIElTX1RBTVBFUl9TQU1QTElOR19GUkVRICAgICAgICAgICAgICAgICAgIElTX1JUQ19UQU1QRVJfU0FNUExJTkdfRlJFUQorI2RlZmluZSBJU19UQU1QRVJfVElNRVNUQU1QT05UQU1QRVJfREVURUNUSU9OICAgICBJU19SVENfVEFNUEVSX1RJTUVTVEFNUE9OVEFNUEVSX0RFVEVDVElPTgorI2RlZmluZSBJU19UQU1QRVJfVFJJR0dFUiAgICAgICAgICAgICAgICAgICAgICAgICBJU19SVENfVEFNUEVSX1RSSUdHRVIKKyNkZWZpbmUgSVNfV0FLRVVQX0NMT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfUlRDX1dBS0VVUF9DTE9DSworI2RlZmluZSBJU19XQUtFVVBfQ09VTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICBJU19SVENfV0FLRVVQX0NPVU5URVIKKworI2RlZmluZSBfX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRQorI2RlZmluZSBfX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRSAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1NEX0FsaWFzZWRfTWFjcm9zIEhBTCBTRCBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgU0RfT0NSX0NJRF9DU0RfT1ZFUldSSUVURSAgIFNEX09DUl9DSURfQ1NEX09WRVJXUklURQorI2RlZmluZSBTRF9DTURfU0RfQVBQX1NUQVVTICAgICAgICAgU0RfQ01EX1NEX0FQUF9TVEFUVVMKKworI2lmIGRlZmluZWQoU1RNMzJGNCkgfHwgZGVmaW5lZChTVE0zMkYyKQorI2RlZmluZSAgU0RfU0RNTUNfRElTQUJMRUQgICAgICAgICAgU0RfU0RJT19ESVNBQkxFRAorI2RlZmluZSAgU0RfU0RNTUNfRlVOQ1RJT05fQlVTWSAgICAgU0RfU0RJT19GVU5DVElPTl9CVVNZCisjZGVmaW5lICBTRF9TRE1NQ19GVU5DVElPTl9GQUlMRUQgICBTRF9TRElPX0ZVTkNUSU9OX0ZBSUxFRAorI2RlZmluZSAgU0RfU0RNTUNfVU5LTk9XTl9GVU5DVElPTiAgU0RfU0RJT19VTktOT1dOX0ZVTkNUSU9OCisjZGVmaW5lICBTRF9DTURfU0RNTUNfU0VOX09QX0NPTkQgICBTRF9DTURfU0RJT19TRU5fT1BfQ09ORAorI2RlZmluZSAgU0RfQ01EX1NETU1DX1JXX0RJUkVDVCAgICAgU0RfQ01EX1NESU9fUldfRElSRUNUCisjZGVmaW5lICBTRF9DTURfU0RNTUNfUldfRVhURU5ERUQgICBTRF9DTURfU0RJT19SV19FWFRFTkRFRAorI2RlZmluZSAgX19IQUxfU0RfU0RNTUNfRU5BQkxFICAgICAgX19IQUxfU0RfU0RJT19FTkFCTEUKKyNkZWZpbmUgIF9fSEFMX1NEX1NETU1DX0RJU0FCTEUgICAgIF9fSEFMX1NEX1NESU9fRElTQUJMRQorI2RlZmluZSAgX19IQUxfU0RfU0RNTUNfRE1BX0VOQUJMRSAgX19IQUxfU0RfU0RJT19ETUFfRU5BQkxFCisjZGVmaW5lICBfX0hBTF9TRF9TRE1NQ19ETUFfRElTQUJMRSBfX0hBTF9TRF9TRElPX0RNQV9ESVNBQkwKKyNkZWZpbmUgIF9fSEFMX1NEX1NETU1DX0VOQUJMRV9JVCAgIF9fSEFMX1NEX1NESU9fRU5BQkxFX0lUCisjZGVmaW5lICBfX0hBTF9TRF9TRE1NQ19ESVNBQkxFX0lUICBfX0hBTF9TRF9TRElPX0RJU0FCTEVfSVQKKyNkZWZpbmUgIF9fSEFMX1NEX1NETU1DX0dFVF9GTEFHICAgIF9fSEFMX1NEX1NESU9fR0VUX0ZMQUcKKyNkZWZpbmUgIF9fSEFMX1NEX1NETU1DX0NMRUFSX0ZMQUcgIF9fSEFMX1NEX1NESU9fQ0xFQVJfRkxBRworI2RlZmluZSAgX19IQUxfU0RfU0RNTUNfR0VUX0lUICAgICAgX19IQUxfU0RfU0RJT19HRVRfSVQKKyNkZWZpbmUgIF9fSEFMX1NEX1NETU1DX0NMRUFSX0lUICAgIF9fSEFMX1NEX1NESU9fQ0xFQVJfSVQKKyNkZWZpbmUgIFNETU1DX1NUQVRJQ19GTEFHUyAgICAgICAgIFNESU9fU1RBVElDX0ZMQUdTCisjZGVmaW5lICBTRE1NQ19DTUQwVElNRU9VVCAgICAgICAgICBTRElPX0NNRDBUSU1FT1VUCisjZGVmaW5lICBTRF9TRE1NQ19TRU5EX0lGX0NPTkQgICAgICBTRF9TRElPX1NFTkRfSUZfQ09ORAorLyogYWxpYXMgQ01TSVMgKi8KKyNkZWZpbmUgIFNETU1DMV9JUlFuICAgICAgICAgICAgICAgIFNESU9fSVJRbgorI2RlZmluZSAgU0RNTUMxX0lSUUhhbmRsZXIgICAgICAgICAgU0RJT19JUlFIYW5kbGVyCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJGNykgfHwgZGVmaW5lZChTVE0zMkw0KQorI2RlZmluZSAgU0RfU0RJT19ESVNBQkxFRCAgICAgICAgICAgU0RfU0RNTUNfRElTQUJMRUQKKyNkZWZpbmUgIFNEX1NESU9fRlVOQ1RJT05fQlVTWSAgICAgIFNEX1NETU1DX0ZVTkNUSU9OX0JVU1kKKyNkZWZpbmUgIFNEX1NESU9fRlVOQ1RJT05fRkFJTEVEICAgIFNEX1NETU1DX0ZVTkNUSU9OX0ZBSUxFRAorI2RlZmluZSAgU0RfU0RJT19VTktOT1dOX0ZVTkNUSU9OICAgU0RfU0RNTUNfVU5LTk9XTl9GVU5DVElPTgorI2RlZmluZSAgU0RfQ01EX1NESU9fU0VOX09QX0NPTkQgICAgU0RfQ01EX1NETU1DX1NFTl9PUF9DT05ECisjZGVmaW5lICBTRF9DTURfU0RJT19SV19ESVJFQ1QgICAgICBTRF9DTURfU0RNTUNfUldfRElSRUNUCisjZGVmaW5lICBTRF9DTURfU0RJT19SV19FWFRFTkRFRCAgICBTRF9DTURfU0RNTUNfUldfRVhURU5ERUQKKyNkZWZpbmUgIF9fSEFMX1NEX1NESU9fRU5BQkxFICAgICAgIF9fSEFMX1NEX1NETU1DX0VOQUJMRQorI2RlZmluZSAgX19IQUxfU0RfU0RJT19ESVNBQkxFICAgICAgX19IQUxfU0RfU0RNTUNfRElTQUJMRQorI2RlZmluZSAgX19IQUxfU0RfU0RJT19ETUFfRU5BQkxFICAgX19IQUxfU0RfU0RNTUNfRE1BX0VOQUJMRQorI2RlZmluZSAgX19IQUxfU0RfU0RJT19ETUFfRElTQUJMICAgX19IQUxfU0RfU0RNTUNfRE1BX0RJU0FCTEUKKyNkZWZpbmUgIF9fSEFMX1NEX1NESU9fRU5BQkxFX0lUICAgIF9fSEFMX1NEX1NETU1DX0VOQUJMRV9JVAorI2RlZmluZSAgX19IQUxfU0RfU0RJT19ESVNBQkxFX0lUICAgX19IQUxfU0RfU0RNTUNfRElTQUJMRV9JVAorI2RlZmluZSAgX19IQUxfU0RfU0RJT19HRVRfRkxBRyAgICAgX19IQUxfU0RfU0RNTUNfR0VUX0ZMQUcKKyNkZWZpbmUgIF9fSEFMX1NEX1NESU9fQ0xFQVJfRkxBRyAgIF9fSEFMX1NEX1NETU1DX0NMRUFSX0ZMQUcKKyNkZWZpbmUgIF9fSEFMX1NEX1NESU9fR0VUX0lUICAgICAgIF9fSEFMX1NEX1NETU1DX0dFVF9JVAorI2RlZmluZSAgX19IQUxfU0RfU0RJT19DTEVBUl9JVCAgICAgX19IQUxfU0RfU0RNTUNfQ0xFQVJfSVQKKyNkZWZpbmUgIFNESU9fU1RBVElDX0ZMQUdTCSAgICAgICAgU0RNTUNfU1RBVElDX0ZMQUdTCisjZGVmaW5lICBTRElPX0NNRDBUSU1FT1VUCSAgICAgICAgICBTRE1NQ19DTUQwVElNRU9VVAorI2RlZmluZSAgU0RfU0RJT19TRU5EX0lGX0NPTkQJICAgICAgU0RfU0RNTUNfU0VORF9JRl9DT05ECisvKiBhbGlhcyBDTVNJUyBmb3IgY29tcGF0aWJpbGl0aWVzICovCisjZGVmaW5lICBTRElPX0lSUW4gICAgICAgICAgICAgICAgICBTRE1NQzFfSVJRbgorI2RlZmluZSAgU0RJT19JUlFIYW5kbGVyICAgICAgICAgICAgU0RNTUMxX0lSUUhhbmRsZXIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkY3KSB8fCBkZWZpbmVkKFNUTTMyRjQpIHx8IGRlZmluZWQoU1RNMzJGMikKKyNkZWZpbmUgIEhBTF9TRF9DYXJkQ0lEVHlwZWRlZiAgICAgICBIQUxfU0RfQ2FyZENJRFR5cGVEZWYKKyNkZWZpbmUgIEhBTF9TRF9DYXJkQ1NEVHlwZWRlZiAgICAgICBIQUxfU0RfQ2FyZENTRFR5cGVEZWYKKyNkZWZpbmUgIEhBTF9TRF9DYXJkU3RhdHVzVHlwZWRlZiAgICBIQUxfU0RfQ2FyZFN0YXR1c1R5cGVEZWYKKyNkZWZpbmUgIEhBTF9TRF9DYXJkU3RhdGVUeXBlZGVmICAgICBIQUxfU0RfQ2FyZFN0YXRlVHlwZURlZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUTTMySDcpCisjZGVmaW5lIEhBTF9NTUNFeF9SZWFkX0RNQURvdWJsZUJ1ZmZlcjBDcGx0Q2FsbGJhY2sgICBIQUxfTU1DRXhfUmVhZF9ETUFEb3VibGVCdWYwQ3BsdENhbGxiYWNrCisjZGVmaW5lIEhBTF9NTUNFeF9SZWFkX0RNQURvdWJsZUJ1ZmZlcjFDcGx0Q2FsbGJhY2sgICBIQUxfTU1DRXhfUmVhZF9ETUFEb3VibGVCdWYxQ3BsdENhbGxiYWNrCisjZGVmaW5lIEhBTF9NTUNFeF9Xcml0ZV9ETUFEb3VibGVCdWZmZXIwQ3BsdENhbGxiYWNrICBIQUxfTU1DRXhfV3JpdGVfRE1BRG91YmxlQnVmMENwbHRDYWxsYmFjaworI2RlZmluZSBIQUxfTU1DRXhfV3JpdGVfRE1BRG91YmxlQnVmZmVyMUNwbHRDYWxsYmFjayAgSEFMX01NQ0V4X1dyaXRlX0RNQURvdWJsZUJ1ZjFDcGx0Q2FsbGJhY2sKKyNkZWZpbmUgSEFMX1NERXhfUmVhZF9ETUFEb3VibGVCdWZmZXIwQ3BsdENhbGxiYWNrICAgIEhBTF9TREV4X1JlYWRfRE1BRG91YmxlQnVmMENwbHRDYWxsYmFjaworI2RlZmluZSBIQUxfU0RFeF9SZWFkX0RNQURvdWJsZUJ1ZmZlcjFDcGx0Q2FsbGJhY2sgICAgSEFMX1NERXhfUmVhZF9ETUFEb3VibGVCdWYxQ3BsdENhbGxiYWNrCisjZGVmaW5lIEhBTF9TREV4X1dyaXRlX0RNQURvdWJsZUJ1ZmZlcjBDcGx0Q2FsbGJhY2sgICBIQUxfU0RFeF9Xcml0ZV9ETUFEb3VibGVCdWYwQ3BsdENhbGxiYWNrCisjZGVmaW5lIEhBTF9TREV4X1dyaXRlX0RNQURvdWJsZUJ1ZmZlcjFDcGx0Q2FsbGJhY2sgICBIQUxfU0RFeF9Xcml0ZV9ETUFEb3VibGVCdWYxQ3BsdENhbGxiYWNrCisjZGVmaW5lIEhBTF9TRF9Ecml2ZVRyYW5zY2l2ZXJfMV84Vl9DYWxsYmFjayAgICAgICAgICBIQUxfU0RfRHJpdmVUcmFuc2NlaXZlcl8xXzhWX0NhbGxiYWNrCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1NNQVJUQ0FSRF9BbGlhc2VkX01hY3JvcyBIQUwgU01BUlRDQVJEIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBfX1NNQVJUQ0FSRF9FTkFCTEVfSVQgICAgICAgICAgIF9fSEFMX1NNQVJUQ0FSRF9FTkFCTEVfSVQKKyNkZWZpbmUgX19TTUFSVENBUkRfRElTQUJMRV9JVCAgICAgICAgICBfX0hBTF9TTUFSVENBUkRfRElTQUJMRV9JVAorI2RlZmluZSBfX1NNQVJUQ0FSRF9FTkFCTEUgICAgICAgICAgICAgIF9fSEFMX1NNQVJUQ0FSRF9FTkFCTEUKKyNkZWZpbmUgX19TTUFSVENBUkRfRElTQUJMRSAgICAgICAgICAgICBfX0hBTF9TTUFSVENBUkRfRElTQUJMRQorI2RlZmluZSBfX1NNQVJUQ0FSRF9ETUFfUkVRVUVTVF9FTkFCTEUgIF9fSEFMX1NNQVJUQ0FSRF9ETUFfUkVRVUVTVF9FTkFCTEUKKyNkZWZpbmUgX19TTUFSVENBUkRfRE1BX1JFUVVFU1RfRElTQUJMRSBfX0hBTF9TTUFSVENBUkRfRE1BX1JFUVVFU1RfRElTQUJMRQorCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9HRVRDTE9DS1NPVVJDRSAgU01BUlRDQVJEX0dFVENMT0NLU09VUkNFCisjZGVmaW5lIF9fU01BUlRDQVJEX0dFVENMT0NLU09VUkNFICAgICAgU01BUlRDQVJEX0dFVENMT0NLU09VUkNFCisKKyNkZWZpbmUgSVNfU01BUlRDQVJEX09ORUJJVF9TQU1QTElORyAgICBJU19TTUFSVENBUkRfT05FX0JJVF9TQU1QTEUKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfU01CVVNfQWxpYXNlZF9NYWNyb3MgSEFMIFNNQlVTIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01CVVNfUkVTRVRfQ1IxICAgICAgICAgICBTTUJVU19SRVNFVF9DUjEKKyNkZWZpbmUgX19IQUxfU01CVVNfUkVTRVRfQ1IyICAgICAgICAgICBTTUJVU19SRVNFVF9DUjIKKyNkZWZpbmUgX19IQUxfU01CVVNfR0VORVJBVEVfU1RBUlQgICAgICBTTUJVU19HRU5FUkFURV9TVEFSVAorI2RlZmluZSBfX0hBTF9TTUJVU19HRVRfQUREUl9NQVRDSCAgICAgIFNNQlVTX0dFVF9BRERSX01BVENICisjZGVmaW5lIF9fSEFMX1NNQlVTX0dFVF9ESVIgICAgICAgICAgICAgU01CVVNfR0VUX0RJUgorI2RlZmluZSBfX0hBTF9TTUJVU19HRVRfU1RPUF9NT0RFICAgICAgIFNNQlVTX0dFVF9TVE9QX01PREUKKyNkZWZpbmUgX19IQUxfU01CVVNfR0VUX1BFQ19NT0RFICAgICAgICBTTUJVU19HRVRfUEVDX01PREUKKyNkZWZpbmUgX19IQUxfU01CVVNfR0VUX0FMRVJUX0VOQUJMRUQgICBTTUJVU19HRVRfQUxFUlRfRU5BQkxFRAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfU1BJX0FsaWFzZWRfTWFjcm9zIEhBTCBTUEkgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fSEFMX1NQSV8xTElORV9UWCAgICAgICAgICAgICAgU1BJXzFMSU5FX1RYCisjZGVmaW5lIF9fSEFMX1NQSV8xTElORV9SWCAgICAgICAgICAgICAgU1BJXzFMSU5FX1JYCisjZGVmaW5lIF9fSEFMX1NQSV9SRVNFVF9DUkMgICAgICAgICAgICAgU1BJX1JFU0VUX0NSQworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9VQVJUX0FsaWFzZWRfTWFjcm9zIEhBTCBVQVJUIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBfX0hBTF9VQVJUX0dFVENMT0NLU09VUkNFICAgICAgIFVBUlRfR0VUQ0xPQ0tTT1VSQ0UKKyNkZWZpbmUgX19IQUxfVUFSVF9NQVNLX0NPTVBVVEFUSU9OICAgICBVQVJUX01BU0tfQ09NUFVUQVRJT04KKyNkZWZpbmUgX19VQVJUX0dFVENMT0NLU09VUkNFICAgICAgICAgICBVQVJUX0dFVENMT0NLU09VUkNFCisjZGVmaW5lIF9fVUFSVF9NQVNLX0NPTVBVVEFUSU9OICAgICAgICAgVUFSVF9NQVNLX0NPTVBVVEFUSU9OCisKKyNkZWZpbmUgSVNfVUFSVF9XQUtFVVBNRVRIT0RFICAgICAgICAgICBJU19VQVJUX1dBS0VVUE1FVEhPRAorCisjZGVmaW5lIElTX1VBUlRfT05FQklUX1NBTVBMRSAgICAgICAgICAgSVNfVUFSVF9PTkVfQklUX1NBTVBMRQorI2RlZmluZSBJU19VQVJUX09ORUJJVF9TQU1QTElORyAgICAgICAgIElTX1VBUlRfT05FX0JJVF9TQU1QTEUKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIEhBTF9VU0FSVF9BbGlhc2VkX01hY3JvcyBIQUwgVVNBUlQgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fVVNBUlRfRU5BQkxFX0lUICAgICAgICAgICAgICAgX19IQUxfVVNBUlRfRU5BQkxFX0lUCisjZGVmaW5lIF9fVVNBUlRfRElTQUJMRV9JVCAgICAgICAgICAgICAgX19IQUxfVVNBUlRfRElTQUJMRV9JVAorI2RlZmluZSBfX1VTQVJUX0VOQUJMRSAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQVJUX0VOQUJMRQorI2RlZmluZSBfX1VTQVJUX0RJU0FCTEUgICAgICAgICAgICAgICAgIF9fSEFMX1VTQVJUX0RJU0FCTEUKKworI2RlZmluZSBfX0hBTF9VU0FSVF9HRVRDTE9DS1NPVVJDRSAgICAgIFVTQVJUX0dFVENMT0NLU09VUkNFCisjZGVmaW5lIF9fVVNBUlRfR0VUQ0xPQ0tTT1VSQ0UgICAgICAgICAgVVNBUlRfR0VUQ0xPQ0tTT1VSQ0UKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfVVNCX0FsaWFzZWRfTWFjcm9zIEhBTCBVU0IgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBVU0JfRVhUSV9MSU5FX1dBS0VVUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0JfV0FLRVVQX0VYVElfTElORQorCisjZGVmaW5lIFVTQl9GU19FWFRJX1RSSUdHRVJfUklTSU5HX0VER0UgICAgICAgICAgICAgICAgICAgIFVTQl9PVEdfRlNfV0FLRVVQX0VYVElfUklTSU5HX0VER0UKKyNkZWZpbmUgVVNCX0ZTX0VYVElfVFJJR0dFUl9GQUxMSU5HX0VER0UgICAgICAgICAgICAgICAgICAgVVNCX09UR19GU19XQUtFVVBfRVhUSV9GQUxMSU5HX0VER0UKKyNkZWZpbmUgVVNCX0ZTX0VYVElfVFJJR0dFUl9CT1RIX0VER0UgICAgICAgICAgICAgICAgICAgICAgVVNCX09UR19GU19XQUtFVVBfRVhUSV9SSVNJTkdfRkFMTElOR19FREdFCisjZGVmaW5lIFVTQl9GU19FWFRJX0xJTkVfV0FLRVVQICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQl9PVEdfRlNfV0FLRVVQX0VYVElfTElORQorCisjZGVmaW5lIFVTQl9IU19FWFRJX1RSSUdHRVJfUklTSU5HX0VER0UgICAgICAgICAgICAgICAgICAgIFVTQl9PVEdfSFNfV0FLRVVQX0VYVElfUklTSU5HX0VER0UKKyNkZWZpbmUgVVNCX0hTX0VYVElfVFJJR0dFUl9GQUxMSU5HX0VER0UgICAgICAgICAgICAgICAgICAgVVNCX09UR19IU19XQUtFVVBfRVhUSV9GQUxMSU5HX0VER0UKKyNkZWZpbmUgVVNCX0hTX0VYVElfVFJJR0dFUl9CT1RIX0VER0UgICAgICAgICAgICAgICAgICAgICAgVVNCX09UR19IU19XQUtFVVBfRVhUSV9SSVNJTkdfRkFMTElOR19FREdFCisjZGVmaW5lIFVTQl9IU19FWFRJX0xJTkVfV0FLRVVQICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQl9PVEdfSFNfV0FLRVVQX0VYVElfTElORQorCisjZGVmaW5lIF9fSEFMX1VTQl9FWFRJX0VOQUJMRV9JVCAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQl9XQUtFVVBfRVhUSV9FTkFCTEVfSVQKKyNkZWZpbmUgX19IQUxfVVNCX0VYVElfRElTQUJMRV9JVCAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfVVNCX1dBS0VVUF9FWFRJX0RJU0FCTEVfSVQKKyNkZWZpbmUgX19IQUxfVVNCX0VYVElfR0VUX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfVVNCX1dBS0VVUF9FWFRJX0dFVF9GTEFHCisjZGVmaW5lIF9fSEFMX1VTQl9FWFRJX0NMRUFSX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQl9XQUtFVVBfRVhUSV9DTEVBUl9GTEFHCisjZGVmaW5lIF9fSEFMX1VTQl9FWFRJX1NFVF9SSVNJTkdfRURHRV9UUklHR0VSICAgICAgICAgICAgIF9fSEFMX1VTQl9XQUtFVVBfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfVVNCX0VYVElfU0VUX0ZBTExJTkdfRURHRV9UUklHR0VSICAgICAgICAgICAgX19IQUxfVVNCX1dBS0VVUF9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfVVNCX0VYVElfU0VUX0ZBTExJTkdSSVNJTkdfVFJJR0dFUiAgICAgICAgICAgX19IQUxfVVNCX1dBS0VVUF9FWFRJX0VOQUJMRV9SSVNJTkdfRkFMTElOR19FREdFCisKKyNkZWZpbmUgX19IQUxfVVNCX0ZTX0VYVElfRU5BQkxFX0lUICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfVVNCX09UR19GU19XQUtFVVBfRVhUSV9FTkFCTEVfSVQKKyNkZWZpbmUgX19IQUxfVVNCX0ZTX0VYVElfRElTQUJMRV9JVCAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfVVNCX09UR19GU19XQUtFVVBfRVhUSV9ESVNBQkxFX0lUCisjZGVmaW5lIF9fSEFMX1VTQl9GU19FWFRJX0dFVF9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQl9PVEdfRlNfV0FLRVVQX0VYVElfR0VUX0ZMQUcKKyNkZWZpbmUgX19IQUxfVVNCX0ZTX0VYVElfQ0xFQVJfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfVVNCX09UR19GU19XQUtFVVBfRVhUSV9DTEVBUl9GTEFHCisjZGVmaW5lIF9fSEFMX1VTQl9GU19FWFRJX1NFVF9SSVNJTkdfRUdERV9UUklHR0VSICAgICAgICAgIF9fSEFMX1VTQl9PVEdfRlNfV0FLRVVQX0VYVElfRU5BQkxFX1JJU0lOR19FREdFCisjZGVmaW5lIF9fSEFMX1VTQl9GU19FWFRJX1NFVF9GQUxMSU5HX0VHREVfVFJJR0dFUiAgICAgICAgIF9fSEFMX1VTQl9PVEdfRlNfV0FLRVVQX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRQorI2RlZmluZSBfX0hBTF9VU0JfRlNfRVhUSV9TRVRfRkFMTElOR1JJU0lOR19UUklHR0VSICAgICAgICBfX0hBTF9VU0JfT1RHX0ZTX1dBS0VVUF9FWFRJX0VOQUJMRV9SSVNJTkdfRkFMTElOR19FREdFCisjZGVmaW5lIF9fSEFMX1VTQl9GU19FWFRJX0dFTkVSQVRFX1NXSVQgICAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQl9PVEdfRlNfV0FLRVVQX0VYVElfR0VORVJBVEVfU1dJVAorCisjZGVmaW5lIF9fSEFMX1VTQl9IU19FWFRJX0VOQUJMRV9JVCAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQl9PVEdfSFNfV0FLRVVQX0VYVElfRU5BQkxFX0lUCisjZGVmaW5lIF9fSEFMX1VTQl9IU19FWFRJX0RJU0FCTEVfSVQgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQl9PVEdfSFNfV0FLRVVQX0VYVElfRElTQUJMRV9JVAorI2RlZmluZSBfX0hBTF9VU0JfSFNfRVhUSV9HRVRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9VU0JfT1RHX0hTX1dBS0VVUF9FWFRJX0dFVF9GTEFHCisjZGVmaW5lIF9fSEFMX1VTQl9IU19FWFRJX0NMRUFSX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQl9PVEdfSFNfV0FLRVVQX0VYVElfQ0xFQVJfRkxBRworI2RlZmluZSBfX0hBTF9VU0JfSFNfRVhUSV9TRVRfUklTSU5HX0VHREVfVFJJR0dFUiAgICAgICAgICBfX0hBTF9VU0JfT1RHX0hTX1dBS0VVUF9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRQorI2RlZmluZSBfX0hBTF9VU0JfSFNfRVhUSV9TRVRfRkFMTElOR19FR0RFX1RSSUdHRVIgICAgICAgICBfX0hBTF9VU0JfT1RHX0hTX1dBS0VVUF9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfVVNCX0hTX0VYVElfU0VUX0ZBTExJTkdSSVNJTkdfVFJJR0dFUiAgICAgICAgX19IQUxfVVNCX09UR19IU19XQUtFVVBfRVhUSV9FTkFCTEVfUklTSU5HX0ZBTExJTkdfRURHRQorI2RlZmluZSBfX0hBTF9VU0JfSFNfRVhUSV9HRU5FUkFURV9TV0lUICAgICAgICAgICAgICAgICAgICBfX0hBTF9VU0JfT1RHX0hTX1dBS0VVUF9FWFRJX0dFTkVSQVRFX1NXSVQKKworI2RlZmluZSBIQUxfUENEX0FjdGl2ZVJlbW90ZVdha2V1cCAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUENEX0FjdGl2YXRlUmVtb3RlV2FrZXVwCisjZGVmaW5lIEhBTF9QQ0RfRGVBY3RpdmVSZW1vdGVXYWtldXAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QQ0RfRGVBY3RpdmF0ZVJlbW90ZVdha2V1cAorCisjZGVmaW5lIEhBTF9QQ0RfU2V0VHhGaUZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QQ0RFeF9TZXRUeEZpRm8KKyNkZWZpbmUgSEFMX1BDRF9TZXRSeEZpRm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BDREV4X1NldFJ4RmlGbworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfVElNX0FsaWFzZWRfTWFjcm9zIEhBTCBUSU0gQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9USU1fU2V0SUNQcmVzY2FsZXJWYWx1ZSAgIFRJTV9TRVRfSUNQUkVTQ0FMRVJWQUxVRQorI2RlZmluZSBfX0hBTF9USU1fUmVzZXRJQ1ByZXNjYWxlclZhbHVlIFRJTV9SRVNFVF9JQ1BSRVNDQUxFUlZBTFVFCisKKyNkZWZpbmUgVElNX0dFVF9JVFNUQVRVUyAgICAgICAgICAgICAgICBfX0hBTF9USU1fR0VUX0lUX1NPVVJDRQorI2RlZmluZSBUSU1fR0VUX0NMRUFSX0lUICAgICAgICAgICAgICAgIF9fSEFMX1RJTV9DTEVBUl9JVAorCisjZGVmaW5lIF9fSEFMX1RJTV9HRVRfSVRTVEFUVVMgICAgICAgICAgX19IQUxfVElNX0dFVF9JVF9TT1VSQ0UKKworI2RlZmluZSBfX0hBTF9USU1fRElSRUNUSU9OX1NUQVRVUyAgICAgIF9fSEFMX1RJTV9JU19USU1fQ09VTlRJTkdfRE9XTgorI2RlZmluZSBfX0hBTF9USU1fUFJFU0NBTEVSICAgICAgICAgICAgIF9fSEFMX1RJTV9TRVRfUFJFU0NBTEVSCisjZGVmaW5lIF9fSEFMX1RJTV9TZXRDb3VudGVyICAgICAgICAgICAgX19IQUxfVElNX1NFVF9DT1VOVEVSCisjZGVmaW5lIF9fSEFMX1RJTV9HZXRDb3VudGVyICAgICAgICAgICAgX19IQUxfVElNX0dFVF9DT1VOVEVSCisjZGVmaW5lIF9fSEFMX1RJTV9TZXRBdXRvcmVsb2FkICAgICAgICAgX19IQUxfVElNX1NFVF9BVVRPUkVMT0FECisjZGVmaW5lIF9fSEFMX1RJTV9HZXRBdXRvcmVsb2FkICAgICAgICAgX19IQUxfVElNX0dFVF9BVVRPUkVMT0FECisjZGVmaW5lIF9fSEFMX1RJTV9TZXRDbG9ja0RpdmlzaW9uICAgICAgX19IQUxfVElNX1NFVF9DTE9DS0RJVklTSU9OCisjZGVmaW5lIF9fSEFMX1RJTV9HZXRDbG9ja0RpdmlzaW9uICAgICAgX19IQUxfVElNX0dFVF9DTE9DS0RJVklTSU9OCisjZGVmaW5lIF9fSEFMX1RJTV9TZXRJQ1ByZXNjYWxlciAgICAgICAgX19IQUxfVElNX1NFVF9JQ1BSRVNDQUxFUgorI2RlZmluZSBfX0hBTF9USU1fR2V0SUNQcmVzY2FsZXIgICAgICAgIF9fSEFMX1RJTV9HRVRfSUNQUkVTQ0FMRVIKKyNkZWZpbmUgX19IQUxfVElNX1NldENvbXBhcmUgICAgICAgICAgICBfX0hBTF9USU1fU0VUX0NPTVBBUkUKKyNkZWZpbmUgX19IQUxfVElNX0dldENvbXBhcmUgICAgICAgICAgICBfX0hBTF9USU1fR0VUX0NPTVBBUkUKKworI2RlZmluZSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9ERlNETSAgVElNX0JSRUFLSU5QVVRTT1VSQ0VfREZTRE0xCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9FVEhfQWxpYXNlZF9NYWNyb3MgSEFMIEVUSCBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgX19IQUxfRVRIX0VYVElfRU5BQkxFX0lUICAgICAgICAgICAgICAgICAgIF9fSEFMX0VUSF9XQUtFVVBfRVhUSV9FTkFCTEVfSVQKKyNkZWZpbmUgX19IQUxfRVRIX0VYVElfRElTQUJMRV9JVCAgICAgICAgICAgICAgICAgIF9fSEFMX0VUSF9XQUtFVVBfRVhUSV9ESVNBQkxFX0lUCisjZGVmaW5lIF9fSEFMX0VUSF9FWFRJX0dFVF9GTEFHICAgICAgICAgICAgICAgICAgICBfX0hBTF9FVEhfV0FLRVVQX0VYVElfR0VUX0ZMQUcKKyNkZWZpbmUgX19IQUxfRVRIX0VYVElfQ0xFQVJfRkxBRyAgICAgICAgICAgICAgICAgIF9fSEFMX0VUSF9XQUtFVVBfRVhUSV9DTEVBUl9GTEFHCisjZGVmaW5lIF9fSEFMX0VUSF9FWFRJX1NFVF9SSVNJTkdfRUdERV9UUklHR0VSICAgICBfX0hBTF9FVEhfV0FLRVVQX0VYVElfRU5BQkxFX1JJU0lOR19FREdFX1RSSUdHRVIKKyNkZWZpbmUgX19IQUxfRVRIX0VYVElfU0VUX0ZBTExJTkdfRUdERV9UUklHR0VSICAgIF9fSEFMX0VUSF9XQUtFVVBfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFX1RSSUdHRVIKKyNkZWZpbmUgX19IQUxfRVRIX0VYVElfU0VUX0ZBTExJTkdSSVNJTkdfVFJJR0dFUiAgIF9fSEFMX0VUSF9XQUtFVVBfRVhUSV9FTkFCTEVfRkFMTElOR1JJU0lOR19UUklHR0VSCisKKyNkZWZpbmUgRVRIX1BST01JU0NJT1VTTU9ERV9FTkFCTEUgICBFVEhfUFJPTUlTQ1VPVVNfTU9ERV9FTkFCTEUKKyNkZWZpbmUgRVRIX1BST01JU0NJT1VTTU9ERV9ESVNBQkxFICBFVEhfUFJPTUlTQ1VPVVNfTU9ERV9ESVNBQkxFCisjZGVmaW5lIElTX0VUSF9QUk9NSVNDSU9VU19NT0RFICAgICAgSVNfRVRIX1BST01JU0NVT1VTX01PREUKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0xURENfQWxpYXNlZF9NYWNyb3MgSEFMIExUREMgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9MVERDX0xBWUVSIExURENfTEFZRVIKKyNpZiBkZWZpbmVkKFNUTTMyRjcpCisjZWxzZQorI2RlZmluZSBfX0hBTF9MVERDX1JFTE9BRF9DT05GSUcgIF9fSEFMX0xURENfUkVMT0FEX0lNTUVESUFURV9DT05GSUcKKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfU0FJX0FsaWFzZWRfTWFjcm9zIEhBTCBTQUkgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBTQUlfT1VUUFVURFJJVkVfRElTQUJMRUQgICAgICAgICAgU0FJX09VVFBVVERSSVZFX0RJU0FCTEUKKyNkZWZpbmUgU0FJX09VVFBVVERSSVZFX0VOQUJMRUQgICAgICAgICAgIFNBSV9PVVRQVVREUklWRV9FTkFCTEUKKyNkZWZpbmUgU0FJX01BU1RFUkRJVklERVJfRU5BQkxFRCAgICAgICAgIFNBSV9NQVNURVJESVZJREVSX0VOQUJMRQorI2RlZmluZSBTQUlfTUFTVEVSRElWSURFUl9ESVNBQkxFRCAgICAgICAgU0FJX01BU1RFUkRJVklERVJfRElTQUJMRQorI2RlZmluZSBTQUlfU1RSRU9NT0RFICAgICAgICAgICAgICAgICAgICAgU0FJX1NURVJFT01PREUKKyNkZWZpbmUgU0FJX0ZJRk9TdGF0dXNfRW1wdHkgICAgICAgICAgICAgIFNBSV9GSUZPU1RBVFVTX0VNUFRZCisjZGVmaW5lIFNBSV9GSUZPU3RhdHVzX0xlc3MxUXVhcnRlckZ1bGwgICBTQUlfRklGT1NUQVRVU19MRVNTMVFVQVJURVJGVUxMCisjZGVmaW5lIFNBSV9GSUZPU3RhdHVzXzFRdWFydGVyRnVsbCAgICAgICBTQUlfRklGT1NUQVRVU18xUVVBUlRFUkZVTEwKKyNkZWZpbmUgU0FJX0ZJRk9TdGF0dXNfSGFsZkZ1bGwgICAgICAgICAgIFNBSV9GSUZPU1RBVFVTX0hBTEZGVUxMCisjZGVmaW5lIFNBSV9GSUZPU3RhdHVzXzNRdWFydGVyc0Z1bGwgICAgICBTQUlfRklGT1NUQVRVU18zUVVBUlRFUkZVTEwKKyNkZWZpbmUgU0FJX0ZJRk9TdGF0dXNfRnVsbCAgICAgICAgICAgICAgIFNBSV9GSUZPU1RBVFVTX0ZVTEwKKyNkZWZpbmUgSVNfU0FJX0JMT0NLX01PTk9fU1RSRU9fTU9ERSAgICAgIElTX1NBSV9CTE9DS19NT05PX1NURVJFT19NT0RFCisjZGVmaW5lIFNBSV9TWU5DSFJPTk9VU19FWFQgICAgICAgICAgICAgICBTQUlfU1lOQ0hST05PVVNfRVhUX1NBSTEKKyNkZWZpbmUgU0FJX1NZTkNFWFRfSU5fRU5BQkxFICAgICAgICAgICAgIFNBSV9TWU5DRVhUX09VVEJMT0NLQV9FTkFCTEUKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1NQRElGUlhfQWxpYXNlZF9NYWNyb3MgSEFMIFNQRElGUlggQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoU1RNMzJINykKKyNkZWZpbmUgSEFMX1NQRElGUlhfUmVjZWl2ZUNvbnRyb2xGbG93ICAgICAgSEFMX1NQRElGUlhfUmVjZWl2ZUN0cmxGbG93CisjZGVmaW5lIEhBTF9TUERJRlJYX1JlY2VpdmVDb250cm9sRmxvd19JVCAgIEhBTF9TUERJRlJYX1JlY2VpdmVDdHJsRmxvd19JVAorI2RlZmluZSBIQUxfU1BESUZSWF9SZWNlaXZlQ29udHJvbEZsb3dfRE1BICBIQUxfU1BESUZSWF9SZWNlaXZlQ3RybEZsb3dfRE1BCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1BQUF9BbGlhc2VkX01hY3JvcyBIQUwgUFBQIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyX0hBTF9MRUdBQ1kgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KKwpkaWZmIC0tZ2l0IGEvSW5jL0xlZ2FjeS9zdG0zMmYzeHhfaGFsX2Nhbl9sZWdhY3kuaCBiL0luYy9MZWdhY3kvc3RtMzJmM3h4X2hhbF9jYW5fbGVnYWN5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNjOTJiOQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9MZWdhY3kvc3RtMzJmM3h4X2hhbF9jYW5fbGVnYWN5LmgKQEAgLTAsMCArMSw4MTkgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX2Nhbi5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBDQU4gSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0NBTl9ICisjZGVmaW5lIF9fU1RNMzJGM3h4X0NBTl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMng4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgQ0FOCisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ0FOX0V4cG9ydGVkX1R5cGVzIENBTiBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovICAKKy8qKiAKKyAgKiBAYnJpZWYgIEhBTCBTdGF0ZSBzdHJ1Y3R1cmVzIGRlZmluaXRpb24gIAorICAqLyAKK3R5cGVkZWYgZW51bQoreworICBIQUxfQ0FOX1NUQVRFX1JFU0VUICAgICAgICAgICAgID0gMHgwMFUsICAvKiE8IENBTiBub3QgeWV0IGluaXRpYWxpemVkIG9yIGRpc2FibGVkICovCisgIEhBTF9DQU5fU1RBVEVfUkVBRFkgICAgICAgICAgICAgPSAweDAxVSwgIC8qITwgQ0FOIGluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICAgKi8KKyAgSEFMX0NBTl9TVEFURV9CVVNZICAgICAgICAgICAgICA9IDB4MDJVLCAgLyohPCBDQU4gcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAqLworICBIQUxfQ0FOX1NUQVRFX0JVU1lfVFggICAgICAgICAgID0gMHgxMlUsICAvKiE8IENBTiBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICAgICovCisgIEhBTF9DQU5fU1RBVEVfQlVTWV9SWDAgICAgICAgICAgPSAweDIyVSwgIC8qITwgQ0FOIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgICAgKi8KKyAgSEFMX0NBTl9TVEFURV9CVVNZX1JYMSAgICAgICAgICA9IDB4MzJVLCAgLyohPCBDQU4gcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAqLworICBIQUxfQ0FOX1NUQVRFX0JVU1lfVFhfUlgwICAgICAgID0gMHg0MlUsICAvKiE8IENBTiBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICAgICovCisgIEhBTF9DQU5fU1RBVEVfQlVTWV9UWF9SWDEgICAgICAgPSAweDUyVSwgIC8qITwgQ0FOIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgICAgKi8KKyAgSEFMX0NBTl9TVEFURV9CVVNZX1JYMF9SWDEgICAgICA9IDB4NjJVLCAgLyohPCBDQU4gcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAqLworICBIQUxfQ0FOX1NUQVRFX0JVU1lfVFhfUlgwX1JYMSAgID0gMHg3MlUsICAvKiE8IENBTiBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICAgICovCisgIEhBTF9DQU5fU1RBVEVfVElNRU9VVCAgICAgICAgICAgPSAweDAzVSwgIC8qITwgQ0FOIGluIFRpbWVvdXQgc3RhdGUgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0NBTl9TVEFURV9FUlJPUiAgICAgICAgICAgICA9IDB4MDRVICAgLyohPCBDQU4gZXJyb3Igc3RhdGUgICAgICAgICAgICAgICAgICAgICAqLworCit9SEFMX0NBTl9TdGF0ZVR5cGVEZWY7CisKKy8qKiAKKyAgKiBAYnJpZWYgIENBTiBpbml0IHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQcmVzY2FsZXI7ICAvKiE8IFNwZWNpZmllcyB0aGUgbGVuZ3RoIG9mIGEgdGltZSBxdWFudHVtLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAxIGFuZCBNYXhfRGF0YSA9IDEwMjQuICovCisgIAorICB1aW50MzJfdCBNb2RlOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgQ0FOIG9wZXJhdGluZyBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ0FOX29wZXJhdGluZ19tb2RlICovCisKKyAgdWludDMyX3QgU0pXOyAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWUgcXVhbnRhIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBDQU4gaGFyZHdhcmUgaXMgYWxsb3dlZCB0byBsZW5ndGhlbiBvciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydGVuIGEgYml0IHRvIHBlcmZvcm0gcmVzeW5jaHJvbml6YXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDQU5fc3luY2hyb25pc2F0aW9uX2p1bXBfd2lkdGggKi8KKworICB1aW50MzJfdCBCUzE7ICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRpbWUgcXVhbnRhIGluIEJpdCBTZWdtZW50IDEuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDQU5fdGltZV9xdWFudHVtX2luX2JpdF9zZWdtZW50XzEgKi8KKworICB1aW50MzJfdCBCUzI7ICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRpbWUgcXVhbnRhIGluIEJpdCBTZWdtZW50IDIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDQU5fdGltZV9xdWFudHVtX2luX2JpdF9zZWdtZW50XzIgKi8KKyAgCisgIHVpbnQzMl90IFRUQ007ICAgICAgIC8qITwgRW5hYmxlIG9yIGRpc2FibGUgdGhlIHRpbWUgdHJpZ2dlcmVkIGNvbW11bmljYXRpb24gbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvIEVOQUJMRSBvciBESVNBQkxFLiAqLworICAKKyAgdWludDMyX3QgQUJPTTsgICAgICAgLyohPCBFbmFibGUgb3IgZGlzYWJsZSB0aGUgYXV0b21hdGljIGJ1cy1vZmYgbWFuYWdlbWVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvIEVOQUJMRSBvciBESVNBQkxFLiAqLworCisgIHVpbnQzMl90IEFXVU07ICAgICAgIC8qITwgRW5hYmxlIG9yIGRpc2FibGUgdGhlIGF1dG9tYXRpYyB3YWtlLXVwIG1vZGUuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUuICovCisKKyAgdWludDMyX3QgTkFSVDsgICAgICAgLyohPCBFbmFibGUgb3IgZGlzYWJsZSB0aGUgbm9uLWF1dG9tYXRpYyByZXRyYW5zbWlzc2lvbiBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUuICovCisKKyAgdWludDMyX3QgUkZMTTsgICAgICAgLyohPCBFbmFibGUgb3IgZGlzYWJsZSB0aGUgUmVjZWl2ZSBGSUZPIExvY2tlZCBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUuICovCisKKyAgdWludDMyX3QgVFhGUDsgICAgICAgLyohPCBFbmFibGUgb3IgZGlzYWJsZSB0aGUgdHJhbnNtaXQgRklGTyBwcmlvcml0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvIEVOQUJMRSBvciBESVNBQkxFLiAqLworfUNBTl9Jbml0VHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiAgQ0FOIGZpbHRlciBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBGaWx0ZXJJZEhpZ2g7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBmaWx0ZXIgaWRlbnRpZmljYXRpb24gbnVtYmVyIChNU0JzIGZvciBhIDMyLWJpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiwgZmlyc3Qgb25lIGZvciBhIDE2LWJpdCBjb25maWd1cmF0aW9uKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAwMCBhbmQgTWF4X0RhdGEgPSAweEZGRkYuICovIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB1aW50MzJfdCBGaWx0ZXJJZExvdzsgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBmaWx0ZXIgaWRlbnRpZmljYXRpb24gbnVtYmVyIChMU0JzIGZvciBhIDMyLWJpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiwgc2Vjb25kIG9uZSBmb3IgYSAxNi1iaXQgY29uZmlndXJhdGlvbikuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwMDAgYW5kIE1heF9EYXRhID0gMHhGRkZGLiAqLyAKKworICB1aW50MzJfdCBGaWx0ZXJNYXNrSWRIaWdoOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBmaWx0ZXIgbWFzayBudW1iZXIgb3IgaWRlbnRpZmljYXRpb24gbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBtb2RlIChNU0JzIGZvciBhIDMyLWJpdCBjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3Qgb25lIGZvciBhIDE2LWJpdCBjb25maWd1cmF0aW9uKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAwMCBhbmQgTWF4X0RhdGEgPSAweEZGRkYuICovIAorCisgIHVpbnQzMl90IEZpbHRlck1hc2tJZExvdzsgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGZpbHRlciBtYXNrIG51bWJlciBvciBpZGVudGlmaWNhdGlvbiBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvcmRpbmcgdG8gdGhlIG1vZGUgKExTQnMgZm9yIGEgMzItYml0IGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmQgb25lIGZvciBhIDE2LWJpdCBjb25maWd1cmF0aW9uKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAwMCBhbmQgTWF4X0RhdGEgPSAweEZGRkYuICovIAorCisgIHVpbnQzMl90IEZpbHRlckZJRk9Bc3NpZ25tZW50OyAgLyohPCBTcGVjaWZpZXMgdGhlIEZJRk8gKDAgb3IgMVUpIHdoaWNoIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ0FOX2ZpbHRlcl9GSUZPICovCisgIAorICB1aW50MzJfdCBGaWx0ZXJOdW1iZXI7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBmaWx0ZXIgd2hpY2ggd2lsbCBiZSBpbml0aWFsaXplZC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDI3LiAqLworCisgIHVpbnQzMl90IEZpbHRlck1vZGU7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGZpbHRlciBtb2RlIHRvIGJlIGluaXRpYWxpemVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDQU5fZmlsdGVyX21vZGUgKi8KKworICB1aW50MzJfdCBGaWx0ZXJTY2FsZTsgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBmaWx0ZXIgc2NhbGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENBTl9maWx0ZXJfc2NhbGUgKi8KKworICB1aW50MzJfdCBGaWx0ZXJBY3RpdmF0aW9uOyAgICAgIC8qITwgRW5hYmxlIG9yIGRpc2FibGUgdGhlIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgdWludDMyX3QgQmFua051bWJlcjsgICAgICAgICAgICAvKiE8IFNlbGVjdCB0aGUgc3RhcnQgc2xhdmUgYmFuayBmaWx0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYzIGRldmljZXMgZG9uJ3Qgc3VwcG9ydCBDQU4yIGludGVyZmFjZSAoU2xhdmUpLiBUaGVyZWZvcmUgdGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG1lYW5pbmdsZXNzIGJ1dCBpdCBoYXMgYmVlbiBrZXB0IGZvciBjb21wYXRpYmlsaXR5IGFjY3Jvc3MgU1RNMzIgZmFtaWxpZXMgKi8gCisgIAorfUNBTl9GaWx0ZXJDb25mVHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiAgQ0FOIFR4IG1lc3NhZ2Ugc3RydWN0dXJlIGRlZmluaXRpb24gIAorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgU3RkSWQ7ICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzdGFuZGFyZCBpZGVudGlmaWVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4N0ZGLiAqLyAKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICB1aW50MzJfdCBFeHRJZDsgICAgLyohPCBTcGVjaWZpZXMgdGhlIGV4dGVuZGVkIGlkZW50aWZpZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHgxRkZGRkZGRi4gKi8gCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgdWludDMyX3QgSURFOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSB0eXBlIG9mIGlkZW50aWZpZXIgZm9yIHRoZSBtZXNzYWdlIHRoYXQgd2lsbCBiZSB0cmFuc21pdHRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDQU5faWRlbnRpZmllcl90eXBlICovCisKKyAgdWludDMyX3QgUlRSOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSB0eXBlIG9mIGZyYW1lIGZvciB0aGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgdHJhbnNtaXR0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ0FOX3JlbW90ZV90cmFuc21pc3Npb25fcmVxdWVzdCAqLworCisgIHVpbnQzMl90IERMQzsgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbGVuZ3RoIG9mIHRoZSBmcmFtZSB0aGF0IHdpbGwgYmUgdHJhbnNtaXR0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gOC4gKi8KKworICB1aW50OF90IERhdGFbOF07ICAgLyohPCBDb250YWlucyB0aGUgZGF0YSB0byBiZSB0cmFuc21pdHRlZC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRi4gKi8KKyAgIAorfUNhblR4TXNnVHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiAgQ0FOIFJ4IG1lc3NhZ2Ugc3RydWN0dXJlIGRlZmluaXRpb24gIAorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgU3RkSWQ7ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzdGFuZGFyZCBpZGVudGlmaWVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4N0ZGLiAqLyAKKworICB1aW50MzJfdCBFeHRJZDsgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGV4dGVuZGVkIGlkZW50aWZpZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHgxRkZGRkZGRi4gKi8gCisKKyAgdWludDMyX3QgSURFOyAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSB0eXBlIG9mIGlkZW50aWZpZXIgZm9yIHRoZSBtZXNzYWdlIHRoYXQgd2lsbCBiZSByZWNlaXZlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDQU5faWRlbnRpZmllcl90eXBlICovCisKKyAgdWludDMyX3QgUlRSOyAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSB0eXBlIG9mIGZyYW1lIGZvciB0aGUgcmVjZWl2ZWQgbWVzc2FnZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDQU5fcmVtb3RlX3RyYW5zbWlzc2lvbl9yZXF1ZXN0ICovCisKKyAgdWludDMyX3QgRExDOyAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBsZW5ndGggb2YgdGhlIGZyYW1lIHRoYXQgd2lsbCBiZSByZWNlaXZlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSA4LiAqLworCisgIHVpbnQ4X3QgRGF0YVs4XTsgICAgICAvKiE8IENvbnRhaW5zIHRoZSBkYXRhIHRvIGJlIHJlY2VpdmVkLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGLiAqLworCisgIHVpbnQzMl90IEZNSTsgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgaW5kZXggb2YgdGhlIGZpbHRlciB0aGUgbWVzc2FnZSBzdG9yZWQgaW4gdGhlIG1haWxib3ggcGFzc2VzIHRocm91Z2guCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRi4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICB1aW50MzJfdCBGSUZPTnVtYmVyOyAgLyohPCBTcGVjaWZpZXMgdGhlIHJlY2VpdmUgRklGTyBudW1iZXIuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgQ0FOX0ZJRk8wIG9yIENBTl9GSUZPMSAqLworICAgICAgICAgICAgICAgICAgICAgICAKK31DYW5SeE1zZ1R5cGVEZWY7CisKKy8qKiAKKyAgKiBAYnJpZWYgIENBTiBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24gIAorICAqLyAKK3R5cGVkZWYgc3RydWN0Cit7CisgIENBTl9UeXBlRGVmICAgICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAgICAgICAgICAqLworICAKKyAgQ0FOX0luaXRUeXBlRGVmICAgICAgICAgICAgIEluaXQ7ICAgICAgIC8qITwgQ0FOIHJlcXVpcmVkIHBhcmFtZXRlcnMgICAgICAgICovCisgIAorICBDYW5UeE1zZ1R5cGVEZWYqICAgICAgICAgICAgcFR4TXNnOyAgICAgLyohPCBQb2ludGVyIHRvIHRyYW5zbWl0IHN0cnVjdHVyZSAgKi8KKworICBDYW5SeE1zZ1R5cGVEZWYqICAgICAgICAgICAgcFJ4TXNnOyAgICAgLyohPCBQb2ludGVyIHRvIHJlY2VwdGlvbiBzdHJ1Y3R1cmUgZm9yIFJYIEZJRk8wIG1zZyAqLworCisgIENhblJ4TXNnVHlwZURlZiogICAgICAgICAgICBwUngxTXNnOyAgICAvKiE8IFBvaW50ZXIgdG8gcmVjZXB0aW9uIHN0cnVjdHVyZSBmb3IgUlggRklGTzEgbXNnICovCisKKyAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgICAgIExvY2s7ICAgICAgIC8qITwgQ0FOIGxvY2tpbmcgb2JqZWN0ICAgICAgICAgICAgICovCisgIAorICBfX0lPIEhBTF9DQU5fU3RhdGVUeXBlRGVmICAgU3RhdGU7ICAgICAgLyohPCBDQU4gY29tbXVuaWNhdGlvbiBzdGF0ZSAgICAgICAgKi8KKyAgCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgICBFcnJvckNvZGU7ICAvKiE8IENBTiBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDQU5fRXJyb3JfQ29kZSAqLworICAKK31DQU5fSGFuZGxlVHlwZURlZjsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgQ0FOX0V4cG9ydGVkX0NvbnN0YW50cyBDQU4gRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDQU5fRXJyb3JfQ29kZSBDQU4gRXJyb3IgQ29kZQorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9DQU5fRVJST1JfTk9ORSAgICAgICAgICAoMHgwMDAwMDAwMFUpICAvKiE8IE5vIGVycm9yICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9DQU5fRVJST1JfRVdHICAgICAgICAgICAoMHgwMDAwMDAwMVUpICAvKiE8IEVXRyBlcnJvciAgICAgICAgICAgICovICAgCisjZGVmaW5lIEhBTF9DQU5fRVJST1JfRVBWICAgICAgICAgICAoMHgwMDAwMDAwMlUpICAvKiE8IEVQViBlcnJvciAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9DQU5fRVJST1JfQk9GICAgICAgICAgICAoMHgwMDAwMDAwNFUpICAvKiE8IEJPRiBlcnJvciAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9DQU5fRVJST1JfU1RGICAgICAgICAgICAoMHgwMDAwMDAwOFUpICAvKiE8IFN0dWZmIGVycm9yICAgICAgICAgICovCisjZGVmaW5lIEhBTF9DQU5fRVJST1JfRk9SICAgICAgICAgICAoMHgwMDAwMDAxMFUpICAvKiE8IEZvcm0gZXJyb3IgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9DQU5fRVJST1JfQUNLICAgICAgICAgICAoMHgwMDAwMDAyMFUpICAvKiE8IEFja25vd2xlZGdtZW50IGVycm9yICovCisjZGVmaW5lIEhBTF9DQU5fRVJST1JfQlIgICAgICAgICAgICAoMHgwMDAwMDA0MFUpICAvKiE8IEJpdCByZWNlc3NpdmUgICAgICAgICovCisjZGVmaW5lIEhBTF9DQU5fRVJST1JfQkQgICAgICAgICAgICAoMHgwMDAwMDA4MFUpICAvKiE8IExFQyBkb21pbmFudCAgICAgICAgICovCisjZGVmaW5lIEhBTF9DQU5fRVJST1JfQ1JDICAgICAgICAgICAoMHgwMDAwMDEwMFUpICAvKiE8IExFQyB0cmFuc2ZlciBlcnJvciAgICovCisjZGVmaW5lIEhBTF9DQU5fRVJST1JfRk9WMCAgICAgICAgICAoMHgwMDAwMDIwMFUpICAvKiE8IEZJRk8wIG92ZXJydW4gZXJyb3IgICovCisjZGVmaW5lIEhBTF9DQU5fRVJST1JfRk9WMSAgICAgICAgICAoMHgwMDAwMDQwMFUpICAvKiE8IEZJRk8xIG92ZXJydW4gZXJyb3IgICovCisjZGVmaW5lIEhBTF9DQU5fRVJST1JfVFhGQUlMICAgICAgICAoMHgwMDAwMDgwMFUpICAvKiE8IFRyYW5zbWl0IGZhaWx1cmUgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENBTl9Jbml0U3RhdHVzIENBTiBJbml0U3RhdHVzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ0FOX0lOSVRTVEFUVVNfRkFJTEVEICAgICAgICgweDAwMDAwMDAwVSkgIC8qITwgQ0FOIGluaXRpYWxpemF0aW9uIGZhaWxlZCAqLworI2RlZmluZSBDQU5fSU5JVFNUQVRVU19TVUNDRVNTICAgICAgKDB4MDAwMDAwMDFVKSAgLyohPCBDQU4gaW5pdGlhbGl6YXRpb24gT0sgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ0FOX29wZXJhdGluZ19tb2RlIENBTiBPcGVyYXRpbmcgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIENBTl9NT0RFX05PUk1BTCAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBOb3JtYWwgbW9kZSAgICovCisjZGVmaW5lIENBTl9NT0RFX0xPT1BCQUNLICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9CVFJfTEJLTSkgICAgICAgICAgICAgICAgICAgLyohPCBMb29wYmFjayBtb2RlICovCisjZGVmaW5lIENBTl9NT0RFX1NJTEVOVCAgICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9CVFJfU0lMTSkgICAgICAgICAgICAgICAgICAgLyohPCBTaWxlbnQgbW9kZSAgICovCisjZGVmaW5lIENBTl9NT0RFX1NJTEVOVF9MT09QQkFDSyAgICAoKHVpbnQzMl90KShDQU5fQlRSX0xCS00gfCBDQU5fQlRSX1NJTE0pKSAgLyohPCBMb29wYmFjayBjb21iaW5lZCB3aXRoIHNpbGVudCBtb2RlICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgQ0FOX3N5bmNocm9uaXNhdGlvbl9qdW1wX3dpZHRoIENBTiBTeW5jaHJvbml6YXRpb24gSnVtcCBXaWR0aAorICAqIEB7CisgICovCisjZGVmaW5lIENBTl9TSldfMVRRICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAvKiE8IDEgdGltZSBxdWFudHVtICovCisjZGVmaW5lIENBTl9TSldfMlRRICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9CVFJfU0pXXzApICAvKiE8IDIgdGltZSBxdWFudHVtICovCisjZGVmaW5lIENBTl9TSldfM1RRICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9CVFJfU0pXXzEpICAvKiE8IDMgdGltZSBxdWFudHVtICovCisjZGVmaW5lIENBTl9TSldfNFRRICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9CVFJfU0pXKSAgICAvKiE8IDQgdGltZSBxdWFudHVtICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENBTl90aW1lX3F1YW50dW1faW5fYml0X3NlZ21lbnRfMSBDQU4gVGltZSBRdWFudHVtIGluIEJpdCBTZWdtZW50IDEKKyAgKiBAeworICAqLworI2RlZmluZSBDQU5fQlMxXzFUUSAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgMSB0aW1lIHF1YW50dW0gICovCisjZGVmaW5lIENBTl9CUzFfMlRRICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9CVFJfVFMxXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAyIHRpbWUgcXVhbnR1bSAgKi8KKyNkZWZpbmUgQ0FOX0JTMV8zVFEgICAgICAgICAgICAgICAgICgodWludDMyX3QpQ0FOX0JUUl9UUzFfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDMgdGltZSBxdWFudHVtICAqLworI2RlZmluZSBDQU5fQlMxXzRUUSAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoQ0FOX0JUUl9UUzFfMSB8IENBTl9CVFJfVFMxXzApKSAgICAgICAgICAgICAgICAgIC8qITwgNCB0aW1lIHF1YW50dW0gICovCisjZGVmaW5lIENBTl9CUzFfNVRRICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9CVFJfVFMxXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCA1IHRpbWUgcXVhbnR1bSAgKi8KKyNkZWZpbmUgQ0FOX0JTMV82VFEgICAgICAgICAgICAgICAgICgodWludDMyX3QpKENBTl9CVFJfVFMxXzIgfCBDQU5fQlRSX1RTMV8wKSkgICAgICAgICAgICAgICAgICAvKiE8IDYgdGltZSBxdWFudHVtICAqLworI2RlZmluZSBDQU5fQlMxXzdUUSAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoQ0FOX0JUUl9UUzFfMiB8IENBTl9CVFJfVFMxXzEpKSAgICAgICAgICAgICAgICAgIC8qITwgNyB0aW1lIHF1YW50dW0gICovCisjZGVmaW5lIENBTl9CUzFfOFRRICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShDQU5fQlRSX1RTMV8yIHwgQ0FOX0JUUl9UUzFfMSB8IENBTl9CVFJfVFMxXzApKSAgLyohPCA4IHRpbWUgcXVhbnR1bSAgKi8KKyNkZWZpbmUgQ0FOX0JTMV85VFEgICAgICAgICAgICAgICAgICgodWludDMyX3QpQ0FOX0JUUl9UUzFfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDkgdGltZSBxdWFudHVtICAqLworI2RlZmluZSBDQU5fQlMxXzEwVFEgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoQ0FOX0JUUl9UUzFfMyB8IENBTl9CVFJfVFMxXzApKSAgICAgICAgICAgICAgICAgIC8qITwgMTAgdGltZSBxdWFudHVtICovCisjZGVmaW5lIENBTl9CUzFfMTFUUSAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShDQU5fQlRSX1RTMV8zIHwgQ0FOX0JUUl9UUzFfMSkpICAgICAgICAgICAgICAgICAgLyohPCAxMSB0aW1lIHF1YW50dW0gKi8KKyNkZWZpbmUgQ0FOX0JTMV8xMlRRICAgICAgICAgICAgICAgICgodWludDMyX3QpKENBTl9CVFJfVFMxXzMgfCBDQU5fQlRSX1RTMV8xIHwgQ0FOX0JUUl9UUzFfMCkpICAvKiE8IDEyIHRpbWUgcXVhbnR1bSAqLworI2RlZmluZSBDQU5fQlMxXzEzVFEgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoQ0FOX0JUUl9UUzFfMyB8IENBTl9CVFJfVFMxXzIpKSAgICAgICAgICAgICAgICAgIC8qITwgMTMgdGltZSBxdWFudHVtICovCisjZGVmaW5lIENBTl9CUzFfMTRUUSAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShDQU5fQlRSX1RTMV8zIHwgQ0FOX0JUUl9UUzFfMiB8IENBTl9CVFJfVFMxXzApKSAgLyohPCAxNCB0aW1lIHF1YW50dW0gKi8KKyNkZWZpbmUgQ0FOX0JTMV8xNVRRICAgICAgICAgICAgICAgICgodWludDMyX3QpKENBTl9CVFJfVFMxXzMgfCBDQU5fQlRSX1RTMV8yIHwgQ0FOX0JUUl9UUzFfMSkpICAvKiE8IDE1IHRpbWUgcXVhbnR1bSAqLworI2RlZmluZSBDQU5fQlMxXzE2VFEgICAgICAgICAgICAgICAgKCh1aW50MzJfdClDQU5fQlRSX1RTMSkgLyohPCAxNiB0aW1lIHF1YW50dW0gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ0FOX3RpbWVfcXVhbnR1bV9pbl9iaXRfc2VnbWVudF8yIENBTiBUaW1lIFF1YW50dW0gaW4gQml0IFNlZ21lbnQgMgorICAqIEB7CisgICovCisjZGVmaW5lIENBTl9CUzJfMVRRICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDEgdGltZSBxdWFudHVtICovCisjZGVmaW5lIENBTl9CUzJfMlRRICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9CVFJfVFMyXzApICAgICAgICAgICAgICAgICAgICAvKiE8IDIgdGltZSBxdWFudHVtICovCisjZGVmaW5lIENBTl9CUzJfM1RRICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9CVFJfVFMyXzEpICAgICAgICAgICAgICAgICAgICAvKiE8IDMgdGltZSBxdWFudHVtICovCisjZGVmaW5lIENBTl9CUzJfNFRRICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShDQU5fQlRSX1RTMl8xIHwgQ0FOX0JUUl9UUzJfMCkpICAvKiE8IDQgdGltZSBxdWFudHVtICovCisjZGVmaW5lIENBTl9CUzJfNVRRICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9CVFJfVFMyXzIpICAgICAgICAgICAgICAgICAgICAvKiE8IDUgdGltZSBxdWFudHVtICovCisjZGVmaW5lIENBTl9CUzJfNlRRICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShDQU5fQlRSX1RTMl8yIHwgQ0FOX0JUUl9UUzJfMCkpICAvKiE8IDYgdGltZSBxdWFudHVtICovCisjZGVmaW5lIENBTl9CUzJfN1RRICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShDQU5fQlRSX1RTMl8yIHwgQ0FOX0JUUl9UUzJfMSkpICAvKiE8IDcgdGltZSBxdWFudHVtICovCisjZGVmaW5lIENBTl9CUzJfOFRRICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9CVFJfVFMyKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IDggdGltZSBxdWFudHVtICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENBTl9maWx0ZXJfbW9kZSBDQU4gRmlsdGVyIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBDQU5fRklMVEVSTU9ERV9JRE1BU0sgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyohPCBJZGVudGlmaWVyIG1hc2sgbW9kZSAqLworI2RlZmluZSBDQU5fRklMVEVSTU9ERV9JRExJU1QgICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyohPCBJZGVudGlmaWVyIGxpc3QgbW9kZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDQU5fZmlsdGVyX3NjYWxlIENBTiBGaWx0ZXIgU2NhbGUKKyAgKiBAeworICAqLworI2RlZmluZSBDQU5fRklMVEVSU0NBTEVfMTZCSVQgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyohPCBUd28gMTYtYml0IGZpbHRlcnMgKi8KKyNkZWZpbmUgQ0FOX0ZJTFRFUlNDQUxFXzMyQklUICAgICAgICgodWludDhfdCkweDAxVSkgIC8qITwgT25lIDMyLWJpdCBmaWx0ZXIgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENBTl9maWx0ZXJfRklGTyBDQU4gRmlsdGVyIEZJRk8KKyAgKiBAeworICAqLworI2RlZmluZSBDQU5fRklMVEVSX0ZJRk8wICAgICAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qITwgRmlsdGVyIEZJRk8gMCBhc3NpZ25tZW50IGZvciBmaWx0ZXIgeCAqLworI2RlZmluZSBDQU5fRklMVEVSX0ZJRk8xICAgICAgICAgICAgICgodWludDhfdCkweDAxVSkgIC8qITwgRmlsdGVyIEZJRk8gMSBhc3NpZ25tZW50IGZvciBmaWx0ZXIgeCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDQU5faWRlbnRpZmllcl90eXBlIENBTiBJZGVudGlmaWVyIFR5cGUKKyAgKiBAeworICAqLworI2RlZmluZSBDQU5fSURfU1REICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgIC8qITwgU3RhbmRhcmQgSWQgKi8KKyNkZWZpbmUgQ0FOX0lEX0VYVCAgICAgICAgICAgICAoMHgwMDAwMDAwNFUpICAvKiE8IEV4dGVuZGVkIElkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENBTl9yZW1vdGVfdHJhbnNtaXNzaW9uX3JlcXVlc3QgQ0FOIFJlbW90ZSBUcmFuc21pc3Npb24gUmVxdWVzdAorICAqIEB7CisgICovCisjZGVmaW5lIENBTl9SVFJfREFUQSAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAvKiE8IERhdGEgZnJhbWUgKi8KKyNkZWZpbmUgQ0FOX1JUUl9SRU1PVEUgICAgICAgICAgICAgICgweDAwMDAwMDAyVSkgIC8qITwgUmVtb3RlIGZyYW1lICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENBTl9yZWNlaXZlX0ZJRk9fbnVtYmVyX2NvbnN0YW50cyBDQU4gUmVjZWl2ZSBGSUZPIE51bWJlcgorICAqIEB7CisgICovCisjZGVmaW5lIENBTl9GSUZPMCAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiE8IENBTiBGSUZPIDAgdXNlZCB0byByZWNlaXZlICovCisjZGVmaW5lIENBTl9GSUZPMSAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiE8IENBTiBGSUZPIDEgdXNlZCB0byByZWNlaXZlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENBTl9mbGFncyBDQU4gRmxhZ3MKKyAgKiBAeworICAqLworLyogSWYgdGhlIGZsYWcgaXMgMHgzWFhYWFhYWCwgaXQgbWVhbnMgdGhhdCBpdCBjYW4gYmUgdXNlZCB3aXRoIENBTl9HZXRGbGFnU3RhdHVzKCkKKyAgIGFuZCBDQU5fQ2xlYXJGbGFnKCkgZnVuY3Rpb25zLiAqLworLyogSWYgdGhlIGZsYWcgaXMgMHgxWFhYWFhYWCwgaXQgbWVhbnMgdGhhdCBpdCBjYW4gb25seSBiZSB1c2VkIHdpdGggCisgICBDQU5fR2V0RmxhZ1N0YXR1cygpIGZ1bmN0aW9uLiAgKi8KKworLyogVHJhbnNtaXQgRmxhZ3MgKi8KKyNkZWZpbmUgQ0FOX0ZMQUdfUlFDUDAgICAgICAgICAgICAgKDB4MDAwMDA1MDBVKSAgLyohPCBSZXF1ZXN0IE1haWxCb3gwIGZsYWcgICAgICAgICAqLworI2RlZmluZSBDQU5fRkxBR19SUUNQMSAgICAgICAgICAgICAoMHgwMDAwMDUwOFUpICAvKiE8IFJlcXVlc3QgTWFpbEJveDEgZmxhZyAgICAgICAgICovCisjZGVmaW5lIENBTl9GTEFHX1JRQ1AyICAgICAgICAgICAgICgweDAwMDAwNTEwVSkgIC8qITwgUmVxdWVzdCBNYWlsQm94MiBmbGFnICAgICAgICAgKi8KKyNkZWZpbmUgQ0FOX0ZMQUdfVFhPSzAgICAgICAgICAgICAgKDB4MDAwMDA1MDFVKSAgLyohPCBUcmFuc21pc3Npb24gT0sgTWFpbEJveDAgZmxhZyAqLworI2RlZmluZSBDQU5fRkxBR19UWE9LMSAgICAgICAgICAgICAoMHgwMDAwMDUwOVUpICAvKiE8IFRyYW5zbWlzc2lvbiBPSyBNYWlsQm94MSBmbGFnICovCisjZGVmaW5lIENBTl9GTEFHX1RYT0syICAgICAgICAgICAgICgweDAwMDAwNTExVSkgIC8qITwgVHJhbnNtaXNzaW9uIE9LIE1haWxCb3gyIGZsYWcgKi8KKyNkZWZpbmUgQ0FOX0ZMQUdfVE1FMCAgICAgICAgICAgICAgKDB4MDAwMDA1MUFVKSAgLyohPCBUcmFuc21pdCBtYWlsYm94IDAgZW1wdHkgZmxhZyAqLworI2RlZmluZSBDQU5fRkxBR19UTUUxICAgICAgICAgICAgICAoMHgwMDAwMDUxQlUpICAvKiE8IFRyYW5zbWl0IG1haWxib3ggMCBlbXB0eSBmbGFnICovCisjZGVmaW5lIENBTl9GTEFHX1RNRTIgICAgICAgICAgICAgICgweDAwMDAwNTFDVSkgIC8qITwgVHJhbnNtaXQgbWFpbGJveCAwIGVtcHR5IGZsYWcgKi8KKworLyogUmVjZWl2ZSBGbGFncyAqLworI2RlZmluZSBDQU5fRkxBR19GRjAgICAgICAgICAgICAgICAoMHgwMDAwMDIwM1UpICAvKiE8IEZJRk8gMCBGdWxsIGZsYWcgICAgKi8KKyNkZWZpbmUgQ0FOX0ZMQUdfRk9WMCAgICAgICAgICAgICAgKDB4MDAwMDAyMDRVKSAgLyohPCBGSUZPIDAgT3ZlcnJ1biBmbGFnICovCisKKyNkZWZpbmUgQ0FOX0ZMQUdfRkYxICAgICAgICAgICAgICAgKDB4MDAwMDA0MDNVKSAgLyohPCBGSUZPIDEgRnVsbCBmbGFnICAgICovCisjZGVmaW5lIENBTl9GTEFHX0ZPVjEgICAgICAgICAgICAgICgweDAwMDAwNDA0VSkgIC8qITwgRklGTyAxIE92ZXJydW4gZmxhZyAqLworCisvKiBPcGVyYXRpbmcgTW9kZSBGbGFncyAqLworI2RlZmluZSBDQU5fRkxBR19JTkFLICAgICAgICAgICAgICAoMHgwMDAwMDEwMFUpICAvKiE8IEluaXRpYWxpemF0aW9uIGFja25vd2xlZGdlIGZsYWcgKi8KKyNkZWZpbmUgQ0FOX0ZMQUdfU0xBSyAgICAgICAgICAgICAgKDB4MDAwMDAxMDFVKSAgLyohPCBTbGVlcCBhY2tub3dsZWRnZSBmbGFnICAgICAgICAgICovCisjZGVmaW5lIENBTl9GTEFHX0VSUkkgICAgICAgICAgICAgICgweDAwMDAwMTAyVSkgIC8qITwgRXJyb3IgZmxhZyAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDQU5fRkxBR19XS1UgICAgICAgICAgICAgICAoMHgwMDAwMDEwM1UpICAvKiE8IFdha2UgdXAgZmxhZyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FOX0ZMQUdfU0xBS0kgICAgICAgICAgICAgKDB4MDAwMDAxMDRVKSAgLyohPCBTbGVlcCBhY2tub3dsZWRnZSBmbGFnICAgICAgICAgICovCisvKiBAbm90ZSBXaGVuIFNMQUsgaW50ZXJydXB0IGlzIGRpc2FibGVkIChTTEtJRT0wVSksIG5vIHBvbGxpbmcgb24gU0xBS0kgaXMgcG9zc2libGUuIAorICAgICAgICAgSW4gdGhpcyBjYXNlIHRoZSBTTEFLIGJpdCBjYW4gYmUgcG9sbGVkLiovCisKKy8qIEVycm9yIEZsYWdzICovCisjZGVmaW5lIENBTl9GTEFHX0VXRyAgICAgICAgICAgICAgICgweDAwMDAwMzAwVSkgIC8qITwgRXJyb3Igd2FybmluZyBmbGFnICAgKi8KKyNkZWZpbmUgQ0FOX0ZMQUdfRVBWICAgICAgICAgICAgICAgKDB4MDAwMDAzMDFVKSAgLyohPCBFcnJvciBwYXNzaXZlIGZsYWcgICAqLworI2RlZmluZSBDQU5fRkxBR19CT0YgICAgICAgICAgICAgICAoMHgwMDAwMDMwMlUpICAvKiE8IEJ1cy1PZmYgZmxhZyAgICAgICAgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyAgCisvKiogQGRlZmdyb3VwIENBTl9pbnRlcnJ1cHRzIENBTiBJbnRlcnJ1cHRzCisgICogQHsKKyAgKi8gCisjZGVmaW5lIENBTl9JVF9UTUUgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9JRVJfVE1FSUUpICAgLyohPCBUcmFuc21pdCBtYWlsYm94IGVtcHR5IGludGVycnVwdCAqLworCisvKiBSZWNlaXZlIEludGVycnVwdHMgKi8KKyNkZWZpbmUgQ0FOX0lUX0ZNUDAgICAgICAgICAgICAgICAgICgodWludDMyX3QpQ0FOX0lFUl9GTVBJRTApICAvKiE8IEZJRk8gMCBtZXNzYWdlIHBlbmRpbmcgaW50ZXJydXB0ICovCisjZGVmaW5lIENBTl9JVF9GRjAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9JRVJfRkZJRTApICAgLyohPCBGSUZPIDAgZnVsbCBpbnRlcnJ1cHQgICAgICAgICAgICAqLworI2RlZmluZSBDQU5fSVRfRk9WMCAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClDQU5fSUVSX0ZPVklFMCkgIC8qITwgRklGTyAwIG92ZXJydW4gaW50ZXJydXB0ICAgICAgICAgKi8KKyNkZWZpbmUgQ0FOX0lUX0ZNUDEgICAgICAgICAgICAgICAgICgodWludDMyX3QpQ0FOX0lFUl9GTVBJRTEpICAvKiE8IEZJRk8gMSBtZXNzYWdlIHBlbmRpbmcgaW50ZXJydXB0ICovCisjZGVmaW5lIENBTl9JVF9GRjEgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9JRVJfRkZJRTEpICAgLyohPCBGSUZPIDEgZnVsbCBpbnRlcnJ1cHQgICAgICAgICAgICAqLworI2RlZmluZSBDQU5fSVRfRk9WMSAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClDQU5fSUVSX0ZPVklFMSkgIC8qITwgRklGTyAxIG92ZXJydW4gaW50ZXJydXB0ICAgICAgICAgKi8KKworLyogT3BlcmF0aW5nIE1vZGUgSW50ZXJydXB0cyAqLworI2RlZmluZSBDQU5fSVRfV0tVICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClDQU5fSUVSX1dLVUlFKSAgLyohPCBXYWtlLXVwIGludGVycnVwdCAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FOX0lUX1NMSyAgICAgICAgICAgICAgICAgICgodWludDMyX3QpQ0FOX0lFUl9TTEtJRSkgIC8qITwgU2xlZXAgYWNrbm93bGVkZ2UgaW50ZXJydXB0ICovCisKKy8qIEVycm9yIEludGVycnVwdHMgKi8KKyNkZWZpbmUgQ0FOX0lUX0VXRyAgICAgICAgICAgICAgICAgICgodWludDMyX3QpQ0FOX0lFUl9FV0dJRSkgLyohPCBFcnJvciB3YXJuaW5nIGludGVycnVwdCAgICovCisjZGVmaW5lIENBTl9JVF9FUFYgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9JRVJfRVBWSUUpIC8qITwgRXJyb3IgcGFzc2l2ZSBpbnRlcnJ1cHQgICAqLworI2RlZmluZSBDQU5fSVRfQk9GICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClDQU5fSUVSX0JPRklFKSAvKiE8IEJ1cy1vZmYgaW50ZXJydXB0ICAgICAgICAgKi8KKyNkZWZpbmUgQ0FOX0lUX0xFQyAgICAgICAgICAgICAgICAgICgodWludDMyX3QpQ0FOX0lFUl9MRUNJRSkgLyohPCBMYXN0IGVycm9yIGNvZGUgaW50ZXJydXB0ICovCisjZGVmaW5lIENBTl9JVF9FUlIgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9JRVJfRVJSSUUpIC8qITwgRXJyb3IgSW50ZXJydXB0ICAgICAgICAgICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENBTl9NYWlsYm94ZXMgQ0FOIE1haWxib3hlcworKiBAeworKi8gICAKKy8qIE1haWxib3hlcyBkZWZpbml0aW9uICovCisjZGVmaW5lIENBTl9UWE1BSUxCT1hfMCAgICgodWludDhfdCkweDAwVSkKKyNkZWZpbmUgQ0FOX1RYTUFJTEJPWF8xICAgKCh1aW50OF90KTB4MDFVKQorI2RlZmluZSBDQU5fVFhNQUlMQk9YXzIgICAoKHVpbnQ4X3QpMHgwMlUpCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDQU5fRXhwb3J0ZWRfTWFjcm9zIENBTiBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmICBSZXNldCBDQU4gaGFuZGxlIHN0YXRlCisgICogQHBhcmFtICBfX0hBTkRMRV9fIENBTiBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NBTl9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfQ0FOX1NUQVRFX1JFU0VUKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIENBTiBpbnRlcnJ1cHRzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBDQU4gaGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBDQU4gSW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NBTl9FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JRVIpIHw9IChfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgQ0FOIGludGVycnVwdHMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIENBTiBoYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIENBTiBJbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ0FOX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JRVIpICY9IH4oX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBudW1iZXIgb2YgcGVuZGluZyByZWNlaXZlZCBtZXNzYWdlcy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gQ0FOIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRklGT05VTUJFUl9fIFJlY2VpdmUgRklGTyBudW1iZXIsIENBTl9GSUZPMCBvciBDQU5fRklGTzEuCisgICogQHJldHZhbCBUaGUgbnVtYmVyIG9mIHBlbmRpbmcgbWVzc2FnZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfQ0FOX01TR19QRU5ESU5HKF9fSEFORExFX18sIF9fRklGT05VTUJFUl9fKSAoKChfX0ZJRk9OVU1CRVJfXykgPT0gQ0FOX0ZJRk8wKT8gXAorKCh1aW50OF90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SRjBSJjB4MDNVKSkgOiAoKHVpbnQ4X3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlJGMVImMHgwM1UpKSkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIENBTiBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgQ0FOIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIENBTl9UU1JfUlFDUDA6IFJlcXVlc3QgTWFpbEJveDAgRmxhZworICAqICAgICAgICAgICAgQGFyZyBDQU5fVFNSX1JRQ1AxOiBSZXF1ZXN0IE1haWxCb3gxIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQ0FOX1RTUl9SUUNQMjogUmVxdWVzdCBNYWlsQm94MiBGbGFnCisgICogICAgICAgICAgICBAYXJnIENBTl9GTEFHX1RYT0swOiBUcmFuc21pc3Npb24gT0sgTWFpbEJveDAgRmxhZworICAqICAgICAgICAgICAgQGFyZyBDQU5fRkxBR19UWE9LMTogVHJhbnNtaXNzaW9uIE9LIE1haWxCb3gxIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQ0FOX0ZMQUdfVFhPSzI6IFRyYW5zbWlzc2lvbiBPSyBNYWlsQm94MiBGbGFnCisgICogICAgICAgICAgICBAYXJnIENBTl9GTEFHX1RNRTA6IFRyYW5zbWl0IG1haWxib3ggMCBlbXB0eSBGbGFnCisgICogICAgICAgICAgICBAYXJnIENBTl9GTEFHX1RNRTE6IFRyYW5zbWl0IG1haWxib3ggMSBlbXB0eSBGbGFnCisgICogICAgICAgICAgICBAYXJnIENBTl9GTEFHX1RNRTI6IFRyYW5zbWl0IG1haWxib3ggMiBlbXB0eSBGbGFnCisgICogICAgICAgICAgICBAYXJnIENBTl9GTEFHX0ZNUDA6IEZJRk8gMCBNZXNzYWdlIFBlbmRpbmcgRmxhZworICAqICAgICAgICAgICAgQGFyZyBDQU5fRkxBR19GRjA6IEZJRk8gMCBGdWxsIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQ0FOX0ZMQUdfRk9WMDogRklGTyAwIE92ZXJydW4gRmxhZworICAqICAgICAgICAgICAgQGFyZyBDQU5fRkxBR19GTVAxOiBGSUZPIDEgTWVzc2FnZSBQZW5kaW5nIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQ0FOX0ZMQUdfRkYxOiBGSUZPIDEgRnVsbCBGbGFnCisgICogICAgICAgICAgICBAYXJnIENBTl9GTEFHX0ZPVjE6IEZJRk8gMSBPdmVycnVuIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQ0FOX0ZMQUdfV0tVOiBXYWtlIHVwIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQ0FOX0ZMQUdfU0xBSzogU2xlZXAgYWNrbm93bGVkZ2UgRmxhZworICAqICAgICAgICAgICAgQGFyZyBDQU5fRkxBR19TTEFLSTogU2xlZXAgYWNrbm93bGVkZ2UgRmxhZworICAqICAgICAgICAgICAgQGFyZyBDQU5fRkxBR19FV0c6IEVycm9yIFdhcm5pbmcgRmxhZworICAqICAgICAgICAgICAgQGFyZyBDQU5fRkxBR19FUFY6IEVycm9yIFBhc3NpdmUgRmxhZworICAqICAgICAgICAgICAgQGFyZyBDQU5fRkxBR19CT0Y6IEJ1cy1PZmYgRmxhZworICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX0NBTl9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgXAorKCgoKF9fRkxBR19fKSA+PiA4VSkgPT0gNVUpPyAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5UU1IpICYgKDFVIDw8ICgoX19GTEFHX18pICYgQ0FOX0ZMQUdfTUFTSykpKSA9PSAoMVUgPDwgKChfX0ZMQUdfXykgJiBDQU5fRkxBR19NQVNLKSkpOiBcCisgKCgoX19GTEFHX18pID4+IDhVKSA9PSAyVSk/ICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlJGMFIpICYgKDFVIDw8ICgoX19GTEFHX18pICYgQ0FOX0ZMQUdfTUFTSykpKSA9PSAoMVUgPDwgKChfX0ZMQUdfXykgJiBDQU5fRkxBR19NQVNLKSkpOiBcCisgKCgoX19GTEFHX18pID4+IDhVKSA9PSA0VSk/ICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlJGMVIpICYgKDFVIDw8ICgoX19GTEFHX18pICYgQ0FOX0ZMQUdfTUFTSykpKSA9PSAoMVUgPDwgKChfX0ZMQUdfXykgJiBDQU5fRkxBR19NQVNLKSkpOiBcCisgKCgoX19GTEFHX18pID4+IDhVKSA9PSAxVSk/ICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPk1TUikgJiAoMVUgPDwgKChfX0ZMQUdfXykgJiBDQU5fRkxBR19NQVNLKSkpID09ICgxVSA8PCAoKF9fRkxBR19fKSAmIENBTl9GTEFHX01BU0spKSk6IFwKKyAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5FU1IpICYgKDFVIDw8ICgoX19GTEFHX18pICYgQ0FOX0ZMQUdfTUFTSykpKSA9PSAoMVUgPDwgKChfX0ZMQUdfXykgJiBDQU5fRkxBR19NQVNLKSkpKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgc3BlY2lmaWVkIENBTiBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgQ0FOIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIENBTl9UU1JfUlFDUDA6IFJlcXVlc3QgTWFpbEJveDAgRmxhZworICAqICAgICAgICAgICAgQGFyZyBDQU5fVFNSX1JRQ1AxOiBSZXF1ZXN0IE1haWxCb3gxIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQ0FOX1RTUl9SUUNQMjogUmVxdWVzdCBNYWlsQm94MiBGbGFnCisgICogICAgICAgICAgICBAYXJnIENBTl9GTEFHX1RYT0swOiBUcmFuc21pc3Npb24gT0sgTWFpbEJveDAgRmxhZworICAqICAgICAgICAgICAgQGFyZyBDQU5fRkxBR19UWE9LMTogVHJhbnNtaXNzaW9uIE9LIE1haWxCb3gxIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQ0FOX0ZMQUdfVFhPSzI6IFRyYW5zbWlzc2lvbiBPSyBNYWlsQm94MiBGbGFnCisgICogICAgICAgICAgICBAYXJnIENBTl9GTEFHX1RNRTA6IFRyYW5zbWl0IG1haWxib3ggMCBlbXB0eSBGbGFnCisgICogICAgICAgICAgICBAYXJnIENBTl9GTEFHX1RNRTE6IFRyYW5zbWl0IG1haWxib3ggMSBlbXB0eSBGbGFnCisgICogICAgICAgICAgICBAYXJnIENBTl9GTEFHX1RNRTI6IFRyYW5zbWl0IG1haWxib3ggMiBlbXB0eSBGbGFnCisgICogICAgICAgICAgICBAYXJnIENBTl9GTEFHX0ZNUDA6IEZJRk8gMCBNZXNzYWdlIFBlbmRpbmcgRmxhZworICAqICAgICAgICAgICAgQGFyZyBDQU5fRkxBR19GRjA6IEZJRk8gMCBGdWxsIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQ0FOX0ZMQUdfRk9WMDogRklGTyAwIE92ZXJydW4gRmxhZworICAqICAgICAgICAgICAgQGFyZyBDQU5fRkxBR19GTVAxOiBGSUZPIDEgTWVzc2FnZSBQZW5kaW5nIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQ0FOX0ZMQUdfRkYxOiBGSUZPIDEgRnVsbCBGbGFnCisgICogICAgICAgICAgICBAYXJnIENBTl9GTEFHX0ZPVjE6IEZJRk8gMSBPdmVycnVuIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQ0FOX0ZMQUdfV0tVOiBXYWtlIHVwIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQ0FOX0ZMQUdfU0xBS0k6IFNsZWVwIGFja25vd2xlZGdlIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQ0FOX0ZMQUdfRVdHOiBFcnJvciBXYXJuaW5nIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQ0FOX0ZMQUdfRVBWOiBFcnJvciBQYXNzaXZlIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQ0FOX0ZMQUdfQk9GOiBCdXMtT2ZmIEZsYWcKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19GTEFHX18gKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBfX0hBTF9DQU5fQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgXAorKCgoKF9fRkxBR19fKSA+PiA4VSkgPT0gNVUpPyAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlRTUikgPSAoMVUgPDwgKChfX0ZMQUdfXykgJiBDQU5fRkxBR19NQVNLKSkpOiBcCisgKCgoX19GTEFHX18pID4+IDhVKSA9PSAyVSk/ICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UkYwUikgPSAoMVUgPDwgKChfX0ZMQUdfXykgJiBDQU5fRkxBR19NQVNLKSkpOiBcCisgKCgoX19GTEFHX18pID4+IDhVKSA9PSA0VSk/ICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UkYxUikgPSAoMVUgPDwgKChfX0ZMQUdfXykgJiBDQU5fRkxBR19NQVNLKSkpOiBcCisgKCgoX19GTEFHX18pID4+IDhVKSA9PSAxVSk/ICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+TVNSKSA9ICgxVSA8PCAoKF9fRkxBR19fKSAmIENBTl9GTEFHX01BU0spKSk6IDBVKQorCisKKy8qKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBzcGVjaWZpZWQgQ0FOIGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBDQU4gSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIENBTiBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQ0FOX0lUX1RNRTogVHJhbnNtaXQgbWFpbGJveCBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIENBTl9JVF9GTVAwOiBGSUZPMCBtZXNzYWdlIHBlbmRpbmcgaW50ZXJydXB0IGVuYWJsZXYKKyAgKiAgICAgICAgICAgIEBhcmcgQ0FOX0lUX0ZNUDE6IEZJRk8xIG1lc3NhZ2UgcGVuZGluZyBpbnRlcnJ1cHQgZW5hYmxlCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fSVRfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX0NBTl9HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklFUiAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKSA/IFNFVCA6IFJFU0VUKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHRoZSB0cmFuc21pc3Npb24gc3RhdHVzIG9mIGEgQ0FOIEZyYW1lLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBDQU4gaGFuZGxlLgorICAqIEBwYXJhbSAgX19UUkFOU01JVE1BSUxCT1hfXyB0aGUgbnVtYmVyIG9mIHRoZSBtYWlsYm94IHRoYXQgaXMgdXNlZCBmb3IgdHJhbnNtaXNzaW9uLgorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0dXMgb2YgdHJhbnNtaXNzaW9uICAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX0NBTl9UUkFOU01JVF9TVEFUVVMoX19IQU5ETEVfXywgX19UUkFOU01JVE1BSUxCT1hfXylcCisoKChfX1RSQU5TTUlUTUFJTEJPWF9fKSA9PSBDQU5fVFhNQUlMQk9YXzApPyAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5UU1IpICYgKENBTl9UU1JfUlFDUDAgfCBDQU5fVFNSX1RNRTApKSA9PSAoQ0FOX1RTUl9SUUNQMCB8IENBTl9UU1JfVE1FMCkpIDpcCisgKChfX1RSQU5TTUlUTUFJTEJPWF9fKSA9PSBDQU5fVFhNQUlMQk9YXzEpPyAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5UU1IpICYgKENBTl9UU1JfUlFDUDEgfCBDQU5fVFNSX1RNRTEpKSA9PSAoQ0FOX1RTUl9SUUNQMSB8IENBTl9UU1JfVE1FMSkpIDpcCisgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+VFNSKSAmIChDQU5fVFNSX1JRQ1AyIHwgQ0FOX1RTUl9UTUUyKSkgPT0gKENBTl9UU1JfUlFDUDIgfCBDQU5fVFNSX1RNRTIpKSkKKworIC8qKgorICAqIEBicmllZiAgUmVsZWFzZSB0aGUgc3BlY2lmaWVkIHJlY2VpdmUgRklGTy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gQ0FOIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRklGT05VTUJFUl9fIFJlY2VpdmUgRklGTyBudW1iZXIsIENBTl9GSUZPMCBvciBDQU5fRklGTzEuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NBTl9GSUZPX1JFTEVBU0UoX19IQU5ETEVfXywgX19GSUZPTlVNQkVSX18pICgoKF9fRklGT05VTUJFUl9fKSA9PSBDQU5fRklGTzApPyBcCisoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UkYwUiB8PSBDQU5fUkYwUl9SRk9NMCkgOiAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UkYxUiB8PSBDQU5fUkYxUl9SRk9NMSkpIAorCisvKioKKyAgKiBAYnJpZWYgIENhbmNlbCBhIHRyYW5zbWl0IHJlcXVlc3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgQ0FOIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fVFJBTlNNSVRNQUlMQk9YX18gdGhlIG51bWJlciBvZiB0aGUgbWFpbGJveCB0aGF0IGlzIHVzZWQgZm9yIHRyYW5zbWlzc2lvbi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ0FOX0NBTkNFTF9UUkFOU01JVChfX0hBTkRMRV9fLCBfX1RSQU5TTUlUTUFJTEJPWF9fKVwKKygoKF9fVFJBTlNNSVRNQUlMQk9YX18pID09IENBTl9UWE1BSUxCT1hfMCk/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5UU1IgfD0gQ0FOX1RTUl9BQlJRMCkgOlwKKyAoKF9fVFJBTlNNSVRNQUlMQk9YX18pID09IENBTl9UWE1BSUxCT1hfMSk/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5UU1IgfD0gQ0FOX1RTUl9BQlJRMSkgOlwKKyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+VFNSIHw9IENBTl9UU1JfQUJSUTIpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlcyB0aGUgREJHIEZyZWV6ZSBmb3IgQ0FOLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIENBTiBIYW5kbGUuCisgICogQHBhcmFtICBfX05FV1NUQVRFX18gbmV3IHN0YXRlIG9mIHRoZSBDQU4gcGVyaXBoZXJhbC4gCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSAoQ0FOIHJlY2VwdGlvbi90cmFuc21pc3Npb24gaXMgZnJvemVuCisgICogICAgICAgICBkdXJpbmcgZGVidWcuIFJlY2VwdGlvbiBGSUZPcyBjYW4gc3RpbGwgYmUgYWNjZXNzZWQvY29udHJvbGxlZCBub3JtYWxseSkgCisgICogICAgICAgICBvciBESVNBQkxFIChDQU4gaXMgd29ya2luZyBkdXJpbmcgZGVidWcpLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DQU5fREJHX0ZSRUVaRShfX0hBTkRMRV9fLCBfX05FV1NUQVRFX18pICgoKF9fTkVXU1RBVEVfXykgPT0gRU5BQkxFKT8gXAorKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPk1DUiB8PSBDQU5fTUNSX0RCRikgOiAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+TUNSICY9IH5DQU5fTUNSX0RCRikpIAorCisvKioKKyAqIEB9CisgKi8gIAorIAorLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gIAorLyoqIEBhZGR0b2dyb3VwIENBTl9FeHBvcnRlZF9GdW5jdGlvbnMgQ0FOIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisgIAorLyoqIEBhZGR0b2dyb3VwIENBTl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgCisgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAKKyAqIEB7CisgKi8KKyAgCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DQU5fSW5pdChDQU5fSGFuZGxlVHlwZURlZiogaGNhbik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ0FOX0NvbmZpZ0ZpbHRlcihDQU5fSGFuZGxlVHlwZURlZiogaGNhbiwgQ0FOX0ZpbHRlckNvbmZUeXBlRGVmKiBzRmlsdGVyQ29uZmlnKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DQU5fRGVJbml0KENBTl9IYW5kbGVUeXBlRGVmKiBoY2FuKTsKK3ZvaWQgSEFMX0NBTl9Nc3BJbml0KENBTl9IYW5kbGVUeXBlRGVmKiBoY2FuKTsKK3ZvaWQgSEFMX0NBTl9Nc3BEZUluaXQoQ0FOX0hhbmRsZVR5cGVEZWYqIGhjYW4pOworLyoqCisgKiBAfQorICovIAorIAorLyoqIEBhZGR0b2dyb3VwIENBTl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElucHV0IGFuZCBPdXRwdXQgb3BlcmF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgICBJL08gb3BlcmF0aW9uIGZ1bmN0aW9ucyAKKyAqIEB7CisgKi8KKy8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ0FOX1RyYW5zbWl0KENBTl9IYW5kbGVUeXBlRGVmICpoY2FuLCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DQU5fVHJhbnNtaXRfSVQoQ0FOX0hhbmRsZVR5cGVEZWYgKmhjYW4pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NBTl9SZWNlaXZlKENBTl9IYW5kbGVUeXBlRGVmICpoY2FuLCB1aW50OF90IEZJRk9OdW1iZXIsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NBTl9SZWNlaXZlX0lUKENBTl9IYW5kbGVUeXBlRGVmICpoY2FuLCB1aW50OF90IEZJRk9OdW1iZXIpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NBTl9TbGVlcChDQU5fSGFuZGxlVHlwZURlZiAqaGNhbik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ0FOX1dha2VVcChDQU5fSGFuZGxlVHlwZURlZiAqaGNhbik7Cit2b2lkIEhBTF9DQU5fSVJRSGFuZGxlcihDQU5fSGFuZGxlVHlwZURlZiogaGNhbik7Cit2b2lkIEhBTF9DQU5fVHhDcGx0Q2FsbGJhY2soQ0FOX0hhbmRsZVR5cGVEZWYqIGhjYW4pOwordm9pZCBIQUxfQ0FOX1J4Q3BsdENhbGxiYWNrKENBTl9IYW5kbGVUeXBlRGVmKiBoY2FuKTsKK3ZvaWQgSEFMX0NBTl9FcnJvckNhbGxiYWNrKENBTl9IYW5kbGVUeXBlRGVmICpoY2FuKTsKKy8qKgorICogQH0KKyAqLyAKKyAKKy8qKiBAYWRkdG9ncm91cCBDQU5fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBDQU4gUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgCisgKiBAeworICovCisvKiBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgSEFMX0NBTl9HZXRFcnJvcihDQU5fSGFuZGxlVHlwZURlZiAqaGNhbik7CitIQUxfQ0FOX1N0YXRlVHlwZURlZiBIQUxfQ0FOX0dldFN0YXRlKENBTl9IYW5kbGVUeXBlRGVmKiBoY2FuKTsKKy8qKgorICogQH0KKyAqLyAKKyAKKy8qKgorICogQH0KKyAqLyAKKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ0FOX1ByaXZhdGVfVHlwZXMgQ0FOIFByaXZhdGUgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDQU5fUHJpdmF0ZV9WYXJpYWJsZXMgQ0FOIFByaXZhdGUgVmFyaWFibGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8gCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENBTl9Qcml2YXRlX0NvbnN0YW50cyBDQU4gUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworI2RlZmluZSBDQU5fVFhTVEFUVVNfTk9NQUlMQk9YICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyohPCBDQU4gY2VsbCBkaWQgbm90IHByb3ZpZGUgQ0FOX1R4U3RhdHVzX05vTWFpbEJveCAqLworI2RlZmluZSBDQU5fRkxBR19NQVNLICAoMHgwMDAwMDBGRlUpCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIE1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENBTl9Qcml2YXRlX01hY3JvcyBDQU4gUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX0NBTl9NT0RFKE1PREUpICgoKE1PREUpID09IENBTl9NT0RFX05PUk1BTCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBDQU5fTU9ERV9MT09QQkFDSyl8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IENBTl9NT0RFX1NJTEVOVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBDQU5fTU9ERV9TSUxFTlRfTE9PUEJBQ0spKQorCisjZGVmaW5lIElTX0NBTl9TSlcoU0pXKSAoKChTSlcpID09IENBTl9TSldfMVRRKSB8fCAoKFNKVykgPT0gQ0FOX1NKV18yVFEpfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoU0pXKSA9PSBDQU5fU0pXXzNUUSkgfHwgKChTSlcpID09IENBTl9TSldfNFRRKSkKKworI2RlZmluZSBJU19DQU5fQlMxKEJTMSkgKChCUzEpIDw9IENBTl9CUzFfMTZUUSkKKworI2RlZmluZSBJU19DQU5fQlMyKEJTMikgKChCUzIpIDw9IENBTl9CUzJfOFRRKQorCisjZGVmaW5lIElTX0NBTl9QUkVTQ0FMRVIoUFJFU0NBTEVSKSAoKChQUkVTQ0FMRVIpID49IDFVKSAmJiAoKFBSRVNDQUxFUikgPD0gMTAyNFUpKQorCisjZGVmaW5lIElTX0NBTl9GSUxURVJfTlVNQkVSKE5VTUJFUikgKChOVU1CRVIpIDw9IDI3VSkKKworI2RlZmluZSBJU19DQU5fRklMVEVSX01PREUoTU9ERSkgKCgoTU9ERSkgPT0gQ0FOX0ZJTFRFUk1PREVfSURNQVNLKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBDQU5fRklMVEVSTU9ERV9JRExJU1QpKQorCisjZGVmaW5lIElTX0NBTl9GSUxURVJfU0NBTEUoU0NBTEUpICgoKFNDQUxFKSA9PSBDQU5fRklMVEVSU0NBTEVfMTZCSVQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0NBTEUpID09IENBTl9GSUxURVJTQ0FMRV8zMkJJVCkpCisKKyNkZWZpbmUgSVNfQ0FOX0ZJTFRFUl9GSUZPKEZJRk8pICgoKEZJRk8pID09IENBTl9GSUxURVJfRklGTzApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZJRk8pID09IENBTl9GSUxURVJfRklGTzEpKQorCisjZGVmaW5lIElTX0NBTl9CQU5LTlVNQkVSKEJBTktOVU1CRVIpICgoQkFOS05VTUJFUikgPD0gMjhVKQorCisjZGVmaW5lIElTX0NBTl9UUkFOU01JVE1BSUxCT1goVFJBTlNNSVRNQUlMQk9YKSAoKFRSQU5TTUlUTUFJTEJPWCkgPD0gKCh1aW50OF90KTB4MDJVKSkKKyNkZWZpbmUgSVNfQ0FOX1NURElEKFNURElEKSAgICgoU1RESUQpIDw9ICgweDdGRlUpKQorI2RlZmluZSBJU19DQU5fRVhUSUQoRVhUSUQpICAgKChFWFRJRCkgPD0gKDB4MUZGRkZGRkZVKSkKKyNkZWZpbmUgSVNfQ0FOX0RMQyhETEMpICAgICAgICgoRExDKSA8PSAoKHVpbnQ4X3QpMHgwOFUpKQorCisjZGVmaW5lIElTX0NBTl9JRFRZUEUoSURUWVBFKSAgKCgoSURUWVBFKSA9PSBDQU5fSURfU1REKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSURUWVBFKSA9PSBDQU5fSURfRVhUKSkKKworI2RlZmluZSBJU19DQU5fUlRSKFJUUikgKCgoUlRSKSA9PSBDQU5fUlRSX0RBVEEpIHx8ICgoUlRSKSA9PSBDQU5fUlRSX1JFTU9URSkpCisKKyNkZWZpbmUgSVNfQ0FOX0ZJRk8oRklGTykgKCgoRklGTykgPT0gQ0FOX0ZJRk8wKSB8fCAoKEZJRk8pID09IENBTl9GSUZPMSkpCisKKyNkZWZpbmUgSVNfQ0FOX0lUKElUKSAgICAgICAgKCgoSVQpID09IENBTl9JVF9UTUUpIHx8ICgoSVQpID09IENBTl9JVF9GTVAwKSAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpID09IENBTl9JVF9GRjApICB8fCAoKElUKSA9PSBDQU5fSVRfRk9WMCkgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElUKSA9PSBDQU5fSVRfRk1QMSkgfHwgKChJVCkgPT0gQ0FOX0lUX0ZGMSkgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gQ0FOX0lUX0ZPVjEpIHx8ICgoSVQpID09IENBTl9JVF9FV0cpICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpID09IENBTl9JVF9FUFYpICB8fCAoKElUKSA9PSBDQU5fSVRfQk9GKSAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElUKSA9PSBDQU5fSVRfTEVDKSAgfHwgKChJVCkgPT0gQ0FOX0lUX0VSUikgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gQ0FOX0lUX1dLVSkgIHx8ICgoSVQpID09IENBTl9JVF9TTEspKQorCisjZGVmaW5lIElTX0NBTl9DTEVBUl9JVChJVCkgKCgoSVQpID09IENBTl9JVF9UTUUpIHx8ICgoSVQpID09IENBTl9JVF9GRjApICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElUKSA9PSBDQU5fSVRfRk9WMCl8fCAoKElUKSA9PSBDQU5fSVRfRkYxKSAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gQ0FOX0lUX0ZPVjEpfHwgKChJVCkgPT0gQ0FOX0lUX0VXRykgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpID09IENBTl9JVF9FUFYpIHx8ICgoSVQpID09IENBTl9JVF9CT0YpICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElUKSA9PSBDQU5fSVRfTEVDKSB8fCAoKElUKSA9PSBDQU5fSVRfRVJSKSAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gQ0FOX0lUX1dLVSkgfHwgKChJVCkgPT0gQ0FOX0lUX1NMSykpCisKKy8qKgorICAqIEB9CisgICovCisvKiBFbmQgb2YgcHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAgICAgICAgICAgICAgICAgICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkYzeHhfQ0FOX0ggKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyX2Fzc2VydF90ZW1wbGF0ZS5oIGIvSW5jL3N0bTMyX2Fzc2VydF90ZW1wbGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MWUwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJfYXNzZXJ0X3RlbXBsYXRlLmgKQEAgLTAsMCArMSw3MyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyX2Fzc2VydC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBTVE0zMiBhc3NlcnQgdGVtcGxhdGUgZmlsZS4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgYXBwbGljYXRpb24gZm9sZGVyIGFuZCByZW5hbWVkCisgICogICAgICAgICAgdG8gc3RtMzJfYXNzZXJ0LmguCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyX0FTU0VSVF9ICisjZGVmaW5lIF9fU1RNMzJfQVNTRVJUX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiAgVVNFX0ZVTExfQVNTRVJUCisvKioKKyAgKiBAYnJpZWYgIFRoZSBhc3NlcnRfcGFyYW0gbWFjcm8gaXMgdXNlZCBmb3IgZnVuY3Rpb24ncyBwYXJhbWV0ZXJzIGNoZWNrLgorICAqIEBwYXJhbSAgZXhwciBJZiBleHByIGlzIGZhbHNlLCBpdCBjYWxscyBhc3NlcnRfZmFpbGVkIGZ1bmN0aW9uCisgICogICAgICAgICB3aGljaCByZXBvcnRzIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBhbmQgdGhlIHNvdXJjZQorICAqICAgICAgICAgbGluZSBudW1iZXIgb2YgdGhlIGNhbGwgdGhhdCBmYWlsZWQuCisgICogICAgICAgICBJZiBleHByIGlzIHRydWUsIGl0IHJldHVybnMgbm8gdmFsdWUuCisgICogQHJldHZhbCBOb25lCisgICovCisgICNkZWZpbmUgYXNzZXJ0X3BhcmFtKGV4cHIpICgoZXhwcikgPyAodm9pZCkwVSA6IGFzc2VydF9mYWlsZWQoKGNoYXIgKilfX0ZJTEVfXywgX19MSU5FX18pKQorLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgdm9pZCBhc3NlcnRfZmFpbGVkKGNoYXIqIGZpbGUsIHVpbnQzMl90IGxpbmUpOworI2Vsc2UKKyAgI2RlZmluZSBhc3NlcnRfcGFyYW0oZXhwcikgKCh2b2lkKTBVKQorI2VuZGlmIC8qIFVTRV9GVUxMX0FTU0VSVCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMl9BU1NFUlRfSCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2hhbC5oIGIvSW5jL3N0bTMyZjN4eF9oYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjIyMTVkCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjN4eF9oYWwuaApAQCAtMCwwICsxLDk2MSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWwuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCB0aGUgZnVuY3Rpb25zIHByb3RvdHlwZXMgZm9yIHRoZSBIQUwgCisgICogICAgICAgICAgbW9kdWxlIGRyaXZlci4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovIAorCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyRjN4eF9IQUxfSAorI2RlZmluZSBfX1NUTTMyRjN4eF9IQUxfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfY29uZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgSEFMCisgICogQHsKKyAgKi8gCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgSEFMX1ByaXZhdGVfTWFjcm9zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfU1lTQ0ZHX0ZBU1RNT0RFUExVUyhfX1BJTl9fKSAoKCgoX19QSU5fXykgJiBTWVNDRkdfRkFTVE1PREVQTFVTX1BCNikgID09IFNZU0NGR19GQVNUTU9ERVBMVVNfUEI2KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1BJTl9fKSAmIFNZU0NGR19GQVNUTU9ERVBMVVNfUEI3KSAgPT0gU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjcpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fUElOX18pICYgU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjgpICA9PSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCOCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19QSU5fXykgJiBTWVNDRkdfRkFTVE1PREVQTFVTX1BCOSkgID09IFNZU0NGR19GQVNUTU9ERVBMVVNfUEI5KSkKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBIQUxfRXhwb3J0ZWRfQ29uc3RhbnRzIEhBTCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9USUNLX0ZSRVEgVGljayBGcmVxdWVuY3kKKyAgKiBAeworICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9USUNLX0ZSRVFfMTBIWiAgICAgICAgID0gMTAwVSwKKyAgSEFMX1RJQ0tfRlJFUV8xMDBIWiAgICAgICAgPSAxMFUsCisgIEhBTF9USUNLX0ZSRVFfMUtIWiAgICAgICAgID0gMVUsCisgIEhBTF9USUNLX0ZSRVFfREVGQVVMVCAgICAgID0gSEFMX1RJQ0tfRlJFUV8xS0haCit9IEhBTF9UaWNrRnJlcVR5cGVEZWY7CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworLyoqIEBkZWZncm91cCBIQUxfRXhwb3J0ZWRfQ29uc3RhbnRzIEhBTCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworLyoqIEBkZWZncm91cCBTWVNDRkdfQml0QWRkcmVzc19BbGlhc1JlZ2lvbiBTWVNDRkcgcmVnaXN0ZXJzIGJpdCBhZGRyZXNzIGluIHRoZSBhbGlhcyByZWdpb24KKyAgKiBAYnJpZWYgU1lTQ0ZHIHJlZ2lzdGVycyBiaXQgYWRkcmVzcyBpbiB0aGUgYWxpYXMgcmVnaW9uCisgICogQHsKKyAgKi8KKy8qIC0tLS0tLS0tLS0tLSBTWVNDRkcgcmVnaXN0ZXJzIGJpdCBhZGRyZXNzIGluIHRoZSBhbGlhcyByZWdpb24gLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNZU0NGR19PRkZTRVQgICAgICAgICAgICAgICAgKFNZU0NGR19CQVNFIC0gUEVSSVBIX0JBU0UpCisvKiAtLS0gQ0ZHUjIgUmVnaXN0ZXIgLS0tKi8KKy8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBCWVBfQUREUl9QQVIgYml0ICovCisjZGVmaW5lIENGR1IyX09GRlNFVCAgICAgICAgICAgICAgICAgKFNZU0NGR19PRkZTRVQgKyAweDE4VSkKKyNkZWZpbmUgQllQQUREUlBBUl9CaXROdW1iZXIgICAgICAgICAgMHgwNFUKKyNkZWZpbmUgQ0ZHUjJfQllQQUREUlBBUl9CQiAgICAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ0ZHUjJfT0ZGU0VUICogMzJVKSArIChCWVBBRERSUEFSX0JpdE51bWJlciAqIDRVKSkKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSMV9ETUFfUk1QKQorLyoqIEBkZWZncm91cCBIQUxfRE1BX1JlbWFwcGluZyBIQUwgRE1BIFJlbWFwcGluZworICAqICAgICAgICBFbGVtZW50cyB2YWx1ZXMgY29udmVudGlvbjogMHhYWFlZWVlZWQorICAqICAgICAgICAgICAtIFlZWVlZWSAgOiBQb3NpdGlvbiBpbiB0aGUgcmVnaXN0ZXIKKyAgKiAgICAgICAgICAgLSBYWCAgOiBSZWdpc3RlciBpbmRleAorICAqICAgICAgICAgICAgICAgICAtIDAwOiBDRkdSMSByZWdpc3RlciBpbiBTWVNDRkcKKyAgKiAgICAgICAgICAgICAgICAgLSAwMTogQ0ZHUjMgcmVnaXN0ZXIgaW4gU1lTQ0ZHIChub3QgYXZhaWxhYmxlIG9uIFNUTTMyRjM3M3hDL1NUTTMyRjM3OHh4IGRldmljZXMpCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX1JFTUFQRE1BX0FEQzI0X0RNQTJfQ0gzNCAgICAgICAgICgweDAwMDAwMTAwVSkgLyohPCBBREMyNCBETUEgcmVtYXAgKFNUTTMyRjMwM3hCL0MvRSwgU1RNMzJGMzU4eHggYW5kIFNUTTMyRjM5OHh4IGRldmljZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IFJlbWFwIChBREMyNCBETUEgcmVxdWVzdHMgbWFwcGVkIG9uIERNQTIgY2hhbm5lbHMgMyBhbmQgNCkgKi8KKyNkZWZpbmUgSEFMX1JFTUFQRE1BX1RJTTE2X0RNQTFfQ0g2ICAgICAgICAgICgweDAwMDAwODAwVSkgLyohPCBUSU0xNiBETUEgcmVxdWVzdCByZW1hcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IFJlbWFwIChUSU0xNl9DSDEgYW5kIFRJTTE2X1VQIERNQSByZXF1ZXN0cyBtYXBwZWQgb24gRE1BMSBjaGFubmVsIDYpICovCisjZGVmaW5lIEhBTF9SRU1BUERNQV9USU0xN19ETUExX0NINyAgICAgICAgICAoMHgwMDAwMTAwMFUpIC8qITwgVElNMTcgRE1BIHJlcXVlc3QgcmVtYXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiBSZW1hcCAoVElNMTdfQ0gxIGFuZCBUSU0xN19VUCBETUEgcmVxdWVzdHMgbWFwcGVkIG9uIERNQTEgY2hhbm5lbCA3KSAqLworI2RlZmluZSBIQUxfUkVNQVBETUFfVElNNl9EQUMxX0NIMV9ETUExX0NIMyAgKDB4MDAwMDIwMDBVKSAvKiE8IFRJTTYgYW5kIERBQyBjaGFubmVsMSBETUEgcmVtYXAgKFNUTTMyRjMwM3hCL0MvRSwgU1RNMzJGMzU4eHggYW5kIFNUTTMyRjM5OHh4IGRldmljZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogUmVtYXAgKFRJTTZfVVAgYW5kIERBQ19DSDEgRE1BIHJlcXVlc3RzIG1hcHBlZCBvbiBETUExIGNoYW5uZWwgMykgKi8KKyNkZWZpbmUgSEFMX1JFTUFQRE1BX1RJTTdfREFDMV9DSDJfRE1BMV9DSDQgICgweDAwMDA0MDAwVSkgLyohPCBUSU03IGFuZCBEQUMgY2hhbm5lbDIgRE1BIHJlbWFwIChTVE0zMkYzMDN4Qi9DL0UsIFNUTTMyRjM1OHh4IGFuZCBTVE0zMkYzOTh4eCBkZXZpY2VzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IFJlbWFwIChUSU03X1VQIGFuZCBEQUNfQ0gyIERNQSByZXF1ZXN0cyBtYXBwZWQgb24gRE1BMSBjaGFubmVsIDQpICovCisjZGVmaW5lIEhBTF9SRU1BUERNQV9EQUMyX0NIMV9ETUExX0NINSAgICAgICAoMHgwMDAwODAwMFUpIC8qITwgREFDMiBjaGFubmVsMSBETUEgcmVtYXAgKFNUTTMyRjMwM3g0LzYvOCBkZXZpY2VzIG9ubHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogUmVtYXAgKERBQzJfQ0gxIERNQSByZXF1ZXN0cyBtYXBwZWQgb24gRE1BMSBjaGFubmVsIDUpICovCisjZGVmaW5lIEhBTF9SRU1BUERNQV9USU0xOF9EQUMyX0NIMV9ETUExX0NINSAoMHgwMDAwODAwMFUpIC8qITwgREFDMiBjaGFubmVsMSBETUEgcmVtYXAgKFNUTTMyRjMwM3g0LzYvOCBkZXZpY2VzIG9ubHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogUmVtYXAgKERBQzJfQ0gxIERNQSByZXF1ZXN0cyBtYXBwZWQgb24gRE1BMSBjaGFubmVsIDUpICovCisjaWYgZGVmaW5lZChTWVNDRkdfQ0ZHUjNfRE1BX1JNUCkKKyNpZiAhZGVmaW5lZChIQUxfUkVNQVBfQ0ZHUjNfTUFTSykgCisjZGVmaW5lIEhBTF9SRU1BUF9DRkdSM19NQVNLICAgICAgICAgICAgICAgICAoMHgwMTAwMDAwMFUpCisjZW5kaWYKKworI2RlZmluZSBIQUxfUkVNQVBETUFfU1BJMV9SWF9ETUExX0NIMiAgICAgICAgKDB4MDEwMDAwMDNVKSAvKiE8IFNQSTFfUlggRE1BIHJlbWFwIChTVE0zMkYzMDN4NC82LzggZGV2aWNlcyBvbmx5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOiBNYXAgb24gRE1BMSBjaGFubmVsIDIgKi8KKyNkZWZpbmUgSEFMX1JFTUFQRE1BX1NQSTFfUlhfRE1BMV9DSDQgICAgICAgICgweDAxMDAwMDAxVSkgLyohPCBTUEkxX1JYIERNQSByZW1hcCAoU1RNMzJGMzAzeDQvNi84IGRldmljZXMgb25seSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMTogTWFwIG9uIERNQTEgY2hhbm5lbCA0ICovCisjZGVmaW5lIEhBTF9SRU1BUERNQV9TUEkxX1JYX0RNQTFfQ0g2ICAgICAgICAoMHgwMTAwMDAwMlUpIC8qITwgU1BJMV9SWCBETUEgcmVtYXAgKFNUTTMyRjMwM3g0LzYvOCBkZXZpY2VzIG9ubHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA6IE1hcCBvbiBETUExIGNoYW5uZWwgNiAqLworI2RlZmluZSBIQUxfUkVNQVBETUFfU1BJMV9UWF9ETUExX0NIMyAgICAgICAgKDB4MDEwMDAwMENVKSAvKiE8IFNQSTFfVFggRE1BIHJlbWFwIChTVE0zMkYzMDN4NC82LzggZGV2aWNlcyBvbmx5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOiBNYXAgb24gRE1BMSBjaGFubmVsIDMgKi8KKyNkZWZpbmUgSEFMX1JFTUFQRE1BX1NQSTFfVFhfRE1BMV9DSDUgICAgICAgICgweDAxMDAwMDA0VSkgLyohPCBTUEkxX1RYIERNQSByZW1hcCAoU1RNMzJGMzAzeDQvNi84IGRldmljZXMgb25seSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMTogTWFwIG9uIERNQTEgY2hhbm5lbCA1ICovCisjZGVmaW5lIEhBTF9SRU1BUERNQV9TUEkxX1RYX0RNQTFfQ0g3ICAgICAgICAoMHgwMTAwMDAwOFUpIC8qITwgU1BJMV9UWCBETUEgcmVtYXAgKFNUTTMyRjMwM3g0LzYvOCBkZXZpY2VzIG9ubHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA6IE1hcCBvbiBETUExIGNoYW5uZWwgNyAqLworI2RlZmluZSBIQUxfUkVNQVBETUFfSTJDMV9SWF9ETUExX0NINyAgICAgICAgKDB4MDEwMDAwMzBVKSAvKiE8IEkyQzFfUlggRE1BIHJlbWFwIChTVE0zMkYzMDN4NC82LzggZGV2aWNlcyBvbmx5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOiBNYXAgb24gRE1BMSBjaGFubmVsIDcgKi8KKyNkZWZpbmUgSEFMX1JFTUFQRE1BX0kyQzFfUlhfRE1BMV9DSDMgICAgICAgICgweDAxMDAwMDEwVSkgLyohPCBJMkMxX1JYIERNQSByZW1hcCAoU1RNMzJGMzAzeDQvNi84IGRldmljZXMgb25seSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMTogTWFwIG9uIERNQTEgY2hhbm5lbCAzICovCisjZGVmaW5lIEhBTF9SRU1BUERNQV9JMkMxX1JYX0RNQTFfQ0g1ICAgICAgICAoMHgwMTAwMDAyMFUpIC8qITwgSTJDMV9SWCBETUEgcmVtYXAgKFNUTTMyRjMwM3g0LzYvOCBkZXZpY2VzIG9ubHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA6IE1hcCBvbiBETUExIGNoYW5uZWwgNSAqLworI2RlZmluZSBIQUxfUkVNQVBETUFfSTJDMV9UWF9ETUExX0NINiAgICAgICAgKDB4MDEwMDAwQzBVKSAvKiE8IEkyQzFfVFggRE1BIHJlbWFwIChTVE0zMkYzMDN4NC82LzggZGV2aWNlcyBvbmx5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOiBNYXAgb24gRE1BMSBjaGFubmVsIDYgKi8KKyNkZWZpbmUgSEFMX1JFTUFQRE1BX0kyQzFfVFhfRE1BMV9DSDIgICAgICAgICgweDAxMDAwMDQwVSkgLyohPCBJMkMxX1RYIERNQSByZW1hcCAoU1RNMzJGMzAzeDQvNi84IGRldmljZXMgb25seSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMTogTWFwIG9uIERNQTEgY2hhbm5lbCAyICovCisjZGVmaW5lIEhBTF9SRU1BUERNQV9JMkMxX1RYX0RNQTFfQ0g0ICAgICAgICAoMHgwMTAwMDA4MFUpIC8qITwgSTJDMV9UWCBETUEgcmVtYXAgKFNUTTMyRjMwM3g0LzYvOCBkZXZpY2VzIG9ubHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA6IE1hcCBvbiBETUExIGNoYW5uZWwgNCAqLworI2RlZmluZSBIQUxfUkVNQVBETUFfQURDMl9ETUExX0NIMiAgICAgICAgICAgKDB4MDEwMDAxMDBVKSAvKiE8IEFEQzIgRE1BIHJlbWFwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDA6IE5vIHJlbWFwIChBREMyIG9uIERNQTIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA6IE1hcCBvbiBETUExIGNoYW5uZWwgMiAqLworI2RlZmluZSBIQUxfUkVNQVBETUFfQURDMl9ETUExX0NINCAgICAgICAgICAgKDB4MDEwMDAzMDBVKSAvKiE8IEFEQzIgRE1BIHJlbWFwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE6IE1hcCBvbiBETUExIGNoYW5uZWwgNCAqLworI2VuZGlmIC8qIFNZU0NGR19DRkdSM19ETUFfUk1QICovCisKKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSM19ETUFfUk1QKQorI2RlZmluZSBJU19ETUFfUkVNQVAoUk1QKSAoKCgoUk1QKSAmIEhBTF9SRU1BUERNQV9BREMyNF9ETUEyX0NIMzQpICAgICAgICAgPT0gSEFMX1JFTUFQRE1BX0FEQzI0X0RNQTJfQ0gzNCkgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChSTVApICYgSEFMX1JFTUFQRE1BX1RJTTE2X0RNQTFfQ0g2KSAgICAgICAgICA9PSBIQUxfUkVNQVBETUFfVElNMTZfRE1BMV9DSDYpICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKFJNUCkgJiBIQUxfUkVNQVBETUFfVElNMTdfRE1BMV9DSDcpICAgICAgICAgID09IEhBTF9SRU1BUERNQV9USU0xN19ETUExX0NINykgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoUk1QKSAmIEhBTF9SRU1BUERNQV9USU02X0RBQzFfQ0gxX0RNQTFfQ0gzKSAgPT0gSEFMX1JFTUFQRE1BX1RJTTZfREFDMV9DSDFfRE1BMV9DSDMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChSTVApICYgSEFMX1JFTUFQRE1BX1RJTTdfREFDMV9DSDJfRE1BMV9DSDQpICA9PSBIQUxfUkVNQVBETUFfVElNN19EQUMxX0NIMl9ETUExX0NINCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKFJNUCkgJiBIQUxfUkVNQVBETUFfREFDMl9DSDFfRE1BMV9DSDUpICAgICAgID09IEhBTF9SRU1BUERNQV9EQUMyX0NIMV9ETUExX0NINSkgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoUk1QKSAmIEhBTF9SRU1BUERNQV9USU0xOF9EQUMyX0NIMV9ETUExX0NINSkgPT0gSEFMX1JFTUFQRE1BX1RJTTE4X0RBQzJfQ0gxX0RNQTFfQ0g1KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChSTVApICYgSEFMX1JFTUFQRE1BX1NQSTFfUlhfRE1BMV9DSDIpICAgICAgICA9PSBIQUxfUkVNQVBETUFfU1BJMV9SWF9ETUExX0NIMikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKFJNUCkgJiBIQUxfUkVNQVBETUFfU1BJMV9SWF9ETUExX0NINCkgICAgICAgID09IEhBTF9SRU1BUERNQV9TUEkxX1JYX0RNQTFfQ0g0KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoUk1QKSAmIEhBTF9SRU1BUERNQV9TUEkxX1JYX0RNQTFfQ0g2KSAgICAgICAgPT0gSEFMX1JFTUFQRE1BX1NQSTFfUlhfRE1BMV9DSDYpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChSTVApICYgSEFMX1JFTUFQRE1BX1NQSTFfVFhfRE1BMV9DSDMpICAgICAgICA9PSBIQUxfUkVNQVBETUFfU1BJMV9UWF9ETUExX0NIMykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKFJNUCkgJiBIQUxfUkVNQVBETUFfU1BJMV9UWF9ETUExX0NINSkgICAgICAgID09IEhBTF9SRU1BUERNQV9TUEkxX1RYX0RNQTFfQ0g1KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoUk1QKSAmIEhBTF9SRU1BUERNQV9TUEkxX1RYX0RNQTFfQ0g3KSAgICAgICAgPT0gSEFMX1JFTUFQRE1BX1NQSTFfVFhfRE1BMV9DSDcpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChSTVApICYgSEFMX1JFTUFQRE1BX0kyQzFfUlhfRE1BMV9DSDcpICAgICAgICA9PSBIQUxfUkVNQVBETUFfSTJDMV9SWF9ETUExX0NINykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKFJNUCkgJiBIQUxfUkVNQVBETUFfSTJDMV9SWF9ETUExX0NIMykgICAgICAgID09IEhBTF9SRU1BUERNQV9JMkMxX1JYX0RNQTFfQ0gzKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoUk1QKSAmIEhBTF9SRU1BUERNQV9JMkMxX1JYX0RNQTFfQ0g1KSAgICAgICAgPT0gSEFMX1JFTUFQRE1BX0kyQzFfUlhfRE1BMV9DSDUpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChSTVApICYgSEFMX1JFTUFQRE1BX0kyQzFfVFhfRE1BMV9DSDYpICAgICAgICA9PSBIQUxfUkVNQVBETUFfSTJDMV9UWF9ETUExX0NINikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKFJNUCkgJiBIQUxfUkVNQVBETUFfSTJDMV9UWF9ETUExX0NIMikgICAgICAgID09IEhBTF9SRU1BUERNQV9JMkMxX1RYX0RNQTFfQ0gyKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoUk1QKSAmIEhBTF9SRU1BUERNQV9JMkMxX1RYX0RNQTFfQ0g0KSAgICAgICAgPT0gSEFMX1JFTUFQRE1BX0kyQzFfVFhfRE1BMV9DSDQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChSTVApICYgSEFMX1JFTUFQRE1BX0FEQzJfRE1BMV9DSDIpICAgICAgICAgICA9PSBIQUxfUkVNQVBETUFfQURDMl9ETUExX0NIMikgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKFJNUCkgJiBIQUxfUkVNQVBETUFfQURDMl9ETUExX0NINCkgICAgICAgICAgID09IEhBTF9SRU1BUERNQV9BREMyX0RNQTFfQ0g0KSkKKyNlbHNlCisjZGVmaW5lIElTX0RNQV9SRU1BUChSTVApICgoKChSTVApICYgSEFMX1JFTUFQRE1BX0FEQzI0X0RNQTJfQ0gzNCkgICAgICAgICA9PSBIQUxfUkVNQVBETUFfQURDMjRfRE1BMl9DSDM0KSAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKFJNUCkgJiBIQUxfUkVNQVBETUFfVElNMTZfRE1BMV9DSDYpICAgICAgICAgID09IEhBTF9SRU1BUERNQV9USU0xNl9ETUExX0NINikgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoUk1QKSAmIEhBTF9SRU1BUERNQV9USU0xN19ETUExX0NINykgICAgICAgICAgPT0gSEFMX1JFTUFQRE1BX1RJTTE3X0RNQTFfQ0g3KSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChSTVApICYgSEFMX1JFTUFQRE1BX1RJTTZfREFDMV9DSDFfRE1BMV9DSDMpICA9PSBIQUxfUkVNQVBETUFfVElNNl9EQUMxX0NIMV9ETUExX0NIMykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKFJNUCkgJiBIQUxfUkVNQVBETUFfVElNN19EQUMxX0NIMl9ETUExX0NINCkgID09IEhBTF9SRU1BUERNQV9USU03X0RBQzFfQ0gyX0RNQTFfQ0g0KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoUk1QKSAmIEhBTF9SRU1BUERNQV9EQUMyX0NIMV9ETUExX0NINSkgICAgICAgPT0gSEFMX1JFTUFQRE1BX0RBQzJfQ0gxX0RNQTFfQ0g1KSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChSTVApICYgSEFMX1JFTUFQRE1BX1RJTTE4X0RBQzJfQ0gxX0RNQTFfQ0g1KSA9PSBIQUxfUkVNQVBETUFfVElNMThfREFDMl9DSDFfRE1BMV9DSDUpKQorI2VuZGlmIC8qIFNZU0NGR19DRkdSM19ETUFfUk1QICYmIFNZU0NGR19DRkdSMV9ETUFfUk1QKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogU1lTQ0ZHX0NGR1IxX0RNQV9STVAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfVHJpZ2dlcl9SZW1hcHBpbmcgSEFMIFRyaWdnZXIgUmVtYXBwaW5nCisgICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAweFhYWVlZWVlZCisgICogICAgICAgICAgIC0gWVlZWVlZICA6IFBvc2l0aW9uIGluIHRoZSByZWdpc3RlcgorICAqICAgICAgICAgICAtIFhYICA6IFJlZ2lzdGVyIGluZGV4CisgICogICAgICAgICAgICAgICAgIC0gMDA6IENGR1IxIHJlZ2lzdGVyIGluIFNZU0NGRworICAqICAgICAgICAgICAgICAgICAtIDAxOiBDRkdSMyByZWdpc3RlciBpbiBTWVNDRkcKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfUkVNQVBUUklHR0VSX0RBQzFfVFJJRyAgICAgICAgICgweDAwMDAwMDgwVSkgIC8qITwgREFDIHRyaWdnZXIgcmVtYXAgKHdoZW4gVFNFTCA9IDAwMSBvbiBTVE0zMkYzMDN4Qi9DIGFuZCBTVE0zMkYzNTh4eCBkZXZpY2VzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogTm8gcmVtYXAgKERBQyB0cmlnZ2VyIGlzIFRJTThfVFJHTykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IFJlbWFwIChEQUMgdHJpZ2dlciBpcyBUSU0zX1RSR08pICovCisjZGVmaW5lIEhBTF9SRU1BUFRSSUdHRVJfVElNMV9JVFIzICAgICAgICAgKDB4MDAwMDAwNDBVKSAgLyohPCBUSU0xIElUUjMgdHJpZ2dlciByZW1hcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogTm8gcmVtYXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IFJlbWFwIChUSU0xX1RSRzMgPSBUSU0xN19PQykgKi8KKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSM19UUklHR0VSX1JNUCkKKyNpZiAhZGVmaW5lZChIQUxfUkVNQVBfQ0ZHUjNfTUFTSykgCisjZGVmaW5lIEhBTF9SRU1BUF9DRkdSM19NQVNLICAgICAgICAgICAgICAgKDB4MDEwMDAwMDBVKQorI2VuZGlmCisjZGVmaW5lIEhBTF9SRU1BUFRSSUdHRVJfREFDMV9UUklHMyAgICAgICAgKDB4MDEwMTAwMDBVKSAgLyohPCBEQUMxX0NIMSAvIERBQzFfQ0gyIFRyaWdnZXIgcmVtYXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6IFJlbWFwIChEQUMgdHJpZ2dlciBpcyBUSU0xNV9UUkdPKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogUmVtYXAgKERBQyB0cmlnZ2VyIGlzIEhSVElNMV9EQUMxX1RSSUcxKSAqLworI2RlZmluZSBIQUxfUkVNQVBUUklHR0VSX0RBQzFfVFJJRzUgICAgICAgICgweDAxMDIwMDAwVSkgIC8qITwgREFDMV9DSDEgLyBEQUMxX0NIMiBUcmlnZ2VyIHJlbWFwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiBObyByZW1hcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogUmVtYXAgKERBQyB0cmlnZ2VyIGlzIEhSVElNMV9EQUMxX1RSSUcyKSAqLworI2RlZmluZSBJU19IQUxfUkVNQVBUUklHR0VSKFJNUCkgKCgoKFJNUCkgJiBIQUxfUkVNQVBUUklHR0VSX0RBQzEpICAgICAgID09IEhBTF9SRU1BUFRSSUdHRVJfREFDMSkgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKFJNUCkgJiBIQUxfUkVNQVBUUklHR0VSX1RJTTFfSVRSMykgID09IEhBTF9SRU1BUFRSSUdHRVJfVElNMV9JVFIzKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKFJNUCkgJiBIQUxfUkVNQVBUUklHR0VSX0RBQzFfVFJJRzMpID09IEhBTF9SRU1BUFRSSUdHRVJfREFDMV9UUklHMykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKFJNUCkgJiBIQUxfUkVNQVBUUklHR0VSX0RBQzFfVFJJRzUpID09IEhBTF9SRU1BUFRSSUdHRVJfREFDMV9UUklHNSkpCisjZWxzZQorI2RlZmluZSBJU19IQUxfUkVNQVBUUklHR0VSKFJNUCkgKCgoKFJNUCkgJiBIQUxfUkVNQVBUUklHR0VSX0RBQzEpICAgICAgID09IEhBTF9SRU1BUFRSSUdHRVJfREFDMSkgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKFJNUCkgJiBIQUxfUkVNQVBUUklHR0VSX1RJTTFfSVRSMykgID09IEhBTF9SRU1BUFRSSUdHRVJfVElNMV9JVFIzKSkKKyNlbmRpZiAvKiBTWVNDRkdfQ0ZHUjNfVFJJR0dFUl9STVAgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkIChTVE0zMkYzMDJ4RSkKKy8qKiBAZGVmZ3JvdXAgSEFMX0FEQ19UcmlnZ2VyX1JlbWFwcGluZyBIQUwgQURDIFRyaWdnZXIgUmVtYXBwaW5nCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX1JFTUFQQURDVFJJR0dFUl9BREMxMl9FWFQyICAgICAgICBTWVNDRkdfQ0ZHUjRfQURDMTJfRVhUMl9STVAgICAvKiE8IElucHV0IHRyaWdnZXIgb2YgQURDMTIgcmVndWxhciBjaGFubmVsIEVYVDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6IE5vIHJlbWFwIChUSU0xX0NDMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IFJlbWFwIChUSU0yMF9UUkdPKSAqLworI2RlZmluZSBIQUxfUkVNQVBBRENUUklHR0VSX0FEQzEyX0VYVDMgICAgICAgIFNZU0NGR19DRkdSNF9BREMxMl9FWFQzX1JNUCAgIC8qITwgSW5wdXQgdHJpZ2dlciBvZiBBREMxMiByZWd1bGFyIGNoYW5uZWwgRVhUMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogTm8gcmVtYXAgKFRJTTJfQ0MyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogUmVtYXAgKFRJTTIwX1RSR08yKSAqLworI2RlZmluZSBIQUxfUkVNQVBBRENUUklHR0VSX0FEQzEyX0VYVDUgICAgICAgIFNZU0NGR19DRkdSNF9BREMxMl9FWFQ1X1JNUCAgIC8qITwgSW5wdXQgdHJpZ2dlciBvZiBBREMxMiByZWd1bGFyIGNoYW5uZWwgRVhUNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogTm8gcmVtYXAgKFRJTTRfQ0M0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogUmVtYXAgKFRJTTIwX0NDMSkgKi8KKyNkZWZpbmUgSEFMX1JFTUFQQURDVFJJR0dFUl9BREMxMl9FWFQxMyAgICAgICBTWVNDRkdfQ0ZHUjRfQURDMTJfRVhUMTNfUk1QICAvKiE8IElucHV0IHRyaWdnZXIgb2YgQURDMTIgcmVndWxhciBjaGFubmVsIEVYVDEzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiBObyByZW1hcCAoVElNNl9UUkdPKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogUmVtYXAgKFRJTTIwX0NDMikgKi8KKyNkZWZpbmUgSEFMX1JFTUFQQURDVFJJR0dFUl9BREMxMl9FWFQxNSAgICAgICBTWVNDRkdfQ0ZHUjRfQURDMTJfRVhUMTVfUk1QICAvKiE8IElucHV0IHRyaWdnZXIgb2YgQURDMTIgcmVndWxhciBjaGFubmVsIEVYVDE1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiBObyByZW1hcCAoVElNM19DQzQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiBSZW1hcCAoVElNMjBfQ0MzKSAqLworI2RlZmluZSBIQUxfUkVNQVBBRENUUklHR0VSX0FEQzEyX0pFWFQzICAgICAgIFNZU0NGR19DRkdSNF9BREMxMl9KRVhUM19STVAgIC8qITwgSW5wdXQgdHJpZ2dlciBvZiBBREMxMiBpbmplY3RlZCBjaGFubmVsIEpFWFQzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiBObyByZW1hcCAoVElNMl9DQzEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiBSZW1hcCAoVElNMjBfVFJHTykgKi8KKyNkZWZpbmUgSEFMX1JFTUFQQURDVFJJR0dFUl9BREMxMl9KRVhUNiAgICAgICBTWVNDRkdfQ0ZHUjRfQURDMTJfSkVYVDZfUk1QICAvKiE8IElucHV0IHRyaWdnZXIgb2YgQURDMTIgaW5qZWN0ZWQgY2hhbm5lbCBKRVhUNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogTm8gcmVtYXAgKEVYVEkgbGluZSAxNSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IFJlbWFwIChUSU0yMF9UUkdPMikgKi8KKyNkZWZpbmUgSEFMX1JFTUFQQURDVFJJR0dFUl9BREMxMl9KRVhUMTMgICAgICBTWVNDRkdfQ0ZHUjRfQURDMTJfSkVYVDEzX1JNUCAgLyohPCBJbnB1dCB0cmlnZ2VyIG9mIEFEQzEyIGluamVjdGVkIGNoYW5uZWwgSkVYVDEzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiBObyByZW1hcCAoVElNM19DQzEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiBSZW1hcCAoVElNMjBfQ0M0KSAqLworCisjZGVmaW5lIElTX0hBTF9SRU1BUEFEQ1RSSUdHRVIoUk1QKSAgKCgoKFJNUCkgJiBIQUxfUkVNQVBBRENUUklHR0VSX0FEQzEyX0VYVDIpICAgPT0gSEFMX1JFTUFQQURDVFJJR0dFUl9BREMxMl9FWFQyKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoUk1QKSAmIEhBTF9SRU1BUEFEQ1RSSUdHRVJfQURDMTJfRVhUMykgICA9PSBIQUxfUkVNQVBBRENUUklHR0VSX0FEQzEyX0VYVDMpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChSTVApICYgSEFMX1JFTUFQQURDVFJJR0dFUl9BREMxMl9FWFQ1KSAgID09IEhBTF9SRU1BUEFEQ1RSSUdHRVJfQURDMTJfRVhUNSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKFJNUCkgJiBIQUxfUkVNQVBBRENUUklHR0VSX0FEQzEyX0VYVDEzKSAgPT0gSEFMX1JFTUFQQURDVFJJR0dFUl9BREMxMl9FWFQxMykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoUk1QKSAmIEhBTF9SRU1BUEFEQ1RSSUdHRVJfQURDMTJfRVhUMTUpICA9PSBIQUxfUkVNQVBBRENUUklHR0VSX0FEQzEyX0VYVDE1KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChSTVApICYgSEFMX1JFTUFQQURDVFJJR0dFUl9BREMxMl9KRVhUMykgID09IEhBTF9SRU1BUEFEQ1RSSUdHRVJfQURDMTJfSkVYVDMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKFJNUCkgJiBIQUxfUkVNQVBBRENUUklHR0VSX0FEQzEyX0pFWFQ2KSAgPT0gSEFMX1JFTUFQQURDVFJJR0dFUl9BREMxMl9KRVhUNikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoUk1QKSAmIEhBTF9SRU1BUEFEQ1RSSUdHRVJfQURDMTJfSkVYVDEzKSA9PSBIQUxfUkVNQVBBRENUUklHR0VSX0FEQzEyX0pFWFQxMykpCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFNUTTMyRjMwMnhFICovCisKKyNpZiBkZWZpbmVkIChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZCAoU1RNMzJGMzk4eHgpCisvKiogQGRlZmdyb3VwIEhBTF9BRENfVHJpZ2dlcl9SZW1hcHBpbmcgSEFMIEFEQyBUcmlnZ2VyIFJlbWFwcGluZworICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9SRU1BUEFEQ1RSSUdHRVJfQURDMTJfRVhUMiAgICAgICAgU1lTQ0ZHX0NGR1I0X0FEQzEyX0VYVDJfUk1QICAgLyohPCBJbnB1dCB0cmlnZ2VyIG9mIEFEQzEyIHJlZ3VsYXIgY2hhbm5lbCBFWFQyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiBObyByZW1hcCAoVElNMV9DQzMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiBSZW1hcCAoVElNMjBfVFJHTykgKi8KKyNkZWZpbmUgSEFMX1JFTUFQQURDVFJJR0dFUl9BREMxMl9FWFQzICAgICAgICBTWVNDRkdfQ0ZHUjRfQURDMTJfRVhUM19STVAgICAvKiE8IElucHV0IHRyaWdnZXIgb2YgQURDMTIgcmVndWxhciBjaGFubmVsIEVYVDMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6IE5vIHJlbWFwIChUSU0yX0NDMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IFJlbWFwIChUSU0yMF9UUkdPMikgKi8KKyNkZWZpbmUgSEFMX1JFTUFQQURDVFJJR0dFUl9BREMxMl9FWFQ1ICAgICAgICBTWVNDRkdfQ0ZHUjRfQURDMTJfRVhUNV9STVAgICAvKiE8IElucHV0IHRyaWdnZXIgb2YgQURDMTIgcmVndWxhciBjaGFubmVsIEVYVDUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6IE5vIHJlbWFwIChUSU00X0NDNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IFJlbWFwIChUSU0yMF9DQzEpICovCisjZGVmaW5lIEhBTF9SRU1BUEFEQ1RSSUdHRVJfQURDMTJfRVhUMTMgICAgICAgU1lTQ0ZHX0NGR1I0X0FEQzEyX0VYVDEzX1JNUCAgLyohPCBJbnB1dCB0cmlnZ2VyIG9mIEFEQzEyIHJlZ3VsYXIgY2hhbm5lbCBFWFQxMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogTm8gcmVtYXAgKFRJTTZfVFJHTykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IFJlbWFwIChUSU0yMF9DQzIpICovCisjZGVmaW5lIEhBTF9SRU1BUEFEQ1RSSUdHRVJfQURDMTJfRVhUMTUgICAgICAgU1lTQ0ZHX0NGR1I0X0FEQzEyX0VYVDE1X1JNUCAgLyohPCBJbnB1dCB0cmlnZ2VyIG9mIEFEQzEyIHJlZ3VsYXIgY2hhbm5lbCBFWFQxNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogTm8gcmVtYXAgKFRJTTNfQ0M0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogUmVtYXAgKFRJTTIwX0NDMykgKi8KKyNkZWZpbmUgSEFMX1JFTUFQQURDVFJJR0dFUl9BREMxMl9KRVhUMyAgICAgICBTWVNDRkdfQ0ZHUjRfQURDMTJfSkVYVDNfUk1QICAvKiE8IElucHV0IHRyaWdnZXIgb2YgQURDMTIgaW5qZWN0ZWQgY2hhbm5lbCBKRVhUMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogTm8gcmVtYXAgKFRJTTJfQ0MxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogUmVtYXAgKFRJTTIwX1RSR08pICovCisjZGVmaW5lIEhBTF9SRU1BUEFEQ1RSSUdHRVJfQURDMTJfSkVYVDYgICAgICAgU1lTQ0ZHX0NGR1I0X0FEQzEyX0pFWFQ2X1JNUCAgLyohPCBJbnB1dCB0cmlnZ2VyIG9mIEFEQzEyIGluamVjdGVkIGNoYW5uZWwgSkVYVDYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6IE5vIHJlbWFwIChFWFRJIGxpbmUgMTUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiBSZW1hcCAoVElNMjBfVFJHTzIpICovCisjZGVmaW5lIEhBTF9SRU1BUEFEQ1RSSUdHRVJfQURDMTJfSkVYVDEzICAgICAgU1lTQ0ZHX0NGR1I0X0FEQzEyX0pFWFQxM19STVAgIC8qITwgSW5wdXQgdHJpZ2dlciBvZiBBREMxMiBpbmplY3RlZCBjaGFubmVsIEpFWFQxMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogTm8gcmVtYXAgKFRJTTNfQ0MxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogUmVtYXAgKFRJTTIwX0NDNCkgKi8KKyNkZWZpbmUgSEFMX1JFTUFQQURDVFJJR0dFUl9BREMzNF9FWFQ1ICAgICAgICBTWVNDRkdfQ0ZHUjRfQURDMzRfRVhUNV9STVAgICAvKiE8IElucHV0IHRyaWdnZXIgb2YgQURDMzQgcmVndWxhciBjaGFubmVsIEVYVDUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6IE5vIHJlbWFwIChFWFRJIGxpbmUgMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IFJlbWFwIChUSU0yMF9UUkdPKSAqLworI2RlZmluZSBIQUxfUkVNQVBBRENUUklHR0VSX0FEQzM0X0VYVDYgICAgICAgIFNZU0NGR19DRkdSNF9BREMzNF9FWFQ2X1JNUCAgIC8qITwgSW5wdXQgdHJpZ2dlciBvZiBBREMzNCByZWd1bGFyIGNoYW5uZWwgRVhUNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogTm8gcmVtYXAgKFRJTTRfQ0MxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogUmVtYXAgKFRJTTIwX1RSR08yKSAqLworI2RlZmluZSBIQUxfUkVNQVBBRENUUklHR0VSX0FEQzM0X0VYVDE1ICAgICAgIFNZU0NGR19DRkdSNF9BREMzNF9FWFQxNV9STVAgIC8qITwgSW5wdXQgdHJpZ2dlciBvZiBBREMzNCByZWd1bGFyIGNoYW5uZWwgRVhUMTUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6IE5vIHJlbWFwIChUSU0yX0NDMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IFJlbWFwIChUSU0yMF9DQzEpICovCisjZGVmaW5lIEhBTF9SRU1BUEFEQ1RSSUdHRVJfQURDMzRfSkVYVDUgICAgICAgU1lTQ0ZHX0NGR1I0X0FEQzM0X0pFWFQ1X1JNUCAgLyohPCBJbnB1dCB0cmlnZ2VyIG9mIEFEQzM0IGluamVjdGVkIGNoYW5uZWwgSkVYVDUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6IE5vIHJlbWFwIChUSU00X0NDMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IFJlbWFwIChUSU0yMF9UUkdPKSAqLworI2RlZmluZSBIQUxfUkVNQVBBRENUUklHR0VSX0FEQzM0X0pFWFQxMSAgICAgIFNZU0NGR19DRkdSNF9BREMzNF9KRVhUMTFfUk1QIC8qITwgSW5wdXQgdHJpZ2dlciBvZiBBREMzNCBpbmplY3RlZCBjaGFubmVsIEpFWFQxMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogTm8gcmVtYXAgKFRJTTFfQ0MzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogUmVtYXAgKFRJTTIwX1RSR08yKSAqLworI2RlZmluZSBIQUxfUkVNQVBBRENUUklHR0VSX0FEQzM0X0pFWFQxNCAgICAgIFNZU0NGR19DRkdSNF9BREMzNF9KRVhUMTRfUk1QIC8qITwgSW5wdXQgdHJpZ2dlciBvZiBBREMzNCBpbmplY3RlZCBjaGFubmVsIEpFWFQxNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogTm8gcmVtYXAgKFRJTTdfVFJHTykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IFJlbWFwIChUSU0yMF9DQzIpICovCisKKyNkZWZpbmUgSVNfSEFMX1JFTUFQQURDVFJJR0dFUihSTVApICAoKCgoUk1QKSAmIEhBTF9SRU1BUEFEQ1RSSUdHRVJfQURDMTJfRVhUMikgICA9PSBIQUxfUkVNQVBBRENUUklHR0VSX0FEQzEyX0VYVDIpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChSTVApICYgSEFMX1JFTUFQQURDVFJJR0dFUl9BREMxMl9FWFQzKSAgID09IEhBTF9SRU1BUEFEQ1RSSUdHRVJfQURDMTJfRVhUMykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKFJNUCkgJiBIQUxfUkVNQVBBRENUUklHR0VSX0FEQzEyX0VYVDUpICAgPT0gSEFMX1JFTUFQQURDVFJJR0dFUl9BREMxMl9FWFQ1KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoUk1QKSAmIEhBTF9SRU1BUEFEQ1RSSUdHRVJfQURDMTJfRVhUMTMpICA9PSBIQUxfUkVNQVBBRENUUklHR0VSX0FEQzEyX0VYVDEzKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChSTVApICYgSEFMX1JFTUFQQURDVFJJR0dFUl9BREMxMl9FWFQxNSkgID09IEhBTF9SRU1BUEFEQ1RSSUdHRVJfQURDMTJfRVhUMTUpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKFJNUCkgJiBIQUxfUkVNQVBBRENUUklHR0VSX0FEQzEyX0pFWFQzKSAgPT0gSEFMX1JFTUFQQURDVFJJR0dFUl9BREMxMl9KRVhUMykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoUk1QKSAmIEhBTF9SRU1BUEFEQ1RSSUdHRVJfQURDMTJfSkVYVDYpICA9PSBIQUxfUkVNQVBBRENUUklHR0VSX0FEQzEyX0pFWFQ2KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChSTVApICYgSEFMX1JFTUFQQURDVFJJR0dFUl9BREMxMl9KRVhUMTMpID09IEhBTF9SRU1BUEFEQ1RSSUdHRVJfQURDMTJfSkVYVDEzKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKFJNUCkgJiBIQUxfUkVNQVBBRENUUklHR0VSX0FEQzM0X0VYVDUpICAgPT0gSEFMX1JFTUFQQURDVFJJR0dFUl9BREMzNF9FWFQ1KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoUk1QKSAmIEhBTF9SRU1BUEFEQ1RSSUdHRVJfQURDMzRfRVhUNikgICA9PSBIQUxfUkVNQVBBRENUUklHR0VSX0FEQzM0X0VYVDYpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChSTVApICYgSEFMX1JFTUFQQURDVFJJR0dFUl9BREMzNF9FWFQxNSkgID09IEhBTF9SRU1BUEFEQ1RSSUdHRVJfQURDMzRfRVhUMTUpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKFJNUCkgJiBIQUxfUkVNQVBBRENUUklHR0VSX0FEQzM0X0pFWFQ1KSAgPT0gSEFMX1JFTUFQQURDVFJJR0dFUl9BREMzNF9KRVhUNSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoUk1QKSAmIEhBTF9SRU1BUEFEQ1RSSUdHRVJfQURDMzRfSkVYVDExKSA9PSBIQUxfUkVNQVBBRENUUklHR0VSX0FEQzM0X0pFWFQxMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChSTVApICYgSEFMX1JFTUFQQURDVFJJR0dFUl9BREMzNF9KRVhUMTQpID09IEhBTF9SRU1BUEFEQ1RSSUdHRVJfQURDMzRfSkVYVDE0KSkKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggKi8KKworLyoqIEBkZWZncm91cCBTWVNDRkdfRmFzdE1vZGVQbHVzX0dQSU8gRmFzdC1tb2RlIFBsdXMgb24gR1BJTworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIEZhc3QtbW9kZSBQbHVzIGRyaXZpbmcgY2FwYWJpbGl0eSBvbiBhIHNwZWNpZmljIEdQSU8KKyAgKi8gIAorI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IxX0kyQ19QQjZfRk1QKQorI2RlZmluZSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCNiAgICAoKHVpbnQzMl90KVNZU0NGR19DRkdSMV9JMkNfUEI2X0ZNUCkgIC8qITwgRW5hYmxlIEZhc3QtbW9kZSBQbHVzIG9uIFBCNiAgKi8KKyNlbmRpZiAvKiBTWVNDRkdfQ0ZHUjFfSTJDX1BCNl9GTVAgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IxX0kyQ19QQjdfRk1QKQorI2RlZmluZSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCNyAgICAoKHVpbnQzMl90KVNZU0NGR19DRkdSMV9JMkNfUEI3X0ZNUCkgIC8qITwgRW5hYmxlIEZhc3QtbW9kZSBQbHVzIG9uIFBCNyAgKi8KKyNlbmRpZiAvKiBTWVNDRkdfQ0ZHUjFfSTJDX1BCN19GTVAgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IxX0kyQ19QQjhfRk1QKQorI2RlZmluZSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCOCAgICAoKHVpbnQzMl90KVNZU0NGR19DRkdSMV9JMkNfUEI4X0ZNUCkgIC8qITwgRW5hYmxlIEZhc3QtbW9kZSBQbHVzIG9uIFBCOCAgKi8KKyNlbmRpZiAvKiBTWVNDRkdfQ0ZHUjFfSTJDX1BCOF9GTVAgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IxX0kyQ19QQjlfRk1QKQorI2RlZmluZSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCOSAgICAoKHVpbnQzMl90KVNZU0NGR19DRkdSMV9JMkNfUEI5X0ZNUCkgIC8qITwgRW5hYmxlIEZhc3QtbW9kZSBQbHVzIG9uIFBCOSAgKi8KKyNlbmRpZiAvKiBTWVNDRkdfQ0ZHUjFfSTJDX1BCOV9GTVAgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFNZU0NGR19SQ1JfUEFHRTApCisvKiBDQ00tU1JBTSBkZWZpbmVkICovCisvKiogQGRlZmdyb3VwIEhBTF9QYWdlX1dyaXRlX1Byb3RlY3Rpb24gSEFMIENDTSBSQU0gcGFnZSB3cml0ZSBwcm90ZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX1NZU0NGR19XUF9QQUdFMCAgICAgICAgICAgICAgICAgICAgKFNZU0NGR19SQ1JfUEFHRTApICAvKiE8IElDT0RFIFNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDAgKi8KKyNkZWZpbmUgSEFMX1NZU0NGR19XUF9QQUdFMSAgICAgICAgICAgICAgICAgICAgKFNZU0NGR19SQ1JfUEFHRTEpICAvKiE8IElDT0RFIFNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDEgKi8KKyNkZWZpbmUgSEFMX1NZU0NGR19XUF9QQUdFMiAgICAgICAgICAgICAgICAgICAgKFNZU0NGR19SQ1JfUEFHRTIpICAvKiE8IElDT0RFIFNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDIgKi8KKyNkZWZpbmUgSEFMX1NZU0NGR19XUF9QQUdFMyAgICAgICAgICAgICAgICAgICAgKFNZU0NGR19SQ1JfUEFHRTMpICAvKiE8IElDT0RFIFNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDMgKi8KKyNpZiBkZWZpbmVkKFNZU0NGR19SQ1JfUEFHRTQpCisvKiBNb3JlIHRoYW4gNEtCIENDTS1TUkFNIGRlZmluZWQgKi8KKyNkZWZpbmUgSEFMX1NZU0NGR19XUF9QQUdFNCAgICAgICAgICAgICAgICAgICAgKFNZU0NGR19SQ1JfUEFHRTQpICAvKiE8IElDT0RFIFNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDQgKi8KKyNkZWZpbmUgSEFMX1NZU0NGR19XUF9QQUdFNSAgICAgICAgICAgICAgICAgICAgKFNZU0NGR19SQ1JfUEFHRTUpICAvKiE8IElDT0RFIFNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDUgKi8KKyNkZWZpbmUgSEFMX1NZU0NGR19XUF9QQUdFNiAgICAgICAgICAgICAgICAgICAgKFNZU0NGR19SQ1JfUEFHRTYpICAvKiE8IElDT0RFIFNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDYgKi8KKyNkZWZpbmUgSEFMX1NZU0NGR19XUF9QQUdFNyAgICAgICAgICAgICAgICAgICAgKFNZU0NGR19SQ1JfUEFHRTcpICAvKiE8IElDT0RFIFNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDcgKi8KKyNlbmRpZiAvKiBTWVNDRkdfUkNSX1BBR0U0ICovCisjaWYgZGVmaW5lZChTWVNDRkdfUkNSX1BBR0U4KQorI2RlZmluZSBIQUxfU1lTQ0ZHX1dQX1BBR0U4ICAgICAgICAgICAgICAgICAgICAoU1lTQ0ZHX1JDUl9QQUdFOCkgIC8qITwgSUNPREUgU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgOCAqLworI2RlZmluZSBIQUxfU1lTQ0ZHX1dQX1BBR0U5ICAgICAgICAgICAgICAgICAgICAoU1lTQ0ZHX1JDUl9QQUdFOSkgIC8qITwgSUNPREUgU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgOSAqLworI2RlZmluZSBIQUxfU1lTQ0ZHX1dQX1BBR0UxMCAgICAgICAgICAgICAgICAgICAoU1lTQ0ZHX1JDUl9QQUdFMTApIC8qITwgSUNPREUgU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMTAgKi8KKyNkZWZpbmUgSEFMX1NZU0NGR19XUF9QQUdFMTEgICAgICAgICAgICAgICAgICAgKFNZU0NGR19SQ1JfUEFHRTExKSAvKiE8IElDT0RFIFNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDExICovCisjZGVmaW5lIEhBTF9TWVNDRkdfV1BfUEFHRTEyICAgICAgICAgICAgICAgICAgIChTWVNDRkdfUkNSX1BBR0UxMikgLyohPCBJQ09ERSBTUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxMiAqLworI2RlZmluZSBIQUxfU1lTQ0ZHX1dQX1BBR0UxMyAgICAgICAgICAgICAgICAgICAoU1lTQ0ZHX1JDUl9QQUdFMTMpIC8qITwgSUNPREUgU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMTMgKi8KKyNkZWZpbmUgSEFMX1NZU0NGR19XUF9QQUdFMTQgICAgICAgICAgICAgICAgICAgKFNZU0NGR19SQ1JfUEFHRTE0KSAvKiE8IElDT0RFIFNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDE0ICovCisjZGVmaW5lIEhBTF9TWVNDRkdfV1BfUEFHRTE1ICAgICAgICAgICAgICAgICAgIChTWVNDRkdfUkNSX1BBR0UxNSkgLyohPCBJQ09ERSBTUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxNSAqLworI2VuZGlmIC8qIFNZU0NGR19SQ1JfUEFHRTggKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX1JDUl9QQUdFOCkKKyNkZWZpbmUgSVNfSEFMX1NZU0NGR19XUF9QQUdFKF9fUEFHRV9fKSAgICAgICAgKCgoX19QQUdFX18pID4gMFUpICYmICgoX19QQUdFX18pIDw9IDB4RkZGRlUpKQorI2VsaWYgZGVmaW5lZChTWVNDRkdfUkNSX1BBR0U0KQorI2RlZmluZSBJU19IQUxfU1lTQ0ZHX1dQX1BBR0UoX19QQUdFX18pICAgICAgICAoKChfX1BBR0VfXykgPiAwVSkgJiYgKChfX1BBR0VfXykgPD0gMHgwMEZGVSkpCisjZWxzZQorI2RlZmluZSBJU19IQUxfU1lTQ0ZHX1dQX1BBR0UoX19QQUdFX18pICAgICAgICAoKChfX1BBR0VfXykgPiAwVSkgJiYgKChfX1BBR0VfXykgPD0gMHgwMDBGVSkpCisjZW5kaWYgLyogU1lTQ0ZHX1JDUl9QQUdFOCAqLyAgICAgIAorLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBTWVNDRkdfUkNSX1BBR0UwICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1NZU0NGR19JbnRlcnJ1cHRzIEhBTCBTWVNDRkcgSW50ZXJydXB0cworICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9TWVNDRkdfSVRfRlBVX0lPQyAgICAgICAgICAgICAgICAgIChTWVNDRkdfQ0ZHUjFfRlBVX0lFXzApICAvKiE8IEZsb2F0aW5nIFBvaW50IFVuaXQgSW52YWxpZCBvcGVyYXRpb24gSW50ZXJydXB0ICovCisjZGVmaW5lIEhBTF9TWVNDRkdfSVRfRlBVX0RaQyAgICAgICAgICAgICAgICAgIChTWVNDRkdfQ0ZHUjFfRlBVX0lFXzEpICAvKiE8IEZsb2F0aW5nIFBvaW50IFVuaXQgRGl2aWRlLWJ5LXplcm8gSW50ZXJydXB0ICovCisjZGVmaW5lIEhBTF9TWVNDRkdfSVRfRlBVX1VGQyAgICAgICAgICAgICAgICAgIChTWVNDRkdfQ0ZHUjFfRlBVX0lFXzIpICAvKiE8IEZsb2F0aW5nIFBvaW50IFVuaXQgVW5kZXJmbG93IEludGVycnVwdCAqLworI2RlZmluZSBIQUxfU1lTQ0ZHX0lUX0ZQVV9PRkMgICAgICAgICAgICAgICAgICAoU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8zKSAgLyohPCBGbG9hdGluZyBQb2ludCBVbml0IE92ZXJmbG93IEludGVycnVwdCAqLworI2RlZmluZSBIQUxfU1lTQ0ZHX0lUX0ZQVV9JREMgICAgICAgICAgICAgICAgICAoU1lTQ0ZHX0NGR1IxX0ZQVV9JRV80KSAgLyohPCBGbG9hdGluZyBQb2ludCBVbml0IElucHV0IGRlbm9ybWFsIEludGVycnVwdCAqLworI2RlZmluZSBIQUxfU1lTQ0ZHX0lUX0ZQVV9JWEMgICAgICAgICAgICAgICAgICAoU1lTQ0ZHX0NGR1IxX0ZQVV9JRV81KSAgLyohPCBGbG9hdGluZyBQb2ludCBVbml0IEluZXhhY3QgSW50ZXJydXB0ICovCisKKyNkZWZpbmUgSVNfSEFMX1NZU0NGR19JTlRFUlJVUFQoX19JTlRFUlJVUFRfXykgKCgoKF9fSU5URVJSVVBUX18pICYgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8wKSA9PSBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fSU5URVJSVVBUX18pICYgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8xKSA9PSBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fSU5URVJSVVBUX18pICYgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8yKSA9PSBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fSU5URVJSVVBUX18pICYgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8zKSA9PSBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fSU5URVJSVVBUX18pICYgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV80KSA9PSBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fSU5URVJSVVBUX18pICYgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV81KSA9PSBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzUpKQorCisvKioKKyAgKiBAfQorICAqLworICAKKy8qKgorICogQH0KKyAqLyAKKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSEFMX0V4cG9ydGVkX01hY3JvcyBIQUwgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBEZWJ1Z19NQ1VfQVBCMV9GcmVlemUgRnJlZXplL1VuZnJlZXplIEFQQjEgUGVyaXBoZXJhbHMgaW4gRGVidWcgbW9kZQorICAqIEB7CisgICovCisjaWYgZGVmaW5lZChEQkdNQ1VfQVBCMV9GWl9EQkdfVElNMl9TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTIoKSAgICAgICAgICAgKERCR01DVS0+QVBCMUZaIHw9IChEQkdNQ1VfQVBCMV9GWl9EQkdfVElNMl9TVE9QKSkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTIoKSAgICAgICAgIChEQkdNQ1UtPkFQQjFGWiAmPSB+KERCR01DVV9BUEIxX0ZaX0RCR19USU0yX1NUT1ApKQorI2VuZGlmIC8qIERCR01DVV9BUEIxX0ZaX0RCR19USU0yX1NUT1AgKi8KKworI2lmIGRlZmluZWQoREJHTUNVX0FQQjFfRlpfREJHX1RJTTNfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0zKCkgICAgICAgICAgIChEQkdNQ1UtPkFQQjFGWiB8PSAoREJHTUNVX0FQQjFfRlpfREJHX1RJTTNfU1RPUCkpCisjZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0zKCkgICAgICAgICAoREJHTUNVLT5BUEIxRlogJj0gfihEQkdNQ1VfQVBCMV9GWl9EQkdfVElNM19TVE9QKSkKKyNlbmRpZiAvKiBEQkdNQ1VfQVBCMV9GWl9EQkdfVElNM19TVE9QICovCisKKyNpZiBkZWZpbmVkKERCR01DVV9BUEIxX0ZaX0RCR19USU00X1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNNCgpICAgICAgICAgICAoREJHTUNVLT5BUEIxRlogfD0gKERCR01DVV9BUEIxX0ZaX0RCR19USU00X1NUT1ApKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNNCgpICAgICAgICAgKERCR01DVS0+QVBCMUZaICY9IH4oREJHTUNVX0FQQjFfRlpfREJHX1RJTTRfU1RPUCkpCisjZW5kaWYgLyogREJHTUNVX0FQQjFfRlpfREJHX1RJTTRfU1RPUCAqLworCisjaWYgZGVmaW5lZChEQkdNQ1VfQVBCMV9GWl9EQkdfVElNNV9TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTUoKSAgICAgICAgICAgKERCR01DVS0+QVBCMUZaIHw9IChEQkdNQ1VfQVBCMV9GWl9EQkdfVElNNV9TVE9QKSkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTUoKSAgICAgICAgIChEQkdNQ1UtPkFQQjFGWiAmPSB+KERCR01DVV9BUEIxX0ZaX0RCR19USU01X1NUT1ApKQorI2VuZGlmIC8qIERCR01DVV9BUEIxX0ZaX0RCR19USU01X1NUT1AgKi8KKworI2lmIGRlZmluZWQoREJHTUNVX0FQQjFfRlpfREJHX1RJTTZfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX0ZSRUVaRV9USU02KCkgICAgICAgICAgIChEQkdNQ1UtPkFQQjFGWiB8PSAoREJHTUNVX0FQQjFfRlpfREJHX1RJTTZfU1RPUCkpCisjZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU02KCkgICAgICAgICAoREJHTUNVLT5BUEIxRlogJj0gfihEQkdNQ1VfQVBCMV9GWl9EQkdfVElNNl9TVE9QKSkKKyNlbmRpZiAvKiBEQkdNQ1VfQVBCMV9GWl9EQkdfVElNNl9TVE9QICovCisKKyNpZiBkZWZpbmVkKERCR01DVV9BUEIxX0ZaX0RCR19USU03X1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNNygpICAgICAgICAgICAoREJHTUNVLT5BUEIxRlogfD0gKERCR01DVV9BUEIxX0ZaX0RCR19USU03X1NUT1ApKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNNygpICAgICAgICAgKERCR01DVS0+QVBCMUZaICY9IH4oREJHTUNVX0FQQjFfRlpfREJHX1RJTTdfU1RPUCkpCisjZW5kaWYgLyogREJHTUNVX0FQQjFfRlpfREJHX1RJTTdfU1RPUCAqLworCisjaWYgZGVmaW5lZChEQkdNQ1VfQVBCMV9GWl9EQkdfVElNMTJfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0xMigpICAgICAgICAgIChEQkdNQ1UtPkFQQjFGWiB8PSAoREJHTUNVX0FQQjFfRlpfREJHX1RJTTEyX1NUT1ApKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNMTIoKSAgICAgICAgKERCR01DVS0+QVBCMUZaICY9IH4oREJHTUNVX0FQQjFfRlpfREJHX1RJTTEyX1NUT1ApKQorI2VuZGlmIC8qIERCR01DVV9BUEIxX0ZaX0RCR19USU0xMl9TVE9QICovCisKKyNpZiBkZWZpbmVkKERCR01DVV9BUEIxX0ZaX0RCR19USU0xM19TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTEzKCkgICAgICAgICAgKERCR01DVS0+QVBCMUZaIHw9IChEQkdNQ1VfQVBCMV9GWl9EQkdfVElNMTNfU1RPUCkpCisjZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0xMygpICAgICAgICAoREJHTUNVLT5BUEIxRlogJj0gfihEQkdNQ1VfQVBCMV9GWl9EQkdfVElNMTNfU1RPUCkpCisjZW5kaWYgLyogREJHTUNVX0FQQjFfRlpfREJHX1RJTTEzX1NUT1AgKi8KKworI2lmIGRlZmluZWQoREJHTUNVX0FQQjFfRlpfREJHX1RJTTE0X1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMTQoKSAgICAgICAgICAoREJHTUNVLT5BUEIxRlogfD0gKERCR01DVV9BUEIxX0ZaX0RCR19USU0xNF9TVE9QKSkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTE0KCkgICAgICAgIChEQkdNQ1UtPkFQQjFGWiAmPSB+KERCR01DVV9BUEIxX0ZaX0RCR19USU0xNF9TVE9QKSkKKyNlbmRpZiAvKiBEQkdNQ1VfQVBCMV9GWl9EQkdfVElNMTRfU1RPUCAqLworCisjaWYgZGVmaW5lZChEQkdNQ1VfQVBCMV9GWl9EQkdfVElNMThfU1RPUCkKKyNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTE4X0RCR01DVSgpICAgICAgICAgIChEQkdNQ1UtPkFQQjFGWiB8PSAoREJHTUNVX0FQQjFfRlpfREJHX1RJTTE4X1NUT1ApKQorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU0xOF9EQkdNQ1UoKSAgICAgICAgKERCR01DVS0+QVBCMUZaICY9IH4oREJHTUNVX0FQQjFfRlpfREJHX1RJTTE4X1NUT1ApKQorI2VuZGlmIC8qIERCR01DVV9BUEIxX0ZaX0RCR19USU0xNF9TVE9QICovCisKKyNpZiBkZWZpbmVkKERCR01DVV9BUEIxX0ZaX0RCR19SVENfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX0ZSRUVaRV9SVEMoKSAgICAgICAgICAgIChEQkdNQ1UtPkFQQjFGWiB8PSAoREJHTUNVX0FQQjFfRlpfREJHX1JUQ19TVE9QKSkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1JUQygpICAgICAgICAgIChEQkdNQ1UtPkFQQjFGWiAmPSB+KERCR01DVV9BUEIxX0ZaX0RCR19SVENfU1RPUCkpCisjZW5kaWYgLyogREJHTUNVX0FQQjFfRlpfREJHX1JUQ19TVE9QICovCisKKyNpZiBkZWZpbmVkKERCR01DVV9BUEIxX0ZaX0RCR19XV0RHX1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfV1dERygpICAgICAgICAgICAoREJHTUNVLT5BUEIxRlogfD0gKERCR01DVV9BUEIxX0ZaX0RCR19XV0RHX1NUT1ApKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfV1dERygpICAgICAgICAgKERCR01DVS0+QVBCMUZaICY9IH4oREJHTUNVX0FQQjFfRlpfREJHX1dXREdfU1RPUCkpCisjZW5kaWYgLyogREJHTUNVX0FQQjFfRlpfREJHX1dXREdfU1RPUCAqLworCisjaWYgZGVmaW5lZChEQkdNQ1VfQVBCMV9GWl9EQkdfSVdER19TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0lXREcoKSAgICAgICAgICAgKERCR01DVS0+QVBCMUZaIHw9IChEQkdNQ1VfQVBCMV9GWl9EQkdfSVdER19TVE9QKSkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX0lXREcoKSAgICAgICAgIChEQkdNQ1UtPkFQQjFGWiAmPSB+KERCR01DVV9BUEIxX0ZaX0RCR19JV0RHX1NUT1ApKQorI2VuZGlmIC8qIERCR01DVV9BUEIxX0ZaX0RCR19JV0RHX1NUT1AgKi8KKworI2lmIGRlZmluZWQoREJHTUNVX0FQQjFfRlpfREJHX0kyQzFfU01CVVNfVElNRU9VVCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX0ZSRUVaRV9JMkMxX1RJTUVPVVQoKSAgIChEQkdNQ1UtPkFQQjFGWiB8PSAoREJHTUNVX0FQQjFfRlpfREJHX0kyQzFfU01CVVNfVElNRU9VVCkpCisjZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9JMkMxX1RJTUVPVVQoKSAoREJHTUNVLT5BUEIxRlogJj0gfihEQkdNQ1VfQVBCMV9GWl9EQkdfSTJDMV9TTUJVU19USU1FT1VUKSkKKyNlbmRpZiAvKiBEQkdNQ1VfQVBCMV9GWl9EQkdfSTJDMV9TTUJVU19USU1FT1VUICovCisKKyNpZiBkZWZpbmVkKERCR01DVV9BUEIxX0ZaX0RCR19JMkMyX1NNQlVTX1RJTUVPVVQpCisjZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfSTJDMl9USU1FT1VUKCkgICAoREJHTUNVLT5BUEIxRlogfD0gKERCR01DVV9BUEIxX0ZaX0RCR19JMkMyX1NNQlVTX1RJTUVPVVQpKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfSTJDMl9USU1FT1VUKCkgKERCR01DVS0+QVBCMUZaICY9IH4oREJHTUNVX0FQQjFfRlpfREJHX0kyQzJfU01CVVNfVElNRU9VVCkpCisjZW5kaWYgLyogREJHTUNVX0FQQjFfRlpfREJHX0kyQzJfU01CVVNfVElNRU9VVCAqLworCisjaWYgZGVmaW5lZChEQkdNQ1VfQVBCMV9GWl9EQkdfSTJDM19TTUJVU19USU1FT1VUKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0kyQzNfVElNRU9VVCgpICAgKERCR01DVS0+QVBCMUZaIHw9IChEQkdNQ1VfQVBCMV9GWl9EQkdfSTJDM19TTUJVU19USU1FT1VUKSkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX0kyQzNfVElNRU9VVCgpIChEQkdNQ1UtPkFQQjFGWiAmPSB+KERCR01DVV9BUEIxX0ZaX0RCR19JMkMzX1NNQlVTX1RJTUVPVVQpKQorI2VuZGlmIC8qIERCR01DVV9BUEIxX0ZaX0RCR19JMkMzX1NNQlVTX1RJTUVPVVQgKi8KKworI2lmIGRlZmluZWQoREJHTUNVX0FQQjFfRlpfREJHX0NBTl9TVE9QKQorI2RlZmluZSBfX0hBTF9GUkVFWkVfQ0FOX0RCR01DVSgpICAgICAgICAgICAgKERCR01DVS0+QVBCMUZaIHw9IChEQkdNQ1VfQVBCMV9GWl9EQkdfQ0FOX1NUT1ApKQorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9DQU5fREJHTUNVKCkgICAgICAgICAgKERCR01DVS0+QVBCMUZaICY9IH4oREJHTUNVX0FQQjFfRlpfREJHX0NBTl9TVE9QKSkKKyNlbmRpZiAvKiBEQkdNQ1VfQVBCMV9GWl9EQkdfQ0FOX1NUT1AgKi8KKy8qKgorICogQH0KKyAqLworIAorLyoqIEBkZWZncm91cCBEZWJ1Z19NQ1VfQVBCMl9GcmVlemUgRnJlZXplL1VuZnJlZXplIEFQQjIgUGVyaXBoZXJhbHMgaW4gRGVidWcgbW9kZQorICAqIEB7CisgICovCisjaWYgZGVmaW5lZChEQkdNQ1VfQVBCMl9GWl9EQkdfVElNMV9TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTEoKSAgICAgICAgICAgKERCR01DVS0+QVBCMkZaIHw9IChEQkdNQ1VfQVBCMl9GWl9EQkdfVElNMV9TVE9QKSkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTEoKSAgICAgICAgICAgKERCR01DVS0+QVBCMkZaICY9IH4oREJHTUNVX0FQQjJfRlpfREJHX1RJTTFfU1RPUCkpCisjZW5kaWYgLyogREJHTUNVX0FQQjJfRlpfREJHX1RJTTFfU1RPUCAqLworCisjaWYgZGVmaW5lZChEQkdNQ1VfQVBCMl9GWl9EQkdfVElNOF9TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTgoKSAgICAgICAgICAgKERCR01DVS0+QVBCMkZaIHw9IChEQkdNQ1VfQVBCMl9GWl9EQkdfVElNOF9TVE9QKSkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTgoKSAgICAgICAgIChEQkdNQ1UtPkFQQjJGWiAmPSB+KERCR01DVV9BUEIyX0ZaX0RCR19USU04X1NUT1ApKQorI2VuZGlmIC8qIERCR01DVV9BUEIyX0ZaX0RCR19USU04X1NUT1AgKi8KKworI2lmIGRlZmluZWQoREJHTUNVX0FQQjJfRlpfREJHX1RJTTE1X1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMTUoKSAgICAgICAgICAoREJHTUNVLT5BUEIyRlogfD0gKERCR01DVV9BUEIyX0ZaX0RCR19USU0xNV9TVE9QKSkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTE1KCkgICAgICAgIChEQkdNQ1UtPkFQQjJGWiAmPSB+KERCR01DVV9BUEIyX0ZaX0RCR19USU0xNV9TVE9QKSkKKyNlbmRpZiAvKiBEQkdNQ1VfQVBCMl9GWl9EQkdfVElNMTVfU1RPUCAqLworCisjaWYgZGVmaW5lZChEQkdNQ1VfQVBCMl9GWl9EQkdfVElNMTZfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0xNigpICAgICAgICAgIChEQkdNQ1UtPkFQQjJGWiB8PSAoREJHTUNVX0FQQjJfRlpfREJHX1RJTTE2X1NUT1ApKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNMTYoKSAgICAgICAgKERCR01DVS0+QVBCMkZaICY9IH4oREJHTUNVX0FQQjJfRlpfREJHX1RJTTE2X1NUT1ApKQorI2VuZGlmIC8qIERCR01DVV9BUEIyX0ZaX0RCR19USU0xNl9TVE9QICovCisKKyNpZiBkZWZpbmVkKERCR01DVV9BUEIyX0ZaX0RCR19USU0xN19TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTE3KCkgICAgICAgICAgKERCR01DVS0+QVBCMkZaIHw9IChEQkdNQ1VfQVBCMl9GWl9EQkdfVElNMTdfU1RPUCkpCisjZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0xNygpICAgICAgICAoREJHTUNVLT5BUEIyRlogJj0gfihEQkdNQ1VfQVBCMl9GWl9EQkdfVElNMTdfU1RPUCkpCisjZW5kaWYgLyogREJHTUNVX0FQQjJfRlpfREJHX1RJTTE3X1NUT1AgKi8KKworI2lmIGRlZmluZWQoREJHTUNVX0FQQjJfRlpfREJHX1RJTTE5X1NUT1ApCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU0xOV9EQkdNQ1UoKSAgICAgICAgICAoREJHTUNVLT5BUEIyRlogfD0gKERCR01DVV9BUEIyX0ZaX0RCR19USU0xOV9TVE9QKSkKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNMTlfREJHTUNVKCkgICAgICAgIChEQkdNQ1UtPkFQQjJGWiAmPSB+KERCR01DVV9BUEIyX0ZaX0RCR19USU0xOV9TVE9QKSkKKyNlbmRpZiAvKiBEQkdNQ1VfQVBCMl9GWl9EQkdfVElNMTlfU1RPUCAqLworCisjaWYgZGVmaW5lZChEQkdNQ1VfQVBCMl9GWl9EQkdfVElNMjBfU1RPUCkKKyNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTIwX0RCR01DVSgpICAgICAgICAgIChEQkdNQ1UtPkFQQjJGWiB8PSAoREJHTUNVX0FQQjJfRlpfREJHX1RJTTIwX1NUT1ApKQorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU0yMF9EQkdNQ1UoKSAgICAgICAgKERCR01DVS0+QVBCMkZaICY9IH4oREJHTUNVX0FQQjJfRlpfREJHX1RJTTIwX1NUT1ApKQorI2VuZGlmIC8qIERCR01DVV9BUEIyX0ZaX0RCR19USU0yMF9TVE9QICovCisKKyNpZiBkZWZpbmVkKERCR01DVV9BUEIyX0ZaX0RCR19IUlRJTTFfU1RPUCkKKyNkZWZpbmUgX19IQUxfRlJFRVpFX0hSVElNMV9EQkdNQ1UoKSAgICAgICAgICAoREJHTUNVLT5BUEIyRlogfD0gKERCR01DVV9BUEIyX0ZaX0RCR19IUlRJTTFfU1RPUCkpCisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX0hSVElNMV9EQkdNQ1UoKSAgICAgICAgKERCR01DVS0+QVBCMkZaICY9IH4oREJHTUNVX0FQQjJfRlpfREJHX0hSVElNMV9TVE9QKSkKKyNlbmRpZiAvKiBEQkdNQ1VfQVBCMl9GWl9EQkdfSFJUSU0xX1NUT1AgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIE1lbW9yeV9NYXBwaW5nX1NlbGVjdGlvbiBNZW1vcnkgTWFwcGluZyBTZWxlY3Rpb24KKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IxX01FTV9NT0RFKQorLyoqIEBicmllZiAgTWFpbiBGbGFzaCBtZW1vcnkgbWFwcGVkIGF0IDB4MDAwMDAwMDAKKyAgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX0ZMQVNIKCkgICAgICAgIChTWVNDRkctPkNGR1IxICY9IH4oU1lTQ0ZHX0NGR1IxX01FTV9NT0RFKSkKKyNlbmRpZiAvKiBTWVNDRkdfQ0ZHUjFfTUVNX01PREUgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IxX01FTV9NT0RFXzApCisvKiogQGJyaWVmICBTeXN0ZW0gRmxhc2ggbWVtb3J5IG1hcHBlZCBhdCAweDAwMDAwMDAwCisgICovCisjZGVmaW5lIF9fSEFMX1NZU0NGR19SRU1BUE1FTU9SWV9TWVNURU1GTEFTSCgpICBkbyB7U1lTQ0ZHLT5DRkdSMSAmPSB+KFNZU0NGR19DRkdSMV9NRU1fTU9ERSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZU0NGRy0+Q0ZHUjEgfD0gU1lTQ0ZHX0NGR1IxX01FTV9NT0RFXzA7ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH13aGlsZSgwVSkKKyNlbmRpZiAvKiBTWVNDRkdfQ0ZHUjFfTUVNX01PREVfMCAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfQ0ZHUjFfTUVNX01PREVfMCkgJiYgZGVmaW5lZChTWVNDRkdfQ0ZHUjFfTUVNX01PREVfMSkKKy8qKiBAYnJpZWYgIEVtYmVkZGVkIFNSQU0gbWFwcGVkIGF0IDB4MDAwMDAwMDAKKyAgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX1NSQU0oKSAgICAgICAgIGRvIHtTWVNDRkctPkNGR1IxICY9IH4oU1lTQ0ZHX0NGR1IxX01FTV9NT0RFKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTQ0ZHLT5DRkdSMSB8PSAoU1lTQ0ZHX0NGR1IxX01FTV9NT0RFXzAgfCBTWVNDRkdfQ0ZHUjFfTUVNX01PREVfMSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXdoaWxlKDBVKQorI2VuZGlmIC8qIFNZU0NGR19DRkdSMV9NRU1fTU9ERV8wICYmIFNZU0NGR19DRkdSMV9NRU1fTU9ERV8xICovCisKKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSMV9NRU1fTU9ERV8yKQorI2RlZmluZSBfX0hBTF9TWVNDRkdfRk1DX0JBTksoKSAgICAgICAgIGRvIHtTWVNDRkctPkNGR1IxICY9IH4oU1lTQ0ZHX0NGR1IxX01FTV9NT0RFKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZU0NGRy0+Q0ZHUjEgfD0gKFNZU0NGR19DRkdSMV9NRU1fTU9ERV8yKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXdoaWxlKDBVKQorI2VuZGlmIC8qIFNZU0NGR19DRkdSMV9NRU1fTU9ERV8yICovCisvKioKKyAqIEB9CisgKi8KKyAKKy8qKiBAZGVmZ3JvdXAgRW5jb2Rlcl9Nb2RlIEVuY29kZXIgTW9kZQorICAqIEB7CisgICovCisjaWYgZGVmaW5lZChTWVNDRkdfQ0ZHUjFfRU5DT0RFUl9NT0RFKQorLyoqIEBicmllZiAgTm8gRW5jb2RlciBtb2RlCisgICovCisjZGVmaW5lIF9fSEFMX1JFTUFQRU5DT0RFUl9OT05FKCkgICAgICAgIChTWVNDRkctPkNGR1IxICY9IH4oU1lTQ0ZHX0NGR1IxX0VOQ09ERVJfTU9ERSkpCisjZW5kaWYgLyogU1lTQ0ZHX0NGR1IxX0VOQ09ERVJfTU9ERSAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfQ0ZHUjFfRU5DT0RFUl9NT0RFXzApCisvKiogQGJyaWVmICBFbmNvZGVyIG1vZGUgOiBUSU0yIElDMSBhbmQgVElNMiBJQzIgYXJlIGNvbm5lY3RlZCB0byBUSU0xNSBJQzEgYW5kIFRJTTE1IElDMiByZXNwZWN0aXZlbHkKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkVNQVBFTkNPREVSX1RJTTIoKSAgICAgICAgZG8ge1NZU0NGRy0+Q0ZHUjEgJj0gfihTWVNDRkdfQ0ZHUjFfRU5DT0RFUl9NT0RFKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTQ0ZHLT5DRkdSMSB8PSBTWVNDRkdfQ0ZHUjFfRU5DT0RFUl9NT0RFXzA7ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH13aGlsZSgwVSkKKyNlbmRpZiAvKiBTWVNDRkdfQ0ZHUjFfRU5DT0RFUl9NT0RFXzAgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IxX0VOQ09ERVJfTU9ERV8xKQorLyoqIEBicmllZiAgRW5jb2RlciBtb2RlIDogVElNMyBJQzEgYW5kIFRJTTMgSUMyIGFyZSBjb25uZWN0ZWQgdG8gVElNMTUgSUMxIGFuZCBUSU0xNSBJQzIgcmVzcGVjdGl2ZWx5CisgICovCisjZGVmaW5lIF9fSEFMX1JFTUFQRU5DT0RFUl9USU0zKCkgICAgICAgIGRvIHtTWVNDRkctPkNGR1IxICY9IH4oU1lTQ0ZHX0NGR1IxX0VOQ09ERVJfTU9ERSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZU0NGRy0+Q0ZHUjEgfD0gU1lTQ0ZHX0NGR1IxX0VOQ09ERVJfTU9ERV8xOyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMFUpCisjZW5kaWYgLyogU1lTQ0ZHX0NGR1IxX0VOQ09ERVJfTU9ERV8xICovCisKKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSMV9FTkNPREVSX01PREVfMCkgJiYgZGVmaW5lZChTWVNDRkdfQ0ZHUjFfRU5DT0RFUl9NT0RFXzEpCisvKiogQGJyaWVmICBFbmNvZGVyIG1vZGUgOiBUSU00IElDMSBhbmQgVElNNCBJQzIgYXJlIGNvbm5lY3RlZCB0byBUSU0xNSBJQzEgYW5kIFRJTTE1IElDMiAoU1RNMzJGMzAzeEIvQyBhbmQgU1RNMzJGMzU4eHggZGV2aWNlcykKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkVNQVBFTkNPREVSX1RJTTQoKSAgICAgICAgZG8ge1NZU0NGRy0+Q0ZHUjEgJj0gfihTWVNDRkdfQ0ZHUjFfRU5DT0RFUl9NT0RFKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTQ0ZHLT5DRkdSMSB8PSAoU1lTQ0ZHX0NGR1IxX0VOQ09ERVJfTU9ERV8wIHwgU1lTQ0ZHX0NGR1IxX0VOQ09ERVJfTU9ERV8xKTsgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXdoaWxlKDBVKQorI2VuZGlmIC8qIFNZU0NGR19DRkdSMV9FTkNPREVSX01PREVfMCAmJiBTWVNDRkdfQ0ZHUjFfRU5DT0RFUl9NT0RFXzEgKi8KKy8qKgorICogQH0KKyAqLworIAorLyoqIEBkZWZncm91cCBETUFfUmVtYXBfRW5hYmxlIERNQSBSZW1hcCBFbmFibGUKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IzX0RNQV9STVApICYmIGRlZmluZWQoU1lTQ0ZHX0NGR1IxX0RNQV9STVApCisvKiogQGJyaWVmICBETUEgcmVtYXBwaW5nIGVuYWJsZS9kaXNhYmxlIG1hY3JvcworICAqIEBwYXJhbSBfX0RNQV9SRU1BUF9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSEFMX0RNQV9SZW1hcHBpbmcKKyAgKi8KKyNkZWZpbmUgX19IQUxfRE1BX1JFTUFQX0NIQU5ORUxfRU5BQkxFKF9fRE1BX1JFTUFQX18pICAgZG8ge2Fzc2VydF9wYXJhbShJU19ETUFfUkVNQVAoKF9fRE1BX1JFTUFQX18pKSk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0RNQV9SRU1BUF9fKSAmIEhBTF9SRU1BUF9DRkdSM19NQVNLKSA/ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU1lTQ0ZHLT5DRkdSMyB8PSAoKF9fRE1BX1JFTUFQX18pICYgfkhBTF9SRU1BUF9DRkdSM19NQVNLKSkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNZU0NGRy0+Q0ZHUjEgfD0gKF9fRE1BX1JFTUFQX18pKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXdoaWxlKDBVKQorI2RlZmluZSBfX0hBTF9ETUFfUkVNQVBfQ0hBTk5FTF9ESVNBQkxFKF9fRE1BX1JFTUFQX18pICBkbyB7YXNzZXJ0X3BhcmFtKElTX0RNQV9SRU1BUCgoX19ETUFfUkVNQVBfXykpKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fRE1BX1JFTUFQX18pICYgSEFMX1JFTUFQX0NGR1IzX01BU0spID8gICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTWVNDRkctPkNGR1IzICY9ICh+KF9fRE1BX1JFTUFQX18pIHwgSEFMX1JFTUFQX0NGR1IzX01BU0spKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU1lTQ0ZHLT5DRkdSMSAmPSB+KF9fRE1BX1JFTUFQX18pKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMFUpCisjZWxpZiBkZWZpbmVkKFNZU0NGR19DRkdSMV9ETUFfUk1QKQorLyoqIEBicmllZiAgRE1BIHJlbWFwcGluZyBlbmFibGUvZGlzYWJsZSBtYWNyb3MKKyAgKiBAcGFyYW0gX19ETUFfUkVNQVBfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhBTF9ETUFfUmVtYXBwaW5nCisgICovCisjZGVmaW5lIF9fSEFMX0RNQV9SRU1BUF9DSEFOTkVMX0VOQUJMRShfX0RNQV9SRU1BUF9fKSAgIGRvIHthc3NlcnRfcGFyYW0oSVNfRE1BX1JFTUFQKChfX0RNQV9SRU1BUF9fKSkpOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTQ0ZHLT5DRkdSMSB8PSAoX19ETUFfUkVNQVBfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX0RNQV9SRU1BUF9DSEFOTkVMX0RJU0FCTEUoX19ETUFfUkVNQVBfXykgIGRvIHthc3NlcnRfcGFyYW0oSVNfRE1BX1JFTUFQKChfX0RNQV9SRU1BUF9fKSkpOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTQ0ZHLT5DRkdSMSAmPSB+KF9fRE1BX1JFTUFQX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMFUpCisjZW5kaWYgLyogU1lTQ0ZHX0NGR1IzX0RNQV9STVAgfHwgU1lTQ0ZHX0NGR1IxX0RNQV9STVAgKi8KKy8qKgorICogQH0KKyAqLworIAorLyoqIEBkZWZncm91cCBGYXN0TW9kZVBsdXNfR1BJTyBGYXN0LW1vZGUgUGx1cyBvbiBHUElPCisgICogQHsKKyAgKi8KKy8qKiBAYnJpZWYgIEZhc3QtbW9kZSBQbHVzIGRyaXZpbmcgY2FwYWJpbGl0eSBlbmFibGUvZGlzYWJsZSBtYWNyb3MKKyAgKiBAcGFyYW0gX19GQVNUTU9ERVBMVVNfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNZU0NGR19GYXN0TW9kZVBsdXNfR1BJTyB2YWx1ZXMuCisgICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoYXQgeW91IGNhbiBmaW5kIGFib3ZlIHRoZXNlIG1hY3Jvcy4KKyAgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX0ZBU1RNT0RFUExVU19FTkFCTEUoX19GQVNUTU9ERVBMVVNfXykgIGRvIHthc3NlcnRfcGFyYW0oSVNfU1lTQ0ZHX0ZBU1RNT0RFUExVUygoX19GQVNUTU9ERVBMVVNfXykpKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChTWVNDRkctPkNGR1IxLCAoX19GQVNUTU9ERVBMVVNfXykpO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH13aGlsZSgwVSkKKworI2RlZmluZSBfX0hBTF9TWVNDRkdfRkFTVE1PREVQTFVTX0RJU0FCTEUoX19GQVNUTU9ERVBMVVNfXykgZG8ge2Fzc2VydF9wYXJhbShJU19TWVNDRkdfRkFTVE1PREVQTFVTKChfX0ZBU1RNT0RFUExVU19fKSkpO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMSwgKF9fRkFTVE1PREVQTFVTX18pKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMFUpCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBGbG9hdGluZ19Qb2ludF9Vbml0X0ludGVycnVwdHNfRW5hYmxlIEZsb2F0aW5nIFBvaW50IFVuaXQgSW50ZXJydXB0cyBFbmFibGUKKyAgKiBAeworICAqLworLyoqIEBicmllZiAgU1lTQ0ZHIGludGVycnVwdCBlbmFibGUvZGlzYWJsZSBtYWNyb3MKKyAgKiBAcGFyYW0gX19JTlRFUlJVUFRfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhBTF9TWVNDRkdfSW50ZXJydXB0cworICAqLworI2RlZmluZSBfX0hBTF9TWVNDRkdfSU5URVJSVVBUX0VOQUJMRShfX0lOVEVSUlVQVF9fKSAgICAgICAgZG8ge2Fzc2VydF9wYXJhbShJU19IQUxfU1lTQ0ZHX0lOVEVSUlVQVCgoX19JTlRFUlJVUFRfXykpKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZU0NGRy0+Q0ZHUjEgfD0gKF9fSU5URVJSVVBUX18pOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXdoaWxlKDBVKQorCisjZGVmaW5lIF9fSEFMX1NZU0NGR19JTlRFUlJVUFRfRElTQUJMRShfX0lOVEVSUlVQVF9fKSAgICAgICBkbyB7YXNzZXJ0X3BhcmFtKElTX0hBTF9TWVNDRkdfSU5URVJSVVBUKChfX0lOVEVSUlVQVF9fKSkpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTQ0ZHLT5DRkdSMSAmPSB+KF9fSU5URVJSVVBUX18pOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMFUpCisvKioKKyAqIEB9CisgKi8KKyAKKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSMV9VU0JfSVRfUk1QKQorLyoqIEBkZWZncm91cCBVU0JfSW50ZXJydXB0X1JlbWFwIFVTQiBJbnRlcnJ1cHQgUmVtYXAKKyAgKiBAeworICAqLyAKKy8qKiBAYnJpZWYgIFVTQiBpbnRlcnJ1cHQgcmVtYXBwaW5nIGVuYWJsZS9kaXNhYmxlIG1hY3JvcworICAqLworI2RlZmluZSBfX0hBTF9SRU1BUElOVEVSUlVQVF9VU0JfRU5BQkxFKCkgICAgICAgICAgICAgIChTWVNDRkctPkNGR1IxIHw9IChTWVNDRkdfQ0ZHUjFfVVNCX0lUX1JNUCkpCisjZGVmaW5lIF9fSEFMX1JFTUFQSU5URVJSVVBUX1VTQl9ESVNBQkxFKCkgICAgICAgICAgICAgKFNZU0NGRy0+Q0ZHUjEgJj0gfihTWVNDRkdfQ0ZHUjFfVVNCX0lUX1JNUCkpCisvKioKKyAqIEB9CisgKi8KKyNlbmRpZiAvKiBTWVNDRkdfQ0ZHUjFfVVNCX0lUX1JNUCAqLworIAorI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IxX1ZCQVQpCisvKiogQGRlZmdyb3VwIFZCQVRfTW9uaXRvcmluZ19FbmFibGUgVkJBVCBNb25pdG9yaW5nIEVuYWJsZQorICAqIEB7CisgICovICAKKy8qKiBAYnJpZWYgIFNZU0NGRyBpbnRlcnJ1cHQgZW5hYmxlL2Rpc2FibGUgbWFjcm9zCisgICovCisjZGVmaW5lIF9fSEFMX1NZU0NGR19WQkFUX01PTklUT1JJTkdfRU5BQkxFKCkgICAgICAgICAgKFNZU0NGRy0+Q0ZHUjEgfD0gKFNZU0NGR19DRkdSMV9WQkFUKSkKKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX1ZCQVRfTU9OSVRPUklOR19ESVNBQkxFKCkgICAgICAgICAoU1lTQ0ZHLT5DRkdSMSAmPSB+KFNZU0NGR19DRkdSMV9WQkFUKSkKKy8qKgorICogQH0KKyAqLworI2VuZGlmIC8qIFNZU0NGR19DRkdSMV9WQkFUICovCisgCisjaWYgZGVmaW5lZChTWVNDRkdfQ0ZHUjJfTE9DS1VQX0xPQ0spCisvKiogQGRlZmdyb3VwIENvcnRleF9Mb2NrdXBfRW5hYmxlIENvcnRleCBMb2NrdXAgRW5hYmxlCisgICogQHsKKyAgKi8KKy8qKiBAYnJpZWYgIFNZU0NGRyBCcmVhayBMb2NrdXAgbG9jaworICAqICAgICAgICAgRW5hYmxlcyBhbmQgbG9ja3MgdGhlIGNvbm5lY3Rpb24gb2YgQ29ydGV4LU00IExPQ0tVUCAoSGFyZGZhdWx0KSBvdXRwdXQgdG8gVElNMS8xNS8xNi8xNyBCcmVhayBpbnB1dAorICAqIEBub3RlICAgVGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gaXMgbG9ja2VkIGFuZCBjYW4gYmUgdW5sb2NrZWQgYnkgc3lzdGVtIHJlc2V0CisgICovCisjZGVmaW5lIF9fSEFMX1NZU0NGR19CUkVBS19MT0NLVVBfTE9DSygpICAgZG8ge1NZU0NGRy0+Q0ZHUjIgJj0gfihTWVNDRkdfQ0ZHUjJfTE9DS1VQX0xPQ0spOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZU0NGRy0+Q0ZHUjIgfD0gU1lTQ0ZHX0NGR1IyX0xPQ0tVUF9MT0NLOyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXdoaWxlKDBVKQorLyoqCisgKiBAfQorICovCisjZW5kaWYgLyogU1lTQ0ZHX0NGR1IyX0xPQ0tVUF9MT0NLICovCisgCisjaWYgZGVmaW5lZChTWVNDRkdfQ0ZHUjJfUFZEX0xPQ0spCisvKiogQGRlZmdyb3VwIFBWRF9Mb2NrX0VuYWJsZSBQVkQgTG9jaworICAqIEB7CisgICovCisvKiogQGJyaWVmICBTWVNDRkcgQnJlYWsgUFZEIGxvY2sKKyAgKiAgICAgICAgIEVuYWJsZXMgYW5kIGxvY2tzIHRoZSBQVkQgY29ubmVjdGlvbiB3aXRoIFRpbWVyMS84LzE1LzE2LzE3IEJyZWFrIElucHV0LCAsIGFzIHdlbGwgYXMgdGhlIFBWREUgYW5kIFBMU1syOjBdIGluIHRoZSBQV1JfQ1IgcmVnaXN0ZXIKKyAgKiBAbm90ZSAgIFRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uIGlzIGxvY2tlZCBhbmQgY2FuIGJlIHVubG9ja2VkIGJ5IHN5c3RlbSByZXNldAorICAqLworI2RlZmluZSBfX0hBTF9TWVNDRkdfQlJFQUtfUFZEX0xPQ0soKSAgICAgIGRvIHtTWVNDRkctPkNGR1IyICY9IH4oU1lTQ0ZHX0NGR1IyX1BWRF9MT0NLKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWVNDRkctPkNGR1IyIHw9IFNZU0NGR19DRkdSMl9QVkRfTE9DSzsgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH13aGlsZSgwVSkKKy8qKgorICogQH0KKyAqLworI2VuZGlmIC8qIFNZU0NGR19DRkdSMl9QVkRfTE9DSyAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfQ0ZHUjJfU1JBTV9QQVJJVFlfTE9DSykKKy8qKiBAZGVmZ3JvdXAgU1JBTV9QYXJpdHlfTG9jayBTUkFNIFBhcml0eSBMb2NrCisgICogQHsKKyAgKi8KKy8qKiBAYnJpZWYgIFNZU0NGRyBCcmVhayBTUkFNIFBBUklUWSBsb2NrCisgICogICAgICAgICBFbmFibGVzIGFuZCBsb2NrcyB0aGUgU1JBTV9QQVJJVFkgZXJyb3Igc2lnbmFsIHdpdGggQnJlYWsgSW5wdXQgb2YgVElNRVIxLzgvMTUvMTYvMTcKKyAgKiBAbm90ZSAgIFRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uIGlzIGxvY2tlZCBhbmQgY2FuIGJlIHVubG9ja2VkIGJ5IHN5c3RlbSByZXNldAorICAqLworI2RlZmluZSBfX0hBTF9TWVNDRkdfQlJFQUtfU1JBTVBBUklUWV9MT0NLKCkgZG8ge1NZU0NGRy0+Q0ZHUjIgJj0gfihTWVNDRkdfQ0ZHUjJfU1JBTV9QQVJJVFlfTE9DSyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWVNDRkctPkNGR1IyIHw9IFNZU0NGR19DRkdSMl9TUkFNX1BBUklUWV9MT0NLOyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMFUpCisvKioKKyAqIEB9CisgKi8KKyNlbmRpZiAvKiBTWVNDRkdfQ0ZHUjJfU1JBTV9QQVJJVFlfTE9DSyAqLworIAorLyoqIEBkZWZncm91cCBUcmlnZ2VyX1JlbWFwcGluZ19FbmFibGUgVHJpZ2dlciBSZW1hcHBpbmcgRW5hYmxlCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSM19UUklHR0VSX1JNUCkKKy8qKiBAYnJpZWYgIFRyaWdnZXIgcmVtYXBwaW5nIGVuYWJsZS9kaXNhYmxlIG1hY3JvcworICAqIEBwYXJhbSBfX1RSSUdHRVJfUkVNQVBfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhBTF9UcmlnZ2VyX1JlbWFwcGluZworICAqLworI2RlZmluZSBfX0hBTF9SRU1BUFRSSUdHRVJfRU5BQkxFKF9fVFJJR0dFUl9SRU1BUF9fKSAgIGRvIHthc3NlcnRfcGFyYW0oSVNfSEFMX1JFTUFQVFJJR0dFUigoX19UUklHR0VSX1JFTUFQX18pKSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19UUklHR0VSX1JFTUFQX18pICYgSEFMX1JFTUFQX0NGR1IzX01BU0spID8gICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNZU0NGRy0+Q0ZHUjMgfD0gKChfX1RSSUdHRVJfUkVNQVBfXykgJiB+SEFMX1JFTUFQX0NGR1IzX01BU0spKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU1lTQ0ZHLT5DRkdSMSB8PSAoX19UUklHR0VSX1JFTUFQX18pKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXdoaWxlKDBVKQorI2RlZmluZSBfX0hBTF9SRU1BUFRSSUdHRVJfRElTQUJMRShfX1RSSUdHRVJfUkVNQVBfXykgIGRvIHthc3NlcnRfcGFyYW0oSVNfSEFMX1JFTUFQVFJJR0dFUigoX19UUklHR0VSX1JFTUFQX18pKSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19UUklHR0VSX1JFTUFQX18pICYgSEFMX1JFTUFQX0NGR1IzX01BU0spID8gICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNZU0NGRy0+Q0ZHUjMgJj0gKH4oX19UUklHR0VSX1JFTUFQX18pIHwgSEFMX1JFTUFQX0NGR1IzX01BU0spKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU1lTQ0ZHLT5DRkdSMSAmPSB+KF9fVFJJR0dFUl9SRU1BUF9fKSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXdoaWxlKDBVKQorI2Vsc2UKKy8qKiBAYnJpZWYgIFRyaWdnZXIgcmVtYXBwaW5nIGVuYWJsZS9kaXNhYmxlIG1hY3JvcworICAqIEBwYXJhbSBfX1RSSUdHRVJfUkVNQVBfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhBTF9UcmlnZ2VyX1JlbWFwcGluZworICAqLworI2RlZmluZSBfX0hBTF9SRU1BUFRSSUdHRVJfRU5BQkxFKF9fVFJJR0dFUl9SRU1BUF9fKSAgIGRvIHthc3NlcnRfcGFyYW0oSVNfSEFMX1JFTUFQVFJJR0dFUigoX19UUklHR0VSX1JFTUFQX18pKSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNZU0NGRy0+Q0ZHUjEgfD0gKF9fVFJJR0dFUl9SRU1BUF9fKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXdoaWxlKDBVKQorI2RlZmluZSBfX0hBTF9SRU1BUFRSSUdHRVJfRElTQUJMRShfX1RSSUdHRVJfUkVNQVBfXykgIGRvIHthc3NlcnRfcGFyYW0oSVNfSEFMX1JFTUFQVFJJR0dFUigoX19UUklHR0VSX1JFTUFQX18pKSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNZU0NGRy0+Q0ZHUjEgJj0gfihfX1RSSUdHRVJfUkVNQVBfXykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXdoaWxlKDBVKQorI2VuZGlmIC8qIFNZU0NGR19DRkdSM19UUklHR0VSX1JNUCAqLworLyoqCisgKiBAfQorICovCisgCisjaWYgZGVmaW5lZCAoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQgKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkIChTVE0zMkYzOTh4eCkKKy8qKiBAZGVmZ3JvdXAgQURDX1RyaWdnZXJfUmVtYXBwaW5nX0VuYWJsZSBBREMgVHJpZ2dlciBSZW1hcHBpbmcgRW5hYmxlCisgICogQHsKKyAgKi8KKy8qKiBAYnJpZWYgIEFEQyB0cmlnZ2VyIHJlbWFwcGluZyBlbmFibGUvZGlzYWJsZSBtYWNyb3MKKyAgKiBAcGFyYW0gX19BRENUUklHR0VSX1JFTUFQX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBIQUxfQURDX1RyaWdnZXJfUmVtYXBwaW5nCisgICovCisjZGVmaW5lIF9fSEFMX1JFTUFQQURDVFJJR0dFUl9FTkFCTEUoX19BRENUUklHR0VSX1JFTUFQX18pICAgZG8ge2Fzc2VydF9wYXJhbShJU19IQUxfUkVNQVBBRENUUklHR0VSKChfX0FEQ1RSSUdHRVJfUkVNQVBfXykpKTsgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNZU0NGRy0+Q0ZHUjQgfD0gKF9fQURDVFJJR0dFUl9SRU1BUF9fKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JFTUFQQURDVFJJR0dFUl9ESVNBQkxFKF9fQURDVFJJR0dFUl9SRU1BUF9fKSAgZG8ge2Fzc2VydF9wYXJhbShJU19IQUxfUkVNQVBBRENUUklHR0VSKChfX0FEQ1RSSUdHRVJfUkVNQVBfXykpKTsgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNZU0NGRy0+Q0ZHUjQgJj0gfihfX0FEQ1RSSUdHRVJfUkVNQVBfXykpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMFUpCisvKioKKyAqIEB9CisgKi8KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSMl9CWVBfQUREUl9QQVIpCisvKiogQGRlZmdyb3VwIFJBTV9QYXJpdHlfQ2hlY2tfRGlzYWJsZSBSQU0gUGFyaXR5IENoZWNrIERpc2FibGUKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBQYXJpdHkgY2hlY2sgb24gUkFNIGRpc2FibGUgbWFjcm8KKyAgKiBAbm90ZSAgIERpc2FibGluZyB0aGUgcGFyaXR5IGNoZWNrIG9uIFJBTSBsb2NrcyB0aGUgY29uZmlndXJhdGlvbiBiaXQuCisgICogICAgICAgICBUbyByZS1lbmFibGUgdGhlIHBhcml0eSBjaGVjayBvbiBSQU0gcGVyZm9ybSBhIHN5c3RlbSByZXNldC4KKyAgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX1JBTV9QQVJJVFlDSEVDS19ESVNBQkxFKCkgICAgICAgICAoKihfX0lPIHVpbnQzMl90ICopIENGR1IyX0JZUEFERFJQQVJfQkIgPSAweDAwMDAwMDAxVSkKKy8qKgorICogQH0KKyAqLworI2VuZGlmIC8qIFNZU0NGR19DRkdSMl9CWVBfQUREUl9QQVIgKi8KKyAKKyNpZiBkZWZpbmVkKFNZU0NGR19SQ1JfUEFHRTApCisvKiogQGRlZmdyb3VwIENDTV9SQU1fUGFnZV9Xcml0ZV9Qcm90ZWN0aW9uX0VuYWJsZSBDQ00gUkFNIHBhZ2Ugd3JpdGUgcHJvdGVjdGlvbiBlbmFibGUKKyAgKiBAeworICAqLworLyoqIEBicmllZiAgQ0NNIFJBTSBwYWdlIHdyaXRlIHByb3RlY3Rpb24gZW5hYmxlIG1hY3JvCisgICogQHBhcmFtIF9fUEFHRV9XUF9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSEFMX1BhZ2VfV3JpdGVfUHJvdGVjdGlvbgorICAqIEBub3RlICAgd3JpdGUgcHJvdGVjdGlvbiBjYW4gb25seSBiZSBkaXNhYmxlZCBieSBhIHN5c3RlbSByZXNldAorICAqLworI2RlZmluZSBfX0hBTF9TWVNDRkdfU1JBTV9XUlBfRU5BQkxFKF9fUEFHRV9XUF9fKSAgICAgIGRvIHthc3NlcnRfcGFyYW0oSVNfSEFMX1NZU0NGR19XUF9QQUdFKChfX1BBR0VfV1BfXykpKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWVNDRkctPlJDUiB8PSAoX19QQUdFX1dQX18pOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH13aGlsZSgwVSkKKy8qKgorICogQH0KKyAqLworI2VuZGlmIC8qIFNZU0NGR19SQ1JfUEFHRTAgKi8KKyAKKy8qKgorICogQH0KKyAqLyAKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEhBTF9Qcml2YXRlX01hY3JvcyBIQUwgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19USUNLRlJFUShGUkVRKSAoKChGUkVRKSA9PSBIQUxfVElDS19GUkVRXzEwSFopICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZSRVEpID09IEhBTF9USUNLX0ZSRVFfMTAwSFopIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRlJFUSkgPT0gSEFMX1RJQ0tfRlJFUV8xS0haKSkKKy8qKgorICogQH0KKyAqLyAKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgSEFMX0V4cG9ydGVkX0Z1bmN0aW9ucyBIQUwgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEhBTF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBGdW5jdGlvbnMgCisgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9Jbml0KHZvaWQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RlSW5pdCh2b2lkKTsKK3ZvaWQgSEFMX01zcEluaXQodm9pZCk7Cit2b2lkIEhBTF9Nc3BEZUluaXQodm9pZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSW5pdFRpY2sgKHVpbnQzMl90IFRpY2tQcmlvcml0eSk7CisvKioKKyAqIEB9CisgKi8KKyAKKy8qIEV4cG9ydGVkIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEhBTF9FeHBvcnRlZF9WYXJpYWJsZXMKKyAgKiBAeworICAqLworZXh0ZXJuIF9fSU8gdWludDMyX3QgdXdUaWNrOworZXh0ZXJuIHVpbnQzMl90IHV3VGlja1ByaW87CitleHRlcm4gSEFMX1RpY2tGcmVxVHlwZURlZiB1d1RpY2tGcmVxOworLyoqCisgICogQH0KKyAgKi8KKyAKKy8qKiBAYWRkdG9ncm91cCBIQUxfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBIQUwgQ29udHJvbCBmdW5jdGlvbnMgCisgKiAgQGJyaWVmICAgIEhBTCBDb250cm9sIGZ1bmN0aW9ucworICogQHsKKyAqLworLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAgICAgSEFMX0luY1RpY2sodm9pZCk7Cit2b2lkICAgICBIQUxfRGVsYXkodWludDMyX3QgRGVsYXkpOwordm9pZCAgICAgSEFMX1N1c3BlbmRUaWNrKHZvaWQpOwordm9pZCAgICAgSEFMX1Jlc3VtZVRpY2sodm9pZCk7Cit1aW50MzJfdCBIQUxfR2V0VGljayh2b2lkKTsKK3VpbnQzMl90IEhBTF9HZXRUaWNrUHJpbyh2b2lkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TZXRUaWNrRnJlcShIQUxfVGlja0ZyZXFUeXBlRGVmIEZyZXEpOworSEFMX1RpY2tGcmVxVHlwZURlZiBIQUxfR2V0VGlja0ZyZXEodm9pZCk7Cit1aW50MzJfdCBIQUxfR2V0SGFsVmVyc2lvbih2b2lkKTsKK3VpbnQzMl90IEhBTF9HZXRSRVZJRCh2b2lkKTsKK3VpbnQzMl90IEhBTF9HZXRERVZJRCh2b2lkKTsKK3VpbnQzMl90IEhBTF9HZXRVSUR3MCh2b2lkKTsKK3VpbnQzMl90IEhBTF9HZXRVSUR3MSh2b2lkKTsKK3VpbnQzMl90IEhBTF9HZXRVSUR3Mih2b2lkKTsKK3ZvaWQgICAgIEhBTF9EQkdNQ1VfRW5hYmxlREJHU2xlZXBNb2RlKHZvaWQpOwordm9pZCAgICAgSEFMX0RCR01DVV9EaXNhYmxlREJHU2xlZXBNb2RlKHZvaWQpOwordm9pZCAgICAgSEFMX0RCR01DVV9FbmFibGVEQkdTdG9wTW9kZSh2b2lkKTsKK3ZvaWQgICAgIEhBTF9EQkdNQ1VfRGlzYWJsZURCR1N0b3BNb2RlKHZvaWQpOwordm9pZCAgICAgSEFMX0RCR01DVV9FbmFibGVEQkdTdGFuZGJ5TW9kZSh2b2lkKTsKK3ZvaWQgICAgIEhBTF9EQkdNQ1VfRGlzYWJsZURCR1N0YW5kYnlNb2RlKHZvaWQpOworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqCisgICogQH0KKyAgKi8gCisgIAorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJGM3h4X0hBTF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2hhbF9hZGMuaCBiL0luYy9zdG0zMmYzeHhfaGFsX2FkYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZWNhOWEKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2hhbF9hZGMuaApAQCAtMCwwICsxLDI0MSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfYWRjLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIGNvbnRhaW5pbmcgZnVuY3Rpb25zIHByb3RvdHlwZXMgb2YgQURDIEhBTCBsaWJyYXJ5LgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkYzeHhfQURDX0gKKyNkZWZpbmUgX19TVE0zMkYzeHhfQURDX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2RlZi5oIgorICAgCisvKiBJbmNsdWRlIEFEQyBIQUwgRXh0ZW5kZWQgbW9kdWxlICovCisvKiAoaW5jbHVkZSBvbiB0b3Agb2YgZmlsZSBzaW5jZSBBREMgc3RydWN0dXJlcyBhcmUgZGVmaW5lZCBpbiBleHRlbmRlZCBmaWxlKSAqLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfYWRjX2V4LmgiCisgICAKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBBREMKKyAgKiBAeworICAqLyAKKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQURDX0V4cG9ydGVkX1R5cGVzIEFEQyBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisvKiogCisgICogQGJyaWVmICBIQUwgQURDIHN0YXRlIG1hY2hpbmU6IEFEQyBzdGF0ZXMgZGVmaW5pdGlvbiAoYml0ZmllbGRzKQorICAqIEBub3RlICAgQURDIHN0YXRlIG1hY2hpbmUgaXMgbWFuYWdlZCBieSBiaXRmaWVsZHMsIHN0YXRlIG11c3QgYmUgY29tcGFyZWQKKyAgKiAgICAgICAgIHdpdGggYml0IGJ5IGJpdC4KKyAgKiAgICAgICAgIEZvciBleGFtcGxlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAqICAgICAgICAgICAiIGlmIChIQUxfSVNfQklUX1NFVChIQUxfQURDX0dldFN0YXRlKGhhZGMxKSwgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSkpICIKKyAgKiAgICAgICAgICAgIiBpZiAoSEFMX0lTX0JJVF9TRVQoSEFMX0FEQ19HZXRTdGF0ZShoYWRjMSksIEhBTF9BRENfU1RBVEVfQVdEMSkgICAgKSAiCisgICovCisvKiBTdGF0ZXMgb2YgQURDIGdsb2JhbCBzY29wZSAqLworI2RlZmluZSBIQUxfQURDX1NUQVRFX1JFU0VUICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgLyohPCBBREMgbm90IHlldCBpbml0aWFsaXplZCBvciBkaXNhYmxlZCAqLworI2RlZmluZSBIQUxfQURDX1NUQVRFX1JFQURZICAgICAgICAgICAgICgweDAwMDAwMDAxVSkgICAgLyohPCBBREMgcGVyaXBoZXJhbCByZWFkeSBmb3IgdXNlICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfQlVTWV9JTlRFUk5BTCAgICAgKDB4MDAwMDAwMDJVKSAgICAvKiE8IEFEQyBpcyBidXN5IHRvIGludGVybmFsIHByb2Nlc3MgKGluaXRpYWxpemF0aW9uLCBjYWxpYnJhdGlvbikgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9USU1FT1VUICAgICAgICAgICAoMHgwMDAwMDAwNFUpICAgIC8qITwgVGltZU91dCBvY2N1cnJlbmNlICovCisKKy8qIFN0YXRlcyBvZiBBREMgZXJyb3JzICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwgICAgKDB4MDAwMDAwMTBVKSAgICAvKiE8IEludGVybmFsIGVycm9yIG9jY3VycmVuY2UgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcgICAgICAoMHgwMDAwMDAyMFUpICAgIC8qITwgQ29uZmlndXJhdGlvbiBlcnJvciBvY2N1cnJlbmNlICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfRVJST1JfRE1BICAgICAgICAgKDB4MDAwMDAwNDBVKSAgICAvKiE8IERNQSBlcnJvciBvY2N1cnJlbmNlICovCisKKy8qIFN0YXRlcyBvZiBBREMgZ3JvdXAgcmVndWxhciAqLworI2RlZmluZSBIQUxfQURDX1NUQVRFX1JFR19CVVNZICAgICAgICAgICgweDAwMDAwMTAwVSkgICAgLyohPCBBIGNvbnZlcnNpb24gb24gZ3JvdXAgcmVndWxhciBpcyBvbmdvaW5nIG9yIGNhbiBvY2N1ciAoZWl0aGVyIGJ5IGNvbnRpbnVvdXMgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgdHJpZ2dlciwgbG93IHBvd2VyIGF1dG8gcG93ZXItb24sIG11bHRpbW9kZSBBREMgbWFzdGVyIGNvbnRyb2wpICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfUkVHX0VPQyAgICAgICAgICAgKDB4MDAwMDAyMDBVKSAgICAvKiE8IENvbnZlcnNpb24gZGF0YSBhdmFpbGFibGUgb24gZ3JvdXAgcmVndWxhciAqLworI2RlZmluZSBIQUxfQURDX1NUQVRFX1JFR19PVlIgICAgICAgICAgICgweDAwMDAwNDAwVSkgICAgLyohPCBPdmVycnVuIG9jY3VycmVuY2UgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9SRUdfRU9TTVAgICAgICAgICAoMHgwMDAwMDgwMFUpICAgIC8qITwgRW5kIE9mIFNhbXBsaW5nIGZsYWcgcmFpc2VkICAqLworCisvKiBTdGF0ZXMgb2YgQURDIGdyb3VwIGluamVjdGVkICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kgICAgICAgICAgKDB4MDAwMDEwMDBVKSAgICAvKiE8IEEgY29udmVyc2lvbiBvbiBncm91cCBpbmplY3RlZCBpcyBvbmdvaW5nIG9yIGNhbiBvY2N1ciAoZWl0aGVyIGJ5IGF1dG8taW5qZWN0aW9uIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIHRyaWdnZXIsIGxvdyBwb3dlciBhdXRvIHBvd2VyLW9uLCBtdWx0aW1vZGUgQURDIG1hc3RlciBjb250cm9sKSAqLworI2RlZmluZSBIQUxfQURDX1NUQVRFX0lOSl9FT0MgICAgICAgICAgICgweDAwMDAyMDAwVSkgICAgLyohPCBDb252ZXJzaW9uIGRhdGEgYXZhaWxhYmxlIG9uIGdyb3VwIGluamVjdGVkICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfSU5KX0pRT1ZGICAgICAgICAgKDB4MDAwMDQwMDBVKSAgICAvKiE8IEluamVjdGVkIHF1ZXVlIG92ZXJmbG93IG9jY3VycmVuY2UgKi8KKworLyogU3RhdGVzIG9mIEFEQyBhbmFsb2cgd2F0Y2hkb2dzICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfQVdEMSAgICAgICAgICAgICAgKDB4MDAwMTAwMDBVKSAgICAvKiE8IE91dC1vZi13aW5kb3cgb2NjdXJyZW5jZSBvZiBhbmFsb2cgd2F0Y2hkb2cgMSAqLworI2RlZmluZSBIQUxfQURDX1NUQVRFX0FXRDIgICAgICAgICAgICAgICgweDAwMDIwMDAwVSkgICAgLyohPCBPdXQtb2Ytd2luZG93IG9jY3VycmVuY2Ugb2YgYW5hbG9nIHdhdGNoZG9nIDIgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9BV0QzICAgICAgICAgICAgICAoMHgwMDA0MDAwMFUpICAgIC8qITwgT3V0LW9mLXdpbmRvdyBvY2N1cnJlbmNlIG9mIGFuYWxvZyB3YXRjaGRvZyAzICovCisKKy8qIFN0YXRlcyBvZiBBREMgbXVsdGktbW9kZSAqLworI2RlZmluZSBIQUxfQURDX1NUQVRFX01VTFRJTU9ERV9TTEFWRSAgICgweDAwMTAwMDAwVSkgICAgLyohPCBBREMgaW4gbXVsdGltb2RlIHNsYXZlIHN0YXRlLCBjb250cm9sbGVkIGJ5IGFub3RoZXIgQURDIG1hc3RlciAoICovCisKKworLyoqIAorICAqIEBicmllZiAgQURDIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiAgCisgICovCit0eXBlZGVmIHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmCit7CisgIEFEQ19UeXBlRGVmICAgICAgICAgICAgICAgICAgICpJbnN0YW5jZTsgICAgICAgICAgICAgIC8qITwgUmVnaXN0ZXIgYmFzZSBhZGRyZXNzICovCisKKyAgQURDX0luaXRUeXBlRGVmICAgICAgICAgICAgICAgSW5pdDsgICAgICAgICAgICAgICAgICAgLyohPCBBREMgcmVxdWlyZWQgcGFyYW1ldGVycyAqLworCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAgICAgICpETUFfSGFuZGxlOyAgICAgICAgICAgIC8qITwgUG9pbnRlciBETUEgSGFuZGxlciAqLworCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgICAgICAgIExvY2s7ICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGxvY2tpbmcgb2JqZWN0ICovCisKKyAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICAgICAgU3RhdGU7ICAgICAgICAgICAgICAgICAgLyohPCBBREMgY29tbXVuaWNhdGlvbiBzdGF0ZSAoYml0bWFwIG9mIEFEQyBzdGF0ZXMpICovCisKKyAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICAgICAgRXJyb3JDb2RlOyAgICAgICAgICAgICAgLyohPCBBREMgRXJyb3IgY29kZSAqLworICAKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorICBBRENfSW5qZWN0aW9uQ29uZmlnVHlwZURlZiAgICBJbmplY3Rpb25Db25maWcgOyAgICAgICAvKiE8IEFEQyBpbmplY3RlZCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gYnVpbGQtdXAgc3RydWN0dXJlICovICAKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworICAKK31BRENfSGFuZGxlVHlwZURlZjsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAKKy8qKiBAZGVmZ3JvdXAgQURDX0V4cG9ydGVkX01hY3JvIEFEQyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworLyoqIEBicmllZiAgUmVzZXQgQURDIGhhbmRsZSBzdGF0ZQorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0FEQ19SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfQURDX1NUQVRFX1JFU0VUKQorCisvKioKKyAgKiBAfQorICAqLyAKKworCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgQURDX0V4cG9ydGVkX0Z1bmN0aW9ucyBBREMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8gCisKKy8qKiBAYWRkdG9ncm91cCBBRENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIAorICogQHsKKyAqLyAKKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiAgICAgICBIQUxfQURDX0luaXQoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpOworSEFMX1N0YXR1c1R5cGVEZWYgICAgICAgSEFMX0FEQ19EZUluaXQoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOwordm9pZCAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19Nc3BJbml0KEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKK3ZvaWQgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfTXNwRGVJbml0KEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBBRENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAqIEB7CisgKi8gCisvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiAgICAgICBIQUxfQURDX1N0YXJ0KEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICAgIEhBTF9BRENfU3RvcChBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7CitIQUxfU3RhdHVzVHlwZURlZiAgICAgICBIQUxfQURDX1BvbGxGb3JDb252ZXJzaW9uKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICAgIEhBTF9BRENfUG9sbEZvckV2ZW50KEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCBFdmVudFR5cGUsIHVpbnQzMl90IFRpbWVvdXQpOworCisvKiBOb24tYmxvY2tpbmcgbW9kZTogSW50ZXJydXB0aW9uICovCitIQUxfU3RhdHVzVHlwZURlZiAgICAgICBIQUxfQURDX1N0YXJ0X0lUKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICAgIEhBTF9BRENfU3RvcF9JVChBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7CisKKy8qIE5vbi1ibG9ja2luZyBtb2RlOiBETUEgKi8KK0hBTF9TdGF0dXNUeXBlRGVmICAgICAgIEhBTF9BRENfU3RhcnRfRE1BKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCogcERhdGEsIHVpbnQzMl90IExlbmd0aCk7CitIQUxfU3RhdHVzVHlwZURlZiAgICAgICBIQUxfQURDX1N0b3BfRE1BKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKKworLyogQURDIHJldHJpZXZlIGNvbnZlcnNpb24gdmFsdWUgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIHBvbGxpbmcgb3IgaW50ZXJydXB0aW9uICovCit1aW50MzJfdCAgICAgICAgICAgICAgICBIQUxfQURDX0dldFZhbHVlKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKKworLyogQURDIElSUUhhbmRsZXIgYW5kIENhbGxiYWNrcyB1c2VkIGluIG5vbi1ibG9ja2luZyBtb2RlcyAoSW50ZXJydXB0aW9uIGFuZCBETUEpICovCit2b2lkICAgICAgICAgICAgICAgICAgICBIQUxfQURDX0lSUUhhbmRsZXIoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpOwordm9pZCAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKK3ZvaWQgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfQ29udkhhbGZDcGx0Q2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpOwordm9pZCAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19MZXZlbE91dE9mV2luZG93Q2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpOwordm9pZCAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19FcnJvckNhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBBRENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKiBAeworICovIAorLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmICAgICAgIEhBTF9BRENfQ29uZmlnQ2hhbm5lbChBRENfSGFuZGxlVHlwZURlZiogaGFkYywgQURDX0NoYW5uZWxDb25mVHlwZURlZiogc0NvbmZpZyk7CitIQUxfU3RhdHVzVHlwZURlZiAgICAgICBIQUxfQURDX0FuYWxvZ1dER0NvbmZpZyhBRENfSGFuZGxlVHlwZURlZiogaGFkYywgQURDX0FuYWxvZ1dER0NvbmZUeXBlRGVmKiBBbmFsb2dXREdDb25maWcpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICogIEBicmllZiAgIEFEQyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAKKyAqIEB7CisgKi8gCisvKiBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgICAgICAgICAgICAgICAgSEFMX0FEQ19HZXRTdGF0ZShBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7Cit1aW50MzJfdCAgICAgICAgICAgICAgICBIQUxfQURDX0dldEVycm9yKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovIAorCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLypfX1NUTTMyRjN4eF9BRENfSCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2hhbF9hZGNfZXguaCBiL0luYy9zdG0zMmYzeHhfaGFsX2FkY19leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMjZkNmQKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2hhbF9hZGNfZXguaApAQCAtMCwwICsxLDM5ODggQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX2FkY19leC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBjb250YWluaW5nIGZ1bmN0aW9ucyBwcm90b3R5cGVzIG9mIEFEQyBIQUwgbGlicmFyeS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0FEQ19FWF9ICisjZGVmaW5lIF9fU1RNMzJGM3h4X0FEQ19FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9kZWYuaCIKKyAgIAorLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEFEQ0V4IEFEQ0V4CisgICogQHsKKyAgKi8gCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEFEQ0V4X0V4cG9ydGVkX1R5cGVzIEFEQ0V4IEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KK3N0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmOworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKy8qKgorICAqIEBicmllZiAgU3RydWN0dXJlIGRlZmluaXRpb24gb2YgQURDIGluaXRpYWxpemF0aW9uIGFuZCByZWd1bGFyIGdyb3VwICAKKyAgKiBAbm90ZSAgIFBhcmFtZXRlcnMgb2YgdGhpcyBzdHJ1Y3R1cmUgYXJlIHNoYXJlZCB3aXRoaW4gMiBzY29wZXM6CisgICogICAgICAgICAgLSBTY29wZSBlbnRpcmUgQURDIChhZmZlY3RzIHJlZ3VsYXIgYW5kIGluamVjdGVkIGdyb3Vwcyk6IENsb2NrUHJlc2NhbGVyLCBSZXNvbHV0aW9uLCBEYXRhQWxpZ24sIAorICAqICAgICAgICAgICAgU2NhbkNvbnZNb2RlLCBFT0NTZWxlY3Rpb24sIExvd1Bvd2VyQXV0b1dhaXQuCisgICogICAgICAgICAgLSBTY29wZSByZWd1bGFyIGdyb3VwOiBDb250aW51b3VzQ29udk1vZGUsIE5ick9mQ29udmVyc2lvbiwgRGlzY29udGludW91c0NvbnZNb2RlLCBOYnJPZkRpc2NDb252ZXJzaW9uLCBFeHRlcm5hbFRyaWdDb252RWRnZSwgRXh0ZXJuYWxUcmlnQ29udiwgRE1BQ29udGludW91c1JlcXVlc3RzLCBPdmVycnVuLgorICAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyB3aXRoIGZ1bmN0aW9uIEhBTF9BRENfSW5pdCgpIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZS4KKyAgKiAgICAgICAgIEFEQyBzdGF0ZSBjYW4gYmUgZWl0aGVyOgorICAqICAgICAgICAgIC0gRm9yIGFsbCBwYXJhbWV0ZXJzOiBBREMgZGlzYWJsZWQKKyAgKiAgICAgICAgICAtIEZvciBhbGwgcGFyYW1ldGVycyBleGNlcHQgJ0xvd1Bvd2VyQXV0b1dhaXQnIGFuZCAnRE1BQ29udGludW91c1JlcXVlc3RzJzogQURDIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIHJlZ3VsYXIgZ3JvdXAuCisgICogICAgICAgICAgLSBGb3IgcGFyYW1ldGVycyAnTG93UG93ZXJBdXRvV2FpdCcgYW5kICdETUFDb250aW51b3VzUmVxdWVzdHMnOiBBREMgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcgb24gcmVndWxhciBhbmQgaW5qZWN0ZWQgZ3JvdXBzLgorICAqICAgICAgICAgSWYgQURDIGlzIG5vdCBpbiB0aGUgYXBwcm9wcmlhdGUgc3RhdGUgdG8gbW9kaWZ5IHNvbWUgcGFyYW1ldGVycywgdGhlc2UgcGFyYW1ldGVycyBzZXR0aW5nIGlzIGJ5cGFzc2VkCisgICogICAgICAgICB3aXRob3V0IGVycm9yIHJlcG9ydGluZyAoYXMgaXQgY2FuIGJlIHRoZSBleHBlY3RlZCBiZWhhdmlvdXIgaW4gY2FzZSBvZiBpbnRlbmRlZCBhY3Rpb24gdG8gdXBkYXRlIGFub3RoZXIgcGFyYW1ldGVyICh3aGljaCBmdWxsZmlsbHMgdGhlIEFEQyBzdGF0ZSBjb25kaXRpb24pIG9uIHRoZSBmbHkpLgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQ2xvY2tQcmVzY2FsZXI7ICAgICAgICAvKiE8IFNlbGVjdCBBREMgY2xvY2sgc291cmNlIChzeW5jaHJvbm91cyBjbG9jayBkZXJpdmVkIGZyb20gQUhCIGNsb2NrIG9yIGFzeW5jaHJvbm91cyBjbG9jayBkZXJpdmVkIGZyb20gQURDIGRlZGljYXRlZCBQTEwgNzJNSHopIGFuZCBjbG9jayBwcmVzY2FsZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgY2xvY2sgaXMgY29tbW9uIGZvciBhbGwgdGhlIEFEQ3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ0V4X0Nsb2NrUHJlc2NhbGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBJbiBjYXNlIG9mIHVzYWdlIG9mIGNoYW5uZWxzIG9uIGluamVjdGVkIGdyb3VwLCBBREMgZnJlcXVlbmN5IHNob3VsZCBiZSBsb3dlciB0aGFuIEFIQiBjbG9jayBmcmVxdWVuY3kgLzQgZm9yIHJlc29sdXRpb24gMTIgb3IgMTAgYml0cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBSEIgY2xvY2sgZnJlcXVlbmN5IC8zIGZvciByZXNvbHV0aW9uIDggYml0cywgQUhCIGNsb2NrIGZyZXF1ZW5jeSAvMiBmb3IgcmVzb2x1dGlvbiA2IGJpdHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBJbiBjYXNlIG9mIHVzYWdlIG9mIHRoZSBBREMgZGVkaWNhdGVkIFBMTCBjbG9jaywgdGhpcyBjbG9jayBtdXN0IGJlIHByZWxpbWluYXJpbHkgZW5hYmxlZCBhbmQgcHJlc2NhbGVyIHNldCBhdCBSQ0MgdG9wIGxldmVsLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBtb2RpZmllZCBvbmx5IGlmIGFsbCBBRENzIG9mIHRoZSBjb21tb24gQURDIGdyb3VwIGFyZSBkaXNhYmxlZCAoZm9yIHByb2R1Y3RzIHdpdGggc2V2ZXJhbCBBRENzKSAqLworICB1aW50MzJfdCBSZXNvbHV0aW9uOyAgICAgICAgICAgIC8qITwgQ29uZmlndXJlcyB0aGUgQURDIHJlc29sdXRpb24uIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENFeF9SZXNvbHV0aW9uICovCisgIHVpbnQzMl90IERhdGFBbGlnbjsgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgQURDIGRhdGEgYWxpZ25tZW50IHRvIHJpZ2h0IChmb3IgcmVzb2x1dGlvbiAxMiBiaXRzOiBNU0Igb24gcmVnaXN0ZXIgYml0IDExIGFuZCBMU0Igb24gcmVnaXN0ZXIgYml0IDBVKSAoZGVmYXVsdCBzZXR0aW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgdG8gbGVmdCAoZm9yIHJlc29sdXRpb24gMTIgYml0cywgaWYgb2Zmc2V0IGRpc2FibGVkOiBNU0Igb24gcmVnaXN0ZXIgYml0IDE1IGFuZCBMU0Igb24gcmVnaXN0ZXIgYml0IDRVLCBpZiBvZmZzZXQgZW5hYmxlZDogTVNCIG9uIHJlZ2lzdGVyIGJpdCAxNCBhbmQgTFNCIG9uIHJlZ2lzdGVyIGJpdCAzVSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgcmVmZXJlbmNlIG1hbnVhbCBmb3IgYWxpZ25tZW50cyB3aXRoIG90aGVyIHJlc29sdXRpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENFeF9EYXRhX2FsaWduICovCisgIHVpbnQzMl90IFNjYW5Db252TW9kZTsgICAgICAgICAgLyohPCBDb25maWd1cmVzIHRoZSBzZXF1ZW5jZXIgb2YgcmVndWxhciBhbmQgaW5qZWN0ZWQgZ3JvdXBzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFzc29jaWF0ZWQgdG8gcGFyYW1ldGVyICdEaXNjb250aW51b3VzQ29udk1vZGUnIHRvIGhhdmUgbWFpbiBzZXF1ZW5jZSBzdWJkaXZpZGVkIGluIHN1Y2Nlc3NpdmUgcGFydHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBkaXNhYmxlZDogQ29udmVyc2lvbiBpcyBwZXJmb3JtZWQgaW4gc2luZ2xlIG1vZGUgKG9uZSBjaGFubmVsIGNvbnZlcnRlZCwgdGhlIG9uZSBkZWZpbmVkIGluIHJhbmsgMVUpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnMgJ05ick9mQ29udmVyc2lvbicgYW5kICdJbmplY3RlZE5ick9mQ29udmVyc2lvbicgYXJlIGRpc2NhcmRlZCAoZXF1aXZhbGVudCB0byBzZXQgdG8gMVUpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZW5hYmxlZDogIENvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQgaW4gc2VxdWVuY2UgbW9kZSAobXVsdGlwbGUgcmFua3MgZGVmaW5lZCBieSAnTmJyT2ZDb252ZXJzaW9uJy8nSW5qZWN0ZWROYnJPZkNvbnZlcnNpb24nIGFuZCBlYWNoIGNoYW5uZWwgcmFuaykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbiBkaXJlY3Rpb24gaXMgdXB3YXJkOiBmcm9tIHJhbmsxIHRvIHJhbmsgJ24nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENFeF9TY2FuX21vZGUgKi8KKyAgdWludDMyX3QgRU9DU2VsZWN0aW9uOyAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGF0IEVPQyAoRW5kIE9mIENvbnZlcnNpb24pIGZsYWcgaXMgdXNlZCBmb3IgY29udmVyc2lvbiBieSBwb2xsaW5nIGFuZCBpbnRlcnJ1cHRpb246IGVuZCBvZiBjb252ZXJzaW9uIG9mIGVhY2ggcmFuayBvciBjb21wbGV0ZSBzZXF1ZW5jZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDRXhfRU9DU2VsZWN0aW9uLiAqLworICB1aW50MzJfdCBMb3dQb3dlckF1dG9XYWl0OyAgICAgIC8qITwgU2VsZWN0cyB0aGUgZHluYW1pYyBsb3cgcG93ZXIgQXV0byBEZWxheTogQURDIGNvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQgb25seSB3aGVuIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldyBjb252ZXJzaW9uIHN0YXJ0cyBvbmx5IHdoZW4gdGhlIHByZXZpb3VzIGNvbnZlcnNpb24gKGZvciByZWd1bGFyIGdyb3VwKSBvciBwcmV2aW91cyBzZXF1ZW5jZSAoZm9yIGluamVjdGVkIGdyb3VwKSBoYXMgYmVlbiB0cmVhdGVkIGJ5IHVzZXIgc29mdHdhcmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgYXV0b21hdGljYWxseSBhZGFwdHMgdGhlIHNwZWVkIG9mIEFEQyB0byB0aGUgc3BlZWQgb2YgdGhlIHN5c3RlbSB0aGF0IHJlYWRzIHRoZSBkYXRhLiBNb3Jlb3ZlciwgdGhpcyBhdm9pZHMgcmlzayBvZiBvdmVycnVuIGZvciBsb3cgZnJlcXVlbmN5IGFwcGxpY2F0aW9ucy4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvIEVOQUJMRSBvciBESVNBQkxFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogRG8gbm90IHVzZSB3aXRoIGludGVycnVwdGlvbiBvciBETUEgKEhBTF9BRENfU3RhcnRfSVQoKSwgSEFMX0FEQ19TdGFydF9ETUEoKSkgc2luY2UgdGhleSBoYXZlIHRvIGNsZWFyIGltbWVkaWF0ZWx5IHRoZSBFT0MgZmxhZyB0byBmcmVlIHRoZSBJUlEgdmVjdG9yIHNlcXVlbmNlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvIHVzZSB3aXRoIHBvbGxpbmc6IDEuIFN0YXJ0IGNvbnZlcnNpb24gd2l0aCBIQUxfQURDX1N0YXJ0KCksIDIuIExhdGVyIG9uLCB3aGVuIGNvbnZlcnNpb24gZGF0YSBpcyBuZWVkZWQ6IHVzZSBIQUxfQURDX1BvbGxGb3JDb252ZXJzaW9uKCkgdG8gZW5zdXJlIHRoYXQgY29udmVyc2lvbiBpcyBjb21wbGV0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB1c2UgSEFMX0FEQ19HZXRWYWx1ZSgpIHRvIHJldHJpZXZlIGNvbnZlcnNpb24gcmVzdWx0IGFuZCB0cmlnIGFub3RoZXIgY29udmVyc2lvbiAoaW4gY2FzZSBvZiB1c2FnZSBvZiBpbmplY3RlZCBncm91cCwgdXNlIHRoZSBlcXVpdmFsZW50IGZ1bmN0aW9ucyBIQUxfQURDRXhJbmplY3RlZF9TdGFydCgpLCBIQUxfQURDRXhfSW5qZWN0ZWRHZXRWYWx1ZSgpLCAuLi4pLiAqLworICB1aW50MzJfdCBDb250aW51b3VzQ29udk1vZGU7ICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNvbnZlcnNpb24gaXMgcGVyZm9ybWVkIGluIHNpbmdsZSBtb2RlIChvbmUgY29udmVyc2lvbikgb3IgY29udGludW91cyBtb2RlIGZvciByZWd1bGFyIGdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgdGhlIHNlbGVjdGVkIHRyaWdnZXIgb2NjdXJyZWQgKHNvZnR3YXJlIHN0YXJ0IG9yIGV4dGVybmFsIHRyaWdnZXIpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRS4gKi8KKyAgdWludDMyX3QgTmJyT2ZDb252ZXJzaW9uOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHJhbmtzIHRoYXQgd2lsbCBiZSBjb252ZXJ0ZWQgd2l0aGluIHRoZSByZWd1bGFyIGdyb3VwIHNlcXVlbmNlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvIHVzZSB0aGUgcmVndWxhciBncm91cCBzZXF1ZW5jZXIgYW5kIGNvbnZlcnQgc2V2ZXJhbCByYW5rcywgcGFyYW1ldGVyICdTY2FuQ29udk1vZGUnIG11c3QgYmUgZW5hYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDEgYW5kIE1heF9EYXRhID0gMTYuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIG1vZGlmaWVkIHdoZW4gbm8gY29udmVyc2lvbiBpcyBvbiBnb2luZyBvbiByZWd1bGFyIGdyb3VwIChBREMgZGlzYWJsZWQsIG9yIEFEQyBlbmFibGVkIHdpdGhvdXQgY29udGludW91cyBtb2RlIG9yIGV4dGVybmFsIHRyaWdnZXIgdGhhdCBjb3VsZCBsYXVuY2ggYSBjb252ZXJzaW9uKS4gKi8KKyAgdWludDMyX3QgRGlzY29udGludW91c0NvbnZNb2RlOyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBjb252ZXJzaW9ucyBzZXF1ZW5jZSBvZiByZWd1bGFyIGdyb3VwIGlzIHBlcmZvcm1lZCBpbiBDb21wbGV0ZS1zZXF1ZW5jZS9EaXNjb250aW51b3VzLXNlcXVlbmNlIChtYWluIHNlcXVlbmNlIHN1YmRpdmlkZWQgaW4gc3VjY2Vzc2l2ZSBwYXJ0cykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNjb250aW51b3VzIG1vZGUgaXMgdXNlZCBvbmx5IGlmIHNlcXVlbmNlciBpcyBlbmFibGVkIChwYXJhbWV0ZXIgJ1NjYW5Db252TW9kZScpLiBJZiBzZXF1ZW5jZXIgaXMgZGlzYWJsZWQsIHRoaXMgcGFyYW1ldGVyIGlzIGRpc2NhcmRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2NvbnRpbnVvdXMgbW9kZSBjYW4gYmUgZW5hYmxlZCBvbmx5IGlmIGNvbnRpbnVvdXMgbW9kZSBpcyBkaXNhYmxlZC4gSWYgY29udGludW91cyBtb2RlIGlzIGVuYWJsZWQsIHRoaXMgcGFyYW1ldGVyIHNldHRpbmcgaXMgZGlzY2FyZGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRS4gKi8KKyAgdWludDMyX3QgTmJyT2ZEaXNjQ29udmVyc2lvbjsgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRpc2NvbnRpbnVvdXMgY29udmVyc2lvbnMgaW4gd2hpY2ggdGhlICBtYWluIHNlcXVlbmNlIG9mIHJlZ3VsYXIgZ3JvdXAgKHBhcmFtZXRlciBOYnJPZkNvbnZlcnNpb24pIHdpbGwgYmUgc3ViZGl2aWRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHBhcmFtZXRlciAnRGlzY29udGludW91c0NvbnZNb2RlJyBpcyBkaXNhYmxlZCwgdGhpcyBwYXJhbWV0ZXIgaXMgZGlzY2FyZGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMSBhbmQgTWF4X0RhdGEgPSA4LiAqLworICB1aW50MzJfdCBFeHRlcm5hbFRyaWdDb252OyAgICAgIC8qITwgU2VsZWN0cyB0aGUgZXh0ZXJuYWwgZXZlbnQgdXNlZCB0byB0cmlnZ2VyIHRoZSBjb252ZXJzaW9uIHN0YXJ0IG9mIHJlZ3VsYXIgZ3JvdXAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBzZXQgdG8gQURDX1NPRlRXQVJFX1NUQVJULCBleHRlcm5hbCB0cmlnZ2VycyBhcmUgZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ0V4X0V4dGVybmFsX3RyaWdnZXJfc291cmNlX1JlZ3VsYXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdXRpb246IEZvciBkZXZpY2VzIHdpdGggc2V2ZXJhbCBBRENzLCBleHRlcm5hbCB0cmlnZ2VyIHNvdXJjZSBpcyBjb21tb24gdG8gQURDIGNvbW1vbiBncm91cCAoZm9yIGV4YW1wbGU6IEFEQzEmQURDMiwgQURDMyZBREM0LCBpZiBhdmFpbGFibGUpICAqLworICB1aW50MzJfdCBFeHRlcm5hbFRyaWdDb252RWRnZTsgIC8qITwgU2VsZWN0cyB0aGUgZXh0ZXJuYWwgdHJpZ2dlciBlZGdlIG9mIHJlZ3VsYXIgZ3JvdXAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0cmlnZ2VyIGlzIHNldCB0byBBRENfU09GVFdBUkVfU1RBUlQsIHRoaXMgcGFyYW1ldGVyIGlzIGRpc2NhcmRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDRXhfRXh0ZXJuYWxfdHJpZ2dlcl9lZGdlX1JlZ3VsYXIgKi8KKyAgdWludDMyX3QgRE1BQ29udGludW91c1JlcXVlc3RzOyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBETUEgcmVxdWVzdHMgYXJlIHBlcmZvcm1lZCBpbiBvbmUgc2hvdCBtb2RlIChETUEgdHJhbnNmZXIgc3RvcCB3aGVuIG51bWJlciBvZiBjb252ZXJzaW9ucyBpcyByZWFjaGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaW4gQ29udGludW91cyBtb2RlIChETUEgdHJhbnNmZXIgdW5saW1pdGVkLCB3aGF0ZXZlciBudW1iZXIgb2YgY29udmVyc2lvbnMpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogSW4gY29udGludW91cyBtb2RlLCBETUEgbXVzdCBiZSBjb25maWd1cmVkIGluIGNpcmN1bGFyIG1vZGUuIE90aGVyd2lzZSBhbiBvdmVycnVuIHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gRE1BIGJ1ZmZlciBtYXhpbXVtIHBvaW50ZXIgaXMgcmVhY2hlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIG1vZGlmaWVkIHdoZW4gbm8gY29udmVyc2lvbiBpcyBvbiBnb2luZyBvbiBib3RoIHJlZ3VsYXIgYW5kIGluamVjdGVkIGdyb3VwcyAoQURDIGRpc2FibGVkLCBvciBBREMgZW5hYmxlZCB3aXRob3V0IGNvbnRpbnVvdXMgbW9kZSBvciBleHRlcm5hbCB0cmlnZ2VyIHRoYXQgY291bGQgbGF1bmNoIGEgY29udmVyc2lvbikuICovCisgIHVpbnQzMl90IE92ZXJydW47ICAgICAgICAgICAgICAgLyohPCBTZWxlY3QgdGhlIGJlaGF2aW91ciBpbiBjYXNlIG9mIG92ZXJydW46IGRhdGEgb3ZlcndyaXR0ZW4gKGRlZmF1bHQpIG9yIHByZXNlcnZlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIGZvciByZWd1bGFyIGdyb3VwIG9ubHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ0V4X092ZXJydW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IENhc2Ugb2Ygb3ZlcnJ1biBzZXQgdG8gZGF0YSBwcmVzZXJ2ZWQgYW5kIHVzYWdlIHdpdGggZW5kIG9uIGNvbnZlcnNpb24gaW50ZXJydXB0aW9uIChIQUxfU3RhcnRfSVQoKSk6IEFEQyBJUlEgaGFuZGxlciBoYXMgdG8gY2xlYXIgZW5kIG9mIGNvbnZlcnNpb24gZmxhZ3MsIHRoaXMgaW5kdWNlcyB0aGUgcmVsZWFzZSBvZiB0aGUgcHJlc2VydmVkIGRhdGEuIElmIG5lZWRlZCwgdGhpcyBkYXRhIGNhbiBiZSBzYXZlZCBpbnRvIGZ1bmN0aW9uIEhBTF9BRENfQ29udkNwbHRDYWxsYmFjaygpIChjYWxsZWQgYmVmb3JlIGVuZCBvZiBjb252ZXJzaW9uIGZsYWdzIGNsZWFyKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEVycm9yIHJlcG9ydGluZyBpbiBmdW5jdGlvbiBvZiBjb252ZXJzaW9uIG1vZGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBVc2FnZSB3aXRoIEFEQyBjb252ZXJzaW9uIGJ5IHBvbGxpbmcgZm9yIGV2ZW50IG9yIGludGVycnVwdGlvbjogRXJyb3IgaXMgcmVwb3J0ZWQgb25seSBpZiBvdmVycnVuIGlzIHNldCB0byBkYXRhIHByZXNlcnZlZC4gSWYgb3ZlcnJ1biBpcyBzZXQgdG8gZGF0YSBvdmVyd3JpdHRlbiwgdXNlciBjYW4gd2lsbGluZ2x5IG5vdCByZWFkIHRoZSBjb252ZXJzaW9uIGRhdGEgZWFjaCB0aW1lLCB0aGlzIGlzIG5vdCBjb25zaWRlcmVkIGFzIGFuIGVycm9uZW91cyBjYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gVXNhZ2Ugd2l0aCBBREMgY29udmVyc2lvbiBieSBETUE6IEVycm9yIGlzIHJlcG9ydGVkIHdoYXRldmVyIG92ZXJydW4gc2V0dGluZyAoRE1BIGlzIGV4cGVjdGVkIHRvIHByb2Nlc3MgYWxsIGRhdGEgZnJvbSBkYXRhIHJlZ2lzdGVyLCBhbnkgZGF0YSBtaXNzZWQgd291bGQgYmUgYWJub3JtYWwpLiAqLworfUFEQ19Jbml0VHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiAgU3RydWN0dXJlIGRlZmluaXRpb24gb2YgQURDIGNoYW5uZWwgZm9yIHJlZ3VsYXIgZ3JvdXAgIAorICAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyB3aXRoIGZ1bmN0aW9uIEhBTF9BRENfQ29uZmlnQ2hhbm5lbCgpIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZS4KKyAgKiAgICAgICAgIEFEQyBzdGF0ZSBjYW4gYmUgZWl0aGVyOgorICAqICAgICAgICAgIC0gRm9yIGFsbCBwYXJhbWV0ZXJzOiBBREMgZGlzYWJsZWQgKHRoaXMgaXMgdGhlIG9ubHkgcG9zc2libGUgQURDIHN0YXRlIHRvIG1vZGlmeSBwYXJhbWV0ZXIgJ1NpbmdsZURpZmYnKQorICAqICAgICAgICAgIC0gRm9yIGFsbCBleGNlcHQgcGFyYW1ldGVycyAnU2FtcGxpbmdUaW1lJywgJ09mZnNldCcsICdPZmZzZXROdW1iZXInOiBBREMgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcgb24gcmVndWxhciBncm91cC4KKyAgKiAgICAgICAgICAtIEZvciBwYXJhbWV0ZXJzICdTYW1wbGluZ1RpbWUnLCAnT2Zmc2V0JywgJ09mZnNldE51bWJlcic6IEFEQyBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZyBvbiByZWd1bGFyIGFuZCBpbmplY3RlZCBncm91cHMuCisgICogICAgICAgICBJZiBBREMgaXMgbm90IGluIHRoZSBhcHByb3ByaWF0ZSBzdGF0ZSB0byBtb2RpZnkgc29tZSBwYXJhbWV0ZXJzLCB0aGVzZSBwYXJhbWV0ZXJzIHNldHRpbmcgaXMgYnlwYXNzZWQKKyAgKiAgICAgICAgIHdpdGhvdXQgZXJyb3IgcmVwb3J0aW5nIChhcyBpdCBjYW4gYmUgdGhlIGV4cGVjdGVkIGJlaGF2aW91ciBpbiBjYXNlIG9mIGludGVuZGVkIGFjdGlvbiB0byB1cGRhdGUgYW5vdGhlciBwYXJhbWV0ZXIgKHdoaWNoIGZ1bGZpbGxzIHRoZSBBREMgc3RhdGUgY29uZGl0aW9uKSBvbiB0aGUgZmx5KS4KKyAgKi8KK3R5cGVkZWYgc3RydWN0IAoreworICB1aW50MzJfdCBDaGFubmVsOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgY2hhbm5lbCB0byBjb25maWd1cmUgaW50byBBREMgcmVndWxhciBncm91cC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ0V4X2NoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogRGVwZW5kaW5nIG9uIGRldmljZXMsIHNvbWUgY2hhbm5lbHMgbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gcGFja2FnZSBwaW5zLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuICovCisgIHVpbnQzMl90IFJhbms7ICAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSByYW5rIGluIHRoZSByZWd1bGFyIGdyb3VwIHNlcXVlbmNlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ0V4X3JlZ3VsYXJfcmFuaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEluIGNhc2Ugb2YgbmVlZCB0byBkaXNhYmxlIGEgY2hhbm5lbCBvciBjaGFuZ2Ugb3JkZXIgb2YgY29udmVyc2lvbiBzZXF1ZW5jZXIsIHJhbmsgY29udGFpbmluZyBhIHByZXZpb3VzIGNoYW5uZWwgc2V0dGluZyBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIG5ldyBjaGFubmVsIHNldHRpbmcgKG9yIHBhcmFtZXRlciBudW1iZXIgb2YgY29udmVyc2lvbnMgY2FuIGJlIGFkanVzdGVkKSAqLworICB1aW50MzJfdCBTYW1wbGluZ1RpbWU7ICAgICAgICAgICAvKiE8IFNhbXBsaW5nIHRpbWUgdmFsdWUgdG8gYmUgc2V0IGZvciB0aGUgc2VsZWN0ZWQgY2hhbm5lbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbml0OiBBREMgY2xvY2sgY3ljbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVyc2lvbiB0aW1lIGlzIHRoZSBhZGRpdGlvbiBvZiBzYW1wbGluZyB0aW1lIGFuZCBwcm9jZXNzaW5nIHRpbWUgKDEyLjUgQURDIGNsb2NrIGN5Y2xlcyBhdCBBREMgcmVzb2x1dGlvbiAxMiBiaXRzLCAxMC41IGN5Y2xlcyBhdCAxMCBiaXRzLCA4LjUgY3ljbGVzIGF0IDggYml0cywgNi41IGN5Y2xlcyBhdCA2IGJpdHMpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDRXhfc2FtcGxpbmdfdGltZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXV0aW9uOiBUaGlzIHBhcmFtZXRlciB1cGRhdGVzIHRoZSBwYXJhbWV0ZXIgcHJvcGVydHkgb2YgdGhlIGNoYW5uZWwsIHRoYXQgY2FuIGJlIHVzZWQgaW50byByZWd1bGFyIGFuZC9vciBpbmplY3RlZCBncm91cHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhpcyBzYW1lIGNoYW5uZWwgaGFzIGJlZW4gcHJldmlvdXNseSBjb25maWd1cmVkIGluIHRoZSBvdGhlciBncm91cCAocmVndWxhci9pbmplY3RlZCksIGl0IHdpbGwgYmUgdXBkYXRlZCB0byBsYXN0IHNldHRpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogSW4gY2FzZSBvZiB1c2FnZSBvZiBpbnRlcm5hbCBtZWFzdXJlbWVudCBjaGFubmVscyAoVnJlZkludC9WYmF0L1RlbXBTZW5zb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nIHRpbWUgY29uc3RyYWludHMgbXVzdCBiZSByZXNwZWN0ZWQgKHNhbXBsaW5nIHRpbWUgY2FuIGJlIGFkanVzdGVkIGluIGZ1bmN0aW9uIG9mIEFEQyBjbG9jayBmcmVxdWVuY3kgYW5kIHNhbXBsaW5nIHRpbWUgc2V0dGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciB0aW1pbmdzIHZhbHVlcywgcGFyYW1ldGVycyBUU192cmVmaW50LCBUU192YmF0LCBUU190ZW1wICh2YWx1ZXMgcm91Z2ggb3JkZXI6IDIuMnVzIG1pbikuICovCisgIHVpbnQzMl90IFNpbmdsZURpZmY7ICAgICAgICAgICAgIC8qITwgU2VsZWN0aW9uIG9mIHNpbmdsZS1lbmRlZCBvciBkaWZmZXJlbnRpYWwgaW5wdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gZGlmZmVyZW50aWFsIG1vZGU6IERpZmZlcmVudGlhbCBtZWFzdXJlbWVudCBpcyBiZXR3ZWVuIHRoZSBzZWxlY3RlZCBjaGFubmVsICdpJyAocG9zaXRpdmUgaW5wdXQpIGFuZCBjaGFubmVsICdpKzEnIChuZWdhdGl2ZSBpbnB1dCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgY2hhbm5lbCAnaScgaGFzIHRvIGJlIGNvbmZpZ3VyZWQsIGNoYW5uZWwgJ2krMScgaXMgY29uZmlndXJlZCBhdXRvbWF0aWNhbGx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ0V4X1NpbmdsZURpZmZlcmVudGlhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdXRpb246IFRoaXMgcGFyYW1ldGVyIHVwZGF0ZXMgdGhlIHBhcmFtZXRlciBwcm9wZXJ0eSBvZiB0aGUgY2hhbm5lbCwgdGhhdCBjYW4gYmUgdXNlZCBpbnRvIHJlZ3VsYXIgYW5kL29yIGluamVjdGVkIGdyb3Vwcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIHNhbWUgY2hhbm5lbCBoYXMgYmVlbiBwcmV2aW91c2x5IGNvbmZpZ3VyZWQgaW4gdGhlIG90aGVyIGdyb3VwIChyZWd1bGFyL2luamVjdGVkKSwgaXQgd2lsbCBiZSB1cGRhdGVkIHRvIGxhc3Qgc2V0dGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBDaGFubmVscyAxIHRvIDE0IGFyZSBhdmFpbGFibGUgaW4gZGlmZmVyZW50aWFsIG1vZGUuIENoYW5uZWxzIDE1VSwgMTZVLCAxN1UsIDE4IGNhbiBiZSB1c2VkIG9ubHkgaW4gc2luZ2xlLWVuZGVkIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogV2hlbiBjb25maWd1cmluZyBhIGNoYW5uZWwgJ2knIGluIGRpZmZlcmVudGlhbCBtb2RlLCB0aGUgY2hhbm5lbCAnaSsxJyBpcyBub3QgdXNhYmxlIHNlcGFyYXRlbHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBtb2RpZmllZCB3aGVuIEFEQyBpcyBkaXNhYmxlZCAoYmVmb3JlIEFEQyBzdGFydCBjb252ZXJzaW9uIG9yIGFmdGVyIEFEQyBzdG9wIGNvbnZlcnNpb24pLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIEFEQyBpcyBlbmFibGVkLCB0aGlzIHBhcmFtZXRlciBzZXR0aW5nIGlzIGJ5cGFzc2VkIHdpdGhvdXQgZXJyb3IgcmVwb3J0aW5nIChhcyBpdCBjYW4gYmUgdGhlIGV4cGVjdGVkIGJlaGF2aW91ciBpbiBjYXNlIG9mIGFub3RoZXIgcGFyYW1ldGVyIHVwZGF0ZSBvbiB0aGUgZmx5KSAqLworICB1aW50MzJfdCBPZmZzZXROdW1iZXI7ICAgICAgICAgICAvKiE8IFNlbGVjdHMgdGhlIG9mZnNldCBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ0V4X09mZnNldE51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdXRpb246IE9ubHkgb25lIGNoYW5uZWwgaXMgYWxsb3dlZCBwZXIgY2hhbm5lbC4gSWYgYW5vdGhlciBjaGFubmVsIHdhcyBvbiB0aGlzIG9mZnNldCBudW1iZXIsIHRoZSBvZmZzZXQgd2lsbCBiZSBjaGFuZ2VkIHRvIHRoZSBuZXcgY2hhbm5lbCAqLworICB1aW50MzJfdCBPZmZzZXQ7ICAgICAgICAgICAgICAgICAvKiE8IERlZmluZXMgdGhlIG9mZnNldCB0byBiZSBzdWJ0cmFjdGVkIGZyb20gdGhlIHJhdyBjb252ZXJ0ZWQgZGF0YSB3aGVuIGNvbnZlcnQgY2hhbm5lbHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0IHZhbHVlIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwZW5kaW5nIG9mIEFEQyByZXNvbHV0aW9uIHNlbGVjdGVkICgxMlUsIDEwVSwgOCBvciA2IGJpdHMpLCB0aGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwMCBhbmQgTWF4X0RhdGEgPSAweEZGRlUsIDB4M0ZGVSwgMHhGRiBvciAweDNGIHJlc3BlY3RpdmVseS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIG1vZGlmaWVkIHdoZW4gbm8gY29udmVyc2lvbiBpcyBvbiBnb2luZyBvbiBib3RoIHJlZ3VsYXIgYW5kIGluamVjdGVkIGdyb3VwcyAoQURDIGRpc2FibGVkLCBvciBBREMgZW5hYmxlZCB3aXRob3V0IGNvbnRpbnVvdXMgbW9kZSBvciBleHRlcm5hbCB0cmlnZ2VyIHRoYXQgY291bGQgbGF1bmNoIGEgY29udmVyc2lvbikuICovCit9QURDX0NoYW5uZWxDb25mVHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiAgU3RydWN0dXJlIGRlZmluaXRpb24gb2YgQURDIGluamVjdGVkIGdyb3VwIGFuZCBBREMgY2hhbm5lbCBmb3IgaW5qZWN0ZWQgZ3JvdXAgIAorICAqIEBub3RlICAgUGFyYW1ldGVycyBvZiB0aGlzIHN0cnVjdHVyZSBhcmUgc2hhcmVkIHdpdGhpbiAyIHNjb3BlczoKKyAgKiAgICAgICAgICAtIFNjb3BlIGNoYW5uZWw6IEluamVjdGVkQ2hhbm5lbCwgSW5qZWN0ZWRSYW5rLCBJbmplY3RlZFNhbXBsaW5nVGltZSAsIEluamVjdGVkU2luZ2xlRGlmZiwgSW5qZWN0ZWRPZmZzZXROdW1iZXIsIEluamVjdGVkT2Zmc2V0CisgICogICAgICAgICAgLSBTY29wZSBpbmplY3RlZCBncm91cCAoYWZmZWN0cyBhbGwgY2hhbm5lbHMgb2YgaW5qZWN0ZWQgZ3JvdXApOiBJbmplY3RlZE5ick9mQ29udmVyc2lvbiwgSW5qZWN0ZWREaXNjb250aW51b3VzQ29udk1vZGUsCisgICogICAgICAgICAgICBBdXRvSW5qZWN0ZWRDb252LCBRdWV1ZUluamVjdGVkQ29udGV4dCwgRXh0ZXJuYWxUcmlnSW5qZWNDb252RWRnZSwgRXh0ZXJuYWxUcmlnSW5qZWNDb252LgorICAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyB3aXRoIGZ1bmN0aW9uIEhBTF9BRENFeF9JbmplY3RlZENvbmZpZ0NoYW5uZWwoKSBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGUuCisgICogICAgICAgICBBREMgc3RhdGUgY2FuIGJlIGVpdGhlcjoKKyAgKiAgICAgICAgICAtIEZvciBhbGwgcGFyYW1ldGVyczogQURDIGRpc2FibGVkICh0aGlzIGlzIHRoZSBvbmx5IHBvc3NpYmxlIEFEQyBzdGF0ZSB0byBtb2RpZnkgcGFyYW1ldGVyICdJbmplY3RlZFNpbmdsZURpZmYnKQorICAqICAgICAgICAgIC0gRm9yIHBhcmFtZXRlcnMgJ0luamVjdGVkRGlzY29udGludW91c0NvbnZNb2RlJywgJ1F1ZXVlSW5qZWN0ZWRDb250ZXh0JzogQURDIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIGluamVjdGVkIGdyb3VwLgorICAqICAgICAgICAgIC0gRm9yIHBhcmFtZXRlcnMgJ0luamVjdGVkU2FtcGxpbmdUaW1lJywgJ0luamVjdGVkT2Zmc2V0JywgJ0luamVjdGVkT2Zmc2V0TnVtYmVyJywgJ0F1dG9JbmplY3RlZENvbnYnOiBBREMgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcgb24gcmVndWxhciBhbmQgaW5qZWN0ZWQgZ3JvdXBzLgorICAqICAgICAgICAgIC0gRm9yIHBhcmFtZXRlcnMgJ0luamVjdGVkQ2hhbm5lbCcsICdJbmplY3RlZFJhbmsnLCAnSW5qZWN0ZWROYnJPZkNvbnZlcnNpb24nLCAnRXh0ZXJuYWxUcmlnSW5qZWNDb252JywgJ0V4dGVybmFsVHJpZ0luamVjQ29udkVkZ2UnOiBBREMgZW5hYmxlZCBhbmQgd2hpbGUgY29udmVyc2lvbiBvbiBnb2luZyBvbiByZWd1bGFyIGFuZCBpbmplY3RlZCBncm91cHMuCisgICogICAgICAgICBJZiBBREMgaXMgbm90IGluIHRoZSBhcHByb3ByaWF0ZSBzdGF0ZSB0byBtb2RpZnkgc29tZSBwYXJhbWV0ZXJzLCB0aGVzZSBwYXJhbWV0ZXJzIHNldHRpbmcgaXMgYnlwYXNzZWQKKyAgKiAgICAgICAgIHdpdGhvdXQgZXJyb3IgcmVwb3J0aW5nIChhcyBpdCBjYW4gYmUgdGhlIGV4cGVjdGVkIGJlaGF2aW91ciBpbiBjYXNlIG9mIGludGVuZGVkIGFjdGlvbiB0byB1cGRhdGUgYW5vdGhlciBwYXJhbWV0ZXIgKHdoaWNoIGZ1bGZpbGxzIHRoZSBBREMgc3RhdGUgY29uZGl0aW9uKSBvbiB0aGUgZmx5KS4KKyAgKi8KK3R5cGVkZWYgc3RydWN0IAoreworICB1aW50MzJfdCBJbmplY3RlZENoYW5uZWw7ICAgICAgICAgICAgICAgLyohPCBDb25maWd1cmUgdGhlIEFEQyBpbmplY3RlZCBjaGFubmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDRXhfY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogRGVwZW5kaW5nIG9uIGRldmljZXMsIHNvbWUgY2hhbm5lbHMgbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gcGFja2FnZSBwaW5zLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuICovCisgIHVpbnQzMl90IEluamVjdGVkUmFuazsgICAgICAgICAgICAgICAgICAvKiE8IFRoZSByYW5rIGluIHRoZSByZWd1bGFyIGdyb3VwIHNlcXVlbmNlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgb2YgQHJlZiBBRENFeF9pbmplY3RlZF9yYW5rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEluIGNhc2Ugb2YgbmVlZCB0byBkaXNhYmxlIGEgY2hhbm5lbCBvciBjaGFuZ2Ugb3JkZXIgb2YgY29udmVyc2lvbiBzZXF1ZW5jZXIsIHJhbmsgY29udGFpbmluZyBhIHByZXZpb3VzIGNoYW5uZWwgc2V0dGluZyBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIG5ldyBjaGFubmVsIHNldHRpbmcgKG9yIHBhcmFtZXRlciBudW1iZXIgb2YgY29udmVyc2lvbnMgY2FuIGJlIGFkanVzdGVkKSAqLworICB1aW50MzJfdCBJbmplY3RlZFNhbXBsaW5nVGltZTsgICAgICAgICAgLyohPCBTYW1wbGluZyB0aW1lIHZhbHVlIHRvIGJlIHNldCBmb3IgdGhlIHNlbGVjdGVkIGNoYW5uZWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaXQ6IEFEQyBjbG9jayBjeWNsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVyc2lvbiB0aW1lIGlzIHRoZSBhZGRpdGlvbiBvZiBzYW1wbGluZyB0aW1lIGFuZCBwcm9jZXNzaW5nIHRpbWUgKDEyLjUgQURDIGNsb2NrIGN5Y2xlcyBhdCBBREMgcmVzb2x1dGlvbiAxMiBiaXRzLCAxMC41IGN5Y2xlcyBhdCAxMCBiaXRzLCA4LjUgY3ljbGVzIGF0IDggYml0cywgNi41IGN5Y2xlcyBhdCA2IGJpdHMpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ0V4X3NhbXBsaW5nX3RpbWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdXRpb246IFRoaXMgcGFyYW1ldGVyIHVwZGF0ZXMgdGhlIHBhcmFtZXRlciBwcm9wZXJ0eSBvZiB0aGUgY2hhbm5lbCwgdGhhdCBjYW4gYmUgdXNlZCBpbnRvIHJlZ3VsYXIgYW5kL29yIGluamVjdGVkIGdyb3Vwcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhpcyBzYW1lIGNoYW5uZWwgaGFzIGJlZW4gcHJldmlvdXNseSBjb25maWd1cmVkIGluIHRoZSBvdGhlciBncm91cCAocmVndWxhci9pbmplY3RlZCksIGl0IHdpbGwgYmUgdXBkYXRlZCB0byBsYXN0IHNldHRpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEluIGNhc2Ugb2YgdXNhZ2Ugb2YgaW50ZXJuYWwgbWVhc3VyZW1lbnQgY2hhbm5lbHMgKFZyZWZJbnQvVmJhdC9UZW1wU2Vuc29yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmcgdGltZSBjb25zdHJhaW50cyBtdXN0IGJlIHJlc3BlY3RlZCAoc2FtcGxpbmcgdGltZSBjYW4gYmUgYWRqdXN0ZWQgaW4gZnVuY3Rpb24gb2YgQURDIGNsb2NrIGZyZXF1ZW5jeSBhbmQgc2FtcGxpbmcgdGltZSBzZXR0aW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciB0aW1pbmdzIHZhbHVlcywgcGFyYW1ldGVycyBUU192cmVmaW50LCBUU192YmF0LCBUU190ZW1wICh2YWx1ZXMgcm91Z2ggb3JkZXI6IDIuMnVzIG1pbikuICovCisgIHVpbnQzMl90IEluamVjdGVkU2luZ2xlRGlmZjsgICAgICAgICAgICAvKiE8IFNlbGVjdGlvbiBvZiBzaW5nbGUtZW5kZWQgb3IgZGlmZmVyZW50aWFsIGlucHV0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiBkaWZmZXJlbnRpYWwgbW9kZTogRGlmZmVyZW50aWFsIG1lYXN1cmVtZW50IGlzIGJldHdlZW4gdGhlIHNlbGVjdGVkIGNoYW5uZWwgJ2knIChwb3NpdGl2ZSBpbnB1dCkgYW5kIGNoYW5uZWwgJ2krMScgKG5lZ2F0aXZlIGlucHV0KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25seSBjaGFubmVsICdpJyBoYXMgdG8gYmUgY29uZmlndXJlZCwgY2hhbm5lbCAnaSsxJyBpcyBjb25maWd1cmVkIGF1dG9tYXRpY2FsbHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ0V4X1NpbmdsZURpZmZlcmVudGlhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXV0aW9uOiBUaGlzIHBhcmFtZXRlciB1cGRhdGVzIHRoZSBwYXJhbWV0ZXIgcHJvcGVydHkgb2YgdGhlIGNoYW5uZWwsIHRoYXQgY2FuIGJlIHVzZWQgaW50byByZWd1bGFyIGFuZC9vciBpbmplY3RlZCBncm91cHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoaXMgc2FtZSBjaGFubmVsIGhhcyBiZWVuIHByZXZpb3VzbHkgY29uZmlndXJlZCBpbiB0aGUgb3RoZXIgZ3JvdXAgKHJlZ3VsYXIvaW5qZWN0ZWQpLCBpdCB3aWxsIGJlIHVwZGF0ZWQgdG8gbGFzdCBzZXR0aW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBDaGFubmVscyAxIHRvIDE0IGFyZSBhdmFpbGFibGUgaW4gZGlmZmVyZW50aWFsIG1vZGUuIENoYW5uZWxzIDE1VSwgMTZVLCAxN1UsIDE4IGNhbiBiZSB1c2VkIG9ubHkgaW4gc2luZ2xlLWVuZGVkIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFdoZW4gY29uZmlndXJpbmcgYSBjaGFubmVsICdpJyBpbiBkaWZmZXJlbnRpYWwgbW9kZSwgdGhlIGNoYW5uZWwgJ2ktMScgaXMgbm90IHVzYWJsZSBzZXBhcmF0ZWx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIG1vZGlmaWVkIHdoZW4gQURDIGlzIGRpc2FibGVkIChiZWZvcmUgQURDIHN0YXJ0IGNvbnZlcnNpb24gb3IgYWZ0ZXIgQURDIHN0b3AgY29udmVyc2lvbikuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIEFEQyBpcyBlbmFibGVkLCB0aGlzIHBhcmFtZXRlciBzZXR0aW5nIGlzIGJ5cGFzc2VkIHdpdGhvdXQgZXJyb3IgcmVwb3J0aW5nIChhcyBpdCBjYW4gYmUgdGhlIGV4cGVjdGVkIGJlaGF2aW91ciBpbiBjYXNlIG9mIGFub3RoZXIgcGFyYW1ldGVyIHVwZGF0ZSBvbiB0aGUgZmx5KSAqLworICB1aW50MzJfdCBJbmplY3RlZE9mZnNldE51bWJlcjsgICAgICAgICAgLyohPCBTZWxlY3RzIHRoZSBvZmZzZXQgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDRXhfT2Zmc2V0TnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdXRpb246IE9ubHkgb25lIGNoYW5uZWwgaXMgYWxsb3dlZCBwZXIgb2Zmc2V0IG51bWJlci4gSWYgYW5vdGhlciBjaGFubmVsIHdhcyBvbiB0aGlzIG9mZnNldCBudW1iZXIsIHRoZSBvZmZzZXQgd2lsbCBiZSBjaGFuZ2VkIHRvIHRoZSBuZXcgY2hhbm5lbC4gKi8KKyAgdWludDMyX3QgSW5qZWN0ZWRPZmZzZXQ7ICAgICAgICAgICAgICAgIC8qITwgRGVmaW5lcyB0aGUgb2Zmc2V0IHRvIGJlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgcmF3IGNvbnZlcnRlZCBkYXRhLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXQgdmFsdWUgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwZW5kaW5nIG9mIEFEQyByZXNvbHV0aW9uIHNlbGVjdGVkICgxMlUsIDEwVSwgOCBvciA2IGJpdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwMCBhbmQgTWF4X0RhdGEgPSAweEZGRlUsIDB4M0ZGVSwgMHhGRiBvciAweDNGIHJlc3BlY3RpdmVseS4gKi8KKyAgdWludDMyX3QgSW5qZWN0ZWROYnJPZkNvbnZlcnNpb247ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgcmFua3MgdGhhdCB3aWxsIGJlIGNvbnZlcnRlZCB3aXRoaW4gdGhlIGluamVjdGVkIGdyb3VwIHNlcXVlbmNlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG8gdXNlIHRoZSBpbmplY3RlZCBncm91cCBzZXF1ZW5jZXIgYW5kIGNvbnZlcnQgc2V2ZXJhbCByYW5rcywgcGFyYW1ldGVyICdTY2FuQ29udk1vZGUnIG11c3QgYmUgZW5hYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMSBhbmQgTWF4X0RhdGEgPSA0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXV0aW9uOiB0aGlzIHNldHRpbmcgaW1wYWN0cyB0aGUgZW50aXJlIGluamVjdGVkIGdyb3VwLiBUaGVyZWZvcmUsIGNhbGwgb2YgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIHRvIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmUgYSBjaGFubmVsIG9uIGluamVjdGVkIGdyb3VwIGNhbiBpbXBhY3QgdGhlIGNvbmZpZ3VyYXRpb24gb2Ygb3RoZXIgY2hhbm5lbHMgcHJldmlvdXNseSBzZXQuICovCisgIHVpbnQzMl90IEluamVjdGVkRGlzY29udGludW91c0NvbnZNb2RlOyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBjb252ZXJzaW9ucyBzZXF1ZW5jZSBvZiBpbmplY3RlZCBncm91cCBpcyBwZXJmb3JtZWQgaW4gQ29tcGxldGUtc2VxdWVuY2UvRGlzY29udGludW91cy1zZXF1ZW5jZSAobWFpbiBzZXF1ZW5jZSBzdWJkaXZpZGVkIGluIHN1Y2Nlc3NpdmUgcGFydHMpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNjb250aW51b3VzIG1vZGUgaXMgdXNlZCBvbmx5IGlmIHNlcXVlbmNlciBpcyBlbmFibGVkIChwYXJhbWV0ZXIgJ1NjYW5Db252TW9kZScpLiBJZiBzZXF1ZW5jZXIgaXMgZGlzYWJsZWQsIHRoaXMgcGFyYW1ldGVyIGlzIGRpc2NhcmRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzY29udGludW91cyBtb2RlIGNhbiBiZSBlbmFibGVkIG9ubHkgaWYgY29udGludW91cyBtb2RlIGlzIGRpc2FibGVkLiBJZiBjb250aW51b3VzIG1vZGUgaXMgZW5hYmxlZCwgdGhpcyBwYXJhbWV0ZXIgc2V0dGluZyBpcyBkaXNjYXJkZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgbW9kaWZpZWQgd2hlbiBBREMgaXMgZGlzYWJsZWQgKGJlZm9yZSBBREMgc3RhcnQgY29udmVyc2lvbiBvciBhZnRlciBBREMgc3RvcCBjb252ZXJzaW9uKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogRm9yIGluamVjdGVkIGdyb3VwLCBudW1iZXIgb2YgZGlzY29udGludW91cyByYW5rcyBpbmNyZW1lbnQgaXMgZml4ZWQgdG8gb25lLWJ5LW9uZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F1dGlvbjogdGhpcyBzZXR0aW5nIGltcGFjdHMgdGhlIGVudGlyZSBpbmplY3RlZCBncm91cC4gVGhlcmVmb3JlLCBjYWxsIG9mIEhBTF9BRENFeF9JbmplY3RlZENvbmZpZ0NoYW5uZWwoKSB0byAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlIGEgY2hhbm5lbCBvbiBpbmplY3RlZCBncm91cCBjYW4gaW1wYWN0IHRoZSBjb25maWd1cmF0aW9uIG9mIG90aGVyIGNoYW5uZWxzIHByZXZpb3VzbHkgc2V0LiAqLworICB1aW50MzJfdCBBdXRvSW5qZWN0ZWRDb252OyAgICAgICAgICAgICAgLyohPCBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzZWxlY3RlZCBBREMgYXV0b21hdGljIGluamVjdGVkIGdyb3VwIGNvbnZlcnNpb24gYWZ0ZXIgcmVndWxhciBvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRS4gICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogVG8gdXNlIEF1dG9tYXRpYyBpbmplY3RlZCBjb252ZXJzaW9uLCBkaXNjb250aW51b3VzIG1vZGUgbXVzdCBiZSBkaXNhYmxlZCAoJ0Rpc2NvbnRpbnVvdXNDb252TW9kZScgYW5kICdJbmplY3RlZERpc2NvbnRpbnVvdXNDb252TW9kZScgc2V0IHRvIERJU0FCTEUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFRvIHVzZSBBdXRvbWF0aWMgaW5qZWN0ZWQgY29udmVyc2lvbiwgaW5qZWN0ZWQgZ3JvdXAgZXh0ZXJuYWwgdHJpZ2dlcnMgbXVzdCBiZSBkaXNhYmxlZCAoJ0V4dGVybmFsVHJpZ0luamVjQ29udicgc2V0IHRvIEFEQ19TT0ZUV0FSRV9TVEFSVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogSW4gY2FzZSBvZiBETUEgdXNlZCB3aXRoIHJlZ3VsYXIgZ3JvdXA6IGlmIERNQSBjb25maWd1cmVkIGluIG5vcm1hbCBtb2RlIChzaW5nbGUgc2hvdCkgSkFVVE8gd2lsbCBiZSBzdG9wcGVkIHVwb24gRE1BIHRyYW5zZmVyIGNvbXBsZXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUbyBtYWludGFpbiBKQVVUTyBhbHdheXMgZW5hYmxlZCwgRE1BIG11c3QgYmUgY29uZmlndXJlZCBpbiBjaXJjdWxhciBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXV0aW9uOiB0aGlzIHNldHRpbmcgaW1wYWN0cyB0aGUgZW50aXJlIGluamVjdGVkIGdyb3VwLiBUaGVyZWZvcmUsIGNhbGwgb2YgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIHRvIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmUgYSBjaGFubmVsIG9uIGluamVjdGVkIGdyb3VwIGNhbiBpbXBhY3QgdGhlIGNvbmZpZ3VyYXRpb24gb2Ygb3RoZXIgY2hhbm5lbHMgcHJldmlvdXNseSBzZXQuICovCisgIHVpbnQzMl90IFF1ZXVlSW5qZWN0ZWRDb250ZXh0OyAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBjb250ZXh0IHF1ZXVlIGZlYXR1cmUgaXMgZW5hYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgY29udGV4dCBxdWV1ZSBpcyBlbmFibGVkLCBpbmplY3RlZCBzZXF1ZW5jZXImY2hhbm5lbHMgY29uZmlndXJhdGlvbnMgYXJlIHF1ZXVlZCBvbiB1cCB0byAyIGNvbnRleHRzLiBJZiBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBpbmplY3RlZCBjb250ZXh0IGlzIHNldCB3aGVuIHF1ZXVlIGlzIGZ1bGwsIGVycm9yIGlzIHRyaWdnZXJlZCBieSBpbnRlcnJ1cHRpb24gYW5kIHRocm91Z2ggZnVuY3Rpb24gJ0hBTF9BRENFeF9JbmplY3RlZFF1ZXVlT3ZlcmZsb3dDYWxsYmFjaycuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdXRpb246IFRoaXMgZmVhdHVyZSByZXF1ZXN0IHRoYXQgdGhlIHNlcXVlbmNlIGlzIGZ1bGx5IGNvbmZpZ3VyZWQgYmVmb3JlIGluamVjdGVkIGNvbnZlcnNpb24gc3RhcnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZXJlZm9yZSwgY29uZmlndXJlIGNoYW5uZWxzIHdpdGggSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIGFzIG1hbnkgdGltZXMgYXMgdmFsdWUgb2YgJ0luamVjdGVkTmJyT2ZDb252ZXJzaW9uJyBwYXJhbWV0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdXRpb246IHRoaXMgc2V0dGluZyBpbXBhY3RzIHRoZSBlbnRpcmUgaW5qZWN0ZWQgZ3JvdXAuIFRoZXJlZm9yZSwgY2FsbCBvZiBIQUxfQURDRXhfSW5qZWN0ZWRDb25maWdDaGFubmVsKCkgdG8gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZSBhIGNoYW5uZWwgb24gaW5qZWN0ZWQgZ3JvdXAgY2FuIGltcGFjdCB0aGUgY29uZmlndXJhdGlvbiBvZiBvdGhlciBjaGFubmVscyBwcmV2aW91c2x5IHNldC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBtb2RpZmllZCB3aGVuIEFEQyBpcyBkaXNhYmxlZCAoYmVmb3JlIEFEQyBzdGFydCBjb252ZXJzaW9uIG9yIGFmdGVyIEFEQyBzdG9wIGNvbnZlcnNpb24pLiAqLworICB1aW50MzJfdCBFeHRlcm5hbFRyaWdJbmplY0NvbnY7ICAgICAgICAgLyohPCBTZWxlY3RzIHRoZSBleHRlcm5hbCBldmVudCB1c2VkIHRvIHRyaWdnZXIgdGhlIGNvbnZlcnNpb24gc3RhcnQgb2YgaW5qZWN0ZWQgZ3JvdXAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHNldCB0byBBRENfSU5KRUNURURfU09GVFdBUkVfU1RBUlQsIGV4dGVybmFsIHRyaWdnZXJzIGFyZSBkaXNhYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENFeF9FeHRlcm5hbF90cmlnZ2VyX3NvdXJjZV9JbmplY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXV0aW9uOiB0aGlzIHNldHRpbmcgaW1wYWN0cyB0aGUgZW50aXJlIGluamVjdGVkIGdyb3VwLiBUaGVyZWZvcmUsIGNhbGwgb2YgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIHRvIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmUgYSBjaGFubmVsIG9uIGluamVjdGVkIGdyb3VwIGNhbiBpbXBhY3QgdGhlIGNvbmZpZ3VyYXRpb24gb2Ygb3RoZXIgY2hhbm5lbHMgcHJldmlvdXNseSBzZXQuICovCisgIHVpbnQzMl90IEV4dGVybmFsVHJpZ0luamVjQ29udkVkZ2U7ICAgICAvKiE8IFNlbGVjdHMgdGhlIGV4dGVybmFsIHRyaWdnZXIgZWRnZSBvZiBpbmplY3RlZCBncm91cC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENFeF9FeHRlcm5hbF90cmlnZ2VyX2VkZ2VfSW5qZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRyaWdnZXIgaXMgc2V0IHRvIEFEQ19JTkpFQ1RFRF9TT0ZUV0FSRV9TVEFSVCwgdGhpcyBwYXJhbWV0ZXIgaXMgZGlzY2FyZGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXV0aW9uOiB0aGlzIHNldHRpbmcgaW1wYWN0cyB0aGUgZW50aXJlIGluamVjdGVkIGdyb3VwLiBUaGVyZWZvcmUsIGNhbGwgb2YgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIHRvIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmUgYSBjaGFubmVsIG9uIGluamVjdGVkIGdyb3VwIGNhbiBpbXBhY3QgdGhlIGNvbmZpZ3VyYXRpb24gb2Ygb3RoZXIgY2hhbm5lbHMgcHJldmlvdXNseSBzZXQuICovCit9QURDX0luamVjdGlvbkNvbmZUeXBlRGVmOworCisvKiogCisgICogQGJyaWVmICBBREMgSW5qZWN0aW9uIENvbmZpZ3VyYXRpb24gCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBDb250ZXh0UXVldWU7ICAgICAgICAgICAgICAgICAvKiE8IEluamVjdGVkIGNoYW5uZWwgY29uZmlndXJhdGlvbiBjb250ZXh0OiBidWlsZC11cCBvdmVyIGVhY2ggCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIGNhbGwgdG8gZmluYWxseSBpbml0aWFsaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNRUiByZWdpc3RlciBhdCBIQUxfQURDRXhfSW5qZWN0ZWRDb25maWdDaGFubmVsKCkgbGFzdCBjYWxsICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB1aW50MzJfdCBDaGFubmVsQ291bnQ7ICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgaW5qZWN0ZWQgc2VxdWVuY2UgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit9QURDX0luamVjdGlvbkNvbmZpZ1R5cGVEZWY7CisKKy8qKiAKKyAgKiBAYnJpZWYgIFN0cnVjdHVyZSBkZWZpbml0aW9uIG9mIEFEQyBhbmFsb2cgd2F0Y2hkb2cKKyAgKiBAbm90ZSAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgd2l0aCBmdW5jdGlvbiBIQUxfQURDX0FuYWxvZ1dER0NvbmZpZygpIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZS4KKyAgKiAgICAgICAgIEFEQyBzdGF0ZSBjYW4gYmUgZWl0aGVyOiBBREMgZGlzYWJsZWQgb3IgQURDIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIHJlZ3VsYXIgYW5kIGluamVjdGVkIGdyb3Vwcy4KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFdhdGNoZG9nTnVtYmVyOyAgICAvKiE8IFNlbGVjdHMgd2hpY2ggQURDIGFuYWxvZyB3YXRjaGRvZyB0byBhcHBseSB0byB0aGUgc2VsZWN0ZWQgY2hhbm5lbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIEFuYWxvZyBXYXRjaGRvZyAxOiBPbmx5IDEgY2hhbm5lbCBjYW4gYmUgbW9uaXRvcmVkIChvciBvdmVyYWxsIGdyb3VwIG9mIGNoYW5uZWxzIGJ5IHNldHRpbmcgcGFyYW1ldGVyICdXYXRjaGRvZ01vZGUnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgQW5hbG9nIFdhdGNoZG9nIDIgYW5kIDM6IFNldmVyYWwgY2hhbm5lbHMgY2FuIGJlIG1vbml0b3JlZCAoYnkgc3VjY2Vzc2l2ZSBjYWxscyBvZiAnSEFMX0FEQ19BbmFsb2dXREdDb25maWcoKScgZm9yIGVhY2ggY2hhbm5lbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENFeF9hbmFsb2dfd2F0Y2hkb2dfbnVtYmVyLiAqLworICB1aW50MzJfdCBXYXRjaGRvZ01vZGU7ICAgICAgLyohPCBGb3IgQW5hbG9nIFdhdGNoZG9nIDE6IENvbmZpZ3VyZXMgdGhlIEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9kZTogc2luZ2xlIGNoYW5uZWwvb3ZlcmFsbCBncm91cCBvZiBjaGFubmVscywgcmVndWxhci9pbmplY3RlZCBncm91cC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIEFuYWxvZyBXYXRjaGRvZyAyIGFuZCAzOiBUaGVyZSBpcyBubyBjb25maWd1cmF0aW9uIGZvciBvdmVyYWxsIGdyb3VwIG9mIGNoYW5uZWxzIGFzIEFXRDEuIFNldCB2YWx1ZSAnQURDX0FOQUxPR1dBVENIRE9HX05PTkUnIHRvIHJlc2V0IGNoYW5uZWxzIGdyb3VwIHByb2dyYW1tZWQgd2l0aCBwYXJhbWV0ZXIgJ0NoYW5uZWwnLCBzZXQgYW55IG90aGVyIHZhbHVlIHRvIG5vdCB1c2UgdGhpcyBwYXJhbWV0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDRXhfYW5hbG9nX3dhdGNoZG9nX21vZGUuICovCisgIHVpbnQzMl90IENoYW5uZWw7ICAgICAgICAgICAvKiE8IFNlbGVjdHMgd2hpY2ggQURDIGNoYW5uZWwgdG8gbW9uaXRvciBieSBhbmFsb2cgd2F0Y2hkb2cuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBBbmFsb2cgV2F0Y2hkb2cgMTogdGhpcyBwYXJhbWV0ZXIgaGFzIGFuIGVmZmVjdCBvbmx5IGlmIHBhcmFtZXRlciAnV2F0Y2hkb2dNb2RlJyBpcyBjb25maWd1cmVkIG9uIHNpbmdsZSBjaGFubmVsLiBPbmx5IDEgY2hhbm5lbCBjYW4gYmUgbW9uaXRvcmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgQW5hbG9nIFdhdGNoZG9nIDIgYW5kIDM6IFNldmVyYWwgY2hhbm5lbHMgY2FuIGJlIG1vbml0b3JlZCAoc3VjY2Vzc2l2ZSBjYWxscyBvZiBIQUxfQURDX0FuYWxvZ1dER0NvbmZpZygpIG11c3QgYmUgZG9uZSwgb25lIGZvciBlYWNoIGNoYW5uZWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbHMgZ3JvdXAgcmVzZXQgY2FuIGJlIGRvbmUgYnkgc2V0dGluZyBXYXRjaGRvZ01vZGUgdG8gJ0FEQ19BTkFMT0dXQVRDSERPR19OT05FJykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDRXhfY2hhbm5lbHMuICovCisgIHVpbnQzMl90IElUTW9kZTsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBhbmFsb2cgd2F0Y2hkb2cgaXMgY29uZmlndXJlZCBpbiBpbnRlcnJ1cHQgb3IgcG9sbGluZyBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvIEVOQUJMRSBvciBESVNBQkxFICovCisgIHVpbnQzMl90IEhpZ2hUaHJlc2hvbGQ7ICAgICAvKiE8IENvbmZpZ3VyZXMgdGhlIEFEQyBhbmFsb2cgd2F0Y2hkb2cgSGlnaCB0aHJlc2hvbGQgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGVuZGluZyBvZiBBREMgcmVzb2x1dGlvbiBzZWxlY3RlZCAoMTJVLCAxMFUsIDggb3IgNiBiaXRzKSwgdGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMDAgYW5kIE1heF9EYXRhID0gMHhGRkZVLCAweDNGRlUsIDB4RkYgb3IgMHgzRiByZXNwZWN0aXZlbHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEFuYWxvZyB3YXRjaGRvZyAyIGFuZCAzIGFyZSBsaW1pdGVkIHRvIGEgcmVzb2x1dGlvbiBvZiA4IGJpdHM6IGlmIEFEQyByZXNvbHV0aW9uIGlzIDEyIGJpdHMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSA0IExTQiBhcmUgaWdub3JlZCwgaWYgQURDIHJlc29sdXRpb24gaXMgMTAgYml0cyB0aGUgMiBMU0IgYXJlIGlnbm9yZWQuICovCisgIHVpbnQzMl90IExvd1RocmVzaG9sZDsgICAgICAvKiE8IENvbmZpZ3VyZXMgdGhlIEFEQyBhbmFsb2cgd2F0Y2hkb2cgSGlnaCB0aHJlc2hvbGQgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGVuZGluZyBvZiBBREMgcmVzb2x1dGlvbiBzZWxlY3RlZCAoMTJVLCAxMFUsIDggb3IgNiBiaXRzKSwgdGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMDAgYW5kIE1heF9EYXRhID0gMHhGRkZVLCAweDNGRlUsIDB4RkYgb3IgMHgzRiByZXNwZWN0aXZlbHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEFuYWxvZyB3YXRjaGRvZyAyIGFuZCAzIGFyZSBsaW1pdGVkIHRvIGEgcmVzb2x1dGlvbiBvZiA4IGJpdHM6IGlmIEFEQyByZXNvbHV0aW9uIGlzIDEyIGJpdHMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSA0IExTQiBhcmUgaWdub3JlZCwgaWYgQURDIHJlc29sdXRpb24gaXMgMTAgYml0cyB0aGUgMiBMU0IgYXJlIGlnbm9yZWQuICovCit9QURDX0FuYWxvZ1dER0NvbmZUeXBlRGVmOworCisvKiogCisgICogQGJyaWVmICBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBvZiBBREMgbXVsdGltb2RlCisgICogQG5vdGUgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIHdpdGggZnVuY3Rpb24gSEFMX0FEQ0V4X011bHRpTW9kZUNvbmZpZ0NoYW5uZWwoKSBpcyBjb25kaXRpb25lZCB0byBBRENzIHN0YXRlIChib3RoIEFEQ3Mgb2YgdGhlIGNvbW1vbiBncm91cCkuCisgICogICAgICAgICBBREMgc3RhdGUgY2FuIGJlIGVpdGhlcjoKKyAgKiAgICAgICAgICAtIEZvciBhbGwgcGFyYW1ldGVyczogQURDIGRpc2FibGVkICh0aGlzIGlzIHRoZSBvbmx5IHBvc3NpYmxlIEFEQyBzdGF0ZSB0byBtb2RpZnkgcGFyYW1ldGVyICdETUFBY2Nlc3NNb2RlJykKKyAgKiAgICAgICAgICAtIEZvciBwYXJhbWV0ZXIgJ0RNQUFjY2Vzc01vZGUnOiBBREMgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcgb24gcmVndWxhciBncm91cC4KKyAgKiAgICAgICAgIElmIEFEQyBpcyBub3QgaW4gdGhlIGFwcHJvcHJpYXRlIHN0YXRlIHRvIG1vZGlmeSBzb21lIHBhcmFtZXRlcnMsIHRoZXNlIHBhcmFtZXRlcnMgc2V0dGluZyBpcyBieXBhc3NlZAorICAqICAgICAgICAgd2l0aG91dCBlcnJvciByZXBvcnRpbmcgKGFzIGl0IGNhbiBiZSB0aGUgZXhwZWN0ZWQgYmVoYXZpb3VyIGluIGNhc2Ugb2YgaW50ZW5kZWQgYWN0aW9uIHRvIHVwZGF0ZSBhbm90aGVyIHBhcmFtZXRlciAod2hpY2ggZnVsZmlsbHMgdGhlIEFEQyBzdGF0ZSBjb25kaXRpb24pIG9uIHRoZSBmbHkpLgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgTW9kZTsgICAgICAgICAgICAgIC8qITwgQ29uZmlndXJlcyB0aGUgQURDIHRvIG9wZXJhdGUgaW4gaW5kZXBlbmRlbnQgb3IgbXVsdGkgbW9kZS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDRXhfQ29tbW9uX21vZGUgKi8KKyAgdWludDMyX3QgRE1BQWNjZXNzTW9kZTsgICAgIC8qITwgQ29uZmlndXJlcyB0aGUgRE1BIG1vZGUgZm9yIG11bHRpIEFEQyBtb2RlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24gd2hldGhlciAyIERNQSBjaGFubmVscyAoZWFjaCBBREMgdXNlIGl0cyBvd24gRE1BIGNoYW5uZWwpIG9yIDEgRE1BIGNoYW5uZWwgKG9uZSBETUEgY2hhbm5lbCBmb3IgYm90aCBBREMsIERNQSBvZiBBREMgbWFzdGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ0V4X0RpcmVjdF9tZW1vcnlfYWNjZXNzX21vZGVfZm9yX211bHRpbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXV0aW9uOiBMaW1pdGF0aW9ucyB3aXRoIG11bHRpbW9kZSBETUEgYWNjZXNzIGVuYWJsZWQgKDEgRE1BIGNoYW5uZWwgdXNlZCk6IEluIGNhc2Ugb2YgZHVhbCBtb2RlIGluIGhpZ2ggc3BlZWQgKG1vcmUgdGhhbiA1TXNwcykgb3IgaGlnaCBhY3Rpdml0eSBvZiBETUEgYnkgb3RoZXIgcGVyaXBoZXJhbHMsIHRoZXJlIGlzIGEgcmlzayBvZiBETUEgb3ZlcnJ1bi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlcmVmb3JlLCBpdCBpcyByZWNvbW1lbmRlZCB0byBkaXNhYmxlIG11bHRpbW9kZSBETUEgYWNjZXNzOiBlYWNoIEFEQyB1c2VzIGl0cyBvd24gRE1BIGNoYW5uZWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyIHRvIGRldmljZSBlcnJhdGEgc2hlZXQgZm9yIG1vcmUgZGV0YWlscy4gKi8KKyAgdWludDMyX3QgVHdvU2FtcGxpbmdEZWxheTsgIC8qITwgQ29uZmlndXJlcyB0aGUgRGVsYXkgYmV0d2VlbiAyIHNhbXBsaW5nIHBoYXNlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENFeF9kZWxheV9iZXR3ZWVuXzJfc2FtcGxpbmdfcGhhc2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGF5IHJhbmdlIGRlcGVuZHMgb24gc2VsZWN0ZWQgcmVzb2x1dGlvbjogZnJvbSAxIHRvIDEyIGNsb2NrIGN5Y2xlcyBmb3IgMTIgYml0cywgZnJvbSAxIHRvIDEwIGNsb2NrIGN5Y2xlcyBmb3IgMTAgYml0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gMSB0byA4IGNsb2NrIGN5Y2xlcyBmb3IgOCBiaXRzLCBmcm9tIDEgdG8gNiBjbG9jayBjeWNsZXMgZm9yIDYgYml0cyAgICAgKi8KK31BRENfTXVsdGlNb2RlVHlwZURlZjsKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworCisKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorLyoqIAorICAqIEBicmllZiAgU3RydWN0dXJlIGRlZmluaXRpb24gb2YgQURDIGFuZCByZWd1bGFyIGdyb3VwIGluaXRpYWxpemF0aW9uIAorICAqIEBub3RlICAgUGFyYW1ldGVycyBvZiB0aGlzIHN0cnVjdHVyZSBhcmUgc2hhcmVkIHdpdGhpbiAyIHNjb3BlczoKKyAgKiAgICAgICAgICAtIFNjb3BlIGVudGlyZSBBREMgKGFmZmVjdHMgcmVndWxhciBhbmQgaW5qZWN0ZWQgZ3JvdXBzKTogRGF0YUFsaWduLCBTY2FuQ29udk1vZGUuCisgICogICAgICAgICAgLSBTY29wZSByZWd1bGFyIGdyb3VwOiBDb250aW51b3VzQ29udk1vZGUsIE5ick9mQ29udmVyc2lvbiwgRGlzY29udGludW91c0NvbnZNb2RlLCBOYnJPZkRpc2NDb252ZXJzaW9uLCBFeHRlcm5hbFRyaWdDb252RWRnZSwgRXh0ZXJuYWxUcmlnQ29udi4KKyAgKiBAbm90ZSAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgd2l0aCBmdW5jdGlvbiBIQUxfQURDX0luaXQoKSBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGUuCisgICogICAgICAgICBBREMgY2FuIGJlIGVpdGhlciBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZyBvbiByZWd1bGFyIGdyb3VwLgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgRGF0YUFsaWduOyAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyBBREMgZGF0YSBhbGlnbm1lbnQgdG8gcmlnaHQgKE1TQiBvbiByZWdpc3RlciBiaXQgMTEgYW5kIExTQiBvbiByZWdpc3RlciBiaXQgMFUpIChkZWZhdWx0IHNldHRpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciB0byBsZWZ0IChpZiByZWd1bGFyIGdyb3VwOiBNU0Igb24gcmVnaXN0ZXIgYml0IDE1IGFuZCBMU0Igb24gcmVnaXN0ZXIgYml0IDRVLCBpZiBpbmplY3RlZCBncm91cCAoTVNCIGtlcHQgYXMgc2lnbmVkIHZhbHVlIGR1ZSB0byBwb3RlbnRpYWwgbmVnYXRpdmUgdmFsdWUgYWZ0ZXIgb2Zmc2V0IGFwcGxpY2F0aW9uKTogTVNCIG9uIHJlZ2lzdGVyIGJpdCAxNCBhbmQgTFNCIG9uIHJlZ2lzdGVyIGJpdCAzVSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ0V4X0RhdGFfYWxpZ24gKi8KKyAgdWludDMyX3QgU2NhbkNvbnZNb2RlOyAgICAgICAgICAvKiE8IENvbmZpZ3VyZXMgdGhlIHNlcXVlbmNlciBvZiByZWd1bGFyIGFuZCBpbmplY3RlZCBncm91cHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYXNzb2NpYXRlZCB0byBwYXJhbWV0ZXIgJ0Rpc2NvbnRpbnVvdXNDb252TW9kZScgdG8gaGF2ZSBtYWluIHNlcXVlbmNlIHN1YmRpdmlkZWQgaW4gc3VjY2Vzc2l2ZSBwYXJ0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGRpc2FibGVkOiBDb252ZXJzaW9uIGlzIHBlcmZvcm1lZCBpbiBzaW5nbGUgbW9kZSAob25lIGNoYW5uZWwgY29udmVydGVkLCB0aGUgb25lIGRlZmluZWQgaW4gcmFuayAxVSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVycyAnTmJyT2ZDb252ZXJzaW9uJyBhbmQgJ0luamVjdGVkTmJyT2ZDb252ZXJzaW9uJyBhcmUgZGlzY2FyZGVkIChlcXVpdmFsZW50IHRvIHNldCB0byAxVSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBlbmFibGVkOiAgQ29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCBpbiBzZXF1ZW5jZSBtb2RlIChtdWx0aXBsZSByYW5rcyBkZWZpbmVkIGJ5ICdOYnJPZkNvbnZlcnNpb24nLydJbmplY3RlZE5ick9mQ29udmVyc2lvbicgYW5kIGVhY2ggY2hhbm5lbCByYW5rKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FuIGRpcmVjdGlvbiBpcyB1cHdhcmQ6IGZyb20gcmFuazEgdG8gcmFuayAnbicuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ0V4X1NjYW5fbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogRm9yIHJlZ3VsYXIgZ3JvdXAsIHRoaXMgcGFyYW1ldGVyIHNob3VsZCBiZSBlbmFibGVkIGluIGNvbnZlcnNpb24gZWl0aGVyIGJ5IHBvbGxpbmcgKEhBTF9BRENfU3RhcnQgd2l0aCBEaXNjb250aW51b3VzIG1vZGUgYW5kIE5ick9mRGlzY0NvbnZlcnNpb249MVUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBieSBETUEgKEhBTF9BRENfU3RhcnRfRE1BKSwgYnV0IG5vdCBieSBpbnRlcnJ1cHRpb24gKEhBTF9BRENfU3RhcnRfSVQpOiBpbiBzY2FuIG1vZGUsIGludGVycnVwdGlvbiBpcyB0cmlnZ2VyZWQgb25seSBvbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsYXN0IGNvbnZlcnNpb24gb2YgdGhlIHNlcXVlbmNlLiBBbGwgcHJldmlvdXMgY29udmVyc2lvbnMgd291bGQgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGxhc3Qgb25lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5qZWN0ZWQgZ3JvdXAgdXNlZCB3aXRoIHNjYW4gbW9kZSBoYXMgbm90IHRoaXMgY29uc3RyYWludDogZWFjaCByYW5rIGhhcyBpdHMgb3duIHJlc3VsdCByZWdpc3Rlciwgbm8gZGF0YSBpcyBvdmVyd3JpdHRlbi4gKi8KKyAgdWludDMyX3QgQ29udGludW91c0NvbnZNb2RlOyAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZCBpbiBzaW5nbGUgbW9kZSAob25lIGNvbnZlcnNpb24pIG9yIGNvbnRpbnVvdXMgbW9kZSBmb3IgcmVndWxhciBncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyIHRoZSBzZWxlY3RlZCB0cmlnZ2VyIG9jY3VycmVkIChzb2Z0d2FyZSBzdGFydCBvciBleHRlcm5hbCB0cmlnZ2VyKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUuICovCisgIHVpbnQzMl90IE5ick9mQ29udmVyc2lvbjsgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiByYW5rcyB0aGF0IHdpbGwgYmUgY29udmVydGVkIHdpdGhpbiB0aGUgcmVndWxhciBncm91cCBzZXF1ZW5jZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUbyB1c2UgcmVndWxhciBncm91cCBzZXF1ZW5jZXIgYW5kIGNvbnZlcnQgc2V2ZXJhbCByYW5rcywgcGFyYW1ldGVyICdTY2FuQ29udk1vZGUnIG11c3QgYmUgZW5hYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDEgYW5kIE1heF9EYXRhID0gMTYuICovCisgIHVpbnQzMl90IERpc2NvbnRpbnVvdXNDb252TW9kZTsgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgY29udmVyc2lvbnMgc2VxdWVuY2Ugb2YgcmVndWxhciBncm91cCBpcyBwZXJmb3JtZWQgaW4gQ29tcGxldGUtc2VxdWVuY2UvRGlzY29udGludW91cy1zZXF1ZW5jZSAobWFpbiBzZXF1ZW5jZSBzdWJkaXZpZGVkIGluIHN1Y2Nlc3NpdmUgcGFydHMpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzY29udGludW91cyBtb2RlIGlzIHVzZWQgb25seSBpZiBzZXF1ZW5jZXIgaXMgZW5hYmxlZCAocGFyYW1ldGVyICdTY2FuQ29udk1vZGUnKS4gSWYgc2VxdWVuY2VyIGlzIGRpc2FibGVkLCB0aGlzIHBhcmFtZXRlciBpcyBkaXNjYXJkZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNjb250aW51b3VzIG1vZGUgY2FuIGJlIGVuYWJsZWQgb25seSBpZiBjb250aW51b3VzIG1vZGUgaXMgZGlzYWJsZWQuIElmIGNvbnRpbnVvdXMgbW9kZSBpcyBlbmFibGVkLCB0aGlzIHBhcmFtZXRlciBzZXR0aW5nIGlzIGRpc2NhcmRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUuICovCisgIHVpbnQzMl90IE5ick9mRGlzY0NvbnZlcnNpb247ICAgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBkaXNjb250aW51b3VzIGNvbnZlcnNpb25zIGluIHdoaWNoIHRoZSAgbWFpbiBzZXF1ZW5jZSBvZiByZWd1bGFyIGdyb3VwIChwYXJhbWV0ZXIgTmJyT2ZDb252ZXJzaW9uKSB3aWxsIGJlIHN1YmRpdmlkZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBwYXJhbWV0ZXIgJ0Rpc2NvbnRpbnVvdXNDb252TW9kZScgaXMgZGlzYWJsZWQsIHRoaXMgcGFyYW1ldGVyIGlzIGRpc2NhcmRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDEgYW5kIE1heF9EYXRhID0gOC4gKi8KKyAgdWludDMyX3QgRXh0ZXJuYWxUcmlnQ29udjsgICAgICAvKiE8IFNlbGVjdHMgdGhlIGV4dGVybmFsIGV2ZW50IHVzZWQgdG8gdHJpZ2dlciB0aGUgY29udmVyc2lvbiBzdGFydCBvZiByZWd1bGFyIGdyb3VwLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgc2V0IHRvIEFEQ19TT0ZUV0FSRV9TVEFSVCwgZXh0ZXJuYWwgdHJpZ2dlcnMgYXJlIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgc2V0IHRvIGV4dGVybmFsIHRyaWdnZXIgc291cmNlLCB0cmlnZ2VyaW5nIGlzIG9uIGV2ZW50IHJpc2luZyBlZGdlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENFeF9FeHRlcm5hbF90cmlnZ2VyX3NvdXJjZV9SZWd1bGFyICovCit9QURDX0luaXRUeXBlRGVmOworCisvKiogCisgICogQGJyaWVmICBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBvZiBBREMgY2hhbm5lbCBmb3IgcmVndWxhciBncm91cCAgIAorICAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyB3aXRoIGZ1bmN0aW9uIEhBTF9BRENfQ29uZmlnQ2hhbm5lbCgpIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZS4KKyAgKiAgICAgICAgIEFEQyBjYW4gYmUgZWl0aGVyIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIHJlZ3VsYXIgZ3JvdXAuCisgICovIAordHlwZWRlZiBzdHJ1Y3QgCit7CisgIHVpbnQzMl90IENoYW5uZWw7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjaGFubmVsIHRvIGNvbmZpZ3VyZSBpbnRvIEFEQyByZWd1bGFyIGdyb3VwLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDRXhfY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBEZXBlbmRpbmcgb24gZGV2aWNlcywgc29tZSBjaGFubmVscyBtYXkgbm90IGJlIGF2YWlsYWJsZSBvbiBwYWNrYWdlIHBpbnMuIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4gKi8KKyAgdWludDMyX3QgUmFuazsgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHJhbmsgaW4gdGhlIHJlZ3VsYXIgZ3JvdXAgc2VxdWVuY2VyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDRXhfcmVndWxhcl9yYW5rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogSW4gY2FzZSBvZiBuZWVkIHRvIGRpc2FibGUgYSBjaGFubmVsIG9yIGNoYW5nZSBvcmRlciBvZiBjb252ZXJzaW9uIHNlcXVlbmNlciwgcmFuayBjb250YWluaW5nIGEgcHJldmlvdXMgY2hhbm5lbCBzZXR0aW5nIGNhbiBiZSBvdmVyd3JpdHRlbiBieSB0aGUgbmV3IGNoYW5uZWwgc2V0dGluZyAob3IgcGFyYW1ldGVyIG51bWJlciBvZiBjb252ZXJzaW9ucyBjYW4gYmUgYWRqdXN0ZWQpICovCisgIHVpbnQzMl90IFNhbXBsaW5nVGltZTsgICAgICAgICAgIC8qITwgU2FtcGxpbmcgdGltZSB2YWx1ZSB0byBiZSBzZXQgZm9yIHRoZSBzZWxlY3RlZCBjaGFubmVsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaXQ6IEFEQyBjbG9jayBjeWNsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJzaW9uIHRpbWUgaXMgdGhlIGFkZGl0aW9uIG9mIHNhbXBsaW5nIHRpbWUgYW5kIHByb2Nlc3NpbmcgdGltZSAoMTIuNSBBREMgY2xvY2sgY3ljbGVzIGF0IEFEQyByZXNvbHV0aW9uIDEyIGJpdHMpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDRXhfc2FtcGxpbmdfdGltZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXV0aW9uOiBUaGlzIHBhcmFtZXRlciB1cGRhdGVzIHRoZSBwYXJhbWV0ZXIgcHJvcGVydHkgb2YgdGhlIGNoYW5uZWwsIHRoYXQgY2FuIGJlIHVzZWQgaW50byByZWd1bGFyIGFuZC9vciBpbmplY3RlZCBncm91cHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhpcyBzYW1lIGNoYW5uZWwgaGFzIGJlZW4gcHJldmlvdXNseSBjb25maWd1cmVkIGluIHRoZSBvdGhlciBncm91cCAocmVndWxhci9pbmplY3RlZCksIGl0IHdpbGwgYmUgdXBkYXRlZCB0byBsYXN0IHNldHRpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogSW4gY2FzZSBvZiB1c2FnZSBvZiBpbnRlcm5hbCBtZWFzdXJlbWVudCBjaGFubmVscyAoVnJlZkludC9WYmF0L1RlbXBTZW5zb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nIHRpbWUgY29uc3RyYWludHMgbXVzdCBiZSByZXNwZWN0ZWQgKHNhbXBsaW5nIHRpbWUgY2FuIGJlIGFkanVzdGVkIGluIGZ1bmN0aW9uIG9mIEFEQyBjbG9jayBmcmVxdWVuY3kgYW5kIHNhbXBsaW5nIHRpbWUgc2V0dGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciB0aW1pbmdzIHZhbHVlcywgcGFyYW1ldGVycyBUU192cmVmaW50LCBUU192YmF0LCBUU190ZW1wICh2YWx1ZXMgcm91Z2ggb3JkZXI6IDV1cyB0byAxNy4xdXMgbWluKS4gKi8KK31BRENfQ2hhbm5lbENvbmZUeXBlRGVmOworCisvKiogCisgICogQGJyaWVmICBBREMgQ29uZmlndXJhdGlvbiBpbmplY3RlZCBDaGFubmVsIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICogQG5vdGUgICBQYXJhbWV0ZXJzIG9mIHRoaXMgc3RydWN0dXJlIGFyZSBzaGFyZWQgd2l0aGluIDIgc2NvcGVzOgorICAqICAgICAgICAgIC0gU2NvcGUgY2hhbm5lbDogSW5qZWN0ZWRDaGFubmVsLCBJbmplY3RlZFJhbmssIEluamVjdGVkU2FtcGxpbmdUaW1lLCBJbmplY3RlZE9mZnNldAorICAqICAgICAgICAgIC0gU2NvcGUgaW5qZWN0ZWQgZ3JvdXAgKGFmZmVjdHMgYWxsIGNoYW5uZWxzIG9mIGluamVjdGVkIGdyb3VwKTogSW5qZWN0ZWROYnJPZkNvbnZlcnNpb24sIEluamVjdGVkRGlzY29udGludW91c0NvbnZNb2RlLAorICAqICAgICAgICAgICAgQXV0b0luamVjdGVkQ29udiwgRXh0ZXJuYWxUcmlnSW5qZWNDb252RWRnZSwgRXh0ZXJuYWxUcmlnSW5qZWNDb252LgorICAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyB3aXRoIGZ1bmN0aW9uIEhBTF9BRENFeF9JbmplY3RlZENvbmZpZ0NoYW5uZWwoKSBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGUuCisgICogICAgICAgICBBREMgc3RhdGUgY2FuIGJlIGVpdGhlcjoKKyAgKiAgICAgICAgICAtIEZvciBhbGwgcGFyYW1ldGVyczogQURDIGRpc2FibGVkICh0aGlzIGlzIHRoZSBvbmx5IHBvc3NpYmxlIEFEQyBzdGF0ZSB0byBtb2RpZnkgcGFyYW1ldGVyICdFeHRlcm5hbFRyaWdJbmplY0NvbnYnKQorICAqICAgICAgICAgIC0gRm9yIGFsbCBleGNlcHQgcGFyYW1ldGVycyAnRXh0ZXJuYWxUcmlnSW5qZWNDb252JzogQURDIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIGluamVjdGVkIGdyb3VwLgorICAqLwordHlwZWRlZiBzdHJ1Y3QgCit7CisgIHVpbnQzMl90IEluamVjdGVkQ2hhbm5lbDsgICAgICAgICAgICAgICAvKiE8IFNlbGVjdGlvbiBvZiBBREMgY2hhbm5lbCB0byBjb25maWd1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENFeF9jaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBEZXBlbmRpbmcgb24gZGV2aWNlcywgc29tZSBjaGFubmVscyBtYXkgbm90IGJlIGF2YWlsYWJsZSBvbiBwYWNrYWdlIHBpbnMuIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4gKi8KKyAgdWludDMyX3QgSW5qZWN0ZWRSYW5rOyAgICAgICAgICAgICAgICAgIC8qITwgUmFuayBpbiB0aGUgaW5qZWN0ZWQgZ3JvdXAgc2VxdWVuY2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ0V4X2luamVjdGVkX3JhbmsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogSW4gY2FzZSBvZiBuZWVkIHRvIGRpc2FibGUgYSBjaGFubmVsIG9yIGNoYW5nZSBvcmRlciBvZiBjb252ZXJzaW9uIHNlcXVlbmNlciwgcmFuayBjb250YWluaW5nIGEgcHJldmlvdXMgY2hhbm5lbCBzZXR0aW5nIGNhbiBiZSBvdmVyd3JpdHRlbiBieSB0aGUgbmV3IGNoYW5uZWwgc2V0dGluZyAob3IgcGFyYW1ldGVyIG51bWJlciBvZiBjb252ZXJzaW9ucyBjYW4gYmUgYWRqdXN0ZWQpICovCisgIHVpbnQzMl90IEluamVjdGVkU2FtcGxpbmdUaW1lOyAgICAgICAgICAvKiE8IFNhbXBsaW5nIHRpbWUgdmFsdWUgdG8gYmUgc2V0IGZvciB0aGUgc2VsZWN0ZWQgY2hhbm5lbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pdDogQURDIGNsb2NrIGN5Y2xlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJzaW9uIHRpbWUgaXMgdGhlIGFkZGl0aW9uIG9mIHNhbXBsaW5nIHRpbWUgYW5kIHByb2Nlc3NpbmcgdGltZSAoMTIuNSBBREMgY2xvY2sgY3ljbGVzIGF0IEFEQyByZXNvbHV0aW9uIDEyIGJpdHMpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ0V4X3NhbXBsaW5nX3RpbWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdXRpb246IFRoaXMgcGFyYW1ldGVyIHVwZGF0ZXMgdGhlIHBhcmFtZXRlciBwcm9wZXJ0eSBvZiB0aGUgY2hhbm5lbCwgdGhhdCBjYW4gYmUgdXNlZCBpbnRvIHJlZ3VsYXIgYW5kL29yIGluamVjdGVkIGdyb3Vwcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhpcyBzYW1lIGNoYW5uZWwgaGFzIGJlZW4gcHJldmlvdXNseSBjb25maWd1cmVkIGluIHRoZSBvdGhlciBncm91cCAocmVndWxhci9pbmplY3RlZCksIGl0IHdpbGwgYmUgdXBkYXRlZCB0byBsYXN0IHNldHRpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEluIGNhc2Ugb2YgdXNhZ2Ugb2YgaW50ZXJuYWwgbWVhc3VyZW1lbnQgY2hhbm5lbHMgKFZyZWZJbnQvVmJhdC9UZW1wU2Vuc29yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmcgdGltZSBjb25zdHJhaW50cyBtdXN0IGJlIHJlc3BlY3RlZCAoc2FtcGxpbmcgdGltZSBjYW4gYmUgYWRqdXN0ZWQgaW4gZnVuY3Rpb24gb2YgQURDIGNsb2NrIGZyZXF1ZW5jeSBhbmQgc2FtcGxpbmcgdGltZSBzZXR0aW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciB0aW1pbmdzIHZhbHVlcywgcGFyYW1ldGVycyBUU192cmVmaW50LCBUU192YmF0LCBUU190ZW1wICh2YWx1ZXMgcm91Z2ggb3JkZXI6IDV1cyB0byAxNy4xdXMgbWluKS4gKi8KKyAgdWludDMyX3QgSW5qZWN0ZWRPZmZzZXQ7ICAgICAgICAgICAgICAgIC8qITwgRGVmaW5lcyB0aGUgb2Zmc2V0IHRvIGJlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgcmF3IGNvbnZlcnRlZCBkYXRhIChmb3IgY2hhbm5lbHMgc2V0IG9uIGluamVjdGVkIGdyb3VwIG9ubHkpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXQgdmFsdWUgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwZW5kaW5nIG9mIEFEQyByZXNvbHV0aW9uIHNlbGVjdGVkICgxMlUsIDEwVSwgOCBvciA2IGJpdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwMCBhbmQgTWF4X0RhdGEgPSAweEZGRlUsIDB4M0ZGVSwgMHhGRiBvciAweDNGIHJlc3BlY3RpdmVseS4gKi8KKyAgdWludDMyX3QgSW5qZWN0ZWROYnJPZkNvbnZlcnNpb247ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgcmFua3MgdGhhdCB3aWxsIGJlIGNvbnZlcnRlZCB3aXRoaW4gdGhlIGluamVjdGVkIGdyb3VwIHNlcXVlbmNlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG8gdXNlIHRoZSBpbmplY3RlZCBncm91cCBzZXF1ZW5jZXIgYW5kIGNvbnZlcnQgc2V2ZXJhbCByYW5rcywgcGFyYW1ldGVyICdTY2FuQ29udk1vZGUnIG11c3QgYmUgZW5hYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMSBhbmQgTWF4X0RhdGEgPSA0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXV0aW9uOiB0aGlzIHNldHRpbmcgaW1wYWN0cyB0aGUgZW50aXJlIGluamVjdGVkIGdyb3VwLiBUaGVyZWZvcmUsIGNhbGwgb2YgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIHRvIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmUgYSBjaGFubmVsIG9uIGluamVjdGVkIGdyb3VwIGNhbiBpbXBhY3QgdGhlIGNvbmZpZ3VyYXRpb24gb2Ygb3RoZXIgY2hhbm5lbHMgcHJldmlvdXNseSBzZXQuICovCisgIHVpbnQzMl90IEluamVjdGVkRGlzY29udGludW91c0NvbnZNb2RlOyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBjb252ZXJzaW9ucyBzZXF1ZW5jZSBvZiBpbmplY3RlZCBncm91cCBpcyBwZXJmb3JtZWQgaW4gQ29tcGxldGUtc2VxdWVuY2UvRGlzY29udGludW91cy1zZXF1ZW5jZSAobWFpbiBzZXF1ZW5jZSBzdWJkaXZpZGVkIGluIHN1Y2Nlc3NpdmUgcGFydHMpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNjb250aW51b3VzIG1vZGUgaXMgdXNlZCBvbmx5IGlmIHNlcXVlbmNlciBpcyBlbmFibGVkIChwYXJhbWV0ZXIgJ1NjYW5Db252TW9kZScpLiBJZiBzZXF1ZW5jZXIgaXMgZGlzYWJsZWQsIHRoaXMgcGFyYW1ldGVyIGlzIGRpc2NhcmRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzY29udGludW91cyBtb2RlIGNhbiBiZSBlbmFibGVkIG9ubHkgaWYgY29udGludW91cyBtb2RlIGlzIGRpc2FibGVkLiBJZiBjb250aW51b3VzIG1vZGUgaXMgZW5hYmxlZCwgdGhpcyBwYXJhbWV0ZXIgc2V0dGluZyBpcyBkaXNjYXJkZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEZvciBpbmplY3RlZCBncm91cCwgbnVtYmVyIG9mIGRpc2NvbnRpbnVvdXMgcmFua3MgaW5jcmVtZW50IGlzIGZpeGVkIHRvIG9uZS1ieS1vbmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdXRpb246IHRoaXMgc2V0dGluZyBpbXBhY3RzIHRoZSBlbnRpcmUgaW5qZWN0ZWQgZ3JvdXAuIFRoZXJlZm9yZSwgY2FsbCBvZiBIQUxfQURDRXhfSW5qZWN0ZWRDb25maWdDaGFubmVsKCkgdG8gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZSBhIGNoYW5uZWwgb24gaW5qZWN0ZWQgZ3JvdXAgY2FuIGltcGFjdCB0aGUgY29uZmlndXJhdGlvbiBvZiBvdGhlciBjaGFubmVscyBwcmV2aW91c2x5IHNldC4gKi8KKyAgdWludDMyX3QgQXV0b0luamVjdGVkQ29udjsgICAgICAgICAgICAgIC8qITwgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc2VsZWN0ZWQgQURDIGF1dG9tYXRpYyBpbmplY3RlZCBncm91cCBjb252ZXJzaW9uIGFmdGVyIHJlZ3VsYXIgb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUuICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFRvIHVzZSBBdXRvbWF0aWMgaW5qZWN0ZWQgY29udmVyc2lvbiwgZGlzY29udGludW91cyBtb2RlIG11c3QgYmUgZGlzYWJsZWQgKCdEaXNjb250aW51b3VzQ29udk1vZGUnIGFuZCAnSW5qZWN0ZWREaXNjb250aW51b3VzQ29udk1vZGUnIHNldCB0byBESVNBQkxFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBUbyB1c2UgQXV0b21hdGljIGluamVjdGVkIGNvbnZlcnNpb24sIGluamVjdGVkIGdyb3VwIGV4dGVybmFsIHRyaWdnZXJzIG11c3QgYmUgZGlzYWJsZWQgKCdFeHRlcm5hbFRyaWdJbmplY0NvbnYnIHNldCB0byBBRENfU09GVFdBUkVfU1RBUlQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEluIGNhc2Ugb2YgRE1BIHVzZWQgd2l0aCByZWd1bGFyIGdyb3VwOiBpZiBETUEgY29uZmlndXJlZCBpbiBub3JtYWwgbW9kZSAoc2luZ2xlIHNob3QpIEpBVVRPIHdpbGwgYmUgc3RvcHBlZCB1cG9uIERNQSB0cmFuc2ZlciBjb21wbGV0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG8gbWFpbnRhaW4gSkFVVE8gYWx3YXlzIGVuYWJsZWQsIERNQSBtdXN0IGJlIGNvbmZpZ3VyZWQgaW4gY2lyY3VsYXIgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F1dGlvbjogdGhpcyBzZXR0aW5nIGltcGFjdHMgdGhlIGVudGlyZSBpbmplY3RlZCBncm91cC4gVGhlcmVmb3JlLCBjYWxsIG9mIEhBTF9BRENFeF9JbmplY3RlZENvbmZpZ0NoYW5uZWwoKSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmUgYSBjaGFubmVsIG9uIGluamVjdGVkIGdyb3VwIGNhbiBpbXBhY3QgdGhlIGNvbmZpZ3VyYXRpb24gb2Ygb3RoZXIgY2hhbm5lbHMgcHJldmlvdXNseSBzZXQuICovCisgIHVpbnQzMl90IEV4dGVybmFsVHJpZ0luamVjQ29udjsgICAgICAgICAvKiE8IFNlbGVjdHMgdGhlIGV4dGVybmFsIGV2ZW50IHVzZWQgdG8gdHJpZ2dlciB0aGUgY29udmVyc2lvbiBzdGFydCBvZiBpbmplY3RlZCBncm91cC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgc2V0IHRvIEFEQ19JTkpFQ1RFRF9TT0ZUV0FSRV9TVEFSVCwgZXh0ZXJuYWwgdHJpZ2dlcnMgYXJlIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBzZXQgdG8gZXh0ZXJuYWwgdHJpZ2dlciBzb3VyY2UsIHRyaWdnZXJpbmcgaXMgb24gZXZlbnQgcmlzaW5nIGVkZ2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDRXhfRXh0ZXJuYWxfdHJpZ2dlcl9zb3VyY2VfSW5qZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBtb2RpZmllZCB3aGVuIEFEQyBpcyBkaXNhYmxlZCAoYmVmb3JlIEFEQyBzdGFydCBjb252ZXJzaW9uIG9yIGFmdGVyIEFEQyBzdG9wIGNvbnZlcnNpb24pLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBBREMgaXMgZW5hYmxlZCwgdGhpcyBwYXJhbWV0ZXIgc2V0dGluZyBpcyBieXBhc3NlZCB3aXRob3V0IGVycm9yIHJlcG9ydGluZyAoYXMgaXQgY2FuIGJlIHRoZSBleHBlY3RlZCBiZWhhdmlvdXIgaW4gY2FzZSBvZiBhbm90aGVyIHBhcmFtZXRlciB1cGRhdGUgb24gdGhlIGZseSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F1dGlvbjogdGhpcyBzZXR0aW5nIGltcGFjdHMgdGhlIGVudGlyZSBpbmplY3RlZCBncm91cC4gVGhlcmVmb3JlLCBjYWxsIG9mIEhBTF9BRENFeF9JbmplY3RlZENvbmZpZ0NoYW5uZWwoKSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmUgYSBjaGFubmVsIG9uIGluamVjdGVkIGdyb3VwIGNhbiBpbXBhY3QgdGhlIGNvbmZpZ3VyYXRpb24gb2Ygb3RoZXIgY2hhbm5lbHMgcHJldmlvdXNseSBzZXQuICovCit9QURDX0luamVjdGlvbkNvbmZUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEFEQyBDb25maWd1cmF0aW9uIGFuYWxvZyB3YXRjaGRvZyBkZWZpbml0aW9uCisgICogQG5vdGUgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIHdpdGggZnVuY3Rpb24gaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLgorICAqICAgICAgICAgQURDIHN0YXRlIGNhbiBiZSBlaXRoZXIgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcgb24gcmVndWxhciBhbmQgaW5qZWN0ZWQgZ3JvdXBzLgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgV2F0Y2hkb2dNb2RlOyAgICAgIC8qITwgQ29uZmlndXJlcyB0aGUgQURDIGFuYWxvZyB3YXRjaGRvZyBtb2RlOiBzaW5nbGUvYWxsIGNoYW5uZWxzLCByZWd1bGFyL2luamVjdGVkIGdyb3VwLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ0V4X2FuYWxvZ193YXRjaGRvZ19tb2RlLiAqLworICB1aW50MzJfdCBDaGFubmVsOyAgICAgICAgICAgLyohPCBTZWxlY3RzIHdoaWNoIEFEQyBjaGFubmVsIHRvIG1vbml0b3IgYnkgYW5hbG9nIHdhdGNoZG9nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBoYXMgYW4gZWZmZWN0IG9ubHkgaWYgd2F0Y2hkb2cgbW9kZSBpcyBjb25maWd1cmVkIG9uIHNpbmdsZSBjaGFubmVsIChwYXJhbWV0ZXIgV2F0Y2hkb2dNb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ0V4X2NoYW5uZWxzLiAqLworICB1aW50MzJfdCBJVE1vZGU7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgYW5hbG9nIHdhdGNoZG9nIGlzIGNvbmZpZ3VyZWQgaW4gaW50ZXJydXB0IG9yIHBvbGxpbmcgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRSAqLworICB1aW50MzJfdCBIaWdoVGhyZXNob2xkOyAgICAgLyohPCBDb25maWd1cmVzIHRoZSBBREMgYW5hbG9nIHdhdGNoZG9nIEhpZ2ggdGhyZXNob2xkIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwMCBhbmQgTWF4X0RhdGEgPSAweEZGRi4gKi8KKyAgdWludDMyX3QgTG93VGhyZXNob2xkOyAgICAgIC8qITwgQ29uZmlndXJlcyB0aGUgQURDIGFuYWxvZyB3YXRjaGRvZyBIaWdoIHRocmVzaG9sZCB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMDAgYW5kIE1heF9EYXRhID0gMHhGRkYuICovCisgIHVpbnQzMl90IFdhdGNoZG9nTnVtYmVyOyAgICAvKiE8IFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLCBjYW4gYmUgc2V0IHRvIDBVICovCit9QURDX0FuYWxvZ1dER0NvbmZUeXBlRGVmOworI2VuZGlmIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEFEQ0V4X0V4cG9ydGVkX0NvbnN0YW50cyBBRENFeCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEFEQ0V4X0Vycm9yX0NvZGUgQURDIEV4dGVuZGVkIEVycm9yIENvZGUKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfQURDX0VSUk9SX05PTkUgICAgICAgICgweDAwVSkgICAvKiE8IE5vIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9BRENfRVJST1JfSU5URVJOQUwgICAgKDB4MDFVKSAgIC8qITwgQURDIElQIGludGVybmFsIGVycm9yOiBpZiBwcm9ibGVtIG9mIGNsb2NraW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZS9kaXNhYmxlLCBlcnJvbmVvdXMgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9BRENfRVJST1JfT1ZSICAgICAgICAgKDB4MDJVKSAgIC8qITwgT3ZlcnJ1biBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0FEQ19FUlJPUl9ETUEgICAgICAgICAoMHgwNFUpICAgLyohPCBETUEgdHJhbnNmZXIgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfQURDX0VSUk9SX0pRT1ZGICAgICAgICgweDA4VSkgICAvKiE8IEluamVjdGVkIGNvbnRleHQgcXVldWUgb3ZlcmZsb3cgZXJyb3IgICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKy8qKiBAZGVmZ3JvdXAgQURDRXhfQ2xvY2tQcmVzY2FsZXIgQURDIEV4dGVuZGVkIENsb2NrIFByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19DTE9DS19BU1lOQ19ESVYxICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIGRlcml2ZWQgZnJvbSBBREMgZGVkaWNhdGVkIFBMTCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KQorI2RlZmluZSBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjEgICAgICAoKHVpbnQzMl90KUFEQzEyX0NDUl9DS01PREVfMCkgIC8qITwgQURDIHN5bmNocm9ub3VzIGNsb2NrIGRlcml2ZWQgZnJvbSBBSEIgY2xvY2sgd2l0aG91dCBwcmVzY2FsZXIgKi8KKyNkZWZpbmUgQURDX0NMT0NLX1NZTkNfUENMS19ESVYyICAgICAgKCh1aW50MzJfdClBREMxMl9DQ1JfQ0tNT0RFXzEpICAvKiE8IEFEQyBzeW5jaHJvbm91cyBjbG9jayBkZXJpdmVkIGZyb20gQUhCIGNsb2NrIGRpdmlkZWQgYnkgYSBwcmVzY2FsZXIgb2YgMlUgKi8KKyNkZWZpbmUgQURDX0NMT0NLX1NZTkNfUENMS19ESVY0ICAgICAgKCh1aW50MzJfdClBREMxMl9DQ1JfQ0tNT0RFKSAgICAvKiE8IEFEQyBzeW5jaHJvbm91cyBjbG9jayBkZXJpdmVkIGZyb20gQUhCIGNsb2NrIGRpdmlkZWQgYnkgYSBwcmVzY2FsZXIgb2YgNFUgKi8KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisjZGVmaW5lIEFEQ19DTE9DS19TWU5DX1BDTEtfRElWMSAgICAgICgodWludDMyX3QpQURDMV9DQ1JfQ0tNT0RFXzApICAgLyohPCBBREMgc3luY2hyb25vdXMgY2xvY2sgZGVyaXZlZCBmcm9tIEFIQiBjbG9jayB3aXRob3V0IHByZXNjYWxlciAqLworI2RlZmluZSBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjIgICAgICAoKHVpbnQzMl90KUFEQzFfQ0NSX0NLTU9ERV8xKSAgIC8qITwgQURDIHN5bmNocm9ub3VzIGNsb2NrIGRlcml2ZWQgZnJvbSBBSEIgY2xvY2sgZGl2aWRlZCBieSBhIHByZXNjYWxlciBvZiAyVSAqLworI2RlZmluZSBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjQgICAgICAoKHVpbnQzMl90KUFEQzFfQ0NSX0NLTU9ERSkgICAgIC8qITwgQURDIHN5bmNocm9ub3VzIGNsb2NrIGRlcml2ZWQgZnJvbSBBSEIgY2xvY2sgZGl2aWRlZCBieSBhIHByZXNjYWxlciBvZiA0VSAqLworI2VuZGlmIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMxOHh4IHx8IFNUTTMyRjMwMng4ICovCisKKyNkZWZpbmUgSVNfQURDX0NMT0NLUFJFU0NBTEVSKEFEQ19DTE9DSykgKCgoQURDX0NMT0NLKSA9PSBBRENfQ0xPQ0tfQVNZTkNfRElWMSkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDX0NMT0NLKSA9PSBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDX0NMT0NLKSA9PSBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDX0NMT0NLKSA9PSBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjQpICAgKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENFeF9SZXNvbHV0aW9uIEFEQyBFeHRlbmRlZCBSZXNvbHV0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX1JFU09MVVRJT05fMTJCICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAvKiE8ICBBREMgMTItYml0IHJlc29sdXRpb24gKi8KKyNkZWZpbmUgQURDX1JFU09MVVRJT05fMTBCICAgICAgKCh1aW50MzJfdClBRENfQ0ZHUl9SRVNfMCkgICAgICAvKiE8ICBBREMgMTAtYml0IHJlc29sdXRpb24gKi8KKyNkZWZpbmUgQURDX1JFU09MVVRJT05fOEIgICAgICAgKCh1aW50MzJfdClBRENfQ0ZHUl9SRVNfMSkgICAgICAvKiE8ICBBREMgOC1iaXQgcmVzb2x1dGlvbiAqLworI2RlZmluZSBBRENfUkVTT0xVVElPTl82QiAgICAgICAoKHVpbnQzMl90KUFEQ19DRkdSX1JFUykgICAgICAgIC8qITwgIEFEQyA2LWJpdCByZXNvbHV0aW9uICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ0V4X0RhdGFfYWxpZ24gQURDIEV4dGVuZGVkIERhdGEgQWxpZ25tZW50CisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX0RBVEFBTElHTl9SSUdIVCAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgQURDX0RBVEFBTElHTl9MRUZUICAgICAgICgodWludDMyX3QpQURDX0NGR1JfQUxJR04pCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ0V4X1NjYW5fbW9kZSBBREMgRXh0ZW5kZWQgU2NhbiBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX1NDQU5fRElTQUJMRSAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgQURDX1NDQU5fRU5BQkxFICAgICAgICAgICgweDAwMDAwMDAxVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDRXhfRXh0ZXJuYWxfdHJpZ2dlcl9lZGdlX1JlZ3VsYXIgQURDIEV4dGVuZGVkIEV4dGVybmFsIHRyaWdnZXIgZW5hYmxlIGFuZCBwb2xhcml0eSBzZWxlY3Rpb24gZm9yIHJlZ3VsYXIgZ3JvdXAKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfTk9ORSAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfUklTSU5HICAgICAgICAgKCh1aW50MzJfdClBRENfQ0ZHUl9FWFRFTl8wKQorI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfRkFMTElORyAgICAgICAgKCh1aW50MzJfdClBRENfQ0ZHUl9FWFRFTl8xKQorI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfUklTSU5HRkFMTElORyAgKCh1aW50MzJfdClBRENfQ0ZHUl9FWFRFTikKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDRXhfRXh0ZXJuYWxfdHJpZ2dlcl9zb3VyY2VfUmVndWxhciBBREMgRXh0ZW5kZWQgRXh0ZXJuYWwgdHJpZ2dlciBzZWxlY3Rpb24gZm9yIHJlZ3VsYXIgZ3JvdXAKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorLyohPCBMaXN0IG9mIGV4dGVybmFsIHRyaWdnZXJzIHdpdGggZ2VuZXJpYyB0cmlnZ2VyIG5hbWUsIGluZGVwZW5kZW50bHkgb2YgICAgKi8KKy8qIEFEQyB0YXJnZXQgKGNhdXRpb246IGFwcGxpZXMgdG8gb3RoZXIgQURDcyBzaGFyaW5nIHRoZSBzYW1lIGNvbW1vbiBncm91cCksICovCisvKiBzb3J0ZWQgYnkgdHJpZ2dlciBuYW1lOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiE8IEV4dGVybmFsIHRyaWdnZXJzIG9mIHJlZ3VsYXIgZ3JvdXAgZm9yIEFEQzEmQURDMiBvbmx5ICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX0NDMSAgICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDFfQ0MxCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX0NDMiAgICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDFfQ0MyCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyX0NDMiAgICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDJfQ0MyCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QzX0NDNCAgICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDNfQ0M0CisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1Q0X0NDNCAgICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDRfQ0M0CisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1Q2X1RSR08gICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDZfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVl9FWFRfSVQxMSAgICAgICBBREMxXzJfRVhURVJOQUxUUklHX0VYVF9JVDExCisKKy8qITwgRXh0ZXJuYWwgdHJpZ2dlcnMgb2YgcmVndWxhciBncm91cCBmb3IgQURDMyZBREM0IG9ubHkgKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDJfQ0MxICAgICAgICAgQURDM180X0VYVEVSTkFMVFJJR19UMl9DQzEKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDJfQ0MzICAgICAgICAgQURDM180X0VYVEVSTkFMVFJJR19UMl9DQzMKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDNfQ0MxICAgICAgICAgQURDM180X0VYVEVSTkFMVFJJR19UM19DQzEKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDRfQ0MxICAgICAgICAgQURDM180X0VYVEVSTkFMVFJJR19UNF9DQzEKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDdfVFJHTyAgICAgICAgQURDM180X0VYVEVSTkFMVFJJR19UN19UUkdPCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1Q4X0NDMSAgICAgICAgIEFEQzNfNF9FWFRFUk5BTFRSSUdfVDhfQ0MxCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX0VYVF9JVDIgICAgICAgIEFEQzNfNF9FWFRFUk5BTFRSSUdfRVhUX0lUMgorCisvKiE8IEV4dGVybmFsIHRyaWdnZXJzIG9mIHJlZ3VsYXIgZ3JvdXAgZm9yIEFEQzEmQURDMiwgQURDMyZBREM0ICovCisvKiBOb3RlOiBUcmlnZ2VycyBhZmZlY3RlZCB0byBncm91cCBBREMxXzIgYnkgZGVmYXVsdCwgcmVkaXJlY3RlZCB0byBncm91cCAgICAqLworLyogICAgICAgQURDM180IGJ5IGRyaXZlciB3aGVuIG5lZWRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDFfQ0MzICAgICAgICAgQURDMV8yX0VYVEVSTkFMVFJJR19UMV9DQzMKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDFfVFJHTyAgICAgICAgQURDMV8yX0VYVEVSTkFMVFJJR19UMV9UUkdPCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX1RSR08yICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDFfVFJHTzIKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDJfVFJHTyAgICAgICAgQURDMV8yX0VYVEVSTkFMVFJJR19UMl9UUkdPCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QzX1RSR08gICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDNfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVl9UNF9UUkdPICAgICAgICBBREMxXzJfRVhURVJOQUxUUklHX1Q0X1RSR08KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDhfVFJHTyAgICAgICAgQURDMV8yX0VYVEVSTkFMVFJJR19UOF9UUkdPCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1Q4X1RSR08yICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDhfVFJHTzIKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDE1X1RSR08gICAgICAgQURDMV8yX0VYVEVSTkFMVFJJR19UMTVfVFJHTworCisjZGVmaW5lIEFEQ19TT0ZUV0FSRV9TVEFSVCAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxVSkKKworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisvKiBBREMgZXh0ZXJuYWwgdHJpZ2dlcnMgc3BlY2lmaWMgdG8gZGV2aWNlIFNUTTMwM3hFOiBtYXNrIHRvIGRpZmZlcmVudGlhdGUgICAqLworLyogc3RhbmRhcmQgdHJpZ2dlcnMgZnJvbSBzcGVjaWZpYyB0aW1lciAyMFUsIG5lZWRlZCBmb3IgcmVhbGxvY2F0aW9uIG9mICAgICAgICovCisvKiB0cmlnZ2VycyBjb21tb24gdG8gQURDMSYyVS9BREMzJjQgYW5kIHRvIGF2b2lkIG1peGluZyB3aXRoIHN0YW5kYXJkICAgICAgICAgKi8KKy8qIHRyaWdnZXJzIHdpdGhvdXQgcmVtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyMF9NQVNLICAgICAgIDB4MTAwMAorCisvKiE8IExpc3Qgb2YgZXh0ZXJuYWwgdHJpZ2dlcnMgc3BlY2lmaWMgdG8gZGV2aWNlIFNUTTMwM3hFOiB1c2luZyBUaW1lcjIwICAgICAqLworLyogd2l0aCBBREMgdHJpZ2dlciBpbnB1dCByZW1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRvIHJlbWFwIEFEQyB0cmlnZ2VyIGZyb20gb3RoZXIgdGltZXJzL0V4dExpbmUgdG8gdGltZXIyMDogdXNlIG1hY3JvICAgICAgICovCisvKiAiIF9fSEFMX1JFTUFQQURDVFJJR0dFUl9FTkFCTEUoLi4uKSAiIHdpdGggcGFyYW1ldGVycyBkZXNjcmliZWQgYmVsb3c6ICAgICAqLworCisvKiE8IEV4dGVybmFsIHRyaWdnZXJzIG9mIHJlZ3VsYXIgZ3JvdXAgZm9yIEFEQzEmQURDMiBvbmx5LCBzcGVjaWZpYyB0byAgICAgICAqLworLyogZGV2aWNlIFNUTTMwM3hFOiA6IHVzaW5nIFRpbWVyMjAgd2l0aCBBREMgdHJpZ2dlciBpbnB1dCByZW1hcCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDIwX0NDMiAgICAgICAgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDZfVFJHTyAvKiE8IFJlbWFwIHRyaWdnZXIgdXNpbmcgbWFjcm8gX19IQUxfUkVNQVBBRENUUklHR0VSX0VOQUJMRShIQUxfUkVNQVBBRENUUklHR0VSX0FEQzEyX0VYVDEzVSkgKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDIwX0NDMyAgICAgICAgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDNfQ0M0ICAvKiE8IFJlbWFwIHRyaWdnZXIgdXNpbmcgbWFjcm8gX19IQUxfUkVNQVBBRENUUklHR0VSX0VOQUJMRShIQUxfUkVNQVBBRENUUklHR0VSX0FEQzEyX0VYVDE1VSkgKi8KKworLyohPCBFeHRlcm5hbCB0cmlnZ2VycyBvZiByZWd1bGFyIGdyb3VwIGZvciBBREMzJkFEQzQgb25seSwgc3BlY2lmaWMgdG8gICAgICAgKi8KKy8qIGRldmljZSBTVE0zMDN4RTogOiB1c2luZyBUaW1lcjIwIHdpdGggQURDIHRyaWdnZXIgaW5wdXQgcmVtYXAgICAgICAgICAgICAgICovCisvKiBOb25lICovCisKKy8qITwgRXh0ZXJuYWwgdHJpZ2dlcnMgb2YgcmVndWxhciBncm91cCBmb3IgQURDMSZBREMyLCBBREMzJkFEQzQsIHNwZWNpZmljIHRvICovCisvKiBkZXZpY2UgU1RNMzAzeEU6IDogdXNpbmcgVGltZXIyMCB3aXRoIEFEQyB0cmlnZ2VyIGlucHV0IHJlbWFwICAgICAgICAgICAgICAqLworLyogTm90ZTogVHJpZ2dlcnMgYWZmZWN0ZWQgdG8gZ3JvdXAgQURDMV8yIGJ5IGRlZmF1bHQsIHJlZGlyZWN0ZWQgdG8gZ3JvdXAgICAgKi8KKy8qICAgICAgIEFEQzNfNCBieSBkcml2ZXIgd2hlbiBuZWVkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyMF9DQzEgICAgICAgIChBRENfRVhURVJOQUxUUklHQ09OVl9UNF9DQzQgfCBBRENfRVhURVJOQUxUUklHQ09OVl9UMjBfTUFTSykgLyohPCBGb3IgQURDMSZBREMyOiBSZW1hcCB0cmlnZ2VyIHVzaW5nIG1hY3JvIF9fSEFMX1JFTUFQQURDVFJJR0dFUl9FTkFCTEUoSEFMX1JFTUFQQURDVFJJR0dFUl9BREMxMl9FWFQ1KSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRm9yIEFEQzMmQURDNDogUmVtYXAgdHJpZ2dlciB1c2luZyBtYWNybyBfX0hBTF9SRU1BUEFEQ1RSSUdHRVJfRU5BQkxFKEhBTF9SRU1BUEFEQ1RSSUdHRVJfQURDMzRfRVhUMTVVKSAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVl9UMjBfVFJHTyAgICAgICAoQURDX0VYVEVSTkFMVFJJR0NPTlZfVDFfQ0MzIHwgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDIwX01BU0spIC8qITwgRm9yIEFEQzEmQURDMjogUmVtYXAgdHJpZ2dlciB1c2luZyBtYWNybyBfX0hBTF9SRU1BUEFEQ1RSSUdHRVJfRU5BQkxFKEhBTF9SRU1BUEFEQ1RSSUdHRVJfQURDMTJfRVhUMikgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEZvciBBREMzJkFEQzQ6IFJlbWFwIHRyaWdnZXIgdXNpbmcgbWFjcm8gX19IQUxfUkVNQVBBRENUUklHR0VSX0VOQUJMRShIQUxfUkVNQVBBRENUUklHR0VSX0FEQzM0X0VYVDUpICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyMF9UUkdPMiAgICAgIChBRENfRVhURVJOQUxUUklHQ09OVl9UMl9DQzIgfCBBRENfRVhURVJOQUxUUklHQ09OVl9UMjBfTUFTSykgLyohPCBGb3IgQURDMSZBREMyOiBSZW1hcCB0cmlnZ2VyIHVzaW5nIG1hY3JvIF9fSEFMX1JFTUFQQURDVFJJR0dFUl9FTkFCTEUoSEFMX1JFTUFQQURDVFJJR0dFUl9BREMxMl9FWFQzKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRm9yIEFEQzMmQURDNDogUmVtYXAgdHJpZ2dlciB1c2luZyBtYWNybyBfX0hBTF9SRU1BUEFEQ1RSSUdHRVJfRU5BQkxFKEhBTF9SRU1BUEFEQ1RSSUdHRVJfQURDMzRfRVhUNikgKi8KKyNlbmRpZiAvKiBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCAqLworCisjZW5kaWYgLyogU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpCisvKiE8IExpc3Qgb2YgZXh0ZXJuYWwgdHJpZ2dlcnMgd2l0aCBnZW5lcmljIHRyaWdnZXIgbmFtZSwgaW5kZXBlbmRlbnRseSBvZiAgICAqLworLyogQURDIHRhcmdldCAoY2F1dGlvbjogYXBwbGllcyB0byBvdGhlciBBRENzIHNoYXJpbmcgdGhlIHNhbWUgY29tbW9uIGdyb3VwKSwgKi8KKy8qIHNvcnRlZCBieSB0cmlnZ2VyIG5hbWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qITwgRXh0ZXJuYWwgdHJpZ2dlcnMgb2YgcmVndWxhciBncm91cCBmb3IgQURDMSZBREMyICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX0NDMSAgICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDFfQ0MxCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX0NDMiAgICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDFfQ0MyCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX0NDMyAgICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDFfQ0MzCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX1RSR08gICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDFfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVl9UMV9UUkdPMiAgICAgICBBREMxXzJfRVhURVJOQUxUUklHX1QxX1RSR08yCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyX0NDMiAgICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDJfQ0MyCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyX1RSR08gICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDJfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVl9UM19DQzQgICAgICAgICBBREMxXzJfRVhURVJOQUxUUklHX1QzX0NDNAorI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVl9UM19UUkdPICAgICAgICBBREMxXzJfRVhURVJOQUxUUklHX1QzX1RSR08KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDRfQ0M0ICAgICAgICAgQURDMV8yX0VYVEVSTkFMVFJJR19UNF9DQzQKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDRfVFJHTyAgICAgICAgQURDMV8yX0VYVEVSTkFMVFJJR19UNF9UUkdPCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1Q2X1RSR08gICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDZfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVl9UMTVfVFJHTyAgICAgICBBREMxXzJfRVhURVJOQUxUUklHX1QxNV9UUkdPCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX0VYVF9JVDExICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfRVhUX0lUMTEKKyNkZWZpbmUgQURDX1NPRlRXQVJFX1NUQVJUICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDFVKQorCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkKKy8qIEFEQyBleHRlcm5hbCB0cmlnZ2VycyBzcGVjaWZpYyB0byBkZXZpY2UgU1RNMzAyeEU6IG1hc2sgdG8gZGlmZmVyZW50aWF0ZSAgICovCisvKiBzdGFuZGFyZCB0cmlnZ2VycyBmcm9tIHNwZWNpZmljIHRpbWVyIDIwVSwgbmVlZGVkIGZvciByZWFsbG9jYXRpb24gb2YgICAgICAgKi8KKy8qIHRyaWdnZXJzIGNvbW1vbiB0byBBREMxJjIgYW5kIHRvIGF2b2luZCBtaXhpbmcgd2l0aCBzdGFuZGFyZCAgICAgICAgICAgICAgICovCisvKiB0cmlnZ2VycyB3aXRob3V0IHJlbWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVl9UMjBfTUFTSyAgICAgICAweDEwMDAKKworLyohPCBMaXN0IG9mIGV4dGVybmFsIHRyaWdnZXJzIHNwZWNpZmljIHRvIGRldmljZSBTVE0zMDJ4RTogdXNpbmcgVGltZXIyMCAgICAgKi8KKy8qIHdpdGggQURDIHRyaWdnZXIgaW5wdXQgcmVtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUbyByZW1hcCBBREMgdHJpZ2dlciBmcm9tIG90aGVyIHRpbWVycy9FeHRMaW5lIHRvIHRpbWVyMjA6IHVzZSBtYWNybyAgICAgICAqLworLyogIiBfX0hBTF9SRU1BUEFEQ1RSSUdHRVJfRU5BQkxFKC4uLikgIiB3aXRoIHBhcmFtZXRlcnMgZGVzY3JpYmVkIGJlbG93OiAgICAgKi8KKworLyohPCBFeHRlcm5hbCB0cmlnZ2VycyBvZiByZWd1bGFyIGdyb3VwIGZvciBBREMxJkFEQzIgb25seSwgc3BlY2lmaWMgdG8gICAgICAgKi8KKy8qIGRldmljZSBTVE0zMDJ4RTogOiB1c2luZyBUaW1lcjIwIHdpdGggQURDIHRyaWdnZXIgaW5wdXQgcmVtYXAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyMF9DQzIgICAgICAgIEFEQ19FWFRFUk5BTFRSSUdDT05WX1Q2X1RSR08gLyohPCBSZW1hcCB0cmlnZ2VyIHVzaW5nIG1hY3JvIF9fSEFMX1JFTUFQQURDVFJJR0dFUl9FTkFCTEUoSEFMX1JFTUFQQURDVFJJR0dFUl9BREMxMl9FWFQxM1UpICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyMF9DQzMgICAgICAgIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QzX0NDNCAgLyohPCBSZW1hcCB0cmlnZ2VyIHVzaW5nIG1hY3JvIF9fSEFMX1JFTUFQQURDVFJJR0dFUl9FTkFCTEUoSEFMX1JFTUFQQURDVFJJR0dFUl9BREMxMl9FWFQxNVUpICovCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgKi8KKworI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpCisvKiE8IExpc3Qgb2YgZXh0ZXJuYWwgdHJpZ2dlcnMgd2l0aCBnZW5lcmljIHRyaWdnZXIgbmFtZSwgaW5kZXBlbmRlbnRseSBvZiAgICAqLworLyogQURDIHRhcmdldCAoY2F1dGlvbjogYXBwbGllcyB0byBvdGhlciBBRENzIHNoYXJpbmcgdGhlIHNhbWUgY29tbW9uIGdyb3VwKSwgKi8KKy8qIHNvcnRlZCBieSB0cmlnZ2VyIG5hbWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qITwgRXh0ZXJuYWwgdHJpZ2dlcnMgb2YgcmVndWxhciBncm91cCBmb3IgQURDMSZBREMyICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX0NDMSAgICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDFfQ0MxCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX0NDMiAgICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDFfQ0MyCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX0NDMyAgICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDFfQ0MzCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX1RSR08gICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDFfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVl9UMV9UUkdPMiAgICAgICBBREMxXzJfRVhURVJOQUxUUklHX1QxX1RSR08yCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyX0NDMiAgICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDJfQ0MyCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyX1RSR08gICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDJfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVl9UM19DQzQgICAgICAgICBBREMxXzJfRVhURVJOQUxUUklHX1QzX0NDNAorI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVl9UM19UUkdPICAgICAgICBBREMxXzJfRVhURVJOQUxUUklHX1QzX1RSR08KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDRfQ0M0ICAgICAgICAgQURDMV8yX0VYVEVSTkFMVFJJR19UNF9DQzQKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDRfVFJHTyAgICAgICAgQURDMV8yX0VYVEVSTkFMVFJJR19UNF9UUkdPCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1Q4X1RSR08gICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDhfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVl9UOF9UUkdPMiAgICAgICBBREMxXzJfRVhURVJOQUxUUklHX1Q4X1RSR08yCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1Q2X1RSR08gICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDZfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVl9UMTVfVFJHTyAgICAgICBBREMxXzJfRVhURVJOQUxUUklHX1QxNV9UUkdPCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX0VYVF9JVDExICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfRVhUX0lUMTEKKyNkZWZpbmUgQURDX1NPRlRXQVJFX1NUQVJUICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDFVKQorCisjZW5kaWYgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzI4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzM0eDgpCisvKiE8IExpc3Qgb2YgZXh0ZXJuYWwgdHJpZ2dlcnMgd2l0aCBnZW5lcmljIHRyaWdnZXIgbmFtZSwgaW5kZXBlbmRlbnRseSBvZiAgICAqLworLyogQURDIHRhcmdldCAoY2F1dGlvbjogYXBwbGllcyB0byBvdGhlciBBRENzIHNoYXJpbmcgdGhlIHNhbWUgY29tbW9uIGdyb3VwKSwgKi8KKy8qIHNvcnRlZCBieSB0cmlnZ2VyIG5hbWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qITwgRXh0ZXJuYWwgdHJpZ2dlcnMgb2YgcmVndWxhciBncm91cCBmb3IgQURDMSZBREMyICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX0NDMSAgICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDFfQ0MxCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX0NDMiAgICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDFfQ0MyCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX0NDMyAgICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDFfQ0MzCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX1RSR08gICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDFfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVl9UMV9UUkdPMiAgICAgICBBREMxXzJfRVhURVJOQUxUUklHX1QxX1RSR08yCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyX0NDMiAgICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDJfQ0MyCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyX1RSR08gICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDJfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVl9UM19DQzQgICAgICAgICBBREMxXzJfRVhURVJOQUxUUklHX1QzX0NDNAorI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVl9UM19UUkdPICAgICAgICBBREMxXzJfRVhURVJOQUxUUklHX1QzX1RSR08KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDZfVFJHTyAgICAgICAgQURDMV8yX0VYVEVSTkFMVFJJR19UNl9UUkdPCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxNV9UUkdPICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDE1X1RSR08KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZIUlRJTV9UUkcxICAgICAgQURDMV8yX0VYVEVSTkFMVFJJR19IUlRJTV9UUkcxCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WSFJUSU1fVFJHMyAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdfSFJUSU1fVFJHMworI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVl9FWFRfSVQxMSAgICAgICBBREMxXzJfRVhURVJOQUxUUklHX0VYVF9JVDExCisjZGVmaW5lIEFEQ19TT0ZUV0FSRV9TVEFSVCAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxVSkKKyNlbmRpZiAvKiBTVE0zMkYzMzR4OCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKy8qIExpc3Qgb2YgZXh0ZXJuYWwgdHJpZ2dlcnMgd2l0aCBnZW5lcmljIHRyaWdnZXIgbmFtZSwgc29ydGVkIGJ5IHRyaWdnZXIgICAgICovCisvKiBuYW1lOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBFeHRlcm5hbCB0cmlnZ2VycyBvZiByZWd1bGFyIGdyb3VwIGZvciBBREMxICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX0NDMSAgICAgICAgIEFEQzFfRVhURVJOQUxUUklHX1QxX0NDMQorI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVl9UMV9DQzIgICAgICAgICBBREMxX0VYVEVSTkFMVFJJR19UMV9DQzIKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDFfQ0MzICAgICAgICAgQURDMV9FWFRFUk5BTFRSSUdfVDFfQ0MzCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX0VYVF9JVDExICAgICAgIEFEQzFfRVhURVJOQUxUUklHX0VYVF9JVDExCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX1RSR08gICAgICAgIEFEQzFfRVhURVJOQUxUUklHX1QxX1RSR08KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDFfVFJHTzIgICAgICAgQURDMV9FWFRFUk5BTFRSSUdfVDFfVFJHTzIKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDJfVFJHTyAgICAgICAgQURDMV9FWFRFUk5BTFRSSUdfVDJfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVl9UNl9UUkdPICAgICAgICBBREMxX0VYVEVSTkFMVFJJR19UNl9UUkdPCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxNV9UUkdPICAgICAgIEFEQzFfRVhURVJOQUxUUklHX1QxNV9UUkdPCisjZGVmaW5lIEFEQ19TT0ZUV0FSRV9TVEFSVCAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxVSkKKyNlbmRpZiAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENFeF9FT0NTZWxlY3Rpb24gQURDIEV4dGVuZGVkIEVuZCBvZiBSZWd1bGFyIFNlcXVlbmNlL0NvbnZlcnNpb24gCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX0VPQ19TSU5HTEVfQ09OViAgICAgICAgICgodWludDMyX3QpIEFEQ19JU1JfRU9DKQorI2RlZmluZSBBRENfRU9DX1NFUV9DT05WICAgICAgICAgICAgKCh1aW50MzJfdCkgQURDX0lTUl9FT1MpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ0V4X092ZXJydW4gQURDIEV4dGVuZGVkIG92ZXJydW4KKyAgKiBAeworICAqLworI2RlZmluZSBBRENfT1ZSX0RBVEFfT1ZFUldSSVRURU4gICAgKDB4MDAwMDAwMDBVKSAgIC8qITwgRGVmYXVsdCBzZXR0aW5nLCB0byBiZSB1c2VkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgU1RNMzIgZGV2aWNlcyAqLworI2RlZmluZSBBRENfT1ZSX0RBVEFfUFJFU0VSVkVEICAgICAgKDB4MDAwMDAwMDFVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENFeF9jaGFubmVscyBBREMgRXh0ZW5kZWQgQ2hhbm5lbHMKKyAgKiBAeworICAqLworLyogTm90ZTogRGVwZW5kaW5nIG9uIGRldmljZXMsIHNvbWUgY2hhbm5lbHMgbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gcGFja2FnZSAgKi8KKy8qICAgICAgIHBpbnMuIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4gICAgICAgICAgICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzEgICAgICAgICAgICgodWludDMyX3QpKEFEQ19TUVIzX1NRMTBfMCkpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzIgICAgICAgICAgICgodWludDMyX3QpKEFEQ19TUVIzX1NRMTBfMSkpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzMgICAgICAgICAgICgodWludDMyX3QpKEFEQ19TUVIzX1NRMTBfMSB8IEFEQ19TUVIzX1NRMTBfMCkpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzQgICAgICAgICAgICgodWludDMyX3QpKEFEQ19TUVIzX1NRMTBfMikpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzUgICAgICAgICAgICgodWludDMyX3QpKEFEQ19TUVIzX1NRMTBfMiB8IEFEQ19TUVIzX1NRMTBfMCkpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzYgICAgICAgICAgICgodWludDMyX3QpKEFEQ19TUVIzX1NRMTBfMiB8IEFEQ19TUVIzX1NRMTBfMSkpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzcgICAgICAgICAgICgodWludDMyX3QpKEFEQ19TUVIzX1NRMTBfMiB8IEFEQ19TUVIzX1NRMTBfMSB8IEFEQ19TUVIzX1NRMTBfMCkpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzggICAgICAgICAgICgodWludDMyX3QpKEFEQ19TUVIzX1NRMTBfMykpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzkgICAgICAgICAgICgodWludDMyX3QpKEFEQ19TUVIzX1NRMTBfMyB8IEFEQ19TUVIzX1NRMTBfMCkpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzEwICAgICAgICAgICgodWludDMyX3QpKEFEQ19TUVIzX1NRMTBfMyB8IEFEQ19TUVIzX1NRMTBfMSkpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzExICAgICAgICAgICgodWludDMyX3QpKEFEQ19TUVIzX1NRMTBfMyB8IEFEQ19TUVIzX1NRMTBfMSB8IEFEQ19TUVIzX1NRMTBfMCkpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzEyICAgICAgICAgICgodWludDMyX3QpKEFEQ19TUVIzX1NRMTBfMyB8IEFEQ19TUVIzX1NRMTBfMikpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzEzICAgICAgICAgICgodWludDMyX3QpKEFEQ19TUVIzX1NRMTBfMyB8IEFEQ19TUVIzX1NRMTBfMiB8IEFEQ19TUVIzX1NRMTBfMCkpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE0ICAgICAgICAgICgodWludDMyX3QpKEFEQ19TUVIzX1NRMTBfMyB8IEFEQ19TUVIzX1NRMTBfMiB8IEFEQ19TUVIzX1NRMTBfMSkpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE1ICAgICAgICAgICgodWludDMyX3QpKEFEQ19TUVIzX1NRMTBfMyB8IEFEQ19TUVIzX1NRMTBfMiB8IEFEQ19TUVIzX1NRMTBfMSB8IEFEQ19TUVIzX1NRMTBfMCkpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE2ICAgICAgICAgICgodWludDMyX3QpKEFEQ19TUVIzX1NRMTBfNCkpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE3ICAgICAgICAgICgodWludDMyX3QpKEFEQ19TUVIzX1NRMTBfNCB8IEFEQ19TUVIzX1NRMTBfMCkpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE4ICAgICAgICAgICgodWludDMyX3QpKEFEQ19TUVIzX1NRMTBfNCB8IEFEQ19TUVIzX1NRMTBfMSkpCisKKy8qIE5vdGU6IFZvcGFtcDEsIFRlbXBTZW5zb3IgYW5kIFZiYXQgaW50ZXJuYWwgY2hhbm5lbHMgYXZhaWxhYmxlIG9uIEFEQzEgb25seSAqLworI2RlZmluZSBBRENfQ0hBTk5FTF9WT1BBTVAxICAgICBBRENfQ0hBTk5FTF8xNQorI2RlZmluZSBBRENfQ0hBTk5FTF9URU1QU0VOU09SICBBRENfQ0hBTk5FTF8xNgorI2RlZmluZSBBRENfQ0hBTk5FTF9WQkFUICAgICAgICBBRENfQ0hBTk5FTF8xNworCisvKiBOb3RlOiBWb3BhbXAyLzNVLzQgaW50ZXJuYWwgY2hhbm5lbHMgYXZhaWxhYmxlIG9uIEFEQzIvM1UvNCByZXNwZWN0aXZlbHkgICAgICovCisjZGVmaW5lIEFEQ19DSEFOTkVMX1ZPUEFNUDIgICAgIEFEQ19DSEFOTkVMXzE3CisjZGVmaW5lIEFEQ19DSEFOTkVMX1ZPUEFNUDMgICAgIEFEQ19DSEFOTkVMXzE3CisjZGVmaW5lIEFEQ19DSEFOTkVMX1ZPUEFNUDQgICAgIEFEQ19DSEFOTkVMXzE3CisKKy8qIE5vdGU6IFZyZWZJbnQgaW50ZXJuYWwgY2hhbm5lbHMgYXZhaWxhYmxlIG9uIGFsbCBBRENzLCBidXQgb25seSAgICAgICAgICAgICovCisvKiAgICAgICBvbmUgQURDIGlzIGFsbG93ZWQgdG8gYmUgY29ubmVjdGVkIHRvIFZyZWZJbnQgYXQgdGhlIHNhbWUgdGltZS4gICAgICAqLworI2RlZmluZSBBRENfQ0hBTk5FTF9WUkVGSU5UICAgICAoKHVpbnQzMl90KUFEQ19DSEFOTkVMXzE4KQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENFeF9zYW1wbGluZ190aW1lcyBBREMgRXh0ZW5kZWQgU2FtcGxpbmcgVGltZXMKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfU0FNUExFVElNRV8xQ1lDTEVfNSAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTYW1wbGluZyB0aW1lIDEuNSBBREMgY2xvY2sgY3ljbGUgKi8KKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfMkNZQ0xFU181ICAgICAgKCh1aW50MzJfdClBRENfU01QUjJfU01QMTBfMCkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU2FtcGxpbmcgdGltZSAyLjUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBBRENfU0FNUExFVElNRV80Q1lDTEVTXzUgICAgICAoKHVpbnQzMl90KUFEQ19TTVBSMl9TTVAxMF8xKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTYW1wbGluZyB0aW1lIDQuNSBBREMgY2xvY2sgY3ljbGVzICovCisjZGVmaW5lIEFEQ19TQU1QTEVUSU1FXzdDWUNMRVNfNSAgICAgICgodWludDMyX3QpKEFEQ19TTVBSMl9TTVAxMF8xIHwgQURDX1NNUFIyX1NNUDEwXzApKSAvKiE8IFNhbXBsaW5nIHRpbWUgNy41IEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfMTlDWUNMRVNfNSAgICAgKCh1aW50MzJfdClBRENfU01QUjJfU01QMTBfMikgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU2FtcGxpbmcgdGltZSAxOS41IEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfNjFDWUNMRVNfNSAgICAgKCh1aW50MzJfdCkoQURDX1NNUFIyX1NNUDEwXzIgfCBBRENfU01QUjJfU01QMTBfMCkpIC8qITwgU2FtcGxpbmcgdGltZSA2MS41IEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfMTgxQ1lDTEVTXzUgICAgKCh1aW50MzJfdCkoQURDX1NNUFIyX1NNUDEwXzIgfCBBRENfU01QUjJfU01QMTBfMSkpIC8qITwgU2FtcGxpbmcgdGltZSAxODEuNSBBREMgY2xvY2sgY3ljbGVzICovCisjZGVmaW5lIEFEQ19TQU1QTEVUSU1FXzYwMUNZQ0xFU181ICAgICgodWludDMyX3QpQURDX1NNUFIyX1NNUDEwKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNhbXBsaW5nIHRpbWUgNjAxLjUgQURDIGNsb2NrIGN5Y2xlcyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENFeF9TaW5nbGVEaWZmZXJlbnRpYWwgQURDIEV4dGVuZGVkIFNpbmdsZS1lbmRlZC9EaWZmZXJlbnRpYWwgaW5wdXQgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19TSU5HTEVfRU5ERUQgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBBRENfRElGRkVSRU5USUFMX0VOREVEICAgICAgICAgICgweDAwMDAwMDAxVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDRXhfT2Zmc2V0TnVtYmVyIEFEQyBFeHRlbmRlZCBPZmZzZXQgTnVtYmVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX09GRlNFVF9OT05FICAgICAgICAgICAgICAgKDB4MDBVKQorI2RlZmluZSBBRENfT0ZGU0VUXzEgICAgICAgICAgICAgICAgICAoMHgwMVUpCisjZGVmaW5lIEFEQ19PRkZTRVRfMiAgICAgICAgICAgICAgICAgICgweDAyVSkKKyNkZWZpbmUgQURDX09GRlNFVF8zICAgICAgICAgICAgICAgICAgKDB4MDNVKQorI2RlZmluZSBBRENfT0ZGU0VUXzQgICAgICAgICAgICAgICAgICAoMHgwNFUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ0V4X3JlZ3VsYXJfcmFuayBBREMgRXh0ZW5kZWQgcmFuayBpbnRvIHJlZ3VsYXIgZ3JvdXAKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzEgICAgKDB4MDAwMDAwMDFVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzIgICAgKDB4MDAwMDAwMDJVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzMgICAgKDB4MDAwMDAwMDNVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzQgICAgKDB4MDAwMDAwMDRVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzUgICAgKDB4MDAwMDAwMDVVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzYgICAgKDB4MDAwMDAwMDZVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzcgICAgKDB4MDAwMDAwMDdVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzggICAgKDB4MDAwMDAwMDhVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzkgICAgKDB4MDAwMDAwMDlVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzEwICAgKDB4MDAwMDAwMEFVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzExICAgKDB4MDAwMDAwMEJVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzEyICAgKDB4MDAwMDAwMENVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzEzICAgKDB4MDAwMDAwMERVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzE0ICAgKDB4MDAwMDAwMEVVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzE1ICAgKDB4MDAwMDAwMEZVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzE2ICAgKDB4MDAwMDAwMTBVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENFeF9pbmplY3RlZF9yYW5rIEFEQyBFeHRlbmRlZCBJbmplY3RlZCBDaGFubmVsIFJhbmsKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfSU5KRUNURURfUkFOS18xICAgICgweDAwMDAwMDAxVSkKKyNkZWZpbmUgQURDX0lOSkVDVEVEX1JBTktfMiAgICAoMHgwMDAwMDAwMlUpCisjZGVmaW5lIEFEQ19JTkpFQ1RFRF9SQU5LXzMgICAgKDB4MDAwMDAwMDNVKQorI2RlZmluZSBBRENfSU5KRUNURURfUkFOS180ICAgICgweDAwMDAwMDA0VSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDRXhfRXh0ZXJuYWxfdHJpZ2dlcl9lZGdlX0luamVjdGVkIEV4dGVybmFsIFRyaWdnZXIgRWRnZSBvZiBJbmplY3RlZCBHcm91cAorICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfRURHRV9OT05FICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfRURHRV9SSVNJTkcgICAgICAgICAoKHVpbnQzMl90KUFEQ19KU1FSX0pFWFRFTl8wKQorI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX0VER0VfRkFMTElORyAgICAgICAgKCh1aW50MzJfdClBRENfSlNRUl9KRVhURU5fMSkKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9FREdFX1JJU0lOR0ZBTExJTkcgICgodWludDMyX3QpQURDX0pTUVJfSkVYVEVOKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENFeF9FeHRlcm5hbF90cmlnZ2VyX3NvdXJjZV9JbmplY3RlZCBFeHRlcm5hbCBUcmlnZ2VyIFNvdXJjZSBvZiBJbmplY3RlZCBHcm91cAorICAqIEB7CisgICovCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpCisvKiBMaXN0IG9mIGV4dGVybmFsIHRyaWdnZXJzIHdpdGggZ2VuZXJpYyB0cmlnZ2VyIG5hbWUsIGluZGVwZW5kZW50bHkgb2YgQURDICAqLworLyogdGFyZ2V0IChjYXV0aW9uOiBhcHBsaWVzIHRvIG90aGVyIEFEQ3Mgc2hhcmluZyB0aGUgc2FtZSBjb21tb24gZ3JvdXApLCAgICAgKi8KKy8qIHNvcnRlZCBieSB0cmlnZ2VyIG5hbWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEV4dGVybmFsIHRyaWdnZXJzIG9mIGluamVjdGVkIGdyb3VwIGZvciBBREMxJkFEQzIgb25seSAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QyX0NDMSAgICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDJfQ0MxCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDNfQ0MxICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UM19DQzEKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UM19DQzMgICAgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1QzX0NDMworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QzX0NDNCAgICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDNfQ0M0CisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDZfVFJHTyAgIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UNl9UUkdPCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfRVhUX0lUMTUgIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19FWFRfSVQxNQorCisvKiBFeHRlcm5hbCB0cmlnZ2VycyBvZiBpbmplY3RlZCBncm91cCBmb3IgQURDMyZBREM0IG9ubHkgKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMV9DQzMgICAgQURDM180X0VYVEVSTkFMVFJJR0lOSkVDX1QxX0NDMworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q0X0NDMyAgICBBREMzXzRfRVhURVJOQUxUUklHSU5KRUNfVDRfQ0MzCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDRfQ0M0ICAgIEFEQzNfNF9FWFRFUk5BTFRSSUdJTkpFQ19UNF9DQzQKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UN19UUkdPICAgQURDM180X0VYVEVSTkFMVFJJR0lOSkVDX1Q3X1RSR08KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UOF9DQzIgICAgQURDM180X0VYVEVSTkFMVFJJR0lOSkVDX1Q4X0NDMgorCisvKiBFeHRlcm5hbCB0cmlnZ2VycyBvZiBpbmplY3RlZCBncm91cCBmb3IgQURDMSZBREMyLCBBREMzJkFEQzQgKi8KKy8qIE5vdGU6IFRyaWdnZXJzIGFmZmVjdGVkIHRvIGdyb3VwIEFEQzFfMiBieSBkZWZhdWx0LCByZWRpcmVjdGVkIHRvIGdyb3VwICAgICovCisvKiAgICAgICBBREMzXzQgYnkgZHJpdmVyIHdoZW4gbmVlZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxX0NDNCAgICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDFfQ0M0CisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDFfVFJHTyAgIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UMV9UUkdPCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDFfVFJHTzIgIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UMV9UUkdPMgorI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QyX1RSR08gICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDJfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QzX1RSR08gICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDNfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q0X1RSR08gICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDRfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q4X0NDNCAgICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDhfQ0M0CisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDhfVFJHTyAgIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UOF9UUkdPCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDhfVFJHTzIgIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UOF9UUkdPMgorI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxNV9UUkdPICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDE1X1RSR08KKworI2RlZmluZSBBRENfSU5KRUNURURfU09GVFdBUkVfU1RBUlQgICAgICgweDAwMDAwMDAxVSkKKworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisvKiE8IExpc3Qgb2YgZXh0ZXJuYWwgdHJpZ2dlcnMgc3BlY2lmaWMgdG8gZGV2aWNlIFNUTTMwM3hFOiB1c2luZyBUaW1lcjIwICAgICAqLworLyogd2l0aCBBREMgdHJpZ2dlciBpbnB1dCByZW1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRvIHJlbWFwIEFEQyB0cmlnZ2VyIGZyb20gb3RoZXIgdGltZXJzL0V4dExpbmUgdG8gdGltZXIyMDogdXNlIG1hY3JvICAgICAgICovCisvKiAiIF9fSEFMX1JFTUFQQURDVFJJR0dFUl9FTkFCTEUoLi4uKSAiIHdpdGggcGFyYW1ldGVycyBkZXNjcmliZWQgYmVsb3c6ICAgICAqLworCisvKiE8IEV4dGVybmFsIHRyaWdnZXJzIG9mIGluamVjdGVkIGdyb3VwIGZvciBBREMxJkFEQzIgb25seSwgc3BlY2lmaWMgdG8gICAgICAqLworLyogZGV2aWNlIFNUTTMwM3hFOiA6IHVzaW5nIFRpbWVyMjAgd2l0aCBBREMgdHJpZ2dlciBpbnB1dCByZW1hcCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMjBfQ0M0ICAgICAgICBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QzX0NDMSAgLyohPCBSZW1hcCB0cmlnZ2VyIHVzaW5nIG1hY3JvIF9fSEFMX1JFTUFQQURDVFJJR0dFUl9FTkFCTEUoSEFMX1JFTUFQQURDVFJJR0dFUl9BREMxMl9KRVhUMTNVKSAqLworCisvKiE8IEV4dGVybmFsIHRyaWdnZXJzIG9mIGluamVjdGVkIGdyb3VwIGZvciBBREMzJkFEQzQgb25seSwgc3BlY2lmaWMgdG8gICAgICAqLworLyogZGV2aWNlIFNUTTMwM3hFOiA6IHVzaW5nIFRpbWVyMjAgd2l0aCBBREMgdHJpZ2dlciBpbnB1dCByZW1hcCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMjBfQ0MyICAgICAgICBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q3X1RSR08gLyohPCBSZW1hcCB0cmlnZ2VyIHVzaW5nIG1hY3JvIF9fSEFMX1JFTUFQQURDVFJJR0dFUl9FTkFCTEUoSEFMX1JFTUFQQURDVFJJR0dFUl9BREMzNF9KRVhUMTRVKSAqLworCisvKiE8IEV4dGVybmFsIHRyaWdnZXJzIG9mIHJlZ3VsYXIgZ3JvdXAgZm9yIEFEQzEmQURDMiwgQURDMyZBREM0LCBzcGVjaWZpYyB0byAqLworLyogZGV2aWNlIFNUTTMwM3hFOiA6IHVzaW5nIFRpbWVyMjAgd2l0aCBBREMgdHJpZ2dlciBpbnB1dCByZW1hcCAgICAgICAgICAgICAgKi8KKy8qIE5vdGU6IFRyaWdnZXJzIGFmZmVjdGVkIHRvIGdyb3VwIEFEQzFfMiBieSBkZWZhdWx0LCByZWRpcmVjdGVkIHRvIGdyb3VwICAgICovCisvKiAgICAgICBBREMzXzQgYnkgZHJpdmVyIHdoZW4gbmVlZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QyMF9UUkdPICAgICAgIChBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QyX0NDMSB8IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyMF9NQVNLKSAgIC8qITwgRm9yIEFEQzEmQURDMjogUmVtYXAgdHJpZ2dlciB1c2luZyBtYWNybyBfX0hBTF9SRU1BUEFEQ1RSSUdHRVJfRU5BQkxFKEhBTF9SRU1BUEFEQ1RSSUdHRVJfQURDMTJfSkVYVDMpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGb3IgQURDMyZBREM0OiBSZW1hcCB0cmlnZ2VyIHVzaW5nIG1hY3JvIF9fSEFMX1JFTUFQQURDVFJJR0dFUl9FTkFCTEUoSEFMX1JFTUFQQURDVFJJR0dFUl9BREMzNF9KRVhUNSkgKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMjBfVFJHTzIgICAgICAoQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9FWFRfSVQxNSB8IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyMF9NQVNLKSAvKiE8IEZvciBBREMxJkFEQzI6IFJlbWFwIHRyaWdnZXIgdXNpbmcgbWFjcm8gX19IQUxfUkVNQVBBRENUUklHR0VSX0VOQUJMRShIQUxfUkVNQVBBRENUUklHR0VSX0FEQzEyX0pFWFQ2KSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRm9yIEFEQzMmQURDNDogUmVtYXAgdHJpZ2dlciB1c2luZyBtYWNybyBfX0hBTF9SRU1BUEFEQ1RSSUdHRVJfRU5BQkxFKEhBTF9SRU1BUEFEQ1RSSUdHRVJfQURDMzRfSkVYVDExVSkgKi8KKyNlbmRpZiAvKiBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkKKyNkZWZpbmUgSVNfQURDX0VYVFRSSUdJTkpFQyhJTkpUUklHKSAoKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QyX0NDMSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UM19DQzEpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDNfQ0M0KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q2X1RSR08pICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9FWFRfSVQxNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q0X0NDMykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UNF9DQzQpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDdfVFJHTykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q4X0NDMikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDFfQ0M0KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxX1RSR08pICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMV9UUkdPMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDJfVFJHTykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QzX0NDMykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UM19UUkdPKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDRfVFJHTykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q4X0NDNCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UOF9UUkdPKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDhfVFJHTzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxNV9UUkdPKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19JTkpFQ1RFRF9TT0ZUV0FSRV9TVEFSVCkgICAgICAgICAgKQorI2VuZGlmIC8qIFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KQorI2RlZmluZSBJU19BRENfRVhUVFJJR0lOSkVDKElOSlRSSUcpICgoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDJfQ0MxKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UM19DQzEpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QzX0NDNCkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDZfVFJHTykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9FWFRfSVQxNSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDRfQ0MzKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UNF9DQzQpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q3X1RSR08pICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDhfQ0MyKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxX0NDNCkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDFfVFJHTykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMV9UUkdPMikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QyX1RSR08pICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDNfQ0MzKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UM19UUkdPKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q0X1RSR08pICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDhfQ0M0KSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UOF9UUkdPKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q4X1RSR08yKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDE1X1RSR08pICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QyMF9DQzQpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDIwX0NDMikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMjBfVFJHTykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QyMF9UUkdPMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0lOSkVDVEVEX1NPRlRXQVJFX1NUQVJUKSAgICAgICAgICAgKQorI2VuZGlmIC8qIFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4ICovCisKKyNlbmRpZiAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCBTVE0zMkYzNTh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpCisvKiE8IExpc3Qgb2YgZXh0ZXJuYWwgdHJpZ2dlcnMgd2l0aCBnZW5lcmljIHRyaWdnZXIgbmFtZSwgaW5kZXBlbmRlbnRseSBvZiAgICAqLworLyogQURDIHRhcmdldCAoY2F1dGlvbjogYXBwbGllcyB0byBvdGhlciBBRENzIHNoYXJpbmcgdGhlIHNhbWUgY29tbW9uIGdyb3VwKSwgKi8KKy8qIHNvcnRlZCBieSB0cmlnZ2VyIG5hbWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEV4dGVybmFsIHRyaWdnZXJzIG9mIGluamVjdGVkIGdyb3VwIGZvciBBREMxJkFEQzIgKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMV9DQzQgICAgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1QxX0NDNAorI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxX1RSR08gICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDFfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxX1RSR08yICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDFfVFJHTzIKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMl9DQzEgICAgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1QyX0NDMQorI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QyX1RSR08gICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDJfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QzX0NDMSAgICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDNfQ0MxCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDNfQ0MzICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UM19DQzMKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UM19DQzQgICAgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1QzX0NDNAorI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QzX1RSR08gICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDNfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q0X1RSR08gICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDRfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q2X1RSR08gICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDZfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxNV9UUkdPICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDE1X1RSR08KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9FWFRfSVQxNSAgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX0VYVF9JVDE1CisKKyNkZWZpbmUgQURDX0lOSkVDVEVEX1NPRlRXQVJFX1NUQVJUICAgICAoMHgwMDAwMDAwMVUpCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKQorLyohPCBMaXN0IG9mIGV4dGVybmFsIHRyaWdnZXJzIHNwZWNpZmljIHRvIGRldmljZSBTVE0zMDJ4RTogdXNpbmcgVGltZXIyMCAgICAgKi8KKy8qIHdpdGggQURDIHRyaWdnZXIgaW5wdXQgcmVtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUbyByZW1hcCBBREMgdHJpZ2dlciBmcm9tIG90aGVyIHRpbWVycy9FeHRMaW5lIHRvIHRpbWVyMjA6IHVzZSBtYWNybyAgICAgICAqLworLyogIiBfX0hBTF9SRU1BUEFEQ1RSSUdHRVJfRU5BQkxFKC4uLikgIiB3aXRoIHBhcmFtZXRlcnMgZGVzY3JpYmVkIGJlbG93OiAgICAgKi8KKworLyohPCBFeHRlcm5hbCB0cmlnZ2VycyBvZiBpbmplY3RlZCBncm91cCBmb3IgQURDMSZBREMyIG9ubHksIHNwZWNpZmljIHRvICAgICAgKi8KKy8qIGRldmljZSBTVE0zMDJ4RTogOiB1c2luZyBUaW1lcjIwIHdpdGggQURDIHRyaWdnZXIgaW5wdXQgcmVtYXAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDIwX0NDNCAgICAgICAgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UM19DQzEgIC8qITwgUmVtYXAgdHJpZ2dlciB1c2luZyBtYWNybyBfX0hBTF9SRU1BUEFEQ1RSSUdHRVJfRU5BQkxFKEhBTF9SRU1BUEFEQ1RSSUdHRVJfQURDMTJfSkVYVDEzVSkgKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMjBfVFJHTyAgICAgICAoQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMl9DQzEgfCBBRENfRVhURVJOQUxUUklHQ09OVl9UMjBfTUFTSykgICAvKiE8IEZvciBBREMxJkFEQzI6IFJlbWFwIHRyaWdnZXIgdXNpbmcgbWFjcm8gX19IQUxfUkVNQVBBRENUUklHR0VSX0VOQUJMRShIQUxfUkVNQVBBRENUUklHR0VSX0FEQzEyX0pFWFQzKSAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QyMF9UUkdPMiAgICAgIChBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX0VYVF9JVDE1IHwgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDIwX01BU0spIC8qITwgRm9yIEFEQzEmQURDMjogUmVtYXAgdHJpZ2dlciB1c2luZyBtYWNybyBfX0hBTF9SRU1BUEFEQ1RSSUdHRVJfRU5BQkxFKEhBTF9SRU1BUEFEQ1RSSUdHRVJfQURDMTJfSkVYVDYpICovCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgKi8KKworI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpCisvKiE8IExpc3Qgb2YgZXh0ZXJuYWwgdHJpZ2dlcnMgd2l0aCBnZW5lcmljIHRyaWdnZXIgbmFtZSwgaW5kZXBlbmRlbnRseSBvZiAgICAqLworLyogQURDIHRhcmdldCAoY2F1dGlvbjogYXBwbGllcyB0byBvdGhlciBBRENzIHNoYXJpbmcgdGhlIHNhbWUgY29tbW9uIGdyb3VwKSwgKi8KKy8qIHNvcnRlZCBieSB0cmlnZ2VyIG5hbWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEV4dGVybmFsIHRyaWdnZXJzIG9mIGluamVjdGVkIGdyb3VwIGZvciBBREMxJkFEQzIgKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMV9DQzQgICAgICAgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1QxX0NDNAorI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxX1RSR08gICAgICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDFfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxX1RSR08yICAgICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDFfVFJHTzIKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMl9DQzEgICAgICAgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1QyX0NDMQorI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QyX1RSR08gICAgICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDJfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QzX0NDMSAgICAgICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDNfQ0MxCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDNfQ0MzICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UM19DQzMKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UM19DQzQgICAgICAgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1QzX0NDNAorI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QzX1RSR08gICAgICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDNfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q0X1RSR08gICAgICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDRfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q2X1RSR08gICAgICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDZfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q4X0NDNCAgICAgICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDhfQ0M0CisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDhfVFJHTyAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UOF9UUkdPCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDhfVFJHTzIgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UOF9UUkdPMgorI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxNV9UUkdPICAgICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDE1X1RSR08KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9FWFRfSVQxNSAgICAgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX0VYVF9JVDE1CisKKyNkZWZpbmUgQURDX0lOSkVDVEVEX1NPRlRXQVJFX1NUQVJUICAgICAoMHgwMDAwMDAwMVUpCisjZW5kaWYgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzI4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzM0eDgpCisvKiE8IExpc3Qgb2YgZXh0ZXJuYWwgdHJpZ2dlcnMgd2l0aCBnZW5lcmljIHRyaWdnZXIgbmFtZSwgaW5kZXBlbmRlbnRseSBvZiAgICAqLworLyogQURDIHRhcmdldCAoY2F1dGlvbjogYXBwbGllcyB0byBvdGhlciBBRENzIHNoYXJpbmcgdGhlIHNhbWUgY29tbW9uIGdyb3VwKSwgKi8KKy8qIHNvcnRlZCBieSB0cmlnZ2VyIG5hbWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEV4dGVybmFsIHRyaWdnZXJzIG9mIGluamVjdGVkIGdyb3VwIGZvciBBREMxJkFEQzIgKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMV9DQzQgICAgICAgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1QxX0NDNAorI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxX1RSR08gICAgICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDFfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxX1RSR08yICAgICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDFfVFJHTzIKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMl9DQzEgICAgICAgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1QyX0NDMQorI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QyX1RSR08gICAgICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDJfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QzX0NDMSAgICAgICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDNfQ0MxCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDNfQ0MzICAgICAgIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UM19DQzMKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UM19DQzQgICAgICAgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1QzX0NDNAorI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QzX1RSR08gICAgICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDNfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q2X1RSR08gICAgICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDZfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxNV9UUkdPICAgICBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDE1X1RSR08KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9IUlRJTV9UUkcyICAgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX0hSVElNX1RSRzIKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9IUlRJTV9UUkc0ICAgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX0hSVElNX1RSRzQKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9FWFRfSVQxNSAgICAgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX0VYVF9JVDE1CisKKyNkZWZpbmUgQURDX0lOSkVDVEVEX1NPRlRXQVJFX1NUQVJUICAgICAoMHgwMDAwMDAwMVUpCisjZW5kaWYgLyogU1RNMzJGMzM0eDggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisvKiBMaXN0IG9mIGV4dGVybmFsIHRyaWdnZXJzIHdpdGggZ2VuZXJpYyB0cmlnZ2VyIG5hbWUsIHNvcnRlZCBieSB0cmlnZ2VyICAgICAqLworLyogbmFtZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogRXh0ZXJuYWwgdHJpZ2dlcnMgb2YgaW5qZWN0ZWQgZ3JvdXAgZm9yIEFEQzEgKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMV9DQzQgICAgIEFEQzFfRVhURVJOQUxUUklHSU5KRUNfVDFfQ0M0CisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDFfVFJHTyAgICBBREMxX0VYVEVSTkFMVFJJR0lOSkVDX1QxX1RSR08KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMV9UUkdPMiAgIEFEQzFfRVhURVJOQUxUUklHSU5KRUNfVDFfVFJHTzIKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMl9DQzEgICAgIEFEQzFfRVhURVJOQUxUUklHSU5KRUNfVDJfQ0MxCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDJfVFJHTyAgICBBREMxX0VYVEVSTkFMVFJJR0lOSkVDX1QyX1RSR08KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UNl9UUkdPICAgIEFEQzFfRVhURVJOQUxUUklHSU5KRUNfVDZfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxNV9UUkdPICAgQURDMV9FWFRFUk5BTFRSSUdJTkpFQ19UMTVfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX0VYVF9JVDE1ICAgQURDMV9FWFRFUk5BTFRSSUdJTkpFQ19FWFRfSVQxNQorCisjZGVmaW5lIEFEQ19JTkpFQ1RFRF9TT0ZUV0FSRV9TVEFSVCAgICAgKDB4MDAwMDAwMDFVKQorI2VuZGlmIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgQURDRXhfQ29tbW9uX21vZGUgQURDIEV4dGVuZGVkIER1YWwgQURDIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfTU9ERV9JTkRFUEVOREVOVCAgICAgICAgICAgICAgICAgICgodWludDMyX3QpKDB4MDAwMDAwMDBVKSkKKyNkZWZpbmUgQURDX0RVQUxNT0RFX1JFR1NJTVVMVF9JTkpFQ1NJTVVMVCAgICAoKHVpbnQzMl90KShBREMxMl9DQ1JfTVVMVElfMCkpCisjZGVmaW5lIEFEQ19EVUFMTU9ERV9SRUdTSU1VTFRfQUxURVJUUklHICAgICAgKCh1aW50MzJfdCkoQURDMTJfQ0NSX01VTFRJXzEpKQorI2RlZmluZSBBRENfRFVBTE1PREVfUkVHSU5URVJMX0lOSkVDU0lNVUxUICAgICgodWludDMyX3QpKEFEQzEyX0NDUl9NVUxUSV8xIHwgQURDMTJfQ0NSX01VTFRJXzApKQorI2RlZmluZSBBRENfRFVBTE1PREVfSU5KRUNTSU1VTFQgICAgICAgICAgICAgICgodWludDMyX3QpKEFEQzEyX0NDUl9NVUxUSV8yIHwgQURDMTJfQ0NSX01VTFRJXzApKQorI2RlZmluZSBBRENfRFVBTE1PREVfUkVHU0lNVUxUICAgICAgICAgICAgICAgICgodWludDMyX3QpKEFEQzEyX0NDUl9NVUxUSV8yIHwgQURDMTJfQ0NSX01VTFRJXzEpKQorI2RlZmluZSBBRENfRFVBTE1PREVfSU5URVJMICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpKEFEQzEyX0NDUl9NVUxUSV8yIHwgQURDMTJfQ0NSX01VTFRJXzEgfCBBREMxMl9DQ1JfTVVMVElfMCkpCisjZGVmaW5lIEFEQ19EVUFMTU9ERV9BTFRFUlRSSUcgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoQURDMTJfQ0NSX01VTFRJXzMgfCBBREMxMl9DQ1JfTVVMVElfMCkpCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgQURDRXhfRGlyZWN0X21lbW9yeV9hY2Nlc3NfbW9kZV9mb3JfbXVsdGltb2RlIEFEQyBFeHRlbmRlZCBETUEgTW9kZSBmb3IgRHVhbCBBREMgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19ETUFBQ0NFU1NNT0RFX0RJU0FCTEVEICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgIC8qITwgRE1BIG11bHRpbW9kZSBkaXNhYmxlZDogZWFjaCBBREMgd2lsbCB1c2UgaXRzIG93biBETUEgY2hhbm5lbCAqLworI2RlZmluZSBBRENfRE1BQUNDRVNTTU9ERV8xMl8xMF9CSVRTICAgICgodWludDMyX3QpQURDMTJfQ0NSX01ETUFfMSkgICAvKiE8IERNQSBtdWx0aW1vZGUgZW5hYmxlZCAob25lIERNQSBjaGFubmVsIGZvciBib3RoIEFEQywgRE1BIG9mIEFEQyBtYXN0ZXIpIGZvciAxMiBhbmQgMTAgYml0cyByZXNvbHV0aW9uICovCisjZGVmaW5lIEFEQ19ETUFBQ0NFU1NNT0RFXzhfNl9CSVRTICAgICAgKCh1aW50MzJfdClBREMxMl9DQ1JfTURNQSkgICAgIC8qITwgRE1BIG11bHRpbW9kZSBlbmFibGVkIChvbmUgRE1BIGNoYW5uZWwgZm9yIGJvdGggQURDLCBETUEgb2YgQURDIG1hc3RlcikgZm9yIDggYW5kIDYgYml0cyByZXNvbHV0aW9uICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ0V4X2RlbGF5X2JldHdlZW5fMl9zYW1wbGluZ19waGFzZXMgQURDIEV4dGVuZGVkIERlbGF5IEJldHdlZW4gMiBTYW1wbGluZyBQaGFzZXMKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfVFdPU0FNUExJTkdERUxBWV8xQ1lDTEUgICAgICgodWludDMyX3QpKDB4MDAwMDAwMDBVKSkKKyNkZWZpbmUgQURDX1RXT1NBTVBMSU5HREVMQVlfMkNZQ0xFUyAgICAoKHVpbnQzMl90KShBREMxMl9DQ1JfREVMQVlfMCkpCisjZGVmaW5lIEFEQ19UV09TQU1QTElOR0RFTEFZXzNDWUNMRVMgICAgKCh1aW50MzJfdCkoQURDMTJfQ0NSX0RFTEFZXzEpKQorI2RlZmluZSBBRENfVFdPU0FNUExJTkdERUxBWV80Q1lDTEVTICAgICgodWludDMyX3QpKEFEQzEyX0NDUl9ERUxBWV8xIHwgQURDMTJfQ0NSX0RFTEFZXzApKQorI2RlZmluZSBBRENfVFdPU0FNUExJTkdERUxBWV81Q1lDTEVTICAgICgodWludDMyX3QpKEFEQzEyX0NDUl9ERUxBWV8yKSkKKyNkZWZpbmUgQURDX1RXT1NBTVBMSU5HREVMQVlfNkNZQ0xFUyAgICAoKHVpbnQzMl90KShBREMxMl9DQ1JfREVMQVlfMiB8IEFEQzEyX0NDUl9ERUxBWV8wKSkKKyNkZWZpbmUgQURDX1RXT1NBTVBMSU5HREVMQVlfN0NZQ0xFUyAgICAoKHVpbnQzMl90KShBREMxMl9DQ1JfREVMQVlfMiB8IEFEQzEyX0NDUl9ERUxBWV8xKSkKKyNkZWZpbmUgQURDX1RXT1NBTVBMSU5HREVMQVlfOENZQ0xFUyAgICAoKHVpbnQzMl90KShBREMxMl9DQ1JfREVMQVlfMiB8IEFEQzEyX0NDUl9ERUxBWV8xIHwgQURDMTJfQ0NSX0RFTEFZXzApKQorI2RlZmluZSBBRENfVFdPU0FNUExJTkdERUxBWV85Q1lDTEVTICAgICgodWludDMyX3QpKEFEQzEyX0NDUl9ERUxBWV8zKSkKKyNkZWZpbmUgQURDX1RXT1NBTVBMSU5HREVMQVlfMTBDWUNMRVMgICAoKHVpbnQzMl90KShBREMxMl9DQ1JfREVMQVlfMyB8IEFEQzEyX0NDUl9ERUxBWV8wKSkKKyNkZWZpbmUgQURDX1RXT1NBTVBMSU5HREVMQVlfMTFDWUNMRVMgICAoKHVpbnQzMl90KShBREMxMl9DQ1JfREVMQVlfMyB8IEFEQzEyX0NDUl9ERUxBWV8xKSkKKyNkZWZpbmUgQURDX1RXT1NBTVBMSU5HREVMQVlfMTJDWUNMRVMgICAoKHVpbnQzMl90KShBREMxMl9DQ1JfREVMQVlfMyB8IEFEQzEyX0NDUl9ERUxBWV8xIHwgQURDMTJfQ0NSX0RFTEFZXzApKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENFeF9hbmFsb2dfd2F0Y2hkb2dfbnVtYmVyIEFEQyBFeHRlbmRlZCBBbmFsb2cgV2F0Y2hkb2cgU2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX0FOQUxPR1dBVENIRE9HXzEgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxVSkKKyNkZWZpbmUgQURDX0FOQUxPR1dBVENIRE9HXzIgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAyVSkKKyNkZWZpbmUgQURDX0FOQUxPR1dBVENIRE9HXzMgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAzVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDRXhfYW5hbG9nX3dhdGNoZG9nX21vZGUgQURDIEV4dGVuZGVkIEFuYWxvZyBXYXRjaGRvZyBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX0FOQUxPR1dBVENIRE9HX05PTkUgICAgICAgICAgICAgICAgICggMHgwMDAwMDAwMFUpCisjZGVmaW5lIEFEQ19BTkFMT0dXQVRDSERPR19TSU5HTEVfUkVHICAgICAgICAgICAoKHVpbnQzMl90KShBRENfQ0ZHUl9BV0QxU0dMIHwgQURDX0NGR1JfQVdEMUVOKSkKKyNkZWZpbmUgQURDX0FOQUxPR1dBVENIRE9HX1NJTkdMRV9JTkpFQyAgICAgICAgICgodWludDMyX3QpKEFEQ19DRkdSX0FXRDFTR0wgfCBBRENfQ0ZHUl9KQVdEMUVOKSkKKyNkZWZpbmUgQURDX0FOQUxPR1dBVENIRE9HX1NJTkdMRV9SRUdJTkpFQyAgICAgICgodWludDMyX3QpKEFEQ19DRkdSX0FXRDFTR0wgfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9KQVdEMUVOKSkKKyNkZWZpbmUgQURDX0FOQUxPR1dBVENIRE9HX0FMTF9SRUcgICAgICAgICAgICAgICgodWludDMyX3QpIEFEQ19DRkdSX0FXRDFFTikKKyNkZWZpbmUgQURDX0FOQUxPR1dBVENIRE9HX0FMTF9JTkpFQyAgICAgICAgICAgICgodWludDMyX3QpIEFEQ19DRkdSX0pBV0QxRU4pCisjZGVmaW5lIEFEQ19BTkFMT0dXQVRDSERPR19BTExfUkVHSU5KRUMgICAgICAgICAoKHVpbnQzMl90KShBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9KQVdEMUVOKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX2NvbnZlcnNpb25fZ3JvdXAgQURDIENvbnZlcnNpb24gR3JvdXAKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfUkVHVUxBUl9HUk9VUCAgICAgICAgICAgICAoKHVpbnQzMl90KShBRENfRkxBR19FT0MgfCBBRENfRkxBR19FT1MpKQorI2RlZmluZSBBRENfSU5KRUNURURfR1JPVVAgICAgICAgICAgICAoKHVpbnQzMl90KShBRENfRkxBR19KRU9DIHwgQURDX0ZMQUdfSkVPUykpCisjZGVmaW5lIEFEQ19SRUdVTEFSX0lOSkVDVEVEX0dST1VQICAgICgodWludDMyX3QpKEFEQ19GTEFHX0VPQyB8IEFEQ19GTEFHX0VPUyB8IEFEQ19GTEFHX0pFT0MgfCBBRENfRkxBR19KRU9TKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENFeF9FdmVudF90eXBlIEFEQyBFeHRlbmRlZCBFdmVudCBUeXBlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX0FXRDFfRVZFTlQgICAgICAgICAgICgodWludDMyX3QpQURDX0ZMQUdfQVdEMSkgIC8qITwgQURDIEFuYWxvZyB3YXRjaGRvZyAxIGV2ZW50IChtYWluIGFuYWxvZyB3YXRjaGRvZywgcHJlc2VudCBvbiBhbGwgU1RNMzIgZGV2aWNlcykgKi8KKyNkZWZpbmUgQURDX0FXRDJfRVZFTlQgICAgICAgICAgICgodWludDMyX3QpQURDX0ZMQUdfQVdEMikgIC8qITwgQURDIEFuYWxvZyB3YXRjaGRvZyAyIGV2ZW50IChhZGRpdGlvbmFsIGFuYWxvZyB3YXRjaGRvZywgbm90IHByZXNlbnQgb24gYWxsIFNUTTMyIGZhbWlsaWVzKSAqLworI2RlZmluZSBBRENfQVdEM19FVkVOVCAgICAgICAgICAgKCh1aW50MzJfdClBRENfRkxBR19BV0QzKSAgLyohPCBBREMgQW5hbG9nIHdhdGNoZG9nIDMgZXZlbnQgKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nLCBub3QgcHJlc2VudCBvbiBhbGwgU1RNMzIgZmFtaWxpZXMpICovCisjZGVmaW5lIEFEQ19PVlJfRVZFTlQgICAgICAgICAgICAoKHVpbnQzMl90KUFEQ19GTEFHX09WUikgICAvKiE8IEFEQyBvdmVycnVuIGV2ZW50ICovCisjZGVmaW5lIEFEQ19KUU9WRl9FVkVOVCAgICAgICAgICAoKHVpbnQzMl90KUFEQ19GTEFHX0pRT1ZGKSAvKiE8IEFEQyBJbmplY3RlZCBDb250ZXh0IFF1ZXVlIE92ZXJmbG93IGV2ZW50ICovCisKKyNkZWZpbmUgQURDX0FXRF9FVkVOVCAgICAgICAgICAgIEFEQ19BV0QxX0VWRU5UICAgICAgICAgLyogQURDIEFuYWxvZyB3YXRjaGRvZyAxIGV2ZW50OiBBbHRlcm5hdGUgbmFtaW5nIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgU1RNMzIgZGV2aWNlcyBoYXZpbmcgb25seSAxIGFuYWxvZyB3YXRjaGRvZyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENFeF9pbnRlcnJ1cHRzX2RlZmluaXRpb24gQURDIEV4dGVuZGVkIEludGVycnVwdHMgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19JVF9SRFkgICAgICAgICAgIEFEQ19JRVJfUkRZICAgICAgICAvKiE8IEFEQyBSZWFkeSAoQURSRFkpIGludGVycnVwdCBzb3VyY2UgKi8KKyNkZWZpbmUgQURDX0lUX0VPU01QICAgICAgICAgQURDX0lFUl9FT1NNUCAgICAgIC8qITwgQURDIEVuZCBvZiBTYW1wbGluZyBpbnRlcnJ1cHQgc291cmNlICovCisjZGVmaW5lIEFEQ19JVF9FT0MgICAgICAgICAgIEFEQ19JRVJfRU9DICAgICAgICAvKiE8IEFEQyBFbmQgb2YgUmVndWxhciBDb252ZXJzaW9uIGludGVycnVwdCBzb3VyY2UgKi8KKyNkZWZpbmUgQURDX0lUX0VPUyAgICAgICAgICAgQURDX0lFUl9FT1MgICAgICAgIC8qITwgQURDIEVuZCBvZiBSZWd1bGFyIHNlcXVlbmNlIG9mIENvbnZlcnNpb25zIGludGVycnVwdCBzb3VyY2UgKi8KKyNkZWZpbmUgQURDX0lUX09WUiAgICAgICAgICAgQURDX0lFUl9PVlIgICAgICAgIC8qITwgQURDIG92ZXJydW4gaW50ZXJydXB0IHNvdXJjZSAqLworI2RlZmluZSBBRENfSVRfSkVPQyAgICAgICAgICBBRENfSUVSX0pFT0MgICAgICAgLyohPCBBREMgRW5kIG9mIEluamVjdGVkIENvbnZlcnNpb24gaW50ZXJydXB0IHNvdXJjZSAqLworI2RlZmluZSBBRENfSVRfSkVPUyAgICAgICAgICBBRENfSUVSX0pFT1MgICAgICAgLyohPCBBREMgRW5kIG9mIEluamVjdGVkIHNlcXVlbmNlIG9mIENvbnZlcnNpb25zIGludGVycnVwdCBzb3VyY2UgKi8KKyNkZWZpbmUgQURDX0lUX0FXRDEgICAgICAgICAgQURDX0lFUl9BV0QxICAgICAgIC8qITwgQURDIEFuYWxvZyB3YXRjaGRvZyAxIGludGVycnVwdCBzb3VyY2UgKG1haW4gYW5hbG9nIHdhdGNoZG9nLCBwcmVzZW50IG9uIGFsbCBTVE0zMiBkZXZpY2VzKSAqLworI2RlZmluZSBBRENfSVRfQVdEMiAgICAgICAgICBBRENfSUVSX0FXRDIgICAgICAgLyohPCBBREMgQW5hbG9nIHdhdGNoZG9nIDIgaW50ZXJydXB0IHNvdXJjZSAoYWRkaXRpb25hbCBhbmFsb2cgd2F0Y2hkb2csIHByZXNlbnQgb25seSBvbiBTVE0zMkYzIGRldmljZXMpICovCisjZGVmaW5lIEFEQ19JVF9BV0QzICAgICAgICAgIEFEQ19JRVJfQVdEMyAgICAgICAvKiE8IEFEQyBBbmFsb2cgd2F0Y2hkb2cgMyBpbnRlcnJ1cHQgc291cmNlIChhZGRpdGlvbmFsIGFuYWxvZyB3YXRjaGRvZywgcHJlc2VudCBvbmx5IG9uIFNUTTMyRjMgZGV2aWNlcykgKi8KKyNkZWZpbmUgQURDX0lUX0pRT1ZGICAgICAgICAgQURDX0lFUl9KUU9WRiAgICAgIC8qITwgQURDIEluamVjdGVkIENvbnRleHQgUXVldWUgT3ZlcmZsb3cgaW50ZXJydXB0IHNvdXJjZSAqLworCisjZGVmaW5lIEFEQ19JVF9BV0QgICAgICAgICAgIEFEQ19JVF9BV0QxICAgICAgICAvKiBBREMgQW5hbG9nIHdhdGNoZG9nIDEgaW50ZXJydXB0IHNvdXJjZTogQWx0ZXJuYXRlIG5hbWluZyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIFNUTTMyIGRldmljZXMgaGF2aW5nIG9ubHkgMSBhbmFsb2cgd2F0Y2hkb2cgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDRXhfZmxhZ3NfZGVmaW5pdGlvbiBBREMgRXh0ZW5kZWQgRmxhZ3MgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19GTEFHX1JEWSAgICAgICAgICAgQURDX0lTUl9BRFJEICAgICAvKiE8IEFEQyBSZWFkeSAoQURSRFkpIGZsYWcgKi8KKyNkZWZpbmUgQURDX0ZMQUdfRU9TTVAgICAgICAgICBBRENfSVNSX0VPU01QICAgIC8qITwgQURDIEVuZCBvZiBTYW1wbGluZyBmbGFnICovCisjZGVmaW5lIEFEQ19GTEFHX0VPQyAgICAgICAgICAgQURDX0lTUl9FT0MgICAgICAvKiE8IEFEQyBFbmQgb2YgUmVndWxhciBDb252ZXJzaW9uIGZsYWcgKi8KKyNkZWZpbmUgQURDX0ZMQUdfRU9TICAgICAgICAgICBBRENfSVNSX0VPUyAgICAgIC8qITwgQURDIEVuZCBvZiBSZWd1bGFyIHNlcXVlbmNlIG9mIENvbnZlcnNpb25zIGZsYWcgKi8KKyNkZWZpbmUgQURDX0ZMQUdfT1ZSICAgICAgICAgICBBRENfSVNSX09WUiAgICAgIC8qITwgQURDIG92ZXJydW4gZmxhZyAqLworI2RlZmluZSBBRENfRkxBR19KRU9DICAgICAgICAgIEFEQ19JU1JfSkVPQyAgICAgLyohPCBBREMgRW5kIG9mIEluamVjdGVkIENvbnZlcnNpb24gZmxhZyAqLworI2RlZmluZSBBRENfRkxBR19KRU9TICAgICAgICAgIEFEQ19JU1JfSkVPUyAgICAgLyohPCBBREMgRW5kIG9mIEluamVjdGVkIHNlcXVlbmNlIG9mIENvbnZlcnNpb25zIGZsYWcgKi8KKyNkZWZpbmUgQURDX0ZMQUdfQVdEMSAgICAgICAgICBBRENfSVNSX0FXRDEgICAgIC8qITwgQURDIEFuYWxvZyB3YXRjaGRvZyAxIGZsYWcgKG1haW4gYW5hbG9nIHdhdGNoZG9nLCBwcmVzZW50IG9uIGFsbCBTVE0zMiBkZXZpY2VzKSAqLworI2RlZmluZSBBRENfRkxBR19BV0QyICAgICAgICAgIEFEQ19JU1JfQVdEMiAgICAgLyohPCBBREMgQW5hbG9nIHdhdGNoZG9nIDIgZmxhZyAoYWRkaXRpb25hbCBhbmFsb2cgd2F0Y2hkb2csIHByZXNlbnQgb25seSBvbiBTVE0zMkYzIGRldmljZXMpICovCisjZGVmaW5lIEFEQ19GTEFHX0FXRDMgICAgICAgICAgQURDX0lTUl9BV0QzICAgICAvKiE8IEFEQyBBbmFsb2cgd2F0Y2hkb2cgMyBmbGFnIChhZGRpdGlvbmFsIGFuYWxvZyB3YXRjaGRvZywgcHJlc2VudCBvbmx5IG9uIFNUTTMyRjMgZGV2aWNlcykgKi8KKyNkZWZpbmUgQURDX0ZMQUdfSlFPVkYgICAgICAgICBBRENfSVNSX0pRT1ZGICAgIC8qITwgQURDIEluamVjdGVkIENvbnRleHQgUXVldWUgT3ZlcmZsb3cgZmxhZyAqLworCisjZGVmaW5lIEFEQ19GTEFHX0FXRCAgICAgICAgICAgQURDX0ZMQUdfQVdEMSAgICAvKiBBREMgQW5hbG9nIHdhdGNoZG9nIDEgZmxhZzogQWx0ZXJuYXRlIG5hbWluZyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIFNUTTMyIGRldmljZXMgaGF2aW5nIG9ubHkgMSBhbmFsb2cgd2F0Y2hkb2cgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworCisKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorLyoqIEBkZWZncm91cCBBRENFeF9EYXRhX2FsaWduIEFEQyBFeHRlbmRlZCBEYXRhIEFsaWdubWVudAorICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19EQVRBQUxJR05fUklHSFQgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIEFEQ19EQVRBQUxJR05fTEVGVCAgICAgICAoKHVpbnQzMl90KUFEQ19DUjJfQUxJR04pCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ0V4X1NjYW5fbW9kZSBBREMgRXh0ZW5kZWQgU2NhbiBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX1NDQU5fRElTQUJMRSAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgQURDX1NDQU5fRU5BQkxFICAgICAgICAgICgodWludDMyX3QpQURDX0NSMV9TQ0FOKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENFeF9FeHRlcm5hbF90cmlnZ2VyX2VkZ2VfUmVndWxhciBBREMgRXh0ZW5kZWQgRXh0ZXJuYWwgdHJpZ2dlciBlbmFibGUgZm9yIHJlZ3VsYXIgZ3JvdXAKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfTk9ORSAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfUklTSU5HICAgICAgICAgKCh1aW50MzJfdClBRENfQ1IyX0VYVFRSSUcpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ0V4X0V4dGVybmFsX3RyaWdnZXJfc291cmNlX1JlZ3VsYXIgQURDIEV4dGVuZGVkIEV4dGVybmFsIHRyaWdnZXIgc2VsZWN0aW9uIGZvciByZWd1bGFyIGdyb3VwCisgICogQHsKKyAgKi8KKy8qIExpc3Qgb2YgZXh0ZXJuYWwgdHJpZ2dlcnMgd2l0aCBnZW5lcmljIHRyaWdnZXIgbmFtZSwgc29ydGVkIGJ5IHRyaWdnZXIgICAgICovCisvKiBuYW1lOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBFeHRlcm5hbCB0cmlnZ2VycyBvZiByZWd1bGFyIGdyb3VwIGZvciBBREMxICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyX0NDMiAgICAgIEFEQ19FWFRFUk5BTFRSSUdfVDJfQ0MyCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QzX1RSR08gICAgIEFEQ19FWFRFUk5BTFRSSUdfVDNfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVl9UNF9DQzQgICAgICBBRENfRVhURVJOQUxUUklHX1Q0X0NDNAorI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVl9UMTlfVFJHTyAgICBBRENfRVhURVJOQUxUUklHX1QxOV9UUkdPCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxOV9DQzMgICAgIEFEQ19FWFRFUk5BTFRSSUdfVDE5X0NDMworI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVl9UMTlfQ0M0ICAgICBBRENfRVhURVJOQUxUUklHX1QxOV9DQzQKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZfRVhUX0lUMTEgICAgQURDX0VYVEVSTkFMVFJJR19FWFRfSVQxMQorI2RlZmluZSBBRENfU09GVFdBUkVfU1RBUlQgICAgICAgICAgICAgICBBRENfU1dTVEFSVAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENFeF9jaGFubmVscyBBREMgRXh0ZW5kZWQgQ2hhbm5lbHMKKyAgKiBAeworICAqLworLyogTm90ZTogRGVwZW5kaW5nIG9uIGRldmljZXMsIHNvbWUgY2hhbm5lbHMgbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gcGFja2FnZSAgKi8KKy8qICAgICAgIHBpbnMuIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4gICAgICAgICAgICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMSAgICAgICAgICAgKCh1aW50MzJfdCkoQURDX1NRUjNfU1ExXzApKQorI2RlZmluZSBBRENfQ0hBTk5FTF8yICAgICAgICAgICAoKHVpbnQzMl90KShBRENfU1FSM19TUTFfMSkpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzMgICAgICAgICAgICgodWludDMyX3QpKEFEQ19TUVIzX1NRMV8xIHwgQURDX1NRUjNfU1ExXzApKQorI2RlZmluZSBBRENfQ0hBTk5FTF80ICAgICAgICAgICAoKHVpbnQzMl90KShBRENfU1FSM19TUTFfMikpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzUgICAgICAgICAgICgodWludDMyX3QpKEFEQ19TUVIzX1NRMV8yIHwgQURDX1NRUjNfU1ExXzApKQorI2RlZmluZSBBRENfQ0hBTk5FTF82ICAgICAgICAgICAoKHVpbnQzMl90KShBRENfU1FSM19TUTFfMiB8IEFEQ19TUVIzX1NRMV8xKSkKKyNkZWZpbmUgQURDX0NIQU5ORUxfNyAgICAgICAgICAgKCh1aW50MzJfdCkoQURDX1NRUjNfU1ExXzIgfCBBRENfU1FSM19TUTFfMSB8IEFEQ19TUVIzX1NRMV8wKSkKKyNkZWZpbmUgQURDX0NIQU5ORUxfOCAgICAgICAgICAgKCh1aW50MzJfdCkoQURDX1NRUjNfU1ExXzMpKQorI2RlZmluZSBBRENfQ0hBTk5FTF85ICAgICAgICAgICAoKHVpbnQzMl90KShBRENfU1FSM19TUTFfMyB8IEFEQ19TUVIzX1NRMV8wKSkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTAgICAgICAgICAgKCh1aW50MzJfdCkoQURDX1NRUjNfU1ExXzMgfCBBRENfU1FSM19TUTFfMSkpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzExICAgICAgICAgICgodWludDMyX3QpKEFEQ19TUVIzX1NRMV8zIHwgQURDX1NRUjNfU1ExXzEgfCBBRENfU1FSM19TUTFfMCkpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzEyICAgICAgICAgICgodWludDMyX3QpKEFEQ19TUVIzX1NRMV8zIHwgQURDX1NRUjNfU1ExXzIpKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xMyAgICAgICAgICAoKHVpbnQzMl90KShBRENfU1FSM19TUTFfMyB8IEFEQ19TUVIzX1NRMV8yIHwgQURDX1NRUjNfU1ExXzApKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xNCAgICAgICAgICAoKHVpbnQzMl90KShBRENfU1FSM19TUTFfMyB8IEFEQ19TUVIzX1NRMV8yIHwgQURDX1NRUjNfU1ExXzEpKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xNSAgICAgICAgICAoKHVpbnQzMl90KShBRENfU1FSM19TUTFfMyB8IEFEQ19TUVIzX1NRMV8yIHwgQURDX1NRUjNfU1ExXzEgfCBBRENfU1FSM19TUTFfMCkpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE2ICAgICAgICAgICgodWludDMyX3QpKEFEQ19TUVIzX1NRMV80KSkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTcgICAgICAgICAgKCh1aW50MzJfdCkoQURDX1NRUjNfU1ExXzQgfCBBRENfU1FSM19TUTFfMCkpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE4ICAgICAgICAgICgodWludDMyX3QpKEFEQ19TUVIzX1NRMV80IHwgQURDX1NRUjNfU1ExXzEpKQorCisjZGVmaW5lIEFEQ19DSEFOTkVMX1RFTVBTRU5TT1IgIEFEQ19DSEFOTkVMXzE2CisjZGVmaW5lIEFEQ19DSEFOTkVMX1ZSRUZJTlQgICAgIEFEQ19DSEFOTkVMXzE3CisjZGVmaW5lIEFEQ19DSEFOTkVMX1ZCQVQgICAgICAgIEFEQ19DSEFOTkVMXzE4CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ0V4X3NhbXBsaW5nX3RpbWVzIEFEQyBFeHRlbmRlZCBTYW1wbGluZyBUaW1lcworICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19TQU1QTEVUSU1FXzFDWUNMRV81ICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTYW1wbGluZyB0aW1lIDEuNSBBREMgY2xvY2sgY3ljbGUgKi8KKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfN0NZQ0xFU181ICAgICAgKCh1aW50MzJfdCkgQURDX1NNUFIyX1NNUDBfMCkgICAgICAgICAgICAgICAgICAgICAvKiE8IFNhbXBsaW5nIHRpbWUgNy41IEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfMTNDWUNMRVNfNSAgICAgKCh1aW50MzJfdCkgQURDX1NNUFIyX1NNUDBfMSkgICAgICAgICAgICAgICAgICAgICAvKiE8IFNhbXBsaW5nIHRpbWUgMTMuNSBBREMgY2xvY2sgY3ljbGVzICovCisjZGVmaW5lIEFEQ19TQU1QTEVUSU1FXzI4Q1lDTEVTXzUgICAgICgodWludDMyX3QpKEFEQ19TTVBSMl9TTVAwXzEgfCBBRENfU01QUjJfU01QMF8wKSkgLyohPCBTYW1wbGluZyB0aW1lIDI4LjUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBBRENfU0FNUExFVElNRV80MUNZQ0xFU181ICAgICAoKHVpbnQzMl90KSBBRENfU01QUjJfU01QMF8yKSAgICAgICAgICAgICAgICAgICAgIC8qITwgU2FtcGxpbmcgdGltZSA0MS41IEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfNTVDWUNMRVNfNSAgICAgKCh1aW50MzJfdCkoQURDX1NNUFIyX1NNUDBfMiB8IEFEQ19TTVBSMl9TTVAwXzApKSAvKiE8IFNhbXBsaW5nIHRpbWUgNTUuNSBBREMgY2xvY2sgY3ljbGVzICovCisjZGVmaW5lIEFEQ19TQU1QTEVUSU1FXzcxQ1lDTEVTXzUgICAgICgodWludDMyX3QpKEFEQ19TTVBSMl9TTVAwXzIgfCBBRENfU01QUjJfU01QMF8xKSkgLyohPCBTYW1wbGluZyB0aW1lIDcxLjUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBBRENfU0FNUExFVElNRV8yMzlDWUNMRVNfNSAgICAoKHVpbnQzMl90KSBBRENfU01QUjJfU01QMCkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU2FtcGxpbmcgdGltZSAyMzkuNSBBREMgY2xvY2sgY3ljbGVzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ0V4X3JlZ3VsYXJfcmFuayBBREMgRXh0ZW5kZWQgcmFuayBpbnRvIHJlZ3VsYXIgZ3JvdXAKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzEgICAgKDB4MDAwMDAwMDFVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzIgICAgKDB4MDAwMDAwMDJVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzMgICAgKDB4MDAwMDAwMDNVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzQgICAgKDB4MDAwMDAwMDRVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzUgICAgKDB4MDAwMDAwMDVVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzYgICAgKDB4MDAwMDAwMDZVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzcgICAgKDB4MDAwMDAwMDdVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzggICAgKDB4MDAwMDAwMDhVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzkgICAgKDB4MDAwMDAwMDlVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzEwICAgKDB4MDAwMDAwMEFVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzExICAgKDB4MDAwMDAwMEJVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzEyICAgKDB4MDAwMDAwMENVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzEzICAgKDB4MDAwMDAwMERVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzE0ICAgKDB4MDAwMDAwMEVVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzE1ICAgKDB4MDAwMDAwMEZVKQorI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzE2ICAgKDB4MDAwMDAwMTBVKQorLyoqCisgICogQH0KKyAgKi8KKyAgICAgICAKKy8qKiBAZGVmZ3JvdXAgQURDRXhfaW5qZWN0ZWRfcmFuayBBREMgRXh0ZW5kZWQgSW5qZWN0ZWQgQ2hhbm5lbCBSYW5rCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX0lOSkVDVEVEX1JBTktfMSAgICAoMHgwMDAwMDAwMVUpCisjZGVmaW5lIEFEQ19JTkpFQ1RFRF9SQU5LXzIgICAgKDB4MDAwMDAwMDJVKQorI2RlZmluZSBBRENfSU5KRUNURURfUkFOS18zICAgICgweDAwMDAwMDAzVSkKKyNkZWZpbmUgQURDX0lOSkVDVEVEX1JBTktfNCAgICAoMHgwMDAwMDAwNFUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ0V4X0V4dGVybmFsX3RyaWdnZXJfZWRnZV9JbmplY3RlZCBFeHRlcm5hbCBUcmlnZ2VyIEVkZ2Ugb2YgSW5qZWN0ZWQgR3JvdXAKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX0VER0VfTk9ORSAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX0VER0VfUklTSU5HICAgICAgICAgKCh1aW50MzJfdClBRENfQ1IyX0pFWFRUUklHKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENFeF9FeHRlcm5hbF90cmlnZ2VyX3NvdXJjZV9JbmplY3RlZCBFeHRlcm5hbCBUcmlnZ2VyIFNvdXJjZSBvZiBJbmplY3RlZCBHcm91cAorICAqIEB7CisgICovCisvKiBFeHRlcm5hbCB0cmlnZ2VycyBmb3IgaW5qZWN0ZWQgZ3JvdXBzIG9mIEFEQzEgKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMl9DQzEgICAgICAgQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QyX0NDMQorI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QyX1RSR08gICAgICBBRENfRVhURVJOQUxUUklHSU5KRUNfVDJfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QzX0NDNCAgICAgICBBRENfRVhURVJOQUxUUklHSU5KRUNfVDNfQ0M0CisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDRfVFJHTyAgICAgIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UNF9UUkdPCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDE5X0NDMSAgICAgIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMTlfQ0MxCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDE5X0NDMiAgICAgIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMTlfQ0MyCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfRVhUX0lUMTUgICAgIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19FWFRfSVQxNQorI2RlZmluZSBBRENfSU5KRUNURURfU09GVFdBUkVfU1RBUlQgICAgICAgICAgICBBRENfSlNXU1RBUlQKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBBRENFeF9hbmFsb2dfd2F0Y2hkb2dfbW9kZSBBREMgRXh0ZW5kZWQgYW5hbG9nIHdhdGNoZG9nIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfQU5BTE9HV0FUQ0hET0dfTk9ORSAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX1JFRyAgICAgICAgICAgKCh1aW50MzJfdCkoQURDX0NSMV9BV0RTR0wgfCBBRENfQ1IxX0FXREVOKSkKKyNkZWZpbmUgQURDX0FOQUxPR1dBVENIRE9HX1NJTkdMRV9JTkpFQyAgICAgICAgICgodWludDMyX3QpKEFEQ19DUjFfQVdEU0dMIHwgQURDX0NSMV9KQVdERU4pKQorI2RlZmluZSBBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX1JFR0lOSkVDICAgICAgKCh1aW50MzJfdCkoQURDX0NSMV9BV0RTR0wgfCBBRENfQ1IxX0FXREVOIHwgQURDX0NSMV9KQVdERU4pKQorI2RlZmluZSBBRENfQU5BTE9HV0FUQ0hET0dfQUxMX1JFRyAgICAgICAgICAgICAgKCh1aW50MzJfdCkgQURDX0NSMV9BV0RFTikKKyNkZWZpbmUgQURDX0FOQUxPR1dBVENIRE9HX0FMTF9JTkpFQyAgICAgICAgICAgICgodWludDMyX3QpIEFEQ19DUjFfSkFXREVOKQorI2RlZmluZSBBRENfQU5BTE9HV0FUQ0hET0dfQUxMX1JFR0lOSkVDICAgICAgICAgKCh1aW50MzJfdCkoQURDX0NSMV9BV0RFTiB8IEFEQ19DUjFfSkFXREVOKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX2NvbnZlcnNpb25fZ3JvdXAgQURDIENvbnZlcnNpb24gR3JvdXAKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfUkVHVUxBUl9HUk9VUCAgICAgICAgICAgICAoKHVpbnQzMl90KShBRENfRkxBR19FT0MpKQorI2RlZmluZSBBRENfSU5KRUNURURfR1JPVVAgICAgICAgICAgICAoKHVpbnQzMl90KShBRENfRkxBR19KRU9DKSkKKyNkZWZpbmUgQURDX1JFR1VMQVJfSU5KRUNURURfR1JPVVAgICAgKCh1aW50MzJfdCkoQURDX0ZMQUdfRU9DIHwgQURDX0ZMQUdfSkVPQykpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ0V4X0V2ZW50X3R5cGUgQURDIEV4dGVuZGVkIEV2ZW50IFR5cGUKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfQVdEX0VWRU5UICAgICAgICAgICAgICAgKCh1aW50MzJfdClBRENfRkxBR19BV0QpICAgLyohPCBBREMgQW5hbG9nIHdhdGNoZG9nIGV2ZW50ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ0V4X2ludGVycnVwdHNfZGVmaW5pdGlvbiBBREMgRXh0ZW5kZWQgSW50ZXJydXB0cyBEZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX0lUX0VPQyAgICAgICAgICAgQURDX0NSMV9FT0NJRSAgICAgICAgLyohPCBBREMgRW5kIG9mIFJlZ3VsYXIgQ29udmVyc2lvbiBpbnRlcnJ1cHQgc291cmNlICovCisjZGVmaW5lIEFEQ19JVF9KRU9DICAgICAgICAgIEFEQ19DUjFfSkVPQ0lFICAgICAgIC8qITwgQURDIEVuZCBvZiBJbmplY3RlZCBDb252ZXJzaW9uIGludGVycnVwdCBzb3VyY2UgKi8KKyNkZWZpbmUgQURDX0lUX0FXRCAgICAgICAgICAgQURDX0NSMV9BV0RJRSAgICAgICAgLyohPCBBREMgQW5hbG9nIHdhdGNoZG9nIGludGVycnVwdCBzb3VyY2UgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDRXhfZmxhZ3NfZGVmaW5pdGlvbiBBREMgRXh0ZW5kZWQgRmxhZ3MgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19GTEFHX0FXRCAgICAgICAgICAgQURDX1NSX0FXRCAgICAgIC8qITwgQURDIEFuYWxvZyB3YXRjaGRvZyBmbGFnICovCisjZGVmaW5lIEFEQ19GTEFHX0VPQyAgICAgICAgICAgQURDX1NSX0VPQyAgICAgIC8qITwgQURDIEVuZCBvZiBSZWd1bGFyIGNvbnZlcnNpb24gZmxhZyAqLworI2RlZmluZSBBRENfRkxBR19KRU9DICAgICAgICAgIEFEQ19TUl9KRU9DICAgICAvKiE8IEFEQyBFbmQgb2YgSW5qZWN0ZWQgY29udmVyc2lvbiBmbGFnICovCisjZGVmaW5lIEFEQ19GTEFHX0pTVFJUICAgICAgICAgQURDX1NSX0pTVFJUICAgIC8qITwgQURDIEluamVjdGVkIGdyb3VwIHN0YXJ0IGZsYWcgKi8KKyNkZWZpbmUgQURDX0ZMQUdfU1RSVCAgICAgICAgICBBRENfU1JfU1RSVCAgICAgLyohPCBBREMgUmVndWxhciBncm91cCBzdGFydCBmbGFnICovCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisgICAgIAorLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBhZGR0b2dyb3VwIEFEQ0V4X1ByaXZhdGVfQ29uc3RhbnRzIEFEQ0V4IFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKyAgICAgCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKworCisvKiogQGRlZmdyb3VwIEFEQ0V4X0ludGVybmFsX0hBTF9kcml2ZXJfRXh0X3RyaWdfc3JjX1JlZ3VsYXIgQURDIEV4dGVuZGVkIEludGVybmFsIEhBTCBkcml2ZXIgdHJpZ2dlciBzZWxlY3Rpb24gZm9yIHJlZ3VsYXIgZ3JvdXAKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorLyogTGlzdCBvZiBleHRlcm5hbCB0cmlnZ2VycyBmb3IgY29tbW9uIGdyb3VwcyBBREMxJkFEQzIgYW5kL29yIEFEQzMmQURDNDogICAgKi8KKy8qICh1c2VkIGludGVybmFsbHkgYnkgSEFMIGRyaXZlci4gVG8gbm90IHVzZSBpbnRvIEhBTCBzdHJ1Y3R1cmUgcGFyYW1ldGVycykgICovCisKKy8qIEV4dGVybmFsIHRyaWdnZXJzIG9mIHJlZ3VsYXIgZ3JvdXAgZm9yIEFEQzEgJiBBREMyICovCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDFfQ0MxICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDFfQ0MyICAgICAgICAgICAoKHVpbnQzMl90KUFEQ19DRkdSX0VYVFNFTF8wKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHX1QxX0NDMyAgICAgICAgICAgKCh1aW50MzJfdClBRENfQ0ZHUl9FWFRTRUxfMSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR19UMl9DQzIgICAgICAgICAgICgodWludDMyX3QpKEFEQ19DRkdSX0VYVFNFTF8xIHwgQURDX0NGR1JfRVhUU0VMXzApKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHX1QzX1RSR08gICAgICAgICAgKCh1aW50MzJfdClBRENfQ0ZHUl9FWFRTRUxfMikKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR19UNF9DQzQgICAgICAgICAgICgodWludDMyX3QpKEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX0NGR1JfRVhUU0VMXzApKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHX0VYVF9JVDExICAgICAgICAgKCh1aW50MzJfdCkoQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfQ0ZHUl9FWFRTRUxfMSkpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDhfVFJHTyAgICAgICAgICAoKHVpbnQzMl90KShBRENfQ0ZHUl9FWFRTRUxfMiB8IEFEQ19DRkdSX0VYVFNFTF8xIHwgQURDX0NGR1JfRVhUU0VMXzApKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHX1Q4X1RSR08yICAgICAgICAgKCh1aW50MzJfdCkgQURDX0NGR1JfRVhUU0VMXzMpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDFfVFJHTyAgICAgICAgICAoKHVpbnQzMl90KShBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8wKSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR19UMV9UUkdPMiAgICAgICAgICgodWludDMyX3QpKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzEpKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHX1QyX1RSR08gICAgICAgICAgKCh1aW50MzJfdCkoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMSB8IEFEQ19DRkdSX0VYVFNFTF8wKSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR19UNF9UUkdPICAgICAgICAgICgodWludDMyX3QpKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzIpKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHX1Q2X1RSR08gICAgICAgICAgKCh1aW50MzJfdCkoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMiB8IEFEQ19DRkdSX0VYVFNFTF8wKSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR19UMTVfVFJHTyAgICAgICAgICgodWludDMyX3QpKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfQ0ZHUl9FWFRTRUxfMSkpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDNfQ0M0ICAgICAgICAgICAoKHVpbnQzMl90KUFEQ19DRkdSX0VYVFNFTCkKKworLyogRXh0ZXJuYWwgdHJpZ2dlcnMgb2YgcmVndWxhciBncm91cCBmb3IgQURDMyAmIEFEQzQgKi8KKyNkZWZpbmUgQURDM180X0VYVEVSTkFMVFJJR19UM19DQzEgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgQURDM180X0VYVEVSTkFMVFJJR19UMl9DQzMgICAgICAgICAgICgodWludDMyX3QpQURDX0NGR1JfRVhUU0VMXzApCisjZGVmaW5lIEFEQzNfNF9FWFRFUk5BTFRSSUdfVDFfQ0MzICAgICAgICAgICAoKHVpbnQzMl90KUFEQ19DRkdSX0VYVFNFTF8xKQorI2RlZmluZSBBREMzXzRfRVhURVJOQUxUUklHX1Q4X0NDMSAgICAgICAgICAgKCh1aW50MzJfdCkoQURDX0NGR1JfRVhUU0VMXzEgfCBBRENfQ0ZHUl9FWFRTRUxfMCkpCisjZGVmaW5lIEFEQzNfNF9FWFRFUk5BTFRSSUdfVDhfVFJHTyAgICAgICAgICAoKHVpbnQzMl90KUFEQ19DRkdSX0VYVFNFTF8yKQorI2RlZmluZSBBREMzXzRfRVhURVJOQUxUUklHX0VYVF9JVDIgICAgICAgICAgKCh1aW50MzJfdCkoQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfQ0ZHUl9FWFRTRUxfMCkpCisjZGVmaW5lIEFEQzNfNF9FWFRFUk5BTFRSSUdfVDRfQ0MxICAgICAgICAgICAoKHVpbnQzMl90KShBRENfQ0ZHUl9FWFRTRUxfMiB8IEFEQ19DRkdSX0VYVFNFTF8xKSkKKyNkZWZpbmUgQURDM180X0VYVEVSTkFMVFJJR19UMl9UUkdPICAgICAgICAgICgodWludDMyX3QpKEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX0NGR1JfRVhUU0VMXzEgfCBBRENfQ0ZHUl9FWFRTRUxfMCkpCisjZGVmaW5lIEFEQzNfNF9FWFRFUk5BTFRSSUdfVDhfVFJHTzIgICAgICAgICAoKHVpbnQzMl90KUFEQ19DRkdSX0VYVFNFTF8zKQorI2RlZmluZSBBREMzXzRfRVhURVJOQUxUUklHX1QxX1RSR08gICAgICAgICAgKCh1aW50MzJfdCkoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMCkpCisjZGVmaW5lIEFEQzNfNF9FWFRFUk5BTFRSSUdfVDFfVFJHTzIgICAgICAgICAoKHVpbnQzMl90KShBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8xKSkKKyNkZWZpbmUgQURDM180X0VYVEVSTkFMVFJJR19UM19UUkdPICAgICAgICAgICgodWludDMyX3QpKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzEgfCBBRENfQ0ZHUl9FWFRTRUxfMCkpCisjZGVmaW5lIEFEQzNfNF9FWFRFUk5BTFRSSUdfVDRfVFJHTyAgICAgICAgICAoKHVpbnQzMl90KShBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8yKSkKKyNkZWZpbmUgQURDM180X0VYVEVSTkFMVFJJR19UN19UUkdPICAgICAgICAgICgodWludDMyX3QpKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfQ0ZHUl9FWFRTRUxfMCkpCisjZGVmaW5lIEFEQzNfNF9FWFRFUk5BTFRSSUdfVDE1X1RSR08gICAgICAgICAoKHVpbnQzMl90KShBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX0NGR1JfRVhUU0VMXzEpKQorI2RlZmluZSBBREMzXzRfRVhURVJOQUxUUklHX1QyX0NDMSAgICAgICAgICAgKCh1aW50MzJfdClBRENfQ0ZHUl9FWFRTRUwpCisjZW5kaWYgLyogU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpCisvKiBMaXN0IG9mIGV4dGVybmFsIHRyaWdnZXJzIG9mIGNvbW1vbiBncm91cCBBREMxJkFEQzI6ICAgICAgICAgICAgICAgICAgICAgICAqLworLyogKHVzZWQgaW50ZXJuYWxseSBieSBIQUwgZHJpdmVyLiBUbyBub3QgdXNlIGludG8gSEFMIHN0cnVjdHVyZSBwYXJhbWV0ZXJzKSAgKi8KKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR19UMV9DQzEgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR19UMV9DQzIgICAgICAgICAgICgodWludDMyX3QpQURDX0NGR1JfRVhUU0VMXzApCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDFfQ0MzICAgICAgICAgICAoKHVpbnQzMl90KUFEQ19DRkdSX0VYVFNFTF8xKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHX1QxX1RSR08gICAgICAgICAgKCh1aW50MzJfdCkoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMCkpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDFfVFJHTzIgICAgICAgICAoKHVpbnQzMl90KShBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8xKSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR19UMl9DQzIgICAgICAgICAgICgodWludDMyX3QpKEFEQ19DRkdSX0VYVFNFTF8xIHwgQURDX0NGR1JfRVhUU0VMXzApKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHX1QyX1RSR08gICAgICAgICAgKCh1aW50MzJfdCkoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMSB8IEFEQ19DRkdSX0VYVFNFTF8wKSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR19UM19DQzQgICAgICAgICAgICgodWludDMyX3QpQURDX0NGR1JfRVhUU0VMKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHX1QzX1RSR08gICAgICAgICAgKCh1aW50MzJfdClBRENfQ0ZHUl9FWFRTRUxfMikKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR19UNF9DQzQgICAgICAgICAgICgodWludDMyX3QpKEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX0NGR1JfRVhUU0VMXzApKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHX1Q0X1RSR08gICAgICAgICAgKCh1aW50MzJfdCkoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMikpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDZfVFJHTyAgICAgICAgICAoKHVpbnQzMl90KShBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX0NGR1JfRVhUU0VMXzApKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHX1QxNV9UUkdPICAgICAgICAgKCh1aW50MzJfdCkoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMiB8IEFEQ19DRkdSX0VYVFNFTF8xKSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR19FWFRfSVQxMSAgICAgICAgICgodWludDMyX3QpKEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX0NGR1JfRVhUU0VMXzEpKQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpCisvKiBMaXN0IG9mIGV4dGVybmFsIHRyaWdnZXJzIG9mIGNvbW1vbiBncm91cCBBREMxJkFEQzI6ICAgICAgICAgICAgICAgICAgICAgICAqLworLyogKHVzZWQgaW50ZXJuYWxseSBieSBIQUwgZHJpdmVyLiBUbyBub3QgdXNlIGludG8gSEFMIHN0cnVjdHVyZSBwYXJhbWV0ZXJzKSAgKi8KKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR19UMV9DQzEgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR19UMV9DQzIgICAgICAgICAgICgodWludDMyX3QpQURDX0NGR1JfRVhUU0VMXzApCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDFfQ0MzICAgICAgICAgICAoKHVpbnQzMl90KUFEQ19DRkdSX0VYVFNFTF8xKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHX1QyX0NDMiAgICAgICAgICAgKCh1aW50MzJfdCkoQURDX0NGR1JfRVhUU0VMXzEgfCBBRENfQ0ZHUl9FWFRTRUxfMCkpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDNfVFJHTyAgICAgICAgICAoKHVpbnQzMl90KUFEQ19DRkdSX0VYVFNFTF8yKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHX1Q0X0NDNCAgICAgICAgICAgKCh1aW50MzJfdCkoQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfQ0ZHUl9FWFRTRUxfMCkpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdfRVhUX0lUMTEgICAgICAgICAoKHVpbnQzMl90KShBRENfQ0ZHUl9FWFRTRUxfMiB8IEFEQ19DRkdSX0VYVFNFTF8xKSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR19UOF9UUkdPICAgICAgICAgICgodWludDMyX3QpKEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX0NGR1JfRVhUU0VMXzEgfCBBRENfQ0ZHUl9FWFRTRUxfMCkpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDhfVFJHTzIgICAgICAgICAoKHVpbnQzMl90KSBBRENfQ0ZHUl9FWFRTRUxfMykKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR19UMV9UUkdPICAgICAgICAgICgodWludDMyX3QpKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzApKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHX1QxX1RSR08yICAgICAgICAgKCh1aW50MzJfdCkoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMSkpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDJfVFJHTyAgICAgICAgICAoKHVpbnQzMl90KShBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8xIHwgQURDX0NGR1JfRVhUU0VMXzApKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHX1Q0X1RSR08gICAgICAgICAgKCh1aW50MzJfdCkoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMikpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDZfVFJHTyAgICAgICAgICAoKHVpbnQzMl90KShBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX0NGR1JfRVhUU0VMXzApKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHX1QxNV9UUkdPICAgICAgICAgKCh1aW50MzJfdCkoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMiB8IEFEQ19DRkdSX0VYVFNFTF8xKSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR19UM19DQzQgICAgICAgICAgICgodWludDMyX3QpQURDX0NGR1JfRVhUU0VMKQorI2VuZGlmIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMyOHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMzNHg4KQorLyogTGlzdCBvZiBleHRlcm5hbCB0cmlnZ2VycyBvZiBjb21tb24gZ3JvdXAgQURDMSZBREMyOiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICh1c2VkIGludGVybmFsbHkgYnkgSEFMIGRyaXZlci4gVG8gbm90IHVzZSBpbnRvIEhBTCBzdHJ1Y3R1cmUgcGFyYW1ldGVycykgICovCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDFfQ0MxICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDFfQ0MyICAgICAgICAgICAoKHVpbnQzMl90KUFEQ19DRkdSX0VYVFNFTF8wKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHX1QxX0NDMyAgICAgICAgICAgKCh1aW50MzJfdClBRENfQ0ZHUl9FWFRTRUxfMSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR19UMl9DQzIgICAgICAgICAgICgodWludDMyX3QpKEFEQ19DRkdSX0VYVFNFTF8xIHwgQURDX0NGR1JfRVhUU0VMXzApKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHX1QzX1RSR08gICAgICAgICAgKCh1aW50MzJfdClBRENfQ0ZHUl9FWFRTRUxfMikKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR19FWFRfSVQxMSAgICAgICAgICgodWludDMyX3QpKEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX0NGR1JfRVhUU0VMXzEpKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHX0hSVElNX1RSRzEgICAgICAgKCh1aW50MzJfdCkoQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfQ0ZHUl9FWFRTRUxfMSB8IEFEQ19DRkdSX0VYVFNFTF8wKSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR19IUlRJTV9UUkczICAgICAgICgodWludDMyX3QpIEFEQ19DRkdSX0VYVFNFTF8zKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHX1QxX1RSR08gICAgICAgICAgKCh1aW50MzJfdCkoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMCkpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDFfVFJHTzIgICAgICAgICAoKHVpbnQzMl90KShBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8xKSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR19UMl9UUkdPICAgICAgICAgICgodWludDMyX3QpKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzEgfCBBRENfQ0ZHUl9FWFRTRUxfMCkpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdfVDZfVFJHTyAgICAgICAgICAoKHVpbnQzMl90KShBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX0NGR1JfRVhUU0VMXzApKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHX1QxNV9UUkdPICAgICAgICAgKCh1aW50MzJfdCkoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMiB8IEFEQ19DRkdSX0VYVFNFTF8xKSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR19UM19DQzQgICAgICAgICAgICgodWludDMyX3QpQURDX0NGR1JfRVhUU0VMKQorI2VuZGlmIC8qIFNUTTMyRjMzNHg4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorLyogTGlzdCBvZiBleHRlcm5hbCB0cmlnZ2VycyBvZiByZWd1bGFyIGdyb3VwIGZvciBBREMxOiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICh1c2VkIGludGVybmFsbHkgYnkgSEFMIGRyaXZlci4gVG8gbm90IHVzZSBpbnRvIEhBTCBzdHJ1Y3R1cmUgcGFyYW1ldGVycykgICovCisjZGVmaW5lIEFEQzFfRVhURVJOQUxUUklHX1QxX0NDMSAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBBREMxX0VYVEVSTkFMVFJJR19UMV9DQzIgICAgICAgICAgICgodWludDMyX3QpQURDX0NGR1JfRVhUU0VMXzApCisjZGVmaW5lIEFEQzFfRVhURVJOQUxUUklHX1QxX0NDMyAgICAgICAgICAgKCh1aW50MzJfdClBRENfQ0ZHUl9FWFRTRUxfMSkKKyNkZWZpbmUgQURDMV9FWFRFUk5BTFRSSUdfRVhUX0lUMTEgICAgICAgICAoKHVpbnQzMl90KShBRENfQ0ZHUl9FWFRTRUxfMiB8IEFEQ19DRkdSX0VYVFNFTF8xKSkKKyNkZWZpbmUgQURDMV9FWFRFUk5BTFRSSUdfVDFfVFJHTyAgICAgICAgICAoKHVpbnQzMl90KShBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8wKSkKKyNkZWZpbmUgQURDMV9FWFRFUk5BTFRSSUdfVDFfVFJHTzIgICAgICAgICAoKHVpbnQzMl90KShBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8xKSkKKyNkZWZpbmUgQURDMV9FWFRFUk5BTFRSSUdfVDJfVFJHTyAgICAgICAgICAoKHVpbnQzMl90KShBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8xIHwgQURDX0NGR1JfRVhUU0VMXzApKQorI2RlZmluZSBBREMxX0VYVEVSTkFMVFJJR19UNl9UUkdPICAgICAgICAgICgodWludDMyX3QpKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfQ0ZHUl9FWFRTRUxfMCkpCisjZGVmaW5lIEFEQzFfRVhURVJOQUxUUklHX1QxNV9UUkdPICAgICAgICAgKCh1aW50MzJfdCkoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMiB8IEFEQ19DRkdSX0VYVFNFTF8xKSkKKyNkZWZpbmUgQURDX1NPRlRXQVJFX1NUQVJUICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMVUpCisjZW5kaWYgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggKi8KKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBBRENFeF9JbnRlcm5hbF9IQUxfZHJpdmVyX0V4dF90cmlnX3NyY19JbmplY3RlZCBBREMgRXh0ZW5kZWQgSW50ZXJuYWwgSEFMIGRyaXZlciB0cmlnZ2VyIHNlbGVjdGlvbiBmb3IgaW5qZWN0ZWQgZ3JvdXAKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorLyogTGlzdCBvZiBleHRlcm5hbCB0cmlnZ2VycyBzb3J0ZWQgb2YgZ3JvdXBzIEFEQzEmQURDMiBhbmQvb3IgQURDMyZBREM0OiAgICAgKi8KKy8qICh1c2VkIGludGVybmFsbHkgYnkgSEFMIGRyaXZlci4gVG8gbm90IHVzZSBpbnRvIEhBTCBzdHJ1Y3R1cmUgcGFyYW1ldGVycykgICovCisKKy8qIEV4dGVybmFsIHRyaWdnZXJzIGZvciBpbmplY3RlZCBncm91cHMgb2YgQURDMSAmIEFEQzIgKi8KKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1QxX1RSR08gICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDFfQ0M0ICAgICAoKHVpbnQzMl90KUFEQ19KU1FSX0pFWFRTRUxfMCkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1QyX1RSR08gICAgKCh1aW50MzJfdClBRENfSlNRUl9KRVhUU0VMXzEpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UMl9DQzEgICAgICgodWludDMyX3QpKEFEQ19KU1FSX0pFWFRTRUxfMSB8IEFEQ19KU1FSX0pFWFRTRUxfMCkpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UM19DQzQgICAgICgodWludDMyX3QpQURDX0pTUVJfSkVYVFNFTF8yKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDRfVFJHTyAgICAoKHVpbnQzMl90KShBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSlNRUl9KRVhUU0VMXzApKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfRVhUX0lUMTUgICAoKHVpbnQzMl90KShBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSlNRUl9KRVhUU0VMXzEpKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDhfQ0M0ICAgICAoKHVpbnQzMl90KShBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSlNRUl9KRVhUU0VMXzEgfCBBRENfSlNRUl9KRVhUU0VMXzApKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDFfVFJHTzIgICAoKHVpbnQzMl90KUFEQ19KU1FSX0pFWFRTRUxfMykKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1Q4X1RSR08gICAgKCh1aW50MzJfdCkoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8wKSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1Q4X1RSR08yICAgKCh1aW50MzJfdCkoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8xKSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1QzX0NDMyAgICAgKCh1aW50MzJfdCkoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8xIHwgQURDX0pTUVJfSkVYVFNFTF8wKSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1QzX1RSR08gICAgKCh1aW50MzJfdCkoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8yKSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1QzX0NDMSAgICAgKCh1aW50MzJfdCkoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8wKSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1Q2X1RSR08gICAgKCh1aW50MzJfdCkoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8xKSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1QxNV9UUkdPICAgKCh1aW50MzJfdClBRENfSlNRUl9KRVhUU0VMKQorCisvKiBFeHRlcm5hbCB0cmlnZ2VycyBmb3IgaW5qZWN0ZWQgZ3JvdXBzIG9mIEFEQzMgJiBBREM0ICovCisvKiBOb3RlOiBFeHRlcm5hbCB0cmlnZ2VycyBKRVhUMiBhbmQgSkVYVDUgYXJlIHRoZSBzYW1lIChUSU00X0NDMyBldmVudCkuICAgICAqLworLyogICAgICAgSkVYVDIgaXMgdGhlIG1haW4gdHJpZ2dlciwgSkVYVDUgY291bGQgYmUgcmVkaXJlY3RlZCB0byBhbm90aGVyICAgICAgKi8KKy8qICAgICAgIGluIGZ1dHVyZSBkZXZpY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBIb3dldmVyLCB0aGlzIGNoYW5uZWwgaXMgaW1wbGVtZW50ZWQgd2l0aCBhIFNXIG9mZnNldCBvZiAweDEwMDAwIGZvciAqLworLyogICAgICAgZGlmZmVyZW50aWF0aW9uIGJldHdlZW4gc2ltaWxhciB0cmlnZ2VycyBvZiBjb21tb24gZ3JvdXBzIEFEQzEmQURDMiwgKi8KKy8qICAgICAgIEFEQzMmQURDNCAoRGlmZmVyZW50aWF0aW9uIHByb2Nlc3NlZCBpbnRvIG1hY3JvICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBBRENfSlNRUl9KRVhUU0VMX1NFVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBREMzXzRfRVhURVJOQUxUUklHSU5KRUNfVDFfVFJHTyAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIEFEQzNfNF9FWFRFUk5BTFRSSUdJTkpFQ19UMV9DQzQgICAgICgodWludDMyX3QpQURDX0pTUVJfSkVYVFNFTF8wKQorI2RlZmluZSBBREMzXzRfRVhURVJOQUxUUklHSU5KRUNfVDRfQ0MzICAgICAoKHVpbnQzMl90KUFEQ19KU1FSX0pFWFRTRUxfMSB8IDB4MTAwMDBVKQorI2RlZmluZSBBREMzXzRfRVhURVJOQUxUUklHSU5KRUNfVDhfQ0MyICAgICAoKHVpbnQzMl90KShBRENfSlNRUl9KRVhUU0VMXzEgfCBBRENfSlNRUl9KRVhUU0VMXzApKQorI2RlZmluZSBBREMzXzRfRVhURVJOQUxUUklHSU5KRUNfVDhfQ0M0ICAgICAoKHVpbnQzMl90KUFEQ19KU1FSX0pFWFRTRUxfMikKKworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisjZGVmaW5lIEFEQzNfNF9FWFRFUk5BTFRSSUdJTkpFQ19UMjBfVFJHTyAgICgodWludDMyX3QpKEFEQ19KU1FSX0pFWFRTRUxfMiB8IEFEQ19KU1FSX0pFWFRTRUxfMCkpCisjZW5kaWYgLyogU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggKi8KKworI2RlZmluZSBBREMzXzRfRVhURVJOQUxUUklHSU5KRUNfVDRfQ0M0ICAgICAoKHVpbnQzMl90KShBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSlNRUl9KRVhUU0VMXzEpKQorI2RlZmluZSBBREMzXzRfRVhURVJOQUxUUklHSU5KRUNfVDRfVFJHTyAgICAoKHVpbnQzMl90KShBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSlNRUl9KRVhUU0VMXzEgfCBBRENfSlNRUl9KRVhUU0VMXzApKQorI2RlZmluZSBBREMzXzRfRVhURVJOQUxUUklHSU5KRUNfVDFfVFJHTzIgICAoKHVpbnQzMl90KUFEQ19KU1FSX0pFWFRTRUxfMykKKyNkZWZpbmUgQURDM180X0VYVEVSTkFMVFJJR0lOSkVDX1Q4X1RSR08gICAgKCh1aW50MzJfdCkoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8wKSkKKyNkZWZpbmUgQURDM180X0VYVEVSTkFMVFJJR0lOSkVDX1Q4X1RSR08yICAgKCh1aW50MzJfdCkoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8xKSkKKyNkZWZpbmUgQURDM180X0VYVEVSTkFMVFJJR0lOSkVDX1QxX0NDMyAgICAgKCh1aW50MzJfdCkoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8xIHwgQURDX0pTUVJfSkVYVFNFTF8wKSkKKyNkZWZpbmUgQURDM180X0VYVEVSTkFMVFJJR0lOSkVDX1QzX1RSR08gICAgKCh1aW50MzJfdCkoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8yKSkKKyNkZWZpbmUgQURDM180X0VYVEVSTkFMVFJJR0lOSkVDX1QyX1RSR08gICAgKCh1aW50MzJfdCkoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8wKSkKKyNkZWZpbmUgQURDM180X0VYVEVSTkFMVFJJR0lOSkVDX1Q3X1RSR08gICAgKCh1aW50MzJfdCkoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8xKSkKKyNkZWZpbmUgQURDM180X0VYVEVSTkFMVFJJR0lOSkVDX1QxNV9UUkdPICAgKCh1aW50MzJfdClBRENfSlNRUl9KRVhUU0VMKQorI2VuZGlmIC8qIFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKQorLyogTGlzdCBvZiBleHRlcm5hbCB0cmlnZ2VycyBvZiBncm91cCBBREMxJkFEQzI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICh1c2VkIGludGVybmFsbHkgYnkgSEFMIGRyaXZlci4gVG8gbm90IHVzZSBpbnRvIEhBTCBzdHJ1Y3R1cmUgcGFyYW1ldGVycykgICovCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UMV9UUkdPICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1QxX0NDNCAgICAgKCh1aW50MzJfdClBRENfSlNRUl9KRVhUU0VMXzApCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UMl9UUkdPICAgICgodWludDMyX3QpQURDX0pTUVJfSkVYVFNFTF8xKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDJfQ0MxICAgICAoKHVpbnQzMl90KShBRENfSlNRUl9KRVhUU0VMXzEgfCBBRENfSlNRUl9KRVhUU0VMXzApKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDNfQ0M0ICAgICAoKHVpbnQzMl90KUFEQ19KU1FSX0pFWFRTRUxfMikKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1Q0X1RSR08gICAgKCh1aW50MzJfdCkoQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8wKSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX0VYVF9JVDE1ICAgKCh1aW50MzJfdCkoQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8xKSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1QxX1RSR08yICAgKCh1aW50MzJfdClBRENfSlNRUl9KRVhUU0VMXzMpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UM19DQzMgICAgICgodWludDMyX3QpKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMSB8IEFEQ19KU1FSX0pFWFRTRUxfMCkpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UM19UUkdPICAgICgodWludDMyX3QpKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMikpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UM19DQzEgICAgICgodWludDMyX3QpKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMiB8IEFEQ19KU1FSX0pFWFRTRUxfMCkpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UNl9UUkdPICAgICgodWludDMyX3QpKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMiB8IEFEQ19KU1FSX0pFWFRTRUxfMSkpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UMTVfVFJHTyAgICgodWludDMyX3QpQURDX0pTUVJfSkVYVFNFTCkKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDICAgICovCisgICAgICAKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KQorLyogTGlzdCBvZiBleHRlcm5hbCB0cmlnZ2VycyBvZiBncm91cCBBREMxJkFEQzI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICh1c2VkIGludGVybmFsbHkgYnkgSEFMIGRyaXZlci4gVG8gbm90IHVzZSBpbnRvIEhBTCBzdHJ1Y3R1cmUgcGFyYW1ldGVycykgICovCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UMV9UUkdPICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1QxX0NDNCAgICAgKCh1aW50MzJfdClBRENfSlNRUl9KRVhUU0VMXzApCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UMl9UUkdPICAgICgodWludDMyX3QpQURDX0pTUVJfSkVYVFNFTF8xKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDJfQ0MxICAgICAoKHVpbnQzMl90KShBRENfSlNRUl9KRVhUU0VMXzEgfCBBRENfSlNRUl9KRVhUU0VMXzApKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDNfQ0M0ICAgICAoKHVpbnQzMl90KUFEQ19KU1FSX0pFWFRTRUxfMikKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1Q0X1RSR08gICAgKCh1aW50MzJfdCkoQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8wKSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX0VYVF9JVDE1ICAgKCh1aW50MzJfdCkoQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8xKSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1Q4X0NDNCAgICAgKCh1aW50MzJfdCkoQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8xIHwgQURDX0pTUVJfSkVYVFNFTF8wKSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1QxX1RSR08yICAgKCh1aW50MzJfdClBRENfSlNRUl9KRVhUU0VMXzMpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UOF9UUkdPICAgICgodWludDMyX3QpKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMCkpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UOF9UUkdPMiAgICgodWludDMyX3QpKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMSkpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UM19DQzMgICAgICgodWludDMyX3QpKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMSB8IEFEQ19KU1FSX0pFWFRTRUxfMCkpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UM19UUkdPICAgICgodWludDMyX3QpKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMikpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UM19DQzEgICAgICgodWludDMyX3QpKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMiB8IEFEQ19KU1FSX0pFWFRTRUxfMCkpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UNl9UUkdPICAgICgodWludDMyX3QpKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMiB8IEFEQ19KU1FSX0pFWFRTRUxfMSkpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UMTVfVFJHTyAgICgodWludDMyX3QpQURDX0pTUVJfSkVYVFNFTCkKKyNlbmRpZiAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMjh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMzR4OCkKKy8qIExpc3Qgb2YgZXh0ZXJuYWwgdHJpZ2dlcnMgb2YgZ3JvdXAgQURDMSZBREMyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAodXNlZCBpbnRlcm5hbGx5IGJ5IEhBTCBkcml2ZXIuIFRvIG5vdCB1c2UgaW50byBIQUwgc3RydWN0dXJlIHBhcmFtZXRlcnMpICAqLworI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDFfVFJHTyAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDFfQ0M0ICAgICAgKCh1aW50MzJfdClBRENfSlNRUl9KRVhUU0VMXzApCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UMl9UUkdPICAgICAoKHVpbnQzMl90KUFEQ19KU1FSX0pFWFRTRUxfMSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1QyX0NDMSAgICAgICgodWludDMyX3QpKEFEQ19KU1FSX0pFWFRTRUxfMSB8IEFEQ19KU1FSX0pFWFRTRUxfMCkpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UM19DQzQgICAgICAoKHVpbnQzMl90KUFEQ19KU1FSX0pFWFRTRUxfMikKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX0VYVF9JVDE1ICAgICgodWludDMyX3QpKEFEQ19KU1FSX0pFWFRTRUxfMiB8IEFEQ19KU1FSX0pFWFRTRUxfMSkpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UMV9UUkdPMiAgICAoKHVpbnQzMl90KUFEQ19KU1FSX0pFWFRTRUxfMykKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX0hSVElNX1RSRzIgICgodWludDMyX3QpKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMCkpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19IUlRJTV9UUkc0ICAoKHVpbnQzMl90KShBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSlNRUl9KRVhUU0VMXzEpKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDNfQ0MzICAgICAgKCh1aW50MzJfdCkoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8xIHwgQURDX0pTUVJfSkVYVFNFTF8wKSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1QzX1RSR08gICAgICgodWludDMyX3QpKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMikpCisjZGVmaW5lIEFEQzFfMl9FWFRFUk5BTFRSSUdJTkpFQ19UM19DQzEgICAgICAoKHVpbnQzMl90KShBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSlNRUl9KRVhUU0VMXzApKQorI2RlZmluZSBBREMxXzJfRVhURVJOQUxUUklHSU5KRUNfVDZfVFJHTyAgICAgKCh1aW50MzJfdCkoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8xKSkKKyNkZWZpbmUgQURDMV8yX0VYVEVSTkFMVFJJR0lOSkVDX1QxNV9UUkdPICAgICgodWludDMyX3QpQURDX0pTUVJfSkVYVFNFTCkKKyNlbmRpZiAvKiBTVE0zMkYzMzR4OCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKy8qIExpc3Qgb2YgZXh0ZXJuYWwgdHJpZ2dlcnMgb2YgaW5qZWN0ZWQgZ3JvdXAgZm9yIEFEQzE6ICAgICAgICAgICAgICAgICAgICAgICovCisvKiAodXNlZCBpbnRlcm5hbGx5IGJ5IEhBTCBkcml2ZXIuIFRvIG5vdCB1c2UgaW50byBIQUwgc3RydWN0dXJlIHBhcmFtZXRlcnMpICAqLworI2RlZmluZSBBREMxX0VYVEVSTkFMVFJJR0lOSkVDX1QxX1RSR08gICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBBREMxX0VYVEVSTkFMVFJJR0lOSkVDX1QxX0NDNCAgICAgKCh1aW50MzJfdClBRENfSlNRUl9KRVhUU0VMXzApCisjZGVmaW5lIEFEQzFfRVhURVJOQUxUUklHSU5KRUNfVDJfVFJHTyAgICAoKHVpbnQzMl90KUFEQ19KU1FSX0pFWFRTRUxfMSkKKyNkZWZpbmUgQURDMV9FWFRFUk5BTFRSSUdJTkpFQ19UMl9DQzEgICAgICgodWludDMyX3QpKEFEQ19KU1FSX0pFWFRTRUxfMSB8IEFEQ19KU1FSX0pFWFRTRUxfMCkpCisjZGVmaW5lIEFEQzFfRVhURVJOQUxUUklHSU5KRUNfRVhUX0lUMTUgICAoKHVpbnQzMl90KShBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSlNRUl9KRVhUU0VMXzEpKQorI2RlZmluZSBBREMxX0VYVEVSTkFMVFJJR0lOSkVDX1QxX1RSR08yICAgKCh1aW50MzJfdClBRENfSlNRUl9KRVhUU0VMXzMpCisjZGVmaW5lIEFEQzFfRVhURVJOQUxUUklHSU5KRUNfVDZfVFJHTyAgICAoKHVpbnQzMl90KShBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSlNRUl9KRVhUU0VMXzEpKQorI2RlZmluZSBBREMxX0VYVEVSTkFMVFJJR0lOSkVDX1QxNV9UUkdPICAgKCh1aW50MzJfdClBRENfSlNRUl9KRVhUU0VMKQorI2VuZGlmIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICovCisvKioKKyAgKiBAfQorICAqLworCisjZGVmaW5lIEFEQ19GTEFHX0FMTCAgICAoQURDX0ZMQUdfUkRZIHwgQURDX0ZMQUdfRU9TTVAgfCBBRENfRkxBR19FT0MgfCBBRENfRkxBR19FT1MgfCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19GTEFHX0pFT0MgfCBBRENfRkxBR19KRU9TIHwgQURDX0ZMQUdfT1ZSIHwgQURDX0ZMQUdfQVdEMSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRENfRkxBR19BV0QyIHwgQURDX0ZMQUdfQVdEMyB8IEFEQ19GTEFHX0pRT1ZGKQorCisvKiBDb21iaW5hdGlvbiBvZiBhbGwgcG9zdC1jb252ZXJzaW9uIGZsYWdzIGJpdHM6IEVPQy9FT1MsIEpFT0MvSkVPUywgT1ZSLCBBV0R4ICovCisjZGVmaW5lIEFEQ19GTEFHX1BPU1RDT05WX0FMTCAoQURDX0ZMQUdfRU9DIHwgQURDX0ZMQUdfRU9TICB8IEFEQ19GTEFHX0pFT0MgfCBBRENfRkxBR19KRU9TIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19GTEFHX09WUiB8IEFEQ19GTEFHX0FXRDEgfCBBRENfRkxBR19BV0QyIHwgQURDX0ZMQUdfQVdEMyB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfRkxBR19KUU9WRikKKyAgICAgIAorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisKKyAgICAgIAorI2lmIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisKKy8qKiBAZGVmZ3JvdXAgQURDRXhfSW50ZXJuYWxfSEFMX2RyaXZlcl9FeHRfdHJpZ19zcmNfUmVndWxhciBBREMgRXh0ZW5kZWQgSW50ZXJuYWwgSEFMIGRyaXZlciB0cmlnZ2VyIHNlbGVjdGlvbiBmb3IgcmVndWxhciBncm91cAorICAqIEB7CisgICovCisvKiBMaXN0IG9mIGV4dGVybmFsIHRyaWdnZXJzIG9mIHJlZ3VsYXIgZ3JvdXAgZm9yIEFEQzE6ICAgICAgICAgICAgICAgICAgICAgICAqLworLyogKHVzZWQgaW50ZXJuYWxseSBieSBIQUwgZHJpdmVyLiBUbyBub3QgdXNlIGludG8gSEFMIHN0cnVjdHVyZSBwYXJhbWV0ZXJzKSAgKi8KKworLyogRXh0ZXJuYWwgdHJpZ2dlcnMgb2YgcmVndWxhciBncm91cCBmb3IgQURDMSAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHX1QxOV9UUkdPICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19UMTlfQ0MzICAgICAgICAgICAoKHVpbnQzMl90KUFEQ19DUjJfRVhUU0VMXzApCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfVDE5X0NDNCAgICAgICAgICAgKCh1aW50MzJfdClBRENfQ1IyX0VYVFNFTF8xKQorI2RlZmluZSBBRENfRVhURVJOQUxUUklHX1QyX0NDMiAgICAgICAgICAgICgodWludDMyX3QpKEFEQ19DUjJfRVhUU0VMXzEgfCBBRENfQ1IyX0VYVFNFTF8wKSkKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19UM19UUkdPICAgICAgICAgICAoKHVpbnQzMl90KUFEQ19DUjJfRVhUU0VMXzIpCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfVDRfQ0M0ICAgICAgICAgICAgKCh1aW50MzJfdCkoQURDX0NSMl9FWFRTRUxfMiB8IEFEQ19DUjJfRVhUU0VMXzApKQorI2RlZmluZSBBRENfRVhURVJOQUxUUklHX0VYVF9JVDExICAgICAgICAgICgodWludDMyX3QpKEFEQ19DUjJfRVhUU0VMXzIgfCBBRENfQ1IyX0VYVFNFTF8xKSkKKyNkZWZpbmUgQURDX1NXU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShBRENfQ1IyX0VYVFNFTF8yIHwgQURDX0NSMl9FWFRTRUxfMSB8IEFEQ19DUjJfRVhUU0VMXzApKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENFeF9JbnRlcm5hbF9IQUxfZHJpdmVyX0V4dF90cmlnX3NyY19JbmplY3RlZCBBREMgRXh0ZW5kZWQgSW50ZXJuYWwgSEFMIGRyaXZlciB0cmlnZ2VyIHNlbGVjdGlvbiBmb3IgaW5qZWN0ZWQgZ3JvdXAKKyAgKiBAeworICAqLworLyogTGlzdCBvZiBleHRlcm5hbCB0cmlnZ2VycyBvZiBpbmplY3RlZCBncm91cCBmb3IgQURDMTogICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICh1c2VkIGludGVybmFsbHkgYnkgSEFMIGRyaXZlci4gVG8gbm90IHVzZSBpbnRvIEhBTCBzdHJ1Y3R1cmUgcGFyYW1ldGVycykgICovCisKKy8qIEV4dGVybmFsIHRyaWdnZXJzIG9mIGluamVjdGVkIGdyb3VwIGZvciBBREMxICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMTlfQ0MxICAgICAgKCAweDAwMDAwMDAwVSkKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QxOV9DQzIgICAgICAoKHVpbnQzMl90KSBBRENfQ1IyX0pFWFRTRUxfMCkKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QyX1RSR08gICAgICAoKHVpbnQzMl90KSBBRENfQ1IyX0pFWFRTRUxfMSkKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QyX0NDMSAgICAgICAoKHVpbnQzMl90KShBRENfQ1IyX0pFWFRTRUxfMSB8IEFEQ19DUjJfSkVYVFNFTF8wKSkKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QzX0NDNCAgICAgICAoKHVpbnQzMl90KSBBRENfQ1IyX0pFWFRTRUxfMikKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q0X1RSR08gICAgICAoKHVpbnQzMl90KShBRENfQ1IyX0pFWFRTRUxfMiB8IEFEQ19DUjJfSkVYVFNFTF8wKSkKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX0VYVF9JVDE1ICAgICAoKHVpbnQzMl90KShBRENfQ1IyX0pFWFRTRUxfMiB8IEFEQ19DUjJfSkVYVFNFTF8xKSkKKyNkZWZpbmUgQURDX0pTV1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShBRENfQ1IyX0pFWFRTRUxfMiB8IEFEQ19DUjJfSkVYVFNFTF8xIHwgQURDX0NSMl9KRVhUU0VMXzApKQorLyoqCisgICogQH0KKyAgKi8KKyAgICAgIAorLyoqIEBkZWZncm91cCBBRENFeF9zYW1wbGluZ190aW1lc19hbGxfY2hhbm5lbHMgQURDIEV4dGVuZGVkIFNhbXBsaW5nIFRpbWVzIEFsbCBDaGFubmVscworICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19TQU1QTEVUSU1FX0FMTENIQU5ORUxTX1NNUFIyQklUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKEFEQ19TTVBSMl9TTVA5XzIgfCBBRENfU01QUjJfU01QOF8yIHwgQURDX1NNUFIyX1NNUDdfMiB8IEFEQ19TTVBSMl9TTVA2XzIgfCAgICAgXAorICAgICAgQURDX1NNUFIyX1NNUDVfMiB8IEFEQ19TTVBSMl9TTVA0XzIgfCBBRENfU01QUjJfU01QM18yIHwgQURDX1NNUFIyX1NNUDJfMiB8ICAgICBcCisgICAgICBBRENfU01QUjJfU01QMV8yIHwgQURDX1NNUFIyX1NNUDBfMikKKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfQUxMQ0hBTk5FTFNfU01QUjFCSVQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoQURDX1NNUFIxX1NNUDE3XzIgfCBBRENfU01QUjFfU01QMTZfMiB8IEFEQ19TTVBSMV9TTVAxNV8yIHwgQURDX1NNUFIxX1NNUDE0XzIgfCBcCisgICAgICBBRENfU01QUjFfU01QMTNfMiB8IEFEQ19TTVBSMV9TTVAxMl8yIHwgQURDX1NNUFIxX1NNUDExXzIgfCBBRENfU01QUjFfU01QMTBfMiApCisKKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfQUxMQ0hBTk5FTFNfU01QUjJCSVQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoQURDX1NNUFIyX1NNUDlfMSB8IEFEQ19TTVBSMl9TTVA4XzEgfCBBRENfU01QUjJfU01QN18xIHwgQURDX1NNUFIyX1NNUDZfMSB8ICAgICBcCisgICAgICBBRENfU01QUjJfU01QNV8xIHwgQURDX1NNUFIyX1NNUDRfMSB8IEFEQ19TTVBSMl9TTVAzXzEgfCBBRENfU01QUjJfU01QMl8xIHwgICAgIFwKKyAgICAgIEFEQ19TTVBSMl9TTVAxXzEgfCBBRENfU01QUjJfU01QMF8xKQorI2RlZmluZSBBRENfU0FNUExFVElNRV9BTExDSEFOTkVMU19TTVBSMUJJVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIChBRENfU01QUjFfU01QMTdfMSB8IEFEQ19TTVBSMV9TTVAxNl8xIHwgQURDX1NNUFIxX1NNUDE1XzEgfCBBRENfU01QUjFfU01QMTRfMSB8IFwKKyAgICAgIEFEQ19TTVBSMV9TTVAxM18xIHwgQURDX1NNUFIxX1NNUDEyXzEgfCBBRENfU01QUjFfU01QMTFfMSB8IEFEQ19TTVBSMV9TTVAxMF8xICkKKworI2RlZmluZSBBRENfU0FNUExFVElNRV9BTExDSEFOTkVMU19TTVBSMkJJVDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIChBRENfU01QUjJfU01QOV8wIHwgQURDX1NNUFIyX1NNUDhfMCB8IEFEQ19TTVBSMl9TTVA3XzAgfCBBRENfU01QUjJfU01QNl8wIHwgICAgIFwKKyAgICAgIEFEQ19TTVBSMl9TTVA1XzAgfCBBRENfU01QUjJfU01QNF8wIHwgQURDX1NNUFIyX1NNUDNfMCB8IEFEQ19TTVBSMl9TTVAyXzAgfCAgICAgXAorICAgICAgQURDX1NNUFIyX1NNUDFfMCB8IEFEQ19TTVBSMl9TTVAwXzApCisjZGVmaW5lIEFEQ19TQU1QTEVUSU1FX0FMTENIQU5ORUxTX1NNUFIxQklUMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKEFEQ19TTVBSMV9TTVAxN18wIHwgQURDX1NNUFIxX1NNUDE2XzAgfCBBRENfU01QUjFfU01QMTVfMCB8IEFEQ19TTVBSMV9TTVAxNF8wIHwgXAorICAgICAgQURDX1NNUFIxX1NNUDEzXzAgfCBBRENfU01QUjFfU01QMTJfMCB8IEFEQ19TTVBSMV9TTVAxMV8wIHwgQURDX1NNUFIxX1NNUDEwXzAgKQorCisjZGVmaW5lIEFEQ19TQU1QTEVUSU1FXzFDWUNMRTVfU01QUjJBTExDSEFOTkVMUyAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIEFEQ19TQU1QTEVUSU1FXzdDWUNMRVM1X1NNUFIyQUxMQ0hBTk5FTFMgICAoQURDX1NBTVBMRVRJTUVfQUxMQ0hBTk5FTFNfU01QUjJCSVQwKQorI2RlZmluZSBBRENfU0FNUExFVElNRV8xM0NZQ0xFUzVfU01QUjJBTExDSEFOTkVMUyAgKEFEQ19TQU1QTEVUSU1FX0FMTENIQU5ORUxTX1NNUFIyQklUMSkKKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfMjhDWUNMRVM1X1NNUFIyQUxMQ0hBTk5FTFMgIChBRENfU0FNUExFVElNRV9BTExDSEFOTkVMU19TTVBSMkJJVDEgfCBBRENfU0FNUExFVElNRV9BTExDSEFOTkVMU19TTVBSMkJJVDApCisjZGVmaW5lIEFEQ19TQU1QTEVUSU1FXzQxQ1lDTEVTNV9TTVBSMkFMTENIQU5ORUxTICAoQURDX1NBTVBMRVRJTUVfQUxMQ0hBTk5FTFNfU01QUjJCSVQyKQorI2RlZmluZSBBRENfU0FNUExFVElNRV81NUNZQ0xFUzVfU01QUjJBTExDSEFOTkVMUyAgKEFEQ19TQU1QTEVUSU1FX0FMTENIQU5ORUxTX1NNUFIyQklUMiB8IEFEQ19TQU1QTEVUSU1FX0FMTENIQU5ORUxTX1NNUFIyQklUMCkKKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfNzFDWUNMRVM1X1NNUFIyQUxMQ0hBTk5FTFMgIChBRENfU0FNUExFVElNRV9BTExDSEFOTkVMU19TTVBSMkJJVDIgfCBBRENfU0FNUExFVElNRV9BTExDSEFOTkVMU19TTVBSMkJJVDEpCisjZGVmaW5lIEFEQ19TQU1QTEVUSU1FXzIzOUNZQ0xFUzVfU01QUjJBTExDSEFOTkVMUyAoQURDX1NBTVBMRVRJTUVfQUxMQ0hBTk5FTFNfU01QUjJCSVQyIHwgQURDX1NBTVBMRVRJTUVfQUxMQ0hBTk5FTFNfU01QUjJCSVQxIHwgQURDX1NBTVBMRVRJTUVfQUxMQ0hBTk5FTFNfU01QUjJCSVQwKQorCisjZGVmaW5lIEFEQ19TQU1QTEVUSU1FXzFDWUNMRTVfU01QUjFBTExDSEFOTkVMUyAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIEFEQ19TQU1QTEVUSU1FXzdDWUNMRVM1X1NNUFIxQUxMQ0hBTk5FTFMgICAoQURDX1NBTVBMRVRJTUVfQUxMQ0hBTk5FTFNfU01QUjFCSVQwKQorI2RlZmluZSBBRENfU0FNUExFVElNRV8xM0NZQ0xFUzVfU01QUjFBTExDSEFOTkVMUyAgKEFEQ19TQU1QTEVUSU1FX0FMTENIQU5ORUxTX1NNUFIxQklUMSkKKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfMjhDWUNMRVM1X1NNUFIxQUxMQ0hBTk5FTFMgIChBRENfU0FNUExFVElNRV9BTExDSEFOTkVMU19TTVBSMUJJVDEgfCBBRENfU0FNUExFVElNRV9BTExDSEFOTkVMU19TTVBSMUJJVDApCisjZGVmaW5lIEFEQ19TQU1QTEVUSU1FXzQxQ1lDTEVTNV9TTVBSMUFMTENIQU5ORUxTICAoQURDX1NBTVBMRVRJTUVfQUxMQ0hBTk5FTFNfU01QUjFCSVQyKQorI2RlZmluZSBBRENfU0FNUExFVElNRV81NUNZQ0xFUzVfU01QUjFBTExDSEFOTkVMUyAgKEFEQ19TQU1QTEVUSU1FX0FMTENIQU5ORUxTX1NNUFIxQklUMiB8IEFEQ19TQU1QTEVUSU1FX0FMTENIQU5ORUxTX1NNUFIxQklUMCkKKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfNzFDWUNMRVM1X1NNUFIxQUxMQ0hBTk5FTFMgIChBRENfU0FNUExFVElNRV9BTExDSEFOTkVMU19TTVBSMUJJVDIgfCBBRENfU0FNUExFVElNRV9BTExDSEFOTkVMU19TTVBSMUJJVDEpCisjZGVmaW5lIEFEQ19TQU1QTEVUSU1FXzIzOUNZQ0xFUzVfU01QUjFBTExDSEFOTkVMUyAoQURDX1NBTVBMRVRJTUVfQUxMQ0hBTk5FTFNfU01QUjFCSVQyIHwgQURDX1NBTVBMRVRJTUVfQUxMQ0hBTk5FTFNfU01QUjFCSVQxIHwgQURDX1NBTVBMRVRJTUVfQUxMQ0hBTk5FTFNfU01QUjFCSVQwKQorCisvKiBDb21iaW5hdGlvbiBvZiBhbGwgcG9zdC1jb252ZXJzaW9uIGZsYWdzIGJpdHM6IEVPQy9FT1MsIEpFT0MvSkVPUywgT1ZSLCBBV0R4ICovCisjZGVmaW5lIEFEQ19GTEFHX1BPU1RDT05WX0FMTCAgIChBRENfRkxBR19FT0MgfCBBRENfRkxBR19KRU9DIHwgQURDX0ZMQUdfQVdEICkKKy8qKgorICAqIEB9CisgICovCisgICAgIAorI2VuZGlmIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICovCisgICAgIAorLyoqCisgICogQH0KKyAgKi8KKyAgICAgCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEFEQ0V4X0V4cG9ydGVkX01hY3JvcyBBRENFeCBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworLyogTWFjcm8gZm9yIGludGVybmFsIEhBTCBkcml2ZXIgdXNhZ2UsIGFuZCBwb3NzaWJseSBjYW4gYmUgdXNlZCBpbnRvIGNvZGUgb2YgKi8KKy8qIGZpbmFsIHVzZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIHRoZSBBREMgcGVyaXBoZXJhbAorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUKKyAgKiBAbm90ZSBBREMgZW5hYmxlIHJlcXVpcmVzIGEgZGVsYXkgZm9yIEFEQyBzdGFiaWxpemF0aW9uIHRpbWUKKyAgKiAgICAgICAocmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgcGFyYW1ldGVyIHRTVEFCKQorICAqIEBub3RlIE9uIFNUTTMyRjMgZGV2aWNlcywgc29tZSBoYXJkd2FyZSBjb25zdHJhaW50cyBtdXN0IGJlIHN0cmljdGx5CisgICogICAgICAgcmVzcGVjdGVkIGJlZm9yZSB1c2luZyB0aGlzIG1hY3JvOgorICAqICAgICAgICAtIEFEQyBpbnRlcm5hbCB2b2x0YWdlIHJlZ3VsYXRvciBtdXN0IGJlIHByZWxpbWluYXJpbHkgZW5hYmxlZC4KKyAgKiAgICAgICAgICBUaGlzIGlzIHBlcmZvcm1lZCBieSBmdW5jdGlvbiBIQUxfQURDX0luaXQoKS4KKyAgKiAgICAgICAgLSBBREMgc3RhdGUgcmVxdWlyZW1lbnRzOiBBREMgbXVzdCBiZSBkaXNhYmxlZCwgbm8gY29udmVyc2lvbiBvbiAKKyAgKiAgICAgICAgICBnb2luZywgbm8gY2FsaWJyYXRpb24gb24gZ29pbmcuCisgICogICAgICAgICAgVGhlc2UgY2hlY2tzIGFyZSBwZXJmb3JtZWQgYnkgZnVuY3Rpb25zIEhBTF9BRENfc3RhcnRfeHh4KCkuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0FEQ19FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorIChTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSLCBBRENfQ1JfQURFTikpCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbAorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUKKyAgKiBAbm90ZSBPbiBTVE0zMkYzIGRldmljZXMsIHNvbWUgaGFyZHdhcmUgY29uc3RyYWludHMgbXVzdCBiZSBzdHJpY3RseQorICAqICAgICAgIHJlc3BlY3RlZCBiZWZvcmUgdXNpbmcgdGhpcyBtYWNybzoKKyAgKiAgICAgICAgLSBBREMgc3RhdGUgcmVxdWlyZW1lbnRzOiBBREMgbXVzdCBiZSBlbmFibGVkLCBubyBjb252ZXJzaW9uIG9uIAorICAqICAgICAgICAgIGdvaW5nLgorICAqICAgICAgICAgIFRoZXNlIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGJ5IGZ1bmN0aW9ucyBIQUxfQURDX3N0YXJ0X3h4eCgpLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9BRENfRElTQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSLCBBRENfQ1JfQURESVMpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCAoQURDX0ZMQUdfRU9TTVAgfCBBRENfRkxBR19SRFkpKTsgICAgIFwKKyAgfSB3aGlsZSgwVSkKKworLyoqCisgICogQGJyaWVmIEVuYWJsZSB0aGUgQURDIGVuZCBvZiBjb252ZXJzaW9uIGludGVycnVwdC4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHBhcmFtIF9fSU5URVJSVVBUX18gQURDIEludGVycnVwdAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEFEQ19JVF9SRFk6ICAgQURDIFJlYWR5IChBRFJEWSkgaW50ZXJydXB0IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBBRENfSVRfRU9TTVA6IEFEQyBFbmQgb2YgU2FtcGxpbmcgaW50ZXJydXB0IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBBRENfSVRfRU9DOiAgIEFEQyBFbmQgb2YgUmVndWxhciBDb252ZXJzaW9uIGludGVycnVwdCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0lUX0VPUzogICBBREMgRW5kIG9mIFJlZ3VsYXIgc2VxdWVuY2Ugb2YgQ29udmVyc2lvbnMgaW50ZXJydXB0IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBBRENfSVRfT1ZSOiAgIEFEQyBvdmVycnVuIGludGVycnVwdCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0lUX0pFT0M6ICBBREMgRW5kIG9mIEluamVjdGVkIENvbnZlcnNpb24gaW50ZXJydXB0IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBBRENfSVRfSkVPUzogIEFEQyBFbmQgb2YgSW5qZWN0ZWQgc2VxdWVuY2Ugb2YgQ29udmVyc2lvbnMgaW50ZXJydXB0IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBBRENfSVRfQVdEMTogIEFEQyBBbmFsb2cgd2F0Y2hkb2cgMSBpbnRlcnJ1cHQgc291cmNlIChtYWluIGFuYWxvZyB3YXRjaGRvZywgcHJlc2VudCBvbiBhbGwgU1RNMzIgZGV2aWNlcykKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0lUX0FXRDI6ICBBREMgQW5hbG9nIHdhdGNoZG9nIDIgaW50ZXJydXB0IHNvdXJjZSAoYWRkaXRpb25hbCBhbmFsb2cgd2F0Y2hkb2csIHByZXNlbnQgb25seSBvbiBTVE0zMkYzIGRldmljZXMpCisgICogICAgICAgICAgICBAYXJnIEFEQ19JVF9BV0QzOiAgQURDIEFuYWxvZyB3YXRjaGRvZyAzIGludGVycnVwdCBzb3VyY2UgKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nLCBwcmVzZW50IG9ubHkgb24gU1RNMzJGMyBkZXZpY2VzKQorICAqICAgICAgICAgICAgQGFyZyBBRENfSVRfSlFPVkY6IEFEQyBJbmplY3RlZCBDb250ZXh0IFF1ZXVlIE92ZXJmbG93IGludGVycnVwdCBzb3VyY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQURDX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklFUiwgKF9fSU5URVJSVVBUX18pKSkKKworLyoqCisgICogQGJyaWVmIERpc2FibGUgdGhlIEFEQyBlbmQgb2YgY29udmVyc2lvbiBpbnRlcnJ1cHQuCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQorICAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIEFEQyBJbnRlcnJ1cHQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBBRENfSVRfUkRZOiAgIEFEQyBSZWFkeSAoQURSRFkpIGludGVycnVwdCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0lUX0VPU01QOiBBREMgRW5kIG9mIFNhbXBsaW5nIGludGVycnVwdCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0lUX0VPQzogICBBREMgRW5kIG9mIFJlZ3VsYXIgQ29udmVyc2lvbiBpbnRlcnJ1cHQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIEFEQ19JVF9FT1M6ICAgQURDIEVuZCBvZiBSZWd1bGFyIHNlcXVlbmNlIG9mIENvbnZlcnNpb25zIGludGVycnVwdCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0lUX09WUjogICBBREMgb3ZlcnJ1biBpbnRlcnJ1cHQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIEFEQ19JVF9KRU9DOiAgQURDIEVuZCBvZiBJbmplY3RlZCBDb252ZXJzaW9uIGludGVycnVwdCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0lUX0pFT1M6ICBBREMgRW5kIG9mIEluamVjdGVkIHNlcXVlbmNlIG9mIENvbnZlcnNpb25zIGludGVycnVwdCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0lUX0FXRDE6ICBBREMgQW5hbG9nIHdhdGNoZG9nIDEgaW50ZXJydXB0IHNvdXJjZSAobWFpbiBhbmFsb2cgd2F0Y2hkb2csIHByZXNlbnQgb24gYWxsIFNUTTMyIGRldmljZXMpCisgICogICAgICAgICAgICBAYXJnIEFEQ19JVF9BV0QyOiAgQURDIEFuYWxvZyB3YXRjaGRvZyAyIGludGVycnVwdCBzb3VyY2UgKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nLCBwcmVzZW50IG9ubHkgb24gU1RNMzJGMyBkZXZpY2VzKQorICAqICAgICAgICAgICAgQGFyZyBBRENfSVRfQVdEMzogIEFEQyBBbmFsb2cgd2F0Y2hkb2cgMyBpbnRlcnJ1cHQgc291cmNlIChhZGRpdGlvbmFsIGFuYWxvZyB3YXRjaGRvZywgcHJlc2VudCBvbmx5IG9uIFNUTTMyRjMgZGV2aWNlcykKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0lUX0pRT1ZGOiBBREMgSW5qZWN0ZWQgQ29udGV4dCBRdWV1ZSBPdmVyZmxvdyBpbnRlcnJ1cHQgc291cmNlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0FEQ19ESVNBQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklFUiwgKF9fSU5URVJSVVBUX18pKSkKKworLyoqIEBicmllZiAgQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgQURDIGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHBhcmFtIF9fSU5URVJSVVBUX18gQURDIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2sKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBBRENfSVRfUkRZOiAgIEFEQyBSZWFkeSAoQURSRFkpIGludGVycnVwdCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0lUX0VPU01QOiBBREMgRW5kIG9mIFNhbXBsaW5nIGludGVycnVwdCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0lUX0VPQzogICBBREMgRW5kIG9mIFJlZ3VsYXIgQ29udmVyc2lvbiBpbnRlcnJ1cHQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIEFEQ19JVF9FT1M6ICAgQURDIEVuZCBvZiBSZWd1bGFyIHNlcXVlbmNlIG9mIENvbnZlcnNpb25zIGludGVycnVwdCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0lUX09WUjogICBBREMgb3ZlcnJ1biBpbnRlcnJ1cHQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIEFEQ19JVF9KRU9DOiAgQURDIEVuZCBvZiBJbmplY3RlZCBDb252ZXJzaW9uIGludGVycnVwdCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0lUX0pFT1M6ICBBREMgRW5kIG9mIEluamVjdGVkIHNlcXVlbmNlIG9mIENvbnZlcnNpb25zIGludGVycnVwdCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0lUX0FXRDE6ICBBREMgQW5hbG9nIHdhdGNoZG9nIDEgaW50ZXJydXB0IHNvdXJjZSAobWFpbiBhbmFsb2cgd2F0Y2hkb2csIHByZXNlbnQgb24gYWxsIFNUTTMyIGRldmljZXMpCisgICogICAgICAgICAgICBAYXJnIEFEQ19JVF9BV0QyOiAgQURDIEFuYWxvZyB3YXRjaGRvZyAyIGludGVycnVwdCBzb3VyY2UgKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nLCBwcmVzZW50IG9ubHkgb24gU1RNMzJGMyBkZXZpY2VzKQorICAqICAgICAgICAgICAgQGFyZyBBRENfSVRfQVdEMzogIEFEQyBBbmFsb2cgd2F0Y2hkb2cgMyBpbnRlcnJ1cHQgc291cmNlIChhZGRpdGlvbmFsIGFuYWxvZyB3YXRjaGRvZywgcHJlc2VudCBvbmx5IG9uIFNUTTMyRjMgZGV2aWNlcykKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0lUX0pRT1ZGOiBBREMgSW5qZWN0ZWQgQ29udGV4dCBRdWV1ZSBPdmVyZmxvdyBpbnRlcnJ1cHQgc291cmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBpbnRlcnJ1cHRpb24gKFNFVCBvciBSRVNFVCkKKyAgKi8KKyNkZWZpbmUgX19IQUxfQURDX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUVSICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiBHZXQgdGhlIHNlbGVjdGVkIEFEQydzIGZsYWcgc3RhdHVzLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gX19GTEFHX18gQURDIGZsYWcKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBBRENfRkxBR19SRFk6ICAgQURDIFJlYWR5IChBRFJEWSkgZmxhZworICAqICAgICAgICAgICAgQGFyZyBBRENfRkxBR19FT1NNUDogQURDIEVuZCBvZiBTYW1wbGluZyBmbGFnCisgICogICAgICAgICAgICBAYXJnIEFEQ19GTEFHX0VPQzogICBBREMgRW5kIG9mIFJlZ3VsYXIgQ29udmVyc2lvbiBmbGFnCisgICogICAgICAgICAgICBAYXJnIEFEQ19GTEFHX0VPUzogICBBREMgRW5kIG9mIFJlZ3VsYXIgc2VxdWVuY2Ugb2YgQ29udmVyc2lvbnMgZmxhZworICAqICAgICAgICAgICAgQGFyZyBBRENfRkxBR19PVlI6ICAgQURDIG92ZXJydW4gZmxhZworICAqICAgICAgICAgICAgQGFyZyBBRENfRkxBR19KRU9DOiAgQURDIEVuZCBvZiBJbmplY3RlZCBDb252ZXJzaW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0ZMQUdfSkVPUzogIEFEQyBFbmQgb2YgSW5qZWN0ZWQgc2VxdWVuY2Ugb2YgQ29udmVyc2lvbnMgZmxhZworICAqICAgICAgICAgICAgQGFyZyBBRENfRkxBR19BV0QxOiAgQURDIEFuYWxvZyB3YXRjaGRvZyAxIGZsYWcgKG1haW4gYW5hbG9nIHdhdGNoZG9nLCBwcmVzZW50IG9uIGFsbCBTVE0zMiBkZXZpY2VzKQorICAqICAgICAgICAgICAgQGFyZyBBRENfRkxBR19BV0QyOiAgQURDIEFuYWxvZyB3YXRjaGRvZyAyIGZsYWcgKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nLCBwcmVzZW50IG9ubHkgb24gU1RNMzJGMyBkZXZpY2VzKQorICAqICAgICAgICAgICAgQGFyZyBBRENfRkxBR19BV0QzOiAgQURDIEFuYWxvZyB3YXRjaGRvZyAzIGZsYWcgKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nLCBwcmVzZW50IG9ubHkgb24gU1RNMzJGMyBkZXZpY2VzKQorICAqICAgICAgICAgICAgQGFyZyBBRENfRkxBR19KUU9WRjogQURDIEluamVjdGVkIENvbnRleHQgUXVldWUgT3ZlcmZsb3cgZmxhZworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9BRENfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSKSAmIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpCisKKy8qKgorICAqIEBicmllZiBDbGVhciB0aGUgQURDJ3MgcGVuZGluZyBmbGFncworICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gX19GTEFHX18gQURDIGZsYWcKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBBRENfRkxBR19SRFk6ICAgQURDIFJlYWR5IChBRFJEWSkgZmxhZworICAqICAgICAgICAgICAgQGFyZyBBRENfRkxBR19FT1NNUDogQURDIEVuZCBvZiBTYW1wbGluZyBmbGFnCisgICogICAgICAgICAgICBAYXJnIEFEQ19GTEFHX0VPQzogICBBREMgRW5kIG9mIFJlZ3VsYXIgQ29udmVyc2lvbiBmbGFnCisgICogICAgICAgICAgICBAYXJnIEFEQ19GTEFHX0VPUzogICBBREMgRW5kIG9mIFJlZ3VsYXIgc2VxdWVuY2Ugb2YgQ29udmVyc2lvbnMgZmxhZworICAqICAgICAgICAgICAgQGFyZyBBRENfRkxBR19PVlI6ICAgQURDIG92ZXJydW4gZmxhZworICAqICAgICAgICAgICAgQGFyZyBBRENfRkxBR19KRU9DOiAgQURDIEVuZCBvZiBJbmplY3RlZCBDb252ZXJzaW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0ZMQUdfSkVPUzogIEFEQyBFbmQgb2YgSW5qZWN0ZWQgc2VxdWVuY2Ugb2YgQ29udmVyc2lvbnMgZmxhZworICAqICAgICAgICAgICAgQGFyZyBBRENfRkxBR19BV0QxOiAgQURDIEFuYWxvZyB3YXRjaGRvZyAxIGZsYWcgKG1haW4gYW5hbG9nIHdhdGNoZG9nLCBwcmVzZW50IG9uIGFsbCBTVE0zMiBkZXZpY2VzKQorICAqICAgICAgICAgICAgQGFyZyBBRENfRkxBR19BV0QyOiAgQURDIEFuYWxvZyB3YXRjaGRvZyAyIGZsYWcgKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nLCBwcmVzZW50IG9ubHkgb24gU1RNMzJGMyBkZXZpY2VzKQorICAqICAgICAgICAgICAgQGFyZyBBRENfRkxBR19BV0QzOiAgQURDIEFuYWxvZyB3YXRjaGRvZyAzIGZsYWcgKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nLCBwcmVzZW50IG9ubHkgb24gU1RNMzJGMyBkZXZpY2VzKQorICAqICAgICAgICAgICAgQGFyZyBBRENfRkxBR19KUU9WRjogQURDIEluamVjdGVkIENvbnRleHQgUXVldWUgT3ZlcmZsb3cgZmxhZworICAqIEByZXR2YWwgTm9uZQorICAqLworLyogTm90ZTogYml0IGNsZWFyZWQgYml0IGJ5IHdyaXRpbmcgMSAod3JpdGluZyAwIGhhcyBubyBlZmZlY3Qgb24gYW55IGJpdCBvZiAgKi8KKy8qICAgICAgIHJlZ2lzdGVyIElTUikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIF9fSEFMX0FEQ19DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoV1JJVEVfUkVHKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiwgKF9fRkxBR19fKSkpCisKKy8qKiBAYnJpZWYgIFJlc2V0IEFEQyBoYW5kbGUgc3RhdGUKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gQURDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9BRENfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfQURDX1NUQVRFX1JFU0VUKQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisKKworI2lmIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgdGhlIEFEQyBwZXJpcGhlcmFsCisgICogQG5vdGUgQURDIGVuYWJsZSByZXF1aXJlcyBhIGRlbGF5IGZvciBBREMgc3RhYmlsaXphdGlvbiB0aW1lCisgICogICAgICAgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQsIHBhcmFtZXRlciB0U1RBQikKKyAgKiBAbm90ZSBPbiBTVE0zMkYzN3ggZGV2aWNlcywgaWYgQURDIGlzIGFscmVhZHkgZW5hYmxlZCB0aGlzIG1hY3JvIHRyaWdzCisgICogICAgICAgYSBjb252ZXJzaW9uIFNXIHN0YXJ0IG9uIHJlZ3VsYXIgZ3JvdXAuCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9BRENfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyLCAoQURDX0NSMl9BRE9OKSkpCisgIAorLyoqCisgICogQGJyaWVmIERpc2FibGUgdGhlIEFEQyBwZXJpcGhlcmFsCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9BRENfRElTQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKENMRUFSX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIsIChBRENfQ1IyX0FET04pKSkKKyAgICAKKy8qKiBAYnJpZWYgRW5hYmxlIHRoZSBBREMgZW5kIG9mIGNvbnZlcnNpb24gaW50ZXJydXB0LgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gX19JTlRFUlJVUFRfXyBBREMgSW50ZXJydXB0CisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0lUX0VPQzogQURDIEVuZCBvZiBSZWd1bGFyIENvbnZlcnNpb24gaW50ZXJydXB0IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBBRENfSVRfSkVPQzogQURDIEVuZCBvZiBJbmplY3RlZCBDb252ZXJzaW9uIGludGVycnVwdCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0lUX0FXRDogQURDIEFuYWxvZyB3YXRjaGRvZyBpbnRlcnJ1cHQgc291cmNlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0FEQ19FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEsIChfX0lOVEVSUlVQVF9fKSkpCisKKy8qKiBAYnJpZWYgRGlzYWJsZSB0aGUgQURDIGVuZCBvZiBjb252ZXJzaW9uIGludGVycnVwdC4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHBhcmFtIF9fSU5URVJSVVBUX18gQURDIEludGVycnVwdAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEFEQ19JVF9FT0M6IEFEQyBFbmQgb2YgUmVndWxhciBDb252ZXJzaW9uIGludGVycnVwdCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0lUX0pFT0M6IEFEQyBFbmQgb2YgSW5qZWN0ZWQgQ29udmVyc2lvbiBpbnRlcnJ1cHQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIEFEQ19JVF9BV0Q6IEFEQyBBbmFsb2cgd2F0Y2hkb2cgaW50ZXJydXB0IHNvdXJjZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9BRENfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKENMRUFSX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEsIChfX0lOVEVSUlVQVF9fKSkpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIEFEQyBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQorICAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIEFEQyBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0lUX0VPQzogQURDIEVuZCBvZiBSZWd1bGFyIENvbnZlcnNpb24gaW50ZXJydXB0IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBBRENfSVRfSkVPQzogQURDIEVuZCBvZiBJbmplY3RlZCBDb252ZXJzaW9uIGludGVycnVwdCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0lUX0FXRDogQURDIEFuYWxvZyB3YXRjaGRvZyBpbnRlcnJ1cHQgc291cmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBpbnRlcnJ1cHRpb24gKFNFVCBvciBSRVNFVCkKKyAgKi8KKyNkZWZpbmUgX19IQUxfQURDX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgR2V0IHRoZSBzZWxlY3RlZCBBREMncyBmbGFnIHN0YXR1cy4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHBhcmFtIF9fRkxBR19fIEFEQyBmbGFnCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0ZMQUdfU1RSVDogQURDIFJlZ3VsYXIgZ3JvdXAgc3RhcnQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBBRENfRkxBR19KU1RSVDogQURDIEluamVjdGVkIGdyb3VwIHN0YXJ0IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0ZMQUdfRU9DOiBBREMgRW5kIG9mIFJlZ3VsYXIgY29udmVyc2lvbiBmbGFnCisgICogICAgICAgICAgICBAYXJnIEFEQ19GTEFHX0pFT0M6IEFEQyBFbmQgb2YgSW5qZWN0ZWQgY29udmVyc2lvbiBmbGFnCisgICogICAgICAgICAgICBAYXJnIEFEQ19GTEFHX0FXRDogQURDIEFuYWxvZyB3YXRjaGRvZyBmbGFnCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0FEQ19HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUikgJiAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKQorICAgIAorLyoqIEBicmllZiBDbGVhciB0aGUgQURDJ3MgcGVuZGluZyBmbGFncworICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gX19GTEFHX18gQURDIGZsYWcKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBBRENfRkxBR19TVFJUOiBBREMgUmVndWxhciBncm91cCBzdGFydCBmbGFnCisgICogICAgICAgICAgICBAYXJnIEFEQ19GTEFHX0pTVFJUOiBBREMgSW5qZWN0ZWQgZ3JvdXAgc3RhcnQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBBRENfRkxBR19FT0M6IEFEQyBFbmQgb2YgUmVndWxhciBjb252ZXJzaW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0ZMQUdfSkVPQzogQURDIEVuZCBvZiBJbmplY3RlZCBjb252ZXJzaW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0ZMQUdfQVdEOiBBREMgQW5hbG9nIHdhdGNoZG9nIGZsYWcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQURDX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChXUklURV9SRUcoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1IsIH4oX19GTEFHX18pKSkKKworLyoqIEBicmllZiAgUmVzZXQgQURDIGhhbmRsZSBzdGF0ZQorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0FEQ19SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9BRENfU1RBVEVfUkVTRVQpCisjZW5kaWYgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgQURDRXhfUHJpdmF0ZV9NYWNybyBBRENFeCBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisvKiBNYWNybyByZXNlcnZlZCBmb3IgaW50ZXJuYWwgSEFMIGRyaXZlciB1c2FnZSwgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgaW4gICAqLworLyogY29kZSBvZiBmaW5hbCB1c2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIAorI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisKKy8qKgorICAqIEBicmllZiBWZXJpZmljYXRpb24gb2YgaGFyZHdhcmUgY29uc3RyYWludHMgYmVmb3JlIEFEQyBjYW4gYmUgZW5hYmxlZAorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIFNFVCAoQURDIGNhbiBiZSBlbmFibGVkKSBvciBSRVNFVCAoQURDIGNhbm5vdCBiZSBlbmFibGVkKQorICAqLworI2RlZmluZSBBRENfRU5BQkxJTkdfQ09ORElUSU9OUyhfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCggSEFMX0lTX0JJVF9DTFIoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgICAgICAgICAgICAgICAgICAgICAgICAsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIChBRENfQ1JfQURDQUwgICAgfCBBRENfQ1JfSkFEU1RQIHwgQURDX0NSX0FEU1RQIHwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgQURDX0NSX0pBRFNUQVJUIHxBRENfQ1JfQURTVEFSVCB8IEFEQ19DUl9BRERJUyB8ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIEFEQ19DUl9BREVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgKSAgICAgICBcCisgICApID8gU0VUIDogUkVTRVQpCisKKy8qKgorICAqIEBicmllZiBWZXJpZmljYXRpb24gb2YgQURDIHN0YXRlOiBlbmFibGVkIG9yIGRpc2FibGVkCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQorICAqIEByZXR2YWwgU0VUIChBREMgZW5hYmxlZCkgb3IgUkVTRVQgKEFEQyBkaXNhYmxlZCkKKyAgKi8KKyNkZWZpbmUgQURDX0lTX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCggKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IpICYgKEFEQ19DUl9BREVOIHwgQURDX0NSX0FERElTKSkgPT0gQURDX0NSX0FERU4pICYmIFwKKyAgICAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSKSAmIEFEQ19GTEFHX1JEWSkgPT0gQURDX0ZMQUdfUkRZKSAgICAgICAgICAgICAgICAgIFwKKyAgICkgPyBTRVQgOiBSRVNFVCkKKworLyoqCisgICogQGJyaWVmIFRlc3QgaWYgY29udmVyc2lvbiB0cmlnZ2VyIG9mIHJlZ3VsYXIgZ3JvdXAgaXMgc29mdHdhcmUgc3RhcnQKKyAgKiAgICAgICAgb3IgZXh0ZXJuYWwgdHJpZ2dlci4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHJldHZhbCBTRVQgKHNvZnR3YXJlIHN0YXJ0KSBvciBSRVNFVCAoZXh0ZXJuYWwgdHJpZ2dlcikKKyAgKi8KKyNkZWZpbmUgQURDX0lTX1NPRlRXQVJFX1NUQVJUX1JFR1VMQVIoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0ZHUiAmIEFEQ19DRkdSX0VYVEVOKSA9PSBSRVNFVCkKKworLyoqCisgICogQGJyaWVmIFRlc3QgaWYgY29udmVyc2lvbiB0cmlnZ2VyIG9mIGluamVjdGVkIGdyb3VwIGlzIHNvZnR3YXJlIHN0YXJ0CisgICogICAgICAgIG9yIGV4dGVybmFsIHRyaWdnZXIuCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQorICAqIEByZXR2YWwgU0VUIChzb2Z0d2FyZSBzdGFydCkgb3IgUkVTRVQgKGV4dGVybmFsIHRyaWdnZXIpCisgICovCisjZGVmaW5lIEFEQ19JU19TT0ZUV0FSRV9TVEFSVF9JTkpFQ1RFRChfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkpTUVIgJiBBRENfSlNRUl9KRVhURU4pID09IFJFU0VUKQorCisvKioKKyAgKiBAYnJpZWYgQ2hlY2sgaWYgbm8gY29udmVyc2lvbiBvbiBnb2luZyBvbiByZWd1bGFyIGFuZC9vciBpbmplY3RlZCBncm91cHMKKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHJldHZhbCBTRVQgKGNvbnZlcnNpb24gaXMgb24gZ29pbmcpIG9yIFJFU0VUIChubyBjb252ZXJzaW9uIGlzIG9uIGdvaW5nKQorICAqLworI2RlZmluZSBBRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX1JFR1VMQVJfSU5KRUNURUQoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICBcCisgICgoICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IpICYgKEFEQ19DUl9BRFNUQVJUIHwgQURDX0NSX0pBRFNUQVJUKSkgPT0gUkVTRVQgIFwKKyAgICkgPyBSRVNFVCA6IFNFVCkKKworLyoqCisgICogQGJyaWVmIENoZWNrIGlmIG5vIGNvbnZlcnNpb24gb24gZ29pbmcgb24gcmVndWxhciBncm91cAorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIFNFVCAoY29udmVyc2lvbiBpcyBvbiBnb2luZykgb3IgUkVTRVQgKG5vIGNvbnZlcnNpb24gaXMgb24gZ29pbmcpCisgICovCisjZGVmaW5lIEFEQ19JU19DT05WRVJTSU9OX09OR09JTkdfUkVHVUxBUihfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSKSAmIEFEQ19DUl9BRFNUQVJUKSA9PSBSRVNFVCAgICAgICAgICAgICAgICAgIFwKKyAgICkgPyBSRVNFVCA6IFNFVCkKKworLyoqCisgICogQGJyaWVmIENoZWNrIGlmIG5vIGNvbnZlcnNpb24gb24gZ29pbmcgb24gaW5qZWN0ZWQgZ3JvdXAKKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHJldHZhbCBTRVQgKGNvbnZlcnNpb24gaXMgb24gZ29pbmcpIG9yIFJFU0VUIChubyBjb252ZXJzaW9uIGlzIG9uIGdvaW5nKQorICAqLworI2RlZmluZSBBRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX0lOSkVDVEVEKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCggKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUikgJiBBRENfQ1JfSkFEU1RBUlQpID09IFJFU0VUICAgICAgICAgICAgICAgICBcCisgICApID8gUkVTRVQgOiBTRVQpCisKKy8qKgorICAqIEBicmllZiBSZXR1cm5zIHJlc29sdXRpb24gYml0cyBpbiBDRkdSMSByZWdpc3RlcjogUkVTWzE6MF0uCisgICogICAgICAgIFJldHVybmVkIHZhbHVlIGlzIGFtb25nIHBhcmFtZXRlcnMgdG8gQHJlZiBBRENFeF9SZXNvbHV0aW9uLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgQURDX0dFVF9SRVNPTFVUSU9OKF9fSEFORExFX18pICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0ZHUikgJiBBRENfQ0ZHUl9SRVMpCisKKy8qKgorICAqIEBicmllZiBTaW11bHRhbmVvdXNseSBjbGVhcnMgYW5kIHNldHMgc3BlY2lmaWMgYml0cyBvZiB0aGUgaGFuZGxlIFN0YXRlCisgICogQG5vdGU6IEFEQ19TVEFURV9DTFJfU0VUKCkgbWFjcm8gaXMgbWVyZWx5IGFsaWFzZWQgdG8gZ2VuZXJpYyBtYWNybyBNT0RJRllfUkVHKCksCisgICogICAgICAgIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIEFEQyBoYW5kbGUgU3RhdGUsIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIHRoZQorICAqICAgICAgICBiaXQgZmllbGQgdG8gY2xlYXIsIHRoZSB0aGlyZCBhbmQgbGFzdCBwYXJhbWV0ZXIgaXMgdGhlIGJpdCBmaWVsZCB0byBzZXQuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIEFEQ19TVEFURV9DTFJfU0VUIE1PRElGWV9SRUcKKworLyoqCisgICogQGJyaWVmIENsZWFyIEFEQyBlcnJvciBjb2RlIChzZXQgaXQgdG8gZXJyb3IgY29kZTogIm5vIGVycm9yIikKKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIEFEQ19DTEVBUl9FUlJPUkNPREUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+RXJyb3JDb2RlID0gSEFMX0FEQ19FUlJPUl9OT05FKQorICAgICAgICAgCisvKioKKyAgKiBAYnJpZWYgU2V0IHRoZSBBREMncyBzYW1wbGUgdGltZSBmb3IgQ2hhbm5lbHMgbnVtYmVycyBiZXR3ZWVuIDAgYW5kIDkuCisgICogQHBhcmFtIF9TQU1QTEVUSU1FXyBTYW1wbGUgdGltZSBwYXJhbWV0ZXIuCisgICogQHBhcmFtIF9DSEFOTkVMTkJfIENoYW5uZWwgbnVtYmVyLiAgCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIEFEQ19TTVBSMShfU0FNUExFVElNRV8sIF9DSEFOTkVMTkJfKSAoKF9TQU1QTEVUSU1FXykgPDwgKDNVICogKF9DSEFOTkVMTkJfKSkpCisgICAgCisvKioKKyAgKiBAYnJpZWYgU2V0IHRoZSBBREMncyBzYW1wbGUgdGltZSBmb3IgQ2hhbm5lbHMgbnVtYmVycyBiZXR3ZWVuIDEwIGFuZCAxOC4KKyAgKiBAcGFyYW0gX1NBTVBMRVRJTUVfIFNhbXBsZSB0aW1lIHBhcmFtZXRlci4KKyAgKiBAcGFyYW0gX0NIQU5ORUxOQl8gQ2hhbm5lbCBudW1iZXIuICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgQURDX1NNUFIyKF9TQU1QTEVUSU1FXywgX0NIQU5ORUxOQl8pICgoX1NBTVBMRVRJTUVfKSA8PCAoM1UgKiAoKF9DSEFOTkVMTkJfKSAtIDEwVSkpKQorCisvKioKKyAgKiBAYnJpZWYgU2V0IHRoZSBzZWxlY3RlZCByZWd1bGFyIENoYW5uZWwgcmFuayBmb3IgcmFuayBiZXR3ZWVuIDEgYW5kIDQuCisgICogQHBhcmFtIF9DSEFOTkVMTkJfIENoYW5uZWwgbnVtYmVyLgorICAqIEBwYXJhbSBfUkFOS05CXyBSYW5rIG51bWJlci4gICAgCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIEFEQ19TUVIxX1JLKF9DSEFOTkVMTkJfLCBfUkFOS05CXykgKChfQ0hBTk5FTE5CXykgPDwgKDZVICogKF9SQU5LTkJfKSkpCisKKy8qKgorICAqIEBicmllZiBTZXQgdGhlIHNlbGVjdGVkIHJlZ3VsYXIgQ2hhbm5lbCByYW5rIGZvciByYW5rIGJldHdlZW4gNSBhbmQgOS4KKyAgKiBAcGFyYW0gX0NIQU5ORUxOQl8gQ2hhbm5lbCBudW1iZXIuCisgICogQHBhcmFtIF9SQU5LTkJfIFJhbmsgbnVtYmVyLiAgICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgQURDX1NRUjJfUksoX0NIQU5ORUxOQl8sIF9SQU5LTkJfKSAoKF9DSEFOTkVMTkJfKSA8PCAoNlUgKiAoKF9SQU5LTkJfKSAtIDVVKSkpCisKKy8qKgorICAqIEBicmllZiBTZXQgdGhlIHNlbGVjdGVkIHJlZ3VsYXIgQ2hhbm5lbCByYW5rIGZvciByYW5rIGJldHdlZW4gMTAgYW5kIDE0LgorICAqIEBwYXJhbSBfQ0hBTk5FTE5CXyBDaGFubmVsIG51bWJlci4KKyAgKiBAcGFyYW0gX1JBTktOQl8gUmFuayBudW1iZXIuICAgIAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBBRENfU1FSM19SSyhfQ0hBTk5FTE5CXywgX1JBTktOQl8pICgoX0NIQU5ORUxOQl8pIDw8ICg2VSAqICgoX1JBTktOQl8pIC0gMTBVKSkpCisKKy8qKgorICAqIEBicmllZiBTZXQgdGhlIHNlbGVjdGVkIHJlZ3VsYXIgQ2hhbm5lbCByYW5rIGZvciByYW5rIGJldHdlZW4gMTUgYW5kIDE2LgorICAqIEBwYXJhbSBfQ0hBTk5FTE5CXyBDaGFubmVsIG51bWJlci4KKyAgKiBAcGFyYW0gX1JBTktOQl8gUmFuayBudW1iZXIuICAgIAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBBRENfU1FSNF9SSyhfQ0hBTk5FTE5CXywgX1JBTktOQl8pICgoX0NIQU5ORUxOQl8pIDw8ICg2VSAqICgoX1JBTktOQl8pIC0gMTVVKSkpCisKKy8qKgorICAqIEBicmllZiBTZXQgdGhlIHNlbGVjdGVkIGluamVjdGVkIENoYW5uZWwgcmFuay4KKyAgKiBAcGFyYW0gX0NIQU5ORUxOQl8gQ2hhbm5lbCBudW1iZXIuCisgICogQHBhcmFtIF9SQU5LTkJfIFJhbmsgbnVtYmVyLiAgIAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBBRENfSlNRUl9SSyhfQ0hBTk5FTE5CXywgX1JBTktOQl8pICgoX0NIQU5ORUxOQl8pIDw8ICg2VSAqIChfUkFOS05CXykgKzJVKSkKKworCisvKioKKyAgKiBAYnJpZWYgU2V0IHRoZSBBbmFsb2cgV2F0Y2hkb2cgMSBjaGFubmVsLgorICAqIEBwYXJhbSBfQ0hBTk5FTF8gY2hhbm5lbCB0byBiZSBtb25pdG9yZWQgYnkgQW5hbG9nIFdhdGNoZG9nIDEuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIEFEQ19DRkdSX0FXRDFDSF9TSElGVChfQ0hBTk5FTF8pICgoX0NIQU5ORUxfKSA8PCAyNlUpCisKKy8qKgorICAqIEBicmllZiBDb25maWd1cmUgdGhlIGNoYW5uZWwgbnVtYmVyIGludG8gQW5hbG9nIFdhdGNoZG9nIDIgb3IgMy4KKyAgKiBAcGFyYW0gX0NIQU5ORUxfIEFEQyBDaGFubmVsCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIEFEQ19DRkdSX0FXRDIzQ1IoX0NIQU5ORUxfKSAoMVUgPDwgKF9DSEFOTkVMXykpIAorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIGF1dG9tYXRpYyBjb252ZXJzaW9uIG9mIGluamVjdGVkIGdyb3VwCisgICogQHBhcmFtIF9JTkpFQ1RfQVVUT19DT05WRVJTSU9OXyBJbmplY3RlZCBhdXRvbWF0aWMgY29udmVyc2lvbi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgQURDX0NGR1JfSU5KRUNUX0FVVE9fQ09OVkVSU0lPTihfSU5KRUNUX0FVVE9fQ09OVkVSU0lPTl8pICgoX0lOSkVDVF9BVVRPX0NPTlZFUlNJT05fKSA8PCAyNVUpCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgQURDIGluamVjdGVkIGNvbnRleHQgcXVldWUKKyAgKiBAcGFyYW0gX0lOSkVDVF9DT05URVhUX1FVRVVFX01PREVfIEluamVjdGVkIGNvbnRleHQgcXVldWUgbW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgQURDX0NGR1JfSU5KRUNUX0NPTlRFWFRfUVVFVUUoX0lOSkVDVF9DT05URVhUX1FVRVVFX01PREVfKSAoKF9JTkpFQ1RfQ09OVEVYVF9RVUVVRV9NT0RFXykgPDwgMjFVKQorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIEFEQyBkaXNjb250aW51b3VzIGNvbnZlcnNpb24gbW9kZSBmb3IgaW5qZWN0ZWQgZ3JvdXAKKyAgKiBAcGFyYW0gX0lOSkVDVF9ESVNDT05USU5VT1VTX01PREVfIEluamVjdGVkIGRpc2NvbnRpbnVvdXMgbW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgQURDX0NGR1JfSU5KRUNUX0RJU0NDT05USU5VT1VTKF9JTkpFQ1RfRElTQ09OVElOVU9VU19NT0RFXykgKChfSU5KRUNUX0RJU0NPTlRJTlVPVVNfTU9ERV8pIDw8IDIwVSkKKworLyoqCisgICogQGJyaWVmIEVuYWJsZSBBREMgZGlzY29udGludW91cyBjb252ZXJzaW9uIG1vZGUgZm9yIHJlZ3VsYXIgZ3JvdXAKKyAgKiBAcGFyYW0gX1JFR19ESVNDT05USU5VT1VTX01PREVfIFJlZ3VsYXIgZGlzY29udGludW91cyBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBBRENfQ0ZHUl9SRUdfRElTQ0NPTlRJTlVPVVMoX1JFR19ESVNDT05USU5VT1VTX01PREVfKSAoKF9SRUdfRElTQ09OVElOVU9VU19NT0RFXykgPDwgMTZVKQorCisvKioKKyAgKiBAYnJpZWYgQ29uZmlndXJlcyB0aGUgbnVtYmVyIG9mIGRpc2NvbnRpbnVvdXMgY29udmVyc2lvbnMgZm9yIHJlZ3VsYXIgZ3JvdXAuCisgICogQHBhcmFtIF9OQlJfRElTQ09OVElOVU9VU19DT05WXyBOdW1iZXIgb2YgZGlzY29udGludW91cyBjb252ZXJzaW9ucy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgQURDX0NGR1JfRElTQ09OVElOVU9VU19OVU0oX05CUl9ESVNDT05USU5VT1VTX0NPTlZfKSAoKChfTkJSX0RJU0NPTlRJTlVPVVNfQ09OVl8pIC0gMVUpIDw8IDE3VSkKKworLyoqCisgICogQGJyaWVmIEVuYWJsZSB0aGUgQURDIGF1dG8gZGVsYXkgbW9kZS4KKyAgKiBAcGFyYW0gX0FVVE9XQUlUXyBBdXRvIGRlbGF5IGJpdCBlbmFibGUgb3IgZGlzYWJsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgQURDX0NGR1JfQVVUT1dBSVQoX0FVVE9XQUlUXykgKChfQVVUT1dBSVRfKSA8PCAxNFUpCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgQURDIGNvbnRpbnVvdXMgY29udmVyc2lvbiBtb2RlLgorICAqIEBwYXJhbSBfQ09OVElOVU9VU19NT0RFXyBDb250aW51b3VzIG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIEFEQ19DRkdSX0NPTlRJTlVPVVMoX0NPTlRJTlVPVVNfTU9ERV8pICgoX0NPTlRJTlVPVVNfTU9ERV8pIDw8IDEzVSkKKyAgICAKKy8qKgorICAqIEBicmllZiBFbmFibGUgQURDIG92ZXJydW4gbW9kZS4KKyAgKiBAcGFyYW0gX09WRVJSVU5fTU9ERV8gT3ZlcnJ1biBtb2RlLgorICAqIEByZXR2YWwgT3ZlcnJ1biBiaXQgc2V0dGluZyB0byBiZSBwcm9ncmFtbWVkIGludG8gQ0ZHUiByZWdpc3RlcgorICAqLworLyogTm90ZTogQml0IEFEQ19DRkdSX09WUk1PRCBub3QgdXNlZCBkaXJlY3RseSBpbiBjb25zdGFudCAgICAgICAgICAgICAgICAgICAgKi8KKy8qICJBRENfT1ZSX0RBVEFfT1ZFUldSSVRURU4iIHRvIGhhdmUgdGhpcyBjYXNlIGRlZmluZWQgdG8gMHgwMFUsIHRvIHNldCBpdCAgICAqLworLyogYXMgdGhlIGRlZmF1bHQgY2FzZSB0byBiZSBjb21wbGlhbnQgd2l0aCBvdGhlciBTVE0zMiBkZXZpY2VzLiAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX0NGR1JfT1ZFUlJVTihfT1ZFUlJVTl9NT0RFXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggKCAoX09WRVJSVU5fTU9ERV8pICE9IChBRENfT1ZSX0RBVEFfUFJFU0VSVkVEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICk/IChBRENfQ0ZHUl9PVlJNT0QpIDogKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKworLyoqCisgICogQGJyaWVmIEVuYWJsZSB0aGUgQURDIERNQSBjb250aW51b3VzIHJlcXVlc3QuCisgICogQHBhcmFtIF9ETUFDT05UUkVRX01PREVfIERNQSBjb250aW51b3VzIHJlcXVlc3QgbW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgQURDX0NGR1JfRE1BQ09OVFJFUShfRE1BQ09OVFJFUV9NT0RFXykgKChfRE1BQ09OVFJFUV9NT0RFXykgPDwgMVUpCisKKy8qKgorICAqIEBicmllZiBGb3IgZGV2aWNlcyB3aXRoIDMgQURDcyBvciBtb3JlOiBEZWZpbmVzIHRoZSBleHRlcm5hbCB0cmlnZ2VyIHNvdXJjZSAKKyAgKiAgICAgICAgZm9yIHJlZ3VsYXIgZ3JvdXAgYWNjb3JkaW5nIHRvIEFEQyBpbnRvIGNvbW1vbiBncm91cCBBREMxJkFEQzIgb3IgCisgICogICAgICAgIEFEQzMmQURDNCAoc29tZSB0cmlnZ2VycyB3aXRoIHNhbWUgc291cmNlIGhhdmUgZGlmZmVyZW50IHZhbHVlIHRvCisgICogICAgICAgIGJlIHByb2dyYW1tZWQgaW50byBBREMgRVhUU0VMIGJpdHMgb2YgQ0ZHUiByZWdpc3RlcikuCisgICogICAgICAgIE5vdGU6IE5vIHJpc2sgb2YgdHJpZ2dlciBiaXRzIHZhbHVlIG9mIGNvbW1vbiBncm91cCBBREMxJkFEQzIgCisgICogICAgICAgIG1pc2xlYWRpbmcgdG8gYW5vdGhlciB0cmlnZ2VyIGF0IHNhbWUgYml0cyB2YWx1ZSwgYmVjYXVzZSB0aGUgMworICAqICAgICAgICBleGNlcHRpb25zIGJlbG93IGFyZSBjaXJjdWxhciBhbmQgZG8gbm90IHBvaW50IHRvIGFueSBvdGhlciB0cmlnZ2VyCisgICogICAgICAgIHdpdGggZGlyZWN0IHRyZWF0bWVudC4KKyAgKiAgICAgICAgRm9yIGRldmljZXMgd2l0aCAyIEFEQ3Mgb3IgbGVzczogdGhpcyBtYWNybyBtYWtlcyBubyBjaGFuZ2UuCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQorICAqIEBwYXJhbSBfX0VYVF9UUklHX0NPTlZfXyBFeHRlcm5hbCB0cmlnZ2VyIHNlbGVjdGVkIGZvciByZWd1bGFyIGdyb3VwLgorICAqIEByZXR2YWwgRXh0ZXJuYWwgdHJpZ2dlciB0byBiZSBwcm9ncmFtbWVkIGludG8gRVhUU0VMIGJpdHMgb2YgQ0ZHUiByZWdpc3RlcgorICAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkKKyNkZWZpbmUgQURDX0NGR1JfRVhUU0VMX1NFVChfX0hBTkRMRV9fLCBfX0VYVF9UUklHX0NPTlZfXykgICAgICAgICAgICAgICAgICAgICBcCisgKCggKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gQURDMykgfHwgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREM0KSkgXAorICApPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICggKCAoX19FWFRfVFJJR19DT05WX18pID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyX1RSR08gICAgICAgICAgICAgICAgICAgICBcCisgICAgICk/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKEFEQzNfNF9FWFRFUk5BTFRSSUdfVDJfVFJHTykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoICggKF9fRVhUX1RSSUdfQ09OVl9fKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UM19UUkdPICAgICAgICAgICAgICAgICAgXAorICAgICAgICApPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIChBREMzXzRfRVhURVJOQUxUUklHX1QzX1RSR08pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgKCAoIChfX0VYVF9UUklHX0NPTlZfXykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDhfVFJHTyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgKT8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoQURDM180X0VYVEVSTkFMVFJJR19UOF9UUkdPKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIChfX0VYVF9UUklHX0NPTlZfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKF9fRVhUX1RSSUdfQ09OVl9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyApCisjZW5kaWYgLyogU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggKi8KKyAgIAorI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisvKiBOb3RlOiBNYWNybyBpbmNsdWRpbmcgZXh0ZXJuYWwgdHJpZ2dlcnMgc3BlY2lmaWMgdG8gZGV2aWNlIFNUTTMwM3hFOiB1c2luZyAqLworLyogICAgICAgVGltZXIyMCB3aXRoIEFEQyB0cmlnZ2VyIGlucHV0IHJlbWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX0NGR1JfRVhUU0VMX1NFVChfX0hBTkRMRV9fLCBfX0VYVF9UUklHX0NPTlZfXykgICAgICAgICAgICAgICAgICAgICBcCisgKCggKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gQURDMykgfHwgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREM0KSkgXAorICApPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICggKCAoX19FWFRfVFJJR19DT05WX18pID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyX1RSR08gICAgICAgICAgICAgICAgICAgICBcCisgICAgICk/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKEFEQzNfNF9FWFRFUk5BTFRSSUdfVDJfVFJHTykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoICggKF9fRVhUX1RSSUdfQ09OVl9fKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UM19UUkdPICAgICAgICAgICAgICAgICAgXAorICAgICAgICApPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIChBREMzXzRfRVhURVJOQUxUUklHX1QzX1RSR08pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgKCAoIChfX0VYVF9UUklHX0NPTlZfXykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDhfVFJHTyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgKT8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoQURDM180X0VYVEVSTkFMVFJJR19UOF9UUkdPKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICggKCAoX19FWFRfVFJJR19DT05WX18pID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyMF9DQzEgICAgICAgICAgICBcCisgICAgICAgICAgICAgICk/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgKEFEQzNfNF9FWFRFUk5BTFRSSUdfVDJfQ0MxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKCAoIChfX0VYVF9UUklHX0NPTlZfXykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDIwX1RSR08gICAgICAgXAorICAgICAgICAgICAgICAgICAgKT8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAoQURDM180X0VYVEVSTkFMVFJJR19FWFRfSVQyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAoICggKF9fRVhUX1RSSUdfQ09OVl9fKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMjBfVFJHTzIgIFwKKyAgICAgICAgICAgICAgICAgICAgICApPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIChBREMzXzRfRVhURVJOQUxUUklHX1Q0X0NDMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgKF9fRVhUX1RSSUdfQ09OVl9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKF9fRVhUX1RSSUdfQ09OVl9fICYgKH5BRENfRVhURVJOQUxUUklHQ09OVl9UMjBfTUFTSykpICAgICAgICAgICAgICAgICAgICAgIFwKKyApCisjZW5kaWYgLyogU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggKi8KKyNlbHNlCisjZGVmaW5lIEFEQ19DRkdSX0VYVFNFTF9TRVQoX19IQU5ETEVfXywgX19FWFRfVFJJR19DT05WX18pICAgICAgICAgICAgICAgICAgICAgXAorICAgKF9fRVhUX1RSSUdfQ09OVl9fKQorI2VuZGlmIC8qIFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggICAgKi8KKworLyoqCisgICogQGJyaWVmIEZvciBkZXZpY2VzIHdpdGggMyBBRENzIG9yIG1vcmU6IERlZmluZXMgdGhlIGV4dGVybmFsIHRyaWdnZXIgc291cmNlIAorICAqICAgICAgICBmb3IgaW5qZWN0ZWQgZ3JvdXAgYWNjb3JkaW5nIHRvIEFEQyBpbnRvIGNvbW1vbiBncm91cCBBREMxJkFEQzIgb3IgCisgICogICAgICAgIEFEQzMmQURDNCAoc29tZSB0cmlnZ2VycyB3aXRoIHNhbWUgc291cmNlIGhhdmUgZGlmZmVyZW50IHZhbHVlIHRvCisgICogICAgICAgIGJlIHByb2dyYW1tZWQgaW50byBBREMgSkVYVFNFTCBiaXRzIG9mIEpTUVIgcmVnaXN0ZXIpLgorICAqICAgICAgICBOb3RlOiBObyByaXNrIG9mIHRyaWdnZXIgYml0cyB2YWx1ZSBvZiBjb21tb24gZ3JvdXAgQURDMSZBREMyIAorICAqICAgICAgICBtaXNsZWFkaW5nIHRvIGFub3RoZXIgdHJpZ2dlciBhdCBzYW1lIGJpdHMgdmFsdWUsIGJlY2F1c2UgdGhlIDMKKyAgKiAgICAgICAgZXhjZXB0aW9ucyBiZWxvdyBhcmUgY2lyY3VsYXIgYW5kIGRvIG5vdCBwb2ludCB0byBhbnkgb3RoZXIgdHJpZ2dlcgorICAqICAgICAgICB3aXRoIGRpcmVjdCB0cmVhdG1lbnQsIGV4Y2VwdCB0cmlnZ2VyCisgICogICAgICAgIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDRfQ0MzIGRpZmZlcmVudGlhdGVkIHdpdGggU1cgb2Zmc2V0LgorICAqICAgICAgICBGb3IgZGV2aWNlcyB3aXRoIDIgQURDcyBvciBsZXNzOiB0aGlzIG1hY3JvIG1ha2VzIG5vIGNoYW5nZS4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHBhcmFtIF9fRVhUX1RSSUdfSU5KRUNUQ09OVl9fIEV4dGVybmFsIHRyaWdnZXIgc2VsZWN0ZWQgZm9yIGluamVjdGVkIGdyb3VwCisgICogQHJldHZhbCBFeHRlcm5hbCB0cmlnZ2VyIHRvIGJlIHByb2dyYW1tZWQgaW50byBKRVhUU0VMIGJpdHMgb2YgSlNRUiByZWdpc3RlcgorICAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkKKyNkZWZpbmUgQURDX0pTUVJfSkVYVFNFTF9TRVQoX19IQU5ETEVfXywgX19FWFRfVFJJR19JTkpFQ1RDT05WX18pICAgICAgICAgICAgICBcCisgKCggKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gQURDMykgfHwgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREM0KSkgXAorICApPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICggKCAoX19FWFRfVFJJR19JTkpFQ1RDT05WX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDJfVFJHTyAgICAgICAgICBcCisgICAgICk/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKEFEQzNfNF9FWFRFUk5BTFRSSUdJTkpFQ19UMl9UUkdPKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoICggKF9fRVhUX1RSSUdfSU5KRUNUQ09OVl9fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q0X1RSR08gICAgICAgXAorICAgICAgICApPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIChBREMzXzRfRVhURVJOQUxUUklHSU5KRUNfVDRfVFJHTykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgKCAoIChfX0VYVF9UUklHX0lOSkVDVENPTlZfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UOF9DQzQgICAgIFwKKyAgICAgICAgICAgKT8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoQURDM180X0VYVEVSTkFMVFJJR0lOSkVDX1Q4X0NDNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICggKCAoX19FWFRfVFJJR19JTkpFQ1RDT05WX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDRfQ0MzICBcCisgICAgICAgICAgICAgICk/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgKEFEQzNfNF9FWFRFUk5BTFRSSUdJTkpFQ19UNF9DQzMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAoX19FWFRfVFJJR19JTkpFQ1RDT05WX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoX19FWFRfVFJJR19JTkpFQ1RDT05WX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICkKKyNlbmRpZiAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAqLworICAgCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkKKy8qIE5vdGU6IE1hY3JvIGluY2x1ZGluZyBleHRlcm5hbCB0cmlnZ2VycyBzcGVjaWZpYyB0byBkZXZpY2UgU1RNMzAzeEU6IHVzaW5nICovCisvKiAgICAgICBUaW1lcjIwIHdpdGggQURDIHRyaWdnZXIgaW5wdXQgcmVtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRENfSlNRUl9KRVhUU0VMX1NFVChfX0hBTkRMRV9fLCBfX0VYVF9UUklHX0lOSkVDVENPTlZfXykgICAgICAgICAgICAgIFwKKyAoKCAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREMzKSB8fCAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09IEFEQzQpKSBcCisgICk/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCAoIChfX0VYVF9UUklHX0lOSkVDVENPTlZfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMl9UUkdPICAgICAgICAgIFwKKyAgICAgKT8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoQURDM180X0VYVEVSTkFMVFJJR0lOSkVDX1QyX1RSR08pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICggKCAoX19FWFRfVFJJR19JTkpFQ1RDT05WX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDRfVFJHTyAgICAgICBcCisgICAgICAgICk/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgKEFEQzNfNF9FWFRFUk5BTFRSSUdJTkpFQ19UNF9UUkdPKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAoICggKF9fRVhUX1RSSUdfSU5KRUNUQ09OVl9fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q4X0NDNCAgICAgXAorICAgICAgICAgICApPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIChBREMzXzRfRVhURVJOQUxUUklHSU5KRUNfVDhfQ0M0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKCAoIChfX0VYVF9UUklHX0lOSkVDVENPTlZfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UNF9DQzMgIFwKKyAgICAgICAgICAgICAgKT8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAoQURDM180X0VYVEVSTkFMVFJJR0lOSkVDX1Q0X0NDMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoICggKF9fRVhUX1RSSUdfSU5KRUNUQ09OVl9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDIwX1RSR08gXAorICAgICAgICAgICAgICAgICAgKT8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAoQURDM180X0VYVEVSTkFMVFJJR0lOSkVDX1QyMF9UUkdPKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAoICggKF9fRVhUX1RSSUdfSU5KRUNUQ09OVl9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDIwX1RSR08yICBcCisgICAgICAgICAgICAgICAgICAgICAgKT8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAoQURDM180X0VYVEVSTkFMVFJJR0lOSkVDX1QxX0NDMykgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIChfX0VYVF9UUklHX0lOSkVDVENPTlZfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIChfX0VYVF9UUklHX0lOSkVDVENPTlZfXyAmICh+QURDX0VYVEVSTkFMVFJJR0NPTlZfVDIwX01BU0spKSAgICAgICAgICAgICAgICBcCisgKQorI2VuZGlmIC8qIFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4ICovCisjZWxzZQorI2RlZmluZSBBRENfSlNRUl9KRVhUU0VMX1NFVChfX0hBTkRMRV9fLCBfX0VYVF9UUklHX0lOSkVDVENPTlZfXykgICAgICAgICAgICAgIFwKKyAgIChfX0VYVF9UUklHX0lOSkVDVENPTlZfXykKKyNlbmRpZiAvKiBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4ICAgICovCisKKy8qKgorICAqIEBicmllZiBDb25maWd1cmUgdGhlIGNoYW5uZWwgbnVtYmVyIGludG8gb2Zmc2V0IE9GUnggcmVnaXN0ZXIKKyAgKiBAcGFyYW0gX0NIQU5ORUxfIEFEQyBDaGFubmVsCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIEFEQ19PRlJfQ0hBTk5FTChfQ0hBTk5FTF8pICgoX0NIQU5ORUxfKSA8PCAyNlUpCisKKy8qKgorICAqIEBicmllZiBDb25maWd1cmUgdGhlIGNoYW5uZWwgbnVtYmVyIGludG8gZGlmZmVyZW50aWFsIG1vZGUgc2VsZWN0aW9uIHJlZ2lzdGVyCisgICogQHBhcmFtIF9DSEFOTkVMXyBBREMgQ2hhbm5lbAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBBRENfRElGU0VMX0NIQU5ORUwoX0NIQU5ORUxfKSAoMVUgPDwgKF9DSEFOTkVMXykpIAorCisvKioKKyAgKiBAYnJpZWYgQ2FsaWJyYXRpb24gZmFjdG9yIGluIGRpZmZlcmVudGlhbCBtb2RlIHRvIGJlIHNldCBpbnRvIGNhbGlicmF0aW9uIHJlZ2lzdGVyCisgICogQHBhcmFtIF9DYWxpYnJhdGlvbl9GYWN0b3JfIENhbGlicmF0aW9uIGZhY3RvciB2YWx1ZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBBRENfQ0FMRkFDVF9ESUZGX1NFVChfQ2FsaWJyYXRpb25fRmFjdG9yXykgKChfQ2FsaWJyYXRpb25fRmFjdG9yXykgPDwgMTZVKQorCisvKioKKyAgKiBAYnJpZWYgQ2FsaWJyYXRpb24gZmFjdG9yIGluIGRpZmZlcmVudGlhbCBtb2RlIHRvIGJlIHJldHJpZXZlZCBmcm9tIGNhbGlicmF0aW9uIHJlZ2lzdGVyCisgICogQHBhcmFtIF9DYWxpYnJhdGlvbl9GYWN0b3JfIENhbGlicmF0aW9uIGZhY3RvciB2YWx1ZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBBRENfQ0FMRkFDVF9ESUZGX0dFVChfQ2FsaWJyYXRpb25fRmFjdG9yXykgKChfQ2FsaWJyYXRpb25fRmFjdG9yXykgPj4gMTZVKQorICAgICAKKy8qKgorICAqIEBicmllZiBDb25maWd1cmUgdGhlIGFuYWxvZyB3YXRjaGRvZyBoaWdoIHRocmVzaG9sZCBpbnRvIHJlZ2lzdGVycyBUUjEsIFRSMiBvciBUUjMuCisgICogQHBhcmFtIF9UaHJlc2hvbGRfIFRocmVzaG9sZCB2YWx1ZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBBRENfVFJYX0hJR0hUSFJFU0hPTEQoX1RocmVzaG9sZF8pICgoX1RocmVzaG9sZF8pIDw8IDE2VSkKKworLyoqCisgICogQGJyaWVmIEVuYWJsZSB0aGUgQURDIERNQSBjb250aW51b3VzIHJlcXVlc3QgZm9yIEFEQyBtdWx0aW1vZGUuCisgICogQHBhcmFtIF9ETUFDb250UmVxX01PREVfIERNQSBjb250aW51b3VzIHJlcXVlc3QgbW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgQURDX0NDUl9NVUxUSV9ETUFDT05UUkVRKF9ETUFDb250UmVxX01PREVfKSAoKF9ETUFDb250UmVxX01PREVfKSA8PCAxM1UpCisgICAgCisvKioKKyAgKiBAYnJpZWYgVmVyaWZpY2F0aW9uIG9mIGhhcmR3YXJlIGNvbnN0cmFpbnRzIGJlZm9yZSBBREMgY2FuIGJlIGRpc2FibGVkCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQorICAqIEByZXR2YWwgU0VUIChBREMgY2FuIGJlIGRpc2FibGVkKSBvciBSRVNFVCAoQURDIGNhbm5vdCBiZSBkaXNhYmxlZCkKKyAgKi8KKyNkZWZpbmUgQURDX0RJU0FCTElOR19DT05ESVRJT05TKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKCggKCAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IpICYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKEFEQ19DUl9KQURTVEFSVCB8IEFEQ19DUl9BRFNUQVJUIHwgQURDX0NSX0FERU4pKSA9PSBBRENfQ1JfQURFTiAgIFwKKyAgICAgICAgKSA/IFNFVCA6IFJFU0VUKQorICAgICAgICAgCisKKy8qKgorICAqIEBicmllZiBTaGlmdCB0aGUgb2Zmc2V0IGluIGZ1bmN0aW9uIG9mIHRoZSBzZWxlY3RlZCBBREMgcmVzb2x1dGlvbi4gCisgICogICAgICAgIE9mZnNldCBoYXMgdG8gYmUgbGVmdC1hbGlnbmVkIG9uIGJpdCAxMSwgdGhlIExTQiAocmlnaHQgYml0cykgYXJlIHNldCB0byAwCisgICogICAgICAgIElmIHJlc29sdXRpb24gMTIgYml0cywgbm8gc2hpZnQuCisgICogICAgICAgIElmIHJlc29sdXRpb24gMTAgYml0cywgc2hpZnQgb2YgMiByYW5rcyBvbiB0aGUgbGVmdC4KKyAgKiAgICAgICAgSWYgcmVzb2x1dGlvbiA4IGJpdHMsIHNoaWZ0IG9mIDQgcmFua3Mgb24gdGhlIGxlZnQuCisgICogICAgICAgIElmIHJlc29sdXRpb24gNiBiaXRzLCBzaGlmdCBvZiA2IHJhbmtzIG9uIHRoZSBsZWZ0LgorICAqICAgICAgICB0aGVyZWZvcmUsIHNoaWZ0ID0gKDEyIC0gcmVzb2x1dGlvbikgPSAxMiAtICgxMi0gKCgoUkVTWzE6MF0pID4+IDMpKjIpKQorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gX09mZnNldF8gVmFsdWUgdG8gYmUgc2hpZnRlZAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBBRENfT0ZGU0VUX1NISUZUX1JFU09MVVRJT04oX19IQU5ETEVfXywgX09mZnNldF8pICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKChfT2Zmc2V0XykgPDwgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0ZHUiAmIEFEQ19DRkdSX1JFUykgPj4gM1UpKjJVKSkKKworLyoqCisgICogQGJyaWVmIFNoaWZ0IHRoZSBBV0QxIHRocmVzaG9sZCBpbiBmdW5jdGlvbiBvZiB0aGUgc2VsZWN0ZWQgQURDIHJlc29sdXRpb24uCisgICogICAgICAgIFRocmVzaG9sZHMgaGF2ZSB0byBiZSBsZWZ0LWFsaWduZWQgb24gYml0IDExLCB0aGUgTFNCIChyaWdodCBiaXRzKSBhcmUgc2V0IHRvIDAuCisgICogICAgICAgIElmIHJlc29sdXRpb24gMTIgYml0cywgbm8gc2hpZnQuCisgICogICAgICAgIElmIHJlc29sdXRpb24gMTAgYml0cywgc2hpZnQgb2YgMiByYW5rcyBvbiB0aGUgbGVmdC4KKyAgKiAgICAgICAgSWYgcmVzb2x1dGlvbiA4IGJpdHMsIHNoaWZ0IG9mIDQgcmFua3Mgb24gdGhlIGxlZnQuCisgICogICAgICAgIElmIHJlc29sdXRpb24gNiBiaXRzLCBzaGlmdCBvZiA2IHJhbmtzIG9uIHRoZSBsZWZ0LgorICAqICAgICAgICB0aGVyZWZvcmUsIHNoaWZ0ID0gKDEyIC0gcmVzb2x1dGlvbikgPSAxMiAtICgxMi0gKCgoUkVTWzE6MF0pID4+IDMpKjIpKQorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gX1RocmVzaG9sZF8gVmFsdWUgdG8gYmUgc2hpZnRlZAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBBRENfQVdEMVRIUkVTSE9MRF9TSElGVF9SRVNPTFVUSU9OKF9fSEFORExFX18sIF9UaHJlc2hvbGRfKSAgICAgICAgICAgIFwKKyAgICAgICAgKChfVGhyZXNob2xkXykgPDwgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0ZHUiAmIEFEQ19DRkdSX1JFUykgPj4gM1UpKjJVKSkKKworLyoqCisgICogQGJyaWVmIFNoaWZ0IHRoZSBBV0QyIGFuZCBBV0QzIHRocmVzaG9sZCBpbiBmdW5jdGlvbiBvZiB0aGUgc2VsZWN0ZWQgQURDIHJlc29sdXRpb24uCisgICogICAgICAgIFRocmVzaG9sZHMgaGF2ZSB0byBiZSBsZWZ0LWFsaWduZWQgb24gYml0IDcuCisgICogICAgICAgIElmIHJlc29sdXRpb24gMTIgYml0cywgc2hpZnQgb2YgNCByYW5rcyBvbiB0aGUgcmlnaHQgKHRoZSA0IExTQiBhcmUgZGlzY2FyZGVkKQorICAqICAgICAgICBJZiByZXNvbHV0aW9uIDEwIGJpdHMsIHNoaWZ0IG9mIDIgcmFua3Mgb24gdGhlIHJpZ2h0ICh0aGUgMiBMU0IgYXJlIGRpc2NhcmRlZCkKKyAgKiAgICAgICAgSWYgcmVzb2x1dGlvbiA4IGJpdHMsIG5vIHNoaWZ0LgorICAqICAgICAgICBJZiByZXNvbHV0aW9uIDYgYml0cywgc2hpZnQgb2YgMiByYW5rcyBvbiB0aGUgbGVmdCAodGhlIDIgTFNCIGFyZSBzZXQgdG8gMCkKKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHBhcmFtIF9UaHJlc2hvbGRfIFZhbHVlIHRvIGJlIHNoaWZ0ZWQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgQURDX0FXRDIzVEhSRVNIT0xEX1NISUZUX1JFU09MVVRJT04oX19IQU5ETEVfXywgX1RocmVzaG9sZF8pICAgICAgICAgICBcCisgICAgICAgICAoICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DRkdSICYgQURDX0NGR1JfUkVTKSAhPSAoQURDX0NGR1JfUkVTXzEgfCBBRENfQ0ZHUl9SRVNfMCkgPyBcCisgICAgICAgICAgICAoKF9UaHJlc2hvbGRfKSA+PiAoNFUtICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNGR1IgJiBBRENfQ0ZHUl9SRVMpID4+IDNVKSoyVSkpKSA6IFwKKyAgICAgICAgICAgIChfVGhyZXNob2xkXykgPDwgMlUgKQorCisvKioKKyAgKiBAYnJpZWYgRGVmaW5lcyBpZiB0aGUgc2VsZWN0ZWQgQURDIGlzIHdpdGhpbiBBREMgY29tbW9uIHJlZ2lzdGVyIEFEQzFfMiBvciBBREMzXzQKKyAgKiBpZiBhdmFpbGFibGUgKEFEQzIsIEFEQzMsIEFEQzQgYXZhaWxhYmlsaXR5IGRlcGVuZHMgb24gU1RNMzIgcHJvZHVjdCkKKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHJldHZhbCBDb21tb24gY29udHJvbCByZWdpc3RlciBBREMxXzIgb3IgQURDM180CisgICovCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpCisjZGVmaW5lIEFEQ19NQVNURVJfSU5TVEFOQ0UoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggKCAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREMxKSB8fCAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09IEFEQzIpKSBcCisgICAgKT8gKEFEQzEpIDogKEFEQzMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKyNlbmRpZiAvKiBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4ICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgICBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4QykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgICAgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpCisjZGVmaW5lIEFEQ19NQVNURVJfSU5TVEFOQ0UoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDMSkKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzI4eHggfHwgU1RNMzJGMzM0eDggICAgKi8KKyAgICAgICAKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorI2RlZmluZSBBRENfTUFTVEVSX0lOU1RBTkNFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQzEpCisjZW5kaWYgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggKi8KKworLyoqCisgICogQGJyaWVmIERlZmluZXMgaWYgdGhlIHNlbGVjdGVkIEFEQyBpcyB3aXRoaW4gQURDIGNvbW1vbiByZWdpc3RlciBBREMxXzIgb3IgQURDM180CisgICogaWYgYXZhaWxhYmxlIChBREMyLCBBREMzLCBBREM0IGF2YWlsYWJpbGl0eSBkZXBlbmRzIG9uIFNUTTMyIHByb2R1Y3QpCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQorICAqIEByZXR2YWwgQ29tbW9uIGNvbnRyb2wgcmVnaXN0ZXIgQURDMV8yIG9yIEFEQzNfNAorICAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorI2RlZmluZSBBRENfQ09NTU9OX1JFR0lTVEVSKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoICggKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gQURDMSkgfHwgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREMyKSkgXAorICAgICk/IChBREMxXzJfQ09NTU9OKSA6IChBREMzXzRfQ09NTU9OKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisjZW5kaWYgLyogU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgICAgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgICAgIFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KQorI2RlZmluZSBBRENfQ09NTU9OX1JFR0lTVEVSKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQzFfMl9DT01NT04pCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMyOHh4IHx8IFNUTTMyRjMzNHg4ICAgICovCisgICAgICAgCisjaWYgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKyNkZWZpbmUgQURDX0NPTU1PTl9SRUdJU1RFUihfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBREMxX0NPTU1PTikKKyNlbmRpZiAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAqLworICAgICAgIAorLyoqCisgICogQGJyaWVmIFNlbGVjdGlvbiBvZiBBREMgY29tbW9uIHJlZ2lzdGVyIENDUiBiaXRzIE1VTFRJWzQ6MF1jb3JyZXNwb25kaW5nIHRvIHRoZSBzZWxlY3RlZCBBREMgKGFwcGxpY2FibGUgZm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQ3MpCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorI2RlZmluZSBBRENfQ09NTU9OX0NDUl9NVUxUSShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoICggKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gQURDMSkgfHwgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREMyKSkgXAorICAgICk/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoQURDMV8yX0NPTU1PTi0+Q0NSICYgQURDMTJfQ0NSX01VTFRJKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoQURDM180X0NPTU1PTi0+Q0NSICYgQURDMzRfQ0NSX01VTFRJKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisjZW5kaWYgLyogU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAgICAqLworICAgIAorI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgICAgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgICAgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpCisjZGVmaW5lIEFEQ19DT01NT05fQ0NSX01VTFRJKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBREMxXzJfQ09NTU9OLT5DQ1IgJiBBREMxMl9DQ1JfTVVMVEkpCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMyOHh4IHx8IFNUTTMyRjMzNHg4ICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorI2RlZmluZSBBRENfQ09NTU9OX0NDUl9NVUxUSShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoUkVTRVQpCisjZW5kaWYgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggKi8KKworLyoqCisgICogQGJyaWVmIFZlcmlmaWNhdGlvbiBvZiBjb25kaXRpb24gZm9yIEFEQyBzdGFydCBjb252ZXJzaW9uOiBBREMgbXVzdCBiZSBpbiBub24tbXVsdGltb2RlLCBvciBtdWx0aW1vZGUgd2l0aCBoYW5kbGUgb2YgQURDIG1hc3RlciAoYXBwbGljYWJsZSBmb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDcykKKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KQorI2RlZmluZSBBRENfTk9OTVVMVElNT0RFX09SX01VTFRJTU9ERU1BU1RFUihfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChBRENfQ09NTU9OX0NDUl9NVUxUSShfX0hBTkRMRV9fKSA9PSBBRENfTU9ERV9JTkRFUEVOREVOVCkgfHwgICAgICAgICAgICAgICBcCisgICAoSVNfQURDX01VTFRJTU9ERV9NQVNURVJfSU5TVEFOQ0UoKF9fSEFORExFX18pLT5JbnN0YW5jZSkpICAgKQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKyNkZWZpbmUgQURDX05PTk1VTFRJTU9ERV9PUl9NVUxUSU1PREVNQVNURVIoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICBcCisgICghUkVTRVQpCisjZW5kaWYgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggKi8KKworLyoqCisgICogQGJyaWVmIFZlcmlmaWNhdGlvbiBvZiBjb25kaXRpb24gZm9yIEFEQyBncm91cCByZWd1bGFyIHN0YXJ0IGNvbnZlcnNpb246IEFEQyBtdXN0IGJlIGluIG5vbi1tdWx0aW1vZGUgb3IgbXVsdGltb2RlIG9uIGdyb3VwIGluamVjdGVkIG9ubHksIG9yIG11bHRpbW9kZSB3aXRoIGhhbmRsZSBvZiBBREMgbWFzdGVyIChhcHBsaWNhYmxlIGZvciBkZXZpY2VzIHdpdGggc2V2ZXJhbCBBRENzKQorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KQorI2RlZmluZSBBRENfTk9OTVVMVElNT0RFX1JFR19PUl9NVUxUSU1PREVNQVNURVIoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgIFwKKyAgKChBRENfQ09NTU9OX0NDUl9NVUxUSShfX0hBTkRMRV9fKSA9PSBBRENfTU9ERV9JTkRFUEVOREVOVCkgICAgIHx8ICAgICAgICAgICBcCisgICAoQURDX0NPTU1PTl9DQ1JfTVVMVEkoX19IQU5ETEVfXykgPT0gQURDX0RVQUxNT0RFX0lOSkVDU0lNVUxUKSB8fCAgICAgICAgICAgXAorICAgKEFEQ19DT01NT05fQ0NSX01VTFRJKF9fSEFORExFX18pID09IEFEQ19EVUFMTU9ERV9BTFRFUlRSSUcpICAgfHwgICAgICAgICAgIFwKKyAgIChJU19BRENfTVVMVElNT0RFX01BU1RFUl9JTlNUQU5DRSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSkgICAgICAgKQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKyNkZWZpbmUgQURDX05PTk1VTFRJTU9ERV9SRUdfT1JfTVVMVElNT0RFTUFTVEVSKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICBcCisgICghUkVTRVQpCisjZW5kaWYgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggKi8KKworLyoqCisgICogQGJyaWVmIFZlcmlmaWNhdGlvbiBvZiBjb25kaXRpb24gZm9yIEFEQyBncm91cCBpbmplY3RlZCBzdGFydCBjb252ZXJzaW9uOiBBREMgbXVzdCBiZSBpbiBub24tbXVsdGltb2RlIG9yIG11bHRpbW9kZSBvbiBncm91cCByZWd1bGFyIG9ubHksIG9yIG11bHRpbW9kZSB3aXRoIGhhbmRsZSBvZiBBREMgbWFzdGVyIChhcHBsaWNhYmxlIGZvciBkZXZpY2VzIHdpdGggc2V2ZXJhbCBBRENzKQorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KQorI2RlZmluZSBBRENfTk9OTVVMVElNT0RFX0lOSl9PUl9NVUxUSU1PREVNQVNURVIoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgIFwKKyAgKChBRENfQ09NTU9OX0NDUl9NVUxUSShfX0hBTkRMRV9fKSA9PSBBRENfTU9ERV9JTkRFUEVOREVOVCkgICB8fCAgICAgICAgICAgICBcCisgICAoQURDX0NPTU1PTl9DQ1JfTVVMVEkoX19IQU5ETEVfXykgPT0gQURDX0RVQUxNT0RFX1JFR1NJTVVMVCkgfHwgICAgICAgICAgICAgXAorICAgKEFEQ19DT01NT05fQ0NSX01VTFRJKF9fSEFORExFX18pID09IEFEQ19EVUFMTU9ERV9JTlRFUkwpICAgIHx8ICAgICAgICAgICAgIFwKKyAgIChJU19BRENfTVVMVElNT0RFX01BU1RFUl9JTlNUQU5DRSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSkgICAgICkKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisjZGVmaW5lIEFEQ19OT05NVUxUSU1PREVfSU5KX09SX01VTFRJTU9ERU1BU1RFUihfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgXAorICAoIVJFU0VUKQorI2VuZGlmIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICovCisKKy8qKgorICAqIEBicmllZiBDaGVjayBBREMgbXVsdGltb2RlIHNldHRpbmc6IEluIGNhc2Ugb2YgbXVsdGltb2RlLCBjaGVjayB3aGV0aGVyIEFEQyBtYXN0ZXIgb2YgdGhlIHNlbGVjdGVkIEFEQyBoYXMgZmVhdHVyZSBhdXRvLWluamVjdGlvbiBlbmFibGVkIChhcHBsaWNhYmxlIGZvciBkZXZpY2VzIHdpdGggc2V2ZXJhbCBBRENzKQorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkKKyNkZWZpbmUgQURDX01VTFRJTU9ERV9BVVRPX0lOSkVDVEVEKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoICgoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gQURDMSkgfHwgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREMyKSAgXAorICAgKT8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoQURDMS0+Q0ZHUiAmIEFEQ19DRkdSX0pBVVRPKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChBREMzLT5DRkdSICYgQURDX0NGR1JfSkFVVE8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorI2VsaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpCisjZGVmaW5lIEFEQ19NVUxUSU1PREVfQVVUT19JTkpFQ1RFRChfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09IEFEQzEpIHx8ICgoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gQURDMikgIFwKKyAgICk/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKEFEQzEtPkNGR1IgJiBBRENfQ0ZHUl9KQVVUTykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoUkVTRVQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKyNlbHNlCisjZGVmaW5lIEFEQ19NVUxUSU1PREVfQVVUT19JTkpFQ1RFRChfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoUkVTRVQpCisjZW5kaWYgCisKKy8qKgorICAqIEBicmllZiBTZXQgaGFuZGxlIG9mIHRoZSBvdGhlciBBREMgc2hhcmluZyB0aGUgc2FtZSBjb21tb24gcmVnaXN0ZXIgQURDMV8yIG9yIEFEQzNfNAorICAqIGlmIGF2YWlsYWJsZSAoQURDMiwgQURDMywgQURDNCBhdmFpbGFiaWxpdHkgZGVwZW5kcyBvbiBTVE0zMiBwcm9kdWN0KQorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gX19IQU5ETEVfT1RIRVJfQURDX18gb3RoZXIgQURDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorI2RlZmluZSBBRENfQ09NTU9OX0FEQ19PVEhFUihfX0hBTkRMRV9fLCBfX0hBTkRMRV9PVEhFUl9BRENfXykgICAgICAgICAgICAgICAgIFwKKyAgKCAoICgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IEFEQzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKT8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fSEFORExFX09USEVSX0FEQ19fKS0+SW5zdGFuY2UgPSBBREMyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICggKCAoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBBREMyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICk/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKChfX0hBTkRMRV9PVEhFUl9BRENfXyktPkluc3RhbmNlID0gQURDMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoICggKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gQURDMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICApPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICgoX19IQU5ETEVfT1RIRVJfQURDX18pLT5JbnN0YW5jZSA9IEFEQzQpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgKCAoICgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IEFEQzQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKT8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoKF9fSEFORExFX09USEVSX0FEQ19fKS0+SW5zdGFuY2UgPSBBREMzKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICgoX19IQU5ETEVfT1RIRVJfQURDX18pLT5JbnN0YW5jZSA9IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisjZW5kaWYgLyogU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAgICAqLworICAgIAorI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpCisjZGVmaW5lIEFEQ19DT01NT05fQURDX09USEVSKF9fSEFORExFX18sIF9fSEFORExFX09USEVSX0FEQ19fKSAgICAgICAgICAgICAgICAgXAorICAoICggKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gQURDMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19IQU5ETEVfT1RIRVJfQURDX18pLT5JbnN0YW5jZSA9IEFEQzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0hBTkRMRV9PVEhFUl9BRENfXyktPkluc3RhbmNlID0gQURDMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzI4eHggfHwgU1RNMzJGMzM0eDggICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisjZGVmaW5lIEFEQ19DT01NT05fQURDX09USEVSKF9fSEFORExFX18sIF9fSEFORExFX09USEVSX0FEQ19fKSAgICAgICAgICAgICAgICAgXAorICAoKF9fSEFORExFX09USEVSX0FEQ19fKS0+SW5zdGFuY2UgPSBOVUxMKQorI2VuZGlmIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICovCisKKy8qKgorICAqIEBicmllZiBTZXQgaGFuZGxlIG9mIHRoZSBBREMgc2xhdmUgYXNzb2NpYXRlZCB0byB0aGUgQURDIG1hc3RlcgorICAqIGlmIGF2YWlsYWJsZSAoQURDMiwgQURDMywgQURDNCBhdmFpbGFiaWxpdHkgZGVwZW5kcyBvbiBTVE0zMiBwcm9kdWN0KQorICAqIEBwYXJhbSBfX0hBTkRMRV9NQVNURVJfXyBBREMgbWFzdGVyIGhhbmRsZQorICAqIEBwYXJhbSBfX0hBTkRMRV9TTEFWRV9fIEFEQyBzbGF2ZSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkKKyNkZWZpbmUgQURDX01VTFRJX1NMQVZFKF9fSEFORExFX01BU1RFUl9fLCBfX0hBTkRMRV9TTEFWRV9fKSAgICAgICAgICAgICAgICAgICBcCisgICggKCAoKF9fSEFORExFX01BU1RFUl9fKS0+SW5zdGFuY2UgPT0gQURDMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICk/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0hBTkRMRV9TTEFWRV9fKS0+SW5zdGFuY2UgPSBBREMyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoICggKChfX0hBTkRMRV9NQVNURVJfXyktPkluc3RhbmNlID09IEFEQzMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICApPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgoX19IQU5ETEVfU0xBVkVfXyktPkluc3RhbmNlID0gQURDNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKChfX0hBTkRMRV9TTEFWRV9fKS0+SW5zdGFuY2UgPSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisjZW5kaWYgLyogU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAgICAqLworICAgIAorI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpCisjZGVmaW5lIEFEQ19NVUxUSV9TTEFWRShfX0hBTkRMRV9NQVNURVJfXywgX19IQU5ETEVfU0xBVkVfXykgICAgICAgICAgICAgXAorICAoICggKChfX0hBTkRMRV9NQVNURVJfXyktPkluc3RhbmNlID09IEFEQzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19IQU5ETEVfU0xBVkVfXyktPkluc3RhbmNlID0gQURDMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKCBOVUxMICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzI4eHggfHwgU1RNMzJGMzM0eDggICAgKi8KKworCisjZGVmaW5lIElTX0FEQ19SRVNPTFVUSU9OKFJFU09MVVRJT04pICgoKFJFU09MVVRJT04pID09IEFEQ19SRVNPTFVUSU9OXzEyQikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVNPTFVUSU9OKSA9PSBBRENfUkVTT0xVVElPTl8xMEIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVTT0xVVElPTikgPT0gQURDX1JFU09MVVRJT05fOEIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFU09MVVRJT04pID09IEFEQ19SRVNPTFVUSU9OXzZCKSAgICApCisKKyNkZWZpbmUgSVNfQURDX1JFU09MVVRJT05fOF82X0JJVFMoUkVTT0xVVElPTikgKCgoUkVTT0xVVElPTikgPT0gQURDX1JFU09MVVRJT05fOEIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVTT0xVVElPTikgPT0gQURDX1JFU09MVVRJT05fNkIpICAgKQorCisKKyNkZWZpbmUgSVNfQURDX0RBVEFfQUxJR04oQUxJR04pICgoKEFMSUdOKSA9PSBBRENfREFUQUFMSUdOX1JJR0hUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBTElHTikgPT0gQURDX0RBVEFBTElHTl9MRUZUKSAgICApCisKKyNkZWZpbmUgSVNfQURDX1NDQU5fTU9ERShTQ0FOX01PREUpICgoKFNDQU5fTU9ERSkgPT0gQURDX1NDQU5fRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0NBTl9NT0RFKSA9PSBBRENfU0NBTl9FTkFCTEUpICAgICkKKworI2RlZmluZSBJU19BRENfRU9DX1NFTEVDVElPTihFT0NfU0VMRUNUSU9OKSAoKChFT0NfU0VMRUNUSU9OKSA9PSBBRENfRU9DX1NJTkdMRV9DT05WKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVPQ19TRUxFQ1RJT04pID09IEFEQ19FT0NfU0VRX0NPTlYpICAgKQorCisjZGVmaW5lIElTX0FEQ19PVkVSUlVOKE9WUikgKCgoT1ZSKSA9PSBBRENfT1ZSX0RBVEFfUFJFU0VSVkVEKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9WUikgPT0gQURDX09WUl9EQVRBX09WRVJXUklUVEVOKSAgKQorCisjZGVmaW5lIElTX0FEQ19DSEFOTkVMKENIQU5ORUwpICgoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzEpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzIpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzMpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzQpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzUpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzYpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzcpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzgpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzkpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzEwKSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzExKSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzEyKSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzEzKSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzE0KSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzE1KSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMX1RFTVBTRU5TT1IpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMX1ZCQVQpICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMX1ZSRUZJTlQpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMX1ZPUEFNUDEpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMX1ZPUEFNUDIpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMX1ZPUEFNUDMpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMX1ZPUEFNUDQpICAgICAgICkKKworI2RlZmluZSBJU19BRENfRElGRl9DSEFOTkVMKENIQU5ORUwpICgoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzEpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzIpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzMpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzQpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzUpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzYpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzcpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzgpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzkpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzEwKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzExKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzEyKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzEzKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzE0KSAgICAgICApCisKKyNkZWZpbmUgSVNfQURDX1NBTVBMRV9USU1FKFRJTUUpICgoKFRJTUUpID09IEFEQ19TQU1QTEVUSU1FXzFDWUNMRV81KSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUSU1FKSA9PSBBRENfU0FNUExFVElNRV8yQ1lDTEVTXzUpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVElNRSkgPT0gQURDX1NBTVBMRVRJTUVfNENZQ0xFU181KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRJTUUpID09IEFEQ19TQU1QTEVUSU1FXzdDWUNMRVNfNSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUSU1FKSA9PSBBRENfU0FNUExFVElNRV8xOUNZQ0xFU181KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVElNRSkgPT0gQURDX1NBTVBMRVRJTUVfNjFDWUNMRVNfNSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRJTUUpID09IEFEQ19TQU1QTEVUSU1FXzE4MUNZQ0xFU181KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUSU1FKSA9PSBBRENfU0FNUExFVElNRV82MDFDWUNMRVNfNSkgICApCisKKyNkZWZpbmUgSVNfQURDX1NJTkdMRV9ESUZGRVJFTlRJQUwoU0lOR19ESUZGKSAoKChTSU5HX0RJRkYpID09IEFEQ19TSU5HTEVfRU5ERUQpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJTkdfRElGRikgPT0gQURDX0RJRkZFUkVOVElBTF9FTkRFRCkgICkKKworI2RlZmluZSBJU19BRENfT0ZGU0VUX05VTUJFUihPRkZTRVRfTlVNQkVSKSAoKChPRkZTRVRfTlVNQkVSKSA9PSBBRENfT0ZGU0VUX05PTkUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT0ZGU0VUX05VTUJFUikgPT0gQURDX09GRlNFVF8xKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9GRlNFVF9OVU1CRVIpID09IEFEQ19PRkZTRVRfMikgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPRkZTRVRfTlVNQkVSKSA9PSBBRENfT0ZGU0VUXzMpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT0ZGU0VUX05VTUJFUikgPT0gQURDX09GRlNFVF80KSAgICAgICkKKworI2RlZmluZSBJU19BRENfUkVHVUxBUl9SQU5LKENIQU5ORUwpICgoKENIQU5ORUwpID09IEFEQ19SRUdVTEFSX1JBTktfMSApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfUkVHVUxBUl9SQU5LXzIgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX1JFR1VMQVJfUkFOS18zICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19SRUdVTEFSX1JBTktfNCApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfUkVHVUxBUl9SQU5LXzUgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX1JFR1VMQVJfUkFOS182ICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19SRUdVTEFSX1JBTktfNyApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfUkVHVUxBUl9SQU5LXzggKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX1JFR1VMQVJfUkFOS185ICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19SRUdVTEFSX1JBTktfMTApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfUkVHVUxBUl9SQU5LXzExKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX1JFR1VMQVJfUkFOS18xMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19SRUdVTEFSX1JBTktfMTMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfUkVHVUxBUl9SQU5LXzE0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX1JFR1VMQVJfUkFOS18xNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19SRUdVTEFSX1JBTktfMTYpICAgKQorCisjZGVmaW5lIElTX0FEQ19FWFRUUklHX0VER0UoRURHRSkgKCgoRURHRSkgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZFREdFX05PTkUpICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVER0UpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WRURHRV9SSVNJTkcpICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFREdFKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfRkFMTElORykgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRURHRSkgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZFREdFX1JJU0lOR0ZBTExJTkcpICApCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkKKworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpCisjZGVmaW5lIElTX0FEQ19FWFRUUklHKFJFR1RSSUcpICgoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX0NDMSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX0NDMikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyX0NDMikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QzX0NDNCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1Q0X0NDNCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1Q2X1RSR08pICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX0VYVF9JVDExKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyX0NDMSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyX0NDMykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QzX0NDMSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1Q0X0NDMSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1Q3X1RSR08pICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1Q4X0NDMSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX0VYVF9JVDIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX0NDMykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX1RSR08pICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX1RSR08yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyX1RSR08pICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QzX1RSR08pICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1Q0X1RSR08pICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1Q4X1RSR08pICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1Q4X1RSR08yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxNV9UUkdPKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19TT0ZUV0FSRV9TVEFSVCkgICAgICAgICAgICAgICkKKyNlbmRpZiAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkKKyNkZWZpbmUgSVNfQURDX0VYVFRSSUcoUkVHVFJJRykgKCgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDFfQ0MxKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX0NDMikgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMl9DQzIpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDNfQ0M0KSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1Q0X0NDNCkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UNl9UUkdPKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfRVhUX0lUMTEpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMl9DQzEpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDJfQ0MzKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QzX0NDMSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UNF9DQzEpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDdfVFJHTykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1Q4X0NDMSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9FWFRfSVQyKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX0NDMykgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMV9UUkdPKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDFfVFJHTzIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyX1RSR08pICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UM19UUkdPKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDRfVFJHTykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1Q4X1RSR08pICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UOF9UUkdPMikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDE1X1RSR08pICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMjBfQ0MyKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDIwX0NDMykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyMF9DQzEpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMjBfVFJHTykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDIwX1RSR08yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfU09GVFdBUkVfU1RBUlQpICAgICAgICAgICAgICAgKQorI2VuZGlmIC8qIFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4ICovCisKKyNlbmRpZiAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCBTVE0zMkYzNTh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKQorI2RlZmluZSBJU19BRENfRVhUVFJJRyhSRUdUUklHKSAoKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMV9DQzEpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMV9DQzIpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMV9DQzMpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMl9DQzIpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UM19UUkdPKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UNF9DQzQpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9FWFRfSVQxMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMV9UUkdPKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMV9UUkdPMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMl9UUkdPKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UNF9UUkdPKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UNl9UUkdPKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMTVfVFJHTykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UM19DQzQpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMjBfQ0MyKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMjBfQ0MzKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfU09GVFdBUkVfU1RBUlQpICAgICAgICAgICAgICApCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEMpCisjZGVmaW5lIElTX0FEQ19FWFRUUklHKFJFR1RSSUcpICgoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX0NDMSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX0NDMikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX0NDMykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyX0NDMikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QzX1RSR08pICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1Q0X0NDNCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX0VYVF9JVDExKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX1RSR08pICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX1RSR08yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyX1RSR08pICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1Q0X1RSR08pICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1Q2X1RSR08pICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxNV9UUkdPKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QzX0NDNCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19TT0ZUV0FSRV9TVEFSVCkgICAgICAgICAgICAgICkKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4QyAqLworCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkKKyNkZWZpbmUgSVNfQURDX0VYVFRSSUcoUkVHVFJJRykgKCgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDFfQ0MxKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDFfQ0MyKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDFfQ0MzKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDJfQ0MyKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDNfVFJHTykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDRfQ0M0KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfRVhUX0lUMTEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDhfVFJHTykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDhfVFJHTzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDFfVFJHTykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDFfVFJHTzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDJfVFJHTykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDRfVFJHTykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDZfVFJHTykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDE1X1RSR08pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDNfQ0M0KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX1NPRlRXQVJFX1NUQVJUKSAgICAgICAgICAgICAgKQorI2VuZGlmIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMyOHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMzNHg4KQorI2RlZmluZSBJU19BRENfRVhUVFJJRyhSRUdUUklHKSAoKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMV9DQzEpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDFfQ0MyKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX0NDMykgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMl9DQzIpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDNfVFJHTykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX0VYVF9JVDExKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVkhSVElNX1RSRzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZIUlRJTV9UUkczKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QxX1RSR08pICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMV9UUkdPMikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDJfVFJHTykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1Q2X1RSR08pICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMTVfVFJHTykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDNfQ0M0KSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfU09GVFdBUkVfU1RBUlQpICAgICAgICAgICAgICAgKQorI2VuZGlmIC8qIFNUTTMyRjMzNHg4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorI2RlZmluZSBJU19BRENfRVhUVFJJRyhSRUdUUklHKSAoKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMV9DQzEpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMV9DQzIpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMV9DQzMpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9FWFRfSVQxMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMV9UUkdPKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMV9UUkdPMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMl9UUkdPKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UNl9UUkdPKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMTVfVFJHTykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfU09GVFdBUkVfU1RBUlQpICAgICAgICAgICAgICApCisjZW5kaWYgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggKi8KKworI2RlZmluZSBJU19BRENfRVhUVFJJR0lOSkVDX0VER0UoRURHRSkgKCgoRURHRSkgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9FREdFX05PTkUpICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRURHRSkgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9FREdFX1JJU0lORykgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRURHRSkgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9FREdFX0ZBTExJTkcpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRURHRSkgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9FREdFX1JJU0lOR0ZBTExJTkcpICApCisKKworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkKKyNkZWZpbmUgSVNfQURDX0VYVFRSSUdJTkpFQyhJTkpUUklHKSAoKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QyX0NDMSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UM19DQzEpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDNfQ0M0KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q2X1RSR08pICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9FWFRfSVQxNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q0X0NDMykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UNF9DQzQpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDdfVFJHTykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q4X0NDMikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDFfQ0M0KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxX1RSR08pICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMV9UUkdPMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDJfVFJHTykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QzX0NDMykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UM19UUkdPKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDRfVFJHTykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q4X0NDNCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UOF9UUkdPKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDhfVFJHTzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxNV9UUkdPKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19JTkpFQ1RFRF9TT0ZUV0FSRV9TVEFSVCkgICAgICAgICAgKQorI2VuZGlmIC8qIFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KQorI2RlZmluZSBJU19BRENfRVhUVFJJR0lOSkVDKElOSlRSSUcpICgoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDJfQ0MxKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UM19DQzEpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QzX0NDNCkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDZfVFJHTykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9FWFRfSVQxNSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDRfQ0MzKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UNF9DQzQpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q3X1RSR08pICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDhfQ0MyKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxX0NDNCkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDFfVFJHTykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMV9UUkdPMikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QyX1RSR08pICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDNfQ0MzKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UM19UUkdPKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q0X1RSR08pICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDhfQ0M0KSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UOF9UUkdPKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q4X1RSR08yKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDE1X1RSR08pICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QyMF9DQzQpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDIwX0NDMikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMjBfVFJHTykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QyMF9UUkdPMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0lOSkVDVEVEX1NPRlRXQVJFX1NUQVJUKSAgICAgICAgICAgKQorI2VuZGlmIC8qIFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4ICovCisKKyNlbmRpZiAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCBTVE0zMkYzNTh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKQorI2RlZmluZSBJU19BRENfRVhUVFJJR0lOSkVDKElOSlRSSUcpICgoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDFfQ0M0KSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMV9UUkdPKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxX1RSR08yKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDJfQ0MxKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMl9UUkdPKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QzX0NDMSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDNfQ0MzKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UM19DQzQpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QzX1RSR08pICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDRfVFJHTykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UNl9UUkdPKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxNV9UUkdPKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfRVhUX0lUMTUpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMjBfQ0M0KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QyMF9UUkdPKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDIwX1RSR08yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0lOSkVDVEVEX1NPRlRXQVJFX1NUQVJUKSAgICAgICAgICAgICApCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEMpCisjZGVmaW5lIElTX0FEQ19FWFRUUklHSU5KRUMoSU5KVFJJRykgKCgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMV9DQzQpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDFfVFJHTykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxX1RSR08yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMl9DQzEpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDJfVFJHTykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QzX0NDMSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UM19DQzMpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDNfQ0M0KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QzX1RSR08pICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UNF9UUkdPKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDZfVFJHTykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxNV9UUkdPKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9FWFRfSVQxNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19JTkpFQ1RFRF9TT0ZUV0FSRV9TVEFSVCkgICAgICAgICAgKQorI2VuZGlmIC8qIFNUTTMyRjMwMnhDICovCisKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KQorI2RlZmluZSBJU19BRENfRVhUVFJJR0lOSkVDKElOSlRSSUcpICgoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDFfVFJHTykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxX0NDNCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMl9UUkdPKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDJfQ0MxKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QzX0NDNCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UNF9UUkdPKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfRVhUX0lUMTUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q4X0NDNCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMV9UUkdPMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDhfVFJHTykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q4X1RSR08yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UM19DQzMpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDNfVFJHTykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QzX0NDMSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UNl9UUkdPKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDE1X1RSR08pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfSU5KRUNURURfU09GVFdBUkVfU1RBUlQpICAgICAgICAgICkKKyNlbmRpZiAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMjh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMzR4OCkKKyNkZWZpbmUgSVNfQURDX0VYVFRSSUdJTkpFQyhJTkpUUklHKSAoKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxX1RSR08pICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxX0NDNCkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QyX1RSR08pICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QyX0NDMSkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QzX0NDNCkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX0VYVF9JVDE1KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxX1RSR08yKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX0hSVElNX1RSRzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX0hSVElNX1RSRzQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QzX0NDMykgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QzX1RSR08pICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QzX0NDMSkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q2X1RSR08pICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxNV9UUkdPKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfSU5KRUNURURfU09GVFdBUkVfU1RBUlQpICAgICAgICAgICAgKQorI2VuZGlmIC8qIFNUTTMyRjMzNHg4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorI2RlZmluZSBJU19BRENfRVhUVFJJR0lOSkVDKElOSlRSSUcpICgoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDFfVFJHTykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxX0NDNCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9FWFRfSVQxNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDFfVFJHTzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1Q2X1RSR08pICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMTVfVFJHTykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19JTkpFQ1RFRF9TT0ZUV0FSRV9TVEFSVCkgICAgICAgICAgKQorI2VuZGlmIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICovCisKKyNkZWZpbmUgSVNfQURDX0lOSkVDVEVEX1JBTksoQ0hBTk5FTCkgKCgoQ0hBTk5FTCkgPT0gQURDX0lOSkVDVEVEX1JBTktfMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfSU5KRUNURURfUkFOS18yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19JTkpFQ1RFRF9SQU5LXzMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX0lOSkVDVEVEX1JBTktfNCkgICApCisKKyNkZWZpbmUgSVNfQURDX01PREUoTU9ERSkgKCgoTU9ERSkgPT0gQURDX01PREVfSU5ERVBFTkRFTlQpICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBBRENfRFVBTE1PREVfUkVHU0lNVUxUX0lOSkVDU0lNVUxUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IEFEQ19EVUFMTU9ERV9SRUdTSU1VTFRfQUxURVJUUklHKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gQURDX0RVQUxNT0RFX1JFR0lOVEVSTF9JTkpFQ1NJTVVMVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBBRENfRFVBTE1PREVfSU5KRUNTSU1VTFQpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IEFEQ19EVUFMTU9ERV9SRUdTSU1VTFQpICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gQURDX0RVQUxNT0RFX0lOVEVSTCkgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBBRENfRFVBTE1PREVfQUxURVJUUklHKSAgICAgICAgICAgICAgICkKKworI2RlZmluZSBJU19BRENfRE1BX0FDQ0VTU19NT0RFKE1PREUpICgoKE1PREUpID09IEFEQ19ETUFBQ0NFU1NNT0RFX0RJU0FCTEVEKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBBRENfRE1BQUNDRVNTTU9ERV8xMl8xMF9CSVRTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gQURDX0RNQUFDQ0VTU01PREVfOF82X0JJVFMpICAgICApCisKKyNkZWZpbmUgSVNfQURDX1NBTVBMSU5HX0RFTEFZKERFTEFZKSAoKChERUxBWSkgPT0gQURDX1RXT1NBTVBMSU5HREVMQVlfMUNZQ0xFKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChERUxBWSkgPT0gQURDX1RXT1NBTVBMSU5HREVMQVlfMkNZQ0xFUykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChERUxBWSkgPT0gQURDX1RXT1NBTVBMSU5HREVMQVlfM0NZQ0xFUykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChERUxBWSkgPT0gQURDX1RXT1NBTVBMSU5HREVMQVlfNENZQ0xFUykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChERUxBWSkgPT0gQURDX1RXT1NBTVBMSU5HREVMQVlfNUNZQ0xFUykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChERUxBWSkgPT0gQURDX1RXT1NBTVBMSU5HREVMQVlfNkNZQ0xFUykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChERUxBWSkgPT0gQURDX1RXT1NBTVBMSU5HREVMQVlfN0NZQ0xFUykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChERUxBWSkgPT0gQURDX1RXT1NBTVBMSU5HREVMQVlfOENZQ0xFUykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChERUxBWSkgPT0gQURDX1RXT1NBTVBMSU5HREVMQVlfOUNZQ0xFUykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChERUxBWSkgPT0gQURDX1RXT1NBTVBMSU5HREVMQVlfMTBDWUNMRVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChERUxBWSkgPT0gQURDX1RXT1NBTVBMSU5HREVMQVlfMTFDWUNMRVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChERUxBWSkgPT0gQURDX1RXT1NBTVBMSU5HREVMQVlfMTJDWUNMRVMpICAgKQorCisjZGVmaW5lIElTX0FEQ19BTkFMT0dfV0FUQ0hET0dfTlVNQkVSKFdBVENIRE9HKSAoKChXQVRDSERPRykgPT0gQURDX0FOQUxPR1dBVENIRE9HXzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdBVENIRE9HKSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoV0FUQ0hET0cpID09IEFEQ19BTkFMT0dXQVRDSERPR18zKSAgICkKKworI2RlZmluZSBJU19BRENfQU5BTE9HX1dBVENIRE9HX01PREUoV0FUQ0hET0cpICgoKFdBVENIRE9HKSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfTk9ORSkgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdBVENIRE9HKSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX1JFRykgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdBVENIRE9HKSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX0lOSkVDKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdBVENIRE9HKSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX1JFR0lOSkVDKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdBVENIRE9HKSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfQUxMX1JFRykgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdBVENIRE9HKSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfQUxMX0lOSkVDKSAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdBVENIRE9HKSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfQUxMX1JFR0lOSkVDKSAgICAgICApCisKKyNkZWZpbmUgSVNfQURDX0NPTlZFUlNJT05fR1JPVVAoQ09OVkVSU0lPTikgKCgoQ09OVkVSU0lPTikgPT0gQURDX1JFR1VMQVJfR1JPVVApICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDT05WRVJTSU9OKSA9PSBBRENfSU5KRUNURURfR1JPVVApICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENPTlZFUlNJT04pID09IEFEQ19SRUdVTEFSX0lOSkVDVEVEX0dST1VQKSAgKQorCisjZGVmaW5lIElTX0FEQ19FVkVOVF9UWVBFKEVWRU5UKSAoKChFVkVOVCkgPT0gQURDX0FXRF9FVkVOVCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVWRU5UKSA9PSBBRENfQVdEMl9FVkVOVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRVZFTlQpID09IEFEQ19BV0QzX0VWRU5UKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFVkVOVCkgPT0gQURDX09WUl9FVkVOVCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVWRU5UKSA9PSBBRENfSlFPVkZfRVZFTlQpICApCisKKy8qKiBAZGVmZ3JvdXAgQURDRXhfcmFuZ2VfdmVyaWZpY2F0aW9uIEFEQyBFeHRlbmRlZCBSYW5nZSBWZXJpZmljYXRpb24KKyAgKiBpbiBmdW5jdGlvbiBvZiBBREMgcmVzb2x1dGlvbiBzZWxlY3RlZCAoMTIsIDEwLCA4IG9yIDYgYml0cykKKyAgKiBAeworICAqLworI2RlZmluZSBJU19BRENfUkFOR0UoUkVTT0xVVElPTiwgQURDX1ZBTFVFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCgoKFJFU09MVVRJT04pID09IEFEQ19SRVNPTFVUSU9OXzEyQikgJiYgKChBRENfVkFMVUUpIDw9ICgweDBGRkZVKSkpIHx8IFwKKyAgICAoKChSRVNPTFVUSU9OKSA9PSBBRENfUkVTT0xVVElPTl8xMEIpICYmICgoQURDX1ZBTFVFKSA8PSAoMHgwM0ZGVSkpKSB8fCBcCisgICAgKCgoUkVTT0xVVElPTikgPT0gQURDX1JFU09MVVRJT05fOEIpICAmJiAoKEFEQ19WQUxVRSkgPD0gKDB4MDBGRlUpKSkgfHwgXAorICAgICgoKFJFU09MVVRJT04pID09IEFEQ19SRVNPTFVUSU9OXzZCKSAgJiYgKChBRENfVkFMVUUpIDw9ICgweDAwM0ZVKSkpICAgKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfaW5qZWN0ZWRfbmJfY29udl92ZXJpZmljYXRpb24gQURDIEluamVjdGVkIENvbnZlcnNpb24gTnVtYmVyIFZlcmlmaWNhdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIElTX0FEQ19JTkpFQ1RFRF9OQl9DT05WKExFTkdUSCkgKCgoTEVOR1RIKSA+PSAoMVUpKSAmJiAoKExFTkdUSCkgPD0gKDRVKSkpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19yZWd1bGFyX25iX2NvbnZfdmVyaWZpY2F0aW9uIEFEQyBSZWd1bGFyIENvbnZlcnNpb24gTnVtYmVyIFZlcmlmaWNhdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIElTX0FEQ19SRUdVTEFSX05CX0NPTlYoTEVOR1RIKSAoKChMRU5HVEgpID49ICgxVSkpICYmICgoTEVOR1RIKSA8PSAoMTZVKSkpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19yZWd1bGFyX2Rpc2NvbnRpbnVvdXNfbW9kZV9udW1iZXJfdmVyaWZpY2F0aW9uIEFEQyBSZWd1bGFyIERpc2NvbnRpbnVvdXMgTW9kZSBOdW1iZXJWZXJpZmljYXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBJU19BRENfUkVHVUxBUl9ESVNDT05UX05VTUJFUihOVU1CRVIpICgoKE5VTUJFUikgPj0gKDFVKSkgJiYgKChOVU1CRVIpIDw9ICg4VSkpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfY2FsaWJyYXRpb25fZmFjdG9yX2xlbmd0aF92ZXJpZmljYXRpb24gQURDIENhbGlicmF0aW9uIEZhY3RvciBMZW5ndGggVmVyaWZpY2F0aW9uCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiBDYWxpYnJhdGlvbiBmYWN0b3IgbGVuZ3RoIHZlcmlmaWNhdGlvbiAoNyBiaXRzIG1heGltdW0pCisgICogQHBhcmFtIF9DYWxpYnJhdGlvbl9GYWN0b3JfIENhbGlicmF0aW9uIGZhY3RvciB2YWx1ZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBJU19BRENfQ0FMRkFDVChfQ2FsaWJyYXRpb25fRmFjdG9yXykgKChfQ2FsaWJyYXRpb25fRmFjdG9yXykgPD0gKDB4N0ZVKSkKKy8qKgorICAqIEB9CisgICovCisgICAgCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggKi8KKworCisjaWYgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKworLyoqCisgICogQGJyaWVmIFZlcmlmaWNhdGlvbiBvZiBBREMgc3RhdGU6IGVuYWJsZWQgb3IgZGlzYWJsZWQKKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHJldHZhbCBTRVQgKEFEQyBlbmFibGVkKSBvciBSRVNFVCAoQURDIGRpc2FibGVkKQorICAqLworI2RlZmluZSBBRENfSVNfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgJiBBRENfQ1IyX0FET04pID09IEFEQ19DUjJfQURPTiApICAgICAgICAgICBcCisgICApID8gU0VUIDogUkVTRVQpCisKKy8qKgorICAqIEBicmllZiBUZXN0IGlmIGNvbnZlcnNpb24gdHJpZ2dlciBvZiByZWd1bGFyIGdyb3VwIGlzIHNvZnR3YXJlIHN0YXJ0CisgICogICAgICAgIG9yIGV4dGVybmFsIHRyaWdnZXIuCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQorICAqIEByZXR2YWwgU0VUIChzb2Z0d2FyZSBzdGFydCkgb3IgUkVTRVQgKGV4dGVybmFsIHRyaWdnZXIpCisgICovCisjZGVmaW5lIEFEQ19JU19TT0ZUV0FSRV9TVEFSVF9SRUdVTEFSKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiAmIEFEQ19DUjJfRVhUU0VMKSA9PSBBRENfU09GVFdBUkVfU1RBUlQpCisKKy8qKgorICAqIEBicmllZiBUZXN0IGlmIGNvbnZlcnNpb24gdHJpZ2dlciBvZiBpbmplY3RlZCBncm91cCBpcyBzb2Z0d2FyZSBzdGFydAorICAqICAgICAgICBvciBleHRlcm5hbCB0cmlnZ2VyLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIFNFVCAoc29mdHdhcmUgc3RhcnQpIG9yIFJFU0VUIChleHRlcm5hbCB0cmlnZ2VyKQorICAqLworI2RlZmluZSBBRENfSVNfU09GVFdBUkVfU1RBUlRfSU5KRUNURUQoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgJiBBRENfQ1IyX0pFWFRTRUwpID09IEFEQ19JTkpFQ1RFRF9TT0ZUV0FSRV9TVEFSVCkKKworLyoqCisgICogQGJyaWVmIFNpbXVsdGFuZW91c2x5IGNsZWFycyBhbmQgc2V0cyBzcGVjaWZpYyBiaXRzIG9mIHRoZSBoYW5kbGUgU3RhdGUKKyAgKiBAbm90ZTogQURDX1NUQVRFX0NMUl9TRVQoKSBtYWNybyBpcyBtZXJlbHkgYWxpYXNlZCB0byBnZW5lcmljIG1hY3JvIE1PRElGWV9SRUcoKSwKKyAgKiAgICAgICAgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgQURDIGhhbmRsZSBTdGF0ZSwgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdGhlCisgICogICAgICAgIGJpdCBmaWVsZCB0byBjbGVhciwgdGhlIHRoaXJkIGFuZCBsYXN0IHBhcmFtZXRlciBpcyB0aGUgYml0IGZpZWxkIHRvIHNldC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgQURDX1NUQVRFX0NMUl9TRVQgTU9ESUZZX1JFRworCisvKioKKyAgKiBAYnJpZWYgQ2xlYXIgQURDIGVycm9yIGNvZGUgKHNldCBpdCB0byBlcnJvciBjb2RlOiAibm8gZXJyb3IiKQorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgQURDX0NMRUFSX0VSUk9SQ09ERShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoX19IQU5ETEVfXyktPkVycm9yQ29kZSA9IEhBTF9BRENfRVJST1JfTk9ORSkKKworLyoqCisgICogQGJyaWVmIFNldCBBREMgbnVtYmVyIG9mIGNvbnZlcnNpb25zIGludG8gcmVndWxhciBjaGFubmVsIHNlcXVlbmNlIGxlbmd0aC4KKyAgKiBAcGFyYW0gX05ick9mQ29udmVyc2lvbl8gUmVndWxhciBjaGFubmVsIHNlcXVlbmNlIGxlbmd0aCAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgQURDX1NRUjFfTF9TSElGVChfTmJyT2ZDb252ZXJzaW9uXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9OYnJPZkNvbnZlcnNpb25fKSAtICh1aW50OF90KTFVKSA8PCAyMFUpCisKKy8qKgorICAqIEBicmllZiBTZXQgdGhlIEFEQydzIHNhbXBsZSB0aW1lIGZvciBjaGFubmVsIG51bWJlcnMgYmV0d2VlbiAxMCBhbmQgMTguCisgICogQHBhcmFtIF9TQU1QTEVUSU1FXyBTYW1wbGUgdGltZSBwYXJhbWV0ZXIuCisgICogQHBhcmFtIF9DSEFOTkVMTkJfIENoYW5uZWwgbnVtYmVyLiAgCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIEFEQ19TTVBSMShfU0FNUExFVElNRV8sIF9DSEFOTkVMTkJfKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKF9TQU1QTEVUSU1FXykgPDwgKDNVICogKChfQ0hBTk5FTE5CXykgLSAxMFUpKSkKKworLyoqCisgICogQGJyaWVmIFNldCB0aGUgQURDJ3Mgc2FtcGxlIHRpbWUgZm9yIGNoYW5uZWwgbnVtYmVycyBiZXR3ZWVuIDAgYW5kIDkuCisgICogQHBhcmFtIF9TQU1QTEVUSU1FXyBTYW1wbGUgdGltZSBwYXJhbWV0ZXIuCisgICogQHBhcmFtIF9DSEFOTkVMTkJfIENoYW5uZWwgbnVtYmVyLiAgCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIEFEQ19TTVBSMihfU0FNUExFVElNRV8sIF9DSEFOTkVMTkJfKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKF9TQU1QTEVUSU1FXykgPDwgKDNVICogKF9DSEFOTkVMTkJfKSkpCisKKy8qKgorICAqIEBicmllZiBTZXQgdGhlIHNlbGVjdGVkIHJlZ3VsYXIgY2hhbm5lbCByYW5rIGZvciByYW5rIGJldHdlZW4gMSBhbmQgNi4KKyAgKiBAcGFyYW0gX0NIQU5ORUxOQl8gQ2hhbm5lbCBudW1iZXIuCisgICogQHBhcmFtIF9SQU5LTkJfIFJhbmsgbnVtYmVyLiAgICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgQURDX1NRUjNfUksoX0NIQU5ORUxOQl8sIF9SQU5LTkJfKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoX0NIQU5ORUxOQl8pIDw8ICg1VSAqICgoX1JBTktOQl8pIC0gMVUpKSkKKworLyoqCisgICogQGJyaWVmIFNldCB0aGUgc2VsZWN0ZWQgcmVndWxhciBjaGFubmVsIHJhbmsgZm9yIHJhbmsgYmV0d2VlbiA3IGFuZCAxMi4KKyAgKiBAcGFyYW0gX0NIQU5ORUxOQl8gQ2hhbm5lbCBudW1iZXIuCisgICogQHBhcmFtIF9SQU5LTkJfIFJhbmsgbnVtYmVyLiAgICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgQURDX1NRUjJfUksoX0NIQU5ORUxOQl8sIF9SQU5LTkJfKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoX0NIQU5ORUxOQl8pIDw8ICg1VSAqICgoX1JBTktOQl8pIC0gN1UpKSkKKworLyoqCisgICogQGJyaWVmIFNldCB0aGUgc2VsZWN0ZWQgcmVndWxhciBjaGFubmVsIHJhbmsgZm9yIHJhbmsgYmV0d2VlbiAxMyBhbmQgMTYuCisgICogQHBhcmFtIF9DSEFOTkVMTkJfIENoYW5uZWwgbnVtYmVyLgorICAqIEBwYXJhbSBfUkFOS05CXyBSYW5rIG51bWJlci4gICAgCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIEFEQ19TUVIxX1JLKF9DSEFOTkVMTkJfLCBfUkFOS05CXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKF9DSEFOTkVMTkJfKSA8PCAoNVUgKiAoKF9SQU5LTkJfKSAtIDEzVSkpKQorCisvKioKKyAgKiBAYnJpZWYgU2V0IHRoZSBpbmplY3RlZCBzZXF1ZW5jZSBsZW5ndGguCisgICogQHBhcmFtIF9KU1FSX0pMXyBTZXF1ZW5jZSBsZW5ndGguCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIEFEQ19KU1FSX0pMX1NISUZUKF9KU1FSX0pMXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfSlNRUl9KTF8pIC0xVSkgPDwgMjBVKQorCisvKioKKyAgKiBAYnJpZWYgU2V0IHRoZSBzZWxlY3RlZCBpbmplY3RlZCBjaGFubmVsIHJhbmsKKyAgKiAgICAgICAgTm90ZTogb24gU1RNMzJGMzd4IGRldmljZXMsIGNoYW5uZWwgcmFuayBwb3NpdGlvbiBpbiBKU1FSIHJlZ2lzdGVyCisgICogICAgICAgICAgICAgIGlzIGRlcGVuZGluZyBvbiB0b3RhbCBudW1iZXIgb2YgcmFua3Mgc2VsZWN0ZWQgaW50bworICAqICAgICAgICAgICAgICBpbmplY3RlZCBzZXF1ZW5jZXIgKHJhbmtzIHNlcXVlbmNlIHN0YXJ0aW5nIGZyb20gNC1KTCkKKyAgKiBAcGFyYW0gX0NIQU5ORUxOQl8gQ2hhbm5lbCBudW1iZXIuCisgICogQHBhcmFtIF9SQU5LTkJfIFJhbmsgbnVtYmVyLgorICAqIEBwYXJhbSBfSlNRUl9KTF8gU2VxdWVuY2UgbGVuZ3RoLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBBRENfSlNRUl9SS19KTChfQ0hBTk5FTE5CXywgX1JBTktOQl8sIF9KU1FSX0pMXykgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChfQ0hBTk5FTE5CXykgPDwgKDVVICogKCg0VSAtICgoX0pTUVJfSkxfKSAtIChfUkFOS05CXykpKSAtIDFVKSkpCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgQURDIGNvbnRpbnVvdXMgY29udmVyc2lvbiBtb2RlLgorICAqIEBwYXJhbSBfQ09OVElOVU9VU19NT0RFXyBDb250aW51b3VzIG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIEFEQ19DUjJfQ09OVElOVU9VUyhfQ09OVElOVU9VU19NT0RFXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKF9DT05USU5VT1VTX01PREVfKSA8PCAxVSkKKworLyoqCisgICogQGJyaWVmIENvbmZpZ3VyZXMgdGhlIG51bWJlciBvZiBkaXNjb250aW51b3VzIGNvbnZlcnNpb25zIGZvciB0aGUgcmVndWxhciBncm91cCBjaGFubmVscy4KKyAgKiBAcGFyYW0gX05CUl9ESVNDT05USU5VT1VTX0NPTlZfIE51bWJlciBvZiBkaXNjb250aW51b3VzIGNvbnZlcnNpb25zLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBBRENfQ1IxX0RJU0NPTlRJTlVPVVNfTlVNKF9OQlJfRElTQ09OVElOVU9VU19DT05WXykgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX05CUl9ESVNDT05USU5VT1VTX0NPTlZfKSAtIDFVKSA8PCAxM1UpCisgICAKKy8qKgorICAqIEBicmllZiBFbmFibGUgQURDIHNjYW4gbW9kZSB0byBjb252ZXJ0IG11bHRpcGxlIHJhbmtzIHdpdGggc2VxdWVuY2VyLgorICAqIEBwYXJhbSBfU0NBTl9NT0RFXyBTY2FuIGNvbnZlcnNpb24gbW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKy8qIE5vdGU6IFNjYW4gbW9kZSBpcyBjb21wYXJlZCB0byBFTkFCTEUgZm9yIGxlZ2FjeSBwdXJwb3NlLCB0aGlzIHBhcmFtZXRlciAgICovCisvKiAgICAgICBpcyBlcXVpdmFsZW50IHRvIEFEQ19TQ0FOX0VOQUJMRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRENfQ1IxX1NDQU5fU0VUKF9TQ0FOX01PREVfKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCggKChfU0NBTl9NT0RFXykgPT0gQURDX1NDQU5fRU5BQkxFKSB8fCAoKF9TQ0FOX01PREVfKSA9PSBFTkFCTEUpICAgICAgICAgICBcCisgICApPyAoQURDX1NDQU5fRU5BQkxFKSA6IChBRENfU0NBTl9ESVNBQkxFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisgICAgCisvKioKKyAgKiBAYnJpZWYgQ2FsaWJyYXRpb24gZmFjdG9yIGluIGRpZmZlcmVudGlhbCBtb2RlIHRvIGJlIHNldCBpbnRvIGNhbGlicmF0aW9uIHJlZ2lzdGVyCisgICogQHBhcmFtIF9DYWxpYnJhdGlvbl9GYWN0b3JfIENhbGlicmF0aW9uIGZhY3RvciB2YWx1ZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBBRENfQ0FMRkFDVF9ESUZGX1NFVChfQ2FsaWJyYXRpb25fRmFjdG9yXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChfQ2FsaWJyYXRpb25fRmFjdG9yXykgPDwgMTZVKQorCisvKioKKyAgKiBAYnJpZWYgQ2FsaWJyYXRpb24gZmFjdG9yIGluIGRpZmZlcmVudGlhbCBtb2RlIHRvIGJlIHJldHJpZXZlZCBmcm9tIGNhbGlicmF0aW9uIHJlZ2lzdGVyCisgICogQHBhcmFtIF9DYWxpYnJhdGlvbl9GYWN0b3JfIENhbGlicmF0aW9uIGZhY3RvciB2YWx1ZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBBRENfQ0FMRkFDVF9ESUZGX0dFVChfQ2FsaWJyYXRpb25fRmFjdG9yXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChfQ2FsaWJyYXRpb25fRmFjdG9yXykgPj4gMTZVKQorICAgICAgCisgICAgICAKKy8qKgorICAqIEBicmllZiBHZXQgdGhlIG1heGltdW0gQURDIGNvbnZlcnNpb24gY3ljbGVzIG9uIGFsbCBjaGFubmVscy4KKyAgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBzYW1wbGluZyB0aW1lICsgY29udmVyc2lvbiB0aW1lICgxMi41IEFEQyBjbG9jayBjeWNsZXMpCisgICogQXBwcm94aW1hdGlvbiBvZiBzYW1wbGluZyB0aW1lIHdpdGhpbiA0IHJhbmdlcywgcmV0dXJucyB0aGUgaGlnaGVzdCB2YWx1ZToKKyAgKiAgIGJlbG93IDcuNSBjeWNsZXMgezEuNSBjeWNsZTsgNy41IGN5Y2xlc30sCisgICogICBiZXR3ZWVuIDEzLjUgY3ljbGVzIGFuZCAyOC41IGN5Y2xlcyB7MTMuNSBjeWNsZXM7IDI4LjUgY3ljbGVzfQorICAqICAgYmV0d2VlbiA0MS41IGN5Y2xlcyBhbmQgNzEuNSBjeWNsZXMgezQxLjUgY3ljbGVzOyA1NS41IGN5Y2xlczsgNzEuNWN5Y2xlc30KKyAgKiAgIGVxdWFsIHRvIDIzOS41IGN5Y2xlcworICAqIFVuaXQ6IEFEQyBjbG9jayBjeWNsZXMKKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHJldHZhbCBBREMgY29udmVyc2lvbiBjeWNsZXMgb24gYWxsIGNoYW5uZWxzCisgICovICAgCisjZGVmaW5lIEFEQ19DT05WQ1lDTEVTX01BWF9SQU5HRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKCAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNNUFIyICYgQURDX1NBTVBMRVRJTUVfQUxMQ0hBTk5FTFNfU01QUjJCSVQyKSA9PSBSRVNFVCkgICYmICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U01QUjEgJiBBRENfU0FNUExFVElNRV9BTExDSEFOTkVMU19TTVBSMUJJVDIpID09IFJFU0VUKSApID8gICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoKCAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNNUFIyICYgQURDX1NBTVBMRVRJTUVfQUxMQ0hBTk5FTFNfU01QUjJCSVQxKSA9PSBSRVNFVCkgICYmICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U01QUjEgJiBBRENfU0FNUExFVElNRV9BTExDSEFOTkVMU19TTVBSMUJJVDEpID09IFJFU0VUKSApID8gICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBBRENfQ09OVkVSU0lPTkNMT0NLQ1lDTEVTX1NBTVBMRVRJTUVfN0NZQ0xFUzUgOiBBRENfQ09OVkVSU0lPTkNMT0NLQ1lDTEVTX1NBTVBMRVRJTUVfMjhDWUNMRVM1KSAgIFwKKyAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICgoKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U01QUjIgJiBBRENfU0FNUExFVElNRV9BTExDSEFOTkVMU19TTVBSMkJJVDEpID09IFJFU0VUKSAgJiYgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TTVBSMSAmIEFEQ19TQU1QTEVUSU1FX0FMTENIQU5ORUxTX1NNUFIxQklUMSkgPT0gUkVTRVQpKSB8fCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNNUFIyICYgQURDX1NBTVBMRVRJTUVfQUxMQ0hBTk5FTFNfU01QUjFCSVQwKSA9PSBSRVNFVCkgICYmICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U01QUjEgJiBBRENfU0FNUExFVElNRV9BTExDSEFOTkVMU19TTVBSMUJJVDApID09IFJFU0VUKSkpID8gICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBBRENfQ09OVkVSU0lPTkNMT0NLQ1lDTEVTX1NBTVBMRVRJTUVfNzFDWUNMRVM1IDogQURDX0NPTlZFUlNJT05DTE9DS0NZQ0xFU19TQU1QTEVUSU1FXzIzOUNZQ0xFUzUpIFwKKyAgICAgKQorCisvKioKKyAgKiBAYnJpZWYgR2V0IHRoZSB0b3RhbCBBREMgY2xvY2sgcHJlc2NhbGVyIChBUEIyIHByZXNjYWxlciB4IEFEQyBwcmVzY2FsZXIpCisgICogZnJvbSBzeXN0ZW0gY2xvY2sgY29uZmlndXJhdGlvbiByZWdpc3Rlci4KKyAgKiBBcHByb3hpbWF0aW9uIHdpdGhpbiAzIHJhbmdlcywgcmV0dXJucyB0aGUgaGlnaGVyIHZhbHVlOgorICAqICAgdG90YWwgcHJlc2NhbGVyIG1pbmltdW06IDIgKEFEQyBwcmVzYyAyLCBBUEIyIHByZXNjIDApCisgICogICB0b3RhbCBwcmVzY2FsZXIgMzIgKEFEQyBwcmVzYyAwIGFuZCBBUEIyIHByZXNjIGFsbCwgb3IKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgQURDIHByZXNjIHs0LCA2LCA4fSBhbmQgQVBCMiBwcmVzYyB7MCwgMiwgNH0pCisgICogICB0b3RhbCBwcmVzY2FsZXIgbWF4aW11bTogMTI4IChBREMgcHJlc2MgezQsIDYsIDh9IGFuZCBBUEIyIHByZXNjIHs4LCAxNn0pCisgICogVW5pdDogbm9uZSAocHJlc2NhbGVyIGZhY3RvcikKKyAgKiBAcmV0dmFsIEFEQyBhbmQgQVBCMiBwcmVzY2FsZXIgZmFjdG9yCisgICovCisjZGVmaW5lIEFEQ19DTE9DS19QUkVTQ0FMRVJfUkFOR0UoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCAoUkNDLT5DRkdSICYgKFJDQ19DRkdSX0FEQ1BSRV8xIHwgUkNDX0NGR1JfQURDUFJFXzApKSA9PSBSRVNFVCkgPyAgICAgICAgIFwKKyAgICAgICgoIChSQ0MtPkNGR1IgJiBSQ0NfQ0ZHUl9QUFJFMl8yKSA9PSBSRVNFVCkgPyAyIDogMzJVICkgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICgoIChSQ0MtPkNGR1IgJiBSQ0NfQ0ZHUl9QUFJFMl8xKSA9PSBSRVNFVCkgPyAzMiA6IDEyOFUgKSAgICAgICAgICAgICAgICAgXAorICApCisKKy8qKgorICAqIEBicmllZiBHZXQgdGhlIEFEQyBjbG9jayBwcmVzY2FsZXIgZnJvbSBzeXN0ZW0gY2xvY2sgY29uZmlndXJhdGlvbiByZWdpc3Rlci4gCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIEFEQ19HRVRfQ0xPQ0tfUFJFU0NBTEVSKCkgKCgoUkNDLT5DRkdSICYgUkNDX0NGR1JfQURDUFJFKSA+PiAxNFUpICsxVSkKKworI2RlZmluZSBJU19BRENfREFUQV9BTElHTihBTElHTikgKCgoQUxJR04pID09IEFEQ19EQVRBQUxJR05fUklHSFQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMSUdOKSA9PSBBRENfREFUQUFMSUdOX0xFRlQpICAgICkKKworI2RlZmluZSBJU19BRENfU0NBTl9NT0RFKFNDQU5fTU9ERSkgKCgoU0NBTl9NT0RFKSA9PSBBRENfU0NBTl9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTQ0FOX01PREUpID09IEFEQ19TQ0FOX0VOQUJMRSkgICAgKQorCisjZGVmaW5lIElTX0FEQ19DSEFOTkVMKENIQU5ORUwpICgoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzApICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzEpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzIpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzMpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzQpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzUpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzYpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzcpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzgpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzkpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzEwKSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzExKSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzEyKSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzEzKSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzE0KSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzE1KSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMX1RFTVBTRU5TT1IpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMX1ZSRUZJTlQpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMX1ZCQVQpICAgICAgICAgICkKKworI2RlZmluZSBJU19BRENfU0FNUExFX1RJTUUoVElNRSkgKCgoVElNRSkgPT0gQURDX1NBTVBMRVRJTUVfMUNZQ0xFXzUpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRJTUUpID09IEFEQ19TQU1QTEVUSU1FXzdDWUNMRVNfNSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUSU1FKSA9PSBBRENfU0FNUExFVElNRV8xM0NZQ0xFU181KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVElNRSkgPT0gQURDX1NBTVBMRVRJTUVfMjhDWUNMRVNfNSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRJTUUpID09IEFEQ19TQU1QTEVUSU1FXzQxQ1lDTEVTXzUpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUSU1FKSA9PSBBRENfU0FNUExFVElNRV81NUNZQ0xFU181KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVElNRSkgPT0gQURDX1NBTVBMRVRJTUVfNzFDWUNMRVNfNSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRJTUUpID09IEFEQ19TQU1QTEVUSU1FXzIzOUNZQ0xFU181KSAgICkKKworI2RlZmluZSBJU19BRENfUkVHVUxBUl9SQU5LKENIQU5ORUwpICgoKENIQU5ORUwpID09IEFEQ19SRUdVTEFSX1JBTktfMSApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfUkVHVUxBUl9SQU5LXzIgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX1JFR1VMQVJfUkFOS18zICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19SRUdVTEFSX1JBTktfNCApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfUkVHVUxBUl9SQU5LXzUgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX1JFR1VMQVJfUkFOS182ICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19SRUdVTEFSX1JBTktfNyApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfUkVHVUxBUl9SQU5LXzggKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX1JFR1VMQVJfUkFOS185ICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19SRUdVTEFSX1JBTktfMTApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfUkVHVUxBUl9SQU5LXzExKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX1JFR1VMQVJfUkFOS18xMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19SRUdVTEFSX1JBTktfMTMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfUkVHVUxBUl9SQU5LXzE0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX1JFR1VMQVJfUkFOS18xNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19SRUdVTEFSX1JBTktfMTYpICAgKQorCisjZGVmaW5lIElTX0FEQ19FWFRUUklHX0VER0UoRURHRSkgKCgoRURHRSkgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZFREdFX05PTkUpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRURHRSkgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZFREdFX1JJU0lORykgICkKKworI2RlZmluZSBJU19BRENfRVhUVFJJRyhSRUdUUklHKSAoKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMl9DQzIpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UM19UUkdPKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UNF9DQzQpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMTlfVFJHTykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMTlfQ0MzKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMTlfQ0M0KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9FWFRfSVQxMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfU09GVFdBUkVfU1RBUlQpICAgICAgICAgICAgICApCisKKyNkZWZpbmUgSVNfQURDX0VYVFRSSUdJTkpFQ19FREdFKEVER0UpICgoKEVER0UpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfRURHRV9OT05FKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRURHRSkgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9FREdFX1JJU0lORykgICkKKworI2RlZmluZSBJU19BRENfRVhUVFJJR0lOSkVDKElOSlRSSUcpICgoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDJfQ0MxKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QyX1RSR08pICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UM19DQzQpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDRfVFJHTykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QxOV9DQzEpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9UMTlfQ0MyKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfRVhUX0lUMTUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfSU5KRUNURURfU09GVFdBUkVfU1RBUlQpICAgICAgICAgICkKKworI2RlZmluZSBJU19BRENfSU5KRUNURURfUkFOSyhDSEFOTkVMKSAoKChDSEFOTkVMKSA9PSBBRENfSU5KRUNURURfUkFOS18xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19JTkpFQ1RFRF9SQU5LXzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX0lOSkVDVEVEX1JBTktfMykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfSU5KRUNURURfUkFOS180KSAgICkKKworI2RlZmluZSBJU19BRENfQU5BTE9HX1dBVENIRE9HX01PREUoV0FUQ0hET0cpICgoKFdBVENIRE9HKSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfTk9ORSkgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdBVENIRE9HKSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX1JFRykgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdBVENIRE9HKSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX0lOSkVDKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdBVENIRE9HKSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX1JFR0lOSkVDKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdBVENIRE9HKSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfQUxMX1JFRykgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdBVENIRE9HKSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfQUxMX0lOSkVDKSAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdBVENIRE9HKSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfQUxMX1JFR0lOSkVDKSAgICAgICApCisKKyNkZWZpbmUgSVNfQURDX0NPTlZFUlNJT05fR1JPVVAoQ09OVkVSU0lPTikgKCgoQ09OVkVSU0lPTikgPT0gQURDX1JFR1VMQVJfR1JPVVApICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ09OVkVSU0lPTikgPT0gQURDX0lOSkVDVEVEX0dST1VQKSAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ09OVkVSU0lPTikgPT0gQURDX1JFR1VMQVJfSU5KRUNURURfR1JPVVApICAgKQorCisjZGVmaW5lIElTX0FEQ19FVkVOVF9UWVBFKEVWRU5UKSAoKEVWRU5UKSA9PSBBRENfQVdEX0VWRU5UKQorCisvKiogQGRlZmdyb3VwIEFEQ0V4X3JhbmdlX3ZlcmlmaWNhdGlvbiBBREMgRXh0ZW5kZWQgUmFuZ2UgVmVyaWZpY2F0aW9uCisgICogRm9yIGEgdW5pcXVlIEFEQyByZXNvbHV0aW9uOiAxMiBiaXRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfQURDX1JBTkdFKEFEQ19WQUxVRSkgKChBRENfVkFMVUUpIDw9ICgweDBGRkZVKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX2luamVjdGVkX25iX2NvbnZfdmVyaWZpY2F0aW9uIEFEQyBJbmplY3RlZCBDb252ZXJzaW9uIE51bWJlciBWZXJpZmljYXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBJU19BRENfSU5KRUNURURfTkJfQ09OVihMRU5HVEgpICgoKExFTkdUSCkgPj0gKDFVKSkgJiYgKChMRU5HVEgpIDw9ICg0VSkpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfcmVndWxhcl9uYl9jb252X3ZlcmlmaWNhdGlvbiBBREMgUmVndWxhciBDb252ZXJzaW9uIE51bWJlciBWZXJpZmljYXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBJU19BRENfUkVHVUxBUl9OQl9DT05WKExFTkdUSCkgKCgoTEVOR1RIKSA+PSAoMVUpKSAmJiAoKExFTkdUSCkgPD0gKDE2VSkpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfcmVndWxhcl9kaXNjb250aW51b3VzX21vZGVfbnVtYmVyX3ZlcmlmaWNhdGlvbiBBREMgUmVndWxhciBEaXNjb250aW51b3VzIE1vZGUgTnVtYmVyVmVyaWZpY2F0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfQURDX1JFR1VMQVJfRElTQ09OVF9OVU1CRVIoTlVNQkVSKSAoKChOVU1CRVIpID49ICgxVSkpICYmICgoTlVNQkVSKSA8PSAoOFUpKSkKKy8qKgorICAqIEB9CisgICovCisgICAgICAgICAgICAgIAorI2VuZGlmIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAKKy8qKiBAYWRkdG9ncm91cCBBRENFeF9FeHBvcnRlZF9GdW5jdGlvbnMgQURDRXggRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8gCisgICAgICAgICAgCisvKiBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogQGFkZHRvZ3JvdXAgQURDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBBRENFeCBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLyAKKy8qIEkvTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEFEQyBjYWxpYnJhdGlvbiAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCitIQUxfU3RhdHVzVHlwZURlZiAgICAgICBIQUxfQURDRXhfQ2FsaWJyYXRpb25fU3RhcnQoc3RydWN0IF9fQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMsIHVpbnQzMl90IFNpbmdsZURpZmYpOwordWludDMyX3QgICAgICAgICAgICAgICAgSEFMX0FEQ0V4X0NhbGlicmF0aW9uX0dldFZhbHVlKHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmICpoYWRjLCB1aW50MzJfdCBTaW5nbGVEaWZmKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICAgIEhBTF9BRENFeF9DYWxpYnJhdGlvbl9TZXRWYWx1ZShzdHJ1Y3QgX19BRENfSGFuZGxlVHlwZURlZiAqaGFkYywgdWludDMyX3QgU2luZ2xlRGlmZiwgdWludDMyX3QgQ2FsaWJyYXRpb25GYWN0b3IpOworI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorSEFMX1N0YXR1c1R5cGVEZWYgICAgICAgSEFMX0FEQ0V4X0NhbGlicmF0aW9uX1N0YXJ0KHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworCisvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiAgICAgICBIQUxfQURDRXhfSW5qZWN0ZWRTdGFydChzdHJ1Y3QgX19BRENfSGFuZGxlVHlwZURlZiogaGFkYyk7CitIQUxfU3RhdHVzVHlwZURlZiAgICAgICBIQUxfQURDRXhfSW5qZWN0ZWRTdG9wKHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICAgIEhBTF9BRENFeF9JbmplY3RlZFBvbGxGb3JDb252ZXJzaW9uKHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCBUaW1lb3V0KTsKKworLyogTm9uLWJsb2NraW5nIG1vZGU6IEludGVycnVwdGlvbiAqLworSEFMX1N0YXR1c1R5cGVEZWYgICAgICAgSEFMX0FEQ0V4X0luamVjdGVkU3RhcnRfSVQoc3RydWN0IF9fQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpOworSEFMX1N0YXR1c1R5cGVEZWYgICAgICAgSEFMX0FEQ0V4X0luamVjdGVkU3RvcF9JVChzdHJ1Y3QgX19BRENfSGFuZGxlVHlwZURlZiogaGFkYyk7CisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorLyogQURDIG11bHRpbW9kZSAqLworSEFMX1N0YXR1c1R5cGVEZWYgICAgICAgSEFMX0FEQ0V4X011bHRpTW9kZVN0YXJ0X0RNQShzdHJ1Y3QgX19BRENfSGFuZGxlVHlwZURlZiAqaGFkYywgdWludDMyX3QgKnBEYXRhLCB1aW50MzJfdCBMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgICAgICAgSEFMX0FEQ0V4X011bHRpTW9kZVN0b3BfRE1BKHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsgCit1aW50MzJfdCAgICAgICAgICAgICAgICBIQUxfQURDRXhfTXVsdGlNb2RlR2V0VmFsdWUoc3RydWN0IF9fQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOworI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisKKy8qIEFEQyBncm91cCByZWd1bGFyIHN0b3AgY29udmVyc2lvbiB3aXRob3V0IGltcGFjdGluZyBncm91cCBpbmplY3RlZCAqLworLyogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLworSEFMX1N0YXR1c1R5cGVEZWYgICAgICAgSEFMX0FEQ0V4X1JlZ3VsYXJTdG9wKHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKKy8qIE5vbi1ibG9ja2luZyBtb2RlOiBJbnRlcnJ1cHRpb24gKi8KK0hBTF9TdGF0dXNUeXBlRGVmICAgICAgIEhBTF9BRENFeF9SZWd1bGFyU3RvcF9JVChzdHJ1Y3QgX19BRENfSGFuZGxlVHlwZURlZiogaGFkYyk7CisvKiBOb24tYmxvY2tpbmcgbW9kZTogRE1BICovCitIQUxfU3RhdHVzVHlwZURlZiAgICAgICBIQUxfQURDRXhfUmVndWxhclN0b3BfRE1BKHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorLyogQURDIG11bHRpbW9kZSAqLworSEFMX1N0YXR1c1R5cGVEZWYgICAgICAgSEFMX0FEQ0V4X1JlZ3VsYXJNdWx0aU1vZGVTdG9wX0RNQShzdHJ1Y3QgX19BRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7CisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggICAgKi8KKworLyogQURDIHJldHJpZXZlIGNvbnZlcnNpb24gdmFsdWUgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIHBvbGxpbmcgb3IgaW50ZXJydXB0aW9uICovCit1aW50MzJfdCAgICAgICAgICAgICAgICBIQUxfQURDRXhfSW5qZWN0ZWRHZXRWYWx1ZShzdHJ1Y3QgX19BRENfSGFuZGxlVHlwZURlZiogaGFkYywgdWludDMyX3QgSW5qZWN0ZWRSYW5rKTsKKworLyogQURDIElSUUhhbmRsZXIgYW5kIENhbGxiYWNrcyB1c2VkIGluIG5vbi1ibG9ja2luZyBtb2RlcyAoSW50ZXJydXB0aW9uKSAqLwordm9pZCAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ0V4X0luamVjdGVkQ29udkNwbHRDYWxsYmFjayhzdHJ1Y3QgX19BRENfSGFuZGxlVHlwZURlZiogaGFkYyk7CisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQordm9pZCAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ0V4X0luamVjdGVkUXVldWVPdmVyZmxvd0NhbGxiYWNrKHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKK3ZvaWQgICAgICAgICAgICAgICAgICAgIEhBTF9BRENFeF9MZXZlbE91dE9mV2luZG93MkNhbGxiYWNrKHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKK3ZvaWQgICAgICAgICAgICAgICAgICAgIEhBTF9BRENFeF9MZXZlbE91dE9mV2luZG93M0NhbGxiYWNrKHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworLyoqCisgICogQH0KKyAgKi8KKyAgICAgCisvKiogQGFkZHRvZ3JvdXAgQURDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBBRENFeCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogQHsKKyAgKi8gCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgICAgICAgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbChzdHJ1Y3QgX19BRENfSGFuZGxlVHlwZURlZiogaGFkYyxBRENfSW5qZWN0aW9uQ29uZlR5cGVEZWYqIHNDb25maWdJbmplY3RlZCk7CisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorSEFMX1N0YXR1c1R5cGVEZWYgICAgICAgSEFMX0FEQ0V4X011bHRpTW9kZUNvbmZpZ0NoYW5uZWwoc3RydWN0IF9fQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsIEFEQ19NdWx0aU1vZGVUeXBlRGVmICptdWx0aW1vZGUpOworI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworICAKKy8qKgorICAqIEB9CisgICovIAorCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLypfX1NUTTMyRjN4eF9BRENfSCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2hhbF9jYW4uaCBiL0luYy9zdG0zMmYzeHhfaGFsX2Nhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NjMwZjgKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2hhbF9jYW4uaApAQCAtMCwwICsxLDc5MiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfY2FuLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIENBTiBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJGM3h4X0hBTF9DQU5fSAorI2RlZmluZSBTVE0zMkYzeHhfSEFMX0NBTl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoQ0FOKQorLyoqIEBhZGR0b2dyb3VwIENBTgorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENBTl9FeHBvcnRlZF9UeXBlcyBDQU4gRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBIQUwgU3RhdGUgc3RydWN0dXJlcyBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX0NBTl9TVEFURV9SRVNFVCAgICAgICAgICAgICA9IDB4MDBVLCAgLyohPCBDQU4gbm90IHlldCBpbml0aWFsaXplZCBvciBkaXNhYmxlZCAqLworICBIQUxfQ0FOX1NUQVRFX1JFQURZICAgICAgICAgICAgID0gMHgwMVUsICAvKiE8IENBTiBpbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZSAgICovCisgIEhBTF9DQU5fU1RBVEVfTElTVEVOSU5HICAgICAgICAgPSAweDAyVSwgIC8qITwgQ0FOIHJlY2VpdmUgcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgKi8KKyAgSEFMX0NBTl9TVEFURV9TTEVFUF9QRU5ESU5HICAgICA9IDB4MDNVLCAgLyohPCBDQU4gc2xlZXAgcmVxdWVzdCBpcyBwZW5kaW5nICAgICAgICAqLworICBIQUxfQ0FOX1NUQVRFX1NMRUVQX0FDVElWRSAgICAgID0gMHgwNFUsICAvKiE8IENBTiBzbGVlcCBtb2RlIGlzIGFjdGl2ZSAgICAgICAgICAgICovCisgIEhBTF9DQU5fU1RBVEVfRVJST1IgICAgICAgICAgICAgPSAweDA1VSAgIC8qITwgQ0FOIGVycm9yIHN0YXRlICAgICAgICAgICAgICAgICAgICAgKi8KKworfSBIQUxfQ0FOX1N0YXRlVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBDQU4gaW5pdCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgUHJlc2NhbGVyOyAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBsZW5ndGggb2YgYSB0aW1lIHF1YW50dW0uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDEgYW5kIE1heF9EYXRhID0gMTAyNC4gKi8KKworICB1aW50MzJfdCBNb2RlOyAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIENBTiBvcGVyYXRpbmcgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDQU5fb3BlcmF0aW5nX21vZGUgKi8KKworICB1aW50MzJfdCBTeW5jSnVtcFdpZHRoOyAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWUgcXVhbnRhIHRoZSBDQU4gaGFyZHdhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYWxsb3dlZCB0byBsZW5ndGhlbiBvciBzaG9ydGVuIGEgYml0IHRvIHBlcmZvcm0gcmVzeW5jaHJvbml6YXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ0FOX3N5bmNocm9uaXNhdGlvbl9qdW1wX3dpZHRoICovCisKKyAgdWludDMyX3QgVGltZVNlZzE7ICAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGltZSBxdWFudGEgaW4gQml0IFNlZ21lbnQgMS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDQU5fdGltZV9xdWFudHVtX2luX2JpdF9zZWdtZW50XzEgKi8KKworICB1aW50MzJfdCBUaW1lU2VnMjsgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0aW1lIHF1YW50YSBpbiBCaXQgU2VnbWVudCAyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENBTl90aW1lX3F1YW50dW1faW5fYml0X3NlZ21lbnRfMiAqLworCisgIEZ1bmN0aW9uYWxTdGF0ZSBUaW1lVHJpZ2dlcmVkTW9kZTsgICAvKiE8IEVuYWJsZSBvciBkaXNhYmxlIHRoZSB0aW1lIHRyaWdnZXJlZCBjb21tdW5pY2F0aW9uIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUuICovCisKKyAgRnVuY3Rpb25hbFN0YXRlIEF1dG9CdXNPZmY7ICAgICAgICAgIC8qITwgRW5hYmxlIG9yIGRpc2FibGUgdGhlIGF1dG9tYXRpYyBidXMtb2ZmIG1hbmFnZW1lbnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUuICovCisKKyAgRnVuY3Rpb25hbFN0YXRlIEF1dG9XYWtlVXA7ICAgICAgICAgIC8qITwgRW5hYmxlIG9yIGRpc2FibGUgdGhlIGF1dG9tYXRpYyB3YWtlLXVwIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUuICovCisKKyAgRnVuY3Rpb25hbFN0YXRlIEF1dG9SZXRyYW5zbWlzc2lvbjsgIC8qITwgRW5hYmxlIG9yIGRpc2FibGUgdGhlIG5vbi1hdXRvbWF0aWMgcmV0cmFuc21pc3Npb24gbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRS4gKi8KKworICBGdW5jdGlvbmFsU3RhdGUgUmVjZWl2ZUZpZm9Mb2NrZWQ7ICAgLyohPCBFbmFibGUgb3IgZGlzYWJsZSB0aGUgUmVjZWl2ZSBGSUZPIExvY2tlZCBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvIEVOQUJMRSBvciBESVNBQkxFLiAqLworCisgIEZ1bmN0aW9uYWxTdGF0ZSBUcmFuc21pdEZpZm9Qcmlvcml0eTsvKiE8IEVuYWJsZSBvciBkaXNhYmxlIHRoZSB0cmFuc21pdCBGSUZPIHByaW9yaXR5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvIEVOQUJMRSBvciBESVNBQkxFLiAqLworCit9IENBTl9Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBDQU4gZmlsdGVyIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IEZpbHRlcklkSGlnaDsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGZpbHRlciBpZGVudGlmaWNhdGlvbiBudW1iZXIgKE1TQnMgZm9yIGEgMzItYml0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLCBmaXJzdCBvbmUgZm9yIGEgMTYtYml0IGNvbmZpZ3VyYXRpb24pLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRi4gKi8KKworICB1aW50MzJfdCBGaWx0ZXJJZExvdzsgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBmaWx0ZXIgaWRlbnRpZmljYXRpb24gbnVtYmVyIChMU0JzIGZvciBhIDMyLWJpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiwgc2Vjb25kIG9uZSBmb3IgYSAxNi1iaXQgY29uZmlndXJhdGlvbikuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwMDAgYW5kIE1heF9EYXRhID0gMHhGRkZGLiAqLworCisgIHVpbnQzMl90IEZpbHRlck1hc2tJZEhpZ2g7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGZpbHRlciBtYXNrIG51bWJlciBvciBpZGVudGlmaWNhdGlvbiBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvcmRpbmcgdG8gdGhlIG1vZGUgKE1TQnMgZm9yIGEgMzItYml0IGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCBvbmUgZm9yIGEgMTYtYml0IGNvbmZpZ3VyYXRpb24pLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRi4gKi8KKworICB1aW50MzJfdCBGaWx0ZXJNYXNrSWRMb3c7ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBmaWx0ZXIgbWFzayBudW1iZXIgb3IgaWRlbnRpZmljYXRpb24gbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBtb2RlIChMU0JzIGZvciBhIDMyLWJpdCBjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kIG9uZSBmb3IgYSAxNi1iaXQgY29uZmlndXJhdGlvbikuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwMDAgYW5kIE1heF9EYXRhID0gMHhGRkZGLiAqLworCisgIHVpbnQzMl90IEZpbHRlckZJRk9Bc3NpZ25tZW50OyAgLyohPCBTcGVjaWZpZXMgdGhlIEZJRk8gKDAgb3IgMVUpIHdoaWNoIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ0FOX2ZpbHRlcl9GSUZPICovCisKKyAgdWludDMyX3QgRmlsdGVyQmFuazsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZmlsdGVyIGJhbmsgd2hpY2ggd2lsbCBiZSBpbml0aWFsaXplZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11cyBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAxMy4gKi8KKworICB1aW50MzJfdCBGaWx0ZXJNb2RlOyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBmaWx0ZXIgbW9kZSB0byBiZSBpbml0aWFsaXplZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ0FOX2ZpbHRlcl9tb2RlICovCisKKyAgdWludDMyX3QgRmlsdGVyU2NhbGU7ICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZmlsdGVyIHNjYWxlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDQU5fZmlsdGVyX3NjYWxlICovCisKKyAgdWludDMyX3QgRmlsdGVyQWN0aXZhdGlvbjsgICAgICAvKiE8IEVuYWJsZSBvciBkaXNhYmxlIHRoZSBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENBTl9maWx0ZXJfYWN0aXZhdGlvbiAqLworCisgIHVpbnQzMl90IFNsYXZlU3RhcnRGaWx0ZXJCYW5rOyAgLyohPCBTZWxlY3QgdGhlIHN0YXJ0IGZpbHRlciBiYW5rIGZvciB0aGUgc2xhdmUgQ0FOIGluc3RhbmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RNMzJGM3h4IGRldmljZXMgZG9uJ3Qgc3VwcG9ydCBzbGF2ZSBDQU4gaW5zdGFuY2UgKGR1YWwgQ0FOKS4gVGhlcmVmb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHBhcmFtZXRlciBpcyBtZWFuaW5nbGVzcyBidXQgaXQgaGFzIGJlZW4ga2VwdCBmb3IgY29tcGF0aWJpbGl0eSBhY2Nyb3NzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVE0zMiBmYW1pbGllcy4gKi8KKworfSBDQU5fRmlsdGVyVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBDQU4gVHggbWVzc2FnZSBoZWFkZXIgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFN0ZElkOyAgICAvKiE8IFNwZWNpZmllcyB0aGUgc3RhbmRhcmQgaWRlbnRpZmllci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweDdGRi4gKi8KKworICB1aW50MzJfdCBFeHRJZDsgICAgLyohPCBTcGVjaWZpZXMgdGhlIGV4dGVuZGVkIGlkZW50aWZpZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHgxRkZGRkZGRi4gKi8KKworICB1aW50MzJfdCBJREU7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHR5cGUgb2YgaWRlbnRpZmllciBmb3IgdGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIHRyYW5zbWl0dGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENBTl9pZGVudGlmaWVyX3R5cGUgKi8KKworICB1aW50MzJfdCBSVFI7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHR5cGUgb2YgZnJhbWUgZm9yIHRoZSBtZXNzYWdlIHRoYXQgd2lsbCBiZSB0cmFuc21pdHRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDQU5fcmVtb3RlX3RyYW5zbWlzc2lvbl9yZXF1ZXN0ICovCisKKyAgdWludDMyX3QgRExDOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBsZW5ndGggb2YgdGhlIGZyYW1lIHRoYXQgd2lsbCBiZSB0cmFuc21pdHRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSA4LiAqLworCisgIEZ1bmN0aW9uYWxTdGF0ZSBUcmFuc21pdEdsb2JhbFRpbWU7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHRpbWVzdGFtcCBjb3VudGVyIHZhbHVlIGNhcHR1cmVkIG9uIHN0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGZyYW1lIHRyYW5zbWlzc2lvbiwgaXMgc2VudCBpbiBEQVRBNiBhbmQgREFUQTcgcmVwbGFjaW5nIHBEYXRhWzZdIGFuZCBwRGF0YVs3XS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGU6IFRpbWUgVHJpZ2dlcmVkIENvbW11bmljYXRpb24gTW9kZSBtdXN0IGJlIGVuYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlOiBETEMgbXVzdCBiZSBwcm9ncmFtbWVkIGFzIDggYnl0ZXMsIGluIG9yZGVyIHRoZXNlIDIgYnl0ZXMgYXJlIHNlbnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUuICovCisKK30gQ0FOX1R4SGVhZGVyVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBDQU4gUnggbWVzc2FnZSBoZWFkZXIgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFN0ZElkOyAgICAvKiE8IFNwZWNpZmllcyB0aGUgc3RhbmRhcmQgaWRlbnRpZmllci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweDdGRi4gKi8KKworICB1aW50MzJfdCBFeHRJZDsgICAgLyohPCBTcGVjaWZpZXMgdGhlIGV4dGVuZGVkIGlkZW50aWZpZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHgxRkZGRkZGRi4gKi8KKworICB1aW50MzJfdCBJREU7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHR5cGUgb2YgaWRlbnRpZmllciBmb3IgdGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIHRyYW5zbWl0dGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENBTl9pZGVudGlmaWVyX3R5cGUgKi8KKworICB1aW50MzJfdCBSVFI7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHR5cGUgb2YgZnJhbWUgZm9yIHRoZSBtZXNzYWdlIHRoYXQgd2lsbCBiZSB0cmFuc21pdHRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDQU5fcmVtb3RlX3RyYW5zbWlzc2lvbl9yZXF1ZXN0ICovCisKKyAgdWludDMyX3QgRExDOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBsZW5ndGggb2YgdGhlIGZyYW1lIHRoYXQgd2lsbCBiZSB0cmFuc21pdHRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSA4LiAqLworCisgIHVpbnQzMl90IFRpbWVzdGFtcDsgLyohPCBTcGVjaWZpZXMgdGhlIHRpbWVzdGFtcCBjb3VudGVyIHZhbHVlIGNhcHR1cmVkIG9uIHN0YXJ0IG9mIGZyYW1lIHJlY2VwdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGU6IFRpbWUgVHJpZ2dlcmVkIENvbW11bmljYXRpb24gTW9kZSBtdXN0IGJlIGVuYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGLiAqLworCisgIHVpbnQzMl90IEZpbHRlck1hdGNoSW5kZXg7IC8qITwgU3BlY2lmaWVzIHRoZSBpbmRleCBvZiBtYXRjaGluZyBhY2NlcHRhbmNlIGZpbHRlciBlbGVtZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4RkYuICovCisKK30gQ0FOX1J4SGVhZGVyVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBDQU4gaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdCBfX0NBTl9IYW5kbGVUeXBlRGVmCit7CisgIENBTl9UeXBlRGVmICAgICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAgICAgICAgICAgICAgICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAqLworCisgIENBTl9Jbml0VHlwZURlZiAgICAgICAgICAgICBJbml0OyAgICAgICAgICAgICAgICAgICAgICAvKiE8IENBTiByZXF1aXJlZCBwYXJhbWV0ZXJzICovCisKKyAgX19JTyBIQUxfQ0FOX1N0YXRlVHlwZURlZiAgIFN0YXRlOyAgICAgICAgICAgICAgICAgICAgIC8qITwgQ0FOIGNvbW11bmljYXRpb24gc3RhdGUgKi8KKworICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICAgRXJyb3JDb2RlOyAgICAgICAgICAgICAgICAgLyohPCBDQU4gRXJyb3IgY29kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDQU5fRXJyb3JfQ29kZSAqLworCit9IENBTl9IYW5kbGVUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIENBTl9FeHBvcnRlZF9Db25zdGFudHMgQ0FOIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ0FOX0Vycm9yX0NvZGUgQ0FOIEVycm9yIENvZGUKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfQ0FOX0VSUk9SX05PTkUgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAvKiE8IE5vIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0NBTl9FUlJPUl9FV0cgICAgICAgICAgICAgKDB4MDAwMDAwMDFVKSAgLyohPCBQcm90b2NvbCBFcnJvciBXYXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9DQU5fRVJST1JfRVBWICAgICAgICAgICAgICgweDAwMDAwMDAyVSkgIC8qITwgRXJyb3IgUGFzc2l2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfQ0FOX0VSUk9SX0JPRiAgICAgICAgICAgICAoMHgwMDAwMDAwNFUpICAvKiE8IEJ1cy1vZmYgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0NBTl9FUlJPUl9TVEYgICAgICAgICAgICAgKDB4MDAwMDAwMDhVKSAgLyohPCBTdHVmZiBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9DQU5fRVJST1JfRk9SICAgICAgICAgICAgICgweDAwMDAwMDEwVSkgIC8qITwgRm9ybSBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfQ0FOX0VSUk9SX0FDSyAgICAgICAgICAgICAoMHgwMDAwMDAyMFUpICAvKiE8IEFja25vd2xlZGdtZW50IGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0NBTl9FUlJPUl9CUiAgICAgICAgICAgICAgKDB4MDAwMDAwNDBVKSAgLyohPCBCaXQgcmVjZXNzaXZlIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9DQU5fRVJST1JfQkQgICAgICAgICAgICAgICgweDAwMDAwMDgwVSkgIC8qITwgQml0IGRvbWluYW50IGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfQ0FOX0VSUk9SX0NSQyAgICAgICAgICAgICAoMHgwMDAwMDEwMFUpICAvKiE8IENSQyBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0NBTl9FUlJPUl9SWF9GT1YwICAgICAgICAgKDB4MDAwMDAyMDBVKSAgLyohPCBSeCBGSUZPMCBvdmVycnVuIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9DQU5fRVJST1JfUlhfRk9WMSAgICAgICAgICgweDAwMDAwNDAwVSkgIC8qITwgUnggRklGTzEgb3ZlcnJ1biBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfQ0FOX0VSUk9SX1RYX0FMU1QwICAgICAgICAoMHgwMDAwMDgwMFUpICAvKiE8IFR4TWFpbGJveCAwIHRyYW5zbWl0IGZhaWx1cmUgZHVlIHRvIGFyYml0cmF0aW9uIGxvc3QgKi8KKyNkZWZpbmUgSEFMX0NBTl9FUlJPUl9UWF9URVJSMCAgICAgICAgKDB4MDAwMDEwMDBVKSAgLyohPCBUeE1haWxib3ggMSB0cmFuc21pdCBmYWlsdXJlIGR1ZSB0byB0cmFubWl0IGVycm9yICAgICovCisjZGVmaW5lIEhBTF9DQU5fRVJST1JfVFhfQUxTVDEgICAgICAgICgweDAwMDAyMDAwVSkgIC8qITwgVHhNYWlsYm94IDAgdHJhbnNtaXQgZmFpbHVyZSBkdWUgdG8gYXJiaXRyYXRpb24gbG9zdCAqLworI2RlZmluZSBIQUxfQ0FOX0VSUk9SX1RYX1RFUlIxICAgICAgICAoMHgwMDAwNDAwMFUpICAvKiE8IFR4TWFpbGJveCAxIHRyYW5zbWl0IGZhaWx1cmUgZHVlIHRvIHRyYW5taXQgZXJyb3IgICAgKi8KKyNkZWZpbmUgSEFMX0NBTl9FUlJPUl9UWF9BTFNUMiAgICAgICAgKDB4MDAwMDgwMDBVKSAgLyohPCBUeE1haWxib3ggMCB0cmFuc21pdCBmYWlsdXJlIGR1ZSB0byBhcmJpdHJhdGlvbiBsb3N0ICovCisjZGVmaW5lIEhBTF9DQU5fRVJST1JfVFhfVEVSUjIgICAgICAgICgweDAwMDEwMDAwVSkgIC8qITwgVHhNYWlsYm94IDEgdHJhbnNtaXQgZmFpbHVyZSBkdWUgdG8gdHJhbm1pdCBlcnJvciAgICAqLworI2RlZmluZSBIQUxfQ0FOX0VSUk9SX1RJTUVPVVQgICAgICAgICAoMHgwMDAyMDAwMFUpICAvKiE8IFRpbWVvdXQgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0NBTl9FUlJPUl9OT1RfSU5JVElBTElaRUQgKDB4MDAwNDAwMDBVKSAgLyohPCBQZXJpcGhlcmFsIG5vdCBpbml0aWFsaXplZCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9DQU5fRVJST1JfTk9UX1JFQURZICAgICAgICgweDAwMDgwMDAwVSkgIC8qITwgUGVyaXBoZXJhbCBub3QgcmVhZHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfQ0FOX0VSUk9SX05PVF9TVEFSVEVEICAgICAoMHgwMDEwMDAwMFUpICAvKiE8IFBlcmlwaGVyYWwgbm90IHN0YXJ0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0NBTl9FUlJPUl9QQVJBTSAgICAgICAgICAgKDB4MDAyMDAwMDBVKSAgLyohPCBQYXJhbWV0ZXIgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgSEFMX0NBTl9FUlJPUl9JTlRFUk5BTCAgICAgICAgKDB4MDA4MDAwMDBVKSAgLyohPCBJbnRlcm5hbCBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ0FOX0luaXRTdGF0dXMgQ0FOIEluaXRTdGF0dXMKKyAgKiBAeworICAqLworI2RlZmluZSBDQU5fSU5JVFNUQVRVU19GQUlMRUQgICAgICAgKDB4MDAwMDAwMDBVKSAgLyohPCBDQU4gaW5pdGlhbGl6YXRpb24gZmFpbGVkICovCisjZGVmaW5lIENBTl9JTklUU1RBVFVTX1NVQ0NFU1MgICAgICAoMHgwMDAwMDAwMVUpICAvKiE8IENBTiBpbml0aWFsaXphdGlvbiBPSyAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ0FOX29wZXJhdGluZ19tb2RlIENBTiBPcGVyYXRpbmcgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIENBTl9NT0RFX05PUk1BTCAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBOb3JtYWwgbW9kZSAgICovCisjZGVmaW5lIENBTl9NT0RFX0xPT1BCQUNLICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9CVFJfTEJLTSkgICAgICAgICAgICAgICAgICAgLyohPCBMb29wYmFjayBtb2RlICovCisjZGVmaW5lIENBTl9NT0RFX1NJTEVOVCAgICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9CVFJfU0lMTSkgICAgICAgICAgICAgICAgICAgLyohPCBTaWxlbnQgbW9kZSAgICovCisjZGVmaW5lIENBTl9NT0RFX1NJTEVOVF9MT09QQkFDSyAgICAoKHVpbnQzMl90KShDQU5fQlRSX0xCS00gfCBDQU5fQlRSX1NJTE0pKSAgLyohPCBMb29wYmFjayBjb21iaW5lZCB3aXRoIHNpbGVudCBtb2RlICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgQ0FOX3N5bmNocm9uaXNhdGlvbl9qdW1wX3dpZHRoIENBTiBTeW5jaHJvbml6YXRpb24gSnVtcCBXaWR0aAorICAqIEB7CisgICovCisjZGVmaW5lIENBTl9TSldfMVRRICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAvKiE8IDEgdGltZSBxdWFudHVtICovCisjZGVmaW5lIENBTl9TSldfMlRRICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9CVFJfU0pXXzApICAvKiE8IDIgdGltZSBxdWFudHVtICovCisjZGVmaW5lIENBTl9TSldfM1RRICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9CVFJfU0pXXzEpICAvKiE8IDMgdGltZSBxdWFudHVtICovCisjZGVmaW5lIENBTl9TSldfNFRRICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9CVFJfU0pXKSAgICAvKiE8IDQgdGltZSBxdWFudHVtICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENBTl90aW1lX3F1YW50dW1faW5fYml0X3NlZ21lbnRfMSBDQU4gVGltZSBRdWFudHVtIGluIEJpdCBTZWdtZW50IDEKKyAgKiBAeworICAqLworI2RlZmluZSBDQU5fQlMxXzFUUSAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgMSB0aW1lIHF1YW50dW0gICovCisjZGVmaW5lIENBTl9CUzFfMlRRICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9CVFJfVFMxXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAyIHRpbWUgcXVhbnR1bSAgKi8KKyNkZWZpbmUgQ0FOX0JTMV8zVFEgICAgICAgICAgICAgICAgICgodWludDMyX3QpQ0FOX0JUUl9UUzFfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDMgdGltZSBxdWFudHVtICAqLworI2RlZmluZSBDQU5fQlMxXzRUUSAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoQ0FOX0JUUl9UUzFfMSB8IENBTl9CVFJfVFMxXzApKSAgICAgICAgICAgICAgICAgIC8qITwgNCB0aW1lIHF1YW50dW0gICovCisjZGVmaW5lIENBTl9CUzFfNVRRICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9CVFJfVFMxXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCA1IHRpbWUgcXVhbnR1bSAgKi8KKyNkZWZpbmUgQ0FOX0JTMV82VFEgICAgICAgICAgICAgICAgICgodWludDMyX3QpKENBTl9CVFJfVFMxXzIgfCBDQU5fQlRSX1RTMV8wKSkgICAgICAgICAgICAgICAgICAvKiE8IDYgdGltZSBxdWFudHVtICAqLworI2RlZmluZSBDQU5fQlMxXzdUUSAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoQ0FOX0JUUl9UUzFfMiB8IENBTl9CVFJfVFMxXzEpKSAgICAgICAgICAgICAgICAgIC8qITwgNyB0aW1lIHF1YW50dW0gICovCisjZGVmaW5lIENBTl9CUzFfOFRRICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShDQU5fQlRSX1RTMV8yIHwgQ0FOX0JUUl9UUzFfMSB8IENBTl9CVFJfVFMxXzApKSAgLyohPCA4IHRpbWUgcXVhbnR1bSAgKi8KKyNkZWZpbmUgQ0FOX0JTMV85VFEgICAgICAgICAgICAgICAgICgodWludDMyX3QpQ0FOX0JUUl9UUzFfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDkgdGltZSBxdWFudHVtICAqLworI2RlZmluZSBDQU5fQlMxXzEwVFEgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoQ0FOX0JUUl9UUzFfMyB8IENBTl9CVFJfVFMxXzApKSAgICAgICAgICAgICAgICAgIC8qITwgMTAgdGltZSBxdWFudHVtICovCisjZGVmaW5lIENBTl9CUzFfMTFUUSAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShDQU5fQlRSX1RTMV8zIHwgQ0FOX0JUUl9UUzFfMSkpICAgICAgICAgICAgICAgICAgLyohPCAxMSB0aW1lIHF1YW50dW0gKi8KKyNkZWZpbmUgQ0FOX0JTMV8xMlRRICAgICAgICAgICAgICAgICgodWludDMyX3QpKENBTl9CVFJfVFMxXzMgfCBDQU5fQlRSX1RTMV8xIHwgQ0FOX0JUUl9UUzFfMCkpICAvKiE8IDEyIHRpbWUgcXVhbnR1bSAqLworI2RlZmluZSBDQU5fQlMxXzEzVFEgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoQ0FOX0JUUl9UUzFfMyB8IENBTl9CVFJfVFMxXzIpKSAgICAgICAgICAgICAgICAgIC8qITwgMTMgdGltZSBxdWFudHVtICovCisjZGVmaW5lIENBTl9CUzFfMTRUUSAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShDQU5fQlRSX1RTMV8zIHwgQ0FOX0JUUl9UUzFfMiB8IENBTl9CVFJfVFMxXzApKSAgLyohPCAxNCB0aW1lIHF1YW50dW0gKi8KKyNkZWZpbmUgQ0FOX0JTMV8xNVRRICAgICAgICAgICAgICAgICgodWludDMyX3QpKENBTl9CVFJfVFMxXzMgfCBDQU5fQlRSX1RTMV8yIHwgQ0FOX0JUUl9UUzFfMSkpICAvKiE8IDE1IHRpbWUgcXVhbnR1bSAqLworI2RlZmluZSBDQU5fQlMxXzE2VFEgICAgICAgICAgICAgICAgKCh1aW50MzJfdClDQU5fQlRSX1RTMSkgLyohPCAxNiB0aW1lIHF1YW50dW0gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ0FOX3RpbWVfcXVhbnR1bV9pbl9iaXRfc2VnbWVudF8yIENBTiBUaW1lIFF1YW50dW0gaW4gQml0IFNlZ21lbnQgMgorICAqIEB7CisgICovCisjZGVmaW5lIENBTl9CUzJfMVRRICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDEgdGltZSBxdWFudHVtICovCisjZGVmaW5lIENBTl9CUzJfMlRRICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9CVFJfVFMyXzApICAgICAgICAgICAgICAgICAgICAvKiE8IDIgdGltZSBxdWFudHVtICovCisjZGVmaW5lIENBTl9CUzJfM1RRICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9CVFJfVFMyXzEpICAgICAgICAgICAgICAgICAgICAvKiE8IDMgdGltZSBxdWFudHVtICovCisjZGVmaW5lIENBTl9CUzJfNFRRICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShDQU5fQlRSX1RTMl8xIHwgQ0FOX0JUUl9UUzJfMCkpICAvKiE8IDQgdGltZSBxdWFudHVtICovCisjZGVmaW5lIENBTl9CUzJfNVRRICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9CVFJfVFMyXzIpICAgICAgICAgICAgICAgICAgICAvKiE8IDUgdGltZSBxdWFudHVtICovCisjZGVmaW5lIENBTl9CUzJfNlRRICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShDQU5fQlRSX1RTMl8yIHwgQ0FOX0JUUl9UUzJfMCkpICAvKiE8IDYgdGltZSBxdWFudHVtICovCisjZGVmaW5lIENBTl9CUzJfN1RRICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShDQU5fQlRSX1RTMl8yIHwgQ0FOX0JUUl9UUzJfMSkpICAvKiE8IDcgdGltZSBxdWFudHVtICovCisjZGVmaW5lIENBTl9CUzJfOFRRICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9CVFJfVFMyKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IDggdGltZSBxdWFudHVtICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENBTl9maWx0ZXJfbW9kZSBDQU4gRmlsdGVyIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBDQU5fRklMVEVSTU9ERV9JRE1BU0sgICAgICAgKDB4MDAwMDAwMDBVKSAgLyohPCBJZGVudGlmaWVyIG1hc2sgbW9kZSAqLworI2RlZmluZSBDQU5fRklMVEVSTU9ERV9JRExJU1QgICAgICAgKDB4MDAwMDAwMDFVKSAgLyohPCBJZGVudGlmaWVyIGxpc3QgbW9kZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDQU5fZmlsdGVyX3NjYWxlIENBTiBGaWx0ZXIgU2NhbGUKKyAgKiBAeworICAqLworI2RlZmluZSBDQU5fRklMVEVSU0NBTEVfMTZCSVQgICAgICAgKDB4MDAwMDAwMDBVKSAgLyohPCBUd28gMTYtYml0IGZpbHRlcnMgKi8KKyNkZWZpbmUgQ0FOX0ZJTFRFUlNDQUxFXzMyQklUICAgICAgICgweDAwMDAwMDAxVSkgIC8qITwgT25lIDMyLWJpdCBmaWx0ZXIgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENBTl9maWx0ZXJfYWN0aXZhdGlvbiBDQU4gRmlsdGVyIEFjdGl2YXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBDQU5fRklMVEVSX0RJU0FCTEUgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgLyohPCBEaXNhYmxlIGZpbHRlciAqLworI2RlZmluZSBDQU5fRklMVEVSX0VOQUJMRSAgICAgICAgICAgKDB4MDAwMDAwMDFVKSAgLyohPCBFbmFibGUgZmlsdGVyICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDQU5fZmlsdGVyX0ZJRk8gQ0FOIEZpbHRlciBGSUZPCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ0FOX0ZJTFRFUl9GSUZPMCAgICAgICAgICAgICgweDAwMDAwMDAwVSkgIC8qITwgRmlsdGVyIEZJRk8gMCBhc3NpZ25tZW50IGZvciBmaWx0ZXIgeCAqLworI2RlZmluZSBDQU5fRklMVEVSX0ZJRk8xICAgICAgICAgICAgKDB4MDAwMDAwMDFVKSAgLyohPCBGaWx0ZXIgRklGTyAxIGFzc2lnbm1lbnQgZm9yIGZpbHRlciB4ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENBTl9pZGVudGlmaWVyX3R5cGUgQ0FOIElkZW50aWZpZXIgVHlwZQorICAqIEB7CisgICovCisjZGVmaW5lIENBTl9JRF9TVEQgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAvKiE8IFN0YW5kYXJkIElkICovCisjZGVmaW5lIENBTl9JRF9FWFQgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwNFUpICAvKiE8IEV4dGVuZGVkIElkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENBTl9yZW1vdGVfdHJhbnNtaXNzaW9uX3JlcXVlc3QgQ0FOIFJlbW90ZSBUcmFuc21pc3Npb24gUmVxdWVzdAorICAqIEB7CisgICovCisjZGVmaW5lIENBTl9SVFJfREFUQSAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAvKiE8IERhdGEgZnJhbWUgICAqLworI2RlZmluZSBDQU5fUlRSX1JFTU9URSAgICAgICAgICAgICAgKDB4MDAwMDAwMDJVKSAgLyohPCBSZW1vdGUgZnJhbWUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ0FOX3JlY2VpdmVfRklGT19udW1iZXIgQ0FOIFJlY2VpdmUgRklGTyBOdW1iZXIKKyAgKiBAeworICAqLworI2RlZmluZSBDQU5fUlhfRklGTzAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgLyohPCBDQU4gcmVjZWl2ZSBGSUZPIDAgKi8KKyNkZWZpbmUgQ0FOX1JYX0ZJRk8xICAgICAgICAgICAgICAgICgweDAwMDAwMDAxVSkgIC8qITwgQ0FOIHJlY2VpdmUgRklGTyAxICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENBTl9UeF9NYWlsYm94ZXMgQ0FOIFR4IE1haWxib3hlcworICAqIEB7CisgICovCisjZGVmaW5lIENBTl9UWF9NQUlMQk9YMCAgICAgICAgICAgICAoMHgwMDAwMDAwMVUpICAvKiE8IFR4IE1haWxib3ggMCAgKi8KKyNkZWZpbmUgQ0FOX1RYX01BSUxCT1gxICAgICAgICAgICAgICgweDAwMDAwMDAyVSkgIC8qITwgVHggTWFpbGJveCAxICAqLworI2RlZmluZSBDQU5fVFhfTUFJTEJPWDIgICAgICAgICAgICAgKDB4MDAwMDAwMDRVKSAgLyohPCBUeCBNYWlsYm94IDIgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENBTl9mbGFncyBDQU4gRmxhZ3MKKyAgKiBAeworICAqLworLyogVHJhbnNtaXQgRmxhZ3MgKi8KKyNkZWZpbmUgQ0FOX0ZMQUdfUlFDUDAgICAgICAgICAgICAgICgweDAwMDAwNTAwVSkgIC8qITwgUmVxdWVzdCBjb21wbGV0ZSBNYWlsQm94IDAgZmxhZyAgICovCisjZGVmaW5lIENBTl9GTEFHX1RYT0swICAgICAgICAgICAgICAoMHgwMDAwMDUwMVUpICAvKiE8IFRyYW5zbWlzc2lvbiBPSyBNYWlsQm94IDAgZmxhZyAgICAqLworI2RlZmluZSBDQU5fRkxBR19BTFNUMCAgICAgICAgICAgICAgKDB4MDAwMDA1MDJVKSAgLyohPCBBcmJpdHJhdGlvbiBMb3N0IE1haWxCb3ggMCBmbGFnICAgKi8KKyNkZWZpbmUgQ0FOX0ZMQUdfVEVSUjAgICAgICAgICAgICAgICgweDAwMDAwNTAzVSkgIC8qITwgVHJhbnNtaXNzaW9uIGVycm9yIE1haWxCb3ggMCBmbGFnICovCisjZGVmaW5lIENBTl9GTEFHX1JRQ1AxICAgICAgICAgICAgICAoMHgwMDAwMDUwOFUpICAvKiE8IFJlcXVlc3QgY29tcGxldGUgTWFpbEJveDEgZmxhZyAgICAqLworI2RlZmluZSBDQU5fRkxBR19UWE9LMSAgICAgICAgICAgICAgKDB4MDAwMDA1MDlVKSAgLyohPCBUcmFuc21pc3Npb24gT0sgTWFpbEJveCAxIGZsYWcgICAgKi8KKyNkZWZpbmUgQ0FOX0ZMQUdfQUxTVDEgICAgICAgICAgICAgICgweDAwMDAwNTBBVSkgIC8qITwgQXJiaXRyYXRpb24gTG9zdCBNYWlsQm94IDEgZmxhZyAgICovCisjZGVmaW5lIENBTl9GTEFHX1RFUlIxICAgICAgICAgICAgICAoMHgwMDAwMDUwQlUpICAvKiE8IFRyYW5zbWlzc2lvbiBlcnJvciBNYWlsQm94IDEgZmxhZyAqLworI2RlZmluZSBDQU5fRkxBR19SUUNQMiAgICAgICAgICAgICAgKDB4MDAwMDA1MTBVKSAgLyohPCBSZXF1ZXN0IGNvbXBsZXRlIE1haWxCb3gyIGZsYWcgICAgKi8KKyNkZWZpbmUgQ0FOX0ZMQUdfVFhPSzIgICAgICAgICAgICAgICgweDAwMDAwNTExVSkgIC8qITwgVHJhbnNtaXNzaW9uIE9LIE1haWxCb3ggMiBmbGFnICAgICovCisjZGVmaW5lIENBTl9GTEFHX0FMU1QyICAgICAgICAgICAgICAoMHgwMDAwMDUxMlUpICAvKiE8IEFyYml0cmF0aW9uIExvc3QgTWFpbEJveCAyIGZsYWcgICAqLworI2RlZmluZSBDQU5fRkxBR19URVJSMiAgICAgICAgICAgICAgKDB4MDAwMDA1MTNVKSAgLyohPCBUcmFuc21pc3Npb24gZXJyb3IgTWFpbEJveCAyIGZsYWcgKi8KKyNkZWZpbmUgQ0FOX0ZMQUdfVE1FMCAgICAgICAgICAgICAgICgweDAwMDAwNTFBVSkgIC8qITwgVHJhbnNtaXQgbWFpbGJveCAwIGVtcHR5IGZsYWcgICAgICovCisjZGVmaW5lIENBTl9GTEFHX1RNRTEgICAgICAgICAgICAgICAoMHgwMDAwMDUxQlUpICAvKiE8IFRyYW5zbWl0IG1haWxib3ggMSBlbXB0eSBmbGFnICAgICAqLworI2RlZmluZSBDQU5fRkxBR19UTUUyICAgICAgICAgICAgICAgKDB4MDAwMDA1MUNVKSAgLyohPCBUcmFuc21pdCBtYWlsYm94IDIgZW1wdHkgZmxhZyAgICAgKi8KKyNkZWZpbmUgQ0FOX0ZMQUdfTE9XMCAgICAgICAgICAgICAgICgweDAwMDAwNTFEVSkgIC8qITwgTG93ZXN0IHByaW9yaXR5IG1haWxib3ggMCBmbGFnICAgICovCisjZGVmaW5lIENBTl9GTEFHX0xPVzEgICAgICAgICAgICAgICAoMHgwMDAwMDUxRVUpICAvKiE8IExvd2VzdCBwcmlvcml0eSBtYWlsYm94IDEgZmxhZyAgICAqLworI2RlZmluZSBDQU5fRkxBR19MT1cyICAgICAgICAgICAgICAgKDB4MDAwMDA1MUZVKSAgLyohPCBMb3dlc3QgcHJpb3JpdHkgbWFpbGJveCAyIGZsYWcgICAgKi8KKworLyogUmVjZWl2ZSBGbGFncyAqLworI2RlZmluZSBDQU5fRkxBR19GRjAgICAgICAgICAgICAgICAgKDB4MDAwMDAyMDNVKSAgLyohPCBSWCBGSUZPIDAgRnVsbCBmbGFnICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FOX0ZMQUdfRk9WMCAgICAgICAgICAgICAgICgweDAwMDAwMjA0VSkgIC8qITwgUlggRklGTyAwIE92ZXJydW4gZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIENBTl9GTEFHX0ZGMSAgICAgICAgICAgICAgICAoMHgwMDAwMDQwM1UpICAvKiE8IFJYIEZJRk8gMSBGdWxsIGZsYWcgICAgICAgICAgICAgICAqLworI2RlZmluZSBDQU5fRkxBR19GT1YxICAgICAgICAgICAgICAgKDB4MDAwMDA0MDRVKSAgLyohPCBSWCBGSUZPIDEgT3ZlcnJ1biBmbGFnICAgICAgICAgICAgKi8KKworLyogT3BlcmF0aW5nIE1vZGUgRmxhZ3MgKi8KKyNkZWZpbmUgQ0FOX0ZMQUdfSU5BSyAgICAgICAgICAgICAgICgweDAwMDAwMTAwVSkgIC8qITwgSW5pdGlhbGl6YXRpb24gYWNrbm93bGVkZ2UgZmxhZyAgICovCisjZGVmaW5lIENBTl9GTEFHX1NMQUsgICAgICAgICAgICAgICAoMHgwMDAwMDEwMVUpICAvKiE8IFNsZWVwIGFja25vd2xlZGdlIGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBDQU5fRkxBR19FUlJJICAgICAgICAgICAgICAgKDB4MDAwMDAxMDJVKSAgLyohPCBFcnJvciBmbGFnICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FOX0ZMQUdfV0tVICAgICAgICAgICAgICAgICgweDAwMDAwMTAzVSkgIC8qITwgV2FrZSB1cCBpbnRlcnJ1cHQgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIENBTl9GTEFHX1NMQUtJICAgICAgICAgICAgICAoMHgwMDAwMDEwNFUpICAvKiE8IFNsZWVwIGFja25vd2xlZGdlIGludGVycnVwdCBmbGFnICAqLworCisvKiBFcnJvciBGbGFncyAqLworI2RlZmluZSBDQU5fRkxBR19FV0cgICAgICAgICAgICAgICAgKDB4MDAwMDAzMDBVKSAgLyohPCBFcnJvciB3YXJuaW5nIGZsYWcgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FOX0ZMQUdfRVBWICAgICAgICAgICAgICAgICgweDAwMDAwMzAxVSkgIC8qITwgRXJyb3IgcGFzc2l2ZSBmbGFnICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENBTl9GTEFHX0JPRiAgICAgICAgICAgICAgICAoMHgwMDAwMDMwMlUpICAvKiE8IEJ1cy1PZmYgZmxhZyAgICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIENBTl9JbnRlcnJ1cHRzIENBTiBJbnRlcnJ1cHRzCisgICogQHsKKyAgKi8KKy8qIFRyYW5zbWl0IEludGVycnVwdCAqLworI2RlZmluZSBDQU5fSVRfVFhfTUFJTEJPWF9FTVBUWSAgICAgKCh1aW50MzJfdClDQU5fSUVSX1RNRUlFKSAgIC8qITwgVHJhbnNtaXQgbWFpbGJveCBlbXB0eSBpbnRlcnJ1cHQgKi8KKworLyogUmVjZWl2ZSBJbnRlcnJ1cHRzICovCisjZGVmaW5lIENBTl9JVF9SWF9GSUZPMF9NU0dfUEVORElORyAoKHVpbnQzMl90KUNBTl9JRVJfRk1QSUUwKSAgLyohPCBGSUZPIDAgbWVzc2FnZSBwZW5kaW5nIGludGVycnVwdCAqLworI2RlZmluZSBDQU5fSVRfUlhfRklGTzBfRlVMTCAgICAgICAgKCh1aW50MzJfdClDQU5fSUVSX0ZGSUUwKSAgIC8qITwgRklGTyAwIGZ1bGwgaW50ZXJydXB0ICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FOX0lUX1JYX0ZJRk8wX09WRVJSVU4gICAgICgodWludDMyX3QpQ0FOX0lFUl9GT1ZJRTApICAvKiE8IEZJRk8gMCBvdmVycnVuIGludGVycnVwdCAgICAgICAgICovCisjZGVmaW5lIENBTl9JVF9SWF9GSUZPMV9NU0dfUEVORElORyAoKHVpbnQzMl90KUNBTl9JRVJfRk1QSUUxKSAgLyohPCBGSUZPIDEgbWVzc2FnZSBwZW5kaW5nIGludGVycnVwdCAqLworI2RlZmluZSBDQU5fSVRfUlhfRklGTzFfRlVMTCAgICAgICAgKCh1aW50MzJfdClDQU5fSUVSX0ZGSUUxKSAgIC8qITwgRklGTyAxIGZ1bGwgaW50ZXJydXB0ICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FOX0lUX1JYX0ZJRk8xX09WRVJSVU4gICAgICgodWludDMyX3QpQ0FOX0lFUl9GT1ZJRTEpICAvKiE8IEZJRk8gMSBvdmVycnVuIGludGVycnVwdCAgICAgICAgICovCisKKy8qIE9wZXJhdGluZyBNb2RlIEludGVycnVwdHMgKi8KKyNkZWZpbmUgQ0FOX0lUX1dBS0VVUCAgICAgICAgICAgICAgICgodWludDMyX3QpQ0FOX0lFUl9XS1VJRSkgICAvKiE8IFdha2UtdXAgaW50ZXJydXB0ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENBTl9JVF9TTEVFUF9BQ0sgICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9JRVJfU0xLSUUpICAgLyohPCBTbGVlcCBhY2tub3dsZWRnZSBpbnRlcnJ1cHQgICAgICAqLworCisvKiBFcnJvciBJbnRlcnJ1cHRzICovCisjZGVmaW5lIENBTl9JVF9FUlJPUl9XQVJOSU5HICAgICAgICAoKHVpbnQzMl90KUNBTl9JRVJfRVdHSUUpICAgLyohPCBFcnJvciB3YXJuaW5nIGludGVycnVwdCAgICAgICAgICAqLworI2RlZmluZSBDQU5fSVRfRVJST1JfUEFTU0lWRSAgICAgICAgKCh1aW50MzJfdClDQU5fSUVSX0VQVklFKSAgIC8qITwgRXJyb3IgcGFzc2l2ZSBpbnRlcnJ1cHQgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FOX0lUX0JVU09GRiAgICAgICAgICAgICAgICgodWludDMyX3QpQ0FOX0lFUl9CT0ZJRSkgICAvKiE8IEJ1cy1vZmYgaW50ZXJydXB0ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENBTl9JVF9MQVNUX0VSUk9SX0NPREUgICAgICAoKHVpbnQzMl90KUNBTl9JRVJfTEVDSUUpICAgLyohPCBMYXN0IGVycm9yIGNvZGUgaW50ZXJydXB0ICAgICAgICAqLworI2RlZmluZSBDQU5fSVRfRVJST1IgICAgICAgICAgICAgICAgKCh1aW50MzJfdClDQU5fSUVSX0VSUklFKSAgIC8qITwgRXJyb3IgSW50ZXJydXB0ICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENBTl9FeHBvcnRlZF9NYWNyb3MgQ0FOIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIFJlc2V0IENBTiBoYW5kbGUgc3RhdGUKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gQ0FOIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ0FOX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfUkVTRVQpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgQ0FOIGludGVycnVwdHMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIENBTiBoYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIENBTiBJbnRlcnJ1cHQgc291cmNlcyB0byBlbmFibGUuCisgICogICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgQGFyZyBDQU5fSW50ZXJydXB0cworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DQU5fRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUVSKSB8PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIENBTiBpbnRlcnJ1cHRzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBDQU4gaGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBDQU4gSW50ZXJydXB0IHNvdXJjZXMgdG8gZGlzYWJsZS4KKyAgKiAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBAYXJnIENBTl9JbnRlcnJ1cHRzCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NBTl9ESVNBQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUVSKSAmPSB+KF9fSU5URVJSVVBUX18pKQorCisvKiogQGJyaWVmICBDaGVjayBpZiB0aGUgc3BlY2lmaWVkIENBTiBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgQ0FOIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBDQU4gaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAgKiAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQGFyZyBDQU5fSW50ZXJydXB0cworICAqIEByZXR2YWwgVGhlIHN0YXRlIG9mIF9fSVRfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX0NBTl9HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUVSKSAmIChfX0lOVEVSUlVQVF9fKSkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIENBTiBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgQ0FOIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgQGFyZyBDQU5fZmxhZ3MKKyAgKiBAcmV0dmFsIFRoZSBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX0NBTl9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgXAorICAoKCgoX19GTEFHX18pID4+IDhVKSA9PSA1VSk/ICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlRTUikgJiAoMVUgPDwgKChfX0ZMQUdfXykgJiBDQU5fRkxBR19NQVNLKSkpID09ICgxVSA8PCAoKF9fRkxBR19fKSAmIENBTl9GTEFHX01BU0spKSk6IFwKKyAgICgoKF9fRkxBR19fKSA+PiA4VSkgPT0gMlUpPyAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SRjBSKSAmICgxVSA8PCAoKF9fRkxBR19fKSAmIENBTl9GTEFHX01BU0spKSkgPT0gKDFVIDw8ICgoX19GTEFHX18pICYgQ0FOX0ZMQUdfTUFTSykpKTogXAorICAgKCgoX19GTEFHX18pID4+IDhVKSA9PSA0VSk/ICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlJGMVIpICYgKDFVIDw8ICgoX19GTEFHX18pICYgQ0FOX0ZMQUdfTUFTSykpKSA9PSAoMVUgPDwgKChfX0ZMQUdfXykgJiBDQU5fRkxBR19NQVNLKSkpOiBcCisgICAoKChfX0ZMQUdfXykgPj4gOFUpID09IDFVKT8gKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+TVNSKSAmICgxVSA8PCAoKF9fRkxBR19fKSAmIENBTl9GTEFHX01BU0spKSkgPT0gKDFVIDw8ICgoX19GTEFHX18pICYgQ0FOX0ZMQUdfTUFTSykpKTogXAorICAgKCgoX19GTEFHX18pID4+IDhVKSA9PSAzVSk/ICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkVTUikgJiAoMVUgPDwgKChfX0ZMQUdfXykgJiBDQU5fRkxBR19NQVNLKSkpID09ICgxVSA8PCAoKF9fRkxBR19fKSAmIENBTl9GTEFHX01BU0spKSk6IDBVKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgc3BlY2lmaWVkIENBTiBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgQ0FOIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIENBTl9GTEFHX1JRQ1AwOiBSZXF1ZXN0IGNvbXBsZXRlIE1haWxCb3ggMCBGbGFnCisgICogICAgICAgICAgICBAYXJnIENBTl9GTEFHX1RYT0swOiBUcmFuc21pc3Npb24gT0sgTWFpbEJveCAwIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQ0FOX0ZMQUdfQUxTVDA6IEFyYml0cmF0aW9uIExvc3QgTWFpbEJveCAwIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQ0FOX0ZMQUdfVEVSUjA6IFRyYW5zbWlzc2lvbiBlcnJvciBNYWlsQm94IDAgRmxhZworICAqICAgICAgICAgICAgQGFyZyBDQU5fRkxBR19SUUNQMTogUmVxdWVzdCBjb21wbGV0ZSBNYWlsQm94IDEgRmxhZworICAqICAgICAgICAgICAgQGFyZyBDQU5fRkxBR19UWE9LMTogVHJhbnNtaXNzaW9uIE9LIE1haWxCb3ggMSBGbGFnCisgICogICAgICAgICAgICBAYXJnIENBTl9GTEFHX0FMU1QxOiBBcmJpdHJhdGlvbiBMb3N0IE1haWxCb3ggMSBGbGFnCisgICogICAgICAgICAgICBAYXJnIENBTl9GTEFHX1RFUlIxOiBUcmFuc21pc3Npb24gZXJyb3IgTWFpbEJveCAxIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQ0FOX0ZMQUdfUlFDUDI6IFJlcXVlc3QgY29tcGxldGUgTWFpbEJveCAyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQ0FOX0ZMQUdfVFhPSzI6IFRyYW5zbWlzc2lvbiBPSyBNYWlsQm94IDIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBDQU5fRkxBR19BTFNUMjogQXJiaXRyYXRpb24gTG9zdCBNYWlsQm94IDIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBDQU5fRkxBR19URVJSMjogVHJhbnNtaXNzaW9uIGVycm9yIE1haWxCb3ggMiBGbGFnCisgICogICAgICAgICAgICBAYXJnIENBTl9GTEFHX0ZGMDogICBSWCBGSUZPIDAgRnVsbCBGbGFnCisgICogICAgICAgICAgICBAYXJnIENBTl9GTEFHX0ZPVjA6ICBSWCBGSUZPIDAgT3ZlcnJ1biBGbGFnCisgICogICAgICAgICAgICBAYXJnIENBTl9GTEFHX0ZGMTogICBSWCBGSUZPIDEgRnVsbCBGbGFnCisgICogICAgICAgICAgICBAYXJnIENBTl9GTEFHX0ZPVjE6ICBSWCBGSUZPIDEgT3ZlcnJ1biBGbGFnCisgICogICAgICAgICAgICBAYXJnIENBTl9GTEFHX1dLVUk6ICBXYWtlIHVwIEludGVycnVwdCBGbGFnCisgICogICAgICAgICAgICBAYXJnIENBTl9GTEFHX1NMQUtJOiBTbGVlcCBhY2tub3dsZWRnZSBJbnRlcnJ1cHQgRmxhZworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DQU5fQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgXAorICAoKCgoX19GTEFHX18pID4+IDhVKSA9PSA1VSk/ICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+VFNSKSA9ICgxVSA8PCAoKF9fRkxBR19fKSAmIENBTl9GTEFHX01BU0spKSk6IFwKKyAgICgoKF9fRkxBR19fKSA+PiA4VSkgPT0gMlUpPyAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlJGMFIpID0gKDFVIDw8ICgoX19GTEFHX18pICYgQ0FOX0ZMQUdfTUFTSykpKTogXAorICAgKCgoX19GTEFHX18pID4+IDhVKSA9PSA0VSk/ICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UkYxUikgPSAoMVUgPDwgKChfX0ZMQUdfXykgJiBDQU5fRkxBR19NQVNLKSkpOiBcCisgICAoKChfX0ZMQUdfXykgPj4gOFUpID09IDFVKT8gKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5NU1IpID0gKDFVIDw8ICgoX19GTEFHX18pICYgQ0FOX0ZMQUdfTUFTSykpKTogMFUpCisKKy8qKgorICogQH0KKyAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIENBTl9FeHBvcnRlZF9GdW5jdGlvbnMgQ0FOIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBDQU5fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NBTl9Jbml0KENBTl9IYW5kbGVUeXBlRGVmICpoY2FuKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DQU5fRGVJbml0KENBTl9IYW5kbGVUeXBlRGVmICpoY2FuKTsKK3ZvaWQgSEFMX0NBTl9Nc3BJbml0KENBTl9IYW5kbGVUeXBlRGVmICpoY2FuKTsKK3ZvaWQgSEFMX0NBTl9Nc3BEZUluaXQoQ0FOX0hhbmRsZVR5cGVEZWYgKmhjYW4pOworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIENBTl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgKiBAeworICovCisKKy8qIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ0FOX0NvbmZpZ0ZpbHRlcihDQU5fSGFuZGxlVHlwZURlZiAqaGNhbiwgQ0FOX0ZpbHRlclR5cGVEZWYgKnNGaWx0ZXJDb25maWcpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIENBTl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIENvbnRyb2wgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIENvbnRyb2wgZnVuY3Rpb25zCisgKiBAeworICovCisKKy8qIENvbnRyb2wgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ0FOX1N0YXJ0KENBTl9IYW5kbGVUeXBlRGVmICpoY2FuKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DQU5fU3RvcChDQU5fSGFuZGxlVHlwZURlZiAqaGNhbik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ0FOX1JlcXVlc3RTbGVlcChDQU5fSGFuZGxlVHlwZURlZiAqaGNhbik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ0FOX1dha2VVcChDQU5fSGFuZGxlVHlwZURlZiAqaGNhbik7Cit1aW50MzJfdCBIQUxfQ0FOX0lzU2xlZXBBY3RpdmUoQ0FOX0hhbmRsZVR5cGVEZWYgKmhjYW4pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NBTl9BZGRUeE1lc3NhZ2UoQ0FOX0hhbmRsZVR5cGVEZWYgKmhjYW4sIENBTl9UeEhlYWRlclR5cGVEZWYgKnBIZWFkZXIsIHVpbnQ4X3QgYURhdGFbXSwgdWludDMyX3QgKnBUeE1haWxib3gpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NBTl9BYm9ydFR4UmVxdWVzdChDQU5fSGFuZGxlVHlwZURlZiAqaGNhbiwgdWludDMyX3QgVHhNYWlsYm94ZXMpOwordWludDMyX3QgSEFMX0NBTl9HZXRUeE1haWxib3hlc0ZyZWVMZXZlbChDQU5fSGFuZGxlVHlwZURlZiAqaGNhbik7Cit1aW50MzJfdCBIQUxfQ0FOX0lzVHhNZXNzYWdlUGVuZGluZyhDQU5fSGFuZGxlVHlwZURlZiAqaGNhbiwgdWludDMyX3QgVHhNYWlsYm94ZXMpOwordWludDMyX3QgSEFMX0NBTl9HZXRUeFRpbWVzdGFtcChDQU5fSGFuZGxlVHlwZURlZiAqaGNhbiwgdWludDMyX3QgVHhNYWlsYm94KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DQU5fR2V0UnhNZXNzYWdlKENBTl9IYW5kbGVUeXBlRGVmICpoY2FuLCB1aW50MzJfdCBSeEZpZm8sIENBTl9SeEhlYWRlclR5cGVEZWYgKnBIZWFkZXIsIHVpbnQ4X3QgYURhdGFbXSk7Cit1aW50MzJfdCBIQUxfQ0FOX0dldFJ4Rmlmb0ZpbGxMZXZlbChDQU5fSGFuZGxlVHlwZURlZiAqaGNhbiwgdWludDMyX3QgUnhGaWZvKTsKKworLyoqCisgKiBAfQorICovCisKKy8qKiBAYWRkdG9ncm91cCBDQU5fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBJbnRlcnJ1cHRzIG1hbmFnZW1lbnQKKyAqICBAYnJpZWYgICAgSW50ZXJydXB0cyBtYW5hZ2VtZW50CisgKiBAeworICovCisvKiBJbnRlcnJ1cHRzIG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NBTl9BY3RpdmF0ZU5vdGlmaWNhdGlvbihDQU5fSGFuZGxlVHlwZURlZiAqaGNhbiwgdWludDMyX3QgQWN0aXZlSVRzKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DQU5fRGVhY3RpdmF0ZU5vdGlmaWNhdGlvbihDQU5fSGFuZGxlVHlwZURlZiAqaGNhbiwgdWludDMyX3QgSW5hY3RpdmVJVHMpOwordm9pZCBIQUxfQ0FOX0lSUUhhbmRsZXIoQ0FOX0hhbmRsZVR5cGVEZWYgKmhjYW4pOworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIENBTl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA1IENhbGxiYWNrIGZ1bmN0aW9ucworICogIEBicmllZiAgICBDYWxsYmFjayBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKy8qIENhbGxiYWNrcyBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgSEFMX0NBTl9UeE1haWxib3gwQ29tcGxldGVDYWxsYmFjayhDQU5fSGFuZGxlVHlwZURlZiAqaGNhbik7Cit2b2lkIEhBTF9DQU5fVHhNYWlsYm94MUNvbXBsZXRlQ2FsbGJhY2soQ0FOX0hhbmRsZVR5cGVEZWYgKmhjYW4pOwordm9pZCBIQUxfQ0FOX1R4TWFpbGJveDJDb21wbGV0ZUNhbGxiYWNrKENBTl9IYW5kbGVUeXBlRGVmICpoY2FuKTsKK3ZvaWQgSEFMX0NBTl9UeE1haWxib3gwQWJvcnRDYWxsYmFjayhDQU5fSGFuZGxlVHlwZURlZiAqaGNhbik7Cit2b2lkIEhBTF9DQU5fVHhNYWlsYm94MUFib3J0Q2FsbGJhY2soQ0FOX0hhbmRsZVR5cGVEZWYgKmhjYW4pOwordm9pZCBIQUxfQ0FOX1R4TWFpbGJveDJBYm9ydENhbGxiYWNrKENBTl9IYW5kbGVUeXBlRGVmICpoY2FuKTsKK3ZvaWQgSEFMX0NBTl9SeEZpZm8wTXNnUGVuZGluZ0NhbGxiYWNrKENBTl9IYW5kbGVUeXBlRGVmICpoY2FuKTsKK3ZvaWQgSEFMX0NBTl9SeEZpZm8wRnVsbENhbGxiYWNrKENBTl9IYW5kbGVUeXBlRGVmICpoY2FuKTsKK3ZvaWQgSEFMX0NBTl9SeEZpZm8xTXNnUGVuZGluZ0NhbGxiYWNrKENBTl9IYW5kbGVUeXBlRGVmICpoY2FuKTsKK3ZvaWQgSEFMX0NBTl9SeEZpZm8xRnVsbENhbGxiYWNrKENBTl9IYW5kbGVUeXBlRGVmICpoY2FuKTsKK3ZvaWQgSEFMX0NBTl9TbGVlcENhbGxiYWNrKENBTl9IYW5kbGVUeXBlRGVmICpoY2FuKTsKK3ZvaWQgSEFMX0NBTl9XYWtlVXBGcm9tUnhNc2dDYWxsYmFjayhDQU5fSGFuZGxlVHlwZURlZiAqaGNhbik7Cit2b2lkIEhBTF9DQU5fRXJyb3JDYWxsYmFjayhDQU5fSGFuZGxlVHlwZURlZiAqaGNhbik7CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGFkZHRvZ3JvdXAgQ0FOX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDYgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgQ0FOIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgKiBAeworICovCisvKiBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX0NBTl9TdGF0ZVR5cGVEZWYgSEFMX0NBTl9HZXRTdGF0ZShDQU5fSGFuZGxlVHlwZURlZiAqaGNhbik7Cit1aW50MzJfdCBIQUxfQ0FOX0dldEVycm9yKENBTl9IYW5kbGVUeXBlRGVmICpoY2FuKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DQU5fUmVzZXRFcnJvcihDQU5fSGFuZGxlVHlwZURlZiAqaGNhbik7CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ0FOX1ByaXZhdGVfVHlwZXMgQ0FOIFByaXZhdGUgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDQU5fUHJpdmF0ZV9WYXJpYWJsZXMgQ0FOIFByaXZhdGUgVmFyaWFibGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ0FOX1ByaXZhdGVfQ29uc3RhbnRzIENBTiBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisjZGVmaW5lIENBTl9GTEFHX01BU0sgICgweDAwMDAwMEZGVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgTWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ0FOX1ByaXZhdGVfTWFjcm9zIENBTiBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfQ0FOX01PREUoTU9ERSkgKCgoTU9ERSkgPT0gQ0FOX01PREVfTk9STUFMKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IENBTl9NT0RFX0xPT1BCQUNLKXx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gQ0FOX01PREVfU0lMRU5UKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IENBTl9NT0RFX1NJTEVOVF9MT09QQkFDSykpCisjZGVmaW5lIElTX0NBTl9TSlcoU0pXKSAoKChTSlcpID09IENBTl9TSldfMVRRKSB8fCAoKFNKVykgPT0gQ0FOX1NKV18yVFEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKFNKVykgPT0gQ0FOX1NKV18zVFEpIHx8ICgoU0pXKSA9PSBDQU5fU0pXXzRUUSkpCisjZGVmaW5lIElTX0NBTl9CUzEoQlMxKSAoKChCUzEpID09IENBTl9CUzFfMVRRKSB8fCAoKEJTMSkgPT0gQ0FOX0JTMV8yVFEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKEJTMSkgPT0gQ0FOX0JTMV8zVFEpIHx8ICgoQlMxKSA9PSBDQU5fQlMxXzRUUSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoQlMxKSA9PSBDQU5fQlMxXzVUUSkgfHwgKChCUzEpID09IENBTl9CUzFfNlRRKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKChCUzEpID09IENBTl9CUzFfN1RRKSB8fCAoKEJTMSkgPT0gQ0FOX0JTMV84VFEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKEJTMSkgPT0gQ0FOX0JTMV85VFEpIHx8ICgoQlMxKSA9PSBDQU5fQlMxXzEwVFEpfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoQlMxKSA9PSBDQU5fQlMxXzExVFEpfHwgKChCUzEpID09IENBTl9CUzFfMTJUUSl8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKChCUzEpID09IENBTl9CUzFfMTNUUSl8fCAoKEJTMSkgPT0gQ0FOX0JTMV8xNFRRKXx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKEJTMSkgPT0gQ0FOX0JTMV8xNVRRKXx8ICgoQlMxKSA9PSBDQU5fQlMxXzE2VFEpKQorI2RlZmluZSBJU19DQU5fQlMyKEJTMikgKCgoQlMyKSA9PSBDQU5fQlMyXzFUUSkgfHwgKChCUzIpID09IENBTl9CUzJfMlRRKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKChCUzIpID09IENBTl9CUzJfM1RRKSB8fCAoKEJTMikgPT0gQ0FOX0JTMl80VFEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKEJTMikgPT0gQ0FOX0JTMl81VFEpIHx8ICgoQlMyKSA9PSBDQU5fQlMyXzZUUSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoQlMyKSA9PSBDQU5fQlMyXzdUUSkgfHwgKChCUzIpID09IENBTl9CUzJfOFRRKSkKKyNkZWZpbmUgSVNfQ0FOX1BSRVNDQUxFUihQUkVTQ0FMRVIpICgoKFBSRVNDQUxFUikgPj0gMVUpICYmICgoUFJFU0NBTEVSKSA8PSAxMDI0VSkpCisjZGVmaW5lIElTX0NBTl9GSUxURVJfSURfSEFMRldPUkQoSEFMRldPUkQpICgoSEFMRldPUkQpIDw9IDB4RkZGRlUpCisjZGVmaW5lIElTX0NBTl9GSUxURVJfQkFOS19EVUFMKEJBTkspICgoQkFOSykgPD0gMjdVKQorI2RlZmluZSBJU19DQU5fRklMVEVSX0JBTktfU0lOR0xFKEJBTkspICgoQkFOSykgPD0gMTNVKQorI2RlZmluZSBJU19DQU5fRklMVEVSX01PREUoTU9ERSkgKCgoTU9ERSkgPT0gQ0FOX0ZJTFRFUk1PREVfSURNQVNLKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBDQU5fRklMVEVSTU9ERV9JRExJU1QpKQorI2RlZmluZSBJU19DQU5fRklMVEVSX1NDQUxFKFNDQUxFKSAoKChTQ0FMRSkgPT0gQ0FOX0ZJTFRFUlNDQUxFXzE2QklUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNDQUxFKSA9PSBDQU5fRklMVEVSU0NBTEVfMzJCSVQpKQorI2RlZmluZSBJU19DQU5fRklMVEVSX0FDVElWQVRJT04oQUNUSVZBVElPTikgKCgoQUNUSVZBVElPTikgPT0gQ0FOX0ZJTFRFUl9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBQ1RJVkFUSU9OKSA9PSBDQU5fRklMVEVSX0VOQUJMRSkpCisjZGVmaW5lIElTX0NBTl9GSUxURVJfRklGTyhGSUZPKSAoKChGSUZPKSA9PSBDQU5fRklMVEVSX0ZJRk8wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGSUZPKSA9PSBDQU5fRklMVEVSX0ZJRk8xKSkKKyNkZWZpbmUgSVNfQ0FOX1RYX01BSUxCT1goVFJBTlNNSVRNQUlMQk9YKSAoKChUUkFOU01JVE1BSUxCT1gpID09IENBTl9UWF9NQUlMQk9YMCApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUkFOU01JVE1BSUxCT1gpID09IENBTl9UWF9NQUlMQk9YMSApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUkFOU01JVE1BSUxCT1gpID09IENBTl9UWF9NQUlMQk9YMiApKQorI2RlZmluZSBJU19DQU5fVFhfTUFJTEJPWF9MSVNUKFRSQU5TTUlUTUFJTEJPWCkgKChUUkFOU01JVE1BSUxCT1gpIDw9IChDQU5fVFhfTUFJTEJPWDAgfCBDQU5fVFhfTUFJTEJPWDEgfCBDQU5fVFhfTUFJTEJPWDIpKQorI2RlZmluZSBJU19DQU5fU1RESUQoU1RESUQpICAgKChTVERJRCkgPD0gMHg3RkZVKQorI2RlZmluZSBJU19DQU5fRVhUSUQoRVhUSUQpICAgKChFWFRJRCkgPD0gMHgxRkZGRkZGRlUpCisjZGVmaW5lIElTX0NBTl9ETEMoRExDKSAgICAgICAoKERMQykgPD0gOFUpCisjZGVmaW5lIElTX0NBTl9JRFRZUEUoSURUWVBFKSAgKCgoSURUWVBFKSA9PSBDQU5fSURfU1REKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSURUWVBFKSA9PSBDQU5fSURfRVhUKSkKKyNkZWZpbmUgSVNfQ0FOX1JUUihSVFIpICgoKFJUUikgPT0gQ0FOX1JUUl9EQVRBKSB8fCAoKFJUUikgPT0gQ0FOX1JUUl9SRU1PVEUpKQorI2RlZmluZSBJU19DQU5fUlhfRklGTyhGSUZPKSAoKChGSUZPKSA9PSBDQU5fUlhfRklGTzApIHx8ICgoRklGTykgPT0gQ0FOX1JYX0ZJRk8xKSkKKyNkZWZpbmUgSVNfQ0FOX0lUKElUKSAoKElUKSA8PSAoQ0FOX0lUX1RYX01BSUxCT1hfRU1QVFkgICAgIHwgQ0FOX0lUX1JYX0ZJRk8wX01TR19QRU5ESU5HICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTl9JVF9SWF9GSUZPMF9GVUxMICAgICAgICB8IENBTl9JVF9SWF9GSUZPMF9PVkVSUlVOICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU5fSVRfUlhfRklGTzFfTVNHX1BFTkRJTkcgfCBDQU5fSVRfUlhfRklGTzFfRlVMTCAgICAgICAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FOX0lUX1JYX0ZJRk8xX09WRVJSVU4gICAgIHwgQ0FOX0lUX1dBS0VVUCAgICAgICAgICAgICAgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTl9JVF9TTEVFUF9BQ0sgICAgICAgICAgICB8IENBTl9JVF9FUlJPUl9XQVJOSU5HICAgICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU5fSVRfRVJST1JfUEFTU0lWRSAgICAgICAgfCBDQU5fSVRfQlVTT0ZGICAgICAgICAgICAgICAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FOX0lUX0xBU1RfRVJST1JfQ09ERSAgICAgIHwgQ0FOX0lUX0VSUk9SKSkKKworLyoqCisgICogQH0KKyAgKi8KKy8qIEVuZCBvZiBwcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICAqIEB9CisgICovCisKKworI2VuZGlmIC8qIENBTiAqLworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRjN4eF9IQUxfQ0FOX0ggKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjN4eF9oYWxfY2VjLmggYi9JbmMvc3RtMzJmM3h4X2hhbF9jZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDM5NDgxCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjN4eF9oYWxfY2VjLmgKQEAgLTAsMCArMSw3NDkgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX2NlYy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBDRUMgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkYzeHhfSEFMX0NFQ19ICisjZGVmaW5lIF9fU1RNMzJGM3h4X0hBTF9DRUNfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIENFQworICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorLyoqIEBkZWZncm91cCBDRUNfRXhwb3J0ZWRfVHlwZXMgQ0VDIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKyAgCisvKiogCisgICogQGJyaWVmIENFQyBJbml0IFN0cnVjdHVyZSBkZWZpbml0aW9uICAKKyAgKi8gCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBTaWduYWxGcmVlVGltZTsgICAgICAgICAgICAgICAvKiE8IFNldCBTRlQgZmllbGQsIHNwZWNpZmllcyB0aGUgU2lnbmFsIEZyZWUgVGltZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBjYW4gYmUgb25lIG9mIEByZWYgQ0VDX1NpZ25hbF9GcmVlX1RpbWUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGJlbG9uZ3MgdG8gdGhlIHNldCB7MFUsLi4uLDd9IHdoZXJlICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAgaXMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIG1lYW5zIDAuNVUgKyAoU2lnbmFsRnJlZVRpbWUgLSAxVSkgbm9taW5hbCBkYXRhIGJpdCBwZXJpb2RzICovCisKKyAgdWludDMyX3QgVG9sZXJhbmNlOyAgICAgICAgICAgICAgICAgICAgLyohPCBTZXQgUlhUT0wgYml0LCBzcGVjaWZpZXMgdGhlIHRvbGVyYW5jZSBhY2NlcHRlZCBvbiB0aGUgcmVjZWl2ZWQgd2F2ZWZvcm1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ0VDX1RvbGVyYW5jZSA6IGl0IGlzIGVpdGhlciBDRUNfU1RBTkRBUkRfVE9MRVJBTkNFIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIENFQ19FWFRFTkRFRF9UT0xFUkFOQ0UgKi8KKworICB1aW50MzJfdCBCUkVSeFN0b3A7ICAgICAgICAgICAgICAgICAgICAvKiE8IFNldCBCUkVTVFAgYml0IEByZWYgQ0VDX0JSRVJ4U3RvcCA6IHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCBhIEJpdCBSaXNpbmcgRXJyb3Igc3RvcHMgdGhlIHJlY2VwdGlvbi4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VDX05PX1JYX1NUT1BfT05fQlJFOiByZWNlcHRpb24gaXMgbm90IHN0b3BwZWQuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFQ19SWF9TVE9QX09OX0JSRTogICAgcmVjZXB0aW9uIGlzIHN0b3BwZWQuICovCisKKyAgdWludDMyX3QgQlJFRXJyb3JCaXRHZW47ICAgICAgICAgICAgICAgLyohPCBTZXQgQlJFR0VOIGJpdCBAcmVmIENFQ19CUkVFcnJvckJpdEdlbiA6IHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCBhbiBFcnJvci1CaXQgaXMgZ2VuZXJhdGVkIG9uIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFQyBsaW5lIHVwb24gQml0IFJpc2luZyBFcnJvciBkZXRlY3Rpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VDX0JSRV9FUlJPUkJJVF9OT19HRU5FUkFUSU9OOiBubyBlcnJvci1iaXQgZ2VuZXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRUNfQlJFX0VSUk9SQklUX0dFTkVSQVRJT046ICAgIGVycm9yLWJpdCBnZW5lcmF0aW9uIGlmIEJSRVNUUCBpcyBzZXQuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHVpbnQzMl90IExCUEVFcnJvckJpdEdlbjsgICAgICAgICAgICAgIC8qITwgU2V0IExCUEVHRU4gYml0IEByZWYgQ0VDX0xCUEVFcnJvckJpdEdlbiA6IHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCBhbiBFcnJvci1CaXQgaXMgZ2VuZXJhdGVkIG9uIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFQyBsaW5lIHVwb24gTG9uZyBCaXQgUGVyaW9kIEVycm9yIGRldGVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRUNfTEJQRV9FUlJPUkJJVF9OT19HRU5FUkFUSU9OOiAgbm8gZXJyb3ItYml0IGdlbmVyYXRpb24uIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFQ19MQlBFX0VSUk9SQklUX0dFTkVSQVRJT046ICAgICBlcnJvci1iaXQgZ2VuZXJhdGlvbi4gKi8gIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB1aW50MzJfdCBCcm9hZGNhc3RNc2dOb0Vycm9yQml0R2VuOyAgICAvKiE8IFNldCBCUkROT0dFTiBiaXQgQHJlZiBDRUNfQnJvYWRDYXN0TXNnRXJyb3JCaXRHZW4gOiBhbGxvd3MgdG8gYXZvaWQgYW4gRXJyb3ItQml0IGdlbmVyYXRpb24gb24gdGhlIENFQyBsaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBvbiBhbiBlcnJvciBkZXRlY3RlZCBvbiBhIGJyb2FkY2FzdCBtZXNzYWdlLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBzdXBlcnNlZGVzIEJSRUdFTiBhbmQgTEJQRUdFTiBiaXRzIGZvciBhIGJyb2FkY2FzdCBtZXNzYWdlIGVycm9yIGhhbmRsaW5nLiBJdCBjYW4gdGFrZSB0d28gdmFsdWVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFVKSBDRUNfQlJPQURDQVNURVJST1JfRVJST1JCSVRfR0VORVJBVElPTi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhKSBCUkUgZGV0ZWN0aW9uOiBlcnJvci1iaXQgZ2VuZXJhdGlvbiBvbiB0aGUgQ0VDIGxpbmUgaWYgQlJFU1RQPUNFQ19SWF9TVE9QX09OX0JSRSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgQlJFR0VOPUNFQ19CUkVfRVJST1JCSVRfTk9fR0VORVJBVElPTi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiKSBMQlBFIGRldGVjdGlvbjogZXJyb3ItYml0IGdlbmVyYXRpb24gb24gdGhlIENFQyBsaW5lIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIExCUEdFTj1DRUNfTEJQRV9FUlJPUkJJVF9OT19HRU5FUkFUSU9OLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJVKSBDRUNfQlJPQURDQVNURVJST1JfTk9fRVJST1JCSVRfR0VORVJBVElPTi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBlcnJvci1iaXQgZ2VuZXJhdGlvbiBpbiBjYXNlIG5laXRoZXIgYSkgbm9yIGIpIGFyZSBzYXRpc2ZpZWQuIEFkZGl0aW9uYWxseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvci1iaXQgZ2VuZXJhdGlvbiBpbiBjYXNlIG9mIFNob3J0IEJpdCBQZXJpb2QgRXJyb3IgZGV0ZWN0aW9uIGluIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgYnJvYWRjYXN0IG1lc3NhZ2Ugd2hpbGUgTFNUTiBiaXQgaXMgc2V0LiAqLworIAorICB1aW50MzJfdCBTaWduYWxGcmVlVGltZU9wdGlvbjsgICAgICAgICAvKiE8IFNldCBTRlRPUCBiaXQgQHJlZiBDRUNfU0ZUX09wdGlvbiA6IHNwZWNpZmllcyB3aGVuIFNGVCB0aW1lciBzdGFydHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VDX1NGVF9TVEFSVF9PTl9UWFNPTSBTRlQ6ICAgIHRpbWVyIHN0YXJ0cyB3aGVuIFRYU09NIGlzIHNldCBieSBzb2Z0d2FyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRUNfU0ZUX1NUQVJUX09OX1RYX1JYX0VORDogIFNGVCB0aW1lciBzdGFydHMgYXV0b21hdGljYWxseSBhdCB0aGUgZW5kIG9mIG1lc3NhZ2UgdHJhbnNtaXNzaW9uL3JlY2VwdGlvbi4gKi8KKyAgCisgIHVpbnQzMl90IExpc3Rlbk1vZGU7ICAgICAgICAgICAgICAgICAgIC8qITwgU2V0IExTVE4gYml0IEByZWYgQ0VDX0xpc3RlbmluZ19Nb2RlIDogc3BlY2lmaWVzIGRldmljZSBsaXN0ZW5pbmcgbW9kZS4gSXQgY2FuIHRha2UgdHdvIHZhbHVlczoKKyAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VDX1JFRFVDRURfTElTVEVOSU5HX01PREU6IENFQyBwZXJpcGhlcmFsIHJlY2VpdmVzIG9ubHkgbWVzc2FnZSBhZGRyZXNzZWQgdG8gaXRzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duIGFkZHJlc3MgKE9BUikuIE1lc3NhZ2VzIGFkZHJlc3NlZCB0byBkaWZmZXJlbnQgZGVzdGluYXRpb24gYXJlIGlnbm9yZWQuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnJvYWRjYXN0IG1lc3NhZ2VzIGFyZSBhbHdheXMgcmVjZWl2ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRUNfRlVMTF9MSVNURU5JTkdfTU9ERTogQ0VDIHBlcmlwaGVyYWwgcmVjZWl2ZXMgbWVzc2FnZXMgYWRkcmVzc2VkIHRvIGl0cyBvd24gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIChPQVIpIHdpdGggcG9zaXRpdmUgYWNrbm93bGVkZ2UuIE1lc3NhZ2VzIGFkZHJlc3NlZCB0byBkaWZmZXJlbnQgZGVzdGluYXRpb24gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgcmVjZWl2ZWQsIGJ1dCB3aXRob3V0IGludGVyZmVyaW5nIHdpdGggdGhlIENFQyBidXM6IG5vIGFja25vd2xlZGdlIHNlbnQuICAqLworCisgIHVpbnQxNl90ICBPd25BZGRyZXNzOyAgICAgICAgICAgICAgICAgLyohPCBPd24gYWRkcmVzc2VzIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ0VDX09XTl9BRERSRVNTICovCisgIAorICB1aW50OF90ICAqUnhCdWZmZXI7ICAgICAgICAgICAgICAgICAgICAvKiE8IENFQyBSeCBidWZmZXIgcG9pbnRldXIgKi8KKyAgCisKK31DRUNfSW5pdFR5cGVEZWY7CisKKy8qKiAKKyAgKiBAYnJpZWYgSEFMIENFQyBTdGF0ZSBzdHJ1Y3R1cmVzIGRlZmluaXRpb24gCisgICogQG5vdGUgIEhBTCBDRUMgU3RhdGUgdmFsdWUgaXMgYSBjb21iaW5hdGlvbiBvZiAyIGRpZmZlcmVudCBzdWJzdGF0ZXM6IGdTdGF0ZSBhbmQgUnhTdGF0ZS4KKyAgKiAgICAgICAgLSBnU3RhdGUgY29udGFpbnMgQ0VDIHN0YXRlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gZ2xvYmFsIEhhbmRsZSBtYW5hZ2VtZW50IAorICAqICAgICAgICAgIGFuZCBhbHNvIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gVHggb3BlcmF0aW9ucy4KKyAgKiAgICAgICAgICBnU3RhdGUgdmFsdWUgY29kaW5nIGZvbGxvdyBiZWxvdyBkZXNjcmliZWQgYml0bWFwIDoKKyAgKiAgICAgICAgICBiNyAobm90IHVzZWQpCisgICogICAgICAgICAgICAgeCAgOiBTaG91bGQgYmUgc2V0IHRvIDAKKyAgKiAgICAgICAgICBiNiAgRXJyb3IgaW5mb3JtYXRpb24gCisgICogICAgICAgICAgICAgMCAgOiBObyBFcnJvcgorICAqICAgICAgICAgICAgIDEgIDogRXJyb3IKKyAgKiAgICAgICAgICBiNSAgICAgSVAgaW5pdGlsaXNhdGlvbiBzdGF0dXMKKyAgKiAgICAgICAgICAgICAwICA6IFJlc2V0IChJUCBub3QgaW5pdGlhbGl6ZWQpCisgICogICAgICAgICAgICAgMSAgOiBJbml0IGRvbmUgKElQIGluaXRpYWxpemVkLiBIQUwgQ0VDIEluaXQgZnVuY3Rpb24gYWxyZWFkeSBjYWxsZWQpCisgICogICAgICAgICAgYjQtYjMgIChub3QgdXNlZCkKKyAgKiAgICAgICAgICAgICB4eCA6IFNob3VsZCBiZSBzZXQgdG8gMDAKKyAgKiAgICAgICAgICBiMiAgICAgSW50cmluc2ljIHByb2Nlc3Mgc3RhdGUKKyAgKiAgICAgICAgICAgICAwICA6IFJlYWR5CisgICogICAgICAgICAgICAgMSAgOiBCdXN5IChJUCBidXN5IHdpdGggc29tZSBjb25maWd1cmF0aW9uIG9yIGludGVybmFsIG9wZXJhdGlvbnMpCisgICogICAgICAgICAgYjEgICAgIChub3QgdXNlZCkKKyAgKiAgICAgICAgICAgICB4ICA6IFNob3VsZCBiZSBzZXQgdG8gMAorICAqICAgICAgICAgIGIwICAgICBUeCBzdGF0ZQorICAqICAgICAgICAgICAgIDAgIDogUmVhZHkgKG5vIFR4IG9wZXJhdGlvbiBvbmdvaW5nKQorICAqICAgICAgICAgICAgIDEgIDogQnVzeSAoVHggb3BlcmF0aW9uIG9uZ29pbmcpCisgICogICAgICAgIC0gUnhTdGF0ZSBjb250YWlucyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIFJ4IG9wZXJhdGlvbnMuCisgICogICAgICAgICAgUnhTdGF0ZSB2YWx1ZSBjb2RpbmcgZm9sbG93IGJlbG93IGRlc2NyaWJlZCBiaXRtYXAgOgorICAqICAgICAgICAgIGI3LWI2ICAobm90IHVzZWQpCisgICogICAgICAgICAgICAgeHggOiBTaG91bGQgYmUgc2V0IHRvIDAwCisgICogICAgICAgICAgYjUgICAgIElQIGluaXRpbGlzYXRpb24gc3RhdHVzCisgICogICAgICAgICAgICAgMCAgOiBSZXNldCAoSVAgbm90IGluaXRpYWxpemVkKQorICAqICAgICAgICAgICAgIDEgIDogSW5pdCBkb25lIChJUCBpbml0aWFsaXplZCkKKyAgKiAgICAgICAgICBiNC1iMiAgKG5vdCB1c2VkKQorICAqICAgICAgICAgICAgeHh4IDogU2hvdWxkIGJlIHNldCB0byAwMDAKKyAgKiAgICAgICAgICBiMSAgICAgUnggc3RhdGUKKyAgKiAgICAgICAgICAgICAwICA6IFJlYWR5IChubyBSeCBvcGVyYXRpb24gb25nb2luZykKKyAgKiAgICAgICAgICAgICAxICA6IEJ1c3kgKFJ4IG9wZXJhdGlvbiBvbmdvaW5nKQorICAqICAgICAgICAgIGIwICAgICAobm90IHVzZWQpCisgICogICAgICAgICAgICAgeCAgOiBTaG91bGQgYmUgc2V0IHRvIDAuICAKKyAgKi8gCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX0NFQ19TVEFURV9SRVNFVCAgICAgICAgICAgICA9IDB4MDBVLCAgICAvKiE8IFBlcmlwaGVyYWwgaXMgbm90IHlldCBJbml0aWFsaXplZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBhbmQgUnhTdGF0ZSAgICAgICAgICAgICAqLworICBIQUxfQ0VDX1NUQVRFX1JFQURZICAgICAgICAgICAgID0gMHgyMFUsICAgIC8qITwgUGVyaXBoZXJhbCBJbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIGFuZCBSeFN0YXRlICAgICAgICAgICAgICovCisgIEhBTF9DRUNfU1RBVEVfQlVTWSAgICAgICAgICAgICAgPSAweDI0VSwgICAgLyohPCBhbiBpbnRlcm5hbCBwcm9jZXNzIGlzIG9uZ29pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBvbmx5ICAgICAgICAgICAgICAgICAgICAqLworICBIQUxfQ0VDX1NUQVRFX0JVU1lfUlggICAgICAgICAgID0gMHgyMlUsICAgIC8qITwgRGF0YSBSZWNlcHRpb24gcHJvY2VzcyBpcyBvbmdvaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBSeFN0YXRlIG9ubHkgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0NFQ19TVEFURV9CVVNZX1RYICAgICAgICAgICA9IDB4MjFVLCAgICAvKiE8IERhdGEgVHJhbnNtaXNzaW9uIHByb2Nlc3MgaXMgb25nb2luZyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBvbmx5ICAgICAgICAgICAgICAgICAgICAqLworICBIQUxfQ0VDX1NUQVRFX0JVU1lfUlhfVFggICAgICAgID0gMHgyM1UsICAgIC8qITwgYW4gaW50ZXJuYWwgcHJvY2VzcyBpcyBvbmdvaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgb25seSAgICAgICAgICAgICAgICAgICAgKi8KK0hBTF9DRUNfU1RBVEVfRVJST1IgICAgICAgICAgICAgPSAweDYwVSAgICAgLyohPCBFcnJvciBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgb25seSAgICAgICAgICAgICAgKi8KK31IQUxfQ0VDX1N0YXRlVHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiAgQ0VDIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiAgCisgICovICAKK3R5cGVkZWYgc3RydWN0Cit7CisgIENFQ19UeXBlRGVmICAgICAgICAgICAgICpJbnN0YW5jZTsgICAgICAvKiE8IENFQyByZWdpc3RlcnMgYmFzZSBhZGRyZXNzICovCisgIAorICBDRUNfSW5pdFR5cGVEZWYgICAgICAgICBJbml0OyAgICAgICAgICAgLyohPCBDRUMgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICovCisgIAorICB1aW50OF90ICAgICAgICAgICAgICAgICAqcFR4QnVmZlB0cjsgICAgLyohPCBQb2ludGVyIHRvIENFQyBUeCB0cmFuc2ZlciBCdWZmZXIgKi8KKyAgCisgIHVpbnQxNl90ICAgICAgICAgICAgICAgIFR4WGZlckNvdW50OyAgICAvKiE8IENFQyBUeCBUcmFuc2ZlciBDb3VudGVyICovCisgIAorICB1aW50MTZfdCAgICAgICAgICAgICAgICBSeFhmZXJTaXplOyAgICAgLyohPCBDRUMgUnggVHJhbnNmZXIgc2l6ZSwgMDogaGVhZGVyIHJlY2VpdmVkIG9ubHkgKi8KKyAgCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgIExvY2s7ICAgICAgICAgICAvKiE8IExvY2tpbmcgb2JqZWN0ICovCisKKyAgSEFMX0NFQ19TdGF0ZVR5cGVEZWYgICAgZ1N0YXRlOyAgICAgICAgIC8qITwgQ0VDIHN0YXRlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gZ2xvYmFsIEhhbmRsZSBtYW5hZ2VtZW50IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYWxzbyByZWxhdGVkIHRvIFR4IG9wZXJhdGlvbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSEFMX0NFQ19TdGF0ZVR5cGVEZWYgKi8KKyAgCisgIEhBTF9DRUNfU3RhdGVUeXBlRGVmICAgIFJ4U3RhdGU7ICAgICAgICAvKiE8IENFQyBzdGF0ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIFJ4IG9wZXJhdGlvbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSEFMX0NFQ19TdGF0ZVR5cGVEZWYgKi8KKyAgCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgIEVycm9yQ29kZTsgICAgICAvKiE8IEZvciBlcnJvcnMgaGFuZGxpbmcgcHVycG9zZXMsIGNvcHkgb2YgSVNSIHJlZ2lzdGVyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBjYXNlIGVycm9yIGlzIHJlcG9ydGVkICovICAgIAorfUNFQ19IYW5kbGVUeXBlRGVmOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ0VDX0V4cG9ydGVkX0NvbnN0YW50cyBDRUMgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDRUNfRXJyb3JfQ29kZSBDRUMgRXJyb3IgQ29kZQorICAqIEB7CisgICovIAorI2RlZmluZSBIQUxfQ0VDX0VSUk9SX05PTkUgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAvKiE8IG5vIGVycm9yICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9DRUNfRVJST1JfUlhPVlIgICBDRUNfSVNSX1JYT1ZSICAgICAgICAgIC8qITwgQ0VDIFJ4LU92ZXJydW4gICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0NFQ19FUlJPUl9CUkUgICAgIENFQ19JU1JfQlJFICAgICAgICAgICAgLyohPCBDRUMgUnggQml0IFJpc2luZyBFcnJvciAgICAgICAqLworI2RlZmluZSBIQUxfQ0VDX0VSUk9SX1NCUEUgICAgQ0VDX0lTUl9TQlBFICAgICAgICAgICAvKiE8IENFQyBSeCBTaG9ydCBCaXQgcGVyaW9kIEVycm9yICovCisjZGVmaW5lIEhBTF9DRUNfRVJST1JfTEJQRSAgICBDRUNfSVNSX0xCUEUgICAgICAgICAgIC8qITwgQ0VDIFJ4IExvbmcgQml0IHBlcmlvZCBFcnJvciAgKi8KKyNkZWZpbmUgSEFMX0NFQ19FUlJPUl9SWEFDS0UgIENFQ19JU1JfUlhBQ0tFICAgICAgICAgLyohPCBDRUMgUnggTWlzc2luZyBBY2tub3dsZWRnZSAgICAqLworI2RlZmluZSBIQUxfQ0VDX0VSUk9SX0FSQkxTVCAgQ0VDX0lTUl9BUkJMU1QgICAgICAgICAvKiE8IENFQyBBcmJpdHJhdGlvbiBMb3N0ICAgICAgICAgICovCisjZGVmaW5lIEhBTF9DRUNfRVJST1JfVFhVRFIgICBDRUNfSVNSX1RYVURSICAgICAgICAgIC8qITwgQ0VDIFR4LUJ1ZmZlciBVbmRlcnJ1biAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0NFQ19FUlJPUl9UWEVSUiAgIENFQ19JU1JfVFhFUlIgICAgICAgICAgLyohPCBDRUMgVHgtRXJyb3IgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfQ0VDX0VSUk9SX1RYQUNLRSAgQ0VDX0lTUl9UWEFDS0UgICAgICAgICAvKiE8IENFQyBUeCBNaXNzaW5nIEFja25vd2xlZGdlICAgICovCisvKioKKyAgKiBAfQorICAqLworICAgICAgIAorLyoqIEBkZWZncm91cCBDRUNfU2lnbmFsX0ZyZWVfVGltZSAgQ0VDIFNpZ25hbCBGcmVlIFRpbWUgc2V0dGluZyBwYXJhbWV0ZXIKKyAgKiBAeworICAqLworI2RlZmluZSBDRUNfREVGQVVMVF9TRlQgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgQ0VDXzBfNV9CSVRQRVJJT0RfU0ZUICAgICAgICAgICAgICAoMHgwMDAwMDAwMVUpCisjZGVmaW5lIENFQ18xXzVfQklUUEVSSU9EX1NGVCAgICAgICAgICAgICAgKDB4MDAwMDAwMDJVKQorI2RlZmluZSBDRUNfMl81X0JJVFBFUklPRF9TRlQgICAgICAgICAgICAgICgweDAwMDAwMDAzVSkKKyNkZWZpbmUgQ0VDXzNfNV9CSVRQRVJJT0RfU0ZUICAgICAgICAgICAgICAoMHgwMDAwMDAwNFUpCisjZGVmaW5lIENFQ180XzVfQklUUEVSSU9EX1NGVCAgICAgICAgICAgICAgKDB4MDAwMDAwMDVVKQorI2RlZmluZSBDRUNfNV81X0JJVFBFUklPRF9TRlQgICAgICAgICAgICAgICgweDAwMDAwMDA2VSkKKyNkZWZpbmUgQ0VDXzZfNV9CSVRQRVJJT0RfU0ZUICAgICAgICAgICAgICAoMHgwMDAwMDAwN1UpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENFQ19Ub2xlcmFuY2UgQ0VDIFJlY2VpdmVyIFRvbGVyYW5jZQorICAqIEB7CisgICovCisjZGVmaW5lIENFQ19TVEFOREFSRF9UT0xFUkFOQ0UgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBDRUNfRVhURU5ERURfVE9MRVJBTkNFICAgICAgICAgICAgICgodWludDMyX3QpQ0VDX0NGR1JfUlhUT0wpCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqIEBkZWZncm91cCBDRUNfQlJFUnhTdG9wIENFQyBSZWNlcHRpb24gU3RvcCBvbiBFcnJvcgorICAqIEB7CisgICovCisjZGVmaW5lIENFQ19OT19SWF9TVE9QX09OX0JSRSAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIENFQ19SWF9TVE9QX09OX0JSRSAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUNFQ19DRkdSX0JSRVNUUCkKKy8qKgorICAqIEB9CisgICovICAgICAgICAgICAgCisgICAgICAgICAgICAgCisvKiogQGRlZmdyb3VwIENFQ19CUkVFcnJvckJpdEdlbiAgQ0VDIEVycm9yIEJpdCBHZW5lcmF0aW9uIGlmIEJpdCBSaXNlIEVycm9yIHJlcG9ydGVkCisgICogQHsKKyAgKi8gCisjZGVmaW5lIENFQ19CUkVfRVJST1JCSVRfTk9fR0VORVJBVElPTiAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBDRUNfQlJFX0VSUk9SQklUX0dFTkVSQVRJT04gICAgICAgICgodWludDMyX3QpQ0VDX0NGR1JfQlJFR0VOKQorLyoqCisgICogQH0KKyAgKi8gCisgICAgICAgICAgICAgICAgICAgICAgICAKKy8qKiBAZGVmZ3JvdXAgQ0VDX0xCUEVFcnJvckJpdEdlbiAgQ0VDIEVycm9yIEJpdCBHZW5lcmF0aW9uIGlmIExvbmcgQml0IFBlcmlvZCBFcnJvciByZXBvcnRlZAorICAqIEB7CisgICovIAorI2RlZmluZSBDRUNfTEJQRV9FUlJPUkJJVF9OT19HRU5FUkFUSU9OICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIENFQ19MQlBFX0VSUk9SQklUX0dFTkVSQVRJT04gICAgICAgICgodWludDMyX3QpQ0VDX0NGR1JfTEJQRUdFTikKKy8qKgorICAqIEB9CisgICovICAgIAorCisvKiogQGRlZmdyb3VwIENFQ19Ccm9hZENhc3RNc2dFcnJvckJpdEdlbiAgQ0VDIEVycm9yIEJpdCBHZW5lcmF0aW9uIG9uIEJyb2FkY2FzdCBtZXNzYWdlCisgICogQHsKKyAgKi8gCisjZGVmaW5lIENFQ19CUk9BRENBU1RFUlJPUl9FUlJPUkJJVF9HRU5FUkFUSU9OICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIENFQ19CUk9BRENBU1RFUlJPUl9OT19FUlJPUkJJVF9HRU5FUkFUSU9OICAoKHVpbnQzMl90KUNFQ19DRkdSX0JSRE5PR0VOKQorLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIENFQ19TRlRfT3B0aW9uICAgICBDRUMgU2lnbmFsIEZyZWUgVGltZSBzdGFydCBvcHRpb24KKyAgKiBAeworICAqLyAKKyNkZWZpbmUgQ0VDX1NGVF9TVEFSVF9PTl9UWFNPTSAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBDRUNfU0ZUX1NUQVJUX09OX1RYX1JYX0VORCAgICAgICAoKHVpbnQzMl90KUNFQ19DRkdSX1NGVE9QVCkKKy8qKgorICAqIEB9CisgICovCisgIAorLyoqIEBkZWZncm91cCBDRUNfTGlzdGVuaW5nX01vZGUgICAgQ0VDIExpc3RlbmluZyBtb2RlIG9wdGlvbgorICAqIEB7CisgICovIAorI2RlZmluZSBDRUNfUkVEVUNFRF9MSVNURU5JTkdfTU9ERSAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIENFQ19GVUxMX0xJU1RFTklOR19NT0RFICAgICAgICAgICAgICgodWludDMyX3QpQ0VDX0NGR1JfTFNUTikKKy8qKgorICAqIEB9CisgICovCisgIAorLyoqIEBkZWZncm91cCBDRUNfT0FSX1Bvc2l0aW9uICAgQ0VDIERldmljZSBPd24gQWRkcmVzcyBwb3NpdGlvbiBpbiBDRUMgQ0ZHUiByZWdpc3RlciAgICAgCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ0VDX0NGR1JfT0FSX0xTQl9QT1MgICAgICAgICAgICAoMTZVKQorLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIENFQ19Jbml0aWF0b3JfUG9zaXRpb24gICBDRUMgSW5pdGlhdG9yIGxvZ2ljYWwgYWRkcmVzcyBwb3NpdGlvbiBpbiBtZXNzYWdlIGhlYWRlciAgICAgCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ0VDX0lOSVRJQVRPUl9MU0JfUE9TICAgICAgICAgICAoNFUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENFQ19PV05fQUREUkVTUyAgIENFQyBPd24gQWRkcmVzcyAgICAKKyAgKiBAeworICAqLworI2RlZmluZSBDRUNfT1dOX0FERFJFU1NfTk9ORSAgICAgICAgICAgKCh1aW50MTZfdCkgMHgwMDAwVSkgICAvKiBSZXNldCB2YWx1ZSAqLworI2RlZmluZSBDRUNfT1dOX0FERFJFU1NfMCAgICAgICAgICAgICAgKCh1aW50MTZfdCkgMHgwMDAxVSkgICAvKiBMb2dpY2FsIEFkZHJlc3MgMFUgKi8KKyNkZWZpbmUgQ0VDX09XTl9BRERSRVNTXzEgICAgICAgICAgICAgICgodWludDE2X3QpIDB4MDAwMlUpICAgLyogTG9naWNhbCBBZGRyZXNzIDFVICovCisjZGVmaW5lIENFQ19PV05fQUREUkVTU18yICAgICAgICAgICAgICAoKHVpbnQxNl90KSAweDAwMDRVKSAgIC8qIExvZ2ljYWwgQWRkcmVzcyAyVSAqLworI2RlZmluZSBDRUNfT1dOX0FERFJFU1NfMyAgICAgICAgICAgICAgKCh1aW50MTZfdCkgMHgwMDA4VSkgICAvKiBMb2dpY2FsIEFkZHJlc3MgM1UgKi8KKyNkZWZpbmUgQ0VDX09XTl9BRERSRVNTXzQgICAgICAgICAgICAgICgodWludDE2X3QpIDB4MDAxMFUpICAgLyogTG9naWNhbCBBZGRyZXNzIDRVICovCisjZGVmaW5lIENFQ19PV05fQUREUkVTU181ICAgICAgICAgICAgICAoKHVpbnQxNl90KSAweDAwMjBVKSAgIC8qIExvZ2ljYWwgQWRkcmVzcyA1VSAqLworI2RlZmluZSBDRUNfT1dOX0FERFJFU1NfNiAgICAgICAgICAgICAgKCh1aW50MTZfdCkgMHgwMDQwVSkgICAvKiBMb2dpY2FsIEFkZHJlc3MgNlUgKi8KKyNkZWZpbmUgQ0VDX09XTl9BRERSRVNTXzcgICAgICAgICAgICAgICgodWludDE2X3QpIDB4MDA4MFUpICAgLyogTG9naWNhbCBBZGRyZXNzIDdVICovCisjZGVmaW5lIENFQ19PV05fQUREUkVTU184ICAgICAgICAgICAgICAoKHVpbnQxNl90KSAweDAxMDBVKSAgIC8qIExvZ2ljYWwgQWRkcmVzcyA5VSAqLworI2RlZmluZSBDRUNfT1dOX0FERFJFU1NfOSAgICAgICAgICAgICAgKCh1aW50MTZfdCkgMHgwMjAwVSkgICAvKiBMb2dpY2FsIEFkZHJlc3MgMTBVICovCisjZGVmaW5lIENFQ19PV05fQUREUkVTU18xMCAgICAgICAgICAgICAoKHVpbnQxNl90KSAweDA0MDBVKSAgIC8qIExvZ2ljYWwgQWRkcmVzcyAxMVUgKi8KKyNkZWZpbmUgQ0VDX09XTl9BRERSRVNTXzExICAgICAgICAgICAgICgodWludDE2X3QpIDB4MDgwMFUpICAgLyogTG9naWNhbCBBZGRyZXNzIDEyVSAqLworI2RlZmluZSBDRUNfT1dOX0FERFJFU1NfMTIgICAgICAgICAgICAgKCh1aW50MTZfdCkgMHgxMDAwVSkgICAvKiBMb2dpY2FsIEFkZHJlc3MgMTNVICovCisjZGVmaW5lIENFQ19PV05fQUREUkVTU18xMyAgICAgICAgICAgICAoKHVpbnQxNl90KSAweDIwMDBVKSAgIC8qIExvZ2ljYWwgQWRkcmVzcyAxNFUgKi8KKyNkZWZpbmUgQ0VDX09XTl9BRERSRVNTXzE0ICAgICAgICAgICAgICgodWludDE2X3QpIDB4NDAwMFUpICAgLyogTG9naWNhbCBBZGRyZXNzIDE1VSAqLworLyoqCisgICogQH0KKyAgKi8KKyAgICAKKy8qKiBAZGVmZ3JvdXAgQ0VDX0ludGVycnVwdHNfRGVmaW5pdGlvbnMgIENFQyBJbnRlcnJ1cHRzIGRlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBDRUNfSVRfVFhBQ0tFICAgICAgICAgICAgICAgICAgIENFQ19JRVJfVFhBQ0tFSUUKKyNkZWZpbmUgQ0VDX0lUX1RYRVJSICAgICAgICAgICAgICAgICAgICBDRUNfSUVSX1RYRVJSSUUKKyNkZWZpbmUgQ0VDX0lUX1RYVURSICAgICAgICAgICAgICAgICAgICBDRUNfSUVSX1RYVURSSUUKKyNkZWZpbmUgQ0VDX0lUX1RYRU5EICAgICAgICAgICAgICAgICAgICBDRUNfSUVSX1RYRU5ESUUKKyNkZWZpbmUgQ0VDX0lUX1RYQlIgICAgICAgICAgICAgICAgICAgICBDRUNfSUVSX1RYQlJJRQorI2RlZmluZSBDRUNfSVRfQVJCTFNUICAgICAgICAgICAgICAgICAgIENFQ19JRVJfQVJCTFNUSUUKKyNkZWZpbmUgQ0VDX0lUX1JYQUNLRSAgICAgICAgICAgICAgICAgICBDRUNfSUVSX1JYQUNLRUlFCisjZGVmaW5lIENFQ19JVF9MQlBFICAgICAgICAgICAgICAgICAgICAgQ0VDX0lFUl9MQlBFSUUKKyNkZWZpbmUgQ0VDX0lUX1NCUEUgICAgICAgICAgICAgICAgICAgICBDRUNfSUVSX1NCUEVJRQorI2RlZmluZSBDRUNfSVRfQlJFICAgICAgICAgICAgICAgICAgICAgIENFQ19JRVJfQlJFSUUKKyNkZWZpbmUgQ0VDX0lUX1JYT1ZSICAgICAgICAgICAgICAgICAgICBDRUNfSUVSX1JYT1ZSSUUKKyNkZWZpbmUgQ0VDX0lUX1JYRU5EICAgICAgICAgICAgICAgICAgICBDRUNfSUVSX1JYRU5ESUUKKyNkZWZpbmUgQ0VDX0lUX1JYQlIgICAgICAgICAgICAgICAgICAgICBDRUNfSUVSX1JYQlJJRQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDRUNfRmxhZ3NfRGVmaW5pdGlvbnMgIENFQyBGbGFncyBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ0VDX0ZMQUdfVFhBQ0tFICAgICAgICAgICAgICAgICBDRUNfSVNSX1RYQUNLRQorI2RlZmluZSBDRUNfRkxBR19UWEVSUiAgICAgICAgICAgICAgICAgIENFQ19JU1JfVFhFUlIKKyNkZWZpbmUgQ0VDX0ZMQUdfVFhVRFIgICAgICAgICAgICAgICAgICBDRUNfSVNSX1RYVURSCisjZGVmaW5lIENFQ19GTEFHX1RYRU5EICAgICAgICAgICAgICAgICAgQ0VDX0lTUl9UWEVORAorI2RlZmluZSBDRUNfRkxBR19UWEJSICAgICAgICAgICAgICAgICAgIENFQ19JU1JfVFhCUgorI2RlZmluZSBDRUNfRkxBR19BUkJMU1QgICAgICAgICAgICAgICAgIENFQ19JU1JfQVJCTFNUCisjZGVmaW5lIENFQ19GTEFHX1JYQUNLRSAgICAgICAgICAgICAgICAgQ0VDX0lTUl9SWEFDS0UKKyNkZWZpbmUgQ0VDX0ZMQUdfTEJQRSAgICAgICAgICAgICAgICAgICBDRUNfSVNSX0xCUEUKKyNkZWZpbmUgQ0VDX0ZMQUdfU0JQRSAgICAgICAgICAgICAgICAgICBDRUNfSVNSX1NCUEUKKyNkZWZpbmUgQ0VDX0ZMQUdfQlJFICAgICAgICAgICAgICAgICAgICBDRUNfSVNSX0JSRQorI2RlZmluZSBDRUNfRkxBR19SWE9WUiAgICAgICAgICAgICAgICAgIENFQ19JU1JfUlhPVlIKKyNkZWZpbmUgQ0VDX0ZMQUdfUlhFTkQgICAgICAgICAgICAgICAgICBDRUNfSVNSX1JYRU5ECisjZGVmaW5lIENFQ19GTEFHX1JYQlIgICAgICAgICAgICAgICAgICAgQ0VDX0lTUl9SWEJSCisvKioKKyAgKiBAfQorICAqLworICAKKy8qKiBAZGVmZ3JvdXAgQ0VDX0FMTF9FUlJPUiBDRUMgYWxsIFJYIG9yIFRYIGVycm9ycyBmbGFncyAKKyAgKiBAeworICAqLworI2RlZmluZSBDRUNfSVNSX0FMTF9FUlJPUiAgICAgICAgICAgICAgKCh1aW50MzJfdClDRUNfSVNSX1JYT1ZSfENFQ19JU1JfQlJFfENFQ19JU1JfU0JQRXxDRUNfSVNSX0xCUEV8Q0VDX0lTUl9SWEFDS0V8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRUNfSVNSX0FSQkxTVHxDRUNfSVNSX1RYVURSfENFQ19JU1JfVFhFUlJ8Q0VDX0lTUl9UWEFDS0UpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENFQ19JRVJfQUxMX1JYIENFQyBhbGwgUlggZXJyb3JzIGludGVycnVwdHMgZW5hYmxpbmcgZmxhZyAKKyAgKiBAeworICAqLworI2RlZmluZSBDRUNfSUVSX1JYX0FMTF9FUlIgICAgICAgICAgICAgICgodWludDMyX3QpQ0VDX0lFUl9SWEFDS0VJRXxDRUNfSUVSX0xCUEVJRXxDRUNfSUVSX1NCUEVJRXxDRUNfSUVSX0JSRUlFfENFQ19JRVJfUlhPVlJJRSkKKy8qKgorICAqIEB9CisgICovCisgIAorLyoqIEBkZWZncm91cCBDRUNfSUVSX0FMTF9UWCBDRUMgYWxsIFRYIGVycm9ycyBpbnRlcnJ1cHRzIGVuYWJsaW5nIGZsYWcgCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ0VDX0lFUl9UWF9BTExfRVJSICAgICAgICAgICAgICAoKHVpbnQzMl90KUNFQ19JRVJfVFhBQ0tFSUV8Q0VDX0lFUl9UWEVSUklFfENFQ19JRVJfVFhVRFJJRXxDRUNfSUVSX0FSQkxTVElFKQorLyoqCisgICogQH0KKyAgKi8KKyAgCisvKioKKyAgKiBAfQorICAqLyAgCisgIAorLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ0VDX0V4cG9ydGVkX01hY3JvcyBDRUMgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgUmVzZXQgQ0VDIGhhbmRsZSBnc3RhdGUgJiBSeFN0YXRlCisgICogQHBhcmFtICBfX0hBTkRMRV9fIENFQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NFQ19SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+Z1N0YXRlID0gSEFMX0NFQ19TVEFURV9SRVNFVDsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlJ4U3RhdGUgPSBIQUxfQ0VDX1NUQVRFX1JFU0VUOyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisKKy8qKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIENFQyBpbnRlcnJ1cHQgZmxhZyBpcyBzZXQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgQ0VDIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0ZMQUdfVFhBQ0tFOiBUeCBNaXNzaW5nIGFja25vd2xlZGdlIEVycm9yCisgICogICAgICAgICAgICBAYXJnIENFQ19GTEFHX1RYRVJSOiBUeCBFcnJvci4KKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0ZMQUdfVFhVRFI6IFR4LUJ1ZmZlciBVbmRlcnJ1bi4KKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0ZMQUdfVFhFTkQ6IEVuZCBvZiB0cmFuc21pc3Npb24gKHN1Y2Nlc3NmdWwgdHJhbnNtaXNzaW9uIG9mIHRoZSBsYXN0IGJ5dGUpLgorICAqICAgICAgICAgICAgQGFyZyBDRUNfRkxBR19UWEJSOiBUeC1CeXRlIFJlcXVlc3QuCisgICogICAgICAgICAgICBAYXJnIENFQ19GTEFHX0FSQkxTVDogQXJiaXRyYXRpb24gTG9zdAorICAqICAgICAgICAgICAgQGFyZyBDRUNfRkxBR19SWEFDS0U6IFJ4LU1pc3NpbmcgQWNrbm93bGVkZ2UgCisgICogICAgICAgICAgICBAYXJnIENFQ19GTEFHX0xCUEU6IFJ4IExvbmcgcGVyaW9kIEVycm9yCisgICogICAgICAgICAgICBAYXJnIENFQ19GTEFHX1NCUEU6IFJ4IFNob3J0IHBlcmlvZCBFcnJvcgorICAqICAgICAgICAgICAgQGFyZyBDRUNfRkxBR19CUkU6IFJ4IEJpdCBSaXNpbmcgRXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0ZMQUdfUlhPVlI6IFJ4IE92ZXJydW4uCisgICogICAgICAgICAgICBAYXJnIENFQ19GTEFHX1JYRU5EOiBFbmQgT2YgUmVjZXB0aW9uLgorICAqICAgICAgICAgICAgQGFyZyBDRUNfRkxBR19SWEJSOiBSeC1CeXRlIFJlY2VpdmVkLiAgICAgIAorICAqIEByZXR2YWwgSVRTdGF0dXMKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ0VDX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmIChfX0ZMQUdfXykpIAorCisvKiogQGJyaWVmICBDbGVhcnMgdGhlIGludGVycnVwdCBvciBzdGF0dXMgZmxhZyB3aGVuIHJhaXNlZCAod3JpdGUgYXQgMVUpCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgQ0VDIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0L3N0YXR1cyBmbGFnIHRvIGNsZWFyLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBDRUNfRkxBR19UWEFDS0U6IFR4IE1pc3NpbmcgYWNrbm93bGVkZ2UgRXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0ZMQUdfVFhFUlI6IFR4IEVycm9yLgorICAqICAgICAgICAgICAgQGFyZyBDRUNfRkxBR19UWFVEUjogVHgtQnVmZmVyIFVuZGVycnVuLgorICAqICAgICAgICAgICAgQGFyZyBDRUNfRkxBR19UWEVORDogRW5kIG9mIHRyYW5zbWlzc2lvbiAoc3VjY2Vzc2Z1bCB0cmFuc21pc3Npb24gb2YgdGhlIGxhc3QgYnl0ZSkuCisgICogICAgICAgICAgICBAYXJnIENFQ19GTEFHX1RYQlI6IFR4LUJ5dGUgUmVxdWVzdC4KKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0ZMQUdfQVJCTFNUOiBBcmJpdHJhdGlvbiBMb3N0CisgICogICAgICAgICAgICBAYXJnIENFQ19GTEFHX1JYQUNLRTogUngtTWlzc2luZyBBY2tub3dsZWRnZSAKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0ZMQUdfTEJQRTogUnggTG9uZyBwZXJpb2QgRXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0ZMQUdfU0JQRTogUnggU2hvcnQgcGVyaW9kIEVycm9yCisgICogICAgICAgICAgICBAYXJnIENFQ19GTEFHX0JSRTogUnggQml0IFJpc2luZyBFcnJvcgorICAqICAgICAgICAgICAgQGFyZyBDRUNfRkxBR19SWE9WUjogUnggT3ZlcnJ1bi4KKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0ZMQUdfUlhFTkQ6IEVuZCBPZiBSZWNlcHRpb24uCisgICogICAgICAgICAgICBAYXJnIENFQ19GTEFHX1JYQlI6IFJ4LUJ5dGUgUmVjZWl2ZWQuIAorICAqIEByZXR2YWwgbm9uZSAgCisgICovCisjZGVmaW5lIF9fSEFMX0NFQ19DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgfD0gKF9fRkxBR19fKSkgCisKKy8qKiBAYnJpZWYgIEVuYWJsZXMgdGhlIHNwZWNpZmllZCBDRUMgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIENFQyBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgQ0VDIGludGVycnVwdCB0byBlbmFibGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0lUX1RYQUNLRTogVHggTWlzc2luZyBhY2tub3dsZWRnZSBFcnJvciBJVCBFbmFibGUgCisgICogICAgICAgICAgICBAYXJnIENFQ19JVF9UWEVSUjogVHggRXJyb3IgSVQgRW5hYmxlIAorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfVFhVRFI6IFR4LUJ1ZmZlciBVbmRlcnJ1biBJVCBFbmFibGUgCisgICogICAgICAgICAgICBAYXJnIENFQ19JVF9UWEVORDogRW5kIG9mIHRyYW5zbWlzc2lvbiBJVCBFbmFibGUgCisgICogICAgICAgICAgICBAYXJnIENFQ19JVF9UWEJSOiBUeC1CeXRlIFJlcXVlc3QgSVQgRW5hYmxlIAorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfQVJCTFNUOiBBcmJpdHJhdGlvbiBMb3N0IElUIEVuYWJsZSAKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0lUX1JYQUNLRTogUngtTWlzc2luZyBBY2tub3dsZWRnZSBJVCBFbmFibGUgCisgICogICAgICAgICAgICBAYXJnIENFQ19JVF9MQlBFOiBSeCBMb25nIHBlcmlvZCBFcnJvciBJVCBFbmFibGUgCisgICogICAgICAgICAgICBAYXJnIENFQ19JVF9TQlBFOiBSeCBTaG9ydCBwZXJpb2QgRXJyb3IgSVQgRW5hYmxlIAorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfQlJFOiBSeCBCaXQgUmlzaW5nIEVycm9yIElUIEVuYWJsZSAKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0lUX1JYT1ZSOiBSeCBPdmVycnVuIElUIEVuYWJsZSAKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0lUX1JYRU5EOiBFbmQgT2YgUmVjZXB0aW9uIElUIEVuYWJsZSAKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0lUX1JYQlI6IFJ4LUJ5dGUgUmVjZWl2ZWQgSVQgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgKiBAcmV0dmFsIG5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ0VDX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklFUiB8PSAoX19JTlRFUlJVUFRfXykpICAKKworLyoqIEBicmllZiAgRGlzYWJsZXMgdGhlIHNwZWNpZmllZCBDRUMgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIENFQyBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgQ0VDIGludGVycnVwdCB0byBkaXNhYmxlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIENFQ19JVF9UWEFDS0U6IFR4IE1pc3NpbmcgYWNrbm93bGVkZ2UgRXJyb3IgSVQgRW5hYmxlIAorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfVFhFUlI6IFR4IEVycm9yIElUIEVuYWJsZSAKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0lUX1RYVURSOiBUeC1CdWZmZXIgVW5kZXJydW4gSVQgRW5hYmxlIAorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfVFhFTkQ6IEVuZCBvZiB0cmFuc21pc3Npb24gSVQgRW5hYmxlIAorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfVFhCUjogVHgtQnl0ZSBSZXF1ZXN0IElUIEVuYWJsZSAKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0lUX0FSQkxTVDogQXJiaXRyYXRpb24gTG9zdCBJVCBFbmFibGUgCisgICogICAgICAgICAgICBAYXJnIENFQ19JVF9SWEFDS0U6IFJ4LU1pc3NpbmcgQWNrbm93bGVkZ2UgSVQgRW5hYmxlIAorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfTEJQRTogUnggTG9uZyBwZXJpb2QgRXJyb3IgSVQgRW5hYmxlIAorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfU0JQRTogUnggU2hvcnQgcGVyaW9kIEVycm9yIElUIEVuYWJsZSAKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0lUX0JSRTogUnggQml0IFJpc2luZyBFcnJvciBJVCBFbmFibGUgCisgICogICAgICAgICAgICBAYXJnIENFQ19JVF9SWE9WUjogUnggT3ZlcnJ1biBJVCBFbmFibGUgCisgICogICAgICAgICAgICBAYXJnIENFQ19JVF9SWEVORDogRW5kIE9mIFJlY2VwdGlvbiBJVCBFbmFibGUgCisgICogICAgICAgICAgICBAYXJnIENFQ19JVF9SWEJSOiBSeC1CeXRlIFJlY2VpdmVkIElUIEVuYWJsZSAgICAgICAgICAgICAgICAgICAKKyAgKiBAcmV0dmFsIG5vbmUKKyAgKi8gICAKKyNkZWZpbmUgX19IQUxfQ0VDX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklFUiAmPSAofihfX0lOVEVSUlVQVF9fKSkpICAKKworLyoqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBzcGVjaWZpZWQgQ0VDIGludGVycnVwdCBpcyBlbmFibGVkLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIENFQyBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgQ0VDIGludGVycnVwdCB0byBjaGVjay4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfVFhBQ0tFOiBUeCBNaXNzaW5nIGFja25vd2xlZGdlIEVycm9yIElUIEVuYWJsZSAKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0lUX1RYRVJSOiBUeCBFcnJvciBJVCBFbmFibGUgCisgICogICAgICAgICAgICBAYXJnIENFQ19JVF9UWFVEUjogVHgtQnVmZmVyIFVuZGVycnVuIElUIEVuYWJsZSAKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0lUX1RYRU5EOiBFbmQgb2YgdHJhbnNtaXNzaW9uIElUIEVuYWJsZSAKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0lUX1RYQlI6IFR4LUJ5dGUgUmVxdWVzdCBJVCBFbmFibGUgCisgICogICAgICAgICAgICBAYXJnIENFQ19JVF9BUkJMU1Q6IEFyYml0cmF0aW9uIExvc3QgSVQgRW5hYmxlIAorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfUlhBQ0tFOiBSeC1NaXNzaW5nIEFja25vd2xlZGdlIElUIEVuYWJsZSAKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0lUX0xCUEU6IFJ4IExvbmcgcGVyaW9kIEVycm9yIElUIEVuYWJsZSAKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0lUX1NCUEU6IFJ4IFNob3J0IHBlcmlvZCBFcnJvciBJVCBFbmFibGUgCisgICogICAgICAgICAgICBAYXJnIENFQ19JVF9CUkU6IFJ4IEJpdCBSaXNpbmcgRXJyb3IgSVQgRW5hYmxlIAorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfUlhPVlI6IFJ4IE92ZXJydW4gSVQgRW5hYmxlIAorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfUlhFTkQ6IEVuZCBPZiBSZWNlcHRpb24gSVQgRW5hYmxlIAorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfUlhCUjogUngtQnl0ZSBSZWNlaXZlZCBJVCBFbmFibGUgICAgICAgICAgICAgICAgICAKKyAgKiBAcmV0dmFsIEZsYWdTdGF0dXMgIAorICAqLworI2RlZmluZSBfX0hBTF9DRUNfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUVSICYgKF9fSU5URVJSVVBUX18pKQorCisvKiogQGJyaWVmICBFbmFibGVzIHRoZSBDRUMgZGV2aWNlCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgQ0VDIEhhbmRsZS4gICAgICAgICAgICAgICAKKyAgKiBAcmV0dmFsIG5vbmUgCisgICovCisjZGVmaW5lIF9fSEFMX0NFQ19FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9ICBDRUNfQ1JfQ0VDRU4pCisKKy8qKiBAYnJpZWYgIERpc2FibGVzIHRoZSBDRUMgZGV2aWNlCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgQ0VDIEhhbmRsZS4gICAgICAgICAgICAgICAKKyAgKiBAcmV0dmFsIG5vbmUgCisgICovCisjZGVmaW5lIF9fSEFMX0NFQ19ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9ICB+Q0VDX0NSX0NFQ0VOKQorCisvKiogQGJyaWVmICBTZXQgVHJhbnNtaXNzaW9uIFN0YXJ0IGZsYWcKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBDRUMgSGFuZGxlLiAgICAgICAgICAgICAgIAorICAqIEByZXR2YWwgbm9uZSAKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ0VDX0ZJUlNUX0JZVEVfVFhfU0VUKF9fSEFORExFX18pICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gIENFQ19DUl9UWFNPTSkKKworLyoqIEBicmllZiAgU2V0IFRyYW5zbWlzc2lvbiBFbmQgZmxhZworICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIENFQyBIYW5kbGUuICAgICAgICAgICAgICAgCisgICogQHJldHZhbCBub25lIAorICAqIElmIHRoZSBDRUMgbWVzc2FnZSBjb25zaXN0cyBvZiBvbmx5IG9uZSBieXRlLCBUWEVPTSBtdXN0IGJlIHNldCBiZWZvcmUgb2YgVFhTT00uICAKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ0VDX0xBU1RfQllURV9UWF9TRVQoX19IQU5ETEVfXykgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gIENFQ19DUl9UWEVPTSkKKworLyoqIEBicmllZiAgR2V0IFRyYW5zbWlzc2lvbiBTdGFydCBmbGFnCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgQ0VDIEhhbmRsZS4gICAgICAgICAgICAgICAKKyAgKiBAcmV0dmFsIEZsYWdTdGF0dXMgCisgICovCisjZGVmaW5lIF9fSEFMX0NFQ19HRVRfVFJBTlNNSVNTSU9OX1NUQVJUX0ZMQUcoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICYgQ0VDX0NSX1RYU09NKQorCisvKiogQGJyaWVmICBHZXQgVHJhbnNtaXNzaW9uIEVuZCBmbGFnCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgQ0VDIEhhbmRsZS4gICAgICAgICAgICAgICAKKyAgKiBAcmV0dmFsIEZsYWdTdGF0dXMgCisgICovCisjZGVmaW5lIF9fSEFMX0NFQ19HRVRfVFJBTlNNSVNTSU9OX0VORF9GTEFHKF9fSEFORExFX18pICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICYgQ0VDX0NSX1RYRU9NKSAgIAorCisvKiogQGJyaWVmICBDbGVhciBPQVIgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBDRUMgSGFuZGxlLiAgICAgICAgICAgICAgIAorICAqIEByZXR2YWwgbm9uZSAKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ0VDX0NMRUFSX09BUihfX0hBTkRMRV9fKSAgIENMRUFSX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DRkdSLCBDRUNfQ0ZHUl9PQVIpCisKKy8qKiBAYnJpZWYgIFNldCBPQVIgcmVnaXN0ZXIgKHdpdGhvdXQgcmVzZXR0aW5nIHByZXZpb3VzbHkgc2V0IGFkZHJlc3MgaW4gY2FzZSBvZiBtdWx0aS1hZGRyZXNzIG1vZGUpCisgICogICAgICAgICAgVG8gcmVzZXQgT0FSLCBfX0hBTF9DRUNfQ0xFQVJfT0FSKCkgbmVlZHMgdG8gYmUgY2FsbGVkIGJlZm9yZWhhbmQKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBDRUMgSGFuZGxlLiAKKyAgKiBAcGFyYW0gIF9fQUREUkVTU19fIE93biBBZGRyZXNzIHZhbHVlIChDRUMgbG9naWNhbCBhZGRyZXNzIGlzIGlkZW50aWZpZWQgYnkgYml0IHBvc2l0aW9uKSAgICAgICAgICAgICAgICAgICAKKyAgKiBAcmV0dmFsIG5vbmUgCisgICovCisjZGVmaW5lIF9fSEFMX0NFQ19TRVRfT0FSKF9fSEFORExFX18sX19BRERSRVNTX18pICAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DRkdSLCAoX19BRERSRVNTX18pPDwgQ0VDX0NGR1JfT0FSX0xTQl9QT1MpCisKKy8qKgorICAqIEB9CisgICovICAgICAgICAgICAgICAgICAgICAgICAKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBDRUNfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIENFQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgICogQHsKKyAgKi8KKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ0VDX0luaXQoQ0VDX0hhbmRsZVR5cGVEZWYgKmhjZWMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NFQ19EZUluaXQoQ0VDX0hhbmRsZVR5cGVEZWYgKmhjZWMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NFQ19TZXREZXZpY2VBZGRyZXNzKENFQ19IYW5kbGVUeXBlRGVmICpoY2VjLCB1aW50MTZfdCBDRUNfT3duQWRkcmVzcyk7Cit2b2lkIEhBTF9DRUNfTXNwSW5pdChDRUNfSGFuZGxlVHlwZURlZiAqaGNlYyk7Cit2b2lkIEhBTF9DRUNfTXNwRGVJbml0KENFQ19IYW5kbGVUeXBlRGVmICpoY2VjKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBDRUNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICAqIEB7CisgICovCisvKiBJL08gb3BlcmF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NFQ19UcmFuc21pdF9JVChDRUNfSGFuZGxlVHlwZURlZiAqaGNlYywgdWludDhfdCBJbml0aWF0b3JBZGRyZXNzLHVpbnQ4X3QgRGVzdGluYXRpb25BZGRyZXNzLCB1aW50OF90ICpwRGF0YSwgdWludDMyX3QgU2l6ZSk7Cit1aW50MzJfdCBIQUxfQ0VDX0dldExhc3RSZWNlaXZlZEZyYW1lU2l6ZShDRUNfSGFuZGxlVHlwZURlZiAqaGNlYyk7Cit2b2lkIEhBTF9DRUNfQ2hhbmdlUnhCdWZmZXIoQ0VDX0hhbmRsZVR5cGVEZWYgKmhjZWMsIHVpbnQ4X3QqIFJ4YnVmZmVyKTsKK3ZvaWQgSEFMX0NFQ19JUlFIYW5kbGVyKENFQ19IYW5kbGVUeXBlRGVmICpoY2VjKTsKK3ZvaWQgSEFMX0NFQ19UeENwbHRDYWxsYmFjayhDRUNfSGFuZGxlVHlwZURlZiAqaGNlYyk7Cit2b2lkIEhBTF9DRUNfUnhDcGx0Q2FsbGJhY2soQ0VDX0hhbmRsZVR5cGVEZWYgKmhjZWMsIHVpbnQzMl90IFJ4RnJhbWVTaXplKTsKK3ZvaWQgSEFMX0NFQ19FcnJvckNhbGxiYWNrKENFQ19IYW5kbGVUeXBlRGVmICpoY2VjKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBDRUNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMworICAqIEB7CisgICovCisvKiBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX0NFQ19TdGF0ZVR5cGVEZWYgSEFMX0NFQ19HZXRTdGF0ZShDRUNfSGFuZGxlVHlwZURlZiAqaGNlYyk7Cit1aW50MzJfdCBIQUxfQ0VDX0dldEVycm9yKENFQ19IYW5kbGVUeXBlRGVmICpoY2VjKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisgIAorLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ0VDX1ByaXZhdGVfVHlwZXMgQ0VDIFByaXZhdGUgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLyAKKworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ0VDX1ByaXZhdGVfVmFyaWFibGVzIENFQyBQcml2YXRlIFZhcmlhYmxlcworICAqIEB7CisgICovCisgIAorLyoqCisgICogQH0KKyAgKi8gCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENFQ19Qcml2YXRlX0NvbnN0YW50cyBDRUMgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLyAKKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ0VDX1ByaXZhdGVfTWFjcm9zIENFQyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisgIAorI2RlZmluZSBJU19DRUNfU0lHTkFMRlJFRVRJTUUoX19TRlRfXykgICAgICgoX19TRlRfXykgPD0gQ0VDX0NGR1JfU0ZUKSAgCisKKyNkZWZpbmUgSVNfQ0VDX1RPTEVSQU5DRShfX1JYVE9MX18pICAgICAgICAoKChfX1JYVE9MX18pID09IENFQ19TVEFOREFSRF9UT0xFUkFOQ0UpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JYVE9MX18pID09IENFQ19FWFRFTkRFRF9UT0xFUkFOQ0UpKQorCisjZGVmaW5lIElTX0NFQ19CUkVSWFNUT1AoX19CUkVSWFNUT1BfXykgICAoKChfX0JSRVJYU1RPUF9fKSA9PSBDRUNfTk9fUlhfU1RPUF9PTl9CUkUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQlJFUlhTVE9QX18pID09IENFQ19SWF9TVE9QX09OX0JSRSkpCisKKyNkZWZpbmUgSVNfQ0VDX0JSRUVSUk9SQklUR0VOKF9fRVJST1JCSVRHRU5fXykgKCgoX19FUlJPUkJJVEdFTl9fKSA9PSBDRUNfQlJFX0VSUk9SQklUX05PX0dFTkVSQVRJT04pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FUlJPUkJJVEdFTl9fKSA9PSBDRUNfQlJFX0VSUk9SQklUX0dFTkVSQVRJT04pKQorCisjZGVmaW5lIElTX0NFQ19MQlBFRVJST1JCSVRHRU4oX19FUlJPUkJJVEdFTl9fKSAoKChfX0VSUk9SQklUR0VOX18pID09IENFQ19MQlBFX0VSUk9SQklUX05PX0dFTkVSQVRJT04pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVJST1JCSVRHRU5fXykgPT0gQ0VDX0xCUEVfRVJST1JCSVRfR0VORVJBVElPTikpCisKKyNkZWZpbmUgSVNfQ0VDX0JST0FEQ0FTVEVSUk9SX05PX0VSUk9SQklUX0dFTkVSQVRJT04oX19FUlJPUkJJVEdFTl9fKSAoKChfX0VSUk9SQklUR0VOX18pID09IENFQ19CUk9BRENBU1RFUlJPUl9FUlJPUkJJVF9HRU5FUkFUSU9OKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FUlJPUkJJVEdFTl9fKSA9PSBDRUNfQlJPQURDQVNURVJST1JfTk9fRVJST1JCSVRfR0VORVJBVElPTikpCisKKyNkZWZpbmUgSVNfQ0VDX1NGVE9QKF9fU0ZUT1BfXykgICAgICAgICAgKCgoX19TRlRPUF9fKSA9PSBDRUNfU0ZUX1NUQVJUX09OX1RYU09NKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0ZUT1BfXykgPT0gQ0VDX1NGVF9TVEFSVF9PTl9UWF9SWF9FTkQpKQorCisjZGVmaW5lIElTX0NFQ19MSVNURU5JTkdfTU9ERShfX01PREVfXykgICAgICgoKF9fTU9ERV9fKSA9PSBDRUNfUkVEVUNFRF9MSVNURU5JTkdfTU9ERSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gQ0VDX0ZVTExfTElTVEVOSU5HX01PREUpKQorCisvKiogQGJyaWVmIENoZWNrIENFQyBtZXNzYWdlIHNpemUuCisgICogICAgICAgVGhlIG1lc3NhZ2Ugc2l6ZSBpcyB0aGUgcGF5bG9hZCBzaXplOiB3aXRob3V0IGNvdW50aW5nIHRoZSBoZWFkZXIsIAorICAqICAgICAgIGl0IHZhcmllcyBmcm9tIDAgYnl0ZSAocGluZyBvcGVyYXRpb24sIG9uZSBoZWFkZXIgb25seSwgbm8gcGF5bG9hZCkgdG8gCisgICogICAgICAgMTUgYnl0ZXMgKDEgb3Bjb2RlIGFuZCB1cCB0byAxNCBvcGVyYW5kcyBmb2xsb3dpbmcgdGhlIGhlYWRlcikuIAorICAqIEBwYXJhbSAgX19TSVpFX18gQ0VDIG1lc3NhZ2Ugc2l6ZS4gICAgICAgICAgICAgICAKKyAgKiBAcmV0dmFsIFRlc3QgcmVzdWx0IChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgSVNfQ0VDX01TR1NJWkUoX19TSVpFX18pICgoX19TSVpFX18pIDw9IDB4MTBVKSAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisvKiogQGJyaWVmIENoZWNrIENFQyBkZXZpY2UgT3duIEFkZHJlc3MgUmVnaXN0ZXIgKE9BUikgc2V0dGluZy4KKyAgKiAgICAgICAgT0FSIGFkZHJlc3MgaXMgd3JpdHRlbiBpbiBhIDE1LWJpdCBmaWVsZCB3aXRoaW4gQ0VDX0NGR1IgcmVnaXN0ZXIuIAorICAqIEBwYXJhbSAgX19BRERSRVNTX18gQ0VDIG93biBhZGRyZXNzLiAgICAgICAgICAgICAgIAorICAqIEByZXR2YWwgVGVzdCByZXN1bHQgKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBJU19DRUNfT1dOX0FERFJFU1MoX19BRERSRVNTX18pICgoX19BRERSRVNTX18pIDw9IDB4N0ZGRlUpCisKKy8qKiBAYnJpZWYgQ2hlY2sgQ0VDIGluaXRpYXRvciBvciBkZXN0aW5hdGlvbiBsb2dpY2FsIGFkZHJlc3Mgc2V0dGluZy4KKyAgKiAgICAgICAgSW5pdGlhdG9yIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMgYXJlIGNvZGVkIG92ZXIgNCBiaXRzLiAKKyAgKiBAcGFyYW0gIF9fQUREUkVTU19fIENFQyBpbml0aWF0b3Igb3IgbG9naWNhbCBhZGRyZXNzLiAgICAgICAgICAgICAgIAorICAqIEByZXR2YWwgVGVzdCByZXN1bHQgKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBJU19DRUNfQUREUkVTUyhfX0FERFJFU1NfXykgKChfX0FERFJFU1NfXykgPD0gMHgwRlUpIAorLyoqCisgICogQH0KKyAgKi8KKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENFQ19Qcml2YXRlX0Z1bmN0aW9ucyBDRUMgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworICAKKy8qKgorICAqIEB9CisgICovCisgIAorLyoqCisgICogQH0KKyAgKi8gCisKKy8qKgorICAqIEB9CisgICovIAorICAKKyNlbmRpZiAvKiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KSAqLworICAKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyRjN4eF9IQUxfQ0VDX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KKwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjN4eF9oYWxfY29tcC5oIGIvSW5jL3N0bTMyZjN4eF9oYWxfY29tcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZTZiNGUKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2hhbF9jb21wLmgKQEAgLTAsMCArMSwyOTIgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX2NvbXAuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgQ09NUCBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkYzeHhfSEFMX0NPTVBfSAorI2RlZmluZSBfX1NUTTMyRjN4eF9IQUxfQ09NUF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgQ09NUAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENPTVBfRXhwb3J0ZWRfVHlwZXMgQ09NUCBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIENPTVAgSW5pdCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKworICB1aW50MzJfdCBJbnZlcnRpbmdJbnB1dDsgICAgIC8qITwgU2VsZWN0cyB0aGUgaW52ZXJ0aW5nIGlucHV0IG9mIHRoZSBjb21wYXJhdG9yLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QRXhfSW52ZXJ0aW5nSW5wdXQgKi8KKworICB1aW50MzJfdCBOb25JbnZlcnRpbmdJbnB1dDsgIC8qITwgU2VsZWN0cyB0aGUgbm9uIGludmVydGluZyBpbnB1dCBvZiB0aGUgY29tcGFyYXRvci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09NUEV4X05vbkludmVydGluZ0lucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBPbmx5IGF2YWlsYWJsZSBvbiBTVE0zMkYzMDJ4Qi94QywgU1RNMzJGMzAzeEIveEMgYW5kIFNUTTMyRjM1OHh4IGRldmljZXMgKi8KKworICB1aW50MzJfdCBPdXRwdXQ7ICAgICAgICAgICAgIC8qITwgU2VsZWN0cyB0aGUgb3V0cHV0IHJlZGlyZWN0aW9uIG9mIHRoZSBjb21wYXJhdG9yLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QRXhfT3V0cHV0ICovCisKKyAgdWludDMyX3QgT3V0cHV0UG9sOyAgICAgICAgICAvKiE8IFNlbGVjdHMgdGhlIG91dHB1dCBwb2xhcml0eSBvZiB0aGUgY29tcGFyYXRvci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09NUF9PdXRwdXRQb2xhcml0eSAqLworCisgIHVpbnQzMl90IEh5c3RlcmVzaXM7ICAgICAgICAgLyohPCBTZWxlY3RzIHRoZSBoeXN0ZXJlc2lzIHZvbHRhZ2Ugb2YgdGhlIGNvbXBhcmF0b3IuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPTVBFeF9IeXN0ZXJlc2lzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBPbmx5IGF2YWlsYWJsZSBvbiBTVE0zMkYzMDJ4Qi94QywgU1RNMzJGMzAzeEIveEMsIFNUTTMyRjM3M3hCL3hDLCBTVE0zMkYzNTh4eCBhbmQgU1RNMzJGMzc4eHggZGV2aWNlcyAqLworCisgIHVpbnQzMl90IEJsYW5raW5nU3JjZTsgICAgICAgLyohPCBTZWxlY3RzIHRoZSBvdXRwdXQgYmxhbmtpbmcgc291cmNlIG9mIHRoZSBjb21wYXJhdG9yLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QRXhfQmxhbmtpbmdTcmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBOb3QgYXZhaWxhYmxlIG9uIFNUTTMyRjM3M3hCL0MgYW5kIFNUTTMyRjM3OHh4IGRldmljZXMgKi8KKworICB1aW50MzJfdCBNb2RlOyAgICAgICAgICAgICAgIC8qITwgU2VsZWN0cyB0aGUgb3BlcmF0aW5nIGNvbnN1bXB0aW9uIG1vZGUgb2YgdGhlIGNvbXBhcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFkanVzdCB0aGUgc3BlZWQvY29uc3VtcHRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPTVBFeF9Nb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBOb3QgYXZhaWxhYmxlIG9uIFNUTTMyRjMwMXg2L3g4LCBTVE0zMkYzMDJ4Ni94OCwgU1RNMzJGMzM0eDYveDgsIFNUTTMyRjMxOHh4IGFuZCBTVE0zMkYzMjh4eCBkZXZpY2VzICovCisKKyAgdWludDMyX3QgV2luZG93TW9kZTsgICAgICAgICAvKiE8IFNlbGVjdHMgdGhlIHdpbmRvdyBtb2RlIG9mIHRoZSBjb21wYXJhdG9yIFggKFg9MlUsIDQgb3IgNiBpZiBhdmFpbGFibGUpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QRXhfV2luZG93TW9kZSAqLworCisgIHVpbnQzMl90IFRyaWdnZXJNb2RlOyAgICAgICAgLyohPCBTZWxlY3RzIHRoZSB0cmlnZ2VyIG1vZGUgb2YgdGhlIGNvbXBhcmF0b3IgKGludGVycnVwdCBtb2RlKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09NUF9UcmlnZ2VyTW9kZSAqLworCit9IENPTVBfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIFN0YXRlIHN0cnVjdHVyZXMgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9DT01QX1NUQVRFX1JFU0VUICAgICAgICAgICAgID0gMHgwMFUsICAgIC8qITwgQ09NUCBub3QgeWV0IGluaXRpYWxpemVkIG9yIGRpc2FibGVkICAgICAgICAgICAgICovCisgIEhBTF9DT01QX1NUQVRFX1JFQURZICAgICAgICAgICAgID0gMHgwMVUsICAgIC8qITwgQ09NUCBpbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZSAgICAgICAgICAgICAgICovCisgIEhBTF9DT01QX1NUQVRFX1JFQURZX0xPQ0tFRCAgICAgID0gMHgxMVUsICAgIC8qITwgQ09NUCBpbml0aWFsaXplZCBidXQgdGhlIGNvbmZpZ3VyYXRpb24gaXMgbG9ja2VkICovCisgIEhBTF9DT01QX1NUQVRFX0JVU1kgICAgICAgICAgICAgID0gMHgwMlUsICAgIC8qITwgQ09NUCBpcyBydW5uaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEhBTF9DT01QX1NUQVRFX0JVU1lfTE9DS0VEICAgICAgID0gMHgxMiAgICAgLyohPCBDT01QIGlzIHJ1bm5pbmcgYW5kIHRoZSBjb25maWd1cmF0aW9uIGlzIGxvY2tlZCAgKi8KK30gSEFMX0NPTVBfU3RhdGVUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIENPTVAgSGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICBDT01QX1R5cGVEZWYgICAgICAgICAgICAgICAgKkluc3RhbmNlOyAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAgICAqLworICBDT01QX0luaXRUeXBlRGVmICAgICAgICAgICAgSW5pdDsgICAgICAvKiE8IENPTVAgcmVxdWlyZWQgcGFyYW1ldGVycyAqLworICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICAgICAgTG9jazsgICAgICAvKiE8IExvY2tpbmcgb2JqZWN0ICAgICAgICAgICAqLworICBfX0lPIEhBTF9DT01QX1N0YXRlVHlwZURlZiAgU3RhdGU7ICAgICAvKiE8IENPTVAgY29tbXVuaWNhdGlvbiBzdGF0ZSAqLworfSBDT01QX0hhbmRsZVR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENPTVBfRXhwb3J0ZWRfQ29uc3RhbnRzIENPTVAgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX091dHB1dFBvbGFyaXR5IENPTVAgT3V0cHV0IFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRQT0xfTk9OSU5WRVJURUQgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgLyohPCBDT01QIG91dHB1dCBvbiBHUElPIGlzbid0IGludmVydGVkICovCisjZGVmaW5lIENPTVBfT1VUUFVUUE9MX0lOVkVSVEVEICAgICAgICAgICAgICAgIENPTVBfQ1NSX0NPTVB4UE9MICAgICAgIC8qITwgQ09NUCBvdXRwdXQgb24gR1BJTyBpcyBpbnZlcnRlZCAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9PdXRwdXRMZXZlbCBDT01QIE91dHB1dCBMZXZlbAorICAqIEB7CisgICovCisvKiBXaGVuIG91dHB1dCBwb2xhcml0eSBpcyBub3QgaW52ZXJ0ZWQsIGNvbXBhcmF0b3Igb3V0cHV0IGlzIGxvdyB3aGVuCisgICB0aGUgbm9uLWludmVydGluZyBpbnB1dCBpcyBhdCBhIGxvd2VyIHZvbHRhZ2UgdGhhbiB0aGUgaW52ZXJ0aW5nIGlucHV0Ki8KKyNkZWZpbmUgQ09NUF9PVVRQVVRMRVZFTF9MT1cgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorLyogV2hlbiBvdXRwdXQgcG9sYXJpdHkgaXMgbm90IGludmVydGVkLCBjb21wYXJhdG9yIG91dHB1dCBpcyBoaWdoIHdoZW4KKyAgIHRoZSBub24taW52ZXJ0aW5nIGlucHV0IGlzIGF0IGEgaGlnaGVyIHZvbHRhZ2UgdGhhbiB0aGUgaW52ZXJ0aW5nIGlucHV0ICovCisjZGVmaW5lIENPTVBfT1VUUFVUTEVWRUxfSElHSCAgICAgICAgICAgICAgICAgIENPTVBfQ1NSX0NPTVB4T1VUCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfVHJpZ2dlck1vZGUgQ09NUCBUcmlnZ2VyIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBDT01QX1RSSUdHRVJNT0RFX05PTkUgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgICAvKiE8IE5vIEV4dGVybmFsIEludGVycnVwdCB0cmlnZ2VyIGRldGVjdGlvbiAqLworI2RlZmluZSBDT01QX1RSSUdHRVJNT0RFX0lUX1JJU0lORyAgICAgICAgICAgICgweDAwMDAwMDAxVSkgICAvKiE8IEV4dGVybmFsIEludGVycnVwdCBNb2RlIHdpdGggUmlzaW5nIGVkZ2UgdHJpZ2dlciBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgQ09NUF9UUklHR0VSTU9ERV9JVF9GQUxMSU5HICAgICAgICAgICAoMHgwMDAwMDAwMlUpICAgLyohPCBFeHRlcm5hbCBJbnRlcnJ1cHQgTW9kZSB3aXRoIEZhbGxpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAqLworI2RlZmluZSBDT01QX1RSSUdHRVJNT0RFX0lUX1JJU0lOR19GQUxMSU5HICAgICgweDAwMDAwMDAzVSkgICAvKiE8IEV4dGVybmFsIEludGVycnVwdCBNb2RlIHdpdGggUmlzaW5nL0ZhbGxpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAqLworI2RlZmluZSBDT01QX1RSSUdHRVJNT0RFX0VWRU5UX1JJU0lORyAgICAgICAgICgweDAwMDAwMDEwVSkgICAvKiE8IEV2ZW50IE1vZGUgd2l0aCBSaXNpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAqLworI2RlZmluZSBDT01QX1RSSUdHRVJNT0RFX0VWRU5UX0ZBTExJTkcgICAgICAgICgweDAwMDAwMDIwVSkgICAvKiE8IEV2ZW50IE1vZGUgd2l0aCBGYWxsaW5nIGVkZ2UgdHJpZ2dlciBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgQ09NUF9UUklHR0VSTU9ERV9FVkVOVF9SSVNJTkdfRkFMTElORyAoMHgwMDAwMDAzMFUpICAgLyohPCBFdmVudCBNb2RlIHdpdGggUmlzaW5nL0ZhbGxpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX1N0YXRlX0xvY2sgQ09NUCBTdGF0ZSBMb2NrCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ09NUF9TVEFURV9CSVRfTE9DSyAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAxMFUpICAgLyogTG9jayBiaXQgaW4gQ09NUCBoYW5kbGUgc3RhdGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENPTVBfRXhwb3J0ZWRfTWFjcm9zIENPTVAgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgUmVzZXQgQ09NUCBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fICBDT01QIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgICgoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX0NPTVBfU1RBVEVfUkVTRVQpCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIENPTVAgSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfY29tcF9leC5oIgorCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIENPTVBfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qKiBAYWRkdG9ncm91cCBDT01QX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAqIEB7CisgKi8KKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ09NUF9Jbml0KENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NPTVBfRGVJbml0KENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApOwordm9pZCAgICAgICAgICAgICAgSEFMX0NPTVBfTXNwSW5pdChDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9DT01QX01zcERlSW5pdChDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKTsKKy8qKgorICogQH0KKyAqLworCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAYWRkdG9ncm91cCBDT01QX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAqIEB7CisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DT01QX1N0YXJ0KENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NPTVBfU3RvcChDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DT01QX1N0YXJ0X0lUKENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NPTVBfU3RvcF9JVChDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9DT01QX0lSUUhhbmRsZXIoQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCk7CisvKiBDYWxsYmFjayBpbiBJbnRlcnJ1cHQgbW9kZSAqLwordm9pZCAgICAgICAgICAgICAgSEFMX0NPTVBfVHJpZ2dlckNhbGxiYWNrKENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApOworLyoqCisgICogQH0KKyAgKi8KKworLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBhZGR0b2dyb3VwIENPTVBfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMworICogQHsKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NPTVBfTG9jayhDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKTsKK3VpbnQzMl90ICAgICAgICAgIEhBTF9DT01QX0dldE91dHB1dExldmVsKENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApOworLyoqCisgICogQH0KKyAgKi8KKworLyogUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBhZGR0b2dyb3VwIENPTVBfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNAorICAqIEB7CisgICovCitIQUxfQ09NUF9TdGF0ZVR5cGVEZWYgSEFMX0NPTVBfR2V0U3RhdGUoQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCk7CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDT01QX1ByaXZhdGVfTWFjcm9zIENPTVAgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfSVNfQ09NUF9EZWZpbml0aW9ucyBDT01QIFByaXZhdGUgbWFjcm9zIHRvIGNoZWNrIGlucHV0IHBhcmFtZXRlcnMKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX0NPTVBfT1VUUFVUUE9MKF9fUE9MX18pICAoKChfX1BPTF9fKSA9PSBDT01QX09VVFBVVFBPTF9OT05JTlZFUlRFRCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9MX18pID09IENPTVBfT1VUUFVUUE9MX0lOVkVSVEVEKSkKKworI2RlZmluZSBJU19DT01QX1RSSUdHRVJNT0RFKF9fTU9ERV9fKSAgKCgoX19NT0RFX18pID09IENPTVBfVFJJR0dFUk1PREVfTk9ORSkgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBDT01QX1RSSUdHRVJNT0RFX0lUX1JJU0lORykgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gQ09NUF9UUklHR0VSTU9ERV9JVF9GQUxMSU5HKSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IENPTVBfVFJJR0dFUk1PREVfSVRfUklTSU5HX0ZBTExJTkcpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBDT01QX1RSSUdHRVJNT0RFX0VWRU5UX1JJU0lORykgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gQ09NUF9UUklHR0VSTU9ERV9FVkVOVF9GQUxMSU5HKSAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IENPTVBfVFJJR0dFUk1PREVfRVZFTlRfUklTSU5HX0ZBTExJTkcpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkYzeHhfSEFMX0NPTVBfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjN4eF9oYWxfY29tcF9leC5oIGIvSW5jL3N0bTMyZjN4eF9oYWxfY29tcF9leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OGRlMmQKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2hhbF9jb21wX2V4LmgKQEAgLTAsMCArMSwyNzk2IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2hhbF9jb21wX2V4LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIENPTVAgSEFMIEV4dGVuZGVkIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0hBTF9DT01QX0VYX0gKKyNkZWZpbmUgX19TVE0zMkYzeHhfSEFMX0NPTVBfRVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QRXggQ09NUEV4CisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENPTVBFeF9FeHBvcnRlZF9Db25zdGFudHMgQ09NUCBFeHRlbmRlZCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpCisvKiogQGRlZmdyb3VwIENPTVBFeF9JbnZlcnRpbmdJbnB1dCAgQ09NUCBFeHRlbmRlZCBJbnZlcnRpbmdJbnB1dCAoU1RNMzJGMzAyeEUvU1RNMzJGMzAzeEUvU1RNMzJGMzk4eHgvU1RNMzJGMzAyeEMvU1RNMzJGMzAzeEMvU1RNMzJGMzU4eHggUHJvZHVjdCBkZXZpY2VzKQorICAqIEB7CisgICovCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfMV80VlJFRklOVCAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAxVS80IFZSRUZJTlQgY29ubmVjdGVkIHRvIGNvbXBhcmF0b3IgaW52ZXJ0aW5nIGlucHV0ICovCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfMV8yVlJFRklOVCAgICAgICBDT01QX0NTUl9DT01QeElOU0VMXzAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAxVS8yIFZSRUZJTlQgY29ubmVjdGVkIHRvIGNvbXBhcmF0b3IgaW52ZXJ0aW5nIGlucHV0ICovCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfM180VlJFRklOVCAgICAgICBDT01QX0NTUl9DT01QeElOU0VMXzEgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAzVS80IFZSRUZJTlQgY29ubmVjdGVkIHRvIGNvbXBhcmF0b3IgaW52ZXJ0aW5nIGlucHV0ICovCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfVlJFRklOVCAgICAgICAgICAoQ09NUF9DU1JfQ09NUHhJTlNFTF8xfENPTVBfQ1NSX0NPTVB4SU5TRUxfMCkgLyohPCBWUkVGSU5UIGNvbm5lY3RlZCB0byBjb21wYXJhdG9yIGludmVydGluZyBpbnB1dCAqLworI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX0RBQzFfQ0gxICAgICAgICAgQ09NUF9DU1JfQ09NUHhJTlNFTF8yICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgREFDMV9DSDFfT1VUIChQQTQpIGNvbm5lY3RlZCB0byBjb21wYXJhdG9yIGludmVydGluZyBpbnB1dCAqLworI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX0RBQzFfQ0gyICAgICAgICAgKENPTVBfQ1NSX0NPTVB4SU5TRUxfMnxDT01QX0NTUl9DT01QeElOU0VMXzApIC8qITwgREFDMV9DSDJfT1VUIChQQTUpIGNvbm5lY3RlZCB0byBjb21wYXJhdG9yIGludmVydGluZyBpbnB1dCAqLworI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX0lPMSAgICAgICAgICAgICAgKENPTVBfQ1NSX0NPTVB4SU5TRUxfMnxDT01QX0NTUl9DT01QeElOU0VMXzEpIC8qITwgSU8xIChQQTAgZm9yIENPTVAxLCBQQTIgZm9yIENPTVAyLCBQRDE1IGZvciBDT01QMywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRTggZm9yIENPTVA0LCBQRDEzIGZvciBDT01QNSwgUEQxMCBmb3IgQ09NUDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQzAgZm9yIENPTVA3KSBjb25uZWN0ZWQgdG8gY29tcGFyYXRvciBpbnZlcnRpbmcgaW5wdXQgKi8KKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzIgICAgICAgICAgICAgICBDT01QX0NTUl9DT01QeElOU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IElPMiAoUEIxMiBmb3IgQ09NUDMsIFBCMiBmb3IgQ09NUDQsIFBCMTAgZm9yIENPTVA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQjE1IGZvciBDT01QNikgY29ubmVjdGVkIHRvIGNvbXBhcmF0b3IgaW52ZXJ0aW5nIGlucHV0ICovCisvKiBBbGlhc2VzIGZvciBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfREFDMSAgICAgICAgICAgICAgQ09NUF9JTlZFUlRJTkdJTlBVVF9EQUMxX0NIMQorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX0RBQzIgICAgICAgICAgICAgIENPTVBfSU5WRVJUSU5HSU5QVVRfREFDMV9DSDIKKy8qKgorICAqIEB9CisgICovCisjZWxpZiBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorLyoqIEBkZWZncm91cCBDT01QRXhfSW52ZXJ0aW5nSW5wdXQgQ09NUCBFeHRlbmRlZCBJbnZlcnRpbmdJbnB1dCAoU1RNMzJGMzAxeDgvU1RNMzJGMzAyeDgvU1RNMzJGMzE4eHggUHJvZHVjdCBkZXZpY2VzKQorICAqIEB7CisgICovCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfMV80VlJFRklOVCAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgMVUvNCBWUkVGSU5UIGNvbm5lY3RlZCB0byBjb21wYXJhdG9yIGludmVydGluZyBpbnB1dCAqLworI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUXzFfMlZSRUZJTlQgICAgIENPTVBfQ1NSX0NPTVB4SU5TRUxfMCAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDFVLzIgVlJFRklOVCBjb25uZWN0ZWQgdG8gY29tcGFyYXRvciBpbnZlcnRpbmcgaW5wdXQgKi8KKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF8zXzRWUkVGSU5UICAgICBDT01QX0NTUl9DT01QeElOU0VMXzEgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAzVS80IFZSRUZJTlQgY29ubmVjdGVkIHRvIGNvbXBhcmF0b3IgaW52ZXJ0aW5nIGlucHV0ICovCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfVlJFRklOVCAgICAgICAgKENPTVBfQ1NSX0NPTVB4SU5TRUxfMXxDT01QX0NTUl9DT01QeElOU0VMXzApIC8qITwgVlJFRklOVCBjb25uZWN0ZWQgdG8gY29tcGFyYXRvciBpbnZlcnRpbmcgaW5wdXQgKi8KKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9EQUMxX0NIMSAgICAgICBDT01QX0NTUl9DT01QeElOU0VMXzIgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEQUMxX0NIMV9PVVQgKFBBNCkgY29ubmVjdGVkIHRvIGNvbXBhcmF0b3IgaW52ZXJ0aW5nIGlucHV0ICovCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfSU8xICAgICAgICAgICAgKENPTVBfQ1NSX0NPTVB4SU5TRUxfMnxDT01QX0NTUl9DT01QeElOU0VMXzEpIC8qITwgSU8xIChQQTIgZm9yIENPTVAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQgdG8gY29tcGFyYXRvciBpbnZlcnRpbmcgaW5wdXQgKi8KKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzIgICAgICAgICAgICBDT01QX0NTUl9DT01QeElOU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJTzIgKFBCMiBmb3IgQ09NUDQsIFBCMTUgZm9yIENPTVA2KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCB0byBjb21wYXJhdG9yIGludmVydGluZyBpbnB1dCAqLworLyogQWxpYXNlcyBmb3IgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX0RBQzEgICAgICAgICAgIENPTVBfSU5WRVJUSU5HSU5QVVRfREFDMV9DSDEKKy8qKgorICAqIEB9CisgICovCisjZWxpZiBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KQorLyoqIEBkZWZncm91cCBDT01QRXhfSW52ZXJ0aW5nSW5wdXQgQ09NUCBFeHRlbmRlZCBJbnZlcnRpbmdJbnB1dCAoU1RNMzJGMzAzeDgvU1RNMzJGMzM0eDgvU1RNMzJGMzI4eHggUHJvZHVjdCBkZXZpY2VzKQorICAqIEB7CisgICovCisvKiBOb3RlOiBPbiB0aGVzZSBTVE0zMiBkZXZpY2VzLCB0aGVyZSBpcyBvbmx5IDEgY29tcGFyYXRvciBpbnZlcnRpbmcgaW5wdXQgICAqLworLyogICAgICAgY29ubmVjdGVkIHRvIGEgR1BJTy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIEl0IG11c3QgYmUgY2hvc2VuIGFtb25nIHRoZSAyIGxpdGVyYWxzIENPTVBfSU5WRVJUSU5HSU5QVVRfSU94ICAgICAgICovCisvKiAgICAgICBkZXBlbmRpbmcgb24gY29tcGFyYXRvciBpbnN0YW5jZSBDT01QeC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUXzFfNFZSRUZJTlQgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDFVLzQgVlJFRklOVCBjb25uZWN0ZWQgdG8gY29tcGFyYXRvciBpbnZlcnRpbmcgaW5wdXQgKi8KKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF8xXzJWUkVGSU5UICAgICBDT01QX0NTUl9DT01QeElOU0VMXzAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAxVS8yIFZSRUZJTlQgY29ubmVjdGVkIHRvIGNvbXBhcmF0b3IgaW52ZXJ0aW5nIGlucHV0ICovCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfM180VlJFRklOVCAgICAgQ09NUF9DU1JfQ09NUHhJTlNFTF8xICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgM1UvNCBWUkVGSU5UIGNvbm5lY3RlZCB0byBjb21wYXJhdG9yIGludmVydGluZyBpbnB1dCAqLworI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX1ZSRUZJTlQgICAgICAgIChDT01QX0NTUl9DT01QeElOU0VMXzF8Q09NUF9DU1JfQ09NUHhJTlNFTF8wKSAvKiE8IFZSRUZJTlQgY29ubmVjdGVkIHRvIGNvbXBhcmF0b3IgaW52ZXJ0aW5nIGlucHV0ICovCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfREFDMV9DSDEgICAgICAgQ09NUF9DU1JfQ09NUHhJTlNFTF8yICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgREFDMV9DSDFfT1VUIChQQTQpIGNvbm5lY3RlZCB0byBjb21wYXJhdG9yIGludmVydGluZyBpbnB1dCAqLworI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX0RBQzFfQ0gyICAgICAgIChDT01QX0NTUl9DT01QeElOU0VMXzJ8Q09NUF9DU1JfQ09NUHhJTlNFTF8wKSAvKiE8IERBQzFfQ0gyX09VVCAoUEE1KSBjb25uZWN0ZWQgdG8gY29tcGFyYXRvciBpbnZlcnRpbmcgaW5wdXQgKi8KKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzEgICAgICAgICAgICAoQ09NUF9DU1JfQ09NUHhJTlNFTF8yfENPTVBfQ1NSX0NPTVB4SU5TRUxfMSkgLyohPCBJTzEgKFBBMiBmb3IgQ09NUDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCB0byBjb21wYXJhdG9yIGludmVydGluZyBpbnB1dCAqLworI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX0lPMiAgICAgICAgICAgIENPTVBfQ1NSX0NPTVB4SU5TRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IElPMiAoUEIyIGZvciBDT01QNCwgUEIxNSBmb3IgQ09NUDYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkIHRvIGNvbXBhcmF0b3IgaW52ZXJ0aW5nIGlucHV0ICovCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfREFDMl9DSDEgICAgICAgQ09NUF9DU1JfQ09NUHhJTlNFTF8zICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgREFDMl9DSDFfT1VUIGNvbm5lY3RlZCB0byBjb21wYXJhdG9yIGludmVydGluZyBpbnB1dCAqLworCisvKiBBbGlhc2VzIGZvciBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfREFDMSAgICAgICAgICAgQ09NUF9JTlZFUlRJTkdJTlBVVF9EQUMxX0NIMQorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX0RBQzIgICAgICAgICAgIENPTVBfSU5WRVJUSU5HSU5QVVRfREFDMV9DSDIKKy8qKgorICAqIEB9CisgICovCisjZWxpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorLyoqIEBkZWZncm91cCBDT01QRXhfSW52ZXJ0aW5nSW5wdXQgQ09NUCBFeHRlbmRlZCBJbnZlcnRpbmdJbnB1dCAoU1RNMzJGMzczeEMvU1RNMzJGMzc4eHggUHJvZHVjdCBkZXZpY2VzKQorICAqIEB7CisgICovCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfMV80VlJFRklOVCAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgMVUvNCBWUkVGSU5UIGNvbm5lY3RlZCB0byBjb21wYXJhdG9yIGludmVydGluZyBpbnB1dCAqLworI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUXzFfMlZSRUZJTlQgICgodWludDMyX3QpQ09NUF9DU1JfQ09NUHhJTlNFTF8wKSAgICAgICAgICAgICAvKiE8IDFVLzIgVlJFRklOVCBjb25uZWN0ZWQgdG8gY29tcGFyYXRvciBpbnZlcnRpbmcgaW5wdXQgKi8KKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF8zXzRWUkVGSU5UICAoKHVpbnQzMl90KUNPTVBfQ1NSX0NPTVB4SU5TRUxfMSkgICAgICAgICAgICAgLyohPCAzVS80IFZSRUZJTlQgY29ubmVjdGVkIHRvIGNvbXBhcmF0b3IgaW52ZXJ0aW5nIGlucHV0ICovCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfVlJFRklOVCAgICAgKCh1aW50MzJfdCkoQ09NUF9DU1JfQ09NUHhJTlNFTF8xfENPTVBfQ1NSX0NPTVB4SU5TRUxfMCkpIC8qITwgVlJFRklOVCBjb25uZWN0ZWQgdG8gY29tcGFyYXRvciBpbnZlcnRpbmcgaW5wdXQgKi8KKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9EQUMxX0NIMSAgICAoKHVpbnQzMl90KUNPTVBfQ1NSX0NPTVB4SU5TRUxfMikgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEQUMxX0NIMV9PVVQgKFBBNCkgY29ubmVjdGVkIHRvIGNvbXBhcmF0b3IgaW52ZXJ0aW5nIGlucHV0ICovCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfREFDMV9DSDIgICAgKCh1aW50MzJfdCkoQ09NUF9DU1JfQ09NUHhJTlNFTF8yfENPTVBfQ1NSX0NPTVB4SU5TRUxfMCkpIC8qITwgREFDMV9DSDJfT1VUIChQQTUpIGNvbm5lY3RlZCB0byBjb21wYXJhdG9yIGludmVydGluZyBpbnB1dCAqLworI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX0lPMSAgICAgICAgICgodWludDMyX3QpKENPTVBfQ1NSX0NPTVB4SU5TRUxfMnxDT01QX0NTUl9DT01QeElOU0VMXzEpKSAvKiE8IElPMSAoUEEwIGZvciBDT01QMSwgUEEyIGZvciBDT01QMikgY29ubmVjdGVkIHRvIGNvbXBhcmF0b3IgaW52ZXJ0aW5nIGlucHV0ICovCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfREFDMl9DSDEgICAgKCh1aW50MzJfdClDT01QX0NTUl9DT01QeElOU0VMKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEQUMyX0NIMV9PVVQgY29ubmVjdGVkIHRvIGNvbXBhcmF0b3IgaW52ZXJ0aW5nIGlucHV0ICovCisKKy8qIEFsaWFzZXMgZm9yIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9EQUMxICAgICAgICBDT01QX0lOVkVSVElOR0lOUFVUX0RBQzFfQ0gxCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfREFDMiAgICAgICAgQ09NUF9JTlZFUlRJTkdJTlBVVF9EQUMxX0NIMgorLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorLyoqIEBkZWZncm91cCBDT01QRXhfTm9uSW52ZXJ0aW5nSW5wdXQgIENPTVAgRXh0ZW5kZWQgTm9uSW52ZXJ0aW5nSW5wdXQgKFNUTTMyRjMwMnhDL1NUTTMyRjMwM3hDL1NUTTMyRjM1OHh4IFByb2R1Y3QgZGV2aWNlcykKKyAgKiBAeworICAqLworI2RlZmluZSBDT01QX05PTklOVkVSVElOR0lOUFVUX0lPMSAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgLyohPCBJTzEgKFBBMSBmb3IgQ09NUDEsIFBBNyBmb3IgQ09NUDIsIFBCMTQgZm9yIENPTVAzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEIwIGZvciBDT01QNCwgUEQxMiBmb3IgQ09NUDUsIFBEMTEgZm9yIENPTVA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQTAgZm9yIENPTVA3KSBjb25uZWN0ZWQgdG8gY29tcGFyYXRvciBub24gaW52ZXJ0aW5nIGlucHV0ICovCisjZGVmaW5lIENPTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU8yICAgICAgICAgICAgICAgQ09NUF9DU1JfQ09NUHhOT05JTlNFTCAvKiE8IElPMiAoUEEzIGZvciBDT01QMiwgUEQxNCBmb3IgQ09NUDMsIFBFNyBmb3IgQ09NUDQsIFBCMTMgZm9yIENPTVA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQjExIGZvciBDT01QNiwgUEMxIGZvciBDT01QNykgY29ubmVjdGVkIHRvIGNvbXBhcmF0b3Igbm9uIGludmVydGluZyBpbnB1dCAqLworI2RlZmluZSBDT01QX05PTklOVkVSVElOR0lOUFVUX0RBQzFTV0lUQ0hDTE9TRUQgIENPTVAxX0NTUl9DT01QMVNXMSAgICAgLyohPCBEQUMgb3VwdXQgY29ubmVjdGVkIHRvIGNvbXBhcmF0b3IgQ09NUDEgbm9uIGludmVydGluZyBpbnB1dCAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbGlmIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisvKiogQGRlZmdyb3VwIENPTVBFeF9Ob25JbnZlcnRpbmdJbnB1dCBDT01QIEV4dGVuZGVkIE5vbkludmVydGluZ0lucHV0IChTVE0zMkYzMDF4OC9TVE0zMkYzMDJ4OC9TVE0zMkYzMTh4eCBQcm9kdWN0IGRldmljZXMpCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9JTzEgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpIC8qITwgSU8xIChQQTcgZm9yIENPTVAyLCBQQjAgZm9yIENPTVA0LCBQQjExIGZvciBDT01QNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkIHRvIGNvbXBhcmF0b3Igbm9uIGludmVydGluZyBpbnB1dCAqLworI2RlZmluZSBDT01QX05PTklOVkVSVElOR0lOUFVUX0RBQzFTV0lUQ0hDTE9TRUQgIENPTVAyX0NTUl9DT01QMklOUERBQyAgLyohPCBEQUMgb3VwdXQgY29ubmVjdGVkIHRvIGNvbXBhcmF0b3IgQ09NUDIgbm9uIGludmVydGluZyBpbnB1dCAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbGlmIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisvKiogQGRlZmdyb3VwIENPTVBFeF9Ob25JbnZlcnRpbmdJbnB1dCBDT01QIEV4dGVuZGVkIE5vbkludmVydGluZ0lucHV0IChTVE0zMkYzNzN4Qy9TVE0zMkYzNzh4eCBQcm9kdWN0IGRldmljZXMpCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9JTzEgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpIC8qITwgSU8xIChQQTEgZm9yIENPTVAxLCBQQTMgZm9yIENPTVAyKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkIHRvIGNvbXBhcmF0b3Igbm9uIGludmVydGluZyBpbnB1dCAqLworI2RlZmluZSBDT01QX05PTklOVkVSVElOR0lOUFVUX0RBQzFTV0lUQ0hDTE9TRUQgIENPTVBfQ1NSX0NPTVAxU1cxICAvKiE8IERBQyBvdXB1dCBjb25uZWN0ZWQgdG8gY29tcGFyYXRvciBDT01QMSBub24gaW52ZXJ0aW5nIGlucHV0ICovCisvKioKKyAgKiBAfQorICAqLworI2VsaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkKKy8qKiBAZGVmZ3JvdXAgQ09NUEV4X05vbkludmVydGluZ0lucHV0ICBDT01QIEV4dGVuZGVkIE5vbkludmVydGluZ0lucHV0IChTVE0zMkYzMDJ4RS9TVE0zMkYzMDN4RS9TVE0zMkYzOTh4eCBQcm9kdWN0IGRldmljZXMpCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9JTzEgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgIC8qITwgSU8xIChQQTEgZm9yIENPTVAxLCBQQTcgZm9yIENPTVAyLCBQQjE0IGZvciBDT01QMywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEIwIGZvciBDT01QNCwgUEQxMiBmb3IgQ09NUDUsIFBEMTEgZm9yIENPTVA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBMCBmb3IgQ09NUDcpIGNvbm5lY3RlZCB0byBjb21wYXJhdG9yIG5vbiBpbnZlcnRpbmcgaW5wdXQgKi8KKyNkZWZpbmUgQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9EQUMxU1dJVENIQ0xPU0VEIENPTVAxX0NTUl9DT01QMVNXMSAgICAgIC8qITwgREFDIG91cHV0IGNvbm5lY3RlZCB0byBjb21wYXJhdG9yIENPTVAxIG5vbiBpbnZlcnRpbmcgaW5wdXQgKi8KKy8qKgorICAqIEB9CisgICovCisjZWxzZQorLyoqIEBkZWZncm91cCBDT01QRXhfTm9uSW52ZXJ0aW5nSW5wdXQgQ09NUCBFeHRlbmRlZCBOb25JbnZlcnRpbmdJbnB1dCAoT3RoZXIgUHJvZHVjdCBkZXZpY2VzKQorICAqIEB7CisgICovCisjZGVmaW5lIENPTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU8xICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgLyohPCBJTzEgKFBBNyBmb3IgQ09NUDIsIFBCMCBmb3IgQ09NUDQsIFBCMTEgZm9yIENPTVA2KSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCB0byBjb21wYXJhdG9yIG5vbiBpbnZlcnRpbmcgaW5wdXQgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisvKiogQGRlZmdyb3VwIENPTVBFeF9PdXRwdXQgQ09NUCBFeHRlbmRlZCBPdXRwdXQgKFNUTTMyRjMwMXg4L1NUTTMyRjMwMng4L1NUTTMyRjMxOHh4IFByb2R1Y3QgZGV2aWNlcykKKyAgKiAgICAgICAgRWxlbWVudHMgdmFsdWUgY29udmVudGlvbiBvbiAxNiBMU0I6IDAwWFhYWDAwMDBZWVlZWVliCisgICogICAgICAgICAgIC0gWVlZWVlZIDogQXBwbGljYWJsZSBjb21wYXJhdG9yIGluc3RhbmNlIG51bWJlciAoYml0bWFwIGZvcm1hdDogMDAwMDEwIGZvciBDT01QMiwgMTAwMDAwIGZvciBDT01QNikKKyAgKiAgICAgICAgICAgLSBYWFhYICAgOiBDT01QeE9VVFNFTCB2YWx1ZQorICAqIEB7CisgICovCisvKiBPdXRwdXQgUmVkaXJlY3Rpb24gdmFsdWVzIGNvbW1vbiB0byBhbGwgY29tcGFyYXRvcnMgQ09NUDIsIENPTVA0IGFuZCBDT01QNiAqLworI2RlZmluZSBDT01QX09VVFBVVF9OT05FICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMkFVKSAgIC8qITwgQ09NUDIsIENPTVA0IG9yIENPTVA2IG91dHB1dCBpc24ndCBjb25uZWN0ZWQgdG8gb3RoZXIgcGVyaXBoZXJhbHMgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNMUJLSU4gICAgICAgICAgICAgICgweDAwMDAwNDJBVSkgICAvKiE8IENPTVAyLCBDT01QNCBvciBDT01QNiBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTEgQnJlYWsgSW5wdXQgKEJLSU4pICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTFCS0lOMl9CUksyICAgICAgICAoMHgwMDAwMDgyQVUpICAgLyohPCBDT01QMiwgQ09NUDQgb3IgQ09NUDYgIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMSBCcmVhayBJbnB1dCAyIChCUksyKSAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0xQktJTjIgICAgICAgICAgICAgKDB4MDAwMDE0MkFVKSAgIC8qITwgQ09NUDIsIENPTVA0IG9yIENPTVA2IG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMSBCcmVhayBJbnB1dCAyIChCS0lOMikgKi8KKy8qIE91dHB1dCBSZWRpcmVjdGlvbiBzcGVjaWZpYyB0byBDT01QMiAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0xT0NSRUZDTFIgICAgICAgICAgKDB4MDAwMDE4MDJVKSAgIC8qITwgQ09NUDIgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xIE9DUkVGIENsZWFyICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTFJQzEgICAgICAgICAgICAgICAoMHgwMDAwMUMwMlUpICAgLyohPCBDT01QMiBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTEgSW5wdXQgQ2FwdHVyZSAxVSAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0ySUM0ICAgICAgICAgICAgICAgKDB4MDAwMDIwMDJVKSAgIC8qITwgQ09NUDIgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0yIElucHV0IENhcHR1cmUgNFUgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNMk9DUkVGQ0xSICAgICAgICAgICgweDAwMDAyNDAyVSkgICAvKiE8IENPTVAyIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMiBPQ1JFRiBDbGVhciAqLworLyogT3V0cHV0IFJlZGlyZWN0aW9uIHNwZWNpZmljIHRvIENPTVA0ICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTE1SUMyICAgICAgICAgICAgICAoMHgwMDAwMjAwOFUpICAgLyohPCBDT01QNCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTE1IElucHV0IENhcHR1cmUgMlUgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNMTVPQ1JFRkNMUiAgICAgICAgICgweDAwMDAyODA4VSkgICAvKiE8IENPTVA0IG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMTUgT0NSRUYgQ2xlYXIgKi8KKy8qIE91dHB1dCBSZWRpcmVjdGlvbiBzcGVjaWZpYyB0byBDT01QNiAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0ySUMyICAgICAgICAgICAgICAgKDB4MDAwMDE4MjBVKSAgIC8qITwgQ09NUDYgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0yIElucHV0IENhcHR1cmUgMlUgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfQ09NUDZfVElNMk9DUkVGQ0xSICAgICgweDAwMDAyMDIwVSkgICAvKiE8IENPTVA2IG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMiBPQ1JFRiBDbGVhciAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0xNk9DUkVGQ0xSICAgICAgICAgKDB4MDAwMDI0MjBVKSAgIC8qITwgQ09NUDYgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNiBPQ1JFRiBDbGVhciAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0xNklDMSAgICAgICAgICAgICAgKDB4MDAwMDI4MjBVKSAgIC8qITwgQ09NUDYgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNiBJbnB1dCBDYXB0dXJlIDFVICovCisvKioKKyAgKiBAfQorICAqLworI2VsaWYgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpCisvKiogQGRlZmdyb3VwIENPTVBFeF9PdXRwdXQgQ09NUCBFeHRlbmRlZCBPdXRwdXQgKFNUTTMyRjMwM3g4L1NUTTMyRjMzNHg4L1NUTTMyRjMyOHh4IFByb2R1Y3QgZGV2aWNlcykKKyAgKiAgICAgICAgRWxlbWVudHMgdmFsdWUgY29udmVudGlvbiBvbiAxNiBMU0I6IDAwWFhYWDAwMDBZWVlZWVliCisgICogICAgICAgICAgIC0gWVlZWVlZIDogQXBwbGljYWJsZSBjb21wYXJhdG9yIGluc3RhbmNlIG51bWJlciAoYml0bWFwIGZvcm1hdDogMDAwMDEwIGZvciBDT01QMiwgMTAwMDAwIGZvciBDT01QNikKKyAgKiAgICAgICAgICAgLSBYWFhYICAgOiBDT01QeE9VVFNFTCB2YWx1ZQorICAqIEB7CisgICovCisvKiBPdXRwdXQgUmVkaXJlY3Rpb24gdmFsdWVzIGNvbW1vbiB0byBhbGwgY29tcGFyYXRvcnMgQ09NUDIsIENPTVA0IGFuZCBDT01QNiAqLworI2RlZmluZSBDT01QX09VVFBVVF9OT05FICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMkFVKSAgIC8qITwgQ09NUDIsIENPTVA0IG9yIENPTVA2IG91dHB1dCBpc24ndCBjb25uZWN0ZWQgdG8gb3RoZXIgcGVyaXBoZXJhbHMgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNMUJLSU4gICAgICAgICAgICAgICgweDAwMDAwNDJBVSkgICAvKiE8IENPTVAyLCBDT01QNCBvciBDT01QNiBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTEgQnJlYWsgSW5wdXQgKEJLSU4pICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTFCS0lOMiAgICAgICAgICAgICAoMHgwMDAwMDgyQVUpICAgLyohPCBDT01QMiwgQ09NUDQgb3IgQ09NUDYgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xIEJyZWFrIElucHV0IDIgKEJLSU4yKSAqLworLyogT3V0cHV0IFJlZGlyZWN0aW9uIGNvbW1vbiB0byBDT01QMiBhbmQgQ09NUDQgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNM09DUkVGQ0xSICAgICAgICAgICgweDAwMDAyQzBBVSkgICAvKiE8IENPTVAyIG9yIENPTVA0IG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMyBPQ1JFRiBDbGVhciAqLworLyogT3V0cHV0IFJlZGlyZWN0aW9uIHNwZWNpZmljIHRvIENPTVAyICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTFPQ1JFRkNMUiAgICAgICAgICAoMHgwMDAwMTgwMlUpICAgLyohPCBDT01QMiBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTEgT0NSRUYgQ2xlYXIgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNMUlDMSAgICAgICAgICAgICAgICgweDAwMDAxQzAyVSkgICAvKiE8IENPTVAyIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMSBJbnB1dCBDYXB0dXJlIDFVICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTJJQzQgICAgICAgICAgICAgICAoMHgwMDAwMjAwMlUpICAgLyohPCBDT01QMiBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTIgSW5wdXQgQ2FwdHVyZSA0VSAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0yT0NSRUZDTFIgICAgICAgICAgKDB4MDAwMDI0MDJVKSAgIC8qITwgQ09NUDIgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0yIE9DUkVGIENsZWFyICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTNJQzEgICAgICAgICAgICAgICAoMHgwMDAwMjgwMlUpICAgLyohPCBDT01QMiBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTMgSW5wdXQgQ2FwdHVyZSAxVSAqLworLyogT3V0cHV0IFJlZGlyZWN0aW9uIHNwZWNpZmljIHRvIENPTVA0ICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTNJQzMgICAgICAgICAgICAgICAoMHgwMDAwMTgwOFUpICAgLyohPCBDT01QNCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTMgSW5wdXQgQ2FwdHVyZSAzVSAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0xNUlDMiAgICAgICAgICAgICAgKDB4MDAwMDIwMDhVKSAgIC8qITwgQ09NUDQgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNSBJbnB1dCBDYXB0dXJlIDJVICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTE1T0NSRUZDTFIgICAgICAgICAoMHgwMDAwMjgwOFUpICAgLyohPCBDT01QNCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTE1IE9DUkVGIENsZWFyICovCisvKiBPdXRwdXQgUmVkaXJlY3Rpb24gc3BlY2lmaWMgdG8gQ09NUDYgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNMklDMiAgICAgICAgICAgICAgICgweDAwMDAxODIwVSkgICAvKiE8IENPTVA2IG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMiBJbnB1dCBDYXB0dXJlIDJVICovCisjZGVmaW5lIENPTVBfT1VUUFVUX0NPTVA2X1RJTTJPQ1JFRkNMUiAgICAoMHgwMDAwMjAyMFUpICAgLyohPCBDT01QNiBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTIgT0NSRUYgQ2xlYXIgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNMTZPQ1JFRkNMUiAgICAgICAgICgweDAwMDAyNDIwVSkgICAvKiE8IENPTVA2IG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMTYgT0NSRUYgQ2xlYXIgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNMTZJQzEgICAgICAgICAgICAgICgweDAwMDAyODIwVSkgICAvKiE8IENPTVA2IG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMTYgSW5wdXQgQ2FwdHVyZSAxVSAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbGlmICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwMnhFKQorLyoqIEBkZWZncm91cCBDT01QRXhfT3V0cHV0IENPTVAgRXh0ZW5kZWQgT3V0cHV0IChTVE0zMkYzMDJ4Qy9TVE0zMkYzMDJ4RSBQcm9kdWN0IGRldmljZXMpCisgICogICAgICAgIEVsZW1lbnRzIHZhbHVlIGNvbnZlbnRpb24gb24gMTYgTFNCOiAwMFhYWFgwMDAwWVlZWVlZYgorICAqICAgICAgICAgICAtIFlZWVlZWSA6IEFwcGxpY2FibGUgY29tcGFyYXRvciBpbnN0YW5jZSBudW1iZXIgKGJpdG1hcCBmb3JtYXQ6IDAwMDAwMSBmb3IgQ09NUDEsIDEwMDAwMCBmb3IgQ09NUDYpCisgICogICAgICAgICAgIC0gWFhYWCAgIDogQ09NUHhPVVRTRUwgdmFsdWUKKyAgKiBAeworICAqLworLyogT3V0cHV0IFJlZGlyZWN0aW9uIHZhbHVlcyBjb21tb24gdG8gYWxsIGNvbXBhcmF0b3JzIENPTVAxLCBDT01QMiwgQ09NUDQsIENPTVA2ICovCisjZGVmaW5lIENPTVBfT1VUUFVUX05PTkUgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAyQlUpICAgLyohPCBDT01QMSwgQ09NUDIsIENPTVA0IG9yIENPTVA2IG91dHB1dCBpc24ndCBjb25uZWN0ZWQgdG8gb3RoZXIgcGVyaXBoZXJhbHMgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNMUJLSU4gICAgICAgICAgICAgICgweDAwMDAwNDJCVSkgICAvKiE8IENPTVAxLCBDT01QMiwgQ09NUDQgb3IgQ09NUDYgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xIEJyZWFrIElucHV0IChCS0lOKSAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0xQktJTjJfQlJLMiAgICAgICAgKDB4MDAwMDA4MkJVKSAgIC8qITwgQ09NUDEsIENPTVAyLCBDT01QNCBvciBDT01QNiBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTEgQnJlYWsgSW5wdXQgMiAoQlJLMikgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNMUJLSU4yICAgICAgICAgICAgICgweDAwMDAxNDJCVSkgICAvKiE8IENPTVAxLCBDT01QMiwgQ09NUDQgb3IgQ09NUDYgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xIEJyZWFrIElucHV0IDIgKEJLSU4yKSAqLworLyogT3V0cHV0IFJlZGlyZWN0aW9uIGNvbW1vbiB0byBDT01QMSBhbmQgQ09NUDIgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNMU9DUkVGQ0xSICAgICAgICAgICgweDAwMDAxODAzVSkgICAvKiE8IENPTVAxIG9yIENPTVAyIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMSBPQ1JFRiBDbGVhciAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0xSUMxICAgICAgICAgICAgICAgKDB4MDAwMDFDMDNVKSAgIC8qITwgQ09NUDEgb3IgQ09NUDIgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xIElucHV0IENhcHR1cmUgMVUgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNMklDNCAgICAgICAgICAgICAgICgweDAwMDAyMDAzVSkgICAvKiE8IENPTVAxIG9yIENPTVAyIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMiBJbnB1dCBDYXB0dXJlIDRVICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTJPQ1JFRkNMUiAgICAgICAgICAoMHgwMDAwMjQwM1UpICAgLyohPCBDT01QMSBvciBDT01QMiBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTIgT0NSRUYgQ2xlYXIgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNM0lDMSAgICAgICAgICAgICAgICgweDAwMDAyODAzVSkgICAvKiE8IENPTVAxIG9yIENPTVAyIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMyBJbnB1dCBDYXB0dXJlIDFVICovCisvKiBPdXRwdXQgUmVkaXJlY3Rpb24gY29tbW9uIHRvIENPTVAxLENPTVAyIGFuZCBDT01QNCAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0zT0NSRUZDTFIgICAgICAgICAgKDB4MDAwMDJDMEJVKSAgIC8qITwgQ09NUDEsIENPTVAyIG9yIENPTVA0IG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMyBPQ1JFRiBDbGVhciAqLworLyogT3V0cHV0IFJlZGlyZWN0aW9uIHNwZWNpZmljIHRvIENPTVA0ICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTNJQzMgICAgICAgICAgICAgICAoMHgwMDAwMTgwOFUpICAgLyohPCBDT01QNCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTMgSW5wdXQgQ2FwdHVyZSAzVSAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0xNUlDMiAgICAgICAgICAgICAgKDB4MDAwMDIwMDhVKSAgIC8qITwgQ09NUDQgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNSBJbnB1dCBDYXB0dXJlIDJVICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTRJQzIgICAgICAgICAgICAgICAoMHgwMDAwMjQwOFUpICAgLyohPCBDT01QNCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTQgSW5wdXQgQ2FwdHVyZSAyVSAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0xNU9DUkVGQ0xSICAgICAgICAgKDB4MDAwMDI4MDhVKSAgIC8qITwgQ09NUDQgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNSBPQ1JFRiBDbGVhciAqLworLyogT3V0cHV0IFJlZGlyZWN0aW9uIHNwZWNpZmljIHRvIENPTVA2ICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTJJQzIgICAgICAgICAgICAgICAoMHgwMDAwMTgyMFUpICAgLyohPCBDT01QNiBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTIgSW5wdXQgQ2FwdHVyZSAyVSAqLworI2RlZmluZSBDT01QX09VVFBVVF9DT01QNl9USU0yT0NSRUZDTFIgICAgKDB4MDAwMDIwMjBVKSAgIC8qITwgQ09NUDYgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0yIE9DUkVGIENsZWFyICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTE2T0NSRUZDTFIgICAgICAgICAoMHgwMDAwMjQyMFUpICAgLyohPCBDT01QNiBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTE2IE9DUkVGIENsZWFyICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTE2SUMxICAgICAgICAgICAgICAoMHgwMDAwMjgyMFUpICAgLyohPCBDT01QNiBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTE2IElucHV0IENhcHR1cmUgMVUgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNNElDNCAgICAgICAgICAgICAgICgweDAwMDAyQzIwVSkgICAvKiE8IENPTVA2IG91dHB1dCBjb25uZWN0ZWQgdG8gVElNNCBJbnB1dCBDYXB0dXJlIDRVICovCisvKioKKyAgKiBAfQorICAqLworI2VsaWYgIGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpCisvKiogQGRlZmdyb3VwIENPTVBFeF9PdXRwdXQgQ09NUCBFeHRlbmRlZCBPdXRwdXQgKFNUTTMyRjMwM3hDL1NUTTMyRjM1OHh4IFByb2R1Y3QgZGV2aWNlcykKKyAgKiAgICAgICAgRWxlbWVudHMgdmFsdWUgY29udmVudGlvbiBvbiAxNiBMU0I6IDAwWFhYWDAwMFlZWVlZWVliCisgICogICAgICAgICAgIC0gWVlZWVlZWSA6IEFwcGxpY2FibGUgY29tcGFyYXRvciBpbnN0YW5jZSBudW1iZXIgKGJpdG1hcCBmb3JtYXQ6IDAwMDAwMDEgZm9yIENPTVAxLCAxMDAwMDAwIGZvciBDT01QNykKKyAgKiAgICAgICAgICAgLSBYWFhYICAgIDogQ09NUHhPVVRTRUwgdmFsdWUKKyAgKiBAeworICAqLworLyogT3V0cHV0IFJlZGlyZWN0aW9uIHZhbHVlcyBjb21tb24gdG8gYWxsIGNvbXBhcmF0b3JzIENPTVAxLi4uQ09NUDcgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfTk9ORSAgICAgICAgICAgICAgICAgICgweDAwMDAwMDdGVSkgICAvKiE8IENPTVAxLCBDT01QMi4uLiBvciBDT01QNyBvdXRwdXQgaXNuJ3QgY29ubmVjdGVkIHRvIG90aGVyIHBlcmlwaGVyYWxzICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTFCS0lOICAgICAgICAgICAgICAoMHgwMDAwMDQ3RlUpICAgLyohPCBDT01QMSwgQ09NUDIuLi4gb3IgQ09NUDcgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xIEJyZWFrIElucHV0IChCS0lOKSAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0xQktJTjIgICAgICAgICAgICAgKDB4MDAwMDA4N0ZVKSAgIC8qITwgQ09NUDEsIENPTVAyLi4uIG9yIENPTVA3IG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMSBCcmVhayBJbnB1dCAyIChCS0lOMikgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNOEJLSU4gICAgICAgICAgICAgICgweDAwMDAwQzdGVSkgICAvKiE8IENPTVAxLCBDT01QMi4uLiBvciBDT01QNyBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTggQnJlYWsgSW5wdXQgKEJLSU4pICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTThCS0lOMiAgICAgICAgICAgICAoMHgwMDAwMTA3RlUpICAgLyohPCBDT01QMSwgQ09NUDIuLi4gb3IgQ09NUDcgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU04IEJyZWFrIElucHV0IDIgKEJLSU4yKSAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0xQktJTjJfVElNOEJLSU4yICAgKDB4MDAwMDE0N0ZVKSAgIC8qITwgQ09NUDEsIENPTVAyLi4uIG9yIENPTVA3IG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMSBCcmVhayBJbnB1dCAyIGFuZCBUSU04IEJyZWFrIElucHV0IDJVICovCisvKiBPdXRwdXQgUmVkaXJlY3Rpb24gY29tbW9uIHRvIENPTVAxLCBDT01QMiwgQ09NUDMgYW5kIENPTVA3ICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTFPQ1JFRkNMUiAgICAgICAgICAoMHgwMDAwMTg0N1UpICAgLyohPCBDT01QMSwgQ09NUDIsIENPTVAzIG9yIENPTVA3IG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMSBPQ1JFRiBDbGVhciAqLworLyogT3V0cHV0IFJlZGlyZWN0aW9uIGNvbW1vbiB0byBDT01QMSwgQ09NUDIgYW5kIENPTVAzICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTJPQ1JFRkNMUiAgICAgICAgICAoMHgwMDAwMjQwN1UpICAgLyohPCBDT01QMSwgQ09NUDIgb3IgQ09NUDMgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0yIE9DUkVGIENsZWFyICovCisvKiBPdXRwdXQgUmVkaXJlY3Rpb24gY29tbW9uIHRvIENPTVAxLCBDT01QMiwgQ09NUDQgYW5kIENPTVA1ICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTNPQ1JFRkNMUiAgICAgICAgICAoMHgwMDAwMkMxQlUpICAgLyohPCBDT01QMSwgQ09NUDIsIENPTVA0IG9yIENPTVA1IG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMyBPQ1JFRiBDbGVhciAqLworLyogT3V0cHV0IFJlZGlyZWN0aW9uIGNvbW1vbiB0byBDT01QNCwgQ09NUDUsIENPTVA2IGFuZCBDT01QNyAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU04T0NSRUZDTFIgICAgICAgICAgKDB4MDAwMDFDNzhVKSAgIC8qITwgQ09NUDQsIENPTVA1LCBDT01QNiBvciBDT01QNyBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTggT0NSRUYgQ2xlYXIgKi8KKy8qIE91dHB1dCBSZWRpcmVjdGlvbiBjb21tb24gdG8gQ09NUDEgYW5kIENPTVAyICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTFJQzEgICAgICAgICAgICAgICAoMHgwMDAwMUMwM1UpICAgLyohPCBDT01QMSBvciBDT01QMiBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTEgSW5wdXQgQ2FwdHVyZSAxVSAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0ySUM0ICAgICAgICAgICAgICAgKDB4MDAwMDIwMDNVKSAgIC8qITwgQ09NUDEgb3IgQ09NUDIgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0yIElucHV0IENhcHR1cmUgNFUgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNM0lDMSAgICAgICAgICAgICAgICgweDAwMDAyODAzVSkgICAvKiE8IENPTVAxIG9yIENPTVAyIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMyBJbnB1dCBDYXB0dXJlIDFVICovCisvKiBPdXRwdXQgUmVkaXJlY3Rpb24gc3BlY2lmaWMgdG8gQ09NUDMgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNNElDMSAgICAgICAgICAgICAgICgweDAwMDAxQzA0VSkgICAvKiE8IENPTVAzIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNNCBJbnB1dCBDYXB0dXJlIDFVICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTNJQzIgICAgICAgICAgICAgICAoMHgwMDAwMjAwNFUpICAgLyohPCBDT01QMyBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTMgSW5wdXQgQ2FwdHVyZSAyVSAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0xNUlDMSAgICAgICAgICAgICAgKDB4MDAwMDI4MDRVKSAgIC8qITwgQ09NUDMgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNSBJbnB1dCBDYXB0dXJlIDFVICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTE1QktJTiAgICAgICAgICAgICAoMHgwMDAwMkMwNFUpICAgLyohPCBDT01QMyBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTE1IEJyZWFrIElucHV0IChCS0lOKSAqLworLyogT3V0cHV0IFJlZGlyZWN0aW9uIHNwZWNpZmljIHRvIENPTVA0ICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTNJQzMgICAgICAgICAgICAgICAoMHgwMDAwMTgwOFUpICAgLyohPCBDT01QNCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTMgSW5wdXQgQ2FwdHVyZSAzVSAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0xNUlDMiAgICAgICAgICAgICAgKDB4MDAwMDIwMDhVKSAgIC8qITwgQ09NUDQgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNSBJbnB1dCBDYXB0dXJlIDJVICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTRJQzIgICAgICAgICAgICAgICAoMHgwMDAwMjQwOFUpICAgLyohPCBDT01QNCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTQgSW5wdXQgQ2FwdHVyZSAyVSAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0xNU9DUkVGQ0xSICAgICAgICAgKDB4MDAwMDI4MDhVKSAgIC8qITwgQ09NUDQgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNSBPQ1JFRiBDbGVhciAqLworLyogT3V0cHV0IFJlZGlyZWN0aW9uIHNwZWNpZmljIHRvIENPTVA1ICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTJJQzEgICAgICAgICAgICAgICAoMHgwMDAwMTgxMFUpICAgLyohPCBDT01QNSBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTIgSW5wdXQgQ2FwdHVyZSAxVSAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0xN0lDMSAgICAgICAgICAgICAgKDB4MDAwMDIwMTBVKSAgIC8qITwgQ09NUDUgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNyBJbnB1dCBDYXB0dXJlIDFVICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTRJQzMgICAgICAgICAgICAgICAoMHgwMDAwMjQxMFUpICAgLyohPCBDT01QNSBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTQgSW5wdXQgQ2FwdHVyZSAzVSAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0xNkJLSU4gICAgICAgICAgICAgKDB4MDAwMDI4MTBVKSAgIC8qITwgQ09NUDUgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNiBCcmVhayBJbnB1dCAoQktJTikgKi8KKy8qIE91dHB1dCBSZWRpcmVjdGlvbiBzcGVjaWZpYyB0byBDT01QNiAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0ySUMyICAgICAgICAgICAgICAgKDB4MDAwMDE4MjBVKSAgIC8qITwgQ09NUDYgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0yIElucHV0IENhcHR1cmUgMlUgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfQ09NUDZfVElNMk9DUkVGQ0xSICAgICgweDAwMDAyMDIwVSkgICAvKiE8IENPTVA2IG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMiBPQ1JFRiBDbGVhciAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0xNk9DUkVGQ0xSICAgICAgICAgKDB4MDAwMDI0MjBVKSAgIC8qITwgQ09NUDYgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNiBPQ1JFRiBDbGVhciAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0xNklDMSAgICAgICAgICAgICAgKDB4MDAwMDI4MjBVKSAgIC8qITwgQ09NUDYgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNiBJbnB1dCBDYXB0dXJlIDFVICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTRJQzQgICAgICAgICAgICAgICAoMHgwMDAwMkMyMFUpICAgLyohPCBDT01QNiBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTQgSW5wdXQgQ2FwdHVyZSA0VSAqLworLyogT3V0cHV0IFJlZGlyZWN0aW9uIHNwZWNpZmljIHRvIENPTVA3ICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTJJQzMgICAgICAgICAgICAgICAoMHgwMDAwMjA0MFUpICAgLyohPCBDT01QNyBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTIgSW5wdXQgQ2FwdHVyZSAzVSAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0xSUMyICAgICAgICAgICAgICAgKDB4MDAwMDI0NDBVKSAgIC8qITwgQ09NUDcgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xIElucHV0IENhcHR1cmUgMlUgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNMTdPQ1JFRkNMUiAgICAgICAgICgweDAwMDAyODQwVSkgICAvKiE8IENPTVA3IG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMTcgT0NSRUYgQ2xlYXIgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNMTdCS0lOICAgICAgICAgICAgICgweDAwMDAyQzQwVSkgICAvKiE8IENPTVA3IG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMTcgQnJlYWsgSW5wdXQgKEJLSU4pICovCisvKioKKyAgKiBAfQorICAqLworI2VsaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkKKy8qKiBAZGVmZ3JvdXAgQ09NUEV4X091dHB1dCBDT01QIEV4dGVuZGVkIE91dHB1dCAoU1RNMzJGMzAzeEUvU1RNMzJGMzk4eHggUHJvZHVjdCBkZXZpY2VzKQorICAqICAgICAgICBFbGVtZW50cyB2YWx1ZSBjb252ZW50aW9uIG9uIDE2IExTQjogMDBYWFhYMDAwWVlZWVlZWWIKKyAgKiAgICAgICAgICAgLSBZWVlZWVlZIDogQXBwbGljYWJsZSBjb21wYXJhdG9yIGluc3RhbmNlIG51bWJlciAoYml0bWFwIGZvcm1hdDogMDAwMDAwMSBmb3IgQ09NUDEsIDEwMDAwMDAgZm9yIENPTVA3KQorICAqICAgICAgICAgICAtIFhYWFggICAgOiBDT01QeE9VVFNFTCB2YWx1ZQorICAqIEB7CisgICovCisvKiBPdXRwdXQgUmVkaXJlY3Rpb24gdmFsdWVzIGNvbW1vbiB0byBhbGwgY29tcGFyYXRvcnMgQ09NUDEuLi5DT01QNyAqLworI2RlZmluZSBDT01QX09VVFBVVF9OT05FICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwN0ZVKSAgIC8qITwgQ09NUDEsIENPTVAyLi4uIG9yIENPTVA3IG91dHB1dCBpc24ndCBjb25uZWN0ZWQgdG8gb3RoZXIgcGVyaXBoZXJhbHMgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNMUJLSU4gICAgICAgICAgICAgICgweDAwMDAwNDdGVSkgICAvKiE8IENPTVAxLCBDT01QMi4uLiBvciBDT01QNyBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTEgQnJlYWsgSW5wdXQgKEJLSU4pICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTFCS0lOMiAgICAgICAgICAgICAoMHgwMDAwMDg3RlUpICAgLyohPCBDT01QMSwgQ09NUDIuLi4gb3IgQ09NUDcgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xIEJyZWFrIElucHV0IDIgKEJLSU4yKSAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU04QktJTiAgICAgICAgICAgICAgKDB4MDAwMDBDN0ZVKSAgIC8qITwgQ09NUDEsIENPTVAyLi4uIG9yIENPTVA3IG91dHB1dCBjb25uZWN0ZWQgdG8gVElNOCBCcmVhayBJbnB1dCAoQktJTikgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNOEJLSU4yICAgICAgICAgICAgICgweDAwMDAxMDdGVSkgICAvKiE8IENPTVAxLCBDT01QMi4uLiBvciBDT01QNyBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTggQnJlYWsgSW5wdXQgMiAoQktJTjIpICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTFCS0lOMl9USU04QktJTjIgICAoMHgwMDAwMTQ3RlUpICAgLyohPCBDT01QMSwgQ09NUDIuLi4gb3IgQ09NUDcgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xIEJyZWFrIElucHV0IDIgYW5kIFRJTTggQnJlYWsgSW5wdXQgMlUgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNMjBCS0lOICAgICAgICAgICAgICgweDAwMDAzMDdGVSkgICAvKiE8IENPTVAxLCBDT01QMi4uLiBvciBDT01QNyBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTIwIEJyZWFrIElucHV0IChCS0lOKSAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0yMEJLSU4yICAgICAgICAgICAgKDB4MDAwMDM0N0ZVKSAgIC8qITwgQ09NUDEsIENPTVAyLi4uIG9yIENPTVA3IG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMjAgQnJlYWsgSW5wdXQgMiAoQktJTjIpICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTFCS0lOMl9USU04QktJTjJfVElNMjBCS0lOMiAgICAoMHgwMDAwMzg3RlUpICAgLyohPCBDT01QMSwgQ09NUDIuLi4gb3IgQ09NUDcgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xIEJyZWFrIElucHV0IDJVLCBUSU04IEJyZWFrIElucHV0IDIgYW5kIFRJTTIwIEJyZWFrIElucHV0IDIgICovCisvKiBPdXRwdXQgUmVkaXJlY3Rpb24gY29tbW9uIHRvIENPTVAxLCBDT01QMiwgQ09NUDMgYW5kIENPTVA3ICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTFPQ1JFRkNMUiAgICAgICAgICAoMHgwMDAwMTg0N1UpICAgLyohPCBDT01QMSwgQ09NUDIsIENPTVAzIG9yIENPTVA3IG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMSBPQ1JFRiBDbGVhciAqLworLyogT3V0cHV0IFJlZGlyZWN0aW9uIGNvbW1vbiB0byBDT01QMSwgQ09NUDIgYW5kIENPTVAzICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTJPQ1JFRkNMUiAgICAgICAgICAoMHgwMDAwMjQwN1UpICAgLyohPCBDT01QMSwgQ09NUDIgb3IgQ09NUDMgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0yIE9DUkVGIENsZWFyICovCisvKiBPdXRwdXQgUmVkaXJlY3Rpb24gY29tbW9uIHRvIENPTVAxLCBDT01QMiwgQ09NUDQgYW5kIENPTVA1ICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTNPQ1JFRkNMUiAgICAgICAgICAoMHgwMDAwMkMxQlUpICAgLyohPCBDT01QMSwgQ09NUDIsIENPTVA0IG9yIENPTVA1IG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMyBPQ1JFRiBDbGVhciAqLworLyogT3V0cHV0IFJlZGlyZWN0aW9uIGNvbW1vbiB0byBDT01QNCwgQ09NUDUsIENPTVA2IGFuZCBDT01QNyAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU04T0NSRUZDTFIgICAgICAgICAgKDB4MDAwMDFDNzhVKSAgIC8qITwgQ09NUDQsIENPTVA1LCBDT01QNiBvciBDT01QNyBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTggT0NSRUYgQ2xlYXIgKi8KKy8qIE91dHB1dCBSZWRpcmVjdGlvbiBjb21tb24gdG8gQ09NUDEgYW5kIENPTVAyICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTFJQzEgICAgICAgICAgICAgICAoMHgwMDAwMUMwM1UpICAgLyohPCBDT01QMSBvciBDT01QMiBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTEgSW5wdXQgQ2FwdHVyZSAxVSAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0ySUM0ICAgICAgICAgICAgICAgKDB4MDAwMDIwMDNVKSAgIC8qITwgQ09NUDEgb3IgQ09NUDIgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0yIElucHV0IENhcHR1cmUgNFUgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNM0lDMSAgICAgICAgICAgICAgICgweDAwMDAyODAzVSkgICAvKiE8IENPTVAxIG9yIENPTVAyIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMyBJbnB1dCBDYXB0dXJlIDFVICovCisvKiBPdXRwdXQgUmVkaXJlY3Rpb24gc3BlY2lmaWMgdG8gQ09NUDIgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNMjBPQ1JFRkNMUiAgICAgICAgICgweDAwMDAzQzA0VSkgICAvKiE8IENPTVAyIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMjAgT0NSRUYgQ2xlYXIgKi8KKy8qIE91dHB1dCBSZWRpcmVjdGlvbiBzcGVjaWZpYyB0byBDT01QMyAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU00SUMxICAgICAgICAgICAgICAgKDB4MDAwMDFDMDRVKSAgIC8qITwgQ09NUDMgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU00IElucHV0IENhcHR1cmUgMVUgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNM0lDMiAgICAgICAgICAgICAgICgweDAwMDAyMDA0VSkgICAvKiE8IENPTVAzIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMyBJbnB1dCBDYXB0dXJlIDJVICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTE1SUMxICAgICAgICAgICAgICAoMHgwMDAwMjgwNFUpICAgLyohPCBDT01QMyBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTE1IElucHV0IENhcHR1cmUgMVUgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNMTVCS0lOICAgICAgICAgICAgICgweDAwMDAyQzA0VSkgICAvKiE8IENPTVAzIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMTUgQnJlYWsgSW5wdXQgKEJLSU4pICovCisvKiBPdXRwdXQgUmVkaXJlY3Rpb24gc3BlY2lmaWMgdG8gQ09NUDQgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNM0lDMyAgICAgICAgICAgICAgICgweDAwMDAxODA4VSkgICAvKiE8IENPTVA0IG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMyBJbnB1dCBDYXB0dXJlIDNVICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTE1SUMyICAgICAgICAgICAgICAoMHgwMDAwMjAwOFUpICAgLyohPCBDT01QNCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTE1IElucHV0IENhcHR1cmUgMlUgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNNElDMiAgICAgICAgICAgICAgICgweDAwMDAyNDA4VSkgICAvKiE8IENPTVA0IG91dHB1dCBjb25uZWN0ZWQgdG8gVElNNCBJbnB1dCBDYXB0dXJlIDJVICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTE1T0NSRUZDTFIgICAgICAgICAoMHgwMDAwMjgwOFUpICAgLyohPCBDT01QNCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTE1IE9DUkVGIENsZWFyICovCisvKiBPdXRwdXQgUmVkaXJlY3Rpb24gc3BlY2lmaWMgdG8gQ09NUDUgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNMklDMSAgICAgICAgICAgICAgICgweDAwMDAxODEwVSkgICAvKiE8IENPTVA1IG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMiBJbnB1dCBDYXB0dXJlIDFVICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTE3SUMxICAgICAgICAgICAgICAoMHgwMDAwMjAxMFUpICAgLyohPCBDT01QNSBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTE3IElucHV0IENhcHR1cmUgMVUgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNNElDMyAgICAgICAgICAgICAgICgweDAwMDAyNDEwVSkgICAvKiE8IENPTVA1IG91dHB1dCBjb25uZWN0ZWQgdG8gVElNNCBJbnB1dCBDYXB0dXJlIDNVICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTE2QktJTiAgICAgICAgICAgICAoMHgwMDAwMjgxMFUpICAgLyohPCBDT01QNSBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTE2IEJyZWFrIElucHV0IChCS0lOKSAqLworLyogT3V0cHV0IFJlZGlyZWN0aW9uIHNwZWNpZmljIHRvIENPTVA2ICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTJJQzIgICAgICAgICAgICAgICAoMHgwMDAwMTgyMFUpICAgLyohPCBDT01QNiBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTIgSW5wdXQgQ2FwdHVyZSAyVSAqLworI2RlZmluZSBDT01QX09VVFBVVF9DT01QNl9USU0yT0NSRUZDTFIgICAgKDB4MDAwMDIwMjBVKSAgIC8qITwgQ09NUDYgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0yIE9DUkVGIENsZWFyICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTE2T0NSRUZDTFIgICAgICAgICAoMHgwMDAwMjQyMFUpICAgLyohPCBDT01QNiBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTE2IE9DUkVGIENsZWFyICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTE2SUMxICAgICAgICAgICAgICAoMHgwMDAwMjgyMFUpICAgLyohPCBDT01QNiBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTE2IElucHV0IENhcHR1cmUgMVUgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNNElDNCAgICAgICAgICAgICAgICgweDAwMDAyQzIwVSkgICAvKiE8IENPTVA2IG91dHB1dCBjb25uZWN0ZWQgdG8gVElNNCBJbnB1dCBDYXB0dXJlIDRVICovCisvKiBPdXRwdXQgUmVkaXJlY3Rpb24gc3BlY2lmaWMgdG8gQ09NUDcgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNMklDMyAgICAgICAgICAgICAgICgweDAwMDAyMDQwVSkgICAvKiE8IENPTVA3IG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMiBJbnB1dCBDYXB0dXJlIDNVICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTFJQzIgICAgICAgICAgICAgICAoMHgwMDAwMjQ0MFUpICAgLyohPCBDT01QNyBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTEgSW5wdXQgQ2FwdHVyZSAyVSAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0xN09DUkVGQ0xSICAgICAgICAgKDB4MDAwMDI4NDBVKSAgIC8qITwgQ09NUDcgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNyBPQ1JFRiBDbGVhciAqLworI2RlZmluZSBDT01QX09VVFBVVF9USU0xN0JLSU4gICAgICAgICAgICAgKDB4MDAwMDJDNDBVKSAgIC8qITwgQ09NUDcgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNyBCcmVhayBJbnB1dCAoQktJTikgKi8KKy8qKgorICAqIEB9CisgICovCisjZWxpZiAgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKy8qKiBAZGVmZ3JvdXAgQ09NUEV4X091dHB1dCBDT01QIEV4dGVuZGVkIE91dHB1dCAoU1RNMzJGMzczeEMvU1RNMzJGMzc4eHggUHJvZHVjdCBkZXZpY2VzKQorICAqICAgICAgICBFbGVtZW50cyB2YWx1ZSBjb252ZW50aW9uOiAwMDAwMFhYWDAwMDAwMFlZYgorICAqICAgICAgICAgICAtIFlZICAgOiBBcHBsaWNhYmxlIGNvbXBhcmF0b3IgaW5zdGFuY2UgbnVtYmVyIChiaXRtYXAgZm9ybWF0OiAwMSBmb3IgQ09NUDEsIDEwIGZvciBDT01QMikKKyAgKiAgICAgICAgICAgLSBYWFggIDogQ09NUHhPVVRTRUwgdmFsdWUKKyAgKiBAeworICAqLworLyogT3V0cHV0IFJlZGlyZWN0aW9uIHZhbHVlcyBjb21tb24gdG8gYWxsIGNvbXBhcmF0b3JzIENPTVAxIGFuZCBDT01QMiAqLworI2RlZmluZSBDT01QX09VVFBVVF9OT05FICAgICAgICAgICAgICAgICAgKDB4MDAwM1UpICAgLyohPCBDT01QMSBvciBDT01QMiBvdXRwdXQgaXNuJ3QgY29ubmVjdGVkIHRvIG90aGVyIHBlcmlwaGVyYWxzICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTJJQzQgICAgICAgICAgICAgICAoMHgwNDAzVSkgICAvKiE8IENPTVAxIG9yIENPTVAyIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMiBJbnB1dCBDYXB0dXJlIDRVICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTJPQ1JFRkNMUiAgICAgICAgICAoMHgwNTAzVSkgICAvKiE8IENPTVAxIG9yIENPTVAyIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMiBPQ1JFRiBDbGVhciAqLworLyogT3V0cHV0IFJlZGlyZWN0aW9uIHNwZWNpZmljIHRvIENPTVAxICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTE1QktJTiAgICAgICAgICAgICAoMHgwMTAxVSkgICAvKiE8IENPTVAxIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMTUgQnJlYWsgSW5wdXQgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfQ09NUDFfVElNM0lDMSAgICAgICAgICgweDAyMDFVKSAgIC8qITwgQ09NUDEgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0zIElucHV0IENhcHR1cmUgMVUgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfQ09NUDFfVElNM09DUkVGQ0xSICAgICgweDAzMDFVKSAgIC8qITwgQ09NUDEgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0zIE9DUkVGIENsZWFyICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTVJQzQgICAgICAgICAgICAgICAoMHgwNjAxVSkgICAvKiE8IENPTVAxIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNNSBJbnB1dCBDYXB0dXJlIDRVICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTVPQ1JFRkNMUiAgICAgICAgICAoMHgwNzAxVSkgICAvKiE8IENPTVAxIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNNSBPQ1JFRiBDbGVhciAqLworLyogT3V0cHV0IFJlZGlyZWN0aW9uIHNwZWNpZmljIHRvIENPTVAyICovCisjZGVmaW5lIENPTVBfT1VUUFVUX1RJTTE2QktJTiAgICAgICAgICAgICAoMHgwMTAyVSkgICAvKiE8IENPTVAyIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMTYgQnJlYWsgSW5wdXQgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNNElDMSAgICAgICAgICAgICAgICgweDAyMDJVKSAgIC8qITwgQ09NUDIgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU00IElucHV0IENhcHR1cmUgMVUgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNNE9DUkVGQ0xSICAgICAgICAgICgweDAzMDJVKSAgIC8qITwgQ09NUDIgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU00IE9DUkVGIENsZWFyICovCisjZGVmaW5lIENPTVBfT1VUUFVUX0NPTVAyX1RJTTNJQzEgICAgICAgICAoMHgwNjAyVSkgICAvKiE8IENPTVAyIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMyBJbnB1dCBDYXB0dXJlIDFVICovCisjZGVmaW5lIENPTVBfT1VUUFVUX0NPTVAyX1RJTTNPQ1JFRkNMUiAgICAoMHgwNzAyVSkgICAvKiE8IENPTVAyIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMyBPQ1JFRiBDbGVhciAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAqLworCisjaWYgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpCisvKiogQGRlZmdyb3VwIENPTVBFeF9XaW5kb3dNb2RlIENPTVAgRXh0ZW5kZWQgV2luZG93TW9kZSAoU1RNMzJGMzAyeEMvU1RNMzJGMzAzeEMvU1RNMzJGMzU4eHggUHJvZHVjdCBkZXZpY2VzKQorICAqIEB7CisgICovCisjZGVmaW5lIENPTVBfV0lORE9XTU9ERV9ESVNBQkxFICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAvKiE8IFdpbmRvdyBtb2RlIGRpc2FibGVkICovCisjZGVmaW5lIENPTVBfV0lORE9XTU9ERV9FTkFCTEUgICAgICAgICAgICBDT01QX0NTUl9DT01QeFdORFdFTiAgICAvKiE8IFdpbmRvdyBtb2RlIGVuYWJsZWQ6IG5vbiBpbnZlcnRpbmcgaW5wdXQgb2YgY29tcGFyYXRvciBYICh4PTJVLDQsNlUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGNvbm5lY3RlZCB0byB0aGUgbm9uIGludmVydGluZyBpbnB1dCBvZiBjb21wYXJhdG9yIFgtMVUgKi8KKy8qKgorICAqIEB9CisgICovCisjZWxpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorLyoqIEBkZWZncm91cCBDT01QRXhfV2luZG93TW9kZSBDT01QIEV4dGVuZGVkIFdpbmRvd01vZGUgKFNUTTMyRjM3M3hDL1NUTTMyRjM3OHh4IFByb2R1Y3QgZGV2aWNlcykKKyAgKiBAeworICAqLworI2RlZmluZSBDT01QX1dJTkRPV01PREVfRElTQUJMRSAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgLyohPCBXaW5kb3cgbW9kZSBkaXNhYmxlZCAqLworI2RlZmluZSBDT01QX1dJTkRPV01PREVfRU5BQkxFICAgICAgICAgICAgKCh1aW50MzJfdClDT01QX0NTUl9DT01QeFdORFdFTikgLyohPCBXaW5kb3cgbW9kZSBlbmFibGVkOiBub24gaW52ZXJ0aW5nIGlucHV0IG9mIGNvbXBhcmF0b3IgMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBjb25uZWN0ZWQgdG8gdGhlIG5vbiBpbnZlcnRpbmcgaW5wdXQgb2YgY29tcGFyYXRvciAxIChQQTEpICovCisvKioKKyAgKiBAfQorICAqLworI2Vsc2UKKy8qKiBAZGVmZ3JvdXAgQ09NUEV4X1dpbmRvd01vZGUgQ09NUCBFeHRlbmRlZCBXaW5kb3dNb2RlIChPdGhlciBQcm9kdWN0IGRldmljZXMpCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ09NUF9XSU5ET1dNT0RFX0RJU0FCTEUgICAgICAgICAgICgweDAwMDAwMDAwVSkgIC8qITwgV2luZG93IG1vZGUgZGlzYWJsZWQgKG5vdCBhdmFpbGFibGUpICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4ICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUEV4X01vZGUgQ09NUCBFeHRlbmRlZCBNb2RlCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKworLyogUGxlYXNlIHJlZmVyIHRvIHRoZSBlbGVjdHJpY2FsIGNoYXJhY3RlcmlzdGljcyBpbiB0aGUgZGV2aWNlIGRhdGFzaGVldCBmb3IKKyAgIHRoZSBwb3dlciBjb25zdW1wdGlvbiB2YWx1ZXMgKi8KKyNkZWZpbmUgQ09NUF9NT0RFX0hJR0hTUEVFRCAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgLyohPCBIaWdoIFNwZWVkICovCisjZGVmaW5lIENPTVBfTU9ERV9NRURJVU1TUEVFRCAgICAgICAgICAgICBDT01QX0NTUl9DT01QeE1PREVfMCAgIC8qITwgTWVkaXVtIFNwZWVkICovCisjZGVmaW5lIENPTVBfTU9ERV9MT1dQT1dFUiAgICAgICAgICAgICAgICBDT01QX0NTUl9DT01QeE1PREVfMSAgIC8qITwgTG93IHBvd2VyIG1vZGUgKi8KKyNkZWZpbmUgQ09NUF9NT0RFX1VMVFJBTE9XUE9XRVIgICAgICAgICAgIENPTVBfQ1NSX0NPTVB4TU9ERSAgICAgLyohPCBVbHRyYS1sb3cgcG93ZXIgbW9kZSAqLworCisjZW5kaWYgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QRXhfSHlzdGVyZXNpcyBDT01QIEV4dGVuZGVkIEh5c3RlcmVzaXMKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorCisjZGVmaW5lIENPTVBfSFlTVEVSRVNJU19OT05FICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAvKiE8IE5vIGh5c3RlcmVzaXMgKi8KKyNkZWZpbmUgQ09NUF9IWVNURVJFU0lTX0xPVyAgICAgICAgICAgICAgIENPTVBfQ1NSX0NPTVB4SFlTVF8wICAgIC8qITwgSHlzdGVyZXNpcyBsZXZlbCBsb3cgKi8KKyNkZWZpbmUgQ09NUF9IWVNURVJFU0lTX01FRElVTSAgICAgICAgICAgIENPTVBfQ1NSX0NPTVB4SFlTVF8xICAgIC8qITwgSHlzdGVyZXNpcyBsZXZlbCBtZWRpdW0gKi8KKyNkZWZpbmUgQ09NUF9IWVNURVJFU0lTX0hJR0ggICAgICAgICAgICAgIENPTVBfQ1NSX0NPTVB4SFlTVCAgICAgIC8qITwgSHlzdGVyZXNpcyBsZXZlbCBoaWdoICovCisKKyNlbHNlCisKKyNkZWZpbmUgQ09NUF9IWVNURVJFU0lTX05PTkUgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgIC8qITwgTm8gaHlzdGVyZXNpcyAqLworCisjZW5kaWYgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KQorLyoqIEBkZWZncm91cCBDT01QRXhfQmxhbmtpbmdTcmNlICBDT01QIEV4dGVuZGVkIEJsYW5raW5nIFNvdXJjZSAoU1RNMzJGMzAxeDgvU1RNMzJGMzAyeDgvU1RNMzJGMzAzeDgvU1RNMzJGMzM0eDgvU1RNMzJGMzE4eHgvU1RNMzJGMzI4eHggUHJvZHVjdCBkZXZpY2VzKQorICAqIEB7CisgICovCisvKiBObyBibGFua2luZyBzb3VyY2UgY2FuIGJlIHNlbGVjdGVkIGZvciBhbGwgY29tcGFyYXRvcnMgKi8KKyNkZWZpbmUgQ09NUF9CTEFOS0lOR1NSQ0VfTk9ORSAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAvKiE8IE5vIGJsYW5raW5nIHNvdXJjZSAqLworLyogQmxhbmtpbmcgc291cmNlIGZvciBDT01QMiAqLworI2RlZmluZSBDT01QX0JMQU5LSU5HU1JDRV9USU0xT0M1ICAgICAgICAgICAgICBDT01QX0NTUl9DT01QeEJMQU5LSU5HXzAgIC8qITwgVElNMSBPQzUgc2VsZWN0ZWQgYXMgYmxhbmtpbmcgc291cmNlIGZvciBDT01QMiAqLworI2RlZmluZSBDT01QX0JMQU5LSU5HU1JDRV9USU0yT0MzICAgICAgICAgICAgICBDT01QX0NTUl9DT01QeEJMQU5LSU5HXzEgIC8qITwgVElNMiBPQzMgc2VsZWN0ZWQgYXMgYmxhbmtpbmcgc291cmNlIGZvciBDT01QMiAqLworI2RlZmluZSBDT01QX0JMQU5LSU5HU1JDRV9USU0zT0MzICAgICAgICAgICAgICAoQ09NUF9DU1JfQ09NUHhCTEFOS0lOR18wfENPTVBfQ1NSX0NPTVB4QkxBTktJTkdfMSkgICAgLyohPCBUSU0zIE9DMyBzZWxlY3RlZCBhcyBibGFua2luZyBzb3VyY2UgZm9yIENPTVAyICovCisvKiBCbGFua2luZyBzb3VyY2UgZm9yIENPTVA0ICovCisjZGVmaW5lIENPTVBfQkxBTktJTkdTUkNFX1RJTTNPQzQgICAgICAgICAgICAgIENPTVBfQ1NSX0NPTVB4QkxBTktJTkdfMCAgICAvKiE8IFRJTTMgT0M0IHNlbGVjdGVkIGFzIGJsYW5raW5nIHNvdXJjZSBmb3IgQ09NUDQgKi8KKyNkZWZpbmUgQ09NUF9CTEFOS0lOR1NSQ0VfVElNMTVPQzEgICAgICAgICAgICAgKENPTVBfQ1NSX0NPTVB4QkxBTktJTkdfMHxDT01QX0NTUl9DT01QeEJMQU5LSU5HXzEpICAgIC8qITwgVElNMTUgT0MxIHNlbGVjdGVkIGFzIGJsYW5raW5nIHNvdXJjZSBmb3IgQ09NUDQgKi8KKy8qIEJsYW5raW5nIHNvdXJjZSBmb3IgQ09NUDYgKi8KKyNkZWZpbmUgQ09NUF9CTEFOS0lOR1NSQ0VfVElNMk9DNCAgICAgICAgICAgICAgKENPTVBfQ1NSX0NPTVB4QkxBTktJTkdfMHxDT01QX0NTUl9DT01QeEJMQU5LSU5HXzEpICAgIC8qITwgVElNMiBPQzQgc2VsZWN0ZWQgYXMgYmxhbmtpbmcgc291cmNlIGZvciBDT01QNiAqLworI2RlZmluZSBDT01QX0JMQU5LSU5HU1JDRV9USU0xNU9DMiAgICAgICAgICAgICBDT01QX0NTUl9DT01QeEJMQU5LSU5HXzIgICAgLyohPCBUSU0xNSBPQzIgc2VsZWN0ZWQgYXMgYmxhbmtpbmcgc291cmNlIGZvciBDT01QNiAqLworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8XAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpCisvKiogQGRlZmdyb3VwIENPTVBFeF9CbGFua2luZ1NyY2UgQ09NUCBFeHRlbmRlZCBCbGFua2luZyBTb3VyY2UgKFNUTTMyRjMwMnhFL1NUTTMyRjMwMnhDIFByb2R1Y3QgZGV2aWNlcykKKyAgKiBAeworICAqLworLyogTm8gYmxhbmtpbmcgc291cmNlIGNhbiBiZSBzZWxlY3RlZCBmb3IgYWxsIGNvbXBhcmF0b3JzICovCisjZGVmaW5lIENPTVBfQkxBTktJTkdTUkNFX05PTkUgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgLyohPCBObyBibGFua2luZyBzb3VyY2UgKi8KKy8qIEJsYW5raW5nIHNvdXJjZSBjb21tb24gZm9yIENPTVAxIGFuZCBDT01QMiAqLworI2RlZmluZSBDT01QX0JMQU5LSU5HU1JDRV9USU0xT0M1ICAgICAgICAgICAgICBDT01QX0NTUl9DT01QeEJMQU5LSU5HXzAgIC8qITwgVElNMSBPQzUgc2VsZWN0ZWQgYXMgYmxhbmtpbmcgc291cmNlIGZvciBDT01QMSBhbmQgQ09NUDIgKi8KKy8qIEJsYW5raW5nIHNvdXJjZSBjb21tb24gZm9yIENPTVAxIGFuZCBDT01QMiAqLworI2RlZmluZSBDT01QX0JMQU5LSU5HU1JDRV9USU0yT0MzICAgICAgICAgICAgICBDT01QX0NTUl9DT01QeEJMQU5LSU5HXzEgIC8qITwgVElNMiBPQzMgc2VsZWN0ZWQgYXMgYmxhbmtpbmcgc291cmNlIGZvciBDT01QMSBhbmQgQ09NUDIgKi8KKy8qIEJsYW5raW5nIHNvdXJjZSBjb21tb24gZm9yIENPTVAxIGFuZCBDT01QMiAqLworI2RlZmluZSBDT01QX0JMQU5LSU5HU1JDRV9USU0zT0MzICAgICAgICAgICAgICAoQ09NUF9DU1JfQ09NUHhCTEFOS0lOR18wfENPTVBfQ1NSX0NPTVB4QkxBTktJTkdfMSkgICAgLyohPCBUSU0zIE9DMyBzZWxlY3RlZCBhcyBibGFua2luZyBzb3VyY2UgZm9yIENPTVAxIGFuZCBDT01QMiAqLworLyogQmxhbmtpbmcgc291cmNlIGZvciBDT01QNCAqLworI2RlZmluZSBDT01QX0JMQU5LSU5HU1JDRV9USU0zT0M0ICAgICAgICAgICAgICBDT01QX0NTUl9DT01QeEJMQU5LSU5HXzAgICAgLyohPCBUSU0zIE9DNCBzZWxlY3RlZCBhcyBibGFua2luZyBzb3VyY2UgZm9yIENPTVA0ICovCisjZGVmaW5lIENPTVBfQkxBTktJTkdTUkNFX1RJTTE1T0MxICAgICAgICAgICAgIChDT01QX0NTUl9DT01QeEJMQU5LSU5HXzB8Q09NUF9DU1JfQ09NUHhCTEFOS0lOR18xKSAgICAvKiE8IFRJTTE1IE9DMSBzZWxlY3RlZCBhcyBibGFua2luZyBzb3VyY2UgZm9yIENPTVA0ICovCisvKiBCbGFua2luZyBzb3VyY2UgZm9yIENPTVA2ICovCisjZGVmaW5lIENPTVBfQkxBTktJTkdTUkNFX1RJTTJPQzQgICAgICAgICAgICAgIChDT01QX0NTUl9DT01QeEJMQU5LSU5HXzB8Q09NUF9DU1JfQ09NUHhCTEFOS0lOR18xKSAgICAvKiE8IFRJTTIgT0M0IHNlbGVjdGVkIGFzIGJsYW5raW5nIHNvdXJjZSBmb3IgQ09NUDYgKi8KKyNkZWZpbmUgQ09NUF9CTEFOS0lOR1NSQ0VfVElNMTVPQzIgICAgICAgICAgICAgQ09NUF9DU1JfQ09NUHhCTEFOS0lOR18yICAgIC8qITwgVElNMTUgT0MyIHNlbGVjdGVkIGFzIGJsYW5raW5nIHNvdXJjZSBmb3IgQ09NUDYgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkKKy8qKiBAZGVmZ3JvdXAgQ09NUEV4X0JsYW5raW5nU3JjZSBDT01QIEV4dGVuZGVkIEJsYW5raW5nIFNvdXJjZSAoU1RNMzJGMzAzeEUvU1RNMzJGMzk4eHgvU1RNMzJGMzAzeEMvU1RNMzJGMzU4eHggUHJvZHVjdCBkZXZpY2VzKQorICAqIEB7CisgICovCisvKiBObyBibGFua2luZyBzb3VyY2UgY2FuIGJlIHNlbGVjdGVkIGZvciBhbGwgY29tcGFyYXRvcnMgKi8KKyNkZWZpbmUgQ09NUF9CTEFOS0lOR1NSQ0VfTk9ORSAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAvKiE8IE5vIGJsYW5raW5nIHNvdXJjZSAqLworLyogQmxhbmtpbmcgc291cmNlIGNvbW1vbiBmb3IgQ09NUDEsIENPTVAyLCBDT01QMyBhbmQgQ09NUDcgKi8KKyNkZWZpbmUgQ09NUF9CTEFOS0lOR1NSQ0VfVElNMU9DNSAgICAgICAgICAgICAgQ09NUF9DU1JfQ09NUHhCTEFOS0lOR18wICAvKiE8IFRJTTEgT0M1IHNlbGVjdGVkIGFzIGJsYW5raW5nIHNvdXJjZSBmb3IgQ09NUDEsIENPTVAyLCBDT01QMyBhbmQgQ09NUDcgKi8KKy8qIEJsYW5raW5nIHNvdXJjZSBjb21tb24gZm9yIENPTVAxIGFuZCBDT01QMiAqLworI2RlZmluZSBDT01QX0JMQU5LSU5HU1JDRV9USU0yT0MzICAgICAgICAgICAgICBDT01QX0NTUl9DT01QeEJMQU5LSU5HXzEgIC8qITwgVElNMiBPQzUgc2VsZWN0ZWQgYXMgYmxhbmtpbmcgc291cmNlIGZvciBDT01QMSBhbmQgQ09NUDIgKi8KKy8qIEJsYW5raW5nIHNvdXJjZSBjb21tb24gZm9yIENPTVAxLCBDT01QMiBhbmQgQ09NUDUgKi8KKyNkZWZpbmUgQ09NUF9CTEFOS0lOR1NSQ0VfVElNM09DMyAgICAgICAgICAgICAgKENPTVBfQ1NSX0NPTVB4QkxBTktJTkdfMHxDT01QX0NTUl9DT01QeEJMQU5LSU5HXzEpICAgIC8qITwgVElNMiBPQzMgc2VsZWN0ZWQgYXMgYmxhbmtpbmcgc291cmNlIGZvciBDT01QMSwgQ09NUDIgYW5kIENPTVA1ICovCisvKiBCbGFua2luZyBzb3VyY2UgY29tbW9uIGZvciBDT01QMyBhbmQgQ09NUDYgKi8KKyNkZWZpbmUgQ09NUF9CTEFOS0lOR1NSQ0VfVElNMk9DNCAgICAgICAgICAgICAgKENPTVBfQ1NSX0NPTVB4QkxBTktJTkdfMHxDT01QX0NTUl9DT01QeEJMQU5LSU5HXzEpICAgIC8qITwgVElNMiBPQzQgc2VsZWN0ZWQgYXMgYmxhbmtpbmcgc291cmNlIGZvciBDT01QMyBhbmQgQ09NUDYgKi8KKy8qIEJsYW5raW5nIHNvdXJjZSBjb21tb24gZm9yIENPTVA0LCBDT01QNSwgQ09NUDYgYW5kIENPTVA3ICovCisjZGVmaW5lIENPTVBfQkxBTktJTkdTUkNFX1RJTThPQzUgICAgICAgICAgICAgIENPTVBfQ1NSX0NPTVB4QkxBTktJTkdfMSAgLyohPCBUSU04IE9DNSBzZWxlY3RlZCBhcyBibGFua2luZyBzb3VyY2UgZm9yIENPTVA0LCBDT01QNSwgQ09NUDYgYW5kIENPTVA3ICovCisvKiBCbGFua2luZyBzb3VyY2UgZm9yIENPTVA0ICovCisjZGVmaW5lIENPTVBfQkxBTktJTkdTUkNFX1RJTTNPQzQgICAgICAgICAgICAgIENPTVBfQ1NSX0NPTVB4QkxBTktJTkdfMCAgLyohPCBUSU0zIE9DNCBzZWxlY3RlZCBhcyBibGFua2luZyBzb3VyY2UgZm9yIENPTVA0ICovCisjZGVmaW5lIENPTVBfQkxBTktJTkdTUkNFX1RJTTE1T0MxICAgICAgICAgICAgIChDT01QX0NTUl9DT01QeEJMQU5LSU5HXzB8Q09NUF9DU1JfQ09NUHhCTEFOS0lOR18xKSAgICAvKiE8IFRJTTE1IE9DMSBzZWxlY3RlZCBhcyBibGFua2luZyBzb3VyY2UgZm9yIENPTVA0ICovCisvKiBCbGFua2luZyBzb3VyY2UgY29tbW9uIGZvciBDT01QNiBhbmQgQ09NUDcgKi8KKyNkZWZpbmUgQ09NUF9CTEFOS0lOR1NSQ0VfVElNMTVPQzIgICAgICAgICAgICAgQ09NUF9DU1JfQ09NUHhCTEFOS0lOR18yICAvKiE8IFRJTTE1IE9DMiBzZWxlY3RlZCBhcyBibGFua2luZyBzb3VyY2UgZm9yIENPTVA2IGFuZCBDT01QNyAqLworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisvKiogQGRlZmdyb3VwIENPTVBFeF9CbGFua2luZ1NyY2UgQ09NUCBFeHRlbmRlZCBCbGFua2luZyBTb3VyY2UgKFNUTTMyRjM3M3hDL1NUTTMyRjM3OHh4IFByb2R1Y3QgZGV2aWNlcykKKyAgKiBAeworICAqLworLyogTm8gYmxhbmtpbmcgc291cmNlIGNhbiBiZSBzZWxlY3RlZCBmb3IgYWxsIGNvbXBhcmF0b3JzICovCisjZGVmaW5lIENPTVBfQkxBTktJTkdTUkNFX05PTkUgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgIC8qITwgTm8gYmxhbmtpbmcgc291cmNlICovCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8KKworLyoqIEBkZWZncm91cCBDT01QX0ZsYWcgQ09NUCBGbGFnCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorI2RlZmluZSBDT01QX0ZMQUdfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICBDT01QX0NTUl9DT01QMUxPQ0sgICAgICAvKiE8IExvY2sgZmxhZyAqLworI2Vsc2UKKyNkZWZpbmUgQ09NUF9GTEFHX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgQ09NUF9DU1JfTE9DSyAgICAgICAgICAgLyohPCBMb2NrIGZsYWcgKi8KKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworLyoqCisgICogQH0KKyAgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDT01QRXhfRXhwb3J0ZWRfTWFjcm9zIENPTVAgRXh0ZW5kZWQgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIGNvbXBhcmF0b3IuCisgICogQHBhcmFtICBfX0hBTkRMRV9fICBDT01QIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHVpbnQzMl90IHJlZ3NoaWZ0ID0gQ09NUF9DU1JfQ09NUDFfU0hJRlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBDT01QMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJlZ3NoaWZ0ID0gQ09NUF9DU1JfQ09NUDJfU0hJRlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIFNFVF9CSVQoQ09NUC0+Q1NSLCAodWludDMyX3QpQ09NUF9DU1JfQ09NUHhFTiA8PCByZWdzaGlmdCk7ICAgICAgICAgIFwKKyAgICAgICAgfSB3aGlsZSgwVSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgY29tcGFyYXRvci4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gIENPTVAgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgdWludDMyX3QgcmVnc2hpZnQgPSBDT01QX0NTUl9DT01QMV9TSElGVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBpZigoX19IQU5ETEVfXyktPkluc3RhbmNlID09IENPTVAyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmVnc2hpZnQgPSBDT01QX0NTUl9DT01QMl9TSElGVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgQ0xFQVJfQklUKENPTVAtPkNTUiwgKHVpbnQzMl90KUNPTVBfQ1NSX0NPTVB4RU4gPDwgcmVnc2hpZnQpOyAgICAgICAgXAorICAgICAgICB9IHdoaWxlKDBVKQorCisvKioKKyAgKiBAYnJpZWYgIExvY2sgYSBjb21wYXJhdG9yIGluc3RhbmNlCisgICogQHBhcmFtICBfX0hBTkRMRV9fICBDT01QIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9MT0NLKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHVpbnQzMl90IHJlZ3NoaWZ0ID0gQ09NUF9DU1JfQ09NUDFfU0hJRlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBDT01QMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJlZ3NoaWZ0ID0gQ09NUF9DU1JfQ09NUDJfU0hJRlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIFNFVF9CSVQoQ09NUC0+Q1NSLCAodWludDMyX3QpQ09NUF9DU1JfQ09NUHhMT0NLIDw8IHJlZ3NoaWZ0KTsgICAgICAgIFwKKyAgICAgICAgfSB3aGlsZSgwVSkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIENPTVAgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyAgQ09NUCBIYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyAgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDT01QX0ZMQUdfTE9DSyAgIGxvY2sgZmxhZworICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IENPTVAxKSA/ICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1NSICYgKF9fRkxBR19fKSkgPT0gKF9fRkxBR19fKSkgXAorICAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DU1IgJiAodWludDMyX3QpKChfX0ZMQUdfXykgPDwgQ09NUF9DU1JfQ09NUDJfU0hJRlQpID09IChfX0ZMQUdfXykpKSkKKworI2Vsc2UKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIHNwZWNpZmllZCBjb21wYXJhdG9yLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyAgQ09NUCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfRU5BQkxFKF9fSEFORExFX18pICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1NSLCBDT01QX0NTUl9DT01QeEVOKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBjb21wYXJhdG9yLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyAgQ09NUCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfRElTQUJMRShfX0hBTkRMRV9fKSAgIENMRUFSX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DU1IsIENPTVBfQ1NSX0NPTVB4RU4pCisKKy8qKgorICAqIEBicmllZiAgTG9jayBhIGNvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0xPQ0soX19IQU5ETEVfXykgICAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNTUiwgQ09NUF9DU1JfQ09NUHhMT0NLKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgQ09NUCBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fICBDT01QIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fICBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIENPTVBfRkxBR19MT0NLICAgbG9jayBmbGFnCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRkxBR19fIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1NSICYgKF9fRkxBR19fKSkgPT0gKF9fRkxBR19fKSkKKworI2VuZGlmIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSB8fCAgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8ICBcCisgICAgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIENPTVAxIEVYVEkgbGluZSByaXNpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgICAgU0VUX0JJVChFWFRJLT5SVFNSLCBDT01QX0VYVElfTElORV9DT01QMSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QMSBFWFRJIGxpbmUgcmlzaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QMV9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSAgIENMRUFSX0JJVChFWFRJLT5SVFNSLCBDT01QX0VYVElfTElORV9DT01QMSkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIENPTVAxIEVYVEkgbGluZSBmYWxsaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QMV9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSAgIFNFVF9CSVQoRVhUSS0+RlRTUiwgQ09NUF9FWFRJX0xJTkVfQ09NUDEpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgQ09NUDEgRVhUSSBsaW5lIGZhbGxpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAxX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSAgQ0xFQVJfQklUKEVYVEktPkZUU1IsIENPTVBfRVhUSV9MSU5FX0NPTVAxKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUDEgRVhUSSBsaW5lIHJpc2luZyAmIGZhbGxpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSAgIGRvIHsgXAorICAgIF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTsgXAorICAgIF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCk7IFwKKyAgfSB3aGlsZSgwVSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QMSBFWFRJIGxpbmUgcmlzaW5nICYgZmFsbGluZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSAgZG8geyBcCisgICAgX19IQUxfQ09NUF9DT01QMV9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKTsgXAorICAgIF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpOyBcCisgIH0gd2hpbGUoMFUpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBDT01QMSBFWFRJIGxpbmUgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9FTkFCTEVfSVQoKSAgICAgICAgICAgICBTRVRfQklUKEVYVEktPklNUiwgQ09NUF9FWFRJX0xJTkVfQ09NUDEpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgQ09NUDEgRVhUSSBsaW5lIGluIGludGVycnVwdCBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAxX0VYVElfRElTQUJMRV9JVCgpICAgICAgICAgICAgQ0xFQVJfQklUKEVYVEktPklNUiwgQ09NUF9FWFRJX0xJTkVfQ09NUDEpCisKKy8qKgorICAqIEBicmllZiAgR2VuZXJhdGUgYSBzb2Z0d2FyZSBpbnRlcnJ1cHQgb24gdGhlIENPTVAxIEVYVEkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QMV9FWFRJX0dFTkVSQVRFX1NXSVQoKSAgICAgICAgIFNFVF9CSVQoRVhUSS0+U1dJRVIsIENPTVBfRVhUSV9MSU5FX0NPTVAxKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUDEgRVhUSSBsaW5lIGluIGV2ZW50IG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9FTkFCTEVfRVZFTlQoKSAgICAgICAgICAgU0VUX0JJVChFWFRJLT5FTVIsIENPTVBfRVhUSV9MSU5FX0NPTVAxKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIENPTVAxIEVYVEkgbGluZSBpbiBldmVudCBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAxX0VYVElfRElTQUJMRV9FVkVOVCgpICAgICAgICAgIENMRUFSX0JJVChFWFRJLT5FTVIsIENPTVBfRVhUSV9MSU5FX0NPTVAxKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIENPTVAxIEVYVEkgbGluZSBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHJldHZhbCBSRVNFVCBvciBTRVQKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QMV9FWFRJX0dFVF9GTEFHKCkgICAgICAgICAgICAgIFJFQURfQklUKEVYVEktPlBSLCBDT01QX0VYVElfTElORV9DT01QMSkKKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgQ09NUDEgRVhUSSBmbGFnLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAxX0VYVElfQ0xFQVJfRkxBRygpICAgICAgICAgICAgV1JJVEVfUkVHKEVYVEktPlBSLCBDT01QX0VYVElfTElORV9DT01QMSkKKworI2VuZGlmIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUDIgRVhUSSBsaW5lIHJpc2luZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSAgICBTRVRfQklUKEVYVEktPlJUU1IsIENPTVBfRVhUSV9MSU5FX0NPTVAyKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIENPTVAyIEVYVEkgbGluZSByaXNpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpICAgQ0xFQVJfQklUKEVYVEktPlJUU1IsIENPTVBfRVhUSV9MSU5FX0NPTVAyKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUDIgRVhUSSBsaW5lIGZhbGxpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAyX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpICAgU0VUX0JJVChFWFRJLT5GVFNSLCBDT01QX0VYVElfTElORV9DT01QMikKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QMiBFWFRJIGxpbmUgZmFsbGluZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpICBDTEVBUl9CSVQoRVhUSS0+RlRTUiwgQ09NUF9FWFRJX0xJTkVfQ09NUDIpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBDT01QMiBFWFRJIGxpbmUgcmlzaW5nICYgZmFsbGluZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfUklTSU5HX0ZBTExJTkdfRURHRSgpICAgZG8geyBcCisgICAgX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpOyBcCisgICAgX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKTsgXAorICB9IHdoaWxlKDBVKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIENPTVAyIEVYVEkgbGluZSByaXNpbmcgJiBmYWxsaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfUklTSU5HX0ZBTExJTkdfRURHRSgpICAgZG8geyBcCisgICAgX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKTsgXAorICAgIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpOyBcCisgIH0gd2hpbGUoMFUpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBDT01QMiBFWFRJIGxpbmUgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfSVQoKSAgICAgICAgICAgICBTRVRfQklUKEVYVEktPklNUiwgQ09NUF9FWFRJX0xJTkVfQ09NUDIpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgQ09NUDIgRVhUSSBsaW5lIGluIGludGVycnVwdCBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9JVCgpICAgICAgICAgICAgQ0xFQVJfQklUKEVYVEktPklNUiwgQ09NUF9FWFRJX0xJTkVfQ09NUDIpCisKKy8qKgorICAqIEBicmllZiAgR2VuZXJhdGUgYSBzb2Z0d2FyZSBpbnRlcnJ1cHQgb24gdGhlIENPTVAyIEVYVEkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QMl9FWFRJX0dFTkVSQVRFX1NXSVQoKSAgICAgICAgIFNFVF9CSVQoRVhUSS0+U1dJRVIsIENPTVBfRVhUSV9MSU5FX0NPTVAyKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUDIgRVhUSSBsaW5lIGluIGV2ZW50IG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfRVZFTlQoKSAgICAgICAgICBTRVRfQklUKEVYVEktPkVNUiwgQ09NUF9FWFRJX0xJTkVfQ09NUDIpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgQ09NUDIgRVhUSSBsaW5lIGluIGV2ZW50IG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX0VWRU5UKCkgICAgICAgICBDTEVBUl9CSVQoRVhUSS0+RU1SLCBDT01QX0VYVElfTElORV9DT01QMikKKworLyoqCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBDT01QMiBFWFRJIGxpbmUgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEByZXR2YWwgUkVTRVQgb3IgU0VUCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9HRVRfRkxBRygpICAgICAgICAgICAgICBSRUFEX0JJVChFWFRJLT5QUiwgQ09NUF9FWFRJX0xJTkVfQ09NUDIpCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIENPTVAyIEVYVEkgZmxhZy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QMl9FWFRJX0NMRUFSX0ZMQUcoKSAgICAgICAgICAgIFdSSVRFX1JFRyhFWFRJLT5QUiwgQ09NUF9FWFRJX0xJTkVfQ09NUDIpCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIENPTVAzIEVYVEkgbGluZSByaXNpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAzX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgICAgU0VUX0JJVChFWFRJLT5SVFNSLCBDT01QX0VYVElfTElORV9DT01QMykKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QMyBFWFRJIGxpbmUgcmlzaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QM19FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSAgIENMRUFSX0JJVChFWFRJLT5SVFNSLCBDT01QX0VYVElfTElORV9DT01QMykKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIENPTVAzIEVYVEkgbGluZSBmYWxsaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QM19FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSAgIFNFVF9CSVQoRVhUSS0+RlRTUiwgQ09NUF9FWFRJX0xJTkVfQ09NUDMpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgQ09NUDMgRVhUSSBsaW5lIGZhbGxpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAzX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSAgQ0xFQVJfQklUKEVYVEktPkZUU1IsIENPTVBfRVhUSV9MSU5FX0NPTVAzKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUDMgRVhUSSBsaW5lIHJpc2luZyAmIGZhbGxpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAzX0VYVElfRU5BQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSAgIGRvIHsgXAorICAgIF9fSEFMX0NPTVBfQ09NUDNfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTsgXAorICAgIF9fSEFMX0NPTVBfQ09NUDNfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCk7IFwKKyAgfSB3aGlsZSgwVSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QMyBFWFRJIGxpbmUgcmlzaW5nICYgZmFsbGluZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDNfRVhUSV9ESVNBQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSAgIGRvIHsgXAorICAgIF9fSEFMX0NPTVBfQ09NUDNfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCk7IFwKKyAgICBfX0hBTF9DT01QX0NPTVAzX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKTsgXAorICB9IHdoaWxlKDBVKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUDMgRVhUSSBsaW5lIGluIGludGVycnVwdCBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAzX0VYVElfRU5BQkxFX0lUKCkgICAgICAgICAgICAgU0VUX0JJVChFWFRJLT5JTVIsIENPTVBfRVhUSV9MSU5FX0NPTVAzKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIENPTVAzIEVYVEkgbGluZSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QM19FWFRJX0RJU0FCTEVfSVQoKSAgICAgICAgICAgIENMRUFSX0JJVChFWFRJLT5JTVIsIENPTVBfRVhUSV9MSU5FX0NPTVAzKQorCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlIGEgc29mdHdhcmUgaW50ZXJydXB0IG9uIHRoZSBDT01QMyBFWFRJIGxpbmUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDNfRVhUSV9HRU5FUkFURV9TV0lUKCkgICAgICAgICBTRVRfQklUKEVYVEktPlNXSUVSLCBDT01QX0VYVElfTElORV9DT01QMykKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIENPTVAzIEVYVEkgbGluZSBpbiBldmVudCBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAzX0VYVElfRU5BQkxFX0VWRU5UKCkgICAgICAgICAgU0VUX0JJVChFWFRJLT5FTVIsIENPTVBfRVhUSV9MSU5FX0NPTVAzKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIENPTVAzIEVYVEkgbGluZSBpbiBldmVudCBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAzX0VYVElfRElTQUJMRV9FVkVOVCgpICAgICAgICAgQ0xFQVJfQklUKEVYVEktPkVNUiwgQ09NUF9FWFRJX0xJTkVfQ09NUDMpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgQ09NUDMgRVhUSSBsaW5lIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcmV0dmFsIFJFU0VUIG9yIFNFVAorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAzX0VYVElfR0VUX0ZMQUcoKSAgICAgICAgICAgICAgUkVBRF9CSVQoRVhUSS0+UFIsIENPTVBfRVhUSV9MSU5FX0NPTVAzKQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBDT01QMyBFWFRJIGZsYWcuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDNfRVhUSV9DTEVBUl9GTEFHKCkgICAgICAgICAgICBXUklURV9SRUcoRVhUSS0+UFIsIENPTVBfRVhUSV9MSU5FX0NPTVAzKQorCisjZW5kaWYgLyogU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkgfHwgIFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSB8fCAgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8ICBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIENPTVA0IEVYVEkgbGluZSByaXNpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVA0X0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgICAgU0VUX0JJVChFWFRJLT5SVFNSLCBDT01QX0VYVElfTElORV9DT01QNCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QNCBFWFRJIGxpbmUgcmlzaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QNF9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSAgIENMRUFSX0JJVChFWFRJLT5SVFNSLCBDT01QX0VYVElfTElORV9DT01QNCkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIENPTVA0IEVYVEkgbGluZSBmYWxsaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QNF9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSAgIFNFVF9CSVQoRVhUSS0+RlRTUiwgQ09NUF9FWFRJX0xJTkVfQ09NUDQpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgQ09NUDQgRVhUSSBsaW5lIGZhbGxpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVA0X0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSAgQ0xFQVJfQklUKEVYVEktPkZUU1IsIENPTVBfRVhUSV9MSU5FX0NPTVA0KQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUDQgRVhUSSBsaW5lIHJpc2luZyAmIGZhbGxpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVA0X0VYVElfRU5BQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSAgIGRvIHsgXAorICAgIF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTsgXAorICAgIF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCk7IFwKKyAgfSB3aGlsZSgwVSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QNCBFWFRJIGxpbmUgcmlzaW5nICYgZmFsbGluZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9ESVNBQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSAgIGRvIHsgXAorICAgIF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCk7IFwKKyAgICBfX0hBTF9DT01QX0NPTVA0X0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKTsgXAorICB9IHdoaWxlKDBVKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUDQgRVhUSSBsaW5lIGluIGludGVycnVwdCBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVA0X0VYVElfRU5BQkxFX0lUKCkgICAgICAgICAgICAgU0VUX0JJVChFWFRJLT5JTVIsIENPTVBfRVhUSV9MSU5FX0NPTVA0KQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIENPTVA0IEVYVEkgbGluZSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QNF9FWFRJX0RJU0FCTEVfSVQoKSAgICAgICAgICAgIENMRUFSX0JJVChFWFRJLT5JTVIsIENPTVBfRVhUSV9MSU5FX0NPTVA0KQorCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlIGEgc29mdHdhcmUgaW50ZXJydXB0IG9uIHRoZSBDT01QNCBFWFRJIGxpbmUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9HRU5FUkFURV9TV0lUKCkgICAgICAgICBTRVRfQklUKEVYVEktPlNXSUVSLCBDT01QX0VYVElfTElORV9DT01QNCkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIENPTVA0IEVYVEkgbGluZSBpbiBldmVudCBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVA0X0VYVElfRU5BQkxFX0VWRU5UKCkgICAgICAgICAgU0VUX0JJVChFWFRJLT5FTVIsIENPTVBfRVhUSV9MSU5FX0NPTVA0KQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIENPTVA0IEVYVEkgbGluZSBpbiBldmVudCBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVA0X0VYVElfRElTQUJMRV9FVkVOVCgpICAgICAgICAgQ0xFQVJfQklUKEVYVEktPkVNUiwgQ09NUF9FWFRJX0xJTkVfQ09NUDQpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgQ09NUDQgRVhUSSBsaW5lIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcmV0dmFsIFJFU0VUIG9yIFNFVAorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVA0X0VYVElfR0VUX0ZMQUcoKSAgICAgICAgICAgICAgUkVBRF9CSVQoRVhUSS0+UFIsIENPTVBfRVhUSV9MSU5FX0NPTVA0KQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBDT01QNCBFWFRJIGZsYWcuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9DTEVBUl9GTEFHKCkgICAgICAgICAgICBXUklURV9SRUcoRVhUSS0+UFIsIENPTVBfRVhUSV9MSU5FX0NPTVA0KQorCisjZW5kaWYgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUDUgRVhUSSBsaW5lIHJpc2luZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDVfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSAgICBTRVRfQklUKEVYVEktPlJUU1IsIENPTVBfRVhUSV9MSU5FX0NPTVA1KQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIENPTVA1IEVYVEkgbGluZSByaXNpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVA1X0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpICAgQ0xFQVJfQklUKEVYVEktPlJUU1IsIENPTVBfRVhUSV9MSU5FX0NPTVA1KQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUDUgRVhUSSBsaW5lIGZhbGxpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVA1X0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpICAgU0VUX0JJVChFWFRJLT5GVFNSLCBDT01QX0VYVElfTElORV9DT01QNSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QNSBFWFRJIGxpbmUgZmFsbGluZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDVfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpICBDTEVBUl9CSVQoRVhUSS0+RlRTUiwgQ09NUF9FWFRJX0xJTkVfQ09NUDUpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBDT01QNSBFWFRJIGxpbmUgcmlzaW5nICYgZmFsbGluZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDVfRVhUSV9FTkFCTEVfUklTSU5HX0ZBTExJTkdfRURHRSgpICAgZG8geyBcCisgICAgX19IQUxfQ09NUF9DT01QNV9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpOyBcCisgICAgX19IQUxfQ09NUF9DT01QNV9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKTsgXAorICB9IHdoaWxlKDBVKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIENPTVA1IEVYVEkgbGluZSByaXNpbmcgJiBmYWxsaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QNV9FWFRJX0RJU0FCTEVfUklTSU5HX0ZBTExJTkdfRURHRSgpICAgZG8geyBcCisgICAgX19IQUxfQ09NUF9DT01QNV9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKTsgXAorICAgIF9fSEFMX0NPTVBfQ09NUDVfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpOyBcCisgIH0gd2hpbGUoMFUpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBDT01QNSBFWFRJIGxpbmUgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDVfRVhUSV9FTkFCTEVfSVQoKSAgICAgICAgICAgICBTRVRfQklUKEVYVEktPklNUiwgQ09NUF9FWFRJX0xJTkVfQ09NUDUpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgQ09NUDUgRVhUSSBsaW5lIGluIGludGVycnVwdCBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVA1X0VYVElfRElTQUJMRV9JVCgpICAgICAgICAgICAgQ0xFQVJfQklUKEVYVEktPklNUiwgQ09NUF9FWFRJX0xJTkVfQ09NUDUpCisKKy8qKgorICAqIEBicmllZiAgR2VuZXJhdGUgYSBzb2Z0d2FyZSBpbnRlcnJ1cHQgb24gdGhlIENPTVA1IEVYVEkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QNV9FWFRJX0dFTkVSQVRFX1NXSVQoKSAgICAgICAgIFNFVF9CSVQoRVhUSS0+U1dJRVIsIENPTVBfRVhUSV9MSU5FX0NPTVA1KQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUDUgRVhUSSBsaW5lIGluIGV2ZW50IG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDVfRVhUSV9FTkFCTEVfRVZFTlQoKSAgICAgICAgICBTRVRfQklUKEVYVEktPkVNUiwgQ09NUF9FWFRJX0xJTkVfQ09NUDUpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgQ09NUDUgRVhUSSBsaW5lIGluIGV2ZW50IG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDVfRVhUSV9ESVNBQkxFX0VWRU5UKCkgICAgICAgICBDTEVBUl9CSVQoRVhUSS0+RU1SLCBDT01QX0VYVElfTElORV9DT01QNSkKKworLyoqCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBDT01QNSBFWFRJIGxpbmUgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEByZXR2YWwgUkVTRVQgb3IgU0VUCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDVfRVhUSV9HRVRfRkxBRygpICAgICAgICAgICAgICBSRUFEX0JJVChFWFRJLT5QUiwgQ09NUF9FWFRJX0xJTkVfQ09NUDUpCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIENPTVA1IEVYVEkgZmxhZy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QNV9FWFRJX0NMRUFSX0ZMQUcoKSAgICAgICAgICAgIFdSSVRFX1JFRyhFWFRJLT5QUiwgQ09NUF9FWFRJX0xJTkVfQ09NUDUpCisKKyNlbmRpZiAvKiBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4ICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KSB8fCAgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8ICBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgIFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUDYgRVhUSSBsaW5lIHJpc2luZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSAgICBTRVRfQklUKEVYVEktPlJUU1IyLCBDT01QX0VYVElfTElORV9DT01QNikKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QNiBFWFRJIGxpbmUgcmlzaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QNl9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSAgIENMRUFSX0JJVChFWFRJLT5SVFNSMiwgQ09NUF9FWFRJX0xJTkVfQ09NUDYpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBDT01QNiBFWFRJIGxpbmUgZmFsbGluZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgICBTRVRfQklUKEVYVEktPkZUU1IyLCBDT01QX0VYVElfTElORV9DT01QNikKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QNiBFWFRJIGxpbmUgZmFsbGluZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpICBDTEVBUl9CSVQoRVhUSS0+RlRTUjIsIENPTVBfRVhUSV9MSU5FX0NPTVA2KQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUDYgRVhUSSBsaW5lIHJpc2luZyAmIGZhbGxpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVA2X0VYVElfRU5BQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSAgIGRvIHsgXAorICAgIF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTsgXAorICAgIF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCk7IFwKKyAgfSB3aGlsZSgwVSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QNiBFWFRJIGxpbmUgcmlzaW5nICYgZmFsbGluZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9ESVNBQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSAgIGRvIHsgXAorICAgIF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCk7IFwKKyAgICBfX0hBTF9DT01QX0NPTVA2X0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKTsgXAorICB9IHdoaWxlKDBVKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUDYgRVhUSSBsaW5lIGluIGludGVycnVwdCBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVA2X0VYVElfRU5BQkxFX0lUKCkgICAgICAgICAgICAgU0VUX0JJVChFWFRJLT5JTVIyLCBDT01QX0VYVElfTElORV9DT01QNikKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QNiBFWFRJIGxpbmUgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9ESVNBQkxFX0lUKCkgICAgICAgICAgICBDTEVBUl9CSVQoRVhUSS0+SU1SMiwgQ09NUF9FWFRJX0xJTkVfQ09NUDYpCisKKy8qKgorICAqIEBicmllZiAgR2VuZXJhdGUgYSBzb2Z0d2FyZSBpbnRlcnJ1cHQgb24gdGhlIENPTVA2IEVYVEkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QNl9FWFRJX0dFTkVSQVRFX1NXSVQoKSAgICAgICAgIFNFVF9CSVQoRVhUSS0+U1dJRVIyLCBDT01QX0VYVElfTElORV9DT01QNikKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIENPTVA2IEVYVEkgbGluZSBpbiBldmVudCBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVA2X0VYVElfRU5BQkxFX0VWRU5UKCkgICAgICAgICAgU0VUX0JJVChFWFRJLT5FTVIyLCBDT01QX0VYVElfTElORV9DT01QNikKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QNiBFWFRJIGxpbmUgaW4gZXZlbnQgbW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QNl9FWFRJX0RJU0FCTEVfRVZFTlQoKSAgICAgICAgIENMRUFSX0JJVChFWFRJLT5FTVIyLCBDT01QX0VYVElfTElORV9DT01QNikKKworLyoqCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBDT01QNiBFWFRJIGxpbmUgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEByZXR2YWwgUkVTRVQgb3IgU0VUCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9HRVRfRkxBRygpICAgICAgICAgICAgICBSRUFEX0JJVChFWFRJLT5QUjIsIENPTVBfRVhUSV9MSU5FX0NPTVA2KQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBDT01QNiBFWFRJIGZsYWcuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9DTEVBUl9GTEFHKCkgICAgICAgICAgICBXUklURV9SRUcoRVhUSS0+UFIyLCBDT01QX0VYVElfTElORV9DT01QNikKKworI2VuZGlmIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4ICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBDT01QNyBFWFRJIGxpbmUgcmlzaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QN19FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpICAgIFNFVF9CSVQoRVhUSS0+UlRTUjIsIENPTVBfRVhUSV9MSU5FX0NPTVA3KQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIENPTVA3IEVYVEkgbGluZSByaXNpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVA3X0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpICAgQ0xFQVJfQklUKEVYVEktPlJUU1IyLCBDT01QX0VYVElfTElORV9DT01QNykKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIENPTVA3IEVYVEkgbGluZSBmYWxsaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QN19FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSAgIFNFVF9CSVQoRVhUSS0+RlRTUjIsIENPTVBfRVhUSV9MSU5FX0NPTVA3KQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIENPTVA3IEVYVEkgbGluZSBmYWxsaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QN19FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgIENMRUFSX0JJVChFWFRJLT5GVFNSMiwgQ09NUF9FWFRJX0xJTkVfQ09NUDcpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBDT01QNyBFWFRJIGxpbmUgcmlzaW5nICYgZmFsbGluZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDdfRVhUSV9FTkFCTEVfUklTSU5HX0ZBTExJTkdfRURHRSgpICAgZG8geyBcCisgICAgX19IQUxfQ09NUF9DT01QN19FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpOyBcCisgICAgX19IQUxfQ09NUF9DT01QN19FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKTsgXAorICB9IHdoaWxlKDBVKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIENPTVA3IEVYVEkgbGluZSByaXNpbmcgJiBmYWxsaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QN19FWFRJX0RJU0FCTEVfUklTSU5HX0ZBTExJTkdfRURHRSgpICAgZG8geyBcCisgICAgX19IQUxfQ09NUF9DT01QN19FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKTsgXAorICAgIF9fSEFMX0NPTVBfQ09NUDdfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpOyBcCisgIH0gd2hpbGUoMFUpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBDT01QNyBFWFRJIGxpbmUgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDdfRVhUSV9FTkFCTEVfSVQoKSAgICAgICAgICAgICBTRVRfQklUKEVYVEktPklNUjIsIENPTVBfRVhUSV9MSU5FX0NPTVA3KQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIENPTVA3IEVYVEkgbGluZSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QN19FWFRJX0RJU0FCTEVfSVQoKSAgICAgICAgICAgIENMRUFSX0JJVChFWFRJLT5JTVIyLCBDT01QX0VYVElfTElORV9DT01QNykKKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBhIHNvZnR3YXJlIGludGVycnVwdCBvbiB0aGUgQ09NUDcgRVhUSSBsaW5lLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVA3X0VYVElfR0VORVJBVEVfU1dJVCgpICAgICAgICAgU0VUX0JJVChFWFRJLT5TV0lFUjIsIENPTVBfRVhUSV9MSU5FX0NPTVA3KQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUDcgRVhUSSBsaW5lIGluIGV2ZW50IG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDdfRVhUSV9FTkFCTEVfRVZFTlQoKSAgICAgICAgICBTRVRfQklUKEVYVEktPkVNUjIsIENPTVBfRVhUSV9MSU5FX0NPTVA3KQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIENPTVA3IEVYVEkgbGluZSBpbiBldmVudCBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVA3X0VYVElfRElTQUJMRV9FVkVOVCgpICAgICAgICAgQ0xFQVJfQklUKEVYVEktPkVNUjIsIENPTVBfRVhUSV9MSU5FX0NPTVA3KQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIENPTVA3IEVYVEkgbGluZSBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHJldHZhbCBSRVNFVCBvciBTRVQKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QN19FWFRJX0dFVF9GTEFHKCkgICAgICAgICAgICAgIFJFQURfQklUKEVYVEktPlBSMiwgQ09NUF9FWFRJX0xJTkVfQ09NUDcpCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIENPTVA3IEVYVEkgZmxhZy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QN19FWFRJX0NMRUFSX0ZMQUcoKSAgICAgICAgICAgIFdSSVRFX1JFRyhFWFRJLT5QUjIsIENPTVBfRVhUSV9MSU5FX0NPTVA3KQorCisjZW5kaWYgLyogU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAgICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ09NUEV4X1ByaXZhdGVfQ29uc3RhbnRzIENPTVAgRXh0ZW5kZWQgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworLyoqIEBkZWZncm91cCBDT01QRXhfRXh0aUxpbmVFdmVudCBDT01QIEV4dGVuZGVkIEVYVEkgbGluZXMKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KQorCisjZGVmaW5lIENPTVBfRVhUSV9MSU5FX0NPTVAyICAgICAgICAgICAgICAgICAgIEVYVElfSU1SX01SMjIgICAgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAyMiBjb25uZWN0ZWQgdG8gQ09NUDIgKi8KKyNkZWZpbmUgQ09NUF9FWFRJX0xJTkVfQ09NUDQgICAgICAgICAgICAgICAgICAgRVhUSV9JTVJfTVIzMCAgICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDMwIGNvbm5lY3RlZCB0byBDT01QNCAqLworI2RlZmluZSBDT01QX0VYVElfTElORV9DT01QNiAgICAgICAgICAgICAgICAgICBFWFRJX0lNUjJfTVIzMiAgIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMzIgY29ubmVjdGVkIHRvIENPTVA2ICovCisKKyNkZWZpbmUgQ09NUF9FWFRJX0xJTkVfUkVHMl9NQVNLICAgICAgICAgICAgICAgRVhUSV9JTVIyX01SMzIgICAvKiE8IE1hc2sgZm9yIEV4dGVybmFsIGludGVycnVwdCBsaW5lIGNvbnRyb2wgaW4gcmVnaXN0ZXIgeHh4MiAqLworCisjZW5kaWYgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpCisKKyNkZWZpbmUgQ09NUF9FWFRJX0xJTkVfQ09NUDEgICAgICAgICAgICAgICAgICAgRVhUSV9JTVJfTVIyMSAgICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDIxIGNvbm5lY3RlZCB0byBDT01QMSAqLworI2RlZmluZSBDT01QX0VYVElfTElORV9DT01QMiAgICAgICAgICAgICAgICAgICBFWFRJX0lNUl9NUjIyICAgIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMjIgY29ubmVjdGVkIHRvIENPTVAyICovCisjZGVmaW5lIENPTVBfRVhUSV9MSU5FX0NPTVA0ICAgICAgICAgICAgICAgICAgIEVYVElfSU1SX01SMzAgICAgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAzMCBjb25uZWN0ZWQgdG8gQ09NUDQgKi8KKyNkZWZpbmUgQ09NUF9FWFRJX0xJTkVfQ09NUDYgICAgICAgICAgICAgICAgICAgRVhUSV9JTVIyX01SMzIgICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDMyIGNvbm5lY3RlZCB0byBDT01QNiAqLworCisjZGVmaW5lIENPTVBfRVhUSV9MSU5FX1JFRzJfTUFTSyAgICAgICAgICAgICAgIEVYVElfSU1SMl9NUjMyICAgLyohPCBNYXNrIGZvciBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSBjb250cm9sIGluIHJlZ2lzdGVyIHh4eDIgKi8KKworI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorCisjZGVmaW5lIENPTVBfRVhUSV9MSU5FX0NPTVAxICAgICAgICAgICAgICAgICAgIEVYVElfSU1SX01SMjEgICAgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAyMSBjb25uZWN0ZWQgdG8gQ09NUDEgKi8KKyNkZWZpbmUgQ09NUF9FWFRJX0xJTkVfQ09NUDIgICAgICAgICAgICAgICAgICAgRVhUSV9JTVJfTVIyMiAgICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDIyIGNvbm5lY3RlZCB0byBDT01QMiAqLworI2RlZmluZSBDT01QX0VYVElfTElORV9DT01QMyAgICAgICAgICAgICAgICAgICBFWFRJX0lNUl9NUjI5ICAgIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMjkgY29ubmVjdGVkIHRvIENPTVAzICovCisjZGVmaW5lIENPTVBfRVhUSV9MSU5FX0NPTVA0ICAgICAgICAgICAgICAgICAgIEVYVElfSU1SX01SMzAgICAgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAzMCBjb25uZWN0ZWQgdG8gQ09NUDQgKi8KKyNkZWZpbmUgQ09NUF9FWFRJX0xJTkVfQ09NUDUgICAgICAgICAgICAgICAgICAgRVhUSV9JTVJfTVIzMSAgICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDMxIGNvbm5lY3RlZCB0byBDT01QNSAqLworI2RlZmluZSBDT01QX0VYVElfTElORV9DT01QNiAgICAgICAgICAgICAgICAgICBFWFRJX0lNUjJfTVIzMiAgIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMzIgY29ubmVjdGVkIHRvIENPTVA2ICovCisjZGVmaW5lIENPTVBfRVhUSV9MSU5FX0NPTVA3ICAgICAgICAgICAgICAgICAgIEVYVElfSU1SMl9NUjMzICAgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAzMyBjb25uZWN0ZWQgdG8gQ09NUDcgKi8KKworI2RlZmluZSBDT01QX0VYVElfTElORV9SRUcyX01BU0sgICAgICAgICAgICAgICAoRVhUSV9JTVIyX01SMzMgfCBFWFRJX0lNUjJfTVIzMikgLyohPCBNYXNrIGZvciBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSBjb250cm9sIGluIHJlZ2lzdGVyIHh4eDIgKi8KKworI2VuZGlmIC8qIFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisKKyNkZWZpbmUgQ09NUF9FWFRJX0xJTkVfQ09NUDEgICAgICAgICAgICAgICAgICAgRVhUSV9JTVJfTVIyMSAgICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDIxIGNvbm5lY3RlZCB0byBDT01QMSAqLworI2RlZmluZSBDT01QX0VYVElfTElORV9DT01QMiAgICAgICAgICAgICAgICAgICBFWFRJX0lNUl9NUjIyICAgIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMjIgY29ubmVjdGVkIHRvIENPTVAyICovCisKKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBFeF9NaXNjIENPTVAgRXh0ZW5kZWQgbWlzY2VsbGFuZW91cyBkZWZpbmVzCisgICogQHsKKyAgKi8KKworLyogQ1NSIG1hc2tzIHJlZGVmaW5pdGlvbiBmb3IgaW50ZXJuYWwgdXNlICovCisjZGVmaW5lIENPTVBfQ1NSX0NPTVB4SU5TRUxfTUFTSyAgICAgICAgICAgICAgQ09NUF9DU1JfQ09NUHhJTlNFTCAgIC8qITwgQ09NUF9DU1JfQ09NUHhJTlNFTCBNYXNrICovCisjZGVmaW5lIENPTVBfQ1NSX0NPTVB4T1VUU0VMX01BU0sgICAgICAgICAgICAgQ09NUF9DU1JfQ09NUHhPVVRTRUwgIC8qITwgQ09NUF9DU1JfQ09NUHhPVVRTRUwgTWFzayAqLworI2RlZmluZSBDT01QX0NTUl9DT01QeFBPTF9NQVNLICAgICAgICAgICAgICAgIENPTVBfQ1NSX0NPTVB4UE9MICAgICAvKiE8IENPTVBfQ1NSX0NPTVB4UE9MIE1hc2sgICAqLworI2lmICBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorLyogQ1NSIHJlZ2lzdGVyIHJlc2V0IHZhbHVlICovCisjZGVmaW5lIENPTVBfQ1NSX1JFU0VUX1ZBTFVFICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBDT01QX0NTUl9SRVNFVF9QQVJBTUVURVJTX01BU0sgICAgICAgICgweDAwMDAzRkZGVSkKKyNkZWZpbmUgQ09NUF9DU1JfVVBEQVRFX1BBUkFNRVRFUlNfTUFTSyAgICAgICAoMHgwMDAwM0ZGRVUpCisvKiBDU1IgQ09NUDEvQ09NUDIgc2hpZnQgKi8KKyNkZWZpbmUgQ09NUF9DU1JfQ09NUDFfU0hJRlQgICAgICAgICAgICAgICAgICAwVQorI2RlZmluZSBDT01QX0NTUl9DT01QMl9TSElGVCAgICAgICAgICAgICAgICAgIDE2VQorI2Vsc2UKKy8qIENTUiByZWdpc3RlciByZXNldCB2YWx1ZSAqLworI2RlZmluZSBDT01QX0NTUl9SRVNFVF9WQUxVRSAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKyNkZWZpbmUgQ09NUF9DU1JfQ09NUHhOT05JTlNFTF9NQVNLICAgICAgICAgICAgKENPTVAyX0NTUl9DT01QMklOUERBQykgLyohPCBDT01QX0NTUl9DT01QeE5PTklOU0VMIG1hc2sgKi8KKyNkZWZpbmUgQ09NUF9DU1JfQ09NUHhXTkRXRU5fTUFTSyAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAvKiE8IE1hc2sgZW1wdHk6IGZlYXR1cmUgbm90IGF2YWlsYWJsZSAqLworI2RlZmluZSBDT01QX0NTUl9DT01QeE1PREVfTUFTSyAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpIC8qITwgTWFzayBlbXB0eTogZmVhdHVyZSBub3QgYXZhaWxhYmxlICovCisjZGVmaW5lIENPTVBfQ1NSX0NPTVB4SFlTVF9NQVNLICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgLyohPCBNYXNrIGVtcHR5OiBmZWF0dXJlIG5vdCBhdmFpbGFibGUgKi8KKyNkZWZpbmUgQ09NUF9DU1JfQ09NUHhCTEFOS0lOR19NQVNLICAgICAgICAgICAgQ09NUF9DU1JfQ09NUHhCTEFOS0lORyAvKiE8IENPTVBfQ1NSX0NPTVB4QkxBTktJTkcgbWFzayAqLworI2VuZGlmIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KQorI2RlZmluZSBDT01QX0NTUl9DT01QeE5PTklOU0VMX01BU0sgICAgICAgICAgICAoMHgwMDAwMDAwMFUpIC8qITwgTWFzayBlbXB0eTogZmVhdHVyZSBub3QgYXZhaWxhYmxlICovCisjZGVmaW5lIENPTVBfQ1NSX0NPTVB4V05EV0VOX01BU0sgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgLyohPCBNYXNrIGVtcHR5OiBmZWF0dXJlIG5vdCBhdmFpbGFibGUgKi8KKyNkZWZpbmUgQ09NUF9DU1JfQ09NUHhNT0RFX01BU0sgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAvKiE8IE1hc2sgZW1wdHk6IGZlYXR1cmUgbm90IGF2YWlsYWJsZSAqLworI2RlZmluZSBDT01QX0NTUl9DT01QeEhZU1RfTUFTSyAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpIC8qITwgTWFzayBlbXB0eTogZmVhdHVyZSBub3QgYXZhaWxhYmxlICovCisjZGVmaW5lIENPTVBfQ1NSX0NPTVB4QkxBTktJTkdfTUFTSyAgICAgICAgICAgIENPTVBfQ1NSX0NPTVB4QkxBTktJTkcgLyohPCBDT01QX0NTUl9DT01QeEJMQU5LSU5HIG1hc2sgKi8KKyNlbmRpZiAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCAqLworCisjaWYgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpCisjZGVmaW5lIENPTVBfQ1NSX0NPTVB4Tk9OSU5TRUxfTUFTSyAgICAgICAgICAgIChDT01QX0NTUl9DT01QeE5PTklOU0VMIHwgQ09NUDFfQ1NSX0NPTVAxU1cxKSAvKiE8IENPTVBfQ1NSX0NPTVB4Tk9OSU5TRUwgbWFzayAqLworI2RlZmluZSBDT01QX0NTUl9DT01QeFdORFdFTl9NQVNLICAgICAgICAgICAgICBDT01QX0NTUl9DT01QeFdORFdFTiAgIC8qITwgQ09NUF9DU1JfQ09NUHhXTkRXRU4gbWFzayAqLworI2RlZmluZSBDT01QX0NTUl9DT01QeE1PREVfTUFTSyAgICAgICAgICAgICAgICBDT01QX0NTUl9DT01QeE1PREUgICAgIC8qITwgQ09NUF9DU1JfQ09NUHhNT0RFIE1hc2sgKi8KKyNkZWZpbmUgQ09NUF9DU1JfQ09NUHhIWVNUX01BU0sgICAgICAgICAgICAgICAgQ09NUF9DU1JfQ09NUHhIWVNUICAgICAvKiE8IENPTVBfQ1NSX0NPTVB4SFlTVCBNYXNrICovCisjZGVmaW5lIENPTVBfQ1NSX0NPTVB4QkxBTktJTkdfTUFTSyAgICAgICAgICAgIENPTVBfQ1NSX0NPTVB4QkxBTktJTkcgLyohPCBDT01QX0NTUl9DT01QeEJMQU5LSU5HIG1hc2sgKi8KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAqLworCisjaWYgIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisjZGVmaW5lIENPTVBfQ1NSX0NPTVB4Tk9OSU5TRUxfTUFTSyAgICAgICAgICAgIChDT01QMV9DU1JfQ09NUDFTVzEpIC8qITwgQ09NUF9DU1JfQ09NUHhOT05JTlNFTCBtYXNrICovCisjZGVmaW5lIENPTVBfQ1NSX0NPTVB4V05EV0VOX01BU0sgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgLyohPCBNYXNrIGVtcHR5OiBmZWF0dXJlIG5vdCBhdmFpbGFibGUgKi8KKyNkZWZpbmUgQ09NUF9DU1JfQ09NUHhNT0RFX01BU0sgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAvKiE8IE1hc2sgZW1wdHk6IGZlYXR1cmUgbm90IGF2YWlsYWJsZSAqLworI2RlZmluZSBDT01QX0NTUl9DT01QeEhZU1RfTUFTSyAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpIC8qITwgTWFzayBlbXB0eTogZmVhdHVyZSBub3QgYXZhaWxhYmxlICovCisjZGVmaW5lIENPTVBfQ1NSX0NPTVB4QkxBTktJTkdfTUFTSyAgICAgICAgICAgIENPTVBfQ1NSX0NPTVB4QkxBTktJTkcgLyohPCBDT01QX0NTUl9DT01QeEJMQU5LSU5HIG1hc2sgKi8KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKyNkZWZpbmUgQ09NUF9DU1JfQ09NUHhOT05JTlNFTF9NQVNLICAgICAgICAgICAgKENPTVBfQ1NSX0NPTVAxU1cxKSAgLyohPCBDT01QX0NTUl9DT01QeE5PTklOU0VMIG1hc2sgKi8KKyNkZWZpbmUgQ09NUF9DU1JfQ09NUHhXTkRXRU5fTUFTSyAgICAgICAgICAgICAgQ09NUF9DU1JfQ09NUHhXTkRXRU4gLyohPCBDT01QX0NTUl9DT01QeFdORFdFTiBtYXNrICovCisjZGVmaW5lIENPTVBfQ1NSX0NPTVB4TU9ERV9NQVNLICAgICAgICAgICAgICAgIENPTVBfQ1NSX0NPTVB4TU9ERSAgIC8qITwgQ09NUF9DU1JfQ09NUHhNT0RFIE1hc2sgKi8KKyNkZWZpbmUgQ09NUF9DU1JfQ09NUHhIWVNUX01BU0sgICAgICAgICAgICAgICAgQ09NUF9DU1JfQ09NUHhIWVNUICAgLyohPCBDT01QX0NTUl9DT01QeEhZU1QgTWFzayAqLworI2RlZmluZSBDT01QX0NTUl9DT01QeEJMQU5LSU5HX01BU0sgICAgICAgICAgICAoMHgwMDAwMDAwMFUpIC8qITwgTWFzayBlbXB0eTogZmVhdHVyZSBub3QgYXZhaWxhYmxlICovCisjZW5kaWYgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ09NUEV4X1ByaXZhdGVfTWFjcm9zIENPTVAgRXh0ZW5kZWQgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworLyoqIEBkZWZncm91cCBDT01QX0dFVF9FWFRJX0xJTkUgQ09NUCBFeHRlbmRlZCBQcml2YXRlIG1hY3JvIHRvIGdldCB0aGUgRVhUSSBsaW5lIGFzc29jaWF0ZWQgd2l0aCBhIGNvbXBhcmF0b3IgaGFuZGxlCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBzcGVjaWZpZWQgRVhUSSBsaW5lIGZvciBhIGNvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBzcGVjaWZpZXMgdGhlIENPTVAgaW5zdGFuY2UuCisgICogQHJldHZhbCB2YWx1ZSBvZiBAcmVmIENPTVBFeF9FeHRpTGluZUV2ZW50CisgICovCisjZGVmaW5lIENPTVBfR0VUX0VYVElfTElORShfX0lOU1RBTkNFX18pICgoKF9fSU5TVEFOQ0VfXykgPT0gQ09NUDIpID8gQ09NUF9FWFRJX0xJTkVfQ09NUDIgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSU5TVEFOQ0VfXykgPT0gQ09NUDQpID8gQ09NUF9FWFRJX0xJTkVfQ09NUDQgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QX0VYVElfTElORV9DT01QNikKKyNlbmRpZiAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4QykKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBzcGVjaWZpZWQgRVhUSSBsaW5lIGZvciBhIGNvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBzcGVjaWZpZXMgdGhlIENPTVAgaW5zdGFuY2UuCisgICogQHJldHZhbCB2YWx1ZSBvZiBAcmVmIENPTVBFeF9FeHRpTGluZUV2ZW50CisgICovCisjZGVmaW5lIENPTVBfR0VUX0VYVElfTElORShfX0lOU1RBTkNFX18pICgoKF9fSU5TVEFOQ0VfXykgPT0gQ09NUDEpID8gQ09NUF9FWFRJX0xJTkVfQ09NUDEgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSU5TVEFOQ0VfXykgPT0gQ09NUDIpID8gQ09NUF9FWFRJX0xJTkVfQ09NUDIgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSU5TVEFOQ0VfXykgPT0gQ09NUDQpID8gQ09NUF9FWFRJX0xJTkVfQ09NUDQgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QX0VYVElfTElORV9DT01QNikKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBzcGVjaWZpZWQgRVhUSSBsaW5lIGZvciBhIGNvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBzcGVjaWZpZXMgdGhlIENPTVAgaW5zdGFuY2UuCisgICogQHJldHZhbCB2YWx1ZSBvZiBAcmVmIENPTVBFeF9FeHRpTGluZUV2ZW50CisgICovCisjZGVmaW5lIENPTVBfR0VUX0VYVElfTElORShfX0lOU1RBTkNFX18pICgoKF9fSU5TVEFOQ0VfXykgPT0gQ09NUDEpID8gQ09NUF9FWFRJX0xJTkVfQ09NUDEgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSU5TVEFOQ0VfXykgPT0gQ09NUDIpID8gQ09NUF9FWFRJX0xJTkVfQ09NUDIgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSU5TVEFOQ0VfXykgPT0gQ09NUDMpID8gQ09NUF9FWFRJX0xJTkVfQ09NUDMgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSU5TVEFOQ0VfXykgPT0gQ09NUDQpID8gQ09NUF9FWFRJX0xJTkVfQ09NUDQgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSU5TVEFOQ0VfXykgPT0gQ09NUDUpID8gQ09NUF9FWFRJX0xJTkVfQ09NUDUgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSU5TVEFOQ0VfXykgPT0gQ09NUDYpID8gQ09NUF9FWFRJX0xJTkVfQ09NUDYgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QX0VYVElfTElORV9DT01QNykKKyNlbmRpZiAvKiBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4ICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHNwZWNpZmllZCBFWFRJIGxpbmUgZm9yIGEgY29tcGFyYXRvciBpbnN0YW5jZQorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIHNwZWNpZmllcyB0aGUgQ09NUCBpbnN0YW5jZS4KKyAgKiBAcmV0dmFsIHZhbHVlIG9mIEByZWYgQ09NUEV4X0V4dGlMaW5lRXZlbnQKKyAgKi8KKyNkZWZpbmUgQ09NUF9HRVRfRVhUSV9MSU5FKF9fSU5TVEFOQ0VfXykgKCgoX19JTlNUQU5DRV9fKSA9PSBDT01QMSkgPyBDT01QX0VYVElfTElORV9DT01QMSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBfRVhUSV9MSU5FX0NPTVAyKQorI2VuZGlmIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUEV4X1ByaXZhdGVfTWFjcm9zX01pc2MgQ09NUCBFeHRlbmRlZCBtaXNjZWxsYW5lb3VzIHByaXZhdGUgbWFjcm9zCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisvKioKKyAgKiBAYnJpZWYgIEluaXQgYSBjb21wYXJhdG9yIGluc3RhbmNlCisgICogQHBhcmFtICBfX0hBTkRMRV9fICBDT01QIGhhbmRsZQorICAqIEBub3RlICAgVGhlIGNvbW1vbiBvdXRwdXQgc2VsZWN0aW9uIGlzIGNoZWNrZWQgdmVyc3VzIHRoZSBDT01QIGluc3RhbmNlIHRvIHNldCB0aGUgcmlnaHQgb3V0cHV0IGNvbmZpZ3VyYXRpb24KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIENPTVBfSU5JVChfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgdWludDMyX3QgcmVnc2hpZnQgPSBDT01QX0NTUl9DT01QMV9TSElGVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgdWludDMyX3QgY29tcG91dHB1dCA9IChfX0hBTkRMRV9fKS0+SW5pdC5PdXRwdXQgJiBDT01QX0NTUl9DT01QeE9VVFNFTF9NQVNLOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBDT01QMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZWdzaGlmdCA9IENPTVBfQ1NSX0NPTVAyX1NISUZUOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgTU9ESUZZX1JFRyhDT01QLT5DU1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAoQ09NUF9DU1JfQ09NUHhJTlNFTCAgfCBDT01QX0NTUl9DT01QeE5PTklOU0VMX01BU0sgfCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBDT01QX0NTUl9DT01QeE9VVFNFTCAgfCBDT01QX0NTUl9DT01QeFBPTCAgICAgICAgICAgfCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBDT01QX0NTUl9DT01QeEhZU1QgICAgfCBDT01QX0NTUl9DT01QeE1PREUpIDw8IHJlZ3NoaWZ0LCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5Jbml0LkludmVydGluZ0lucHV0ICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluaXQuTm9uSW52ZXJ0aW5nSW5wdXQgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBjb21wb3V0cHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluaXQuT3V0cHV0UG9sICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluaXQuSHlzdGVyZXNpcyAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluaXQuTW9kZSkgPDwgcmVnc2hpZnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgaWYoKF9fSEFORExFX18pLT5Jbml0LldpbmRvd01vZGUgIT0gQ09NUF9XSU5ET1dNT0RFX0RJU0FCTEUpICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBDT01QLT5DU1IgfD0gQ09NUF9DU1JfV05EV0VOOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gd2hpbGUoMFUpCisKKy8qKgorICAqIEBicmllZiAgRGVJbml0IGEgY29tcGFyYXRvciBpbnN0YW5jZQorICAqIEBwYXJhbSAgX19IQU5ETEVfXyAgQ09NUCBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIENPTVBfREVJTklUKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB1aW50MzJfdCByZWdzaGlmdCA9IENPTVBfQ1NSX0NPTVAxX1NISUZUOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gQ09NUDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZWdzaGlmdCA9IENPTVBfQ1NSX0NPTVAyX1NISUZUOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBNT0RJRllfUkVHKENPTVAtPkNTUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBDT01QX0NTUl9SRVNFVF9QQVJBTUVURVJTX01BU0sgPDwgcmVnc2hpZnQsICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgQ09NUF9DU1JfUkVTRVRfVkFMVUUgPDwgcmVnc2hpZnQpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSB3aGlsZSgwVSkKKworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgRXh0aSBMaW5lIHJpc2luZyBlZGdlIHRyaWdnZXIuCisgICogQHBhcmFtICBfX0VYVElMSU5FX18gc3BlY2lmaWVzIHRoZSBDT01QIEV4dGkgc291cmNlcyB0byBiZSBlbmFibGVkLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QRXhfRXh0aUxpbmVFdmVudAorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgQ09NUF9FWFRJX1JJU0lOR19FTkFCTEUoX19FWFRJTElORV9fKSAgICAgIFNFVF9CSVQoRVhUSS0+UlRTUiwgKF9fRVhUSUxJTkVfXykpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgRXh0aSBMaW5lIHJpc2luZyBlZGdlIHRyaWdnZXIuCisgICogQHBhcmFtICBfX0VYVElMSU5FX18gc3BlY2lmaWVzIHRoZSBDT01QIEV4dGkgc291cmNlcyB0byBiZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09NUEV4X0V4dGlMaW5lRXZlbnQKKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIENPTVBfRVhUSV9SSVNJTkdfRElTQUJMRShfX0VYVElMSU5FX18pICAgICBDTEVBUl9CSVQoRVhUSS0+UlRTUiwgKF9fRVhUSUxJTkVfXykpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBFeHRpIExpbmUgZmFsbGluZyBlZGdlIHRyaWdnZXIuCisgICogQHBhcmFtICBfX0VYVElMSU5FX18gc3BlY2lmaWVzIHRoZSBDT01QIEV4dGkgc291cmNlcyB0byBiZSBlbmFibGVkLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QRXhfRXh0aUxpbmVFdmVudAorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgQ09NUF9FWFRJX0ZBTExJTkdfRU5BQkxFKF9fRVhUSUxJTkVfXykgICAgIFNFVF9CSVQoRVhUSS0+RlRTUiwgKF9fRVhUSUxJTkVfXykpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgRXh0aSBMaW5lIGZhbGxpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEBwYXJhbSAgX19FWFRJTElORV9fIHNwZWNpZmllcyB0aGUgQ09NUCBFeHRpIHNvdXJjZXMgdG8gYmUgZGlzYWJsZWQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPTVBFeF9FeHRpTGluZUV2ZW50CisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBDT01QX0VYVElfRkFMTElOR19ESVNBQkxFKF9fRVhUSUxJTkVfXykgICAgQ0xFQVJfQklUKEVYVEktPkZUU1IsIChfX0VYVElMSU5FX18pKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUCBFeHRpIExpbmUgaW50ZXJydXB0IGdlbmVyYXRpb24uCisgICogQHBhcmFtICBfX0VYVElMSU5FX18gc3BlY2lmaWVzIHRoZSBDT01QIEV4dGkgc291cmNlcyB0byBiZSBlbmFibGVkLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QRXhfRXh0aUxpbmVFdmVudAorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgQ09NUF9FWFRJX0VOQUJMRV9JVChfX0VYVElMSU5FX18pICAgICAgICAgIFNFVF9CSVQoRVhUSS0+SU1SLCAoX19FWFRJTElORV9fKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QIEV4dGkgTGluZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbi4KKyAgKiBAcGFyYW0gIF9fRVhUSUxJTkVfXyBzcGVjaWZpZXMgdGhlIENPTVAgRXh0aSBzb3VyY2VzIHRvIGJlIGRpc2FibGVkLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QRXhfRXh0aUxpbmVFdmVudAorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgQ09NUF9FWFRJX0RJU0FCTEVfSVQoX19FWFRJTElORV9fKSAgICAgICAgIENMRUFSX0JJVChFWFRJLT5JTVIsIChfX0VYVElMSU5FX18pKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUCBFeHRpIExpbmUgZXZlbnQgZ2VuZXJhdGlvbi4KKyAgKiBAcGFyYW0gIF9fRVhUSUxJTkVfXyBzcGVjaWZpZXMgdGhlIENPTVAgRXh0aSBzb3VyY2VzIHRvIGJlIGVuYWJsZWQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPTVBFeF9FeHRpTGluZUV2ZW50CisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBDT01QX0VYVElfRU5BQkxFX0VWRU5UKF9fRVhUSUxJTkVfXykgICAgICAgU0VUX0JJVChFWFRJLT5FTVIsIChfX0VYVElMSU5FX18pKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIENPTVAgRXh0aSBMaW5lIGV2ZW50IGdlbmVyYXRpb24uCisgICogQHBhcmFtICBfX0VYVElMSU5FX18gc3BlY2lmaWVzIHRoZSBDT01QIEV4dGkgc291cmNlcyB0byBiZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09NUEV4X0V4dGlMaW5lRXZlbnQKKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIENPTVBfRVhUSV9ESVNBQkxFX0VWRU5UKF9fRVhUSUxJTkVfXykgICAgICBDTEVBUl9CSVQoRVhUSS0+RU1SLCAoX19FWFRJTElORV9fKSkKKworLyoqCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgRVhUSSBsaW5lIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgQ09NUCBFeHRpIHNvdXJjZXMgdG8gYmUgY2hlY2tlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPTVBFeF9FeHRpTGluZUV2ZW50CisgICogQHJldHZhbCBUaGUgc3RhdGUgb2YgX19GTEFHX18gKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIENPTVBfRVhUSV9HRVRfRkxBRyhfX0ZMQUdfXykgICAgICAgICAgICAgICBSRUFEX0JJVChFWFRJLT5QUiwgKF9fRkxBR19fKSkKKworLyoqCisgICogQGJyaWVmIENsZWFyIHRoZSBDT01QIEV4dGkgZmxhZ3MuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIENPTVAgRXh0aSBzb3VyY2VzIHRvIGJlIGNsZWFyZWQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QRXhfRXh0aUxpbmVFdmVudAorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgQ09NUF9FWFRJX0NMRUFSX0ZMQUcoX19GTEFHX18pICAgICAgICAgICAgIFdSSVRFX1JFRyhFWFRJLT5QUiwgKF9fRkxBR19fKSkKKworI2Vsc2UgLyogU1RNMzJGMzB4LCBTVE0zMkYzMnh4LCBTVE0zMkYzNXgsIFNUTTMyRjM5eCwgU1RNMzJGMzN4ICovCisKKworLyoqCisgICogQGJyaWVmICBJbml0IGEgY29tcGFyYXRvciBpbnN0YW5jZQorICAqIEBwYXJhbSAgX19IQU5ETEVfXyAgQ09NUCBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIENPTVBfSU5JVChfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBfX0lPIHVpbnQzMl90ICAgICBjc3JyZWcgPSAwVTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGNzcnJlZyA9IFJFQURfUkVHKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNTUik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBNT0RJRllfUkVHKGNzcnJlZywgQ09NUF9DU1JfQ09NUHhJTlNFTF9NQVNLLCAoX19IQU5ETEVfXyktPkluaXQuSW52ZXJ0aW5nSW5wdXQpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgTU9ESUZZX1JFRyhjc3JyZWcsIENPTVBfQ1NSX0NPTVB4Tk9OSU5TRUxfTUFTSywgKF9fSEFORExFX18pLT5Jbml0Lk5vbkludmVydGluZ0lucHV0KTsgICAgICAgICAgICAgICAgXAorICAgICAgICAgIE1PRElGWV9SRUcoY3NycmVnLCBDT01QX0NTUl9DT01QeEJMQU5LSU5HX01BU0ssIChfX0hBTkRMRV9fKS0+SW5pdC5CbGFua2luZ1NyY2UpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBNT0RJRllfUkVHKGNzcnJlZywgQ09NUF9DU1JfQ09NUHhPVVRTRUxfTUFTSywgKF9fSEFORExFX18pLT5Jbml0Lk91dHB1dCAmIENPTVBfQ1NSX0NPTVB4T1VUU0VMX01BU0spOyBcCisgICAgICAgICAgTU9ESUZZX1JFRyhjc3JyZWcsIENPTVBfQ1NSX0NPTVB4UE9MX01BU0ssIChfX0hBTkRMRV9fKS0+SW5pdC5PdXRwdXRQb2wpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIE1PRElGWV9SRUcoY3NycmVnLCBDT01QX0NTUl9DT01QeEhZU1RfTUFTSywgKF9fSEFORExFX18pLT5Jbml0Lkh5c3RlcmVzaXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBNT0RJRllfUkVHKGNzcnJlZywgQ09NUF9DU1JfQ09NUHhNT0RFX01BU0ssIChfX0hBTkRMRV9fKS0+SW5pdC5Nb2RlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgTU9ESUZZX1JFRyhjc3JyZWcsIENPTVBfQ1NSX0NPTVB4V05EV0VOX01BU0ssIChfX0hBTkRMRV9fKS0+SW5pdC5XaW5kb3dNb2RlKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIFdSSVRFX1JFRygoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DU1IsIGNzcnJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSB3aGlsZSgwVSkKKworLyoqCisgICogQGJyaWVmICBEZUluaXQgYSBjb21wYXJhdG9yIGluc3RhbmNlCisgICogQHBhcmFtICBfX0hBTkRMRV9fICBDT01QIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgQ09NUF9ERUlOSVQoX19IQU5ETEVfXykgICAgV1JJVEVfUkVHKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNTUiwgQ09NUF9DU1JfUkVTRVRfVkFMVUUpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBFeHRpIExpbmUgcmlzaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcGFyYW0gIF9fRVhUSUxJTkVfXyBzcGVjaWZpZXMgdGhlIENPTVAgRXh0aSBzb3VyY2VzIHRvIGJlIGVuYWJsZWQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPTVBFeF9FeHRpTGluZUV2ZW50CisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBDT01QX0VYVElfUklTSU5HX0VOQUJMRShfX0VYVElMSU5FX18pICAgICAgKCgoKF9fRVhUSUxJTkVfXykgJiBDT01QX0VYVElfTElORV9SRUcyX01BU0spICE9IFJFU0VUKSA/IFNFVF9CSVQoRVhUSS0+UlRTUjIsIChfX0VYVElMSU5FX18pKSA6IFNFVF9CSVQoRVhUSS0+UlRTUiwgKF9fRVhUSUxJTkVfXykpKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIEV4dGkgTGluZSByaXNpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEBwYXJhbSAgX19FWFRJTElORV9fIHNwZWNpZmllcyB0aGUgQ09NUCBFeHRpIHNvdXJjZXMgdG8gYmUgZGlzYWJsZWQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPTVBFeF9FeHRpTGluZUV2ZW50CisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBDT01QX0VYVElfUklTSU5HX0RJU0FCTEUoX19FWFRJTElORV9fKSAgICAgKCgoKF9fRVhUSUxJTkVfXykgJiBDT01QX0VYVElfTElORV9SRUcyX01BU0spICE9IFJFU0VUKSA/IENMRUFSX0JJVChFWFRJLT5SVFNSMiwgKF9fRVhUSUxJTkVfXykpIDogQ0xFQVJfQklUKEVYVEktPlJUU1IsIChfX0VYVElMSU5FX18pKSkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIEV4dGkgTGluZSBmYWxsaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcGFyYW0gIF9fRVhUSUxJTkVfXyBzcGVjaWZpZXMgdGhlIENPTVAgRXh0aSBzb3VyY2VzIHRvIGJlIGVuYWJsZWQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPTVBFeF9FeHRpTGluZUV2ZW50CisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBDT01QX0VYVElfRkFMTElOR19FTkFCTEUoX19FWFRJTElORV9fKSAgICAgKCgoKF9fRVhUSUxJTkVfXykgJiBDT01QX0VYVElfTElORV9SRUcyX01BU0spICE9IFJFU0VUKSA/IFNFVF9CSVQoRVhUSS0+RlRTUjIsIChfX0VYVElMSU5FX18pKSA6IFNFVF9CSVQoRVhUSS0+RlRTUiwgKF9fRVhUSUxJTkVfXykpKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIEV4dGkgTGluZSBmYWxsaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcGFyYW0gIF9fRVhUSUxJTkVfXyBzcGVjaWZpZXMgdGhlIENPTVAgRXh0aSBzb3VyY2VzIHRvIGJlIGRpc2FibGVkLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QRXhfRXh0aUxpbmVFdmVudAorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgQ09NUF9FWFRJX0ZBTExJTkdfRElTQUJMRShfX0VYVElMSU5FX18pICAgICgoKChfX0VYVElMSU5FX18pICYgQ09NUF9FWFRJX0xJTkVfUkVHMl9NQVNLKSAhPSBSRVNFVCkgPyBDTEVBUl9CSVQoRVhUSS0+RlRTUjIsIChfX0VYVElMSU5FX18pKSA6IENMRUFSX0JJVChFWFRJLT5GVFNSLCAoX19FWFRJTElORV9fKSkpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBDT01QIEV4dGkgTGluZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbi4KKyAgKiBAcGFyYW0gIF9fRVhUSUxJTkVfXyBzcGVjaWZpZXMgdGhlIENPTVAgRXh0aSBzb3VyY2VzIHRvIGJlIGVuYWJsZWQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPTVBFeF9FeHRpTGluZUV2ZW50CisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBDT01QX0VYVElfRU5BQkxFX0lUKF9fRVhUSUxJTkVfXykgICAgICAgICAgKCgoKF9fRVhUSUxJTkVfXykgJiBDT01QX0VYVElfTElORV9SRUcyX01BU0spICE9IFJFU0VUKSA/IFNFVF9CSVQoRVhUSS0+SU1SMiwgKF9fRVhUSUxJTkVfXykpIDogU0VUX0JJVChFWFRJLT5JTVIsIChfX0VYVElMSU5FX18pKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QIEV4dGkgTGluZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbi4KKyAgKiBAcGFyYW0gIF9fRVhUSUxJTkVfXyBzcGVjaWZpZXMgdGhlIENPTVAgRXh0aSBzb3VyY2VzIHRvIGJlIGRpc2FibGVkLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QRXhfRXh0aUxpbmVFdmVudAorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgQ09NUF9FWFRJX0RJU0FCTEVfSVQoX19FWFRJTElORV9fKSAgICAgICAgICgoKChfX0VYVElMSU5FX18pICYgQ09NUF9FWFRJX0xJTkVfUkVHMl9NQVNLKSAhPSBSRVNFVCkgPyBDTEVBUl9CSVQoRVhUSS0+SU1SMiwgKF9fRVhUSUxJTkVfXykpIDogQ0xFQVJfQklUKEVYVEktPklNUiwgKF9fRVhUSUxJTkVfXykpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUCBFeHRpIExpbmUgZXZlbnQgZ2VuZXJhdGlvbi4KKyAgKiBAcGFyYW0gIF9fRVhUSUxJTkVfXyBzcGVjaWZpZXMgdGhlIENPTVAgRXh0aSBzb3VyY2VzIHRvIGJlIGVuYWJsZWQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPTVBFeF9FeHRpTGluZUV2ZW50CisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBDT01QX0VYVElfRU5BQkxFX0VWRU5UKF9fRVhUSUxJTkVfXykgICAgICAgKCgoKF9fRVhUSUxJTkVfXykgJiBDT01QX0VYVElfTElORV9SRUcyX01BU0spICE9IFJFU0VUKSA/IFNFVF9CSVQoRVhUSS0+RU1SMiwgKF9fRVhUSUxJTkVfXykpIDogU0VUX0JJVChFWFRJLT5FTVIsIChfX0VYVElMSU5FX18pKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QIEV4dGkgTGluZSBldmVudCBnZW5lcmF0aW9uLgorICAqIEBwYXJhbSAgX19FWFRJTElORV9fIHNwZWNpZmllcyB0aGUgQ09NUCBFeHRpIHNvdXJjZXMgdG8gYmUgZGlzYWJsZWQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPTVBFeF9FeHRpTGluZUV2ZW50CisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBDT01QX0VYVElfRElTQUJMRV9FVkVOVChfX0VYVElMSU5FX18pICAgICAgKCgoKF9fRVhUSUxJTkVfXykgJiBDT01QX0VYVElfTElORV9SRUcyX01BU0spICE9IFJFU0VUKSA/IENMRUFSX0JJVChFWFRJLT5FTVIyLCAoX19FWFRJTElORV9fKSkgOiBDTEVBUl9CSVQoRVhUSS0+RU1SLCAoX19FWFRJTElORV9fKSkpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIEVYVEkgbGluZSBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIENPTVAgRXh0aSBzb3VyY2VzIHRvIGJlIGNoZWNrZWQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QRXhfRXh0aUxpbmVFdmVudAorICAqIEByZXR2YWwgVGhlIHN0YXRlIG9mIF9fRkxBR19fIChTRVQgb3IgUkVTRVQpLgorICAqLworI2RlZmluZSBDT01QX0VYVElfR0VUX0ZMQUcoX19GTEFHX18pICAgICAgICAgICAgICAgKCgoKF9fRkxBR19fKSAmIENPTVBfRVhUSV9MSU5FX1JFRzJfTUFTSykgIT0gUkVTRVQpID8gUkVBRF9CSVQoRVhUSS0+UFIyLCAoX19GTEFHX18pKSA6IFJFQURfQklUKEVYVEktPlBSLCAoX19GTEFHX18pKSkKKworLyoqCisgICogQGJyaWVmIENsZWFyIHRoZSBDT01QIEV4dGkgZmxhZ3MuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIENPTVAgRXh0aSBzb3VyY2VzIHRvIGJlIGNsZWFyZWQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QRXhfRXh0aUxpbmVFdmVudAorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgQ09NUF9FWFRJX0NMRUFSX0ZMQUcoX19GTEFHX18pICAgICAgICAgICAgICgoKChfX0ZMQUdfXykgJiBDT01QX0VYVElfTElORV9SRUcyX01BU0spICE9IFJFU0VUKSA/IFdSSVRFX1JFRyhFWFRJLT5QUjIsIChfX0ZMQUdfXykpIDogV1JJVEVfUkVHKEVYVEktPlBSLCAoX19GTEFHX18pKSkKKworI2VuZGlmIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICovCisKKworLyoqCisgICogQGJyaWVmICBNYW5hZ2UgaW52ZXJ0aW5nIGlucHV0IGNvbXBhcmF0b3IgaW52ZXJ0aW5nIGlucHV0IGNvbm5lY3RlZCB0byBhIEdQSU8KKyAgKiAgICAgICAgIGZvciBTVE0zMkYzMDJ4LCBTVE0zMkYzMnh4LCBTVE0zMkYzM3guCisgICogICAgICAgICAtIE9uIGRldmljZXMgU1RNMzJGMzAyeCwgU1RNMzJGMzJ4eCwgU1RNMzJGMzN4LCB0aGVyZSBpcworICAqICAgICAgICAgICBvbmx5IDEgY29tcGFyYXRvciBpbnZlcnRpbmcgaW5wdXQgY29ubmVjdGVkIHRvIGEgR1BJTy4KKyAgKiAgICAgICAgICAgTGVnYWN5IGRlZmluaXRpb24gb2YgbGl0ZXJhbCBDT01QX0lOVkVSVElOR0lOUFVUX0lPMQorICAqICAgICAgICAgICB3YXMgaW5pdGlhbGx5IHRoZSBvbmx5IHNlbGVjdGlvbiwgYnV0IGRlcGVuZGluZyBvbgorICAqICAgICAgICAgICBjb21wYXJhdG9yIGluc3RhbmNlIGl0IGNvcnJlc3BvbmRzIHRvIENPTVBfSU5WRVJUSU5HSU5QVVRfSU8yCisgICogICAgICAgICAgIChmb3IgaW5zdGFuY2VzIENPTVA0LCBDT01QNikuCisgICogICAgICAgICAgIFNpbmNlLCBDT01QX0lOVkVSVElOR0lOUFVUX0lPMiBoYXMgYmVlbiBjcmVhdGVkIGFuZCB0aGlzIG1hY3JvCisgICogICAgICAgICAgIHNlbGVjdHMgdGhlIGNvcnJlY3QgbGl0ZXJhbCBDT01QX0lOVkVSVElOR0lOUFVUX0lPeCBpbiBmdW5jdGlvbgorICAqICAgICAgICAgICBvZiBjb21wYXJhdG9yIGluc3RhbmNlLgorICAqICAgICAgICAgLSBPbiBvdGhlciBTVE0zMkYzIGRldmljZXMsIHRoaXMgbWFjcm8gcGVyZm9ybXMgbm8gYWN0aW9uLgorICAqIEBwYXJhbSAgX19DT01QX0lOU1RBTkNFX18gIENPTVAgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fSU5WRVJUSU5HSU5QVVRfXyAgQ09NUCBpbnZlcnRpbmcgaW5wdXQKKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkKKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9TRUxFQ1RJT04oX19DT01QX0lOU1RBTkNFX18sIF9fSU5WRVJUSU5HSU5QVVRfXykgICBcCisgICgoKF9fSU5WRVJUSU5HSU5QVVRfXykgIT0gQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgID8gKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAoX19JTlZFUlRJTkdJTlBVVF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICgoKF9fQ09NUF9JTlNUQU5DRV9fKSA9PSBDT01QMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgID8gKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAoQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgKENPTVBfSU5WRVJUSU5HSU5QVVRfSU8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorI2Vsc2UKKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9TRUxFQ1RJT04oX19DT01QX0lOU1RBTkNFX18sIF9fSU5WRVJUSU5HSU5QVVRfXykgICBcCisgIChfX0lOVkVSVElOR0lOUFVUX18pCisjZW5kaWYKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QRXhfSVNfQ09NUF9EZWZpbml0aW9ucyBDT01QIEV4dGVuZGVkIFByaXZhdGUgbWFjcm9zIHRvIGNoZWNrIGlucHV0IHBhcmFtZXRlcnMKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKworI2RlZmluZSBJU19DT01QX0lOVkVSVElOR0lOUFVUKElOUFVUKSAoKChJTlBVVCkgPT0gQ09NUF9JTlZFUlRJTkdJTlBVVF8xXzRWUkVGSU5UKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOUFVUKSA9PSBDT01QX0lOVkVSVElOR0lOUFVUXzFfMlZSRUZJTlQpICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5QVVQpID09IENPTVBfSU5WRVJUSU5HSU5QVVRfM180VlJFRklOVCkgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTlBVVCkgPT0gQ09NUF9JTlZFUlRJTkdJTlBVVF9WUkVGSU5UKSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOUFVUKSA9PSBDT01QX0lOVkVSVElOR0lOUFVUX0RBQzFfQ0gxKSAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5QVVQpID09IENPTVBfSU5WRVJUSU5HSU5QVVRfSU8xKSkKKworI2RlZmluZSBJU19DT01QX05PTklOVkVSVElOR0lOUFVUKElOUFVUKSAoKChJTlBVVCkgPT0gQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9JTzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5QVVQpID09IENPTVBfTk9OSU5WRVJUSU5HSU5QVVRfREFDMVNXSVRDSENMT1NFRCkpCisKKy8qIFNUTTMyRjMwMXg2L3g4LCBTVE0zMkYzMDJ4Ni94OCwgU1RNMzJGMzE4eHggZGV2aWNlcyBjb21wYXJhdG9yIGluc3RhbmNlcyBub24gaW52ZXJ0aW5nIHNvdXJjZSB2YWx1ZXMgKi8KKyNkZWZpbmUgSVNfQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9JTlNUQU5DRShJTlNUQU5DRSwgSU5QVVQpICAgIFwKKyAgICgoKChJTlNUQU5DRSkgPT0gQ09NUDIpICAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChJTlBVVCkgPT0gQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9JTzEpICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgKChJTlBVVCkgPT0gQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9EQUMxU1dJVENIQ0xPU0VEKSkpICAgIFwKKyAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChJTlBVVCkgPT0gQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9JTzEpKSkKKworI2RlZmluZSBJU19DT01QX1dJTkRPV01PREUoV0lORE9XTU9ERSkgKChXSU5ET1dNT0RFKSA9PSAoV0lORE9XTU9ERSkpIC8qITwgTm90IGF2YWlsYWJsZTogY2hlY2sgYWx3YXlzIHRydWUgKi8KKworI2RlZmluZSBJU19DT01QX01PREUoTU9ERSkgICgoTU9ERSkgPT0gKE1PREUpKSAgLyohPCBOb3QgYXZhaWxhYmxlOiBjaGVjayBhbHdheXMgdHJ1ZSAqLworCisjZGVmaW5lIElTX0NPTVBfSFlTVEVSRVNJUyhIWVNURVJFU0lTKSAgICAoKEhZU1RFUkVTSVMpID09IChIWVNURVJFU0lTKSkgLyohPCBOb3QgYXZhaWxhYmxlOiBjaGVjayBhbHdheXMgdHJ1ZSAqLworCisjZGVmaW5lIElTX0NPTVBfT1VUUFVUKE9VVFBVVCkgKCgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9OT05FKSAgICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTikgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjJfQlJLMikgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjIpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xSUMxKSAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xT0NSRUZDTFIpICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0ySUMyKSAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0ySUM0KSAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0yT0NSRUZDTFIpICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9DT01QNl9USU0yT0NSRUZDTFIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xNUlDMikgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xNU9DUkVGQ0xSKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xNklDMSkgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xNk9DUkVGQ0xSKSkKKworI2RlZmluZSBJU19DT01QX09VVFBVVF9JTlNUQU5DRShJTlNUQU5DRSwgT1VUUFVUKSAgICAgIFwKKyAgICgoKChJTlNUQU5DRSkgPT0gQ09NUDIpICAmJiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9OT05FKSAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4pICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOMl9CUksyKSAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjIpICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMU9DUkVGQ0xSKSAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFJQzEpICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0ySUM0KSAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMk9DUkVGQ0xSKSkpICAgICAgICAgIFwKKyAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoSU5TVEFOQ0UpID09IENPTVA0KSAgJiYgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfTk9ORSkgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOKSAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjJfQlJLMikgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4yKSAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTE1SUMyKSAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xNU9DUkVGQ0xSKSkpICAgICAgICAgXAorICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChJTlNUQU5DRSkgPT0gQ09NUDYpICAmJiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9OT05FKSAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4pICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOMl9CUksyKSAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjIpICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMklDMikgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX0NPTVA2X1RJTTJPQ1JFRkNMUikgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xNklDMSkgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTZPQ1JFRkNMUikpKSkKKworI2RlZmluZSBJU19DT01QX0JMQU5LSU5HU1JDRShTT1VSQ0UpICgoKFNPVVJDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfTk9ORSkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTFPQzUpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0yT0MzKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNM09DMykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTNPQzQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0yT0M0KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNMTVPQzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTE1T0MyKSkKKworLyogU1RNMzJGMzAxeDYveDgsIFNUTTMyRjMwMng2L3g4LCBTVE0zMkYzMDN4Ni94OCwgU1RNMzJGMzM0eDQvNlUvOFUsIFNUTTMyRjMxOHh4L1NUTTMyRjMyOHh4IGRldmljZXMgY29tcGFyYXRvciBpbnN0YW5jZXMgYmxhbmtpbmcgc291cmNlIHZhbHVlcyAqLworI2RlZmluZSBJU19DT01QX0JMQU5LSU5HU1JDRV9JTlNUQU5DRShJTlNUQU5DRSwgQkxBTktJTkdTUkNFKSBcCisgICAoKCgoSU5TVEFOQ0UpID09IENPTVAyKSAgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChCTEFOS0lOR1NSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX05PTkUpICAgICB8fCAgICAgICAgXAorICAgICAoKEJMQU5LSU5HU1JDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNMU9DNSkgIHx8ICAgICAgICBcCisgICAgICgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0yT0MzKSAgfHwgICAgICAgIFwKKyAgICAgKChCTEFOS0lOR1NSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTNPQzMpKSkgICAgICAgICAgXAorICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoSU5TVEFOQ0UpID09IENPTVA0KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKCgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9OT05FKSAgICB8fCAgICAgICAgXAorICAgICAgKChCTEFOS0lOR1NSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTNPQzQpIHx8ICAgICAgICBcCisgICAgICAoKEJMQU5LSU5HU1JDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNMTVPQzEpKSkgICAgICAgIFwKKyAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKElOU1RBTkNFKSA9PSBDT01QNikgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoKEJMQU5LSU5HU1JDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfTk9ORSkgICAgfHwgICAgICAgIFwKKyAgICAgICgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0yT0M0KSB8fCAgICAgICAgXAorICAgICAgKChCTEFOS0lOR1NSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTE1T0MyKSkpKQorCisjZW5kaWYgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpCisKKyNkZWZpbmUgSVNfQ09NUF9JTlZFUlRJTkdJTlBVVChJTlBVVCkgKCgoSU5QVVQpID09IENPTVBfSU5WRVJUSU5HSU5QVVRfMV80VlJFRklOVCkgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTlBVVCkgPT0gQ09NUF9JTlZFUlRJTkdJTlBVVF8xXzJWUkVGSU5UKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOUFVUKSA9PSBDT01QX0lOVkVSVElOR0lOUFVUXzNfNFZSRUZJTlQpICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5QVVQpID09IENPTVBfSU5WRVJUSU5HSU5QVVRfVlJFRklOVCkgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTlBVVCkgPT0gQ09NUF9JTlZFUlRJTkdJTlBVVF9EQUMxX0NIMSkgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOUFVUKSA9PSBDT01QX0lOVkVSVElOR0lOUFVUX0RBQzFfQ0gyKSAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5QVVQpID09IENPTVBfSU5WRVJUSU5HSU5QVVRfSU8xKSAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTlBVVCkgPT0gQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzIpICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOUFVUKSA9PSBDT01QX0lOVkVSVElOR0lOUFVUX0RBQzJfQ0gxKSkKKworLyohPCBOb24gaW52ZXJ0aW5nIGlucHV0IG5vdCBhdmFpbGFibGUgKi8KKyNkZWZpbmUgSVNfQ09NUF9OT05JTlZFUlRJTkdJTlBVVChJTlBVVCkgKChJTlBVVCkgPT0gKElOUFVUKSkgIC8qITwgTXVsdGlwbGUgc2VsZWN0aW9uIG5vdCBhdmFpbGFibGU6IGNoZWNrIGFsd2F5cyB0cnVlICovCisKKyNkZWZpbmUgSVNfQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9JTlNUQU5DRShJTlNUQU5DRSwgSU5QVVQpICgoSU5QVVQpID09IChJTlBVVCkpICAgLyohPCBNdWx0aXBsZSBzZWxlY3Rpb24gbm90IGF2YWlsYWJsZTogY2hlY2sgYWx3YXlzIHRydWUgKi8KKworI2RlZmluZSBJU19DT01QX1dJTkRPV01PREUoV0lORE9XTU9ERSkgKChXSU5ET1dNT0RFKSA9PSAoV0lORE9XTU9ERSkpIC8qITwgTm90IGF2YWlsYWJsZTogY2hlY2sgYWx3YXlzIHRydWUgKi8KKworI2RlZmluZSBJU19DT01QX09VVFBVVChPVVRQVVQpICgoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfTk9ORSkgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4pICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4yKSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUlDMSkgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMU9DUkVGQ0xSKSAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMklDMikgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMklDNCkgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMk9DUkVGQ0xSKSAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfQ09NUDZfVElNMk9DUkVGQ0xSKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNM0lDMSkgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNM0lDMykgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNM09DUkVGQ0xSKSAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTVJQzIpICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTVPQ1JFRkNMUikgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTZJQzEpICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTZPQ1JFRkNMUikpCisKKyNkZWZpbmUgSVNfQ09NUF9PVVRQVVRfSU5TVEFOQ0UoSU5TVEFOQ0UsIE9VVFBVVCkgICAgICBcCisgICAoKCgoSU5TVEFOQ0UpID09IENPTVAyKSAgJiYgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfTk9ORSkgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOKSAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjIpICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMU9DUkVGQ0xSKSAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFJQzEpICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0ySUM0KSAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMk9DUkVGQ0xSKSAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTNJQzEpICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0zT0NSRUZDTFIpKSkgICAgICAgICAgXAorICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChJTlNUQU5DRSkgPT0gQ09NUDQpICAmJiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9OT05FKSAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4pICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOMikgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0zSUMzKSAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNM09DUkVGQ0xSKSAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTE1SUMyKSAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xNU9DUkVGQ0xSKSkpICAgICAgICAgXAorICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChJTlNUQU5DRSkgPT0gQ09NUDYpICAmJiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9OT05FKSAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4pICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOMikgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0ySUMyKSAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfQ09NUDZfVElNMk9DUkVGQ0xSKSB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTE2SUMxKSAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xNk9DUkVGQ0xSKSkpKQorCisjZGVmaW5lIElTX0NPTVBfTU9ERShNT0RFKSAgKChNT0RFKSA9PSAoTU9ERSkpICAvKiE8IE5vdCBhdmFpbGFibGU6IGNoZWNrIGFsd2F5cyB0cnVlICovCisKKyNkZWZpbmUgSVNfQ09NUF9IWVNURVJFU0lTKEhZU1RFUkVTSVMpICAgICgoSFlTVEVSRVNJUykgPT0gKEhZU1RFUkVTSVMpKSAvKiE8IE5vdCBhdmFpbGFibGU6IGNoZWNrIGFsd2F5cyB0cnVlICovCisKKyNkZWZpbmUgSVNfQ09NUF9CTEFOS0lOR1NSQ0UoU09VUkNFKSAoKChTT1VSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX05PTkUpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0xT0M1KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNMk9DMykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTNPQzMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0zT0M0KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNMk9DNCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTE1T0MxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0xNU9DMikpCisKKy8qIFNUTTMyRjMwMXg2L3g4LCBTVE0zMkYzMDJ4Ni94OCwgU1RNMzJGMzAzeDYveDgsIFNUTTMyRjMzNHg0LzZVLzhVLCBTVE0zMkYzMTh4eC9TVE0zMkYzMjh4eCBkZXZpY2VzIGNvbXBhcmF0b3IgaW5zdGFuY2VzIGJsYW5raW5nIHNvdXJjZSB2YWx1ZXMgKi8KKyNkZWZpbmUgSVNfQ09NUF9CTEFOS0lOR1NSQ0VfSU5TVEFOQ0UoSU5TVEFOQ0UsIEJMQU5LSU5HU1JDRSkgXAorICAgKCgoKElOU1RBTkNFKSA9PSBDT01QMikgICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9OT05FKSAgICAgfHwgICAgICAgIFwKKyAgICAgKChCTEFOS0lOR1NSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTFPQzUpICB8fCAgICAgICAgXAorICAgICAoKEJMQU5LSU5HU1JDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNMk9DMykgIHx8ICAgICAgICBcCisgICAgICgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0zT0MzKSkpICAgICAgICAgIFwKKyAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKElOU1RBTkNFKSA9PSBDT01QNCkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoKEJMQU5LSU5HU1JDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfTk9ORSkgICAgfHwgICAgICAgIFwKKyAgICAgICgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0zT0M0KSB8fCAgICAgICAgXAorICAgICAgKChCTEFOS0lOR1NSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTE1T0MxKSkpICAgICAgICBcCisgICAgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChJTlNUQU5DRSkgPT0gQ09NUDYpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKChCTEFOS0lOR1NSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX05PTkUpICAgIHx8ICAgICAgICBcCisgICAgICAoKEJMQU5LSU5HU1JDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNMk9DNCkgfHwgICAgICAgIFwKKyAgICAgICgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0xNU9DMikpKSkKKworI2VuZGlmIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorCisjZGVmaW5lIElTX0NPTVBfSU5WRVJUSU5HSU5QVVQoSU5QVVQpICgoKElOUFVUKSA9PSBDT01QX0lOVkVSVElOR0lOUFVUXzFfNFZSRUZJTlQpICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5QVVQpID09IENPTVBfSU5WRVJUSU5HSU5QVVRfMV8yVlJFRklOVCkgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTlBVVCkgPT0gQ09NUF9JTlZFUlRJTkdJTlBVVF8zXzRWUkVGSU5UKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOUFVUKSA9PSBDT01QX0lOVkVSVElOR0lOUFVUX1ZSRUZJTlQpICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5QVVQpID09IENPTVBfSU5WRVJUSU5HSU5QVVRfREFDMV9DSDEpICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTlBVVCkgPT0gQ09NUF9JTlZFUlRJTkdJTlBVVF9EQUMxX0NIMikgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOUFVUKSA9PSBDT01QX0lOVkVSVElOR0lOUFVUX0lPMSkgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5QVVQpID09IENPTVBfSU5WRVJUSU5HSU5QVVRfSU8yKSkKKworI2RlZmluZSBJU19DT01QX05PTklOVkVSVElOR0lOUFVUKElOUFVUKSAoKChJTlBVVCkgPT0gQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9JTzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5QVVQpID09IENPTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU8yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOUFVUKSA9PSBDT01QX05PTklOVkVSVElOR0lOUFVUX0RBQzFTV0lUQ0hDTE9TRUQpKQorCisvKiBTVE0zMkYzMDJ4Qi94QywgU1RNMzJGMzAzeEIveEMsIFNUTTMyRjM1OHh4IGRldmljZXMgY29tcGFyYXRvciBpbnN0YW5jZXMgbm9uIGludmVydGluZyBzb3VyY2UgdmFsdWVzICovCisjZGVmaW5lIElTX0NPTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU5TVEFOQ0UoSU5TVEFOQ0UsIElOUFVUKSAgICBcCisgICAoKCgoSU5TVEFOQ0UpID09IENPTVAxKSAgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoSU5QVVQpID09IENPTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU8xKSAgICAgICAgICAgICAgICB8fCBcCisgICAgICgoSU5QVVQpID09IENPTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU8yKSAgICAgICAgICAgICAgICB8fCBcCisgICAgICgoSU5QVVQpID09IENPTVBfTk9OSU5WRVJUSU5HSU5QVVRfREFDMVNXSVRDSENMT1NFRCkpKSAgICBcCisgICAgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoKElOUFVUKSA9PSBDT01QX05PTklOVkVSVElOR0lOUFVUX0lPMSkgICAgICAgICAgICAgICB8fCBcCisgICAgICAoKElOUFVUKSA9PSBDT01QX05PTklOVkVSVElOR0lOUFVUX0lPMikpKSkKKworI2RlZmluZSBJU19DT01QX1dJTkRPV01PREUoV0lORE9XTU9ERSkgKCgoV0lORE9XTU9ERSkgPT0gQ09NUF9XSU5ET1dNT0RFX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdJTkRPV01PREUpID09IENPTVBfV0lORE9XTU9ERV9FTkFCTEUpKQorCisjZGVmaW5lIElTX0NPTVBfTU9ERShNT0RFKSAgKCgoTU9ERSkgPT0gQ09NUF9NT0RFX0hJR0hTUEVFRCkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBDT01QX01PREVfTUVESVVNU1BFRUQpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IENPTVBfTU9ERV9MT1dQT1dFUikgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gQ09NUF9NT0RFX1VMVFJBTE9XUE9XRVIpKQorCisjZGVmaW5lIElTX0NPTVBfSFlTVEVSRVNJUyhIWVNURVJFU0lTKSAgICAoKChIWVNURVJFU0lTKSA9PSBDT01QX0hZU1RFUkVTSVNfTk9ORSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChIWVNURVJFU0lTKSA9PSBDT01QX0hZU1RFUkVTSVNfTE9XKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChIWVNURVJFU0lTKSA9PSBDT01QX0hZU1RFUkVTSVNfTUVESVVNKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChIWVNURVJFU0lTKSA9PSBDT01QX0hZU1RFUkVTSVNfSElHSCkpCisKKyNpZiAgZGVmaW5lZChTVE0zMkYzMDJ4QykKKworI2RlZmluZSBJU19DT01QX09VVFBVVChPVVRQVVQpICgoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfTk9ORSkgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4pICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4yX0JSSzIpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4yKSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMU9DUkVGQ0xSKSAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUlDMSkgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMklDNCkgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMk9DUkVGQ0xSKSAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNM0lDMSkgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNM09DUkVGQ0xSKSAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNM0lDMykgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTVJQzIpICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNNElDMikgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTVPQ1JFRkNMUikgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMklDMikgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfQ09NUDZfVElNMk9DUkVGQ0xSKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTZPQ1JFRkNMUikgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTZJQzEpICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNNElDNCkpCisKKyNkZWZpbmUgSVNfQ09NUF9PVVRQVVRfSU5TVEFOQ0UoSU5TVEFOQ0UsIE9VVFBVVCkgICAgICBcCisgICAoKCgoSU5TVEFOQ0UpID09IENPTVAxKSAgJiYgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfTk9ORSkgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOKSAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjJfQlJLMikgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4yKSAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFJQzEpICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xT0NSRUZDTFIpICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMklDNCkgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTJPQ1JFRkNMUikgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0zSUMxKSAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNM09DUkVGQ0xSKSkpICAgICAgICAgIFwKKyAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoSU5TVEFOQ0UpID09IENPTVAyKSAgJiYgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfTk9ORSkgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOKSAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjJfQlJLMikgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4yKSAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFJQzEpICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xT0NSRUZDTFIpICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMklDNCkgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTJPQ1JFRkNMUikgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0zSUMxKSAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNM09DUkVGQ0xSKSkpICAgICAgICAgIFwKKyAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoSU5TVEFOQ0UpID09IENPTVA0KSAgJiYgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfTk9ORSkgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOKSAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjJfQlJLMikgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4yKSAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTNJQzMpICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0zT0NSRUZDTFIpICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNNElDMikgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTE1SUMyKSAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xNU9DUkVGQ0xSKSkpICAgICAgICAgXAorICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChJTlNUQU5DRSkgPT0gQ09NUDYpICAmJiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9OT05FKSAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4pICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOMl9CUksyKSAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjIpICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMklDMikgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX0NPTVA2X1RJTTJPQ1JFRkNMUikgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU00SUM0KSAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTZJQzEpICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTE2T0NSRUZDTFIpKSkpCisKKyNkZWZpbmUgSVNfQ09NUF9CTEFOS0lOR1NSQ0UoU09VUkNFKSAoKChTT1VSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX05PTkUpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0xT0M1KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNMk9DMykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTNPQzMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0zT0M0KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNMk9DNCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTE1T0MxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0xNU9DMikpCisKKy8qIFNUTTMyRjMwMnhCL1NUTTMyRjMwMnhDL1NUTTMyRjMwMnhFIGRldmljZXMgY29tcGFyYXRvciBpbnN0YW5jZXMgYmxhbmtpbmcgc291cmNlIHZhbHVlcyAqLworI2RlZmluZSBJU19DT01QX0JMQU5LSU5HU1JDRV9JTlNUQU5DRShJTlNUQU5DRSwgQkxBTktJTkdTUkNFKSBcCisgICAoKCgoKElOU1RBTkNFKSA9PSBDT01QMSkgfHwgKChJTlNUQU5DRSkgPT0gQ09NUDIpKSAgJiYgICAgIFwKKyAgICAgKCgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9OT05FKSAgICB8fCAgICAgICAgXAorICAgICAgKChCTEFOS0lOR1NSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTFPQzUpIHx8ICAgICAgICBcCisgICAgICAoKEJMQU5LSU5HU1JDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNMk9DMykgfHwgICAgICAgIFwKKyAgICAgICgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0zT0MzKSkpICAgICAgICAgXAorICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoSU5TVEFOQ0UpID09IENPTVA0KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKCgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9OT05FKSAgICB8fCAgICAgICAgXAorICAgICAgKChCTEFOS0lOR1NSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTNPQzQpIHx8ICAgICAgICBcCisgICAgICAoKEJMQU5LSU5HU1JDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNMTVPQzEpKSkgICAgICAgIFwKKyAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKElOU1RBTkNFKSA9PSBDT01QNikgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoKEJMQU5LSU5HU1JDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfTk9ORSkgICAgfHwgICAgICAgIFwKKyAgICAgICgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0yT0M0KSB8fCAgICAgICAgXAorICAgICAgKChCTEFOS0lOR1NSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTE1T0MyKSkpKQorCisjZW5kaWYgLyogU1RNMzJGMzAyeEMgKi8KKworI2lmICBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorCisjZGVmaW5lIElTX0NPTVBfT1VUUFVUKE9VVFBVVCkgKCgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9OT05FKSAgICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTikgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjIpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjJfVElNOEJLSU4yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xSUMxKSAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xSUMyKSAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xT0NSRUZDTFIpICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0ySUMxKSAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0ySUMyKSAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0ySUMzKSAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0ySUM0KSAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0yT0NSRUZDTFIpICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9DT01QNl9USU0yT0NSRUZDTFIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0zSUMxKSAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0zSUMyKSAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0zSUMzKSAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0zT0NSRUZDTFIpICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU00SUMxKSAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU00SUMyKSAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU00SUMzKSAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU00SUM0KSAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU04QktJTikgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU04QktJTjIpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU04T0NSRUZDTFIpICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xNUlDMSkgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xNUlDMikgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xNUJLSU4pICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xNU9DUkVGQ0xSKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xNkJLSU4pICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xNklDMSkgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xNk9DUkVGQ0xSKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xN0JLSU4pICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xN0lDMSkgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xN09DUkVGQ0xSKSkKKworI2RlZmluZSBJU19DT01QX09VVFBVVF9JTlNUQU5DRShJTlNUQU5DRSwgT1VUUFVUKSAgICAgICBcCisgICAoKCgoSU5TVEFOQ0UpID09IENPTVAxKSAgJiYgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChPVVRQVVQpID09IENPTVBfT1VUUFVUX05PTkUpICAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4pICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjIpICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTThCS0lOKSAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNOEJLSU4yKSAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjJfVElNOEJLSU4yKSB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFJQzEpICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMU9DUkVGQ0xSKSAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0ySUM0KSAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTJPQ1JFRkNMUikgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNM0lDMSkgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0zT0NSRUZDTFIpKSkgICAgICAgICAgIFwKKyAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKElOU1RBTkNFKSA9PSBDT01QMikgICYmICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9OT05FKSAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOKSAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4yKSAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU04QktJTikgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTThCS0lOMikgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4yX1RJTThCS0lOMikgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xSUMxKSAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFPQ1JFRkNMUikgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMklDNCkgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0yT0NSRUZDTFIpICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTNJQzEpICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNM09DUkVGQ0xSKSkpICAgICAgICAgICBcCisgICAgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChJTlNUQU5DRSkgPT0gQ09NUDMpICAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfTk9ORSkgICAgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTikgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOMikgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNOEJLSU4pICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU04QktJTjIpICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOMl9USU04QktJTjIpIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMU9DUkVGQ0xSKSAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0zSUMyKSAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTRJQzEpICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTVJQzEpICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xNUJLSU4pKSkgICAgICAgICAgICAgIFwKKyAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKElOU1RBTkNFKSA9PSBDT01QNCkgICYmICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9OT05FKSAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOKSAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4yKSAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU04QktJTikgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTThCS0lOMikgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4yX1RJTThCS0lOMikgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0zSUMzKSAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTNPQ1JFRkNMUikgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNNElDMikgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU04T0NSRUZDTFIpICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTE1SUMyKSAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTVPQ1JFRkNMUikpKSAgICAgICAgICBcCisgICAgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChJTlNUQU5DRSkgPT0gQ09NUDUpICAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfTk9ORSkgICAgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTikgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOMikgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNOEJLSU4pICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU04QktJTjIpICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOMl9USU04QktJTjIpIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMklDMSkgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0zT0NSRUZDTFIpICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTRJQzMpICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNOE9DUkVGQ0xSKSAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xNkJLSU4pICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTE3SUMxKSkpICAgICAgICAgICAgICAgXAorICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoSU5TVEFOQ0UpID09IENPTVA2KSAgJiYgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChPVVRQVVQpID09IENPTVBfT1VUUFVUX05PTkUpICAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4pICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjIpICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTThCS0lOKSAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNOEJLSU4yKSAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjJfVElNOEJLSU4yKSB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTJJQzIpICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfQ09NUDZfVElNMk9DUkVGQ0xSKSAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU00SUM0KSAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTThPQ1JFRkNMUikgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTZJQzEpICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xNk9DUkVGQ0xSKSkpICAgICAgICAgIFwKKyAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKElOU1RBTkNFKSA9PSBDT01QNykgICYmICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9OT05FKSAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOKSAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4yKSAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU04QktJTikgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTThCS0lOMikgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4yX1RJTThCS0lOMikgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xSUMyKSAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFPQ1JFRkNMUikgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMklDMykgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU04T0NSRUZDTFIpICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTE3QktJTikgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTdPQ1JFRkNMUikpKSkKKworI2RlZmluZSBJU19DT01QX0JMQU5LSU5HU1JDRShTT1VSQ0UpICgoKFNPVVJDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfTk9ORSkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTFPQzUpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0yT0MzKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNM09DMykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTJPQzQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU04T0M1KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNM09DNCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTE1T0MxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0xNU9DMikpCisKKy8qIFNUTTMyRjMwM3hFL1NUTTMyRjM5OHh4L1NUTTMyRjMwM3hCL1NUTTMyRjMwM3hDL1NUTTMyRjM1OHh4IGRldmljZXMgY29tcGFyYXRvciBpbnN0YW5jZXMgYmxhbmtpbmcgc291cmNlIHZhbHVlcyAqLworI2RlZmluZSBJU19DT01QX0JMQU5LSU5HU1JDRV9JTlNUQU5DRShJTlNUQU5DRSwgQkxBTktJTkdTUkNFKSBcCisgICAoKCgoKElOU1RBTkNFKSA9PSBDT01QMSkgfHwgKChJTlNUQU5DRSkgPT0gQ09NUDIpKSAgJiYgICAgIFwKKyAgICAgKCgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9OT05FKSAgICB8fCAgICAgICAgXAorICAgICAgKChCTEFOS0lOR1NSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTFPQzUpIHx8ICAgICAgICBcCisgICAgICAoKEJMQU5LSU5HU1JDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNMk9DMykgfHwgICAgICAgIFwKKyAgICAgICgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0zT0MzKSkpICAgICAgICAgXAorICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoSU5TVEFOQ0UpID09IENPTVAzKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKCgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9OT05FKSAgICB8fCAgICAgICAgXAorICAgICAgKChCTEFOS0lOR1NSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTFPQzUpIHx8ICAgICAgICBcCisgICAgICAoKEJMQU5LSU5HU1JDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNMk9DNCkpKSAgICAgICAgIFwKKyAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKElOU1RBTkNFKSA9PSBDT01QNCkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoKEJMQU5LSU5HU1JDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfTk9ORSkgICAgfHwgICAgICAgIFwKKyAgICAgICgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0zT0M0KSB8fCAgICAgICAgXAorICAgICAgKChCTEFOS0lOR1NSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTThPQzUpIHx8ICAgICAgICBcCisgICAgICAoKEJMQU5LSU5HU1JDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNMTVPQzEpKSkgICAgICAgIFwKKyAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKElOU1RBTkNFKSA9PSBDT01QNSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoKEJMQU5LSU5HU1JDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfTk9ORSkgICAgfHwgICAgICAgIFwKKyAgICAgICgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU04T0M1KSB8fCAgICAgICAgXAorICAgICAgKChCTEFOS0lOR1NSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTNPQzMpKSkgICAgICAgICBcCisgICAgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChJTlNUQU5DRSkgPT0gQ09NUDYpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKChCTEFOS0lOR1NSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX05PTkUpICAgIHx8ICAgICAgICBcCisgICAgICAoKEJMQU5LSU5HU1JDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNOE9DNSkgfHwgICAgICAgIFwKKyAgICAgICgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0yT0M0KSB8fCAgICAgICAgXAorICAgICAgKChCTEFOS0lOR1NSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTE1T0MyKSkpICAgICAgICBcCisgICAgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChJTlNUQU5DRSkgPT0gQ09NUDcpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKChCTEFOS0lOR1NSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX05PTkUpICAgIHx8ICAgICAgICBcCisgICAgICAoKEJMQU5LSU5HU1JDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNMU9DNSkgfHwgICAgICAgIFwKKyAgICAgICgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU04T0M1KSB8fCAgICAgICAgXAorICAgICAgKChCTEFOS0lOR1NSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTE1T0MyKSkpKQorICAgICAKKyNlbmRpZiAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAqLworCisjZW5kaWYgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisKKyNkZWZpbmUgSVNfQ09NUF9JTlZFUlRJTkdJTlBVVChJTlBVVCkgKCgoSU5QVVQpID09IENPTVBfSU5WRVJUSU5HSU5QVVRfMV80VlJFRklOVCkgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTlBVVCkgPT0gQ09NUF9JTlZFUlRJTkdJTlBVVF8xXzJWUkVGSU5UKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOUFVUKSA9PSBDT01QX0lOVkVSVElOR0lOUFVUXzNfNFZSRUZJTlQpICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5QVVQpID09IENPTVBfSU5WRVJUSU5HSU5QVVRfVlJFRklOVCkgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTlBVVCkgPT0gQ09NUF9JTlZFUlRJTkdJTlBVVF9EQUMxX0NIMSkgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOUFVUKSA9PSBDT01QX0lOVkVSVElOR0lOUFVUX0RBQzFfQ0gyKSAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5QVVQpID09IENPTVBfSU5WRVJUSU5HSU5QVVRfSU8xKSAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTlBVVCkgPT0gQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzIpKQorCisjZGVmaW5lIElTX0NPTVBfTk9OSU5WRVJUSU5HSU5QVVQoSU5QVVQpICgoKElOUFVUKSA9PSBDT01QX05PTklOVkVSVElOR0lOUFVUX0lPMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTlBVVCkgPT0gQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9EQUMxU1dJVENIQ0xPU0VEKSkKKworLyogU1RNMzJGMzAyeEUvU1RNMzJGMzAzeEUvU1RNMzJGMzk4eHggZGV2aWNlcyBjb21wYXJhdG9yIGluc3RhbmNlcyBub24gaW52ZXJ0aW5nIHNvdXJjZSB2YWx1ZXMgKi8KKyNkZWZpbmUgSVNfQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9JTlNUQU5DRShJTlNUQU5DRSwgSU5QVVQpICAgIFwKKyAgICgoKChJTlNUQU5DRSkgPT0gQ09NUDEpICAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChJTlBVVCkgPT0gQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9JTzEpICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgKChJTlBVVCkgPT0gQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9EQUMxU1dJVENIQ0xPU0VEKSkpICAgIFwKKyAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChJTlBVVCkgPT0gQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9JTzEpKSkKKworI2RlZmluZSBJU19DT01QX1dJTkRPV01PREUoV0lORE9XTU9ERSkgKChXSU5ET1dNT0RFKSA9PSAoV0lORE9XTU9ERSkpICAgIC8qITwgTm90IGF2YWlsYWJsZTogY2hlY2sgYWx3YXlzIHRydWUgKi8KKworI2RlZmluZSBJU19DT01QX01PREUoTU9ERSkgICgoTU9ERSkgPT0gKE1PREUpKSAgLyohPCBOb3QgYXZhaWxhYmxlOiBjaGVjayBhbHdheXMgdHJ1ZSAqLworCisjZGVmaW5lIElTX0NPTVBfSFlTVEVSRVNJUyhIWVNURVJFU0lTKSAgICAoKEhZU1RFUkVTSVMpID09IChIWVNURVJFU0lTKSkgLyohPCBOb3QgYXZhaWxhYmxlOiBjaGVjayBhbHdheXMgdHJ1ZSAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkKKworI2RlZmluZSBJU19DT01QX09VVFBVVChPVVRQVVQpICgoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfTk9ORSkgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4pICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4yX0JSSzIpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4yKSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMU9DUkVGQ0xSKSAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUlDMSkgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMklDNCkgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMk9DUkVGQ0xSKSAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNM0lDMSkgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNM09DUkVGQ0xSKSAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNM0lDMykgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTVJQzIpICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNNElDMikgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTVPQ1JFRkNMUikgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMklDMikgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfQ09NUDZfVElNMk9DUkVGQ0xSKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTZPQ1JFRkNMUikgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTZJQzEpICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNNElDNCkpCisKKyNkZWZpbmUgSVNfQ09NUF9PVVRQVVRfSU5TVEFOQ0UoSU5TVEFOQ0UsIE9VVFBVVCkgICAgICBcCisgICAoKCgoSU5TVEFOQ0UpID09IENPTVAxKSAgJiYgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfTk9ORSkgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOKSAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjJfQlJLMikgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4yKSAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFJQzEpICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xT0NSRUZDTFIpICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMklDNCkgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTJPQ1JFRkNMUikgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0zSUMxKSAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNM09DUkVGQ0xSKSkpICAgICAgICAgIFwKKyAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoSU5TVEFOQ0UpID09IENPTVAyKSAgJiYgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfTk9ORSkgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOKSAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjJfQlJLMikgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4yKSAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFJQzEpICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xT0NSRUZDTFIpICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMklDNCkgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTJPQ1JFRkNMUikgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0zSUMxKSAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNM09DUkVGQ0xSKSkpICAgICAgICAgIFwKKyAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoSU5TVEFOQ0UpID09IENPTVA0KSAgJiYgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfTk9ORSkgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOKSAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjJfQlJLMikgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4yKSAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTNJQzMpICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0zT0NSRUZDTFIpICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNNElDMikgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTE1SUMyKSAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xNU9DUkVGQ0xSKSkpICAgICAgICAgXAorICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChJTlNUQU5DRSkgPT0gQ09NUDYpICAmJiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9OT05FKSAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4pICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOMl9CUksyKSAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjIpICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMklDMikgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX0NPTVA2X1RJTTJPQ1JFRkNMUikgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU00SUM0KSAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTZJQzEpICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTE2T0NSRUZDTFIpKSkpCisKKyNkZWZpbmUgSVNfQ09NUF9CTEFOS0lOR1NSQ0UoU09VUkNFKSAoKChTT1VSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX05PTkUpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0xT0M1KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNMk9DMykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTNPQzMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0zT0M0KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNMk9DNCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTE1T0MxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0xNU9DMikpCisKKy8qIFNUTTMyRjMwMnhCL1NUTTMyRjMwMnhDL1NUTTMyRjMwMnhFIGRldmljZXMgY29tcGFyYXRvciBpbnN0YW5jZXMgYmxhbmtpbmcgc291cmNlIHZhbHVlcyAqLworI2RlZmluZSBJU19DT01QX0JMQU5LSU5HU1JDRV9JTlNUQU5DRShJTlNUQU5DRSwgQkxBTktJTkdTUkNFKSBcCisgICAoKCgoKElOU1RBTkNFKSA9PSBDT01QMSkgfHwgKChJTlNUQU5DRSkgPT0gQ09NUDIpKSAgJiYgICAgIFwKKyAgICAgKCgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9OT05FKSAgICB8fCAgICAgICAgXAorICAgICAgKChCTEFOS0lOR1NSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTFPQzUpIHx8ICAgICAgICBcCisgICAgICAoKEJMQU5LSU5HU1JDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNMk9DMykgfHwgICAgICAgIFwKKyAgICAgICgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0zT0MzKSkpICAgICAgICAgXAorICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoSU5TVEFOQ0UpID09IENPTVA0KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKCgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9OT05FKSAgICB8fCAgICAgICAgXAorICAgICAgKChCTEFOS0lOR1NSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTNPQzQpIHx8ICAgICAgICBcCisgICAgICAoKEJMQU5LSU5HU1JDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNMTVPQzEpKSkgICAgICAgIFwKKyAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKElOU1RBTkNFKSA9PSBDT01QNikgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoKEJMQU5LSU5HU1JDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfTk9ORSkgICAgfHwgICAgICAgIFwKKyAgICAgICgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0yT0M0KSB8fCAgICAgICAgXAorICAgICAgKChCTEFOS0lOR1NSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTE1T0MyKSkpKQorCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisKKyNkZWZpbmUgSVNfQ09NUF9PVVRQVVQoT1VUUFVUKSAoKChPVVRQVVQpID09IENPTVBfT1VUUFVUX05PTkUpICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOKSAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFJQzEpICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFPQ1JFRkNMUikgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTJJQzQpICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTJPQ1JFRkNMUikgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX0NPTVA2X1RJTTJPQ1JFRkNMUikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTNJQzEpICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTNPQ1JFRkNMUikgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTIwT0NSRUZDTFIpICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTThCS0lOKSAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOMikgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTThCS0lOMikgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTJPQ1JFRkNMUikgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOMl9USU04QktJTjIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTIwQktJTikgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTIwQktJTjIpICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOMl9USU04QktJTjJfVElNMjBCS0lOMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNM0lDMikgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNNElDMSkgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTVJQzEpICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTVCS0lOKSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNOE9DUkVGQ0xSKSAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNM0lDMykgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNNElDMSkgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTVJQzEpICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMklDMSkgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNNElDMykgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTZCS0lOKSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTdJQzEpICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMklDMikgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTZJQzEpICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNNElDNCkgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTZPQ1JFRkNMUikgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMklDMykgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUlDMikgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTdCS0lOKSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTdPQ1JFRkNMUikpCisKKyNkZWZpbmUgSVNfQ09NUF9PVVRQVVRfSU5TVEFOQ0UoSU5TVEFOQ0UsIE9VVFBVVCkgICAgICAgICAgICAgICAgICBcCisgICAoKCgoSU5TVEFOQ0UpID09IENPTVAxKSAgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfTk9ORSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOKSAgICAgICAgICAgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjIpICAgICAgICAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNOEJLSU4pICAgICAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTThCS0lOMikgICAgICAgICAgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjJfVElNOEJLSU4yKSAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMjBCS0lOKSAgICAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTIwQktJTjIpICAgICAgICAgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjJfVElNOEJLSU4yX1RJTTIwQktJTjIpIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUlDMSkgICAgICAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFPQ1JFRkNMUikgICAgICAgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0ySUM0KSAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMk9DUkVGQ0xSKSAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTNJQzEpICAgICAgICAgICAgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0zT0NSRUZDTFIpKSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChJTlNUQU5DRSkgPT0gQ09NUDIpICAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9OT05FKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4pICAgICAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOMikgICAgICAgICAgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU04QktJTikgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNOEJLSU4yKSAgICAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOMl9USU04QktJTjIpICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0yMEJLSU4pICAgICAgICAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMjBCS0lOMikgICAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOMl9USU04QktJTjJfVElNMjBCS0lOMikgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xSUMxKSAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMU9DUkVGQ0xSKSAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTJJQzQpICAgICAgICAgICAgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0yT0NSRUZDTFIpICAgICAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNM0lDMSkgICAgICAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTNPQ1JFRkNMUikgICAgICAgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0yME9DUkVGQ0xSKSkpICAgICAgICAgICAgICAgICAgICAgXAorICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChJTlNUQU5DRSkgPT0gQ09NUDMpICAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9OT05FKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4pICAgICAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOMikgICAgICAgICAgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU04QktJTikgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNOEJLSU4yKSAgICAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOMl9USU04QktJTjIpICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0yMEJLSU4pICAgICAgICAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMjBCS0lOMikgICAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOMl9USU04QktJTjJfVElNMjBCS0lOMikgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0zSUMyKSAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNNElDMSkgICAgICAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTE1SUMxKSAgICAgICAgICAgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xNUJLSU4pKSkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChJTlNUQU5DRSkgPT0gQ09NUDQpICAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9OT05FKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4pICAgICAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOMikgICAgICAgICAgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU04QktJTikgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNOEJLSU4yKSAgICAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOMl9USU04QktJTjIpICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0yMEJLSU4pICAgICAgICAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMjBCS0lOMikgICAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOMl9USU04QktJTjJfVElNMjBCS0lOMikgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0zSUMzKSAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNNElDMikgICAgICAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTThPQ1JFRkNMUikgICAgICAgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xNUlDMikgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTVPQ1JFRkNMUikpKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoSU5TVEFOQ0UpID09IENPTVA1KSAgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfTk9ORSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOKSAgICAgICAgICAgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjIpICAgICAgICAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNOEJLSU4pICAgICAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTThCS0lOMikgICAgICAgICAgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjJfVElNOEJLSU4yKSAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMjBCS0lOKSAgICAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTIwQktJTjIpICAgICAgICAgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjJfVElNOEJLSU4yX1RJTTIwQktJTjIpIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMklDMSkgICAgICAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTRJQzMpICAgICAgICAgICAgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xNkJLSU4pICAgICAgICAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTdJQzEpKSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoSU5TVEFOQ0UpID09IENPTVA2KSAgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfTk9ORSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFCS0lOKSAgICAgICAgICAgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjIpICAgICAgICAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNOEJLSU4pICAgICAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTThCS0lOMikgICAgICAgICAgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjJfVElNOEJLSU4yKSAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMjBCS0lOKSAgICAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTIwQktJTjIpICAgICAgICAgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTjJfVElNOEJLSU4yX1RJTTIwQktJTjIpIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMklDMikgICAgICAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX0NPTVA2X1RJTTJPQ1JFRkNMUikgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU00SUM0KSAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTZJQzEpICAgICAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTE2T0NSRUZDTFIpKSkgICAgICAgICAgICAgICAgICAgICBcCisgICAgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKElOU1RBTkNFKSA9PSBDT01QNykgICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChPVVRQVVQpID09IENPTVBfT1VUUFVUX05PTkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xQktJTikgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4yKSAgICAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTThCS0lOKSAgICAgICAgICAgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU04QktJTjIpICAgICAgICAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4yX1RJTThCS0lOMikgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTIwQktJTikgICAgICAgICAgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0yMEJLSU4yKSAgICAgICAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMUJLSU4yX1RJTThCS0lOMl9USU0yMEJLSU4yKSB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTFJQzIpICAgICAgICAgICAgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0ySUMzKSAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTdCS0lOKSAgICAgICAgICAgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTE3T0NSRUZDTFIpKSkpCisKKyNkZWZpbmUgSVNfQ09NUF9CTEFOS0lOR1NSQ0UoU09VUkNFKSAoKChTT1VSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX05PTkUpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0xT0M1KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNMk9DMykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTNPQzMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0yT0M0KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNOE9DNSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTNPQzQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0xNU9DMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNMTVPQzIpKQorCisvKiBTVE0zMkYzMDN4RS9TVE0zMkYzOTh4eC9TVE0zMkYzMDN4Qi9TVE0zMkYzMDN4Qy9TVE0zMkYzNTh4eCBkZXZpY2VzIGNvbXBhcmF0b3IgaW5zdGFuY2VzIGJsYW5raW5nIHNvdXJjZSB2YWx1ZXMgKi8KKyNkZWZpbmUgSVNfQ09NUF9CTEFOS0lOR1NSQ0VfSU5TVEFOQ0UoSU5TVEFOQ0UsIEJMQU5LSU5HU1JDRSkgXAorICAgKCgoKChJTlNUQU5DRSkgPT0gQ09NUDEpIHx8ICgoSU5TVEFOQ0UpID09IENPTVAyKSkgICYmICAgICBcCisgICAgICgoKEJMQU5LSU5HU1JDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfTk9ORSkgICAgfHwgICAgICAgIFwKKyAgICAgICgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0xT0M1KSB8fCAgICAgICAgXAorICAgICAgKChCTEFOS0lOR1NSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTJPQzMpIHx8ICAgICAgICBcCisgICAgICAoKEJMQU5LSU5HU1JDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNM09DMykpKSAgICAgICAgIFwKKyAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKElOU1RBTkNFKSA9PSBDT01QMykgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoKEJMQU5LSU5HU1JDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfTk9ORSkgICAgfHwgICAgICAgIFwKKyAgICAgICgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0xT0M1KSB8fCAgICAgICAgXAorICAgICAgKChCTEFOS0lOR1NSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTJPQzQpKSkgICAgICAgICBcCisgICAgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChJTlNUQU5DRSkgPT0gQ09NUDQpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKChCTEFOS0lOR1NSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX05PTkUpICAgIHx8ICAgICAgICBcCisgICAgICAoKEJMQU5LSU5HU1JDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNM09DNCkgfHwgICAgICAgIFwKKyAgICAgICgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU04T0M1KSB8fCAgICAgICAgXAorICAgICAgKChCTEFOS0lOR1NSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTE1T0MxKSkpICAgICAgICBcCisgICAgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChJTlNUQU5DRSkgPT0gQ09NUDUpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKChCTEFOS0lOR1NSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX05PTkUpICAgIHx8ICAgICAgICBcCisgICAgICAoKEJMQU5LSU5HU1JDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNOE9DNSkgfHwgICAgICAgIFwKKyAgICAgICgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0zT0MzKSkpICAgICAgICAgXAorICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoSU5TVEFOQ0UpID09IENPTVA2KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKCgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9OT05FKSAgICB8fCAgICAgICAgXAorICAgICAgKChCTEFOS0lOR1NSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTThPQzUpIHx8ICAgICAgICBcCisgICAgICAoKEJMQU5LSU5HU1JDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNMk9DNCkgfHwgICAgICAgIFwKKyAgICAgICgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0xNU9DMikpKSAgICAgICAgXAorICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoSU5TVEFOQ0UpID09IENPTVA3KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKCgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9OT05FKSAgICB8fCAgICAgICAgXAorICAgICAgKChCTEFOS0lOR1NSQ0UpID09IENPTVBfQkxBTktJTkdTUkNFX1RJTTFPQzUpIHx8ICAgICAgICBcCisgICAgICAoKEJMQU5LSU5HU1JDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfVElNOE9DNSkgfHwgICAgICAgIFwKKyAgICAgICgoQkxBTktJTkdTUkNFKSA9PSBDT01QX0JMQU5LSU5HU1JDRV9USU0xNU9DMikpKSkKKyAgICAgCisjZW5kaWYgLyogU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggKi8KKworI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorCisjZGVmaW5lIElTX0NPTVBfSU5WRVJUSU5HSU5QVVQoSU5QVVQpICgoKElOUFVUKSA9PSBDT01QX0lOVkVSVElOR0lOUFVUXzFfNFZSRUZJTlQpICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5QVVQpID09IENPTVBfSU5WRVJUSU5HSU5QVVRfMV8yVlJFRklOVCkgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTlBVVCkgPT0gQ09NUF9JTlZFUlRJTkdJTlBVVF8zXzRWUkVGSU5UKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOUFVUKSA9PSBDT01QX0lOVkVSVElOR0lOUFVUX1ZSRUZJTlQpICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5QVVQpID09IENPTVBfSU5WRVJUSU5HSU5QVVRfREFDMV9DSDEpICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTlBVVCkgPT0gQ09NUF9JTlZFUlRJTkdJTlBVVF9EQUMxX0NIMikgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOUFVUKSA9PSBDT01QX0lOVkVSVElOR0lOUFVUX0lPMSkgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5QVVQpID09IENPTVBfSU5WRVJUSU5HSU5QVVRfREFDMl9DSDEpKQorCisjZGVmaW5lIElTX0NPTVBfTk9OSU5WRVJUSU5HSU5QVVQoSU5QVVQpICgoKElOUFVUKSA9PSBDT01QX05PTklOVkVSVElOR0lOUFVUX0lPMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTlBVVCkgPT0gQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9EQUMxU1dJVENIQ0xPU0VEKSkKKworLyogU1RNMzJGMzczeEIveEMsIFNUTTMyRjM3OHh4IGRldmljZXMgY29tcGFyYXRvciBpbnN0YW5jZXMgbm9uIGludmVydGluZyBzb3VyY2UgdmFsdWVzICovCisjZGVmaW5lIElTX0NPTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU5TVEFOQ0UoSU5TVEFOQ0UsIElOUFVUKSAgICBcCisgICAoKCgoSU5TVEFOQ0UpID09IENPTVAxKSAgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoSU5QVVQpID09IENPTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU8xKSAgICAgICAgICAgICAgICB8fCBcCisgICAgICgoSU5QVVQpID09IENPTVBfTk9OSU5WRVJUSU5HSU5QVVRfREFDMVNXSVRDSENMT1NFRCkpKSAgICBcCisgICAgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoSU5QVVQpID09IENPTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU8xKSkpCisKKyNkZWZpbmUgSVNfQ09NUF9XSU5ET1dNT0RFKFdJTkRPV01PREUpICgoKFdJTkRPV01PREUpID09IENPTVBfV0lORE9XTU9ERV9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXSU5ET1dNT0RFKSA9PSBDT01QX1dJTkRPV01PREVfRU5BQkxFKSkKKworI2RlZmluZSBJU19DT01QX01PREUoTU9ERSkgICgoKE1PREUpID09IENPTVBfTU9ERV9ISUdIU1BFRUQpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gQ09NUF9NT0RFX01FRElVTVNQRUVEKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBDT01QX01PREVfTE9XUE9XRVIpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IENPTVBfTU9ERV9VTFRSQUxPV1BPV0VSKSkKKworI2RlZmluZSBJU19DT01QX0hZU1RFUkVTSVMoSFlTVEVSRVNJUykgICAgKCgoSFlTVEVSRVNJUykgPT0gQ09NUF9IWVNURVJFU0lTX05PTkUpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSFlTVEVSRVNJUykgPT0gQ09NUF9IWVNURVJFU0lTX0xPVykgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSFlTVEVSRVNJUykgPT0gQ09NUF9IWVNURVJFU0lTX01FRElVTSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSFlTVEVSRVNJUykgPT0gQ09NUF9IWVNURVJFU0lTX0hJR0gpKQorCisjZGVmaW5lIElTX0NPTVBfT1VUUFVUKE9VVFBVVCkgKCgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9OT05FKSAgICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0ySUM0KSAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0yT0NSRUZDTFIpICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9DT01QMV9USU0zSUMxKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9DT01QMV9USU0zT0NSRUZDTFIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9DT01QMl9USU0zSUMxKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9DT01QMl9USU0zT0NSRUZDTFIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU00SUMxKSAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU00T0NSRUZDTFIpICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU01SUM0KSAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU01T0NSRUZDTFIpICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xNUJLSU4pICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xNkJLSU4pKQorCisjZGVmaW5lIElTX0NPTVBfT1VUUFVUX0lOU1RBTkNFKElOU1RBTkNFLCBPVVRQVVQpICAgICAgXAorICAgKCgoKElOU1RBTkNFKSA9PSBDT01QMSkgICYmICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChPVVRQVVQpID09IENPTVBfT1VUUFVUX05PTkUpICAgICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0ySUM0KSAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMk9DUkVGQ0xSKSAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX0NPTVAxX1RJTTNJQzEpICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9DT01QMV9USU0zT0NSRUZDTFIpIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNNUlDNCkgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTVPQ1JFRkNMUikgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU0xNUJLSU4pKSkgICAgICAgICAgICAgXAorICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChJTlNUQU5DRSkgPT0gQ09NUDIpICAmJiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9OT05FKSAgICAgICAgICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMklDNCkgICAgICAgICAgICB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTJPQ1JFRkNMUikgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9DT01QMl9USU0zSUMxKSAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfQ09NUDJfVElNM09DUkVGQ0xSKSB8fCAgIFwKKyAgICAgKChPVVRQVVQpID09IENPTVBfT1VUUFVUX1RJTTRJQzEpICAgICAgICAgICAgfHwgICBcCisgICAgICgoT1VUUFVUKSA9PSBDT01QX09VVFBVVF9USU00T0NSRUZDTFIpICAgICAgIHx8ICAgXAorICAgICAoKE9VVFBVVCkgPT0gQ09NUF9PVVRQVVRfVElNMTZCS0lOKSkpKQorCisjZGVmaW5lIElTX0NPTVBfQkxBTktJTkdTUkNFKFNPVVJDRSkgKChTT1VSQ0UpID09IChTT1VSQ0UpKSAvKiE8IE5vdCBhdmFpbGFibGU6IGNoZWNrIGFsd2F5cyB0cnVlICovCisKKy8qIFNUTTMyRjM3M3hCL1NUTTMyRjM3M3hDL1NUTTMyRjM3OHh4IGRldmljZXMgY29tcGFyYXRvciBpbnN0YW5jZXMgYmxhbmtpbmcgc291cmNlIHZhbHVlcyAqLworI2RlZmluZSBJU19DT01QX0JMQU5LSU5HU1JDRV9JTlNUQU5DRShJTlNUQU5DRSwgQkxBTktJTkdTUkNFKSBcCisgICAoKCgoSU5TVEFOQ0UpID09IENPTVAxKSB8fCAoKElOU1RBTkNFKSA9PSBDT01QMikpICAmJiAgICAgXAorICAgICAoKEJMQU5LSU5HU1JDRSkgPT0gQ09NUF9CTEFOS0lOR1NSQ0VfTk9ORSkpICAgICAgICAgCisKKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkYzeHhfSEFMX0NPTVBfRVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjN4eF9oYWxfY29uZl90ZW1wbGF0ZS5oIGIvSW5jL3N0bTMyZjN4eF9oYWxfY29uZl90ZW1wbGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjN2E0ODYKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2hhbF9jb25mX3RlbXBsYXRlLmgKQEAgLTAsMCArMSwzNDIgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX2NvbmYuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSEFMIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovIAorCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyRjN4eF9IQUxfQ09ORl9ICisjZGVmaW5lIF9fU1RNMzJGM3h4X0hBTF9DT05GX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE1vZHVsZSBTZWxlY3Rpb24gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCisvKioKKyAgKiBAYnJpZWYgVGhpcyBpcyB0aGUgbGlzdCBvZiBtb2R1bGVzIHRvIGJlIHVzZWQgaW4gdGhlIEhBTCBkcml2ZXIgCisgICovCisjZGVmaW5lIEhBTF9NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfQURDX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9DQU5fTU9EVUxFX0VOQUJMRUQKKy8qICNkZWZpbmUgSEFMX0NBTl9MRUdBQ1lfTU9EVUxFX0VOQUJMRUQgKi8KKyNkZWZpbmUgSEFMX0NFQ19NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfQ09NUF9NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfQ09SVEVYX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9DUkNfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX0RBQ19NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfRE1BX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9GTEFTSF9NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfU1JBTV9NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfTk9SX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9OQU5EX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9QQ0NBUkRfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX0dQSU9fTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX0hSVElNX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9JMkNfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX0kyU19NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfSVJEQV9NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfSVdER19NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfT1BBTVBfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX1BDRF9NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfUFdSX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9SQ0NfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX1JUQ19NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfU0RBRENfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX1NNQVJUQ0FSRF9NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfU01CVVNfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX1NQSV9NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfVElNX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9UU0NfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX1VBUlRfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX1VTQVJUX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9XV0RHX01PRFVMRV9FTkFCTEVECisKKy8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEhTRS9IU0kgVmFsdWVzIGFkYXB0YXRpb24gIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCisvKioKKyAgKiBAYnJpZWYgQWRqdXN0IHRoZSB2YWx1ZSBvZiBFeHRlcm5hbCBIaWdoIFNwZWVkIG9zY2lsbGF0b3IgKEhTRSkgdXNlZCBpbiB5b3VyIGFwcGxpY2F0aW9uLgorICAqICAgICAgICBUaGlzIHZhbHVlIGlzIHVzZWQgYnkgdGhlIFJDQyBIQUwgbW9kdWxlIHRvIGNvbXB1dGUgdGhlIHN5c3RlbSBmcmVxdWVuY3kKKyAgKiAgICAgICAgKHdoZW4gSFNFIGlzIHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZSwgZGlyZWN0bHkgb3IgdGhyb3VnaCB0aGUgUExMKS4gIAorICAqLworI2lmICFkZWZpbmVkICAoSFNFX1ZBTFVFKSAKKyAgI2RlZmluZSBIU0VfVkFMVUUgICAgKDgwMDAwMDBVKSAvKiE8IFZhbHVlIG9mIHRoZSBFeHRlcm5hbCBvc2NpbGxhdG9yIGluIEh6ICovCisjZW5kaWYgLyogSFNFX1ZBTFVFICovCisKKy8qKgorICAqIEBicmllZiBJbiB0aGUgZm9sbG93aW5nIGxpbmUgYWRqdXN0IHRoZSBFeHRlcm5hbCBIaWdoIFNwZWVkIG9zY2lsbGF0b3IgKEhTRSkgU3RhcnR1cCAKKyAgKiAgICAgICAgVGltZW91dCB2YWx1ZSAKKyAgKi8KKyNpZiAhZGVmaW5lZCAgKEhTRV9TVEFSVFVQX1RJTUVPVVQpCisgICNkZWZpbmUgSFNFX1NUQVJUVVBfVElNRU9VVCAgICAoMTAwVSkgICAvKiE8IFRpbWUgb3V0IGZvciBIU0Ugc3RhcnQgdXAsIGluIG1zICovCisjZW5kaWYgLyogSFNFX1NUQVJUVVBfVElNRU9VVCAqLworCisvKioKKyAgKiBAYnJpZWYgSW50ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0kpIHZhbHVlLgorICAqICAgICAgICBUaGlzIHZhbHVlIGlzIHVzZWQgYnkgdGhlIFJDQyBIQUwgbW9kdWxlIHRvIGNvbXB1dGUgdGhlIHN5c3RlbSBmcmVxdWVuY3kKKyAgKiAgICAgICAgKHdoZW4gSFNJIGlzIHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZSwgZGlyZWN0bHkgb3IgdGhyb3VnaCB0aGUgUExMKS4gCisgICovCisjaWYgIWRlZmluZWQgIChIU0lfVkFMVUUpCisgICNkZWZpbmUgSFNJX1ZBTFVFICAgICg4MDAwMDAwVSkgLyohPCBWYWx1ZSBvZiB0aGUgSW50ZXJuYWwgb3NjaWxsYXRvciBpbiBIeiovCisjZW5kaWYgLyogSFNJX1ZBTFVFICovCisKKy8qKgorICAqIEBicmllZiBJbiB0aGUgZm9sbG93aW5nIGxpbmUgYWRqdXN0IHRoZSBJbnRlcm5hbCBIaWdoIFNwZWVkIG9zY2lsbGF0b3IgKEhTSSkgU3RhcnR1cCAKKyAgKiAgICAgICAgVGltZW91dCB2YWx1ZSAKKyAgKi8KKyNpZiAhZGVmaW5lZCAgKEhTSV9TVEFSVFVQX1RJTUVPVVQpIAorICNkZWZpbmUgSFNJX1NUQVJUVVBfVElNRU9VVCAgICg1MDAwVSkgLyohPCBUaW1lIG91dCBmb3IgSFNJIHN0YXJ0IHVwICovCisjZW5kaWYgLyogSFNJX1NUQVJUVVBfVElNRU9VVCAqLyAgCisKKy8qKgorICAqIEBicmllZiBJbnRlcm5hbCBMb3cgU3BlZWQgb3NjaWxsYXRvciAoTFNJKSB2YWx1ZS4KKyAgKi8KKyNpZiAhZGVmaW5lZCAgKExTSV9WQUxVRSkgCisgI2RlZmluZSBMU0lfVkFMVUUgICg0MDAwMFUpICAgIAorI2VuZGlmIC8qIExTSV9WQUxVRSAqLyAgICAgICAgICAgICAgICAgICAgICAvKiE8IFZhbHVlIG9mIHRoZSBJbnRlcm5hbCBMb3cgU3BlZWQgb3NjaWxsYXRvciBpbiBIegorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJlYWwgdmFsdWUgbWF5IHZhcnkgZGVwZW5kaW5nIG9uIHRoZSB2YXJpYXRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB2b2x0YWdlIGFuZCB0ZW1wZXJhdHVyZS4gICovCisvKioKKyAgKiBAYnJpZWYgRXh0ZXJuYWwgTG93IFNwZWVkIG9zY2lsbGF0b3IgKExTRSkgdmFsdWUuCisgICovCisjaWYgIWRlZmluZWQgIChMU0VfVkFMVUUpCisgI2RlZmluZSBMU0VfVkFMVUUgICgzMjc2OFUpICAgIC8qITwgVmFsdWUgb2YgdGhlIEV4dGVybmFsIExvdyBTcGVlZCBvc2NpbGxhdG9yIGluIEh6ICovCisjZW5kaWYgLyogTFNFX1ZBTFVFICovICAgICAKKworLyoqCisgICogQGJyaWVmIFRpbWUgb3V0IGZvciBMU0Ugc3RhcnQgdXAgdmFsdWUgaW4gbXMuCisgICovCisjaWYgIWRlZmluZWQgIChMU0VfU1RBUlRVUF9USU1FT1VUKQorICAjZGVmaW5lIExTRV9TVEFSVFVQX1RJTUVPVVQgICAgKDUwMDBVKSAgIC8qITwgVGltZSBvdXQgZm9yIExTRSBzdGFydCB1cCwgaW4gbXMgKi8KKyNlbmRpZiAvKiBMU0VfU1RBUlRVUF9USU1FT1VUICovCisKKy8qKgorICAqIEBicmllZiBFeHRlcm5hbCBjbG9jayBzb3VyY2UgZm9yIEkyUyBwZXJpcGhlcmFsCisgICogICAgICAgIFRoaXMgdmFsdWUgaXMgdXNlZCBieSB0aGUgSTJTIEhBTCBtb2R1bGUgdG8gY29tcHV0ZSB0aGUgSTJTIGNsb2NrIHNvdXJjZSAKKyAgKiAgICAgICAgZnJlcXVlbmN5LCB0aGlzIHNvdXJjZSBpcyBpbnNlcnRlZCBkaXJlY3RseSB0aHJvdWdoIEkyU19DS0lOIHBhZC4KKyAgKiAgICAgICAgLSBFeHRlcm5hbCBjbG9jayBnZW5lcmF0ZWQgdGhyb3VnaCBleHRlcm5hbCBQTEwgY29tcG9uZW50IG9uIEVWQUwgMzAzIChiYXNlZCBvbiBNQ08gb3IgY3J5c3RhbCkKKyAgKiAgICAgICAgLSBFeHRlcm5hbCBjbG9jayBub3QgZ2VuZXJhdGVkIG9uIEVWQUwgMzczCisgICovCisjaWYgIWRlZmluZWQgIChFWFRFUk5BTF9DTE9DS19WQUxVRSkKKyAgI2RlZmluZSBFWFRFUk5BTF9DTE9DS19WQUxVRSAgICAoODAwMDAwMFUpIC8qITwgVmFsdWUgb2YgdGhlIEV4dGVybmFsIG9zY2lsbGF0b3IgaW4gSHoqLworI2VuZGlmIC8qIEVYVEVSTkFMX0NMT0NLX1ZBTFVFICovCisKKy8qIFRpcDogVG8gYXZvaWQgbW9kaWZ5aW5nIHRoaXMgZmlsZSBlYWNoIHRpbWUgeW91IG5lZWQgdG8gdXNlIGRpZmZlcmVudCBIU0UsCisgICA9PT0gIHlvdSBjYW4gZGVmaW5lIHRoZSBIU0UgdmFsdWUgaW4geW91ciB0b29sY2hhaW4gY29tcGlsZXIgcHJlcHJvY2Vzc29yLiAqLworCisvKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgU3lzdGVtIENvbmZpZ3VyYXRpb24gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAqLworLyoqCisgICogQGJyaWVmIFRoaXMgaXMgdGhlIEhBTCBzeXN0ZW0gY29uZmlndXJhdGlvbiBzZWN0aW9uCisgICovICAgICAKKyNkZWZpbmUgIFZERF9WQUxVRSAgICAgICAgICAgICAgICAgICAgKDMzMDBVKSAvKiE8IFZhbHVlIG9mIFZERCBpbiBtdiAqLworI2RlZmluZSAgVElDS19JTlRfUFJJT1JJVFkgICAgICAgICAgICAoKHVpbnQzMl90KSgxVTw8X19OVklDX1BSSU9fQklUUykgLSAxVSkgICAvKiE8IHRpY2sgaW50ZXJydXB0IHByaW9yaXR5IChsb3dlc3QgYnkgZGVmYXVsdCkgKi8KKyNkZWZpbmUgIFVTRV9SVE9TICAgICAgICAgICAgICAgICAgICAgMFUKKyNkZWZpbmUgIFBSRUZFVENIX0VOQUJMRSAgICAgICAgICAgICAgMVUKKyNkZWZpbmUgIElOU1RSVUNUSU9OX0NBQ0hFX0VOQUJMRSAgICAgMFUKKyNkZWZpbmUgIERBVEFfQ0FDSEVfRU5BQkxFICAgICAgICAgICAgMFUKKyNkZWZpbmUgIFVTRV9TUElfQ1JDICAgICAgICAgICAgICAgICAgMVUKKworLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQXNzZXJ0IFNlbGVjdGlvbiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KKy8qKgorICAqIEBicmllZiBVbmNvbW1lbnQgdGhlIGxpbmUgYmVsb3cgdG8gZXhwYW5zZSB0aGUgImFzc2VydF9wYXJhbSIgbWFjcm8gaW4gdGhlIAorICAqICAgICAgICBIQUwgZHJpdmVycyBjb2RlCisgICovCisvKiNkZWZpbmUgVVNFX0ZVTExfQVNTRVJUICAgIDFVKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKgorICAqIEBicmllZiBJbmNsdWRlIG1vZHVsZSdzIGhlYWRlciBmaWxlIAorICAqLworCisjaWZkZWYgSEFMX1JDQ19NT0RVTEVfRU5BQkxFRAorICNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX3JjYy5oIgorI2VuZGlmIC8qIEhBTF9SQ0NfTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9HUElPX01PRFVMRV9FTkFCTEVECisgI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfZ3Bpby5oIgorI2VuZGlmIC8qIEhBTF9HUElPX01PRFVMRV9FTkFCTEVEICovCisKKyNpZmRlZiBIQUxfRE1BX01PRFVMRV9FTkFCTEVECisgICNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2RtYS5oIgorI2VuZGlmIC8qIEhBTF9ETUFfTU9EVUxFX0VOQUJMRUQgKi8KKyAgIAorI2lmZGVmIEhBTF9DT1JURVhfTU9EVUxFX0VOQUJMRUQKKyAjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9jb3J0ZXguaCIKKyNlbmRpZiAvKiBIQUxfQ09SVEVYX01PRFVMRV9FTkFCTEVEICovCisKKyNpZmRlZiBIQUxfQURDX01PRFVMRV9FTkFCTEVECisgI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfYWRjLmgiCisjZW5kaWYgLyogSEFMX0FEQ19NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX0NBTl9NT0RVTEVfRU5BQkxFRAorICNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2Nhbi5oIgorI2VuZGlmIC8qIEhBTF9DQU5fTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9DQU5fTEVHQUNZX01PRFVMRV9FTkFCTEVECisgICNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2Nhbl9sZWdhY3kuaCIKKyNlbmRpZiAvKiBIQUxfQ0FOX0xFR0FDWV9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX0NFQ19NT0RVTEVfRU5BQkxFRAorICNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2NlYy5oIgorI2VuZGlmIC8qIEhBTF9DRUNfTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9DT01QX01PRFVMRV9FTkFCTEVECisgI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfY29tcC5oIgorI2VuZGlmIC8qIEhBTF9DT01QX01PRFVMRV9FTkFCTEVEICovCisKKyNpZmRlZiBIQUxfQ1JDX01PRFVMRV9FTkFCTEVECisgI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfY3JjLmgiCisjZW5kaWYgLyogSEFMX0NSQ19NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX0RBQ19NT0RVTEVfRU5BQkxFRAorICNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2RhYy5oIgorI2VuZGlmIC8qIEhBTF9EQUNfTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9GTEFTSF9NT0RVTEVfRU5BQkxFRAorICNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2ZsYXNoLmgiCisjZW5kaWYgLyogSEFMX0ZMQVNIX01PRFVMRV9FTkFCTEVEICovCisKKyNpZmRlZiBIQUxfU1JBTV9NT0RVTEVfRU5BQkxFRAorICAjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9zcmFtLmgiCisjZW5kaWYgLyogSEFMX1NSQU1fTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9OT1JfTU9EVUxFX0VOQUJMRUQKKyAgI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfbm9yLmgiCisjZW5kaWYgLyogSEFMX05PUl9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX05BTkRfTU9EVUxFX0VOQUJMRUQKKyAgI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfbmFuZC5oIgorI2VuZGlmIC8qIEhBTF9OQU5EX01PRFVMRV9FTkFCTEVEICovCisKKyNpZmRlZiBIQUxfUENDQVJEX01PRFVMRV9FTkFCTEVECisgICNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX3BjY2FyZC5oIgorI2VuZGlmIC8qIEhBTF9QQ0NBUkRfTU9EVUxFX0VOQUJMRUQgKi8gCisgIAorI2lmZGVmIEhBTF9IUlRJTV9NT0RVTEVfRU5BQkxFRAorICNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2hydGltLmgiCisjZW5kaWYgLyogSEFMX0hSVElNX01PRFVMRV9FTkFCTEVEICovCisKKyNpZmRlZiBIQUxfSTJDX01PRFVMRV9FTkFCTEVECisgI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfaTJjLmgiCisjZW5kaWYgLyogSEFMX0kyQ19NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX0kyU19NT0RVTEVfRU5BQkxFRAorICNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2kycy5oIgorI2VuZGlmIC8qIEhBTF9JMlNfTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9JUkRBX01PRFVMRV9FTkFCTEVECisgI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfaXJkYS5oIgorI2VuZGlmIC8qIEhBTF9JUkRBX01PRFVMRV9FTkFCTEVEICovCisKKyNpZmRlZiBIQUxfSVdER19NT0RVTEVfRU5BQkxFRAorICNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2l3ZGcuaCIKKyNlbmRpZiAvKiBIQUxfSVdER19NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX09QQU1QX01PRFVMRV9FTkFCTEVECisgI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfb3BhbXAuaCIKKyNlbmRpZiAvKiBIQUxfT1BBTVBfTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9QQ0RfTU9EVUxFX0VOQUJMRUQKKyAjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9wY2QuaCIKKyNlbmRpZiAvKiBIQUxfUENEX01PRFVMRV9FTkFCTEVEICovCisKKyNpZmRlZiBIQUxfUFdSX01PRFVMRV9FTkFCTEVECisgI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfcHdyLmgiCisjZW5kaWYgLyogSEFMX1BXUl9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX1JUQ19NT0RVTEVfRU5BQkxFRAorICNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX3J0Yy5oIgorI2VuZGlmIC8qIEhBTF9SVENfTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9TREFEQ19NT0RVTEVfRU5BQkxFRAorICNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX3NkYWRjLmgiCisjZW5kaWYgLyogSEFMX1NEQURDX01PRFVMRV9FTkFCTEVEICovCisKKyNpZmRlZiBIQUxfU01BUlRDQVJEX01PRFVMRV9FTkFCTEVECisgI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfc21hcnRjYXJkLmgiCisjZW5kaWYgLyogSEFMX1NNQVJUQ0FSRF9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX1NNQlVTX01PRFVMRV9FTkFCTEVECisgI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfc21idXMuaCIKKyNlbmRpZiAvKiBIQUxfU01CVVNfTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9TUElfTU9EVUxFX0VOQUJMRUQKKyAjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9zcGkuaCIKKyNlbmRpZiAvKiBIQUxfU1BJX01PRFVMRV9FTkFCTEVEICovCisKKyNpZmRlZiBIQUxfVElNX01PRFVMRV9FTkFCTEVECisgI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfdGltLmgiCisjZW5kaWYgLyogSEFMX1RJTV9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX1RTQ19NT0RVTEVfRU5BQkxFRAorICNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX3RzYy5oIgorI2VuZGlmIC8qIEhBTF9UU0NfTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9VQVJUX01PRFVMRV9FTkFCTEVECisgI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfdWFydC5oIgorI2VuZGlmIC8qIEhBTF9VQVJUX01PRFVMRV9FTkFCTEVEICovCisKKyNpZmRlZiBIQUxfVVNBUlRfTU9EVUxFX0VOQUJMRUQKKyAjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF91c2FydC5oIgorI2VuZGlmIC8qIEhBTF9VU0FSVF9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX1dXREdfTU9EVUxFX0VOQUJMRUQKKyAjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF93d2RnLmgiCisjZW5kaWYgLyogSEFMX1dXREdfTU9EVUxFX0VOQUJMRUQgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiAgVVNFX0ZVTExfQVNTRVJUCisvKioKKyAgKiBAYnJpZWYgIFRoZSBhc3NlcnRfcGFyYW0gbWFjcm8gaXMgdXNlZCBmb3IgZnVuY3Rpb24ncyBwYXJhbWV0ZXJzIGNoZWNrLgorICAqIEBwYXJhbSAgZXhwciBJZiBleHByIGlzIGZhbHNlLCBpdCBjYWxscyBhc3NlcnRfZmFpbGVkIGZ1bmN0aW9uCisgICogICAgICAgICB3aGljaCByZXBvcnRzIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBhbmQgdGhlIHNvdXJjZQorICAqICAgICAgICAgbGluZSBudW1iZXIgb2YgdGhlIGNhbGwgdGhhdCBmYWlsZWQuIAorICAqICAgICAgICAgSWYgZXhwciBpcyB0cnVlLCBpdCByZXR1cm5zIG5vIHZhbHVlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworICAjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKGV4cHIpID8gKHZvaWQpMFUgOiBhc3NlcnRfZmFpbGVkKChjaGFyICopX19GSUxFX18sIF9fTElORV9fKSkKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgIHZvaWQgYXNzZXJ0X2ZhaWxlZChjaGFyKiBmaWxlLCB1aW50MzJfdCBsaW5lKTsKKyNlbHNlCisgICNkZWZpbmUgYXNzZXJ0X3BhcmFtKGV4cHIpICgodm9pZCkwVSkKKyNlbmRpZiAvKiBVU0VfRlVMTF9BU1NFUlQgKi8gICAgCisgICAgCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkYzeHhfSEFMX0NPTkZfSCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2hhbF9jb3J0ZXguaCBiL0luYy9zdG0zMmYzeHhfaGFsX2NvcnRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZDc2YWUKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2hhbF9jb3J0ZXguaApAQCAtMCwwICsxLDQ0MiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfY29ydGV4LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIENPUlRFWCBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8gCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0hBTF9DT1JURVhfSAorI2RlZmluZSBfX1NUTTMyRjN4eF9IQUxfQ09SVEVYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgQ09SVEVYCisgICogQHsKKyAgKi8gCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDT1JURVhfRXhwb3J0ZWRfVHlwZXMgQ09SVEVYIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworI2lmIChfX01QVV9QUkVTRU5UID09IDFVKQorLyoqIEBkZWZncm91cCBDT1JURVhfTVBVX1JlZ2lvbl9Jbml0aWFsaXphdGlvbl9TdHJ1Y3R1cmVfZGVmaW5pdGlvbiBNUFUgUmVnaW9uIEluaXRpYWxpemF0aW9uIFN0cnVjdHVyZSBEZWZpbml0aW9uCisgICogQGJyaWVmICBNUFUgUmVnaW9uIGluaXRpYWxpemF0aW9uIHN0cnVjdHVyZSAKKyAgKiBAeworICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDhfdCAgICAgICAgICAgICAgICBFbmFibGU7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIHJlZ2lvbi4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09SVEVYX01QVV9SZWdpb25fRW5hYmxlICAgICAgICAgICAgICAgICAqLworICB1aW50OF90ICAgICAgICAgICAgICAgIE51bWJlcjsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0aGUgcmVnaW9uIHRvIHByb3RlY3QuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPUlRFWF9NUFVfUmVnaW9uX051bWJlciAgICAgICAgICAgICAgICAgKi8KKyAgdWludDMyX3QgICAgICAgICAgICAgICBCYXNlQWRkcmVzczsgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbiB0byBwcm90ZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgU2l6ZTsgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgc2l6ZSBvZiB0aGUgcmVnaW9uIHRvIHByb3RlY3QuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPUlRFWF9NUFVfUmVnaW9uX1NpemUgICAgICAgICAgICAgICAgICAgKi8KKyAgdWludDhfdCAgICAgICAgICAgICAgICBTdWJSZWdpb25EaXNhYmxlOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGhlIHN1YnJlZ2lvbiBwcm90ZWN0aW9uIHRvIGRpc2FibGUuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9IDB4RkYgICAgKi8gICAgICAgICAKKyAgdWludDhfdCAgICAgICAgICAgICAgICBUeXBlRXh0RmllbGQ7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBURVggZmllbGQgbGV2ZWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09SVEVYX01QVV9URVhfTGV2ZWxzICAgICAgICAgICAgICAgICAgICAqLyAgICAgICAgICAgICAgICAgCisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgQWNjZXNzUGVybWlzc2lvbjsgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcmVnaW9uIGFjY2VzcyBwZXJtaXNzaW9uIHR5cGUuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPUlRFWF9NUFVfUmVnaW9uX1Blcm1pc3Npb25fQXR0cmlidXRlcyAgKi8KKyAgdWludDhfdCAgICAgICAgICAgICAgICBEaXNhYmxlRXhlYzsgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBpbnN0cnVjdGlvbiBhY2Nlc3Mgc3RhdHVzLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT1JURVhfTVBVX0luc3RydWN0aW9uX0FjY2VzcyAgICAgICAgICAgICovCisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgSXNTaGFyZWFibGU7ICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgc2hhcmVhYmlsaXR5IHN0YXR1cyBvZiB0aGUgcHJvdGVjdGVkIHJlZ2lvbi4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09SVEVYX01QVV9BY2Nlc3NfU2hhcmVhYmxlICAgICAgICAgICAgICAqLworICB1aW50OF90ICAgICAgICAgICAgICAgIElzQ2FjaGVhYmxlOyAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGNhY2hlYWJsZSBzdGF0dXMgb2YgdGhlIHJlZ2lvbiBwcm90ZWN0ZWQuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPUlRFWF9NUFVfQWNjZXNzX0NhY2hlYWJsZSAgICAgICAgICAgICAgKi8KKyAgdWludDhfdCAgICAgICAgICAgICAgICBJc0J1ZmZlcmFibGU7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBidWZmZXJhYmxlIHN0YXR1cyBvZiB0aGUgcHJvdGVjdGVkIHJlZ2lvbi4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09SVEVYX01QVV9BY2Nlc3NfQnVmZmVyYWJsZSAgICAgICAgICAgICAqLworfU1QVV9SZWdpb25fSW5pdFR5cGVEZWY7CisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIF9fTVBVX1BSRVNFTlQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfRXhwb3J0ZWRfQ29uc3RhbnRzIENPUlRFWCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9QcmVlbXB0aW9uX1ByaW9yaXR5X0dyb3VwIENPUlRFWCBQcmVlbXB0aW9uIFByaW9yaXR5IEdyb3VwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTlZJQ19QUklPUklUWUdST1VQXzAgICAgICAgICAoMHgwMDAwMDAwN1UpIC8qITwgMCBiaXRzIGZvciBwcmUtZW1wdGlvbiBwcmlvcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0IGJpdHMgZm9yIHN1YnByaW9yaXR5ICovCisjZGVmaW5lIE5WSUNfUFJJT1JJVFlHUk9VUF8xICAgICAgICAgKDB4MDAwMDAwMDZVKSAvKiE8IDEgYml0cyBmb3IgcHJlLWVtcHRpb24gcHJpb3JpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyBiaXRzIGZvciBzdWJwcmlvcml0eSAqLworI2RlZmluZSBOVklDX1BSSU9SSVRZR1JPVVBfMiAgICAgICAgICgweDAwMDAwMDA1VSkgLyohPCAyIGJpdHMgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgYml0cyBmb3Igc3VicHJpb3JpdHkgKi8KKyNkZWZpbmUgTlZJQ19QUklPUklUWUdST1VQXzMgICAgICAgICAoMHgwMDAwMDAwNFUpIC8qITwgMyBiaXRzIGZvciBwcmUtZW1wdGlvbiBwcmlvcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIGJpdHMgZm9yIHN1YnByaW9yaXR5ICovCisjZGVmaW5lIE5WSUNfUFJJT1JJVFlHUk9VUF80ICAgICAgICAgKDB4MDAwMDAwMDNVKSAvKiE8IDQgYml0cyBmb3IgcHJlLWVtcHRpb24gcHJpb3JpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCBiaXRzIGZvciBzdWJwcmlvcml0eSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfU3lzVGlja19jbG9ja19zb3VyY2UgQ09SVEVYIFN5c1RpY2sgY2xvY2sgc291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1lTVElDS19DTEtTT1VSQ0VfSENMS19ESVY4ICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU1lTVElDS19DTEtTT1VSQ0VfSENMSyAgICAgICAgICgweDAwMDAwMDA0VSkKKy8qKgorICAqIEB9CisgICovCisKKyNpZiAoX19NUFVfUFJFU0VOVCA9PSAxVSkKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX01QVV9IRk5NSV9QUklWREVGX0NvbnRyb2wgTVBVIEhGTk1JIGFuZCBQUklWSUxFR0VEIEFjY2VzcyBjb250cm9sCisgICogQHsKKyAgKi8KKyNkZWZpbmUgIE1QVV9IRk5NSV9QUklWREVGX05PTkUgICAgICAoMHgwMDAwMDAwMFUpICAKKyNkZWZpbmUgIE1QVV9IQVJERkFVTFRfTk1JICAgICAgICAgICAoMHgwMDAwMDAwMlUpCisjZGVmaW5lICBNUFVfUFJJVklMRUdFRF9ERUZBVUxUICAgICAgKDB4MDAwMDAwMDRVKQorI2RlZmluZSAgTVBVX0hGTk1JX1BSSVZERUYgICAgICAgICAgICgweDAwMDAwMDA2VSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX01QVV9SZWdpb25fRW5hYmxlIENPUlRFWCBNUFUgUmVnaW9uIEVuYWJsZQorICAqIEB7CisgICovCisjZGVmaW5lICBNUFVfUkVHSU9OX0VOQUJMRSAgICAgKCh1aW50OF90KTB4MDFVKQorI2RlZmluZSAgTVBVX1JFR0lPTl9ESVNBQkxFICAgICgodWludDhfdCkweDAwVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX01QVV9JbnN0cnVjdGlvbl9BY2Nlc3MgQ09SVEVYIE1QVSBJbnN0cnVjdGlvbiBBY2Nlc3MKKyAgKiBAeworICAqLworI2RlZmluZSAgTVBVX0lOU1RSVUNUSU9OX0FDQ0VTU19FTkFCTEUgICAgICAoKHVpbnQ4X3QpMHgwMFUpCisjZGVmaW5lICBNUFVfSU5TVFJVQ1RJT05fQUNDRVNTX0RJU0FCTEUgICAgICgodWludDhfdCkweDAxVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX01QVV9BY2Nlc3NfU2hhcmVhYmxlIENPUlRFWCBNUFUgSW5zdHJ1Y3Rpb24gQWNjZXNzIFNoYXJlYWJsZQorICAqIEB7CisgICovCisjZGVmaW5lICBNUFVfQUNDRVNTX1NIQVJFQUJMRSAgICAgICAgKCh1aW50OF90KTB4MDFVKQorI2RlZmluZSAgTVBVX0FDQ0VTU19OT1RfU0hBUkVBQkxFICAgICgodWludDhfdCkweDAwVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX01QVV9BY2Nlc3NfQ2FjaGVhYmxlIENPUlRFWCBNUFUgSW5zdHJ1Y3Rpb24gQWNjZXNzIENhY2hlYWJsZQorICAqIEB7CisgICovCisjZGVmaW5lICBNUFVfQUNDRVNTX0NBQ0hFQUJMRSAgICAgICAgICgodWludDhfdCkweDAxVSkKKyNkZWZpbmUgIE1QVV9BQ0NFU1NfTk9UX0NBQ0hFQUJMRSAgICAgKCh1aW50OF90KTB4MDBVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTVBVX0FjY2Vzc19CdWZmZXJhYmxlIENPUlRFWCBNUFUgSW5zdHJ1Y3Rpb24gQWNjZXNzIEJ1ZmZlcmFibGUKKyAgKiBAeworICAqLworI2RlZmluZSAgTVBVX0FDQ0VTU19CVUZGRVJBQkxFICAgICAgICAgKCh1aW50OF90KTB4MDFVKQorI2RlZmluZSAgTVBVX0FDQ0VTU19OT1RfQlVGRkVSQUJMRSAgICAgKCh1aW50OF90KTB4MDBVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTVBVX1RFWF9MZXZlbHMgTVBVIFRFWCBMZXZlbHMKKyAgKiBAeworICAqLworI2RlZmluZSAgTVBVX1RFWF9MRVZFTDAgICAgKCh1aW50OF90KTB4MDBVKQorI2RlZmluZSAgTVBVX1RFWF9MRVZFTDEgICAgKCh1aW50OF90KTB4MDFVKQorI2RlZmluZSAgTVBVX1RFWF9MRVZFTDIgICAgKCh1aW50OF90KTB4MDJVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTVBVX1JlZ2lvbl9TaXplIENPUlRFWCBNUFUgUmVnaW9uIFNpemUKKyAgKiBAeworICAqLworI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV8zMkIgICAgICAoKHVpbnQ4X3QpMHgwNFUpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzY0QiAgICAgICgodWludDhfdCkweDA1VSkKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMTI4QiAgICAgKCh1aW50OF90KTB4MDZVKSAKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMjU2QiAgICAgKCh1aW50OF90KTB4MDdVKSAKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfNTEyQiAgICAgKCh1aW50OF90KTB4MDhVKSAKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMUtCICAgICAgKCh1aW50OF90KTB4MDlVKSAgCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzJLQiAgICAgICgodWludDhfdCkweDBBVSkKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfNEtCICAgICAgKCh1aW50OF90KTB4MEJVKSAKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfOEtCICAgICAgKCh1aW50OF90KTB4MENVKSAKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMTZLQiAgICAgKCh1aW50OF90KTB4MERVKSAKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMzJLQiAgICAgKCh1aW50OF90KTB4MEVVKSAKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfNjRLQiAgICAgKCh1aW50OF90KTB4MEZVKSAKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMTI4S0IgICAgKCh1aW50OF90KTB4MTBVKQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV8yNTZLQiAgICAoKHVpbnQ4X3QpMHgxMVUpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzUxMktCICAgICgodWludDhfdCkweDEyVSkKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMU1CICAgICAgKCh1aW50OF90KTB4MTNVKSAKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMk1CICAgICAgKCh1aW50OF90KTB4MTRVKSAKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfNE1CICAgICAgKCh1aW50OF90KTB4MTVVKSAKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfOE1CICAgICAgKCh1aW50OF90KTB4MTZVKSAKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMTZNQiAgICAgKCh1aW50OF90KTB4MTdVKQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV8zMk1CICAgICAoKHVpbnQ4X3QpMHgxOFUpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzY0TUIgICAgICgodWludDhfdCkweDE5VSkKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMTI4TUIgICAgKCh1aW50OF90KTB4MUFVKQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV8yNTZNQiAgICAoKHVpbnQ4X3QpMHgxQlUpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzUxMk1CICAgICgodWludDhfdCkweDFDVSkKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMUdCICAgICAgKCh1aW50OF90KTB4MURVKSAKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMkdCICAgICAgKCh1aW50OF90KTB4MUVVKSAKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfNEdCICAgICAgKCh1aW50OF90KTB4MUZVKQorLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgKiBAfQorICAqLworICAgCisvKiogQGRlZmdyb3VwIENPUlRFWF9NUFVfUmVnaW9uX1Blcm1pc3Npb25fQXR0cmlidXRlcyBDT1JURVggTVBVIFJlZ2lvbiBQZXJtaXNzaW9uIEF0dHJpYnV0ZXMgCisgICogQHsKKyAgKi8KKyNkZWZpbmUgIE1QVV9SRUdJT05fTk9fQUNDRVNTICAgICAgKCh1aW50OF90KTB4MDBVKSAgCisjZGVmaW5lICBNUFVfUkVHSU9OX1BSSVZfUlcgICAgICAgICgodWludDhfdCkweDAxVSkgCisjZGVmaW5lICBNUFVfUkVHSU9OX1BSSVZfUldfVVJPICAgICgodWludDhfdCkweDAyVSkgIAorI2RlZmluZSAgTVBVX1JFR0lPTl9GVUxMX0FDQ0VTUyAgICAoKHVpbnQ4X3QpMHgwM1UpICAKKyNkZWZpbmUgIE1QVV9SRUdJT05fUFJJVl9STyAgICAgICAgKCh1aW50OF90KTB4MDVVKSAKKyNkZWZpbmUgIE1QVV9SRUdJT05fUFJJVl9ST19VUk8gICAgKCh1aW50OF90KTB4MDZVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTVBVX1JlZ2lvbl9OdW1iZXIgQ09SVEVYIE1QVSBSZWdpb24gTnVtYmVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgIE1QVV9SRUdJT05fTlVNQkVSMCAgICAoKHVpbnQ4X3QpMHgwMFUpICAKKyNkZWZpbmUgIE1QVV9SRUdJT05fTlVNQkVSMSAgICAoKHVpbnQ4X3QpMHgwMVUpIAorI2RlZmluZSAgTVBVX1JFR0lPTl9OVU1CRVIyICAgICgodWludDhfdCkweDAyVSkgIAorI2RlZmluZSAgTVBVX1JFR0lPTl9OVU1CRVIzICAgICgodWludDhfdCkweDAzVSkgIAorI2RlZmluZSAgTVBVX1JFR0lPTl9OVU1CRVI0ICAgICgodWludDhfdCkweDA0VSkgCisjZGVmaW5lICBNUFVfUkVHSU9OX05VTUJFUjUgICAgKCh1aW50OF90KTB4MDVVKQorI2RlZmluZSAgTVBVX1JFR0lPTl9OVU1CRVI2ICAgICgodWludDhfdCkweDA2VSkKKyNkZWZpbmUgIE1QVV9SRUdJT05fTlVNQkVSNyAgICAoKHVpbnQ4X3QpMHgwN1UpCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIF9fTVBVX1BSRVNFTlQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgTWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIENPUlRFWF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgQ09SVEVYX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAqIEB7CisgKi8KKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhBTF9OVklDX1NldFByaW9yaXR5R3JvdXBpbmcodWludDMyX3QgUHJpb3JpdHlHcm91cCk7Cit2b2lkIEhBTF9OVklDX1NldFByaW9yaXR5KElSUW5fVHlwZSBJUlFuLCB1aW50MzJfdCBQcmVlbXB0UHJpb3JpdHksIHVpbnQzMl90IFN1YlByaW9yaXR5KTsKK3ZvaWQgSEFMX05WSUNfRW5hYmxlSVJRKElSUW5fVHlwZSBJUlFuKTsKK3ZvaWQgSEFMX05WSUNfRGlzYWJsZUlSUShJUlFuX1R5cGUgSVJRbik7Cit2b2lkIEhBTF9OVklDX1N5c3RlbVJlc2V0KHZvaWQpOwordWludDMyX3QgSEFMX1NZU1RJQ0tfQ29uZmlnKHVpbnQzMl90IFRpY2tzTnVtYik7CisvKioKKyAgKiBAfQorICAqLworICAKKy8qKiBAYWRkdG9ncm91cCBDT1JURVhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICogQHsKKyAqLworLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAoX19NUFVfUFJFU0VOVCA9PSAxVSkKK3ZvaWQgSEFMX01QVV9Db25maWdSZWdpb24oTVBVX1JlZ2lvbl9Jbml0VHlwZURlZiAqTVBVX0luaXQpOworI2VuZGlmIC8qIF9fTVBVX1BSRVNFTlQgKi8KK3VpbnQzMl90IEhBTF9OVklDX0dldFByaW9yaXR5R3JvdXBpbmcodm9pZCk7Cit2b2lkIEhBTF9OVklDX0dldFByaW9yaXR5KElSUW5fVHlwZSBJUlFuLCB1aW50MzJfdCBQcmlvcml0eUdyb3VwLCB1aW50MzJfdCogcFByZWVtcHRQcmlvcml0eSwgdWludDMyX3QqIHBTdWJQcmlvcml0eSk7Cit1aW50MzJfdCBIQUxfTlZJQ19HZXRQZW5kaW5nSVJRKElSUW5fVHlwZSBJUlFuKTsKK3ZvaWQgSEFMX05WSUNfU2V0UGVuZGluZ0lSUShJUlFuX1R5cGUgSVJRbik7Cit2b2lkIEhBTF9OVklDX0NsZWFyUGVuZGluZ0lSUShJUlFuX1R5cGUgSVJRbik7Cit1aW50MzJfdCBIQUxfTlZJQ19HZXRBY3RpdmUoSVJRbl9UeXBlIElSUW4pOwordm9pZCBIQUxfU1lTVElDS19DTEtTb3VyY2VDb25maWcodWludDMyX3QgQ0xLU291cmNlKTsKK3ZvaWQgSEFMX1NZU1RJQ0tfSVJRSGFuZGxlcih2b2lkKTsKK3ZvaWQgSEFMX1NZU1RJQ0tfQ2FsbGJhY2sodm9pZCk7CisvKioKKyAgKiBAfQorICAqLyAgCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDT1JURVhfUHJpdmF0ZV9NYWNyb3MgQ09SVEVYIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8gIAorI2RlZmluZSBJU19OVklDX1BSSU9SSVRZX0dST1VQKEdST1VQKSAoKChHUk9VUCkgPT0gTlZJQ19QUklPUklUWUdST1VQXzApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoR1JPVVApID09IE5WSUNfUFJJT1JJVFlHUk9VUF8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEdST1VQKSA9PSBOVklDX1BSSU9SSVRZR1JPVVBfMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChHUk9VUCkgPT0gTlZJQ19QUklPUklUWUdST1VQXzMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoR1JPVVApID09IE5WSUNfUFJJT1JJVFlHUk9VUF80KSkKKworI2RlZmluZSBJU19OVklDX1BSRUVNUFRJT05fUFJJT1JJVFkoUFJJT1JJVFkpICAoKFBSSU9SSVRZKSA8IDB4MTBVKQorCisjZGVmaW5lIElTX05WSUNfU1VCX1BSSU9SSVRZKFBSSU9SSVRZKSAgKChQUklPUklUWSkgPCAweDEwVSkKKworI2RlZmluZSBJU19OVklDX0RFVklDRV9JUlEoSVJRKSAgKChJUlEpID49IDB4MDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisvKiogQGRlZmdyb3VwIENPUlRFWF9TeXNUaWNrX2Nsb2NrX3NvdXJjZV9NYWNyb19Qcml2YXRlIENPUlRFWCBTeXNUaWNrIGNsb2NrIHNvdXJjZQorICAqIEB7CisgICovICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgSVNfU1lTVElDS19DTEtfU09VUkNFKFNPVVJDRSkgKCgoU09VUkNFKSA9PSBTWVNUSUNLX0NMS1NPVVJDRV9IQ0xLKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gU1lTVElDS19DTEtTT1VSQ0VfSENMS19ESVY4KSkKKy8qKgorICAqIEB9CisgICovCisKKyNpZiAoX19NUFVfUFJFU0VOVCA9PSAxVSkKKyNkZWZpbmUgSVNfTVBVX1JFR0lPTl9FTkFCTEUoU1RBVEUpICgoKFNUQVRFKSA9PSBNUFVfUkVHSU9OX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RBVEUpID09IE1QVV9SRUdJT05fRElTQUJMRSkpCisKKyNkZWZpbmUgSVNfTVBVX0lOU1RSVUNUSU9OX0FDQ0VTUyhTVEFURSkgKCgoU1RBVEUpID09IE1QVV9JTlNUUlVDVElPTl9BQ0NFU1NfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQVRFKSA9PSBNUFVfSU5TVFJVQ1RJT05fQUNDRVNTX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX01QVV9BQ0NFU1NfU0hBUkVBQkxFKFNUQVRFKSAgICgoKFNUQVRFKSA9PSBNUFVfQUNDRVNTX1NIQVJFQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVEFURSkgPT0gTVBVX0FDQ0VTU19OT1RfU0hBUkVBQkxFKSkKKworI2RlZmluZSBJU19NUFVfQUNDRVNTX0NBQ0hFQUJMRShTVEFURSkgICAoKChTVEFURSkgPT0gTVBVX0FDQ0VTU19DQUNIRUFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RBVEUpID09IE1QVV9BQ0NFU1NfTk9UX0NBQ0hFQUJMRSkpCisKKyNkZWZpbmUgSVNfTVBVX0FDQ0VTU19CVUZGRVJBQkxFKFNUQVRFKSAgICgoKFNUQVRFKSA9PSBNUFVfQUNDRVNTX0JVRkZFUkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RBVEUpID09IE1QVV9BQ0NFU1NfTk9UX0JVRkZFUkFCTEUpKQorCisjZGVmaW5lIElTX01QVV9URVhfTEVWRUwoVFlQRSkgKCgoVFlQRSkgPT0gTVBVX1RFWF9MRVZFTDApICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFlQRSkgPT0gTVBVX1RFWF9MRVZFTDEpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFlQRSkgPT0gTVBVX1RFWF9MRVZFTDIpKQorCisjZGVmaW5lIElTX01QVV9SRUdJT05fUEVSTUlTU0lPTl9BVFRSSUJVVEUoVFlQRSkgKCgoVFlQRSkgPT0gTVBVX1JFR0lPTl9OT19BQ0NFU1MpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRZUEUpID09IE1QVV9SRUdJT05fUFJJVl9SVykgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUWVBFKSA9PSBNUFVfUkVHSU9OX1BSSVZfUldfVVJPKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFlQRSkgPT0gTVBVX1JFR0lPTl9GVUxMX0FDQ0VTUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRZUEUpID09IE1QVV9SRUdJT05fUFJJVl9STykgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUWVBFKSA9PSBNUFVfUkVHSU9OX1BSSVZfUk9fVVJPKSkKKworI2RlZmluZSBJU19NUFVfUkVHSU9OX05VTUJFUihOVU1CRVIpICAgICgoKE5VTUJFUikgPT0gTVBVX1JFR0lPTl9OVU1CRVIwKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTlVNQkVSKSA9PSBNUFVfUkVHSU9OX05VTUJFUjEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChOVU1CRVIpID09IE1QVV9SRUdJT05fTlVNQkVSMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE5VTUJFUikgPT0gTVBVX1JFR0lPTl9OVU1CRVIzKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTlVNQkVSKSA9PSBNUFVfUkVHSU9OX05VTUJFUjQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChOVU1CRVIpID09IE1QVV9SRUdJT05fTlVNQkVSNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE5VTUJFUikgPT0gTVBVX1JFR0lPTl9OVU1CRVI2KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTlVNQkVSKSA9PSBNUFVfUkVHSU9OX05VTUJFUjcpKQorCisjZGVmaW5lIElTX01QVV9SRUdJT05fU0laRShTSVpFKSAgICAoKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMzJCKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV82NEIpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzEyOEIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMjU2QikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV81MTJCKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzFLQikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMktCKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV80S0IpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzhLQikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMTZLQikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8zMktCKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzY0S0IpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMTI4S0IpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8yNTZLQikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzUxMktCKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMU1CKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8yTUIpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzRNQikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfOE1CKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8xNk1CKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzMyTUIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfNjRNQikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8xMjhNQikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzI1Nk1CKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfNTEyTUIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8xR0IpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzJHQikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfNEdCKSkKKworI2RlZmluZSBJU19NUFVfU1VCX1JFR0lPTl9ESVNBQkxFKFNVQlJFR0lPTikgICgoU1VCUkVHSU9OKSA8ICh1aW50MTZfdCkweDAwRkZVKQorI2VuZGlmIC8qIF9fTVBVX1BSRVNFTlQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gICAKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX1ByaXZhdGVfRnVuY3Rpb25zIENPUlRFWCBQcml2YXRlIEZ1bmN0aW9ucworICAqIEBicmllZiAgICBDT1JURVggcHJpdmF0ZSAgZnVuY3Rpb25zIAorICAqIEB7CisgICovCisKKyNpZiAoX19NUFVfUFJFU0VOVCA9PSAxVSkKKwordm9pZCBIQUxfTVBVX0Rpc2FibGUodm9pZCk7Cit2b2lkIEhBTF9NUFVfRW5hYmxlKHVpbnQzMl90IE1QVV9Db250cm9sKTsKKworI2VuZGlmIC8qIF9fTVBVX1BSRVNFTlQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8gCisKKy8qKgorICAqIEB9CisgICovCisgIAorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJGM3h4X0hBTF9DT1JURVhfSCAqLworIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjN4eF9oYWxfY3JjLmggYi9JbmMvc3RtMzJmM3h4X2hhbF9jcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGE1NmM5Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjN4eF9oYWxfY3JjLmgKQEAgLTAsMCArMSwzNjYgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX2NyYy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBDUkMgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkYzeHhfSEFMX0NSQ19ICisjZGVmaW5lIF9fU1RNMzJGM3h4X0hBTF9DUkNfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBDUkMgQ1JDCisgICogQHsKKyAgKi8gCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorLyoqIEBkZWZncm91cCBDUkNfRXhwb3J0ZWRfVHlwZXMgQ1JDIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKy8qKiAKKyAgKiBAYnJpZWYgIENSQyBIQUwgU3RhdGUgU3RydWN0dXJlIGRlZmluaXRpb24gIAorICAqLyAKK3R5cGVkZWYgZW51bQoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIEhBTF9DUkNfU1RBVEVfUkVTRVQgICAgID0gMHgwMFUsICAvKiE8IENSQyBub3QgeWV0IGluaXRpYWxpemVkIG9yIGRpc2FibGVkICovCisgIEhBTF9DUkNfU1RBVEVfUkVBRFkgICAgID0gMHgwMVUsICAvKiE8IENSQyBpbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZSAgICovCisgIEhBTF9DUkNfU1RBVEVfQlVTWSAgICAgID0gMHgwMlUsICAvKiE8IENSQyBpbnRlcm5hbCBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICovCisgIEhBTF9DUkNfU1RBVEVfVElNRU9VVCAgID0gMHgwM1UsICAvKiE8IENSQyB0aW1lb3V0IHN0YXRlICAgICAgICAgICAgICAgICAgICovCisgIEhBTF9DUkNfU1RBVEVfRVJST1IgICAgID0gMHgwNCAgIC8qITwgQ1JDIGVycm9yIHN0YXRlICAgICAgICAgICAgICAgICAgICAgKi8KK31IQUxfQ1JDX1N0YXRlVHlwZURlZjsKKworCisvKiogCisgICogQGJyaWVmIENSQyBJbml0IFN0cnVjdHVyZSBkZWZpbml0aW9uICAKKyAgKi8gCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50OF90IERlZmF1bHRQb2x5bm9taWFsVXNlOyAgICAgICAvKiE8IFRoaXMgcGFyYW1ldGVyIGlzIGEgdmFsdWUgb2YgQHJlZiBDUkNfRGVmYXVsdF9Qb2x5bm9taWFsIGFuZCBpbmRpY2F0ZXMgaWYgZGVmYXVsdCBwb2x5bm9taWFsIGlzIHVzZWQuICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgc2V0IHRvIERFRkFVTFRfUE9MWU5PTUlBTF9FTkFCTEUsIHJlc29ydCB0byBkZWZhdWx0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYXjMyVSArIFheMjZVICsgWF4yM1UgKyBYXjIyVSArIFheMTZVICsgWF4xMlUgKyBYXjExVSArIFheMTBVICtYXjhVICsgWF43VSArIFheNVUgKyBYXjRVICsgWF4yVSsgWCArMS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIHRoYXQgY2FzZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBzZXQgR2VuZXJhdGluZ1BvbHlub21pYWwgZmllbGQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIG90aGVyd2lzZSBzZXQgdG8gREVGQVVMVF9QT0xZTk9NSUFMX0RJU0FCTEUsIEdlbmVyYXRpbmdQb2x5bm9taWFsIGFuZCBDUkNMZW5ndGggZmllbGRzIG11c3QgYmUgc2V0LiAqLworCisgIHVpbnQ4X3QgRGVmYXVsdEluaXRWYWx1ZVVzZTsgICAgICAgIC8qITwgVGhpcyBwYXJhbWV0ZXIgaXMgYSB2YWx1ZSBvZiBAcmVmIENSQ19EZWZhdWx0X0luaXRWYWx1ZV9Vc2UgYW5kIGluZGljYXRlcyBpZiBkZWZhdWx0IGluaXQgdmFsdWUgaXMgdXNlZC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgc2V0IHRvIERFRkFVTFRfSU5JVF9WQUxVRV9FTkFCTEUsIHJlc29ydCB0byBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRiB2YWx1ZS4gSW4gdGhhdCBjYXNlLCB0aGVyZSBpcyBubyBuZWVkIHRvIHNldCBJbml0VmFsdWUgZmllbGQuICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgb3RoZXJ3aXNlIHNldCB0byBERUZBVUxUX0lOSVRfVkFMVUVfRElTQUJMRSwgIEluaXRWYWx1ZSBmaWVsZCBtdXN0IGJlIHNldC4gKi8KKworICB1aW50MzJfdCBHZW5lcmF0aW5nUG9seW5vbWlhbDsgICAgICAvKiE8IFNldCBDUkMgZ2VuZXJhdGluZyBwb2x5bm9taWFsIGFzIGEgN1UsIDhVLCAxNiBvciAzMi1iaXQgbG9uZyB2YWx1ZSBmb3IgYSBwb2x5bm9taWFsIGRlZ3JlZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BlY3RpdmVseSBlcXVhbCB0byA3VSwgOFUsIDE2IG9yIDMyLiBUaGlzIGZpZWxkIGlzIHdyaXR0ZW4gaW4gbm9ybWFsIHJlcHJlc2VudGF0aW9uLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmcuLCBmb3IgYSBwb2x5bm9taWFsIG9mIGRlZ3JlZSA3VSwgWF43VSArIFheNlUgKyBYXjVVICsgWF4yVSArIDEgaXMgd3JpdHRlbiAweDY1LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIG5lZWQgdG8gc3BlY2lmeSBpdCBpZiBEZWZhdWx0UG9seW5vbWlhbFVzZSBpcyBzZXQgdG8gREVGQVVMVF9QT0xZTk9NSUFMX0VOQUJMRS4gICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIHVpbnQzMl90IENSQ0xlbmd0aDsgICAgICAgICAgICAgICAgIC8qITwgVGhpcyBwYXJhbWV0ZXIgaXMgYSB2YWx1ZSBvZiBAcmVmIENSQ19Qb2x5bm9taWFsX1NpemVzIGFuZCBpbmRpY2F0ZXMgQ1JDIGxlbmd0aC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBjYW4gYmUgZWl0aGVyIG9uZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBhcmcgQ1JDX1BPTFlMRU5HVEhfMzJCICAgICAgICAgICAgICAgICAgKDMyLWJpdCBDUkMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBhcmcgQ1JDX1BPTFlMRU5HVEhfMTZCICAgICAgICAgICAgICAgICAgKDE2LWJpdCBDUkMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBhcmcgQ1JDX1BPTFlMRU5HVEhfOEIgICAgICAgICAgICAgICAgICAgKDgtYml0IENSQyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGFyZyBDUkNfUE9MWUxFTkdUSF83QiAgICAgICAgICAgICAgICAgICAoNy1iaXQgQ1JDKS4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgdWludDMyX3QgSW5pdFZhbHVlOyAgICAgICAgICAgICAgICAgLyohPCBJbml0IHZhbHVlIHRvIGluaXRpYXRlIENSQyBjb21wdXRhdGlvbi4gTm8gbmVlZCB0byBzcGVjaWZ5IGl0IGlmIERlZmF1bHRJbml0VmFsdWVVc2UgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgc2V0IHRvIERFRkFVTFRfSU5JVF9WQUxVRV9FTkFCTEUuICAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgCisgIHVpbnQzMl90IElucHV0RGF0YUludmVyc2lvbk1vZGU7ICAgIC8qITwgVGhpcyBwYXJhbWV0ZXIgaXMgYSB2YWx1ZSBvZiBAcmVmIENSQ0V4X0lucHV0X0RhdGFfSW52ZXJzaW9uIGFuZCBzcGVjaWZpZXMgaW5wdXQgZGF0YSBpbnZlcnNpb24gbW9kZS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIGVpdGhlciBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGFyZyBDUkNfSU5QVVREQVRBX0lOVkVSU0lPTl9OT05FLCAgICAgIG5vIGlucHV0IGRhdGEgaW52ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGFyZyBDUkNfSU5QVVREQVRBX0lOVkVSU0lPTl9CWVRFLCAgICAgIGJ5dGUtd2lzZSBpbnZlcnNpb24sIDB4MUEyQjNDNEQgYmVjb21lcyAweDU4RDQzQ0IyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGFyZyBDUkNfSU5QVVREQVRBX0lOVkVSU0lPTl9IQUxGV09SRCwgIGhhbGZ3b3JkLXdpc2UgaW52ZXJzaW9uLCAweDFBMkIzQzREIGJlY29tZXMgMHhENDU4QjIzQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBhcmcgQ1JDX0lOUFVUREFUQV9JTlZFUlNJT05fV09SRCwgICAgICB3b3JkLXdpc2UgaW52ZXJzaW9uLCAweDFBMkIzQzREIGJlY29tZXMgMHhCMjNDRDQ1OFUgKi8gIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB1aW50MzJfdCBPdXRwdXREYXRhSW52ZXJzaW9uTW9kZTsgICAvKiE8IFRoaXMgcGFyYW1ldGVyIGlzIGEgdmFsdWUgb2YgQHJlZiBDUkNFeF9PdXRwdXRfRGF0YV9JbnZlcnNpb24gYW5kIHNwZWNpZmllcyBvdXRwdXQgZGF0YSAoaS5lLiBDUkMpIGludmVyc2lvbiBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW4gYmUgZWl0aGVyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAYXJnIENSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9ESVNBQkxFOiAgIG5vIENSQyBpbnZlcnNpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAYXJnIENSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9FTkFCTEU6ICAgIENSQyAweDExMjIzMzQ0IGlzIGNvbnZlcnRlZCBpbnRvIDB4MjJDQzQ0ODhVICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorfUNSQ19Jbml0VHlwZURlZjsKKworCisvKiogCisgICogQGJyaWVmICBDUkMgSGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uICAKKyAgKi8gCit0eXBlZGVmIHN0cnVjdAoreworICBDUkNfVHlwZURlZiAgICAgICAgICAgICAgICAgKkluc3RhbmNlOyAgIC8qITwgUmVnaXN0ZXIgYmFzZSBhZGRyZXNzICAgICAgICAqLyAKKyAgCisgIENSQ19Jbml0VHlwZURlZiAgICAgICAgICAgICBJbml0OyAgICAgICAgLyohPCBDUkMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCisgIAorICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICAgICAgTG9jazsgICAgICAgIC8qITwgQ1JDIExvY2tpbmcgb2JqZWN0ICAgICAgICAgICAqLworICAgIAorICBfX0lPIEhBTF9DUkNfU3RhdGVUeXBlRGVmICAgU3RhdGU7ICAgICAgIC8qITwgQ1JDIGNvbW11bmljYXRpb24gc3RhdGUgICAgICAqLworICAKKyAgdWludDMyX3QgSW5wdXREYXRhRm9ybWF0OyAgICAgICAgICAgICAgICAvKiE8IFRoaXMgcGFyYW1ldGVyIGlzIGEgdmFsdWUgb2YgQHJlZiBDUkNfSW5wdXRfQnVmZmVyX0Zvcm1hdCBhbmQgc3BlY2lmaWVzIGlucHV0IGRhdGEgZm9ybWF0LiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIGVpdGhlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGFyZyBDUkNfSU5QVVREQVRBX0ZPUk1BVF9CWVRFUywgICAgICAgaW5wdXQgZGF0YSBpcyBhIHN0cmVhbSBvZiBieXRlcyAoOC1iaXQgZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGFyZyBDUkNfSU5QVVREQVRBX0ZPUk1BVF9IQUxGV09SRFMsICAgaW5wdXQgZGF0YSBpcyBhIHN0cmVhbSBvZiBoYWxmLXdvcmRzICgxNi1iaXQgZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGFyZyBDUkNfSU5QVVREQVRBX0ZPUk1BVF9XT1JEUywgICAgICAgaW5wdXQgZGF0YSBpcyBhIHN0cmVhbSBvZiB3b3JkcyAoMzItYml0IGRhdGEpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgY29uc3RhbnQgQ1JDX0lOUFVUX0ZPUk1BVF9VTkRFRklORUQgaXMgZGVmaW5lZCBidXQgYW4gaW5pdGlhbGl6YXRpb24gZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IG9jY3VyIGlmIElucHV0QnVmZmVyRm9ybWF0IGlzIG5vdCBvbmUgb2YgdGhlIHRocmVlIHZhbHVlcyBsaXN0ZWQgYWJvdmUgICovIAorfUNSQ19IYW5kbGVUeXBlRGVmOworLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDUkNfRXhwb3J0ZWRfQ29uc3RhbnRzIENSQyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworLyoqIEBkZWZncm91cCBDUkNfRGVmYXVsdF9Qb2x5bm9taWFsX1ZhbHVlICAgIERlZmF1bHQgQ1JDIGdlbmVyYXRpbmcgcG9seW5vbWlhbAorICAqIEB7CisgICovCisjZGVmaW5lIERFRkFVTFRfQ1JDMzJfUE9MWSAgICAgIDB4MDRDMTFEQjcgICAvKiE8ICBYXjMyVSArIFheMjZVICsgWF4yM1UgKyBYXjIyVSArIFheMTZVICsgWF4xMlUgKyBYXjExVSArIFheMTBVICtYXjhVICsgWF43VSArIFheNVUgKyBYXjRVICsgWF4yVSsgWCArMVUgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNfRGVmYXVsdF9Jbml0VmFsdWUgICAgRGVmYXVsdCBDUkMgY29tcHV0YXRpb24gaW5pdGlhbGl6YXRpb24gdmFsdWUKKyAgKiBAeworICAqLworI2RlZmluZSBERUZBVUxUX0NSQ19JTklUVkFMVUUgICAweEZGRkZGRkZGVSAgIC8qITwgSW5pdGlhbCBDUkMgZGVmYXVsdCB2YWx1ZSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENSQ19EZWZhdWx0X1BvbHlub21pYWwgICAgSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGRlZmF1bHQgcG9seW5vbWlhbCBpcyB1c2VkCisgICogQHsKKyAgKi8KKyNkZWZpbmUgREVGQVVMVF9QT0xZTk9NSUFMX0VOQUJMRSAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAgLyohPCBFbmFibGUgZGVmYXVsdCBnZW5lcmF0aW5nIHBvbHlub21pYWwgMHgwNEMxMURCNyAgKi8KKyNkZWZpbmUgREVGQVVMVF9QT0xZTk9NSUFMX0RJU0FCTEUgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAgLyohPCBEaXNhYmxlIGRlZmF1bHQgZ2VuZXJhdGluZyBwb2x5bm9taWFsIDB4MDRDMTFEQjdVICovCisvKioKKyAgKiBAfQorICAqLworIAorLyoqIEBkZWZncm91cCBDUkNfRGVmYXVsdF9Jbml0VmFsdWVfVXNlICAgIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBkZWZhdWx0IGluaXQgdmFsdWUgaXMgdXNlZAorICAqIEB7CisgICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVGQVVMVF9JTklUX1ZBTFVFX0VOQUJMRSAgICAgICgodWludDhfdCkweDAwVSkgICAvKiE8IEVuYWJsZSBpbml0aWFsIENSQyBkZWZhdWx0IHZhbHVlICAqLworI2RlZmluZSBERUZBVUxUX0lOSVRfVkFMVUVfRElTQUJMRSAgICAgKCh1aW50OF90KTB4MDFVKSAgIC8qITwgRGlzYWJsZSBpbml0aWFsIENSQyBkZWZhdWx0IHZhbHVlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENSQ19Qb2x5bm9taWFsX1NpemVzIFBvbHlub21pYWwgc2l6ZXMgdG8gY29uZmlndXJlIHRoZSBJUAorICAqIEB7CisgICovCisjZGVmaW5lIENSQ19QT0xZTEVOR1RIXzMyQiAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgLyohPCBSZXNvcnQgdG8gYSAzMi1iaXQgbG9uZyBnZW5lcmF0aW5nIHBvbHlub21pYWwgKi8KKyNkZWZpbmUgQ1JDX1BPTFlMRU5HVEhfMTZCICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClDUkNfQ1JfUE9MWVNJWkVfMCkgICAvKiE8IFJlc29ydCB0byBhIDE2LWJpdCBsb25nIGdlbmVyYXRpbmcgcG9seW5vbWlhbCAqLworI2RlZmluZSBDUkNfUE9MWUxFTkdUSF84QiAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUNSQ19DUl9QT0xZU0laRV8xKSAgIC8qITwgUmVzb3J0IHRvIGEgOC1iaXQgbG9uZyBnZW5lcmF0aW5nIHBvbHlub21pYWwgICovCisjZGVmaW5lIENSQ19QT0xZTEVOR1RIXzdCICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpQ1JDX0NSX1BPTFlTSVpFKSAgICAgLyohPCBSZXNvcnQgdG8gYSA3LWJpdCBsb25nIGdlbmVyYXRpbmcgcG9seW5vbWlhbCAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDX1BvbHlub21pYWxfU2l6ZV9EZWZpbml0aW9ucyBDUkMgcG9seW5vbWlhbCBwb3NzaWJsZSBzaXplcyBhY3R1YWwgZGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfQ1JDX0xFTkdUSF8zMkIgICAgIDMyICAgICAvKiE8IDMyLWJpdCBsb25nIENSQyAqLyAKKyNkZWZpbmUgSEFMX0NSQ19MRU5HVEhfMTZCICAgICAxNiAgICAgLyohPCAxNi1iaXQgbG9uZyBDUkMgKi8gCisjZGVmaW5lIEhBTF9DUkNfTEVOR1RIXzhCICAgICAgIDggICAgIC8qITwgOC1iaXQgbG9uZyBDUkMgICovIAorI2RlZmluZSBIQUxfQ1JDX0xFTkdUSF83QiAgICAgICA3ICAgICAvKiE8IDctYml0IGxvbmcgQ1JDICAqLyAKKworLyoqCisgICogQH0KKyAgKi8gIAorCisvKiogQGRlZmdyb3VwIENSQ19JbnB1dF9CdWZmZXJfRm9ybWF0IElucHV0IEJ1ZmZlciBGb3JtYXQKKyAgKiBAeworICAqLworLyogV0FSTklORzogQ1JDX0lOUFVUX0ZPUk1BVF9VTkRFRklORUQgaXMgY3JlYXRlZCBmb3IgcmVmZXJlbmNlIHB1cnBvc2VzIGJ1dAorICogYW4gZXJyb3IgaXMgdHJpZ2dlcmVkIGluIEhBTF9DUkNfSW5pdCgpIGlmIElucHV0RGF0YUZvcm1hdCBmaWVsZCBpcyBzZXQgCisgKiB0byBDUkNfSU5QVVRfRk9STUFUX1VOREVGSU5FRDogdGhlIGZvcm1hdCBNVVNUIGJlIGRlZmluZWQgYnkgdGhlIHVzZXIgZm9yIAorICogdGhlIENSQyBBUElzIHRvIHByb3ZpZGUgYSBjb3JyZWN0IHJlc3VsdCAqLyAgIAorI2RlZmluZSBDUkNfSU5QVVREQVRBX0ZPUk1BVF9VTkRFRklORUQgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgIC8qITwgVW5kZWZpbmVkIGlucHV0IGRhdGEgZm9ybWF0ICAgICovCisjZGVmaW5lIENSQ19JTlBVVERBVEFfRk9STUFUX0JZVEVTICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMVUpICAgLyohPCBJbnB1dCBkYXRhIGluIGJ5dGUgZm9ybWF0ICAgICAgKi8KKyNkZWZpbmUgQ1JDX0lOUFVUREFUQV9GT1JNQVRfSEFMRldPUkRTICAgICAgICAgICAgICgweDAwMDAwMDAyVSkgICAvKiE8IElucHV0IGRhdGEgaW4gaGFsZi13b3JkIGZvcm1hdCAqLworI2RlZmluZSBDUkNfSU5QVVREQVRBX0ZPUk1BVF9XT1JEUyAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDNVKSAgIC8qITwgSW5wdXQgZGF0YSBpbiB3b3JkIGZvcm1hdCAgICAgICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisvKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAqIEB9CisgICovICAgCisKKy8qKgorICAqIEB9CisgICovCisgIAorLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBDUkNfRXhwb3J0ZWRfTWFjcm9zIENSQyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmIFJlc2V0IENSQyBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIENSQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NSQ19SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfQ1JDX1NUQVRFX1JFU0VUKQorCisvKioKKyAgKiBAYnJpZWYgIFJlc2V0IENSQyBEYXRhIFJlZ2lzdGVyLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBDUkMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NSQ19EUl9SRVNFVChfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gQ1JDX0NSX1JFU0VUKQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBDUkMgSU5JVCBub24tZGVmYXVsdCB2YWx1ZQorKiBAcGFyYW0gIF9fSEFORExFX18gQ1JDIGhhbmRsZQorICAqIEBwYXJhbSAgX19JTklUX18gMzItYml0IGluaXRpYWwgdmFsdWUgIAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DUkNfSU5JVElBTENSQ1ZBTFVFX0NPTkZJRyhfX0hBTkRMRV9fLCBfX0lOSVRfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklOSVQgPSAoX19JTklUX18pKSAgICAKKworLyoqCisgICogQGJyaWVmIFN0b3JlIGEgOC1iaXQgZGF0YSBpbiB0aGUgSW5kZXBlbmRlbnQgRGF0YShJRCkgcmVnaXN0ZXIuCisgICogQHBhcmFtIF9fSEFORExFX18gQ1JDIGhhbmRsZQorICAqIEBwYXJhbSBfX1ZBTFVFX18gOC1iaXQgdmFsdWUgdG8gYmUgc3RvcmVkIGluIHRoZSBJRCByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DUkNfU0VUX0lEUihfX0hBTkRMRV9fLCBfX1ZBTFVFX18pIChXUklURV9SRUcoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SURSLCAoX19WQUxVRV9fKSkpCisKKy8qKgorICAqIEBicmllZiBSZXR1cm4gdGhlIDgtYml0IGRhdGEgc3RvcmVkIGluIHRoZSBJbmRlcGVuZGVudCBEYXRhKElEKSByZWdpc3Rlci4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBDUkMgaGFuZGxlCisgICogQHJldHZhbCA4LWJpdCB2YWx1ZSBvZiB0aGUgSUQgcmVnaXN0ZXIgCisgICovCisjZGVmaW5lIF9fSEFMX0NSQ19HRVRfSURSKF9fSEFORExFX18pICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SURSKSAmIENSQ19JRFJfSURSKQorLyoqCisgICogQH0KKyAgKi8KKworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgIENSQ19Qcml2YXRlX01hY3JvcyAgIENSQyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfREVGQVVMVF9QT0xZTk9NSUFMKERFRkFVTFQpICgoKERFRkFVTFQpID09IERFRkFVTFRfUE9MWU5PTUlBTF9FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERFRkFVTFQpID09IERFRkFVTFRfUE9MWU5PTUlBTF9ESVNBQkxFKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworI2RlZmluZSBJU19ERUZBVUxUX0lOSVRfVkFMVUUoVkFMVUUpICAoKChWQUxVRSkgPT0gREVGQVVMVF9JTklUX1ZBTFVFX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUxVRSkgPT0gREVGQVVMVF9JTklUX1ZBTFVFX0RJU0FCTEUpKSAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIElTX0NSQ19QT0xfTEVOR1RIKExFTkdUSCkgICAgICgoKExFTkdUSCkgPT0gQ1JDX1BPTFlMRU5HVEhfMzJCKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExFTkdUSCkgPT0gQ1JDX1BPTFlMRU5HVEhfMTZCKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExFTkdUSCkgPT0gQ1JDX1BPTFlMRU5HVEhfOEIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExFTkdUSCkgPT0gQ1JDX1BPTFlMRU5HVEhfN0IpKSAgCisKKyNkZWZpbmUgSVNfQ1JDX0lOUFVUREFUQV9GT1JNQVQoRk9STUFUKSAgICAgICAgICAgKCgoRk9STUFUKSA9PSBDUkNfSU5QVVREQVRBX0ZPUk1BVF9CWVRFUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGT1JNQVQpID09IENSQ19JTlBVVERBVEFfRk9STUFUX0hBTEZXT1JEUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGT1JNQVQpID09IENSQ19JTlBVVERBVEFfRk9STUFUX1dPUkRTKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIENSQyBIQUwgRXh0ZW5kZWQgbW9kdWxlICovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9jcmNfZXguaCIKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBDUkNfRXhwb3J0ZWRfRnVuY3Rpb25zIENSQyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworICAKKy8qKiBAYWRkdG9ncm91cCBDUkNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucy4gCisgKiBAeworICovCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSQ19Jbml0KENSQ19IYW5kbGVUeXBlRGVmICpoY3JjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUkNfRGVJbml0IChDUkNfSGFuZGxlVHlwZURlZiAqaGNyYyk7Cit2b2lkIEhBTF9DUkNfTXNwSW5pdChDUkNfSGFuZGxlVHlwZURlZiAqaGNyYyk7Cit2b2lkIEhBTF9DUkNfTXNwRGVJbml0KENSQ19IYW5kbGVUeXBlRGVmICpoY3JjKTsKKy8qKgorICAqIEB9CisgICovCisgIAorLyoqIEBhZGR0b2dyb3VwIENSQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgCisgKiAgQGJyaWVmICAgIG1hbmFnZW1lbnQgZnVuY3Rpb25zLiAKKyAqIEB7CisgKi8KKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBIQUxfQ1JDX0FjY3VtdWxhdGUoQ1JDX0hhbmRsZVR5cGVEZWYgKmhjcmMsIHVpbnQzMl90IHBCdWZmZXJbXSwgdWludDMyX3QgQnVmZmVyTGVuZ3RoKTsKK3VpbnQzMl90IEhBTF9DUkNfQ2FsY3VsYXRlKENSQ19IYW5kbGVUeXBlRGVmICpoY3JjLCB1aW50MzJfdCBwQnVmZmVyW10sIHVpbnQzMl90IEJ1ZmZlckxlbmd0aCk7CisvKioKKyAgKiBAfQorICAqLworICAKKy8qKiBAYWRkdG9ncm91cCBDUkNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAKKyAqICBAYnJpZWYgICAgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMuIAorICogQHsKKyAqLworLyogUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9DUkNfU3RhdGVUeXBlRGVmIEhBTF9DUkNfR2V0U3RhdGUoQ1JDX0hhbmRsZVR5cGVEZWYgKmhjcmMpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworICAvKiogQGRlZmdyb3VwIEhBTF9DUkNfQWxpYXNfRXhwb3J0ZWRfRnVuY3Rpb25zIENSQyBhbGlhc2VzIGZvciBFeHBvcnRlZCBGdW5jdGlvbnMgCisgKiBAeworICovCisvKiBBbGlhc2VzIGZvciBpbnRlciBTVE0zMiBzZXJpZXMgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBIQUxfQ1JDX0lucHV0X0RhdGFfUmV2ZXJzZSAgIEhBTF9DUkNFeF9JbnB1dF9EYXRhX1JldmVyc2UKKyNkZWZpbmUgSEFMX0NSQ19PdXRwdXRfRGF0YV9SZXZlcnNlICBIQUxfQ1JDRXhfT3V0cHV0X0RhdGFfUmV2ZXJzZQorLyoqCisgICogQH0KKyAgKi8KKyAgCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJGM3h4X0hBTF9DUkNfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjN4eF9oYWxfY3JjX2V4LmggYi9JbmMvc3RtMzJmM3h4X2hhbF9jcmNfZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjJkMTM2Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjN4eF9oYWxfY3JjX2V4LmgKQEAgLTAsMCArMSwxNzMgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX2NyY19leC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBDUkMgSEFMIGV4dGVuc2lvbiBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0hBTF9DUkNfRVhfSAorI2RlZmluZSBfX1NUTTMyRjN4eF9IQUxfQ1JDX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgQ1JDRXggQ1JDRXggCisgICogQHsKKyAgKi8gCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JDRXhfRXhwb3J0ZWRfQ29uc3RhbnRzIENSQyBFeHRlbmRlZCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworICAKKy8qKiBAZGVmZ3JvdXAgQ1JDRXhfSW5wdXRfRGF0YV9JbnZlcnNpb24gQ1JDIEV4dGVuZGVkIElucHV0IERhdGEgSW52ZXJzaW9uIE1vZGVzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ1JDX0lOUFVUREFUQV9JTlZFUlNJT05fTk9ORSAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgIC8qITwgTm8gaW5wdXQgZGF0YSBpbnZlcnNpb24gICAgICAgICAgICAqLworI2RlZmluZSBDUkNfSU5QVVREQVRBX0lOVkVSU0lPTl9CWVRFICAgICAgICAgICAgICAoKHVpbnQzMl90KUNSQ19DUl9SRVZfSU5fMCkgLyohPCBCeXRlLXdpc2UgaW5wdXQgZGF0YSBpbnZlcnNpb24gICAgICovCisjZGVmaW5lIENSQ19JTlBVVERBVEFfSU5WRVJTSU9OX0hBTEZXT1JEICAgICAgICAgICgodWludDMyX3QpQ1JDX0NSX1JFVl9JTl8xKSAvKiE8IEhhbGZXb3JkLXdpc2UgaW5wdXQgZGF0YSBpbnZlcnNpb24gKi8KKyNkZWZpbmUgQ1JDX0lOUFVUREFUQV9JTlZFUlNJT05fV09SRCAgICAgICAgICAgICAgKCh1aW50MzJfdClDUkNfQ1JfUkVWX0lOKSAgIC8qITwgV29yZC13aXNlIGlucHV0IGRhdGEgaW52ZXJzaW9uICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNFeF9PdXRwdXRfRGF0YV9JbnZlcnNpb24gQ1JDIEV4dGVuZGVkIE91dHB1dCBEYXRhIEludmVyc2lvbiBNb2RlcworICAqIEB7CisgICovCisjZGVmaW5lIENSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9ESVNBQkxFICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgIC8qITwgTm8gb3V0cHV0IGRhdGEgaW52ZXJzaW9uICAgICAgICovCisjZGVmaW5lIENSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9FTkFCTEUgICAgICAgICAgKCh1aW50MzJfdClDUkNfQ1JfUkVWX09VVCkgIC8qITwgQml0LXdpc2Ugb3V0cHV0IGRhdGEgaW52ZXJzaW9uICovCisvKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAqIEB9CisgICovCisgIAorLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIENSQ0V4X0V4cG9ydGVkX01hY3JvcyBDUkMgRXh0ZW5kZWQgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKyAgICAKKy8qKgorICAqIEBicmllZiAgU2V0IENSQyBvdXRwdXQgcmV2ZXJzYWwKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gQ1JDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgIF9fSEFMX0NSQ19PVVRQVVRSRVZFUlNBTF9FTkFCTEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9IENSQ19DUl9SRVZfT1VUKSAgIAorCisvKioKKyAgKiBAYnJpZWYgIFVuc2V0IENSQyBvdXRwdXQgcmV2ZXJzYWwKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gQ1JDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfQ1JDX09VVFBVVFJFVkVSU0FMX0RJU0FCTEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9IH4oQ1JDX0NSX1JFVl9PVVQpKSAgIAorCisvKioKKyAgKiBAYnJpZWYgIFNldCBDUkMgbm9uLWRlZmF1bHQgcG9seW5vbWlhbAorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBDUkMgaGFuZGxlCisgICogQHBhcmFtICBfX1BPTFlOT01JQUxfXyA3LCA4LCAxNiBvciAzMi1iaXQgcG9seW5vbWlhbCAgCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9DUkNfUE9MWU5PTUlBTF9DT05GSUcoX19IQU5ETEVfXywgX19QT0xZTk9NSUFMX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5QT0wgPSAoX19QT0xZTk9NSUFMX18pKQorCisvKioKKyAgKiBAfQorICAqLworICAKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCAgQ1JDRXhfUHJpdmF0ZV9NYWNyb3MgICBDUkNFeCBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisgIAorI2RlZmluZSBJU19DUkNfSU5QVVREQVRBX0lOVkVSU0lPTl9NT0RFKE1PREUpICAgICAoKChNT0RFKSA9PSBDUkNfSU5QVVREQVRBX0lOVkVSU0lPTl9OT05FKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IENSQ19JTlBVVERBVEFfSU5WRVJTSU9OX0JZVEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gQ1JDX0lOUFVUREFUQV9JTlZFUlNJT05fSEFMRldPUkQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gQ1JDX0lOUFVUREFUQV9JTlZFUlNJT05fV09SRCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworI2RlZmluZSBJU19DUkNfT1VUUFVUREFUQV9JTlZFUlNJT05fTU9ERShNT0RFKSAgICAoKChNT0RFKSA9PSBDUkNfT1VUUFVUREFUQV9JTlZFUlNJT05fRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBDUkNfT1VUUFVUREFUQV9JTlZFUlNJT05fRU5BQkxFKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworLyoqCisgICogQH0KKyAgKi8gIAorCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIENSQ0V4X0V4cG9ydGVkX0Z1bmN0aW9ucyBDUkMgRXh0ZW5kZWQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIENSQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgQ1JDIEV4dGVuZGVkIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgRXh0ZW5kZWQgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zLgorICAqIEB7CisgICovCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSQ0V4X1BvbHlub21pYWxfU2V0KENSQ19IYW5kbGVUeXBlRGVmICpoY3JjLCB1aW50MzJfdCBQb2wsIHVpbnQzMl90IFBvbHlMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSQ0V4X0lucHV0X0RhdGFfUmV2ZXJzZShDUkNfSGFuZGxlVHlwZURlZiAqaGNyYywgdWludDMyX3QgSW5wdXRSZXZlcnNlTW9kZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JDRXhfT3V0cHV0X0RhdGFfUmV2ZXJzZShDUkNfSGFuZGxlVHlwZURlZiAqaGNyYywgdWludDMyX3QgT3V0cHV0UmV2ZXJzZU1vZGUpOworLyoqCisgICogQH0KKyAgKi8KKworLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovIAorCisvKioKKyAgKiBAfQorICAqLworICAKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyRjN4eF9IQUxfQ1JDX0VYX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmYzeHhfaGFsX2RhYy5oIGIvSW5jL3N0bTMyZjN4eF9oYWxfZGFjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI2N2Y4NAotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmYzeHhfaGFsX2RhYy5oCkBAIC0wLDAgKzEsNDU0IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2hhbF9kYWMuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgREFDIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyRjN4eF9IQUxfREFDX0gKKyNkZWZpbmUgX19TVE0zMkYzeHhfSEFMX0RBQ19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9kZWYuaCIKKyAgIAorLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIERBQworICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0V4cG9ydGVkX1R5cGVzIERBQyBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKiAKKyAgKiBAYnJpZWYgIEhBTCBTdGF0ZSBzdHJ1Y3R1cmVzIGRlZmluaXRpb24gIAorICAqLyAKK3R5cGVkZWYgZW51bQoreworICBIQUxfREFDX1NUQVRFX1JFU0VUICAgICAgICAgICAgID0gMHgwMFUsICAvKiE8IERBQyBub3QgeWV0IGluaXRpYWxpemVkIG9yIGRpc2FibGVkICAqLworICBIQUxfREFDX1NUQVRFX1JFQURZICAgICAgICAgICAgID0gMHgwMVUsICAvKiE8IERBQyBpbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZSAgICAqLworICBIQUxfREFDX1NUQVRFX0JVU1kgICAgICAgICAgICAgID0gMHgwMlUsICAvKiE8IERBQyBpbnRlcm5hbCBwcm9jZXNzaW5nIGlzIG9uZ29pbmcgICAqLworICBIQUxfREFDX1NUQVRFX1RJTUVPVVQgICAgICAgICAgID0gMHgwM1UsICAvKiE8IERBQyB0aW1lb3V0IHN0YXRlICAgICAgICAgICAgICAgICAgICAqLworICBIQUxfREFDX1NUQVRFX0VSUk9SICAgICAgICAgICAgID0gMHgwNCAgIC8qITwgREFDIGVycm9yIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICovCisgCit9SEFMX0RBQ19TdGF0ZVR5cGVEZWY7CisgICAKKy8qKiAKKyAgKiBAYnJpZWYgICBEQUMgQ29uZmlndXJhdGlvbiByZWd1bGFyIENoYW5uZWwgc3RydWN0dXJlIGRlZmluaXRpb24gIAorICAqLyAKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IERBQ19UcmlnZ2VyOyAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGV4dGVybmFsIHRyaWdnZXIgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERBQ0V4X3RyaWdnZXJfc2VsZWN0aW9uICovCisgIAorICB1aW50MzJfdCBEQUNfT3V0cHV0QnVmZmVyOyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIERBQyBjaGFubmVsIG91dHB1dCBidWZmZXIgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERBQ19vdXRwdXRfYnVmZmVyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBhIGdpdmVuIERBQyBjaGFubmVsLCBpcyB0aGlzIHBhcmFtYXRlciBhcHBsaWVzIHRoZW4gREFDX091dHB1dFN3aXRjaCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2VzIG5vdCBhcHBseSAqLworICAKKyAgdWludDMyX3QgREFDX091dHB1dFN3aXRjaDsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBEQUMgY2hhbm5lbCBvdXRwdXQgc3dpdGNoIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBEQUNfT3V0cHV0U3dpdGNoIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBhIGdpdmVuIERBQyBjaGFubmVsLCBpcyB0aGlzIHBhcmFtYXRlciBhcHBsaWVzIHRoZW4gREFDX091dHB1dEJ1ZmZlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2VzIG5vdCBhcHBseSAqLworICAKK31EQUNfQ2hhbm5lbENvbmZUeXBlRGVmOworCisvKiogCisgICogQGJyaWVmICBEQUMgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uICAKKyAgKi8gCit0eXBlZGVmIHN0cnVjdCBfX0RBQ19IYW5kbGVUeXBlRGVmCit7CisgIERBQ19UeXBlRGVmICAgICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAgICAgLyohPCBSZWdpc3RlciBiYXNlIGFkZHJlc3MgICAgICAgICAgICAgKi8KKyAgCisgIF9fSU8gSEFMX0RBQ19TdGF0ZVR5cGVEZWYgICBTdGF0ZTsgICAgICAgICAgLyohPCBEQUMgY29tbXVuaWNhdGlvbiBzdGF0ZSAgICAgICAgICAgKi8KKworICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICAgICAgTG9jazsgICAgICAgICAgLyohPCBEQUMgbG9ja2luZyBvYmplY3QgICAgICAgICAgICAgICAgKi8KKyAgCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAgICAqRE1BX0hhbmRsZTE7ICAvKiE8IFBvaW50ZXIgRE1BIGhhbmRsZXIgZm9yIGNoYW5uZWwgMVUgKi8KKyAgCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAgICAqRE1BX0hhbmRsZTI7ICAvKiE8IFBvaW50ZXIgRE1BIGhhbmRsZXIgZm9yIGNoYW5uZWwgMlUgKi8gCisgIAorICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICAgRXJyb3JDb2RlOyAgICAgLyohPCBEQUMgRXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgKi8KKyAgCit9REFDX0hhbmRsZVR5cGVEZWY7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBEQUNfRXhwb3J0ZWRfQ29uc3RhbnRzIERBQyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIERBQ19FcnJvcl9Db2RlIERBQyBFcnJvciBDb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgIEhBTF9EQUNfRVJST1JfTk9ORSAgICAgICAgICAgICAgMHgwMCAgICAvKiE8IE5vIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgSEFMX0RBQ19FUlJPUl9ETUFVTkRFUlJVTkNIMSAgICAweDAxICAgIC8qITwgREFDIGNoYW5uZWwxIERNQSB1bmRlcnJ1biBlcnJvciAgICovCisjZGVmaW5lICBIQUxfREFDX0VSUk9SX0RNQVVOREVSUlVOQ0gyICAgIDB4MDIgICAgLyohPCBEQUMgY2hhbm5lbDIgRE1BIHVuZGVycnVuIGVycm9yICAgKi8KKyNkZWZpbmUgIEhBTF9EQUNfRVJST1JfRE1BICAgICAgICAgICAgICAgMHgwNCAgICAvKiE8IERNQSBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgIAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfbGZzcnVubWFza190cmlhbmdsZWFtcGxpdHVkZSBEQUMgbGZzcnVubWFzayB0cmlhbmdsZWFtcGxpdHVkZQorICAqIEB7CisgICovCisjZGVmaW5lIERBQ19MRlNSVU5NQVNLX0JJVDAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAvKiE8IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdDAgZm9yIG5vaXNlIHdhdmUgZ2VuZXJhdGlvbiAqLworI2RlZmluZSBEQUNfTEZTUlVOTUFTS19CSVRTMV8wICAgICAgICAgICAgICgodWludDMyX3QpREFDX0NSX01BTVAxXzApIC8qITwgVW5tYXNrIERBQyBjaGFubmVsIExGU1IgYml0WzE6MF0gZm9yIG5vaXNlIHdhdmUgZ2VuZXJhdGlvbiAqLworI2RlZmluZSBEQUNfTEZTUlVOTUFTS19CSVRTMl8wICAgICAgICAgICAgICgodWludDMyX3QpREFDX0NSX01BTVAxXzEpIC8qITwgVW5tYXNrIERBQyBjaGFubmVsIExGU1IgYml0WzI6MF0gZm9yIG5vaXNlIHdhdmUgZ2VuZXJhdGlvbiAqLworI2RlZmluZSBEQUNfTEZTUlVOTUFTS19CSVRTM18wICAgICAgICAgICAgICgodWludDMyX3QpREFDX0NSX01BTVAxXzEgfCBEQUNfQ1JfTUFNUDFfMCkvKiE8IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFszOjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24gKi8KKyNkZWZpbmUgREFDX0xGU1JVTk1BU0tfQklUUzRfMCAgICAgICAgICAgICAoKHVpbnQzMl90KURBQ19DUl9NQU1QMV8yKSAvKiE8IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFs0OjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24gKi8KKyNkZWZpbmUgREFDX0xGU1JVTk1BU0tfQklUUzVfMCAgICAgICAgICAgICAoKHVpbnQzMl90KURBQ19DUl9NQU1QMV8yIHwgREFDX0NSX01BTVAxXzApIC8qITwgVW5tYXNrIERBQyBjaGFubmVsIExGU1IgYml0WzU6MF0gZm9yIG5vaXNlIHdhdmUgZ2VuZXJhdGlvbiAqLworI2RlZmluZSBEQUNfTEZTUlVOTUFTS19CSVRTNl8wICAgICAgICAgICAgICgodWludDMyX3QpREFDX0NSX01BTVAxXzIgfCBEQUNfQ1JfTUFNUDFfMSkgLyohPCBVbm1hc2sgREFDIGNoYW5uZWwgTEZTUiBiaXRbNjowXSBmb3Igbm9pc2Ugd2F2ZSBnZW5lcmF0aW9uICovCisjZGVmaW5lIERBQ19MRlNSVU5NQVNLX0JJVFM3XzAgICAgICAgICAgICAgKCh1aW50MzJfdClEQUNfQ1JfTUFNUDFfMiB8IERBQ19DUl9NQU1QMV8xIHwgREFDX0NSX01BTVAxXzApIC8qITwgVW5tYXNrIERBQyBjaGFubmVsIExGU1IgYml0Wzc6MF0gZm9yIG5vaXNlIHdhdmUgZ2VuZXJhdGlvbiAqLworI2RlZmluZSBEQUNfTEZTUlVOTUFTS19CSVRTOF8wICAgICAgICAgICAgICgodWludDMyX3QpREFDX0NSX01BTVAxXzMpIC8qITwgVW5tYXNrIERBQyBjaGFubmVsIExGU1IgYml0Wzg6MF0gZm9yIG5vaXNlIHdhdmUgZ2VuZXJhdGlvbiAqLworI2RlZmluZSBEQUNfTEZTUlVOTUFTS19CSVRTOV8wICAgICAgICAgICAgICgodWludDMyX3QpREFDX0NSX01BTVAxXzMgfCBEQUNfQ1JfTUFNUDFfMCkgLyohPCBVbm1hc2sgREFDIGNoYW5uZWwgTEZTUiBiaXRbOTowXSBmb3Igbm9pc2Ugd2F2ZSBnZW5lcmF0aW9uICovCisjZGVmaW5lIERBQ19MRlNSVU5NQVNLX0JJVFMxMF8wICAgICAgICAgICAgKCh1aW50MzJfdClEQUNfQ1JfTUFNUDFfMyB8IERBQ19DUl9NQU1QMV8xKSAvKiE8IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFsxMDowXSBmb3Igbm9pc2Ugd2F2ZSBnZW5lcmF0aW9uICovCisjZGVmaW5lIERBQ19MRlNSVU5NQVNLX0JJVFMxMV8wICAgICAgICAgICAgKCh1aW50MzJfdClEQUNfQ1JfTUFNUDFfMyB8IERBQ19DUl9NQU1QMV8xIHwgREFDX0NSX01BTVAxXzApIC8qITwgVW5tYXNrIERBQyBjaGFubmVsIExGU1IgYml0WzExOjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24gKi8KKyNkZWZpbmUgREFDX1RSSUFOR0xFQU1QTElUVURFXzEgICAgICAgICAgICAoMHgwMDAwMDAwMFUpIC8qITwgU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgMVUgKi8KKyNkZWZpbmUgREFDX1RSSUFOR0xFQU1QTElUVURFXzMgICAgICAgICAgICAoKHVpbnQzMl90KURBQ19DUl9NQU1QMV8wKSAvKiE8IFNlbGVjdCBtYXggdHJpYW5nbGUgYW1wbGl0dWRlIG9mIDNVICovCisjZGVmaW5lIERBQ19UUklBTkdMRUFNUExJVFVERV83ICAgICAgICAgICAgKCh1aW50MzJfdClEQUNfQ1JfTUFNUDFfMSkgLyohPCBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiA3VSAqLworI2RlZmluZSBEQUNfVFJJQU5HTEVBTVBMSVRVREVfMTUgICAgICAgICAgICgodWludDMyX3QpREFDX0NSX01BTVAxXzEgfCBEQUNfQ1JfTUFNUDFfMCkgLyohPCBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiAxNVUgKi8KKyNkZWZpbmUgREFDX1RSSUFOR0xFQU1QTElUVURFXzMxICAgICAgICAgICAoKHVpbnQzMl90KURBQ19DUl9NQU1QMV8yKSAvKiE8IFNlbGVjdCBtYXggdHJpYW5nbGUgYW1wbGl0dWRlIG9mIDMxVSAqLworI2RlZmluZSBEQUNfVFJJQU5HTEVBTVBMSVRVREVfNjMgICAgICAgICAgICgodWludDMyX3QpREFDX0NSX01BTVAxXzIgfCBEQUNfQ1JfTUFNUDFfMCkgLyohPCBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiA2M1UgKi8KKyNkZWZpbmUgREFDX1RSSUFOR0xFQU1QTElUVURFXzEyNyAgICAgICAgICAoKHVpbnQzMl90KURBQ19DUl9NQU1QMV8yIHwgREFDX0NSX01BTVAxXzEpIC8qITwgU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgMTI3VSAqLworI2RlZmluZSBEQUNfVFJJQU5HTEVBTVBMSVRVREVfMjU1ICAgICAgICAgICgodWludDMyX3QpREFDX0NSX01BTVAxXzIgfCBEQUNfQ1JfTUFNUDFfMSB8IERBQ19DUl9NQU1QMV8wKSAvKiE8IFNlbGVjdCBtYXggdHJpYW5nbGUgYW1wbGl0dWRlIG9mIDI1NVUgKi8KKyNkZWZpbmUgREFDX1RSSUFOR0xFQU1QTElUVURFXzUxMSAgICAgICAgICAoKHVpbnQzMl90KURBQ19DUl9NQU1QMV8zKSAvKiE8IFNlbGVjdCBtYXggdHJpYW5nbGUgYW1wbGl0dWRlIG9mIDUxMVUgKi8KKyNkZWZpbmUgREFDX1RSSUFOR0xFQU1QTElUVURFXzEwMjMgICAgICAgICAoKHVpbnQzMl90KURBQ19DUl9NQU1QMV8zIHwgREFDX0NSX01BTVAxXzApIC8qITwgU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgMTAyM1UgKi8KKyNkZWZpbmUgREFDX1RSSUFOR0xFQU1QTElUVURFXzIwNDcgICAgICAgICAoKHVpbnQzMl90KURBQ19DUl9NQU1QMV8zIHwgREFDX0NSX01BTVAxXzEpIC8qITwgU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgMjA0N1UgKi8KKyNkZWZpbmUgREFDX1RSSUFOR0xFQU1QTElUVURFXzQwOTUgICAgICAgICAoKHVpbnQzMl90KURBQ19DUl9NQU1QMV8zIHwgREFDX0NSX01BTVAxXzEgfCBEQUNfQ1JfTUFNUDFfMCkgLyohPCBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiA0MDk1VSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERBQ19vdXRwdXRfYnVmZmVyIERBQyBvdXRwdXQgYnVmZmVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgREFDX09VVFBVVEJVRkZFUl9FTkFCTEUgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIERBQ19PVVRQVVRCVUZGRVJfRElTQUJMRSAgICAgICAgICAgKCh1aW50MzJfdClEQUNfQ1JfQk9GRjEpCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KQorLyoqIEBkZWZncm91cCBEQUNfb3V0cHV0X3N3aXRjaCBEQUMgb3V0cHV0IHN3aXRjaAorICAqIEB7CisgICovCisjZGVmaW5lIERBQ19PVVRQVVRTV0lUQ0hfRElTQUJMRSAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBEQUNfT1VUUFVUU1dJVENIX0VOQUJMRSAgICAgICAgICAgICgodWludDMyX3QpREFDX0NSX09VVEVOMSkKKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4IHx8ICovCisvKiogQGRlZmdyb3VwIERBQ19kYXRhX2FsaWduZW1lbnQgREFDIGRhdGEgYWxpZ25lbWVudAorICAqIEB7CisgICovCisjZGVmaW5lIERBQ19BTElHTl8xMkJfUiAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBEQUNfQUxJR05fMTJCX0wgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDA0VSkKKyNkZWZpbmUgREFDX0FMSUdOXzhCX1IgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwOFUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDX2ZsYWdzX2RlZmluaXRpb24gREFDIGZsYWdzIGRlZmluaXRpb24KKyAgKiBAeworICAqLyAKKyNkZWZpbmUgREFDX0ZMQUdfRE1BVURSMSAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KURBQ19TUl9ETUFVRFIxKQorI2RlZmluZSBEQUNfRkxBR19ETUFVRFIyICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpREFDX1NSX0RNQVVEUjIpICAgCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERBQ19pbnRlcnJ1cHRzX2RlZmluaXRpb24gREFDIGludGVycnVwdHMgZGVmaW5pdGlvbgorICAqIEB7CisgICovIAorI2RlZmluZSBEQUNfSVRfRE1BVURSMSAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KURBQ19DUl9ETUFVRFJJRTEpCisjZGVmaW5lIERBQ19JVF9ETUFVRFIyICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpREFDX0NSX0RNQVVEUklFMikgCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0V4cG9ydGVkX01hY3JvcyBEQUMgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiBSZXNldCBEQUMgaGFuZGxlIHN0YXRlCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgREFDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfREFDX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9EQUNfU1RBVEVfUkVTRVQpCisKKy8qKiBAYnJpZWYgRW5hYmxlIHRoZSBEQUMgY2hhbm5lbAorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIERBQyBoYW5kbGUuCisgICogQHBhcmFtICBfX0RBQ19DaGFubmVsX18gc3BlY2lmaWVzIHRoZSBEQUMgY2hhbm5lbAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9EQUNfRU5BQkxFKF9fSEFORExFX18sIF9fREFDX0NoYW5uZWxfXykgXAorKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9ICAoREFDX0NSX0VOMSA8PCAoX19EQUNfQ2hhbm5lbF9fKSkpCisKKy8qKiBAYnJpZWYgRGlzYWJsZSB0aGUgREFDIGNoYW5uZWwKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBEQUMgaGFuZGxlCisgICogQHBhcmFtICBfX0RBQ19DaGFubmVsX18gc3BlY2lmaWVzIHRoZSBEQUMgY2hhbm5lbC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfREFDX0RJU0FCTEUoX19IQU5ETEVfXywgX19EQUNfQ2hhbm5lbF9fKSBcCisoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgJj0gIH4oREFDX0NSX0VOMSA8PCAoX19EQUNfQ2hhbm5lbF9fKSkpCisgCisvKiogQGJyaWVmIFNldCBESFIxMlIxIGFsaWdubWVudAorICAqIEBwYXJhbSAgX19BTElHTk1FTlRfXyBzcGVjaWZpZXMgdGhlIERBQyBhbGlnbm1lbnQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgREFDX0RIUjEyUjFfQUxJR05NRU5UKF9fQUxJR05NRU5UX18pICgoMHgwMDAwMDAwOFUpICsgKF9fQUxJR05NRU5UX18pKQorCisvKiogQGJyaWVmICBTZXQgREhSMTJSMiBhbGlnbm1lbnQKKyAgKiBAcGFyYW0gIF9fQUxJR05NRU5UX18gc3BlY2lmaWVzIHRoZSBEQUMgYWxpZ25tZW50CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIERBQ19ESFIxMlIyX0FMSUdOTUVOVChfX0FMSUdOTUVOVF9fKSAoKDB4MDAwMDAwMTRVKSArIChfX0FMSUdOTUVOVF9fKSkKKworLyoqIEBicmllZiAgU2V0IERIUjEyUkQgYWxpZ25tZW50CisgICogQHBhcmFtICBfX0FMSUdOTUVOVF9fIHNwZWNpZmllcyB0aGUgREFDIGFsaWdubWVudAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBEQUNfREhSMTJSRF9BTElHTk1FTlQoX19BTElHTk1FTlRfXykgKCgweDAwMDAwMDIwVSkgKyAoX19BTElHTk1FTlRfXykpCisKKy8qKiBAYnJpZWYgRW5hYmxlIHRoZSBEQUMgaW50ZXJydXB0CisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgREFDIGhhbmRsZQorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIERBQyBpbnRlcnJ1cHQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0lUX0RNQVVEUjE6IERBQyBjaGFubmVsIDEgRE1BIHVuZGVycnVuIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBEQUNfSVRfRE1BVURSMjogREFDIGNoYW5uZWwgMiBETUEgdW5kZXJydW4gaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0RBQ19FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUikgfD0gKF9fSU5URVJSVVBUX18pKQorCisvKiogQGJyaWVmIERpc2FibGUgdGhlIERBQyBpbnRlcnJ1cHQKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBEQUMgaGFuZGxlCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgREFDIGludGVycnVwdC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBEQUNfSVRfRE1BVURSMTogREFDIGNoYW5uZWwgMSBETUEgdW5kZXJydW4gaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIERBQ19JVF9ETUFVRFIyOiBEQUMgY2hhbm5lbCAyIERNQSB1bmRlcnJ1biBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfREFDX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUikgJj0gfihfX0lOVEVSUlVQVF9fKSkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIERBQyBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3Igbm90CisgICogQHBhcmFtIF9fSEFORExFX18gREFDIGhhbmRsZQorICAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIERBQyBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0lUX0RNQVVEUjE6IERBQyBjaGFubmVsIDEgRE1BIHVuZGVycnVuIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBEQUNfSVRfRE1BVURSMjogREFDIGNoYW5uZWwgMiBETUEgdW5kZXJydW4gaW50ZXJydXB0CisgICogQHJldHZhbCBTdGF0ZSBvZiBpbnRlcnJ1cHRpb24gKFNFVCBvciBSRVNFVCkKKyAgKi8KKyNkZWZpbmUgX19IQUxfREFDX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKQorCisvKiogQGJyaWVmICBHZXQgdGhlIHNlbGVjdGVkIERBQydzIGZsYWcgc3RhdHVzCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgREFDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgREFDIGZsYWcgdG8gZ2V0LgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19GTEFHX0RNQVVEUjE6IERBQyBjaGFubmVsIDEgRE1BIHVuZGVycnVuIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0ZMQUdfRE1BVURSMjogREFDIGNoYW5uZWwgMiBETUEgdW5kZXJydW4gZmxhZworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9EQUNfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSKSAmIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBEQUMncyBmbGFnCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgREFDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgREFDIGZsYWcgdG8gY2xlYXIuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0ZMQUdfRE1BVURSMTogREFDIGNoYW5uZWwgMSBETUEgdW5kZXJydW4gZmxhZworICAqICAgICAgICAgICAgQGFyZyBEQUNfRkxBR19ETUFVRFIyOiBEQUMgY2hhbm5lbCAyIERNQSB1bmRlcnJ1biBmbGFnCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0RBQ19DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSKSA9IChfX0ZMQUdfXykpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAYWRkdG9ncm91cCBEQUNfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX0RBQ19MRlNSX1VOTUFTS19UUklBTkdMRV9BTVBMSVRVREUoVkFMVUUpICgoKFZBTFVFKSA9PSBEQUNfTEZTUlVOTUFTS19CSVQwKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfTEZTUlVOTUFTS19CSVRTMV8wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfTEZTUlVOTUFTS19CSVRTMl8wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfTEZTUlVOTUFTS19CSVRTM18wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfTEZTUlVOTUFTS19CSVRTNF8wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfTEZTUlVOTUFTS19CSVRTNV8wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfTEZTUlVOTUFTS19CSVRTNl8wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfTEZTUlVOTUFTS19CSVRTN18wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfTEZTUlVOTUFTS19CSVRTOF8wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfTEZTUlVOTUFTS19CSVRTOV8wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfTEZTUlVOTUFTS19CSVRTMTBfMCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUxVRSkgPT0gREFDX0xGU1JVTk1BU0tfQklUUzExXzApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19UUklBTkdMRUFNUExJVFVERV8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfVFJJQU5HTEVBTVBMSVRVREVfMykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUxVRSkgPT0gREFDX1RSSUFOR0xFQU1QTElUVURFXzcpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19UUklBTkdMRUFNUExJVFVERV8xNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUxVRSkgPT0gREFDX1RSSUFOR0xFQU1QTElUVURFXzMxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfVFJJQU5HTEVBTVBMSVRVREVfNjMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19UUklBTkdMRUFNUExJVFVERV8xMjcpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19UUklBTkdMRUFNUExJVFVERV8yNTUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19UUklBTkdMRUFNUExJVFVERV81MTEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19UUklBTkdMRUFNUExJVFVERV8xMDIzKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfVFJJQU5HTEVBTVBMSVRVREVfMjA0NykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUxVRSkgPT0gREFDX1RSSUFOR0xFQU1QTElUVURFXzQwOTUpKQorCisjZGVmaW5lIElTX0RBQ19PVVRQVVRfQlVGRkVSX1NUQVRFKFNUQVRFKSAoKChTVEFURSkgPT0gREFDX09VVFBVVEJVRkZFUl9FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQVRFKSA9PSBEQUNfT1VUUFVUQlVGRkVSX0RJU0FCTEUpKQorCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkKKyNkZWZpbmUgSVNfREFDX09VVFBVVF9TV0lUQ0hfU1RBVEUoU1RBVEUpICgoKFNUQVRFKSA9PSBEQUNfT1VUUFVUU1dJVENIX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQVRFKSA9PSBEQUNfT1VUUFVUU1dJVENIX0VOQUJMRSkpCisKKyNlbmRpZiAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworI2RlZmluZSBJU19EQUNfQUxJR04oQUxJR04pICgoKEFMSUdOKSA9PSBEQUNfQUxJR05fMTJCX1IpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBTElHTikgPT0gREFDX0FMSUdOXzEyQl9MKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUxJR04pID09IERBQ19BTElHTl84Ql9SKSkKKworI2RlZmluZSBJU19EQUNfREFUQShEQVRBKSAoKERBVEEpIDw9IDB4RkZGMFUpIAorCisKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBJbmNsdWRlIERBQyBIQUwgRXh0ZW5kZWQgbW9kdWxlICovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9kYWNfZXguaCIgCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAKKworLyoqIEBhZGR0b2dyb3VwIERBQ19FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgREFDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAgKiBAeworICAqLworLyogSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfREFDX0luaXQoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ19EZUluaXQoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMpOwordm9pZCBIQUxfREFDX01zcEluaXQoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMpOwordm9pZCBIQUxfREFDX01zcERlSW5pdChEQUNfSGFuZGxlVHlwZURlZiogaGRhYyk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBEQUNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICAqIEB7CisgICovCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ19TdGFydChEQUNfSGFuZGxlVHlwZURlZiogaGRhYywgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfREFDX1N0b3AoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMsIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ19TdGFydF9ETUEoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90KiBwRGF0YSwgdWludDMyX3QgTGVuZ3RoLCB1aW50MzJfdCBBbGlnbm1lbnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ19TdG9wX0RNQShEQUNfSGFuZGxlVHlwZURlZiogaGRhYywgdWludDMyX3QgQ2hhbm5lbCk7Cit1aW50MzJfdCBIQUxfREFDX0dldFZhbHVlKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjLCB1aW50MzJfdCBDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNfQ29uZmlnQ2hhbm5lbChEQUNfSGFuZGxlVHlwZURlZiogaGRhYywgREFDX0NoYW5uZWxDb25mVHlwZURlZiogc0NvbmZpZywgdWludDMyX3QgQ2hhbm5lbCk7CisKK3ZvaWQgSEFMX0RBQ19JUlFIYW5kbGVyKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjKTsKK3ZvaWQgSEFMX0RBQ19Db252Q3BsdENhbGxiYWNrQ2gxKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjKTsKK3ZvaWQgSEFMX0RBQ19Db252SGFsZkNwbHRDYWxsYmFja0NoMShEQUNfSGFuZGxlVHlwZURlZiogaGRhYyk7Cit2b2lkIEhBTF9EQUNfRXJyb3JDYWxsYmFja0NoMShEQUNfSGFuZGxlVHlwZURlZiAqaGRhYyk7Cit2b2lkIEhBTF9EQUNfRE1BVW5kZXJydW5DYWxsYmFja0NoMShEQUNfSGFuZGxlVHlwZURlZiAqaGRhYyk7CisKKy8qKgorICAqIEB9CisgICovCisgIAorLyoqIEBhZGR0b2dyb3VwIERBQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzCisgICogQHsKKyAgKi8KKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfREFDX1NldFZhbHVlKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjLCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBBbGlnbm1lbnQsIHVpbnQzMl90IERhdGEpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgREFDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQKKyAgKiBAeworICAqLworLyogUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9EQUNfU3RhdGVUeXBlRGVmIEhBTF9EQUNfR2V0U3RhdGUoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMpOwordWludDMyX3QgSEFMX0RBQ19HZXRFcnJvcihEQUNfSGFuZGxlVHlwZURlZiAqaGRhYyk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisgIAorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qX19TVE0zMkYzeHhfSEFMX0RBQ19IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2hhbF9kYWNfZXguaCBiL0luYy9zdG0zMmYzeHhfaGFsX2RhY19leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMzU4MjIKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2hhbF9kYWNfZXguaApAQCAtMCwwICsxLDM1OSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfZGFjX2V4LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIERBQyBIQUwgRXh0ZW5kZWQgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkYzeHhfSEFMX0RBQ19FWF9ICisjZGVmaW5lIF9fU1RNMzJGM3h4X0hBTF9EQUNfRVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBEQUNFeAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBEQUNFeF9FeHBvcnRlZF9Db25zdGFudHMgREFDRXggRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNFeF90cmlnZ2VyX3NlbGVjdGlvbiBEQUNFeCB0cmlnZ2VyIHNlbGVjdGlvbgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorI2RlZmluZSBEQUNfVFJJR0dFUl9OT05FICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgLyohPCBDb252ZXJzaW9uIGlzIGF1dG9tYXRpYyBvbmNlIHRoZSBEQUMxX0RIUnh4eHggcmVnaXN0ZXIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgYmVlbiBsb2FkZWQsIGFuZCBub3QgYnkgZXh0ZXJuYWwgdHJpZ2dlciAqLworI2RlZmluZSBEQUNfVFJJR0dFUl9UNl9UUkdPICAgICAgICAgICAgICAgICgodWludDMyX3QpREFDX0NSX1RFTjEpIC8qITwgVElNNiBUUkdPIHNlbGVjdGVkIGFzIGV4dGVybmFsIGNvbnZlcnNpb24gdHJpZ2dlciBmb3IgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgREFDX1RSSUdHRVJfVDJfVFJHTyAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShEQUNfQ1JfVFNFTDFfMiB8IERBQ19DUl9URU4xKSkgLyohPCBUSU0yIFRSR08gc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgY29udmVyc2lvbiB0cmlnZ2VyIGZvciBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBEQUNfVFJJR0dFUl9UMTVfVFJHTyAgICAgICAgICAgICAgICgodWludDMyX3QpKERBQ19DUl9UU0VMMV8xIHwgREFDX0NSX1RTRUwxXzAgfCBEQUNfQ1JfVEVOMSkpIC8qITwgVElNNSBUUkdPIHNlbGVjdGVkIGFzIGV4dGVybmFsIGNvbnZlcnNpb24gdHJpZ2dlciBmb3IgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgREFDX1RSSUdHRVJfRVhUX0lUOSAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShEQUNfQ1JfVFNFTDFfMiB8IERBQ19DUl9UU0VMMV8xIHwgREFDX0NSX1RFTjEpKSAvKiE8IEVYVEkgTGluZTkgZXZlbnQgc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgY29udmVyc2lvbiB0cmlnZ2VyIGZvciBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBEQUNfVFJJR0dFUl9TT0ZUV0FSRSAgICAgICAgICAgICAgICgodWludDMyX3QpKERBQ19DUl9UU0VMMSB8IERBQ19DUl9URU4xKSkgLyohPCBDb252ZXJzaW9uIHN0YXJ0ZWQgYnkgc29mdHdhcmUgdHJpZ2dlciBmb3IgREFDIGNoYW5uZWwgKi8KKworI2RlZmluZSBJU19EQUNfVFJJR0dFUihUUklHR0VSKSAoKChUUklHR0VSKSA9PSBEQUNfVFJJR0dFUl9OT05FKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UUklHR0VSX1QyX1RSR08pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFJJR0dFUikgPT0gREFDX1RSSUdHRVJfVDZfVFJHTykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBEQUNfVFJJR0dFUl9UMTVfVFJHTykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBEQUNfVFJJR0dFUl9FWFRfSVQ5KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UUklHR0VSX1NPRlRXQVJFKSkKKyNlbmRpZiAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMTh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMng4KQorCisjZGVmaW5lIERBQ19UUklHR0VSX05PTkUgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAvKiE8IENvbnZlcnNpb24gaXMgYXV0b21hdGljIG9uY2UgdGhlIERBQzFfREhSeHh4eCByZWdpc3RlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBiZWVuIGxvYWRlZCwgYW5kIG5vdCBieSBleHRlcm5hbCB0cmlnZ2VyICovCisjZGVmaW5lIERBQ19UUklHR0VSX1Q2X1RSR08gICAgICAgICAgICAgICAgKCh1aW50MzJfdClEQUNfQ1JfVEVOMSkgLyohPCBUSU02IFRSR08gc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgY29udmVyc2lvbiB0cmlnZ2VyIGZvciBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBEQUNfVFJJR0dFUl9UM19UUkdPICAgICAgICAgICAgICAgICgodWludDMyX3QpKERBQ19DUl9UU0VMMV8wIHwgREFDX0NSX1RFTjEpKSAvKiE8IFRJTTMgVFJHTyBzZWxlY3RlZCBhcyBleHRlcm5hbCBjb252ZXJzaW9uIHRyaWdnZXIgZm9yIERBQyBjaGFubmVsICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREFDX1RSSUdHRVJfVDE1X1RSR08gICAgICAgICAgICAgICAoKHVpbnQzMl90KShEQUNfQ1JfVFNFTDFfMSB8IERBQ19DUl9UU0VMMV8wIHwgREFDX0NSX1RFTjEpKSAvKiE8IFRJTTUgVFJHTyBzZWxlY3RlZCBhcyBleHRlcm5hbCBjb252ZXJzaW9uIHRyaWdnZXIgZm9yIERBQyBjaGFubmVsICovCisjZGVmaW5lIERBQ19UUklHR0VSX1QyX1RSR08gICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoREFDX0NSX1RTRUwxXzIgfCBEQUNfQ1JfVEVOMSkpIC8qITwgVElNMiBUUkdPIHNlbGVjdGVkIGFzIGV4dGVybmFsIGNvbnZlcnNpb24gdHJpZ2dlciBmb3IgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgREFDX1RSSUdHRVJfVDRfVFJHTyAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShEQUNfQ1JfVFNFTDFfMiB8IERBQ19DUl9UU0VMMV8wIHwgREFDX0NSX1RFTjEpKSAvKiE8IFRJTTQgVFJHTyBzZWxlY3RlZCBhcyBleHRlcm5hbCBjb252ZXJzaW9uIHRyaWdnZXIgZm9yIERBQyBjaGFubmVsICovCisjZGVmaW5lIERBQ19UUklHR0VSX0VYVF9JVDkgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoREFDX0NSX1RTRUwxXzIgfCBEQUNfQ1JfVFNFTDFfMSB8IERBQ19DUl9URU4xKSkgLyohPCBFWFRJIExpbmU5IGV2ZW50IHNlbGVjdGVkIGFzIGV4dGVybmFsIGNvbnZlcnNpb24gdHJpZ2dlciBmb3IgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgREFDX1RSSUdHRVJfU09GVFdBUkUgICAgICAgICAgICAgICAoKHVpbnQzMl90KShEQUNfQ1JfVFNFTDEgfCBEQUNfQ1JfVEVOMSkpIC8qITwgQ29udmVyc2lvbiBzdGFydGVkIGJ5IHNvZnR3YXJlIHRyaWdnZXIgZm9yIERBQyBjaGFubmVsICovCisKKyNkZWZpbmUgSVNfREFDX1RSSUdHRVIoVFJJR0dFUikgKCgoVFJJR0dFUikgPT0gREFDX1RSSUdHRVJfTk9ORSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBEQUNfVFJJR0dFUl9UMl9UUkdPKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UUklHR0VSX1QzX1RSR08pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFJJR0dFUikgPT0gREFDX1RSSUdHRVJfVDRfVFJHTykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBEQUNfVFJJR0dFUl9UMTVfVFJHTykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBEQUNfVFJJR0dFUl9UNl9UUkdPKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UUklHR0VSX0VYVF9JVDkpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFJJR0dFUikgPT0gREFDX1RSSUdHRVJfU09GVFdBUkUpKQorCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMng4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkKKworI2RlZmluZSBEQUNfVFJJR0dFUl9OT05FICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgLyohPCBDb252ZXJzaW9uIGlzIGF1dG9tYXRpYyBvbmNlIHRoZSBEQUMxX0RIUnh4eHggcmVnaXN0ZXIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgYmVlbiBsb2FkZWQsIGFuZCBub3QgYnkgZXh0ZXJuYWwgdHJpZ2dlciAqLworI2RlZmluZSBEQUNfVFJJR0dFUl9UMl9UUkdPICAgICAgICAgICAgICAgICgodWludDMyX3QpKERBQ19DUl9UU0VMMV8yIHwgREFDX0NSX1RFTjEpKSAvKiE8IFRJTTIgVFJHTyBzZWxlY3RlZCBhcyBleHRlcm5hbCBjb252ZXJzaW9uIHRyaWdnZXIgZm9yIERBQyBjaGFubmVsICovCisjZGVmaW5lIERBQ19UUklHR0VSX1Q0X1RSR08gICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoREFDX0NSX1RTRUwxXzIgfCBEQUNfQ1JfVFNFTDFfMCB8IERBQ19DUl9URU4xKSkgLyohPCBUSU00IFRSR08gc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgY29udmVyc2lvbiB0cmlnZ2VyIGZvciBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBEQUNfVFJJR0dFUl9UMTVfVFJHTyAgICAgICAgICAgICAgICgodWludDMyX3QpKERBQ19DUl9UU0VMMV8xIHwgREFDX0NSX1RTRUwxXzAgfCBEQUNfQ1JfVEVOMSkpIC8qITwgVElNNSBUUkdPIHNlbGVjdGVkIGFzIGV4dGVybmFsIGNvbnZlcnNpb24gdHJpZ2dlciBmb3IgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgREFDX1RSSUdHRVJfVDZfVFJHTyAgICAgICAgICAgICAgICAoKHVpbnQzMl90KURBQ19DUl9URU4xKSAvKiE8IFRJTTYgVFJHTyBzZWxlY3RlZCBhcyBleHRlcm5hbCBjb252ZXJzaW9uIHRyaWdnZXIgZm9yIERBQyBjaGFubmVsICovCisjZGVmaW5lIERBQ19UUklHR0VSX1Q3X1RSR08gICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoREFDX0NSX1RTRUwxXzEgfCBEQUNfQ1JfVEVOMSkpIC8qITwgVElNNyBUUkdPIHNlbGVjdGVkIGFzIGV4dGVybmFsIGNvbnZlcnNpb24gdHJpZ2dlciBmb3IgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgREFDX1RSSUdHRVJfVDNfVFJHTyAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShEQUNfQ1JfVFNFTDFfMCB8IERBQ19DUl9URU4xKSkgLyohPCBUSU0zIFRSR08gc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgY29udmVyc2lvbiB0cmlnZ2VyIGZvciBEQUMgY2hhbm5lbCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgX19IQUxfUkVNQVBUUklHR0VSX0VOQUJMRShIQUxfUkVNQVBUUklHR0VSX0RBQzFfVFJJRykgZm9yIFRJTTMgc2VsZWN0aW9uICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREFDX1RSSUdHRVJfVDhfVFJHTyAgICAgICAgICAgICAgICBEQUNfVFJJR0dFUl9UM19UUkdPICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU04IFRSR08gc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgY29udmVyc2lvbiB0cmlnZ2VyIGZvciBEQUMgY2hhbm5lbCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgX19IQUxfUkVNQVBUUklHR0VSX0RJU0FCTEUoSEFMX1JFTUFQVFJJR0dFUl9EQUMxX1RSSUcpIGZvciBUSU04IHNlbGVjdGlvbiAqLyAgICAgICAgICAgICAgICAgIAorCisjZGVmaW5lIERBQ19UUklHR0VSX0VYVF9JVDkgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoREFDX0NSX1RTRUwxXzIgfCBEQUNfQ1JfVFNFTDFfMSB8IERBQ19DUl9URU4xKSkgLyohPCBFWFRJIExpbmU5IGV2ZW50IHNlbGVjdGVkIGFzIGV4dGVybmFsIGNvbnZlcnNpb24gdHJpZ2dlciBmb3IgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgREFDX1RSSUdHRVJfU09GVFdBUkUgICAgICAgICAgICAgICAoKHVpbnQzMl90KShEQUNfQ1JfVFNFTDEgfCBEQUNfQ1JfVEVOMSkpIC8qITwgQ29udmVyc2lvbiBzdGFydGVkIGJ5IHNvZnR3YXJlIHRyaWdnZXIgZm9yIERBQyBjaGFubmVsICovCisKKyNkZWZpbmUgSVNfREFDX1RSSUdHRVIoVFJJR0dFUikgKCgoVFJJR0dFUikgPT0gREFDX1RSSUdHRVJfTk9ORSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBEQUNfVFJJR0dFUl9UMl9UUkdPKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UUklHR0VSX1QzX1RSR08pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFJJR0dFUikgPT0gREFDX1RSSUdHRVJfVDRfVFJHTykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBEQUNfVFJJR0dFUl9UMTVfVFJHTykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBEQUNfVFJJR0dFUl9UNl9UUkdPKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UUklHR0VSX1Q3X1RSR08pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFJJR0dFUikgPT0gREFDX1RSSUdHRVJfRVhUX0lUOSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBEQUNfVFJJR0dFUl9TT0ZUV0FSRSkpCisjZW5kaWYgLyogU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAgICAqLworCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSAKKworI2RlZmluZSBEQUNfVFJJR0dFUl9OT05FICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgLyohPCBDb252ZXJzaW9uIGlzIGF1dG9tYXRpYyBvbmNlIHRoZSBEQUMxX0RIUnh4eHggcmVnaXN0ZXIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgYmVlbiBsb2FkZWQsIGFuZCBub3QgYnkgZXh0ZXJuYWwgdHJpZ2dlciAqLworI2RlZmluZSBEQUNfVFJJR0dFUl9UMl9UUkdPICAgICAgICAgICAgICAgICgodWludDMyX3QpKERBQ19DUl9UU0VMMV8yIHwgREFDX0NSX1RFTjEpKSAvKiE8IFRJTTIgVFJHTyBzZWxlY3RlZCBhcyBleHRlcm5hbCBjb252ZXJzaW9uIHRyaWdnZXIgZm9yIERBQyBjaGFubmVsICovCisjZGVmaW5lIERBQ19UUklHR0VSX1QxNV9UUkdPICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoREFDX0NSX1RTRUwxXzEgfCBEQUNfQ1JfVFNFTDFfMCB8IERBQ19DUl9URU4xKSkgLyohPCBUSU01IFRSR08gc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgY29udmVyc2lvbiB0cmlnZ2VyIGZvciBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBEQUNfVFJJR0dFUl9UNl9UUkdPICAgICAgICAgICAgICAgICgodWludDMyX3QpREFDX0NSX1RFTjEpIC8qITwgVElNNiBUUkdPIHNlbGVjdGVkIGFzIGV4dGVybmFsIGNvbnZlcnNpb24gdHJpZ2dlciBmb3IgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgREFDX1RSSUdHRVJfVDdfVFJHTyAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShEQUNfQ1JfVFNFTDFfMSB8IERBQ19DUl9URU4xKSkgLyohPCBUSU03IFRSR08gc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgY29udmVyc2lvbiB0cmlnZ2VyIGZvciBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBEQUNfVFJJR0dFUl9UM19UUkdPICAgICAgICAgICAgICAgICgodWludDMyX3QpKERBQ19DUl9UU0VMMV8wIHwgREFDX0NSX1RFTjEpKSAvKiE8IFRJTTMgVFJHTyBzZWxlY3RlZCBhcyBleHRlcm5hbCBjb252ZXJzaW9uIHRyaWdnZXIgZm9yIERBQyBjaGFubmVsICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworI2RlZmluZSBEQUNfVFJJR0dFUl9FWFRfSVQ5ICAgICAgICAgICAgICAgICgodWludDMyX3QpKERBQ19DUl9UU0VMMV8yIHwgREFDX0NSX1RTRUwxXzEgfCBEQUNfQ1JfVEVOMSkpIC8qITwgRVhUSSBMaW5lOSBldmVudCBzZWxlY3RlZCBhcyBleHRlcm5hbCBjb252ZXJzaW9uIHRyaWdnZXIgZm9yIERBQyBjaGFubmVsICovCisjZGVmaW5lIERBQ19UUklHR0VSX1NPRlRXQVJFICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoREFDX0NSX1RTRUwxIHwgREFDX0NSX1RFTjEpKSAvKiE8IENvbnZlcnNpb24gc3RhcnRlZCBieSBzb2Z0d2FyZSB0cmlnZ2VyIGZvciBEQUMgY2hhbm5lbCAqLworCisjZGVmaW5lIElTX0RBQ19UUklHR0VSKFRSSUdHRVIpICgoKFRSSUdHRVIpID09IERBQ19UUklHR0VSX05PTkUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFJJR0dFUikgPT0gREFDX1RSSUdHRVJfVDJfVFJHTykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBEQUNfVFJJR0dFUl9UM19UUkdPKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UUklHR0VSX1QxNV9UUkdPKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UUklHR0VSX1Q2X1RSR08pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFJJR0dFUikgPT0gREFDX1RSSUdHRVJfVDdfVFJHTykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBEQUNfVFJJR0dFUl9FWFRfSVQ5KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UUklHR0VSX1NPRlRXQVJFKSkKKworI2VuZGlmIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMyOHh4ICovCisKKworI2lmIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisgCisjZGVmaW5lIERBQ19UUklHR0VSX05PTkUgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAvKiE8IENvbnZlcnNpb24gaXMgYXV0b21hdGljIG9uY2UgdGhlIERBQzFfREhSeHh4eCByZWdpc3RlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBiZWVuIGxvYWRlZCwgYW5kIG5vdCBieSBleHRlcm5hbCB0cmlnZ2VyICovCisKKyNkZWZpbmUgREFDX1RSSUdHRVJfVDJfVFJHTyAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShEQUNfQ1JfVFNFTDFfMiB8IERBQ19DUl9URU4xKSkgLyohPCBUSU0yIFRSR08gc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgY29udmVyc2lvbiB0cmlnZ2VyIGZvciBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBEQUNfVFJJR0dFUl9UNF9UUkdPICAgICAgICAgICAgICAgICgodWludDMyX3QpKERBQ19DUl9UU0VMMV8yIHwgREFDX0NSX1RTRUwxXzAgfCBEQUNfQ1JfVEVOMSkpIC8qITwgVElNNCBUUkdPIHNlbGVjdGVkIGFzIGV4dGVybmFsIGNvbnZlcnNpb24gdHJpZ2dlciBmb3IgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgREFDX1RSSUdHRVJfVDVfVFJHTyAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShEQUNfQ1JfVFNFTDFfMSB8IERBQ19DUl9UU0VMMV8wIHwgREFDX0NSX1RFTjEpKSAvKiE8IFRJTTUgVFJHTyBzZWxlY3RlZCBhcyBleHRlcm5hbCBjb252ZXJzaW9uIHRyaWdnZXIgZm9yIERBQyBjaGFubmVsIChEQUMxKSAqLworI2RlZmluZSBEQUNfVFJJR0dFUl9UMThfVFJHTyAgICAgICAgICAgICAgIERBQ19UUklHR0VSX1Q1X1RSR08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMTggVFJHTyBzZWxlY3RlZCBhcyBleHRlcm5hbCBjb252ZXJzaW9uIHRyaWdnZXIgZm9yIERBQyBjaGFubmVsIChEQUMyKSAqLworI2RlZmluZSBEQUNfVFJJR0dFUl9UNl9UUkdPICAgICAgICAgICAgICAgICgodWludDMyX3QpREFDX0NSX1RFTjEpIC8qITwgVElNNiBUUkdPIHNlbGVjdGVkIGFzIGV4dGVybmFsIGNvbnZlcnNpb24gdHJpZ2dlciBmb3IgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgREFDX1RSSUdHRVJfVDdfVFJHTyAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShEQUNfQ1JfVFNFTDFfMSB8IERBQ19DUl9URU4xKSkgLyohPCBUSU03IFRSR08gc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgY29udmVyc2lvbiB0cmlnZ2VyIGZvciBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBEQUNfVFJJR0dFUl9UM19UUkdPICAgICAgICAgICAgICAgICgodWludDMyX3QpKERBQ19DUl9UU0VMMV8wIHwgREFDX0NSX1RFTjEpKSAvKiE8IFRJTTMgVFJHTyBzZWxlY3RlZCBhcyBleHRlcm5hbCBjb252ZXJzaW9uIHRyaWdnZXIgZm9yIERBQyBjaGFubmVsICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworI2RlZmluZSBEQUNfVFJJR0dFUl9FWFRfSVQ5ICAgICAgICAgICAgICAgICgodWludDMyX3QpKERBQ19DUl9UU0VMMV8yIHwgREFDX0NSX1RTRUwxXzEgfCBEQUNfQ1JfVEVOMSkpIC8qITwgRVhUSSBMaW5lOSBldmVudCBzZWxlY3RlZCBhcyBleHRlcm5hbCBjb252ZXJzaW9uIHRyaWdnZXIgZm9yIERBQyBjaGFubmVsICovCisjZGVmaW5lIERBQ19UUklHR0VSX1NPRlRXQVJFICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoREFDX0NSX1RTRUwxIHwgREFDX0NSX1RFTjEpKSAvKiE8IENvbnZlcnNpb24gc3RhcnRlZCBieSBzb2Z0d2FyZSB0cmlnZ2VyIGZvciBEQUMgY2hhbm5lbCAqLworCisKKyNkZWZpbmUgSVNfREFDX1RSSUdHRVIoVFJJR0dFUikgKCgoVFJJR0dFUikgPT0gREFDX1RSSUdHRVJfTk9ORSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBEQUNfVFJJR0dFUl9UMl9UUkdPKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UUklHR0VSX1QzX1RSR08pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFJJR0dFUikgPT0gREFDX1RSSUdHRVJfVDRfVFJHTykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBEQUNfVFJJR0dFUl9UNV9UUkdPKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UUklHR0VSX1Q2X1RSR08pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFJJR0dFUikgPT0gREFDX1RSSUdHRVJfVDdfVFJHTykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBEQUNfVFJJR0dFUl9FWFRfSVQ5KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UUklHR0VSX1NPRlRXQVJFKSkKKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMzR4OCkKKworI2RlZmluZSBEQUNfVFJJR0dFUl9OT05FICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgLyohPCBDb252ZXJzaW9uIGlzIGF1dG9tYXRpYyBvbmNlIHRoZSBEQUMxX0RIUnh4eHggcmVnaXN0ZXIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgYmVlbiBsb2FkZWQsIGFuZCBub3QgYnkgZXh0ZXJuYWwgdHJpZ2dlciAqLworI2RlZmluZSBEQUNfVFJJR0dFUl9UNl9UUkdPICAgICAgICAgICAgICAgICgodWludDMyX3QpREFDX0NSX1RFTjEpIC8qITwgVElNNiBUUkdPIHNlbGVjdGVkIGFzIGV4dGVybmFsIGNvbnZlcnNpb24gdHJpZ2dlciBmb3IgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgREFDX1RSSUdHRVJfVDNfVFJHTyAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShEQUNfQ1JfVFNFTDFfMCB8IERBQ19DUl9URU4xKSkgLyohPCBUSU0zIFRSR08gc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgY29udmVyc2lvbiB0cmlnZ2VyIGZvciBEQUMgY2hhbm5lbCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgX19IQUxfUkVNQVBUUklHR0VSX0VOQUJMRShIQUxfUkVNQVBUUklHR0VSX0RBQzFfVFJJRykgZm9yIFRJTTMgcmVtYXAgKi8KKworI2RlZmluZSBEQUNfVFJJR0dFUl9UN19UUkdPICAgICAgICAgICAgICAgICgodWludDMyX3QpKERBQ19DUl9UU0VMMV8xIHwgREFDX0NSX1RFTjEpKSAvKiE8IFRJTTcgVFJHTyBzZWxlY3RlZCBhcyBleHRlcm5hbCBjb252ZXJzaW9uIHRyaWdnZXIgZm9yIERBQyBjaGFubmVsICovCisjZGVmaW5lIERBQ19UUklHR0VSX1QyX1RSR08gICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoREFDX0NSX1RTRUwxXzIgfCBEQUNfQ1JfVEVOMSkpIC8qITwgVElNMiBUUkdPIHNlbGVjdGVkIGFzIGV4dGVybmFsIGNvbnZlcnNpb24gdHJpZ2dlciBmb3IgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgREFDX1RSSUdHRVJfVDE1X1RSR08gICAgICAgICAgICAgICAoKHVpbnQzMl90KShEQUNfQ1JfVFNFTDFfMSB8IERBQ19DUl9UU0VMMV8wIHwgREFDX0NSX1RFTjEpKSAvKiE8IFRJTTE1IFRSR08gc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgY29udmVyc2lvbiB0cmlnZ2VyIGZvciBEQUMgY2hhbm5lbCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSBfX0hBTF9SRU1BUFRSSUdHRVJfRElTQUJMRShIQUxfUkVNQVBUUklHR0VSX0RBQzFfVFJJRzMpIGZvciBUSU0xNSBzZWxlY3Rpb24gKi8gCisjZGVmaW5lIERBQ19UUklHR0VSX0hSVElNMV9EQUNUUkcxICAgICAgICAgREFDX1RSSUdHRVJfVDE1X1RSR08gICAgICAvKiE8IEhSVElNMSBEQUNUUkcxIHNlbGVjdGVkIGFzIGV4dGVybmFsIGNvbnZlcnNpb24gdHJpZ2dlciBmb3IgREFDIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgX19IQUxfUkVNQVBUUklHR0VSX0VOQUJMRShIQUxfUkVNQVBUUklHR0VSX0RBQzFfVFJJRzMpIGZvciBIUlRJTTEgREFDVFJHMSBzZWxlY3Rpb24gKi8gCisKKyNkZWZpbmUgREFDX1RSSUdHRVJfSFJUSU0xX0RBQ1RSRzIgICAgICAgICAoKHVpbnQzMl90KShEQUNfQ1JfVFNFTDFfMiB8IERBQ19DUl9UU0VMMV8wIHwgREFDX0NSX1RFTjEpKSAvKiE8IEhSVElNMSBEQUNUUkcyIHNlbGVjdGVkIGFzIGV4dGVybmFsIGNvbnZlcnNpb24gdHJpZ2dlciBmb3IgREFDIGNoYW5uZWwgKERBQzEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgX19IQUxfUkVNQVBUUklHR0VSX0VOQUJMRShIQUxfUkVNQVBUUklHR0VSX0RBQzFfVFJJRzUpIGZvciBIUlRJTTEgREFDVFJHMiByZW1hcCAqLyAKKyNkZWZpbmUgREFDX1RSSUdHRVJfSFJUSU0xX0RBQ1RSRzMgICAgICAgICBEQUNfVFJJR0dFUl9IUlRJTTFfREFDVFJHMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEhSVElNMSBEQUNUUkczIHNlbGVjdGVkIGFzIGV4dGVybmFsIGNvbnZlcnNpb24gdHJpZ2dlciBmb3IgREFDIGNoYW5uZWwgKERBQzIpKi8KKworI2RlZmluZSBEQUNfVFJJR0dFUl9FWFRfSVQ5ICAgICAgICAgICAgICAgICgodWludDMyX3QpKERBQ19DUl9UU0VMMV8yIHwgREFDX0NSX1RTRUwxXzEgfCBEQUNfQ1JfVEVOMSkpIC8qITwgRVhUSSBMaW5lOSBldmVudCBzZWxlY3RlZCBhcyBleHRlcm5hbCBjb252ZXJzaW9uIHRyaWdnZXIgZm9yIERBQyBjaGFubmVsICovCisjZGVmaW5lIERBQ19UUklHR0VSX1NPRlRXQVJFICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoREFDX0NSX1RTRUwxIHwgREFDX0NSX1RFTjEpKSAvKiE8IENvbnZlcnNpb24gc3RhcnRlZCBieSBzb2Z0d2FyZSB0cmlnZ2VyIGZvciBEQUMgY2hhbm5lbCAqLworCisjZGVmaW5lIElTX0RBQ19UUklHR0VSKFRSSUdHRVIpICgoKFRSSUdHRVIpID09IERBQ19UUklHR0VSX05PTkUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFJJR0dFUikgPT0gREFDX1RSSUdHRVJfVDZfVFJHTykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBEQUNfVFJJR0dFUl9UM19UUkdPKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UUklHR0VSX1Q3X1RSR08pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFJJR0dFUikgPT0gREFDX1RSSUdHRVJfVDE1X1RSR08pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFJJR0dFUikgPT0gREFDX1RSSUdHRVJfVDJfVFJHTykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBEQUNfVFJJR0dFUl9IUlRJTTFfREFDVFJHMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBEQUNfVFJJR0dFUl9FWFRfSVQ5KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UUklHR0VSX1NPRlRXQVJFKSkKKworI2VuZGlmIC8qIFNUTTMyRjMzNHg4ICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDRXhfQ2hhbm5lbF9zZWxlY3Rpb24gREFDRXggQ2hhbm5lbCBzZWxlY3Rpb24KKyAgKiBAeworICAqLworIAorI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKyNkZWZpbmUgREFDX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgLyohPCBEQUMgQ2hhbm5lbCAxVSAqLworCisjZW5kaWYgIC8qIFNUTTMyRjMwMnhFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgIC8qIFNUTTMyRjMwMnhDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisKKworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorI2RlZmluZSBEQUNfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAvKiE8IERBQyBDaGFubmVsIDFVICovCisjZGVmaW5lIERBQ19DSEFOTkVMXzIgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAxMFUpICAgICAgIC8qITwgREFDIENoYW5uZWwgMlUgKi8KKworI2VuZGlmIC8qIFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggICAgKi8KKyAgIAorI2lmIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorCisjZGVmaW5lIERBQ19DSEFOTkVMXzEgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgIC8qITwgREFDIENoYW5uZWwgMVUgKi8KKyNkZWZpbmUgREFDX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDEwVSkgICAgICAgLyohPCBEQUMgQ2hhbm5lbCAyVSAqLworCisjZW5kaWYgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAgICAgICAgICAgICAgICAgICAqLworICAgCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIERBQ0V4X1ByaXZhdGVfTWFjcm9zIERBQ0V4IFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKworI2RlZmluZSBJU19EQUNfQ0hBTk5FTChDSEFOTkVMKSAoKENIQU5ORUwpID09IERBQ19DSEFOTkVMXzEpICAgICAgICAgICAgCisjZW5kaWYgIC8qIFNUTTMyRjMwMnhFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgIC8qIFNUTTMyRjMwMnhDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisKKworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorCisjZGVmaW5lIElTX0RBQ19DSEFOTkVMKENIQU5ORUwpICgoKENIQU5ORUwpID09IERBQ19DSEFOTkVMXzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gREFDX0NIQU5ORUxfMikpCisjZW5kaWYgLyogU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisKKyNkZWZpbmUgSVNfREFDX0NIQU5ORUwoQ0hBTk5FTCkgKCgoQ0hBTk5FTCkgPT0gREFDX0NIQU5ORUxfMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBEQUNfQ0hBTk5FTF8yKSkKKyNlbmRpZiAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICAqLworCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gIAorCisvKiogQGFkZHRvZ3JvdXAgREFDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIERBQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAqIEB7CisgKi8gICAgCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1aW50MzJfdCBIQUxfREFDRXhfRHVhbEdldFZhbHVlKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNFeF9EdWFsU2V0VmFsdWUoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMsIHVpbnQzMl90IEFsaWdubWVudCwgdWludDMyX3QgRGF0YTEsIHVpbnQzMl90IERhdGEyKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNFeF9UcmlhbmdsZVdhdmVHZW5lcmF0ZShEQUNfSGFuZGxlVHlwZURlZiogaGRhYywgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgQW1wbGl0dWRlKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNFeF9Ob2lzZVdhdmVHZW5lcmF0ZShEQUNfSGFuZGxlVHlwZURlZiogaGRhYywgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgQW1wbGl0dWRlKTsKKworI2lmICBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSAgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgIGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkgfHwgXAorICAgICBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQordm9pZCBIQUxfREFDRXhfQ29udkNwbHRDYWxsYmFja0NoMihEQUNfSGFuZGxlVHlwZURlZiogaGRhYyk7Cit2b2lkIEhBTF9EQUNFeF9Db252SGFsZkNwbHRDYWxsYmFja0NoMihEQUNfSGFuZGxlVHlwZURlZiogaGRhYyk7Cit2b2lkIEhBTF9EQUNFeF9FcnJvckNhbGxiYWNrQ2gyKERBQ19IYW5kbGVUeXBlRGVmICpoZGFjKTsKK3ZvaWQgSEFMX0RBQ0V4X0RNQVVuZGVycnVuQ2FsbGJhY2tDaDIoREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMpOworI2VuZGlmIC8qIFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4ICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICAgICAgICAgICAgICAgICAgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAgKiBAfQorICAgKi8KKworLyoqCisgICAqIEB9CisgICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkYzeHhfSEFMX0hBTF9FWF9IICovCisgCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjN4eF9oYWxfZGVmLmggYi9JbmMvc3RtMzJmM3h4X2hhbF9kZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjg3NWNjCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjN4eF9oYWxfZGVmLmgKQEAgLTAsMCArMSwxODEgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX2RlZi5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBUaGlzIGZpbGUgY29udGFpbnMgSEFMIGNvbW1vbiBkZWZpbmVzLCBlbnVtZXJhdGlvbiwgbWFjcm9zIGFuZCAKKyAgKiAgICAgICAgICBzdHJ1Y3R1cmVzIGRlZmluaXRpb25zLiAKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0hBTF9ERUYKKyNkZWZpbmUgX19TVE0zMkYzeHhfSEFMX0RFRgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eC5oIgorI2lmIGRlZmluZWQgVVNFX0xFR0FDWQorI2luY2x1ZGUgIkxlZ2FjeS9zdG0zMl9oYWxfbGVnYWN5LmgiCisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogCisgICogQGJyaWVmICBIQUwgU3RhdHVzIHN0cnVjdHVyZXMgZGVmaW5pdGlvbiAgCisgICovICAKK3R5cGVkZWYgZW51bSAKK3sKKyAgSEFMX09LICAgICAgID0gMHgwMFUsCisgIEhBTF9FUlJPUiAgICA9IDB4MDFVLAorICBIQUxfQlVTWSAgICAgPSAweDAyVSwKKyAgSEFMX1RJTUVPVVQgID0gMHgwMworfSBIQUxfU3RhdHVzVHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiAgSEFMIExvY2sgc3RydWN0dXJlcyBkZWZpbml0aW9uICAKKyAgKi8KK3R5cGVkZWYgZW51bSAKK3sKKyAgSEFMX1VOTE9DS0VEID0gMHgwMFUsCisgIEhBTF9MT0NLRUQgICA9IDB4MDEgIAorfSBIQUxfTG9ja1R5cGVEZWY7CisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgVU5VU0VEKFgpICh2b2lkKVggICAgICAvKiBUbyBhdm9pZCBnY2MvZysrIHdhcm5pbmdzICovCisKKyNkZWZpbmUgSEFMX01BWF9ERUxBWSAgICAgIDB4RkZGRkZGRkZVCisKKyNkZWZpbmUgSEFMX0lTX0JJVF9TRVQoUkVHLCBCSVQpICAgICAgICAgKCgoUkVHKSAmIChCSVQpKSA9PSBCSVQpCisjZGVmaW5lIEhBTF9JU19CSVRfQ0xSKFJFRywgQklUKSAgICAgICAgICgoKFJFRykgJiAoQklUKSkgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfTElOS0RNQShfX0hBTkRMRV9fLCBfX1BQUF9ETUFfRklFTERfLCBfX0RNQV9IQU5ETEVfKSAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPl9fUFBQX0RNQV9GSUVMRF8gPSAmKF9fRE1BX0hBTkRMRV8pOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0RNQV9IQU5ETEVfKS5QYXJlbnQgPSAoX19IQU5ETEVfXyk7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisvKiogQGJyaWVmIFJlc2V0IHRoZSBIYW5kbGUncyBTdGF0ZSBmaWVsZC4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFBlcmlwaGVyYWwgSGFuZGxlLgorICAqIEBub3RlICBUaGlzIG1hY3JvIGNhbiBiZSB1c2VkIGZvciB0aGUgZm9sbG93aW5nIHB1cnBvc2U6CisgICogICAgICAgICAgLSBXaGVuIHRoZSBIYW5kbGUgaXMgZGVjbGFyZWQgYXMgbG9jYWwgdmFyaWFibGU7IGJlZm9yZSBwYXNzaW5nIGl0IGFzIHBhcmFtZXRlcgorICAqICAgICAgICAgICAgdG8gSEFMX1BQUF9Jbml0KCkgZm9yIHRoZSBmaXJzdCB0aW1lLCBpdCBpcyBtYW5kYXRvcnkgdG8gdXNlIHRoaXMgbWFjcm8KKyAgKiAgICAgICAgICAgIHRvIHNldCB0byAwIHRoZSBIYW5kbGUncyAiU3RhdGUiIGZpZWxkLgorICAqICAgICAgICAgICAgT3RoZXJ3aXNlLCAiU3RhdGUiIGZpZWxkIG1heSBoYXZlIGFueSByYW5kb20gdmFsdWUgYW5kIHRoZSBmaXJzdCB0aW1lIHRoZSBmdW5jdGlvbgorICAqICAgICAgICAgICAgSEFMX1BQUF9Jbml0KCkgaXMgY2FsbGVkLCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIGluaXRpYWxpemF0aW9uIHdpbGwgYmUgbWlzc2VkCisgICogICAgICAgICAgICAoaS5lLiBIQUxfUFBQX01zcEluaXQoKSB3aWxsIG5vdCBiZSBleGVjdXRlZCkuCisgICogICAgICAgICAgLSBXaGVuIHRoZXJlIGlzIGEgbmVlZCB0byByZWNvbmZpZ3VyZSB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBpbnN0ZWFkIG9mIGNhbGxpbmcKKyAgKiAgICAgICAgICAgIEhBTF9QUFBfRGVJbml0KCkgdGhlbiBIQUxfUFBQX0luaXQoKSwgdXNlciBjYW4gbWFrZSBhIGNhbGwgdG8gdGhpcyBtYWNybyB0aGVuIEhBTF9QUFBfSW5pdCgpLgorICAqICAgICAgICAgICAgSW4gdGhpcyBsYXRlciBmdW5jdGlvbiwgd2hlbiB0aGUgSGFuZGxlJ3MgIlN0YXRlIiBmaWVsZCBpcyBzZXQgdG8gMCwgaXQgd2lsbCBleGVjdXRlIHRoZSBmdW5jdGlvbgorICAqICAgICAgICAgICAgSEFMX1BQUF9Nc3BJbml0KCkgd2hpY2ggd2lsbCByZWNvbmZpZ3VyZSB0aGUgbG93IGxldmVsIGhhcmR3YXJlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSAwVSkKKworI2lmIChVU0VfUlRPUyA9PSAxVSkKKyAgI2Vycm9yICIgVVNFX1JUT1Mgc2hvdWxkIGJlIDAgaW4gdGhlIGN1cnJlbnQgSEFMIHJlbGVhc2UgIgorI2Vsc2UKKyAgI2RlZmluZSBfX0hBTF9MT0NLKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChfX0hBTkRMRV9fKS0+TG9jayA9PSBIQUxfTE9DS0VEKSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBIQUxfQlVTWTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TG9jayA9IEhBTF9MT0NLRUQ7ICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUgKDBVKQorCisgICNkZWZpbmUgX19IQUxfVU5MT0NLKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Mb2NrID0gSEFMX1VOTE9DS0VEOyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUgKDBVKQorI2VuZGlmIC8qIFVTRV9SVE9TICovCisKKyNpZiBkZWZpbmVkICggX19HTlVDX18gKSAmJiAhZGVmaW5lZCAoX19DQ19BUk0pIC8qIEdOVSBDb21waWxlciAqLworICAjaWZuZGVmIF9fd2VhaworICAgICNkZWZpbmUgX193ZWFrICAgX19hdHRyaWJ1dGVfXygod2VhaykpCisgICNlbmRpZiAvKiBfX3dlYWsgKi8KKyAgI2lmbmRlZiBfX3BhY2tlZAorICAgICNkZWZpbmUgX19wYWNrZWQgX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpCisgICNlbmRpZiAvKiBfX3BhY2tlZCAqLworI2VuZGlmIC8qIF9fR05VQ19fICovCisKKworLyogTWFjcm8gdG8gZ2V0IHZhcmlhYmxlIGFsaWduZWQgb24gNC1ieXRlcywgZm9yIF9fSUNDQVJNX18gdGhlIGRpcmVjdGl2ZSAiI3ByYWdtYSBkYXRhX2FsaWdubWVudD00IiBtdXN0IGJlIHVzZWQgaW5zdGVhZCAqLworI2lmIGRlZmluZWQgKCBfX0dOVUNfXyApICYmICFkZWZpbmVkIChfX0NDX0FSTSkgLyogR05VIENvbXBpbGVyICovCisgICNpZm5kZWYgX19BTElHTl9FTkQKKyAgICAjZGVmaW5lIF9fQUxJR05fRU5EICAgIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg0KSkpCisgICNlbmRpZiAvKiBfX0FMSUdOX0VORCAqLworICAjaWZuZGVmIF9fQUxJR05fQkVHSU4gIAorICAgICNkZWZpbmUgX19BTElHTl9CRUdJTgorICAjZW5kaWYgLyogX19BTElHTl9CRUdJTiAqLworI2Vsc2UKKyAgI2lmbmRlZiBfX0FMSUdOX0VORAorICAgICNkZWZpbmUgX19BTElHTl9FTkQKKyAgI2VuZGlmIC8qIF9fQUxJR05fRU5EICovCisgICNpZm5kZWYgX19BTElHTl9CRUdJTiAgICAgIAorICAgICNpZiBkZWZpbmVkICAgKF9fQ0NfQVJNKSAgICAgIC8qIEFSTSBDb21waWxlciAqLworICAgICAgI2RlZmluZSBfX0FMSUdOX0JFR0lOICAgIF9fYWxpZ24oNCkgIAorICAgICNlbGlmIGRlZmluZWQgKF9fSUNDQVJNX18pICAgIC8qIElBUiBDb21waWxlciAqLworICAgICAgI2RlZmluZSBfX0FMSUdOX0JFR0lOIAorICAgICNlbmRpZiAvKiBfX0NDX0FSTSAqLworICAjZW5kaWYgLyogX19BTElHTl9CRUdJTiAqLworI2VuZGlmIC8qIF9fR05VQ19fICovCisKKy8qKiAKKyAgKiBAYnJpZWYgIF9fTk9JTkxJTkUgZGVmaW5pdGlvbgorICAqLyAKKyNpZiBkZWZpbmVkICggX19DQ19BUk0gICApIHx8IGRlZmluZWQgICAoICBfX0dOVUNfXyAgKQorLyogQVJNICYgR05VQ29tcGlsZXIgCisgICAtLS0tLS0tLS0tLS0tLS0tIAorKi8KKyNkZWZpbmUgX19OT0lOTElORSBfX2F0dHJpYnV0ZV9fICggKG5vaW5saW5lKSApICAKKworI2VsaWYgZGVmaW5lZCAoIF9fSUNDQVJNX18gKQorLyogSUNDQVJNIENvbXBpbGVyCisgICAtLS0tLS0tLS0tLS0tLS0KKyovCisjZGVmaW5lIF9fTk9JTkxJTkUgX1ByYWdtYSgib3B0aW1pemUgPSBub19pbmxpbmUiKQorCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fX1NUTTMyRjN4eF9IQUxfREVGICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2hhbF9kbWEuaCBiL0luYy9zdG0zMmYzeHhfaGFsX2RtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NTVlNGYKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2hhbF9kbWEuaApAQCAtMCwwICsxLDQ3MCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfZG1hLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIERNQSBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8gCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0hBTF9ETUFfSAorI2RlZmluZSBfX1NUTTMyRjN4eF9IQUxfRE1BX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgRE1BCisgICogQHsKKyAgKi8gCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorCisvKiogQGRlZmdyb3VwIERNQV9FeHBvcnRlZF9UeXBlcyBETUEgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKiogCisgICogQGJyaWVmICBETUEgQ29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiAgCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBEaXJlY3Rpb247ICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyBpZiB0aGUgZGF0YSB3aWxsIGJlIHRyYW5zZmVycmVkIGZyb20gbWVtb3J5IHRvIHBlcmlwaGVyYWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gbWVtb3J5IHRvIG1lbW9yeSBvciBmcm9tIHBlcmlwaGVyYWwgdG8gbWVtb3J5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRE1BX0RhdGFfdHJhbnNmZXJfZGlyZWN0aW9uICovCisKKyAgdWludDMyX3QgUGVyaXBoSW5jOyAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgUGVyaXBoZXJhbCBhZGRyZXNzIHJlZ2lzdGVyIHNob3VsZCBiZSBpbmNyZW1lbnRlZCBvciBub3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfUGVyaXBoZXJhbF9pbmNyZW1lbnRlZF9tb2RlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHVpbnQzMl90IE1lbUluYzsgICAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIG1lbW9yeSBhZGRyZXNzIHJlZ2lzdGVyIHNob3VsZCBiZSBpbmNyZW1lbnRlZCBvciBub3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfTWVtb3J5X2luY3JlbWVudGVkX21vZGUgKi8KKyAgCisgIHVpbnQzMl90IFBlcmlwaERhdGFBbGlnbm1lbnQ7ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBQZXJpcGhlcmFsIGRhdGEgd2lkdGguCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfUGVyaXBoZXJhbF9kYXRhX3NpemUgKi8KKworICB1aW50MzJfdCBNZW1EYXRhQWxpZ25tZW50OyAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgTWVtb3J5IGRhdGEgd2lkdGguCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfTWVtb3J5X2RhdGFfc2l6ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB1aW50MzJfdCBNb2RlOyAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgb3BlcmF0aW9uIG1vZGUgb2YgdGhlIERNQXkgQ2hhbm5lbHguCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoZSBjaXJjdWxhciBidWZmZXIgbW9kZSBjYW5ub3QgYmUgdXNlZCBpZiB0aGUgbWVtb3J5LXRvLW1lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgdHJhbnNmZXIgaXMgY29uZmlndXJlZCBvbiB0aGUgc2VsZWN0ZWQgQ2hhbm5lbCAqLyAKKworICB1aW50MzJfdCBQcmlvcml0eTsgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHNvZnR3YXJlIHByaW9yaXR5IGZvciB0aGUgRE1BeSBDaGFubmVseC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfUHJpb3JpdHlfbGV2ZWwgKi8KK30gRE1BX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBETUEgU3RhdGUgc3RydWN0dXJlcyBkZWZpbml0aW9uICAKKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfRE1BX1NUQVRFX1JFU0VUICAgICAgICAgICAgID0gMHgwMFUsICAvKiE8IERNQSBub3QgeWV0IGluaXRpYWxpemVkIG9yIGRpc2FibGVkICovICAKKyAgSEFMX0RNQV9TVEFURV9SRUFEWSAgICAgICAgICAgICA9IDB4MDFVLCAgLyohPCBETUEgaW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UgICAqLworICBIQUxfRE1BX1NUQVRFX0JVU1kgICAgICAgICAgICAgID0gMHgwMlUsICAvKiE8IERNQSBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICAgICovICAgICAKKyAgSEFMX0RNQV9TVEFURV9USU1FT1VUICAgICAgICAgICA9IDB4MDMgICAvKiE8IERNQSB0aW1lb3V0IHN0YXRlICAgICAgICAgICAgICAgICAgICovICAKK31IQUxfRE1BX1N0YXRlVHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiAgSEFMIERNQSBFcnJvciBDb2RlIHN0cnVjdHVyZSBkZWZpbml0aW9uICAKKyAgKi8gCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX0RNQV9GVUxMX1RSQU5TRkVSICAgICAgPSAweDAwVSwgICAgLyohPCBGdWxsIHRyYW5zZmVyICAgICAqLworICBIQUxfRE1BX0hBTEZfVFJBTlNGRVIgICAgICA9IDB4MDEgICAgIC8qITwgSGFsZiBUcmFuc2ZlciAgICAgKi8KK31IQUxfRE1BX0xldmVsQ29tcGxldGVUeXBlRGVmOyAgICAgIAorCisvKiogCisgICogQGJyaWVmICBIQUwgRE1BIENhbGxiYWNrIElEIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX0RNQV9YRkVSX0NQTFRfQ0JfSUQgICAgICAgICAgPSAweDAwVSwgICAgLyohPCBGdWxsIHRyYW5zZmVyICAgICAqLworICBIQUxfRE1BX1hGRVJfSEFMRkNQTFRfQ0JfSUQgICAgICA9IDB4MDFVLCAgICAvKiE8IEhhbGYgdHJhbnNmZXIgICAgICovCisgIEhBTF9ETUFfWEZFUl9FUlJPUl9DQl9JRCAgICAgICAgID0gMHgwMlUsICAgIC8qITwgRXJyb3IgICAgICAgICAgICAgKi8gCisgIEhBTF9ETUFfWEZFUl9BQk9SVF9DQl9JRCAgICAgICAgID0gMHgwM1UsICAgIC8qITwgQWJvcnQgICAgICAgICAgICAgKi8gCisgIEhBTF9ETUFfWEZFUl9BTExfQ0JfSUQgICAgICAgICAgID0gMHgwNCAgICAgLyohPCBBbGwgICAgICAgICAgICAgICAqLyAKK31IQUxfRE1BX0NhbGxiYWNrSURUeXBlRGVmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKy8qKiAKKyAgKiBAYnJpZWYgIERNQSBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24gIAorICAqLyAKK3R5cGVkZWYgc3RydWN0IF9fRE1BX0hhbmRsZVR5cGVEZWYKK3sgIAorICBETUFfQ2hhbm5lbF9UeXBlRGVmICAgKkluc3RhbmNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAgICAgICAgICAgICAgICAgICovCisgIAorICBETUFfSW5pdFR5cGVEZWYgICAgICAgSW5pdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERNQSBjb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICovIAorICAKKyAgSEFMX0xvY2tUeXBlRGVmICAgICAgIExvY2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBETUEgbG9ja2luZyBvYmplY3QgICAgICAgICAgICAgICAgICAgICAqLyAgCisgIAorICBIQUxfRE1BX1N0YXRlVHlwZURlZiAgU3RhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERNQSB0cmFuc2ZlciBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICovCisgIAorICB2b2lkICAgICAgICAgICAgICAgICAgKlBhcmVudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBhcmVudCBvYmplY3Qgc3RhdGUgICAgICAgICAgICAgICAgICAgICovICAKKyAgCisgIHZvaWQgICAgICAgICAgICAgICAgICAoKiBYZmVyQ3BsdENhbGxiYWNrKSggc3RydWN0IF9fRE1BX0hhbmRsZVR5cGVEZWYgKiBoZG1hKTsgICAgIC8qITwgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICAgICAgICAgKi8KKyAgCisgIHZvaWQgICAgICAgICAgICAgICAgICAoKiBYZmVySGFsZkNwbHRDYWxsYmFjaykoIHN0cnVjdCBfX0RNQV9IYW5kbGVUeXBlRGVmICogaGRtYSk7IC8qITwgRE1BIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgICAgKi8KKyAgCisgIHZvaWQgICAgICAgICAgICAgICAgICAoKiBYZmVyRXJyb3JDYWxsYmFjaykoIHN0cnVjdCBfX0RNQV9IYW5kbGVUeXBlRGVmICogaGRtYSk7ICAgIC8qITwgRE1BIHRyYW5zZmVyIGVycm9yIGNhbGxiYWNrICAgICAgICAgICAgKi8KKyAgCisgIHZvaWQgICAgICAgICAgICAgICAgICAoKiBYZmVyQWJvcnRDYWxsYmFjaykoIHN0cnVjdCBfX0RNQV9IYW5kbGVUeXBlRGVmICogaGRtYSk7ICAgIC8qITwgRE1BIHRyYW5zZmVyIGFib3J0IGNhbGxiYWNrICAgICAgICAgICAgKi8gIAorICAKKyAgX19JTyB1aW50MzJfdCAgICAgICAgIEVycm9yQ29kZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBETUEgRXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAKKyAgRE1BX1R5cGVEZWYgICAgICAgICAgKkRtYUJhc2VBZGRyZXNzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBETUEgQ2hhbm5lbCBCYXNlIEFkZHJlc3MgICAgICAgICAgICAgICAqLworICAKKyAgdWludDMyX3QgICAgICAgICAgICAgIENoYW5uZWxJbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBETUEgQ2hhbm5lbCBJbmRleCAgICAgICAgICAgICAgICAgICAgICAqLworfSBETUFfSGFuZGxlVHlwZURlZjsgICAgCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIERNQV9FeHBvcnRlZF9Db25zdGFudHMgRE1BIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0Vycm9yX0NvZGUgRE1BIEVycm9yIENvZGUKKyAgKiBAeworICAqLyAKKyNkZWZpbmUgSEFMX0RNQV9FUlJPUl9OT05FICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgLyohPCBObyBlcnJvciAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfRE1BX0VSUk9SX1RFICAgICAgICAgICAgKDB4MDAwMDAwMDFVKSAgICAvKiE8IFRyYW5zZmVyIGVycm9yICAgICAgICovCisjZGVmaW5lIEhBTF9ETUFfRVJST1JfTk9fWEZFUiAgICAgICAoMHgwMDAwMDAwNFUpICAgIC8qITwgbm8gb25nb2luIHRyYW5zZmVyICAgKi8KKyNkZWZpbmUgSEFMX0RNQV9FUlJPUl9USU1FT1VUICAgICAgICgweDAwMDAwMDIwVSkgICAgLyohPCBUaW1lb3V0IGVycm9yICAgICAgICAqLworI2RlZmluZSBIQUxfRE1BX0VSUk9SX05PVF9TVVBQT1JURUQgKDB4MDAwMDAxMDBVKSAgICAvKiE8IE5vdCBzdXBwb3J0ZWQgbW9kZSAqLyAgICAgCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9EYXRhX3RyYW5zZmVyX2RpcmVjdGlvbiBETUEgRGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24KKyAgKiBAeworICAqLyAKKyNkZWZpbmUgRE1BX1BFUklQSF9UT19NRU1PUlkgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAvKiE8IFBlcmlwaGVyYWwgdG8gbWVtb3J5IGRpcmVjdGlvbiAqLworI2RlZmluZSBETUFfTUVNT1JZX1RPX1BFUklQSCAgICAgICAgICgodWludDMyX3QpRE1BX0NDUl9ESVIpICAgICAgIC8qITwgTWVtb3J5IHRvIHBlcmlwaGVyYWwgZGlyZWN0aW9uICovCisjZGVmaW5lIERNQV9NRU1PUllfVE9fTUVNT1JZICAgICAgICAgKCh1aW50MzJfdClETUFfQ0NSX01FTTJNRU0pICAgLyohPCBNZW1vcnkgdG8gbWVtb3J5IGRpcmVjdGlvbiAgICAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIERNQV9QZXJpcGhlcmFsX2luY3JlbWVudGVkX21vZGUgRE1BIFBlcmlwaGVyYWwgaW5jcmVtZW50ZWQgbW9kZQorICAqIEB7CisgICovIAorI2RlZmluZSBETUFfUElOQ19FTkFCTEUgICAgICAgICgodWludDMyX3QpRE1BX0NDUl9QSU5DKSAgLyohPCBQZXJpcGhlcmFsIGluY3JlbWVudCBtb2RlIEVuYWJsZSAqLworI2RlZmluZSBETUFfUElOQ19ESVNBQkxFICAgICAgICgweDAwMDAwMDAwVSkgICAgLyohPCBQZXJpcGhlcmFsIGluY3JlbWVudCBtb2RlIERpc2FibGUgKi8KKy8qKgorICAqIEB9CisgICovIAorCisvKiogQGRlZmdyb3VwIERNQV9NZW1vcnlfaW5jcmVtZW50ZWRfbW9kZSBETUEgTWVtb3J5IGluY3JlbWVudGVkIG1vZGUKKyAgKiBAeworICAqLyAKKyNkZWZpbmUgRE1BX01JTkNfRU5BQkxFICAgICAgICAgKCh1aW50MzJfdClETUFfQ0NSX01JTkMpICAvKiE8IE1lbW9yeSBpbmNyZW1lbnQgbW9kZSBFbmFibGUgICovCisjZGVmaW5lIERNQV9NSU5DX0RJU0FCTEUgICAgICAgICgweDAwMDAwMDAwVSkgICAgLyohPCBNZW1vcnkgaW5jcmVtZW50IG1vZGUgRGlzYWJsZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfUGVyaXBoZXJhbF9kYXRhX3NpemUgRE1BIFBlcmlwaGVyYWwgZGF0YSBzaXplCisgICogQHsKKyAgKi8gCisjZGVmaW5lIERNQV9QREFUQUFMSUdOX0JZVEUgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAvKiE8IFBlcmlwaGVyYWwgZGF0YSBhbGlnbm1lbnQgOiBCeXRlICAgICAqLworI2RlZmluZSBETUFfUERBVEFBTElHTl9IQUxGV09SRCAgICAgICgodWludDMyX3QpRE1BX0NDUl9QU0laRV8wKSAgLyohPCBQZXJpcGhlcmFsIGRhdGEgYWxpZ25tZW50IDogSGFsZldvcmQgKi8KKyNkZWZpbmUgRE1BX1BEQVRBQUxJR05fV09SRCAgICAgICAgICAoKHVpbnQzMl90KURNQV9DQ1JfUFNJWkVfMSkgIC8qITwgUGVyaXBoZXJhbCBkYXRhIGFsaWdubWVudCA6IFdvcmQgICAgICovCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqIEBkZWZncm91cCBETUFfTWVtb3J5X2RhdGFfc2l6ZSBETUEgTWVtb3J5IGRhdGEgc2l6ZQorICAqIEB7IAorICAqLworI2RlZmluZSBETUFfTURBVEFBTElHTl9CWVRFICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgLyohPCBNZW1vcnkgZGF0YSBhbGlnbm1lbnQgOiBCeXRlICAgICAqLworI2RlZmluZSBETUFfTURBVEFBTElHTl9IQUxGV09SRCAgICAgICgodWludDMyX3QpRE1BX0NDUl9NU0laRV8wKSAgLyohPCBNZW1vcnkgZGF0YSBhbGlnbm1lbnQgOiBIYWxmV29yZCAqLworI2RlZmluZSBETUFfTURBVEFBTElHTl9XT1JEICAgICAgICAgICgodWludDMyX3QpRE1BX0NDUl9NU0laRV8xKSAgLyohPCBNZW1vcnkgZGF0YSBhbGlnbm1lbnQgOiBXb3JkICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfbW9kZSBETUEgbW9kZQorICAqIEB7CisgICovIAorI2RlZmluZSBETUFfTk9STUFMICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgIC8qITwgTm9ybWFsIE1vZGUgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBETUFfQ0lSQ1VMQVIgICAgICAgKCh1aW50MzJfdClETUFfQ0NSX0NJUkMpICAgIC8qITwgQ2lyY3VsYXIgTW9kZSAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfUHJpb3JpdHlfbGV2ZWwgRE1BIFByaW9yaXR5IGxldmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgRE1BX1BSSU9SSVRZX0xPVyAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgIC8qITwgUHJpb3JpdHkgbGV2ZWwgOiBMb3cgICAgICAgKi8KKyNkZWZpbmUgRE1BX1BSSU9SSVRZX01FRElVTSAgICAgICAgICAoKHVpbnQzMl90KURNQV9DQ1JfUExfMCkgIC8qITwgUHJpb3JpdHkgbGV2ZWwgOiBNZWRpdW0gICAgKi8KKyNkZWZpbmUgRE1BX1BSSU9SSVRZX0hJR0ggICAgICAgICAgICAoKHVpbnQzMl90KURNQV9DQ1JfUExfMSkgIC8qITwgUHJpb3JpdHkgbGV2ZWwgOiBIaWdoICAgICAgKi8KKyNkZWZpbmUgRE1BX1BSSU9SSVRZX1ZFUllfSElHSCAgICAgICAoKHVpbnQzMl90KURNQV9DQ1JfUEwpICAgIC8qITwgUHJpb3JpdHkgbGV2ZWwgOiBWZXJ5X0hpZ2ggKi8KKy8qKgorICAqIEB9CisgICovIAorCisKKy8qKiBAZGVmZ3JvdXAgRE1BX2ludGVycnVwdF9lbmFibGVfZGVmaW5pdGlvbnMgRE1BIGludGVycnVwdCBlbmFibGUgZGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBETUFfSVRfVEMgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClETUFfQ0NSX1RDSUUpCisjZGVmaW5lIERNQV9JVF9IVCAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KURNQV9DQ1JfSFRJRSkKKyNkZWZpbmUgRE1BX0lUX1RFICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpRE1BX0NDUl9URUlFKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfZmxhZ19kZWZpbml0aW9ucyBETUEgZmxhZyBkZWZpbml0aW9ucworICAqIEB7CisgICovIAorI2RlZmluZSBETUFfRkxBR19HTDEgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDFVKQorI2RlZmluZSBETUFfRkxBR19UQzEgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDJVKQorI2RlZmluZSBETUFfRkxBR19IVDEgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDRVKQorI2RlZmluZSBETUFfRkxBR19URTEgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDhVKQorI2RlZmluZSBETUFfRkxBR19HTDIgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMTBVKQorI2RlZmluZSBETUFfRkxBR19UQzIgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMjBVKQorI2RlZmluZSBETUFfRkxBR19IVDIgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwNDBVKQorI2RlZmluZSBETUFfRkxBR19URTIgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwODBVKQorI2RlZmluZSBETUFfRkxBR19HTDMgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAxMDBVKQorI2RlZmluZSBETUFfRkxBR19UQzMgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAyMDBVKQorI2RlZmluZSBETUFfRkxBR19IVDMgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDA0MDBVKQorI2RlZmluZSBETUFfRkxBR19URTMgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDA4MDBVKQorI2RlZmluZSBETUFfRkxBR19HTDQgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDEwMDBVKQorI2RlZmluZSBETUFfRkxBR19UQzQgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDIwMDBVKQorI2RlZmluZSBETUFfRkxBR19IVDQgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDQwMDBVKQorI2RlZmluZSBETUFfRkxBR19URTQgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDgwMDBVKQorI2RlZmluZSBETUFfRkxBR19HTDUgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMTAwMDBVKQorI2RlZmluZSBETUFfRkxBR19UQzUgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMjAwMDBVKQorI2RlZmluZSBETUFfRkxBR19IVDUgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwNDAwMDBVKQorI2RlZmluZSBETUFfRkxBR19URTUgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwODAwMDBVKQorI2RlZmluZSBETUFfRkxBR19HTDYgICAgICAgICAgICAgICAgICAgICAgKDB4MDAxMDAwMDBVKQorI2RlZmluZSBETUFfRkxBR19UQzYgICAgICAgICAgICAgICAgICAgICAgKDB4MDAyMDAwMDBVKQorI2RlZmluZSBETUFfRkxBR19IVDYgICAgICAgICAgICAgICAgICAgICAgKDB4MDA0MDAwMDBVKQorI2RlZmluZSBETUFfRkxBR19URTYgICAgICAgICAgICAgICAgICAgICAgKDB4MDA4MDAwMDBVKQorI2RlZmluZSBETUFfRkxBR19HTDcgICAgICAgICAgICAgICAgICAgICAgKDB4MDEwMDAwMDBVKQorI2RlZmluZSBETUFfRkxBR19UQzcgICAgICAgICAgICAgICAgICAgICAgKDB4MDIwMDAwMDBVKQorI2RlZmluZSBETUFfRkxBR19IVDcgICAgICAgICAgICAgICAgICAgICAgKDB4MDQwMDAwMDBVKQorI2RlZmluZSBETUFfRkxBR19URTcgICAgICAgICAgICAgICAgICAgICAgKDB4MDgwMDAwMDBVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBETUFfRXhwb3J0ZWRfTWFjcm9zIERNQSBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmICBSZXNldCBETUEgaGFuZGxlIHN0YXRlCisgICogQHBhcmFtICBfX0hBTkRMRV9fIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0RNQV9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfRE1BX1NUQVRFX1JFU0VUKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBETUEgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0RNQV9FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IgfD0gRE1BX0NDUl9FTikKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIERNQSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfRE1BX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUiAmPSB+RE1BX0NDUl9FTikKKworCisvKiBJbnRlcnJ1cHQgJiBGbGFnIG1hbmFnZW1lbnQgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGVzIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwgaW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gRE1BIGhhbmRsZQorICAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgRE1BIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuIAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERNQV9JVF9UQzogIFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBtYXNrCisgICogICAgICAgICAgICBAYXJnIERNQV9JVF9IVDogIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IG1hc2sKKyAgKiAgICAgICAgICAgIEBhcmcgRE1BX0lUX1RFOiAgVHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0IG1hc2sKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfRE1BX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IgfD0gKF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGVzIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwgaW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gRE1BIGhhbmRsZQorICAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgRE1BIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuIAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERNQV9JVF9UQzogIFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBtYXNrCisgICogICAgICAgICAgICBAYXJnIERNQV9JVF9IVDogIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IG1hc2sKKyAgKiAgICAgICAgICAgIEBhcmcgRE1BX0lUX1RFOiAgVHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0IG1hc2sKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfRE1BX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IgJj0gfihfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsIGludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBETUEgaGFuZGxlCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgRE1BIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgRE1BX0lUX1RDOiAgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IG1hc2sKKyAgKiAgICAgICAgICAgIEBhcmcgRE1BX0lUX0hUOiAgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgbWFzaworICAqICAgICAgICAgICAgQGFyZyBETUFfSVRfVEU6ICBUcmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQgbWFzaworICAqIEByZXR2YWwgVGhlIHN0YXRlIG9mIERNQV9JVCAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfRE1BX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSICYgKF9fSU5URVJSVVBUX18pKSkKKworLyoqCisgICogQGJyaWVmICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGRhdGEgdW5pdHMgaW4gdGhlIGN1cnJlbnQgRE1BeSBDaGFubmVseCB0cmFuc2Zlci4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gRE1BIGhhbmRsZQorICAqICAgCisgICogQHJldHZhbCBUaGUgbnVtYmVyIG9mIHJlbWFpbmluZyBkYXRhIHVuaXRzIGluIHRoZSBjdXJyZW50IERNQSBDaGFubmVsIHRyYW5zZmVyLgorICAqLworI2RlZmluZSBfX0hBTF9ETUFfR0VUX0NPVU5URVIoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNORFRSKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIERNQSBIQUwgRXh0ZW5kZWQgbW9kdWxlICovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9kbWFfZXguaCIgICAKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBETUFfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIERNQV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgCisgICogQHsKKyAgKi8KKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX0luaXQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9EZUluaXQgKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBETUFfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbiBmdW5jdGlvbnMgCisgICogQHsKKyAgKi8KKy8qIElucHV0IGFuZCBPdXRwdXQgb3BlcmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfU3RhcnQgKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCB1aW50MzJfdCBTcmNBZGRyZXNzLCB1aW50MzJfdCBEc3RBZGRyZXNzLCB1aW50MzJfdCBEYXRhTGVuZ3RoKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfU3RhcnRfSVQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsIHVpbnQzMl90IFNyY0FkZHJlc3MsIHVpbnQzMl90IERzdEFkZHJlc3MsIHVpbnQzMl90IERhdGFMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9BYm9ydChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX0Fib3J0X0lUKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfUG9sbEZvclRyYW5zZmVyKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCB1aW50MzJfdCBDb21wbGV0ZUxldmVsLCB1aW50MzJfdCBUaW1lb3V0KTsKK3ZvaWQgSEFMX0RNQV9JUlFIYW5kbGVyKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfUmVnaXN0ZXJDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSwgSEFMX0RNQV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCB2b2lkICgqIHBDYWxsYmFjaykoIERNQV9IYW5kbGVUeXBlRGVmICogX2hkbWEpKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfVW5SZWdpc3RlckNhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCBIQUxfRE1BX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIERNQV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfRE1BX1N0YXRlVHlwZURlZiBIQUxfRE1BX0dldFN0YXRlKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3VpbnQzMl90ICAgICAgICAgICAgIEhBTF9ETUFfR2V0RXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIERNQV9Qcml2YXRlX01hY3JvcyBETUEgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAYnJpZWYgICAgRE1BIHByaXZhdGUgbWFjcm9zIAorICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfRE1BX0JVRkZFUl9TSVpFKFNJWkUpICgoKFNJWkUpID49IDB4MVUpICYmICgoU0laRSkgPCAweDEwMDAwVSkpCisKKyNkZWZpbmUgSVNfRE1BX0RJUkVDVElPTihESVJFQ1RJT04pICgoKERJUkVDVElPTikgPT0gRE1BX1BFUklQSF9UT19NRU1PUlkgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChESVJFQ1RJT04pID09IERNQV9NRU1PUllfVE9fUEVSSVBIKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRElSRUNUSU9OKSA9PSBETUFfTUVNT1JZX1RPX01FTU9SWSkpIAorCisjZGVmaW5lIElTX0RNQV9QRVJJUEhFUkFMX0lOQ19TVEFURShTVEFURSkgKCgoU1RBVEUpID09IERNQV9QSU5DX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQVRFKSA9PSBETUFfUElOQ19ESVNBQkxFKSkKKwkJCQkJCQkJCQkJCisjZGVmaW5lIElTX0RNQV9NRU1PUllfSU5DX1NUQVRFKFNUQVRFKSAoKChTVEFURSkgPT0gRE1BX01JTkNfRU5BQkxFKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RBVEUpID09IERNQV9NSU5DX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX0RNQV9QRVJJUEhFUkFMX0RBVEFfU0laRShTSVpFKSAoKChTSVpFKSA9PSBETUFfUERBVEFBTElHTl9CWVRFKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gRE1BX1BEQVRBQUxJR05fSEFMRldPUkQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IERNQV9QREFUQUFMSUdOX1dPUkQpKQorCisjZGVmaW5lIElTX0RNQV9NRU1PUllfREFUQV9TSVpFKFNJWkUpICgoKFNJWkUpID09IERNQV9NREFUQUFMSUdOX0JZVEUpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IERNQV9NREFUQUFMSUdOX0hBTEZXT1JEKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IERNQV9NREFUQUFMSUdOX1dPUkQgKSkKKworI2RlZmluZSBJU19ETUFfTU9ERShNT0RFKSAoKChNT0RFKSA9PSBETUFfTk9STUFMICkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gRE1BX0NJUkNVTEFSKSkgCisKKyNkZWZpbmUgSVNfRE1BX1BSSU9SSVRZKFBSSU9SSVRZKSAoKChQUklPUklUWSkgPT0gRE1BX1BSSU9SSVRZX0xPVyApICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBSSU9SSVRZKSA9PSBETUFfUFJJT1JJVFlfTUVESVVNKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUFJJT1JJVFkpID09IERNQV9QUklPUklUWV9ISUdIKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQUklPUklUWSkgPT0gRE1BX1BSSU9SSVRZX1ZFUllfSElHSCkpIAorCisvKioKKyAgKiBAfQorICAqLyAKKworCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJGM3h4X0hBTF9ETUFfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjN4eF9oYWxfZG1hX2V4LmggYi9JbmMvc3RtMzJmM3h4X2hhbF9kbWFfZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDllYzEzCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjN4eF9oYWxfZG1hX2V4LmgKQEAgLTAsMCArMSwyOTAgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX2RtYV9leC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBETUEgSEFMIGV4dGVuc2lvbiBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLyAKKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkYzeHhfSEFMX0RNQV9FWF9ICisjZGVmaW5lIF9fU1RNMzJGM3h4X0hBTF9ETUFfRVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBETUFFeAorICAqIEB7CisgICovIAorCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBETUFFeF9FeHBvcnRlZF9NYWNyb3MgRE1BIEV4dGVuZGVkIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisvKiBJbnRlcnJ1cHQgJiBGbGFnIG1hbmFnZW1lbnQgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyB0aGUgY3VycmVudCBETUEgQ2hhbm5lbCB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBETUEgaGFuZGxlCisgICogQHJldHZhbCBUaGUgc3BlY2lmaWVkIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgaW5kZXguCisgICovCisjZGVmaW5lIF9fSEFMX0RNQV9HRVRfVENfRkxBR19JTkRFWChfX0hBTkRMRV9fKSBcCisoKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwxKSk/IERNQV9GTEFHX1RDMSA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMikpPyBETUFfRkxBR19UQzIgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDMpKT8gRE1BX0ZMQUdfVEMzIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw0KSk/IERNQV9GTEFHX1RDNCA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNSkpPyBETUFfRkxBR19UQzUgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDYpKT8gRE1BX0ZMQUdfVEM2IDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw3KSk/IERNQV9GTEFHX1RDNyA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsMSkpPyBETUFfRkxBR19UQzEgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDIpKT8gRE1BX0ZMQUdfVEMyIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwzKSk/IERNQV9GTEFHX1RDMyA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsNCkpPyBETUFfRkxBR19UQzQgOlwKKyAgIERNQV9GTEFHX1RDNSkKKworLyoqCisgICogQGJyaWVmICBSZXR1cm5zIHRoZSBjdXJyZW50IERNQSBDaGFubmVsIGhhbGYgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gRE1BIGhhbmRsZQorICAqIEByZXR2YWwgVGhlIHNwZWNpZmllZCBoYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgaW5kZXguCisgICovICAgICAgCisjZGVmaW5lIF9fSEFMX0RNQV9HRVRfSFRfRkxBR19JTkRFWChfX0hBTkRMRV9fKVwKKygoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDEpKT8gRE1BX0ZMQUdfSFQxIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwyKSk/IERNQV9GTEFHX0hUMiA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMykpPyBETUFfRkxBR19IVDMgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDQpKT8gRE1BX0ZMQUdfSFQ0IDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw1KSk/IERNQV9GTEFHX0hUNSA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNikpPyBETUFfRkxBR19IVDYgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDcpKT8gRE1BX0ZMQUdfSFQ3IDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwxKSk/IERNQV9GTEFHX0hUMSA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsMikpPyBETUFfRkxBR19IVDIgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDMpKT8gRE1BX0ZMQUdfSFQzIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw0KSk/IERNQV9GTEFHX0hUNCA6XAorICAgRE1BX0ZMQUdfSFQ1KQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgdGhlIGN1cnJlbnQgRE1BIENoYW5uZWwgdHJhbnNmZXIgZXJyb3IgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gRE1BIGhhbmRsZQorICAqIEByZXR2YWwgVGhlIHNwZWNpZmllZCB0cmFuc2ZlciBlcnJvciBmbGFnIGluZGV4LgorICAqLworI2RlZmluZSBfX0hBTF9ETUFfR0VUX1RFX0ZMQUdfSU5ERVgoX19IQU5ETEVfXylcCisoKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwxKSk/IERNQV9GTEFHX1RFMSA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMikpPyBETUFfRkxBR19URTIgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDMpKT8gRE1BX0ZMQUdfVEUzIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw0KSk/IERNQV9GTEFHX1RFNCA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNSkpPyBETUFfRkxBR19URTUgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDYpKT8gRE1BX0ZMQUdfVEU2IDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw3KSk/IERNQV9GTEFHX1RFNyA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsMSkpPyBETUFfRkxBR19URTEgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDIpKT8gRE1BX0ZMQUdfVEUyIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwzKSk/IERNQV9GTEFHX1RFMyA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsNCkpPyBETUFfRkxBR19URTQgOlwKKyAgIERNQV9GTEFHX1RFNSkKKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIGN1cnJlbnQgRE1BIENoYW5uZWwgR2xvYmFsIGludGVycnVwdCBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBETUEgaGFuZGxlCisgICogQHJldHZhbCBUaGUgc3BlY2lmaWVkIHRyYW5zZmVyIGVycm9yIGZsYWcgaW5kZXguCisgICovCisjZGVmaW5lIF9fSEFMX0RNQV9HRVRfR0lfRkxBR19JTkRFWChfX0hBTkRMRV9fKVwKKygoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDEpKT8gRE1BX0ZMQUdfR0wxIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwyKSk/IERNQV9GTEFHX0dMMiA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMykpPyBETUFfRkxBR19HTDMgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDQpKT8gRE1BX0ZMQUdfR0w0IDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw1KSk/IERNQV9GTEFHX0dMNSA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNikpPyBETUFfRkxBR19HTDYgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDcpKT8gRE1BX0ZMQUdfR0w3IDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwxKSk/IERNQV9GTEFHX0dMMSA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsMikpPyBETUFfRkxBR19HTDIgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDMpKT8gRE1BX0ZMQUdfR0wzIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw0KSk/IERNQV9GTEFHX0dMNCA6XAorICAgRE1BX0ZMQUdfR0w1KQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgRE1BIENoYW5uZWwgcGVuZGluZyBmbGFncy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gRE1BIGhhbmRsZQorICAqIEBwYXJhbSAgX19GTEFHX18gR2V0IHRoZSBzcGVjaWZpZWQgZmxhZy4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBETUFfRkxBR19UQ3g6ICBUcmFuc2ZlciBjb21wbGV0ZSBmbGFnCisgICogICAgICAgICAgICBAYXJnIERNQV9GTEFHX0hUeDogIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBETUFfRkxBR19URXg6ICBUcmFuc2ZlciBlcnJvciBmbGFnCisgICogICAgICAgICBXaGVyZSB4IGNhbiBiZSAxXzcgb3IgMV81IChkZXBlbmRpbmcgb24gRE1BMSBvciBETUEyKSB0byBzZWxlY3QgdGhlIERNQSBDaGFubmVsIGZsYWcuICAgCisgICogQHJldHZhbCBUaGUgc3RhdGUgb2YgRkxBRyAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfRE1BX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKVwKKygoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA+ICh1aW50MzJfdClETUExX0NoYW5uZWw3KT8gKERNQTItPklTUiAmIChfX0ZMQUdfXykpIDpcCisgIChETUExLT5JU1IgJiAoX19GTEFHX18pKSkKKworLyoqCisgICogQGJyaWVmICBDbGVhcnMgdGhlIERNQSBDaGFubmVsIHBlbmRpbmcgZmxhZ3MuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIERNQSBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBETUFfRkxBR19UQ3g6ICBUcmFuc2ZlciBjb21wbGV0ZSBmbGFnCisgICogICAgICAgICAgICBAYXJnIERNQV9GTEFHX0hUeDogIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBETUFfRkxBR19URXg6ICBUcmFuc2ZlciBlcnJvciBmbGFnCisgICogICAgICAgICBXaGVyZSB4IGNhbiBiZSAxXzcgb3IgMV81IChkZXBlbmRpbmcgb24gRE1BMSBvciBETUEyKSB0byBzZWxlY3QgdGhlIERNQSBDaGFubmVsIGZsYWcuICAgCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0RNQV9DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSBcCisoKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPiAodWludDMyX3QpRE1BMV9DaGFubmVsNyk/IChETUEyLT5JRkNSID0gKF9fRkxBR19fKSkgOlwKKyAgKERNQTEtPklGQ1IgPSAoX19GTEFHX18pKSkKKworLyoqCisgICogQH0KKyAgKi8KKworI2Vsc2UgLyogU1RNMzJGMzAxeDhfU1RNMzJGMzAyeDhfU1RNMzJGMzE4eHhfU1RNMzJGMzAzeDhfU1RNMzJGMzM0eDhfU1RNMzJGMzI4eHggUHJvZHVjdCBkZXZpY2VzICovCisvKiogQGRlZmdyb3VwIERNQV9Mb3dfZGVuc2l0eV9NZWRpdW1fZGVuc2l0eV9Qcm9kdWN0X2RldmljZXMgRE1BIExvdyBkZW5zaXR5IGFuZCBNZWRpdW0gZGVuc2l0eSBwcm9kdWN0IGRldmljZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgdGhlIGN1cnJlbnQgRE1BIENoYW5uZWwgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gRE1BIGhhbmRsZQorICAqIEByZXR2YWwgVGhlIHNwZWNpZmllZCB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnIGluZGV4LgorICAqLworI2RlZmluZSBfX0hBTF9ETUFfR0VUX1RDX0ZMQUdfSU5ERVgoX19IQU5ETEVfXykgXAorKCgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMSkpPyBETUFfRkxBR19UQzEgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIpKT8gRE1BX0ZMQUdfVEMyIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwzKSk/IERNQV9GTEFHX1RDMyA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNCkpPyBETUFfRkxBR19UQzQgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDUpKT8gRE1BX0ZMQUdfVEM1IDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw2KSk/IERNQV9GTEFHX1RDNiA6XAorICAgRE1BX0ZMQUdfVEM3KQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgdGhlIGN1cnJlbnQgRE1BIENoYW5uZWwgaGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBETUEgaGFuZGxlCisgICogQHJldHZhbCBUaGUgc3BlY2lmaWVkIGhhbGYgdHJhbnNmZXIgY29tcGxldGUgZmxhZyBpbmRleC4KKyAgKi8gICAgICAKKyNkZWZpbmUgX19IQUxfRE1BX0dFVF9IVF9GTEFHX0lOREVYKF9fSEFORExFX18pXAorKCgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMSkpPyBETUFfRkxBR19IVDEgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIpKT8gRE1BX0ZMQUdfSFQyIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwzKSk/IERNQV9GTEFHX0hUMyA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNCkpPyBETUFfRkxBR19IVDQgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDUpKT8gRE1BX0ZMQUdfSFQ1IDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw2KSk/IERNQV9GTEFHX0hUNiA6XAorICAgRE1BX0ZMQUdfSFQ3KQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgdGhlIGN1cnJlbnQgRE1BIENoYW5uZWwgdHJhbnNmZXIgZXJyb3IgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gRE1BIGhhbmRsZQorICAqIEByZXR2YWwgVGhlIHNwZWNpZmllZCB0cmFuc2ZlciBlcnJvciBmbGFnIGluZGV4LgorICAqLworI2RlZmluZSBfX0hBTF9ETUFfR0VUX1RFX0ZMQUdfSU5ERVgoX19IQU5ETEVfXylcCisoKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwxKSk/IERNQV9GTEFHX1RFMSA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMikpPyBETUFfRkxBR19URTIgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDMpKT8gRE1BX0ZMQUdfVEUzIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw0KSk/IERNQV9GTEFHX1RFNCA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNSkpPyBETUFfRkxBR19URTUgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDYpKT8gRE1BX0ZMQUdfVEU2IDpcCisgICBETUFfRkxBR19URTcpCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBjdXJyZW50IERNQSBDaGFubmVsIEdsb2JhbCBpbnRlcnJ1cHQgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gRE1BIGhhbmRsZQorICAqIEByZXR2YWwgVGhlIHNwZWNpZmllZCB0cmFuc2ZlciBlcnJvciBmbGFnIGluZGV4LgorICAqLworI2RlZmluZSBfX0hBTF9ETUFfR0VUX0dJX0ZMQUdfSU5ERVgoX19IQU5ETEVfXylcCisoKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwxKSk/IERNQV9GTEFHX0dMMSA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMikpPyBETUFfRkxBR19HTDIgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDMpKT8gRE1BX0ZMQUdfR0wzIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw0KSk/IERNQV9GTEFHX0dMNCA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNSkpPyBETUFfRkxBR19HTDUgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDYpKT8gRE1BX0ZMQUdfR0w2IDpcCisgICBETUFfRkxBR19HTDcpCisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBETUEgQ2hhbm5lbCBwZW5kaW5nIGZsYWdzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBETUEgaGFuZGxlCisgICogQHBhcmFtICBfX0ZMQUdfXyBHZXQgdGhlIHNwZWNpZmllZCBmbGFnLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERNQV9GTEFHX1RDeDogIFRyYW5zZmVyIGNvbXBsZXRlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgRE1BX0ZMQUdfSFR4OiAgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnCisgICogICAgICAgICAgICBAYXJnIERNQV9GTEFHX1RFeDogIFRyYW5zZmVyIGVycm9yIGZsYWcKKyAgKiAgICAgICAgIFdoZXJlIHggY2FuIGJlIDFfNyB0byBzZWxlY3QgdGhlIERNQSBDaGFubmVsIGZsYWcuICAgCisgICogQHJldHZhbCBUaGUgc3RhdGUgb2YgRkxBRyAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKworI2RlZmluZSBfX0hBTF9ETUFfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgKERNQTEtPklTUiAmIChfX0ZMQUdfXykpCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXJzIHRoZSBETUEgQ2hhbm5lbCBwZW5kaW5nIGZsYWdzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBETUEgaGFuZGxlCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgRE1BX0ZMQUdfVEN4OiAgVHJhbnNmZXIgY29tcGxldGUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBETUFfRkxBR19IVHg6ICBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgRE1BX0ZMQUdfVEV4OiAgVHJhbnNmZXIgZXJyb3IgZmxhZworICAqICAgICAgICAgV2hlcmUgeCBjYW4gYmUgMV83IHRvIHNlbGVjdCB0aGUgRE1BIENoYW5uZWwgZmxhZy4gICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfRE1BX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pIChETUExLT5JRkNSID0gKF9fRkxBR19fKSkKKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmCisgIAorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8gCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAgICAgICAgICAgICAgICAgICAqLworCisjZW5kaWYgLyogX19TVE0zMkYzeHhfSEFMX0RNQV9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2hhbF9mbGFzaC5oIGIvSW5jL3N0bTMyZjN4eF9oYWxfZmxhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmE1ZTZmCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjN4eF9oYWxfZmxhc2guaApAQCAtMCwwICsxLDM5NyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfZmxhc2guaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgRmxhc2ggSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkYzeHhfSEFMX0ZMQVNIX0gKKyNkZWZpbmUgX19TVE0zMkYzeHhfSEFMX0ZMQVNIX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2RlZi5oIgorICAgCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgRkxBU0gKKyAgKiBAeworICAqLworICAKKy8qKiBAYWRkdG9ncm91cCBGTEFTSF9Qcml2YXRlX0NvbnN0YW50cworICAqIEB7CisgICovCisjZGVmaW5lIEZMQVNIX1RJTUVPVVRfVkFMVUUgICAgICAoNTAwMDBVKSAvKiA1MCBzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgRkxBU0hfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX0ZMQVNIX1RZUEVQUk9HUkFNKFZBTFVFKSAgKCgoVkFMVUUpID09IEZMQVNIX1RZUEVQUk9HUkFNX0hBTEZXT1JEKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IEZMQVNIX1RZUEVQUk9HUkFNX1dPUkQpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IEZMQVNIX1RZUEVQUk9HUkFNX0RPVUJMRVdPUkQpKSAgCisKKyNkZWZpbmUgSVNfRkxBU0hfTEFURU5DWShfX0xBVEVOQ1lfXykgKCgoX19MQVRFTkNZX18pID09IEZMQVNIX0xBVEVOQ1lfMCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xBVEVOQ1lfXykgPT0gRkxBU0hfTEFURU5DWV8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEFURU5DWV9fKSA9PSBGTEFTSF9MQVRFTkNZXzIpKQorCisvKioKKyAgKiBAfQorICAqLyAgCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorLyoqIEBkZWZncm91cCBGTEFTSF9FeHBvcnRlZF9UeXBlcyBGTEFTSCBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovICAKKworLyoqCisgICogQGJyaWVmICBGTEFTSCBQcm9jZWR1cmUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bSAKK3sKKyAgRkxBU0hfUFJPQ19OT05FICAgICAgICAgICAgICA9IDBVLCAKKyAgRkxBU0hfUFJPQ19QQUdFRVJBU0UgICAgICAgICA9IDFVLAorICBGTEFTSF9QUk9DX01BU1NFUkFTRSAgICAgICAgID0gMlUsCisgIEZMQVNIX1BST0NfUFJPR1JBTUhBTEZXT1JEICAgPSAzVSwKKyAgRkxBU0hfUFJPQ19QUk9HUkFNV09SRCAgICAgICA9IDRVLAorICBGTEFTSF9QUk9DX1BST0dSQU1ET1VCTEVXT1JEID0gNVUKK30gRkxBU0hfUHJvY2VkdXJlVHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiAgRkxBU0ggaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uICAKKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIF9fSU8gRkxBU0hfUHJvY2VkdXJlVHlwZURlZiBQcm9jZWR1cmVPbkdvaW5nOyAvKiE8IEludGVybmFsIHZhcmlhYmxlIHRvIGluZGljYXRlIHdoaWNoIHByb2NlZHVyZSBpcyBvbmdvaW5nIG9yIG5vdCBpbiBJVCBjb250ZXh0ICovCisgIAorICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICAgRGF0YVJlbWFpbmluZzsgICAgLyohPCBJbnRlcm5hbCB2YXJpYWJsZSB0byBzYXZlIHRoZSByZW1haW5pbmcgcGFnZXMgdG8gZXJhc2Ugb3IgaGFsZi13b3JkIHRvIHByb2dyYW0gaW4gSVQgY29udGV4dCAqLworCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgICBBZGRyZXNzOyAgICAgICAgICAvKiE8IEludGVybmFsIHZhcmlhYmxlIHRvIHNhdmUgYWRkcmVzcyBzZWxlY3RlZCBmb3IgcHJvZ3JhbSBvciBlcmFzZSAqLworCisgIF9fSU8gdWludDY0X3QgICAgICAgICAgICAgICBEYXRhOyAgICAgICAgICAgICAvKiE8IEludGVybmFsIHZhcmlhYmxlIHRvIHNhdmUgZGF0YSB0byBiZSBwcm9ncmFtbWVkICovCisKKyAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgICAgIExvY2s7ICAgICAgICAgICAgIC8qITwgRkxBU0ggbG9ja2luZyBvYmplY3QgICAgICAgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICAgRXJyb3JDb2RlOyAgICAgICAgLyohPCBGTEFTSCBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGTEFTSF9FcnJvcl9Db2RlcyAgKi8KK30gRkxBU0hfUHJvY2Vzc1R5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZMQVNIX0V4cG9ydGVkX0NvbnN0YW50cyBGTEFTSCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLyAgCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfRXJyb3JfQ29kZXMgRkxBU0ggRXJyb3IgQ29kZXMKKyAgKiBAeworICAqLworCisjZGVmaW5lIEhBTF9GTEFTSF9FUlJPUl9OT05FICAgICAgMHgwMFUgIC8qITwgTm8gZXJyb3IgKi8KKyNkZWZpbmUgSEFMX0ZMQVNIX0VSUk9SX1BST0cgICAgICAweDAxVSAgLyohPCBQcm9ncmFtbWluZyBlcnJvciAqLworI2RlZmluZSBIQUxfRkxBU0hfRVJST1JfV1JQICAgICAgIDB4MDJVICAvKiE8IFdyaXRlIHByb3RlY3Rpb24gZXJyb3IgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9UeXBlX1Byb2dyYW0gRkxBU0ggVHlwZSBQcm9ncmFtCisgICogQHsKKyAgKi8gCisjZGVmaW5lIEZMQVNIX1RZUEVQUk9HUkFNX0hBTEZXT1JEICAgKDB4MDFVKSAgLyohPFByb2dyYW0gYSBoYWxmLXdvcmQgKDE2LWJpdCkgYXQgYSBzcGVjaWZpZWQgYWRkcmVzcy4qLworI2RlZmluZSBGTEFTSF9UWVBFUFJPR1JBTV9XT1JEICAgICAgICgweDAyVSkgIC8qITxQcm9ncmFtIGEgd29yZCAoMzItYml0KSBhdCBhIHNwZWNpZmllZCBhZGRyZXNzLiovCisjZGVmaW5lIEZMQVNIX1RZUEVQUk9HUkFNX0RPVUJMRVdPUkQgKDB4MDNVKSAgLyohPFByb2dyYW0gYSBkb3VibGUgd29yZCAoNjQtYml0KSBhdCBhIHNwZWNpZmllZCBhZGRyZXNzKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9MYXRlbmN5IEZMQVNIIExhdGVuY3kKKyAgKiBAeworICAqLworI2RlZmluZSBGTEFTSF9MQVRFTkNZXzAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgIC8qITwgRkxBU0ggWmVybyBMYXRlbmN5IGN5Y2xlICovCisjZGVmaW5lIEZMQVNIX0xBVEVOQ1lfMSAgICAgICAgICAgIEZMQVNIX0FDUl9MQVRFTkNZXzAgICAgICAgLyohPCBGTEFTSCBPbmUgTGF0ZW5jeSBjeWNsZSAqLworI2RlZmluZSBGTEFTSF9MQVRFTkNZXzIgICAgICAgICAgICBGTEFTSF9BQ1JfTEFURU5DWV8xICAgICAgIC8qITwgRkxBU0ggVHdvIExhdGVuY3kgY3ljbGVzICovCisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBGTEFTSF9GbGFnX2RlZmluaXRpb24gRkxBU0ggRmxhZyBkZWZpbml0aW9uCisgICogQHsKKyAgKi8gCisjZGVmaW5lIEZMQVNIX0ZMQUdfQlNZICAgICAgICAgICAgIEZMQVNIX1NSX0JTWSAgICAgICAgICAgIC8qITwgRkxBU0ggQnVzeSBmbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gCisjZGVmaW5lIEZMQVNIX0ZMQUdfUEdFUlIgICAgICAgICAgIEZMQVNIX1NSX1BHRVJSICAgICAgICAgIC8qITwgRkxBU0ggUHJvZ3JhbW1pbmcgZXJyb3IgZmxhZyAgICAqLworI2RlZmluZSBGTEFTSF9GTEFHX1dSUEVSUiAgICAgICAgICBGTEFTSF9TUl9XUlBFUlIgICAgICAgICAvKiE8IEZMQVNIIFdyaXRlIHByb3RlY3RlZCBlcnJvciBmbGFnICAgICAgICAgICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfRU9QICAgICAgICAgICAgIEZMQVNIX1NSX0VPUCAgICAgICAgICAgIC8qITwgRkxBU0ggRW5kIG9mIE9wZXJhdGlvbiBmbGFnICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisgIAorLyoqIEBkZWZncm91cCBGTEFTSF9JbnRlcnJ1cHRfZGVmaW5pdGlvbiBGTEFTSCBJbnRlcnJ1cHQgZGVmaW5pdGlvbgorICAqIEB7CisgICovIAorI2RlZmluZSBGTEFTSF9JVF9FT1AgICAgICAgICAgICAgICBGTEFTSF9DUl9FT1BJRSAgICAgICAgICAvKiE8IEVuZCBvZiBGTEFTSCBPcGVyYXRpb24gSW50ZXJydXB0IHNvdXJjZSAqLworI2RlZmluZSBGTEFTSF9JVF9FUlIgICAgICAgICAgICAgICBGTEFTSF9DUl9FUlJJRSAgLyohPCBFcnJvciBJbnRlcnJ1cHQgc291cmNlICovCisvKioKKyAgKiBAfQorICAqLyAgCisKKy8qKgorICAqIEB9CisgICovICAKKyAgCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEZMQVNIX0V4cG9ydGVkX01hY3JvcyBGTEFTSCBFeHBvcnRlZCBNYWNyb3MKKyAqICBAYnJpZWYgbWFjcm9zIHRvIGNvbnRyb2wgRkxBU0ggZmVhdHVyZXMgCisgKiAgQHsKKyAqLworIAorLyoqIEBkZWZncm91cCBGTEFTSF9IYWxmX0N5Y2xlIEZMQVNIIEhhbGYgQ3ljbGUKKyAqICBAYnJpZWYgbWFjcm9zIHRvIGhhbmRsZSBGTEFTSCBoYWxmIGN5Y2xlCisgKiBAeworICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBGTEFTSCBoYWxmIGN5Y2xlIGFjY2Vzcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfRkxBU0hfSEFMRl9DWUNMRV9BQ0NFU1NfRU5BQkxFKCkgIChGTEFTSC0+QUNSIHw9IEZMQVNIX0FDUl9ITEZDWUEpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgRkxBU0ggaGFsZiBjeWNsZSBhY2Nlc3MuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0ZMQVNIX0hBTEZfQ1lDTEVfQUNDRVNTX0RJU0FCTEUoKSAoRkxBU0gtPkFDUiAmPSAofkZMQVNIX0FDUl9ITEZDWUEpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX0VNX0xhdGVuY3kgRkxBU0ggTGF0ZW5jeQorICogIEBicmllZiBtYWNyb3MgdG8gaGFuZGxlIEZMQVNIIExhdGVuY3kKKyAqIEB7CisgKi8gCisgIAorLyoqCisgICogQGJyaWVmICBTZXQgdGhlIEZMQVNIIExhdGVuY3kuCisgICogQHBhcmFtICBfX0xBVEVOQ1lfXyBGTEFTSCBMYXRlbmN5ICAgICAgICAgICAgICAgICAgIAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBGTEFTSF9MQVRFTkNZXzAgRkxBU0ggWmVybyBMYXRlbmN5IGN5Y2xlCisgICogICAgICAgICBAYXJnIEByZWYgRkxBU0hfTEFURU5DWV8xIEZMQVNIIE9uZSBMYXRlbmN5IGN5Y2xlCisgICogICAgICAgICBAYXJnIEByZWYgRkxBU0hfTEFURU5DWV8yIEZMQVNIIFR3byBMYXRlbmN5IGN5Y2xlcworICAqIEByZXR2YWwgTm9uZQorICAqLyAKKyNkZWZpbmUgX19IQUxfRkxBU0hfU0VUX0xBVEVOQ1koX19MQVRFTkNZX18pICAgIChGTEFTSC0+QUNSID0gKEZMQVNILT5BQ1ImKH5GTEFTSF9BQ1JfTEFURU5DWSkpIHwgKF9fTEFURU5DWV9fKSkKKworCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgRkxBU0ggTGF0ZW5jeS4KKyAgKiBAcmV0dmFsIEZMQVNIIExhdGVuY3kgICAgICAgICAgICAgICAgICAgCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIEZMQVNIX0xBVEVOQ1lfMCBGTEFTSCBaZXJvIExhdGVuY3kgY3ljbGUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBGTEFTSF9MQVRFTkNZXzEgRkxBU0ggT25lIExhdGVuY3kgY3ljbGUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBGTEFTSF9MQVRFTkNZXzIgRkxBU0ggVHdvIExhdGVuY3kgY3ljbGVzCisgICovIAorI2RlZmluZSBfX0hBTF9GTEFTSF9HRVRfTEFURU5DWSgpICAgICAoUkVBRF9CSVQoKEZMQVNILT5BQ1IpLCBGTEFTSF9BQ1JfTEFURU5DWSkpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfUHJlZmV0Y2ggRkxBU0ggUHJlZmV0Y2gKKyAqICBAYnJpZWYgbWFjcm9zIHRvIGhhbmRsZSBGTEFTSCBQcmVmZXRjaCBidWZmZXIKKyAqIEB7CisgKi8gICAKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBGTEFTSCBwcmVmZXRjaCBidWZmZXIuCisgICogQHJldHZhbCBOb25lCisgICovIAorI2RlZmluZSBfX0hBTF9GTEFTSF9QUkVGRVRDSF9CVUZGRVJfRU5BQkxFKCkgICAgKEZMQVNILT5BQ1IgfD0gRkxBU0hfQUNSX1BSRlRCRSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBGTEFTSCBwcmVmZXRjaCBidWZmZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0ZMQVNIX1BSRUZFVENIX0JVRkZFUl9ESVNBQkxFKCkgICAoRkxBU0gtPkFDUiAmPSAofkZMQVNIX0FDUl9QUkZUQkUpKQorCisvKioKKyAgKiBAfQorICAqLworICAKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfSW50ZXJydXB0IEZMQVNIIEludGVycnVwdHMKKyAqICBAYnJpZWYgbWFjcm9zIHRvIGhhbmRsZSBGTEFTSCBpbnRlcnJ1cHRzCisgKiBAeworICovIAorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIEZMQVNIIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gIEZMQVNIIGludGVycnVwdCAKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9JVF9FT1AgRW5kIG9mIEZMQVNIIE9wZXJhdGlvbiBJbnRlcnJ1cHQKKyAgKiAgICAgQGFyZyBAcmVmIEZMQVNIX0lUX0VSUiBFcnJvciBJbnRlcnJ1cHQgICAgCisgICogQHJldHZhbCBub25lCisgICovICAKKyNkZWZpbmUgX19IQUxfRkxBU0hfRU5BQkxFX0lUKF9fSU5URVJSVVBUX18pICBTRVRfQklUKChGTEFTSC0+Q1IpLCAoX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIEZMQVNIIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gIEZMQVNIIGludGVycnVwdCAKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9JVF9FT1AgRW5kIG9mIEZMQVNIIE9wZXJhdGlvbiBJbnRlcnJ1cHQKKyAgKiAgICAgQGFyZyBAcmVmIEZMQVNIX0lUX0VSUiBFcnJvciBJbnRlcnJ1cHQgICAgCisgICogQHJldHZhbCBub25lCisgICovICAKKyNkZWZpbmUgX19IQUxfRkxBU0hfRElTQUJMRV9JVChfX0lOVEVSUlVQVF9fKSAgQ0xFQVJfQklUKChGTEFTSC0+Q1IpLCAodWludDMyX3QpKF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgc3BlY2lmaWVkIEZMQVNIIGZsYWcgc3RhdHVzLiAKKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgRkxBU0ggZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEZMQVNIX0ZMQUdfQlNZICAgICAgICAgRkxBU0ggQnVzeSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19FT1AgICAgICAgICBGTEFTSCBFbmQgb2YgT3BlcmF0aW9uIGZsYWcgCisgICogICAgICAgICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19XUlBFUlIgICAgICBGTEFTSCBXcml0ZSBwcm90ZWN0ZWQgZXJyb3IgZmxhZyAKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX1BHRVJSICAgICAgIEZMQVNIIFByb2dyYW1taW5nIGVycm9yIGZsYWcKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19GTEFHX18gKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fSEFMX0ZMQVNIX0dFVF9GTEFHKF9fRkxBR19fKSAgICgoKEZMQVNILT5TUikgJiAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBzcGVjaWZpZWQgRkxBU0ggZmxhZy4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgRkxBU0ggZmxhZ3MgdG8gY2xlYXIuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX0VPUCAgICAgICAgIEZMQVNIIEVuZCBvZiBPcGVyYXRpb24gZmxhZyAKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX1dSUEVSUiAgICAgIEZMQVNIIFdyaXRlIHByb3RlY3RlZCBlcnJvciBmbGFnIAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEZMQVNIX0ZMQUdfUEdFUlIgICAgICAgRkxBU0ggUHJvZ3JhbW1pbmcgZXJyb3IgZmxhZworICAqIEByZXR2YWwgbm9uZQorICAqLworI2RlZmluZSBfX0hBTF9GTEFTSF9DTEVBUl9GTEFHKF9fRkxBR19fKSAgICgoRkxBU0gtPlNSKSA9IChfX0ZMQUdfXykpCisKKy8qKgorICAqIEB9CisgICovIAorCisvKioKKyAgKiBAfQorICAqLyAKKworLyogSW5jbHVkZSBGTEFTSCBIQUwgRXh0ZW5kZWQgbW9kdWxlICovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9mbGFzaF9leC5oIiAgCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgRkxBU0hfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyAgCisvKiogQGFkZHRvZ3JvdXAgRkxBU0hfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX1Byb2dyYW0odWludDMyX3QgVHlwZVByb2dyYW0sIHVpbnQzMl90IEFkZHJlc3MsIHVpbnQ2NF90IERhdGEpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX1Byb2dyYW1fSVQodWludDMyX3QgVHlwZVByb2dyYW0sIHVpbnQzMl90IEFkZHJlc3MsIHVpbnQ2NF90IERhdGEpOworCisvKiBGTEFTSCBJUlEgaGFuZGxlciBmdW5jdGlvbiAqLwordm9pZCAgICAgICBIQUxfRkxBU0hfSVJRSGFuZGxlcih2b2lkKTsKKy8qIENhbGxiYWNrcyBpbiBub24gYmxvY2tpbmcgbW9kZXMgKi8gCit2b2lkICAgICAgIEhBTF9GTEFTSF9FbmRPZk9wZXJhdGlvbkNhbGxiYWNrKHVpbnQzMl90IFJldHVyblZhbHVlKTsKK3ZvaWQgICAgICAgSEFMX0ZMQVNIX09wZXJhdGlvbkVycm9yQ2FsbGJhY2sodWludDMyX3QgUmV0dXJuVmFsdWUpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgRkxBU0hfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICAqIEB7CisgICovCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX1VubG9jayh2b2lkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSF9Mb2NrKHZvaWQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX09CX1VubG9jayh2b2lkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSF9PQl9Mb2NrKHZvaWQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX09CX0xhdW5jaCh2b2lkKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEZMQVNIX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMKKyAgKiBAeworICAqLworLyogUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IEhBTF9GTEFTSF9HZXRFcnJvcih2b2lkKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBGTEFTSF9Qcml2YXRlX0Z1bmN0aW9ucworICogQHsKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgICAgICAgRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24odWludDMyX3QgVGltZW91dCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyRjN4eF9IQUxfRkxBU0hfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLworCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2hhbF9mbGFzaF9leC5oIGIvSW5jL3N0bTMyZjN4eF9oYWxfZmxhc2hfZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDYyNTgwCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjN4eF9oYWxfZmxhc2hfZXguaApAQCAtMCwwICsxLDQ5OCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfZmxhc2hfZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgRmxhc2ggSEFMIEV4dGVuZGVkIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0hBTF9GTEFTSF9FWF9ICisjZGVmaW5lIF9fU1RNMzJGM3h4X0hBTF9GTEFTSF9FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEZMQVNIRXgKKyAgKiBAeworICAqLyAKKworLyoqIEBhZGR0b2dyb3VwIEZMQVNIRXhfUHJpdmF0ZV9Db25zdGFudHMKKyAgKiBAeworICAqLworCisjZGVmaW5lIEZMQVNIX1NJWkVfREFUQV9SRUdJU1RFUiAoMHgxRkZGRjdDQ1UpCisKKy8qKgorICAqIEB9CisgICovICAKKworLyoqIEBhZGR0b2dyb3VwIEZMQVNIRXhfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19GTEFTSF9UWVBFRVJBU0UoVkFMVUUpICgoKFZBTFVFKSA9PSBGTEFTSF9UWVBFRVJBU0VfUEFHRVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUxVRSkgPT0gRkxBU0hfVFlQRUVSQVNFX01BU1NFUkFTRSkpICAKKworI2RlZmluZSBJU19PUFRJT05CWVRFKFZBTFVFKSAoKFZBTFVFKSA8PSAoT1BUSU9OQllURV9XUlAgfCBPUFRJT05CWVRFX1JEUCB8IE9QVElPTkJZVEVfVVNFUiB8IE9QVElPTkJZVEVfREFUQSkpCisKKyNkZWZpbmUgSVNfV1JQU1RBVEUoVkFMVUUpICgoKFZBTFVFKSA9PSBPQl9XUlBTVEFURV9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUxVRSkgPT0gT0JfV1JQU1RBVEVfRU5BQkxFKSkgIAorCisjZGVmaW5lIElTX09CX0RBVEFfQUREUkVTUyhBRERSRVNTKSAoKChBRERSRVNTKSA9PSBPQl9EQVRBX0FERFJFU1NfREFUQTApIHx8ICgoQUREUkVTUykgPT0gT0JfREFUQV9BRERSRVNTX0RBVEExKSkgCisKKyNkZWZpbmUgSVNfT0JfUkRQX0xFVkVMKExFVkVMKSAgICAgKCgoTEVWRUwpID09IE9CX1JEUF9MRVZFTF8wKSAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMRVZFTCkgPT0gT0JfUkRQX0xFVkVMXzEpKS8qfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExFVkVMKSA9PSBPQl9SRFBfTEVWRUxfMikpKi8KKworI2RlZmluZSBJU19PQl9JV0RHX1NPVVJDRShTT1VSQ0UpICAoKChTT1VSQ0UpID09IE9CX0lXREdfU1cpIHx8ICgoU09VUkNFKSA9PSBPQl9JV0RHX0hXKSkKKworI2RlZmluZSBJU19PQl9TVE9QX1NPVVJDRShTT1VSQ0UpICAoKChTT1VSQ0UpID09IE9CX1NUT1BfTk9fUlNUKSB8fCAoKFNPVVJDRSkgPT0gT0JfU1RPUF9SU1QpKQorCisjZGVmaW5lIElTX09CX1NUREJZX1NPVVJDRShTT1VSQ0UpICgoKFNPVVJDRSkgPT0gT0JfU1REQllfTk9fUlNUKSB8fCAoKFNPVVJDRSkgPT0gT0JfU1REQllfUlNUKSkKKworI2RlZmluZSBJU19PQl9CT09UMShCT09UMSkgICAgICAgICAoKChCT09UMSkgPT0gT0JfQk9PVDFfUkVTRVQpIHx8ICgoQk9PVDEpID09IE9CX0JPT1QxX1NFVCkpCisKKyNkZWZpbmUgSVNfT0JfVkREQV9BTkFMT0coQU5BTE9HKSAgKCgoQU5BTE9HKSA9PSBPQl9WRERBX0FOQUxPR19PTikgfHwgKChBTkFMT0cpID09IE9CX1ZEREFfQU5BTE9HX09GRikpCisKKyNkZWZpbmUgSVNfT0JfU1JBTV9QQVJJVFkoUEFSSVRZKSAgKCgoUEFSSVRZKSA9PSBPQl9TUkFNX1BBUklUWV9TRVQpIHx8ICgoUEFSSVRZKSA9PSBPQl9TUkFNX1BBUklUWV9SRVNFVCkpCisKKworI2lmIGRlZmluZWQoRkxBU0hfT0JSX1NEQURDMTJfVkREX01PTklUT1IpCisjZGVmaW5lIElTX09CX1NEQUNEX1ZERF9NT05JVE9SKFZERF9NT05JVE9SKSAoKChWRERfTU9OSVRPUikgPT0gT0JfU0RBQ0RfVkREX01PTklUT1JfU0VUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWRERfTU9OSVRPUikgPT0gT0JfU0RBQ0RfVkREX01PTklUT1JfUkVTRVQpKQorI2VuZGlmIC8qIEZMQVNIX09CUl9TREFEQzEyX1ZERF9NT05JVE9SICovCisKKyNkZWZpbmUgSVNfT0JfV1JQKFBBR0UpICgoKFBBR0UpICE9IDB4MDAwMDAwMFUpKQorCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkgXAorIHx8IGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisjZGVmaW5lIElTX0ZMQVNIX1BST0dSQU1fQUREUkVTUyhBRERSRVNTKSAoKChBRERSRVNTKSA+PSBGTEFTSF9CQVNFKSAmJiAoKCgqKCh1aW50MTZfdCAqKUZMQVNIX1NJWkVfREFUQV9SRUdJU1RFUikpID09IDB4MTAwVSkgPyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRERSRVNTKSA8PSAweDA4MDNGRkZGVSkgOiAgKCgoKigodWludDE2X3QgKilGTEFTSF9TSVpFX0RBVEFfUkVHSVNURVIpKSA9PSAweDgwVSkgPyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRERSRVNTKSA8PSAweDA4MDFGRkZGVSkgOiAgKChBRERSRVNTKSA8PSAweDA4MDBGRkZGVSkpKSkKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KQorI2RlZmluZSBJU19GTEFTSF9QUk9HUkFNX0FERFJFU1MoQUREUkVTUykgKCgoQUREUkVTUykgPj0gRkxBU0hfQkFTRSkgJiYgKChBRERSRVNTKSA8PSAweDA4MDdGRkZGVSkpCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpIFwKKyB8fCBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KQorI2RlZmluZSBJU19GTEFTSF9QUk9HUkFNX0FERFJFU1MoQUREUkVTUykgKCgoQUREUkVTUykgPj0gRkxBU0hfQkFTRSkgJiYgKCgoKigodWludDE2X3QgKilGTEFTSF9TSVpFX0RBVEFfUkVHSVNURVIpKSA9PSAweDQwVSkgPyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRERSRVNTKSA8PSAweDA4MDBGRkZGVSkgOiAgKCgoKigodWludDE2X3QgKilGTEFTSF9TSVpFX0RBVEFfUkVHSVNURVIpKSA9PSAweDIwVSkgPyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRERSRVNTKSA8PSAweDA4MDA3RkZGVSkgOiAgKChBRERSRVNTKSA8PSAweDA4MDAzRkZGVSkpKSkKKyNlbmRpZiAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSBcCisgfHwgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKyNkZWZpbmUgSVNfRkxBU0hfTkJfUEFHRVMoQUREUkVTUyxOQlBBR0VTKSAoKCgqKCh1aW50MTZfdCAqKUZMQVNIX1NJWkVfREFUQV9SRUdJU1RFUikpID09IDB4MTAwVSkgPyAoKEFERFJFU1MpKygoTkJQQUdFUykqRkxBU0hfUEFHRV9TSVpFKS0xVSA8PSAweDA4MDNGRkZGVSkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKigodWludDE2X3QgKilGTEFTSF9TSVpFX0RBVEFfUkVHSVNURVIpKSA9PSAweDgwVSkgID8gKChBRERSRVNTKSsoKE5CUEFHRVMpKkZMQVNIX1BBR0VfU0laRSktMVUgPD0gMHgwODAxRkZGRlUpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFERFJFU1MpKygoTkJQQUdFUykqRkxBU0hfUEFHRV9TSVpFKS0xVSA8PSAweDA4MDBGRkZGVSkpKQorI2VuZGlmIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisjZGVmaW5lIElTX0ZMQVNIX05CX1BBR0VTKEFERFJFU1MsTkJQQUdFUykgKChBRERSRVNTKSsoKE5CUEFHRVMpKkZMQVNIX1BBR0VfU0laRSktMVUgPD0gMHgwODA3RkZGRlUpCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpIFwKKyB8fCBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KQorI2RlZmluZSBJU19GTEFTSF9OQl9QQUdFUyhBRERSRVNTLE5CUEFHRVMpICgoKCooKHVpbnQxNl90ICopRkxBU0hfU0laRV9EQVRBX1JFR0lTVEVSKSkgPT0gMHg0MFUpID8gKChBRERSRVNTKSsoKE5CUEFHRVMpKkZMQVNIX1BBR0VfU0laRSktMVUgPD0gMHgwODAwRkZGRlUpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKCooKHVpbnQxNl90ICopRkxBU0hfU0laRV9EQVRBX1JFR0lTVEVSKSkgPT0gMHgyMFUpID8gKChBRERSRVNTKSsoKE5CUEFHRVMpKkZMQVNIX1BBR0VfU0laRSktMVUgPD0gMHgwODAwN0ZGRlUpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFERFJFU1MpKygoTkJQQUdFUykqRkxBU0hfUEFHRV9TSVpFKS0xVSA8PSAweDA4MDAzRkZGVSkpKQorI2VuZGlmIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisvKiogQGRlZmdyb3VwIEZMQVNIRXhfRXhwb3J0ZWRfVHlwZXMgRkxBU0hFeCBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEZMQVNIIEVyYXNlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBUeXBlRXJhc2U7ICAgLyohPCBUeXBlRXJhc2U6IE1hc3MgZXJhc2Ugb3IgcGFnZSBlcmFzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGTEFTSEV4X1R5cGVfRXJhc2UgKi8KKworICB1aW50MzJfdCBQYWdlQWRkcmVzczsgLyohPCBQYWdlQWRyZXNzOiBJbml0aWFsIEZMQVNIIHBhZ2UgYWRkcmVzcyB0byBlcmFzZSB3aGVuIG1hc3MgZXJhc2UgaXMgZGlzYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gRkxBU0hfQkFTRSBhbmQgTWF4X0RhdGEgPSBGTEFTSF9CQU5LMV9FTkQgKi8KKyAgCisgIHVpbnQzMl90IE5iUGFnZXM7ICAgICAvKiE8IE5iUGFnZXM6IE51bWJlciBvZiBwYWdlc3MgdG8gYmUgZXJhc2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YSA9IDEgYW5kIE1heF9EYXRhID0gKG1heCBudW1iZXIgb2YgcGFnZXMgLSB2YWx1ZSBvZiBpbml0aWFsIHBhZ2UpKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK30gRkxBU0hfRXJhc2VJbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBGTEFTSCBPcHRpb25zIGJ5dGVzIHByb2dyYW0gc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IE9wdGlvblR5cGU7ICAvKiE8IE9wdGlvblR5cGU6IE9wdGlvbiBieXRlIHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRkxBU0hFeF9PQl9UeXBlICovCisKKyAgdWludDMyX3QgV1JQU3RhdGU7ICAgIC8qITwgV1JQU3RhdGU6IFdyaXRlIHByb3RlY3Rpb24gYWN0aXZhdGlvbiBvciBkZWFjdGl2YXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRkxBU0hFeF9PQl9XUlBfU3RhdGUgKi8KKworICB1aW50MzJfdCBXUlBQYWdlOyAgICAgLyohPCBXUlBQYWdlOiBzcGVjaWZpZXMgdGhlIHBhZ2UocykgdG8gYmUgd3JpdGUgcHJvdGVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRkxBU0hFeF9PQl9Xcml0ZV9Qcm90ZWN0aW9uICovCisKKyAgdWludDhfdCBSRFBMZXZlbDsgICAgIC8qITwgUkRQTGV2ZWw6IFNldCB0aGUgcmVhZCBwcm90ZWN0aW9uIGxldmVsLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGTEFTSEV4X09CX1JlYWRfUHJvdGVjdGlvbiAqLworCisgIHVpbnQ4X3QgVVNFUkNvbmZpZzsgICAvKiE8IFVTRVJDb25maWc6IFByb2dyYW0gdGhlIEZMQVNIIFVzZXIgT3B0aW9uIEJ5dGU6IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJV0RHIC8gU1RPUCAvIFNUREJZIC8gQk9PVDEgLyBWRERBX0FOQUxPRyAvIFNSQU1fUEFSSVRZIC8gU0RBREMxMl9WRERfTU9OSVRPUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiBAcmVmIEZMQVNIRXhfT0JfSVdhdGNoZG9nLCBAcmVmIEZMQVNIRXhfT0JfblJTVF9TVE9QLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBGTEFTSEV4X09CX25SU1RfU1REQlksIEByZWYgRkxBU0hFeF9PQl9CT09UMSwgQHJlZiBGTEFTSEV4X09CX1ZEREFfQW5hbG9nX01vbml0b3JpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgRkxBU0hFeF9PQl9SQU1fUGFyaXR5X0NoZWNrX0VuYWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIFNUTTMyRjM3M3hDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZCBAcmVmIEZMQVNIRXhfT0JfU0RBREMxMl9WRERfTU9OSVRPUiAob25seSBmb3IgU1RNMzJGMzczeEMgJiBTVE0zMkYzNzh4eCBkZXZpY2VzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIFNUTTMyRjM3OHh4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZCBAcmVmIEZMQVNIRXhfT0JfU0RBREMxMl9WRERfTU9OSVRPUiAob25seSBmb3IgU1RNMzJGMzczeEMgJiBTVE0zMkYzNzh4eCBkZXZpY2VzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBEQVRBQWRkcmVzczsgLyohPCBEQVRBQWRkcmVzczogQWRkcmVzcyBvZiB0aGUgb3B0aW9uIGJ5dGUgREFUQSB0byBiZSBwcm9ncmFtbWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRkxBU0hFeF9PQl9EYXRhX0FkZHJlc3MgKi8KKyAgCisgIHVpbnQ4X3QgREFUQURhdGE7ICAgICAvKiE8IERBVEFEYXRhOiBEYXRhIHRvIGJlIHN0b3JlZCBpbiB0aGUgb3B0aW9uIGJ5dGUgREFUQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZVICovICAKK30gRkxBU0hfT0JQcm9ncmFtSW5pdFR5cGVEZWY7CisvKioKKyAgKiBAfQorICAqLyAgCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZMQVNIRXhfRXhwb3J0ZWRfQ29uc3RhbnRzIEZMQVNIRXggRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSEV4X1BhZ2VfU2l6ZSBGTEFTSEV4IFBhZ2UgU2l6ZQorICAqIEB7CisgICovCisjZGVmaW5lIEZMQVNIX1BBR0VfU0laRSAgICAgICAgICAweDgwMAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSEV4X1R5cGVfRXJhc2UgRkxBU0ggVHlwZSBFcmFzZQorICAqIEB7CisgICovIAorI2RlZmluZSBGTEFTSF9UWVBFRVJBU0VfUEFHRVMgICAgICgweDAwVSkgIC8qITxQYWdlcyBlcmFzZSBvbmx5Ki8KKyNkZWZpbmUgRkxBU0hfVFlQRUVSQVNFX01BU1NFUkFTRSAoMHgwMVUpICAvKiE8Rmxhc2ggbWFzcyBlcmFzZSBhY3RpdmF0aW9uKi8KKworLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIEZMQVNIRXhfT3B0aW9uQnl0ZV9Db25zdGFudHMgT3B0aW9uIEJ5dGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8gCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hFeF9PQl9UeXBlIE9wdGlvbiBCeXRlcyBUeXBlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgT1BUSU9OQllURV9XUlAgICAgICAgKDB4MDFVKSAgLyohPFdSUCBvcHRpb24gYnl0ZSBjb25maWd1cmF0aW9uKi8KKyNkZWZpbmUgT1BUSU9OQllURV9SRFAgICAgICAgKDB4MDJVKSAgLyohPFJEUCBvcHRpb24gYnl0ZSBjb25maWd1cmF0aW9uKi8KKyNkZWZpbmUgT1BUSU9OQllURV9VU0VSICAgICAgKDB4MDRVKSAgLyohPFVTRVIgb3B0aW9uIGJ5dGUgY29uZmlndXJhdGlvbiovCisjZGVmaW5lIE9QVElPTkJZVEVfREFUQSAgICAgICgweDA4VSkgIC8qITxEQVRBIG9wdGlvbiBieXRlIGNvbmZpZ3VyYXRpb24qLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIRXhfT0JfV1JQX1N0YXRlIE9wdGlvbiBCeXRlIFdSUCBTdGF0ZQorICAqIEB7CisgICovIAorI2RlZmluZSBPQl9XUlBTVEFURV9ESVNBQkxFICAgKDB4MDBVKSAgLyohPERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gb2YgdGhlIGRlc2lyZWQgcGFnZXMqLworI2RlZmluZSBPQl9XUlBTVEFURV9FTkFCTEUgICAgKDB4MDFVKSAgLyohPEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBvZiB0aGUgZGVzaXJlZCBwYWdlc3MqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIRXhfT0JfV3JpdGVfUHJvdGVjdGlvbiBGTEFTSEV4IE9CIFdyaXRlIFByb3RlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBPQl9XUlBfUEFHRVMwVE8xICAgICAgICAgICAgICAgKDB4MDAwMDAwMDFVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIHBhZ2UgMCB0byAxICovCisjZGVmaW5lIE9CX1dSUF9QQUdFUzJUTzMgICAgICAgICAgICAgICAoMHgwMDAwMDAwMlUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSAyIHRvIDMgKi8KKyNkZWZpbmUgT0JfV1JQX1BBR0VTNFRPNSAgICAgICAgICAgICAgICgweDAwMDAwMDA0VSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDQgdG8gNSAqLworI2RlZmluZSBPQl9XUlBfUEFHRVM2VE83ICAgICAgICAgICAgICAgKDB4MDAwMDAwMDhVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIHBhZ2UgNiB0byA3ICovCisjZGVmaW5lIE9CX1dSUF9QQUdFUzhUTzkgICAgICAgICAgICAgICAoMHgwMDAwMDAxMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSA4IHRvIDkgKi8KKyNkZWZpbmUgT0JfV1JQX1BBR0VTMTBUTzExICAgICAgICAgICAgICgweDAwMDAwMDIwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDEwIHRvIDExICovCisjZGVmaW5lIE9CX1dSUF9QQUdFUzEyVE8xMyAgICAgICAgICAgICAoMHgwMDAwMDA0MFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSAxMiB0byAxMyAqLworI2RlZmluZSBPQl9XUlBfUEFHRVMxNFRPMTUgICAgICAgICAgICAgKDB4MDAwMDAwODBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIHBhZ2UgMTQgdG8gMTUgKi8KKyNkZWZpbmUgT0JfV1JQX1BBR0VTMTZUTzE3ICAgICAgICAgICAgICgweDAwMDAwMTAwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDE2IHRvIDE3ICovCisjZGVmaW5lIE9CX1dSUF9QQUdFUzE4VE8xOSAgICAgICAgICAgICAoMHgwMDAwMDIwMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSAxOCB0byAxOSAqLworI2RlZmluZSBPQl9XUlBfUEFHRVMyMFRPMjEgICAgICAgICAgICAgKDB4MDAwMDA0MDBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIHBhZ2UgMjAgdG8gMjEgKi8KKyNkZWZpbmUgT0JfV1JQX1BBR0VTMjJUTzIzICAgICAgICAgICAgICgweDAwMDAwODAwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDIyIHRvIDIzICovCisjZGVmaW5lIE9CX1dSUF9QQUdFUzI0VE8yNSAgICAgICAgICAgICAoMHgwMDAwMTAwMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSAyNCB0byAyNSAqLworI2RlZmluZSBPQl9XUlBfUEFHRVMyNlRPMjcgICAgICAgICAgICAgKDB4MDAwMDIwMDBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIHBhZ2UgMjYgdG8gMjcgKi8KKyNkZWZpbmUgT0JfV1JQX1BBR0VTMjhUTzI5ICAgICAgICAgICAgICgweDAwMDA0MDAwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDI4IHRvIDI5ICovCisjZGVmaW5lIE9CX1dSUF9QQUdFUzMwVE8zMSAgICAgICAgICAgICAoMHgwMDAwODAwMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSAzMCB0byAzMSAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkgXAorIHx8IGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisjZGVmaW5lIE9CX1dSUF9QQUdFUzMyVE8zMyAgICAgICAgICAgICAoMHgwMDAxMDAwMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSAzMiB0byAzMyAqLworI2RlZmluZSBPQl9XUlBfUEFHRVMzNFRPMzUgICAgICAgICAgICAgKDB4MDAwMjAwMDBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIHBhZ2UgMzQgdG8gMzUgKi8KKyNkZWZpbmUgT0JfV1JQX1BBR0VTMzZUTzM3ICAgICAgICAgICAgICgweDAwMDQwMDAwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDM2IHRvIDM3ICovCisjZGVmaW5lIE9CX1dSUF9QQUdFUzM4VE8zOSAgICAgICAgICAgICAoMHgwMDA4MDAwMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSAzOCB0byAzOSAqLworI2RlZmluZSBPQl9XUlBfUEFHRVM0MFRPNDEgICAgICAgICAgICAgKDB4MDAxMDAwMDBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIHBhZ2UgNDAgdG8gNDEgKi8KKyNkZWZpbmUgT0JfV1JQX1BBR0VTNDJUTzQzICAgICAgICAgICAgICgweDAwMjAwMDAwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDQyIHRvIDQzICovCisjZGVmaW5lIE9CX1dSUF9QQUdFUzQ0VE80NSAgICAgICAgICAgICAoMHgwMDQwMDAwMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSA0NCB0byA0NSAqLworI2RlZmluZSBPQl9XUlBfUEFHRVM0NlRPNDcgICAgICAgICAgICAgKDB4MDA4MDAwMDBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIHBhZ2UgNDYgdG8gNDcgKi8KKyNkZWZpbmUgT0JfV1JQX1BBR0VTNDhUTzQ5ICAgICAgICAgICAgICgweDAxMDAwMDAwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDQ4IHRvIDQ5ICovCisjZGVmaW5lIE9CX1dSUF9QQUdFUzUwVE81MSAgICAgICAgICAgICAoMHgwMjAwMDAwMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSA1MCB0byA1MSAqLworI2RlZmluZSBPQl9XUlBfUEFHRVM1MlRPNTMgICAgICAgICAgICAgKDB4MDQwMDAwMDBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIHBhZ2UgNTIgdG8gNTMgKi8KKyNkZWZpbmUgT0JfV1JQX1BBR0VTNTRUTzU1ICAgICAgICAgICAgICgweDA4MDAwMDAwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDU0IHRvIDU1ICovCisjZGVmaW5lIE9CX1dSUF9QQUdFUzU2VE81NyAgICAgICAgICAgICAoMHgxMDAwMDAwMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSA1NiB0byA1NyAqLworI2RlZmluZSBPQl9XUlBfUEFHRVM1OFRPNTkgICAgICAgICAgICAgKDB4MjAwMDAwMDBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIHBhZ2UgNTggdG8gNTkgKi8KKyNkZWZpbmUgT0JfV1JQX1BBR0VTNjBUTzYxICAgICAgICAgICAgICgweDQwMDAwMDAwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDYwIHRvIDYxICovCisjZGVmaW5lIE9CX1dSUF9QQUdFUzYyVE8xMjcgICAgICAgICAgICAoMHg4MDAwMDAwMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSA2MiB0byAxMjcgKi8KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLyAKKyAgICAgICAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAgICAgICAgICAgICAgICAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkKKyNkZWZpbmUgT0JfV1JQX1BBR0VTMzJUTzMzICAgICAgICAgICAgICgweDAwMDEwMDAwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDMyIHRvIDMzICovCisjZGVmaW5lIE9CX1dSUF9QQUdFUzM0VE8zNSAgICAgICAgICAgICAoMHgwMDAyMDAwMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSAzNCB0byAzNSAqLworI2RlZmluZSBPQl9XUlBfUEFHRVMzNlRPMzcgICAgICAgICAgICAgKDB4MDAwNDAwMDBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIHBhZ2UgMzYgdG8gMzcgKi8KKyNkZWZpbmUgT0JfV1JQX1BBR0VTMzhUTzM5ICAgICAgICAgICAgICgweDAwMDgwMDAwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDM4IHRvIDM5ICovCisjZGVmaW5lIE9CX1dSUF9QQUdFUzQwVE80MSAgICAgICAgICAgICAoMHgwMDEwMDAwMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSA0MCB0byA0MSAqLworI2RlZmluZSBPQl9XUlBfUEFHRVM0MlRPNDMgICAgICAgICAgICAgKDB4MDAyMDAwMDBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIHBhZ2UgNDIgdG8gNDMgKi8KKyNkZWZpbmUgT0JfV1JQX1BBR0VTNDRUTzQ1ICAgICAgICAgICAgICgweDAwNDAwMDAwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDQ0IHRvIDQ1ICovCisjZGVmaW5lIE9CX1dSUF9QQUdFUzQ2VE80NyAgICAgICAgICAgICAoMHgwMDgwMDAwMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSA0NiB0byA0NyAqLworI2RlZmluZSBPQl9XUlBfUEFHRVM0OFRPNDkgICAgICAgICAgICAgKDB4MDEwMDAwMDBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIHBhZ2UgNDggdG8gNDkgKi8KKyNkZWZpbmUgT0JfV1JQX1BBR0VTNTBUTzUxICAgICAgICAgICAgICgweDAyMDAwMDAwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDUwIHRvIDUxICovCisjZGVmaW5lIE9CX1dSUF9QQUdFUzUyVE81MyAgICAgICAgICAgICAoMHgwNDAwMDAwMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSA1MiB0byA1MyAqLworI2RlZmluZSBPQl9XUlBfUEFHRVM1NFRPNTUgICAgICAgICAgICAgKDB4MDgwMDAwMDBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIHBhZ2UgNTQgdG8gNTUgKi8KKyNkZWZpbmUgT0JfV1JQX1BBR0VTNTZUTzU3ICAgICAgICAgICAgICgweDEwMDAwMDAwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDU2IHRvIDU3ICovCisjZGVmaW5lIE9CX1dSUF9QQUdFUzU4VE81OSAgICAgICAgICAgICAoMHgyMDAwMDAwMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSA1OCB0byA1OSAqLworI2RlZmluZSBPQl9XUlBfUEFHRVM2MFRPNjEgICAgICAgICAgICAgKDB4NDAwMDAwMDBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIHBhZ2UgNjAgdG8gNjEgKi8KKyNkZWZpbmUgT0JfV1JQX1BBR0VTNjJUTzI1NSAgICAgICAgICAgICgweDgwMDAwMDAwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDYyIHRvIDI1NSAqLworI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4ICovCisKKyNkZWZpbmUgT0JfV1JQX1BBR0VTMFRPMTVNQVNLICAgICAgICAgICgweDAwMDAwMEZGVSkKKyNkZWZpbmUgT0JfV1JQX1BBR0VTMTZUTzMxTUFTSyAgICAgICAgICgweDAwMDBGRjAwVSkKKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIFwKKyB8fCBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorI2RlZmluZSBPQl9XUlBfUEFHRVMzMlRPNDdNQVNLICAgICAgICAgKDB4MDBGRjAwMDBVKQorI2RlZmluZSBPQl9XUlBfUEFHRVM0OFRPMTI3TUFTSyAgICAgICAgKDB4RkYwMDAwMDBVKQorI2VuZGlmIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggICAgICAgICAgICAgICAgICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisjZGVmaW5lIE9CX1dSUF9QQUdFUzMyVE80N01BU0sgICAgICAgICAoMHgwMEZGMDAwMFUpCisjZGVmaW5lIE9CX1dSUF9QQUdFUzQ4VE8yNTVNQVNLICAgICAgICAoMHhGRjAwMDAwMFUpCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIFwKKyB8fCBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorI2RlZmluZSBPQl9XUlBfUEFHRVMzMlRPNDdNQVNLICAgICAgICAgKDB4MDBGRjAwMDBVKQorI2RlZmluZSBPQl9XUlBfUEFHRVM0OFRPMTI3TUFTSyAgICAgICAgKDB4RkYwMDAwMDBVKQorI2VuZGlmIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggICAgICAgICAgICAgICAgICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIFwKKyB8fCBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSBcCisgfHwgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKyNkZWZpbmUgT0JfV1JQX0FMTFBBR0VTICAgICAgICAgICAgICAgICgweEZGRkZGRkZGVSkgLyohPCBXcml0ZSBwcm90ZWN0aW9uIG9mIGFsbCBwYWdlcyAqLworI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAgICAgICAgICAgICAgICAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkgXAorIHx8IGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpCisjZGVmaW5lIE9CX1dSUF9BTExQQUdFUyAgICAgICAgICAgICAgICAoMHgwMDAwRkZGRlUpIC8qITwgV3JpdGUgcHJvdGVjdGlvbiBvZiBhbGwgcGFnZXMgKi8KKyNlbmRpZiAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4ICAgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hFeF9PQl9SZWFkX1Byb3RlY3Rpb24gT3B0aW9uIEJ5dGUgUmVhZCBQcm90ZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgT0JfUkRQX0xFVkVMXzAgICAgICAgICAgICAgKCh1aW50OF90KTB4QUFVKQorI2RlZmluZSBPQl9SRFBfTEVWRUxfMSAgICAgICAgICAgICAoKHVpbnQ4X3QpMHhCQlUpCisjZGVmaW5lIE9CX1JEUF9MRVZFTF8yICAgICAgICAgICAgICgodWludDhfdCkweENDVSkgLyohPCBXYXJuaW5nOiBXaGVuIGVuYWJsaW5nIHJlYWQgcHJvdGVjdGlvbiBsZXZlbCAyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQncyBubyBtb3JlIHBvc3NpYmxlIHRvIGdvIGJhY2sgdG8gbGV2ZWwgMSBvciAwVSAqLworLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIEZMQVNIRXhfT0JfSVdhdGNoZG9nIE9wdGlvbiBCeXRlIElXYXRjaGRvZworICAqIEB7CisgICovIAorI2RlZmluZSBPQl9JV0RHX1NXICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiE8IFNvZnR3YXJlIElXREcgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgT0JfSVdER19IVyAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyohPCBIYXJkd2FyZSBJV0RHIHNlbGVjdGVkICovCisvKioKKyAgKiBAfQorICAqLworICAKKy8qKiBAZGVmZ3JvdXAgRkxBU0hFeF9PQl9uUlNUX1NUT1AgT3B0aW9uIEJ5dGUgblJTVCBTVE9QCisgICogQHsKKyAgKi8gCisjZGVmaW5lIE9CX1NUT1BfTk9fUlNUICAgICAgICAgICAgICgodWludDhfdCkweDAyVSkgLyohPCBObyByZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyBpbiBTVE9QICovCisjZGVmaW5lIE9CX1NUT1BfUlNUICAgICAgICAgICAgICAgICgodWludDhfdCkweDAwVSkgLyohPCBSZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyBpbiBTVE9QICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIRXhfT0JfblJTVF9TVERCWSBPcHRpb24gQnl0ZSBuUlNUIFNUREJZCisgICogQHsKKyAgKi8gCisjZGVmaW5lIE9CX1NUREJZX05PX1JTVCAgICAgICAgICAgICgodWludDhfdCkweDA0VSkgLyohPCBObyByZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyBpbiBTVEFOREJZICovCisjZGVmaW5lIE9CX1NUREJZX1JTVCAgICAgICAgICAgICAgICgodWludDhfdCkweDAwVSkgLyohPCBSZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyBpbiBTVEFOREJZICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIRXhfT0JfQk9PVDEgT3B0aW9uIEJ5dGUgQk9PVDEKKyAgKiBAeworICAqLworI2RlZmluZSBPQl9CT09UMV9SRVNFVCAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpIC8qITwgQk9PVDEgUmVzZXQgKi8KKyNkZWZpbmUgT0JfQk9PVDFfU0VUICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MTBVKSAvKiE8IEJPT1QxIFNldCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSEV4X09CX1ZEREFfQW5hbG9nX01vbml0b3JpbmcgT3B0aW9uIEJ5dGUgVkREQSBBbmFsb2cgTW9uaXRvcmluZworICAqIEB7CisgICovCisjZGVmaW5lIE9CX1ZEREFfQU5BTE9HX09OICAgICAgICAgICgodWludDhfdCkweDIwVSkgLyohPCBBbmFsb2cgbW9uaXRvcmluZyBvbiBWRERBIFBvd2VyIHNvdXJjZSBPTiAqLworI2RlZmluZSBPQl9WRERBX0FOQUxPR19PRkYgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpIC8qITwgQW5hbG9nIG1vbml0b3Jpbmcgb24gVkREQSBQb3dlciBzb3VyY2UgT0ZGICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIRXhfT0JfUkFNX1Bhcml0eV9DaGVja19FbmFibGUgT3B0aW9uIEJ5dGUgU1JBTSBQYXJpdHkgQ2hlY2sgRW5hYmxlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgT0JfU1JBTV9QQVJJVFlfU0VUICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAvKiE8IFNSQU0gcGFyaXR5IGNoZWNrIGVuYWJsZSBzZXQgKi8KKyNkZWZpbmUgT0JfU1JBTV9QQVJJVFlfUkVTRVQgICAgICAgKCh1aW50OF90KTB4NDBVKSAvKiE8IFNSQU0gcGFyaXR5IGNoZWNrIGVuYWJsZSByZXNldCAqLworLyoqCisgICogQH0KKyAgKi8KKworCisjaWYgZGVmaW5lZChGTEFTSF9PQlJfU0RBREMxMl9WRERfTU9OSVRPUikKKy8qKiBAZGVmZ3JvdXAgRkxBU0hFeF9PQl9TREFEQzEyX1ZERF9NT05JVE9SIE9CIFNEQURDMTIgVkREIE1PTklUT1IKKyAgKiBAeworICAqLworI2RlZmluZSBPQl9TREFDRF9WRERfTU9OSVRPUl9SRVNFVCAgICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAvKiE8IFNEQURDIFZERCBNb25pdG9yIHJlc2V0ICovCisjZGVmaW5lIE9CX1NEQUNEX1ZERF9NT05JVE9SX1NFVCAgICAgICAgICAgICAoKHVpbnQ4X3QpMHg4MFUpIC8qITwgU0RBREMgVkREIE1vbml0b3Igc2V0ICovCisKKy8qKgorICAqIEB9CisgICovIAorI2VuZGlmIC8qIEZMQVNIX09CUl9TREFEQzEyX1ZERF9NT05JVE9SICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hFeF9PQl9EYXRhX0FkZHJlc3MgIE9wdGlvbiBCeXRlIERhdGEgQWRkcmVzcworICAqIEB7CisgICovCisjZGVmaW5lIE9CX0RBVEFfQUREUkVTU19EQVRBMCAgICAgKDB4MUZGRkY4MDRVKQorI2RlZmluZSBPQl9EQVRBX0FERFJFU1NfREFUQTEgICAgICgweDFGRkZGODA2VSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgRkxBU0hFeF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworICAKKy8qKiBAYWRkdG9ncm91cCBGTEFTSEV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAgKiBAeworICAqLyAgIAorLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmICBIQUxfRkxBU0hFeF9FcmFzZShGTEFTSF9FcmFzZUluaXRUeXBlRGVmICpwRXJhc2VJbml0LCB1aW50MzJfdCAqUGFnZUVycm9yKTsKK0hBTF9TdGF0dXNUeXBlRGVmICBIQUxfRkxBU0hFeF9FcmFzZV9JVChGTEFTSF9FcmFzZUluaXRUeXBlRGVmICpwRXJhc2VJbml0KTsKKworLyoqCisgICogQH0KKyAgKi8gCisKKy8qKiBAYWRkdG9ncm91cCBGTEFTSEV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAgKiBAeworICAqLyAgIAorLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmICBIQUxfRkxBU0hFeF9PQkVyYXNlKHZvaWQpOworSEFMX1N0YXR1c1R5cGVEZWYgIEhBTF9GTEFTSEV4X09CUHJvZ3JhbShGTEFTSF9PQlByb2dyYW1Jbml0VHlwZURlZiAqcE9CSW5pdCk7Cit2b2lkICAgICAgICAgICAgICAgSEFMX0ZMQVNIRXhfT0JHZXRDb25maWcoRkxBU0hfT0JQcm9ncmFtSW5pdFR5cGVEZWYgKnBPQkluaXQpOwordWludDMyX3QgICAgICAgICAgIEhBTF9GTEFTSEV4X09CR2V0VXNlckRhdGEodWludDMyX3QgREFUQUFkcmVzcyk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisgIAorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJGM3h4X0hBTF9GTEFTSF9FWF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCisKZGlmZiAtLWdpdCBhL0luYy9zdG0zMmYzeHhfaGFsX2dwaW8uaCBiL0luYy9zdG0zMmYzeHhfaGFsX2dwaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjZiMmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjN4eF9oYWxfZ3Bpby5oCkBAIC0wLDAgKzEsMzEzIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2hhbF9ncGlvLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIEdQSU8gSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0hBTF9HUElPX0gKKyNkZWZpbmUgX19TVE0zMkYzeHhfSEFMX0dQSU9fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBHUElPCisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBHUElPX0V4cG9ydGVkX1R5cGVzIEdQSU8gRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICAgR1BJTyBJbml0IHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQaW47ICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgR1BJTyBwaW5zIHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgR1BJT19waW5zICovCisKKyAgdWludDMyX3QgTW9kZTsgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG9wZXJhdGluZyBtb2RlIGZvciB0aGUgc2VsZWN0ZWQgcGlucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgR1BJT19tb2RlICovCisKKyAgdWludDMyX3QgUHVsbDsgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFB1bGwtdXAgb3IgUHVsbC1Eb3duIGFjdGl2YXRpb24gZm9yIHRoZSBzZWxlY3RlZCBwaW5zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBHUElPX3B1bGwgKi8KKworICB1aW50MzJfdCBTcGVlZDsgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgc3BlZWQgZm9yIHRoZSBzZWxlY3RlZCBwaW5zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBHUElPX3NwZWVkICovCisKKyAgdWludDMyX3QgQWx0ZXJuYXRlOyAgLyohPCBQZXJpcGhlcmFsIHRvIGJlIGNvbm5lY3RlZCB0byB0aGUgc2VsZWN0ZWQgcGlucyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEdQSU9FeF9BbHRlcm5hdGVfZnVuY3Rpb25fc2VsZWN0aW9uICovCit9R1BJT19Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBHUElPIEJpdCBTRVQgYW5kIEJpdCBSRVNFVCBlbnVtZXJhdGlvbgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEdQSU9fUElOX1JFU0VUID0gMFUsCisgIEdQSU9fUElOX1NFVAorfUdQSU9fUGluU3RhdGU7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBHUElPX0V4cG9ydGVkX0NvbnN0YW50cyBHUElPIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisvKiogQGRlZmdyb3VwIEdQSU9fcGlucyBHUElPIHBpbnMKKyAgKiBAeworICAqLworI2RlZmluZSBHUElPX1BJTl8wICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMVUpICAvKiBQaW4gMCBzZWxlY3RlZCAgICAqLworI2RlZmluZSBHUElPX1BJTl8xICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMlUpICAvKiBQaW4gMSBzZWxlY3RlZCAgICAqLworI2RlZmluZSBHUElPX1BJTl8yICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwNFUpICAvKiBQaW4gMiBzZWxlY3RlZCAgICAqLworI2RlZmluZSBHUElPX1BJTl8zICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwOFUpICAvKiBQaW4gMyBzZWxlY3RlZCAgICAqLworI2RlZmluZSBHUElPX1BJTl80ICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAxMFUpICAvKiBQaW4gNCBzZWxlY3RlZCAgICAqLworI2RlZmluZSBHUElPX1BJTl81ICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAyMFUpICAvKiBQaW4gNSBzZWxlY3RlZCAgICAqLworI2RlZmluZSBHUElPX1BJTl82ICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDA0MFUpICAvKiBQaW4gNiBzZWxlY3RlZCAgICAqLworI2RlZmluZSBHUElPX1BJTl83ICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDA4MFUpICAvKiBQaW4gNyBzZWxlY3RlZCAgICAqLworI2RlZmluZSBHUElPX1BJTl84ICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDEwMFUpICAvKiBQaW4gOCBzZWxlY3RlZCAgICAqLworI2RlZmluZSBHUElPX1BJTl85ICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDIwMFUpICAvKiBQaW4gOSBzZWxlY3RlZCAgICAqLworI2RlZmluZSBHUElPX1BJTl8xMCAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDQwMFUpICAvKiBQaW4gMTAgc2VsZWN0ZWQgICAqLworI2RlZmluZSBHUElPX1BJTl8xMSAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDgwMFUpICAvKiBQaW4gMTEgc2VsZWN0ZWQgICAqLworI2RlZmluZSBHUElPX1BJTl8xMiAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MTAwMFUpICAvKiBQaW4gMTIgc2VsZWN0ZWQgICAqLworI2RlZmluZSBHUElPX1BJTl8xMyAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MjAwMFUpICAvKiBQaW4gMTMgc2VsZWN0ZWQgICAqLworI2RlZmluZSBHUElPX1BJTl8xNCAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4NDAwMFUpICAvKiBQaW4gMTQgc2VsZWN0ZWQgICAqLworI2RlZmluZSBHUElPX1BJTl8xNSAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4ODAwMFUpICAvKiBQaW4gMTUgc2VsZWN0ZWQgICAqLworI2RlZmluZSBHUElPX1BJTl9BbGwgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4RkZGRlUpICAvKiBBbGwgcGlucyBzZWxlY3RlZCAqLworCisjZGVmaW5lIEdQSU9fUElOX01BU0sgICAgICAgICAgICAgICgweDAwMDBGRkZGVSkgLyogUElOIG1hc2sgZm9yIGFzc2VydCB0ZXN0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEdQSU9fbW9kZSBHUElPIG1vZGUKKyAgKiBAYnJpZWYgR1BJTyBDb25maWd1cmF0aW9uIE1vZGUKKyAgKiAgICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDB4WDB5ejAwWVoKKyAgKiAgICAgICAgICAgLSBYICA6IEdQSU8gbW9kZSBvciBFWFRJIE1vZGUKKyAgKiAgICAgICAgICAgLSB5ICA6IEV4dGVybmFsIElUIG9yIEV2ZW50IHRyaWdnZXIgZGV0ZWN0aW9uCisgICogICAgICAgICAgIC0geiAgOiBJTyBjb25maWd1cmF0aW9uIG9uIEV4dGVybmFsIElUIG9yIEV2ZW50CisgICogICAgICAgICAgIC0gWSAgOiBPdXRwdXQgdHlwZSAoUHVzaCBQdWxsIG9yIE9wZW4gRHJhaW4pCisgICogICAgICAgICAgIC0gWiAgOiBJTyBEaXJlY3Rpb24gbW9kZSAoSW5wdXQsIE91dHB1dCwgQWx0ZXJuYXRlIG9yIEFuYWxvZykKKyAgKiBAeworICAqLworI2RlZmluZSAgR1BJT19NT0RFX0lOUFVUICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgIC8qITwgSW5wdXQgRmxvYXRpbmcgTW9kZSAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgR1BJT19NT0RFX09VVFBVVF9QUCAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDFVKSAgIC8qITwgT3V0cHV0IFB1c2ggUHVsbCBNb2RlICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgR1BJT19NT0RFX09VVFBVVF9PRCAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMTFVKSAgIC8qITwgT3V0cHV0IE9wZW4gRHJhaW4gTW9kZSAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgR1BJT19NT0RFX0FGX1BQICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDJVKSAgIC8qITwgQWx0ZXJuYXRlIEZ1bmN0aW9uIFB1c2ggUHVsbCBNb2RlICAgICAqLworI2RlZmluZSAgR1BJT19NT0RFX0FGX09EICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMTJVKSAgIC8qITwgQWx0ZXJuYXRlIEZ1bmN0aW9uIE9wZW4gRHJhaW4gTW9kZSAgICAqLworI2RlZmluZSAgR1BJT19NT0RFX0FOQUxPRyAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDNVKSAgIC8qITwgQW5hbG9nIE1vZGUgICovCisjZGVmaW5lICBHUElPX01PREVfSVRfUklTSU5HICAgICAgICAgICAgICAgICAgICAoMHgxMDExMDAwMFUpICAgLyohPCBFeHRlcm5hbCBJbnRlcnJ1cHQgTW9kZSB3aXRoIFJpc2luZyBlZGdlIHRyaWdnZXIgZGV0ZWN0aW9uICAgICAgICAgICovCisjZGVmaW5lICBHUElPX01PREVfSVRfRkFMTElORyAgICAgICAgICAgICAgICAgICAoMHgxMDIxMDAwMFUpICAgLyohPCBFeHRlcm5hbCBJbnRlcnJ1cHQgTW9kZSB3aXRoIEZhbGxpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAgICAgICAgICovCisjZGVmaW5lICBHUElPX01PREVfSVRfUklTSU5HX0ZBTExJTkcgICAgICAgICAgICAoMHgxMDMxMDAwMFUpICAgLyohPCBFeHRlcm5hbCBJbnRlcnJ1cHQgTW9kZSB3aXRoIFJpc2luZy9GYWxsaW5nIGVkZ2UgdHJpZ2dlciBkZXRlY3Rpb24gICovCisjZGVmaW5lICBHUElPX01PREVfRVZUX1JJU0lORyAgICAgICAgICAgICAgICAgICAoMHgxMDEyMDAwMFUpICAgLyohPCBFeHRlcm5hbCBFdmVudCBNb2RlIHdpdGggUmlzaW5nIGVkZ2UgdHJpZ2dlciBkZXRlY3Rpb24gICAgICAgICAgICAgICAqLworI2RlZmluZSAgR1BJT19NT0RFX0VWVF9GQUxMSU5HICAgICAgICAgICAgICAgICAgKDB4MTAyMjAwMDBVKSAgIC8qITwgRXh0ZXJuYWwgRXZlbnQgTW9kZSB3aXRoIEZhbGxpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIEdQSU9fTU9ERV9FVlRfUklTSU5HX0ZBTExJTkcgICAgICAgICAgICgweDEwMzIwMDAwVSkgICAvKiE8IEV4dGVybmFsIEV2ZW50IE1vZGUgd2l0aCBSaXNpbmcvRmFsbGluZyBlZGdlIHRyaWdnZXIgZGV0ZWN0aW9uICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEdQSU9fc3BlZWQgR1BJTyBzcGVlZAorICAqIEBicmllZiBHUElPIE91dHB1dCBNYXhpbXVtIGZyZXF1ZW5jeQorICAqIEB7CisgICovCisjZGVmaW5lICBHUElPX1NQRUVEX0ZSRVFfTE9XICAgICAgKDB4MDAwMDAwMDBVKSAgLyohPCByYW5nZSB1cCB0byAyIE1IeiwgcGxlYXNlIHJlZmVyIHRvIHRoZSBwcm9kdWN0IGRhdGFzaGVldCAqLworI2RlZmluZSAgR1BJT19TUEVFRF9GUkVRX01FRElVTSAgICgweDAwMDAwMDAxVSkgIC8qITwgcmFuZ2UgIDQgTUh6IHRvIDEwIE1IeiwgcGxlYXNlIHJlZmVyIHRvIHRoZSBwcm9kdWN0IGRhdGFzaGVldCAqLworI2RlZmluZSAgR1BJT19TUEVFRF9GUkVRX0hJR0ggICAgICgweDAwMDAwMDAzVSkgIC8qITwgcmFuZ2UgMTAgTUh6IHRvIDUwIE1IeiwgcGxlYXNlIHJlZmVyIHRvIHRoZSBwcm9kdWN0IGRhdGFzaGVldCAqLworLyoqCisgICogQH0KKyAgKi8KKworIC8qKiBAZGVmZ3JvdXAgR1BJT19wdWxsIEdQSU8gcHVsbAorICAgKiBAYnJpZWYgR1BJTyBQdWxsLVVwIG9yIFB1bGwtRG93biBBY3RpdmF0aW9uCisgICAqIEB7CisgICAqLworI2RlZmluZSAgR1BJT19OT1BVTEwgICAgICAgICgweDAwMDAwMDAwVSkgICAvKiE8IE5vIFB1bGwtdXAgb3IgUHVsbC1kb3duIGFjdGl2YXRpb24gICovCisjZGVmaW5lICBHUElPX1BVTExVUCAgICAgICAgKDB4MDAwMDAwMDFVKSAgIC8qITwgUHVsbC11cCBhY3RpdmF0aW9uICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIEdQSU9fUFVMTERPV04gICAgICAoMHgwMDAwMDAwMlUpICAgLyohPCBQdWxsLWRvd24gYWN0aXZhdGlvbiAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgR1BJT19FeHBvcnRlZF9NYWNyb3MgR1BJTyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworICAKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIEVYVEkgbGluZSBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0VYVElfTElORV9fIHNwZWNpZmllcyB0aGUgRVhUSSBsaW5lIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgR1BJT19QSU5feCB3aGVyZSB4IGNhbiBiZSgwLi4xNSkKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19FWFRJX0xJTkVfXyAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfR1BJT19FWFRJX0dFVF9GTEFHKF9fRVhUSV9MSU5FX18pICAgICAgIChFWFRJLT5QUiAmIChfX0VYVElfTElORV9fKSkKKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgRVhUSSdzIGxpbmUgcGVuZGluZyBmbGFncy4KKyAgKiBAcGFyYW0gIF9fRVhUSV9MSU5FX18gc3BlY2lmaWVzIHRoZSBFWFRJIGxpbmVzIGZsYWdzIHRvIGNsZWFyLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBHUElPX1BJTl94IHdoZXJlIHggY2FuIGJlICgwLi4xNSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfR1BJT19FWFRJX0NMRUFSX0ZMQUcoX19FWFRJX0xJTkVfXykgICAgIChFWFRJLT5QUiA9IChfX0VYVElfTElORV9fKSkKKworLyoqCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgRVhUSSBsaW5lIGlzIGFzc2VydGVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fRVhUSV9MSU5FX18gc3BlY2lmaWVzIHRoZSBFWFRJIGxpbmUgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIEdQSU9fUElOX3ggd2hlcmUgeCBjYW4gYmUoMC4uMTUpCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRVhUSV9MSU5FX18gKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fSEFMX0dQSU9fRVhUSV9HRVRfSVQoX19FWFRJX0xJTkVfXykgICAgICAgICAoRVhUSS0+UFIgJiAoX19FWFRJX0xJTkVfXykpCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIEVYVEkncyBsaW5lIHBlbmRpbmcgYml0cy4KKyAgKiBAcGFyYW0gIF9fRVhUSV9MSU5FX18gc3BlY2lmaWVzIHRoZSBFWFRJIGxpbmVzIHRvIGNsZWFyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgR1BJT19QSU5feCB3aGVyZSB4IGNhbiBiZSAoMC4uMTUpCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0dQSU9fRVhUSV9DTEVBUl9JVChfX0VYVElfTElORV9fKSAgICAgICAoRVhUSS0+UFIgPSAoX19FWFRJX0xJTkVfXykpCisKKy8qKgorICAqIEBicmllZiAgR2VuZXJhdGUgYSBTb2Z0d2FyZSBpbnRlcnJ1cHQgb24gc2VsZWN0ZWQgRVhUSSBsaW5lLgorICAqIEBwYXJhbSAgX19FWFRJX0xJTkVfXyBzcGVjaWZpZXMgdGhlIEVYVEkgbGluZSB0byBjaGVjay4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgR1BJT19QSU5feCB3aGVyZSB4IGNhbiBiZSgwLi4xNSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfR1BJT19FWFRJX0dFTkVSQVRFX1NXSVQoX19FWFRJX0xJTkVfXykgIChFWFRJLT5TV0lFUiB8PSAoX19FWFRJX0xJTkVfXykpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgR1BJT19Qcml2YXRlX01hY3JvcyBHUElPIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfR1BJT19QSU5fQUNUSU9OKEFDVElPTikgICgoKEFDVElPTikgPT0gR1BJT19QSU5fUkVTRVQpIHx8ICgoQUNUSU9OKSA9PSBHUElPX1BJTl9TRVQpKQorCisjZGVmaW5lIElTX0dQSU9fUElOKF9fUElOX18pICAgICAgICAoKCgoX19QSU5fXykgJiBHUElPX1BJTl9NQVNLKSAhPSAweDAwVSkgJiZcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19QSU5fXykgJiB+R1BJT19QSU5fTUFTSykgPT0gMHgwMFUpKQorCisjZGVmaW5lIElTX0dQSU9fTU9ERShfX01PREVfXykgICAgICAoKChfX01PREVfXykgPT0gR1BJT19NT0RFX0lOUFVUKSAgICAgICAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gR1BJT19NT0RFX09VVFBVVF9QUCkgICAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gR1BJT19NT0RFX09VVFBVVF9PRCkgICAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gR1BJT19NT0RFX0FGX1BQKSAgICAgICAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gR1BJT19NT0RFX0FGX09EKSAgICAgICAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gR1BJT19NT0RFX0lUX1JJU0lORykgICAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gR1BJT19NT0RFX0lUX0ZBTExJTkcpICAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gR1BJT19NT0RFX0lUX1JJU0lOR19GQUxMSU5HKSAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gR1BJT19NT0RFX0VWVF9SSVNJTkcpICAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gR1BJT19NT0RFX0VWVF9GQUxMSU5HKSAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gR1BJT19NT0RFX0VWVF9SSVNJTkdfRkFMTElORykgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gR1BJT19NT0RFX0FOQUxPRykpCisKKyNkZWZpbmUgSVNfR1BJT19TUEVFRChfX1NQRUVEX18pICAgICgoKF9fU1BFRURfXykgPT0gR1BJT19TUEVFRF9GUkVRX0xPVykgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NQRUVEX18pID09IEdQSU9fU1BFRURfRlJFUV9NRURJVU0pIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TUEVFRF9fKSA9PSBHUElPX1NQRUVEX0ZSRVFfSElHSCkpCisKKyNkZWZpbmUgSVNfR1BJT19QVUxMKF9fUFVMTF9fKSAgICAgICgoKF9fUFVMTF9fKSA9PSBHUElPX05PUFVMTCkgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFVMTF9fKSA9PSBHUElPX1BVTExVUCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BVTExfXykgPT0gR1BJT19QVUxMRE9XTikpCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIEdQSU8gSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfZ3Bpb19leC5oIgorCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKy8qKiBAYWRkdG9ncm91cCBHUElPX0V4cG9ydGVkX0Z1bmN0aW9ucyBHUElPIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBHUElPX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIAorICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKyAgICAgCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAgICAgICAgICAgICAgSEFMX0dQSU9fSW5pdChHUElPX1R5cGVEZWYgICpHUElPeCwgR1BJT19Jbml0VHlwZURlZiAqR1BJT19Jbml0KTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9HUElPX0RlSW5pdChHUElPX1R5cGVEZWYgICpHUElPeCwgdWludDMyX3QgR1BJT19QaW4pOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgR1BJT19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgCisgKiBAeworICovCisgICAKKy8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitHUElPX1BpblN0YXRlICAgICBIQUxfR1BJT19SZWFkUGluKEdQSU9fVHlwZURlZiogR1BJT3gsIHVpbnQxNl90IEdQSU9fUGluKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9HUElPX1dyaXRlUGluKEdQSU9fVHlwZURlZiogR1BJT3gsIHVpbnQxNl90IEdQSU9fUGluLCBHUElPX1BpblN0YXRlIFBpblN0YXRlKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9HUElPX1RvZ2dsZVBpbihHUElPX1R5cGVEZWYqIEdQSU94LCB1aW50MTZfdCBHUElPX1Bpbik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfR1BJT19Mb2NrUGluKEdQSU9fVHlwZURlZiogR1BJT3gsIHVpbnQxNl90IEdQSU9fUGluKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9HUElPX0VYVElfSVJRSGFuZGxlcih1aW50MTZfdCBHUElPX1Bpbik7Cit2b2lkICAgICAgICAgICAgICBIQUxfR1BJT19FWFRJX0NhbGxiYWNrKHVpbnQxNl90IEdQSU9fUGluKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8gCisKKy8qKgorICAqIEB9CisgICovICAKKyAgCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkYzeHhfSEFMX0dQSU9fSCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2hhbF9ncGlvX2V4LmggYi9JbmMvc3RtMzJmM3h4X2hhbF9ncGlvX2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcyYzhmNwotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmYzeHhfaGFsX2dwaW9fZXguaApAQCAtMCwwICsxLDE1MzggQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX2dwaW9fZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgR1BJTyBIQUwgRXh0ZW5kZWQgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkYzeHhfSEFMX0dQSU9fRVhfSAorI2RlZmluZSBfX1NUTTMyRjN4eF9IQUxfR1BJT19FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBHUElPRXggR1BJT0V4CisgICogQGJyaWVmIEdQSU8gRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgR1BJT0V4X0V4cG9ydGVkX0NvbnN0YW50cyBHUElPRXggRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBHUElPRXhfQWx0ZXJuYXRlX2Z1bmN0aW9uX3NlbGVjdGlvbiBHUElPRXggQWx0ZXJuYXRlIGZ1bmN0aW9uIHNlbGVjdGlvbgorICAqIEB7CisgICovCisgIAorI2lmIGRlZmluZWQgKFNUTTMyRjMwMnhDKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNUTTMyRjMwMnhDIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogCisgICogQGJyaWVmICAgQUYgMCBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjBfUlRDXzUwSHogICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBSVENfNTBIeiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfTUNPICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBNQ08gKE1DTzEgYW5kIE1DTzIpIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfVEFNUEVSICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBUQU1QRVIgKFRBTVBFUl8xIGFuZCBUQU1QRVJfMikgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjBfU1dKICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBTV0ogKFNXRCBhbmQgSlRBRykgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfVFJBQ0UgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBUUkFDRSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDEgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYxX1RJTTIgICAgICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIFRJTTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjFfVElNMTUgICAgICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyogVElNMTUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjFfVElNMTYgICAgICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyogVElNMTYgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjFfVElNMTcgICAgICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyogVElNMTcgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjFfRVZFTlRPVVQgICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyogRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAyIHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGMl9USU0xICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTIgICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFRJTTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNMyAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMl9USU00ICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBUSU00IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTE1ICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFRJTTE1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX0NPTVAxICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIENPTVAxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisvKiogCisgICogQGJyaWVmICAgQUYgMyBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjNfVFNDICAgICAgICAgICAoKHVpbnQ4X3QpMHgwM1UpICAvKiBUU0MgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUYzX1RJTTE1ICAgICAgICAgKCh1aW50OF90KTB4MDNVKSAgLyogVElNMTUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDQgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUY0X1RJTTEgICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNF9USU0xNiAgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIFRJTTE2IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY0X1RJTTE3ICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogVElNMTcgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjRfSTJDMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBJMkMxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY0X0kyQzIgICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogSTJDMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgNSBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjVfU1BJMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBTUEkxL0kyUzEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjVfU1BJMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBTUEkyL0kyUzIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjVfU1BJMyAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBTUEkzL0kyUzMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjVfSTJTICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBJMlMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjVfSTJTMmV4dCAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBJMlMyZXh0IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY1X0lSICAgICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogSVIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjVfVUFSVDQgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBVQVJUNCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9VQVJUNSAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFVBUlQ1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisvKiogCisgICogQGJyaWVmICAgQUYgNiBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjZfU1BJMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwNlUpICAvKiBTUEkyL0kyUzIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjZfU1BJMyAgICAgICAgICAoKHVpbnQ4X3QpMHgwNlUpICAvKiBTUEkzL0kyUzMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjZfSTJTM2V4dCAgICAgICAoKHVpbnQ4X3QpMHgwNlUpICAvKiBJMlMzZXh0IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY2X1RJTTEgICAgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNl9JUiAgICAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIElSIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiA3IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGN19VU0FSVDEgICAgICAgICgodWludDhfdCkweDA3VSkgIC8qIFVTQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjdfVVNBUlQyICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBVU0FSVDIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY3X1VTQVJUMyAgICAgICAgKCh1aW50OF90KTB4MDdVKSAgLyogVVNBUlQzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGN19DT01QNiAgICAgICAgICgodWludDhfdCkweDA3VSkgIC8qIENPTVA2IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGN19DQU4gICAgICAgICAgICgodWludDhfdCkweDA3VSkgIC8qIENBTiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDggc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUY4X0NPTVAxICAgICAgICAgKCh1aW50OF90KTB4MDhVKSAgLyogQ09NUDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY4X0NPTVAyICAgICAgICAgKCh1aW50OF90KTB4MDhVKSAgLyogQ09NUDIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY4X0NPTVA0ICAgICAgICAgKCh1aW50OF90KTB4MDhVKSAgLyogQ09NUDQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY4X0NPTVA2ICAgICAgICAgKCh1aW50OF90KTB4MDhVKSAgLyogQ09NUDYgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiA5IHNlbGVjdGlvbiAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUY5X0NBTiAgICAgICAgICAgKCh1aW50OF90KTB4MDlVKSAgLyogQ0FOIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGOV9USU0xICAgICAgICAgICgodWludDhfdCkweDA5VSkgIC8qIFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjlfVElNMTUgICAgICAgICAoKHVpbnQ4X3QpMHgwOVUpICAvKiBUSU0xNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgMTAgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYxMF9USU0yICAgICAgICAgICAoKHVpbnQ4X3QpMHhBVSkgIC8qIFRJTTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjEwX1RJTTMgICAgICAgICAgICgodWludDhfdCkweEFVKSAgLyogVElNMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMTBfVElNNCAgICAgICAgICAgKCh1aW50OF90KTB4QVUpICAvKiBUSU00IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxMF9USU0xNyAgICAgICAgICAoKHVpbnQ4X3QpMHhBVSkgIC8qIFRJTTE3IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisvKiogCisgICogQGJyaWVmICAgQUYgMTEgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYxMV9USU0xICAgICAgICAgICAoKHVpbnQ4X3QpMHgwQlUpICAvKiBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAxMiBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjEyX1RJTTEgICAgICAgICAgICAoKHVpbnQ4X3QpMHhDVSkgIC8qIFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDE0IHNlbGVjdGlvbiAgCisgICovCisKKyNkZWZpbmUgR1BJT19BRjE0X1VTQiAgICAgICAgICAgKCh1aW50OF90KTB4MEVVKSAgLyogVVNCIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisvKiogCisgICogQGJyaWVmICAgQUYgMTUgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYxNV9FVkVOVE9VVCAgICAgICgodWludDhfdCkweDBGVSkgIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKyNkZWZpbmUgSVNfR1BJT19BRihBRikgICAgICAgICAgKCgoQUYpIDw9ICh1aW50OF90KTB4MENVKSB8fCAoKEFGKSA9PSAodWludDhfdCkweDBFVSkgfHwgKChBRikgPT0gKHVpbnQ4X3QpMHgwRlUpKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2VuZGlmIC8qIFNUTTMyRjMwMnhDICovCisgICAKKyNpZiBkZWZpbmVkIChTVE0zMkYzMDN4QykKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTVE0zMkYzMDN4QyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIAorICAqIEBicmllZiAgIEFGIDAgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYwX1JUQ181MEh6ICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogUlRDXzUwSHogQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX01DTyAgICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogTUNPIChNQ08xIGFuZCBNQ08yKSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1RBTVBFUiAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogVEFNUEVSIChUQU1QRVJfMSBhbmQgVEFNUEVSXzIpIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYwX1NXSiAgICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogU1dKIChTV0QgYW5kIEpUQUcpIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1RSQUNFICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogVFJBQ0UgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAxIHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGMV9USU0yICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBUSU0yIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxX1RJTTE1ICAgICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIFRJTTE1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxX1RJTTE2ICAgICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIFRJTTE2IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxX1RJTTE3ICAgICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIFRJTTE3IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxX0VWRU5UT1VUICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisvKiogCisgICogQGJyaWVmICAgQUYgMiBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjJfVElNMSAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMl9USU0yICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBUSU0yIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTMgICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFRJTTMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNNCAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNNCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMl9USU04ICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBUSU04IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTE1ICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFRJTTE1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX0NPTVAxICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIENPTVAxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisvKiogCisgICogQGJyaWVmICAgQUYgMyBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjNfVFNDICAgICAgICAgICAoKHVpbnQ4X3QpMHgwM1UpICAvKiBUU0MgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUYzX1RJTTggICAgICAgICAgKCh1aW50OF90KTB4MDNVKSAgLyogVElNOCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjNfQ09NUDcgICAgICAgICAoKHVpbnQ4X3QpMHgwM1UpICAvKiBDT01QNyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGM19USU0xNSAgICAgICAgICgodWludDhfdCkweDAzVSkgIC8qIFRJTTE1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiA0IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGNF9USU0xICAgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjRfVElNOCAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBUSU04IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY0X1RJTTE2ICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogVElNMTYgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjRfVElNMTcgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBUSU0xNyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNF9JMkMxICAgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIEkyQzEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjRfSTJDMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBJMkMyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiA1IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGNV9TUEkxICAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFNQSTEvSTJTMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9TUEkyICAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFNQSTIvSTJTMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9TUEkzICAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFNQSTMvSTJTMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9JMlMgICAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIEkyUyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9JMlMyZXh0ICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIEkyUzJleHQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjVfVElNOCAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBUSU04IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY1X0lSICAgICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogSVIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjVfVUFSVDQgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBVQVJUNCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9VQVJUNSAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFVBUlQ1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisvKiogCisgICogQGJyaWVmICAgQUYgNiBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjZfU1BJMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwNlUpICAvKiBTUEkyL0kyUzIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjZfU1BJMyAgICAgICAgICAoKHVpbnQ4X3QpMHgwNlUpICAvKiBTUEkzL0kyUzMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjZfSTJTM2V4dCAgICAgICAoKHVpbnQ4X3QpMHgwNlUpICAvKiBJMlMzZXh0IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY2X1RJTTEgICAgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNl9USU04ICAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIFRJTTggQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjZfSVIgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNlUpICAvKiBJUiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgNyBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjdfVVNBUlQxICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBVU0FSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY3X1VTQVJUMiAgICAgICAgKCh1aW50OF90KTB4MDdVKSAgLyogVVNBUlQyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGN19VU0FSVDMgICAgICAgICgodWludDhfdCkweDA3VSkgIC8qIFVTQVJUMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjdfQ09NUDMgICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBDT01QMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjdfQ09NUDUgICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBDT01QNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjdfQ09NUDYgICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBDT01QNiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjdfQ0FOICAgICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBDQU4gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiA4IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGOF9DT01QMSAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIENPTVAxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGOF9DT01QMiAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIENPTVAyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGOF9DT01QMyAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIENPTVAzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGOF9DT01QNCAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIENPTVA0IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGOF9DT01QNSAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIENPTVA1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGOF9DT01QNiAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIENPTVA2IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgOSBzZWxlY3Rpb24gCisgICovIAorI2RlZmluZSBHUElPX0FGOV9DQU4gICAgICAgICAgICgodWludDhfdCkweDA5VSkgIC8qIENBTiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjlfVElNMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwOVUpICAvKiBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY5X1RJTTggICAgICAgICAgKCh1aW50OF90KTB4MDlVKSAgLyogVElNOCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGOV9USU0xNSAgICAgICAgICgodWludDhfdCkweDA5VSkgIC8qIFRJTTE1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAxMCBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjEwX1RJTTIgICAgICAgICAgICgodWludDhfdCkweEFVKSAgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMTBfVElNMyAgICAgICAgICAgKCh1aW50OF90KTB4QVUpICAvKiBUSU0zIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxMF9USU00ICAgICAgICAgICAoKHVpbnQ4X3QpMHhBVSkgIC8qIFRJTTQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjEwX1RJTTggICAgICAgICAgICgodWludDhfdCkweEFVKSAgLyogVElNOCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMTBfVElNMTcgICAgICAgICAgKCh1aW50OF90KTB4QVUpICAvKiBUSU0xNyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworLyoqIAorICAqIEBicmllZiAgIEFGIDExIHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGMTFfVElNMSAgICAgICAgICAgKCh1aW50OF90KTB4MEJVKSAgLyogVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMTFfVElNOCAgICAgICAgICAgKCh1aW50OF90KTB4MEJVKSAgLyogVElNOCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgMTIgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYxMl9USU0xICAgICAgICAgICAgKCh1aW50OF90KTB4Q1UpICAvKiBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAxNCBzZWxlY3Rpb24gIAorICAqLworCisjZGVmaW5lIEdQSU9fQUYxNF9VU0IgICAgICAgICAgICgodWludDhfdCkweDBFVSkgIC8qIFVTQiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworLyoqIAorICAqIEBicmllZiAgIEFGIDE1IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGMTVfRVZFTlRPVVQgICAgICAoKHVpbnQ4X3QpMHgwRlUpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisjZGVmaW5lIElTX0dQSU9fQUYoQUYpICAgICAgICAgICgoKEFGKSA8PSAodWludDhfdCkweDBDVSkgfHwgKChBRikgPT0gKHVpbnQ4X3QpMHgwRVUpIHx8ICgoQUYpID09ICh1aW50OF90KTB4MEZVKSkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNlbmRpZiAvKiBTVE0zMkYzMDN4QyAqLworCisjaWYgZGVmaW5lZCAoU1RNMzJGMzAzeEUpCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1RNMzJGMzAzeEUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAwIHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGMF9SVENfNTBIeiAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFJUQ181MEh6IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUElPX0FGMF9NQ08gICAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIE1DTyAoTUNPMSBhbmQgTUNPMikgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICAgICAqLworI2RlZmluZSBHUElPX0FGMF9UQU1QRVIgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFRBTVBFUiAoVEFNUEVSXzEgYW5kIFRBTVBFUl8yKSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9TV0ogICAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFNXSiAoU1dEIGFuZCBKVEFHKSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgICAgICAqLworI2RlZmluZSBHUElPX0FGMF9UUkFDRSAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFRSQUNFIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgMSBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjFfVElNMiAgICAgICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9USU0xNSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBUSU0xNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9USU0xNiAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBUSU0xNiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9USU0xNyAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBUSU0xNyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9FVkVOVE9VVCAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgMiBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjJfVElNMSAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMl9USU0yICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBUSU0yIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTMgICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFRJTTMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNNCAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNNCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMl9USU04ICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBUSU04IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTE1ICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFRJTTE1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX0NPTVAxICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIENPTVAxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX0kyQzMgICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIEkyQzMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNMjAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNMjAgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDMgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYzX1RTQyAgICAgICAgICAgKCh1aW50OF90KTB4MDNVKSAgLyogVFNDIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGM19USU04ICAgICAgICAgICgodWludDhfdCkweDAzVSkgIC8qIFRJTTggQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUYzX0NPTVA3ICAgICAgICAgKCh1aW50OF90KTB4MDNVKSAgLyogQ09NUDcgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjNfVElNMTUgICAgICAgICAoKHVpbnQ4X3QpMHgwM1UpICAvKiBUSU0xNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGM19JMkMzICAgICAgICAgICgodWludDhfdCkweDAzVSkgIC8qIEkyQzMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjNfVElNMjAgICAgICAgICAoKHVpbnQ4X3QpMHgwM1UpICAvKiBUSU0yMCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgNCBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjRfVElNMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY0X1RJTTggICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogVElNOCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNF9USU0xNiAgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIFRJTTE2IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY0X1RJTTE3ICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogVElNMTcgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjRfSTJDMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBJMkMxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY0X0kyQzIgICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogSTJDMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgNSBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjVfU1BJMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBTUEkxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY1X1NQSTIgICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogU1BJMi9JMlMyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY1X1NQSTMgICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogU1BJMy9JMlMzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY1X0kyUyAgICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogSTJTIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY1X0kyUzJleHQgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogSTJTMmV4dCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9USU04ICAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFRJTTggQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjVfSVIgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBJUiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9VQVJUNCAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFVBUlQ0IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY1X1VBUlQ1ICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogVUFSVDUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjVfU1BJNCAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBTUEk0IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiA2IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGNl9TUEkyICAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIFNQSTIvSTJTMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNl9TUEkzICAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIFNQSTMvSTJTMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNl9JMlMzZXh0ICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIEkyUzNleHQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjZfVElNMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNlUpICAvKiBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY2X1RJTTggICAgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogVElNOCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNl9JUiAgICAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIElSIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY2X1RJTTIwICAgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogVElNMjAgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDcgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUY3X1VTQVJUMSAgICAgICAgKCh1aW50OF90KTB4MDdVKSAgLyogVVNBUlQxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGN19VU0FSVDIgICAgICAgICgodWludDhfdCkweDA3VSkgIC8qIFVTQVJUMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjdfVVNBUlQzICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBVU0FSVDMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY3X0NPTVAzICAgICAgICAgKCh1aW50OF90KTB4MDdVKSAgLyogQ09NUDMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY3X0NPTVA1ICAgICAgICAgKCh1aW50OF90KTB4MDdVKSAgLyogQ09NUDUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY3X0NPTVA2ICAgICAgICAgKCh1aW50OF90KTB4MDdVKSAgLyogQ09NUDYgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY3X0NBTiAgICAgICAgICAgKCh1aW50OF90KTB4MDdVKSAgLyogQ0FOIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgOCBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjhfQ09NUDEgICAgICAgICAoKHVpbnQ4X3QpMHgwOFUpICAvKiBDT01QMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjhfQ09NUDIgICAgICAgICAoKHVpbnQ4X3QpMHgwOFUpICAvKiBDT01QMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjhfQ09NUDMgICAgICAgICAoKHVpbnQ4X3QpMHgwOFUpICAvKiBDT01QMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjhfQ09NUDQgICAgICAgICAoKHVpbnQ4X3QpMHgwOFUpICAvKiBDT01QNCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjhfQ09NUDUgICAgICAgICAoKHVpbnQ4X3QpMHgwOFUpICAvKiBDT01QNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjhfQ09NUDYgICAgICAgICAoKHVpbnQ4X3QpMHgwOFUpICAvKiBDT01QNiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjhfSTJDMyAgICAgICAgICAoKHVpbnQ4X3QpMHgwOFUpICAvKiBJMkMzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiA5IHNlbGVjdGlvbiAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUY5X0NBTiAgICAgICAgICAgKCh1aW50OF90KTB4MDlVKSAgLyogQ0FOIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGOV9USU0xICAgICAgICAgICgodWludDhfdCkweDA5VSkgIC8qIFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjlfVElNOCAgICAgICAgICAoKHVpbnQ4X3QpMHgwOVUpICAvKiBUSU04IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY5X1RJTTE1ICAgICAgICAgKCh1aW50OF90KTB4MDlVKSAgLyogVElNMTUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDEwIHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGMTBfVElNMiAgICAgICAgICAgKCh1aW50OF90KTB4QVUpICAvKiBUSU0yIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxMF9USU0zICAgICAgICAgICAoKHVpbnQ4X3QpMHhBVSkgIC8qIFRJTTMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjEwX1RJTTQgICAgICAgICAgICgodWludDhfdCkweEFVKSAgLyogVElNNCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMTBfVElNOCAgICAgICAgICAgKCh1aW50OF90KTB4QVUpICAvKiBUSU04IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxMF9USU0xNyAgICAgICAgICAoKHVpbnQ4X3QpMHhBVSkgIC8qIFRJTTE3IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisvKiogCisgICogQGJyaWVmICAgQUYgMTEgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYxMV9USU0xICAgICAgICAgICAoKHVpbnQ4X3QpMHgwQlUpICAvKiBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxMV9USU04ICAgICAgICAgICAoKHVpbnQ4X3QpMHgwQlUpICAvKiBUSU04IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAxMiBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjEyX1RJTTEgICAgICAgICAgICAoKHVpbnQ4X3QpMHhDVSkgIC8qIFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjEyX0ZNQyAgICAgICAgICAgICAoKHVpbnQ4X3QpMHhDVSkgIC8qIEZNQyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUElPX0FGMTJfU0RJTyAgICAgICAgICAgICgodWludDhfdCkweENVKSAgLyogU0RJTyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgICAgICAgICAgICAgICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAxNCBzZWxlY3Rpb24gIAorICAqLworI2RlZmluZSBHUElPX0FGMTRfVVNCICAgICAgICAgICAoKHVpbnQ4X3QpMHgwRVUpICAvKiBVU0IgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDE1IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGMTVfRVZFTlRPVVQgICAgICAoKHVpbnQ4X3QpMHgwRlUpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisjZGVmaW5lIElTX0dQSU9fQUYoQUYpICAgICAgICAgICgoKEFGKSA8PSAodWludDhfdCkweDBDVSkgfHwgKChBRikgPT0gKHVpbnQ4X3QpMHgwRVUpIHx8ICgoQUYpID09ICh1aW50OF90KTB4MEZVKSkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNlbmRpZiAvKiBTVE0zMkYzMDN4RSAqLworCisjaWYgZGVmaW5lZCAoU1RNMzJGMzAyeEUpCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1RNMzJGMzAyeEUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAwIHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGMF9SVENfNTBIeiAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFJUQ181MEh6IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUElPX0FGMF9NQ08gICAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIE1DTyAoTUNPMSBhbmQgTUNPMikgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICAgICAqLworI2RlZmluZSBHUElPX0FGMF9UQU1QRVIgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFRBTVBFUiAoVEFNUEVSXzEgYW5kIFRBTVBFUl8yKSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9TV0ogICAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFNXSiAoU1dEIGFuZCBKVEFHKSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgICAgICAqLworI2RlZmluZSBHUElPX0FGMF9UUkFDRSAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFRSQUNFIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgMSBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjFfVElNMiAgICAgICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9USU0xNSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBUSU0xNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9USU0xNiAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBUSU0xNiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9USU0xNyAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBUSU0xNyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9FVkVOVE9VVCAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgMiBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjJfVElNMSAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMl9USU0yICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBUSU0yIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTMgICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFRJTTMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNNCAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNNCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMl9USU0xNSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBUSU0xNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMl9DT01QMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBDT01QMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMl9JMkMzICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBJMkMzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAzIHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGM19UU0MgICAgICAgICAgICgodWludDhfdCkweDAzVSkgIC8qIFRTQyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjNfVElNMTUgICAgICAgICAoKHVpbnQ4X3QpMHgwM1UpICAvKiBUSU0xNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGM19JMkMzICAgICAgICAgICgodWludDhfdCkweDAzVSkgIC8qIEkyQzMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDQgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUY0X1RJTTEgICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNF9USU0xNiAgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIFRJTTE2IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY0X1RJTTE3ICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogVElNMTcgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjRfSTJDMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBJMkMxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY0X0kyQzIgICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogSTJDMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgNSBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjVfU1BJMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBTUEkxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY1X1NQSTIgICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogU1BJMi9JMlMyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY1X1NQSTMgICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogU1BJMy9JMlMzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY1X0kyUyAgICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogSTJTIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY1X0kyUzJleHQgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogSTJTMmV4dCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9JUiAgICAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIElSIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY1X1VBUlQ0ICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogVUFSVDQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjVfVUFSVDUgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBVQVJUNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9TUEk0ICAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFNQSTQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDYgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUY2X1NQSTIgICAgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogU1BJMi9JMlMyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY2X1NQSTMgICAgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogU1BJMy9JMlMzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY2X0kyUzNleHQgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogSTJTM2V4dCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNl9USU0xICAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjZfSVIgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNlUpICAvKiBJUiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgNyBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjdfVVNBUlQxICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBVU0FSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY3X1VTQVJUMiAgICAgICAgKCh1aW50OF90KTB4MDdVKSAgLyogVVNBUlQyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGN19VU0FSVDMgICAgICAgICgodWludDhfdCkweDA3VSkgIC8qIFVTQVJUMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjdfQ09NUDYgICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBDT01QNiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjdfQ0FOICAgICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBDQU4gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiA4IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGOF9DT01QMSAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIENPTVAxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGOF9DT01QMiAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIENPTVAyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGOF9DT01QNCAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIENPTVA0IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGOF9DT01QNiAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIENPTVA2IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGOF9JMkMzICAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIEkyQzMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDkgc2VsZWN0aW9uIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjlfQ0FOICAgICAgICAgICAoKHVpbnQ4X3QpMHgwOVUpICAvKiBDQU4gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY5X1RJTTEgICAgICAgICAgKCh1aW50OF90KTB4MDlVKSAgLyogVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGOV9USU0xNSAgICAgICAgICgodWludDhfdCkweDA5VSkgIC8qIFRJTTE1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAxMCBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjEwX1RJTTIgICAgICAgICAgICgodWludDhfdCkweEFVKSAgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMTBfVElNMyAgICAgICAgICAgKCh1aW50OF90KTB4QVUpICAvKiBUSU0zIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxMF9USU00ICAgICAgICAgICAoKHVpbnQ4X3QpMHhBVSkgIC8qIFRJTTQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjEwX1RJTTE3ICAgICAgICAgICgodWludDhfdCkweEFVKSAgLyogVElNMTcgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAxMSBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjExX1RJTTEgICAgICAgICAgICgodWludDhfdCkweDBCVSkgIC8qIFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDEyIHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGMTJfVElNMSAgICAgICAgICAgICgodWludDhfdCkweENVKSAgLyogVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMTJfRk1DICAgICAgICAgICAgICgodWludDhfdCkweENVKSAgLyogRk1DIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdQSU9fQUYxMl9TRElPICAgICAgICAgICAgKCh1aW50OF90KTB4Q1UpICAvKiBTRElPIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAgICAgICAgICAgICAgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDE0IHNlbGVjdGlvbiAgCisgICovCisjZGVmaW5lIEdQSU9fQUYxNF9VU0IgICAgICAgICAgICgodWludDhfdCkweDBFVSkgIC8qIFVTQiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgMTUgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYxNV9FVkVOVE9VVCAgICAgICgodWludDhfdCkweDBGVSkgIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKyNkZWZpbmUgSVNfR1BJT19BRihBRikgICAgICAgICAgKCgoQUYpIDw9ICh1aW50OF90KTB4MENVKSB8fCAoKEFGKSA9PSAodWludDhfdCkweDBFVSkgfHwgKChBRikgPT0gKHVpbnQ4X3QpMHgwRlUpKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2VuZGlmIC8qIFNUTTMyRjMwMnhFICovCisKKyNpZiBkZWZpbmVkIChTVE0zMkYzOTh4eCkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTVE0zMkYzOTh4eCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIAorICAqIEBicmllZiAgIEFGIDAgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYwX1JUQ181MEh6ICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogUlRDXzUwSHogQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX01DTyAgICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogTUNPIChNQ08xIGFuZCBNQ08yKSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1RBTVBFUiAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogVEFNUEVSIChUQU1QRVJfMSBhbmQgVEFNUEVSXzIpIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYwX1NXSiAgICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogU1dKIChTV0QgYW5kIEpUQUcpIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1RSQUNFICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogVFJBQ0UgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAxIHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGMV9USU0yICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBUSU0yIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxX1RJTTE1ICAgICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIFRJTTE1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxX1RJTTE2ICAgICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIFRJTTE2IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxX1RJTTE3ICAgICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIFRJTTE3IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxX0VWRU5UT1VUICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAyIHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGMl9USU0xICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTIgICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFRJTTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNMyAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMl9USU00ICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBUSU00IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTggICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFRJTTggQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNMTUgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNMTUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfQ09NUDEgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogQ09NUDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfSTJDMyAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogSTJDMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMl9USU0yMCAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBUSU0yMCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgMyBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjNfVFNDICAgICAgICAgICAoKHVpbnQ4X3QpMHgwM1UpICAvKiBUU0MgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUYzX1RJTTggICAgICAgICAgKCh1aW50OF90KTB4MDNVKSAgLyogVElNOCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjNfQ09NUDcgICAgICAgICAoKHVpbnQ4X3QpMHgwM1UpICAvKiBDT01QNyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGM19USU0xNSAgICAgICAgICgodWludDhfdCkweDAzVSkgIC8qIFRJTTE1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYzX0kyQzMgICAgICAgICAgKCh1aW50OF90KTB4MDNVKSAgLyogSTJDMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGM19USU0yMCAgICAgICAgICgodWludDhfdCkweDAzVSkgIC8qIFRJTTIwIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiA0IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGNF9USU0xICAgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjRfVElNOCAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBUSU04IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY0X1RJTTE2ICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogVElNMTYgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjRfVElNMTcgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBUSU0xNyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNF9JMkMxICAgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIEkyQzEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjRfSTJDMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBJMkMyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiA1IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGNV9TUEkxICAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFNQSTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjVfU1BJMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBTUEkyL0kyUzIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjVfU1BJMyAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBTUEkzL0kyUzMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjVfSTJTICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBJMlMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjVfSTJTMmV4dCAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBJMlMyZXh0IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY1X1RJTTggICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogVElNOCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9JUiAgICAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIElSIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY1X1VBUlQ0ICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogVUFSVDQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjVfVUFSVDUgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBVQVJUNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9TUEk0ICAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFNQSTQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDYgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUY2X1NQSTIgICAgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogU1BJMi9JMlMyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY2X1NQSTMgICAgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogU1BJMy9JMlMzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY2X0kyUzNleHQgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogSTJTM2V4dCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNl9USU0xICAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjZfVElNOCAgICAgICAgICAoKHVpbnQ4X3QpMHgwNlUpICAvKiBUSU04IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY2X0lSICAgICAgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogSVIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjZfVElNMjAgICAgICAgICAoKHVpbnQ4X3QpMHgwNlUpICAvKiBUSU0yMCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgNyBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjdfVVNBUlQxICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBVU0FSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY3X1VTQVJUMiAgICAgICAgKCh1aW50OF90KTB4MDdVKSAgLyogVVNBUlQyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGN19VU0FSVDMgICAgICAgICgodWludDhfdCkweDA3VSkgIC8qIFVTQVJUMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjdfQ09NUDMgICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBDT01QMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjdfQ09NUDUgICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBDT01QNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjdfQ09NUDYgICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBDT01QNiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjdfQ0FOICAgICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBDQU4gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiA4IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGOF9DT01QMSAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIENPTVAxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGOF9DT01QMiAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIENPTVAyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGOF9DT01QMyAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIENPTVAzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGOF9DT01QNCAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIENPTVA0IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGOF9DT01QNSAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIENPTVA1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGOF9DT01QNiAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIENPTVA2IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGOF9JMkMzICAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIEkyQzMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDkgc2VsZWN0aW9uIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjlfQ0FOICAgICAgICAgICAoKHVpbnQ4X3QpMHgwOVUpICAvKiBDQU4gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY5X1RJTTEgICAgICAgICAgKCh1aW50OF90KTB4MDlVKSAgLyogVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGOV9USU04ICAgICAgICAgICgodWludDhfdCkweDA5VSkgIC8qIFRJTTggQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjlfVElNMTUgICAgICAgICAoKHVpbnQ4X3QpMHgwOVUpICAvKiBUSU0xNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgMTAgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYxMF9USU0yICAgICAgICAgICAoKHVpbnQ4X3QpMHhBVSkgIC8qIFRJTTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjEwX1RJTTMgICAgICAgICAgICgodWludDhfdCkweEFVKSAgLyogVElNMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMTBfVElNNCAgICAgICAgICAgKCh1aW50OF90KTB4QVUpICAvKiBUSU00IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxMF9USU04ICAgICAgICAgICAoKHVpbnQ4X3QpMHhBVSkgIC8qIFRJTTggQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjEwX1RJTTE3ICAgICAgICAgICgodWludDhfdCkweEFVKSAgLyogVElNMTcgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAxMSBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjExX1RJTTEgICAgICAgICAgICgodWludDhfdCkweDBCVSkgIC8qIFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjExX1RJTTggICAgICAgICAgICgodWludDhfdCkweDBCVSkgIC8qIFRJTTggQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDEyIHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGMTJfVElNMSAgICAgICAgICAgICgodWludDhfdCkweENVKSAgLyogVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMTJfRk1DICAgICAgICAgICAgICgodWludDhfdCkweENVKSAgLyogRk1DIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdQSU9fQUYxMl9TRElPICAgICAgICAgICAgKCh1aW50OF90KTB4Q1UpICAvKiBTRElPIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAgICAgICAgICAgICAgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDE1IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGMTVfRVZFTlRPVVQgICAgICAoKHVpbnQ4X3QpMHgwRlUpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisjZGVmaW5lIElTX0dQSU9fQUYoQUYpICAgICAgICAgICgoKEFGKSA8PSAodWludDhfdCkweDBDVSkgfHwgKChBRikgPT0gKHVpbnQ4X3QpMHgwRlUpKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2VuZGlmIC8qIFNUTTMyRjM5OHh4ICovCisKKyNpZiBkZWZpbmVkIChTVE0zMkYzNTh4eCkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTVE0zMkYzNTh4eCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAwIHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGMF9SVENfNTBIeiAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFJUQ181MEh6IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUElPX0FGMF9NQ08gICAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIE1DTyAoTUNPMSBhbmQgTUNPMikgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICAgICAqLworI2RlZmluZSBHUElPX0FGMF9UQU1QRVIgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFRBTVBFUiAoVEFNUEVSXzEgYW5kIFRBTVBFUl8yKSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9TV0ogICAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFNXSiAoU1dEIGFuZCBKVEFHKSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgICAgICAqLworI2RlZmluZSBHUElPX0FGMF9UUkFDRSAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFRSQUNFIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgMSBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjFfVElNMiAgICAgICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9USU0xNSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBUSU0xNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9USU0xNiAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBUSU0xNiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9USU0xNyAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBUSU0xNyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9FVkVOVE9VVCAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworLyoqIAorICAqIEBicmllZiAgIEFGIDIgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYyX1RJTTEgICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNMiAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMl9USU0zICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBUSU0zIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTQgICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFRJTTQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNOCAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNOCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMl9USU0xNSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBUSU0xNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMl9DT01QMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBDT01QMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworLyoqIAorICAqIEBicmllZiAgIEFGIDMgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYzX1RTQyAgICAgICAgICAgKCh1aW50OF90KTB4MDNVKSAgLyogVFNDIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGM19USU04ICAgICAgICAgICgodWludDhfdCkweDAzVSkgIC8qIFRJTTggQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUYzX0NPTVA3ICAgICAgICAgKCh1aW50OF90KTB4MDNVKSAgLyogQ09NUDcgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjNfVElNMTUgICAgICAgICAoKHVpbnQ4X3QpMHgwM1UpICAvKiBUSU0xNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgNCBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjRfVElNMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY0X1RJTTggICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogVElNOCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNF9USU0xNiAgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIFRJTTE2IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY0X1RJTTE3ICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogVElNMTcgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjRfSTJDMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBJMkMxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY0X0kyQzIgICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogSTJDMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgNSBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjVfU1BJMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBTUEkxL0kyUzEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAqLworI2RlZmluZSBHUElPX0FGNV9TUEkyICAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFNQSTIvSTJTMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9TUEkzICAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFNQSTMvSTJTMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9JMlMgICAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIEkyUyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9JMlMyZXh0ICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIEkyUzJleHQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjVfVElNOCAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBUSU04IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY1X0lSICAgICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogSVIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjVfVUFSVDQgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBVQVJUNCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9VQVJUNSAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFVBUlQ1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisvKiogCisgICogQGJyaWVmICAgQUYgNiBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjZfU1BJMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwNlUpICAvKiBTUEkyL0kyUzIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjZfU1BJMyAgICAgICAgICAoKHVpbnQ4X3QpMHgwNlUpICAvKiBTUEkzL0kyUzMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjZfSTJTM2V4dCAgICAgICAoKHVpbnQ4X3QpMHgwNlUpICAvKiBJMlMzZXh0IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY2X1RJTTEgICAgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNl9USU04ICAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIFRJTTggQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjZfSVIgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNlUpICAvKiBJUiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgNyBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjdfVVNBUlQxICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBVU0FSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY3X1VTQVJUMiAgICAgICAgKCh1aW50OF90KTB4MDdVKSAgLyogVVNBUlQyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGN19VU0FSVDMgICAgICAgICgodWludDhfdCkweDA3VSkgIC8qIFVTQVJUMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjdfQ09NUDMgICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBDT01QMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjdfQ09NUDUgICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBDT01QNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjdfQ09NUDYgICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBDT01QNiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjdfQ0FOICAgICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBDQU4gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiA4IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGOF9DT01QMSAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIENPTVAxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGOF9DT01QMiAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIENPTVAyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGOF9DT01QMyAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIENPTVAzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGOF9DT01QNCAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIENPTVA0IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGOF9DT01QNSAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIENPTVA1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGOF9DT01QNiAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIENPTVA2IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgOSBzZWxlY3Rpb24gCisgICovIAorI2RlZmluZSBHUElPX0FGOV9DQU4gICAgICAgICAgICgodWludDhfdCkweDA5VSkgIC8qIENBTiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjlfVElNMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwOVUpICAvKiBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY5X1RJTTggICAgICAgICAgKCh1aW50OF90KTB4MDlVKSAgLyogVElNOCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGOV9USU0xNSAgICAgICAgICgodWludDhfdCkweDA5VSkgIC8qIFRJTTE1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAxMCBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjEwX1RJTTIgICAgICAgICAgICgodWludDhfdCkweEFVKSAgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMTBfVElNMyAgICAgICAgICAgKCh1aW50OF90KTB4QVUpICAvKiBUSU0zIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxMF9USU00ICAgICAgICAgICAoKHVpbnQ4X3QpMHhBVSkgIC8qIFRJTTQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjEwX1RJTTggICAgICAgICAgICgodWludDhfdCkweEFVKSAgLyogVElNOCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMTBfVElNMTcgICAgICAgICAgKCh1aW50OF90KTB4QVUpICAvKiBUSU0xNyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworLyoqIAorICAqIEBicmllZiAgIEFGIDExIHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGMTFfVElNMSAgICAgICAgICAgKCh1aW50OF90KTB4MEJVKSAgLyogVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMTFfVElNOCAgICAgICAgICAgKCh1aW50OF90KTB4MEJVKSAgLyogVElNOCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgMTIgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYxMl9USU0xICAgICAgICAgICAgKCh1aW50OF90KTB4Q1UpICAvKiBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAxNSBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjE1X0VWRU5UT1VUICAgICAgKCh1aW50OF90KTB4MEZVKSAgLyogRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworI2RlZmluZSBJU19HUElPX0FGKEFGKSAgICAgICAgICAoKChBRikgPD0gKHVpbnQ4X3QpMHgwQ1UpIHx8ICgoQUYpID09ICh1aW50OF90KTB4MEZVKSkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNlbmRpZiAvKiBTVE0zMkYzNTh4eCAqLworCisjaWYgIGRlZmluZWQgKFNUTTMyRjM3M3hDKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNUTTMyRjM3M3hDLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIAorICAqIEBicmllZiAgIEFGIDAgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYwX1JUQ181MEh6ICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogUlRDXzUwSHogQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX01DTyAgICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogTUNPIChNQ08xIGFuZCBNQ08yKSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1RBTVBFUiAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogVEFNUEVSIChUQU1QRVJfMSBhbmQgVEFNUEVSXzIpIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYwX1NXSiAgICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogU1dKIChTV0QgYW5kIEpUQUcpIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1RSQUNFICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogVFJBQ0UgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAxIHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGMV9USU0yICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBUSU0yIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxX1RJTTE1ICAgICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIFRJTTE1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxX1RJTTE2ICAgICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIFRJTTE2IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxX1RJTTE3ICAgICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIFRJTTE3IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxX0VWRU5UT1VUICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisvKiogCisgICogQGJyaWVmICAgQUYgMiBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjJfVElNMyAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMl9USU00ICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBUSU00IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTUgICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFRJTTUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNMTMgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNMTMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNMTQgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNMTQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNMTUgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNMTUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNMTkgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNMTkgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDMgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYzX1RTQyAgICAgICAgICAgKCh1aW50OF90KTB4MDNVKSAgLyogVFNDIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworLyoqIAorICAqIEBicmllZiAgIEFGIDQgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUY0X0kyQzEgICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogSTJDMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNF9JMkMyICAgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIEkyQzIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDUgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUY1X1NQSTEgICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogU1BJMS9JMlMxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY1X1NQSTIgICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogU1BJMi9JMlMyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY1X0lSICAgICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogSVIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKy8qKiAKKyAgKiBAYnJpZWYgICBBRiA2IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGNl9TUEkxICAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIFNQSTEvSTJTMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNl9TUEkzICAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIFNQSTMvSTJTMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNl9JUiAgICAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIElSIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY2X0NFQyAgICAgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogQ0VDIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisvKiogCisgICogQGJyaWVmICAgQUYgNyBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjdfVVNBUlQxICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBVU0FSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY3X1VTQVJUMiAgICAgICAgKCh1aW50OF90KTB4MDdVKSAgLyogVVNBUlQyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGN19VU0FSVDMgICAgICAgICgodWludDhfdCkweDA3VSkgIC8qIFVTQVJUMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjdfQ0FOICAgICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBDQU4gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY3X0NFQyAgICAgICAgICAgKCh1aW50OF90KTB4MDdVKSAgLyogQ0VDIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgOCBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjhfQ09NUDEgICAgICAgICAoKHVpbnQ4X3QpMHgwOFUpICAvKiBDT01QMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjhfQ09NUDIgICAgICAgICAoKHVpbnQ4X3QpMHgwOFUpICAvKiBDT01QMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDkgc2VsZWN0aW9uIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjlfQ0FOICAgICAgICAgICAoKHVpbnQ4X3QpMHgwOVUpICAvKiBDQU4gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY5X1RJTTEyICAgICAgICAgKCh1aW50OF90KTB4MDlVKSAgLyogVElNMTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjlfVElNMTMgICAgICAgICAoKHVpbnQ4X3QpMHgwOVUpICAvKiBUSU0xMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGOV9USU0xNCAgICAgICAgICgodWludDhfdCkweDA5VSkgIC8qIFRJTTE0IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY5X1RJTTE1ICAgICAgICAgKCh1aW50OF90KTB4MDlVKSAgLyogVElNMTUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAxMCBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjEwX1RJTTIgICAgICAgICAgICgodWludDhfdCkweEFVKSAgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMTBfVElNMyAgICAgICAgICAgKCh1aW50OF90KTB4QVUpICAvKiBUSU0zIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxMF9USU00ICAgICAgICAgICAoKHVpbnQ4X3QpMHhBVSkgIC8qIFRJTTQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjEwX1RJTTEyICAgICAgICAgICgodWludDhfdCkweEFVKSAgLyogVElNMTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjEwX1RJTTE3ICAgICAgICAgICgodWludDhfdCkweEFVKSAgLyogVElNMTcgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAxMSBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjExX1RJTTE5ICAgICAgICAgICgodWludDhfdCkweDBCVSkgIC8qIFRJTTE5IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKworLyoqIAorICAqIEBicmllZiAgIEFGIDE0IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGMTRfVVNCICAgICAgICAgICAoKHVpbnQ4X3QpMHgwRVUpICAvKiBVU0IgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDE1IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGMTVfRVZFTlRPVVQgICAgICAoKHVpbnQ4X3QpMHgwRlUpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisjZGVmaW5lIElTX0dQSU9fQUYoQUYpICAgICAgICAgICgoKEFGKSA8PSAodWludDhfdCkweDBCVSkgfHwgKChBRikgPT0gKHVpbnQ4X3QpMHgwRVUpIHx8ICgoQUYpID09ICh1aW50OF90KTB4MEZVKSkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyAqLworCisKKyNpZiBkZWZpbmVkIChTVE0zMkYzNzh4eCkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTVE0zMkYzNzh4eC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAwIHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGMF9SVENfNTBIeiAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFJUQ181MEh6IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUElPX0FGMF9NQ08gICAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIE1DTyAoTUNPMSBhbmQgTUNPMikgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICAgICAqLworI2RlZmluZSBHUElPX0FGMF9UQU1QRVIgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFRBTVBFUiAoVEFNUEVSXzEgYW5kIFRBTVBFUl8yKSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9TV0ogICAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFNXSiAoU1dEIGFuZCBKVEFHKSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgICAgICAqLworI2RlZmluZSBHUElPX0FGMF9UUkFDRSAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFRSQUNFIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgMSBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjFfVElNMiAgICAgICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9USU0xNSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBUSU0xNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9USU0xNiAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBUSU0xNiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9USU0xNyAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBUSU0xNyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9FVkVOVE9VVCAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworLyoqIAorICAqIEBicmllZiAgIEFGIDIgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYyX1RJTTMgICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFRJTTMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNNCAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNNCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMl9USU01ICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBUSU01IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTEzICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFRJTTEzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTE0ICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFRJTTE0IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTE1ICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFRJTTE1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTE5ICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFRJTTE5IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAzIHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGM19UU0MgICAgICAgICAgICgodWludDhfdCkweDAzVSkgIC8qIFRTQyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKy8qKiAKKyAgKiBAYnJpZWYgICBBRiA0IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGNF9JMkMxICAgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIEkyQzEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjRfSTJDMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBJMkMyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiA1IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGNV9TUEkxICAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFNQSTEvSTJTMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9TUEkyICAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFNQSTIvSTJTMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9JUiAgICAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIElSIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiA2IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGNl9TUEkxICAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIFNQSTEvSTJTMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNl9TUEkzICAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIFNQSTMvSTJTMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNl9JUiAgICAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIElSIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY2X0NFQyAgICAgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogQ0VDIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiA3IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGN19VU0FSVDEgICAgICAgICgodWludDhfdCkweDA3VSkgIC8qIFVTQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjdfVVNBUlQyICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBVU0FSVDIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY3X1VTQVJUMyAgICAgICAgKCh1aW50OF90KTB4MDdVKSAgLyogVVNBUlQzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGN19DQU4gICAgICAgICAgICgodWludDhfdCkweDA3VSkgIC8qIENBTiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjdfQ0VDICAgICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBDRUMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiA4IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGOF9DT01QMSAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIENPTVAxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGOF9DT01QMiAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIENPTVAyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgOSBzZWxlY3Rpb24gIAorICAqLworI2RlZmluZSBHUElPX0FGOV9DQU4gICAgICAgICAgICgodWludDhfdCkweDA5VSkgIC8qIENBTiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjlfVElNMTIgICAgICAgICAoKHVpbnQ4X3QpMHgwOVUpICAvKiBUSU0xMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGOV9USU0xMyAgICAgICAgICgodWludDhfdCkweDA5VSkgIC8qIFRJTTEzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY5X1RJTTE0ICAgICAgICAgKCh1aW50OF90KTB4MDlVKSAgLyogVElNMTQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjlfVElNMTUgICAgICAgICAoKHVpbnQ4X3QpMHgwOVUpICAvKiBUSU0xNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgMTAgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYxMF9USU0yICAgICAgICAgICAoKHVpbnQ4X3QpMHhBVSkgIC8qIFRJTTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjEwX1RJTTMgICAgICAgICAgICgodWludDhfdCkweEFVKSAgLyogVElNMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMTBfVElNNCAgICAgICAgICAgKCh1aW50OF90KTB4QVUpICAvKiBUSU00IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxMF9USU0xMiAgICAgICAgICAoKHVpbnQ4X3QpMHhBVSkgIC8qIFRJTTEyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxMF9USU0xNyAgICAgICAgICAoKHVpbnQ4X3QpMHhBVSkgIC8qIFRJTTE3IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAxMSBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjExX1RJTTE5ICAgICAgICAgICgodWludDhfdCkweDBCVSkgIC8qIFRJTTE5IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAxNSBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjE1X0VWRU5UT1VUICAgICAgKCh1aW50OF90KTB4MEZVKSAgLyogRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworI2RlZmluZSBJU19HUElPX0FGKEFGKSAgICAgICAgICAoKChBRikgPD0gKHVpbnQ4X3QpMHgwQlUpIHx8ICgoQUYpID09ICh1aW50OF90KTB4MEZVKSkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNlbmRpZiAvKiBTVE0zMkYzNzh4eCAqLworCisjaWYgZGVmaW5lZCAoU1RNMzJGMzAzeDgpCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1RNMzJGMzAzeDgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogCisgICogQGJyaWVmICAgQUYgMCBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjBfTUNPICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBNQ08gKE1DTzEgYW5kIE1DTzIpIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfVEFNUEVSICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBUQU1QRVIgKFRBTVBFUl8xIGFuZCBUQU1QRVJfMikgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjBfU1dKICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBTV0ogKFNXRCBhbmQgSlRBRykgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfVFJBQ0UgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBUUkFDRSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDEgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYxX1RJTTIgICAgICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIFRJTTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjFfVElNMTUgICAgICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyogVElNMTUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjFfVElNMTYgICAgICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyogVElNMTYgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjFfVElNMTcgICAgICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyogVElNMTcgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjFfRVZFTlRPVVQgICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyogRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAyIHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGMl9USU0zICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBUSU0zIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTEgICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNMTUgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNMTUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNMTYgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNMTYgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDMgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYzX1RTQyAgICAgICAgICAgKCh1aW50OF90KTB4MDNVKSAgLyogVFNDIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgNCBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjRfSTJDMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBJMkMxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY0X1RJTTEgICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgNSBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjVfU1BJMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBTUEkxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY1X0lSICAgICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogSVIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKy8qKiAKKyAgKiBAYnJpZWYgICBBRiA2IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGNl9USU0xICAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjZfSVIgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNlUpICAvKiBJUiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgNyBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjdfVVNBUlQxICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBVU0FSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY3X1VTQVJUMiAgICAgICAgKCh1aW50OF90KTB4MDdVKSAgLyogVVNBUlQyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGN19VU0FSVDMgICAgICAgICgodWludDhfdCkweDA3VSkgIC8qIFVTQVJUMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjdfR1BDT01QNiAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBHUENPTVA2IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgOCBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjhfR1BDT01QMiAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIEdQQ09NUDIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY4X0dQQ09NUDQgICAgICAgICAoKHVpbnQ4X3QpMHgwOFUpICAvKiBHUENPTVA0IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGOF9HUENPTVA2ICAgICAgICAgKCh1aW50OF90KTB4MDhVKSAgLyogR1BDT01QNiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDkgc2VsZWN0aW9uIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjlfQ0FOICAgICAgICAgICAoKHVpbnQ4X3QpMHgwOVUpICAvKiBDQU4gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY5X1RJTTEgICAgICAgICAgKCh1aW50OF90KTB4MDlVKSAgLyogVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGOV9USU0xNSAgICAgICAgICgodWludDhfdCkweDA5VSkgIC8qIFRJTTE1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisvKiogCisgICogQGJyaWVmICAgQUYgMTAgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYxMF9USU0yICAgICAgICAgICAoKHVpbnQ4X3QpMHhBVSkgIC8qIFRJTTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjEwX1RJTTMgICAgICAgICAgICgodWludDhfdCkweEFVKSAgLyogVElNMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMTBfVElNMTcgICAgICAgICAgKCh1aW50OF90KTB4QVUpICAvKiBUSU0xNyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgMTEgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYxMV9USU0xICAgICAgICAgICgodWludDhfdCkweDBCVSkgIC8qIFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDEyIHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGMTJfVElNMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwQ1UpICAvKiBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAxMyBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjEzX09QQU1QMiAgICAgICAgKCh1aW50OF90KTB4MERVKSAgLyogT1BBTVAyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAxNSBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjE1X0VWRU5UT1VUICAgICAgKCh1aW50OF90KTB4MEZVKSAgLyogRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworI2RlZmluZSBJU19HUElPX0FGKEFGKSAgICAgICAgICAoKChBRikgPD0gKHVpbnQ4X3QpMHgwRFUpIHx8ICgoQUYpID09ICh1aW50OF90KTB4MEZVKSkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNlbmRpZiAvKiBTVE0zMkYzMDN4OCAqLworCisjaWYgZGVmaW5lZCAoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQgKFNUTTMyRjMyOHh4KQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNUTTMyRjMzNHg4L1NUTTMyRjMyOHh4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIAorICAqIEBicmllZiAgIEFGIDAgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYwX01DTyAgICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogTUNPIChNQ08xIGFuZCBNQ08yKSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1RBTVBFUiAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogVEFNUEVSIChUQU1QRVJfMSBhbmQgVEFNUEVSXzIpIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYwX1NXSiAgICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogU1dKIChTV0QgYW5kIEpUQUcpIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1RSQUNFICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogVFJBQ0UgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAxIHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGMV9USU0yICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBUSU0yIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxX1RJTTE1ICAgICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIFRJTTE1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxX1RJTTE2ICAgICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIFRJTTE2IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxX1RJTTE3ICAgICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIFRJTTE3IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxX0VWRU5UT1VUICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisvKiogCisgICogQGJyaWVmICAgQUYgMiBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjJfVElNMyAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMl9USU0xICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTE1ICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFRJTTE1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTE2ICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFRJTTE2IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAzIHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGM19UU0MgICAgICAgICAgICgodWludDhfdCkweDAzVSkgIC8qIFRTQyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjNfSFJUSU0xICAgICAgICAoKHVpbnQ4X3QpMHgwM1UpICAvKiBIUlRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiA0IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGNF9JMkMxICAgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIEkyQzEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjRfVElNMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiA1IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGNV9TUEkxICAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFNQSTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjVfSVIgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBJUiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworLyoqIAorICAqIEBicmllZiAgIEFGIDYgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUY2X1RJTTEgICAgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNl9JUiAgICAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIElSIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiA3IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGN19VU0FSVDEgICAgICAgICgodWludDhfdCkweDA3VSkgIC8qIFVTQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjdfVVNBUlQyICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBVU0FSVDIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY3X1VTQVJUMyAgICAgICAgKCh1aW50OF90KTB4MDdVKSAgLyogVVNBUlQzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGN19HUENPTVA2ICAgICAgICgodWludDhfdCkweDA3VSkgIC8qIEdQQ09NUDYgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiA4IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGOF9HUENPTVAyICAgICAgICAgKCh1aW50OF90KTB4MDhVKSAgLyogR1BDT01QMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjhfR1BDT01QNCAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIEdQQ09NUDQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY4X0dQQ09NUDYgICAgICAgICAoKHVpbnQ4X3QpMHgwOFUpICAvKiBHUENPTVA2IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgOSBzZWxlY3Rpb24gCisgICovIAorI2RlZmluZSBHUElPX0FGOV9DQU4gICAgICAgICAgICgodWludDhfdCkweDA5VSkgIC8qIENBTiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjlfVElNMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwOVUpICAvKiBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY5X1RJTTE1ICAgICAgICAgKCh1aW50OF90KTB4MDlVKSAgLyogVElNMTUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAxMCBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjEwX1RJTTIgICAgICAgICAgICgodWludDhfdCkweEFVKSAgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMTBfVElNMyAgICAgICAgICAgKCh1aW50OF90KTB4QVUpICAvKiBUSU0zIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxMF9USU0xNyAgICAgICAgICAoKHVpbnQ4X3QpMHhBVSkgIC8qIFRJTTE3IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAxMSBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjExX1RJTTEgICAgICAgICAgKCh1aW50OF90KTB4MEJVKSAgLyogVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgMTIgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYxMl9USU0xICAgICAgICAgICgodWludDhfdCkweDBDVSkgIC8qIFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjEyX0hSVElNMSAgICAgICAgKCh1aW50OF90KTB4MENVKSAgLyogSFJUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgMTMgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYxM19PUEFNUDIgICAgICAgICgodWludDhfdCkweDBEVSkgIC8qIE9QQU1QMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMTNfSFJUSU0xICAgICAgICAoKHVpbnQ4X3QpMHgwRFUpICAvKiBIUlRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAxNSBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjE1X0VWRU5UT1VUICAgICAgKCh1aW50OF90KTB4MEZVKSAgLyogRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworI2RlZmluZSBJU19HUElPX0FGKEFGKSAgICAgICAgICAoKChBRikgPD0gKHVpbnQ4X3QpMHgwRFUpIHx8ICgoQUYpID09ICh1aW50OF90KTB4MEZVKSkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNlbmRpZiAvKiBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCAqLworCisjaWYgZGVmaW5lZCAoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQgKFNUTTMyRjMxOHh4KQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNUTTMyRjMwMXg4IC8gU1RNMzJGMzE4eHggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAwIHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGMF9NQ08gICAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIE1DTyAoTUNPMSBhbmQgTUNPMikgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICAgICAqLworI2RlZmluZSBHUElPX0FGMF9SVENfNTBIeiAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFJUQyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgCQkJCQkJCQkgICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfVEFNUEVSICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBUQU1QRVIgKFRBTVBFUl8xIGFuZCBUQU1QRVJfMikgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjBfU1dKICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBTV0ogKFNXRCBhbmQgSlRBRykgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfVFJBQ0UgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBUUkFDRSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDEgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYxX1RJTTIgICAgICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIFRJTTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjFfVElNMTUgICAgICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyogVElNMTUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjFfVElNMTYgICAgICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyogVElNMTYgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjFfVElNMTcgICAgICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyogVElNMTcgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjFfRVZFTlRPVVQgICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyogRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAyIHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGMl9JMkMzICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBJMkMzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTEgICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNMTUgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNMTUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNMiAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgMyBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjNfVFNDICAgICAgICAgICAoKHVpbnQ4X3QpMHgwM1UpICAvKiBUU0MgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUYzX0kyQzMgICAgICAgICAgKCh1aW50OF90KTB4MDNVKSAgLyogSTJDMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjNfVElNMTUgICAgICAgICAoKHVpbnQ4X3QpMHgwM1UpICAvKiBUSU0xNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDQgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUY0X0kyQzEgICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogSTJDMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNF9JMkMyICAgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIEkyQzIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjRfVElNMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY0X1RJTTE2ICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogVElNMTYgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjRfVElNMTcgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBUSU0xNyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgNSBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjVfU1BJMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBTUEkxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY1X1NQSTIgICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogU1BJMi9JMlMyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY1X1NQSTMgICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogU1BJMy9JMlMzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY1X0lSICAgICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogSVIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKy8qKiAKKyAgKiBAYnJpZWYgICBBRiA2IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGNl9USU0xICAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjZfSVIgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNlUpICAvKiBJUiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNl9TUEkyICAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIFNQSTIvSTJTMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNl9TUEkzICAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIFNQSTMvSTJTMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgNyBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjdfVVNBUlQxICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBVU0FSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY3X1VTQVJUMiAgICAgICAgKCh1aW50OF90KTB4MDdVKSAgLyogVVNBUlQyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGN19VU0FSVDMgICAgICAgICgodWludDhfdCkweDA3VSkgIC8qIFVTQVJUMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjdfR1BDT01QNiAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBHUENPTVA2IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgOCBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjhfSTJDMyAgICAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIEkyQzMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY4X0dQQ09NUDIgICAgICAgICAoKHVpbnQ4X3QpMHgwOFUpICAvKiBHUENPTVAyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGOF9HUENPTVA0ICAgICAgICAgKCh1aW50OF90KTB4MDhVKSAgLyogR1BDT01QNCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjhfR1BDT01QNiAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIEdQQ09NUDYgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiA5IHNlbGVjdGlvbiAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUY5X1RJTTEgICAgICAgICAgKCh1aW50OF90KTB4MDlVKSAgLyogVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGOV9USU0xNSAgICAgICAgICgodWludDhfdCkweDA5VSkgIC8qIFRJTTE1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAxMCBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjEwX1RJTTIgICAgICAgICAgICgodWludDhfdCkweEFVKSAgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMTBfVElNMTcgICAgICAgICAgKCh1aW50OF90KTB4QVUpICAvKiBUSU0xNyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgMTEgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYxMV9USU0xICAgICAgICAgICgodWludDhfdCkweDBCVSkgIC8qIFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDEyIHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGMTJfVElNMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwQ1UpICAvKiBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAxNSBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjE1X0VWRU5UT1VUICAgICAgKCh1aW50OF90KTB4MEZVKSAgLyogRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworI2RlZmluZSBJU19HUElPX0FGKEFGKSAgICAgICAgICAoKChBRikgPD0gKHVpbnQ4X3QpMHgwQ1UpIHx8ICgoQUYpID09ICh1aW50OF90KTB4MEZVKSkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNlbmRpZiAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMTh4eCAqLworCisjaWYgZGVmaW5lZCAoU1RNMzJGMzAyeDgpCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1RNMzJGMzAyeDgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIAorICAqIEBicmllZiAgIEFGIDAgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYwX01DTyAgICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogTUNPIChNQ08xIGFuZCBNQ08yKSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1JUQ181MEh6ICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogUlRDIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAJCQkJCQkJCSAgICAgICAqLworI2RlZmluZSBHUElPX0FGMF9UQU1QRVIgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFRBTVBFUiAoVEFNUEVSXzEgYW5kIFRBTVBFUl8yKSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9TV0ogICAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFNXSiAoU1dEIGFuZCBKVEFHKSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgICAgICAqLworI2RlZmluZSBHUElPX0FGMF9UUkFDRSAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFRSQUNFIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgMSBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjFfVElNMiAgICAgICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9USU0xNSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBUSU0xNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9USU0xNiAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBUSU0xNiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9USU0xNyAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBUSU0xNyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9FVkVOVE9VVCAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworLyoqIAorICAqIEBicmllZiAgIEFGIDIgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYyX0kyQzMgICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIEkyQzMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNMSAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMl9USU0xNSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBUSU0xNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMl9USU0yICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBUSU0yIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAzIHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGM19UU0MgICAgICAgICAgICgodWludDhfdCkweDAzVSkgIC8qIFRTQyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjNfSTJDMyAgICAgICAgICAoKHVpbnQ4X3QpMHgwM1UpICAvKiBJMkMzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGM19USU0xNSAgICAgICAgICgodWludDhfdCkweDAzVSkgIC8qIFRJTTE1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgNCBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjRfSTJDMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBJMkMxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY0X0kyQzIgICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogSTJDMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNF9USU0xICAgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjRfVElNMTYgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBUSU0xNiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNF9USU0xNyAgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIFRJTTE3IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiA1IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGNV9TUEkxICAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFNQSTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjVfU1BJMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBTUEkyL0kyUzIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjVfU1BJMyAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBTUEkzL0kyUzMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjVfSVIgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBJUiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworLyoqIAorICAqIEBicmllZiAgIEFGIDYgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUY2X1RJTTEgICAgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNl9JUiAgICAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIElSIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY2X1NQSTIgICAgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogU1BJMi9JMlMyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY2X1NQSTMgICAgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogU1BJMy9JMlMzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiA3IHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGN19VU0FSVDEgICAgICAgICgodWludDhfdCkweDA3VSkgIC8qIFVTQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjdfVVNBUlQyICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBVU0FSVDIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY3X1VTQVJUMyAgICAgICAgKCh1aW50OF90KTB4MDdVKSAgLyogVVNBUlQzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGN19HUENPTVA2ICAgICAgICgodWludDhfdCkweDA3VSkgIC8qIEdQQ09NUDYgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjdfQ0FOICAgICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBDQU4gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDggc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUY4X0kyQzMgICAJICgodWludDhfdCkweDA4VSkgIC8qIEkyQzMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY4X0dQQ09NUDIgICAgICAgICAoKHVpbnQ4X3QpMHgwOFUpICAvKiBHUENPTVAyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGOF9HUENPTVA0ICAgICAgICAgKCh1aW50OF90KTB4MDhVKSAgLyogR1BDT01QNCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjhfR1BDT01QNiAgICAgICAgICgodWludDhfdCkweDA4VSkgIC8qIEdQQ09NUDYgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiA5IHNlbGVjdGlvbiAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUY5X1RJTTEgICAgICAgICAgKCh1aW50OF90KTB4MDlVKSAgLyogVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGOV9USU0xNSAgICAgICAgICgodWludDhfdCkweDA5VSkgIC8qIFRJTTE1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY5X0NBTiAgICAgICAgICAgKCh1aW50OF90KTB4MDlVKSAgLyogQ0FOIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAxMCBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjEwX1RJTTIgICAgICAgICAgICgodWludDhfdCkweEFVKSAgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMTBfVElNMTcgICAgICAgICAgKCh1aW50OF90KTB4QVUpICAvKiBUSU0xNyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKiogCisgICogQGJyaWVmICAgQUYgMTEgc2VsZWN0aW9uICAKKyAgKi8gCisjZGVmaW5lIEdQSU9fQUYxMV9USU0xICAgICAgICAgICgodWludDhfdCkweDBCVSkgIC8qIFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqIAorICAqIEBicmllZiAgIEFGIDEyIHNlbGVjdGlvbiAgCisgICovIAorI2RlZmluZSBHUElPX0FGMTJfVElNMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwQ1UpICAvKiBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKiAKKyAgKiBAYnJpZWYgICBBRiAxNSBzZWxlY3Rpb24gIAorICAqLyAKKyNkZWZpbmUgR1BJT19BRjE1X0VWRU5UT1VUICAgICAgKCh1aW50OF90KTB4MEZVKSAgLyogRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworI2RlZmluZSBJU19HUElPX0FGKEFGKSAgICAgICAgICAoKChBRikgPD0gKHVpbnQ4X3QpMHgwQ1UpIHx8ICgoQUYpID09ICh1aW50OF90KTB4MEZVKSkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4OCAqLworLyoqCisgICogQH0KKyAgKi8gCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEdQSU9FeF9FeHBvcnRlZF9NYWNyb3MgR1BJT0V4IEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT0V4X0dldF9Qb3J0X0luZGV4IEdQSU9FeF9HZXQgUG9ydCBJbmRleAorKiBAeworICAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorI2RlZmluZSBHUElPX0dFVF9JTkRFWChfX0dQSU94X18pICAgICgoKF9fR1BJT3hfXykgPT0gKEdQSU9BKSk/IDBVIDpcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19HUElPeF9fKSA9PSAoR1BJT0IpKT8gMVUgOlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0dQSU94X18pID09IChHUElPQykpPyAyVSA6XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fR1BJT3hfXykgPT0gKEdQSU9EKSk/IDNVIDogNVUpCisjZW5kaWYgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisjZGVmaW5lIEdQSU9fR0VUX0lOREVYKF9fR1BJT3hfXykgICAgKCgoX19HUElPeF9fKSA9PSAoR1BJT0EpKT8gMFUgOlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0dQSU94X18pID09IChHUElPQikpPyAxVSA6XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fR1BJT3hfXykgPT0gKEdQSU9DKSk/IDJVIDpcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19HUElPeF9fKSA9PSAoR1BJT0QpKT8gM1UgOlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0dQSU94X18pID09IChHUElPRSkpPyA0VSA6IDVVKQorI2VuZGlmIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggICAgICAgICAgICAgICAgICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisjZGVmaW5lIEdQSU9fR0VUX0lOREVYKF9fR1BJT3hfXykgICAgKCgoX19HUElPeF9fKSA9PSAoR1BJT0EpKT8gMFUgOlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0dQSU94X18pID09IChHUElPQikpPyAxVSA6XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fR1BJT3hfXykgPT0gKEdQSU9DKSk/IDJVIDpcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19HUElPeF9fKSA9PSAoR1BJT0QpKT8gM1UgOlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0dQSU94X18pID09IChHUElPRSkpPyA0VSA6XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fR1BJT3hfXykgPT0gKEdQSU9GKSk/IDVVIDpcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19HUElPeF9fKSA9PSAoR1BJT0cpKT8gNlUgOiA3VSkKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyRjN4eF9IQUxfR1BJT19FWF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2hhbF9ocnRpbS5oIGIvSW5jL3N0bTMyZjN4eF9oYWxfaHJ0aW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWVjYmIwCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjN4eF9oYWxfaHJ0aW0uaApAQCAtMCwwICsxLDM2MjEgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX2hydGltLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIEhSVElNIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0hBTF9IUlRJTV9ICisjZGVmaW5lIF9fU1RNMzJGM3h4X0hBTF9IUlRJTV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhSVElNMSkKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEhSVElNIEhSVElNCisgICogQHsKKyAgKi8gCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorLyoqIEBhZGR0b2dyb3VwIEhSVElNX0V4cG9ydGVkX0NvbnN0YW50cyBIUlRJTSBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworLyoqIEBkZWZncm91cCBIUlRJTV9NYXhfVGltZXIgSFJUSU0gTWF4IFRpbWVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTUFYX0hSVElNX1RJTUVSIDZVCisvKioKKyAgKiBAfQorICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9FeHBvcnRlZF9UeXBlcyBIUlRJTSBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKiAKKyAgKiBAYnJpZWYgIEhSVElNIENvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24gLSBUaW1lIGJhc2UgcmVsYXRlZCBwYXJhbWV0ZXJzCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBIUlRJTUludGVycnVwdFJlc3F1ZXN0czsgIC8qITwgU3BlY2lmaWVzIHdoaWNoIGludGVycnVwdHMgcmVxdWVzdHMgbXVzdCBlbmFibGVkIGZvciB0aGUgSFJUSU0gaW5zdGFuY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mICBAcmVmIEhSVElNX0NvbW1vbl9JbnRlcnJ1cHRfRW5hYmxlICovCisgIHVpbnQzMl90IFN5bmNPcHRpb25zOyAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgaG93IHRoZSBIUlRJTSBpbnN0YW5jZSBoYW5kbGVzIHRoZSBleHRlcm5hbCBzeW5jaHJvbml6YXRpb24gc2lnbmFscy4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgSFJUSU0gaW5zdGFuY2UgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gYWN0IGFzIGEgc2xhdmUgKHdhaXRpbmcgZm9yIGEgdHJpZ2dlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHN5bmNocm9uaXplZCkgb3IgYSBtYXN0ZXIgKGdlbmVyYXRpbmcgYSBzeW5jaHJvbml6YXRpb24gc2lnbmFsKSBvciBib3RoLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgQHJlZiBIUlRJTV9TeW5jaHJvbml6YXRpb25fT3B0aW9ucy4qLyAKKyAgdWludDMyX3QgU3luY0lucHV0U291cmNlOyAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZXh0ZXJuYWwgc3luY2hyb25pemF0aW9uIGlucHV0IHNvdXJjZSAoc2lnbmlmaWNhbnQgb25seSB3aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgSFJUSU0gaW5zdGFuY2UgaXMgY29uZmlndXJlZCBhcyBhIHNsYXZlKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSFJUSU1fU3luY2hyb25pemF0aW9uX0lucHV0X1NvdXJjZS4gKi8KKyAgdWludDMyX3QgU3luY091dHB1dFNvdXJjZTsgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgc291cmNlIGFuZCBldmVudCB0byBiZSBzZW50IG9uIHRoZSBleHRlcm5hbCBzeW5jaHJvbml6YXRpb24gb3V0cHV0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2lnbmlmaWNhbnQgb25seSB3aGVuIHRoZSBIUlRJTSBpbnN0YW5jZSBpcyBjb25maWd1cmVkIGFzIGEgbWFzdGVyKS4gIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBIUlRJTV9TeW5jaHJvbml6YXRpb25fT3V0cHV0X1NvdXJjZSAqLworICB1aW50MzJfdCBTeW5jT3V0cHV0UG9sYXJpdHk7ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjb25kaXRpb25pbmcgb2YgdGhlIGV2ZW50IHRvIGJlIHNlbnQgb24gdGhlIGV4dGVybmFsIHN5bmNocm9uaXphdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0cyAoc2lnbmlmaWNhbnQgb25seSB3aGVuIHRoZSBIUlRJTSBpbnN0YW5jZSBpcyBjb25maWd1cmVkIGFzIGEgbWFzdGVyKS4gIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBIUlRJTV9TeW5jaHJvbml6YXRpb25fT3V0cHV0X1BvbGFyaXR5ICovCit9IEhSVElNX0luaXRUeXBlRGVmOworCisvKiogCisgICogQGJyaWVmICBIQUwgU3RhdGUgc3RydWN0dXJlcyBkZWZpbml0aW9uICAKKyAgKi8gCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX0hSVElNX1NUQVRFX1JFQURZICAgICAgPSAweDAxVSwgICAgLyohPCBQZXJpcGhlcmFsIEluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICAgICAgICAgICAqLworICBIQUxfSFJUSU1fU1RBVEVfQlVTWSAgICAgICA9IDB4MDJVLCAgICAvKiE8IGFuIGludGVybmFsIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgICAgICAgICAgICovICAgCisgIEhBTF9IUlRJTV9TVEFURV9USU1FT1VUICAgID0gMHgwNlUsICAgIC8qITwgVGltZW91dCBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIAorICBIQUxfSFJUSU1fU1RBVEVfRVJST1IgICAgICA9IDB4MDdVLCAgICAvKiE8IEVycm9yIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorfSBIQUxfSFJUSU1fU3RhdGVUeXBlRGVmOworCisvKiogCisgICogQGJyaWVmIEhSVElNIFRpbWVyIFN0cnVjdHVyZSBkZWZpbml0aW9uICAKKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IENhcHR1cmVUcmlnZ2VyMTsgICAgICAgLyohPCBFdmVudChzKSB0cmlnZ2VyaW5nIGNhcHR1cmUgdW5pdCAxLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hlbiB0aGUgdGltZXIgb3BlcmF0ZXMgaW4gU2ltcGxlIG1vZGUsIHRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSFJUSU1fRXh0ZXJuYWxfRXZlbnRfQ2hhbm5lbHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGVuIHRoZSB0aW1lciBvcGVyYXRlcyBpbiBXYXZlZm9ybSBtb2RlLCB0aGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiBAcmVmIEhSVElNX0NhcHR1cmVfVW5pdF9UcmlnZ2VyLiAqLworICB1aW50MzJfdCBDYXB0dXJlVHJpZ2dlcjI7ICAgICAgIC8qITwgRXZlbnQocykgdHJpZ2dlcmluZyBjYXB0dXJlIHVuaXQgMi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoZW4gdGhlIHRpbWVyIG9wZXJhdGVzIGluIFNpbXBsZSBtb2RlLCB0aGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhSVElNX0V4dGVybmFsX0V2ZW50X0NoYW5uZWxzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hlbiB0aGUgdGltZXIgb3BlcmF0ZXMgaW4gV2F2ZWZvcm0gbW9kZSwgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgQHJlZiBIUlRJTV9DYXB0dXJlX1VuaXRfVHJpZ2dlci4gKi8KKyAgdWludDMyX3QgSW50ZXJydXB0UmVxdWVzdHM7ICAgICAvKiE8IEludGVycnVwdHMgcmVxdWVzdHMgZW5hYmxlZCBmb3IgdGhlIHRpbWVyLiAqLworICB1aW50MzJfdCBETUFSZXF1ZXN0czsgICAgICAgICAgIC8qITwgRE1BIHJlcXVlc3RzIGVuYWJsZWQgZm9yIHRoZSB0aW1lci4gKi8KKyAgdWludDMyX3QgRE1BU3JjQWRkcmVzczsgICAgICAgICAgLyohPCBBZGRyZXNzIG9mIHRoZSBzb3VyY2UgYWRkcmVzcyBvZiB0aGUgRE1BIHRyYW5zZmVyLiAqLworICB1aW50MzJfdCBETUFEc3RBZGRyZXNzOyAgICAgICAgICAvKiE8IEFkZHJlc3Mgb2YgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2YgdGhlIERNQSB0cmFuc2Zlci4gKi8KKyAgdWludDMyX3QgRE1BU2l6ZTsgICAgICAgICAgICAgICAgLyohPCBTaXplIG9mIHRoZSBETUEgdHJhbnNmZXIgKi8KK30gSFJUSU1fVGltZXJQYXJhbVR5cGVEZWY7CisKKy8qKiAKKyAgKiBAYnJpZWYgIEhSVElNIEhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLyAKK3R5cGVkZWYgc3RydWN0IF9fSFJUSU1fSGFuZGxlVHlwZURlZgoreworICBIUlRJTV9UeXBlRGVmICogICAgICAgICAgICAgIEluc3RhbmNlOyAgICAgICAgICAgICAgICAgICAgIC8qITwgUmVnaXN0ZXIgYmFzZSBhZGRyZXNzICovIAorCisgIEhSVElNX0luaXRUeXBlRGVmICAgICAgICAgICAgSW5pdDsgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBIUlRJTSByZXF1aXJlZCBwYXJhbWV0ZXJzICovCisgIAorICBIUlRJTV9UaW1lclBhcmFtVHlwZURlZiAgICAgIFRpbWVyUGFyYW1bTUFYX0hSVElNX1RJTUVSXTsgIC8qITwgSFJUSU0gdGltZXJzIC0gaW5jbHVkaW5nIHRoZSBtYXN0ZXIgLSBwYXJhbWV0ZXJzICovCisgIAorICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICAgICAgIExvY2s7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTG9ja2luZyBvYmplY3QgICAgICAgICAgKi8KKworICBfX0lPIEhBTF9IUlRJTV9TdGF0ZVR5cGVEZWYgIFN0YXRlOyAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSFJUSU0gY29tbXVuaWNhdGlvbiBzdGF0ZSAqLworICAKKyAgRE1BX0hhbmRsZVR5cGVEZWYgKiAgICAgICAgICBoZG1hTWFzdGVyOyAgICAgICAgICAgICAgICAgICAvKiE8IE1hc3RlciB0aW1lciBETUEgaGFuZGxlIHBhcmFtZXRlcnMgKi8gICAgCisgIERNQV9IYW5kbGVUeXBlRGVmICogICAgICAgICAgaGRtYVRpbWVyQTsgICAgICAgICAgICAgICAgICAgLyohPCBUaW1lciBBIERNQSBoYW5kbGUgcGFyYW1ldGVycyAqLyAgICAKKyAgRE1BX0hhbmRsZVR5cGVEZWYgKiAgICAgICAgICBoZG1hVGltZXJCOyAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWVyIEIgRE1BIGhhbmRsZSBwYXJhbWV0ZXJzICovCisgIERNQV9IYW5kbGVUeXBlRGVmICogICAgICAgICAgaGRtYVRpbWVyQzsgICAgICAgICAgICAgICAgICAgLyohPCBUaW1lciBDIERNQSBoYW5kbGUgcGFyYW1ldGVycyAqLworICBETUFfSGFuZGxlVHlwZURlZiAqICAgICAgICAgIGhkbWFUaW1lckQ7ICAgICAgICAgICAgICAgICAgIC8qITwgVGltZXIgRCBETUEgaGFuZGxlIHBhcmFtZXRlcnMgKi8KKyAgRE1BX0hhbmRsZVR5cGVEZWYgKiAgICAgICAgICBoZG1hVGltZXJFOyAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWVyIEUgRE1BIGhhbmRsZSBwYXJhbWV0ZXJzICovCit9IEhSVElNX0hhbmRsZVR5cGVEZWY7CisKKy8qKiAKKyAgKiBAYnJpZWYgIFNpbXBsZSBvdXRwdXQgY29tcGFyZSBtb2RlIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBQZXJpb2Q7ICAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSB0aW1lciBwZXJpb2QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcGVyaW9kIHZhbHVlIG11c3QgYmUgYWJvdmUgMyBwZXJpb2RzIG9mIHRoZSBmSFJUSU0gY2xvY2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhpbXVtIHZhbHVlIGlzID0gMHhGRkRGVSAqLworICB1aW50MzJfdCBSZXBldGl0aW9uQ291bnRlcjsgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSB0aW1lciByZXBldGl0aW9uIHBlcmlvZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHhGRi4gKi8gCisgIHVpbnQzMl90IFByZXNjYWxlclJhdGlvOyAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHRpbWVyIGNsb2NrIHByZXNjYWxlciByYXRpby4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgSFJUSU1fUHJlc2NhbGVyX1JhdGlvICAgKi8gICAgICAgICAgIAorICB1aW50MzJfdCBNb2RlOyAgICAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjb3VudGVyIG9wZXJhdGluZyBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBvZiBAcmVmIEhSVElNX0NvdW50ZXJfT3BlcmF0aW5nX01vZGUgICAqLworfSBIUlRJTV9UaW1lQmFzZUNmZ1R5cGVEZWY7CisKKy8qKiAKKyAgKiBAYnJpZWYgIFNpbXBsZSBvdXRwdXQgY29tcGFyZSBtb2RlIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBNb2RlOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgb3V0cHV0IGNvbXBhcmUgbW9kZSAodG9nZ2xlLCBhY3RpdmUsIGluYWN0aXZlKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIG9mIEByZWYgSFJUSU1fU2ltcGxlX09DX01vZGUgKi8gCisgIHVpbnQzMl90IFB1bHNlOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjb21wYXJlIHZhbHVlIHRvIGJlIGxvYWRlZCBpbnRvIHRoZSBDb21wYXJlIFJlZ2lzdGVyLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgY29tcGFyZSB2YWx1ZSBtdXN0IGJlIGFib3ZlIG9yIGVxdWFsIHRvIDMgcGVyaW9kcyBvZiB0aGUgZkhSVElNIGNsb2NrICovCisgIHVpbnQzMl90IFBvbGFyaXR5OyAgIC8qITwgU3BlY2lmaWVzIHRoZSBvdXRwdXQgcG9sYXJpdHkuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgb2YgQHJlZiBIUlRJTV9PdXRwdXRfUG9sYXJpdHkgKi8KKyAgdWludDMyX3QgSWRsZUxldmVsOyAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgb3V0cHV0IGxldmVsIGlzIGFjdGl2ZSBvciBpbmFjdGl2ZSB3aGVuIGluIElETEUgc3RhdGUuICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgSFJUSU1fT3V0cHV0X0lETEVfTGV2ZWwgKi8KK30gSFJUSU1fU2ltcGxlT0NDaGFubmVsQ2ZnVHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiAgU2ltcGxlIFBXTSBvdXRwdXQgbW9kZSBjb25maWd1cmF0aW9uIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgUHVsc2U7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGNvbXBhcmUgdmFsdWUgdG8gYmUgbG9hZGVkIGludG8gdGhlIENvbXBhcmUgUmVnaXN0ZXIuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBjb21wYXJlIHZhbHVlIG11c3QgYmUgYWJvdmUgb3IgZXF1YWwgdG8gMyBwZXJpb2RzIG9mIHRoZSBmSFJUSU0gY2xvY2sgKi8KKyAgdWludDMyX3QgUG9sYXJpdHk7ICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgb3V0cHV0IHBvbGFyaXR5LiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgb2YgQHJlZiBIUlRJTV9PdXRwdXRfUG9sYXJpdHkgKi8KKyAgdWludDMyX3QgSWRsZUxldmVsOyAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBvdXRwdXQgbGV2ZWwgaXMgYWN0aXZlIG9yIGluYWN0aXZlIHdoZW4gaW4gSURMRSBzdGF0ZS4gIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBvZiBAcmVmIEhSVElNX091dHB1dF9JRExFX0xldmVsICovCit9IEhSVElNX1NpbXBsZVBXTUNoYW5uZWxDZmdUeXBlRGVmOworCisvKiogCisgICogQGJyaWVmICBTaW1wbGUgY2FwdHVyZSBtb2RlIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBFdmVudDsgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGV4dGVybmFsIGV2ZW50IHRyaWdnZXJpbmcgdGhlIGNhcHR1cmUuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55ICdFRVZ4JyB2YWx1ZSBvZiBAcmVmIEhSVElNX0V4dGVybmFsX0V2ZW50X0NoYW5uZWxzICovCisgIHVpbnQzMl90IEV2ZW50UG9sYXJpdHk7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcG9sYXJpdHkgb2YgdGhlIGV4dGVybmFsIGV2ZW50IChpbiBjYXNlIG9mIGxldmVsIHNlbnNpdGl2aXR5KS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSFJUSU1fRXh0ZXJuYWxfRXZlbnRfUG9sYXJpdHkgKi8gCisgIHVpbnQzMl90IEV2ZW50U2Vuc2l0aXZpdHk7ICAvKiE8IFNwZWNpZmllcyB0aGUgc2Vuc2l0aXZpdHkgb2YgdGhlIGV4dGVybmFsIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBIUlRJTV9FeHRlcm5hbF9FdmVudF9TZW5zaXRpdml0eSAqLyAKKyAgdWludDMyX3QgRXZlbnRGaWx0ZXI7ICAgICAgIC8qITwgRGVmaW5lcyB0aGUgZnJlcXVlbmN5IHVzZWQgdG8gc2FtcGxlIHRoZSBFeHRlcm5hbCBFdmVudCBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgZGlnaXRhbCBmaWx0ZXIuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhSVElNX0V4dGVybmFsX0V2ZW50X0ZpbHRlciAqLyAKK30gSFJUSU1fU2ltcGxlQ2FwdHVyZUNoYW5uZWxDZmdUeXBlRGVmOworCisvKiogCisgICogQGJyaWVmICBTaW1wbGUgT25lIFB1bHNlIG1vZGUgY29uZmlndXJhdGlvbiBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IFB1bHNlOyAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgY29tcGFyZSB2YWx1ZSB0byBiZSBsb2FkZWQgaW50byB0aGUgQ29tcGFyZSBSZWdpc3Rlci4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBjb21wYXJlIHZhbHVlIG11c3QgYmUgYWJvdmUgb3IgZXF1YWwgdG8gMyBwZXJpb2RzIG9mIHRoZSBmSFJUSU0gY2xvY2sgKi8KKyAgdWludDMyX3QgT3V0cHV0UG9sYXJpdHk7ICAgIC8qITwgU3BlY2lmaWVzIHRoZSBvdXRwdXQgcG9sYXJpdHkuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgSFJUSU1fT3V0cHV0X1BvbGFyaXR5ICovCisgIHVpbnQzMl90IE91dHB1dElkbGVMZXZlbDsgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBvdXRwdXQgbGV2ZWwgaXMgYWN0aXZlIG9yIGluYWN0aXZlIHdoZW4gaW4gSURMRSBzdGF0ZS4gIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgSFJUSU1fT3V0cHV0X0lETEVfTGV2ZWwgKi8KKyAgdWludDMyX3QgRXZlbnQ7ICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBleHRlcm5hbCBldmVudCB0cmlnZ2VyaW5nIHRoZSBwdWxzZSBnZW5lcmF0aW9uLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSAnRUVWeCcgdmFsdWUgb2YgQHJlZiBIUlRJTV9FeHRlcm5hbF9FdmVudF9DaGFubmVscyAqLworICB1aW50MzJfdCBFdmVudFBvbGFyaXR5OyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHBvbGFyaXR5IG9mIHRoZSBleHRlcm5hbCBldmVudCAoaW4gY2FzZSBvZiBsZXZlbCBzZW5zaXRpdml0eSkuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhSVElNX0V4dGVybmFsX0V2ZW50X1BvbGFyaXR5ICovIAorICB1aW50MzJfdCBFdmVudFNlbnNpdGl2aXR5OyAgLyohPCBTcGVjaWZpZXMgdGhlIHNlbnNpdGl2aXR5IG9mIHRoZSBleHRlcm5hbCBldmVudC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSFJUSU1fRXh0ZXJuYWxfRXZlbnRfU2Vuc2l0aXZpdHkuICovIAorICB1aW50MzJfdCBFdmVudEZpbHRlcjsgICAgICAgLyohPCBEZWZpbmVzIHRoZSBmcmVxdWVuY3kgdXNlZCB0byBzYW1wbGUgdGhlIEV4dGVybmFsIEV2ZW50IGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBkaWdpdGFsIGZpbHRlci4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSFJUSU1fRXh0ZXJuYWxfRXZlbnRfRmlsdGVyICovIAorfSBIUlRJTV9TaW1wbGVPbmVQdWxzZUNoYW5uZWxDZmdUeXBlRGVmOworCisvKiogCisgICogQGJyaWVmICBUaW1lciBjb25maWd1cmF0aW9uIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgSW50ZXJydXB0UmVxdWVzdHM7ICAgICAgLyohPCBSZWxldmFudCBmb3IgYWxsIEhSVElNIHRpbWVycywgaW5jbHVkaW5nIHRoZSBtYXN0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgd2hpY2ggaW50ZXJydXB0cyByZXF1ZXN0cyBtdXN0IGVuYWJsZWQgZm9yIHRoZSB0aW1lci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgIEByZWYgSFJUSU1fTWFzdGVyX0ludGVycnVwdF9FbmFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIEByZWYgSFJUSU1fVGltaW5nX1VuaXRfSW50ZXJydXB0X0VuYWJsZSAqLworICB1aW50MzJfdCBETUFSZXF1ZXN0czsgICAgICAgICAgICAvKiE8IFJlbGV2YW50IGZvciBhbGwgSFJUSU0gdGltZXJzLCBpbmNsdWRpbmcgdGhlIG1hc3Rlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB3aGljaCBETUEgcmVxdWVzdHMgbXVzdCBiZSBlbmFibGVkIGZvciB0aGUgdGltZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mICBAcmVmIEhSVElNX01hc3Rlcl9ETUFfUmVxdWVzdF9FbmFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIEByZWYgSFJUSU1fVGltaW5nX1VuaXRfRE1BX1JlcXVlc3RfRW5hYmxlICovCisgIHVpbnQzMl90IERNQVNyY0FkZHJlc3M7ICAgICAgICAgIC8qITwgUmVsZXZhbnQgZm9yIGFsbCBIUlRJTSB0aW1lcnMsIGluY2x1ZGluZyB0aGUgbWFzdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBhZGRyZXNzIG9mIHRoZSBzb3VyY2UgYWRkcmVzcyBvZiB0aGUgRE1BIHRyYW5zZmVyICovCisgIHVpbnQzMl90IERNQURzdEFkZHJlc3M7ICAgICAgICAgIC8qITwgUmVsZXZhbnQgZm9yIGFsbCBIUlRJTSB0aW1lcnMsIGluY2x1ZGluZyB0aGUgbWFzdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBhZGRyZXNzIG9mIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIG9mIHRoZSBETUEgdHJhbnNmZXIgKi8KKyAgdWludDMyX3QgRE1BU2l6ZTsgICAgICAgICAgICAgICAgLyohPCBSZWxldmFudCBmb3IgYWxsIEhSVElNIHRpbWVycywgaW5jbHVkaW5nIHRoZSBtYXN0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIERNQSB0cmFuc2ZlciAqLworICB1aW50MzJfdCBIYWxmTW9kZUVuYWJsZTsgICAgICAgICAvKiE8IFJlbGV2YW50IGZvciBhbGwgSFJUSU0gdGltZXJzLCBpbmNsdWRpbmcgdGhlIG1hc3Rlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgaGFsZiBtb2RlIGlzIGVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgSFJUSU1fSGFsZl9Nb2RlX0VuYWJsZSAgKi8KKyAgdWludDMyX3QgU3RhcnRPblN5bmM7ICAgICAgICAgICAgLyohPCBSZWxldmFudCBmb3IgYWxsIEhSVElNIHRpbWVycywgaW5jbHVkaW5nIHRoZSBtYXN0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGltZXIgaXMgcmVzZXQgYnkgYSByaXNpbmcgZWRnZSBvbiB0aGUgc3luY2hyb25pemF0aW9uIGlucHV0ICh3aGVuIGVuYWJsZWQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgb2YgQHJlZiBIUlRJTV9TdGFydF9Pbl9TeW5jX0lucHV0X0V2ZW50ICAqLworICB1aW50MzJfdCBSZXNldE9uU3luYzsgICAgICAgICAgICAvKiE8IFJlbGV2YW50IGZvciBhbGwgSFJUSU0gdGltZXJzLCBpbmNsdWRpbmcgdGhlIG1hc3Rlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGltZXIgaXMgcmVzZXQgYnkgYSByaXNpbmcgZWRnZSBvbiB0aGUgc3luY2hyb25pemF0aW9uIGlucHV0ICh3aGVuIGVuYWJsZWQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgb2YgQHJlZiBIUlRJTV9SZXNldF9Pbl9TeW5jX0lucHV0X0V2ZW50ICAqLworICB1aW50MzJfdCBEQUNTeW5jaHJvOyAgICAgICAgICAgICAvKiE8IFJlbGV2YW50IGZvciBhbGwgSFJUSU0gdGltZXJzLCBpbmNsdWRpbmcgdGhlIG1hc3Rlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGEgREFDIHN5bmNocm9uaXphdGlvbiBldmVudCBpcyBnZW5lcmF0ZWQuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgb2YgQHJlZiBIUlRJTV9EQUNfU3luY2hyb25pemF0aW9uICAgKi8KKyAgdWludDMyX3QgUHJlbG9hZEVuYWJsZTsgICAgICAgICAgLyohPCBSZWxldmFudCBmb3IgYWxsIEhSVElNIHRpbWVycywgaW5jbHVkaW5nIHRoZSBtYXN0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHJlZ2lzdGVyIHByZWxvYWQgaXMgZW5hYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgSFJUSU1fUmVnaXN0ZXJfUHJlbG9hZF9FbmFibGUgICovCisgIHVpbnQzMl90IFVwZGF0ZUdhdGluZzsgICAgICAgICAgIC8qITwgUmVsZXZhbnQgZm9yIGFsbCBIUlRJTSB0aW1lcnMsIGluY2x1ZGluZyB0aGUgbWFzdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBob3cgdGhlIHVwZGF0ZSBvY2N1cnMgd2l0aCByZXNwZWN0IHRvIGEgYnVyc3QgRE1BIHRyYW5zYWN0aW9uIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlIGVuYWJsZSBpbnB1dHMgKFNsYXZlIHRpbWVycyBvbmx5KS4gIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgb2YgQHJlZiBIUlRJTV9VcGRhdGVfR2F0aW5nICAgKi8KKyAgdWludDMyX3QgQnVyc3RNb2RlOyAgICAgICAgICAgICAgLyohPCBSZWxldmFudCBmb3IgYWxsIEhSVElNIHRpbWVycywgaW5jbHVkaW5nIHRoZSBtYXN0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGhvdyB0aGUgdGltZXIgYmVoYXZlcyBkdXJpbmcgYSBidXJzdCBtb2RlIG9wZXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgSFJUSU1fVGltZXJfQnVyc3RfTW9kZSAgKi8KKyAgdWludDMyX3QgUmVwZXRpdGlvblVwZGF0ZTsgICAgICAgLyohPCBSZWxldmFudCBmb3IgYWxsIEhSVElNIHRpbWVycywgaW5jbHVkaW5nIHRoZSBtYXN0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHJlZ2lzdGVycyB1cGRhdGUgaXMgdHJpZ2dlcmVkIGJ5IHRoZSByZXBldGl0aW9uIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgSFJUSU1fVGltZXJfUmVwZXRpdGlvbl9VcGRhdGUgKi8KKyAgdWludDMyX3QgUHVzaFB1bGw7ICAgICAgICAgICAgICAgLyohPCBSZWxldmFudCBmb3IgVGltZXIgQSB0byBUaW1lciBFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGUgcHVzaC1wdWxsIG1vZGUgaXMgZW5hYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgSFJUSU1fVGltZXJfUHVzaF9QdWxsX01vZGUgKi8KKyAgdWludDMyX3QgRmF1bHRFbmFibGU7ICAgICAgICAgICAgLyohPCBSZWxldmFudCBmb3IgVGltZXIgQSB0byBUaW1lciBFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB3aGljaCBmYXVsdCBjaGFubmVscyBhcmUgZW5hYmxlZCBmb3IgdGhlIHRpbWVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIEByZWYgSFJUSU1fVGltZXJfRmF1bHRfRW5hYmxpbmcgICovCisgIHVpbnQzMl90IEZhdWx0TG9jazsgICAgICAgICAgICAgIC8qITwgUmVsZXZhbnQgZm9yIFRpbWVyIEEgdG8gVGltZXIgRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgZmF1bHQgZW5hYmxpbmcgc3RhdHVzIGlzIHdyaXRlIHByb3RlY3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhSVElNX1RpbWVyX0ZhdWx0X0xvY2sgKi8KKyAgdWludDMyX3QgRGVhZFRpbWVJbnNlcnRpb247ICAgICAgLyohPCBSZWxldmFudCBmb3IgVGltZXIgQSB0byBUaW1lciBFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCBkZWFkLXRpbWUgaW5zZXJ0aW9uIGlzIGVuYWJsZWQgZm9yIHRoZSB0aW1lci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhSVElNX1RpbWVyX0RlYWR0aW1lX0luc2VydGlvbiAqLworICB1aW50MzJfdCBEZWxheWVkUHJvdGVjdGlvbk1vZGU7ICAvKiE8IFJlbGV2YW50IGZvciBUaW1lciBBIHRvIFRpbWVyIEUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBkZWxheWVkIHByb3RlY3Rpb24gbW9kZS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBIUlRJTV9UaW1lcl9EZWxheWVkX1Byb3RlY3Rpb25fTW9kZSAqLworICB1aW50MzJfdCBVcGRhdGVUcmlnZ2VyOyAgICAgICAgICAvKiE8IFJlbGV2YW50IGZvciBUaW1lciBBIHRvIFRpbWVyIEUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHNvdXJjZShzKSB0cmlnZ2VyaW5nIHRoZSB0aW1lciByZWdpc3RlcnMgdXBkYXRlLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiBAcmVmIEhSVElNX1RpbWVyX1VwZGF0ZV9UcmlnZ2VyICovCisgIHVpbnQzMl90IFJlc2V0VHJpZ2dlcjsgICAgICAgICAgIC8qITwgUmVsZXZhbnQgZm9yIFRpbWVyIEEgdG8gVGltZXIgRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgc291cmNlKHMpIHRyaWdnZXJpbmcgdGhlIHRpbWVyIGNvdW50ZXIgcmVzZXQuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIEByZWYgSFJUSU1fVGltZXJfUmVzZXRfVHJpZ2dlciAqLworICB1aW50MzJfdCBSZXNldFVwZGF0ZTsgICAgICAgICAgIC8qITwgIFJlbGV2YW50IGZvciBUaW1lciBBIHRvIFRpbWVyIEUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHJlZ2lzdGVycyB1cGRhdGUgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIHRpbWVyIGNvdW50ZXIgaXMgcmVzZXQuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSFJUSU1fVGltZXJfUmVzZXRfVXBkYXRlICovCit9IEhSVElNX1RpbWVyQ2ZnVHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiAgQ29tcGFyZSB1bml0IGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBDb21wYXJlVmFsdWU7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGNvbXBhcmUgdmFsdWUgb2YgdGhlIHRpbWVyIGNvbXBhcmUgdW5pdC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtaW5pbXVtIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDMgcGVyaW9kcyBvZiB0aGUgZkhSVElNIGNsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWF4aW11bSB2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAweEZGRkZVIC0gMSBwZXJpb2RzIG9mIHRoZSBmSFJUSU0gY2xvY2sgKi8KKyAgdWludDMyX3QgQXV0b0RlbGF5ZWRNb2RlOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBhdXRvIGRlbGF5ZWQgbW9kZSBmb3IgY29tcGFyZSB1bml0IDIgb3IgNC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSFJUSU1fQ29tcGFyZV9Vbml0X0F1dG9fRGVsYXllZF9Nb2RlICovCisgIHVpbnQzMl90IEF1dG9EZWxheWVkVGltZW91dDsgICAvKiE8IFNwZWNpZmllcyBjb21wYXJlIHZhbHVlIGZvciB0aW1pbmcgdW5pdCAxIG9yIDMgd2hlbiBhdXRvIGRlbGF5ZWQgbW9kZSB3aXRoIHRpbWUgb3V0IGlzIHNlbGVjdGVkLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGFyZVZhbHVlICsgIEF1dG9EZWxheWVkVGltZW91dCBtdXN0IGJlIGxlc3MgdGhhbiAweEZGRkZVICovCit9IEhSVElNX0NvbXBhcmVDZmdUeXBlRGVmOworCisvKiogCisgICogQGJyaWVmICBDYXB0dXJlIHVuaXQgY29uZmlndXJhdGlvbiBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IFRyaWdnZXI7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHNvdXJjZShzKSB0cmlnZ2VyaW5nIHRoZSBjYXB0dXJlLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiBAcmVmIEhSVElNX0NhcHR1cmVfVW5pdF9UcmlnZ2VyICovCit9IEhSVElNX0NhcHR1cmVDZmdUeXBlRGVmOworCisvKiogCisgICogQGJyaWVmICBPdXRwdXQgY29uZmlndXJhdGlvbiBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IFBvbGFyaXR5OyAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG91dHB1dCBwb2xhcml0eS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgb2YgQHJlZiBIUlRJTV9PdXRwdXRfUG9sYXJpdHkgKi8KKyAgdWludDMyX3QgU2V0U291cmNlOyAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZXZlbnQocykgdHJhbnNpdGlvbmluZyB0aGUgb3V0cHV0IGZyb20gaXRzIGluYWN0aXZlIGxldmVsIHRvIGl0cyBhY3RpdmUgbGV2ZWwuICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIEByZWYgSFJUSU1fT3V0cHV0X1NldF9Tb3VyY2UgKi8KKyAgdWludDMyX3QgUmVzZXRTb3VyY2U7ICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZXZlbnQocykgdHJhbnNpdGlvbmluZyB0aGUgb3V0cHV0IGZyb20gaXRzIGFjdGl2ZSBsZXZlbCB0byBpdHMgaW5hY3RpdmUgbGV2ZWwuICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIEByZWYgSFJUSU1fT3V0cHV0X1Jlc2V0X1NvdXJjZSAqLworICB1aW50MzJfdCBJZGxlTW9kZTsgICAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoZSBvdXRwdXQgaXMgYWZmZWN0ZWQgYnkgYSBidXJzdCBtb2RlIG9wZXJhdGlvbi4gIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBvZiBAcmVmIEhSVElNX091dHB1dF9JZGxlX01vZGUgKi8KKyAgdWludDMyX3QgSWRsZUxldmVsOyAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBvdXRwdXQgbGV2ZWwgaXMgYWN0aXZlIG9yIGluYWN0aXZlIHdoZW4gaW4gSURMRSBzdGF0ZS4gIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBvZiBAcmVmIEhSVElNX091dHB1dF9JRExFX0xldmVsICovCisgIHVpbnQzMl90IEZhdWx0TGV2ZWw7ICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgb3V0cHV0IGxldmVsIGlzIGFjdGl2ZSBvciBpbmFjdGl2ZSB3aGVuIGluIEZBVUxUIHN0YXRlLiAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgSFJUSU1fT3V0cHV0X0ZBVUxUX0xldmVsICovCisgIHVpbnQzMl90IENob3BwZXJNb2RlRW5hYmxlOyAgICAgICAgICAgLyohPCBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGNob3BwZXIgbW9kZSBpcyBlbmFibGVkIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBvZiBAcmVmIEhSVElNX091dHB1dF9DaG9wcGVyX01vZGVfRW5hYmxlICovCisgIHVpbnQzMl90IEJ1cnN0TW9kZUVudHJ5RGVsYXllZDsgICAgICAgLyohPCBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgZGVhZC10aW1lIGlzIGluc2VydGVkIHdoZW4gZW50ZXJpbmcgdGhlIElETEUgc3RhdGUgZHVyaW5nIGEgYnVyc3QgbW9kZSBvcGVyYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlcnMgY2FuIGJlIGFueSB2YWx1ZSBvZiBAcmVmIEhSVElNX091dHB1dF9CdXJzdF9Nb2RlX0VudHJ5X0RlbGF5ZWQgKi8KK30gSFJUSU1fT3V0cHV0Q2ZnVHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiAgRXh0ZXJuYWwgZXZlbnQgZmlsdGVyaW5nIGluIHRpbWluZyB1bml0cyBjb25maWd1cmF0aW9uIGRlZmluaXRpb24KKyAgKi8gCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IEZpbHRlcjsgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHR5cGUgb2YgZXZlbnQgZmlsdGVyaW5nIHdpdGhpbiB0aGUgdGltaW5nIHVuaXQuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhSVElNX1RpbWVyX0V4dGVybmFsX0V2ZW50X0ZpbHRlciAqLyAKKyAgdWludDMyX3QgTGF0Y2g7ICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoZSBzaWduYWwgaXMgbGF0Y2hlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBIUlRJTV9UaW1lcl9FeHRlcm5hbF9FdmVudF9MYXRjaCAqLworfSBIUlRJTV9UaW1lckV2ZW50RmlsdGVyaW5nQ2ZnVHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiAgRGVhZCB0aW1lIGZlYXR1cmUgY29uZmlndXJhdGlvbiBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IFByZXNjYWxlcjsgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBEZWFkdGltZSBQcmVzY2FsZXIuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgIEhSVElNX0RlYWR0aW1lX1ByZXNjYWxlcl9SYXRpbyAqLyAKKyAgdWludDMyX3QgUmlzaW5nVmFsdWU7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIERlYWR0aW1lIGZvbGxvd2luZyBhIHJpc2luZyBlZGdlLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiAweDAgYW5kIDB4MUZGVSAqLyAKKyAgdWludDMyX3QgUmlzaW5nU2lnbjsgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgZGVhZHRpbWUgaXMgcG9zaXRpdmUgb3IgbmVnYXRpdmUgb24gcmlzaW5nIGVkZ2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBIUlRJTV9EZWFkdGltZV9SaXNpbmdfU2lnbiAqLyAKKyAgdWludDMyX3QgUmlzaW5nTG9jazsgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgZGVhZHRpbWUgcmlzaW5nIHNldHRpbmdzICh2YWx1ZSBhbmQgc2lnbikgYXJlIHdyaXRlIHByb3RlY3RlZC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBIUlRJTV9EZWFkdGltZV9SaXNpbmdfTG9jayAqLyAKKyAgdWludDMyX3QgUmlzaW5nU2lnbkxvY2s7ICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgZGVhZHRpbWUgcmlzaW5nIHNpZ24gaXMgd3JpdGUgcHJvdGVjdGVkLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhSVElNX0RlYWR0aW1lX1Jpc2luZ19TaWduX0xvY2sgKi8gCisgIHVpbnQzMl90IEZhbGxpbmdWYWx1ZTsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBEZWFkdGltZSBmb2xsb3dpbmcgYSBmYWxsaW5nIGVkZ2UuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gMHgwIGFuZCAweDFGRlUgKi8gCisgIHVpbnQzMl90IEZhbGxpbmdTaWduOyAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGRlYWR0aW1lIGlzIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIG9uIGZhbGxpbmcgZWRnZS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhSVElNX0RlYWR0aW1lX0ZhbGxpbmdfU2lnbiAqLyAKKyAgdWludDMyX3QgRmFsbGluZ0xvY2s7ICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgZGVhZHRpbWUgZmFsbGluZyBzZXR0aW5ncyAodmFsdWUgYW5kIHNpZ24pIGFyZSB3cml0ZSBwcm90ZWN0ZWQuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBIUlRJTV9EZWFkdGltZV9GYWxsaW5nX0xvY2sgKi8gCisgIHVpbnQzMl90IEZhbGxpbmdTaWduTG9jazsgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IGRlYWR0aW1lIGZhbGxpbmcgc2lnbiBpcyB3cml0ZSBwcm90ZWN0ZWQuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBIUlRJTV9EZWFkdGltZV9GYWxsaW5nX1NpZ25fTG9jayAqLyAKK30gSFJUSU1fRGVhZFRpbWVDZmdUeXBlRGVmIDsgCisKKy8qKiAKKyAgKiBAYnJpZWYgIENob3BwZXIgbW9kZSBjb25maWd1cmF0aW9uIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgQ2FycmllckZyZXE7ICAvKiE8IFNwZWNpZmllcyB0aGUgVGltZXIgY2FycmllciBmcmVxdWVuY3kgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhSVElNX0Nob3BwZXJfRnJlcXVlbmN5ICovCisgIHVpbnQzMl90IER1dHlDeWNsZTsgICAvKiE8IFNwZWNpZmllcyB0aGUgVGltZXIgY2hvcHBlciBkdXR5IGN5Y2xlIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhSVElNX0Nob3BwZXJfRHV0eV9DeWNsZSAqLworICB1aW50MzJfdCBTdGFydFB1bHNlOyAgLyohPCBTcGVjaWZpZXMgdGhlIFRpbWVyIHB1bHNlIHdpZHRoIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhSVElNX0Nob3BwZXJfU3RhcnRfUHVsc2VfV2lkdGggKi8gICAKK30gSFJUSU1fQ2hvcHBlck1vZGVDZmdUeXBlRGVmOworCisvKiogCisgICogQGJyaWVmICBFeHRlcm5hbCBldmVudCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbgorICAqLyAKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgU291cmNlOyAgICAgICAgLyohPCBJZGVudGlmaWVzIHRoZSBzb3VyY2Ugb2YgdGhlIGV4dGVybmFsIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhSVElNX0V4dGVybmFsX0V2ZW50X1NvdXJjZXMgKi8gCisgIHVpbnQzMl90IFBvbGFyaXR5OyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBwb2xhcml0eSBvZiB0aGUgZXh0ZXJuYWwgZXZlbnQgKGluIGNhc2Ugb2YgbGV2ZWwgc2Vuc2l0aXZpdHkpLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhSVElNX0V4dGVybmFsX0V2ZW50X1BvbGFyaXR5ICovIAorICB1aW50MzJfdCBTZW5zaXRpdml0eTsgICAvKiE8IFNwZWNpZmllcyB0aGUgc2Vuc2l0aXZpdHkgb2YgdGhlIGV4dGVybmFsIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhSVElNX0V4dGVybmFsX0V2ZW50X1NlbnNpdGl2aXR5ICovIAorICB1aW50MzJfdCBGaWx0ZXI7ICAgICAgICAvKiE8IERlZmluZXMgdGhlIGZyZXF1ZW5jeSB1c2VkIHRvIHNhbXBsZSB0aGUgRXh0ZXJuYWwgRXZlbnQgYW5kIHRoZSBsZW5ndGggb2YgdGhlIGRpZ2l0YWwgZmlsdGVyLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhSVElNX0V4dGVybmFsX0V2ZW50X0ZpbHRlciAqLyAKKyAgdWludDMyX3QgRmFzdE1vZGU7ICAgICAvKiE8IEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBsb3cgbGF0ZW5jeSBtb2RlIGlzIGVuYWJsZWQgZm9yIHRoZSBleHRlcm5hbCBldmVudC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhSVElNX0V4dGVybmFsX0V2ZW50X0Zhc3RfTW9kZSAqLworfSBIUlRJTV9FdmVudENmZ1R5cGVEZWY7CisKKy8qKiAKKyAgKiBAYnJpZWYgIEZhdWx0IGNoYW5uZWwgY29uZmlndXJhdGlvbiBkZWZpbml0aW9uCisgICovIAordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBTb3VyY2U7ICAgICAgICAvKiE8IElkZW50aWZpZXMgdGhlIHNvdXJjZSBvZiB0aGUgZmF1bHQuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSFJUSU1fRmF1bHRfU291cmNlcyAqLyAKKyAgdWludDMyX3QgUG9sYXJpdHk7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHBvbGFyaXR5IG9mIHRoZSBmYXVsdCBldmVudC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBIUlRJTV9GYXVsdF9Qb2xhcml0eSAqLyAKKyAgdWludDMyX3QgRmlsdGVyOyAgICAgICAgLyohPCBEZWZpbmVzIHRoZSBmcmVxdWVuY3kgdXNlZCB0byBzYW1wbGUgdGhlIEZhdWx0IGlucHV0IGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBkaWdpdGFsIGZpbHRlci4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBIUlRJTV9GYXVsdF9GaWx0ZXIgKi8gCisgIHVpbnQzMl90IExvY2s7ICAgICAgICAgIC8qITwgSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGZhdWx0IHByb2dyYW1taW5nIGJpdHMgYXJlIHdyaXRlIHByb3RlY3RlZC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhSVElNX0ZhdWx0X0xvY2sgKi8gIAorfSBIUlRJTV9GYXVsdENmZ1R5cGVEZWY7CisKKy8qKiAKKyAgKiBAYnJpZWYgIEJ1cnN0IG1vZGUgY29uZmlndXJhdGlvbiBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IE1vZGU7ICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgYnVyc3QgbW9kZSBvcGVyYXRpbmcgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBIUlRJTV9CdXJzdF9Nb2RlX09wZXJhdGluZ19Nb2RlICovCisgIHVpbnQzMl90IENsb2NrU291cmNlOyAgICAvKiE8IFNwZWNpZmllcyB0aGUgYnVyc3QgbW9kZSBjbG9jayBzb3VyY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSFJUSU1fQnVyc3RfTW9kZV9DbG9ja19Tb3VyY2UgKi8KKyAgdWludDMyX3QgUHJlc2NhbGVyOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBidXJzdCBtb2RlIHByZXNjYWxlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBIUlRJTV9CdXJzdF9Nb2RlX1ByZXNjYWxlciAqLworICB1aW50MzJfdCBQcmVsb2FkRW5hYmxlOyAgLyohPCBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgcHJlbG9hZCBpcyBlbmFibGVkIGZvciBidXJzdCBtb2RlIHJlbGF0ZWQgcmVnaXN0ZXJzIChIUlRJTV9CTUNNUFIgYW5kIEhSVElNX0JNUEVSKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgQHJlZiBIUlRJTV9CdXJzdF9Nb2RlX1JlZ2lzdGVyX1ByZWxvYWRfRW5hYmxlICAqLworICB1aW50MzJfdCBUcmlnZ2VyOyAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGV2ZW50KHMpIHRyaWdnZXJpbmcgdGhlIGJ1cnN0IG9wZXJhdGlvbi4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIEByZWYgSFJUSU1fQnVyc3RfTW9kZV9UcmlnZ2VyICAqLworICB1aW50MzJfdCBJZGxlRHVyYXRpb247ICAgLyohPCBTcGVjaWZpZXMgbnVtYmVyIG9mIHBlcmlvZHMgZHVyaW5nIHdoaWNoIHRoZSBzZWxlY3RlZCB0aW1lcnMgYXJlIGluIGlkbGUgc3RhdGUuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiAweDAgYW5kIDB4RkZGRiAgKi8KKyAgdWludDMyX3QgUGVyaW9kOyAgICAgICAgLyohPCBTcGVjaWZpZXMgYnVyc3QgbW9kZSByZXBldGl0aW9uIHBlcmlvZC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIDB4MSBhbmQgMHhGRkZGICAqLworfSBIUlRJTV9CdXJzdE1vZGVDZmdUeXBlRGVmOworCisvKiogCisgICogQGJyaWVmICBBREMgdHJpZ2dlciBjb25maWd1cmF0aW9uIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgVXBkYXRlU291cmNlOyAgLyohPCBTcGVjaWZpZXMgdGhlIEFEQyB0cmlnZ2VyIHVwZGF0ZSBzb3VyY2UuICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiBAcmVmIEhSVElNX0FEQ19UcmlnZ2VyX1VwZGF0ZV9Tb3VyY2UgICovCisgIHVpbnQzMl90IFRyaWdnZXI7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGV2ZW50KHMpIHRyaWdnZXJpbmcgdGhlIEFEQyBjb252ZXJzaW9uLiAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhSVElNX0FEQ19UcmlnZ2VyX0V2ZW50ICAqLworfSBIUlRJTV9BRENUcmlnZ2VyQ2ZnVHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKyAgICAKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEhSVElNX0V4cG9ydGVkX0NvbnN0YW50cyBIUlRJTSBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX1RpbWVyX0luZGV4IEhSVElNIFRpbWVyIEluZGV4CisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRoZSB0aW1lciBpbmRleGVzCisgICovCisjZGVmaW5lIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSAweDBVICAgLyohPCBJbmRleCB1c2VkIHRvIGFjY2VzcyB0aW1lciBBIHJlZ2lzdGVycyAqLworI2RlZmluZSBIUlRJTV9USU1FUklOREVYX1RJTUVSX0IgMHgxVSAgIC8qITwgSW5kZXggdXNlZCB0byBhY2Nlc3MgdGltZXIgQiByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9DIDB4MlUgICAvKiE8IEluZGV4IHVzZWQgdG8gYWNjZXNzIHRpbWVyIEMgcmVnaXN0ZXJzICovCisjZGVmaW5lIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCAweDNVICAgLyohPCBJbmRleCB1c2VkIHRvIGFjY2VzcyB0aW1lciBEIHJlZ2lzdGVycyAqLworI2RlZmluZSBIUlRJTV9USU1FUklOREVYX1RJTUVSX0UgMHg0VSAgIC8qITwgSW5kZXggdXNlZCB0byBhY2Nlc3MgdGltZXIgRSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSFJUSU1fVElNRVJJTkRFWF9NQVNURVIgIDB4NVUgICAvKiE8IEluZGV4IHVzZWQgdG8gYWNjZXNzIG1hc3RlciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSFJUSU1fVElNRVJJTkRFWF9DT01NT04gIDB4RkZVICAvKiE8IEluZGV4IHVzZWQgdG8gYWNjZXNzIEhSVElNIGNvbW1vbiByZWdpc3RlcnMgKi8KKy8qKgorICAqIEB9CisgICovCisgICAgCisvKiogQGRlZmdyb3VwIEhSVElNX1RpbWVyX2lkZW50aWZpZXIgSFJUSU0gVGltZXIgaWRlbnRpZmllcgorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB0aW1lciBpZGVudGlmaWVycworICAqLyAKKyNkZWZpbmUgSFJUSU1fVElNRVJJRF9NQVNURVIgIChIUlRJTV9NQ1JfTUNFTikgICAvKiE8IE1hc3RlciBpZGVudGlmaWVyKi8KKyNkZWZpbmUgSFJUSU1fVElNRVJJRF9USU1FUl9BIChIUlRJTV9NQ1JfVEFDRU4pICAvKiE8IFRpbWVyIEEgaWRlbnRpZmllciAqLworI2RlZmluZSBIUlRJTV9USU1FUklEX1RJTUVSX0IgKEhSVElNX01DUl9UQkNFTikgIC8qITwgVGltZXIgQiBpZGVudGlmaWVyICovCisjZGVmaW5lIEhSVElNX1RJTUVSSURfVElNRVJfQyAoSFJUSU1fTUNSX1RDQ0VOKSAgLyohPCBUaW1lciBDIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgSFJUSU1fVElNRVJJRF9USU1FUl9EIChIUlRJTV9NQ1JfVERDRU4pICAvKiE8IFRpbWVyIEQgaWRlbnRpZmllciAqLworI2RlZmluZSBIUlRJTV9USU1FUklEX1RJTUVSX0UgKEhSVElNX01DUl9URUNFTikgIC8qITwgVGltZXIgRSBpZGVudGlmaWVyICovCisvKioKKyAqIEB9CisgKi8KKyAgICAKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fQ29tcGFyZV9Vbml0IEhSVElNIENvbXBhcmUgVW5pdAorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyBjb21wYXJlIHVuaXQgaWRlbnRpZmllcnMKKyAgKi8gIAorI2RlZmluZSBIUlRJTV9DT01QQVJFVU5JVF8xIDB4MDAwMDAwMDFVICAvKiE8IENvbXBhcmUgdW5pdCAxIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgSFJUSU1fQ09NUEFSRVVOSVRfMiAweDAwMDAwMDAyVSAgLyohPCBDb21wYXJlIHVuaXQgMiBpZGVudGlmaWVyICovCisjZGVmaW5lIEhSVElNX0NPTVBBUkVVTklUXzMgMHgwMDAwMDAwNFUgIC8qITwgQ29tcGFyZSB1bml0IDMgaWRlbnRpZmllciAqLworI2RlZmluZSBIUlRJTV9DT01QQVJFVU5JVF80IDB4MDAwMDAwMDhVICAvKiE8IENvbXBhcmUgdW5pdCA0IGlkZW50aWZpZXIgKi8KKyAvKioKKyAgKiBAfQorICAqLworICAgIAorLyoqIEBkZWZncm91cCBIUlRJTV9DYXB0dXJlX1VuaXQgSFJUSU0gQ2FwdHVyZSBVbml0CisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIGNhcHR1cmUgdW5pdCBpZGVudGlmaWVycworICAqLyAgCisjZGVmaW5lIEhSVElNX0NBUFRVUkVVTklUXzEgMHgwMDAwMDAwMVUgIC8qITwgQ2FwdHVyZSB1bml0IDEgaWRlbnRpZmllciAqLworI2RlZmluZSBIUlRJTV9DQVBUVVJFVU5JVF8yIDB4MDAwMDAwMDJVICAvKiE8IENhcHR1cmUgdW5pdCAyIGlkZW50aWZpZXIgKi8KKy8qKgorICAqIEB9CisgICovCisgCisvKiogQGRlZmdyb3VwIEhSVElNX1RpbWVyX091dHB1dCBIUlRJTSBUaW1lciBPdXRwdXQKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgdGltZXIgb3V0cHV0IGlkZW50aWZpZXJzCisgICovICAKKyNkZWZpbmUgSFJUSU1fT1VUUFVUX1RBMSAgMHgwMDAwMDAwMVUgIC8qITwgVGltZXIgQSAtIE91dHB1dCAxIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUX1RBMiAgMHgwMDAwMDAwMlUgIC8qITwgVGltZXIgQSAtIE91dHB1dCAyIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUX1RCMSAgMHgwMDAwMDAwNFUgIC8qITwgVGltZXIgQiAtIE91dHB1dCAxIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUX1RCMiAgMHgwMDAwMDAwOFUgIC8qITwgVGltZXIgQiAtIE91dHB1dCAyIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUX1RDMSAgMHgwMDAwMDAxMFUgIC8qITwgVGltZXIgQyAtIE91dHB1dCAxIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUX1RDMiAgMHgwMDAwMDAyMFUgIC8qITwgVGltZXIgQyAtIE91dHB1dCAyIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUX1REMSAgMHgwMDAwMDA0MFUgIC8qITwgVGltZXIgRCAtIE91dHB1dCAxIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUX1REMiAgMHgwMDAwMDA4MFUgIC8qITwgVGltZXIgRCAtIE91dHB1dCAyIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUX1RFMSAgMHgwMDAwMDEwMFUgIC8qITwgVGltZXIgRSAtIE91dHB1dCAxIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUX1RFMiAgMHgwMDAwMDIwMFUgIC8qITwgVGltZXIgRSAtIE91dHB1dCAyIGlkZW50aWZpZXIgKi8KKy8qKgorICAqIEB9CisgICovCisgICAgCisvKiogQGRlZmdyb3VwIEhSVElNX0FEQ19UcmlnZ2VyIEhSVElNIEFEQyBUcmlnZ2VyCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIEFEQyB0cmlnZ2VycyBpZGVudGlmaWVycworICAqLworI2RlZmluZSBIUlRJTV9BRENUUklHR0VSXzEgIDB4MDAwMDAwMDFVICAvKiE8IEFEQyB0cmlnZ2VyIDEgaWRlbnRpZmllciAqLworI2RlZmluZSBIUlRJTV9BRENUUklHR0VSXzIgIDB4MDAwMDAwMDJVICAvKiE8IEFEQyB0cmlnZ2VyIDIgaWRlbnRpZmllciAqLworI2RlZmluZSBIUlRJTV9BRENUUklHR0VSXzMgIDB4MDAwMDAwMDRVICAvKiE8IEFEQyB0cmlnZ2VyIDMgaWRlbnRpZmllciAqLworI2RlZmluZSBIUlRJTV9BRENUUklHR0VSXzQgIDB4MDAwMDAwMDhVICAvKiE8IEFEQyB0cmlnZ2VyIDQgaWRlbnRpZmllciAqLworCisjZGVmaW5lIElTX0hSVElNX0FEQ1RSSUdHRVIoQURDVFJJR0dFUilcCisgICAgKCgoQURDVFJJR0dFUikgPT0gSFJUSU1fQURDVFJJR0dFUl8xKSAgIHx8IFwKKyAgICAgKChBRENUUklHR0VSKSA9PSBIUlRJTV9BRENUUklHR0VSXzIpICAgfHwgXAorICAgICAoKEFEQ1RSSUdHRVIpID09IEhSVElNX0FEQ1RSSUdHRVJfMykgICB8fCBcCisgICAgICgoQURDVFJJR0dFUikgPT0gSFJUSU1fQURDVFJJR0dFUl80KSkKKy8qKgorICAqIEB9CisgICovCisvKiogQGRlZmdyb3VwIEhSVElNX0V4dGVybmFsX0V2ZW50X0NoYW5uZWxzIEhSVElNIEV4dGVybmFsIEV2ZW50IENoYW5uZWxzCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIGV4dGVybmFsIGV2ZW50IGNoYW5uZWwgaWRlbnRpZmllcnMKKyAgKi8KKyNkZWZpbmUgSFJUSU1fRVZFTlRfTk9ORSAgICAoMHgwMDAwMDAwMFUpICAgICAvKiE8IFVuZGVmaW5lZCBldmVudCBjaGFubmVsICovCisjZGVmaW5lIEhSVElNX0VWRU5UXzEgICAgICAgKDB4MDAwMDAwMDFVKSAgICAgLyohPCBFeHRlcm5hbCBldmVudCBjaGFubmVsIDEgIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgSFJUSU1fRVZFTlRfMiAgICAgICAoMHgwMDAwMDAwMlUpICAgICAvKiE8IEV4dGVybmFsIGV2ZW50IGNoYW5uZWwgMiAgaWRlbnRpZmllciAqLworI2RlZmluZSBIUlRJTV9FVkVOVF8zICAgICAgICgweDAwMDAwMDAzVSkgICAgIC8qITwgRXh0ZXJuYWwgZXZlbnQgY2hhbm5lbCAzICBpZGVudGlmaWVyICovCisjZGVmaW5lIEhSVElNX0VWRU5UXzQgICAgICAgKDB4MDAwMDAwMDRVKSAgICAgLyohPCBFeHRlcm5hbCBldmVudCBjaGFubmVsIDQgIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgSFJUSU1fRVZFTlRfNSAgICAgICAoMHgwMDAwMDAwNVUpICAgICAvKiE8IEV4dGVybmFsIGV2ZW50IGNoYW5uZWwgNSAgaWRlbnRpZmllciAqLworI2RlZmluZSBIUlRJTV9FVkVOVF82ICAgICAgICgweDAwMDAwMDA2VSkgICAgIC8qITwgRXh0ZXJuYWwgZXZlbnQgY2hhbm5lbCA2ICBpZGVudGlmaWVyICovCisjZGVmaW5lIEhSVElNX0VWRU5UXzcgICAgICAgKDB4MDAwMDAwMDdVKSAgICAgLyohPCBFeHRlcm5hbCBldmVudCBjaGFubmVsIDcgIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgSFJUSU1fRVZFTlRfOCAgICAgICAoMHgwMDAwMDAwOFUpICAgICAvKiE8IEV4dGVybmFsIGV2ZW50IGNoYW5uZWwgOCAgaWRlbnRpZmllciAqLworI2RlZmluZSBIUlRJTV9FVkVOVF85ICAgICAgICgweDAwMDAwMDA5VSkgICAgIC8qITwgRXh0ZXJuYWwgZXZlbnQgY2hhbm5lbCA5ICBpZGVudGlmaWVyICovCisjZGVmaW5lIEhSVElNX0VWRU5UXzEwICAgICAgKDB4MDAwMDAwMTBVKSAgICAgLyohPCBFeHRlcm5hbCBldmVudCBjaGFubmVsIDEwIGlkZW50aWZpZXIgKi8KKy8qKgorICAqIEB9CisgICovCisgICAgCisvKiogQGRlZmdyb3VwIEhSVElNX0ZhdWx0X0NoYW5uZWwgSFJUSU0gRmF1bHQgQ2hhbm5lbAorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyBmYXVsdCBjaGFubmVsIGlkZW50aWZpZXJzCisgICovIAorI2RlZmluZSBIUlRJTV9GQVVMVF8xICAgICAgKDB4MDFVKSAgICAgLyohPCBGYXVsdCBjaGFubmVsIDEgaWRlbnRpZmllciAqLworI2RlZmluZSBIUlRJTV9GQVVMVF8yICAgICAgKDB4MDJVKSAgICAgLyohPCBGYXVsdCBjaGFubmVsIDIgaWRlbnRpZmllciAqLworI2RlZmluZSBIUlRJTV9GQVVMVF8zICAgICAgKDB4MDRVKSAgICAgLyohPCBGYXVsdCBjaGFubmVsIDMgaWRlbnRpZmllciAqLworI2RlZmluZSBIUlRJTV9GQVVMVF80ICAgICAgKDB4MDhVKSAgICAgLyohPCBGYXVsdCBjaGFubmVsIDQgaWRlbnRpZmllciAqLworI2RlZmluZSBIUlRJTV9GQVVMVF81ICAgICAgKDB4MTBVKSAgICAgLyohPCBGYXVsdCBjaGFubmVsIDUgaWRlbnRpZmllciAqLworLyoqCisgICogQH0KKyAgKi8KKworCisgLyoqIEBkZWZncm91cCBIUlRJTV9QcmVzY2FsZXJfUmF0aW8gSFJUSU0gUHJlc2NhbGVyIFJhdGlvCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRpbWVyIGhpZ2gtcmVzb2x1dGlvbiBjbG9jayBwcmVzY2FsZXIgcmF0aW8uCisgICovICAKKyNkZWZpbmUgSFJUSU1fUFJFU0NBTEVSUkFUSU9fTVVMMzIgICAgKDB4MDAwMDAwMDBVKSAgLyohPCBmSFJDSzogZkhSVElNIHggMzJVID0gNC42MDggR0h6IC0gUmVzb2x1dGlvbjogMjE3IHBzIC0gTWluIFBXTSBmcmVxdWVuY3k6IDcwLjMga0h6IChmSFJUSU09MTQ0TUh6KSAgICAgICovCisjZGVmaW5lIEhSVElNX1BSRVNDQUxFUlJBVElPX01VTDE2ICAgICgweDAwMDAwMDAxVSkgIC8qITwgZkhSQ0s6IGZIUlRJTSB4IDE2VSA9IDIuMzA0IEdIeiAtIFJlc29sdXRpb246IDQzNCBwcyAtIE1pbiBQV00gZnJlcXVlbmN5OiAzNS4xIEtIeiAoZkhSVElNPTE0NE1IeikgICAgICAqLworI2RlZmluZSBIUlRJTV9QUkVTQ0FMRVJSQVRJT19NVUw4ICAgICAoMHgwMDAwMDAwMlUpICAvKiE8IGZIUkNLOiBmSFJUSU0geCA4VSA9IDEuMTUyIEdIeiAtIFJlc29sdXRpb246IDg2OCBwcyAtIE1pbiBQV00gZnJlcXVlbmN5OiAxNy42IGtIeiAoZkhSVElNPTE0NE1IeikgICAgICAqLworI2RlZmluZSBIUlRJTV9QUkVTQ0FMRVJSQVRJT19NVUw0ICAgICAoMHgwMDAwMDAwM1UpICAvKiE8IGZIUkNLOiBmSFJUSU0geCA0VSA9IDU3NiBNSHogLSBSZXNvbHV0aW9uOiAxLjczIG5zIC0gTWluIFBXTSBmcmVxdWVuY3k6IDguOCBrSHogKGZIUlRJTT0xNDRNSHopICAgICAgKi8KKyNkZWZpbmUgSFJUSU1fUFJFU0NBTEVSUkFUSU9fTVVMMiAgICAgKDB4MDAwMDAwMDRVKSAgLyohPCBmSFJDSzogZkhSVElNIHggMlUgPSAyODggTUh6IC0gUmVzb2x1dGlvbjogMy40NyBucyAtIE1pbiBQV00gZnJlcXVlbmN5OiA0LjQga0h6IChmSFJUSU09MTQ0TUh6KSAgICAgICovCisjZGVmaW5lIEhSVElNX1BSRVNDQUxFUlJBVElPX0RJVjEgICAgICgweDAwMDAwMDA1VSkgIC8qITwgZkhSQ0s6IGZIUlRJTSA9IDE0NCBNSHogLSBSZXNvbHV0aW9uOiA2Ljk1IG5zIC0gTWluIFBXTSBmcmVxdWVuY3k6IDIuMiBrSHogKGZIUlRJTT0xNDRNSHopICAgICAgKi8KKyNkZWZpbmUgSFJUSU1fUFJFU0NBTEVSUkFUSU9fRElWMiAgICAgKDB4MDAwMDAwMDZVKSAgLyohPCBmSFJDSzogZkhSVElNIC8gMlUgPSA3MiBNSHogLSBSZXNvbHV0aW9uOiAxMy44OCBucy0gTWluIFBXTSBmcmVxdWVuY3k6IDEuMSBrSHogKGZIUlRJTT0xNDRNSHopICAgICAgKi8KKyNkZWZpbmUgSFJUSU1fUFJFU0NBTEVSUkFUSU9fRElWNCAgICAgKDB4MDAwMDAwMDdVKSAgLyohPCBmSFJDSzogZkhSVElNIC8gNFUgPSAzNiBNSHogLSBSZXNvbHV0aW9uOiAyNy43IG5zLSBNaW4gUFdNIGZyZXF1ZW5jeTogNTUwSHogKGZIUlRJTT0xNDRNSHopICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisgIAorLyoqIEBkZWZncm91cCBIUlRJTV9Db3VudGVyX09wZXJhdGluZ19Nb2RlIEhSVElNIENvdW50ZXIgT3BlcmF0aW5nIE1vZGUKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgdGltZXIgY291bnRlciBvcGVyYXRpbmcgbW9kZS4KKyAgKi8gIAorI2RlZmluZSBIUlRJTV9NT0RFX0NPTlRJTlVPVVMgICAgICAgICAgICAgICAoMHgwMDAwMDAwOFUpICAvKiE8IFRoZSB0aW1lciBvcGVyYXRlcyBpbiBjb250aW51b3VzIChmcmVlLXJ1bm5pbmcpIG1vZGUgKi8KKyNkZWZpbmUgSFJUSU1fTU9ERV9TSU5HTEVTSE9UICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgLyohPCBUaGUgdGltZXIgb3BlcmF0ZXMgaW4gbm9uIHJldHJpZ2dlcmFibGUgc2luZ2xlLXNob3QgbW9kZSAqLworI2RlZmluZSBIUlRJTV9NT0RFX1NJTkdMRVNIT1RfUkVUUklHR0VSQUJMRSAoMHgwMDAwMDAxMFUpICAvKiE8IFRoZSB0aW1lciBvcGVyYXRlcyBpbiByZXRyaWdnZXJhYmxlIHNpbmdsZS1zaG90IG1vZGUgKi8KKy8qKgorICAqIEB9CisgICovCisgIAorLyoqIEBkZWZncm91cCBIUlRJTV9IYWxmX01vZGVfRW5hYmxlIEhSVElNIEhhbGYgTW9kZSBFbmFibGUKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgaGFsZiBtb2RlIGVuYWJsaW5nIHN0YXR1cy4KKyAgKi8gIAorI2RlZmluZSBIUlRJTV9IQUxGTU9ERV9ESVNBQkxFRCAoMHgwMDAwMDAwMFUpICAvKiE8IEhhbGYgbW9kZSBpcyBkaXNhYmxlZCAqLworI2RlZmluZSBIUlRJTV9IQUxGTU9ERV9FTkFCTEVEICAoMHgwMDAwMDAyMFUpICAvKiE8IEhhbGYgbW9kZSBpcyBlbmFibGVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX1N0YXJ0X09uX1N5bmNfSW5wdXRfRXZlbnQgSFJUSU0gU3RhcnQgT24gU3luYyBJbnB1dCBFdmVudAorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB0aGUgdGltZXIgYmVoYXZpb3IgZm9sbG93aW5nIHRoZSBzeW5jaHJvbml6YXRpb24gZXZlbnQKKyAgKi8KKyNkZWZpbmUgSFJUSU1fU1lOQ1NUQVJUX0RJU0FCTEVEICgweDAwMDAwMDAwVSkgIC8qITwgU3luY2hyb25pemF0aW9uIGlucHV0IGV2ZW50IGhhcyBlZmZlY3Qgb24gdGhlIHRpbWVyICovCisjZGVmaW5lIEhSVElNX1NZTkNTVEFSVF9FTkFCTEVEICAoSFJUSU1fTUNSX1NZTkNTVFJUTSkgICAvKiE8IFN5bmNocm9uaXphdGlvbiBpbnB1dCBldmVudCBzdGFydHMgdGhlIHRpbWVyICovCisvKioKKyAgKiBAfQorICAqLworICAgICAgICAgICAgICAKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fUmVzZXRfT25fU3luY19JbnB1dF9FdmVudCBIUlRJTSBSZXNldCBPbiBTeW5jIElucHV0IEV2ZW50CisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRoZSB0aW1lciBiZWhhdmlvciBmb2xsb3dpbmcgdGhlIHN5bmNocm9uaXphdGlvbiBldmVudAorICAqLyAgCisjZGVmaW5lIEhSVElNX1NZTkNSRVNFVF9ESVNBQkxFRCAoMHgwMDAwMDAwMFUpICAvKiE8IFN5bmNocm9uaXphdGlvbiBpbnB1dCBldmVudCBoYXMgZWZmZWN0IG9uIHRoZSB0aW1lciAqLworI2RlZmluZSBIUlRJTV9TWU5DUkVTRVRfRU5BQkxFRCAgKEhSVElNX01DUl9TWU5DUlNUTSkgICAgLyohPCBTeW5jaHJvbml6YXRpb24gaW5wdXQgZXZlbnQgcmVzZXRzIHRoZSB0aW1lciAqLworLyoqCisgICogQH0KKyAgKi8gICAgCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fREFDX1N5bmNocm9uaXphdGlvbiBIUlRJTSBEQUMgU3luY2hyb25pemF0aW9uCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIG9uIHdoaWNoIG91dHB1dCB0aGUgREFDIHN5bmNocm9uaXphdGlvbiBldmVudCBpcyBzZW50CisgICovIAorI2RlZmluZSBIUlRJTV9EQUNTWU5DX05PTkUgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBObyBEQUMgc3luY2hyb25pemF0aW9uIGV2ZW50IGdlbmVyYXRlZCAqLworI2RlZmluZSBIUlRJTV9EQUNTWU5DX0RBQ1RSSUdPVVRfMSAgKEhSVElNX01DUl9EQUNTWU5DXzApICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERBQyBzeW5jaHJvbml6YXRpb24gZXZlbnQgZ2VuZXJhdGVkIG9uIERBQ1RyaWdPdXQxIG91dHB1dCB1cG9uIHRpbWVyIHVwZGF0ZSAqLworI2RlZmluZSBIUlRJTV9EQUNTWU5DX0RBQ1RSSUdPVVRfMiAgKEhSVElNX01DUl9EQUNTWU5DXzEpICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERBQyBzeW5jaHJvbml6YXRpb24gZXZlbnQgZ2VuZXJhdGVkIG9uIERBQ1RyaWdPdXQyIG91dHB1dCB1cG9uIHRpbWVyIHVwZGF0ZSAqLworI2RlZmluZSBIUlRJTV9EQUNTWU5DX0RBQ1RSSUdPVVRfMyAgKEhSVElNX01DUl9EQUNTWU5DXzEgfCBIUlRJTV9NQ1JfREFDU1lOQ18wKSAvKiE8IERBQyB1cGRhdGUgZ2VuZXJhdGVkIG9uIERBQ1RyaWdPdXQzIG91dHB1dCB1cG9uIHRpbWVyIHVwZGF0ZSAqLworLyoqCisgICogQH0KKyAgKi8gICAgICAgICAKKworLyoqIEBkZWZncm91cCBIUlRJTV9SZWdpc3Rlcl9QcmVsb2FkX0VuYWJsZSBIUlRJTSBSZWdpc3RlciBQcmVsb2FkIEVuYWJsZQorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB3aGV0aGVyIGEgd3JpdGUgYWNjZXNzIGludG8gYSBwcmVsb2FkYWJsZQorICAqICAgICAgICByZWdpc3RlciBpcyBkb25lIGludG8gdGhlIGFjdGl2ZSBvciB0aGUgcHJlbG9hZCByZWdpc3Rlci4KKyAgKi8gIAorI2RlZmluZSBIUlRJTV9QUkVMT0FEX0RJU0FCTEVEICgweDAwMDAwMDAwVSkgICAgICAgICAgIC8qITwgUHJlbG9hZCBkaXNhYmxlZDogdGhlIHdyaXRlIGFjY2VzcyBpcyBkaXJlY3RseSBkb25lIGludG8gdGhlIGFjdGl2ZSByZWdpc3RlciAqLworI2RlZmluZSBIUlRJTV9QUkVMT0FEX0VOQUJMRUQgIChIUlRJTV9NQ1JfUFJFRU4pICAgICAgIC8qITwgUHJlbG9hZCBlbmFibGVkOiB0aGUgd3JpdGUgYWNjZXNzIGlzIGRvbmUgaW50byB0aGUgcHJlbG9hZCByZWdpc3RlciAqLworLyoqCisgICogQH0KKyAgKi8gICAKKworLyoqIEBkZWZncm91cCBIUlRJTV9VcGRhdGVfR2F0aW5nIEhSVElNIFVwZGF0ZSBHYXRpbmcKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgaG93IHRoZSB1cGRhdGUgb2NjdXJzIHJlbGF0aXZlbHkgdG8gdGhlIGJ1cnN0IERNQSAKKyAgKiAgICAgICAgdHJhbnNhY3Rpb24gYW5kIHRoZSBleHRlcm5hbCB1cGRhdGUgcmVxdWVzdCBvbiB1cGRhdGUgZW5hYmxlIGlucHV0cyAxIHRvIDMuCisgICovCisjZGVmaW5lIEhSVElNX1VQREFURUdBVElOR19JTkRFUEVOREVOVCAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVwZGF0ZSBkb25lIGluZGVwZW5kZW50bHkgZnJvbSB0aGUgRE1BIGJ1cnN0IHRyYW5zZmVyIGNvbXBsZXRpb24gKi8KKyNkZWZpbmUgSFJUSU1fVVBEQVRFR0FUSU5HX0RNQUJVUlNUICAgICAgICAoSFJUSU1fVElNQ1JfVVBER0FUXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVcGRhdGUgZG9uZSB3aGVuIHRoZSBETUEgYnVyc3QgdHJhbnNmZXIgaXMgY29tcGxldGVkICovCisjZGVmaW5lIEhSVElNX1VQREFURUdBVElOR19ETUFCVVJTVF9VUERBVEUgKEhSVElNX1RJTUNSX1VQREdBVF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVXBkYXRlIGRvbmUgb24gdGltZXIgcm9sbC1vdmVyIGZvbGxvd2luZyBhIERNQSBidXJzdCB0cmFuc2ZlciBjb21wbGV0aW9uKi8KKyNkZWZpbmUgSFJUSU1fVVBEQVRFR0FUSU5HX1VQREVOMSAgICAgICAgICAoSFJUSU1fVElNQ1JfVVBER0FUXzEgfCBIUlRJTV9USU1DUl9VUERHQVRfMCkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTbGF2ZSB0aW1lciBvbmx5IC0gVXBkYXRlIGRvbmUgb24gYSByaXNpbmcgZWRnZSBvZiBIUlRJTSB1cGRhdGUgZW5hYmxlIGlucHV0IDFVICovCisjZGVmaW5lIEhSVElNX1VQREFURUdBVElOR19VUERFTjIgICAgICAgICAgKEhSVElNX1RJTUNSX1VQREdBVF8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU2xhdmUgdGltZXIgb25seSAtIFVwZGF0ZSBkb25lIG9uIGEgcmlzaW5nIGVkZ2Ugb2YgSFJUSU0gdXBkYXRlIGVuYWJsZSBpbnB1dCAyVSAqLworI2RlZmluZSBIUlRJTV9VUERBVEVHQVRJTkdfVVBERU4zICAgICAgICAgIChIUlRJTV9USU1DUl9VUERHQVRfMiB8IEhSVElNX1RJTUNSX1VQREdBVF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNsYXZlIHRpbWVyIG9ubHkgLSBVcGRhdGUgZG9uZSBvbiBhIHJpc2luZyBlZGdlIG9mIEhSVElNIHVwZGF0ZSBlbmFibGUgaW5wdXQgM1UgKi8KKyNkZWZpbmUgSFJUSU1fVVBEQVRFR0FUSU5HX1VQREVOMV9VUERBVEUgICAoSFJUSU1fVElNQ1JfVVBER0FUXzIgfCBIUlRJTV9USU1DUl9VUERHQVRfMSkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTbGF2ZSB0aW1lciBvbmx5IC0gIFVwZGF0ZSBkb25lIG9uIHRoZSB1cGRhdGUgZXZlbnQgZm9sbG93aW5nIGEgcmlzaW5nIGVkZ2Ugb2YgSFJUSU0gdXBkYXRlIGVuYWJsZSBpbnB1dCAxVSAqLworI2RlZmluZSBIUlRJTV9VUERBVEVHQVRJTkdfVVBERU4yX1VQREFURSAgIChIUlRJTV9USU1DUl9VUERHQVRfMiB8IEhSVElNX1RJTUNSX1VQREdBVF8xIHwgSFJUSU1fVElNQ1JfVVBER0FUXzApICAvKiE8IFNsYXZlIHRpbWVyIG9ubHkgLSAgVXBkYXRlIGRvbmUgb24gdGhlIHVwZGF0ZSBldmVudCBmb2xsb3dpbmcgYSByaXNpbmcgZWRnZSBvZiBIUlRJTSB1cGRhdGUgZW5hYmxlIGlucHV0IDJVICovCisjZGVmaW5lIEhSVElNX1VQREFURUdBVElOR19VUERFTjNfVVBEQVRFICAgKEhSVElNX1RJTUNSX1VQREdBVF8zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU2xhdmUgdGltZXIgb25seSAtICBVcGRhdGUgZG9uZSBvbiB0aGUgdXBkYXRlIGV2ZW50IGZvbGxvd2luZyBhIHJpc2luZyBlZGdlIG9mIEhSVElNIHVwZGF0ZSBlbmFibGUgaW5wdXQgM1UgKi8KKy8qKgorICAqIEB9CisgICovIAorICAgICAgICAgICAgICAgICAgCisvKiogQGRlZmdyb3VwIEhSVElNX1RpbWVyX0J1cnN0X01vZGUgSFJUSU0gVGltZXIgQnVyc3QgTW9kZQorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyBob3cgdGhlIHRpbWVyIGJlaGF2ZXMgZHVyaW5nIGEgYnVyc3QKKyAgICAgICAgICAgIG1vZGUgb3BlcmF0aW9uLgorICAqLworI2RlZmluZSBIUlRJTV9USU1FUkJVUlNUTU9ERV9NQUlOVEFJTkNMT0NLIDB4MDAwMDAwVSAgICAgICAgICAvKiE8IFRpbWVyIGNvdW50ZXIgY2xvY2sgaXMgbWFpbnRhaW5lZCBhbmQgdGhlIHRpbWVyIG9wZXJhdGVzIG5vcm1hbGx5ICovCisjZGVmaW5lIEhSVElNX1RJTUVSQlVSU1RNT0RFX1JFU0VUQ09VTlRFUiAgKEhSVElNX0JNQ1JfTVRCTSkgIC8qITwgVGltZXIgY291bnRlciBjbG9jayBpcyBzdG9wcGVkIGFuZCB0aGUgY291bnRlciBpcyByZXNldCAqLworLyoqCisgICogQH0KKyAgKi8gCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fVGltZXJfUmVwZXRpdGlvbl9VcGRhdGUgSFJUSU0gVGltZXIgUmVwZXRpdGlvbiBVcGRhdGUKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgd2hldGhlciByZWdpc3RlcnMgYXJlIHVwZGF0ZWQgd2hlbiB0aGUgdGltZXIKKyAgKiAgICAgICAgcmVwZXRpdGlvbiBwZXJpb2QgaXMgY29tcGxldGVkIChlaXRoZXIgZHVlIHRvIHJvbGwtb3ZlciBvcgorICAqICAgICAgICByZXNldCBldmVudHMpCisgICovCisjZGVmaW5lIEhSVElNX1VQREFURU9OUkVQRVRJVElPTl9ESVNBQkxFRCAweDAwMDAwMDAwVSAgICAgICAgICAvKiE8IFVwZGF0ZSBvbiByZXBldGl0aW9uIGRpc2FibGVkICovCisjZGVmaW5lIEhSVElNX1VQREFURU9OUkVQRVRJVElPTl9FTkFCTEVEICAoSFJUSU1fTUNSX01SRVBVKSAgICAvKiE8IFVwZGF0ZSBvbiByZXBldGl0aW9uIGVuYWJsZWQgKi8KKy8qKgorICAqIEB9CisgICovCisgICAgICAgICAgICAKKworLyoqIEBkZWZncm91cCBIUlRJTV9UaW1lcl9QdXNoX1B1bGxfTW9kZSBIUlRJTSBUaW1lciBQdXNoIFB1bGwgTW9kZQorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB3aGV0aGVyIG9yIG5vdCB0aGUgcHVocy1wdWxsIG1vZGUgaXMgZW5hYmxlZCBmb3IKKyAgKiAgICAgICAgYSB0aW1lci4KKyAgKi8KKyNkZWZpbmUgSFJUSU1fVElNUFVTSFBVTExNT0RFX0RJU0FCTEVEICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAvKiE8IFB1c2gtUHVsbCBtb2RlIGRpc2FibGVkICovIAorI2RlZmluZSBIUlRJTV9USU1QVVNIUFVMTE1PREVfRU5BQkxFRCAgICAoKHVpbnQzMl90KUhSVElNX1RJTUNSX1BTSFBMTCkgIC8qITwgUHVzaC1QdWxsIG1vZGUgZW5hYmxlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9UaW1lcl9GYXVsdF9FbmFibGluZyBIUlRJTSBUaW1lciBGYXVsdCBFbmFibGluZworICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB3aGV0aGVyIGEgZmF1dCBjaGFubmVsIGlzIGVuYWJsZWQgZm9yIGEgdGltZXIKKyAgKi8KKyNkZWZpbmUgSFJUSU1fVElNRkFVTFRFTkFCTEVfTk9ORSAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgTm8gZmF1bHQgZW5hYmxlZCAqLyAKKyNkZWZpbmUgSFJUSU1fVElNRkFVTFRFTkFCTEVfRkFVTFQxICAgKEhSVElNX0ZMVFJfRkxUMUVOKSAgIC8qITwgRmF1bHQgMSBlbmFibGVkICovIAorI2RlZmluZSBIUlRJTV9USU1GQVVMVEVOQUJMRV9GQVVMVDIgICAoSFJUSU1fRkxUUl9GTFQyRU4pICAgLyohPCBGYXVsdCAyIGVuYWJsZWQgKi8gCisjZGVmaW5lIEhSVElNX1RJTUZBVUxURU5BQkxFX0ZBVUxUMyAgIChIUlRJTV9GTFRSX0ZMVDNFTikgICAvKiE8IEZhdWx0IDMgZW5hYmxlZCAqLworI2RlZmluZSBIUlRJTV9USU1GQVVMVEVOQUJMRV9GQVVMVDQgICAoSFJUSU1fRkxUUl9GTFQ0RU4pICAgLyohPCBGYXVsdCA0IGVuYWJsZWQgKi8KKyNkZWZpbmUgSFJUSU1fVElNRkFVTFRFTkFCTEVfRkFVTFQ1ICAgKEhSVElNX0ZMVFJfRkxUNUVOKSAgIC8qITwgRmF1bHQgNSBlbmFibGVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX1RpbWVyX0ZhdWx0X0xvY2sgSFJUSU0gVGltZXIgRmF1bHQgTG9jaworICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB3aGV0aGVyIG9yIG5vdCBmYXVsdCBlbmFibGluZyBiaXRzIGFyZSB3cml0ZSAKKyAgKiAgICAgICAgcHJvdGVjdGVkIGZvciBhIHRpbWVyCisgICovCisjZGVmaW5lIEhSVElNX1RJTUZBVUxUTE9DS19SRUFEV1JJVEUgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgLyohPCBUaW1lciBmYXVsdCBlbmFibGluZyBiaXRzIGFyZSByZWFkL3dyaXRlICovCisjZGVmaW5lIEhSVElNX1RJTUZBVUxUTE9DS19SRUFET05MWSAgKEhSVElNX0ZMVFJfRkxUTENLKSAgICAgLyohPCBUaW1lciBmYXVsdCBlbmFibGluZyBiaXRzIGFyZSByZWFkIG9ubHkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fVGltZXJfRGVhZHRpbWVfSW5zZXJ0aW9uIEhSVElNIFRpbWVyIERlYWR0aW1lIEluc2VydGlvbgorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB3aGV0aGVyIG9yIG5vdCBmYXVsdCB0aGUgZGVhZCB0aW1lIGluc2VydGlvbiAgCisgICogICAgICAgIGZlYXR1cmUgaXMgZW5hYmxlZCBmb3IgYSB0aW1lcgorICAqLworI2RlZmluZSBIUlRJTV9USU1ERUFEVElNRUlOU0VSVElPTl9ESVNBQkxFRCAgICgweDAwMDAwMDAwVSkgICAgICAgICAgIC8qITwgT3V0cHV0IDEgYW5kIG91dHB1dCAyIHNpZ25hbHMgYXJlIGluZGVwZW5kZW50ICovCisjZGVmaW5lIEhSVElNX1RJTURFQURUSU1FSU5TRVJUSU9OX0VOQUJMRUQgICAgSFJUSU1fT1VUUl9EVEVOICAgICAgICAgLyohPCBEZWFkdGltZSBpcyBpbnNlcnRlZCBiZXR3ZWVuIG91dHB1dCAxIGFuZCBvdXRwdXQgMlUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fVGltZXJfRGVsYXllZF9Qcm90ZWN0aW9uX01vZGUgSFJUSU0gVGltZXIgRGVsYXllZCBQcm90ZWN0aW9uIE1vZGUKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgYWxsIHBvc3NpYmxlIGRlbGF5ZWQgcHJvdGVjdGlvbiBtb2RlcyAKKyAgKiAgICAgICAgZm9yIGEgdGltZXIuIEFsc28gZGVmaW5ldGhlIHNvdXJjZSBhbmQgb3V0cHV0cyBvbiB3aGljaCB0aGUgZGVsYXllZCAKKyAgKiAgICAgICAgcHJvdGVjdGlvbiBzY2hlbWVzIGFyZSBhcHBsaWVkCisgICovCisjZGVmaW5lIEhSVElNX1RJTUVSX0FfQl9DX0RFTEFZRURQUk9URUNUSU9OX0RJU0FCTEVEICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE5vIGFjdGlvbiAqLyAgICAKKyNkZWZpbmUgSFJUSU1fVElNRVJfQV9CX0NfREVMQVlFRFBST1RFQ1RJT05fREVMQVlFRE9VVDFfRUVWNiAgKEhSVElNX09VVFJfRExZUFJURU4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGltZXJzIEEsIEIsIEM6IE91dHB1dCAxIGRlbGF5ZWQgSWRsZSBvbiBleHRlcm5hbCBFdmVudCA2VSAqLworI2RlZmluZSBIUlRJTV9USU1FUl9BX0JfQ19ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVET1VUMl9FRVY2ICAoSFJUSU1fT1VUUl9ETFlQUlRfMCB8IEhSVElNX09VVFJfRExZUFJURU4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaW1lcnMgQSwgQiwgQzogT3V0cHV0IDIgZGVsYXllZCBJZGxlIG9uIGV4dGVybmFsIEV2ZW50IDZVICovCisjZGVmaW5lIEhSVElNX1RJTUVSX0FfQl9DX0RFTEFZRURQUk9URUNUSU9OX0RFTEFZRURCT1RIX0VFVjYgIChIUlRJTV9PVVRSX0RMWVBSVF8xIHwgSFJUSU1fT1VUUl9ETFlQUlRFTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWVycyBBLCBCLCBDOiBPdXRwdXQgMSBhbmQgb3V0cHV0IDIgZGVsYXllZCBJZGxlIG9uIGV4dGVybmFsIEV2ZW50IDZVICovCisjZGVmaW5lIEhSVElNX1RJTUVSX0FfQl9DX0RFTEFZRURQUk9URUNUSU9OX0JBTEFOQ0VEX0VFVjYgICAgIChIUlRJTV9PVVRSX0RMWVBSVF8xIHwgSFJUSU1fT1VUUl9ETFlQUlRfMCB8IEhSVElNX09VVFJfRExZUFJURU4pICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWVycyBBLCBCLCBDOiBCYWxhbmNlZCBJZGxlIG9uIGV4dGVybmFsIEV2ZW50IDZVICovCisjZGVmaW5lIEhSVElNX1RJTUVSX0FfQl9DX0RFTEFZRURQUk9URUNUSU9OX0RFTEFZRURPVVQxX0RFRVY3IChIUlRJTV9PVVRSX0RMWVBSVF8yIHwgSFJUSU1fT1VUUl9ETFlQUlRFTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWVycyBBLCBCLCBDOiBPdXRwdXQgMSBkZWxheWVkIElkbGUgb24gZXh0ZXJuYWwgRXZlbnQgN1UgKi8KKyNkZWZpbmUgSFJUSU1fVElNRVJfQV9CX0NfREVMQVlFRFBST1RFQ1RJT05fREVMQVlFRE9VVDJfREVFVjcgKEhSVElNX09VVFJfRExZUFJUXzIgfCBIUlRJTV9PVVRSX0RMWVBSVF8wIHwgSFJUSU1fT1VUUl9ETFlQUlRFTikgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGltZXJzIEEsIEIsIEM6IE91dHB1dCAyIGRlbGF5ZWQgSWRsZSBvbiBleHRlcm5hbCBFdmVudCA3VSAqLworI2RlZmluZSBIUlRJTV9USU1FUl9BX0JfQ19ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVEQk9USF9FRVY3ICAoSFJUSU1fT1VUUl9ETFlQUlRfMiB8IEhSVElNX09VVFJfRExZUFJUXzEgfCBIUlRJTV9PVVRSX0RMWVBSVEVOKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaW1lcnMgQSwgQiwgQzogT3V0cHV0IDEgYW5kIG91dHB1dDIgZGVsYXllZCBJZGxlIG9uIGV4dGVybmFsIEV2ZW50IDdVICovCisjZGVmaW5lIEhSVElNX1RJTUVSX0FfQl9DX0RFTEFZRURQUk9URUNUSU9OX0JBTEFOQ0VEX0VFVjcgICAgIChIUlRJTV9PVVRSX0RMWVBSVF8yIHwgSFJUSU1fT1VUUl9ETFlQUlRfMSB8IEhSVElNX09VVFJfRExZUFJUXzAgfCBIUlRJTV9PVVRSX0RMWVBSVEVOKSAvKiE8IFRpbWVycyBBLCBCLCBDOiBCYWxhbmNlZCBJZGxlIG9uIGV4dGVybmFsIEV2ZW50IDdVICovCisKKyNkZWZpbmUgSFJUSU1fVElNRVJfRF9FX0RFTEFZRURQUk9URUNUSU9OX0RJU0FCTEVEICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBObyBhY3Rpb24gKi8gICAgCisjZGVmaW5lIEhSVElNX1RJTUVSX0RfRV9ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVET1VUMV9FRVY4ICAgIChIUlRJTV9PVVRSX0RMWVBSVEVOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGltZXJzIEQsIEU6IE91dHB1dCAxIGRlbGF5ZWQgSWRsZSBvbiBleHRlcm5hbCBFdmVudCA2VSAqLworI2RlZmluZSBIUlRJTV9USU1FUl9EX0VfREVMQVlFRFBST1RFQ1RJT05fREVMQVlFRE9VVDJfRUVWOCAgICAoSFJUSU1fT1VUUl9ETFlQUlRfMCB8IEhSVElNX09VVFJfRExZUFJURU4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWVycyBELCBFOiBPdXRwdXQgMiBkZWxheWVkIElkbGUgb24gZXh0ZXJuYWwgRXZlbnQgNlUgKi8KKyNkZWZpbmUgSFJUSU1fVElNRVJfRF9FX0RFTEFZRURQUk9URUNUSU9OX0RFTEFZRURCT1RIX0VFVjggICAgKEhSVElNX09VVFJfRExZUFJUXzEgfCBIUlRJTV9PVVRSX0RMWVBSVEVOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaW1lcnMgRCwgRTogT3V0cHV0IDEgYW5kIG91dHB1dCAyIGRlbGF5ZWQgSWRsZSBvbiBleHRlcm5hbCBFdmVudCA2VSAqLworI2RlZmluZSBIUlRJTV9USU1FUl9EX0VfREVMQVlFRFBST1RFQ1RJT05fQkFMQU5DRURfRUVWOCAgICAgICAoSFJUSU1fT1VUUl9ETFlQUlRfMSB8IEhSVElNX09VVFJfRExZUFJUXzAgfCBIUlRJTV9PVVRSX0RMWVBSVEVOKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWVycyBELCBFOiBCYWxhbmNlZCBJZGxlIG9uIGV4dGVybmFsIEV2ZW50IDZVICovCisjZGVmaW5lIEhSVElNX1RJTUVSX0RfRV9ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVET1VUMV9ERUVWOSAgIChIUlRJTV9PVVRSX0RMWVBSVF8yIHwgSFJUSU1fT1VUUl9ETFlQUlRFTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGltZXJzIEQsIEU6IE91dHB1dCAxIGRlbGF5ZWQgSWRsZSBvbiBleHRlcm5hbCBFdmVudCA3VSAqLworI2RlZmluZSBIUlRJTV9USU1FUl9EX0VfREVMQVlFRFBST1RFQ1RJT05fREVMQVlFRE9VVDJfREVFVjkgICAoSFJUSU1fT1VUUl9ETFlQUlRfMiB8IEhSVElNX09VVFJfRExZUFJUXzAgfCBIUlRJTV9PVVRSX0RMWVBSVEVOKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWVycyBELCBFOiBPdXRwdXQgMiBkZWxheWVkIElkbGUgb24gZXh0ZXJuYWwgRXZlbnQgN1UgKi8KKyNkZWZpbmUgSFJUSU1fVElNRVJfRF9FX0RFTEFZRURQUk9URUNUSU9OX0RFTEFZRURCT1RIX0VFVjkgICAgKEhSVElNX09VVFJfRExZUFJUXzIgfCBIUlRJTV9PVVRSX0RMWVBSVF8xIHwgSFJUSU1fT1VUUl9ETFlQUlRFTikgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaW1lcnMgRCwgRTogT3V0cHV0IDEgYW5kIG91dHB1dDIgZGVsYXllZCBJZGxlIG9uIGV4dGVybmFsIEV2ZW50IDdVICovCisjZGVmaW5lIEhSVElNX1RJTUVSX0RfRV9ERUxBWUVEUFJPVEVDVElPTl9CQUxBTkNFRF9FRVY5ICAgICAgIChIUlRJTV9PVVRSX0RMWVBSVF8yIHwgSFJUSU1fT1VUUl9ETFlQUlRfMSB8IEhSVElNX09VVFJfRExZUFJUXzAgfCBIUlRJTV9PVVRSX0RMWVBSVEVOKSAgIC8qITwgVGltZXJzIEQsIEU6IEJhbGFuY2VkIElkbGUgb24gZXh0ZXJuYWwgRXZlbnQgN1UgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fVGltZXJfVXBkYXRlX1RyaWdnZXIgSFJUSU0gVGltZXIgVXBkYXRlIFRyaWdnZXIKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgd2hldGhlciB0aGUgcmVnaXN0ZXJzIHVwZGF0ZSBpcyBkb25lIHN5bmNocm9ub3VzbHkgCisgICogICAgICAgIHdpdGggYW55IG90aGVyIHRpbWVyIG9yIG1hc3RlciB1cGRhdGUKKyAgKi8KKyNkZWZpbmUgSFJUSU1fVElNVVBEQVRFVFJJR0dFUl9OT05FICAgICAweDAwMDAwMDAwVSAgICAgICAgICAvKiE8IFJlZ2lzdGVyIHVwZGF0ZSBpcyBkaXNhYmxlZCAqLyAgICAKKyNkZWZpbmUgSFJUSU1fVElNVVBEQVRFVFJJR0dFUl9NQVNURVIgICAoSFJUSU1fVElNQ1JfTVNUVSkgICAvKiE8IFJlZ2lzdGVyIHVwZGF0ZSBpcyB0cmlnZ2VyZWQgYnkgdGhlIG1hc3RlciB0aW1lciB1cGRhdGUgKi8gICAgCisjZGVmaW5lIEhSVElNX1RJTVVQREFURVRSSUdHRVJfVElNRVJfQSAgKEhSVElNX1RJTUNSX1RBVSkgICAgLyohPCBSZWdpc3RlciB1cGRhdGUgaXMgdHJpZ2dlcmVkIGJ5IHRoZSB0aW1lciBBIHVwZGF0ZSAqLyAgICAKKyNkZWZpbmUgSFJUSU1fVElNVVBEQVRFVFJJR0dFUl9USU1FUl9CICAoSFJUSU1fVElNQ1JfVEJVKSAgICAvKiE8IFJlZ2lzdGVyIHVwZGF0ZSBpcyB0cmlnZ2VyZWQgYnkgdGhlIHRpbWVyIEIgdXBkYXRlICovICAgIAorI2RlZmluZSBIUlRJTV9USU1VUERBVEVUUklHR0VSX1RJTUVSX0MgIChIUlRJTV9USU1DUl9UQ1UpICAgIC8qITwgUmVnaXN0ZXIgdXBkYXRlIGlzIHRyaWdnZXJlZCBieSB0aGUgdGltZXIgQyB1cGRhdGUqLyAgICAKKyNkZWZpbmUgSFJUSU1fVElNVVBEQVRFVFJJR0dFUl9USU1FUl9EICAoSFJUSU1fVElNQ1JfVERVKSAgICAvKiE8IFJlZ2lzdGVyIHVwZGF0ZSBpcyB0cmlnZ2VyZWQgYnkgdGhlIHRpbWVyIEQgdXBkYXRlICovICAgIAorI2RlZmluZSBIUlRJTV9USU1VUERBVEVUUklHR0VSX1RJTUVSX0UgIChIUlRJTV9USU1DUl9URVUpICAgIC8qITwgUmVnaXN0ZXIgdXBkYXRlIGlzIHRyaWdnZXJlZCBieSB0aGUgdGltZXIgRSB1cGRhdGUgKi8gICAgCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX1RpbWVyX1Jlc2V0X1RyaWdnZXIgSFJUSU0gVGltZXIgUmVzZXQgVHJpZ2dlcgorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB0aGUgZXZlbnRzIHRoYXQgY2FuIGJlIHNlbGVjdGVkIHRvIHRyaWdnZXIgdGhlIHJlc2V0IAorICAqICAgICAgICBvZiB0aGUgdGltZXIgY291bnRlcgorICAqLworI2RlZmluZSBIUlRJTV9USU1SRVNFVFRSSUdHRVJfTk9ORSAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAvKiE8IE5vIGNvdW50ZXIgcmVzZXQgdHJpZ2dlciAqLyAgICAKKyNkZWZpbmUgSFJUSU1fVElNUkVTRVRUUklHR0VSX1VQREFURSAgICAgIChIUlRJTV9SU1RSX1VQREFURSkgICAgLyohPCBUaGUgdGltZXIgY291bnRlciBpcyByZXNldCB1cG9uIHVwZGF0ZSBldmVudCAqLyAgICAKKyNkZWZpbmUgSFJUSU1fVElNUkVTRVRUUklHR0VSX0NNUDIgICAgICAgIChIUlRJTV9SU1RSX0NNUDIpICAgICAgLyohPCBUaGUgdGltZXIgY291bnRlciBpcyByZXNldCB1cG9uIFRpbWVyIENvbXBhcmUgMiBldmVudCAqLyAgICAKKyNkZWZpbmUgSFJUSU1fVElNUkVTRVRUUklHR0VSX0NNUDQgICAgICAgIChIUlRJTV9SU1RSX0NNUDQpICAgICAgLyohPCBUaGUgdGltZXIgY291bnRlciBpcyByZXNldCB1cG9uIFRpbWVyIENvbXBhcmUgNCBldmVudCAqLyAgICAKKyNkZWZpbmUgSFJUSU1fVElNUkVTRVRUUklHR0VSX01BU1RFUl9QRVIgIChIUlRJTV9SU1RSX01TVFBFUikgICAgLyohPCBUaGUgdGltZXIgY291bnRlciBpcyByZXNldCB1cG9uIG1hc3RlciB0aW1lciBwZXJpb2QgZXZlbnQgKi8gICAgCisjZGVmaW5lIEhSVElNX1RJTVJFU0VUVFJJR0dFUl9NQVNURVJfQ01QMSAoSFJUSU1fUlNUUl9NU1RDTVAxKSAgIC8qITwgVGhlIHRpbWVyIGNvdW50ZXIgaXMgcmVzZXQgdXBvbiBtYXN0ZXIgdGltZXIgQ29tcGFyZSAxIGV2ZW50ICovICAgIAorI2RlZmluZSBIUlRJTV9USU1SRVNFVFRSSUdHRVJfTUFTVEVSX0NNUDIgKEhSVElNX1JTVFJfTVNUQ01QMikgICAvKiE8IFRoZSB0aW1lciBjb3VudGVyIGlzIHJlc2V0IHVwb24gbWFzdGVyIHRpbWVyIENvbXBhcmUgMiBldmVudCAqLyAgICAKKyNkZWZpbmUgSFJUSU1fVElNUkVTRVRUUklHR0VSX01BU1RFUl9DTVAzIChIUlRJTV9SU1RSX01TVENNUDMpICAgLyohPCBUaGUgdGltZXIgY291bnRlciBpcyByZXNldCB1cG9uIG1hc3RlciB0aW1lciBDb21wYXJlIDMgZXZlbnQgKi8gICAgCisjZGVmaW5lIEhSVElNX1RJTVJFU0VUVFJJR0dFUl9NQVNURVJfQ01QNCAoSFJUSU1fUlNUUl9NU1RDTVA0KSAgIC8qITwgVGhlIHRpbWVyIGNvdW50ZXIgaXMgcmVzZXQgdXBvbiBtYXN0ZXIgdGltZXIgQ29tcGFyZSA0IGV2ZW50ICovICAgIAorI2RlZmluZSBIUlRJTV9USU1SRVNFVFRSSUdHRVJfRUVWXzEgICAgICAgKEhSVElNX1JTVFJfRVhURVZOVDEpICAvKiE8IFRoZSB0aW1lciBjb3VudGVyIGlzIHJlc2V0IHVwb24gZXh0ZXJuYWwgZXZlbnQgMVUgKi8gICAgCisjZGVmaW5lIEhSVElNX1RJTVJFU0VUVFJJR0dFUl9FRVZfMiAgICAgICAoSFJUSU1fUlNUUl9FWFRFVk5UMikgIC8qITwgVGhlIHRpbWVyIGNvdW50ZXIgaXMgcmVzZXQgdXBvbiBleHRlcm5hbCBldmVudCAyVSAqLyAgICAKKyNkZWZpbmUgSFJUSU1fVElNUkVTRVRUUklHR0VSX0VFVl8zICAgICAgIChIUlRJTV9SU1RSX0VYVEVWTlQzKSAgLyohPCBUaGUgdGltZXIgY291bnRlciBpcyByZXNldCB1cG9uIGV4dGVybmFsIGV2ZW50IDNVICovICAgIAorI2RlZmluZSBIUlRJTV9USU1SRVNFVFRSSUdHRVJfRUVWXzQgICAgICAgKEhSVElNX1JTVFJfRVhURVZOVDQpICAvKiE8IFRoZSB0aW1lciBjb3VudGVyIGlzIHJlc2V0IHVwb24gZXh0ZXJuYWwgZXZlbnQgNFUgKi8gICAgCisjZGVmaW5lIEhSVElNX1RJTVJFU0VUVFJJR0dFUl9FRVZfNSAgICAgICAoSFJUSU1fUlNUUl9FWFRFVk5UNSkgIC8qITwgVGhlIHRpbWVyIGNvdW50ZXIgaXMgcmVzZXQgdXBvbiBleHRlcm5hbCBldmVudCA1VSAqLyAgICAKKyNkZWZpbmUgSFJUSU1fVElNUkVTRVRUUklHR0VSX0VFVl82ICAgICAgIChIUlRJTV9SU1RSX0VYVEVWTlQ2KSAgLyohPCBUaGUgdGltZXIgY291bnRlciBpcyByZXNldCB1cG9uIGV4dGVybmFsIGV2ZW50IDZVICovICAgIAorI2RlZmluZSBIUlRJTV9USU1SRVNFVFRSSUdHRVJfRUVWXzcgICAgICAgKEhSVElNX1JTVFJfRVhURVZOVDcpICAvKiE8IFRoZSB0aW1lciBjb3VudGVyIGlzIHJlc2V0IHVwb24gZXh0ZXJuYWwgZXZlbnQgN1UgKi8gICAgCisjZGVmaW5lIEhSVElNX1RJTVJFU0VUVFJJR0dFUl9FRVZfOCAgICAgICAoSFJUSU1fUlNUUl9FWFRFVk5UOCkgIC8qITwgVGhlIHRpbWVyIGNvdW50ZXIgaXMgcmVzZXQgdXBvbiBleHRlcm5hbCBldmVudCA4VSAqLyAgICAKKyNkZWZpbmUgSFJUSU1fVElNUkVTRVRUUklHR0VSX0VFVl85ICAgICAgIChIUlRJTV9SU1RSX0VYVEVWTlQ5KSAgLyohPCBUaGUgdGltZXIgY291bnRlciBpcyByZXNldCB1cG9uIGV4dGVybmFsIGV2ZW50IDlVICovICAgIAorI2RlZmluZSBIUlRJTV9USU1SRVNFVFRSSUdHRVJfRUVWXzEwICAgICAgKEhSVElNX1JTVFJfRVhURVZOVDEwKSAvKiE8IFRoZSB0aW1lciBjb3VudGVyIGlzIHJlc2V0IHVwb24gZXh0ZXJuYWwgZXZlbnQgMTBVICovICAgIAorI2RlZmluZSBIUlRJTV9USU1SRVNFVFRSSUdHRVJfT1RIRVIxX0NNUDEgKEhSVElNX1JTVFJfVElNQkNNUDEpICAvKiE8IFRoZSB0aW1lciBjb3VudGVyIGlzIHJlc2V0IHVwb24gb3RoZXIgdGltZXIgQ29tcGFyZSAxIGV2ZW50ICovICAgIAorI2RlZmluZSBIUlRJTV9USU1SRVNFVFRSSUdHRVJfT1RIRVIxX0NNUDIgKEhSVElNX1JTVFJfVElNQkNNUDIpICAvKiE8IFRoZSB0aW1lciBjb3VudGVyIGlzIHJlc2V0IHVwb24gb3RoZXIgdGltZXIgQ29tcGFyZSAyIGV2ZW50ICovICAgIAorI2RlZmluZSBIUlRJTV9USU1SRVNFVFRSSUdHRVJfT1RIRVIxX0NNUDQgKEhSVElNX1JTVFJfVElNQkNNUDQpICAvKiE8IFRoZSB0aW1lciBjb3VudGVyIGlzIHJlc2V0IHVwb24gb3RoZXIgdGltZXIgQ29tcGFyZSA0IGV2ZW50ICovICAgIAorI2RlZmluZSBIUlRJTV9USU1SRVNFVFRSSUdHRVJfT1RIRVIyX0NNUDEgKEhSVElNX1JTVFJfVElNQ0NNUDEpICAvKiE8IFRoZSB0aW1lciBjb3VudGVyIGlzIHJlc2V0IHVwb24gb3RoZXIgdGltZXIgQ29tcGFyZSAxIGV2ZW50ICovICAgIAorI2RlZmluZSBIUlRJTV9USU1SRVNFVFRSSUdHRVJfT1RIRVIyX0NNUDIgKEhSVElNX1JTVFJfVElNQ0NNUDIpICAvKiE8IFRoZSB0aW1lciBjb3VudGVyIGlzIHJlc2V0IHVwb24gb3RoZXIgdGltZXIgQ29tcGFyZSAyIGV2ZW50ICovICAgIAorI2RlZmluZSBIUlRJTV9USU1SRVNFVFRSSUdHRVJfT1RIRVIyX0NNUDQgKEhSVElNX1JTVFJfVElNQ0NNUDQpICAvKiE8IFRoZSB0aW1lciBjb3VudGVyIGlzIHJlc2V0IHVwb24gb3RoZXIgdGltZXIgQ29tcGFyZSA0IGV2ZW50ICovICAgIAorI2RlZmluZSBIUlRJTV9USU1SRVNFVFRSSUdHRVJfT1RIRVIzX0NNUDEgKEhSVElNX1JTVFJfVElNRENNUDEpICAvKiE8IFRoZSB0aW1lciBjb3VudGVyIGlzIHJlc2V0IHVwb24gb3RoZXIgdGltZXIgQ29tcGFyZSAxIGV2ZW50ICovICAgIAorI2RlZmluZSBIUlRJTV9USU1SRVNFVFRSSUdHRVJfT1RIRVIzX0NNUDIgKEhSVElNX1JTVFJfVElNRENNUDIpICAvKiE8IFRoZSB0aW1lciBjb3VudGVyIGlzIHJlc2V0IHVwb24gb3RoZXIgdGltZXIgQ29tcGFyZSAyIGV2ZW50ICovICAgIAorI2RlZmluZSBIUlRJTV9USU1SRVNFVFRSSUdHRVJfT1RIRVIzX0NNUDQgKEhSVElNX1JTVFJfVElNRENNUDQpICAvKiE8IFRoZSB0aW1lciBjb3VudGVyIGlzIHJlc2V0IHVwb24gb3RoZXIgdGltZXIgQ29tcGFyZSA0IGV2ZW50ICovICAgIAorI2RlZmluZSBIUlRJTV9USU1SRVNFVFRSSUdHRVJfT1RIRVI0X0NNUDEgKEhSVElNX1JTVFJfVElNRUNNUDEpICAvKiE8IFRoZSB0aW1lciBjb3VudGVyIGlzIHJlc2V0IHVwb24gb3RoZXIgdGltZXIgQ29tcGFyZSAxIGV2ZW50ICovICAgIAorI2RlZmluZSBIUlRJTV9USU1SRVNFVFRSSUdHRVJfT1RIRVI0X0NNUDIgKEhSVElNX1JTVFJfVElNRUNNUDIpICAvKiE8IFRoZSB0aW1lciBjb3VudGVyIGlzIHJlc2V0IHVwb24gb3RoZXIgdGltZXIgQ29tcGFyZSAyIGV2ZW50ICovICAgIAorI2RlZmluZSBIUlRJTV9USU1SRVNFVFRSSUdHRVJfT1RIRVI0X0NNUDQgKEhSVElNX1JTVFJfVElNRUNNUDQpICAvKiE8IFRoZSB0aW1lciBjb3VudGVyIGlzIHJlc2V0IHVwb24gb3RoZXIgdGltZXIgQ29tcGFyZSA0IGV2ZW50ICovICAgIAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9UaW1lcl9SZXNldF9VcGRhdGUgSFJUSU0gVGltZXIgUmVzZXQgVXBkYXRlCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHdoZXRoZXIgdGhlIHJlZ2lzdGVyIGFyZSB1cGRhdGVkIHVwb24gVGltZXJ4IAorICAqICAgICAgICBjb3VudGVyIHJlc2V0IG9yIHJvbGwtb3ZlciB0byAwIGFmdGVyIHJlYWNoaW5nIHRoZSBwZXJpb2QgdmFsdWUKKyAgKiAgICAgICAgaW4gY29udGludW91cyBtb2RlCisgICovCisjZGVmaW5lIEhSVElNX1RJTVVQREFURU9OUkVTRVRfRElTQUJMRUQgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgVXBkYXRlIGJ5IHRpbWVyIHggcmVzZXQgLyByb2xsLW92ZXIgZGlzYWJsZWQgKi8KKyNkZWZpbmUgSFJUSU1fVElNVVBEQVRFT05SRVNFVF9FTkFCTEVEIChIUlRJTV9USU1DUl9UUlNUVSkgICAgLyohPCBVcGRhdGUgYnkgdGltZXIgeCByZXNldCAvIHJvbGwtb3ZlciBlbmFibGVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0NvbXBhcmVfVW5pdF9BdXRvX0RlbGF5ZWRfTW9kZSBIUlRJTSBDb21wYXJlIFVuaXQgQXV0byBEZWxheWVkIE1vZGUKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgd2hldGhlciB0aGUgY29tcGFyZSByZWdpc3RlciBpcyBiZWhhdmluZyBpbiAKKyAgKiAgICAgICAgcmVndWxhciBtb2RlIChjb21wYXJlIG1hdGNoIGlzc3VlZCBhcyBzb29uIGFzIGNvdW50ZXIgZXF1YWwgY29tcGFyZSksCisgICogICAgICAgIG9yIGluIGF1dG8tZGVsYXllZCBtb2RlCisgICovCisjZGVmaW5lIEhSVElNX0FVVE9ERUxBWUVETU9ERV9SRUdVTEFSICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHN0YW5kYXJkIGNvbXBhcmUgbW9kZSAqLyAgICAKKyNkZWZpbmUgSFJUSU1fQVVUT0RFTEFZRURNT0RFX0FVVE9ERUxBWUVEX05PVElNRU9VVCAgIChIUlRJTV9USU1DUl9ERUxDTVAyXzApICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyZSBldmVudCBnZW5lcmF0ZWQgb25seSBpZiBhIGNhcHR1cmUgaGFzIG9jY3VycmVkICovICAgIAorI2RlZmluZSBIUlRJTV9BVVRPREVMQVlFRE1PREVfQVVUT0RFTEFZRURfVElNRU9VVENNUDEgKEhSVElNX1RJTUNSX0RFTENNUDJfMSkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJlIGV2ZW50IGdlbmVyYXRlZCBpZiBhIGNhcHR1cmUgaGFzIG9jY3VycmVkIG9yIGFmdGVyIGEgQ29tcGFyZSAxIG1hdGNoICh0aW1lb3V0IGlmIGNhcHR1cmUgZXZlbnQgaXMgbWlzc2luZykgKi8gICAgCisjZGVmaW5lIEhSVElNX0FVVE9ERUxBWUVETU9ERV9BVVRPREVMQVlFRF9USU1FT1VUQ01QMyAoSFJUSU1fVElNQ1JfREVMQ01QMl8xIHwgSFJUSU1fVElNQ1JfREVMQ01QMl8wKSAvKiE8IENvbXBhcmUgZXZlbnQgZ2VuZXJhdGVkIGlmIGEgY2FwdHVyZSBoYXMgb2NjdXJyZWQgb3IgYWZ0ZXIgYSBDb21wYXJlIDMgbWF0Y2ggKHRpbWVvdXQgaWYgY2FwdHVyZSBldmVudCBpcyBtaXNzaW5nKSAqLyAgICAKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fU2ltcGxlX09DX01vZGUgSFJUSU0gU2ltcGxlIE9DIE1vZGUKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgdGhlIGJlaGF2aW9yIG9mIHRoZSBvdXRwdXQgc2lnbmFsIHdoZW4gdGhlIHRpbWVyCisgICAgICAgICAgIG9wZXJhdGVzIGluIGJhc2ljIG91dHB1dCBjb21wYXJlIG1vZGUKKyAgKi8gICAgICAgICAgICAgIAorI2RlZmluZSBIUlRJTV9CQVNJQ09DTU9ERV9UT0dHTEUgICAgKDB4MDAwMDAwMDFVKSAgLyohPCBPdXRwdXQgdG9nZ2xlcyB3aGVuIHRoZSB0aW1lciBjb3VudGVyIHJlYWNoZXMgdGhlIGNvbXBhcmUgdmFsdWUgKi8KKyNkZWZpbmUgSFJUSU1fQkFTSUNPQ01PREVfSU5BQ1RJVkUgICgweDAwMDAwMDAyVSkgIC8qITwgT3V0cHV0IGZvcmNlZCB0byBhY3RpdmUgbGV2ZWwgd2hlbiB0aGUgdGltZXIgY291bnRlciByZWFjaGVzIHRoZSBjb21wYXJlIHZhbHVlICovCisjZGVmaW5lIEhSVElNX0JBU0lDT0NNT0RFX0FDVElWRSAgICAoMHgwMDAwMDAwM1UpICAvKiE8IE91dHB1dCBmb3JjZWQgdG8gaW5hY3RpdmUgbGV2ZWwgd2hlbiB0aGUgdGltZXIgY291bnRlciByZWFjaGVzIHRoZSBjb21wYXJlIHZhbHVlICovCisKKyNkZWZpbmUgSVNfSFJUSU1fQkFTSUNPQ01PREUoQkFTSUNPQ01PREUpXAorICAgICAgICAgICAgICAoKChCQVNJQ09DTU9ERSkgPT0gSFJUSU1fQkFTSUNPQ01PREVfVE9HR0xFKSAgIHx8IFwKKyAgICAgICAgICAgICAgICgoQkFTSUNPQ01PREUpID09IEhSVElNX0JBU0lDT0NNT0RFX0lOQUNUSVZFKSB8fCBcCisgICAgICAgICAgICAgICAoKEJBU0lDT0NNT0RFKSA9PSBIUlRJTV9CQVNJQ09DTU9ERV9BQ1RJVkUpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9PdXRwdXRfUG9sYXJpdHkgSFJUSU0gT3V0cHV0IFBvbGFyaXR5CisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRoZSBwb2xhcml0eSBvZiBhIHRpbWVyIG91dHB1dAorICAqLyAgICAgICAgICAgICAgCisjZGVmaW5lIEhSVElNX09VVFBVVFBPTEFSSVRZX0hJR0ggICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgLyohPCBPdXRwdXQgaXMgYWNpdHZlIEhJR0ggKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUUE9MQVJJVFlfTE9XICAgICAoSFJUSU1fT1VUUl9QT0wxKSAgICAgICAvKiE8IE91dHB1dCBpcyBhY3RpdmUgTE9XICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX091dHB1dF9TZXRfU291cmNlIEhSVElNIE91dHB1dCBTZXQgU291cmNlCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRoZSBldmVudHMgdGhhdCBjYW4gYmUgc2VsZWN0ZWQgdG8gY29uZmlndXJlIHRoZQorICAqICAgICAgICBzZXQgY3Jvc3NiYXIgb2YgYSB0aW1lciBvdXRwdXQKKyAgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUU0VUX05PTkUgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBSZXNldCB0aGUgb3V0cHV0IHNldCBjcm9zc2JhciAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfUkVTWU5DICAgICAoSFJUSU1fU0VUMVJfUkVTWU5DKSAgICAvKiE8IFRpbWVyIHJlc2V0IGV2ZW50IGNvbWluZyBzb2xlbHkgZnJvbSBzb2Z0d2FyZSBvciBTWU5DIGlucHV0IGZvcmNlcyB0aGUgb3V0cHV0IHRvIGl0cyBhY3RpdmUgc3RhdGUgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUU0VUX1RJTVBFUiAgICAgKEhSVElNX1NFVDFSX1BFUikgICAgICAgLyohPCBUaW1lciBwZXJpb2QgZXZlbnQgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNQ01QMSAgICAoSFJUSU1fU0VUMVJfQ01QMSkgICAgICAvKiE8IFRpbWVyIGNvbXBhcmUgMSBldmVudCBmb3JjZXMgdGhlIG91dHB1dCB0byBpdHMgYWN0aXZlIHN0YXRlICovCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1DTVAyICAgIChIUlRJTV9TRVQxUl9DTVAyKSAgICAgIC8qITwgVGltZXIgY29tcGFyZSAyIGV2ZW50IGZvcmNlcyB0aGUgb3V0cHV0IHRvIGl0cyBhY3RpdmUgc3RhdGUgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUU0VUX1RJTUNNUDMgICAgKEhSVElNX1NFVDFSX0NNUDMpICAgICAgLyohPCBUaW1lciBjb21wYXJlIDMgZXZlbnQgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNQ01QNCAgICAoSFJUSU1fU0VUMVJfQ01QNCkgICAgICAvKiE8IFRpbWVyIGNvbXBhcmUgNCBldmVudCBmb3JjZXMgdGhlIG91dHB1dCB0byBpdHMgYWN0aXZlIHN0YXRlICovCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9NQVNURVJQRVIgIChIUlRJTV9TRVQxUl9NU1RQRVIpICAgIC8qITwgVGhlIG1hc3RlciB0aW1lciBwZXJpb2QgZXZlbnQgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfTUFTVEVSQ01QMSAoSFJUSU1fU0VUMVJfTVNUQ01QMSkgICAvKiE8IE1hc3RlciBUaW1lciBjb21wYXJlIDEgZXZlbnQgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfTUFTVEVSQ01QMiAoSFJUSU1fU0VUMVJfTVNUQ01QMikgICAvKiE8IE1hc3RlciBUaW1lciBjb21wYXJlIDIgZXZlbnQgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfTUFTVEVSQ01QMyAoSFJUSU1fU0VUMVJfTVNUQ01QMykgICAvKiE8IE1hc3RlciBUaW1lciBjb21wYXJlIDMgZXZlbnQgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfTUFTVEVSQ01QNCAoSFJUSU1fU0VUMVJfTVNUQ01QNCkgICAvKiE8IE1hc3RlciBUaW1lciBjb21wYXJlIDQgZXZlbnQgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfMSAgICAoSFJUSU1fU0VUMVJfVElNRVZOVDEpICAvKiE8IFRpbWVyIGV2ZW50IDEgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfMiAgICAoSFJUSU1fU0VUMVJfVElNRVZOVDIpICAvKiE8IFRpbWVyIGV2ZW50IDIgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfMyAgICAoSFJUSU1fU0VUMVJfVElNRVZOVDMpICAvKiE8IFRpbWVyIGV2ZW50IDMgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNCAgICAoSFJUSU1fU0VUMVJfVElNRVZOVDQpICAvKiE8IFRpbWVyIGV2ZW50IDQgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNSAgICAoSFJUSU1fU0VUMVJfVElNRVZOVDUpICAvKiE8IFRpbWVyIGV2ZW50IDUgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNiAgICAoSFJUSU1fU0VUMVJfVElNRVZOVDYpICAvKiE8IFRpbWVyIGV2ZW50IDYgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNyAgICAoSFJUSU1fU0VUMVJfVElNRVZOVDcpICAvKiE8IFRpbWVyIGV2ZW50IDcgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfOCAgICAoSFJUSU1fU0VUMVJfVElNRVZOVDgpICAvKiE8IFRpbWVyIGV2ZW50IDggZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfOSAgICAoSFJUSU1fU0VUMVJfVElNRVZOVDkpICAvKiE8IFRpbWVyIGV2ZW50IDkgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfRUVWXzEgICAgICAoSFJUSU1fU0VUMVJfRVhUVk5UMSkgICAvKiE8IEV4dGVybmFsIGV2ZW50IDEgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfRUVWXzIgICAgICAoSFJUSU1fU0VUMVJfRVhUVk5UMikgICAvKiE8IEV4dGVybmFsIGV2ZW50IDIgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfRUVWXzMgICAgICAoSFJUSU1fU0VUMVJfRVhUVk5UMykgICAvKiE8IEV4dGVybmFsIGV2ZW50IDMgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfRUVWXzQgICAgICAoSFJUSU1fU0VUMVJfRVhUVk5UNCkgICAvKiE8IEV4dGVybmFsIGV2ZW50IDQgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfRUVWXzUgICAgICAoSFJUSU1fU0VUMVJfRVhUVk5UNSkgICAvKiE8IEV4dGVybmFsIGV2ZW50IDUgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfRUVWXzYgICAgICAoSFJUSU1fU0VUMVJfRVhUVk5UNikgICAvKiE8IEV4dGVybmFsIGV2ZW50IDYgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfRUVWXzcgICAgICAoSFJUSU1fU0VUMVJfRVhUVk5UNykgICAvKiE8IEV4dGVybmFsIGV2ZW50IDcgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfRUVWXzggICAgICAoSFJUSU1fU0VUMVJfRVhUVk5UOCkgICAvKiE8IEV4dGVybmFsIGV2ZW50IDggZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfRUVWXzkgICAgICAoSFJUSU1fU0VUMVJfRVhUVk5UOSkgICAvKiE8IEV4dGVybmFsIGV2ZW50IDkgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfRUVWXzEwICAgICAoSFJUSU1fU0VUMVJfRVhUVk5UMTApICAvKiE8IEV4dGVybmFsIGV2ZW50IDEwIGZvcmNlcyB0aGUgb3V0cHV0IHRvIGl0cyBhY3RpdmUgc3RhdGUgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUU0VUX1VQREFURSAgICAgKEhSVElNX1NFVDFSX1VQREFURSkgICAgLyohPCBUaW1lciByZWdpc3RlciB1cGRhdGUgZXZlbnQgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGFjdGl2ZSBzdGF0ZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9PdXRwdXRfUmVzZXRfU291cmNlIEhSVElNIE91dHB1dCBSZXNldCBTb3VyY2UKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgdGhlIGV2ZW50cyB0aGF0IGNhbiBiZSBzZWxlY3RlZCB0byBjb25maWd1cmUgdGhlCisgICogICAgICAgIHNldCBjcm9zc2JhciBvZiBhIHRpbWVyIG91dHB1dAorICAqLyAgCisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX05PTkUgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBSZXNldCB0aGUgb3V0cHV0IHJlc2V0IGNyb3NzYmFyICovCisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1JFU1lOQyAgICAgKEhSVElNX1JTVDFSX1JFU1lOQykgICAgLyohPCBUaW1lciByZXNldCBldmVudCBjb21pbmcgc29sZWx5IGZyb20gc29mdHdhcmUgb3IgU1lOQyBpbnB1dCBmb3JjZXMgdGhlIG91dHB1dCB0byBpdHMgaW5hY3RpdmUgc3RhdGUgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNUEVSICAgICAoSFJUSU1fUlNUMVJfUEVSKSAgICAgICAvKiE8IFRpbWVyIHBlcmlvZCBldmVudCBmb3JjZXMgdGhlIG91dHB1dCB0byBpdHMgaW5hY3RpdmUgc3RhdGUgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNQ01QMSAgICAoSFJUSU1fUlNUMVJfQ01QMSkgICAgICAvKiE8IFRpbWVyIGNvbXBhcmUgMSBldmVudCBmb3JjZXMgdGhlIG91dHB1dCB0byBpdHMgaW5hY3RpdmUgc3RhdGUgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNQ01QMiAgICAoSFJUSU1fUlNUMVJfQ01QMikgICAgICAvKiE8IFRpbWVyIGNvbXBhcmUgMiBldmVudCBmb3JjZXMgdGhlIG91dHB1dCB0byBpdHMgaW5hY3RpdmUgc3RhdGUgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNQ01QMyAgICAoSFJUSU1fUlNUMVJfQ01QMykgICAgICAvKiE8IFRpbWVyIGNvbXBhcmUgMyBldmVudCBmb3JjZXMgdGhlIG91dHB1dCB0byBpdHMgaW5hY3RpdmUgc3RhdGUgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNQ01QNCAgICAoSFJUSU1fUlNUMVJfQ01QNCkgICAgICAvKiE8IFRpbWVyIGNvbXBhcmUgNCBldmVudCBmb3JjZXMgdGhlIG91dHB1dCB0byBpdHMgaW5hY3RpdmUgc3RhdGUgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfTUFTVEVSUEVSICAoSFJUSU1fUlNUMVJfTVNUUEVSKSAgICAvKiE8IFRoZSBtYXN0ZXIgdGltZXIgcGVyaW9kIGV2ZW50IGZvcmNlcyB0aGUgb3V0cHV0IHRvIGl0cyBpbmFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9NQVNURVJDTVAxIChIUlRJTV9SU1QxUl9NU1RDTVAxKSAgIC8qITwgTWFzdGVyIFRpbWVyIGNvbXBhcmUgMSBldmVudCBmb3JjZXMgdGhlIG91dHB1dCB0byBpdHMgaW5hY3RpdmUgc3RhdGUgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfTUFTVEVSQ01QMiAoSFJUSU1fUlNUMVJfTVNUQ01QMikgICAvKiE8IE1hc3RlciBUaW1lciBjb21wYXJlIDIgZXZlbnQgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGluYWN0aXZlIHN0YXRlICovCisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX01BU1RFUkNNUDMgKEhSVElNX1JTVDFSX01TVENNUDMpICAgLyohPCBNYXN0ZXIgVGltZXIgY29tcGFyZSAzIGV2ZW50IGZvcmNlcyB0aGUgb3V0cHV0IHRvIGl0cyBpbmFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9NQVNURVJDTVA0IChIUlRJTV9SU1QxUl9NU1RDTVA0KSAgIC8qITwgTWFzdGVyIFRpbWVyIGNvbXBhcmUgNCBldmVudCBmb3JjZXMgdGhlIG91dHB1dCB0byBpdHMgaW5hY3RpdmUgc3RhdGUgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNRVZfMSAgICAoSFJUSU1fUlNUMVJfVElNRVZOVDEpICAvKiE8IFRpbWVyIGV2ZW50IDEgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGluYWN0aXZlIHN0YXRlICovCisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUVWXzIgICAgKEhSVElNX1JTVDFSX1RJTUVWTlQyKSAgLyohPCBUaW1lciBldmVudCAyIGZvcmNlcyB0aGUgb3V0cHV0IHRvIGl0cyBpbmFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1FVl8zICAgIChIUlRJTV9SU1QxUl9USU1FVk5UMykgIC8qITwgVGltZXIgZXZlbnQgMyBmb3JjZXMgdGhlIG91dHB1dCB0byBpdHMgaW5hY3RpdmUgc3RhdGUgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNRVZfNCAgICAoSFJUSU1fUlNUMVJfVElNRVZOVDQpICAvKiE8IFRpbWVyIGV2ZW50IDQgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGluYWN0aXZlIHN0YXRlICovCisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUVWXzUgICAgKEhSVElNX1JTVDFSX1RJTUVWTlQ1KSAgLyohPCBUaW1lciBldmVudCA1IGZvcmNlcyB0aGUgb3V0cHV0IHRvIGl0cyBpbmFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1FVl82ICAgIChIUlRJTV9SU1QxUl9USU1FVk5UNikgIC8qITwgVGltZXIgZXZlbnQgNiBmb3JjZXMgdGhlIG91dHB1dCB0byBpdHMgaW5hY3RpdmUgc3RhdGUgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNRVZfNyAgICAoSFJUSU1fUlNUMVJfVElNRVZOVDcpICAvKiE8IFRpbWVyIGV2ZW50IDcgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGluYWN0aXZlIHN0YXRlICovCisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUVWXzggICAgKEhSVElNX1JTVDFSX1RJTUVWTlQ4KSAgLyohPCBUaW1lciBldmVudCA4IGZvcmNlcyB0aGUgb3V0cHV0IHRvIGl0cyBpbmFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1FVl85ICAgIChIUlRJTV9SU1QxUl9USU1FVk5UOSkgIC8qITwgVGltZXIgZXZlbnQgOSBmb3JjZXMgdGhlIG91dHB1dCB0byBpdHMgaW5hY3RpdmUgc3RhdGUgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfRUVWXzEgICAgICAoSFJUSU1fUlNUMVJfRVhUVk5UMSkgICAvKiE8IEV4dGVybmFsIGV2ZW50IDEgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGluYWN0aXZlIHN0YXRlICovCisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX0VFVl8yICAgICAgKEhSVElNX1JTVDFSX0VYVFZOVDIpICAgLyohPCBFeHRlcm5hbCBldmVudCAyIGZvcmNlcyB0aGUgb3V0cHV0IHRvIGl0cyBpbmFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9FRVZfMyAgICAgIChIUlRJTV9SU1QxUl9FWFRWTlQzKSAgIC8qITwgRXh0ZXJuYWwgZXZlbnQgMyBmb3JjZXMgdGhlIG91dHB1dCB0byBpdHMgaW5hY3RpdmUgc3RhdGUgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfRUVWXzQgICAgICAoSFJUSU1fUlNUMVJfRVhUVk5UNCkgICAvKiE8IEV4dGVybmFsIGV2ZW50IDQgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGluYWN0aXZlIHN0YXRlICovCisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX0VFVl81ICAgICAgKEhSVElNX1JTVDFSX0VYVFZOVDUpICAgLyohPCBFeHRlcm5hbCBldmVudCA1IGZvcmNlcyB0aGUgb3V0cHV0IHRvIGl0cyBpbmFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9FRVZfNiAgICAgIChIUlRJTV9SU1QxUl9FWFRWTlQ2KSAgIC8qITwgRXh0ZXJuYWwgZXZlbnQgNiBmb3JjZXMgdGhlIG91dHB1dCB0byBpdHMgaW5hY3RpdmUgc3RhdGUgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfRUVWXzcgICAgICAoSFJUSU1fUlNUMVJfRVhUVk5UNykgICAvKiE8IEV4dGVybmFsIGV2ZW50IDcgZm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGluYWN0aXZlIHN0YXRlICovCisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX0VFVl84ICAgICAgKEhSVElNX1JTVDFSX0VYVFZOVDgpICAgLyohPCBFeHRlcm5hbCBldmVudCA4IGZvcmNlcyB0aGUgb3V0cHV0IHRvIGl0cyBpbmFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9FRVZfOSAgICAgIChIUlRJTV9SU1QxUl9FWFRWTlQ5KSAgIC8qITwgRXh0ZXJuYWwgZXZlbnQgOSBmb3JjZXMgdGhlIG91dHB1dCB0byBpdHMgaW5hY3RpdmUgc3RhdGUgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfRUVWXzEwICAgICAoSFJUSU1fUlNUMVJfRVhUVk5UMTApICAvKiE8IEV4dGVybmFsIGV2ZW50IDEwIGZvcmNlcyB0aGUgb3V0cHV0IHRvIGl0cyBpbmFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9VUERBVEUgICAgIChIUlRJTV9SU1QxUl9VUERBVEUpICAgIC8qITwgVGltZXIgcmVnaXN0ZXIgdXBkYXRlIGV2ZW50IGZvcmNlcyB0aGUgb3V0cHV0IHRvIGl0cyBpbmFjdGl2ZSBzdGF0ZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9PdXRwdXRfSWRsZV9Nb2RlIEhSVElNIE91dHB1dCBJZGxlIE1vZGUKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgd2hldGhlciBvciBub3QgdGhlIHRpbWVyIG91dHB1dCB0cmFuc2l0aW9uIHRvIGl0cyAKKyAgICAgICAgICAgSURMRSBzdGF0ZSB3aGVuIGJ1cnN0IG1vZGUgaXMgZW50ZXJlZAorICAqLyAgCisjZGVmaW5lIEhSVElNX09VVFBVVElETEVNT0RFX05PTkUgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IFRoZSBvdXRwdXQgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSBidXJzdCBtb2RlIG9wZXJhdGlvbiAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRJRExFTU9ERV9JRExFICAgICAoSFJUSU1fT1VUUl9JRExNMSkgICAgLyohPCBUaGUgb3V0cHV0IGlzIGluIGlkbGUgc3RhdGUgd2hlbiByZXF1ZXN0ZWQgYnkgdGhlIGJ1cnN0IG1vZGUgY29udHJvbGxlciAqLworIC8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fT3V0cHV0X0lETEVfTGV2ZWwgSFJUSU0gT3V0cHV0IElETEUgTGV2ZWwKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgdGhlIG91dHB1dCBsZXZlbCB3aGVuIG91dHB1dCBpcyBpbiBJRExFIHN0YXRlCisgICovICAKKyNkZWZpbmUgSFJUSU1fT1VUUFVUSURMRUxFVkVMX0lOQUNUSVZFICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgT3V0cHV0IGF0IGluYWN0aXZlIGxldmVsIHdoZW4gaW4gSURMRSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRJRExFTEVWRUxfQUNUSVZFICAgICAoSFJUSU1fT1VUUl9JRExFUzEpICAgLyohPCBPdXRwdXQgYXQgYWN0aXZlIGxldmVsIHdoZW4gaW4gSURMRSBzdGF0ZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9PdXRwdXRfRkFVTFRfTGV2ZWwgSFJUSU0gT3V0cHV0IEZBVUxUIExldmVsCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRoZSBvdXRwdXQgbGV2ZWwgd2hlbiBvdXRwdXQgaXMgaW4gRkFVTFQgc3RhdGUKKyAgKi8gIAorI2RlZmluZSBIUlRJTV9PVVRQVVRGQVVMVExFVkVMX05PTkUgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBvdXRwdXQgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSBmYXVsdCBpbnB1dCAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRGQVVMVExFVkVMX0FDVElWRSAgICAoSFJUSU1fT1VUUl9GQVVMVDFfMCkgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE91dHB1dCBhdCBhY3RpdmUgbGV2ZWwgd2hlbiBpbiBGQVVMVCBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRGQVVMVExFVkVMX0lOQUNUSVZFICAoSFJUSU1fT1VUUl9GQVVMVDFfMSkgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE91dHB1dCBhdCBpbmFjdGl2ZSBsZXZlbCB3aGVuIGluIEZBVUxUIHN0YXRlICovCisjZGVmaW5lIEhSVElNX09VVFBVVEZBVUxUTEVWRUxfSElHSFogICAgIChIUlRJTV9PVVRSX0ZBVUxUMV8xIHwgSFJUSU1fT1VUUl9GQVVMVDFfMCkgIC8qITwgT3V0cHV0IGlzIHRyaS1zdGF0ZWQgd2hlbiBpbiBGQVVMVCBzdGF0ZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9PdXRwdXRfQ2hvcHBlcl9Nb2RlX0VuYWJsZSBIUlRJTSBPdXRwdXQgQ2hvcHBlciBNb2RlIEVuYWJsZQorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB3aGV0aGVyIG9yIG5vdCBjaG9wcGVyIG1vZGUgaXMgZW5hYmxlZCBmb3IgYSB0aW1lcgorICAgICAgICAgICBvdXRwdXQKKyAgKi8gIAorI2RlZmluZSBIUlRJTV9PVVRQVVRDSE9QUEVSTU9ERV9ESVNBQkxFRCAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IE91dHB1dCBzaWduYWwgaXMgbm90IGFsdGVyZWQgICovCisjZGVmaW5lIEhSVElNX09VVFBVVENIT1BQRVJNT0RFX0VOQUJMRUQgICAgKEhSVElNX09VVFJfQ0hQMSkgICAgIC8qITwgT3V0cHV0IHNpZ25hbCBpcyBjaG9wcGVkIGJ5IGEgY2FycmllciBzaWduYWwgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX091dHB1dF9CdXJzdF9Nb2RlX0VudHJ5X0RlbGF5ZWQgSFJUSU0gT3V0cHV0IEJ1cnN0IE1vZGUgRW50cnkgRGVsYXllZAorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB0aGUgaWRsZSBtb2RlIGVudHJ5IGlzIGRlbGF5ZWQgYnkgZm9yY2luZyBhIAorICAgICAgICAgICBkZWFkdGltZSBpbnNlcnRpb24gYmVmb3JlIHN3aXRjaGluZyB0aGUgb3V0cHV0cyB0byB0aGVpciBpZGxlIHN0YXRlCisgICovIAorI2RlZmluZSBIUlRJTV9PVVRQVVRCVVJTVE1PREVFTlRSWV9SRUdVTEFSICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgVGhlIHByb2dyYW1tZWQgSWRsZSBzdGF0ZSBpcyBhcHBsaWVkIGltbWVkaWF0ZWx5IHRvIHRoZSBPdXRwdXQgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUQlVSU1RNT0RFRU5UUllfREVMQVlFRCAgIChIUlRJTV9PVVRSX0RJREwxKSAgICAvKiE8IERlYWR0aW1lIGlzIGluc2VydGVkIG9uIG91dHB1dCBiZWZvcmUgZW50ZXJpbmcgdGhlIGlkbGUgbW9kZSAqLworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIEhSVElNX0NhcHR1cmVfVW5pdF9UcmlnZ2VyIEhSVElNIENhcHR1cmUgVW5pdCBUcmlnZ2VyCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRoZSBldmVudHMgdGhhdCBjYW4gYmUgc2VsZWN0ZWQgdG8gdHJpZ2dlciB0aGUgCisgICogICAgICAgIGNhcHR1cmUgb2YgdGhlIHRpbWluZyB1bml0IGNvdW50ZXIKKyAgKi8KKyNkZWZpbmUgSFJUSU1fQ0FQVFVSRVRSSUdHRVJfTk9ORSAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAvKiE8IENhcHR1cmUgdHJpZ2dlciBpcyBkaXNhYmxlZCAqLyAgICAKKyNkZWZpbmUgSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVVBEQVRFICAgICAgIChIUlRJTV9DUFQxQ1JfVVBEQ1BUKSAgICAvKiE8IFRoZSB1cGRhdGUgZXZlbnQgdHJpZ2dlcnMgdGhlIENhcHR1cmUgKi8gICAgCisjZGVmaW5lIEhSVElNX0NBUFRVUkVUUklHR0VSX0VFVl8xICAgICAgICAoSFJUSU1fQ1BUMUNSX0VYRVYxQ1BUKSAgLyohPCBUaGUgRXh0ZXJuYWwgZXZlbnQgMSB0cmlnZ2VycyB0aGUgQ2FwdHVyZSAqLyAgICAKKyNkZWZpbmUgSFJUSU1fQ0FQVFVSRVRSSUdHRVJfRUVWXzIgICAgICAgIChIUlRJTV9DUFQxQ1JfRVhFVjJDUFQpICAvKiE8IFRoZSBFeHRlcm5hbCBldmVudCAyIHRyaWdnZXJzIHRoZSBDYXB0dXJlICovICAgIAorI2RlZmluZSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9FRVZfMyAgICAgICAgKEhSVElNX0NQVDFDUl9FWEVWM0NQVCkgIC8qITwgVGhlIEV4dGVybmFsIGV2ZW50IDMgdHJpZ2dlcnMgdGhlIENhcHR1cmUgKi8gICAgCisjZGVmaW5lIEhSVElNX0NBUFRVUkVUUklHR0VSX0VFVl80ICAgICAgICAoSFJUSU1fQ1BUMUNSX0VYRVY0Q1BUKSAgLyohPCBUaGUgRXh0ZXJuYWwgZXZlbnQgNCB0cmlnZ2VycyB0aGUgQ2FwdHVyZSAqLyAgICAKKyNkZWZpbmUgSFJUSU1fQ0FQVFVSRVRSSUdHRVJfRUVWXzUgICAgICAgIChIUlRJTV9DUFQxQ1JfRVhFVjVDUFQpICAvKiE8IFRoZSBFeHRlcm5hbCBldmVudCA1IHRyaWdnZXJzIHRoZSBDYXB0dXJlICovICAgIAorI2RlZmluZSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9FRVZfNiAgICAgICAgKEhSVElNX0NQVDFDUl9FWEVWNkNQVCkgIC8qITwgVGhlIEV4dGVybmFsIGV2ZW50IDYgdHJpZ2dlcnMgdGhlIENhcHR1cmUgKi8gICAgCisjZGVmaW5lIEhSVElNX0NBUFRVUkVUUklHR0VSX0VFVl83ICAgICAgICAoSFJUSU1fQ1BUMUNSX0VYRVY3Q1BUKSAgLyohPCBUaGUgRXh0ZXJuYWwgZXZlbnQgNyB0cmlnZ2VycyB0aGUgQ2FwdHVyZSAqLyAgICAKKyNkZWZpbmUgSFJUSU1fQ0FQVFVSRVRSSUdHRVJfRUVWXzggICAgICAgIChIUlRJTV9DUFQxQ1JfRVhFVjhDUFQpICAvKiE8IFRoZSBFeHRlcm5hbCBldmVudCA4IHRyaWdnZXJzIHRoZSBDYXB0dXJlICovICAgIAorI2RlZmluZSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9FRVZfOSAgICAgICAgKEhSVElNX0NQVDFDUl9FWEVWOUNQVCkgIC8qITwgVGhlIEV4dGVybmFsIGV2ZW50IDkgdHJpZ2dlcnMgdGhlIENhcHR1cmUgKi8gICAgCisjZGVmaW5lIEhSVElNX0NBUFRVUkVUUklHR0VSX0VFVl8xMCAgICAgICAoSFJUSU1fQ1BUMUNSX0VYRVYxMENQVCkgLyohPCBUaGUgRXh0ZXJuYWwgZXZlbnQgMTAgdHJpZ2dlcnMgdGhlIENhcHR1cmUgKi8gICAgCisjZGVmaW5lIEhSVElNX0NBUFRVUkVUUklHR0VSX1RBMV9TRVQgICAgICAoSFJUSU1fQ1BUMUNSX1RBMVNFVCkgICAgLyohPCBDYXB0dXJlIGlzIHRyaWdnZXJlZCBieSBUQTEgb3V0cHV0IGluYWN0aXZlIHRvIGFjdGl2ZSB0cmFuc2l0aW9uICovICAgIAorI2RlZmluZSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9UQTFfUkVTRVQgICAgKEhSVElNX0NQVDFDUl9UQTFSU1QpICAgIC8qITwgQ2FwdHVyZSBpcyB0cmlnZ2VyZWQgYnkgVEExIG91dHB1dCBhY3RpdmUgdG8gaW5hY3RpdmUgdHJhbnNpdGlvbiAqLyAgICAKKyNkZWZpbmUgSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVElNRVJBX0NNUDEgIChIUlRJTV9DUFQxQ1JfVElNQUNNUDEpICAvKiE8IFRpbWVyIEEgQ29tcGFyZSAxIHRyaWdnZXJzIENhcHR1cmUgKi8gICAgCisjZGVmaW5lIEhSVElNX0NBUFRVUkVUUklHR0VSX1RJTUVSQV9DTVAyICAoSFJUSU1fQ1BUMUNSX1RJTUFDTVAyKSAgLyohPCBUaW1lciBBIENvbXBhcmUgMiB0cmlnZ2VycyBDYXB0dXJlICovICAgIAorI2RlZmluZSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9UQjFfU0VUICAgICAgKEhSVElNX0NQVDFDUl9UQjFTRVQpICAgIC8qITwgQ2FwdHVyZSBpcyB0cmlnZ2VyZWQgYnkgVEIxIG91dHB1dCBpbmFjdGl2ZSB0byBhY3RpdmUgdHJhbnNpdGlvbiAqLyAgICAKKyNkZWZpbmUgSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVEIxX1JFU0VUICAgIChIUlRJTV9DUFQxQ1JfVEIxUlNUKSAgICAvKiE8IENhcHR1cmUgaXMgdHJpZ2dlcmVkIGJ5IFRCMSBvdXRwdXQgYWN0aXZlIHRvIGluYWN0aXZlIHRyYW5zaXRpb24gKi8gICAgCisjZGVmaW5lIEhSVElNX0NBUFRVUkVUUklHR0VSX1RJTUVSQl9DTVAxICAoSFJUSU1fQ1BUMUNSX1RJTUJDTVAxKSAgLyohPCBUaW1lciBCIENvbXBhcmUgMSB0cmlnZ2VycyBDYXB0dXJlICovICAgIAorI2RlZmluZSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9USU1FUkJfQ01QMiAgKEhSVElNX0NQVDFDUl9USU1CQ01QMikgIC8qITwgVGltZXIgQiBDb21wYXJlIDIgdHJpZ2dlcnMgQ2FwdHVyZSAqLyAgICAKKyNkZWZpbmUgSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVEMxX1NFVCAgICAgIChIUlRJTV9DUFQxQ1JfVEMxU0VUKSAgICAvKiE8IENhcHR1cmUgaXMgdHJpZ2dlcmVkIGJ5IFRDMSBvdXRwdXQgaW5hY3RpdmUgdG8gYWN0aXZlIHRyYW5zaXRpb24gKi8gICAgCisjZGVmaW5lIEhSVElNX0NBUFRVUkVUUklHR0VSX1RDMV9SRVNFVCAgICAoSFJUSU1fQ1BUMUNSX1RDMVJTVCkgICAgLyohPCBDYXB0dXJlIGlzIHRyaWdnZXJlZCBieSBUQzEgb3V0cHV0IGFjdGl2ZSB0byBpbmFjdGl2ZSB0cmFuc2l0aW9uICovICAgIAorI2RlZmluZSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9USU1FUkNfQ01QMSAgKEhSVElNX0NQVDFDUl9USU1DQ01QMSkgIC8qITwgVGltZXIgQyBDb21wYXJlIDEgdHJpZ2dlcnMgQ2FwdHVyZSAqLyAgICAKKyNkZWZpbmUgSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVElNRVJDX0NNUDIgIChIUlRJTV9DUFQxQ1JfVElNQ0NNUDIpICAvKiE8IFRpbWVyIEMgQ29tcGFyZSAyIHRyaWdnZXJzIENhcHR1cmUgKi8gICAgCisjZGVmaW5lIEhSVElNX0NBUFRVUkVUUklHR0VSX1REMV9TRVQgICAgICAoSFJUSU1fQ1BUMUNSX1REMVNFVCkgICAgLyohPCBDYXB0dXJlIGlzIHRyaWdnZXJlZCBieSBURDEgb3V0cHV0IGluYWN0aXZlIHRvIGFjdGl2ZSB0cmFuc2l0aW9uICovICAgIAorI2RlZmluZSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9URDFfUkVTRVQgICAgKEhSVElNX0NQVDFDUl9URDFSU1QpICAgIC8qITwgQ2FwdHVyZSBpcyB0cmlnZ2VyZWQgYnkgVEQxIG91dHB1dCBhY3RpdmUgdG8gaW5hY3RpdmUgdHJhbnNpdGlvbiAqLyAgICAKKyNkZWZpbmUgSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVElNRVJEX0NNUDEgIChIUlRJTV9DUFQxQ1JfVElNRENNUDEpICAvKiE8IFRpbWVyIEQgQ29tcGFyZSAxIHRyaWdnZXJzIENhcHR1cmUgKi8gICAgCisjZGVmaW5lIEhSVElNX0NBUFRVUkVUUklHR0VSX1RJTUVSRF9DTVAyICAoSFJUSU1fQ1BUMUNSX1RJTURDTVAyKSAgLyohPCBUaW1lciBEIENvbXBhcmUgMiB0cmlnZ2VycyBDYXB0dXJlICovICAgIAorI2RlZmluZSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9URTFfU0VUICAgICAgKEhSVElNX0NQVDFDUl9URTFTRVQpICAgIC8qITwgQ2FwdHVyZSBpcyB0cmlnZ2VyZWQgYnkgVEUxIG91dHB1dCBpbmFjdGl2ZSB0byBhY3RpdmUgdHJhbnNpdGlvbiAqLyAgICAKKyNkZWZpbmUgSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVEUxX1JFU0VUICAgIChIUlRJTV9DUFQxQ1JfVEUxUlNUKSAgICAvKiE8IENhcHR1cmUgaXMgdHJpZ2dlcmVkIGJ5IFRFMSBvdXRwdXQgYWN0aXZlIHRvIGluYWN0aXZlIHRyYW5zaXRpb24gKi8gICAgCisjZGVmaW5lIEhSVElNX0NBUFRVUkVUUklHR0VSX1RJTUVSRV9DTVAxICAoSFJUSU1fQ1BUMUNSX1RJTUVDTVAxKSAgLyohPCBUaW1lciBFIENvbXBhcmUgMSB0cmlnZ2VycyBDYXB0dXJlICovICAgIAorI2RlZmluZSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9USU1FUkVfQ01QMiAgKEhSVElNX0NQVDFDUl9USU1FQ01QMikgIC8qITwgVGltZXIgRSBDb21wYXJlIDIgdHJpZ2dlcnMgQ2FwdHVyZSAqLyAgICAgICAgICAgICAKKy8qKgorICAqIEB9CisgICovICAgCisvKioKKyAgKiBAfQorICAqLyAgIAorCisvKiogQGRlZmdyb3VwIEhSVElNX1RpbWVyX0V4dGVybmFsX0V2ZW50X0ZpbHRlciBIUlRJTSBUaW1lciBFeHRlcm5hbCBFdmVudCBGaWx0ZXIKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgdGhlIGV2ZW50IGZpbHRlcmluZyBhcHBsb2VkIHRvIGV4dGVybmFsIGV2ZW50cworICAqICAgICAgICBieSBhIHRpbWVyCisgICovCisjZGVmaW5lIEhSVElNX1RJTUVWRU5URklMVEVSX05PTkUgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgCisjZGVmaW5lIEhSVElNX1RJTUVWRU5URklMVEVSX0JMQU5LSU5HQ01QMSAgICAgKEhSVElNX0VFRlIxX0VFMUZMVFJfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEJsYW5raW5nIGZyb20gY291bnRlciByZXNldC9yb2xsLW92ZXIgdG8gQ29tcGFyZSAxVSAqLworI2RlZmluZSBIUlRJTV9USU1FVkVOVEZJTFRFUl9CTEFOS0lOR0NNUDIgICAgIChIUlRJTV9FRUZSMV9FRTFGTFRSXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCbGFua2luZyBmcm9tIGNvdW50ZXIgcmVzZXQvcm9sbC1vdmVyIHRvIENvbXBhcmUgMlUgKi8KKyNkZWZpbmUgSFJUSU1fVElNRVZFTlRGSUxURVJfQkxBTktJTkdDTVAzICAgICAoSFJUSU1fRUVGUjFfRUUxRkxUUl8xIHwgSFJUSU1fRUVGUjFfRUUxRkxUUl8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQmxhbmtpbmcgZnJvbSBjb3VudGVyIHJlc2V0L3JvbGwtb3ZlciB0byBDb21wYXJlIDNVICovCisjZGVmaW5lIEhSVElNX1RJTUVWRU5URklMVEVSX0JMQU5LSU5HQ01QNCAgICAgKEhSVElNX0VFRlIxX0VFMUZMVFJfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEJsYW5raW5nIGZyb20gY291bnRlciByZXNldC9yb2xsLW92ZXIgdG8gQ29tcGFyZSA0VSAqLworI2RlZmluZSBIUlRJTV9USU1FVkVOVEZJTFRFUl9CTEFOS0lOR0ZMVFIxICAgIChIUlRJTV9FRUZSMV9FRTFGTFRSXzIgfCBIUlRJTV9FRUZSMV9FRTFGTFRSXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCbGFua2luZyBmcm9tIGFub3RoZXIgdGltaW5nIHVuaXQ6IFRJTUZMVFIxIHNvdXJjZSAqLworI2RlZmluZSBIUlRJTV9USU1FVkVOVEZJTFRFUl9CTEFOS0lOR0ZMVFIyICAgIChIUlRJTV9FRUZSMV9FRTFGTFRSXzIgfCBIUlRJTV9FRUZSMV9FRTFGTFRSXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCbGFua2luZyBmcm9tIGFub3RoZXIgdGltaW5nIHVuaXQ6IFRJTUZMVFIyIHNvdXJjZSAqLworI2RlZmluZSBIUlRJTV9USU1FVkVOVEZJTFRFUl9CTEFOS0lOR0ZMVFIzICAgIChIUlRJTV9FRUZSMV9FRTFGTFRSXzIgfCBIUlRJTV9FRUZSMV9FRTFGTFRSXzEgfCBIUlRJTV9FRUZSMV9FRTFGTFRSXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCbGFua2luZyBmcm9tIGFub3RoZXIgdGltaW5nIHVuaXQ6IFRJTUZMVFIzIHNvdXJjZSAqLworI2RlZmluZSBIUlRJTV9USU1FVkVOVEZJTFRFUl9CTEFOS0lOR0ZMVFI0ICAgIChIUlRJTV9FRUZSMV9FRTFGTFRSXzMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCbGFua2luZyBmcm9tIGFub3RoZXIgdGltaW5nIHVuaXQ6IFRJTUZMVFI0IHNvdXJjZSAqLworI2RlZmluZSBIUlRJTV9USU1FVkVOVEZJTFRFUl9CTEFOS0lOR0ZMVFI1ICAgIChIUlRJTV9FRUZSMV9FRTFGTFRSXzMgfCBIUlRJTV9FRUZSMV9FRTFGTFRSXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCbGFua2luZyBmcm9tIGFub3RoZXIgdGltaW5nIHVuaXQ6IFRJTUZMVFI1IHNvdXJjZSAqLworI2RlZmluZSBIUlRJTV9USU1FVkVOVEZJTFRFUl9CTEFOS0lOR0ZMVFI2ICAgIChIUlRJTV9FRUZSMV9FRTFGTFRSXzMgfCBIUlRJTV9FRUZSMV9FRTFGTFRSXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCbGFua2luZyBmcm9tIGFub3RoZXIgdGltaW5nIHVuaXQ6IFRJTUZMVFI2IHNvdXJjZSAqLworI2RlZmluZSBIUlRJTV9USU1FVkVOVEZJTFRFUl9CTEFOS0lOR0ZMVFI3ICAgIChIUlRJTV9FRUZSMV9FRTFGTFRSXzMgfCBIUlRJTV9FRUZSMV9FRTFGTFRSXzEgfCBIUlRJTV9FRUZSMV9FRTFGTFRSXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCbGFua2luZyBmcm9tIGFub3RoZXIgdGltaW5nIHVuaXQ6IFRJTUZMVFI3IHNvdXJjZSAqLworI2RlZmluZSBIUlRJTV9USU1FVkVOVEZJTFRFUl9CTEFOS0lOR0ZMVFI4ICAgIChIUlRJTV9FRUZSMV9FRTFGTFRSXzMgfCBIUlRJTV9FRUZSMV9FRTFGTFRSXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCbGFua2luZyBmcm9tIGFub3RoZXIgdGltaW5nIHVuaXQ6IFRJTUZMVFI4IHNvdXJjZSAqLworI2RlZmluZSBIUlRJTV9USU1FVkVOVEZJTFRFUl9XSU5ET1dJTkdDTVAyICAgIChIUlRJTV9FRUZSMV9FRTFGTFRSXzMgfCBIUlRJTV9FRUZSMV9FRTFGTFRSXzIgfCBIUlRJTV9FRUZSMV9FRTFGTFRSXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBXaW5kb3dpbmcgZnJvbSBjb3VudGVyIHJlc2V0L3JvbGwtb3ZlciB0byBDb21wYXJlIDJVICovCisjZGVmaW5lIEhSVElNX1RJTUVWRU5URklMVEVSX1dJTkRPV0lOR0NNUDMgICAgKEhSVElNX0VFRlIxX0VFMUZMVFJfMyB8IEhSVElNX0VFRlIxX0VFMUZMVFJfMiB8IEhSVElNX0VFRlIxX0VFMUZMVFJfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFdpbmRvd2luZyBmcm9tIGNvdW50ZXIgcmVzZXQvcm9sbC1vdmVyIHRvIENvbXBhcmUgM1UgKi8KKyNkZWZpbmUgSFJUSU1fVElNRVZFTlRGSUxURVJfV0lORE9XSU5HVElNICAgICAoSFJUSU1fRUVGUjFfRUUxRkxUUl8zIHwgSFJUSU1fRUVGUjFfRUUxRkxUUl8yIHwgSFJUSU1fRUVGUjFfRUUxRkxUUl8xIHwgSFJUSU1fRUVGUjFfRUUxRkxUUl8zIHwgSFJUSU1fRUVGUjFfRUUxRkxUUl8yIHwgSFJUSU1fRUVGUjFfRUUxRkxUUl8wKSAgLyohPCBXaW5kb3dpbmcgZnJvbSBhbm90aGVyIHRpbWluZyB1bml0OiBUSU1XSU4gc291cmNlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX1RpbWVyX0V4dGVybmFsX0V2ZW50X0xhdGNoIEhSVElNIFRpbWVyIEV4dGVybmFsIEV2ZW50IExhdGNoCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHdoZXRoZXIgb3Igbm90IHRoZSBleHRlcm5hbCBldmVudCBpcworICAqICAgICAgICBtZW1vcml6ZWQgKGxhdGNoZWQpIGFuZCBnZW5lcmF0ZWQgYXMgc29vbiBhcyB0aGUgYmxhbmtpbmcgcGVyaW9kCisgICogICAgICAgIGlzIGNvbXBsZXRlZCBvciB0aGUgd2luZG93IGVuZHMKKyAgKi8KKyNkZWZpbmUgSFJUSU1fVElNRVZFTlRMQVRDSF9ESVNBQkxFRCAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAvKiE8IEV2ZW50IGlzIGlnbm9yZWQgaWYgaXQgaGFwcGVucyBkdXJpbmcgYSBibGFuaywgb3IgcGFzc2VkIHRocm91Z2ggZHVyaW5nIGEgd2luZG93ICovCisjZGVmaW5lIEhSVElNX1RJTUVWRU5UTEFUQ0hfRU5BQkxFRCAgICAgSFJUSU1fRUVGUjFfRUUxTFRDSCAgICAgLyohPCBFdmVudCBpcyBsYXRjaGVkIGFuZCBkZWxheWVkIHRpbGwgdGhlIGVuZCBvZiB0aGUgYmxhbmtpbmcgb3Igd2luZG93aW5nIHBlcmlvZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9EZWFkdGltZV9QcmVzY2FsZXJfUmF0aW8gSFJUSU0gRGVhZHRpbWUgUHJlc2NhbGVyIFJhdGlvCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIGRpdmlzaW9uIHJhdGlvIGJldHdlZW4gdGhlIHRpbWVyIGNsb2NrIGZyZXF1ZW5jeSAKKyAgKiAgICAgICAgKGZIUlRJTSkgYW5kIHRoZSBkZWFkdGltZSBnZW5lcmF0b3IgY2xvY2sgKGZEVEcpCisgICovIAorI2RlZmluZSBIUlRJTV9USU1ERUFEVElNRV9QUkVTQ0FMRVJSQVRJT19NVUw4ICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZEVEcgPSBmSFJUSU0gKiA4VSAqLworI2RlZmluZSBIUlRJTV9USU1ERUFEVElNRV9QUkVTQ0FMRVJSQVRJT19NVUw0ICAgIChIUlRJTV9EVFJfRFRQUlNDXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZEVEcgPSBmSFJUSU0gKiA0VSAqLworI2RlZmluZSBIUlRJTV9USU1ERUFEVElNRV9QUkVTQ0FMRVJSQVRJT19NVUwyICAgIChIUlRJTV9EVFJfRFRQUlNDXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZEVEcgPSBmSFJUSU0gKiAyVSAqLworI2RlZmluZSBIUlRJTV9USU1ERUFEVElNRV9QUkVTQ0FMRVJSQVRJT19ESVYxICAgIChIUlRJTV9EVFJfRFRQUlNDXzEgfCBIUlRJTV9EVFJfRFRQUlNDXzApICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZEVEcgPSBmSFJUSU0gKi8KKyNkZWZpbmUgSFJUSU1fVElNREVBRFRJTUVfUFJFU0NBTEVSUkFUSU9fRElWMiAgICAoSFJUSU1fRFRSX0RUUFJTQ18yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmRFRHID0gZkhSVElNIC8gMlUgKi8KKyNkZWZpbmUgSFJUSU1fVElNREVBRFRJTUVfUFJFU0NBTEVSUkFUSU9fRElWNCAgICAoSFJUSU1fRFRSX0RUUFJTQ18yIHwgSFJUSU1fRFRSX0RUUFJTQ18wKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmRFRHID0gZkhSVElNIC8gNFUgKi8KKyNkZWZpbmUgSFJUSU1fVElNREVBRFRJTUVfUFJFU0NBTEVSUkFUSU9fRElWOCAgICAoSFJUSU1fRFRSX0RUUFJTQ18yIHwgSFJUSU1fRFRSX0RUUFJTQ18xKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmRFRHID0gZkhSVElNIC8gOFUgKi8KKyNkZWZpbmUgSFJUSU1fVElNREVBRFRJTUVfUFJFU0NBTEVSUkFUSU9fRElWMTYgICAoSFJUSU1fRFRSX0RUUFJTQ18yIHwgSFJUSU1fRFRSX0RUUFJTQ18xIHwgSFJUSU1fRFRSX0RUUFJTQ18wKSAgLyohPCBmRFRHID0gZkhSVElNIC8gMTZVICovCisvKioKKyAgKiBAfQorICAqLworICAgICAgICAgICAgICAgICAgCisvKiogQGRlZmdyb3VwIEhSVElNX0RlYWR0aW1lX1Jpc2luZ19TaWduIEhSVElNIERlYWR0aW1lIFJpc2luZyBTaWduCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHdoZXRoZXIgdGhlIGRlYWR0aW1lIGlzIHBvc2l0aXZlIG9yIG5lZ2F0aXZlCisgICogICAgICAgIChvdmVybGFwcGluZyBzaWduYWwpIG9uIHJpc2luZyBlZGdlCisgICovIAorI2RlZmluZSBIUlRJTV9USU1ERUFEVElNRV9SSVNJTkdTSUdOX1BPU0lUSVZFICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgIC8qITwgUG9zaXRpdmUgZGVhZHRpbWUgb24gcmlzaW5nIGVkZ2UgKi8KKyNkZWZpbmUgSFJUSU1fVElNREVBRFRJTUVfUklTSU5HU0lHTl9ORUdBVElWRSAgICAoSFJUSU1fRFRSX1NEVFIpICAgICAgICAvKiE8IE5lZ2F0aXZlIGRlYWR0aW1lIG9uIHJpc2luZyBlZGdlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0RlYWR0aW1lX1Jpc2luZ19Mb2NrIEhSVElNIERlYWR0aW1lIFJpc2luZyBMb2NrCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHdoZXRoZXIgb3Igbm90IHRoZSBkZWFkdGltZSAocmlzaW5nIHNpZ24gYW5kCisgICogICAgICAgIHZhbHVlKSBpcyB3cml0ZSBwcm90ZWN0ZWQKKyAgKi8gCisjZGVmaW5lIEhSVElNX1RJTURFQURUSU1FX1JJU0lOR0xPQ0tfV1JJVEUgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgLyohPCBEZWFkdGltZSByaXNpbmcgdmFsdWUgYW5kIHNpZ24gaXMgd3JpdGVhYmxlICovCisjZGVmaW5lIEhSVElNX1RJTURFQURUSU1FX1JJU0lOR0xPQ0tfUkVBRE9OTFkgKEhSVElNX0RUUl9EVFJMSykgICAgICAgLyohPCBEZWFkdGltZSByaXNpbmcgdmFsdWUgYW5kIHNpZ24gaXMgcmVhZC1vbmx5ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0RlYWR0aW1lX1Jpc2luZ19TaWduX0xvY2sgSFJUSU0gRGVhZHRpbWUgUmlzaW5nIFNpZ24gTG9jaworICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB3aGV0aGVyIG9yIG5vdCB0aGUgZGVhZHRpbWUgcmlzaW5nIHNpZ24gaXMgd3JpdGUKKyAgKiAgICAgICAgcHJvdGVjdGVkCisgICovIAorI2RlZmluZSBIUlRJTV9USU1ERUFEVElNRV9SSVNJTkdTSUdOTE9DS19XUklURSAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAvKiE8IERlYWR0aW1lIHJpc2luZyBzaWduIGlzIHdyaXRlYWJsZSAqLworI2RlZmluZSBIUlRJTV9USU1ERUFEVElNRV9SSVNJTkdTSUdOTE9DS19SRUFET05MWSAoSFJUSU1fRFRSX0RUUlNMSykgICAgICAvKiE8IERlYWR0aW1lIHJpc2luZyBzaWduIGlzIHJlYWQtb25seSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9EZWFkdGltZV9GYWxsaW5nX1NpZ24gSFJUSU0gRGVhZHRpbWUgRmFsbGluZyBTaWduCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHdoZXRoZXIgdGhlIGRlYWR0aW1lIGlzIHBvc2l0aXZlIG9yIG5lZ2F0aXZlCisgICogICAgICAgIChvdmVybGFwcGluZyBzaWduYWwpIG9uIGZhbGxpbmcgZWRnZQorICAqLyAKKyNkZWZpbmUgSFJUSU1fVElNREVBRFRJTUVfRkFMTElOR1NJR05fUE9TSVRJVkUgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgLyohPCBQb3NpdGl2ZSBkZWFkdGltZSBvbiBmYWxsaW5nIGVkZ2UgKi8KKyNkZWZpbmUgSFJUSU1fVElNREVBRFRJTUVfRkFMTElOR1NJR05fTkVHQVRJVkUgICAgKEhSVElNX0RUUl9TRFRGKSAgICAgICAgLyohPCBOZWdhdGl2ZSBkZWFkdGltZSBvbiBmYWxsaW5nIGVkZ2UgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRGVhZHRpbWVfRmFsbGluZ19Mb2NrIEhSVElNIERlYWR0aW1lIEZhbGxpbmcgTG9jaworICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB3aGV0aGVyIG9yIG5vdCB0aGUgZGVhZHRpbWUgKGZhbGxpbmcgc2lnbiBhbmQKKyAgKiAgICAgICAgdmFsdWUpIGlzIHdyaXRlIHByb3RlY3RlZAorICAqLyAKKyNkZWZpbmUgSFJUSU1fVElNREVBRFRJTUVfRkFMTElOR0xPQ0tfV1JJVEUgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgLyohPCBEZWFkdGltZSBmYWxsaW5nIHZhbHVlIGFuZCBzaWduIGlzIHdyaXRlYWJsZSAqLworI2RlZmluZSBIUlRJTV9USU1ERUFEVElNRV9GQUxMSU5HTE9DS19SRUFET05MWSAoSFJUSU1fRFRSX0RURkxLKSAgICAgICAvKiE8IERlYWR0aW1lIGZhbGxpbmcgdmFsdWUgYW5kIHNpZ24gaXMgcmVhZC1vbmx5ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0RlYWR0aW1lX0ZhbGxpbmdfU2lnbl9Mb2NrIEhSVElNIERlYWR0aW1lIEZhbGxpbmcgU2lnbiBMb2NrCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHdoZXRoZXIgb3Igbm90IHRoZSBkZWFkdGltZSBmYWxsaW5nIHNpZ24gaXMgd3JpdGUKKyAgKiAgICAgICAgcHJvdGVjdGVkCisgICovIAorI2RlZmluZSBIUlRJTV9USU1ERUFEVElNRV9GQUxMSU5HU0lHTkxPQ0tfV1JJVEUgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgLyohPCBEZWFkdGltZSBmYWxsaW5nIHNpZ24gaXMgd3JpdGVhYmxlICovCisjZGVmaW5lIEhSVElNX1RJTURFQURUSU1FX0ZBTExJTkdTSUdOTE9DS19SRUFET05MWSAoSFJUSU1fRFRSX0RURlNMSykgICAgICAvKiE8IERlYWR0aW1lIGZhbGxpbmcgc2lnbiBpcyByZWFkLW9ubHkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fQ2hvcHBlcl9GcmVxdWVuY3kgSFJUSU0gQ2hvcHBlciBGcmVxdWVuY3kKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgZ2VuZXJhdGVkIGhpZ2ggZnJlcXVlbmN5IGNhcnJpZXIKKyAgKi8KKyNkZWZpbmUgSFJUSU1fQ0hPUFBFUl9QUkVTQ0FMRVJSQVRJT19ESVYxNiAgKDB4MDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZDSFBGUlEgPSBmSFJUSU0gLyAxNiAgKi8KKyNkZWZpbmUgSFJUSU1fQ0hPUFBFUl9QUkVTQ0FMRVJSQVRJT19ESVYzMiAgKEhSVElNX0NIUFJfQ0FSRlJRXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZDSFBGUlEgPSBmSFJUSU0gLyAzMiAgKi8KKyNkZWZpbmUgSFJUSU1fQ0hPUFBFUl9QUkVTQ0FMRVJSQVRJT19ESVY0OCAgKEhSVElNX0NIUFJfQ0FSRlJRXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZDSFBGUlEgPSBmSFJUSU0gLyA0OCAgKi8KKyNkZWZpbmUgSFJUSU1fQ0hPUFBFUl9QUkVTQ0FMRVJSQVRJT19ESVY2NCAgKEhSVElNX0NIUFJfQ0FSRlJRXzEgfCBIUlRJTV9DSFBSX0NBUkZSUV8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZDSFBGUlEgPSBmSFJUSU0gLyA2NCAgKi8KKyNkZWZpbmUgSFJUSU1fQ0hPUFBFUl9QUkVTQ0FMRVJSQVRJT19ESVY4MCAgKEhSVElNX0NIUFJfQ0FSRlJRXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZDSFBGUlEgPSBmSFJUSU0gLyA4MCAgKi8KKyNkZWZpbmUgSFJUSU1fQ0hPUFBFUl9QUkVTQ0FMRVJSQVRJT19ESVY5NiAgKEhSVElNX0NIUFJfQ0FSRlJRXzIgfCBIUlRJTV9DSFBSX0NBUkZSUV8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZDSFBGUlEgPSBmSFJUSU0gLyA5NiAgKi8KKyNkZWZpbmUgSFJUSU1fQ0hPUFBFUl9QUkVTQ0FMRVJSQVRJT19ESVYxMTIgKEhSVElNX0NIUFJfQ0FSRlJRXzIgfCBIUlRJTV9DSFBSX0NBUkZSUV8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZDSFBGUlEgPSBmSFJUSU0gLyAxMTIgICovCisjZGVmaW5lIEhSVElNX0NIT1BQRVJfUFJFU0NBTEVSUkFUSU9fRElWMTI4IChIUlRJTV9DSFBSX0NBUkZSUV8yIHwgSFJUSU1fQ0hQUl9DQVJGUlFfMSB8IEhSVElNX0NIUFJfQ0FSRlJRXzApICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmQ0hQRlJRID0gZkhSVElNIC8gMTI4ICAqLworI2RlZmluZSBIUlRJTV9DSE9QUEVSX1BSRVNDQUxFUlJBVElPX0RJVjE0NCAoSFJUSU1fQ0hQUl9DQVJGUlFfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZkNIUEZSUSA9IGZIUlRJTSAvIDE0NCAgKi8KKyNkZWZpbmUgSFJUSU1fQ0hPUFBFUl9QUkVTQ0FMRVJSQVRJT19ESVYxNjAgKEhSVElNX0NIUFJfQ0FSRlJRXzMgfCBIUlRJTV9DSFBSX0NBUkZSUV8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZDSFBGUlEgPSBmSFJUSU0gLyAxNjAgICovCisjZGVmaW5lIEhSVElNX0NIT1BQRVJfUFJFU0NBTEVSUkFUSU9fRElWMTc2IChIUlRJTV9DSFBSX0NBUkZSUV8zIHwgSFJUSU1fQ0hQUl9DQVJGUlFfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmQ0hQRlJRID0gZkhSVElNIC8gMTc2ICAqLworI2RlZmluZSBIUlRJTV9DSE9QUEVSX1BSRVNDQUxFUlJBVElPX0RJVjE5MiAoSFJUSU1fQ0hQUl9DQVJGUlFfMyB8IEhSVElNX0NIUFJfQ0FSRlJRXzEgfCBIUlRJTV9DSFBSX0NBUkZSUV8wKSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZkNIUEZSUSA9IGZIUlRJTSAvIDE5MiAgKi8KKyNkZWZpbmUgSFJUSU1fQ0hPUFBFUl9QUkVTQ0FMRVJSQVRJT19ESVYyMDggKEhSVElNX0NIUFJfQ0FSRlJRXzMgfCBIUlRJTV9DSFBSX0NBUkZSUV8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZDSFBGUlEgPSBmSFJUSU0gLyAyMDggICovCisjZGVmaW5lIEhSVElNX0NIT1BQRVJfUFJFU0NBTEVSUkFUSU9fRElWMjI0IChIUlRJTV9DSFBSX0NBUkZSUV8zIHwgSFJUSU1fQ0hQUl9DQVJGUlFfMiB8IEhSVElNX0NIUFJfQ0FSRlJRXzApICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmQ0hQRlJRID0gZkhSVElNIC8gMjI0ICAqLworI2RlZmluZSBIUlRJTV9DSE9QUEVSX1BSRVNDQUxFUlJBVElPX0RJVjI0MCAoSFJUSU1fQ0hQUl9DQVJGUlFfMyB8IEhSVElNX0NIUFJfQ0FSRlJRXzIgfCBIUlRJTV9DSFBSX0NBUkZSUV8xKSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZkNIUEZSUSA9IGZIUlRJTSAvIDI0MCAgKi8KKyNkZWZpbmUgSFJUSU1fQ0hPUFBFUl9QUkVTQ0FMRVJSQVRJT19ESVYyNTYgKEhSVElNX0NIUFJfQ0FSRlJRXzMgfCBIUlRJTV9DSFBSX0NBUkZSUV8yIHwgSFJUSU1fQ0hQUl9DQVJGUlFfMSB8IEhSVElNX0NIUFJfQ0FSRlJRXzApICAvKiE8IGZDSFBGUlEgPSBmSFJUSU0gLyAyNTYgICovCisgLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIEhSVElNX0Nob3BwZXJfRHV0eV9DeWNsZSBIUlRJTSBDaG9wcGVyIER1dHkgQ3ljbGUKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgdGhlIGR1dHkgY3ljbGUgb2YgdGhlIGdlbmVyYXRlZCBoaWdoIGZyZXF1ZW5jeSBjYXJyaWVyCisgICogICAgICAgIER1dHkgY3ljbGUgY2FuIGJlIGFkanVzdGVkIGJ5IDEvOCBzdGVwIChmcm9tIDAvOCB1cCB0byA3LzgpCisgICovIAorI2RlZmluZSBIUlRJTV9DSE9QUEVSX0RVVFlDWUNMRV8wICAgICgweDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT25seSAxc3QgcHVsc2UgaXMgcHJlc2VudCAqLworI2RlZmluZSBIUlRJTV9DSE9QUEVSX0RVVFlDWUNMRV8xMjUgIChIUlRJTV9DSFBSX0NBUkRUWV8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRHV0eSBjeWNsZSBvZiB0aGUgY2FycmllciBzaWduYWwgaXMgMTIuNVUgJSAqLworI2RlZmluZSBIUlRJTV9DSE9QUEVSX0RVVFlDWUNMRV8yNTAgIChIUlRJTV9DSFBSX0NBUkRUWV8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRHV0eSBjeWNsZSBvZiB0aGUgY2FycmllciBzaWduYWwgaXMgMjVVICUgKi8KKyNkZWZpbmUgSFJUSU1fQ0hPUFBFUl9EVVRZQ1lDTEVfMzc1ICAoSFJUSU1fQ0hQUl9DQVJEVFlfMSB8IEhSVElNX0NIUFJfQ0FSRFRZXzApICAgICAgICAgICAgICAgICAgICAgICAvKiE8IER1dHkgY3ljbGUgb2YgdGhlIGNhcnJpZXIgc2lnbmFsIGlzIDM3LjVVICUgKi8KKyNkZWZpbmUgSFJUSU1fQ0hPUFBFUl9EVVRZQ1lDTEVfNTAwICAoSFJUSU1fQ0hQUl9DQVJEVFlfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IER1dHkgY3ljbGUgb2YgdGhlIGNhcnJpZXIgc2lnbmFsIGlzIDUwVSAlICovCisjZGVmaW5lIEhSVElNX0NIT1BQRVJfRFVUWUNZQ0xFXzYyNSAgKEhSVElNX0NIUFJfQ0FSRFRZXzIgfCBIUlRJTV9DSFBSX0NBUkRUWV8wKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEdXR5IGN5Y2xlIG9mIHRoZSBjYXJyaWVyIHNpZ25hbCBpcyA2Mi41VSAlICovCisjZGVmaW5lIEhSVElNX0NIT1BQRVJfRFVUWUNZQ0xFXzc1MCAgKEhSVElNX0NIUFJfQ0FSRFRZXzIgfCBIUlRJTV9DSFBSX0NBUkRUWV8xKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEdXR5IGN5Y2xlIG9mIHRoZSBjYXJyaWVyIHNpZ25hbCBpcyA3NVUgJSAqLworI2RlZmluZSBIUlRJTV9DSE9QUEVSX0RVVFlDWUNMRV84NzUgIChIUlRJTV9DSFBSX0NBUkRUWV8yIHwgSFJUSU1fQ0hQUl9DQVJEVFlfMSB8IEhSVElNX0NIUFJfQ0FSRFRZXzApIC8qITwgRHV0eSBjeWNsZSBvZiB0aGUgY2FycmllciBzaWduYWwgaXMgODcuNVUgJSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9DaG9wcGVyX1N0YXJ0X1B1bHNlX1dpZHRoIEhSVElNIENob3BwZXIgU3RhcnQgUHVsc2UgV2lkdGgKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgdGhlIHB1bHNlIHdpZHRoIG9mIHRoZSBmaXJzdCBwdWxzZSBvZiB0aGUgZ2VuZXJhdGVkCisgICogICAgICAgIGhpZ2ggZnJlcXVlbmN5IGNhcnJpZXIKKyAgKi8gCisjZGVmaW5lIEhSVElNX0NIT1BQRVJfUFVMU0VXSURUSF8xNiAgICgweDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHRTVFBXID0gdEhSVElNIHggMTYgICovCisjZGVmaW5lIEhSVElNX0NIT1BQRVJfUFVMU0VXSURUSF8zMiAgIChIUlRJTV9DSFBSX1NUUlBXXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHRTVFBXID0gdEhSVElNIHggMzIgICovCisjZGVmaW5lIEhSVElNX0NIT1BQRVJfUFVMU0VXSURUSF80OCAgIChIUlRJTV9DSFBSX1NUUlBXXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHRTVFBXID0gdEhSVElNIHggNDggICovCisjZGVmaW5lIEhSVElNX0NIT1BQRVJfUFVMU0VXSURUSF82NCAgIChIUlRJTV9DSFBSX1NUUlBXXzEgfCBIUlRJTV9DSFBSX1NUUlBXXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHRTVFBXID0gdEhSVElNIHggNjQgICovCisjZGVmaW5lIEhSVElNX0NIT1BQRVJfUFVMU0VXSURUSF84MCAgIChIUlRJTV9DSFBSX1NUUlBXXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHRTVFBXID0gdEhSVElNIHggODAgICovCisjZGVmaW5lIEhSVElNX0NIT1BQRVJfUFVMU0VXSURUSF85NiAgIChIUlRJTV9DSFBSX1NUUlBXXzIgfCBIUlRJTV9DSFBSX1NUUlBXXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHRTVFBXID0gdEhSVElNIHggOTYgICovCisjZGVmaW5lIEhSVElNX0NIT1BQRVJfUFVMU0VXSURUSF8xMTIgIChIUlRJTV9DSFBSX1NUUlBXXzIgfCBIUlRJTV9DSFBSX1NUUlBXXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHRTVFBXID0gdEhSVElNIHggMTEyICAqLworI2RlZmluZSBIUlRJTV9DSE9QUEVSX1BVTFNFV0lEVEhfMTI4ICAoSFJUSU1fQ0hQUl9TVFJQV18yIHwgSFJUSU1fQ0hQUl9TVFJQV18xIHwgSFJUSU1fQ0hQUl9TVFJQV18wKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCB0U1RQVyA9IHRIUlRJTSB4IDEyOCAgKi8KKyNkZWZpbmUgSFJUSU1fQ0hPUFBFUl9QVUxTRVdJRFRIXzE0NCAgKEhSVElNX0NIUFJfU1RSUFdfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgdFNUUFcgPSB0SFJUSU0geCAxNDQgICovCisjZGVmaW5lIEhSVElNX0NIT1BQRVJfUFVMU0VXSURUSF8xNjAgIChIUlRJTV9DSFBSX1NUUlBXXzMgfCBIUlRJTV9DSFBSX1NUUlBXXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHRTVFBXID0gdEhSVElNIHggMTYwICAqLworI2RlZmluZSBIUlRJTV9DSE9QUEVSX1BVTFNFV0lEVEhfMTc2ICAoSFJUSU1fQ0hQUl9TVFJQV18zIHwgSFJUSU1fQ0hQUl9TVFJQV18xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCB0U1RQVyA9IHRIUlRJTSB4IDE3NiAgKi8KKyNkZWZpbmUgSFJUSU1fQ0hPUFBFUl9QVUxTRVdJRFRIXzE5MiAgKEhSVElNX0NIUFJfU1RSUFdfMyB8IEhSVElNX0NIUFJfU1RSUFdfMSB8IEhSVElNX0NIUFJfU1RSUFdfMCkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgdFNUUFcgPSB0SFJUSU0geCAxOTIgICovCisjZGVmaW5lIEhSVElNX0NIT1BQRVJfUFVMU0VXSURUSF8yMDggIChIUlRJTV9DSFBSX1NUUlBXXzMgfCBIUlRJTV9DSFBSX1NUUlBXXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHRTVFBXID0gdEhSVElNIHggMjA4ICAqLworI2RlZmluZSBIUlRJTV9DSE9QUEVSX1BVTFNFV0lEVEhfMjI0ICAoSFJUSU1fQ0hQUl9TVFJQV18zIHwgSFJUSU1fQ0hQUl9TVFJQV18yIHwgSFJUSU1fQ0hQUl9TVFJQV18wKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCB0U1RQVyA9IHRIUlRJTSB4IDIyNCAgKi8KKyNkZWZpbmUgSFJUSU1fQ0hPUFBFUl9QVUxTRVdJRFRIXzI0MCAgKEhSVElNX0NIUFJfU1RSUFdfMyB8IEhSVElNX0NIUFJfU1RSUFdfMiB8IEhSVElNX0NIUFJfU1RSUFdfMSkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgdFNUUFcgPSB0SFJUSU0geCAyNDAgICovCisjZGVmaW5lIEhSVElNX0NIT1BQRVJfUFVMU0VXSURUSF8yNTYgIChIUlRJTV9DSFBSX1NUUlBXXzMgfCBIUlRJTV9DSFBSX1NUUlBXXzIgfCBIUlRJTV9DSFBSX1NUUlBXXzEgfCBIUlRJTV9DSFBSX1NUUlBXXzApICAvKiE8IHRTVFBXID0gdEhSVElNIHggMjU2ICAqLworLyoqCisgICogQH0KKyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisvKiogQGRlZmdyb3VwIEhSVElNX1N5bmNocm9uaXphdGlvbl9PcHRpb25zIEhSVElNIFN5bmNocm9uaXphdGlvbiBPcHRpb25zCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRoZSBvcHRpb25zIGZvciBzeW5jaHJvbml6aW5nIG11bHRpcGxlIEhSVElNIAorICAqICAgICAgICBpbnN0YW5jZXMsIGFzIGEgbWFzdGVyIHVuaXQgKGdlbmVyYXRpbmcgYSBzeW5jaHJvbml6YXRpb24gc2lnbmFsKSAKKyAgKiAgICAgICAgb3IgYXMgYSBzbGF2ZSAod2FpdGluZyBmb3IgYSB0cmlnZ2VyIHRvIGJlIHN5bmNocm9uaXplZCkKKyAgKi8gCisjZGVmaW5lIEhSVElNX1NZTkNPUFRJT05fTk9ORSAgIDB4MDAwMDAwMDBVICAgLyohPCBIUlRJTSBpbnN0YW5jZSBkb2Vzbid0IGhhbmRsZSBleHRlcm5hbCBzeW5jaHJvbml6YXRpb24gc2lnbmFscyAoU1lOQ0lOLCBTWU5DT1VUKSAqLworI2RlZmluZSBIUlRJTV9TWU5DT1BUSU9OX01BU1RFUiAweDAwMDAwMDAxVSAgIC8qITwgSFJUSU0gaW5zdGFuY2UgYWN0cyBhcyBhIE1BU1RFUiwgaS5lLiBnZW5lcmF0ZXMgZXh0ZXJuYWwgc3luY2hyb25pemF0aW9uIG91dHB1dCAoU1lOQ09VVCkqLworI2RlZmluZSBIUlRJTV9TWU5DT1BUSU9OX1NMQVZFICAweDAwMDAwMDAyVSAgIC8qITwgSFJUSU0gaW5zdGFuY2UgYWN0cyBhcyBhIFNMQVZFLCBpLmUuIGl0IGlzIHN5bmNocm9uaXplZCBieSBleHRlcm5hbCBzb3VyY2VzIChTWU5DSU4pICovCisvKioKKyAgKiBAfQorICAqLworICAgICAgICAgICAgICAgICAgICAKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fU3luY2hyb25pemF0aW9uX0lucHV0X1NvdXJjZSBIUlRJTSBTeW5jaHJvbml6YXRpb24gSW5wdXQgU291cmNlCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIGRlZmluaW5nIHRoZSBzeW5jaHJvbml6YXRpb24gaW5wdXQgc291cmNlCisgICovIAorI2RlZmluZSBIUlRJTV9TWU5DSU5QVVRTT1VSQ0VfTk9ORSAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBkaXNhYmxlZC4gSFJUSU0gaXMgbm90IHN5bmNocm9uaXplZCBhbmQgcnVucyBpbiBzdGFuZGFsb25lIG1vZGUgKi8KKyNkZWZpbmUgSFJUSU1fU1lOQ0lOUFVUU09VUkNFX0lOVEVSTkFMRVZFTlQgIEhSVElNX01DUl9TWU5DX0lOXzEgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIEhSVElNIGlzIHN5bmNocm9uaXplZCB3aXRoIHRoZSBvbi1jaGlwIHRpbWVyICovCisjZGVmaW5lIEhSVElNX1NZTkNJTlBVVFNPVVJDRV9FWFRFUk5BTEVWRU5UICAoSFJUSU1fTUNSX1NZTkNfSU5fMSB8IEhSVElNX01DUl9TWU5DX0lOXzApICAvKiE8IEEgcG9zaXRpdmUgcHVsc2Ugb24gU1lOQ0lOIGlucHV0IHRyaWdnZXJzIHRoZSBIUlRJTSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9TeW5jaHJvbml6YXRpb25fT3V0cHV0X1NvdXJjZSBIUlRJTSBTeW5jaHJvbml6YXRpb24gT3V0cHV0IFNvdXJjZQorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB0aGUgc291cmNlIGFuZCBldmVudCB0byBiZSBzZW50IG9uIHRoZSAKKyAgKiAgICAgICAgc3luY2hyb25pemF0aW9uIG91dHB1dHMKKyAgKi8KKyNkZWZpbmUgSFJUSU1fU1lOQ09VVFBVVFNPVVJDRV9NQVNURVJfU1RBUlQgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEEgcHVsc2UgaXMgc2VudCBvbiB0aGUgU1lOQ09VVCBvdXRwdXQgdXBvbiBtYXN0ZXIgdGltZXIgc3RhcnQgZXZlbnQgKi8KKyNkZWZpbmUgSFJUSU1fU1lOQ09VVFBVVFNPVVJDRV9NQVNURVJfQ01QMSAgKEhSVElNX01DUl9TWU5DX1NSQ18wKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEEgcHVsc2UgaXMgc2VudCBvbiB0aGUgU1lOQ09VVCBvdXRwdXQgdXBvbiBtYXN0ZXIgdGltZXIgY29tcGFyZSAxIGV2ZW50Ki8KKyNkZWZpbmUgSFJUSU1fU1lOQ09VVFBVVFNPVVJDRV9USU1BX1NUQVJUICAgKEhSVElNX01DUl9TWU5DX1NSQ18xKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEEgcHVsc2UgaXMgc2VudCBvbiB0aGUgU1lOQ09VVCBvdXRwdXQgdXBvbiB0aW1lciBBIHN0YXJ0IG9yIHJlc2V0IGV2ZW50cyAqLworI2RlZmluZSBIUlRJTV9TWU5DT1VUUFVUU09VUkNFX1RJTUFfQ01QMSAgICAoSFJUSU1fTUNSX1NZTkNfU1JDXzEgfCBIUlRJTV9NQ1JfU1lOQ19TUkNfMCkgIC8qITwgQSBwdWxzZSBpcyBzZW50IG9uIHRoZSBTWU5DT1VUIG91dHB1dCB1cG9uIHRpbWVyIEEgY29tcGFyZSAxIGV2ZW50ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX1N5bmNocm9uaXphdGlvbl9PdXRwdXRfUG9sYXJpdHkgSFJUSU0gU3luY2hyb25pemF0aW9uIE91dHB1dCBQb2xhcml0eQorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB0aGUgcm91dGluZyBhbmQgY29uZGl0aW9uaW5nIG9mIHRoZSBzeW5jaHJvbml6YXRpb24gb3V0cHV0IGV2ZW50CisgICovIAorI2RlZmluZSBIUlRJTV9TWU5DT1VUUFVUUE9MQVJJVFlfTk9ORSAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBvdXRwdXQgZXZlbnQgaXMgZGlzYWJsZWQgKi8KKyNkZWZpbmUgSFJUSU1fU1lOQ09VVFBVVFBPTEFSSVRZX1BPU0lUSVZFICAoSFJUSU1fTUNSX1NZTkNfT1VUXzEpICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTQ09VVCBwaW4gaGFzIGEgbG93IGlkbGUgbGV2ZWwgYW5kIGlzc3VlcyBhIHBvc2l0aXZlIHB1bHNlIG9mIDE2IGZIUlRJTSBjbG9jayBjeWNsZXMgbGVuZ3RoIGZvciB0aGUgc3luY2hyb25pemF0aW9uICovCisjZGVmaW5lIEhSVElNX1NZTkNPVVRQVVRQT0xBUklUWV9ORUdBVElWRSAgKEhSVElNX01DUl9TWU5DX09VVF8xIHwgSFJUSU1fTUNSX1NZTkNfT1VUXzApIC8qITwgU0NPVVQgcGluIGhhcyBhIGhpZ2ggaWRsZSBsZXZlbCBhbmQgaXNzdWVzIGEgbmVnYXRpdmUgcHVsc2Ugb2YgMTYgZkhSVElNIGNsb2NrIGN5Y2xlcyBsZW5ndGggZm9yIHRoZSBzeW5jaHJvbml6YXRpb24gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRXh0ZXJuYWxfRXZlbnRfU291cmNlcyBIUlRJTSBFeHRlcm5hbCBFdmVudCBTb3VyY2VzCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIGF2YWlsYWJsZSBzb3VyY2VzIGFzc29jaWF0ZWQgdG8gZXh0ZXJuYWwgZXZlbnRzCisgICovCisjZGVmaW5lIEhSVElNX0VWRU5UU1JDXzEgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRXh0ZXJuYWwgZXZlbnQgc291cmNlIDFVICovCisjZGVmaW5lIEhSVElNX0VWRU5UU1JDXzIgICAgICAgICAoSFJUSU1fRUVDUjFfRUUxU1JDXzApICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRXh0ZXJuYWwgZXZlbnQgc291cmNlIDJVICovCisjZGVmaW5lIEhSVElNX0VWRU5UU1JDXzMgICAgICAgICAoSFJUSU1fRUVDUjFfRUUxU1JDXzEpICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRXh0ZXJuYWwgZXZlbnQgc291cmNlIDNVICovCisjZGVmaW5lIEhSVElNX0VWRU5UU1JDXzQgICAgICAgICAoSFJUSU1fRUVDUjFfRUUxU1JDXzEgfCBIUlRJTV9FRUNSMV9FRTFTUkNfMCkgIC8qITwgRXh0ZXJuYWwgZXZlbnQgc291cmNlIDRVICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0V4dGVybmFsX0V2ZW50X1BvbGFyaXR5IEhSVElNIEV4dGVybmFsIEV2ZW50IFBvbGFyaXR5CisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRoZSBwb2xhcml0eSBvZiBhbiBleHRlcm5hbCBldmVudAorICAqLworI2RlZmluZSBIUlRJTV9FVkVOVFBPTEFSSVRZX0hJR0ggICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgLyohPCBFeHRlcm5hbCBldmVudCBpcyBhY3RpdmUgaGlnaCAqLworI2RlZmluZSBIUlRJTV9FVkVOVFBPTEFSSVRZX0xPVyAgICAgKEhSVElNX0VFQ1IxX0VFMVBPTCkgICAgLyohPCBFeHRlcm5hbCBldmVudCBpcyBhY3RpdmUgbG93ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0V4dGVybmFsX0V2ZW50X1NlbnNpdGl2aXR5IEhSVElNIEV4dGVybmFsIEV2ZW50IFNlbnNpdGl2aXR5CisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRoZSBzZW5zaXRpdml0eSAobGV2ZWwtc2Vuc2l0aXZlIG9yIGVkZ2Utc2Vuc2l0aXZlKQorICAqICAgICAgICBvZiBhbiBleHRlcm5hbCBldmVudAorICAqLworI2RlZmluZSBIUlRJTV9FVkVOVFNFTlNJVElWSVRZX0xFVkVMICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFeHRlcm5hbCBldmVudCBpcyBhY3RpdmUgb24gbGV2ZWwgKi8KKyNkZWZpbmUgSFJUSU1fRVZFTlRTRU5TSVRJVklUWV9SSVNJTkdFREdFICAgICAoSFJUSU1fRUVDUjFfRUUxU05TXzApICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRXh0ZXJuYWwgZXZlbnQgaXMgYWN0aXZlIG9uIFJpc2luZyBlZGdlICovCisjZGVmaW5lIEhSVElNX0VWRU5UU0VOU0lUSVZJVFlfRkFMTElOR0VER0UgICAgKEhSVElNX0VFQ1IxX0VFMVNOU18xKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEV4dGVybmFsIGV2ZW50IGlzIGFjdGl2ZSBvbiBGYWxsaW5nIGVkZ2UgKi8KKyNkZWZpbmUgSFJUSU1fRVZFTlRTRU5TSVRJVklUWV9CT1RIRURHRVMgICAgICAoSFJUSU1fRUVDUjFfRUUxU05TXzEgfCBIUlRJTV9FRUNSMV9FRTFTTlNfMCkgIC8qITwgRXh0ZXJuYWwgZXZlbnQgaXMgYWN0aXZlIG9uIFJpc2luZyBhbmQgRmFsbGluZyBlZGdlcyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9FeHRlcm5hbF9FdmVudF9GYXN0X01vZGUgSFJUSU0gRXh0ZXJuYWwgRXZlbnQgRmFzdCBNb2RlCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHdoZXRoZXIgb3Igbm90IGFuIGV4dGVybmFsIGV2ZW50IGlzIHByb2dyYW1tZWQgaW4KKyAgICAgICAgICAgZmFzdCBtb2RlCisgICovCisjZGVmaW5lIEhSVElNX0VWRU5URkFTVE1PREVfRU5BQkxFICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAvKiE8IEV4dGVybmFsIEV2ZW50IGlzIHJlLXN5bmNocm9uaXplZCBieSB0aGUgSFJUSU0gbG9naWMgYmVmb3JlIGFjdGluZyBvbiBvdXRwdXRzICovCisjZGVmaW5lIEhSVElNX0VWRU5URkFTVE1PREVfRElTQUJMRSAgIChIUlRJTV9FRUNSMV9FRTFGQVNUKSAgICAgICAvKiE8IEV4dGVybmFsIEV2ZW50IGlzIGFjdGluZyBhc3luY2hyb25vdXNseSBvbiBvdXRwdXRzIChsb3cgbGF0ZW5jeSBtb2RlKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9FeHRlcm5hbF9FdmVudF9GaWx0ZXIgSFJUSU0gRXh0ZXJuYWwgRXZlbnQgRmlsdGVyCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRoZSBmcmVxdWVuY3kgdXNlZCB0byBzYW1wbGUgYW4gZXh0ZXJuYWwgZXZlbnQgNgorICAqICAgICAgICBpbnB1dCBhbmQgdGhlIGxlbmd0aCAoTikgb2YgdGhlIGRpZ2l0YWwgZmlsdGVyIGFwcGxpZWQKKyAgKi8KKyNkZWZpbmUgSFJUSU1fRVZFTlRGSUxURVJfTk9ORSAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGaWx0ZXIgZGlzYWJsZWQgKi8KKyNkZWZpbmUgSFJUSU1fRVZFTlRGSUxURVJfMSAgICAgICAgIChIUlRJTV9FRUNSM19FRTZGXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9IGZIUlRJTSwgTj0yVSAqLworI2RlZmluZSBIUlRJTV9FVkVOVEZJTFRFUl8yICAgICAgICAgKEhSVElNX0VFQ1IzX0VFNkZfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz0gZkhSVElNLCBOPTRVICovCisjZGVmaW5lIEhSVElNX0VWRU5URklMVEVSXzMgICAgICAgICAoSFJUSU1fRUVDUjNfRUU2Rl8xIHwgSFJUSU1fRUVDUjNfRUU2Rl8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPSBmSFJUSU0sIE49OFUgKi8KKyNkZWZpbmUgSFJUSU1fRVZFTlRGSUxURVJfNCAgICAgICAgIChIUlRJTV9FRUNSM19FRTZGXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9IGZFRVZTLzJVLCBOPTZVICovCisjZGVmaW5lIEhSVElNX0VWRU5URklMVEVSXzUgICAgICAgICAoSFJUSU1fRUVDUjNfRUU2Rl8yIHwgSFJUSU1fRUVDUjNfRUU2Rl8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPSBmRUVWUy8yVSwgTj04VSAqLworI2RlZmluZSBIUlRJTV9FVkVOVEZJTFRFUl82ICAgICAgICAgKEhSVElNX0VFQ1IzX0VFNkZfMiB8IEhSVElNX0VFQ1IzX0VFNkZfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz0gZkVFVlMvNFUsIE49NlUgKi8KKyNkZWZpbmUgSFJUSU1fRVZFTlRGSUxURVJfNyAgICAgICAgIChIUlRJTV9FRUNSM19FRTZGXzIgfCBIUlRJTV9FRUNSM19FRTZGXzEgfCBIUlRJTV9FRUNSM19FRTZGXzApICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9IGZFRVZTLzRVLCBOPThVICovCisjZGVmaW5lIEhSVElNX0VWRU5URklMVEVSXzggICAgICAgICAoSFJUSU1fRUVDUjNfRUU2Rl8zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPSBmRUVWUy84VSwgTj02VSAqLworI2RlZmluZSBIUlRJTV9FVkVOVEZJTFRFUl85ICAgICAgICAgKEhSVElNX0VFQ1IzX0VFNkZfMyB8IEhSVElNX0VFQ1IzX0VFNkZfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz0gZkVFVlMvOFUsIE49OFUgKi8KKyNkZWZpbmUgSFJUSU1fRVZFTlRGSUxURVJfMTAgICAgICAgIChIUlRJTV9FRUNSM19FRTZGXzMgfCBIUlRJTV9FRUNSM19FRTZGXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9IGZFRVZTLzE2VSwgTj01VSAqLworI2RlZmluZSBIUlRJTV9FVkVOVEZJTFRFUl8xMSAgICAgICAgKEhSVElNX0VFQ1IzX0VFNkZfMyB8IEhSVElNX0VFQ1IzX0VFNkZfMSB8IEhSVElNX0VFQ1IzX0VFNkZfMCkgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz0gZkVFVlMvMTZVLCBOPTZVICovCisjZGVmaW5lIEhSVElNX0VWRU5URklMVEVSXzEyICAgICAgICAoSFJUSU1fRUVDUjNfRUU2Rl8zIHwgSFJUSU1fRUVDUjNfRUU2Rl8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPSBmRUVWUy8xNlUsIE49OFUgKi8KKyNkZWZpbmUgSFJUSU1fRVZFTlRGSUxURVJfMTMgICAgICAgIChIUlRJTV9FRUNSM19FRTZGXzMgfCBIUlRJTV9FRUNSM19FRTZGXzIgIHwgSFJUSU1fRUVDUjNfRUU2Rl8wKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9IGZFRVZTLzMyVSwgTj01VSAqLworI2RlZmluZSBIUlRJTV9FVkVOVEZJTFRFUl8xNCAgICAgICAgKEhSVElNX0VFQ1IzX0VFNkZfMyB8IEhSVElNX0VFQ1IzX0VFNkZfMiAgfCBIUlRJTV9FRUNSM19FRTZGXzEpICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz0gZkVFVlMvMzJVLCBOPTZVICovCisjZGVmaW5lIEhSVElNX0VWRU5URklMVEVSXzE1ICAgICAgICAoSFJUSU1fRUVDUjNfRUU2Rl8zIHwgSFJUSU1fRUVDUjNfRUU2Rl8yICB8IEhSVElNX0VFQ1IzX0VFNkZfMSB8IEhSVElNX0VFQ1IzX0VFNkZfMCkgIC8qITwgZlNBTVBMSU5HPSBmRUVWUy8zMlUsIE49OFUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRXh0ZXJuYWxfRXZlbnRfUHJlc2NhbGVyIEhSVElNIEV4dGVybmFsIEV2ZW50IFByZXNjYWxlcgorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyBkaXZpc2lvbiByYXRpbyBiZXR3ZWVuIHRoZSB0aW1lciBjbG9jayBmcmVxdWVuY3kgCisgICogICAgICAgIGZIUlRJTSkgYW5kIHRoZSBleHRlcm5hbCBldmVudCBzaWduYWwgc2FtcGxpbmcgY2xvY2sgKGZFRVZTKQorICAqICAgICAgICB1c2VkIGJ5IHRoZSBkaWdpdGFsIGZpbHRlcnMKKyAgKi8KKyNkZWZpbmUgSFJUSU1fRVZFTlRQUkVTQ0FMRVJfRElWMSAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZFRVZTPWZIUlRJTSAqLworI2RlZmluZSBIUlRJTV9FVkVOVFBSRVNDQUxFUl9ESVYyICAgIChIUlRJTV9FRUNSM19FRVZTRF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZkVFVlM9ZkhSVElNIC8gMlUgKi8KKyNkZWZpbmUgSFJUSU1fRVZFTlRQUkVTQ0FMRVJfRElWNCAgICAoSFJUSU1fRUVDUjNfRUVWU0RfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZFRVZTPWZIUlRJTSAvIDRVICovCisjZGVmaW5lIEhSVElNX0VWRU5UUFJFU0NBTEVSX0RJVjggICAgKEhSVElNX0VFQ1IzX0VFVlNEXzEgfCBIUlRJTV9FRUNSM19FRVZTRF8wKSAgICAgLyohPCBmRUVWUz1mSFJUSU0gLyA4VSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9GYXVsdF9Tb3VyY2VzIEhSVElNIEZhdWx0IFNvdXJjZXMKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgd2hldGhlciBhIGZhdWx0IGlzIHRyaWdnZXJlZCBieSBhbnkgZXh0ZXJuYWwgCisgICogICAgICAgIG9yIGludGVybmFsIGZhdWx0IHNvdXJjZQorICAqLyAKKyNkZWZpbmUgSFJUSU1fRkFVTFRTT1VSQ0VfRElHSVRBTElOUFVUICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgLyohPCBGYXVsdCBpbnB1dCBpcyBGTFQgaW5wdXQgcGluICovCisjZGVmaW5lIEhSVElNX0ZBVUxUU09VUkNFX0lOVEVSTkFMICAgICAgICAgIChIUlRJTV9GTFRJTlIxX0ZMVDFTUkMpICAgIC8qITwgRmF1bHQgaW5wdXQgaXMgRkxUX0ludCBzaWduYWwgKGUuZy4gaW50ZXJuYWwgY29tcGFyYXRvcikgKi8KKy8qKgorICAqIEB9CisgICovCisgIAorLyoqIEBkZWZncm91cCBIUlRJTV9GYXVsdF9Qb2xhcml0eSBIUlRJTSBGYXVsdCBQb2xhcml0eQorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB0aGUgcG9sYXJpdHkgb2YgYSBmYXVsdCBldmVudAorICAqLworI2RlZmluZSBIUlRJTV9GQVVMVFBPTEFSSVRZX0xPVyAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgIC8qITwgRmF1bHQgaW5wdXQgaXMgYWN0aXZlIGxvdyAqLworI2RlZmluZSBIUlRJTV9GQVVMVFBPTEFSSVRZX0hJR0ggICAgKEhSVElNX0ZMVElOUjFfRkxUMVApICAgIC8qITwgRmF1bHQgaW5wdXQgaXMgYWN0aXZlIGhpZ2ggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRmF1bHRfRmlsdGVyIEhSVElNIEZhdWx0IEZpbHRlcgorICAqIEB7CisgICogQCBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgdGhlIGZyZXF1ZW5jeSB1c2VkIHRvIHNhbXBsZSB0aGUgZmF1bHQgaW5wdXQgYW5kCisgICogICAgICAgICB0aGUgbGVuZ3RoIChOKSBvZiB0aGUgZGlnaXRhbCBmaWx0ZXIgYXBwbGllZAorICAqLworI2RlZmluZSBIUlRJTV9GQVVMVEZJTFRFUl9OT05FICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRmlsdGVyIGRpc2FibGVkICovCisjZGVmaW5lIEhSVElNX0ZBVUxURklMVEVSXzEgICAgICAgICAoSFJUSU1fRkxUSU5SMV9GTFQxRl8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9IGZIUlRJTSwgTj0yVSAqLworI2RlZmluZSBIUlRJTV9GQVVMVEZJTFRFUl8yICAgICAgICAgKEhSVElNX0ZMVElOUjFfRkxUMUZfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPSBmSFJUSU0sIE49NFUgKi8KKyNkZWZpbmUgSFJUSU1fRkFVTFRGSUxURVJfMyAgICAgICAgIChIUlRJTV9GTFRJTlIxX0ZMVDFGXzEgfCBIUlRJTV9GTFRJTlIxX0ZMVDFGXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz0gZkhSVElNLCBOPThVICovCisjZGVmaW5lIEhSVElNX0ZBVUxURklMVEVSXzQgICAgICAgICAoSFJUSU1fRkxUSU5SMV9GTFQxRl8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9IGZGTFRTLzJVLCBOPTZVICovCisjZGVmaW5lIEhSVElNX0ZBVUxURklMVEVSXzUgICAgICAgICAoSFJUSU1fRkxUSU5SMV9GTFQxRl8yIHwgSFJUSU1fRkxUSU5SMV9GTFQxRl8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9IGZGTFRTLzJVLCBOPThVICovCisjZGVmaW5lIEhSVElNX0ZBVUxURklMVEVSXzYgICAgICAgICAoSFJUSU1fRkxUSU5SMV9GTFQxRl8yIHwgSFJUSU1fRkxUSU5SMV9GTFQxRl8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9IGZGTFRTLzRVLCBOPTZVICovCisjZGVmaW5lIEhSVElNX0ZBVUxURklMVEVSXzcgICAgICAgICAoSFJUSU1fRkxUSU5SMV9GTFQxRl8yIHwgSFJUSU1fRkxUSU5SMV9GTFQxRl8xIHwgSFJUSU1fRkxUSU5SMV9GTFQxRl8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9IGZGTFRTLzRVLCBOPThVICovCisjZGVmaW5lIEhSVElNX0ZBVUxURklMVEVSXzggICAgICAgICAoSFJUSU1fRkxUSU5SMV9GTFQxRl8zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9IGZGTFRTLzhVLCBOPTZVICovCisjZGVmaW5lIEhSVElNX0ZBVUxURklMVEVSXzkgICAgICAgICAoSFJUSU1fRkxUSU5SMV9GTFQxRl8zIHwgSFJUSU1fRkxUSU5SMV9GTFQxRl8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9IGZGTFRTLzhVLCBOPThVICovCisjZGVmaW5lIEhSVElNX0ZBVUxURklMVEVSXzEwICAgICAgICAoSFJUSU1fRkxUSU5SMV9GTFQxRl8zIHwgSFJUSU1fRkxUSU5SMV9GTFQxRl8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9IGZGTFRTLzE2VSwgTj01VSAqLworI2RlZmluZSBIUlRJTV9GQVVMVEZJTFRFUl8xMSAgICAgICAgKEhSVElNX0ZMVElOUjFfRkxUMUZfMyB8IEhSVElNX0ZMVElOUjFfRkxUMUZfMSB8IEhSVElNX0ZMVElOUjFfRkxUMUZfMCkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPSBmRkxUUy8xNlUsIE49NlUgKi8KKyNkZWZpbmUgSFJUSU1fRkFVTFRGSUxURVJfMTIgICAgICAgIChIUlRJTV9GTFRJTlIxX0ZMVDFGXzMgfCBIUlRJTV9GTFRJTlIxX0ZMVDFGXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz0gZkZMVFMvMTZVLCBOPThVICovCisjZGVmaW5lIEhSVElNX0ZBVUxURklMVEVSXzEzICAgICAgICAoSFJUSU1fRkxUSU5SMV9GTFQxRl8zIHwgSFJUSU1fRkxUSU5SMV9GTFQxRl8yIHwgSFJUSU1fRkxUSU5SMV9GTFQxRl8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9IGZGTFRTLzMyVSwgTj01VSAqLworI2RlZmluZSBIUlRJTV9GQVVMVEZJTFRFUl8xNCAgICAgICAgKEhSVElNX0ZMVElOUjFfRkxUMUZfMyB8IEhSVElNX0ZMVElOUjFfRkxUMUZfMiB8IEhSVElNX0ZMVElOUjFfRkxUMUZfMSkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPSBmRkxUUy8zMlUsIE49NlUgKi8KKyNkZWZpbmUgSFJUSU1fRkFVTFRGSUxURVJfMTUgICAgICAgIChIUlRJTV9GTFRJTlIxX0ZMVDFGXzMgfCBIUlRJTV9GTFRJTlIxX0ZMVDFGXzIgfCBIUlRJTV9GTFRJTlIxX0ZMVDFGXzEgfCBIUlRJTV9GTFRJTlIxX0ZMVDFGXzApICAvKiE8IGZTQU1QTElORz0gZkZMVFMvMzJVLCBOPThVICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0ZhdWx0X0xvY2sgSFJUSU0gRmF1bHQgTG9jaworICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB3aGV0aGVyIG9yIG5vdCB0aGUgZmF1bHQgcHJvZ3JhbW1pbmcgYml0cyBhcmUKKyAgICAgICAgICAgd3JpdGUgcHJvdGVjdGVkCisgICovCisjZGVmaW5lIEhSVElNX0ZBVUxUTE9DS19SRUFEV1JJVEUgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgIC8qITwgRmF1bHQgc2V0dGluZ3MgYml0cyBhcmUgcmVhZC93cml0ZSAqLworI2RlZmluZSBIUlRJTV9GQVVMVExPQ0tfUkVBRE9OTFkgICAgICAgIChIUlRJTV9GTFRJTlIxX0ZMVDFMQ0spICAgICAvKiE8IEZhdWx0IHNldHRpbmdzIGJpdHMgYXJlIHJlYWQgb25seSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9FeHRlcm5hbF9GYXVsdF9QcmVzY2FsZXIgSFJUSU0gRXh0ZXJuYWwgRmF1bHQgUHJlc2NhbGVyCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRoZSBkaXZpc2lvbiByYXRpbyBiZXR3ZWVuIHRoZSB0aW1lciBjbG9jayAKKyAgKiAgICAgICAgZnJlcXVlbmN5IChmSFJUSU0pIGFuZCB0aGUgZmF1bHQgc2lnbmFsIHNhbXBsaW5nIGNsb2NrIChmRkxUUykgdXNlZCAKKyAgKiAgICAgICAgYnkgdGhlIGRpZ2l0YWwgZmlsdGVycy4KKyAgKi8KKyNkZWZpbmUgSFJUSU1fRkFVTFRQUkVTQ0FMRVJfRElWMSAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZkZMVFM9ZkhSVElNICovCisjZGVmaW5lIEhSVElNX0ZBVUxUUFJFU0NBTEVSX0RJVjIgICAgKEhSVElNX0ZMVElOUjJfRkxUU0RfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZGTFRTPWZIUlRJTSAvIDJVICovCisjZGVmaW5lIEhSVElNX0ZBVUxUUFJFU0NBTEVSX0RJVjQgICAgKEhSVElNX0ZMVElOUjJfRkxUU0RfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZGTFRTPWZIUlRJTSAvIDRVICovCisjZGVmaW5lIEhSVElNX0ZBVUxUUFJFU0NBTEVSX0RJVjggICAgKEhSVElNX0ZMVElOUjJfRkxUU0RfMSB8IEhSVElNX0ZMVElOUjJfRkxUU0RfMCkgICAvKiE8IGZGTFRTPWZIUlRJTSAvIDhVICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0J1cnN0X01vZGVfT3BlcmF0aW5nX01vZGUgSFJUSU0gQnVyc3QgTW9kZSBPcGVyYXRpbmcgTW9kZQorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyBpZiB0aGUgYnVyc3QgbW9kZSBpcyBlbnRlcmVkIG9uY2Ugb3IgaWYgaXQgaXMgCisgICogICAgICAgIGNvbnRpbnVvdXNseSBvcGVyYXRpbmcKKyAgKi8KKyNkZWZpbmUgSFJUSU1fQlVSU1RNT0RFX1NJTkdMRVNIT1QgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgLyohPCBCdXJzdCBtb2RlIG9wZXJhdGVzIGluIHNpbmdsZSBzaG90IG1vZGUgKi8KKyNkZWZpbmUgSFJUSU1fQlVSU1RNT0RFX0NPTlRJTk9VUyAgIChIUlRJTV9CTUNSX0JNT00pICAgICAgLyohPCBCdXJzdCBtb2RlIG9wZXJhdGVzIGluIGNvbnRpbnVvdXMgbW9kZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9CdXJzdF9Nb2RlX0Nsb2NrX1NvdXJjZSBIUlRJTSBCdXJzdCBNb2RlIENsb2NrIFNvdXJjZQorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB0aGUgY2xvY2sgc291cmNlIGZvciB0aGUgYnVyc3QgbW9kZSBjb3VudGVyCisgICovIAorI2RlZmluZSBIUlRJTV9CVVJTVE1PREVDTE9DS1NPVVJDRV9NQVNURVIgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1hc3RlciB0aW1lciBjb3VudGVyIHJlc2V0L3JvbGwtb3ZlciBpcyB1c2VkIGFzIGNsb2NrIHNvdXJjZSBmb3IgdGhlIGJ1cnN0IG1vZGUgY291bnRlciAqLworI2RlZmluZSBIUlRJTV9CVVJTVE1PREVDTE9DS1NPVVJDRV9USU1FUl9BICAgIChIUlRJTV9CTUNSX0JNQ0xLXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWVyIEEgY291bnRlciByZXNldC9yb2xsLW92ZXIgaXMgdXNlZCBhcyBjbG9jayBzb3VyY2UgZm9yIHRoZSBidXJzdCBtb2RlIGNvdW50ZXIgKi8KKyNkZWZpbmUgSFJUSU1fQlVSU1RNT0RFQ0xPQ0tTT1VSQ0VfVElNRVJfQiAgICAoSFJUSU1fQk1DUl9CTUNMS18xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaW1lciBCIGNvdW50ZXIgcmVzZXQvcm9sbC1vdmVyIGlzIHVzZWQgYXMgY2xvY2sgc291cmNlIGZvciB0aGUgYnVyc3QgbW9kZSBjb3VudGVyICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERUNMT0NLU09VUkNFX1RJTUVSX0MgICAgKEhSVElNX0JNQ1JfQk1DTEtfMSB8IEhSVElNX0JNQ1JfQk1DTEtfMCkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGltZXIgQyBjb3VudGVyIHJlc2V0L3JvbGwtb3ZlciBpcyB1c2VkIGFzIGNsb2NrIHNvdXJjZSBmb3IgdGhlIGJ1cnN0IG1vZGUgY291bnRlciAqLworI2RlZmluZSBIUlRJTV9CVVJTVE1PREVDTE9DS1NPVVJDRV9USU1FUl9EICAgIChIUlRJTV9CTUNSX0JNQ0xLXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWVyIEQgY291bnRlciByZXNldC9yb2xsLW92ZXIgaXMgdXNlZCBhcyBjbG9jayBzb3VyY2UgZm9yIHRoZSBidXJzdCBtb2RlIGNvdW50ZXIgKi8KKyNkZWZpbmUgSFJUSU1fQlVSU1RNT0RFQ0xPQ0tTT1VSQ0VfVElNRVJfRSAgICAoSFJUSU1fQk1DUl9CTUNMS18yIHwgSFJUSU1fQk1DUl9CTUNMS18wKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaW1lciBFIGNvdW50ZXIgcmVzZXQvcm9sbC1vdmVyIGlzIHVzZWQgYXMgY2xvY2sgc291cmNlIGZvciB0aGUgYnVyc3QgbW9kZSBjb3VudGVyICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERUNMT0NLU09VUkNFX1RJTTE2X09DICAgKEhSVElNX0JNQ1JfQk1DTEtfMiB8IEhSVElNX0JNQ1JfQk1DTEtfMSkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT24tY2hpcCBFdmVudCAxIChCTUNsa1sxXSksIGFjdGluZyBhcyBhIGJ1cnN0IG1vZGUgY291bnRlciBjbG9jayAqLworI2RlZmluZSBIUlRJTV9CVVJTVE1PREVDTE9DS1NPVVJDRV9USU0xN19PQyAgIChIUlRJTV9CTUNSX0JNQ0xLXzIgfCBIUlRJTV9CTUNSX0JNQ0xLXzEgfCBIUlRJTV9CTUNSX0JNQ0xLXzApICAvKiE8IE9uLWNoaXAgRXZlbnQgMiAoQk1DbGtbMl0pLCBhY3RpbmcgYXMgYSBidXJzdCBtb2RlIGNvdW50ZXIgY2xvY2sgKi8KKyNkZWZpbmUgSFJUSU1fQlVSU1RNT0RFQ0xPQ0tTT1VSQ0VfVElNN19UUkdPICAoSFJUSU1fQk1DUl9CTUNMS18zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPbi1jaGlwIEV2ZW50IDMgKEJNQ2xrWzNdKSwgYWN0aW5nIGFzIGEgYnVyc3QgbW9kZSBjb3VudGVyIGNsb2NrICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERUNMT0NLU09VUkNFX0ZIUlRJTSAgICAgKEhSVElNX0JNQ1JfQk1DTEtfMyB8IEhSVElNX0JNQ1JfQk1DTEtfMSkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUHJlc2NhbGVkIGZIUlRJTSBjbG9jayBpcyB1c2VkIGFzIGNsb2NrIHNvdXJjZSBmb3IgdGhlIGJ1cnN0IG1vZGUgY291bnRlciAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9CdXJzdF9Nb2RlX1ByZXNjYWxlciBIUlRJTSBCdXJzdCBNb2RlIFByZXNjYWxlcgorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB0aGUgcHJlc2NhbGluZyByYXRpbyBvZiB0aGUgZkhSVElNIGNsb2NrIAorICAqICAgICAgICBmb3IgdGhlIGJ1cnN0IG1vZGUgY29udHJvbGxlcgorICAqLworI2RlZmluZSBIUlRJTV9CVVJTVE1PREVQUkVTQ0FMRVJfRElWMSAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZkJSU1QgPSBmSFJUSU0gKi8KKyNkZWZpbmUgSFJUSU1fQlVSU1RNT0RFUFJFU0NBTEVSX0RJVjIgICAgIChIUlRJTV9CTUNSX0JNUFJTQ18wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZCUlNUID0gZkhSVElNLzJVICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVBSRVNDQUxFUl9ESVY0ICAgICAoSFJUSU1fQk1DUl9CTVBSU0NfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmQlJTVCA9IGZIUlRJTS80VSAqLworI2RlZmluZSBIUlRJTV9CVVJTVE1PREVQUkVTQ0FMRVJfRElWOCAgICAgKEhSVElNX0JNQ1JfQk1QUlNDXzEgfCBIUlRJTV9CTUNSX0JNUFJTQ18wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZkJSU1QgPSBmSFJUSU0vOFUgKi8KKyNkZWZpbmUgSFJUSU1fQlVSU1RNT0RFUFJFU0NBTEVSX0RJVjE2ICAgIChIUlRJTV9CTUNSX0JNUFJTQ18yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZCUlNUID0gZkhSVElNLzE2VSAqLworI2RlZmluZSBIUlRJTV9CVVJTVE1PREVQUkVTQ0FMRVJfRElWMzIgICAgKEhSVElNX0JNQ1JfQk1QUlNDXzIgfCBIUlRJTV9CTUNSX0JNUFJTQ18wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZkJSU1QgPSBmSFJUSU0vMzJVICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVBSRVNDQUxFUl9ESVY2NCAgICAoSFJUSU1fQk1DUl9CTVBSU0NfMiB8IEhSVElNX0JNQ1JfQk1QUlNDXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmQlJTVCA9IGZIUlRJTS82NFUgKi8KKyNkZWZpbmUgSFJUSU1fQlVSU1RNT0RFUFJFU0NBTEVSX0RJVjEyOCAgIChIUlRJTV9CTUNSX0JNUFJTQ18yIHwgSFJUSU1fQk1DUl9CTVBSU0NfMSB8IEhSVElNX0JNQ1JfQk1QUlNDXzApICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZCUlNUID0gZkhSVElNLzEyOFUgKi8KKyNkZWZpbmUgSFJUSU1fQlVSU1RNT0RFUFJFU0NBTEVSX0RJVjI1NiAgIChIUlRJTV9CTUNSX0JNUFJTQ18zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZCUlNUID0gZkhSVElNLzI1NlUgKi8KKyNkZWZpbmUgSFJUSU1fQlVSU1RNT0RFUFJFU0NBTEVSX0RJVjUxMiAgIChIUlRJTV9CTUNSX0JNUFJTQ18zIHwgSFJUSU1fQk1DUl9CTVBSU0NfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZCUlNUID0gZkhSVElNLzUxMlUgKi8KKyNkZWZpbmUgSFJUSU1fQlVSU1RNT0RFUFJFU0NBTEVSX0RJVjEwMjQgIChIUlRJTV9CTUNSX0JNUFJTQ18zIHwgSFJUSU1fQk1DUl9CTVBSU0NfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZCUlNUID0gZkhSVElNLzEwMjRVICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVBSRVNDQUxFUl9ESVYyMDQ4ICAoSFJUSU1fQk1DUl9CTVBSU0NfMyB8IEhSVElNX0JNQ1JfQk1QUlNDXzEgfCBIUlRJTV9CTUNSX0JNUFJTQ18wKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmQlJTVCA9IGZIUlRJTS8yMDQ4VSovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVBSRVNDQUxFUl9ESVY0MDk2ICAoSFJUSU1fQk1DUl9CTVBSU0NfMyB8IEhSVElNX0JNQ1JfQk1QUlNDXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmQlJTVCA9IGZIUlRJTS80MDk2VSAqLworI2RlZmluZSBIUlRJTV9CVVJTVE1PREVQUkVTQ0FMRVJfRElWODE5MiAgKEhSVElNX0JNQ1JfQk1QUlNDXzMgfCBIUlRJTV9CTUNSX0JNUFJTQ18yIHwgSFJUSU1fQk1DUl9CTVBSU0NfMCkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZkJSU1QgPSBmSFJUSU0vODE5MlUgKi8KKyNkZWZpbmUgSFJUSU1fQlVSU1RNT0RFUFJFU0NBTEVSX0RJVjE2Mzg0IChIUlRJTV9CTUNSX0JNUFJTQ18zIHwgSFJUSU1fQk1DUl9CTVBSU0NfMiB8IEhSVElNX0JNQ1JfQk1QUlNDXzEpICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZCUlNUID0gZkhSVElNLzE2Mzg0VSAqLworI2RlZmluZSBIUlRJTV9CVVJTVE1PREVQUkVTQ0FMRVJfRElWMzI3NjggKEhSVElNX0JNQ1JfQk1QUlNDXzMgfCBIUlRJTV9CTUNSX0JNUFJTQ18yIHwgSFJUSU1fQk1DUl9CTVBSU0NfMSB8IEhSVElNX0JNQ1JfQk1QUlNDXzApIC8qITwgZkJSU1QgPSBmSFJUSU0vMzI3NjhVICovCisvKioKKyAgKiBAfQorICAqLworICAgICAgICAgICAgICAgIAorLyoqIEBkZWZncm91cCBIUlRJTV9CdXJzdF9Nb2RlX1JlZ2lzdGVyX1ByZWxvYWRfRW5hYmxlIEhSVElNIEJ1cnN0IE1vZGUgUmVnaXN0ZXIgUHJlbG9hZCBFbmFibGUKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgd2hldGhlciBvciBub3QgYnVyc3QgbW9kZSByZWdpc3RlcnMgcHJlbG9hZCAKKyAgICAgICAgICAgbWVjaGFuaXNtIGlzIGVuYWJsZWQsIGkuZS4gYSB3cml0ZSBhY2Nlc3MgaW50byBhIHByZWxvYWRhYmxlIHJlZ2lzdGVyCisgICAgICAgICAgKEhSVElNX0JNQ01QUiwgSFJUSU1fQk1QRVIpIGlzIGRvbmUgaW50byB0aGUgYWN0aXZlIG9yIHRoZSBwcmVsb2FkIHJlZ2lzdGVyCisgICovCisjZGVmaW5lIEhSSU1fQlVSU1RNT0RFUFJFTE9BRF9ESVNBQkxFRCAoMHgwMDAwMDAwMFUpICAvKiE8IFByZWxvYWQgZGlzYWJsZWQ6IHRoZSB3cml0ZSBhY2Nlc3MgaXMgZGlyZWN0bHkgZG9uZSBpbnRvIGFjdGl2ZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSFJJTV9CVVJTVE1PREVQUkVMT0FEX0VOQUJMRUQgIChIUlRJTV9CTUNSX0JNUFJFTikgICAgIC8qITwgUHJlbG9hZCBlbmFibGVkOiB0aGUgd3JpdGUgYWNjZXNzIGlzIGRvbmUgaW50byBwcmVsb2FkIHJlZ2lzdGVycyAqLworLyoqCisgICogQH0KKyAgKi8KKyAgICAgICAgICAgICAgICAKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fQnVyc3RfTW9kZV9UcmlnZ2VyIEhSVElNIEJ1cnN0IE1vZGUgVHJpZ2dlcgorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB0aGUgZXZlbnRzIHRoYXQgY2FuIGJlIHVzZWQgdG9yIHRyaWcgdGhlIGJ1cnN0CisgICogICAgICAgIG1vZGUgb3BlcmF0aW9uCisgICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVRSSUdHRVJfTk9ORSAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgIE5vIHRyaWdnZXIgKi8KKyNkZWZpbmUgSFJUSU1fQlVSU1RNT0RFVFJJR0dFUl9NQVNURVJfUkVTRVQgICAgICAgKEhSVElNX0JNVFJHUl9NU1RSU1QpICAgLyohPCAgTWFzdGVyIHJlc2V0ICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVRSSUdHRVJfTUFTVEVSX1JFUEVUSVRJT04gIChIUlRJTV9CTVRSR1JfTVNUUkVQKSAgIC8qITwgIE1hc3RlciByZXBldGl0aW9uICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVRSSUdHRVJfTUFTVEVSX0NNUDEgICAgICAgIChIUlRJTV9CTVRSR1JfTVNUQ01QMSkgIC8qITwgIE1hc3RlciBjb21wYXJlIDFVICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVRSSUdHRVJfTUFTVEVSX0NNUDIgICAgICAgIChIUlRJTV9CTVRSR1JfTVNUQ01QMikgIC8qITwgIE1hc3RlciBjb21wYXJlIDJVICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVRSSUdHRVJfTUFTVEVSX0NNUDMgICAgICAgIChIUlRJTV9CTVRSR1JfTVNUQ01QMykgIC8qITwgIE1hc3RlciBjb21wYXJlIDNVICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVRSSUdHRVJfTUFTVEVSX0NNUDQgICAgICAgIChIUlRJTV9CTVRSR1JfTVNUQ01QNCkgIC8qITwgIE1hc3RlciBjb21wYXJlIDRVICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVRSSUdHRVJfVElNRVJBX1JFU0VUICAgICAgIChIUlRJTV9CTVRSR1JfVEFSU1QpICAgIC8qITwgVGltZXIgQSByZXNldCAgKi8KKyNkZWZpbmUgSFJUSU1fQlVSU1RNT0RFVFJJR0dFUl9USU1FUkFfUkVQRVRJVElPTiAgKEhSVElNX0JNVFJHUl9UQVJFUCkgICAgLyohPCBUaW1lciBBIHJlcGV0aXRpb24gICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVRSSUdHRVJfVElNRVJBX0NNUDEgICAgICAgIChIUlRJTV9CTVRSR1JfVEFDTVAxKSAgIC8qITwgVGltZXIgQSBjb21wYXJlIDEgICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVRSSUdHRVJfVElNRVJBX0NNUDIgICAgICAgIChIUlRJTV9CTVRSR1JfVEFDTVAyKSAgIC8qITwgVGltZXIgQSBjb21wYXJlIDIgICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVRSSUdHRVJfVElNRVJCX1JFU0VUICAgICAgIChIUlRJTV9CTVRSR1JfVEJSU1QpICAgIC8qITwgVGltZXIgQiByZXNldCAgKi8KKyNkZWZpbmUgSFJUSU1fQlVSU1RNT0RFVFJJR0dFUl9USU1FUkJfUkVQRVRJVElPTiAgKEhSVElNX0JNVFJHUl9UQlJFUCkgICAgLyohPCBUaW1lciBCIHJlcGV0aXRpb24gICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVRSSUdHRVJfVElNRVJCX0NNUDEgICAgICAgIChIUlRJTV9CTVRSR1JfVEJDTVAxKSAgIC8qITwgVGltZXIgQiBjb21wYXJlIDEgICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVRSSUdHRVJfVElNRVJCX0NNUDIgICAgICAgIChIUlRJTV9CTVRSR1JfVEJDTVAyKSAgIC8qITwgVGltZXIgQiBjb21wYXJlIDIgICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVRSSUdHRVJfVElNRVJDX1JFU0VUICAgICAgIChIUlRJTV9CTVRSR1JfVENSU1QpICAgIC8qITwgVGltZXIgQyByZXNldCAgKi8KKyNkZWZpbmUgSFJUSU1fQlVSU1RNT0RFVFJJR0dFUl9USU1FUkNfUkVQRVRJVElPTiAgKEhSVElNX0JNVFJHUl9UQ1JFUCkgICAgLyohPCBUaW1lciBDIHJlcGV0aXRpb24gICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVRSSUdHRVJfVElNRVJDX0NNUDEgICAgICAgIChIUlRJTV9CTVRSR1JfVENDTVAxKSAgIC8qITwgVGltZXIgQyBjb21wYXJlIDEgICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVRSSUdHRVJfVElNRVJDX0NNUDIgICAgICAgIChIUlRJTV9CTVRSR1JfVENDTVAyKSAgIC8qITwgVGltZXIgQyBjb21wYXJlIDIgICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVRSSUdHRVJfVElNRVJEX1JFU0VUICAgICAgIChIUlRJTV9CTVRSR1JfVERSU1QpICAgIC8qITwgVGltZXIgRCByZXNldCAgKi8KKyNkZWZpbmUgSFJUSU1fQlVSU1RNT0RFVFJJR0dFUl9USU1FUkRfUkVQRVRJVElPTiAgKEhSVElNX0JNVFJHUl9URFJFUCkgICAgLyohPCBUaW1lciBEIHJlcGV0aXRpb24gICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVRSSUdHRVJfVElNRVJEX0NNUDEgICAgICAgIChIUlRJTV9CTVRSR1JfVERDTVAxKSAgIC8qITwgVGltZXIgRCBjb21wYXJlIDEgICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVRSSUdHRVJfVElNRVJEX0NNUDIgICAgICAgIChIUlRJTV9CTVRSR1JfVERDTVAyKSAgIC8qITwgVGltZXIgRCBjb21wYXJlIDIgICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVRSSUdHRVJfVElNRVJFX1JFU0VUICAgICAgIChIUlRJTV9CTVRSR1JfVEVSU1QpICAgIC8qITwgVGltZXIgRSByZXNldCAgKi8KKyNkZWZpbmUgSFJUSU1fQlVSU1RNT0RFVFJJR0dFUl9USU1FUkVfUkVQRVRJVElPTiAgKEhSVElNX0JNVFJHUl9URVJFUCkgICAgLyohPCBUaW1lciBFIHJlcGV0aXRpb24gICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVRSSUdHRVJfVElNRVJFX0NNUDEgICAgICAgIChIUlRJTV9CTVRSR1JfVEVDTVAxKSAgIC8qITwgVGltZXIgRSBjb21wYXJlIDEgICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVRSSUdHRVJfVElNRVJFX0NNUDIgICAgICAgIChIUlRJTV9CTVRSR1JfVEVDTVAyKSAgIC8qITwgVGltZXIgRSBjb21wYXJlIDIgICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVRSSUdHRVJfVElNRVJBX0VWRU5UNyAgICAgIChIUlRJTV9CTVRSR1JfVEFFRVY3KSAgIC8qITwgVGltZXIgQSBwZXJpb2QgZm9sbG93aW5nIEV4dGVybmFsIEV2ZW50IDcgICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVRSSUdHRVJfVElNRVJEX0VWRU5UOCAgICAgIChIUlRJTV9CTVRSR1JfVERFRVY4KSAgIC8qITwgVGltZXIgRCBwZXJpb2QgZm9sbG93aW5nIEV4dGVybmFsIEV2ZW50IDggICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVRSSUdHRVJfRVZFTlRfNyAgICAgICAgICAgIChIUlRJTV9CTVRSR1JfRUVWNykgICAgIC8qITwgRXh0ZXJuYWwgRXZlbnQgNyAodGltZXIgQSBmaWx0ZXJzIGFwcGxpZWQpICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERVRSSUdHRVJfRVZFTlRfOCAgICAgICAgICAgIChIUlRJTV9CTVRSR1JfRUVWOCkgICAgIC8qITwgRXh0ZXJuYWwgRXZlbnQgOCAodGltZXIgRCBmaWx0ZXJzIGFwcGxpZWQpKi8KKyNkZWZpbmUgSFJUSU1fQlVSU1RNT0RFVFJJR0dFUl9FVkVOVF9PTkNISVAgICAgICAgKEhSVElNX0JNVFJHUl9PQ0hQRVYpICAgLyohPCBPbi1jaGlwIEV2ZW50ICovCisvKioKKyAgKiBAfQorICAqLworICAgICAgICAgICAgICAgIAorLyoqIEBkZWZncm91cCBIUlRJTV9BRENfVHJpZ2dlcl9VcGRhdGVfU291cmNlIEhSVElNIEFEQyBUcmlnZ2VyIFVwZGF0ZSBTb3VyY2UKKyAgKiBAeworICAqIEBicmllZiBjb25zdGFudHMgZGVmaW5pbmcgdGhlIHNvdXJjZSB0cmlnZ2VyaW5nIHRoZSB1cGRhdGUgb2YgdGhlIAorICAgICBIUlRJTV9BREN4UiByZWdpc3RlciAodHJhbnNmZXIgZnJvbSBwcmVsb2FkIHRvIGFjdGl2ZSByZWdpc3RlcikuCisgICovCisjZGVmaW5lIEhSVElNX0FEQ1RSSUdHRVJVUERBVEVfTUFTVEVSICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYXN0ZXIgdGltZXIgKi8KKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUlVQREFURV9USU1FUl9BIChIUlRJTV9DUjFfQURDMVVTUkNfMCkgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWVyIEEgKi8KKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUlVQREFURV9USU1FUl9CIChIUlRJTV9DUjFfQURDMVVTUkNfMSkgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWVyIEIgKi8KKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUlVQREFURV9USU1FUl9DIChIUlRJTV9DUjFfQURDMVVTUkNfMSB8IEhSVElNX0NSMV9BREMxVVNSQ18wKSAvKiE8IFRpbWVyIEMgKi8KKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUlVQREFURV9USU1FUl9EIChIUlRJTV9DUjFfQURDMVVTUkNfMikgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWVyIEQgKi8KKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUlVQREFURV9USU1FUl9FIChIUlRJTV9DUjFfQURDMVVTUkNfMiB8IEhSVElNX0NSMV9BREMxVVNSQ18wKSAvKiE8IFRpbWVyIEUgKi8KKy8qKgorICAqIEB9CisgICovCisgICAgICAgICAgICAgICAgCisvKiogQGRlZmdyb3VwIEhSVElNX0FEQ19UcmlnZ2VyX0V2ZW50IEhSVElNIEFEQyBUcmlnZ2VyIEV2ZW50CisgICogQHsKKyAgKiBAYnJpZWYgY29uc3RhbnRzIGRlZmluaW5nIHRoZSBldmVudHMgdHJpZ2dlcmluZyBBREMgY29udmVyc2lvbi4KKyAgKiAgICAgICAgSFJUSU1fQURDVFJJR0dFUkVWRU5UMTNfKjogQURDIFRyaWdnZXJzIDEgYW5kIDMKKyAgKiAgICAgICAgSFJUSU1fQURDVFJJR0dFUkVWRU5UMjRfKjogQURDIFRyaWdnZXJzIDIgYW5kIDQKKyAgKi8KKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUkVWRU5UMTNfTk9ORSAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgIC8qITwgTm8gQURDIHRyaWdnZXIgZXZlbnQgKi8KKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUkVWRU5UMTNfTUFTVEVSX0NNUDEgICAgKEhSVElNX0FEQzFSX0FEMU1DMSkgICAgIC8qITwgQURDIFRyaWdnZXIgb24gbWFzdGVyIGNvbXBhcmUgMVUgKi8KKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUkVWRU5UMTNfTUFTVEVSX0NNUDIgICAgKEhSVElNX0FEQzFSX0FEMU1DMikgICAgIC8qITwgQURDIFRyaWdnZXIgb24gbWFzdGVyIGNvbXBhcmUgMlUgKi8gCisjZGVmaW5lIEhSVElNX0FEQ1RSSUdHRVJFVkVOVDEzX01BU1RFUl9DTVAzICAgIChIUlRJTV9BREMxUl9BRDFNQzMpICAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIG1hc3RlciBjb21wYXJlIDNVICovCisjZGVmaW5lIEhSVElNX0FEQ1RSSUdHRVJFVkVOVDEzX01BU1RFUl9DTVA0ICAgIChIUlRJTV9BREMxUl9BRDFNQzQpICAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIG1hc3RlciBjb21wYXJlIDRVICovCisjZGVmaW5lIEhSVElNX0FEQ1RSSUdHRVJFVkVOVDEzX01BU1RFUl9QRVJJT0QgIChIUlRJTV9BREMxUl9BRDFNUEVSKSAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIG1hc3RlciBwZXJpb2QgKi8KKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUkVWRU5UMTNfRVZFTlRfMSAgICAgICAgKEhSVElNX0FEQzFSX0FEMUVFVjEpICAgIC8qITwgQURDIFRyaWdnZXIgb24gZXh0ZXJuYWwgZXZlbnQgMVUgKi8KKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUkVWRU5UMTNfRVZFTlRfMiAgICAgICAgKEhSVElNX0FEQzFSX0FEMUVFVjIpICAgIC8qITwgQURDIFRyaWdnZXIgb24gZXh0ZXJuYWwgZXZlbnQgMlUgKi8KKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUkVWRU5UMTNfRVZFTlRfMyAgICAgICAgKEhSVElNX0FEQzFSX0FEMUVFVjMpICAgIC8qITwgQURDIFRyaWdnZXIgb24gZXh0ZXJuYWwgZXZlbnQgM1UgKi8KKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUkVWRU5UMTNfRVZFTlRfNCAgICAgICAgKEhSVElNX0FEQzFSX0FEMUVFVjQpICAgIC8qITwgQURDIFRyaWdnZXIgb24gZXh0ZXJuYWwgZXZlbnQgNFUgKi8gCisjZGVmaW5lIEhSVElNX0FEQ1RSSUdHRVJFVkVOVDEzX0VWRU5UXzUgICAgICAgIChIUlRJTV9BREMxUl9BRDFFRVY1KSAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIGV4dGVybmFsIGV2ZW50IDVVICovCisjZGVmaW5lIEhSVElNX0FEQ1RSSUdHRVJFVkVOVDEzX1RJTUVSQV9DTVAyICAgIChIUlRJTV9BREMxUl9BRDFUQUMyKSAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEEgY29tcGFyZSAyVSAqLworI2RlZmluZSBIUlRJTV9BRENUUklHR0VSRVZFTlQxM19USU1FUkFfQ01QMyAgICAoSFJUSU1fQURDMVJfQUQxVEFDMykgICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBBIGNvbXBhcmUgM1UgKi8KKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUkVWRU5UMTNfVElNRVJBX0NNUDQgICAgKEhSVElNX0FEQzFSX0FEMVRBQzQpICAgIC8qITwgQURDIFRyaWdnZXIgb24gVGltZXIgQSBjb21wYXJlIDRVICovCisjZGVmaW5lIEhSVElNX0FEQ1RSSUdHRVJFVkVOVDEzX1RJTUVSQV9QRVJJT0QgIChIUlRJTV9BREMxUl9BRDFUQVBFUikgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEEgcGVyaW9kICovCisjZGVmaW5lIEhSVElNX0FEQ1RSSUdHRVJFVkVOVDEzX1RJTUVSQV9SRVNFVCAgIChIUlRJTV9BREMxUl9BRDFUQVJTVCkgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEEgcmVzZXQgKi8KKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUkVWRU5UMTNfVElNRVJCX0NNUDIgICAgKEhSVElNX0FEQzFSX0FEMVRCQzIpICAgIC8qITwgQURDIFRyaWdnZXIgb24gVGltZXIgQiBjb21wYXJlIDJVICovCisjZGVmaW5lIEhSVElNX0FEQ1RSSUdHRVJFVkVOVDEzX1RJTUVSQl9DTVAzICAgIChIUlRJTV9BREMxUl9BRDFUQkMzKSAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEIgY29tcGFyZSAzVSAqLworI2RlZmluZSBIUlRJTV9BRENUUklHR0VSRVZFTlQxM19USU1FUkJfQ01QNCAgICAoSFJUSU1fQURDMVJfQUQxVEJDNCkgICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBCIGNvbXBhcmUgNFUgKi8KKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUkVWRU5UMTNfVElNRVJCX1BFUklPRCAgKEhSVElNX0FEQzFSX0FEMVRCUEVSKSAgIC8qITwgQURDIFRyaWdnZXIgb24gVGltZXIgQiBwZXJpb2QgKi8KKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUkVWRU5UMTNfVElNRVJCX1JFU0VUICAgKEhSVElNX0FEQzFSX0FEMVRCUlNUKSAgIC8qITwgQURDIFRyaWdnZXIgb24gVGltZXIgQiByZXNldCAqLworI2RlZmluZSBIUlRJTV9BRENUUklHR0VSRVZFTlQxM19USU1FUkNfQ01QMiAgICAoSFJUSU1fQURDMVJfQUQxVENDMikgICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBDIGNvbXBhcmUgMlUgKi8KKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUkVWRU5UMTNfVElNRVJDX0NNUDMgICAgKEhSVElNX0FEQzFSX0FEMVRDQzMpICAgIC8qITwgQURDIFRyaWdnZXIgb24gVGltZXIgQyBjb21wYXJlIDNVICovCisjZGVmaW5lIEhSVElNX0FEQ1RSSUdHRVJFVkVOVDEzX1RJTUVSQ19DTVA0ICAgIChIUlRJTV9BREMxUl9BRDFUQ0M0KSAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEMgY29tcGFyZSA0VSAqLworI2RlZmluZSBIUlRJTV9BRENUUklHR0VSRVZFTlQxM19USU1FUkNfUEVSSU9EICAoSFJUSU1fQURDMVJfQUQxVENQRVIpICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBDIHBlcmlvZCAqLworI2RlZmluZSBIUlRJTV9BRENUUklHR0VSRVZFTlQxM19USU1FUkRfQ01QMiAgICAoSFJUSU1fQURDMVJfQUQxVERDMikgICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBEIGNvbXBhcmUgMlUgKi8KKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUkVWRU5UMTNfVElNRVJEX0NNUDMgICAgKEhSVElNX0FEQzFSX0FEMVREQzMpICAgIC8qITwgQURDIFRyaWdnZXIgb24gVGltZXIgRCBjb21wYXJlIDNVICovCisjZGVmaW5lIEhSVElNX0FEQ1RSSUdHRVJFVkVOVDEzX1RJTUVSRF9DTVA0ICAgIChIUlRJTV9BREMxUl9BRDFUREM0KSAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEQgY29tcGFyZSA0VSAqLworI2RlZmluZSBIUlRJTV9BRENUUklHR0VSRVZFTlQxM19USU1FUkRfUEVSSU9EICAoSFJUSU1fQURDMVJfQUQxVERQRVIpICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBEIHBlcmlvZCAqLworI2RlZmluZSBIUlRJTV9BRENUUklHR0VSRVZFTlQxM19USU1FUkVfQ01QMiAgICAoSFJUSU1fQURDMVJfQUQxVEVDMikgICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBFIGNvbXBhcmUgMlUgKi8KKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUkVWRU5UMTNfVElNRVJFX0NNUDMgICAgKEhSVElNX0FEQzFSX0FEMVRFQzMpICAgIC8qITwgQURDIFRyaWdnZXIgb24gVGltZXIgRSBjb21wYXJlIDNVICovCisjZGVmaW5lIEhSVElNX0FEQ1RSSUdHRVJFVkVOVDEzX1RJTUVSRV9DTVA0ICAgIChIUlRJTV9BREMxUl9BRDFURUM0KSAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEUgY29tcGFyZSA0VSAqLworI2RlZmluZSBIUlRJTV9BRENUUklHR0VSRVZFTlQxM19USU1FUkVfUEVSSU9EICAoSFJUSU1fQURDMVJfQUQxVEVQRVIpICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBFIHBlcmlvZCAqLworCisjZGVmaW5lIEhSVElNX0FEQ1RSSUdHRVJFVkVOVDI0X05PTkUgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgLyohPCBObyBBREMgdHJpZ2dlciBldmVudCAqLworI2RlZmluZSBIUlRJTV9BRENUUklHR0VSRVZFTlQyNF9NQVNURVJfQ01QMSAgICAoSFJUSU1fQURDMlJfQUQyTUMxKSAgICAgLyohPCBBREMgVHJpZ2dlciBvbiBtYXN0ZXIgY29tcGFyZSAxVSAqLworI2RlZmluZSBIUlRJTV9BRENUUklHR0VSRVZFTlQyNF9NQVNURVJfQ01QMiAgICAoSFJUSU1fQURDMlJfQUQyTUMyKSAgICAgLyohPCBBREMgVHJpZ2dlciBvbiBtYXN0ZXIgY29tcGFyZSAyVSAqLyAKKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUkVWRU5UMjRfTUFTVEVSX0NNUDMgICAgKEhSVElNX0FEQzJSX0FEMk1DMykgICAgIC8qITwgQURDIFRyaWdnZXIgb24gbWFzdGVyIGNvbXBhcmUgM1UgKi8KKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUkVWRU5UMjRfTUFTVEVSX0NNUDQgICAgKEhSVElNX0FEQzJSX0FEMk1DNCkgICAgIC8qITwgQURDIFRyaWdnZXIgb24gbWFzdGVyIGNvbXBhcmUgNFUgKi8KKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUkVWRU5UMjRfTUFTVEVSX1BFUklPRCAgKEhSVElNX0FEQzJSX0FEMk1QRVIpICAgIC8qITwgQURDIFRyaWdnZXIgb24gbWFzdGVyIHBlcmlvZCAqLworI2RlZmluZSBIUlRJTV9BRENUUklHR0VSRVZFTlQyNF9FVkVOVF82ICAgICAgICAoSFJUSU1fQURDMlJfQUQyRUVWNikgICAgLyohPCBBREMgVHJpZ2dlciBvbiBleHRlcm5hbCBldmVudCA2VSAqLworI2RlZmluZSBIUlRJTV9BRENUUklHR0VSRVZFTlQyNF9FVkVOVF83ICAgICAgICAoSFJUSU1fQURDMlJfQUQyRUVWNykgICAgLyohPCBBREMgVHJpZ2dlciBvbiBleHRlcm5hbCBldmVudCA3VSAqLworI2RlZmluZSBIUlRJTV9BRENUUklHR0VSRVZFTlQyNF9FVkVOVF84ICAgICAgICAoSFJUSU1fQURDMlJfQUQyRUVWOCkgICAgLyohPCBBREMgVHJpZ2dlciBvbiBleHRlcm5hbCBldmVudCA4VSAqLworI2RlZmluZSBIUlRJTV9BRENUUklHR0VSRVZFTlQyNF9FVkVOVF85ICAgICAgICAoSFJUSU1fQURDMlJfQUQyRUVWOSkgICAgLyohPCBBREMgVHJpZ2dlciBvbiBleHRlcm5hbCBldmVudCA5VSAqLyAKKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUkVWRU5UMjRfRVZFTlRfMTAgICAgICAgKEhSVElNX0FEQzJSX0FEMkVFVjEwKSAgIC8qITwgQURDIFRyaWdnZXIgb24gZXh0ZXJuYWwgZXZlbnQgMTBVICovCisjZGVmaW5lIEhSVElNX0FEQ1RSSUdHRVJFVkVOVDI0X1RJTUVSQV9DTVAyICAgIChIUlRJTV9BREMyUl9BRDJUQUMyKSAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEEgY29tcGFyZSAyVSAqLworI2RlZmluZSBIUlRJTV9BRENUUklHR0VSRVZFTlQyNF9USU1FUkFfQ01QMyAgICAoSFJUSU1fQURDMlJfQUQyVEFDMykgICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBBIGNvbXBhcmUgM1UgKi8KKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUkVWRU5UMjRfVElNRVJBX0NNUDQgICAgKEhSVElNX0FEQzJSX0FEMlRBQzQpICAgIC8qITwgQURDIFRyaWdnZXIgb24gVGltZXIgQSBjb21wYXJlIDRVICovCisjZGVmaW5lIEhSVElNX0FEQ1RSSUdHRVJFVkVOVDI0X1RJTUVSQV9QRVJJT0QgIChIUlRJTV9BREMyUl9BRDJUQVBFUikgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEEgcGVyaW9kICovCisjZGVmaW5lIEhSVElNX0FEQ1RSSUdHRVJFVkVOVDI0X1RJTUVSQl9DTVAyICAgIChIUlRJTV9BREMyUl9BRDJUQkMyKSAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEIgY29tcGFyZSAyVSAqLworI2RlZmluZSBIUlRJTV9BRENUUklHR0VSRVZFTlQyNF9USU1FUkJfQ01QMyAgICAoSFJUSU1fQURDMlJfQUQyVEJDMykgICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBCIGNvbXBhcmUgM1UgKi8KKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUkVWRU5UMjRfVElNRVJCX0NNUDQgICAgKEhSVElNX0FEQzJSX0FEMlRCQzQpICAgIC8qITwgQURDIFRyaWdnZXIgb24gVGltZXIgQiBjb21wYXJlIDRVICovCisjZGVmaW5lIEhSVElNX0FEQ1RSSUdHRVJFVkVOVDI0X1RJTUVSQl9QRVJJT0QgIChIUlRJTV9BREMyUl9BRDJUQlBFUikgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEIgcGVyaW9kICovCisjZGVmaW5lIEhSVElNX0FEQ1RSSUdHRVJFVkVOVDI0X1RJTUVSQ19DTVAyICAgIChIUlRJTV9BREMyUl9BRDJUQ0MyKSAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEMgY29tcGFyZSAyVSAqLworI2RlZmluZSBIUlRJTV9BRENUUklHR0VSRVZFTlQyNF9USU1FUkNfQ01QMyAgICAoSFJUSU1fQURDMlJfQUQyVENDMykgICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBDIGNvbXBhcmUgM1UgKi8KKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUkVWRU5UMjRfVElNRVJDX0NNUDQgICAgKEhSVElNX0FEQzJSX0FEMlRDQzQpICAgIC8qITwgQURDIFRyaWdnZXIgb24gVGltZXIgQyBjb21wYXJlIDRVICovCisjZGVmaW5lIEhSVElNX0FEQ1RSSUdHRVJFVkVOVDI0X1RJTUVSQ19QRVJJT0QgIChIUlRJTV9BREMyUl9BRDJUQ1BFUikgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEMgcGVyaW9kICovCisjZGVmaW5lIEhSVElNX0FEQ1RSSUdHRVJFVkVOVDI0X1RJTUVSQ19SRVNFVCAgIChIUlRJTV9BREMyUl9BRDJUQ1JTVCkgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEMgcmVzZXQgKi8KKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUkVWRU5UMjRfVElNRVJEX0NNUDIgICAgKEhSVElNX0FEQzJSX0FEMlREQzIpICAgIC8qITwgQURDIFRyaWdnZXIgb24gVGltZXIgRCBjb21wYXJlIDJVICovCisjZGVmaW5lIEhSVElNX0FEQ1RSSUdHRVJFVkVOVDI0X1RJTUVSRF9DTVAzICAgIChIUlRJTV9BREMyUl9BRDJUREMzKSAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEQgY29tcGFyZSAzVSAqLworI2RlZmluZSBIUlRJTV9BRENUUklHR0VSRVZFTlQyNF9USU1FUkRfQ01QNCAgICAoSFJUSU1fQURDMlJfQUQyVERDNCkgICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBEIGNvbXBhcmUgNFUgKi8KKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUkVWRU5UMjRfVElNRVJEX1BFUklPRCAgKEhSVElNX0FEQzJSX0FEMlREUEVSKSAgIC8qITwgQURDIFRyaWdnZXIgb24gVGltZXIgRCBwZXJpb2QgKi8KKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUkVWRU5UMjRfVElNRVJEX1JFU0VUICAgKEhSVElNX0FEQzJSX0FEMlREUlNUKSAgIC8qITwgQURDIFRyaWdnZXIgb24gVGltZXIgRCByZXNldCAqLworI2RlZmluZSBIUlRJTV9BRENUUklHR0VSRVZFTlQyNF9USU1FUkVfQ01QMiAgICAoSFJUSU1fQURDMlJfQUQyVEVDMikgICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBFIGNvbXBhcmUgMlUgKi8KKyNkZWZpbmUgSFJUSU1fQURDVFJJR0dFUkVWRU5UMjRfVElNRVJFX0NNUDMgICAgKEhSVElNX0FEQzJSX0FEMlRFQzMpICAgIC8qITwgQURDIFRyaWdnZXIgb24gVGltZXIgRSBjb21wYXJlIDNVICovCisjZGVmaW5lIEhSVElNX0FEQ1RSSUdHRVJFVkVOVDI0X1RJTUVSRV9DTVA0ICAgIChIUlRJTV9BREMyUl9BRDJURUM0KSAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEUgY29tcGFyZSA0VSAqLworI2RlZmluZSBIUlRJTV9BRENUUklHR0VSRVZFTlQyNF9USU1FUkVfUkVTRVQgICAoSFJUSU1fQURDMlJfQUQyVEVSU1QpICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBFIHJlc2V0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0RMTF9DYWxpYnJhdGlvbl9SYXRlIEhSVElNIERMTCBDYWxpYnJhdGlvbiBSYXRlCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRoZSBETEwgY2FsaWJyYXRpb24gcGVyaW9kcyAoaW4gbWljcm8gc2Vjb25kcykKKyAgKi8KKyNkZWZpbmUgSFJUSU1fU0lOR0xFX0NBTElCUkFUSU9OICAgIDB4RkZGRkZGRkZVICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBOb24gcGVyaW9kaWMgRExMIGNhbGlicmF0aW9uICovCisjZGVmaW5lIEhSVElNX0NBTElCUkFUSU9OUkFURV83MzAwICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUGVyaW9kaWMgRExMIGNhbGlicmF0aW9uOiBUID0gMTA0ODU3NlUgKiB0SFJUSU0gKDcuMyBtcykgKi8KKyNkZWZpbmUgSFJUSU1fQ0FMSUJSQVRJT05SQVRFXzkxMCAgIChIUlRJTV9ETExDUl9DQUxSVEVfMCkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQZXJpb2RpYyBETEwgY2FsaWJyYXRpb246IFQgPSAxMzEwNzJVICogdEhSVElNICg5MTAgbXMpICovCisjZGVmaW5lIEhSVElNX0NBTElCUkFUSU9OUkFURV8xMTQgICAoSFJUSU1fRExMQ1JfQ0FMUlRFXzEpICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUGVyaW9kaWMgRExMIGNhbGlicmF0aW9uOiBUID0gMTYzODRVICogdEhSVElNICgxMTQgbXMpICovCisjZGVmaW5lIEhSVElNX0NBTElCUkFUSU9OUkFURV8xNCAgICAoSFJUSU1fRExMQ1JfQ0FMUlRFXzEgfCBIUlRJTV9ETExDUl9DQUxSVEVfMCkgIC8qITwgUGVyaW9kaWMgRExMIGNhbGlicmF0aW9uOiBUID0gMjA0OFUgKiB0SFJUSU0gKDE0IG1zKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9CdXJzdF9ETUFfUmVnaXN0ZXJzX1VwZGF0ZSBIUlRJTSBCdXJzdCBETUEgUmVnaXN0ZXJzIFVwZGF0ZQorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB0aGUgcmVnaXN0ZXJzIHRoYXQgY2FuIGJlIHdyaXR0ZW4gZHVyaW5nIGEgYnVyc3QKKyAgKiAgICAgICAgRE1BIG9wZXJhdGlvbgorICAqLyAKKyNkZWZpbmUgSFJUSU1fQlVSU1RETUFfTk9ORSAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAvKiE8IE5vIHJlZ2lzdGVyIGlzIHVwZGF0ZWQgYnkgQnVyc3QgRE1BIGFjY2Vzc2VzICovCisjZGVmaW5lIEhSVElNX0JVUlNURE1BX0NSICAgIChIUlRJTV9CRFRVUFJfVElNQ1IpICAgICAgLyohPCBNQ1Igb3IgVElNeENSIHJlZ2lzdGVyIGlzIHVwZGF0ZWQgYnkgQnVyc3QgRE1BIGFjY2Vzc2VzICovCisjZGVmaW5lIEhSVElNX0JVUlNURE1BX0lDUiAgIChIUlRJTV9CRFRVUFJfVElNSUNSKSAgICAgLyohPCBNSUNSIG9yIFRJTXhJQ1IgcmVnaXN0ZXIgaXMgdXBkYXRlZCBieSBCdXJzdCBETUEgYWNjZXNzZXMgKi8KKyNkZWZpbmUgSFJUSU1fQlVSU1RETUFfRElFUiAgKEhSVElNX0JEVFVQUl9USU1ESUVSKSAgICAvKiE8IE1ESUVSIG9yIFRJTXhESUVSIHJlZ2lzdGVyIGlzIHVwZGF0ZWQgYnkgQnVyc3QgRE1BIGFjY2Vzc2VzICovCisjZGVmaW5lIEhSVElNX0JVUlNURE1BX0NOVCAgIChIUlRJTV9CRFRVUFJfVElNQ05UKSAgICAgLyohPCBNQ05UUiBvciBDTlR4Q1IgcmVnaXN0ZXIgaXMgdXBkYXRlZCBieSBCdXJzdCBETUEgYWNjZXNzZXMgKi8KKyNkZWZpbmUgSFJUSU1fQlVSU1RETUFfUEVSICAgKEhSVElNX0JEVFVQUl9USU1QRVIpICAgICAvKiE8IE1QRVIgb3IgUEVSeFIgcmVnaXN0ZXIgaXMgdXBkYXRlZCBieSBCdXJzdCBETUEgYWNjZXNzZXMgKi8KKyNkZWZpbmUgSFJUSU1fQlVSU1RETUFfUkVQICAgKEhSVElNX0JEVFVQUl9USU1SRVApICAgICAvKiE8IE1SRVBSIG9yIFJFUHhSIHJlZ2lzdGVyIGlzIHVwZGF0ZWQgYnkgQnVyc3QgRE1BIGFjY2Vzc2VzICovCisjZGVmaW5lIEhSVElNX0JVUlNURE1BX0NNUDEgIChIUlRJTV9CRFRVUFJfVElNQ01QMSkgICAgLyohPCBNQ01QMVIgb3IgQ01QMXhSIHJlZ2lzdGVyIGlzIHVwZGF0ZWQgYnkgQnVyc3QgRE1BIGFjY2Vzc2VzICovCisjZGVmaW5lIEhSVElNX0JVUlNURE1BX0NNUDIgIChIUlRJTV9CRFRVUFJfVElNQ01QMikgICAgLyohPCBNQ01QMlIgb3IgQ01QMnhSIHJlZ2lzdGVyIGlzIHVwZGF0ZWQgYnkgQnVyc3QgRE1BIGFjY2Vzc2VzICovCisjZGVmaW5lIEhSVElNX0JVUlNURE1BX0NNUDMgIChIUlRJTV9CRFRVUFJfVElNQ01QMykgICAgLyohPCBNQ01QM1Igb3IgQ01QM3hSIHJlZ2lzdGVyIGlzIHVwZGF0ZWQgYnkgQnVyc3QgRE1BIGFjY2Vzc2VzICovCisjZGVmaW5lIEhSVElNX0JVUlNURE1BX0NNUDQgIChIUlRJTV9CRFRVUFJfVElNQ01QNCkgICAgLyohPCBNQ01QNFIgb3IgQ01QNHhSIHJlZ2lzdGVyIGlzIHVwZGF0ZWQgYnkgQnVyc3QgRE1BIGFjY2Vzc2VzICovCisjZGVmaW5lIEhSVElNX0JVUlNURE1BX0RUUiAgIChIUlRJTV9CRFRVUFJfVElNRFRSKSAgICAgLyohPCBURHhSIHJlZ2lzdGVyIGlzIHVwZGF0ZWQgYnkgQnVyc3QgRE1BIGFjY2Vzc2VzICovCisjZGVmaW5lIEhSVElNX0JVUlNURE1BX1NFVDFSIChIUlRJTV9CRFRVUFJfVElNU0VUMVIpICAgLyohPCBTRVQxUiByZWdpc3RlciBpcyB1cGRhdGVkIGJ5IEJ1cnN0IERNQSBhY2Nlc3NlcyAqLworI2RlZmluZSBIUlRJTV9CVVJTVERNQV9SU1QxUiAoSFJUSU1fQkRUVVBSX1RJTVJTVDFSKSAgIC8qITwgUlNUMVIgcmVnaXN0ZXIgaXMgdXBkYXRlZCBieSBCdXJzdCBETUEgYWNjZXNzZXMgKi8KKyNkZWZpbmUgSFJUSU1fQlVSU1RETUFfU0VUMlIgKEhSVElNX0JEVFVQUl9USU1TRVQyUikgICAvKiE8IFNFVDJSIHJlZ2lzdGVyIGlzIHVwZGF0ZWQgYnkgQnVyc3QgRE1BIGFjY2Vzc2VzICovCisjZGVmaW5lIEhSVElNX0JVUlNURE1BX1JTVDJSIChIUlRJTV9CRFRVUFJfVElNUlNUMlIpICAgLyohPCBSU1QxUiByZWdpc3RlciBpcyB1cGRhdGVkIGJ5IEJ1cnN0IERNQSBhY2Nlc3NlcyAqLworI2RlZmluZSBIUlRJTV9CVVJTVERNQV9FRUZSMSAoSFJUSU1fQkRUVVBSX1RJTUVFRlIxKSAgIC8qITwgRUVGeFIxIHJlZ2lzdGVyIGlzIHVwZGF0ZWQgYnkgQnVyc3QgRE1BIGFjY2Vzc2VzICovCisjZGVmaW5lIEhSVElNX0JVUlNURE1BX0VFRlIyIChIUlRJTV9CRFRVUFJfVElNRUVGUjIpICAgLyohPCBFRUZ4UjIgcmVnaXN0ZXIgaXMgdXBkYXRlZCBieSBCdXJzdCBETUEgYWNjZXNzZXMgKi8KKyNkZWZpbmUgSFJUSU1fQlVSU1RETUFfUlNUUiAgKEhSVElNX0JEVFVQUl9USU1SU1RSKSAgICAvKiE8IFJTVHhSIHJlZ2lzdGVyIGlzIHVwZGF0ZWQgYnkgQnVyc3QgRE1BIGFjY2Vzc2VzICovCisjZGVmaW5lIEhSVElNX0JVUlNURE1BX0NIUFIgIChIUlRJTV9CRFRVUFJfVElNQ0hQUikgICAgLyohPCBDSFB4UiByZWdpc3RlciBpcyB1cGRhdGVkIGJ5IEJ1cnN0IERNQSBhY2Nlc3NlcyAqLworI2RlZmluZSBIUlRJTV9CVVJTVERNQV9PVVRSICAoSFJUSU1fQkRUVVBSX1RJTU9VVFIpICAgIC8qITwgT1VUeFIgcmVnaXN0ZXIgaXMgdXBkYXRlZCBieSBCdXJzdCBETUEgYWNjZXNzZXMgKi8KKyNkZWZpbmUgSFJUSU1fQlVSU1RETUFfRkxUUiAgKEhSVElNX0JEVFVQUl9USU1GTFRSKSAgICAvKiE8IEZMVHhSIHJlZ2lzdGVyIGlzIHVwZGF0ZWQgYnkgQnVyc3QgRE1BIGFjY2Vzc2VzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0J1cnN0X01vZGVfQ29udHJvbCBIUlRJTSBCdXJzdCBNb2RlIENvbnRyb2wKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgdXNlZCB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgYnVyc3QgbW9kZSBjb250cm9sbGVyCisgICovIAorI2RlZmluZSBIUlRJTV9CVVJTVE1PREVDVExfRElTQUJMRUQgMHgwMDAwMDAwMFUgICAgICAgICAgLyohPCBCdXJzdCBtb2RlIGRpc2FibGVkICovCisjZGVmaW5lIEhSVElNX0JVUlNUTU9ERUNUTF9FTkFCTEVEICAoSFJUSU1fQk1DUl9CTUUpICAgICAvKiE8IEJ1cnN0IG1vZGUgZW5hYmxlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9GYXVsdF9Nb2RlX0NvbnRyb2wgIEhSVElNIEZhdWx0IE1vZGUgQ29udHJvbAorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyB1c2VkIHRvIGVuYWJsZSBvciBkaXNhYmxlIGEgZmF1bHQgY2hhbm5lbAorICAqLyAKKyNkZWZpbmUgSFJUSU1fRkFVTFRNT0RFQ1RMX0RJU0FCTEVEIDB4MDAwMDAwMDBVIC8qITwgRmF1bHQgY2hhbm5lbCBpcyBkaXNhYmxlZCAqLworI2RlZmluZSBIUlRJTV9GQVVMVE1PREVDVExfRU5BQkxFRCAgMHgwMDAwMDAwMVUgLyohPCBGYXVsdCBjaGFubmVsIGlzICBlbmFibGVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX1NvZnR3YXJlX1RpbWVyX1VwZGF0ZSBIUlRJTSBTb2Z0d2FyZSBUaW1lciBVcGRhdGUKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgdXNlZCB0byBmb3JjZSB0aW1lciByZWdpc3RlcnMgdXBkYXRlCisgICovIAorI2RlZmluZSBIUlRJTV9USU1FUlVQREFURV9NQVNURVIgICAgKEhSVElNX0NSMl9NU1dVKSAgICAgLyohPCBGb3JjZXMgYW4gaW1tZWRpYXRlIHRyYW5zZmVyIGZyb20gdGhlIHByZWxvYWQgdG8gdGhlIGFjdGl2ZSByZWdpc3RlciBpbiB0aGUgbWFzdGVyIHRpbWVyICovCisjZGVmaW5lIEhSVElNX1RJTUVSVVBEQVRFX0EgICAgICAgICAoSFJUSU1fQ1IyX1RBU1dVKSAgICAvKiE8IEZvcmNlcyBhbiBpbW1lZGlhdGUgdHJhbnNmZXIgZnJvbSB0aGUgcHJlbG9hZCB0byB0aGUgYWN0aXZlIHJlZ2lzdGVyIGluIHRoZSB0aW1lciBBICovCisjZGVmaW5lIEhSVElNX1RJTUVSVVBEQVRFX0IgICAgICAgICAoSFJUSU1fQ1IyX1RCU1dVKSAgICAvKiE8IEZvcmNlcyBhbiBpbW1lZGlhdGUgdHJhbnNmZXIgZnJvbSB0aGUgcHJlbG9hZCB0byB0aGUgYWN0aXZlIHJlZ2lzdGVyIGluIHRoZSB0aW1lciBCICovCisjZGVmaW5lIEhSVElNX1RJTUVSVVBEQVRFX0MgICAgICAgICAoSFJUSU1fQ1IyX1RDU1dVKSAgICAvKiE8IEZvcmNlcyBhbiBpbW1lZGlhdGUgdHJhbnNmZXIgZnJvbSB0aGUgcHJlbG9hZCB0byB0aGUgYWN0aXZlIHJlZ2lzdGVyIGluIHRoZSB0aW1lciBDICovCisjZGVmaW5lIEhSVElNX1RJTUVSVVBEQVRFX0QgICAgICAgICAoSFJUSU1fQ1IyX1REU1dVKSAgICAvKiE8IEZvcmNlcyBhbiBpbW1lZGlhdGUgdHJhbnNmZXIgZnJvbSB0aGUgcHJlbG9hZCB0byB0aGUgYWN0aXZlIHJlZ2lzdGVyIGluIHRoZSB0aW1lciBEICovCisjZGVmaW5lIEhSVElNX1RJTUVSVVBEQVRFX0UgICAgICAgICAoSFJUSU1fQ1IyX1RFU1dVKSAgICAvKiE8IEZvcmNlcyBhbiBpbW1lZGlhdGUgdHJhbnNmZXIgZnJvbSB0aGUgcHJlbG9hZCB0byB0aGUgYWN0aXZlIHJlZ2lzdGVyIGluIHRoZSB0aW1lciBFICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX1NvZnR3YXJlX1RpbWVyX1Jlc2V0IEhSVElNIFNvZnR3YXJlIFRpbWVyIFJlc2V0CisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIHVzZWQgdG8gZm9yY2UgdGltZXIgY291bnRlciByZXNldAorICAqLyAKKyNkZWZpbmUgSFJUSU1fVElNRVJSRVNFVF9NQVNURVIgICAgKEhSVElNX0NSMl9NUlNUKSAgICAgLyohPCBSZXNldHMgdGhlIG1hc3RlciB0aW1lciBjb3VudGVyICovCisjZGVmaW5lIEhSVElNX1RJTUVSUkVTRVRfVElNRVJfQSAgIChIUlRJTV9DUjJfVEFSU1QpICAgIC8qITwgUmVzZXRzIHRoZSB0aW1lciBBIGNvdW50ZXIgKi8KKyNkZWZpbmUgSFJUSU1fVElNRVJSRVNFVF9USU1FUl9CICAgKEhSVElNX0NSMl9UQlJTVCkgICAgLyohPCBSZXNldHMgdGhlIHRpbWVyIEIgY291bnRlciAqLworI2RlZmluZSBIUlRJTV9USU1FUlJFU0VUX1RJTUVSX0MgICAoSFJUSU1fQ1IyX1RDUlNUKSAgICAvKiE8IFJlc2V0cyB0aGUgdGltZXIgQyBjb3VudGVyICovCisjZGVmaW5lIEhSVElNX1RJTUVSUkVTRVRfVElNRVJfRCAgIChIUlRJTV9DUjJfVERSU1QpICAgIC8qITwgUmVzZXRzIHRoZSB0aW1lciBEIGNvdW50ZXIgKi8KKyNkZWZpbmUgSFJUSU1fVElNRVJSRVNFVF9USU1FUl9FICAgKEhSVElNX0NSMl9URVJTVCkgICAgLyohPCBSZXNldHMgdGhlIHRpbWVyIEUgY291bnRlciAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9PdXRwdXRfTGV2ZWwgSFJUSU0gT3V0cHV0IExldmVsCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRoZSBsZXZlbCBvZiBhIHRpbWVyIG91dHB1dAorICAqLyAKKyNkZWZpbmUgSFJUSU1fT1VUUFVUTEVWRUxfQUNUSVZFICAgICAoMHgwMDAwMDAwMVUpIC8qITwgRm9yY2VzIHRoZSBvdXRwdXQgdG8gaXRzIGFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBIUlRJTV9PVVRQVVRMRVZFTF9JTkFDVElWRSAgICgweDAwMDAwMDAyVSkgLyohPCBGb3JjZXMgdGhlIG91dHB1dCB0byBpdHMgaW5hY3RpdmUgc3RhdGUgKi8KKyAgICAgIAorI2RlZmluZSBJU19IUlRJTV9PVVRQVVRMRVZFTChPVVRQVVRMRVZFTClcCisgICAgKCgoT1VUUFVUTEVWRUwpID09IEhSVElNX09VVFBVVExFVkVMX0FDVElWRSkgIHx8IFwKKyAgICAgKChPVVRQVVRMRVZFTCkgPT0gSFJUSU1fT1VUUFVUTEVWRUxfSU5BQ1RJVkUpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9PdXRwdXRfU3RhdGUgSFJUSU0gT3V0cHV0IFN0YXRlCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRoZSBzdGF0ZSBvZiBhIHRpbWVyIG91dHB1dAorICAqLyAKKyNkZWZpbmUgSFJUSU1fT1VUUFVUU1RBVEVfSURMRSAgICAgKDB4MDAwMDAwMDFVKSAgLyohPCBNYWluIG9wZXJhdGluZyBtb2RlLCB3aGVyZSB0aGUgb3V0cHV0IGNhbiB0YWtlIHRoZSBhY3RpdmUgb3IgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluYWN0aXZlIGxldmVsIGFzIHByb2dyYW1tZWQgaW4gdGhlIGNyb3NzYmFyIHVuaXQgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUU1RBVEVfUlVOICAgICAgKDB4MDAwMDAwMDJVKSAgLyohPCBEZWZhdWx0IG9wZXJhdGluZyBzdGF0ZSAoZS5nLiBhZnRlciBhbiBIUlRJTSByZXNldCwgd2hlbiB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHMgYXJlIGRpc2FibGVkIGJ5IHNvZnR3YXJlIG9yIGR1cmluZyBhIGJ1cnN0IG1vZGUgb3BlcmF0aW9uICovCisjZGVmaW5lIEhSVElNX09VVFBVVFNUQVRFX0ZBVUxUICAgICgweDAwMDAwMDAzVSkgIC8qITwgU2FmZXR5IHN0YXRlLCBlbnRlcmVkIGluIGNhc2Ugb2YgYSBzaHV0LWRvd24gcmVxdWVzdCBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVVMVHggaW5wdXRzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0J1cnN0X01vZGVfU3RhdHVzIEhSVElNIEJ1cnN0IE1vZGUgU3RhdHVzCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRoZSBvcGVyYXRpbmcgc3RhdGUgb2YgdGhlIGJ1cnN0IG1vZGUgY29udHJvbGxlcgorICAqLyAKKyNkZWZpbmUgSFJUSU1fQlVSU1RNT0RFU1RBVFVTX05PUk1BTCAgIDB4MDAwMDAwMDBVICAgICAgICAgIC8qITwgTm9ybWFsIG9wZXJhdGlvbiAqLworI2RlZmluZSBIUlRJTV9CVVJTVE1PREVTVEFUVVNfT05HT0lORyAoSFJUSU1fQk1DUl9CTVNUQVQpICAgLyohPCBCdXJzdCBvcGVyYXRpb24gb24tZ29pbmcgKi8KKy8qKgorICAqIEB9CisgICovCisgICAKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fQ3VycmVudF9QdXNoX1B1bGxfU3RhdHVzIEhSVElNIEN1cnJlbnQgUHVzaCBQdWxsIFN0YXR1cworICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyBvbiB3aGljaCBvdXRwdXQgdGhlIHNpZ25hbCBpcyBjdXJyZW50bHkgYXBwbGllZAorICAqICAgICAgICBpbiBwdXNoLXB1bGwgbW9kZQorICAqLyAKKyNkZWZpbmUgSFJUSU1fUFVTSFBVTExfQ1VSUkVOVFNUQVRVU19PVVRQVVQxICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgLyohPCBTaWduYWwgYXBwbGllZCBvbiBvdXRwdXQgMSBhbmQgb3V0cHV0IDIgZm9yY2VkIGluYWN0aXZlICovCisjZGVmaW5lIEhSVElNX1BVU0hQVUxMX0NVUlJFTlRTVEFUVVNfT1VUUFVUMiAgIChIUlRJTV9USU1JU1JfQ1BQU1RBVCkgIC8qITwgU2lnbmFsIGFwcGxpZWQgb24gb3V0cHV0IDIgYW5kIG91dHB1dCAxIGZvcmNlZCBpbmFjdGl2ZSAqLworLyoqCisgICogQH0KKyAgKi8KKyAgIAorLyoqIEBkZWZncm91cCBIUlRJTV9JZGxlX1B1c2hfUHVsbF9TdGF0dXMgSFJUSU0gSWRsZSBQdXNoIFB1bGwgU3RhdHVzCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIG9uIHdoaWNoIG91dHB1dCB0aGUgc2lnbmFsIHdhcyBhcHBsaWVkLCBpbiAKKyAgKiAgICAgICAgcHVzaC1wdWxsIG1vZGUgYmFsYW5jZWQgZmF1bHQgbW9kZSBvciBkZWxheWVkIGlkbGUgbW9kZSwgd2hlbiB0aGUgCisgICogICAgICAgIHByb3RlY3Rpb24gd2FzIHRyaWdnZXJlZAorICAqLyAKKyNkZWZpbmUgSFJUSU1fUFVTSFBVTExfSURMRVNUQVRVU19PVVRQVVQxICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgLyohPCBQcm90ZWN0aW9uIG9jY3VycmVkIHdoZW4gdGhlIG91dHB1dCAxIHdhcyBhY3RpdmUgYW5kIG91dHB1dCAyIGZvcmNlZCBpbmFjdGl2ZSAqLworI2RlZmluZSBIUlRJTV9QVVNIUFVMTF9JRExFU1RBVFVTX09VVFBVVDIgICAoSFJUSU1fVElNSVNSX0lQUFNUQVQpICAgICAvKiE8IFByb3RlY3Rpb24gb2NjdXJyZWQgd2hlbiB0aGUgb3V0cHV0IDIgd2FzIGFjdGl2ZSBhbmQgb3V0cHV0IDEgZm9yY2VkIGluYWN0aXZlICovCisvKioKKyAgKiBAfQorICAqLworICAgCisvKiogQGRlZmdyb3VwIEhSVElNX0NvbW1vbl9JbnRlcnJ1cHRfRW5hYmxlIEhSVElNIENvbW1vbiBJbnRlcnJ1cHQgRW5hYmxlCisgICogQHsKKyAgKi8gCisjZGVmaW5lIEhSVElNX0lUX05PTkUgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IE5vIGludGVycnVwdCBlbmFibGVkICovCisjZGVmaW5lIEhSVElNX0lUX0ZMVDEgICAgICAgICAgIEhSVElNX0lFUl9GTFQxICAgICAgICAvKiE8IEZhdWx0IDEgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBIUlRJTV9JVF9GTFQyICAgICAgICAgICBIUlRJTV9JRVJfRkxUMiAgICAgICAgLyohPCBGYXVsdCAyIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSFJUSU1fSVRfRkxUMyAgICAgICAgICAgSFJUSU1fSUVSX0ZMVDMgICAgICAgIC8qITwgRmF1bHQgMyBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIEhSVElNX0lUX0ZMVDQgICAgICAgICAgIEhSVElNX0lFUl9GTFQ0ICAgICAgICAvKiE8IEZhdWx0IDQgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBIUlRJTV9JVF9GTFQ1ICAgICAgICAgICBIUlRJTV9JRVJfRkxUNSAgICAgICAgLyohPCBGYXVsdCA1IGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSFJUSU1fSVRfU1lTRkxUICAgICAgICAgSFJUSU1fSUVSX1NZU0ZMVCAgICAgIC8qITwgU3lzdGVtIEZhdWx0IGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSFJUSU1fSVRfRExMUkRZICAgICAgICAgSFJUSU1fSUVSX0RMTFJEWSAgICAgIC8qITwgRExMIHJlYWR5IGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSFJUSU1fSVRfQk1QRVIgICAgICAgICAgSFJUSU1fSUVSX0JNUEVSICAgICAgIC8qITwgIEJ1cnN0IG1vZGUgcGVyaW9kIGludGVycnVwdCBlbmFibGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fTWFzdGVyX0ludGVycnVwdF9FbmFibGUgSFJUSU0gTWFzdGVyIEludGVycnVwdCBFbmFibGUKKyAgKiBAeworICAqLyAKKyNkZWZpbmUgSFJUSU1fTUFTVEVSX0lUX05PTkUgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBObyBpbnRlcnJ1cHQgZW5hYmxlZCAqLworI2RlZmluZSBIUlRJTV9NQVNURVJfSVRfTUNNUDEgICAgICAgIEhSVElNX01ESUVSX01DTVAxSUUgICAvKiE8IE1hc3RlciBjb21wYXJlIDEgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBIUlRJTV9NQVNURVJfSVRfTUNNUDIgICAgICAgIEhSVElNX01ESUVSX01DTVAySUUgICAvKiE8IE1hc3RlciBjb21wYXJlIDIgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBIUlRJTV9NQVNURVJfSVRfTUNNUDMgICAgICAgIEhSVElNX01ESUVSX01DTVAzSUUgICAvKiE8IE1hc3RlciBjb21wYXJlIDMgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBIUlRJTV9NQVNURVJfSVRfTUNNUDQgICAgICAgIEhSVElNX01ESUVSX01DTVA0SUUgICAvKiE8IE1hc3RlciBjb21wYXJlIDQgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBIUlRJTV9NQVNURVJfSVRfTVJFUCAgICAgICAgIEhSVElNX01ESUVSX01SRVBJRSAgICAvKiE8IE1hc3RlciBSZXBldGl0aW9uIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSFJUSU1fTUFTVEVSX0lUX1NZTkMgICAgICAgICBIUlRJTV9NRElFUl9TWU5DSUUgICAgLyohPCBTeW5jaHJvbml6YXRpb24gaW5wdXQgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBIUlRJTV9NQVNURVJfSVRfTVVQRCAgICAgICAgIEhSVElNX01ESUVSX01VUERJRSAgICAvKiE8IE1hc3RlciB1cGRhdGUgaW50ZXJydXB0IGVuYWJsZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9UaW1pbmdfVW5pdF9JbnRlcnJ1cHRfRW5hYmxlIEhSVElNIFRpbWluZyBVbml0IEludGVycnVwdCBFbmFibGUKKyAgKiBAeworICAqLyAKKyNkZWZpbmUgSFJUSU1fVElNX0lUX05PTkUgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAvKiE8IE5vIGludGVycnVwdCBlbmFibGVkICovCisjZGVmaW5lIEhSVElNX1RJTV9JVF9DTVAxICAgICAgIEhSVElNX1RJTURJRVJfQ01QMUlFICAgICAgLyohPCBUaW1lciBjb21wYXJlIDEgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBIUlRJTV9USU1fSVRfQ01QMiAgICAgICBIUlRJTV9USU1ESUVSX0NNUDJJRSAgICAgIC8qITwgVGltZXIgY29tcGFyZSAyIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSFJUSU1fVElNX0lUX0NNUDMgICAgICAgSFJUSU1fVElNRElFUl9DTVAzSUUgICAgICAvKiE8IFRpbWVyIGNvbXBhcmUgMyBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIEhSVElNX1RJTV9JVF9DTVA0ICAgICAgIEhSVElNX1RJTURJRVJfQ01QNElFICAgICAgLyohPCBUaW1lciBjb21wYXJlIDQgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBIUlRJTV9USU1fSVRfUkVQICAgICAgICBIUlRJTV9USU1ESUVSX1JFUElFICAgICAgIC8qITwgVGltZXIgcmVwZXRpdGlvbiBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIEhSVElNX1RJTV9JVF9VUEQgICAgICAgIEhSVElNX1RJTURJRVJfVVBESUUgICAgICAgLyohPCBUaW1lciB1cGRhdGUgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBIUlRJTV9USU1fSVRfQ1BUMSAgICAgICBIUlRJTV9USU1ESUVSX0NQVDFJRSAgICAgIC8qITwgVGltZXIgY2FwdHVyZSAxIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSFJUSU1fVElNX0lUX0NQVDIgICAgICAgSFJUSU1fVElNRElFUl9DUFQySUUgICAgICAvKiE8IFRpbWVyIGNhcHR1cmUgMiBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIEhSVElNX1RJTV9JVF9TRVQxICAgICAgIEhSVElNX1RJTURJRVJfU0VUMUlFICAgICAgLyohPCBUaW1lciBvdXRwdXQgMSBzZXQgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBIUlRJTV9USU1fSVRfUlNUMSAgICAgICBIUlRJTV9USU1ESUVSX1JTVDFJRSAgICAgIC8qITwgVGltZXIgb3V0cHV0IDEgcmVzZXQgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBIUlRJTV9USU1fSVRfU0VUMiAgICAgICBIUlRJTV9USU1ESUVSX1NFVDJJRSAgICAgIC8qITwgVGltZXIgb3V0cHV0IDIgc2V0IGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSFJUSU1fVElNX0lUX1JTVDIgICAgICAgSFJUSU1fVElNRElFUl9SU1QySUUgICAgICAvKiE8IFRpbWVyIG91dHB1dCAyIHJlc2V0IGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSFJUSU1fVElNX0lUX1JTVCAgICAgICAgSFJUSU1fVElNRElFUl9SU1RJRSAgICAgICAvKiE8IFRpbWVyIHJlc2V0IGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSFJUSU1fVElNX0lUX0RMWVBSVCAgICAgSFJUSU1fVElNRElFUl9ETFlQUlRJRSAgICAvKiE8IFRpbWVyIGRlbGF5IHByb3RlY3Rpb24gaW50ZXJydXB0IGVuYWJsZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9Db21tb25fSW50ZXJydXB0X0ZsYWcgSFJUSU0gQ29tbW9uIEludGVycnVwdCBGbGFnCisgICogQHsKKyAgKi8gCisjZGVmaW5lIEhSVElNX0ZMQUdfRkxUMSAgICAgICAgICAgSFJUSU1fSVNSX0ZMVDEgICAgLyohPCBGYXVsdCAxIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIEhSVElNX0ZMQUdfRkxUMiAgICAgICAgICAgSFJUSU1fSVNSX0ZMVDIgICAgLyohPCBGYXVsdCAyIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIEhSVElNX0ZMQUdfRkxUMyAgICAgICAgICAgSFJUSU1fSVNSX0ZMVDMgICAgLyohPCBGYXVsdCAzIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIEhSVElNX0ZMQUdfRkxUNCAgICAgICAgICAgSFJUSU1fSVNSX0ZMVDQgICAgLyohPCBGYXVsdCA0IGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIEhSVElNX0ZMQUdfRkxUNSAgICAgICAgICAgSFJUSU1fSVNSX0ZMVDUgICAgLyohPCBGYXVsdCA1IGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIEhSVElNX0ZMQUdfU1lTRkxUICAgICAgICAgSFJUSU1fSVNSX1NZU0ZMVCAgLyohPCBTeXN0ZW0gRmF1bHQgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgSFJUSU1fRkxBR19ETExSRFkgICAgICAgICBIUlRJTV9JU1JfRExMUkRZICAvKiE8IERMTCByZWFkeSBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBIUlRJTV9GTEFHX0JNUEVSICAgICAgICAgIEhSVElNX0lTUl9CTVBFUiAgIC8qITwgQnVyc3QgbW9kZSBwZXJpb2QgaW50ZXJydXB0IGZsYWcgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fTWFzdGVyX0ludGVycnVwdF9GbGFnIEhSVElNIE1hc3RlciBJbnRlcnJ1cHQgRmxhZworICAqIEB7CisgICovIAorI2RlZmluZSBIUlRJTV9NQVNURVJfRkxBR19NQ01QMSAgICAgICAgSFJUSU1fTUlTUl9NQ01QMSAgICAvKiE8IE1hc3RlciBjb21wYXJlIDEgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgSFJUSU1fTUFTVEVSX0ZMQUdfTUNNUDIgICAgICAgIEhSVElNX01JU1JfTUNNUDIgICAgLyohPCBNYXN0ZXIgY29tcGFyZSAyIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIEhSVElNX01BU1RFUl9GTEFHX01DTVAzICAgICAgICBIUlRJTV9NSVNSX01DTVAzICAgIC8qITwgTWFzdGVyIGNvbXBhcmUgMyBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBIUlRJTV9NQVNURVJfRkxBR19NQ01QNCAgICAgICAgSFJUSU1fTUlTUl9NQ01QNCAgICAvKiE8IE1hc3RlciBjb21wYXJlIDQgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgSFJUSU1fTUFTVEVSX0ZMQUdfTVJFUCAgICAgICAgIEhSVElNX01JU1JfTVJFUCAgICAgLyohPCBNYXN0ZXIgUmVwZXRpdGlvbiBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBIUlRJTV9NQVNURVJfRkxBR19TWU5DICAgICAgICAgSFJUSU1fTUlTUl9TWU5DICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBpbnB1dCBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBIUlRJTV9NQVNURVJfRkxBR19NVVBEICAgICAgICAgSFJUSU1fTUlTUl9NVVBEICAgICAvKiE8IE1hc3RlciB1cGRhdGUgaW50ZXJydXB0IGZsYWcgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fVGltaW5nX1VuaXRfSW50ZXJydXB0X0ZsYWcgSFJUSU0gVGltaW5nIFVuaXQgSW50ZXJydXB0IEZsYWcKKyAgKiBAeworICAqLyAKKyNkZWZpbmUgSFJUSU1fVElNX0ZMQUdfQ01QMSAgICAgICBIUlRJTV9USU1JU1JfQ01QMSAgICAgIC8qITwgVGltZXIgY29tcGFyZSAxIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIEhSVElNX1RJTV9GTEFHX0NNUDIgICAgICAgSFJUSU1fVElNSVNSX0NNUDIgICAgICAvKiE8IFRpbWVyIGNvbXBhcmUgMiBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBIUlRJTV9USU1fRkxBR19DTVAzICAgICAgIEhSVElNX1RJTUlTUl9DTVAzICAgICAgLyohPCBUaW1lciBjb21wYXJlIDMgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgSFJUSU1fVElNX0ZMQUdfQ01QNCAgICAgICBIUlRJTV9USU1JU1JfQ01QNCAgICAgIC8qITwgVGltZXIgY29tcGFyZSA0IGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIEhSVElNX1RJTV9GTEFHX1JFUCAgICAgICAgSFJUSU1fVElNSVNSX1JFUCAgICAgICAvKiE8IFRpbWVyIHJlcGV0aXRpb24gaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgSFJUSU1fVElNX0ZMQUdfVVBEICAgICAgICBIUlRJTV9USU1JU1JfVVBEICAgICAgIC8qITwgVGltZXIgdXBkYXRlIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIEhSVElNX1RJTV9GTEFHX0NQVDEgICAgICAgSFJUSU1fVElNSVNSX0NQVDEgICAgICAvKiE8IFRpbWVyIGNhcHR1cmUgMSBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBIUlRJTV9USU1fRkxBR19DUFQyICAgICAgIEhSVElNX1RJTUlTUl9DUFQyICAgICAgLyohPCBUaW1lciBjYXB0dXJlIDIgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgSFJUSU1fVElNX0ZMQUdfU0VUMSAgICAgICBIUlRJTV9USU1JU1JfU0VUMSAgICAgIC8qITwgVGltZXIgb3V0cHV0IDEgc2V0IGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIEhSVElNX1RJTV9GTEFHX1JTVDEgICAgICAgSFJUSU1fVElNSVNSX1JTVDEgICAgICAvKiE8IFRpbWVyIG91dHB1dCAxIHJlc2V0IGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIEhSVElNX1RJTV9GTEFHX1NFVDIgICAgICAgSFJUSU1fVElNSVNSX1NFVDIgICAgICAvKiE8IFRpbWVyIG91dHB1dCAyIHNldCBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBIUlRJTV9USU1fRkxBR19SU1QyICAgICAgIEhSVElNX1RJTUlTUl9SU1QyICAgICAgLyohPCBUaW1lciBvdXRwdXQgMiByZXNldCBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBIUlRJTV9USU1fRkxBR19SU1QgICAgICAgIEhSVElNX1RJTUlTUl9SU1QgICAgICAgLyohPCBUaW1lciByZXNldCBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBIUlRJTV9USU1fRkxBR19ETFlQUlQgICAgIEhSVElNX1RJTUlTUl9ETFlQUlQgICAgLyohPCBUaW1lciBkZWxheSBwcm90ZWN0aW9uIGludGVycnVwdCBmbGFnICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX01hc3Rlcl9ETUFfUmVxdWVzdF9FbmFibGUgSFJUSU0gTWFzdGVyIERNQSBSZXF1ZXN0IEVuYWJsZQorICAqIEB7CisgICovIAorI2RlZmluZSBIUlRJTV9NQVNURVJfRE1BX05PTkUgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgIC8qITwgTm8gRE1BIHJlcXVlc3QgZW5hYmxlICovCisjZGVmaW5lIEhSVElNX01BU1RFUl9ETUFfTUNNUDEgICAgICAgIEhSVElNX01ESUVSX01DTVAxREUgICAgLyohPCBNYXN0ZXIgY29tcGFyZSAxIERNQSByZXF1ZXN0IGVuYWJsZSAqLworI2RlZmluZSBIUlRJTV9NQVNURVJfRE1BX01DTVAyICAgICAgICBIUlRJTV9NRElFUl9NQ01QMkRFICAgIC8qITwgTWFzdGVyIGNvbXBhcmUgMiBETUEgcmVxdWVzdCBlbmFibGUgKi8KKyNkZWZpbmUgSFJUSU1fTUFTVEVSX0RNQV9NQ01QMyAgICAgICAgSFJUSU1fTURJRVJfTUNNUDNERSAgICAvKiE8IE1hc3RlciBjb21wYXJlIDMgRE1BIHJlcXVlc3QgZW5hYmxlICovCisjZGVmaW5lIEhSVElNX01BU1RFUl9ETUFfTUNNUDQgICAgICAgIEhSVElNX01ESUVSX01DTVA0REUgICAgLyohPCBNYXN0ZXIgY29tcGFyZSA0IERNQSByZXF1ZXN0IGVuYWJsZSAqLworI2RlZmluZSBIUlRJTV9NQVNURVJfRE1BX01SRVAgICAgICAgICBIUlRJTV9NRElFUl9NUkVQREUgICAgIC8qITwgTWFzdGVyIFJlcGV0aXRpb24gRE1BIHJlcXVlc3QgZW5hYmxlICovCisjZGVmaW5lIEhSVElNX01BU1RFUl9ETUFfU1lOQyAgICAgICAgIEhSVElNX01ESUVSX1NZTkNERSAgICAgLyohPCBTeW5jaHJvbml6YXRpb24gaW5wdXQgRE1BIHJlcXVlc3QgZW5hYmxlICovCisjZGVmaW5lIEhSVElNX01BU1RFUl9ETUFfTVVQRCAgICAgICAgIEhSVElNX01ESUVSX01VUERERSAgICAgLyohPCBNYXN0ZXIgdXBkYXRlIERNQSByZXF1ZXN0IGVuYWJsZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9UaW1pbmdfVW5pdF9ETUFfUmVxdWVzdF9FbmFibGUgSFJUSU0gVGltaW5nIFVuaXQgRE1BIFJlcXVlc3QgRW5hYmxlCisgICogQHsKKyAgKi8gCisjZGVmaW5lIEhSVElNX1RJTV9ETUFfTk9ORSAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgIC8qITwgTm8gRE1BIHJlcXVlc3QgZW5hYmxlICovCisjZGVmaW5lIEhSVElNX1RJTV9ETUFfQ01QMSAgICAgICBIUlRJTV9USU1ESUVSX0NNUDFERSAgICAgIC8qITwgVGltZXIgY29tcGFyZSAxIERNQSByZXF1ZXN0IGVuYWJsZSAqLworI2RlZmluZSBIUlRJTV9USU1fRE1BX0NNUDIgICAgICAgSFJUSU1fVElNRElFUl9DTVAyREUgICAgICAvKiE8IFRpbWVyIGNvbXBhcmUgMiBETUEgcmVxdWVzdCBlbmFibGUgKi8KKyNkZWZpbmUgSFJUSU1fVElNX0RNQV9DTVAzICAgICAgIEhSVElNX1RJTURJRVJfQ01QM0RFICAgICAgLyohPCBUaW1lciBjb21wYXJlIDMgRE1BIHJlcXVlc3QgZW5hYmxlICovCisjZGVmaW5lIEhSVElNX1RJTV9ETUFfQ01QNCAgICAgICBIUlRJTV9USU1ESUVSX0NNUDRERSAgICAgIC8qITwgVGltZXIgY29tcGFyZSA0IERNQSByZXF1ZXN0IGVuYWJsZSAqLworI2RlZmluZSBIUlRJTV9USU1fRE1BX1JFUCAgICAgICAgSFJUSU1fVElNRElFUl9SRVBERSAgICAgICAvKiE8IFRpbWVyIHJlcGV0aXRpb24gRE1BIHJlcXVlc3QgZW5hYmxlICovCisjZGVmaW5lIEhSVElNX1RJTV9ETUFfVVBEICAgICAgICBIUlRJTV9USU1ESUVSX1VQRERFICAgICAgIC8qITwgVGltZXIgdXBkYXRlIERNQSByZXF1ZXN0IGVuYWJsZSAqLworI2RlZmluZSBIUlRJTV9USU1fRE1BX0NQVDEgICAgICAgSFJUSU1fVElNRElFUl9DUFQxREUgICAgICAvKiE8IFRpbWVyIGNhcHR1cmUgMSBETUEgcmVxdWVzdCBlbmFibGUgKi8KKyNkZWZpbmUgSFJUSU1fVElNX0RNQV9DUFQyICAgICAgIEhSVElNX1RJTURJRVJfQ1BUMkRFICAgICAgLyohPCBUaW1lciBjYXB0dXJlIDIgRE1BIHJlcXVlc3QgZW5hYmxlICovCisjZGVmaW5lIEhSVElNX1RJTV9ETUFfU0VUMSAgICAgICBIUlRJTV9USU1ESUVSX1NFVDFERSAgICAgIC8qITwgVGltZXIgb3V0cHV0IDEgc2V0IERNQSByZXF1ZXN0IGVuYWJsZSAqLworI2RlZmluZSBIUlRJTV9USU1fRE1BX1JTVDEgICAgICAgSFJUSU1fVElNRElFUl9SU1QxREUgICAgICAvKiE8IFRpbWVyIG91dHB1dCAxIHJlc2V0IERNQSByZXF1ZXN0IGVuYWJsZSAqLworI2RlZmluZSBIUlRJTV9USU1fRE1BX1NFVDIgICAgICAgSFJUSU1fVElNRElFUl9TRVQyREUgICAgICAvKiE8IFRpbWVyIG91dHB1dCAyIHNldCBETUEgcmVxdWVzdCBlbmFibGUgKi8KKyNkZWZpbmUgSFJUSU1fVElNX0RNQV9SU1QyICAgICAgIEhSVElNX1RJTURJRVJfUlNUMkRFICAgICAgLyohPCBUaW1lciBvdXRwdXQgMiByZXNldCBETUEgcmVxdWVzdCBlbmFibGUgKi8KKyNkZWZpbmUgSFJUSU1fVElNX0RNQV9SU1QgICAgICAgIEhSVElNX1RJTURJRVJfUlNUREUgICAgICAgLyohPCBUaW1lciByZXNldCBETUEgcmVxdWVzdCBlbmFibGUgKi8KKyNkZWZpbmUgSFJUSU1fVElNX0RNQV9ETFlQUlQgICAgIEhSVElNX1RJTURJRVJfRExZUFJUREUgICAgLyohPCBUaW1lciBkZWxheSBwcm90ZWN0aW9uIERNQSByZXF1ZXN0IGVuYWJsZSAqLworLyoqCisgICogQH0KKyAgKi8KKyAgICAgICAgICAgICAgICAKKy8qKgorICAqIEB9CisgICovIAorICAKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBIUlRJTV9Qcml2YXRlX01hY3JvcyBIUlRJTSBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisjZGVmaW5lIElTX0hSVElNX1RJTUVSSU5ERVgoVElNRVJJTkRFWClcCisgICAgKCgoVElNRVJJTkRFWCkgPT0gSFJUSU1fVElNRVJJTkRFWF9NQVNURVIpICAgfHwgXAorICAgICAoKFRJTUVSSU5ERVgpID09IEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSkgIHx8IFwKKyAgICAgKChUSU1FUklOREVYKSA9PSBIUlRJTV9USU1FUklOREVYX1RJTUVSX0IpICB8fCBcCisgICAgICgoVElNRVJJTkRFWCkgPT0gSFJUSU1fVElNRVJJTkRFWF9USU1FUl9DKSAgfHwgXAorICAgICAoKFRJTUVSSU5ERVgpID09IEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCkgIHx8IFwKKyAgICAgKChUSU1FUklOREVYKSA9PSBIUlRJTV9USU1FUklOREVYX1RJTUVSX0UpKQorCisjZGVmaW5lIElTX0hSVElNX1RJTUlOR19VTklUKFRJTUVSSU5ERVgpXAorICAgICAoKChUSU1FUklOREVYKSA9PSBIUlRJTV9USU1FUklOREVYX1RJTUVSX0EpICB8fCBcCisgICAgICAoKFRJTUVSSU5ERVgpID09IEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQikgIHx8IFwKKyAgICAgICgoVElNRVJJTkRFWCkgPT0gSFJUSU1fVElNRVJJTkRFWF9USU1FUl9DKSAgfHwgXAorICAgICAgKChUSU1FUklOREVYKSA9PSBIUlRJTV9USU1FUklOREVYX1RJTUVSX0QpICB8fCBcCisgICAgICAoKFRJTUVSSU5ERVgpID09IEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRSkpCisKKyNkZWZpbmUgSVNfSFJUSU1fVElNRVJJRChUSU1FUklEKSAoKChUSU1FUklEKSAmIDB4RkZDMEZGRkZVKSA9PSAweDAwMDAwMDAwVSkKKworI2RlZmluZSBJU19IUlRJTV9DT01QQVJFVU5JVChDT01QQVJFVU5JVClcCisgICAgKCgoQ09NUEFSRVVOSVQpID09IEhSVElNX0NPTVBBUkVVTklUXzEpICB8fCBcCisgICAgICgoQ09NUEFSRVVOSVQpID09IEhSVElNX0NPTVBBUkVVTklUXzIpICB8fCBcCisgICAgICgoQ09NUEFSRVVOSVQpID09IEhSVElNX0NPTVBBUkVVTklUXzMpICB8fCBcCisgICAgICgoQ09NUEFSRVVOSVQpID09IEhSVElNX0NPTVBBUkVVTklUXzQpKQorCisjZGVmaW5lIElTX0hSVElNX0NBUFRVUkVVTklUKENBUFRVUkVVTklUKVwKKyAgICAoKChDQVBUVVJFVU5JVCkgPT0gSFJUSU1fQ0FQVFVSRVVOSVRfMSkgICB8fCBcCisgICAgICgoQ0FQVFVSRVVOSVQpID09IEhSVElNX0NBUFRVUkVVTklUXzIpKQorCisjZGVmaW5lIElTX0hSVElNX09VVFBVVChPVVRQVVQpICgoKE9VVFBVVCkgJiAweEZGRkZGQzAwVSkgPT0gMHgwMDAwMDAwMFUpCisKKyNkZWZpbmUgSVNfSFJUSU1fVElNRVJfT1VUUFVUKFRJTUVSLCBPVVRQVVQpXAorICAgICgoKChUSU1FUikgPT0gSFJUSU1fVElNRVJJTkRFWF9USU1FUl9BKSAmJiAgIFwKKyAgICAgKCgoT1VUUFVUKSA9PSBIUlRJTV9PVVRQVVRfVEExKSB8fCAgICAgICAgICBcCisgICAgICAoKE9VVFBVVCkgPT0gSFJUSU1fT1VUUFVUX1RBMikpKSAgICAgICAgICAgXAorICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChUSU1FUikgPT0gSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CKSAmJiAgICBcCisgICAgICgoKE9VVFBVVCkgPT0gSFJUSU1fT1VUUFVUX1RCMSkgfHwgICAgICAgICAgXAorICAgICAgKChPVVRQVVQpID09IEhSVElNX09VVFBVVF9UQjIpKSkgICAgICAgICAgIFwKKyAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoVElNRVIpID09IEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQykgJiYgICAgXAorICAgICAoKChPVVRQVVQpID09IEhSVElNX09VVFBVVF9UQzEpIHx8ICAgICAgICAgIFwKKyAgICAgICgoT1VUUFVUKSA9PSBIUlRJTV9PVVRQVVRfVEMyKSkpICAgICAgICAgICBcCisgICAgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKFRJTUVSKSA9PSBIUlRJTV9USU1FUklOREVYX1RJTUVSX0QpICYmICAgIFwKKyAgICAgKCgoT1VUUFVUKSA9PSBIUlRJTV9PVVRQVVRfVEQxKSB8fCAgICAgICAgICBcCisgICAgICAoKE9VVFBVVCkgPT0gSFJUSU1fT1VUUFVUX1REMikpKSAgICAgICAgICAgXAorICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChUSU1FUikgPT0gSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FKSAmJiAgICBcCisgICAgICgoKE9VVFBVVCkgPT0gSFJUSU1fT1VUUFVUX1RFMSkgfHwgICAgICAgICAgXAorICAgICAgKChPVVRQVVQpID09IEhSVElNX09VVFBVVF9URTIpKSkpCisKKyNkZWZpbmUgSVNfSFJUSU1fRVZFTlQoRVZFTlQpXAorICAgICAgKCgoRVZFTlQpID09IEhSVElNX0VWRU5UX05PTkUpfHwgXAorICAgICAgICgoRVZFTlQpID09IEhSVElNX0VWRU5UXzEpICAgfHwgXAorICAgICAgICgoRVZFTlQpID09IEhSVElNX0VWRU5UXzIpICAgfHwgXAorICAgICAgICgoRVZFTlQpID09IEhSVElNX0VWRU5UXzMpICAgfHwgXAorICAgICAgICgoRVZFTlQpID09IEhSVElNX0VWRU5UXzQpICAgfHwgXAorICAgICAgICgoRVZFTlQpID09IEhSVElNX0VWRU5UXzUpICAgfHwgXAorICAgICAgICgoRVZFTlQpID09IEhSVElNX0VWRU5UXzYpICAgfHwgXAorICAgICAgICgoRVZFTlQpID09IEhSVElNX0VWRU5UXzcpICAgfHwgXAorICAgICAgICgoRVZFTlQpID09IEhSVElNX0VWRU5UXzgpICAgfHwgXAorICAgICAgICgoRVZFTlQpID09IEhSVElNX0VWRU5UXzkpICAgfHwgXAorICAgICAgICgoRVZFTlQpID09IEhSVElNX0VWRU5UXzEwKSkKKworI2RlZmluZSBJU19IUlRJTV9GQVVMVChGQVVMVClcCisgICAgICAoKChGQVVMVCkgPT0gSFJUSU1fRkFVTFRfMSkgICB8fCBcCisgICAgICAgKChGQVVMVCkgPT0gSFJUSU1fRkFVTFRfMikgICB8fCBcCisgICAgICAgKChGQVVMVCkgPT0gSFJUSU1fRkFVTFRfMykgICB8fCBcCisgICAgICAgKChGQVVMVCkgPT0gSFJUSU1fRkFVTFRfNCkgICB8fCBcCisgICAgICAgKChGQVVMVCkgPT0gSFJUSU1fRkFVTFRfNSkpCisKKyNkZWZpbmUgSVNfSFJUSU1fUFJFU0NBTEVSUkFUSU8oUFJFU0NBTEVSUkFUSU8pXAorICAgICAgICAoKChQUkVTQ0FMRVJSQVRJTykgPT0gSFJUSU1fUFJFU0NBTEVSUkFUSU9fTVVMMzIpIHx8IFwKKyAgICAgICAgICgoUFJFU0NBTEVSUkFUSU8pID09IEhSVElNX1BSRVNDQUxFUlJBVElPX01VTDE2KSB8fCBcCisgICAgICAgICAoKFBSRVNDQUxFUlJBVElPKSA9PSBIUlRJTV9QUkVTQ0FMRVJSQVRJT19NVUw4KSAgfHwgXAorICAgICAgICAgKChQUkVTQ0FMRVJSQVRJTykgPT0gSFJUSU1fUFJFU0NBTEVSUkFUSU9fTVVMNCkgIHx8IFwKKyAgICAgICAgICgoUFJFU0NBTEVSUkFUSU8pID09IEhSVElNX1BSRVNDQUxFUlJBVElPX01VTDIpICB8fCBcCisgICAgICAgICAoKFBSRVNDQUxFUlJBVElPKSA9PSBIUlRJTV9QUkVTQ0FMRVJSQVRJT19ESVYxKSAgfHwgXAorICAgICAgICAgKChQUkVTQ0FMRVJSQVRJTykgPT0gSFJUSU1fUFJFU0NBTEVSUkFUSU9fRElWMikgIHx8IFwKKyAgICAgICAgICgoUFJFU0NBTEVSUkFUSU8pID09IEhSVElNX1BSRVNDQUxFUlJBVElPX0RJVjQpKSAgICAgICAgCisKKyNkZWZpbmUgSVNfSFJUSU1fTU9ERShNT0RFKVwKKyAgICAgICAgICAoKChNT0RFKSA9PSBIUlRJTV9NT0RFX0NPTlRJTlVPVVMpICB8fCAgXAorICAgICAgICAgICAoKE1PREUpID09IEhSVElNX01PREVfU0lOR0xFU0hPVCkgfHwgXAorICAgICAgICAgICAoKE1PREUpID09IEhSVElNX01PREVfU0lOR0xFU0hPVF9SRVRSSUdHRVJBQkxFKSkKKyAgICAgICAgICAgIAorI2RlZmluZSBJU19IUlRJTV9NT0RFX09ORVBVTFNFKE1PREUpXAorICAgICAgICAgICgoKE1PREUpID09IEhSVElNX01PREVfU0lOR0xFU0hPVCkgfHwgXAorICAgICAgICAgICAoKE1PREUpID09IEhSVElNX01PREVfU0lOR0xFU0hPVF9SRVRSSUdHRVJBQkxFKSkKKyAgICAgICAgICAgIAorCisjZGVmaW5lIElTX0hSVElNX0hBTEZNT0RFKEhBTEZNT0RFKVwKKyAgICAgICAgICAgICgoKEhBTEZNT0RFKSA9PSBIUlRJTV9IQUxGTU9ERV9ESVNBQkxFRCkgIHx8ICBcCisgICAgICAgICAgICAgKChIQUxGTU9ERSkgPT0gSFJUSU1fSEFMRk1PREVfRU5BQkxFRCkpCisKKyNkZWZpbmUgSVNfSFJUSU1fU1lOQ1NUQVJUKFNZTkNTVEFSVClcCisgICAgICAgICAgICAgICgoKFNZTkNTVEFSVCkgPT0gSFJUSU1fU1lOQ1NUQVJUX0RJU0FCTEVEKSAgfHwgIFwKKyAgICAgICAgICAgICAgICgoU1lOQ1NUQVJUKSA9PSBIUlRJTV9TWU5DU1RBUlRfRU5BQkxFRCkpCisKKyNkZWZpbmUgSVNfSFJUSU1fU1lOQ1JFU0VUKFNZTkNSRVNFVClcCisgICAgICAgICAgICAgICAgKCgoU1lOQ1JFU0VUKSA9PSBIUlRJTV9TWU5DUkVTRVRfRElTQUJMRUQpICB8fCAgXAorICAgICAgICAgICAgICAgICAoKFNZTkNSRVNFVCkgPT0gSFJUSU1fU1lOQ1JFU0VUX0VOQUJMRUQpKQorCisjZGVmaW5lIElTX0hSVElNX0RBQ1NZTkMoREFDU1lOQylcCisgICAgICAgICAgICAgICAgKCgoREFDU1lOQykgPT0gSFJUSU1fREFDU1lOQ19OT05FKSAgICAgICAgICB8fCAgXAorICAgICAgICAgICAgICAgICAoKERBQ1NZTkMpID09IEhSVElNX0RBQ1NZTkNfREFDVFJJR09VVF8xKSAgfHwgIFwKKyAgICAgICAgICAgICAgICAgKChEQUNTWU5DKSA9PSBIUlRJTV9EQUNTWU5DX0RBQ1RSSUdPVVRfMikgIHx8ICBcCisgICAgICAgICAgICAgICAgICgoREFDU1lOQykgPT0gSFJUSU1fREFDU1lOQ19EQUNUUklHT1VUXzMpKQorCisjZGVmaW5lIElTX0hSVElNX1BSRUxPQUQoUFJFTE9BRClcCisgICAgICAgICAgICAgICAgKCgoUFJFTE9BRCkgPT0gSFJUSU1fUFJFTE9BRF9ESVNBQkxFRCkgIHx8ICBcCisgICAgICAgICAgICAgICAgICgoUFJFTE9BRCkgPT0gSFJUSU1fUFJFTE9BRF9FTkFCTEVEKSkKKworI2RlZmluZSBJU19IUlRJTV9VUERBVEVHQVRJTkdfTUFTVEVSKFVQREFURUdBVElORylcCisgICAgICAgICAgICAgICAgKCgoVVBEQVRFR0FUSU5HKSA9PSBIUlRJTV9VUERBVEVHQVRJTkdfSU5ERVBFTkRFTlQpICAgICAgfHwgIFwKKyAgICAgICAgICAgICAgICAgKChVUERBVEVHQVRJTkcpID09IEhSVElNX1VQREFURUdBVElOR19ETUFCVVJTVCkgICAgICAgICB8fCAgXAorICAgICAgICAgICAgICAgICAoKFVQREFURUdBVElORykgPT0gSFJUSU1fVVBEQVRFR0FUSU5HX0RNQUJVUlNUX1VQREFURSkpCisgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgSVNfSFJUSU1fVVBEQVRFR0FUSU5HX1RJTShVUERBVEVHQVRJTkcpXAorICAgICAgICAgICAgICAgICgoKFVQREFURUdBVElORykgPT0gSFJUSU1fVVBEQVRFR0FUSU5HX0lOREVQRU5ERU5UKSAgICAgIHx8ICBcCisgICAgICAgICAgICAgICAgICgoVVBEQVRFR0FUSU5HKSA9PSBIUlRJTV9VUERBVEVHQVRJTkdfRE1BQlVSU1QpICAgICAgICAgfHwgIFwKKyAgICAgICAgICAgICAgICAgKChVUERBVEVHQVRJTkcpID09IEhSVElNX1VQREFURUdBVElOR19ETUFCVVJTVF9VUERBVEUpICB8fCAgXAorICAgICAgICAgICAgICAgICAoKFVQREFURUdBVElORykgPT0gSFJUSU1fVVBEQVRFR0FUSU5HX1VQREVOMSkgICAgICAgICAgIHx8ICBcCisgICAgICAgICAgICAgICAgICgoVVBEQVRFR0FUSU5HKSA9PSBIUlRJTV9VUERBVEVHQVRJTkdfVVBERU4yKSAgICAgICAgICAgfHwgIFwKKyAgICAgICAgICAgICAgICAgKChVUERBVEVHQVRJTkcpID09IEhSVElNX1VQREFURUdBVElOR19VUERFTjMpICAgICAgICAgICB8fCAgXAorICAgICAgICAgICAgICAgICAoKFVQREFURUdBVElORykgPT0gSFJUSU1fVVBEQVRFR0FUSU5HX1VQREVOMV9VUERBVEUpICAgIHx8ICBcCisgICAgICAgICAgICAgICAgICgoVVBEQVRFR0FUSU5HKSA9PSBIUlRJTV9VUERBVEVHQVRJTkdfVVBERU4yX1VQREFURSkgICAgfHwgIFwKKyAgICAgICAgICAgICAgICAgKChVUERBVEVHQVRJTkcpID09IEhSVElNX1VQREFURUdBVElOR19VUERFTjNfVVBEQVRFKSkgICAgICAgICAgICAgICAgICAKKworI2RlZmluZSBJU19IUlRJTV9USU1FUkJVUlNUTU9ERShNT0RFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKCgoTU9ERSkgPT0gSFJUSU1fVElNRVJCVVJTVE1PREVfTUFJTlRBSU5DTE9DSykgIHx8IFwKKyAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBIUlRJTV9USU1FUkJVUlNUTU9ERV9SRVNFVENPVU5URVIpKQorI2RlZmluZSBJU19IUlRJTV9VUERBVEVPTlJFUEVUSVRJT04oVVBEQVRFT05SRVBFVElUSU9OKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKCgoVVBEQVRFT05SRVBFVElUSU9OKSA9PSBIUlRJTV9VUERBVEVPTlJFUEVUSVRJT05fRElTQUJMRUQpICB8fCBcCisgICAgICAgICAgICAgICAgICgoVVBEQVRFT05SRVBFVElUSU9OKSA9PSBIUlRJTV9VUERBVEVPTlJFUEVUSVRJT05fRU5BQkxFRCkpCisKKyNkZWZpbmUgSVNfSFJUSU1fVElNUFVTSFBVTExNT0RFKFRJTVBVU0hQVUxMTU9ERSlcCisgICAgICAgICAgICAgICAgICAoKChUSU1QVVNIUFVMTE1PREUpID09IEhSVElNX1RJTVBVU0hQVUxMTU9ERV9ESVNBQkxFRCkgfHwgXAorICAgICAgICAgICAgICAgICAgICgoVElNUFVTSFBVTExNT0RFKSA9PSBIUlRJTV9USU1QVVNIUFVMTE1PREVfRU5BQkxFRCkpCisjZGVmaW5lIElTX0hSVElNX1RJTUZBVUxURU5BQkxFKFRJTUZBVUxURU5BQkxFKSAoKChUSU1GQVVMVEVOQUJMRSkgJiAweEZGRkZGRkUwVSkgPT0gMHgwMDAwMDAwMFUpCisKKyNkZWZpbmUgSVNfSFJUSU1fVElNRkFVTFRMT0NLKFRJTUZBVUxUTE9DSylcCisgICAgICAoKChUSU1GQVVMVExPQ0spID09IEhSVElNX1RJTUZBVUxUTE9DS19SRUFEV1JJVEUpIHx8IFwKKyAgICAgICAoKFRJTUZBVUxUTE9DSykgPT0gSFJUSU1fVElNRkFVTFRMT0NLX1JFQURPTkxZKSkKKworI2RlZmluZSBJU19IUlRJTV9USU1ERUFEVElNRUlOU0VSVElPTihUSU1QVVNIUFVMTE1PREUsIFRJTURFQURUSU1FSU5TRVJUSU9OKVwKKyAgICAoKCgoVElNUFVTSFBVTExNT0RFKSA9PSBIUlRJTV9USU1QVVNIUFVMTE1PREVfRElTQUJMRUQpICYmICAgICAgICAgICAgICAgXAorICAgICAgICAoKCgoVElNREVBRFRJTUVJTlNFUlRJT04pID09IEhSVElNX1RJTURFQURUSU1FSU5TRVJUSU9OX0RJU0FCTEVEKSB8fCBcCisgICAgICAgICAgKChUSU1ERUFEVElNRUlOU0VSVElPTikgPT0gSFJUSU1fVElNREVBRFRJTUVJTlNFUlRJT05fRU5BQkxFRCkpKSkgIFwKKyAgICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKChUSU1QVVNIUFVMTE1PREUpID09IEhSVElNX1RJTVBVU0hQVUxMTU9ERV9FTkFCTEVEKSAmJiAgICAgICAgICAgICBcCisgICAgICAgICAoKFRJTURFQURUSU1FSU5TRVJUSU9OKSA9PSBIUlRJTV9USU1ERUFEVElNRUlOU0VSVElPTl9ESVNBQkxFRCkpKQorCisjZGVmaW5lIElTX0hSVElNX1RJTURFTEFZRURQUk9URUNUSU9OKFRJTVBVU0hQVUxMTU9ERSwgVElNREVMQVlFRFBST1RFQ1RJT04pXAorICAgICAgICAgICgoKChUSU1ERUxBWUVEUFJPVEVDVElPTikgPT0gSFJUSU1fVElNRVJfQV9CX0NfREVMQVlFRFBST1RFQ1RJT05fRElTQUJMRUQpICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICgoVElNREVMQVlFRFBST1RFQ1RJT04pID09IEhSVElNX1RJTUVSX0FfQl9DX0RFTEFZRURQUk9URUNUSU9OX0RFTEFZRURPVVQxX0VFVjYpICB8fCBcCisgICAgICAgICAgICAoKFRJTURFTEFZRURQUk9URUNUSU9OKSA9PSBIUlRJTV9USU1FUl9BX0JfQ19ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVET1VUMl9FRVY2KSAgfHwgXAorICAgICAgICAgICAgKChUSU1ERUxBWUVEUFJPVEVDVElPTikgPT0gSFJUSU1fVElNRVJfQV9CX0NfREVMQVlFRFBST1RFQ1RJT05fREVMQVlFREJPVEhfRUVWNikgIHx8IFwKKyAgICAgICAgICAgICgoVElNREVMQVlFRFBST1RFQ1RJT04pID09IEhSVElNX1RJTUVSX0FfQl9DX0RFTEFZRURQUk9URUNUSU9OX0RFTEFZRURPVVQxX0RFRVY3KSB8fCBcCisgICAgICAgICAgICAoKFRJTURFTEFZRURQUk9URUNUSU9OKSA9PSBIUlRJTV9USU1FUl9BX0JfQ19ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVET1VUMl9ERUVWNykgfHwgXAorICAgICAgICAgICAgKChUSU1ERUxBWUVEUFJPVEVDVElPTikgPT0gSFJUSU1fVElNRVJfQV9CX0NfREVMQVlFRFBST1RFQ1RJT05fREVMQVlFREJPVEhfRUVWNykpICAgIFwKKyAgICAgICAgICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKCgoVElNUFVTSFBVTExNT0RFKSA9PSAgSFJUSU1fVElNUFVTSFBVTExNT0RFX0VOQUJMRUQpICYmICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKCgoVElNREVMQVlFRFBST1RFQ1RJT04pID09IEhSVElNX1RJTUVSX0FfQl9DX0RFTEFZRURQUk9URUNUSU9OX0JBTEFOQ0VEX0VFVjYpICAgICB8fCBcCisgICAgICAgICAgICAgKChUSU1ERUxBWUVEUFJPVEVDVElPTikgPT0gSFJUSU1fVElNRVJfQV9CX0NfREVMQVlFRFBST1RFQ1RJT05fQkFMQU5DRURfRUVWNykpKSkKKworI2RlZmluZSBJU19IUlRJTV9USU1VUERBVEVUUklHR0VSKFRJTVVQREFURVRSSUdHRVIpICgoKFRJTVVQREFURVRSSUdHRVIpICYgMHhGRTA3RkZGRlUpID09IDB4MDAwMDAwMDBVKQorCisjZGVmaW5lIElTX0hSVElNX1RJTVJFU0VUVFJJR0dFUihUSU1SRVNFVFRSSUdHRVIpICgoKFRJTVJFU0VUVFJJR0dFUikgJiAweDgwMDAwMDAxVSkgPT0gMHgwMDAwMDAwMFUpCisKKyNkZWZpbmUgSVNfSFJUSU1fQURDVFJJR0dFUihBRENUUklHR0VSKVwKKyAgICAoKChBRENUUklHR0VSKSA9PSBIUlRJTV9BRENUUklHR0VSXzEpICAgfHwgXAorICAgICAoKEFEQ1RSSUdHRVIpID09IEhSVElNX0FEQ1RSSUdHRVJfMikgICB8fCBcCisgICAgICgoQURDVFJJR0dFUikgPT0gSFJUSU1fQURDVFJJR0dFUl8zKSAgIHx8IFwKKyAgICAgKChBRENUUklHR0VSKSA9PSBIUlRJTV9BRENUUklHR0VSXzQpKQorIAorI2RlZmluZSBJU19IUlRJTV9PVVRQVVRMRVZFTChPVVRQVVRMRVZFTClcCisgICAgKCgoT1VUUFVUTEVWRUwpID09IEhSVElNX09VVFBVVExFVkVMX0FDVElWRSkgIHx8IFwKKyAgICAgKChPVVRQVVRMRVZFTCkgPT0gSFJUSU1fT1VUUFVUTEVWRUxfSU5BQ1RJVkUpKQorCisjZGVmaW5lIElTX0hSVElNX0JBU0lDT0NNT0RFKEJBU0lDT0NNT0RFKVwKKyAgICAgICAgICAgICAgKCgoQkFTSUNPQ01PREUpID09IEhSVElNX0JBU0lDT0NNT0RFX1RPR0dMRSkgICB8fCBcCisgICAgICAgICAgICAgICAoKEJBU0lDT0NNT0RFKSA9PSBIUlRJTV9CQVNJQ09DTU9ERV9JTkFDVElWRSkgfHwgXAorICAgICAgICAgICAgICAgKChCQVNJQ09DTU9ERSkgPT0gSFJUSU1fQkFTSUNPQ01PREVfQUNUSVZFKSkKKworCisjZGVmaW5lIElTX0hSVElNX1RJTVVQREFURU9OUkVTRVQoVElNVVBEQVRFT05SRVNFVCkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKCgoVElNVVBEQVRFT05SRVNFVCkgPT0gSFJUSU1fVElNVVBEQVRFT05SRVNFVF9ESVNBQkxFRCkgfHwgXAorICAgICAgICAgICAgICAgKChUSU1VUERBVEVPTlJFU0VUKSA9PSBIUlRJTV9USU1VUERBVEVPTlJFU0VUX0VOQUJMRUQpKQorICAgICAgICAgCisjZGVmaW5lIElTX0hSVElNX0FVVE9ERUxBWUVETU9ERShBVVRPREVMQVlFRE1PREUpXAorICAgICAgICAgICAgICAoKChBVVRPREVMQVlFRE1PREUpID09IEhSVElNX0FVVE9ERUxBWUVETU9ERV9SRUdVTEFSKSAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICgoQVVUT0RFTEFZRURNT0RFKSA9PSBIUlRJTV9BVVRPREVMQVlFRE1PREVfQVVUT0RFTEFZRURfTk9USU1FT1VUKSAgICB8fCBcCisgICAgICAgICAgICAgICAoKEFVVE9ERUxBWUVETU9ERSkgPT0gSFJUSU1fQVVUT0RFTEFZRURNT0RFX0FVVE9ERUxBWUVEX1RJTUVPVVRDTVAxKSAgfHwgXAorICAgICAgICAgICAgICAgKChBVVRPREVMQVlFRE1PREUpID09IEhSVElNX0FVVE9ERUxBWUVETU9ERV9BVVRPREVMQVlFRF9USU1FT1VUQ01QMykpCisKKy8qIEF1dG8gZGVsYXllZCBtb2RlIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBjb21wYXJlIHVuaXRzIDIgYW5kIDRVICovCisjZGVmaW5lIElTX0hSVElNX0NPTVBBUkVVTklUX0FVVE9ERUxBWUVETU9ERShDT01QQVJFVU5JVCwgQVVUT0RFTEFZRURNT0RFKSAgICAgXAorICAgICgoKChDT01QQVJFVU5JVCkgPT0gSFJUSU1fQ09NUEFSRVVOSVRfMikgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoKEFVVE9ERUxBWUVETU9ERSkgPT0gSFJUSU1fQVVUT0RFTEFZRURNT0RFX1JFR1VMQVIpICAgICAgICAgICAgICAgICB8fCAgXAorICAgICAgKChBVVRPREVMQVlFRE1PREUpID09IEhSVElNX0FVVE9ERUxBWUVETU9ERV9BVVRPREVMQVlFRF9OT1RJTUVPVVQpICAgfHwgIFwKKyAgICAgICgoQVVUT0RFTEFZRURNT0RFKSA9PSBIUlRJTV9BVVRPREVMQVlFRE1PREVfQVVUT0RFTEFZRURfVElNRU9VVENNUDEpIHx8ICBcCisgICAgICAoKEFVVE9ERUxBWUVETU9ERSkgPT0gSFJUSU1fQVVUT0RFTEFZRURNT0RFX0FVVE9ERUxBWUVEX1RJTUVPVVRDTVAzKSkpICAgXAorICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChDT01QQVJFVU5JVCkgPT0gSFJUSU1fQ09NUEFSRVVOSVRfNCkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoKEFVVE9ERUxBWUVETU9ERSkgPT0gSFJUSU1fQVVUT0RFTEFZRURNT0RFX1JFR1VMQVIpICAgICAgICAgICAgICAgICB8fCAgXAorICAgICAgKChBVVRPREVMQVlFRE1PREUpID09IEhSVElNX0FVVE9ERUxBWUVETU9ERV9BVVRPREVMQVlFRF9OT1RJTUVPVVQpICAgfHwgIFwKKyAgICAgICgoQVVUT0RFTEFZRURNT0RFKSA9PSBIUlRJTV9BVVRPREVMQVlFRE1PREVfQVVUT0RFTEFZRURfVElNRU9VVENNUDEpIHx8ICBcCisgICAgICAoKEFVVE9ERUxBWUVETU9ERSkgPT0gSFJUSU1fQVVUT0RFTEFZRURNT0RFX0FVVE9ERUxBWUVEX1RJTUVPVVRDTVAzKSkpKQorCisjZGVmaW5lIElTX0hSVElNX09VVFBVVFBPTEFSSVRZKE9VVFBVVFBPTEFSSVRZKVwKKyAgICAgICAgICAgICAgKCgoT1VUUFVUUE9MQVJJVFkpID09IEhSVElNX09VVFBVVFBPTEFSSVRZX0hJR0gpIHx8IFwKKyAgICAgICAgICAgICAgICgoT1VUUFVUUE9MQVJJVFkpID09IEhSVElNX09VVFBVVFBPTEFSSVRZX0xPVykpCisKKyNkZWZpbmUgSVNfSFJUSU1fT1VUUFVUU0VUKE9VVFBVVFNFVClcCisgICAgICAgICAgICAgICgoKE9VVFBVVFNFVCkgPT0gSFJUSU1fT1VUUFVUU0VUX05PTkUpICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICgoT1VUUFVUU0VUKSA9PSBIUlRJTV9PVVRQVVRTRVRfUkVTWU5DKSAgICAgfHwgXAorICAgICAgICAgICAgICAgKChPVVRQVVRTRVQpID09IEhSVElNX09VVFBVVFNFVF9USU1QRVIpICAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFNFVCkgPT0gSFJUSU1fT1VUUFVUU0VUX1RJTUNNUDEpICAgIHx8IFwKKyAgICAgICAgICAgICAgICgoT1VUUFVUU0VUKSA9PSBIUlRJTV9PVVRQVVRTRVRfVElNQ01QMikgICAgfHwgXAorICAgICAgICAgICAgICAgKChPVVRQVVRTRVQpID09IEhSVElNX09VVFBVVFNFVF9USU1DTVAzKSAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFNFVCkgPT0gSFJUSU1fT1VUUFVUU0VUX1RJTUNNUDQpICAgIHx8IFwKKyAgICAgICAgICAgICAgICgoT1VUUFVUU0VUKSA9PSBIUlRJTV9PVVRQVVRTRVRfTUFTVEVSUEVSKSAgfHwgXAorICAgICAgICAgICAgICAgKChPVVRQVVRTRVQpID09IEhSVElNX09VVFBVVFNFVF9NQVNURVJDTVAxKSB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFNFVCkgPT0gSFJUSU1fT1VUUFVUU0VUX01BU1RFUkNNUDIpIHx8IFwKKyAgICAgICAgICAgICAgICgoT1VUUFVUU0VUKSA9PSBIUlRJTV9PVVRQVVRTRVRfTUFTVEVSQ01QMykgfHwgXAorICAgICAgICAgICAgICAgKChPVVRQVVRTRVQpID09IEhSVElNX09VVFBVVFNFVF9NQVNURVJDTVA0KSB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFNFVCkgPT0gSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzEpICAgIHx8IFwKKyAgICAgICAgICAgICAgICgoT1VUUFVUU0VUKSA9PSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfMikgICAgfHwgXAorICAgICAgICAgICAgICAgKChPVVRQVVRTRVQpID09IEhSVElNX09VVFBVVFNFVF9USU1FVl8zKSAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFNFVCkgPT0gSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzQpICAgIHx8IFwKKyAgICAgICAgICAgICAgICgoT1VUUFVUU0VUKSA9PSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNSkgICAgfHwgXAorICAgICAgICAgICAgICAgKChPVVRQVVRTRVQpID09IEhSVElNX09VVFBVVFNFVF9USU1FVl82KSAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFNFVCkgPT0gSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzcpICAgIHx8IFwKKyAgICAgICAgICAgICAgICgoT1VUUFVUU0VUKSA9PSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfOCkgICAgfHwgXAorICAgICAgICAgICAgICAgKChPVVRQVVRTRVQpID09IEhSVElNX09VVFBVVFNFVF9USU1FVl85KSAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFNFVCkgPT0gSFJUSU1fT1VUUFVUU0VUX0VFVl8xKSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICgoT1VUUFVUU0VUKSA9PSBIUlRJTV9PVVRQVVRTRVRfRUVWXzIpICAgICAgfHwgXAorICAgICAgICAgICAgICAgKChPVVRQVVRTRVQpID09IEhSVElNX09VVFBVVFNFVF9FRVZfMykgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFNFVCkgPT0gSFJUSU1fT1VUUFVUU0VUX0VFVl80KSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICgoT1VUUFVUU0VUKSA9PSBIUlRJTV9PVVRQVVRTRVRfRUVWXzUpICAgICAgfHwgXAorICAgICAgICAgICAgICAgKChPVVRQVVRTRVQpID09IEhSVElNX09VVFBVVFNFVF9FRVZfNikgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFNFVCkgPT0gSFJUSU1fT1VUUFVUU0VUX0VFVl83KSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICgoT1VUUFVUU0VUKSA9PSBIUlRJTV9PVVRQVVRTRVRfRUVWXzgpICAgICAgfHwgXAorICAgICAgICAgICAgICAgKChPVVRQVVRTRVQpID09IEhSVElNX09VVFBVVFNFVF9FRVZfOSkgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFNFVCkgPT0gSFJUSU1fT1VUUFVUU0VUX0VFVl8xMCkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICgoT1VUUFVUU0VUKSA9PSBIUlRJTV9PVVRQVVRTRVRfVVBEQVRFKSkKKworI2RlZmluZSBJU19IUlRJTV9PVVRQVVRSRVNFVChPVVRQVVRSRVNFVClcCisgICAgICAgICAgICAgICgoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9OT05FKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9SRVNZTkMpICAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9USU1QRVIpICAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9USU1DTVAxKSAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9USU1DTVAyKSAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9USU1DTVAzKSAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9USU1DTVA0KSAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9NQVNURVJQRVIpICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9NQVNURVJDTVAxKSB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9NQVNURVJDTVAyKSB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9NQVNURVJDTVAzKSB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9NQVNURVJDTVA0KSB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9USU1FVl8xKSAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9USU1FVl8yKSAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9USU1FVl8zKSAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9USU1FVl80KSAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9USU1FVl81KSAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9USU1FVl82KSAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9USU1FVl83KSAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9USU1FVl84KSAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9USU1FVl85KSAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9FRVZfMSkgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9FRVZfMikgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9FRVZfMykgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9FRVZfNCkgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9FRVZfNSkgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9FRVZfNikgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9FRVZfNykgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9FRVZfOCkgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9FRVZfOSkgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9FRVZfMTApICAgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVFJFU0VUKSA9PSBIUlRJTV9PVVRQVVRSRVNFVF9VUERBVEUpKSAgCisgICAgICAgICAgICAgIAorI2RlZmluZSBJU19IUlRJTV9PVVRQVVRJRExFTU9ERShPVVRQVVRJRExFTU9ERSlcCisgICAgICAgICAgICAgICgoKE9VVFBVVElETEVNT0RFKSA9PSBIUlRJTV9PVVRQVVRJRExFTU9ERV9OT05FKSB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVElETEVNT0RFKSA9PSBIUlRJTV9PVVRQVVRJRExFTU9ERV9JRExFKSkKKyAgICAgICAgICAgICAgCisjZGVmaW5lIElTX0hSVElNX09VVFBVVElETEVMRVZFTChPVVRQVVRJRExFTEVWRUwpXAorICAgICAgICAgICAgICAoKChPVVRQVVRJRExFTEVWRUwpID09IEhSVElNX09VVFBVVElETEVMRVZFTF9JTkFDVElWRSkgfHwgXAorICAgICAgICAgICAgICAgKChPVVRQVVRJRExFTEVWRUwpID09IEhSVElNX09VVFBVVElETEVMRVZFTF9BQ1RJVkUpKQorICAgICAgICAgICAgICAKKyNkZWZpbmUgSVNfSFJUSU1fT1VUUFVURkFVTFRMRVZFTChPVVRQVVRGQVVMVExFVkVMKVwKKyAgICAgICAgICAgICAgKCgoT1VUUFVURkFVTFRMRVZFTCkgPT0gSFJUSU1fT1VUUFVURkFVTFRMRVZFTF9OT05FKSAgICAgfHwgXAorICAgICAgICAgICAgICAgKChPVVRQVVRGQVVMVExFVkVMKSA9PSBIUlRJTV9PVVRQVVRGQVVMVExFVkVMX0FDVElWRSkgICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVEZBVUxUTEVWRUwpID09IEhSVElNX09VVFBVVEZBVUxUTEVWRUxfSU5BQ1RJVkUpIHx8IFwKKyAgICAgICAgICAgICAgICgoT1VUUFVURkFVTFRMRVZFTCkgPT0gSFJUSU1fT1VUUFVURkFVTFRMRVZFTF9ISUdIWikpCisKKyNkZWZpbmUgSVNfSFJUSU1fT1VUUFVUQ0hPUFBFUk1PREUoT1VUUFVUQ0hPUFBFUk1PREUpXAorICAgICAgICAgICAgICAoKChPVVRQVVRDSE9QUEVSTU9ERSkgPT0gSFJUSU1fT1VUUFVUQ0hPUFBFUk1PREVfRElTQUJMRUQpICB8fCBcCisgICAgICAgICAgICAgICAoKE9VVFBVVENIT1BQRVJNT0RFKSA9PSBIUlRJTV9PVVRQVVRDSE9QUEVSTU9ERV9FTkFCTEVEKSkKKworI2RlZmluZSBJU19IUlRJTV9PVVRQVVRCVVJTVE1PREVFTlRSWShPVVRQVVRCVVJTVE1PREVFTlRSWSlcCisgICAgICAgICAgICAgICgoKE9VVFBVVEJVUlNUTU9ERUVOVFJZKSA9PSBIUlRJTV9PVVRQVVRCVVJTVE1PREVFTlRSWV9SRUdVTEFSKSAgfHwgXAorICAgICAgICAgICAgICAgKChPVVRQVVRCVVJTVE1PREVFTlRSWSkgPT0gSFJUSU1fT1VUUFVUQlVSU1RNT0RFRU5UUllfREVMQVlFRCkpCisKKworI2RlZmluZSBJU19IUlRJTV9USU1FUl9DQVBUVVJFVFJJR0dFUihUSU1FUiwgQ0FQVFVSRVRSSUdHRVIpICAgIFwKKyAgICgoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9OT05FKSAgICAgICAgICB8fCBcCisgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9VUERBVEUpICAgICAgICAgfHwgXAorICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfRUVWXzEpICAgICAgICAgIHx8IFwKKyAgICgoQ0FQVFVSRVRSSUdHRVIpID09IEhSVElNX0NBUFRVUkVUUklHR0VSX0VFVl8yKSAgICAgICAgICB8fCBcCisgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9FRVZfMykgICAgICAgICAgfHwgXAorICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfRUVWXzQpICAgICAgICAgIHx8IFwKKyAgICgoQ0FQVFVSRVRSSUdHRVIpID09IEhSVElNX0NBUFRVUkVUUklHR0VSX0VFVl81KSAgICAgICAgICB8fCBcCisgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9FRVZfNikgICAgICAgICAgfHwgXAorICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfRUVWXzcpICAgICAgICAgIHx8IFwKKyAgICgoQ0FQVFVSRVRSSUdHRVIpID09IEhSVElNX0NBUFRVUkVUUklHR0VSX0VFVl84KSAgICAgICAgICB8fCBcCisgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9FRVZfOSkgICAgICAgICAgfHwgXAorICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfRUVWXzEwKSAgICAgICAgICAgIFwKKyAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKChUSU1FUikgPT0gSFJUSU1fVElNRVJJTkRFWF9USU1FUl9BKSAmJiAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVEIxX1NFVCkgICAgIHx8IFwKKyAgICAgICgoQ0FQVFVSRVRSSUdHRVIpID09IEhSVElNX0NBUFRVUkVUUklHR0VSX1RCMV9SRVNFVCkgICB8fCBcCisgICAgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9USU1FUkJfQ01QMSkgfHwgXAorICAgICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVElNRVJCX0NNUDIpIHx8IFwKKyAgICAgICgoQ0FQVFVSRVRSSUdHRVIpID09IEhSVElNX0NBUFRVUkVUUklHR0VSX1RDMV9TRVQpICAgICB8fCBcCisgICAgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9UQzFfUkVTRVQpICAgfHwgXAorICAgICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVElNRVJDX0NNUDEpIHx8IFwKKyAgICAgICgoQ0FQVFVSRVRSSUdHRVIpID09IEhSVElNX0NBUFRVUkVUUklHR0VSX1RJTUVSQ19DTVAyKSB8fCBcCisgICAgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9URDFfU0VUKSAgICAgfHwgXAorICAgICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVEQxX1JFU0VUKSAgIHx8IFwKKyAgICAgICgoQ0FQVFVSRVRSSUdHRVIpID09IEhSVElNX0NBUFRVUkVUUklHR0VSX1RJTUVSRF9DTVAxKSB8fCBcCisgICAgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9USU1FUkRfQ01QMikgfHwgXAorICAgICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVEUxX1NFVCkgICAgIHx8IFwKKyAgICAgICgoQ0FQVFVSRVRSSUdHRVIpID09IEhSVElNX0NBUFRVUkVUUklHR0VSX1RFMV9SRVNFVCkgICB8fCBcCisgICAgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9USU1FUkVfQ01QMSkgfHwgXAorICAgICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVElNRVJFX0NNUDIpKSkgIFwKKyAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKChUSU1FUikgPT0gSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CKSAmJiAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVEExX1NFVCkgICAgIHx8IFwKKyAgICAgICgoQ0FQVFVSRVRSSUdHRVIpID09IEhSVElNX0NBUFRVUkVUUklHR0VSX1RBMV9SRVNFVCkgICB8fCBcCisgICAgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9USU1FUkFfQ01QMSkgfHwgXAorICAgICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVElNRVJBX0NNUDIpIHx8IFwKKyAgICAgICgoQ0FQVFVSRVRSSUdHRVIpID09IEhSVElNX0NBUFRVUkVUUklHR0VSX1RDMV9TRVQpICAgICB8fCBcCisgICAgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9UQzFfUkVTRVQpICAgfHwgXAorICAgICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVElNRVJDX0NNUDEpIHx8IFwKKyAgICAgICgoQ0FQVFVSRVRSSUdHRVIpID09IEhSVElNX0NBUFRVUkVUUklHR0VSX1RJTUVSQ19DTVAyKSB8fCBcCisgICAgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9URDFfU0VUKSAgICAgfHwgXAorICAgICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVEQxX1JFU0VUKSAgIHx8IFwKKyAgICAgICgoQ0FQVFVSRVRSSUdHRVIpID09IEhSVElNX0NBUFRVUkVUUklHR0VSX1RJTUVSRF9DTVAxKSB8fCBcCisgICAgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9USU1FUkRfQ01QMikgfHwgXAorICAgICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVEUxX1NFVCkgICAgIHx8IFwKKyAgICAgICgoQ0FQVFVSRVRSSUdHRVIpID09IEhSVElNX0NBUFRVUkVUUklHR0VSX1RFMV9SRVNFVCkgICB8fCBcCisgICAgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9USU1FUkVfQ01QMSkgfHwgXAorICAgICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVElNRVJFX0NNUDIpKSkgIFwKKyAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKChUSU1FUikgPT0gSFJUSU1fVElNRVJJTkRFWF9USU1FUl9DKSAmJiAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVEExX1NFVCkgICAgIHx8IFwKKyAgICAgICgoQ0FQVFVSRVRSSUdHRVIpID09IEhSVElNX0NBUFRVUkVUUklHR0VSX1RBMV9SRVNFVCkgICB8fCBcCisgICAgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9USU1FUkFfQ01QMSkgfHwgXAorICAgICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVElNRVJBX0NNUDIpIHx8IFwKKyAgICAgICgoQ0FQVFVSRVRSSUdHRVIpID09IEhSVElNX0NBUFRVUkVUUklHR0VSX1RCMV9TRVQpICAgICB8fCBcCisgICAgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9UQjFfUkVTRVQpICAgfHwgXAorICAgICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVElNRVJCX0NNUDEpIHx8IFwKKyAgICAgICgoQ0FQVFVSRVRSSUdHRVIpID09IEhSVElNX0NBUFRVUkVUUklHR0VSX1RJTUVSQl9DTVAyKSB8fCBcCisgICAgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9URDFfU0VUKSAgICAgfHwgXAorICAgICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVEQxX1JFU0VUKSAgIHx8IFwKKyAgICAgICgoQ0FQVFVSRVRSSUdHRVIpID09IEhSVElNX0NBUFRVUkVUUklHR0VSX1RJTUVSRF9DTVAxKSB8fCBcCisgICAgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9USU1FUkRfQ01QMikgfHwgXAorICAgICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVEUxX1NFVCkgICAgIHx8IFwKKyAgICAgICgoQ0FQVFVSRVRSSUdHRVIpID09IEhSVElNX0NBUFRVUkVUUklHR0VSX1RFMV9SRVNFVCkgICB8fCBcCisgICAgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9USU1FUkVfQ01QMSkgfHwgXAorICAgICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVElNRVJFX0NNUDIpKSkgIFwKKyAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKChUSU1FUikgPT0gSFJUSU1fVElNRVJJTkRFWF9USU1FUl9EKSAmJiAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVEExX1NFVCkgICAgIHx8IFwKKyAgICAgICgoQ0FQVFVSRVRSSUdHRVIpID09IEhSVElNX0NBUFRVUkVUUklHR0VSX1RBMV9SRVNFVCkgICB8fCBcCisgICAgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9USU1FUkFfQ01QMSkgfHwgXAorICAgICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVElNRVJBX0NNUDIpIHx8IFwKKyAgICAgICgoQ0FQVFVSRVRSSUdHRVIpID09IEhSVElNX0NBUFRVUkVUUklHR0VSX1RCMV9TRVQpICAgICB8fCBcCisgICAgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9UQjFfUkVTRVQpICAgfHwgXAorICAgICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVElNRVJCX0NNUDEpIHx8IFwKKyAgICAgICgoQ0FQVFVSRVRSSUdHRVIpID09IEhSVElNX0NBUFRVUkVUUklHR0VSX1RJTUVSQl9DTVAyKSB8fCBcCisgICAgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9UQzFfU0VUKSAgICAgfHwgXAorICAgICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVEMxX1JFU0VUKSAgIHx8IFwKKyAgICAgICgoQ0FQVFVSRVRSSUdHRVIpID09IEhSVElNX0NBUFRVUkVUUklHR0VSX1RJTUVSQ19DTVAxKSB8fCBcCisgICAgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9USU1FUkNfQ01QMikgfHwgXAorICAgICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVEUxX1NFVCkgICAgIHx8IFwKKyAgICAgICgoQ0FQVFVSRVRSSUdHRVIpID09IEhSVElNX0NBUFRVUkVUUklHR0VSX1RFMV9SRVNFVCkgICB8fCBcCisgICAgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9USU1FUkVfQ01QMSkgfHwgXAorICAgICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVElNRVJFX0NNUDIpKSkgIFwKKyAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKChUSU1FUikgPT0gSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FKSAmJiAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVEExX1NFVCkgICAgIHx8IFwKKyAgICAgICgoQ0FQVFVSRVRSSUdHRVIpID09IEhSVElNX0NBUFRVUkVUUklHR0VSX1RBMV9SRVNFVCkgICB8fCBcCisgICAgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9USU1FUkFfQ01QMSkgfHwgXAorICAgICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVElNRVJBX0NNUDIpIHx8IFwKKyAgICAgICgoQ0FQVFVSRVRSSUdHRVIpID09IEhSVElNX0NBUFRVUkVUUklHR0VSX1RCMV9TRVQpICAgICB8fCBcCisgICAgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9UQjFfUkVTRVQpICAgfHwgXAorICAgICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVElNRVJCX0NNUDEpIHx8IFwKKyAgICAgICgoQ0FQVFVSRVRSSUdHRVIpID09IEhSVElNX0NBUFRVUkVUUklHR0VSX1RJTUVSQl9DTVAyKSB8fCBcCisgICAgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9UQzFfU0VUKSAgICAgfHwgXAorICAgICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVEMxX1JFU0VUKSAgIHx8IFwKKyAgICAgICgoQ0FQVFVSRVRSSUdHRVIpID09IEhSVElNX0NBUFRVUkVUUklHR0VSX1RJTUVSQ19DTVAxKSB8fCBcCisgICAgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9USU1FUkNfQ01QMikgfHwgXAorICAgICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVEQxX1NFVCkgICAgIHx8IFwKKyAgICAgICgoQ0FQVFVSRVRSSUdHRVIpID09IEhSVElNX0NBUFRVUkVUUklHR0VSX1REMV9SRVNFVCkgICB8fCBcCisgICAgICAoKENBUFRVUkVUUklHR0VSKSA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9USU1FUkRfQ01QMSkgfHwgXAorICAgICAgKChDQVBUVVJFVFJJR0dFUikgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfVElNRVJEX0NNUDIpKSkpCisKKyNkZWZpbmUgSVNfSFJUSU1fVElNRVZFTlRGSUxURVIoVElNRVZFTlRGSUxURVIpXAorICAgICAgICAgICAgICAgICgoKFRJTUVWRU5URklMVEVSKSA9PSBIUlRJTV9USU1FVkVOVEZJTFRFUl9OT05FKSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAoKFRJTUVWRU5URklMVEVSKSA9PSBIUlRJTV9USU1FVkVOVEZJTFRFUl9CTEFOS0lOR0NNUDEpICAgfHwgXAorICAgICAgICAgICAgICAgICAoKFRJTUVWRU5URklMVEVSKSA9PSBIUlRJTV9USU1FVkVOVEZJTFRFUl9CTEFOS0lOR0NNUDIpICAgfHwgXAorICAgICAgICAgICAgICAgICAoKFRJTUVWRU5URklMVEVSKSA9PSBIUlRJTV9USU1FVkVOVEZJTFRFUl9CTEFOS0lOR0NNUDMpICAgfHwgXAorICAgICAgICAgICAgICAgICAoKFRJTUVWRU5URklMVEVSKSA9PSBIUlRJTV9USU1FVkVOVEZJTFRFUl9CTEFOS0lOR0NNUDQpICAgfHwgXAorICAgICAgICAgICAgICAgICAoKFRJTUVWRU5URklMVEVSKSA9PSBIUlRJTV9USU1FVkVOVEZJTFRFUl9CTEFOS0lOR0ZMVFIxKSAgfHwgXAorICAgICAgICAgICAgICAgICAoKFRJTUVWRU5URklMVEVSKSA9PSBIUlRJTV9USU1FVkVOVEZJTFRFUl9CTEFOS0lOR0ZMVFIyKSAgfHwgXAorICAgICAgICAgICAgICAgICAoKFRJTUVWRU5URklMVEVSKSA9PSBIUlRJTV9USU1FVkVOVEZJTFRFUl9CTEFOS0lOR0ZMVFIzKSAgfHwgXAorICAgICAgICAgICAgICAgICAoKFRJTUVWRU5URklMVEVSKSA9PSBIUlRJTV9USU1FVkVOVEZJTFRFUl9CTEFOS0lOR0ZMVFI0KSAgfHwgXAorICAgICAgICAgICAgICAgICAoKFRJTUVWRU5URklMVEVSKSA9PSBIUlRJTV9USU1FVkVOVEZJTFRFUl9CTEFOS0lOR0ZMVFI1KSAgfHwgXAorICAgICAgICAgICAgICAgICAoKFRJTUVWRU5URklMVEVSKSA9PSBIUlRJTV9USU1FVkVOVEZJTFRFUl9CTEFOS0lOR0ZMVFI2KSAgfHwgXAorICAgICAgICAgICAgICAgICAoKFRJTUVWRU5URklMVEVSKSA9PSBIUlRJTV9USU1FVkVOVEZJTFRFUl9CTEFOS0lOR0ZMVFI3KSAgfHwgXAorICAgICAgICAgICAgICAgICAoKFRJTUVWRU5URklMVEVSKSA9PSBIUlRJTV9USU1FVkVOVEZJTFRFUl9CTEFOS0lOR0ZMVFI4KSAgfHwgXAorICAgICAgICAgICAgICAgICAoKFRJTUVWRU5URklMVEVSKSA9PSBIUlRJTV9USU1FVkVOVEZJTFRFUl9XSU5ET1dJTkdDTVAyKSAgfHwgXAorICAgICAgICAgICAgICAgICAoKFRJTUVWRU5URklMVEVSKSA9PSBIUlRJTV9USU1FVkVOVEZJTFRFUl9XSU5ET1dJTkdDTVAzKSAgfHwgXAorICAgICAgICAgICAgICAgICAoKFRJTUVWRU5URklMVEVSKSA9PSBIUlRJTV9USU1FVkVOVEZJTFRFUl9XSU5ET1dJTkdUSU0pKQorCisjZGVmaW5lIElTX0hSVElNX1RJTUVWRU5UTEFUQ0goVElNRVZFTlRMQVRDSClcCisgICAgICAgICAgICAgICgoKFRJTUVWRU5UTEFUQ0gpID09IEhSVElNX1RJTUVWRU5UTEFUQ0hfRElTQUJMRUQpIHx8IFwKKyAgICAgICAgICAgICAgICgoVElNRVZFTlRMQVRDSCkgPT0gSFJUSU1fVElNRVZFTlRMQVRDSF9FTkFCTEVEKSkKKworI2RlZmluZSBJU19IUlRJTV9USU1ERUFEVElNRV9QUkVTQ0FMRVJSQVRJTyhQUkVTQ0FMRVJSQVRJTylcCisgICAgICAgICAgICAgICAgKCgoUFJFU0NBTEVSUkFUSU8pID09IEhSVElNX1RJTURFQURUSU1FX1BSRVNDQUxFUlJBVElPX01VTDgpIHx8IFwKKyAgICAgICAgICAgICAgICAgKChQUkVTQ0FMRVJSQVRJTykgPT0gSFJUSU1fVElNREVBRFRJTUVfUFJFU0NBTEVSUkFUSU9fTVVMNCkgfHwgXAorICAgICAgICAgICAgICAgICAoKFBSRVNDQUxFUlJBVElPKSA9PSBIUlRJTV9USU1ERUFEVElNRV9QUkVTQ0FMRVJSQVRJT19NVUwyKSB8fCBcCisgICAgICAgICAgICAgICAgICgoUFJFU0NBTEVSUkFUSU8pID09IEhSVElNX1RJTURFQURUSU1FX1BSRVNDQUxFUlJBVElPX0RJVjEpIHx8IFwKKyAgICAgICAgICAgICAgICAgKChQUkVTQ0FMRVJSQVRJTykgPT0gSFJUSU1fVElNREVBRFRJTUVfUFJFU0NBTEVSUkFUSU9fRElWMikgfHwgXAorICAgICAgICAgICAgICAgICAoKFBSRVNDQUxFUlJBVElPKSA9PSBIUlRJTV9USU1ERUFEVElNRV9QUkVTQ0FMRVJSQVRJT19ESVY0KSB8fCBcCisgICAgICAgICAgICAgICAgICgoUFJFU0NBTEVSUkFUSU8pID09IEhSVElNX1RJTURFQURUSU1FX1BSRVNDQUxFUlJBVElPX0RJVjgpIHx8IFwKKyAgICAgICAgICAgICAgICAgKChQUkVTQ0FMRVJSQVRJTykgPT0gSFJUSU1fVElNREVBRFRJTUVfUFJFU0NBTEVSUkFUSU9fRElWMTYpKQorCisjZGVmaW5lIElTX0hSVElNX1RJTURFQURUSU1FX1JJU0lOR1NJR04oUklTSU5HU0lHTilcCisgICAgICAgICAgICAgICAgKCgoUklTSU5HU0lHTikgPT0gSFJUSU1fVElNREVBRFRJTUVfUklTSU5HU0lHTl9QT1NJVElWRSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAoKFJJU0lOR1NJR04pID09IEhSVElNX1RJTURFQURUSU1FX1JJU0lOR1NJR05fTkVHQVRJVkUpKQorCisjZGVmaW5lIElTX0hSVElNX1RJTURFQURUSU1FX1JJU0lOR0xPQ0soUklTSU5HTE9DSylcCisgICAgICAgICAgICAgICAgICAgICgoKFJJU0lOR0xPQ0spID09IEhSVElNX1RJTURFQURUSU1FX1JJU0lOR0xPQ0tfV1JJVEUpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICgoUklTSU5HTE9DSykgPT0gSFJUSU1fVElNREVBRFRJTUVfUklTSU5HTE9DS19SRUFET05MWSkpCisKKyNkZWZpbmUgSVNfSFJUSU1fVElNREVBRFRJTUVfUklTSU5HU0lHTkxPQ0soUklTSU5HU0lHTkxPQ0spXAorICAgICAgICAgICAgICAgICAgKCgoUklTSU5HU0lHTkxPQ0spID09IEhSVElNX1RJTURFQURUSU1FX1JJU0lOR1NJR05MT0NLX1dSSVRFKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgKChSSVNJTkdTSUdOTE9DSykgPT0gSFJUSU1fVElNREVBRFRJTUVfUklTSU5HU0lHTkxPQ0tfUkVBRE9OTFkpKQorCisjZGVmaW5lIElTX0hSVElNX1RJTURFQURUSU1FX0ZBTExJTkdTSUdOKEZBTExJTkdTSUdOKVwKKyAgICAgICAgICAgICAgICAgICAgICAoKChGQUxMSU5HU0lHTikgPT0gSFJUSU1fVElNREVBRFRJTUVfRkFMTElOR1NJR05fUE9TSVRJVkUpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgKChGQUxMSU5HU0lHTikgPT0gSFJUSU1fVElNREVBRFRJTUVfRkFMTElOR1NJR05fTkVHQVRJVkUpKQorCisjZGVmaW5lIElTX0hSVElNX1RJTURFQURUSU1FX0ZBTExJTkdMT0NLKEZBTExJTkdMT0NLKVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoRkFMTElOR0xPQ0spID09IEhSVElNX1RJTURFQURUSU1FX0ZBTExJTkdMT0NLX1dSSVRFKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZBTExJTkdMT0NLKSA9PSBIUlRJTV9USU1ERUFEVElNRV9GQUxMSU5HTE9DS19SRUFET05MWSkpCisKKyNkZWZpbmUgSVNfSFJUSU1fVElNREVBRFRJTUVfRkFMTElOR1NJR05MT0NLKEZBTExJTkdTSUdOTE9DSylcCisgICAgICAgICAgICAgICAgICAgICAgICAoKChGQUxMSU5HU0lHTkxPQ0spID09IEhSVElNX1RJTURFQURUSU1FX0ZBTExJTkdTSUdOTE9DS19XUklURSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoRkFMTElOR1NJR05MT0NLKSA9PSBIUlRJTV9USU1ERUFEVElNRV9GQUxMSU5HU0lHTkxPQ0tfUkVBRE9OTFkpKQorCisjZGVmaW5lIElTX0hSVElNX0NIT1BQRVJfUFJFU0NBTEVSUkFUSU8oUFJFU0NBTEVSUkFUSU8pXAorICAgICAgICAgICAgICAgICAgICAgICAgKCgoUFJFU0NBTEVSUkFUSU8pID09IEhSVElNX0NIT1BQRVJfUFJFU0NBTEVSUkFUSU9fRElWMTYpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKFBSRVNDQUxFUlJBVElPKSA9PSBIUlRJTV9DSE9QUEVSX1BSRVNDQUxFUlJBVElPX0RJVjMyKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKChQUkVTQ0FMRVJSQVRJTykgPT0gSFJUSU1fQ0hPUFBFUl9QUkVTQ0FMRVJSQVRJT19ESVY0OCkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoUFJFU0NBTEVSUkFUSU8pID09IEhSVElNX0NIT1BQRVJfUFJFU0NBTEVSUkFUSU9fRElWNjQpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKFBSRVNDQUxFUlJBVElPKSA9PSBIUlRJTV9DSE9QUEVSX1BSRVNDQUxFUlJBVElPX0RJVjgwKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKChQUkVTQ0FMRVJSQVRJTykgPT0gSFJUSU1fQ0hPUFBFUl9QUkVTQ0FMRVJSQVRJT19ESVY5NikgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoUFJFU0NBTEVSUkFUSU8pID09IEhSVElNX0NIT1BQRVJfUFJFU0NBTEVSUkFUSU9fRElWMTEyKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKFBSRVNDQUxFUlJBVElPKSA9PSBIUlRJTV9DSE9QUEVSX1BSRVNDQUxFUlJBVElPX0RJVjEyOCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKChQUkVTQ0FMRVJSQVRJTykgPT0gSFJUSU1fQ0hPUFBFUl9QUkVTQ0FMRVJSQVRJT19ESVYxNDQpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoUFJFU0NBTEVSUkFUSU8pID09IEhSVElNX0NIT1BQRVJfUFJFU0NBTEVSUkFUSU9fRElWMTYwKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKFBSRVNDQUxFUlJBVElPKSA9PSBIUlRJTV9DSE9QUEVSX1BSRVNDQUxFUlJBVElPX0RJVjE3NikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKChQUkVTQ0FMRVJSQVRJTykgPT0gSFJUSU1fQ0hPUFBFUl9QUkVTQ0FMRVJSQVRJT19ESVYxOTIpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoUFJFU0NBTEVSUkFUSU8pID09IEhSVElNX0NIT1BQRVJfUFJFU0NBTEVSUkFUSU9fRElWMjA4KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKFBSRVNDQUxFUlJBVElPKSA9PSBIUlRJTV9DSE9QUEVSX1BSRVNDQUxFUlJBVElPX0RJVjIyNCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKChQUkVTQ0FMRVJSQVRJTykgPT0gSFJUSU1fQ0hPUFBFUl9QUkVTQ0FMRVJSQVRJT19ESVYyNDApICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoUFJFU0NBTEVSUkFUSU8pID09IEhSVElNX0NIT1BQRVJfUFJFU0NBTEVSUkFUSU9fRElWMjU2KSkKKworI2RlZmluZSBJU19IUlRJTV9DSE9QUEVSX0RVVFlDWUNMRShEVVRZQ1lDTEUpXAorICAgICAgICAgICAgICAgICAgICAgICAgKCgoRFVUWUNZQ0xFKSA9PSBIUlRJTV9DSE9QUEVSX0RVVFlDWUNMRV8wKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKChEVVRZQ1lDTEUpID09IEhSVElNX0NIT1BQRVJfRFVUWUNZQ0xFXzEyNSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKERVVFlDWUNMRSkgPT0gSFJUSU1fQ0hPUFBFUl9EVVRZQ1lDTEVfMjUwKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoRFVUWUNZQ0xFKSA9PSBIUlRJTV9DSE9QUEVSX0RVVFlDWUNMRV8zNzUpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKChEVVRZQ1lDTEUpID09IEhSVElNX0NIT1BQRVJfRFVUWUNZQ0xFXzUwMCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKERVVFlDWUNMRSkgPT0gSFJUSU1fQ0hPUFBFUl9EVVRZQ1lDTEVfNjI1KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoRFVUWUNZQ0xFKSA9PSBIUlRJTV9DSE9QUEVSX0RVVFlDWUNMRV83NTApICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKChEVVRZQ1lDTEUpID09IEhSVElNX0NIT1BQRVJfRFVUWUNZQ0xFXzg3NSkpCisKKyNkZWZpbmUgSVNfSFJUSU1fQ0hPUFBFUl9QVUxTRVdJRFRIKFBVTFNFV0lEVEgpXAorICAgICAgICAgICAgICAgICAgICAgICAgKCgoUFVMU0VXSURUSCkgPT0gSFJUSU1fQ0hPUFBFUl9QVUxTRVdJRFRIXzE2KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKFBVTFNFV0lEVEgpID09IEhSVElNX0NIT1BQRVJfUFVMU0VXSURUSF8zMikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKChQVUxTRVdJRFRIKSA9PSBIUlRJTV9DSE9QUEVSX1BVTFNFV0lEVEhfNDgpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoUFVMU0VXSURUSCkgPT0gSFJUSU1fQ0hPUFBFUl9QVUxTRVdJRFRIXzY0KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKFBVTFNFV0lEVEgpID09IEhSVElNX0NIT1BQRVJfUFVMU0VXSURUSF84MCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKChQVUxTRVdJRFRIKSA9PSBIUlRJTV9DSE9QUEVSX1BVTFNFV0lEVEhfOTYpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoUFVMU0VXSURUSCkgPT0gSFJUSU1fQ0hPUFBFUl9QVUxTRVdJRFRIXzExMikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKFBVTFNFV0lEVEgpID09IEhSVElNX0NIT1BQRVJfUFVMU0VXSURUSF8xMjgpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKChQVUxTRVdJRFRIKSA9PSBIUlRJTV9DSE9QUEVSX1BVTFNFV0lEVEhfMTQ0KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoUFVMU0VXSURUSCkgPT0gSFJUSU1fQ0hPUFBFUl9QVUxTRVdJRFRIXzE2MCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKFBVTFNFV0lEVEgpID09IEhSVElNX0NIT1BQRVJfUFVMU0VXSURUSF8xNzYpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKChQVUxTRVdJRFRIKSA9PSBIUlRJTV9DSE9QUEVSX1BVTFNFV0lEVEhfMTkyKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoUFVMU0VXSURUSCkgPT0gSFJUSU1fQ0hPUFBFUl9QVUxTRVdJRFRIXzIwOCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKFBVTFNFV0lEVEgpID09IEhSVElNX0NIT1BQRVJfUFVMU0VXSURUSF8yMjQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKChQVUxTRVdJRFRIKSA9PSBIUlRJTV9DSE9QUEVSX1BVTFNFV0lEVEhfMjQwKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoUFVMU0VXSURUSCkgPT0gSFJUSU1fQ0hPUFBFUl9QVUxTRVdJRFRIXzI1NikpCisKKyNkZWZpbmUgSVNfSFJUSU1fU1lOQ0lOUFVUU09VUkNFKFNZTkNJTlBVVFNPVVJDRSlcCisgICAgICAgICAgICAgICgoKFNZTkNJTlBVVFNPVVJDRSkgPT0gSFJUSU1fU1lOQ0lOUFVUU09VUkNFX05PTkUpICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICgoU1lOQ0lOUFVUU09VUkNFKSA9PSBIUlRJTV9TWU5DSU5QVVRTT1VSQ0VfSU5URVJOQUxFVkVOVCkgICAgfHwgXAorICAgICAgICAgICAgICAgKChTWU5DSU5QVVRTT1VSQ0UpID09IEhSVElNX1NZTkNJTlBVVFNPVVJDRV9FWFRFUk5BTEVWRU5UKSkKKworI2RlZmluZSBJU19IUlRJTV9TWU5DT1VUUFVUU09VUkNFKFNZTkNPVVRQVVRTT1VSQ0UpXAorICAgICAgICAgICAgICAoKChTWU5DT1VUUFVUU09VUkNFKSA9PSBIUlRJTV9TWU5DT1VUUFVUU09VUkNFX01BU1RFUl9TVEFSVCkgIHx8IFwKKyAgICAgICAgICAgICAgICgoU1lOQ09VVFBVVFNPVVJDRSkgPT0gSFJUSU1fU1lOQ09VVFBVVFNPVVJDRV9NQVNURVJfQ01QMSkgICB8fCBcCisgICAgICAgICAgICAgICAoKFNZTkNPVVRQVVRTT1VSQ0UpID09IEhSVElNX1NZTkNPVVRQVVRTT1VSQ0VfVElNQV9TVEFSVCkgICAgfHwgXAorICAgICAgICAgICAgICAgKChTWU5DT1VUUFVUU09VUkNFKSA9PSBIUlRJTV9TWU5DT1VUUFVUU09VUkNFX1RJTUFfQ01QMSkpICAgICAgICAgICAgICAgIAorCisjZGVmaW5lIElTX0hSVElNX1NZTkNPVVRQVVRQT0xBUklUWShTWU5DT1VUUFVUUE9MQVJJVFkpXAorICAgICAgICAgICAgICAoKChTWU5DT1VUUFVUUE9MQVJJVFkpID09IEhSVElNX1NZTkNPVVRQVVRQT0xBUklUWV9OT05FKSAgfHwgXAorICAgICAgICAgICAgICAgKChTWU5DT1VUUFVUUE9MQVJJVFkpID09IEhSVElNX1NZTkNPVVRQVVRQT0xBUklUWV9QT1NJVElWRSkgIHx8IFwKKyAgICAgICAgICAgICAgICgoU1lOQ09VVFBVVFBPTEFSSVRZKSA9PSBIUlRJTV9TWU5DT1VUUFVUUE9MQVJJVFlfTkVHQVRJVkUpKSAgICAKKworI2RlZmluZSBJU19IUlRJTV9FVkVOVFNSQyhFVkVOVFNSQylcCisgICAgICAgICAgICAgICAgKCgoRVZFTlRTUkMpID09IEhSVElNX0VWRU5UU1JDXzEpICAgfHwgXAorICAgICAgICAgICAgICAgICAoKEVWRU5UU1JDKSA9PSBIUlRJTV9FVkVOVFNSQ18yKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgKChFVkVOVFNSQykgPT0gSFJUSU1fRVZFTlRTUkNfMykgICB8fCBcCisgICAgICAgICAgICAgICAgICgoRVZFTlRTUkMpID09IEhSVElNX0VWRU5UU1JDXzQpKQorCisjZGVmaW5lIElTX0hSVElNX0VWRU5UUE9MQVJJVFkoRVZFTlRTRU5TSVRJVklUWSwgRVZFTlRQT0xBUklUWSlcCisgICAgKCgoKEVWRU5UU0VOU0lUSVZJVFkpID09IEhSVElNX0VWRU5UU0VOU0lUSVZJVFlfTEVWRUwpICAmJiAgICAgIFwKKyAgICAgICAoKChFVkVOVFBPTEFSSVRZKSA9PSBIUlRJTV9FVkVOVFBPTEFSSVRZX0hJR0gpICB8fCAgICAgICAgICAgXAorICAgICAgICAoKEVWRU5UUE9MQVJJVFkpID09IEhSVElNX0VWRU5UUE9MQVJJVFlfTE9XKSkpICAgICAgICAgICAgICBcCisgICAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICgoKEVWRU5UU0VOU0lUSVZJVFkpID09IEhSVElNX0VWRU5UU0VOU0lUSVZJVFlfUklTSU5HRURHRSkgfHwgXAorICAgICAgICgoRVZFTlRTRU5TSVRJVklUWSkgPT0gSFJUSU1fRVZFTlRTRU5TSVRJVklUWV9GQUxMSU5HRURHRSl8fCBcCisgICAgICAgKChFVkVOVFNFTlNJVElWSVRZKSA9PSBIUlRJTV9FVkVOVFNFTlNJVElWSVRZX0JPVEhFREdFUykpKQorCisjZGVmaW5lIElTX0hSVElNX0VWRU5UU0VOU0lUSVZJVFkoRVZFTlRTRU5TSVRJVklUWSlcCisgICAgICAgICAgICAgICAgICAgICgoKEVWRU5UU0VOU0lUSVZJVFkpID09IEhSVElNX0VWRU5UU0VOU0lUSVZJVFlfTEVWRUwpICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICgoRVZFTlRTRU5TSVRJVklUWSkgPT0gSFJUSU1fRVZFTlRTRU5TSVRJVklUWV9SSVNJTkdFREdFKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgKChFVkVOVFNFTlNJVElWSVRZKSA9PSBIUlRJTV9FVkVOVFNFTlNJVElWSVRZX0ZBTExJTkdFREdFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAoKEVWRU5UU0VOU0lUSVZJVFkpID09IEhSVElNX0VWRU5UU0VOU0lUSVZJVFlfQk9USEVER0VTKSkKKworI2RlZmluZSBJU19IUlRJTV9FVkVOVEZBU1RNT0RFKEVWRU5ULCBGQVNUTU9ERSlcCisgICAgKCgoKChFVkVOVCkgPT0gSFJUSU1fRVZFTlRfMSkgfHwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAoKEVWRU5UKSA9PSBIUlRJTV9FVkVOVF8yKSB8fCAgICAgICAgICAgICAgICAgXAorICAgICAgICgoRVZFTlQpID09IEhSVElNX0VWRU5UXzMpIHx8ICAgICAgICAgICAgICAgICBcCisgICAgICAgKChFVkVOVCkgPT0gSFJUSU1fRVZFTlRfNCkgfHwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAoKEVWRU5UKSA9PSBIUlRJTV9FVkVOVF81KSkgJiYgICAgICAgICAgICAgICAgXAorICAgICAgKCgoRkFTVE1PREUpID09IEhSVElNX0VWRU5URkFTVE1PREVfRU5BQkxFKSB8fCBcCisgICAgICAgKChGQVNUTU9ERSkgPT0gSFJUSU1fRVZFTlRGQVNUTU9ERV9ESVNBQkxFKSkpIFwKKyAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKEVWRU5UKSA9PSBIUlRJTV9FVkVOVF82KSB8fCAgICAgICAgICAgICAgICAgICBcCisgICAgICgoRVZFTlQpID09IEhSVElNX0VWRU5UXzcpIHx8ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChFVkVOVCkgPT0gSFJUSU1fRVZFTlRfOCkgfHwgICAgICAgICAgICAgICAgICAgXAorICAgICAoKEVWRU5UKSA9PSBIUlRJTV9FVkVOVF85KSB8fCAgICAgICAgICAgICAgICAgICBcCisgICAgICgoRVZFTlQpID09IEhSVElNX0VWRU5UXzEwKSkpCisKKworI2RlZmluZSBJU19IUlRJTV9FVkVOVEZJTFRFUihFVkVOVCwgRklMVEVSKVwKKyAgICAgICgoKChFVkVOVCkgPT0gSFJUSU1fRVZFTlRfMSkgfHwgICAgICAgICAgICBcCisgICAgICAgICgoRVZFTlQpID09IEhSVElNX0VWRU5UXzIpIHx8ICAgICAgICAgICAgXAorICAgICAgICAoKEVWRU5UKSA9PSBIUlRJTV9FVkVOVF8zKSB8fCAgICAgICAgICAgIFwKKyAgICAgICAgKChFVkVOVCkgPT0gSFJUSU1fRVZFTlRfNCkgfHwgICAgICAgICAgICBcCisgICAgICAgICgoRVZFTlQpID09IEhSVElNX0VWRU5UXzUpKSAgICAgICAgICAgICAgXAorICAgICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICgoKChFVkVOVCkgPT0gSFJUSU1fRVZFTlRfNikgfHwgICAgICAgICAgICBcCisgICAgICAgICgoRVZFTlQpID09IEhSVElNX0VWRU5UXzcpIHx8ICAgICAgICAgICAgXAorICAgICAgICAoKEVWRU5UKSA9PSBIUlRJTV9FVkVOVF84KSB8fCAgICAgICAgICAgIFwKKyAgICAgICAgKChFVkVOVCkgPT0gSFJUSU1fRVZFTlRfOSkgfHwgICAgICAgICAgICBcCisgICAgICAgICgoRVZFTlQpID09IEhSVElNX0VWRU5UXzEwKSkgJiYgICAgICAgICAgXAorICAgICAgICAoKChGSUxURVIpID09IEhSVElNX0VWRU5URklMVEVSX05PTkUpIHx8IFwKKyAgICAgICAgKChGSUxURVIpID09IEhSVElNX0VWRU5URklMVEVSXzEpICAgICB8fCBcCisgICAgICAgICgoRklMVEVSKSA9PSBIUlRJTV9FVkVOVEZJTFRFUl8yKSAgICAgfHwgXAorICAgICAgICAoKEZJTFRFUikgPT0gSFJUSU1fRVZFTlRGSUxURVJfMykgICAgIHx8IFwKKyAgICAgICAgKChGSUxURVIpID09IEhSVElNX0VWRU5URklMVEVSXzQpICAgICB8fCBcCisgICAgICAgICgoRklMVEVSKSA9PSBIUlRJTV9FVkVOVEZJTFRFUl81KSAgICAgfHwgXAorICAgICAgICAoKEZJTFRFUikgPT0gSFJUSU1fRVZFTlRGSUxURVJfNikgICAgIHx8IFwKKyAgICAgICAgKChGSUxURVIpID09IEhSVElNX0VWRU5URklMVEVSXzcpICAgICB8fCBcCisgICAgICAgICgoRklMVEVSKSA9PSBIUlRJTV9FVkVOVEZJTFRFUl84KSAgICAgfHwgXAorICAgICAgICAoKEZJTFRFUikgPT0gSFJUSU1fRVZFTlRGSUxURVJfOSkgICAgIHx8IFwKKyAgICAgICAgKChGSUxURVIpID09IEhSVElNX0VWRU5URklMVEVSXzEwKSAgICB8fCBcCisgICAgICAgICgoRklMVEVSKSA9PSBIUlRJTV9FVkVOVEZJTFRFUl8xMSkgICAgfHwgXAorICAgICAgICAoKEZJTFRFUikgPT0gSFJUSU1fRVZFTlRGSUxURVJfMTIpICAgIHx8IFwKKyAgICAgICAgKChGSUxURVIpID09IEhSVElNX0VWRU5URklMVEVSXzEzKSAgICB8fCBcCisgICAgICAgICgoRklMVEVSKSA9PSBIUlRJTV9FVkVOVEZJTFRFUl8xNCkgICAgfHwgXAorICAgICAgICAoKEZJTFRFUikgPT0gSFJUSU1fRVZFTlRGSUxURVJfMTUpKSkpCisKKyNkZWZpbmUgSVNfSFJUSU1fRVZFTlRQUkVTQ0FMRVIoRVZFTlRQUkVTQ0FMRVIpXAorICAgICAgICAgICAgICgoKEVWRU5UUFJFU0NBTEVSKSA9PSBIUlRJTV9FVkVOVFBSRVNDQUxFUl9ESVYxKSAgfHwgXAorICAgICAgICAgICAgICAoKEVWRU5UUFJFU0NBTEVSKSA9PSBIUlRJTV9FVkVOVFBSRVNDQUxFUl9ESVYyKSAgIHx8IFwKKyAgICAgICAgICAgICAgKChFVkVOVFBSRVNDQUxFUikgPT0gSFJUSU1fRVZFTlRQUkVTQ0FMRVJfRElWNCkgICB8fCBcCisgICAgICAgICAgICAgICgoRVZFTlRQUkVTQ0FMRVIpID09IEhSVElNX0VWRU5UUFJFU0NBTEVSX0RJVjgpKQorCisjZGVmaW5lIElTX0hSVElNX0ZBVUxUU09VUkNFKEZBVUxUU09VUkNFKVwKKyAgICAgICAgICAgICAgKCgoRkFVTFRTT1VSQ0UpID09IEhSVElNX0ZBVUxUU09VUkNFX0RJR0lUQUxJTlBVVCkgfHwgXAorICAgICAgICAgICAgICAoKEZBVUxUU09VUkNFKSA9PSBIUlRJTV9GQVVMVFNPVVJDRV9JTlRFUk5BTCkpCisKKyNkZWZpbmUgSVNfSFJUSU1fRkFVTFRQT0xBUklUWShIUlRJTV9GQVVMVFBPTEFSSVRZKVwKKyAgICAgICAgICAgICAgKCgoSFJUSU1fRkFVTFRQT0xBUklUWSkgPT0gSFJUSU1fRkFVTFRQT0xBUklUWV9MT1cpIHx8IFwKKyAgICAgICAgICAgICAgICgoSFJUSU1fRkFVTFRQT0xBUklUWSkgPT0gSFJUSU1fRkFVTFRQT0xBUklUWV9ISUdIKSkKKworI2RlZmluZSBJU19IUlRJTV9GQVVMVE1PREVDVEwoRkFVTFRNT0RFQ1RMKVwKKyAgICAoKChGQVVMVE1PREVDVEwpID09IEhSVElNX0ZBVUxUTU9ERUNUTF9ESVNBQkxFRCkgIHx8IFwKKyAgICAgKChGQVVMVE1PREVDVEwpID09IEhSVElNX0ZBVUxUTU9ERUNUTF9FTkFCTEVEKSkKKworI2RlZmluZSBJU19IUlRJTV9GQVVMVEZJTFRFUihGQVVMVEZJTFRFUilcCisgICAgICAgICAgICAgICAgKCgoRkFVTFRGSUxURVIpID09IEhSVElNX0ZBVUxURklMVEVSX05PTkUpIHx8IFwKKyAgICAgICAgICAgICAgICAgKChGQVVMVEZJTFRFUikgPT0gSFJUSU1fRkFVTFRGSUxURVJfMSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAoKEZBVUxURklMVEVSKSA9PSBIUlRJTV9GQVVMVEZJTFRFUl8yKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICgoRkFVTFRGSUxURVIpID09IEhSVElNX0ZBVUxURklMVEVSXzMpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgKChGQVVMVEZJTFRFUikgPT0gSFJUSU1fRkFVTFRGSUxURVJfNCkgICAgfHwgXAorICAgICAgICAgICAgICAgICAoKEZBVUxURklMVEVSKSA9PSBIUlRJTV9GQVVMVEZJTFRFUl81KSAgICB8fCBcCisgICAgICAgICAgICAgICAgICgoRkFVTFRGSUxURVIpID09IEhSVElNX0ZBVUxURklMVEVSXzYpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgKChGQVVMVEZJTFRFUikgPT0gSFJUSU1fRkFVTFRGSUxURVJfNykgICAgfHwgXAorICAgICAgICAgICAgICAgICAoKEZBVUxURklMVEVSKSA9PSBIUlRJTV9GQVVMVEZJTFRFUl84KSAgICB8fCBcCisgICAgICAgICAgICAgICAgICgoRkFVTFRGSUxURVIpID09IEhSVElNX0ZBVUxURklMVEVSXzkpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgKChGQVVMVEZJTFRFUikgPT0gSFJUSU1fRkFVTFRGSUxURVJfMTApICAgfHwgXAorICAgICAgICAgICAgICAgICAoKEZBVUxURklMVEVSKSA9PSBIUlRJTV9GQVVMVEZJTFRFUl8xMSkgICB8fCBcCisgICAgICAgICAgICAgICAgICgoRkFVTFRGSUxURVIpID09IEhSVElNX0ZBVUxURklMVEVSXzEyKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgKChGQVVMVEZJTFRFUikgPT0gSFJUSU1fRkFVTFRGSUxURVJfMTMpICAgfHwgXAorICAgICAgICAgICAgICAgICAoKEZBVUxURklMVEVSKSA9PSBIUlRJTV9GQVVMVEZJTFRFUl8xNCkgICB8fCBcCisgICAgICAgICAgICAgICAgICgoRkFVTFRGSUxURVIpID09IEhSVElNX0ZBVUxURklMVEVSXzE1KSkKKyAgICAgICAgICAgICAgCisjZGVmaW5lIElTX0hSVElNX0ZBVUxUTE9DSyhGQVVMVExPQ0spXAorICAgICAgICAgICAgICAoKChGQVVMVExPQ0spID09IEhSVElNX0ZBVUxUTE9DS19SRUFEV1JJVEUpIHx8IFwKKyAgICAgICAgICAgICAgICgoRkFVTFRMT0NLKSA9PSBIUlRJTV9GQVVMVExPQ0tfUkVBRE9OTFkpKQorCisjZGVmaW5lIElTX0hSVElNX0ZBVUxUUFJFU0NBTEVSKEZBVUxUUFJFU0NBTEVSKVwKKyAgICAgICAgICAgICAoKChGQVVMVFBSRVNDQUxFUikgPT0gSFJUSU1fRkFVTFRQUkVTQ0FMRVJfRElWMSkgIHx8IFwKKyAgICAgICAgICAgICAgKChGQVVMVFBSRVNDQUxFUikgPT0gSFJUSU1fRkFVTFRQUkVTQ0FMRVJfRElWMikgICB8fCBcCisgICAgICAgICAgICAgICgoRkFVTFRQUkVTQ0FMRVIpID09IEhSVElNX0ZBVUxUUFJFU0NBTEVSX0RJVjQpICAgfHwgXAorICAgICAgICAgICAgICAoKEZBVUxUUFJFU0NBTEVSKSA9PSBIUlRJTV9GQVVMVFBSRVNDQUxFUl9ESVY4KSkKKworI2RlZmluZSBJU19IUlRJTV9CVVJTVE1PREUoQlVSU1RNT0RFKVwKKyAgICAgICAgICAgICAgKCgoQlVSU1RNT0RFKSA9PSBIUlRJTV9CVVJTVE1PREVfU0lOR0xFU0hPVCkgIHx8IFwKKyAgICAgICAgICAgICAgICgoQlVSU1RNT0RFKSA9PSBIUlRJTV9CVVJTVE1PREVfQ09OVElOT1VTKSkgICAgCisKKyNkZWZpbmUgSVNfSFJUSU1fQlVSU1RNT0RFQ0xPQ0tTT1VSQ0UoQlVSU1RNT0RFQ0xPQ0tTT1VSQ0UpXAorICAgICAgICAgICAgICAoKChCVVJTVE1PREVDTE9DS1NPVVJDRSkgPT0gSFJUSU1fQlVSU1RNT0RFQ0xPQ0tTT1VSQ0VfTUFTVEVSKSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICgoQlVSU1RNT0RFQ0xPQ0tTT1VSQ0UpID09IEhSVElNX0JVUlNUTU9ERUNMT0NLU09VUkNFX1RJTUVSX0EpICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERUNMT0NLU09VUkNFKSA9PSBIUlRJTV9CVVJTVE1PREVDTE9DS1NPVVJDRV9USU1FUl9CKSAgICAgfHwgXAorICAgICAgICAgICAgICAgKChCVVJTVE1PREVDTE9DS1NPVVJDRSkgPT0gSFJUSU1fQlVSU1RNT0RFQ0xPQ0tTT1VSQ0VfVElNRVJfQykgICAgIHx8IFwKKyAgICAgICAgICAgICAgICgoQlVSU1RNT0RFQ0xPQ0tTT1VSQ0UpID09IEhSVElNX0JVUlNUTU9ERUNMT0NLU09VUkNFX1RJTUVSX0QpICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERUNMT0NLU09VUkNFKSA9PSBIUlRJTV9CVVJTVE1PREVDTE9DS1NPVVJDRV9USU1FUl9FKSAgICAgfHwgXAorICAgICAgICAgICAgICAgKChCVVJTVE1PREVDTE9DS1NPVVJDRSkgPT0gSFJUSU1fQlVSU1RNT0RFQ0xPQ0tTT1VSQ0VfVElNMTZfT0MpICAgIHx8IFwKKyAgICAgICAgICAgICAgICgoQlVSU1RNT0RFQ0xPQ0tTT1VSQ0UpID09IEhSVElNX0JVUlNUTU9ERUNMT0NLU09VUkNFX1RJTTE3X09DKSAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERUNMT0NLU09VUkNFKSA9PSBIUlRJTV9CVVJTVE1PREVDTE9DS1NPVVJDRV9USU03X1RSR08pICAgfHwgXAorICAgICAgICAgICAgICAgKChCVVJTVE1PREVDTE9DS1NPVVJDRSkgPT0gSFJUSU1fQlVSU1RNT0RFQ0xPQ0tTT1VSQ0VfRkhSVElNKSkgICAgICAgICAgICAgICAgICAgCisKKyNkZWZpbmUgSVNfSFJUSU1fSFJUSU1fQlVSU1RNT0RFUFJFU0NBTEVSKEJVUlNUTU9ERVBSRVNDQUxFUilcCisgICAgICAgICAgICAgICgoKEJVUlNUTU9ERVBSRVNDQUxFUikgPT0gSFJUSU1fQlVSU1RNT0RFUFJFU0NBTEVSX0RJVjEpICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVBSRVNDQUxFUikgPT0gSFJUSU1fQlVSU1RNT0RFUFJFU0NBTEVSX0RJVjIpICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVBSRVNDQUxFUikgPT0gSFJUSU1fQlVSU1RNT0RFUFJFU0NBTEVSX0RJVjQpICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVBSRVNDQUxFUikgPT0gSFJUSU1fQlVSU1RNT0RFUFJFU0NBTEVSX0RJVjgpICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVBSRVNDQUxFUikgPT0gSFJUSU1fQlVSU1RNT0RFUFJFU0NBTEVSX0RJVjE2KSAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVBSRVNDQUxFUikgPT0gSFJUSU1fQlVSU1RNT0RFUFJFU0NBTEVSX0RJVjMyKSAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVBSRVNDQUxFUikgPT0gSFJUSU1fQlVSU1RNT0RFUFJFU0NBTEVSX0RJVjY0KSAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVBSRVNDQUxFUikgPT0gSFJUSU1fQlVSU1RNT0RFUFJFU0NBTEVSX0RJVjEyOCkgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVBSRVNDQUxFUikgPT0gSFJUSU1fQlVSU1RNT0RFUFJFU0NBTEVSX0RJVjI1NikgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVBSRVNDQUxFUikgPT0gSFJUSU1fQlVSU1RNT0RFUFJFU0NBTEVSX0RJVjUxMikgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVBSRVNDQUxFUikgPT0gSFJUSU1fQlVSU1RNT0RFUFJFU0NBTEVSX0RJVjEwMjQpICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVBSRVNDQUxFUikgPT0gSFJUSU1fQlVSU1RNT0RFUFJFU0NBTEVSX0RJVjIwNDgpICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVBSRVNDQUxFUikgPT0gSFJUSU1fQlVSU1RNT0RFUFJFU0NBTEVSX0RJVjQwOTYpICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVBSRVNDQUxFUikgPT0gSFJUSU1fQlVSU1RNT0RFUFJFU0NBTEVSX0RJVjgxOTIpICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVBSRVNDQUxFUikgPT0gSFJUSU1fQlVSU1RNT0RFUFJFU0NBTEVSX0RJVjE2Mzg0KSB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVBSRVNDQUxFUikgPT0gSFJUSU1fQlVSU1RNT0RFUFJFU0NBTEVSX0RJVjMyNzY4KSkgICAgICAgICAgICAgICAgICAgCisKKyNkZWZpbmUgSVNfSFJUSU1fQlVSU1RNT0RFUFJFTE9BRChCVVJTVE1PREVQUkVMT0FEKVwKKyAgICAgICAgICAgICAgKCgoQlVSU1RNT0RFUFJFTE9BRCkgPT0gSFJJTV9CVVJTVE1PREVQUkVMT0FEX0RJU0FCTEVEKSAgfHwgXAorICAgICAgICAgICAgICAgKChCVVJTVE1PREVQUkVMT0FEKSA9PSBIUklNX0JVUlNUTU9ERVBSRUxPQURfRU5BQkxFRCkpICAgICAgICAgICAgICAgICAgIAorCisjZGVmaW5lIElTX0hSVElNX0JVUlNUTU9ERVRSSUdHRVIoQlVSU1RNT0RFVFJJR0dFUilcCisgICAgICAgICAgICAgICgoKEJVUlNUTU9ERVRSSUdHRVIpID09IEhSVElNX0JVUlNUTU9ERVRSSUdHRVJfTk9ORSkgICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09IEhSVElNX0JVUlNUTU9ERVRSSUdHRVJfTUFTVEVSX1JFU0VUKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09IEhSVElNX0JVUlNUTU9ERVRSSUdHRVJfTUFTVEVSX1JFUEVUSVRJT04pICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX01BU1RFUl9DTVAxKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX01BU1RFUl9DTVAyKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX01BU1RFUl9DTVAzKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX01BU1RFUl9DTVA0KSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX1RJTUVSQV9SRVNFVCkgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX1RJTUVSQV9SRVBFVElUSU9OKSB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX1RJTUVSQV9DTVAxKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX1RJTUVSQV9DTVAyKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX1RJTUVSQl9SRVNFVCkgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX1RJTUVSQl9SRVBFVElUSU9OKSB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX1RJTUVSQl9DTVAxKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX1RJTUVSQl9DTVAyKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX1RJTUVSQ19SRVNFVCkgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX1RJTUVSQ19SRVBFVElUSU9OKSB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX1RJTUVSQ19DTVAxKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX1RJTUVSQ19DTVAyKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX1RJTUVSRF9SRVNFVCkgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX1RJTUVSRF9SRVBFVElUSU9OKSB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX1RJTUVSRF9DTVAxKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX1RJTUVSRF9DTVAyKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX1RJTUVSRV9SRVNFVCkgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX1RJTUVSRV9SRVBFVElUSU9OKSB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX1RJTUVSRV9DTVAxKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX1RJTUVSRV9DTVAyKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX1RJTUVSQV9FVkVOVDcpICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX1RJTUVSRF9FVkVOVDgpICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX0VWRU5UXzcpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX0VWRU5UXzgpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAoKEJVUlNUTU9ERVRSSUdHRVIpID09ICBIUlRJTV9CVVJTVE1PREVUUklHR0VSX0VWRU5UX09OQ0hJUCkpCisKKyNkZWZpbmUgSVNfSFJUSU1fQURDVFJJR0dFUlVQREFURShBRENUUklHR0VSVVBEQVRFKVwKKyAgICAgICAgICAgICAoKChBRENUUklHR0VSVVBEQVRFKSA9PSBIUlRJTV9BRENUUklHR0VSVVBEQVRFX01BU1RFUikgICB8fCBcCisgICAgICAgICAgICAgICgoQURDVFJJR0dFUlVQREFURSkgPT0gSFJUSU1fQURDVFJJR0dFUlVQREFURV9USU1FUl9BKSAgfHwgXAorICAgICAgICAgICAgICAoKEFEQ1RSSUdHRVJVUERBVEUpID09IEhSVElNX0FEQ1RSSUdHRVJVUERBVEVfVElNRVJfQikgIHx8IFwKKyAgICAgICAgICAgICAgKChBRENUUklHR0VSVVBEQVRFKSA9PSBIUlRJTV9BRENUUklHR0VSVVBEQVRFX1RJTUVSX0MpICB8fCBcCisgICAgICAgICAgICAgICgoQURDVFJJR0dFUlVQREFURSkgPT0gSFJUSU1fQURDVFJJR0dFUlVQREFURV9USU1FUl9EKSAgfHwgXAorICAgICAgICAgICAgICAoKEFEQ1RSSUdHRVJVUERBVEUpID09IEhSVElNX0FEQ1RSSUdHRVJVUERBVEVfVElNRVJfRSkpICAgCisKKyNkZWZpbmUgSVNfSFJUSU1fQ0FMSUJSQVRJT05SQVRFKENBTElCUkFUSU9OUkFURSlcCisgICAgKCgoQ0FMSUJSQVRJT05SQVRFKSA9PSBIUlRJTV9TSU5HTEVfQ0FMSUJSQVRJT04pICAgfHwgXAorICAgICAoKENBTElCUkFUSU9OUkFURSkgPT0gSFJUSU1fQ0FMSUJSQVRJT05SQVRFXzczMDApIHx8IFwKKyAgICAgKChDQUxJQlJBVElPTlJBVEUpID09IEhSVElNX0NBTElCUkFUSU9OUkFURV85MTApICB8fCBcCisgICAgICgoQ0FMSUJSQVRJT05SQVRFKSA9PSBIUlRJTV9DQUxJQlJBVElPTlJBVEVfMTE0KSAgfHwgXAorICAgICAoKENBTElCUkFUSU9OUkFURSkgPT0gSFJUSU1fQ0FMSUJSQVRJT05SQVRFXzE0KSkKKyAgICAgCisjZGVmaW5lIElTX0hSVElNX1RJTUVSX0JVUlNURE1BKFRJTUVSLCBCVVJTVERNQSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKCgoVElNRVIpID09IEhSVElNX1RJTUVSSU5ERVhfTUFTVEVSKSAmJiAoKChCVVJTVERNQSkgJiAweEZGRkZGQzAwMFUpID09IDB4MDAwMDAwMDBVKSkgXAorICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKFRJTUVSKSA9PSBIUlRJTV9USU1FUklOREVYX1RJTUVSX0EpICYmICgoKEJVUlNURE1BKSAmIDB4RkZFMDAwMDBVKSA9PSAweDAwMDAwMDAwVSkpIFwKKyAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChUSU1FUikgPT0gSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CKSAmJiAoKChCVVJTVERNQSkgJiAweEZGRTAwMDAwVSkgPT0gMHgwMDAwMDAwMFUpKSBcCisgICAgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoVElNRVIpID09IEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQykgJiYgKCgoQlVSU1RETUEpICYgMHhGRkUwMDAwMFUpID09IDB4MDAwMDAwMDBVKSkgXAorICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKFRJTUVSKSA9PSBIUlRJTV9USU1FUklOREVYX1RJTUVSX0QpICYmICgoKEJVUlNURE1BKSAmIDB4RkZFMDAwMDBVKSA9PSAweDAwMDAwMDAwVSkpIFwKKyAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChUSU1FUikgPT0gSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FKSAmJiAoKChCVVJTVERNQSkgJiAweEZGRTAwMDAwVSkgPT0gMHgwMDAwMDAwMFUpKSkgICAKKworI2RlZmluZSBJU19IUlRJTV9CVVJTVE1PREVDVEwoQlVSU1RNT0RFQ1RMKVwKKyAgICAoKChCVVJTVE1PREVDVEwpID09IEhSVElNX0JVUlNUTU9ERUNUTF9ESVNBQkxFRCkgIHx8IFwKKyAgICAgKChCVVJTVE1PREVDVEwpID09IEhSVElNX0JVUlNUTU9ERUNUTF9FTkFCTEVEKSkKKworCisjZGVmaW5lIElTX0hSVElNX1RJTUVSVVBEQVRFKFRJTUVSVVBEQVRFKSAoKChUSU1FUlVQREFURSkgJiAweEZGRkZGRkMwVSkgPT0gMHgwMDAwMDAwMFUpCisKKyNkZWZpbmUgSVNfSFJUSU1fVElNRVJSRVNFVChUSU1FUlJFU0VUKSAoKChUSU1FUlJFU0VUKSAmIDB4RkZGRkMwRkZVKSA9PSAweDAwMDAwMDAwVSkKKworI2RlZmluZSBJU19IUlRJTV9JVChJVCkgKCgoSVQpICYgMHhGRkZDRkZDMFUpID09IDB4MDAwMDAwMDBVKQorCisKKyNkZWZpbmUgSVNfSFJUSU1fTUFTVEVSX0lUKE1BU1RFUl9JVCkgKCgoTUFTVEVSX0lUKSAmIDB4RkZGRkZGODBVKSA9PSAweDAwMDAwMDAwVSkKKworCisjZGVmaW5lIElTX0hSVElNX1RJTV9JVChUSU1fSVQpICgoKFRJTV9JVCkgJiAweEZGRkY4MDIwVSkgPT0gMHgwMDAwMDAwMFUpCisgICAgICAKKworI2RlZmluZSBJU19IUlRJTV9NQVNURVJfRE1BKE1BU1RFUl9ETUEpICgoKE1BU1RFUl9ETUEpICYgMHhGRjgwRkZGRlUpID09IDB4MDAwMDAwMDBVKQorCisjZGVmaW5lIElTX0hSVElNX1RJTV9ETUEoVElNX0RNQSkgKCgoVElNX0RNQSkgJiAweDgwMjBGRkZGVSkgPT0gMHgwMDAwMDAwMFUpICAKKy8qKgorICAqIEB9CisgICovIAorICAKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEhSVElNX0V4cG9ydGVkX01hY3JvcyBIUlRJTSBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmIFJlc2V0IEhSVElNIGhhbmRsZSBzdGF0ZQorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBIUlRJTSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0hSVElNX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9SRVNFVCkKKworLyoqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgdGltZXIgY291bnRlcihzKQorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIEhSVElNIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fVElNRVJTX18gdGltZXJzIHRvIGVuYWJsZS9kaXNhYmxlCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb25zIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklEX01BU1RFUjogTWFzdGVyIHRpbWVyIGlkZW50aWZpZXIKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJRF9USU1FUl9BOiBUaW1lciBBIGlkZW50aWZpZXIKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJRF9USU1FUl9COiBUaW1lciBCIGlkZW50aWZpZXIKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJRF9USU1FUl9DOiBUaW1lciBDIGlkZW50aWZpZXIKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJRF9USU1FUl9EOiBUaW1lciBEIGlkZW50aWZpZXIKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJRF9USU1FUl9FOiBUaW1lciBFIGlkZW50aWZpZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSFJUSU1fRU5BQkxFKF9fSEFORExFX18sIF9fVElNRVJTX18pICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPnNNYXN0ZXJSZWdzLk1DUiB8PSAoX19USU1FUlNfXykpCisgICAgICAgICAgICAgICAgICAgICAKKy8qIFRoZSBjb3VudGVyIG9mIGEgdGltaW5nIHVuaXQgaXMgZGlzYWJsZWQgb25seSBpZiBhbGwgdGhlIHRpbWVyIG91dHB1dHMgKi8KKy8qIGFyZSBkaXNhYmxlZCBhbmQgbm8gY2FwdHVyZSBpcyBjb25maWd1cmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIEhSVElNX1RBT0VOX01BU0sgKEhSVElNX09FTlJfVEEyT0VOIHwgSFJUSU1fT0VOUl9UQTFPRU4pICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgSFJUSU1fVEJPRU5fTUFTSyAoSFJUSU1fT0VOUl9UQjJPRU4gfCBIUlRJTV9PRU5SX1RCMU9FTikgICAgICAgICAgICAgICAgIAorI2RlZmluZSBIUlRJTV9UQ09FTl9NQVNLIChIUlRJTV9PRU5SX1RDMk9FTiB8IEhSVElNX09FTlJfVEMxT0VOKSAgICAgICAgICAgICAgICAgCisjZGVmaW5lIEhSVElNX1RET0VOX01BU0sgKEhSVElNX09FTlJfVEQyT0VOIHwgSFJUSU1fT0VOUl9URDFPRU4pICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgSFJUSU1fVEVPRU5fTUFTSyAoSFJUSU1fT0VOUl9URTJPRU4gfCBIUlRJTV9PRU5SX1RFMU9FTikgICAgICAgICAgICAgICAgIAorI2RlZmluZSBfX0hBTF9IUlRJTV9ESVNBQkxFKF9fSEFORExFX18sIF9fVElNRVJTX18pXAorICBkbyB7XAorICAgIGlmICgoKF9fVElNRVJTX18pICYgSFJUSU1fVElNRVJJRF9NQVNURVIpID09IEhSVElNX1RJTUVSSURfTUFTVEVSKVwKKyAgICAgIHtcCisgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5zTWFzdGVyUmVncy5NQ1IgJj0gfkhSVElNX1RJTUVSSURfTUFTVEVSKTtcCisgICAgICB9XAorICAgIGlmICgoKF9fVElNRVJTX18pICYgSFJUSU1fVElNRVJJRF9USU1FUl9BKSA9PSBIUlRJTV9USU1FUklEX1RJTUVSX0EpXAorICAgICAge1wKKyAgICAgICAgaWYgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5zQ29tbW9uUmVncy5PRU5SICYgSFJUSU1fVEFPRU5fTUFTSykgPT0gUkVTRVQpXAorICAgICAgICAgIHtcCisgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+c01hc3RlclJlZ3MuTUNSICY9IH5IUlRJTV9USU1FUklEX1RJTUVSX0EpO1wKKyAgICAgICAgICB9XAorICAgICAgfVwKKyAgICBpZiAoKChfX1RJTUVSU19fKSAmIEhSVElNX1RJTUVSSURfVElNRVJfQikgPT0gSFJUSU1fVElNRVJJRF9USU1FUl9CKVwKKyAgICAgIHtcCisgICAgICAgIGlmICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuT0VOUiAmIEhSVElNX1RCT0VOX01BU0spID09IFJFU0VUKVwKKyAgICAgICAgICB7XAorICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPnNNYXN0ZXJSZWdzLk1DUiAmPSB+SFJUSU1fVElNRVJJRF9USU1FUl9CKTtcCisgICAgICAgICAgfVwKKyAgICAgIH1cCisgICAgaWYgKCgoX19USU1FUlNfXykgJiBIUlRJTV9USU1FUklEX1RJTUVSX0MpID09IEhSVElNX1RJTUVSSURfVElNRVJfQylcCisgICAgICB7XAorICAgICAgICBpZiAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLk9FTlIgJiBIUlRJTV9UQ09FTl9NQVNLKSA9PSBSRVNFVClcCisgICAgICAgICAge1wKKyAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5zTWFzdGVyUmVncy5NQ1IgJj0gfkhSVElNX1RJTUVSSURfVElNRVJfQyk7XAorICAgICAgICAgIH1cCisgICAgICB9XAorICAgIGlmICgoKF9fVElNRVJTX18pICYgSFJUSU1fVElNRVJJRF9USU1FUl9EKSA9PSBIUlRJTV9USU1FUklEX1RJTUVSX0QpXAorICAgICAge1wKKyAgICAgICAgaWYgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5zQ29tbW9uUmVncy5PRU5SICYgSFJUSU1fVERPRU5fTUFTSykgPT0gUkVTRVQpXAorICAgICAgICAgIHtcCisgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+c01hc3RlclJlZ3MuTUNSICY9IH5IUlRJTV9USU1FUklEX1RJTUVSX0QpO1wKKyAgICAgICAgICB9XAorICAgICAgfVwKKyAgICBpZiAoKChfX1RJTUVSU19fKSAmIEhSVElNX1RJTUVSSURfVElNRVJfRSkgPT0gSFJUSU1fVElNRVJJRF9USU1FUl9FKVwKKyAgICAgIHtcCisgICAgICAgIGlmICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuT0VOUiAmIEhSVElNX1RFT0VOX01BU0spID09IFJFU0VUKVwKKyAgICAgICAgICB7XAorICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPnNNYXN0ZXJSZWdzLk1DUiAmPSB+SFJUSU1fVElNRVJJRF9USU1FUl9FKTtcCisgICAgICAgICAgfVwKKyAgICAgIH1cCisgIH0gd2hpbGUoMFUpCisKKworLyoqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIEhSVElNIGNvbW1vbiBpbnRlcnJ1cHRzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIEhSVElNIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgc291cmNlIHRvIGVuYWJsZSBvciBkaXNhYmxlLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9JVF9GTFQxOiBGYXVsdCAxIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fSVRfRkxUMjogRmF1bHQgMiBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEhSVElNX0lUX0ZMVDM6IEZhdWx0IDMgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9JVF9GTFQ0OiBGYXVsdCA0IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fSVRfRkxUNTogRmF1bHQgNSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEhSVElNX0lUX1NZU0ZMVDogU3lzdGVtIEZhdWx0IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fSVRfRExMUkRZOiBETEwgcmVhZHkgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9JVF9CTVBFUjogQnVyc3QgbW9kZSBwZXJpb2QgaW50ZXJydXB0IGVuYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9IUlRJTV9FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuSUVSIHw9IChfX0lOVEVSUlVQVF9fKSkKKyNkZWZpbmUgX19IQUxfSFJUSU1fRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuSUVSICY9IH4oX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBIUlRJTSBNYXN0ZXIgdGltZXIgaW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBIUlRJTSBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHNvdXJjZSB0byBlbmFibGUgb3IgZGlzYWJsZS4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fTUFTVEVSX0lUX01DTVAxOiBNYXN0ZXIgY29tcGFyZSAxIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fTUFTVEVSX0lUX01DTVAyOiBNYXN0ZXIgY29tcGFyZSAyIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fTUFTVEVSX0lUX01DTVAzOiBNYXN0ZXIgY29tcGFyZSAzIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fTUFTVEVSX0lUX01DTVA0OiBNYXN0ZXIgY29tcGFyZSA0IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fTUFTVEVSX0lUX01SRVA6IE1hc3RlciBSZXBldGl0aW9uIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fTUFTVEVSX0lUX1NZTkM6IFN5bmNocm9uaXphdGlvbiBpbnB1dCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEhSVElNX01BU1RFUl9JVF9NVVBEOiBNYXN0ZXIgdXBkYXRlIGludGVycnVwdCBlbmFibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSFJUSU1fTUFTVEVSX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5zTWFzdGVyUmVncy5NRElFUiB8PSAoX19JTlRFUlJVUFRfXykpCisjZGVmaW5lIF9fSEFMX0hSVElNX01BU1RFUl9ESVNBQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5zTWFzdGVyUmVncy5NRElFUiAmPSB+KF9fSU5URVJSVVBUX18pKQorCisvKiogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgSFJUSU0gVGltZXJ4IGludGVycnVwdHMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSFJUSU0gSGFuZGxlLgorICAqIEBwYXJhbSAgX19USU1FUl9fIHNwZWNpZmllZCB0aGUgdGltaW5nIHVuaXQgKFRpbWVyIEEgdG8gRSkKKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgc291cmNlIHRvIGVuYWJsZSBvciBkaXNhYmxlLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1fSVRfQ01QMTogVGltZXIgY29tcGFyZSAxIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNX0lUX0NNUDI6IFRpbWVyIGNvbXBhcmUgMiBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEhSVElNX1RJTV9JVF9DTVAzOiBUaW1lciBjb21wYXJlIDMgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1fSVRfQ01QNDogVGltZXIgY29tcGFyZSA0IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNX0lUX1JFUDogVGltZXIgcmVwZXRpdGlvbiBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEhSVElNX1RJTV9JVF9VUEQ6IFRpbWVyIHVwZGF0ZSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEhSVElNX1RJTV9JVF9DUFQxOiBUaW1lciBjYXB0dXJlIDEgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1fSVRfQ1BUMjogVGltZXIgY2FwdHVyZSAyIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNX0lUX1NFVDE6IFRpbWVyIG91dHB1dCAxIHNldCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEhSVElNX1RJTV9JVF9SU1QxOiBUaW1lciBvdXRwdXQgMSByZXNldCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEhSVElNX1RJTV9JVF9TRVQyOiBUaW1lciBvdXRwdXQgMiBzZXQgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1fSVRfUlNUMjogVGltZXIgb3V0cHV0IDIgcmVzZXQgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1fSVRfUlNUOiBUaW1lciByZXNldCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEhSVElNX1RJTV9JVF9ETFlQUlQ6IFRpbWVyIGRlbGF5IHByb3RlY3Rpb24gaW50ZXJydXB0IGVuYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9IUlRJTV9USU1FUl9FTkFCTEVfSVQoX19IQU5ETEVfXywgX19USU1FUl9fLCBfX0lOVEVSUlVQVF9fKSAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5zVGltZXJ4UmVnc1soX19USU1FUl9fKV0uVElNeERJRVIgfD0gKF9fSU5URVJSVVBUX18pKQorI2RlZmluZSBfX0hBTF9IUlRJTV9USU1FUl9ESVNBQkxFX0lUKF9fSEFORExFX18sIF9fVElNRVJfXywgX19JTlRFUlJVUFRfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzWyhfX1RJTUVSX18pXS5USU14RElFUiAmPSB+KF9fSU5URVJSVVBUX18pKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBIUlRJTSBjb21tb24gaW50ZXJydXB0ICBzb3VyY2UgIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSFJUSU0gSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEhSVElNX0lUX0ZMVDE6IEZhdWx0IDEgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9JVF9GTFQyOiBGYXVsdCAyIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fSVRfRkxUMzogRmF1bHQgMyBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fSVRfRkxUNDogRmF1bHQgNCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fSVRfRkxUNTogRmF1bHQgNSBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fSVRfU1lTRkxUOiBTeXN0ZW0gRmF1bHQgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9JVF9ETExSRFk6IERMTCByZWFkeSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEhSVElNX0lUX0JNUEVSOiBCdXJzdCBtb2RlIHBlcmlvZCBpbnRlcnJ1cHQgZW5hYmxlCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fSU5URVJSVVBUX18gKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBfX0hBTF9IUlRJTV9HRVRfSVRTVEFUVVMoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLklFUiAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKSA/IFNFVCA6IFJFU0VUKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBIUlRJTSBNYXN0ZXIgaW50ZXJydXB0IHNvdXJjZSAgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBIUlRJTSBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fTUFTVEVSX0lUX01DTVAxOiBNYXN0ZXIgY29tcGFyZSAxIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fTUFTVEVSX0lUX01DTVAyOiBNYXN0ZXIgY29tcGFyZSAyIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fTUFTVEVSX0lUX01DTVAzOiBNYXN0ZXIgY29tcGFyZSAzIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fTUFTVEVSX0lUX01DTVA0OiBNYXN0ZXIgY29tcGFyZSA0IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fTUFTVEVSX0lUX01SRVA6IE1hc3RlciBSZXBldGl0aW9uIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fTUFTVEVSX0lUX1NZTkM6IFN5bmNocm9uaXphdGlvbiBpbnB1dCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEhSVElNX01BU1RFUl9JVF9NVVBEOiBNYXN0ZXIgdXBkYXRlIGludGVycnVwdCBlbmFibGUKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JTlRFUlJVUFRfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX0hSVElNX01BU1RFUl9HRVRfSVRTVEFUVVMoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPnNNYXN0ZXJSZWdzLk1ESUVSICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpID8gU0VUIDogUkVTRVQpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIEhSVElNIFRpbWVyeCBpbnRlcnJ1cHQgc291cmNlICBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIEhSVElNIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fVElNRVJfXyBzcGVjaWZpZWQgdGhlIHRpbWluZyB1bml0IChUaW1lciBBIHRvIEUpCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fTUFTVEVSX0lUX01DTVAxOiBNYXN0ZXIgY29tcGFyZSAxIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fTUFTVEVSX0lUX01DTVAyOiBNYXN0ZXIgY29tcGFyZSAyIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fTUFTVEVSX0lUX01DTVAzOiBNYXN0ZXIgY29tcGFyZSAzIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fTUFTVEVSX0lUX01DTVA0OiBNYXN0ZXIgY29tcGFyZSA0IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fTUFTVEVSX0lUX01SRVA6IE1hc3RlciBSZXBldGl0aW9uIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fTUFTVEVSX0lUX1NZTkM6IFN5bmNocm9uaXphdGlvbiBpbnB1dCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEhSVElNX01BU1RFUl9JVF9NVVBEOiBNYXN0ZXIgdXBkYXRlIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNX0lUX0NNUDE6IFRpbWVyIGNvbXBhcmUgMSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEhSVElNX1RJTV9JVF9DTVAyOiBUaW1lciBjb21wYXJlIDIgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1fSVRfQ01QMzogVGltZXIgY29tcGFyZSAzIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNX0lUX0NNUDQ6IFRpbWVyIGNvbXBhcmUgNCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEhSVElNX1RJTV9JVF9SRVA6IFRpbWVyIHJlcGV0aXRpb24gaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1fSVRfVVBEOiBUaW1lciB1cGRhdGUgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1fSVRfQ1BUMTogVGltZXIgY2FwdHVyZSAxIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNX0lUX0NQVDI6IFRpbWVyIGNhcHR1cmUgMiBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEhSVElNX1RJTV9JVF9TRVQxOiBUaW1lciBvdXRwdXQgMSBzZXQgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1fSVRfUlNUMTogVGltZXIgb3V0cHV0IDEgcmVzZXQgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1fSVRfU0VUMjogVGltZXIgb3V0cHV0IDIgc2V0IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNX0lUX1JTVDI6IFRpbWVyIG91dHB1dCAyIHJlc2V0IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNX0lUX1JTVDogVGltZXIgcmVzZXQgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1fSVRfRExZUFJUOiBUaW1lciBkZWxheSBwcm90ZWN0aW9uIGludGVycnVwdCBlbmFibGUKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JTlRFUlJVUFRfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX0hSVElNX1RJTUVSX0dFVF9JVFNUQVRVUyhfX0hBTkRMRV9fLCBfX1RJTUVSX18sIF9fSU5URVJSVVBUX18pICAgICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5zVGltZXJ4UmVnc1soX19USU1FUl9fKV0uVElNeERJRVIgJiAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSkgPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiAgQ2xlYXJzIHRoZSBzcGVjaWZpZWQgSFJUSU0gY29tbW9uIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBIUlRJTSBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9JVF9GTFQxOiBGYXVsdCAxIGludGVycnVwdCBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEhSVElNX0lUX0ZMVDI6IEZhdWx0IDIgaW50ZXJydXB0IGNsZWFyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fSVRfRkxUMzogRmF1bHQgMyBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEhSVElNX0lUX0ZMVDQ6IEZhdWx0IDQgY2xlYXIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9JVF9GTFQ1OiBGYXVsdCA1IGNsZWFyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fSVRfU1lTRkxUOiBTeXN0ZW0gRmF1bHQgaW50ZXJydXB0IGNsZWFyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fSVRfRExMUkRZOiBETEwgcmVhZHkgaW50ZXJydXB0IGNsZWFyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fSVRfQk1QRVI6IEJ1cnN0IG1vZGUgcGVyaW9kIGludGVycnVwdCBjbGVhciBmbGFnCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0hSVElNX0NMRUFSX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLklDUiA9IChfX0lOVEVSUlVQVF9fKSkgCisKKy8qKiBAYnJpZWYgIENsZWFycyB0aGUgc3BlY2lmaWVkIEhSVElNIE1hc3RlciBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSFJUSU0gSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBwZW5kaW5nIGJpdCB0byBjbGVhci4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fTUFTVEVSX0lUX01DTVAxOiBNYXN0ZXIgY29tcGFyZSAxIGludGVycnVwdCBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEhSVElNX01BU1RFUl9JVF9NQ01QMjogTWFzdGVyIGNvbXBhcmUgMiBpbnRlcnJ1cHQgY2xlYXIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9NQVNURVJfSVRfTUNNUDM6IE1hc3RlciBjb21wYXJlIDMgaW50ZXJydXB0IGNsZWFyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fTUFTVEVSX0lUX01DTVA0OiBNYXN0ZXIgY29tcGFyZSA0IGludGVycnVwdCBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEhSVElNX01BU1RFUl9JVF9NUkVQOiBNYXN0ZXIgUmVwZXRpdGlvbiBpbnRlcnJ1cHQgY2xlYXIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9NQVNURVJfSVRfU1lOQzogU3luY2hyb25pemF0aW9uIGlucHV0IGludGVycnVwdCBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEhSVElNX01BU1RFUl9JVF9NVVBEOiBNYXN0ZXIgdXBkYXRlIGludGVycnVwdCBjbGVhciBmbGFnCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0hSVElNX01BU1RFUl9DTEVBUl9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5zTWFzdGVyUmVncy5NSUNSID0gKF9fSU5URVJSVVBUX18pKSAKKworLyoqIEBicmllZiAgQ2xlYXJzIHRoZSBzcGVjaWZpZWQgSFJUSU0gVGltZXJ4IHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBIUlRJTSBIYW5kbGUuCisgICogQHBhcmFtICBfX1RJTUVSX18gc3BlY2lmaWVkIHRoZSB0aW1pbmcgdW5pdCAoVGltZXIgQSB0byBFKQorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBwZW5kaW5nIGJpdCB0byBjbGVhci4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNX0lUX0NNUDE6IFRpbWVyIGNvbXBhcmUgMSBpbnRlcnJ1cHQgY2xlYXIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1fSVRfQ01QMjogVGltZXIgY29tcGFyZSAyIGludGVycnVwdCBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEhSVElNX1RJTV9JVF9DTVAzOiBUaW1lciBjb21wYXJlIDMgaW50ZXJydXB0IGNsZWFyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNX0lUX0NNUDQ6IFRpbWVyIGNvbXBhcmUgNCBpbnRlcnJ1cHQgY2xlYXIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1fSVRfUkVQOiBUaW1lciByZXBldGl0aW9uIGludGVycnVwdCBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEhSVElNX1RJTV9JVF9VUEQ6IFRpbWVyIHVwZGF0ZSBpbnRlcnJ1cHQgY2xlYXIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1fSVRfQ1BUMTogVGltZXIgY2FwdHVyZSAxIGludGVycnVwdCBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEhSVElNX1RJTV9JVF9DUFQyOiBUaW1lciBjYXB0dXJlIDIgaW50ZXJydXB0IGNsZWFyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNX0lUX1NFVDE6IFRpbWVyIG91dHB1dCAxIHNldCBpbnRlcnJ1cHQgY2xlYXIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1fSVRfUlNUMTogVGltZXIgb3V0cHV0IDEgcmVzZXQgaW50ZXJydXB0IGNsZWFyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNX0lUX1NFVDI6IFRpbWVyIG91dHB1dCAyIHNldCBpbnRlcnJ1cHQgY2xlYXIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1fSVRfUlNUMjogVGltZXIgb3V0cHV0IDIgcmVzZXQgaW50ZXJydXB0IGNsZWFyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNX0lUX1JTVDogVGltZXIgcmVzZXQgaW50ZXJydXB0IGNsZWFyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNX0lUX0RMWVBSVDogVGltZXIgb3V0cHV0IDEgZGVsYXkgcHJvdGVjdGlvbiBpbnRlcnJ1cHQgY2xlYXIgZmxhZworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9IUlRJTV9USU1FUl9DTEVBUl9JVChfX0hBTkRMRV9fLCBfX1RJTUVSX18sIF9fSU5URVJSVVBUX18pICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzWyhfX1RJTUVSX18pXS5USU14SUNSID0gKF9fSU5URVJSVVBUX18pKSAKKworLyogRE1BIEhBTkRMSU5HICovCisvKiogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgSFJUSU0gY29tbW9uIGludGVycnVwdHMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSFJUSU0gSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBzb3VyY2UgdG8gZW5hYmxlIG9yIGRpc2FibGUuCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEhSVElNX0lUX0ZMVDE6IEZhdWx0IDEgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9JVF9GTFQyOiBGYXVsdCAyIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fSVRfRkxUMzogRmF1bHQgMyBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEhSVElNX0lUX0ZMVDQ6IEZhdWx0IDQgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9JVF9GTFQ1OiBGYXVsdCA1IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fSVRfU1lTRkxUOiBTeXN0ZW0gRmF1bHQgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9JVF9ETExSRFk6IERMTCByZWFkeSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEhSVElNX0lUX0JNUEVSOiBCdXJzdCBtb2RlIHBlcmlvZCBpbnRlcnJ1cHQgZW5hYmxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0hSVElNX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5zQ29tbW9uUmVncy5JRVIgfD0gKF9fSU5URVJSVVBUX18pKQorI2RlZmluZSBfX0hBTF9IUlRJTV9ESVNBQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5zQ29tbW9uUmVncy5JRVIgJj0gfihfX0lOVEVSUlVQVF9fKSkKKworLyoqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIEhSVElNIE1hc3RlciB0aW1lciBETUEgcmVxdWV0cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBIUlRJTSBIYW5kbGUuCisgICogQHBhcmFtICBfX0RNQV9fIHNwZWNpZmllcyB0aGUgRE1BIHJlcXVlc3QgdG8gZW5hYmxlIG9yIGRpc2FibGUuCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEhSVElNX01BU1RFUl9ETUFfTUNNUDE6IE1hc3RlciBjb21wYXJlIDEgRE1BIHJlc3F1ZXN0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9NQVNURVJfRE1BX01DTVAyOiBNYXN0ZXIgY29tcGFyZSAyIERNQSByZXNxdWVzdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fTUFTVEVSX0RNQV9NQ01QMzogTWFzdGVyIGNvbXBhcmUgMyBETUEgcmVzcXVlc3QgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEhSVElNX01BU1RFUl9ETUFfTUNNUDQ6IE1hc3RlciBjb21wYXJlIDQgRE1BIHJlc3F1ZXN0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9NQVNURVJfRE1BX01SRVA6IE1hc3RlciBSZXBldGl0aW9uIERNQSByZXNxdWVzdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fTUFTVEVSX0RNQV9TWU5DOiBTeW5jaHJvbml6YXRpb24gaW5wdXQgRE1BIHJlc3F1ZXN0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9NQVNURVJfRE1BX01VUEQ6IE1hc3RlciB1cGRhdGUgRE1BIHJlc3F1ZXN0IGVuYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9IUlRJTV9NQVNURVJfRU5BQkxFX0RNQShfX0hBTkRMRV9fLCBfX0RNQV9fKSAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5zTWFzdGVyUmVncy5NRElFUiB8PSAoX19ETUFfXykpCisjZGVmaW5lIF9fSEFMX0hSVElNX01BU1RFUl9ESVNBQkxFX0RNQShfX0hBTkRMRV9fLCBfX0RNQV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+c01hc3RlclJlZ3MuTURJRVIgJj0gfihfX0RNQV9fKSkKKworLyoqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIEhSVElNIFRpbWVyeCBETUEgcmVxdWVzdHMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSFJUSU0gSGFuZGxlLgorICAqIEBwYXJhbSAgX19USU1FUl9fIHNwZWNpZmllZCB0aGUgdGltaW5nIHVuaXQgKFRpbWVyIEEgdG8gRSkKKyAgKiBAcGFyYW0gIF9fRE1BX18gc3BlY2lmaWVzIHRoZSBETUEgcmVxdWVzdCB0byBlbmFibGUgb3IgZGlzYWJsZS4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNX0RNQV9DTVAxOiBUaW1lciBjb21wYXJlIDEgRE1BIHJlc3F1ZXN0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1fRE1BX0NNUDI6IFRpbWVyIGNvbXBhcmUgMiBETUEgcmVzcXVlc3QgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEhSVElNX1RJTV9ETUFfQ01QMzogVGltZXIgY29tcGFyZSAzIERNQSByZXNxdWVzdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNX0RNQV9DTVA0OiBUaW1lciBjb21wYXJlIDQgRE1BIHJlc3F1ZXN0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1fRE1BX1JFUDogVGltZXIgcmVwZXRpdGlvbiBETUEgcmVzcXVlc3QgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEhSVElNX1RJTV9ETUFfVVBEOiBUaW1lciB1cGRhdGUgRE1BIHJlc3F1ZXN0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1fRE1BX0NQVDE6IFRpbWVyIGNhcHR1cmUgMSBETUEgcmVzcXVlc3QgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEhSVElNX1RJTV9ETUFfQ1BUMjogVGltZXIgY2FwdHVyZSAyIERNQSByZXNxdWVzdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNX0RNQV9TRVQxOiBUaW1lciBvdXRwdXQgMSBzZXQgRE1BIHJlc3F1ZXN0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1fRE1BX1JTVDE6IFRpbWVyIG91dHB1dCAxIHJlc2V0IERNQSByZXNxdWVzdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNX0RNQV9TRVQyOiBUaW1lciBvdXRwdXQgMiBzZXQgRE1BIHJlc3F1ZXN0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1fRE1BX1JTVDI6IFRpbWVyIG91dHB1dCAyIHJlc2V0IERNQSByZXNxdWVzdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNX0RNQV9SU1Q6IFRpbWVyIHJlc2V0IERNQSByZXNxdWVzdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNX0RNQV9ETFlQUlQ6IFRpbWVyIGRlbGF5IHByb3RlY3Rpb24gRE1BIHJlc3F1ZXN0IGVuYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9IUlRJTV9USU1FUl9FTkFCTEVfRE1BKF9fSEFORExFX18sIF9fVElNRVJfXywgX19ETUFfXykgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbKF9fVElNRVJfXyldLlRJTXhESUVSIHw9IChfX0RNQV9fKSkKKyNkZWZpbmUgX19IQUxfSFJUSU1fVElNRVJfRElTQUJMRV9ETUEoX19IQU5ETEVfXywgX19USU1FUl9fLCBfX0RNQV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbKF9fVElNRVJfXyldLlRJTXhESUVSICY9IH4oX19ETUFfXykpCisKKyNkZWZpbmUgX19IQUxfSFJUSU1fR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLklTUiAmIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpCisjZGVmaW5lIF9fSEFMX0hSVElNX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLklDUiA9IChfX0ZMQUdfXykpCisKKyNkZWZpbmUgX19IQUxfSFJUSU1fTUFTVEVSX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5zTWFzdGVyUmVncy5NSVNSICYgKF9fRkxBR19fKSkgPT0gKF9fRkxBR19fKSkKKyNkZWZpbmUgX19IQUxfSFJUSU1fTUFTVEVSX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPnNNYXN0ZXJSZWdzLk1JQ1IgPSAoX19GTEFHX18pKQorCisjZGVmaW5lIF9fSEFMX0hSVElNX1RJTUVSX0dFVF9GTEFHKF9fSEFORExFX18sICBfX1RJTUVSX18sIF9fRkxBR19fKSAgICAgICAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5zVGltZXJ4UmVnc1soX19USU1FUl9fKV0uVElNeElTUiAmIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpCisjZGVmaW5lIF9fSEFMX0hSVElNX1RJTUVSX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgIF9fVElNRVJfXywgX19GTEFHX18pICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzWyhfX1RJTUVSX18pXS5USU14SUNSID0gKF9fRkxBR19fKSkKKworLyoqIEBicmllZiAgU2V0cyB0aGUgSFJUSU0gdGltZXIgQ291bnRlciBSZWdpc3RlciB2YWx1ZSBvbiBydW50aW1lCisgICogQHBhcmFtICBfX0hBTkRMRV9fIEhSVElNIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fVElNRVJfXyBIUlRJTSB0aW1lcgorICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgQGFyZyAweDUgZm9yIG1hc3RlciB0aW1lcgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgMHgwIHRvIDB4NCBmb3IgdGltZXJzIEEgdG8gRSAKKyAgKiBAcGFyYW0gIF9fQ09VTlRFUl9fIHNwZWNpZmllcyB0aGUgQ291bnRlciBSZWdpc3RlciBuZXcgdmFsdWUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0hSVElNX1NFVENPVU5URVIoX19IQU5ETEVfXywgX19USU1FUl9fLCBfX0NPVU5URVJfXykgXAorICAoKChfX1RJTUVSX18pID09IEhSVElNX1RJTUVSSU5ERVhfTUFTVEVSKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5zTWFzdGVyUmVncy5NQ05UUiA9IChfX0NPVU5URVJfXykpIDpcCisgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbKF9fVElNRVJfXyldLkNOVHhSID0gKF9fQ09VTlRFUl9fKSkpCisgICAgCisvKiogQGJyaWVmICBHZXRzIHRoZSBIUlRJTSB0aW1lciBDb3VudGVyIFJlZ2lzdGVyIHZhbHVlIG9uIHJ1bnRpbWUKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gSFJUSU0gSGFuZGxlLgorICAqIEBwYXJhbSAgX19USU1FUl9fIEhSVElNIHRpbWVyCisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIDB4NSBmb3IgbWFzdGVyIHRpbWVyCisgICogICAgICAgICAgICAgICAgICAgQGFyZyAweDAgdG8gMHg0IGZvciB0aW1lcnMgQSB0byBFIAorICAqIEByZXR2YWwgSFJUSU0gdGltZXIgQ291bnRlciBSZWdpc3RlciB2YWx1ZQorICAqLworI2RlZmluZSBfX0hBTF9IUlRJTV9HRVRDT1VOVEVSKF9fSEFORExFX18sIF9fVElNRVJfXykgXAorICAoKChfX1RJTUVSX18pID09IEhSVElNX1RJTUVSSU5ERVhfTUFTVEVSKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5zTWFzdGVyUmVncy5NQ05UUikgOlwKKyAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5zVGltZXJ4UmVnc1soX19USU1FUl9fKV0uQ05UeFIpKQorICAgIAorLyoqIEBicmllZiAgU2V0cyB0aGUgSFJUSU0gdGltZXIgUGVyaW9kIHZhbHVlIG9uIHJ1bnRpbWUKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gSFJUSU0gSGFuZGxlLgorICAqIEBwYXJhbSAgX19USU1FUl9fIEhSVElNIHRpbWVyCisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIDB4NSBmb3IgbWFzdGVyIHRpbWVyCisgICogICAgICAgICAgICAgICAgICAgQGFyZyAweDAgdG8gMHg0IGZvciB0aW1lcnMgQSB0byBFIAorICAqIEBwYXJhbSAgX19QRVJJT0RfXyBzcGVjaWZpZXMgdGhlIFBlcmlvZCBSZWdpc3RlciBuZXcgdmFsdWUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0hSVElNX1NFVFBFUklPRChfX0hBTkRMRV9fLCBfX1RJTUVSX18sIF9fUEVSSU9EX18pIFwKKyAgKCgoX19USU1FUl9fKSA9PSBIUlRJTV9USU1FUklOREVYX01BU1RFUikgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+c01hc3RlclJlZ3MuTVBFUiA9IChfX1BFUklPRF9fKSkgOlwKKyAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5zVGltZXJ4UmVnc1soX19USU1FUl9fKV0uUEVSeFIgPSAoX19QRVJJT0RfXykpKQorICAgIAorLyoqIEBicmllZiAgR2V0cyB0aGUgSFJUSU0gdGltZXIgUGVyaW9kIFJlZ2lzdGVyIHZhbHVlIG9uIHJ1bnRpbWUKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gSFJUSU0gSGFuZGxlLgorICAqIEBwYXJhbSAgX19USU1FUl9fIEhSVElNIHRpbWVyCisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIDB4NSBmb3IgbWFzdGVyIHRpbWVyCisgICogICAgICAgICAgICAgICAgICAgQGFyZyAweDAgdG8gMHg0IGZvciB0aW1lcnMgQSB0byBFIAorICAqIEByZXR2YWwgdGltZXIgUGVyaW9kIFJlZ2lzdGVyCisgICovCisjZGVmaW5lIF9fSEFMX0hSVElNX0dFVFBFUklPRChfX0hBTkRMRV9fLCBfX1RJTUVSX18pIFwKKyAgKCgoX19USU1FUl9fKSA9PSBIUlRJTV9USU1FUklOREVYX01BU1RFUikgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+c01hc3RlclJlZ3MuTVBFUikgOlwKKyAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5zVGltZXJ4UmVnc1soX19USU1FUl9fKV0uUEVSeFIpKQorICAgIAorLyoqIEBicmllZiAgU2V0cyB0aGUgSFJUSU0gdGltZXIgY2xvY2sgcHJlc2NhbGVyIHZhbHVlIG9uIHJ1bnRpbWUKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gSFJUSU0gSGFuZGxlLgorICAqIEBwYXJhbSAgX19USU1FUl9fIEhSVElNIHRpbWVyCisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIDB4NSBmb3IgbWFzdGVyIHRpbWVyCisgICogICAgICAgICAgICAgICAgICAgQGFyZyAweDAgdG8gMHg0IGZvciB0aW1lcnMgQSB0byBFIAorICAqIEBwYXJhbSAgX19QUkVTQ0FMRVJfXyBzcGVjaWZpZXMgdGhlIGNsb2NrIHByZXNjYWxlciBuZXcgdmFsdWUuCisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1BSRVNDQUxFUlJBVElPX01VTDMyOiBmSFJDSzogNC42MDggR0h6IC0gUmVzb2x1dGlvbjogMjE3IHBzIC0gTWluIFBXTSBmcmVxdWVuY3k6IDcwLjMga0h6IChmSFJUSU09MTQ0TUh6KQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fUFJFU0NBTEVSUkFUSU9fTVVMMTY6IGZIUkNLOiAyLjMwNCBHSHogLSBSZXNvbHV0aW9uOiA0MzQgcHMgLSBNaW4gUFdNIGZyZXF1ZW5jeTogMzUuMSBLSHogKGZIUlRJTT0xNDRNSHopCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9QUkVTQ0FMRVJSQVRJT19NVUw4OiBmSFJDSzogMS4xNTIgR0h6IC0gUmVzb2x1dGlvbjogODY4IHBzIC0gTWluIFBXTSBmcmVxdWVuY3k6IDE3LjYga0h6IChmSFJUSU09MTQ0TUh6KQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fUFJFU0NBTEVSUkFUSU9fTVVMNDogZkhSQ0s6IDU3NiBNSHogLSBSZXNvbHV0aW9uOiAxLjczIG5zIC0gTWluIFBXTSBmcmVxdWVuY3k6IDguOCBrSHogKGZIUlRJTT0xNDRNSHopCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9QUkVTQ0FMRVJSQVRJT19NVUwyOiBmSFJDSzogMjg4IE1IeiAtIFJlc29sdXRpb246IDMuNDcgbnMgLSBNaW4gUFdNIGZyZXF1ZW5jeTogNC40IGtIeiAoZkhSVElNPTE0NE1IeikKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1BSRVNDQUxFUlJBVElPX0RJVjE6IGZIUkNLOiAxNDQgTUh6IC0gUmVzb2x1dGlvbjogNi45NSBucyAtIE1pbiBQV00gZnJlcXVlbmN5OiAyLjIga0h6IChmSFJUSU09MTQ0TUh6KQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fUFJFU0NBTEVSUkFUSU9fRElWMjogZkhSQ0s6IDcyIE1IeiAtIFJlc29sdXRpb246IDEzLjg4IG5zLSBNaW4gUFdNIGZyZXF1ZW5jeTogMS4xIGtIeiAoZkhSVElNPTE0NE1IeikKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1BSRVNDQUxFUlJBVElPX0RJVjQ6IGZIUkNLOiAzNiBNSHogLSBSZXNvbHV0aW9uOiAyNy43IG5zLSBNaW4gUFdNIGZyZXF1ZW5jeTogNTUwSHogKGZIUlRJTT0xNDRNSHopCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0hSVElNX1NFVENMT0NLUFJFU0NBTEVSKF9fSEFORExFX18sIF9fVElNRVJfXywgX19QUkVTQ0FMRVJfXykgXAorICAoKChfX1RJTUVSX18pID09IEhSVElNX1RJTUVSSU5ERVhfTUFTVEVSKSA/IChNT0RJRllfUkVHKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPnNNYXN0ZXJSZWdzLk1DUiwgSFJUSU1fTUNSX0NLX1BTQywgKF9fUFJFU0NBTEVSX18pKSkgOlwKKyAgIChNT0RJRllfUkVHKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzWyhfX1RJTUVSX18pXS5USU14Q1IsIEhSVElNX1RJTUNSX0NLX1BTQywgKF9fUFJFU0NBTEVSX18pKSkpCisKKy8qKiBAYnJpZWYgIEdldHMgdGhlIEhSVElNIHRpbWVyIGNsb2NrIHByZXNjYWxlciB2YWx1ZSBvbiBydW50aW1lCisgICogQHBhcmFtICBfX0hBTkRMRV9fIEhSVElNIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fVElNRVJfXyBIUlRJTSB0aW1lcgorICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgQGFyZyAweDUgZm9yIG1hc3RlciB0aW1lcgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgMHgwIHRvIDB4NCBmb3IgdGltZXJzIEEgdG8gRSAKKyAgKiBAcmV0dmFsIHRpbWVyIGNsb2NrIHByZXNjYWxlciB2YWx1ZQorICAqLworI2RlZmluZSBfX0hBTF9IUlRJTV9HRVRDTE9DS1BSRVNDQUxFUihfX0hBTkRMRV9fLCBfX1RJTUVSX18pIFwKKyAgKCgoX19USU1FUl9fKSA9PSBIUlRJTV9USU1FUklOREVYX01BU1RFUikgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+c01hc3RlclJlZ3MuTUNSICYgSFJUSU1fTUNSX0NLX1BTQykgOlwKKyAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5zVGltZXJ4UmVnc1soX19USU1FUl9fKV0uVElNeENSICAmIEhSVElNX1RJTUNSX0NLX1BTQykpCisKKy8qKiBAYnJpZWYgIFNldHMgdGhlIEhSVElNIHRpbWVyIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgb24gcnVudGltZQorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBIUlRJTSBIYW5kbGUuCisgICogQHBhcmFtICBfX1RJTUVSX18gSFJUSU0gdGltZXIKKyAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgMHgwIHRvIDB4NCBmb3IgdGltZXJzIEEgdG8gRSAKKyAgKiBAcGFyYW0gIF9fQ09NUEFSRVVOSVRfXyB0aW1lciBjb21wYXJlIHVuaXQKKyAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fQ09NUEFSRVVOSVRfMTogQ29tcGFyZSB1bml0IDEKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0NPTVBBUkVVTklUXzI6IENvbXBhcmUgdW5pdCAyCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9DT01QQVJFVU5JVF8zOiBDb21wYXJlIHVuaXQgMworICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fQ09NUEFSRVVOSVRfNDogQ29tcGFyZSB1bml0IDQKKyAgKiBAcGFyYW0gIF9fQ09NUEFSRV9fIHNwZWNpZmllcyB0aGUgQ29tcGFyZSBuZXcgdmFsdWUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0hSVElNX1NFVENPTVBBUkUoX19IQU5ETEVfXywgX19USU1FUl9fLCBfX0NPTVBBUkVVTklUX18sIF9fQ09NUEFSRV9fKSBcCisgICAgICAoKChfX1RJTUVSX18pID09IEhSVElNX1RJTUVSSU5ERVhfTUFTVEVSKSA/IFwKKyAgICAgICAgKCgoX19DT01QQVJFVU5JVF9fKSA9PSBIUlRJTV9DT01QQVJFVU5JVF8xKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5zTWFzdGVyUmVncy5NQ01QMVIgPSAoX19DT01QQVJFX18pKSA6XAorICAgICAgICAgKChfX0NPTVBBUkVVTklUX18pID09IEhSVElNX0NPTVBBUkVVTklUXzIpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPnNNYXN0ZXJSZWdzLk1DTVAyUiA9IChfX0NPTVBBUkVfXykpIDpcCisgICAgICAgICAoKF9fQ09NUEFSRVVOSVRfXykgPT0gSFJUSU1fQ09NUEFSRVVOSVRfMykgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+c01hc3RlclJlZ3MuTUNNUDNSID0gKF9fQ09NUEFSRV9fKSkgOlwKKyAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5zTWFzdGVyUmVncy5NQ01QNFIgPSAoX19DT01QQVJFX18pKSkgXAorICAgICAgICAgOiBcCisgICAgICAgICgoKF9fQ09NUEFSRVVOSVRfXykgPT0gSFJUSU1fQ09NUEFSRVVOSVRfMSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbKF9fVElNRVJfXyldLkNNUDF4UiA9IChfX0NPTVBBUkVfXykpIDpcCisgICAgICAgICAoKF9fQ09NUEFSRVVOSVRfXykgPT0gSFJUSU1fQ09NUEFSRVVOSVRfMikgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbKF9fVElNRVJfXyldLkNNUDJ4UiA9IChfX0NPTVBBUkVfXykpIDpcCisgICAgICAgICAoKF9fQ09NUEFSRVVOSVRfXykgPT0gSFJUSU1fQ09NUEFSRVVOSVRfMykgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbKF9fVElNRVJfXyldLkNNUDN4UiA9IChfX0NPTVBBUkVfXykpIDpcCisgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbKF9fVElNRVJfXyldLkNNUDR4UiA9IChfX0NPTVBBUkVfXykpKSkKKyAgICAgICAgCisvKiogQGJyaWVmICBHZXRzIHRoZSBIUlRJTSB0aW1lciBDb21wYXJlIFJlZ2lzdGVyIHZhbHVlIG9uIHJ1bnRpbWUKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gSFJUSU0gSGFuZGxlLgorICAqIEBwYXJhbSAgX19USU1FUl9fIEhSVElNIHRpbWVyCisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIDB4MCB0byAweDQgZm9yIHRpbWVycyBBIHRvIEUgCisgICogQHBhcmFtICBfX0NPTVBBUkVVTklUX18gdGltZXIgY29tcGFyZSB1bml0CisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0NPTVBBUkVVTklUXzE6IENvbXBhcmUgdW5pdCAxCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9DT01QQVJFVU5JVF8yOiBDb21wYXJlIHVuaXQgMgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fQ09NUEFSRVVOSVRfMzogQ29tcGFyZSB1bml0IDMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0NPTVBBUkVVTklUXzQ6IENvbXBhcmUgdW5pdCA0CisgICogQHJldHZhbCBDb21wYXJlIHZhbHVlCisgICovCisjZGVmaW5lIF9fSEFMX0hSVElNX0dFVENPTVBBUkUoX19IQU5ETEVfXywgX19USU1FUl9fLCBfX0NPTVBBUkVVTklUX18pIFwKKyAgICAgICgoKF9fVElNRVJfXykgPT0gSFJUSU1fVElNRVJJTkRFWF9NQVNURVIpID8gXAorICAgICAgICAoKChfX0NPTVBBUkVVTklUX18pID09IEhSVElNX0NPTVBBUkVVTklUXzEpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPnNNYXN0ZXJSZWdzLk1DTVAxUikgOlwKKyAgICAgICAgICgoX19DT01QQVJFVU5JVF9fKSA9PSBIUlRJTV9DT01QQVJFVU5JVF8yKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5zTWFzdGVyUmVncy5NQ01QMlIpIDpcCisgICAgICAgICAoKF9fQ09NUEFSRVVOSVRfXykgPT0gSFJUSU1fQ09NUEFSRVVOSVRfMykgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+c01hc3RlclJlZ3MuTUNNUDNSKSA6XAorICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPnNNYXN0ZXJSZWdzLk1DTVA0UikpIFwKKyAgICAgICAgIDogXAorICAgICAgICAoKChfX0NPTVBBUkVVTklUX18pID09IEhSVElNX0NPTVBBUkVVTklUXzEpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzWyhfX1RJTUVSX18pXS5DTVAxeFIpIDpcCisgICAgICAgICAoKF9fQ09NUEFSRVVOSVRfXykgPT0gSFJUSU1fQ09NUEFSRVVOSVRfMikgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbKF9fVElNRVJfXyldLkNNUDJ4UikgOlwKKyAgICAgICAgICgoX19DT01QQVJFVU5JVF9fKSA9PSBIUlRJTV9DT01QQVJFVU5JVF8zKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5zVGltZXJ4UmVnc1soX19USU1FUl9fKV0uQ01QM3hSKSA6XAorICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzWyhfX1RJTUVSX18pXS5DTVA0eFIpKSkKKworLyoqCisgICogQH0KKyAgKi8gCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgSFJUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zCisqIEB7CisqLworCisvKiogQGFkZHRvZ3JvdXAgSFJUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorKiBAeworKi8KKworLyogSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9Jbml0KEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9EZUluaXQgKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSk7CisKK3ZvaWQgSEFMX0hSVElNX01zcEluaXQoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltKTsKKwordm9pZCBIQUxfSFJUSU1fTXNwRGVJbml0KEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9UaW1lQmFzZUNvbmZpZyhIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fVGltZUJhc2VDZmdUeXBlRGVmICogcFRpbWVCYXNlQ2ZnKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX0RMTENhbGlicmF0aW9uU3RhcnQoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2FsaWJyYXRpb25SYXRlKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX0RMTENhbGlicmF0aW9uU3RhcnRfSVQoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2FsaWJyYXRpb25SYXRlKTsKKyAKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9Qb2xsRm9yRExMQ2FsaWJyYXRpb24oSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lb3V0KTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEhSVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyogQHsKKyovCisKKy8qIFNpbXBsZSB0aW1lIGJhc2UgcmVsYXRlZCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1NpbXBsZUJhc2VTdGFydChIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fU2ltcGxlQmFzZVN0b3AoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fU2ltcGxlQmFzZVN0YXJ0X0lUKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9TaW1wbGVCYXNlU3RvcF9JVChIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9TaW1wbGVCYXNlU3RhcnRfRE1BKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNyY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERlc3RBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBMZW5ndGgpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fU2ltcGxlQmFzZVN0b3BfRE1BKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBIUlRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzCisqIEB7CisqLworLyogU2ltcGxlIG91dHB1dCBjb21wYXJlIHJlbGF0ZWQgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fU2ltcGxlT0NDaGFubmVsQ29uZmlnKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPQ0NoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fU2ltcGxlT0NDaGFubmVsQ2ZnVHlwZURlZiogcFNpbXBsZU9DQ2hhbm5lbENmZyk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9TaW1wbGVPQ1N0YXJ0KEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE9DQ2hhbm5lbCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9TaW1wbGVPQ1N0b3AoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE9DQ2hhbm5lbCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9TaW1wbGVPQ1N0YXJ0X0lUKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE9DQ2hhbm5lbCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9TaW1wbGVPQ1N0b3BfSVQoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE9DQ2hhbm5lbCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9TaW1wbGVPQ1N0YXJ0X0RNQShIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE9DQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNyY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBEZXN0QWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IExlbmd0aCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9TaW1wbGVPQ1N0b3BfRE1BKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE9DQ2hhbm5lbCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBIUlRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0CisqIEB7CisqLworLyogU2ltcGxlIFBXTSBvdXRwdXQgcmVsYXRlZCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fU2ltcGxlUFdNQ2hhbm5lbENvbmZpZyhIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQV01DaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9TaW1wbGVQV01DaGFubmVsQ2ZnVHlwZURlZiogcFNpbXBsZVBXTUNoYW5uZWxDZmcpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fU2ltcGxlUFdNU3RhcnQoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQV01DaGFubmVsKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1NpbXBsZVBXTVN0b3AoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUFdNQ2hhbm5lbCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9TaW1wbGVQV01TdGFydF9JVChIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBXTUNoYW5uZWwpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fU2ltcGxlUFdNU3RvcF9JVChIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQV01DaGFubmVsKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1NpbXBsZVBXTVN0YXJ0X0RNQShIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUFdNQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTcmNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERlc3RBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IExlbmd0aCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9TaW1wbGVQV01TdG9wX0RNQShIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBXTUNoYW5uZWwpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgSFJUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNQorKiBAeworKi8KKy8qIFNpbXBsZSBjYXB0dXJlIHJlbGF0ZWQgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1NpbXBsZUNhcHR1cmVDaGFubmVsQ29uZmlnKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2FwdHVyZUNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9TaW1wbGVDYXB0dXJlQ2hhbm5lbENmZ1R5cGVEZWYqIHBTaW1wbGVDYXB0dXJlQ2hhbm5lbENmZyk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9TaW1wbGVDYXB0dXJlU3RhcnQoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENhcHR1cmVDaGFubmVsKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1NpbXBsZUNhcHR1cmVTdG9wKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2FwdHVyZUNoYW5uZWwpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fU2ltcGxlQ2FwdHVyZVN0YXJ0X0lUKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDYXB0dXJlQ2hhbm5lbCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9TaW1wbGVDYXB0dXJlU3RvcF9JVChIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENhcHR1cmVDaGFubmVsKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1NpbXBsZUNhcHR1cmVTdGFydF9ETUEoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2FwdHVyZUNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNyY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERlc3RBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBMZW5ndGgpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fU2ltcGxlQ2FwdHVyZVN0b3BfRE1BKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDYXB0dXJlQ2hhbm5lbCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBIUlRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA2CisqIEB7CisqLworLyogU2ltcGxlIG9uZSBwdWxzZSByZWxhdGVkIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fU2ltcGxlT25lUHVsc2VDaGFubmVsQ29uZmlnKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPbmVQdWxzZUNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fU2ltcGxlT25lUHVsc2VDaGFubmVsQ2ZnVHlwZURlZiogcFNpbXBsZU9uZVB1bHNlQ2hhbm5lbENmZyk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9TaW1wbGVPbmVQdWxzZVN0YXJ0KEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE9uZVB1bHNlQ2hhbm5lbCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9TaW1wbGVPbmVQdWxzZVN0b3AoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT25lUHVsc2VDaGFubmVsKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1NpbXBsZU9uZVB1bHNlU3RhcnRfSVQoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT25lUHVsc2VDaGFubmVsKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1NpbXBsZU9uZVB1bHNlU3RvcF9JVChIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT25lUHVsc2VDaGFubmVsKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEhSVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDcKKyogQHsKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fQnVyc3RNb2RlQ29uZmlnKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fQnVyc3RNb2RlQ2ZnVHlwZURlZiogcEJ1cnN0TW9kZUNmZyk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9FdmVudENvbmZpZyhIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fRXZlbnRDZmdUeXBlRGVmKiBwRXZlbnRDZmcpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fRXZlbnRQcmVzY2FsZXJDb25maWcoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFByZXNjYWxlcik7CisgCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fRmF1bHRDb25maWcoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX0ZhdWx0Q2ZnVHlwZURlZiogcEZhdWx0Q2ZnKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX0ZhdWx0UHJlc2NhbGVyQ29uZmlnKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQcmVzY2FsZXIpOworCit2b2lkIEhBTF9IUlRJTV9GYXVsdE1vZGVDdGwoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRmF1bHRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBFbmFibGUpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fQURDVHJpZ2dlckNvbmZpZyhIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBRENUcmlnZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fQURDVHJpZ2dlckNmZ1R5cGVEZWYqIHBBRENUcmlnZ2VyQ2ZnKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEhSVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDgKKyogQHsKKyovCisvKiBXYXZlZm9ybSByZWxhdGVkIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1dhdmVmb3JtVGltZXJDb25maWcoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9UaW1lckNmZ1R5cGVEZWYgKiBwVGltZXJDZmcpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fV2F2ZWZvcm1Db21wYXJlQ29uZmlnKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENvbXBhcmVVbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9Db21wYXJlQ2ZnVHlwZURlZiogcENvbXBhcmVDZmcpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fV2F2ZWZvcm1DYXB0dXJlQ29uZmlnKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENhcHR1cmVVbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9DYXB0dXJlQ2ZnVHlwZURlZiogcENhcHR1cmVDZmcpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fV2F2ZWZvcm1PdXRwdXRDb25maWcoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9PdXRwdXRDZmdUeXBlRGVmICogcE91dHB1dENmZyk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9XYXZlZm9ybVNldE91dHB1dExldmVsKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT3V0cHV0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE91dHB1dExldmVsKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1RpbWVyRXZlbnRGaWx0ZXJpbmdDb25maWcoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX1RpbWVyRXZlbnRGaWx0ZXJpbmdDZmdUeXBlRGVmICogcFRpbWVyRXZlbnRGaWx0ZXJpbmdDZmcpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fRGVhZFRpbWVDb25maWcoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX0RlYWRUaW1lQ2ZnVHlwZURlZiogcERlYWRUaW1lQ2ZnKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX0Nob3BwZXJNb2RlQ29uZmlnKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9DaG9wcGVyTW9kZUNmZ1R5cGVEZWYqIHBDaG9wcGVyTW9kZUNmZyk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9CdXJzdERNQUNvbmZpZyhIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUmVnaXN0ZXJzVG9VcGRhdGUpOworCisgCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudGVyU3RhcnQoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVycyk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50ZXJTdG9wKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcnMpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudGVyU3RhcnRfSVQoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVycyk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50ZXJTdG9wX0lUKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcnMpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudGVyU3RhcnRfRE1BKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJzKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1dhdmVmb3JtQ291bnRlclN0b3BfRE1BKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcnMpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fV2F2ZWZvcm1PdXRwdXRTdGFydChIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPdXRwdXRzVG9TdGFydCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9XYXZlZm9ybU91dHB1dFN0b3AoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPdXRwdXRzVG9TdG9wKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX0J1cnN0TW9kZUN0bChIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEVuYWJsZSk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9CdXJzdE1vZGVTb2Z0d2FyZVRyaWdnZXIoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1NvZnR3YXJlQ2FwdHVyZShIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDYXB0dXJlVW5pdCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9Tb2Z0d2FyZVVwZGF0ZShIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJzKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1NvZnR3YXJlUmVzZXQoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJzKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX0J1cnN0RE1BVHJhbnNmZXIoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdXJzdEJ1ZmZlckFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdXJzdEJ1ZmZlckxlbmd0aCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9VcGRhdGVFbmFibGUoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJzKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1VwZGF0ZURpc2FibGUoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJzKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEhSVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDkKKyogQHsKKyovCisvKiBIUlRJTSBwZXJpcGhlcmFsIHN0YXRlIGZ1bmN0aW9ucyAqLworSEFMX0hSVElNX1N0YXRlVHlwZURlZiBIQUxfSFJUSU1fR2V0U3RhdGUoSFJUSU1fSGFuZGxlVHlwZURlZiogaGhydGltKTsKKwordWludDMyX3QgSEFMX0hSVElNX0dldENhcHR1cmVkVmFsdWUoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2FwdHVyZVVuaXQpOworCit1aW50MzJfdCBIQUxfSFJUSU1fV2F2ZWZvcm1HZXRPdXRwdXRMZXZlbChIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE91dHB1dCk7CisKK3VpbnQzMl90IEhBTF9IUlRJTV9XYXZlZm9ybUdldE91dHB1dFN0YXRlKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK3VpbnQzMl90IEhBTF9IUlRJTV9HZXREZWxheWVkUHJvdGVjdGlvblN0YXR1cyhIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT3V0cHV0KTsKKwordWludDMyX3QgSEFMX0hSVElNX0dldEJ1cnN0U3RhdHVzKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSk7CisKK3VpbnQzMl90IEhBTF9IUlRJTV9HZXRDdXJyZW50UHVzaFB1bGxTdGF0dXMoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCk7CisKK3VpbnQzMl90IEhBTF9IUlRJTV9HZXRJZGxlUHVzaFB1bGxTdGF0dXMoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBIUlRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxMAorKiBAeworKi8KKy8qIElSUSBoYW5kbGVyICovCit2b2lkIEhBTF9IUlRJTV9JUlFIYW5kbGVyKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgpOworCisvKiBIUlRJTSBldmVudHMgcmVsYXRlZCBjYWxsYmFjayBmdW5jdGlvbnMgKi8KK3ZvaWQgSEFMX0hSVElNX0ZhdWx0MUNhbGxiYWNrKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSk7Cit2b2lkIEhBTF9IUlRJTV9GYXVsdDJDYWxsYmFjayhIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0pOwordm9pZCBIQUxfSFJUSU1fRmF1bHQzQ2FsbGJhY2soSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltKTsKK3ZvaWQgSEFMX0hSVElNX0ZhdWx0NENhbGxiYWNrKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSk7Cit2b2lkIEhBTF9IUlRJTV9GYXVsdDVDYWxsYmFjayhIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0pOwordm9pZCBIQUxfSFJUSU1fU3lzdGVtRmF1bHRDYWxsYmFjayhIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0pOwordm9pZCBIQUxfSFJUSU1fRExMQ2FsYnJhdGlvblJlYWR5Q2FsbGJhY2soSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltKTsKK3ZvaWQgSEFMX0hSVElNX0J1cnN0TW9kZVBlcmlvZENhbGxiYWNrKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSk7Cit2b2lkIEhBTF9IUlRJTV9TeW5jaHJvbml6YXRpb25FdmVudENhbGxiYWNrKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSk7CisKKy8qIFRpbWVyIGV2ZW50cyByZWxhdGVkIGNhbGxiYWNrIGZ1bmN0aW9ucyAqLwordm9pZCBIQUxfSFJUSU1fUmVnaXN0ZXJzVXBkYXRlQ2FsbGJhY2soSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4KTsKK3ZvaWQgSEFMX0hSVElNX1JlcGV0aXRpb25FdmVudENhbGxiYWNrKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCk7Cit2b2lkIEhBTF9IUlRJTV9Db21wYXJlMUV2ZW50Q2FsbGJhY2soSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCk7Cit2b2lkIEhBTF9IUlRJTV9Db21wYXJlMkV2ZW50Q2FsbGJhY2soSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCk7Cit2b2lkIEhBTF9IUlRJTV9Db21wYXJlM0V2ZW50Q2FsbGJhY2soSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCk7Cit2b2lkIEhBTF9IUlRJTV9Db21wYXJlNEV2ZW50Q2FsbGJhY2soSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCk7Cit2b2lkIEhBTF9IUlRJTV9DYXB0dXJlMUV2ZW50Q2FsbGJhY2soSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCk7Cit2b2lkIEhBTF9IUlRJTV9DYXB0dXJlMkV2ZW50Q2FsbGJhY2soSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCk7Cit2b2lkIEhBTF9IUlRJTV9EZWxheWVkUHJvdGVjdGlvbkNhbGxiYWNrKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4KTsKK3ZvaWQgSEFMX0hSVElNX0NvdW50ZXJSZXNldENhbGxiYWNrKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCk7Cit2b2lkIEhBTF9IUlRJTV9PdXRwdXQxU2V0Q2FsbGJhY2soSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCk7Cit2b2lkIEhBTF9IUlRJTV9PdXRwdXQxUmVzZXRDYWxsYmFjayhIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgpOwordm9pZCBIQUxfSFJUSU1fT3V0cHV0MlNldENhbGxiYWNrKEhSVElNX0hhbmRsZVR5cGVEZWYgKmhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgpOwordm9pZCBIQUxfSFJUSU1fT3V0cHV0MlJlc2V0Q2FsbGJhY2soSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4KTsKK3ZvaWQgSEFMX0hSVElNX0J1cnN0RE1BVHJhbnNmZXJDYWxsYmFjayhIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4KTsKK3ZvaWQgSEFMX0hSVElNX0Vycm9yQ2FsbGJhY2soSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltKTsKKworLyoqCisgICogQH0KKyAgKi8gCisKKy8qKgorICAqIEB9CisgICovIAorCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqCisgICogQH0KKyAgKi8gCisKKyNlbmRpZiAvKiBIUlRJTTEgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJGM3h4X0hBTF9IUlRJTV9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2hhbF9pMmMuaCBiL0luYy9zdG0zMmYzeHhfaGFsX2kyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MmUwNmIKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2hhbF9pMmMuaApAQCAtMCwwICsxLDcxMCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfaTJjLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIEkyQyBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkYzeHhfSEFMX0kyQ19ICisjZGVmaW5lIF9fU1RNMzJGM3h4X0hBTF9JMkNfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEkyQworICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEkyQ19FeHBvcnRlZF9UeXBlcyBJMkMgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19Db25maWd1cmF0aW9uX1N0cnVjdHVyZV9kZWZpbml0aW9uIEkyQyBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICogQGJyaWVmICBJMkMgQ29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqIEB7CisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBUaW1pbmc7ICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgSTJDX1RJTUlOR1JfcmVnaXN0ZXIgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FsY3VsYXRlZCBieSByZWZlcnJpbmcgdG8gSTJDIGluaXRpYWxpemF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gaW4gUmVmZXJlbmNlIG1hbnVhbCAqLworCisgIHVpbnQzMl90IE93bkFkZHJlc3MxOyAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBmaXJzdCBkZXZpY2Ugb3duIGFkZHJlc3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgNy1iaXQgb3IgMTAtYml0IGFkZHJlc3MuICovCisKKyAgdWludDMyX3QgQWRkcmVzc2luZ01vZGU7ICAgICAgLyohPCBTcGVjaWZpZXMgaWYgNy1iaXQgb3IgMTAtYml0IGFkZHJlc3NpbmcgbW9kZSBpcyBzZWxlY3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyQ19BRERSRVNTSU5HX01PREUgKi8KKworICB1aW50MzJfdCBEdWFsQWRkcmVzc01vZGU7ICAgICAvKiE8IFNwZWNpZmllcyBpZiBkdWFsIGFkZHJlc3NpbmcgbW9kZSBpcyBzZWxlY3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyQ19EVUFMX0FERFJFU1NJTkdfTU9ERSAqLworCisgIHVpbnQzMl90IE93bkFkZHJlc3MyOyAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzZWNvbmQgZGV2aWNlIG93biBhZGRyZXNzIGlmIGR1YWwgYWRkcmVzc2luZyBtb2RlIGlzIHNlbGVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgNy1iaXQgYWRkcmVzcy4gKi8KKworICB1aW50MzJfdCBPd25BZGRyZXNzMk1hc2tzOyAgICAvKiE8IFNwZWNpZmllcyB0aGUgYWNrbm93bGVkZ2UgbWFzayBhZGRyZXNzIHNlY29uZCBkZXZpY2Ugb3duIGFkZHJlc3MgaWYgZHVhbCBhZGRyZXNzaW5nIG1vZGUgaXMgc2VsZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyQ19PV05fQUREUkVTUzJfTUFTS1MgKi8KKworICB1aW50MzJfdCBHZW5lcmFsQ2FsbE1vZGU7ICAgICAvKiE8IFNwZWNpZmllcyBpZiBnZW5lcmFsIGNhbGwgbW9kZSBpcyBzZWxlY3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyQ19HRU5FUkFMX0NBTExfQUREUkVTU0lOR19NT0RFICovCisKKyAgdWludDMyX3QgTm9TdHJldGNoTW9kZTsgICAgICAgLyohPCBTcGVjaWZpZXMgaWYgbm9zdHJldGNoIG1vZGUgaXMgc2VsZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMkNfTk9TVFJFVENIX01PREUgKi8KKworfSBJMkNfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX3N0YXRlX3N0cnVjdHVyZV9kZWZpbml0aW9uIEhBTCBzdGF0ZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqIEBicmllZiAgSEFMIFN0YXRlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICogQG5vdGUgIEhBTCBJMkMgU3RhdGUgdmFsdWUgY29kaW5nIGZvbGxvdyBiZWxvdyBkZXNjcmliZWQgYml0bWFwIDpcbgorICAqICAgICAgICAgIGI3LWI2ICBFcnJvciBpbmZvcm1hdGlvblxuCisgICogICAgICAgICAgICAgMDAgOiBObyBFcnJvclxuCisgICogICAgICAgICAgICAgMDEgOiBBYm9ydCAoQWJvcnQgdXNlciByZXF1ZXN0IG9uIGdvaW5nKVxuCisgICogICAgICAgICAgICAgMTAgOiBUaW1lb3V0XG4KKyAgKiAgICAgICAgICAgICAxMSA6IEVycm9yXG4KKyAgKiAgICAgICAgICBiNSAgICAgSVAgaW5pdGlsaXNhdGlvbiBzdGF0dXNcbgorICAqICAgICAgICAgICAgIDAgIDogUmVzZXQgKElQIG5vdCBpbml0aWFsaXplZClcbgorICAqICAgICAgICAgICAgIDEgIDogSW5pdCBkb25lIChJUCBpbml0aWFsaXplZCBhbmQgcmVhZHkgdG8gdXNlLiBIQUwgSTJDIEluaXQgZnVuY3Rpb24gY2FsbGVkKVxuCisgICogICAgICAgICAgYjQgICAgIChub3QgdXNlZClcbgorICAqICAgICAgICAgICAgIHggIDogU2hvdWxkIGJlIHNldCB0byAwXG4KKyAgKiAgICAgICAgICBiM1xuCisgICogICAgICAgICAgICAgMCAgOiBSZWFkeSBvciBCdXN5IChObyBMaXN0ZW4gbW9kZSBvbmdvaW5nKVxuCisgICogICAgICAgICAgICAgMSAgOiBMaXN0ZW4gKElQIGluIEFkZHJlc3MgTGlzdGVuIE1vZGUpXG4KKyAgKiAgICAgICAgICBiMiAgICAgSW50cmluc2ljIHByb2Nlc3Mgc3RhdGVcbgorICAqICAgICAgICAgICAgIDAgIDogUmVhZHlcbgorICAqICAgICAgICAgICAgIDEgIDogQnVzeSAoSVAgYnVzeSB3aXRoIHNvbWUgY29uZmlndXJhdGlvbiBvciBpbnRlcm5hbCBvcGVyYXRpb25zKVxuCisgICogICAgICAgICAgYjEgICAgIFJ4IHN0YXRlXG4KKyAgKiAgICAgICAgICAgICAwICA6IFJlYWR5IChubyBSeCBvcGVyYXRpb24gb25nb2luZylcbgorICAqICAgICAgICAgICAgIDEgIDogQnVzeSAoUnggb3BlcmF0aW9uIG9uZ29pbmcpXG4KKyAgKiAgICAgICAgICBiMCAgICAgVHggc3RhdGVcbgorICAqICAgICAgICAgICAgIDAgIDogUmVhZHkgKG5vIFR4IG9wZXJhdGlvbiBvbmdvaW5nKVxuCisgICogICAgICAgICAgICAgMSAgOiBCdXN5IChUeCBvcGVyYXRpb24gb25nb2luZykKKyAgKiBAeworICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9JMkNfU1RBVEVfUkVTRVQgICAgICAgICAgICAgPSAweDAwVSwgICAvKiE8IFBlcmlwaGVyYWwgaXMgbm90IHlldCBJbml0aWFsaXplZCAgICAgICAgICovCisgIEhBTF9JMkNfU1RBVEVfUkVBRFkgICAgICAgICAgICAgPSAweDIwVSwgICAvKiE8IFBlcmlwaGVyYWwgSW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UgICovCisgIEhBTF9JMkNfU1RBVEVfQlVTWSAgICAgICAgICAgICAgPSAweDI0VSwgICAvKiE8IEFuIGludGVybmFsIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgICovCisgIEhBTF9JMkNfU1RBVEVfQlVTWV9UWCAgICAgICAgICAgPSAweDIxVSwgICAvKiE8IERhdGEgVHJhbnNtaXNzaW9uIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICovCisgIEhBTF9JMkNfU1RBVEVfQlVTWV9SWCAgICAgICAgICAgPSAweDIyVSwgICAvKiE8IERhdGEgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICovCisgIEhBTF9JMkNfU1RBVEVfTElTVEVOICAgICAgICAgICAgPSAweDI4VSwgICAvKiE8IEFkZHJlc3MgTGlzdGVuIE1vZGUgaXMgb25nb2luZyAgICAgICAgICAgICovCisgIEhBTF9JMkNfU1RBVEVfQlVTWV9UWF9MSVNURU4gICAgPSAweDI5VSwgICAvKiE8IEFkZHJlc3MgTGlzdGVuIE1vZGUgYW5kIERhdGEgVHJhbnNtaXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEhBTF9JMkNfU1RBVEVfQlVTWV9SWF9MSVNURU4gICAgPSAweDJBVSwgICAvKiE8IEFkZHJlc3MgTGlzdGVuIE1vZGUgYW5kIERhdGEgUmVjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEhBTF9JMkNfU1RBVEVfQUJPUlQgICAgICAgICAgICAgPSAweDYwVSwgICAvKiE8IEFib3J0IHVzZXIgcmVxdWVzdCBvbmdvaW5nICAgICAgICAgICAgICAgICovCisgIEhBTF9JMkNfU1RBVEVfVElNRU9VVCAgICAgICAgICAgPSAweEEwVSwgICAvKiE8IFRpbWVvdXQgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEhBTF9JMkNfU1RBVEVfRVJST1IgICAgICAgICAgICAgPSAweEUwVSAgICAvKiE8IEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK30gSEFMX0kyQ19TdGF0ZVR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX21vZGVfc3RydWN0dXJlX2RlZmluaXRpb24gSEFMIG1vZGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAYnJpZWYgIEhBTCBNb2RlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICogQG5vdGUgIEhBTCBJMkMgTW9kZSB2YWx1ZSBjb2RpbmcgZm9sbG93IGJlbG93IGRlc2NyaWJlZCBiaXRtYXAgOlxuCisgICogICAgICAgICAgYjcgICAgIChub3QgdXNlZClcbgorICAqICAgICAgICAgICAgIHggIDogU2hvdWxkIGJlIHNldCB0byAwXG4KKyAgKiAgICAgICAgICBiNlxuCisgICogICAgICAgICAgICAgMCAgOiBOb25lXG4KKyAgKiAgICAgICAgICAgICAxICA6IE1lbW9yeSAoSEFMIEkyQyBjb21tdW5pY2F0aW9uIGlzIGluIE1lbW9yeSBNb2RlKVxuCisgICogICAgICAgICAgYjVcbgorICAqICAgICAgICAgICAgIDAgIDogTm9uZVxuCisgICogICAgICAgICAgICAgMSAgOiBTbGF2ZSAoSEFMIEkyQyBjb21tdW5pY2F0aW9uIGlzIGluIFNsYXZlIE1vZGUpXG4KKyAgKiAgICAgICAgICBiNFxuCisgICogICAgICAgICAgICAgMCAgOiBOb25lXG4KKyAgKiAgICAgICAgICAgICAxICA6IE1hc3RlciAoSEFMIEkyQyBjb21tdW5pY2F0aW9uIGlzIGluIE1hc3RlciBNb2RlKVxuCisgICogICAgICAgICAgYjMtYjItYjEtYjAgIChub3QgdXNlZClcbgorICAqICAgICAgICAgICAgIHh4eHggOiBTaG91bGQgYmUgc2V0IHRvIDAwMDAKKyAgKiBAeworICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9JMkNfTU9ERV9OT05FICAgICAgICAgICAgICAgPSAweDAwVSwgICAvKiE8IE5vIEkyQyBjb21tdW5pY2F0aW9uIG9uIGdvaW5nICAgICAgICAgICAgICovCisgIEhBTF9JMkNfTU9ERV9NQVNURVIgICAgICAgICAgICAgPSAweDEwVSwgICAvKiE8IEkyQyBjb21tdW5pY2F0aW9uIGlzIGluIE1hc3RlciBNb2RlICAgICAgICovCisgIEhBTF9JMkNfTU9ERV9TTEFWRSAgICAgICAgICAgICAgPSAweDIwVSwgICAvKiE8IEkyQyBjb21tdW5pY2F0aW9uIGlzIGluIFNsYXZlIE1vZGUgICAgICAgICovCisgIEhBTF9JMkNfTU9ERV9NRU0gICAgICAgICAgICAgICAgPSAweDQwVSAgICAvKiE8IEkyQyBjb21tdW5pY2F0aW9uIGlzIGluIE1lbW9yeSBNb2RlICAgICAgICovCisKK30gSEFMX0kyQ19Nb2RlVHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfRXJyb3JfQ29kZV9kZWZpbml0aW9uIEkyQyBFcnJvciBDb2RlIGRlZmluaXRpb24KKyAgKiBAYnJpZWYgIEkyQyBFcnJvciBDb2RlIGRlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfSTJDX0VSUk9SX05PTkUgICAgICAoMHgwMDAwMDAwMFUpICAgIC8qITwgTm8gZXJyb3IgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9JMkNfRVJST1JfQkVSUiAgICAgICgweDAwMDAwMDAxVSkgICAgLyohPCBCRVJSIGVycm9yICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0kyQ19FUlJPUl9BUkxPICAgICAgKDB4MDAwMDAwMDJVKSAgICAvKiE8IEFSTE8gZXJyb3IgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfSTJDX0VSUk9SX0FGICAgICAgICAoMHgwMDAwMDAwNFUpICAgIC8qITwgQUNLRiBlcnJvciAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9JMkNfRVJST1JfT1ZSICAgICAgICgweDAwMDAwMDA4VSkgICAgLyohPCBPVlIgZXJyb3IgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0kyQ19FUlJPUl9ETUEgICAgICAgKDB4MDAwMDAwMTBVKSAgICAvKiE8IERNQSB0cmFuc2ZlciBlcnJvciAgICAqLworI2RlZmluZSBIQUxfSTJDX0VSUk9SX1RJTUVPVVQgICAoMHgwMDAwMDAyMFUpICAgIC8qITwgVGltZW91dCBlcnJvciAgICAgICAgICovCisjZGVmaW5lIEhBTF9JMkNfRVJST1JfU0laRSAgICAgICgweDAwMDAwMDQwVSkgICAgLyohPCBTaXplIE1hbmFnZW1lbnQgZXJyb3IgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX2hhbmRsZV9TdHJ1Y3R1cmVfZGVmaW5pdGlvbiBJMkMgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICogQGJyaWVmICBJMkMgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KK3R5cGVkZWYgc3RydWN0IF9fSTJDX0hhbmRsZVR5cGVEZWYKK3sKKyAgSTJDX1R5cGVEZWYgICAgICAgICAgICAgICAgKkluc3RhbmNlOyAgICAgIC8qITwgSTJDIHJlZ2lzdGVycyBiYXNlIGFkZHJlc3MgICAgICAgICAgICAgICAgKi8KKworICBJMkNfSW5pdFR5cGVEZWYgICAgICAgICAgICBJbml0OyAgICAgICAgICAgLyohPCBJMkMgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICAgICAgICAgICAgICAqLworCisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICpwQnVmZlB0cjsgICAgICAvKiE8IFBvaW50ZXIgdG8gSTJDIHRyYW5zZmVyIGJ1ZmZlciAgICAgICAgICAgICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgWGZlclNpemU7ICAgICAgIC8qITwgSTJDIHRyYW5zZmVyIHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQxNl90ICAgICAgICAgICAgICBYZmVyQ291bnQ7ICAgICAgLyohPCBJMkMgdHJhbnNmZXIgY291bnRlciAgICAgICAgICAgICAgICAgICAgICAqLworCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgIFhmZXJPcHRpb25zOyAgICAvKiE8IEkyQyBzZXF1YW50aWFsIHRyYW5zZmVyIG9wdGlvbnMsIHRoaXMgcGFyYW1ldGVyIGNhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBhIHZhbHVlIG9mIEByZWYgSTJDX1hGRVJPUFRJT05TICovCisKKyAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICAgUHJldmlvdXNTdGF0ZTsgIC8qITwgSTJDIGNvbW11bmljYXRpb24gUHJldmlvdXMgc3RhdGUgICAgICAgICAgKi8KKworICBIQUxfU3RhdHVzVHlwZURlZigqWGZlcklTUikoc3RydWN0IF9fSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IElURmxhZ3MsIHVpbnQzMl90IElUU291cmNlcyk7ICAvKiE8IEkyQyB0cmFuc2ZlciBJUlEgaGFuZGxlciBmdW5jdGlvbiBwb2ludGVyICovCisKKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICAgKmhkbWF0eDsgICAgICAgIC8qITwgSTJDIFR4IERNQSBoYW5kbGUgcGFyYW1ldGVycyAgICAgICAgICAgICAgKi8KKworICBETUFfSGFuZGxlVHlwZURlZiAgICAgICAgICAqaGRtYXJ4OyAgICAgICAgLyohPCBJMkMgUnggRE1BIGhhbmRsZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAqLworCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgICAgIExvY2s7ICAgICAgICAgICAvKiE8IEkyQyBsb2NraW5nIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyBIQUxfSTJDX1N0YXRlVHlwZURlZiAgU3RhdGU7ICAgICAgICAgIC8qITwgSTJDIGNvbW11bmljYXRpb24gc3RhdGUgICAgICAgICAgICAgICAgICAgKi8KKworICBfX0lPIEhBTF9JMkNfTW9kZVR5cGVEZWYgICBNb2RlOyAgICAgICAgICAgLyohPCBJMkMgY29tbXVuaWNhdGlvbiBtb2RlICAgICAgICAgICAgICAgICAgICAqLworCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgIEVycm9yQ29kZTsgICAgICAvKiE8IEkyQyBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICAgQWRkckV2ZW50Q291bnQ7IC8qITwgSTJDIEFkZHJlc3MgRXZlbnQgY291bnRlciAgICAgICAgICAgICAgICAgKi8KK30gSTJDX0hhbmRsZVR5cGVEZWY7CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBJMkNfRXhwb3J0ZWRfQ29uc3RhbnRzIEkyQyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19YRkVST1BUSU9OUyAgSTJDIFNlcXVlbnRpYWwgVHJhbnNmZXIgT3B0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIEkyQ19GSVJTVF9GUkFNRSAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClJMkNfU09GVEVORF9NT0RFKQorI2RlZmluZSBJMkNfRklSU1RfQU5EX05FWFRfRlJBTUUgICAgICAgICgodWludDMyX3QpKEkyQ19SRUxPQURfTU9ERSB8IEkyQ19TT0ZURU5EX01PREUpKQorI2RlZmluZSBJMkNfTkVYVF9GUkFNRSAgICAgICAgICAgICAgICAgICgodWludDMyX3QpKEkyQ19SRUxPQURfTU9ERSB8IEkyQ19TT0ZURU5EX01PREUpKQorI2RlZmluZSBJMkNfRklSU1RfQU5EX0xBU1RfRlJBTUUgICAgICAgICgodWludDMyX3QpSTJDX0FVVE9FTkRfTU9ERSkKKyNkZWZpbmUgSTJDX0xBU1RfRlJBTUUgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUkyQ19BVVRPRU5EX01PREUpCisjZGVmaW5lIEkyQ19MQVNUX0ZSQU1FX05PX1NUT1AgICAgICAgICAgKCh1aW50MzJfdClJMkNfU09GVEVORF9NT0RFKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfQUREUkVTU0lOR19NT0RFIEkyQyBBZGRyZXNzaW5nIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBJMkNfQUREUkVTU0lOR01PREVfN0JJVCAgICAgICAgICgweDAwMDAwMDAxVSkKKyNkZWZpbmUgSTJDX0FERFJFU1NJTkdNT0RFXzEwQklUICAgICAgICAoMHgwMDAwMDAwMlUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19EVUFMX0FERFJFU1NJTkdfTU9ERSBJMkMgRHVhbCBBZGRyZXNzaW5nIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBJMkNfRFVBTEFERFJFU1NfRElTQUJMRSAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgSTJDX0RVQUxBRERSRVNTX0VOQUJMRSAgICAgICAgICBJMkNfT0FSMl9PQTJFTgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfT1dOX0FERFJFU1MyX01BU0tTIEkyQyBPd24gQWRkcmVzczIgTWFza3MKKyAgKiBAeworICAqLworI2RlZmluZSBJMkNfT0EyX05PTUFTSyAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAwVSkKKyNkZWZpbmUgSTJDX09BMl9NQVNLMDEgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpCisjZGVmaW5lIEkyQ19PQTJfTUFTSzAyICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKQorI2RlZmluZSBJMkNfT0EyX01BU0swMyAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAzVSkKKyNkZWZpbmUgSTJDX09BMl9NQVNLMDQgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpCisjZGVmaW5lIEkyQ19PQTJfTUFTSzA1ICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDVVKQorI2RlZmluZSBJMkNfT0EyX01BU0swNiAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA2VSkKKyNkZWZpbmUgSTJDX09BMl9NQVNLMDcgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19HRU5FUkFMX0NBTExfQUREUkVTU0lOR19NT0RFIEkyQyBHZW5lcmFsIENhbGwgQWRkcmVzc2luZyBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJDX0dFTkVSQUxDQUxMX0RJU0FCTEUgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIEkyQ19HRU5FUkFMQ0FMTF9FTkFCTEUgICAgICAgICAgSTJDX0NSMV9HQ0VOCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19OT1NUUkVUQ0hfTU9ERSBJMkMgTm8tU3RyZXRjaCBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJDX05PU1RSRVRDSF9ESVNBQkxFICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIEkyQ19OT1NUUkVUQ0hfRU5BQkxFICAgICAgICAgICAgSTJDX0NSMV9OT1NUUkVUQ0gKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX01FTU9SWV9BRERSRVNTX1NJWkUgSTJDIE1lbW9yeSBBZGRyZXNzIFNpemUKKyAgKiBAeworICAqLworI2RlZmluZSBJMkNfTUVNQUREX1NJWkVfOEJJVCAgICAgICAgICAgICgweDAwMDAwMDAxVSkKKyNkZWZpbmUgSTJDX01FTUFERF9TSVpFXzE2QklUICAgICAgICAgICAoMHgwMDAwMDAwMlUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19YRkVSRElSRUNUSU9OIEkyQyBUcmFuc2ZlciBEaXJlY3Rpb24gTWFzdGVyIFBvaW50IG9mIFZpZXcKKyAgKiBAeworICAqLworI2RlZmluZSBJMkNfRElSRUNUSU9OX1RSQU5TTUlUICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgSTJDX0RJUkVDVElPTl9SRUNFSVZFICAgICAgICAgICAoMHgwMDAwMDAwMVUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19SRUxPQURfRU5EX01PREUgSTJDIFJlbG9hZCBFbmQgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lICBJMkNfUkVMT0FEX01PREUgICAgICAgICAgICAgICAgSTJDX0NSMl9SRUxPQUQKKyNkZWZpbmUgIEkyQ19BVVRPRU5EX01PREUgICAgICAgICAgICAgICBJMkNfQ1IyX0FVVE9FTkQKKyNkZWZpbmUgIEkyQ19TT0ZURU5EX01PREUgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19TVEFSVF9TVE9QX01PREUgSTJDIFN0YXJ0IG9yIFN0b3AgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lICBJMkNfTk9fU1RBUlRTVE9QICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSAgSTJDX0dFTkVSQVRFX1NUT1AgICAgICAgICAgICAgICh1aW50MzJfdCkoMHg4MDAwMDAwMFUgfCBJMkNfQ1IyX1NUT1ApCisjZGVmaW5lICBJMkNfR0VORVJBVEVfU1RBUlRfUkVBRCAgICAgICAgKHVpbnQzMl90KSgweDgwMDAwMDAwVSB8IEkyQ19DUjJfU1RBUlQgfCBJMkNfQ1IyX1JEX1dSTikKKyNkZWZpbmUgIEkyQ19HRU5FUkFURV9TVEFSVF9XUklURSAgICAgICAodWludDMyX3QpKDB4ODAwMDAwMDBVIHwgSTJDX0NSMl9TVEFSVCkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0ludGVycnVwdF9jb25maWd1cmF0aW9uX2RlZmluaXRpb24gSTJDIEludGVycnVwdCBjb25maWd1cmF0aW9uIGRlZmluaXRpb24KKyAgKiBAYnJpZWYgSTJDIEludGVycnVwdCBkZWZpbml0aW9uCisgICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAweFhYWFhYWFhYCisgICogICAgICAgICAgIC0gWFhYWFhYWFggIDogSW50ZXJydXB0IGNvbnRyb2wgbWFzaworICAqIEB7CisgICovCisjZGVmaW5lIEkyQ19JVF9FUlJJICAgICAgICAgICAgICAgICAgICAgSTJDX0NSMV9FUlJJRQorI2RlZmluZSBJMkNfSVRfVENJICAgICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfVENJRQorI2RlZmluZSBJMkNfSVRfU1RPUEkgICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfU1RPUElFCisjZGVmaW5lIEkyQ19JVF9OQUNLSSAgICAgICAgICAgICAgICAgICAgSTJDX0NSMV9OQUNLSUUKKyNkZWZpbmUgSTJDX0lUX0FERFJJICAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX0FERFJJRQorI2RlZmluZSBJMkNfSVRfUlhJICAgICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfUlhJRQorI2RlZmluZSBJMkNfSVRfVFhJICAgICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfVFhJRQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfRmxhZ19kZWZpbml0aW9uIEkyQyBGbGFnIGRlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBJMkNfRkxBR19UWEUgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfVFhFCisjZGVmaW5lIEkyQ19GTEFHX1RYSVMgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9UWElTCisjZGVmaW5lIEkyQ19GTEFHX1JYTkUgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9SWE5FCisjZGVmaW5lIEkyQ19GTEFHX0FERFIgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9BRERSCisjZGVmaW5lIEkyQ19GTEFHX0FGICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9OQUNLRgorI2RlZmluZSBJMkNfRkxBR19TVE9QRiAgICAgICAgICAgICAgICAgIEkyQ19JU1JfU1RPUEYKKyNkZWZpbmUgSTJDX0ZMQUdfVEMgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX1RDCisjZGVmaW5lIEkyQ19GTEFHX1RDUiAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9UQ1IKKyNkZWZpbmUgSTJDX0ZMQUdfQkVSUiAgICAgICAgICAgICAgICAgICBJMkNfSVNSX0JFUlIKKyNkZWZpbmUgSTJDX0ZMQUdfQVJMTyAgICAgICAgICAgICAgICAgICBJMkNfSVNSX0FSTE8KKyNkZWZpbmUgSTJDX0ZMQUdfT1ZSICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX09WUgorI2RlZmluZSBJMkNfRkxBR19QRUNFUlIgICAgICAgICAgICAgICAgIEkyQ19JU1JfUEVDRVJSCisjZGVmaW5lIEkyQ19GTEFHX1RJTUVPVVQgICAgICAgICAgICAgICAgSTJDX0lTUl9USU1FT1VUCisjZGVmaW5lIEkyQ19GTEFHX0FMRVJUICAgICAgICAgICAgICAgICAgSTJDX0lTUl9BTEVSVAorI2RlZmluZSBJMkNfRkxBR19CVVNZICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfQlVTWQorI2RlZmluZSBJMkNfRkxBR19ESVIgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfRElSCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEkyQ19FeHBvcnRlZF9NYWNyb3MgSTJDIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgUmVzZXQgSTJDIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJMkMgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JMkNfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRVNFVCkKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgSTJDIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJMkMgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBzb3VyY2UgdG8gZW5hYmxlLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9FUlJJICBFcnJvcnMgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9UQ0kgICBUcmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0lUX1NUT1BJIFNUT1AgZGV0ZWN0aW9uIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfSVRfTkFDS0kgTkFDSyByZWNlaXZlZCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0lUX0FERFJJIEFkZHJlc3MgbWF0Y2ggaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9SWEkgICBSWCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0lUX1RYSSAgIFRYIGludGVycnVwdCBlbmFibGUKKyAgKgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JMkNfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgfD0gKF9fSU5URVJSVVBUX18pKQorCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgSTJDIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJMkMgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBzb3VyY2UgdG8gZGlzYWJsZS4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfSVRfRVJSSSAgRXJyb3JzIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfSVRfVENJICAgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9TVE9QSSBTVE9QIGRldGVjdGlvbiBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0lUX05BQ0tJIE5BQ0sgcmVjZWl2ZWQgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9BRERSSSBBZGRyZXNzIG1hdGNoIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfSVRfUlhJICAgUlggaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9UWEkgICBUWCBpbnRlcnJ1cHQgZW5hYmxlCisgICoKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJDX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICY9ICh+KF9fSU5URVJSVVBUX18pKSkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIEkyQyBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIEkyQyBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgSTJDIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfSVRfRVJSSSAgRXJyb3JzIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfSVRfVENJICAgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9TVE9QSSBTVE9QIGRldGVjdGlvbiBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0lUX05BQ0tJIE5BQ0sgcmVjZWl2ZWQgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9BRERSSSBBZGRyZXNzIG1hdGNoIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfSVRfUlhJICAgUlggaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9UWEkgICBUWCBpbnRlcnJ1cHQgZW5hYmxlCisgICoKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JTlRFUlJVUFRfXyAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJDX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJiAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSkgPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIEkyQyBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJDIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19UWEUgICAgIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19UWElTICAgIFRyYW5zbWl0IGludGVycnVwdCBzdGF0dXMKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19SWE5FICAgIFJlY2VpdmUgZGF0YSByZWdpc3RlciBub3QgZW1wdHkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19BRERSICAgIEFkZHJlc3MgbWF0Y2hlZCAoc2xhdmUgbW9kZSkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19BRiAgICAgIEFja25vd2xlZGdlIGZhaWx1cmUgcmVjZWl2ZWQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX1NUT1BGICAgU1RPUCBkZXRlY3Rpb24gZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX1RDICAgICAgVHJhbnNmZXIgY29tcGxldGUgKG1hc3RlciBtb2RlKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX1RDUiAgICAgVHJhbnNmZXIgY29tcGxldGUgcmVsb2FkCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0ZMQUdfQkVSUiAgICBCdXMgZXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19BUkxPICAgIEFyYml0cmF0aW9uIGxvc3QKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19PVlIgICAgIE92ZXJydW4vVW5kZXJydW4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19QRUNFUlIgIFBFQyBlcnJvciBpbiByZWNlcHRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19USU1FT1VUIFRpbWVvdXQgb3IgVGxvdyBkZXRlY3Rpb24gZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX0FMRVJUICAgU01CdXMgYWxlcnQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19CVVNZICAgIEJ1cyBidXN5CisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0ZMQUdfRElSICAgICBUcmFuc2ZlciBkaXJlY3Rpb24gKHNsYXZlIG1vZGUpCisgICoKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19GTEFHX18gKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fSEFMX0kyQ19HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKCgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUikgJiAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKSA/IFNFVCA6IFJFU0VUKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgSTJDIHBlbmRpbmcgZmxhZ3Mgd2hpY2ggYXJlIGNsZWFyZWQgYnkgd3JpdGluZyAxIGluIGEgc3BlY2lmaWMgYml0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIEkyQyBIYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19UWEUgICAgIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19BRERSICAgIEFkZHJlc3MgbWF0Y2hlZCAoc2xhdmUgbW9kZSkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19BRiAgICAgIEFja25vd2xlZGdlIGZhaWx1cmUgcmVjZWl2ZWQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX1NUT1BGICAgU1RPUCBkZXRlY3Rpb24gZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX0JFUlIgICAgQnVzIGVycm9yCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0ZMQUdfQVJMTyAgICBBcmJpdHJhdGlvbiBsb3N0CisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0ZMQUdfT1ZSICAgICBPdmVycnVuL1VuZGVycnVuCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0ZMQUdfUEVDRVJSICBQRUMgZXJyb3IgaW4gcmVjZXB0aW9uCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0ZMQUdfVElNRU9VVCBUaW1lb3V0IG9yIFRsb3cgZGV0ZWN0aW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19BTEVSVCAgIFNNQnVzIGFsZXJ0CisgICoKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJDX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICgoKF9fRkxBR19fKSA9PSBJMkNfRkxBR19UWEUpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiB8PSAoX19GTEFHX18pKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JQ1IgPSAoX19GTEFHX18pKSkKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgSTJDIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJDIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJDX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEsICBJMkNfQ1IxX1BFKSkKKworLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIEkyQyBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIEkyQyBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0kyQ19ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgKENMRUFSX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEsIEkyQ19DUjFfUEUpKQorCisvKiogQGJyaWVmICBHZW5lcmF0ZSBhIE5vbi1BY2tub3dsZWRnZSBJMkMgcGVyaXBoZXJhbCBpbiBTbGF2ZSBtb2RlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIEkyQyBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0kyQ19HRU5FUkFURV9OQUNLKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgKFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyLCBJMkNfQ1IyX05BQ0spKQorLyoqCisgICogQH0KKyAgKi8KKworLyogSW5jbHVkZSBJMkMgSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfaTJjX2V4LmgiCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgSTJDX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBJMkNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX0luaXQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19EZUluaXQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOwordm9pZCBIQUxfSTJDX01zcEluaXQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOwordm9pZCBIQUxfSTJDX01zcERlSW5pdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgSTJDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSW5wdXQgYW5kIE91dHB1dCBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9UcmFuc21pdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NYXN0ZXJfUmVjZWl2ZShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9UcmFuc21pdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9SZWNlaXZlKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01lbV9Xcml0ZShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDE2X3QgTWVtQWRkcmVzcywgdWludDE2X3QgTWVtQWRkU2l6ZSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NZW1fUmVhZChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDE2X3QgTWVtQWRkcmVzcywgdWludDE2X3QgTWVtQWRkU2l6ZSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19Jc0RldmljZVJlYWR5KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50MzJfdCBUcmlhbHMsIHVpbnQzMl90IFRpbWVvdXQpOworCisvKioqKioqKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9UcmFuc21pdF9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NYXN0ZXJfUmVjZWl2ZV9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9UcmFuc21pdF9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9SZWNlaXZlX0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01lbV9Xcml0ZV9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDE2X3QgTWVtQWRkcmVzcywgdWludDE2X3QgTWVtQWRkU2l6ZSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NZW1fUmVhZF9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDE2X3QgTWVtQWRkcmVzcywgdWludDE2X3QgTWVtQWRkU2l6ZSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9TZXF1ZW50aWFsX1RyYW5zbWl0X0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgWGZlck9wdGlvbnMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NYXN0ZXJfU2VxdWVudGlhbF9SZWNlaXZlX0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgWGZlck9wdGlvbnMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9TZXF1ZW50aWFsX1RyYW5zbWl0X0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgWGZlck9wdGlvbnMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9TZXF1ZW50aWFsX1JlY2VpdmVfSVQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX0VuYWJsZUxpc3Rlbl9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX0Rpc2FibGVMaXN0ZW5fSVQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NYXN0ZXJfQWJvcnRfSVQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MpOworCisvKioqKioqKiBOb24tQmxvY2tpbmcgbW9kZTogRE1BICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9UcmFuc21pdF9ETUEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWFzdGVyX1JlY2VpdmVfRE1BKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX1NsYXZlX1RyYW5zbWl0X0RNQShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9SZWNlaXZlX0RNQShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NZW1fV3JpdGVfRE1BKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRTaXplLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01lbV9SZWFkX0RNQShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDE2X3QgTWVtQWRkcmVzcywgdWludDE2X3QgTWVtQWRkU2l6ZSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEkyQ19JUlFfSGFuZGxlcl9hbmRfQ2FsbGJhY2tzIElSUSBIYW5kbGVyIGFuZCBDYWxsYmFja3MKKyAqIEB7CisgKi8KKy8qKioqKioqIEkyQyBJUlFIYW5kbGVyIGFuZCBDYWxsYmFja3MgdXNlZCBpbiBub24gYmxvY2tpbmcgbW9kZXMgKEludGVycnVwdCBhbmQgRE1BKSAqLwordm9pZCBIQUxfSTJDX0VWX0lSUUhhbmRsZXIoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOwordm9pZCBIQUxfSTJDX0VSX0lSUUhhbmRsZXIoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOwordm9pZCBIQUxfSTJDX01hc3RlclR4Q3BsdENhbGxiYWNrKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKK3ZvaWQgSEFMX0kyQ19NYXN0ZXJSeENwbHRDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7Cit2b2lkIEhBTF9JMkNfU2xhdmVUeENwbHRDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7Cit2b2lkIEhBTF9JMkNfU2xhdmVSeENwbHRDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7Cit2b2lkIEhBTF9JMkNfQWRkckNhbGxiYWNrKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90IFRyYW5zZmVyRGlyZWN0aW9uLCB1aW50MTZfdCBBZGRyTWF0Y2hDb2RlKTsKK3ZvaWQgSEFMX0kyQ19MaXN0ZW5DcGx0Q2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOwordm9pZCBIQUxfSTJDX01lbVR4Q3BsdENhbGxiYWNrKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKK3ZvaWQgSEFMX0kyQ19NZW1SeENwbHRDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7Cit2b2lkIEhBTF9JMkNfRXJyb3JDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7Cit2b2lkIEhBTF9JMkNfQWJvcnRDcGx0Q2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEkyQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgU3RhdGUsIE1vZGUgYW5kIEVycm9yIGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBQZXJpcGhlcmFsIFN0YXRlLCBNb2RlIGFuZCBFcnJvciBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9JMkNfU3RhdGVUeXBlRGVmIEhBTF9JMkNfR2V0U3RhdGUoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOworSEFMX0kyQ19Nb2RlVHlwZURlZiAgSEFMX0kyQ19HZXRNb2RlKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKK3VpbnQzMl90ICAgICAgICAgICAgIEhBTF9JMkNfR2V0RXJyb3IoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJMkNfUHJpdmF0ZV9Db25zdGFudHMgSTJDIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJDX1ByaXZhdGVfTWFjcm8gSTJDIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworI2RlZmluZSBJU19JMkNfQUREUkVTU0lOR19NT0RFKE1PREUpICAgICgoKE1PREUpID09IEkyQ19BRERSRVNTSU5HTU9ERV83QklUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gSTJDX0FERFJFU1NJTkdNT0RFXzEwQklUKSkKKworI2RlZmluZSBJU19JMkNfRFVBTF9BRERSRVNTKEFERFJFU1MpICAgICgoKEFERFJFU1MpID09IEkyQ19EVUFMQUREUkVTU19ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUREUkVTUykgPT0gSTJDX0RVQUxBRERSRVNTX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfSTJDX09XTl9BRERSRVNTMl9NQVNLKE1BU0spICAoKChNQVNLKSA9PSBJMkNfT0EyX05PTUFTSykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBJMkNfT0EyX01BU0swMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IEkyQ19PQTJfTUFTSzAyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gSTJDX09BMl9NQVNLMDMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBJMkNfT0EyX01BU0swNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IEkyQ19PQTJfTUFTSzA1KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gSTJDX09BMl9NQVNLMDYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBJMkNfT0EyX01BU0swNykpCisKKyNkZWZpbmUgSVNfSTJDX0dFTkVSQUxfQ0FMTChDQUxMKSAgICAgICAoKChDQUxMKSA9PSBJMkNfR0VORVJBTENBTExfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENBTEwpID09IEkyQ19HRU5FUkFMQ0FMTF9FTkFCTEUpKQorCisjZGVmaW5lIElTX0kyQ19OT19TVFJFVENIKFNUUkVUQ0gpICAgICAgKCgoU1RSRVRDSCkgPT0gSTJDX05PU1RSRVRDSF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RSRVRDSCkgPT0gSTJDX05PU1RSRVRDSF9FTkFCTEUpKQorCisjZGVmaW5lIElTX0kyQ19NRU1BRERfU0laRShTSVpFKSAgICAgICAgKCgoU0laRSkgPT0gSTJDX01FTUFERF9TSVpFXzhCSVQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBJMkNfTUVNQUREX1NJWkVfMTZCSVQpKQorCisjZGVmaW5lIElTX1RSQU5TRkVSX01PREUoTU9ERSkgICAgICAgICAgKCgoTU9ERSkgPT0gSTJDX1JFTE9BRF9NT0RFKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBJMkNfQVVUT0VORF9NT0RFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gSTJDX1NPRlRFTkRfTU9ERSkpCisKKyNkZWZpbmUgSVNfVFJBTlNGRVJfUkVRVUVTVChSRVFVRVNUKSAgICAoKChSRVFVRVNUKSA9PSBJMkNfR0VORVJBVEVfU1RPUCkgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBJMkNfR0VORVJBVEVfU1RBUlRfUkVBRCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBJMkNfR0VORVJBVEVfU1RBUlRfV1JJVEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBJMkNfTk9fU1RBUlRTVE9QKSkKKworI2RlZmluZSBJU19JMkNfVFJBTlNGRVJfT1BUSU9OU19SRVFVRVNUKFJFUVVFU1QpICAoKChSRVFVRVNUKSA9PSBJMkNfRklSU1RfRlJBTUUpICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gSTJDX0ZJUlNUX0FORF9ORVhUX0ZSQU1FKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IEkyQ19ORVhUX0ZSQU1FKSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBJMkNfRklSU1RfQU5EX0xBU1RfRlJBTUUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gSTJDX0xBU1RfRlJBTUUpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IEkyQ19MQVNUX0ZSQU1FX05PX1NUT1ApKQorCisjZGVmaW5lIEkyQ19SRVNFVF9DUjIoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgJj0gKHVpbnQzMl90KX4oKHVpbnQzMl90KShJMkNfQ1IyX1NBREQgfCBJMkNfQ1IyX0hFQUQxMFIgfCBJMkNfQ1IyX05CWVRFUyB8IEkyQ19DUjJfUkVMT0FEIHwgSTJDX0NSMl9SRF9XUk4pKSkKKworI2RlZmluZSBJMkNfR0VUX0FERFJfTUFUQ0goX19IQU5ETEVfXykgICAgICAgICAgICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmIEkyQ19JU1JfQUREQ09ERSkgPj4gMTZVKQorI2RlZmluZSBJMkNfR0VUX0RJUihfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmIEkyQ19JU1JfRElSKSA+PiAxNlUpCisjZGVmaW5lIEkyQ19HRVRfU1RPUF9NT0RFKF9fSEFORExFX18pICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgJiBJMkNfQ1IyX0FVVE9FTkQpCisjZGVmaW5lIEkyQ19HRVRfT1dOX0FERFJFU1MxKF9fSEFORExFX18pICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5PQVIxICYgSTJDX09BUjFfT0ExKQorI2RlZmluZSBJMkNfR0VUX09XTl9BRERSRVNTMihfX0hBTkRMRV9fKSAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+T0FSMiAmIEkyQ19PQVIyX09BMikKKworI2RlZmluZSBJU19JMkNfT1dOX0FERFJFU1MxKEFERFJFU1MxKSAgICAgICAgICAgICAoKEFERFJFU1MxKSA8PSAweDAwMDAwM0ZGVSkKKyNkZWZpbmUgSVNfSTJDX09XTl9BRERSRVNTMihBRERSRVNTMikgICAgICAgICAgICAgKChBRERSRVNTMikgPD0gKHVpbnQxNl90KTB4MDBGRlUpCisKKyNkZWZpbmUgSTJDX01FTV9BRERfTVNCKF9fQUREUkVTU19fKSAgICAgICAgICAgICAgKCh1aW50OF90KSgodWludDE2X3QpKCgodWludDE2X3QpKChfX0FERFJFU1NfXykgJiAodWludDE2X3QpKDB4RkYwMFUpKSkgPj4gOFUpKSkKKyNkZWZpbmUgSTJDX01FTV9BRERfTFNCKF9fQUREUkVTU19fKSAgICAgICAgICAgICAgKCh1aW50OF90KSgodWludDE2X3QpKChfX0FERFJFU1NfXykgJiAodWludDE2X3QpKDB4MDBGRlUpKSkpCisKKyNkZWZpbmUgSTJDX0dFTkVSQVRFX1NUQVJUKF9fQURETU9ERV9fLF9fQUREUkVTU19fKSAoKChfX0FERE1PREVfXykgPT0gSTJDX0FERFJFU1NJTkdNT0RFXzdCSVQpID8gKHVpbnQzMl90KSgoKCh1aW50MzJfdCkoX19BRERSRVNTX18pICYgKEkyQ19DUjJfU0FERCkpIHwgKEkyQ19DUjJfU1RBUlQpIHwgKEkyQ19DUjJfQVVUT0VORCkpICYgKH5JMkNfQ1IyX1JEX1dSTikpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkoKCgodWludDMyX3QpKF9fQUREUkVTU19fKSAmIChJMkNfQ1IyX1NBREQpKSB8IChJMkNfQ1IyX0FERDEwKSB8IChJMkNfQ1IyX1NUQVJUKSkgJiAofkkyQ19DUjJfUkRfV1JOKSkpCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIEZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJMkNfUHJpdmF0ZV9GdW5jdGlvbnMgSTJDIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIFByaXZhdGUgZnVuY3Rpb25zIGFyZSBkZWZpbmVkIGluIHN0bTMyZjN4eF9oYWxfaTJjLmMgZmlsZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLyogX19TVE0zMkYzeHhfSEFMX0kyQ19IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2hhbF9pMmNfZXguaCBiL0luYy9zdG0zMmYzeHhfaGFsX2kyY19leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZTVmZDYKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2hhbF9pMmNfZXguaApAQCAtMCwwICsxLDE3OSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfaTJjX2V4LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIEkyQyBIQUwgRXh0ZW5kZWQgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkYzeHhfSEFMX0kyQ19FWF9ICisjZGVmaW5lIF9fU1RNMzJGM3h4X0hBTF9JMkNfRVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEkyQ0V4CisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgSTJDRXhfRXhwb3J0ZWRfQ29uc3RhbnRzIEkyQyBFeHRlbmRlZCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEkyQ0V4X0FuYWxvZ19GaWx0ZXIgSTJDIEV4dGVuZGVkIEFuYWxvZyBGaWx0ZXIKKyAgKiBAeworICAqLworI2RlZmluZSBJMkNfQU5BTE9HRklMVEVSX0VOQUJMRSAgICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIEkyQ19BTkFMT0dGSUxURVJfRElTQUJMRSAgICAgICAgSTJDX0NSMV9BTkZPRkYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDRXhfRmFzdE1vZGVQbHVzIEkyQyBFeHRlbmRlZCBGYXN0IE1vZGUgUGx1cworICAqIEB7CisgICovCisjZGVmaW5lIEkyQ19GTVBfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgMHhBQUFBMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGYXN0IE1vZGUgUGx1cyBub3Qgc3VwcG9ydGVkICAgICAgICovCisjZGVmaW5lIEkyQ19GQVNUTU9ERVBMVVNfUEI2ICAgICAgICAgICAgU1lTQ0ZHX0NGR1IxX0kyQ19QQjZfRk1QICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFbmFibGUgRmFzdCBNb2RlIFBsdXMgb24gUEI2ICAgICAgICovCisjZGVmaW5lIEkyQ19GQVNUTU9ERVBMVVNfUEI3ICAgICAgICAgICAgU1lTQ0ZHX0NGR1IxX0kyQ19QQjdfRk1QICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFbmFibGUgRmFzdCBNb2RlIFBsdXMgb24gUEI3ICAgICAgICovCisjZGVmaW5lIEkyQ19GQVNUTU9ERVBMVVNfUEI4ICAgICAgICAgICAgU1lTQ0ZHX0NGR1IxX0kyQ19QQjhfRk1QICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFbmFibGUgRmFzdCBNb2RlIFBsdXMgb24gUEI4ICAgICAgICovCisjZGVmaW5lIEkyQ19GQVNUTU9ERVBMVVNfUEI5ICAgICAgICAgICAgU1lTQ0ZHX0NGR1IxX0kyQ19QQjlfRk1QICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFbmFibGUgRmFzdCBNb2RlIFBsdXMgb24gUEI5ICAgICAgICovCisjZGVmaW5lIEkyQ19GQVNUTU9ERVBMVVNfSTJDMSAgICAgICAgICAgU1lTQ0ZHX0NGR1IxX0kyQzFfRk1QICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFbmFibGUgRmFzdCBNb2RlIFBsdXMgb24gSTJDMSBwaW5zICovCisjaWYgZGVmaW5lZChTWVNDRkdfQ0ZHUjFfSTJDMl9GTVApCisjZGVmaW5lIEkyQ19GQVNUTU9ERVBMVVNfSTJDMiAgICAgICAgICAgU1lTQ0ZHX0NGR1IxX0kyQzJfRk1QICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFbmFibGUgRmFzdCBNb2RlIFBsdXMgb24gSTJDMiBwaW5zICovCisjZWxzZQorI2RlZmluZSBJMkNfRkFTVE1PREVQTFVTX0kyQzIgICAgICAgICAgICh1aW50MzJfdCkoMHgwMDAwMDIwMFUgfCBJMkNfRk1QX05PVF9TVVBQT1JURUQpIC8qITwgRmFzdCBNb2RlIFBsdXMgSTJDMiBub3Qgc3VwcG9ydGVkICAqLworI2VuZGlmCisjaWYgZGVmaW5lZChTWVNDRkdfQ0ZHUjFfSTJDM19GTVApCisjZGVmaW5lIEkyQ19GQVNUTU9ERVBMVVNfSTJDMyAgICAgICAgICAgU1lTQ0ZHX0NGR1IxX0kyQzNfRk1QICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFbmFibGUgRmFzdCBNb2RlIFBsdXMgb24gSTJDMyBwaW5zICovCisjZWxzZQorI2RlZmluZSBJMkNfRkFTVE1PREVQTFVTX0kyQzMgICAgICAgICAgICh1aW50MzJfdCkoMHgwMDAwMDQwMFUgfCBJMkNfRk1QX05PVF9TVVBQT1JURUQpIC8qITwgRmFzdCBNb2RlIFBsdXMgSTJDMyBub3Qgc3VwcG9ydGVkICAqLworI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBhZGR0b2dyb3VwIEkyQ0V4X0V4cG9ydGVkX0Z1bmN0aW9ucyBJMkMgRXh0ZW5kZWQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEkyQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgRXh0ZW5kZWQgZmVhdHVyZXMgZnVuY3Rpb25zCisgICogQGJyaWVmICAgIEV4dGVuZGVkIGZlYXR1cmVzIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNFeF9Db25maWdBbmFsb2dGaWx0ZXIoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IEFuYWxvZ0ZpbHRlcik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDRXhfQ29uZmlnRGlnaXRhbEZpbHRlcihJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgRGlnaXRhbEZpbHRlcik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDRXhfRW5hYmxlV2FrZVVwKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNFeF9EaXNhYmxlV2FrZVVwKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKK3ZvaWQgSEFMX0kyQ0V4X0VuYWJsZUZhc3RNb2RlUGx1cyh1aW50MzJfdCBDb25maWdGYXN0TW9kZVBsdXMpOwordm9pZCBIQUxfSTJDRXhfRGlzYWJsZUZhc3RNb2RlUGx1cyh1aW50MzJfdCBDb25maWdGYXN0TW9kZVBsdXMpOworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJMkNFeF9Qcml2YXRlX0NvbnN0YW50cyBJMkMgRXh0ZW5kZWQgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJMkNFeF9Qcml2YXRlX01hY3JvIEkyQyBFeHRlbmRlZCBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisjZGVmaW5lIElTX0kyQ19BTkFMT0dfRklMVEVSKEZJTFRFUikgICAgKCgoRklMVEVSKSA9PSBJMkNfQU5BTE9HRklMVEVSX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGSUxURVIpID09IEkyQ19BTkFMT0dGSUxURVJfRElTQUJMRSkpCisKKyNkZWZpbmUgSVNfSTJDX0RJR0lUQUxfRklMVEVSKEZJTFRFUikgICAoKEZJTFRFUikgPD0gMHgwMDAwMDAwRlUpCisKKyNkZWZpbmUgSVNfSTJDX0ZBU1RNT0RFUExVUyhfX0NPTkZJR19fKSAoKCgoX19DT05GSUdfXykgJiBJMkNfRk1QX05PVF9TVVBQT1JURUQpICE9IEkyQ19GTVBfTk9UX1NVUFBPUlRFRCkgJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoX19DT05GSUdfXykgJiAoSTJDX0ZBU1RNT0RFUExVU19QQjYpKSAgPT0gSTJDX0ZBU1RNT0RFUExVU19QQjYpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0NPTkZJR19fKSAmIChJMkNfRkFTVE1PREVQTFVTX1BCNykpICA9PSBJMkNfRkFTVE1PREVQTFVTX1BCNykgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fQ09ORklHX18pICYgKEkyQ19GQVNUTU9ERVBMVVNfUEI4KSkgID09IEkyQ19GQVNUTU9ERVBMVVNfUEI4KSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19DT05GSUdfXykgJiAoSTJDX0ZBU1RNT0RFUExVU19QQjkpKSAgPT0gSTJDX0ZBU1RNT0RFUExVU19QQjkpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0NPTkZJR19fKSAmIChJMkNfRkFTVE1PREVQTFVTX0kyQzEpKSA9PSBJMkNfRkFTVE1PREVQTFVTX0kyQzEpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fQ09ORklHX18pICYgKEkyQ19GQVNUTU9ERVBMVVNfSTJDMikpID09IEkyQ19GQVNUTU9ERVBMVVNfSTJDMikgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19DT05GSUdfXykgJiAoSTJDX0ZBU1RNT0RFUExVU19JMkMzKSkgPT0gSTJDX0ZBU1RNT0RFUExVU19JMkMzKSkpCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIEZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJMkNFeF9Qcml2YXRlX0Z1bmN0aW9ucyBJMkMgRXh0ZW5kZWQgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogUHJpdmF0ZSBmdW5jdGlvbnMgYXJlIGRlZmluZWQgaW4gc3RtMzJmM3h4X2hhbF9pMmNfZXguYyBmaWxlICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkYzeHhfSEFMX0kyQ19FWF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2hhbF9pMnMuaCBiL0luYy9zdG0zMmYzeHhfaGFsX2kycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNjBlY2YKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2hhbF9pMnMuaApAQCAtMCwwICsxLDQ4NiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfaTJzLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIEkyUyBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8gCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0hBTF9JMlNfSAorI2RlZmluZSBfX1NUTTMyRjN4eF9IQUxfSTJTX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9kZWYuaCIgIAorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgSTJTCisgICogQHsKKyAgKi8gCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorLyoqIEBkZWZncm91cCBJMlNfRXhwb3J0ZWRfVHlwZXMgSTJTIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqIAorICAqIEBicmllZiBJMlMgSW5pdCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiAgCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBNb2RlOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgSTJTIG9wZXJhdGluZyBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJTX01vZGUgKi8KKworICB1aW50MzJfdCBTdGFuZGFyZDsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgc3RhbmRhcmQgdXNlZCBmb3IgdGhlIEkyUyBjb21tdW5pY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJTX1N0YW5kYXJkICovCisKKyAgdWludDMyX3QgRGF0YUZvcm1hdDsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGRhdGEgZm9ybWF0IGZvciB0aGUgSTJTIGNvbW11bmljYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMlNfRGF0YV9Gb3JtYXQgKi8KKworICB1aW50MzJfdCBNQ0xLT3V0cHV0OyAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBJMlMgTUNMSyBvdXRwdXQgaXMgZW5hYmxlZCBvciBub3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMlNfTUNMS19PdXRwdXQgKi8KKworICB1aW50MzJfdCBBdWRpb0ZyZXE7ICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZnJlcXVlbmN5IHNlbGVjdGVkIGZvciB0aGUgSTJTIGNvbW11bmljYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMlNfQXVkaW9fRnJlcXVlbmN5ICovCisKKyAgdWludDMyX3QgQ1BPTDsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGlkbGUgc3RhdGUgb2YgdGhlIEkyUyBjbG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyU19DbG9ja19Qb2xhcml0eSAqLworICAgCisgIHVpbnQzMl90IENsb2NrU291cmNlOyAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBJMlMgQ2xvY2sgU291cmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJTX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IEZ1bGxEdXBsZXhNb2RlOyAgLyohPCBTcGVjaWZpZXMgdGhlIEkyUyBGdWxsRHVwbGV4IG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyU19GdWxsRHVwbGV4X01vZGUgKi8KKworfUkyU19Jbml0VHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiAgSEFMIFN0YXRlIHN0cnVjdHVyZXMgZGVmaW5pdGlvbiAgCisgICovIAordHlwZWRlZiBlbnVtCit7CisgIEhBTF9JMlNfU1RBVEVfUkVTRVQgICAgICA9IDB4MDBVLCAgLyohPCBJMlMgbm90IHlldCBpbml0aWFsaXplZCBvciBkaXNhYmxlZCAgICAgICAgICAgICAgICAqLworICBIQUxfSTJTX1NUQVRFX1JFQURZICAgICAgPSAweDAxVSwgIC8qITwgSTJTIGluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0kyU19TVEFURV9CVVNZICAgICAgID0gMHgwMlUsICAvKiE8IEkyUyBpbnRlcm5hbCBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICAgICAgICAgICovICAgCisgIEhBTF9JMlNfU1RBVEVfQlVTWV9UWCAgICA9IDB4MDNVLCAgLyohPCBEYXRhIFRyYW5zbWlzc2lvbiBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICAgICAqLyAKKyAgSEFMX0kyU19TVEFURV9CVVNZX1JYICAgID0gMHgwNFUsICAvKiE8IERhdGEgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgICAgICAgICovCisgIEhBTF9JMlNfU1RBVEVfQlVTWV9UWF9SWCA9IDB4MDVVLCAgLyohPCBEYXRhIFRyYW5zbWlzc2lvbiBhbmQgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZyAqLworICBIQUxfSTJTX1NUQVRFX1RJTUVPVVQgICAgPSAweDA2VSwgIC8qITwgSTJTIHRpbWVvdXQgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIAorICBIQUxfSTJTX1NUQVRFX0VSUk9SICAgICAgPSAweDA3ICAgLyohPCBJMlMgZXJyb3Igc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIAorfUhBTF9JMlNfU3RhdGVUeXBlRGVmOworCisvKiogCisgICogQGJyaWVmIEkyUyBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24gIAorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgU1BJX1R5cGVEZWYgICAgICAgICAgICAgICAgKkluc3RhbmNlOyAgICAvKiE8IEkyUyByZWdpc3RlcnMgYmFzZSBhZGRyZXNzICovCisKKyAgSTJTX0luaXRUeXBlRGVmICAgICAgICAgICAgSW5pdDsgICAgICAgICAvKiE8IEkyUyBjb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgKi8KKyAgCisgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICpwVHhCdWZmUHRyOyAgLyohPCBQb2ludGVyIHRvIEkyUyBUeCB0cmFuc2ZlciBidWZmZXIgKi8KKyAgCisgIF9fSU8gdWludDE2X3QgICAgICAgICAgICAgIFR4WGZlclNpemU7ICAgLyohPCBJMlMgVHggdHJhbnNmZXIgc2l6ZSAqLworICAKKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgICAgVHhYZmVyQ291bnQ7ICAvKiE8IEkyUyBUeCB0cmFuc2ZlciBDb3VudGVyICovCisgIAorICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAqcFJ4QnVmZlB0cjsgIC8qITwgUG9pbnRlciB0byBJMlMgUnggdHJhbnNmZXIgYnVmZmVyICovCisgIAorICBfX0lPIHVpbnQxNl90ICAgICAgICAgICAgICBSeFhmZXJTaXplOyAgIC8qITwgSTJTIFJ4IHRyYW5zZmVyIHNpemUgKi8KKyAgCisgIF9fSU8gdWludDE2X3QgICAgICAgICAgICAgIFJ4WGZlckNvdW50OyAgLyohPCBJMlMgUnggdHJhbnNmZXIgY291bnRlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVGhpcyBmaWVsZCBpcyBpbml0aWFsaXplZCBhdCB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbWUgdmFsdWUgYXMgdHJhbnNmZXIgc2l6ZSBhdCB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2lubmluZyBvZiB0aGUgdHJhbnNmZXIgYW5kIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNyZW1lbnRlZCB3aGVuIGEgc2FtcGxlIGlzIHJlY2VpdmVkLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmJTYW1wbGVzUmVjZWl2ZWQgPSBSeEJ1ZmZlclNpemUtUnhCdWZmZXJDb3VudCkgKi8KKworICBETUFfSGFuZGxlVHlwZURlZiAgICAgICAgICAqaGRtYXR4OyAgICAgIC8qITwgSTJTIFR4IERNQSBoYW5kbGUgcGFyYW1ldGVycyAqLworCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAgICpoZG1hcng7ICAgICAgLyohPCBJMlMgUnggRE1BIGhhbmRsZSBwYXJhbWV0ZXJzICovCisgIAorICBfX0lPIEhBTF9Mb2NrVHlwZURlZiAgICAgICBMb2NrOyAgICAgICAgIC8qITwgSTJTIGxvY2tpbmcgb2JqZWN0ICovCisgIAorICBfX0lPIEhBTF9JMlNfU3RhdGVUeXBlRGVmICBTdGF0ZTsgICAgICAgIC8qITwgSTJTIGNvbW11bmljYXRpb24gc3RhdGUgKi8KKworICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICBFcnJvckNvZGU7ICAgIC8qITwgSTJTIEVycm9yIGNvZGUgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyU19FcnJvciAqLworCit9STJTX0hhbmRsZVR5cGVEZWY7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJMlNfRXhwb3J0ZWRfQ29uc3RhbnRzIEkyUyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworLyoqIEBkZWZncm91cCBJMlNfRXJyb3IgSTJTIEVycm9yCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX0kyU19FUlJPUl9OT05FICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgLyohPCBObyBlcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0kyU19FUlJPUl9USU1FT1VUICAgICAgICAgICAgKDB4MDAwMDAwMDFVKSAgLyohPCBUaW1lb3V0IGVycm9yICAgICAgKi8gIAorI2RlZmluZSBIQUxfSTJTX0VSUk9SX09WUiAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMlUpICAvKiE8IE9WUiBlcnJvciAgICAgICAgICAqLworI2RlZmluZSBIQUxfSTJTX0VSUk9SX1VEUiAgICAgICAgICAgICAgICAoMHgwMDAwMDAwNFUpICAvKiE8IFVEUiBlcnJvciAgICAgICAgICAqLworI2RlZmluZSBIQUxfSTJTX0VSUk9SX0RNQSAgICAgICAgICAgICAgICAoMHgwMDAwMDAwOFUpICAvKiE8IERNQSB0cmFuc2ZlciBlcnJvciAqLworI2RlZmluZSBIQUxfSTJTX0VSUk9SX1VOS05PVyAgICAgICAgICAgICAoMHgwMDAwMDAxMFUpICAvKiE8IFVua25vdyBFcnJvciBlcnJvciAqLyAgCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyU19DbG9ja19Tb3VyY2UgSTJTIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIEkyU19DTE9DS19FWFRFUk5BTCAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMVUpCisjZGVmaW5lIEkyU19DTE9DS19TWVNDTEsgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMlUpCisKKyNkZWZpbmUgSVNfSTJTX0NMT0NLU09VUkNFKENMT0NLKSAoKChDTE9DSykgPT0gSTJTX0NMT0NLX0VYVEVSTkFMKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0xPQ0spID09IEkyU19DTE9DS19TWVNDTEspKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfTW9kZSBJMlMgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIEkyU19NT0RFX1NMQVZFX1RYICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgSTJTX01PREVfU0xBVkVfUlggICAgICAgICAgICAgICAgKDB4MDAwMDAxMDBVKQorI2RlZmluZSBJMlNfTU9ERV9NQVNURVJfVFggICAgICAgICAgICAgICAoMHgwMDAwMDIwMFUpCisjZGVmaW5lIEkyU19NT0RFX01BU1RFUl9SWCAgICAgICAgICAgICAgICgweDAwMDAwMzAwVSkKKworI2RlZmluZSBJU19JMlNfTU9ERShNT0RFKSAoKChNT0RFKSA9PSBJMlNfTU9ERV9TTEFWRV9UWCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBJMlNfTU9ERV9TTEFWRV9SWCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBJMlNfTU9ERV9NQVNURVJfVFgpfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBJMlNfTU9ERV9NQVNURVJfUlgpKQorLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIEkyU19TdGFuZGFyZCBJMlMgU3RhbmRhcmQKKyAgKiBAeworICAqLworI2RlZmluZSBJMlNfU1RBTkRBUkRfUEhJTElQUyAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIEkyU19TVEFOREFSRF9NU0IgICAgICAgICAgICAgICAgICgweDAwMDAwMDEwVSkKKyNkZWZpbmUgSTJTX1NUQU5EQVJEX0xTQiAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMjBVKQorI2RlZmluZSBJMlNfU1RBTkRBUkRfUENNX1NIT1JUICAgICAgICAgICAoMHgwMDAwMDAzMFUpCisjZGVmaW5lIEkyU19TVEFOREFSRF9QQ01fTE9ORyAgICAgICAgICAgICgweDAwMDAwMEIwVSkKKworI2RlZmluZSBJU19JMlNfU1RBTkRBUkQoU1RBTkRBUkQpICgoKFNUQU5EQVJEKSA9PSBJMlNfU1RBTkRBUkRfUEhJTElQUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQU5EQVJEKSA9PSBJMlNfU1RBTkRBUkRfTVNCKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RBTkRBUkQpID09IEkyU19TVEFOREFSRF9MU0IpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVEFOREFSRCkgPT0gSTJTX1NUQU5EQVJEX1BDTV9TSE9SVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQU5EQVJEKSA9PSBJMlNfU1RBTkRBUkRfUENNX0xPTkcpKQorLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIEkyU19EYXRhX0Zvcm1hdCBJMlMgRGF0YSBGb3JtYXQKKyAgKiBAeworICAqLworI2RlZmluZSBJMlNfREFUQUZPUk1BVF8xNkIgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIEkyU19EQVRBRk9STUFUXzE2Ql9FWFRFTkRFRCAgICAgICgweDAwMDAwMDAxVSkKKyNkZWZpbmUgSTJTX0RBVEFGT1JNQVRfMjRCICAgICAgICAgICAgICAgKDB4MDAwMDAwMDNVKQorI2RlZmluZSBJMlNfREFUQUZPUk1BVF8zMkIgICAgICAgICAgICAgICAoMHgwMDAwMDAwNVUpCisKKyNkZWZpbmUgSVNfSTJTX0RBVEFfRk9STUFUKEZPUk1BVCkgKCgoRk9STUFUKSA9PSBJMlNfREFUQUZPUk1BVF8xNkIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRk9STUFUKSA9PSBJMlNfREFUQUZPUk1BVF8xNkJfRVhURU5ERUQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRk9STUFUKSA9PSBJMlNfREFUQUZPUk1BVF8yNEIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRk9STUFUKSA9PSBJMlNfREFUQUZPUk1BVF8zMkIpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfTUNMS19PdXRwdXQgSTJTIE1DTEsgT3V0cHV0CisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJTX01DTEtPVVRQVVRfRU5BQkxFICAgICAgICAgICAoKHVpbnQzMl90KVNQSV9JMlNQUl9NQ0tPRSkKKyNkZWZpbmUgSTJTX01DTEtPVVRQVVRfRElTQUJMRSAgICAgICAgICAoMHgwMDAwMDAwMFUpCisKKyNkZWZpbmUgSVNfSTJTX01DTEtfT1VUUFVUKE9VVFBVVCkgKCgoT1VUUFVUKSA9PSBJMlNfTUNMS09VVFBVVF9FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBJMlNfTUNMS09VVFBVVF9ESVNBQkxFKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX0F1ZGlvX0ZyZXF1ZW5jeSBJMlMgQXVkaW8gRnJlcXVlbmN5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJTX0FVRElPRlJFUV8xOTJLICAgICAgICAgICAgICAgKDE5MjAwMFUpCisjZGVmaW5lIEkyU19BVURJT0ZSRVFfOTZLICAgICAgICAgICAgICAgICg5NjAwMFUpCisjZGVmaW5lIEkyU19BVURJT0ZSRVFfNDhLICAgICAgICAgICAgICAgICg0ODAwMFUpCisjZGVmaW5lIEkyU19BVURJT0ZSRVFfNDRLICAgICAgICAgICAgICAgICg0NDEwMFUpCisjZGVmaW5lIEkyU19BVURJT0ZSRVFfMzJLICAgICAgICAgICAgICAgICgzMjAwMFUpCisjZGVmaW5lIEkyU19BVURJT0ZSRVFfMjJLICAgICAgICAgICAgICAgICgyMjA1MFUpCisjZGVmaW5lIEkyU19BVURJT0ZSRVFfMTZLICAgICAgICAgICAgICAgICgxNjAwMFUpCisjZGVmaW5lIEkyU19BVURJT0ZSRVFfMTFLICAgICAgICAgICAgICAgICgxMTAyNVUpCisjZGVmaW5lIEkyU19BVURJT0ZSRVFfOEsgICAgICAgICAgICAgICAgICg4MDAwVSkKKyNkZWZpbmUgSTJTX0FVRElPRlJFUV9ERUZBVUxUICAgICAgICAgICAgKDJVKQorCisjZGVmaW5lIElTX0kyU19BVURJT19GUkVRKEZSRVEpICgoKChGUkVRKSA+PSBJMlNfQVVESU9GUkVRXzhLKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZSRVEpIDw9IEkyU19BVURJT0ZSRVFfMTkySykpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRlJFUSkgPT0gSTJTX0FVRElPRlJFUV9ERUZBVUxUKSkKKy8qKgorICAqIEB9CisgICovCisgICAgICAgICAgICAKKy8qKiBAZGVmZ3JvdXAgSTJTX0Z1bGxEdXBsZXhfTW9kZSBJMlMgRnVsbCBEdXBsZXggTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIEkyU19GVUxMRFVQTEVYTU9ERV9ESVNBQkxFICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgSTJTX0ZVTExEVVBMRVhNT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDFVKQorCisjZGVmaW5lIElTX0kyU19GVUxMRFVQTEVYX01PREUoTU9ERSkgKCgoTU9ERSkgPT0gSTJTX0ZVTExEVVBMRVhNT0RFX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBJMlNfRlVMTERVUExFWE1PREVfRU5BQkxFKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX0Nsb2NrX1BvbGFyaXR5IEkyUyBDbG9jayBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIEkyU19DUE9MX0xPVyAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBJMlNfQ1BPTF9ISUdIICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpU1BJX0kyU0NGR1JfQ0tQT0wpCisKKyNkZWZpbmUgSVNfSTJTX0NQT0woQ1BPTCkgKCgoQ1BPTCkgPT0gSTJTX0NQT0xfTE9XKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENQT0wpID09IEkyU19DUE9MX0hJR0gpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfSW50ZXJydXB0X2NvbmZpZ3VyYXRpb25fZGVmaW5pdGlvbiBJMlMgSW50ZXJydXB0IGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEkyU19JVF9UWEUgICAgICAgICAgICAgICAgICAgICAgU1BJX0NSMl9UWEVJRQorI2RlZmluZSBJMlNfSVRfUlhORSAgICAgICAgICAgICAgICAgICAgIFNQSV9DUjJfUlhORUlFCisjZGVmaW5lIEkyU19JVF9FUlIgICAgICAgICAgICAgICAgICAgICAgU1BJX0NSMl9FUlJJRQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfRmxhZ19kZWZpbml0aW9uIEkyUyBGbGFnIGRlZmluaXRpb24KKyAgKiBAeworICAqLyAKKyNkZWZpbmUgSTJTX0ZMQUdfVFhFICAgICAgICAgICAgICAgICAgICBTUElfU1JfVFhFCisjZGVmaW5lIEkyU19GTEFHX1JYTkUgICAgICAgICAgICAgICAgICAgU1BJX1NSX1JYTkUKKworI2RlZmluZSBJMlNfRkxBR19VRFIgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9VRFIKKyNkZWZpbmUgSTJTX0ZMQUdfT1ZSICAgICAgICAgICAgICAgICAgICBTUElfU1JfT1ZSCisjZGVmaW5lIEkyU19GTEFHX0ZSRSAgICAgICAgICAgICAgICAgICAgU1BJX1NSX0ZSRQorCisjZGVmaW5lIEkyU19GTEFHX0NIU0lERSAgICAgICAgICAgICAgICAgU1BJX1NSX0NIU0lERQorI2RlZmluZSBJMlNfRkxBR19CU1kgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9CU1kKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovIAorICAKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEkyU19FeHBvcnRlZF9NYWNyb3MgSTJTIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIFJlc2V0IEkyUyBoYW5kbGUgc3RhdGUKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gSTJTIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJTX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVTRVQpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBzcGVjaWZpZWQgU1BJIHBlcmlwaGVyYWwgKGluIEkyUyBtb2RlKS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJMlMgSGFuZGxlLiAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJTX0VOQUJMRShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+STJTQ0ZHUiB8PSBTUElfSTJTQ0ZHUl9JMlNFKQorI2RlZmluZSBfX0hBTF9JMlNfRElTQUJMRShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+STJTQ0ZHUiAmPSAodWludDE2X3QpKH5TUElfSTJTQ0ZHUl9JMlNFKSkKKworLyoqIEBicmllZiAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIHNwZWNpZmllZCBJMlMgaW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJMlMgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBzb3VyY2UgdG8gZW5hYmxlIG9yIGRpc2FibGUuCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEkyU19JVF9UWEU6IFR4IGJ1ZmZlciBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEkyU19JVF9SWE5FOiBSWCBidWZmZXIgbm90IGVtcHR5IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSTJTX0lUX0VSUjogRXJyb3IgaW50ZXJydXB0IGVuYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLyAgCisjZGVmaW5lIF9fSEFMX0kyU19FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiB8PSAoX19JTlRFUlJVUFRfXykpCisjZGVmaW5lIF9fSEFMX0kyU19ESVNBQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgJj0gKHVpbnQxNl90KSh+KF9fSU5URVJSVVBUX18pKSkKKyAKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIEkyUyBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJTIEhhbmRsZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBJMlMgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIEkyUyBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIEkyUyBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEkyU19JVF9UWEU6IFR4IGJ1ZmZlciBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEkyU19JVF9SWE5FOiBSWCBidWZmZXIgbm90IGVtcHR5IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSTJTX0lUX0VSUjogRXJyb3IgaW50ZXJydXB0IGVuYWJsZQorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0lUX18gKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBfX0hBTF9JMlNfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgJiAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSkgPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBJMlMgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIEkyUyBIYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEkyU19GTEFHX1JYTkU6IFJlY2VpdmUgYnVmZmVyIG5vdCBlbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEkyU19GTEFHX1RYRTogVHJhbnNtaXQgYnVmZmVyIGVtcHR5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgSTJTX0ZMQUdfVURSOiBVbmRlcnJ1biBmbGFnCisgICogICAgICAgICAgICBAYXJnIEkyU19GTEFHX09WUjogT3ZlcnJ1biBmbGFnCisgICogICAgICAgICAgICBAYXJnIEkyU19GTEFHX0ZSRTogRnJhbWUgZXJyb3IgZmxhZworICAqICAgICAgICAgICAgQGFyZyBJMlNfRkxBR19DSFNJREU6IENoYW5uZWwgU2lkZSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEkyU19GTEFHX0JTWTogQnVzeSBmbGFnCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRkxBR19fIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJTX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUikgJiAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKQorCisvKiogQGJyaWVmIENsZWFycyB0aGUgSTJTIE9WUiBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJTIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgX19IQUxfSTJTX0NMRUFSX09WUkZMQUcoX19IQU5ETEVfXykgZG97IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gKF9fSEFORExFX18pLT5JbnN0YW5jZS0+RFI7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1I7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMFUpCisvKiogQGJyaWVmIENsZWFycyB0aGUgSTJTIFVEUiBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJTIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgX19IQUxfSTJTX0NMRUFSX1VEUkZMQUcoX19IQU5ETEVfXykgZG97XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZztcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH13aGlsZSgwVSkgCisvKioKKyAgKiBAfQorICAqLyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qIEluY2x1ZGUgSTJTIEhBTCBFeHRlbmRlZCBtb2R1bGUgKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2kyc19leC5oIiAKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBJMlNfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLyoqIEBhZGR0b2dyb3VwIEkyU19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgICogQHsKKyAgKi8KKworLyogSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMlNfSW5pdChJMlNfSGFuZGxlVHlwZURlZiAqaGkycyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX0RlSW5pdCAoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpOwordm9pZCBIQUxfSTJTX01zcEluaXQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpOwordm9pZCBIQUxfSTJTX01zcERlSW5pdChJMlNfSGFuZGxlVHlwZURlZiAqaGkycyk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgSTJTX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAgKiBAeworICAqLworLyogSS9PIG9wZXJhdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX1RyYW5zbWl0KEkyU19IYW5kbGVUeXBlRGVmICpoaTJzLCB1aW50MTZfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyU19SZWNlaXZlKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzLCB1aW50MTZfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworCisgLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyU19UcmFuc21pdF9JVChJMlNfSGFuZGxlVHlwZURlZiAqaGkycywgdWludDE2X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMlNfUmVjZWl2ZV9JVChJMlNfSGFuZGxlVHlwZURlZiAqaGkycywgdWludDE2X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK3ZvaWQgSEFMX0kyU19JUlFIYW5kbGVyKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKTsKKworLyogTm9uLUJsb2NraW5nIG1vZGU6IERNQSAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyU19UcmFuc21pdF9ETUEoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMsIHVpbnQxNl90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX1JlY2VpdmVfRE1BKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzLCB1aW50MTZfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX0RNQVBhdXNlKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMlNfRE1BUmVzdW1lKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMlNfRE1BU3RvcChJMlNfSGFuZGxlVHlwZURlZiAqaGkycyk7CisKKy8qIENhbGxiYWNrcyB1c2VkIGluIG5vbiBibG9ja2luZyBtb2RlcyAoSW50ZXJydXB0IGFuZCBETUEpICoqKioqKioqKioqKioqKioqKiovCit2b2lkIEhBTF9JMlNfVHhIYWxmQ3BsdENhbGxiYWNrKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKTsKK3ZvaWQgSEFMX0kyU19UeENwbHRDYWxsYmFjayhJMlNfSGFuZGxlVHlwZURlZiAqaGkycyk7Cit2b2lkIEhBTF9JMlNfUnhIYWxmQ3BsdENhbGxiYWNrKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKTsKK3ZvaWQgSEFMX0kyU19SeENwbHRDYWxsYmFjayhJMlNfSGFuZGxlVHlwZURlZiAqaGkycyk7Cit2b2lkIEhBTF9JMlNfRXJyb3JDYWxsYmFjayhJMlNfSGFuZGxlVHlwZURlZiAqaGkycyk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgSTJTX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMKKyAgKiBAeworICAqLworLyogUGVyaXBoZXJhbCBDb250cm9sIGFuZCBTdGF0ZSBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9JMlNfU3RhdGVUeXBlRGVmIEhBTF9JMlNfR2V0U3RhdGUoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpOwordWludDMyX3QgSEFMX0kyU19HZXRFcnJvcihJMlNfSGFuZGxlVHlwZURlZiAqaGkycyk7CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovIAorCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggICAgICAgICAgICAgICAgICAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLyogX19TVE0zMkYzeHhfSEFMX0kyU19IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2hhbF9pMnNfZXguaCBiL0luYy9zdG0zMmYzeHhfaGFsX2kyc19leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZjEwMmYKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2hhbF9pMnNfZXguaApAQCAtMCwwICsxLDIxOSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfaTJzX2V4LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIEkyUyBIQUwgRXh0ZW5kZWQgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8gCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0hBTF9JMlNfRVhfSAorI2RlZmluZSBfX1NUTTMyRjN4eF9IQUxfSTJTX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9kZWYuaCIgIAorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgSTJTRXggSTJTRXgKKyAgKiBAeworICAqLyAKKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisvKiogQGRlZmdyb3VwIEkyU0V4X0V4cG9ydGVkX01hY3JvcyBJMlMgRXh0ZW5kZWQgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFNQSV9JMlNfRlVMTERVUExFWF9TVVBQT1JUKQorI2RlZmluZSBJMlN4RVhUKF9fSU5TVEFOQ0VfXykgKChfX0lOU1RBTkNFX18pID09IChTUEkyKT8gKFNQSV9UeXBlRGVmICopKEkyUzJleHRfQkFTRSk6IChTUElfVHlwZURlZiAqKShJMlMzZXh0X0JBU0UpKQorCisvKiogQGJyaWVmICBFbmFibGUgb3IgZGlzYWJsZSB0aGUgc3BlY2lmaWVkIEkyU0V4dCBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIEkyUyBIYW5kbGUuIAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JMlNFWFRfRU5BQkxFKF9fSEFORExFX18pIChJMlN4RVhUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpLT5JMlNDRkdSIHw9IFNQSV9JMlNDRkdSX0kyU0UpCisjZGVmaW5lIF9fSEFMX0kyU0VYVF9ESVNBQkxFKF9fSEFORExFX18pIChJMlN4RVhUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpLT5JMlNDRkdSICY9IH5TUElfSTJTQ0ZHUl9JMlNFKQorCisvKiogQGJyaWVmICBFbmFibGUgb3IgZGlzYWJsZSB0aGUgc3BlY2lmaWVkIEkyU0V4dCBpbnRlcnJ1cHRzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIEkyUyBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHNvdXJjZSB0byBlbmFibGUgb3IgZGlzYWJsZS4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgSTJTX0lUX1RYRTogVHggYnVmZmVyIGVtcHR5IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSTJTX0lUX1JYTkU6IFJYIGJ1ZmZlciBub3QgZW1wdHkgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBJMlNfSVRfRVJSOiBFcnJvciBpbnRlcnJ1cHQgZW5hYmxlCisgICogQHJldHZhbCBOb25lCisgICovICAKKyNkZWZpbmUgX19IQUxfSTJTRVhUX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoSTJTeEVYVCgoX19IQU5ETEVfXyktPkluc3RhbmNlKS0+Q1IyIHw9IChfX0lOVEVSUlVQVF9fKSkKKyNkZWZpbmUgX19IQUxfSTJTRVhUX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKEkyU3hFWFQoKF9fSEFORExFX18pLT5JbnN0YW5jZSktPkNSMiAmPSB+KF9fSU5URVJSVVBUX18pKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBJMlNFeHQgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIEkyUyBIYW5kbGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgSTJTIHdoZXJlIHg6IDEsIDIsIG9yIDMgdG8gc2VsZWN0IHRoZSBJMlMgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBJMlMgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBJMlNfSVRfVFhFOiBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBJMlNfSVRfUlhORTogUlggYnVmZmVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEkyU19JVF9FUlI6IEVycm9yIGludGVycnVwdCBlbmFibGUKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JVF9fIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJTRVhUX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoSTJTeEVYVCgoX19IQU5ETEVfXyktPkluc3RhbmNlKS0+Q1IyICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpID8gU0VUIDogUkVTRVQpCisKKy8qKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgSTJTRXh0IGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJMlMgSGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBJMlNfRkxBR19SWE5FOiBSZWNlaXZlIGJ1ZmZlciBub3QgZW1wdHkgZmxhZworICAqICAgICAgICAgICAgQGFyZyBJMlNfRkxBR19UWEU6IFRyYW5zbWl0IGJ1ZmZlciBlbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEkyU19GTEFHX1VEUjogVW5kZXJydW4gZmxhZworICAqICAgICAgICAgICAgQGFyZyBJMlNfRkxBR19PVlI6IE92ZXJydW4gZmxhZworICAqICAgICAgICAgICAgQGFyZyBJMlNfRkxBR19GUkU6IEZyYW1lIGVycm9yIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgSTJTX0ZMQUdfQ0hTSURFOiBDaGFubmVsIFNpZGUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBJMlNfRkxBR19CU1k6IEJ1c3kgZmxhZworICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX0kyU0VYVF9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKCgoSTJTeEVYVCgoX19IQU5ETEVfXyktPkluc3RhbmNlKS0+U1IpICYgKF9fRkxBR19fKSkgPT0gKF9fRkxBR19fKSkKKworLyoqIEBicmllZiBDbGVhcnMgdGhlIEkyU0V4dCBPVlIgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIEkyUyBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIF9fSEFMX0kyU0VYVF9DTEVBUl9PVlJGTEFHKF9fSEFORExFX18pIGRveyhJMlN4RVhUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpLT5EUjtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJMlN4RVhUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpLT5TUjt9d2hpbGUoMFUpCisvKiogQGJyaWVmIENsZWFycyB0aGUgSTJTRXh0IFVEUiBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJTIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgX19IQUxfSTJTRVhUX0NMRUFSX1VEUkZMQUcoX19IQU5ETEVfXykoSTJTeEVYVCgoX19IQU5ETEVfXyktPkluc3RhbmNlKS0+U1IpICAgIAorI2VuZGlmIC8qIFNQSV9JMlNfRlVMTERVUExFWF9TVVBQT1JUICovCisgLyoqCisgICogQH0KKyAgKi8KKworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAYWRkdG9ncm91cCBJMlNFeF9FeHBvcnRlZF9GdW5jdGlvbnMgSTJTIEV4dGVuZGVkIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKFNQSV9JMlNfRlVMTERVUExFWF9TVVBQT1JUKQorLyoqIEBhZGR0b2dyb3VwIEkyU0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSTJTIEV4dGVuZGVkIEZlYXR1cmVzIEZ1bmN0aW9ucyAKKyAgKiBAeworICAqLworCisvKiBFeHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIC8qIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMlNFeF9UcmFuc21pdFJlY2VpdmUoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMsIHVpbnQxNl90ICpwVHhEYXRhLCB1aW50MTZfdCAqcFJ4RGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CisvKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTRXhfVHJhbnNtaXRSZWNlaXZlX0lUKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzLCB1aW50MTZfdCAqcFR4RGF0YSwgdWludDE2X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUpOworLyogTm9uLUJsb2NraW5nIG1vZGU6IERNQSAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyU0V4X1RyYW5zbWl0UmVjZWl2ZV9ETUEoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMsIHVpbnQxNl90ICpwVHhEYXRhLCB1aW50MTZfdCAqcFJ4RGF0YSwgdWludDE2X3QgU2l6ZSk7CisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFNQSV9JMlNfRlVMTERVUExFWF9TVVBQT1JUICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBJMlMgSTJTCisgICogQHsKKyAgKi8gCisKKy8qKiBAYWRkdG9ncm91cCBJMlNfRXhwb3J0ZWRfRnVuY3Rpb25zIEkyUyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoU1BJX0kyU19GVUxMRFVQTEVYX1NVUFBPUlQpCisvKiogQGFkZHRvZ3JvdXAgIEkyU19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogSTJTIElSUUhhbmRsZXIgYW5kIENhbGxiYWNrcyB1c2VkIGluIG5vbiBibG9ja2luZyBtb2RlcyAoSW50ZXJydXB0IGFuZCBETUEpICovCit2b2lkIEhBTF9JMlNfRnVsbER1cGxleF9JUlFIYW5kbGVyKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKTsKK3ZvaWQgSEFMX0kyU19UeFJ4Q3BsdENhbGxiYWNrKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKTsKKy8qIENhbGxiYWNrIHVzZWQgaW4gbm9uIGJsb2NraW5nIG1vZGVzIChETUEgb25seSkgKi8KK3ZvaWQgSEFMX0kyU19UeFJ4SGFsZkNwbHRDYWxsYmFjayhJMlNfSGFuZGxlVHlwZURlZiAqaGkycyk7CisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFNQSV9JMlNfRlVMTERVUExFWF9TVVBQT1JUICovCisKKy8qKiBAYWRkdG9ncm91cCBJMlNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBhbmQgU3RhdGUgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX0RNQVBhdXNlKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMlNfRE1BUmVzdW1lKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMlNfRE1BU3RvcChJMlNfSGFuZGxlVHlwZURlZiAqaGkycyk7CisKKy8qKgorICAqIEB9CisgICovIAorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAgICAgICAgICAgICAgICAgICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKyNlbmRpZiAvKiBfX1NUTTMyRjN4eF9IQUxfSTJTX0VYX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmYzeHhfaGFsX2lyZGEuaCBiL0luYy9zdG0zMmYzeHhfaGFsX2lyZGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTk0NzY2Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjN4eF9oYWxfaXJkYS5oCkBAIC0wLDAgKzEsNzg4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2hhbF9pcmRhLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgdGhlIGZ1bmN0aW9ucyBwcm90b3R5cGVzIGZvciB0aGUgSVJEQSAKKyAgKiAgICAgICAgICBmaXJtd2FyZSBsaWJyYXJ5LgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkYzeHhfSEFMX0lSREFfSAorI2RlZmluZSBfX1NUTTMyRjN4eF9IQUxfSVJEQV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIElSREEKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJUkRBX0V4cG9ydGVkX1R5cGVzIElSREEgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgSVJEQSBJbml0IFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBCYXVkUmF0ZTsgICAgICAgICAgICAgICAgICAvKiE8IFRoaXMgbWVtYmVyIGNvbmZpZ3VyZXMgdGhlIElSREEgY29tbXVuaWNhdGlvbiBiYXVkIHJhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGJhdWQgcmF0ZSByZWdpc3RlciBpcyBjb21wdXRlZCB1c2luZyB0aGUgZm9sbG93aW5nIGZvcm11bGE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmF1ZCBSYXRlIFJlZ2lzdGVyID0gKChQQ0xLeCkgLyAoKGhpcmRhLT5Jbml0LkJhdWRSYXRlKSkpICovCisKKyAgdWludDMyX3QgV29yZExlbmd0aDsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBkYXRhIGJpdHMgdHJhbnNtaXR0ZWQgb3IgcmVjZWl2ZWQgaW4gYSBmcmFtZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIElSREFFeF9Xb3JkX0xlbmd0aCAqLworCisgIHVpbnQzMl90IFBhcml0eTsgICAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBwYXJpdHkgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIElSREFfUGFyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgV2hlbiBwYXJpdHkgaXMgZW5hYmxlZCwgdGhlIGNvbXB1dGVkIHBhcml0eSBpcyBpbnNlcnRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0IHRoZSBNU0IgcG9zaXRpb24gb2YgdGhlIHRyYW5zbWl0dGVkIGRhdGEgKDl0aCBiaXQgd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB3b3JkIGxlbmd0aCBpcyBzZXQgdG8gOSBkYXRhIGJpdHM7IDh0aCBiaXQgd2hlbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkIGxlbmd0aCBpcyBzZXQgdG8gOCBkYXRhIGJpdHMpLiAqLworCisgIHVpbnQzMl90IE1vZGU7ICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFJlY2VpdmUgb3IgVHJhbnNtaXQgbW9kZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSVJEQV9UcmFuc2Zlcl9Nb2RlICovCisKKyAgdWludDhfdCAgUHJlc2NhbGVyOyAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFByZXNjYWxlciB2YWx1ZSBmb3IgZGl2aWRpbmcgdGhlIFVBUlQvVVNBUlQgc291cmNlIGNsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYWNoaWV2ZSBsb3ctcG93ZXIgZnJlcXVlbmN5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFByZXNjYWxlciB2YWx1ZSAwIGlzIGZvcmJpZGRlbiAqLworCisgIHVpbnQxNl90IFBvd2VyTW9kZTsgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBJUkRBIHBvd2VyIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJUkRBX0xvd19Qb3dlciAqLworfUlSREFfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiBIQUwgSVJEQSBTdGF0ZSBzdHJ1Y3R1cmVzIGRlZmluaXRpb24KKyAgKiBAbm90ZSAgSEFMIElSREEgU3RhdGUgdmFsdWUgaXMgYSBjb21iaW5hdGlvbiBvZiAyIGRpZmZlcmVudCBzdWJzdGF0ZXM6IGdTdGF0ZSBhbmQgUnhTdGF0ZS4KKyAgKiAgICAgICAgLSBnU3RhdGUgY29udGFpbnMgSVJEQSBzdGF0ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGdsb2JhbCBIYW5kbGUgbWFuYWdlbWVudCAKKyAgKiAgICAgICAgICBhbmQgYWxzbyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIFR4IG9wZXJhdGlvbnMuCisgICogICAgICAgICAgZ1N0YXRlIHZhbHVlIGNvZGluZyBmb2xsb3cgYmVsb3cgZGVzY3JpYmVkIGJpdG1hcCA6CisgICogICAgICAgICAgYjctYjYgIEVycm9yIGluZm9ybWF0aW9uIAorICAqICAgICAgICAgICAgIDAwIDogTm8gRXJyb3IKKyAgKiAgICAgICAgICAgICAwMSA6IChOb3QgVXNlZCkKKyAgKiAgICAgICAgICAgICAxMCA6IFRpbWVvdXQKKyAgKiAgICAgICAgICAgICAxMSA6IEVycm9yCisgICogICAgICAgICAgYjUgICAgIElQIGluaXRpbGlzYXRpb24gc3RhdHVzCisgICogICAgICAgICAgICAgMCAgOiBSZXNldCAoSVAgbm90IGluaXRpYWxpemVkKQorICAqICAgICAgICAgICAgIDEgIDogSW5pdCBkb25lIChJUCBub3QgaW5pdGlhbGl6ZWQuIEhBTCBJUkRBIEluaXQgZnVuY3Rpb24gYWxyZWFkeSBjYWxsZWQpCisgICogICAgICAgICAgYjQtYjMgIChub3QgdXNlZCkKKyAgKiAgICAgICAgICAgICB4eCA6IFNob3VsZCBiZSBzZXQgdG8gMDAKKyAgKiAgICAgICAgICBiMiAgICAgSW50cmluc2ljIHByb2Nlc3Mgc3RhdGUKKyAgKiAgICAgICAgICAgICAwICA6IFJlYWR5CisgICogICAgICAgICAgICAgMSAgOiBCdXN5IChJUCBidXN5IHdpdGggc29tZSBjb25maWd1cmF0aW9uIG9yIGludGVybmFsIG9wZXJhdGlvbnMpCisgICogICAgICAgICAgYjEgICAgIChub3QgdXNlZCkKKyAgKiAgICAgICAgICAgICB4ICA6IFNob3VsZCBiZSBzZXQgdG8gMAorICAqICAgICAgICAgIGIwICAgICBUeCBzdGF0ZQorICAqICAgICAgICAgICAgIDAgIDogUmVhZHkgKG5vIFR4IG9wZXJhdGlvbiBvbmdvaW5nKQorICAqICAgICAgICAgICAgIDEgIDogQnVzeSAoVHggb3BlcmF0aW9uIG9uZ29pbmcpCisgICogICAgICAgIC0gUnhTdGF0ZSBjb250YWlucyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIFJ4IG9wZXJhdGlvbnMuCisgICogICAgICAgICAgUnhTdGF0ZSB2YWx1ZSBjb2RpbmcgZm9sbG93IGJlbG93IGRlc2NyaWJlZCBiaXRtYXAgOgorICAqICAgICAgICAgIGI3LWI2ICAobm90IHVzZWQpCisgICogICAgICAgICAgICAgeHggOiBTaG91bGQgYmUgc2V0IHRvIDAwCisgICogICAgICAgICAgYjUgICAgIElQIGluaXRpbGlzYXRpb24gc3RhdHVzCisgICogICAgICAgICAgICAgMCAgOiBSZXNldCAoSVAgbm90IGluaXRpYWxpemVkKQorICAqICAgICAgICAgICAgIDEgIDogSW5pdCBkb25lIChJUCBub3QgaW5pdGlhbGl6ZWQpCisgICogICAgICAgICAgYjQtYjIgIChub3QgdXNlZCkKKyAgKiAgICAgICAgICAgIHh4eCA6IFNob3VsZCBiZSBzZXQgdG8gMDAwCisgICogICAgICAgICAgYjEgICAgIFJ4IHN0YXRlCisgICogICAgICAgICAgICAgMCAgOiBSZWFkeSAobm8gUnggb3BlcmF0aW9uIG9uZ29pbmcpCisgICogICAgICAgICAgICAgMSAgOiBCdXN5IChSeCBvcGVyYXRpb24gb25nb2luZykKKyAgKiAgICAgICAgICBiMCAgICAgKG5vdCB1c2VkKQorICAqICAgICAgICAgICAgIHggIDogU2hvdWxkIGJlIHNldCB0byAwLgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9JUkRBX1NUQVRFX1JFU0VUICAgICAgICAgICAgID0gMHgwMFUsICAgLyohPCBQZXJpcGhlcmFsIGlzIG5vdCBpbml0aWFsaXplZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIGFuZCBSeFN0YXRlICovCisgIEhBTF9JUkRBX1NUQVRFX1JFQURZICAgICAgICAgICAgID0gMHgyMFUsICAgLyohPCBQZXJpcGhlcmFsIEluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgYW5kIFJ4U3RhdGUgKi8KKyAgSEFMX0lSREFfU1RBVEVfQlVTWSAgICAgICAgICAgICAgPSAweDI0VSwgICAvKiE8IGFuIGludGVybmFsIHByb2Nlc3MgaXMgb25nb2luZyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBvbmx5ICovCisgIEhBTF9JUkRBX1NUQVRFX0JVU1lfVFggICAgICAgICAgID0gMHgyMVUsICAgLyohPCBEYXRhIFRyYW5zbWlzc2lvbiBwcm9jZXNzIGlzIG9uZ29pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBvbmx5ICovCisgIEhBTF9JUkRBX1NUQVRFX0JVU1lfUlggICAgICAgICAgID0gMHgyMlUsICAgLyohPCBEYXRhIFJlY2VwdGlvbiBwcm9jZXNzIGlzIG9uZ29pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIFJ4U3RhdGUgb25seSAqLworICBIQUxfSVJEQV9TVEFURV9CVVNZX1RYX1JYICAgICAgICA9IDB4MjNVLCAgIC8qITwgRGF0YSBUcmFuc21pc3Npb24gYW5kIFJlY2VwdGlvbiBwcm9jZXNzIGlzIG9uZ29pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdCB0byBiZSB1c2VkIGZvciBuZWl0aGVyIGdTdGF0ZSBub3IgUnhTdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIHJlc3VsdCBvZiBjb21iaW5hdGlvbiAoT3IpIGJldHdlZW4gZ1N0YXRlIGFuZCBSeFN0YXRlIHZhbHVlcyAqLworICBIQUxfSVJEQV9TVEFURV9USU1FT1VUICAgICAgICAgICA9IDB4QTBVLCAgIC8qITwgVGltZW91dCBzdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIG9ubHkgKi8KKyAgSEFMX0lSREFfU1RBVEVfRVJST1IgICAgICAgICAgICAgPSAweEUwVSAgICAvKiE8IEVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgb25seSAqLworfUhBTF9JUkRBX1N0YXRlVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmIElSREEgY2xvY2sgc291cmNlcyBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSVJEQV9DTE9DS1NPVVJDRV9QQ0xLMSAgICAgID0gMHgwMFUsICAgIC8qITwgUENMSzEgY2xvY2sgc291cmNlICAgICAqLworICBJUkRBX0NMT0NLU09VUkNFX1BDTEsyICAgICAgPSAweDAxVSwgICAgLyohPCBQQ0xLMiBjbG9jayBzb3VyY2UgICAgICovCisgIElSREFfQ0xPQ0tTT1VSQ0VfSFNJICAgICAgICA9IDB4MDJVLCAgICAvKiE8IEhTSSBjbG9jayBzb3VyY2UgICAgICAgKi8KKyAgSVJEQV9DTE9DS1NPVVJDRV9TWVNDTEsgICAgID0gMHgwNFUsICAgIC8qITwgU1lTQ0xLIGNsb2NrIHNvdXJjZSAgICAqLworICBJUkRBX0NMT0NLU09VUkNFX0xTRSAgICAgICAgPSAweDA4VSwgICAgLyohPCBMU0UgY2xvY2sgc291cmNlICAgICAgICovCisgIElSREFfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEICA9IDB4MTBVICAgICAvKiE8IFVuZGVmaW5lZCBjbG9jayBzb3VyY2UgKi8KK31JUkRBX0Nsb2NrU291cmNlVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBJUkRBIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgVVNBUlRfVHlwZURlZiAgICAgICAgICAgICpJbnN0YW5jZTsgICAgICAgIC8qITwgSVJEQSByZWdpc3RlcnMgYmFzZSBhZGRyZXNzICAgICAgICAqLworCisgIElSREFfSW5pdFR5cGVEZWYgICAgICAgICBJbml0OyAgICAgICAgICAgICAvKiE8IElSREEgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICAgICAgKi8KKworICB1aW50OF90ICAgICAgICAgICAgICAgICAgKnBUeEJ1ZmZQdHI7ICAgICAgLyohPCBQb2ludGVyIHRvIElSREEgVHggdHJhbnNmZXIgQnVmZmVyICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgIFR4WGZlclNpemU7ICAgICAgIC8qITwgSVJEQSBUeCBUcmFuc2ZlciBzaXplICAgICAgICAgICAgICAqLworCisgIF9fSU8gdWludDE2X3QgICAgICAgICAgICBUeFhmZXJDb3VudDsgICAgICAvKiE8IElSREEgVHggVHJhbnNmZXIgQ291bnRlciAgICAgICAgICAgKi8KKworICB1aW50OF90ICAgICAgICAgICAgICAgICAgKnBSeEJ1ZmZQdHI7ICAgICAgLyohPCBQb2ludGVyIHRvIElSREEgUnggdHJhbnNmZXIgQnVmZmVyICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgIFJ4WGZlclNpemU7ICAgICAgIC8qITwgSVJEQSBSeCBUcmFuc2ZlciBzaXplICAgICAgICAgICAgICAqLworCisgIF9fSU8gdWludDE2X3QgICAgICAgICAgICBSeFhmZXJDb3VudDsgICAgICAvKiE8IElSREEgUnggVHJhbnNmZXIgQ291bnRlciAgICAgICAgICAgKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgTWFzazsgICAgICAgICAgICAgLyohPCBJUkRBIFJYIFJEUiByZWdpc3RlciBtYXNrICAgICAgICAgICovCisKKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICpoZG1hdHg7ICAgICAgICAgIC8qITwgSVJEQSBUeCBETUEgSGFuZGxlIHBhcmFtZXRlcnMgICAgICAqLworCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAqaGRtYXJ4OyAgICAgICAgICAvKiE8IElSREEgUnggRE1BIEhhbmRsZSBwYXJhbWV0ZXJzICAgICAgKi8KKworICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICAgTG9jazsgICAgICAgICAgICAgLyohPCBMb2NraW5nIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyBIQUxfSVJEQV9TdGF0ZVR5cGVEZWYgICAgZ1N0YXRlOyAgICAgIC8qITwgSVJEQSBzdGF0ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGdsb2JhbCBIYW5kbGUgbWFuYWdlbWVudCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFsc28gcmVsYXRlZCB0byBUeCBvcGVyYXRpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhBTF9JUkRBX1N0YXRlVHlwZURlZiAqLworCisgIF9fSU8gSEFMX0lSREFfU3RhdGVUeXBlRGVmICAgIFJ4U3RhdGU7ICAgICAvKiE8IElSREEgc3RhdGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBSeCBvcGVyYXRpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhBTF9JUkRBX1N0YXRlVHlwZURlZiAqLworCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICBFcnJvckNvZGU7ICAgICAgICAvKiE8IElSREEgRXJyb3IgY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIElSREFfRXJyb3IgKi8KKworfUlSREFfSGFuZGxlVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBJUkRBIENvbmZpZ3VyYXRpb24gZW51bWVyYXRpb24gdmFsdWVzIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBJUkRBX0JBVURSQVRFICAgICAgICA9IDB4MDBVLCAgICAgLyohPCBJUkRBIEJhdWQgcmF0ZSAgICAgICAgICAqLworICBJUkRBX1BBUklUWSAgICAgICAgICA9IDB4MDFVLCAgICAgLyohPCBJUkRBIGZyYW1lIHBhcml0eSAgICAgICAqLworICBJUkRBX1dPUkRMRU5HVEggICAgICA9IDB4MDJVLCAgICAgLyohPCBJUkRBIGZyYW1lIGxlbmd0aCAgICAgICAqLworICBJUkRBX01PREUgICAgICAgICAgICA9IDB4MDNVLCAgICAgLyohPCBJUkRBIGNvbW11bmljYXRpb24gbW9kZSAqLworICBJUkRBX1BSRVNDQUxFUiAgICAgICA9IDB4MDRVLCAgICAgLyohPCBJUkRBIHByZXNjYWxpbmcgICAgICAgICAqLworICBJUkRBX1BPV0VSTU9ERSAgICAgICA9IDB4MDVVICAgICAgLyohPCBJUkRBIHBvd2VyIG1vZGUgICAgICAgICAqLworfUlSREFfQ29udHJvbFR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElSREFfRXhwb3J0ZWRfQ29uc3RhbnRzIElSREEgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX0Vycm9yIElSREEgRXJyb3IgCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX0lSREFfRVJST1JfTk9ORSAgICAgICgweDAwMDAwMDAwVSkgICAgLyohPCBObyBlcnJvciAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9JUkRBX0VSUk9SX1BFICAgICAgICAoMHgwMDAwMDAwMVUpICAgIC8qITwgUGFyaXR5IGVycm9yICAgICAgICAqLworI2RlZmluZSBIQUxfSVJEQV9FUlJPUl9ORSAgICAgICAgKDB4MDAwMDAwMDJVKSAgICAvKiE8IE5vaXNlIGVycm9yICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0lSREFfRVJST1JfRkUgICAgICAgICgweDAwMDAwMDA0VSkgICAgLyohPCBmcmFtZSBlcnJvciAgICAgICAgICovCisjZGVmaW5lIEhBTF9JUkRBX0VSUk9SX09SRSAgICAgICAoMHgwMDAwMDAwOFUpICAgIC8qITwgT3ZlcnJ1biBlcnJvciAgICAgICAqLworI2RlZmluZSBIQUxfSVJEQV9FUlJPUl9ETUEgICAgICAgKDB4MDAwMDAwMTBVKSAgICAvKiE8IERNQSB0cmFuc2ZlciBlcnJvciAgKi8KKyNkZWZpbmUgSEFMX0lSREFfRVJST1JfQlVTWSAgICAgICgweDAwMDAwMDIwVSkgICAgLyohPCBCdXN5IEVycm9yICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElSREFfUGFyaXR5IElSREEgUGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVJEQV9QQVJJVFlfTk9ORSAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE5vIHBhcml0eSAgICovCisjZGVmaW5lIElSREFfUEFSSVRZX0VWRU4gICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpVVNBUlRfQ1IxX1BDRSkgICAgICAgICAgICAgICAgICAgLyohPCBFdmVuIHBhcml0eSAqLworI2RlZmluZSBJUkRBX1BBUklUWV9PREQgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShVU0FSVF9DUjFfUENFIHwgVVNBUlRfQ1IxX1BTKSkgIC8qITwgT2RkIHBhcml0eSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVJEQV9UcmFuc2Zlcl9Nb2RlIElSREEgVHJhbnNmZXIgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIElSREFfTU9ERV9SWCAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpVVNBUlRfQ1IxX1JFKSAgICAgICAgICAgICAgICAgICAvKiE8IFJYIG1vZGUgICAgICAgICovCisjZGVmaW5lIElSREFfTU9ERV9UWCAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpVVNBUlRfQ1IxX1RFKSAgICAgICAgICAgICAgICAgICAvKiE8IFRYIG1vZGUgICAgICAgICovCisjZGVmaW5lIElSREFfTU9ERV9UWF9SWCAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpKFVTQVJUX0NSMV9URSB8VVNBUlRfQ1IxX1JFKSkgICAvKiE8IFJYIGFuZCBUWCBtb2RlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElSREFfTG93X1Bvd2VyIElSREEgTG93IFBvd2VyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVJEQV9QT1dFUk1PREVfTk9STUFMICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAvKiE8IElSREEgbm9ybWFsIHBvd2VyIG1vZGUgKi8gCisjZGVmaW5lIElSREFfUE9XRVJNT0RFX0xPV1BPV0VSICAgICAgICAgICAgICgodWludDMyX3QpVVNBUlRfQ1IzX0lSTFApICAgLyohPCBJUkRBIGxvdyBwb3dlciBtb2RlICAgICovIAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX1N0YXRlIElSREEgU3RhdGUKKyAgKiBAeworICAqLworI2RlZmluZSBJUkRBX1NUQVRFX0RJU0FCTEUgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAvKiE8IElSREEgZGlzYWJsZWQgICovIAorI2RlZmluZSBJUkRBX1NUQVRFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVVTQVJUX0NSMV9VRSkgICAvKiE8IElSREEgZW5hYmxlZCAgICovIAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX01vZGUgIElSREEgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIElSREFfTU9ERV9ESVNBQkxFICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAvKiE8IEFzc29jaWF0ZWQgVUFSVCBkaXNhYmxlZCBpbiBJUkRBIG1vZGUgKi8KKyNkZWZpbmUgSVJEQV9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClVU0FSVF9DUjNfSVJFTikgIC8qITwgQXNzb2NpYXRlZCBVQVJUIGVuYWJsZWQgaW4gSVJEQSBtb2RlICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX09uZV9CaXQgIElSREEgT25lIEJpdCBTYW1wbGluZworICAqIEB7CisgICovCisjZGVmaW5lIElSREFfT05FX0JJVF9TQU1QTEVfRElTQUJMRSAgICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgLyohPCBPbmUtYml0IHNhbXBsaW5nIGRpc2FibGVkICovCisjZGVmaW5lIElSREFfT05FX0JJVF9TQU1QTEVfRU5BQkxFICAgICAgICAgICgodWludDMyX3QpVVNBUlRfQ1IzX09ORUJJVCkgLyohPCBPbmUtYml0IHNhbXBsaW5nIGVuYWJsZWQgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElSREFfRE1BX1R4IElSREEgRE1BIFR4CisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVJEQV9ETUFfVFhfRElTQUJMRSAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAvKiE8IElSREEgRE1BIFRYIGRpc2FibGVkICovIAorI2RlZmluZSBJUkRBX0RNQV9UWF9FTkFCTEUgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVVTQVJUX0NSM19ETUFUKSAgIC8qITwgSVJEQSBETUEgVFggZW5hYmxlZCAgKi8gCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElSREFfRE1BX1J4ICBJUkRBIERNQSBSeAorICAqIEB7CisgICovCisjZGVmaW5lIElSREFfRE1BX1JYX0RJU0FCTEUgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgLyohPCBJUkRBIERNQSBSWCBkaXNhYmxlZCAqLworI2RlZmluZSBJUkRBX0RNQV9SWF9FTkFCTEUgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVVTQVJUX0NSM19ETUFSKSAgIC8qITwgSVJEQSBETUEgUlggZW5hYmxlZCAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVJEQV9SZXF1ZXN0X1BhcmFtZXRlcnMgSVJEQSBSZXF1ZXN0IFBhcmFtZXRlcnMKKyAgKiBAeworICAqLworI2RlZmluZSBJUkRBX0FVVE9CQVVEX1JFUVVFU1QgICAgICAgICAgICAoKHVpbnQzMl90KVVTQVJUX1JRUl9BQlJSUSkgICAgICAgIC8qITwgQXV0by1CYXVkIFJhdGUgUmVxdWVzdCAgICAgICovCisjZGVmaW5lIElSREFfUlhEQVRBX0ZMVVNIX1JFUVVFU1QgICAgICAgICgodWludDMyX3QpVVNBUlRfUlFSX1JYRlJRKSAgICAgICAgLyohPCBSZWNlaXZlIERhdGEgZmx1c2ggUmVxdWVzdCAgKi8KKyNkZWZpbmUgSVJEQV9UWERBVEFfRkxVU0hfUkVRVUVTVCAgICAgICAgKCh1aW50MzJfdClVU0FSVF9SUVJfVFhGUlEpICAgICAgICAvKiE8IFRyYW5zbWl0IGRhdGEgZmx1c2ggUmVxdWVzdCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX0ZsYWdzIElSREEgRmxhZ3MKKyAgKiAgICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDB4WFhYWAorICAqICAgICAgICAgICAtIDB4WFhYWCAgOiBGbGFnIG1hc2sgaW4gdGhlIElTUiByZWdpc3RlcgorICAqIEB7CisgICovCisjZGVmaW5lIElSREFfRkxBR19SRUFDSyAgICAgICAgICAgICAgICAgICAgICgweDAwNDAwMDAwVSkgICAgLyohPCBJUkRBIFJlY2VpdmUgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcgICovCisjZGVmaW5lIElSREFfRkxBR19URUFDSyAgICAgICAgICAgICAgICAgICAgICgweDAwMjAwMDAwVSkgICAgLyohPCBJUkRBIFRyYW5zbWl0IGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnICovCisjZGVmaW5lIElSREFfRkxBR19CVVNZICAgICAgICAgICAgICAgICAgICAgICgweDAwMDEwMDAwVSkgICAgLyohPCBJUkRBIEJ1c3kgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElSREFfRkxBR19BQlJGICAgICAgICAgICAgICAgICAgICAgICgweDAwMDA4MDAwVSkgICAgLyohPCBJUkRBIEF1dG8gYmF1ZCByYXRlIGZsYWcgICAgICAgICAgICAgICovCisjZGVmaW5lIElSREFfRkxBR19BQlJFICAgICAgICAgICAgICAgICAgICAgICgweDAwMDA0MDAwVSkgICAgLyohPCBJUkRBIEF1dG8gYmF1ZCByYXRlIGVycm9yICAgICAgICAgICAgICovCisjZGVmaW5lIElSREFfRkxBR19UWEUgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDgwVSkgICAgLyohPCBJUkRBIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgICAgICovCisjZGVmaW5lIElSREFfRkxBR19UQyAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDQwVSkgICAgLyohPCBJUkRBIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSAgICAgICAgICAgICovCisjZGVmaW5lIElSREFfRkxBR19SWE5FICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDIwVSkgICAgLyohPCBJUkRBIFJlYWQgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgICAgICovCisjZGVmaW5lIElSREFfRkxBR19PUkUgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDA4VSkgICAgLyohPCBJUkRBIE92ZXJydW4gZXJyb3IgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElSREFfRkxBR19ORSAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDA0VSkgICAgLyohPCBJUkRBIE5vaXNlIGVycm9yICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElSREFfRkxBR19GRSAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAyVSkgICAgLyohPCBJUkRBIEZyYW1pbmcgZXJyb3IgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElSREFfRkxBR19QRSAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxVSkgICAgLyohPCBJUkRBIFBhcml0eSBlcnJvciAgICAgICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElSREFfSW50ZXJydXB0X2RlZmluaXRpb24gSVJEQSBJbnRlcnJ1cHRzIERlZmluaXRpb24KKyAgKiAgICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDAwMDBaWlpaMFhYWVlZWVliCisgICogICAgICAgICAgIC0gWVlZWVkgIDogSW50ZXJydXB0IHNvdXJjZSBwb3NpdGlvbiBpbiB0aGUgWFggcmVnaXN0ZXIgKDViaXRzKQorICAqICAgICAgICAgICAtIFhYICA6IEludGVycnVwdCBzb3VyY2UgcmVnaXN0ZXIgKDJiaXRzKQorICAqICAgICAgICAgICAgICAgICAtIDAxOiBDUjEgcmVnaXN0ZXIKKyAgKiAgICAgICAgICAgICAgICAgLSAxMDogQ1IyIHJlZ2lzdGVyCisgICogICAgICAgICAgICAgICAgIC0gMTE6IENSMyByZWdpc3RlcgorICAqICAgICAgICAgICAtIFpaWlogIDogRmxhZyBwb3NpdGlvbiBpbiB0aGUgSVNSIHJlZ2lzdGVyKDRiaXRzKQorICAqIEB7CisgICovCisjZGVmaW5lIElSREFfSVRfUEUgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDI4VSkgICAgIC8qITwgSVJEQSBQYXJpdHkgZXJyb3IgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJUkRBX0lUX1RYRSAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDcyN1UpICAgICAvKiE8IElSREEgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBpbnRlcnJ1cHRpb24gKi8KKyNkZWZpbmUgSVJEQV9JVF9UQyAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDA2MjZVKSAgICAgLyohPCBJUkRBIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHRpb24gICAgICAgICovCisjZGVmaW5lIElSREFfSVRfUlhORSAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwNTI1VSkgICAgIC8qITwgSVJEQSBSZWFkIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdGlvbiAqLworI2RlZmluZSBJUkRBX0lUX0lETEUgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDQyNFUpICAgICAvKiE8IElSREEgSWRsZSBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVJEQV9JVF9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwNjBVKSAgICAgLyohPCBJUkRBIEVycm9yIGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElSREFfSVRfT1JFICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMzAwVSkgICAgIC8qITwgSVJEQSBPdmVycnVuIGVycm9yIGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJUkRBX0lUX05FICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDIwMFUpICAgICAvKiE8IElSREEgTm9pc2UgZXJyb3IgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVJEQV9JVF9GRSAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAxMDBVKSAgICAgLyohPCBJUkRBIEZyYW1lIGVycm9yIGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElSREFfSVRfQ0xFQVJfRmxhZ3MgICBJUkRBIEludGVycnVwdGlvbiBDbGVhciBGbGFncworICAqIEB7CisgICovCisjZGVmaW5lIElSREFfQ0xFQVJfUEVGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfUEVDRiAgICAgICAgICAgIC8qITwgUGFyaXR5IEVycm9yIENsZWFyIEZsYWcgICAgICAgICAgKi8KKyNkZWZpbmUgSVJEQV9DTEVBUl9GRUYgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9GRUNGICAgICAgICAgICAgLyohPCBGcmFtaW5nIEVycm9yIENsZWFyIEZsYWcgICAgICAgICAqLworI2RlZmluZSBJUkRBX0NMRUFSX05FRiAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX05DRiAgICAgICAgICAgICAvKiE8IE5vaXNlIGRldGVjdGVkIENsZWFyIEZsYWcgICAgICAgICovCisjZGVmaW5lIElSREFfQ0xFQVJfT1JFRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfT1JFQ0YgICAgICAgICAgIC8qITwgT3ZlclJ1biBFcnJvciBDbGVhciBGbGFnICAgICAgICAgKi8KKyNkZWZpbmUgSVJEQV9DTEVBUl9JRExFRiAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9JRExFQ0YgICAgICAgICAgLyohPCBJRExFIGxpbmUgZGV0ZWN0ZWQgQ2xlYXIgRmxhZyAgICAqLworI2RlZmluZSBJUkRBX0NMRUFSX1RDRiAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX1RDQ0YgICAgICAgICAgICAvKiE8IFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBDbGVhciBGbGFnICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElSREFfSW50ZXJydXB0aW9uX01hc2sgICAgSVJEQSBpbnRlcnJ1cHRpb25zIGZsYWdzIG1hc2sKKyAgKiBAeworICAqLworI2RlZmluZSBJUkRBX0lUX01BU0sgICgodWludDE2X3QpMHgwMDFGVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSVJEQSBJbnRlcnJ1cHRpb25zIGZsYWdzIG1hc2sgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICogQH0KKyAqLworCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElSREFfRXhwb3J0ZWRfTWFjcm9zIElSREEgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgUmVzZXQgSVJEQSBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIElSREEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JUkRBX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+Z1N0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVTRVQ7ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+UnhTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX1JFU0VUOyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisvKiogQGJyaWVmICBGbHVzaCB0aGUgSVJEQSBEUiByZWdpc3Rlci4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSVJEQV9GTFVTSF9EUlJFR0lTVEVSKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UlFSLCBJUkRBX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsgXAorICAgICAgICAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SUVIsIElSREFfVFhEQVRBX0ZMVVNIX1JFUVVFU1QpOyBcCisgICAgICB9IHdoaWxlKDBVKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgc3BlY2lmaWVkIElSREEgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIElSREEgSGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9DTEVBUl9QRUYKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0NMRUFSX0ZFRgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfQ0xFQVJfTkVGCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9DTEVBUl9PUkVGCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9DTEVBUl9UQ0YKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0NMRUFSX0lETEVGCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0lSREFfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklDUiA9IChfX0ZMQUdfXykpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBJUkRBIFBFIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSVJEQV9DTEVBUl9QRUZMQUcoX19IQU5ETEVfXykgICAgX19IQUxfSVJEQV9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgSVJEQV9DTEVBUl9QRUYpCisKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIElSREEgRkUgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIElSREEgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JUkRBX0NMRUFSX0ZFRkxBRyhfX0hBTkRMRV9fKSAgICBfX0hBTF9JUkRBX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBJUkRBX0NMRUFSX0ZFRikKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIElSREEgTkUgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIElSREEgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JUkRBX0NMRUFSX05FRkxBRyhfX0hBTkRMRV9fKSAgICBfX0hBTF9JUkRBX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBJUkRBX0NMRUFSX05FRikKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIElSREEgT1JFIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSVJEQV9DTEVBUl9PUkVGTEFHKF9fSEFORExFX18pICAgIF9fSEFMX0lSREFfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIElSREFfQ0xFQVJfT1JFRikKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIElSREEgSURMRSBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSVJEQSBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0lSREFfQ0xFQVJfSURMRUZMQUcoX19IQU5ETEVfXykgICBfX0hBTF9JUkRBX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBJUkRBX0NMRUFSX0lETEVGKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgSVJEQSBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSVJEQSBIYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9GTEFHX1JFQUNLIFJlY2VpdmUgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0ZMQUdfVEVBQ0sgVHJhbnNtaXQgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0ZMQUdfQlVTWSAgQnVzeSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9GTEFHX0FCUkYgIEF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9GTEFHX0FCUkUgIEF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiBlcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9GTEFHX1RYRSAgIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfRkxBR19UQyAgICBUcmFuc21pc3Npb24gQ29tcGxldGUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfRkxBR19SWE5FICBSZWNlaXZlIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0ZMQUdfT1JFICAgT3ZlclJ1biBFcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9GTEFHX05FICAgIE5vaXNlIEVycm9yIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0ZMQUdfRkUgICAgRnJhbWluZyBFcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9GTEFHX1BFICAgIFBhcml0eSBFcnJvciBmbGFnCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRkxBR19fIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfSVJEQV9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgJiAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKQorCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIElSREEgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIElSREEgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIElSREEgaW50ZXJydXB0IHNvdXJjZSB0byBlbmFibGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX1RYRSAgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX1RDICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfUlhORSBSZWNlaXZlIERhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfSURMRSBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfUEUgICBQYXJpdHkgRXJyb3IgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9JVF9FUlIgIEVycm9yIGludGVycnVwdChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0lSREFfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgKCgoKCh1aW50OF90KShfX0lOVEVSUlVQVF9fKSkgPj4gNVUpID09IDFVKT8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSB8PSAoMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIElSREFfSVRfTUFTSykpKTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgodWludDhfdCkoX19JTlRFUlJVUFRfXykpID4+IDVVKSA9PSAyVSk/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgfD0gKDFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBJUkRBX0lUX01BU0spKSk6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMyB8PSAoMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIElSREFfSVRfTUFTSykpKSkKKworLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIElSREEgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIElSREEgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIElSREEgaW50ZXJydXB0IHNvdXJjZSB0byBkaXNhYmxlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9JVF9UWEUgIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9JVF9UQyAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX1JYTkUgUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX0lETEUgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX1BFICAgUGFyaXR5IEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfRVJSICBFcnJvciBpbnRlcnJ1cHQoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JUkRBX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICgoKCgodWludDhfdCkoX19JTlRFUlJVUFRfXykpID4+IDVVKSA9PSAxVSk/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJj0gfiAoMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIElSREFfSVRfTUFTSykpKTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgodWludDhfdCkoX19JTlRFUlJVUFRfXykpID4+IDVVKSA9PSAyVSk/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgJj0gfiAoMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIElSREFfSVRfTUFTSykpKTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzICY9IH4gKDFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBJUkRBX0lUX01BU0spKSkpCisKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIElSREEgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSVJEQSBIYW5kbGUuCisgICogQHBhcmFtICBfX0lUX18gc3BlY2lmaWVzIHRoZSBJUkRBIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX1RYRSBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfVEMgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX1JYTkUgUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX0lETEUgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX09SRSBPdmVyUnVuIEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfTkUgTm9pc2UgRXJyb3IgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9JVF9GRSBGcmFtaW5nIEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfUEUgUGFyaXR5IEVycm9yIGludGVycnVwdAorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0lUX18gKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBfX0hBTF9JUkRBX0dFVF9JVChfX0hBTkRMRV9fLCBfX0lUX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgJiAoMVUgPDwgKChfX0lUX18pPj4gMHgwOFUpKSkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIElSREEgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSVRfXyBzcGVjaWZpZXMgdGhlIElSREEgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfVFhFIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9JVF9UQyAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfUlhORSBSZWNlaXZlIERhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfSURMRSBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfRVJSIEZyYW1pbmcsIG92ZXJydW4gb3Igbm9pc2UgZXJyb3IgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9JVF9QRSBQYXJpdHkgRXJyb3IgaW50ZXJydXB0CisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fSVRfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX0lSREFfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lUX18pICgoKCgoKHVpbnQ4X3QpKF9fSVRfXykpID4+IDVVKSA9PSAxVSk/IChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMTooKCgoKHVpbnQ4X3QpKF9fSVRfXykpID4+IDVVKSA9PSAyVSk/IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgOiAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMpKSAmICgxVSA8PCAoKCh1aW50MTZfdCkoX19JVF9fKSkgJiBJUkRBX0lUX01BU0spKSkKKworCisvKiogQGJyaWVmICBDbGVhciB0aGUgc3BlY2lmaWVkIElSREEgSVNSIGZsYWcsIGluIHNldHRpbmcgdGhlIHByb3BlciBJQ1IgcmVnaXN0ZXIgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSVRfQ0xFQVJfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBjbGVhciByZWdpc3RlciBmbGFnIHRoYXQgbmVlZHMgdG8gYmUgc2V0CisgICogICAgICAgICAgICAgICAgICAgICAgIHRvIGNsZWFyIHRoZSBjb3JyZXNwb25kaW5nIGludGVycnVwdAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9DTEVBUl9QRUYgUGFyaXR5IEVycm9yIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0NMRUFSX0ZFRiBGcmFtaW5nIEVycm9yIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0NMRUFSX05FRiBOb2lzZSBkZXRlY3RlZCBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9DTEVBUl9PUkVGIE92ZXJSdW4gRXJyb3IgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfQ0xFQVJfVENGIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBDbGVhciBGbGFnCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0lSREFfQ0xFQVJfSVQoX19IQU5ETEVfXywgX19JVF9DTEVBUl9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUNSID0gKHVpbnQzMl90KShfX0lUX0NMRUFSX18pKQorCisKKy8qKiBAYnJpZWYgIFNldCBhIHNwZWNpZmljIElSREEgcmVxdWVzdCBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIElSREEgSGFuZGxlLgorICAqIEBwYXJhbSAgX19SRVFfXyBzcGVjaWZpZXMgdGhlIHJlcXVlc3QgZmxhZyB0byBzZXQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfQVVUT0JBVURfUkVRVUVTVCBBdXRvLUJhdWQgUmF0ZSBSZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9SWERBVEFfRkxVU0hfUkVRVUVTVCBSZWNlaXZlIERhdGEgZmx1c2ggUmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfVFhEQVRBX0ZMVVNIX1JFUVVFU1QgVHJhbnNtaXQgZGF0YSBmbHVzaCBSZXF1ZXN0CisgICoKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSVJEQV9TRU5EX1JFUShfX0hBTkRMRV9fLCBfX1JFUV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UlFSIHw9ICh1aW50MTZfdCkoX19SRVFfXykpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgSVJEQSBvbmUgYml0IHNhbXBsZSBtZXRob2QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSVJEQSBIYW5kbGUuICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSVJEQV9PTkVfQklUX1NBTVBMRV9FTkFCTEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSM3w9IFVTQVJUX0NSM19PTkVCSVQpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIElSREEgb25lIGJpdCBzYW1wbGUgbWV0aG9kLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIElSREEgSGFuZGxlLiAgCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0lSREFfT05FX0JJVF9TQU1QTEVfRElTQUJMRShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzICY9ICh1aW50MzJfdCl+KCh1aW50MzJfdClVU0FSVF9DUjNfT05FQklUKSkKKworLyoqIEBicmllZiAgRW5hYmxlIFVBUlQvVVNBUlQgYXNzb2NpYXRlZCB0byBJUkRBIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSVJEQV9FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSB8PSAgVVNBUlRfQ1IxX1VFKQorCisvKiogQGJyaWVmICBEaXNhYmxlIFVBUlQvVVNBUlQgYXNzb2NpYXRlZCB0byBJUkRBIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSVJEQV9ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmPSAgflVTQVJUX0NSMV9VRSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJUkRBX1ByaXZhdGVfTWFjcm9zICAgSVJEQSBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIEVuc3VyZSB0aGF0IElSREEgQmF1ZCByYXRlIGlzIGxlc3Mgb3IgZXF1YWwgdG8gbWF4aW11bSB2YWx1ZS4KKyAgKiBAcGFyYW0gIF9fQkFVRFJBVEVfXyBzcGVjaWZpZXMgdGhlIElSREEgQmF1ZHJhdGUgc2V0IGJ5IHRoZSB1c2VyLgorICAqIEByZXR2YWwgVHJ1ZSBvciBGYWxzZQorICAqLworI2RlZmluZSBJU19JUkRBX0JBVURSQVRFKF9fQkFVRFJBVEVfXykgKChfX0JBVURSQVRFX18pIDwgMTE1MjAxVSkKKworLyoqIEBicmllZiAgRW5zdXJlIHRoYXQgSVJEQSBwcmVzY2FsZXIgdmFsdWUgaXMgc3RyaWN0bHkgbGFyZ2VyIHRoYW4gMC4KKyAgKiBAcGFyYW0gIF9fUFJFU0NBTEVSX18gc3BlY2lmaWVzIHRoZSBJUkRBIHByZXNjYWxlciB2YWx1ZSBzZXQgYnkgdGhlIHVzZXIuCisgICogQHJldHZhbCBUcnVlIG9yIEZhbHNlCisgICovCisjZGVmaW5lIElTX0lSREFfUFJFU0NBTEVSKF9fUFJFU0NBTEVSX18pICgoX19QUkVTQ0FMRVJfXykgPiAwVSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IElSREEgZnJhbWUgcGFyaXR5IGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1BBUklUWV9fIElSREEgZnJhbWUgcGFyaXR5LiAKKyAgKiBAcmV0dmFsIFNFVCAoX19QQVJJVFlfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fUEFSSVRZX18gaXMgaW52YWxpZCkKKyAgKi8gCisjZGVmaW5lIElTX0lSREFfUEFSSVRZKF9fUEFSSVRZX18pICgoKF9fUEFSSVRZX18pID09IElSREFfUEFSSVRZX05PTkUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQVJJVFlfXykgPT0gSVJEQV9QQVJJVFlfRVZFTikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BBUklUWV9fKSA9PSBJUkRBX1BBUklUWV9PREQpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgSVJEQSBjb21tdW5pY2F0aW9uIG1vZGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fTU9ERV9fIElSREEgY29tbXVuaWNhdGlvbiBtb2RlLiAKKyAgKiBAcmV0dmFsIFNFVCAoX19NT0RFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX01PREVfXyBpcyBpbnZhbGlkKQorICAqLyAKKyNkZWZpbmUgSVNfSVJEQV9UWF9SWF9NT0RFKF9fTU9ERV9fKSAoKCgoX19NT0RFX18pICYgKH4oKHVpbnQzMl90KShJUkRBX01PREVfVFhfUlgpKSkpID09IDB4MDBVKSAmJiAoKF9fTU9ERV9fKSAhPSAweDAwVSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBJUkRBIHBvd2VyIG1vZGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fTU9ERV9fIElSREEgcG93ZXIgbW9kZS4gCisgICogQHJldHZhbCBTRVQgKF9fTU9ERV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19NT0RFX18gaXMgaW52YWxpZCkKKyAgKi8gCisjZGVmaW5lIElTX0lSREFfUE9XRVJNT0RFKF9fTU9ERV9fKSAoKChfX01PREVfXykgPT0gSVJEQV9QT1dFUk1PREVfTE9XUE9XRVIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBJUkRBX1BPV0VSTU9ERV9OT1JNQUwpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgSVJEQSBzdGF0ZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19TVEFURV9fIElSREEgc3RhdGUgbW9kZS4gCisgICogQHJldHZhbCBTRVQgKF9fU1RBVEVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fU1RBVEVfXyBpcyBpbnZhbGlkKQorICAqLyAKKyNkZWZpbmUgSVNfSVJEQV9TVEFURShfX1NUQVRFX18pICgoKF9fU1RBVEVfXykgPT0gSVJEQV9TVEFURV9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUQVRFX18pID09IElSREFfU1RBVEVfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IElSREEgYXNzb2NpYXRlZCBVQVJUL1VTQVJUIG1vZGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fTU9ERV9fIElSREEgYXNzb2NpYXRlZCBVQVJUL1VTQVJUIG1vZGUuIAorICAqIEByZXR2YWwgU0VUIChfX01PREVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTU9ERV9fIGlzIGludmFsaWQpCisgICovIAorI2RlZmluZSBJU19JUkRBX01PREUoX19NT0RFX18pICAoKChfX01PREVfXykgPT0gSVJEQV9NT0RFX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IElSREFfTU9ERV9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgSVJEQSBzYW1wbGluZyByYXRlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX09ORUJJVF9fIElSREEgc2FtcGxpbmcgcmF0ZS4gCisgICogQHJldHZhbCBTRVQgKF9fT05FQklUX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX09ORUJJVF9fIGlzIGludmFsaWQpCisgICovIAorI2RlZmluZSBJU19JUkRBX09ORV9CSVRfU0FNUExFKF9fT05FQklUX18pICAgICAgKCgoX19PTkVCSVRfXykgPT0gSVJEQV9PTkVfQklUX1NBTVBMRV9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX09ORUJJVF9fKSA9PSBJUkRBX09ORV9CSVRfU0FNUExFX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBJUkRBIERNQSBUWCBtb2RlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0RNQVRYX18gSVJEQSBETUEgVFggbW9kZS4gCisgICogQHJldHZhbCBTRVQgKF9fRE1BVFhfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fRE1BVFhfXyBpcyBpbnZhbGlkKQorICAqLyAKKyNkZWZpbmUgSVNfSVJEQV9ETUFfVFgoX19ETUFUWF9fKSAgICAgKCgoX19ETUFUWF9fKSA9PSBJUkRBX0RNQV9UWF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRE1BVFhfXykgPT0gSVJEQV9ETUFfVFhfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IElSREEgRE1BIFJYIG1vZGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fRE1BUlhfXyBJUkRBIERNQSBSWCBtb2RlLiAKKyAgKiBAcmV0dmFsIFNFVCAoX19ETUFSWF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19ETUFSWF9fIGlzIGludmFsaWQpCisgICovIAorI2RlZmluZSBJU19JUkRBX0RNQV9SWChfX0RNQVJYX18pICgoKF9fRE1BUlhfXykgPT0gSVJEQV9ETUFfUlhfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRE1BUlhfXykgPT0gSVJEQV9ETUFfUlhfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IElSREEgcmVxdWVzdCBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19QQVJBTV9fIElSREEgcmVxdWVzdC4gCisgICogQHJldHZhbCBTRVQgKF9fUEFSQU1fXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fUEFSQU1fXyBpcyBpbnZhbGlkKQorICAqLyAKKyNkZWZpbmUgSVNfSVJEQV9SRVFVRVNUX1BBUkFNRVRFUihfX1BBUkFNX18pICgoKF9fUEFSQU1fXykgPT0gSVJEQV9BVVRPQkFVRF9SRVFVRVNUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BBUkFNX18pID09IElSREFfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUEFSQU1fXykgPT0gSVJEQV9UWERBVEFfRkxVU0hfUkVRVUVTVCkpCisvKioKKyAqIEB9CisgKi8KKworLyogSW5jbHVkZSBJUkRBIEhBTCBFeHRlbmRlZCBtb2R1bGUgKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2lyZGFfZXguaCIKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBJUkRBX0V4cG9ydGVkX0Z1bmN0aW9ucyBJUkRBIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBJUkRBX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9Jbml0KElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfRGVJbml0KElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOwordm9pZCBIQUxfSVJEQV9Nc3BJbml0KElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOwordm9pZCBIQUxfSVJEQV9Nc3BEZUluaXQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBJUkRBX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9UcmFuc21pdChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9SZWNlaXZlKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX1RyYW5zbWl0X0lUKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX1JlY2VpdmVfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfVHJhbnNtaXRfRE1BKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX1JlY2VpdmVfRE1BKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX0RNQVBhdXNlKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfRE1BUmVzdW1lKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfRE1BU3RvcChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKKy8qIFRyYW5zZmVyIEFib3J0IGZ1bmN0aW9ucyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfQWJvcnQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9BYm9ydFRyYW5zbWl0KElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfQWJvcnRSZWNlaXZlKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfQWJvcnRfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9BYm9ydFRyYW5zbWl0X0lUKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfQWJvcnRSZWNlaXZlX0lUKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOworCit2b2lkIEhBTF9JUkRBX0lSUUhhbmRsZXIoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7Cit2b2lkIEhBTF9JUkRBX1R4Q3BsdENhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOwordm9pZCBIQUxfSVJEQV9SeENwbHRDYWxsYmFjayhJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKK3ZvaWQgSEFMX0lSREFfVHhIYWxmQ3BsdENhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOwordm9pZCBIQUxfSVJEQV9SeEhhbGZDcGx0Q2FsbGJhY2soSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7Cit2b2lkIEhBTF9JUkRBX0Vycm9yQ2FsbGJhY2soSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7Cit2b2lkIEhBTF9JUkRBX0Fib3J0Q3BsdENhbGxiYWNrIChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKK3ZvaWQgSEFMX0lSREFfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayAoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7Cit2b2lkIEhBTF9JUkRBX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayAoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIEBhZGR0b2dyb3VwIElSREFfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX0lSREFfU3RhdGVUeXBlRGVmIEhBTF9JUkRBX0dldFN0YXRlKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOwordWludDMyX3QgICAgICAgICAgICAgIEhBTF9JUkRBX0dldEVycm9yKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkYzeHhfSEFMX0lSREFfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjN4eF9oYWxfaXJkYV9leC5oIGIvSW5jL3N0bTMyZjN4eF9oYWxfaXJkYV9leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjY2I1NDEKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2hhbF9pcmRhX2V4LmgKQEAgLTAsMCArMSw0NDAgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX2lyZGFfZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgSVJEQSBIQUwgRXh0ZW5kZWQgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkYzeHhfSEFMX0lSREFfRVhfSAorI2RlZmluZSBfX1NUTTMyRjN4eF9IQUxfSVJEQV9FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIElSREFFeAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJUkRBRXhfRXhwb3J0ZWRfQ29uc3RhbnRzIElSREFFeCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIElSREFFeF9Xb3JkX0xlbmd0aCBJUkRBIFdvcmQgTGVuZ3RoCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMzR4OCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisjZGVmaW5lIElSREFfV09SRExFTkdUSF83QiAgICAgICAgICAgICAgICAgICgodWludDMyX3QpVVNBUlRfQ1IxX00xKSAgIC8qITwgNy1iaXQgbG9uZyBmcmFtZSAqLworI2RlZmluZSBJUkRBX1dPUkRMRU5HVEhfOEIgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAvKiE8IDgtYml0IGxvbmcgZnJhbWUgKi8KKyNkZWZpbmUgSVJEQV9XT1JETEVOR1RIXzlCICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClVU0FSVF9DUjFfTTApICAgLyohPCA5LWJpdCBsb25nIGZyYW1lICovCisjZWxzZQorI2RlZmluZSBJUkRBX1dPUkRMRU5HVEhfOEIgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAvKiE8IDgtYml0IGxvbmcgZnJhbWUgKi8KKyNkZWZpbmUgSVJEQV9XT1JETEVOR1RIXzlCICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClVU0FSVF9DUjFfTSkgICAgLyohPCA5LWJpdCBsb25nIGZyYW1lICovCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMzR4OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisvKioKKyAgKiBAfQorICAqLworICAgIAorLyoqCisgICogQH0KKyAgKi8gIAorCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBJUkRBRXhfUHJpdmF0ZV9NYWNyb3MgSVJEQUV4IFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgUmVwb3J0IHRoZSBJUkRBIGNsb2NrIHNvdXJjZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fQ0xPQ0tTT1VSQ0VfXyBvdXRwdXQgdmFyaWFibGUuCisgICogQHJldHZhbCBJUkRBIGNsb2NraW5nIHNvdXJjZSwgd3JpdHRlbiBpbiBfX0NMT0NLU09VUkNFX18uCisgICovCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpCisjZGVmaW5lIElSREFfR0VUQ0xPQ0tTT1VSQ0UoX19IQU5ETEVfXyxfX0NMT0NLU09VUkNFX18pICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQxKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDFfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMjogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfUENMSzI7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDIpICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDJfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDMpICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDNfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVQVJUNCkgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VQVJUNF9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VBUlQ0Q0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VBUlQ0Q0xLU09VUkNFX0hTSTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VBUlQ0Q0xLU09VUkNFX1NZU0NMSzogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VBUlQ0Q0xLU09VUkNFX0xTRTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVUFSVDUpICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VQVJUNV9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VBUlQ1Q0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VBUlQ1Q0xLU09VUkNFX0hTSTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VBUlQ1Q0xLU09VUkNFX1NZU0NMSzogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VBUlQ1Q0xLU09VUkNFX0xTRTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX0NMT0NLU09VUkNFX18pID0gSVJEQV9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUoMFUpCisjZWxpZiBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorI2RlZmluZSBJUkRBX0dFVENMT0NLU09VUkNFKF9fSEFORExFX18sX19DTE9DS1NPVVJDRV9fKSAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZigoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQxX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBJUkRBX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBJUkRBX0NMT0NLU09VUkNFX0hTSTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBJUkRBX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBJUkRBX0NMT0NLU09VUkNFX0xTRTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBJUkRBX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQyKSAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDMpICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX0NMT0NLU09VUkNFX18pID0gSVJEQV9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBJUkRBX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSgwVSkKKyNlbHNlCisjZGVmaW5lIElSREFfR0VUQ0xPQ0tTT1VSQ0UoX19IQU5ETEVfXyxfX0NMT0NLU09VUkNFX18pICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQxKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDFfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMjogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfUENMSzI7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDIpICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDJfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDMpICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDNfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX0NMT0NLU09VUkNFX18pID0gSVJEQV9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUoMFUpCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworCisKKy8qKiBAYnJpZWYgIENvbXB1dGUgdGhlIG1hc2sgdG8gYXBwbHkgdG8gcmV0cmlldmUgdGhlIHJlY2VpdmVkIGRhdGEKKyAgKiAgICAgICAgIGFjY29yZGluZyB0byB0aGUgd29yZCBsZW5ndGggYW5kIHRvIHRoZSBwYXJpdHkgYml0cyBhY3RpdmF0aW9uLgorICAqIEBub3RlICAgSWYgUENFID0gMSwgdGhlIHBhcml0eSBiaXQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBkYXRhIGV4dHJhY3RlZAorICAqICAgICAgICAgYnkgdGhlIHJlY2VwdGlvbiBBUEkoKS4KKyAgKiAgICAgICAgIFRoaXMgbWFza2luZyBvcGVyYXRpb24gaXMgbm90IGNhcnJpZWQgb3V0IGluIHRoZSBjYXNlIG9mCisgICogICAgICAgICBETUEgdHJhbnNmZXJzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIElSREEgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZSwgdGhlIG1hc2sgdG8gYXBwbHkgdG8gdGhlIGFzc29jaWF0ZWQgVUFSVCBSRFIgcmVnaXN0ZXIgaXMgc3RvcmVkIGluIChfX0hBTkRMRV9fKS0+TWFzayBmaWVsZC4KKyAgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzM0eDgpCisjZGVmaW5lIElSREFfTUFTS19DT01QVVRBVElPTihfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5Xb3JkTGVuZ3RoID09IElSREFfV09SRExFTkdUSF85QikgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpZiAoKF9fSEFORExFX18pLT5Jbml0LlBhcml0eSA9PSBJUkRBX1BBUklUWV9OT05FKSAgICAgICAgICAgICAgIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDFGRlUgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwRkZVIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBlbHNlIGlmICgoX19IQU5ETEVfXyktPkluaXQuV29yZExlbmd0aCA9PSBJUkRBX1dPUkRMRU5HVEhfOEIpICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGlmICgoX19IQU5ETEVfXyktPkluaXQuUGFyaXR5ID09IElSREFfUEFSSVRZX05PTkUpICAgICAgICAgICAgICAgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMEZGVSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDA3RlUgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5Xb3JkTGVuZ3RoID09IElSREFfV09SRExFTkdUSF83QikgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5QYXJpdHkgPT0gSVJEQV9QQVJJVFlfTk9ORSkgICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwN0ZVIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMDNGVSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUoMFUpCisjZWxzZQorI2RlZmluZSBJUkRBX01BU0tfQ09NUFVUQVRJT04oX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICgoX19IQU5ETEVfXyktPkluaXQuV29yZExlbmd0aCA9PSBJUkRBX1dPUkRMRU5HVEhfOUIpICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5QYXJpdHkgPT0gSVJEQV9QQVJJVFlfTk9ORSkgICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAxRkZVIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMEZGVSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZWxzZSBpZiAoKF9fSEFORExFX18pLT5Jbml0LldvcmRMZW5ndGggPT0gSVJEQV9XT1JETEVOR1RIXzhCKSAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpZiAoKF9fSEFORExFX18pLT5Jbml0LlBhcml0eSA9PSBJUkRBX1BBUklUWV9OT05FKSAgICAgICAgICAgICAgIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDBGRlUgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwN0ZVIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSgwVSkKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzM0eDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBJUkRBIGZyYW1lIGxlbmd0aCBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19MRU5HVEhfXyBJUkRBIGZyYW1lIGxlbmd0aC4gCisgICogQHJldHZhbCBTRVQgKF9fTEVOR1RIX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0xFTkdUSF9fIGlzIGludmFsaWQpCisgICovIAorI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMzNHg4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKyNkZWZpbmUgSVNfSVJEQV9XT1JEX0xFTkdUSChfX0xFTkdUSF9fKSAoKChfX0xFTkdUSF9fKSA9PSBJUkRBX1dPUkRMRU5HVEhfN0IpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFTkdUSF9fKSA9PSBJUkRBX1dPUkRMRU5HVEhfOEIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFTkdUSF9fKSA9PSBJUkRBX1dPUkRMRU5HVEhfOUIpKQorI2Vsc2UKKyNkZWZpbmUgSVNfSVJEQV9XT1JEX0xFTkdUSChfX0xFTkdUSF9fKSAoKChfX0xFTkdUSF9fKSA9PSBJUkRBX1dPUkRMRU5HVEhfOEIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFTkdUSF9fKSA9PSBJUkRBX1dPUkRMRU5HVEhfOUIpKQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzM0eDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJGM3h4X0hBTF9JUkRBX0VYX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KKwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjN4eF9oYWxfaXdkZy5oIGIvSW5jL3N0bTMyZjN4eF9oYWxfaXdkZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5M2I1ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2hhbF9pd2RnLmgKQEAgLTAsMCArMSwyNTMgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX2l3ZGcuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgSVdERyBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkYzeHhfSEFMX0lXREdfSAorI2RlZmluZSBfX1NUTTMyRjN4eF9IQUxfSVdER19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJV0RHIElXREcKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJV0RHX0V4cG9ydGVkX1R5cGVzIElXREcgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKiogCisgICogQGJyaWVmICBJV0RHIEluaXQgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFByZXNjYWxlcjsgIC8qITwgU2VsZWN0IHRoZSBwcmVzY2FsZXIgb2YgdGhlIElXREcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJV0RHX1ByZXNjYWxlciAqLworCisgIHVpbnQzMl90IFJlbG9hZDsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBJV0RHIGRvd24tY291bnRlciByZWxvYWQgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweDBGRkZVICovCisKKyAgdWludDMyX3QgV2luZG93OyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHdpbmRvdyB2YWx1ZSB0byBiZSBjb21wYXJlZCB0byB0aGUgZG93bi1jb3VudGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHgwRkZGVSAqLworCit9IElXREdfSW5pdFR5cGVEZWY7CisKKy8qKiAKKyAgKiBAYnJpZWYgIElXREcgSGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uICAKKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIElXREdfVHlwZURlZiAgICAgICAgICAgICAgICAgKkluc3RhbmNlOyAgLyohPCBSZWdpc3RlciBiYXNlIGFkZHJlc3MgICAgKi8KKworICBJV0RHX0luaXRUeXBlRGVmICAgICAgICAgICAgIEluaXQ7ICAgICAgIC8qITwgSVdERyByZXF1aXJlZCBwYXJhbWV0ZXJzICovCisKK31JV0RHX0hhbmRsZVR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElXREdfRXhwb3J0ZWRfQ29uc3RhbnRzIElXREcgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJV0RHX1ByZXNjYWxlciBJV0RHIFByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIElXREdfUFJFU0NBTEVSXzQgICAgICAgICAgICAgICAgMHgwMDAwMDAwMHUgICAgICAgICAgICAgICAgICAgLyohPCBJV0RHIHByZXNjYWxlciBzZXQgdG8gNCAgICovCisjZGVmaW5lIElXREdfUFJFU0NBTEVSXzggICAgICAgICAgICAgICAgSVdER19QUl9QUl8wICAgICAgICAgICAgICAgICAgLyohPCBJV0RHIHByZXNjYWxlciBzZXQgdG8gOCAgICovCisjZGVmaW5lIElXREdfUFJFU0NBTEVSXzE2ICAgICAgICAgICAgICAgSVdER19QUl9QUl8xICAgICAgICAgICAgICAgICAgLyohPCBJV0RHIHByZXNjYWxlciBzZXQgdG8gMTYgICovCisjZGVmaW5lIElXREdfUFJFU0NBTEVSXzMyICAgICAgICAgICAgICAgKElXREdfUFJfUFJfMSB8IElXREdfUFJfUFJfMCkgLyohPCBJV0RHIHByZXNjYWxlciBzZXQgdG8gMzIgICovCisjZGVmaW5lIElXREdfUFJFU0NBTEVSXzY0ICAgICAgICAgICAgICAgSVdER19QUl9QUl8yICAgICAgICAgICAgICAgICAgLyohPCBJV0RHIHByZXNjYWxlciBzZXQgdG8gNjQgICovCisjZGVmaW5lIElXREdfUFJFU0NBTEVSXzEyOCAgICAgICAgICAgICAgKElXREdfUFJfUFJfMiB8IElXREdfUFJfUFJfMCkgICAvKiE8IElXREcgcHJlc2NhbGVyIHNldCB0byAxMjhVICovCisjZGVmaW5lIElXREdfUFJFU0NBTEVSXzI1NiAgICAgICAgICAgICAgKElXREdfUFJfUFJfMiB8IElXREdfUFJfUFJfMSkgICAvKiE8IElXREcgcHJlc2NhbGVyIHNldCB0byAyNTZVICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElXREdfV2luZG93X29wdGlvbiBJV0RHIFdpbmRvdyBvcHRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBJV0RHX1dJTkRPV19ESVNBQkxFICAgICAgICAgICAgIElXREdfV0lOUl9XSU4KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElXREdfRXhwb3J0ZWRfTWFjcm9zIElXREcgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIElXREcgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gIElXREcgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0lXREdfU1RBUlQoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgV1JJVEVfUkVHKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPktSLCBJV0RHX0tFWV9FTkFCTEUpCisKKy8qKgorICAqIEBicmllZiAgUmVsb2FkIElXREcgY291bnRlciB3aXRoIHZhbHVlIGRlZmluZWQgaW4gdGhlIHJlbG9hZCByZWdpc3RlcgorICAqICAgICAgICAgKHdyaXRlIGFjY2VzcyB0byBJV0RHX1BSLCBJV0RHX1JMUiAmIElXREdfV0lOUiByZWdpc3RlcnMgZGlzYWJsZWQpLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyAgSVdERyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSVdER19SRUxPQURfQ09VTlRFUihfX0hBTkRMRV9fKSAgICAgICBXUklURV9SRUcoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+S1IsIElXREdfS0VZX1JFTE9BRCkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSVdER19FeHBvcnRlZF9GdW5jdGlvbnMgIElXREcgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJV0RHX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIFN0YXJ0IGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBJbml0aWFsaXphdGlvbi9TdGFydCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lXREdfSW5pdChJV0RHX0hhbmRsZVR5cGVEZWYgKmhpd2RnKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVdER19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogSS9PIG9wZXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JV0RHX1JlZnJlc2goSVdER19IYW5kbGVUeXBlRGVmICpoaXdkZyk7CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJV0RHX1ByaXZhdGVfQ29uc3RhbnRzIElXREcgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBJV0RHIEtleSBSZWdpc3RlciBCaXRNYXNrCisgICovCisjZGVmaW5lIElXREdfS0VZX1JFTE9BRCAgICAgICAgICAgICAgICAgMHgwMDAwQUFBQXUgIC8qITwgSVdERyBSZWxvYWQgQ291bnRlciBFbmFibGUgICAqLworI2RlZmluZSBJV0RHX0tFWV9FTkFCTEUgICAgICAgICAgICAgICAgIDB4MDAwMENDQ0N1ICAvKiE8IElXREcgUGVyaXBoZXJhbCBFbmFibGUgICAgICAgKi8KKyNkZWZpbmUgSVdER19LRVlfV1JJVEVfQUNDRVNTX0VOQUJMRSAgICAweDAwMDA1NTU1dSAgLyohPCBJV0RHIEtSIFdyaXRlIEFjY2VzcyBFbmFibGUgICovCisjZGVmaW5lIElXREdfS0VZX1dSSVRFX0FDQ0VTU19ESVNBQkxFICAgMHgwMDAwMDAwMHUgIC8qITwgSVdERyBLUiBXcml0ZSBBY2Nlc3MgRGlzYWJsZSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJV0RHX1ByaXZhdGVfTWFjcm9zIElXREcgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBFbmFibGUgd3JpdGUgYWNjZXNzIHRvIElXREdfUFIsIElXREdfUkxSIGFuZCBJV0RHX1dJTlIgcmVnaXN0ZXJzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyAgSVdERyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgSVdER19FTkFCTEVfV1JJVEVfQUNDRVNTKF9fSEFORExFX18pICBXUklURV9SRUcoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+S1IsIElXREdfS0VZX1dSSVRFX0FDQ0VTU19FTkFCTEUpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB3cml0ZSBhY2Nlc3MgdG8gSVdER19QUiwgSVdER19STFIgYW5kIElXREdfV0lOUiByZWdpc3RlcnMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fICBJV0RHIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBJV0RHX0RJU0FCTEVfV1JJVEVfQUNDRVNTKF9fSEFORExFX18pIFdSSVRFX1JFRygoX19IQU5ETEVfXyktPkluc3RhbmNlLT5LUiwgSVdER19LRVlfV1JJVEVfQUNDRVNTX0RJU0FCTEUpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgSVdERyBwcmVzY2FsZXIgdmFsdWUuCisgICogQHBhcmFtICBfX1BSRVNDQUxFUl9fICBJV0RHIHByZXNjYWxlciB2YWx1ZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBJU19JV0RHX1BSRVNDQUxFUihfX1BSRVNDQUxFUl9fKSAgICAgICgoKF9fUFJFU0NBTEVSX18pID09IElXREdfUFJFU0NBTEVSXzQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gSVdER19QUkVTQ0FMRVJfOCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBJV0RHX1BSRVNDQUxFUl8xNikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IElXREdfUFJFU0NBTEVSXzMyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gSVdER19QUkVTQ0FMRVJfNjQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBJV0RHX1BSRVNDQUxFUl8xMjgpfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IElXREdfUFJFU0NBTEVSXzI1NikpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgSVdERyByZWxvYWQgdmFsdWUuCisgICogQHBhcmFtICBfX1JFTE9BRF9fICBJV0RHIHJlbG9hZCB2YWx1ZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBJU19JV0RHX1JFTE9BRChfX1JFTE9BRF9fKSAgICAgICAgICAgICgoX19SRUxPQURfXykgPD0gSVdER19STFJfUkwpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgSVdERyB3aW5kb3cgdmFsdWUuCisgICogQHBhcmFtICBfX1dJTkRPV19fICBJV0RHIHdpbmRvdyB2YWx1ZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBJU19JV0RHX1dJTkRPVyhfX1dJTkRPV19fKSAgICAgICAgICAgICgoX19XSU5ET1dfXykgPD0gSVdER19XSU5SX1dJTikKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkYzeHhfSEFMX0lXREdfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjN4eF9oYWxfbmFuZC5oIGIvSW5jL3N0bTMyZjN4eF9oYWxfbmFuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMjkwZmMKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2hhbF9uYW5kLmgKQEAgLTAsMCArMSwzNDQgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX25hbmQuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgTkFORCBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkYzeHhfSEFMX05BTkRfSAorI2RlZmluZSBfX1NUTTMyRjN4eF9IQUxfTkFORF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkKKyNpbmNsdWRlICJzdG0zMmYzeHhfbGxfZm1jLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBOQU5ECisgICogQHsKKyAgKi8gCisKKy8qIEV4cG9ydGVkIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBOQU5EX0V4cG9ydGVkX1R5cGVzIE5BTkQgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKiogCisgICogQGJyaWVmICBIQUwgTkFORCBTdGF0ZSBzdHJ1Y3R1cmVzIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfTkFORF9TVEFURV9SRVNFVCAgICAgPSAweDAwVSwgIC8qITwgTkFORCBub3QgeWV0IGluaXRpYWxpemVkIG9yIGRpc2FibGVkICovCisgIEhBTF9OQU5EX1NUQVRFX1JFQURZICAgICA9IDB4MDFVLCAgLyohPCBOQU5EIGluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICAgKi8KKyAgSEFMX05BTkRfU1RBVEVfQlVTWSAgICAgID0gMHgwMlUsICAvKiE8IE5BTkQgaW50ZXJuYWwgcHJvY2VzcyBpcyBvbmdvaW5nICAgICAqLworICBIQUxfTkFORF9TVEFURV9FUlJPUiAgICAgPSAweDAzVSAgIC8qITwgTkFORCBlcnJvciBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICovCit9SEFMX05BTkRfU3RhdGVUeXBlRGVmOworICAgCisvKiogCisgICogQGJyaWVmICBOQU5EIE1lbW9yeSBlbGVjdHJvbmljIHNpZ25hdHVyZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLyo8ISBOQU5EIG1lbW9yeSBlbGVjdHJvbmljIHNpZ25hdHVyZSBtYWtlciBhbmQgZGV2aWNlIElEcyAqLworCisgIHVpbnQ4X3QgTWFrZXJfSWQ7IAorCisgIHVpbnQ4X3QgRGV2aWNlX0lkOworCisgIHVpbnQ4X3QgVGhpcmRfSWQ7CisKKyAgdWludDhfdCBGb3VydGhfSWQ7Cit9TkFORF9JRFR5cGVEZWY7CisKKy8qKiAKKyAgKiBAYnJpZWYgIE5BTkQgTWVtb3J5IGFkZHJlc3MgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0IAoreworICB1aW50MTZfdCBQYWdlOyAgIC8qITwgTkFORCBtZW1vcnkgUGFnZSBhZGRyZXNzICAgICovCisKKyAgdWludDE2X3QgUGxhbmU7ICAgLyohPCBOQU5EIG1lbW9yeSBQbGFuZSBhZGRyZXNzICAqLworCisgIHVpbnQxNl90IEJsb2NrOyAgLyohPCBOQU5EIG1lbW9yeSBCbG9jayBhZGRyZXNzICAgKi8KKworfU5BTkRfQWRkcmVzc1R5cGVEZWY7CisKKy8qKiAKKyAgKiBAYnJpZWYgIE5BTkQgTWVtb3J5IGluZm8gU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8gCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCAgICAgICAgUGFnZVNpemU7ICAgICAgICAgICAgICAvKiE8IE5BTkQgbWVtb3J5IHBhZ2UgKHdpdGhvdXQgc3BhcmUgYXJlYSkgc2l6ZSBtZWFzdXJlZCBpbiBieXRlcyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgOCBiaXRzIGFkcmVzc2luZyBvciB3b3JkcyBmb3IgMTYgYml0cyBhZGRyZXNzaW5nICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgICAgICAgIFNwYXJlQXJlYVNpemU7ICAgICAgICAgLyohPCBOQU5EIG1lbW9yeSBzcGFyZSBhcmVhIHNpemUgbWVhc3VyZWQgaW4gYnl0ZXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIDggYml0cyBhZHJlc3Npbmcgb3Igd29yZHMgZm9yIDE2IGJpdHMgYWRkcmVzc2luZyAgICAgICAgICAgICAqLworICAKKyAgdWludDMyX3QgICAgICAgIEJsb2NrU2l6ZTsgICAgICAgICAgICAgLyohPCBOQU5EIG1lbW9yeSBibG9jayBzaXplIG1lYXN1cmVkIGluIG51bWJlciBvZiBwYWdlcyAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgICAgICAgIEJsb2NrTmJyOyAgICAgICAgICAgICAgLyohPCBOQU5EIG1lbW9yeSBudW1iZXIgb2YgdG90YWwgYmxvY2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgIAorICB1aW50MzJfdCAgICAgICAgUGxhbmVOYnI7ICAgICAgICAgICAgICAvKiE8IE5BTkQgbWVtb3J5IG51bWJlciBvZiBwbGFuZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCAgICAgICAgUGxhbmVTaXplOyAgICAgICAgICAgICAvKiE8IE5BTkQgbWVtb3J5IHBsYW5lIHNpemUgbWVhc3VyZWQgaW4gbnVtYmVyIG9mIGJsb2NrcyAgICAgICAgICAgICAgICovCisKKyAgRnVuY3Rpb25hbFN0YXRlIEV4dHJhQ29tbWFuZEVuYWJsZTsgICAgLyohPCBOQU5EIGV4dHJhIGNvbW1hbmQgbmVlZGVkIGZvciBQYWdlIHJlYWRpbmcgbW9kZS4gVGhpcyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgaXMgbWFuZGF0b3J5IGZvciBzb21lIE5BTkQgcGFydHMgYWZ0ZXIgdGhlIHJlYWQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCAoTkFORF9DTURfQVJFQV9UUlVFMSkgYW5kIGJlZm9yZSBEQVRBIHJlYWRpbmcgc2VxdWVuY2UuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGU6IFRvc2hpYmEgVEhUSDU4QllHM1MwSEJBSTYuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY291bGQgYmUgRU5BQkxFIG9yIERJU0FCTEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGVhc2UgY2hlY2sgdGhlIFJlYWQgTW9kZSBzZXF1bmVjZSBpbiB0aGUgTkFORCBkZXZpY2UgZGF0YXNoZWV0ICovCit9TkFORF9EZXZpY2VDb25maWdUeXBlRGVmOyAKKworLyoqIAorICAqIEBicmllZiAgTkFORCBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8gICAKK3R5cGVkZWYgc3RydWN0Cit7CisgIEZNQ19OQU5EX1R5cGVEZWYgICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIAorICBGTUNfTkFORF9Jbml0VHlwZURlZiAgICAgICAgICAgSW5pdDsgICAgICAgLyohPCBOQU5EIGRldmljZSBjb250cm9sIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAgICAgICAgICAqLworCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgICAgICAgICBMb2NrOyAgICAgICAvKiE8IE5BTkQgbG9ja2luZyBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyBIQUxfTkFORF9TdGF0ZVR5cGVEZWYgICAgIFN0YXRlOyAgICAgIC8qITwgTkFORCBkZXZpY2UgYWNjZXNzIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBOQU5EX0RldmljZUNvbmZpZ1R5cGVEZWYgICAgICAgQ29uZmlnOyAgICAgLyohPCBOQU5EIHBodXNpY2FsIGNoYXJhY3RlcmlzdGljIGluZm9ybWF0aW9uIHN0cnVjdHVyZSAgICAqLworCit9TkFORF9IYW5kbGVUeXBlRGVmOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBOQU5EX0V4cG9ydGVkX01hY3JvcyBOQU5EIEV4cG9ydGVkIE1hY3JvcworICogQHsKKyAqLyAKKworLyoqIEBicmllZiBSZXNldCBOQU5EIGhhbmRsZSBzdGF0ZQorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIE5BTkQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9OQU5EX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9OQU5EX1NUQVRFX1JFU0VUKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIE5BTkRfRXhwb3J0ZWRfRnVuY3Rpb25zIE5BTkQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyAgICAKKy8qKiBAYWRkdG9ncm91cCBOQU5EX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmICBIQUxfTkFORF9Jbml0KE5BTkRfSGFuZGxlVHlwZURlZiAqaG5hbmQsIEZNQ19OQU5EX1BDQ19UaW1pbmdUeXBlRGVmICpDb21TcGFjZV9UaW1pbmcsIEZNQ19OQU5EX1BDQ19UaW1pbmdUeXBlRGVmICpBdHRTcGFjZV9UaW1pbmcpOworSEFMX1N0YXR1c1R5cGVEZWYgIEhBTF9OQU5EX0RlSW5pdChOQU5EX0hhbmRsZVR5cGVEZWYgKmhuYW5kKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgIEhBTF9OQU5EX0NvbmZpZ0RldmljZShOQU5EX0hhbmRsZVR5cGVEZWYgKmhuYW5kLCBOQU5EX0RldmljZUNvbmZpZ1R5cGVEZWYgKnBEZXZpY2VDb25maWcpOworCitIQUxfU3RhdHVzVHlwZURlZiAgSEFMX05BTkRfUmVhZF9JRChOQU5EX0hhbmRsZVR5cGVEZWYgKmhuYW5kLCBOQU5EX0lEVHlwZURlZiAqcE5BTkRfSUQpOworCit2b2lkICAgICAgICAgICAgICAgSEFMX05BTkRfTXNwSW5pdChOQU5EX0hhbmRsZVR5cGVEZWYgKmhuYW5kKTsKK3ZvaWQgICAgICAgICAgICAgICBIQUxfTkFORF9Nc3BEZUluaXQoTkFORF9IYW5kbGVUeXBlRGVmICpobmFuZCk7Cit2b2lkICAgICAgICAgICAgICAgSEFMX05BTkRfSVJRSGFuZGxlcihOQU5EX0hhbmRsZVR5cGVEZWYgKmhuYW5kKTsKK3ZvaWQgICAgICAgICAgICAgICBIQUxfTkFORF9JVENhbGxiYWNrKE5BTkRfSGFuZGxlVHlwZURlZiAqaG5hbmQpOworCisvKioKKyAgKiBAfQorICAqLworICAKKy8qKiBAYWRkdG9ncm91cCBOQU5EX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSW5wdXQgYW5kIE91dHB1dCBmdW5jdGlvbnMgCisgICogQHsKKyAgKi8KKworLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmICBIQUxfTkFORF9SZXNldChOQU5EX0hhbmRsZVR5cGVEZWYgKmhuYW5kKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgIEhBTF9OQU5EX1JlYWRfUGFnZV84YihOQU5EX0hhbmRsZVR5cGVEZWYgKmhuYW5kLCBOQU5EX0FkZHJlc3NUeXBlRGVmICpwQWRkcmVzcywgdWludDhfdCAqcEJ1ZmZlciwgdWludDMyX3QgTnVtUGFnZVRvUmVhZCk7CitIQUxfU3RhdHVzVHlwZURlZiAgSEFMX05BTkRfV3JpdGVfUGFnZV84YihOQU5EX0hhbmRsZVR5cGVEZWYgKmhuYW5kLCBOQU5EX0FkZHJlc3NUeXBlRGVmICpwQWRkcmVzcywgdWludDhfdCAqcEJ1ZmZlciwgdWludDMyX3QgTnVtUGFnZVRvV3JpdGUpOworSEFMX1N0YXR1c1R5cGVEZWYgIEhBTF9OQU5EX1JlYWRfU3BhcmVBcmVhXzhiKE5BTkRfSGFuZGxlVHlwZURlZiAqaG5hbmQsIE5BTkRfQWRkcmVzc1R5cGVEZWYgKnBBZGRyZXNzLCB1aW50OF90ICpwQnVmZmVyLCB1aW50MzJfdCBOdW1TcGFyZUFyZWFUb1JlYWQpOworSEFMX1N0YXR1c1R5cGVEZWYgIEhBTF9OQU5EX1dyaXRlX1NwYXJlQXJlYV84YihOQU5EX0hhbmRsZVR5cGVEZWYgKmhuYW5kLCBOQU5EX0FkZHJlc3NUeXBlRGVmICpwQWRkcmVzcywgdWludDhfdCAqcEJ1ZmZlciwgdWludDMyX3QgTnVtU3BhcmVBcmVhVG93cml0ZSk7CisKK0hBTF9TdGF0dXNUeXBlRGVmICBIQUxfTkFORF9SZWFkX1BhZ2VfMTZiKE5BTkRfSGFuZGxlVHlwZURlZiAqaG5hbmQsIE5BTkRfQWRkcmVzc1R5cGVEZWYgKnBBZGRyZXNzLCB1aW50MTZfdCAqcEJ1ZmZlciwgdWludDMyX3QgTnVtUGFnZVRvUmVhZCk7CitIQUxfU3RhdHVzVHlwZURlZiAgSEFMX05BTkRfV3JpdGVfUGFnZV8xNmIoTkFORF9IYW5kbGVUeXBlRGVmICpobmFuZCwgTkFORF9BZGRyZXNzVHlwZURlZiAqcEFkZHJlc3MsIHVpbnQxNl90ICpwQnVmZmVyLCB1aW50MzJfdCBOdW1QYWdlVG9Xcml0ZSk7CitIQUxfU3RhdHVzVHlwZURlZiAgSEFMX05BTkRfUmVhZF9TcGFyZUFyZWFfMTZiKE5BTkRfSGFuZGxlVHlwZURlZiAqaG5hbmQsIE5BTkRfQWRkcmVzc1R5cGVEZWYgKnBBZGRyZXNzLCB1aW50MTZfdCAqcEJ1ZmZlciwgdWludDMyX3QgTnVtU3BhcmVBcmVhVG9SZWFkKTsKK0hBTF9TdGF0dXNUeXBlRGVmICBIQUxfTkFORF9Xcml0ZV9TcGFyZUFyZWFfMTZiKE5BTkRfSGFuZGxlVHlwZURlZiAqaG5hbmQsIE5BTkRfQWRkcmVzc1R5cGVEZWYgKnBBZGRyZXNzLCB1aW50MTZfdCAqcEJ1ZmZlciwgdWludDMyX3QgTnVtU3BhcmVBcmVhVG93cml0ZSk7CisKK0hBTF9TdGF0dXNUeXBlRGVmICBIQUxfTkFORF9FcmFzZV9CbG9jayhOQU5EX0hhbmRsZVR5cGVEZWYgKmhuYW5kLCBOQU5EX0FkZHJlc3NUeXBlRGVmICpwQWRkcmVzcyk7CisKK3VpbnQzMl90ICAgICAgICAgICBIQUxfTkFORF9SZWFkX1N0YXR1cyhOQU5EX0hhbmRsZVR5cGVEZWYgKmhuYW5kKTsKK3VpbnQzMl90ICAgICAgICAgICBIQUxfTkFORF9BZGRyZXNzX0luYyhOQU5EX0hhbmRsZVR5cGVEZWYgKmhuYW5kLCBOQU5EX0FkZHJlc3NUeXBlRGVmICpwQWRkcmVzcyk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBOQU5EX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAKKyAgKiBAeworICAqLworCisvKiBOQU5EIENvbnRyb2wgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgIEhBTF9OQU5EX0VDQ19FbmFibGUoTkFORF9IYW5kbGVUeXBlRGVmICpobmFuZCk7CitIQUxfU3RhdHVzVHlwZURlZiAgSEFMX05BTkRfRUNDX0Rpc2FibGUoTkFORF9IYW5kbGVUeXBlRGVmICpobmFuZCk7CitIQUxfU3RhdHVzVHlwZURlZiAgSEFMX05BTkRfR2V0RUNDKE5BTkRfSGFuZGxlVHlwZURlZiAqaG5hbmQsIHVpbnQzMl90ICpFQ0N2YWwsIHVpbnQzMl90IFRpbWVvdXQpOworCisvKioKKyAgKiBAfQorICAqLworICAgIAorLyoqIEBhZGR0b2dyb3VwIE5BTkRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAKKyAgKiBAeworICAqLworLyogTkFORCBTdGF0ZSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9OQU5EX1N0YXRlVHlwZURlZiBIQUxfTkFORF9HZXRTdGF0ZShOQU5EX0hhbmRsZVR5cGVEZWYgKmhuYW5kKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisgICAgCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIE5BTkRfUHJpdmF0ZV9Db25zdGFudHMgTkFORCBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisjZGVmaW5lIE5BTkRfREVWSUNFMSAgICAgICAgICAgICAgIEZNQ19CQU5LMgorI2RlZmluZSBOQU5EX0RFVklDRTIgICAgICAgICAgICAgICBGTUNfQkFOSzMKKyNkZWZpbmUgTkFORF9XUklURV9USU1FT1VUICAgICAgICAgMHgwMTAwMDAwMFUKKworI2RlZmluZSBDTURfQVJFQSAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KSgxVTw8MTZVKSkgIC8qIEExNiA9IENMRSBoaWdoICovCisjZGVmaW5lIEFERFJfQVJFQSAgICAgICAgICAgICAgICAgICgodWludDMyX3QpKDFVPDwxN1UpKSAgLyogQTE3ID0gQUxFIGhpZ2ggKi8KKworI2RlZmluZSBOQU5EX0NNRF9BUkVBX0EgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMCkKKyNkZWZpbmUgTkFORF9DTURfQVJFQV9CICAgICAgICAgICAgKCh1aW50OF90KTB4MDEpCisjZGVmaW5lIE5BTkRfQ01EX0FSRUFfQyAgICAgICAgICAgICgodWludDhfdCkweDUwKQorI2RlZmluZSBOQU5EX0NNRF9BUkVBX1RSVUUxICAgICAgICAoKHVpbnQ4X3QpMHgzMCkKKworI2RlZmluZSBOQU5EX0NNRF9XUklURTAgICAgICAgICAgICAoKHVpbnQ4X3QpMHg4MCkKKyNkZWZpbmUgTkFORF9DTURfV1JJVEVfVFJVRTEgICAgICAgKCh1aW50OF90KTB4MTApCisjZGVmaW5lIE5BTkRfQ01EX0VSQVNFMCAgICAgICAgICAgICgodWludDhfdCkweDYwKQorI2RlZmluZSBOQU5EX0NNRF9FUkFTRTEgICAgICAgICAgICAoKHVpbnQ4X3QpMHhEMCkKKyNkZWZpbmUgTkFORF9DTURfUkVBRElEICAgICAgICAgICAgKCh1aW50OF90KTB4OTApCisjZGVmaW5lIE5BTkRfQ01EX1NUQVRVUyAgICAgICAgICAgICgodWludDhfdCkweDcwKQorI2RlZmluZSBOQU5EX0NNRF9MT0NLX1NUQVRVUyAgICAgICAoKHVpbnQ4X3QpMHg3QSkKKyNkZWZpbmUgTkFORF9DTURfUkVTRVQgICAgICAgICAgICAgKCh1aW50OF90KTB4RkYpCisKKy8qIE5BTkQgbWVtb3J5IHN0YXR1cyAqLworI2RlZmluZSBOQU5EX1ZBTElEX0FERFJFU1MgICAgICAgICAweDAwMDAwMTAwVQorI2RlZmluZSBOQU5EX0lOVkFMSURfQUREUkVTUyAgICAgICAweDAwMDAwMjAwVQorI2RlZmluZSBOQU5EX1RJTUVPVVRfRVJST1IgICAgICAgICAweDAwMDAwNDAwVQorI2RlZmluZSBOQU5EX0JVU1kgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVQorI2RlZmluZSBOQU5EX0VSUk9SICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVQorI2RlZmluZSBOQU5EX1JFQURZICAgICAgICAgICAgICAgICAweDAwMDAwMDQwVQorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgTkFORF9Qcml2YXRlX01hY3JvcyBOQU5EIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBOQU5EIG1lbW9yeSBhZGRyZXNzIGNvbXB1dGF0aW9uLgorICAqIEBwYXJhbSAgX19BRERSRVNTX18gTkFORCBtZW1vcnkgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gTkFORCBoYW5kbGUuCisgICogQHJldHZhbCBOQU5EIFJhdyBhZGRyZXNzIHZhbHVlCisgICovCisjZGVmaW5lIEFSUkFZX0FERFJFU1MoX19BRERSRVNTX18gLCBfX0hBTkRMRV9fKSAoKF9fQUREUkVTU19fKS0+UGFnZSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0FERFJFU1NfXyktPkJsb2NrICsgKCgoX19BRERSRVNTX18pLT5QbGFuZSkgKiAoKF9fSEFORExFX18pLT5Db25maWcuUGxhbmVTaXplKSkpKiAoKF9fSEFORExFX18pLT5Db25maWcuQmxvY2tTaXplKSkpCisKKy8qKgorICAqIEBicmllZiAgTkFORCBtZW1vcnkgQ29sdW1uIGFkZHJlc3MgY29tcHV0YXRpb24uCisgICogQHBhcmFtICBfX0hBTkRMRV9fIE5BTkQgaGFuZGxlLgorICAqIEByZXR2YWwgTkFORCBSYXcgYWRkcmVzcyB2YWx1ZQorICAqLworI2RlZmluZSBDT0xVTU5fQUREUkVTUyggX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+Q29uZmlnLlBhZ2VTaXplKQorCisvKioKKyAgKiBAYnJpZWYgIE5BTkQgbWVtb3J5IGFkZHJlc3MgY3ljbGluZy4KKyAgKiBAcGFyYW0gIF9fQUREUkVTU19fIE5BTkQgbWVtb3J5IGFkZHJlc3MuCisgICogQHJldHZhbCBOQU5EIGFkZHJlc3MgY3ljbGluZyB2YWx1ZS4KKyAgKi8KKyNkZWZpbmUgQUREUl8xU1RfQ1lDTEUoX19BRERSRVNTX18pICAgICAgICh1aW50OF90KShfX0FERFJFU1NfXykgICAgICAgICAgICAgIC8qIDFzdCBhZGRyZXNzaW5nIGN5Y2xlICovCisjZGVmaW5lIEFERFJfMk5EX0NZQ0xFKF9fQUREUkVTU19fKSAgICAgICAodWludDhfdCkoKF9fQUREUkVTU19fKSA+PiA4KSAgICAgICAvKiAybmQgYWRkcmVzc2luZyBjeWNsZSAqLworI2RlZmluZSBBRERSXzNSRF9DWUNMRShfX0FERFJFU1NfXykgICAgICAgKHVpbnQ4X3QpKChfX0FERFJFU1NfXykgPj4gMTYpICAgICAgLyogM3JkIGFkZHJlc3NpbmcgY3ljbGUgKi8KKyNkZWZpbmUgQUREUl80VEhfQ1lDTEUoX19BRERSRVNTX18pICAgICAgICh1aW50OF90KSgoX19BRERSRVNTX18pID4+IDI0KSAgICAgIC8qIDR0aCBhZGRyZXNzaW5nIGN5Y2xlICovCisKKy8qKgorICAqIEBicmllZiAgTkFORCBtZW1vcnkgQ29sdW1ucyBjeWNsaW5nLgorICAqIEBwYXJhbSAgX19BRERSRVNTX18gTkFORCBtZW1vcnkgYWRkcmVzcy4KKyAgKiBAcmV0dmFsIE5BTkQgQ29sdW1uIGFkZHJlc3MgY3ljbGluZyB2YWx1ZS4KKyAgKi8KKyNkZWZpbmUgQ09MVU1OXzFTVF9DWUNMRShfX0FERFJFU1NfXykgICAgICAgKHVpbnQ4X3QpKF9fQUREUkVTU19fKSAgICAgICAgICAgICAgLyogMXN0IENvbHVtbiBhZGRyZXNzaW5nIGN5Y2xlICovCisjZGVmaW5lIENPTFVNTl8yTkRfQ1lDTEUoX19BRERSRVNTX18pICAgICAgICh1aW50OF90KSgoX19BRERSRVNTX18pID4+IDgpICAgICAgIC8qIDJuZCBDb2x1bW4gYWRkcmVzc2luZyBjeWNsZSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworLyoqCisgICogQH0KKyAgKi8gCisKKy8qKgorICAqIEB9CisgICovIAorCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJGM3h4X0hBTF9OQU5EX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmYzeHhfaGFsX25vci5oIGIvSW5jL3N0bTMyZjN4eF9oYWxfbm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVjZDg1OQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmYzeHhfaGFsX25vci5oCkBAIC0wLDAgKzEsMjk4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2hhbF9ub3IuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgTk9SIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLyAKKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkYzeHhfSEFMX05PUl9ICisjZGVmaW5lIF9fU1RNMzJGM3h4X0hBTF9OT1JfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisjaW5jbHVkZSAic3RtMzJmM3h4X2xsX2ZtYy5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgTk9SCisgICogQHsKKyAgKi8gCisKKworLyoqIEBhZGR0b2dyb3VwIE5PUl9Qcml2YXRlX0NvbnN0YW50cworICAqIEB7CisgICovCisKKy8qIE5PUiBkZXZpY2UgSURzIGFkZHJlc3NlcyAqLworI2RlZmluZSBNQ19BRERSRVNTICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDBVKQorI2RlZmluZSBERVZJQ0VfQ09ERTFfQUREUiAgICAgICAgKCh1aW50MTZfdCkweDAwMDFVKQorI2RlZmluZSBERVZJQ0VfQ09ERTJfQUREUiAgICAgICAgKCh1aW50MTZfdCkweDAwMEVVKQorI2RlZmluZSBERVZJQ0VfQ09ERTNfQUREUiAgICAgICAgKCh1aW50MTZfdCkweDAwMEZVKQorCisvKiBOT1IgQ0ZJIElEcyBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgQ0ZJMV9BRERSRVNTICAgICAgICAgICAgICgodWludDE2X3QpMHgxMFUpCisjZGVmaW5lIENGSTJfQUREUkVTUyAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MTFVKQorI2RlZmluZSBDRkkzX0FERFJFU1MgICAgICAgICAgICAgKCh1aW50MTZfdCkweDEyVSkKKyNkZWZpbmUgQ0ZJNF9BRERSRVNTICAgICAgICAgICAgICgodWludDE2X3QpMHgxM1UpCisKKy8qIE5PUiBtZW1vcnkgZGF0YSB3aWR0aCAqLworI2RlZmluZSBOT1JfTUVNT1JZXzhCICAgICAgICAgICAgKCh1aW50OF90KTB4MFUpCisjZGVmaW5lIE5PUl9NRU1PUllfMTZCICAgICAgICAgICAoKHVpbnQ4X3QpMHgxVSkKKworLyogTk9SIG1lbW9yeSBkZXZpY2UgcmVhZC93cml0ZSBzdGFydCBhZGRyZXNzICovCisjZGVmaW5lIE5PUl9NRU1PUllfQURSRVNTMSAgICAgICBGTUNfQkFOSzFfMQorI2RlZmluZSBOT1JfTUVNT1JZX0FEUkVTUzIgICAgICAgRk1DX0JBTksxXzIKKyNkZWZpbmUgTk9SX01FTU9SWV9BRFJFU1MzICAgICAgIEZNQ19CQU5LMV8zCisjZGVmaW5lIE5PUl9NRU1PUllfQURSRVNTNCAgICAgICBGTUNfQkFOSzFfNAorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgTk9SX1ByaXZhdGVfTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBOT1IgbWVtb3J5IGFkZHJlc3Mgc2hpZnRpbmcuCisgICogQHBhcmFtICBfX05PUl9BRERSRVNTIE5PUiBiYXNlIGFkZHJlc3MgCisgICogQHBhcmFtICBfX05PUl9NRU1PUllfV0lEVEhfIE5PUiBtZW1vcnkgd2lkdGgKKyAgKiBAcGFyYW0gIF9fQUREUkVTU19fIE5PUiBtZW1vcnkgYWRkcmVzcyAKKyAgKiBAcmV0dmFsIE5PUiBzaGlmdGVkIGFkZHJlc3MgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTk9SX0FERFJfU0hJRlQoX19OT1JfQUREUkVTUywgX19OT1JfTUVNT1JZX1dJRFRIXywgX19BRERSRVNTX18pICAgICAgIFwKKyAgICAgICAgICAgICgodWludDMyX3QpKCgoX19OT1JfTUVNT1JZX1dJRFRIXykgPT0gTk9SX01FTU9SWV8xNkIpPyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KSgoX19OT1JfQUREUkVTUykgKyAoMlUgKiAoX19BRERSRVNTX18pKSkpOiAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KSgoX19OT1JfQUREUkVTUykgKyAoX19BRERSRVNTX18pKSkpKQorCisvKioKKyAgKiBAYnJpZWYgIE5PUiBtZW1vcnkgd3JpdGUgZGF0YSB0byBzcGVjaWZpZWQgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIF9fQUREUkVTU19fIE5PUiBtZW1vcnkgYWRkcmVzcyAKKyAgKiBAcGFyYW0gIF9fREFUQV9fIERhdGEgdG8gd3JpdGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgTk9SX1dSSVRFKF9fQUREUkVTU19fLCBfX0RBVEFfXykgICgqKF9fSU8gdWludDE2X3QgKikoKHVpbnQzMl90KShfX0FERFJFU1NfXykpID0gKF9fREFUQV9fKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisvKiogQGRlZmdyb3VwIE5PUl9FeHBvcnRlZF9UeXBlcyBOT1IgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKiogCisgICogQGJyaWVmICBIQUwgU1JBTSBTdGF0ZSBzdHJ1Y3R1cmVzIGRlZmluaXRpb24gIAorICAqLyAKK3R5cGVkZWYgZW51bQoreyAgCisgIEhBTF9OT1JfU1RBVEVfUkVTRVQgICAgICAgICAgICAgPSAweDAwVSwgIC8qITwgTk9SIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgb3IgZGlzYWJsZWQgICovCisgIEhBTF9OT1JfU1RBVEVfUkVBRFkgICAgICAgICAgICAgPSAweDAxVSwgIC8qITwgTk9SIGluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICAgICovCisgIEhBTF9OT1JfU1RBVEVfQlVTWSAgICAgICAgICAgICAgPSAweDAyVSwgIC8qITwgTk9SIGludGVybmFsIHByb2Nlc3NpbmcgaXMgb25nb2luZyAgICovCisgIEhBTF9OT1JfU1RBVEVfRVJST1IgICAgICAgICAgICAgPSAweDAzVSwgIC8qITwgTk9SIGVycm9yIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICovIAorICBIQUxfTk9SX1NUQVRFX1BST1RFQ1RFRCAgICAgICAgID0gMHgwNCAgIC8qITwgTk9SIE5PUlNSQU0gZGV2aWNlIHdyaXRlIHByb3RlY3RlZCAgKi8KK31IQUxfTk9SX1N0YXRlVHlwZURlZjsgICAgCisKKy8qKgorICAqIEBicmllZiAgRk1DIE5PUiBTdGF0dXMgdHlwZWRlZgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9OT1JfU1RBVFVTX1NVQ0NFU1MgPSAwVSwKKyAgSEFMX05PUl9TVEFUVVNfT05HT0lORywKKyAgSEFMX05PUl9TVEFUVVNfRVJST1IsCisgIEhBTF9OT1JfU1RBVFVTX1RJTUVPVVQKK31IQUxfTk9SX1N0YXR1c1R5cGVEZWY7IAorCisvKioKKyAgKiBAYnJpZWYgIEZNQyBOT1IgSUQgdHlwZWRlZgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDE2X3QgTWFudWZhY3R1cmVyX0NvZGU7ICAvKiE8IERlZmluZXMgdGhlIGRldmljZSdzIG1hbnVmYWN0dXJlciBjb2RlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIG1lbW9yeSAgICAgICAqLworICAKKyAgdWludDE2X3QgRGV2aWNlX0NvZGUxOyAgCisgIAorICB1aW50MTZfdCBEZXZpY2VfQ29kZTI7ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgdWludDE2X3QgRGV2aWNlX0NvZGUzOyAgICAgICAvKiE8IERlZmluZXMgdGhlIGRldmljZSdzIGNvZGVzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIG1lbW9yeS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVzZSBjb2RlcyBjYW4gYmUgYWNjZXNzZWQgYnkgcGVyZm9ybWluZyByZWFkIG9wZXJhdGlvbnMgd2l0aCBzcGVjaWZpYyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgc2lnbmFscyBhbmQgYWRkcmVzc2VzIHNldC5UaGV5IGNhbiBhbHNvIGJlIGFjY2Vzc2VkIGJ5IGlzc3VpbmcgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBBdXRvIFNlbGVjdCBjb21tYW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgIAorfU5PUl9JRFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgRk1DIE5PUiBDRkkgdHlwZWRlZgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDE2X3QgQ0ZJXzE7ICAgICAgICAgICAgCisgIAorICB1aW50MTZfdCBDRklfMjsgICAgICAgICAgCisgIAorICB1aW50MTZfdCBDRklfMzsgICAgICAgICAgICAgICAgICAgICAgCisgIAorICB1aW50MTZfdCBDRklfNDsgIC8qITwgRGVmaW5lcyB0aGUgaW5mb3JtYXRpb24gc3RvcmVkIGluIHRoZSBtZW1vcnkncyBDb21tb24gZmxhc2ggaW50ZXJmYWNlCisgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCBjb250YWlucyBhIGRlc2NyaXB0aW9uIG9mIHZhcmlvdXMgZWxlY3RyaWNhbCBhbmQgdGltaW5nIHBhcmFtZXRlcnMsIAorICAgICAgICAgICAgICAgICAgICAgICAgZGVuc2l0eSBpbmZvcm1hdGlvbiBhbmQgZnVuY3Rpb25zIHN1cHBvcnRlZCBieSB0aGUgbWVtb3J5LiAgICAgICAgICAgICAgICAgICAqLworfU5PUl9DRklUeXBlRGVmOworCisvKiogCisgICogQGJyaWVmICBOT1IgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uICAKKyAgKi8gCit0eXBlZGVmIHN0cnVjdAoreworICBGTUNfTk9SU1JBTV9UeXBlRGVmICAgICAgICAgICAqSW5zdGFuY2U7ICAgIC8qITwgUmVnaXN0ZXIgYmFzZSBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgKi8gCisgIAorICBGTUNfTk9SU1JBTV9FWFRFTkRFRF9UeXBlRGVmICAqRXh0ZW5kZWQ7ICAgIC8qITwgRXh0ZW5kZWQgbW9kZSByZWdpc3RlciBiYXNlIGFkZHJlc3MgICAgICAgICAgKi8KKyAgCisgIEZNQ19OT1JTUkFNX0luaXRUeXBlRGVmICAgICAgIEluaXQ7ICAgICAgICAgLyohPCBOT1IgZGV2aWNlIGNvbnRyb2wgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICAqLworCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgICAgICAgIExvY2s7ICAgICAgICAgLyohPCBOT1IgbG9ja2luZyBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAKKyAgCisgIF9fSU8gSEFMX05PUl9TdGF0ZVR5cGVEZWYgICAgIFN0YXRlOyAgICAgICAgLyohPCBOT1IgZGV2aWNlIGFjY2VzcyBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAqLworICAgCit9Tk9SX0hhbmRsZVR5cGVEZWY7IAorCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgTk9SX0V4cG9ydGVkX01hY3JvcyBOT1IgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiBSZXNldCBOT1IgaGFuZGxlIHN0YXRlCisgICogQHBhcmFtICBfX0hBTkRMRV9fIE5PUiBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfTk9SX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9OT1JfU1RBVEVfUkVTRVQpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgTk9SX0V4cG9ydGVkX0Z1bmN0aW9ucyBOT1IgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIE5PUl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgCisgICogQHsKKyAgKi8KKworLyogSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9OT1JfSW5pdChOT1JfSGFuZGxlVHlwZURlZiAqaG5vciwgRk1DX05PUlNSQU1fVGltaW5nVHlwZURlZiAqVGltaW5nLCBGTUNfTk9SU1JBTV9UaW1pbmdUeXBlRGVmICpFeHRUaW1pbmcpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX05PUl9EZUluaXQoTk9SX0hhbmRsZVR5cGVEZWYgKmhub3IpOwordm9pZCBIQUxfTk9SX01zcEluaXQoTk9SX0hhbmRsZVR5cGVEZWYgKmhub3IpOwordm9pZCBIQUxfTk9SX01zcERlSW5pdChOT1JfSGFuZGxlVHlwZURlZiAqaG5vcik7Cit2b2lkIEhBTF9OT1JfTXNwV2FpdChOT1JfSGFuZGxlVHlwZURlZiAqaG5vciwgdWludDMyX3QgVGltZW91dCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBOT1JfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJbnB1dCBhbmQgT3V0cHV0IGZ1bmN0aW9ucyAKKyAgKiBAeworICAqLworCisvKiBJL08gb3BlcmF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX05PUl9SZWFkX0lEKE5PUl9IYW5kbGVUeXBlRGVmICpobm9yLCBOT1JfSURUeXBlRGVmICpwTk9SX0lEKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9OT1JfUmV0dXJuVG9SZWFkTW9kZShOT1JfSGFuZGxlVHlwZURlZiAqaG5vcik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTk9SX1JlYWQoTk9SX0hhbmRsZVR5cGVEZWYgKmhub3IsIHVpbnQzMl90ICpwQWRkcmVzcywgdWludDE2X3QgKnBEYXRhKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9OT1JfUHJvZ3JhbShOT1JfSGFuZGxlVHlwZURlZiAqaG5vciwgdWludDMyX3QgKnBBZGRyZXNzLCB1aW50MTZfdCAqcERhdGEpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTk9SX1JlYWRCdWZmZXIoTk9SX0hhbmRsZVR5cGVEZWYgKmhub3IsIHVpbnQzMl90IHV3QWRkcmVzcywgdWludDE2X3QgKnBEYXRhLCB1aW50MzJfdCB1d0J1ZmZlclNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX05PUl9Qcm9ncmFtQnVmZmVyKE5PUl9IYW5kbGVUeXBlRGVmICpobm9yLCB1aW50MzJfdCB1d0FkZHJlc3MsIHVpbnQxNl90ICpwRGF0YSwgdWludDMyX3QgdXdCdWZmZXJTaXplKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX05PUl9FcmFzZV9CbG9jayhOT1JfSGFuZGxlVHlwZURlZiAqaG5vciwgdWludDMyX3QgQmxvY2tBZGRyZXNzLCB1aW50MzJfdCBBZGRyZXNzKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9OT1JfRXJhc2VfQ2hpcChOT1JfSGFuZGxlVHlwZURlZiAqaG5vciwgdWludDMyX3QgQWRkcmVzcyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTk9SX1JlYWRfQ0ZJKE5PUl9IYW5kbGVUeXBlRGVmICpobm9yLCBOT1JfQ0ZJVHlwZURlZiAqcE5PUl9DRkkpOworCisvKioKKyAgKiBAfQorICAqLworICAKKy8qKiBAYWRkdG9ncm91cCBOT1JfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zIAorICAqIEB7CisgICovCisKKy8qIE5PUiBDb250cm9sIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTk9SX1dyaXRlT3BlcmF0aW9uX0VuYWJsZShOT1JfSGFuZGxlVHlwZURlZiAqaG5vcik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTk9SX1dyaXRlT3BlcmF0aW9uX0Rpc2FibGUoTk9SX0hhbmRsZVR5cGVEZWYgKmhub3IpOworCisvKioKKyAgKiBAfQorICAqLyAgCisgIAorLyoqIEBhZGR0b2dyb3VwIE5PUl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zIAorICAqIEB7CisgICovCisKKy8qIE5PUiBTdGF0ZSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfTk9SX1N0YXRlVHlwZURlZiBIQUxfTk9SX0dldFN0YXRlKE5PUl9IYW5kbGVUeXBlRGVmICpobm9yKTsKK0hBTF9OT1JfU3RhdHVzVHlwZURlZiBIQUxfTk9SX0dldFN0YXR1cyhOT1JfSGFuZGxlVHlwZURlZiAqaG5vciwgdWludDMyX3QgQWRkcmVzcywgdWludDMyX3QgVGltZW91dCk7CisKKy8qKgorICAqIEB9CisgICovICAKKworLyoqCisgICogQH0KKyAgKi8gIAorCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyRjN4eF9IQUxfTk9SX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmYzeHhfaGFsX29wYW1wLmggYi9JbmMvc3RtMzJmM3h4X2hhbF9vcGFtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOTcwZTkKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2hhbF9vcGFtcC5oCkBAIC0wLDAgKzEsNTA3IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2hhbF9vcGFtcC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBPUEFNUCBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIAorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyRjN4eF9IQUxfT1BBTVBfSAorI2RlZmluZSBfX1NUTTMyRjN4eF9IQUxfT1BBTVBfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkgCisgICAgICAgICAgICAgICAgICAKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIE9QQU1QCisgICogQHsKKyAgKi8gCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorLyoqIEBkZWZncm91cCBPUEFNUF9FeHBvcnRlZF9UeXBlcyBPUEFNUCBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKiAKKyAgKiBAYnJpZWYgIE9QQU1QIEluaXQgc3RydWN0dXJlIGRlZmluaXRpb24gIAorICAqLworICAKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IE1vZGU7ICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIE9QQU1QIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBvZiBAcmVmIE9QQU1QX01vZGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlIGlzIGVpdGhlciBTdGFuZGFsb25lLCAtIEZvbGxvd2VyIG9yIFBHQSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHVpbnQzMl90IEludmVydGluZ0lucHV0OyAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGludmVydGluZyBpbnB1dCBpbiBTdGFuZGFsb25lICYgUGdhIG1vZGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gSW4gU3RhbmRhbG9uZSBtb2RlOiAgIGkuZSB3aGVuIG1vZGUgaXMgT1BBTVBfU1RBTkRBTE9ORV9NT0RFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIG9mIEByZWYgT1BBTVBfSW52ZXJ0aW5nSW5wdXQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52ZXJ0aW5nSW5wdXQgaXMgZWl0aGVyIFZNMCBvciBWTTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBJbiBQR0EgbW9kZTogICAgICAgICAgaS5lIHdoZW4gbW9kZSBpcyBPUEFNUF9QR0FfTU9ERQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgaW4gRm9sbG93ZXIgbW9kZSAgICBpLmUgd2hlbiBtb2RlIGlzIE9QQU1QX0ZPTExPV0VSX01PREUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyBOb3QgQXBwbGljYWJsZSAqLyAKKworICB1aW50MzJfdCBOb25JbnZlcnRpbmdJbnB1dDsgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBub24gaW52ZXJ0aW5nIGlucHV0IG9mIHRoZSBvcGFtcDogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgb2YgQHJlZiBPUEFNUF9Ob25JbnZlcnRpbmdJbnB1dCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbkludmVydGluZ0lucHV0IGlzIGVpdGhlciBWUDAsIFZQMSwgVlAyIG9yIFZQMyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIAorICB1aW50MzJfdCBUaW1lckNvbnRyb2xsZWRNdXhtb2RlOyAgICAgIC8qITwgU3BlY2lmaWVzIGlmIHRoZSBUaW1lciBjb250cm9sbGVkIE11eCBtb2RlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgb2YgQHJlZiBPUEFNUF9UaW1lckNvbnRyb2xsZWRNdXhtb2RlICovCisKKyAgdWludDMyX3QgSW52ZXJ0aW5nSW5wdXRTZWNvbmRhcnk7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgaW52ZXJ0aW5nIGlucHV0IChzZWNvbmRhcnkpIG9mIHRoZSBvcGFtcCB3aGVuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZXJDb250cm9sbGVkTXV4bW9kZSBpcyBlbmFibGVkIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5lLiB3aGVuIFRpbWVyQ29udHJvbGxlZE11eG1vZGUgaXMgT1BBTVBfVElNRVJDT05UUk9MTEVETVVYTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBJbiBTdGFuZGFsb25lIG1vZGU6ICAgaS5lIHdoZW4gbW9kZSBpcyBPUEFNUF9TVEFOREFMT05FX01PREUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgb2YgQHJlZiBPUEFNUF9JbnZlcnRpbmdJbnB1dFNlY29uZGFyeSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZlcnRpbmdJbnB1dFNlY29uZGFyeSBpcyBlaXRoZXIgVk0wIG9yIFZNMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEluIFBHQSBtb2RlOiAgICAgICAgICBpLmUgd2hlbiBtb2RlIGlzIE9QQU1QX1BHQV9NT0RFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBpbiBGb2xsb3dlciBtb2RlICAgIGkuZSB3aGVuIG1vZGUgaXMgT1BBTVBfRk9MTE9XRVJfTU9ERQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIE5vdCBBcHBsaWNhYmxlICovCisgIAorICB1aW50MzJfdCBOb25JbnZlcnRpbmdJbnB1dFNlY29uZGFyeTsgIC8qITwgU3BlY2lmaWVzIHRoZSBub24gaW52ZXJ0aW5nIGlucHV0IChzZWNvbmRhcnkpIG9mIHRoZSBvcGFtcCB3aGVuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZXJDb250cm9sbGVkTXV4bW9kZSBpcyBlbmFibGVkIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5lLiB3aGVuIFRpbWVyQ29udHJvbGxlZE11eG1vZGUgaXMgT1BBTVBfVElNRVJDT05UUk9MTEVETVVYTU9ERV9FTkFCTEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBvZiBAcmVmIE9QQU1QX05vbkludmVydGluZ0lucHV0U2Vjb25kYXJ5IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uSW52ZXJ0aW5nSW5wdXQgaXMgZWl0aGVyIFZQMCwgVlAxLCBWUDIgb3IgVlAzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICB1aW50MzJfdCBQZ2FDb25uZWN0OyAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBpbnZlcnRpbmcgcGluIGluIFBHQSBtb2RlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5lLiB3aGVuIG1vZGUgaXMgT1BBTVBfUEdBX01PREUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgb2YgQHJlZiBPUEFNUF9QZ2FDb25uZWN0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWl0aGVyOiBub3QgY29ubmVjdGVkLCBjb25uZWN0ZWQgdG8gVk0wLCBjb25uZWN0ZWQgdG8gVk0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVk0wIG9yIFZNMSBhcmUgdHlwaWNhbGx5IHVzZWQgZm9yIGV4dGVybmFsIGZpbHRlcmluZykgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgdWludDMyX3QgUGdhR2FpbjsgICAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZ2FpbiBpbiBQR0EgbW9kZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuZS4gd2hlbiBtb2RlIGlzIE9QQU1QX1BHQV9NT0RFLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBvZiBAcmVmIE9QQU1QX1BnYUdhaW4gKDJVLCA0VSwgOCBvciAxNlUgKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB1aW50MzJfdCBVc2VyVHJpbW1pbmc7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSB0cmltbWluZyBtb2RlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIG9mIEByZWYgT1BBTVBfVXNlclRyaW1taW5nIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlclRyaW1taW5nIGlzIGVpdGhlciBmYWN0b3J5IG9yIHVzZXIgdHJpbW1pbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgdWludDMyX3QgVHJpbW1pbmdWYWx1ZVA7ICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgb2Zmc2V0IHRyaW1taW5nIHZhbHVlIChQTU9TKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5lLiB3aGVuIFVzZXJUcmltbWluZyBpcyBPUEFNUF9UUklNTUlOR19VU0VSLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDEgYW5kIE1heF9EYXRhID0gMzFVICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHVpbnQzMl90IFRyaW1taW5nVmFsdWVOOyAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG9mZnNldCB0cmltbWluZyB2YWx1ZSAoTk1PUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuZS4gd2hlbiBVc2VyVHJpbW1pbmcgaXMgT1BBTVBfVFJJTU1JTkdfVVNFUi4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAxIGFuZCBNYXhfRGF0YSA9IDMxVSAqLworICAKK31PUEFNUF9Jbml0VHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiAgSEFMIFN0YXRlIHN0cnVjdHVyZXMgZGVmaW5pdGlvbiAgCisgICovIAorCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX09QQU1QX1NUQVRFX1JFU0VUICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwVSwgLyohPCBPUE1BUCBpcyBub3QgeWV0IEluaXRpYWxpemVkICAgICAgICAgICovCisgIAorICBIQUxfT1BBTVBfU1RBVEVfUkVBRFkgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDFVLCAvKiE8IE9QQU1QIGlzIGluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICovCisgIEhBTF9PUEFNUF9TVEFURV9DQUxJQkJVU1kgICAgICAgICAgID0gMHgwMDAwMDAwMlUsIC8qITwgT1BBTVAgaXMgZW5hYmxlZCBpbiBhdXRvIGNhbGlicmF0aW9uIG1vZGUgKi8KKyAKKyAgSEFMX09QQU1QX1NUQVRFX0JVU1kgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA0VSwgLyohPCBPUEFNUCBpcyBlbmFibGVkIGFuZCBydW5uaW5nIGluIG5vcm1hbCBtb2RlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIEhBTF9PUEFNUF9TVEFURV9CVVNZTE9DS0VEICAgICAgICAgID0gMHgwMDAwMDAwNVUsIC8qITwgT1BBTVAgaXMgbG9ja2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5IHN5c3RlbSByZXNldCBhbGxvd3MgcmVjb25maWd1cmluZyB0aGUgb3BhbXAuICovCisgICAgCit9SEFMX09QQU1QX1N0YXRlVHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiBPUEFNUCBIYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24gdG8gQGJyaWVmICBPUEFNUCBIYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24gCisgICovIAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT1BBTVBfVHlwZURlZiAgICAgICAqSW5zdGFuY2U7ICAgICAgICAgICAgICAgICAgICAvKiE8IE9QQU1QIGluc3RhbmNlJ3MgcmVnaXN0ZXJzIGJhc2UgYWRkcmVzcyAgICovCisgIE9QQU1QX0luaXRUeXBlRGVmICAgSW5pdDsgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPUEFNUCByZXF1aXJlZCBwYXJhbWV0ZXJzICovCisgIEhBTF9TdGF0dXNUeXBlRGVmIFN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPUEFNUCBwZXJpcGhlcmFsIHN0YXR1cyAgICovCisgIEhBTF9Mb2NrVHlwZURlZiAgIExvY2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBMb2NraW5nIG9iamVjdCAgICAgICAgICAqLworICBfX0lPIEhBTF9PUEFNUF9TdGF0ZVR5cGVEZWYgIFN0YXRlOyAgICAgICAgICAgICAgIC8qITwgT1BBTVAgY29tbXVuaWNhdGlvbiBzdGF0ZSAqLworICAKK30gT1BBTVBfSGFuZGxlVHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiBPUEFNUF9UcmltbWluZ1ZhbHVlVHlwZURlZiBAYnJpZWYgICBkZWZpbml0aW9uIAorICAqLyAKKwordHlwZWRlZiAgdWludDMyX3QgT1BBTVBfVHJpbW1pbmdWYWx1ZVR5cGVEZWY7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBPUEFNUF9FeHBvcnRlZF9Db25zdGFudHMgT1BBTVAgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBPUEFNUF9DU1JfSU5JVCBPUEFNUCBDU1IgaW5pdCByZWdpc3RlciBNYXNrIAorICAqIEB7CisgICovCisvKiBVc2VkIGZvciBJbml0IHBoYXNlICovCisjZGVmaW5lIE9QQU1QX0NTUl9VUERBVEVfUEFSQU1FVEVSU19JTklUX01BU0sgKE9QQU1QX0NTUl9UUklNT0ZGU0VUTiB8IE9QQU1QX0NTUl9UUklNT0ZGU0VUUCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE9QQU1QX0NTUl9VU0VSVFJJTSB8IE9QQU1QX0NTUl9QR0dBSU4gfCBPUEFNUF9DU1JfVlBTU0VMIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgT1BBTVBfQ1NSX1ZNU1NFTCB8IE9QQU1QX0NTUl9UQ01FTiB8IE9QQU1QX0NTUl9WUFNFTCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE9QQU1QX0NTUl9WTVNFTCB8IE9QQU1QX0NTUl9GT1JDRVZQKQorCisvKioKKyAgKiBAfQorICAqLyAgICAgICAgIAorCisvKiogQGRlZmdyb3VwIE9QQU1QX01vZGUgT1BBTVAgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIE9QQU1QX1NUQU5EQUxPTkVfTU9ERSAgICAgICAgICAgICgweDAwMDAwMDAwVSkgLyohPCBzdGFuZGFsb25lIG1vZGUgKi8KKyNkZWZpbmUgT1BBTVBfUEdBX01PREUgICAgICAgICAgICAgICAgICAgT1BBTVBfQ1NSX1ZNU0VMXzEgICAgICAvKiE8IFBHQSBtb2RlICovCisjZGVmaW5lIE9QQU1QX0ZPTExPV0VSX01PREUgICAgICAgICAgICAgIE9QQU1QX0NTUl9WTVNFTCAgICAgICAgLyohPCBmb2xsb3dlciBtb2RlICovCisKKworI2RlZmluZSBJU19PUEFNUF9GVU5DVElPTkFMX05PUk1BTE1PREUoSU5QVVQpICgoKElOUFVUKSA9PSBPUEFNUF9TVEFOREFMT05FX01PREUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTlBVVCkgPT0gT1BBTVBfUEdBX01PREUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTlBVVCkgPT0gT1BBTVBfRk9MTE9XRVJfTU9ERSkpCisgICAgCisvKioKKyAgKiBAfQorICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisvKiogQGRlZmdyb3VwIE9QQU1QX05vbkludmVydGluZ0lucHV0IE9QQU1QIE5vbiBJbnZlcnRpbmcgSW5wdXQKKyAgKiBAeworICAqLworCisjZGVmaW5lIE9QQU1QX05PTklOVkVSVElOR0lOUFVUX0lPMCAgICAgICAgIE9QQU1QX0NTUl9WUFNFTCAgICAgICAgIC8qITwgVlAwIChQQTEgZm9yIE9QQU1QMSwgVlAwIFBBNyAgZm9yIE9QQU1QMiwgVlAwIFBCMCAgZm9yIE9QQU1QMywgVlAwIFBCMTMgZm9yIE9QQU1QNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQgdG8gT1BBTVB4IG5vbiBpbnZlcnRpbmcgaW5wdXQgKi8KKyNkZWZpbmUgT1BBTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU8xICAgICAgICAgKDB4MDAwMDAwMDBVKSAgLyohPCBWUDEgKFBBNyBmb3IgT1BBTVAxLCBWUDMgUEQxNCBmb3IgT1BBTVAyLCBWUDEgUEIxMyBmb3IgT1BBTVAzLCBWUDEgUEQxMSBmb3IgT1BBTVA0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCB0byBPUEFNUHggbm9uIGludmVydGluZyBpbnB1dCAqLworI2RlZmluZSBPUEFNUF9OT05JTlZFUlRJTkdJTlBVVF9JTzIgICAgICAgICBPUEFNUF9DU1JfVlBTRUxfMSAgICAgICAvKiE8IFZQMiAoUEEzIGZvciBPUEFNUDEsIFZQMiBQQjAgIGZvciBPUEFNUDIsIFZQMiBQQTEgIGZvciBPUEFNUDMsIFZQMyBQQTQgIGZvciBPUEFNUDQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkIHRvIE9QQU1QeCBub24gaW52ZXJ0aW5nIGlucHV0ICovCisjZGVmaW5lIE9QQU1QX05PTklOVkVSVElOR0lOUFVUX0lPMyAgICAgICAgIE9QQU1QX0NTUl9WUFNFTF8wICAgICAgIC8qITwgVlAzIChQQTUgZm9yIE9QQU1QMSwgVlAxIFBCMTQgZm9yIE9QQU1QMiwgVlAzIFBBNSAgZm9yIE9QQU1QMywgVlAyIFBCMTEgZm9yIE9QQU1QNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQgdG8gT1BBTVB4IG5vbiBpbnZlcnRpbmcgaW5wdXQgKi8KKworI2RlZmluZSBJU19PUEFNUF9OT05JTlZFUlRJTkdfSU5QVVQoSU5QVVQpICgoKElOUFVUKSA9PSBPUEFNUF9OT05JTlZFUlRJTkdJTlBVVF9JTzApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTlBVVCkgPT0gT1BBTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5QVVQpID09IE9QQU1QX05PTklOVkVSVElOR0lOUFVUX0lPMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOUFVUKSA9PSBPUEFNUF9OT05JTlZFUlRJTkdJTlBVVF9JTzMpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIE9QQU1QX0ludmVydGluZ0lucHV0IE9QQU1QIEludmVydGluZyBJbnB1dAorICAqIEB7CisgICovCisKKyNkZWZpbmUgT1BBTVBfSU5WRVJUSU5HSU5QVVRfSU8wICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAvKiE8IGludmVydGluZyBpbnB1dCBjb25uZWN0ZWQgdG8gVk0wICovCisjZGVmaW5lIE9QQU1QX0lOVkVSVElOR0lOUFVUX0lPMSAgICAgICAgIE9QQU1QX0NTUl9WTVNFTF8wICAgICAgICAgICAvKiE8IGludmVydGluZyBpbnB1dCBjb25uZWN0ZWQgdG8gVk0xICovCisKKyNkZWZpbmUgSVNfT1BBTVBfSU5WRVJUSU5HX0lOUFVUKElOUFVUKSAoKChJTlBVVCkgPT0gT1BBTVBfSU5WRVJUSU5HSU5QVVRfSU8wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5QVVQpID09IE9QQU1QX0lOVkVSVElOR0lOUFVUX0lPMSkpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgT1BBTVBfVGltZXJDb250cm9sbGVkTXV4bW9kZSBPUEFNUCBUaW1lciBDb250cm9sbGVkIE11eCBtb2RlCisgICogQHsKKyAgKi8KKyAjZGVmaW5lIE9QQU1QX1RJTUVSQ09OVFJPTExFRE1VWE1PREVfRElTQUJMRSAoMHgwMDAwMDAwMFUpICAgIC8qITwgVGltZXIgY29udHJvbGxlZCBNdXggbW9kZSBkaXNhYmxlZCAqLworICNkZWZpbmUgT1BBTVBfVElNRVJDT05UUk9MTEVETVVYTU9ERV9FTkFCTEUgIE9QQU1QX0NTUl9UQ01FTiAgICAgICAgICAgLyohPCBUaW1lciBjb250cm9sbGVkIE11eCBtb2RlIGVuYWJsZWQgKi8KKyAKKyAjZGVmaW5lIElTX09QQU1QX1RJTUVSQ09OVFJPTExFRF9NVVhNT0RFKE1VWE1PREUpICgoKE1VWE1PREUpID09IE9QQU1QX1RJTUVSQ09OVFJPTExFRE1VWE1PREVfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTVVYTU9ERSkgPT0gT1BBTVBfVElNRVJDT05UUk9MTEVETVVYTU9ERV9FTkFCTEUpKQorLyoqCisgICogQH0KKyAgKi8KKworIC8qKiBAZGVmZ3JvdXAgT1BBTVBfTm9uSW52ZXJ0aW5nSW5wdXRTZWNvbmRhcnkgT1BBTVAgTm9uIEludmVydGluZyBJbnB1dCBTZWNvbmRhcnkKKyAgKiBAeworICAqLworCisjZGVmaW5lIE9QQU1QX1NFQ19OT05JTlZFUlRJTkdJTlBVVF9JTzAgICAgICAgICAgT1BBTVBfQ1NSX1ZQU1NFTCAgICAgICAvKiE8IFZQMCAoUEExIGZvciBPUEFNUDEsIFBBNyBmb3IgT1BBTVAyLCBQQjAgZm9yIE9QQU1QMywgUEIxMyBmb3IgT1BBTVA0KSAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCB0byBPUEFNUHggbm9uIGludmVydGluZyBpbnB1dCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBPUEFNUF9TRUNfTk9OSU5WRVJUSU5HSU5QVVRfSU8xICAgICAgICAgICgweDAwMDAwMDAwVSkgLyohPCBWUDEgKFBBNyBmb3IgT1BBTVAxLCBQRDE0IGZvciBPUEFNUDIsIFBCMTMgZm9yIE9QQU1QMywgUEQxMSBmb3IgT1BBTVA0KSAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCB0byBPUEFNUHggbm9uIGludmVydGluZyBpbnB1dCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgT1BBTVBfU0VDX05PTklOVkVSVElOR0lOUFVUX0lPMiAgICAgICAgICBPUEFNUF9DU1JfVlBTU0VMXzEgICAgIC8qITwgVlAyIChQQTMgZm9yIE9QQU1QMSwgUEIwIGZvciBPUEFNUDIsIFBBMSBmb3IgT1BBTVAzLCBQQTQgZm9yIE9QQU1QNCkgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkIHRvIE9QQU1QeCBub24gaW52ZXJ0aW5nIGlucHV0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIE9QQU1QX1NFQ19OT05JTlZFUlRJTkdJTlBVVF9JTzMgICAgICAgICAgT1BBTVBfQ1NSX1ZQU1NFTF8wICAgICAvKiE8IFZQMyAoUEE1IGZvciBPUEFNUDEsIFBCMTQgZm9yIE9QQU1QMiwgUEE1IGZvciBPUEFNUDMsIFBCMTEgZm9yIE9QQU1QNCkgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCB0byBPUEFNUHggbm9uIGludmVydGluZyBpbnB1dCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisjZGVmaW5lIElTX09QQU1QX1NFQ19OT05JTlZFUlRJTkdJTlBVVChJTlBVVCkgKCgoSU5QVVQpID09IE9QQU1QX1NFQ19OT05JTlZFUlRJTkdJTlBVVF9JTzApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTlBVVCkgPT0gT1BBTVBfU0VDX05PTklOVkVSVElOR0lOUFVUX0lPMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOUFVUKSA9PSBPUEFNUF9TRUNfTk9OSU5WRVJUSU5HSU5QVVRfSU8yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5QVVQpID09IE9QQU1QX1NFQ19OT05JTlZFUlRJTkdJTlBVVF9JTzMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgT1BBTVBfSW52ZXJ0aW5nSW5wdXRTZWNvbmRhcnkgT1BBTVAgSW52ZXJ0aW5nIElucHV0IFNlY29uZGFyeQorICAqIEB7CisgICovCisKKyNkZWZpbmUgT1BBTVBfU0VDX0lOVkVSVElOR0lOUFVUX0lPMCAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgIC8qITwgVk0wIChQQzUgZm9yIE9QQU1QMSBhbmQgT1BBTVAyLCBQQjEwIGZvciBPUEFNUDMgYW5kIE9QQU1QNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkIHRvIE9QQU1QeCBpbnZlcnRpbmcgaW5wdXQgKi8KKyNkZWZpbmUgT1BBTVBfU0VDX0lOVkVSVElOR0lOUFVUX0lPMSAgICAgICAgICBPUEFNUF9DU1JfVk1TU0VMICAgICAgICAgLyohPCBWTTEgKFBBMyBmb3IgT1BBTVAxLCBQQTUgZm9yIE9QQU1QMiwgUEIyIGZvciBPUEFNUDMsIFBEOCBmb3IgT1BBTVA0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCB0byBPUEFNUHggaW52ZXJ0aW5nIGlucHV0ICovCisKKyNkZWZpbmUgSVNfT1BBTVBfU0VDX0lOVkVSVElOR0lOUFVUKElOUFVUKSAoKChJTlBVVCkgPT0gT1BBTVBfU0VDX0lOVkVSVElOR0lOUFVUX0lPMCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTlBVVCkgPT0gT1BBTVBfU0VDX0lOVkVSVElOR0lOUFVUX0lPMSkpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgT1BBTVBfUGdhQ29ubmVjdCBPUEFNUCBQZ2EgQ29ubmVjdAorICAqIEB7CisgICovCisKKyNkZWZpbmUgT1BBTVBfUEdBX0NPTk5FQ1RfSU5WRVJUSU5HSU5QVVRfTk8gICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAvKiE8IEluIFBHQSBtb2RlLCB0aGUgbm9uIGludmVydGluZyBpbnB1dCBpcyBub3QgY29ubmVjdGVkICovCisjZGVmaW5lIE9QQU1QX1BHQV9DT05ORUNUX0lOVkVSVElOR0lOUFVUX0lPMCAgICAgICAgICAgICAgIE9QQU1QX0NTUl9QR0dBSU5fMyAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbiBQR0EgbW9kZSwgdGhlIG5vbiBpbnZlcnRpbmcgaW5wdXQgaXMgY29ubmVjdGVkIHRvIFZNMCAqLworI2RlZmluZSBPUEFNUF9QR0FfQ09OTkVDVF9JTlZFUlRJTkdJTlBVVF9JTzEgICAgICAgICAgICAgIChPUEFNUF9DU1JfUEdHQUlOXzIgfCBPUEFNUF9DU1JfUEdHQUlOXzMpIC8qITwgSW4gUEdBIG1vZGUsIHRoZSBub24gaW52ZXJ0aW5nIGlucHV0IGlzIGNvbm5lY3RlZCB0byBWTTEgKi8KKworI2RlZmluZSBJU19PUEFNUF9QR0FDT05ORUNUKENPTk5FQ1QpICgoKENPTk5FQ1QpID09IE9QQU1QX1BHQV9DT05ORUNUX0lOVkVSVElOR0lOUFVUX05PKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENPTk5FQ1QpID09IE9QQU1QX1BHQV9DT05ORUNUX0lOVkVSVElOR0lOUFVUX0lPMCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENPTk5FQ1QpID09IE9QQU1QX1BHQV9DT05ORUNUX0lOVkVSVElOR0lOUFVUX0lPMSkpCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgT1BBTVBfUGdhR2FpbiBPUEFNUCBQZ2EgR2FpbgorICAqIEB7CisgICovCisKKyNkZWZpbmUgT1BBTVBfUEdBX0dBSU5fMiAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQR0EgZ2FpbiA9ICAyICovCisjZGVmaW5lIE9QQU1QX1BHQV9HQUlOXzQgICAgICAgICAgICAgICAgT1BBTVBfQ1NSX1BHR0FJTl8wICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUEdBIGdhaW4gPSAgNCAqLworI2RlZmluZSBPUEFNUF9QR0FfR0FJTl84ICAgICAgICAgICAgICAgIE9QQU1QX0NTUl9QR0dBSU5fMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBHQSBnYWluID0gIDggKi8KKyNkZWZpbmUgT1BBTVBfUEdBX0dBSU5fMTYgICAgICAgICAgICAgIChPUEFNUF9DU1JfUEdHQUlOXzAgfCBPUEFNUF9DU1JfUEdHQUlOXzEpICAgICAgLyohPCBQR0EgZ2FpbiA9IDE2ICovCisKKyNkZWZpbmUgSVNfT1BBTVBfUEdBX0dBSU4oR0FJTikgKCgoR0FJTikgPT0gT1BBTVBfUEdBX0dBSU5fMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChHQUlOKSA9PSBPUEFNUF9QR0FfR0FJTl80KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEdBSU4pID09IE9QQU1QX1BHQV9HQUlOXzgpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoR0FJTikgPT0gT1BBTVBfUEdBX0dBSU5fMTYpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBPUEFNUF9Vc2VyVHJpbW1pbmcgT1BBTVAgVXNlciBUcmltbWluZworICAqIEB7CisgICovCisKKyNkZWZpbmUgT1BBTVBfVFJJTU1JTkdfRkFDVE9SWSAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGYWN0b3J5IHRyaW1taW5nICovCisjZGVmaW5lIE9QQU1QX1RSSU1NSU5HX1VTRVIgICAgICAgICAgIE9QQU1QX0NTUl9VU0VSVFJJTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVXNlciB0cmltbWluZyAqLworCisjZGVmaW5lIElTX09QQU1QX1RSSU1NSU5HKFRSSU1NSU5HKSAoKChUUklNTUlORykgPT0gT1BBTVBfVFJJTU1JTkdfRkFDVE9SWSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFJJTU1JTkcpID09IE9QQU1QX1RSSU1NSU5HX1VTRVIpKQorCisvKiogQGRlZmdyb3VwIE9QQU1QX0ZhY3RvcnlUcmltbWluZyBPUEFNUCBGYWN0b3J5IFRyaW1taW5nCisgICogQHsKKyAgKi8KKworI2RlZmluZSBPUEFNUF9GQUNUT1JZVFJJTU1JTkdfRFVNTVkgICAgKDB4RkZGRkZGRkZVKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEdW1teSB0cmltbWluZyB2YWx1ZSAqLworCisjZGVmaW5lIE9QQU1QX0ZBQ1RPUllUUklNTUlOR19OICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE9mZnNldCB0cmltbWluZyBOICovCisjZGVmaW5lIE9QQU1QX0ZBQ1RPUllUUklNTUlOR19QICAgICAgICAoMHgwMDAwMDAwMVUpICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE9mZnNldCB0cmltbWluZyBQICovCisKKyNkZWZpbmUgSVNfT1BBTVBfRkFDVE9SWVRSSU1NSU5HKFRSSU1NSU5HKSAoKChUUklNTUlORykgPT0gT1BBTVBfRkFDVE9SWVRSSU1NSU5HX04pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFJJTU1JTkcpID09IE9QQU1QX0ZBQ1RPUllUUklNTUlOR19QKSkKKworLyoqCisgICogQH0KKyAgKi8gCisKKworLyoqIEBkZWZncm91cCBPUEFNUF9UcmltbWluZ1ZhbHVlIE9QQU1QIFRyaW1taW5nIFZhbHVlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBJU19PUEFNUF9UUklNTUlOR1ZBTFVFKFRSSU1NSU5HVkFMVUUpICgoVFJJTU1JTkdWQUxVRSkgPD0gMHgxRlUpCisKKworLyoqCisgICogQH0KKyAgKi8gCisKKworLyoqIEBkZWZncm91cCBPUEFNUF9JbnB1dCBPUEFNUCBJbnB1dAorICAqIEB7CisgICovCisKKyNkZWZpbmUgT1BBTVBfSU5QVVRfSU5WRVJUSU5HICAgICAgICAgICAgICAgICAoIDI0VSkgLyohPCBJbnZlcnRpbmcgaW5wdXQgKi8KKyNkZWZpbmUgT1BBTVBfSU5QVVRfTk9OSU5WRVJUSU5HICAgICAgICAgICAgICAoIDE5VSkgLyohPCBOb24gaW52ZXJ0aW5nIGlucHV0ICovCisKKyNkZWZpbmUgSVNfT1BBTVBfSU5QVVQoSU5QVVQpICgoKElOUFVUKSA9PSBPUEFNUF9JTlBVVF9JTlZFUlRJTkcpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOUFVUKSA9PSBPUEFNUF9JTlBVVF9OT05JTlZFUlRJTkcpKQorLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIE9QQU1QX1ZSRUYgT1BBTVAgVlJFRgorICAqIEB7CisgICovCisKKyNkZWZpbmUgT1BBTVBfVlJFRl8zVkREQSAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgLyohPCBPUE1BUCBWcmVmID0gMy4zVSUgVkREQSAqLworI2RlZmluZSBPUEFNUF9WUkVGXzEwVkREQSAgICAgICAgICAgICAgICAgICAgT1BBTVBfQ1NSX0NBTFNFTF8wICAgICAvKiE8IE9QTUFQIFZyZWYgPSAxMFUlIFZEREEgICovCisjZGVmaW5lIE9QQU1QX1ZSRUZfNTBWRERBICAgICAgICAgICAgICAgICAgICBPUEFNUF9DU1JfQ0FMU0VMXzEgICAgIC8qITwgT1BNQVAgVnJlZiA9IDUwVSUgVkREQSAgKi8KKyNkZWZpbmUgT1BBTVBfVlJFRl85MFZEREEgICAgICAgICAgICAgICAgICAgIE9QQU1QX0NTUl9DQUxTRUwgICAgICAgLyohPCBPUE1BUCBWcmVmID0gOTBVJSBWRERBICAqLworCisjZGVmaW5lIElTX09QQU1QX1ZSRUYoVlJFRikgKCgoVlJFRikgPT0gT1BBTVBfVlJFRl8zVkREQSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWUkVGKSA9PSBPUEFNUF9WUkVGXzEwVkREQSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZSRUYpID09IE9QQU1QX1ZSRUZfNTBWRERBKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVlJFRikgPT0gT1BBTVBfVlJFRl85MFZEREEpKQorCisvKioKKyAgKiBAfQorICAqLyAKKworIC8qKiBAZGVmZ3JvdXAgT1BBTVBfVnJlZjJBRENmb3JDYWxpYiBPUEFNUCBWcmVmMkFEQ2ZvckNhbGliCisgICovCisgCisjZGVmaW5lIE9QQU1QX1ZSRUZfTk9UQ09OTkVDVEVEVE9fQURDICAgICAgICAgICgweDAwMDAwMDAwVSkgLyohPCBWUkVGIG5vdCBjb25uZWN0ZWQgdG8gQURDICovCisjZGVmaW5lIE9QQU1QX1ZSRUZfQ09OTkVDVEVEVE9fQURDICAgICAgICAgICAgICgweDAwMDAwMDAxVSkgLyohPCBWUkVGIG5vdCBjb25uZWN0ZWQgdG8gQURDICovCisgICAgCisjZGVmaW5lIElTX09QQU1QX0FMTE9QQU1QVlJFRl9DT05ORUNUKENPTk5FQ1QpICgoKENPTk5FQ1QpID09IE9QQU1QX1ZSRUZfTk9UQ09OTkVDVEVEVE9fQURDKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENPTk5FQ1QpID09IE9QQU1QX1ZSRUZfQ09OTkVDVEVEVE9fQURDKSkKKyAgICAKKworIC8qKgorICAqIEB9CisgICovIAorICAgIAorIC8qKgorICAqIEB9CisgICovIAorCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBPUEFNUF9FeHBvcnRlZF9NYWNyb3MgT1BBTVAgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiBSZXNldCBPUEFNUCBoYW5kbGUgc3RhdGUKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gT1BBTVAgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9PUEFNUF9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfT1BBTVBfU1RBVEVfUkVTRVQpCisKKy8qKgorICAqIEB9CisgICovIAorCisvKiBJbmNsdWRlIE9QQU1QIEhBTCBFeHRlbmRlZCBtb2R1bGUgKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX29wYW1wX2V4LmgiCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIE9QQU1QX0V4cG9ydGVkX0Z1bmN0aW9ucyBPUEFNUCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIE9QQU1QX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIEluaXRpYWxpemF0aW9uL2RlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9PUEFNUF9Jbml0KE9QQU1QX0hhbmRsZVR5cGVEZWYgKmhvcGFtcCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfT1BBTVBfRGVJbml0IChPUEFNUF9IYW5kbGVUeXBlRGVmICpob3BhbXApOwordm9pZCBIQUxfT1BBTVBfTXNwSW5pdChPUEFNUF9IYW5kbGVUeXBlRGVmICpob3BhbXApOwordm9pZCBIQUxfT1BBTVBfTXNwRGVJbml0KE9QQU1QX0hhbmRsZVR5cGVEZWYgKmhvcGFtcCk7CisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgT1BBTVBfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbiBmdW5jdGlvbnMgCisgICogQHsKKyAgKi8KKworLyogSS9PIG9wZXJhdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX09QQU1QX1N0YXJ0KE9QQU1QX0hhbmRsZVR5cGVEZWYgKmhvcGFtcCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfT1BBTVBfU3RvcChPUEFNUF9IYW5kbGVUeXBlRGVmICpob3BhbXApOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX09QQU1QX1NlbGZDYWxpYnJhdGUoT1BBTVBfSGFuZGxlVHlwZURlZiAqaG9wYW1wKTsgCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgT1BBTVBfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zIAorICAqIEB7CisgICovCisKKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9PUEFNUF9Mb2NrKE9QQU1QX0hhbmRsZVR5cGVEZWYgKmhvcGFtcCk7IAorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIE9QQU1QX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgCisgICogQHsKKyAgKi8KKworLyogUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX09QQU1QX1N0YXRlVHlwZURlZiBIQUxfT1BBTVBfR2V0U3RhdGUoT1BBTVBfSGFuZGxlVHlwZURlZiAqaG9wYW1wKTsKK09QQU1QX1RyaW1taW5nVmFsdWVUeXBlRGVmIEhBTF9PUEFNUF9HZXRUcmltT2Zmc2V0IChPUEFNUF9IYW5kbGVUeXBlRGVmICpob3BhbXAsIHVpbnQzMl90IHRyaW1taW5nb2Zmc2V0KTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8gCisKKy8qKgorICAqIEB9CisgICovIAorCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggICAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJGM3h4X0hBTF9PUEFNUF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2hhbF9vcGFtcF9leC5oIGIvSW5jL3N0bTMyZjN4eF9oYWxfb3BhbXBfZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTE3NmM3Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjN4eF9oYWxfb3BhbXBfZXguaApAQCAtMCwwICsxLDExNSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfb3BhbXBfZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgT1BBTVAgSEFMIEV4dGVuZGVkIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0hBTF9PUEFNUF9FWF9ICisjZGVmaW5lIF9fU1RNMzJGM3h4X0hBTF9PUEFNUF9FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KSAKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgT1BBTVBFeCBPUEFNUEV4CisgICogQHsKKyAgKi8KKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgT1BBTVBFeF9FeHBvcnRlZF9GdW5jdGlvbnMgT1BBTVAgRXh0ZW5kZWQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIE9QQU1QRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJL08gb3BlcmF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4QykKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX09QQU1QRXhfU2VsZkNhbGlicmF0ZUFsbChPUEFNUF9IYW5kbGVUeXBlRGVmICpob3BhbXAxLCBPUEFNUF9IYW5kbGVUeXBlRGVmICpob3BhbXAyKTsgCisKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkgCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfT1BBTVBFeF9TZWxmQ2FsaWJyYXRlQWxsKE9QQU1QX0hhbmRsZVR5cGVEZWYgKmhvcGFtcDEsIE9QQU1QX0hhbmRsZVR5cGVEZWYgKmhvcGFtcDIsIE9QQU1QX0hhbmRsZVR5cGVEZWYgKmhvcGFtcDMsIE9QQU1QX0hhbmRsZVR5cGVEZWYgKmhvcGFtcDQpOworI2VuZGlmIC8qIFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggICAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmIC8qIF9fU1RNMzJGM3h4X0hBTF9PUEFNUF9FWF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2hhbF9wY2NhcmQuaCBiL0luYy9zdG0zMmYzeHhfaGFsX3BjY2FyZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNjMzY2MKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2hhbF9wY2NhcmQuaApAQCAtMCwwICsxLDI0NyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfcGNjYXJkLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFBDQ0FSRCBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8gCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0hBTF9QQ0NBUkRfSAorI2RlZmluZSBfX1NUTTMyRjN4eF9IQUxfUENDQVJEX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KQorI2luY2x1ZGUgInN0bTMyZjN4eF9sbF9mbWMuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFBDQ0FSRAorICAqIEB7CisgICovIAorCisvKiogQGFkZHRvZ3JvdXAgUENDQVJEX1ByaXZhdGVfQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKyAgCisjZGVmaW5lIFBDQ0FSRF9ERVZJQ0VfQUREUkVTUyAgICAgICAgICAgRk1DX0JBTks0CisjZGVmaW5lIFBDQ0FSRF9BVFRSSUJVVEVfU1BBQ0VfQUREUkVTUyAgKCh1aW50MzJfdCkoRk1DX0JBTks0ICsgMHgwODAwMDAwMFUpKSAgLyogQXR0cmlidXRlIHNwYWNlIHNpemUgdG8gQDB4OUJGRiBGRkZGICovCisjZGVmaW5lIFBDQ0FSRF9DT01NT05fU1BBQ0VfQUREUkVTUyAgICAgUENDQVJEX0RFVklDRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29tbW9uIHNwYWNlIHNpemUgdG8gQDB4OTNGRiBGRkZGICAgICovCisjZGVmaW5lIFBDQ0FSRF9JT19TUEFDRV9BRERSRVNTICAgICAgICAgKCh1aW50MzJfdCkoRk1DX0JBTks0ICsgMHgwQzAwMDAwMFUpKSAgLyogSU8gc3BhY2Ugc2l6ZSB0byBAMHg5RkZGIEZGRkYgICAgICAgICovCisjZGVmaW5lIFBDQ0FSRF9JT19TUEFDRV9QUklNQVJZX0FERFIgICAgKCh1aW50MzJfdCkoRk1DX0JBTks0ICsgMHgwQzAwMDFGMFUpKSAgLyogSU8gc3BhY2Ugc2l6ZSB0byBAMHg5RkZGIEZGRkYgICAgICAgICovCisKKy8qIENvbXBhY3QgRmxhc2gtQVRBIHJlZ2lzdGVycyBkZXNjcmlwdGlvbiAqLworI2RlZmluZSBBVEFfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAwVSkgICAgLyogRGF0YSByZWdpc3RlciAqLworI2RlZmluZSBBVEFfU0VDVE9SX0NPVU5UICAgICAgICAgICAgICAgICgodWludDhfdCkweDAyVSkgICAgLyogU2VjdG9yIENvdW50IHJlZ2lzdGVyICovCisjZGVmaW5lIEFUQV9TRUNUT1JfTlVNQkVSICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDNVKSAgICAvKiBTZWN0b3IgTnVtYmVyIHJlZ2lzdGVyICovCisjZGVmaW5lIEFUQV9DWUxJTkRFUl9MT1cgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgICAvKiBDeWxpbmRlciBsb3cgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVRBX0NZTElOREVSX0hJR0ggICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAgIC8qIEN5bGluZGVyIGhpZ2ggcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVRBX0NBUkRfSEVBRCAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNlUpICAgIC8qIENhcmQvSGVhZCByZWdpc3RlciAqLworI2RlZmluZSBBVEFfU1RBVFVTX0NNRCAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA3VSkgICAgLyogU3RhdHVzKHJlYWQpL0NvbW1hbmQod3JpdGUpIHJlZ2lzdGVyICovCisjZGVmaW5lIEFUQV9TVEFUVVNfQ01EX0FMVEVSTkFURSAgICAgICAgKCh1aW50OF90KTB4MEVVKSAgICAvKiBBbHRlcm5hdGUgU3RhdHVzKHJlYWQpL0NvbW1hbmQod3JpdGUpIHJlZ2lzdGVyICovCisjZGVmaW5lIEFUQV9DT01NT05fREFUQV9BUkVBICAgICAgICAgICAgKCh1aW50MTZfdCkweDA0MDBVKSAvKiBTdGFydCBvZiBkYXRhIGFyZWEgKGZvciBDb21tb24gYWNjZXNzIG9ubHkhKSAqLworI2RlZmluZSBBVEFfQ0FSRF9DT05GSUdVUkFUSU9OICAgICAgICAgICgodWludDE2X3QpMHgwMjAyVSkgLyogQ2FyZCBDb25maWd1cmF0aW9uIGFuZCBTdGF0dXMgUmVnaXN0ZXIgKi8KKworLyogQ29tcGFjdCBGbGFzaC1BVEEgY29tbWFuZHMgKi8KKyNkZWZpbmUgQVRBX1JFQURfU0VDVE9SX0NNRCAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgyMFUpCisjZGVmaW5lIEFUQV9XUklURV9TRUNUT1JfQ01EICAgICAgICAgICAgKCh1aW50OF90KTB4MzBVKQorI2RlZmluZSBBVEFfRVJBU0VfU0VDVE9SX0NNRCAgICAgICAgICAgICgodWludDhfdCkweEMwVSkKKyNkZWZpbmUgQVRBX0lERU5USUZZX0NNRCAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHhFQ1UpCisKKy8qIENvbXBhY3QgRmxhc2ggc3RhdHVzICovCisjZGVmaW5lIFBDQ0FSRF9USU1FT1VUX0VSUk9SICAgICAgICAgICAgKCh1aW50OF90KTB4NjBVKQorI2RlZmluZSBQQ0NBUkRfQlVTWSAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDgwVSkKKyNkZWZpbmUgUENDQVJEX1BST0dSICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpCisjZGVmaW5lIFBDQ0FSRF9SRUFEWSAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4NDBVKQorCisjZGVmaW5lIFBDQ0FSRF9TRUNUT1JfU0laRSAgICAgICAgICAgICAgKDI1NVUpICAgIC8qIEluIGhhbGYgd29yZHMgKi8gCisgCisKKy8qIENvbXBhY3QgRmxhc2ggcmVkZWZpbml0aW9uICovCisjZGVmaW5lIEhBTF9DRl9SZWFkX0lEICAgICAgICAgICAgICBIQUxfUENDQVJEX1JlYWRfSUQKKyNkZWZpbmUgSEFMX0NGX1dyaXRlX1NlY3RvciAgICAgICAgIEhBTF9QQ0NBUkRfV3JpdGVfU2VjdG9yCisjZGVmaW5lIEhBTF9DRl9SZWFkX1NlY3RvciAgICAgICAgICBIQUxfUENDQVJEX1JlYWRfU2VjdG9yCisjZGVmaW5lIEhBTF9DRl9FcmFzZV9TZWN0b3IgICAgICAgICBIQUxfUENDQVJEX0VyYXNlX1NlY3RvcgorI2RlZmluZSBIQUxfQ0ZfUmVzZXQgICAgICAgICAgICAgICAgSEFMX1BDQ0FSRF9SZXNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBIQUxfQ0ZfR2V0U3RhdHVzICAgICAgICAgICAgSEFMX1BDQ0FSRF9HZXRTdGF0dXMKKyNkZWZpbmUgSEFMX0NGX1JlYWRTdGF0dXMgICAgICAgICAgIEhBTF9QQ0NBUkRfUmVhZFN0YXR1cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBDRl9TVUNDRVNTICAgICAgICAgICAgICAgICAgSEFMX1BDQ0FSRF9TVEFUVVNfU1VDQ0VTUworI2RlZmluZSBDRl9PTkdPSU5HICAgICAgICAgICAgICAgICAgSEFMX1BDQ0FSRF9TVEFUVVNfT05HT0lORworI2RlZmluZSBDRl9FUlJPUiAgICAgICAgICAgICAgICAgICAgSEFMX1BDQ0FSRF9TVEFUVVNfRVJST1IKKyNkZWZpbmUgQ0ZfVElNRU9VVCAgICAgICAgICAgICAgICAgIEhBTF9QQ0NBUkRfU1RBVFVTX1RJTUVPVVQKKyNkZWZpbmUgSEFMX1BDQ0FSRF9TdGF0dXNUeXBlRGVmICAgICAgICAgICAgSEFMX1BDQ0FSRF9TdGF0dXNUeXBlRGVmCisKKworI2RlZmluZSBDRl9ERVZJQ0VfQUREUkVTUyAgICAgICAgICAgUENDQVJEX0RFVklDRV9BRERSRVNTICAgICAgICAgICAgICAgCisjZGVmaW5lIENGX0FUVFJJQlVURV9TUEFDRV9BRERSRVNTICBQQ0NBUkRfQVRUUklCVVRFX1NQQUNFX0FERFJFU1MKKyNkZWZpbmUgQ0ZfQ09NTU9OX1NQQUNFX0FERFJFU1MgICAgIFBDQ0FSRF9DT01NT05fU1BBQ0VfQUREUkVTUyAgIAorI2RlZmluZSBDRl9JT19TUEFDRV9BRERSRVNTICAgICAgICAgUENDQVJEX0lPX1NQQUNFX0FERFJFU1MgICAgICAgCisjZGVmaW5lIENGX0lPX1NQQUNFX1BSSU1BUllfQUREUiAgICBQQ0NBUkRfSU9fU1BBQ0VfUFJJTUFSWV9BRERSICAKKworI2RlZmluZSBDRl9USU1FT1VUX0VSUk9SICAgICAgICAgICAgUENDQVJEX1RJTUVPVVRfRVJST1IKKyNkZWZpbmUgQ0ZfQlVTWSAgICAgICAgICAgICAgICAgICAgIFBDQ0FSRF9CVVNZICAgICAgICAgCisjZGVmaW5lIENGX1BST0dSICAgICAgICAgICAgICAgICAgICBQQ0NBUkRfUFJPR1IgICAgICAgIAorI2RlZmluZSBDRl9SRUFEWSAgICAgICAgICAgICAgICAgICAgUENDQVJEX1JFQURZICAgICAgICAKKworI2RlZmluZSBDRl9TRUNUT1JfU0laRSAgICAgICAgICAgICAgUENDQVJEX1NFQ1RPUl9TSVpFCisKKy8qKgorICAqIEB9CisgICovIAorCisvKiBFeHBvcnRlZCB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQQ0NBUkRfRXhwb3J0ZWRfVHlwZXMgUENDQVJEIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqIAorICAqIEBicmllZiAgSEFMIFBDQ0FSRCBTdGF0ZSBzdHJ1Y3R1cmVzIGRlZmluaXRpb24gIAorICAqLyAKK3R5cGVkZWYgZW51bQoreworICBIQUxfUENDQVJEX1NUQVRFX1JFU0VUICAgICA9IDB4MDBVLCAgICAvKiE8IFBDQ0FSRCBwZXJpcGhlcmFsIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgb3IgZGlzYWJsZWQgKi8KKyAgSEFMX1BDQ0FSRF9TVEFURV9SRUFEWSAgICAgPSAweDAxVSwgICAgLyohPCBQQ0NBUkQgcGVyaXBoZXJhbCByZWFkeSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEhBTF9QQ0NBUkRfU1RBVEVfQlVTWSAgICAgID0gMHgwMlUsICAgIC8qITwgUENDQVJEIHBlcmlwaGVyYWwgYnVzeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgIAorICBIQUxfUENDQVJEX1NUQVRFX0VSUk9SICAgICA9IDB4MDQgICAgIC8qITwgUENDQVJEIHBlcmlwaGVyYWwgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfUhBTF9QQ0NBUkRfU3RhdGVUeXBlRGVmOworIAordHlwZWRlZiBlbnVtCit7CisgIEhBTF9QQ0NBUkRfU1RBVFVTX1NVQ0NFU1MgPSAwVSwKKyAgSEFMX1BDQ0FSRF9TVEFUVVNfT05HT0lORywKKyAgSEFMX1BDQ0FSRF9TVEFUVVNfRVJST1IsCisgIEhBTF9QQ0NBUkRfU1RBVFVTX1RJTUVPVVQKK31IQUxfUENDQVJEX1N0YXR1c1R5cGVEZWY7CisKKy8qKiAKKyAgKiBAYnJpZWYgIEZNQ19QQ0NBUkQgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uICAKKyAgKi8gICAKK3R5cGVkZWYgc3RydWN0Cit7CisgIEZNQ19QQ0NBUkRfVHlwZURlZiAgICAgICAgICAgKkluc3RhbmNlOyAgICAgICAgICAgICAgLyohPCBSZWdpc3RlciBiYXNlIGFkZHJlc3MgZm9yIFBDQ0FSRCBkZXZpY2UgICAgICAgICAgKi8KKyAgCisgIEZNQ19QQ0NBUkRfSW5pdFR5cGVEZWYgICAgICAgSW5pdDsgICAgICAgICAgICAgICAgICAgLyohPCBQQ0NBUkQgZGV2aWNlIGNvbnRyb2wgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICAgKi8KKworICBfX0lPIEhBTF9QQ0NBUkRfU3RhdGVUeXBlRGVmIFN0YXRlOyAgICAgICAgICAgICAgICAgIC8qITwgUENDQVJEIGRldmljZSBhY2Nlc3Mgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICovCisgICAKKyAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgICAgICBMb2NrOyAgICAgICAgICAgICAgICAgICAvKiE8IFBDQ0FSRCBMb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAKKyAKK31QQ0NBUkRfSGFuZGxlVHlwZURlZjsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQQ0NBUkRfRXhwb3J0ZWRfTWFjcm9zIFBDQ0FSRCBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmIFJlc2V0IFBDQ0FSRCBoYW5kbGUgc3RhdGUKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBQQ0NBUkQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9QQ0NBUkRfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX1BDQ0FSRF9TVEFURV9SRVNFVCkKKy8qKgorICAqIEB9CisgICovIAorCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFBDQ0FSRF9FeHBvcnRlZF9GdW5jdGlvbnMgUENDQVJEIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBQQ0NBUkRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIAorICAqIEB7CisgICovCisvKiBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiAgSEFMX1BDQ0FSRF9Jbml0KFBDQ0FSRF9IYW5kbGVUeXBlRGVmICpocGNjYXJkLCBGTUNfTkFORF9QQ0NfVGltaW5nVHlwZURlZiAqQ29tU3BhY2VUaW1pbmcsIEZNQ19OQU5EX1BDQ19UaW1pbmdUeXBlRGVmICpBdHRTcGFjZVRpbWluZywgRk1DX05BTkRfUENDX1RpbWluZ1R5cGVEZWYgKklPU3BhY2VUaW1pbmcpOworSEFMX1N0YXR1c1R5cGVEZWYgIEhBTF9QQ0NBUkRfRGVJbml0KFBDQ0FSRF9IYW5kbGVUeXBlRGVmICpocGNjYXJkKTsgICAKK3ZvaWQgSEFMX1BDQ0FSRF9Nc3BJbml0KFBDQ0FSRF9IYW5kbGVUeXBlRGVmICpocGNjYXJkKTsKK3ZvaWQgSEFMX1BDQ0FSRF9Nc3BEZUluaXQoUENDQVJEX0hhbmRsZVR5cGVEZWYgKmhwY2NhcmQpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFBDQ0FSRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElucHV0IE91dHB1dCBhbmQgbWVtb3J5IGZ1bmN0aW9ucyAKKyAgKiBAeworICAqLworLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiAgSEFMX1BDQ0FSRF9SZWFkX0lEKFBDQ0FSRF9IYW5kbGVUeXBlRGVmICpocGNjYXJkLCB1aW50OF90IENvbXBhY3RGbGFzaF9JRFtdLCB1aW50OF90ICpwU3RhdHVzKTsKK0hBTF9TdGF0dXNUeXBlRGVmICBIQUxfUENDQVJEX1dyaXRlX1NlY3RvcihQQ0NBUkRfSGFuZGxlVHlwZURlZiAqaHBjY2FyZCwgdWludDE2X3QgKnBCdWZmZXIsIHVpbnQxNl90IFNlY3RvckFkZHJlc3MsICB1aW50OF90ICpwU3RhdHVzKTsKK0hBTF9TdGF0dXNUeXBlRGVmICBIQUxfUENDQVJEX1JlYWRfU2VjdG9yKFBDQ0FSRF9IYW5kbGVUeXBlRGVmICpocGNjYXJkLCB1aW50MTZfdCAqcEJ1ZmZlciwgdWludDE2X3QgU2VjdG9yQWRkcmVzcywgdWludDhfdCAqcFN0YXR1cyk7CitIQUxfU3RhdHVzVHlwZURlZiAgSEFMX1BDQ0FSRF9FcmFzZV9TZWN0b3IoUENDQVJEX0hhbmRsZVR5cGVEZWYgKmhwY2NhcmQsIHVpbnQxNl90IFNlY3RvckFkZHJlc3MsIHVpbnQ4X3QgKnBTdGF0dXMpOworSEFMX1N0YXR1c1R5cGVEZWYgIEhBTF9QQ0NBUkRfUmVzZXQoUENDQVJEX0hhbmRsZVR5cGVEZWYgKmhwY2NhcmQpOwordm9pZCAgICAgICAgICAgICAgIEhBTF9QQ0NBUkRfSVJRSGFuZGxlcihQQ0NBUkRfSGFuZGxlVHlwZURlZiAqaHBjY2FyZCk7Cit2b2lkICAgICAgICAgICAgICAgSEFMX1BDQ0FSRF9JVENhbGxiYWNrKFBDQ0FSRF9IYW5kbGVUeXBlRGVmICpocGNjYXJkKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQQ0NBUkRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAKKyAgKiBAeworICAqLworLyogUENDQVJEIFN0YXRlIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1BDQ0FSRF9TdGF0ZVR5cGVEZWYgSEFMX1BDQ0FSRF9HZXRTdGF0ZShQQ0NBUkRfSGFuZGxlVHlwZURlZiAqaHBjY2FyZCk7CitIQUxfUENDQVJEX1N0YXR1c1R5cGVEZWYgSEFMX1BDQ0FSRF9HZXRTdGF0dXMoUENDQVJEX0hhbmRsZVR5cGVEZWYgKmhwY2NhcmQpOworSEFMX1BDQ0FSRF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0NBUkRfUmVhZFN0YXR1cyhQQ0NBUkRfSGFuZGxlVHlwZURlZiAqaHBjY2FyZCk7CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworLyoqCisgICogQH0KKyAgKi8gCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCAqLworICAKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyRjN4eF9IQUxfUENDQVJEX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmYzeHhfaGFsX3BjZC5oIGIvSW5jL3N0bTMyZjN4eF9oYWxfcGNkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI2Nzk1YgotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmYzeHhfaGFsX3BjZC5oCkBAIC0wLDAgKzEsODkxIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2hhbF9wY2QuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgUENEIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLyAKKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkYzeHhfSEFMX1BDRF9ICisjZGVmaW5lIF9fU1RNMzJGM3h4X0hBTF9QQ0RfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMng4KSAgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzNzN4QykKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgUENECisgICogQHsKKyAgKi8gCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorLyoqIEBkZWZncm91cCBQQ0RfRXhwb3J0ZWRfVHlwZXMgUENEIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqIAorICAqIEBicmllZiAgUENEIFN0YXRlIHN0cnVjdHVyZSBkZWZpbml0aW9uICAKKyAgKi8gIAordHlwZWRlZiBlbnVtIAoreworICBIQUxfUENEX1NUQVRFX1JFU0VUICAgPSAweDAwVSwKKyAgSEFMX1BDRF9TVEFURV9SRUFEWSAgID0gMHgwMVUsCisgIEhBTF9QQ0RfU1RBVEVfRVJST1IgICA9IDB4MDJVLAorICBIQUxfUENEX1NUQVRFX0JVU1kgICAgPSAweDAzVSwKKyAgSEFMX1BDRF9TVEFURV9USU1FT1VUID0gMHgwNFUKK30gUENEX1N0YXRlVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBQQ0QgZG91YmxlIGJ1ZmZlcmVkIGVuZHBvaW50IGRpcmVjdGlvbgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIFBDRF9FUF9EQlVGX09VVCwKKyAgUENEX0VQX0RCVUZfSU4sCisgIFBDRF9FUF9EQlVGX0VSUiwKK31QQ0RfRVBfREJVRl9ESVI7CisKKy8qKgorICAqIEBicmllZiAgUENEIGVuZHBvaW50IGJ1ZmZlciBudW1iZXIgCisgICovCit0eXBlZGVmIGVudW0gCit7CisgIFBDRF9FUF9OT0JVRiwKKyAgUENEX0VQX0JVRjAsCisgIFBDRF9FUF9CVUYxCit9UENEX0VQX0JVRl9OVU07ICAKKworLyoqIAorICAqIEBicmllZiAgUENEIEluaXRpYWxpemF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uICAKKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IGRldl9lbmRwb2ludHM7ICAgICAgICAvKiE8IERldmljZSBFbmRwb2ludHMgbnVtYmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBkZXBlbmRzIG9uIHRoZSB1c2VkIFVTQiBjb3JlLiAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAxIGFuZCBNYXhfRGF0YSA9IDE1ICovICAgIAorCisgIHVpbnQzMl90IHNwZWVkOyAgICAgICAgICAgICAgICAvKiE8IFVTQiBDb3JlIHNwZWVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgUENEX0NvcmVfU3BlZWQgICAgICAgICAgICAgICAgICovICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHVpbnQzMl90IGVwMF9tcHM7ICAgICAgICAgICAgICAvKiE8IFNldCB0aGUgRW5kcG9pbnQgMCBNYXggUGFja2V0IHNpemUuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgUENEX0VQMF9NUFMgICAgICAgICAgICAgICAgICAgICovICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgCisgIHVpbnQzMl90IHBoeV9pdGZhY2U7ICAgICAgICAgICAvKiE8IFNlbGVjdCB0aGUgdXNlZCBQSFkgaW50ZXJmYWNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgUENEX0NvcmVfUEhZICAgICAgICAgICAgICAgICAgICovIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgdWludDMyX3QgU29mX2VuYWJsZTsgICAgICAgICAgIC8qITwgRW5hYmxlIG9yIGRpc2FibGUgdGhlIG91dHB1dCBvZiB0aGUgU09GIHNpZ25hbC4gICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgCisgIHVpbnQzMl90IGxvd19wb3dlcl9lbmFibGU7ICAgICAvKiE8IEVuYWJsZSBvciBkaXNhYmxlIExvdyBQb3dlciBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAqLworICAKKyAgdWludDMyX3QgbHBtX2VuYWJsZTsgICAgICAgICAgIC8qITwgRW5hYmxlIG9yIGRpc2FibGUgdGhlIExpbmsgUG93ZXIgTWFuYWdlbWVudCAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvIEVOQUJMRSBvciBESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgYmF0dGVyeV9jaGFyZ2luZ19lbmFibGU7IC8qITwgRW5hYmxlIG9yIGRpc2FibGUgQmF0dGVyeSBjaGFyZ2luZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit9UENEX0luaXRUeXBlRGVmOworCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50OF90ICAgbnVtOyAgICAgICAgICAgIC8qITwgRW5kcG9pbnQgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDEgYW5kIE1heF9EYXRhID0gMTUgICAgKi8gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB1aW50OF90ICAgaXNfaW47ICAgICAgICAgIC8qITwgRW5kcG9pbnQgZGlyZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMSAgICAgKi8gCisgIAorICB1aW50OF90ICAgaXNfc3RhbGw7ICAgICAgIC8qITwgRW5kcG9pbnQgc3RhbGwgY29uZGl0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMSAgICAgKi8gCisgIAorICB1aW50OF90ICAgdHlwZTsgICAgICAgICAgIC8qITwgRW5kcG9pbnQgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBvZiBAcmVmIFBDRF9FUF9UeXBlICAgICAgICAgICAgICAgICAgICAgICovIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgdWludDE2X3QgIHBtYWFkcmVzczsgICAgICAvKiE8IFBNQSBBZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIGJldHdlZW4gTWluX2FkZHIgPSAwIGFuZCBNYXhfYWRkciA9IDFLICAgKi8gCisgIAorICAKKyAgdWludDE2X3QgIHBtYWFkZHIwOyAgICAgICAvKiE8IFBNQSBBZGRyZXNzMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBiZXR3ZWVuIE1pbl9hZGRyID0gMCBhbmQgTWF4X2FkZHIgPSAxSyAgICovICAgCisgIAorICAKKyAgdWludDE2X3QgIHBtYWFkZHIxOyAgICAgICAgLyohPCBQTUEgQWRkcmVzczEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgYmV0d2VlbiBNaW5fYWRkciA9IDAgYW5kIE1heF9hZGRyID0gMUsgICAqLyAgIAorICAKKyAgCisgIHVpbnQ4X3QgICBkb3VibGVidWZmZXI7ICAgIC8qITwgRG91YmxlIGJ1ZmZlciBlbmFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSAwIG9yIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHVpbnQzMl90ICBtYXhwYWNrZXQ7ICAgICAgLyohPCBFbmRwb2ludCBNYXggcGFja2V0IHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gNjRLQiAqLworCisgIHVpbnQ4X3QgICAqeGZlcl9idWZmOyAgICAgLyohPCBQb2ludGVyIHRvIHRyYW5zZmVyIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIAorICB1aW50MzJfdCAgeGZlcl9sZW47ICAgICAgIC8qITwgQ3VycmVudCB0cmFuc2ZlciBsZW5ndGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIAorICB1aW50MzJfdCAgeGZlcl9jb3VudDsgICAgIC8qITwgUGFydGlhbCB0cmFuc2ZlciBsZW5ndGggaW4gY2FzZSBvZiBtdWx0aSBwYWNrZXQgdHJhbnNmZXIgICAgICAgICAgICAgICAgICovCisKK31QQ0RfRVBUeXBlRGVmOworCit0eXBlZGVmICAgVVNCX1R5cGVEZWYgUENEX1R5cGVEZWY7IAorCisvKiogCisgICogQGJyaWVmICBQQ0QgSGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uICAKKyAgKi8gCit0eXBlZGVmIHN0cnVjdAoreworICBQQ0RfVHlwZURlZiAgICAgICAgICAgICAqSW5zdGFuY2U7ICAgLyohPCBSZWdpc3RlciBiYXNlIGFkZHJlc3MgICAgICAgICAgICAgICovIAorICBQQ0RfSW5pdFR5cGVEZWYgICAgICAgICBJbml0OyAgICAgICAvKiE8IFBDRCByZXF1aXJlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgKi8KKyAgX19JTyB1aW50OF90ICAgICAgICAgICAgVVNCX0FkZHJlc3M7IC8qITwgVVNCIEFkZHJlc3MgICAgICAgICAgICAqLyAgCisgIFBDRF9FUFR5cGVEZWYgICAgICAgICAgIElOX2VwWzE1XTsgIC8qITwgSU4gZW5kcG9pbnQgcGFyYW1ldGVycyAgICAgICAgICAgICAqLworICBQQ0RfRVBUeXBlRGVmICAgICAgICAgICBPVVRfZXBbMTVdOyAvKiE8IE9VVCBlbmRwb2ludCBwYXJhbWV0ZXJzICAgICAgICAgICAgKi8gCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgIExvY2s7ICAgICAgIC8qITwgUENEIHBlcmlwaGVyYWwgc3RhdHVzICAgICAgICAgICAgICAqLworICBfX0lPIFBDRF9TdGF0ZVR5cGVEZWYgICBTdGF0ZTsgICAgICAvKiE8IFBDRCBjb21tdW5pY2F0aW9uIHN0YXRlICAgICAgICAgICAgKi8KKyAgdWludDMyX3QgICAgICAgICAgICAgICAgU2V0dXBbMTJdOyAgLyohPCBTZXR1cCBwYWNrZXQgYnVmZmVyICAgICAgICAgICAgICAgICovCisgIHZvaWQgICAgICAgICAgICAgICAgICAgICpwRGF0YTsgICAgICAvKiE8IFBvaW50ZXIgdG8gdXBwZXIgc3RhY2sgSGFuZGxlciAgICAgKi8gICAgCisgIAorfSBQQ0RfSGFuZGxlVHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8gCisgCisvKiBJbmNsdWRlIFBDRCBIQUwgRXh0ZW5zaW9uIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfcGNkX2V4LmgiICAKKyAgICAKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFBDRF9FeHBvcnRlZF9Db25zdGFudHMgUENEIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUENEX0NvcmVfU3BlZWQgUENEIENvcmUgU3BlZWQKKyAgKiBAeworICAqLworI2RlZmluZSBQQ0RfU1BFRURfSElHSCAgICAgICAgICAgICAgIDBVIC8qIE5vdCBTdXBwb3J0ZWQgKi8KKyNkZWZpbmUgUENEX1NQRUVEX0ZVTEwgICAgICAgICAgICAgICAyVQorLyoqCisgICogQH0KKyAgKi8KKyAgCisgIC8qKiBAZGVmZ3JvdXAgUENEX0NvcmVfUEhZIFBDRCBDb3JlIFBIWQorICAqIEB7CisgICovCisjZGVmaW5lIFBDRF9QSFlfRU1CRURERUQgICAgICAgICAgICAgMlUKKy8qKgorICAqIEB9CisgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQQ0RfRXhwb3J0ZWRfTWFjcm9zIFBDRCBFeHBvcnRlZCBNYWNyb3MKKyAqICBAYnJpZWYgbWFjcm9zIHRvIGhhbmRsZSBpbnRlcnJ1cHRzIGFuZCBzcGVjaWZpYyBjbG9jayBjb25maWd1cmF0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIF9fSEFMX1BDRF9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTVFIpICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpCisjZGVmaW5lIF9fSEFMX1BDRF9DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTVFIpID0gKHVpbnQxNl90KSh+KF9fSU5URVJSVVBUX18pKSkpCisKKyNkZWZpbmUgX19IQUxfVVNCX1dBS0VVUF9FWFRJX0VOQUJMRV9JVCgpICAgICAgICAgICAgICAgICBFWFRJLT5JTVIgfD0gVVNCX1dBS0VVUF9FWFRJX0xJTkUKKyNkZWZpbmUgX19IQUxfVVNCX1dBS0VVUF9FWFRJX0RJU0FCTEVfSVQoKSAgICAgICAgICAgICAgICBFWFRJLT5JTVIgJj0gfihVU0JfV0FLRVVQX0VYVElfTElORSkKKyNkZWZpbmUgX19IQUxfVVNCX0VYVElfR0VORVJBVEVfU1dJVChfX0VYVElMSU5FX18pIChFWFRJLT5TV0lFUiB8PSAoX19FWFRJTElORV9fKSkKKworI2RlZmluZSBfX0hBTF9VU0JfV0FLRVVQX0VYVElfR0VUX0ZMQUcoKSAgICAgICAgICAgICAgICAgIEVYVEktPlBSICYgKFVTQl9XQUtFVVBfRVhUSV9MSU5FKQorI2RlZmluZSBfX0hBTF9VU0JfV0FLRVVQX0VYVElfQ0xFQVJfRkxBRygpICAgICAgICAgICAgICAgIEVYVEktPlBSID0gVVNCX1dBS0VVUF9FWFRJX0xJTkUKKworI2RlZmluZSBfX0hBTF9VU0JfV0FLRVVQX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgICBkbyB7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRJLT5GVFNSICY9IH4oVVNCX1dBS0VVUF9FWFRJX0xJTkUpO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUSS0+UlRTUiB8PSBVU0JfV0FLRVVQX0VYVElfTElORTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisjZGVmaW5lIF9fSEFMX1VTQl9XQUtFVVBfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgIGRvIHtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVEktPkZUU1IgfD0gKFVTQl9XQUtFVVBfRVhUSV9MSU5FKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVEktPlJUU1IgJj0gfihVU0JfV0FLRVVQX0VYVElfTElORSk7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKworI2RlZmluZSBfX0hBTF9VU0JfV0FLRVVQX0VYVElfRU5BQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSBkbyB7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRJLT5SVFNSICY9IH4oVVNCX1dBS0VVUF9FWFRJX0xJTkUpO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUSS0+RlRTUiAmPSB+KFVTQl9XQUtFVVBfRVhUSV9MSU5FKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVEktPlJUU1IgfD0gVVNCX1dBS0VVUF9FWFRJX0xJTkU7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRJLT5GVFNSIHw9IFVTQl9XQUtFVVBfRVhUSV9MSU5FO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisvKioKKyAgKiBAfQorICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFBDRF9FeHBvcnRlZF9GdW5jdGlvbnMgUENEIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIEluaXRpYWxpemF0aW9uL2RlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGFkZHRvZ3JvdXAgUENEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0luaXQoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9EZUluaXQgKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK3ZvaWQgSEFMX1BDRF9Nc3BJbml0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK3ZvaWQgSEFMX1BDRF9Nc3BEZUluaXQoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOworLyoqCisgICogQH0KKyAgKi8KKworLyogSS9PIG9wZXJhdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8KKy8qKiBAYWRkdG9ncm91cCBQQ0RfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfU3RhcnQoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9TdG9wKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK3ZvaWQgSEFMX1BDRF9JUlFIYW5kbGVyKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKKwordm9pZCBIQUxfUENEX0RhdGFPdXRTdGFnZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwbnVtKTsKK3ZvaWQgSEFMX1BDRF9EYXRhSW5TdGFnZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwbnVtKTsKK3ZvaWQgSEFMX1BDRF9TZXR1cFN0YWdlQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOwordm9pZCBIQUxfUENEX1NPRkNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK3ZvaWQgSEFMX1BDRF9SZXNldENhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK3ZvaWQgSEFMX1BDRF9TdXNwZW5kQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOwordm9pZCBIQUxfUENEX1Jlc3VtZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK3ZvaWQgSEFMX1BDRF9JU09PVVRJbmNvbXBsZXRlQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBudW0pOwordm9pZCBIQUxfUENEX0lTT0lOSW5jb21wbGV0ZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwbnVtKTsKK3ZvaWQgSEFMX1BDRF9Db25uZWN0Q2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOwordm9pZCBIQUxfUENEX0Rpc2Nvbm5lY3RDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBhZGR0b2dyb3VwIFBDRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiBAeworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9EZXZDb25uZWN0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRGV2RGlzY29ubmVjdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1NldEFkZHJlc3MoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgYWRkcmVzcyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0VQX09wZW4oUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBfYWRkciwgdWludDE2X3QgZXBfbXBzLCB1aW50OF90IGVwX3R5cGUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9DbG9zZShQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRVBfUmVjZWl2ZShQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyLCB1aW50OF90ICpwQnVmLCB1aW50MzJfdCBsZW4pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9UcmFuc21pdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyLCB1aW50OF90ICpwQnVmLCB1aW50MzJfdCBsZW4pOwordWludDE2X3QgICAgICAgICAgSEFMX1BDRF9FUF9HZXRSeENvdW50KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwX2FkZHIpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9TZXRTdGFsbChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRVBfQ2xyU3RhbGwoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBfYWRkcik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0VQX0ZsdXNoKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwX2FkZHIpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9BY3RpdmF0ZVJlbW90ZVdha2V1cChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0RlQWN0aXZhdGVSZW1vdGVXYWtldXAoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOworLyoqCisgICogQH0KKyAgKi8KKworLyogUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAYWRkdG9ncm91cCBQQ0RfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICAqIEB7CisgICovCitQQ0RfU3RhdGVUeXBlRGVmIEhBTF9QQ0RfR2V0U3RhdGUoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUENEX1ByaXZhdGVfQ29uc3RhbnRzIFBDRCBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisvKiogQGRlZmdyb3VwIFVTQl9FWFRJX0xpbmVfSW50ZXJydXB0IFVTQiBFWFRJIGxpbmUgaW50ZXJydXB0CisgICogQHsKKyAgKi8KKyNkZWZpbmUgIFVTQl9XQUtFVVBfRVhUSV9MSU5FICAgICAgICAgICAgICAoKHVpbnQzMl90KUVYVElfSU1SX01SMTgpICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDE4IENvbm5lY3RlZCB0byB0aGUgVVNCIEZTIEVYVEkgTGluZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQQ0RfRVAwX01QUyBQQ0QgRVAwIE1QUworICAqIEB7CisgICovCisjZGVmaW5lIERFUDBDVExfTVBTXzY0ICAgICAgICAgICAgICAgICAgICAgICAgIDBVCisjZGVmaW5lIERFUDBDVExfTVBTXzMyICAgICAgICAgICAgICAgICAgICAgICAgIDFVCisjZGVmaW5lIERFUDBDVExfTVBTXzE2ICAgICAgICAgICAgICAgICAgICAgICAgIDJVCisjZGVmaW5lIERFUDBDVExfTVBTXzggICAgICAgICAgICAgICAgICAgICAgICAgIDNVCisKKyNkZWZpbmUgUENEX0VQME1QU182NCAgICAgICAgICAgICAgICAgICAgICAgICAgREVQMENUTF9NUFNfNjQKKyNkZWZpbmUgUENEX0VQME1QU18zMiAgICAgICAgICAgICAgICAgICAgICAgICAgREVQMENUTF9NUFNfMzIKKyNkZWZpbmUgUENEX0VQME1QU18xNiAgICAgICAgICAgICAgICAgICAgICAgICAgREVQMENUTF9NUFNfMTYKKyNkZWZpbmUgUENEX0VQME1QU18wOCAgICAgICAgICAgICAgICAgICAgICAgICAgREVQMENUTF9NUFNfOCAKKy8qKgorICAqIEB9CisgICovIAorCisvKiogQGRlZmdyb3VwIFBDRF9FUF9UeXBlIFBDRCBFUCBUeXBlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUENEX0VQX1RZUEVfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgMFUKKyNkZWZpbmUgUENEX0VQX1RZUEVfSVNPQyAgICAgICAgICAgICAgICAgICAgICAgMVUKKyNkZWZpbmUgUENEX0VQX1RZUEVfQlVMSyAgICAgICAgICAgICAgICAgICAgICAgMlUKKyNkZWZpbmUgUENEX0VQX1RZUEVfSU5UUiAgICAgICAgICAgICAgICAgICAgICAgM1UKKy8qKgorICAqIEB9CisgICovIAorCisvKiogQGRlZmdyb3VwIFBDRF9FTkRQIFBDRCBFTkRQCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUENEX0VORFAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTBVKQorI2RlZmluZSBQQ0RfRU5EUDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMVUpCisjZGVmaW5lIFBDRF9FTkRQMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkyVSkKKyNkZWZpbmUgUENEX0VORFAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTNVKQorI2RlZmluZSBQQ0RfRU5EUDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpNFUpCisjZGVmaW5lIFBDRF9FTkRQNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCk1VSkKKyNkZWZpbmUgUENEX0VORFA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTZVKQorI2RlZmluZSBQQ0RfRU5EUDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpN1UpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBDRF9FTkRQX0tpbmQgUENEIEVuZHBvaW50IEtpbmQKKyAgKiBAeworICAqLworI2RlZmluZSBQQ0RfU05HX0JVRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwVQorI2RlZmluZSBQQ0RfREJMX0JVRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxVQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisvKiBJbnRlcm5hbCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFBDRF9Qcml2YXRlX01hY3JvcyBQQ0QgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiBTZXRFTkRQT0lOVCAqLworI2RlZmluZSBQQ0RfU0VUX0VORFBPSU5UKFVTQngsIGJFcE51bSx3UmVnVmFsdWUpICAoKigoX19JTyB1aW50MTZfdCAqKSgoKHVpbnQzMl90KSgmKFVTQngpLT5FUDBSICsgKGJFcE51bSkgKiAyVSkpKSk9ICh1aW50MTZfdCkod1JlZ1ZhbHVlKSkKKworLyogR2V0RU5EUE9JTlQgKi8KKyNkZWZpbmUgUENEX0dFVF9FTkRQT0lOVChVU0J4LCBiRXBOdW0pICAgICAgICAgICAgKCooKF9fSU8gdWludDE2X3QgKikoKCh1aW50MzJfdCkoJihVU0J4KS0+RVAwUiArIChiRXBOdW0pICogMlUpKSkpKQorCisKKworLyoqCisgICogQGJyaWVmICBzZXRzIHRoZSB0eXBlIGluIHRoZSBlbmRwb2ludCByZWdpc3RlcihiaXRzIEVQX1RZUEVbMTowXSkKKyAgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgICogQHBhcmFtICB3VHlwZSBFbmRwb2ludCBUeXBlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBQQ0RfU0VUX0VQVFlQRShVU0J4LCBiRXBOdW0sd1R5cGUpIChQQ0RfU0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSksXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKCh1aW50MzJfdCkoUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKSkpICYgKCh1aW50MzJfdCkoVVNCX0VQX1RfTUFTSykpKSB8ICgodWludDMyX3QpKHdUeXBlKSkgKSkpCisKKy8qKgorICAqIEBicmllZiAgZ2V0cyB0aGUgdHlwZSBpbiB0aGUgZW5kcG9pbnQgcmVnaXN0ZXIoYml0cyBFUF9UWVBFWzE6MF0pCisgICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICAqIEByZXR2YWwgRW5kcG9pbnQgVHlwZQorICAqLworI2RlZmluZSBQQ0RfR0VUX0VQVFlQRShVU0J4LCBiRXBOdW0pICgoKHVpbnQxNl90KShQQ0RfR0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSkpKSkgJiBVU0JfRVBfVF9GSUVMRCkKKworCisvKioKKyAgKiBAYnJpZWYgZnJlZSBidWZmZXIgdXNlZCBmcm9tIHRoZSBhcHBsaWNhdGlvbiByZWFsaXppbmcgaXQgdG8gdGhlIGxpbmUKKyAgICAgICAgICB0b2dnbGVzIGJpdCBTV19CVUYgaW4gdGhlIGRvdWJsZSBidWZmZXJlZCBlbmRwb2ludCByZWdpc3RlcgorICAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAgKiBAcGFyYW0gIGJEaXIgRGlyZWN0aW9uCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFBDRF9GcmVlVXNlckJ1ZmZlcihVU0J4LCBiRXBOdW0sIGJEaXIpXAore1wKKyAgaWYgKChiRGlyKSA9PSBQQ0RfRVBfREJVRl9PVVQpXAorICB7IC8qIE9VVCBkb3VibGUgYnVmZmVyZWQgZW5kcG9pbnQgKi9cCisgICAgUENEX1RYX0RUT0coKFVTQngpLCAoYkVwTnVtKSk7XAorICB9XAorICBlbHNlIGlmICgoYkRpcikgPT0gUENEX0VQX0RCVUZfSU4pXAorICB7IC8qIElOIGRvdWJsZSBidWZmZXJlZCBlbmRwb2ludCAqL1wKKyAgICBQQ0RfUlhfRFRPRygoVVNCeCksIChiRXBOdW0pKTtcCisgIH1cCit9CisKKy8qKgorICAqIEBicmllZiBnZXRzIGRpcmVjdGlvbiBvZiB0aGUgZG91YmxlIGJ1ZmZlcmVkIGVuZHBvaW50CisgICogQHBhcmFtICAgVVNCeDogVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gICBiRXBOdW06IEVuZHBvaW50IE51bWJlci4KKyAgKiBAcmV0dmFsIEVQX0RCVUZfT1VULCBFUF9EQlVGX0lOLAorICAqICAgICAgICAgRVBfREJVRl9FUlIgaWYgdGhlIGVuZHBvaW50IGNvdW50ZXIgbm90IHlldCBwcm9ncmFtbWVkLgorICAqLworI2RlZmluZSBQQ0RfR0VUX0RCX0RJUihVU0J4LCBiRXBOdW0pXAore1wKKyAgaWYgKCh1aW50MTZfdCkoKlBDRF9FUF9SWF9DTlQoKFVTQngpLCAoYkVwTnVtKSkgJiAweEZDMDBVKSAhPSAwVSlcCisgICAgcmV0dXJuKFBDRF9FUF9EQlVGX09VVCk7XAorICBlbHNlIGlmICgoKHVpbnQxNl90KSgqUENEX0VQX1RYX0NOVCgoVVNCeCksIChiRXBOdW0pKSkgJiAweDAzRkZVKSAhPSAwVSlcCisgICAgcmV0dXJuKFBDRF9FUF9EQlVGX0lOKTtcCisgIGVsc2VcCisgICAgcmV0dXJuKFBDRF9FUF9EQlVGX0VSUik7XAorfQorCisvKioKKyAgKiBAYnJpZWYgIHNldHMgdGhlIHN0YXR1cyBmb3IgdHggdHJhbnNmZXIgKGJpdHMgU1RBVF9UWFsxOjBdKS4KKyAgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgICogQHBhcmFtICB3U3RhdGUgbmV3IHN0YXRlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFBDRF9TRVRfRVBfVFhfU1RBVFVTKFVTQngsIGJFcE51bSwgd1N0YXRlKSB7IHJlZ2lzdGVyIHVpbnQxNl90IF93UmVnVmFsO1wKKyAgIFwKKyAgICBfd1JlZ1ZhbCA9ICh1aW50MzJfdCkgKCgodWludDMyX3QpKFBDRF9HRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSkpKSAmIFVTQl9FUFRYX0RUT0dNQVNLKTtcCisgICAvKiB0b2dnbGUgZmlyc3QgYml0ID8gKi8gICAgIFwKKyAgIGlmKChVU0JfRVBUWF9EVE9HMSAmICh3U3RhdGUpKSE9IDBVKVwKKyAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBfd1JlZ1ZhbCBePSh1aW50MTZfdCkgVVNCX0VQVFhfRFRPRzE7ICAgICAgICBcCisgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIC8qIHRvZ2dsZSBzZWNvbmQgYml0ID8gICovICAgICAgICAgXAorICAgaWYoKFVTQl9FUFRYX0RUT0cyICYgKCh1aW50MzJfdCkod1N0YXRlKSkpIT0gMFUpICAgICAgXAorICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIF93UmVnVmFsIF49KHVpbnQxNl90KSBVU0JfRVBUWF9EVE9HMjsgICAgICAgIFwKKyAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgUENEX1NFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pLCAoKCh1aW50MzJfdCkoX3dSZWdWYWwpKSB8IFVTQl9FUF9DVFJfUlh8VVNCX0VQX0NUUl9UWCkpO1wKKyAgfSAvKiBQQ0RfU0VUX0VQX1RYX1NUQVRVUyAqLworCisvKioKKyAgKiBAYnJpZWYgIHNldHMgdGhlIHN0YXR1cyBmb3IgcnggdHJhbnNmZXIgKGJpdHMgU1RBVF9UWFsxOjBdKQorICAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAgKiBAcGFyYW0gIHdTdGF0ZSBuZXcgc3RhdGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgUENEX1NFVF9FUF9SWF9TVEFUVVMoVVNCeCwgYkVwTnVtLHdTdGF0ZSkge1wKKyAgICByZWdpc3RlciB1aW50MTZfdCBfd1JlZ1ZhbDsgICBcCisgICAgXAorICAgIF93UmVnVmFsID0gKHVpbnQzMl90KSAoKCh1aW50MzJfdCkoUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKSkpICYgVVNCX0VQUlhfRFRPR01BU0spO1wKKyAgICAvKiB0b2dnbGUgZmlyc3QgYml0ID8gKi8gIFwKKyAgICBpZigoVVNCX0VQUlhfRFRPRzEgJiAod1N0YXRlKSkhPSAwVSkgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF93UmVnVmFsIF49ICh1aW50MTZfdCkgVVNCX0VQUlhfRFRPRzE7ICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIHRvZ2dsZSBzZWNvbmQgYml0ID8gKi8gIFwKKyAgICBpZigoVVNCX0VQUlhfRFRPRzIgJiAoKHVpbnQzMl90KSh3U3RhdGUpKSkhPSAwVSkgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF93UmVnVmFsIF49ICh1aW50MTZfdCkgVVNCX0VQUlhfRFRPRzI7ICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBDRF9TRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSwgKCgodWludDMyX3QpKF93UmVnVmFsKSkgfCBVU0JfRVBfQ1RSX1JYfFVTQl9FUF9DVFJfVFgpKTsgXAorICB9IC8qIFBDRF9TRVRfRVBfUlhfU1RBVFVTICovCisKKy8qKgorICAqIEBicmllZiAgc2V0cyB0aGUgc3RhdHVzIGZvciByeCAmIHR4IChiaXRzIFNUQVRfVFhbMTowXSAmIFNUQVRfUlhbMTowXSkKKyAgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgICogQHBhcmFtICB3U3RhdGVyeCBuZXcgc3RhdGUuCisgICogQHBhcmFtICB3U3RhdGV0eCBuZXcgc3RhdGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFBDRF9TRVRfRVBfVFhSWF9TVEFUVVMoVVNCeCxiRXBOdW0sd1N0YXRlcngsd1N0YXRldHgpIHtcCisgICAgcmVnaXN0ZXIgdWludDMyX3QgX3dSZWdWYWw7ICAgXAorICAgIFwKKyAgICBfd1JlZ1ZhbCA9IFBDRF9HRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSkgJiAoVVNCX0VQUlhfRFRPR01BU0sgfFVTQl9FUFRYX1NUQVQpIDtcCisgICAgLyogdG9nZ2xlIGZpcnN0IGJpdCA/ICovICBcCisgICAgaWYoKFVTQl9FUFJYX0RUT0cxICYgKCh3U3RhdGVyeCkpKSE9IDBVKSBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF93UmVnVmFsIF49IFVTQl9FUFJYX0RUT0cxOyAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogdG9nZ2xlIHNlY29uZCBiaXQgPyAqLyAgXAorICAgIGlmKChVU0JfRVBSWF9EVE9HMiAmICh3U3RhdGVyeCkpIT0gMFUpIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX3dSZWdWYWwgXj0gVVNCX0VQUlhfRFRPRzI7ICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiB0b2dnbGUgZmlyc3QgYml0ID8gKi8gICAgIFwKKyAgICBpZigoVVNCX0VQVFhfRFRPRzEgJiAod1N0YXRldHgpKSE9IDBVKSAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX3dSZWdWYWwgXj0gVVNCX0VQVFhfRFRPRzE7ICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiB0b2dnbGUgc2Vjb25kIGJpdCA/ICAqLyAgICAgICAgIFwKKyAgICBpZigoVVNCX0VQVFhfRFRPRzIgJiAod1N0YXRldHgpKSE9IDBVKSAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX3dSZWdWYWwgXj0gVVNCX0VQVFhfRFRPRzI7ICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQQ0RfU0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSksIF93UmVnVmFsIHwgVVNCX0VQX0NUUl9SWHxVU0JfRVBfQ1RSX1RYKTsgICAgXAorICB9IC8qIFBDRF9TRVRfRVBfVFhSWF9TVEFUVVMgKi8KKworLyoqCisgICogQGJyaWVmICBnZXRzIHRoZSBzdGF0dXMgZm9yIHR4L3J4IHRyYW5zZmVyIChiaXRzIFNUQVRfVFhbMTowXQorICAqICAgICAgICAgL1NUQVRfUlhbMTowXSkKKyAgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgICogQHJldHZhbCBzdGF0dXMKKyAgKi8KKyNkZWZpbmUgUENEX0dFVF9FUF9UWF9TVEFUVVMoVVNCeCwgYkVwTnVtKSAoKCh1aW50MzJfdCkoUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKSkpICYgVVNCX0VQVFhfU1RBVCkKKyNkZWZpbmUgUENEX0dFVF9FUF9SWF9TVEFUVVMoVVNCeCwgYkVwTnVtKSAoKCh1aW50MzJfdCkoUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKSkpICYgVVNCX0VQUlhfU1RBVCkKKworLyoqCisgICogQGJyaWVmICBzZXRzIGRpcmVjdGx5IHRoZSBWQUxJRCB0eC9yeC1zdGF0dXMgaW50byB0aGUgZW5kcG9pbnQgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFBDRF9TRVRfRVBfVFhfVkFMSUQoVVNCeCwgYkVwTnVtKSAgICAgKFBDRF9TRVRfRVBfVFhfU1RBVFVTKChVU0J4KSwgKGJFcE51bSksIFVTQl9FUF9UWF9WQUxJRCkpCisKKyNkZWZpbmUgUENEX1NFVF9FUF9SWF9WQUxJRChVU0J4LCBiRXBOdW0pICAgICAoUENEX1NFVF9FUF9SWF9TVEFUVVMoKFVTQngpLCAoYkVwTnVtKSwgVVNCX0VQX1JYX1ZBTElEKSkKKworLyoqCisgICogQGJyaWVmICBjaGVja3Mgc3RhbGwgY29uZGl0aW9uIGluIGFuIGVuZHBvaW50LgorICAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAgKiBAcmV0dmFsIFRSVUUgPSBlbmRwb2ludCBpbiBzdGFsbCBjb25kaXRpb24uCisgICovCisjZGVmaW5lIFBDRF9HRVRfRVBfVFhfU1RBTExfU1RBVFVTKFVTQngsIGJFcE51bSkgKFBDRF9HRVRfRVBfVFhfU1RBVFVTKChVU0J4KSwgKGJFcE51bSkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gVVNCX0VQX1RYX1NUQUxMKQorI2RlZmluZSBQQ0RfR0VUX0VQX1JYX1NUQUxMX1NUQVRVUyhVU0J4LCBiRXBOdW0pIChQQ0RfR0VUX0VQX1JYX1NUQVRVUygoVVNCeCksIChiRXBOdW0pKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IFVTQl9FUF9SWF9TVEFMTCkKKworLyoqCisgICogQGJyaWVmICBzZXQgJiBjbGVhciBFUF9LSU5EIGJpdC4KKyAgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFBDRF9TRVRfRVBfS0lORChVU0J4LCBiRXBOdW0pICAgIChQQ0RfU0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVTQl9FUF9DVFJfUlh8VVNCX0VQX0NUUl9UWHwoKCgodWludDMyX3QpKFBDRF9HRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSkpKSB8IFVTQl9FUF9LSU5EKSAmIFVTQl9FUFJFR19NQVNLKSkpKQorI2RlZmluZSBQQ0RfQ0xFQVJfRVBfS0lORChVU0J4LCBiRXBOdW0pICAoUENEX1NFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVU0JfRVBfQ1RSX1JYfFVTQl9FUF9DVFJfVFh8KCgoKHVpbnQzMl90KShQQ0RfR0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSkpKSkgJiBVU0JfRVBLSU5EX01BU0spKSkpCisKKy8qKgorICAqIEBicmllZiAgU2V0cy9jbGVhcnMgZGlyZWN0bHkgU1RBVFVTX09VVCBiaXQgaW4gdGhlIGVuZHBvaW50IHJlZ2lzdGVyLgorICAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgUENEX1NFVF9PVVRfU1RBVFVTKFVTQngsIGJFcE51bSkgICAgUENEX1NFVF9FUF9LSU5EKChVU0J4KSwgKGJFcE51bSkpCisjZGVmaW5lIFBDRF9DTEVBUl9PVVRfU1RBVFVTKFVTQngsIGJFcE51bSkgIFBDRF9DTEVBUl9FUF9LSU5EKChVU0J4KSwgKGJFcE51bSkpCisKKy8qKgorICAqIEBicmllZiAgU2V0cy9jbGVhcnMgZGlyZWN0bHkgRVBfS0lORCBiaXQgaW4gdGhlIGVuZHBvaW50IHJlZ2lzdGVyLgorICAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgUENEX1NFVF9FUF9EQlVGKFVTQngsIGJFcE51bSkgICBQQ0RfU0VUX0VQX0tJTkQoKFVTQngpLCAoYkVwTnVtKSkKKyNkZWZpbmUgUENEX0NMRUFSX0VQX0RCVUYoVVNCeCwgYkVwTnVtKSBQQ0RfQ0xFQVJfRVBfS0lORCgoVVNCeCksIChiRXBOdW0pKQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFycyBiaXQgQ1RSX1JYIC8gQ1RSX1RYIGluIHRoZSBlbmRwb2ludCByZWdpc3Rlci4KKyAgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFBDRF9DTEVBUl9SWF9FUF9DVFIoVVNCeCwgYkVwTnVtKSAgIChQQ0RfU0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSksXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0RfR0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSkpICYgMHg3RkZGVSAmIFVTQl9FUFJFR19NQVNLKSkKKyNkZWZpbmUgUENEX0NMRUFSX1RYX0VQX0NUUihVU0J4LCBiRXBOdW0pICAgKFBDRF9TRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDRF9HRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSkgJiAweEZGN0ZVICYgVVNCX0VQUkVHX01BU0spKQorCisvKioKKyAgKiBAYnJpZWYgIFRvZ2dsZXMgRFRPR19SWCAvIERUT0dfVFggYml0IGluIHRoZSBlbmRwb2ludCByZWdpc3Rlci4KKyAgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFBDRF9SWF9EVE9HKFVTQngsIGJFcE51bSkgICAgKFBDRF9TRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0JfRVBfQ1RSX1JYfFVTQl9FUF9DVFJfVFh8VVNCX0VQX0RUT0dfUlggfCAoKCh1aW50MzJfdCkoUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKSkpICYgVVNCX0VQUkVHX01BU0spKSkKKyNkZWZpbmUgUENEX1RYX0RUT0coVVNCeCwgYkVwTnVtKSAgICAoUENEX1NFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQl9FUF9DVFJfUlh8VVNCX0VQX0NUUl9UWHxVU0JfRVBfRFRPR19UWCB8ICgoKHVpbnQzMl90KShQQ0RfR0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSkpKSkgJiBVU0JfRVBSRUdfTUFTSykpKQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFycyBEVE9HX1JYIC8gRFRPR19UWCBiaXQgaW4gdGhlIGVuZHBvaW50IHJlZ2lzdGVyLgorICAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8gICAgICAKKyNkZWZpbmUgUENEX0NMRUFSX1JYX0RUT0coVVNCeCwgYkVwTnVtKSAgaWYoKCgodWludDMyX3QpKFBDRF9HRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSkpKSAmIFVTQl9FUF9EVE9HX1JYKSAhPSAwKVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDRF9SWF9EVE9HKChVU0J4KSwoYkVwTnVtKSk7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisjZGVmaW5lIFBDRF9DTEVBUl9UWF9EVE9HKFVTQngsIGJFcE51bSkgIGlmKCgoKHVpbnQzMl90KShQQ0RfR0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSkpKSkgJiBVU0JfRVBfRFRPR19UWCkgIT0gMClcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENEX1RYX0RUT0coKFVTQngpLChiRXBOdW0pKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgIAorLyoqCisgICogQGJyaWVmICBTZXRzIGFkZHJlc3MgaW4gYW4gZW5kcG9pbnQgcmVnaXN0ZXIuCisgICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICAqIEBwYXJhbSAgYkFkZHIgQWRkcmVzcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgUENEX1NFVF9FUF9BRERSRVNTKFVTQngsIGJFcE51bSxiQWRkcikgUENEX1NFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pLFwKKyAgICBVU0JfRVBfQ1RSX1JYfFVTQl9FUF9DVFJfVFh8KCgodWludDMyX3QpKFBDRF9HRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSkpKSAmIFVTQl9FUFJFR19NQVNLKSB8IChiQWRkcikpCisKKy8qKgorICAqIEBicmllZiAgR2V0cyBhZGRyZXNzIGluIGFuIGVuZHBvaW50IHJlZ2lzdGVyLgorICAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgUENEX0dFVF9FUF9BRERSRVNTKFVTQngsIGJFcE51bSkgKCh1aW50OF90KShQQ0RfR0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSkpICYgVVNCX0VQQUREUl9GSUVMRCkpCisKKy8qKgorICAqIEBicmllZiAgc2V0cyBhZGRyZXNzIG9mIHRoZSB0eC9yeCBidWZmZXIuCisgICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICAqIEBwYXJhbSAgd0FkZHIgYWRkcmVzcyB0byBiZSBzZXQgKG11c3QgYmUgd29yZCBhbGlnbmVkKS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgUENEX1NFVF9FUF9UWF9BRERSRVNTKFVTQngsIGJFcE51bSx3QWRkcikgKCpQQ0RfRVBfVFhfQUREUkVTUygoVVNCeCksIChiRXBOdW0pKSA9ICgoKHdBZGRyKSA+PiAxVSkgPDwgMVUpKQorI2RlZmluZSBQQ0RfU0VUX0VQX1JYX0FERFJFU1MoVVNCeCwgYkVwTnVtLHdBZGRyKSAoKlBDRF9FUF9SWF9BRERSRVNTKChVU0J4KSwgKGJFcE51bSkpID0gKCgod0FkZHIpID4+IDFVKSA8PCAxVSkpCisKKy8qKgorICAqIEBicmllZiAgR2V0cyBhZGRyZXNzIG9mIHRoZSB0eC9yeCBidWZmZXIuCisgICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICAqIEByZXR2YWwgYWRkcmVzcyBvZiB0aGUgYnVmZmVyLgorICAqLworI2RlZmluZSBQQ0RfR0VUX0VQX1RYX0FERFJFU1MoVVNCeCwgYkVwTnVtKSAoKHVpbnQxNl90KSpQQ0RfRVBfVFhfQUREUkVTUygoVVNCeCksIChiRXBOdW0pKSkKKyNkZWZpbmUgUENEX0dFVF9FUF9SWF9BRERSRVNTKFVTQngsIGJFcE51bSkgKCh1aW50MTZfdCkqUENEX0VQX1JYX0FERFJFU1MoKFVTQngpLCAoYkVwTnVtKSkpCisKKy8qKgorICAqIEBicmllZiAgU2V0cyBjb3VudGVyIG9mIHJ4IGJ1ZmZlciB3aXRoIG5vLiBvZiBibG9ja3MuCisgICogQHBhcmFtICBkd1JlZyBSZWdpc3RlcgorICAqIEBwYXJhbSAgd0NvdW50IENvdW50ZXIuCisgICogQHBhcmFtICB3TkJsb2NrcyBuby4gb2YgQmxvY2tzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBQQ0RfQ0FMQ19CTEszMihkd1JlZyx3Q291bnQsd05CbG9ja3MpIHtcCisgICAgKHdOQmxvY2tzKSA9ICh3Q291bnQpID4+IDVVO1wKKyAgICBpZigoKHdDb3VudCkgJiAweDFmVSkgPT0gMFUpXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICh3TkJsb2NrcyktLTtcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpwZHdSZWcgPSAodWludDE2X3QpKCh1aW50MTZfdCkoKHdOQmxvY2tzKSA8PCAxMFUpIHwgKHVpbnQxNl90KTB4ODAwMFUpOyBcCisgIH0vKiBQQ0RfQ0FMQ19CTEszMiAqLworCisKKyNkZWZpbmUgUENEX0NBTENfQkxLMihkd1JlZyx3Q291bnQsd05CbG9ja3MpIHtcCisgICAgKHdOQmxvY2tzKSA9ICh3Q291bnQpID4+IDFVO1wKKyAgICBpZigoKHdDb3VudCkgJiAweDFVKSAhPSAwVSlcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKHdOQmxvY2tzKSsrO1wKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKnBkd1JlZyA9ICh1aW50MTZfdCkoKHdOQmxvY2tzKSA8PCAxMFUpO1wKKyAgfS8qIFBDRF9DQUxDX0JMSzIgKi8KKworI2RlZmluZSBQQ0RfU0VUX0VQX0NOVF9SWF9SRUcoZHdSZWcsd0NvdW50KSAge1wKKyAgICB1aW50MTZfdCB3TkJsb2NrcztcCisgICAgaWYoKHdDb3VudCkgPiA2MlUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFBDRF9DQUxDX0JMSzMyKChkd1JlZyksKHdDb3VudCksd05CbG9ja3MpICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBQQ0RfQ0FMQ19CTEsyKChkd1JlZyksKHdDb3VudCksd05CbG9ja3MpICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfS8qIFBDRF9TRVRfRVBfQ05UX1JYX1JFRyAqLworCisjZGVmaW5lIFBDRF9TRVRfRVBfUlhfREJVRjBfQ05UKFVTQngsIGJFcE51bSx3Q291bnQpIHtcCisgICAgdWludDE2X3QgKnBkd1JlZyA9IFBDRF9FUF9UWF9DTlQoKFVTQngpLCAoYkVwTnVtKSk7IFwKKyAgICBQQ0RfU0VUX0VQX0NOVF9SWF9SRUcocGR3UmVnLCAod0NvdW50KSlcCisgIH0KKworLyoqCisgICogQGJyaWVmICBzZXRzIGNvdW50ZXIgZm9yIHRoZSB0eC9yeCBidWZmZXIuCisgICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICAqIEBwYXJhbSAgd0NvdW50IENvdW50ZXIgdmFsdWUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFBDRF9TRVRfRVBfVFhfQ05UKFVTQngsIGJFcE51bSx3Q291bnQpICgqUENEX0VQX1RYX0NOVCgoVVNCeCksIChiRXBOdW0pKSA9ICh3Q291bnQpKQorCisvKioKKyAgKiBAYnJpZWYgIGdldHMgY291bnRlciBvZiB0aGUgdHggYnVmZmVyLgorICAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAgKiBAcmV0dmFsIENvdW50ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgUENEX0dFVF9FUF9UWF9DTlQoVVNCeCwgYkVwTnVtKSgodWludDE2X3QpKCpQQ0RfRVBfVFhfQ05UKChVU0J4KSwgKGJFcE51bSkpKSAmIDB4M2ZmVSkKKyNkZWZpbmUgUENEX0dFVF9FUF9SWF9DTlQoVVNCeCwgYkVwTnVtKSgodWludDE2X3QpKCpQQ0RfRVBfUlhfQ05UKChVU0J4KSwgKGJFcE51bSkpKSAmIDB4M2ZmVSkKKworLyoqCisgICogQGJyaWVmICBTZXRzIGJ1ZmZlciAwLzEgYWRkcmVzcyBpbiBhIGRvdWJsZSBidWZmZXIgZW5kcG9pbnQuCisgICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICAqIEBwYXJhbSAgd0J1ZjBBZGRyOiBidWZmZXIgMCBhZGRyZXNzLgorICAqIEByZXR2YWwgQ291bnRlciB2YWx1ZQorICAqLworI2RlZmluZSBQQ0RfU0VUX0VQX0RCVUYwX0FERFIoVVNCeCwgYkVwTnVtLHdCdWYwQWRkcikgKFBDRF9TRVRfRVBfVFhfQUREUkVTUygoVVNCeCksIChiRXBOdW0pLCAod0J1ZjBBZGRyKSkpCisjZGVmaW5lIFBDRF9TRVRfRVBfREJVRjFfQUREUihVU0J4LCBiRXBOdW0sd0J1ZjFBZGRyKSAoUENEX1NFVF9FUF9SWF9BRERSRVNTKChVU0J4KSwgKGJFcE51bSksICh3QnVmMUFkZHIpKSkKKworLyoqCisgICogQGJyaWVmICBTZXRzIGFkZHJlc3NlcyBpbiBhIGRvdWJsZSBidWZmZXIgZW5kcG9pbnQuCisgICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICAqIEBwYXJhbSAgd0J1ZjBBZGRyOiBidWZmZXIgMCBhZGRyZXNzLgorICAqIEBwYXJhbSAgd0J1ZjFBZGRyID0gYnVmZmVyIDEgYWRkcmVzcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgUENEX1NFVF9FUF9EQlVGX0FERFIoVVNCeCwgYkVwTnVtLHdCdWYwQWRkcix3QnVmMUFkZHIpIHsgXAorICAgIFBDRF9TRVRfRVBfREJVRjBfQUREUigoVVNCeCksIChiRXBOdW0pLCAod0J1ZjBBZGRyKSk7XAorICAgIFBDRF9TRVRfRVBfREJVRjFfQUREUigoVVNCeCksIChiRXBOdW0pLCAod0J1ZjFBZGRyKSk7XAorICB9IC8qIFBDRF9TRVRfRVBfREJVRl9BRERSICovCisKKy8qKgorICAqIEBicmllZiAgR2V0cyBidWZmZXIgMC8xIGFkZHJlc3Mgb2YgYSBkb3VibGUgYnVmZmVyIGVuZHBvaW50LgorICAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgUENEX0dFVF9FUF9EQlVGMF9BRERSKFVTQngsIGJFcE51bSkgKFBDRF9HRVRfRVBfVFhfQUREUkVTUygoVVNCeCksIChiRXBOdW0pKSkKKyNkZWZpbmUgUENEX0dFVF9FUF9EQlVGMV9BRERSKFVTQngsIGJFcE51bSkgKFBDRF9HRVRfRVBfUlhfQUREUkVTUygoVVNCeCksIChiRXBOdW0pKSkKKworLyoqCisgICogQGJyaWVmICBHZXRzIGJ1ZmZlciAwLzEgYWRkcmVzcyBvZiBhIGRvdWJsZSBidWZmZXIgZW5kcG9pbnQuCisgICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICAqIEBwYXJhbSAgYkRpciBlbmRwb2ludCBkaXIgIEVQX0RCVUZfT1VUID0gT1VUIAorICAqICAgICAgICAgRVBfREJVRl9JTiAgPSBJTiAKKyAgKiBAcGFyYW0gIHdDb3VudCBDb3VudGVyIHZhbHVlIAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBQQ0RfU0VUX0VQX0RCVUYwX0NOVChVU0J4LCBiRXBOdW0sIGJEaXIsIHdDb3VudCkgIHsgXAorICAgIGlmKChiRGlyKSA9PSBQQ0RfRVBfREJVRl9PVVQpXAorICAgICAgLyogT1VUIGVuZHBvaW50ICovIFwKKyAgICB7UENEX1NFVF9FUF9SWF9EQlVGMF9DTlQoKFVTQngpLCAoYkVwTnVtKSwod0NvdW50KSl9IFwKKyAgICBlbHNlIGlmKChiRGlyKSA9PSBQQ0RfRVBfREJVRl9JTilcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICpQQ0RfRVBfVFhfQ05UKChVU0J4KSwgKGJFcE51bSkpID0gKHVpbnQzMl90KSh3Q291bnQpOyAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gLyogU2V0RVBEYmxCdWYwQ291bnQqLworCisjZGVmaW5lIFBDRF9TRVRfRVBfREJVRjFfQ05UKFVTQngsIGJFcE51bSwgYkRpciwgd0NvdW50KSAgeyBcCisgICAgaWYoKGJEaXIpID09IFBDRF9FUF9EQlVGX09VVClcCisgICAgey8qIE9VVCBlbmRwb2ludCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFBDRF9TRVRfRVBfUlhfQ05UKChVU0J4KSwgKGJFcE51bSksKHdDb3VudCkpICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmKChiRGlyKSA9PSBQQ0RfRVBfREJVRl9JTilcCisgICAgey8qIElOIGVuZHBvaW50ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICpQQ0RfRVBfUlhfQ05UKChVU0J4KSwgKGJFcE51bSkpID0gKHVpbnQzMl90KSh3Q291bnQpOyBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAvKiBTZXRFUERibEJ1ZjFDb3VudCAqLyAKKworI2RlZmluZSBQQ0RfU0VUX0VQX0RCVUZfQ05UKFVTQngsIGJFcE51bSwgYkRpciwgd0NvdW50KSB7XAorICAgIFBDRF9TRVRfRVBfREJVRjBfQ05UKChVU0J4KSwgKGJFcE51bSksIChiRGlyKSwgKHdDb3VudCkpIFwKKyAgICBQQ0RfU0VUX0VQX0RCVUYxX0NOVCgoVVNCeCksIChiRXBOdW0pLCAoYkRpciksICh3Q291bnQpKSBcCisgIH0gLworCisvKioKKyAgKiBAYnJpZWYgIEdldHMgYnVmZmVyIDAvMSByeC90eCBjb3VudGVyIGZvciBkb3VibGUgYnVmZmVyaW5nLgorICAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgUENEX0dFVF9FUF9EQlVGMF9DTlQoVVNCeCwgYkVwTnVtKSAoUENEX0dFVF9FUF9UWF9DTlQoKFVTQngpLCAoYkVwTnVtKSkpCisjZGVmaW5lIFBDRF9HRVRfRVBfREJVRjFfQ05UKFVTQngsIGJFcE51bSkgKFBDRF9HRVRfRVBfUlhfQ05UKChVU0J4KSwgKGJFcE51bSkpKQorLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIFBDRF9JbnN0YW5jZV9kZWZpbml0aW9uIFBDRCBJbnN0YW5jZSBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfUENEX0FMTF9JTlNUQU5DRSAgICAgICAgICAgICAgICAgICAgSVNfVVNCX0FMTF9JTlNUQU5DRQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFBDRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9EZXZDb25uZWN0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRGV2RGlzY29ubmVjdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1NldEFkZHJlc3MoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgYWRkcmVzcyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0VQX09wZW4oUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBfYWRkciwgdWludDE2X3QgZXBfbXBzLCB1aW50OF90IGVwX3R5cGUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9DbG9zZShQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRVBfUmVjZWl2ZShQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyLCB1aW50OF90ICpwQnVmLCB1aW50MzJfdCBsZW4pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9UcmFuc21pdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyLCB1aW50OF90ICpwQnVmLCB1aW50MzJfdCBsZW4pOwordWludDE2X3QgICAgICAgICAgSEFMX1BDRF9FUF9HZXRSeENvdW50KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwX2FkZHIpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9TZXRTdGFsbChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRVBfQ2xyU3RhbGwoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBfYWRkcik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0VQX0ZsdXNoKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwX2FkZHIpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9BY3RpdmVSZW1vdGVXYWtldXAoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9EZUFjdGl2ZVJlbW90ZVdha2V1cChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgUENEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworUENEX1N0YXRlVHlwZURlZiBIQUxfUENEX0dldFN0YXRlKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBQQ0RFeF9Qcml2YXRlX0Z1bmN0aW9ucyBQQ0QgRXh0ZW5kZWQgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLwordm9pZCBQQ0RfV3JpdGVQTUEoVVNCX1R5cGVEZWYgICpVU0J4LCB1aW50OF90ICpwYlVzckJ1ZiwgdWludDE2X3Qgd1BNQUJ1ZkFkZHIsIHVpbnQxNl90IHdOQnl0ZXMpOwordm9pZCBQQ0RfUmVhZFBNQShVU0JfVHlwZURlZiAgKlVTQngsIHVpbnQ4X3QgKnBiVXNyQnVmLCB1aW50MTZfdCB3UE1BQnVmQWRkciwgdWludDE2X3Qgd05CeXRlcyk7CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMng4ICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgLyogU1RNMzJGMzczeEMgICAgICAgICAgICAgICAgICAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLyogX19TVE0zMkYzeHhfSEFMX1BDRF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2hhbF9wY2RfZXguaCBiL0luYy9zdG0zMmYzeHhfaGFsX3BjZF9leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YmQ1YWUKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2hhbF9wY2RfZXguaApAQCAtMCwwICsxLDE1MiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfcGNkX2V4LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFBDRCBIQUwgRXh0ZW5zaW9uIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovIAorCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyRjN4eF9IQUxfUENEX0VYX0gKKyNkZWZpbmUgX19TVE0zMkYzeHhfSEFMX1BDRF9FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeDgpICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjM3M3hDKQorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBQQ0RFeAorICAqIEB7CisgICovIAorCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qKiBAZGVmZ3JvdXAgUENERXhfRXhwb3J0ZWRfTWFjcm9zIFBDRCBFeHRlbmRlZCBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBHZXRzIGFkZHJlc3MgaW4gYW4gZW5kcG9pbnQgcmVnaXN0ZXIuCisgICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworICAgCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzczeEMpCisgICAgICAKKyNkZWZpbmUgUENEX0VQX1RYX0FERFJFU1MoVVNCeCwgYkVwTnVtKSAoKHVpbnQxNl90ICopKCh1aW50MzJfdCkoKCgoVVNCeCktPkJUQUJMRSsoYkVwTnVtKSo4KSoyKyAgICAgKCh1aW50MzJfdCkoVVNCeCkgKyAweDQwMFUpKSkpKQorI2RlZmluZSBQQ0RfRVBfVFhfQ05UKFVTQngsIGJFcE51bSkgKCh1aW50MTZfdCAqKSgodWludDMyX3QpKCgoKFVTQngpLT5CVEFCTEUrKGJFcE51bSkqOCsyKSoyKyAgKCh1aW50MzJfdCkoVVNCeCkgKyAweDQwMFUpKSkpKQorI2RlZmluZSBQQ0RfRVBfUlhfQUREUkVTUyhVU0J4LCBiRXBOdW0pICgodWludDE2X3QgKikoKHVpbnQzMl90KSgoKChVU0J4KS0+QlRBQkxFKyhiRXBOdW0pKjgrNCkqMisgKCh1aW50MzJfdCkoVVNCeCkgKyAweDQwMFUpKSkpKQorI2RlZmluZSBQQ0RfRVBfUlhfQ05UKFVTQngsIGJFcE51bSkgKCh1aW50MTZfdCAqKSgodWludDMyX3QpKCgoKFVTQngpLT5CVEFCTEUrKGJFcE51bSkqOCs2KSoyKyAgKCh1aW50MzJfdCkoVVNCeCkgKyAweDQwMFUpKSkpKQorCisgICAgICAKKyNkZWZpbmUgUENEX1NFVF9FUF9SWF9DTlQoVVNCeCwgYkVwTnVtLHdDb3VudCkge1wKKyAgICB1aW50MTZfdCAqcGR3UmVnID1QQ0RfRVBfUlhfQ05UKChVU0J4KSwoYkVwTnVtKSk7IFwKKyAgICBQQ0RfU0VUX0VQX0NOVF9SWF9SRUcoKHBkd1JlZyksICh3Q291bnQpKVwKKyAgfQorCisjZW5kaWYgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzNzN4QyAgICAgICAgICAgICAgICAgICAqLworICAgCisgICAgICAKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4OCkKKyAgICAgICAgICAgCisjZGVmaW5lIFBDRF9FUF9UWF9BRERSRVNTKFVTQngsIGJFcE51bSkgKCh1aW50MTZfdCAqKSgodWludDMyX3QpKCgoKFVTQngpLT5CVEFCTEUrKGJFcE51bSkqOCkrICAgICAoKHVpbnQzMl90KShVU0J4KSArIDB4NDAwVSkpKSkpCisjZGVmaW5lIFBDRF9FUF9UWF9DTlQoVVNCeCwgYkVwTnVtKSAoKHVpbnQxNl90ICopKCh1aW50MzJfdCkoKCgoVVNCeCktPkJUQUJMRSsoYkVwTnVtKSo4KzIpKyAgKCh1aW50MzJfdCkoVVNCeCkgKyAweDQwMFUpKSkpKQorI2RlZmluZSBQQ0RfRVBfUlhfQUREUkVTUyhVU0J4LCBiRXBOdW0pICgodWludDE2X3QgKikoKHVpbnQzMl90KSgoKChVU0J4KS0+QlRBQkxFKyhiRXBOdW0pKjgrNCkrICgodWludDMyX3QpKFVTQngpICsgMHg0MDBVKSkpKSkKKyNkZWZpbmUgUENEX0VQX1JYX0NOVChVU0J4LCBiRXBOdW0pICgodWludDE2X3QgKikoKHVpbnQzMl90KSgoKChVU0J4KS0+QlRBQkxFKyhiRXBOdW0pKjgrNikrICAoKHVpbnQzMl90KShVU0J4KSArIDB4NDAwVSkpKSkpCisKKyNkZWZpbmUgUENEX1NFVF9FUF9SWF9DTlQoVVNCeCwgYkVwTnVtLHdDb3VudCkge1wKKyAgICB1aW50MTZfdCAqcGR3UmVnID0gUENEX0VQX1JYX0NOVCgoVVNCeCksIChiRXBOdW0pKTtcCisgICAgUENEX1NFVF9FUF9DTlRfUlhfUkVHKChwZHdSZWcpLCAod0NvdW50KSlcCisgIH0KKworI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeDggICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovIAorCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFBDREV4X0V4cG9ydGVkX0Z1bmN0aW9ucyBQQ0RFeCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworLyoqIEBhZGR0b2dyb3VwIFBDREV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqIEB7CisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENERXhfUE1BQ29uZmlnKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBlcF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGVwX2tpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcG1hYWRyZXNzKTsKKwordm9pZCBIQUxfUENERXhfU2V0Q29ubmVjdGlvblN0YXRlKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IHN0YXRlKTsKKworLyoqCisgICogQH0KKyAgKi8gCisgIAorLyoqCisgICogQH0KKyAgKi8gCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeDggICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzNzN4QyAgICAgICAgICAgICAgICAgICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKyNlbmRpZiAvKiBfX1NUTTMyRjN4eF9IQUxfUENEX0VYX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmYzeHhfaGFsX3B3ci5oIGIvSW5jL3N0bTMyZjN4eF9oYWxfcHdyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFjMTBhMwotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmYzeHhfaGFsX3B3ci5oCkBAIC0wLDAgKzEsMjM1IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2hhbF9wd3IuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgUFdSIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyRjN4eF9IQUxfUFdSX0gKKyNkZWZpbmUgX19TVE0zMkYzeHhfSEFMX1BXUl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFBXUiBQV1IKKyAgKiBAeworICAqLyAKKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFBXUl9FeHBvcnRlZF9Db25zdGFudHMgUFdSIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovIAorCisvKiogQGRlZmdyb3VwIFBXUl9XYWtlVXBfUGlucyBQV1IgV2FrZVVwIFBpbnMKKyAgKiBAeworICAqLworCisjZGVmaW5lIFBXUl9XQUtFVVBfUElOMSAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClQV1JfQ1NSX0VXVVAxKSAgIC8qITwgV2FrZXVwIHBpbiAxVSAqLworI2RlZmluZSBQV1JfV0FLRVVQX1BJTjIgICAgICAgICAgICAgICAgICgodWludDMyX3QpUFdSX0NTUl9FV1VQMikgICAvKiE8IFdha2V1cCBwaW4gMlUgKi8KKyNkZWZpbmUgUFdSX1dBS0VVUF9QSU4zICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVBXUl9DU1JfRVdVUDMpICAgLyohPCBXYWtldXAgcGluIDNVICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9SZWd1bGF0b3Jfc3RhdGVfaW5fU1RPUF9tb2RlIFBXUiBSZWd1bGF0b3Igc3RhdGUgaW4gU1RPUCBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUFdSX01BSU5SRUdVTEFUT1JfT04gICAgICAgICAoMHgwMDAwMDAwMFUpIC8qITwgVm9sdGFnZSByZWd1bGF0b3Igb24gZHVyaW5nIFNUT1AgbW9kZSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBQV1JfTE9XUE9XRVJSRUdVTEFUT1JfT04gICAgIFBXUl9DUl9MUERTICAgICAgICAgICAgLyohPCBWb2x0YWdlIHJlZ3VsYXRvciBpbiBsb3ctcG93ZXIgbW9kZSBkdXJpbmcgU1RPUCBtb2RlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9TTEVFUF9tb2RlX2VudHJ5IFBXUiBTTEVFUCBtb2RlIGVudHJ5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgUFdSX1NMRUVQRU5UUllfV0ZJICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAgLyohPCBXYWl0IEZvciBJbnRlcnJ1cHRpb24gaW5zdHJ1Y3Rpb24gdG8gZW50ZXIgU0xFRVAgbW9kZSAqLworI2RlZmluZSBQV1JfU0xFRVBFTlRSWV9XRkUgICAgICAgICAgICAgICgodWludDhfdCkweDAyVSkgICAvKiE8IFdhaXQgRm9yIEV2ZW50IGluc3RydWN0aW9uIHRvIGVudGVyIFNMRUVQIG1vZGUgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9TVE9QX21vZGVfZW50cnkgUFdSIFNUT1AgbW9kZSBlbnRyeQorICAqIEB7CisgICovCisjZGVmaW5lIFBXUl9TVE9QRU5UUllfV0ZJICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDFVKSAgIC8qITwgV2FpdCBGb3IgSW50ZXJydXB0aW9uIGluc3RydWN0aW9uIHRvIGVudGVyIFNUT1AgbW9kZSAqLworI2RlZmluZSBQV1JfU1RPUEVOVFJZX1dGRSAgICAgICAgICAgICAgICgodWludDhfdCkweDAyVSkgICAvKiE8IFdhaXQgRm9yIEV2ZW50IGluc3RydWN0aW9uIHRvIGVudGVyIFNUT1AgbW9kZSAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0ZsYWcgUFdSIEZsYWcKKyAgKiBAeworICAqLworI2RlZmluZSBQV1JfRkxBR19XVSAgICAgICAgICAgICAgICAgICAgIFBXUl9DU1JfV1VGICAgICAgICAgICAgIC8qITwgV2FrZXVwIGV2ZW50IGZyb20gd2FrZXVwIHBpbiBvciBSVEMgYWxhcm0gKi8KKyNkZWZpbmUgUFdSX0ZMQUdfU0IgICAgICAgICAgICAgICAgICAgICBQV1JfQ1NSX1NCRiAgICAgICAgICAgICAvKiE8IFN0YW5kYnkgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBXUl9GTEFHX1BWRE8gICAgICAgICAgICAgICAgICAgUFdSX0NTUl9QVkRPICAgICAgICAgICAgLyohPCBQb3dlciBWb2x0YWdlIERldGVjdG9yIG91dHB1dCBmbGFnICAgICAgICAqLworI2RlZmluZSBQV1JfRkxBR19WUkVGSU5UUkRZICAgICAgICAgICAgIFBXUl9DU1JfVlJFRklOVFJEWUYgICAgIC8qITwgVlJFRklOVCByZWZlcmVuY2Ugdm9sdGFnZSByZWFkeSAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFBXUl9FeHBvcnRlZF9NYWNybyBQV1IgRXhwb3J0ZWQgTWFjcm8KKyAgKiBAeworICAqLworCisvKiogQGJyaWVmICBDaGVjayBQV1IgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBQV1JfRkxBR19XVTogV2FrZSBVcCBmbGFnLiBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgYSB3YWtldXAgZXZlbnQKKyAgKiAgICAgICAgICAgICAgICAgIHdhcyByZWNlaXZlZCBmcm9tIHRoZSBXS1VQIHBpbiBvciBmcm9tIHRoZSBSVEMgYWxhcm0gKEFsYXJtIEEKKyAgKiAgICAgICAgICAgICAgICAgIG9yIEFsYXJtIEIpLCBSVEMgVGFtcGVyIGV2ZW50LCBSVEMgVGltZVN0YW1wIGV2ZW50IG9yIFJUQyBXYWtldXAuCisgICogICAgICAgICAgICAgICAgICBBbiBhZGRpdGlvbmFsIHdha2V1cCBldmVudCBpcyBkZXRlY3RlZCBpZiB0aGUgV0tVUCBwaW4gaXMgZW5hYmxlZAorICAqICAgICAgICAgICAgICAgICAgKGJ5IHNldHRpbmcgdGhlIEVXVVAgYml0KSB3aGVuIHRoZSBXS1VQIHBpbiBsZXZlbCBpcyBhbHJlYWR5IGhpZ2guCisgICogICAgICAgICAgICBAYXJnIFBXUl9GTEFHX1NCOiBTdGFuZEJ5IGZsYWcuIFRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgc3lzdGVtIHdhcworICAqICAgICAgICAgICAgICAgICAgcmVzdW1lZCBmcm9tIFN0YW5kQnkgbW9kZS4KKyAgKiAgICAgICAgICAgIEBhcmcgUFdSX0ZMQUdfUFZETzogUFZEIE91dHB1dC4gVGhpcyBmbGFnIGlzIHZhbGlkIG9ubHkgaWYgUFZEIGlzIGVuYWJsZWQKKyAgKiAgICAgICAgICAgICAgICAgIGJ5IHRoZSBIQUxfUFdSX0VuYWJsZVBWRCgpIGZ1bmN0aW9uLiBUaGUgUFZEIGlzIHN0b3BwZWQgYnkgU3RhbmRieSBtb2RlCisgICogICAgICAgICAgICAgICAgICBGb3IgdGhpcyByZWFzb24sIHRoaXMgYml0IGlzIGVxdWFsIHRvIDAgYWZ0ZXIgU3RhbmRieSBvciByZXNldAorICAqICAgICAgICAgICAgICAgICAgdW50aWwgdGhlIFBWREUgYml0IGlzIHNldC4KKyAgKiAgICAgICAgICAgIEBhcmcgUFdSX0ZMQUdfVlJFRklOVFJEWTogVGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBpbnRlcm5hbCByZWZlcmVuY2UKKyAgKiAgICAgICAgICAgICAgICAgIHZvbHRhZ2UgVlJFRklOVCBpcyByZWFkeS4KKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19GTEFHX18gKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBfX0hBTF9QV1JfR0VUX0ZMQUcoX19GTEFHX18pICgoUFdSLT5DU1IgJiAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgUFdSJ3MgcGVuZGluZyBmbGFncy4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBQV1JfRkxBR19XVTogV2FrZSBVcCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFBXUl9GTEFHX1NCOiBTdGFuZEJ5IGZsYWcKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX0NMRUFSX0ZMQUcoX19GTEFHX18pIChQV1ItPkNSIHw9ICAoX19GTEFHX18pIDw8IDJVKQorCisvKioKKyAgKiBAfQorICAqLworICAKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCAgUFdSX1ByaXZhdGVfTWFjcm9zICAgUFdSIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworI2RlZmluZSBJU19QV1JfV0FLRVVQX1BJTihQSU4pICgoKFBJTikgPT0gUFdSX1dBS0VVUF9QSU4xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUElOKSA9PSBQV1JfV0FLRVVQX1BJTjIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQSU4pID09IFBXUl9XQUtFVVBfUElOMykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBJU19QV1JfUkVHVUxBVE9SKFJFR1VMQVRPUikgKCgoUkVHVUxBVE9SKSA9PSBQV1JfTUFJTlJFR1VMQVRPUl9PTikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVUxBVE9SKSA9PSBQV1JfTE9XUE9XRVJSRUdVTEFUT1JfT04pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBJU19QV1JfU0xFRVBfRU5UUlkoRU5UUlkpICgoKEVOVFJZKSA9PSBQV1JfU0xFRVBFTlRSWV9XRkkpIHx8ICgoRU5UUlkpID09IFBXUl9TTEVFUEVOVFJZX1dGRSkpCisKKyNkZWZpbmUgSVNfUFdSX1NUT1BfRU5UUlkoRU5UUlkpICgoKEVOVFJZKSA9PSBQV1JfU1RPUEVOVFJZX1dGSSkgfHwgKChFTlRSWSkgPT0gUFdSX1NUT1BFTlRSWV9XRkUpKQorCisvKioKKyAgKiBAfQorICAqLyAgICAKKworLyogSW5jbHVkZSBQV1IgSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfcHdyX2V4LmgiCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAYWRkdG9ncm91cCBQV1JfRXhwb3J0ZWRfRnVuY3Rpb25zIFBXUiBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworICAKKy8qKiBAYWRkdG9ncm91cCBQV1JfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIAorICAqIEB7CisgICovCisKKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhBTF9QV1JfRGVJbml0KHZvaWQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgUFdSX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAKKyAgKiBAeworICAqLworCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIQUxfUFdSX0VuYWJsZUJrVXBBY2Nlc3Modm9pZCk7Cit2b2lkIEhBTF9QV1JfRGlzYWJsZUJrVXBBY2Nlc3Modm9pZCk7CisKKy8qIFdha2VVcCBwaW5zIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhBTF9QV1JfRW5hYmxlV2FrZVVwUGluKHVpbnQzMl90IFdha2VVcFBpbngpOwordm9pZCBIQUxfUFdSX0Rpc2FibGVXYWtlVXBQaW4odWludDMyX3QgV2FrZVVwUGlueCk7CisKKy8qIExvdyBQb3dlciBtb2RlcyBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhBTF9QV1JfRW50ZXJTVE9QTW9kZSh1aW50MzJfdCBSZWd1bGF0b3IsIHVpbnQ4X3QgU1RPUEVudHJ5KTsKK3ZvaWQgSEFMX1BXUl9FbnRlclNMRUVQTW9kZSh1aW50MzJfdCBSZWd1bGF0b3IsIHVpbnQ4X3QgU0xFRVBFbnRyeSk7Cit2b2lkIEhBTF9QV1JfRW50ZXJTVEFOREJZTW9kZSh2b2lkKTsKKwordm9pZCBIQUxfUFdSX0VuYWJsZVNsZWVwT25FeGl0KHZvaWQpOwordm9pZCBIQUxfUFdSX0Rpc2FibGVTbGVlcE9uRXhpdCh2b2lkKTsKK3ZvaWQgSEFMX1BXUl9FbmFibGVTRVZPblBlbmQodm9pZCk7Cit2b2lkIEhBTF9QV1JfRGlzYWJsZVNFVk9uUGVuZCh2b2lkKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmIC8qIF9fU1RNMzJGM3h4X0hBTF9QV1JfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjN4eF9oYWxfcHdyX2V4LmggYi9JbmMvc3RtMzJmM3h4X2hhbF9wd3JfZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODkyZTdiCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjN4eF9oYWxfcHdyX2V4LmgKQEAgLTAsMCArMSwzMzggQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX3B3cl9leC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBQV1IgSEFMIEV4dGVuZGVkIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0hBTF9QV1JfRVhfSAorI2RlZmluZSBfX1NUTTMyRjN4eF9IQUxfUFdSX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgUFdSRXgKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFBXUkV4X0V4cG9ydGVkX1R5cGVzIFBXUiBFeHRlbmRlZCBFeHBvcnRlZCBUeXBlcworICogIEB7CisgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzNzN4QykgCisvKioKKyAgKiBAYnJpZWYgIFBXUiBQVkQgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgUFZETGV2ZWw7ICAgLyohPCBQVkRMZXZlbDogU3BlY2lmaWVzIHRoZSBQVkQgZGV0ZWN0aW9uIGxldmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBQV1JFeF9QVkRfZGV0ZWN0aW9uX2xldmVsICovCisKKyAgdWludDMyX3QgTW9kZTsgICAgICAgLyohPCBNb2RlOiBTcGVjaWZpZXMgdGhlIG9wZXJhdGluZyBtb2RlIGZvciB0aGUgc2VsZWN0ZWQgcGlucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFBXUkV4X1BWRF9Nb2RlICovCit9UFdSX1BWRFR5cGVEZWY7CisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzNzN4QyAgICAgICAgICAgICAgICAgICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQV1JFeF9FeHBvcnRlZF9Db25zdGFudHMgUFdSIEV4dGVuZGVkIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzNzN4QykKKyAgICAKKy8qKiBAZGVmZ3JvdXAgUFdSRXhfUFZEX2RldGVjdGlvbl9sZXZlbCBQV1IgRXh0ZW5kZWQgUFZEIGRldGVjdGlvbiBsZXZlbAorICAqIEB7CisgICovCisjZGVmaW5lIFBXUl9QVkRMRVZFTF8wICAgICAgICAgICAgICAgICAgUFdSX0NSX1BMU19MRVYwICAgIC8qITwgUFZEIHRocmVzaG9sZCBhcm91bmQgMi4yIFYgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgUFdSX1BWRExFVkVMXzEgICAgICAgICAgICAgICAgICBQV1JfQ1JfUExTX0xFVjEgICAgLyohPCBQVkQgdGhyZXNob2xkIGFyb3VuZCAyLjMgViAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBQV1JfUFZETEVWRUxfMiAgICAgICAgICAgICAgICAgIFBXUl9DUl9QTFNfTEVWMiAgICAvKiE8IFBWRCB0aHJlc2hvbGQgYXJvdW5kIDIuNCBWICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIFBXUl9QVkRMRVZFTF8zICAgICAgICAgICAgICAgICAgUFdSX0NSX1BMU19MRVYzICAgIC8qITwgUFZEIHRocmVzaG9sZCBhcm91bmQgMi41IFYgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgUFdSX1BWRExFVkVMXzQgICAgICAgICAgICAgICAgICBQV1JfQ1JfUExTX0xFVjQgICAgLyohPCBQVkQgdGhyZXNob2xkIGFyb3VuZCAyLjYgViAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBQV1JfUFZETEVWRUxfNSAgICAgICAgICAgICAgICAgIFBXUl9DUl9QTFNfTEVWNSAgICAvKiE8IFBWRCB0aHJlc2hvbGQgYXJvdW5kIDIuNyBWICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIFBXUl9QVkRMRVZFTF82ICAgICAgICAgICAgICAgICAgUFdSX0NSX1BMU19MRVY2ICAgIC8qITwgUFZEIHRocmVzaG9sZCBhcm91bmQgMi44IFYgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgUFdSX1BWRExFVkVMXzcgICAgICAgICAgICAgICAgICBQV1JfQ1JfUExTX0xFVjcgICAgLyohPCBQVkQgdGhyZXNob2xkIGFyb3VuZCAyLjkgViAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JFeF9QVkRfTW9kZSBQV1IgRXh0ZW5kZWQgUFZEIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBQV1JfUFZEX01PREVfTk9STUFMICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgLyohPCBCYXNpYyBtb2RlIGlzIHVzZWQgKi8KKyNkZWZpbmUgUFdSX1BWRF9NT0RFX0lUX1JJU0lORyAgICAgICAgICAgICAgKDB4MDAwMTAwMDFVKSAgIC8qITwgRXh0ZXJuYWwgSW50ZXJydXB0IE1vZGUgd2l0aCBSaXNpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAqLworI2RlZmluZSBQV1JfUFZEX01PREVfSVRfRkFMTElORyAgICAgICAgICAgICAoMHgwMDAxMDAwMlUpICAgLyohPCBFeHRlcm5hbCBJbnRlcnJ1cHQgTW9kZSB3aXRoIEZhbGxpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAqLworI2RlZmluZSBQV1JfUFZEX01PREVfSVRfUklTSU5HX0ZBTExJTkcgICAgICAoMHgwMDAxMDAwM1UpICAgLyohPCBFeHRlcm5hbCBJbnRlcnJ1cHQgTW9kZSB3aXRoIFJpc2luZy9GYWxsaW5nIGVkZ2UgdHJpZ2dlciBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgUFdSX1BWRF9NT0RFX0VWRU5UX1JJU0lORyAgICAgICAgICAgKDB4MDAwMjAwMDFVKSAgIC8qITwgRXZlbnQgTW9kZSB3aXRoIFJpc2luZyBlZGdlIHRyaWdnZXIgZGV0ZWN0aW9uICovCisjZGVmaW5lIFBXUl9QVkRfTU9ERV9FVkVOVF9GQUxMSU5HICAgICAgICAgICgweDAwMDIwMDAyVSkgICAvKiE8IEV2ZW50IE1vZGUgd2l0aCBGYWxsaW5nIGVkZ2UgdHJpZ2dlciBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgUFdSX1BWRF9NT0RFX0VWRU5UX1JJU0lOR19GQUxMSU5HICAgKDB4MDAwMjAwMDNVKSAgIC8qITwgRXZlbnQgTW9kZSB3aXRoIFJpc2luZy9GYWxsaW5nIGVkZ2UgdHJpZ2dlciBkZXRlY3Rpb24gKi8KKy8qKgorICAqIEB9CisgICovCisKKyNkZWZpbmUgUFdSX0VYVElfTElORV9QVkQgIEVYVElfSU1SX01SMTYgIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMTYgQ29ubmVjdGVkIHRvIHRoZSBQVkQgRVhUSSBMaW5lICovCisKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCAqLworICAgICAgIC8qIFNUTTMyRjM3M3hDICAgICAgICAgICAgICAgICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorLyoqIEBkZWZncm91cCBQV1JFeF9TREFEQ19BTkFMT0d4IFBXUiBFeHRlbmRlZCBTREFEQyBBTkFMT0d4CisgICogQHsKKyAgKi8KKyNkZWZpbmUgUFdSX1NEQURDX0FOQUxPRzEgICAgICAgICAgICAgICgodWludDMyX3QpUFdSX0NSX0VOU0QxKSAgIC8qITwgRW5hYmxlIFNEQURDMSAqLyAKKyNkZWZpbmUgUFdSX1NEQURDX0FOQUxPRzIgICAgICAgICAgICAgICgodWludDMyX3QpUFdSX0NSX0VOU0QyKSAgIC8qITwgRW5hYmxlIFNEQURDMiAqLworI2RlZmluZSBQV1JfU0RBRENfQU5BTE9HMyAgICAgICAgICAgICAgKCh1aW50MzJfdClQV1JfQ1JfRU5TRDMpICAgLyohPCBFbmFibGUgU0RBREMzICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFBXUkV4X0V4cG9ydGVkX01hY3JvcyBQV1IgRXh0ZW5kZWQgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjM3M3hDKQorICAgIAorLyoqCisgICogQGJyaWVmIEVuYWJsZSBpbnRlcnJ1cHQgb24gUFZEIEV4dGkgTGluZSAxNi4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfSVQoKSAgICAgIChFWFRJLT5JTVIgfD0gKFBXUl9FWFRJX0xJTkVfUFZEKSkKKworLyoqCisgICogQGJyaWVmIERpc2FibGUgaW50ZXJydXB0IG9uIFBWRCBFeHRpIExpbmUgMTYuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9JVCgpICAgICAoRVhUSS0+SU1SICY9IH4oUFdSX0VYVElfTElORV9QVkQpKQorCisvKioKKyAgKiBAYnJpZWYgR2VuZXJhdGUgYSBTb2Z0d2FyZSBpbnRlcnJ1cHQgb24gc2VsZWN0ZWQgRVhUSSBsaW5lLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0dFTkVSQVRFX1NXSVQoKSAgKEVYVEktPlNXSUVSIHw9IChQV1JfRVhUSV9MSU5FX1BWRCkpCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgZXZlbnQgb24gUFZEIEV4dGkgTGluZSAxNi4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfRVZFTlQoKSAgIChFWFRJLT5FTVIgfD0gKFBXUl9FWFRJX0xJTkVfUFZEKSkKKworLyoqCisgICogQGJyaWVmIERpc2FibGUgZXZlbnQgb24gUFZEIEV4dGkgTGluZSAxNi4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX0VWRU5UKCkgIChFWFRJLT5FTVIgJj0gfihQV1JfRVhUSV9MSU5FX1BWRCkpCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIHRoZSBQVkQgRXh0ZW5kZWQgSW50ZXJydXB0IFJpc2luZyBUcmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSAgQ0xFQVJfQklUKEVYVEktPlJUU1IsIFBXUl9FWFRJX0xJTkVfUFZEKQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZEIEV4dGVuZGVkIEludGVycnVwdCBGYWxsaW5nIFRyaWdnZXIuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSAgQ0xFQVJfQklUKEVYVEktPkZUU1IsIFBXUl9FWFRJX0xJTkVfUFZEKQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZEIEV4dGVuZGVkIEludGVycnVwdCBSaXNpbmcgJiBGYWxsaW5nIFRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSAgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKTtfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKTsKKworLyoqCisgICogQGJyaWVmICBQVkQgRVhUSSBsaW5lIGNvbmZpZ3VyYXRpb246IHNldCBmYWxsaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgIEVYVEktPkZUU1IgfD0gKFBXUl9FWFRJX0xJTkVfUFZEKQorCisvKioKKyAgKiBAYnJpZWYgIFBWRCBFWFRJIGxpbmUgY29uZmlndXJhdGlvbjogc2V0IHJpc2luZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgICBFWFRJLT5SVFNSIHw9IChQV1JfRVhUSV9MSU5FX1BWRCkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFBWRCBFeHRlbmRlZCBJbnRlcnJ1cHQgUmlzaW5nICYgRmFsbGluZyBUcmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSAgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTtfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpOworCisvKioKKyAgKiBAYnJpZWYgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFBWRCBFWFRJIGludGVycnVwdCBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHJldHZhbCBFWFRJIFBWRCBMaW5lIFN0YXR1cy4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0dFVF9GTEFHKCkgICAgICAgKEVYVEktPlBSICYgKFBXUl9FWFRJX0xJTkVfUFZEKSkKKworLyoqCisgICogQGJyaWVmIENsZWFyIHRoZSBQVkQgRVhUSSBmbGFnLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0NMRUFSX0ZMQUcoKSAgICAgKEVYVEktPlBSID0gKFBXUl9FWFRJX0xJTkVfUFZEKSkKKworI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzczeEMgICAgICAgICAgICAgICAgICAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgIFBXUkV4X1ByaXZhdGVfTWFjcm9zICAgUFdSIEV4dGVuZGVkIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjM3M3hDKQorI2RlZmluZSBJU19QV1JfUFZEX0xFVkVMKExFVkVMKSAoKChMRVZFTCkgPT0gUFdSX1BWRExFVkVMXzApIHx8ICgoTEVWRUwpID09IFBXUl9QVkRMRVZFTF8xKXx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVWRUwpID09IFBXUl9QVkRMRVZFTF8yKSB8fCAoKExFVkVMKSA9PSBQV1JfUFZETEVWRUxfMyl8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExFVkVMKSA9PSBQV1JfUFZETEVWRUxfNCkgfHwgKChMRVZFTCkgPT0gUFdSX1BWRExFVkVMXzUpfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMRVZFTCkgPT0gUFdSX1BWRExFVkVMXzYpIHx8ICgoTEVWRUwpID09IFBXUl9QVkRMRVZFTF83KSkKKworI2RlZmluZSBJU19QV1JfUFZEX01PREUoTU9ERSkgKCgoTU9ERSkgPT0gUFdSX1BWRF9NT0RFX0lUX1JJU0lORyl8fCAoKE1PREUpID09IFBXUl9QVkRfTU9ERV9JVF9GQUxMSU5HKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFBXUl9QVkRfTU9ERV9JVF9SSVNJTkdfRkFMTElORykgfHwgKChNT0RFKSA9PSBQV1JfUFZEX01PREVfRVZFTlRfUklTSU5HKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFBXUl9QVkRfTU9ERV9FVkVOVF9GQUxMSU5HKSB8fCAoKE1PREUpID09IFBXUl9QVkRfTU9ERV9FVkVOVF9SSVNJTkdfRkFMTElORykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBQV1JfUFZEX01PREVfTk9STUFMKSkKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCAqLworICAgICAgIC8qIFNUTTMyRjM3M3hDICAgICAgICAgICAgICAgICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorI2RlZmluZSBJU19QV1JfU0RBRENfQU5BTE9HKFNEQURDKSAoKChTREFEQykgPT0gUFdSX1NEQURDX0FOQUxPRzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0RBREMpID09IFBXUl9TREFEQ19BTkFMT0cyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNEQURDKSA9PSBQV1JfU0RBRENfQU5BTE9HMykpCisjZW5kaWYgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8KKworCisvKioKKyAgKiBAfQorICAqLyAgICAKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBhZGR0b2dyb3VwIFBXUkV4X0V4cG9ydGVkX0Z1bmN0aW9ucyBQV1IgRXh0ZW5kZWQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgKiAgQHsKKyAqLworCisvKiogQGFkZHRvZ3JvdXAgUFdSRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBQZXJpcGhlcmFsIEV4dGVuZGVkIENvbnRyb2wgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIFBlcmlwaGVyYWwgRXh0ZW5kZWQgY29udHJvbCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzczeEMpCit2b2lkIEhBTF9QV1JfQ29uZmlnUFZEKFBXUl9QVkRUeXBlRGVmICpzQ29uZmlnUFZEKTsKK3ZvaWQgSEFMX1BXUl9FbmFibGVQVkQodm9pZCk7Cit2b2lkIEhBTF9QV1JfRGlzYWJsZVBWRCh2b2lkKTsKK3ZvaWQgSEFMX1BXUl9QVkRfSVJRSGFuZGxlcih2b2lkKTsKK3ZvaWQgSEFMX1BXUl9QVkRDYWxsYmFjayh2b2lkKTsKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCAqLworICAgICAgIC8qIFNUTTMyRjM3M3hDICAgICAgICAgICAgICAgICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQordm9pZCBIQUxfUFdSRXhfRW5hYmxlU0RBREModWludDMyX3QgQW5hbG9neCk7Cit2b2lkIEhBTF9QV1JFeF9EaXNhYmxlU0RBREModWludDMyX3QgQW5hbG9neCk7CisjZW5kaWYgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJGM3h4X0hBTF9QV1JfRVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjN4eF9oYWxfcmNjLmggYi9JbmMvc3RtMzJmM3h4X2hhbF9yY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDliOTc0Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjN4eF9oYWxfcmNjLmgKQEAgLTAsMCArMSwxNzU2IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2hhbF9yY2MuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgUkNDIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyRjN4eF9IQUxfUkNDX0gKKyNkZWZpbmUgX19TVE0zMkYzeHhfSEFMX1JDQ19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFJDQworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBSQ0NfUHJpdmF0ZV9Db25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19UaW1lb3V0IFJDQyBUaW1lb3V0CisgICogQHsKKyAgKi8gCisgIAorLyogRGlzYWJsZSBCYWNrdXAgZG9tYWluIHdyaXRlIHByb3RlY3Rpb24gc3RhdGUgY2hhbmdlIHRpbWVvdXQgKi8KKyNkZWZpbmUgUkNDX0RCUF9USU1FT1VUX1ZBTFVFICAgICAgKDEwMFUpICAgICAgIC8qIDEwMCBtcyAqLworLyogTFNFIHN0YXRlIGNoYW5nZSB0aW1lb3V0ICovCisjZGVmaW5lIFJDQ19MU0VfVElNRU9VVF9WQUxVRSAgICAgIExTRV9TVEFSVFVQX1RJTUVPVVQKKyNkZWZpbmUgQ0xPQ0tTV0lUQ0hfVElNRU9VVF9WQUxVRSAgKDUwMDBVKSAgLyogNSBzICAgICovCisjZGVmaW5lIEhTRV9USU1FT1VUX1ZBTFVFICAgICAgICAgIEhTRV9TVEFSVFVQX1RJTUVPVVQKKyNkZWZpbmUgSFNJX1RJTUVPVVRfVkFMVUUgICAgICAgICAgKDJVKSAgICAgIC8qIDIgbXMgKG1pbmltdW0gVGljayArIDFVKSAqLworI2RlZmluZSBMU0lfVElNRU9VVF9WQUxVRSAgICAgICAgICAoMlUpICAgICAgLyogMiBtcyAobWluaW11bSBUaWNrICsgMVUpICovCisjZGVmaW5lIFBMTF9USU1FT1VUX1ZBTFVFICAgICAgICAgICgyVSkgICAgICAvKiAyIG1zIChtaW5pbXVtIFRpY2sgKyAxVSkgKi8KKy8qKgorICAqIEB9CisgICovCisgIAorLyoqIEBkZWZncm91cCBSQ0NfUmVnaXN0ZXJfT2Zmc2V0IFJlZ2lzdGVyIG9mZnNldHMKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfT0ZGU0VUICAgICAgICAgICAgICAgIChSQ0NfQkFTRSAtIFBFUklQSF9CQVNFKQorI2RlZmluZSBSQ0NfQ1JfT0ZGU0VUICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgUkNDX0NGR1JfT0ZGU0VUICAgICAgICAgICAweDA0CisjZGVmaW5lIFJDQ19DSVJfT0ZGU0VUICAgICAgICAgICAgMHgwOAorI2RlZmluZSBSQ0NfQkRDUl9PRkZTRVQgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgUkNDX0NTUl9PRkZTRVQgICAgICAgICAgICAweDI0CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0JpdEFkZHJlc3NfQWxpYXNSZWdpb24gQml0QWRkcmVzcyBBbGlhc1JlZ2lvbgorICAqIEBicmllZiBSQ0MgcmVnaXN0ZXJzIGJpdCBhZGRyZXNzIGluIHRoZSBhbGlhcyByZWdpb24KKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfQ1JfT0ZGU0VUX0JCICAgICAgICAgIChSQ0NfT0ZGU0VUICsgUkNDX0NSX09GRlNFVCkKKyNkZWZpbmUgUkNDX0NGR1JfT0ZGU0VUX0JCICAgICAgICAoUkNDX09GRlNFVCArIFJDQ19DRkdSX09GRlNFVCkKKyNkZWZpbmUgUkNDX0NJUl9PRkZTRVRfQkIgICAgICAgICAoUkNDX09GRlNFVCArIFJDQ19DSVJfT0ZGU0VUKQorI2RlZmluZSBSQ0NfQkRDUl9PRkZTRVRfQkIgICAgICAgIChSQ0NfT0ZGU0VUICsgUkNDX0JEQ1JfT0ZGU0VUKQorI2RlZmluZSBSQ0NfQ1NSX09GRlNFVF9CQiAgICAgICAgIChSQ0NfT0ZGU0VUICsgUkNDX0NTUl9PRkZTRVQpCisKKy8qIC0tLSBDUiBSZWdpc3RlciAtLS0qLworLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIEhTSU9OIGJpdCAqLworI2RlZmluZSBSQ0NfSFNJT05fQklUX05VTUJFUiAgICAgIFBPU0lUSU9OX1ZBTChSQ0NfQ1JfSFNJT04pCisjZGVmaW5lIFJDQ19DUl9IU0lPTl9CQiAgICAgICAgICAgKCh1aW50MzJfdCkoUEVSSVBIX0JCX0JBU0UgKyAoUkNDX0NSX09GRlNFVF9CQiAqIDMyVSkgKyAoUkNDX0hTSU9OX0JJVF9OVU1CRVIgKiA0VSkpKQorLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIEhTRU9OIGJpdCAqLworI2RlZmluZSBSQ0NfSFNFT05fQklUX05VTUJFUiAgICAgIFBPU0lUSU9OX1ZBTChSQ0NfQ1JfSFNFT04pCisjZGVmaW5lIFJDQ19DUl9IU0VPTl9CQiAgICAgICAgICAgKCh1aW50MzJfdCkoUEVSSVBIX0JCX0JBU0UgKyAoUkNDX0NSX09GRlNFVF9CQiAqIDMyVSkgKyAoUkNDX0hTRU9OX0JJVF9OVU1CRVIgKiA0VSkpKQorLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIENTU09OIGJpdCAqLworI2RlZmluZSBSQ0NfQ1NTT05fQklUX05VTUJFUiAgICAgIFBPU0lUSU9OX1ZBTChSQ0NfQ1JfQ1NTT04pCisjZGVmaW5lIFJDQ19DUl9DU1NPTl9CQiAgICAgICAgICAgKCh1aW50MzJfdCkoUEVSSVBIX0JCX0JBU0UgKyAoUkNDX0NSX09GRlNFVF9CQiAqIDMyVSkgKyAoUkNDX0NTU09OX0JJVF9OVU1CRVIgKiA0VSkpKQorLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIFBMTE9OIGJpdCAqLworI2RlZmluZSBSQ0NfUExMT05fQklUX05VTUJFUiAgICAgIFBPU0lUSU9OX1ZBTChSQ0NfQ1JfUExMT04pCisjZGVmaW5lIFJDQ19DUl9QTExPTl9CQiAgICAgICAgICAgKCh1aW50MzJfdCkoUEVSSVBIX0JCX0JBU0UgKyAoUkNDX0NSX09GRlNFVF9CQiAqIDMyVSkgKyAoUkNDX1BMTE9OX0JJVF9OVU1CRVIgKiA0VSkpKQorCisvKiAtLS0gQ1NSIFJlZ2lzdGVyIC0tLSovCisvKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgTFNJT04gYml0ICovCisjZGVmaW5lIFJDQ19MU0lPTl9CSVRfTlVNQkVSICAgICAgUE9TSVRJT05fVkFMKFJDQ19DU1JfTFNJT04pCisjZGVmaW5lIFJDQ19DU1JfTFNJT05fQkIgICAgICAgICAgKCh1aW50MzJfdCkoUEVSSVBIX0JCX0JBU0UgKyAoUkNDX0NTUl9PRkZTRVRfQkIgKiAzMlUpICsgKFJDQ19MU0lPTl9CSVRfTlVNQkVSICogNFUpKSkKKworLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIFJNVkYgYml0ICovCisjZGVmaW5lIFJDQ19STVZGX0JJVF9OVU1CRVIgICAgICAgUE9TSVRJT05fVkFMKFJDQ19DU1JfUk1WRikKKyNkZWZpbmUgUkNDX0NTUl9STVZGX0JCICAgICAgICAgICAoKHVpbnQzMl90KShQRVJJUEhfQkJfQkFTRSArIChSQ0NfQ1NSX09GRlNFVF9CQiAqIDMyVSkgKyAoUkNDX1JNVkZfQklUX05VTUJFUiAqIDRVKSkpCisKKy8qIC0tLSBCRENSIFJlZ2lzdGVycyAtLS0qLworLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIExTRU9OIGJpdCAqLworI2RlZmluZSBSQ0NfTFNFT05fQklUX05VTUJFUiAgICAgIFBPU0lUSU9OX1ZBTChSQ0NfQkRDUl9MU0VPTikKKyNkZWZpbmUgUkNDX0JEQ1JfTFNFT05fQkIgICAgICAgICAgKCh1aW50MzJfdCkoUEVSSVBIX0JCX0JBU0UgKyAoUkNDX0JEQ1JfT0ZGU0VUX0JCICogMzJVKSArIChSQ0NfTFNFT05fQklUX05VTUJFUiAqIDRVKSkpCisKKy8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBMU0VPTiBiaXQgKi8KKyNkZWZpbmUgUkNDX0xTRUJZUF9CSVRfTlVNQkVSICAgICBQT1NJVElPTl9WQUwoUkNDX0JEQ1JfTFNFQllQKQorI2RlZmluZSBSQ0NfQkRDUl9MU0VCWVBfQkIgICAgICAgICAoKHVpbnQzMl90KShQRVJJUEhfQkJfQkFTRSArIChSQ0NfQkRDUl9PRkZTRVRfQkIgKiAzMlUpICsgKFJDQ19MU0VCWVBfQklUX05VTUJFUiAqIDRVKSkpCisKKy8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBSVENFTiBiaXQgKi8KKyNkZWZpbmUgUkNDX1JUQ0VOX0JJVF9OVU1CRVIgICAgICBQT1NJVElPTl9WQUwoUkNDX0JEQ1JfUlRDRU4pCisjZGVmaW5lIFJDQ19CRENSX1JUQ0VOX0JCICAgICAgICAgICgodWludDMyX3QpKFBFUklQSF9CQl9CQVNFICsgKFJDQ19CRENSX09GRlNFVF9CQiAqIDMyVSkgKyAoUkNDX1JUQ0VOX0JJVF9OVU1CRVIgKiA0VSkpKQorCisvKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgQkRSU1QgYml0ICovCisjZGVmaW5lIFJDQ19CRFJTVF9CSVRfTlVNQkVSICAgICAgICAgIFBPU0lUSU9OX1ZBTChSQ0NfQkRDUl9CRFJTVCkKKyNkZWZpbmUgUkNDX0JEQ1JfQkRSU1RfQkIgICAgICAgICAoKHVpbnQzMl90KShQRVJJUEhfQkJfQkFTRSArIChSQ0NfQkRDUl9PRkZTRVRfQkIgKiAzMlUpICsgKFJDQ19CRFJTVF9CSVRfTlVNQkVSICogNFUpKSkKKworLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiBDUiByZWdpc3RlciBieXRlIDIgKEJpdHNbMjM6MTZdKSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUkNDX0NSX0JZVEUyX0FERFJFU1MgICAgICAgICAgKCh1aW50MzJfdCkoUkNDX0JBU0UgKyBSQ0NfQ1JfT0ZGU0VUICsgMHgwMlUpKQorCisvKiBDSVIgcmVnaXN0ZXIgYnl0ZSAxIChCaXRzWzE1OjhdKSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUkNDX0NJUl9CWVRFMV9BRERSRVNTICAgICAoKHVpbnQzMl90KShSQ0NfQkFTRSArIFJDQ19DSVJfT0ZGU0VUICsgMHgwMVUpKQorCisvKiBDSVIgcmVnaXN0ZXIgYnl0ZSAyIChCaXRzWzIzOjE2XSkgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFJDQ19DSVJfQllURTJfQUREUkVTUyAgICAgKCh1aW50MzJfdCkoUkNDX0JBU0UgKyBSQ0NfQ0lSX09GRlNFVCArIDB4MDJVKSkKKworLyogRGVmaW5lcyB1c2VkIGZvciBGbGFncyAqLworI2RlZmluZSBDUl9SRUdfSU5ERVggICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMVUpCisjZGVmaW5lIEJEQ1JfUkVHX0lOREVYICAgICAgICAgICAgICAgICAgICgodWludDhfdCkyVSkKKyNkZWZpbmUgQ1NSX1JFR19JTkRFWCAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTNVKQorI2RlZmluZSBDRkdSX1JFR19JTkRFWCAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpNFUpCisKKyNkZWZpbmUgUkNDX0ZMQUdfTUFTSyAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MUZVKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgUkNDX1ByaXZhdGVfTWFjcm9zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfUkNDX1BMTFNPVVJDRShfX1NPVVJDRV9fKSAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfUExMU09VUkNFX0hTSSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19QTExTT1VSQ0VfSFNFKSkKKyNkZWZpbmUgSVNfUkNDX09TQ0lMTEFUT1JUWVBFKF9fT1NDSUxMQVRPUl9fKSAoKChfX09TQ0lMTEFUT1JfXykgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX05PTkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX09TQ0lMTEFUT1JfXykgJiBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNFKSA9PSBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fT1NDSUxMQVRPUl9fKSAmIFJDQ19PU0NJTExBVE9SVFlQRV9IU0kpID09IFJDQ19PU0NJTExBVE9SVFlQRV9IU0kpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19PU0NJTExBVE9SX18pICYgUkNDX09TQ0lMTEFUT1JUWVBFX0xTSSkgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX0xTSSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX09TQ0lMTEFUT1JfXykgJiBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNFKSA9PSBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNFKSkKKyNkZWZpbmUgSVNfUkNDX0hTRShfX0hTRV9fKSAoKChfX0hTRV9fKSA9PSBSQ0NfSFNFX09GRikgfHwgKChfX0hTRV9fKSA9PSBSQ0NfSFNFX09OKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IU0VfXykgPT0gUkNDX0hTRV9CWVBBU1MpKQorI2RlZmluZSBJU19SQ0NfTFNFKF9fTFNFX18pICgoKF9fTFNFX18pID09IFJDQ19MU0VfT0ZGKSB8fCAoKF9fTFNFX18pID09IFJDQ19MU0VfT04pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xTRV9fKSA9PSBSQ0NfTFNFX0JZUEFTUykpCisjZGVmaW5lIElTX1JDQ19IU0koX19IU0lfXykgKCgoX19IU0lfXykgPT0gUkNDX0hTSV9PRkYpIHx8ICgoX19IU0lfXykgPT0gUkNDX0hTSV9PTikpCisjZGVmaW5lIElTX1JDQ19DQUxJQlJBVElPTl9WQUxVRShfX1ZBTFVFX18pICgoX19WQUxVRV9fKSA8PSAweDFGVSkKKyNkZWZpbmUgSVNfUkNDX0xTSShfX0xTSV9fKSAoKChfX0xTSV9fKSA9PSBSQ0NfTFNJX09GRikgfHwgKChfX0xTSV9fKSA9PSBSQ0NfTFNJX09OKSkKKyNkZWZpbmUgSVNfUkNDX1BMTChfX1BMTF9fKSAoKChfX1BMTF9fKSA9PSBSQ0NfUExMX05PTkUpIHx8ICgoX19QTExfXykgPT0gUkNDX1BMTF9PRkYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BMTF9fKSA9PSBSQ0NfUExMX09OKSkKKyNpZiAgIGRlZmluZWQoUkNDX0NGR1JfUExMU1JDX0hTSV9QUkVESVYpCisjZGVmaW5lIElTX1JDQ19QUkVESVYoX19QUkVESVZfXykgKCgoX19QUkVESVZfXykgPT0gUkNDX1BSRURJVl9ESVYxKSAgfHwgKChfX1BSRURJVl9fKSA9PSBSQ0NfUFJFRElWX0RJVjIpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVESVZfXykgPT0gUkNDX1BSRURJVl9ESVYzKSAgfHwgKChfX1BSRURJVl9fKSA9PSBSQ0NfUFJFRElWX0RJVjQpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVESVZfXykgPT0gUkNDX1BSRURJVl9ESVY1KSAgfHwgKChfX1BSRURJVl9fKSA9PSBSQ0NfUFJFRElWX0RJVjYpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVESVZfXykgPT0gUkNDX1BSRURJVl9ESVY3KSAgfHwgKChfX1BSRURJVl9fKSA9PSBSQ0NfUFJFRElWX0RJVjgpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVESVZfXykgPT0gUkNDX1BSRURJVl9ESVY5KSAgfHwgKChfX1BSRURJVl9fKSA9PSBSQ0NfUFJFRElWX0RJVjEwKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVESVZfXykgPT0gUkNDX1BSRURJVl9ESVYxMSkgfHwgKChfX1BSRURJVl9fKSA9PSBSQ0NfUFJFRElWX0RJVjEyKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVESVZfXykgPT0gUkNDX1BSRURJVl9ESVYxMykgfHwgKChfX1BSRURJVl9fKSA9PSBSQ0NfUFJFRElWX0RJVjE0KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVESVZfXykgPT0gUkNDX1BSRURJVl9ESVYxNSkgfHwgKChfX1BSRURJVl9fKSA9PSBSQ0NfUFJFRElWX0RJVjE2KSkKKyNlbHNlCisjZGVmaW5lIElTX1JDQ19QTExfRElWKF9fRElWX18pICgoKF9fRElWX18pID09IFJDQ19QTExfRElWMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RJVl9fKSA9PSBSQ0NfUExMX0RJVjMpIHx8ICgoX19ESVZfXykgPT0gUkNDX1BMTF9ESVY0KSkKKyNlbmRpZgorI2lmIGRlZmluZWQoUkNDX0NGR1JfUExMU1JDX0hTSV9ESVYyKQorI2RlZmluZSBJU19SQ0NfSFNFX1BSRURJVihESVYpICgoKERJVikgPT0gUkNDX0hTRV9QUkVESVZfRElWMSkgIHx8ICgoRElWKSA9PSBSQ0NfSFNFX1BSRURJVl9ESVYyKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERJVikgPT0gUkNDX0hTRV9QUkVESVZfRElWMykgIHx8ICgoRElWKSA9PSBSQ0NfSFNFX1BSRURJVl9ESVY0KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERJVikgPT0gUkNDX0hTRV9QUkVESVZfRElWNSkgIHx8ICgoRElWKSA9PSBSQ0NfSFNFX1BSRURJVl9ESVY2KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERJVikgPT0gUkNDX0hTRV9QUkVESVZfRElWNykgIHx8ICgoRElWKSA9PSBSQ0NfSFNFX1BSRURJVl9ESVY4KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERJVikgPT0gUkNDX0hTRV9QUkVESVZfRElWOSkgIHx8ICgoRElWKSA9PSBSQ0NfSFNFX1BSRURJVl9ESVYxMCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERJVikgPT0gUkNDX0hTRV9QUkVESVZfRElWMTEpIHx8ICgoRElWKSA9PSBSQ0NfSFNFX1BSRURJVl9ESVYxMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERJVikgPT0gUkNDX0hTRV9QUkVESVZfRElWMTMpIHx8ICgoRElWKSA9PSBSQ0NfSFNFX1BSRURJVl9ESVYxNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERJVikgPT0gUkNDX0hTRV9QUkVESVZfRElWMTUpIHx8ICgoRElWKSA9PSBSQ0NfSFNFX1BSRURJVl9ESVYxNikpCisjZW5kaWYgLyogUkNDX0NGR1JfUExMU1JDX0hTSV9ESVYyICovCisKKyNkZWZpbmUgSVNfUkNDX1BMTF9NVUwoX19NVUxfXykgKCgoX19NVUxfXykgPT0gUkNDX1BMTF9NVUwyKSAgfHwgKChfX01VTF9fKSA9PSBSQ0NfUExMX01VTDMpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01VTF9fKSA9PSBSQ0NfUExMX01VTDQpICB8fCAoKF9fTVVMX18pID09IFJDQ19QTExfTVVMNSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTVVMX18pID09IFJDQ19QTExfTVVMNikgIHx8ICgoX19NVUxfXykgPT0gUkNDX1BMTF9NVUw3KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NVUxfXykgPT0gUkNDX1BMTF9NVUw4KSAgfHwgKChfX01VTF9fKSA9PSBSQ0NfUExMX01VTDkpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01VTF9fKSA9PSBSQ0NfUExMX01VTDEwKSB8fCAoKF9fTVVMX18pID09IFJDQ19QTExfTVVMMTEpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTVVMX18pID09IFJDQ19QTExfTVVMMTIpIHx8ICgoX19NVUxfXykgPT0gUkNDX1BMTF9NVUwxMykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NVUxfXykgPT0gUkNDX1BMTF9NVUwxNCkgfHwgKChfX01VTF9fKSA9PSBSQ0NfUExMX01VTDE1KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01VTF9fKSA9PSBSQ0NfUExMX01VTDE2KSkKKyNkZWZpbmUgSVNfUkNDX0NMT0NLVFlQRShDTEspICgoKChDTEspICYgUkNDX0NMT0NLVFlQRV9TWVNDTEspID09IFJDQ19DTE9DS1RZUEVfU1lTQ0xLKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoQ0xLKSAmIFJDQ19DTE9DS1RZUEVfSENMSykgICA9PSBSQ0NfQ0xPQ0tUWVBFX0hDTEspICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKENMSykgJiBSQ0NfQ0xPQ0tUWVBFX1BDTEsxKSAgPT0gUkNDX0NMT0NLVFlQRV9QQ0xLMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChDTEspICYgUkNDX0NMT0NLVFlQRV9QQ0xLMikgID09IFJDQ19DTE9DS1RZUEVfUENMSzIpKQorI2RlZmluZSBJU19SQ0NfU1lTQ0xLU09VUkNFKF9fU09VUkNFX18pICgoKF9fU09VUkNFX18pID09IFJDQ19TWVNDTEtTT1VSQ0VfSFNJKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1NZU0NMS1NPVVJDRV9IU0UpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfU1lTQ0xLU09VUkNFX1BMTENMSykpCisjZGVmaW5lIElTX1JDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTKF9fU09VUkNFX18pICgoKF9fU09VUkNFX18pID09IFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX0hTSSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19IU0UpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfUExMQ0xLKSkKKyNkZWZpbmUgSVNfUkNDX0hDTEsoX19IQ0xLX18pICgoKF9fSENMS19fKSA9PSBSQ0NfU1lTQ0xLX0RJVjEpIHx8ICgoX19IQ0xLX18pID09IFJDQ19TWVNDTEtfRElWMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQ0xLX18pID09IFJDQ19TWVNDTEtfRElWNCkgfHwgKChfX0hDTEtfXykgPT0gUkNDX1NZU0NMS19ESVY4KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0hDTEtfXykgPT0gUkNDX1NZU0NMS19ESVYxNikgfHwgKChfX0hDTEtfXykgPT0gUkNDX1NZU0NMS19ESVY2NCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQ0xLX18pID09IFJDQ19TWVNDTEtfRElWMTI4KSB8fCAoKF9fSENMS19fKSA9PSBSQ0NfU1lTQ0xLX0RJVjI1NikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQ0xLX18pID09IFJDQ19TWVNDTEtfRElWNTEyKSkKKyNkZWZpbmUgSVNfUkNDX1BDTEsoX19QQ0xLX18pICgoKF9fUENMS19fKSA9PSBSQ0NfSENMS19ESVYxKSB8fCAoKF9fUENMS19fKSA9PSBSQ0NfSENMS19ESVYyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BDTEtfXykgPT0gUkNDX0hDTEtfRElWNCkgfHwgKChfX1BDTEtfXykgPT0gUkNDX0hDTEtfRElWOCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQ0xLX18pID09IFJDQ19IQ0xLX0RJVjE2KSkKKyNkZWZpbmUgSVNfUkNDX01DTyhfX01DT19fKSAgKChfX01DT19fKSA9PSBSQ0NfTUNPKQorI2RlZmluZSBJU19SQ0NfUlRDQ0xLU09VUkNFKF9fU09VUkNFX18pICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfUlRDQ0xLU09VUkNFX05PX0NMSykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfUlRDQ0xLU09VUkNFX0xTRSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1JUQ0NMS1NPVVJDRV9MU0kpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19SVENDTEtTT1VSQ0VfSFNFX0RJVjMyKSkKKyNpZiBkZWZpbmVkKFJDQ19DRkdSM19VU0FSVDJTVykKKyNkZWZpbmUgSVNfUkNDX1VTQVJUMkNMS1NPVVJDRShfX1NPVVJDRV9fKSAgKCgoX19TT1VSQ0VfXykgPT0gUkNDX1VTQVJUMkNMS1NPVVJDRV9QQ0xLMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1VTQVJUMkNMS1NPVVJDRV9TWVNDTEspIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1VTQVJUMkNMS1NPVVJDRV9MU0UpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1VTQVJUMkNMS1NPVVJDRV9IU0kpKQorI2VuZGlmIC8qIFJDQ19DRkdSM19VU0FSVDJTVyAqLworI2lmIGRlZmluZWQoUkNDX0NGR1IzX1VTQVJUM1NXKQorI2RlZmluZSBJU19SQ0NfVVNBUlQzQ0xLU09VUkNFKF9fU09VUkNFX18pICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfVVNBUlQzQ0xLU09VUkNFX1BDTEsxKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfVVNBUlQzQ0xLU09VUkNFX1NZU0NMSykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfVVNBUlQzQ0xLU09VUkNFX0xTRSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfVVNBUlQzQ0xLU09VUkNFX0hTSSkpCisjZW5kaWYgLyogUkNDX0NGR1IzX1VTQVJUM1NXICovCisjZGVmaW5lIElTX1JDQ19JMkMxQ0xLU09VUkNFKF9fU09VUkNFX18pICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfSTJDMUNMS1NPVVJDRV9IU0kpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19JMkMxQ0xLU09VUkNFX1NZU0NMSykpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0V4cG9ydGVkX1R5cGVzIFJDQyBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKiAKKyAgKiBAYnJpZWYgIFJDQyBQTEwgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiAgCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQTExTdGF0ZTsgICAgICAvKiE8IFBMTFN0YXRlOiBUaGUgbmV3IHN0YXRlIG9mIHRoZSBQTEwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19QTExfQ29uZmlnICovCisKKyAgdWludDMyX3QgUExMU291cmNlOyAgICAgLyohPCBQTExTb3VyY2U6IFBMTCBlbnRyeSBjbG9jayBzb3VyY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfUExMX0Nsb2NrX1NvdXJjZSAqLyAgICAgICAgICAKKworICB1aW50MzJfdCBQTExNVUw7ICAgICAgICAvKiE8IFBMTE1VTDogTXVsdGlwbGljYXRpb24gZmFjdG9yIGZvciBQTEwgVkNPIGlucHV0IGNsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfUExMX011bHRpcGxpY2F0aW9uX0ZhY3RvciovCisKKyNpZiBkZWZpbmVkKFJDQ19DRkdSX1BMTFNSQ19IU0lfUFJFRElWKQorICB1aW50MzJfdCBQUkVESVY7ICAgICAgICAvKiE8IFBSRURJVjogUHJlZGl2aXNpb24gZmFjdG9yIGZvciBQTEwgVkNPIGlucHV0IGNsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfUExMX1ByZWRpdl9GYWN0b3IgKi8KKworI2VuZGlmCit9IFJDQ19QTExJbml0VHlwZURlZjsKKyAgIAorLyoqCisgICogQGJyaWVmICBSQ0MgSW50ZXJuYWwvRXh0ZXJuYWwgT3NjaWxsYXRvciAoSFNFLCBIU0ksIExTRSBhbmQgTFNJKSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uICAKKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IE9zY2lsbGF0b3JUeXBlOyAgICAgICAgLyohPCBUaGUgb3NjaWxsYXRvcnMgdG8gYmUgY29uZmlndXJlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX09zY2lsbGF0b3JfVHlwZSAqLworCisgIHVpbnQzMl90IEhTRVN0YXRlOyAgICAgICAgICAgICAgLyohPCBUaGUgbmV3IHN0YXRlIG9mIHRoZSBIU0UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19IU0VfQ29uZmlnICovCisKKyNpZiBkZWZpbmVkKFJDQ19DRkdSX1BMTFNSQ19IU0lfRElWMikKKyAgdWludDMyX3QgSFNFUHJlZGl2VmFsdWU7ICAgICAgIC8qITwgIFRoZSBIU0UgcHJlZGl2aXNpb24gZmFjdG9yIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfUExMX0hTRV9QcmVkaXZfRmFjdG9yICovCisKKyNlbmRpZiAvKiBSQ0NfQ0ZHUl9QTExTUkNfSFNJX0RJVjIgKi8KKyAgdWludDMyX3QgTFNFU3RhdGU7ICAgICAgICAgICAgICAvKiE8IFRoZSBuZXcgc3RhdGUgb2YgdGhlIExTRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0xTRV9Db25maWcgKi8KKworICB1aW50MzJfdCBIU0lTdGF0ZTsgICAgICAgICAgICAgIC8qITwgVGhlIG5ldyBzdGF0ZSBvZiB0aGUgSFNJLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfSFNJX0NvbmZpZyAqLworCisgIHVpbnQzMl90IEhTSUNhbGlicmF0aW9uVmFsdWU7ICAgLyohPCBUaGUgSFNJIGNhbGlicmF0aW9uIHRyaW1taW5nIHZhbHVlIChkZWZhdWx0IGlzIFJDQ19IU0lDQUxJQlJBVElPTl9ERUZBVUxUKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHgxRlUgKi8KKworICB1aW50MzJfdCBMU0lTdGF0ZTsgICAgICAgICAgICAgIC8qITwgVGhlIG5ldyBzdGF0ZSBvZiB0aGUgTFNJLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfTFNJX0NvbmZpZyAqLworCisgIFJDQ19QTExJbml0VHlwZURlZiBQTEw7ICAgICAgICAgLyohPCBQTEwgc3RydWN0dXJlIHBhcmFtZXRlcnMgKi8gICAgIAorCit9IFJDQ19Pc2NJbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBSQ0MgU3lzdGVtLCBBSEIgYW5kIEFQQiBidXNzZXMgY2xvY2sgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiAgCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBDbG9ja1R5cGU7ICAgICAgICAgICAgIC8qITwgVGhlIGNsb2NrIHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19TeXN0ZW1fQ2xvY2tfVHlwZSAqLworCisgIHVpbnQzMl90IFNZU0NMS1NvdXJjZTsgICAgICAgICAgLyohPCBUaGUgY2xvY2sgc291cmNlIChTWVNDTEtTKSB1c2VkIGFzIHN5c3RlbSBjbG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX1N5c3RlbV9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBBSEJDTEtEaXZpZGVyOyAgICAgICAgIC8qITwgVGhlIEFIQiBjbG9jayAoSENMSykgZGl2aWRlci4gVGhpcyBjbG9jayBpcyBkZXJpdmVkIGZyb20gdGhlIHN5c3RlbSBjbG9jayAoU1lTQ0xLKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0FIQl9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBBUEIxQ0xLRGl2aWRlcjsgICAgICAgIC8qITwgVGhlIEFQQjEgY2xvY2sgKFBDTEsxKSBkaXZpZGVyLiBUaGlzIGNsb2NrIGlzIGRlcml2ZWQgZnJvbSB0aGUgQUhCIGNsb2NrIChIQ0xLKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0FQQjFfQVBCMl9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBBUEIyQ0xLRGl2aWRlcjsgICAgICAgIC8qITwgVGhlIEFQQjIgY2xvY2sgKFBDTEsyKSBkaXZpZGVyLiBUaGlzIGNsb2NrIGlzIGRlcml2ZWQgZnJvbSB0aGUgQUhCIGNsb2NrIChIQ0xLKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0FQQjFfQVBCMl9DbG9ja19Tb3VyY2UgKi8KK30gUkNDX0Nsa0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSQ0NfRXhwb3J0ZWRfQ29uc3RhbnRzIFJDQyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19QTExfQ2xvY2tfU291cmNlIFBMTCBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUl9QTExTUkNfSFNJX1BSRURJVikKKyNkZWZpbmUgUkNDX1BMTFNPVVJDRV9IU0kgICAgICAgICAgIFJDQ19DRkdSX1BMTFNSQ19IU0lfUFJFRElWIC8qITwgSFNJIGNsb2NrIHNlbGVjdGVkIGFzIFBMTCBlbnRyeSBjbG9jayBzb3VyY2UgKi8KKyNlbmRpZiAvKiBSQ0NfQ0ZHUl9QTExTUkNfSFNJX1BSRURJViAqLworI2lmIGRlZmluZWQoUkNDX0NGR1JfUExMU1JDX0hTSV9ESVYyKQorI2RlZmluZSBSQ0NfUExMU09VUkNFX0hTSSAgICAgICAgICAgUkNDX0NGR1JfUExMU1JDX0hTSV9ESVYyICAgLyohPCBIU0kgY2xvY2sgZGl2aWRlZCBieSAyIHNlbGVjdGVkIGFzIFBMTCBlbnRyeSBjbG9jayBzb3VyY2UgKi8KKyNlbmRpZiAvKiBSQ0NfQ0ZHUl9QTExTUkNfSFNJX0RJVjIgKi8KKyNkZWZpbmUgUkNDX1BMTFNPVVJDRV9IU0UgICAgICAgICAgIFJDQ19DRkdSX1BMTFNSQ19IU0VfUFJFRElWIC8qITwgSFNFIGNsb2NrIHNlbGVjdGVkIGFzIFBMTCBlbnRyeSBjbG9jayBzb3VyY2UgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfT3NjaWxsYXRvcl9UeXBlIE9zY2lsbGF0b3IgVHlwZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19PU0NJTExBVE9SVFlQRV9OT05FICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNFICAgICAgICAgICAgICgweDAwMDAwMDAxVSkKKyNkZWZpbmUgUkNDX09TQ0lMTEFUT1JUWVBFX0hTSSAgICAgICAgICAgICAoMHgwMDAwMDAwMlUpCisjZGVmaW5lIFJDQ19PU0NJTExBVE9SVFlQRV9MU0UgICAgICAgICAgICAgKDB4MDAwMDAwMDRVKQorI2RlZmluZSBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNJICAgICAgICAgICAgICgweDAwMDAwMDA4VSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0hTRV9Db25maWcgSFNFIENvbmZpZworICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19IU0VfT0ZGICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAvKiE8IEhTRSBjbG9jayBkZWFjdGl2YXRpb24gKi8KKyNkZWZpbmUgUkNDX0hTRV9PTiAgICAgICAgICAgICAgICAgICAgICAgUkNDX0NSX0hTRU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSFNFIGNsb2NrIGFjdGl2YXRpb24gKi8KKyNkZWZpbmUgUkNDX0hTRV9CWVBBU1MgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoUkNDX0NSX0hTRUJZUCB8IFJDQ19DUl9IU0VPTikpIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIGZvciBIU0UgY2xvY2sgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xTRV9Db25maWcgTFNFIENvbmZpZworICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19MU0VfT0ZGICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTFNFIGNsb2NrIGRlYWN0aXZhdGlvbiAqLworI2RlZmluZSBSQ0NfTFNFX09OICAgICAgICAgICAgICAgICAgICAgICBSQ0NfQkRDUl9MU0VPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBMU0UgY2xvY2sgYWN0aXZhdGlvbiAqLworI2RlZmluZSBSQ0NfTFNFX0JZUEFTUyAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShSQ0NfQkRDUl9MU0VCWVAgfCBSQ0NfQkRDUl9MU0VPTikpIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIGZvciBMU0UgY2xvY2sgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfSFNJX0NvbmZpZyBIU0kgQ29uZmlnCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0hTSV9PRkYgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgLyohPCBIU0kgY2xvY2sgZGVhY3RpdmF0aW9uICovCisjZGVmaW5lIFJDQ19IU0lfT04gICAgICAgICAgICAgICAgICAgICAgIFJDQ19DUl9IU0lPTiAgICAgICAgICAgICAgICAgICAgIC8qITwgSFNJIGNsb2NrIGFjdGl2YXRpb24gKi8KKworI2RlZmluZSBSQ0NfSFNJQ0FMSUJSQVRJT05fREVGQVVMVCAgICAgICAoMHgxMFUpICAgICAgICAgLyogRGVmYXVsdCBIU0kgY2FsaWJyYXRpb24gdHJpbW1pbmcgdmFsdWUgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTFNJX0NvbmZpZyBMU0kgQ29uZmlnCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0xTSV9PRkYgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgIC8qITwgTFNJIGNsb2NrIGRlYWN0aXZhdGlvbiAqLworI2RlZmluZSBSQ0NfTFNJX09OICAgICAgICAgICAgICAgICAgICAgICBSQ0NfQ1NSX0xTSU9OICAgICAgICAgICAgLyohPCBMU0kgY2xvY2sgYWN0aXZhdGlvbiAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19QTExfQ29uZmlnIFBMTCBDb25maWcKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfUExMX05PTkUgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgLyohPCBQTEwgaXMgbm90IGNvbmZpZ3VyZWQgKi8KKyNkZWZpbmUgUkNDX1BMTF9PRkYgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxVSkgIC8qITwgUExMIGRlYWN0aXZhdGlvbiAqLworI2RlZmluZSBSQ0NfUExMX09OICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDJVKSAgLyohPCBQTEwgYWN0aXZhdGlvbiAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19TeXN0ZW1fQ2xvY2tfVHlwZSBTeXN0ZW0gQ2xvY2sgVHlwZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19DTE9DS1RZUEVfU1lTQ0xLICAgICAgICAgICAgICgweDAwMDAwMDAxVSkgLyohPCBTWVNDTEsgdG8gY29uZmlndXJlICovCisjZGVmaW5lIFJDQ19DTE9DS1RZUEVfSENMSyAgICAgICAgICAgICAgICgweDAwMDAwMDAyVSkgLyohPCBIQ0xLIHRvIGNvbmZpZ3VyZSAqLworI2RlZmluZSBSQ0NfQ0xPQ0tUWVBFX1BDTEsxICAgICAgICAgICAgICAoMHgwMDAwMDAwNFUpIC8qITwgUENMSzEgdG8gY29uZmlndXJlICovCisjZGVmaW5lIFJDQ19DTE9DS1RZUEVfUENMSzIgICAgICAgICAgICAgICgweDAwMDAwMDA4VSkgLyohPCBQQ0xLMiB0byBjb25maWd1cmUgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfU3lzdGVtX0Nsb2NrX1NvdXJjZSBTeXN0ZW0gQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX1NZU0NMS1NPVVJDRV9IU0kgICAgICAgICAgICAgUkNDX0NGR1JfU1dfSFNJIC8qITwgSFNJIHNlbGVjdGVkIGFzIHN5c3RlbSBjbG9jayAqLworI2RlZmluZSBSQ0NfU1lTQ0xLU09VUkNFX0hTRSAgICAgICAgICAgICBSQ0NfQ0ZHUl9TV19IU0UgLyohPCBIU0Ugc2VsZWN0ZWQgYXMgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIFJDQ19TWVNDTEtTT1VSQ0VfUExMQ0xLICAgICAgICAgIFJDQ19DRkdSX1NXX1BMTCAvKiE8IFBMTCBzZWxlY3RlZCBhcyBzeXN0ZW0gY2xvY2sgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfU3lzdGVtX0Nsb2NrX1NvdXJjZV9TdGF0dXMgU3lzdGVtIENsb2NrIFNvdXJjZSBTdGF0dXMKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19IU0kgICAgICBSQ0NfQ0ZHUl9TV1NfSFNJICAgICAgICAgICAgLyohPCBIU0kgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgKi8KKyNkZWZpbmUgUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfSFNFICAgICAgUkNDX0NGR1JfU1dTX0hTRSAgICAgICAgICAgIC8qITwgSFNFIHVzZWQgYXMgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX1BMTENMSyAgIFJDQ19DRkdSX1NXU19QTEwgICAgICAgICAgICAvKiE8IFBMTCB1c2VkIGFzIHN5c3RlbSBjbG9jayAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BSEJfQ2xvY2tfU291cmNlIEFIQiBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfU1lTQ0xLX0RJVjEgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9IUFJFX0RJVjEgICAvKiE8IFNZU0NMSyBub3QgZGl2aWRlZCAqLworI2RlZmluZSBSQ0NfU1lTQ0xLX0RJVjIgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9IUFJFX0RJVjIgICAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgUkNDX1NZU0NMS19ESVY0ICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfSFBSRV9ESVY0ICAgLyohPCBTWVNDTEsgZGl2aWRlZCBieSA0ICovCisjZGVmaW5lIFJDQ19TWVNDTEtfRElWOCAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX0hQUkVfRElWOCAgIC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgOCAqLworI2RlZmluZSBSQ0NfU1lTQ0xLX0RJVjE2ICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9IUFJFX0RJVjE2ICAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDE2ICovCisjZGVmaW5lIFJDQ19TWVNDTEtfRElWNjQgICAgICAgICAgICAgICAgIFJDQ19DRkdSX0hQUkVfRElWNjQgIC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgNjQgKi8KKyNkZWZpbmUgUkNDX1NZU0NMS19ESVYxMjggICAgICAgICAgICAgICAgUkNDX0NGR1JfSFBSRV9ESVYxMjggLyohPCBTWVNDTEsgZGl2aWRlZCBieSAxMjggKi8KKyNkZWZpbmUgUkNDX1NZU0NMS19ESVYyNTYgICAgICAgICAgICAgICAgUkNDX0NGR1JfSFBSRV9ESVYyNTYgLyohPCBTWVNDTEsgZGl2aWRlZCBieSAyNTYgKi8KKyNkZWZpbmUgUkNDX1NZU0NMS19ESVY1MTIgICAgICAgICAgICAgICAgUkNDX0NGR1JfSFBSRV9ESVY1MTIgLyohPCBTWVNDTEsgZGl2aWRlZCBieSA1MTIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIFJDQ19BUEIxX0FQQjJfQ2xvY2tfU291cmNlIEFQQjEgQVBCMiBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfSENMS19ESVYxICAgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9QUFJFMV9ESVYxICAvKiE8IEhDTEsgbm90IGRpdmlkZWQgKi8KKyNkZWZpbmUgUkNDX0hDTEtfRElWMiAgICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUFBSRTFfRElWMiAgLyohPCBIQ0xLIGRpdmlkZWQgYnkgMiAqLworI2RlZmluZSBSQ0NfSENMS19ESVY0ICAgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9QUFJFMV9ESVY0ICAvKiE8IEhDTEsgZGl2aWRlZCBieSA0ICovCisjZGVmaW5lIFJDQ19IQ0xLX0RJVjggICAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BQUkUxX0RJVjggIC8qITwgSENMSyBkaXZpZGVkIGJ5IDggKi8KKyNkZWZpbmUgUkNDX0hDTEtfRElWMTYgICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUFBSRTFfRElWMTYgLyohPCBIQ0xLIGRpdmlkZWQgYnkgMTYgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfUlRDX0Nsb2NrX1NvdXJjZSBSVEMgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX1JUQ0NMS1NPVVJDRV9OT19DTEsgICAgICAgICAgUkNDX0JEQ1JfUlRDU0VMX05PQ0xPQ0sgICAgICAgICAgICAgICAgLyohPCBObyBjbG9jayAqLworI2RlZmluZSBSQ0NfUlRDQ0xLU09VUkNFX0xTRSAgICAgICAgICAgICBSQ0NfQkRDUl9SVENTRUxfTFNFICAgICAgICAgICAgICAgICAgLyohPCBMU0Ugb3NjaWxsYXRvciBjbG9jayB1c2VkIGFzIFJUQyBjbG9jayAqLworI2RlZmluZSBSQ0NfUlRDQ0xLU09VUkNFX0xTSSAgICAgICAgICAgICBSQ0NfQkRDUl9SVENTRUxfTFNJICAgICAgICAgICAgICAgICAgLyohPCBMU0kgb3NjaWxsYXRvciBjbG9jayB1c2VkIGFzIFJUQyBjbG9jayAqLworI2RlZmluZSBSQ0NfUlRDQ0xLU09VUkNFX0hTRV9ESVYzMiAgICAgICBSQ0NfQkRDUl9SVENTRUxfSFNFICAgICAgICAgICAgICAgICAgICAvKiE8IEhTRSBvc2NpbGxhdG9yIGNsb2NrIGRpdmlkZWQgYnkgMzIgdXNlZCBhcyBSVEMgY2xvY2sgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX1BMTF9NdWx0aXBsaWNhdGlvbl9GYWN0b3IgUkNDIFBMTCBNdWx0aXBsaWNhdGlvbiBGYWN0b3IKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfUExMX01VTDIgICAgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9QTExNVUwyCisjZGVmaW5lIFJDQ19QTExfTVVMMyAgICAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BMTE1VTDMKKyNkZWZpbmUgUkNDX1BMTF9NVUw0ICAgICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUExMTVVMNAorI2RlZmluZSBSQ0NfUExMX01VTDUgICAgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9QTExNVUw1CisjZGVmaW5lIFJDQ19QTExfTVVMNiAgICAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BMTE1VTDYKKyNkZWZpbmUgUkNDX1BMTF9NVUw3ICAgICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUExMTVVMNworI2RlZmluZSBSQ0NfUExMX01VTDggICAgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9QTExNVUw4CisjZGVmaW5lIFJDQ19QTExfTVVMOSAgICAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BMTE1VTDkKKyNkZWZpbmUgUkNDX1BMTF9NVUwxMCAgICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUExMTVVMMTAKKyNkZWZpbmUgUkNDX1BMTF9NVUwxMSAgICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUExMTVVMMTEKKyNkZWZpbmUgUkNDX1BMTF9NVUwxMiAgICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUExMTVVMMTIKKyNkZWZpbmUgUkNDX1BMTF9NVUwxMyAgICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUExMTVVMMTMKKyNkZWZpbmUgUkNDX1BMTF9NVUwxNCAgICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUExMTVVMMTQKKyNkZWZpbmUgUkNDX1BMTF9NVUwxNSAgICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUExMTVVMMTUKKyNkZWZpbmUgUkNDX1BMTF9NVUwxNiAgICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUExMTVVMMTYKKworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoUkNDX0NGR1JfUExMU1JDX0hTSV9QUkVESVYpCisvKiogQGRlZmdyb3VwIFJDQ19QTExfUHJlZGl2X0ZhY3RvciBSQ0MgUExMIFByZWRpdiBGYWN0b3IKKyAgKiBAeworICAqLworCisjZGVmaW5lIFJDQ19QUkVESVZfRElWMSAgICAgICAgICAgICAgICAgIFJDQ19DRkdSMl9QUkVESVZfRElWMQorI2RlZmluZSBSQ0NfUFJFRElWX0RJVjIgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUjJfUFJFRElWX0RJVjIKKyNkZWZpbmUgUkNDX1BSRURJVl9ESVYzICAgICAgICAgICAgICAgICAgUkNDX0NGR1IyX1BSRURJVl9ESVYzCisjZGVmaW5lIFJDQ19QUkVESVZfRElWNCAgICAgICAgICAgICAgICAgIFJDQ19DRkdSMl9QUkVESVZfRElWNAorI2RlZmluZSBSQ0NfUFJFRElWX0RJVjUgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUjJfUFJFRElWX0RJVjUKKyNkZWZpbmUgUkNDX1BSRURJVl9ESVY2ICAgICAgICAgICAgICAgICAgUkNDX0NGR1IyX1BSRURJVl9ESVY2CisjZGVmaW5lIFJDQ19QUkVESVZfRElWNyAgICAgICAgICAgICAgICAgIFJDQ19DRkdSMl9QUkVESVZfRElWNworI2RlZmluZSBSQ0NfUFJFRElWX0RJVjggICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUjJfUFJFRElWX0RJVjgKKyNkZWZpbmUgUkNDX1BSRURJVl9ESVY5ICAgICAgICAgICAgICAgICAgUkNDX0NGR1IyX1BSRURJVl9ESVY5CisjZGVmaW5lIFJDQ19QUkVESVZfRElWMTAgICAgICAgICAgICAgICAgIFJDQ19DRkdSMl9QUkVESVZfRElWMTAKKyNkZWZpbmUgUkNDX1BSRURJVl9ESVYxMSAgICAgICAgICAgICAgICAgUkNDX0NGR1IyX1BSRURJVl9ESVYxMQorI2RlZmluZSBSQ0NfUFJFRElWX0RJVjEyICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUjJfUFJFRElWX0RJVjEyCisjZGVmaW5lIFJDQ19QUkVESVZfRElWMTMgICAgICAgICAgICAgICAgIFJDQ19DRkdSMl9QUkVESVZfRElWMTMKKyNkZWZpbmUgUkNDX1BSRURJVl9ESVYxNCAgICAgICAgICAgICAgICAgUkNDX0NGR1IyX1BSRURJVl9ESVYxNAorI2RlZmluZSBSQ0NfUFJFRElWX0RJVjE1ICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUjJfUFJFRElWX0RJVjE1CisjZGVmaW5lIFJDQ19QUkVESVZfRElWMTYgICAgICAgICAgICAgICAgIFJDQ19DRkdSMl9QUkVESVZfRElWMTYKKworLyoqCisgICogQH0KKyAgKi8KKyAgCisjZW5kaWYKKyNpZiBkZWZpbmVkKFJDQ19DRkdSX1BMTFNSQ19IU0lfRElWMikKKy8qKiBAZGVmZ3JvdXAgUkNDX1BMTF9IU0VfUHJlZGl2X0ZhY3RvciBSQ0MgUExMIEhTRSBQcmVkaXYgRmFjdG9yCisgICogQHsKKyAgKi8KKworI2RlZmluZSBSQ0NfSFNFX1BSRURJVl9ESVYxICAgICAgICAgICAgICBSQ0NfQ0ZHUjJfUFJFRElWX0RJVjEKKyNkZWZpbmUgUkNDX0hTRV9QUkVESVZfRElWMiAgICAgICAgICAgICAgUkNDX0NGR1IyX1BSRURJVl9ESVYyCisjZGVmaW5lIFJDQ19IU0VfUFJFRElWX0RJVjMgICAgICAgICAgICAgIFJDQ19DRkdSMl9QUkVESVZfRElWMworI2RlZmluZSBSQ0NfSFNFX1BSRURJVl9ESVY0ICAgICAgICAgICAgICBSQ0NfQ0ZHUjJfUFJFRElWX0RJVjQKKyNkZWZpbmUgUkNDX0hTRV9QUkVESVZfRElWNSAgICAgICAgICAgICAgUkNDX0NGR1IyX1BSRURJVl9ESVY1CisjZGVmaW5lIFJDQ19IU0VfUFJFRElWX0RJVjYgICAgICAgICAgICAgIFJDQ19DRkdSMl9QUkVESVZfRElWNgorI2RlZmluZSBSQ0NfSFNFX1BSRURJVl9ESVY3ICAgICAgICAgICAgICBSQ0NfQ0ZHUjJfUFJFRElWX0RJVjcKKyNkZWZpbmUgUkNDX0hTRV9QUkVESVZfRElWOCAgICAgICAgICAgICAgUkNDX0NGR1IyX1BSRURJVl9ESVY4CisjZGVmaW5lIFJDQ19IU0VfUFJFRElWX0RJVjkgICAgICAgICAgICAgIFJDQ19DRkdSMl9QUkVESVZfRElWOQorI2RlZmluZSBSQ0NfSFNFX1BSRURJVl9ESVYxMCAgICAgICAgICAgICBSQ0NfQ0ZHUjJfUFJFRElWX0RJVjEwCisjZGVmaW5lIFJDQ19IU0VfUFJFRElWX0RJVjExICAgICAgICAgICAgIFJDQ19DRkdSMl9QUkVESVZfRElWMTEKKyNkZWZpbmUgUkNDX0hTRV9QUkVESVZfRElWMTIgICAgICAgICAgICAgUkNDX0NGR1IyX1BSRURJVl9ESVYxMgorI2RlZmluZSBSQ0NfSFNFX1BSRURJVl9ESVYxMyAgICAgICAgICAgICBSQ0NfQ0ZHUjJfUFJFRElWX0RJVjEzCisjZGVmaW5lIFJDQ19IU0VfUFJFRElWX0RJVjE0ICAgICAgICAgICAgIFJDQ19DRkdSMl9QUkVESVZfRElWMTQKKyNkZWZpbmUgUkNDX0hTRV9QUkVESVZfRElWMTUgICAgICAgICAgICAgUkNDX0NGR1IyX1BSRURJVl9ESVYxNQorI2RlZmluZSBSQ0NfSFNFX1BSRURJVl9ESVYxNiAgICAgICAgICAgICBSQ0NfQ0ZHUjJfUFJFRElWX0RJVjE2CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogUkNDX0NGR1JfUExMU1JDX0hTSV9ESVYyICovCisKKyNpZiBkZWZpbmVkKFJDQ19DRkdSM19VU0FSVDJTVykKKy8qKiBAZGVmZ3JvdXAgUkNDX1VTQVJUMl9DbG9ja19Tb3VyY2UgUkNDIFVTQVJUMiBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfVVNBUlQyQ0xLU09VUkNFX1BDTEsxICAgICAgICBSQ0NfQ0ZHUjNfVVNBUlQyU1dfUENMSworI2RlZmluZSBSQ0NfVVNBUlQyQ0xLU09VUkNFX1NZU0NMSyAgICAgICBSQ0NfQ0ZHUjNfVVNBUlQyU1dfU1lTQ0xLCisjZGVmaW5lIFJDQ19VU0FSVDJDTEtTT1VSQ0VfTFNFICAgICAgICAgIFJDQ19DRkdSM19VU0FSVDJTV19MU0UKKyNkZWZpbmUgUkNDX1VTQVJUMkNMS1NPVVJDRV9IU0kgICAgICAgICAgUkNDX0NGR1IzX1VTQVJUMlNXX0hTSQorCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFJDQ19DRkdSM19VU0FSVDJTVyAqLworCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfVVNBUlQzU1cpCisvKiogQGRlZmdyb3VwIFJDQ19VU0FSVDNfQ2xvY2tfU291cmNlIFJDQyBVU0FSVDMgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX1VTQVJUM0NMS1NPVVJDRV9QQ0xLMSAgICAgICAgUkNDX0NGR1IzX1VTQVJUM1NXX1BDTEsKKyNkZWZpbmUgUkNDX1VTQVJUM0NMS1NPVVJDRV9TWVNDTEsgICAgICAgUkNDX0NGR1IzX1VTQVJUM1NXX1NZU0NMSworI2RlZmluZSBSQ0NfVVNBUlQzQ0xLU09VUkNFX0xTRSAgICAgICAgICBSQ0NfQ0ZHUjNfVVNBUlQzU1dfTFNFCisjZGVmaW5lIFJDQ19VU0FSVDNDTEtTT1VSQ0VfSFNJICAgICAgICAgIFJDQ19DRkdSM19VU0FSVDNTV19IU0kKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBSQ0NfQ0ZHUjNfVVNBUlQzU1cgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfSTJDMV9DbG9ja19Tb3VyY2UgUkNDIEkyQzEgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0kyQzFDTEtTT1VSQ0VfSFNJICAgICAgICAgICAgUkNDX0NGR1IzX0kyQzFTV19IU0kKKyNkZWZpbmUgUkNDX0kyQzFDTEtTT1VSQ0VfU1lTQ0xLICAgICAgICAgUkNDX0NGR1IzX0kyQzFTV19TWVNDTEsKKworLyoqCisgICogQH0KKyAgKi8KKy8qKiBAZGVmZ3JvdXAgUkNDX01DT19JbmRleCBNQ08gSW5kZXgKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfTUNPMSAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFJDQ19NQ08gICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19NQ08xICAgICAgICAgICAgICAgLyohPCBNQ08xIHRvIGJlIGNvbXBsaWFudCB3aXRoIG90aGVyIGZhbWlsaWVzIHdpdGggMiBNQ09zKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfSW50ZXJydXB0IEludGVycnVwdHMKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfSVRfTFNJUkRZICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpUkNDX0NJUl9MU0lSRFlGKSAgIC8qITwgTFNJIFJlYWR5IEludGVycnVwdCBmbGFnICovCisjZGVmaW5lIFJDQ19JVF9MU0VSRFkgICAgICAgICAgICAgICAgICAgICgodWludDhfdClSQ0NfQ0lSX0xTRVJEWUYpICAgLyohPCBMU0UgUmVhZHkgSW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0lUX0hTSVJEWSAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KVJDQ19DSVJfSFNJUkRZRikgICAvKiE8IEhTSSBSZWFkeSBJbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBSQ0NfSVRfSFNFUkRZICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpUkNDX0NJUl9IU0VSRFlGKSAgIC8qITwgSFNFIFJlYWR5IEludGVycnVwdCBmbGFnICovCisjZGVmaW5lIFJDQ19JVF9QTExSRFkgICAgICAgICAgICAgICAgICAgICgodWludDhfdClSQ0NfQ0lSX1BMTFJEWUYpICAgLyohPCBQTEwgUmVhZHkgSW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0lUX0NTUyAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KVJDQ19DSVJfQ1NTRikgICAgICAvKiE8IENsb2NrIFNlY3VyaXR5IFN5c3RlbSBJbnRlcnJ1cHQgZmxhZyAqLworLyoqCisgICogQH0KKyAgKi8gCisgIAorLyoqIEBkZWZncm91cCBSQ0NfRmxhZyBGbGFncworICAqICAgICAgICBFbGVtZW50cyB2YWx1ZXMgY29udmVudGlvbjogWFhYWVlZWVliCisgICogICAgICAgICAgIC0gWVlZWVkgIDogRmxhZyBwb3NpdGlvbiBpbiB0aGUgcmVnaXN0ZXIKKyAgKiAgICAgICAgICAgLSBYWFggIDogUmVnaXN0ZXIgaW5kZXgKKyAgKiAgICAgICAgICAgICAgICAgLSAwMDE6IENSIHJlZ2lzdGVyCisgICogICAgICAgICAgICAgICAgIC0gMDEwOiBCRENSIHJlZ2lzdGVyCisgICogICAgICAgICAgICAgICAgIC0gMDExOiBDU1IgcmVnaXN0ZXIKKyAgKiAgICAgICAgICAgICAgICAgLSAxMDA6IENGR1IgcmVnaXN0ZXIKKyAgKiBAeworICAqLworLyogRmxhZ3MgaW4gdGhlIENSIHJlZ2lzdGVyICovCisjZGVmaW5lIFJDQ19GTEFHX0hTSVJEWSAgICAgICAgICAgICAgICAgICgodWludDhfdCkoKENSX1JFR19JTkRFWCA8PCA1VSkgfCBQT1NJVElPTl9WQUwoUkNDX0NSX0hTSVJEWSkpKSAvKiE8IEludGVybmFsIEhpZ2ggU3BlZWQgY2xvY2sgcmVhZHkgZmxhZyAqLworI2RlZmluZSBSQ0NfRkxBR19IU0VSRFkgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpKChDUl9SRUdfSU5ERVggPDwgNVUpIHwgUE9TSVRJT05fVkFMKFJDQ19DUl9IU0VSRFkpKSkgLyohPCBFeHRlcm5hbCBIaWdoIFNwZWVkIGNsb2NrIHJlYWR5IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0ZMQUdfUExMUkRZICAgICAgICAgICAgICAgICAgKCh1aW50OF90KSgoQ1JfUkVHX0lOREVYIDw8IDVVKSB8IFBPU0lUSU9OX1ZBTChSQ0NfQ1JfUExMUkRZKSkpIC8qITwgUExMIGNsb2NrIHJlYWR5IGZsYWcgKi8KKworLyogRmxhZ3MgaW4gdGhlIENTUiByZWdpc3RlciAqLworI2RlZmluZSBSQ0NfRkxBR19MU0lSRFkgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpKChDU1JfUkVHX0lOREVYIDw8IDVVKSB8IFBPU0lUSU9OX1ZBTChSQ0NfQ1NSX0xTSVJEWSkpKSAgIC8qITwgSW50ZXJuYWwgTG93IFNwZWVkIG9zY2lsbGF0b3IgUmVhZHkgKi8KKyNpZiAgIGRlZmluZWQoUkNDX0NTUl9WMThQV1JSU1RGKQorI2RlZmluZSBSQ0NfRkxBR19WMThQV1JSU1QgICAgICAgICAgICAgICAoKHVpbnQ4X3QpKChDU1JfUkVHX0lOREVYIDw8IDVVKSB8IFBPU0lUSU9OX1ZBTChSQ0NfQ1NSX1YxOFBXUlJTVEYpKSkKKyNlbmRpZgorI2RlZmluZSBSQ0NfRkxBR19PQkxSU1QgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpKChDU1JfUkVHX0lOREVYIDw8IDVVKSB8IFBPU0lUSU9OX1ZBTChSQ0NfQ1NSX09CTFJTVEYpKSkgIC8qITwgT3B0aW9ucyBieXRlcyBsb2FkaW5nIHJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0ZMQUdfUElOUlNUICAgICAgICAgICAgICAgICAgKCh1aW50OF90KSgoQ1NSX1JFR19JTkRFWCA8PCA1VSkgfCBQT1NJVElPTl9WQUwoUkNDX0NTUl9QSU5SU1RGKSkpICAvKiE8IFBJTiByZXNldCBmbGFnICovCisjZGVmaW5lIFJDQ19GTEFHX1BPUlJTVCAgICAgICAgICAgICAgICAgICgodWludDhfdCkoKENTUl9SRUdfSU5ERVggPDwgNVUpIHwgUE9TSVRJT05fVkFMKFJDQ19DU1JfUE9SUlNURikpKSAgLyohPCBQT1IvUERSIHJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0ZMQUdfU0ZUUlNUICAgICAgICAgICAgICAgICAgKCh1aW50OF90KSgoQ1NSX1JFR19JTkRFWCA8PCA1VSkgfCBQT1NJVElPTl9WQUwoUkNDX0NTUl9TRlRSU1RGKSkpICAvKiE8IFNvZnR3YXJlIFJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0ZMQUdfSVdER1JTVCAgICAgICAgICAgICAgICAgKCh1aW50OF90KSgoQ1NSX1JFR19JTkRFWCA8PCA1VSkgfCBQT1NJVElPTl9WQUwoUkNDX0NTUl9JV0RHUlNURikpKSAvKiE8IEluZGVwZW5kZW50IFdhdGNoZG9nIHJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0ZMQUdfV1dER1JTVCAgICAgICAgICAgICAgICAgKCh1aW50OF90KSgoQ1NSX1JFR19JTkRFWCA8PCA1VSkgfCBQT1NJVElPTl9WQUwoUkNDX0NTUl9XV0RHUlNURikpKSAvKiE8IFdpbmRvdyB3YXRjaGRvZyByZXNldCBmbGFnICovCisjZGVmaW5lIFJDQ19GTEFHX0xQV1JSU1QgICAgICAgICAgICAgICAgICgodWludDhfdCkoKENTUl9SRUdfSU5ERVggPDwgNVUpIHwgUE9TSVRJT05fVkFMKFJDQ19DU1JfTFBXUlJTVEYpKSkgLyohPCBMb3ctUG93ZXIgcmVzZXQgZmxhZyAqLworCisvKiBGbGFncyBpbiB0aGUgQkRDUiByZWdpc3RlciAqLworI2RlZmluZSBSQ0NfRkxBR19MU0VSRFkgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpKChCRENSX1JFR19JTkRFWCA8PCA1VSkgfCBQT1NJVElPTl9WQUwoUkNDX0JEQ1JfTFNFUkRZKSkpIC8qITwgRXh0ZXJuYWwgTG93IFNwZWVkIG9zY2lsbGF0b3IgUmVhZHkgKi8KKworLyogRmxhZ3MgaW4gdGhlIENGR1IgcmVnaXN0ZXIgKi8KKyNpZiBkZWZpbmVkKFJDQ19DRkdSX01DT0YpCisjZGVmaW5lIFJDQ19GTEFHX01DTyAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkoKENGR1JfUkVHX0lOREVYIDw8IDVVKSB8IFBPU0lUSU9OX1ZBTChSQ0NfQ0ZHUl9NQ09GKSkpICAgLyohPCBNaWNyb2NvbnRyb2xsZXIgQ2xvY2sgT3V0cHV0IEZsYWcgKi8KKyNlbmRpZiAvKiBSQ0NfQ0ZHUl9NQ09GICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0V4cG9ydGVkX01hY3JvcyBSQ0MgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQUhCX0Nsb2NrX0VuYWJsZV9EaXNhYmxlIFJDQyBBSEIgQ2xvY2sgRW5hYmxlIERpc2FibGUKKyAgKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBBSEIgcGVyaXBoZXJhbCBjbG9jay4KKyAgKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgcGVyaXBoZXJhbCBjbG9jayAodXNlZCBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGUgYWNjZXNzKQorICAqICAgICAgICAgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sgYmVmb3JlCisgICogICAgICAgICB1c2luZyBpdC4KKyAgKiBAeyAgCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQV9DTEtfRU5BQkxFKCkgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfR1BJT0FFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9HUElPQUVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9CX0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9HUElPQkVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX0dQSU9CRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0NfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX0dQSU9DRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfR1BJT0NFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRF9DTEtfRU5BQkxFKCkgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfR1BJT0RFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9HUElPREVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9GX0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9HUElPRkVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX0dQSU9GRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfQ1JDX0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9DUkNFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9DUkNFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19ETUExX0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9ETUExRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfRE1BMUVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKyNkZWZpbmUgX19IQUxfUkNDX1NSQU1fQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX1NSQU1FTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9TUkFNRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfRkxJVEZfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX0ZMSVRGRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfRkxJVEZFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19UU0NfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX1RTQ0VOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX1RTQ0VOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0FfQ0xLX0RJU0FCTEUoKSAgICAgICAgKFJDQy0+QUhCRU5SICY9IH4oUkNDX0FIQkVOUl9HUElPQUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9CX0NMS19ESVNBQkxFKCkgICAgICAgIChSQ0MtPkFIQkVOUiAmPSB+KFJDQ19BSEJFTlJfR1BJT0JFTikpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQ19DTEtfRElTQUJMRSgpICAgICAgICAoUkNDLT5BSEJFTlIgJj0gfihSQ0NfQUhCRU5SX0dQSU9DRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0RfQ0xLX0RJU0FCTEUoKSAgICAgICAgKFJDQy0+QUhCRU5SICY9IH4oUkNDX0FIQkVOUl9HUElPREVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9GX0NMS19ESVNBQkxFKCkgICAgICAgIChSQ0MtPkFIQkVOUiAmPSB+KFJDQ19BSEJFTlJfR1BJT0ZFTikpCisjZGVmaW5lIF9fSEFMX1JDQ19DUkNfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAoUkNDLT5BSEJFTlIgJj0gfihSQ0NfQUhCRU5SX0NSQ0VOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0RNQTFfQ0xLX0RJU0FCTEUoKSAgICAgICAgIChSQ0MtPkFIQkVOUiAmPSB+KFJDQ19BSEJFTlJfRE1BMUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1NSQU1fQ0xLX0RJU0FCTEUoKSAgICAgICAgIChSQ0MtPkFIQkVOUiAmPSB+KFJDQ19BSEJFTlJfU1JBTUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0ZMSVRGX0NMS19ESVNBQkxFKCkgICAgICAgIChSQ0MtPkFIQkVOUiAmPSB+KFJDQ19BSEJFTlJfRkxJVEZFTikpCisjZGVmaW5lIF9fSEFMX1JDQ19UU0NfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAoUkNDLT5BSEJFTlIgJj0gfihSQ0NfQUhCRU5SX1RTQ0VOKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FQQjFfQ2xvY2tfRW5hYmxlX0Rpc2FibGUgUkNDIEFQQjEgQ2xvY2sgRW5hYmxlIERpc2FibGUKKyAgKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBMb3cgU3BlZWQgQVBCIChBUEIxKSBwZXJpcGhlcmFsIGNsb2NrLgorICAqIEBub3RlICAgQWZ0ZXIgcmVzZXQsIHRoZSBwZXJpcGhlcmFsIGNsb2NrICh1c2VkIGZvciByZWdpc3RlcnMgcmVhZC93cml0ZSBhY2Nlc3MpCisgICogICAgICAgICBpcyBkaXNhYmxlZCBhbmQgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIGhhcyB0byBlbmFibGUgdGhpcyBjbG9jayBiZWZvcmUKKyAgKiAgICAgICAgIHVzaW5nIGl0LgorICAqIEB7ICAgCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yX0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1RJTTJFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1RJTTJFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19USU02X0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1RJTTZFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1RJTTZFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19XV0RHX0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1dXREdFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1dXREdFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDJfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfVVNBUlQyRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9VU0FSVDJFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDNfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfVVNBUlQzRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9VU0FSVDNFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMxX0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX0kyQzFFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX0kyQzFFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19QV1JfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfUFdSRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9QV1JFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19EQUMxX0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX0RBQzFFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX0RBQzFFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTJfQ0xLX0RJU0FCTEUoKSAgIChSQ0MtPkFQQjFFTlIgJj0gfihSQ0NfQVBCMUVOUl9USU0yRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNNl9DTEtfRElTQUJMRSgpICAgKFJDQy0+QVBCMUVOUiAmPSB+KFJDQ19BUEIxRU5SX1RJTTZFTikpCisjZGVmaW5lIF9fSEFMX1JDQ19XV0RHX0NMS19ESVNBQkxFKCkgICAoUkNDLT5BUEIxRU5SICY9IH4oUkNDX0FQQjFFTlJfV1dER0VOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMl9DTEtfRElTQUJMRSgpIChSQ0MtPkFQQjFFTlIgJj0gfihSQ0NfQVBCMUVOUl9VU0FSVDJFTikpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDNfQ0xLX0RJU0FCTEUoKSAoUkNDLT5BUEIxRU5SICY9IH4oUkNDX0FQQjFFTlJfVVNBUlQzRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMV9DTEtfRElTQUJMRSgpICAgKFJDQy0+QVBCMUVOUiAmPSB+KFJDQ19BUEIxRU5SX0kyQzFFTikpCisjZGVmaW5lIF9fSEFMX1JDQ19QV1JfQ0xLX0RJU0FCTEUoKSAgICAoUkNDLT5BUEIxRU5SICY9IH4oUkNDX0FQQjFFTlJfUFdSRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfREFDMV9DTEtfRElTQUJMRSgpICAgKFJDQy0+QVBCMUVOUiAmPSB+KFJDQ19BUEIxRU5SX0RBQzFFTikpCisvKioKKyAgKiBAfQorICAqLworICAKKy8qKiBAZGVmZ3JvdXAgUkNDX0FQQjJfQ2xvY2tfRW5hYmxlX0Rpc2FibGUgUkNDIEFQQjIgQ2xvY2sgRW5hYmxlIERpc2FibGUKKyAgKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBIaWdoIFNwZWVkIEFQQiAoQVBCMikgcGVyaXBoZXJhbCBjbG9jay4KKyAgKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgcGVyaXBoZXJhbCBjbG9jayAodXNlZCBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGUgYWNjZXNzKQorICAqICAgICAgICAgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sgYmVmb3JlCisgICogICAgICAgICB1c2luZyBpdC4KKyAgKiBAeyAgIAorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfU1lTQ0ZHX0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1NZU0NGR0VOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfU1lTQ0ZHRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTVfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMTVFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1RJTTE1RU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTZfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMTZFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1RJTTE2RU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTdfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMTdFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1RJTTE3RU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQxX0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1VTQVJUMUVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVVNBUlQxRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19TWVNDRkdfQ0xLX0RJU0FCTEUoKSAoUkNDLT5BUEIyRU5SICY9IH4oUkNDX0FQQjJFTlJfU1lTQ0ZHRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTVfQ0xLX0RJU0FCTEUoKSAgKFJDQy0+QVBCMkVOUiAmPSB+KFJDQ19BUEIyRU5SX1RJTTE1RU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTZfQ0xLX0RJU0FCTEUoKSAgKFJDQy0+QVBCMkVOUiAmPSB+KFJDQ19BUEIyRU5SX1RJTTE2RU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTdfQ0xLX0RJU0FCTEUoKSAgKFJDQy0+QVBCMkVOUiAmPSB+KFJDQ19BUEIyRU5SX1RJTTE3RU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQxX0NMS19ESVNBQkxFKCkgKFJDQy0+QVBCMkVOUiAmPSB+KFJDQ19BUEIyRU5SX1VTQVJUMUVOKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FIQl9QZXJpcGhlcmFsX0Nsb2NrX0VuYWJsZV9EaXNhYmxlX1N0YXR1cyBBSEIgUGVyaXBoZXJhbCBDbG9jayBFbmFibGUgRGlzYWJsZSBTdGF0dXMKKyAgKiBAYnJpZWYgIEdldCB0aGUgZW5hYmxlIG9yIGRpc2FibGUgc3RhdHVzIG9mIHRoZSBBSEIgcGVyaXBoZXJhbCBjbG9jay4KKyAgKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgcGVyaXBoZXJhbCBjbG9jayAodXNlZCBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGUgYWNjZXNzKQorICAqICAgICAgICAgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sgYmVmb3JlCisgICogICAgICAgICB1c2luZyBpdC4KKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0FfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgICgoUkNDLT5BSEJFTlIgJiAoUkNDX0FIQkVOUl9HUElPQUVOKSkgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQl9JU19DTEtfRU5BQkxFRCgpICAgICAgICAgKChSQ0MtPkFIQkVOUiAmIChSQ0NfQUhCRU5SX0dQSU9CRU4pKSAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9DX0lTX0NMS19FTkFCTEVEKCkgICAgICAgICAoKFJDQy0+QUhCRU5SICYgKFJDQ19BSEJFTlJfR1BJT0NFTikpICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0RfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgICgoUkNDLT5BSEJFTlIgJiAoUkNDX0FIQkVOUl9HUElPREVOKSkgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRl9JU19DTEtfRU5BQkxFRCgpICAgICAgICAgKChSQ0MtPkFIQkVOUiAmIChSQ0NfQUhCRU5SX0dQSU9GRU4pKSAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0NSQ19JU19DTEtfRU5BQkxFRCgpICAgICAgICAgICAoKFJDQy0+QUhCRU5SICYgKFJDQ19BSEJFTlJfQ1JDRU4pKSAgICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfRE1BMV9JU19DTEtfRU5BQkxFRCgpICAgICAgICAgICgoUkNDLT5BSEJFTlIgJiAoUkNDX0FIQkVOUl9ETUExRU4pKSAgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19TUkFNX0lTX0NMS19FTkFCTEVEKCkgICAgICAgICAgKChSQ0MtPkFIQkVOUiAmIChSQ0NfQUhCRU5SX1NSQU1FTikpICAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0ZMSVRGX0lTX0NMS19FTkFCTEVEKCkgICAgICAgICAoKFJDQy0+QUhCRU5SICYgKFJDQ19BSEJFTlJfRkxJVEZFTikpICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfVFNDX0lTX0NMS19FTkFCTEVEKCkgICAgICAgICAgICgoUkNDLT5BSEJFTlIgJiAoUkNDX0FIQkVOUl9UU0NFTikpICAgIT0gUkVTRVQpCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9BX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAoKFJDQy0+QUhCRU5SICYgKFJDQ19BSEJFTlJfR1BJT0FFTikpID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0JfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgICgoUkNDLT5BSEJFTlIgJiAoUkNDX0FIQkVOUl9HUElPQkVOKSkgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQ19JU19DTEtfRElTQUJMRUQoKSAgICAgICAgKChSQ0MtPkFIQkVOUiAmIChSQ0NfQUhCRU5SX0dQSU9DRU4pKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9EX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAoKFJDQy0+QUhCRU5SICYgKFJDQ19BSEJFTlJfR1BJT0RFTikpID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0ZfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgICgoUkNDLT5BSEJFTlIgJiAoUkNDX0FIQkVOUl9HUElPRkVOKSkgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19DUkNfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgICAgKChSQ0MtPkFIQkVOUiAmIChSQ0NfQUhCRU5SX0NSQ0VOKSkgICA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0RNQTFfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgICAoKFJDQy0+QUhCRU5SICYgKFJDQ19BSEJFTlJfRE1BMUVOKSkgID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfU1JBTV9JU19DTEtfRElTQUJMRUQoKSAgICAgICAgICgoUkNDLT5BSEJFTlIgJiAoUkNDX0FIQkVOUl9TUkFNRU4pKSAgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19GTElURl9JU19DTEtfRElTQUJMRUQoKSAgICAgICAgKChSQ0MtPkFIQkVOUiAmIChSQ0NfQUhCRU5SX0ZMSVRGRU4pKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1RTQ19JU19DTEtfRElTQUJMRUQoKSAgICAgICAgICAoKFJDQy0+QUhCRU5SICYgKFJDQ19BSEJFTlJfVFNDRU4pKSAgID09IFJFU0VUKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQVBCMV9DbG9ja19FbmFibGVfRGlzYWJsZV9TdGF0dXMgQVBCMSBQZXJpcGhlcmFsIENsb2NrIEVuYWJsZSBEaXNhYmxlICBTdGF0dXMKKyAgKiBAYnJpZWYgIEdldCB0aGUgZW5hYmxlIG9yIGRpc2FibGUgc3RhdHVzIG9mIHRoZSBBUEIxIHBlcmlwaGVyYWwgY2xvY2suCisgICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlIGFjY2VzcykKKyAgKiAgICAgICAgIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrIGJlZm9yZQorICAqICAgICAgICAgdXNpbmcgaXQuCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1RJTTJfSVNfQ0xLX0VOQUJMRUQoKSAgICAoKFJDQy0+QVBCMUVOUiAmIChSQ0NfQVBCMUVOUl9USU0yRU4pKSAgICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNNl9JU19DTEtfRU5BQkxFRCgpICAgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX1RJTTZFTikpICAgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19XV0RHX0lTX0NMS19FTkFCTEVEKCkgICAgKChSQ0MtPkFQQjFFTlIgJiAoUkNDX0FQQjFFTlJfV1dER0VOKSkgICAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMl9JU19DTEtfRU5BQkxFRCgpICAoKFJDQy0+QVBCMUVOUiAmIChSQ0NfQVBCMUVOUl9VU0FSVDJFTikpICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQzX0lTX0NMS19FTkFCTEVEKCkgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX1VTQVJUM0VOKSkgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMxX0lTX0NMS19FTkFCTEVEKCkgICAgKChSQ0MtPkFQQjFFTlIgJiAoUkNDX0FQQjFFTlJfSTJDMUVOKSkgICAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1BXUl9JU19DTEtfRU5BQkxFRCgpICAgICAoKFJDQy0+QVBCMUVOUiAmIChSQ0NfQVBCMUVOUl9QV1JFTikpICAgICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfREFDMV9JU19DTEtfRU5BQkxFRCgpICAgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX0RBQzFFTikpICAgIT0gUkVTRVQpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTJfSVNfQ0xLX0RJU0FCTEVEKCkgICAoKFJDQy0+QVBCMUVOUiAmIChSQ0NfQVBCMUVOUl9USU0yRU4pKSAgID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNNl9JU19DTEtfRElTQUJMRUQoKSAgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX1RJTTZFTikpICAgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19XV0RHX0lTX0NMS19ESVNBQkxFRCgpICAgKChSQ0MtPkFQQjFFTlIgJiAoUkNDX0FQQjFFTlJfV1dER0VOKSkgICA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMl9JU19DTEtfRElTQUJMRUQoKSAoKFJDQy0+QVBCMUVOUiAmIChSQ0NfQVBCMUVOUl9VU0FSVDJFTikpID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQzX0lTX0NMS19ESVNBQkxFRCgpICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX1VTQVJUM0VOKSkgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMxX0lTX0NMS19ESVNBQkxFRCgpICAgKChSQ0MtPkFQQjFFTlIgJiAoUkNDX0FQQjFFTlJfSTJDMUVOKSkgICA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1BXUl9JU19DTEtfRElTQUJMRUQoKSAgICAoKFJDQy0+QVBCMUVOUiAmIChSQ0NfQVBCMUVOUl9QV1JFTikpICAgID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfREFDMV9JU19DTEtfRElTQUJMRUQoKSAgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX0RBQzFFTikpICAgPT0gUkVTRVQpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BUEIyX0Nsb2NrX0VuYWJsZV9EaXNhYmxlX1N0YXR1cyBBUEIyIFBlcmlwaGVyYWwgQ2xvY2sgRW5hYmxlIERpc2FibGUgU3RhdHVzCisgICogQGJyaWVmICBFR2V0IHRoZSBlbmFibGUgb3IgZGlzYWJsZSBzdGF0dXMgb2YgdGhlIEFQQjIgcGVyaXBoZXJhbCBjbG9jay4KKyAgKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgcGVyaXBoZXJhbCBjbG9jayAodXNlZCBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGUgYWNjZXNzKQorICAqICAgICAgICAgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sgYmVmb3JlCisgICogICAgICAgICB1c2luZyBpdC4KKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfU1lTQ0ZHX0lTX0NMS19FTkFCTEVEKCkgICgoUkNDLT5BUEIyRU5SICYgKFJDQ19BUEIyRU5SX1NZU0NGR0VOKSkgICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTVfSVNfQ0xLX0VOQUJMRUQoKSAgICgoUkNDLT5BUEIyRU5SICYgKFJDQ19BUEIyRU5SX1RJTTE1RU4pKSAgICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTZfSVNfQ0xLX0VOQUJMRUQoKSAgICgoUkNDLT5BUEIyRU5SICYgKFJDQ19BUEIyRU5SX1RJTTE2RU4pKSAgICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTdfSVNfQ0xLX0VOQUJMRUQoKSAgICgoUkNDLT5BUEIyRU5SICYgKFJDQ19BUEIyRU5SX1RJTTE3RU4pKSAgICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQxX0lTX0NMS19FTkFCTEVEKCkgICgoUkNDLT5BUEIyRU5SICYgKFJDQ19BUEIyRU5SX1VTQVJUMUVOKSkgICE9IFJFU0VUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19TWVNDRkdfSVNfQ0xLX0RJU0FCTEVEKCkgKChSQ0MtPkFQQjJFTlIgJiAoUkNDX0FQQjJFTlJfU1lTQ0ZHRU4pKSAgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xNV9JU19DTEtfRElTQUJMRUQoKSAgKChSQ0MtPkFQQjJFTlIgJiAoUkNDX0FQQjJFTlJfVElNMTVFTikpICAgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xNl9JU19DTEtfRElTQUJMRUQoKSAgKChSQ0MtPkFQQjJFTlIgJiAoUkNDX0FQQjJFTlJfVElNMTZFTikpICAgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xN19JU19DTEtfRElTQUJMRUQoKSAgKChSQ0MtPkFQQjJFTlIgJiAoUkNDX0FQQjJFTlJfVElNMTdFTikpICAgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDFfSVNfQ0xLX0RJU0FCTEVEKCkgKChSQ0MtPkFQQjJFTlIgJiAoUkNDX0FQQjJFTlJfVVNBUlQxRU4pKSAgPT0gUkVTRVQpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BSEJfRm9yY2VfUmVsZWFzZV9SZXNldCBSQ0MgQUhCIEZvcmNlIFJlbGVhc2UgUmVzZXQKKyAgKiBAYnJpZWYgIEZvcmNlIG9yIHJlbGVhc2UgQUhCIHBlcmlwaGVyYWwgcmVzZXQuCisgICogQHsgICAKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0FIQl9GT1JDRV9SRVNFVCgpICAgICAoUkNDLT5BSEJSU1RSID0gMHhGRkZGRkZGRlUpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQV9GT1JDRV9SRVNFVCgpICAgKFJDQy0+QUhCUlNUUiB8PSAoUkNDX0FIQlJTVFJfR1BJT0FSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0JfRk9SQ0VfUkVTRVQoKSAgIChSQ0MtPkFIQlJTVFIgfD0gKFJDQ19BSEJSU1RSX0dQSU9CUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9DX0ZPUkNFX1JFU0VUKCkgICAoUkNDLT5BSEJSU1RSIHw9IChSQ0NfQUhCUlNUUl9HUElPQ1JTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRF9GT1JDRV9SRVNFVCgpICAgKFJDQy0+QUhCUlNUUiB8PSAoUkNDX0FIQlJTVFJfR1BJT0RSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0ZfRk9SQ0VfUkVTRVQoKSAgIChSQ0MtPkFIQlJTVFIgfD0gKFJDQ19BSEJSU1RSX0dQSU9GUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1RTQ19GT1JDRV9SRVNFVCgpICAgICAoUkNDLT5BSEJSU1RSIHw9IChSQ0NfQUhCUlNUUl9UU0NSU1QpKQorCisjZGVmaW5lIF9fSEFMX1JDQ19BSEJfUkVMRUFTRV9SRVNFVCgpICAgKFJDQy0+QUhCUlNUUiA9IDB4MDAwMDAwMDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0FfUkVMRUFTRV9SRVNFVCgpIChSQ0MtPkFIQlJTVFIgJj0gfihSQ0NfQUhCUlNUUl9HUElPQVJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQl9SRUxFQVNFX1JFU0VUKCkgKFJDQy0+QUhCUlNUUiAmPSB+KFJDQ19BSEJSU1RSX0dQSU9CUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9DX1JFTEVBU0VfUkVTRVQoKSAoUkNDLT5BSEJSU1RSICY9IH4oUkNDX0FIQlJTVFJfR1BJT0NSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0RfUkVMRUFTRV9SRVNFVCgpIChSQ0MtPkFIQlJTVFIgJj0gfihSQ0NfQUhCUlNUUl9HUElPRFJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRl9SRUxFQVNFX1JFU0VUKCkgKFJDQy0+QUhCUlNUUiAmPSB+KFJDQ19BSEJSU1RSX0dQSU9GUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1RTQ19SRUxFQVNFX1JFU0VUKCkgICAoUkNDLT5BSEJSU1RSICY9IH4oUkNDX0FIQlJTVFJfVFNDUlNUKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FQQjFfRm9yY2VfUmVsZWFzZV9SZXNldCBSQ0MgQVBCMSBGb3JjZSBSZWxlYXNlIFJlc2V0CisgICogQGJyaWVmICBGb3JjZSBvciByZWxlYXNlIEFQQjEgcGVyaXBoZXJhbCByZXNldC4KKyAgKiBAeyAgIAorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfQVBCMV9GT1JDRV9SRVNFVCgpICAgICAoUkNDLT5BUEIxUlNUUiA9IDB4RkZGRkZGRkZVKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMl9GT1JDRV9SRVNFVCgpICAgICAoUkNDLT5BUEIxUlNUUiB8PSAoUkNDX0FQQjFSU1RSX1RJTTJSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNNl9GT1JDRV9SRVNFVCgpICAgICAoUkNDLT5BUEIxUlNUUiB8PSAoUkNDX0FQQjFSU1RSX1RJTTZSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfV1dER19GT1JDRV9SRVNFVCgpICAgICAoUkNDLT5BUEIxUlNUUiB8PSAoUkNDX0FQQjFSU1RSX1dXREdSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQyX0ZPUkNFX1JFU0VUKCkgICAoUkNDLT5BUEIxUlNUUiB8PSAoUkNDX0FQQjFSU1RSX1VTQVJUMlJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDNfRk9SQ0VfUkVTRVQoKSAgIChSQ0MtPkFQQjFSU1RSIHw9IChSQ0NfQVBCMVJTVFJfVVNBUlQzUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzFfRk9SQ0VfUkVTRVQoKSAgICAgKFJDQy0+QVBCMVJTVFIgfD0gKFJDQ19BUEIxUlNUUl9JMkMxUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1BXUl9GT1JDRV9SRVNFVCgpICAgICAgKFJDQy0+QVBCMVJTVFIgfD0gKFJDQ19BUEIxUlNUUl9QV1JSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfREFDMV9GT1JDRV9SRVNFVCgpICAgICAoUkNDLT5BUEIxUlNUUiB8PSAoUkNDX0FQQjFSU1RSX0RBQzFSU1QpKQorCisjZGVmaW5lIF9fSEFMX1JDQ19BUEIxX1JFTEVBU0VfUkVTRVQoKSAgIChSQ0MtPkFQQjFSU1RSID0gMHgwMDAwMDAwMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yX1JFTEVBU0VfUkVTRVQoKSAgIChSQ0MtPkFQQjFSU1RSICY9IH4oUkNDX0FQQjFSU1RSX1RJTTJSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNNl9SRUxFQVNFX1JFU0VUKCkgICAoUkNDLT5BUEIxUlNUUiAmPSB+KFJDQ19BUEIxUlNUUl9USU02UlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1dXREdfUkVMRUFTRV9SRVNFVCgpICAgKFJDQy0+QVBCMVJTVFIgJj0gfihSQ0NfQVBCMVJTVFJfV1dER1JTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDJfUkVMRUFTRV9SRVNFVCgpIChSQ0MtPkFQQjFSU1RSICY9IH4oUkNDX0FQQjFSU1RSX1VTQVJUMlJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDNfUkVMRUFTRV9SRVNFVCgpIChSQ0MtPkFQQjFSU1RSICY9IH4oUkNDX0FQQjFSU1RSX1VTQVJUM1JTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMxX1JFTEVBU0VfUkVTRVQoKSAgIChSQ0MtPkFQQjFSU1RSICY9IH4oUkNDX0FQQjFSU1RSX0kyQzFSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfUFdSX1JFTEVBU0VfUkVTRVQoKSAgICAoUkNDLT5BUEIxUlNUUiAmPSB+KFJDQ19BUEIxUlNUUl9QV1JSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfREFDMV9SRUxFQVNFX1JFU0VUKCkgICAoUkNDLT5BUEIxUlNUUiAmPSB+KFJDQ19BUEIxUlNUUl9EQUMxUlNUKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FQQjJfRm9yY2VfUmVsZWFzZV9SZXNldCBSQ0MgQVBCMiBGb3JjZSBSZWxlYXNlIFJlc2V0CisgICogQGJyaWVmICBGb3JjZSBvciByZWxlYXNlIEFQQjIgcGVyaXBoZXJhbCByZXNldC4KKyAgKiBAeyAgIAorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfQVBCMl9GT1JDRV9SRVNFVCgpICAgICAoUkNDLT5BUEIyUlNUUiA9IDB4RkZGRkZGRkZVKQorI2RlZmluZSBfX0hBTF9SQ0NfU1lTQ0ZHX0ZPUkNFX1JFU0VUKCkgICAoUkNDLT5BUEIyUlNUUiB8PSAoUkNDX0FQQjJSU1RSX1NZU0NGR1JTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xNV9GT1JDRV9SRVNFVCgpICAgIChSQ0MtPkFQQjJSU1RSIHw9IChSQ0NfQVBCMlJTVFJfVElNMTVSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTZfRk9SQ0VfUkVTRVQoKSAgICAoUkNDLT5BUEIyUlNUUiB8PSAoUkNDX0FQQjJSU1RSX1RJTTE2UlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE3X0ZPUkNFX1JFU0VUKCkgICAgKFJDQy0+QVBCMlJTVFIgfD0gKFJDQ19BUEIyUlNUUl9USU0xN1JTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDFfRk9SQ0VfUkVTRVQoKSAgIChSQ0MtPkFQQjJSU1RSIHw9IChSQ0NfQVBCMlJTVFJfVVNBUlQxUlNUKSkKKworI2RlZmluZSBfX0hBTF9SQ0NfQVBCMl9SRUxFQVNFX1JFU0VUKCkgICAoUkNDLT5BUEIyUlNUUiA9IDB4MDAwMDAwMDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfU1lTQ0ZHX1JFTEVBU0VfUkVTRVQoKSAoUkNDLT5BUEIyUlNUUiAmPSB+KFJDQ19BUEIyUlNUUl9TWVNDRkdSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTVfUkVMRUFTRV9SRVNFVCgpICAoUkNDLT5BUEIyUlNUUiAmPSB+KFJDQ19BUEIyUlNUUl9USU0xNVJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xNl9SRUxFQVNFX1JFU0VUKCkgIChSQ0MtPkFQQjJSU1RSICY9IH4oUkNDX0FQQjJSU1RSX1RJTTE2UlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE3X1JFTEVBU0VfUkVTRVQoKSAgKFJDQy0+QVBCMlJTVFIgJj0gfihSQ0NfQVBCMlJTVFJfVElNMTdSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQxX1JFTEVBU0VfUkVTRVQoKSAoUkNDLT5BUEIyUlNUUiAmPSB+KFJDQ19BUEIyUlNUUl9VU0FSVDFSU1QpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfSFNJX0NvbmZpZ3VyYXRpb24gSFNJIENvbmZpZ3VyYXRpb24KKyAgKiBAeyAgIAorICAqLworCisvKiogQGJyaWVmICBNYWNyb3MgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIEludGVybmFsIEhpZ2ggU3BlZWQgb3NjaWxsYXRvciAoSFNJKS4KKyAgKiBAbm90ZSAgIFRoZSBIU0kgaXMgc3RvcHBlZCBieSBoYXJkd2FyZSB3aGVuIGVudGVyaW5nIFNUT1AgYW5kIFNUQU5EQlkgbW9kZXMuCisgICogICAgICAgICBJdCBpcyB1c2VkIChlbmFibGVkIGJ5IGhhcmR3YXJlKSBhcyBzeXN0ZW0gY2xvY2sgc291cmNlIGFmdGVyIHN0YXJ0dXAKKyAgKiAgICAgICAgIGZyb20gUmVzZXQsIHdha2V1cCBmcm9tIFNUT1AgYW5kIFNUQU5EQlkgbW9kZSwgb3IgaW4gY2FzZSBvZiBmYWlsdXJlCisgICogICAgICAgICBvZiB0aGUgSFNFIHVzZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBhcyBzeXN0ZW0gY2xvY2sgKGlmIHRoZSBDbG9jaworICAqICAgICAgICAgU2VjdXJpdHkgU3lzdGVtIENTUyBpcyBlbmFibGVkKS4KKyAgKiBAbm90ZSAgIEhTSSBjYW4gbm90IGJlIHN0b3BwZWQgaWYgaXQgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlLiBJbiB0aGlzIGNhc2UsCisgICogICAgICAgICB5b3UgaGF2ZSB0byBzZWxlY3QgYW5vdGhlciBzb3VyY2Ugb2YgdGhlIHN5c3RlbSBjbG9jayB0aGVuIHN0b3AgdGhlIEhTSS4gIAorICAqIEBub3RlICAgQWZ0ZXIgZW5hYmxpbmcgdGhlIEhTSSwgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIHNob3VsZCB3YWl0IG9uIEhTSVJEWQorICAqICAgICAgICAgZmxhZyB0byBiZSBzZXQgaW5kaWNhdGluZyB0aGF0IEhTSSBjbG9jayBpcyBzdGFibGUgYW5kIGNhbiBiZSB1c2VkIGFzCisgICogICAgICAgICBzeXN0ZW0gY2xvY2sgc291cmNlLiAgCisgICogQG5vdGUgICBXaGVuIHRoZSBIU0kgaXMgc3RvcHBlZCwgSFNJUkRZIGZsYWcgZ29lcyBsb3cgYWZ0ZXIgNiBIU0kgb3NjaWxsYXRvcgorICAqICAgICAgICAgY2xvY2sgY3ljbGVzLiAgCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19IU0lfRU5BQkxFKCkgICgqKF9fSU8gdWludDMyX3QgKikgUkNDX0NSX0hTSU9OX0JCID0gRU5BQkxFKQorI2RlZmluZSBfX0hBTF9SQ0NfSFNJX0RJU0FCTEUoKSAoKihfX0lPIHVpbnQzMl90ICopIFJDQ19DUl9IU0lPTl9CQiA9IERJU0FCTEUpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGFkanVzdCB0aGUgSW50ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0kpIGNhbGlicmF0aW9uIHZhbHVlLgorICAqIEBub3RlICAgVGhlIGNhbGlicmF0aW9uIGlzIHVzZWQgdG8gY29tcGVuc2F0ZSBmb3IgdGhlIHZhcmlhdGlvbnMgaW4gdm9sdGFnZQorICAqICAgICAgICAgYW5kIHRlbXBlcmF0dXJlIHRoYXQgaW5mbHVlbmNlIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGludGVybmFsIEhTSSBSQy4KKyAgKiBAcGFyYW0gIF9IU0lDQUxJQlJBVElPTlZBTFVFXyBzcGVjaWZpZXMgdGhlIGNhbGlicmF0aW9uIHRyaW1taW5nIHZhbHVlLgorICAqICAgICAgICAgKGRlZmF1bHQgaXMgUkNDX0hTSUNBTElCUkFUSU9OX0RFRkFVTFQpLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDB4MUYuCisgICovICAKKyNkZWZpbmUgX19IQUxfUkNDX0hTSV9DQUxJQlJBVElPTlZBTFVFX0FESlVTVChfSFNJQ0FMSUJSQVRJT05WQUxVRV8pIFwKKyAgICAgICAgICAoTU9ESUZZX1JFRyhSQ0MtPkNSLCBSQ0NfQ1JfSFNJVFJJTSwgKHVpbnQzMl90KShfSFNJQ0FMSUJSQVRJT05WQUxVRV8pIDw8IFBPU0lUSU9OX1ZBTChSQ0NfQ1JfSFNJVFJJTSkpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MU0lfQ29uZmlndXJhdGlvbiAgTFNJIENvbmZpZ3VyYXRpb24KKyAgKiBAeyAgIAorICAqLworCisvKiogQGJyaWVmIE1hY3JvIHRvIGVuYWJsZSB0aGUgSW50ZXJuYWwgTG93IFNwZWVkIG9zY2lsbGF0b3IgKExTSSkuCisgICogQG5vdGUgICBBZnRlciBlbmFibGluZyB0aGUgTFNJLCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgc2hvdWxkIHdhaXQgb24gCisgICogICAgICAgICBMU0lSRFkgZmxhZyB0byBiZSBzZXQgaW5kaWNhdGluZyB0aGF0IExTSSBjbG9jayBpcyBzdGFibGUgYW5kIGNhbgorICAqICAgICAgICAgYmUgdXNlZCB0byBjbG9jayB0aGUgSVdERyBhbmQvb3IgdGhlIFJUQy4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0xTSV9FTkFCTEUoKSAgKCooX19JTyB1aW50MzJfdCAqKSBSQ0NfQ1NSX0xTSU9OX0JCID0gRU5BQkxFKQorCisvKiogQGJyaWVmIE1hY3JvIHRvIGRpc2FibGUgdGhlIEludGVybmFsIExvdyBTcGVlZCBvc2NpbGxhdG9yIChMU0kpLgorICAqIEBub3RlICAgTFNJIGNhbiBub3QgYmUgZGlzYWJsZWQgaWYgdGhlIElXREcgaXMgcnVubmluZy4gIAorICAqIEBub3RlICAgV2hlbiB0aGUgTFNJIGlzIHN0b3BwZWQsIExTSVJEWSBmbGFnIGdvZXMgbG93IGFmdGVyIDYgTFNJIG9zY2lsbGF0b3IKKyAgKiAgICAgICAgIGNsb2NrIGN5Y2xlcy4gCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19MU0lfRElTQUJMRSgpICgqKF9fSU8gdWludDMyX3QgKikgUkNDX0NTUl9MU0lPTl9CQiA9IERJU0FCTEUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0hTRV9Db25maWd1cmF0aW9uIEhTRSBDb25maWd1cmF0aW9uCisgICogQHsgICAKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIEV4dGVybmFsIEhpZ2ggU3BlZWQgb3NjaWxsYXRvciAoSFNFKS4KKyAgKiBAbm90ZSAgIFRyYW5zaXRpb24gSFNFIEJ5cGFzcyB0byBIU0UgT24gYW5kIEhTRSBPbiB0byBIU0UgQnlwYXNzIGFyZSBub3QKKyAgKiAgICAgICAgIHN1cHBvcnRlZCBieSB0aGlzIG1hY3JvLiBVc2VyIHNob3VsZCByZXF1ZXN0IGEgdHJhbnNpdGlvbiB0byBIU0UgT2ZmCisgICogICAgICAgICBmaXJzdCBhbmQgdGhlbiBIU0UgT24gb3IgSFNFIEJ5cGFzcy4KKyAgKiBAbm90ZSAgIEFmdGVyIGVuYWJsaW5nIHRoZSBIU0UgKFJDQ19IU0VfT04gb3IgUkNDX0hTRV9CeXBhc3MpLCB0aGUgYXBwbGljYXRpb24KKyAgKiAgICAgICAgIHNvZnR3YXJlIHNob3VsZCB3YWl0IG9uIEhTRVJEWSBmbGFnIHRvIGJlIHNldCBpbmRpY2F0aW5nIHRoYXQgSFNFIGNsb2NrCisgICogICAgICAgICBpcyBzdGFibGUgYW5kIGNhbiBiZSB1c2VkIHRvIGNsb2NrIHRoZSBQTEwgYW5kL29yIHN5c3RlbSBjbG9jay4KKyAgKiBAbm90ZSAgIEhTRSBzdGF0ZSBjYW4gbm90IGJlIGNoYW5nZWQgaWYgaXQgaXMgdXNlZCBkaXJlY3RseSBvciB0aHJvdWdoIHRoZQorICAqICAgICAgICAgUExMIGFzIHN5c3RlbSBjbG9jay4gSW4gdGhpcyBjYXNlLCB5b3UgaGF2ZSB0byBzZWxlY3QgYW5vdGhlciBzb3VyY2UKKyAgKiAgICAgICAgIG9mIHRoZSBzeXN0ZW0gY2xvY2sgdGhlbiBjaGFuZ2UgdGhlIEhTRSBzdGF0ZSAoZXguIGRpc2FibGUgaXQpLgorICAqIEBub3RlICAgVGhlIEhTRSBpcyBzdG9wcGVkIGJ5IGhhcmR3YXJlIHdoZW4gZW50ZXJpbmcgU1RPUCBhbmQgU1RBTkRCWSBtb2Rlcy4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gcmVzZXQgdGhlIENTU09OIGJpdCwgc28gaWYgdGhlIGNsb2NrIHNlY3VyaXR5IHN5c3RlbShDU1MpCisgICogICAgICAgICB3YXMgcHJldmlvdXNseSBlbmFibGVkIHlvdSBoYXZlIHRvIGVuYWJsZSBpdCBhZ2FpbiBhZnRlciBjYWxsaW5nIHRoaXMKKyAgKiAgICAgICAgIGZ1bmN0aW9uLgorICAqIEBwYXJhbSAgX19TVEFURV9fIHNwZWNpZmllcyB0aGUgbmV3IHN0YXRlIG9mIHRoZSBIU0UuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSFNFX09GRiB0dXJuIE9GRiB0aGUgSFNFIG9zY2lsbGF0b3IsIEhTRVJEWSBmbGFnIGdvZXMgbG93IGFmdGVyCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2IEhTRSBvc2NpbGxhdG9yIGNsb2NrIGN5Y2xlcy4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSFNFX09OIHR1cm4gT04gdGhlIEhTRSBvc2NpbGxhdG9yCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0hTRV9CWVBBU1MgSFNFIG9zY2lsbGF0b3IgYnlwYXNzZWQgd2l0aCBleHRlcm5hbCBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfSFNFX0NPTkZJRyhfX1NUQVRFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgaWYgKChfX1NUQVRFX18pID09IFJDQ19IU0VfT04pICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTRU9OKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChfX1NUQVRFX18pID09IFJDQ19IU0VfT0ZGKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBDTEVBUl9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTRU9OKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0VCWVApOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKF9fU1RBVEVfXykgPT0gUkNDX0hTRV9CWVBBU1MpICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTRUJZUCk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0VPTik7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0VPTik7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIENMRUFSX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNFQllQKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMFUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xTRV9Db25maWd1cmF0aW9uIExTRSBDb25maWd1cmF0aW9uCisgICogQHsgICAKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIEV4dGVybmFsIExvdyBTcGVlZCBvc2NpbGxhdG9yIChMU0UpLgorICAqIEBub3RlIFRyYW5zaXRpb25zIExTRSBCeXBhc3MgdG8gTFNFIE9uIGFuZCBMU0UgT24gdG8gTFNFIEJ5cGFzcyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIG1hY3JvLiAKKyAgKiBAbm90ZSAgIEFzIHRoZSBMU0UgaXMgaW4gdGhlIEJhY2t1cCBkb21haW4gYW5kIHdyaXRlIGFjY2VzcyBpcyBkZW5pZWQgdG8KKyAgKiAgICAgICAgIHRoaXMgZG9tYWluIGFmdGVyIHJlc2V0LCB5b3UgaGF2ZSB0byBlbmFibGUgd3JpdGUgYWNjZXNzIHVzaW5nIAorICAqICAgICAgICAgQHJlZiBIQUxfUFdSX0VuYWJsZUJrVXBBY2Nlc3MoKSBmdW5jdGlvbiBiZWZvcmUgdG8gY29uZmlndXJlIHRoZSBMU0UKKyAgKiAgICAgICAgICh0byBiZSBkb25lIG9uY2UgYWZ0ZXIgcmVzZXQpLiAgCisgICogQG5vdGUgICBBZnRlciBlbmFibGluZyB0aGUgTFNFIChSQ0NfTFNFX09OIG9yIFJDQ19MU0VfQllQQVNTKSwgdGhlIGFwcGxpY2F0aW9uCisgICogICAgICAgICBzb2Z0d2FyZSBzaG91bGQgd2FpdCBvbiBMU0VSRFkgZmxhZyB0byBiZSBzZXQgaW5kaWNhdGluZyB0aGF0IExTRSBjbG9jaworICAqICAgICAgICAgaXMgc3RhYmxlIGFuZCBjYW4gYmUgdXNlZCB0byBjbG9jayB0aGUgUlRDLgorICAqIEBwYXJhbSAgX19TVEFURV9fIHNwZWNpZmllcyB0aGUgbmV3IHN0YXRlIG9mIHRoZSBMU0UuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MU0VfT0ZGIHR1cm4gT0ZGIHRoZSBMU0Ugb3NjaWxsYXRvciwgTFNFUkRZIGZsYWcgZ29lcyBsb3cgYWZ0ZXIKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYgTFNFIG9zY2lsbGF0b3IgY2xvY2sgY3ljbGVzLgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MU0VfT04gdHVybiBPTiB0aGUgTFNFIG9zY2lsbGF0b3IuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xTRV9CWVBBU1MgTFNFIG9zY2lsbGF0b3IgYnlwYXNzZWQgd2l0aCBleHRlcm5hbCBjbG9jay4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0xTRV9DT05GSUcoX19TVEFURV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGlmICgoX19TVEFURV9fKSA9PSBSQ0NfTFNFX09OKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFT04pOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChfX1NUQVRFX18pID09IFJDQ19MU0VfT0ZGKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBDTEVBUl9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VPTik7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBDTEVBUl9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VCWVApOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChfX1NUQVRFX18pID09IFJDQ19MU0VfQllQQVNTKSAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFQllQKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFT04pOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBDTEVBUl9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VPTik7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBDTEVBUl9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VCWVApOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMFUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX1VTQVJUeF9DbG9ja19Db25maWcgUkNDIFVTQVJUeCBDbG9jayBDb25maWcKKyAgKiBAeyAgIAorICAqLworICAgIAorLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBVU0FSVDEgY2xvY2sgKFVTQVJUMUNMSykuCisgICogQHBhcmFtICBfX1VTQVJUMUNMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQxIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgIEBpZiBTVE0zMkYzMDJ4QworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzIgUENMSzIgc2VsZWN0ZWQgYXMgVVNBUlQxIGNsb2NrCisgIEBlbmRpZgorICBAaWYgU1RNMzJGMzAzeEMKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsyIFBDTEsyIHNlbGVjdGVkIGFzIFVTQVJUMSBjbG9jaworICBAZW5kaWYKKyAgQGlmIFNUTTMyRjM1OHh4CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMiBQQ0xLMiBzZWxlY3RlZCBhcyBVU0FSVDEgY2xvY2sKKyAgQGVuZGlmCisgIEBpZiBTVE0zMkYzMDJ4RQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzIgUENMSzIgc2VsZWN0ZWQgYXMgVVNBUlQxIGNsb2NrCisgIEBlbmRpZgorICBAaWYgU1RNMzJGMzAzeEUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsyIFBDTEsyIHNlbGVjdGVkIGFzIFVTQVJUMSBjbG9jaworICBAZW5kaWYKKyAgQGlmIFNUTTMyRjM5OHh4CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMiBQQ0xLMiBzZWxlY3RlZCBhcyBVU0FSVDEgY2xvY2sKKyAgQGVuZGlmCisgIEBpZiBTVE0zMkYzNzN4QworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzIgUENMSzIgc2VsZWN0ZWQgYXMgVVNBUlQxIGNsb2NrCisgIEBlbmRpZgorICBAaWYgU1RNMzJGMzc4eHgKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsyIFBDTEsyIHNlbGVjdGVkIGFzIFVTQVJUMSBjbG9jaworICBAZW5kaWYKKyAgQGlmIFNUTTMyRjMwMXg4CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMSBQQ0xLMSBzZWxlY3RlZCBhcyBVU0FSVDEgY2xvY2sKKyAgQGVuZGlmCisgIEBpZiBTVE0zMkYzMDJ4OAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzEgUENMSzEgc2VsZWN0ZWQgYXMgVVNBUlQxIGNsb2NrCisgIEBlbmRpZgorICBAaWYgU1RNMzJGMzE4eHgKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsxIFBDTEsxIHNlbGVjdGVkIGFzIFVTQVJUMSBjbG9jaworICBAZW5kaWYKKyAgQGlmIFNUTTMyRjMwM3g4CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMSBQQ0xLMSBzZWxlY3RlZCBhcyBVU0FSVDEgY2xvY2sKKyAgQGVuZGlmCisgIEBpZiBTVE0zMkYzMzR4OAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzEgUENMSzEgc2VsZWN0ZWQgYXMgVVNBUlQxIGNsb2NrCisgIEBlbmRpZgorICBAaWYgU1RNMzJGMzI4eHgKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsxIFBDTEsxIHNlbGVjdGVkIGFzIFVTQVJUMSBjbG9jaworICBAZW5kaWYKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQxQ0xLU09VUkNFX0hTSSBIU0kgc2VsZWN0ZWQgYXMgVVNBUlQxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMUNMS1NPVVJDRV9TWVNDTEsgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzIFVTQVJUMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDFDTEtTT1VSQ0VfTFNFIExTRSBzZWxlY3RlZCBhcyBVU0FSVDEgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMV9DT05GSUcoX19VU0FSVDFDTEtTT1VSQ0VfXykgXAorICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IzLCBSQ0NfQ0ZHUjNfVVNBUlQxU1csICh1aW50MzJfdCkoX19VU0FSVDFDTEtTT1VSQ0VfXykpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgVVNBUlQxIGNsb2NrIHNvdXJjZS4KKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgQGlmIFNUTTMyRjMwMnhDCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMiBQQ0xLMiBzZWxlY3RlZCBhcyBVU0FSVDEgY2xvY2sKKyAgQGVuZGlmCisgIEBpZiBTVE0zMkYzMDN4QworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzIgUENMSzIgc2VsZWN0ZWQgYXMgVVNBUlQxIGNsb2NrCisgIEBlbmRpZgorICBAaWYgU1RNMzJGMzU4eHgKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsyIFBDTEsyIHNlbGVjdGVkIGFzIFVTQVJUMSBjbG9jaworICBAZW5kaWYKKyAgQGlmIFNUTTMyRjMwMnhFCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMiBQQ0xLMiBzZWxlY3RlZCBhcyBVU0FSVDEgY2xvY2sKKyAgQGVuZGlmCisgIEBpZiBTVE0zMkYzMDN4RQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzIgUENMSzIgc2VsZWN0ZWQgYXMgVVNBUlQxIGNsb2NrCisgIEBlbmRpZgorICBAaWYgU1RNMzJGMzk4eHgKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsyIFBDTEsyIHNlbGVjdGVkIGFzIFVTQVJUMSBjbG9jaworICBAZW5kaWYKKyAgQGlmIFNUTTMyRjM3M3hDCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMiBQQ0xLMiBzZWxlY3RlZCBhcyBVU0FSVDEgY2xvY2sKKyAgQGVuZGlmCisgIEBpZiBTVE0zMkYzNzh4eAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzIgUENMSzIgc2VsZWN0ZWQgYXMgVVNBUlQxIGNsb2NrCisgIEBlbmRpZgorICBAaWYgU1RNMzJGMzAxeDgKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsxIFBDTEsxIHNlbGVjdGVkIGFzIFVTQVJUMSBjbG9jaworICBAZW5kaWYKKyAgQGlmIFNUTTMyRjMwMng4CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMSBQQ0xLMSBzZWxlY3RlZCBhcyBVU0FSVDEgY2xvY2sKKyAgQGVuZGlmCisgIEBpZiBTVE0zMkYzMTh4eAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzEgUENMSzEgc2VsZWN0ZWQgYXMgVVNBUlQxIGNsb2NrCisgIEBlbmRpZgorICBAaWYgU1RNMzJGMzAzeDgKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsxIFBDTEsxIHNlbGVjdGVkIGFzIFVTQVJUMSBjbG9jaworICBAZW5kaWYKKyAgQGlmIFNUTTMyRjMzNHg4CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMSBQQ0xLMSBzZWxlY3RlZCBhcyBVU0FSVDEgY2xvY2sKKyAgQGVuZGlmCisgIEBpZiBTVE0zMkYzMjh4eAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzEgUENMSzEgc2VsZWN0ZWQgYXMgVVNBUlQxIGNsb2NrCisgIEBlbmRpZgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDFDTEtTT1VSQ0VfSFNJIEhTSSBzZWxlY3RlZCBhcyBVU0FSVDEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQxQ0xLU09VUkNFX1NZU0NMSyBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgVVNBUlQxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMUNMS1NPVVJDRV9MU0UgTFNFIHNlbGVjdGVkIGFzIFVTQVJUMSBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX1VTQVJUMV9TT1VSQ0UoKSAoKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNGR1IzLCBSQ0NfQ0ZHUjNfVVNBUlQxU1cpKSkKKworI2lmIGRlZmluZWQoUkNDX0NGR1IzX1VTQVJUMlNXKQorLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBVU0FSVDIgY2xvY2sgKFVTQVJUMkNMSykuCisgICogQHBhcmFtICBfX1VTQVJUMkNMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQyIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMkNMS1NPVVJDRV9QQ0xLMSBQQ0xLMSBzZWxlY3RlZCBhcyBVU0FSVDIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQyQ0xLU09VUkNFX0hTSSBIU0kgc2VsZWN0ZWQgYXMgVVNBUlQyIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMkNMS1NPVVJDRV9TWVNDTEsgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzIFVTQVJUMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDJDTEtTT1VSQ0VfTFNFIExTRSBzZWxlY3RlZCBhcyBVU0FSVDIgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMl9DT05GSUcoX19VU0FSVDJDTEtTT1VSQ0VfXykgXAorICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IzLCBSQ0NfQ0ZHUjNfVVNBUlQyU1csICh1aW50MzJfdCkoX19VU0FSVDJDTEtTT1VSQ0VfXykpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgVVNBUlQyIGNsb2NrIHNvdXJjZS4KKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQyQ0xLU09VUkNFX1BDTEsxIFBDTEsxIHNlbGVjdGVkIGFzIFVTQVJUMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDJDTEtTT1VSQ0VfSFNJIEhTSSBzZWxlY3RlZCBhcyBVU0FSVDIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQyQ0xLU09VUkNFX1NZU0NMSyBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgVVNBUlQyIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMkNMS1NPVVJDRV9MU0UgTFNFIHNlbGVjdGVkIGFzIFVTQVJUMiBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX1VTQVJUMl9TT1VSQ0UoKSAoKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNGR1IzLCBSQ0NfQ0ZHUjNfVVNBUlQyU1cpKSkKKyNlbmRpZiAvKiBSQ0NfQ0ZHUjNfVVNBUlQyU1cgKi8KKworI2lmIGRlZmluZWQoUkNDX0NGR1IzX1VTQVJUM1NXKQorLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBVU0FSVDMgY2xvY2sgKFVTQVJUM0NMSykuCisgICogQHBhcmFtICBfX1VTQVJUM0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQzIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUM0NMS1NPVVJDRV9QQ0xLMSBQQ0xLMSBzZWxlY3RlZCBhcyBVU0FSVDMgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQzQ0xLU09VUkNFX0hTSSBIU0kgc2VsZWN0ZWQgYXMgVVNBUlQzIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUM0NMS1NPVVJDRV9TWVNDTEsgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzIFVTQVJUMyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDNDTEtTT1VSQ0VfTFNFIExTRSBzZWxlY3RlZCBhcyBVU0FSVDMgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUM19DT05GSUcoX19VU0FSVDNDTEtTT1VSQ0VfXykgXAorICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IzLCBSQ0NfQ0ZHUjNfVVNBUlQzU1csICh1aW50MzJfdCkoX19VU0FSVDNDTEtTT1VSQ0VfXykpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgVVNBUlQzIGNsb2NrIHNvdXJjZS4KKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQzQ0xLU09VUkNFX1BDTEsxIFBDTEsxIHNlbGVjdGVkIGFzIFVTQVJUMyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDNDTEtTT1VSQ0VfSFNJIEhTSSBzZWxlY3RlZCBhcyBVU0FSVDMgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQzQ0xLU09VUkNFX1NZU0NMSyBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgVVNBUlQzIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUM0NMS1NPVVJDRV9MU0UgTFNFIHNlbGVjdGVkIGFzIFVTQVJUMyBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX1VTQVJUM19TT1VSQ0UoKSAoKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNGR1IzLCBSQ0NfQ0ZHUjNfVVNBUlQzU1cpKSkKKyNlbmRpZiAvKiBSQ0NfQ0ZHUjNfVVNBUlQyU1cgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0kyQ3hfQ2xvY2tfQ29uZmlnIFJDQyBJMkN4IENsb2NrIENvbmZpZworICAqIEB7ICAgCisgICovCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgSTJDMSBjbG9jayAoSTJDMUNMSykuCisgICogQHBhcmFtICBfX0kyQzFDTEtTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIEkyQzEgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDMUNMS1NPVVJDRV9IU0kgSFNJIHNlbGVjdGVkIGFzIEkyQzEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDMUNMS1NPVVJDRV9TWVNDTEsgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzIEkyQzEgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0kyQzFfQ09ORklHKF9fSTJDMUNMS1NPVVJDRV9fKSBcCisgICAgICAgICAgICAgICAgICBNT0RJRllfUkVHKFJDQy0+Q0ZHUjMsIFJDQ19DRkdSM19JMkMxU1csICh1aW50MzJfdCkoX19JMkMxQ0xLU09VUkNFX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIEkyQzEgY2xvY2sgc291cmNlLgorICAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkMxQ0xLU09VUkNFX0hTSSBIU0kgc2VsZWN0ZWQgYXMgSTJDMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkMxQ0xLU09VUkNFX1NZU0NMSyBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgSTJDMSBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX0kyQzFfU09VUkNFKCkgKCh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DRkdSMywgUkNDX0NGR1IzX0kyQzFTVykpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfUExMX0NvbmZpZ3VyYXRpb24gUExMIENvbmZpZ3VyYXRpb24KKyAgKiBAeyAgIAorICAqLworCisvKiogQGJyaWVmIE1hY3JvIHRvIGVuYWJsZSB0aGUgbWFpbiBQTEwuCisgICogQG5vdGUgICBBZnRlciBlbmFibGluZyB0aGUgbWFpbiBQTEwsIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBzaG91bGQgd2FpdCBvbiAKKyAgKiAgICAgICAgIFBMTFJEWSBmbGFnIHRvIGJlIHNldCBpbmRpY2F0aW5nIHRoYXQgUExMIGNsb2NrIGlzIHN0YWJsZSBhbmQgY2FuCisgICogICAgICAgICBiZSB1c2VkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UuCisgICogQG5vdGUgICBUaGUgbWFpbiBQTEwgaXMgZGlzYWJsZWQgYnkgaGFyZHdhcmUgd2hlbiBlbnRlcmluZyBTVE9QIGFuZCBTVEFOREJZIG1vZGVzLgorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfUExMX0VOQUJMRSgpICAgICAgICAgICgqKF9fSU8gdWludDMyX3QgKikgUkNDX0NSX1BMTE9OX0JCID0gRU5BQkxFKQorCisvKiogQGJyaWVmIE1hY3JvIHRvIGRpc2FibGUgdGhlIG1haW4gUExMLgorICAqIEBub3RlICAgVGhlIG1haW4gUExMIGNhbiBub3QgYmUgZGlzYWJsZWQgaWYgaXQgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19QTExfRElTQUJMRSgpICAgICAgICAgKCooX19JTyB1aW50MzJfdCAqKSBSQ0NfQ1JfUExMT05fQkIgPSBESVNBQkxFKQorCisKKy8qKiBAYnJpZWYgIEdldCBvc2NpbGxhdG9yIGNsb2NrIHNlbGVjdGVkIGFzIFBMTCBpbnB1dCBjbG9jaworICAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSB1c2VkIGZvciBQTEwgZW50cnkuIFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lCisgICogICAgICAgICBvZiB0aGUgZm9sbG93aW5nOgorICAqICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMU09VUkNFX0hTSSBIU0kgb3NjaWxsYXRvciBjbG9jayBzZWxlY3RlZCBhcyBQTEwgaW5wdXQgY2xvY2sKKyAgKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTFNPVVJDRV9IU0UgSFNFIG9zY2lsbGF0b3IgY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGlucHV0IGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfUExMX09TQ1NPVVJDRSgpICgodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfUExMU1JDKSkpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0dldF9DbG9ja19zb3VyY2UgR2V0IENsb2NrIHNvdXJjZQorICAqIEB7ICAgCisgICovCisKKy8qKgorICAqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBzeXN0ZW0gY2xvY2sgc291cmNlLgorICAqIEBwYXJhbSAgX19TWVNDTEtTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIHN5c3RlbSBjbG9jayBzb3VyY2UuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TWVNDTEtTT1VSQ0VfSFNJIEhTSSBvc2NpbGxhdG9yIGlzIHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TWVNDTEtTT1VSQ0VfSFNFIEhTRSBvc2NpbGxhdG9yIGlzIHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TWVNDTEtTT1VSQ0VfUExMQ0xLIFBMTCBvdXRwdXQgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlLgorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfU1lTQ0xLX0NPTkZJRyhfX1NZU0NMS1NPVVJDRV9fKSBcCisgICAgICAgICAgICAgICAgICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfU1csIChfX1NZU0NMS1NPVVJDRV9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBjbG9jayBzb3VyY2UgdXNlZCBhcyBzeXN0ZW0gY2xvY2suCisgICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIHVzZWQgYXMgc3lzdGVtIGNsb2NrLiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZQorICAqICAgICAgICAgb2YgdGhlIGZvbGxvd2luZzoKKyAgKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfSFNJIEhTSSB1c2VkIGFzIHN5c3RlbSBjbG9jaworICAqICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19IU0UgSFNFIHVzZWQgYXMgc3lzdGVtIGNsb2NrCisgICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX1BMTENMSyBQTEwgdXNlZCBhcyBzeXN0ZW0gY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9TWVNDTEtfU09VUkNFKCkgKCh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DRkdSLFJDQ19DRkdSX1NXUykpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X01DT3hfQ2xvY2tfQ29uZmlnIFJDQyBFeHRlbmRlZCBNQ094IENsb2NrIENvbmZpZworICAqIEB7ICAgCisgICovIAorCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUl9NQ09QUkUpCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIE1DTyBjbG9jay4KKyAgKiBAcGFyYW0gIF9fTUNPQ0xLU09VUkNFX18gc3BlY2lmaWVzIHRoZSBNQ08gY2xvY2sgc291cmNlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfTk9DTE9DSyAgICAgIE5vIGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX1NZU0NMSyAgICAgICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgTUNPIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfSFNJICAgICAgICAgIEhTSSBvc2NpbGxhdG9yIGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX0hTRSAgICAgICAgICBIU0Ugc2VsZWN0ZWQgYXMgTUNPIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfTFNJICAgICAgICAgIExTSSBzZWxlY3RlZCBhcyBNQ08gY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9MU0UgICAgICAgICAgTFNFIHNlbGVjdGVkIGFzIE1DTyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX1BMTENMS19ESVYyICBQTExDTEsgRGl2aWRlZCBieSAyIHNlbGVjdGVkIGFzIE1DTyBjbG9jaworICAqIEBwYXJhbSAgX19NQ09ESVZfXyBzcGVjaWZpZXMgdGhlIE1DTyBjbG9jayBwcmVzY2FsZXIuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPRElWXzEgICBNQ08gY2xvY2sgc291cmNlIGlzIGRpdmlkZWQgYnkgMQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ09ESVZfMiAgIE1DTyBjbG9jayBzb3VyY2UgaXMgZGl2aWRlZCBieSAyCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl80ICAgTUNPIGNsb2NrIHNvdXJjZSBpcyBkaXZpZGVkIGJ5IDQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPRElWXzggICBNQ08gY2xvY2sgc291cmNlIGlzIGRpdmlkZWQgYnkgOAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ09ESVZfMTYgIE1DTyBjbG9jayBzb3VyY2UgaXMgZGl2aWRlZCBieSAxNgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ09ESVZfMzIgIE1DTyBjbG9jayBzb3VyY2UgaXMgZGl2aWRlZCBieSAzMgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ09ESVZfNjQgIE1DTyBjbG9jayBzb3VyY2UgaXMgZGl2aWRlZCBieSA2NAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ09ESVZfMTI4IE1DTyBjbG9jayBzb3VyY2UgaXMgZGl2aWRlZCBieSAxMjgKKyAgKi8KKyNlbHNlCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIE1DTyBjbG9jay4KKyAgKiBAcGFyYW0gIF9fTUNPQ0xLU09VUkNFX18gc3BlY2lmaWVzIHRoZSBNQ08gY2xvY2sgc291cmNlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9OT0NMT0NLICAgICBObyBjbG9jayBzZWxlY3RlZCBhcyBNQ08gY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9TWVNDTEsgICAgICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgTUNPIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfSFNJICAgICAgICAgSFNJIHNlbGVjdGVkIGFzIE1DTyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX0hTRSAgICAgICAgIEhTRSBzZWxlY3RlZCBhcyBNQ08gY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9MU0kgICAgICAgICBMU0kgc2VsZWN0ZWQgYXMgTUNPIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfTFNFICAgICAgICAgTFNFIHNlbGVjdGVkIGFzIE1DTyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX1BMTENMS19ESVYyIFBMTENMSyBEaXZpZGVkIGJ5IDIgc2VsZWN0ZWQgYXMgTUNPIGNsb2NrCisgICogQHBhcmFtICBfX01DT0RJVl9fIHNwZWNpZmllcyB0aGUgTUNPIGNsb2NrIHByZXNjYWxlci4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl8xIE5vIGRpdmlzaW9uIGFwcGxpZWQgb24gTUNPIGNsb2NrIHNvdXJjZQorICAqLworI2VuZGlmCisjaWYgICBkZWZpbmVkKFJDQ19DRkdSX01DT1BSRSkKKyNkZWZpbmUgX19IQUxfUkNDX01DTzFfQ09ORklHKF9fTUNPQ0xLU09VUkNFX18sIF9fTUNPRElWX18pIFwKKyAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIChSQ0NfQ0ZHUl9NQ08gfCBSQ0NfQ0ZHUl9NQ09QUkUpLCAoKF9fTUNPQ0xLU09VUkNFX18pIHwgKF9fTUNPRElWX18pKSkKKyNlbHNlCisKKyNkZWZpbmUgX19IQUxfUkNDX01DTzFfQ09ORklHKF9fTUNPQ0xLU09VUkNFX18sIF9fTUNPRElWX18pIFwKKyAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX01DTywgKF9fTUNPQ0xLU09VUkNFX18pKQorCisjZW5kaWYKKworLyoqCisgICogQH0KKyAgKi8KKworICAvKiogQGRlZmdyb3VwIFJDQ19SVENfQ2xvY2tfQ29uZmlndXJhdGlvbiBSQ0MgUlRDIENsb2NrIENvbmZpZ3VyYXRpb24KKyAgKiBAeyAgIAorICAqLworCisvKiogQGJyaWVmIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgUlRDIGNsb2NrIChSVENDTEspLgorICAqIEBub3RlICAgQXMgdGhlIFJUQyBjbG9jayBjb25maWd1cmF0aW9uIGJpdHMgYXJlIGluIHRoZSBCYWNrdXAgZG9tYWluIGFuZCB3cml0ZQorICAqICAgICAgICAgYWNjZXNzIGlzIGRlbmllZCB0byB0aGlzIGRvbWFpbiBhZnRlciByZXNldCwgeW91IGhhdmUgdG8gZW5hYmxlIHdyaXRlCisgICogICAgICAgICBhY2Nlc3MgdXNpbmcgdGhlIFBvd2VyIEJhY2t1cCBBY2Nlc3MgbWFjcm8gYmVmb3JlIHRvIGNvbmZpZ3VyZQorICAqICAgICAgICAgdGhlIFJUQyBjbG9jayBzb3VyY2UgKHRvIGJlIGRvbmUgb25jZSBhZnRlciByZXNldCkuICAgIAorICAqIEBub3RlICAgT25jZSB0aGUgUlRDIGNsb2NrIGlzIGNvbmZpZ3VyZWQgaXQgY2Fubm90IGJlIGNoYW5nZWQgdW5sZXNzIHRoZSAgCisgICogICAgICAgICBCYWNrdXAgZG9tYWluIGlzIHJlc2V0IHVzaW5nIEByZWYgX19IQUxfUkNDX0JBQ0tVUFJFU0VUX0ZPUkNFKCkgbWFjcm8sIG9yIGJ5CisgICogICAgICAgICBhIFBvd2VyIE9uIFJlc2V0IChQT1IpLgorICAqCisgICogQHBhcmFtICBfX1JUQ19DTEtTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIFJUQyBjbG9jayBzb3VyY2UuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JUQ0NMS1NPVVJDRV9OT19DTEsgTm8gY2xvY2sgc2VsZWN0ZWQgYXMgUlRDIGNsb2NrCisgICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19SVENDTEtTT1VSQ0VfTFNFIExTRSBzZWxlY3RlZCBhcyBSVEMgY2xvY2sKKyAgKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JUQ0NMS1NPVVJDRV9MU0kgTFNJIHNlbGVjdGVkIGFzIFJUQyBjbG9jaworICAqICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUlRDQ0xLU09VUkNFX0hTRV9ESVYzMiBIU0UgY2xvY2sgZGl2aWRlZCBieSAzMgorICAqIEBub3RlICAgSWYgdGhlIExTRSBvciBMU0kgaXMgdXNlZCBhcyBSVEMgY2xvY2sgc291cmNlLCB0aGUgUlRDIGNvbnRpbnVlcyB0bworICAqICAgICAgICAgd29yayBpbiBTVE9QIGFuZCBTVEFOREJZIG1vZGVzLCBhbmQgY2FuIGJlIHVzZWQgYXMgd2FrZXVwIHNvdXJjZS4KKyAgKiAgICAgICAgIEhvd2V2ZXIsIHdoZW4gdGhlIExTSSBjbG9jayBhbmQgSFNFIGNsb2NrIGRpdmlkZWQgYnkgMzIgaXMgdXNlZCBhcyBSVEMgY2xvY2sgc291cmNlLAorICAqICAgICAgICAgdGhlIFJUQyBjYW5ub3QgYmUgdXNlZCBpbiBTVE9QIGFuZCBTVEFOREJZIG1vZGVzLgorICAqIEBub3RlICAgVGhlIHN5c3RlbSBtdXN0IGFsd2F5cyBiZSBjb25maWd1cmVkIHNvIGFzIHRvIGdldCBhIFBDTEsgZnJlcXVlbmN5IGdyZWF0ZXIgdGhhbiBvcgorICAqICAgICAgICAgICAgIGVxdWFsIHRvIHRoZSBSVENDTEsgZnJlcXVlbmN5IGZvciBhIHByb3BlciBvcGVyYXRpb24gb2YgdGhlIFJUQy4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1JUQ19DT05GSUcoX19SVENfQ0xLU09VUkNFX18pIE1PRElGWV9SRUcoUkNDLT5CRENSLCBSQ0NfQkRDUl9SVENTRUwsIChfX1JUQ19DTEtTT1VSQ0VfXykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qKiBAYnJpZWYgTWFjcm8gdG8gZ2V0IHRoZSBSVEMgY2xvY2sgc291cmNlLgorICAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19SVENDTEtTT1VSQ0VfTk9fQ0xLIE5vIGNsb2NrIHNlbGVjdGVkIGFzIFJUQyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19SVENDTEtTT1VSQ0VfTFNFIExTRSBzZWxlY3RlZCBhcyBSVEMgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUlRDQ0xLU09VUkNFX0xTSSBMU0kgc2VsZWN0ZWQgYXMgUlRDIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JUQ0NMS1NPVVJDRV9IU0VfRElWMzIgSFNFIGNsb2NrIGRpdmlkZWQgYnkgMzIKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9SVENfU09VUkNFKCkgKFJFQURfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfUlRDU0VMKSkKKworLyoqIEBicmllZiBNYWNybyB0byBlbmFibGUgdGhlIHRoZSBSVEMgY2xvY2suCisgICogQG5vdGUgICBUaGVzZSBtYWNyb3MgbXVzdCBiZSB1c2VkIG9ubHkgYWZ0ZXIgdGhlIFJUQyBjbG9jayBzb3VyY2Ugd2FzIHNlbGVjdGVkLgorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfUlRDX0VOQUJMRSgpICAgICAgICAgICgqKF9fSU8gdWludDMyX3QgKikgUkNDX0JEQ1JfUlRDRU5fQkIgPSBFTkFCTEUpCisKKy8qKiBAYnJpZWYgTWFjcm8gdG8gZGlzYWJsZSB0aGUgdGhlIFJUQyBjbG9jay4KKyAgKiBAbm90ZSAgVGhlc2UgbWFjcm9zIG11c3QgYmUgdXNlZCBvbmx5IGFmdGVyIHRoZSBSVEMgY2xvY2sgc291cmNlIHdhcyBzZWxlY3RlZC4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1JUQ19ESVNBQkxFKCkgICAgICAgICAoKihfX0lPIHVpbnQzMl90ICopIFJDQ19CRENSX1JUQ0VOX0JCID0gRElTQUJMRSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZm9yY2UgdGhlIEJhY2t1cCBkb21haW4gcmVzZXQuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgUlRDIHBlcmlwaGVyYWwgKGluY2x1ZGluZyB0aGUgYmFja3VwIHJlZ2lzdGVycykKKyAgKiAgICAgICAgIGFuZCB0aGUgUlRDIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24gaW4gUkNDX0JEQ1IgcmVnaXN0ZXIuCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19CQUNLVVBSRVNFVF9GT1JDRSgpICAgKCooX19JTyB1aW50MzJfdCAqKSBSQ0NfQkRDUl9CRFJTVF9CQiA9IEVOQUJMRSkKKworLyoqIEBicmllZiAgTWFjcm9zIHRvIHJlbGVhc2UgdGhlIEJhY2t1cCBkb21haW4gcmVzZXQuCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19CQUNLVVBSRVNFVF9SRUxFQVNFKCkgKCooX19JTyB1aW50MzJfdCAqKSBSQ0NfQkRDUl9CRFJTVF9CQiA9IERJU0FCTEUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0ZsYWdzX0ludGVycnVwdHNfTWFuYWdlbWVudCBGbGFncyBJbnRlcnJ1cHRzIE1hbmFnZW1lbnQKKyAgKiBAYnJpZWYgbWFjcm9zIHRvIG1hbmFnZSB0aGUgc3BlY2lmaWVkIFJDQyBGbGFncyBhbmQgaW50ZXJydXB0cy4KKyAgKiBAeworICAqLworCisvKiogQGJyaWVmIEVuYWJsZSBSQ0MgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJDQyBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBlbmFibGVkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0xTSVJEWSBMU0kgcmVhZHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0xTRVJEWSBMU0UgcmVhZHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0hTSVJEWSBIU0kgcmVhZHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0hTRVJEWSBIU0UgcmVhZHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX1BMTFJEWSBtYWluIFBMTCByZWFkeSBpbnRlcnJ1cHQKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0VOQUJMRV9JVChfX0lOVEVSUlVQVF9fKSAoKihfX0lPIHVpbnQ4X3QgKikgUkNDX0NJUl9CWVRFMV9BRERSRVNTIHw9IChfX0lOVEVSUlVQVF9fKSkKKworLyoqIEBicmllZiBEaXNhYmxlIFJDQyBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgUkNDIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGRpc2FibGVkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0xTSVJEWSBMU0kgcmVhZHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0xTRVJEWSBMU0UgcmVhZHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0hTSVJEWSBIU0kgcmVhZHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0hTRVJEWSBIU0UgcmVhZHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX1BMTFJEWSBtYWluIFBMTCByZWFkeSBpbnRlcnJ1cHQKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0RJU0FCTEVfSVQoX19JTlRFUlJVUFRfXykgKCooX19JTyB1aW50OF90ICopIFJDQ19DSVJfQllURTFfQUREUkVTUyAmPSAodWludDhfdCkofihfX0lOVEVSUlVQVF9fKSkpCisKKy8qKiBAYnJpZWYgQ2xlYXIgdGhlIFJDQydzIGludGVycnVwdCBwZW5kaW5nIGJpdHMuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0xTSVJEWSBMU0kgcmVhZHkgaW50ZXJydXB0LgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9MU0VSRFkgTFNFIHJlYWR5IGludGVycnVwdC4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfSFNJUkRZIEhTSSByZWFkeSBpbnRlcnJ1cHQuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0hTRVJEWSBIU0UgcmVhZHkgaW50ZXJydXB0LgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9QTExSRFkgTWFpbiBQTEwgcmVhZHkgaW50ZXJydXB0LgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9DU1MgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIGludGVycnVwdAorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfQ0xFQVJfSVQoX19JTlRFUlJVUFRfXykgKCooX19JTyB1aW50OF90ICopIFJDQ19DSVJfQllURTJfQUREUkVTUyA9IChfX0lOVEVSUlVQVF9fKSkKKworLyoqIEBicmllZiBDaGVjayB0aGUgUkNDJ3MgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgUkNDIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfTFNJUkRZIExTSSByZWFkeSBpbnRlcnJ1cHQuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0xTRVJEWSBMU0UgcmVhZHkgaW50ZXJydXB0LgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9IU0lSRFkgSFNJIHJlYWR5IGludGVycnVwdC4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfSFNFUkRZIEhTRSByZWFkeSBpbnRlcnJ1cHQuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX1BMTFJEWSBNYWluIFBMTCByZWFkeSBpbnRlcnJ1cHQuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0NTUyBDbG9jayBTZWN1cml0eSBTeXN0ZW0gaW50ZXJydXB0CisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fSU5URVJSVVBUX18gKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX0lUKF9fSU5URVJSVVBUX18pICgoUkNDLT5DSVIgJiAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSkKKworLyoqIEBicmllZiBTZXQgUk1WRiBiaXQgdG8gY2xlYXIgdGhlIHJlc2V0IGZsYWdzLgorICAqICAgICAgICAgVGhlIHJlc2V0IGZsYWdzIGFyZSBSQ0NfRkxBR19QSU5SU1QsIFJDQ19GTEFHX1BPUlJTVCwgUkNDX0ZMQUdfU0ZUUlNULAorICAqICAgICAgICAgUkNDX0ZMQUdfT0JMUlNULCBSQ0NfRkxBR19JV0RHUlNULCBSQ0NfRkxBR19XV0RHUlNULCBSQ0NfRkxBR19MUFdSUlNUCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19DTEVBUl9SRVNFVF9GTEFHUygpICgqKF9fSU8gdWludDMyX3QgKilSQ0NfQ1NSX1JNVkZfQkIgPSBFTkFCTEUpCisKKy8qKiBAYnJpZWYgIENoZWNrIFJDQyBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19IU0lSRFkgSFNJIG9zY2lsbGF0b3IgY2xvY2sgcmVhZHkuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfSFNFUkRZIEhTRSBvc2NpbGxhdG9yIGNsb2NrIHJlYWR5LgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19GTEFHX1BMTFJEWSBNYWluIFBMTCBjbG9jayByZWFkeS4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19MU0VSRFkgTFNFIG9zY2lsbGF0b3IgY2xvY2sgcmVhZHkuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfTFNJUkRZIExTSSBvc2NpbGxhdG9yIGNsb2NrIHJlYWR5LgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19GTEFHX09CTFJTVCBPcHRpb24gQnl0ZSBMb2FkIHJlc2V0CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfUElOUlNUICBQaW4gcmVzZXQuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfUE9SUlNUICBQT1IvUERSIHJlc2V0LgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19GTEFHX1NGVFJTVCAgU29mdHdhcmUgcmVzZXQuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfSVdER1JTVCBJbmRlcGVuZGVudCBXYXRjaGRvZyByZXNldC4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19XV0RHUlNUIFdpbmRvdyBXYXRjaGRvZyByZXNldC4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19MUFdSUlNUIExvdyBQb3dlciByZXNldC4KKyAgQGlmIGRlZmluZWQoU1RNMzJGMzAxeDgpCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfVjE4UFdSUlNUIFJlc2V0IGZsYWcgb2YgdGhlIDEuOCBWIGRvbWFpbgorICBAZW5kaWYKKyAgQGlmIGRlZmluZWQoU1RNMzJGMzAyeDgpCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfVjE4UFdSUlNUIFJlc2V0IGZsYWcgb2YgdGhlIDEuOCBWIGRvbWFpbgorICBAZW5kaWYKKyAgQGlmIGRlZmluZWQoU1RNMzJGMzAyeEMpCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfVjE4UFdSUlNUIFJlc2V0IGZsYWcgb2YgdGhlIDEuOCBWIGRvbWFpbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19GTEFHX01DTyAgICAgICBNaWNyb2NvbnRyb2xsZXIgQ2xvY2sgT3V0cHV0CisgIEBlbmRpZgorICBAaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19WMThQV1JSU1QgUmVzZXQgZmxhZyBvZiB0aGUgMS44IFYgZG9tYWluCisgIEBlbmRpZgorICBAaWYgZGVmaW5lZChTVE0zMkYzMDN4OCkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19WMThQV1JSU1QgUmVzZXQgZmxhZyBvZiB0aGUgMS44IFYgZG9tYWluCisgIEBlbmRpZgorICBAaWYgZGVmaW5lZChTVE0zMkYzMDN4QykKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19WMThQV1JSU1QgUmVzZXQgZmxhZyBvZiB0aGUgMS44IFYgZG9tYWluCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfTUNPICAgICAgIE1pY3JvY29udHJvbGxlciBDbG9jayBPdXRwdXQKKyAgQGVuZGlmCisgIEBpZiBkZWZpbmVkKFNUTTMyRjMwM3hFKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19GTEFHX1YxOFBXUlJTVCBSZXNldCBmbGFnIG9mIHRoZSAxLjggViBkb21haW4KKyAgQGVuZGlmCisgIEBpZiBkZWZpbmVkKFNUTTMyRjMzNHg4KQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19GTEFHX1YxOFBXUlJTVCBSZXNldCBmbGFnIG9mIHRoZSAxLjggViBkb21haW4KKyAgQGVuZGlmCisgIEBpZiBkZWZpbmVkKFNUTTMyRjM1OHh4KQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19GTEFHX01DTyAgICAgICBNaWNyb2NvbnRyb2xsZXIgQ2xvY2sgT3V0cHV0CisgIEBlbmRpZgorICBAaWYgZGVmaW5lZChTVE0zMkYzNzN4QykKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19WMThQV1JSU1QgUmVzZXQgZmxhZyBvZiB0aGUgMS44IFYgZG9tYWluCisgIEBlbmRpZgorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfRkxBRyhfX0ZMQUdfXykgKCgoKChfX0ZMQUdfXykgPj4gNVUpID09IENSX1JFR19JTkRFWCkgID8gUkNDLT5DUiAgIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19GTEFHX18pID4+IDVVKSA9PSBCRENSX1JFR19JTkRFWCk/IFJDQy0+QkRDUiA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fRkxBR19fKSA+PiA1VSkgPT0gQ0ZHUl9SRUdfSU5ERVgpPyBSQ0MtPkNGR1IgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0MtPkNTUikgJiAoMVUgPDwgKChfX0ZMQUdfXykgJiBSQ0NfRkxBR19NQVNLKSkpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEluY2x1ZGUgUkNDIEhBTCBFeHRlbnNpb24gbW9kdWxlICovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9yY2NfZXguaCIKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBSQ0NfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFJDQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgICogQHsKKyAgKi8KKworLyogSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JDQ19EZUluaXQodm9pZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUkNDX09zY0NvbmZpZyhSQ0NfT3NjSW5pdFR5cGVEZWYgICpSQ0NfT3NjSW5pdFN0cnVjdCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUkNDX0Nsb2NrQ29uZmlnKFJDQ19DbGtJbml0VHlwZURlZiAgKlJDQ19DbGtJbml0U3RydWN0LCB1aW50MzJfdCBGTGF0ZW5jeSk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBSQ0NfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICAqIEB7CisgICovCisKKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgICAgICAgICAgICAgIEhBTF9SQ0NfTUNPQ29uZmlnKHVpbnQzMl90IFJDQ19NQ094LCB1aW50MzJfdCBSQ0NfTUNPU291cmNlLCB1aW50MzJfdCBSQ0NfTUNPRGl2KTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SQ0NfRW5hYmxlQ1NTKHZvaWQpOworLyogQ1NTIE5NSSBJUlEgaGFuZGxlciAqLwordm9pZCAgICAgICAgICAgICAgSEFMX1JDQ19OTUlfSVJRSGFuZGxlcih2b2lkKTsKKy8qIFVzZXIgQ2FsbGJhY2tzIGluIG5vbiBibG9ja2luZyBtb2RlIChJVCBtb2RlKSAqLwordm9pZCAgICAgICAgICAgICAgSEFMX1JDQ19DU1NDYWxsYmFjayh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SQ0NfRGlzYWJsZUNTUyh2b2lkKTsKK3VpbnQzMl90ICAgICAgICAgIEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKHZvaWQpOwordWludDMyX3QgICAgICAgICAgSEFMX1JDQ19HZXRIQ0xLRnJlcSh2b2lkKTsKK3VpbnQzMl90ICAgICAgICAgIEhBTF9SQ0NfR2V0UENMSzFGcmVxKHZvaWQpOwordWludDMyX3QgICAgICAgICAgSEFMX1JDQ19HZXRQQ0xLMkZyZXEodm9pZCk7Cit2b2lkICAgICAgICAgICAgICBIQUxfUkNDX0dldE9zY0NvbmZpZyhSQ0NfT3NjSW5pdFR5cGVEZWYgICpSQ0NfT3NjSW5pdFN0cnVjdCk7Cit2b2lkICAgICAgICAgICAgICBIQUxfUkNDX0dldENsb2NrQ29uZmlnKFJDQ19DbGtJbml0VHlwZURlZiAgKlJDQ19DbGtJbml0U3RydWN0LCB1aW50MzJfdCAqcEZMYXRlbmN5KTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyAgCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkYzeHhfSEFMX1JDQ19IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCisKZGlmZiAtLWdpdCBhL0luYy9zdG0zMmYzeHhfaGFsX3JjY19leC5oIGIvSW5jL3N0bTMyZjN4eF9oYWxfcmNjX2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFkZjQ0YgotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmYzeHhfaGFsX3JjY19leC5oCkBAIC0wLDAgKzEsMzg0MyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfcmNjX2V4LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFJDQyBIQUwgRXh0ZW5zaW9uIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0hBTF9SQ0NfRVhfSAorI2RlZmluZSBfX1NUTTMyRjN4eF9IQUxfUkNDX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgUkNDRXgKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgUkNDRXhfUHJpdmF0ZV9NYWNyb3MKKyAqIEB7CisgKi8KKworI2lmIGRlZmluZWQoUkNDX0NGR1JfUExMTk9ESVYpCisjZGVmaW5lIElTX1JDQ19NQ08xU09VUkNFKFNPVVJDRSkgICgoKFNPVVJDRSkgPT0gUkNDX01DTzFTT1VSQ0VfTk9DTE9DSykgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFJDQ19NQ08xU09VUkNFX0xTSSkgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBSQ0NfTUNPMVNPVVJDRV9MU0UpICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gUkNDX01DTzFTT1VSQ0VfU1lTQ0xLKSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFJDQ19NQ08xU09VUkNFX0hTSSkgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBSQ0NfTUNPMVNPVVJDRV9IU0UpICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gUkNDX01DTzFTT1VSQ0VfUExMQ0xLKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBSQ0NfTUNPMVNPVVJDRV9QTExDTEtfRElWMikpCisjZWxzZQorI2RlZmluZSBJU19SQ0NfTUNPMVNPVVJDRShTT1VSQ0UpICAoKChTT1VSQ0UpID09IFJDQ19NQ08xU09VUkNFX05PQ0xPQ0spICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFJDQ19NQ08xU09VUkNFX0xTSSkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFJDQ19NQ08xU09VUkNFX0xTRSkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFJDQ19NQ08xU09VUkNFX1NZU0NMSykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFJDQ19NQ08xU09VUkNFX0hTSSkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFJDQ19NQ08xU09VUkNFX0hTRSkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFJDQ19NQ08xU09VUkNFX1BMTENMS19ESVYyKSkKKyNlbmRpZiAvKiBSQ0NfQ0ZHUl9QTExOT0RJViAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKyNkZWZpbmUgSVNfUkNDX1BFUklQSENMT0NLKFNFTEVDVElPTikgKChTRUxFQ1RJT04pIDw9IChSQ0NfUEVSSVBIQ0xLX1VTQVJUMSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUEVSSVBIQ0xLX0kyQzEgICB8IFJDQ19QRVJJUEhDTEtfSTJDMiAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfQURDMSAgIHwgUkNDX1BFUklQSENMS19JMlMgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19JMkMzICAgfCBSQ0NfUEVSSVBIQ0xLX1RJTTEgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUEVSSVBIQ0xLX1RJTTE1ICB8IFJDQ19QRVJJUEhDTEtfVElNMTYgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfVElNMTcgIHwgUkNDX1BFUklQSENMS19SVEMpKQorI2VuZGlmIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMxOHh4ICovCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4OCkKKyNkZWZpbmUgSVNfUkNDX1BFUklQSENMT0NLKFNFTEVDVElPTikgKChTRUxFQ1RJT04pIDw9IChSQ0NfUEVSSVBIQ0xLX1VTQVJUMSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUEVSSVBIQ0xLX0kyQzEgICB8IFJDQ19QRVJJUEhDTEtfSTJDMiAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfQURDMSAgIHwgUkNDX1BFUklQSENMS19JMlMgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19JMkMzICAgfCBSQ0NfUEVSSVBIQ0xLX1RJTTEgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUEVSSVBIQ0xLX1JUQyAgICB8IFJDQ19QRVJJUEhDTEtfVVNCICAgIHwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUEVSSVBIQ0xLX1RJTTE1ICB8IFJDQ19QRVJJUEhDTEtfVElNMTYgIHwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUEVSSVBIQ0xLX1RJTTE3KSkKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4OCAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEMpCisjZGVmaW5lIElTX1JDQ19QRVJJUEhDTE9DSyhTRUxFQ1RJT04pICgoU0VMRUNUSU9OKSA8PSAoUkNDX1BFUklQSENMS19VU0FSVDEgfCBSQ0NfUEVSSVBIQ0xLX1VTQVJUMiB8IFJDQ19QRVJJUEhDTEtfVVNBUlQzIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUEVSSVBIQ0xLX1VBUlQ0ICB8IFJDQ19QRVJJUEhDTEtfVUFSVDUgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUEVSSVBIQ0xLX0kyQzEgICB8IFJDQ19QRVJJUEhDTEtfSTJDMiAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUEVSSVBIQ0xLX0FEQzEyICB8IFJDQ19QRVJJUEhDTEtfSTJTICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUEVSSVBIQ0xLX1RJTTEgICB8IFJDQ19QRVJJUEhDTEtfUlRDICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUEVSSVBIQ0xLX1VTQikpCisjZW5kaWYgLyogU1RNMzJGMzAyeEMgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3hDKQorI2RlZmluZSBJU19SQ0NfUEVSSVBIQ0xPQ0soU0VMRUNUSU9OKSAoKFNFTEVDVElPTikgPD0gKFJDQ19QRVJJUEhDTEtfVVNBUlQxIHwgUkNDX1BFUklQSENMS19VU0FSVDIgfCBSQ0NfUEVSSVBIQ0xLX1VTQVJUMyB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19VQVJUNCAgfCBSQ0NfUEVSSVBIQ0xLX1VBUlQ1ICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19JMkMxICAgfCBSQ0NfUEVSSVBIQ0xLX0kyQzIgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19BREMxMiAgfCBSQ0NfUEVSSVBIQ0xLX0FEQzM0ICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19JMlMgICAgfCBSQ0NfUEVSSVBIQ0xLX1RJTTEgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19USU04ICAgfCBSQ0NfUEVSSVBIQ0xLX1JUQyAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19VU0IpKQorI2VuZGlmIC8qIFNUTTMyRjMwM3hDICovCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkKKyNkZWZpbmUgSVNfUkNDX1BFUklQSENMT0NLKFNFTEVDVElPTikgKChTRUxFQ1RJT04pIDw9IChSQ0NfUEVSSVBIQ0xLX1VTQVJUMSB8IFJDQ19QRVJJUEhDTEtfVVNBUlQyIHwgUkNDX1BFUklQSENMS19VU0FSVDMgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfVUFSVDQgIHwgUkNDX1BFUklQSENMS19VQVJUNSAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfSTJDMSAgIHwgUkNDX1BFUklQSENMS19JMkMyICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfQURDMTIgIHwgUkNDX1BFUklQSENMS19JMlMgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfVElNMSAgIHwgUkNDX1BFUklQSENMS19SVEMgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfVVNCICAgIHwgUkNDX1BFUklQSENMS19JMkMzICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfVElNMiAgIHwgUkNDX1BFUklQSENMS19USU0zNCAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfVElNMTUgIHwgUkNDX1BFUklQSENMS19USU0xNiAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfVElNMTcpKQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFICovCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkKKyNkZWZpbmUgSVNfUkNDX1BFUklQSENMT0NLKFNFTEVDVElPTikgKChTRUxFQ1RJT04pIDw9IChSQ0NfUEVSSVBIQ0xLX1VTQVJUMSB8IFJDQ19QRVJJUEhDTEtfVVNBUlQyIHwgUkNDX1BFUklQSENMS19VU0FSVDMgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfVUFSVDQgIHwgUkNDX1BFUklQSENMS19VQVJUNSAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfSTJDMSAgIHwgUkNDX1BFUklQSENMS19JMkMyICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfQURDMTIgIHwgUkNDX1BFUklQSENMS19BREMzNCAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfSTJTICAgIHwgUkNDX1BFUklQSENMS19USU0xICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfVElNOCAgIHwgUkNDX1BFUklQSENMS19SVEMgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfVVNCICAgIHwgUkNDX1BFUklQSENMS19JMkMzICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfVElNMiAgIHwgUkNDX1BFUklQSENMS19USU0zNCAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfVElNMTUgIHwgUkNDX1BFUklQSENMS19USU0xNiAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfVElNMTcgIHwgUkNDX1BFUklQSENMS19USU0yMCkpCisjZW5kaWYgLyogU1RNMzJGMzAzeEUgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjM5OHh4KQorI2RlZmluZSBJU19SQ0NfUEVSSVBIQ0xPQ0soU0VMRUNUSU9OKSAoKFNFTEVDVElPTikgPD0gKFJDQ19QRVJJUEhDTEtfVVNBUlQxIHwgUkNDX1BFUklQSENMS19VU0FSVDIgfCBSQ0NfUEVSSVBIQ0xLX1VTQVJUMyB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19VQVJUNCAgfCBSQ0NfUEVSSVBIQ0xLX1VBUlQ1ICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19JMkMxICAgfCBSQ0NfUEVSSVBIQ0xLX0kyQzIgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19BREMxMiAgfCBSQ0NfUEVSSVBIQ0xLX0FEQzM0ICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19JMlMgICAgfCBSQ0NfUEVSSVBIQ0xLX1RJTTEgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19USU04ICAgfCBSQ0NfUEVSSVBIQ0xLX1JUQyAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19JMkMzICAgfCBSQ0NfUEVSSVBIQ0xLX1RJTTIgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19USU0zNCAgfCBSQ0NfUEVSSVBIQ0xLX1RJTTE1ICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19USU0xNiAgfCBSQ0NfUEVSSVBIQ0xLX1RJTTE3ICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19USU0yMCkpCisjZW5kaWYgLyogU1RNMzJGMzk4eHggKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjM1OHh4KQorI2RlZmluZSBJU19SQ0NfUEVSSVBIQ0xPQ0soU0VMRUNUSU9OKSAoKFNFTEVDVElPTikgPD0gKFJDQ19QRVJJUEhDTEtfVVNBUlQxIHwgUkNDX1BFUklQSENMS19VU0FSVDIgfCBSQ0NfUEVSSVBIQ0xLX1VTQVJUMyB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19VQVJUNCAgfCBSQ0NfUEVSSVBIQ0xLX1VBUlQ1ICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19JMkMxICAgfCBSQ0NfUEVSSVBIQ0xLX0kyQzIgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19BREMxMiAgfCBSQ0NfUEVSSVBIQ0xLX0FEQzM0ICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19JMlMgICAgfCBSQ0NfUEVSSVBIQ0xLX1RJTTEgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19USU04ICAgfCBSQ0NfUEVSSVBIQ0xLX1JUQykpCisjZW5kaWYgLyogU1RNMzJGMzU4eHggKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3g4KQorI2RlZmluZSBJU19SQ0NfUEVSSVBIQ0xPQ0soU0VMRUNUSU9OKSAoKFNFTEVDVElPTikgPD0gKFJDQ19QRVJJUEhDTEtfVVNBUlQxIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfSTJDMSAgIHwgUkNDX1BFUklQSENMS19BREMxMiAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19USU0xICAgfCBSQ0NfUEVSSVBIQ0xLX1JUQykpCisjZW5kaWYgLyogU1RNMzJGMzAzeDggKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjMzNHg4KQorI2RlZmluZSBJU19SQ0NfUEVSSVBIQ0xPQ0soU0VMRUNUSU9OKSAoKFNFTEVDVElPTikgPD0gKFJDQ19QRVJJUEhDTEtfVVNBUlQxIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfSTJDMSAgIHwgUkNDX1BFUklQSENMS19BREMxMiAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19USU0xICAgfCBSQ0NfUEVSSVBIQ0xLX0hSVElNMSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUEVSSVBIQ0xLX1JUQykpCisjZW5kaWYgLyogU1RNMzJGMzM0eDggKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjMyOHh4KQorI2RlZmluZSBJU19SQ0NfUEVSSVBIQ0xPQ0soU0VMRUNUSU9OKSAoKFNFTEVDVElPTikgPD0gKFJDQ19QRVJJUEhDTEtfVVNBUlQxIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfSTJDMSAgIHwgUkNDX1BFUklQSENMS19BREMxMiAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19USU0xICAgfCBSQ0NfUEVSSVBIQ0xLX1JUQykpCisjZW5kaWYgLyogU1RNMzJGMzI4eHggKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKQorI2RlZmluZSBJU19SQ0NfUEVSSVBIQ0xPQ0soU0VMRUNUSU9OKSAoKFNFTEVDVElPTikgPD0gKFJDQ19QRVJJUEhDTEtfVVNBUlQxIHwgUkNDX1BFUklQSENMS19VU0FSVDIgfCBSQ0NfUEVSSVBIQ0xLX1VTQVJUMyB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19JMkMxICAgfCBSQ0NfUEVSSVBIQ0xLX0kyQzIgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19BREMxICAgfCBSQ0NfUEVSSVBIQ0xLX1NEQURDICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19DRUMgICAgfCBSQ0NfUEVSSVBIQ0xLX1JUQyAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19VU0IpKQorI2VuZGlmIC8qIFNUTTMyRjM3M3hDICovCisjaWYgZGVmaW5lZChTVE0zMkYzNzh4eCkKKyNkZWZpbmUgSVNfUkNDX1BFUklQSENMT0NLKFNFTEVDVElPTikgKChTRUxFQ1RJT04pIDw9IChSQ0NfUEVSSVBIQ0xLX1VTQVJUMSB8IFJDQ19QRVJJUEhDTEtfVVNBUlQyIHwgUkNDX1BFUklQSENMS19VU0FSVDMgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfSTJDMSAgIHwgUkNDX1BFUklQSENMS19JMkMyICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfQURDMSAgIHwgUkNDX1BFUklQSENMS19TREFEQyAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfQ0VDICAgIHwgUkNDX1BFUklQSENMS19SVEMpKQorI2VuZGlmIC8qIFNUTTMyRjM3OHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorI2RlZmluZSBJU19SQ0NfVVNBUlQxQ0xLU09VUkNFKFNPVVJDRSkgICgoKFNPVVJDRSkgPT0gUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0xTRSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0kpKQorI2RlZmluZSBJU19SQ0NfSTJDMkNMS1NPVVJDRShTT1VSQ0UpICAoKChTT1VSQ0UpID09IFJDQ19JMkMyQ0xLU09VUkNFX0hTSSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFJDQ19JMkMyQ0xLU09VUkNFX1NZU0NMSykpCisjZGVmaW5lIElTX1JDQ19JMkMzQ0xLU09VUkNFKFNPVVJDRSkgICgoKFNPVVJDRSkgPT0gUkNDX0kyQzNDTEtTT1VSQ0VfSFNJKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gUkNDX0kyQzNDTEtTT1VSQ0VfU1lTQ0xLKSkKKyNkZWZpbmUgSVNfUkNDX0FEQzFQTExDTEtfRElWKEFEQ0NMSykgKCgoQURDQ0xLKSA9PSBSQ0NfQURDMVBMTENMS19PRkYpICAgfHwgKChBRENDTEspID09IFJDQ19BREMxUExMQ0xLX0RJVjEpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRENDTEspID09IFJDQ19BREMxUExMQ0xLX0RJVjIpICB8fCAoKEFEQ0NMSykgPT0gUkNDX0FEQzFQTExDTEtfRElWNCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ0NMSykgPT0gUkNDX0FEQzFQTExDTEtfRElWNikgIHx8ICgoQURDQ0xLKSA9PSBSQ0NfQURDMVBMTENMS19ESVY4KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDQ0xLKSA9PSBSQ0NfQURDMVBMTENMS19ESVYxMCkgfHwgKChBRENDTEspID09IFJDQ19BREMxUExMQ0xLX0RJVjEyKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRENDTEspID09IFJDQ19BREMxUExMQ0xLX0RJVjE2KSB8fCAoKEFEQ0NMSykgPT0gUkNDX0FEQzFQTExDTEtfRElWMzIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ0NMSykgPT0gUkNDX0FEQzFQTExDTEtfRElWNjQpIHx8ICgoQURDQ0xLKSA9PSBSQ0NfQURDMVBMTENMS19ESVYxMjgpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDQ0xLKSA9PSBSQ0NfQURDMVBMTENMS19ESVYyNTYpKQorI2RlZmluZSBJU19SQ0NfSTJTQ0xLU09VUkNFKFNPVVJDRSkgICgoKFNPVVJDRSkgPT0gUkNDX0kyU0NMS1NPVVJDRV9TWVNDTEspIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFJDQ19JMlNDTEtTT1VSQ0VfRVhUKSkKKyNkZWZpbmUgSVNfUkNDX1RJTTFDTEtTT1VSQ0UoU09VUkNFKSAoKChTT1VSQ0UpID09IFJDQ19USU0xQ0xLX0hDTEspIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFJDQ19USU0xQ0xLX1BMTENMSykpCisjZGVmaW5lIElTX1JDQ19USU0xNUNMS1NPVVJDRShTT1VSQ0UpICgoKFNPVVJDRSkgPT0gUkNDX1RJTTE1Q0xLX0hDTEspIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBSQ0NfVElNMTVDTEtfUExMQ0xLKSkKKyNkZWZpbmUgSVNfUkNDX1RJTTE2Q0xLU09VUkNFKFNPVVJDRSkgKCgoU09VUkNFKSA9PSBSQ0NfVElNMTZDTEtfSENMSykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFJDQ19USU0xNkNMS19QTExDTEspKQorI2RlZmluZSBJU19SQ0NfVElNMTdDTEtTT1VSQ0UoU09VUkNFKSAoKChTT1VSQ0UpID09IFJDQ19USU0xN0NMS19IQ0xLKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gUkNDX1RJTTE3Q0xLX1BMTENMSykpCisjZW5kaWYgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorI2RlZmluZSBJU19SQ0NfVVNBUlQxQ0xLU09VUkNFKFNPVVJDRSkgICgoKFNPVVJDRSkgPT0gUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0xTRSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0kpKQorI2RlZmluZSBJU19SQ0NfSTJDMkNMS1NPVVJDRShTT1VSQ0UpICAoKChTT1VSQ0UpID09IFJDQ19JMkMyQ0xLU09VUkNFX0hTSSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFJDQ19JMkMyQ0xLU09VUkNFX1NZU0NMSykpCisjZGVmaW5lIElTX1JDQ19BREMxMlBMTENMS19ESVYoQURDQ0xLKSAoKChBRENDTEspID09IFJDQ19BREMxMlBMTENMS19PRkYpICAgfHwgKChBRENDTEspID09IFJDQ19BREMxMlBMTENMS19ESVYxKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ0NMSykgPT0gUkNDX0FEQzEyUExMQ0xLX0RJVjIpICB8fCAoKEFEQ0NMSykgPT0gUkNDX0FEQzEyUExMQ0xLX0RJVjQpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDQ0xLKSA9PSBSQ0NfQURDMTJQTExDTEtfRElWNikgIHx8ICgoQURDQ0xLKSA9PSBSQ0NfQURDMTJQTExDTEtfRElWOCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRENDTEspID09IFJDQ19BREMxMlBMTENMS19ESVYxMCkgfHwgKChBRENDTEspID09IFJDQ19BREMxMlBMTENMS19ESVYxMikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ0NMSykgPT0gUkNDX0FEQzEyUExMQ0xLX0RJVjE2KSB8fCAoKEFEQ0NMSykgPT0gUkNDX0FEQzEyUExMQ0xLX0RJVjMyKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDQ0xLKSA9PSBSQ0NfQURDMTJQTExDTEtfRElWNjQpIHx8ICgoQURDQ0xLKSA9PSBSQ0NfQURDMTJQTExDTEtfRElWMTI4KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRENDTEspID09IFJDQ19BREMxMlBMTENMS19ESVYyNTYpKQorI2RlZmluZSBJU19SQ0NfSTJTQ0xLU09VUkNFKFNPVVJDRSkgICgoKFNPVVJDRSkgPT0gUkNDX0kyU0NMS1NPVVJDRV9TWVNDTEspIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFJDQ19JMlNDTEtTT1VSQ0VfRVhUKSkKKyNkZWZpbmUgSVNfUkNDX1RJTTFDTEtTT1VSQ0UoU09VUkNFKSAoKChTT1VSQ0UpID09IFJDQ19USU0xQ0xLX0hDTEspIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFJDQ19USU0xQ0xLX1BMTENMSykpCisjZGVmaW5lIElTX1JDQ19VQVJUNENMS1NPVVJDRShTT1VSQ0UpICAoKChTT1VSQ0UpID09IFJDQ19VQVJUNENMS1NPVVJDRV9QQ0xLMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gUkNDX1VBUlQ0Q0xLU09VUkNFX1NZU0NMSykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBSQ0NfVUFSVDRDTEtTT1VSQ0VfTFNFKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFJDQ19VQVJUNENMS1NPVVJDRV9IU0kpKQorI2RlZmluZSBJU19SQ0NfVUFSVDVDTEtTT1VSQ0UoU09VUkNFKSAgKCgoU09VUkNFKSA9PSBSQ0NfVUFSVDVDTEtTT1VSQ0VfUENMSzEpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFJDQ19VQVJUNUNMS1NPVVJDRV9TWVNDTEspIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gUkNDX1VBUlQ1Q0xLU09VUkNFX0xTRSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBSQ0NfVUFSVDVDTEtTT1VSQ0VfSFNJKSkKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisjZGVmaW5lIElTX1JDQ19VU0FSVDFDTEtTT1VSQ0UoU09VUkNFKSAgKCgoU09VUkNFKSA9PSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsyKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gUkNDX1VTQVJUMUNMS1NPVVJDRV9TWVNDTEspIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFJDQ19VU0FSVDFDTEtTT1VSQ0VfTFNFKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0hTSSkpCisjZGVmaW5lIElTX1JDQ19JMkMyQ0xLU09VUkNFKFNPVVJDRSkgICgoKFNPVVJDRSkgPT0gUkNDX0kyQzJDTEtTT1VSQ0VfSFNJKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gUkNDX0kyQzJDTEtTT1VSQ0VfU1lTQ0xLKSkKKyNkZWZpbmUgSVNfUkNDX0kyQzNDTEtTT1VSQ0UoU09VUkNFKSAgKCgoU09VUkNFKSA9PSBSQ0NfSTJDM0NMS1NPVVJDRV9IU0kpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBSQ0NfSTJDM0NMS1NPVVJDRV9TWVNDTEspKQorI2RlZmluZSBJU19SQ0NfQURDMTJQTExDTEtfRElWKEFEQ0NMSykgKCgoQURDQ0xLKSA9PSBSQ0NfQURDMTJQTExDTEtfT0ZGKSAgIHx8ICgoQURDQ0xLKSA9PSBSQ0NfQURDMTJQTExDTEtfRElWMSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRENDTEspID09IFJDQ19BREMxMlBMTENMS19ESVYyKSAgfHwgKChBRENDTEspID09IFJDQ19BREMxMlBMTENMS19ESVY0KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ0NMSykgPT0gUkNDX0FEQzEyUExMQ0xLX0RJVjYpICB8fCAoKEFEQ0NMSykgPT0gUkNDX0FEQzEyUExMQ0xLX0RJVjgpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDQ0xLKSA9PSBSQ0NfQURDMTJQTExDTEtfRElWMTApIHx8ICgoQURDQ0xLKSA9PSBSQ0NfQURDMTJQTExDTEtfRElWMTIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRENDTEspID09IFJDQ19BREMxMlBMTENMS19ESVYxNikgfHwgKChBRENDTEspID09IFJDQ19BREMxMlBMTENMS19ESVYzMikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ0NMSykgPT0gUkNDX0FEQzEyUExMQ0xLX0RJVjY0KSB8fCAoKEFEQ0NMSykgPT0gUkNDX0FEQzEyUExMQ0xLX0RJVjEyOCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDQ0xLKSA9PSBSQ0NfQURDMTJQTExDTEtfRElWMjU2KSkKKyNkZWZpbmUgSVNfUkNDX0kyU0NMS1NPVVJDRShTT1VSQ0UpICAoKChTT1VSQ0UpID09IFJDQ19JMlNDTEtTT1VSQ0VfU1lTQ0xLKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBSQ0NfSTJTQ0xLU09VUkNFX0VYVCkpCisjZGVmaW5lIElTX1JDQ19USU0xQ0xLU09VUkNFKFNPVVJDRSkgKCgoU09VUkNFKSA9PSBSQ0NfVElNMUNMS19IQ0xLKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBSQ0NfVElNMUNMS19QTExDTEspKQorI2RlZmluZSBJU19SQ0NfVElNMkNMS1NPVVJDRShTT1VSQ0UpICgoKFNPVVJDRSkgPT0gUkNDX1RJTTJDTEtfSENMSykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gUkNDX1RJTTJDTEtfUExMQ0xLKSkKKyNkZWZpbmUgSVNfUkNDX1RJTTNDTEtTT1VSQ0UoU09VUkNFKSAoKChTT1VSQ0UpID09IFJDQ19USU0zNENMS19IQ0xLKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBSQ0NfVElNMzRDTEtfUExMQ0xLKSkKKyNkZWZpbmUgSVNfUkNDX1RJTTE1Q0xLU09VUkNFKFNPVVJDRSkgKCgoU09VUkNFKSA9PSBSQ0NfVElNMTVDTEtfSENMSykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gUkNDX1RJTTE1Q0xLX1BMTENMSykpCisjZGVmaW5lIElTX1JDQ19USU0xNkNMS1NPVVJDRShTT1VSQ0UpICgoKFNPVVJDRSkgPT0gUkNDX1RJTTE2Q0xLX0hDTEspIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFJDQ19USU0xNkNMS19QTExDTEspKQorI2RlZmluZSBJU19SQ0NfVElNMTdDTEtTT1VSQ0UoU09VUkNFKSAoKChTT1VSQ0UpID09IFJDQ19USU0xN0NMS19IQ0xLKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBSQ0NfVElNMTdDTEtfUExMQ0xLKSkKKyNkZWZpbmUgSVNfUkNDX1VBUlQ0Q0xLU09VUkNFKFNPVVJDRSkgICgoKFNPVVJDRSkgPT0gUkNDX1VBUlQ0Q0xLU09VUkNFX1BDTEsxKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBSQ0NfVUFSVDRDTEtTT1VSQ0VfU1lTQ0xLKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFJDQ19VQVJUNENMS1NPVVJDRV9MU0UpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gUkNDX1VBUlQ0Q0xLU09VUkNFX0hTSSkpCisjZGVmaW5lIElTX1JDQ19VQVJUNUNMS1NPVVJDRShTT1VSQ0UpICAoKChTT1VSQ0UpID09IFJDQ19VQVJUNUNMS1NPVVJDRV9QQ0xLMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gUkNDX1VBUlQ1Q0xLU09VUkNFX1NZU0NMSykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBSQ0NfVUFSVDVDTEtTT1VSQ0VfTFNFKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFJDQ19VQVJUNUNMS1NPVVJDRV9IU0kpKQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4ICovCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgIGRlZmluZWQoU1RNMzJGMzk4eHgpCisjZGVmaW5lIElTX1JDQ19USU0yMENMS1NPVVJDRShTT1VSQ0UpICgoKFNPVVJDRSkgPT0gUkNDX1RJTTIwQ0xLX0hDTEspIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFJDQ19USU0yMENMS19QTExDTEspKQorI2VuZGlmIC8qIFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4ICovCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eClcCisgIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpCisjZGVmaW5lIElTX1JDQ19BREMzNFBMTENMS19ESVYoQURDQ0xLKSAoKChBRENDTEspID09IFJDQ19BREMzNFBMTENMS19PRkYpICAgfHwgKChBRENDTEspID09IFJDQ19BREMzNFBMTENMS19ESVYxKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ0NMSykgPT0gUkNDX0FEQzM0UExMQ0xLX0RJVjIpICB8fCAoKEFEQ0NMSykgPT0gUkNDX0FEQzM0UExMQ0xLX0RJVjQpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDQ0xLKSA9PSBSQ0NfQURDMzRQTExDTEtfRElWNikgIHx8ICgoQURDQ0xLKSA9PSBSQ0NfQURDMzRQTExDTEtfRElWOCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRENDTEspID09IFJDQ19BREMzNFBMTENMS19ESVYxMCkgfHwgKChBRENDTEspID09IFJDQ19BREMzNFBMTENMS19ESVYxMikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ0NMSykgPT0gUkNDX0FEQzM0UExMQ0xLX0RJVjE2KSB8fCAoKEFEQ0NMSykgPT0gUkNDX0FEQzM0UExMQ0xLX0RJVjMyKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDQ0xLKSA9PSBSQ0NfQURDMzRQTExDTEtfRElWNjQpIHx8ICgoQURDQ0xLKSA9PSBSQ0NfQURDMzRQTExDTEtfRElWMTI4KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRENDTEspID09IFJDQ19BREMzNFBMTENMS19ESVYyNTYpKQorI2RlZmluZSBJU19SQ0NfVElNOENMS1NPVVJDRShTT1VSQ0UpICgoKFNPVVJDRSkgPT0gUkNDX1RJTThDTEtfSENMSykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gUkNDX1RJTThDTEtfUExMQ0xLKSkKKyNlbmRpZiAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCBTVE0zMkYzNTh4eCAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpCisjZGVmaW5lIElTX1JDQ19VU0FSVDFDTEtTT1VSQ0UoU09VUkNFKSAgKCgoU09VUkNFKSA9PSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsxKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gUkNDX1VTQVJUMUNMS1NPVVJDRV9TWVNDTEspIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFJDQ19VU0FSVDFDTEtTT1VSQ0VfTFNFKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0hTSSkpCisjZGVmaW5lIElTX1JDQ19BREMxMlBMTENMS19ESVYoQURDQ0xLKSAoKChBRENDTEspID09IFJDQ19BREMxMlBMTENMS19PRkYpICAgfHwgKChBRENDTEspID09IFJDQ19BREMxMlBMTENMS19ESVYxKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ0NMSykgPT0gUkNDX0FEQzEyUExMQ0xLX0RJVjIpICB8fCAoKEFEQ0NMSykgPT0gUkNDX0FEQzEyUExMQ0xLX0RJVjQpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDQ0xLKSA9PSBSQ0NfQURDMTJQTExDTEtfRElWNikgIHx8ICgoQURDQ0xLKSA9PSBSQ0NfQURDMTJQTExDTEtfRElWOCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRENDTEspID09IFJDQ19BREMxMlBMTENMS19ESVYxMCkgfHwgKChBRENDTEspID09IFJDQ19BREMxMlBMTENMS19ESVYxMikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ0NMSykgPT0gUkNDX0FEQzEyUExMQ0xLX0RJVjE2KSB8fCAoKEFEQ0NMSykgPT0gUkNDX0FEQzEyUExMQ0xLX0RJVjMyKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDQ0xLKSA9PSBSQ0NfQURDMTJQTExDTEtfRElWNjQpIHx8ICgoQURDQ0xLKSA9PSBSQ0NfQURDMTJQTExDTEtfRElWMTI4KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRENDTEspID09IFJDQ19BREMxMlBMTENMS19ESVYyNTYpKQorI2RlZmluZSBJU19SQ0NfVElNMUNMS1NPVVJDRShTT1VSQ0UpICgoKFNPVVJDRSkgPT0gUkNDX1RJTTFDTEtfSENMSykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gUkNDX1RJTTFDTEtfUExMQ0xLKSkKKyNlbmRpZiAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCAqLworI2lmIGRlZmluZWQoU1RNMzJGMzM0eDgpCisjZGVmaW5lIElTX1JDQ19IUlRJTTFDTEtTT1VSQ0UoU09VUkNFKSAoKChTT1VSQ0UpID09IFJDQ19IUlRJTTFDTEtfSENMSykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBSQ0NfSFJUSU0xQ0xLX1BMTENMSykpCisjZW5kaWYgLyogU1RNMzJGMzM0eDggKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorI2RlZmluZSBJU19SQ0NfVVNBUlQxQ0xLU09VUkNFKFNPVVJDRSkgICgoKFNPVVJDRSkgPT0gUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0xTRSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0kpKQorI2RlZmluZSBJU19SQ0NfSTJDMkNMS1NPVVJDRShTT1VSQ0UpICAoKChTT1VSQ0UpID09IFJDQ19JMkMyQ0xLU09VUkNFX0hTSSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFJDQ19JMkMyQ0xLU09VUkNFX1NZU0NMSykpCisjZGVmaW5lIElTX1JDQ19BREMxUENMSzJfRElWKEFEQ0NMSykgKCgoQURDQ0xLKSA9PSBSQ0NfQURDMVBDTEsyX0RJVjIpIHx8ICgoQURDQ0xLKSA9PSBSQ0NfQURDMVBDTEsyX0RJVjQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRENDTEspID09IFJDQ19BREMxUENMSzJfRElWNikgfHwgKChBRENDTEspID09IFJDQ19BREMxUENMSzJfRElWOCkpCisjZGVmaW5lIElTX1JDQ19DRUNDTEtTT1VSQ0UoU09VUkNFKSAgKCgoU09VUkNFKSA9PSBSQ0NfQ0VDQ0xLU09VUkNFX0hTSSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gUkNDX0NFQ0NMS1NPVVJDRV9MU0UpKQorI2RlZmluZSBJU19SQ0NfU0RBRENTWVNDTEtfRElWKERJVikgKCgoRElWKSA9PSBSQ0NfU0RBRENTWVNDTEtfRElWMSkgIHx8ICgoRElWKSA9PSBSQ0NfU0RBRENTWVNDTEtfRElWMikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChESVYpID09IFJDQ19TREFEQ1NZU0NMS19ESVY0KSAgfHwgKChESVYpID09IFJDQ19TREFEQ1NZU0NMS19ESVY2KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERJVikgPT0gUkNDX1NEQURDU1lTQ0xLX0RJVjgpICB8fCAoKERJVikgPT0gUkNDX1NEQURDU1lTQ0xLX0RJVjEwKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRElWKSA9PSBSQ0NfU0RBRENTWVNDTEtfRElWMTIpIHx8ICgoRElWKSA9PSBSQ0NfU0RBRENTWVNDTEtfRElWMTQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChESVYpID09IFJDQ19TREFEQ1NZU0NMS19ESVYxNikgfHwgKChESVYpID09IFJDQ19TREFEQ1NZU0NMS19ESVYyMCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERJVikgPT0gUkNDX1NEQURDU1lTQ0xLX0RJVjI0KSB8fCAoKERJVikgPT0gUkNDX1NEQURDU1lTQ0xLX0RJVjI4KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRElWKSA9PSBSQ0NfU0RBRENTWVNDTEtfRElWMzIpIHx8ICgoRElWKSA9PSBSQ0NfU0RBRENTWVNDTEtfRElWMzYpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChESVYpID09IFJDQ19TREFEQ1NZU0NMS19ESVY0MCkgfHwgKChESVYpID09IFJDQ19TREFEQ1NZU0NMS19ESVY0NCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERJVikgPT0gUkNDX1NEQURDU1lTQ0xLX0RJVjQ4KSkKKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpXAorICB8fCBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKVwKKyAgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQoU1RNMzJGMzczeEMpCisjZGVmaW5lIElTX1JDQ19VU0JDTEtTT1VSQ0UoU09VUkNFKSAgKCgoU09VUkNFKSA9PSBSQ0NfVVNCQ0xLU09VUkNFX1BMTCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gUkNDX1VTQkNMS1NPVVJDRV9QTExfRElWMV81KSkKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeDggICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzNzN4QyAgICAgICAgICAgICAgICAgICAqLworI2lmIGRlZmluZWQoUkNDX0NGR1JfTUNPUFJFKQorI2RlZmluZSBJU19SQ0NfTUNPRElWKERJVikgKCgoRElWKSA9PSBSQ0NfTUNPRElWXzEpICB8fCAoKERJVikgPT0gUkNDX01DT0RJVl8yKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERJVikgPT0gUkNDX01DT0RJVl80KSAgfHwgKChESVYpID09IFJDQ19NQ09ESVZfOCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChESVYpID09IFJDQ19NQ09ESVZfMTYpIHx8ICgoRElWKSA9PSBSQ0NfTUNPRElWXzMyKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRElWKSA9PSBSQ0NfTUNPRElWXzY0KSB8fCAoKERJVikgPT0gUkNDX01DT0RJVl8xMjgpKQorI2Vsc2UKKyNkZWZpbmUgSVNfUkNDX01DT0RJVihESVYpICgoKERJVikgPT0gUkNDX01DT0RJVl8xKSkKKyNlbmRpZiAvKiBSQ0NfQ0ZHUl9NQ09QUkUgKi8KKworI2RlZmluZSBJU19SQ0NfTFNFX0RSSVZFKF9fRFJJVkVfXykgKCgoX19EUklWRV9fKSA9PSBSQ0NfTFNFRFJJVkVfTE9XKSAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EUklWRV9fKSA9PSBSQ0NfTFNFRFJJVkVfTUVESVVNTE9XKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EUklWRV9fKSA9PSBSQ0NfTFNFRFJJVkVfTUVESVVNSElHSCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EUklWRV9fKSA9PSBSQ0NfTFNFRFJJVkVfSElHSCkpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorLyoqIEBkZWZncm91cCBSQ0NFeF9FeHBvcnRlZF9UeXBlcyBSQ0NFeCBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKiAKKyAgKiBAYnJpZWYgIFJDQyBleHRlbmRlZCBjbG9ja3Mgc3RydWN0dXJlIGRlZmluaXRpb24gIAorICAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQZXJpcGhDbG9ja1NlbGVjdGlvbjsgLyohPCBUaGUgRXh0ZW5kZWQgQ2xvY2sgdG8gYmUgY29uZmlndXJlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9QZXJpcGhfQ2xvY2tfU2VsZWN0aW9uICovCisKKyAgdWludDMyX3QgUlRDQ2xvY2tTZWxlY3Rpb247ICAgIC8qITwgU3BlY2lmaWVzIFJUQyBDbG9jayBQcmVzY2FsZXJzIFNlbGVjdGlvbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfUlRDX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFVzYXJ0MUNsb2NrU2VsZWN0aW9uOyAvKiE8IFVTQVJUMSBjbG9jayBzb3VyY2UgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9VU0FSVDFfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgSTJjMUNsb2NrU2VsZWN0aW9uOyAgIC8qITwgSTJDMSBjbG9jayBzb3VyY2UgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfSTJDMV9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBJMmMyQ2xvY2tTZWxlY3Rpb247ICAgLyohPCBJMkMyIGNsb2NrIHNvdXJjZSAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X0kyQzJfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgSTJjM0Nsb2NrU2VsZWN0aW9uOyAgIC8qITwgSTJDMyBjbG9jayBzb3VyY2UgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9JMkMzX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IEFkYzFDbG9ja1NlbGVjdGlvbjsgICAvKiE8IEFEQzEgY2xvY2sgc291cmNlICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfQURDMV9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBJMnNDbG9ja1NlbGVjdGlvbjsgICAgLyohPCBJMlMgY2xvY2sgc291cmNlICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfSTJTX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFRpbTFDbG9ja1NlbGVjdGlvbjsgICAvKiE8IFRJTTEgY2xvY2sgc291cmNlICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVElNMV9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBUaW0xNUNsb2NrU2VsZWN0aW9uOyAgLyohPCBUSU0xNSBjbG9jayBzb3VyY2UgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9USU0xNV9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBUaW0xNkNsb2NrU2VsZWN0aW9uOyAgLyohPCBUSU0xNiBjbG9jayBzb3VyY2UgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9USU0xNl9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBUaW0xN0Nsb2NrU2VsZWN0aW9uOyAgLyohPCBUSU0xNyBjbG9jayBzb3VyY2UgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9USU0xN19DbG9ja19Tb3VyY2UgKi8KK31SQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWY7CisjZW5kaWYgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzE4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeDgpCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQZXJpcGhDbG9ja1NlbGVjdGlvbjsgLyohPCBUaGUgRXh0ZW5kZWQgQ2xvY2sgdG8gYmUgY29uZmlndXJlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9QZXJpcGhfQ2xvY2tfU2VsZWN0aW9uICovCisKKyAgdWludDMyX3QgUlRDQ2xvY2tTZWxlY3Rpb247ICAgIC8qITwgU3BlY2lmaWVzIFJUQyBDbG9jayBQcmVzY2FsZXJzIFNlbGVjdGlvbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfUlRDX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFVzYXJ0MUNsb2NrU2VsZWN0aW9uOyAvKiE8IFVTQVJUMSBjbG9jayBzb3VyY2UgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9VU0FSVDFfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgSTJjMUNsb2NrU2VsZWN0aW9uOyAgIC8qITwgSTJDMSBjbG9jayBzb3VyY2UgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfSTJDMV9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBJMmMyQ2xvY2tTZWxlY3Rpb247ICAgLyohPCBJMkMyIGNsb2NrIHNvdXJjZSAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X0kyQzJfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgSTJjM0Nsb2NrU2VsZWN0aW9uOyAgIC8qITwgSTJDMyBjbG9jayBzb3VyY2UgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9JMkMzX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IEFkYzFDbG9ja1NlbGVjdGlvbjsgICAvKiE8IEFEQzEgY2xvY2sgc291cmNlICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfQURDMV9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBJMnNDbG9ja1NlbGVjdGlvbjsgICAgLyohPCBJMlMgY2xvY2sgc291cmNlICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfSTJTX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFRpbTFDbG9ja1NlbGVjdGlvbjsgICAvKiE8IFRJTTEgY2xvY2sgc291cmNlICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVElNMV9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBUaW0xNUNsb2NrU2VsZWN0aW9uOyAgLyohPCBUSU0xNSBjbG9jayBzb3VyY2UgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9USU0xNV9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBUaW0xNkNsb2NrU2VsZWN0aW9uOyAgLyohPCBUSU0xNiBjbG9jayBzb3VyY2UgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9USU0xNl9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBUaW0xN0Nsb2NrU2VsZWN0aW9uOyAgLyohPCBUSU0xNyBjbG9jayBzb3VyY2UgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9USU0xN19DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBVU0JDbG9ja1NlbGVjdGlvbjsgICAgLyohPCBVU0IgY2xvY2sgc291cmNlICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVVNCX0Nsb2NrX1NvdXJjZSAqLworCit9UkNDX1BlcmlwaENMS0luaXRUeXBlRGVmOworI2VuZGlmIC8qIFNUTTMyRjMwMng4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhDKQordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgUGVyaXBoQ2xvY2tTZWxlY3Rpb247IC8qITwgVGhlIEV4dGVuZGVkIENsb2NrIHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfUGVyaXBoX0Nsb2NrX1NlbGVjdGlvbiAqLworCisgIHVpbnQzMl90IFJUQ0Nsb2NrU2VsZWN0aW9uOyAgICAgIC8qITwgU3BlY2lmaWVzIFJUQyBDbG9jayBQcmVzY2FsZXJzIFNlbGVjdGlvbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfUlRDX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFVzYXJ0MUNsb2NrU2VsZWN0aW9uOyAvKiE8IFVTQVJUMSBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9VU0FSVDFfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVXNhcnQyQ2xvY2tTZWxlY3Rpb247IC8qITwgVVNBUlQyIGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19VU0FSVDJfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVXNhcnQzQ2xvY2tTZWxlY3Rpb247IC8qITwgVVNBUlQzIGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19VU0FSVDNfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVWFydDRDbG9ja1NlbGVjdGlvbjsgIC8qITwgVUFSVDQgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVUFSVDRfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVWFydDVDbG9ja1NlbGVjdGlvbjsgIC8qITwgVUFSVDUgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVUFSVDVfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgSTJjMUNsb2NrU2VsZWN0aW9uOyAgIC8qITwgSTJDMSBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfSTJDMV9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBJMmMyQ2xvY2tTZWxlY3Rpb247ICAgLyohPCBJMkMyIGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X0kyQzJfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgQWRjMTJDbG9ja1NlbGVjdGlvbjsgIC8qITwgQURDMSAmIEFEQzIgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfQURDMTJfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgSTJzQ2xvY2tTZWxlY3Rpb247ICAgIC8qITwgSTJTIGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X0kyU19DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBUaW0xQ2xvY2tTZWxlY3Rpb247ICAgLyohPCBUSU0xIGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1RJTTFfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVVNCQ2xvY2tTZWxlY3Rpb247ICAgIC8qITwgVVNCIGNsb2NrIHNvdXJjZSAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1VTQl9DbG9ja19Tb3VyY2UgKi8KKworfVJDQ19QZXJpcGhDTEtJbml0VHlwZURlZjsKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4QyAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4QykKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFBlcmlwaENsb2NrU2VsZWN0aW9uOyAvKiE8IFRoZSBFeHRlbmRlZCBDbG9jayB0byBiZSBjb25maWd1cmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1BlcmlwaF9DbG9ja19TZWxlY3Rpb24gKi8KKworICB1aW50MzJfdCBSVENDbG9ja1NlbGVjdGlvbjsgICAgICAvKiE8IFNwZWNpZmllcyBSVEMgQ2xvY2sgUHJlc2NhbGVycyBTZWxlY3Rpb24gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX1JUQ19DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBVc2FydDFDbG9ja1NlbGVjdGlvbjsgLyohPCBVU0FSVDEgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVVNBUlQxX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFVzYXJ0MkNsb2NrU2VsZWN0aW9uOyAvKiE8IFVTQVJUMiBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfVVNBUlQyX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFVzYXJ0M0Nsb2NrU2VsZWN0aW9uOyAvKiE8IFVTQVJUMyBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfVVNBUlQzX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFVhcnQ0Q2xvY2tTZWxlY3Rpb247ICAvKiE8IFVBUlQ0IGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1VBUlQ0X0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFVhcnQ1Q2xvY2tTZWxlY3Rpb247ICAvKiE8IFVBUlQ1IGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1VBUlQ1X0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IEkyYzFDbG9ja1NlbGVjdGlvbjsgICAvKiE8IEkyQzEgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0kyQzFfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgSTJjMkNsb2NrU2VsZWN0aW9uOyAgIC8qITwgSTJDMiBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9JMkMyX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IEFkYzEyQ2xvY2tTZWxlY3Rpb247ICAvKiE8IEFEQzEgJiBBREMyIGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X0FEQzEyX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IEFkYzM0Q2xvY2tTZWxlY3Rpb247ICAvKiE8IEFEQzMgJiBBREM0IGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X0FEQzM0X0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IEkyc0Nsb2NrU2VsZWN0aW9uOyAgICAvKiE8IEkyUyBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9JMlNfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVGltMUNsb2NrU2VsZWN0aW9uOyAgIC8qITwgVElNMSBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9USU0xX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFRpbThDbG9ja1NlbGVjdGlvbjsgICAvKiE8IFRJTTggY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVElNOF9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBVU0JDbG9ja1NlbGVjdGlvbjsgICAgLyohPCBVU0IgY2xvY2sgc291cmNlICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVVNCX0Nsb2NrX1NvdXJjZSAqLworCit9UkNDX1BlcmlwaENMS0luaXRUeXBlRGVmOworI2VuZGlmIC8qIFNUTTMyRjMwM3hDICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKQordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgUGVyaXBoQ2xvY2tTZWxlY3Rpb247IC8qITwgVGhlIEV4dGVuZGVkIENsb2NrIHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfUGVyaXBoX0Nsb2NrX1NlbGVjdGlvbiAqLworCisgIHVpbnQzMl90IFJUQ0Nsb2NrU2VsZWN0aW9uOyAgICAgIC8qITwgU3BlY2lmaWVzIFJUQyBDbG9jayBQcmVzY2FsZXJzIFNlbGVjdGlvbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfUlRDX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFVzYXJ0MUNsb2NrU2VsZWN0aW9uOyAvKiE8IFVTQVJUMSBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9VU0FSVDFfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVXNhcnQyQ2xvY2tTZWxlY3Rpb247IC8qITwgVVNBUlQyIGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19VU0FSVDJfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVXNhcnQzQ2xvY2tTZWxlY3Rpb247IC8qITwgVVNBUlQzIGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19VU0FSVDNfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVWFydDRDbG9ja1NlbGVjdGlvbjsgIC8qITwgVUFSVDQgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVUFSVDRfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVWFydDVDbG9ja1NlbGVjdGlvbjsgIC8qITwgVUFSVDUgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVUFSVDVfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgSTJjMUNsb2NrU2VsZWN0aW9uOyAgIC8qITwgSTJDMSBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfSTJDMV9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBJMmMyQ2xvY2tTZWxlY3Rpb247ICAgLyohPCBJMkMyIGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X0kyQzJfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgSTJjM0Nsb2NrU2VsZWN0aW9uOyAgIC8qITwgSTJDMyBjbG9jayBzb3VyY2UgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9JMkMzX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IEFkYzEyQ2xvY2tTZWxlY3Rpb247ICAvKiE8IEFEQzEgJiBBREMyIGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X0FEQzEyX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IEkyc0Nsb2NrU2VsZWN0aW9uOyAgICAvKiE8IEkyUyBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9JMlNfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVGltMUNsb2NrU2VsZWN0aW9uOyAgIC8qITwgVElNMSBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9USU0xX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFRpbTJDbG9ja1NlbGVjdGlvbjsgICAvKiE8IFRJTTIgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVElNMl9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBUaW0zNENsb2NrU2VsZWN0aW9uOyAgIC8qITwgVElNMyAmIFRJTTQgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1RJTTM0X0Nsb2NrX1NvdXJjZSAqLworCQkJCSAgICAgICAKKyAgdWludDMyX3QgVGltMTVDbG9ja1NlbGVjdGlvbjsgIC8qITwgVElNMTUgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVElNMTVfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVGltMTZDbG9ja1NlbGVjdGlvbjsgIC8qITwgVElNMTYgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVElNMTZfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVGltMTdDbG9ja1NlbGVjdGlvbjsgIC8qITwgVElNMTcgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVElNMTdfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVVNCQ2xvY2tTZWxlY3Rpb247ICAgIC8qITwgVVNCIGNsb2NrIHNvdXJjZSAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1VTQl9DbG9ja19Tb3VyY2UgKi8KKworfVJDQ19QZXJpcGhDTEtJbml0VHlwZURlZjsKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFBlcmlwaENsb2NrU2VsZWN0aW9uOyAvKiE8IFRoZSBFeHRlbmRlZCBDbG9jayB0byBiZSBjb25maWd1cmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1BlcmlwaF9DbG9ja19TZWxlY3Rpb24gKi8KKworICB1aW50MzJfdCBSVENDbG9ja1NlbGVjdGlvbjsgICAgICAvKiE8IFNwZWNpZmllcyBSVEMgQ2xvY2sgUHJlc2NhbGVycyBTZWxlY3Rpb24gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX1JUQ19DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBVc2FydDFDbG9ja1NlbGVjdGlvbjsgLyohPCBVU0FSVDEgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVVNBUlQxX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFVzYXJ0MkNsb2NrU2VsZWN0aW9uOyAvKiE8IFVTQVJUMiBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfVVNBUlQyX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFVzYXJ0M0Nsb2NrU2VsZWN0aW9uOyAvKiE8IFVTQVJUMyBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfVVNBUlQzX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFVhcnQ0Q2xvY2tTZWxlY3Rpb247ICAvKiE8IFVBUlQ0IGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1VBUlQ0X0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFVhcnQ1Q2xvY2tTZWxlY3Rpb247ICAvKiE8IFVBUlQ1IGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1VBUlQ1X0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IEkyYzFDbG9ja1NlbGVjdGlvbjsgICAvKiE8IEkyQzEgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0kyQzFfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgSTJjMkNsb2NrU2VsZWN0aW9uOyAgIC8qITwgSTJDMiBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9JMkMyX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IEkyYzNDbG9ja1NlbGVjdGlvbjsgICAvKiE8IEkyQzMgY2xvY2sgc291cmNlICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfSTJDM19DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBBZGMxMkNsb2NrU2VsZWN0aW9uOyAgLyohPCBBREMxICYgQURDMiBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9BREMxMl9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBBZGMzNENsb2NrU2VsZWN0aW9uOyAgLyohPCBBREMzICYgQURDNCBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9BREMzNF9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBJMnNDbG9ja1NlbGVjdGlvbjsgICAgLyohPCBJMlMgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfSTJTX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFRpbTFDbG9ja1NlbGVjdGlvbjsgICAvKiE8IFRJTTEgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVElNMV9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBUaW0yQ2xvY2tTZWxlY3Rpb247ICAgLyohPCBUSU0yIGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1RJTTJfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVGltMzRDbG9ja1NlbGVjdGlvbjsgICAvKiE8IFRJTTMgJiBUSU00IGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9USU0zNF9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBUaW04Q2xvY2tTZWxlY3Rpb247ICAgLyohPCBUSU04IGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1RJTThfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVGltMTVDbG9ja1NlbGVjdGlvbjsgIC8qITwgVElNMTUgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVElNMTVfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVGltMTZDbG9ja1NlbGVjdGlvbjsgIC8qITwgVElNMTYgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVElNMTZfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVGltMTdDbG9ja1NlbGVjdGlvbjsgIC8qITwgVElNMTcgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVElNMTdfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVGltMjBDbG9ja1NlbGVjdGlvbjsgIC8qITwgVElNMjAgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVElNMjBfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVVNCQ2xvY2tTZWxlY3Rpb247ICAgIC8qITwgVVNCIGNsb2NrIHNvdXJjZSAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1VTQl9DbG9ja19Tb3VyY2UgKi8KKworfVJDQ19QZXJpcGhDTEtJbml0VHlwZURlZjsKKyNlbmRpZiAvKiBTVE0zMkYzMDN4RSAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzOTh4eCkKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFBlcmlwaENsb2NrU2VsZWN0aW9uOyAvKiE8IFRoZSBFeHRlbmRlZCBDbG9jayB0byBiZSBjb25maWd1cmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1BlcmlwaF9DbG9ja19TZWxlY3Rpb24gKi8KKworICB1aW50MzJfdCBSVENDbG9ja1NlbGVjdGlvbjsgICAgICAvKiE8IFNwZWNpZmllcyBSVEMgQ2xvY2sgUHJlc2NhbGVycyBTZWxlY3Rpb24gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX1JUQ19DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBVc2FydDFDbG9ja1NlbGVjdGlvbjsgLyohPCBVU0FSVDEgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVVNBUlQxX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFVzYXJ0MkNsb2NrU2VsZWN0aW9uOyAvKiE8IFVTQVJUMiBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfVVNBUlQyX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFVzYXJ0M0Nsb2NrU2VsZWN0aW9uOyAvKiE8IFVTQVJUMyBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfVVNBUlQzX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFVhcnQ0Q2xvY2tTZWxlY3Rpb247ICAvKiE8IFVBUlQ0IGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1VBUlQ0X0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFVhcnQ1Q2xvY2tTZWxlY3Rpb247ICAvKiE8IFVBUlQ1IGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1VBUlQ1X0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IEkyYzFDbG9ja1NlbGVjdGlvbjsgICAvKiE8IEkyQzEgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0kyQzFfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgSTJjMkNsb2NrU2VsZWN0aW9uOyAgIC8qITwgSTJDMiBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9JMkMyX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IEkyYzNDbG9ja1NlbGVjdGlvbjsgICAvKiE8IEkyQzMgY2xvY2sgc291cmNlICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfSTJDM19DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBBZGMxMkNsb2NrU2VsZWN0aW9uOyAgLyohPCBBREMxICYgQURDMiBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9BREMxMl9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBBZGMzNENsb2NrU2VsZWN0aW9uOyAgLyohPCBBREMzICYgQURDNCBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9BREMzNF9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBJMnNDbG9ja1NlbGVjdGlvbjsgICAgLyohPCBJMlMgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfSTJTX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFRpbTFDbG9ja1NlbGVjdGlvbjsgICAvKiE8IFRJTTEgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVElNMV9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBUaW0yQ2xvY2tTZWxlY3Rpb247ICAgLyohPCBUSU0yIGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1RJTTJfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVGltMzRDbG9ja1NlbGVjdGlvbjsgICAvKiE8IFRJTTMgJiBUSU00IGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9USU0zNF9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBUaW04Q2xvY2tTZWxlY3Rpb247ICAgLyohPCBUSU04IGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1RJTThfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVGltMTVDbG9ja1NlbGVjdGlvbjsgIC8qITwgVElNMTUgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVElNMTVfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVGltMTZDbG9ja1NlbGVjdGlvbjsgIC8qITwgVElNMTYgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVElNMTZfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVGltMTdDbG9ja1NlbGVjdGlvbjsgIC8qITwgVElNMTcgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVElNMTdfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVGltMjBDbG9ja1NlbGVjdGlvbjsgIC8qITwgVElNMjAgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVElNMjBfQ2xvY2tfU291cmNlICovCisKK31SQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWY7CisjZW5kaWYgLyogU1RNMzJGMzk4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzU4eHgpCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQZXJpcGhDbG9ja1NlbGVjdGlvbjsgLyohPCBUaGUgRXh0ZW5kZWQgQ2xvY2sgdG8gYmUgY29uZmlndXJlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9QZXJpcGhfQ2xvY2tfU2VsZWN0aW9uICovCisKKyAgdWludDMyX3QgUlRDQ2xvY2tTZWxlY3Rpb247ICAgICAgLyohPCBTcGVjaWZpZXMgUlRDIENsb2NrIFByZXNjYWxlcnMgU2VsZWN0aW9uIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19SVENfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVXNhcnQxQ2xvY2tTZWxlY3Rpb247IC8qITwgVVNBUlQxIGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1VTQVJUMV9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBVc2FydDJDbG9ja1NlbGVjdGlvbjsgLyohPCBVU0FSVDIgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX1VTQVJUMl9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBVc2FydDNDbG9ja1NlbGVjdGlvbjsgLyohPCBVU0FSVDMgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX1VTQVJUM19DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBVYXJ0NENsb2NrU2VsZWN0aW9uOyAgLyohPCBVQVJUNCBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9VQVJUNF9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBVYXJ0NUNsb2NrU2VsZWN0aW9uOyAgLyohPCBVQVJUNSBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9VQVJUNV9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBJMmMxQ2xvY2tTZWxlY3Rpb247ICAgLyohPCBJMkMxIGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19JMkMxX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IEkyYzJDbG9ja1NlbGVjdGlvbjsgICAvKiE8IEkyQzIgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfSTJDMl9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBBZGMxMkNsb2NrU2VsZWN0aW9uOyAgLyohPCBBREMxICYgQURDMiBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9BREMxMl9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBBZGMzNENsb2NrU2VsZWN0aW9uOyAgLyohPCBBREMzICYgQURDNCBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9BREMzNF9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBJMnNDbG9ja1NlbGVjdGlvbjsgICAgLyohPCBJMlMgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfSTJTX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFRpbTFDbG9ja1NlbGVjdGlvbjsgICAvKiE8IFRJTTEgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVElNMV9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBUaW04Q2xvY2tTZWxlY3Rpb247ICAgLyohPCBUSU04IGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1RJTThfQ2xvY2tfU291cmNlICovCisKK31SQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWY7CisjZW5kaWYgLyogU1RNMzJGMzU4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAzeDgpCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQZXJpcGhDbG9ja1NlbGVjdGlvbjsgLyohPCBUaGUgRXh0ZW5kZWQgQ2xvY2sgdG8gYmUgY29uZmlndXJlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9QZXJpcGhfQ2xvY2tfU2VsZWN0aW9uICovCisKKyAgdWludDMyX3QgUlRDQ2xvY2tTZWxlY3Rpb247ICAgICAgLyohPCBTcGVjaWZpZXMgUlRDIENsb2NrIFByZXNjYWxlcnMgU2VsZWN0aW9uIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19SVENfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVXNhcnQxQ2xvY2tTZWxlY3Rpb247IC8qITwgVVNBUlQxIGNsb2NrIHNvdXJjZSAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1VTQVJUMV9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBJMmMxQ2xvY2tTZWxlY3Rpb247ICAgLyohPCBJMkMxIGNsb2NrIHNvdXJjZSAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19JMkMxX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IEFkYzEyQ2xvY2tTZWxlY3Rpb247ICAvKiE8IEFEQzEgJiBBREMyIGNsb2NrIHNvdXJjZSAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X0FEQzEyX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFRpbTFDbG9ja1NlbGVjdGlvbjsgICAvKiE8IFRJTTEgY2xvY2sgc291cmNlICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVElNMV9DbG9ja19Tb3VyY2UgKi8KKworfVJDQ19QZXJpcGhDTEtJbml0VHlwZURlZjsKKyNlbmRpZiAvKiBTVE0zMkYzMDN4OCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMzR4OCkKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFBlcmlwaENsb2NrU2VsZWN0aW9uOyAvKiE8IFRoZSBFeHRlbmRlZCBDbG9jayB0byBiZSBjb25maWd1cmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1BlcmlwaF9DbG9ja19TZWxlY3Rpb24gKi8KKworICB1aW50MzJfdCBSVENDbG9ja1NlbGVjdGlvbjsgICAgICAvKiE8IFNwZWNpZmllcyBSVEMgQ2xvY2sgUHJlc2NhbGVycyBTZWxlY3Rpb24gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX1JUQ19DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBVc2FydDFDbG9ja1NlbGVjdGlvbjsgLyohPCBVU0FSVDEgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVVNBUlQxX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IEkyYzFDbG9ja1NlbGVjdGlvbjsgICAvKiE8IEkyQzEgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0kyQzFfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgQWRjMTJDbG9ja1NlbGVjdGlvbjsgIC8qITwgQURDMSAmIEFEQzIgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfQURDMTJfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVGltMUNsb2NrU2VsZWN0aW9uOyAgIC8qITwgVElNMSBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9USU0xX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IEhydGltMUNsb2NrU2VsZWN0aW9uOyAvKiE8IEhSVElNMSBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9IUlRJTTFfQ2xvY2tfU291cmNlICovCisKK31SQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWY7CisjZW5kaWYgLyogU1RNMzJGMzM0eDggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzI4eHgpCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQZXJpcGhDbG9ja1NlbGVjdGlvbjsgLyohPCBUaGUgRXh0ZW5kZWQgQ2xvY2sgdG8gYmUgY29uZmlndXJlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9QZXJpcGhfQ2xvY2tfU2VsZWN0aW9uICovCisKKyAgdWludDMyX3QgUlRDQ2xvY2tTZWxlY3Rpb247ICAgICAgLyohPCBTcGVjaWZpZXMgUlRDIENsb2NrIFByZXNjYWxlcnMgU2VsZWN0aW9uIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19SVENfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVXNhcnQxQ2xvY2tTZWxlY3Rpb247IC8qITwgVVNBUlQxIGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1VTQVJUMV9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBJMmMxQ2xvY2tTZWxlY3Rpb247ICAgLyohPCBJMkMxIGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19JMkMxX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IEFkYzEyQ2xvY2tTZWxlY3Rpb247ICAvKiE8IEFEQzEgJiBBREMyIGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X0FEQzEyX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFRpbTFDbG9ja1NlbGVjdGlvbjsgICAvKiE8IFRJTTEgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVElNMV9DbG9ja19Tb3VyY2UgKi8KKworfVJDQ19QZXJpcGhDTEtJbml0VHlwZURlZjsKKyNlbmRpZiAvKiBTVE0zMkYzMjh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzNzN4QykgCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQZXJpcGhDbG9ja1NlbGVjdGlvbjsgLyohPCBUaGUgRXh0ZW5kZWQgQ2xvY2sgdG8gYmUgY29uZmlndXJlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9QZXJpcGhfQ2xvY2tfU2VsZWN0aW9uICovCisKKyAgdWludDMyX3QgUlRDQ2xvY2tTZWxlY3Rpb247ICAgICAgLyohPCBTcGVjaWZpZXMgUlRDIENsb2NrIFByZXNjYWxlcnMgU2VsZWN0aW9uIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19SVENfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVXNhcnQxQ2xvY2tTZWxlY3Rpb247IC8qITwgVVNBUlQxIGNsb2NrIHNvdXJjZSAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1VTQVJUMV9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBVc2FydDJDbG9ja1NlbGVjdGlvbjsgLyohPCBVU0FSVDIgY2xvY2sgc291cmNlICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX1VTQVJUMl9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBVc2FydDNDbG9ja1NlbGVjdGlvbjsgLyohPCBVU0FSVDMgY2xvY2sgc291cmNlICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX1VTQVJUM19DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBJMmMxQ2xvY2tTZWxlY3Rpb247ICAgLyohPCBJMkMxIGNsb2NrIHNvdXJjZSAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19JMkMxX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IEkyYzJDbG9ja1NlbGVjdGlvbjsgICAvKiE8IEkyQzIgY2xvY2sgc291cmNlICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfSTJDMl9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBBZGMxQ2xvY2tTZWxlY3Rpb247ICAgLyohPCBBREMxIGNsb2NrIHNvdXJjZSAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X0FEQzFfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgU2RhZGNDbG9ja1NlbGVjdGlvbjsgICAvKiE8IFNEQURDIGNsb2NrIHByZXNjYWxlciAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1NEQURDX0Nsb2NrX1ByZXNjYWxlciAqLworCisgIHVpbnQzMl90IENlY0Nsb2NrU2VsZWN0aW9uOyAgICAvKiE8IEhETUkgQ0VDIGNsb2NrIHNvdXJjZSAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9DRUNfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVVNCQ2xvY2tTZWxlY3Rpb247ICAgIC8qITwgVVNCIGNsb2NrIHNvdXJjZSAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1VTQl9DbG9ja19Tb3VyY2UgKi8KKworfVJDQ19QZXJpcGhDTEtJbml0VHlwZURlZjsKKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzNzh4eCkKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFBlcmlwaENsb2NrU2VsZWN0aW9uOyAvKiE8IFRoZSBFeHRlbmRlZCBDbG9jayB0byBiZSBjb25maWd1cmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1BlcmlwaF9DbG9ja19TZWxlY3Rpb24gKi8KKworICB1aW50MzJfdCBSVENDbG9ja1NlbGVjdGlvbjsgICAgICAvKiE8IFNwZWNpZmllcyBSVEMgQ2xvY2sgUHJlc2NhbGVycyBTZWxlY3Rpb24gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX1JUQ19DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBVc2FydDFDbG9ja1NlbGVjdGlvbjsgLyohPCBVU0FSVDEgY2xvY2sgc291cmNlICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVVNBUlQxX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFVzYXJ0MkNsb2NrU2VsZWN0aW9uOyAvKiE8IFVTQVJUMiBjbG9jayBzb3VyY2UgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfVVNBUlQyX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFVzYXJ0M0Nsb2NrU2VsZWN0aW9uOyAvKiE8IFVTQVJUMyBjbG9jayBzb3VyY2UgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfVVNBUlQzX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IEkyYzFDbG9ja1NlbGVjdGlvbjsgICAvKiE8IEkyQzEgY2xvY2sgc291cmNlICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0kyQzFfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgSTJjMkNsb2NrU2VsZWN0aW9uOyAgIC8qITwgSTJDMiBjbG9jayBzb3VyY2UgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9JMkMyX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IEFkYzFDbG9ja1NlbGVjdGlvbjsgICAvKiE8IEFEQzEgY2xvY2sgc291cmNlICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfQURDMV9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBTZGFkY0Nsb2NrU2VsZWN0aW9uOyAgIC8qITwgU0RBREMgY2xvY2sgcHJlc2NhbGVyICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfU0RBRENfQ2xvY2tfUHJlc2NhbGVyICovCisKKyAgdWludDMyX3QgQ2VjQ2xvY2tTZWxlY3Rpb247ICAgIC8qITwgSERNSSBDRUMgY2xvY2sgc291cmNlICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X0NFQ19DbG9ja19Tb3VyY2UgKi8KKworfVJDQ19QZXJpcGhDTEtJbml0VHlwZURlZjsKKyNlbmRpZiAvKiBTVE0zMkYzNzh4eCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSQ0NFeF9FeHBvcnRlZF9Db25zdGFudHMgUkNDIEV4dGVuZGVkIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisvKiogQGRlZmdyb3VwIFJDQ0V4X01DT19DbG9ja19Tb3VyY2UgUkNDIEV4dGVuZGVkIE1DTyBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfTUNPMVNPVVJDRV9OT0NMT0NLICAgICAgICAgICAgUkNDX0NGR1JfTUNPX05PQ0xPQ0sKKyNkZWZpbmUgUkNDX01DTzFTT1VSQ0VfTFNJICAgICAgICAgICAgICAgIFJDQ19DRkdSX01DT19MU0kKKyNkZWZpbmUgUkNDX01DTzFTT1VSQ0VfTFNFICAgICAgICAgICAgICAgIFJDQ19DRkdSX01DT19MU0UKKyNkZWZpbmUgUkNDX01DTzFTT1VSQ0VfU1lTQ0xLICAgICAgICAgICAgIFJDQ19DRkdSX01DT19TWVNDTEsKKyNkZWZpbmUgUkNDX01DTzFTT1VSQ0VfSFNJICAgICAgICAgICAgICAgIFJDQ19DRkdSX01DT19IU0kKKyNkZWZpbmUgUkNDX01DTzFTT1VSQ0VfSFNFICAgICAgICAgICAgICAgIFJDQ19DRkdSX01DT19IU0UKKyNpZiBkZWZpbmVkKFJDQ19DRkdSX1BMTE5PRElWKQorI2RlZmluZSBSQ0NfTUNPMVNPVVJDRV9QTExDTEsgICAgICAgICAgICAgKFJDQ19DRkdSX1BMTE5PRElWIHwgUkNDX0NGR1JfTUNPX1BMTCkKKyNlbmRpZiAvKiBSQ0NfQ0ZHUl9QTExOT0RJViAqLworI2RlZmluZSBSQ0NfTUNPMVNPVVJDRV9QTExDTEtfRElWMiAgICAgICAgUkNDX0NGR1JfTUNPX1BMTAorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X1BlcmlwaF9DbG9ja19TZWxlY3Rpb24gUkNDIEV4dGVuZGVkIFBlcmlwaCBDbG9jayBTZWxlY3Rpb24KKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVVNBUlQxICAgICAgICAgICAoMHgwMDAwMDAwMVUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfSTJDMSAgICAgICAgICAgICAoMHgwMDAwMDAyMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfSTJDMiAgICAgICAgICAgICAoMHgwMDAwMDA0MFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfQURDMSAgICAgICAgICAgICAoMHgwMDAwMDA4MFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfSTJTICAgICAgICAgICAgICAoMHgwMDAwMDIwMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVElNMSAgICAgICAgICAgICAoMHgwMDAwMTAwMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfSTJDMyAgICAgICAgICAgICAoMHgwMDAwODAwMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfUlRDICAgICAgICAgICAgICAoMHgwMDAxMDAwMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVElNMTUgICAgICAgICAgICAoMHgwMDA0MDAwMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVElNMTYgICAgICAgICAgICAoMHgwMDA4MDAwMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVElNMTcgICAgICAgICAgICAoMHgwMDEwMDAwMFUpCisKKyNlbmRpZiAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMTh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4OCkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19VU0FSVDEgICAgICAgICAgICgweDAwMDAwMDAxVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19JMkMxICAgICAgICAgICAgICgweDAwMDAwMDIwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19JMkMyICAgICAgICAgICAgICgweDAwMDAwMDQwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19BREMxICAgICAgICAgICAgICgweDAwMDAwMDgwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19JMlMgICAgICAgICAgICAgICgweDAwMDAwMjAwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19USU0xICAgICAgICAgICAgICgweDAwMDAxMDAwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19JMkMzICAgICAgICAgICAgICgweDAwMDA4MDAwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19SVEMgICAgICAgICAgICAgICgweDAwMDEwMDAwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19VU0IgICAgICAgICAgICAgICgweDAwMDIwMDAwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19USU0xNSAgICAgICAgICAgICgweDAwMDQwMDAwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19USU0xNiAgICAgICAgICAgICgweDAwMDgwMDAwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19USU0xNyAgICAgICAgICAgICgweDAwMTAwMDAwVSkKKworCisjZW5kaWYgLyogU1RNMzJGMzAyeDggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEMpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVVNBUlQxICAgICAgICAgICAoMHgwMDAwMDAwMVUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVVNBUlQyICAgICAgICAgICAoMHgwMDAwMDAwMlUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVVNBUlQzICAgICAgICAgICAoMHgwMDAwMDAwNFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVUFSVDQgICAgICAgICAgICAoMHgwMDAwMDAwOFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVUFSVDUgICAgICAgICAgICAoMHgwMDAwMDAxMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfSTJDMSAgICAgICAgICAgICAoMHgwMDAwMDAyMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfSTJDMiAgICAgICAgICAgICAoMHgwMDAwMDA0MFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfQURDMTIgICAgICAgICAgICAoMHgwMDAwMDA4MFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfSTJTICAgICAgICAgICAgICAoMHgwMDAwMDIwMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVElNMSAgICAgICAgICAgICAoMHgwMDAwMTAwMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfUlRDICAgICAgICAgICAgICAoMHgwMDAxMDAwMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVVNCICAgICAgICAgICAgICAoMHgwMDAyMDAwMFUpCisKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4QyAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4QykKKyNkZWZpbmUgUkNDX1BFUklQSENMS19VU0FSVDEgICAgICAgICAgICgweDAwMDAwMDAxVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19VU0FSVDIgICAgICAgICAgICgweDAwMDAwMDAyVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19VU0FSVDMgICAgICAgICAgICgweDAwMDAwMDA0VSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19VQVJUNCAgICAgICAgICAgICgweDAwMDAwMDA4VSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19VQVJUNSAgICAgICAgICAgICgweDAwMDAwMDEwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19JMkMxICAgICAgICAgICAgICgweDAwMDAwMDIwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19JMkMyICAgICAgICAgICAgICgweDAwMDAwMDQwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19BREMxMiAgICAgICAgICAgICgweDAwMDAwMDgwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19BREMzNCAgICAgICAgICAgICgweDAwMDAwMTAwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19JMlMgICAgICAgICAgICAgICgweDAwMDAwMjAwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19USU0xICAgICAgICAgICAgICgweDAwMDAxMDAwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19USU04ICAgICAgICAgICAgICgweDAwMDAyMDAwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19SVEMgICAgICAgICAgICAgICgweDAwMDEwMDAwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19VU0IgICAgICAgICAgICAgICgweDAwMDIwMDAwVSkKKworI2VuZGlmIC8qIFNUTTMyRjMwM3hDICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSAgICAgICAgICAgKDB4MDAwMDAwMDFVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMiAgICAgICAgICAgKDB4MDAwMDAwMDJVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMyAgICAgICAgICAgKDB4MDAwMDAwMDRVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1VBUlQ0ICAgICAgICAgICAgKDB4MDAwMDAwMDhVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1VBUlQ1ICAgICAgICAgICAgKDB4MDAwMDAwMTBVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0kyQzEgICAgICAgICAgICAgKDB4MDAwMDAwMjBVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0kyQzIgICAgICAgICAgICAgKDB4MDAwMDAwNDBVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0FEQzEyICAgICAgICAgICAgKDB4MDAwMDAwODBVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0kyUyAgICAgICAgICAgICAgKDB4MDAwMDAyMDBVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1RJTTEgICAgICAgICAgICAgKDB4MDAwMDEwMDBVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1JUQyAgICAgICAgICAgICAgKDB4MDAwMTAwMDBVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1VTQiAgICAgICAgICAgICAgKDB4MDAwMjAwMDBVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0kyQzMgICAgICAgICAgICAgKDB4MDAwNDAwMDBVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1RJTTIgICAgICAgICAgICAgKDB4MDAxMDAwMDBVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1RJTTM0ICAgICAgICAgICAgKDB4MDAyMDAwMDBVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1RJTTE1ICAgICAgICAgICAgKDB4MDA0MDAwMDBVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1RJTTE2ICAgICAgICAgICAgKDB4MDA4MDAwMDBVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1RJTTE3ICAgICAgICAgICAgKDB4MDEwMDAwMDBVKQorCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVVNBUlQxICAgICAgICAgICAoMHgwMDAwMDAwMVUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVVNBUlQyICAgICAgICAgICAoMHgwMDAwMDAwMlUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVVNBUlQzICAgICAgICAgICAoMHgwMDAwMDAwNFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVUFSVDQgICAgICAgICAgICAoMHgwMDAwMDAwOFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVUFSVDUgICAgICAgICAgICAoMHgwMDAwMDAxMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfSTJDMSAgICAgICAgICAgICAoMHgwMDAwMDAyMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfSTJDMiAgICAgICAgICAgICAoMHgwMDAwMDA0MFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfQURDMTIgICAgICAgICAgICAoMHgwMDAwMDA4MFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfQURDMzQgICAgICAgICAgICAoMHgwMDAwMDEwMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfSTJTICAgICAgICAgICAgICAoMHgwMDAwMDIwMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVElNMSAgICAgICAgICAgICAoMHgwMDAwMTAwMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVElNOCAgICAgICAgICAgICAoMHgwMDAwMjAwMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfUlRDICAgICAgICAgICAgICAoMHgwMDAxMDAwMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVVNCICAgICAgICAgICAgICAoMHgwMDAyMDAwMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfSTJDMyAgICAgICAgICAgICAoMHgwMDA0MDAwMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVElNMiAgICAgICAgICAgICAoMHgwMDEwMDAwMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVElNMzQgICAgICAgICAgICAoMHgwMDIwMDAwMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVElNMTUgICAgICAgICAgICAoMHgwMDQwMDAwMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVElNMTYgICAgICAgICAgICAoMHgwMDgwMDAwMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVElNMTcgICAgICAgICAgICAoMHgwMTAwMDAwMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVElNMjAgICAgICAgICAgICAoMHgwMjAwMDAwMFUpCisKKyNlbmRpZiAvKiBTVE0zMkYzMDN4RSAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzOTh4eCkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19VU0FSVDEgICAgICAgICAgICgweDAwMDAwMDAxVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19VU0FSVDIgICAgICAgICAgICgweDAwMDAwMDAyVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19VU0FSVDMgICAgICAgICAgICgweDAwMDAwMDA0VSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19VQVJUNCAgICAgICAgICAgICgweDAwMDAwMDA4VSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19VQVJUNSAgICAgICAgICAgICgweDAwMDAwMDEwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19JMkMxICAgICAgICAgICAgICgweDAwMDAwMDIwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19JMkMyICAgICAgICAgICAgICgweDAwMDAwMDQwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19BREMxMiAgICAgICAgICAgICgweDAwMDAwMDgwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19BREMzNCAgICAgICAgICAgICgweDAwMDAwMTAwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19JMlMgICAgICAgICAgICAgICgweDAwMDAwMjAwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19USU0xICAgICAgICAgICAgICgweDAwMDAxMDAwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19USU04ICAgICAgICAgICAgICgweDAwMDAyMDAwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19SVEMgICAgICAgICAgICAgICgweDAwMDEwMDAwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19JMkMzICAgICAgICAgICAgICgweDAwMDQwMDAwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19USU0yICAgICAgICAgICAgICgweDAwMTAwMDAwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19USU0zNCAgICAgICAgICAgICgweDAwMjAwMDAwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19USU0xNSAgICAgICAgICAgICgweDAwNDAwMDAwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19USU0xNiAgICAgICAgICAgICgweDAwODAwMDAwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19USU0xNyAgICAgICAgICAgICgweDAxMDAwMDAwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19USU0yMCAgICAgICAgICAgICgweDAyMDAwMDAwVSkKKworCisjZW5kaWYgLyogU1RNMzJGMzk4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzU4eHgpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVVNBUlQxICAgICAgICAgICAoMHgwMDAwMDAwMVUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVVNBUlQyICAgICAgICAgICAoMHgwMDAwMDAwMlUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVVNBUlQzICAgICAgICAgICAoMHgwMDAwMDAwNFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVUFSVDQgICAgICAgICAgICAoMHgwMDAwMDAwOFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVUFSVDUgICAgICAgICAgICAoMHgwMDAwMDAxMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfSTJDMSAgICAgICAgICAgICAoMHgwMDAwMDAyMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfSTJDMiAgICAgICAgICAgICAoMHgwMDAwMDA0MFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfQURDMTIgICAgICAgICAgICAoMHgwMDAwMDA4MFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfQURDMzQgICAgICAgICAgICAoMHgwMDAwMDEwMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfSTJTICAgICAgICAgICAgICAoMHgwMDAwMDIwMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVElNMSAgICAgICAgICAgICAoMHgwMDAwMTAwMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVElNOCAgICAgICAgICAgICAoMHgwMDAwMjAwMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfUlRDICAgICAgICAgICAgICAoMHgwMDAxMDAwMFUpCisKKyNlbmRpZiAvKiBTVE0zMkYzNTh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4OCkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19VU0FSVDEgICAgICAgICAgICgweDAwMDAwMDAxVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19JMkMxICAgICAgICAgICAgICgweDAwMDAwMDIwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19BREMxMiAgICAgICAgICAgICgweDAwMDAwMDgwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19USU0xICAgICAgICAgICAgICgweDAwMDAxMDAwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19SVEMgICAgICAgICAgICAgICgweDAwMDEwMDAwVSkKKworI2VuZGlmIC8qIFNUTTMyRjMwM3g4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMzNHg4KQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSAgICAgICAgICAgKDB4MDAwMDAwMDFVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0kyQzEgICAgICAgICAgICAgKDB4MDAwMDAwMjBVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0FEQzEyICAgICAgICAgICAgKDB4MDAwMDAwODBVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1RJTTEgICAgICAgICAgICAgKDB4MDAwMDEwMDBVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0hSVElNMSAgICAgICAgICAgKDB4MDAwMDQwMDBVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1JUQyAgICAgICAgICAgICAgKDB4MDAwMTAwMDBVKQorCisKKyNlbmRpZiAvKiBTVE0zMkYzMzR4OCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMjh4eCkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19VU0FSVDEgICAgICAgICAgICgweDAwMDAwMDAxVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19JMkMxICAgICAgICAgICAgICgweDAwMDAwMDIwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19BREMxMiAgICAgICAgICAgICgweDAwMDAwMDgwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19USU0xICAgICAgICAgICAgICgweDAwMDAxMDAwVSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19SVEMgICAgICAgICAgICAgICgweDAwMDEwMDAwVSkKKworI2VuZGlmIC8qIFNUTTMyRjMyOHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSAgICAgICAgICAgKDB4MDAwMDAwMDFVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMiAgICAgICAgICAgKDB4MDAwMDAwMDJVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMyAgICAgICAgICAgKDB4MDAwMDAwMDRVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0kyQzEgICAgICAgICAgICAgKDB4MDAwMDAwMjBVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0kyQzIgICAgICAgICAgICAgKDB4MDAwMDAwNDBVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0FEQzEgICAgICAgICAgICAgKDB4MDAwMDAwODBVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0NFQyAgICAgICAgICAgICAgKDB4MDAwMDA0MDBVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1NEQURDICAgICAgICAgICAgKDB4MDAwMDA4MDBVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1JUQyAgICAgICAgICAgICAgKDB4MDAwMTAwMDBVKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1VTQiAgICAgICAgICAgICAgKDB4MDAwMjAwMDBVKQorCisjZW5kaWYgLyogU1RNMzJGMzczeEMgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzc4eHgpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVVNBUlQxICAgICAgICAgICAoMHgwMDAwMDAwMVUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVVNBUlQyICAgICAgICAgICAoMHgwMDAwMDAwMlUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVVNBUlQzICAgICAgICAgICAoMHgwMDAwMDAwNFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfSTJDMSAgICAgICAgICAgICAoMHgwMDAwMDAyMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfSTJDMiAgICAgICAgICAgICAoMHgwMDAwMDA0MFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfQURDMSAgICAgICAgICAgICAoMHgwMDAwMDA4MFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfQ0VDICAgICAgICAgICAgICAoMHgwMDAwMDQwMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfU0RBREMgICAgICAgICAgICAoMHgwMDAwMDgwMFUpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfUlRDICAgICAgICAgICAgICAoMHgwMDAxMDAwMFUpCisKKyNlbmRpZiAvKiBTVE0zMkYzNzh4eCAqLworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfVVNBUlQxX0Nsb2NrX1NvdXJjZSBSQ0MgRXh0ZW5kZWQgVVNBUlQxIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzEgICAgICAgIFJDQ19DRkdSM19VU0FSVDFTV19QQ0xLMQorI2RlZmluZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1NZU0NMSyAgICAgICBSQ0NfQ0ZHUjNfVVNBUlQxU1dfU1lTQ0xLCisjZGVmaW5lIFJDQ19VU0FSVDFDTEtTT1VSQ0VfTFNFICAgICAgICAgIFJDQ19DRkdSM19VU0FSVDFTV19MU0UKKyNkZWZpbmUgUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0kgICAgICAgICAgUkNDX0NGR1IzX1VTQVJUMVNXX0hTSQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0kyQzJfQ2xvY2tfU291cmNlIFJDQyBFeHRlbmRlZCBJMkMyIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19JMkMyQ0xLU09VUkNFX0hTSSAgICAgICAgICAgIFJDQ19DRkdSM19JMkMyU1dfSFNJCisjZGVmaW5lIFJDQ19JMkMyQ0xLU09VUkNFX1NZU0NMSyAgICAgICAgIFJDQ19DRkdSM19JMkMyU1dfU1lTQ0xLCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfSTJDM19DbG9ja19Tb3VyY2UgUkNDIEV4dGVuZGVkIEkyQzMgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0kyQzNDTEtTT1VSQ0VfSFNJICAgICAgICAgICAgUkNDX0NGR1IzX0kyQzNTV19IU0kKKyNkZWZpbmUgUkNDX0kyQzNDTEtTT1VSQ0VfU1lTQ0xLICAgICAgICAgUkNDX0NGR1IzX0kyQzNTV19TWVNDTEsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9BREMxX0Nsb2NrX1NvdXJjZSBSQ0MgRXh0ZW5kZWQgQURDMSBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfQURDMVBMTENMS19PRkYgICAgICAgICAgICAgICBSQ0NfQ0ZHUjJfQURDMVBSRVNfTk8KKyNkZWZpbmUgUkNDX0FEQzFQTExDTEtfRElWMSAgICAgICAgICAgICAgUkNDX0NGR1IyX0FEQzFQUkVTX0RJVjEKKyNkZWZpbmUgUkNDX0FEQzFQTExDTEtfRElWMiAgICAgICAgICAgICAgUkNDX0NGR1IyX0FEQzFQUkVTX0RJVjIKKyNkZWZpbmUgUkNDX0FEQzFQTExDTEtfRElWNCAgICAgICAgICAgICAgUkNDX0NGR1IyX0FEQzFQUkVTX0RJVjQKKyNkZWZpbmUgUkNDX0FEQzFQTExDTEtfRElWNiAgICAgICAgICAgICAgUkNDX0NGR1IyX0FEQzFQUkVTX0RJVjYKKyNkZWZpbmUgUkNDX0FEQzFQTExDTEtfRElWOCAgICAgICAgICAgICAgUkNDX0NGR1IyX0FEQzFQUkVTX0RJVjgKKyNkZWZpbmUgUkNDX0FEQzFQTExDTEtfRElWMTAgICAgICAgICAgICAgUkNDX0NGR1IyX0FEQzFQUkVTX0RJVjEwCisjZGVmaW5lIFJDQ19BREMxUExMQ0xLX0RJVjEyICAgICAgICAgICAgIFJDQ19DRkdSMl9BREMxUFJFU19ESVYxMgorI2RlZmluZSBSQ0NfQURDMVBMTENMS19ESVYxNiAgICAgICAgICAgICBSQ0NfQ0ZHUjJfQURDMVBSRVNfRElWMTYKKyNkZWZpbmUgUkNDX0FEQzFQTExDTEtfRElWMzIgICAgICAgICAgICAgUkNDX0NGR1IyX0FEQzFQUkVTX0RJVjMyCisjZGVmaW5lIFJDQ19BREMxUExMQ0xLX0RJVjY0ICAgICAgICAgICAgIFJDQ19DRkdSMl9BREMxUFJFU19ESVY2NAorI2RlZmluZSBSQ0NfQURDMVBMTENMS19ESVYxMjggICAgICAgICAgICBSQ0NfQ0ZHUjJfQURDMVBSRVNfRElWMTI4CisjZGVmaW5lIFJDQ19BREMxUExMQ0xLX0RJVjI1NiAgICAgICAgICAgIFJDQ19DRkdSMl9BREMxUFJFU19ESVYyNTYKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9JMlNfQ2xvY2tfU291cmNlIFJDQyBFeHRlbmRlZCBJMlMgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0kyU0NMS1NPVVJDRV9TWVNDTEsgICAgICAgICAgUkNDX0NGR1JfSTJTU1JDX1NZU0NMSworI2RlZmluZSBSQ0NfSTJTQ0xLU09VUkNFX0VYVCAgICAgICAgICAgICBSQ0NfQ0ZHUl9JMlNTUkNfRVhUCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfVElNMV9DbG9ja19Tb3VyY2UgUkNDIEV4dGVuZGVkIFRJTTEgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX1RJTTFDTEtfSENMSyAgICAgICAgICAgICAgICAgIFJDQ19DRkdSM19USU0xU1dfSENMSworI2RlZmluZSBSQ0NfVElNMUNMS19QTExDTEsgICAgICAgICAgICAgICAgUkNDX0NGR1IzX1RJTTFTV19QTEwKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9USU0xNV9DbG9ja19Tb3VyY2UgUkNDIEV4dGVuZGVkIFRJTTE1IENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19USU0xNUNMS19IQ0xLICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUjNfVElNMTVTV19IQ0xLCisjZGVmaW5lIFJDQ19USU0xNUNMS19QTExDTEsgICAgICAgICAgICAgICBSQ0NfQ0ZHUjNfVElNMTVTV19QTEwKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9USU0xNl9DbG9ja19Tb3VyY2UgUkNDIEV4dGVuZGVkIFRJTTE2IENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19USU0xNkNMS19IQ0xLICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUjNfVElNMTZTV19IQ0xLCisjZGVmaW5lIFJDQ19USU0xNkNMS19QTExDTEsgICAgICAgICAgICAgICBSQ0NfQ0ZHUjNfVElNMTZTV19QTEwKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9USU0xN19DbG9ja19Tb3VyY2UgUkNDIEV4dGVuZGVkIFRJTTE3IENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19USU0xN0NMS19IQ0xLICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUjNfVElNMTdTV19IQ0xLCisjZGVmaW5lIFJDQ19USU0xN0NMS19QTExDTEsgICAgICAgICAgICAgICBSQ0NfQ0ZHUjNfVElNMTdTV19QTEwKKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorCisvKiogQGRlZmdyb3VwIFJDQ0V4X1VTQVJUMV9DbG9ja19Tb3VyY2UgUkNDIEV4dGVuZGVkIFVTQVJUMSBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsyICAgICAgICBSQ0NfQ0ZHUjNfVVNBUlQxU1dfUENMSzIKKyNkZWZpbmUgUkNDX1VTQVJUMUNMS1NPVVJDRV9TWVNDTEsgICAgICAgUkNDX0NGR1IzX1VTQVJUMVNXX1NZU0NMSworI2RlZmluZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0xTRSAgICAgICAgICBSQ0NfQ0ZHUjNfVVNBUlQxU1dfTFNFCisjZGVmaW5lIFJDQ19VU0FSVDFDTEtTT1VSQ0VfSFNJICAgICAgICAgIFJDQ19DRkdSM19VU0FSVDFTV19IU0kKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9JMkMyX0Nsb2NrX1NvdXJjZSBSQ0MgRXh0ZW5kZWQgSTJDMiBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfSTJDMkNMS1NPVVJDRV9IU0kgICAgICAgICAgICBSQ0NfQ0ZHUjNfSTJDMlNXX0hTSQorI2RlZmluZSBSQ0NfSTJDMkNMS1NPVVJDRV9TWVNDTEsgICAgICAgICBSQ0NfQ0ZHUjNfSTJDMlNXX1NZU0NMSworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0FEQzEyX0Nsb2NrX1NvdXJjZSBSQ0MgRXh0ZW5kZWQgQURDMTIgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKworLyogQURDMSAmIEFEQzIgKi8KKyNkZWZpbmUgUkNDX0FEQzEyUExMQ0xLX09GRiAgICAgICAgICAgICAgUkNDX0NGR1IyX0FEQ1BSRTEyX05PCisjZGVmaW5lIFJDQ19BREMxMlBMTENMS19ESVYxICAgICAgICAgICAgIFJDQ19DRkdSMl9BRENQUkUxMl9ESVYxCisjZGVmaW5lIFJDQ19BREMxMlBMTENMS19ESVYyICAgICAgICAgICAgIFJDQ19DRkdSMl9BRENQUkUxMl9ESVYyCisjZGVmaW5lIFJDQ19BREMxMlBMTENMS19ESVY0ICAgICAgICAgICAgIFJDQ19DRkdSMl9BRENQUkUxMl9ESVY0CisjZGVmaW5lIFJDQ19BREMxMlBMTENMS19ESVY2ICAgICAgICAgICAgIFJDQ19DRkdSMl9BRENQUkUxMl9ESVY2CisjZGVmaW5lIFJDQ19BREMxMlBMTENMS19ESVY4ICAgICAgICAgICAgIFJDQ19DRkdSMl9BRENQUkUxMl9ESVY4CisjZGVmaW5lIFJDQ19BREMxMlBMTENMS19ESVYxMCAgICAgICAgICAgIFJDQ19DRkdSMl9BRENQUkUxMl9ESVYxMAorI2RlZmluZSBSQ0NfQURDMTJQTExDTEtfRElWMTIgICAgICAgICAgICBSQ0NfQ0ZHUjJfQURDUFJFMTJfRElWMTIKKyNkZWZpbmUgUkNDX0FEQzEyUExMQ0xLX0RJVjE2ICAgICAgICAgICAgUkNDX0NGR1IyX0FEQ1BSRTEyX0RJVjE2CisjZGVmaW5lIFJDQ19BREMxMlBMTENMS19ESVYzMiAgICAgICAgICAgIFJDQ19DRkdSMl9BRENQUkUxMl9ESVYzMgorI2RlZmluZSBSQ0NfQURDMTJQTExDTEtfRElWNjQgICAgICAgICAgICBSQ0NfQ0ZHUjJfQURDUFJFMTJfRElWNjQKKyNkZWZpbmUgUkNDX0FEQzEyUExMQ0xLX0RJVjEyOCAgICAgICAgICAgUkNDX0NGR1IyX0FEQ1BSRTEyX0RJVjEyOAorI2RlZmluZSBSQ0NfQURDMTJQTExDTEtfRElWMjU2ICAgICAgICAgICBSQ0NfQ0ZHUjJfQURDUFJFMTJfRElWMjU2CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfSTJTX0Nsb2NrX1NvdXJjZSBSQ0MgRXh0ZW5kZWQgSTJTIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19JMlNDTEtTT1VSQ0VfU1lTQ0xLICAgICAgICAgIFJDQ19DRkdSX0kyU1NSQ19TWVNDTEsKKyNkZWZpbmUgUkNDX0kyU0NMS1NPVVJDRV9FWFQgICAgICAgICAgICAgUkNDX0NGR1JfSTJTU1JDX0VYVAorCisvKioKKyAgKiBAfQorICAqLworLyoqIEBkZWZncm91cCBSQ0NFeF9USU0xX0Nsb2NrX1NvdXJjZSBSQ0MgRXh0ZW5kZWQgVElNMSBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfVElNMUNMS19IQ0xLICAgICAgICAgICAgICAgICAgUkNDX0NGR1IzX1RJTTFTV19IQ0xLCisjZGVmaW5lIFJDQ19USU0xQ0xLX1BMTENMSyAgICAgICAgICAgICAgICBSQ0NfQ0ZHUjNfVElNMVNXX1BMTAorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X1VBUlQ0X0Nsb2NrX1NvdXJjZSBSQ0MgRXh0ZW5kZWQgVUFSVDQgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX1VBUlQ0Q0xLU09VUkNFX1BDTEsxICAgICAgICAgUkNDX0NGR1IzX1VBUlQ0U1dfUENMSworI2RlZmluZSBSQ0NfVUFSVDRDTEtTT1VSQ0VfU1lTQ0xLICAgICAgICBSQ0NfQ0ZHUjNfVUFSVDRTV19TWVNDTEsKKyNkZWZpbmUgUkNDX1VBUlQ0Q0xLU09VUkNFX0xTRSAgICAgICAgICAgUkNDX0NGR1IzX1VBUlQ0U1dfTFNFCisjZGVmaW5lIFJDQ19VQVJUNENMS1NPVVJDRV9IU0kgICAgICAgICAgIFJDQ19DRkdSM19VQVJUNFNXX0hTSQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X1VBUlQ1X0Nsb2NrX1NvdXJjZSBSQ0MgRXh0ZW5kZWQgVUFSVDUgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX1VBUlQ1Q0xLU09VUkNFX1BDTEsxICAgICAgICAgUkNDX0NGR1IzX1VBUlQ1U1dfUENMSworI2RlZmluZSBSQ0NfVUFSVDVDTEtTT1VSQ0VfU1lTQ0xLICAgICAgICBSQ0NfQ0ZHUjNfVUFSVDVTV19TWVNDTEsKKyNkZWZpbmUgUkNDX1VBUlQ1Q0xLU09VUkNFX0xTRSAgICAgICAgICAgUkNDX0NGR1IzX1VBUlQ1U1dfTFNFCisjZGVmaW5lIFJDQ19VQVJUNUNMS1NPVVJDRV9IU0kgICAgICAgICAgIFJDQ19DRkdSM19VQVJUNVNXX0hTSQorCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfVVNBUlQxX0Nsb2NrX1NvdXJjZSBSQ0MgRXh0ZW5kZWQgVVNBUlQxIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzIgICAgICAgIFJDQ19DRkdSM19VU0FSVDFTV19QQ0xLMgorI2RlZmluZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1NZU0NMSyAgICAgICBSQ0NfQ0ZHUjNfVVNBUlQxU1dfU1lTQ0xLCisjZGVmaW5lIFJDQ19VU0FSVDFDTEtTT1VSQ0VfTFNFICAgICAgICAgIFJDQ19DRkdSM19VU0FSVDFTV19MU0UKKyNkZWZpbmUgUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0kgICAgICAgICAgUkNDX0NGR1IzX1VTQVJUMVNXX0hTSQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0kyQzJfQ2xvY2tfU291cmNlIFJDQyBFeHRlbmRlZCBJMkMyIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19JMkMyQ0xLU09VUkNFX0hTSSAgICAgICAgICAgIFJDQ19DRkdSM19JMkMyU1dfSFNJCisjZGVmaW5lIFJDQ19JMkMyQ0xLU09VUkNFX1NZU0NMSyAgICAgICAgIFJDQ19DRkdSM19JMkMyU1dfU1lTQ0xLCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfSTJDM19DbG9ja19Tb3VyY2UgUkNDIEV4dGVuZGVkIEkyQzMgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0kyQzNDTEtTT1VSQ0VfSFNJICAgICAgICAgICAgUkNDX0NGR1IzX0kyQzNTV19IU0kKKyNkZWZpbmUgUkNDX0kyQzNDTEtTT1VSQ0VfU1lTQ0xLICAgICAgICAgUkNDX0NGR1IzX0kyQzNTV19TWVNDTEsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9BREMxMl9DbG9ja19Tb3VyY2UgUkNDIEV4dGVuZGVkIEFEQzEyIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisKKy8qIEFEQzEgJiBBREMyICovCisjZGVmaW5lIFJDQ19BREMxMlBMTENMS19PRkYgICAgICAgICAgICAgIFJDQ19DRkdSMl9BRENQUkUxMl9OTworI2RlZmluZSBSQ0NfQURDMTJQTExDTEtfRElWMSAgICAgICAgICAgICBSQ0NfQ0ZHUjJfQURDUFJFMTJfRElWMQorI2RlZmluZSBSQ0NfQURDMTJQTExDTEtfRElWMiAgICAgICAgICAgICBSQ0NfQ0ZHUjJfQURDUFJFMTJfRElWMgorI2RlZmluZSBSQ0NfQURDMTJQTExDTEtfRElWNCAgICAgICAgICAgICBSQ0NfQ0ZHUjJfQURDUFJFMTJfRElWNAorI2RlZmluZSBSQ0NfQURDMTJQTExDTEtfRElWNiAgICAgICAgICAgICBSQ0NfQ0ZHUjJfQURDUFJFMTJfRElWNgorI2RlZmluZSBSQ0NfQURDMTJQTExDTEtfRElWOCAgICAgICAgICAgICBSQ0NfQ0ZHUjJfQURDUFJFMTJfRElWOAorI2RlZmluZSBSQ0NfQURDMTJQTExDTEtfRElWMTAgICAgICAgICAgICBSQ0NfQ0ZHUjJfQURDUFJFMTJfRElWMTAKKyNkZWZpbmUgUkNDX0FEQzEyUExMQ0xLX0RJVjEyICAgICAgICAgICAgUkNDX0NGR1IyX0FEQ1BSRTEyX0RJVjEyCisjZGVmaW5lIFJDQ19BREMxMlBMTENMS19ESVYxNiAgICAgICAgICAgIFJDQ19DRkdSMl9BRENQUkUxMl9ESVYxNgorI2RlZmluZSBSQ0NfQURDMTJQTExDTEtfRElWMzIgICAgICAgICAgICBSQ0NfQ0ZHUjJfQURDUFJFMTJfRElWMzIKKyNkZWZpbmUgUkNDX0FEQzEyUExMQ0xLX0RJVjY0ICAgICAgICAgICAgUkNDX0NGR1IyX0FEQ1BSRTEyX0RJVjY0CisjZGVmaW5lIFJDQ19BREMxMlBMTENMS19ESVYxMjggICAgICAgICAgIFJDQ19DRkdSMl9BRENQUkUxMl9ESVYxMjgKKyNkZWZpbmUgUkNDX0FEQzEyUExMQ0xLX0RJVjI1NiAgICAgICAgICAgUkNDX0NGR1IyX0FEQ1BSRTEyX0RJVjI1NgorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0kyU19DbG9ja19Tb3VyY2UgUkNDIEV4dGVuZGVkIEkyUyBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfSTJTQ0xLU09VUkNFX1NZU0NMSyAgICAgICAgICBSQ0NfQ0ZHUl9JMlNTUkNfU1lTQ0xLCisjZGVmaW5lIFJDQ19JMlNDTEtTT1VSQ0VfRVhUICAgICAgICAgICAgIFJDQ19DRkdSX0kyU1NSQ19FWFQKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9USU0xX0Nsb2NrX1NvdXJjZSBSQ0MgRXh0ZW5kZWQgVElNMSBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfVElNMUNMS19IQ0xLICAgICAgICAgICAgICAgICAgUkNDX0NGR1IzX1RJTTFTV19IQ0xLCisjZGVmaW5lIFJDQ19USU0xQ0xLX1BMTENMSyAgICAgICAgICAgICAgICBSQ0NfQ0ZHUjNfVElNMVNXX1BMTAorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X1RJTTJfQ2xvY2tfU291cmNlIFJDQyBFeHRlbmRlZCBUSU0yIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19USU0yQ0xLX0hDTEsgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUjNfVElNMlNXX0hDTEsKKyNkZWZpbmUgUkNDX1RJTTJDTEtfUExMQ0xLICAgICAgICAgICAgICAgIFJDQ19DRkdSM19USU0yU1dfUExMCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfVElNMzRfQ2xvY2tfU291cmNlIFJDQyBFeHRlbmRlZCBUSU0zICYgVElNNCBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfVElNMzRDTEtfSENMSyAgICAgICAgICAgICAgICAgIFJDQ19DRkdSM19USU0zNFNXX0hDTEsKKyNkZWZpbmUgUkNDX1RJTTM0Q0xLX1BMTENMSyAgICAgICAgICAgICAgICBSQ0NfQ0ZHUjNfVElNMzRTV19QTEwKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9USU0xNV9DbG9ja19Tb3VyY2UgUkNDIEV4dGVuZGVkIFRJTTE1IENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19USU0xNUNMS19IQ0xLICAgICAgICAgICAgICAgICAgUkNDX0NGR1IzX1RJTTE1U1dfSENMSworI2RlZmluZSBSQ0NfVElNMTVDTEtfUExMQ0xLICAgICAgICAgICAgICAgIFJDQ19DRkdSM19USU0xNVNXX1BMTAorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X1RJTTE2X0Nsb2NrX1NvdXJjZSBSQ0MgRXh0ZW5kZWQgVElNMTYgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX1RJTTE2Q0xLX0hDTEsgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUjNfVElNMTZTV19IQ0xLCisjZGVmaW5lIFJDQ19USU0xNkNMS19QTExDTEsgICAgICAgICAgICAgICAgUkNDX0NGR1IzX1RJTTE2U1dfUExMCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfVElNMTdfQ2xvY2tfU291cmNlIFJDQyBFeHRlbmRlZCBUSU0xNyBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfVElNMTdDTEtfSENMSyAgICAgICAgICAgICAgICAgIFJDQ19DRkdSM19USU0xN1NXX0hDTEsKKyNkZWZpbmUgUkNDX1RJTTE3Q0xLX1BMTENMSyAgICAgICAgICAgICAgICBSQ0NfQ0ZHUjNfVElNMTdTV19QTEwKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9VQVJUNF9DbG9ja19Tb3VyY2UgUkNDIEV4dGVuZGVkIFVBUlQ0IENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19VQVJUNENMS1NPVVJDRV9QQ0xLMSAgICAgICAgIFJDQ19DRkdSM19VQVJUNFNXX1BDTEsKKyNkZWZpbmUgUkNDX1VBUlQ0Q0xLU09VUkNFX1NZU0NMSyAgICAgICAgUkNDX0NGR1IzX1VBUlQ0U1dfU1lTQ0xLCisjZGVmaW5lIFJDQ19VQVJUNENMS1NPVVJDRV9MU0UgICAgICAgICAgIFJDQ19DRkdSM19VQVJUNFNXX0xTRQorI2RlZmluZSBSQ0NfVUFSVDRDTEtTT1VSQ0VfSFNJICAgICAgICAgICBSQ0NfQ0ZHUjNfVUFSVDRTV19IU0kKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9VQVJUNV9DbG9ja19Tb3VyY2UgUkNDIEV4dGVuZGVkIFVBUlQ1IENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19VQVJUNUNMS1NPVVJDRV9QQ0xLMSAgICAgICAgIFJDQ19DRkdSM19VQVJUNVNXX1BDTEsKKyNkZWZpbmUgUkNDX1VBUlQ1Q0xLU09VUkNFX1NZU0NMSyAgICAgICAgUkNDX0NGR1IzX1VBUlQ1U1dfU1lTQ0xLCisjZGVmaW5lIFJDQ19VQVJUNUNMS1NPVVJDRV9MU0UgICAgICAgICAgIFJDQ19DRkdSM19VQVJUNVNXX0xTRQorI2RlZmluZSBSQ0NfVUFSVDVDTEtTT1VSQ0VfSFNJICAgICAgICAgICBSQ0NfQ0ZHUjNfVUFSVDVTV19IU0kKKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCAgZGVmaW5lZChTVE0zMkYzOTh4eCkKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfVElNMjBfQ2xvY2tfU291cmNlIFJDQyBFeHRlbmRlZCBUSU0yMCBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfVElNMjBDTEtfSENMSyAgICAgICAgICAgICAgICAgIFJDQ19DRkdSM19USU0yMFNXX0hDTEsKKyNkZWZpbmUgUkNDX1RJTTIwQ0xLX1BMTENMSyAgICAgICAgICAgICAgICBSQ0NfQ0ZHUjNfVElNMjBTV19QTEwKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eClcCisgIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfQURDMzRfQ2xvY2tfU291cmNlIFJDQyBFeHRlbmRlZCBBREMzNCBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworCisvKiBBREMzICYgQURDNCAqLworI2RlZmluZSBSQ0NfQURDMzRQTExDTEtfT0ZGICAgICAgICAgICAgICBSQ0NfQ0ZHUjJfQURDUFJFMzRfTk8KKyNkZWZpbmUgUkNDX0FEQzM0UExMQ0xLX0RJVjEgICAgICAgICAgICAgUkNDX0NGR1IyX0FEQ1BSRTM0X0RJVjEKKyNkZWZpbmUgUkNDX0FEQzM0UExMQ0xLX0RJVjIgICAgICAgICAgICAgUkNDX0NGR1IyX0FEQ1BSRTM0X0RJVjIKKyNkZWZpbmUgUkNDX0FEQzM0UExMQ0xLX0RJVjQgICAgICAgICAgICAgUkNDX0NGR1IyX0FEQ1BSRTM0X0RJVjQKKyNkZWZpbmUgUkNDX0FEQzM0UExMQ0xLX0RJVjYgICAgICAgICAgICAgUkNDX0NGR1IyX0FEQ1BSRTM0X0RJVjYKKyNkZWZpbmUgUkNDX0FEQzM0UExMQ0xLX0RJVjggICAgICAgICAgICAgUkNDX0NGR1IyX0FEQ1BSRTM0X0RJVjgKKyNkZWZpbmUgUkNDX0FEQzM0UExMQ0xLX0RJVjEwICAgICAgICAgICAgUkNDX0NGR1IyX0FEQ1BSRTM0X0RJVjEwCisjZGVmaW5lIFJDQ19BREMzNFBMTENMS19ESVYxMiAgICAgICAgICAgIFJDQ19DRkdSMl9BRENQUkUzNF9ESVYxMgorI2RlZmluZSBSQ0NfQURDMzRQTExDTEtfRElWMTYgICAgICAgICAgICBSQ0NfQ0ZHUjJfQURDUFJFMzRfRElWMTYKKyNkZWZpbmUgUkNDX0FEQzM0UExMQ0xLX0RJVjMyICAgICAgICAgICAgUkNDX0NGR1IyX0FEQ1BSRTM0X0RJVjMyCisjZGVmaW5lIFJDQ19BREMzNFBMTENMS19ESVY2NCAgICAgICAgICAgIFJDQ19DRkdSMl9BRENQUkUzNF9ESVY2NAorI2RlZmluZSBSQ0NfQURDMzRQTExDTEtfRElWMTI4ICAgICAgICAgICBSQ0NfQ0ZHUjJfQURDUFJFMzRfRElWMTI4CisjZGVmaW5lIFJDQ19BREMzNFBMTENMS19ESVYyNTYgICAgICAgICAgIFJDQ19DRkdSMl9BRENQUkUzNF9ESVYyNTYKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9USU04X0Nsb2NrX1NvdXJjZSBSQ0MgRXh0ZW5kZWQgVElNOCBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfVElNOENMS19IQ0xLICAgICAgICAgICAgICAgICAgUkNDX0NGR1IzX1RJTThTV19IQ0xLCisjZGVmaW5lIFJDQ19USU04Q0xLX1BMTENMSyAgICAgICAgICAgICAgICBSQ0NfQ0ZHUjNfVElNOFNXX1BMTAorCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgU1RNMzJGMzU4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfVVNBUlQxX0Nsb2NrX1NvdXJjZSBSQ0MgRXh0ZW5kZWQgVVNBUlQxIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzEgICAgICAgIFJDQ19DRkdSM19VU0FSVDFTV19QQ0xLMQorI2RlZmluZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1NZU0NMSyAgICAgICBSQ0NfQ0ZHUjNfVVNBUlQxU1dfU1lTQ0xLCisjZGVmaW5lIFJDQ19VU0FSVDFDTEtTT1VSQ0VfTFNFICAgICAgICAgIFJDQ19DRkdSM19VU0FSVDFTV19MU0UKKyNkZWZpbmUgUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0kgICAgICAgICAgUkNDX0NGR1IzX1VTQVJUMVNXX0hTSQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0FEQzEyX0Nsb2NrX1NvdXJjZSBSQ0MgRXh0ZW5kZWQgQURDMTIgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKy8qIEFEQzEgJiBBREMyICovCisjZGVmaW5lIFJDQ19BREMxMlBMTENMS19PRkYgICAgICAgICAgICAgIFJDQ19DRkdSMl9BRENQUkUxMl9OTworI2RlZmluZSBSQ0NfQURDMTJQTExDTEtfRElWMSAgICAgICAgICAgICBSQ0NfQ0ZHUjJfQURDUFJFMTJfRElWMQorI2RlZmluZSBSQ0NfQURDMTJQTExDTEtfRElWMiAgICAgICAgICAgICBSQ0NfQ0ZHUjJfQURDUFJFMTJfRElWMgorI2RlZmluZSBSQ0NfQURDMTJQTExDTEtfRElWNCAgICAgICAgICAgICBSQ0NfQ0ZHUjJfQURDUFJFMTJfRElWNAorI2RlZmluZSBSQ0NfQURDMTJQTExDTEtfRElWNiAgICAgICAgICAgICBSQ0NfQ0ZHUjJfQURDUFJFMTJfRElWNgorI2RlZmluZSBSQ0NfQURDMTJQTExDTEtfRElWOCAgICAgICAgICAgICBSQ0NfQ0ZHUjJfQURDUFJFMTJfRElWOAorI2RlZmluZSBSQ0NfQURDMTJQTExDTEtfRElWMTAgICAgICAgICAgICBSQ0NfQ0ZHUjJfQURDUFJFMTJfRElWMTAKKyNkZWZpbmUgUkNDX0FEQzEyUExMQ0xLX0RJVjEyICAgICAgICAgICAgUkNDX0NGR1IyX0FEQ1BSRTEyX0RJVjEyCisjZGVmaW5lIFJDQ19BREMxMlBMTENMS19ESVYxNiAgICAgICAgICAgIFJDQ19DRkdSMl9BRENQUkUxMl9ESVYxNgorI2RlZmluZSBSQ0NfQURDMTJQTExDTEtfRElWMzIgICAgICAgICAgICBSQ0NfQ0ZHUjJfQURDUFJFMTJfRElWMzIKKyNkZWZpbmUgUkNDX0FEQzEyUExMQ0xLX0RJVjY0ICAgICAgICAgICAgUkNDX0NGR1IyX0FEQ1BSRTEyX0RJVjY0CisjZGVmaW5lIFJDQ19BREMxMlBMTENMS19ESVYxMjggICAgICAgICAgIFJDQ19DRkdSMl9BRENQUkUxMl9ESVYxMjgKKyNkZWZpbmUgUkNDX0FEQzEyUExMQ0xLX0RJVjI1NiAgICAgICAgICAgUkNDX0NGR1IyX0FEQ1BSRTEyX0RJVjI1NgorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X1RJTTFfQ2xvY2tfU291cmNlIFJDQyBFeHRlbmRlZCBUSU0xIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19USU0xQ0xLX0hDTEsgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUjNfVElNMVNXX0hDTEsKKyNkZWZpbmUgUkNDX1RJTTFDTEtfUExMQ0xLICAgICAgICAgICAgICAgIFJDQ19DRkdSM19USU0xU1dfUExMCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMzR4OCkKKworLyoqIEBkZWZncm91cCBSQ0NFeF9IUlRJTTFfQ2xvY2tfU291cmNlIFJDQyBFeHRlbmRlZCBIUlRJTTEgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0hSVElNMUNMS19IQ0xLICAgICAgICAgICAgICAgIFJDQ19DRkdSM19IUlRJTTFTV19IQ0xLCisjZGVmaW5lIFJDQ19IUlRJTTFDTEtfUExMQ0xLICAgICAgICAgICAgICBSQ0NfQ0ZHUjNfSFJUSU0xU1dfUExMCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBTVE0zMkYzMzR4OCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKworLyoqIEBkZWZncm91cCBSQ0NFeF9VU0FSVDFfQ2xvY2tfU291cmNlICBSQ0MgRXh0ZW5kZWQgVVNBUlQxIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzIgICAgICAgIFJDQ19DRkdSM19VU0FSVDFTV19QQ0xLMgorI2RlZmluZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1NZU0NMSyAgICAgICBSQ0NfQ0ZHUjNfVVNBUlQxU1dfU1lTQ0xLCisjZGVmaW5lIFJDQ19VU0FSVDFDTEtTT1VSQ0VfTFNFICAgICAgICAgIFJDQ19DRkdSM19VU0FSVDFTV19MU0UKKyNkZWZpbmUgUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0kgICAgICAgICAgUkNDX0NGR1IzX1VTQVJUMVNXX0hTSQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0kyQzJfQ2xvY2tfU291cmNlICBSQ0MgRXh0ZW5kZWQgSTJDMiBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfSTJDMkNMS1NPVVJDRV9IU0kgICAgICAgICAgICBSQ0NfQ0ZHUjNfSTJDMlNXX0hTSQorI2RlZmluZSBSQ0NfSTJDMkNMS1NPVVJDRV9TWVNDTEsgICAgICAgICBSQ0NfQ0ZHUjNfSTJDMlNXX1NZU0NMSworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0FEQzFfQ2xvY2tfU291cmNlICBSQ0MgRXh0ZW5kZWQgQURDMSBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworCisvKiBBREMxICovCisjZGVmaW5lIFJDQ19BREMxUENMSzJfRElWMiAgICAgICAgICAgICAgIFJDQ19DRkdSX0FEQ1BSRV9ESVYyCisjZGVmaW5lIFJDQ19BREMxUENMSzJfRElWNCAgICAgICAgICAgICAgIFJDQ19DRkdSX0FEQ1BSRV9ESVY0CisjZGVmaW5lIFJDQ19BREMxUENMSzJfRElWNiAgICAgICAgICAgICAgIFJDQ19DRkdSX0FEQ1BSRV9ESVY2CisjZGVmaW5lIFJDQ19BREMxUENMSzJfRElWOCAgICAgICAgICAgICAgIFJDQ19DRkdSX0FEQ1BSRV9ESVY4CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfQ0VDX0Nsb2NrX1NvdXJjZSBSQ0MgRXh0ZW5kZWQgQ0VDIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19DRUNDTEtTT1VSQ0VfSFNJICAgICAgICAgICAgIFJDQ19DRkdSM19DRUNTV19IU0lfRElWMjQ0CisjZGVmaW5lIFJDQ19DRUNDTEtTT1VSQ0VfTFNFICAgICAgICAgICAgIFJDQ19DRkdSM19DRUNTV19MU0UKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9TREFEQ19DbG9ja19QcmVzY2FsZXIgUkNDIEV4dGVuZGVkIFNEQURDIENsb2NrIFByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19TREFEQ1NZU0NMS19ESVYxICAgICAgICAgICAgIFJDQ19DRkdSX1NEUFJFX0RJVjEKKyNkZWZpbmUgUkNDX1NEQURDU1lTQ0xLX0RJVjIgICAgICAgICAgICAgUkNDX0NGR1JfU0RQUkVfRElWMgorI2RlZmluZSBSQ0NfU0RBRENTWVNDTEtfRElWNCAgICAgICAgICAgICBSQ0NfQ0ZHUl9TRFBSRV9ESVY0CisjZGVmaW5lIFJDQ19TREFEQ1NZU0NMS19ESVY2ICAgICAgICAgICAgIFJDQ19DRkdSX1NEUFJFX0RJVjYKKyNkZWZpbmUgUkNDX1NEQURDU1lTQ0xLX0RJVjggICAgICAgICAgICAgUkNDX0NGR1JfU0RQUkVfRElWOAorI2RlZmluZSBSQ0NfU0RBRENTWVNDTEtfRElWMTAgICAgICAgICAgICBSQ0NfQ0ZHUl9TRFBSRV9ESVYxMAorI2RlZmluZSBSQ0NfU0RBRENTWVNDTEtfRElWMTIgICAgICAgICAgICBSQ0NfQ0ZHUl9TRFBSRV9ESVYxMgorI2RlZmluZSBSQ0NfU0RBRENTWVNDTEtfRElWMTQgICAgICAgICAgICBSQ0NfQ0ZHUl9TRFBSRV9ESVYxNAorI2RlZmluZSBSQ0NfU0RBRENTWVNDTEtfRElWMTYgICAgICAgICAgICBSQ0NfQ0ZHUl9TRFBSRV9ESVYxNgorI2RlZmluZSBSQ0NfU0RBRENTWVNDTEtfRElWMjAgICAgICAgICAgICBSQ0NfQ0ZHUl9TRFBSRV9ESVYyMAorI2RlZmluZSBSQ0NfU0RBRENTWVNDTEtfRElWMjQgICAgICAgICAgICBSQ0NfQ0ZHUl9TRFBSRV9ESVYyNAorI2RlZmluZSBSQ0NfU0RBRENTWVNDTEtfRElWMjggICAgICAgICAgICBSQ0NfQ0ZHUl9TRFBSRV9ESVYyOAorI2RlZmluZSBSQ0NfU0RBRENTWVNDTEtfRElWMzIgICAgICAgICAgICBSQ0NfQ0ZHUl9TRFBSRV9ESVYzMgorI2RlZmluZSBSQ0NfU0RBRENTWVNDTEtfRElWMzYgICAgICAgICAgICBSQ0NfQ0ZHUl9TRFBSRV9ESVYzNgorI2RlZmluZSBSQ0NfU0RBRENTWVNDTEtfRElWNDAgICAgICAgICAgICBSQ0NfQ0ZHUl9TRFBSRV9ESVY0MAorI2RlZmluZSBSQ0NfU0RBRENTWVNDTEtfRElWNDQgICAgICAgICAgICBSQ0NfQ0ZHUl9TRFBSRV9ESVY0NAorI2RlZmluZSBSQ0NfU0RBRENTWVNDTEtfRElWNDggICAgICAgICAgICBSQ0NfQ0ZHUl9TRFBSRV9ESVY0OAorCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpXAorICB8fCBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKVwKKyAgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQoU1RNMzJGMzczeEMpCisvKiogQGRlZmdyb3VwIFJDQ0V4X1VTQl9DbG9ja19Tb3VyY2UgIFJDQyBFeHRlbmRlZCBVU0IgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBSQ0NfVVNCQ0xLU09VUkNFX1BMTCAgICAgICAgICAgICAgIFJDQ19DRkdSX1VTQlBSRV9ESVYxCisjZGVmaW5lIFJDQ19VU0JDTEtTT1VSQ0VfUExMX0RJVjFfNSAgICAgICAgICAgICBSQ0NfQ0ZHUl9VU0JQUkVfRElWMV81CisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeDggICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzNzN4QyAgICAgICAgICAgICAgICAgICAqLworCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfTUNPeF9DbG9ja19QcmVzY2FsZXIgUkNDIEV4dGVuZGVkIE1DT3ggQ2xvY2sgUHJlc2NhbGVyCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFJDQ19DRkdSX01DT1BSRSkKKworI2RlZmluZSBSQ0NfTUNPRElWXzEgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFJDQ19NQ09ESVZfMiAgICAgICAgICAgICAgICAgICAgICgweDEwMDAwMDAwVSkKKyNkZWZpbmUgUkNDX01DT0RJVl80ICAgICAgICAgICAgICAgICAgICAgKDB4MjAwMDAwMDBVKQorI2RlZmluZSBSQ0NfTUNPRElWXzggICAgICAgICAgICAgICAgICAgICAoMHgzMDAwMDAwMFUpCisjZGVmaW5lIFJDQ19NQ09ESVZfMTYgICAgICAgICAgICAgICAgICAgICgweDQwMDAwMDAwVSkKKyNkZWZpbmUgUkNDX01DT0RJVl8zMiAgICAgICAgICAgICAgICAgICAgKDB4NTAwMDAwMDBVKQorI2RlZmluZSBSQ0NfTUNPRElWXzY0ICAgICAgICAgICAgICAgICAgICAoMHg2MDAwMDAwMFUpCisjZGVmaW5lIFJDQ19NQ09ESVZfMTI4ICAgICAgICAgICAgICAgICAgICgweDcwMDAwMDAwVSkKKworI2Vsc2UKKyAgCisjZGVmaW5lIFJDQ19NQ09ESVZfMSAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorCisjZW5kaWYgLyogUkNDX0NGR1JfTUNPUFJFICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfTFNFRHJpdmVfQ29uZmlndXJhdGlvbiBSQ0MgTFNFIERyaXZlIENvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworCisjZGVmaW5lIFJDQ19MU0VEUklWRV9MT1cgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgLyohPCBYdGFsIG1vZGUgbG93ZXIgZHJpdmluZyBjYXBhYmlsaXR5ICovCisjZGVmaW5lIFJDQ19MU0VEUklWRV9NRURJVU1MT1cgICAgICAgICAgIFJDQ19CRENSX0xTRURSVl8xICAgICAgLyohPCBYdGFsIG1vZGUgbWVkaXVtIGxvdyBkcml2aW5nIGNhcGFiaWxpdHkgKi8KKyNkZWZpbmUgUkNDX0xTRURSSVZFX01FRElVTUhJR0ggICAgICAgICAgUkNDX0JEQ1JfTFNFRFJWXzAgICAgICAvKiE8IFh0YWwgbW9kZSBtZWRpdW0gaGlnaCBkcml2aW5nIGNhcGFiaWxpdHkgKi8KKyNkZWZpbmUgUkNDX0xTRURSSVZFX0hJR0ggICAgICAgICAgICAgICAgUkNDX0JEQ1JfTFNFRFJWICAgICAgICAvKiE8IFh0YWwgbW9kZSBoaWdoZXIgZHJpdmluZyBjYXBhYmlsaXR5ICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJDQ0V4X0V4cG9ydGVkX01hY3JvcyBSQ0MgRXh0ZW5kZWQgRXhwb3J0ZWQgTWFjcm9zCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfUExMX0NvbmZpZ3VyYXRpb24gUkNDIEV4dGVuZGVkIFBMTCBDb25maWd1cmF0aW9uCisgICogQHsgICAKKyAgKi8gCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgUExMIGNsb2NrIHNvdXJjZSwgbXVsdGlwbGljYXRpb24gYW5kIGRpdmlzaW9uIGZhY3RvcnMuCisgICogQG5vdGUgICBUaGlzIG1hY3JvIG11c3QgYmUgdXNlZCBvbmx5IHdoZW4gdGhlIFBMTCBpcyBkaXNhYmxlZC4KKyAgKgorICAqIEBwYXJhbSAgX19SQ0NfUExMU291cmNlX18gc3BlY2lmaWVzIHRoZSBQTEwgZW50cnkgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMU09VUkNFX0hTSSBIU0kgb3NjaWxsYXRvciBjbG9jayBzZWxlY3RlZCBhcyBQTEwgY2xvY2sgZW50cnkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMU09VUkNFX0hTRSBIU0Ugb3NjaWxsYXRvciBjbG9jayBzZWxlY3RlZCBhcyBQTEwgY2xvY2sgZW50cnkKKyAgKiBAcGFyYW0gIF9fUFJFRElWX18gc3BlY2lmaWVzIHRoZSBwcmVkaXZpZGVyIGZhY3RvciBmb3IgUExMIFZDTyBpbnB1dCBjbG9jaworICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIFJDQ19QUkVESVZfRElWMSBhbmQgUkNDX1BSRURJVl9ESVYxNi4KKyAgKiBAcGFyYW0gIF9fUExMTVVMX18gc3BlY2lmaWVzIHRoZSBtdWx0aXBsaWNhdGlvbiBmYWN0b3IgZm9yIFBMTCBWQ08gaW5wdXQgY2xvY2sKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBSQ0NfUExMX01VTDIgYW5kIFJDQ19QTExfTVVMMTYuCisgICoKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1BMTF9DT05GSUcoX19SQ0NfUExMU291cmNlX18gLCBfX1BSRURJVl9fLCBfX1BMTE1VTF9fKSBcCisgICAgICAgICAgICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IyLCBSQ0NfQ0ZHUjJfUFJFRElWLCAoX19QUkVESVZfXykpOyBcCisgICAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9QTExNVUwgfCBSQ0NfQ0ZHUl9QTExTUkMsICh1aW50MzJfdCkoKF9fUExMTVVMX18pfChfX1JDQ19QTExTb3VyY2VfXykpKTsgXAorICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eClcCisgIHx8IGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpXAorICB8fCBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KVwKKyAgfHwgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgUExMIGNsb2NrIHNvdXJjZSBhbmQgbXVsdGlwbGljYXRpb24gZmFjdG9yLgorICAqIEBub3RlICAgVGhpcyBtYWNybyBtdXN0IGJlIHVzZWQgb25seSB3aGVuIHRoZSBQTEwgaXMgZGlzYWJsZWQuCisgICoKKyAgKiBAcGFyYW0gIF9fUkNDX1BMTFNvdXJjZV9fIHNwZWNpZmllcyB0aGUgUExMIGVudHJ5IGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTFNPVVJDRV9IU0kgSFNJIG9zY2lsbGF0b3IgY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGNsb2NrIGVudHJ5CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTFNPVVJDRV9IU0UgSFNFIG9zY2lsbGF0b3IgY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGNsb2NrIGVudHJ5CisgICogQHBhcmFtICBfX1BMTE1VTF9fIHNwZWNpZmllcyB0aGUgbXVsdGlwbGljYXRpb24gZmFjdG9yIGZvciBQTEwgVkNPIGlucHV0IGNsb2NrCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gUkNDX1BMTF9NVUwyIGFuZCBSQ0NfUExMX01VTDE2LgorICAqCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19QTExfQ09ORklHKF9fUkNDX1BMTFNvdXJjZV9fICwgX19QTExNVUxfXykgXAorICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX1BMTE1VTCB8IFJDQ19DRkdSX1BMTFNSQywgKHVpbnQzMl90KSgoX19QTExNVUxfXyl8KF9fUkNDX1BMTFNvdXJjZV9fKSkpCisjZW5kaWYgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisgICAgICAgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovIAorICAgICAgICAgICAgICAgICAgICAKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KVwKKyAgfHwgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eClcCisgIHx8IGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpXAorICB8fCBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorLyoqIEBkZWZncm91cCBSQ0NFeF9IU0VfQ29uZmlndXJhdGlvbiBSQ0MgRXh0ZW5kZWQgSFNFIENvbmZpZ3VyYXRpb24KKyAgKiBAeyAgIAorICAqLyAKKworLyoqCisgICogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIEV4dGVybmFsIEhpZ2ggU3BlZWQgb3NjaWxsYXRvciAoSFNFKSBQcmVkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTC4KKyAgKiBAbm90ZSAgIFByZWRpdmlzaW9uIGZhY3RvciBjYW4gbm90IGJlIGNoYW5nZWQgaWYgUExMIGlzIHVzZWQgYXMgc3lzdGVtIGNsb2NrCisgICogICAgICAgICBJbiB0aGlzIGNhc2UsIHlvdSBoYXZlIHRvIHNlbGVjdCBhbm90aGVyIHNvdXJjZSBvZiB0aGUgc3lzdGVtIGNsb2NrLCBkaXNhYmxlIHRoZSBQTEwgYW5kCisgICogICAgICAgICB0aGVuIGNoYW5nZSB0aGUgSFNFIHByZWRpdmlzaW9uIGZhY3Rvci4KKyAgKiBAcGFyYW0gIF9fSFNFX1BSRURJVl9WQUxVRV9fIHNwZWNpZmllcyB0aGUgZGl2aXNpb24gdmFsdWUgYXBwbGllZCB0byBIU0UuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gUkNDX0hTRV9QUkVESVZfRElWMSBhbmQgUkNDX0hTRV9QUkVESVZfRElWMTYuCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19IU0VfUFJFRElWX0NPTkZJRyhfX0hTRV9QUkVESVZfVkFMVUVfXykgXAorICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IyLCBSQ0NfQ0ZHUjJfUFJFRElWLCAodWludDMyX3QpKF9fSFNFX1BSRURJVl9WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBNYWNybyB0byBnZXQgcHJlZGl2MSBmYWN0b3IgZm9yIFBMTC4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0hTRV9HRVRfUFJFRElWKCkgUkVBRF9CSVQoUkNDLT5DRkdSMiwgUkNDX0NGR1IyX1BSRURJVikKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggICAgKi8KKyAgICAgICAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfQUhCX0Nsb2NrX0VuYWJsZV9EaXNhYmxlIFJDQyBFeHRlbmRlZCBBSEIgQ2xvY2sgRW5hYmxlIERpc2FibGUKKyAgKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBBSEIgcGVyaXBoZXJhbCBjbG9jay4KKyAgKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgcGVyaXBoZXJhbCBjbG9jayAodXNlZCBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGUgYWNjZXNzKQorICAqICAgICAgICAgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sgYmVmb3JlCisgICogICAgICAgICB1c2luZyBpdC4KKyAgKiBAeyAgIAorICAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisjZGVmaW5lIF9fSEFMX1JDQ19BREMxX0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9BREMxRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfQURDMUVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfQURDMV9DTEtfRElTQUJMRSgpICAgICAgICAgKFJDQy0+QUhCRU5SICY9IH4oUkNDX0FIQkVOUl9BREMxRU4pKQorI2VuZGlmIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KVwKKyAgfHwgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkKKyNkZWZpbmUgX19IQUxfUkNDX0RNQTJfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX0RNQTJFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9ETUEyRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0VfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX0dQSU9FRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfR1BJT0VFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19BREMxMl9DTEtfRU5BQkxFKCkgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfQURDMTJFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9BREMxMkVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKy8qIEFsaWFzZXMgZm9yIFNUTTMyIEYzIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0FEQzFfQ0xLX0VOQUJMRSgpICAgICAgICAgIF9fSEFMX1JDQ19BREMxMl9DTEtfRU5BQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX0FEQzJfQ0xLX0VOQUJMRSgpICAgICAgICAgIF9fSEFMX1JDQ19BREMxMl9DTEtfRU5BQkxFKCkKKworI2RlZmluZSBfX0hBTF9SQ0NfRE1BMl9DTEtfRElTQUJMRSgpICAgICAgICAgKFJDQy0+QUhCRU5SICY9IH4oUkNDX0FIQkVOUl9ETUEyRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0VfQ0xLX0RJU0FCTEUoKSAgICAgICAgKFJDQy0+QUhCRU5SICY9IH4oUkNDX0FIQkVOUl9HUElPRUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0FEQzEyX0NMS19ESVNBQkxFKCkgICAgICAgIChSQ0MtPkFIQkVOUiAmPSB+KFJDQ19BSEJFTlJfQURDMTJFTikpCisvKiBBbGlhc2VzIGZvciBTVE0zMiBGMyBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIF9fSEFMX1JDQ19BREMxX0NMS19ESVNBQkxFKCkgICAgICAgICAgX19IQUxfUkNDX0FEQzEyX0NMS19ESVNBQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX0FEQzJfQ0xLX0RJU0FCTEUoKSAgICAgICAgICBfX0hBTF9SQ0NfQURDMTJfQ0xLX0RJU0FCTEUoKQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpXAorICB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorI2RlZmluZSBfX0hBTF9SQ0NfQURDMzRfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX0FEQzM0RU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfQURDMzRFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19BREMzNF9DTEtfRElTQUJMRSgpICAgICAgICAoUkNDLT5BSEJFTlIgJj0gfihSQ0NfQUhCRU5SX0FEQzM0RU4pKQorI2VuZGlmIC8qIFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpCisjZGVmaW5lIF9fSEFMX1JDQ19BREMxMl9DTEtfRU5BQkxFKCkgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfQURDMTJFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9BREMxMkVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKy8qIEFsaWFzZXMgZm9yIFNUTTMyIEYzIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0FEQzFfQ0xLX0VOQUJMRSgpICAgICAgICAgIF9fSEFMX1JDQ19BREMxMl9DTEtfRU5BQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX0FEQzJfQ0xLX0VOQUJMRSgpICAgICAgICAgIF9fSEFMX1JDQ19BREMxMl9DTEtfRU5BQkxFKCkKKworI2RlZmluZSBfX0hBTF9SQ0NfQURDMTJfQ0xLX0RJU0FCTEUoKSAgICAgICAgKFJDQy0+QUhCRU5SICY9IH4oUkNDX0FIQkVOUl9BREMxMkVOKSkKKy8qIEFsaWFzZXMgZm9yIFNUTTMyIEYzIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0FEQzFfQ0xLX0RJU0FCTEUoKSAgICAgICAgICBfX0hBTF9SQ0NfQURDMTJfQ0xLX0RJU0FCTEUoKQorI2RlZmluZSBfX0hBTF9SQ0NfQURDMl9DTEtfRElTQUJMRSgpICAgICAgICAgIF9fSEFMX1JDQ19BREMxMl9DTEtfRElTQUJMRSgpCisjZW5kaWYgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisjZGVmaW5lIF9fSEFMX1JDQ19ETUEyX0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9ETUEyRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfRE1BMkVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9FX0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9HUElPRUVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX0dQSU9FRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19ETUEyX0NMS19ESVNBQkxFKCkgICAgICAgICAoUkNDLT5BSEJFTlIgJj0gfihSQ0NfQUhCRU5SX0RNQTJFTikpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRV9DTEtfRElTQUJMRSgpICAgICAgICAoUkNDLT5BSEJFTlIgJj0gfihSQ0NfQUhCRU5SX0dQSU9FRU4pKQorI2VuZGlmIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KQorI2RlZmluZSBfX0hBTF9SQ0NfRk1DX0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9GTUNFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9GTUNFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPR19DTEtfRU5BQkxFKCkgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfR1BJT0dFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9HUElPR0VOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9IX0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9HUElPSEVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX0dQSU9IRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19GTUNfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAgKFJDQy0+QUhCRU5SICY9IH4oUkNDX0FIQkVOUl9GTUNFTikpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPR19DTEtfRElTQUJMRSgpICAgICAgICAgKFJDQy0+QUhCRU5SICY9IH4oUkNDX0FIQkVOUl9HUElPR0VOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9IX0NMS19ESVNBQkxFKCkgICAgICAgICAoUkNDLT5BSEJFTlIgJj0gfihSQ0NfQUhCRU5SX0dQSU9IRU4pKQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0FQQjFfQ2xvY2tfRW5hYmxlX0Rpc2FibGUgUkNDIEV4dGVuZGVkIEFQQjEgQ2xvY2sgRW5hYmxlIERpc2FibGUKKyAgKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBMb3cgU3BlZWQgQVBCIChBUEIxKSBwZXJpcGhlcmFsIGNsb2NrLgorICAqIEBub3RlICAgQWZ0ZXIgcmVzZXQsIHRoZSBwZXJpcGhlcmFsIGNsb2NrICh1c2VkIGZvciByZWdpc3RlcnMgcmVhZC93cml0ZSBhY2Nlc3MpCisgICogICAgICAgICBpcyBkaXNhYmxlZCBhbmQgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIGhhcyB0byBlbmFibGUgdGhpcyBjbG9jayBiZWZvcmUKKyAgKiAgICAgICAgIHVzaW5nIGl0LgorICAqIEB7ICAgCisgICovCisjaWYgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTJfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfU1BJMkVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfU1BJMkVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTNfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfU1BJM0VOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfU1BJM0VOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzJfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfSTJDMkVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfSTJDMkVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzNfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfSTJDM0VOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfSTJDM0VOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfU1BJMl9DTEtfRElTQUJMRSgpICAgKFJDQy0+QVBCMUVOUiAmPSB+KFJDQ19BUEIxRU5SX1NQSTJFTikpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkzX0NMS19ESVNBQkxFKCkgICAoUkNDLT5BUEIxRU5SICY9IH4oUkNDX0FQQjFFTlJfU1BJM0VOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzJfQ0xLX0RJU0FCTEUoKSAgIChSQ0MtPkFQQjFFTlIgJj0gfihSQ0NfQVBCMUVOUl9JMkMyRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDM19DTEtfRElTQUJMRSgpICAgKFJDQy0+QVBCMUVOUiAmPSB+KFJDQ19BUEIxRU5SX0kyQzNFTikpCisjZW5kaWYgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpXAorICB8fCBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorI2RlZmluZSBfX0hBTF9SQ0NfVElNM19DTEtfRU5BQkxFKCkgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9USU0zRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9USU0zRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNNF9DTEtfRU5BQkxFKCkgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9USU00RU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9USU00RU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMl9DTEtfRU5BQkxFKCkgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9TUEkyRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9TUEkyRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJM19DTEtfRU5BQkxFKCkgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9TUEkzRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9TUEkzRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVUFSVDRfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfVUFSVDRFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1VBUlQ0RU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVUFSVDVfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfVUFSVDVFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1VBUlQ1RU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMl9DTEtfRU5BQkxFKCkgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9JMkMyRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9JMkMyRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU0zX0NMS19ESVNBQkxFKCkgICAoUkNDLT5BUEIxRU5SICY9IH4oUkNDX0FQQjFFTlJfVElNM0VOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTRfQ0xLX0RJU0FCTEUoKSAgIChSQ0MtPkFQQjFFTlIgJj0gfihSQ0NfQVBCMUVOUl9USU00RU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMl9DTEtfRElTQUJMRSgpICAgKFJDQy0+QVBCMUVOUiAmPSB+KFJDQ19BUEIxRU5SX1NQSTJFTikpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkzX0NMS19ESVNBQkxFKCkgICAoUkNDLT5BUEIxRU5SICY9IH4oUkNDX0FQQjFFTlJfU1BJM0VOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1VBUlQ0X0NMS19ESVNBQkxFKCkgIChSQ0MtPkFQQjFFTlIgJj0gfihSQ0NfQVBCMUVOUl9VQVJUNEVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1VBUlQ1X0NMS19ESVNBQkxFKCkgIChSQ0MtPkFQQjFFTlIgJj0gfihSQ0NfQVBCMUVOUl9VQVJUNUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzJfQ0xLX0RJU0FCTEUoKSAgIChSQ0MtPkFQQjFFTlIgJj0gfihSQ0NfQVBCMUVOUl9JMkMyRU4pKQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0zX0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1RJTTNFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1RJTTNFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19EQUMyX0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX0RBQzJFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX0RBQzJFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTNfQ0xLX0RJU0FCTEUoKSAgIChSQ0MtPkFQQjFFTlIgJj0gfihSQ0NfQVBCMUVOUl9USU0zRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfREFDMl9DTEtfRElTQUJMRSgpICAgKFJDQy0+QVBCMUVOUiAmPSB+KFJDQ19BUEIxRU5SX0RBQzJFTikpCisjZW5kaWYgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0zX0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1RJTTNFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1RJTTNFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19USU00X0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1RJTTRFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1RJTTRFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19USU01X0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1RJTTVFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1RJTTVFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xMl9DTEtfRU5BQkxFKCkgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9USU0xMkVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfVElNMTJFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xM19DTEtfRU5BQkxFKCkgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9USU0xM0VOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfVElNMTNFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xNF9DTEtfRU5BQkxFKCkgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9USU0xNEVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfVElNMTRFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xOF9DTEtfRU5BQkxFKCkgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9USU0xOEVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfVElNMThFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkyX0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1NQSTJFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1NQSTJFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkzX0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1NQSTNFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1NQSTNFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMyX0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX0kyQzJFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX0kyQzJFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19EQUMyX0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX0RBQzJFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX0RBQzJFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19DRUNfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfQ0VDRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9DRUNFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTNfQ0xLX0RJU0FCTEUoKSAgIChSQ0MtPkFQQjFFTlIgJj0gfihSQ0NfQVBCMUVOUl9USU0zRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNNF9DTEtfRElTQUJMRSgpICAgKFJDQy0+QVBCMUVOUiAmPSB+KFJDQ19BUEIxRU5SX1RJTTRFTikpCisjZGVmaW5lIF9fSEFMX1JDQ19USU01X0NMS19ESVNBQkxFKCkgICAoUkNDLT5BUEIxRU5SICY9IH4oUkNDX0FQQjFFTlJfVElNNUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTEyX0NMS19ESVNBQkxFKCkgIChSQ0MtPkFQQjFFTlIgJj0gfihSQ0NfQVBCMUVOUl9USU0xMkVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTEzX0NMS19ESVNBQkxFKCkgIChSQ0MtPkFQQjFFTlIgJj0gfihSQ0NfQVBCMUVOUl9USU0xM0VOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE0X0NMS19ESVNBQkxFKCkgIChSQ0MtPkFQQjFFTlIgJj0gfihSQ0NfQVBCMUVOUl9USU0xNEVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE4X0NMS19ESVNBQkxFKCkgIChSQ0MtPkFQQjFFTlIgJj0gfihSQ0NfQVBCMUVOUl9USU0xOEVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTJfQ0xLX0RJU0FCTEUoKSAgIChSQ0MtPkFQQjFFTlIgJj0gfihSQ0NfQVBCMUVOUl9TUEkyRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJM19DTEtfRElTQUJMRSgpICAgKFJDQy0+QVBCMUVOUiAmPSB+KFJDQ19BUEIxRU5SX1NQSTNFTikpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMyX0NMS19ESVNBQkxFKCkgICAoUkNDLT5BUEIxRU5SICY9IH4oUkNDX0FQQjFFTlJfSTJDMkVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0RBQzJfQ0xLX0RJU0FCTEUoKSAgIChSQ0MtPkFQQjFFTlIgJj0gfihSQ0NfQVBCMUVOUl9EQUMyRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfQ0VDX0NMS19ESVNBQkxFKCkgICAgKFJDQy0+QVBCMUVOUiAmPSB+KFJDQ19BUEIxRU5SX0NFQ0VOKSkKKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpICAgICAgICAgICAgICAgICAgICAgICAgXAorICB8fCBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KVwKKyAgfHwgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkgICAgIAorI2RlZmluZSBfX0hBTF9SQ0NfVElNN19DTEtfRU5BQkxFKCkgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9USU03RU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9USU03RU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU03X0NMS19ESVNBQkxFKCkgICAoUkNDLT5BUEIxRU5SICY9IH4oUkNDX0FQQjFFTlJfVElNN0VOKSkKKyNlbmRpZiAvKiBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCAgICAgICAgICAgICAgICB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4ICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAgICAgICAgICAgICAgICAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSlcCisgIHx8IGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpXAorICB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfHwgZGVmaW5lZChTVE0zMkYzNzN4QykKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9DTEtfRU5BQkxFKCkgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9VU0JFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1VTQkVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVVNCX0NMS19ESVNBQkxFKCkgICAgKFJDQy0+QVBCMUVOUiAmPSB+KFJDQ19BUEIxRU5SX1VTQkVOKSkKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeDggICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzNzN4QyAgICAgICAgICAgICAgICAgICAqLworCisjaWYgIWRlZmluZWQoU1RNMzJGMzAxeDgpCisjZGVmaW5lIF9fSEFMX1JDQ19DQU4xX0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX0NBTkVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfQ0FORU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DQU4xX0NMS19ESVNBQkxFKCkgICAgKFJDQy0+QVBCMUVOUiAmPSB+KFJDQ19BUEIxRU5SX0NBTkVOKSkKKyNlbmRpZiAvKiBTVE0zMkYzMDF4OCovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDM19DTEtfRU5BQkxFKCkgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9JMkMzRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9JMkMzRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMzX0NMS19ESVNBQkxFKCkgICAgICAgICAoUkNDLT5BUEIxRU5SICY9IH4oUkNDX0FQQjFFTlJfSTJDM0VOKSkKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCAqLworLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIFJDQ0V4X0FQQjJfQ2xvY2tfRW5hYmxlX0Rpc2FibGUgUkNDIEV4dGVuZGVkIEFQQjIgQ2xvY2sgRW5hYmxlIERpc2FibGUKKyAgKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBIaWdoIFNwZWVkIEFQQiAoQVBCMikgcGVyaXBoZXJhbCBjbG9jay4KKyAgKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgcGVyaXBoZXJhbCBjbG9jayAodXNlZCBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGUgYWNjZXNzKQorICAqICAgICAgICAgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sgYmVmb3JlCisgICogICAgICAgICB1c2luZyBpdC4KKyAgKiBAeyAgIAorICAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpXAorICB8fCBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMV9DTEtfRU5BQkxFKCkgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9TUEkxRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9TUEkxRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkxX0NMS19ESVNBQkxFKCkgICAoUkNDLT5BUEIyRU5SICY9IH4oUkNDX0FQQjJFTlJfU1BJMUVOKSkKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4ICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KVwKKyAgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTThfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNOEVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNOEVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNOF9DTEtfRElTQUJMRSgpICAgKFJDQy0+QVBCMkVOUiAmPSB+KFJDQ19BUEIyRU5SX1RJTThFTikpCisjZW5kaWYgLyogU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTFfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfU1BJMUVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfU1BJMUVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfU1BJMV9DTEtfRElTQUJMRSgpICAgKFJDQy0+QVBCMkVOUiAmPSB+KFJDQ19BUEIyRU5SX1NQSTFFTikpCisjZW5kaWYgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzM0eDgpCisjZGVmaW5lIF9fSEFMX1JDQ19IUlRJTTFfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfSFJUSU0xRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9IUlRJTTFFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0hSVElNMV9DTEtfRElTQUJMRSgpIChSQ0MtPkFQQjJFTlIgJj0gfihSQ0NfQVBCMkVOUl9IUlRJTTFFTikpCisjZW5kaWYgLyogU1RNMzJGMzM0eDggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisjZGVmaW5lIF9fSEFMX1JDQ19BREMxX0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX0FEQzFFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX0FEQzFFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkxX0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1NQSTFFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1NQSTFFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xOV9DTEtfRU5BQkxFKCkgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9USU0xOUVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMTlFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19TREFEQzFfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfU0RBREMxRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9TREFEQzFFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19TREFEQzJfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfU0RBREMyRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9TREFEQzJFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19TREFEQzNfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfU0RBREMzRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9TREFEQzNFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0FEQzFfQ0xLX0RJU0FCTEUoKSAgICAgKFJDQy0+QVBCMkVOUiAmPSB+KFJDQ19BUEIyRU5SX0FEQzFFTikpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkxX0NMS19ESVNBQkxFKCkgICAgIChSQ0MtPkFQQjJFTlIgJj0gfihSQ0NfQVBCMkVOUl9TUEkxRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTlfQ0xLX0RJU0FCTEUoKSAgICAoUkNDLT5BUEIyRU5SICY9IH4oUkNDX0FQQjJFTlJfVElNMTlFTikpCisjZGVmaW5lIF9fSEFMX1JDQ19TREFEQzFfQ0xLX0RJU0FCTEUoKSAgIChSQ0MtPkFQQjJFTlIgJj0gfihSQ0NfQVBCMkVOUl9TREFEQzFFTikpCisjZGVmaW5lIF9fSEFMX1JDQ19TREFEQzJfQ0xLX0RJU0FCTEUoKSAgIChSQ0MtPkFQQjJFTlIgJj0gfihSQ0NfQVBCMkVOUl9TREFEQzJFTikpCisjZGVmaW5lIF9fSEFMX1JDQ19TREFEQzNfQ0xLX0RJU0FCTEUoKSAgIChSQ0MtPkFQQjJFTlIgJj0gfihSQ0NfQVBCMkVOUl9TREFEQzNFTikpCisjZW5kaWYgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpXAorICB8fCBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KVwKKyAgfHwgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eClcCisgIHx8IGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xX0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1RJTTFFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1RJTTFFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTFfQ0xLX0RJU0FCTEUoKSAgIChSQ0MtPkFQQjJFTlIgJj0gfihSQ0NfQVBCMkVOUl9USU0xRU4pKQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJNF9DTEtfRU5BQkxFKCkgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9TUEk0RU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9TUEk0RU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19TUEk0X0NMS19ESVNBQkxFKCkgICAgICAgICAoUkNDLT5BUEIyRU5SICY9IH4oUkNDX0FQQjJFTlJfU1BJNEVOKSkKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCAqLworICAgICAgCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTIwX0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1RJTTIwRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9USU0yMEVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTIwX0NMS19ESVNBQkxFKCkgICAgICAgIChSQ0MtPkFQQjJFTlIgJj0gfihSQ0NfQVBCMkVOUl9USU0yMEVOKSkKKyNlbmRpZiAvKiBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCAqLworICAgICAgCisvKioKKyAgKiBAfQorICAqLworICAgICAgCisvKiogQGRlZmdyb3VwIFJDQ0V4X0FIQl9QZXJpcGhlcmFsX0Nsb2NrX0VuYWJsZV9EaXNhYmxlX1N0YXR1cyBSQ0MgRXh0ZW5kZWQgQUhCIFBlcmlwaGVyYWwgQ2xvY2sgRW5hYmxlIERpc2FibGUgU3RhdHVzCisgICogQGJyaWVmICBHZXQgdGhlIGVuYWJsZSBvciBkaXNhYmxlIHN0YXR1cyBvZiB0aGUgQUhCIHBlcmlwaGVyYWwgY2xvY2suCisgICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlIGFjY2VzcykKKyAgKiAgICAgICAgIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrIGJlZm9yZQorICAqICAgICAgICAgdXNpbmcgaXQuCisgICogQHsKKyAgKi8gCisjaWYgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKyNkZWZpbmUgX19IQUxfUkNDX0FEQzFfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgICAoKFJDQy0+QUhCRU5SICYgKFJDQ19BSEJFTlJfQURDMUVOKSkgIT0gUkVTRVQpCisKKyNkZWZpbmUgX19IQUxfUkNDX0FEQzFfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgICAoKFJDQy0+QUhCRU5SICYgKFJDQ19BSEJFTlJfQURDMUVOKSkgPT0gUkVTRVQpCisjZW5kaWYgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpXAorICB8fCBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorI2RlZmluZSBfX0hBTF9SQ0NfRE1BMl9JU19DTEtfRU5BQkxFRCgpICAgICAgICAgICgoUkNDLT5BSEJFTlIgJiAoUkNDX0FIQkVOUl9ETUEyRU4pKSAgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRV9JU19DTEtfRU5BQkxFRCgpICAgICAgICAgKChSQ0MtPkFIQkVOUiAmIChSQ0NfQUhCRU5SX0dQSU9FRU4pKSAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0FEQzEyX0lTX0NMS19FTkFCTEVEKCkgICAgICAgICAoKFJDQy0+QUhCRU5SICYgKFJDQ19BSEJFTlJfQURDMTJFTikpICE9IFJFU0VUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19ETUEyX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAgKChSQ0MtPkFIQkVOUiAmIChSQ0NfQUhCRU5SX0RNQTJFTikpICA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9FX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAoKFJDQy0+QUhCRU5SICYgKFJDQ19BSEJFTlJfR1BJT0VFTikpID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQURDMTJfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgICgoUkNDLT5BSEJFTlIgJiAoUkNDX0FIQkVOUl9BREMxMkVOKSkgPT0gUkVTRVQpCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eClcCisgIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpCisjZGVmaW5lIF9fSEFMX1JDQ19BREMzNF9JU19DTEtfRU5BQkxFRCgpICAgICAgICAgKChSQ0MtPkFIQkVOUiAmIChSQ0NfQUhCRU5SX0FEQzM0RU4pKSAhPSBSRVNFVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfQURDMzRfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgICgoUkNDLT5BSEJFTlIgJiAoUkNDX0FIQkVOUl9BREMzNEVOKSkgPT0gUkVTRVQpCisjZW5kaWYgLyogU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkKKyNkZWZpbmUgX19IQUxfUkNDX0FEQzEyX0lTX0NMS19FTkFCTEVEKCkgICAgICAgICAoKFJDQy0+QUhCRU5SICYgKFJDQ19BSEJFTlJfQURDMTJFTikpICE9IFJFU0VUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19BREMxMl9JU19DTEtfRElTQUJMRUQoKSAgICAgICAgKChSQ0MtPkFIQkVOUiAmIChSQ0NfQUhCRU5SX0FEQzEyRU4pKSA9PSBSRVNFVCkKKyNlbmRpZiAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKyNkZWZpbmUgX19IQUxfUkNDX0RNQTJfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgICAoKFJDQy0+QUhCRU5SICYgKFJDQ19BSEJFTlJfRE1BMkVOKSkgICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0VfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgICgoUkNDLT5BSEJFTlIgJiAoUkNDX0FIQkVOUl9HUElPRUVOKSkgIT0gUkVTRVQpCisKKyNkZWZpbmUgX19IQUxfUkNDX0RNQTJfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgICAoKFJDQy0+QUhCRU5SICYgKFJDQ19BSEJFTlJfRE1BMkVOKSkgID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0VfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgICgoUkNDLT5BSEJFTlIgJiAoUkNDX0FIQkVOUl9HUElPRUVOKSkgPT0gUkVTRVQpCisjZW5kaWYgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisjZGVmaW5lIF9fSEFMX1JDQ19GTUNfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgICAgKChSQ0MtPkFIQkVOUiAmIChSQ0NfQUhCRU5SX0ZNQ0VOKSkgICAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9HX0lTX0NMS19FTkFCTEVEKCkgICAgICAgICAoKFJDQy0+QUhCRU5SICYgKFJDQ19BSEJFTlJfR1BJT0dFTikpICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0hfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgICgoUkNDLT5BSEJFTlIgJiAoUkNDX0FIQkVOUl9HUElPSEVOKSkgIT0gUkVTRVQpCisKKyNkZWZpbmUgX19IQUxfUkNDX0ZNQ19JU19DTEtfRElTQUJMRUQoKSAgICAgICAgICAgKChSQ0MtPkFIQkVOUiAmIChSQ0NfQUhCRU5SX0ZNQ0VOKSkgICA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9HX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAgKChSQ0MtPkFIQkVOUiAmIChSQ0NfQUhCRU5SX0dQSU9HRU4pKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9IX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAgKChSQ0MtPkFIQkVOUiAmIChSQ0NfQUhCRU5SX0dQSU9IRU4pKSA9PSBSRVNFVCkKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCAqLworLyoqCisgICogQH0KKyAgKi8KKyAgICAgIAorLyoqIEBkZWZncm91cCBSQ0NFeF9BUEIxX0Nsb2NrX0VuYWJsZV9EaXNhYmxlX1N0YXR1cyBSQ0MgRXh0ZW5kZWQgQVBCMSBQZXJpcGhlcmFsIENsb2NrIEVuYWJsZSBEaXNhYmxlICBTdGF0dXMKKyAgKiBAYnJpZWYgIEdldCB0aGUgZW5hYmxlIG9yIGRpc2FibGUgc3RhdHVzIG9mIHRoZSBBUEIxIHBlcmlwaGVyYWwgY2xvY2suCisgICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlIGFjY2VzcykKKyAgKiAgICAgICAgIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrIGJlZm9yZQorICAqICAgICAgICAgdXNpbmcgaXQuCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMl9JU19DTEtfRU5BQkxFRCgpICAgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX1NQSTJFTikpICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJM19JU19DTEtfRU5BQkxFRCgpICAgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX1NQSTNFTikpICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMl9JU19DTEtfRU5BQkxFRCgpICAgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX0kyQzJFTikpICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDM19JU19DTEtfRU5BQkxFRCgpICAgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX0kyQzNFTikpICE9IFJFU0VUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkyX0lTX0NMS19ESVNBQkxFRCgpICAgKChSQ0MtPkFQQjFFTlIgJiAoUkNDX0FQQjFFTlJfU1BJMkVOKSkgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkzX0lTX0NMS19ESVNBQkxFRCgpICAgKChSQ0MtPkFQQjFFTlIgJiAoUkNDX0FQQjFFTlJfU1BJM0VOKSkgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMyX0lTX0NMS19ESVNBQkxFRCgpICAgKChSQ0MtPkFQQjFFTlIgJiAoUkNDX0FQQjFFTlJfSTJDMkVOKSkgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMzX0lTX0NMS19ESVNBQkxFRCgpICAgKChSQ0MtPkFQQjFFTlIgJiAoUkNDX0FQQjFFTlJfSTJDM0VOKSkgPT0gUkVTRVQpCisjZW5kaWYgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpXAorICB8fCBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorI2RlZmluZSBfX0hBTF9SQ0NfVElNM19JU19DTEtfRU5BQkxFRCgpICAgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX1RJTTNFTikpICAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTRfSVNfQ0xLX0VOQUJMRUQoKSAgICAoKFJDQy0+QVBCMUVOUiAmIChSQ0NfQVBCMUVOUl9USU00RU4pKSAgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkyX0lTX0NMS19FTkFCTEVEKCkgICAgKChSQ0MtPkFQQjFFTlIgJiAoUkNDX0FQQjFFTlJfU1BJMkVOKSkgICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJM19JU19DTEtfRU5BQkxFRCgpICAgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX1NQSTNFTikpICAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1VBUlQ0X0lTX0NMS19FTkFCTEVEKCkgICAoKFJDQy0+QVBCMUVOUiAmIChSQ0NfQVBCMUVOUl9VQVJUNEVOKSkgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19VQVJUNV9JU19DTEtfRU5BQkxFRCgpICAgKChSQ0MtPkFQQjFFTlIgJiAoUkNDX0FQQjFFTlJfVUFSVDVFTikpICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMl9JU19DTEtfRU5BQkxFRCgpICAgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX0kyQzJFTikpICAhPSBSRVNFVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNM19JU19DTEtfRElTQUJMRUQoKSAgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX1RJTTNFTikpICA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTRfSVNfQ0xLX0RJU0FCTEVEKCkgICAoKFJDQy0+QVBCMUVOUiAmIChSQ0NfQVBCMUVOUl9USU00RU4pKSAgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkyX0lTX0NMS19ESVNBQkxFRCgpICAgKChSQ0MtPkFQQjFFTlIgJiAoUkNDX0FQQjFFTlJfU1BJMkVOKSkgID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJM19JU19DTEtfRElTQUJMRUQoKSAgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX1NQSTNFTikpICA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1VBUlQ0X0lTX0NMS19ESVNBQkxFRCgpICAoKFJDQy0+QVBCMUVOUiAmIChSQ0NfQVBCMUVOUl9VQVJUNEVOKSkgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19VQVJUNV9JU19DTEtfRElTQUJMRUQoKSAgKChSQ0MtPkFQQjFFTlIgJiAoUkNDX0FQQjFFTlJfVUFSVDVFTikpID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMl9JU19DTEtfRElTQUJMRUQoKSAgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX0kyQzJFTikpICA9PSBSRVNFVCkKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4ICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KQorI2RlZmluZSBfX0hBTF9SQ0NfVElNM19JU19DTEtfRU5BQkxFRCgpICAgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX1RJTTNFTikpICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfREFDMl9JU19DTEtfRU5BQkxFRCgpICAgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX0RBQzJFTikpICE9IFJFU0VUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU0zX0lTX0NMS19ESVNBQkxFRCgpICAgKChSQ0MtPkFQQjFFTlIgJiAoUkNDX0FQQjFFTlJfVElNM0VOKSkgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19EQUMyX0lTX0NMS19ESVNBQkxFRCgpICAgKChSQ0MtPkFQQjFFTlIgJiAoUkNDX0FQQjFFTlJfREFDMkVOKSkgPT0gUkVTRVQpCisjZW5kaWYgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0zX0lTX0NMS19FTkFCTEVEKCkgICAgKChSQ0MtPkFQQjFFTlIgJiAoUkNDX0FQQjFFTlJfVElNM0VOKSkgICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNNF9JU19DTEtfRU5BQkxFRCgpICAgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX1RJTTRFTikpICAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTVfSVNfQ0xLX0VOQUJMRUQoKSAgICAoKFJDQy0+QVBCMUVOUiAmIChSQ0NfQVBCMUVOUl9USU01RU4pKSAgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xMl9JU19DTEtfRU5BQkxFRCgpICAgKChSQ0MtPkFQQjFFTlIgJiAoUkNDX0FQQjFFTlJfVElNMTJFTikpICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTNfSVNfQ0xLX0VOQUJMRUQoKSAgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX1RJTTEzRU4pKSAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE0X0lTX0NMS19FTkFCTEVEKCkgICAoKFJDQy0+QVBCMUVOUiAmIChSQ0NfQVBCMUVOUl9USU0xNEVOKSkgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xOF9JU19DTEtfRU5BQkxFRCgpICAgKChSQ0MtPkFQQjFFTlIgJiAoUkNDX0FQQjFFTlJfVElNMThFTikpICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMl9JU19DTEtfRU5BQkxFRCgpICAgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX1NQSTJFTikpICAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTNfSVNfQ0xLX0VOQUJMRUQoKSAgICAoKFJDQy0+QVBCMUVOUiAmIChSQ0NfQVBCMUVOUl9TUEkzRU4pKSAgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMyX0lTX0NMS19FTkFCTEVEKCkgICAgKChSQ0MtPkFQQjFFTlIgJiAoUkNDX0FQQjFFTlJfSTJDMkVOKSkgICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfREFDMl9JU19DTEtfRU5BQkxFRCgpICAgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX0RBQzJFTikpICAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0NFQ19JU19DTEtfRU5BQkxFRCgpICAgICAoKFJDQy0+QVBCMUVOUiAmIChSQ0NfQVBCMUVOUl9DRUNFTikpICAgIT0gUkVTRVQpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTNfSVNfQ0xLX0RJU0FCTEVEKCkgICAoKFJDQy0+QVBCMUVOUiAmIChSQ0NfQVBCMUVOUl9USU0zRU4pKSAgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19USU00X0lTX0NMS19ESVNBQkxFRCgpICAgKChSQ0MtPkFQQjFFTlIgJiAoUkNDX0FQQjFFTlJfVElNNEVOKSkgID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNNV9JU19DTEtfRElTQUJMRUQoKSAgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX1RJTTVFTikpICA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTEyX0lTX0NMS19ESVNBQkxFRCgpICAoKFJDQy0+QVBCMUVOUiAmIChSQ0NfQVBCMUVOUl9USU0xMkVOKSkgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xM19JU19DTEtfRElTQUJMRUQoKSAgKChSQ0MtPkFQQjFFTlIgJiAoUkNDX0FQQjFFTlJfVElNMTNFTikpID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTRfSVNfQ0xLX0RJU0FCTEVEKCkgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX1RJTTE0RU4pKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE4X0lTX0NMS19ESVNBQkxFRCgpICAoKFJDQy0+QVBCMUVOUiAmIChSQ0NfQVBCMUVOUl9USU0xOEVOKSkgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkyX0lTX0NMS19ESVNBQkxFRCgpICAgKChSQ0MtPkFQQjFFTlIgJiAoUkNDX0FQQjFFTlJfU1BJMkVOKSkgID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJM19JU19DTEtfRElTQUJMRUQoKSAgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX1NQSTNFTikpICA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzJfSVNfQ0xLX0RJU0FCTEVEKCkgICAoKFJDQy0+QVBCMUVOUiAmIChSQ0NfQVBCMUVOUl9JMkMyRU4pKSAgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19EQUMyX0lTX0NMS19ESVNBQkxFRCgpICAgKChSQ0MtPkFQQjFFTlIgJiAoUkNDX0FQQjFFTlJfREFDMkVOKSkgID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQ0VDX0lTX0NMS19ESVNBQkxFRCgpICAgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX0NFQ0VOKSkgICA9PSBSRVNFVCkKKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpICAgICAgICAgICAgICAgICAgICAgICAgXAorICB8fCBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KVwKKyAgfHwgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkgICAgIAorI2RlZmluZSBfX0hBTF9SQ0NfVElNN19JU19DTEtfRU5BQkxFRCgpICAgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX1RJTTdFTikpICE9IFJFU0VUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU03X0lTX0NMS19ESVNBQkxFRCgpICAgKChSQ0MtPkFQQjFFTlIgJiAoUkNDX0FQQjFFTlJfVElNN0VOKSkgPT0gUkVTRVQpCisjZW5kaWYgLyogU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAgICAgICAgICAgICAgICB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggICAgICAgICAgICAgICAgICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpXAorICB8fCBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKVwKKyAgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQoU1RNMzJGMzczeEMpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfSVNfQ0xLX0VOQUJMRUQoKSAgICAgKChSQ0MtPkFQQjFFTlIgJiAoUkNDX0FQQjFFTlJfVVNCRU4pKSAhPSBSRVNFVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfVVNCX0lTX0NMS19ESVNBQkxFRCgpICAgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX1VTQkVOKSkgPT0gUkVTRVQpCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMng4ICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgLyogU1RNMzJGMzczeEMgICAgICAgICAgICAgICAgICAgKi8KKworI2lmICFkZWZpbmVkKFNUTTMyRjMwMXg4KQorI2RlZmluZSBfX0hBTF9SQ0NfQ0FOMV9JU19DTEtfRU5BQkxFRCgpICAgICAoKFJDQy0+QVBCMUVOUiAmIChSQ0NfQVBCMUVOUl9DQU5FTikpICE9IFJFU0VUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DQU4xX0lTX0NMS19ESVNBQkxFRCgpICAgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX0NBTkVOKSkgPT0gUkVTRVQpCisjZW5kaWYgLyogU1RNMzJGMzAxeDgqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzNfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgICAoKFJDQy0+QVBCMUVOUiAmIChSQ0NfQVBCMUVOUl9JMkMzRU4pKSAhPSBSRVNFVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfSTJDM19JU19DTEtfRElTQUJMRUQoKSAgICAgICAgICgoUkNDLT5BUEIxRU5SICYgKFJDQ19BUEIxRU5SX0kyQzNFTikpID09IFJFU0VUKQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4ICovICAgICAgCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0FQQjJfQ2xvY2tfRW5hYmxlX0Rpc2FibGVfU3RhdHVzIFJDQyBFeHRlbmRlZCBBUEIyIFBlcmlwaGVyYWwgQ2xvY2sgRW5hYmxlIERpc2FibGUgIFN0YXR1cworICAqIEBicmllZiAgR2V0IHRoZSBlbmFibGUgb3IgZGlzYWJsZSBzdGF0dXMgb2YgdGhlIEFQQjIgcGVyaXBoZXJhbCBjbG9jay4KKyAgKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgcGVyaXBoZXJhbCBjbG9jayAodXNlZCBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGUgYWNjZXNzKQorICAqICAgICAgICAgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sgYmVmb3JlCisgICogICAgICAgICB1c2luZyBpdC4KKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpXAorICB8fCBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMV9JU19DTEtfRU5BQkxFRCgpICAgICgoUkNDLT5BUEIyRU5SICYgKFJDQ19BUEIyRU5SX1NQSTFFTikpICE9IFJFU0VUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkxX0lTX0NMS19ESVNBQkxFRCgpICAgKChSQ0MtPkFQQjJFTlIgJiAoUkNDX0FQQjJFTlJfU1BJMUVOKSkgPT0gUkVTRVQpCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eClcCisgIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpCisjZGVmaW5lIF9fSEFMX1JDQ19USU04X0lTX0NMS19FTkFCTEVEKCkgICAgKChSQ0MtPkFQQjJFTlIgJiAoUkNDX0FQQjJFTlJfVElNOEVOKSkgIT0gUkVTRVQpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTThfSVNfQ0xLX0RJU0FCTEVEKCkgICAoKFJDQy0+QVBCMkVOUiAmIChSQ0NfQVBCMkVOUl9USU04RU4pKSA9PSBSRVNFVCkKKyNlbmRpZiAvKiBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4ICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMV9JU19DTEtfRU5BQkxFRCgpICAgICgoUkNDLT5BUEIyRU5SICYgKFJDQ19BUEIyRU5SX1NQSTFFTikpICE9IFJFU0VUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkxX0lTX0NMS19ESVNBQkxFRCgpICAgKChSQ0MtPkFQQjJFTlIgJiAoUkNDX0FQQjJFTlJfU1BJMUVOKSkgPT0gUkVTRVQpCisjZW5kaWYgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzM0eDgpCisjZGVmaW5lIF9fSEFMX1JDQ19IUlRJTTFfSVNfQ0xLX0VOQUJMRUQoKSAgKChSQ0MtPkFQQjJFTlIgJiAoUkNDX0FQQjJFTlJfSFJUSU0xRU4pKSAhPSBSRVNFVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfSFJUSU0xX0lTX0NMS19ESVNBQkxFRCgpICgoUkNDLT5BUEIyRU5SICYgKFJDQ19BUEIyRU5SX0hSVElNMUVOKSkgPT0gUkVTRVQpCisjZW5kaWYgLyogU1RNMzJGMzM0eDggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisjZGVmaW5lIF9fSEFMX1JDQ19BREMxX0lTX0NMS19FTkFCTEVEKCkgICAgICAoKFJDQy0+QVBCMkVOUiAmIChSQ0NfQVBCMkVOUl9BREMxRU4pKSAgICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMV9JU19DTEtfRU5BQkxFRCgpICAgICAgKChSQ0MtPkFQQjJFTlIgJiAoUkNDX0FQQjJFTlJfU1BJMUVOKSkgICAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE5X0lTX0NMS19FTkFCTEVEKCkgICAgICgoUkNDLT5BUEIyRU5SICYgKFJDQ19BUEIyRU5SX1RJTTE5RU4pKSAgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19TREFEQzFfSVNfQ0xLX0VOQUJMRUQoKSAgICAoKFJDQy0+QVBCMkVOUiAmIChSQ0NfQVBCMkVOUl9TREFEQzFFTikpICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfU0RBREMyX0lTX0NMS19FTkFCTEVEKCkgICAgKChSQ0MtPkFQQjJFTlIgJiAoUkNDX0FQQjJFTlJfU0RBREMyRU4pKSAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1NEQURDM19JU19DTEtfRU5BQkxFRCgpICAgICgoUkNDLT5BUEIyRU5SICYgKFJDQ19BUEIyRU5SX1NEQURDM0VOKSkgIT0gUkVTRVQpCisKKyNkZWZpbmUgX19IQUxfUkNDX0FEQzFfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICgoUkNDLT5BUEIyRU5SICYgKFJDQ19BUEIyRU5SX0FEQzFFTikpICAgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkxX0lTX0NMS19ESVNBQkxFRCgpICAgICAoKFJDQy0+QVBCMkVOUiAmIChSQ0NfQVBCMkVOUl9TUEkxRU4pKSAgID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTlfSVNfQ0xLX0RJU0FCTEVEKCkgICAgKChSQ0MtPkFQQjJFTlIgJiAoUkNDX0FQQjJFTlJfVElNMTlFTikpICA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1NEQURDMV9JU19DTEtfRElTQUJMRUQoKSAgICgoUkNDLT5BUEIyRU5SICYgKFJDQ19BUEIyRU5SX1NEQURDMUVOKSkgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19TREFEQzJfSVNfQ0xLX0RJU0FCTEVEKCkgICAoKFJDQy0+QVBCMkVOUiAmIChSQ0NfQVBCMkVOUl9TREFEQzJFTikpID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfU0RBREMzX0lTX0NMS19ESVNBQkxFRCgpICAgKChSQ0MtPkFQQjJFTlIgJiAoUkNDX0FQQjJFTlJfU0RBREMzRU4pKSA9PSBSRVNFVCkKKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eClcCisgIHx8IGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpXAorICB8fCBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KVwKKyAgfHwgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTFfSVNfQ0xLX0VOQUJMRUQoKSAgICAoKFJDQy0+QVBCMkVOUiAmIChSQ0NfQVBCMkVOUl9USU0xRU4pKSAhPSBSRVNFVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNMV9JU19DTEtfRElTQUJMRUQoKSAgICgoUkNDLT5BUEIyRU5SICYgKFJDQ19BUEIyRU5SX1RJTTFFTikpID09IFJFU0VUKQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJNF9JU19DTEtfRU5BQkxFRCgpICAgICAgICAgICgoUkNDLT5BUEIyRU5SICYgKFJDQ19BUEIyRU5SX1NQSTRFTikpICE9IFJFU0VUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19TUEk0X0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAgKChSQ0MtPkFQQjJFTlIgJiAoUkNDX0FQQjJFTlJfU1BJNEVOKSkgPT0gUkVTRVQpCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggKi8KKyAgICAgIAorI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yMF9JU19DTEtfRU5BQkxFRCgpICAgICAgICAgKChSQ0MtPkFQQjJFTlIgJiAoUkNDX0FQQjJFTlJfVElNMjBFTikpICE9IFJFU0VUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yMF9JU19DTEtfRElTQUJMRUQoKSAgICAgICAgKChSQ0MtPkFQQjJFTlIgJiAoUkNDX0FQQjJFTlJfVElNMjBFTikpID09IFJFU0VUKQorI2VuZGlmIC8qIFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4ICovCisvKioKKyAgKiBAfQorICAqLworICAgICAgCisvKiogQGRlZmdyb3VwIFJDQ0V4X0FIQl9Gb3JjZV9SZWxlYXNlX1Jlc2V0IFJDQyBFeHRlbmRlZCBBSEIgRm9yY2UgUmVsZWFzZSBSZXNldAorICAqIEBicmllZiAgRm9yY2Ugb3IgcmVsZWFzZSBBSEIgcGVyaXBoZXJhbCByZXNldC4KKyAgKiBAeyAgIAorICAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisjZGVmaW5lIF9fSEFMX1JDQ19BREMxX0ZPUkNFX1JFU0VUKCkgICAgIChSQ0MtPkFIQlJTVFIgfD0gKFJDQ19BSEJSU1RSX0FEQzFSU1QpKQorCisjZGVmaW5lIF9fSEFMX1JDQ19BREMxX1JFTEVBU0VfUkVTRVQoKSAgKFJDQy0+QUhCUlNUUiAmPSB+KFJDQ19BSEJSU1RSX0FEQzFSU1QpKQorI2VuZGlmIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KVwKKyAgfHwgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9FX0ZPUkNFX1JFU0VUKCkgICAgKFJDQy0+QUhCUlNUUiB8PSAoUkNDX0FIQlJTVFJfR1BJT0VSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfQURDMTJfRk9SQ0VfUkVTRVQoKSAgICAoUkNDLT5BSEJSU1RSIHw9IChSQ0NfQUhCUlNUUl9BREMxMlJTVCkpCisvKiBBbGlhc2VzIGZvciBTVE0zMiBGMyBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIF9fSEFMX1JDQ19BREMxX0ZPUkNFX1JFU0VUKCkgICAgIF9fSEFMX1JDQ19BREMxMl9GT1JDRV9SRVNFVCgpCisjZGVmaW5lIF9fSEFMX1JDQ19BREMyX0ZPUkNFX1JFU0VUKCkgICAgIF9fSEFMX1JDQ19BREMxMl9GT1JDRV9SRVNFVCgpCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9FX1JFTEVBU0VfUkVTRVQoKSAgKFJDQy0+QUhCUlNUUiAmPSB+KFJDQ19BSEJSU1RSX0dQSU9FUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0FEQzEyX1JFTEVBU0VfUkVTRVQoKSAgKFJDQy0+QUhCUlNUUiAmPSB+KFJDQ19BSEJSU1RSX0FEQzEyUlNUKSkKKy8qIEFsaWFzZXMgZm9yIFNUTTMyIEYzIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0FEQzFfUkVMRUFTRV9SRVNFVCgpICAgIF9fSEFMX1JDQ19BREMxMl9SRUxFQVNFX1JFU0VUKCkKKyNkZWZpbmUgX19IQUxfUkNDX0FEQzJfUkVMRUFTRV9SRVNFVCgpICAgIF9fSEFMX1JDQ19BREMxMl9SRUxFQVNFX1JFU0VUKCkKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4ICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KVwKKyAgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkKKyNkZWZpbmUgX19IQUxfUkNDX0FEQzM0X0ZPUkNFX1JFU0VUKCkgICAgKFJDQy0+QUhCUlNUUiB8PSAoUkNDX0FIQlJTVFJfQURDMzRSU1QpKQorCisjZGVmaW5lIF9fSEFMX1JDQ19BREMzNF9SRUxFQVNFX1JFU0VUKCkgIChSQ0MtPkFIQlJTVFIgJj0gfihSQ0NfQUhCUlNUUl9BREMzNFJTVCkpCisjZW5kaWYgLyogU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkKKyNkZWZpbmUgX19IQUxfUkNDX0FEQzEyX0ZPUkNFX1JFU0VUKCkgICAgKFJDQy0+QUhCUlNUUiB8PSAoUkNDX0FIQlJTVFJfQURDMTJSU1QpKQorLyogQWxpYXNlcyBmb3IgU1RNMzIgRjMgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBfX0hBTF9SQ0NfQURDMV9GT1JDRV9SRVNFVCgpICAgICBfX0hBTF9SQ0NfQURDMTJfRk9SQ0VfUkVTRVQoKQorI2RlZmluZSBfX0hBTF9SQ0NfQURDMl9GT1JDRV9SRVNFVCgpICAgICBfX0hBTF9SQ0NfQURDMTJfRk9SQ0VfUkVTRVQoKQorCisjZGVmaW5lIF9fSEFMX1JDQ19BREMxMl9SRUxFQVNFX1JFU0VUKCkgIChSQ0MtPkFIQlJTVFIgJj0gfihSQ0NfQUhCUlNUUl9BREMxMlJTVCkpCisvKiBBbGlhc2VzIGZvciBTVE0zMiBGMyBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIF9fSEFMX1JDQ19BREMxX1JFTEVBU0VfUkVTRVQoKSAgICBfX0hBTF9SQ0NfQURDMTJfUkVMRUFTRV9SRVNFVCgpCisjZGVmaW5lIF9fSEFMX1JDQ19BREMyX1JFTEVBU0VfUkVTRVQoKSAgICBfX0hBTF9SQ0NfQURDMTJfUkVMRUFTRV9SRVNFVCgpCisjZW5kaWYgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRV9GT1JDRV9SRVNFVCgpICAgKFJDQy0+QUhCUlNUUiB8PSAoUkNDX0FIQlJTVFJfR1BJT0VSU1QpKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRV9SRUxFQVNFX1JFU0VUKCkgKFJDQy0+QUhCUlNUUiAmPSB+KFJDQ19BSEJSU1RSX0dQSU9FUlNUKSkKKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkKKyNkZWZpbmUgX19IQUxfUkNDX0ZNQ19GT1JDRV9SRVNFVCgpICAgICAgICAgICAgKFJDQy0+QUhCUlNUUiB8PSAoUkNDX0FIQlJTVFJfRk1DUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9HX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgKFJDQy0+QUhCUlNUUiB8PSAoUkNDX0FIQlJTVFJfR1BJT0dSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0hfRk9SQ0VfUkVTRVQoKSAgICAgICAgICAoUkNDLT5BSEJSU1RSIHw9IChSQ0NfQUhCUlNUUl9HUElPSFJTVCkpCisKKyNkZWZpbmUgX19IQUxfUkNDX0ZNQ19SRUxFQVNFX1JFU0VUKCkgICAgICAgICAgICAoUkNDLT5BSEJSU1RSICY9IH4oUkNDX0FIQlJTVFJfRk1DUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9HX1JFTEVBU0VfUkVTRVQoKSAgICAgICAgICAoUkNDLT5BSEJSU1RSICY9IH4oUkNDX0FIQlJTVFJfR1BJT0dSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0hfUkVMRUFTRV9SRVNFVCgpICAgICAgICAgIChSQ0MtPkFIQlJTVFIgJj0gfihSQ0NfQUhCUlNUUl9HUElPSFJTVCkpCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfQVBCMV9Gb3JjZV9SZWxlYXNlX1Jlc2V0IFJDQyBFeHRlbmRlZCBBUEIxIEZvcmNlIFJlbGVhc2UgUmVzZXQKKyAgKiBAYnJpZWYgIEZvcmNlIG9yIHJlbGVhc2UgQVBCMSBwZXJpcGhlcmFsIHJlc2V0LgorICAqIEB7ICAgCisgICovCisjaWYgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTJfRk9SQ0VfUkVTRVQoKSAgICAgKFJDQy0+QVBCMVJTVFIgfD0gKFJDQ19BUEIxUlNUUl9TUEkyUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTNfRk9SQ0VfUkVTRVQoKSAgICAgKFJDQy0+QVBCMVJTVFIgfD0gKFJDQ19BUEIxUlNUUl9TUEkzUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzJfRk9SQ0VfUkVTRVQoKSAgICAgKFJDQy0+QVBCMVJTVFIgfD0gKFJDQ19BUEIxUlNUUl9JMkMyUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzNfRk9SQ0VfUkVTRVQoKSAgICAgKFJDQy0+QVBCMVJTVFIgfD0gKFJDQ19BUEIxUlNUUl9JMkMzUlNUKSkKKworI2RlZmluZSBfX0hBTF9SQ0NfU1BJMl9SRUxFQVNFX1JFU0VUKCkgICAoUkNDLT5BUEIxUlNUUiAmPSB+KFJDQ19BUEIxUlNUUl9TUEkyUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTNfUkVMRUFTRV9SRVNFVCgpICAgKFJDQy0+QVBCMVJTVFIgJj0gfihSQ0NfQVBCMVJTVFJfU1BJM1JTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMyX1JFTEVBU0VfUkVTRVQoKSAgIChSQ0MtPkFQQjFSU1RSICY9IH4oUkNDX0FQQjFSU1RSX0kyQzJSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDM19SRUxFQVNFX1JFU0VUKCkgICAoUkNDLT5BUEIxUlNUUiAmPSB+KFJDQ19BUEIxUlNUUl9JMkMzUlNUKSkKKyNlbmRpZiAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eClcCisgIHx8IGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0zX0ZPUkNFX1JFU0VUKCkgICAgIChSQ0MtPkFQQjFSU1RSIHw9IChSQ0NfQVBCMVJTVFJfVElNM1JTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19USU00X0ZPUkNFX1JFU0VUKCkgICAgIChSQ0MtPkFQQjFSU1RSIHw9IChSQ0NfQVBCMVJTVFJfVElNNFJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkyX0ZPUkNFX1JFU0VUKCkgICAgIChSQ0MtPkFQQjFSU1RSIHw9IChSQ0NfQVBCMVJTVFJfU1BJMlJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkzX0ZPUkNFX1JFU0VUKCkgICAgIChSQ0MtPkFQQjFSU1RSIHw9IChSQ0NfQVBCMVJTVFJfU1BJM1JTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19VQVJUNF9GT1JDRV9SRVNFVCgpICAgIChSQ0MtPkFQQjFSU1RSIHw9IChSQ0NfQVBCMVJTVFJfVUFSVDRSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfVUFSVDVfRk9SQ0VfUkVTRVQoKSAgICAoUkNDLT5BUEIxUlNUUiB8PSAoUkNDX0FQQjFSU1RSX1VBUlQ1UlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzJfRk9SQ0VfUkVTRVQoKSAgICAgKFJDQy0+QVBCMVJTVFIgfD0gKFJDQ19BUEIxUlNUUl9JMkMyUlNUKSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNM19SRUxFQVNFX1JFU0VUKCkgICAoUkNDLT5BUEIxUlNUUiAmPSB+KFJDQ19BUEIxUlNUUl9USU0zUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTRfUkVMRUFTRV9SRVNFVCgpICAgKFJDQy0+QVBCMVJTVFIgJj0gfihSQ0NfQVBCMVJTVFJfVElNNFJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkyX1JFTEVBU0VfUkVTRVQoKSAgIChSQ0MtPkFQQjFSU1RSICY9IH4oUkNDX0FQQjFSU1RSX1NQSTJSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJM19SRUxFQVNFX1JFU0VUKCkgICAoUkNDLT5BUEIxUlNUUiAmPSB+KFJDQ19BUEIxUlNUUl9TUEkzUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1VBUlQ0X1JFTEVBU0VfUkVTRVQoKSAgKFJDQy0+QVBCMVJTVFIgJj0gfihSQ0NfQVBCMVJTVFJfVUFSVDRSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfVUFSVDVfUkVMRUFTRV9SRVNFVCgpICAoUkNDLT5BUEIxUlNUUiAmPSB+KFJDQ19BUEIxUlNUUl9VQVJUNVJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMyX1JFTEVBU0VfUkVTRVQoKSAgIChSQ0MtPkFQQjFSU1RSICY9IH4oUkNDX0FQQjFSU1RSX0kyQzJSU1QpKQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0zX0ZPUkNFX1JFU0VUKCkgICAgIChSQ0MtPkFQQjFSU1RSIHw9IChSQ0NfQVBCMVJTVFJfVElNM1JTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19EQUMyX0ZPUkNFX1JFU0VUKCkgICAgIChSQ0MtPkFQQjFSU1RSIHw9IChSQ0NfQVBCMVJTVFJfREFDMlJTVCkpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTNfUkVMRUFTRV9SRVNFVCgpICAgKFJDQy0+QVBCMVJTVFIgJj0gfihSQ0NfQVBCMVJTVFJfVElNM1JTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19EQUMyX1JFTEVBU0VfUkVTRVQoKSAgIChSQ0MtPkFQQjFSU1RSICY9IH4oUkNDX0FQQjFSU1RSX0RBQzJSU1QpKQorI2VuZGlmIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorI2RlZmluZSBfX0hBTF9SQ0NfVElNM19GT1JDRV9SRVNFVCgpICAgICAoUkNDLT5BUEIxUlNUUiB8PSAoUkNDX0FQQjFSU1RSX1RJTTNSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNNF9GT1JDRV9SRVNFVCgpICAgICAoUkNDLT5BUEIxUlNUUiB8PSAoUkNDX0FQQjFSU1RSX1RJTTRSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNNV9GT1JDRV9SRVNFVCgpICAgICAoUkNDLT5BUEIxUlNUUiB8PSAoUkNDX0FQQjFSU1RSX1RJTTVSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTJfRk9SQ0VfUkVTRVQoKSAgICAoUkNDLT5BUEIxUlNUUiB8PSAoUkNDX0FQQjFSU1RSX1RJTTEyUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTEzX0ZPUkNFX1JFU0VUKCkgICAgKFJDQy0+QVBCMVJTVFIgfD0gKFJDQ19BUEIxUlNUUl9USU0xM1JTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xNF9GT1JDRV9SRVNFVCgpICAgIChSQ0MtPkFQQjFSU1RSIHw9IChSQ0NfQVBCMVJTVFJfVElNMTRSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMThfRk9SQ0VfUkVTRVQoKSAgICAoUkNDLT5BUEIxUlNUUiB8PSAoUkNDX0FQQjFSU1RSX1RJTTE4UlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTJfRk9SQ0VfUkVTRVQoKSAgICAgKFJDQy0+QVBCMVJTVFIgfD0gKFJDQ19BUEIxUlNUUl9TUEkyUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTNfRk9SQ0VfUkVTRVQoKSAgICAgKFJDQy0+QVBCMVJTVFIgfD0gKFJDQ19BUEIxUlNUUl9TUEkzUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzJfRk9SQ0VfUkVTRVQoKSAgICAgKFJDQy0+QVBCMVJTVFIgfD0gKFJDQ19BUEIxUlNUUl9JMkMyUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0RBQzJfRk9SQ0VfUkVTRVQoKSAgICAgKFJDQy0+QVBCMVJTVFIgfD0gKFJDQ19BUEIxUlNUUl9EQUMyUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0NFQ19GT1JDRV9SRVNFVCgpICAgICAgKFJDQy0+QVBCMVJTVFIgfD0gKFJDQ19BUEIxUlNUUl9DRUNSU1QpKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU0zX1JFTEVBU0VfUkVTRVQoKSAgIChSQ0MtPkFQQjFSU1RSICY9IH4oUkNDX0FQQjFSU1RSX1RJTTNSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNNF9SRUxFQVNFX1JFU0VUKCkgICAoUkNDLT5BUEIxUlNUUiAmPSB+KFJDQ19BUEIxUlNUUl9USU00UlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTVfUkVMRUFTRV9SRVNFVCgpICAgKFJDQy0+QVBCMVJTVFIgJj0gfihSQ0NfQVBCMVJTVFJfVElNNVJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xMl9SRUxFQVNFX1JFU0VUKCkgIChSQ0MtPkFQQjFSU1RSICY9IH4oUkNDX0FQQjFSU1RSX1RJTTEyUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTEzX1JFTEVBU0VfUkVTRVQoKSAgKFJDQy0+QVBCMVJTVFIgJj0gfihSQ0NfQVBCMVJTVFJfVElNMTNSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTRfUkVMRUFTRV9SRVNFVCgpICAoUkNDLT5BUEIxUlNUUiAmPSB+KFJDQ19BUEIxUlNUUl9USU0xNFJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xOF9SRUxFQVNFX1JFU0VUKCkgIChSQ0MtPkFQQjFSU1RSICY9IH4oUkNDX0FQQjFSU1RSX1RJTTE4UlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTJfUkVMRUFTRV9SRVNFVCgpICAgKFJDQy0+QVBCMVJTVFIgJj0gfihSQ0NfQVBCMVJTVFJfU1BJMlJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkzX1JFTEVBU0VfUkVTRVQoKSAgIChSQ0MtPkFQQjFSU1RSICY9IH4oUkNDX0FQQjFSU1RSX1NQSTNSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMl9SRUxFQVNFX1JFU0VUKCkgICAoUkNDLT5BUEIxUlNUUiAmPSB+KFJDQ19BUEIxUlNUUl9JMkMyUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0RBQzJfUkVMRUFTRV9SRVNFVCgpICAgKFJDQy0+QVBCMVJTVFIgJj0gfihSQ0NfQVBCMVJTVFJfREFDMlJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19DRUNfUkVMRUFTRV9SRVNFVCgpICAgIChSQ0MtPkFQQjFSU1RSICY9IH4oUkNDX0FQQjFSU1RSX0NFQ1JTVCkpCisjZW5kaWYgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpXAorICB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KVwKKyAgfHwgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eClcCisgIHx8IGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpICAgICAgCisjZGVmaW5lIF9fSEFMX1JDQ19USU03X0ZPUkNFX1JFU0VUKCkgICAgIChSQ0MtPkFQQjFSU1RSIHw9IChSQ0NfQVBCMVJTVFJfVElNN1JTVCkpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTdfUkVMRUFTRV9SRVNFVCgpICAgKFJDQy0+QVBCMVJTVFIgJj0gfihSQ0NfQVBCMVJTVFJfVElNN1JTVCkpCisjZW5kaWYgLyogU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAgICAgICAgICAgICAgICB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggICAgICAgICAgICAgICAgICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpXAorICB8fCBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKVwKKyAgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQoU1RNMzJGMzczeEMpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfRk9SQ0VfUkVTRVQoKSAgICAgIChSQ0MtPkFQQjFSU1RSIHw9IChSQ0NfQVBCMVJTVFJfVVNCUlNUKSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVVNCX1JFTEVBU0VfUkVTRVQoKSAgICAoUkNDLT5BUEIxUlNUUiAmPSB+KFJDQ19BUEIxUlNUUl9VU0JSU1QpKQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4OCAgICAgICAgICAgICAgICB8fCAqLworICAgICAgIC8qIFNUTTMyRjM3M3hDICAgICAgICAgICAgICAgICAgICovCisKKyNpZiAhZGVmaW5lZChTVE0zMkYzMDF4OCkKKyNkZWZpbmUgX19IQUxfUkNDX0NBTjFfRk9SQ0VfUkVTRVQoKSAgICAgIChSQ0MtPkFQQjFSU1RSIHw9IChSQ0NfQVBCMVJTVFJfQ0FOUlNUKSkKKworI2RlZmluZSBfX0hBTF9SQ0NfQ0FOMV9SRUxFQVNFX1JFU0VUKCkgICAgKFJDQy0+QVBCMVJTVFIgJj0gfihSQ0NfQVBCMVJTVFJfQ0FOUlNUKSkKKyNlbmRpZiAvKiBTVE0zMkYzMDF4OCovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDM19GT1JDRV9SRVNFVCgpICAgICAoUkNDLT5BUEIxUlNUUiB8PSAoUkNDX0FQQjFSU1RSX0kyQzNSU1QpKQorCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMzX1JFTEVBU0VfUkVTRVQoKSAgIChSQ0MtPkFQQjFSU1RSICY9IH4oUkNDX0FQQjFSU1RSX0kyQzNSU1QpKQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0FQQjJfRm9yY2VfUmVsZWFzZV9SZXNldCBSQ0MgRXh0ZW5kZWQgQVBCMiBGb3JjZSBSZWxlYXNlIFJlc2V0CisgICogQGJyaWVmICBGb3JjZSBvciByZWxlYXNlIEFQQjIgcGVyaXBoZXJhbCByZXNldC4KKyAgKiBAeyAgIAorICAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpXAorICB8fCBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMV9GT1JDRV9SRVNFVCgpICAgICAoUkNDLT5BUEIyUlNUUiB8PSAoUkNDX0FQQjJSU1RSX1NQSTFSU1QpKQorCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkxX1JFTEVBU0VfUkVTRVQoKSAgIChSQ0MtPkFQQjJSU1RSICY9IH4oUkNDX0FQQjJSU1RSX1NQSTFSU1QpKQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpXAorICB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorI2RlZmluZSBfX0hBTF9SQ0NfVElNOF9GT1JDRV9SRVNFVCgpICAgICAoUkNDLT5BUEIyUlNUUiB8PSAoUkNDX0FQQjJSU1RSX1RJTThSU1QpKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU04X1JFTEVBU0VfUkVTRVQoKSAgIChSQ0MtPkFQQjJSU1RSICY9IH4oUkNDX0FQQjJSU1RSX1RJTThSU1QpKQorI2VuZGlmIC8qIFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkxX0ZPUkNFX1JFU0VUKCkgICAgIChSQ0MtPkFQQjJSU1RSIHw9IChSQ0NfQVBCMlJTVFJfU1BJMVJTVCkpCisKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTFfUkVMRUFTRV9SRVNFVCgpICAgKFJDQy0+QVBCMlJTVFIgJj0gfihSQ0NfQVBCMlJTVFJfU1BJMVJTVCkpCisjZW5kaWYgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzM0eDgpCisjZGVmaW5lIF9fSEFMX1JDQ19IUlRJTTFfRk9SQ0VfUkVTRVQoKSAgIChSQ0MtPkFQQjJSU1RSIHw9IChSQ0NfQVBCMlJTVFJfSFJUSU0xUlNUKSkKKworI2RlZmluZSBfX0hBTF9SQ0NfSFJUSU0xX1JFTEVBU0VfUkVTRVQoKSAoUkNDLT5BUEIyUlNUUiAmPSB+KFJDQ19BUEIyUlNUUl9IUlRJTTFSU1QpKQorI2VuZGlmIC8qIFNUTTMyRjMzNHg4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorI2RlZmluZSBfX0hBTF9SQ0NfQURDMV9GT1JDRV9SRVNFVCgpICAgICAoUkNDLT5BUEIyUlNUUiB8PSAoUkNDX0FQQjJSU1RSX0FEQzFSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMV9GT1JDRV9SRVNFVCgpICAgICAoUkNDLT5BUEIyUlNUUiB8PSAoUkNDX0FQQjJSU1RSX1NQSTFSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTlfRk9SQ0VfUkVTRVQoKSAgICAoUkNDLT5BUEIyUlNUUiB8PSAoUkNDX0FQQjJSU1RSX1RJTTE5UlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1NEQURDMV9GT1JDRV9SRVNFVCgpICAgKFJDQy0+QVBCMlJTVFIgfD0gKFJDQ19BUEIyUlNUUl9TREFEQzFSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfU0RBREMyX0ZPUkNFX1JFU0VUKCkgICAoUkNDLT5BUEIyUlNUUiB8PSAoUkNDX0FQQjJSU1RSX1NEQURDMlJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19TREFEQzNfRk9SQ0VfUkVTRVQoKSAgIChSQ0MtPkFQQjJSU1RSIHw9IChSQ0NfQVBCMlJTVFJfU0RBREMzUlNUKSkKKworI2RlZmluZSBfX0hBTF9SQ0NfQURDMV9SRUxFQVNFX1JFU0VUKCkgICAoUkNDLT5BUEIyUlNUUiAmPSB+KFJDQ19BUEIyUlNUUl9BREMxUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTFfUkVMRUFTRV9SRVNFVCgpICAgKFJDQy0+QVBCMlJTVFIgJj0gfihSQ0NfQVBCMlJTVFJfU1BJMVJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xOV9SRUxFQVNFX1JFU0VUKCkgIChSQ0MtPkFQQjJSU1RSICY9IH4oUkNDX0FQQjJSU1RSX1RJTTE5UlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1NEQURDMV9SRUxFQVNFX1JFU0VUKCkgKFJDQy0+QVBCMlJTVFIgJj0gfihSQ0NfQVBCMlJTVFJfU0RBREMxUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1NEQURDMl9SRUxFQVNFX1JFU0VUKCkgKFJDQy0+QVBCMlJTVFIgJj0gfihSQ0NfQVBCMlJTVFJfU0RBREMyUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1NEQURDM19SRUxFQVNFX1JFU0VUKCkgKFJDQy0+QVBCMlJTVFIgJj0gfihSQ0NfQVBCMlJTVFJfU0RBREMzUlNUKSkKKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eClcCisgIHx8IGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpXAorICB8fCBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KVwKKyAgfHwgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTFfRk9SQ0VfUkVTRVQoKSAgICAgKFJDQy0+QVBCMlJTVFIgfD0gKFJDQ19BUEIyUlNUUl9USU0xUlNUKSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNMV9SRUxFQVNFX1JFU0VUKCkgICAoUkNDLT5BUEIyUlNUUiAmPSB+KFJDQ19BUEIyUlNUUl9USU0xUlNUKSkKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTRfRk9SQ0VfUkVTRVQoKSAgICAgIChSQ0MtPkFQQjJSU1RSIHw9IChSQ0NfQVBCMlJTVFJfU1BJNFJTVCkpCisKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTRfUkVMRUFTRV9SRVNFVCgpICAgIChSQ0MtPkFQQjJSU1RSICY9IH4oUkNDX0FQQjJSU1RSX1NQSTRSU1QpKQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMjBfRk9SQ0VfUkVTRVQoKSAgICAgKFJDQy0+QVBCMlJTVFIgfD0gKFJDQ19BUEIyUlNUUl9USU0yMFJTVCkpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTIwX1JFTEVBU0VfUkVTRVQoKSAgIChSQ0MtPkFQQjJSU1RSICY9IH4oUkNDX0FQQjJSU1RSX1RJTTIwUlNUKSkKKyNlbmRpZiAvKiBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfSTJDeF9DbG9ja19Db25maWcgUkNDIEV4dGVuZGVkIEkyQ3ggQ2xvY2sgQ29uZmlnCisgICogQHsgICAKKyAgKi8gCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgSTJDMiBjbG9jayAoSTJDMkNMSykuCisgICogQHBhcmFtICBfX0kyQzJDTEtTb3VyY2VfXyBzcGVjaWZpZXMgdGhlIEkyQzIgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDMkNMS1NPVVJDRV9IU0kgSFNJIHNlbGVjdGVkIGFzIEkyQzIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDMkNMS1NPVVJDRV9TWVNDTEsgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzIEkyQzIgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0kyQzJfQ09ORklHKF9fSTJDMkNMS1NvdXJjZV9fKSBcCisgICAgICAgICAgICAgICAgICBNT0RJRllfUkVHKFJDQy0+Q0ZHUjMsIFJDQ19DRkdSM19JMkMyU1csICh1aW50MzJfdCkoX19JMkMyQ0xLU291cmNlX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIEkyQzIgY2xvY2sgc291cmNlLgorICAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkMyQ0xLU09VUkNFX0hTSSBIU0kgc2VsZWN0ZWQgYXMgSTJDMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkMyQ0xLU09VUkNFX1NZU0NMSyBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgSTJDMiBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX0kyQzJfU09VUkNFKCkgKCh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DRkdSMywgUkNDX0NGR1IzX0kyQzJTVykpKQorCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIEkyQzMgY2xvY2sgKEkyQzNDTEspLgorICAqIEBwYXJhbSAgX19JMkMzQ0xLU291cmNlX18gc3BlY2lmaWVzIHRoZSBJMkMzIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzNDTEtTT1VSQ0VfSFNJIEhTSSBzZWxlY3RlZCBhcyBJMkMzIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzNDTEtTT1VSQ0VfU1lTQ0xLIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcyBJMkMzIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMzX0NPTkZJRyhfX0kyQzNDTEtTb3VyY2VfXykgXAorICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IzLCBSQ0NfQ0ZHUjNfSTJDM1NXLCAodWludDMyX3QpKF9fSTJDM0NMS1NvdXJjZV9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBJMkMzIGNsb2NrIHNvdXJjZS4KKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDM0NMS1NPVVJDRV9IU0kgSFNJIHNlbGVjdGVkIGFzIEkyQzMgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDM0NMS1NPVVJDRV9TWVNDTEsgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzIEkyQzMgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9JMkMzX1NPVVJDRSgpICgodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUjMsIFJDQ19DRkdSM19JMkMzU1cpKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9USU14X0Nsb2NrX0NvbmZpZyBSQ0MgRXh0ZW5kZWQgVElNeCBDbG9jayBDb25maWcKKyAgKiBAeyAgIAorICAqLyAKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgVElNMSBjbG9jayAoVElNMUNMSykuCisgICogQHBhcmFtICBfX1RJTTFDTEtTb3VyY2VfXyBzcGVjaWZpZXMgdGhlIFRJTTEgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVElNMUNMS19IQ0xLIEhDTEsgc2VsZWN0ZWQgYXMgVElNMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19USU0xQ0xLX1BMTENMSyBQTEwgQ2xvY2sgc2VsZWN0ZWQgYXMgVElNMSBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfVElNMV9DT05GSUcoX19USU0xQ0xLU291cmNlX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSMywgUkNDX0NGR1IzX1RJTTFTVywgKHVpbnQzMl90KShfX1RJTTFDTEtTb3VyY2VfXykpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgVElNMSBjbG9jayAoVElNMUNMSykuCisgICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1RJTTFDTEtfSENMSyBIQ0xLIHNlbGVjdGVkIGFzIFRJTTEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVElNMUNMS19QTExDTEsgUExMIENsb2NrIHNlbGVjdGVkIGFzIFRJTTEgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9USU0xX1NPVVJDRSgpICgodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUjMsIFJDQ19DRkdSM19USU0xU1cpKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBUSU0xNSBjbG9jayAoVElNMTVDTEspLgorICAqIEBwYXJhbSAgX19USU0xNUNMS1NvdXJjZV9fIHNwZWNpZmllcyB0aGUgVElNMTUgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVElNMTVDTEtfSENMSyBIQ0xLIHNlbGVjdGVkIGFzIFRJTTE1IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1RJTTE1Q0xLX1BMTCBQTEwgQ2xvY2sgc2VsZWN0ZWQgYXMgVElNMTUgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE1X0NPTkZJRyhfX1RJTTE1Q0xLU291cmNlX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSMywgUkNDX0NGR1IzX1RJTTE1U1csICh1aW50MzJfdCkoX19USU0xNUNMS1NvdXJjZV9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBUSU0xNSBjbG9jayAoVElNMTVDTEspLgorICAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19USU0xNUNMS19IQ0xLIEhDTEsgc2VsZWN0ZWQgYXMgVElNMTUgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVElNMTVDTEtfUExMIFBMTCBDbG9jayBzZWxlY3RlZCBhcyBUSU0xNSBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX1RJTTE1X1NPVVJDRSgpICgodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUjMsIFJDQ19DRkdSM19USU0xNVNXKSkpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgVElNMTYgY2xvY2sgKFRJTTE2Q0xLKS4KKyAgKiBAcGFyYW0gIF9fVElNMTZDTEtTb3VyY2VfXyBzcGVjaWZpZXMgdGhlIFRJTTE2IGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1RJTTE2Q0xLX0hDTEsgSENMSyBzZWxlY3RlZCBhcyBUSU0xNiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19USU0xNkNMS19QTEwgUExMIENsb2NrIHNlbGVjdGVkIGFzIFRJTTE2IGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xNl9DT05GSUcoX19USU0xNkNMS1NvdXJjZV9fKSBcCisgICAgICAgICAgICAgICAgICBNT0RJRllfUkVHKFJDQy0+Q0ZHUjMsIFJDQ19DRkdSM19USU0xNlNXLCAodWludDMyX3QpKF9fVElNMTZDTEtTb3VyY2VfXykpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgVElNMTYgY2xvY2sgKFRJTTE2Q0xLKS4KKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVElNMTZDTEtfSENMSyBIQ0xLIHNlbGVjdGVkIGFzIFRJTTE2IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1RJTTE2Q0xLX1BMTCBQTEwgQ2xvY2sgc2VsZWN0ZWQgYXMgVElNMTYgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9USU0xNl9TT1VSQ0UoKSAoKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNGR1IzLCBSQ0NfQ0ZHUjNfVElNMTZTVykpKQorCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIFRJTTE3IGNsb2NrIChUSU0xN0NMSykuCisgICogQHBhcmFtICBfX1RJTTE3Q0xLU291cmNlX18gc3BlY2lmaWVzIHRoZSBUSU0xNyBjbG9jayBzb3VyY2UuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19USU0xN0NMS19IQ0xLIEhDTEsgc2VsZWN0ZWQgYXMgVElNMTcgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVElNMTdDTEtfUExMIFBMTCBDbG9jayBzZWxlY3RlZCBhcyBUSU0xNyBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfVElNMTdfQ09ORklHKF9fVElNMTdDTEtTb3VyY2VfXykgXAorICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IzLCBSQ0NfQ0ZHUjNfVElNMTdTVywgKHVpbnQzMl90KShfX1RJTTE3Q0xLU291cmNlX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIFRJTTE3IGNsb2NrIChUSU0xN0NMSykuCisgICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1RJTTE3Q0xLX0hDTEsgSENMSyBzZWxlY3RlZCBhcyBUSU0xNyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19USU0xN0NMS19QTEwgUExMIENsb2NrIHNlbGVjdGVkIGFzIFRJTTE3IGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfVElNMTdfU09VUkNFKCkgKCh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DRkdSMywgUkNDX0NGR1IzX1RJTTE3U1cpKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9JMlN4X0Nsb2NrX0NvbmZpZyBSQ0MgRXh0ZW5kZWQgSTJTeCBDbG9jayBDb25maWcKKyAgKiBAeyAgIAorICAqLyAKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgSTJTIGNsb2NrIHNvdXJjZSAoSTJTQ0xLKS4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGVuYWJsaW5nIHRoZSBJMlMgQVBCIGNsb2NrLgorICAqIEBwYXJhbSAgX19JMlNDTEtTb3VyY2VfXyBzcGVjaWZpZXMgdGhlIEkyUyBjbG9jayBzb3VyY2UuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMlNDTEtTT1VSQ0VfU1lTQ0xLIFNZU0NMSyBjbG9jayB1c2VkIGFzIEkyUyBjbG9jayBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJTQ0xLU09VUkNFX0VYVCBFeHRlcm5hbCBjbG9jayBtYXBwZWQgb24gdGhlIEkyU19DS0lOIHBpbgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgYXMgSTJTIGNsb2NrIHNvdXJjZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfSTJTX0NPTkZJRyhfX0kyU0NMS1NvdXJjZV9fKSBcCisgICAgICAgICAgICAgICAgICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfSTJTU1JDLCAodWludDMyX3QpKF9fSTJTQ0xLU291cmNlX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIEkyUyBjbG9jayBzb3VyY2UgKEkyU0NMSykuCisgICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyU0NMS1NPVVJDRV9TWVNDTEsgU1lTQ0xLIGNsb2NrIHVzZWQgYXMgSTJTIGNsb2NrIHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMlNDTEtTT1VSQ0VfRVhUIEV4dGVybmFsIGNsb2NrIG1hcHBlZCBvbiB0aGUgSTJTX0NLSU4gcGluCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBhcyBJMlMgY2xvY2sgc291cmNlCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfSTJTX1NPVVJDRSgpICgodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfSTJTU1JDKSkpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0FEQ3hfQ2xvY2tfQ29uZmlnIFJDQyBFeHRlbmRlZCBBREN4IENsb2NrIENvbmZpZworICAqIEB7ICAgCisgICovIAorCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIEFEQzEgY2xvY2sgKEFEQzFDTEspLgorICAqIEBwYXJhbSAgX19BREMxQ0xLU291cmNlX18gc3BlY2lmaWVzIHRoZSBBREMxIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzFQTExDTEtfT0ZGICBBREMxIFBMTCBjbG9jayBkaXNhYmxlZCwgQURDMSBjYW4gdXNlIEFIQiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxUExMQ0xLX0RJVjEgUExMIGNsb2NrIGRpdmlkZWQgYnkgMSBzZWxlY3RlZCBhcyBBREMxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzFQTExDTEtfRElWMiBQTEwgY2xvY2sgZGl2aWRlZCBieSAyIHNlbGVjdGVkIGFzIEFEQzEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMVBMTENMS19ESVY0IFBMTCBjbG9jayBkaXZpZGVkIGJ5IDQgc2VsZWN0ZWQgYXMgQURDMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxUExMQ0xLX0RJVjYgUExMIGNsb2NrIGRpdmlkZWQgYnkgNiBzZWxlY3RlZCBhcyBBREMxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzFQTExDTEtfRElWOCBQTEwgY2xvY2sgZGl2aWRlZCBieSA4IHNlbGVjdGVkIGFzIEFEQzEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMVBMTENMS19ESVYxMCBQTEwgY2xvY2sgZGl2aWRlZCBieSAxMCBzZWxlY3RlZCBhcyBBREMxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzFQTExDTEtfRElWMTIgUExMIGNsb2NrIGRpdmlkZWQgYnkgMTIgc2VsZWN0ZWQgYXMgQURDMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxUExMQ0xLX0RJVjE2IFBMTCBjbG9jayBkaXZpZGVkIGJ5IDE2IHNlbGVjdGVkIGFzIEFEQzEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMVBMTENMS19ESVYzMiBQTEwgY2xvY2sgZGl2aWRlZCBieSAzMiBzZWxlY3RlZCBhcyBBREMxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzFQTExDTEtfRElWNjQgUExMIGNsb2NrIGRpdmlkZWQgYnkgNjQgc2VsZWN0ZWQgYXMgQURDMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxUExMQ0xLX0RJVjEyOCBQTEwgY2xvY2sgZGl2aWRlZCBieSAxMjggc2VsZWN0ZWQgYXMgQURDMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxUExMQ0xLX0RJVjI1NiBQTEwgY2xvY2sgZGl2aWRlZCBieSAyNTYgc2VsZWN0ZWQgYXMgQURDMSBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfQURDMV9DT05GSUcoX19BREMxQ0xLU291cmNlX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSMiwgUkNDX0NGR1IyX0FEQzFQUkVTLCAodWludDMyX3QpKF9fQURDMUNMS1NvdXJjZV9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBBREMxIGNsb2NrCisgICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzFQTExDTEtfT0ZGICBBREMxIFBMTCBjbG9jayBkaXNhYmxlZCwgQURDMSBjYW4gdXNlIEFIQiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxUExMQ0xLX0RJVjEgUExMIGNsb2NrIGRpdmlkZWQgYnkgMSBzZWxlY3RlZCBhcyBBREMxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzFQTExDTEtfRElWMiBQTEwgY2xvY2sgZGl2aWRlZCBieSAyIHNlbGVjdGVkIGFzIEFEQzEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMVBMTENMS19ESVY0IFBMTCBjbG9jayBkaXZpZGVkIGJ5IDQgc2VsZWN0ZWQgYXMgQURDMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxUExMQ0xLX0RJVjYgUExMIGNsb2NrIGRpdmlkZWQgYnkgNiBzZWxlY3RlZCBhcyBBREMxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzFQTExDTEtfRElWOCBQTEwgY2xvY2sgZGl2aWRlZCBieSA4IHNlbGVjdGVkIGFzIEFEQzEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMVBMTENMS19ESVYxMCBQTEwgY2xvY2sgZGl2aWRlZCBieSAxMCBzZWxlY3RlZCBhcyBBREMxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzFQTExDTEtfRElWMTIgUExMIGNsb2NrIGRpdmlkZWQgYnkgMTIgc2VsZWN0ZWQgYXMgQURDMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxUExMQ0xLX0RJVjE2IFBMTCBjbG9jayBkaXZpZGVkIGJ5IDE2IHNlbGVjdGVkIGFzIEFEQzEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMVBMTENMS19ESVYzMiBQTEwgY2xvY2sgZGl2aWRlZCBieSAzMiBzZWxlY3RlZCBhcyBBREMxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzFQTExDTEtfRElWNjQgUExMIGNsb2NrIGRpdmlkZWQgYnkgNjQgc2VsZWN0ZWQgYXMgQURDMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxUExMQ0xLX0RJVjEyOCBQTEwgY2xvY2sgZGl2aWRlZCBieSAxMjggc2VsZWN0ZWQgYXMgQURDMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxUExMQ0xLX0RJVjI1NiBQTEwgY2xvY2sgZGl2aWRlZCBieSAyNTYgc2VsZWN0ZWQgYXMgQURDMSBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX0FEQzFfU09VUkNFKCkgKCh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DRkdSMiwgUkNDX0NGR1IyX0FEQzFQUkVTKSkpCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpXAorICB8fCBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorLyoqIEBkZWZncm91cCBSQ0NFeF9JMkN4X0Nsb2NrX0NvbmZpZyBSQ0MgRXh0ZW5kZWQgSTJDeCBDbG9jayBDb25maWcKKyAgKiBAeyAgIAorICAqLyAKKworLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBJMkMyIGNsb2NrIChJMkMyQ0xLKS4KKyAgKiBAcGFyYW0gIF9fSTJDMkNMS1NvdXJjZV9fIHNwZWNpZmllcyB0aGUgSTJDMiBjbG9jayBzb3VyY2UuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkMyQ0xLU09VUkNFX0hTSSBIU0kgc2VsZWN0ZWQgYXMgSTJDMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkMyQ0xLU09VUkNFX1NZU0NMSyBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgSTJDMiBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfSTJDMl9DT05GSUcoX19JMkMyQ0xLU291cmNlX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSMywgUkNDX0NGR1IzX0kyQzJTVywgKHVpbnQzMl90KShfX0kyQzJDTEtTb3VyY2VfXykpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgSTJDMiBjbG9jayBzb3VyY2UuCisgICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzJDTEtTT1VSQ0VfSFNJIEhTSSBzZWxlY3RlZCBhcyBJMkMyIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzJDTEtTT1VSQ0VfU1lTQ0xLIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcyBJMkMyIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfSTJDMl9TT1VSQ0UoKSAoKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNGR1IzLCBSQ0NfQ0ZHUjNfSTJDMlNXKSkpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0FEQ3hfQ2xvY2tfQ29uZmlnIFJDQyBFeHRlbmRlZCBBREN4IENsb2NrIENvbmZpZworICAqIEB7ICAgCisgICovIAorCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIEFEQzEgJiBBREMyIGNsb2NrIChBREMxMkNMSykuCisgICogQHBhcmFtICBfX0FEQzEyQ0xLU291cmNlX18gc3BlY2lmaWVzIHRoZSBBREMxICYgQURDMiBjbG9jayBzb3VyY2UuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxMlBMTENMS19PRkYgIEFEQzEgJiBBREMyIFBMTCBjbG9jayBkaXNhYmxlZCwgQURDMSAmIEFEQzIgY2FuIHVzZSBBSEIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMTJQTExDTEtfRElWMSBQTEwgY2xvY2sgZGl2aWRlZCBieSAxIHNlbGVjdGVkIGFzIEFEQzEgJiBBREMyIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzEyUExMQ0xLX0RJVjIgUExMIGNsb2NrIGRpdmlkZWQgYnkgMiBzZWxlY3RlZCBhcyBBREMxICYgQURDMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxMlBMTENMS19ESVY0IFBMTCBjbG9jayBkaXZpZGVkIGJ5IDQgc2VsZWN0ZWQgYXMgQURDMSAmIEFEQzIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMTJQTExDTEtfRElWNiBQTEwgY2xvY2sgZGl2aWRlZCBieSA2IHNlbGVjdGVkIGFzIEFEQzEgJiBBREMyIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzEyUExMQ0xLX0RJVjggUExMIGNsb2NrIGRpdmlkZWQgYnkgOCBzZWxlY3RlZCBhcyBBREMxICYgQURDMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxMlBMTENMS19ESVYxMCBQTEwgY2xvY2sgZGl2aWRlZCBieSAxMCBzZWxlY3RlZCBhcyBBREMxICYgQURDMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxMlBMTENMS19ESVYxMiBQTEwgY2xvY2sgZGl2aWRlZCBieSAxMiBzZWxlY3RlZCBhcyBBREMxICYgQURDMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxMlBMTENMS19ESVYxNiBQTEwgY2xvY2sgZGl2aWRlZCBieSAxNiBzZWxlY3RlZCBhcyBBREMxICYgQURDMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxMlBMTENMS19ESVYzMiBQTEwgY2xvY2sgZGl2aWRlZCBieSAzMiBzZWxlY3RlZCBhcyBBREMxICYgQURDMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxMlBMTENMS19ESVY2NCBQTEwgY2xvY2sgZGl2aWRlZCBieSA2NCBzZWxlY3RlZCBhcyBBREMxICYgQURDMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxMlBMTENMS19ESVYxMjggUExMIGNsb2NrIGRpdmlkZWQgYnkgMTI4IHNlbGVjdGVkIGFzIEFEQzEgJiBBREMyIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzEyUExMQ0xLX0RJVjI1NiBQTEwgY2xvY2sgZGl2aWRlZCBieSAyNTYgc2VsZWN0ZWQgYXMgQURDMSAmIEFEQzIgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0FEQzEyX0NPTkZJRyhfX0FEQzEyQ0xLU291cmNlX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSMiwgUkNDX0NGR1IyX0FEQ1BSRTEyLCAodWludDMyX3QpKF9fQURDMTJDTEtTb3VyY2VfXykpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgQURDMSAmIEFEQzIgY2xvY2sKKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMTJQTExDTEtfT0ZGICBBREMxICYgQURDMiBQTEwgY2xvY2sgZGlzYWJsZWQsIEFEQzEgJiBBREMyIGNhbiB1c2UgQUhCIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzEyUExMQ0xLX0RJVjEgUExMIGNsb2NrIGRpdmlkZWQgYnkgMSBzZWxlY3RlZCBhcyBBREMxICYgQURDMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxMlBMTENMS19ESVYyIFBMTCBjbG9jayBkaXZpZGVkIGJ5IDIgc2VsZWN0ZWQgYXMgQURDMSAmIEFEQzIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMTJQTExDTEtfRElWNCBQTEwgY2xvY2sgZGl2aWRlZCBieSA0IHNlbGVjdGVkIGFzIEFEQzEgJiBBREMyIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzEyUExMQ0xLX0RJVjYgUExMIGNsb2NrIGRpdmlkZWQgYnkgNiBzZWxlY3RlZCBhcyBBREMxICYgQURDMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxMlBMTENMS19ESVY4IFBMTCBjbG9jayBkaXZpZGVkIGJ5IDggc2VsZWN0ZWQgYXMgQURDMSAmIEFEQzIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMTJQTExDTEtfRElWMTAgUExMIGNsb2NrIGRpdmlkZWQgYnkgMTAgc2VsZWN0ZWQgYXMgQURDMSAmIEFEQzIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMTJQTExDTEtfRElWMTIgUExMIGNsb2NrIGRpdmlkZWQgYnkgMTIgc2VsZWN0ZWQgYXMgQURDMSAmIEFEQzIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMTJQTExDTEtfRElWMTYgUExMIGNsb2NrIGRpdmlkZWQgYnkgMTYgc2VsZWN0ZWQgYXMgQURDMSAmIEFEQzIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMTJQTExDTEtfRElWMzIgUExMIGNsb2NrIGRpdmlkZWQgYnkgMzIgc2VsZWN0ZWQgYXMgQURDMSAmIEFEQzIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMTJQTExDTEtfRElWNjQgUExMIGNsb2NrIGRpdmlkZWQgYnkgNjQgc2VsZWN0ZWQgYXMgQURDMSAmIEFEQzIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMTJQTExDTEtfRElWMTI4IFBMTCBjbG9jayBkaXZpZGVkIGJ5IDEyOCBzZWxlY3RlZCBhcyBBREMxICYgQURDMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxMlBMTENMS19ESVYyNTYgUExMIGNsb2NrIGRpdmlkZWQgYnkgMjU2IHNlbGVjdGVkIGFzIEFEQzEgJiBBREMyIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfQURDMTJfU09VUkNFKCkgKCh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DRkdSMiwgUkNDX0NGR1IyX0FEQ1BSRTEyKSkpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X1RJTXhfQ2xvY2tfQ29uZmlnIFJDQyBFeHRlbmRlZCBUSU14IENsb2NrIENvbmZpZworICAqIEB7ICAgCisgICovIAorCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIFRJTTEgY2xvY2sgKFRJTTFDTEspLgorICAqIEBwYXJhbSAgX19USU0xQ0xLU291cmNlX18gc3BlY2lmaWVzIHRoZSBUSU0xIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1RJTTFDTEtfSENMSyBIQ0xLIHNlbGVjdGVkIGFzIFRJTTEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVElNMUNMS19QTExDTEsgUExMIENsb2NrIHNlbGVjdGVkIGFzIFRJTTEgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1RJTTFfQ09ORklHKF9fVElNMUNMS1NvdXJjZV9fKSBcCisgICAgICAgICAgICAgICAgICBNT0RJRllfUkVHKFJDQy0+Q0ZHUjMsIFJDQ19DRkdSM19USU0xU1csICh1aW50MzJfdCkoX19USU0xQ0xLU291cmNlX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIFRJTTEgY2xvY2sgKFRJTTFDTEspLgorICAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19USU0xQ0xLX0hDTEsgSENMSyBzZWxlY3RlZCBhcyBUSU0xIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1RJTTFDTEtfUExMQ0xLIFBMTCBDbG9jayBzZWxlY3RlZCBhcyBUSU0xIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfVElNMV9TT1VSQ0UoKSAoKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNGR1IzLCBSQ0NfQ0ZHUjNfVElNMVNXKSkpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0kyU3hfQ2xvY2tfQ29uZmlnIFJDQyBFeHRlbmRlZCBJMlN4IENsb2NrIENvbmZpZworICAqIEB7ICAgCisgICovIAorCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIEkyUyBjbG9jayBzb3VyY2UgKEkyU0NMSykuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBlbmFibGluZyB0aGUgSTJTIEFQQiBjbG9jay4KKyAgKiBAcGFyYW0gIF9fSTJTQ0xLU291cmNlX18gc3BlY2lmaWVzIHRoZSBJMlMgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJTQ0xLU09VUkNFX1NZU0NMSyBTWVNDTEsgY2xvY2sgdXNlZCBhcyBJMlMgY2xvY2sgc291cmNlCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyU0NMS1NPVVJDRV9FWFQgRXh0ZXJuYWwgY2xvY2sgbWFwcGVkIG9uIHRoZSBJMlNfQ0tJTiBwaW4KKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGFzIEkyUyBjbG9jayBzb3VyY2UKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0kyU19DT05GSUcoX19JMlNDTEtTb3VyY2VfXykgXAorICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX0kyU1NSQywgKHVpbnQzMl90KShfX0kyU0NMS1NvdXJjZV9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBJMlMgY2xvY2sgc291cmNlIChJMlNDTEspLgorICAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMlNDTEtTT1VSQ0VfU1lTQ0xLIFNZU0NMSyBjbG9jayB1c2VkIGFzIEkyUyBjbG9jayBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJTQ0xLU09VUkNFX0VYVCBFeHRlcm5hbCBjbG9jayBtYXBwZWQgb24gdGhlIEkyU19DS0lOIHBpbgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgYXMgSTJTIGNsb2NrIHNvdXJjZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX0kyU19TT1VSQ0UoKSAoKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNGR1IsIFJDQ19DRkdSX0kyU1NSQykpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9VQVJUeF9DbG9ja19Db25maWcgUkNDIEV4dGVuZGVkIFVBUlR4IENsb2NrIENvbmZpZworICAqIEB7ICAgCisgICovIAorCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIFVBUlQ0IGNsb2NrIChVQVJUNENMSykuCisgICogQHBhcmFtICBfX1VBUlQ0Q0xLU291cmNlX18gc3BlY2lmaWVzIHRoZSBVQVJUNCBjbG9jayBzb3VyY2UuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VQVJUNENMS1NPVVJDRV9QQ0xLMSBQQ0xLMSBzZWxlY3RlZCBhcyBVQVJUNCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VQVJUNENMS1NPVVJDRV9IU0kgSFNJIHNlbGVjdGVkIGFzIFVBUlQ0IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VBUlQ0Q0xLU09VUkNFX1NZU0NMSyBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgVUFSVDQgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVUFSVDRDTEtTT1VSQ0VfTFNFIExTRSBzZWxlY3RlZCBhcyBVQVJUNCBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfVUFSVDRfQ09ORklHKF9fVUFSVDRDTEtTb3VyY2VfXykgXAorICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IzLCBSQ0NfQ0ZHUjNfVUFSVDRTVywgKHVpbnQzMl90KShfX1VBUlQ0Q0xLU291cmNlX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIFVBUlQ0IGNsb2NrIHNvdXJjZS4KKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVUFSVDRDTEtTT1VSQ0VfUENMSzEgUENMSzEgc2VsZWN0ZWQgYXMgVUFSVDQgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVUFSVDRDTEtTT1VSQ0VfSFNJIEhTSSBzZWxlY3RlZCBhcyBVQVJUNCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VQVJUNENMS1NPVVJDRV9TWVNDTEsgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzIFVBUlQ0IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VBUlQ0Q0xLU09VUkNFX0xTRSBMU0Ugc2VsZWN0ZWQgYXMgVUFSVDQgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9VQVJUNF9TT1VSQ0UoKSAoKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNGR1IzLCBSQ0NfQ0ZHUjNfVUFSVDRTVykpKQorCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIFVBUlQ1IGNsb2NrIChVQVJUNUNMSykuCisgICogQHBhcmFtICBfX1VBUlQ1Q0xLU291cmNlX18gc3BlY2lmaWVzIHRoZSBVQVJUNSBjbG9jayBzb3VyY2UuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VQVJUNUNMS1NPVVJDRV9QQ0xLMSBQQ0xLMSBzZWxlY3RlZCBhcyBVQVJUNSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VQVJUNUNMS1NPVVJDRV9IU0kgSFNJIHNlbGVjdGVkIGFzIFVBUlQ1IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VBUlQ1Q0xLU09VUkNFX1NZU0NMSyBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgVUFSVDUgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVUFSVDVDTEtTT1VSQ0VfTFNFIExTRSBzZWxlY3RlZCBhcyBVQVJUNSBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfVUFSVDVfQ09ORklHKF9fVUFSVDVDTEtTb3VyY2VfXykgXAorICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IzLCBSQ0NfQ0ZHUjNfVUFSVDVTVywgKHVpbnQzMl90KShfX1VBUlQ1Q0xLU291cmNlX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIFVBUlQ1IGNsb2NrIHNvdXJjZS4KKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVUFSVDVDTEtTT1VSQ0VfUENMSzEgUENMSzEgc2VsZWN0ZWQgYXMgVUFSVDUgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVUFSVDVDTEtTT1VSQ0VfSFNJIEhTSSBzZWxlY3RlZCBhcyBVQVJUNSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VQVJUNUNMS1NPVVJDRV9TWVNDTEsgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzIFVBUlQ1IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VBUlQ1Q0xLU09VUkNFX0xTRSBMU0Ugc2VsZWN0ZWQgYXMgVUFSVDUgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9VQVJUNV9TT1VSQ0UoKSAoKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNGR1IzLCBSQ0NfQ0ZHUjNfVUFSVDVTVykpKQorLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4ICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KVwKKyAgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfQURDeF9DbG9ja19Db25maWcgUkNDIEV4dGVuZGVkIEFEQ3ggQ2xvY2sgQ29uZmlnCisgICogQHsgICAKKyAgKi8gCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgQURDMyAmIEFEQzQgY2xvY2sgKEFEQzM0Q0xLKS4KKyAgKiBAcGFyYW0gIF9fQURDMzRDTEtTb3VyY2VfXyBzcGVjaWZpZXMgdGhlIEFEQzMgJiBBREM0IGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzM0UExMQ0xLX09GRiAgQURDMyAmIEFEQzQgUExMIGNsb2NrIGRpc2FibGVkLCBBREMzICYgQURDNCBjYW4gdXNlIEFIQiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMzNFBMTENMS19ESVYxIFBMTCBjbG9jayBkaXZpZGVkIGJ5IDEgc2VsZWN0ZWQgYXMgQURDMyAmIEFEQzQgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMzRQTExDTEtfRElWMiBQTEwgY2xvY2sgZGl2aWRlZCBieSAyIHNlbGVjdGVkIGFzIEFEQzMgJiBBREM0IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzM0UExMQ0xLX0RJVjQgUExMIGNsb2NrIGRpdmlkZWQgYnkgNCBzZWxlY3RlZCBhcyBBREMzICYgQURDNCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMzNFBMTENMS19ESVY2IFBMTCBjbG9jayBkaXZpZGVkIGJ5IDYgc2VsZWN0ZWQgYXMgQURDMyAmIEFEQzQgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMzRQTExDTEtfRElWOCBQTEwgY2xvY2sgZGl2aWRlZCBieSA4IHNlbGVjdGVkIGFzIEFEQzMgJiBBREM0IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzM0UExMQ0xLX0RJVjEwIFBMTCBjbG9jayBkaXZpZGVkIGJ5IDEwIHNlbGVjdGVkIGFzIEFEQzMgJiBBREM0IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzM0UExMQ0xLX0RJVjEyIFBMTCBjbG9jayBkaXZpZGVkIGJ5IDEyIHNlbGVjdGVkIGFzIEFEQzMgJiBBREM0IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzM0UExMQ0xLX0RJVjE2IFBMTCBjbG9jayBkaXZpZGVkIGJ5IDE2IHNlbGVjdGVkIGFzIEFEQzMgJiBBREM0IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzM0UExMQ0xLX0RJVjMyIFBMTCBjbG9jayBkaXZpZGVkIGJ5IDMyIHNlbGVjdGVkIGFzIEFEQzMgJiBBREM0IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzM0UExMQ0xLX0RJVjY0IFBMTCBjbG9jayBkaXZpZGVkIGJ5IDY0IHNlbGVjdGVkIGFzIEFEQzMgJiBBREM0IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzM0UExMQ0xLX0RJVjEyOCBQTEwgY2xvY2sgZGl2aWRlZCBieSAxMjggc2VsZWN0ZWQgYXMgQURDMyAmIEFEQzQgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMzRQTExDTEtfRElWMjU2IFBMTCBjbG9jayBkaXZpZGVkIGJ5IDI1NiBzZWxlY3RlZCBhcyBBREMzICYgQURDNCBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfQURDMzRfQ09ORklHKF9fQURDMzRDTEtTb3VyY2VfXykgXAorICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IyLCBSQ0NfQ0ZHUjJfQURDUFJFMzQsICh1aW50MzJfdCkoX19BREMzNENMS1NvdXJjZV9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBBREMzICYgQURDNCBjbG9jaworICAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMzNFBMTENMS19PRkYgIEFEQzMgJiBBREM0IFBMTCBjbG9jayBkaXNhYmxlZCwgQURDMyAmIEFEQzQgY2FuIHVzZSBBSEIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMzRQTExDTEtfRElWMSBQTEwgY2xvY2sgZGl2aWRlZCBieSAxIHNlbGVjdGVkIGFzIEFEQzMgJiBBREM0IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzM0UExMQ0xLX0RJVjIgUExMIGNsb2NrIGRpdmlkZWQgYnkgMiBzZWxlY3RlZCBhcyBBREMzICYgQURDNCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMzNFBMTENMS19ESVY0IFBMTCBjbG9jayBkaXZpZGVkIGJ5IDQgc2VsZWN0ZWQgYXMgQURDMyAmIEFEQzQgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMzRQTExDTEtfRElWNiBQTEwgY2xvY2sgZGl2aWRlZCBieSA2IHNlbGVjdGVkIGFzIEFEQzMgJiBBREM0IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzM0UExMQ0xLX0RJVjggUExMIGNsb2NrIGRpdmlkZWQgYnkgOCBzZWxlY3RlZCBhcyBBREMzICYgQURDNCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMzNFBMTENMS19ESVYxMCBQTEwgY2xvY2sgZGl2aWRlZCBieSAxMCBzZWxlY3RlZCBhcyBBREMzICYgQURDNCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMzNFBMTENMS19ESVYxMiBQTEwgY2xvY2sgZGl2aWRlZCBieSAxMiBzZWxlY3RlZCBhcyBBREMzICYgQURDNCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMzNFBMTENMS19ESVYxNiBQTEwgY2xvY2sgZGl2aWRlZCBieSAxNiBzZWxlY3RlZCBhcyBBREMzICYgQURDNCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMzNFBMTENMS19ESVYzMiBQTEwgY2xvY2sgZGl2aWRlZCBieSAzMiBzZWxlY3RlZCBhcyBBREMzICYgQURDNCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMzNFBMTENMS19ESVY2NCBQTEwgY2xvY2sgZGl2aWRlZCBieSA2NCBzZWxlY3RlZCBhcyBBREMzICYgQURDNCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMzNFBMTENMS19ESVYxMjggUExMIGNsb2NrIGRpdmlkZWQgYnkgMTI4IHNlbGVjdGVkIGFzIEFEQzMgJiBBREM0IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzM0UExMQ0xLX0RJVjI1NiBQTEwgY2xvY2sgZGl2aWRlZCBieSAyNTYgc2VsZWN0ZWQgYXMgQURDMyAmIEFEQzQgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9BREMzNF9TT1VSQ0UoKSAoKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNGR1IyLCBSQ0NfQ0ZHUjJfQURDUFJFMzQpKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfVElNeF9DbG9ja19Db25maWcgUkNDIEV4dGVuZGVkIFRJTXggQ2xvY2sgQ29uZmlnCisgICogQHsgICAKKyAgKi8gCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgVElNOCBjbG9jayAoVElNOENMSykuCisgICogQHBhcmFtICBfX1RJTThDTEtTb3VyY2VfXyBzcGVjaWZpZXMgdGhlIFRJTTggY2xvY2sgc291cmNlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVElNOENMS19IQ0xLIEhDTEsgc2VsZWN0ZWQgYXMgVElNOCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19USU04Q0xLX1BMTENMSyBQTEwgQ2xvY2sgc2VsZWN0ZWQgYXMgVElNOCBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfVElNOF9DT05GSUcoX19USU04Q0xLU291cmNlX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSMywgUkNDX0NGR1IzX1RJTThTVywgKHVpbnQzMl90KShfX1RJTThDTEtTb3VyY2VfXykpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgVElNOCBjbG9jayAoVElNOENMSykuCisgICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1RJTThDTEtfSENMSyBIQ0xLIHNlbGVjdGVkIGFzIFRJTTggY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVElNOENMS19QTExDTEsgUExMIENsb2NrIHNlbGVjdGVkIGFzIFRJTTggY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9USU04X1NPVVJDRSgpICgodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUjMsIFJDQ19DRkdSM19USU04U1cpKSkKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4ICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KQorLyoqIEBkZWZncm91cCBSQ0NFeF9BREN4X0Nsb2NrX0NvbmZpZyBSQ0MgRXh0ZW5kZWQgQURDeCBDbG9jayBDb25maWcKKyAgKiBAeyAgIAorICAqLyAKKworLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBBREMxICYgQURDMiBjbG9jayAoQURDMTJDTEspLgorICAqIEBwYXJhbSAgX19BREMxMkNMS1NvdXJjZV9fIHNwZWNpZmllcyB0aGUgQURDMSAmIEFEQzIgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMTJQTExDTEtfT0ZGICBBREMxICYgQURDMiBQTEwgY2xvY2sgZGlzYWJsZWQsIEFEQzEgJiBBREMyIGNhbiB1c2UgQUhCIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzEyUExMQ0xLX0RJVjEgUExMIGNsb2NrIGRpdmlkZWQgYnkgMSBzZWxlY3RlZCBhcyBBREMxICYgQURDMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxMlBMTENMS19ESVYyIFBMTCBjbG9jayBkaXZpZGVkIGJ5IDIgc2VsZWN0ZWQgYXMgQURDMSAmIEFEQzIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMTJQTExDTEtfRElWNCBQTEwgY2xvY2sgZGl2aWRlZCBieSA0IHNlbGVjdGVkIGFzIEFEQzEgJiBBREMyIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzEyUExMQ0xLX0RJVjYgUExMIGNsb2NrIGRpdmlkZWQgYnkgNiBzZWxlY3RlZCBhcyBBREMxICYgQURDMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxMlBMTENMS19ESVY4IFBMTCBjbG9jayBkaXZpZGVkIGJ5IDggc2VsZWN0ZWQgYXMgQURDMSAmIEFEQzIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMTJQTExDTEtfRElWMTAgUExMIGNsb2NrIGRpdmlkZWQgYnkgMTAgc2VsZWN0ZWQgYXMgQURDMSAmIEFEQzIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMTJQTExDTEtfRElWMTIgUExMIGNsb2NrIGRpdmlkZWQgYnkgMTIgc2VsZWN0ZWQgYXMgQURDMSAmIEFEQzIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMTJQTExDTEtfRElWMTYgUExMIGNsb2NrIGRpdmlkZWQgYnkgMTYgc2VsZWN0ZWQgYXMgQURDMSAmIEFEQzIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMTJQTExDTEtfRElWMzIgUExMIGNsb2NrIGRpdmlkZWQgYnkgMzIgc2VsZWN0ZWQgYXMgQURDMSAmIEFEQzIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMTJQTExDTEtfRElWNjQgUExMIGNsb2NrIGRpdmlkZWQgYnkgNjQgc2VsZWN0ZWQgYXMgQURDMSAmIEFEQzIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMTJQTExDTEtfRElWMTI4IFBMTCBjbG9jayBkaXZpZGVkIGJ5IDEyOCBzZWxlY3RlZCBhcyBBREMxICYgQURDMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxMlBMTENMS19ESVYyNTYgUExMIGNsb2NrIGRpdmlkZWQgYnkgMjU2IHNlbGVjdGVkIGFzIEFEQzEgJiBBREMyIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19BREMxMl9DT05GSUcoX19BREMxMkNMS1NvdXJjZV9fKSBcCisgICAgICAgICAgICAgICAgICBNT0RJRllfUkVHKFJDQy0+Q0ZHUjIsIFJDQ19DRkdSMl9BRENQUkUxMiwgKHVpbnQzMl90KShfX0FEQzEyQ0xLU291cmNlX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIEFEQzEgJiBBREMyIGNsb2NrCisgICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzEyUExMQ0xLX09GRiAgQURDMSAmIEFEQzIgUExMIGNsb2NrIGRpc2FibGVkLCBBREMxICYgQURDMiBjYW4gdXNlIEFIQiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxMlBMTENMS19ESVYxIFBMTCBjbG9jayBkaXZpZGVkIGJ5IDEgc2VsZWN0ZWQgYXMgQURDMSAmIEFEQzIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMTJQTExDTEtfRElWMiBQTEwgY2xvY2sgZGl2aWRlZCBieSAyIHNlbGVjdGVkIGFzIEFEQzEgJiBBREMyIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzEyUExMQ0xLX0RJVjQgUExMIGNsb2NrIGRpdmlkZWQgYnkgNCBzZWxlY3RlZCBhcyBBREMxICYgQURDMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxMlBMTENMS19ESVY2IFBMTCBjbG9jayBkaXZpZGVkIGJ5IDYgc2VsZWN0ZWQgYXMgQURDMSAmIEFEQzIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMTJQTExDTEtfRElWOCBQTEwgY2xvY2sgZGl2aWRlZCBieSA4IHNlbGVjdGVkIGFzIEFEQzEgJiBBREMyIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzEyUExMQ0xLX0RJVjEwIFBMTCBjbG9jayBkaXZpZGVkIGJ5IDEwIHNlbGVjdGVkIGFzIEFEQzEgJiBBREMyIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzEyUExMQ0xLX0RJVjEyIFBMTCBjbG9jayBkaXZpZGVkIGJ5IDEyIHNlbGVjdGVkIGFzIEFEQzEgJiBBREMyIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzEyUExMQ0xLX0RJVjE2IFBMTCBjbG9jayBkaXZpZGVkIGJ5IDE2IHNlbGVjdGVkIGFzIEFEQzEgJiBBREMyIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzEyUExMQ0xLX0RJVjMyIFBMTCBjbG9jayBkaXZpZGVkIGJ5IDMyIHNlbGVjdGVkIGFzIEFEQzEgJiBBREMyIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzEyUExMQ0xLX0RJVjY0IFBMTCBjbG9jayBkaXZpZGVkIGJ5IDY0IHNlbGVjdGVkIGFzIEFEQzEgJiBBREMyIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzEyUExMQ0xLX0RJVjEyOCBQTEwgY2xvY2sgZGl2aWRlZCBieSAxMjggc2VsZWN0ZWQgYXMgQURDMSAmIEFEQzIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMTJQTExDTEtfRElWMjU2IFBMTCBjbG9jayBkaXZpZGVkIGJ5IDI1NiBzZWxlY3RlZCBhcyBBREMxICYgQURDMiBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX0FEQzEyX1NPVVJDRSgpICgodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUjIsIFJDQ19DRkdSMl9BRENQUkUxMikpKSAgICAgICAgICAgICAgICAgICAgCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X1RJTXhfQ2xvY2tfQ29uZmlnIFJDQyBFeHRlbmRlZCBUSU14IENsb2NrIENvbmZpZworICAqIEB7ICAgCisgICovIAorLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBUSU0xIGNsb2NrIChUSU0xQ0xLKS4KKyAgKiBAcGFyYW0gIF9fVElNMUNMS1NvdXJjZV9fIHNwZWNpZmllcyB0aGUgVElNMSBjbG9jayBzb3VyY2UuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19USU0xQ0xLX0hDTEsgSENMSyBzZWxlY3RlZCBhcyBUSU0xIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1RJTTFDTEtfUExMQ0xLIFBMTCBDbG9jayBzZWxlY3RlZCBhcyBUSU0xIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xX0NPTkZJRyhfX1RJTTFDTEtTb3VyY2VfXykgXAorICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IzLCBSQ0NfQ0ZHUjNfVElNMVNXLCAodWludDMyX3QpKF9fVElNMUNMS1NvdXJjZV9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBUSU0xIGNsb2NrIChUSU0xQ0xLKS4KKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVElNMUNMS19IQ0xLIEhDTEsgc2VsZWN0ZWQgYXMgVElNMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19USU0xQ0xLX1BMTENMSyBQTEwgQ2xvY2sgc2VsZWN0ZWQgYXMgVElNMSBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX1RJTTFfU09VUkNFKCkgKCh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DRkdSMywgUkNDX0NGR1IzX1RJTTFTVykpKQorLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMzR4OCkKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfSFJUSU14X0Nsb2NrX0NvbmZpZyBSQ0MgRXh0ZW5kZWQgSFJUSU14IENsb2NrIENvbmZpZworICAqIEB7ICAgCisgICovIAorLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBIUlRJTTEgY2xvY2suCisgICogQHBhcmFtICBfX0hSVElNMUNMS1NvdXJjZV9fIHNwZWNpZmllcyB0aGUgSFJUSU0xIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0hSVElNMUNMS19IQ0xLICAgSENMSyBzZWxlY3RlZCBhcyBIUlRJTTEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSFJUSU0xQ0xLX1BMTENMSyBQTEwgQ2xvY2sgc2VsZWN0ZWQgYXMgSFJUSU0xIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19IUlRJTTFfQ09ORklHKF9fSFJUSU0xQ0xLU291cmNlX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSMywgUkNDX0NGR1IzX0hSVElNMVNXLCAodWludDMyX3QpKF9fSFJUSU0xQ0xLU291cmNlX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIEhSVElNMSBjbG9jayBzb3VyY2UuCisgICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0hSVElNMUNMS19IQ0xLICAgSENMSyBzZWxlY3RlZCBhcyBIUlRJTTEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSFJUSU0xQ0xLX1BMTENMSyBQTEwgQ2xvY2sgc2VsZWN0ZWQgYXMgSFJUSU0xIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfSFJUSU0xX1NPVVJDRSgpICgodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUjMsIFJDQ19DRkdSM19IUlRJTTFTVykpKQorLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBTVE0zMkYzMzR4OCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfSTJDeF9DbG9ja19Db25maWcgUkNDIEV4dGVuZGVkIEkyQ3ggQ2xvY2sgQ29uZmlnCisgICogQHsgICAKKyAgKi8gCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIEkyQzIgY2xvY2sgKEkyQzJDTEspLgorICAqIEBwYXJhbSAgX19JMkMyQ0xLU291cmNlX18gc3BlY2lmaWVzIHRoZSBJMkMyIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzJDTEtTT1VSQ0VfSFNJIEhTSSBzZWxlY3RlZCBhcyBJMkMyIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzJDTEtTT1VSQ0VfU1lTQ0xLIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcyBJMkMyIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMyX0NPTkZJRyhfX0kyQzJDTEtTb3VyY2VfXykgXAorICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IzLCBSQ0NfQ0ZHUjNfSTJDMlNXLCAodWludDMyX3QpKF9fSTJDMkNMS1NvdXJjZV9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBJMkMyIGNsb2NrIHNvdXJjZS4KKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDMkNMS1NPVVJDRV9IU0kgSFNJIHNlbGVjdGVkIGFzIEkyQzIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDMkNMS1NPVVJDRV9TWVNDTEsgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzIEkyQzIgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9JMkMyX1NPVVJDRSgpICgodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUjMsIFJDQ19DRkdSM19JMkMyU1cpKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfQURDeF9DbG9ja19Db25maWcgUkNDIEV4dGVuZGVkIEFEQ3ggQ2xvY2sgQ29uZmlnCisgICogQHsgICAKKyAgKi8gCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIEFEQzEgY2xvY2sgKEFEQzFDTEspLgorICAqIEBwYXJhbSAgX19BREMxQ0xLU291cmNlX18gc3BlY2lmaWVzIHRoZSBBREMxIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxUENMSzJfRElWMiBQQ0xLMiBjbG9jayBkaXZpZGVkIGJ5IDIgc2VsZWN0ZWQgYXMgQURDMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxUENMSzJfRElWNCBQQ0xLMiBjbG9jayBkaXZpZGVkIGJ5IDQgc2VsZWN0ZWQgYXMgQURDMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxUENMSzJfRElWNiBQQ0xLMiBjbG9jayBkaXZpZGVkIGJ5IDYgc2VsZWN0ZWQgYXMgQURDMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxUENMSzJfRElWOCBQQ0xLMiBjbG9jayBkaXZpZGVkIGJ5IDggc2VsZWN0ZWQgYXMgQURDMSBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfQURDMV9DT05GSUcoX19BREMxQ0xLU291cmNlX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9BRENQUkUsICh1aW50MzJfdCkoX19BREMxQ0xLU291cmNlX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIEFEQzEgY2xvY2sgKEFEQzFDTEspLgorICAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxUENMSzJfRElWMiBQQ0xLMiBjbG9jayBkaXZpZGVkIGJ5IDIgc2VsZWN0ZWQgYXMgQURDMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxUENMSzJfRElWNCBQQ0xLMiBjbG9jayBkaXZpZGVkIGJ5IDQgc2VsZWN0ZWQgYXMgQURDMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxUENMSzJfRElWNiBQQ0xLMiBjbG9jayBkaXZpZGVkIGJ5IDYgc2VsZWN0ZWQgYXMgQURDMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxUENMSzJfRElWOCBQQ0xLMiBjbG9jayBkaXZpZGVkIGJ5IDggc2VsZWN0ZWQgYXMgQURDMSBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX0FEQzFfU09VUkNFKCkgKCh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9BRENQUkUpKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfU0RBREN4X0Nsb2NrX0NvbmZpZyBSQ0MgRXh0ZW5kZWQgU0RBREN4IENsb2NrIENvbmZpZworICAqIEB7ICAgCisgICovIAorLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBTREFEQ3ggY2xvY2sgKFNEQURDeENMSykuCisgICogQHBhcmFtICBfX1NEQURDUHJlc2NhbGVyX18gc3BlY2lmaWVzIHRoZSBTREFEQ3ggc3lzdGVtIGNsb2NrIHByZXNjYWxlci4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NEQURDU1lTQ0xLX0RJVjEgU1lTQ0xLIGNsb2NrIHNlbGVjdGVkIGFzIFNEQURDeCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TREFEQ1NZU0NMS19ESVYyIFNZU0NMSyBjbG9jayBkaXZpZGVkIGJ5IDIgc2VsZWN0ZWQgYXMgU0RBREN4IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NEQURDU1lTQ0xLX0RJVjQgU1lTQ0xLIGNsb2NrIGRpdmlkZWQgYnkgNCBzZWxlY3RlZCBhcyBTREFEQ3ggY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU0RBRENTWVNDTEtfRElWNiBTWVNDTEsgY2xvY2sgZGl2aWRlZCBieSA2IHNlbGVjdGVkIGFzIFNEQURDeCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TREFEQ1NZU0NMS19ESVY4IFNZU0NMSyBjbG9jayBkaXZpZGVkIGJ5IDggc2VsZWN0ZWQgYXMgU0RBREN4IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NEQURDU1lTQ0xLX0RJVjEwIFNZU0NMSyBjbG9jayBkaXZpZGVkIGJ5IDEwIHNlbGVjdGVkIGFzIFNEQURDeCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TREFEQ1NZU0NMS19ESVYxMiBTWVNDTEsgY2xvY2sgZGl2aWRlZCBieSAxMiBzZWxlY3RlZCBhcyBTREFEQ3ggY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU0RBRENTWVNDTEtfRElWMTQgU1lTQ0xLIGNsb2NrIGRpdmlkZWQgYnkgMTQgc2VsZWN0ZWQgYXMgU0RBREN4IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NEQURDU1lTQ0xLX0RJVjE2IFNZU0NMSyBjbG9jayBkaXZpZGVkIGJ5IDE2IHNlbGVjdGVkIGFzIFNEQURDeCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TREFEQ1NZU0NMS19ESVYyMCBTWVNDTEsgY2xvY2sgZGl2aWRlZCBieSAyMCBzZWxlY3RlZCBhcyBTREFEQ3ggY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU0RBRENTWVNDTEtfRElWMjQgU1lTQ0xLIGNsb2NrIGRpdmlkZWQgYnkgMjQgc2VsZWN0ZWQgYXMgU0RBREN4IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NEQURDU1lTQ0xLX0RJVjI4IFNZU0NMSyBjbG9jayBkaXZpZGVkIGJ5IDI4IHNlbGVjdGVkIGFzIFNEQURDeCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TREFEQ1NZU0NMS19ESVYzMiBTWVNDTEsgY2xvY2sgZGl2aWRlZCBieSAzMiBzZWxlY3RlZCBhcyBTREFEQ3ggY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU0RBRENTWVNDTEtfRElWMzYgU1lTQ0xLIGNsb2NrIGRpdmlkZWQgYnkgMzYgc2VsZWN0ZWQgYXMgU0RBREN4IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NEQURDU1lTQ0xLX0RJVjQwIFNZU0NMSyBjbG9jayBkaXZpZGVkIGJ5IDQwIHNlbGVjdGVkIGFzIFNEQURDeCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TREFEQ1NZU0NMS19ESVY0NCBTWVNDTEsgY2xvY2sgZGl2aWRlZCBieSA0NCBzZWxlY3RlZCBhcyBTREFEQ3ggY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU0RBRENTWVNDTEtfRElWNDggU1lTQ0xLIGNsb2NrIGRpdmlkZWQgYnkgNDggc2VsZWN0ZWQgYXMgU0RBREN4IGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19TREFEQ19DT05GSUcoX19TREFEQ1ByZXNjYWxlcl9fKSBcCisgICAgICAgICAgICAgICAgICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfU0RQUkUsICh1aW50MzJfdCkoX19TREFEQ1ByZXNjYWxlcl9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBTREFEQ3ggY2xvY2sgcHJlc2NhbGVyLgorICAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TREFEQ1NZU0NMS19ESVYxIFNZU0NMSyBjbG9jayBzZWxlY3RlZCBhcyBTREFEQ3ggY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU0RBRENTWVNDTEtfRElWMiBTWVNDTEsgY2xvY2sgZGl2aWRlZCBieSAyIHNlbGVjdGVkIGFzIFNEQURDeCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TREFEQ1NZU0NMS19ESVY0IFNZU0NMSyBjbG9jayBkaXZpZGVkIGJ5IDQgc2VsZWN0ZWQgYXMgU0RBREN4IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NEQURDU1lTQ0xLX0RJVjYgU1lTQ0xLIGNsb2NrIGRpdmlkZWQgYnkgNiBzZWxlY3RlZCBhcyBTREFEQ3ggY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU0RBRENTWVNDTEtfRElWOCBTWVNDTEsgY2xvY2sgZGl2aWRlZCBieSA4IHNlbGVjdGVkIGFzIFNEQURDeCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TREFEQ1NZU0NMS19ESVYxMCBTWVNDTEsgY2xvY2sgZGl2aWRlZCBieSAxMCBzZWxlY3RlZCBhcyBTREFEQ3ggY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU0RBRENTWVNDTEtfRElWMTIgU1lTQ0xLIGNsb2NrIGRpdmlkZWQgYnkgMTIgc2VsZWN0ZWQgYXMgU0RBREN4IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NEQURDU1lTQ0xLX0RJVjE0IFNZU0NMSyBjbG9jayBkaXZpZGVkIGJ5IDE0IHNlbGVjdGVkIGFzIFNEQURDeCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TREFEQ1NZU0NMS19ESVYxNiBTWVNDTEsgY2xvY2sgZGl2aWRlZCBieSAxNiBzZWxlY3RlZCBhcyBTREFEQ3ggY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU0RBRENTWVNDTEtfRElWMjAgU1lTQ0xLIGNsb2NrIGRpdmlkZWQgYnkgMjAgc2VsZWN0ZWQgYXMgU0RBREN4IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NEQURDU1lTQ0xLX0RJVjI0IFNZU0NMSyBjbG9jayBkaXZpZGVkIGJ5IDI0IHNlbGVjdGVkIGFzIFNEQURDeCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TREFEQ1NZU0NMS19ESVYyOCBTWVNDTEsgY2xvY2sgZGl2aWRlZCBieSAyOCBzZWxlY3RlZCBhcyBTREFEQ3ggY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU0RBRENTWVNDTEtfRElWMzIgU1lTQ0xLIGNsb2NrIGRpdmlkZWQgYnkgMzIgc2VsZWN0ZWQgYXMgU0RBREN4IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NEQURDU1lTQ0xLX0RJVjM2IFNZU0NMSyBjbG9jayBkaXZpZGVkIGJ5IDM2IHNlbGVjdGVkIGFzIFNEQURDeCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TREFEQ1NZU0NMS19ESVY0MCBTWVNDTEsgY2xvY2sgZGl2aWRlZCBieSA0MCBzZWxlY3RlZCBhcyBTREFEQ3ggY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU0RBRENTWVNDTEtfRElWNDQgU1lTQ0xLIGNsb2NrIGRpdmlkZWQgYnkgNDQgc2VsZWN0ZWQgYXMgU0RBREN4IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NEQURDU1lTQ0xLX0RJVjQ4IFNZU0NMSyBjbG9jayBkaXZpZGVkIGJ5IDQ4IHNlbGVjdGVkIGFzIFNEQURDeCBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX1NEQURDX1NPVVJDRSgpICgodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfU0RQUkUpKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfQ0VDeF9DbG9ja19Db25maWcgUkNDIEV4dGVuZGVkIENFQ3ggQ2xvY2sgQ29uZmlnCisgICogQHsgICAKKyAgKi8gCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIENFQyBjbG9jay4KKyAgKiBAcGFyYW0gIF9fQ0VDQ0xLU291cmNlX18gc3BlY2lmaWVzIHRoZSBDRUMgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ0VDQ0xLU09VUkNFX0hTSSBIU0kgc2VsZWN0ZWQgYXMgQ0VDIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NFQ0NMS1NPVVJDRV9MU0UgTFNFIHNlbGVjdGVkIGFzIENFQyBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfQ0VDX0NPTkZJRyhfX0NFQ0NMS1NvdXJjZV9fKSBcCisgICAgICAgICAgICAgICAgICBNT0RJRllfUkVHKFJDQy0+Q0ZHUjMsIFJDQ19DRkdSM19DRUNTVywgKHVpbnQzMl90KShfX0NFQ0NMS1NvdXJjZV9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBIRE1JIENFQyBjbG9jayBzb3VyY2UuCisgICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NFQ0NMS1NPVVJDRV9IU0kgSFNJIHNlbGVjdGVkIGFzIENFQyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DRUNDTEtTT1VSQ0VfTFNFIExTRSBzZWxlY3RlZCBhcyBDRUMgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9DRUNfU09VUkNFKCkgKCh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DRkdSMywgUkNDX0NGR1IzX0NFQ1NXKSkpCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpXAorICB8fCBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKVwKKyAgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQoU1RNMzJGMzczeEMpCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfVVNCeF9DbG9ja19Db25maWcgUkNDIEV4dGVuZGVkIFVTQnggQ2xvY2sgQ29uZmlnCisgICogQHsgICAKKyAgKi8gCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIFVTQiBjbG9jayAoVVNCQ0xLKS4KKyAgKiBAcGFyYW0gIF9fVVNCQ0xLU291cmNlX18gc3BlY2lmaWVzIHRoZSBVU0IgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNCQ0xLU09VUkNFX1BMTCAgUExMIENsb2NrIGRpdmlkZWQgYnkgMSBzZWxlY3RlZCBhcyBVU0IgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNCQ0xLU09VUkNFX1BMTF9ESVYxXzUgUExMIENsb2NrIGRpdmlkZWQgYnkgMS41IHNlbGVjdGVkIGFzIFVTQiBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfVVNCX0NPTkZJRyhfX1VTQkNMS1NvdXJjZV9fKSBcCisgICAgICAgICAgICAgICAgICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfVVNCUFJFLCAodWludDMyX3QpKF9fVVNCQ0xLU291cmNlX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIFVTQiBjbG9jayBzb3VyY2UuCisgICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQkNMS1NPVVJDRV9QTEwgIFBMTCBDbG9jayBkaXZpZGVkIGJ5IDEgc2VsZWN0ZWQgYXMgVVNCIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQkNMS1NPVVJDRV9QTExfRElWMV81IFBMTCBDbG9jayBkaXZpZGVkIGJ5IDEuNSBzZWxlY3RlZCBhcyBVU0IgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9VU0JfU09VUkNFKCkgKCh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9VU0JQUkUpKSkKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeDggICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzNzN4QyAgICAgICAgICAgICAgICAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkKKworLyoqIEBkZWZncm91cCBSQ0NFeF9JMkN4X0Nsb2NrX0NvbmZpZyBSQ0MgRXh0ZW5kZWQgSTJDeCBDbG9jayBDb25maWcKKyAgKiBAeyAgIAorICAqLyAKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgSTJDMyBjbG9jayAoSTJDM0NMSykuCisgICogQHBhcmFtICBfX0kyQzNDTEtTb3VyY2VfXyBzcGVjaWZpZXMgdGhlIEkyQzMgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDM0NMS1NPVVJDRV9IU0kgSFNJIHNlbGVjdGVkIGFzIEkyQzMgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDM0NMS1NPVVJDRV9TWVNDTEsgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzIEkyQzMgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0kyQzNfQ09ORklHKF9fSTJDM0NMS1NvdXJjZV9fKSBcCisgICAgICAgICAgICAgICAgICBNT0RJRllfUkVHKFJDQy0+Q0ZHUjMsIFJDQ19DRkdSM19JMkMzU1csICh1aW50MzJfdCkoX19JMkMzQ0xLU291cmNlX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIEkyQzMgY2xvY2sgc291cmNlLgorICAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkMzQ0xLU09VUkNFX0hTSSBIU0kgc2VsZWN0ZWQgYXMgSTJDMyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkMzQ0xLU09VUkNFX1NZU0NMSyBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgSTJDMyBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX0kyQzNfU09VUkNFKCkgKCh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DRkdSMywgUkNDX0NGR1IzX0kyQzNTVykpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9USU14X0Nsb2NrX0NvbmZpZyBSQ0MgRXh0ZW5kZWQgVElNeCBDbG9jayBDb25maWcKKyAgKiBAeyAgIAorICAqLyAKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgVElNMiBjbG9jayAoVElNMkNMSykuCisgICogQHBhcmFtICBfX1RJTTJDTEtTb3VyY2VfXyBzcGVjaWZpZXMgdGhlIFRJTTIgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVElNMkNMS19IQ0xLIEhDTEsgc2VsZWN0ZWQgYXMgVElNMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19USU0yQ0xLX1BMTCBQTEwgQ2xvY2sgc2VsZWN0ZWQgYXMgVElNMiBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfVElNMl9DT05GSUcoX19USU0yQ0xLU291cmNlX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSMywgUkNDX0NGR1IzX1RJTTJTVywgKHVpbnQzMl90KShfX1RJTTJDTEtTb3VyY2VfXykpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgVElNMiBjbG9jayAoVElNMkNMSykuCisgICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1RJTTJDTEtfSENMSyBIQ0xLIHNlbGVjdGVkIGFzIFRJTTIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVElNMkNMS19QTEwgUExMIENsb2NrIHNlbGVjdGVkIGFzIFRJTTIgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9USU0yX1NPVVJDRSgpICgodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUjMsIFJDQ19DRkdSM19USU0yU1cpKSkKKyAgICAgICAgICAgICAgICAgICAgCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIFRJTTMgJiBUSU00IGNsb2NrIChUSU0zNENMSykuCisgICogQHBhcmFtICBfX1RJTTM0Q0xLU291cmNlX18gc3BlY2lmaWVzIHRoZSBUSU0zICYgVElNNCBjbG9jayBzb3VyY2UuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19USU0zNENMS19IQ0xLIEhDTEsgc2VsZWN0ZWQgYXMgVElNMyAmIFRJTTQgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVElNMzRDTEtfUExMIFBMTCBDbG9jayBzZWxlY3RlZCBhcyBUSU0zICYgVElNNCBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfVElNMzRfQ09ORklHKF9fVElNMzRDTEtTb3VyY2VfXykgXAorICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IzLCBSQ0NfQ0ZHUjNfVElNMzRTVywgKHVpbnQzMl90KShfX1RJTTM0Q0xLU291cmNlX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIFRJTTMgJiBUSU00IGNsb2NrIChUSU0zNENMSykuCisgICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1RJTTM0Q0xLX0hDTEsgSENMSyBzZWxlY3RlZCBhcyBUSU0zICYgVElNNCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19USU0zNENMS19QTEwgUExMIENsb2NrIHNlbGVjdGVkIGFzIFRJTTMgJiBUSU00IGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfVElNMzRfU09VUkNFKCkgKCh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DRkdSMywgUkNDX0NGR1IzX1RJTTM0U1cpKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBUSU0xNSBjbG9jayAoVElNMTVDTEspLgorICAqIEBwYXJhbSAgX19USU0xNUNMS1NvdXJjZV9fIHNwZWNpZmllcyB0aGUgVElNMTUgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVElNMTVDTEtfSENMSyBIQ0xLIHNlbGVjdGVkIGFzIFRJTTE1IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1RJTTE1Q0xLX1BMTCBQTEwgQ2xvY2sgc2VsZWN0ZWQgYXMgVElNMTUgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE1X0NPTkZJRyhfX1RJTTE1Q0xLU291cmNlX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSMywgUkNDX0NGR1IzX1RJTTE1U1csICh1aW50MzJfdCkoX19USU0xNUNMS1NvdXJjZV9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBUSU0xNSBjbG9jayAoVElNMTVDTEspLgorICAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19USU0xNUNMS19IQ0xLIEhDTEsgc2VsZWN0ZWQgYXMgVElNMTUgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVElNMTVDTEtfUExMIFBMTCBDbG9jayBzZWxlY3RlZCBhcyBUSU0xNSBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX1RJTTE1X1NPVVJDRSgpICgodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUjMsIFJDQ19DRkdSM19USU0xNVNXKSkpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgVElNMTYgY2xvY2sgKFRJTTE2Q0xLKS4KKyAgKiBAcGFyYW0gIF9fVElNMTZDTEtTb3VyY2VfXyBzcGVjaWZpZXMgdGhlIFRJTTE2IGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1RJTTE2Q0xLX0hDTEsgSENMSyBzZWxlY3RlZCBhcyBUSU0xNiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19USU0xNkNMS19QTEwgUExMIENsb2NrIHNlbGVjdGVkIGFzIFRJTTE2IGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xNl9DT05GSUcoX19USU0xNkNMS1NvdXJjZV9fKSBcCisgICAgICAgICAgICAgICAgICBNT0RJRllfUkVHKFJDQy0+Q0ZHUjMsIFJDQ19DRkdSM19USU0xNlNXLCAodWludDMyX3QpKF9fVElNMTZDTEtTb3VyY2VfXykpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgVElNMTYgY2xvY2sgKFRJTTE2Q0xLKS4KKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVElNMTZDTEtfSENMSyBIQ0xLIHNlbGVjdGVkIGFzIFRJTTE2IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1RJTTE2Q0xLX1BMTCBQTEwgQ2xvY2sgc2VsZWN0ZWQgYXMgVElNMTYgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9USU0xNl9TT1VSQ0UoKSAoKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNGR1IzLCBSQ0NfQ0ZHUjNfVElNMTZTVykpKQorIAorLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBUSU0xNyBjbG9jayAoVElNMTdDTEspLgorICAqIEBwYXJhbSAgX19USU0xN0NMS1NvdXJjZV9fIHNwZWNpZmllcyB0aGUgVElNMTcgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVElNMTdDTEtfSENMSyBIQ0xLIHNlbGVjdGVkIGFzIFRJTTE3IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1RJTTE3Q0xLX1BMTCBQTEwgQ2xvY2sgc2VsZWN0ZWQgYXMgVElNMTcgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE3X0NPTkZJRyhfX1RJTTE3Q0xLU291cmNlX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSMywgUkNDX0NGR1IzX1RJTTE3U1csICh1aW50MzJfdCkoX19USU0xN0NMS1NvdXJjZV9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBUSU0xNyBjbG9jayAoVElNMTdDTEspLgorICAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19USU0xN0NMS19IQ0xLIEhDTEsgc2VsZWN0ZWQgYXMgVElNMTcgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVElNMTdDTEtfUExMIFBMTCBDbG9jayBzZWxlY3RlZCBhcyBUSU0xNyBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX1RJTTE3X1NPVVJDRSgpICgodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUjMsIFJDQ19DRkdSM19USU0xN1NXKSkpCisgICAgICAgICAgICAgICAgICAgIAorLyoqCisgICogQH0KKyAgKi8KKyAgICAgICAgICAgICAgICAgICAKKyNlbmRpZiAvKiBTVE0zMmYzMDJ4RSB8fCBTVE0zMmYzMDN4RSB8fCBTVE0zMkYzOTh4eCAqLworICAgICAgICAgICAgICAgICAgICAKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KQorLyoqIEBhZGR0b2dyb3VwIFJDQ0V4X1RJTXhfQ2xvY2tfQ29uZmlnIFJDQyBFeHRlbmRlZCBUSU14IENsb2NrIENvbmZpZyAKKyAgKiBAeworICAqLworLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBUSU0yMCBjbG9jayAoVElNMjBDTEspLgorICAqIEBwYXJhbSAgX19USU0yMENMS1NvdXJjZV9fIHNwZWNpZmllcyB0aGUgVElNMjAgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVElNMjBDTEtfSENMSyBIQ0xLIHNlbGVjdGVkIGFzIFRJTTIwIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1RJTTIwQ0xLX1BMTCBQTEwgQ2xvY2sgc2VsZWN0ZWQgYXMgVElNMjAgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1RJTTIwX0NPTkZJRyhfX1RJTTIwQ0xLU291cmNlX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSMywgUkNDX0NGR1IzX1RJTTIwU1csICh1aW50MzJfdCkoX19USU0yMENMS1NvdXJjZV9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBUSU0yMCBjbG9jayAoVElNMjBDTEspLgorICAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19USU0yMENMS19IQ0xLIEhDTEsgc2VsZWN0ZWQgYXMgVElNMjAgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVElNMjBDTEtfUExMIFBMTCBDbG9jayBzZWxlY3RlZCBhcyBUSU0yMCBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX1RJTTIwX1NPVVJDRSgpICgodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUjMsIFJDQ19DRkdSM19USU0yMFNXKSkpCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogU1RNMzJmMzAzeEUgfHwgU1RNMzJGMzk4eHggKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9MU0VfQ29uZmlndXJhdGlvbiBMU0UgRHJpdmUgQ29uZmlndXJhdGlvbgorICAqIEB7ICAgCisgICovCisKKy8qKgorICAqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBFeHRlcm5hbCBMb3cgU3BlZWQgb3NjaWxsYXRvciAoTFNFKSBkcml2ZSBjYXBhYmlsaXR5LgorICAqIEBwYXJhbSAgX19SQ0NfTFNFRFJJVkVfXyBzcGVjaWZpZXMgdGhlIG5ldyBzdGF0ZSBvZiB0aGUgTFNFIGRyaXZlIGNhcGFiaWxpdHkuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFNFRFJJVkVfTE9XICAgICAgICBMU0Ugb3NjaWxsYXRvciBsb3cgZHJpdmUgY2FwYWJpbGl0eS4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFNFRFJJVkVfTUVESVVNTE9XICBMU0Ugb3NjaWxsYXRvciBtZWRpdW0gbG93IGRyaXZlIGNhcGFiaWxpdHkuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xTRURSSVZFX01FRElVTUhJR0ggTFNFIG9zY2lsbGF0b3IgbWVkaXVtIGhpZ2ggZHJpdmUgY2FwYWJpbGl0eS4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFNFRFJJVkVfSElHSCAgICAgICBMU0Ugb3NjaWxsYXRvciBoaWdoIGRyaXZlIGNhcGFiaWxpdHkuCisgICogQHJldHZhbCBOb25lCisgICovIAorI2RlZmluZSBfX0hBTF9SQ0NfTFNFRFJJVkVfQ09ORklHKF9fUkNDX0xTRURSSVZFX18pIChNT0RJRllfUkVHKFJDQy0+QkRDUixcCisgICAgICAgIFJDQ19CRENSX0xTRURSViwgKHVpbnQzMl90KShfX1JDQ19MU0VEUklWRV9fKSApKQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFJDQ0V4X0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBSQ0NFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgICogQHsKKyAgKi8KKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZyhSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWYgICpQZXJpcGhDbGtJbml0KTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SQ0NFeF9HZXRQZXJpcGhDTEtDb25maWcoUkNDX1BlcmlwaENMS0luaXRUeXBlRGVmICAqUGVyaXBoQ2xrSW5pdCk7Cit1aW50MzJfdCAgICAgICAgICBIQUxfUkNDRXhfR2V0UGVyaXBoQ0xLRnJlcSh1aW50MzJfdCBQZXJpcGhDbGspOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkYzeHhfSEFMX1JDQ19FWF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCisKZGlmZiAtLWdpdCBhL0luYy9zdG0zMmYzeHhfaGFsX3J0Yy5oIGIvSW5jL3N0bTMyZjN4eF9oYWxfcnRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkwOWU5NAotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmYzeHhfaGFsX3J0Yy5oCkBAIC0wLDAgKzEsODQyIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2hhbF9ydGMuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgUlRDIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0hBTF9SVENfSAorI2RlZmluZSBfX1NUTTMyRjN4eF9IQUxfUlRDX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJUQyBSVEMKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKy8qKiBAZGVmZ3JvdXAgUlRDX0V4cG9ydGVkX1R5cGVzIFJUQyBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKiAKKyAgKiBAYnJpZWYgIEhBTCBTdGF0ZSBzdHJ1Y3R1cmVzIGRlZmluaXRpb24gIAorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9SVENfU1RBVEVfUkVTRVQgICAgICAgICAgICAgPSAweDAwVSwgIC8qITwgUlRDIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgb3IgZGlzYWJsZWQgKi8KKyAgSEFMX1JUQ19TVEFURV9SRUFEWSAgICAgICAgICAgICA9IDB4MDFVLCAgLyohPCBSVEMgaW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UgICAqLworICBIQUxfUlRDX1NUQVRFX0JVU1kgICAgICAgICAgICAgID0gMHgwMlUsICAvKiE8IFJUQyBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICAgICovCisgIEhBTF9SVENfU1RBVEVfVElNRU9VVCAgICAgICAgICAgPSAweDAzVSwgIC8qITwgUlRDIHRpbWVvdXQgc3RhdGUgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1JUQ19TVEFURV9FUlJPUiAgICAgICAgICAgICA9IDB4MDRVICAgLyohPCBSVEMgZXJyb3Igc3RhdGUgICAgICAgICAgICAgICAgICAgICAqLworCit9SEFMX1JUQ1N0YXRlVHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiAgUlRDIENvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IEhvdXJGb3JtYXQ7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBIb3VyIEZvcm1hdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDX0hvdXJfRm9ybWF0cyAqLworCisgIHVpbnQzMl90IEFzeW5jaFByZWRpdjsgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBBc3luY2hyb25vdXMgUHJlZGl2aWRlciB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHg3RiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB1aW50MzJfdCBTeW5jaFByZWRpdjsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgU3luY2hyb25vdXMgUHJlZGl2aWRlciB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHg3RkZGICovCisKKyAgdWludDMyX3QgT3V0UHV0OyAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGljaCBzaWduYWwgd2lsbCBiZSByb3V0ZWQgdG8gdGhlIFJUQyBvdXRwdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ0V4X091dHB1dF9zZWxlY3Rpb25fRGVmaW5pdGlvbnMgKi8KKworICB1aW50MzJfdCBPdXRQdXRQb2xhcml0eTsgIC8qITwgU3BlY2lmaWVzIHRoZSBwb2xhcml0eSBvZiB0aGUgb3V0cHV0IHNpZ25hbC4gIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENfT3V0cHV0X1BvbGFyaXR5X0RlZmluaXRpb25zICovCisKKyAgdWludDMyX3QgT3V0UHV0VHlwZTsgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIE91dHB1dCBQaW4gbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDX091dHB1dF9UeXBlX0FMQVJNX09VVCAqLworfVJUQ19Jbml0VHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiAgUlRDIFRpbWUgc3RydWN0dXJlIGRlZmluaXRpb24gIAorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDhfdCBIb3VyczsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIFRpbWUgSG91ci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMTIgaWYgdGhlIFJUQ19Ib3VyRm9ybWF0XzEyIGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAyMyBpZiB0aGUgUlRDX0hvdXJGb3JtYXRfMjQgaXMgc2VsZWN0ZWQgKi8KKworICB1aW50OF90IE1pbnV0ZXM7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgVGltZSBNaW51dGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSA1OSAqLworCisgIHVpbnQ4X3QgU2Vjb25kczsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBUaW1lIFNlY29uZHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDU5ICovCisKKyAgdWludDhfdCBUaW1lRm9ybWF0OyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIEFNL1BNIFRpbWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19BTV9QTV9EZWZpbml0aW9ucyAqLworCisgIHVpbnQzMl90IFN1YlNlY29uZHM7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDX1NTUiBSVEMgU3ViIFNlY29uZCByZWdpc3RlciBjb250ZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY29ycmVzcG9uZHMgdG8gYSB0aW1lIHVuaXQgcmFuZ2UgYmV0d2VlbiBbMC0xXSBTZWNvbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggWzEgU2VjIC8gU2Vjb25kRnJhY3Rpb24gKzFdIGdyYW51bGFyaXR5ICovCisgCisgIHVpbnQzMl90IFNlY29uZEZyYWN0aW9uOyAgLyohPCBTcGVjaWZpZXMgdGhlIHJhbmdlIG9yIGdyYW51bGFyaXR5IG9mIFN1YiBTZWNvbmQgcmVnaXN0ZXIgY29udGVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyB0byBTeW5jaHJvbm91cyBwcmUtc2NhbGVyIGZhY3RvciB2YWx1ZSAoUFJFRElWX1MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjb3JyZXNwb25kcyB0byBhIHRpbWUgdW5pdCByYW5nZSBiZXR3ZWVuIFswLTFdIFNlY29uZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBbMSBTZWMgLyBTZWNvbmRGcmFjdGlvbiArMV0gZ3JhbnVsYXJpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZpZWxkIHdpbGwgYmUgdXNlZCBvbmx5IGJ5IEhBTF9SVENfR2V0VGltZSBmdW5jdGlvbiAqLworICAKKyAgdWludDMyX3QgRGF5TGlnaHRTYXZpbmc7ICAvKiE8IFNwZWNpZmllcyBSVENfRGF5TGlnaHRTYXZlT3BlcmF0aW9uOiB0aGUgdmFsdWUgb2YgaG91ciBhZGp1c3RtZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENfRGF5TGlnaHRTYXZpbmdfRGVmaW5pdGlvbnMgKi8KKworICB1aW50MzJfdCBTdG9yZU9wZXJhdGlvbjsgIC8qITwgU3BlY2lmaWVzIFJUQ19TdG9yZU9wZXJhdGlvbiB2YWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSBCQ0sgYml0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQ1IgcmVnaXN0ZXIgdG8gc3RvcmUgdGhlIG9wZXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDX1N0b3JlT3BlcmF0aW9uX0RlZmluaXRpb25zICovCit9UlRDX1RpbWVUeXBlRGVmOworCisvKiogCisgICogQGJyaWVmICBSVEMgRGF0ZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDhfdCBXZWVrRGF5OyAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBEYXRlIFdlZWtEYXkuCisgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENfV2Vla0RheV9EZWZpbml0aW9ucyAqLworCisgIHVpbnQ4X3QgTW9udGg7ICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgRGF0ZSBNb250aCAoaW4gQkNEIGZvcm1hdCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENfTW9udGhfRGF0ZV9EZWZpbml0aW9ucyAqLworCisgIHVpbnQ4X3QgRGF0ZTsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgRGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAxIGFuZCBNYXhfRGF0YSA9IDMxICovCisKKyAgdWludDhfdCBZZWFyOyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBEYXRlIFllYXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSA5OSAqLworCit9UlRDX0RhdGVUeXBlRGVmOworCisvKiogCisgICogQGJyaWVmICBSVEMgQWxhcm0gc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIFJUQ19UaW1lVHlwZURlZiBBbGFybVRpbWU7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIEFsYXJtIFRpbWUgbWVtYmVycyAqLworCisgIHVpbnQzMl90IEFsYXJtTWFzazsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIEFsYXJtIE1hc2tzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19BbGFybU1hc2tfRGVmaW5pdGlvbnMgKi8KKyAgCisgIHVpbnQzMl90IEFsYXJtU3ViU2Vjb25kTWFzazsgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIEFsYXJtIFN1YlNlY29uZHMgTWFza3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDX0FsYXJtX1N1Yl9TZWNvbmRzX01hc2tzX0RlZmluaXRpb25zICovCisKKyAgdWludDMyX3QgQWxhcm1EYXRlV2Vla0RheVNlbDsgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgQWxhcm0gaXMgb24gRGF0ZSBvciBXZWVrRGF5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19BbGFybURhdGVXZWVrRGF5X0RlZmluaXRpb25zICovCisKKyAgdWludDhfdCBBbGFybURhdGVXZWVrRGF5OyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgQWxhcm0gRGF0ZS9XZWVrRGF5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgQWxhcm0gRGF0ZSBpcyBzZWxlY3RlZCwgdGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBzZXQgdG8gYSB2YWx1ZSBpbiB0aGUgMS0zMSByYW5nZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIEFsYXJtIFdlZWtEYXkgaXMgc2VsZWN0ZWQsIHRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDX1dlZWtEYXlfRGVmaW5pdGlvbnMgKi8KKworICB1aW50MzJfdCBBbGFybTsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGFsYXJtIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENfQWxhcm1zX0RlZmluaXRpb25zICovCit9UlRDX0FsYXJtVHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiAgUlRDIEhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgUlRDX1R5cGVEZWYgICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAgICAqLworCisgIFJUQ19Jbml0VHlwZURlZiAgICAgICAgICAgSW5pdDsgICAgICAgLyohPCBSVEMgcmVxdWlyZWQgcGFyYW1ldGVycyAgKi8KKworICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICAgIExvY2s7ICAgICAgIC8qITwgUlRDIGxvY2tpbmcgb2JqZWN0ICAgICAgICovCisKKyAgX19JTyBIQUxfUlRDU3RhdGVUeXBlRGVmICBTdGF0ZTsgICAgICAvKiE8IFRpbWUgY29tbXVuaWNhdGlvbiBzdGF0ZSAqLworCit9UlRDX0hhbmRsZVR5cGVEZWY7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSVENfRXhwb3J0ZWRfQ29uc3RhbnRzIFJUQyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworICAKKy8qKiBAZGVmZ3JvdXAgUlRDX0hvdXJfRm9ybWF0cyBSVEMgSG91ciBGb3JtYXRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX0hPVVJGT1JNQVRfMjQgICAgICAgICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIFJUQ19IT1VSRk9STUFUXzEyICAgICAgICAgICAgICBSVENfQ1JfRk1UCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19PdXRwdXRfUG9sYXJpdHlfRGVmaW5pdGlvbnMgUlRDIE91dHB1dCBQb2xhcml0eSBEZWZpbml0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19PVVRQVVRfUE9MQVJJVFlfSElHSCAgICAgICAweDAwMDAwMDAwVQorI2RlZmluZSBSVENfT1VUUFVUX1BPTEFSSVRZX0xPVyAgICAgICAgUlRDX0NSX1BPTAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfT3V0cHV0X1R5cGVfQUxBUk1fT1VUIFJUQyBPdXRwdXQgVHlwZSBBTEFSTSBPVVQKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfT1VUUFVUX1RZUEVfT1BFTkRSQUlOICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgUlRDX09VVFBVVF9UWVBFX1BVU0hQVUxMICAgICAgIFJUQ19UQUZDUl9BTEFSTU9VVFRZUEUKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0FNX1BNX0RlZmluaXRpb25zIFJUQyBBTSBQTSBEZWZpbml0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19IT1VSRk9STUFUMTJfQU0gICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMCkKKyNkZWZpbmUgUlRDX0hPVVJGT1JNQVQxMl9QTSAgICAgICAgICAgICgodWludDhfdCkweDQwKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfRGF5TGlnaHRTYXZpbmdfRGVmaW5pdGlvbnMgUlRDIERheUxpZ2h0U2F2aW5nIERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX0RBWUxJR0hUU0FWSU5HX05PTkUgICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIFJUQ19EQVlMSUdIVFNBVklOR19TVUIxSCAgICAgICBSVENfQ1JfU1VCMUgKKyNkZWZpbmUgUlRDX0RBWUxJR0hUU0FWSU5HX0FERDFIICAgICAgIFJUQ19DUl9BREQxSAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfU3RvcmVPcGVyYXRpb25fRGVmaW5pdGlvbnMgUlRDIFN0b3JlT3BlcmF0aW9uIERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX1NUT1JFT1BFUkFUSU9OX1JFU0VUICAgICAgICAweDAwMDAwMDAwVQorI2RlZmluZSBSVENfU1RPUkVPUEVSQVRJT05fU0VUICAgICAgICAgIFJUQ19DUl9CQ0sKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0lucHV0X3BhcmFtZXRlcl9mb3JtYXRfZGVmaW5pdGlvbnMgUlRDIElucHV0IHBhcmFtZXRlciBmb3JtYXQgZGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfRk9STUFUX0JJTiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMFUKKyNkZWZpbmUgUlRDX0ZPUk1BVF9CQ0QgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDFVCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19Nb250aF9EYXRlX0RlZmluaXRpb25zIFJUQyBNb250aCBEYXRlIERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKy8qIENvZGVkIGluIEJDRCBmb3JtYXQgKi8KKyNkZWZpbmUgUlRDX01PTlRIX0pBTlVBUlkgICAgICAgICAgICAgICgodWludDhfdCkweDAxKQorI2RlZmluZSBSVENfTU9OVEhfRkVCUlVBUlkgICAgICAgICAgICAgKCh1aW50OF90KTB4MDIpCisjZGVmaW5lIFJUQ19NT05USF9NQVJDSCAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMykKKyNkZWZpbmUgUlRDX01PTlRIX0FQUklMICAgICAgICAgICAgICAgICgodWludDhfdCkweDA0KQorI2RlZmluZSBSVENfTU9OVEhfTUFZICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDUpCisjZGVmaW5lIFJUQ19NT05USF9KVU5FICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNikKKyNkZWZpbmUgUlRDX01PTlRIX0pVTFkgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA3KQorI2RlZmluZSBSVENfTU9OVEhfQVVHVVNUICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDgpCisjZGVmaW5lIFJUQ19NT05USF9TRVBURU1CRVIgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwOSkKKyNkZWZpbmUgUlRDX01PTlRIX09DVE9CRVIgICAgICAgICAgICAgICgodWludDhfdCkweDEwKQorI2RlZmluZSBSVENfTU9OVEhfTk9WRU1CRVIgICAgICAgICAgICAgKCh1aW50OF90KTB4MTEpCisjZGVmaW5lIFJUQ19NT05USF9ERUNFTUJFUiAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgxMikKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX1dlZWtEYXlfRGVmaW5pdGlvbnMgUlRDIFdlZWtEYXkgRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfV0VFS0RBWV9NT05EQVkgICAgICAgICAgICAgKCh1aW50OF90KTB4MDEpCisjZGVmaW5lIFJUQ19XRUVLREFZX1RVRVNEQVkgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMikKKyNkZWZpbmUgUlRDX1dFRUtEQVlfV0VETkVTREFZICAgICAgICAgICgodWludDhfdCkweDAzKQorI2RlZmluZSBSVENfV0VFS0RBWV9USFVSU0RBWSAgICAgICAgICAgKCh1aW50OF90KTB4MDQpCisjZGVmaW5lIFJUQ19XRUVLREFZX0ZSSURBWSAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNSkKKyNkZWZpbmUgUlRDX1dFRUtEQVlfU0FUVVJEQVkgICAgICAgICAgICgodWludDhfdCkweDA2KQorI2RlZmluZSBSVENfV0VFS0RBWV9TVU5EQVkgICAgICAgICAgICAgKCh1aW50OF90KTB4MDcpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19BbGFybURhdGVXZWVrRGF5X0RlZmluaXRpb25zIFJUQyBBbGFybURhdGVXZWVrRGF5IERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNREFURVdFRUtEQVlTRUxfREFURSAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIFJUQ19BTEFSTURBVEVXRUVLREFZU0VMX1dFRUtEQVkgICBSVENfQUxSTUFSX1dEU0VMCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19BbGFybU1hc2tfRGVmaW5pdGlvbnMgUlRDIEFsYXJtTWFzayBEZWZpbml0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19BTEFSTU1BU0tfTk9ORSAgICAgICAgICAgICAgICAweDAwMDAwMDAwVQorI2RlZmluZSBSVENfQUxBUk1NQVNLX0RBVEVXRUVLREFZICAgICAgICAgUlRDX0FMUk1BUl9NU0s0CisjZGVmaW5lIFJUQ19BTEFSTU1BU0tfSE9VUlMgICAgICAgICAgICAgICBSVENfQUxSTUFSX01TSzMKKyNkZWZpbmUgUlRDX0FMQVJNTUFTS19NSU5VVEVTICAgICAgICAgICAgIFJUQ19BTFJNQVJfTVNLMgorI2RlZmluZSBSVENfQUxBUk1NQVNLX1NFQ09ORFMgICAgICAgICAgICAgUlRDX0FMUk1BUl9NU0sxCisjZGVmaW5lIFJUQ19BTEFSTU1BU0tfQUxMICAgICAgICAgICAgICAgICAoUlRDX0FMQVJNTUFTS19OT05FICAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfQUxBUk1NQVNLX0RBVEVXRUVLREFZIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19BTEFSTU1BU0tfSE9VUlMgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX0FMQVJNTUFTS19NSU5VVEVTICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfQUxBUk1NQVNLX1NFQ09ORFMpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19BbGFybXNfRGVmaW5pdGlvbnMgUlRDIEFsYXJtcyBEZWZpbml0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19BTEFSTV9BICAgICAgICAgICAgICAgICAgICAgICBSVENfQ1JfQUxSQUUKKyNkZWZpbmUgUlRDX0FMQVJNX0IgICAgICAgICAgICAgICAgICAgICAgIFJUQ19DUl9BTFJCRQorLyoqCisgICogQH0KKyAgKi8KKworICAvKiogQGRlZmdyb3VwIFJUQ19BbGFybV9TdWJfU2Vjb25kc19NYXNrc19EZWZpbml0aW9ucyBSVEMgQWxhcm0gU3ViIFNlY29uZHMgTWFza3MgRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX0FMTCAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgLyohPCBBbGwgQWxhcm0gU1MgZmllbGRzIGFyZSBtYXNrZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVyZSBpcyBubyBjb21wYXJpc29uIG9uIHN1YiBzZWNvbmRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgQWxhcm0gKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzEgICAgICBSVENfQUxSTUFTU1JfTUFTS1NTXzAgIC8qITwgU1NbMTQ6MV0gYXJlIGlnbm9yZWQgaW4gQWxhcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmlzb24uIE9ubHkgU1NbMF0gaXMgY29tcGFyZWQuICAgICovCisjZGVmaW5lIFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF8yICAgICAgUlRDX0FMUk1BU1NSX01BU0tTU18xICAvKiE8IFNTWzE0OjJdIGFyZSBpZ25vcmVkIGluIEFsYXJtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uLiBPbmx5IFNTWzE6MF0gYXJlIGNvbXBhcmVkICAqLworI2RlZmluZSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfMyAgICAgIChSVENfQUxSTUFTU1JfTUFTS1NTXzAgfCBSVENfQUxSTUFTU1JfTUFTS1NTXzEpICAvKiE8IFNTWzE0OjNdIGFyZSBpZ25vcmVkIGluIEFsYXJtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uLiBPbmx5IFNTWzI6MF0gYXJlIGNvbXBhcmVkICAqLworI2RlZmluZSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfNCAgICAgIFJUQ19BTFJNQVNTUl9NQVNLU1NfMiAgLyohPCBTU1sxNDo0XSBhcmUgaWdub3JlZCBpbiBBbGFybQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbi4gT25seSBTU1szOjBdIGFyZSBjb21wYXJlZCAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzUgICAgICAoUlRDX0FMUk1BU1NSX01BU0tTU18wIHwgUlRDX0FMUk1BU1NSX01BU0tTU18yKSAgLyohPCBTU1sxNDo1XSBhcmUgaWdub3JlZCBpbiBBbGFybQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbi4gT25seSBTU1s0OjBdIGFyZSBjb21wYXJlZCAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzYgICAgICAoUlRDX0FMUk1BU1NSX01BU0tTU18xIHwgUlRDX0FMUk1BU1NSX01BU0tTU18yKSAgLyohPCBTU1sxNDo2XSBhcmUgaWdub3JlZCBpbiBBbGFybQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbi4gT25seSBTU1s1OjBdIGFyZSBjb21wYXJlZCAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzcgICAgICAoUlRDX0FMUk1BU1NSX01BU0tTU18wIHwgUlRDX0FMUk1BU1NSX01BU0tTU18xIHwgUlRDX0FMUk1BU1NSX01BU0tTU18yKSAgLyohPCBTU1sxNDo3XSBhcmUgaWdub3JlZCBpbiBBbGFybQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbi4gT25seSBTU1s2OjBdIGFyZSBjb21wYXJlZCAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzggICAgICBSVENfQUxSTUFTU1JfTUFTS1NTXzMgIC8qITwgU1NbMTQ6OF0gYXJlIGlnbm9yZWQgaW4gQWxhcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmlzb24uIE9ubHkgU1NbNzowXSBhcmUgY29tcGFyZWQgICovCisjZGVmaW5lIFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF85ICAgICAgKFJUQ19BTFJNQVNTUl9NQVNLU1NfMCB8IFJUQ19BTFJNQVNTUl9NQVNLU1NfMykgIC8qITwgU1NbMTQ6OV0gYXJlIGlnbm9yZWQgaW4gQWxhcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmlzb24uIE9ubHkgU1NbODowXSBhcmUgY29tcGFyZWQgICovCisjZGVmaW5lIFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF8xMCAgICAgKFJUQ19BTFJNQVNTUl9NQVNLU1NfMSB8IFJUQ19BTFJNQVNTUl9NQVNLU1NfMykgIC8qITwgU1NbMTQ6MTBdIGFyZSBpZ25vcmVkIGluIEFsYXJtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uLiBPbmx5IFNTWzk6MF0gYXJlIGNvbXBhcmVkICAqLworI2RlZmluZSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfMTEgICAgIChSVENfQUxSTUFTU1JfTUFTS1NTXzAgfCBSVENfQUxSTUFTU1JfTUFTS1NTXzEgfCBSVENfQUxSTUFTU1JfTUFTS1NTXzMpICAvKiE8IFNTWzE0OjExXSBhcmUgaWdub3JlZCBpbiBBbGFybQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbi4gT25seSBTU1sxMDowXSBhcmUgY29tcGFyZWQgKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzEyICAgICAoUlRDX0FMUk1BU1NSX01BU0tTU18yIHwgUlRDX0FMUk1BU1NSX01BU0tTU18zKSAgLyohPCBTU1sxNDoxMl0gYXJlIGlnbm9yZWQgaW4gQWxhcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmlzb24uT25seSBTU1sxMTowXSBhcmUgY29tcGFyZWQgICovCisjZGVmaW5lIFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF8xMyAgICAgKFJUQ19BTFJNQVNTUl9NQVNLU1NfMCB8IFJUQ19BTFJNQVNTUl9NQVNLU1NfMiB8IFJUQ19BTFJNQVNTUl9NQVNLU1NfMykgIC8qITwgU1NbMTQ6MTNdIGFyZSBpZ25vcmVkIGluIEFsYXJtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uLiBPbmx5IFNTWzEyOjBdIGFyZSBjb21wYXJlZCAqLworI2RlZmluZSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTQgICAgICAgIChSVENfQUxSTUFTU1JfTUFTS1NTXzEgfCBSVENfQUxSTUFTU1JfTUFTS1NTXzIgfCBSVENfQUxSTUFTU1JfTUFTS1NTXzMpICAvKiE8IFNTWzE0XSBpcyBkb24ndCBjYXJlIGluIEFsYXJtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uLk9ubHkgU1NbMTM6MF0gYXJlIGNvbXBhcmVkICAqLworI2RlZmluZSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX05PTkUgICAgICAgIFJUQ19BTFJNQVNTUl9NQVNLU1MgICAgLyohPCBTU1sxNDowXSBhcmUgY29tcGFyZWQgYW5kIG11c3QgbWF0Y2ggCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhY3RpdmF0ZSBhbGFybS4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0ludGVycnVwdHNfRGVmaW5pdGlvbnMgUlRDIEludGVycnVwdHMgRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfSVRfVFMgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX0NSX1RTSUUKKyNkZWZpbmUgUlRDX0lUX1dVVCAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19DUl9XVVRJRQorI2RlZmluZSBSVENfSVRfQUxSQiAgICAgICAgICAgICAgICAgICAgICAgUlRDX0NSX0FMUkJJRQorI2RlZmluZSBSVENfSVRfQUxSQSAgICAgICAgICAgICAgICAgICAgICAgUlRDX0NSX0FMUkFJRQorI2RlZmluZSBSVENfSVRfVEFNUCAgICAgICAgICAgICAgICAgICAgICAgUlRDX1RBRkNSX1RBTVBJRSAgICAgICAvKiBVc2VkIG9ubHkgdG8gRW5hYmxlIHRoZSBUYW1wZXIgSW50ZXJydXB0ICovCisjZGVmaW5lIFJUQ19JVF9UQU1QMSAgICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwVSAgICAgICAgICAgIC8qb25seSBmb3IgUlRDX0lTUiBmbGFnIGNoZWNrKi8KKyNkZWZpbmUgUlRDX0lUX1RBTVAyICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNDAwMDBVICAgICAgICAgICAgLypvbmx5IGZvciBSVENfSVNSIGZsYWcgY2hlY2sqLworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKKyNkZWZpbmUgUlRDX0lUX1RBTVAzICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDBVICAgICAgICAgICAgLypvbmx5IGZvciBSVENfSVNSIGZsYWcgY2hlY2sqLworI2VuZGlmIC8qIFJUQ19UQU1QRVIzX1NVUFBPUlQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0ZsYWdzX0RlZmluaXRpb25zIFJUQyBGbGFncyBEZWZpbml0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19GTEFHX1JFQ0FMUEYgICAgICAgICAgICAgICAgICBSVENfSVNSX1JFQ0FMUEYKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisjZGVmaW5lIFJUQ19GTEFHX1RBTVAzRiAgICAgICAgICAgICAgICAgICBSVENfSVNSX1RBTVAzRgorI2VuZGlmIC8qIFJUQ19UQU1QRVIzX1NVUFBPUlQgKi8KKyNkZWZpbmUgUlRDX0ZMQUdfVEFNUDJGICAgICAgICAgICAgICAgICAgIFJUQ19JU1JfVEFNUDJGCisjZGVmaW5lIFJUQ19GTEFHX1RBTVAxRiAgICAgICAgICAgICAgICAgICBSVENfSVNSX1RBTVAxRgorI2RlZmluZSBSVENfRkxBR19UU09WRiAgICAgICAgICAgICAgICAgICAgUlRDX0lTUl9UU09WRgorI2RlZmluZSBSVENfRkxBR19UU0YgICAgICAgICAgICAgICAgICAgICAgUlRDX0lTUl9UU0YKKyNkZWZpbmUgUlRDX0ZMQUdfV1VURiAgICAgICAgICAgICAgICAgICAgIFJUQ19JU1JfV1VURgorI2RlZmluZSBSVENfRkxBR19BTFJCRiAgICAgICAgICAgICAgICAgICAgUlRDX0lTUl9BTFJCRgorI2RlZmluZSBSVENfRkxBR19BTFJBRiAgICAgICAgICAgICAgICAgICAgUlRDX0lTUl9BTFJBRgorI2RlZmluZSBSVENfRkxBR19JTklURiAgICAgICAgICAgICAgICAgICAgUlRDX0lTUl9JTklURgorI2RlZmluZSBSVENfRkxBR19SU0YgICAgICAgICAgICAgICAgICAgICAgUlRDX0lTUl9SU0YKKyNkZWZpbmUgUlRDX0ZMQUdfSU5JVFMgICAgICAgICAgICAgICAgICAgIFJUQ19JU1JfSU5JVFMKKyNkZWZpbmUgUlRDX0ZMQUdfU0hQRiAgICAgICAgICAgICAgICAgICAgIFJUQ19JU1JfU0hQRgorI2RlZmluZSBSVENfRkxBR19XVVRXRiAgICAgICAgICAgICAgICAgICAgUlRDX0lTUl9XVVRXRgorI2RlZmluZSBSVENfRkxBR19BTFJCV0YgICAgICAgICAgICAgICAgICAgUlRDX0lTUl9BTFJCV0YKKyNkZWZpbmUgUlRDX0ZMQUdfQUxSQVdGICAgICAgICAgICAgICAgICAgIFJUQ19JU1JfQUxSQVdGCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSVENfRXhwb3J0ZWRfTWFjcm9zIFJUQyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmICBSZXNldCBSVEMgaGFuZGxlIHN0YXRlCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFU0VUKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5XUFIgPSAweENBVTsgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5JbnN0YW5jZS0+V1BSID0gMHg1M1U7ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPldQUiA9IDB4RkZVOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFJUQyBBTEFSTUEgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1BX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSAoUlRDX0NSX0FMUkFFKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBSVEMgQUxBUk1BIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0FMQVJNQV9ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgJj0gfihSVENfQ1JfQUxSQUUpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgUlRDIEFMQVJNQiBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTUJfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9IChSVENfQ1JfQUxSQkUpKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFJUQyBBTEFSTUIgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1CX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmPSB+KFJUQ19DUl9BTFJCRSkpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBSVEMgQWxhcm0gaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgUlRDIEFsYXJtIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19JVF9BTFJBOiBBbGFybSBBIGludGVycnVwdAorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0lUX0FMUkI6IEFsYXJtIEIgaW50ZXJydXB0ICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0FMQVJNX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gKF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFJUQyBBbGFybSBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgQWxhcm0gaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFJUQ19JVF9BTFJBOiBBbGFybSBBIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBSVENfSVRfQUxSQjogQWxhcm0gQiBpbnRlcnJ1cHQgIAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1fRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmPSB+KF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBSVEMgQWxhcm0gaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgQWxhcm0gaW50ZXJydXB0IHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgQGFyZyBSVENfSVRfQUxSQTogQWxhcm0gQSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0lUX0FMUkI6IEFsYXJtIEIgaW50ZXJydXB0ICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0FMQVJNX0dFVF9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgKCgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUikmICgoX19JTlRFUlJVUFRfXyk+PiA0VSkpICE9IFJFU0VUKT8gU0VUIDogUkVTRVQpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFJUQyBBbGFybSBpbnRlcnJ1cHQgaGFzIGJlZW4gZW5hYmxlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgQWxhcm0gaW50ZXJydXB0IHNvdXJjZXMgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICBAYXJnIFJUQ19JVF9BTFJBOiBBbGFybSBBIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBSVENfSVRfQUxSQjogQWxhcm0gQiBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0FMQVJNX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUikgJiAoX19JTlRFUlJVUFRfXykpICE9IFJFU0VUKSA/IFNFVCA6IFJFU0VUKQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgc2VsZWN0ZWQgUlRDIEFsYXJtJ3MgZmxhZyBzdGF0dXMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgUlRDIEFsYXJtIEZsYWcgc291cmNlcyB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfQUxSQUYKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfQUxSQkYKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfQUxSQVdGICAgICAKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfQUxSQldGICAgIAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1fR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgICAgICAgICAgICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpICYgKF9fRkxBR19fKSkgIT0gUkVTRVQpPyBTRVQgOiBSRVNFVCkKKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgUlRDIEFsYXJtJ3MgcGVuZGluZyBmbGFncy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBSVEMgQWxhcm0gRmxhZyBzb3VyY2VzIHRvIGNsZWFyLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgQGFyZyBSVENfRkxBR19BTFJBRgorICAqICAgICAgICAgICAgQGFyZyBSVENfRkxBR19BTFJCRiAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0FMQVJNX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUikgPSAofigoX19GTEFHX18pIHwgUlRDX0lTUl9JTklUKSB8ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgJiBSVENfSVNSX0lOSVQpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcnJ1cHQgb24gdGhlIFJUQyBBbGFybSBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0FMQVJNX0VYVElfRU5BQkxFX0lUKCkgICAgICAgICAgICAoRVhUSS0+SU1SIHw9IFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHQgb24gdGhlIFJUQyBBbGFybSBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0FMQVJNX0VYVElfRElTQUJMRV9JVCgpICAgICAgICAgICAoRVhUSS0+SU1SICY9IH4oUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGV2ZW50IG9uIHRoZSBSVEMgQWxhcm0gYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1fRVhUSV9FTkFCTEVfRVZFTlQoKSAgICAgICAgIChFWFRJLT5FTVIgfD0gUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGV2ZW50IG9uIHRoZSBSVEMgQWxhcm0gYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1fRVhUSV9ESVNBQkxFX0VWRU5UKCkgICAgICAgICAoRVhUSS0+RU1SICY9IH4oUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGZhbGxpbmcgZWRnZSB0cmlnZ2VyIG9uIHRoZSBSVEMgQWxhcm0gYXNzb2NpYXRlZCBFeHRpIGxpbmUuICAKKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSAgIChFWFRJLT5GVFNSIHw9IFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBmYWxsaW5nIGVkZ2UgdHJpZ2dlciBvbiB0aGUgUlRDIEFsYXJtIGFzc29jaWF0ZWQgRXh0aSBsaW5lLiAgCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1fRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpICAoRVhUSS0+RlRTUiAmPSB+KFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSByaXNpbmcgZWRnZSB0cmlnZ2VyIG9uIHRoZSBSVEMgQWxhcm0gYXNzb2NpYXRlZCBFeHRpIGxpbmUuICAKKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpICAgIChFWFRJLT5SVFNSIHw9IFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSByaXNpbmcgZWRnZSB0cmlnZ2VyIG9uIHRoZSBSVEMgQWxhcm0gYXNzb2NpYXRlZCBFeHRpIGxpbmUuICAKKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSAgIChFWFRJLT5SVFNSICY9IH4oUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHJpc2luZyAmIGZhbGxpbmcgZWRnZSB0cmlnZ2VyIG9uIHRoZSBSVEMgQWxhcm0gYXNzb2NpYXRlZCBFeHRpIGxpbmUuICAKKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0VOQUJMRV9SSVNJTkdfRkFMTElOR19FREdFKCkgX19IQUxfUlRDX0FMQVJNX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7X19IQUxfUlRDX0FMQVJNX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpOworCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgcmlzaW5nICYgZmFsbGluZyBlZGdlIHRyaWdnZXIgb24gdGhlIFJUQyBBbGFybSBhc3NvY2lhdGVkIEV4dGkgbGluZS4gIAorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0FMQVJNX0VYVElfRElTQUJMRV9SSVNJTkdfRkFMTElOR19FREdFKCkgX19IQUxfUlRDX0FMQVJNX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpO19fSEFMX1JUQ19BTEFSTV9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCk7CisKKy8qKgorICAqIEBicmllZiBDaGVjayB3aGV0aGVyIHRoZSBSVEMgQWxhcm0gYXNzb2NpYXRlZCBFeHRpIGxpbmUgaW50ZXJydXB0IGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcmV0dmFsIExpbmUgU3RhdHVzLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1fRVhUSV9HRVRfRkxBRygpICAgICAgICAgICAgICAoRVhUSS0+UFIgJiBSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKQorCisvKioKKyAgKiBAYnJpZWYgQ2xlYXIgdGhlIFJUQyBBbGFybSBhc3NvY2lhdGVkIEV4dGkgbGluZSBmbGFnLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0FMQVJNX0VYVElfQ0xFQVJfRkxBRygpICAgICAgICAgICAgKEVYVEktPlBSID0gUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkKKworLyoqCisgICogQGJyaWVmIEdlbmVyYXRlIGEgU29mdHdhcmUgaW50ZXJydXB0IG9uIFJUQyBBbGFybSBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0dFTkVSQVRFX1NXSVQoKSAgICAgICAgIChFWFRJLT5TV0lFUiB8PSBSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKQorLyoqCisgICogQH0KKyAgKi8KKworLyogSW5jbHVkZSBSVEMgSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfcnRjX2V4LmgiCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ19FeHBvcnRlZF9GdW5jdGlvbnMgUlRDIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX0luaXQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19EZUluaXQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOwordm9pZCAgICAgICAgICAgICAgSEFMX1JUQ19Nc3BJbml0KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SVENfTXNwRGVJbml0KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgUlRDIFRpbWUgYW5kIERhdGUgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyogUlRDIFRpbWUgYW5kIERhdGUgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfU2V0VGltZShSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgUlRDX1RpbWVUeXBlRGVmICpzVGltZSwgdWludDMyX3QgRm9ybWF0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfR2V0VGltZShSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgUlRDX1RpbWVUeXBlRGVmICpzVGltZSwgdWludDMyX3QgRm9ybWF0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfU2V0RGF0ZShSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgUlRDX0RhdGVUeXBlRGVmICpzRGF0ZSwgdWludDMyX3QgRm9ybWF0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfR2V0RGF0ZShSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgUlRDX0RhdGVUeXBlRGVmICpzRGF0ZSwgdWludDMyX3QgRm9ybWF0KTsKKy8qKgorICAqIEB9CisgICovCisgIAorLyoqIEBkZWZncm91cCBSVENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBSVEMgQWxhcm0gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIFJUQyBBbGFybSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX1NldEFsYXJtKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfQWxhcm1UeXBlRGVmICpzQWxhcm0sIHVpbnQzMl90IEZvcm1hdCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX1NldEFsYXJtX0lUKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfQWxhcm1UeXBlRGVmICpzQWxhcm0sIHVpbnQzMl90IEZvcm1hdCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX0RlYWN0aXZhdGVBbGFybShSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgQWxhcm0pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19HZXRBbGFybShSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgUlRDX0FsYXJtVHlwZURlZiAqc0FsYXJtLCB1aW50MzJfdCBBbGFybSwgdWludDMyX3QgRm9ybWF0KTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SVENfQWxhcm1JUlFIYW5kbGVyKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfUG9sbEZvckFsYXJtQUV2ZW50KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lb3V0KTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SVENfQWxhcm1BRXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwICBSVENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogQHsKKyAgKi8gIAorLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmICAgSEFMX1JUQ19XYWl0Rm9yU3luY2hybyhSVENfSGFuZGxlVHlwZURlZiogaHJ0Yyk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA1IFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgICogQHsKKyAgKi8gIAorLyogUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9SVENTdGF0ZVR5cGVEZWYgSEFMX1JUQ19HZXRTdGF0ZShSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLyAgCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ19Qcml2YXRlX0NvbnN0YW50cyBSVEMgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworLyogTWFza3MgRGVmaW5pdGlvbiAqLworI2RlZmluZSBSVENfVFJfUkVTRVJWRURfTUFTSyAgICAweDAwN0Y3RjdGVQorI2RlZmluZSBSVENfRFJfUkVTRVJWRURfTUFTSyAgICAweDAwRkZGRjNGVSAKKyNkZWZpbmUgUlRDX0lOSVRfTUFTSyAgICAgICAgICAgMHhGRkZGRkZGRlUgIAorI2RlZmluZSBSVENfUlNGX01BU0sgICAgICAgICAgICAweEZGRkZGRjVGVQorI2RlZmluZSBSVENfRkxBR1NfTUFTSyAgICAgICAgICAoKHVpbnQzMl90KSAoUlRDX0ZMQUdfUkVDQUxQRiB8IFJUQ19GTEFHX1RBTVAzRiB8IFJUQ19GTEFHX1RBTVAyRiB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19GTEFHX1RBTVAxRnwgUlRDX0ZMQUdfVFNPVkYgfCBSVENfRkxBR19UU0YgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfRkxBR19XVVRGIHwgUlRDX0ZMQUdfQUxSQkYgfCBSVENfRkxBR19BTFJBRiAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX0ZMQUdfSU5JVEYgfCBSVENfRkxBR19SU0YgICAgICAgICAgICAgICAgICAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19GTEFHX0lOSVRTIHwgUlRDX0ZMQUdfU0hQRiB8IFJUQ19GTEFHX1dVVFdGICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfRkxBR19BTFJCV0YgfCBSVENfRkxBR19BTFJBV0YpKQorCisjZGVmaW5lIFJUQ19USU1FT1VUX1ZBTFVFICAxMDAwCisKKyNkZWZpbmUgUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCAgICAgICAgICAgICBFWFRJX0lNUl9NUjE3ICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDE3IENvbm5lY3RlZCB0byB0aGUgUlRDIEFsYXJtIGV2ZW50ICovCisjZGVmaW5lIFJUQ19FWFRJX0xJTkVfVEFNUEVSX1RJTUVTVEFNUF9FVkVOVCAgRVhUSV9JTVJfTVIxOSAgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAxOSBDb25uZWN0ZWQgdG8gdGhlIFJUQyBUYW1wZXIgYW5kIFRpbWUgU3RhbXAgZXZlbnRzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCAgICAgICBFWFRJX0lNUl9NUjIwICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDIwIENvbm5lY3RlZCB0byB0aGUgUlRDIFdha2V1cCBldmVudCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisvKioKKyAgKiBAfQorICAqLworLyogUHJpdmF0ZSBtYWNyb3MgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUlRDX1ByaXZhdGVfTWFjcm9zIFJUQyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0lTX1JUQ19EZWZpbml0aW9ucyBSVEMgUHJpdmF0ZSBtYWNyb3MgdG8gY2hlY2sgaW5wdXQgcGFyYW1ldGVycworICAqIEB7CisgICovIAorCisjZGVmaW5lIElTX1JUQ19IT1VSX0ZPUk1BVChGT1JNQVQpICAgICAoKChGT1JNQVQpID09IFJUQ19IT1VSRk9STUFUXzEyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGT1JNQVQpID09IFJUQ19IT1VSRk9STUFUXzI0KSkKKworI2RlZmluZSBJU19SVENfT1VUUFVUX1BPTChQT0wpICgoKFBPTCkgPT0gUlRDX09VVFBVVF9QT0xBUklUWV9ISUdIKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUE9MKSA9PSBSVENfT1VUUFVUX1BPTEFSSVRZX0xPVykpCisKKyNkZWZpbmUgSVNfUlRDX09VVFBVVF9UWVBFKFRZUEUpICgoKFRZUEUpID09IFJUQ19PVVRQVVRfVFlQRV9PUEVORFJBSU4pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRZUEUpID09IFJUQ19PVVRQVVRfVFlQRV9QVVNIUFVMTCkpCisjZGVmaW5lIElTX1JUQ19IT1VSMTIoSE9VUikgICAgICAgICAgICAoKChIT1VSKSA+IDBVKSAmJiAoKEhPVVIpIDw9IDEyVSkpCisjZGVmaW5lIElTX1JUQ19IT1VSMjQoSE9VUikgICAgICAgICAgICAoKEhPVVIpIDw9IDIzVSkKKyNkZWZpbmUgSVNfUlRDX0FTWU5DSF9QUkVESVYoUFJFRElWKSAgICgoUFJFRElWKSA8PSAweDdGVSkKKyNkZWZpbmUgSVNfUlRDX1NZTkNIX1BSRURJVihQUkVESVYpICAgICgoUFJFRElWKSA8PSAweDdGRkZVKQorI2RlZmluZSBJU19SVENfTUlOVVRFUyhNSU5VVEVTKSAgICAgICAgKChNSU5VVEVTKSA8PSA1OVUpCisjZGVmaW5lIElTX1JUQ19TRUNPTkRTKFNFQ09ORFMpICAgICAgICAoKFNFQ09ORFMpIDw9IDU5VSkKKworI2RlZmluZSBJU19SVENfSE9VUkZPUk1BVDEyKFBNKSAgKCgoUE0pID09IFJUQ19IT1VSRk9STUFUMTJfQU0pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBNKSA9PSBSVENfSE9VUkZPUk1BVDEyX1BNKSkKKworI2RlZmluZSBJU19SVENfREFZTElHSFRfU0FWSU5HKFNBVkUpICgoKFNBVkUpID09IFJUQ19EQVlMSUdIVFNBVklOR19TVUIxSCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNBVkUpID09IFJUQ19EQVlMSUdIVFNBVklOR19BREQxSCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNBVkUpID09IFJUQ19EQVlMSUdIVFNBVklOR19OT05FKSkKKworI2RlZmluZSBJU19SVENfU1RPUkVfT1BFUkFUSU9OKE9QRVJBVElPTikgKCgoT1BFUkFUSU9OKSA9PSBSVENfU1RPUkVPUEVSQVRJT05fUkVTRVQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9QRVJBVElPTikgPT0gUlRDX1NUT1JFT1BFUkFUSU9OX1NFVCkpCisKKyNkZWZpbmUgSVNfUlRDX0ZPUk1BVChGT1JNQVQpICgoKEZPUk1BVCkgPT0gUlRDX0ZPUk1BVF9CSU4pIHx8ICgoRk9STUFUKSA9PSBSVENfRk9STUFUX0JDRCkpCisKKyNkZWZpbmUgSVNfUlRDX1lFQVIoWUVBUikgICAgICAgICAgICAgICgoWUVBUikgPD0gOTlVKQorCisjZGVmaW5lIElTX1JUQ19NT05USChNT05USCkgICAgICAgICAgICAoKChNT05USCkgPj0gMVUpICYmICgoTU9OVEgpIDw9IDEyVSkpCisKKyNkZWZpbmUgSVNfUlRDX0RBVEUoREFURSkgICAgICAgICAgICAgICgoKERBVEUpID49IDFVKSAmJiAoKERBVEUpIDw9IDMxVSkpCisKKyNkZWZpbmUgSVNfUlRDX1dFRUtEQVkoV0VFS0RBWSkgKCgoV0VFS0RBWSkgPT0gUlRDX1dFRUtEQVlfTU9OREFZKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdFRUtEQVkpID09IFJUQ19XRUVLREFZX1RVRVNEQVkpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXRUVLREFZKSA9PSBSVENfV0VFS0RBWV9XRURORVNEQVkpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoV0VFS0RBWSkgPT0gUlRDX1dFRUtEQVlfVEhVUlNEQVkpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdFRUtEQVkpID09IFJUQ19XRUVLREFZX0ZSSURBWSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXRUVLREFZKSA9PSBSVENfV0VFS0RBWV9TQVRVUkRBWSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoV0VFS0RBWSkgPT0gUlRDX1dFRUtEQVlfU1VOREFZKSkKKworI2RlZmluZSBJU19SVENfQUxBUk1fREFURV9XRUVLREFZX0RBVEUoREFURSkgKCgoREFURSkgPiAwVSkgJiYgKChEQVRFKSA8PSAzMVUpKQorCisjZGVmaW5lIElTX1JUQ19BTEFSTV9EQVRFX1dFRUtEQVlfV0VFS0RBWShXRUVLREFZKSAoKChXRUVLREFZKSA9PSBSVENfV0VFS0RBWV9NT05EQVkpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdFRUtEQVkpID09IFJUQ19XRUVLREFZX1RVRVNEQVkpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoV0VFS0RBWSkgPT0gUlRDX1dFRUtEQVlfV0VETkVTREFZKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXRUVLREFZKSA9PSBSVENfV0VFS0RBWV9USFVSU0RBWSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdFRUtEQVkpID09IFJUQ19XRUVLREFZX0ZSSURBWSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoV0VFS0RBWSkgPT0gUlRDX1dFRUtEQVlfU0FUVVJEQVkpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXRUVLREFZKSA9PSBSVENfV0VFS0RBWV9TVU5EQVkpKQorCisjZGVmaW5lIElTX1JUQ19BTEFSTV9EQVRFX1dFRUtEQVlfU0VMKFNFTCkgKCgoU0VMKSA9PSBSVENfQUxBUk1EQVRFV0VFS0RBWVNFTF9EQVRFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0VMKSA9PSBSVENfQUxBUk1EQVRFV0VFS0RBWVNFTF9XRUVLREFZKSkKKworI2RlZmluZSBJU19SVENfQUxBUk1fTUFTSyhNQVNLKSAgKCgoTUFTSykgJiAweDdGN0Y3RjdGVSkgPT0gKHVpbnQzMl90KVJFU0VUKQorCisjZGVmaW5lIElTX1JUQ19BTEFSTShBTEFSTSkgICAgICAoKChBTEFSTSkgPT0gUlRDX0FMQVJNX0EpIHx8ICgoQUxBUk0pID09IFJUQ19BTEFSTV9CKSkKKworI2RlZmluZSBJU19SVENfQUxBUk1fU1VCX1NFQ09ORF9WQUxVRShWQUxVRSkgKChWQUxVRSkgPD0gMHgwMDAwN0ZGRlUpCisKKyNkZWZpbmUgSVNfUlRDX0FMQVJNX1NVQl9TRUNPTkRfTUFTSyhNQVNLKSAgICgoKE1BU0spID09IFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfQUxMKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF8zKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF82KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfNykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzgpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF85KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfMTApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF8xMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzEyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfMTMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gUlRDX0FMQVJNU1VCU0VDT05ETUFTS19OT05FKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisgIAorLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ19Qcml2YXRlX0Z1bmN0aW9ucyBSVEMgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLyAgICAKK0hBTF9TdGF0dXNUeXBlRGVmICBSVENfRW50ZXJJbml0TW9kZShSVENfSGFuZGxlVHlwZURlZiogaHJ0Yyk7Cit1aW50OF90ICAgICAgICAgICAgUlRDX0J5dGVUb0JjZDIodWludDhfdCBWYWx1ZSk7Cit1aW50OF90ICAgICAgICAgICAgUlRDX0JjZDJUb0J5dGUodWludDhfdCBWYWx1ZSk7CisvKioKKyAgKiBAfQorICAqLyAgCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyRjN4eF9IQUxfUlRDX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmYzeHhfaGFsX3J0Y19leC5oIGIvSW5jL3N0bTMyZjN4eF9oYWxfcnRjX2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcxYjc4ZQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmYzeHhfaGFsX3J0Y19leC5oCkBAIC0wLDAgKzEsMTAyMiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfcnRjX2V4LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFJUQyBIQUwgRXh0ZW5kZWQgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIAorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyRjN4eF9IQUxfUlRDX0VYX0gKKyNkZWZpbmUgX19TVE0zMkYzeHhfSEFMX1JUQ19FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENFeCBSVENFeAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorCisvKiogQGRlZmdyb3VwIFJUQ0V4X0V4cG9ydGVkX1R5cGVzIFJUQyBFeHRlbmRlZCBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUlRDIFRhbXBlciBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgVGFtcGVyOyAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVGFtcGVyIFBpbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgIFJUQ0V4X1RhbXBlcl9QaW5zX0RlZmluaXRpb25zICovCisKKyAgdWludDMyX3QgVHJpZ2dlcjsgICAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVGFtcGVyIFRyaWdnZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmICBSVENFeF9UYW1wZXJfVHJpZ2dlcl9EZWZpbml0aW9ucyAqLworCisgIHVpbnQzMl90IEZpbHRlcjsgICAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBGaWx0ZXIgVGFtcGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENFeF9UYW1wZXJfRmlsdGVyX0RlZmluaXRpb25zICovCisKKyAgdWludDMyX3QgU2FtcGxpbmdGcmVxdWVuY3k7ICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgc2FtcGxpbmcgZnJlcXVlbmN5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENFeF9UYW1wZXJfU2FtcGxpbmdfRnJlcXVlbmNpZXNfRGVmaW5pdGlvbnMgKi8KKworICB1aW50MzJfdCBQcmVjaGFyZ2VEdXJhdGlvbjsgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBQcmVjaGFyZ2UgRHVyYXRpb24gLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENFeF9UYW1wZXJfUGluX1ByZWNoYXJnZV9EdXJhdGlvbl9EZWZpbml0aW9ucyAqLworCisgIHVpbnQzMl90IFRhbXBlclB1bGxVcDsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFRhbXBlciBQdWxsVXAgLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENFeF9UYW1wZXJfUHVsbF9VUF9EZWZpbml0aW9ucyAqLworCisgIHVpbnQzMl90IFRpbWVTdGFtcE9uVGFtcGVyRGV0ZWN0aW9uOyAgLyohPCBTcGVjaWZpZXMgdGhlIFRpbWVTdGFtcE9uVGFtcGVyRGV0ZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENFeF9UYW1wZXJfVGltZVN0YW1wT25UYW1wZXJEZXRlY3Rpb25fRGVmaW5pdGlvbnMgKi8KK31SVENfVGFtcGVyVHlwZURlZjsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ0V4X0V4cG9ydGVkX0NvbnN0YW50cyBSVEMgRXh0ZW5kZWQgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENFeF9PdXRwdXRfc2VsZWN0aW9uX0RlZmluaXRpb25zIFJUQyBFeHRlbmRlZCBPdXRwdXQgU2VsZWN0aW9uIERlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBSVENfT1VUUFVUX0RJU0FCTEUgICAgICAgICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgUlRDX09VVFBVVF9BTEFSTUEgICAgICAgICAgICAgIFJUQ19DUl9PU0VMXzAKKyNkZWZpbmUgUlRDX09VVFBVVF9BTEFSTUIgICAgICAgICAgICAgIFJUQ19DUl9PU0VMXzEKKyNkZWZpbmUgUlRDX09VVFBVVF9XQUtFVVAgICAgICAgICAgICAgIFJUQ19DUl9PU0VMCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ0V4X0JhY2t1cF9SZWdpc3RlcnNfRGVmaW5pdGlvbnMgUlRDIEV4dGVuZGVkIEJhY2t1cCBSZWdpc3RlcnMgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjaWYgUlRDX0JLUF9OVU1CRVIgPiAwVQorI2RlZmluZSBSVENfQktQX0RSMCAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgUlRDX0JLUF9EUjEgIDB4MDAwMDAwMDFVCisjZGVmaW5lIFJUQ19CS1BfRFIyICAweDAwMDAwMDAyVQorI2RlZmluZSBSVENfQktQX0RSMyAgMHgwMDAwMDAwM1UKKyNkZWZpbmUgUlRDX0JLUF9EUjQgIDB4MDAwMDAwMDRVCisjZW5kaWYgLyogUlRDX0JLUF9OVU1CRVIgPiAwVSAqLworCisjaWYgUlRDX0JLUF9OVU1CRVIgPiA1VQorI2RlZmluZSBSVENfQktQX0RSNSAgMHgwMDAwMDAwNVUKKyNkZWZpbmUgUlRDX0JLUF9EUjYgIDB4MDAwMDAwMDZVCisjZGVmaW5lIFJUQ19CS1BfRFI3ICAweDAwMDAwMDA3VQorI2RlZmluZSBSVENfQktQX0RSOCAgMHgwMDAwMDAwOFUKKyNkZWZpbmUgUlRDX0JLUF9EUjkgIDB4MDAwMDAwMDlVCisjZGVmaW5lIFJUQ19CS1BfRFIxMCAweDAwMDAwMDBBVQorI2RlZmluZSBSVENfQktQX0RSMTEgMHgwMDAwMDAwQlUKKyNkZWZpbmUgUlRDX0JLUF9EUjEyIDB4MDAwMDAwMENVCisjZGVmaW5lIFJUQ19CS1BfRFIxMyAweDAwMDAwMDBEVQorI2RlZmluZSBSVENfQktQX0RSMTQgMHgwMDAwMDAwRVUKKyNkZWZpbmUgUlRDX0JLUF9EUjE1IDB4MDAwMDAwMEZVCisjZW5kaWYgLyogUlRDX0JLUF9OVU1CRVIgPiA1VSAqLworCisjaWYgUlRDX0JLUF9OVU1CRVIgPiAxNlUKKyNkZWZpbmUgUlRDX0JLUF9EUjE2IDB4MDAwMDAwMTBVCisjZGVmaW5lIFJUQ19CS1BfRFIxNyAweDAwMDAwMDExVQorI2RlZmluZSBSVENfQktQX0RSMTggMHgwMDAwMDAxMlUKKyNkZWZpbmUgUlRDX0JLUF9EUjE5IDB4MDAwMDAwMTNVCisjZW5kaWYgLyogUlRDX0JLUF9OVU1CRVIgPiAxNlUgKi8KKworI2lmIFJUQ19CS1BfTlVNQkVSID4gMjBVCisjZGVmaW5lIFJUQ19CS1BfRFIyMCAweDAwMDAwMDE0VQorI2RlZmluZSBSVENfQktQX0RSMjEgMHgwMDAwMDAxNVUKKyNkZWZpbmUgUlRDX0JLUF9EUjIyIDB4MDAwMDAwMTZVCisjZGVmaW5lIFJUQ19CS1BfRFIyMyAweDAwMDAwMDE3VQorI2RlZmluZSBSVENfQktQX0RSMjQgMHgwMDAwMDAxOFUKKyNkZWZpbmUgUlRDX0JLUF9EUjI1IDB4MDAwMDAwMTlVCisjZGVmaW5lIFJUQ19CS1BfRFIyNiAweDAwMDAwMDFBVQorI2RlZmluZSBSVENfQktQX0RSMjcgMHgwMDAwMDAxQlUKKyNkZWZpbmUgUlRDX0JLUF9EUjI4IDB4MDAwMDAwMUNVCisjZGVmaW5lIFJUQ19CS1BfRFIyOSAweDAwMDAwMDFEVQorI2RlZmluZSBSVENfQktQX0RSMzAgMHgwMDAwMDAxRVUKKyNkZWZpbmUgUlRDX0JLUF9EUjMxIDB4MDAwMDAwMUZVCisjZW5kaWYgLyogUlRDX0JLUF9OVU1CRVIgPiAyMFUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfVGltZV9TdGFtcF9FZGdlc19kZWZpbml0aW9ucyBSVEMgRXh0ZW5kZWQgVGltZSBTdGFtcCBFZGdlcyBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX1RJTUVTVEFNUEVER0VfUklTSU5HICAgICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIFJUQ19USU1FU1RBTVBFREdFX0ZBTExJTkcgICAgICAgICBSVENfQ1JfVFNFREdFCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ0V4X1RpbWVTdGFtcF9QaW5fU2VsZWN0aW9ucyBSVEMgRXh0ZW5kZWQgVGltZVN0YW1wIFBpbiBTZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBSVENfVElNRVNUQU1QUElOX0RFRkFVTFQgICAgICAgICAgICAgIDB4MDAwMDAwMDBVCisvKioKKyAgKiBAfQorICAqLworICAKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfVGFtcGVyX1BpbnNfRGVmaW5pdGlvbnMgUlRDIEV4dGVuZGVkIFRhbXBlciBQaW5zIERlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBSVENfVEFNUEVSXzEgICAgICAgICAgICAgICAgICAgIFJUQ19UQUZDUl9UQU1QMUUKKyNkZWZpbmUgUlRDX1RBTVBFUl8yICAgICAgICAgICAgICAgICAgICBSVENfVEFGQ1JfVEFNUDJFCisjaWYgZGVmaW5lZChSVENfVEFNUEVSM19TVVBQT1JUKQorI2RlZmluZSBSVENfVEFNUEVSXzMgICAgICAgICAgICAgICAgICAgIFJUQ19UQUZDUl9UQU1QM0UKKyNlbmRpZiAvKiBSVENfVEFNUEVSM19TVVBQT1JUICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfVGFtcGVyX1RyaWdnZXJfRGVmaW5pdGlvbnMgUlRDIEV4dGVuZGVkIFRhbXBlciBUcmlnZ2VyIERlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBSVENfVEFNUEVSVFJJR0dFUl9SSVNJTkdFREdFICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIFJUQ19UQU1QRVJUUklHR0VSX0ZBTExJTkdFREdFICAgICAgUlRDX1RBRkNSX1RBTVAxVFJHCisjZGVmaW5lIFJUQ19UQU1QRVJUUklHR0VSX0xPV0xFVkVMICAgICAgICAgUlRDX1RBTVBFUlRSSUdHRVJfUklTSU5HRURHRQorI2RlZmluZSBSVENfVEFNUEVSVFJJR0dFUl9ISUdITEVWRUwgICAgICAgIFJUQ19UQU1QRVJUUklHR0VSX0ZBTExJTkdFREdFCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ0V4X1RhbXBlcl9GaWx0ZXJfRGVmaW5pdGlvbnMgUlRDIEV4dGVuZGVkIFRhbXBlciBGaWx0ZXIgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19UQU1QRVJGSUxURVJfRElTQUJMRSAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgVGFtcGVyIGZpbHRlciBpcyBkaXNhYmxlZCAqLworCisjZGVmaW5lIFJUQ19UQU1QRVJGSUxURVJfMlNBTVBMRSAgIFJUQ19UQUZDUl9UQU1QRkxUXzAgICAgIC8qITwgVGFtcGVyIGlzIGFjdGl2YXRlZCBhZnRlciAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc2VjdXRpdmUgc2FtcGxlcyBhdCB0aGUgYWN0aXZlIGxldmVsICovCisjZGVmaW5lIFJUQ19UQU1QRVJGSUxURVJfNFNBTVBMRSAgIFJUQ19UQUZDUl9UQU1QRkxUXzEgICAgIC8qITwgVGFtcGVyIGlzIGFjdGl2YXRlZCBhZnRlciA0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc2VjdXRpdmUgc2FtcGxlcyBhdCB0aGUgYWN0aXZlIGxldmVsICovCisjZGVmaW5lIFJUQ19UQU1QRVJGSUxURVJfOFNBTVBMRSAgIFJUQ19UQUZDUl9UQU1QRkxUICAgICAgIC8qITwgVGFtcGVyIGlzIGFjdGl2YXRlZCBhZnRlciA4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc2VjdXRpdmUgc2FtcGxlcyBhdCB0aGUgYWN0aXZlIGxldmVsLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENFeF9UYW1wZXJfU2FtcGxpbmdfRnJlcXVlbmNpZXNfRGVmaW5pdGlvbnMgUlRDIEV4dGVuZGVkIFRhbXBlciBTYW1wbGluZyBGcmVxdWVuY2llcyBEZWZpbml0aW9uICAKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfVEFNUEVSU0FNUExJTkdGUkVRX1JUQ0NMS19ESVYzMjc2OCAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgRWFjaCBvZiB0aGUgdGFtcGVyIGlucHV0cyBhcmUgc2FtcGxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGEgZnJlcXVlbmN5ID0gIFJUQ0NMSyAvIDMyNzY4VSAqLworI2RlZmluZSBSVENfVEFNUEVSU0FNUExJTkdGUkVRX1JUQ0NMS19ESVYxNjM4NCAgUlRDX1RBRkNSX1RBTVBGUkVRXzAgIC8qITwgRWFjaCBvZiB0aGUgdGFtcGVyIGlucHV0cyBhcmUgc2FtcGxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGEgZnJlcXVlbmN5ID0gIFJUQ0NMSyAvIDE2Mzg0VSAqLworI2RlZmluZSBSVENfVEFNUEVSU0FNUExJTkdGUkVRX1JUQ0NMS19ESVY4MTkyICAgUlRDX1RBRkNSX1RBTVBGUkVRXzEgIC8qITwgRWFjaCBvZiB0aGUgdGFtcGVyIGlucHV0cyBhcmUgc2FtcGxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGEgZnJlcXVlbmN5ID0gIFJUQ0NMSyAvIDgxOTIgICovCisjZGVmaW5lIFJUQ19UQU1QRVJTQU1QTElOR0ZSRVFfUlRDQ0xLX0RJVjQwOTYgICAoUlRDX1RBRkNSX1RBTVBGUkVRXzAgfCBSVENfVEFGQ1JfVEFNUEZSRVFfMSkgIC8qITwgRWFjaCBvZiB0aGUgdGFtcGVyIGlucHV0cyBhcmUgc2FtcGxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGEgZnJlcXVlbmN5ID0gIFJUQ0NMSyAvIDQwOTYgICovCisjZGVmaW5lIFJUQ19UQU1QRVJTQU1QTElOR0ZSRVFfUlRDQ0xLX0RJVjIwNDggICBSVENfVEFGQ1JfVEFNUEZSRVFfMiAgLyohPCBFYWNoIG9mIHRoZSB0YW1wZXIgaW5wdXRzIGFyZSBzYW1wbGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSBmcmVxdWVuY3kgPSAgUlRDQ0xLIC8gMjA0OCAgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUlNBTVBMSU5HRlJFUV9SVENDTEtfRElWMTAyNCAgIChSVENfVEFGQ1JfVEFNUEZSRVFfMCB8IFJUQ19UQUZDUl9UQU1QRlJFUV8yKSAgLyohPCBFYWNoIG9mIHRoZSB0YW1wZXIgaW5wdXRzIGFyZSBzYW1wbGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSBmcmVxdWVuY3kgPSAgUlRDQ0xLIC8gMTAyNCAgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUlNBTVBMSU5HRlJFUV9SVENDTEtfRElWNTEyICAgIChSVENfVEFGQ1JfVEFNUEZSRVFfMSB8IFJUQ19UQUZDUl9UQU1QRlJFUV8yKSAgLyohPCBFYWNoIG9mIHRoZSB0YW1wZXIgaW5wdXRzIGFyZSBzYW1wbGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSBmcmVxdWVuY3kgPSAgUlRDQ0xLIC8gNTEyICAgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUlNBTVBMSU5HRlJFUV9SVENDTEtfRElWMjU2ICAgIChSVENfVEFGQ1JfVEFNUEZSRVFfMCB8IFJUQ19UQUZDUl9UQU1QRlJFUV8xIHwgUlRDX1RBRkNSX1RBTVBGUkVRXzIpICAvKiE8IEVhY2ggb2YgdGhlIHRhbXBlciBpbnB1dHMgYXJlIHNhbXBsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhIGZyZXF1ZW5jeSA9ICBSVENDTEsgLyAyNTYgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENFeF9UYW1wZXJfUGluX1ByZWNoYXJnZV9EdXJhdGlvbl9EZWZpbml0aW9ucyBSVEMgRXh0ZW5kZWQgVGFtcGVyIFBpbiBQcmVjaGFyZ2UgRHVyYXRpb24gRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19UQU1QRVJQUkVDSEFSR0VEVVJBVElPTl8xUlRDQ0xLIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IFRhbXBlciBwaW5zIGFyZSBwcmUtY2hhcmdlZCBiZWZvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZyBkdXJpbmcgMSBSVENDTEsgY3ljbGUgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUlBSRUNIQVJHRURVUkFUSU9OXzJSVENDTEsgUlRDX1RBRkNSX1RBTVBQUkNIXzAgIC8qITwgVGFtcGVyIHBpbnMgYXJlIHByZS1jaGFyZ2VkIGJlZm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nIGR1cmluZyAyIFJUQ0NMSyBjeWNsZXMgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUlBSRUNIQVJHRURVUkFUSU9OXzRSVENDTEsgUlRDX1RBRkNSX1RBTVBQUkNIXzEgIC8qITwgVGFtcGVyIHBpbnMgYXJlIHByZS1jaGFyZ2VkIGJlZm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nIGR1cmluZyA0IFJUQ0NMSyBjeWNsZXMgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUlBSRUNIQVJHRURVUkFUSU9OXzhSVENDTEsgKFJUQ19UQUZDUl9UQU1QUFJDSF8wIHwgUlRDX1RBRkNSX1RBTVBQUkNIXzEpICAvKiE8IFRhbXBlciBwaW5zIGFyZSBwcmUtY2hhcmdlZCBiZWZvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZyBkdXJpbmcgOCBSVENDTEsgY3ljbGVzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ0V4X1RhbXBlcl9UaW1lU3RhbXBPblRhbXBlckRldGVjdGlvbl9EZWZpbml0aW9ucyBSVEMgRXh0ZW5kZWQgVGFtcGVyIFRpbWVTdGFtcE9uVGFtcGVyRGV0ZWN0aW9uIERlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBSVENfVElNRVNUQU1QT05UQU1QRVJERVRFQ1RJT05fRU5BQkxFICAoKHVpbnQzMl90KVJUQ19UQUZDUl9UQU1QVFMpICAvKiE8IFRpbWVTdGFtcCBvbiBUYW1wZXIgRGV0ZWN0aW9uIGV2ZW50IHNhdmVkICovCisjZGVmaW5lIFJUQ19USU1FU1RBTVBPTlRBTVBFUkRFVEVDVElPTl9ESVNBQkxFIDB4MDAwMDAwMDBVICAgICAgIC8qITwgVGltZVN0YW1wIG9uIFRhbXBlciBEZXRlY3Rpb24gZXZlbnQgaXMgbm90IHNhdmVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ0V4X1RhbXBlcl9QdWxsX1VQX0RlZmluaXRpb25zIFJUQyBFeHRlbmRlZCBUYW1wZXIgUHVsbCBVUCBEZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUl9QVUxMVVBfRU5BQkxFICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUYW1wZXIgcGlucyBhcmUgcHJlLWNoYXJnZWQgYmVmb3JlIHNhbXBsaW5nICAqLworI2RlZmluZSBSVENfVEFNUEVSX1BVTExVUF9ESVNBQkxFICgodWludDMyX3QpUlRDX1RBRkNSX1RBTVBQVURJUykgICAvKiE8IFRhbXBlciBwaW5zIGFyZSBub3QgcHJlLWNoYXJnZWQgYmVmb3JlIHNhbXBsaW5nICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ0V4X1dha2V1cF9UaW1lcl9EZWZpbml0aW9ucyBSVEMgRXh0ZW5kZWQgV2FrZXVwIFRpbWVyIERlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBSVENfV0FLRVVQQ0xPQ0tfUlRDQ0xLX0RJVjE2ICAgICAgICAweDAwMDAwMDAwVQorI2RlZmluZSBSVENfV0FLRVVQQ0xPQ0tfUlRDQ0xLX0RJVjggICAgICAgICBSVENfQ1JfV1VDS1NFTF8wCisjZGVmaW5lIFJUQ19XQUtFVVBDTE9DS19SVENDTEtfRElWNCAgICAgICAgIFJUQ19DUl9XVUNLU0VMXzEKKyNkZWZpbmUgUlRDX1dBS0VVUENMT0NLX1JUQ0NMS19ESVYyICAgICAgICAgKFJUQ19DUl9XVUNLU0VMXzAgfCBSVENfQ1JfV1VDS1NFTF8xKQorI2RlZmluZSBSVENfV0FLRVVQQ0xPQ0tfQ0tfU1BSRV8xNkJJVFMgICAgICAoUlRDX0NSX1dVQ0tTRUxfMikKKyNkZWZpbmUgUlRDX1dBS0VVUENMT0NLX0NLX1NQUkVfMTdCSVRTICAgICAgKFJUQ19DUl9XVUNLU0VMXzEgfCBSVENfQ1JfV1VDS1NFTF8yKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENFeF9TbW9vdGhfY2FsaWJfcGVyaW9kX0RlZmluaXRpb25zIFJUQyBFeHRlbmRlZCBTbW9vdGggY2FsaWIgcGVyaW9kIERlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBSVENfU01PT1RIQ0FMSUJfUEVSSU9EXzMyU0VDICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAvKiE8ICBJZiBSVENDTEsgPSAzMjc2OCBIeiwgU21vb3RoIGNhbGliYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kIGlzIDMycywgIGVsc2UgMmV4cDIwIFJUQ0NMSyBzZWNvbmRzICovCisjZGVmaW5lIFJUQ19TTU9PVEhDQUxJQl9QRVJJT0RfMTZTRUMgICBSVENfQ0FMUl9DQUxXMTYgICAgICAgIC8qITwgIElmIFJUQ0NMSyA9IDMyNzY4IEh6LCBTbW9vdGggY2FsaWJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2QgaXMgMTZzLCBlbHNlIDJleHAxOSBSVENDTEsgc2Vjb25kcyAqLworI2RlZmluZSBSVENfU01PT1RIQ0FMSUJfUEVSSU9EXzhTRUMgICAgUlRDX0NBTFJfQ0FMVzggICAgICAgICAvKiE8ICBJZiBSVENDTEsgPSAzMjc2OCBIeiwgU21vb3RoIGNhbGliYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kIGlzIDhzLCBlbHNlIDJleHAxOCBSVENDTEsgc2Vjb25kcyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENFeF9TbW9vdGhfY2FsaWJfUGx1c19wdWxzZXNfRGVmaW5pdGlvbnMgUlRDIEV4dGVuZGVkIFNtb290aCBjYWxpYiBQbHVzIHB1bHNlcyBEZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX1NNT09USENBTElCX1BMVVNQVUxTRVNfUkVTRVQgIDB4MDAwMDAwMDBVICAgICAgICAgLyohPCAgVGhlIG51bWJlciBvZiBSVENDTEsgcHVsc2VzIHN1YmJzdGl0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyaW5nIGEgMzItc2Vjb25kIHdpbmRvdyA9ICAgQ0FMTVs4OjBdICovCisjZGVmaW5lIFJUQ19TTU9PVEhDQUxJQl9QTFVTUFVMU0VTX1NFVCAgICBSVENfQ0FMUl9DQUxQICAgICAgIC8qITwgIFRoZSBudW1iZXIgb2YgUlRDQ0xLIHB1bHNlcyBhZGRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJpbmcgYSBYIC1zZWNvbmQgd2luZG93ID0gWSAtIENBTE1bODowXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIFkgPSA1MTJVLCAyNTZVLCAxMjggd2hlbiBYID0gMzJVLCAxNlUsIDhVICovCisvKioKKyAgKiBAfQorICAqLworCisgLyoqIEBkZWZncm91cCBSVENFeF9DYWxpYl9PdXRwdXRfc2VsZWN0aW9uX0RlZmluaXRpb25zIFJUQyBFeHRlbmRlZCBDYWxpYiBPdXRwdXQgc2VsZWN0aW9uIERlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBSVENfQ0FMSUJPVVRQVVRfNTEySFogICAgICAgICAgICAweDAwMDAwMDAwVQorI2RlZmluZSBSVENfQ0FMSUJPVVRQVVRfMUhaICAgICAgICAgICAgICBSVENfQ1JfQ09TRUwKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfQWRkXzFfU2Vjb25kX1BhcmFtZXRlcl9EZWZpbml0aW9uIFJUQyBFeHRlbmRlZCBBZGQgMSBTZWNvbmQgUGFyYW1ldGVyIERlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBSVENfU0hJRlRBREQxU19SRVNFVCAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIFJUQ19TSElGVEFERDFTX1NFVCAgICAgICAgUlRDX1NISUZUUl9BREQxUworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUlRDRXhfRXhwb3J0ZWRfTWFjcm9zIFJUQyBFeHRlbmRlZCBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1XQUtFVVBUSU1FUi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ0V4X1dha2VVcF9UaW1lciBSVEMgRXh0ZW5kZWQgV2FrZVVwIFRpbWVyCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBSVEMgV2FrZVVwIFRpbWVyIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gKFJUQ19DUl9XVVRFKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBSVEMgV2FrZVVwIFRpbWVyIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgJj0gfihSVENfQ1JfV1VURSkpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBSVEMgV2FrZVVwVGltZXIgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgUlRDIFdha2VVcFRpbWVyIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGVuYWJsZWQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICBAYXJnIFJUQ19JVF9XVVQ6IFdha2VVcFRpbWVyIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfV0FLRVVQVElNRVJfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgUlRDIFdha2VVcFRpbWVyIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJUQyBXYWtlVXBUaW1lciBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0lUX1dVVDogV2FrZVVwVGltZXIgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9ESVNBQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9IH4oX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFJUQyBXYWtlVXBUaW1lciBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJUQyBXYWtlVXBUaW1lciBpbnRlcnJ1cHQgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICBAYXJnIFJUQ19JVF9XVVQ6ICBXYWtlVXBUaW1lciBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0dFVF9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAoKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSKSAmICgoX19JTlRFUlJVUFRfXyk+PiA0VSkpICE9IFJFU0VUKSA/IFNFVCA6IFJFU0VUKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBSVEMgV2FrZSBVcCB0aW1lciBpbnRlcnJ1cHQgaGFzIGJlZW4gZW5hYmxlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgV2FrZSBVcCB0aW1lciBpbnRlcnJ1cHQgc291cmNlcyB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0lUX1dVVDogIFdha2VVcFRpbWVyIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfV0FLRVVQVElNRVJfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUikgJiAoX19JTlRFUlJVUFRfXykpICE9IFJFU0VUKSA/IFNFVCA6IFJFU0VUKQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgc2VsZWN0ZWQgUlRDIFdha2VVcFRpbWVyJ3MgZmxhZyBzdGF0dXMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgUlRDIFdha2VVcFRpbWVyIEZsYWcgaXMgcGVuZGluZyBvciBub3QuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfV1VURgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfV1VUV0YKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpICYgKF9fRkxBR19fKSkgIT0gUkVTRVQpID8gU0VUIDogUkVTRVQpCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIFJUQyBXYWtlIFVwIHRpbWVyJ3MgcGVuZGluZyBmbGFncy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBSVEMgV2FrZVVwVGltZXIgRmxhZyB0byBjbGVhci4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfV1VURgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfV0FLRVVQVElNRVJfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUikgPSAofigoX19GTEFHX18pIHwgUlRDX0lTUl9JTklUKXwoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSICYgUlRDX0lTUl9JTklUKSkgCisKKy8qIFdBS0UtVVAgVElNRVIgRVhUSSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcnJ1cHQgb24gdGhlIFJUQyBXYWtlVXAgVGltZXIgYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0VOQUJMRV9JVCgpICAgICAgIChFWFRJLT5JTVIgfD0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGludGVycnVwdCBvbiB0aGUgUlRDIFdha2VVcCBUaW1lciBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfRElTQUJMRV9JVCgpICAgICAgKEVYVEktPklNUiAmPSB+KFJUQ19FWFRJX0xJTkVfV0FLRVVQVElNRVJfRVZFTlQpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBldmVudCBvbiB0aGUgUlRDIFdha2VVcCBUaW1lciBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0VOQUJMRV9FVkVOVCgpICAgIChFWFRJLT5FTVIgfD0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGV2ZW50IG9uIHRoZSBSVEMgV2FrZVVwIFRpbWVyIGFzc29jaWF0ZWQgRXh0aSBsaW5lLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfRElTQUJMRV9FVkVOVCgpICAgKEVYVEktPkVNUiAmPSB+KFJUQ19FWFRJX0xJTkVfV0FLRVVQVElNRVJfRVZFTlQpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBmYWxsaW5nIGVkZ2UgdHJpZ2dlciBvbiB0aGUgUlRDIFdha2VVcCBUaW1lciBhc3NvY2lhdGVkIEV4dGkgbGluZS4gCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgICAoRVhUSS0+RlRTUiB8PSBSVENfRVhUSV9MSU5FX1dBS0VVUFRJTUVSX0VWRU5UKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgZmFsbGluZyBlZGdlIHRyaWdnZXIgb24gdGhlIFJUQyBXYWtlVXAgVGltZXIgYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpICAoRVhUSS0+RlRTUiAmPSB+KFJUQ19FWFRJX0xJTkVfV0FLRVVQVElNRVJfRVZFTlQpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSByaXNpbmcgZWRnZSB0cmlnZ2VyIG9uIHRoZSBSVEMgV2FrZVVwIFRpbWVyIGFzc29jaWF0ZWQgRXh0aSBsaW5lLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgICAgKEVYVEktPlJUU1IgfD0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHJpc2luZyBlZGdlIHRyaWdnZXIgb24gdGhlIFJUQyBXYWtlVXAgVGltZXIgYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgICAoRVhUSS0+UlRTUiAmPSB+KFJUQ19FWFRJX0xJTkVfV0FLRVVQVElNRVJfRVZFTlQpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSByaXNpbmcgJiBmYWxsaW5nIGVkZ2UgdHJpZ2dlciBvbiB0aGUgUlRDIFdha2VVcCBUaW1lciBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0VOQUJMRV9SSVNJTkdfRkFMTElOR19FREdFKCkgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7X19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpOworCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgcmlzaW5nICYgZmFsbGluZyBlZGdlIHRyaWdnZXIgb24gdGhlIFJUQyBXYWtlVXAgVGltZXIgYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfRElTQUJMRV9SSVNJTkdfRkFMTElOR19FREdFKCkgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpO19fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCk7CisKKy8qKgorICAqIEBicmllZiBDaGVjayB3aGV0aGVyIHRoZSBSVEMgV2FrZVVwIFRpbWVyIGFzc29jaWF0ZWQgRXh0aSBsaW5lIGludGVycnVwdCBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHJldHZhbCBMaW5lIFN0YXR1cy4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfR0VUX0ZMQUcoKSAgICAgICAgICAgICAgKEVYVEktPlBSICYgUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkKKworLyoqCisgICogQGJyaWVmIENsZWFyIHRoZSBSVEMgV2FrZVVwIFRpbWVyIGFzc29jaWF0ZWQgRXh0aSBsaW5lIGZsYWcuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9DTEVBUl9GTEFHKCkgICAgICAgICAgICAoRVhUSS0+UFIgPSBSVENfRVhUSV9MSU5FX1dBS0VVUFRJTUVSX0VWRU5UKQorCisvKioKKyAgKiBAYnJpZWYgR2VuZXJhdGUgYSBTb2Z0d2FyZSBpbnRlcnJ1cHQgb24gdGhlIFJUQyBXYWtlVXAgVGltZXIgYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9HRU5FUkFURV9TV0lUKCkgICAgICAgICAoRVhUSS0+U1dJRVIgfD0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkKKy8qKgorICAqIEB9CisgICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVRJTUVTVEFNUC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ0V4X1RpbWVzdGFtcCBSVEMgRXh0ZW5kZWQgVGltZXN0YW1wCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBSVEMgVGltZVN0YW1wIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RJTUVTVEFNUF9FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gKFJUQ19DUl9UU0UpKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFJUQyBUaW1lU3RhbXAgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVElNRVNUQU1QX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmPSB+KFJUQ19DUl9UU0UpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgUlRDIFRpbWVTdGFtcCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgVGltZVN0YW1wIGludGVycnVwdCBzb3VyY2UgdG8gYmUgZW5hYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0lUX1RTOiBUaW1lU3RhbXAgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19USU1FU1RBTVBfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9IChfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBSVEMgVGltZVN0YW1wIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJUQyBUaW1lU3RhbXAgaW50ZXJydXB0IHNvdXJjZSB0byBiZSBkaXNhYmxlZC4gCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICBAYXJnIFJUQ19JVF9UUzogVGltZVN0YW1wIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVElNRVNUQU1QX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmPSB+KF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBSVEMgVGltZVN0YW1wIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgUlRDIFRpbWVTdGFtcCBpbnRlcnJ1cHQgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICBAYXJnIFJUQ19JVF9UUzogVGltZVN0YW1wIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVElNRVNUQU1QX0dFVF9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpICYgKChfX0lOVEVSUlVQVF9fKT4+IDRVKSkgIT0gUkVTRVQpPyBTRVQgOiBSRVNFVCkKKworLyoqCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgUlRDIFRpbWUgU3RhbXAgaW50ZXJydXB0IGhhcyBiZWVuIGVuYWJsZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgUlRDIFRpbWUgU3RhbXAgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0lUX1RTOiBUaW1lU3RhbXAgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19USU1FU1RBTVBfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgKCgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSKSAmIChfX0lOVEVSUlVQVF9fKSkgIT0gUkVTRVQpID8gU0VUIDogUkVTRVQpCisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBzZWxlY3RlZCBSVEMgVGltZVN0YW1wJ3MgZmxhZyBzdGF0dXMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgUlRDIFRpbWVTdGFtcCBGbGFnIGlzIHBlbmRpbmcgb3Igbm90LgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgQGFyZyBSVENfRkxBR19UU0YgICAKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfVFNPVkYgICAgIAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVElNRVNUQU1QX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgICAgICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpICYgKF9fRkxBR19fKSkgIT0gUkVTRVQpPyBTRVQgOiBSRVNFVCkKKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgUlRDIFRpbWUgU3RhbXAncyBwZW5kaW5nIGZsYWdzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIFJUQyBBbGFybSBGbGFnIHRvIGNsZWFyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19GTEFHX1RTRiAgCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19USU1FU1RBTVBfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUikgPSAofigoX19GTEFHX18pIHwgUlRDX0lTUl9JTklUKXwoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSICYgUlRDX0lTUl9JTklUKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVEFNUEVSLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUlRDRXhfVGFtcGVyIFJUQyBFeHRlbmRlZCBUYW1wZXIKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgUlRDIFRhbXBlcjEgaW5wdXQgZGV0ZWN0aW9uLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVIxX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+VEFGQ1IgfD0gKFJUQ19UQUZDUl9UQU1QMUUpKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFJUQyBUYW1wZXIxIGlucHV0IGRldGVjdGlvbi4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSMV9ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlRBRkNSICY9IH4oUlRDX1RBRkNSX1RBTVAxRSkpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBSVEMgVGFtcGVyMiBpbnB1dCBkZXRlY3Rpb24uCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUjJfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5UQUZDUiB8PSAoUlRDX1RBRkNSX1RBTVAyRSkpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgUlRDIFRhbXBlcjIgaW5wdXQgZGV0ZWN0aW9uLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVIyX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+VEFGQ1IgJj0gfihSVENfVEFGQ1JfVEFNUDJFKSkKKworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBSVEMgVGFtcGVyMyBpbnB1dCBkZXRlY3Rpb24uCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUjNfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5UQUZDUiB8PSAoUlRDX1RBRkNSX1RBTVAzRSkpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgUlRDIFRhbXBlcjMgaW5wdXQgZGV0ZWN0aW9uLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVIzX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+VEFGQ1IgJj0gfihSVENfVEFGQ1JfVEFNUDNFKSkKKyNlbmRpZiAvKiBSVENfVEFNUEVSM19TVVBQT1JUICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBSVEMgVGFtcGVyIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJUQyBUYW1wZXIgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZW5hYmxlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBSVENfSVRfVEFNUDogVGFtcGVyIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLyAgIAorI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlRBRkNSIHw9IChfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBSVEMgVGFtcGVyIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJUQyBUYW1wZXIgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZGlzYWJsZWQuIAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0lUX1RBTVA6IFRhbXBlciBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9ESVNBQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5UQUZDUiAmPSB+KF9fSU5URVJSVVBUX18pKQorICAgIAorLyoqCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgUlRDIFRhbXBlciBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJUQyBUYW1wZXIgaW50ZXJydXB0IHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAxOiBUYW1wZXIxIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAyOiBUYW1wZXIyIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAzOiBUYW1wZXIzIGludGVycnVwdCAoKikKKyAgKiBAbm90ZSAgICgqKSBSVENfSVRfVEFNUDMgbm90IHByZXNlbnQgb24gYWxsIHRoZSBkZXZpY2VzCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfR0VUX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpICYgKChfX0lOVEVSUlVQVF9fKT4+IDRVKSkgIT0gUkVTRVQpPyBTRVQgOiBSRVNFVCkKKworLyoqCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgUlRDIFRhbXBlciBpbnRlcnJ1cHQgaGFzIGJlZW4gZW5hYmxlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgVGFtcGVyIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICBAYXJnIFJUQ19JVF9UQU1QOiBUYW1wZXIgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgKCgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlRBRkNSKSAmIChfX0lOVEVSUlVQVF9fKSkgIT0gUkVTRVQpID8gU0VUIDogUkVTRVQpCisKKyAvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgc2VsZWN0ZWQgUlRDIFRhbXBlcidzIGZsYWcgc3RhdHVzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIFJUQyBUYW1wZXIgRmxhZyBpcyBwZW5kaW5nIG9yIG5vdC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICAgQGFyZyBSVENfRkxBR19UQU1QMUYKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19GTEFHX1RBTVAyRgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfVEFNUDNGICgqKQorICAqIEBub3RlICAgKCopIFJUQ19GTEFHX1RBTVAzRiBub3QgcHJlc2VudCBvbiBhbGwgdGhlIGRldmljZXMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAgICAgICAgICAgICAoKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSKSAmIChfX0ZMQUdfXykpICE9IFJFU0VUKT8gU0VUIDogUkVTRVQpCisKKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgUlRDIFRhbXBlcidzIHBlbmRpbmcgZmxhZ3MuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgUlRDIFRhbXBlciBGbGFnIHRvIGNsZWFyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19GTEFHX1RBTVAxRgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfVEFNUDJGCisgICogICAgICAgICAgICAgQGFyZyBSVENfRkxBR19UQU1QM0YgKCopCisgICogQG5vdGUgICAoKikgUlRDX0ZMQUdfVEFNUDNGIG5vdCBwcmVzZW50IG9uIGFsbCB0aGUgZGV2aWNlcworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUikgPSAofigoX19GTEFHX18pIHwgUlRDX0lTUl9JTklUKXwoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSICYgUlRDX0lTUl9JTklUKSkKKyAKKyAKKy8qKgorICAqIEB9CisgICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVEFNUEVSL1RJTUVTVEFNUC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ0V4X1RhbXBlcl9UaW1lc3RhbXAgRVhUSSBSVEMgRXh0ZW5kZWQgVGFtcGVyIFRpbWVzdGFtcCBFWFRJCisgICogQHsKKyAgKi8KKyAgCisvKiBUQU1QRVIgVElNRVNUQU1QIEVYVEkgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoqCisgICogQGJyaWVmICBFbmFibGUgaW50ZXJydXB0IG9uIHRoZSBSVEMgVGFtcGVyIGFuZCBUaW1lc3RhbXAgYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfRU5BQkxFX0lUKCkgICAgICAgIChFWFRJLT5JTVIgfD0gUlRDX0VYVElfTElORV9UQU1QRVJfVElNRVNUQU1QX0VWRU5UKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgaW50ZXJydXB0IG9uIHRoZSBSVEMgVGFtcGVyIGFuZCBUaW1lc3RhbXAgYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfRElTQUJMRV9JVCgpICAgICAgIChFWFRJLT5JTVIgJj0gfihSVENfRVhUSV9MSU5FX1RBTVBFUl9USU1FU1RBTVBfRVZFTlQpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBldmVudCBvbiB0aGUgUlRDIFRhbXBlciBhbmQgVGltZXN0YW1wIGFzc29jaWF0ZWQgRXh0aSBsaW5lLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9FTkFCTEVfRVZFTlQoKSAgICAoRVhUSS0+RU1SIHw9IFJUQ19FWFRJX0xJTkVfVEFNUEVSX1RJTUVTVEFNUF9FVkVOVCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGV2ZW50IG9uIHRoZSBSVEMgVGFtcGVyIGFuZCBUaW1lc3RhbXAgYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX1RJTUVTVEFNUF9FWFRJX0RJU0FCTEVfRVZFTlQoKSAgIChFWFRJLT5FTVIgJj0gfihSVENfRVhUSV9MSU5FX1RBTVBFUl9USU1FU1RBTVBfRVZFTlQpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBmYWxsaW5nIGVkZ2UgdHJpZ2dlciBvbiB0aGUgUlRDIFRhbXBlciBhbmQgVGltZXN0YW1wIGFzc29jaWF0ZWQgRXh0aSBsaW5lLiAKKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpICAgKEVYVEktPkZUU1IgfD0gUlRDX0VYVElfTElORV9UQU1QRVJfVElNRVNUQU1QX0VWRU5UKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgZmFsbGluZyBlZGdlIHRyaWdnZXIgb24gdGhlIFJUQyBUYW1wZXIgYW5kIFRpbWVzdGFtcCBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSAgKEVYVEktPkZUU1IgJj0gfihSVENfRVhUSV9MSU5FX1RBTVBFUl9USU1FU1RBTVBfRVZFTlQpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSByaXNpbmcgZWRnZSB0cmlnZ2VyIG9uIHRoZSBSVEMgVGFtcGVyIGFuZCBUaW1lc3RhbXAgYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX1RJTUVTVEFNUF9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpICAgIChFWFRJLT5SVFNSIHw9IFJUQ19FWFRJX0xJTkVfVEFNUEVSX1RJTUVTVEFNUF9FVkVOVCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHJpc2luZyBlZGdlIHRyaWdnZXIgb24gdGhlIFJUQyBUYW1wZXIgYW5kIFRpbWVzdGFtcCBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpICAgKEVYVEktPlJUU1IgJj0gfihSVENfRVhUSV9MSU5FX1RBTVBFUl9USU1FU1RBTVBfRVZFTlQpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSByaXNpbmcgJiBmYWxsaW5nIGVkZ2UgdHJpZ2dlciBvbiB0aGUgUlRDIFRhbXBlciBhbmQgVGltZXN0YW1wIGFzc29jaWF0ZWQgRXh0aSBsaW5lLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9FTkFCTEVfUklTSU5HX0ZBTExJTkdfRURHRSgpIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7X19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCk7CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSByaXNpbmcgJiBmYWxsaW5nIGVkZ2UgdHJpZ2dlciBvbiB0aGUgUlRDIFRhbXBlciBhbmQgVGltZXN0YW1wIGFzc29jaWF0ZWQgRXh0aSBsaW5lLgorICAqIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfRElTQUJMRV9SSVNJTkdfRkFMTElOR19FREdFKCkgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCk7X19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpOworCisvKioKKyAgKiBAYnJpZWYgQ2hlY2sgd2hldGhlciB0aGUgUlRDIFRhbXBlciBhbmQgVGltZXN0YW1wIGFzc29jaWF0ZWQgRXh0aSBsaW5lIGludGVycnVwdCBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHJldHZhbCBMaW5lIFN0YXR1cy4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9HRVRfRkxBRygpICAgICAgICAgKEVYVEktPlBSICYgUlRDX0VYVElfTElORV9UQU1QRVJfVElNRVNUQU1QX0VWRU5UKQorCisvKioKKyAgKiBAYnJpZWYgQ2xlYXIgdGhlIFJUQyBUYW1wZXIgYW5kIFRpbWVzdGFtcCBhc3NvY2lhdGVkIEV4dGkgbGluZSBmbGFnLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9DTEVBUl9GTEFHKCkgICAgICAgKEVYVEktPlBSID0gUlRDX0VYVElfTElORV9UQU1QRVJfVElNRVNUQU1QX0VWRU5UKQorCisvKioKKyAgKiBAYnJpZWYgR2VuZXJhdGUgYSBTb2Z0d2FyZSBpbnRlcnJ1cHQgb24gdGhlIFJUQyBUYW1wZXIgYW5kIFRpbWVzdGFtcCBhc3NvY2lhdGVkIEV4dGkgbGluZQorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9HRU5FUkFURV9TV0lUKCkgICAgKEVYVEktPlNXSUVSIHw9IFJUQ19FWFRJX0xJTkVfVEFNUEVSX1RJTUVTVEFNUF9FVkVOVCkKKy8qKgorICAqIEB9CisgICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUNhbGlicmF0aW9uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ0V4X0NhbGlicmF0aW9uIFJUQyBFeHRlbmRlZCBDYWxpYnJhdGlvbgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBSVEMgY2FsaWJyYXRpb24gb3V0cHV0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19DQUxJQlJBVElPTl9PVVRQVVRfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gKFJUQ19DUl9DT0UpKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIGNhbGlicmF0aW9uIG91dHB1dC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfQ0FMSUJSQVRJT05fT1VUUFVUX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9IH4oUlRDX0NSX0NPRSkpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBjbG9jayByZWZlcmVuY2UgZGV0ZWN0aW9uLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19DTE9DS1JFRl9ERVRFQ1RJT05fRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gKFJUQ19DUl9SRUZDS09OKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBjbG9jayByZWZlcmVuY2UgZGV0ZWN0aW9uLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19DTE9DS1JFRl9ERVRFQ1RJT05fRElTQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgJj0gfihSVENfQ1JfUkVGQ0tPTikpCisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBzZWxlY3RlZCBSVEMgc2hpZnQgb3BlcmF0aW9uJ3MgZmxhZyBzdGF0dXMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgUlRDIHNoaWZ0IG9wZXJhdGlvbiBGbGFnIGlzIHBlbmRpbmcgb3Igbm90LgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19GTEFHX1NIUEYgICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1NISUZUX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgICAgICAgICAoKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSKSAmIChfX0ZMQUdfXykpICE9IFJFU0VUKT8gU0VUIDogUkVTRVQpCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSVENFeF9FeHBvcnRlZF9GdW5jdGlvbnMgUlRDRXggRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyogUlRDIFRpbWVTdGFtcCBhbmQgVGFtcGVyIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAZGVmZ3JvdXAgUlRDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBSVEMgVGltZVN0YW1wIGFuZCBUYW1wZXIgZnVuY3Rpb25zCisgKiBAeworICovIAorCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0VGltZVN0YW1wKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lU3RhbXBFZGdlLCB1aW50MzJfdCBSVENfVGltZVN0YW1wUGluKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRUaW1lU3RhbXBfSVQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IFRpbWVTdGFtcEVkZ2UsIHVpbnQzMl90IFJUQ19UaW1lU3RhbXBQaW4pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X0RlYWN0aXZhdGVUaW1lU3RhbXAoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X0dldFRpbWVTdGFtcChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgUlRDX1RpbWVUeXBlRGVmICpzVGltZVN0YW1wLCBSVENfRGF0ZVR5cGVEZWYgKnNUaW1lU3RhbXBEYXRlLCB1aW50MzJfdCBGb3JtYXQpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0VGFtcGVyKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfVGFtcGVyVHlwZURlZiogc1RhbXBlcik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0VGFtcGVyX0lUKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfVGFtcGVyVHlwZURlZiogc1RhbXBlcik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfRGVhY3RpdmF0ZVRhbXBlcihSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgVGFtcGVyKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SVENFeF9UYW1wZXJUaW1lU3RhbXBJUlFIYW5kbGVyKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKKwordm9pZCAgICAgICAgICAgICAgSEFMX1JUQ0V4X1RhbXBlcjFFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SVENFeF9UYW1wZXIyRXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7Cit2b2lkICAgICAgICAgICAgICBIQUxfUlRDRXhfVGFtcGVyM0V2ZW50Q2FsbGJhY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOwordm9pZCAgICAgICAgICAgICAgSEFMX1JUQ0V4X1RpbWVTdGFtcEV2ZW50Q2FsbGJhY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1BvbGxGb3JUaW1lU3RhbXBFdmVudChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfUG9sbEZvclRhbXBlcjFFdmVudChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfUG9sbEZvclRhbXBlcjJFdmVudChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfUG9sbEZvclRhbXBlcjNFdmVudChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgVGltZW91dCk7CisvKioKKyAgKiBAfQorICAqLworIAorLyogUlRDIFdha2UtdXAgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAZGVmZ3JvdXAgUlRDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBFeHRlbmRlZCBSVEMgV2FrZS11cCBmdW5jdGlvbnMKKyAqIEB7CisgKi8gCisgCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0V2FrZVVwVGltZXIoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IFdha2VVcENvdW50ZXIsIHVpbnQzMl90IFdha2VVcENsb2NrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRXYWtlVXBUaW1lcl9JVChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgV2FrZVVwQ291bnRlciwgdWludDMyX3QgV2FrZVVwQ2xvY2spOwordWludDMyX3QgICAgICAgICAgSEFMX1JUQ0V4X0RlYWN0aXZhdGVXYWtlVXBUaW1lcihSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7Cit1aW50MzJfdCAgICAgICAgICBIQUxfUlRDRXhfR2V0V2FrZVVwVGltZXIoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOwordm9pZCAgICAgICAgICAgICAgSEFMX1JUQ0V4X1dha2VVcFRpbWVySVJRSGFuZGxlcihSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7Cit2b2lkICAgICAgICAgICAgICBIQUxfUlRDRXhfV2FrZVVwVGltZXJFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9Qb2xsRm9yV2FrZVVwVGltZXJFdmVudChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgVGltZW91dCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHRlbmRlZCBDb250cm9sIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGRlZmdyb3VwIFJUQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICogQHsKKyAqLyAKKwordm9pZCAgICAgICAgICAgICAgSEFMX1JUQ0V4X0JLVVBXcml0ZShSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgQmFja3VwUmVnaXN0ZXIsIHVpbnQzMl90IERhdGEpOwordWludDMyX3QgICAgICAgICAgSEFMX1JUQ0V4X0JLVVBSZWFkKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBCYWNrdXBSZWdpc3Rlcik7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRTbW9vdGhDYWxpYihSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgU21vb3RoQ2FsaWJQZXJpb2QsIHVpbnQzMl90IFNtb290aENhbGliUGx1c1B1bHNlcywgdWludDMyX3QgU21vb3RoQ2FsaWJNaW51c1B1bHNlc1ZhbHVlKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRTeW5jaHJvU2hpZnQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IFNoaWZ0QWRkMVMsIHVpbnQzMl90IFNoaWZ0U3ViRlMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1NldENhbGlicmF0aW9uT3V0UHV0KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBDYWxpYk91dHB1dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfRGVhY3RpdmF0ZUNhbGlicmF0aW9uT3V0UHV0KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRSZWZDbG9jayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfRGVhY3RpdmF0ZVJlZkNsb2NrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9FbmFibGVCeXBhc3NTaGFkb3coUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X0Rpc2FibGVCeXBhc3NTaGFkb3coUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXh0ZW5kZWQgUlRDIGZlYXR1cmVzIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBkZWZncm91cCBSVENFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IEV4dGVuZGVkIGZlYXR1cmVzIGZ1bmN0aW9ucworICogQHsKKyAqLyAKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SVENFeF9BbGFybUJFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsgCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfUG9sbEZvckFsYXJtQkV2ZW50KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lb3V0KTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ0V4X1ByaXZhdGVfTWFjcm9zIFJUQ0V4IFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENFeF9JU19SVENfRGVmaW5pdGlvbnMgUHJpdmF0ZSBtYWNyb3MgdG8gY2hlY2sgaW5wdXQgcGFyYW1ldGVycworICAqIEB7CisgICovIAorI2RlZmluZSBJU19SVENfT1VUUFVUKE9VVFBVVCkgKCgoT1VUUFVUKSA9PSBSVENfT1VUUFVUX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gUlRDX09VVFBVVF9BTEFSTUEpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPVVRQVVQpID09IFJUQ19PVVRQVVRfQUxBUk1CKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBSVENfT1VUUFVUX1dBS0VVUCkpCisKKyNkZWZpbmUgSVNfUlRDX0JLUChCS1ApICAgICAgICAgICAgICAgICAgICgoQktQKSA8ICh1aW50MzJfdCkgUlRDX0JLUF9OVU1CRVIpCisKKyNkZWZpbmUgSVNfVElNRVNUQU1QX0VER0UoRURHRSkgKCgoRURHRSkgPT0gUlRDX1RJTUVTVEFNUEVER0VfUklTSU5HKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVER0UpID09IFJUQ19USU1FU1RBTVBFREdFX0ZBTExJTkcpKQorCisjZGVmaW5lIElTX1JUQ19UQU1QRVIoVEFNUEVSKSAoKCgoVEFNUEVSKSAmIDB4RkZGRkZGRDZVKSA9PSAweDAwVSkgJiYgKChUQU1QRVIpICE9ICh1aW50MzJfdClSRVNFVCkpCisKKworI2RlZmluZSBJU19SVENfVElNRVNUQU1QX1BJTihQSU4pICgoKFBJTikgPT0gUlRDX1RJTUVTVEFNUFBJTl9ERUZBVUxUKSkKKworCisjZGVmaW5lIElTX1JUQ19UQU1QRVJfVFJJR0dFUihUUklHR0VSKSAoKChUUklHR0VSKSA9PSBSVENfVEFNUEVSVFJJR0dFUl9SSVNJTkdFREdFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBSVENfVEFNUEVSVFJJR0dFUl9GQUxMSU5HRURHRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFJJR0dFUikgPT0gUlRDX1RBTVBFUlRSSUdHRVJfTE9XTEVWRUwpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IFJUQ19UQU1QRVJUUklHR0VSX0hJR0hMRVZFTCkpIAorI2RlZmluZSBJU19SVENfVEFNUEVSX0ZJTFRFUihGSUxURVIpICAoKChGSUxURVIpID09IFJUQ19UQU1QRVJGSUxURVJfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGSUxURVIpID09IFJUQ19UQU1QRVJGSUxURVJfMlNBTVBMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGSUxURVIpID09IFJUQ19UQU1QRVJGSUxURVJfNFNBTVBMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGSUxURVIpID09IFJUQ19UQU1QRVJGSUxURVJfOFNBTVBMRSkpCisjZGVmaW5lIElTX1JUQ19UQU1QRVJfU0FNUExJTkdfRlJFUShGUkVRKSAoKChGUkVRKSA9PSBSVENfVEFNUEVSU0FNUExJTkdGUkVRX1JUQ0NMS19ESVYzMjc2OCl8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGUkVRKSA9PSBSVENfVEFNUEVSU0FNUExJTkdGUkVRX1JUQ0NMS19ESVYxNjM4NCl8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGUkVRKSA9PSBSVENfVEFNUEVSU0FNUExJTkdGUkVRX1JUQ0NMS19ESVY4MTkyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGUkVRKSA9PSBSVENfVEFNUEVSU0FNUExJTkdGUkVRX1JUQ0NMS19ESVY0MDk2KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGUkVRKSA9PSBSVENfVEFNUEVSU0FNUExJTkdGUkVRX1JUQ0NMS19ESVYyMDQ4KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGUkVRKSA9PSBSVENfVEFNUEVSU0FNUExJTkdGUkVRX1JUQ0NMS19ESVYxMDI0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGUkVRKSA9PSBSVENfVEFNUEVSU0FNUExJTkdGUkVRX1JUQ0NMS19ESVY1MTIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGUkVRKSA9PSBSVENfVEFNUEVSU0FNUExJTkdGUkVRX1JUQ0NMS19ESVYyNTYpKQorI2RlZmluZSBJU19SVENfVEFNUEVSX1BSRUNIQVJHRV9EVVJBVElPTihEVVJBVElPTikgKCgoRFVSQVRJT04pID09IFJUQ19UQU1QRVJQUkVDSEFSR0VEVVJBVElPTl8xUlRDQ0xLKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChEVVJBVElPTikgPT0gUlRDX1RBTVBFUlBSRUNIQVJHRURVUkFUSU9OXzJSVENDTEspIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERVUkFUSU9OKSA9PSBSVENfVEFNUEVSUFJFQ0hBUkdFRFVSQVRJT05fNFJUQ0NMSykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRFVSQVRJT04pID09IFJUQ19UQU1QRVJQUkVDSEFSR0VEVVJBVElPTl84UlRDQ0xLKSkKKyNkZWZpbmUgSVNfUlRDX1RBTVBFUl9USU1FU1RBTVBPTlRBTVBFUl9ERVRFQ1RJT04oREVURUNUSU9OKSAoKChERVRFQ1RJT04pID09IFJUQ19USU1FU1RBTVBPTlRBTVBFUkRFVEVDVElPTl9FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChERVRFQ1RJT04pID09IFJUQ19USU1FU1RBTVBPTlRBTVBFUkRFVEVDVElPTl9ESVNBQkxFKSkKKyNkZWZpbmUgSVNfUlRDX1RBTVBFUl9QVUxMVVBfU1RBVEUoU1RBVEUpICgoKFNUQVRFKSA9PSBSVENfVEFNUEVSX1BVTExVUF9FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQVRFKSA9PSBSVENfVEFNUEVSX1BVTExVUF9ESVNBQkxFKSkKKyNkZWZpbmUgSVNfUlRDX1dBS0VVUF9DTE9DSyhDTE9DSykgKCgoQ0xPQ0spID09IFJUQ19XQUtFVVBDTE9DS19SVENDTEtfRElWMTYpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDTE9DSykgPT0gUlRDX1dBS0VVUENMT0NLX1JUQ0NMS19ESVY4KSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENMT0NLKSA9PSBSVENfV0FLRVVQQ0xPQ0tfUlRDQ0xLX0RJVjQpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0xPQ0spID09IFJUQ19XQUtFVVBDTE9DS19SVENDTEtfRElWMikgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDTE9DSykgPT0gUlRDX1dBS0VVUENMT0NLX0NLX1NQUkVfMTZCSVRTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENMT0NLKSA9PSBSVENfV0FLRVVQQ0xPQ0tfQ0tfU1BSRV8xN0JJVFMpKQorCisjZGVmaW5lIElTX1JUQ19XQUtFVVBfQ09VTlRFUihDT1VOVEVSKSAgKChDT1VOVEVSKSA8PSAweEZGRkZVKQorCisKKyNkZWZpbmUgSVNfUlRDX1NNT09USF9DQUxJQl9QRVJJT0QoUEVSSU9EKSAoKChQRVJJT0QpID09IFJUQ19TTU9PVEhDQUxJQl9QRVJJT0RfMzJTRUMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJT0QpID09IFJUQ19TTU9PVEhDQUxJQl9QRVJJT0RfMTZTRUMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJT0QpID09IFJUQ19TTU9PVEhDQUxJQl9QRVJJT0RfOFNFQykpIAorI2RlZmluZSBJU19SVENfU01PT1RIX0NBTElCX1BMVVMoUExVUykgKCgoUExVUykgPT0gUlRDX1NNT09USENBTElCX1BMVVNQVUxTRVNfU0VUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQTFVTKSA9PSBSVENfU01PT1RIQ0FMSUJfUExVU1BVTFNFU19SRVNFVCkpCisKKworI2RlZmluZSAgSVNfUlRDX1NNT09USF9DQUxJQl9NSU5VUyhWQUxVRSkgKChWQUxVRSkgPD0gMHgwMDAwMDFGRlUpCisjZGVmaW5lIElTX1JUQ19TSElGVF9BREQxUyhTRUwpICgoKFNFTCkgPT0gUlRDX1NISUZUQUREMVNfUkVTRVQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0VMKSA9PSBSVENfU0hJRlRBREQxU19TRVQpKSAKKyNkZWZpbmUgSVNfUlRDX1NISUZUX1NVQkZTKEZTKSAoKEZTKSA8PSAweDAwMDA3RkZGVSkKKyNkZWZpbmUgSVNfUlRDX0NBTElCX09VVFBVVChPVVRQVVQpICAoKChPVVRQVVQpID09IFJUQ19DQUxJQk9VVFBVVF81MTJIWikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gUlRDX0NBTElCT1VUUFVUXzFIWikpCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqCisgICogQH0KKyAgKi8gCisgIAorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJGM3h4X0hBTF9SVENfRVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjN4eF9oYWxfc2RhZGMuaCBiL0luYy9zdG0zMmYzeHhfaGFsX3NkYWRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBhOGViZgotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmYzeHhfaGFsX3NkYWRjLmgKQEAgLTAsMCArMSw3MDQgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX3NkYWRjLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgdGhlIGZ1bmN0aW9ucyBwcm90b3R5cGVzIGZvciB0aGUgU0RBREMKKyAgKiAgICAgICAgICBmaXJtd2FyZSBsaWJyYXJ5LgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkYzeHhfU0RBRENfSAorI2RlZmluZSBfX1NUTTMyRjN4eF9TREFEQ19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBTREFEQworICAqIEB7CisgICovIAorCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTREFEQ19FeHBvcnRlZF9UeXBlcyBTREFEQyBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKworLyoqIAorICAqIEBicmllZiAgSEFMIFNEQURDIFN0YXRlcyBkZWZpbml0aW9uICAKKyAgKi8gCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX1NEQURDX1NUQVRFX1JFU0VUICAgICAgICAgICAgICAgICAgID0gMHgwMFUsICAgIC8qITwgU0RBREMgbm90IGluaXRpYWxpemVkICovCisgIEhBTF9TREFEQ19TVEFURV9SRUFEWSAgICAgICAgICAgICAgICAgICA9IDB4MDFVLCAgICAvKiE8IFNEQURDIGluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICovCisgIEhBTF9TREFEQ19TVEFURV9DQUxJQiAgICAgICAgICAgICAgICAgICA9IDB4MDJVLCAgICAvKiE8IFNEQURDIGNhbGlicmF0aW9uIGluIHByb2dyZXNzICovCisgIEhBTF9TREFEQ19TVEFURV9SRUcgICAgICAgICAgICAgICAgICAgICA9IDB4MDNVLCAgICAvKiE8IFNEQURDIHJlZ3VsYXIgY29udmVyc2lvbiBpbiBwcm9ncmVzcyAqLworICBIQUxfU0RBRENfU1RBVEVfSU5KICAgICAgICAgICAgICAgICAgICAgPSAweDA0VSwgICAgLyohPCBTREFEQyBpbmplY3RlZCBjb252ZXJzaW9uIGluIHByb2dyZXNzICovCisgIEhBTF9TREFEQ19TVEFURV9SRUdfSU5KICAgICAgICAgICAgICAgICA9IDB4MDVVLCAgICAvKiE8IFNEQURDIHJlZ3VsYXIgYW5kIGluamVjdGVkIGNvbnZlcnNpb25zIGluIHByb2dyZXNzICovCisgIEhBTF9TREFEQ19TVEFURV9FUlJPUiAgICAgICAgICAgICAgICAgICA9IDB4RkZVLCAgICAvKiE8IFNEQURDIHN0YXRlIGVycm9yICovCit9SEFMX1NEQURDX1N0YXRlVHlwZURlZjsKKyAgIAorLyoqIAorICAqIEBicmllZiBTREFEQyBJbml0IFN0cnVjdHVyZSBkZWZpbml0aW9uICAKKyAgKi8gCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBJZGxlTG93UG93ZXJNb2RlOyAgICAgICAgLyohPCBTcGVjaWZpZXMgaWYgU0RBREMgY2FuIGVudGVyIGluIHBvd2VyIGRvd24gb3Igc3RhbmRieSB3aGVuIGlkbGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU0RBRENfSWRsZV9Mb3dfUG93ZXJfTW9kZSAqLworICB1aW50MzJfdCBGYXN0Q29udmVyc2lvbk1vZGU7ICAgICAgLyohPCBTcGVjaWZpZXMgaWYgRmFzdCBjb252ZXJzaW9uIG1vZGUgaXMgZW5hYmxlZCBvciBub3QuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNEQURDX0Zhc3RfQ29udl9Nb2RlICovCisgIHVpbnQzMl90IFNsb3dDbG9ja01vZGU7ICAgICAgICAgICAvKiE8IFNwZWNpZmllcyBpZiBzbG93IGNsb2NrIG1vZGUgaXMgZW5hYmxlZCBvciBub3QuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNEQURDX1Nsb3dfQ2xvY2tfTW9kZSAqLworICB1aW50MzJfdCBSZWZlcmVuY2VWb2x0YWdlOyAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHJlZmVyZW5jZSB2b2x0YWdlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBUaGlzIHBhcmFtZXRlciBpcyBjb21tb24gdG8gYWxsIFNEQURDIGluc3RhbmNlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTREFEQ19SZWZlcmVuY2VfVm9sdGFnZSAqLworfVNEQURDX0luaXRUeXBlRGVmOworCisvKiogCisgICogQGJyaWVmICBTREFEQyBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24gIAorICAqLyAgCit0eXBlZGVmIHN0cnVjdAoreworICBTREFEQ19UeXBlRGVmICAgICAgICAgICAgKkluc3RhbmNlOyAgICAgICAgICAgLyohPCBTREFEQyByZWdpc3RlcnMgYmFzZSBhZGRyZXNzICovCisgIFNEQURDX0luaXRUeXBlRGVmICAgICAgICBJbml0OyAgICAgICAgICAgICAgICAvKiE8IFNEQURDIGluaXQgcGFyYW1ldGVycyAgICAgICAgKi8KKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICpoZG1hOyAgICAgICAgICAgICAgIC8qITwgU0RBREMgRE1BIEhhbmRsZSBwYXJhbWV0ZXJzICAqLworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgUmVndWxhckNvbnRNb2RlOyAgICAgLyohPCBSZWd1bGFyIGNvbnZlcnNpb24gY29udGludW91cyBtb2RlICovCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBJbmplY3RlZENvbnRNb2RlOyAgICAvKiE8IEluamVjdGVkIGNvbnZlcnNpb24gY29udGludW91cyBtb2RlICovCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBJbmplY3RlZENoYW5uZWxzTmJyOyAvKiE8IE51bWJlciBvZiBjaGFubmVscyBpbiBpbmplY3RlZCBzZXF1ZW5jZSAqLworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgSW5qQ29udlJlbWFpbmluZzsgICAgLyohPCBJbmplY3RlZCBjb252ZXJzaW9uIHJlbWFpbmluZyAqLworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgUmVndWxhclRyaWdnZXI7ICAgICAgLyohPCBDdXJyZW50IHRyaWdnZXIgdXNlZCBmb3IgcmVndWxhciBjb252ZXJzaW9uICovCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBJbmplY3RlZFRyaWdnZXI7ICAgICAvKiE8IEN1cnJlbnQgdHJpZ2dlciB1c2VkIGZvciBpbmplY3RlZCBjb252ZXJzaW9uICovCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBFeHRUcmlnZ2VyRWRnZTsgICAgICAvKiE8IFJpc2luZywgZmFsbGluZyBvciBib3RoIGVkZ2VzIHNlbGVjdGVkICovCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBSZWd1bGFyTXVsdGltb2RlOyAgICAvKiE8IGN1cnJlbnQgdHlwZSBvZiByZWd1bGFyIG11bHRpbW9kZSAqLworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgSW5qZWN0ZWRNdWx0aW1vZGU7ICAgLyohPCBDdXJyZW50IHR5cGUgb2YgaW5qZWN0ZWQgbXVsdGltb2RlICovCisgIEhBTF9TREFEQ19TdGF0ZVR5cGVEZWYgICBTdGF0ZTsgICAgICAgICAgICAgICAvKiE8IFNEQURDIHN0YXRlICovCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBFcnJvckNvZGU7ICAgICAgICAgICAvKiE8IFNEQURDIEVycm9yIGNvZGUgKi8KK31TREFEQ19IYW5kbGVUeXBlRGVmOworCisvKiogCisgICogQGJyaWVmICBTREFEQyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIFBhcmFtZXRlciBTdHJ1Y3R1cmUgCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBJbnB1dE1vZGU7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGlucHV0IG1vZGUgKHNpbmdsZSBlbmRlZCwgZGlmZmVyZW50aWFsLi4uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgU0RBRENfSW5wdXRNb2RlICovCisgIHVpbnQzMl90IEdhaW47ICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZ2FpbiBzZXR0aW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgU0RBRENfR2FpbiAqLworICB1aW50MzJfdCBDb21tb25Nb2RlOyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGNvbW1vbiBtb2RlIHNldHRpbmcgKFZTU0EsIFZEREEsIFZEREEvMlUpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgU0RBRENfQ29tbW9uTW9kZSAqLworICB1aW50MzJfdCBPZmZzZXQ7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIDEyLWJpdCBvZmZzZXQgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgbG93ZXIgb3IgZXF1YWwgdG8gMHgwMDAwMEZGRlUgKi8KK31TREFEQ19Db25mUGFyYW1UeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFNEQURDX0V4cG9ydGVkX0NvbnN0YW50cyBTREFEQyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFNEQURDX0lkbGVfTG93X1Bvd2VyX01vZGUgU0RBREMgSWRsZSBMb3cgUG93ZXIgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFNEQURDX0xPV1BPV0VSX05PTkUgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKQorI2RlZmluZSBTREFEQ19MT1dQT1dFUl9QT1dFUkRPV04gICAgICAgICAgICAgU0RBRENfQ1IxX1BESQorI2RlZmluZSBTREFEQ19MT1dQT1dFUl9TVEFOREJZICAgICAgICAgICAgICAgU0RBRENfQ1IxX1NCSQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTREFEQ19GYXN0X0NvbnZfTW9kZSBTREFEQyBGYXN0IENvbnZlcnNpb24gTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFNEQURDX0ZBU1RfQ09OVl9ESVNBQkxFICAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKQorI2RlZmluZSBTREFEQ19GQVNUX0NPTlZfRU5BQkxFICAgICAgICAgICAgICAgU0RBRENfQ1IyX0ZBU1QKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU0RBRENfU2xvd19DbG9ja19Nb2RlIFNEQURDIFNsb3cgQ2xvY2sgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFNEQURDX1NMT1dfQ0xPQ0tfRElTQUJMRSAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKQorI2RlZmluZSBTREFEQ19TTE9XX0NMT0NLX0VOQUJMRSAgICAgICAgICAgICAgU0RBRENfQ1IxX1NMT1dDSworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTREFEQ19SZWZlcmVuY2VfVm9sdGFnZSBTREFEQyBSZWZlcmVuY2UgVm9sdGFnZQorICAqIEB7CisgICovCisjZGVmaW5lIFNEQURDX1ZSRUZfRVhUICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAvKiE8IFRoZSByZWZlcmVuY2Ugdm9sdGFnZSBpcyBmb3JjZWQgZXh0ZXJuYWxseSB1c2luZyBWUkVGIHBpbiAqLworI2RlZmluZSBTREFEQ19WUkVGX1ZSRUZJTlQxICAgICAgICAgICAgICAgICAgU0RBRENfQ1IxX1JFRlZfMCAgICAgICAvKiE8IFRoZSByZWZlcmVuY2Ugdm9sdGFnZSBpcyBmb3JjZWQgaW50ZXJuYWxseSB0byAxLjIyViBWUkVGSU5UICovCisjZGVmaW5lIFNEQURDX1ZSRUZfVlJFRklOVDIgICAgICAgICAgICAgICAgICBTREFEQ19DUjFfUkVGVl8xICAgICAgIC8qITwgVGhlIHJlZmVyZW5jZSB2b2x0YWdlIGlzIGZvcmNlZCBpbnRlcm5hbGx5IHRvIDEuOFYgVlJFRklOVCAqLworI2RlZmluZSBTREFEQ19WUkVGX1ZEREEgICAgICAgICAgICAgICAgICAgICAgU0RBRENfQ1IxX1JFRlYgICAgICAgICAvKiE8IFRoZSByZWZlcmVuY2Ugdm9sdGFnZSBpcyBmb3JjZWQgaW50ZXJuYWxseSB0byBWRERBICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNEQURDX0NvbmZJbmRleCBTREFEQyBDb25maWd1cmF0aW9uIEluZGV4CisgICogQHsKKyAgKi8KKyAgCisjZGVmaW5lIFNEQURDX0NPTkZfSU5ERVhfMCAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVUwpIC8qITwgQ29uZmlndXJhdGlvbiAwIFJlZ2lzdGVyIHNlbGVjdGVkICovCisjZGVmaW5lIFNEQURDX0NPTkZfSU5ERVhfMSAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxVSkgLyohPCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgU0RBRENfQ09ORl9JTkRFWF8yICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDJVKSAvKiE8IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlciBzZWxlY3RlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTREFEQ19JbnB1dE1vZGUgU0RBREMgSW5wdXQgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFNEQURDX0lOUFVUX01PREVfRElGRiAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAvKiE8IENvbnZlcnNpb25zIGFyZSBleGVjdXRlZCBpbiBkaWZmZXJlbnRpYWwgbW9kZSAqLworI2RlZmluZSBTREFEQ19JTlBVVF9NT0RFX1NFX09GRlNFVCAgICAgICAgICAgU0RBRENfQ09ORjBSX1NFMF8wICAgICAvKiE8IENvbnZlcnNpb25zIGFyZSBleGVjdXRlZCBpbiBzaW5nbGUgZW5kZWQgb2Zmc2V0IG1vZGUgKi8KKyNkZWZpbmUgU0RBRENfSU5QVVRfTU9ERV9TRV9aRVJPX1JFRkVSRU5DRSAgIFNEQURDX0NPTkYwUl9TRTAgICAgICAgLyohPCBDb252ZXJzaW9ucyBhcmUgZXhlY3V0ZWQgaW4gc2luZ2xlIGVuZGVkIHplcm8tdm9sdCByZWZlcmVuY2UgbW9kZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTREFEQ19HYWluIFNEQURDIEdhaW4KKyAgKiBAeworICAqLworI2RlZmluZSBTREFEQ19HQUlOXzEgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVTCkgIC8qITwgR2FpbiBlcXVhbCB0byAxVSAqLworI2RlZmluZSBTREFEQ19HQUlOXzIgICAgICAgICAgICAgICAgICAgICAgICAgU0RBRENfQ09ORjBSX0dBSU4wXzAgICAgLyohPCBHYWluIGVxdWFsIHRvIDJVICovCisjZGVmaW5lIFNEQURDX0dBSU5fNCAgICAgICAgICAgICAgICAgICAgICAgICBTREFEQ19DT05GMFJfR0FJTjBfMSAgICAvKiE8IEdhaW4gZXF1YWwgdG8gNFUgKi8KKyNkZWZpbmUgU0RBRENfR0FJTl84ICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMzAwMDAwVSkgIC8qITwgR2FpbiBlcXVhbCB0byA4VSAqLworI2RlZmluZSBTREFEQ19HQUlOXzE2ICAgICAgICAgICAgICAgICAgICAgICAgU0RBRENfQ09ORjBSX0dBSU4wXzIgICAgLyohPCBHYWluIGVxdWFsIHRvIDE2VSAqLworI2RlZmluZSBTREFEQ19HQUlOXzMyICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDA1MDAwMDBVKSAgLyohPCBHYWluIGVxdWFsIHRvIDMyVSAqLworI2RlZmluZSBTREFEQ19HQUlOXzFfMiAgICAgICAgICAgICAgICAgICAgICAgU0RBRENfQ09ORjBSX0dBSU4wICAgICAgLyohPCBHYWluIGVxdWFsIHRvIDFVLzJVICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNEQURDX0NvbW1vbk1vZGUgU0RBREMgQ29tbW9uIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBTREFEQ19DT01NT05fTU9ERV9WU1NBICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVTCkgLyohPCBTZWxlY3QgU0RBREMgVlNTQSBhcyBjb21tb24gbW9kZSAqLworI2RlZmluZSBTREFEQ19DT01NT05fTU9ERV9WRERBXzIgICAgICAgICAgICAgU0RBRENfQ09ORjBSX0NPTU1PTjBfMCAvKiE8IFNlbGVjdCBTREFEQyBWRERBLzIgYXMgY29tbW9uIG1vZGUgKi8KKyNkZWZpbmUgU0RBRENfQ09NTU9OX01PREVfVkREQSAgICAgICAgICAgICAgIFNEQURDX0NPTkYwUl9DT01NT04wXzEgLyohPCBTZWxlY3QgU0RBREMgVkREQSBhcyBjb21tb24gbW9kZSAqLworLyoqCisgICogQH0KKyAgKi8KKworCisKKy8qKiBAZGVmZ3JvdXAgU0RBRENfQ2hhbm5lbF9TZWxlY3Rpb24gU0RBREMgQ2hhbm5lbCBTZWxlY3Rpb24KKyAgKiBAeworICAqLworCisvKiBTREFEQyBDaGFubmVscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogVGhlIFNEQURDIGNoYW5uZWxzIGFyZSBkZWZpbmVkIGFzIGZvbGxvd3M6CisgICAtIGluIDE2LWJpdCBMU0IgdGhlIGNoYW5uZWwgbWFzayBpcyBzZXQKKyAgIC0gaW4gMTYtYml0IE1TQiB0aGUgY2hhbm5lbCBudW1iZXIgaXMgc2V0IAorICAgZS5nLiBmb3IgY2hhbm5lbCA1IGRlZmluaXRpb246ICAKKyAgICAgICAgLSB0aGUgY2hhbm5lbCBtYXNrIGlzIDB4MDAwMDAwMjAgKGJpdCA1IGlzIHNldCkgCisgICAgICAgIC0gdGhlIGNoYW5uZWwgbnVtYmVyIDUgaXMgMHgwMDA1MDAwMCAKKyAgICAgICAgLS0+IENvbnNlcXVlbnRseSwgY2hhbm5lbCA1IGRlZmluaXRpb24gaXMgMHgwMDAwMDAyMCB8IDB4MDAwNTAwMDAgPSAweDAwMDUwMDIwICovCisjZGVmaW5lIFNEQURDX0NIQU5ORUxfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxVUwpCisjZGVmaW5lIFNEQURDX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDEwMDAyVUwpCisjZGVmaW5lIFNEQURDX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDIwMDA0VUwpCisjZGVmaW5lIFNEQURDX0NIQU5ORUxfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDMwMDA4VUwpCisjZGVmaW5lIFNEQURDX0NIQU5ORUxfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDQwMDEwVUwpCisjZGVmaW5lIFNEQURDX0NIQU5ORUxfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDUwMDIwVUwpCisjZGVmaW5lIFNEQURDX0NIQU5ORUxfNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDYwMDQwVUwpCisjZGVmaW5lIFNEQURDX0NIQU5ORUxfNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDcwMDgwVUwpCisjZGVmaW5lIFNEQURDX0NIQU5ORUxfOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDgwMTAwVUwpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNEQURDX0NhbGlicmF0aW9uU2VxdWVuY2UgU0RBREMgQ2FsaWJyYXRpb24gU2VxdWVuY2UKKyAgKiBAeworICAqLyAKKyNkZWZpbmUgU0RBRENfQ0FMSUJSQVRJT05fU0VRXzEgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVTCkgLyohPCBPbmUgY2FsaWJyYXRpb24gc2VxdWVuY2UgdG8gY2FsY3VsYXRlIG9mZnNldCBvZiBjb25mMCAoT0ZGU0VUMFsxMTowXSkgKi8KKyNkZWZpbmUgU0RBRENfQ0FMSUJSQVRJT05fU0VRXzIgICAgICAgICAgICAgICAgICAgU0RBRENfQ1IyX0NBTElCQ05UXzAgICAvKiE8IFR3byBjYWxpYnJhdGlvbiBzZXF1ZW5jZXMgdG8gY2FsY3VsYXRlIG9mZnNldCBvZiBjb25mMCBhbmQgY29uZjEgKE9GRlNFVDBbMTE6MF0gYW5kIE9GRlNFVDFbMTE6MF0pICovCisjZGVmaW5lIFNEQURDX0NBTElCUkFUSU9OX1NFUV8zICAgICAgICAgICAgICAgICAgIFNEQURDX0NSMl9DQUxJQkNOVF8xICAgLyohPCBUaHJlZSBjYWxpYnJhdGlvbiBzZXF1ZW5jZXMgdG8gY2FsY3VsYXRlIG9mZnNldCBvZiBjb25mMCwgY29uZjEgYW5kIGNvbmYyIChPRkZTRVQwWzExOjBdLCBPRkZTRVQxWzExOjBdLCBhbmQgT0ZGU0VUMlsxMTowXSkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU0RBRENfQ29udGludW91c01vZGUgU0RBREMgQ29udGludW91cyBNb2RlCisgICogQHsKKyAgKi8gCisjZGVmaW5lIFNEQURDX0NPTlRJTlVPVVNfQ09OVl9PRkYgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAvKiE8IENvbnZlcnNpb24gYXJlIG5vdCBjb250aW51b3VzICovCisjZGVmaW5lIFNEQURDX0NPTlRJTlVPVVNfQ09OVl9PTiAgICAgICAgICAgICAoMHgwMDAwMDAwMVVMKSAvKiE8IENvbnZlcnNpb24gYXJlIGNvbnRpbnVvdXMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU0RBRENfVHJpZ2dlciBTREFEQyBUcmlnZ2VyCisgICogQHsKKyAgKi8gCisjZGVmaW5lIFNEQURDX1NPRlRXQVJFX1RSSUdHRVIgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAvKiE8IFNvZnR3YXJlIHRyaWdnZXIgKi8KKyNkZWZpbmUgU0RBRENfU1lOQ0hST05PVVNfVFJJR0dFUiAgICAgICAgICAgICgweDAwMDAwMDAxVUwpIC8qITwgU3luY2hyb25vdXMgd2l0aCBTREFEQzEgKG9ubHkgZm9yIFNEQURDMiBhbmQgU0RBREMzKSAqLworI2RlZmluZSBTREFEQ19FWFRFUk5BTF9UUklHR0VSICAgICAgICAgICAgICAgKDB4MDAwMDAwMDJVTCkgLyohPCBFeHRlcm5hbCB0cmlnZ2VyICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNEQURDX0luamVjdGVkRXh0VHJpZ2dlciBTREFEQyBJbmplY3RlZCBFeHRlcm5hbCBUcmlnZ2VyCisgICogQHsKKyAgKi8gCisjZGVmaW5lIFNEQURDX0VYVF9UUklHX1RJTTEzX0NDMSAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAvKiE8IFRyaWdnZXIgc291cmNlIGZvciBTREFEQzEgKi8KKyNkZWZpbmUgU0RBRENfRVhUX1RSSUdfVElNMTRfQ0MxICAgICAgICAgICAgICgweDAwMDAwMTAwVUwpIC8qITwgVHJpZ2dlciBzb3VyY2UgZm9yIFNEQURDMSAqLworI2RlZmluZSBTREFEQ19FWFRfVFJJR19USU0xNl9DQzEgICAgICAgICAgICAgKDB4MDAwMDAwMDBVTCkgLyohPCBUcmlnZ2VyIHNvdXJjZSBmb3IgU0RBREMzICovCisjZGVmaW5lIFNEQURDX0VYVF9UUklHX1RJTTE3X0NDMSAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAvKiE8IFRyaWdnZXIgc291cmNlIGZvciBTREFEQzIgKi8KKyNkZWZpbmUgU0RBRENfRVhUX1RSSUdfVElNMTJfQ0MxICAgICAgICAgICAgICgweDAwMDAwMTAwVUwpIC8qITwgVHJpZ2dlciBzb3VyY2UgZm9yIFNEQURDMiAqLworI2RlZmluZSBTREFEQ19FWFRfVFJJR19USU0xMl9DQzIgICAgICAgICAgICAgKDB4MDAwMDAxMDBVTCkgLyohPCBUcmlnZ2VyIHNvdXJjZSBmb3IgU0RBREMzICovCisjZGVmaW5lIFNEQURDX0VYVF9UUklHX1RJTTE1X0NDMiAgICAgICAgICAgICAoMHgwMDAwMDIwMFVMKSAvKiE8IFRyaWdnZXIgc291cmNlIGZvciBTREFEQzEgKi8KKyNkZWZpbmUgU0RBRENfRVhUX1RSSUdfVElNMl9DQzMgICAgICAgICAgICAgICgweDAwMDAwMjAwVUwpIC8qITwgVHJpZ2dlciBzb3VyY2UgZm9yIFNEQURDMiAqLworI2RlZmluZSBTREFEQ19FWFRfVFJJR19USU0yX0NDNCAgICAgICAgICAgICAgKDB4MDAwMDAyMDBVTCkgLyohPCBUcmlnZ2VyIHNvdXJjZSBmb3IgU0RBREMzICovCisjZGVmaW5lIFNEQURDX0VYVF9UUklHX1RJTTNfQ0MxICAgICAgICAgICAgICAoMHgwMDAwMDMwMFVMKSAvKiE8IFRyaWdnZXIgc291cmNlIGZvciBTREFEQzEgKi8KKyNkZWZpbmUgU0RBRENfRVhUX1RSSUdfVElNM19DQzIgICAgICAgICAgICAgICgweDAwMDAwMzAwVUwpIC8qITwgVHJpZ2dlciBzb3VyY2UgZm9yIFNEQURDMiAqLworI2RlZmluZSBTREFEQ19FWFRfVFJJR19USU0zX0NDMyAgICAgICAgICAgICAgKDB4MDAwMDAzMDBVTCkgLyohPCBUcmlnZ2VyIHNvdXJjZSBmb3IgU0RBREMzICovCisjZGVmaW5lIFNEQURDX0VYVF9UUklHX1RJTTRfQ0MxICAgICAgICAgICAgICAoMHgwMDAwMDQwMFVMKSAvKiE8IFRyaWdnZXIgc291cmNlIGZvciBTREFEQzEgKi8KKyNkZWZpbmUgU0RBRENfRVhUX1RSSUdfVElNNF9DQzIgICAgICAgICAgICAgICgweDAwMDAwNDAwVUwpIC8qITwgVHJpZ2dlciBzb3VyY2UgZm9yIFNEQURDMiAqLworI2RlZmluZSBTREFEQ19FWFRfVFJJR19USU00X0NDMyAgICAgICAgICAgICAgKDB4MDAwMDA0MDBVTCkgLyohPCBUcmlnZ2VyIHNvdXJjZSBmb3IgU0RBREMzICovCisjZGVmaW5lIFNEQURDX0VYVF9UUklHX1RJTTE5X0NDMiAgICAgICAgICAgICAoMHgwMDAwMDUwMFVMKSAvKiE8IFRyaWdnZXIgc291cmNlIGZvciBTREFEQzEgKi8KKyNkZWZpbmUgU0RBRENfRVhUX1RSSUdfVElNMTlfQ0MzICAgICAgICAgICAgICgweDAwMDAwNTAwVUwpIC8qITwgVHJpZ2dlciBzb3VyY2UgZm9yIFNEQURDMiAqLworI2RlZmluZSBTREFEQ19FWFRfVFJJR19USU0xOV9DQzQgICAgICAgICAgICAgKDB4MDAwMDA1MDBVTCkgLyohPCBUcmlnZ2VyIHNvdXJjZSBmb3IgU0RBREMzICovCisjZGVmaW5lIFNEQURDX0VYVF9UUklHX0VYVEkxMSAgICAgICAgICAgICAgICAoMHgwMDAwMDcwMFVMKSAvKiE8IFRyaWdnZXIgc291cmNlIGZvciBTREFEQzEsIFNEQURDMiBhbmQgU0RBREMzICovCisjZGVmaW5lIFNEQURDX0VYVF9UUklHX0VYVEkxNSAgICAgICAgICAgICAgICAoMHgwMDAwMDYwMFVMKSAvKiE8IFRyaWdnZXIgc291cmNlIGZvciBTREFEQzEsIFNEQURDMiBhbmQgU0RBREMzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNEQURDX0V4dFRyaWdnZXJFZGdlIFNEQURDIEV4dGVybmFsIFRyaWdnZXIgRWRnZQorICAqIEB7CisgICovIAorI2RlZmluZSBTREFEQ19FWFRfVFJJR19SSVNJTkdfRURHRSAgICAgICAgICAgU0RBRENfQ1IyX0pFWFRFTl8wICAgICAvKiE8IEV4dGVybmFsIHJpc2luZyBlZGdlICovCisjZGVmaW5lIFNEQURDX0VYVF9UUklHX0ZBTExJTkdfRURHRSAgICAgICAgICBTREFEQ19DUjJfSkVYVEVOXzEgICAgIC8qITwgRXh0ZXJuYWwgZmFsbGluZyBlZGdlICovCisjZGVmaW5lIFNEQURDX0VYVF9UUklHX0JPVEhfRURHRVMgICAgICAgICAgICBTREFEQ19DUjJfSkVYVEVOICAgICAgIC8qITwgRXh0ZXJuYWwgcmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2VzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNEQURDX0luamVjdGVkRGVsYXkgU0RBREMgSW5qZWN0ZWQgQ29udmVyc2lvbiBEZWxheQorICAqIEB7CisgICovIAorI2RlZmluZSBTREFEQ19JTkpFQ1RFRF9ERUxBWV9OT05FICAgICAgICAgICAgKDB4MDAwMDAwMDBVTCkgLyohPCBObyBkZWxheSBvbiBpbmplY3RlZCBjb252ZXJzaW9uICovCisjZGVmaW5lIFNEQURDX0lOSkVDVEVEX0RFTEFZICAgICAgICAgICAgICAgICBTREFEQ19DUjJfSkRTICAgICAgICAgIC8qITwgRGVsYXkgb24gaW5qZWN0ZWQgY29udmVyc2lvbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTREFEQ19NdWx0aW1vZGVUeXBlIFNEQURDIE11bHRpbW9kZSBUeXBlCisgICogQHsKKyAgKi8gCisjZGVmaW5lIFNEQURDX01VTFRJTU9ERV9TREFEQzFfU0RBREMyICAgICAgICAoMHgwMDAwMDAwMFVMKSAvKiE8IEdldCBjb252ZXJzaW9uIHZhbHVlcyBmb3IgU0RBREMxIGFuZCBTREFEQzIgKi8KKyNkZWZpbmUgU0RBRENfTVVMVElNT0RFX1NEQURDMV9TREFEQzMgICAgICAgICgweDAwMDAwMDAxVSkgLyohPCBHZXQgY29udmVyc2lvbiB2YWx1ZXMgZm9yIFNEQURDMSBhbmQgU0RBREMzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNEQURDX0Vycm9yQ29kZSBTREFEQyBFcnJvciBDb2RlCisgICogQHsKKyAgKi8gCisjZGVmaW5lIFNEQURDX0VSUk9SX05PTkUgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAvKiE8IE5vIGVycm9yICovCisjZGVmaW5lIFNEQURDX0VSUk9SX1JFR1VMQVJfT1ZFUlJVTiAgICAgICAgICAoMHgwMDAwMDAwMVVMKSAvKiE8IE92ZXJydW4gb2NjdXJzIGR1cmluZyByZWd1bGFyIGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgU0RBRENfRVJST1JfSU5KRUNURURfT1ZFUlJVTiAgICAgICAgICgweDAwMDAwMDAyVUwpIC8qITwgT3ZlcnJ1biBvY2N1cnMgZHVyaW5nIGluamVjdGVkIGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgU0RBRENfRVJST1JfRE1BICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAzVUwpIC8qITwgRE1BIGVycm9yIG9jY3VycyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTREFEQ19pbnRlcnJ1cHRzX2RlZmluaXRpb24gU0RBREMgaW50ZXJydXB0cyBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgIFNEQURDX0lUX0VPQ0FMICAgICBTREFEQ19DUjFfRU9DQUxJRSAgIC8qITwgRW5kIG9mIGNhbGlicmF0aW9uIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgIFNEQURDX0lUX0pFT0MgICAgICBTREFEQ19DUjFfSkVPQ0lFICAgIC8qITwgSW5qZWN0ZWQgZW5kIG9mIGNvbnZlcnNpb24gaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSAgU0RBRENfSVRfSk9WUiAgICAgIFNEQURDX0NSMV9KT1ZSSUUgICAgLyohPCBJbmplY3RlZCBkYXRhIG92ZXJydW4gaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSAgU0RBRENfSVRfUkVPQyAgICAgIFNEQURDX0NSMV9SRU9DSUUgICAgLyohPCBSZWd1bGFyIGVuZCBvZiBjb252ZXJzaW9uIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgIFNEQURDX0lUX1JPVlIgICAgICBTREFEQ19DUjFfUk9WUklFICAgIC8qITwgUmVndWxhciBkYXRhIG92ZXJydW4gaW50ZXJydXB0IGVuYWJsZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTREFEQ19mbGFnc19kZWZpbml0aW9uIFNEQURDIGZsYWdzIGRlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBTREFEQ19GTEFHX0VPQ0FMICAgIFNEQURDX0lTUl9FT0NBTEYgICAgLyohPCBFbmQgb2YgY2FsaWJyYXRpb24gZmxhZyAqLworI2RlZmluZSBTREFEQ19GTEFHX0pFT0MgICAgIFNEQURDX0lTUl9KRU9DRiAgICAgLyohPCBFbmQgb2YgaW5qZWN0ZWQgY29udmVyc2lvbiBmbGFnICovCisjZGVmaW5lIFNEQURDX0ZMQUdfSk9WUiAgICAgU0RBRENfSVNSX0pPVlJGICAgICAvKiE8IEluamVjdGVkIGNvbnZlcnNpb24gb3ZlcnJ1biBmbGFnICovCisjZGVmaW5lIFNEQURDX0ZMQUdfUkVPQyAgICAgU0RBRENfSVNSX1JFT0NGICAgICAvKiE8IEVuZCBvZiByZWd1bGFyIGNvbnZlcnNpb24gZmxhZyAqLworI2RlZmluZSBTREFEQ19GTEFHX1JPVlIgICAgIFNEQURDX0lTUl9ST1ZSRiAgICAgLyohPCBSZWd1bGFyIGNvbnZlcnNpb24gb3ZlcnJ1biBmbGFnICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgCisvKiogQGRlZmdyb3VwIFNEQURDX0V4cG9ydGVkX01hY3JvcyBTREFEQyBFeHBvcnRlZCBNYWNyb3MKKyAqIEB7CisgKi8KKworLyogTWFjcm8gZm9yIGludGVybmFsIEhBTCBkcml2ZXIgdXNhZ2UsIGFuZCBwb3NzaWJseSBjYW4gYmUgdXNlZCBpbnRvIGNvZGUgb2YgKi8KKy8qIGZpbmFsIHVzZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgIAorICAgICAgIAorLyoqIEBicmllZiBFbmFibGUgdGhlIEFEQyBlbmQgb2YgY29udmVyc2lvbiBpbnRlcnJ1cHQuCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQorICAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIEFEQyBJbnRlcnJ1cHQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBTREFEQ19JVF9FT0NBTDogRW5kIG9mIGNhbGlicmF0aW9uIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgU0RBRENfSVRfSkVPQzogSW5qZWN0ZWQgZW5kIG9mIGNvbnZlcnNpb24gaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBTREFEQ19JVF9KT1ZSOiBJbmplY3RlZCBkYXRhIG92ZXJydW4gaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBTREFEQ19JVF9SRU9DOiBSZWd1bGFyIGVuZCBvZiBjb252ZXJzaW9uIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgU0RBRENfSVRfUk9WUjogUmVndWxhciBkYXRhIG92ZXJydW4gaW50ZXJydXB0IGVuYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TREFEQ19FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxLCAoX19JTlRFUlJVUFRfXykpKQorICAgIAorLyoqIEBicmllZiBEaXNhYmxlIHRoZSBBREMgZW5kIG9mIGNvbnZlcnNpb24gaW50ZXJydXB0LgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gX19JTlRFUlJVUFRfXyBBREMgSW50ZXJydXB0CisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgU0RBRENfSVRfRU9DQUw6IEVuZCBvZiBjYWxpYnJhdGlvbiBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIFNEQURDX0lUX0pFT0M6IEluamVjdGVkIGVuZCBvZiBjb252ZXJzaW9uIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgU0RBRENfSVRfSk9WUjogSW5qZWN0ZWQgZGF0YSBvdmVycnVuIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgU0RBRENfSVRfUkVPQzogUmVndWxhciBlbmQgb2YgY29udmVyc2lvbiBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIFNEQURDX0lUX1JPVlI6IFJlZ3VsYXIgZGF0YSBvdmVycnVuIGludGVycnVwdCBlbmFibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU0RBRENfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgICAgICAgICAgICAgICBcCisgIChDTEVBUl9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxLCAoX19JTlRFUlJVUFRfXykpKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBBREMgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gX19JTlRFUlJVUFRfXyBBREMgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjaworICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFNEQURDX0lUX0VPQ0FMOiBFbmQgb2YgY2FsaWJyYXRpb24gaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBTREFEQ19JVF9KRU9DOiBJbmplY3RlZCBlbmQgb2YgY29udmVyc2lvbiBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIFNEQURDX0lUX0pPVlI6IEluamVjdGVkIGRhdGEgb3ZlcnJ1biBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIFNEQURDX0lUX1JFT0M6IFJlZ3VsYXIgZW5kIG9mIGNvbnZlcnNpb24gaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBTREFEQ19JVF9ST1ZSOiBSZWd1bGFyIGRhdGEgb3ZlcnJ1biBpbnRlcnJ1cHQgZW5hYmxlCisgICogQHJldHZhbCBTdGF0ZSBvZiBpbnRlcnJ1cHRpb24gKFNFVCBvciBSRVNFVCkKKyAgKi8KKyNkZWZpbmUgX19IQUxfU0RBRENfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgR2V0IHRoZSBzZWxlY3RlZCBBREMncyBmbGFnIHN0YXR1cy4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHBhcmFtIF9fRkxBR19fIEFEQyBmbGFnCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgU0RBRENfRkxBR19FT0NBTDogRW5kIG9mIGNhbGlicmF0aW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgU0RBRENfRkxBR19KRU9DOiBFbmQgb2YgaW5qZWN0ZWQgY29udmVyc2lvbiBmbGFnCisgICogICAgICAgICAgICBAYXJnIFNEQURDX0ZMQUdfSk9WUjogSW5qZWN0ZWQgY29udmVyc2lvbiBvdmVycnVuIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgU0RBRENfRkxBR19SRU9DOiBFbmQgb2YgcmVndWxhciBjb252ZXJzaW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgU0RBRENfRkxBR19ST1ZSOiBSZWd1bGFyIGNvbnZlcnNpb24gb3ZlcnJ1biBmbGFnCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NEQURDX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpICYgKF9fRkxBR19fKSkgPT0gKF9fRkxBR19fKSkKKyAgICAKKy8qKiBAYnJpZWYgQ2xlYXIgdGhlIEFEQydzIHBlbmRpbmcgZmxhZ3MKKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHBhcmFtIF9fRkxBR19fIEFEQyBmbGFnCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgU0RBRENfRkxBR19FT0NBTDogRW5kIG9mIGNhbGlicmF0aW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgU0RBRENfRkxBR19KRU9DOiBFbmQgb2YgaW5qZWN0ZWQgY29udmVyc2lvbiBmbGFnCisgICogICAgICAgICAgICBAYXJnIFNEQURDX0ZMQUdfSk9WUjogSW5qZWN0ZWQgY29udmVyc2lvbiBvdmVycnVuIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgU0RBRENfRkxBR19SRU9DOiBFbmQgb2YgcmVndWxhciBjb252ZXJzaW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgU0RBRENfRkxBR19ST1ZSOiBSZWd1bGFyIGNvbnZlcnNpb24gb3ZlcnJ1biBmbGFnCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NEQURDX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiwgKF9fRkxBR19fKSkpCisKKy8qKiBAYnJpZWYgIFJlc2V0IFNEQURDIGhhbmRsZSBzdGF0ZQorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBTREFEQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NEQURDX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9TREFEQ19TVEFURV9SRVNFVCkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gIAorLyoqIEBkZWZncm91cCBTREFEQ19Qcml2YXRlX01hY3JvcyBTREFEQyBQcml2YXRlIE1hY3JvcworICogQHsKKyAqLworCisjZGVmaW5lIElTX1NEQURDX0xPV1BPV0VSX01PREUoTE9XUE9XRVIpICAgICAoKChMT1dQT1dFUikgPT0gU0RBRENfTE9XUE9XRVJfTk9ORSkgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMT1dQT1dFUikgPT0gU0RBRENfTE9XUE9XRVJfUE9XRVJET1dOKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMT1dQT1dFUikgPT0gU0RBRENfTE9XUE9XRVJfU1RBTkRCWSkpCisKKyNkZWZpbmUgSVNfU0RBRENfRkFTVF9DT05WX01PREUoRkFTVCkgICAgICAgICgoKEZBU1QpID09IFNEQURDX0ZBU1RfQ09OVl9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGQVNUKSA9PSBTREFEQ19GQVNUX0NPTlZfRU5BQkxFKSkKKworI2RlZmluZSBJU19TREFEQ19TTE9XX0NMT0NLX01PREUoTU9ERSkgICAgICAgKCgoTU9ERSkgPT0gU0RBRENfU0xPV19DTE9DS19ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBTREFEQ19TTE9XX0NMT0NLX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfU0RBRENfVlJFRihWUkVGKSAgICAgICAgICAgICAgICAgICgoKFZSRUYpID09IFNEQURDX1ZSRUZfRVhUKSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZSRUYpID09IFNEQURDX1ZSRUZfVlJFRklOVDEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZSRUYpID09IFNEQURDX1ZSRUZfVlJFRklOVDIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZSRUYpID09IFNEQURDX1ZSRUZfVkREQSkpCisKKyNkZWZpbmUgSVNfU0RBRENfQ09ORl9JTkRFWChDT05GKSAoKChDT05GKSA9PSBTREFEQ19DT05GX0lOREVYXzApICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ09ORikgPT0gU0RBRENfQ09ORl9JTkRFWF8xKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENPTkYpID09IFNEQURDX0NPTkZfSU5ERVhfMikpCisKKyNkZWZpbmUgSVNfU0RBRENfSU5QVVRfTU9ERShNT0RFKSAoKChNT0RFKSA9PSBTREFEQ19JTlBVVF9NT0RFX0RJRkYpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gU0RBRENfSU5QVVRfTU9ERV9TRV9PRkZTRVQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBTREFEQ19JTlBVVF9NT0RFX1NFX1pFUk9fUkVGRVJFTkNFKSkKKworI2RlZmluZSBJU19TREFEQ19HQUlOKEdBSU4pICgoKEdBSU4pID09IFNEQURDX0dBSU5fMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChHQUlOKSA9PSBTREFEQ19HQUlOXzIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoR0FJTikgPT0gU0RBRENfR0FJTl80KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEdBSU4pID09IFNEQURDX0dBSU5fOCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChHQUlOKSA9PSBTREFEQ19HQUlOXzE2KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEdBSU4pID09IFNEQURDX0dBSU5fMzIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoR0FJTikgPT0gU0RBRENfR0FJTl8xXzIpKQorCisjZGVmaW5lIElTX1NEQURDX0NPTU1PTl9NT0RFKE1PREUpICgoKE1PREUpID09IFNEQURDX0NPTU1PTl9NT0RFX1ZTU0EpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBTREFEQ19DT01NT05fTU9ERV9WRERBXzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gU0RBRENfQ09NTU9OX01PREVfVkREQSkpCisKKyNkZWZpbmUgSVNfU0RBRENfT0ZGU0VUX1ZBTFVFKFZBTFVFKSAoKFZBTFVFKSA8PSAweDAwMDAwRkZGVSkKKworLyogSnVzdCBvbmUgY2hhbm5lbCBvZiB0aGUgOSBjaGFubmVscyBjYW4gYmUgc2VsZWN0ZWQgZm9yIHJlZ3VsYXIgY29udmVyc2lvbiAqLworI2RlZmluZSBJU19TREFEQ19SRUdVTEFSX0NIQU5ORUwoQ0hBTk5FTCkgKCgoQ0hBTk5FTCkgPT0gU0RBRENfQ0hBTk5FTF8wKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gU0RBRENfQ0hBTk5FTF8xKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gU0RBRENfQ0hBTk5FTF8yKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gU0RBRENfQ0hBTk5FTF8zKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gU0RBRENfQ0hBTk5FTF80KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gU0RBRENfQ0hBTk5FTF81KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gU0RBRENfQ0hBTk5FTF82KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gU0RBRENfQ0hBTk5FTF83KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gU0RBRENfQ0hBTk5FTF84KSkKKworLyogQW55IG9yIGFsbCBvZiB0aGUgOSBjaGFubmVscyBjYW4gYmUgc2VsZWN0ZWQgZm9yIGluamVjdGVkIGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgSVNfU0RBRENfSU5KRUNURURfQ0hBTk5FTChDSEFOTkVMKSAoKChDSEFOTkVMKSAhPSAwVSkgJiYgKChDSEFOTkVMKSA8PSAweDAwMEYwMUZGVSkpCisKKworI2RlZmluZSBJU19TREFEQ19DQUxJQl9TRVFVRU5DRShTRVFVRU5DRSkgICgoKFNFUVVFTkNFKSA9PSBTREFEQ19DQUxJQlJBVElPTl9TRVFfMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTRVFVRU5DRSkgPT0gU0RBRENfQ0FMSUJSQVRJT05fU0VRXzIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0VRVUVOQ0UpID09IFNEQURDX0NBTElCUkFUSU9OX1NFUV8zKSkKKworI2RlZmluZSBJU19TREFEQ19DT05USU5VT1VTX01PREUoTU9ERSkgICAgICAgKCgoTU9ERSkgPT0gU0RBRENfQ09OVElOVU9VU19DT05WX09GRikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gU0RBRENfQ09OVElOVU9VU19DT05WX09OKSkKKworCisjZGVmaW5lIElTX1NEQURDX1JFR1VMQVJfVFJJR0dFUihUUklHR0VSKSAgICAoKChUUklHR0VSKSA9PSBTREFEQ19TT0ZUV0FSRV9UUklHR0VSKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBTREFEQ19TWU5DSFJPTk9VU19UUklHR0VSKSkKKworI2RlZmluZSBJU19TREFEQ19JTkpFQ1RFRF9UUklHR0VSKFRSSUdHRVIpICAgKCgoVFJJR0dFUikgPT0gU0RBRENfU09GVFdBUkVfVFJJR0dFUikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFJJR0dFUikgPT0gU0RBRENfU1lOQ0hST05PVVNfVFJJR0dFUikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFJJR0dFUikgPT0gU0RBRENfRVhURVJOQUxfVFJJR0dFUikpCisKKworI2RlZmluZSBJU19TREFEQ19FWFRfSU5KRUNfVFJJRyhJTkpUUklHKSAoKChJTkpUUklHKSA9PSBTREFEQ19FWFRfVFJJR19USU0xM19DQzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gU0RBRENfRVhUX1RSSUdfVElNMTRfQ0MxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IFNEQURDX0VYVF9UUklHX1RJTTE2X0NDMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBTREFEQ19FWFRfVFJJR19USU0xN19DQzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gU0RBRENfRVhUX1RSSUdfVElNMTJfQ0MxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IFNEQURDX0VYVF9UUklHX1RJTTEyX0NDMikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gU0RBRENfRVhUX1RSSUdfVElNMTVfQ0MyKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBTREFEQ19FWFRfVFJJR19USU0yX0NDMykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gU0RBRENfRVhUX1RSSUdfVElNMl9DQzQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IFNEQURDX0VYVF9UUklHX1RJTTNfQ0MxKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBTREFEQ19FWFRfVFJJR19USU0zX0NDMikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gU0RBRENfRVhUX1RSSUdfVElNM19DQzMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gU0RBRENfRVhUX1RSSUdfVElNNF9DQzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gU0RBRENfRVhUX1RSSUdfVElNNF9DQzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gU0RBRENfRVhUX1RSSUdfVElNNF9DQzMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gU0RBRENfRVhUX1RSSUdfVElNMTlfQ0MyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IFNEQURDX0VYVF9UUklHX1RJTTE5X0NDMykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBTREFEQ19FWFRfVFJJR19USU0xOV9DQzQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gU0RBRENfRVhUX1RSSUdfRVhUSTExKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IFNEQURDX0VYVF9UUklHX0VYVEkxNSkpCisKKyNkZWZpbmUgSVNfU0RBRENfRVhUX1RSSUdfRURHRShUUklHR0VSKSAgICAgICgoKFRSSUdHRVIpID09IFNEQURDX0VYVF9UUklHX1JJU0lOR19FREdFKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBTREFEQ19FWFRfVFJJR19GQUxMSU5HX0VER0UpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IFNEQURDX0VYVF9UUklHX0JPVEhfRURHRVMpKQorCisKKyNkZWZpbmUgSVNfU0RBRENfSU5KRUNURURfREVMQVkoREVMQVkpICAgICAgICgoKERFTEFZKSA9PSBTREFEQ19JTkpFQ1RFRF9ERUxBWV9OT05FKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERFTEFZKSA9PSBTREFEQ19JTkpFQ1RFRF9ERUxBWSkpCisKKyNkZWZpbmUgSVNfU0RBRENfTVVMVElNT0RFX1RZUEUoVFlQRSkgICAgICAgICgoKFRZUEUpID09IFNEQURDX01VTFRJTU9ERV9TREFEQzFfU0RBREMyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRZUEUpID09IFNEQURDX01VTFRJTU9ERV9TREFEQzFfU0RBREMzKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAKKy8qKiBAYWRkdG9ncm91cCBTREFEQ19FeHBvcnRlZF9GdW5jdGlvbnMgU0RBREMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFNEQURDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RBRENfSW5pdChTREFEQ19IYW5kbGVUeXBlRGVmICpoc2RhZGMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEQURDX0RlSW5pdChTREFEQ19IYW5kbGVUeXBlRGVmICpoc2RhZGMpOwordm9pZCBIQUxfU0RBRENfTXNwSW5pdChTREFEQ19IYW5kbGVUeXBlRGVmKiBoc2RhZGMpOwordm9pZCBIQUxfU0RBRENfTXNwRGVJbml0KFNEQURDX0hhbmRsZVR5cGVEZWYqIGhzZGFkYyk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBTREFEQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIHBlcmlwaGVyYWwgY29udHJvbCBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEQURDX1ByZXBhcmVDaGFubmVsQ29uZmlnKFNEQURDX0hhbmRsZVR5cGVEZWYgKmhzZGFkYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ29uZkluZGV4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTREFEQ19Db25mUGFyYW1UeXBlRGVmKiBDb25mUGFyYW1TdHJ1Y3QpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEQURDX0Fzc29jaWF0ZUNoYW5uZWxDb25maWcoU0RBRENfSGFuZGxlVHlwZURlZiAqaHNkYWRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENvbmZJbmRleCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RBRENfQ29uZmlnQ2hhbm5lbChTREFEQ19IYW5kbGVUeXBlRGVmICpoc2RhZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ29udGludW91c01vZGUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEQURDX0luamVjdGVkQ29uZmlnQ2hhbm5lbChTREFEQ19IYW5kbGVUeXBlRGVmICpoc2RhZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENvbnRpbnVvdXNNb2RlKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TREFEQ19TZWxlY3RJbmplY3RlZEV4dFRyaWdnZXIoU0RBRENfSGFuZGxlVHlwZURlZiAqaHNkYWRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBJbmplY3RlZEV4dFRyaWdnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEV4dFRyaWdnZXJFZGdlKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TREFEQ19TZWxlY3RJbmplY3RlZERlbGF5KFNEQURDX0hhbmRsZVR5cGVEZWYgKmhzZGFkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEluamVjdGVkRGVsYXkpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEQURDX1NlbGVjdFJlZ3VsYXJUcmlnZ2VyKFNEQURDX0hhbmRsZVR5cGVEZWYgKmhzZGFkYywgdWludDMyX3QgVHJpZ2dlcik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RBRENfU2VsZWN0SW5qZWN0ZWRUcmlnZ2VyKFNEQURDX0hhbmRsZVR5cGVEZWYgKmhzZGFkYywgdWludDMyX3QgVHJpZ2dlcik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RBRENfTXVsdGlNb2RlQ29uZmlnQ2hhbm5lbChTREFEQ19IYW5kbGVUeXBlRGVmKiBoc2RhZGMsIHVpbnQzMl90IE11bHRpbW9kZVR5cGUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEQURDX0luamVjdGVkTXVsdGlNb2RlQ29uZmlnQ2hhbm5lbChTREFEQ19IYW5kbGVUeXBlRGVmKiBoc2RhZGMsIHVpbnQzMl90IE11bHRpbW9kZVR5cGUpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgU0RBRENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEQURDX0NhbGlicmF0aW9uU3RhcnQoU0RBRENfSGFuZGxlVHlwZURlZiAqaHNkYWRjLCB1aW50MzJfdCBDYWxpYnJhdGlvblNlcXVlbmNlKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TREFEQ19DYWxpYnJhdGlvblN0YXJ0X0lUKFNEQURDX0hhbmRsZVR5cGVEZWYgKmhzZGFkYywgdWludDMyX3QgQ2FsaWJyYXRpb25TZXF1ZW5jZSk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TREFEQ19TdGFydChTREFEQ19IYW5kbGVUeXBlRGVmICpoc2RhZGMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEQURDX1N0YXJ0X0lUKFNEQURDX0hhbmRsZVR5cGVEZWYgKmhzZGFkYyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RBRENfU3RhcnRfRE1BKFNEQURDX0hhbmRsZVR5cGVEZWYgKmhzZGFkYywgdWludDMyX3QgKnBEYXRhLCB1aW50MzJfdCBMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEQURDX1N0b3AoU0RBRENfSGFuZGxlVHlwZURlZiAqaHNkYWRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TREFEQ19TdG9wX0lUKFNEQURDX0hhbmRsZVR5cGVEZWYgKmhzZGFkYyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RBRENfU3RvcF9ETUEoU0RBRENfSGFuZGxlVHlwZURlZiAqaHNkYWRjKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEQURDX0luamVjdGVkU3RhcnQoU0RBRENfSGFuZGxlVHlwZURlZiAqaHNkYWRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TREFEQ19JbmplY3RlZFN0YXJ0X0lUKFNEQURDX0hhbmRsZVR5cGVEZWYgKmhzZGFkYyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RBRENfSW5qZWN0ZWRTdGFydF9ETUEoU0RBRENfSGFuZGxlVHlwZURlZiAqaHNkYWRjLCB1aW50MzJfdCAqcERhdGEsIHVpbnQzMl90IExlbmd0aCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RBRENfSW5qZWN0ZWRTdG9wKFNEQURDX0hhbmRsZVR5cGVEZWYgKmhzZGFkYyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RBRENfSW5qZWN0ZWRTdG9wX0lUKFNEQURDX0hhbmRsZVR5cGVEZWYgKmhzZGFkYyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RBRENfSW5qZWN0ZWRTdG9wX0RNQShTREFEQ19IYW5kbGVUeXBlRGVmICpoc2RhZGMpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RBRENfTXVsdGlNb2RlU3RhcnRfRE1BKFNEQURDX0hhbmRsZVR5cGVEZWYqIGhzZGFkYywgdWludDMyX3QqIHBEYXRhLCB1aW50MzJfdCBMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEQURDX011bHRpTW9kZVN0b3BfRE1BKFNEQURDX0hhbmRsZVR5cGVEZWYqIGhzZGFkYyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RBRENfSW5qZWN0ZWRNdWx0aU1vZGVTdGFydF9ETUEoU0RBRENfSGFuZGxlVHlwZURlZiogaHNkYWRjLCB1aW50MzJfdCogcERhdGEsIHVpbnQzMl90IExlbmd0aCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RBRENfSW5qZWN0ZWRNdWx0aU1vZGVTdG9wX0RNQShTREFEQ19IYW5kbGVUeXBlRGVmKiBoc2RhZGMpOworCit1aW50MzJfdCBIQUxfU0RBRENfR2V0VmFsdWUoU0RBRENfSGFuZGxlVHlwZURlZiAqaHNkYWRjKTsKK3VpbnQzMl90IEhBTF9TREFEQ19JbmplY3RlZEdldFZhbHVlKFNEQURDX0hhbmRsZVR5cGVEZWYgKmhzZGFkYywgdWludDMyX3QqIENoYW5uZWwpOwordWludDMyX3QgSEFMX1NEQURDX011bHRpTW9kZUdldFZhbHVlKFNEQURDX0hhbmRsZVR5cGVEZWYqIGhzZGFkYyk7Cit1aW50MzJfdCBIQUxfU0RBRENfSW5qZWN0ZWRNdWx0aU1vZGVHZXRWYWx1ZShTREFEQ19IYW5kbGVUeXBlRGVmKiBoc2RhZGMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK3ZvaWQgSEFMX1NEQURDX0lSUUhhbmRsZXIoU0RBRENfSGFuZGxlVHlwZURlZiogaHNkYWRjKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEQURDX1BvbGxGb3JDYWxpYkV2ZW50KFNEQURDX0hhbmRsZVR5cGVEZWYqIGhzZGFkYywgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RBRENfUG9sbEZvckNvbnZlcnNpb24oU0RBRENfSGFuZGxlVHlwZURlZiogaHNkYWRjLCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TREFEQ19Qb2xsRm9ySW5qZWN0ZWRDb252ZXJzaW9uKFNEQURDX0hhbmRsZVR5cGVEZWYqIGhzZGFkYywgdWludDMyX3QgVGltZW91dCk7CisKK3ZvaWQgSEFMX1NEQURDX0NhbGlicmF0aW9uQ3BsdENhbGxiYWNrKFNEQURDX0hhbmRsZVR5cGVEZWYqIGhzZGFkYyk7Cit2b2lkIEhBTF9TREFEQ19Db252SGFsZkNwbHRDYWxsYmFjayhTREFEQ19IYW5kbGVUeXBlRGVmKiBoc2RhZGMpOwordm9pZCBIQUxfU0RBRENfQ29udkNwbHRDYWxsYmFjayhTREFEQ19IYW5kbGVUeXBlRGVmKiBoc2RhZGMpOwordm9pZCBIQUxfU0RBRENfSW5qZWN0ZWRDb252SGFsZkNwbHRDYWxsYmFjayhTREFEQ19IYW5kbGVUeXBlRGVmKiBoc2RhZGMpOwordm9pZCBIQUxfU0RBRENfSW5qZWN0ZWRDb252Q3BsdENhbGxiYWNrKFNEQURDX0hhbmRsZVR5cGVEZWYqIGhzZGFkYyk7Cit2b2lkIEhBTF9TREFEQ19FcnJvckNhbGxiYWNrKFNEQURDX0hhbmRsZVR5cGVEZWYqIGhzZGFkYyk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU0RBRENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU0RBRENfU3RhdGVUeXBlRGVmIEhBTF9TREFEQ19HZXRTdGF0ZShTREFEQ19IYW5kbGVUeXBlRGVmKiBoc2RhZGMpOwordWludDMyX3QgICAgICAgICAgICAgICBIQUxfU0RBRENfR2V0RXJyb3IoU0RBRENfSGFuZGxlVHlwZURlZiogaHNkYWRjKTsKKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gIAorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKl9fU1RNMzJGM3h4X1NEQURDX0ggKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjN4eF9oYWxfc21hcnRjYXJkLmggYi9JbmMvc3RtMzJmM3h4X2hhbF9zbWFydGNhcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjE2OTYxCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjN4eF9oYWxfc21hcnRjYXJkLmgKQEAgLTAsMCArMSwxMDcwIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2hhbF9zbWFydGNhcmQuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgU01BUlRDQVJEIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyRjN4eF9IQUxfU01BUlRDQVJEX0gKKyNkZWZpbmUgX19TVE0zMkYzeHhfSEFMX1NNQVJUQ0FSRF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFNNQVJUQ0FSRAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9FeHBvcnRlZF9UeXBlcyBTTUFSVENBUkQgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgU01BUlRDQVJEIEluaXQgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IEJhdWRSYXRlOyAgICAgICAgICAgICAgICAgIC8qITwgQ29uZmlndXJlcyB0aGUgU21hcnRDYXJkIGNvbW11bmljYXRpb24gYmF1ZCByYXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBiYXVkIHJhdGUgcmVnaXN0ZXIgaXMgY29tcHV0ZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBmb3JtdWxhOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhdWQgUmF0ZSBSZWdpc3RlciA9ICgoUENMS3gpIC8gKChoc21hcnRjYXJkLT5Jbml0LkJhdWRSYXRlKSkpICovCisKKyAgdWludDMyX3QgV29yZExlbmd0aDsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBkYXRhIGJpdHMgdHJhbnNtaXR0ZWQgb3IgcmVjZWl2ZWQgaW4gYSBmcmFtZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBAcmVmIFNNQVJUQ0FSRF9Xb3JkX0xlbmd0aCBjYW4gb25seSBiZSBzZXQgdG8gOSAoOCBkYXRhICsgMSBwYXJpdHkgYml0cykuICovCisKKyAgdWludDMyX3QgU3RvcEJpdHM7ICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzdG9wIGJpdHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTTUFSVENBUkRfU3RvcF9CaXRzLiAqLworCisgIHVpbnQxNl90IFBhcml0eTsgICAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBwYXJpdHkgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQVJUQ0FSRF9QYXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGUgcGFyaXR5IGlzIGVuYWJsZWQgYnkgZGVmYXVsdCAoUENFIGlzIGZvcmNlZCB0byAxVSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2luY2UgdGhlIFdvcmRMZW5ndGggaXMgZm9yY2VkIHRvIDggYml0cyArIHBhcml0eSwgTSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlZCB0byAxIGFuZCB0aGUgcGFyaXR5IGJpdCBpcyB0aGUgOXRoIGJpdC4gKi8KKworICB1aW50MTZfdCBNb2RlOyAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBSZWNlaXZlIG9yIFRyYW5zbWl0IG1vZGUgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQVJUQ0FSRF9Nb2RlICovCisKKyAgdWludDE2X3QgQ0xLUG9sYXJpdHk7ICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHN0ZWFkeSBzdGF0ZSBvZiB0aGUgc2VyaWFsIGNsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJEX0Nsb2NrX1BvbGFyaXR5ICovCisKKyAgdWludDE2X3QgQ0xLUGhhc2U7ICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGNsb2NrIHRyYW5zaXRpb24gb24gd2hpY2ggdGhlIGJpdCBjYXB0dXJlIGlzIG1hZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTTUFSVENBUkRfQ2xvY2tfUGhhc2UgKi8KKworICB1aW50MTZfdCBDTEtMYXN0Qml0OyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBjbG9jayBwdWxzZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBsYXN0IHRyYW5zbWl0dGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBiaXQgKE1TQikgaGFzIHRvIGJlIG91dHB1dCBvbiB0aGUgU0NMSyBwaW4gaW4gc3luY2hyb25vdXMgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQVJUQ0FSRF9MYXN0X0JpdCAqLworCisgIHVpbnQxNl90IE9uZUJpdFNhbXBsaW5nOyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgYSBzaW5nbGUgc2FtcGxlIG9yIHRocmVlIHNhbXBsZXMnIG1ham9yaXR5IHZvdGUgaXMgc2VsZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW5nIHRoZSBzaW5nbGUgc2FtcGxlIG1ldGhvZCBpbmNyZWFzZXMgdGhlIHJlY2VpdmVyIHRvbGVyYW5jZSB0byBjbG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmlhdGlvbnMuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJEX09uZUJpdF9TYW1wbGluZy4gKi8KKworICB1aW50OF90ICBQcmVzY2FsZXI7ICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgU21hcnRDYXJkIFByZXNjYWxlci4gKi8KKworICB1aW50OF90ICBHdWFyZFRpbWU7ICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgU21hcnRDYXJkIEd1YXJkIFRpbWUgYXBwbGllZCBhZnRlciBzdG9wIGJpdHMuICovCisKKyAgdWludDE2X3QgTkFDS0VuYWJsZTsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgU21hcnRDYXJkIE5BQ0sgdHJhbnNtaXNzaW9uIGlzIGVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBjYXNlIG9mIHBhcml0eSBlcnJvci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQVJUQ0FSRF9OQUNLX0VuYWJsZSAqLworCisgIHVpbnQzMl90IFRpbWVPdXRFbmFibGU7ICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlY2VpdmVyIHRpbWVvdXQgaXMgZW5hYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTTUFSVENBUkRfVGltZW91dF9FbmFibGUqLworCisgIHVpbnQzMl90IFRpbWVPdXRWYWx1ZTsgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSByZWNlaXZlciB0aW1lIG91dCB2YWx1ZSBpbiBudW1iZXIgb2YgYmF1ZCBibG9ja3M6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlIENoYXJhY3RlciBXYWl0IFRpbWUgKENXVCkgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2sgV2FpdCBUaW1lIChCV1QpLiBJdCBpcyBjb2RlZCBvdmVyIDI0IGJpdHMuICovCisKKyAgdWludDhfdCBCbG9ja0xlbmd0aDsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFNtYXJ0Q2FyZCBCbG9jayBMZW5ndGggaW4gVD0xIFJlY2VwdGlvbiBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgZnJvbSAweDAgdG8gMHhGRlUgKi8KKworICB1aW50OF90IEF1dG9SZXRyeUNvdW50OyAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgU21hcnRDYXJkIGF1dG8tcmV0cnkgY291bnQgKG51bWJlciBvZiByZXRyaWVzIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmUgYW5kIHRyYW5zbWl0IG1vZGUpLiBXaGVuIHNldCB0byAwVSwgcmV0cmFuc21pc3Npb24gaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQuIE90aGVyd2lzZSwgaXRzIG1heGltdW0gdmFsdWUgaXMgNyAoYmVmb3JlIHNpZ25hbGxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW4gZXJyb3IpICovCisKK31TTUFSVENBUkRfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgU01BUlRDQVJEIGFkdmFuY2VkIGZlYXR1cmVzIGluaXRhbGl6YXRpb24gc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IEFkdkZlYXR1cmVJbml0OyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoaWNoIGFkdmFuY2VkIFNNQVJUQ0FSRCBmZWF0dXJlcyBpcyBpbml0aWFsaXplZC4gU2V2ZXJhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2VkIGZlYXR1cmVzIG1heSBiZSBpbml0aWFsaXplZCBhdCB0aGUgc2FtZSB0aW1lLiBUaGlzIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJEX0FkdmFuY2VkX0ZlYXR1cmVzX0luaXRpYWxpemF0aW9uX1R5cGUgKi8KKworICB1aW50MzJfdCBUeFBpbkxldmVsSW52ZXJ0OyAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBUWCBwaW4gYWN0aXZlIGxldmVsIGlzIGludmVydGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJEX1R4X0ludiAgKi8KKworICB1aW50MzJfdCBSeFBpbkxldmVsSW52ZXJ0OyAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBSWCBwaW4gYWN0aXZlIGxldmVsIGlzIGludmVydGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJEX1J4X0ludiAgKi8KKworICB1aW50MzJfdCBEYXRhSW52ZXJ0OyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIGRhdGEgYXJlIGludmVydGVkIChwb3NpdGl2ZS9kaXJlY3QgbG9naWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cyBuZWdhdGl2ZS9pbnZlcnRlZCBsb2dpYykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTTUFSVENBUkRfRGF0YV9JbnYgKi8KKworICB1aW50MzJfdCBTd2FwOyAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIFRYIGFuZCBSWCBwaW5zIGFyZSBzd2FwcGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJEX1J4X1R4X1N3YXAgKi8KKworICB1aW50MzJfdCBPdmVycnVuRGlzYWJsZTsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSByZWNlcHRpb24gb3ZlcnJ1biBkZXRlY3Rpb24gaXMgZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTTUFSVENBUkRfT3ZlcnJ1bl9EaXNhYmxlICovCisKKyAgdWludDMyX3QgRE1BRGlzYWJsZW9uUnhFcnJvcjsgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgRE1BIGlzIGRpc2FibGVkIGluIGNhc2Ugb2YgcmVjZXB0aW9uIGVycm9yLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJEX0RNQV9EaXNhYmxlX29uX1J4X0Vycm9yICovCisKKyAgdWludDMyX3QgTVNCRmlyc3Q7ICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciBNU0IgaXMgc2VudCBmaXJzdCBvbiBVQVJUIGxpbmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTTUFSVENBUkRfTVNCX0ZpcnN0ICovCit9U01BUlRDQVJEX0FkdkZlYXR1cmVJbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmIEhBTCBTTUFSVENBUkQgU3RhdGUgc3RydWN0dXJlcyBkZWZpbml0aW9uCisgICogQG5vdGUgIEhBTCBTTUFSVENBUkQgU3RhdGUgdmFsdWUgaXMgYSBjb21iaW5hdGlvbiBvZiAyIGRpZmZlcmVudCBzdWJzdGF0ZXM6IGdTdGF0ZSBhbmQgUnhTdGF0ZS4KKyAgKiAgICAgICAgLSBnU3RhdGUgY29udGFpbnMgU01BUlRDQVJEIHN0YXRlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gZ2xvYmFsIEhhbmRsZSBtYW5hZ2VtZW50IAorICAqICAgICAgICAgIGFuZCBhbHNvIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gVHggb3BlcmF0aW9ucy4KKyAgKiAgICAgICAgICBnU3RhdGUgdmFsdWUgY29kaW5nIGZvbGxvdyBiZWxvdyBkZXNjcmliZWQgYml0bWFwIDoKKyAgKiAgICAgICAgICBiNy1iNiAgRXJyb3IgaW5mb3JtYXRpb24gCisgICogICAgICAgICAgICAgMDAgOiBObyBFcnJvcgorICAqICAgICAgICAgICAgIDAxIDogKE5vdCBVc2VkKQorICAqICAgICAgICAgICAgIDEwIDogVGltZW91dAorICAqICAgICAgICAgICAgIDExIDogRXJyb3IKKyAgKiAgICAgICAgICBiNSAgICAgSVAgaW5pdGlsaXNhdGlvbiBzdGF0dXMKKyAgKiAgICAgICAgICAgICAwICA6IFJlc2V0IChJUCBub3QgaW5pdGlhbGl6ZWQpCisgICogICAgICAgICAgICAgMSAgOiBJbml0IGRvbmUgKElQIG5vdCBpbml0aWFsaXplZC4gSEFMIFNNQVJUQ0FSRCBJbml0IGZ1bmN0aW9uIGFscmVhZHkgY2FsbGVkKQorICAqICAgICAgICAgIGI0LWIzICAobm90IHVzZWQpCisgICogICAgICAgICAgICAgeHggOiBTaG91bGQgYmUgc2V0IHRvIDAwCisgICogICAgICAgICAgYjIgICAgIEludHJpbnNpYyBwcm9jZXNzIHN0YXRlCisgICogICAgICAgICAgICAgMCAgOiBSZWFkeQorICAqICAgICAgICAgICAgIDEgIDogQnVzeSAoSVAgYnVzeSB3aXRoIHNvbWUgY29uZmlndXJhdGlvbiBvciBpbnRlcm5hbCBvcGVyYXRpb25zKQorICAqICAgICAgICAgIGIxICAgICAobm90IHVzZWQpCisgICogICAgICAgICAgICAgeCAgOiBTaG91bGQgYmUgc2V0IHRvIDAKKyAgKiAgICAgICAgICBiMCAgICAgVHggc3RhdGUKKyAgKiAgICAgICAgICAgICAwICA6IFJlYWR5IChubyBUeCBvcGVyYXRpb24gb25nb2luZykKKyAgKiAgICAgICAgICAgICAxICA6IEJ1c3kgKFR4IG9wZXJhdGlvbiBvbmdvaW5nKQorICAqICAgICAgICAtIFJ4U3RhdGUgY29udGFpbnMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBSeCBvcGVyYXRpb25zLgorICAqICAgICAgICAgIFJ4U3RhdGUgdmFsdWUgY29kaW5nIGZvbGxvdyBiZWxvdyBkZXNjcmliZWQgYml0bWFwIDoKKyAgKiAgICAgICAgICBiNy1iNiAgKG5vdCB1c2VkKQorICAqICAgICAgICAgICAgIHh4IDogU2hvdWxkIGJlIHNldCB0byAwMAorICAqICAgICAgICAgIGI1ICAgICBJUCBpbml0aWxpc2F0aW9uIHN0YXR1cworICAqICAgICAgICAgICAgIDAgIDogUmVzZXQgKElQIG5vdCBpbml0aWFsaXplZCkKKyAgKiAgICAgICAgICAgICAxICA6IEluaXQgZG9uZSAoSVAgbm90IGluaXRpYWxpemVkKQorICAqICAgICAgICAgIGI0LWIyICAobm90IHVzZWQpCisgICogICAgICAgICAgICB4eHggOiBTaG91bGQgYmUgc2V0IHRvIDAwMAorICAqICAgICAgICAgIGIxICAgICBSeCBzdGF0ZQorICAqICAgICAgICAgICAgIDAgIDogUmVhZHkgKG5vIFJ4IG9wZXJhdGlvbiBvbmdvaW5nKQorICAqICAgICAgICAgICAgIDEgIDogQnVzeSAoUnggb3BlcmF0aW9uIG9uZ29pbmcpCisgICogICAgICAgICAgYjAgICAgIChub3QgdXNlZCkKKyAgKiAgICAgICAgICAgICB4ICA6IFNob3VsZCBiZSBzZXQgdG8gMC4KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfU01BUlRDQVJEX1NUQVRFX1JFU0VUICAgICAgICAgICAgID0gMHgwMFUsICAgLyohPCBQZXJpcGhlcmFsIGlzIG5vdCBpbml0aWFsaXplZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgYW5kIFJ4U3RhdGUgKi8KKyAgSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWSAgICAgICAgICAgICA9IDB4MjBVLCAgIC8qITwgUGVyaXBoZXJhbCBJbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgYW5kIFJ4U3RhdGUgKi8KKyAgSEFMX1NNQVJUQ0FSRF9TVEFURV9CVVNZICAgICAgICAgICAgICA9IDB4MjRVLCAgIC8qITwgYW4gaW50ZXJuYWwgcHJvY2VzcyBpcyBvbmdvaW5nIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgb25seSAqLworICBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1lfVFggICAgICAgICAgID0gMHgyMVUsICAgLyohPCBEYXRhIFRyYW5zbWlzc2lvbiBwcm9jZXNzIGlzIG9uZ29pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIG9ubHkgKi8KKyAgSEFMX1NNQVJUQ0FSRF9TVEFURV9CVVNZX1JYICAgICAgICAgICA9IDB4MjJVLCAgIC8qITwgRGF0YSBSZWNlcHRpb24gcHJvY2VzcyBpcyBvbmdvaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIFJ4U3RhdGUgb25seSAqLworICBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1lfVFhfUlggICAgICAgID0gMHgyM1UsICAgLyohPCBEYXRhIFRyYW5zbWlzc2lvbiBhbmQgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3QgdG8gYmUgdXNlZCBmb3IgbmVpdGhlciBnU3RhdGUgbm9yIFJ4U3RhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIHJlc3VsdCBvZiBjb21iaW5hdGlvbiAoT3IpIGJldHdlZW4gZ1N0YXRlIGFuZCBSeFN0YXRlIHZhbHVlcyAqLworICBIQUxfU01BUlRDQVJEX1NUQVRFX1RJTUVPVVQgICAgICAgICAgID0gMHhBMFUsICAgLyohPCBUaW1lb3V0IHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBvbmx5ICovCisgIEhBTF9TTUFSVENBUkRfU1RBVEVfRVJST1IgICAgICAgICAgICAgPSAweEUwVSAgICAvKiE8IEVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBvbmx5ICovCit9SEFMX1NNQVJUQ0FSRF9TdGF0ZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgU01BUlRDQVJEIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgVVNBUlRfVHlwZURlZiAgICAgICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAgICAgICAvKiE8IFVTQVJUIHJlZ2lzdGVycyBiYXNlIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgU01BUlRDQVJEX0luaXRUeXBlRGVmICAgICAgICAgICBJbml0OyAgICAgICAgICAgICAvKiE8IFNtYXJ0Q2FyZCBjb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICovCisKKyAgU01BUlRDQVJEX0FkdkZlYXR1cmVJbml0VHlwZURlZiBBZHZhbmNlZEluaXQ7ICAgICAvKiE8IFNtYXJ0Q2FyZCBhZHZhbmNlZCBmZWF0dXJlcyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzICovCisKKyAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgICAqcFR4QnVmZlB0cjsgICAgICAvKiE8IFBvaW50ZXIgdG8gU21hcnRDYXJkIFR4IHRyYW5zZmVyIEJ1ZmZlciAgICAgICAgICAgICAgICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICBUeFhmZXJTaXplOyAgICAgICAvKiE8IFNtYXJ0Q2FyZCBUeCBUcmFuc2ZlciBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgICAgICAgICBUeFhmZXJDb3VudDsgICAgICAvKiE8IFNtYXJ0Q2FyZCBUeCBUcmFuc2ZlciBDb3VudGVyICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgICAqcFJ4QnVmZlB0cjsgICAgICAvKiE8IFBvaW50ZXIgdG8gU21hcnRDYXJkIFJ4IHRyYW5zZmVyIEJ1ZmZlciAgICAgICAgICAgICAgICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICBSeFhmZXJTaXplOyAgICAgICAvKiE8IFNtYXJ0Q2FyZCBSeCBUcmFuc2ZlciBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgICAgICAgICBSeFhmZXJDb3VudDsgICAgICAvKiE8IFNtYXJ0Q2FyZCBSeCBUcmFuc2ZlciBDb3VudGVyICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICAgICAgICAqaGRtYXR4OyAgICAgICAgICAvKiE8IFNtYXJ0Q2FyZCBUeCBETUEgSGFuZGxlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICovCisKKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICAgICAgICAqaGRtYXJ4OyAgICAgICAgICAvKiE8IFNtYXJ0Q2FyZCBSeCBETUEgSGFuZGxlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICovCisKKyAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgICAgICAgICBMb2NrOyAgICAgICAgICAgICAvKiE8IExvY2tpbmcgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyBIQUxfU01BUlRDQVJEX1N0YXRlVHlwZURlZiAgICBnU3RhdGU7ICAgICAgICAvKiE8IFNtYXJ0Q2FyZCBzdGF0ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGdsb2JhbCBIYW5kbGUgbWFuYWdlbWVudCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhbHNvIHJlbGF0ZWQgdG8gVHggb3BlcmF0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSEFMX1NNQVJUQ0FSRF9TdGF0ZVR5cGVEZWYgKi8KKworICBfX0lPIEhBTF9TTUFSVENBUkRfU3RhdGVUeXBlRGVmICAgIFJ4U3RhdGU7ICAgICAgIC8qITwgU21hcnRDYXJkIHN0YXRlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gUnggb3BlcmF0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSEFMX1NNQVJUQ0FSRF9TdGF0ZVR5cGVEZWYgKi8KKworICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZTsgICAgICAgIC8qITwgU21hcnRDYXJkIEVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQVJUQ0FSRF9FcnJvciAqLworCit9U01BUlRDQVJEX0hhbmRsZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgU01BUlRDQVJEIGNsb2NrIHNvdXJjZXMKKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfUENMSzEgICAgID0gMHgwMFUsIC8qITwgUENMSzEgY2xvY2sgc291cmNlICAgICAqLworICBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfUENMSzIgICAgID0gMHgwMVUsIC8qITwgUENMSzIgY2xvY2sgc291cmNlICAgICAqLworICBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfSFNJICAgICAgID0gMHgwMlUsIC8qITwgSFNJIGNsb2NrIHNvdXJjZSAgICAgICAqLworICBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLICAgID0gMHgwNFUsIC8qITwgU1lTQ0xLIGNsb2NrIHNvdXJjZSAgICAqLworICBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfTFNFICAgICAgID0gMHgwOFUsIC8qITwgTFNFIGNsb2NrIHNvdXJjZSAgICAgICAqLworICBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEID0gMHgxMFUgIC8qITwgdW5kZWZpbmVkIGNsb2NrIHNvdXJjZSAqLworfVNNQVJUQ0FSRF9DbG9ja1NvdXJjZVR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9FeHBvcnRlZF9Db25zdGFudHMgIFNNQVJUQ0FSRCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9FcnJvciBTTUFSVENBUkQgRXJyb3IKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfU01BUlRDQVJEX0VSUk9SX05PTkUgICAgICAoMHgwMDAwMDAwMFUpICAgIC8qITwgTm8gZXJyb3IgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQVJUQ0FSRF9FUlJPUl9QRSAgICAgICAgKDB4MDAwMDAwMDFVKSAgICAvKiE8IFBhcml0eSBlcnJvciAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9TTUFSVENBUkRfRVJST1JfTkUgICAgICAgICgweDAwMDAwMDAyVSkgICAgLyohPCBOb2lzZSBlcnJvciAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU01BUlRDQVJEX0VSUk9SX0ZFICAgICAgICAoMHgwMDAwMDAwNFUpICAgIC8qITwgZnJhbWUgZXJyb3IgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQVJUQ0FSRF9FUlJPUl9PUkUgICAgICAgKDB4MDAwMDAwMDhVKSAgICAvKiE8IE92ZXJydW4gZXJyb3IgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9TTUFSVENBUkRfRVJST1JfRE1BICAgICAgICgweDAwMDAwMDEwVSkgICAgLyohPCBETUEgdHJhbnNmZXIgZXJyb3IgICAgICAqLworI2RlZmluZSBIQUxfU01BUlRDQVJEX0VSUk9SX1JUTyAgICAgICAoMHgwMDAwMDAyMFUpICAgIC8qITwgUmVjZWl2ZXIgVGltZU91dCBlcnJvciAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX1dvcmRfTGVuZ3RoIFNNQVJUQ0FSRCBXb3JkIExlbmd0aAorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9XT1JETEVOR1RIXzlCICAgICAgICAgICAgICgodWludDMyX3QpVVNBUlRfQ1IxX00wKSAgICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgZnJhbWUgbGVuZ3RoICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9TdG9wX0JpdHMgU01BUlRDQVJEIE51bWJlciBvZiBTdG9wIEJpdHMKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfU1RPUEJJVFNfMF81ICAgICAgICAgICAgICAoKHVpbnQzMl90KVVTQVJUX0NSMl9TVE9QXzApICAgICAgICAgICAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIGZyYW1lIHdpdGggMC41IHN0b3AgYml0ICAqLworI2RlZmluZSBTTUFSVENBUkRfU1RPUEJJVFNfMV81ICAgICAgICAgICAgICAoKHVpbnQzMl90KShVU0FSVF9DUjJfU1RPUF8wIHwgVVNBUlRfQ1IyX1NUT1BfMSkpIC8qITwgU01BUlRDQVJEIGZyYW1lIHdpdGggMS41IHN0b3AgYml0cyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfUGFyaXR5IFNNQVJUQ0FSRCBQYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfUEFSSVRZX0VWRU4gICAgICAgICAgICAgICAoKHVpbnQzMl90KVVTQVJUX0NSMV9QQ0UpICAgICAgICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgZnJhbWUgZXZlbiBwYXJpdHkgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1BBUklUWV9PREQgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoVVNBUlRfQ1IxX1BDRSB8IFVTQVJUX0NSMV9QUykpIC8qITwgU01BUlRDQVJEIGZyYW1lIG9kZCBwYXJpdHkgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9Nb2RlIFNNQVJUQ0FSRCBUcmFuc2ZlciBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX01PREVfUlggICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClVU0FSVF9DUjFfUkUpICAgICAgICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgUlggbW9kZSAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX01PREVfVFggICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClVU0FSVF9DUjFfVEUpICAgICAgICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgVFggbW9kZSAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX01PREVfVFhfUlggICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoVVNBUlRfQ1IxX1RFIHxVU0FSVF9DUjFfUkUpKSAgLyohPCBTTUFSVENBUkQgUlggYW5kIFRYIG1vZGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX0Nsb2NrX1BvbGFyaXR5IFNNQVJUQ0FSRCBDbG9jayBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9QT0xBUklUWV9MT1cgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgZnJhbWUgbG93IHBvbGFyaXR5ICAqLworI2RlZmluZSBTTUFSVENBUkRfUE9MQVJJVFlfSElHSCAgICAgICAgICAgICAoKHVpbnQzMl90KVVTQVJUX0NSMl9DUE9MKSAgICAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIGZyYW1lIGhpZ2ggcG9sYXJpdHkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX0Nsb2NrX1BoYXNlIFNNQVJUQ0FSRCBDbG9jayBQaGFzZQorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9QSEFTRV8xRURHRSAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBmcmFtZSBwaGFzZSBvbiBmaXJzdCBjbG9jayB0cmFuc2l0aW9uICAqLworI2RlZmluZSBTTUFSVENBUkRfUEhBU0VfMkVER0UgICAgICAgICAgICAgICAoKHVpbnQzMl90KVVTQVJUX0NSMl9DUEhBKSAgICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgZnJhbWUgcGhhc2Ugb24gc2Vjb25kIGNsb2NrIHRyYW5zaXRpb24gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX0xhc3RfQml0IFNNQVJUQ0FSRCBMYXN0IEJpdAorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9MQVNUQklUX0RJU0FCTEUgICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIGZyYW1lIGxhc3QgZGF0YSBiaXQgY2xvY2sgcHVsc2Ugbm90IG91dHB1dCB0byBTQ0xLIHBpbiAqLworI2RlZmluZSBTTUFSVENBUkRfTEFTVEJJVF9FTkFCTEUgICAgICAgICAgICAoKHVpbnQzMl90KVVTQVJUX0NSMl9MQkNMKSAgICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBmcmFtZSBsYXN0IGRhdGEgYml0IGNsb2NrIHB1bHNlIG91dHB1dCB0byBTQ0xLIHBpbiAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX09uZUJpdF9TYW1wbGluZyBTTUFSVENBUkQgT25lIEJpdCBTYW1wbGluZyBNZXRob2QKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfT05FX0JJVF9TQU1QTEVfRElTQUJMRSAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBmcmFtZSBvbmUtYml0IHNhbXBsZSBkaXNhYmxlZCAqLworI2RlZmluZSBTTUFSVENBUkRfT05FX0JJVF9TQU1QTEVfRU5BQkxFICAgICAoKHVpbnQzMl90KVVTQVJUX0NSM19PTkVCSVQpICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBmcmFtZSBvbmUtYml0IHNhbXBsZSBlbmFibGVkICAqLworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9OQUNLX0VuYWJsZSBTTUFSVENBUkQgTkFDSyBFbmFibGUKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfTkFDS19FTkFCTEUgICAgICAgICAgICAgICAoKHVpbnQzMl90KVVTQVJUX0NSM19OQUNLKSAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIE5BQ0sgdHJhbnNtaXNzaW9uIGRpc2FibGVkICovCisjZGVmaW5lIFNNQVJUQ0FSRF9OQUNLX0RJU0FCTEUgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgTkFDSyB0cmFuc21pc3Npb24gZW5hYmxlZCAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX1RpbWVvdXRfRW5hYmxlIFNNQVJUQ0FSRCBUaW1lb3V0IEVuYWJsZQorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9USU1FT1VUX0RJU0FCTEUgICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgcmVjZWl2ZXIgdGltZW91dCBkaXNhYmxlZCAqLworI2RlZmluZSBTTUFSVENBUkRfVElNRU9VVF9FTkFCTEUgICAgICAgICAgICAoKHVpbnQzMl90KVVTQVJUX0NSMl9SVE9FTikgICAgICAgICAgIC8qITwgU01BUlRDQVJEIHJlY2VpdmVyIHRpbWVvdXQgZW5hYmxlZCAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX0FkdmFuY2VkX0ZlYXR1cmVzX0luaXRpYWxpemF0aW9uX1R5cGUgU01BUlRDQVJEIGFkdmFuY2VkIGZlYXR1cmUgaW5pdGlhbGl6YXRpb24gdHlwZQorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX05PX0lOSVQgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgLyohPCBObyBhZHZhbmNlZCBmZWF0dXJlIGluaXRpYWxpemF0aW9uICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfVFhJTlZFUlRfSU5JVCAgICAgICAgICAgKDB4MDAwMDAwMDFVKSAgICAvKiE8IFRYIHBpbiBhY3RpdmUgbGV2ZWwgaW52ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTTUFSVENBUkRfQURWRkVBVFVSRV9SWElOVkVSVF9JTklUICAgICAgICAgICAoMHgwMDAwMDAwMlUpICAgIC8qITwgUlggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX0RBVEFJTlZFUlRfSU5JVCAgICAgICAgICgweDAwMDAwMDA0VSkgICAgLyohPCBCaW5hcnkgZGF0YSBpbnZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfU1dBUF9JTklUICAgICAgICAgICAgICAgKDB4MDAwMDAwMDhVKSAgICAvKiE8IFRYL1JYIHBpbnMgc3dhcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTTUFSVENBUkRfQURWRkVBVFVSRV9SWE9WRVJSVU5ESVNBQkxFX0lOSVQgICAoMHgwMDAwMDAxMFUpICAgIC8qITwgUlggb3ZlcnJ1biBkaXNhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX0RNQURJU0FCTEVPTkVSUk9SX0lOSVQgICgweDAwMDAwMDIwVSkgICAgLyohPCBETUEgZGlzYWJsZSBvbiBSZWNlcHRpb24gRXJyb3IgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfTVNCRklSU1RfSU5JVCAgICAgICAgICAgKDB4MDAwMDAwODBVKSAgICAvKiE8IE1vc3Qgc2lnbmlmaWNhbnQgYml0IHNlbnQvcmVjZWl2ZWQgZmlyc3QgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfVHhfSW52IFNNQVJUQ0FSRCBhZHZhbmNlZCBmZWF0dXJlIFRYIHBpbiBhY3RpdmUgbGV2ZWwgaW52ZXJzaW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfVFhJTlZfRElTQUJMRSAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRYIHBpbiBhY3RpdmUgbGV2ZWwgaW52ZXJzaW9uIGRpc2FibGUgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfVFhJTlZfRU5BQkxFICAgKCh1aW50MzJfdClVU0FSVF9DUjJfVFhJTlYpICAgICAgICAgICAvKiE8IFRYIHBpbiBhY3RpdmUgbGV2ZWwgaW52ZXJzaW9uIGVuYWJsZSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX1J4X0ludiBTTUFSVENBUkQgYWR2YW5jZWQgZmVhdHVyZSBSWCBwaW4gYWN0aXZlIGxldmVsIGludmVyc2lvbgorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1JYSU5WX0RJU0FCTEUgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSWCBwaW4gYWN0aXZlIGxldmVsIGludmVyc2lvbiBkaXNhYmxlICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1JYSU5WX0VOQUJMRSAgICgodWludDMyX3QpVVNBUlRfQ1IyX1JYSU5WKSAgICAgICAgICAgLyohPCBSWCBwaW4gYWN0aXZlIGxldmVsIGludmVyc2lvbiBlbmFibGUgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9EYXRhX0ludiBTTUFSVENBUkQgYWR2YW5jZWQgZmVhdHVyZSBCaW5hcnkgRGF0YSBpbnZlcnNpb24KKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfQURWRkVBVFVSRV9EQVRBSU5WX0RJU0FCTEUgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQmluYXJ5IGRhdGEgaW52ZXJzaW9uIGRpc2FibGUgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfREFUQUlOVl9FTkFCTEUgICAoKHVpbnQzMl90KVVTQVJUX0NSMl9EQVRBSU5WKSAgICAgICAvKiE8IEJpbmFyeSBkYXRhIGludmVyc2lvbiBlbmFibGUgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9SeF9UeF9Td2FwIFNNQVJUQ0FSRCBhZHZhbmNlZCBmZWF0dXJlIFJYIFRYIHBpbnMgc3dhcAorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1NXQVBfRElTQUJMRSAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUWC9SWCBwaW5zIHN3YXAgZGlzYWJsZSAqLworI2RlZmluZSBTTUFSVENBUkRfQURWRkVBVFVSRV9TV0FQX0VOQUJMRSAgICAoKHVpbnQzMl90KVVTQVJUX0NSMl9TV0FQKSAgICAgICAgICAgIC8qITwgVFgvUlggcGlucyBzd2FwIGVuYWJsZSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX092ZXJydW5fRGlzYWJsZSBTTUFSVENBUkQgYWR2YW5jZWQgZmVhdHVyZSBPdmVycnVuIERpc2FibGUKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfQURWRkVBVFVSRV9PVkVSUlVOX0VOQUJMRSAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUlggb3ZlcnJ1biBlbmFibGUgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX09WRVJSVU5fRElTQUJMRSAgKCh1aW50MzJfdClVU0FSVF9DUjNfT1ZSRElTKSAgICAgICAgLyohPCBSWCBvdmVycnVuIGRpc2FibGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX0RNQV9EaXNhYmxlX29uX1J4X0Vycm9yIFNNQVJUQ0FSRCBhZHZhbmNlZCBmZWF0dXJlIERNQSBEaXNhYmxlIG9uIFJ4IEVycm9yCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfRE1BX0VOQUJMRU9OUlhFUlJPUiAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAvKiE8IERNQSBlbmFibGUgb24gUmVjZXB0aW9uIEVycm9yICAqLworI2RlZmluZSBTTUFSVENBUkRfQURWRkVBVFVSRV9ETUFfRElTQUJMRU9OUlhFUlJPUiAgKCh1aW50MzJfdClVU0FSVF9DUjNfRERSRSkgICAgIC8qITwgRE1BIGRpc2FibGUgb24gUmVjZXB0aW9uIEVycm9yICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9NU0JfRmlyc3QgICBTTUFSVENBUkQgYWR2YW5jZWQgZmVhdHVyZSBNU0IgZmlyc3QKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfQURWRkVBVFVSRV9NU0JGSVJTVF9ESVNBQkxFICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgLyohPCBNb3N0IHNpZ25pZmljYW50IGJpdCBzZW50L3JlY2VpdmVkIGZpcnN0IGRpc2FibGUgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfTVNCRklSU1RfRU5BQkxFICAgICAgICgodWludDMyX3QpVVNBUlRfQ1IyX01TQkZJUlNUKSAgIC8qITwgTW9zdCBzaWduaWZpY2FudCBiaXQgc2VudC9yZWNlaXZlZCBmaXJzdCBlbmFibGUgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9GbGFncyBTTUFSVENBUkQgRmxhZ3MKKyAgKiAgICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDB4WFhYWAorICAqICAgICAgICAgICAtIDB4WFhYWCAgOiBGbGFnIG1hc2sgaW4gdGhlIElTUiByZWdpc3RlcgorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1JFQUNLICAgICAgICAgIFVTQVJUX0lTUl9SRUFDSyAgICAgIC8qITwgU01BUlRDQVJEIHJlY2VpdmUgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1RFQUNLICAgICAgICAgIFVTQVJUX0lTUl9URUFDSyAgICAgIC8qITwgU01BUlRDQVJEIHRyYW5zbWl0IGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX0JVU1kgICAgICAgICAgIFVTQVJUX0lTUl9CVVNZICAgICAgIC8qITwgU01BUlRDQVJEIGJ1c3kgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX0VPQkYgICAgICAgICAgIFVTQVJUX0lTUl9FT0JGICAgICAgIC8qITwgU01BUlRDQVJEIGVuZCBvZiBibG9jayBmbGFnICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1JUT0YgICAgICAgICAgIFVTQVJUX0lTUl9SVE9GICAgICAgIC8qITwgU01BUlRDQVJEIHJlY2VpdmVyIHRpbWVvdXQgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1RYRSAgICAgICAgICAgIFVTQVJUX0lTUl9UWEUgICAgICAgIC8qITwgU01BUlRDQVJEIHRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1RDICAgICAgICAgICAgIFVTQVJUX0lTUl9UQyAgICAgICAgIC8qITwgU01BUlRDQVJEIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1JYTkUgICAgICAgICAgIFVTQVJUX0lTUl9SWE5FICAgICAgIC8qITwgU01BUlRDQVJEIHJlYWQgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX0lETEUgICAgICAgICAgIFVTQVJUX0lTUl9JRExFICAgICAgIC8qITwgU01BUlRDQVJEIGlkbGUgbGluZSBkZXRlY3Rpb24gICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX09SRSAgICAgICAgICAgIFVTQVJUX0lTUl9PUkUgICAgICAgIC8qITwgU01BUlRDQVJEIG92ZXJydW4gZXJyb3IgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX05FICAgICAgICAgICAgIFVTQVJUX0lTUl9ORSAgICAgICAgIC8qITwgU01BUlRDQVJEIG5vaXNlIGVycm9yICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX0ZFICAgICAgICAgICAgIFVTQVJUX0lTUl9GRSAgICAgICAgIC8qITwgU01BUlRDQVJEIGZyYW1lIGVycm9yICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1BFICAgICAgICAgICAgIFVTQVJUX0lTUl9QRSAgICAgICAgIC8qITwgU01BUlRDQVJEIHBhcml0eSBlcnJvciAgICAgICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9JbnRlcnJ1cHRfZGVmaW5pdGlvbiBTTUFSVENBUkQgSW50ZXJydXB0cyBEZWZpbml0aW9uCisgICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAwMDAwWlpaWjBYWFlZWVlZYgorICAqICAgICAgICAgICAtIFlZWVlZICA6IEludGVycnVwdCBzb3VyY2UgcG9zaXRpb24gaW4gdGhlIFhYIHJlZ2lzdGVyICg1Yml0cykKKyAgKiAgICAgICAgICAgLSBYWCAgOiBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyICgyYml0cykKKyAgKiAgICAgICAgICAgICAgICAgLSAwMTogQ1IxIHJlZ2lzdGVyCisgICogICAgICAgICAgICAgICAgIC0gMTA6IENSMiByZWdpc3RlcgorICAqICAgICAgICAgICAgICAgICAtIDExOiBDUjMgcmVnaXN0ZXIKKyAgKiAgICAgICAgICAgLSBaWlpaICA6IEZsYWcgcG9zaXRpb24gaW4gdGhlIElTUiByZWdpc3Rlcig0Yml0cykKKyAgKiBAeworICAqLworCisjZGVmaW5lIFNNQVJUQ0FSRF9JVF9QRSAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDI4VSkgICAgICAgIC8qITwgU01BUlRDQVJEIHBhcml0eSBlcnJvciBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9JVF9UWEUgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwNzI3VSkgICAgICAgIC8qITwgU01BUlRDQVJEIHRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0aW9uICovCisjZGVmaW5lIFNNQVJUQ0FSRF9JVF9UQyAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwNjI2VSkgICAgICAgIC8qITwgU01BUlRDQVJEIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHRpb24gICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9JVF9SWE5FICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwNTI1VSkgICAgICAgIC8qITwgU01BUlRDQVJEIHJlYWQgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0aW9uICovCisjZGVmaW5lIFNNQVJUQ0FSRF9JVF9JRExFICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwNDI0VSkgICAgICAgIC8qITwgU01BUlRDQVJEIGlkbGUgbGluZSBkZXRlY3Rpb24gaW50ZXJydXB0aW9uICAgICAgICAgICovCisKKyNkZWZpbmUgU01BUlRDQVJEX0lUX0VSUiAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwNjBVKSAgICAgICAgLyohPCBTTUFSVENBUkQgZXJyb3IgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0lUX09SRSAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAzMDBVKSAgICAgICAgLyohPCBTTUFSVENBUkQgb3ZlcnJ1biBlcnJvciBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0lUX05FICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAyMDBVKSAgICAgICAgLyohPCBTTUFSVENBUkQgbm9pc2UgZXJyb3IgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0lUX0ZFICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAxMDBVKSAgICAgICAgLyohPCBTTUFSVENBUkQgZnJhbWUgZXJyb3IgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBTTUFSVENBUkRfSVRfRU9CICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MEMzQlUpICAgICAgICAvKiE8IFNNQVJUQ0FSRCBlbmQgb2YgYmxvY2sgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTTUFSVENBUkRfSVRfUlRPICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MEIzQVUpICAgICAgICAvKiE8IFNNQVJUQ0FSRCByZWNlaXZlciB0aW1lb3V0IGludGVycnVwdGlvbiAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfSVRfQ0xFQVJfRmxhZ3MgU01BUlRDQVJEIEludGVycnVwdGlvbiBDbGVhciBGbGFncworICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DTEVBUl9QRUYgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9QRUNGICAgIC8qITwgU01BUlRDQVJEIHBhcml0eSBlcnJvciBjbGVhciBmbGFnICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DTEVBUl9GRUYgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9GRUNGICAgIC8qITwgU01BUlRDQVJEIGZyYW1pbmcgZXJyb3IgY2xlYXIgZmxhZyAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DTEVBUl9ORUYgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9OQ0YgICAgIC8qITwgU01BUlRDQVJEIG5vaXNlIGRldGVjdGVkIGNsZWFyIGZsYWcgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DTEVBUl9PUkVGICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9PUkVDRiAgIC8qITwgU01BUlRDQVJEIG92ZXJydW4gZXJyb3IgY2xlYXIgZmxhZyAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DTEVBUl9JRExFRiAgICAgICAgICAgICAgIFVTQVJUX0lDUl9JRExFQ0YgIC8qITwgU01BUlRDQVJEIGlkbGUgbGluZSBkZXRlY3RlZCBjbGVhciBmbGFnICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DTEVBUl9UQ0YgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9UQ0NGICAgIC8qITwgU01BUlRDQVJEIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSBjbGVhciBmbGFnICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DTEVBUl9SVE9GICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9SVE9DRiAgIC8qITwgU01BUlRDQVJEIHJlY2VpdmVyIHRpbWUgb3V0IGNsZWFyIGZsYWcgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DTEVBUl9FT0JGICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9FT0JDRiAgIC8qITwgU01BUlRDQVJEIGVuZCBvZiBibG9jayBjbGVhciBmbGFnICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9DUjNfU0NBUkNOVF9MU0JfUE9TIFNNQVJUQ0FSRCBhdXRvIHJldHJ5IGNvdW50ZXIgTFNCIHBvc2l0aW9uIGluIENSMyByZWdpc3RlcgorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DUjNfU0NBUkNOVF9MU0JfUE9TICAgICAgICggMTdVKSAgICAgICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBhdXRvIHJldHJ5IGNvdW50ZXIgTFNCIHBvc2l0aW9uIGluIENSMyByZWdpc3RlciAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfR1RQUl9HVF9MU0JfUE9TIFNNQVJUQ0FSRCBndWFyZCB0aW1lIHZhbHVlIExTQiBwb3NpdGlvbiBpbiBHVFBSIHJlZ2lzdGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0dUUFJfR1RfTFNCX1BPUyAgICAgICAgICAgKCA4VSkgICAgICAgICAgICAgICAgIC8qITwgIFNNQVJUQ0FSRCBndWFyZCB0aW1lIHZhbHVlIExTQiBwb3NpdGlvbiBpbiBHVFBSIHJlZ2lzdGVyICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9SVE9SX0JMRU5fTFNCX1BPUyBTTUFSVENBUkQgYmxvY2sgbGVuZ3RoIExTQiBwb3NpdGlvbiBpbiBSVE9SIHJlZ2lzdGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1JUT1JfQkxFTl9MU0JfUE9TICAgICAgICAgKCAyNFUpICAgICAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIGJsb2NrIGxlbmd0aCBMU0IgcG9zaXRpb24gaW4gUlRPUiByZWdpc3RlciAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfSW50ZXJydXB0aW9uX01hc2sgU01BUlRDQVJEIGludGVycnVwdGlvbnMgZmxhZ3MgbWFzaworICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9JVF9NQVNLICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDFGVSkgICAvKiE8IFNNQVJUQ0FSRCBpbnRlcnJ1cHRpb25zIGZsYWdzIG1hc2sgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX1JlcXVlc3RfUGFyYW1ldGVycyBTTUFSVENBUkQgUmVxdWVzdCBQYXJhbWV0ZXJzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1JYREFUQV9GTFVTSF9SRVFVRVNUICAgICAgKCh1aW50MzJfdClVU0FSVF9SUVJfUlhGUlEpICAgICAgICAvKiE8IFJlY2VpdmUgZGF0YSBmbHVzaCByZXF1ZXN0ICovCisjZGVmaW5lIFNNQVJUQ0FSRF9UWERBVEFfRkxVU0hfUkVRVUVTVCAgICAgICgodWludDMyX3QpVVNBUlRfUlFSX1RYRlJRKSAgICAgICAgLyohPCBUcmFuc21pdCBkYXRhIGZsdXNoIHJlcXVlc3QgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9FeHBvcnRlZF9NYWNyb3MgIFNNQVJUQ0FSRCBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmICBSZXNldCBTTUFSVENBUkQgaGFuZGxlIHN0YXRlcy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gU01BUlRDQVJEIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFU0VUOyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRVNFVDsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisvKiogQGJyaWVmICBGbHVzaCB0aGUgU21hcnRjYXJkIERhdGEgcmVnaXN0ZXJzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9GTFVTSF9EUlJFR0lTVEVSKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UlFSLCBTTUFSVENBUkRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOyBcCisgICAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlJRUiwgU01BUlRDQVJEX1RYREFUQV9GTFVTSF9SRVFVRVNUKTsgXAorICAgICAgfSB3aGlsZSgwVSkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfQ0xFQVJfUEVGICAgIFBhcml0eSBlcnJvciBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0NMRUFSX0ZFRiAgICBGcmFtaW5nIGVycm9yIGNsZWFyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfQ0xFQVJfTkVGICAgIE5vaXNlIGRldGVjdGVkIGNsZWFyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfQ0xFQVJfT1JFRiAgIE92ZXJSdW4gZXJyb3IgY2xlYXIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9DTEVBUl9JRExFRiAgSWRsZSBsaW5lIGRldGVjdGVkIGNsZWFyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfQ0xFQVJfVENGICAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0NMRUFSX1JUT0YgICBSZWNlaXZlciB0aW1lb3V0IGNsZWFyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfQ0xFQVJfRU9CRiAgIEVuZCBvZiBibG9jayBjbGVhciBmbGFnCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUNSID0gKF9fRkxBR19fKSkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFNNQVJUQ0FSRCBQRSBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX0NMRUFSX1BFRkxBRyhfX0hBTkRMRV9fKSAgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgU01BUlRDQVJEX0NMRUFSX1BFRikKKworCisvKiogQGJyaWVmICBDbGVhciB0aGUgU01BUlRDQVJEIEZFIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfRkVGTEFHKF9fSEFORExFX18pICAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBTTUFSVENBUkRfQ0xFQVJfRkVGKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgU01BUlRDQVJEIE5FIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfTkVGTEFHKF9fSEFORExFX18pICAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBTTUFSVENBUkRfQ0xFQVJfTkVGKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgU01BUlRDQVJEIE9SRSBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX0NMRUFSX09SRUZMQUcoX19IQU5ETEVfXykgICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFNNQVJUQ0FSRF9DTEVBUl9PUkVGKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgU01BUlRDQVJEIElETEUgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9JRExFRkxBRyhfX0hBTkRMRV9fKSAgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgU01BUlRDQVJEX0NMRUFSX0lETEVGKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgU21hcnRjYXJkIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9GTEFHX1JFQUNLIFJlY2VpdmUgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfRkxBR19URUFDSyBUcmFuc21pdCBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9GTEFHX0JVU1kgIEJ1c3kgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9GTEFHX0VPQkYgIEVuZCBvZiBibG9jayBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0ZMQUdfUlRPRiAgUmVjZWl2ZXIgdGltZW91dCBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0ZMQUdfVFhFICAgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0ZMQUdfVEMgICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfRkxBR19SWE5FICBSZWNlaXZlIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfRkxBR19JRExFICBJZGxlIGxpbmUgZGV0ZWN0aW9uIGZsYWcgIAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9GTEFHX09SRSAgIE92ZXJydW4gZXJyb3IgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9GTEFHX05FICAgIE5vaXNlIGVycm9yIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfRkxBR19GRSAgICBGcmFtaW5nIGVycm9yIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfRkxBR19QRSAgICBQYXJpdHkgZXJyb3IgZmxhZworICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgJiAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKQorCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIFNtYXJ0Q2FyZCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgaW50ZXJydXB0IHRvIGVuYWJsZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9FT0IgICBFbmQgb2YgYmxvY2sgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1JUTyAgIFJlY2VpdmUgdGltZW91dCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfVFhFICAgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfVEMgICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9SWE5FICBSZWNlaXZlIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9JRExFICBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdCAgCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1BFICAgIFBhcml0eSBlcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfRVJSICAgRXJyb3IgaW50ZXJydXB0KGZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICgoKCgoX19JTlRFUlJVUFRfXykgJiAweEZGVSkgPj4gNVUpID09IDFVKT8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSB8PSAoMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFNNQVJUQ0FSRF9JVF9NQVNLKSkpOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKF9fSU5URVJSVVBUX18pICYgMHhGRlUpID4+IDVVKSA9PSAyVSk/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgfD0gKDFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBTTUFSVENBUkRfSVRfTUFTSykpKTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMgfD0gKDFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBTTUFSVENBUkRfSVRfTUFTSykpKSkKKworLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIFNtYXJ0Q2FyZCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgaW50ZXJydXB0IHRvIGRpc2FibGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfRU9CICAgRW5kIG9mIGJsb2NrIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9SVE8gICBSZWNlaXZlIHRpbWVvdXQgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1RYRSAgIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1RDICAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfUlhORSAgUmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfSURMRSAgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQgICAKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfUEUgICAgUGFyaXR5IGVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9FUlIgICBFcnJvciBpbnRlcnJ1cHQoZnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TTUFSVENBUkRfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgKCgoKChfX0lOVEVSUlVQVF9fKSAmIDB4RkZVKSA+PiA1VSkgPT0gMVUpPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICY9IH4gKDFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBTTUFSVENBUkRfSVRfTUFTSykpKTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKChfX0lOVEVSUlVQVF9fKSAmIDB4RkZVKSA+PiA1VSkgPT0gMlUpPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyICY9IH4gKDFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBTTUFSVENBUkRfSVRfTUFTSykpKTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMgJj0gfiAoMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFNNQVJUQ0FSRF9JVF9NQVNLKSkpKQorCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTbWFydENhcmQgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSVRfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBpbnRlcnJ1cHQgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfRU9CICAgRW5kIG9mIGJsb2NrIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9SVE8gICBSZWNlaXZlIHRpbWVvdXQgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1RYRSAgIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1RDICAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfUlhORSAgUmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfSURMRSAgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQgIAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9PUkUgICBPdmVycnVuIGVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9ORSAgICBOb2lzZSBlcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfRkUgICAgRnJhbWluZyBlcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfUEUgICAgUGFyaXR5IGVycm9yIGludGVycnVwdAorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0lUX18gKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBfX0hBTF9TTUFSVENBUkRfR0VUX0lUKF9fSEFORExFX18sIF9fSVRfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmICgxVSA8PCAoKF9fSVRfXyk+PiAweDA4VSkpKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgU21hcnRDYXJkIGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSVRfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX0VPQiAgIEVuZCBvZiBibG9jayBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfUlRPICAgUmVjZWl2ZSB0aW1lb3V0IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9UWEUgICBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9UQyAgICBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1JYTkUgIFJlY2VpdmUgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX0lETEUgIElkbGUgbGluZSBkZXRlY3Rpb24gaW50ZXJydXB0ICAKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfRVJSICAgRnJhbWluZywgb3ZlcnJ1biBvciBub2lzZSBlcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfUEUgICAgUGFyaXR5IGVycm9yIGludGVycnVwdAorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0lUX18gKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBfX0hBTF9TTUFSVENBUkRfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lUX18pICgoKCgoKF9fSVRfXykgJiAweEZGVSkgPj4gNVUpID09IDFVKT8gKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoKF9fSVRfXykgJiAweEZGVSkgPj4gNVUpID09IDJVKT8gKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMpKSAmICgxVSA8PCAoKCh1aW50MTZfdCkoX19JVF9fKSkgJiBTTUFSVENBUkRfSVRfTUFTSykpKQorCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIElTUiBmbGFnLCBpbiBzZXR0aW5nIHRoZSBwcm9wZXIgSUNSIHJlZ2lzdGVyIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSVRfQ0xFQVJfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBjbGVhciByZWdpc3RlciBmbGFnIHRoYXQgbmVlZHMgdG8gYmUgc2V0CisgICogICAgICAgICAgICAgICAgICAgICAgIHRvIGNsZWFyIHRoZSBjb3JyZXNwb25kaW5nIGludGVycnVwdC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9DTEVBUl9QRUYgICAgUGFyaXR5IGVycm9yIGNsZWFyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfQ0xFQVJfRkVGICAgIEZyYW1pbmcgZXJyb3IgY2xlYXIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9DTEVBUl9ORUYgICAgTm9pc2UgZGV0ZWN0ZWQgY2xlYXIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9DTEVBUl9PUkVGICAgT3ZlclJ1biBlcnJvciBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0NMRUFSX0lETEVGICBJZGxlIGxpbmUgZGV0ZWN0aW9uIGNsZWFyIGZsYWcgICAgCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0NMRUFSX1RDRiAgICBUcmFuc21pc3Npb24gY29tcGxldGUgY2xlYXIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9DTEVBUl9SVE9GICAgUmVjZWl2ZXIgdGltZW91dCBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0NMRUFSX0VPQkYgICBFbmQgb2YgYmxvY2sgY2xlYXIgZmxhZworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfSVQoX19IQU5ETEVfXywgX19JVF9DTEVBUl9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUNSID0gKHVpbnQzMl90KShfX0lUX0NMRUFSX18pKQorCisvKiogQGJyaWVmICBTZXQgYSBzcGVjaWZpYyBTTUFSVENBUkQgcmVxdWVzdCBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHBhcmFtICBfX1JFUV9fIHNwZWNpZmllcyB0aGUgcmVxdWVzdCBmbGFnIHRvIHNldAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX1JYREFUQV9GTFVTSF9SRVFVRVNUIFJlY2VpdmUgZGF0YSBmbHVzaCBSZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX1RYREFUQV9GTFVTSF9SRVFVRVNUIFRyYW5zbWl0IGRhdGEgZmx1c2ggUmVxdWVzdAorICAqCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9TRU5EX1JFUShfX0hBTkRMRV9fLCBfX1JFUV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UlFSIHw9ICh1aW50MTZfdCkoX19SRVFfXykpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgU01BUlRDQVJEIG9uZSBiaXQgc2FtcGxlIG1ldGhvZC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLiAgCisgICogQHJldHZhbCBOb25lCisgICovICAgICAKKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX09ORV9CSVRfU0FNUExFX0VOQUJMRShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzfD0gVVNBUlRfQ1IzX09ORUJJVCkKKworLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgU01BUlRDQVJEIG9uZSBiaXQgc2FtcGxlIG1ldGhvZC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLiAgCisgICogQHJldHZhbCBOb25lCisgICovICAgICAgCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9PTkVfQklUX1NBTVBMRV9ESVNBQkxFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMgJj0gKHVpbnQzMl90KX4oKHVpbnQzMl90KVVTQVJUX0NSM19PTkVCSVQpKQorCisvKiogQGJyaWVmICBFbmFibGUgdGhlIFVTQVJUIGFzc29jaWF0ZWQgdG8gdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgfD0gIFVTQVJUX0NSMV9VRSkKKworLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgVVNBUlQgYXNzb2NpYXRlZCB0byB0aGUgU01BUlRDQVJEIEhhbmRsZQorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICY9ICB+VVNBUlRfQ1IxX1VFKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX1ByaXZhdGVfTWFjcm9zIFNNQVJUQ0FSRCBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIENoZWNrIHRoZSBCYXVkIHJhdGUgcmFuZ2UuCisgICogQG5vdGUgICBUaGUgbWF4aW11bSBCYXVkIFJhdGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBtYXhpbXVtIGNsb2NrIG9uIEYzICg3MiBNSHopCisgICogICAgICAgICBkaXZpZGVkIGJ5IHRoZSBvdmVyc2FtcGxpbmcgdXNlZCBvbiB0aGUgU01BUlRDQVJEIChpLmUuIDE2KS4KKyAgKiBAcGFyYW0gIF9fQkFVRFJBVEVfXyBCYXVkIHJhdGUgc2V0IGJ5IHRoZSBjb25maWd1cmF0aW9uIGZ1bmN0aW9uLgorICAqIEByZXR2YWwgVGVzdCByZXN1bHQgKFRSVUUgb3IgRkFMU0UpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9CQVVEUkFURShfX0JBVURSQVRFX18pICgoX19CQVVEUkFURV9fKSA8IDQ1MDAwMDFVKQorCisvKiogQGJyaWVmICBDaGVjayB0aGUgYmxvY2sgbGVuZ3RoIHJhbmdlLgorICAqIEBub3RlICAgVGhlIG1heGltdW0gU01BUlRDQVJEIGJsb2NrIGxlbmd0aCBpcyAweEZGLgorICAqIEBwYXJhbSAgX19MRU5HVEhfXyBibG9jayBsZW5ndGguCisgICogQHJldHZhbCBUZXN0IHJlc3VsdCAoVFJVRSBvciBGQUxTRSkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX0JMT0NLTEVOR1RIKF9fTEVOR1RIX18pICgoX19MRU5HVEhfXykgPD0gMHhGRlUpCisKKy8qKiBAYnJpZWYgIENoZWNrIHRoZSByZWNlaXZlciB0aW1lb3V0IHZhbHVlLiAKKyAgKiBAbm90ZSAgIFRoZSBtYXhpbXVtIFNNQVJUQ0FSRCByZWNlaXZlciB0aW1lb3V0IHZhbHVlIGlzIDB4RkZGRkZGLgorICAqIEBwYXJhbSAgX19USU1FT1VUVkFMVUVfXyByZWNlaXZlciB0aW1lb3V0IHZhbHVlLgorICAqIEByZXR2YWwgVGVzdCByZXN1bHQgKFRSVUUgb3IgRkFMU0UpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9USU1FT1VUX1ZBTFVFKF9fVElNRU9VVFZBTFVFX18pICAgICgoX19USU1FT1VUVkFMVUVfXykgPD0gMHhGRkZGRkZVKQorCisvKiogQGJyaWVmICBDaGVjayB0aGUgU01BUlRDQVJEIGF1dG9yZXRyeSBjb3VudGVyIHZhbHVlLiAKKyAgKiBAbm90ZSAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyYW5zbWlzc2lvbnMgaXMgMHg3LgorICAqIEBwYXJhbSAgX19DT1VOVF9fIG51bWJlciBvZiByZXRyYW5zbWlzc2lvbnMuCisgICogQHJldHZhbCBUZXN0IHJlc3VsdCAoVFJVRSBvciBGQUxTRSkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX0FVVE9SRVRSWV9DT1VOVChfX0NPVU5UX18pICAgICAgICAgKChfX0NPVU5UX18pIDw9IDB4N1UpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBTTUFSVENBUkQgZnJhbWUgbGVuZ3RoIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0xFTkdUSF9fIFNNQVJUQ0FSRCBmcmFtZSBsZW5ndGguIAorICAqIEByZXR2YWwgU0VUIChfX0xFTkdUSF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19MRU5HVEhfXyBpcyBpbnZhbGlkKQorICAqLyAKKyNkZWZpbmUgSVNfU01BUlRDQVJEX1dPUkRfTEVOR1RIKF9fTEVOR1RIX18pICgoX19MRU5HVEhfXykgPT0gU01BUlRDQVJEX1dPUkRMRU5HVEhfOUIpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBTTUFSVENBUkQgZnJhbWUgbnVtYmVyIG9mIHN0b3AgYml0cyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19TVE9QQklUU19fIFNNQVJUQ0FSRCBmcmFtZSBudW1iZXIgb2Ygc3RvcCBiaXRzLiAKKyAgKiBAcmV0dmFsIFNFVCAoX19TVE9QQklUU19fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19TVE9QQklUU19fIGlzIGludmFsaWQpCisgICovIAorI2RlZmluZSBJU19TTUFSVENBUkRfU1RPUEJJVFMoX19TVE9QQklUU19fKSAoKChfX1NUT1BCSVRTX18pID09IFNNQVJUQ0FSRF9TVE9QQklUU18wXzUpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUT1BCSVRTX18pID09IFNNQVJUQ0FSRF9TVE9QQklUU18xXzUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIGZyYW1lIHBhcml0eSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19QQVJJVFlfXyBTTUFSVENBUkQgZnJhbWUgcGFyaXR5LiAKKyAgKiBAcmV0dmFsIFNFVCAoX19QQVJJVFlfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fUEFSSVRZX18gaXMgaW52YWxpZCkKKyAgKi8gCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9QQVJJVFkoX19QQVJJVFlfXykgKCgoX19QQVJJVFlfXykgPT0gU01BUlRDQVJEX1BBUklUWV9FVkVOKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQVJJVFlfXykgPT0gU01BUlRDQVJEX1BBUklUWV9PREQpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIGNvbW11bmljYXRpb24gbW9kZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19NT0RFX18gU01BUlRDQVJEIGNvbW11bmljYXRpb24gbW9kZS4gCisgICogQHJldHZhbCBTRVQgKF9fTU9ERV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19NT0RFX18gaXMgaW52YWxpZCkKKyAgKi8gCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9NT0RFKF9fTU9ERV9fKSAoKCgoX19NT0RFX18pICYgKHVpbnQxNl90KTB4RkZGM1UpID09IDB4MDBVKSAmJiAoKF9fTU9ERV9fKSAhPSAodWludDE2X3QpMHgwMFUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIGZyYW1lIHBvbGFyaXR5IGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0NQT0xfXyBTTUFSVENBUkQgZnJhbWUgcG9sYXJpdHkuIAorICAqIEByZXR2YWwgU0VUIChfX0NQT0xfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fQ1BPTF9fIGlzIGludmFsaWQpCisgICovIAorI2RlZmluZSBJU19TTUFSVENBUkRfUE9MQVJJVFkoX19DUE9MX18pICgoKF9fQ1BPTF9fKSA9PSBTTUFSVENBUkRfUE9MQVJJVFlfTE9XKSB8fCAoKF9fQ1BPTF9fKSA9PSBTTUFSVENBUkRfUE9MQVJJVFlfSElHSCkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBTTUFSVENBUkQgZnJhbWUgcGhhc2UgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fQ1BIQV9fIFNNQVJUQ0FSRCBmcmFtZSBwaGFzZS4gCisgICogQHJldHZhbCBTRVQgKF9fQ1BIQV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19DUEhBX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX1BIQVNFKF9fQ1BIQV9fKSAoKChfX0NQSEFfXykgPT0gU01BUlRDQVJEX1BIQVNFXzFFREdFKSB8fCAoKF9fQ1BIQV9fKSA9PSBTTUFSVENBUkRfUEhBU0VfMkVER0UpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIGZyYW1lIGxhc3QgYml0IGNsb2NrIHB1bHNlIHNldHRpbmcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fTEFTVEJJVF9fIFNNQVJUQ0FSRCBmcmFtZSBsYXN0IGJpdCBjbG9jayBwdWxzZSBzZXR0aW5nLiAKKyAgKiBAcmV0dmFsIFNFVCAoX19MQVNUQklUX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0xBU1RCSVRfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19TTUFSVENBUkRfTEFTVEJJVChfX0xBU1RCSVRfXykgKCgoX19MQVNUQklUX18pID09IFNNQVJUQ0FSRF9MQVNUQklUX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEFTVEJJVF9fKSA9PSBTTUFSVENBUkRfTEFTVEJJVF9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIGZyYW1lIHNhbXBsaW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX09ORUJJVF9fIFNNQVJUQ0FSRCBmcmFtZSBzYW1wbGluZy4gCisgICogQHJldHZhbCBTRVQgKF9fT05FQklUX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX09ORUJJVF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9PTkVfQklUX1NBTVBMRShfX09ORUJJVF9fKSAoKChfX09ORUJJVF9fKSA9PSBTTUFSVENBUkRfT05FX0JJVF9TQU1QTEVfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19PTkVCSVRfXykgPT0gU01BUlRDQVJEX09ORV9CSVRfU0FNUExFX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBTTUFSVENBUkQgTkFDSyB0cmFuc21pc3Npb24gc2V0dGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19OQUNLX18gU01BUlRDQVJEIE5BQ0sgdHJhbnNtaXNzaW9uIHNldHRpbmcuIAorICAqIEByZXR2YWwgU0VUIChfX05BQ0tfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTkFDS19fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9OQUNLKF9fTkFDS19fKSAoKChfX05BQ0tfXykgPT0gU01BUlRDQVJEX05BQ0tfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX05BQ0tfXykgPT0gU01BUlRDQVJEX05BQ0tfRElTQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBTTUFSVENBUkQgcmVjZWl2ZXIgdGltZW91dCBzZXR0aW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1RJTUVPVVRfXyBTTUFSVENBUkQgcmVjZWl2ZXIgdGltZW91dCBzZXR0aW5nLiAKKyAgKiBAcmV0dmFsIFNFVCAoX19USU1FT1VUX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1RJTUVPVVRfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19TTUFSVENBUkRfVElNRU9VVChfX1RJTUVPVVRfXykgKCgoX19USU1FT1VUX18pID09IFNNQVJUQ0FSRF9USU1FT1VUX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVElNRU9VVF9fKSA9PSBTTUFSVENBUkRfVElNRU9VVF9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIGFkdmFuY2VkIGZlYXR1cmVzIGluaXRpYWxpemF0aW9uIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0lOSVRfXyBTTUFSVENBUkQgYWR2YW5jZWQgZmVhdHVyZXMgaW5pdGlhbGl6YXRpb24uIAorICAqIEByZXR2YWwgU0VUIChfX0lOSVRfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fSU5JVF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9BRFZGRUFUVVJFX0lOSVQoX19JTklUX18pICgoX19JTklUX18pIDw9IChTTUFSVENBUkRfQURWRkVBVFVSRV9OT19JTklUICAgICAgICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01BUlRDQVJEX0FEVkZFQVRVUkVfVFhJTlZFUlRfSU5JVCAgICAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1JYSU5WRVJUX0lOSVQgICAgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUFSVENBUkRfQURWRkVBVFVSRV9EQVRBSU5WRVJUX0lOSVQgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01BUlRDQVJEX0FEVkZFQVRVUkVfU1dBUF9JTklUICAgICAgICAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1JYT1ZFUlJVTkRJU0FCTEVfSU5JVCAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUFSVENBUkRfQURWRkVBVFVSRV9ETUFESVNBQkxFT05FUlJPUl9JTklUIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01BUlRDQVJEX0FEVkZFQVRVUkVfTVNCRklSU1RfSU5JVCkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBTTUFSVENBUkQgZnJhbWUgVFggaW52ZXJzaW9uIHNldHRpbmcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fVFhJTlZfXyBTTUFSVENBUkQgZnJhbWUgVFggaW52ZXJzaW9uIHNldHRpbmcuIAorICAqIEByZXR2YWwgU0VUIChfX1RYSU5WX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1RYSU5WX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX0FEVkZFQVRVUkVfVFhJTlYoX19UWElOVl9fKSAoKChfX1RYSU5WX18pID09IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1RYSU5WX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RYSU5WX18pID09IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1RYSU5WX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBTTUFSVENBUkQgZnJhbWUgUlggaW52ZXJzaW9uIHNldHRpbmcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fUlhJTlZfXyBTTUFSVENBUkQgZnJhbWUgUlggaW52ZXJzaW9uIHNldHRpbmcuIAorICAqIEByZXR2YWwgU0VUIChfX1JYSU5WX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1JYSU5WX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX0FEVkZFQVRVUkVfUlhJTlYoX19SWElOVl9fKSAoKChfX1JYSU5WX18pID09IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1JYSU5WX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JYSU5WX18pID09IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1JYSU5WX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBTTUFSVENBUkQgZnJhbWUgZGF0YSBpbnZlcnNpb24gc2V0dGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19EQVRBSU5WX18gU01BUlRDQVJEIGZyYW1lIGRhdGEgaW52ZXJzaW9uIHNldHRpbmcuIAorICAqIEByZXR2YWwgU0VUIChfX0RBVEFJTlZfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fREFUQUlOVl9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9BRFZGRUFUVVJFX0RBVEFJTlYoX19EQVRBSU5WX18pICgoKF9fREFUQUlOVl9fKSA9PSBTTUFSVENBUkRfQURWRkVBVFVSRV9EQVRBSU5WX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EQVRBSU5WX18pID09IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX0RBVEFJTlZfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFNNQVJUQ0FSRCBmcmFtZSBSWC9UWCBwaW5zIHN3YXAgc2V0dGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19TV0FQX18gU01BUlRDQVJEIGZyYW1lIFJYL1RYIHBpbnMgc3dhcCBzZXR0aW5nLiAKKyAgKiBAcmV0dmFsIFNFVCAoX19TV0FQX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1NXQVBfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19TTUFSVENBUkRfQURWRkVBVFVSRV9TV0FQKF9fU1dBUF9fKSAoKChfX1NXQVBfXykgPT0gU01BUlRDQVJEX0FEVkZFQVRVUkVfU1dBUF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1dBUF9fKSA9PSBTTUFSVENBUkRfQURWRkVBVFVSRV9TV0FQX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBTTUFSVENBUkQgZnJhbWUgb3ZlcnJ1biBzZXR0aW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX09WRVJSVU5fXyBTTUFSVENBUkQgZnJhbWUgb3ZlcnJ1biBzZXR0aW5nLiAKKyAgKiBAcmV0dmFsIFNFVCAoX19PVkVSUlVOX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX09WRVJSVU5fXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19TTUFSVENBUkRfT1ZFUlJVTihfX09WRVJSVU5fXykgKCgoX19PVkVSUlVOX18pID09IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX09WRVJSVU5fRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX09WRVJSVU5fXykgPT0gU01BUlRDQVJEX0FEVkZFQVRVUkVfT1ZFUlJVTl9ESVNBQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFNNQVJUQ0FSRCBETUEgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIG9uIGVycm9yIHNldHRpbmcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fRE1BX18gU01BUlRDQVJEIERNQSBlbmFibGluZyBvciBkaXNhYmxpbmcgb24gZXJyb3Igc2V0dGluZy4gCisgICogQHJldHZhbCBTRVQgKF9fRE1BX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0RNQV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9BRFZGRUFUVVJFX0RNQU9OUlhFUlJPUihfX0RNQV9fKSAoKChfX0RNQV9fKSA9PSBTTUFSVENBUkRfQURWRkVBVFVSRV9ETUFfRU5BQkxFT05SWEVSUk9SKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RNQV9fKSA9PSBTTUFSVENBUkRfQURWRkVBVFVSRV9ETUFfRElTQUJMRU9OUlhFUlJPUikpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBTTUFSVENBUkQgZnJhbWUgTVNCIGZpcnN0IHNldHRpbmcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fTVNCRklSU1RfXyBTTUFSVENBUkQgZnJhbWUgTVNCIGZpcnN0IHNldHRpbmcuIAorICAqIEByZXR2YWwgU0VUIChfX01TQkZJUlNUX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX01TQkZJUlNUX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX0FEVkZFQVRVUkVfTVNCRklSU1QoX19NU0JGSVJTVF9fKSAoKChfX01TQkZJUlNUX18pID09IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX01TQkZJUlNUX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01TQkZJUlNUX18pID09IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX01TQkZJUlNUX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBTTUFSVENBUkQgcmVxdWVzdCBwYXJhbWV0ZXIgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fUEFSQU1fXyBTTUFSVENBUkQgcmVxdWVzdCBwYXJhbWV0ZXIuIAorICAqIEByZXR2YWwgU0VUIChfX1BBUkFNX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1BBUkFNX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX1JFUVVFU1RfUEFSQU1FVEVSKF9fUEFSQU1fXykgKCgoX19QQVJBTV9fKSA9PSBTTUFSVENBUkRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQVJBTV9fKSA9PSBTTUFSVENBUkRfVFhEQVRBX0ZMVVNIX1JFUVVFU1QpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIFNNQVJUQ0FSRCBIQUwgRXh0ZW5kZWQgbW9kdWxlICovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9zbWFydGNhcmRfZXguaCIKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBTTUFSVENBUkRfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyogSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIEBhZGR0b2dyb3VwIFNNQVJUQ0FSRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgICogQHsKKyAgKi8KKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9Jbml0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfRGVJbml0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK3ZvaWQgSEFMX1NNQVJUQ0FSRF9Nc3BJbml0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK3ZvaWQgSEFMX1NNQVJUQ0FSRF9Nc3BEZUluaXQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBhZGR0b2dyb3VwIFNNQVJUQ0FSRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgICogQHsKKyAgKi8KKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9UcmFuc21pdChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9SZWNlaXZlKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1RyYW5zbWl0X0lUKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1JlY2VpdmVfSVQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfVHJhbnNtaXRfRE1BKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1JlY2VpdmVfRE1BKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CisvKiBUcmFuc2ZlciBBYm9ydCBmdW5jdGlvbnMgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfQWJvcnQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9BYm9ydFRyYW5zbWl0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfQWJvcnRSZWNlaXZlKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfQWJvcnRfSVQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9BYm9ydFRyYW5zbWl0X0lUKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfQWJvcnRSZWNlaXZlX0lUKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKKwordm9pZCBIQUxfU01BUlRDQVJEX0lSUUhhbmRsZXIoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOwordm9pZCBIQUxfU01BUlRDQVJEX1R4Q3BsdENhbGxiYWNrKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK3ZvaWQgSEFMX1NNQVJUQ0FSRF9SeENwbHRDYWxsYmFjayhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7Cit2b2lkIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjayhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7Cit2b2lkIEhBTF9TTUFSVENBUkRfQWJvcnRDcGx0Q2FsbGJhY2sgKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK3ZvaWQgSEFMX1NNQVJUQ0FSRF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrIChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7Cit2b2lkIEhBTF9TTUFSVENBUkRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrIChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGFkZHRvZ3JvdXAgU01BUlRDQVJEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMKKyAgKiBAeworICAqLworCitIQUxfU01BUlRDQVJEX1N0YXRlVHlwZURlZiBIQUxfU01BUlRDQVJEX0dldFN0YXRlKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK3VpbnQzMl90ICAgICAgICAgICAgICAgICAgIEhBTF9TTUFSVENBUkRfR2V0RXJyb3IoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkYzeHhfSEFMX1NNQVJUQ0FSRF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2hhbF9zbWFydGNhcmRfZXguaCBiL0luYy9zdG0zMmYzeHhfaGFsX3NtYXJ0Y2FyZF9leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MDI3NjkKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2hhbF9zbWFydGNhcmRfZXguaApAQCAtMCwwICsxLDIyMyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfc21hcnRjYXJkX2V4LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFNNQVJUQ0FSRCBIQUwgRXh0ZW5kZWQgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkYzeHhfSEFMX1NNQVJUQ0FSRF9FWF9ICisjZGVmaW5lIF9fU1RNMzJGM3h4X0hBTF9TTUFSVENBUkRfRVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBTTUFSVENBUkRFeAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTTUFSVENBUkRFeF9Qcml2YXRlX01hY3JvcyBTTUFSVENBUkQgRXh0ZW5kZWQgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworICAKKy8qKiBAYnJpZWYgIFJlcG9ydCB0aGUgU01BUlRDQVJEIGNsb2NrIHNvdXJjZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19DTE9DS1NPVVJDRV9fIG91dHB1dCB2YXJpYWJsZS4KKyAgKiBAcmV0dmFsIHRoZSBTTUFSVENBUkQgY2xvY2tpbmcgc291cmNlLCB3cml0dGVuIGluIF9fQ0xPQ0tTT1VSQ0VfXy4KKyAgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKyNkZWZpbmUgU01BUlRDQVJEX0dFVENMT0NLU09VUkNFKF9fSEFORExFX18sX19DTE9DS1NPVVJDRV9fKSAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZigoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMSkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDFfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0hTSTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9IU0k7ICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1NZU0NMSzogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9TWVNDTEs7ICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0xTRTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9MU0U7ICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7IFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQyKSAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX0NMT0NLU09VUkNFX18pID0gU01BUlRDQVJEX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQzKSAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX0NMT0NLU09VUkNFX18pID0gU01BUlRDQVJEX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX0NMT0NLU09VUkNFX18pID0gU01BUlRDQVJEX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSgwVSkKKyNlbHNlCisjZGVmaW5lIFNNQVJUQ0FSRF9HRVRDTE9DS1NPVVJDRShfX0hBTkRMRV9fLF9fQ0xPQ0tTT1VSQ0VfXykgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDEpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQxX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMjogICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfUENMSzI7ICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZigoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMikgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQyX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZigoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMykgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQzX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUoMFUpCisjZW5kaWYKKyAgCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFNNQVJUQ0FSREV4X0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJTyBvcGVyYXRpb24gbWV0aG9kcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogQGFkZHRvZ3JvdXAgU01BUlRDQVJERXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCisKKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICAgICAgICAgICAgICBIQUxfU01BUlRDQVJERXhfQmxvY2tMZW5ndGhfQ29uZmlnKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90IEJsb2NrTGVuZ3RoKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9TTUFSVENBUkRFeF9UaW1lT3V0X0NvbmZpZyhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgdWludDMyX3QgVGltZU91dFZhbHVlKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRFeF9FbmFibGVSZWNlaXZlclRpbWVPdXQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSREV4X0Rpc2FibGVSZWNlaXZlclRpbWVPdXQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkYzeHhfSEFMX1NNQVJUQ0FSRF9FWF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2hhbF9zbWJ1cy5oIGIvSW5jL3N0bTMyZjN4eF9oYWxfc21idXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjIxZWMyCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjN4eF9oYWxfc21idXMuaApAQCAtMCwwICsxLDY5OSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfc21idXMuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgU01CVVMgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0hBTF9TTUJVU19ICisjZGVmaW5lIF9fU1RNMzJGM3h4X0hBTF9TTUJVU19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgU01CVVMKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTTUJVU19FeHBvcnRlZF9UeXBlcyBTTUJVUyBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfQ29uZmlndXJhdGlvbl9TdHJ1Y3R1cmVfZGVmaW5pdGlvbiBTTUJVUyBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICogQGJyaWVmICBTTUJVUyBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFRpbWluZzsgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBTTUJVU19USU1JTkdSX3JlZ2lzdGVyIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbGN1bGF0ZWQgYnkgcmVmZXJyaW5nIHRvIFNNQlVTIGluaXRpYWxpemF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gaW4gUmVmZXJlbmNlIG1hbnVhbCAqLworICB1aW50MzJfdCBBbmFsb2dGaWx0ZXI7ICAgICAgICAgICAvKiE8IFNwZWNpZmllcyBpZiBBbmFsb2cgRmlsdGVyIGlzIGVuYWJsZSBvciBub3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTTUJVU19BbmFsb2dfRmlsdGVyICovCisKKyAgdWludDMyX3QgT3duQWRkcmVzczE7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGZpcnN0IGRldmljZSBvd24gYWRkcmVzcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSA3LWJpdCBvciAxMC1iaXQgYWRkcmVzcy4gKi8KKworICB1aW50MzJfdCBBZGRyZXNzaW5nTW9kZTsgICAgICAgICAvKiE8IFNwZWNpZmllcyBpZiA3LWJpdCBvciAxMC1iaXQgYWRkcmVzc2luZyBtb2RlIGZvciBtYXN0ZXIgaXMgc2VsZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTTUJVU19hZGRyZXNzaW5nX21vZGUgKi8KKworICB1aW50MzJfdCBEdWFsQWRkcmVzc01vZGU7ICAgICAgICAvKiE8IFNwZWNpZmllcyBpZiBkdWFsIGFkZHJlc3NpbmcgbW9kZSBpcyBzZWxlY3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQlVTX2R1YWxfYWRkcmVzc2luZ19tb2RlICovCisKKyAgdWludDMyX3QgT3duQWRkcmVzczI7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHNlY29uZCBkZXZpY2Ugb3duIGFkZHJlc3MgaWYgZHVhbCBhZGRyZXNzaW5nIG1vZGUgaXMgc2VsZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSA3LWJpdCBhZGRyZXNzLiAqLworCisgIHVpbnQzMl90IE93bkFkZHJlc3MyTWFza3M7ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBhY2tub2xlZGdlIG1hc2sgYWRkcmVzcyBzZWNvbmQgZGV2aWNlIG93biBhZGRyZXNzIGlmIGR1YWwgYWRkcmVzc2luZyBtb2RlIGlzIHNlbGVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTTUJVU19vd25fYWRkcmVzczJfbWFza3MuICovCisKKyAgdWludDMyX3QgR2VuZXJhbENhbGxNb2RlOyAgICAgICAgLyohPCBTcGVjaWZpZXMgaWYgZ2VuZXJhbCBjYWxsIG1vZGUgaXMgc2VsZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTTUJVU19nZW5lcmFsX2NhbGxfYWRkcmVzc2luZ19tb2RlLiAqLworCisgIHVpbnQzMl90IE5vU3RyZXRjaE1vZGU7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIGlmIG5vc3RyZXRjaCBtb2RlIGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01CVVNfbm9zdHJldGNoX21vZGUgKi8KKworICB1aW50MzJfdCBQYWNrZXRFcnJvckNoZWNrTW9kZTsgICAvKiE8IFNwZWNpZmllcyBpZiBQYWNrZXQgRXJyb3IgQ2hlY2sgbW9kZSBpcyBzZWxlY3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQlVTX3BhY2tldF9lcnJvcl9jaGVja19tb2RlICovCisKKyAgdWludDMyX3QgUGVyaXBoZXJhbE1vZGU7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hpY2ggbW9kZSBvZiBQZXJpcGhhbCBpcyBzZWxlY3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQlVTX3BlcmlwaGVyYWxfbW9kZSAqLworCisgIHVpbnQzMl90IFNNQnVzVGltZW91dDsgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjb250ZW50IG9mIHRoZSAzMiBCaXRzIFNNQlVTX1RJTUVPVVRfcmVnaXN0ZXIgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChFbmFibGUgYml0cyBhbmQgZGlmZmVyZW50IHRpbWVvdXQgdmFsdWVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbGN1bGF0ZWQgYnkgcmVmZXJyaW5nIHRvIFNNQlVTIGluaXRpYWxpemF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gaW4gUmVmZXJlbmNlIG1hbnVhbCAqLworfSBTTUJVU19Jbml0VHlwZURlZjsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX3N0YXRlX2RlZmluaXRpb24gSEFMIHN0YXRlIGRlZmluaXRpb24KKyAgKiBAYnJpZWYgIEhBTCBTdGF0ZSBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX1NUQVRFX1JFU0VUICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAvKiE8IFNNQlVTIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgb3IgZGlzYWJsZWQgICAgICAgICAqLworI2RlZmluZSBIQUxfU01CVVNfU1RBVEVfUkVBRFkgICAgICAgICAgICgweDAwMDAwMDAxVSkgIC8qITwgU01CVVMgaW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9TTUJVU19TVEFURV9CVVNZICAgICAgICAgICAgKDB4MDAwMDAwMDJVKSAgLyohPCBTTUJVUyBpbnRlcm5hbCBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1RYICAoMHgwMDAwMDAxMlUpICAvKiE8IE1hc3RlciBEYXRhIFRyYW5zbWlzc2lvbiBwcm9jZXNzIGlzIG9uZ29pbmcgICAqLworI2RlZmluZSBIQUxfU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfUlggICgweDAwMDAwMDIyVSkgIC8qITwgTWFzdGVyIERhdGEgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICovCisjZGVmaW5lIEhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1RYICAgKDB4MDAwMDAwMzJVKSAgLyohPCBTbGF2ZSBEYXRhIFRyYW5zbWlzc2lvbiBwcm9jZXNzIGlzIG9uZ29pbmcgICAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfUlggICAoMHgwMDAwMDA0MlUpICAvKiE8IFNsYXZlIERhdGEgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAqLworI2RlZmluZSBIQUxfU01CVVNfU1RBVEVfVElNRU9VVCAgICAgICAgICgweDAwMDAwMDAzVSkgIC8qITwgVGltZW91dCBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9TTUJVU19TVEFURV9FUlJPUiAgICAgICAgICAgKDB4MDAwMDAwMDRVKSAgLyohPCBSZWNlcHRpb24gcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX1NUQVRFX0xJU1RFTiAgICAgICAgICAoMHgwMDAwMDAwOFUpICAgLyohPCBBZGRyZXNzIExpc3RlbiBNb2RlIGlzIG9uZ29pbmcgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfRXJyb3JfQ29kZV9kZWZpbml0aW9uIFNNQlVTIEVycm9yIENvZGUgZGVmaW5pdGlvbgorICAqIEBicmllZiAgU01CVVMgRXJyb3IgQ29kZSBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX0VSUk9SX05PTkUgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgIC8qITwgTm8gZXJyb3IgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX0VSUk9SX0JFUlIgICAgICAgICAgICAoMHgwMDAwMDAwMVUpICAgIC8qITwgQkVSUiBlcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX0VSUk9SX0FSTE8gICAgICAgICAgICAoMHgwMDAwMDAwMlUpICAgIC8qITwgQVJMTyBlcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX0VSUk9SX0FDS0YgICAgICAgICAgICAoMHgwMDAwMDAwNFUpICAgIC8qITwgQUNLRiBlcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX0VSUk9SX09WUiAgICAgICAgICAgICAoMHgwMDAwMDAwOFUpICAgIC8qITwgT1ZSIGVycm9yICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX0VSUk9SX0hBTFRJTUVPVVQgICAgICAoMHgwMDAwMDAxMFUpICAgIC8qITwgVGltZW91dCBlcnJvciAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX0VSUk9SX0JVU1RJTUVPVVQgICAgICAoMHgwMDAwMDAyMFUpICAgIC8qITwgQnVzIFRpbWVvdXQgZXJyb3IgICAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX0VSUk9SX0FMRVJUICAgICAgICAgICAoMHgwMDAwMDA0MFUpICAgIC8qITwgQWxlcnQgZXJyb3IgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX0VSUk9SX1BFQ0VSUiAgICAgICAgICAoMHgwMDAwMDA4MFUpICAgIC8qITwgUEVDIGVycm9yICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfaGFuZGxlX1N0cnVjdHVyZV9kZWZpbml0aW9uIFNNQlVTIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqIEBicmllZiAgU01CVVMgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIEkyQ19UeXBlRGVmICAgICAgICAgICAgICAgICAgKkluc3RhbmNlOyAgICAgICAvKiE8IFNNQlVTIHJlZ2lzdGVycyBiYXNlIGFkZHJlc3MgICAgICAgKi8KKworICBTTUJVU19Jbml0VHlwZURlZiAgICAgICAgICAgIEluaXQ7ICAgICAgICAgICAgLyohPCBTTUJVUyBjb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgICAgICovCisKKyAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAqcEJ1ZmZQdHI7ICAgICAgIC8qITwgUG9pbnRlciB0byBTTUJVUyB0cmFuc2ZlciBidWZmZXIgICAqLworCisgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgWGZlclNpemU7ICAgICAgICAvKiE8IFNNQlVTIHRyYW5zZmVyIHNpemUgICAgICAgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQxNl90ICAgICAgICAgICAgICAgIFhmZXJDb3VudDsgICAgICAgLyohPCBTTUJVUyB0cmFuc2ZlciBjb3VudGVyICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICAgICBYZmVyT3B0aW9uczsgICAgIC8qITwgU01CVVMgdHJhbnNmZXIgb3B0aW9ucyAgICAgICAgICAgICAqLworCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgICAgUHJldmlvdXNTdGF0ZTsgICAvKiE8IFNNQlVTIGNvbW11bmljYXRpb24gUHJldmlvdXMgc3RhdGUgKi8KKworICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICAgICAgIExvY2s7ICAgICAgICAgICAgLyohPCBTTUJVUyBsb2NraW5nIG9iamVjdCAgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICAgICBTdGF0ZTsgICAgICAgICAgIC8qITwgU01CVVMgY29tbXVuaWNhdGlvbiBzdGF0ZSAgICAgICAgICAqLworCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgICAgRXJyb3JDb2RlOyAgICAgICAvKiE8IFNNQlVTIEVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgKi8KKworfSBTTUJVU19IYW5kbGVUeXBlRGVmOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfRXhwb3J0ZWRfQ29uc3RhbnRzIFNNQlVTIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfQW5hbG9nX0ZpbHRlciBTTUJVUyBBbmFsb2cgRmlsdGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01CVVNfQU5BTE9HRklMVEVSX0VOQUJMRSAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU01CVVNfQU5BTE9HRklMVEVSX0RJU0FCTEUgICAgICAgICAgICAgIEkyQ19DUjFfQU5GT0ZGCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQlVTX2FkZHJlc3NpbmdfbW9kZSBTTUJVUyBhZGRyZXNzaW5nIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBTTUJVU19BRERSRVNTSU5HTU9ERV83QklUICAgICAgICAgICAgICAgKDB4MDAwMDAwMDFVKQorI2RlZmluZSBTTUJVU19BRERSRVNTSU5HTU9ERV8xMEJJVCAgICAgICAgICAgICAgKDB4MDAwMDAwMDJVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUJVU19kdWFsX2FkZHJlc3NpbmdfbW9kZSBTTUJVUyBkdWFsIGFkZHJlc3NpbmcgbW9kZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgU01CVVNfRFVBTEFERFJFU1NfRElTQUJMRSAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU01CVVNfRFVBTEFERFJFU1NfRU5BQkxFICAgICAgICAgICAgICAgIEkyQ19PQVIyX09BMkVOCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQlVTX293bl9hZGRyZXNzMl9tYXNrcyBTTUJVUyBvd25hZGRyZXNzMiBtYXNrcworICAqIEB7CisgICovCisKKyNkZWZpbmUgU01CVVNfT0EyX05PTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAwVSkKKyNkZWZpbmUgU01CVVNfT0EyX01BU0swMSAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAxVSkKKyNkZWZpbmUgU01CVVNfT0EyX01BU0swMiAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAyVSkKKyNkZWZpbmUgU01CVVNfT0EyX01BU0swMyAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAzVSkKKyNkZWZpbmUgU01CVVNfT0EyX01BU0swNCAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA0VSkKKyNkZWZpbmUgU01CVVNfT0EyX01BU0swNSAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA1VSkKKyNkZWZpbmUgU01CVVNfT0EyX01BU0swNiAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA2VSkKKyNkZWZpbmUgU01CVVNfT0EyX01BU0swNyAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA3VSkKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBTTUJVU19nZW5lcmFsX2NhbGxfYWRkcmVzc2luZ19tb2RlIFNNQlVTIGdlbmVyYWwgY2FsbCBhZGRyZXNzaW5nIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBTTUJVU19HRU5FUkFMQ0FMTF9ESVNBQkxFICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTTUJVU19HRU5FUkFMQ0FMTF9FTkFCTEUgICAgICAgICAgICAgICAgSTJDX0NSMV9HQ0VOCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQlVTX25vc3RyZXRjaF9tb2RlICBTTUJVUyBub3N0cmV0Y2ggbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFNNQlVTX05PU1RSRVRDSF9ESVNBQkxFICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNNQlVTX05PU1RSRVRDSF9FTkFCTEUgICAgICAgICAgICAgICAgICBJMkNfQ1IxX05PU1RSRVRDSAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUJVU19wYWNrZXRfZXJyb3JfY2hlY2tfbW9kZSBTTUJVUyBwYWNrZXQgZXJyb3IgY2hlY2sgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFNNQlVTX1BFQ19ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNNQlVTX1BFQ19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX1BFQ0VOCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQlVTX3BlcmlwaGVyYWxfbW9kZSBTTUJVUyBwZXJpcGhlcmFsIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBTTUJVU19QRVJJUEhFUkFMX01PREVfU01CVVNfSE9TVCAgICAgICAgSTJDX0NSMV9TTUJIRU4KKyNkZWZpbmUgU01CVVNfUEVSSVBIRVJBTF9NT0RFX1NNQlVTX1NMQVZFICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU01CVVNfUEVSSVBIRVJBTF9NT0RFX1NNQlVTX1NMQVZFX0FSUCAgIEkyQ19DUjFfU01CREVOCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQlVTX1JlbG9hZEVuZE1vZGVfZGVmaW5pdGlvbiBTTUJVUyBSZWxvYWRFbmRNb2RlIGRlZmluaXRpb24KKyAgKiBAeworICAqLworCisjZGVmaW5lICBTTUJVU19TT0ZURU5EX01PREUgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lICBTTUJVU19SRUxPQURfTU9ERSAgICAgICAgICAgICAgICAgICAgICBJMkNfQ1IyX1JFTE9BRAorI2RlZmluZSAgU01CVVNfQVVUT0VORF9NT0RFICAgICAgICAgICAgICAgICAgICAgSTJDX0NSMl9BVVRPRU5ECisjZGVmaW5lICBTTUJVU19TRU5EUEVDX01PREUgICAgICAgICAgICAgICAgICAgICBJMkNfQ1IyX1BFQ0JZVEUKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfU3RhcnRTdG9wTW9kZV9kZWZpbml0aW9uIFNNQlVTIFN0YXJ0U3RvcE1vZGUgZGVmaW5pdGlvbgorICAqIEB7CisgICovCisKKyNkZWZpbmUgIFNNQlVTX05PX1NUQVJUU1RPUCAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgIFNNQlVTX0dFTkVSQVRFX1NUT1AgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkoMHg4MDAwMDAwMFUgfCBJMkNfQ1IyX1NUT1ApCisjZGVmaW5lICBTTUJVU19HRU5FUkFURV9TVEFSVF9SRUFEICAgICAgICAgICAgICAodWludDMyX3QpKDB4ODAwMDAwMDBVIHwgSTJDX0NSMl9TVEFSVCB8IEkyQ19DUjJfUkRfV1JOKQorI2RlZmluZSAgU01CVVNfR0VORVJBVEVfU1RBUlRfV1JJVEUgICAgICAgICAgICAgKHVpbnQzMl90KSgweDgwMDAwMDAwVSB8IEkyQ19DUjJfU1RBUlQpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQlVTX1hmZXJPcHRpb25zX2RlZmluaXRpb24gU01CVVMgWGZlck9wdGlvbnMgZGVmaW5pdGlvbgorICAqIEB7CisgICovCisKKy8qIExpc3Qgb2YgWGZlck9wdGlvbnMgaW4gdXNhZ2Ugb2YgOgorICogMS0gUmVzdGFydCBjb25kaXRpb24gd2hlbiBkaXJlY3Rpb24gY2hhbmdlCisgKiAyLSBObyBSZXN0YXJ0IGNvbmRpdGlvbiBpbiBvdGhlciB1c2UgY2FzZXMKKyAqLworI2RlZmluZSAgU01CVVNfRklSU1RfRlJBTUUgICAgICAgICAgICAgICAgICAgICAgU01CVVNfU09GVEVORF9NT0RFCisjZGVmaW5lICBTTUJVU19ORVhUX0ZSQU1FICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShTTUJVU19SRUxPQURfTU9ERSB8IFNNQlVTX1NPRlRFTkRfTU9ERSkpCisjZGVmaW5lICBTTUJVU19GSVJTVF9BTkRfTEFTVF9GUkFNRV9OT19QRUMgICAgICBTTUJVU19BVVRPRU5EX01PREUKKyNkZWZpbmUgIFNNQlVTX0xBU1RfRlJBTUVfTk9fUEVDICAgICAgICAgICAgICAgIFNNQlVTX0FVVE9FTkRfTU9ERQorI2RlZmluZSAgU01CVVNfRklSU1RfQU5EX0xBU1RfRlJBTUVfV0lUSF9QRUMgICAgKCh1aW50MzJfdCkoU01CVVNfQVVUT0VORF9NT0RFIHwgU01CVVNfU0VORFBFQ19NT0RFKSkKKyNkZWZpbmUgIFNNQlVTX0xBU1RfRlJBTUVfV0lUSF9QRUMgICAgICAgICAgICAgICgodWludDMyX3QpKFNNQlVTX0FVVE9FTkRfTU9ERSB8IFNNQlVTX1NFTkRQRUNfTU9ERSkpCisKKy8qIExpc3Qgb2YgWGZlck9wdGlvbnMgaW4gdXNhZ2Ugb2YgOgorICogMS0gUmVzdGFydCBjb25kaXRpb24gaW4gYWxsIHVzZSBjYXNlcyAoZGlyZWN0aW9uIGNoYW5nZSBvciBub3QpCisgKi8KKyNkZWZpbmUgIFNNQlVTX09USEVSX0ZSQU1FX05PX1BFQyAgICAgICAgICAgICAgICgweDAwMDAwMEFBVSkKKyNkZWZpbmUgIFNNQlVTX09USEVSX0ZSQU1FX1dJVEhfUEVDICAgICAgICAgICAgICgweDAwMDBBQTAwVSkKKyNkZWZpbmUgIFNNQlVTX09USEVSX0FORF9MQVNUX0ZSQU1FX05PX1BFQyAgICAgICgweDAwQUEwMDAwVSkKKyNkZWZpbmUgIFNNQlVTX09USEVSX0FORF9MQVNUX0ZSQU1FX1dJVEhfUEVDICAgICgweEFBMDAwMDAwVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfSW50ZXJydXB0X2NvbmZpZ3VyYXRpb25fZGVmaW5pdGlvbiBTTUJVUyBJbnRlcnJ1cHQgY29uZmlndXJhdGlvbiBkZWZpbml0aW9uCisgICogQGJyaWVmIFNNQlVTIEludGVycnVwdCBkZWZpbml0aW9uCisgICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAweFhYWFhYWFhYCisgICogICAgICAgICAgIC0gWFhYWFhYWFggIDogSW50ZXJydXB0IGNvbnRyb2wgbWFzaworICAqIEB7CisgICovCisjZGVmaW5lIFNNQlVTX0lUX0VSUkkgICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX0VSUklFCisjZGVmaW5lIFNNQlVTX0lUX1RDSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX1RDSUUKKyNkZWZpbmUgU01CVVNfSVRfU1RPUEkgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfU1RPUElFCisjZGVmaW5lIFNNQlVTX0lUX05BQ0tJICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX05BQ0tJRQorI2RlZmluZSBTTUJVU19JVF9BRERSSSAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NSMV9BRERSSUUKKyNkZWZpbmUgU01CVVNfSVRfUlhJICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfUlhJRQorI2RlZmluZSBTTUJVU19JVF9UWEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NSMV9UWElFCisjZGVmaW5lIFNNQlVTX0lUX1RYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU01CVVNfSVRfRVJSSSB8IFNNQlVTX0lUX1RDSSB8IFNNQlVTX0lUX1NUT1BJIHwgU01CVVNfSVRfTkFDS0kgfCBTTUJVU19JVF9UWEkpCisjZGVmaW5lIFNNQlVTX0lUX1JYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU01CVVNfSVRfRVJSSSB8IFNNQlVTX0lUX1RDSSB8IFNNQlVTX0lUX05BQ0tJIHwgU01CVVNfSVRfUlhJKQorI2RlZmluZSBTTUJVU19JVF9BTEVSVCAgICAgICAgICAgICAgICAgICAgICAgICAgKFNNQlVTX0lUX0VSUkkpCisjZGVmaW5lIFNNQlVTX0lUX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAoU01CVVNfSVRfQUREUkkgfCBTTUJVU19JVF9TVE9QSSB8IFNNQlVTX0lUX05BQ0tJKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUJVU19GbGFnX2RlZmluaXRpb24gU01CVVMgRmxhZyBkZWZpbml0aW9uCisgICogQGJyaWVmIEZsYWcgZGVmaW5pdGlvbgorICAqICAgICAgICBFbGVtZW50cyB2YWx1ZXMgY29udmVudGlvbjogMHhYWFhYWVlZWQorICAqICAgICAgICAgICAtIFhYWFhYWFhYICA6IEZsYWcgbWFzaworICAqIEB7CisgICovCisKKyNkZWZpbmUgIFNNQlVTX0ZMQUdfVFhFICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfVFhFCisjZGVmaW5lICBTTUJVU19GTEFHX1RYSVMgICAgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX1RYSVMKKyNkZWZpbmUgIFNNQlVTX0ZMQUdfUlhORSAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfUlhORQorI2RlZmluZSAgU01CVVNfRkxBR19BRERSICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9BRERSCisjZGVmaW5lICBTTUJVU19GTEFHX0FGICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX05BQ0tGCisjZGVmaW5lICBTTUJVU19GTEFHX1NUT1BGICAgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX1NUT1BGCisjZGVmaW5lICBTTUJVU19GTEFHX1RDICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX1RDCisjZGVmaW5lICBTTUJVU19GTEFHX1RDUiAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX1RDUgorI2RlZmluZSAgU01CVVNfRkxBR19CRVJSICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9CRVJSCisjZGVmaW5lICBTTUJVU19GTEFHX0FSTE8gICAgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX0FSTE8KKyNkZWZpbmUgIFNNQlVTX0ZMQUdfT1ZSICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfT1ZSCisjZGVmaW5lICBTTUJVU19GTEFHX1BFQ0VSUiAgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX1BFQ0VSUgorI2RlZmluZSAgU01CVVNfRkxBR19USU1FT1VUICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9USU1FT1VUCisjZGVmaW5lICBTTUJVU19GTEFHX0FMRVJUICAgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX0FMRVJUCisjZGVmaW5lICBTTUJVU19GTEFHX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX0JVU1kKKyNkZWZpbmUgIFNNQlVTX0ZMQUdfRElSICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfRElSCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU01CVVNfRXhwb3J0ZWRfTWFjcm9zIFNNQlVTIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIFJlc2V0IFNNQlVTIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUJVUyBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQlVTX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRVNFVCkKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgU01CVVMgaW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUJVUyBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHNvdXJjZSB0byBlbmFibGUuCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfSVRfRVJSSSAgRXJyb3JzIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9UQ0kgICBUcmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfSVRfU1RPUEkgU1RPUCBkZXRlY3Rpb24gaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0lUX05BQ0tJIE5BQ0sgcmVjZWl2ZWQgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0lUX0FERFJJIEFkZHJlc3MgbWF0Y2ggaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0lUX1JYSSAgIFJYIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9UWEkgICBUWCBpbnRlcnJ1cHQgZW5hYmxlCisgICoKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01CVVNfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSB8PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBTTUJVUyBpbnRlcnJ1cHRzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQlVTIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgc291cmNlIHRvIGRpc2FibGUuCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfSVRfRVJSSSAgRXJyb3JzIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9UQ0kgICBUcmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfSVRfU1RPUEkgU1RPUCBkZXRlY3Rpb24gaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0lUX05BQ0tJIE5BQ0sgcmVjZWl2ZWQgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0lUX0FERFJJIEFkZHJlc3MgbWF0Y2ggaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0lUX1JYSSAgIFJYIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9UWEkgICBUWCBpbnRlcnJ1cHQgZW5hYmxlCisgICoKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01CVVNfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmPSAofihfX0lOVEVSUlVQVF9fKSkpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTTUJVUyBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQlVTIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBTTUJVUyBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfSVRfRVJSSSAgRXJyb3JzIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9UQ0kgICBUcmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfSVRfU1RPUEkgU1RPUCBkZXRlY3Rpb24gaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0lUX05BQ0tJIE5BQ0sgcmVjZWl2ZWQgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0lUX0FERFJJIEFkZHJlc3MgbWF0Y2ggaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0lUX1JYSSAgIFJYIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9UWEkgICBUWCBpbnRlcnJ1cHQgZW5hYmxlCisgICoKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JVF9fIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfU01CVVNfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJiAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSkgPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFNNQlVTIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUJVUyBIYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19UWEUgICAgIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX1RYSVMgICAgVHJhbnNtaXQgaW50ZXJydXB0IHN0YXR1cworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfUlhORSAgICBSZWNlaXZlIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19BRERSICAgIEFkZHJlc3MgbWF0Y2hlZCAoc2xhdmUgbW9kZSkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX0FGICAgICAgTkFDSyByZWNlaXZlZCBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19TVE9QRiAgIFNUT1AgZGV0ZWN0aW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX1RDICAgICAgVHJhbnNmZXIgY29tcGxldGUgKG1hc3RlciBtb2RlKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfVENSICAgICBUcmFuc2ZlciBjb21wbGV0ZSByZWxvYWQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX0JFUlIgICAgQnVzIGVycm9yCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19BUkxPICAgIEFyYml0cmF0aW9uIGxvc3QKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX09WUiAgICAgT3ZlcnJ1bi9VbmRlcnJ1bgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfUEVDRVJSICBQRUMgZXJyb3IgaW4gcmVjZXB0aW9uCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19USU1FT1VUIFRpbWVvdXQgb3IgVGxvdyBkZXRlY3Rpb24gZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfQUxFUlQgICBTTUJ1cyBhbGVydAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfQlVTWSAgICBCdXMgYnVzeQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfRElSICAgICBUcmFuc2ZlciBkaXJlY3Rpb24gKHNsYXZlIG1vZGUpCisgICoKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19GTEFHX18gKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBTTUJVU19GTEFHX01BU0sgICgweDAwMDFGRkZGVSkKKyNkZWZpbmUgX19IQUxfU01CVVNfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpICYgKChfX0ZMQUdfXykgJiBTTUJVU19GTEFHX01BU0spKSA9PSAoKF9fRkxBR19fKSAmIFNNQlVTX0ZMQUdfTUFTSykpKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgU01CVVMgcGVuZGluZyBmbGFncyB3aGljaCBhcmUgY2xlYXJlZCBieSB3cml0aW5nIDEgaW4gYSBzcGVjaWZpYyBiaXQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01CVVMgSGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNsZWFyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19BRERSICAgIEFkZHJlc3MgbWF0Y2hlZCAoc2xhdmUgbW9kZSkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX0FGICAgICAgTkFDSyByZWNlaXZlZCBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19TVE9QRiAgIFNUT1AgZGV0ZWN0aW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX0JFUlIgICAgQnVzIGVycm9yCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19BUkxPICAgIEFyYml0cmF0aW9uIGxvc3QKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX09WUiAgICAgT3ZlcnJ1bi9VbmRlcnJ1bgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfUEVDRVJSICBQRUMgZXJyb3IgaW4gcmVjZXB0aW9uCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19USU1FT1VUIFRpbWVvdXQgb3IgVGxvdyBkZXRlY3Rpb24gZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfQUxFUlQgICBTTUJ1cyBhbGVydAorICAqCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JQ1IgPSAoX19GTEFHX18pKQorCisvKiogQGJyaWVmICBFbmFibGUgdGhlIHNwZWNpZmllZCBTTUJVUyBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQlVTIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01CVVNfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgKFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxLCBJMkNfQ1IxX1BFKSkKKworLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIFNNQlVTIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01CVVMgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TTUJVU19ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAoQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSwgSTJDX0NSMV9QRSkpCisKKy8qKiBAYnJpZWYgIEdlbmVyYXRlIGEgTm9uLUFja25vd2xlZGdlIFNNQlVTIHBlcmlwaGVyYWwgaW4gU2xhdmUgbW9kZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUJVUyBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQlVTX0dFTkVSQVRFX05BQ0soX19IQU5ETEVfXykgICAgICAgICAgIChTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiwgSTJDX0NSMl9OQUNLKSkKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTTUJVU19Qcml2YXRlX01hY3JvIFNNQlVTIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworI2RlZmluZSBJU19TTUJVU19BTkFMT0dfRklMVEVSKEZJTFRFUikgICAgICAgICAgICAgICAgICAoKChGSUxURVIpID09IFNNQlVTX0FOQUxPR0ZJTFRFUl9FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZJTFRFUikgPT0gU01CVVNfQU5BTE9HRklMVEVSX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX1NNQlVTX0RJR0lUQUxfRklMVEVSKEZJTFRFUikgICAgICAgICAgICAgICAgICgoRklMVEVSKSA8PSAweDAwMDAwMDBGVSkKKworI2RlZmluZSBJU19TTUJVU19BRERSRVNTSU5HX01PREUoTU9ERSkgICAgICAgICAgICAgICAgICAoKChNT0RFKSA9PSBTTUJVU19BRERSRVNTSU5HTU9ERV83QklUKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gU01CVVNfQUREUkVTU0lOR01PREVfMTBCSVQpKQorCisjZGVmaW5lIElTX1NNQlVTX0RVQUxfQUREUkVTUyhBRERSRVNTKSAgICAgICAgICAgICAgICAgICgoKEFERFJFU1MpID09IFNNQlVTX0RVQUxBRERSRVNTX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFERFJFU1MpID09IFNNQlVTX0RVQUxBRERSRVNTX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfU01CVVNfT1dOX0FERFJFU1MyX01BU0soTUFTSykgICAgICAgICAgICAgICAgKCgoTUFTSykgPT0gU01CVVNfT0EyX05PTUFTSykgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBTTUJVU19PQTJfTUFTSzAxKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFNNQlVTX09BMl9NQVNLMDIpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gU01CVVNfT0EyX01BU0swMykgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBTTUJVU19PQTJfTUFTSzA0KSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFNNQlVTX09BMl9NQVNLMDUpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gU01CVVNfT0EyX01BU0swNikgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBTTUJVU19PQTJfTUFTSzA3KSkKKworI2RlZmluZSBJU19TTUJVU19HRU5FUkFMX0NBTEwoQ0FMTCkgICAgICAgICAgICAgICAgICAgICAoKChDQUxMKSA9PSBTTUJVU19HRU5FUkFMQ0FMTF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENBTEwpID09IFNNQlVTX0dFTkVSQUxDQUxMX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfU01CVVNfTk9fU1RSRVRDSChTVFJFVENIKSAgICAgICAgICAgICAgICAgICAgKCgoU1RSRVRDSCkgPT0gU01CVVNfTk9TVFJFVENIX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RSRVRDSCkgPT0gU01CVVNfTk9TVFJFVENIX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfU01CVVNfUEVDKFBFQykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoUEVDKSA9PSBTTUJVU19QRUNfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVDKSA9PSBTTUJVU19QRUNfRU5BQkxFKSkKKworI2RlZmluZSBJU19TTUJVU19QRVJJUEhFUkFMX01PREUoTU9ERSkgICAgICAgICAgICAgICAgICAoKChNT0RFKSA9PSBTTUJVU19QRVJJUEhFUkFMX01PREVfU01CVVNfSE9TVCkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gU01CVVNfUEVSSVBIRVJBTF9NT0RFX1NNQlVTX1NMQVZFKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gU01CVVNfUEVSSVBIRVJBTF9NT0RFX1NNQlVTX1NMQVZFX0FSUCkpCisKKyNkZWZpbmUgSVNfU01CVVNfVFJBTlNGRVJfTU9ERShNT0RFKSAgICAgICAgICAgICAgICAgICAgKCgoTU9ERSkgPT0gU01CVVNfUkVMT0FEX01PREUpICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gU01CVVNfQVVUT0VORF9NT0RFKSAgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBTTUJVU19TT0ZURU5EX01PREUpICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFNNQlVTX1NFTkRQRUNfTU9ERSkgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gKFNNQlVTX1JFTE9BRF9NT0RFIHwgU01CVVNfU0VORFBFQ19NT0RFKSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSAoU01CVVNfQVVUT0VORF9NT0RFIHwgU01CVVNfU0VORFBFQ19NT0RFKSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IChTTUJVU19BVVRPRU5EX01PREUgfCBTTUJVU19SRUxPQURfTU9ERSkpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gKFNNQlVTX0FVVE9FTkRfTU9ERSB8IFNNQlVTX1NFTkRQRUNfTU9ERSB8IFNNQlVTX1JFTE9BRF9NT0RFICkpKQorCisKKyNkZWZpbmUgSVNfU01CVVNfVFJBTlNGRVJfUkVRVUVTVChSRVFVRVNUKSAgICAgICAgICAgICAgKCgoUkVRVUVTVCkgPT0gU01CVVNfR0VORVJBVEVfU1RPUCkgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IFNNQlVTX0dFTkVSQVRFX1NUQVJUX1JFQUQpICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IFNNQlVTX0dFTkVSQVRFX1NUQVJUX1dSSVRFKSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IFNNQlVTX05PX1NUQVJUU1RPUCkpCisKKworI2RlZmluZSBJU19TTUJVU19UUkFOU0ZFUl9PUFRJT05TX1JFUVVFU1QoUkVRVUVTVCkgICAgICAoKChSRVFVRVNUKSA9PSBTTUJVU19GSVJTVF9GUkFNRSkgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBTTUJVU19ORVhUX0ZSQU1FKSAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IFNNQlVTX0ZJUlNUX0FORF9MQVNUX0ZSQU1FX05PX1BFQykgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gU01CVVNfTEFTVF9GUkFNRV9OT19QRUMpICAgICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBTTUJVU19GSVJTVF9BTkRfTEFTVF9GUkFNRV9XSVRIX1BFQykgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IFNNQlVTX0xBU1RfRlJBTUVfV0lUSF9QRUMpICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTX1NNQlVTX1RSQU5TRkVSX09USEVSX09QVElPTlNfUkVRVUVTVChSRVFVRVNUKSkKKworI2RlZmluZSBJU19TTUJVU19UUkFOU0ZFUl9PVEhFUl9PUFRJT05TX1JFUVVFU1QoUkVRVUVTVCkgKCgoUkVRVUVTVCkgPT0gU01CVVNfT1RIRVJfRlJBTUVfTk9fUEVDKSAgICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBTTUJVU19PVEhFUl9BTkRfTEFTVF9GUkFNRV9OT19QRUMpICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IFNNQlVTX09USEVSX0ZSQU1FX1dJVEhfUEVDKSAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gU01CVVNfT1RIRVJfQU5EX0xBU1RfRlJBTUVfV0lUSF9QRUMpKQorCisjZGVmaW5lIFNNQlVTX1JFU0VUX0NSMShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmPSAodWludDMyX3QpfigodWludDMyX3QpKEkyQ19DUjFfU01CSEVOIHwgSTJDX0NSMV9TTUJERU4gfCBJMkNfQ1IxX1BFQ0VOKSkpCisjZGVmaW5lIFNNQlVTX1JFU0VUX0NSMihfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiAmPSAodWludDMyX3QpfigodWludDMyX3QpKEkyQ19DUjJfU0FERCB8IEkyQ19DUjJfSEVBRDEwUiB8IEkyQ19DUjJfTkJZVEVTIHwgSTJDX0NSMl9SRUxPQUQgfCBJMkNfQ1IyX1JEX1dSTikpKQorCisjZGVmaW5lIFNNQlVTX0dFTkVSQVRFX1NUQVJUKF9fQURETU9ERV9fLF9fQUREUkVTU19fKSAgICAgKCgoX19BRERNT0RFX18pID09IFNNQlVTX0FERFJFU1NJTkdNT0RFXzdCSVQpID8gKHVpbnQzMl90KSgoKCh1aW50MzJfdCkoX19BRERSRVNTX18pICYgKEkyQ19DUjJfU0FERCkpIHwgKEkyQ19DUjJfU1RBUlQpIHwgKEkyQ19DUjJfQVVUT0VORCkpICYgKH5JMkNfQ1IyX1JEX1dSTikpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSgoKCh1aW50MzJfdCkoX19BRERSRVNTX18pICYgKEkyQ19DUjJfU0FERCkpIHwgKEkyQ19DUjJfQUREMTApIHwgKEkyQ19DUjJfU1RBUlQpKSAmICh+STJDX0NSMl9SRF9XUk4pKSkKKworI2RlZmluZSBTTUJVU19HRVRfQUREUl9NQVRDSChfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSICYgSTJDX0lTUl9BRERDT0RFKSA+PiAxN1UpCisjZGVmaW5lIFNNQlVTX0dFVF9ESVIoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgJiBJMkNfSVNSX0RJUikgPj4gMTZVKQorI2RlZmluZSBTTUJVU19HRVRfU1RPUF9NT0RFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgJiBJMkNfQ1IyX0FVVE9FTkQpCisjZGVmaW5lIFNNQlVTX0dFVF9QRUNfTU9ERShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiAmIEkyQ19DUjJfUEVDQllURSkKKyNkZWZpbmUgU01CVVNfR0VUX0FMRVJUX0VOQUJMRUQoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmIEkyQ19DUjFfQUxFUlRFTikKKworI2RlZmluZSBTTUJVU19HRVRfSVNSX1JFRyhfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSKQorI2RlZmluZSBTTUJVU19DSEVDS19GTEFHKF9fSVNSX18sIF9fRkxBR19fKSAgICAgICAgICAgICAoKCgoX19JU1JfXykgJiAoKF9fRkxBR19fKSAmIFNNQlVTX0ZMQUdfTUFTSykpID09ICgoX19GTEFHX18pICYgU01CVVNfRkxBR19NQVNLKSkpCisKKyNkZWZpbmUgSVNfU01CVVNfT1dOX0FERFJFU1MxKEFERFJFU1MxKSAgICAgICAgICAgICAgICAgICAgICAgICAoKEFERFJFU1MxKSA8PSAweDAwMDAwM0ZGVSkKKyNkZWZpbmUgSVNfU01CVVNfT1dOX0FERFJFU1MyKEFERFJFU1MyKSAgICAgICAgICAgICAgICAgICAgICAgICAoKEFERFJFU1MyKSA8PSAodWludDE2X3QpMHgwMEZGVSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBTTUJVU19FeHBvcnRlZF9GdW5jdGlvbnMgU01CVVMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFNNQlVTX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX0luaXQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19EZUluaXQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKK3ZvaWQgSEFMX1NNQlVTX01zcEluaXQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKK3ZvaWQgSEFMX1NNQlVTX01zcERlSW5pdChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX0NvbmZpZ0FuYWxvZ0ZpbHRlcihTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQzMl90IEFuYWxvZ0ZpbHRlcik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfQ29uZmlnRGlnaXRhbEZpbHRlcihTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQzMl90IERpZ2l0YWxGaWx0ZXIpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgU01CVVNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGFkZHRvZ3JvdXAgQmxvY2tpbmdfbW9kZV9Qb2xsaW5nIEJsb2NraW5nIG1vZGUgUG9sbGluZworICogQHsKKyAqLworLyoqKioqKiogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX0lzRGV2aWNlUmVhZHkoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50MzJfdCBUcmlhbHMsIHVpbnQzMl90IFRpbWVvdXQpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIE5vbi1CbG9ja2luZ19tb2RlX0ludGVycnVwdCBOb24tQmxvY2tpbmcgbW9kZSBJbnRlcnJ1cHQKKyAqIEB7CisgKi8KKy8qKioqKioqIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19NYXN0ZXJfVHJhbnNtaXRfSVQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgWGZlck9wdGlvbnMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX01hc3Rlcl9SZWNlaXZlX0lUKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19NYXN0ZXJfQWJvcnRfSVQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50MTZfdCBEZXZBZGRyZXNzKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19TbGF2ZV9UcmFuc21pdF9JVChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfU2xhdmVfUmVjZWl2ZV9JVChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucyk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19FbmFibGVBbGVydF9JVChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX0Rpc2FibGVBbGVydF9JVChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX0VuYWJsZUxpc3Rlbl9JVChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX0Rpc2FibGVMaXN0ZW5fSVQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBTTUJVU19JUlFfSGFuZGxlcl9hbmRfQ2FsbGJhY2tzIElSUSBIYW5kbGVyIGFuZCBDYWxsYmFja3MKKyAqIEB7CisgKi8KKy8qKioqKioqIFNNQlVTIElSUUhhbmRsZXIgYW5kIENhbGxiYWNrcyB1c2VkIGluIG5vbiBibG9ja2luZyBtb2RlcyAoSW50ZXJydXB0KSAqLwordm9pZCBIQUxfU01CVVNfRVZfSVJRSGFuZGxlcihTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOwordm9pZCBIQUxfU01CVVNfRVJfSVJRSGFuZGxlcihTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOwordm9pZCBIQUxfU01CVVNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKK3ZvaWQgSEFMX1NNQlVTX01hc3RlclJ4Q3BsdENhbGxiYWNrKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cyk7Cit2b2lkIEhBTF9TTUJVU19TbGF2ZVR4Q3BsdENhbGxiYWNrKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cyk7Cit2b2lkIEhBTF9TTUJVU19TbGF2ZVJ4Q3BsdENhbGxiYWNrKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cyk7Cit2b2lkIEhBTF9TTUJVU19BZGRyQ2FsbGJhY2soU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50OF90IFRyYW5zZmVyRGlyZWN0aW9uLCB1aW50MTZfdCBBZGRyTWF0Y2hDb2RlKTsKK3ZvaWQgSEFMX1NNQlVTX0xpc3RlbkNwbHRDYWxsYmFjayhTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOwordm9pZCBIQUxfU01CVVNfRXJyb3JDYWxsYmFjayhTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgU01CVVNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zCisgKiAgQHsKKyAqLworCisvKiBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IEhBTF9TTUJVU19HZXRTdGF0ZShTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOwordWludDMyX3QgSEFMX1NNQlVTX0dldEVycm9yKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cyk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNNQlVTX1ByaXZhdGVfRnVuY3Rpb25zIFNNQlVTIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIFByaXZhdGUgZnVuY3Rpb25zIGFyZSBkZWZpbmVkIGluIHN0bTMyZjN4eF9oYWxfc21idXMuYyBmaWxlICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKyNlbmRpZiAvKiBfX1NUTTMyRjN4eF9IQUxfU01CVVNfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjN4eF9oYWxfc3BpLmggYi9JbmMvc3RtMzJmM3h4X2hhbF9zcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDNiNmVmCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjN4eF9oYWxfc3BpLmgKQEAgLTAsMCArMSw3MDMgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX3NwaS5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBTUEkgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0hBTF9TUElfSAorI2RlZmluZSBfX1NUTTMyRjN4eF9IQUxfU1BJX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBTUEkKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTUElfRXhwb3J0ZWRfVHlwZXMgU1BJIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTUEkgQ29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgTW9kZTsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFNQSSBvcGVyYXRpbmcgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9Nb2RlICovCisKKyAgdWludDMyX3QgRGlyZWN0aW9uOyAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFNQSSBiaWRpcmVjdGlvbmFsIG1vZGUgc3RhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfRGlyZWN0aW9uICovCisKKyAgdWludDMyX3QgRGF0YVNpemU7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFNQSSBkYXRhIHNpemUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfRGF0YV9TaXplICovCisKKyAgdWludDMyX3QgQ0xLUG9sYXJpdHk7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHNlcmlhbCBjbG9jayBzdGVhZHkgc3RhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfQ2xvY2tfUG9sYXJpdHkgKi8KKworICB1aW50MzJfdCBDTEtQaGFzZTsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgY2xvY2sgYWN0aXZlIGVkZ2UgZm9yIHRoZSBiaXQgY2FwdHVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9DbG9ja19QaGFzZSAqLworCisgIHVpbnQzMl90IE5TUzsgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIE5TUyBzaWduYWwgaXMgbWFuYWdlZCBieQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlIChOU1MgcGluKSBvciBieSBzb2Z0d2FyZSB1c2luZyB0aGUgU1NJIGJpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9TbGF2ZV9TZWxlY3RfbWFuYWdlbWVudCAqLworCisgIHVpbnQzMl90IEJhdWRSYXRlUHJlc2NhbGVyOyAgIC8qITwgU3BlY2lmaWVzIHRoZSBCYXVkIFJhdGUgcHJlc2NhbGVyIHZhbHVlIHdoaWNoIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgU0NLIGNsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0JhdWRSYXRlX1ByZXNjYWxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoZSBjb21tdW5pY2F0aW9uIGNsb2NrIGlzIGRlcml2ZWQgZnJvbSB0aGUgbWFzdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2suIFRoZSBzbGF2ZSBjbG9jayBkb2VzIG5vdCBuZWVkIHRvIGJlIHNldC4gKi8KKworICB1aW50MzJfdCBGaXJzdEJpdDsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIGRhdGEgdHJhbnNmZXJzIHN0YXJ0IGZyb20gTVNCIG9yIExTQiBiaXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfTVNCX0xTQl90cmFuc21pc3Npb24gKi8KKworICB1aW50MzJfdCBUSU1vZGU7ICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyBpZiB0aGUgVEkgbW9kZSBpcyBlbmFibGVkIG9yIG5vdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9USV9tb2RlICovCisKKyAgdWludDMyX3QgQ1JDQ2FsY3VsYXRpb247ICAgICAgLyohPCBTcGVjaWZpZXMgaWYgdGhlIENSQyBjYWxjdWxhdGlvbiBpcyBlbmFibGVkIG9yIG5vdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9DUkNfQ2FsY3VsYXRpb24gKi8KKworICB1aW50MzJfdCBDUkNQb2x5bm9taWFsOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcG9seW5vbWlhbCB1c2VkIGZvciB0aGUgQ1JDIGNhbGN1bGF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYW4gb2RkIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMSBhbmQgTWF4X0RhdGEgPSA2NTUzNSAqLworCisgIHVpbnQzMl90IENSQ0xlbmd0aDsgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBDUkMgTGVuZ3RoIHVzZWQgZm9yIHRoZSBDUkMgY2FsY3VsYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JDIExlbmd0aCBpcyBvbmx5IHVzZWQgd2l0aCBEYXRhOCBhbmQgRGF0YTE2LCBub3Qgb3RoZXIgZGF0YSBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfQ1JDX2xlbmd0aCAqLworCisgIHVpbnQzMl90IE5TU1BNb2RlOyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIE5TU1Agc2lnbmFsIGlzIGVuYWJsZWQgb3Igbm90IC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9OU1NQX01vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG1vZGUgaXMgYWN0aXZhdGVkIGJ5IHRoZSBOU1NQIGJpdCBpbiB0aGUgU1BJeF9DUjIgcmVnaXN0ZXIgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgdGFrZXMgZWZmZWN0IG9ubHkgaWYgdGhlIFNQSSBpbnRlcmZhY2UgaXMgY29uZmlndXJlZCBhcyBNb3Rvcm9sYSBTUEkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXN0ZXIgKEZSRj0wKSB3aXRoIGNhcHR1cmUgb24gdGhlIGZpcnN0IGVkZ2UgKFNQSXhfQ1IxIENQSEEgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQT0wgc2V0dGluZyBpcyBpZ25vcmVkKS4uICovCit9IFNQSV9Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBIQUwgU1BJIFN0YXRlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX1NQSV9TVEFURV9SRVNFVCAgICAgID0gMHgwMFUsICAgIC8qITwgUGVyaXBoZXJhbCBub3QgSW5pdGlhbGl6ZWQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1NQSV9TVEFURV9SRUFEWSAgICAgID0gMHgwMVUsICAgIC8qITwgUGVyaXBoZXJhbCBJbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZSAgICAgICAgICAgKi8KKyAgSEFMX1NQSV9TVEFURV9CVVNZICAgICAgID0gMHgwMlUsICAgIC8qITwgYW4gaW50ZXJuYWwgcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1NQSV9TVEFURV9CVVNZX1RYICAgID0gMHgwM1UsICAgIC8qITwgRGF0YSBUcmFuc21pc3Npb24gcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAgKi8KKyAgSEFMX1NQSV9TVEFURV9CVVNZX1JYICAgID0gMHgwNFUsICAgIC8qITwgRGF0YSBSZWNlcHRpb24gcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1NQSV9TVEFURV9CVVNZX1RYX1JYID0gMHgwNVUsICAgIC8qITwgRGF0YSBUcmFuc21pc3Npb24gYW5kIFJlY2VwdGlvbiBwcm9jZXNzIGlzIG9uZ29pbmcgKi8KKyAgSEFMX1NQSV9TVEFURV9FUlJPUiAgICAgID0gMHgwNlUsICAgIC8qITwgU1BJIGVycm9yIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1NQSV9TVEFURV9BQk9SVCAgICAgID0gMHgwN1UgICAgIC8qITwgU1BJIGFib3J0IGlzIG9uZ29pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gSEFMX1NQSV9TdGF0ZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgU1BJIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZgoreworICBTUElfVHlwZURlZiAgICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAgICAgLyohPCBTUEkgcmVnaXN0ZXJzIGJhc2UgYWRkcmVzcyAgICAgICAgICAgICAgICovCisKKyAgU1BJX0luaXRUeXBlRGVmICAgICAgICAgICAgSW5pdDsgICAgICAgICAgIC8qITwgU1BJIGNvbW11bmljYXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgICAqLworCisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICpwVHhCdWZmUHRyOyAgICAvKiE8IFBvaW50ZXIgdG8gU1BJIFR4IHRyYW5zZmVyIEJ1ZmZlciAgICAgICAgKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICBUeFhmZXJTaXplOyAgICAgLyohPCBTUEkgVHggVHJhbnNmZXIgc2l6ZSAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgICAgVHhYZmVyQ291bnQ7ICAgIC8qITwgU1BJIFR4IFRyYW5zZmVyIENvdW50ZXIgICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICpwUnhCdWZmUHRyOyAgICAvKiE8IFBvaW50ZXIgdG8gU1BJIFJ4IHRyYW5zZmVyIEJ1ZmZlciAgICAgICAgKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICBSeFhmZXJTaXplOyAgICAgLyohPCBTUEkgUnggVHJhbnNmZXIgc2l6ZSAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgICAgUnhYZmVyQ291bnQ7ICAgIC8qITwgU1BJIFJ4IFRyYW5zZmVyIENvdW50ZXIgICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgIENSQ1NpemU7ICAgICAgICAvKiE8IFNQSSBDUkMgc2l6ZSB1c2VkIGZvciB0aGUgdHJhbnNmZXIgICAgICAgKi8KKworICB2b2lkICgqUnhJU1IpKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsgICAvKiE8IGZ1bmN0aW9uIHBvaW50ZXIgb24gUnggSVNSICAgICAgICovCisKKyAgdm9pZCAoKlR4SVNSKShzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7ICAgLyohPCBmdW5jdGlvbiBwb2ludGVyIG9uIFR4IElTUiAgICAgICAqLworCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAgICpoZG1hdHg7ICAgICAgICAvKiE8IFNQSSBUeCBETUEgSGFuZGxlIHBhcmFtZXRlcnMgICAgICAgICAgICAgKi8KKworICBETUFfSGFuZGxlVHlwZURlZiAgICAgICAgICAqaGRtYXJ4OyAgICAgICAgLyohPCBTUEkgUnggRE1BIEhhbmRsZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICovCisKKyAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgICAgTG9jazsgICAgICAgICAgIC8qITwgTG9ja2luZyBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIF9fSU8gSEFMX1NQSV9TdGF0ZVR5cGVEZWYgIFN0YXRlOyAgICAgICAgICAvKiE8IFNQSSBjb21tdW5pY2F0aW9uIHN0YXRlICAgICAgICAgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICBFcnJvckNvZGU7ICAgICAgLyohPCBTUEkgRXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK30gU1BJX0hhbmRsZVR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNQSV9FeHBvcnRlZF9Db25zdGFudHMgU1BJIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0Vycm9yX0NvZGUgU1BJIEVycm9yIENvZGUKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfU1BJX0VSUk9SX05PTkUgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgICAvKiE8IE5vIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9TUElfRVJST1JfTU9ERiAgICAgICAgICAgICAgKDB4MDAwMDAwMDFVKSAgIC8qITwgTU9ERiBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NQSV9FUlJPUl9DUkMgICAgICAgICAgICAgICAoMHgwMDAwMDAwMlUpICAgLyohPCBDUkMgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU1BJX0VSUk9SX09WUiAgICAgICAgICAgICAgICgweDAwMDAwMDA0VSkgICAvKiE8IE9WUiBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9TUElfRVJST1JfRlJFICAgICAgICAgICAgICAgKDB4MDAwMDAwMDhVKSAgIC8qITwgRlJFIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NQSV9FUlJPUl9ETUEgICAgICAgICAgICAgICAoMHgwMDAwMDAxMFUpICAgLyohPCBETUEgdHJhbnNmZXIgZXJyb3IgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU1BJX0VSUk9SX0ZMQUcgICAgICAgICAgICAgICgweDAwMDAwMDIwVSkgICAvKiE8IEVycm9yIG9uIFJYTkUvVFhFL0JTWS9GVExWTC9GUkxWTCBGbGFnICovCisjZGVmaW5lIEhBTF9TUElfRVJST1JfQUJPUlQgICAgICAgICAgICAgKDB4MDAwMDAwNDBVKSAgIC8qITwgRXJyb3IgZHVyaW5nIFNQSSBBYm9ydCBwcm9jZWR1cmUgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX01vZGUgU1BJIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBTUElfTU9ERV9TTEFWRSAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU1BJX01PREVfTUFTVEVSICAgICAgICAgICAgICAgICAoU1BJX0NSMV9NU1RSIHwgU1BJX0NSMV9TU0kpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9EaXJlY3Rpb24gU1BJIERpcmVjdGlvbiBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1BJX0RJUkVDVElPTl8yTElORVMgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNQSV9ESVJFQ1RJT05fMkxJTkVTX1JYT05MWSAgICAgU1BJX0NSMV9SWE9OTFkKKyNkZWZpbmUgU1BJX0RJUkVDVElPTl8xTElORSAgICAgICAgICAgICBTUElfQ1IxX0JJRElNT0RFCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9EYXRhX1NpemUgU1BJIERhdGEgU2l6ZQorICAqIEB7CisgICovCisjZGVmaW5lIFNQSV9EQVRBU0laRV80QklUICAgICAgICAgICAgICAgKDB4MDAwMDAzMDBVKQorI2RlZmluZSBTUElfREFUQVNJWkVfNUJJVCAgICAgICAgICAgICAgICgweDAwMDAwNDAwVSkKKyNkZWZpbmUgU1BJX0RBVEFTSVpFXzZCSVQgICAgICAgICAgICAgICAoMHgwMDAwMDUwMFUpCisjZGVmaW5lIFNQSV9EQVRBU0laRV83QklUICAgICAgICAgICAgICAgKDB4MDAwMDA2MDBVKQorI2RlZmluZSBTUElfREFUQVNJWkVfOEJJVCAgICAgICAgICAgICAgICgweDAwMDAwNzAwVSkKKyNkZWZpbmUgU1BJX0RBVEFTSVpFXzlCSVQgICAgICAgICAgICAgICAoMHgwMDAwMDgwMFUpCisjZGVmaW5lIFNQSV9EQVRBU0laRV8xMEJJVCAgICAgICAgICAgICAgKDB4MDAwMDA5MDBVKQorI2RlZmluZSBTUElfREFUQVNJWkVfMTFCSVQgICAgICAgICAgICAgICgweDAwMDAwQTAwVSkKKyNkZWZpbmUgU1BJX0RBVEFTSVpFXzEyQklUICAgICAgICAgICAgICAoMHgwMDAwMEIwMFUpCisjZGVmaW5lIFNQSV9EQVRBU0laRV8xM0JJVCAgICAgICAgICAgICAgKDB4MDAwMDBDMDBVKQorI2RlZmluZSBTUElfREFUQVNJWkVfMTRCSVQgICAgICAgICAgICAgICgweDAwMDAwRDAwVSkKKyNkZWZpbmUgU1BJX0RBVEFTSVpFXzE1QklUICAgICAgICAgICAgICAoMHgwMDAwMEUwMFUpCisjZGVmaW5lIFNQSV9EQVRBU0laRV8xNkJJVCAgICAgICAgICAgICAgKDB4MDAwMDBGMDBVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfQ2xvY2tfUG9sYXJpdHkgU1BJIENsb2NrIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1BJX1BPTEFSSVRZX0xPVyAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNQSV9QT0xBUklUWV9ISUdIICAgICAgICAgICAgICAgU1BJX0NSMV9DUE9MCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9DbG9ja19QaGFzZSBTUEkgQ2xvY2sgUGhhc2UKKyAgKiBAeworICAqLworI2RlZmluZSBTUElfUEhBU0VfMUVER0UgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU1BJX1BIQVNFXzJFREdFICAgICAgICAgICAgICAgICBTUElfQ1IxX0NQSEEKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX1NsYXZlX1NlbGVjdF9tYW5hZ2VtZW50IFNQSSBTbGF2ZSBTZWxlY3QgTWFuYWdlbWVudAorICAqIEB7CisgICovCisjZGVmaW5lIFNQSV9OU1NfU09GVCAgICAgICAgICAgICAgICAgICAgU1BJX0NSMV9TU00KKyNkZWZpbmUgU1BJX05TU19IQVJEX0lOUFVUICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNQSV9OU1NfSEFSRF9PVVRQVVQgICAgICAgICAgICAgKFNQSV9DUjJfU1NPRSA8PCAxNlUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9OU1NQX01vZGUgU1BJIE5TUyBQdWxzZSBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1BJX05TU19QVUxTRV9FTkFCTEUgICAgICAgICAgICBTUElfQ1IyX05TU1AKKyNkZWZpbmUgU1BJX05TU19QVUxTRV9ESVNBQkxFICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9CYXVkUmF0ZV9QcmVzY2FsZXIgU1BJIEJhdWRSYXRlIFByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIFNQSV9CQVVEUkFURVBSRVNDQUxFUl8yICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfNCAgICAgICAgIChTUElfQ1IxX0JSXzApCisjZGVmaW5lIFNQSV9CQVVEUkFURVBSRVNDQUxFUl84ICAgICAgICAgKFNQSV9DUjFfQlJfMSkKKyNkZWZpbmUgU1BJX0JBVURSQVRFUFJFU0NBTEVSXzE2ICAgICAgICAoU1BJX0NSMV9CUl8xIHwgU1BJX0NSMV9CUl8wKQorI2RlZmluZSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfMzIgICAgICAgIChTUElfQ1IxX0JSXzIpCisjZGVmaW5lIFNQSV9CQVVEUkFURVBSRVNDQUxFUl82NCAgICAgICAgKFNQSV9DUjFfQlJfMiB8IFNQSV9DUjFfQlJfMCkKKyNkZWZpbmUgU1BJX0JBVURSQVRFUFJFU0NBTEVSXzEyOCAgICAgICAoU1BJX0NSMV9CUl8yIHwgU1BJX0NSMV9CUl8xKQorI2RlZmluZSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfMjU2ICAgICAgIChTUElfQ1IxX0JSXzIgfCBTUElfQ1IxX0JSXzEgfCBTUElfQ1IxX0JSXzApCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9NU0JfTFNCX3RyYW5zbWlzc2lvbiBTUEkgTVNCIExTQiBUcmFuc21pc3Npb24KKyAgKiBAeworICAqLworI2RlZmluZSBTUElfRklSU1RCSVRfTVNCICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU1BJX0ZJUlNUQklUX0xTQiAgICAgICAgICAgICAgICBTUElfQ1IxX0xTQkZJUlNUCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9USV9tb2RlIFNQSSBUSSBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1BJX1RJTU9ERV9ESVNBQkxFICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNQSV9USU1PREVfRU5BQkxFICAgICAgICAgICAgICAgU1BJX0NSMl9GUkYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0NSQ19DYWxjdWxhdGlvbiBTUEkgQ1JDIENhbGN1bGF0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1BJX0NSQ0NBTENVTEFUSU9OX0RJU0FCTEUgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUgICAgICAgU1BJX0NSMV9DUkNFTgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfQ1JDX2xlbmd0aCBTUEkgQ1JDIExlbmd0aAorICAqIEB7CisgICogVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgU1BJX0NSQ19MRU5HVEhfREFUQVNJWkU6IGFsaWduZWQgd2l0aCB0aGUgZGF0YSBzaXplCisgICogICAgIFNQSV9DUkNfTEVOR1RIXzhCSVQgICAgOiBDUkMgOGJpdAorICAqICAgICBTUElfQ1JDX0xFTkdUSF8xNkJJVCAgIDogQ1JDIDE2Yml0CisgICovCisjZGVmaW5lIFNQSV9DUkNfTEVOR1RIX0RBVEFTSVpFICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTUElfQ1JDX0xFTkdUSF84QklUICAgICAgICAgICAgICgweDAwMDAwMDAxVSkKKyNkZWZpbmUgU1BJX0NSQ19MRU5HVEhfMTZCSVQgICAgICAgICAgICAoMHgwMDAwMDAwMlUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9GSUZPX3JlY2VwdGlvbl90aHJlc2hvbGQgU1BJIEZJRk8gUmVjZXB0aW9uIFRocmVzaG9sZAorICAqIEB7CisgICogVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgU1BJX1JYRklGT19USFJFU0hPTEQgb3IgU1BJX1JYRklGT19USFJFU0hPTERfUUYgOgorICAqICAgICAgICAgIFJYTkUgZXZlbnQgaXMgZ2VuZXJhdGVkIGlmIHRoZSBGSUZPCisgICogICAgICAgICAgbGV2ZWwgaXMgZ3JlYXRlciBvciBlcXVhbCB0byAxLzIoMTYtYml0cykuCisgICogICAgIFNQSV9SWEZJRk9fVEhSRVNIT0xEX0hGOiBSWE5FIGV2ZW50IGlzIGdlbmVyYXRlZCBpZiB0aGUgRklGTworICAqICAgICAgICAgIGxldmVsIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMS80KDggYml0cykuICovCisjZGVmaW5lIFNQSV9SWEZJRk9fVEhSRVNIT0xEICAgICAgICAgICAgU1BJX0NSMl9GUlhUSAorI2RlZmluZSBTUElfUlhGSUZPX1RIUkVTSE9MRF9RRiAgICAgICAgIFNQSV9DUjJfRlJYVEgKKyNkZWZpbmUgU1BJX1JYRklGT19USFJFU0hPTERfSEYgICAgICAgICAoMHgwMDAwMDAwMFUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0ludGVycnVwdF9kZWZpbml0aW9uIFNQSSBJbnRlcnJ1cHQgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFNQSV9JVF9UWEUgICAgICAgICAgICAgICAgICAgICAgU1BJX0NSMl9UWEVJRQorI2RlZmluZSBTUElfSVRfUlhORSAgICAgICAgICAgICAgICAgICAgIFNQSV9DUjJfUlhORUlFCisjZGVmaW5lIFNQSV9JVF9FUlIgICAgICAgICAgICAgICAgICAgICAgU1BJX0NSMl9FUlJJRQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfRmxhZ3NfZGVmaW5pdGlvbiBTUEkgRmxhZ3MgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFNQSV9GTEFHX1JYTkUgICAgICAgICAgICAgICAgICAgU1BJX1NSX1JYTkUgICAvKiBTUEkgc3RhdHVzIGZsYWc6IFJ4IGJ1ZmZlciBub3QgZW1wdHkgZmxhZyAgICAgICAqLworI2RlZmluZSBTUElfRkxBR19UWEUgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9UWEUgICAgLyogU1BJIHN0YXR1cyBmbGFnOiBUeCBidWZmZXIgZW1wdHkgZmxhZyAgICAgICAgICAgKi8KKyNkZWZpbmUgU1BJX0ZMQUdfQlNZICAgICAgICAgICAgICAgICAgICBTUElfU1JfQlNZICAgIC8qIFNQSSBzdGF0dXMgZmxhZzogQnVzeSBmbGFnICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNQSV9GTEFHX0NSQ0VSUiAgICAgICAgICAgICAgICAgU1BJX1NSX0NSQ0VSUiAvKiBTUEkgRXJyb3IgZmxhZzogQ1JDIGVycm9yIGZsYWcgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTUElfRkxBR19NT0RGICAgICAgICAgICAgICAgICAgIFNQSV9TUl9NT0RGICAgLyogU1BJIEVycm9yIGZsYWc6IE1vZGUgZmF1bHQgZmxhZyAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1BJX0ZMQUdfT1ZSICAgICAgICAgICAgICAgICAgICBTUElfU1JfT1ZSICAgIC8qIFNQSSBFcnJvciBmbGFnOiBPdmVycnVuIGZsYWcgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNQSV9GTEFHX0ZSRSAgICAgICAgICAgICAgICAgICAgU1BJX1NSX0ZSRSAgICAvKiBTUEkgRXJyb3IgZmxhZzogVEkgbW9kZSBmcmFtZSBmb3JtYXQgZXJyb3IgZmxhZyAqLworI2RlZmluZSBTUElfRkxBR19GVExWTCAgICAgICAgICAgICAgICAgIFNQSV9TUl9GVExWTCAgLyogU1BJIGZpZm8gdHJhbnNtaXNzaW9uIGxldmVsICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1BJX0ZMQUdfRlJMVkwgICAgICAgICAgICAgICAgICBTUElfU1JfRlJMVkwgIC8qIFNQSSBmaWZvIHJlY2VwdGlvbiBsZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV90cmFuc21pc3Npb25fZmlmb19zdGF0dXNfbGV2ZWwgU1BJIFRyYW5zbWlzc2lvbiBGSUZPIFN0YXR1cyBMZXZlbAorICAqIEB7CisgICovCisjZGVmaW5lIFNQSV9GVExWTF9FTVBUWSAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTUElfRlRMVkxfUVVBUlRFUl9GVUxMICAgICAgICAgICgweDAwMDAwODAwVSkKKyNkZWZpbmUgU1BJX0ZUTFZMX0hBTEZfRlVMTCAgICAgICAgICAgICAoMHgwMDAwMTAwMFUpCisjZGVmaW5lIFNQSV9GVExWTF9GVUxMICAgICAgICAgICAgICAgICAgKDB4MDAwMDE4MDBVKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9yZWNlcHRpb25fZmlmb19zdGF0dXNfbGV2ZWwgU1BJIFJlY2VwdGlvbiBGSUZPIFN0YXR1cyBMZXZlbAorICAqIEB7CisgICovCisjZGVmaW5lIFNQSV9GUkxWTF9FTVBUWSAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTUElfRlJMVkxfUVVBUlRFUl9GVUxMICAgICAgICAgICgweDAwMDAwMjAwVSkKKyNkZWZpbmUgU1BJX0ZSTFZMX0hBTEZfRlVMTCAgICAgICAgICAgICAoMHgwMDAwMDQwMFUpCisjZGVmaW5lIFNQSV9GUkxWTF9GVUxMICAgICAgICAgICAgICAgICAgKDB4MDAwMDA2MDBVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU1BJX0V4cG9ydGVkX01hY3JvcyBTUEkgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgUmVzZXQgU1BJIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgSGFuZGxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSSB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NQSV9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFU0VUKQorCisvKiogQGJyaWVmICBFbmFibGUgdGhlIHNwZWNpZmllZCBTUEkgaW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgSGFuZGxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSSB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHNvdXJjZSB0byBlbmFibGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBTUElfSVRfVFhFOiBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBTUElfSVRfUlhORTogUlggYnVmZmVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIFNQSV9JVF9FUlI6IEVycm9yIGludGVycnVwdCBlbmFibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU1BJX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyLCAoX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBTUEkgaW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgaGFuZGxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSXggd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBzb3VyY2UgdG8gZGlzYWJsZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFNQSV9JVF9UWEU6IFR4IGJ1ZmZlciBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIFNQSV9JVF9SWE5FOiBSWCBidWZmZXIgbm90IGVtcHR5IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0lUX0VSUjogRXJyb3IgaW50ZXJydXB0IGVuYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TUElfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiwgKF9fSU5URVJSVVBUX18pKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgU1BJIGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFNQSSBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFNQSV9JVF9UWEU6IFR4IGJ1ZmZlciBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIFNQSV9JVF9SWE5FOiBSWCBidWZmZXIgbm90IGVtcHR5IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0lUX0VSUjogRXJyb3IgaW50ZXJydXB0IGVuYWJsZQorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0lUX18gKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBfX0hBTF9TUElfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgJiAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSkgPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFNQSSBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfUlhORTogUmVjZWl2ZSBidWZmZXIgbm90IGVtcHR5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfVFhFOiBUcmFuc21pdCBidWZmZXIgZW1wdHkgZmxhZworICAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19DUkNFUlI6IENSQyBlcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIFNQSV9GTEFHX01PREY6IE1vZGUgZmF1bHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19PVlI6IE92ZXJydW4gZmxhZworICAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19CU1k6IEJ1c3kgZmxhZworICAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19GUkU6IEZyYW1lIGZvcm1hdCBlcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIFNQSV9GTEFHX0ZUTFZMOiBTUEkgZmlmbyB0cmFuc21pc3Npb24gbGV2ZWwKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfRlJMVkw6IFNQSSBmaWZvIHJlY2VwdGlvbiBsZXZlbAorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX1NQSV9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1IpICYgKF9fRkxBR19fKSkgPT0gKF9fRkxBR19fKSkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFNQSSBDUkNFUlIgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNQSSBIYW5kbGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgU1BJIHdoZXJlIHg6IDEsIDIsIG9yIDMgdG8gc2VsZWN0IHRoZSBTUEkgcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU1BJX0NMRUFSX0NSQ0VSUkZMQUcoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSID0gKHVpbnQxNl90KSh+U1BJX0ZMQUdfQ1JDRVJSKSkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFNQSSBNT0RGIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgSGFuZGxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSSB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NQSV9DTEVBUl9NT0RGRkxBRyhfX0hBTkRMRV9fKSAgICAgICAgICAgICBcCisgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19JTyB1aW50MzJfdCB0bXByZWdfbW9kZiA9IDB4MDBVOyAgICAgICAgICAgICAgICAgICBcCisgICAgdG1wcmVnX21vZGYgPSAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUjsgICAgICAgICAgICBcCisgICAgQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9TUEUpOyBcCisgICAgVU5VU0VEKHRtcHJlZ19tb2RmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUoMFUpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBTUEkgT1ZSIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgSGFuZGxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSSB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NQSV9DTEVBUl9PVlJGTEFHKF9fSEFORExFX18pICAgICAgICBcCisgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19JTyB1aW50MzJfdCB0bXByZWdfb3ZyID0gMHgwMFU7ICAgICAgICAgICAgICBcCisgICAgdG1wcmVnX292ciA9IChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkRSOyAgICAgICBcCisgICAgdG1wcmVnX292ciA9IChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSOyAgICAgICBcCisgICAgVU5VU0VEKHRtcHJlZ19vdnIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUoMFUpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBTUEkgRlJFIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgSGFuZGxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSSB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NQSV9DTEVBUl9GUkVGTEFHKF9fSEFORExFX18pICAgICAgICBcCisgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fSU8gdWludDMyX3QgdG1wcmVnX2ZyZSA9IDB4MDBVOyAgICAgICAgICAgICAgICBcCisgIHRtcHJlZ19mcmUgPSAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUjsgICAgICAgICBcCisgIFVOVVNFRCh0bXByZWdfZnJlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH13aGlsZSgwVSkKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBTUEkgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgSGFuZGxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSSB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NQSV9FTkFCTEUoX19IQU5ETEVfXykgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX1NQRSkKKworLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgU1BJIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TUElfRElTQUJMRShfX0hBTkRMRV9fKSBDTEVBUl9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX1NQRSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU1BJX1ByaXZhdGVfTWFjcm9zIFNQSSBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIFNldCB0aGUgU1BJIHRyYW5zbWl0LW9ubHkgbW9kZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgSGFuZGxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSSB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFNQSV8xTElORV9UWChfX0hBTkRMRV9fKSAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfQklESU9FKQorCisvKiogQGJyaWVmICBTZXQgdGhlIFNQSSByZWNlaXZlLW9ubHkgbW9kZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgSGFuZGxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSSB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFNQSV8xTElORV9SWChfX0hBTkRMRV9fKSAgQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9CSURJT0UpCisKKy8qKiBAYnJpZWYgIFJlc2V0IHRoZSBDUkMgY2FsY3VsYXRpb24gb2YgdGhlIFNQSS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgSGFuZGxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSSB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFNQSV9SRVNFVF9DUkMoX19IQU5ETEVfXykgZG97Q0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9DUkNFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfQ1JDRU4pO313aGlsZSgwVSkKKworI2RlZmluZSBJU19TUElfTU9ERShNT0RFKSAoKChNT0RFKSA9PSBTUElfTU9ERV9TTEFWRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBTUElfTU9ERV9NQVNURVIpKQorCisjZGVmaW5lIElTX1NQSV9ESVJFQ1RJT04oTU9ERSkgKCgoTU9ERSkgPT0gU1BJX0RJUkVDVElPTl8yTElORVMpICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gU1BJX0RJUkVDVElPTl8yTElORVNfUlhPTkxZKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gU1BJX0RJUkVDVElPTl8xTElORSkpCisKKyNkZWZpbmUgSVNfU1BJX0RJUkVDVElPTl8yTElORVMoTU9ERSkgKChNT0RFKSA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykKKworI2RlZmluZSBJU19TUElfRElSRUNUSU9OXzJMSU5FU19PUl8xTElORShNT0RFKSAoKChNT0RFKSA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBTUElfRElSRUNUSU9OXzFMSU5FKSkKKworI2RlZmluZSBJU19TUElfREFUQVNJWkUoREFUQVNJWkUpICgoKERBVEFTSVpFKSA9PSBTUElfREFUQVNJWkVfMTZCSVQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChEQVRBU0laRSkgPT0gU1BJX0RBVEFTSVpFXzE1QklUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoREFUQVNJWkUpID09IFNQSV9EQVRBU0laRV8xNEJJVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERBVEFTSVpFKSA9PSBTUElfREFUQVNJWkVfMTNCSVQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChEQVRBU0laRSkgPT0gU1BJX0RBVEFTSVpFXzEyQklUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoREFUQVNJWkUpID09IFNQSV9EQVRBU0laRV8xMUJJVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERBVEFTSVpFKSA9PSBTUElfREFUQVNJWkVfMTBCSVQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChEQVRBU0laRSkgPT0gU1BJX0RBVEFTSVpFXzlCSVQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoREFUQVNJWkUpID09IFNQSV9EQVRBU0laRV84QklUKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERBVEFTSVpFKSA9PSBTUElfREFUQVNJWkVfN0JJVCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChEQVRBU0laRSkgPT0gU1BJX0RBVEFTSVpFXzZCSVQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoREFUQVNJWkUpID09IFNQSV9EQVRBU0laRV81QklUKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERBVEFTSVpFKSA9PSBTUElfREFUQVNJWkVfNEJJVCkpCisKKyNkZWZpbmUgSVNfU1BJX0NQT0woQ1BPTCkgKCgoQ1BPTCkgPT0gU1BJX1BPTEFSSVRZX0xPVykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDUE9MKSA9PSBTUElfUE9MQVJJVFlfSElHSCkpCisKKyNkZWZpbmUgSVNfU1BJX0NQSEEoQ1BIQSkgKCgoQ1BIQSkgPT0gU1BJX1BIQVNFXzFFREdFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENQSEEpID09IFNQSV9QSEFTRV8yRURHRSkpCisKKyNkZWZpbmUgSVNfU1BJX05TUyhOU1MpICgoKE5TUykgPT0gU1BJX05TU19TT0ZUKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKChOU1MpID09IFNQSV9OU1NfSEFSRF9JTlBVVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoTlNTKSA9PSBTUElfTlNTX0hBUkRfT1VUUFVUKSkKKworI2RlZmluZSBJU19TUElfTlNTUChOU1NQKSAoKChOU1NQKSA9PSBTUElfTlNTX1BVTFNFX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKChOU1NQKSA9PSBTUElfTlNTX1BVTFNFX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX1NQSV9CQVVEUkFURV9QUkVTQ0FMRVIoUFJFU0NBTEVSKSAoKChQUkVTQ0FMRVIpID09IFNQSV9CQVVEUkFURVBSRVNDQUxFUl8yKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBSRVNDQUxFUikgPT0gU1BJX0JBVURSQVRFUFJFU0NBTEVSXzQpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUFJFU0NBTEVSKSA9PSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfOCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQUkVTQ0FMRVIpID09IFNQSV9CQVVEUkFURVBSRVNDQUxFUl8xNikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBSRVNDQUxFUikgPT0gU1BJX0JBVURSQVRFUFJFU0NBTEVSXzMyKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUFJFU0NBTEVSKSA9PSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfNjQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQUkVTQ0FMRVIpID09IFNQSV9CQVVEUkFURVBSRVNDQUxFUl8xMjgpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBSRVNDQUxFUikgPT0gU1BJX0JBVURSQVRFUFJFU0NBTEVSXzI1NikpCisKKyNkZWZpbmUgSVNfU1BJX0ZJUlNUX0JJVChCSVQpICgoKEJJVCkgPT0gU1BJX0ZJUlNUQklUX01TQikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQklUKSA9PSBTUElfRklSU1RCSVRfTFNCKSkKKworI2RlZmluZSBJU19TUElfVElNT0RFKE1PREUpICgoKE1PREUpID09IFNQSV9USU1PREVfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFNQSV9USU1PREVfRU5BQkxFKSkKKworI2RlZmluZSBJU19TUElfQ1JDX0NBTENVTEFUSU9OKENBTENVTEFUSU9OKSAoKChDQUxDVUxBVElPTikgPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0FMQ1VMQVRJT04pID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpKQorCisjZGVmaW5lIElTX1NQSV9DUkNfTEVOR1RIKExFTkdUSCkgKCgoTEVOR1RIKSA9PSBTUElfQ1JDX0xFTkdUSF9EQVRBU0laRSkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVOR1RIKSA9PSBTUElfQ1JDX0xFTkdUSF84QklUKSAgfHwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVOR1RIKSA9PSBTUElfQ1JDX0xFTkdUSF8xNkJJVCkpCisKKyNkZWZpbmUgSVNfU1BJX0NSQ19QT0xZTk9NSUFMKFBPTFlOT01JQUwpICgoKFBPTFlOT01JQUwpID49IDB4MVUpICYmICgoUE9MWU5PTUlBTCkgPD0gMHhGRkZGVSkgJiYgKCgoUE9MWU5PTUlBTCkmMHgxVSkgIT0gMFUpKQorCisjZGVmaW5lIElTX1NQSV9ETUFfSEFORExFKEhBTkRMRSkgKChIQU5ETEUpICE9IE5VTEwpCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyogSW5jbHVkZSBTUEkgSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfc3BpX2V4LmgiCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgU1BJX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBTUElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCisvKiBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9Jbml0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfRGVJbml0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3ZvaWQgSEFMX1NQSV9Nc3BJbml0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3ZvaWQgSEFMX1NQSV9Nc3BEZUluaXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFNQSV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgICogQHsKKyAgKi8KKy8qIEkvTyBvcGVyYXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1RyYW5zbWl0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1JlY2VpdmUoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwVHhEYXRhLCB1aW50OF90ICpwUnhEYXRhLCB1aW50MTZfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1RyYW5zbWl0X0lUKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1JlY2VpdmVfSVQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlX0lUKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwVHhEYXRhLCB1aW50OF90ICpwUnhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1RyYW5zbWl0X0RNQShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9SZWNlaXZlX0RNQShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9UcmFuc21pdFJlY2VpdmVfRE1BKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwVHhEYXRhLCB1aW50OF90ICpwUnhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9ETUFQYXVzZShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX0RNQVJlc3VtZShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX0RNQVN0b3AoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworLyogVHJhbnNmZXIgQWJvcnQgZnVuY3Rpb25zICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX0Fib3J0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfQWJvcnRfSVQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworCit2b2lkIEhBTF9TUElfSVJRSGFuZGxlcihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7Cit2b2lkIEhBTF9TUElfVHhDcGx0Q2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOwordm9pZCBIQUxfU1BJX1J4Q3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3ZvaWQgSEFMX1NQSV9UeFJ4Q3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3ZvaWQgSEFMX1NQSV9UeEhhbGZDcGx0Q2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOwordm9pZCBIQUxfU1BJX1J4SGFsZkNwbHRDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7Cit2b2lkIEhBTF9TUElfVHhSeEhhbGZDcGx0Q2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOwordm9pZCBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOwordm9pZCBIQUxfU1BJX0Fib3J0Q3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBTUElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMworICAqIEB7CisgICovCisvKiBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1NQSV9TdGF0ZVR5cGVEZWYgSEFMX1NQSV9HZXRTdGF0ZShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7Cit1aW50MzJfdCAgICAgICAgICAgICBIQUxfU1BJX0dldEVycm9yKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyRjN4eF9IQUxfU1BJX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmYzeHhfaGFsX3NwaV9leC5oIGIvSW5jL3N0bTMyZjN4eF9oYWxfc3BpX2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVmY2RlZQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmYzeHhfaGFsX3NwaV9leC5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX3NwaV9leC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBTUEkgSEFMIEV4dGVuZGVkIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0hBTF9TUElfRVhfSAorI2RlZmluZSBfX1NUTTMyRjN4eF9IQUxfU1BJX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBTUElFeAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgU1BJRXhfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyogSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGFkZHRvZ3JvdXAgU1BJRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJRXhfRmx1c2hSeEZpZm8oU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJGM3h4X0hBTF9TUElfRVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjN4eF9oYWxfc3JhbS5oIGIvSW5jL3N0bTMyZjN4eF9oYWxfc3JhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMWU2ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2hhbF9zcmFtLmgKQEAgLTAsMCArMSwxOTcgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX3NyYW0uaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgU1JBTSBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8gCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0hBTF9TUkFNX0gKKyNkZWZpbmUgX19TVE0zMkYzeHhfSEFMX1NSQU1fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisjaW5jbHVkZSAic3RtMzJmM3h4X2xsX2ZtYy5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgU1JBTQorICAqIEB7CisgICovIAorCisvKiBFeHBvcnRlZCB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFNSQU1fRXhwb3J0ZWRfVHlwZXMgU1JBTSBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisvKiogCisgICogQGJyaWVmICBIQUwgU1JBTSBTdGF0ZSBzdHJ1Y3R1cmVzIGRlZmluaXRpb24gIAorICAqLyAKK3R5cGVkZWYgZW51bQoreworICBIQUxfU1JBTV9TVEFURV9SRVNFVCAgICAgPSAweDAwVSwgIC8qITwgU1JBTSBub3QgeWV0IGluaXRpYWxpemVkIG9yIGRpc2FibGVkICAgICAgICAgICAqLworICBIQUxfU1JBTV9TVEFURV9SRUFEWSAgICAgPSAweDAxVSwgIC8qITwgU1JBTSBpbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZSAgICAgICAgICAgICAqLworICBIQUxfU1JBTV9TVEFURV9CVVNZICAgICAgPSAweDAyVSwgIC8qITwgU1JBTSBpbnRlcm5hbCBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICAgICAqLworICBIQUxfU1JBTV9TVEFURV9FUlJPUiAgICAgPSAweDAzVSwgIC8qITwgU1JBTSBlcnJvciBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBIQUxfU1JBTV9TVEFURV9QUk9URUNURUQgPSAweDA0ICAgLyohPCBTUkFNIHBlcmlwaGVyYWwgTk9SU1JBTSBkZXZpY2Ugd3JpdGUgcHJvdGVjdGVkICovCisgIAorfUhBTF9TUkFNX1N0YXRlVHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiAgU1JBTSBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24gIAorICAqLyAKK3R5cGVkZWYgc3RydWN0Cit7CisgIEZNQ19OT1JTUkFNX1R5cGVEZWYgICAgICAgICAgICpJbnN0YW5jZTsgIC8qITwgUmVnaXN0ZXIgYmFzZSBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgKi8gCisgIAorICBGTUNfTk9SU1JBTV9FWFRFTkRFRF9UeXBlRGVmICAqRXh0ZW5kZWQ7ICAvKiE8IEV4dGVuZGVkIG1vZGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzICAgICAgICAgICovCisgIAorICBGTUNfTk9SU1JBTV9Jbml0VHlwZURlZiAgICAgICBJbml0OyAgICAgICAvKiE8IFNSQU0gZGV2aWNlIGNvbnRyb2wgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCisKKyAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgICAgICAgTG9jazsgICAgICAgLyohPCBTUkFNIGxvY2tpbmcgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAKKyAgCisgIF9fSU8gSEFMX1NSQU1fU3RhdGVUeXBlRGVmICAgIFN0YXRlOyAgICAgIC8qITwgU1JBTSBkZXZpY2UgYWNjZXNzIHN0YXRlICAgICAgICAgICAgICAgICAgICAgKi8KKyAgCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAgICAgICpoZG1hOyAgICAgIC8qITwgUG9pbnRlciBETUEgaGFuZGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgCit9U1JBTV9IYW5kbGVUeXBlRGVmOyAKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgU1JBTV9FeHBvcnRlZF9NYWNyb3MgU1JBTSBFeHBvcnRlZCBNYWNyb3MKKyAqIEB7CisgKi8KKworLyoqIEBicmllZiBSZXNldCBTUkFNIGhhbmRsZSBzdGF0ZQorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBTUkFNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TUkFNX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9TUkFNX1NUQVRFX1JFU0VUKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFNSQU1fRXhwb3J0ZWRfRnVuY3Rpb25zIFNSQU0gRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFNSQU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgKiBAeworICovCisKKy8qIEluaXRpYWxpemF0aW9uL2RlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1JBTV9Jbml0KFNSQU1fSGFuZGxlVHlwZURlZiAqaHNyYW0sIEZNQ19OT1JTUkFNX1RpbWluZ1R5cGVEZWYgKlRpbWluZywgRk1DX05PUlNSQU1fVGltaW5nVHlwZURlZiAqRXh0VGltaW5nKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUkFNX0RlSW5pdChTUkFNX0hhbmRsZVR5cGVEZWYgKmhzcmFtKTsKK3ZvaWQgSEFMX1NSQU1fTXNwSW5pdChTUkFNX0hhbmRsZVR5cGVEZWYgKmhzcmFtKTsKK3ZvaWQgSEFMX1NSQU1fTXNwRGVJbml0KFNSQU1fSGFuZGxlVHlwZURlZiAqaHNyYW0pOworCit2b2lkIEhBTF9TUkFNX0RNQV9YZmVyQ3BsdENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3ZvaWQgSEFMX1NSQU1fRE1BX1hmZXJFcnJvckNhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFNSQU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJbnB1dCBPdXRwdXQgYW5kIG1lbW9yeSBjb250cm9sIGZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiBJL08gb3BlcmF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NSQU1fUmVhZF84YihTUkFNX0hhbmRsZVR5cGVEZWYgKmhzcmFtLCB1aW50MzJfdCAqcEFkZHJlc3MsIHVpbnQ4X3QgKnBEc3RCdWZmZXIsIHVpbnQzMl90IEJ1ZmZlclNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NSQU1fV3JpdGVfOGIoU1JBTV9IYW5kbGVUeXBlRGVmICpoc3JhbSwgdWludDMyX3QgKnBBZGRyZXNzLCB1aW50OF90ICpwU3JjQnVmZmVyLCB1aW50MzJfdCBCdWZmZXJTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUkFNX1JlYWRfMTZiKFNSQU1fSGFuZGxlVHlwZURlZiAqaHNyYW0sIHVpbnQzMl90ICpwQWRkcmVzcywgdWludDE2X3QgKnBEc3RCdWZmZXIsIHVpbnQzMl90IEJ1ZmZlclNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NSQU1fV3JpdGVfMTZiKFNSQU1fSGFuZGxlVHlwZURlZiAqaHNyYW0sIHVpbnQzMl90ICpwQWRkcmVzcywgdWludDE2X3QgKnBTcmNCdWZmZXIsIHVpbnQzMl90IEJ1ZmZlclNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NSQU1fUmVhZF8zMmIoU1JBTV9IYW5kbGVUeXBlRGVmICpoc3JhbSwgdWludDMyX3QgKnBBZGRyZXNzLCB1aW50MzJfdCAqcERzdEJ1ZmZlciwgdWludDMyX3QgQnVmZmVyU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1JBTV9Xcml0ZV8zMmIoU1JBTV9IYW5kbGVUeXBlRGVmICpoc3JhbSwgdWludDMyX3QgKnBBZGRyZXNzLCB1aW50MzJfdCAqcFNyY0J1ZmZlciwgdWludDMyX3QgQnVmZmVyU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1JBTV9SZWFkX0RNQShTUkFNX0hhbmRsZVR5cGVEZWYgKmhzcmFtLCB1aW50MzJfdCAqcEFkZHJlc3MsIHVpbnQzMl90ICpwRHN0QnVmZmVyLCB1aW50MzJfdCBCdWZmZXJTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUkFNX1dyaXRlX0RNQShTUkFNX0hhbmRsZVR5cGVEZWYgKmhzcmFtLCB1aW50MzJfdCAqcEFkZHJlc3MsIHVpbnQzMl90ICpwU3JjQnVmZmVyLCB1aW50MzJfdCBCdWZmZXJTaXplKTsKKworLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGFkZHRvZ3JvdXAgU1JBTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIENvbnRyb2wgZnVuY3Rpb25zCisgKiBAeworICovCisKKy8qIFNSQU0gQ29udHJvbCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1JBTV9Xcml0ZU9wZXJhdGlvbl9FbmFibGUoU1JBTV9IYW5kbGVUeXBlRGVmICpoc3JhbSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1JBTV9Xcml0ZU9wZXJhdGlvbl9EaXNhYmxlKFNSQU1fSGFuZGxlVHlwZURlZiAqaHNyYW0pOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgU1JBTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgKiBAeworICovCisKKy8qIFNSQU0gUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU1JBTV9TdGF0ZVR5cGVEZWYgSEFMX1NSQU1fR2V0U3RhdGUoU1JBTV9IYW5kbGVUeXBlRGVmICpoc3JhbSk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovIAorCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJGM3h4X0hBTF9TUkFNX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmYzeHhfaGFsX3RpbS5oIGIvSW5jL3N0bTMyZjN4eF9oYWxfdGltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNiMTAzYgotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmYzeHhfaGFsX3RpbS5oCkBAIC0wLDAgKzEsMTYyMyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfdGltLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFRJTSBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8gCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0hBTF9USU1fSAorI2RlZmluZSBfX1NUTTMyRjN4eF9IQUxfVElNX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNCisgICogQHsKKyAgKi8gCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfVHlwZXMgVElNIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKy8qKiAKKyAgKiBAYnJpZWYgIFRJTSBUaW1lIGJhc2UgQ29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiAgCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQcmVzY2FsZXI7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHByZXNjYWxlciB2YWx1ZSB1c2VkIHRvIGRpdmlkZSB0aGUgVElNIGNsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAwMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZVICovCisKKyAgdWludDMyX3QgQ291bnRlck1vZGU7ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjb3VudGVyIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0NvdW50ZXJfTW9kZSAqLworCisgIHVpbnQzMl90IFBlcmlvZDsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcGVyaW9kIHZhbHVlIHRvIGJlIGxvYWRlZCBpbnRvIHRoZSBhY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0by1SZWxvYWQgUmVnaXN0ZXIgYXQgdGhlIG5leHQgdXBkYXRlIGV2ZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAwMCBhbmQgTWF4X0RhdGEgPSAweEZGRkYuICAqLyAKKworICB1aW50MzJfdCBDbG9ja0RpdmlzaW9uOyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGNsb2NrIGRpdmlzaW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9DbG9ja0RpdmlzaW9uICovCisKKyAgdWludDMyX3QgUmVwZXRpdGlvbkNvdW50ZXI7ICAvKiE8IFNwZWNpZmllcyB0aGUgcmVwZXRpdGlvbiBjb3VudGVyIHZhbHVlLiBFYWNoIHRpbWUgdGhlIFJDUiBkb3duY291bnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhY2hlcyB6ZXJvLCBhbiB1cGRhdGUgZXZlbnQgaXMgZ2VuZXJhdGVkIGFuZCBjb3VudGluZyByZXN0YXJ0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgUkNSIHZhbHVlIChOKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbWVhbnMgaW4gUFdNIG1vZGUgdGhhdCAoTisxVSkgY29ycmVzcG9uZHMgdG86CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSB0aGUgbnVtYmVyIG9mIFBXTSBwZXJpb2RzIGluIGVkZ2UtYWxpZ25lZCBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSB0aGUgbnVtYmVyIG9mIGhhbGYgUFdNIHBlcmlvZCBpbiBjZW50ZXItYWxpZ25lZCBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1AgdGltZXJzOiB0aGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9IDB4RkYuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkdmFuY2VkIHRpbWVyczogdGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRi4gKi8KKworICB1aW50MzJfdCBBdXRvUmVsb2FkUHJlbG9hZDsgIC8qITwgU3BlY2lmaWVzIHRoZSBhdXRvLXJlbG9hZCBwcmVsb2FkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9BdXRvUmVsb2FkUHJlbG9hZCAqLworfSBUSU1fQmFzZV9Jbml0VHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiAgVElNIE91dHB1dCBDb21wYXJlIENvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24gIAorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgdWludDMyX3QgT0NNb2RlOyAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFRJTSBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNRXhfT3V0cHV0X0NvbXBhcmVfYW5kX1BXTV9tb2RlcyAqLworCisgIHVpbnQzMl90IFB1bHNlOyAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBwdWxzZSB2YWx1ZSB0byBiZSBsb2FkZWQgaW50byB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAwMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZVICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICB1aW50MzJfdCBPQ1BvbGFyaXR5OyAgICAvKiE8IFNwZWNpZmllcyB0aGUgb3V0cHV0IHBvbGFyaXR5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX091dHB1dF9Db21wYXJlX1BvbGFyaXR5ICovCisKKyAgdWludDMyX3QgT0NOUG9sYXJpdHk7ICAgLyohPCBTcGVjaWZpZXMgdGhlIGNvbXBsZW1lbnRhcnkgb3V0cHV0IHBvbGFyaXR5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX091dHB1dF9Db21wYXJlX05fUG9sYXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIHBhcmFtZXRlciBpcyB2YWxpZCBvbmx5IGZvciBUSU0xIGFuZCBUSU04LiAqLworICAKKyAgdWludDMyX3QgT0NGYXN0TW9kZTsgICAvKiE8IFNwZWNpZmllcyB0aGUgRmFzdCBtb2RlIHN0YXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX091dHB1dF9GYXN0X1N0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBwYXJhbWV0ZXIgaXMgdmFsaWQgb25seSBpbiBQV00xIGFuZCBQV00yIG1vZGUuICovCisKKworICB1aW50MzJfdCBPQ0lkbGVTdGF0ZTsgICAvKiE8IFNwZWNpZmllcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHBpbiBzdGF0ZSBkdXJpbmcgSWRsZSBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9PdXRwdXRfQ29tcGFyZV9JZGxlX1N0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBwYXJhbWV0ZXIgaXMgdmFsaWQgb25seSBmb3IgVElNMSBhbmQgVElNOC4gKi8KKworICB1aW50MzJfdCBPQ05JZGxlU3RhdGU7ICAvKiE8IFNwZWNpZmllcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHBpbiBzdGF0ZSBkdXJpbmcgSWRsZSBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9PdXRwdXRfQ29tcGFyZV9OX0lkbGVfU3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIHBhcmFtZXRlciBpcyB2YWxpZCBvbmx5IGZvciBUSU0xIGFuZCBUSU04LiAqLworfSBUSU1fT0NfSW5pdFR5cGVEZWY7ICAKKworLyoqIAorICAqIEBicmllZiAgVElNIE9uZSBQdWxzZSBNb2RlIENvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24gIAorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHVpbnQzMl90IE9DTW9kZTsgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBUSU0gbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTUV4X091dHB1dF9Db21wYXJlX2FuZF9QV01fbW9kZXMgKi8KKworICB1aW50MzJfdCBQdWxzZTsgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcHVsc2UgdmFsdWUgdG8gYmUgbG9hZGVkIGludG8gdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3Rlci4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwMDAgYW5kIE1heF9EYXRhID0gMHhGRkZGVSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgdWludDMyX3QgT0NQb2xhcml0eTsgICAgLyohPCBTcGVjaWZpZXMgdGhlIG91dHB1dCBwb2xhcml0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9PdXRwdXRfQ29tcGFyZV9Qb2xhcml0eSAqLworCisgIHVpbnQzMl90IE9DTlBvbGFyaXR5OyAgIC8qITwgU3BlY2lmaWVzIHRoZSBjb21wbGVtZW50YXJ5IG91dHB1dCBwb2xhcml0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9PdXRwdXRfQ29tcGFyZV9OX1BvbGFyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBwYXJhbWV0ZXIgaXMgdmFsaWQgb25seSBmb3IgVElNMSBhbmQgVElNOC4gKi8KKworICB1aW50MzJfdCBPQ0lkbGVTdGF0ZTsgICAvKiE8IFNwZWNpZmllcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHBpbiBzdGF0ZSBkdXJpbmcgSWRsZSBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9PdXRwdXRfQ29tcGFyZV9JZGxlX1N0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBwYXJhbWV0ZXIgaXMgdmFsaWQgb25seSBmb3IgVElNMSBhbmQgVElNOC4gKi8KKworICB1aW50MzJfdCBPQ05JZGxlU3RhdGU7ICAvKiE8IFNwZWNpZmllcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHBpbiBzdGF0ZSBkdXJpbmcgSWRsZSBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9PdXRwdXRfQ29tcGFyZV9OX0lkbGVfU3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIHBhcmFtZXRlciBpcyB2YWxpZCBvbmx5IGZvciBUSU0xIGFuZCBUSU04LiAqLworCisgIHVpbnQzMl90IElDUG9sYXJpdHk7ICAgIC8qITwgU3BlY2lmaWVzIHRoZSBhY3RpdmUgZWRnZSBvZiB0aGUgaW5wdXQgc2lnbmFsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0lucHV0X0NhcHR1cmVfUG9sYXJpdHkgKi8KKworICB1aW50MzJfdCBJQ1NlbGVjdGlvbjsgICAvKiE8IFNwZWNpZmllcyB0aGUgaW5wdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9JbnB1dF9DYXB0dXJlX1NlbGVjdGlvbiAqLworCisgIHVpbnQzMl90IElDRmlsdGVyOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBpbnB1dCBjYXB0dXJlIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwIGFuZCBNYXhfRGF0YSA9IDB4RlUgKi8gIAorfSBUSU1fT25lUHVsc2VfSW5pdFR5cGVEZWY7ICAKKworCisvKiogCisgICogQGJyaWVmICBUSU0gSW5wdXQgQ2FwdHVyZSBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uICAKKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB1aW50MzJfdCAgSUNQb2xhcml0eTsgICAvKiE8IFNwZWNpZmllcyB0aGUgYWN0aXZlIGVkZ2Ugb2YgdGhlIGlucHV0IHNpZ25hbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9JbnB1dF9DYXB0dXJlX1BvbGFyaXR5ICovCisKKyAgdWludDMyX3QgSUNTZWxlY3Rpb247ICAvKiE8IFNwZWNpZmllcyB0aGUgaW5wdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9JbnB1dF9DYXB0dXJlX1NlbGVjdGlvbiAqLworCisgIHVpbnQzMl90IElDUHJlc2NhbGVyOyAgLyohPCBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgUHJlc2NhbGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fSW5wdXRfQ2FwdHVyZV9QcmVzY2FsZXIgKi8KKworICB1aW50MzJfdCBJQ0ZpbHRlcjsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBpbnB1dCBjYXB0dXJlIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwIGFuZCBNYXhfRGF0YSA9IDB4RlUgKi8KK30gVElNX0lDX0luaXRUeXBlRGVmOworCisvKiogCisgICogQGJyaWVmICBUSU0gRW5jb2RlciBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uICAKKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IEVuY29kZXJNb2RlOyAgIC8qITwgU3BlY2lmaWVzIHRoZSBhY3RpdmUgZWRnZSBvZiB0aGUgaW5wdXQgc2lnbmFsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0VuY29kZXJfTW9kZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB1aW50MzJfdCBJQzFQb2xhcml0eTsgICAvKiE8IFNwZWNpZmllcyB0aGUgYWN0aXZlIGVkZ2Ugb2YgdGhlIGlucHV0IHNpZ25hbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9JbnB1dF9DYXB0dXJlX1BvbGFyaXR5ICovCisKKyAgdWludDMyX3QgSUMxU2VsZWN0aW9uOyAgLyohPCBTcGVjaWZpZXMgdGhlIGlucHV0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0lucHV0X0NhcHR1cmVfU2VsZWN0aW9uICovCisKKyAgdWludDMyX3QgSUMxUHJlc2NhbGVyOyAgLyohPCBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgUHJlc2NhbGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0lucHV0X0NhcHR1cmVfUHJlc2NhbGVyICovCisKKyAgdWludDMyX3QgSUMxRmlsdGVyOyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGlucHV0IGNhcHR1cmUgZmlsdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwIGFuZCBNYXhfRGF0YSA9IDB4RlUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgdWludDMyX3QgSUMyUG9sYXJpdHk7ICAgLyohPCBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBlZGdlIG9mIHRoZSBpbnB1dCBzaWduYWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fSW5wdXRfQ2FwdHVyZV9Qb2xhcml0eSAqLworCisgIHVpbnQzMl90IElDMlNlbGVjdGlvbjsgIC8qITwgU3BlY2lmaWVzIHRoZSBpbnB1dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0lucHV0X0NhcHR1cmVfU2VsZWN0aW9uICovCisKKyAgdWludDMyX3QgSUMyUHJlc2NhbGVyOyAgLyohPCBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgUHJlc2NhbGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0lucHV0X0NhcHR1cmVfUHJlc2NhbGVyICovCisKKyAgdWludDMyX3QgSUMyRmlsdGVyOyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGlucHV0IGNhcHR1cmUgZmlsdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwIGFuZCBNYXhfRGF0YSA9IDB4RlUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK30gVElNX0VuY29kZXJfSW5pdFR5cGVEZWY7CisKKworLyoqIAorICAqIEBicmllZiAgVElNIENsb2NrIENvbmZpZ3VyYXRpb24gSGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovIAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQ2xvY2tTb3VyY2U7ICAgICAvKiE8IFRJTSBjbG9jayBzb3VyY2VzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fQ2xvY2tfU291cmNlICovIAorICB1aW50MzJfdCBDbG9ja1BvbGFyaXR5OyAgIC8qITwgVElNIGNsb2NrIHBvbGFyaXR5IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fQ2xvY2tfUG9sYXJpdHkgKi8KKyAgdWludDMyX3QgQ2xvY2tQcmVzY2FsZXI7ICAvKiE8IFRJTSBjbG9jayBwcmVzY2FsZXIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9DbG9ja19QcmVzY2FsZXIgKi8KKyAgdWludDMyX3QgQ2xvY2tGaWx0ZXI7ICAgIC8qITwgVElNIGNsb2NrIGZpbHRlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAgYW5kIE1heF9EYXRhID0gMHhGVSAqLworfVRJTV9DbG9ja0NvbmZpZ1R5cGVEZWY7CisKKy8qKiAKKyAgKiBAYnJpZWYgIFRJTSBDbGVhciBJbnB1dCBDb25maWd1cmF0aW9uIEhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLyAKK3R5cGVkZWYgc3RydWN0Cit7ICAKKyAgdWludDMyX3QgQ2xlYXJJbnB1dFN0YXRlOyAgICAgIC8qITwgVElNIGNsZWFyIElucHV0IHN0YXRlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgRU5BQkxFIG9yIERJU0FCTEUgKi8gIAorICB1aW50MzJfdCBDbGVhcklucHV0U291cmNlOyAgICAgLyohPCBUSU0gY2xlYXIgSW5wdXQgc291cmNlcyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1FeF9DbGVhcklucHV0X1NvdXJjZSAqLworICB1aW50MzJfdCBDbGVhcklucHV0UG9sYXJpdHk7ICAgLyohPCBUSU0gQ2xlYXIgSW5wdXQgcG9sYXJpdHkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0NsZWFySW5wdXRfUG9sYXJpdHkgKi8KKyAgdWludDMyX3QgQ2xlYXJJbnB1dFByZXNjYWxlcjsgIC8qITwgVElNIENsZWFyIElucHV0IHByZXNjYWxlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fQ2xlYXJJbnB1dF9QcmVzY2FsZXIgKi8KKyAgdWludDMyX3QgQ2xlYXJJbnB1dEZpbHRlcjsgICAgLyohPCBUSU0gQ2xlYXIgSW5wdXQgZmlsdGVyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwIGFuZCBNYXhfRGF0YSA9IDB4RlUgKi8KK31USU1fQ2xlYXJJbnB1dENvbmZpZ1R5cGVEZWY7CisKKy8qKiAKKyAgKiBAYnJpZWYgIFRJTSBTbGF2ZSBjb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uICAKKyAgKi8gCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90ICBTbGF2ZU1vZGU7ICAgICAgLyohPCBTbGF2ZSBtb2RlIHNlbGVjdGlvbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTUV4X1NsYXZlX01vZGUgKi8KKyAgdWludDMyX3QgIElucHV0VHJpZ2dlcjsgICAgICAvKiE8IElucHV0IFRyaWdnZXIgc291cmNlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX1RyaWdnZXJfU2VsZWN0aW9uICovCisgIHVpbnQzMl90ICBUcmlnZ2VyUG9sYXJpdHk7ICAgLyohPCBJbnB1dCBUcmlnZ2VyIHBvbGFyaXR5IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX1RyaWdnZXJfUG9sYXJpdHkgKi8KKyAgdWludDMyX3QgIFRyaWdnZXJQcmVzY2FsZXI7ICAvKiE8IElucHV0IHRyaWdnZXIgcHJlc2NhbGVyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX1RyaWdnZXJfUHJlc2NhbGVyICovCisgIHVpbnQzMl90ICBUcmlnZ2VyRmlsdGVyOyAgICAgLyohPCBJbnB1dCB0cmlnZ2VyIGZpbHRlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MCBhbmQgTWF4X0RhdGEgPSAweEZVICovCisKK31USU1fU2xhdmVDb25maWdUeXBlRGVmOworCisvKiogCisgICogQGJyaWVmICBIQUwgU3RhdGUgc3RydWN0dXJlcyBkZWZpbml0aW9uICAKKyAgKi8gCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX1RJTV9TVEFURV9SRVNFVCAgICAgICAgICAgICA9IDB4MDBVLCAgICAvKiE8IFBlcmlwaGVyYWwgbm90IHlldCBpbml0aWFsaXplZCBvciBkaXNhYmxlZCAgKi8KKyAgSEFMX1RJTV9TVEFURV9SRUFEWSAgICAgICAgICAgICA9IDB4MDFVLCAgICAvKiE8IFBlcmlwaGVyYWwgSW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UgICAgKi8KKyAgSEFMX1RJTV9TVEFURV9CVVNZICAgICAgICAgICAgICA9IDB4MDJVLCAgICAvKiE8IEFuIGludGVybmFsIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgICAgKi8gICAgCisgIEhBTF9USU1fU1RBVEVfVElNRU9VVCAgICAgICAgICAgPSAweDAzVSwgICAgLyohPCBUaW1lb3V0IHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAKKyAgSEFMX1RJTV9TVEFURV9FUlJPUiAgICAgICAgICAgICA9IDB4MDQgICAgIC8qITwgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgICAgICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit9SEFMX1RJTV9TdGF0ZVR5cGVEZWY7CisKKy8qKiAKKyAgKiBAYnJpZWYgIEhBTCBBY3RpdmUgY2hhbm5lbCBzdHJ1Y3R1cmVzIGRlZmluaXRpb24gIAorICAqLyAKK3R5cGVkZWYgZW51bQoreworICBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzEgICAgICAgID0gMHgwMVUsICAgIC8qITwgVGhlIGFjdGl2ZSBjaGFubmVsIGlzIDEgICAgICovCisgIEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMiAgICAgICAgPSAweDAyVSwgICAgLyohPCBUaGUgYWN0aXZlIGNoYW5uZWwgaXMgMiAgICAgKi8KKyAgSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8zICAgICAgICA9IDB4MDRVLCAgICAvKiE8IFRoZSBhY3RpdmUgY2hhbm5lbCBpcyAzICAgICAqLyAgIAorICBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzQgICAgICAgID0gMHgwOFUsICAgIC8qITwgVGhlIGFjdGl2ZSBjaGFubmVsIGlzIDQgICAgICovCisgIEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfQ0xFQVJFRCAgPSAweDAwICAgIC8qITwgQWxsIGFjdGl2ZSBjaGFubmVscyBjbGVhcmVkICovICAgIAorfUhBTF9USU1fQWN0aXZlQ2hhbm5lbDsKKworLyoqIAorICAqIEBicmllZiAgVElNIFRpbWUgQmFzZSBIYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24gIAorICAqLyAKK3R5cGVkZWYgc3RydWN0Cit7CisgIFRJTV9UeXBlRGVmICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAgICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAgICAgICAgICAgICAqLyAKKyAgVElNX0Jhc2VfSW5pdFR5cGVEZWYgICAgIEluaXQ7ICAgICAgICAgIC8qITwgVElNIFRpbWUgQmFzZSByZXF1aXJlZCBwYXJhbWV0ZXJzICovCisgIEhBTF9USU1fQWN0aXZlQ2hhbm5lbCAgICBDaGFubmVsOyAgICAgICAvKiE8IEFjdGl2ZSBjaGFubmVsICAgICAgICAgICAgICAgICAgICAqLyAKKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICpoZG1hWzddOyAgICAgIC8qITwgRE1BIEhhbmRsZXJzIGFycmF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGFycmF5IGlzIGFjY2Vzc2VkIGJ5IGEgQHJlZiBUSU1fRE1BX0hhbmRsZV9pbmRleCAqLworICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICAgTG9jazsgICAgICAgICAgLyohPCBMb2NraW5nIG9iamVjdCAgICAgICAgICAgICAgICAgICAgKi8KKyAgX19JTyBIQUxfVElNX1N0YXRlVHlwZURlZiAgIFN0YXRlOyAgICAgICAgIC8qITwgVElNIG9wZXJhdGlvbiBzdGF0ZSAgICAgICAgICAgICAgICovICAKK31USU1fSGFuZGxlVHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKy8qIEVuZCBvZiBleHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9Db25zdGFudHMgVElNIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0lucHV0X0NoYW5uZWxfUG9sYXJpdHkgVElNIElucHV0IENoYW5uZWwgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSAgVElNX0lOUFVUQ0hBTk5FTFBPTEFSSVRZX1JJU0lORyAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAvKiE8IFBvbGFyaXR5IGZvciBUSXggc291cmNlICovCisjZGVmaW5lICBUSU1fSU5QVVRDSEFOTkVMUE9MQVJJVFlfRkFMTElORyAgICAgKFRJTV9DQ0VSX0NDMVApICAgICAgICAgICAgICAgICAgIC8qITwgUG9sYXJpdHkgZm9yIFRJeCBzb3VyY2UgKi8KKyNkZWZpbmUgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9CT1RIRURHRSAgICAoVElNX0NDRVJfQ0MxUCB8IFRJTV9DQ0VSX0NDMU5QKSAgLyohPCBQb2xhcml0eSBmb3IgVEl4IHNvdXJjZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fRVRSX1BvbGFyaXR5IFRJTSBFVFIgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fRVRSUE9MQVJJVFlfSU5WRVJURUQgICAgICAgICAgICAgIChUSU1fU01DUl9FVFApICAgICAgICAgICAgICAgICAgICAvKiE8IFBvbGFyaXR5IGZvciBFVFIgc291cmNlICovIAorI2RlZmluZSBUSU1fRVRSUE9MQVJJVFlfTk9OSU5WRVJURUQgICAgICAgICAgICgweDAwMDBVKSAgICAgICAgICAgICAgICAvKiE8IFBvbGFyaXR5IGZvciBFVFIgc291cmNlICovIAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fRVRSX1ByZXNjYWxlciBUSU0gRVRSIFByZXNjYWxlcgorICAqIEB7CisgICovICAgICAgICAgICAgICAgIAorI2RlZmluZSBUSU1fRVRSUFJFU0NBTEVSX0RJVjEgICAgICAgICAgICAgICAgICgweDAwMDBVKSAgICAgICAgICAgICAgICAvKiE8IE5vIHByZXNjYWxlciBpcyB1c2VkICovCisjZGVmaW5lIFRJTV9FVFJQUkVTQ0FMRVJfRElWMiAgICAgICAgICAgICAgICAgKFRJTV9TTUNSX0VUUFNfMCkgICAgICAgICAgICAgICAgIC8qITwgRVRSIGlucHV0IHNvdXJjZSBpcyBkaXZpZGVkIGJ5IDJVICovCisjZGVmaW5lIFRJTV9FVFJQUkVTQ0FMRVJfRElWNCAgICAgICAgICAgICAgICAgKFRJTV9TTUNSX0VUUFNfMSkgICAgICAgICAgICAgICAgIC8qITwgRVRSIGlucHV0IHNvdXJjZSBpcyBkaXZpZGVkIGJ5IDRVICovCisjZGVmaW5lIFRJTV9FVFJQUkVTQ0FMRVJfRElWOCAgICAgICAgICAgICAgICAgKFRJTV9TTUNSX0VUUFMpICAgICAgICAgICAgICAgICAgIC8qITwgRVRSIGlucHV0IHNvdXJjZSBpcyBkaXZpZGVkIGJ5IDhVICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9Db3VudGVyX01vZGUgVElNIENvdW50ZXIgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9DT1VOVEVSTU9ERV9VUCAgICAgICAgICAgICAgICAgKDB4MDAwMFUpCisjZGVmaW5lIFRJTV9DT1VOVEVSTU9ERV9ET1dOICAgICAgICAgICAgICAgVElNX0NSMV9ESVIKKyNkZWZpbmUgVElNX0NPVU5URVJNT0RFX0NFTlRFUkFMSUdORUQxICAgICBUSU1fQ1IxX0NNU18wCisjZGVmaW5lIFRJTV9DT1VOVEVSTU9ERV9DRU5URVJBTElHTkVEMiAgICAgVElNX0NSMV9DTVNfMQorI2RlZmluZSBUSU1fQ09VTlRFUk1PREVfQ0VOVEVSQUxJR05FRDMgICAgIFRJTV9DUjFfQ01TCisvKioKKyAgKiBAfQorICAqLyAKKyAgCisvKiogQGRlZmdyb3VwIFRJTV9DbG9ja0RpdmlzaW9uIFRJTSBDbG9jayBEaXZpc2lvbgorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9DTE9DS0RJVklTSU9OX0RJVjEgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDBVKQorI2RlZmluZSBUSU1fQ0xPQ0tESVZJU0lPTl9ESVYyICAgICAgICAgICAgICAgICAgICAgICAoVElNX0NSMV9DS0RfMCkKKyNkZWZpbmUgVElNX0NMT0NLRElWSVNJT05fRElWNCAgICAgICAgICAgICAgICAgICAgICAgKFRJTV9DUjFfQ0tEXzEpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9BdXRvUmVsb2FkUHJlbG9hZCBUSU0gQXV0by1SZWxvYWQgUHJlbG9hZAorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9BVVRPUkVMT0FEX1BSRUxPQURfRElTQUJMRSAgICAgICAgICAgICAgICAoMHgwMDAwVSkgICAvKiE8IFRJTXhfQVJSIHJlZ2lzdGVyIGlzIG5vdCBidWZmZXJlZCAqLworI2RlZmluZSBUSU1fQVVUT1JFTE9BRF9QUkVMT0FEX0VOQUJMRSAgICAgICAgICAgICAgICAgKFRJTV9DUjFfQVJQRSkgICAgICAgLyohPCBUSU14X0FSUiByZWdpc3RlciBpcyBidWZmZXJlZCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9PdXRwdXRfRmFzdF9TdGF0ZSBUSU0gT3V0cHV0IEZhc3QgU3RhdGUKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fT0NGQVNUX0RJU0FCTEUgICAgICAgICAgICAgICAgKDB4MDAwMFUpCisjZGVmaW5lIFRJTV9PQ0ZBU1RfRU5BQkxFICAgICAgICAgICAgICAgICAoVElNX0NDTVIxX09DMUZFKQorLyoqCisgICogQH0KKyAgKi8gCisgIAorLyoqIEBkZWZncm91cCBUSU1fT3V0cHV0X0NvbXBhcmVfUG9sYXJpdHkgVElNIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX09DUE9MQVJJVFlfSElHSCAgICAgICAgICAgICAgICAoMHgwMDAwVSkKKyNkZWZpbmUgVElNX09DUE9MQVJJVFlfTE9XICAgICAgICAgICAgICAgICAoVElNX0NDRVJfQ0MxUCkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX091dHB1dF9Db21wYXJlX05fUG9sYXJpdHkgVElNIENvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fT0NOUE9MQVJJVFlfSElHSCAgICAgICAgICAgICAgICgweDAwMDBVKQorI2RlZmluZSBUSU1fT0NOUE9MQVJJVFlfTE9XICAgICAgICAgICAgICAgIChUSU1fQ0NFUl9DQzFOUCkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX091dHB1dF9Db21wYXJlX0lkbGVfU3RhdGUgVElNIE91dHB1dCBDb21wYXJlIElkbGUgU3RhdGUKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fT0NJRExFU1RBVEVfU0VUICAgICAgICAgICAgICAgIChUSU1fQ1IyX09JUzEpCisjZGVmaW5lIFRJTV9PQ0lETEVTVEFURV9SRVNFVCAgICAgICAgICAgICAgKDB4MDAwMFUpCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqIEBkZWZncm91cCBUSU1fT3V0cHV0X0NvbXBhcmVfTl9JZGxlX1N0YXRlIFRJTSBDb21wbGVtZW50YXJ5IE91dHB1dCBDb21wYXJlIElkbGUgU3RhdGUKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fT0NOSURMRVNUQVRFX1NFVCAgICAgICAgICAgICAgIChUSU1fQ1IyX09JUzFOKQorI2RlZmluZSBUSU1fT0NOSURMRVNUQVRFX1JFU0VUICAgICAgICAgICAgICgweDAwMDBVKQorLyoqCisgICogQH0KKyAgKi8gCisKKy8qKiBAZGVmZ3JvdXAgVElNX0lucHV0X0NhcHR1cmVfUG9sYXJpdHkgVElNIElucHV0IENhcHR1cmUgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSAgVElNX0lDUE9MQVJJVFlfUklTSU5HICAgICAgICAgICAgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9SSVNJTkcKKyNkZWZpbmUgIFRJTV9JQ1BPTEFSSVRZX0ZBTExJTkcgICAgICAgICAgICBUSU1fSU5QVVRDSEFOTkVMUE9MQVJJVFlfRkFMTElORworI2RlZmluZSAgVElNX0lDUE9MQVJJVFlfQk9USEVER0UgICAgICAgICAgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9CT1RIRURHRQorLyoqCisgICogQH0KKyAgKi8gCisKKy8qKiBAZGVmZ3JvdXAgVElNX0lucHV0X0NhcHR1cmVfU2VsZWN0aW9uIFRJTSBJbnB1dCBDYXB0dXJlIFNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9JQ1NFTEVDVElPTl9ESVJFQ1RUSSAgICAgICAgICAgKFRJTV9DQ01SMV9DQzFTXzApICAgLyohPCBUSU0gSW5wdXQgMVUsIDJVLCAzIG9yIDQgaXMgc2VsZWN0ZWQgdG8gYmUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkIHRvIElDMSwgSUMyLCBJQzMgb3IgSUM0LCByZXNwZWN0aXZlbHkgKi8KKyNkZWZpbmUgVElNX0lDU0VMRUNUSU9OX0lORElSRUNUVEkgICAgICAgICAoVElNX0NDTVIxX0NDMVNfMSkgICAvKiE8IFRJTSBJbnB1dCAxVSwgMlUsIDMgb3IgNCBpcyBzZWxlY3RlZCB0byBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCB0byBJQzIsIElDMSwgSUM0IG9yIElDMywgcmVzcGVjdGl2ZWx5ICovCisjZGVmaW5lIFRJTV9JQ1NFTEVDVElPTl9UUkMgICAgICAgICAgICAgICAgKFRJTV9DQ01SMV9DQzFTKSAgICAgLyohPCBUSU0gSW5wdXQgMVUsIDJVLCAzIG9yIDQgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIFRSQyAqLworLyoqCisgICogQH0KKyAgKi8gCisKKy8qKiBAZGVmZ3JvdXAgVElNX0lucHV0X0NhcHR1cmVfUHJlc2NhbGVyIFRJTSBJbnB1dCBDYXB0dXJlIFByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9JQ1BTQ19ESVYxICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMFUpICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUgcGVyZm9ybWVkIGVhY2ggdGltZSBhbiBlZGdlIGlzIGRldGVjdGVkIG9uIHRoZSBjYXB0dXJlIGlucHV0ICovCisjZGVmaW5lIFRJTV9JQ1BTQ19ESVYyICAgICAgICAgICAgICAgICAgICAgKFRJTV9DQ01SMV9JQzFQU0NfMCkgICAgIC8qITwgQ2FwdHVyZSBwZXJmb3JtZWQgb25jZSBldmVyeSAyIGV2ZW50cyAqLworI2RlZmluZSBUSU1fSUNQU0NfRElWNCAgICAgICAgICAgICAgICAgICAgIChUSU1fQ0NNUjFfSUMxUFNDXzEpICAgICAvKiE8IENhcHR1cmUgcGVyZm9ybWVkIG9uY2UgZXZlcnkgNCBldmVudHMgKi8KKyNkZWZpbmUgVElNX0lDUFNDX0RJVjggICAgICAgICAgICAgICAgICAgICAoVElNX0NDTVIxX0lDMVBTQykgICAgICAgLyohPCBDYXB0dXJlIHBlcmZvcm1lZCBvbmNlIGV2ZXJ5IDggZXZlbnRzICovCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqIEBkZWZncm91cCBUSU1fT25lX1B1bHNlX01vZGUgVElNIE9uZSBQdWxzZSBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX09QTU9ERV9TSU5HTEUgICAgICAgICAgICAgICAgICAoVElNX0NSMV9PUE0pCisjZGVmaW5lIFRJTV9PUE1PREVfUkVQRVRJVElWRSAgICAgICAgICAgICAgKDB4MDAwMFUpCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqIEBkZWZncm91cCBUSU1fRW5jb2Rlcl9Nb2RlIFRJTSBFbmNvZGVyIE1vZGUKKyAgKiBAeworICAqLyAKKyNkZWZpbmUgVElNX0VOQ09ERVJNT0RFX1RJMSAgICAgICAgICAgICAgICAoVElNX1NNQ1JfU01TXzApCisjZGVmaW5lIFRJTV9FTkNPREVSTU9ERV9USTIgICAgICAgICAgICAgICAgKFRJTV9TTUNSX1NNU18xKQorI2RlZmluZSBUSU1fRU5DT0RFUk1PREVfVEkxMiAgICAgICAgICAgICAgIChUSU1fU01DUl9TTVNfMSB8IFRJTV9TTUNSX1NNU18wKQorLyoqCisgICogQH0KKyAgKi8gICAKKworLyoqIEBkZWZncm91cCBUSU1fSW50ZXJydXB0X2RlZmluaXRpb24gVElNIEludGVycnVwdCBEZWZpbml0aW9uCisgICogQHsKKyAgKi8gCisjZGVmaW5lIFRJTV9JVF9VUERBVEUgICAgICAgICAgIChUSU1fRElFUl9VSUUpCisjZGVmaW5lIFRJTV9JVF9DQzEgICAgICAgICAgICAgIChUSU1fRElFUl9DQzFJRSkKKyNkZWZpbmUgVElNX0lUX0NDMiAgICAgICAgICAgICAgKFRJTV9ESUVSX0NDMklFKQorI2RlZmluZSBUSU1fSVRfQ0MzICAgICAgICAgICAgICAoVElNX0RJRVJfQ0MzSUUpCisjZGVmaW5lIFRJTV9JVF9DQzQgICAgICAgICAgICAgIChUSU1fRElFUl9DQzRJRSkKKyNkZWZpbmUgVElNX0lUX0NPTSAgICAgICAgICAgICAgKFRJTV9ESUVSX0NPTUlFKQorI2RlZmluZSBUSU1fSVRfVFJJR0dFUiAgICAgICAgICAoVElNX0RJRVJfVElFKQorI2RlZmluZSBUSU1fSVRfQlJFQUsgICAgICAgICAgICAoVElNX0RJRVJfQklFKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fQ29tbXV0YXRpb25fU291cmNlICBUSU0gQ29tbXV0YXRpb24gU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0NPTU1VVEFUSU9OX1RSR0kgICAgICAgICAgICAgIChUSU1fQ1IyX0NDVVMpCisjZGVmaW5lIFRJTV9DT01NVVRBVElPTl9TT0ZUV0FSRSAgICAgICAgICAoMHgwMDAwVSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fRE1BX3NvdXJjZXMgVElNIERNQSBTb3VyY2VzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0RNQV9VUERBVEUgICAgICAgICAgICAgICAgICAgICAoVElNX0RJRVJfVURFKQorI2RlZmluZSBUSU1fRE1BX0NDMSAgICAgICAgICAgICAgICAgICAgICAgIChUSU1fRElFUl9DQzFERSkKKyNkZWZpbmUgVElNX0RNQV9DQzIgICAgICAgICAgICAgICAgICAgICAgICAoVElNX0RJRVJfQ0MyREUpCisjZGVmaW5lIFRJTV9ETUFfQ0MzICAgICAgICAgICAgICAgICAgICAgICAgKFRJTV9ESUVSX0NDM0RFKQorI2RlZmluZSBUSU1fRE1BX0NDNCAgICAgICAgICAgICAgICAgICAgICAgIChUSU1fRElFUl9DQzRERSkKKyNkZWZpbmUgVElNX0RNQV9DT00gICAgICAgICAgICAgICAgICAgICAgICAoVElNX0RJRVJfQ09NREUpCisjZGVmaW5lIFRJTV9ETUFfVFJJR0dFUiAgICAgICAgICAgICAgICAgICAgKFRJTV9ESUVSX1RERSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0ZsYWdfZGVmaW5pdGlvbiBUSU0gRmxhZyBEZWZpbml0aW9uCisgICogQHsKKyAgKi8gCisjZGVmaW5lIFRJTV9GTEFHX1VQREFURSAgICAgICAgICAgICAgICAgICAgKFRJTV9TUl9VSUYpCisjZGVmaW5lIFRJTV9GTEFHX0NDMSAgICAgICAgICAgICAgICAgICAgICAgKFRJTV9TUl9DQzFJRikKKyNkZWZpbmUgVElNX0ZMQUdfQ0MyICAgICAgICAgICAgICAgICAgICAgICAoVElNX1NSX0NDMklGKQorI2RlZmluZSBUSU1fRkxBR19DQzMgICAgICAgICAgICAgICAgICAgICAgIChUSU1fU1JfQ0MzSUYpCisjZGVmaW5lIFRJTV9GTEFHX0NDNCAgICAgICAgICAgICAgICAgICAgICAgKFRJTV9TUl9DQzRJRikKKyNkZWZpbmUgVElNX0ZMQUdfQ09NICAgICAgICAgICAgICAgICAgICAgICAoVElNX1NSX0NPTUlGKQorI2RlZmluZSBUSU1fRkxBR19UUklHR0VSICAgICAgICAgICAgICAgICAgIChUSU1fU1JfVElGKQorI2RlZmluZSBUSU1fRkxBR19CUkVBSyAgICAgICAgICAgICAgICAgICAgIChUSU1fU1JfQklGKQorI2lmIGRlZmluZWQoVElNX1NSX0IySUYpCisjZGVmaW5lIFRJTV9GTEFHX0JSRUFLMiAgICAgICAgICAgICAgICAgICAgKFRJTV9TUl9CMklGKQorI2VuZGlmCisjZGVmaW5lIFRJTV9GTEFHX0NDMU9GICAgICAgICAgICAgICAgICAgICAgKFRJTV9TUl9DQzFPRikKKyNkZWZpbmUgVElNX0ZMQUdfQ0MyT0YgICAgICAgICAgICAgICAgICAgICAoVElNX1NSX0NDMk9GKQorI2RlZmluZSBUSU1fRkxBR19DQzNPRiAgICAgICAgICAgICAgICAgICAgIChUSU1fU1JfQ0MzT0YpCisjZGVmaW5lIFRJTV9GTEFHX0NDNE9GICAgICAgICAgICAgICAgICAgICAgKFRJTV9TUl9DQzRPRikKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0Nsb2NrX1NvdXJjZSBUSU0gQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8gCisjZGVmaW5lIFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMiAgICAoVElNX1NNQ1JfRVRQU18xKSAKKyNkZWZpbmUgVElNX0NMT0NLU09VUkNFX0lOVEVSTkFMICAgIChUSU1fU01DUl9FVFBTXzApIAorI2RlZmluZSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMCAgICAgICAgKDB4MDAwMFUpCisjZGVmaW5lIFRJTV9DTE9DS1NPVVJDRV9JVFIxICAgICAgICAoVElNX1NNQ1JfVFNfMCkKKyNkZWZpbmUgVElNX0NMT0NLU09VUkNFX0lUUjIgICAgICAgIChUSU1fU01DUl9UU18xKQorI2RlZmluZSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMyAgICAgICAgKFRJTV9TTUNSX1RTXzAgfCBUSU1fU01DUl9UU18xKQorI2RlZmluZSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxRUQgICAgICAgKFRJTV9TTUNSX1RTXzIpCisjZGVmaW5lIFRJTV9DTE9DS1NPVVJDRV9USTEgICAgICAgICAoVElNX1NNQ1JfVFNfMCB8IFRJTV9TTUNSX1RTXzIpCisjZGVmaW5lIFRJTV9DTE9DS1NPVVJDRV9USTIgICAgICAgICAoVElNX1NNQ1JfVFNfMSB8IFRJTV9TTUNSX1RTXzIpCisjZGVmaW5lIFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMSAgICAoVElNX1NNQ1JfVFMpCisvKioKKyAgKiBAfQorICAqLyAgIAorCisvKiogQGRlZmdyb3VwIFRJTV9DbG9ja19Qb2xhcml0eSBUSU0gQ2xvY2sgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fQ0xPQ0tQT0xBUklUWV9JTlZFUlRFRCAgICAgICAgICAgVElNX0VUUlBPTEFSSVRZX0lOVkVSVEVEICAgICAgICAgIC8qITwgUG9sYXJpdHkgZm9yIEVUUnggY2xvY2sgc291cmNlcyAqLyAKKyNkZWZpbmUgVElNX0NMT0NLUE9MQVJJVFlfTk9OSU5WRVJURUQgICAgICAgIFRJTV9FVFJQT0xBUklUWV9OT05JTlZFUlRFRCAgICAgICAvKiE8IFBvbGFyaXR5IGZvciBFVFJ4IGNsb2NrIHNvdXJjZXMgKi8gCisjZGVmaW5lIFRJTV9DTE9DS1BPTEFSSVRZX1JJU0lORyAgICAgICAgICAgICBUSU1fSU5QVVRDSEFOTkVMUE9MQVJJVFlfUklTSU5HICAgLyohPCBQb2xhcml0eSBmb3IgVEl4IGNsb2NrIHNvdXJjZXMgKi8gCisjZGVmaW5lIFRJTV9DTE9DS1BPTEFSSVRZX0ZBTExJTkcgICAgICAgICAgICBUSU1fSU5QVVRDSEFOTkVMUE9MQVJJVFlfRkFMTElORyAgIC8qITwgUG9sYXJpdHkgZm9yIFRJeCBjbG9jayBzb3VyY2VzICovIAorI2RlZmluZSBUSU1fQ0xPQ0tQT0xBUklUWV9CT1RIRURHRSAgICAgICAgICAgVElNX0lOUFVUQ0hBTk5FTFBPTEFSSVRZX0JPVEhFREdFICAvKiE8IFBvbGFyaXR5IGZvciBUSXggY2xvY2sgc291cmNlcyAqLyAKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0Nsb2NrX1ByZXNjYWxlciBUSU0gQ2xvY2sgUHJlc2NhbGVyCisgICogQHsKKyAgKi8gICAgICAgICAgICAgICAgCisjZGVmaW5lIFRJTV9DTE9DS1BSRVNDQUxFUl9ESVYxICAgICAgICAgICAgICAgICBUSU1fRVRSUFJFU0NBTEVSX0RJVjEgICAgIC8qITwgTm8gcHJlc2NhbGVyIGlzIHVzZWQgKi8KKyNkZWZpbmUgVElNX0NMT0NLUFJFU0NBTEVSX0RJVjIgICAgICAgICAgICAgICAgIFRJTV9FVFJQUkVTQ0FMRVJfRElWMiAgICAgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBDbG9jazogQ2FwdHVyZSBwZXJmb3JtZWQgb25jZSBldmVyeSAyIGV2ZW50cy4gKi8KKyNkZWZpbmUgVElNX0NMT0NLUFJFU0NBTEVSX0RJVjQgICAgICAgICAgICAgICAgIFRJTV9FVFJQUkVTQ0FMRVJfRElWNCAgICAgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBDbG9jazogQ2FwdHVyZSBwZXJmb3JtZWQgb25jZSBldmVyeSA0IGV2ZW50cy4gKi8KKyNkZWZpbmUgVElNX0NMT0NLUFJFU0NBTEVSX0RJVjggICAgICAgICAgICAgICAgIFRJTV9FVFJQUkVTQ0FMRVJfRElWOCAgICAgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBDbG9jazogQ2FwdHVyZSBwZXJmb3JtZWQgb25jZSBldmVyeSA4IGV2ZW50cy4gKi8KKy8qKgorICAqIEB9CisgICovIAorCisvKiogQGRlZmdyb3VwIFRJTV9DbGVhcklucHV0X1BvbGFyaXR5IFRJTSBDbGVhciBJbnB1dCBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9DTEVBUklOUFVUUE9MQVJJVFlfSU5WRVJURUQgICAgICAgICAgIFRJTV9FVFJQT0xBUklUWV9JTlZFUlRFRCAgICAgICAgICAgICAgICAgICAgLyohPCBQb2xhcml0eSBmb3IgRVRSeCBwaW4gKi8gCisjZGVmaW5lIFRJTV9DTEVBUklOUFVUUE9MQVJJVFlfTk9OSU5WRVJURUQgICAgICAgIFRJTV9FVFJQT0xBUklUWV9OT05JTlZFUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQb2xhcml0eSBmb3IgRVRSeCBwaW4gKi8gCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqIEBkZWZncm91cCBUSU1fQ2xlYXJJbnB1dF9QcmVzY2FsZXIgVElNIENsZWFyIElucHV0IFByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9DTEVBUklOUFVUUFJFU0NBTEVSX0RJVjEgICAgICAgICAgICAgICAgICAgIFRJTV9FVFJQUkVTQ0FMRVJfRElWMSAgICAgIC8qITwgTm8gcHJlc2NhbGVyIGlzIHVzZWQgKi8KKyNkZWZpbmUgVElNX0NMRUFSSU5QVVRQUkVTQ0FMRVJfRElWMiAgICAgICAgICAgICAgICAgICAgVElNX0VUUlBSRVNDQUxFUl9ESVYyICAgICAgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBwaW46IENhcHR1cmUgcGVyZm9ybWVkIG9uY2UgZXZlcnkgMiBldmVudHMuICovCisjZGVmaW5lIFRJTV9DTEVBUklOUFVUUFJFU0NBTEVSX0RJVjQgICAgICAgICAgICAgICAgICAgIFRJTV9FVFJQUkVTQ0FMRVJfRElWNCAgICAgIC8qITwgUHJlc2NhbGVyIGZvciBFeHRlcm5hbCBFVFIgcGluOiBDYXB0dXJlIHBlcmZvcm1lZCBvbmNlIGV2ZXJ5IDQgZXZlbnRzLiAqLworI2RlZmluZSBUSU1fQ0xFQVJJTlBVVFBSRVNDQUxFUl9ESVY4ICAgICAgICAgICAgICAgICAgICBUSU1fRVRSUFJFU0NBTEVSX0RJVjggICAgICAgIC8qITwgUHJlc2NhbGVyIGZvciBFeHRlcm5hbCBFVFIgcGluOiBDYXB0dXJlIHBlcmZvcm1lZCBvbmNlIGV2ZXJ5IDggZXZlbnRzLiAqLworLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIFRJTV9PU1NSX09mZl9TdGF0ZV9TZWxlY3Rpb25fZm9yX1J1bl9tb2RlX3N0YXRlIFRJTSBPU1NSIE9mZiBTdGF0ZSBTZWxlY3Rpb24gZm9yIFJ1biBtb2RlIHN0YXRlCisgICogQHsKKyAgKi8gIAorI2RlZmluZSBUSU1fT1NTUl9FTkFCTEUgICAgICAgIChUSU1fQkRUUl9PU1NSKQorI2RlZmluZSBUSU1fT1NTUl9ESVNBQkxFICAgICAgICAgICAgICAoMHgwMDAwVSkKKy8qKgorICAqIEB9CisgICovCisgIAorLyoqIEBkZWZncm91cCBUSU1fT1NTSV9PZmZfU3RhdGVfU2VsZWN0aW9uX2Zvcl9JZGxlX21vZGVfc3RhdGUgVElNIE9TU0kgT2ZmIFN0YXRlIFNlbGVjdGlvbiBmb3IgSWRsZSBtb2RlIHN0YXRlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX09TU0lfRU5BQkxFICAgICAgIChUSU1fQkRUUl9PU1NJKQorI2RlZmluZSBUSU1fT1NTSV9ESVNBQkxFICAgICAgICAgICAgKDB4MDAwMFUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9Mb2NrX2xldmVsIFRJTSBMb2NrIGxldmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0xPQ0tMRVZFTF9PRkYgICAgKDB4MDAwMFUpCisjZGVmaW5lIFRJTV9MT0NLTEVWRUxfMSAgICAgICAgICAgIChUSU1fQkRUUl9MT0NLXzApCisjZGVmaW5lIFRJTV9MT0NLTEVWRUxfMiAgICAgICAgICAgIChUSU1fQkRUUl9MT0NLXzEpCisjZGVmaW5lIFRJTV9MT0NLTEVWRUxfMyAgICAgICAgICAgIChUSU1fQkRUUl9MT0NLKQorLyoqCisgICogQH0KKyAgKi8gIAorCisvKiogQGRlZmdyb3VwIFRJTV9CcmVha19JbnB1dF9lbmFibGVfZGlzYWJsZSBUSU0gQnJlYWsgSW5wdXQgRW5hYmxlIERpc2FibGUKKyAgKiBAeworICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgVElNX0JSRUFLX0VOQUJMRSAgICAgICAgICAoVElNX0JEVFJfQktFKQorI2RlZmluZSBUSU1fQlJFQUtfRElTQUJMRSAgICAgICAgICgweDAwMDBVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fQnJlYWtfUG9sYXJpdHkgVElNIEJyZWFrIElucHV0IFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0JSRUFLUE9MQVJJVFlfTE9XICAgICAgICAoMHgwMDAwVSkKKyNkZWZpbmUgVElNX0JSRUFLUE9MQVJJVFlfSElHSCAgICAgICAoVElNX0JEVFJfQktQKQorLyoqCisgICogQH0KKyAgKi8KKy8qKiBAZGVmZ3JvdXAgVElNX0FPRV9CaXRfU2V0X1Jlc2V0IFRJTSBBdXRvbWF0aWMgT3V0cHV0IEVuYWJsZQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9BVVRPTUFUSUNPVVRQVVRfRU5BQkxFICAgICAgICAgICAoVElNX0JEVFJfQU9FKQorI2RlZmluZSBUSU1fQVVUT01BVElDT1VUUFVUX0RJU0FCTEUgICAgICAgICAgKDB4MDAwMFUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9NYXN0ZXJfTW9kZV9TZWxlY3Rpb24gVElNIE1hc3RlciBNb2RlIFNlbGVjdGlvbgorICAqIEB7CisgICovICAKKyNkZWZpbmUgVElNX1RSR09fUkVTRVQgICAgICAgICAgICAoMHgwMDAwVSkgICAgICAgICAgICAgCisjZGVmaW5lIFRJTV9UUkdPX0VOQUJMRSAgICAgICAgICAgKFRJTV9DUjJfTU1TXzApICAgICAgICAgICAKKyNkZWZpbmUgVElNX1RSR09fVVBEQVRFICAgICAgICAgICAoVElNX0NSMl9NTVNfMSkgICAgICAgICAgICAgCisjZGVmaW5lIFRJTV9UUkdPX09DMSAgICAgICAgICAgICAgKChUSU1fQ1IyX01NU18xIHwgVElNX0NSMl9NTVNfMCkpICAgIAorI2RlZmluZSBUSU1fVFJHT19PQzFSRUYgICAgICAgICAgIChUSU1fQ1IyX01NU18yKSAgICAgICAgICAgCisjZGVmaW5lIFRJTV9UUkdPX09DMlJFRiAgICAgICAgICAgKChUSU1fQ1IyX01NU18yIHwgVElNX0NSMl9NTVNfMCkpICAgICAgICAgIAorI2RlZmluZSBUSU1fVFJHT19PQzNSRUYgICAgICAgICAgICgoVElNX0NSMl9NTVNfMiB8IFRJTV9DUjJfTU1TXzEpKSAgICAgICAgICAgCisjZGVmaW5lIFRJTV9UUkdPX09DNFJFRiAgICAgICAgICAgKChUSU1fQ1IyX01NU18yIHwgVElNX0NSMl9NTVNfMSB8IFRJTV9DUjJfTU1TXzApKSAgIAorLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIFRJTV9NYXN0ZXJfU2xhdmVfTW9kZSBUSU0gTWFzdGVyIFNsYXZlIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fTUFTVEVSU0xBVkVNT0RFX0VOQUJMRSAgICAgICAgICAoMHgwMDgwVSkKKyNkZWZpbmUgVElNX01BU1RFUlNMQVZFTU9ERV9ESVNBQkxFICAgICAgICAgKDB4MDAwMFUpCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqIEBkZWZncm91cCBUSU1fVHJpZ2dlcl9TZWxlY3Rpb24gVElNIFRyaWdnZXIgU2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX1RTX0lUUjAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwVSkKKyNkZWZpbmUgVElNX1RTX0lUUjEgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDEwVSkKKyNkZWZpbmUgVElNX1RTX0lUUjIgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDIwVSkKKyNkZWZpbmUgVElNX1RTX0lUUjMgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDMwVSkKKyNkZWZpbmUgVElNX1RTX1RJMUZfRUQgICAgICAgICAgICAgICAgICAgICAoMHgwMDQwVSkKKyNkZWZpbmUgVElNX1RTX1RJMUZQMSAgICAgICAgICAgICAgICAgICAgICAoMHgwMDUwVSkKKyNkZWZpbmUgVElNX1RTX1RJMkZQMiAgICAgICAgICAgICAgICAgICAgICAoMHgwMDYwVSkKKyNkZWZpbmUgVElNX1RTX0VUUkYgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDcwVSkKKyNkZWZpbmUgVElNX1RTX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAoMHhGRkZGVSkKKy8qKgorICAqIEB9CisgICovICAKKworLyoqIEBkZWZncm91cCBUSU1fVHJpZ2dlcl9Qb2xhcml0eSBUSU0gVHJpZ2dlciBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9UUklHR0VSUE9MQVJJVFlfSU5WRVJURUQgICAgICAgICAgIFRJTV9FVFJQT0xBUklUWV9JTlZFUlRFRCAgICAgIC8qITwgUG9sYXJpdHkgZm9yIEVUUnggdHJpZ2dlciBzb3VyY2VzICovIAorI2RlZmluZSBUSU1fVFJJR0dFUlBPTEFSSVRZX05PTklOVkVSVEVEICAgICAgICBUSU1fRVRSUE9MQVJJVFlfTk9OSU5WRVJURUQgICAvKiE8IFBvbGFyaXR5IGZvciBFVFJ4IHRyaWdnZXIgc291cmNlcyAqLyAKKyNkZWZpbmUgVElNX1RSSUdHRVJQT0xBUklUWV9SSVNJTkcgICAgICAgICAgICAgVElNX0lOUFVUQ0hBTk5FTFBPTEFSSVRZX1JJU0lORyAgICAgICAgLyohPCBQb2xhcml0eSBmb3IgVEl4RlB4IG9yIFRJMV9FRCB0cmlnZ2VyIHNvdXJjZXMgKi8gCisjZGVmaW5lIFRJTV9UUklHR0VSUE9MQVJJVFlfRkFMTElORyAgICAgICAgICAgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9GQUxMSU5HICAgICAgIC8qITwgUG9sYXJpdHkgZm9yIFRJeEZQeCBvciBUSTFfRUQgdHJpZ2dlciBzb3VyY2VzICovIAorI2RlZmluZSBUSU1fVFJJR0dFUlBPTEFSSVRZX0JPVEhFREdFICAgICAgICAgICBUSU1fSU5QVVRDSEFOTkVMUE9MQVJJVFlfQk9USEVER0UgICAgICAvKiE8IFBvbGFyaXR5IGZvciBUSXhGUHggb3IgVEkxX0VEIHRyaWdnZXIgc291cmNlcyAqLyAKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX1RyaWdnZXJfUHJlc2NhbGVyIFRJTSBUcmlnZ2VyIFByZXNjYWxlcgorICAqIEB7CisgICovICAgICAgICAgICAgICAgIAorI2RlZmluZSBUSU1fVFJJR0dFUlBSRVNDQUxFUl9ESVYxICAgICAgICAgICAgIFRJTV9FVFJQUkVTQ0FMRVJfRElWMSAgICAgLyohPCBObyBwcmVzY2FsZXIgaXMgdXNlZCAqLworI2RlZmluZSBUSU1fVFJJR0dFUlBSRVNDQUxFUl9ESVYyICAgICAgICAgICAgIFRJTV9FVFJQUkVTQ0FMRVJfRElWMiAgICAgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBUcmlnZ2VyOiBDYXB0dXJlIHBlcmZvcm1lZCBvbmNlIGV2ZXJ5IDIgZXZlbnRzLiAqLworI2RlZmluZSBUSU1fVFJJR0dFUlBSRVNDQUxFUl9ESVY0ICAgICAgICAgICAgIFRJTV9FVFJQUkVTQ0FMRVJfRElWNCAgICAgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBUcmlnZ2VyOiBDYXB0dXJlIHBlcmZvcm1lZCBvbmNlIGV2ZXJ5IDQgZXZlbnRzLiAqLworI2RlZmluZSBUSU1fVFJJR0dFUlBSRVNDQUxFUl9ESVY4ICAgICAgICAgICAgIFRJTV9FVFJQUkVTQ0FMRVJfRElWOCAgICAgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBUcmlnZ2VyOiBDYXB0dXJlIHBlcmZvcm1lZCBvbmNlIGV2ZXJ5IDggZXZlbnRzLiAqLworLyoqCisgICogQH0KKyAgKi8KKworICAvKiogQGRlZmdyb3VwIFRJTV9USTFfU2VsZWN0aW9uIFRJTSBUSTEgSW5wdXQgU2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX1RJMVNFTEVDVElPTl9DSDEgICAgICAgICAgICAgICAgKDB4MDAwMFUpCisjZGVmaW5lIFRJTV9USTFTRUxFQ1RJT05fWE9SQ09NQklOQVRJT04gICAgIChUSU1fQ1IyX1RJMVMpCisvKioKKyAgKiBAfQorICAqLyAgCisKKy8qKiBAZGVmZ3JvdXAgVElNX0RNQV9CdXJzdF9MZW5ndGggVElNIERNQSBCdXJzdCBMZW5ndGgKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfMVRSQU5TRkVSICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8yVFJBTlNGRVJTICAgICAgICAgICgweDAwMDAwMTAwVSkKKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzNUUkFOU0ZFUlMgICAgICAgICAgKDB4MDAwMDAyMDBVKQorI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfNFRSQU5TRkVSUyAgICAgICAgICAoMHgwMDAwMDMwMFUpCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF81VFJBTlNGRVJTICAgICAgICAgICgweDAwMDAwNDAwVSkKKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzZUUkFOU0ZFUlMgICAgICAgICAgKDB4MDAwMDA1MDBVKQorI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfN1RSQU5TRkVSUyAgICAgICAgICAoMHgwMDAwMDYwMFUpCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF84VFJBTlNGRVJTICAgICAgICAgICgweDAwMDAwNzAwVSkKKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzlUUkFOU0ZFUlMgICAgICAgICAgKDB4MDAwMDA4MDBVKQorI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfMTBUUkFOU0ZFUlMgICAgICAgICAoMHgwMDAwMDkwMFUpCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8xMVRSQU5TRkVSUyAgICAgICAgICgweDAwMDAwQTAwVSkKKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzEyVFJBTlNGRVJTICAgICAgICAgKDB4MDAwMDBCMDBVKQorI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfMTNUUkFOU0ZFUlMgICAgICAgICAoMHgwMDAwMEMwMFUpCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8xNFRSQU5TRkVSUyAgICAgICAgICgweDAwMDAwRDAwVSkKKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzE1VFJBTlNGRVJTICAgICAgICAgKDB4MDAwMDBFMDBVKQorI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfMTZUUkFOU0ZFUlMgICAgICAgICAoMHgwMDAwMEYwMFUpCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8xN1RSQU5TRkVSUyAgICAgICAgICgweDAwMDAxMDAwVSkKKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzE4VFJBTlNGRVJTICAgICAgICAgKDB4MDAwMDExMDBVKQorLyoqCisgICogQH0KKyAgKi8gCisKKy8qKiBAZGVmZ3JvdXAgVElNX0RNQV9IYW5kbGVfaW5kZXggVElNIERNQSBIYW5kbGUgSW5kZXgKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fRE1BX0lEX1VQREFURSAgICAgICAgICAgICAgICAoKHVpbnQxNl90KSAweDBVKSAgICAgICAvKiE8IEluZGV4IG9mIHRoZSBETUEgaGFuZGxlIHVzZWQgZm9yIFVwZGF0ZSBETUEgcmVxdWVzdHMgKi8KKyNkZWZpbmUgVElNX0RNQV9JRF9DQzEgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkgMHgxVSkgICAgICAgLyohPCBJbmRleCBvZiB0aGUgRE1BIGhhbmRsZSB1c2VkIGZvciBDYXB0dXJlL0NvbXBhcmUgMSBETUEgcmVxdWVzdHMgKi8KKyNkZWZpbmUgVElNX0RNQV9JRF9DQzIgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkgMHgyVSkgICAgICAgLyohPCBJbmRleCBvZiB0aGUgRE1BIGhhbmRsZSB1c2VkIGZvciBDYXB0dXJlL0NvbXBhcmUgMiBETUEgcmVxdWVzdHMgKi8KKyNkZWZpbmUgVElNX0RNQV9JRF9DQzMgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkgMHgzVSkgICAgICAgLyohPCBJbmRleCBvZiB0aGUgRE1BIGhhbmRsZSB1c2VkIGZvciBDYXB0dXJlL0NvbXBhcmUgMyBETUEgcmVxdWVzdHMgKi8KKyNkZWZpbmUgVElNX0RNQV9JRF9DQzQgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkgMHg0VSkgICAgICAgLyohPCBJbmRleCBvZiB0aGUgRE1BIGhhbmRsZSB1c2VkIGZvciBDYXB0dXJlL0NvbXBhcmUgNCBETUEgcmVxdWVzdHMgKi8KKyNkZWZpbmUgVElNX0RNQV9JRF9DT01NVVRBVElPTiAgICAgICAgICAgKCh1aW50MTZfdCkgMHg1VSkgICAgICAgLyohPCBJbmRleCBvZiB0aGUgRE1BIGhhbmRsZSB1c2VkIGZvciBDb21tdXRhdGlvbiBETUEgcmVxdWVzdHMgKi8KKyNkZWZpbmUgVElNX0RNQV9JRF9UUklHR0VSICAgICAgICAgICAgICAgKCh1aW50MTZfdCkgMHg2VSkgICAgICAgLyohPCBJbmRleCBvZiB0aGUgRE1BIGhhbmRsZSB1c2VkIGZvciBUcmlnZ2VyIERNQSByZXF1ZXN0cyAqLworLyoqCisgICogQH0KKyAgKi8gCisKKy8qKiBAZGVmZ3JvdXAgVElNX0NoYW5uZWxfQ0NfU3RhdGUgVElNIENhcHR1cmUvQ29tcGFyZSBDaGFubmVsIFN0YXRlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0NDeF9FTkFCTEUgICAgICAgICAgICAgICAgICAgKDB4MDAwMVUpCisjZGVmaW5lIFRJTV9DQ3hfRElTQUJMRSAgICAgICAgICAgICAgICAgICgweDAwMDBVKQorI2RlZmluZSBUSU1fQ0N4Tl9FTkFCTEUgICAgICAgICAgICAgICAgICAoMHgwMDA0VSkKKyNkZWZpbmUgVElNX0NDeE5fRElTQUJMRSAgICAgICAgICAgICAgICAgKDB4MDAwMFUpCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworLyogRW5kIG9mIGV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX01hY3JvcyBUSU0gRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8gIAorCisvKiogQGJyaWVmICBSZXNldCBUSU0gaGFuZGxlIHN0YXRlCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFU0VUKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgVElNIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9USU1fRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxfD0oVElNX0NSMV9DRU4pKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgVElNIG1haW4gT3V0cHV0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9NT0VfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5CRFRSfD0oVElNX0JEVFJfTU9FKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBUSU0gcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9USU1fRElTQUJMRShfX0hBTkRMRV9fKSBcCisgICAgICAgICAgICAgICAgICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ0VSICYgVElNX0NDRVJfQ0N4RV9NQVNLKSA9PSAwVSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ0VSICYgVElNX0NDRVJfQ0N4TkVfTUFTSykgPT0gMFUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmPSB+KFRJTV9DUjFfQ0VOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisvKiBUaGUgTWFpbiBPdXRwdXQgRW5hYmxlIG9mIGEgdGltZXIgaW5zdGFuY2UgaXMgZGlzYWJsZWQgb25seSBpZiBhbGwgdGhlIENDeCBhbmQgQ0N4TgorICAgY2hhbm5lbHMgaGF2ZSBiZWVuIGRpc2FibGVkICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgVElNIG1haW4gT3V0cHV0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICogQG5vdGUgVGhlIE1haW4gT3V0cHV0IEVuYWJsZSBvZiBhIHRpbWVyIGluc3RhbmNlIGlzIGRpc2FibGVkIG9ubHkgaWYgYWxsIHRoZSBDQ3ggYW5kIENDeE4gY2hhbm5lbHMgaGF2ZSBiZWVuIGRpc2FibGVkCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9NT0VfRElTQUJMRShfX0hBTkRMRV9fKSBcCisgICAgICAgICAgICAgICAgICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ0VSICYgVElNX0NDRVJfQ0N4RV9NQVNLKSA9PSAwVSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiAmIFRJTV9DQ0VSX0NDeE5FX01BU0spID09IDBVKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5CRFRSICY9IH4oVElNX0JEVFJfTU9FKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKworLyogVGhlIE1haW4gT3V0cHV0IEVuYWJsZSBvZiBhIHRpbWVyIGluc3RhbmNlIGlzIGRpc2FibGVkIHVuY29uZGl0aW9uYWxseSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFRJTSBtYWluIE91dHB1dC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqIEBub3RlIFRoZSBNYWluIE91dHB1dCBFbmFibGUgb2YgYSB0aW1lciBpbnN0YW5jZSBpcyBkaXNhYmxlZCB1bmNvbmRpb3Rpb25hbGx5CisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9NT0VfRElTQUJMRV9VTkNPTkRJVElPTkFMTFkoX19IQU5ETEVfXykgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkJEVFIgJj0gfihUSU1fQkRUUl9NT0UpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlcyB0aGUgc3BlY2lmaWVkIFRJTSBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVElNIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBUSU0gaW50ZXJydXB0IHNvdXJjZSB0byBlbmFibGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX1VQREFURTogVXBkYXRlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MxOiAgIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MyOiAgQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DQzM6ICBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NDNDogIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ09NOiAgIENvbW11dGF0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfVFJJR0dFUjogVHJpZ2dlciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0JSRUFLOiBCcmVhayBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkRJRVIgfD0gKF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGVzIHRoZSBzcGVjaWZpZWQgVElNIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBUSU0gSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFRJTSBpbnRlcnJ1cHQgc291cmNlIHRvIGRpc2FibGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX1VQREFURTogVXBkYXRlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MxOiAgIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MyOiAgQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DQzM6ICBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NDNDogIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ09NOiAgIENvbW11dGF0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfVFJJR0dFUjogVHJpZ2dlciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0JSRUFLOiBCcmVhayBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5ESUVSICY9IH4oX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlcyB0aGUgc3BlY2lmaWVkIERNQSByZXF1ZXN0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFRJTSBIYW5kbGUuCisgICogQHBhcmFtICBfX0RNQV9fIHNwZWNpZmllcyB0aGUgVElNIERNQSByZXF1ZXN0IHRvIGVuYWJsZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX1VQREFURTogVXBkYXRlIERNQSByZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MxOiAgIENhcHR1cmUvQ29tcGFyZSAxIERNQSByZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MyOiAgQ2FwdHVyZS9Db21wYXJlIDIgRE1BIHJlcXVlc3QKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzM6ICBDYXB0dXJlL0NvbXBhcmUgMyBETUEgcmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDNDogIENhcHR1cmUvQ29tcGFyZSA0IERNQSByZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ09NOiAgIENvbW11dGF0aW9uIERNQSByZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfVFJJR0dFUjogVHJpZ2dlciBETUEgcmVxdWVzdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9USU1fRU5BQkxFX0RNQShfX0hBTkRMRV9fLCBfX0RNQV9fKSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkRJRVIgfD0gKF9fRE1BX18pKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGVzIHRoZSBzcGVjaWZpZWQgRE1BIHJlcXVlc3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVElNIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRE1BX18gc3BlY2lmaWVzIHRoZSBUSU0gRE1BIHJlcXVlc3QgdG8gZGlzYWJsZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX1VQREFURTogVXBkYXRlIERNQSByZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MxOiAgIENhcHR1cmUvQ29tcGFyZSAxIERNQSByZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MyOiAgQ2FwdHVyZS9Db21wYXJlIDIgRE1BIHJlcXVlc3QKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzM6ICBDYXB0dXJlL0NvbXBhcmUgMyBETUEgcmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDNDogIENhcHR1cmUvQ29tcGFyZSA0IERNQSByZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ09NOiAgIENvbW11dGF0aW9uIERNQSByZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfVFJJR0dFUjogVHJpZ2dlciBETUEgcmVxdWVzdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9USU1fRElTQUJMRV9ETUEoX19IQU5ETEVfXywgX19ETUFfXykgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5ESUVSICY9IH4oX19ETUFfXykpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBUSU0gaW50ZXJydXB0IGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBUSU0gSGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBUSU0gaW50ZXJydXB0IGZsYWcgdG8gY2hlY2suCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX1VQREFURTogVXBkYXRlIGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDMTogQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQ0MyOiBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzM6IENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDNDogQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQ09NOiAgQ29tbXV0YXRpb24gaW50ZXJydXB0IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfVFJJR0dFUjogVHJpZ2dlciBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19CUkVBSzogQnJlYWsgaW50ZXJydXB0IGZsYWcgICAKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQ0MxT0Y6IENhcHR1cmUvQ29tcGFyZSAxIG92ZXJjYXB0dXJlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQ0MyT0Y6IENhcHR1cmUvQ29tcGFyZSAyIG92ZXJjYXB0dXJlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQ0MzT0Y6IENhcHR1cmUvQ29tcGFyZSAzIG92ZXJjYXB0dXJlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQ0M0T0Y6IENhcHR1cmUvQ29tcGFyZSA0IG92ZXJjYXB0dXJlIGZsYWcKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19GTEFHX18gKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBfX0hBTF9USU1fR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1IgJihfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXJzIHRoZSBzcGVjaWZpZWQgVElNIGludGVycnVwdCBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFRJTSBIYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIFRJTSBpbnRlcnJ1cHQgZmxhZyB0byBjbGVhci4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfVVBEQVRFOiBVcGRhdGUgaW50ZXJydXB0IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQ0MxOiBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzI6IENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDMzogQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQ0M0OiBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DT006ICBDb21tdXRhdGlvbiBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19UUklHR0VSOiBUcmlnZ2VyIGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0JSRUFLOiBCcmVhayBpbnRlcnJ1cHQgZmxhZyAgIAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzFPRjogQ2FwdHVyZS9Db21wYXJlIDEgb3ZlcmNhcHR1cmUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzJPRjogQ2FwdHVyZS9Db21wYXJlIDIgb3ZlcmNhcHR1cmUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzNPRjogQ2FwdHVyZS9Db21wYXJlIDMgb3ZlcmNhcHR1cmUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzRPRjogQ2FwdHVyZS9Db21wYXJlIDQgb3ZlcmNhcHR1cmUgZmxhZworICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1IgPSB+KF9fRkxBR19fKSkKKworLyoqCisgICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIFRJTSBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZQorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFRJTSBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICAqIEByZXR2YWwgVGhlIHN0YXRlIG9mIFRJTV9JVCAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+RElFUiAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKSA/IFNFVCA6IFJFU0VUKQorCisvKioKKyAgKiBAYnJpZWYgQ2xlYXIgdGhlIFRJTSBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgdG8gY2xlYXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9DTEVBUl9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSID0gfihfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIFRJTSBDb3VudGVyIGlzIHVzZWQgYXMgZG93bmNvdW50ZXIKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEZhbHNlIChDb3VudGVyIHVzZWQgYXMgdXBjb3VudGVyKSBvciBUcnVlIChDb3VudGVyIHVzZWQgYXMgZG93bmNvdW50ZXIpCisgICogQG5vdGUgVGhpcyBtYWNybyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsbCB0byBnZXQgdGhlIGNvdW50aW5nIG1vZGUgd2hlbiB0aGUgdGltZXIgb3BlcmF0ZXMgaW4gQ2VudGVyLWFsaWduZWQgbW9kZSBvciBFbmNvZGVyIG1vZGUuCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9JU19USU1fQ09VTlRJTkdfRE9XTihfX0hBTkRMRV9fKSAgICAgICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmKFRJTV9DUjFfRElSKSkgPT0gKFRJTV9DUjFfRElSKSkKKworLyoqCisgICogQGJyaWVmICBTZXRzIHRoZSBUSU0gYWN0aXZlIHByZXNjYWxlciByZWdpc3RlciB2YWx1ZSBvbiB1cGRhdGUgZXZlbnQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBfX1BSRVNDX18gc3BlY2lmaWVzIHRoZSBhY3RpdmUgcHJlc2NhbGVyIHJlZ2lzdGVyIG5ldyB2YWx1ZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX1NFVF9QUkVTQ0FMRVIoX19IQU5ETEVfXywgX19QUkVTQ19fKSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlBTQyA9IChfX1BSRVNDX18pKQorCisvKioKKyAgKiBAYnJpZWYgIFNldHMgdGhlIFRJTSBDb3VudGVyIFJlZ2lzdGVyIHZhbHVlIG9uIHJ1bnRpbWUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBfX0NPVU5URVJfXyBzcGVjaWZpZXMgdGhlIENvdW50ZXIgcmVnaXN0ZXIgbmV3IHZhbHVlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9USU1fU0VUX0NPVU5URVIoX19IQU5ETEVfXywgX19DT1VOVEVSX18pICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q05UID0gKF9fQ09VTlRFUl9fKSkKKworLyoqCisgICogQGJyaWVmICBHZXRzIHRoZSBUSU0gQ291bnRlciBSZWdpc3RlciB2YWx1ZSBvbiBydW50aW1lLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEByZXR2YWwgMTYtYml0IG9yIDMyLWJpdCB2YWx1ZSBvZiB0aGUgdGltZXIgY291bnRlciByZWdpc3RlciAoVElNeF9DTlQpCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9HRVRfQ09VTlRFUihfX0hBTkRMRV9fKSBcCisgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q05UKQorICAgICAKKy8qKgorICAqIEBicmllZiAgU2V0cyB0aGUgVElNIEF1dG9yZWxvYWQgUmVnaXN0ZXIgdmFsdWUgb24gcnVudGltZSB3aXRob3V0IGNhbGxpbmcgCisgICogICAgICAgICBhbm90aGVyIHRpbWUgYW55IEluaXQgZnVuY3Rpb24uCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBfX0FVVE9SRUxPQURfXyBzcGVjaWZpZXMgdGhlIENvdW50ZXIgcmVnaXN0ZXIgbmV3IHZhbHVlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9USU1fU0VUX0FVVE9SRUxPQUQoX19IQU5ETEVfXywgX19BVVRPUkVMT0FEX18pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5BUlIgPSAoX19BVVRPUkVMT0FEX18pOyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Jbml0LlBlcmlvZCA9IChfX0FVVE9SRUxPQURfXyk7ICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKworLyoqCisgICogQGJyaWVmICBHZXRzIHRoZSBUSU0gQXV0b3JlbG9hZCBSZWdpc3RlciB2YWx1ZSBvbiBydW50aW1lCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgICogQHJldHZhbCAxNi1iaXQgb3IgMzItYml0IHZhbHVlIG9mIHRoZSB0aW1lciBhdXRvLXJlbG9hZCByZWdpc3RlcihUSU14X0FSUikKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX0dFVF9BVVRPUkVMT0FEKF9fSEFORExFX18pIFwKKyAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5BUlIpCisgICAgIAorLyoqCisgICogQGJyaWVmICBTZXRzIHRoZSBUSU0gQ2xvY2sgRGl2aXNpb24gdmFsdWUgb24gcnVudGltZSB3aXRob3V0IGNhbGxpbmcgCisgICogICAgICAgICBhbm90aGVyIHRpbWUgYW55IEluaXQgZnVuY3Rpb24uIAorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgX19DS0RfXyBzcGVjaWZpZXMgdGhlIGNsb2NrIGRpdmlzaW9uIHZhbHVlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZToKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NMT0NLRElWSVNJT05fRElWMTogdERUUz10Q0tfSU5UCisgICogICAgICAgICAgICBAYXJnIFRJTV9DTE9DS0RJVklTSU9OX0RJVjI6IHREVFM9Mip0Q0tfSU5UCisgICogICAgICAgICAgICBAYXJnIFRJTV9DTE9DS0RJVklTSU9OX0RJVjQ6IHREVFM9NCp0Q0tfSU5UCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9TRVRfQ0xPQ0tESVZJU0lPTihfX0hBTkRMRV9fLCBfX0NLRF9fKSBcCisgICAgICAgICAgICAgICAgICAgICAgICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICY9ICh1aW50MTZfdCkoflRJTV9DUjFfQ0tEKTsgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSB8PSAoX19DS0RfXyk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+SW5pdC5DbG9ja0RpdmlzaW9uID0gKF9fQ0tEX18pOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisgCisvKioKKyAgKiBAYnJpZWYgIEdldHMgdGhlIFRJTSBDbG9jayBEaXZpc2lvbiB2YWx1ZSBvbiBydW50aW1lCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgIAorICAqIEByZXR2YWwgVGhlIGNsb2NrIGRpdmlzaW9uIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DTE9DS0RJVklTSU9OX0RJVjE6IHREVFM9dENLX0lOVAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0xPQ0tESVZJU0lPTl9ESVYyOiB0RFRTPTIqdENLX0lOVAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0xPQ0tESVZJU0lPTl9ESVY0OiB0RFRTPTQqdENLX0lOVAorICAqLworI2RlZmluZSBfX0hBTF9USU1fR0VUX0NMT0NLRElWSVNJT04oX19IQU5ETEVfXykgIFwKKyAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJiBUSU1fQ1IxX0NLRCkKKyAgICAgCisvKioKKyAgKiBAYnJpZWYgIFNldHMgdGhlIFRJTSBJbnB1dCBDYXB0dXJlIHByZXNjYWxlciBvbiBydW50aW1lIHdpdGhvdXQgY2FsbGluZyAKKyAgKiAgICAgICAgIGFub3RoZXIgdGltZSBIQUxfVElNX0lDX0NvbmZpZ0NoYW5uZWwoKSBmdW5jdGlvbi4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRJTSBDaGFubmVscyB0byBiZSBjb25maWd1cmVkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcGFyYW0gIF9fSUNQU0NfXyBzcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmU0IHByZXNjYWxlciBuZXcgdmFsdWUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUFNDX0RJVjE6IG5vIHByZXNjYWxlcgorICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQU0NfRElWMjogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgMiBldmVudHMKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUFNDX0RJVjQ6IGNhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDQgZXZlbnRzCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BTQ19ESVY4OiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA4IGV2ZW50cworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9USU1fU0VUX0lDUFJFU0NBTEVSKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fLCBfX0lDUFNDX18pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fUkVTRVRfSUNQUkVTQ0FMRVJWQUxVRSgoX19IQU5ETEVfXyksIChfX0NIQU5ORUxfXykpOyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX1NFVF9JQ1BSRVNDQUxFUlZBTFVFKChfX0hBTkRMRV9fKSwgKF9fQ0hBTk5FTF9fKSwgKF9fSUNQU0NfXykpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisvKioKKyAgKiBAYnJpZWYgIEdldHMgdGhlIFRJTSBJbnB1dCBDYXB0dXJlIHByZXNjYWxlciBvbiBydW50aW1lCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBUSU0gQ2hhbm5lbHMgdG8gYmUgY29uZmlndXJlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBnZXQgaW5wdXQgY2FwdHVyZSAxIHByZXNjYWxlciB2YWx1ZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBnZXQgaW5wdXQgY2FwdHVyZSAyIHByZXNjYWxlciB2YWx1ZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBnZXQgaW5wdXQgY2FwdHVyZSAzIHByZXNjYWxlciB2YWx1ZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBnZXQgaW5wdXQgY2FwdHVyZSA0IHByZXNjYWxlciB2YWx1ZQorICAqIEByZXR2YWwgVGhlIGlucHV0IGNhcHR1cmUgcHJlc2NhbGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BTQ19ESVYxOiBubyBwcmVzY2FsZXIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUFNDX0RJVjI6IGNhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDIgZXZlbnRzCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BTQ19ESVY0OiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA0IGV2ZW50cworICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQU0NfRElWODogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgOCBldmVudHMKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX0dFVF9JQ1BSRVNDQUxFUihfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXykgIFwKKyAgKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxICYgVElNX0NDTVIxX0lDMVBTQykgOlwKKyAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpID8gKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSAmIFRJTV9DQ01SMV9JQzJQU0MpID4+IDhVKSA6XAorICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjIgJiBUSU1fQ0NNUjJfSUMzUFNDKSA6XAorICAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiAmIFRJTV9DQ01SMl9JQzRQU0MpKSA+PiA4VSkKKyAgICAKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBVcGRhdGUgUmVxdWVzdCBTb3VyY2UgKFVSUykgYml0IG9mIHRoZSBUSU14X0NSMSByZWdpc3RlcgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEBub3RlICBXaGVuIHRoZSBVU1IgYml0IG9mIHRoZSBUSU14X0NSMSByZWdpc3RlciBpcyBzZXQsIG9ubHkgY291bnRlciAKKyAgKiAgICAgICAgb3ZlcmZsb3cvdW5kZXJmbG93IGdlbmVyYXRlcyBhbiB1cGRhdGUgaW50ZXJydXB0IG9yIERNQSByZXF1ZXN0IChpZgorICAqICAgICAgICBlbmFibGVkKQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9USU1fVVJTX0VOQUJMRShfX0hBTkRMRV9fKSBcCisgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMXw9IChUSU1fQ1IxX1VSUykpCisKKy8qKgorICAqIEBicmllZiAgUmVzZXQgdGhlIFVwZGF0ZSBSZXF1ZXN0IFNvdXJjZSAoVVJTKSBiaXQgb2YgdGhlIFRJTXhfQ1IxIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgICogQG5vdGUgIFdoZW4gdGhlIFVTUiBiaXQgb2YgdGhlIFRJTXhfQ1IxIHJlZ2lzdGVyIGlzIHJlc2V0LCBhbnkgb2YgdGhlIAorICAqICAgICAgICBmb2xsb3dpbmcgZXZlbnRzIGdlbmVyYXRlIGFuIHVwZGF0ZSBpbnRlcnJ1cHQgb3IgRE1BIHJlcXVlc3QgKGlmIAorICAqICAgICAgICBlbmFibGVkKToKKyAgKiAgICAgICAgICAoKykgQ291bnRlciBvdmVyZmxvdy91bmRlcmZsb3cKKyAgKiAgICAgICAgICAoKykgU2V0dGluZyB0aGUgVUcgYml0CisgICogICAgICAgICAgKCspIFVwZGF0ZSBnZW5lcmF0aW9uIHRocm91Z2ggdGhlIHNsYXZlIG1vZGUgY29udHJvbGxlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9USU1fVVJTX0RJU0FCTEUoX19IQU5ETEVfXykgXAorICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSY9fihUSU1fQ1IxX1VSUykpCisKKy8qKgorICAqIEBicmllZiAgU2V0cyB0aGUgVElNIENhcHR1cmUgeCBpbnB1dCBwb2xhcml0eSBvbiBydW50aW1lLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgX19DSEFOTkVMX18gVElNIENoYW5uZWxzIHRvIGJlIGNvbmZpZ3VyZWQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEBwYXJhbSAgX19QT0xBUklUWV9fIFBvbGFyaXR5IGZvciBUSXggc291cmNlICAgCisgICogICAgICAgICAgICBAYXJnIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9SSVNJTkc6IFJpc2luZyBFZGdlCisgICogICAgICAgICAgICBAYXJnIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9GQUxMSU5HOiBGYWxsaW5nIEVkZ2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lOUFVUQ0hBTk5FTFBPTEFSSVRZX0JPVEhFREdFOiBSaXNpbmcgYW5kIEZhbGxpbmcgRWRnZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9USU1fU0VUX0NBUFRVUkVQT0xBUklUWShfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXywgX19QT0xBUklUWV9fKSAgICBcCisgICAgICAgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBUSU1fUkVTRVRfQ0FQVFVSRVBPTEFSSVRZKChfX0hBTkRMRV9fKSwgKF9fQ0hBTk5FTF9fKSk7ICAgICAgICAgICAgICAgXAorICAgICAgICAgIFRJTV9TRVRfQ0FQVFVSRVBPTEFSSVRZKChfX0hBTkRMRV9fKSwgKF9fQ0hBTk5FTF9fKSwgKF9fUE9MQVJJVFlfXykpOyBcCisgICAgICAgIH13aGlsZSgwVSkgICAgICAgICAgCisKKy8qKgorICAqIEB9CisgICovCisvKiBFbmQgb2YgZXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIENvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFRJTV9Qcml2YXRlX0NvbnN0YW50cyBUSU0gUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiBUaGUgY291bnRlciBvZiBhIHRpbWVyIGluc3RhbmNlIGlzIGRpc2FibGVkIG9ubHkgaWYgYWxsIHRoZSBDQ3ggYW5kIENDeE4KKyAgIGNoYW5uZWxzIGhhdmUgYmVlbiBkaXNhYmxlZCAqLworI2RlZmluZSBUSU1fQ0NFUl9DQ3hFX01BU0sgKCh1aW50MzJfdCkoVElNX0NDRVJfQ0MxRSB8IFRJTV9DQ0VSX0NDMkUgfCBUSU1fQ0NFUl9DQzNFIHwgVElNX0NDRVJfQ0M0RSkpCisjZGVmaW5lIFRJTV9DQ0VSX0NDeE5FX01BU0sgKCh1aW50MzJfdCkoVElNX0NDRVJfQ0MxTkUgfCBUSU1fQ0NFUl9DQzJORSB8IFRJTV9DQ0VSX0NDM05FKSkKKworLyoqCisgICogQH0KKyAgKi8KKy8qIEVuZCBvZiBwcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgTWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNX1ByaXZhdGVfTWFjcm9zIFRJTSBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfVElNX0NPVU5URVJfTU9ERShNT0RFKSAoKChNT0RFKSA9PSBUSU1fQ09VTlRFUk1PREVfVVApICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gVElNX0NPVU5URVJNT0RFX0RPV04pICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFRJTV9DT1VOVEVSTU9ERV9DRU5URVJBTElHTkVEMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBUSU1fQ09VTlRFUk1PREVfQ0VOVEVSQUxJR05FRDIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gVElNX0NPVU5URVJNT0RFX0NFTlRFUkFMSUdORUQzKSkKKworI2RlZmluZSBJU19USU1fQ0xPQ0tESVZJU0lPTl9ESVYoRElWKSAoKChESVYpID09IFRJTV9DTE9DS0RJVklTSU9OX0RJVjEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRElWKSA9PSBUSU1fQ0xPQ0tESVZJU0lPTl9ESVYyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERJVikgPT0gVElNX0NMT0NLRElWSVNJT05fRElWNCkpCisKKyNkZWZpbmUgSVNfVElNX0FVVE9SRUxPQURfUFJFTE9BRChQUkVMT0FEKSAoKChQUkVMT0FEKSA9PSBUSU1fQVVUT1JFTE9BRF9QUkVMT0FEX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQUkVMT0FEKSA9PSBUSU1fQVVUT1JFTE9BRF9QUkVMT0FEX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfVElNX0ZBU1RfU1RBVEUoU1RBVEUpICgoKFNUQVRFKSA9PSBUSU1fT0NGQVNUX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQVRFKSA9PSBUSU1fT0NGQVNUX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfVElNX09DX1BPTEFSSVRZKFBPTEFSSVRZKSAoKChQT0xBUklUWSkgPT0gVElNX09DUE9MQVJJVFlfSElHSCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBPTEFSSVRZKSA9PSBUSU1fT0NQT0xBUklUWV9MT1cpKQorCisjZGVmaW5lIElTX1RJTV9PQ05fUE9MQVJJVFkoUE9MQVJJVFkpICgoKFBPTEFSSVRZKSA9PSBUSU1fT0NOUE9MQVJJVFlfSElHSCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQT0xBUklUWSkgPT0gVElNX09DTlBPTEFSSVRZX0xPVykpCisKKyNkZWZpbmUgSVNfVElNX09DSURMRV9TVEFURShTVEFURSkgKCgoU1RBVEUpID09IFRJTV9PQ0lETEVTVEFURV9TRVQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RBVEUpID09IFRJTV9PQ0lETEVTVEFURV9SRVNFVCkpCisKKyNkZWZpbmUgSVNfVElNX09DTklETEVfU1RBVEUoU1RBVEUpICgoKFNUQVRFKSA9PSBUSU1fT0NOSURMRVNUQVRFX1NFVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RBVEUpID09IFRJTV9PQ05JRExFU1RBVEVfUkVTRVQpKQorCisgICAgCisjZGVmaW5lIElTX1RJTV9JQ19QT0xBUklUWShQT0xBUklUWSkgKCgoUE9MQVJJVFkpID09IFRJTV9JQ1BPTEFSSVRZX1JJU0lORykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUE9MQVJJVFkpID09IFRJTV9JQ1BPTEFSSVRZX0ZBTExJTkcpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUE9MQVJJVFkpID09IFRJTV9JQ1BPTEFSSVRZX0JPVEhFREdFKSkKKworI2RlZmluZSBJU19USU1fSUNfU0VMRUNUSU9OKFNFTEVDVElPTikgKCgoU0VMRUNUSU9OKSA9PSBUSU1fSUNTRUxFQ1RJT05fRElSRUNUVEkpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNFTEVDVElPTikgPT0gVElNX0lDU0VMRUNUSU9OX0lORElSRUNUVEkpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNFTEVDVElPTikgPT0gVElNX0lDU0VMRUNUSU9OX1RSQykpCisKKyNkZWZpbmUgSVNfVElNX0lDX1BSRVNDQUxFUihQUkVTQ0FMRVIpICgoKFBSRVNDQUxFUikgPT0gVElNX0lDUFNDX0RJVjEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBSRVNDQUxFUikgPT0gVElNX0lDUFNDX0RJVjIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBSRVNDQUxFUikgPT0gVElNX0lDUFNDX0RJVjQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBSRVNDQUxFUikgPT0gVElNX0lDUFNDX0RJVjgpKQorCisjZGVmaW5lIElTX1RJTV9PUE1fTU9ERShNT0RFKSAoKChNT0RFKSA9PSBUSU1fT1BNT0RFX1NJTkdMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBUSU1fT1BNT0RFX1JFUEVUSVRJVkUpKQorCisjZGVmaW5lIElTX1RJTV9FTkNPREVSX01PREUoTU9ERSkgKCgoTU9ERSkgPT0gVElNX0VOQ09ERVJNT0RFX1RJMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFRJTV9FTkNPREVSTU9ERV9USTIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBUSU1fRU5DT0RFUk1PREVfVEkxMikpICAgCisKKyNkZWZpbmUgSVNfVElNX0RNQV9TT1VSQ0UoU09VUkNFKSAoKCgoU09VUkNFKSAmIDB4RkZGRjgwRkZVKSA9PSAweDAwMDAwMDAwVSkgJiYgKChTT1VSQ0UpICE9IDB4MDAwMDAwMDBVKSkKKworCisjZGVmaW5lIElTX1RJTV9DTE9DS1NPVVJDRShDTE9DSykgKCgoQ0xPQ0spID09IFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENMT0NLKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDTE9DSykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjApICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0xPQ0spID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENMT0NLKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMikgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDTE9DSykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjMpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0xPQ0spID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENMT0NLKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxKSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDTE9DSykgPT0gVElNX0NMT0NLU09VUkNFX1RJMikgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0xPQ0spID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMSkpCisKKyNkZWZpbmUgSVNfVElNX0NMT0NLUE9MQVJJVFkoUE9MQVJJVFkpICgoKFBPTEFSSVRZKSA9PSBUSU1fQ0xPQ0tQT0xBUklUWV9JTlZFUlRFRCkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUE9MQVJJVFkpID09IFRJTV9DTE9DS1BPTEFSSVRZX05PTklOVkVSVEVEKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQT0xBUklUWSkgPT0gVElNX0NMT0NLUE9MQVJJVFlfUklTSU5HKSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBPTEFSSVRZKSA9PSBUSU1fQ0xPQ0tQT0xBUklUWV9GQUxMSU5HKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUE9MQVJJVFkpID09IFRJTV9DTE9DS1BPTEFSSVRZX0JPVEhFREdFKSkKKworI2RlZmluZSBJU19USU1fQ0xPQ0tQUkVTQ0FMRVIoUFJFU0NBTEVSKSAoKChQUkVTQ0FMRVIpID09IFRJTV9DTE9DS1BSRVNDQUxFUl9ESVYxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBSRVNDQUxFUikgPT0gVElNX0NMT0NLUFJFU0NBTEVSX0RJVjIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUFJFU0NBTEVSKSA9PSBUSU1fQ0xPQ0tQUkVTQ0FMRVJfRElWNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQUkVTQ0FMRVIpID09IFRJTV9DTE9DS1BSRVNDQUxFUl9ESVY4KSkgCisKKyNkZWZpbmUgSVNfVElNX0NMT0NLRklMVEVSKElDRklMVEVSKSAgICAgICgoSUNGSUxURVIpIDw9IDB4RlUpIAorCisjZGVmaW5lIElTX1RJTV9DTEVBUklOUFVUX1BPTEFSSVRZKFBPTEFSSVRZKSAoKChQT0xBUklUWSkgPT0gVElNX0NMRUFSSU5QVVRQT0xBUklUWV9JTlZFUlRFRCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQT0xBUklUWSkgPT0gVElNX0NMRUFSSU5QVVRQT0xBUklUWV9OT05JTlZFUlRFRCkpIAorCisjZGVmaW5lIElTX1RJTV9DTEVBUklOUFVUX1BSRVNDQUxFUihQUkVTQ0FMRVIpICAgKCgoUFJFU0NBTEVSKSA9PSBUSU1fQ0xFQVJJTlBVVFBSRVNDQUxFUl9ESVYxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBSRVNDQUxFUikgPT0gVElNX0NMRUFSSU5QVVRQUkVTQ0FMRVJfRElWMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQUkVTQ0FMRVIpID09IFRJTV9DTEVBUklOUFVUUFJFU0NBTEVSX0RJVjQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUFJFU0NBTEVSKSA9PSBUSU1fQ0xFQVJJTlBVVFBSRVNDQUxFUl9ESVY4KSkgCisKKyNkZWZpbmUgSVNfVElNX0NMRUFSSU5QVVRfRklMVEVSKElDRklMVEVSKSAoKElDRklMVEVSKSA8PSAweEZVKSAKKworI2RlZmluZSBJU19USU1fT1NTUl9TVEFURShTVEFURSkgKCgoU1RBVEUpID09IFRJTV9PU1NSX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RBVEUpID09IFRJTV9PU1NSX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX1RJTV9PU1NJX1NUQVRFKFNUQVRFKSAoKChTVEFURSkgPT0gVElNX09TU0lfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVEFURSkgPT0gVElNX09TU0lfRElTQUJMRSkpCisKKyNkZWZpbmUgSVNfVElNX0xPQ0tfTEVWRUwoTEVWRUwpICgoKExFVkVMKSA9PSBUSU1fTE9DS0xFVkVMX09GRikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVWRUwpID09IFRJTV9MT0NLTEVWRUxfMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVWRUwpID09IFRJTV9MT0NLTEVWRUxfMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVWRUwpID09IFRJTV9MT0NLTEVWRUxfMykpIAorCisjZGVmaW5lIElTX1RJTV9CUkVBS19TVEFURShTVEFURSkgKCgoU1RBVEUpID09IFRJTV9CUkVBS19FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVEFURSkgPT0gVElNX0JSRUFLX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX1RJTV9CUkVBS19QT0xBUklUWShQT0xBUklUWSkgKCgoUE9MQVJJVFkpID09IFRJTV9CUkVBS1BPTEFSSVRZX0xPVykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBPTEFSSVRZKSA9PSBUSU1fQlJFQUtQT0xBUklUWV9ISUdIKSkKKworI2RlZmluZSBJU19USU1fQVVUT01BVElDX09VVFBVVF9TVEFURShTVEFURSkgKCgoU1RBVEUpID09IFRJTV9BVVRPTUFUSUNPVVRQVVRfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVEFURSkgPT0gVElNX0FVVE9NQVRJQ09VVFBVVF9ESVNBQkxFKSkKKworI2RlZmluZSBJU19USU1fVFJHT19TT1VSQ0UoU09VUkNFKSAoKChTT1VSQ0UpID09IFRJTV9UUkdPX1JFU0VUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gVElNX1RSR09fRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gVElNX1RSR09fVVBEQVRFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gVElNX1RSR09fT0MxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gVElNX1RSR09fT0MxUkVGKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gVElNX1RSR09fT0MyUkVGKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gVElNX1RSR09fT0MzUkVGKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gVElNX1RSR09fT0M0UkVGKSkKKyAgICAgIAorI2RlZmluZSBJU19USU1fTVNNX1NUQVRFKFNUQVRFKSAoKChTVEFURSkgPT0gVElNX01BU1RFUlNMQVZFTU9ERV9FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RBVEUpID09IFRJTV9NQVNURVJTTEFWRU1PREVfRElTQUJMRSkpCisKKyNkZWZpbmUgSVNfVElNX1RSSUdHRVJfU0VMRUNUSU9OKFNFTEVDVElPTikgKCgoU0VMRUNUSU9OKSA9PSBUSU1fVFNfSVRSMCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTRUxFQ1RJT04pID09IFRJTV9UU19JVFIxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNFTEVDVElPTikgPT0gVElNX1RTX0lUUjIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0VMRUNUSU9OKSA9PSBUSU1fVFNfSVRSMykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTRUxFQ1RJT04pID09IFRJTV9UU19USTFGX0VEKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNFTEVDVElPTikgPT0gVElNX1RTX1RJMUZQMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTRUxFQ1RJT04pID09IFRJTV9UU19USTJGUDIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0VMRUNUSU9OKSA9PSBUSU1fVFNfRVRSRikpCisKKyNkZWZpbmUgSVNfVElNX0lOVEVSTkFMX1RSSUdHRVJFVkVOVF9TRUxFQ1RJT04oU0VMRUNUSU9OKSAoKChTRUxFQ1RJT04pID09IFRJTV9UU19JVFIwKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0VMRUNUSU9OKSA9PSBUSU1fVFNfSVRSMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNFTEVDVElPTikgPT0gVElNX1RTX0lUUjIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTRUxFQ1RJT04pID09IFRJTV9UU19JVFIzKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0VMRUNUSU9OKSA9PSBUSU1fVFNfTk9ORSkpCisKKyNkZWZpbmUgSVNfVElNX1RSSUdHRVJQT0xBUklUWShQT0xBUklUWSkgICAgICgoKFBPTEFSSVRZKSA9PSBUSU1fVFJJR0dFUlBPTEFSSVRZX0lOVkVSVEVEICAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQT0xBUklUWSkgPT0gVElNX1RSSUdHRVJQT0xBUklUWV9OT05JTlZFUlRFRCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUE9MQVJJVFkpID09IFRJTV9UUklHR0VSUE9MQVJJVFlfUklTSU5HICAgICApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBPTEFSSVRZKSA9PSBUSU1fVFJJR0dFUlBPTEFSSVRZX0ZBTExJTkcgICAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQT0xBUklUWSkgPT0gVElNX1RSSUdHRVJQT0xBUklUWV9CT1RIRURHRSAgICkpCisKKyNkZWZpbmUgSVNfVElNX1RSSUdHRVJQUkVTQ0FMRVIoUFJFU0NBTEVSKSAgKCgoUFJFU0NBTEVSKSA9PSBUSU1fVFJJR0dFUlBSRVNDQUxFUl9ESVYxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBSRVNDQUxFUikgPT0gVElNX1RSSUdHRVJQUkVTQ0FMRVJfRElWMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQUkVTQ0FMRVIpID09IFRJTV9UUklHR0VSUFJFU0NBTEVSX0RJVjQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUFJFU0NBTEVSKSA9PSBUSU1fVFJJR0dFUlBSRVNDQUxFUl9ESVY4KSkgCisKKyNkZWZpbmUgSVNfVElNX1RSSUdHRVJGSUxURVIoSUNGSUxURVIpICAgICAoKElDRklMVEVSKSA8PSAweEZVKSAKKworI2RlZmluZSBJU19USU1fVEkxU0VMRUNUSU9OKFRJMVNFTEVDVElPTikgICAoKChUSTFTRUxFQ1RJT04pID09IFRJTV9USTFTRUxFQ1RJT05fQ0gxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRJMVNFTEVDVElPTikgPT0gVElNX1RJMVNFTEVDVElPTl9YT1JDT01CSU5BVElPTikpCisKKyNkZWZpbmUgSVNfVElNX0RNQV9MRU5HVEgoTEVOR1RIKSAoKChMRU5HVEgpID09IFRJTV9ETUFCVVJTVExFTkdUSF8xVFJBTlNGRVIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMRU5HVEgpID09IFRJTV9ETUFCVVJTVExFTkdUSF8yVFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVOR1RIKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfM1RSQU5TRkVSUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExFTkdUSCkgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzRUUkFOU0ZFUlMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMRU5HVEgpID09IFRJTV9ETUFCVVJTVExFTkdUSF81VFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVOR1RIKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfNlRSQU5TRkVSUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExFTkdUSCkgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzdUUkFOU0ZFUlMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMRU5HVEgpID09IFRJTV9ETUFCVVJTVExFTkdUSF84VFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVOR1RIKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfOVRSQU5TRkVSUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExFTkdUSCkgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzEwVFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVOR1RIKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfMTFUUkFOU0ZFUlMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMRU5HVEgpID09IFRJTV9ETUFCVVJTVExFTkdUSF8xMlRSQU5TRkVSUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExFTkdUSCkgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzEzVFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVOR1RIKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfMTRUUkFOU0ZFUlMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMRU5HVEgpID09IFRJTV9ETUFCVVJTVExFTkdUSF8xNVRSQU5TRkVSUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExFTkdUSCkgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzE2VFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVOR1RIKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfMTdUUkFOU0ZFUlMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMRU5HVEgpID09IFRJTV9ETUFCVVJTVExFTkdUSF8xOFRSQU5TRkVSUykpCisKKyNkZWZpbmUgSVNfVElNX0RNQV9EQVRBX0xFTkdUSChMRU5HVEgpICgoKExFTkdUSCkgPj0gMHgxVSkgJiYgKChMRU5HVEgpIDwgMHgxMDAwMFUpKQorCisjZGVmaW5lIElTX1RJTV9JQ19GSUxURVIoSUNGSUxURVIpICgoSUNGSUxURVIpIDw9IDB4RlUpIAorCisvKiogQGJyaWVmIFNldCBUSU0gSUMgcHJlc2NhbGVyCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIHNwZWNpZmllcyBUSU0gQ2hhbm5lbAorICAqIEBwYXJhbSAgX19JQ1BTQ19fIHNwZWNpZmllcyB0aGUgcHJlc2NhbGVyIHZhbHVlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBUSU1fU0VUX0lDUFJFU0NBTEVSVkFMVUUoX19IQU5ETEVfXywgX19DSEFOTkVMX18sIF9fSUNQU0NfXykgXAorKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxIHw9IChfX0lDUFNDX18pKSA6XAorICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxIHw9ICgoX19JQ1BTQ19fKSA8PCA4VSkpIDpcCisgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjIgfD0gKF9fSUNQU0NfXykpIDpcCisgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyIHw9ICgoX19JQ1BTQ19fKSA8PCA4VSkpKQorCisvKiogQGJyaWVmIFJlc2V0IFRJTSBJQyBwcmVzY2FsZXIKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZQorICAqIEBwYXJhbSAgX19DSEFOTkVMX18gc3BlY2lmaWVzIFRJTSBDaGFubmVsCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFRJTV9SRVNFVF9JQ1BSRVNDQUxFUlZBTFVFKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fKSBcCisoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgJj0gKHVpbnQxNl90KX5USU1fQ0NNUjFfSUMxUFNDKSA6XAorICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxICY9ICh1aW50MTZfdCl+VElNX0NDTVIxX0lDMlBTQykgOlwKKyAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiAmPSAodWludDE2X3QpflRJTV9DQ01SMl9JQzNQU0MpIDpcCisgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyICY9ICh1aW50MTZfdCl+VElNX0NDTVIyX0lDNFBTQykpCisKKy8qKiBAYnJpZWYgU2V0IFRJTSBJQyBwb2xhcml0eQorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBzcGVjaWZpZXMgVElNIENoYW5uZWwKKyAgKiBAcGFyYW0gIF9fUE9MQVJJVFlfXyBzcGVjaWZpZXMgVElNIENoYW5uZWwgUG9sYXJpdHkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgVElNX1NFVF9DQVBUVVJFUE9MQVJJVFkoX19IQU5ETEVfXywgX19DSEFOTkVMX18sIF9fUE9MQVJJVFlfXykgXAorKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgfD0gKF9fUE9MQVJJVFlfXykpIDpcCisgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiB8PSAoKF9fUE9MQVJJVFlfXykgPDwgNFUpKSA6XAorICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgfD0gKChfX1BPTEFSSVRZX18pIDw8IDhVKSkgOlwKKyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiB8PSAoKChfX1BPTEFSSVRZX18pIDw8IDEyVSkpKSkKKworLyoqIEBicmllZiBSZXNldCBUSU0gSUMgcG9sYXJpdHkKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZQorICAqIEBwYXJhbSAgX19DSEFOTkVMX18gc3BlY2lmaWVzIFRJTSBDaGFubmVsCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFRJTV9SRVNFVF9DQVBUVVJFUE9MQVJJVFkoX19IQU5ETEVfXywgX19DSEFOTkVMX18pIFwKKygoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ0VSICY9ICh1aW50MTZfdCl+KFRJTV9DQ0VSX0NDMVAgfCBUSU1fQ0NFUl9DQzFOUCkpIDpcCisgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiAmPSAodWludDE2X3QpfihUSU1fQ0NFUl9DQzJQIHwgVElNX0NDRVJfQ0MyTlApKSA6XAorICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgJj0gKHVpbnQxNl90KX4oVElNX0NDRVJfQ0MzUCB8IFRJTV9DQ0VSX0NDM05QKSkgOlwKKyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiAmPSAodWludDE2X3QpfihUSU1fQ0NFUl9DQzRQIHwgVElNX0NDRVJfQ0M0TlApKSkKKy8qKgorICAqIEB9CisgICovCisvKiBFbmQgb2YgcHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBJbmNsdWRlIFRJTSBIQUwgRXh0ZW5kZWQgbW9kdWxlICovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF90aW1fZXguaCIKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgKiBAeworICovCisvKiBUaW1lIEJhc2UgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX0luaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fQmFzZV9Nc3BJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9CYXNlX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0Jhc2VfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBETUEgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90ICpwRGF0YSwgdWludDE2X3QgTGVuZ3RoKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAqIEB7CisgKi8KKy8qIFRpbWVyIE91dHB1dCBDb21wYXJlIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19Jbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9PQ19Nc3BJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9PQ19Nc3BEZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworLyogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworLyogTm9uLUJsb2NraW5nIG1vZGU6IERNQSAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90ICpwRGF0YSwgdWludDE2X3QgTGVuZ3RoKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworCisvKioKKyAgKiBAfQorICAqLworICAKKy8qKiBAYWRkdG9ncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMworICogQHsKKyAqLworLyogVGltZXIgUFdNIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9Jbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fUFdNX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX1BXTV9Nc3BEZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworLyogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CisvKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBETUEgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhLCB1aW50MTZfdCBMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGFkZHRvZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQKKyAqIEB7CisgKi8KKy8qIFRpbWVyIElucHV0IENhcHR1cmUgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19Jbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9JQ19Nc3BJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9JQ19Nc3BEZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworLyogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworLyogTm9uLUJsb2NraW5nIG1vZGU6IERNQSAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90ICpwRGF0YSwgdWludDE2X3QgTGVuZ3RoKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGFkZHRvZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDUKKyAqIEB7CisgKi8KKy8qIFRpbWVyIE9uZSBQdWxzZSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9Jbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBPbmVQdWxzZU1vZGUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9EZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX09uZVB1bHNlX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX09uZVB1bHNlX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBPdXRwdXRDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCk7CisvKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBPdXRwdXRDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDYKKyAqIEB7CisgKi8KKy8qIFRpbWVyIEVuY29kZXIgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX0luaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sICBUSU1fRW5jb2Rlcl9Jbml0VHlwZURlZiogc0NvbmZpZyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9FbmNvZGVyX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX0VuY29kZXJfTXNwRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKKyAvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBETUEgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90ICpwRGF0YTEsIHVpbnQzMl90ICpwRGF0YTIsIHVpbnQxNl90IExlbmd0aCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDcKKyAgKiBAeworICAqLworLyogSW50ZXJydXB0IEhhbmRsZXIgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIQUxfVElNX0lSUUhhbmRsZXIoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA4CisgICogQHsKKyAgKi8KKy8qIENvbnRyb2wgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX0NvbmZpZ0NoYW5uZWwoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9PQ19Jbml0VHlwZURlZiogc0NvbmZpZywgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9Db25maWdDaGFubmVsKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fT0NfSW5pdFR5cGVEZWYqIHNDb25maWcsIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19Db25maWdDaGFubmVsKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fSUNfSW5pdFR5cGVEZWYqIHNDb25maWcsIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9Db25maWdDaGFubmVsKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fT25lUHVsc2VfSW5pdFR5cGVEZWYqIHNDb25maWcsIHVpbnQzMl90IE91dHB1dENoYW5uZWwsICB1aW50MzJfdCBJbnB1dENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9Db25maWdPQ3JlZkNsZWFyKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fQ2xlYXJJbnB1dENvbmZpZ1R5cGVEZWYgKiBzQ2xlYXJJbnB1dENvbmZpZywgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0NvbmZpZ0Nsb2NrU291cmNlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fQ2xvY2tDb25maWdUeXBlRGVmICogc0Nsb2NrU291cmNlQ29uZmlnKTsgICAgCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0NvbmZpZ1RJMUlucHV0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBUSTFfU2VsZWN0aW9uKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fU2xhdmVDb25maWdTeW5jaHJvbml6YXRpb24oVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9TbGF2ZUNvbmZpZ1R5cGVEZWYgKiBzU2xhdmVDb25maWcpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9TbGF2ZUNvbmZpZ1N5bmNocm9uaXphdGlvbl9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgVElNX1NsYXZlQ29uZmlnVHlwZURlZiAqIHNTbGF2ZUNvbmZpZyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0RNQUJ1cnN0X1dyaXRlU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IEJ1cnN0QmFzZUFkZHJlc3MsIHVpbnQzMl90IEJ1cnN0UmVxdWVzdFNyYywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAqQnVyc3RCdWZmZXIsIHVpbnQzMl90ICBCdXJzdExlbmd0aCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0RNQUJ1cnN0X011bHRpV3JpdGVTdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQnVyc3RCYXNlQWRkcmVzcywgdWludDMyX3QgQnVyc3RSZXF1ZXN0U3JjLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgKkJ1cnN0QnVmZmVyLCB1aW50MzJfdCAgQnVyc3RMZW5ndGgsIHVpbnQzMl90ICBEYXRhTGVuZ3RoKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRE1BQnVyc3RfV3JpdGVTdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9ETUFCdXJzdF9SZWFkU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IEJ1cnN0QmFzZUFkZHJlc3MsIHVpbnQzMl90IEJ1cnN0UmVxdWVzdFNyYywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAqQnVyc3RCdWZmZXIsIHVpbnQzMl90ICBCdXJzdExlbmd0aCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0RNQUJ1cnN0X011bHRpUmVhZFN0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBCdXJzdEJhc2VBZGRyZXNzLCB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICpCdXJzdEJ1ZmZlciwgdWludDMyX3QgIEJ1cnN0TGVuZ3RoLCB1aW50MzJfdCAgRGF0YUxlbmd0aCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0RNQUJ1cnN0X1JlYWRTdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9HZW5lcmF0ZUV2ZW50KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBFdmVudFNvdXJjZSk7Cit1aW50MzJfdCBIQUxfVElNX1JlYWRDYXB0dXJlZFZhbHVlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA5CisgICogQHsKKyAgKi8KKy8qIENhbGxiYWNrIGluIG5vbiBibG9ja2luZyBtb2RlcyAoSW50ZXJydXB0IGFuZCBETUEpICoqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhBTF9USU1fUGVyaW9kRWxhcHNlZENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9PQ19EZWxheUVsYXBzZWRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fSUNfQ2FwdHVyZUNhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9UcmlnZ2VyQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX0Vycm9yQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxMAorICogQHsKKyAqLworLyogUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1RJTV9TdGF0ZVR5cGVEZWYgSEFMX1RJTV9CYXNlX0dldFN0YXRlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK0hBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1fT0NfR2V0U3RhdGUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworSEFMX1RJTV9TdGF0ZVR5cGVEZWYgSEFMX1RJTV9QV01fR2V0U3RhdGUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworSEFMX1RJTV9TdGF0ZVR5cGVEZWYgSEFMX1RJTV9JQ19HZXRTdGF0ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CitIQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX0dldFN0YXRlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK0hBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9HZXRTdGF0ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisvKiBFbmQgb2YgZXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIEZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVElNX1ByaXZhdGVfRnVuY3Rpb25zCisgKiBAeworICovCit2b2lkIFRJTV9CYXNlX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgVElNX0Jhc2VfSW5pdFR5cGVEZWYgKlN0cnVjdHVyZSk7Cit2b2lkIFRJTV9USTFfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBUSU1fSUNQb2xhcml0eSwgdWludDMyX3QgVElNX0lDU2VsZWN0aW9uLCB1aW50MzJfdCBUSU1fSUNGaWx0ZXIpOwordm9pZCBUSU1fT0MxX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgVElNX09DX0luaXRUeXBlRGVmICpPQ19Db25maWcpOwordm9pZCBUSU1fT0MyX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgVElNX09DX0luaXRUeXBlRGVmICpPQ19Db25maWcpOwordm9pZCBUSU1fT0MzX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgVElNX09DX0luaXRUeXBlRGVmICpPQ19Db25maWcpOwordm9pZCBUSU1fT0M0X1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgVElNX09DX0luaXRUeXBlRGVmICpPQ19Db25maWcpOwordm9pZCBUSU1fRVRSX1NldENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDMyX3QgVElNX0V4dFRSR1ByZXNjYWxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVElNX0V4dFRSR1BvbGFyaXR5LCB1aW50MzJfdCBFeHRUUkdGaWx0ZXIpOwordm9pZCBUSU1fRE1BRGVsYXlQdWxzZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOwordm9pZCBUSU1fRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOwordm9pZCBUSU1fRE1BQ2FwdHVyZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOwordm9pZCBUSU1fQ0N4Q2hhbm5lbENtZChUSU1fVHlwZURlZiogVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgQ2hhbm5lbFN0YXRlKTsKKy8qKgorICAqIEB9CisgICovCisvKiBFbmQgb2YgcHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLyAKKyAgCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkYzeHhfSEFMX1RJTV9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2hhbF90aW1fZXguaCBiL0luYy9zdG0zMmYzeHhfaGFsX3RpbV9leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OGE0NjAKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2hhbF90aW1fZXguaApAQCAtMCwwICsxLDEyNDMgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX3RpbV9leC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBUSU0gSEFMIEV4dGVuZGVkIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0hBTF9USU1fRVhfSAorI2RlZmluZSBfX1NUTTMyRjN4eF9IQUxfVElNX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNRXgKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1FeF9FeHBvcnRlZF9UeXBlcyBUSU1FeCBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgVElNIEhhbGwgc2Vuc29yIENvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKworICB1aW50MzJfdCBJQzFQb2xhcml0eTsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgYWN0aXZlIGVkZ2Ugb2YgdGhlIGlucHV0IHNpZ25hbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9JbnB1dF9DYXB0dXJlX1BvbGFyaXR5ICovCisKKyAgdWludDMyX3QgSUMxUHJlc2NhbGVyOyAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgUHJlc2NhbGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0lucHV0X0NhcHR1cmVfUHJlc2NhbGVyICovCisKKyAgdWludDMyX3QgSUMxRmlsdGVyOyAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGlucHV0IGNhcHR1cmUgZmlsdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwIGFuZCBNYXhfRGF0YSA9IDB4RlUgKi8KKyAgdWludDMyX3QgQ29tbXV0YXRpb25fRGVsYXk7ICAvKiE8IFNwZWNpZmllcyB0aGUgcHVsc2UgdmFsdWUgdG8gYmUgbG9hZGVkIGludG8gdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3Rlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRlUgKi8KK30gVElNX0hhbGxTZW5zb3JfSW5pdFR5cGVEZWY7CisKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorLyoqCisgICogQGJyaWVmICBUSU0gTWFzdGVyIGNvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAbm90ZSAgIFNUTTMyRjM3M3hDIGFuZCBTVE0zMkYzNzh4eDogdGltZXIgaW5zdGFuY2VzIHByb3ZpZGUgYSBzaW5nbGUgVFJHTworICAqICAgICAgICAgb3V0cHV0CisgICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90ICBNYXN0ZXJPdXRwdXRUcmlnZ2VyOyAgIC8qITwgVHJpZ2dlciBvdXRwdXQgKFRSR08pIHNlbGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9NYXN0ZXJfTW9kZV9TZWxlY3Rpb24gKi8KKyAgdWludDMyX3QgIE1hc3RlclNsYXZlTW9kZTsgICAgICAgLyohPCBNYXN0ZXIvc2xhdmUgbW9kZSBzZWxlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTWFzdGVyX1NsYXZlX01vZGUgKi8KK31USU1fTWFzdGVyQ29uZmlnVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBUSU0gQnJlYWsgYW5kIERlYWQgdGltZSBjb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICogQG5vdGUgICBTVE0zMkYzNzN4QyBhbmQgU1RNMzJGMzc4eHg6IHNpbmdsZSBicmVhayBpbnB1dCB3aXRoIGNvbmZpZ3VyYWJsZSBwb2xhcml0eS4KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IE9mZlN0YXRlUnVuTW9kZTsgICAgICAgIC8qITwgVElNIG9mZiBzdGF0ZSBpbiBydW4gbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9PU1NSX09mZl9TdGF0ZV9TZWxlY3Rpb25fZm9yX1J1bl9tb2RlX3N0YXRlICovCisgIHVpbnQzMl90IE9mZlN0YXRlSURMRU1vZGU7ICAgICAgICAvKiE8IFRJTSBvZmYgc3RhdGUgaW4gSURMRSBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX09TU0lfT2ZmX1N0YXRlX1NlbGVjdGlvbl9mb3JfSWRsZV9tb2RlX3N0YXRlICovCisgIHVpbnQzMl90IExvY2tMZXZlbDsgICAgICAgICAgIC8qITwgVElNIExvY2sgbGV2ZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTG9ja19sZXZlbCAqLworICB1aW50MzJfdCBEZWFkVGltZTsgICAgICAgICAgIC8qITwgVElNIGRlYWQgVGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHhGRlUgKi8KKyAgdWludDMyX3QgQnJlYWtTdGF0ZTsgICAgICAgICAgIC8qITwgVElNIEJyZWFrIFN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0JyZWFrX0lucHV0X2VuYWJsZV9kaXNhYmxlICovCisgIHVpbnQzMl90IEJyZWFrUG9sYXJpdHk7ICAgICAgICAgICAgIC8qITwgVElNIEJyZWFrIGlucHV0IHBvbGFyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0JyZWFrX1BvbGFyaXR5ICovCisgIHVpbnQzMl90IEF1dG9tYXRpY091dHB1dDsgICAgICAgICAgIC8qITwgVElNIEF1dG9tYXRpYyBPdXRwdXQgRW5hYmxlIHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0FPRV9CaXRfU2V0X1Jlc2V0ICovCit9IFRJTV9CcmVha0RlYWRUaW1lQ29uZmlnVHlwZURlZjsKKworI2VuZGlmIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorLyoqCisgICogQGJyaWVmICBUSU0gQnJlYWsgaW5wdXQocykgYW5kIERlYWQgdGltZSBjb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICogQG5vdGUgICAyIGJyZWFrIGlucHV0cyBjYW4gYmUgY29uZmlndXJlZCAoQktJTiBhbmQgQktJTjIpIHdpdGggY29uZmlndXJhYmxlCisgICogICAgICAgIGZpbHRlciBhbmQgcG9sYXJpdHkuCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBPZmZTdGF0ZVJ1bk1vZGU7ICAgICAgICAvKiE8IFRJTSBvZmYgc3RhdGUgaW4gcnVuIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fT1NTUl9PZmZfU3RhdGVfU2VsZWN0aW9uX2Zvcl9SdW5fbW9kZV9zdGF0ZSAqLworICB1aW50MzJfdCBPZmZTdGF0ZUlETEVNb2RlOyAgICAgICAgLyohPCBUSU0gb2ZmIHN0YXRlIGluIElETEUgbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9PU1NJX09mZl9TdGF0ZV9TZWxlY3Rpb25fZm9yX0lkbGVfbW9kZV9zdGF0ZSAqLworICB1aW50MzJfdCBMb2NrTGV2ZWw7ICAgICAgICAgICAvKiE8IFRJTSBMb2NrIGxldmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xvY2tfbGV2ZWwgKi8KKyAgdWludDMyX3QgRGVhZFRpbWU7ICAgICAgICAgICAvKiE8IFRJTSBkZWFkIFRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZVICovCisgIHVpbnQzMl90IEJyZWFrU3RhdGU7ICAgICAgICAgICAvKiE8IFRJTSBCcmVhayBTdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9CcmVha19JbnB1dF9lbmFibGVfZGlzYWJsZSAqLworICB1aW50MzJfdCBCcmVha1BvbGFyaXR5OyAgICAgICAgICAgICAvKiE8IFRJTSBCcmVhayBpbnB1dCBwb2xhcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9CcmVha19Qb2xhcml0eSAqLworICB1aW50MzJfdCBCcmVha0ZpbHRlcjsgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgYnJlayBpbnB1dCBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwIGFuZCBNYXhfRGF0YSA9IDB4RlUgKi8KKyAgdWludDMyX3QgQnJlYWsyU3RhdGU7ICAgICAgICAgICAvKiE8IFRJTSBCcmVhazIgU3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1FeF9CcmVhazJfSW5wdXRfZW5hYmxlX2Rpc2FibGUgKi8KKyAgdWludDMyX3QgQnJlYWsyUG9sYXJpdHk7ICAgICAgICAgICAgLyohPCBUSU0gQnJlYWsyIGlucHV0IHBvbGFyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNRXhfQnJlYWsyX1BvbGFyaXR5ICovCisgIHVpbnQzMl90IEJyZWFrMkZpbHRlcjsgICAgICAgICAgICAgIC8qITwgVElNIGJyZWFrMiBpbnB1dCBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwIGFuZCBNYXhfRGF0YSA9IDB4RlUgKi8KKyAgdWludDMyX3QgQXV0b21hdGljT3V0cHV0OyAgICAgICAgICAgLyohPCBUSU0gQXV0b21hdGljIE91dHB1dCBFbmFibGUgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fQU9FX0JpdF9TZXRfUmVzZXQgKi8KK30gVElNX0JyZWFrRGVhZFRpbWVDb25maWdUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFRJTSBNYXN0ZXIgY29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqIEBub3RlICAgQWR2YW5jZWQgdGltZXJzIHByb3ZpZGUgVFJHTzIgaW50ZXJuYWwgbGluZSB3aGljaCBpcyByZWRpcmVjdGVkCisgICogICAgICAgICB0byB0aGUgQURDCisgICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90ICBNYXN0ZXJPdXRwdXRUcmlnZ2VyOyAgIC8qITwgVHJpZ2dlciBvdXRwdXQgKFRSR08pIHNlbGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9NYXN0ZXJfTW9kZV9TZWxlY3Rpb24gKi8KKyAgdWludDMyX3QgIE1hc3Rlck91dHB1dFRyaWdnZXIyOyAgLyohPCBUcmlnZ2VyIG91dHB1dDIgKFRSR08yKSBzZWxlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1FeF9NYXN0ZXJfTW9kZV9TZWxlY3Rpb25fMiAqLworICB1aW50MzJfdCAgTWFzdGVyU2xhdmVNb2RlOyAgICAgICAvKiE8IE1hc3Rlci9zbGF2ZSBtb2RlIHNlbGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9NYXN0ZXJfU2xhdmVfTW9kZSAqLworfVRJTV9NYXN0ZXJDb25maWdUeXBlRGVmOworI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1FeF9FeHBvcnRlZF9Db25zdGFudHMgVElNRXggRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisvKiogQGRlZmdyb3VwIFRJTUV4X0NoYW5uZWwgVElNRXggQ2hhbm5lbAorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9DSEFOTkVMXzEgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMFUpCisjZGVmaW5lIFRJTV9DSEFOTkVMXzIgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwNFUpCisjZGVmaW5lIFRJTV9DSEFOTkVMXzMgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwOFUpCisjZGVmaW5lIFRJTV9DSEFOTkVMXzQgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwQ1UpCisjZGVmaW5lIFRJTV9DSEFOTkVMX0FMTCAgICAgICAgICAgICAgICAgICAgKDB4MDAxOFUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTUV4X091dHB1dF9Db21wYXJlX2FuZF9QV01fbW9kZXMgVElNRXggT3V0cHV0IENvbXBhcmUgYW5kIFBXTSBNb2RlcworICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9PQ01PREVfVElNSU5HICAgICAgICAgICAgICAgICAgICgweDAwMDBVKQorI2RlZmluZSBUSU1fT0NNT0RFX0FDVElWRSAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVRJTV9DQ01SMV9PQzFNXzApCisjZGVmaW5lIFRJTV9PQ01PREVfSU5BQ1RJVkUgICAgICAgICAgICAgICAgICgodWludDMyX3QpVElNX0NDTVIxX09DMU1fMSkKKyNkZWZpbmUgVElNX09DTU9ERV9UT0dHTEUgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClUSU1fQ0NNUjFfT0MxTV8wIHwgVElNX0NDTVIxX09DMU1fMSkKKyNkZWZpbmUgVElNX09DTU9ERV9QV00xICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClUSU1fQ0NNUjFfT0MxTV8xIHwgVElNX0NDTVIxX09DMU1fMikKKyNkZWZpbmUgVElNX09DTU9ERV9QV00yICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClUSU1fQ0NNUjFfT0MxTSkKKyNkZWZpbmUgVElNX09DTU9ERV9GT1JDRURfQUNUSVZFICAgICAgICAgICAgKCh1aW50MzJfdClUSU1fQ0NNUjFfT0MxTV8wIHwgVElNX0NDTVIxX09DMU1fMikKKyNkZWZpbmUgVElNX09DTU9ERV9GT1JDRURfSU5BQ1RJVkUgICAgICAgICAgKCh1aW50MzJfdClUSU1fQ0NNUjFfT0MxTV8yKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1FeF9DbGVhcklucHV0X1NvdXJjZSBUSU1FeCBDbGVhciBJbnB1dCBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9FVFIgICAgICAgICAgICgweDAwMDFVKQorI2RlZmluZSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9OT05FICAgICAgICAgICgweDAwMDBVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1FeF9TbGF2ZV9Nb2RlIFRJTUV4IFNsYXZlIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fU0xBVkVNT0RFX0RJU0FCTEUgICAgICAgICAgICAgICAgKDB4MDAwMFUpCisjZGVmaW5lIFRJTV9TTEFWRU1PREVfUkVTRVQgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShUSU1fU01DUl9TTVNfMikpCisjZGVmaW5lIFRJTV9TTEFWRU1PREVfR0FURUQgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShUSU1fU01DUl9TTVNfMiB8IFRJTV9TTUNSX1NNU18wKSkKKyNkZWZpbmUgVElNX1NMQVZFTU9ERV9UUklHR0VSICAgICAgICAgICAgICAgICgodWludDMyX3QpKFRJTV9TTUNSX1NNU18yIHwgVElNX1NNQ1JfU01TXzEpKQorI2RlZmluZSBUSU1fU0xBVkVNT0RFX0VYVEVSTkFMMSAgICAgICAgICAgICAgKCh1aW50MzJfdCkoVElNX1NNQ1JfU01TXzIgfCBUSU1fU01DUl9TTVNfMSB8IFRJTV9TTUNSX1NNU18wKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNRXhfRXZlbnRfU291cmNlIFRJTUV4IEV2ZW50IFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9FVkVOVFNPVVJDRV9VUERBVEUgICAgICAgICAgICAgIFRJTV9FR1JfVUcgICAgIC8qITwgUmVpbml0aWFsaXplIHRoZSBjb3VudGVyIGFuZCBnZW5lcmF0ZXMgYW4gdXBkYXRlIG9mIHRoZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgVElNX0VWRU5UU09VUkNFX0NDMSAgICAgICAgICAgICAgICAgVElNX0VHUl9DQzFHICAgLyohPCBBIGNhcHR1cmUvY29tcGFyZSBldmVudCBpcyBnZW5lcmF0ZWQgb24gY2hhbm5lbCAxVSAqLworI2RlZmluZSBUSU1fRVZFTlRTT1VSQ0VfQ0MyICAgICAgICAgICAgICAgICBUSU1fRUdSX0NDMkcgICAvKiE8IEEgY2FwdHVyZS9jb21wYXJlIGV2ZW50IGlzIGdlbmVyYXRlZCBvbiBjaGFubmVsIDJVICovCisjZGVmaW5lIFRJTV9FVkVOVFNPVVJDRV9DQzMgICAgICAgICAgICAgICAgIFRJTV9FR1JfQ0MzRyAgIC8qITwgQSBjYXB0dXJlL2NvbXBhcmUgZXZlbnQgaXMgZ2VuZXJhdGVkIG9uIGNoYW5uZWwgM1UgKi8KKyNkZWZpbmUgVElNX0VWRU5UU09VUkNFX0NDNCAgICAgICAgICAgICAgICAgVElNX0VHUl9DQzRHICAgLyohPCBBIGNhcHR1cmUvY29tcGFyZSBldmVudCBpcyBnZW5lcmF0ZWQgb24gY2hhbm5lbCA0VSAqLworI2RlZmluZSBUSU1fRVZFTlRTT1VSQ0VfQ09NICAgICAgICAgICAgICAgICBUSU1fRUdSX0NPTUcgICAvKiE8IEEgY29tbXV0YXRpb24gZXZlbnQgaXMgZ2VuZXJhdGVkICovCisjZGVmaW5lIFRJTV9FVkVOVFNPVVJDRV9UUklHR0VSICAgICAgICAgICAgIFRJTV9FR1JfVEcgICAgIC8qITwgQSB0cmlnZ2VyIGV2ZW50IGlzIGdlbmVyYXRlZCAqLworI2RlZmluZSBUSU1fRVZFTlRTT1VSQ0VfQlJFQUsgICAgICAgICAgICAgICBUSU1fRUdSX0JHICAgICAvKiE8IEEgYnJlYWsgZXZlbnQgaXMgZ2VuZXJhdGVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTUV4X0RNQV9CYXNlX2FkZHJlc3MgVElNRXggRE1BIEJBc2UgQWRkcmVzcworICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9ETUFCQVNFX0NSMSAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBUSU1fRE1BQkFTRV9DUjIgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxVSkKKyNkZWZpbmUgVElNX0RNQUJBU0VfU01DUiAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMlUpCisjZGVmaW5lIFRJTV9ETUFCQVNFX0RJRVIgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDNVKQorI2RlZmluZSBUSU1fRE1BQkFTRV9TUiAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDA0VSkKKyNkZWZpbmUgVElNX0RNQUJBU0VfRUdSICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwNVUpCisjZGVmaW5lIFRJTV9ETUFCQVNFX0NDTVIxICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDZVKQorI2RlZmluZSBUSU1fRE1BQkFTRV9DQ01SMiAgICAgICAgICAgICAgICAgICgweDAwMDAwMDA3VSkKKyNkZWZpbmUgVElNX0RNQUJBU0VfQ0NFUiAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwOFUpCisjZGVmaW5lIFRJTV9ETUFCQVNFX0NOVCAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDlVKQorI2RlZmluZSBUSU1fRE1BQkFTRV9QU0MgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDBBVSkKKyNkZWZpbmUgVElNX0RNQUJBU0VfQVJSICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwQlUpCisjZGVmaW5lIFRJTV9ETUFCQVNFX1JDUiAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMENVKQorI2RlZmluZSBUSU1fRE1BQkFTRV9DQ1IxICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDBEVSkKKyNkZWZpbmUgVElNX0RNQUJBU0VfQ0NSMiAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwRVUpCisjZGVmaW5lIFRJTV9ETUFCQVNFX0NDUjMgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMEZVKQorI2RlZmluZSBUSU1fRE1BQkFTRV9DQ1I0ICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDEwVSkKKyNkZWZpbmUgVElNX0RNQUJBU0VfQkRUUiAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAxMVUpCisjZGVmaW5lIFRJTV9ETUFCQVNFX0RDUiAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMTJVKQorI2RlZmluZSBUSU1fRE1BQkFTRV9PUiAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDEzVSkKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisvKiogQGRlZmdyb3VwIFRJTUV4X0NoYW5uZWwgVElNRXggQ2hhbm5lbAorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9DSEFOTkVMXzEgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMFUpCisjZGVmaW5lIFRJTV9DSEFOTkVMXzIgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwNFUpCisjZGVmaW5lIFRJTV9DSEFOTkVMXzMgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwOFUpCisjZGVmaW5lIFRJTV9DSEFOTkVMXzQgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwQ1UpCisjZGVmaW5lIFRJTV9DSEFOTkVMXzUgICAgICAgICAgICAgICAgICAgICAgKDB4MDAxMFUpCisjZGVmaW5lIFRJTV9DSEFOTkVMXzYgICAgICAgICAgICAgICAgICAgICAgKDB4MDAxNFUpCisjZGVmaW5lIFRJTV9DSEFOTkVMX0FMTCAgICAgICAgICAgICAgICAgICAgKDB4MDAzQ1UpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTUV4X091dHB1dF9Db21wYXJlX2FuZF9QV01fbW9kZXMgVElNRXggT3V0cHV0IENvbXBhcmUgYW5kIFBXTSBNb2RlcworICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9PQ01PREVfVElNSU5HICAgICAgICAgICAgICAgICAgICgweDAwMDBVKQorI2RlZmluZSBUSU1fT0NNT0RFX0FDVElWRSAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVRJTV9DQ01SMV9PQzFNXzApCisjZGVmaW5lIFRJTV9PQ01PREVfSU5BQ1RJVkUgICAgICAgICAgICAgICAgICgodWludDMyX3QpVElNX0NDTVIxX09DMU1fMSkKKyNkZWZpbmUgVElNX09DTU9ERV9UT0dHTEUgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClUSU1fQ0NNUjFfT0MxTV8xIHwgVElNX0NDTVIxX09DMU1fMCkKKyNkZWZpbmUgVElNX09DTU9ERV9QV00xICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClUSU1fQ0NNUjFfT0MxTV8yIHwgVElNX0NDTVIxX09DMU1fMSkKKyNkZWZpbmUgVElNX09DTU9ERV9QV00yICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClUSU1fQ0NNUjFfT0MxTV8yIHwgVElNX0NDTVIxX09DMU1fMSB8IFRJTV9DQ01SMV9PQzFNXzApCisjZGVmaW5lIFRJTV9PQ01PREVfRk9SQ0VEX0FDVElWRSAgICAgICAgICAgICgodWludDMyX3QpVElNX0NDTVIxX09DMU1fMiB8IFRJTV9DQ01SMV9PQzFNXzApCisjZGVmaW5lIFRJTV9PQ01PREVfRk9SQ0VEX0lOQUNUSVZFICAgICAgICAgICgodWludDMyX3QpVElNX0NDTVIxX09DMU1fMikKKworI2RlZmluZSBUSU1fT0NNT0RFX1JFVFJJR0VSUkFCTEVfT1BNMSAgICAgICgodWludDMyX3QpVElNX0NDTVIxX09DMU1fMykKKyNkZWZpbmUgVElNX09DTU9ERV9SRVRSSUdFUlJBQkxFX09QTTIgICAgICAoKHVpbnQzMl90KVRJTV9DQ01SMV9PQzFNXzMgfCBUSU1fQ0NNUjFfT0MxTV8wKQorI2RlZmluZSBUSU1fT0NNT0RFX0NPTUJJTkVEX1BXTTEgICAgICAgICAgICgodWludDMyX3QpVElNX0NDTVIxX09DMU1fMyB8IFRJTV9DQ01SMV9PQzFNXzIpCisjZGVmaW5lIFRJTV9PQ01PREVfQ09NQklORURfUFdNMiAgICAgICAgICAgKCh1aW50MzJfdClUSU1fQ0NNUjFfT0MxTV8zIHwgVElNX0NDTVIxX09DMU1fMCB8IFRJTV9DQ01SMV9PQzFNXzIpCisjZGVmaW5lIFRJTV9PQ01PREVfQVNTWU1FVFJJQ19QV00xICAgICAgICAgKCh1aW50MzJfdClUSU1fQ0NNUjFfT0MxTV8zIHwgVElNX0NDTVIxX09DMU1fMSB8IFRJTV9DQ01SMV9PQzFNXzIpCisjZGVmaW5lIFRJTV9PQ01PREVfQVNTWU1FVFJJQ19QV00yICAgICAgICAgKCh1aW50MzJfdClUSU1fQ0NNUjFfT0MxTV8zIHwgVElNX0NDTVIxX09DMU0pCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNRXhfQ2xlYXJJbnB1dF9Tb3VyY2UgVElNRXggQ2xlYXIgSW5wdXQgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0NMRUFSSU5QVVRTT1VSQ0VfRVRSICAgICAgICAgICAgKDB4MDAwMVUpCisjZGVmaW5lIFRJTV9DTEVBUklOUFVUU09VUkNFX09DUkVGQ0xSICAgICAgICgweDAwMDJVKQorI2RlZmluZSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9OT05FICAgICAgICAgICAoMHgwMDAwVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNRXhfQnJlYWsyX0lucHV0X2VuYWJsZV9kaXNhYmxlICBUSU1FWCBCcmVhayBpbnB1dCAyIEVuYWJsZQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9CUkVBSzJfRElTQUJMRSAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgVElNX0JSRUFLMl9FTkFCTEUgICAgICAgICAgKCh1aW50MzJfdClUSU1fQkRUUl9CSzJFKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1FeF9CcmVhazJfUG9sYXJpdHkgVElNRXggQnJlYWsgSW5wdXQgMiBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9CUkVBSzJQT0xBUklUWV9MT1cgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgVElNX0JSRUFLMlBPTEFSSVRZX0hJR0ggICAgICAgKCh1aW50MzJfdClUSU1fQkRUUl9CSzJQKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1FeF9NYXN0ZXJfTW9kZV9TZWxlY3Rpb25fMiBUSU1FeCBNYXN0ZXIgTW9kZSBTZWxlY3Rpb24gMiAoVFJHTzIpCisgICogQHsKKyAgKi8KKyNkZWZpbmUgIFRJTV9UUkdPMl9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSAgVElNX1RSR08yX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShUSU1fQ1IyX01NUzJfMCkpCisjZGVmaW5lICBUSU1fVFJHTzJfVVBEQVRFICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpKFRJTV9DUjJfTU1TMl8xKSkKKyNkZWZpbmUgIFRJTV9UUkdPMl9PQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoVElNX0NSMl9NTVMyXzEgfCBUSU1fQ1IyX01NUzJfMCkpCisjZGVmaW5lICBUSU1fVFJHTzJfT0MxUkVGICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpKFRJTV9DUjJfTU1TMl8yKSkKKyNkZWZpbmUgIFRJTV9UUkdPMl9PQzJSRUYgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoVElNX0NSMl9NTVMyXzIgfCBUSU1fQ1IyX01NUzJfMCkpCisjZGVmaW5lICBUSU1fVFJHTzJfT0MzUkVGICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpKFRJTV9DUjJfTU1TMl8yIHwgVElNX0NSMl9NTVMyXzEpKQorI2RlZmluZSAgVElNX1RSR08yX09DNFJFRiAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShUSU1fQ1IyX01NUzJfMiB8IFRJTV9DUjJfTU1TMl8xIHwgVElNX0NSMl9NTVMyXzApKQorI2RlZmluZSAgVElNX1RSR08yX09DNVJFRiAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShUSU1fQ1IyX01NUzJfMykpCisjZGVmaW5lICBUSU1fVFJHTzJfT0M2UkVGICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpKFRJTV9DUjJfTU1TMl8zIHwgVElNX0NSMl9NTVMyXzApKQorI2RlZmluZSAgVElNX1RSR08yX09DNFJFRl9SSVNJTkdGQUxMSU5HICAgICAgICAgICAoKHVpbnQzMl90KShUSU1fQ1IyX01NUzJfMyB8IFRJTV9DUjJfTU1TMl8xKSkKKyNkZWZpbmUgIFRJTV9UUkdPMl9PQzZSRUZfUklTSU5HRkFMTElORyAgICAgICAgICAgKCh1aW50MzJfdCkoVElNX0NSMl9NTVMyXzMgfCBUSU1fQ1IyX01NUzJfMSB8IFRJTV9DUjJfTU1TMl8wKSkKKyNkZWZpbmUgIFRJTV9UUkdPMl9PQzRSRUZfUklTSU5HX09DNlJFRl9SSVNJTkcgICAgKCh1aW50MzJfdCkoVElNX0NSMl9NTVMyXzMgfCBUSU1fQ1IyX01NUzJfMikpCisjZGVmaW5lICBUSU1fVFJHTzJfT0M0UkVGX1JJU0lOR19PQzZSRUZfRkFMTElORyAgICgodWludDMyX3QpKFRJTV9DUjJfTU1TMl8zIHwgVElNX0NSMl9NTVMyXzIgfCBUSU1fQ1IyX01NUzJfMCkpCisjZGVmaW5lICBUSU1fVFJHTzJfT0M1UkVGX1JJU0lOR19PQzZSRUZfUklTSU5HICAgICgodWludDMyX3QpKFRJTV9DUjJfTU1TMl8zIHwgVElNX0NSMl9NTVMyXzIgfFRJTV9DUjJfTU1TMl8xKSkKKyNkZWZpbmUgIFRJTV9UUkdPMl9PQzVSRUZfUklTSU5HX09DNlJFRl9GQUxMSU5HICAgKCh1aW50MzJfdCkoVElNX0NSMl9NTVMyXzMgfCBUSU1fQ1IyX01NUzJfMiB8IFRJTV9DUjJfTU1TMl8xIHwgVElNX0NSMl9NTVMyXzApKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1FeF9TbGF2ZV9Nb2RlIFRJTUV4IFNsYXZlIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fU0xBVkVNT0RFX0RJU0FCTEUgICAgICAgICAgICAgICAgKDB4MDAwMFUpCisjZGVmaW5lIFRJTV9TTEFWRU1PREVfUkVTRVQgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShUSU1fU01DUl9TTVNfMikpCisjZGVmaW5lIFRJTV9TTEFWRU1PREVfR0FURUQgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShUSU1fU01DUl9TTVNfMiB8IFRJTV9TTUNSX1NNU18wKSkKKyNkZWZpbmUgVElNX1NMQVZFTU9ERV9UUklHR0VSICAgICAgICAgICAgICAgICgodWludDMyX3QpKFRJTV9TTUNSX1NNU18yIHwgVElNX1NNQ1JfU01TXzEpKQorI2RlZmluZSBUSU1fU0xBVkVNT0RFX0VYVEVSTkFMMSAgICAgICAgICAgICAgKCh1aW50MzJfdCkoVElNX1NNQ1JfU01TXzIgfCBUSU1fU01DUl9TTVNfMSB8IFRJTV9TTUNSX1NNU18wKSkKKyNkZWZpbmUgVElNX1NMQVZFTU9ERV9DT01CSU5FRF9SRVNFVFRSSUdHRVIgICgodWludDMyX3QpKFRJTV9TTUNSX1NNU18zKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0V2ZW50X1NvdXJjZSBUSU1FeCBFdmVudCBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fRVZFTlRTT1VSQ0VfVVBEQVRFICAgICAgICAgICAgICBUSU1fRUdSX1VHICAgICAvKiE8IFJlaW5pdGlhbGl6ZSB0aGUgY291bnRlciBhbmQgZ2VuZXJhdGVzIGFuIHVwZGF0ZSBvZiB0aGUgcmVnaXN0ZXJzICovCisjZGVmaW5lIFRJTV9FVkVOVFNPVVJDRV9DQzEgICAgICAgICAgICAgICAgIFRJTV9FR1JfQ0MxRyAgIC8qITwgQSBjYXB0dXJlL2NvbXBhcmUgZXZlbnQgaXMgZ2VuZXJhdGVkIG9uIGNoYW5uZWwgMVUgKi8KKyNkZWZpbmUgVElNX0VWRU5UU09VUkNFX0NDMiAgICAgICAgICAgICAgICAgVElNX0VHUl9DQzJHICAgLyohPCBBIGNhcHR1cmUvY29tcGFyZSBldmVudCBpcyBnZW5lcmF0ZWQgb24gY2hhbm5lbCAyVSAqLworI2RlZmluZSBUSU1fRVZFTlRTT1VSQ0VfQ0MzICAgICAgICAgICAgICAgICBUSU1fRUdSX0NDM0cgICAvKiE8IEEgY2FwdHVyZS9jb21wYXJlIGV2ZW50IGlzIGdlbmVyYXRlZCBvbiBjaGFubmVsIDNVICovCisjZGVmaW5lIFRJTV9FVkVOVFNPVVJDRV9DQzQgICAgICAgICAgICAgICAgIFRJTV9FR1JfQ0M0RyAgIC8qITwgQSBjYXB0dXJlL2NvbXBhcmUgZXZlbnQgaXMgZ2VuZXJhdGVkIG9uIGNoYW5uZWwgNFUgKi8KKyNkZWZpbmUgVElNX0VWRU5UU09VUkNFX0NPTSAgICAgICAgICAgICAgICAgVElNX0VHUl9DT01HICAgLyohPCBBIGNvbW11dGF0aW9uIGV2ZW50IGlzIGdlbmVyYXRlZCAqLworI2RlZmluZSBUSU1fRVZFTlRTT1VSQ0VfVFJJR0dFUiAgICAgICAgICAgICBUSU1fRUdSX1RHICAgICAvKiE8IEEgdHJpZ2dlciBldmVudCBpcyBnZW5lcmF0ZWQgKi8KKyNkZWZpbmUgVElNX0VWRU5UU09VUkNFX0JSRUFLICAgICAgICAgICAgICAgVElNX0VHUl9CRyAgICAgLyohPCBBIGJyZWFrIGV2ZW50IGlzIGdlbmVyYXRlZCAqLworI2RlZmluZSBUSU1fRVZFTlRTT1VSQ0VfQlJFQUsyICAgICAgICAgICAgICBUSU1fRUdSX0IyRyAgICAvKiE8IEEgYnJlYWsgMiBldmVudCBpcyBnZW5lcmF0ZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0RNQV9CYXNlX2FkZHJlc3MgVElNRXggRE1BIEJhc2UgQWRkcmVzcworICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9ETUFCQVNFX0NSMSAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBUSU1fRE1BQkFTRV9DUjIgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxVSkKKyNkZWZpbmUgVElNX0RNQUJBU0VfU01DUiAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMlUpCisjZGVmaW5lIFRJTV9ETUFCQVNFX0RJRVIgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDNVKQorI2RlZmluZSBUSU1fRE1BQkFTRV9TUiAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDA0VSkKKyNkZWZpbmUgVElNX0RNQUJBU0VfRUdSICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwNVUpCisjZGVmaW5lIFRJTV9ETUFCQVNFX0NDTVIxICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDZVKQorI2RlZmluZSBUSU1fRE1BQkFTRV9DQ01SMiAgICAgICAgICAgICAgICAgICgweDAwMDAwMDA3VSkKKyNkZWZpbmUgVElNX0RNQUJBU0VfQ0NFUiAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwOFUpCisjZGVmaW5lIFRJTV9ETUFCQVNFX0NOVCAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDlVKQorI2RlZmluZSBUSU1fRE1BQkFTRV9QU0MgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDBBVSkKKyNkZWZpbmUgVElNX0RNQUJBU0VfQVJSICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwQlUpCisjZGVmaW5lIFRJTV9ETUFCQVNFX1JDUiAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMENVKQorI2RlZmluZSBUSU1fRE1BQkFTRV9DQ1IxICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDBEVSkKKyNkZWZpbmUgVElNX0RNQUJBU0VfQ0NSMiAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwRVUpCisjZGVmaW5lIFRJTV9ETUFCQVNFX0NDUjMgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMEZVKQorI2RlZmluZSBUSU1fRE1BQkFTRV9DQ1I0ICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDEwVSkKKyNkZWZpbmUgVElNX0RNQUJBU0VfQkRUUiAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAxMVUpCisjZGVmaW5lIFRJTV9ETUFCQVNFX0RDUiAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMTJVKQorI2RlZmluZSBUSU1fRE1BQkFTRV9DQ01SMyAgICAgICAgICAgICAgICAgICgweDAwMDAwMDE1VSkKKyNkZWZpbmUgVElNX0RNQUJBU0VfQ0NSNSAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAxNlUpCisjZGVmaW5lIFRJTV9ETUFCQVNFX0NDUjYgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMTdVKQorI2RlZmluZSBUSU1fRE1BQkFTRV9PUiAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDE4VSkKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisvKiogQGRlZmdyb3VwIFRJTUV4X1JlbWFwIFRJTUV4IFJlbWFwcGluZworICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9USU0xX0FEQzFfTk9ORSAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgLyohPCBUSU0xX0VUUiBpcyBub3QgY29ubmVjdGVkIHRvIGFueSBBV0QgKGFuYWxvZyB3YXRjaGRvZykqLworI2RlZmluZSBUSU1fVElNMV9BREMxX0FXRDEgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMVUpIC8qITwgVElNMV9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzEgQVdEMSAqLworI2RlZmluZSBUSU1fVElNMV9BREMxX0FXRDIgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMlUpIC8qITwgVElNMV9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzEgQVdEMiAqLworI2RlZmluZSBUSU1fVElNMV9BREMxX0FXRDMgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwM1UpIC8qITwgVElNMV9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzEgQVdEMyAqLworI2RlZmluZSBUSU1fVElNMTZfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpIC8qITwgVElNMTYgVEkxIGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjZGVmaW5lIFRJTV9USU0xNl9SVEMgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxVSkgLyohPCBUSU0xNiBUSTEgaXMgY29ubmVjdGVkIHRvIFJUQ19jbG9jayAqLworI2RlZmluZSBUSU1fVElNMTZfSFNFICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMlUpIC8qITwgVElNMTYgVEkxIGlzIGNvbm5lY3RlZCB0byBIU0UvMzJVICovCisjZGVmaW5lIFRJTV9USU0xNl9NQ08gICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAzVSkgLyohPCBUSU0xNiBUSTEgaXMgY29ubmVjdGVkIHRvIE1DTyAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCB8fCAqLworCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMzNHg4KQorLyoqIEBkZWZncm91cCBUSU1FeF9SZW1hcCBUSU1FeCBSZW1hcHBpbmcgMQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9USU0xX0FEQzFfTk9ORSAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgLyohPCBUSU0xX0VUUiBpcyBub3QgY29ubmVjdGVkIHRvIGFueSBBV0QgKGFuYWxvZyB3YXRjaGRvZykqLworI2RlZmluZSBUSU1fVElNMV9BREMxX0FXRDEgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMVUpIC8qITwgVElNMV9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzEgQVdEMSAqLworI2RlZmluZSBUSU1fVElNMV9BREMxX0FXRDIgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMlUpIC8qITwgVElNMV9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzEgQVdEMiAqLworI2RlZmluZSBUSU1fVElNMV9BREMxX0FXRDMgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwM1UpIC8qITwgVElNMV9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzEgQVdEMyAqLworI2RlZmluZSBUSU1fVElNMTZfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpIC8qITwgVElNMTYgVEkxIGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjZGVmaW5lIFRJTV9USU0xNl9SVEMgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxVSkgLyohPCBUSU0xNiBUSTEgaXMgY29ubmVjdGVkIHRvIFJUQ19jbG9jayAqLworI2RlZmluZSBUSU1fVElNMTZfSFNFICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMlUpIC8qITwgVElNMTYgVEkxIGlzIGNvbm5lY3RlZCB0byBIU0UvMzJVICovCisjZGVmaW5lIFRJTV9USU0xNl9NQ08gICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAzVSkgLyohPCBUSU0xNiBUSTEgaXMgY29ubmVjdGVkIHRvIE1DTyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1FeF9SZW1hcDIgVElNRXggUmVtYXBwaW5nIDIKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fVElNMV9BREMyX05PTkUgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpIC8qITwgVElNMV9FVFIgaXMgbm90IGNvbm5lY3RlZCB0byBhbnkgQVdEIChhbmFsb2cgd2F0Y2hkb2cpKi8KKyNkZWZpbmUgVElNX1RJTTFfQURDMl9BV0QxICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDRVKSAvKiE8IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREMyIEFXRDEgKi8KKyNkZWZpbmUgVElNX1RJTTFfQURDMl9BV0QyICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDhVKSAvKiE8IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREMyIEFXRDIgKi8KKyNkZWZpbmUgVElNX1RJTTFfQURDMl9BV0QzICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMENVKSAvKiE8IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREMyIEFXRDMgKi8KKyNkZWZpbmUgVElNX1RJTTE2X05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAvKiE8IE5vbiBzaWduaWZpY2FudCB2YWx1ZSBmb3IgVElNMTZVICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFNUTTMyRjMzNHg4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorLyoqIEBkZWZncm91cCBUSU1FeF9SZW1hcCBUSU1FeCBSZW1hcHBpbmcgMQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9USU0xX0FEQzFfTk9ORSAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgLyohPCBUSU0xX0VUUiBpcyBub3QgY29ubmVjdGVkIHRvIGFueSBBV0QgKGFuYWxvZyB3YXRjaGRvZykqLworI2RlZmluZSBUSU1fVElNMV9BREMxX0FXRDEgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMVUpIC8qITwgVElNMV9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzEgQVdEMSAqLworI2RlZmluZSBUSU1fVElNMV9BREMxX0FXRDIgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMlUpIC8qITwgVElNMV9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzEgQVdEMiAqLworI2RlZmluZSBUSU1fVElNMV9BREMxX0FXRDMgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwM1UpIC8qITwgVElNMV9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzEgQVdEMyAqLworI2RlZmluZSBUSU1fVElNOF9BREMyX05PTkUgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpIC8qITwgVElNOF9FVFIgaXMgbm90IGNvbm5lY3RlZCB0byBhbnkgQVdEIChhbmFsb2cgd2F0Y2hkb2cpICovCisjZGVmaW5lIFRJTV9USU04X0FEQzJfQVdEMSAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxVSkgLyohPCBUSU04X0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDMiBBV0QxICovCisjZGVmaW5lIFRJTV9USU04X0FEQzJfQVdEMiAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAyVSkgLyohPCBUSU04X0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDMiBBV0QyICovCisjZGVmaW5lIFRJTV9USU04X0FEQzJfQVdEMyAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAzVSkgLyohPCBUSU04X0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDMiBBV0QzICovCisjZGVmaW5lIFRJTV9USU0xNl9HUElPICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgLyohPCBUSU0xNiBUSTEgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8KKyNkZWZpbmUgVElNX1RJTTE2X1JUQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDFVKSAvKiE8IFRJTTE2IFRJMSBpcyBjb25uZWN0ZWQgdG8gUlRDX2Nsb2NrICovCisjZGVmaW5lIFRJTV9USU0xNl9IU0UgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAyVSkgLyohPCBUSU0xNiBUSTEgaXMgY29ubmVjdGVkIHRvIEhTRS8zMlUgKi8KKyNkZWZpbmUgVElNX1RJTTE2X01DTyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDNVKSAvKiE8IFRJTTE2IFRJMSBpcyBjb25uZWN0ZWQgdG8gTUNPICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTUV4X1JlbWFwMiBUSU1FeCBSZW1hcHBpbmcgMgorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9USU0xX0FEQzRfTk9ORSAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgLyohPCBUSU0xX0VUUiBpcyBub3QgY29ubmVjdGVkIHRvIGFueSBBV0QgKGFuYWxvZyB3YXRjaGRvZykqLworI2RlZmluZSBUSU1fVElNMV9BREM0X0FXRDEgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwNFUpIC8qITwgVElNMV9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzQgQVdEMSAqLworI2RlZmluZSBUSU1fVElNMV9BREM0X0FXRDIgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwOFUpIC8qITwgVElNMV9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzQgQVdEMiAqLworI2RlZmluZSBUSU1fVElNMV9BREM0X0FXRDMgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwQ1UpIC8qITwgVElNMV9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzQgQVdEMyAqLworI2RlZmluZSBUSU1fVElNOF9BREMzX05PTkUgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpIC8qITwgVElNOF9FVFIgaXMgbm90IGNvbm5lY3RlZCB0byBhbnkgQVdEIChhbmFsb2cgd2F0Y2hkb2cpICovCisjZGVmaW5lIFRJTV9USU04X0FEQzNfQVdEMSAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDA0VSkgLyohPCBUSU04X0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDMyBBV0QxICovCisjZGVmaW5lIFRJTV9USU04X0FEQzNfQVdEMiAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDA4VSkgLyohPCBUSU04X0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDMyBBV0QyICovCisjZGVmaW5lIFRJTV9USU04X0FEQzNfQVdEMyAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDBDVSkgLyohPCBUSU04X0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDMyBBV0QzICovCisjZGVmaW5lIFRJTV9USU0xNl9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgLyohPCBOb24gc2lnbmlmaWNhbnQgdmFsdWUgZm9yIFRJTTE2VSAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkKKy8qKiBAZGVmZ3JvdXAgVElNRXhfUmVtYXAgVElNRXggUmVtYXBwaW5nIDEKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fVElNMV9BREMxX05PTkUgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpIC8qITwgVElNMV9FVFIgaXMgbm90IGNvbm5lY3RlZCB0byBhbnkgQVdEIChhbmFsb2cgd2F0Y2hkb2cpKi8KKyNkZWZpbmUgVElNX1RJTTFfQURDMV9BV0QxICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDFVKSAvKiE8IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREMxIEFXRDEgKi8KKyNkZWZpbmUgVElNX1RJTTFfQURDMV9BV0QyICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDJVKSAvKiE8IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREMxIEFXRDIgKi8KKyNkZWZpbmUgVElNX1RJTTFfQURDMV9BV0QzICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDNVKSAvKiE8IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREMxIEFXRDMgKi8KKyNkZWZpbmUgVElNX1RJTThfQURDMl9OT05FICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAvKiE8IFRJTThfRVRSIGlzIG5vdCBjb25uZWN0ZWQgdG8gYW55IEFXRCAoYW5hbG9nIHdhdGNoZG9nKSAqLworI2RlZmluZSBUSU1fVElNOF9BREMyX0FXRDEgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMVUpIC8qITwgVElNOF9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzIgQVdEMSAqLworI2RlZmluZSBUSU1fVElNOF9BREMyX0FXRDIgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMlUpIC8qITwgVElNOF9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzIgQVdEMiAqLworI2RlZmluZSBUSU1fVElNOF9BREMyX0FXRDMgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwM1UpIC8qITwgVElNOF9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzIgQVdEMyAqLworI2RlZmluZSBUSU1fVElNMTZfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpIC8qITwgVElNMTYgVEkxIGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjZGVmaW5lIFRJTV9USU0xNl9SVEMgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxVSkgLyohPCBUSU0xNiBUSTEgaXMgY29ubmVjdGVkIHRvIFJUQ19jbG9jayAqLworI2RlZmluZSBUSU1fVElNMTZfSFNFICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMlUpIC8qITwgVElNMTYgVEkxIGlzIGNvbm5lY3RlZCB0byBIU0UvMzJVICovCisjZGVmaW5lIFRJTV9USU0xNl9NQ08gICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAzVSkgLyohPCBUSU0xNiBUSTEgaXMgY29ubmVjdGVkIHRvIE1DTyAqLworI2RlZmluZSBUSU1fVElNMjBfQURDM19OT05FICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpIC8qITwgVElNMjBfRVRSIGlzIG5vdCBjb25uZWN0ZWQgdG8gYW55IEFXRCAoYW5hbG9nIHdhdGNoZG9nKSAqLworI2RlZmluZSBUSU1fVElNMjBfQURDM19BV0QxICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMVUpIC8qITwgVElNMjBfRVRSIGlzIGNvbm5lY3RlZCB0byBBREMzIEFXRDEgKi8KKyNkZWZpbmUgVElNX1RJTTIwX0FEQzNfQVdEMiAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDJVKSAvKiE8IFRJTTIwX0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDMyBBV0QyICovCisjZGVmaW5lIFRJTV9USU0yMF9BREMzX0FXRDMgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAzVSkgLyohPCBUSU0yMF9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzMgQVdEMyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1FeF9SZW1hcDIgVElNRXggUmVtYXBwaW5nIDIKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fVElNMV9BREM0X05PTkUgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpIC8qITwgVElNMV9FVFIgaXMgbm90IGNvbm5lY3RlZCB0byBhbnkgQVdEIChhbmFsb2cgd2F0Y2hkb2cpKi8KKyNkZWZpbmUgVElNX1RJTTFfQURDNF9BV0QxICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDRVKSAvKiE8IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREM0IEFXRDEgKi8KKyNkZWZpbmUgVElNX1RJTTFfQURDNF9BV0QyICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDhVKSAvKiE8IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREM0IEFXRDIgKi8KKyNkZWZpbmUgVElNX1RJTTFfQURDNF9BV0QzICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMENVKSAvKiE8IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREM0IEFXRDMgKi8KKyNkZWZpbmUgVElNX1RJTThfQURDM19OT05FICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAvKiE8IFRJTThfRVRSIGlzIG5vdCBjb25uZWN0ZWQgdG8gYW55IEFXRCAoYW5hbG9nIHdhdGNoZG9nKSAqLworI2RlZmluZSBUSU1fVElNOF9BREMzX0FXRDEgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwNFUpIC8qITwgVElNOF9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzMgQVdEMSAqLworI2RlZmluZSBUSU1fVElNOF9BREMzX0FXRDIgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwOFUpIC8qITwgVElNOF9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzMgQVdEMiAqLworI2RlZmluZSBUSU1fVElNOF9BREMzX0FXRDMgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwQ1UpIC8qITwgVElNOF9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzMgQVdEMyAqLworI2RlZmluZSBUSU1fVElNMTZfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpIC8qITwgTm9uIHNpZ25pZmljYW50IHZhbHVlIGZvciBUSU0xNlUgKi8KKyNkZWZpbmUgVElNX1RJTTIwX0FEQzRfTk9ORSAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAvKiE8IFRJTTIwX0VUUiBpcyBub3QgY29ubmVjdGVkIHRvIGFueSBBV0QgKGFuYWxvZyB3YXRjaGRvZykgKi8KKyNkZWZpbmUgVElNX1RJTTIwX0FEQzRfQVdEMSAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDRVKSAvKiE8IFRJTTIwX0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDNCBBV0QxICovCisjZGVmaW5lIFRJTV9USU0yMF9BREM0X0FXRDIgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDA4VSkgLyohPCBUSU0yMF9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzQgQVdEMiAqLworI2RlZmluZSBUSU1fVElNMjBfQURDNF9BV0QzICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwQ1UpIC8qITwgVElNMjBfRVRSIGlzIGNvbm5lY3RlZCB0byBBREM0IEFXRDMgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggKi8KKworCisjaWYgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKy8qKiBAZGVmZ3JvdXAgVElNRXhfUmVtYXAgVElNRXggcmVtYXBwaW5nCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX1RJTTJfVElNOF9UUkdPICAgICAgKDB4MDAwMDAwMDBVKSAgLyohPCBUSU04IFRSR09VVCBpcyBjb25uZWN0ZWQgdG8gVElNMl9JVFIxICovCisjZGVmaW5lIFRJTV9USU0yX0VUSF9QVFAgICAgICAgICgweDAwMDAwNDAwVSkgIC8qITwgUFRQIHRyaWdnZXIgb3V0cHV0IGlzIGNvbm5lY3RlZCB0byBUSU0yX0lUUjEgKi8KKyNkZWZpbmUgVElNX1RJTTJfVVNCRlNfU09GICAgICAgKDB4MDAwMDA4MDBVKSAgLyohPCBPVEcgRlMgU09GIGlzIGNvbm5lY3RlZCB0byB0aGUgVElNMl9JVFIxIGlucHV0ICovCisjZGVmaW5lIFRJTV9USU0yX1VTQkhTX1NPRiAgICAgICgweDAwMDAwQzAwVSkgIC8qITwgT1RHIEhTIFNPRiBpcyBjb25uZWN0ZWQgdG8gdGhlIFRJTTJfSVRSMSBpbnB1dCAqLworI2RlZmluZSBUSU1fVElNMTRfR1BJTyAgICAgICAgICAoMHgwMDAwMDAwMFUpIC8qITwgVElNMTQgVEkxIGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjZGVmaW5lIFRJTV9USU0xNF9SVEMgICAgICAgICAgICgweDAwMDAwMDAxVSkgLyohPCBUSU0xNCBUSTEgaXMgY29ubmVjdGVkIHRvIFJUQ19jbG9jayAqLworI2RlZmluZSBUSU1fVElNMTRfSFNFICAgICAgICAgICAoMHgwMDAwMDAwMlUpIC8qITwgVElNMTQgVEkxIGlzIGNvbm5lY3RlZCB0byBIU0UvMzJVICovCisjZGVmaW5lIFRJTV9USU0xNF9NQ08gICAgICAgICAgICgweDAwMDAwMDAzVSkgLyohPCBUSU0xNCBUSTEgaXMgY29ubmVjdGVkIHRvIE1DTyAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKy8qKiBAZGVmZ3JvdXAgVElNRXhfR3JvdXBfQ2hhbm5lbDUgR3JvdXAgQ2hhbm5lbCA1IGFuZCBDaGFubmVsIDFVLCAyIG9yIDMKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fR1JPVVBDSDVfTk9ORSAgICAgICAweDAwMDAwMDAwICAvKiE8IE5vIGVmZmVjdCBvZiBPQzVSRUYgb24gT0MxUkVGQywgT0MyUkVGQyBhbmQgT0MzUkVGQyAqLworI2RlZmluZSBUSU1fR1JPVVBDSDVfT0MxUkVGQyAgICAoVElNX0NDUjVfR0M1QzEpICAgICAgLyohPCBPQzFSRUZDIGlzIHRoZSBsb2dpY2FsIEFORCBvZiBPQzFSRUZDIGFuZCBPQzVSRUYgKi8KKyNkZWZpbmUgVElNX0dST1VQQ0g1X09DMlJFRkMgICAgKFRJTV9DQ1I1X0dDNUMyKSAgICAgIC8qITwgT0MyUkVGQyBpcyB0aGUgbG9naWNhbCBBTkQgb2YgT0MyUkVGQyBhbmQgT0M1UkVGICovCisjZGVmaW5lIFRJTV9HUk9VUENINV9PQzNSRUZDICAgIChUSU1fQ0NSNV9HQzVDMykgICAgICAgLyohPCBPQzNSRUZDIGlzIHRoZSBsb2dpY2FsIEFORCBvZiBPQzNSRUZDIGFuZCBPQzVSRUYgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggICAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBQcml2YXRlIE1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFRJTV9Qcml2YXRlX01hY3JvcyBUSU0gUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgSVNfVElNX0NIQU5ORUxTKENIQU5ORUwpICgoKENIQU5ORUwpID09IFRJTV9DSEFOTkVMXzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IFRJTV9DSEFOTkVMXzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IFRJTV9DSEFOTkVMXzMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IFRJTV9DSEFOTkVMXzQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IFRJTV9DSEFOTkVMX0FMTCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgSVNfVElNX09QTV9DSEFOTkVMUyhDSEFOTkVMKSAoKChDSEFOTkVMKSA9PSBUSU1fQ0hBTk5FTF8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gVElNX0NIQU5ORUxfMikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyNkZWZpbmUgSVNfVElNX0NPTVBMRU1FTlRBUllfQ0hBTk5FTFMoQ0hBTk5FTCkgKCgoQ0hBTk5FTCkgPT0gVElNX0NIQU5ORUxfMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBUSU1fQ0hBTk5FTF8yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IFRJTV9DSEFOTkVMXzMpKQorCisjZGVmaW5lIElTX1RJTV9QV01fTU9ERShNT0RFKSAoKChNT0RFKSA9PSBUSU1fT0NNT0RFX1BXTTEpIHx8IFwKKwkgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gVElNX09DTU9ERV9QV00yKSkKKworI2RlZmluZSBJU19USU1fT0NfTU9ERShNT0RFKSAoKChNT0RFKSA9PSBUSU1fT0NNT0RFX1RJTUlORykgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gVElNX09DTU9ERV9BQ1RJVkUpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFRJTV9PQ01PREVfSU5BQ1RJVkUpICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBUSU1fT0NNT0RFX1RPR0dMRSkgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gVElNX09DTU9ERV9GT1JDRURfQUNUSVZFKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFRJTV9PQ01PREVfRk9SQ0VEX0lOQUNUSVZFKSkKKworI2RlZmluZSBJU19USU1fQ0xFQVJJTlBVVF9TT1VSQ0UoU09VUkNFKSAgKCgoU09VUkNFKSA9PSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9OT05FKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFRJTV9DTEVBUklOUFVUU09VUkNFX0VUUikpIAorCisjZGVmaW5lIElTX1RJTV9TTEFWRV9NT0RFKE1PREUpICgoKE1PREUpID09IFRJTV9TTEFWRU1PREVfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBUSU1fU0xBVkVNT0RFX1JFU0VUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFRJTV9TTEFWRU1PREVfR0FURUQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gVElNX1NMQVZFTU9ERV9UUklHR0VSKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFRJTV9TTEFWRU1PREVfRVhURVJOQUwxKSkKKworI2RlZmluZSBJU19USU1fRVZFTlRfU09VUkNFKFNPVVJDRSkgKCgoKFNPVVJDRSkgJiAweEZGRkZGRjAwVSkgPT0gMHgwMDAwMDAwMFUpICYmICgoU09VUkNFKSAhPSAweDAwMDAwMDAwVSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIAorI2RlZmluZSBJU19USU1fRE1BX0JBU0UoQkFTRSkgKCgoQkFTRSkgPT0gVElNX0RNQUJBU0VfQ1IxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChCQVNFKSA9PSBUSU1fRE1BQkFTRV9DUjIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJBU0UpID09IFRJTV9ETUFCQVNFX1NNQ1IpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJBU0UpID09IFRJTV9ETUFCQVNFX0RJRVIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJBU0UpID09IFRJTV9ETUFCQVNFX1NSKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChCQVNFKSA9PSBUSU1fRE1BQkFTRV9FR1IpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJBU0UpID09IFRJTV9ETUFCQVNFX0NDTVIxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChCQVNFKSA9PSBUSU1fRE1BQkFTRV9DQ01SMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQkFTRSkgPT0gVElNX0RNQUJBU0VfQ0NFUikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQkFTRSkgPT0gVElNX0RNQUJBU0VfQ05UKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChCQVNFKSA9PSBUSU1fRE1BQkFTRV9QU0MpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJBU0UpID09IFRJTV9ETUFCQVNFX0FSUikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQkFTRSkgPT0gVElNX0RNQUJBU0VfUkNSKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChCQVNFKSA9PSBUSU1fRE1BQkFTRV9DQ1IxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChCQVNFKSA9PSBUSU1fRE1BQkFTRV9DQ1IyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChCQVNFKSA9PSBUSU1fRE1BQkFTRV9DQ1IzKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChCQVNFKSA9PSBUSU1fRE1BQkFTRV9DQ1I0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChCQVNFKSA9PSBUSU1fRE1BQkFTRV9CRFRSKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChCQVNFKSA9PSBUSU1fRE1BQkFTRV9EQ1IpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJBU0UpID09IFRJTV9ETUFCQVNFX09SKSkgICAgICAgICAgICAgICAgICAgICAKKworI2VuZGlmIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICovCisKKworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBJU19USU1fQ0hBTk5FTFMoQ0hBTk5FTCkgKCgoQ0hBTk5FTCkgPT0gVElNX0NIQU5ORUxfMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gVElNX0NIQU5ORUxfMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gVElNX0NIQU5ORUxfMykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gVElNX0NIQU5ORUxfNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gVElNX0NIQU5ORUxfNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gVElNX0NIQU5ORUxfNikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gVElNX0NIQU5ORUxfQUxMKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBJU19USU1fT1BNX0NIQU5ORUxTKENIQU5ORUwpICgoKENIQU5ORUwpID09IFRJTV9DSEFOTkVMXzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBUSU1fQ0hBTk5FTF8yKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworI2RlZmluZSBJU19USU1fQ09NUExFTUVOVEFSWV9DSEFOTkVMUyhDSEFOTkVMKSAoKChDSEFOTkVMKSA9PSBUSU1fQ0hBTk5FTF8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IFRJTV9DSEFOTkVMXzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gVElNX0NIQU5ORUxfMykpCisKKyNkZWZpbmUgSVNfVElNX1BXTV9NT0RFKE1PREUpICgoKE1PREUpID09IFRJTV9PQ01PREVfUFdNMSkgICAgICAgICAgICAgICB8fCBcCisJICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFRJTV9PQ01PREVfUFdNMikgICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBUSU1fT0NNT0RFX0NPTUJJTkVEX1BXTTEpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gVElNX09DTU9ERV9DT01CSU5FRF9QV00yKSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFRJTV9PQ01PREVfQVNTWU1FVFJJQ19QV00xKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBUSU1fT0NNT0RFX0FTU1lNRVRSSUNfUFdNMikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgSVNfVElNX09DX01PREUoTU9ERSkgKCgoTU9ERSkgPT0gVElNX09DTU9ERV9USU1JTkcpICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBUSU1fT0NNT0RFX0FDVElWRSkgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFRJTV9PQ01PREVfSU5BQ1RJVkUpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gVElNX09DTU9ERV9UT0dHTEUpICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBUSU1fT0NNT0RFX0ZPUkNFRF9BQ1RJVkUpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFRJTV9PQ01PREVfRk9SQ0VEX0lOQUNUSVZFKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gVElNX09DTU9ERV9SRVRSSUdFUlJBQkxFX09QTTEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBUSU1fT0NNT0RFX1JFVFJJR0VSUkFCTEVfT1BNMikpCisKKyNkZWZpbmUgSVNfVElNX0NMRUFSSU5QVVRfU09VUkNFKE1PREUpICgoKE1PREUpID09IFRJTV9DTEVBUklOUFVUU09VUkNFX0VUUikgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9PQ1JFRkNMUikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFRJTV9DTEVBUklOUFVUU09VUkNFX05PTkUpKQorCisjZGVmaW5lIElTX1RJTV9CUkVBS19GSUxURVIoQlJLRklMVEVSKSAoKEJSS0ZJTFRFUikgPD0gMHhGVSkgCisKKyNkZWZpbmUgSVNfVElNX0JSRUFLMl9TVEFURShTVEFURSkgKCgoU1RBVEUpID09IFRJTV9CUkVBSzJfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQVRFKSA9PSBUSU1fQlJFQUsyX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX1RJTV9CUkVBSzJfUE9MQVJJVFkoUE9MQVJJVFkpICgoKFBPTEFSSVRZKSA9PSBUSU1fQlJFQUsyUE9MQVJJVFlfTE9XKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBPTEFSSVRZKSA9PSBUSU1fQlJFQUsyUE9MQVJJVFlfSElHSCkpCisKKyNkZWZpbmUgSVNfVElNX1RSR08yX1NPVVJDRShTT1VSQ0UpICgoKFNPVVJDRSkgPT0gVElNX1RSR08yX1JFU0VUKSAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gVElNX1RSR08yX0VOQUJMRSkgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gVElNX1RSR08yX1VQREFURSkgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gVElNX1RSR08yX09DMSkgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gVElNX1RSR08yX09DMVJFRikgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gVElNX1RSR08yX09DMlJFRikgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gVElNX1RSR08yX09DM1JFRikgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gVElNX1RSR08yX09DM1JFRikgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gVElNX1RSR08yX09DNFJFRikgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gVElNX1RSR08yX09DNVJFRikgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gVElNX1RSR08yX09DNlJFRikgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gVElNX1RSR08yX09DNFJFRl9SSVNJTkdGQUxMSU5HKSAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gVElNX1RSR08yX09DNlJFRl9SSVNJTkdGQUxMSU5HKSAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gVElNX1RSR08yX09DNFJFRl9SSVNJTkdfT0M2UkVGX1JJU0lORykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gVElNX1RSR08yX09DNFJFRl9SSVNJTkdfT0M2UkVGX0ZBTExJTkcpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gVElNX1RSR08yX09DNVJFRl9SSVNJTkdfT0M2UkVGX1JJU0lORykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gVElNX1RSR08yX09DNVJFRl9SSVNJTkdfT0M2UkVGX0ZBTExJTkcpKQorCisjZGVmaW5lIElTX1RJTV9TTEFWRV9NT0RFKE1PREUpICgoKE1PREUpID09IFRJTV9TTEFWRU1PREVfRElTQUJMRSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFRJTV9TTEFWRU1PREVfUkVTRVQpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFRJTV9TTEFWRU1PREVfR0FURUQpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFRJTV9TTEFWRU1PREVfVFJJR0dFUikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFRJTV9TTEFWRU1PREVfRVhURVJOQUwxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFRJTV9TTEFWRU1PREVfQ09NQklORURfUkVTRVRUUklHR0VSKSkKKworI2RlZmluZSBJU19USU1fRVZFTlRfU09VUkNFKFNPVVJDRSkgKCgoKFNPVVJDRSkgJiAweEZGRkZGRTAwVSkgPT0gMHgwMDAwMDAwMFUpICYmICgoU09VUkNFKSAhPSAweDAwMDAwMDAwVSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIAorI2RlZmluZSBJU19USU1fRE1BX0JBU0UoQkFTRSkgKCgoQkFTRSkgPT0gVElNX0RNQUJBU0VfQ1IxKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJBU0UpID09IFRJTV9ETUFCQVNFX0NSMikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChCQVNFKSA9PSBUSU1fRE1BQkFTRV9TTUNSKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQkFTRSkgPT0gVElNX0RNQUJBU0VfRElFUikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJBU0UpID09IFRJTV9ETUFCQVNFX1NSKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChCQVNFKSA9PSBUSU1fRE1BQkFTRV9FR1IpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQkFTRSkgPT0gVElNX0RNQUJBU0VfQ0NNUjEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJBU0UpID09IFRJTV9ETUFCQVNFX0NDTVIyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChCQVNFKSA9PSBUSU1fRE1BQkFTRV9DQ0VSKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQkFTRSkgPT0gVElNX0RNQUJBU0VfQ05UKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJBU0UpID09IFRJTV9ETUFCQVNFX1BTQykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChCQVNFKSA9PSBUSU1fRE1BQkFTRV9BUlIpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQkFTRSkgPT0gVElNX0RNQUJBU0VfUkNSKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJBU0UpID09IFRJTV9ETUFCQVNFX0NDUjEpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChCQVNFKSA9PSBUSU1fRE1BQkFTRV9DQ1IyKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQkFTRSkgPT0gVElNX0RNQUJBU0VfQ0NSMykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJBU0UpID09IFRJTV9ETUFCQVNFX0NDUjQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChCQVNFKSA9PSBUSU1fRE1BQkFTRV9CRFRSKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQkFTRSkgPT0gVElNX0RNQUJBU0VfQ0NNUjMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJBU0UpID09IFRJTV9ETUFCQVNFX0NDUjUpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChCQVNFKSA9PSBUSU1fRE1BQkFTRV9DQ1I2KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQkFTRSkgPT0gVElNX0RNQUJBU0VfT1IpKSAgICAgICAgICAgICAgICAgICAgIAorCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisKKyNkZWZpbmUgSVNfVElNX1JFTUFQKFJFTUFQKSAgICAoKChSRU1BUCkgPT0gVElNX1RJTTFfQURDMV9OT05FKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUCkgPT0gVElNX1RJTTFfQURDMV9BV0QxKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUCkgPT0gVElNX1RJTTFfQURDMV9BV0QyKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUCkgPT0gVElNX1RJTTFfQURDMV9BV0QzKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUCkgPT0gVElNX1RJTTE2X0dQSU8pICAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUCkgPT0gVElNX1RJTTE2X1JUQykgICAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUCkgPT0gVElNX1RJTTE2X0hTRSkgICAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUCkgPT0gVElNX1RJTTE2X01DTykpCisKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCB8fCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMzR4OCkKKyNkZWZpbmUgSVNfVElNX1JFTUFQKFJFTUFQMSkgICAoKChSRU1BUDEpID09IFRJTV9USU0xX0FEQzFfTk9ORSkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVNQVAxKSA9PSBUSU1fVElNMV9BREMxX0FXRDEpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFTUFQMSkgPT0gVElNX1RJTTFfQURDMV9BV0QyKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUDEpID09IFRJTV9USU0xX0FEQzFfQVdEMykgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVNQVAxKSA9PSBUSU1fVElNMTZfR1BJTykgICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFTUFQMSkgPT0gVElNX1RJTTE2X1JUQykgICAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUDEpID09IFRJTV9USU0xNl9IU0UpICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVNQVAxKSA9PSBUSU1fVElNMTZfTUNPKSkKKworI2RlZmluZSBJU19USU1fUkVNQVAyKFJFTUFQMikgICgoKFJFTUFQMikgPT0gVElNX1RJTTFfQURDMl9OT05FKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUDIpID09IFRJTV9USU0xX0FEQzJfQVdEMSkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVNQVAyKSA9PSBUSU1fVElNMV9BREMyX0FXRDIpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFTUFQMikgPT0gVElNX1RJTTFfQURDMl9BV0QzKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUDIpID09IFRJTV9USU0xNl9OT05FKSkKKworI2VuZGlmIC8qIFNUTTMyRjMzNHg4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorCisjZGVmaW5lIElTX1RJTV9SRU1BUChSRU1BUDEpICAgKCgoUkVNQVAxKSA9PSBUSU1fVElNMV9BREMxX05PTkUpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFTUFQMSkgPT0gVElNX1RJTTFfQURDMV9BV0QxKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUDEpID09IFRJTV9USU0xX0FEQzFfQVdEMikgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVNQVAxKSA9PSBUSU1fVElNMV9BREMxX0FXRDMpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFTUFQMSkgPT0gVElNX1RJTThfQURDMl9OT05FKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUDEpID09IFRJTV9USU04X0FEQzJfQVdEMSkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVNQVAxKSA9PSBUSU1fVElNOF9BREMyX0FXRDIpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFTUFQMSkgPT0gVElNX1RJTThfQURDMl9BV0QzKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUDEpID09IFRJTV9USU0xNl9HUElPKSAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVNQVAxKSA9PSBUSU1fVElNMTZfUlRDKSAgICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFTUFQMSkgPT0gVElNX1RJTTE2X0hTRSkgICAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUDEpID09IFRJTV9USU0xNl9NQ08pKQorCisjZGVmaW5lIElTX1RJTV9SRU1BUDIoUkVNQVAyKSAgKCgoUkVNQVAyKSA9PSBUSU1fVElNMV9BREM0X05PTkUpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFTUFQMikgPT0gVElNX1RJTTFfQURDNF9BV0QxKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUDIpID09IFRJTV9USU0xX0FEQzRfQVdEMikgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVNQVAyKSA9PSBUSU1fVElNMV9BREM0X0FXRDMpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFTUFQMikgPT0gVElNX1RJTThfQURDM19OT05FKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUDIpID09IFRJTV9USU04X0FEQzNfQVdEMSkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVNQVAyKSA9PSBUSU1fVElNOF9BREMzX0FXRDIpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFTUFQMikgPT0gVElNX1RJTThfQURDM19BV0QzKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUDIpID09IFRJTV9USU0xNl9OT05FKSkKKworI2VuZGlmIC8qIFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KQorCisjZGVmaW5lIElTX1RJTV9SRU1BUChSRU1BUDEpICAgKCgoUkVNQVAxKSA9PSBUSU1fVElNMV9BREMxX05PTkUpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFTUFQMSkgPT0gVElNX1RJTTFfQURDMV9BV0QxKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUDEpID09IFRJTV9USU0xX0FEQzFfQVdEMikgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVNQVAxKSA9PSBUSU1fVElNMV9BREMxX0FXRDMpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFTUFQMSkgPT0gVElNX1RJTThfQURDMl9OT05FKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUDEpID09IFRJTV9USU04X0FEQzJfQVdEMSkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVNQVAxKSA9PSBUSU1fVElNOF9BREMyX0FXRDIpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFTUFQMSkgPT0gVElNX1RJTThfQURDMl9BV0QzKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUDEpID09IFRJTV9USU0xNl9HUElPKSAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVNQVAxKSA9PSBUSU1fVElNMTZfUlRDKSAgICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFTUFQMSkgPT0gVElNX1RJTTE2X0hTRSkgICAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUDEpID09IFRJTV9USU0xNl9NQ08pICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVNQVAxKSA9PSBUSU1fVElNMjBfQURDM19OT05FKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUDEpID09IFRJTV9USU0yMF9BREMzX0FXRDEpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFTUFQMSkgPT0gVElNX1RJTTIwX0FEQzNfQVdEMikgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVNQVAxKSA9PSBUSU1fVElNMjBfQURDM19BV0QzKSkKKworI2RlZmluZSBJU19USU1fUkVNQVAyKFJFTUFQMikgICgoKFJFTUFQMikgPT0gVElNX1RJTTFfQURDNF9OT05FKSAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVNQVAyKSA9PSBUSU1fVElNMV9BREM0X0FXRDEpICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUDIpID09IFRJTV9USU0xX0FEQzRfQVdEMikgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFTUFQMikgPT0gVElNX1RJTTFfQURDNF9BV0QzKSAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVNQVAyKSA9PSBUSU1fVElNOF9BREMzX05PTkUpICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUDIpID09IFRJTV9USU04X0FEQzNfQVdEMSkgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFTUFQMikgPT0gVElNX1RJTThfQURDM19BV0QyKSAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVNQVAyKSA9PSBUSU1fVElNOF9BREMzX0FXRDMpICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUDIpID09IFRJTV9USU0xNl9OT05FKSAgICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFTUFQMikgPT0gVElNX1RJTTIwX0FEQzRfTk9ORSkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVNQVAyKSA9PSBUSU1fVElNMjBfQURDNF9BV0QxKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUDIpID09IFRJTV9USU0yMF9BREM0X0FXRDIpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFTUFQMikgPT0gVElNX1RJTTIwX0FEQzRfQVdEMykpCisKKyNlbmRpZiAvKiBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKworI2RlZmluZSBJU19USU1fUkVNQVAoUkVNQVApICAgICgoKFJFTUFQKSA9PSBUSU1fVElNMl9USU04X1RSR08pICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUCkgPT0gVElNX1RJTTJfRVRIX1BUUCkgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVNQVApID09IFRJTV9USU0yX1VTQkZTX1NPRikgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFTUFQKSA9PSBUSU1fVElNMl9VU0JIU19TT0YpICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUCkgPT0gVElNX1RJTTE0X0dQSU8pICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVNQVApID09IFRJTV9USU0xNF9SVEMpICAgICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFTUFQKSA9PSBUSU1fVElNMTRfSFNFKSAgICAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRU1BUCkgPT0gVElNX1RJTTE0X01DTykpCisKKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorCisjZGVmaW5lIElTX1RJTV9HUk9VUENINShPQ1JFRikgKCgoKE9DUkVGKSAmIDB4MUZGRkZGRkZVKSA9PSAweDAwMDAwMDAwVSkpCisKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworCisjZGVmaW5lIElTX1RJTV9ERUFEVElNRShERUFEVElNRSkgICAgICAoKERFQURUSU1FKSA8PSAweEZGVSkgCisKKy8qKgorICAqIEB9CisgICovCisvKiBFbmQgb2YgcHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFRJTUV4X0V4cG9ydGVkX01hY3JvcyBUSU1FeCBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKy8qKgorICAqIEBicmllZiAgU2V0cyB0aGUgVElNIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSBvbiBydW50aW1lIHdpdGhvdXQKKyAgKiAgICAgICAgIGNhbGxpbmcgYW5vdGhlciB0aW1lIENvbmZpZ0NoYW5uZWwgZnVuY3Rpb24uCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBUSU0gQ2hhbm5lbHMgdG8gYmUgY29uZmlndXJlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogQHBhcmFtICBfX0NPTVBBUkVfXyBzcGVjaWZpZXMgdGhlIENhcHR1cmUgQ29tcGFyZSByZWdpc3RlciBuZXcgdmFsdWUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9TRVRfQ09NUEFSRShfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXywgX19DT01QQVJFX18pIFwKKygqKF9fSU8gdWludDMyX3QgKikoJigoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IxKSArICgoX19DSEFOTkVMX18pID4+IDJVKSkgPSAoX19DT01QQVJFX18pKQorCisvKioKKyAgKiBAYnJpZWYgIEdldHMgdGhlIFRJTSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgb24gcnVudGltZQorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgX19DSEFOTkVMX18gVElNIENoYW5uZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBjYXB0dXJlIGNvbXBhcmUgcmVnaXN0ZXIKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBnZXQgY2FwdHVyZS9jb21wYXJlIDEgcmVnaXN0ZXIgdmFsdWUKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogZ2V0IGNhcHR1cmUvY29tcGFyZSAyIHJlZ2lzdGVyIHZhbHVlCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IGdldCBjYXB0dXJlL2NvbXBhcmUgMyByZWdpc3RlciB2YWx1ZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBnZXQgY2FwdHVyZS9jb21wYXJlIDQgcmVnaXN0ZXIgdmFsdWUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX0dFVF9DT01QQVJFKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fKSBcCisgICgqKF9fSU8gdWludDMyX3QgKikoJigoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IxKSArICgoX19DSEFOTkVMX18pID4+IDJVKSkpCisKKy8qKgorICAqIEBicmllZiAgU2V0cyB0aGUgVElNIE91dHB1dCBjb21wYXJlIHByZWxvYWQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBUSU0gQ2hhbm5lbHMgdG8gYmUgY29uZmlndXJlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9FTkFCTEVfT0N4UFJFTE9BRChfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXykgICAgXAorICAgICAgICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgfD0gVElNX0NDTVIxX09DMVBFKSA6XAorICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgfD0gVElNX0NDTVIxX09DMlBFKSA6XAorICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjIgfD0gVElNX0NDTVIyX09DM1BFKSA6XAorICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyIHw9IFRJTV9DQ01SMl9PQzRQRSkpCisKKy8qKgorICAqIEBicmllZiAgUmVzZXRzIHRoZSBUSU0gT3V0cHV0IGNvbXBhcmUgcHJlbG9hZC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRJTSBDaGFubmVscyB0byBiZSBjb25maWd1cmVkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX0RJU0FCTEVfT0N4UFJFTE9BRChfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXykgICAgXAorICAgICAgICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgJj0gKHVpbnQxNl90KX5USU1fQ0NNUjFfT0MxUEUpIDpcCisgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSAmPSAodWludDE2X3QpflRJTV9DQ01SMV9PQzJQRSkgOlwKKyAgICAgICAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyICY9ICh1aW50MTZfdCl+VElNX0NDTVIyX09DM1BFKSA6XAorICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyICY9ICh1aW50MTZfdCl+VElNX0NDTVIyX09DNFBFKSkKKworI2VuZGlmIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorLyoqCisgICogQGJyaWVmICBTZXRzIHRoZSBUSU0gQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyIHZhbHVlIG9uIHJ1bnRpbWUgd2l0aG91dAorICAqICAgICAgICAgY2FsbGluZyBhbm90aGVyIHRpbWUgQ29uZmlnQ2hhbm5lbCBmdW5jdGlvbi4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRJTSBDaGFubmVscyB0byBiZSBjb25maWd1cmVkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNTogVElNIENoYW5uZWwgNSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF82OiBUSU0gQ2hhbm5lbCA2IHNlbGVjdGVkCisgICogQHBhcmFtICBfX0NPTVBBUkVfXyBzcGVjaWZpZXMgdGhlIENhcHR1cmUgQ29tcGFyZSByZWdpc3RlciBuZXcgdmFsdWUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9TRVRfQ09NUEFSRShfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXywgX19DT01QQVJFX18pIFwKKygoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IxID0gKF9fQ09NUEFSRV9fKSkgOlwKKyAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IyID0gKF9fQ09NUEFSRV9fKSkgOlwKKyAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IzID0gKF9fQ09NUEFSRV9fKSkgOlwKKyAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF80KSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1I0ID0gKF9fQ09NUEFSRV9fKSkgOlwKKyAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF81KSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1I1ID0gKF9fQ09NUEFSRV9fKSkgOlwKKyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSNiA9IChfX0NPTVBBUkVfXykpKQorCisvKioKKyAgKiBAYnJpZWYgIEdldHMgdGhlIFRJTSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgb24gcnVudGltZQorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgX19DSEFOTkVMX18gVElNIENoYW5uZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBjYXB0dXJlIGNvbXBhcmUgcmVnaXN0ZXIKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBnZXQgY2FwdHVyZS9jb21wYXJlIDEgcmVnaXN0ZXIgdmFsdWUKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogZ2V0IGNhcHR1cmUvY29tcGFyZSAyIHJlZ2lzdGVyIHZhbHVlCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IGdldCBjYXB0dXJlL2NvbXBhcmUgMyByZWdpc3RlciB2YWx1ZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBnZXQgY2FwdHVyZS9jb21wYXJlIDQgcmVnaXN0ZXIgdmFsdWUKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNTogZ2V0IGNhcHR1cmUvY29tcGFyZSA1IHJlZ2lzdGVyIHZhbHVlCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzY6IGdldCBjYXB0dXJlL2NvbXBhcmUgNiByZWdpc3RlciB2YWx1ZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9USU1fR0VUX0NPTVBBUkUoX19IQU5ETEVfXywgX19DSEFOTkVMX18pIFwKKygoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IxKSA6XAorICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjIpIDpcCisgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSMykgOlwKKyAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF80KSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1I0KSA6XAorICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzUpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjUpIDpcCisgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjYpKQorCisvKioKKyAgKiBAYnJpZWYgIFNldHMgdGhlIFRJTSBPdXRwdXQgY29tcGFyZSBwcmVsb2FkLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgX19DSEFOTkVMX18gVElNIENoYW5uZWxzIHRvIGJlIGNvbmZpZ3VyZWQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF81OiBUSU0gQ2hhbm5lbCA1IHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzY6IFRJTSBDaGFubmVsIDYgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX0VOQUJMRV9PQ3hQUkVMT0FEKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fKSAgICBcCisgICAgICAgICgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSB8PSBUSU1fQ0NNUjFfT0MxUEUpIDpcCisgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSB8PSBUSU1fQ0NNUjFfT0MyUEUpIDpcCisgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiB8PSBUSU1fQ0NNUjJfT0MzUEUpIDpcCisgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF80KSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiB8PSBUSU1fQ0NNUjJfT0M0UEUpIDpcCisgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF81KSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMyB8PSBUSU1fQ0NNUjNfT0M1UEUpIDpcCisgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjMgfD0gVElNX0NDTVIzX09DNlBFKSkKKworLyoqCisgICogQGJyaWVmICBSZXNldHMgdGhlIFRJTSBPdXRwdXQgY29tcGFyZSBwcmVsb2FkLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgX19DSEFOTkVMX18gVElNIENoYW5uZWxzIHRvIGJlIGNvbmZpZ3VyZWQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF81OiBUSU0gQ2hhbm5lbCA1IHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzY6IFRJTSBDaGFubmVsIDYgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX0RJU0FCTEVfT0N4UFJFTE9BRChfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXykgICAgXAorICAgICAgICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgJj0gKHVpbnQxNl90KX5USU1fQ0NNUjFfT0MxUEUpIDpcCisgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSAmPSAodWludDE2X3QpflRJTV9DQ01SMV9PQzJQRSkgOlwKKyAgICAgICAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyICY9ICh1aW50MTZfdCl+VElNX0NDTVIyX09DM1BFKSA6XAorICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNCkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjIgJj0gKHVpbnQxNl90KX5USU1fQ0NNUjJfT0M0UEUpIDpcCisgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF81KSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMyAmPSAodWludDE2X3QpflRJTV9DQ01SM19PQzVQRSkgOlwKKyAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMyAmPSAodWludDE2X3QpflRJTV9DQ01SM19PQzZQRSkpCisKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBUSU1FeF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICogQHsKKyAqLworLyogIFRpbWVyIEhhbGwgU2Vuc29yIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX0luaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9IYWxsU2Vuc29yX0luaXRUeXBlRGVmKiBzQ29uZmlnKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisKK3ZvaWQgSEFMX1RJTUV4X0hhbGxTZW5zb3JfTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1FeF9IYWxsU2Vuc29yX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisKKyAvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfSGFsbFNlbnNvcl9TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfSGFsbFNlbnNvcl9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworLyogTm9uLUJsb2NraW5nIG1vZGU6IERNQSAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfU3RhcnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCAqcERhdGEsIHVpbnQxNl90IExlbmd0aCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfSGFsbFNlbnNvcl9TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICogQHsKKyAqLworLyogIFRpbWVyIENvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PQ05fU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09DTl9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKKworLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09DTl9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT0NOX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworCisvKiBOb24tQmxvY2tpbmcgbW9kZTogRE1BICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT0NOX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhLCB1aW50MTZfdCBMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09DTl9TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMworICogQHsKKyAqLworLyogIFRpbWVyIENvbXBsZW1lbnRhcnkgUFdNIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9QV01OX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9QV01OX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworCisvKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfUFdNTl9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfUFdNTl9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBETUEgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9QV01OX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhLCB1aW50MTZfdCBMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X1BXTU5fU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQKKyAqIEB7CisgKi8KKy8qICBUaW1lciBDb21wbGVtZW50YXJ5IE9uZSBQdWxzZSBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT25lUHVsc2VOX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBPdXRwdXRDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PbmVQdWxzZU5fU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCk7CisKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PbmVQdWxzZU5fU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IE91dHB1dENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09uZVB1bHNlTl9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBPdXRwdXRDaGFubmVsKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBUSU1FeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA1CisgKiBAeworICovCisvKiBFeHRlbmRlZCBDb250cm9sIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dGF0aW9uRXZlbnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90ICBJbnB1dFRyaWdnZXIsIHVpbnQzMl90ICBDb21tdXRhdGlvblNvdXJjZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfQ29uZmlnQ29tbXV0YXRpb25FdmVudF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgIElucHV0VHJpZ2dlciwgdWludDMyX3QgIENvbW11dGF0aW9uU291cmNlKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9Db25maWdDb21tdXRhdGlvbkV2ZW50X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgIElucHV0VHJpZ2dlciwgdWludDMyX3QgIENvbW11dGF0aW9uU291cmNlKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9NYXN0ZXJDb25maWdTeW5jaHJvbml6YXRpb24oVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9NYXN0ZXJDb25maWdUeXBlRGVmICogc01hc3RlckNvbmZpZyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfQ29uZmlnQnJlYWtEZWFkVGltZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgVElNX0JyZWFrRGVhZFRpbWVDb25maWdUeXBlRGVmICpzQnJlYWtEZWFkVGltZUNvbmZpZyk7CisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9SZW1hcENvbmZpZyhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgUmVtYXAxLCB1aW50MzJfdCBSZW1hcDIpOworI2VuZGlmIC8qIFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9SZW1hcENvbmZpZyhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgUmVtYXApOworI2VuZGlmIC8qIFNUTTMyRjMwMnhFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggICAgICAgICAgICAgICAgICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfR3JvdXBDaGFubmVsNShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbHMpOworI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNgorICAqIEB7CisgICovCisvKiBFeHRlbmRlZCBDYWxsYmFjayAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhBTF9USU1FeF9Db21tdXRhdGlvbkNhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTUV4X0JyZWFrQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNRXhfQnJlYWsyQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDcKKyAgKiBAeworICAqLworLyogRXh0ZW5kZWQgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1RJTV9TdGF0ZVR5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfR2V0U3RhdGUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKy8qIEVuZCBvZiBleHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgZnVuY3Rpb25zLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFRJTUV4X1ByaXZhdGVfRnVuY3Rpb25zIFRJTUV4IFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3ZvaWQgVElNRXhfRE1BQ29tbXV0YXRpb25DcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKKy8qKgorICAqIEB9CisgICovCisvKiBFbmQgb2YgcHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKyNlbmRpZiAvKiBfX1NUTTMyRjN4eF9IQUxfVElNX0VYX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmYzeHhfaGFsX3RzYy5oIGIvSW5jL3N0bTMyZjN4eF9oYWxfdHNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY0OTc2MAotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmYzeHhfaGFsX3RzYy5oCkBAIC0wLDAgKzEsNzI0IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2hhbF90c2MuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgVFNDIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyRjN4eF9IQUxfVFNDX0gKKyNkZWZpbmUgX19TVE0zMkYzeHhfSEFMX1RTQ19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRTQworICAqIEB7CisgICovIAorCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKy8qKiBAZGVmZ3JvdXAgVFNDX0V4cG9ydGVkX1R5cGVzIFRTQyBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKiAKKyAgKiBAYnJpZWYgVFNDIHN0YXRlIHN0cnVjdHVyZSBkZWZpbml0aW9uICAKKyAgKi8gCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX1RTQ19TVEFURV9SRVNFVCAgPSAweDAwVSwgLyohPCBUU0MgcmVnaXN0ZXJzIGhhdmUgdGhlaXIgcmVzZXQgdmFsdWUgKi8KKyAgSEFMX1RTQ19TVEFURV9SRUFEWSAgPSAweDAxVSwgLyohPCBUU0MgcmVnaXN0ZXJzIGFyZSBpbml0aWFsaXplZCBvciBhY3F1aXNpdGlvbiBpcyBjb21wbGV0ZWQgd2l0aCBzdWNjZXNzICovCisgIEhBTF9UU0NfU1RBVEVfQlVTWSAgID0gMHgwMlUsIC8qITwgVFNDIGluaXRpYWxpemF0aW9uIG9yIGFjcXVpc2l0aW9uIGlzIG9uLWdvaW5nICovCisgIEhBTF9UU0NfU1RBVEVfRVJST1IgID0gMHgwM1UgIC8qITwgQWNxdWlzaXRpb24gaXMgY29tcGxldGVkIHdpdGggbWF4IGNvdW50IGVycm9yICovCit9IEhBTF9UU0NfU3RhdGVUeXBlRGVmOworCisvKiogCisgICogQGJyaWVmIFRTQyBncm91cCBzdGF0dXMgc3RydWN0dXJlIGRlZmluaXRpb24gIAorICAqLyAKK3R5cGVkZWYgZW51bQoreworICBUU0NfR1JPVVBfT05HT0lORyAgID0gMHgwMFUsIC8qITwgQWNxdWlzaXRpb24gb24gZ3JvdXAgaXMgb24tZ29pbmcgb3Igbm90IHN0YXJ0ZWQgKi8KKyAgVFNDX0dST1VQX0NPTVBMRVRFRCA9IDB4MDFVICAvKiE8IEFjcXVpc2l0aW9uIG9uIGdyb3VwIGlzIGNvbXBsZXRlZCB3aXRoIHN1Y2Nlc3MgKG5vIG1heCBjb3VudCBlcnJvcikgKi8KK30gVFNDX0dyb3VwU3RhdHVzVHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiBUU0MgaW5pdCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiAgCisgICovIAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQ1RQdWxzZUhpZ2hMZW5ndGg7ICAgICAgIC8qITwgQ2hhcmdlLXRyYW5zZmVyIGhpZ2ggcHVsc2UgbGVuZ3RoICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUU0NfQ1RQdWxzZUhMX0NvbmZpZyAgKi8KKyAgdWludDMyX3QgQ1RQdWxzZUxvd0xlbmd0aDsgICAgICAgIC8qITwgQ2hhcmdlLXRyYW5zZmVyIGxvdyBwdWxzZSBsZW5ndGggCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVFNDX0NUUHVsc2VMTF9Db25maWcgICovCisgIHVpbnQzMl90IFNwcmVhZFNwZWN0cnVtOyAgICAgICAgICAvKiE8IFNwcmVhZCBzcGVjdHJ1bSBhY3RpdmF0aW9uIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRTQ19DVFB1bHNlTExfQ29uZmlnICAqLworICB1aW50MzJfdCBTcHJlYWRTcGVjdHJ1bURldmlhdGlvbjsgLyohPCBTcHJlYWQgc3BlY3RydW0gZGV2aWF0aW9uIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDEyN1UgKi8KKyAgdWludDMyX3QgU3ByZWFkU3BlY3RydW1QcmVzY2FsZXI7IC8qITwgU3ByZWFkIHNwZWN0cnVtIHByZXNjYWxlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUU0NfU3ByZWFkU3BlY19QcmVzY2FsZXIgKi8KKyAgdWludDMyX3QgUHVsc2VHZW5lcmF0b3JQcmVzY2FsZXI7IC8qITwgUHVsc2UgZ2VuZXJhdG9yIHByZXNjYWxlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUU0NfUHVsc2VHZW5lcmF0b3JfUHJlc2NhbGVyICovCisgIHVpbnQzMl90IE1heENvdW50VmFsdWU7ICAgICAgICAgICAvKiE8IE1heCBjb3VudCB2YWx1ZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUU0NfTWF4Q291bnRfVmFsdWUgICovCisgIHVpbnQzMl90IElPRGVmYXVsdE1vZGU7ICAgICAgICAgICAvKiE8IElPIGRlZmF1bHQgbW9kZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUU0NfSU9fRGVmYXVsdF9Nb2RlICAqLworICB1aW50MzJfdCBTeW5jaHJvUGluUG9sYXJpdHk7ICAgICAgLyohPCBTeW5jaHJvIHBpbiBwb2xhcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRTQ19TeW5jaHJvX1Bpbl9Qb2xhcml0eSAqLworICB1aW50MzJfdCBBY3F1aXNpdGlvbk1vZGU7ICAgICAgICAgLyohPCBBY3F1aXNpdGlvbiBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVFNDX0FjcXVpc2l0aW9uX01vZGUgICovCisgIHVpbnQzMl90IE1heENvdW50SW50ZXJydXB0OyAgICAgICAvKiE8IE1heCBjb3VudCBpbnRlcnJ1cHQgYWN0aXZhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvIEVOQUJMRSBvciBESVNBQkxFLiAqLworICB1aW50MzJfdCBDaGFubmVsSU9zOyAgICAgICAgICAgICAgLyohPCBDaGFubmVsIElPcyBtYXNrICovCisgIHVpbnQzMl90IFNoaWVsZElPczsgICAgICAgICAgICAgICAvKiE8IFNoaWVsZCBJT3MgbWFzayAqLworICB1aW50MzJfdCBTYW1wbGluZ0lPczsgICAgICAgICAgICAgLyohPCBTYW1wbGluZyBJT3MgbWFzayAqLworfSBUU0NfSW5pdFR5cGVEZWY7CisKKy8qKiAKKyAgKiBAYnJpZWYgVFNDIElPcyBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uICAKKyAgKi8gCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBDaGFubmVsSU9zOyAgLyohPCBDaGFubmVsIElPcyBtYXNrICovCisgIHVpbnQzMl90IFNoaWVsZElPczsgICAvKiE8IFNoaWVsZCBJT3MgbWFzayAqLworICB1aW50MzJfdCBTYW1wbGluZ0lPczsgLyohPCBTYW1wbGluZyBJT3MgbWFzayAqLworfSBUU0NfSU9Db25maWdUeXBlRGVmOworCisvKiogCisgICogQGJyaWVmICBUU0MgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uICAKKyAgKi8gCit0eXBlZGVmIHN0cnVjdAoreworICBUU0NfVHlwZURlZiAgICAgICAgICAgICAgICpJbnN0YW5jZTsgLyohPCBSZWdpc3RlciBiYXNlIGFkZHJlc3MgKi8KKyAgVFNDX0luaXRUeXBlRGVmICAgICAgICAgICBJbml0OyAgICAgIC8qITwgSW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyAqLworICBfX0lPIEhBTF9UU0NfU3RhdGVUeXBlRGVmIFN0YXRlOyAgICAgLyohPCBQZXJpcGhlcmFsIHN0YXRlICovCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgICAgTG9jazsgICAgICAvKiE8IExvY2sgZmVhdHVyZSAqLworfSBUU0NfSGFuZGxlVHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVFNDX0V4cG9ydGVkX0NvbnN0YW50cyBUU0MgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8gCisKKy8qKiBAZGVmZ3JvdXAgVFNDX0NUUHVsc2VITF9Db25maWcgQ1RQdWxzZSBIaWdoIExlbmd0aAorICAqIEB7CisgICovIAorI2RlZmluZSBUU0NfQ1RQSF8xQ1lDTEUgICAoKHVpbnQzMl90KSggMFUgPDwgMjhVKSkKKyNkZWZpbmUgVFNDX0NUUEhfMkNZQ0xFUyAgKCh1aW50MzJfdCkoIDFVIDw8IDI4VSkpCisjZGVmaW5lIFRTQ19DVFBIXzNDWUNMRVMgICgodWludDMyX3QpKCAyVSA8PCAyOFUpKQorI2RlZmluZSBUU0NfQ1RQSF80Q1lDTEVTICAoKHVpbnQzMl90KSggM1UgPDwgMjhVKSkKKyNkZWZpbmUgVFNDX0NUUEhfNUNZQ0xFUyAgKCh1aW50MzJfdCkoIDRVIDw8IDI4VSkpCisjZGVmaW5lIFRTQ19DVFBIXzZDWUNMRVMgICgodWludDMyX3QpKCA1VSA8PCAyOFUpKQorI2RlZmluZSBUU0NfQ1RQSF83Q1lDTEVTICAoKHVpbnQzMl90KSggNlUgPDwgMjhVKSkKKyNkZWZpbmUgVFNDX0NUUEhfOENZQ0xFUyAgKCh1aW50MzJfdCkoIDdVIDw8IDI4VSkpCisjZGVmaW5lIFRTQ19DVFBIXzlDWUNMRVMgICgodWludDMyX3QpKCA4VSA8PCAyOFUpKQorI2RlZmluZSBUU0NfQ1RQSF8xMENZQ0xFUyAoKHVpbnQzMl90KSggOVUgPDwgMjhVKSkKKyNkZWZpbmUgVFNDX0NUUEhfMTFDWUNMRVMgKCh1aW50MzJfdCkoMTBVIDw8IDI4VSkpCisjZGVmaW5lIFRTQ19DVFBIXzEyQ1lDTEVTICgodWludDMyX3QpKDExVSA8PCAyOFUpKQorI2RlZmluZSBUU0NfQ1RQSF8xM0NZQ0xFUyAoKHVpbnQzMl90KSgxMlUgPDwgMjhVKSkKKyNkZWZpbmUgVFNDX0NUUEhfMTRDWUNMRVMgKCh1aW50MzJfdCkoMTNVIDw8IDI4VSkpCisjZGVmaW5lIFRTQ19DVFBIXzE1Q1lDTEVTICgodWludDMyX3QpKDE0VSA8PCAyOFUpKQorI2RlZmluZSBUU0NfQ1RQSF8xNkNZQ0xFUyAoKHVpbnQzMl90KSgxNVUgPDwgMjhVKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVFNDX0NUUHVsc2VMTF9Db25maWcgQ1RQdWxzZSBMb3cgTGVuZ3RoCisgICogQHsKKyAgKi8gIAorI2RlZmluZSBUU0NfQ1RQTF8xQ1lDTEUgICAoKHVpbnQzMl90KSggMFUgPDwgMjRVKSkKKyNkZWZpbmUgVFNDX0NUUExfMkNZQ0xFUyAgKCh1aW50MzJfdCkoIDFVIDw8IDI0VSkpCisjZGVmaW5lIFRTQ19DVFBMXzNDWUNMRVMgICgodWludDMyX3QpKCAyVSA8PCAyNFUpKQorI2RlZmluZSBUU0NfQ1RQTF80Q1lDTEVTICAoKHVpbnQzMl90KSggM1UgPDwgMjRVKSkKKyNkZWZpbmUgVFNDX0NUUExfNUNZQ0xFUyAgKCh1aW50MzJfdCkoIDRVIDw8IDI0VSkpCisjZGVmaW5lIFRTQ19DVFBMXzZDWUNMRVMgICgodWludDMyX3QpKCA1VSA8PCAyNFUpKQorI2RlZmluZSBUU0NfQ1RQTF83Q1lDTEVTICAoKHVpbnQzMl90KSggNlUgPDwgMjRVKSkKKyNkZWZpbmUgVFNDX0NUUExfOENZQ0xFUyAgKCh1aW50MzJfdCkoIDdVIDw8IDI0VSkpCisjZGVmaW5lIFRTQ19DVFBMXzlDWUNMRVMgICgodWludDMyX3QpKCA4VSA8PCAyNFUpKQorI2RlZmluZSBUU0NfQ1RQTF8xMENZQ0xFUyAoKHVpbnQzMl90KSggOVUgPDwgMjRVKSkKKyNkZWZpbmUgVFNDX0NUUExfMTFDWUNMRVMgKCh1aW50MzJfdCkoMTBVIDw8IDI0VSkpCisjZGVmaW5lIFRTQ19DVFBMXzEyQ1lDTEVTICgodWludDMyX3QpKDExVSA8PCAyNFUpKQorI2RlZmluZSBUU0NfQ1RQTF8xM0NZQ0xFUyAoKHVpbnQzMl90KSgxMlUgPDwgMjRVKSkKKyNkZWZpbmUgVFNDX0NUUExfMTRDWUNMRVMgKCh1aW50MzJfdCkoMTNVIDw8IDI0VSkpCisjZGVmaW5lIFRTQ19DVFBMXzE1Q1lDTEVTICgodWludDMyX3QpKDE0VSA8PCAyNFUpKQorI2RlZmluZSBUU0NfQ1RQTF8xNkNZQ0xFUyAoKHVpbnQzMl90KSgxNVUgPDwgMjRVKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVFNDX1NwcmVhZFNwZWNfUHJlc2NhbGVyIFNwcmVhZCBTcGVjdHJ1bSBQcmVzY2FsZXIKKyAgKiBAeworICAqLworI2RlZmluZSBUU0NfU1NfUFJFU0NfRElWMSAoMFUpICAKKyNkZWZpbmUgVFNDX1NTX1BSRVNDX0RJVjIgIChUU0NfQ1JfU1NQU0MpIAorLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIFRTQ19QdWxzZUdlbmVyYXRvcl9QcmVzY2FsZXIgUHVsc2UgR2VuZXJhdG9yIFByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIFRTQ19QR19QUkVTQ19ESVYxICAgKCh1aW50MzJfdCkoMFUgPDwgMTJVKSkKKyNkZWZpbmUgVFNDX1BHX1BSRVNDX0RJVjIgICAoKHVpbnQzMl90KSgxVSA8PCAxMlUpKQorI2RlZmluZSBUU0NfUEdfUFJFU0NfRElWNCAgICgodWludDMyX3QpKDJVIDw8IDEyVSkpCisjZGVmaW5lIFRTQ19QR19QUkVTQ19ESVY4ICAgKCh1aW50MzJfdCkoM1UgPDwgMTJVKSkKKyNkZWZpbmUgVFNDX1BHX1BSRVNDX0RJVjE2ICAoKHVpbnQzMl90KSg0VSA8PCAxMlUpKQorI2RlZmluZSBUU0NfUEdfUFJFU0NfRElWMzIgICgodWludDMyX3QpKDVVIDw8IDEyVSkpCisjZGVmaW5lIFRTQ19QR19QUkVTQ19ESVY2NCAgKCh1aW50MzJfdCkoNlUgPDwgMTJVKSkKKyNkZWZpbmUgVFNDX1BHX1BSRVNDX0RJVjEyOCAoKHVpbnQzMl90KSg3VSA8PCAxMlUpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUU0NfTWF4Q291bnRfVmFsdWUgTWF4IENvdW50IFZhbHVlCisgICogQHsKKyAgKi8gIAorI2RlZmluZSBUU0NfTUNWXzI1NSAgICgodWludDMyX3QpKDBVIDw8IDVVKSkKKyNkZWZpbmUgVFNDX01DVl81MTEgICAoKHVpbnQzMl90KSgxVSA8PCA1VSkpCisjZGVmaW5lIFRTQ19NQ1ZfMTAyMyAgKCh1aW50MzJfdCkoMlUgPDwgNVUpKQorI2RlZmluZSBUU0NfTUNWXzIwNDcgICgodWludDMyX3QpKDNVIDw8IDVVKSkKKyNkZWZpbmUgVFNDX01DVl80MDk1ICAoKHVpbnQzMl90KSg0VSA8PCA1VSkpCisjZGVmaW5lIFRTQ19NQ1ZfODE5MSAgKCh1aW50MzJfdCkoNVUgPDwgNVUpKQorI2RlZmluZSBUU0NfTUNWXzE2MzgzICgodWludDMyX3QpKDZVIDw8IDVVKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVFNDX0lPX0RlZmF1bHRfTW9kZSBJTyBEZWZhdWx0IE1vZGUKKyAgKiBAeworICAqLyAgCisjZGVmaW5lIFRTQ19JT0RFRl9PVVRfUFBfTE9XICgwVSkKKyNkZWZpbmUgVFNDX0lPREVGX0lOX0ZMT0FUICAgKFRTQ19DUl9JT0RFRikKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVFNDX1N5bmNocm9fUGluX1BvbGFyaXR5IFN5bmNocm8gUGluIFBvbGFyaXR5CisgICogQHsKKyAgKi8gICAgCisjZGVmaW5lIFRTQ19TWU5DX1BPTEFSSVRZX0ZBTExJTkcgICAgICAoMFUpCisjZGVmaW5lIFRTQ19TWU5DX1BPTEFSSVRZX1JJU0lORyAoVFNDX0NSX1NZTkNQT0wpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRTQ19BY3F1aXNpdGlvbl9Nb2RlIEFjcXVpc2l0aW9uIE1vZGUKKyAgKiBAeworICAqLyAgIAorI2RlZmluZSBUU0NfQUNRX01PREVfTk9STUFMICAoMFUpCisjZGVmaW5lIFRTQ19BQ1FfTU9ERV9TWU5DSFJPIChUU0NfQ1JfQU0pCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRTQ19JT19Nb2RlIElPIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBUU0NfSU9NT0RFX1VOVVNFRCAgICgwVSkKKyNkZWZpbmUgVFNDX0lPTU9ERV9DSEFOTkVMICAoMVUpCisjZGVmaW5lIFRTQ19JT01PREVfU0hJRUxEICAgKDJVKQorI2RlZmluZSBUU0NfSU9NT0RFX1NBTVBMSU5HICgzVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVFNDX2ludGVycnVwdHNfZGVmaW5pdGlvbiBJbnRlcnJ1cHRzIGRlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBUU0NfSVRfRU9BICgodWludDMyX3QpVFNDX0lFUl9FT0FJRSkgIAorI2RlZmluZSBUU0NfSVRfTUNFICgodWludDMyX3QpVFNDX0lFUl9NQ0VJRSkgCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqIEBkZWZncm91cCBUU0NfZmxhZ3NfZGVmaW5pdGlvbiBGbGFncyBkZWZpbml0aW9uCisgICogQHsKKyAgKi8gCisjZGVmaW5lIFRTQ19GTEFHX0VPQSAoKHVpbnQzMl90KVRTQ19JU1JfRU9BRikKKyNkZWZpbmUgVFNDX0ZMQUdfTUNFICgodWludDMyX3QpVFNDX0lTUl9NQ0VGKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUU0NfR3JvdXBfZGVmaW5pdGlvbiBHcm91cCBkZWZpbml0aW9uCisgICogQHsKKyAgKi8gCisjZGVmaW5lIFRTQ19OQl9PRl9HUk9VUFMgKDhVKQorCisjZGVmaW5lIFRTQ19HUk9VUDEgKDB4MDAwMDAwMDFVKQorI2RlZmluZSBUU0NfR1JPVVAyICgweDAwMDAwMDAyVSkKKyNkZWZpbmUgVFNDX0dST1VQMyAoMHgwMDAwMDAwNFUpCisjZGVmaW5lIFRTQ19HUk9VUDQgKDB4MDAwMDAwMDhVKQorI2RlZmluZSBUU0NfR1JPVVA1ICgweDAwMDAwMDEwVSkKKyNkZWZpbmUgVFNDX0dST1VQNiAoMHgwMDAwMDAyMFUpCisjZGVmaW5lIFRTQ19HUk9VUDcgKDB4MDAwMDAwNDBVKQorI2RlZmluZSBUU0NfR1JPVVA4ICgweDAwMDAwMDgwVSkKKyNkZWZpbmUgVFNDX0FMTF9HUk9VUFMgKDB4MDAwMDAwRkZVKQorCisjZGVmaW5lIFRTQ19HUk9VUDFfSURYICgwVSkKKyNkZWZpbmUgVFNDX0dST1VQMl9JRFggKDFVKQorI2RlZmluZSBUU0NfR1JPVVAzX0lEWCAoMlUpCisjZGVmaW5lIFRTQ19HUk9VUDRfSURYICgzVSkKKyNkZWZpbmUgVFNDX0dST1VQNV9JRFggKDRVKQorI2RlZmluZSBUU0NfR1JPVVA2X0lEWCAoNVUpCisjZGVmaW5lIFRTQ19HUk9VUDdfSURYICg2VSkKKyNkZWZpbmUgVFNDX0dST1VQOF9JRFggKDdVKQorCisjZGVmaW5lIFRTQ19HUk9VUDFfSU8xICgweDAwMDAwMDAxVSkKKyNkZWZpbmUgVFNDX0dST1VQMV9JTzIgKDB4MDAwMDAwMDJVKQorI2RlZmluZSBUU0NfR1JPVVAxX0lPMyAoMHgwMDAwMDAwNFUpCisjZGVmaW5lIFRTQ19HUk9VUDFfSU80ICgweDAwMDAwMDA4VSkKKyNkZWZpbmUgVFNDX0dST1VQMV9BTExfSU9TICgweDAwMDAwMDBGVSkKKworI2RlZmluZSBUU0NfR1JPVVAyX0lPMSAoMHgwMDAwMDAxMFUpCisjZGVmaW5lIFRTQ19HUk9VUDJfSU8yICgweDAwMDAwMDIwVSkKKyNkZWZpbmUgVFNDX0dST1VQMl9JTzMgKDB4MDAwMDAwNDBVKQorI2RlZmluZSBUU0NfR1JPVVAyX0lPNCAoMHgwMDAwMDA4MFUpCisjZGVmaW5lIFRTQ19HUk9VUDJfQUxMX0lPUyAoMHgwMDAwMDBGMFUpCisKKyNkZWZpbmUgVFNDX0dST1VQM19JTzEgKDB4MDAwMDAxMDBVKQorI2RlZmluZSBUU0NfR1JPVVAzX0lPMiAoMHgwMDAwMDIwMFUpCisjZGVmaW5lIFRTQ19HUk9VUDNfSU8zICgweDAwMDAwNDAwVSkKKyNkZWZpbmUgVFNDX0dST1VQM19JTzQgKDB4MDAwMDA4MDBVKQorI2RlZmluZSBUU0NfR1JPVVAzX0FMTF9JT1MgKDB4MDAwMDBGMDBVKQorCisjZGVmaW5lIFRTQ19HUk9VUDRfSU8xICgweDAwMDAxMDAwVSkKKyNkZWZpbmUgVFNDX0dST1VQNF9JTzIgKDB4MDAwMDIwMDBVKQorI2RlZmluZSBUU0NfR1JPVVA0X0lPMyAoMHgwMDAwNDAwMFUpCisjZGVmaW5lIFRTQ19HUk9VUDRfSU80ICgweDAwMDA4MDAwVSkKKyNkZWZpbmUgVFNDX0dST1VQNF9BTExfSU9TICgweDAwMDBGMDAwVSkKKworI2RlZmluZSBUU0NfR1JPVVA1X0lPMSAoMHgwMDAxMDAwMFUpCisjZGVmaW5lIFRTQ19HUk9VUDVfSU8yICgweDAwMDIwMDAwVSkKKyNkZWZpbmUgVFNDX0dST1VQNV9JTzMgKDB4MDAwNDAwMDBVKQorI2RlZmluZSBUU0NfR1JPVVA1X0lPNCAoMHgwMDA4MDAwMFUpCisjZGVmaW5lIFRTQ19HUk9VUDVfQUxMX0lPUyAoMHgwMDBGMDAwMFUpCisKKyNkZWZpbmUgVFNDX0dST1VQNl9JTzEgKDB4MDAxMDAwMDBVKQorI2RlZmluZSBUU0NfR1JPVVA2X0lPMiAoMHgwMDIwMDAwMFUpCisjZGVmaW5lIFRTQ19HUk9VUDZfSU8zICgweDAwNDAwMDAwVSkKKyNkZWZpbmUgVFNDX0dST1VQNl9JTzQgKDB4MDA4MDAwMDBVKQorI2RlZmluZSBUU0NfR1JPVVA2X0FMTF9JT1MgKDB4MDBGMDAwMDBVKQorCisjZGVmaW5lIFRTQ19HUk9VUDdfSU8xICgweDAxMDAwMDAwVSkKKyNkZWZpbmUgVFNDX0dST1VQN19JTzIgKDB4MDIwMDAwMDBVKQorI2RlZmluZSBUU0NfR1JPVVA3X0lPMyAoMHgwNDAwMDAwMFUpCisjZGVmaW5lIFRTQ19HUk9VUDdfSU80ICgweDA4MDAwMDAwVSkKKyNkZWZpbmUgVFNDX0dST1VQN19BTExfSU9TICgweDBGMDAwMDAwVSkKKworI2RlZmluZSBUU0NfR1JPVVA4X0lPMSAoMHgxMDAwMDAwMFUpCisjZGVmaW5lIFRTQ19HUk9VUDhfSU8yICgweDIwMDAwMDAwVSkKKyNkZWZpbmUgVFNDX0dST1VQOF9JTzMgKDB4NDAwMDAwMDBVKQorI2RlZmluZSBUU0NfR1JPVVA4X0lPNCAoMHg4MDAwMDAwMFUpCisjZGVmaW5lIFRTQ19HUk9VUDhfQUxMX0lPUyAoMHhGMDAwMDAwMFUpCisKKyNkZWZpbmUgVFNDX0FMTF9HUk9VUFNfQUxMX0lPUyAoMHhGRkZGRkZGRlUpCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLyAKKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBUU0NfRXhwb3J0ZWRfTWFjcm9zIFRTQyBFeHBvcnRlZCBNYWNyb3MKKyAqIEB7CisgKi8KKworLyoqIEBicmllZiBSZXNldCBUU0MgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUU0MgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RTQ19SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfVFNDX1NUQVRFX1JFU0VUKQorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIHRoZSBUU0MgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVFNDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9UU0NfRU5BQkxFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSBUU0NfQ1JfVFNDRSkKKworLyoqCisgICogQGJyaWVmIERpc2FibGUgdGhlIFRTQyBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUU0MgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RTQ19ESVNBQkxFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmPSAodWludDMyX3QpKH5UU0NfQ1JfVFNDRSkpCisKKy8qKgorICAqIEBicmllZiBTdGFydCBhY3F1aXNpdGlvbi4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVFNDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9UU0NfU1RBUlRfQUNRKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSBUU0NfQ1JfU1RBUlQpCisKKy8qKgorICAqIEBicmllZiBTdG9wIGFjcXVpc2l0aW9uLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUU0MgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RTQ19TVE9QX0FDUShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgJj0gKHVpbnQzMl90KSh+VFNDX0NSX1NUQVJUKSkKKworLyoqCisgICogQGJyaWVmIFNldCBJTyBkZWZhdWx0IG1vZGUgdG8gb3V0cHV0IHB1c2gtcHVsbCBsb3cuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRTQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVFNDX1NFVF9JT0RFRl9PVVRQUExPVyhfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgJj0gKHVpbnQzMl90KSh+VFNDX0NSX0lPREVGKSkKKworLyoqCisgICogQGJyaWVmIFNldCBJTyBkZWZhdWx0IG1vZGUgdG8gaW5wdXQgZmxvYXRpbmcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRTQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVFNDX1NFVF9JT0RFRl9JTkZMT0FUKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSBUU0NfQ1JfSU9ERUYpCisKKy8qKgorICAqIEBicmllZiBTZXQgc3luY2hyb25pemF0aW9uIHBvbGFyaXR5IHRvIGZhbGxpbmcgZWRnZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVFNDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9UU0NfU0VUX1NZTkNfUE9MX0ZBTEwoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9ICh1aW50MzJfdCkoflRTQ19DUl9TWU5DUE9MKSkKKworLyoqCisgICogQGJyaWVmIFNldCBzeW5jaHJvbml6YXRpb24gcG9sYXJpdHkgdG8gcmlzaW5nIGVkZ2UgYW5kIGhpZ2ggbGV2ZWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRTQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVFNDX1NFVF9TWU5DX1BPTF9SSVNFX0hJR0goX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9IFRTQ19DUl9TWU5DUE9MKQorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIFRTQyBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRTQyBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gVFNDIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9UU0NfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JRVIgfD0gKF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSBUU0MgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUU0MgaGFuZGxlCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIFRTQyBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVFNDX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklFUiAmPSAodWludDMyX3QpKH4oX19JTlRFUlJVUFRfXykpKQorCisvKiogQGJyaWVmIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBUU0MgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVFNDIEhhbmRsZQorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBUU0MgaW50ZXJydXB0CisgICogQHJldHZhbCBTRVQgb3IgUkVTRVQKKyAgKi8KKyNkZWZpbmUgX19IQUxfVFNDX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUVSICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpID8gU0VUIDogUkVTRVQpCisKKy8qKgorICAqIEBicmllZiBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVFNDIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVFNDIGhhbmRsZQorICAqIEBwYXJhbSAgX19GTEFHX18gVFNDIGZsYWcKKyAgKiBAcmV0dmFsIFNFVCBvciBSRVNFVAorICAqLworI2RlZmluZSBfX0hBTF9UU0NfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpID8gU0VUIDogUkVTRVQpCisKKy8qKgorICAqIEBicmllZiBDbGVhciB0aGUgVFNDJ3MgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUU0MgaGFuZGxlCisgICogQHBhcmFtICBfX0ZMQUdfXyBUU0MgZmxhZworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9UU0NfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklDUiA9IChfX0ZMQUdfXykpCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgc2NobWl0dCB0cmlnZ2VyIGh5c3RlcmVzaXMgb24gYSBncm91cCBvZiBJT3MuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRTQyBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fR1hfSU9ZX01BU0tfXyBJT3MgbWFzaworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9UU0NfRU5BQkxFX0hZU1RFUkVTSVMoX19IQU5ETEVfXywgX19HWF9JT1lfTUFTS19fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SU9IQ1IgfD0gKF9fR1hfSU9ZX01BU0tfXykpCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIHNjaG1pdHQgdHJpZ2dlciBoeXN0ZXJlc2lzIG9uIGEgZ3JvdXAgb2YgSU9zLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUU0MgaGFuZGxlCisgICogQHBhcmFtICBfX0dYX0lPWV9NQVNLX18gSU9zIG1hc2sKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVFNDX0RJU0FCTEVfSFlTVEVSRVNJUyhfX0hBTkRMRV9fLCBfX0dYX0lPWV9NQVNLX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JT0hDUiAmPSAodWludDMyX3QpKH4oX19HWF9JT1lfTUFTS19fKSkpCisKKy8qKgorICAqIEBicmllZiBPcGVuIGFuYWxvZyBzd2l0Y2ggb24gYSBncm91cCBvZiBJT3MuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRTQyBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fR1hfSU9ZX01BU0tfXyBJT3MgbWFzaworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9UU0NfT1BFTl9BTkFMT0dfU1dJVENIKF9fSEFORExFX18sIF9fR1hfSU9ZX01BU0tfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklPQVNDUiAmPSAodWludDMyX3QpKH4oX19HWF9JT1lfTUFTS19fKSkpCisKKy8qKgorICAqIEBicmllZiBDbG9zZSBhbmFsb2cgc3dpdGNoIG9uIGEgZ3JvdXAgb2YgSU9zLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUU0MgaGFuZGxlCisgICogQHBhcmFtICBfX0dYX0lPWV9NQVNLX18gSU9zIG1hc2sKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVFNDX0NMT1NFX0FOQUxPR19TV0lUQ0goX19IQU5ETEVfXywgX19HWF9JT1lfTUFTS19fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SU9BU0NSIHw9IChfX0dYX0lPWV9NQVNLX18pKQorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIGEgZ3JvdXAgb2YgSU9zIGluIGNoYW5uZWwgbW9kZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVFNDIGhhbmRsZQorICAqIEBwYXJhbSAgX19HWF9JT1lfTUFTS19fIElPcyBtYXNrCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RTQ19FTkFCTEVfQ0hBTk5FTChfX0hBTkRMRV9fLCBfX0dYX0lPWV9NQVNLX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JT0NDUiB8PSAoX19HWF9JT1lfTUFTS19fKSkKKworLyoqCisgICogQGJyaWVmIERpc2FibGUgYSBncm91cCBvZiBjaGFubmVsIElPcy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVFNDIGhhbmRsZQorICAqIEBwYXJhbSAgX19HWF9JT1lfTUFTS19fIElPcyBtYXNrCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RTQ19ESVNBQkxFX0NIQU5ORUwoX19IQU5ETEVfXywgX19HWF9JT1lfTUFTS19fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SU9DQ1IgJj0gKHVpbnQzMl90KSh+KF9fR1hfSU9ZX01BU0tfXykpKQorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIGEgZ3JvdXAgb2YgSU9zIGluIHNhbXBsaW5nIG1vZGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRTQyBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fR1hfSU9ZX01BU0tfXyBJT3MgbWFzaworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9UU0NfRU5BQkxFX1NBTVBMSU5HKF9fSEFORExFX18sIF9fR1hfSU9ZX01BU0tfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklPU0NSIHw9IChfX0dYX0lPWV9NQVNLX18pKQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSBhIGdyb3VwIG9mIHNhbXBsaW5nIElPcy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVFNDIGhhbmRsZQorICAqIEBwYXJhbSAgX19HWF9JT1lfTUFTS19fIElPcyBtYXNrCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RTQ19ESVNBQkxFX1NBTVBMSU5HKF9fSEFORExFX18sIF9fR1hfSU9ZX01BU0tfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklPU0NSICY9ICh1aW50MzJfdCkofihfX0dYX0lPWV9NQVNLX18pKSkKKworLyoqCisgICogQGJyaWVmIEVuYWJsZSBhY3F1aXNpdGlvbiBncm91cHMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRTQyBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fR1hfTUFTS19fIEdyb3VwcyBtYXNrCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RTQ19FTkFCTEVfR1JPVVAoX19IQU5ETEVfXywgX19HWF9NQVNLX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JT0dDU1IgfD0gKF9fR1hfTUFTS19fKSkKKworLyoqCisgICogQGJyaWVmIERpc2FibGUgYWNxdWlzaXRpb24gZ3JvdXBzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUU0MgaGFuZGxlCisgICogQHBhcmFtICBfX0dYX01BU0tfXyBHcm91cHMgbWFzaworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9UU0NfRElTQUJMRV9HUk9VUChfX0hBTkRMRV9fLCBfX0dYX01BU0tfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklPR0NTUiAmPSAodWludDMyX3QpKH4oX19HWF9NQVNLX18pKSkKKworLyoqIEBicmllZiBHZXRzIGFjcXVpc2l0aW9uIGdyb3VwIHN0YXR1cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVFNDIEhhbmRsZQorICAqIEBwYXJhbSAgX19HWF9JTkRFWF9fIEdyb3VwIGluZGV4CisgICogQHJldHZhbCBTRVQgb3IgUkVTRVQKKyAgKi8KKyNkZWZpbmUgX19IQUxfVFNDX0dFVF9HUk9VUF9TVEFUVVMoX19IQU5ETEVfXywgX19HWF9JTkRFWF9fKSBcCisoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JT0dDU1IgJiAodWludDMyX3QpKCh1aW50MzJfdCkxVSA8PCAoKF9fR1hfSU5ERVhfXykgKyAodWludDMyX3QpMTZVKSkpID09ICh1aW50MzJfdCkoKHVpbnQzMl90KTFVIDw8ICgoX19HWF9JTkRFWF9fKSArICh1aW50MzJfdCkxNlUpKSkgPyBUU0NfR1JPVVBfQ09NUExFVEVEIDogVFNDX0dST1VQX09OR09JTkcpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgVFNDX1ByaXZhdGVfTWFjcm9zIFRTQyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfVFNDX0NUUEgoVkFMKSAoKChWQUwpID09IFRTQ19DVFBIXzFDWUNMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTCkgPT0gVFNDX0NUUEhfMkNZQ0xFUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTCkgPT0gVFNDX0NUUEhfM0NZQ0xFUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTCkgPT0gVFNDX0NUUEhfNENZQ0xFUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTCkgPT0gVFNDX0NUUEhfNUNZQ0xFUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTCkgPT0gVFNDX0NUUEhfNkNZQ0xFUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTCkgPT0gVFNDX0NUUEhfN0NZQ0xFUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTCkgPT0gVFNDX0NUUEhfOENZQ0xFUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTCkgPT0gVFNDX0NUUEhfOUNZQ0xFUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTCkgPT0gVFNDX0NUUEhfMTBDWUNMRVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUwpID09IFRTQ19DVFBIXzExQ1lDTEVTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMKSA9PSBUU0NfQ1RQSF8xMkNZQ0xFUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTCkgPT0gVFNDX0NUUEhfMTNDWUNMRVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUwpID09IFRTQ19DVFBIXzE0Q1lDTEVTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMKSA9PSBUU0NfQ1RQSF8xNUNZQ0xFUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTCkgPT0gVFNDX0NUUEhfMTZDWUNMRVMpKQorCisjZGVmaW5lIElTX1RTQ19DVFBMKFZBTCkgKCgoVkFMKSA9PSBUU0NfQ1RQTF8xQ1lDTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUwpID09IFRTQ19DVFBMXzJDWUNMRVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUwpID09IFRTQ19DVFBMXzNDWUNMRVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUwpID09IFRTQ19DVFBMXzRDWUNMRVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUwpID09IFRTQ19DVFBMXzVDWUNMRVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUwpID09IFRTQ19DVFBMXzZDWUNMRVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUwpID09IFRTQ19DVFBMXzdDWUNMRVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUwpID09IFRTQ19DVFBMXzhDWUNMRVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUwpID09IFRTQ19DVFBMXzlDWUNMRVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUwpID09IFRTQ19DVFBMXzEwQ1lDTEVTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMKSA9PSBUU0NfQ1RQTF8xMUNZQ0xFUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTCkgPT0gVFNDX0NUUExfMTJDWUNMRVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUwpID09IFRTQ19DVFBMXzEzQ1lDTEVTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMKSA9PSBUU0NfQ1RQTF8xNENZQ0xFUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTCkgPT0gVFNDX0NUUExfMTVDWUNMRVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUwpID09IFRTQ19DVFBMXzE2Q1lDTEVTKSkKKworI2RlZmluZSBJU19UU0NfU1MoVkFMKSAoKChWQUwpID09IERJU0FCTEUpIHx8ICgoVkFMKSA9PSBFTkFCTEUpKQorCisjZGVmaW5lIElTX1RTQ19TU0QoVkFMKSAoKChWQUwpID09IDBVKSB8fCAoKChWQUwpID4gMFUpICYmICgoVkFMKSA8IDEyOFUpKSkKKworI2RlZmluZSBJU19UU0NfU1NfUFJFU0MoVkFMKSAoKChWQUwpID09IFRTQ19TU19QUkVTQ19ESVYxKSB8fCAoKFZBTCkgPT0gVFNDX1NTX1BSRVNDX0RJVjIpKQorCisjZGVmaW5lIElTX1RTQ19QR19QUkVTQyhWQUwpICgoKFZBTCkgPT0gVFNDX1BHX1BSRVNDX0RJVjEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMKSA9PSBUU0NfUEdfUFJFU0NfRElWMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUwpID09IFRTQ19QR19QUkVTQ19ESVY0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTCkgPT0gVFNDX1BHX1BSRVNDX0RJVjgpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMKSA9PSBUU0NfUEdfUFJFU0NfRElWMTYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMKSA9PSBUU0NfUEdfUFJFU0NfRElWMzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMKSA9PSBUU0NfUEdfUFJFU0NfRElWNjQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMKSA9PSBUU0NfUEdfUFJFU0NfRElWMTI4KSkKKworI2RlZmluZSBJU19UU0NfTUNWKFZBTCkgKCgoVkFMKSA9PSBUU0NfTUNWXzI1NSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMKSA9PSBUU0NfTUNWXzUxMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMKSA9PSBUU0NfTUNWXzEwMjMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTCkgPT0gVFNDX01DVl8yMDQ3KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUwpID09IFRTQ19NQ1ZfNDA5NSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMKSA9PSBUU0NfTUNWXzgxOTEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTCkgPT0gVFNDX01DVl8xNjM4MykpCisKKyNkZWZpbmUgSVNfVFNDX0lPREVGKFZBTCkgKCgoVkFMKSA9PSBUU0NfSU9ERUZfT1VUX1BQX0xPVykgfHwgKChWQUwpID09IFRTQ19JT0RFRl9JTl9GTE9BVCkpCisKKyNkZWZpbmUgSVNfVFNDX1NZTkNfUE9MKFZBTCkgKCgoVkFMKSA9PSBUU0NfU1lOQ19QT0xBUklUWV9GQUxMSU5HKSB8fCAoKFZBTCkgPT0gVFNDX1NZTkNfUE9MQVJJVFlfUklTSU5HKSkKKworI2RlZmluZSBJU19UU0NfQUNRX01PREUoVkFMKSAoKChWQUwpID09IFRTQ19BQ1FfTU9ERV9OT1JNQUwpIHx8ICgoVkFMKSA9PSBUU0NfQUNRX01PREVfU1lOQ0hSTykpCisKKyNkZWZpbmUgSVNfVFNDX0lPTU9ERShWQUwpICgoKFZBTCkgPT0gVFNDX0lPTU9ERV9VTlVTRUQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTCkgPT0gVFNDX0lPTU9ERV9DSEFOTkVMKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUwpID09IFRTQ19JT01PREVfU0hJRUxEKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUwpID09IFRTQ19JT01PREVfU0FNUExJTkcpKQorCisjZGVmaW5lIElTX1RTQ19NQ0VfSVQoVkFMKSAoKChWQUwpID09IERJU0FCTEUpIHx8ICgoVkFMKSA9PSBFTkFCTEUpKQorCisjZGVmaW5lIElTX1RTQ19HUk9VUF9JTkRFWChWQUwpICgoKFZBTCkgPT0gMFUpIHx8ICgoKFZBTCkgPiAwVSkgJiYgKChWQUwpIDwgVFNDX05CX09GX0dST1VQUykpKQorCisvKioKKyAgKiBAfQorICAqLworICAKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAKKy8qKiBAYWRkdG9ncm91cCBUU0NfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyAgCisvKiogQGFkZHRvZ3JvdXAgVFNDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICogIEB7CisgKi8KKyAvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RTQ19Jbml0KFRTQ19IYW5kbGVUeXBlRGVmKiBodHNjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9UU0NfRGVJbml0KFRTQ19IYW5kbGVUeXBlRGVmICpodHNjKTsKK3ZvaWQgSEFMX1RTQ19Nc3BJbml0KFRTQ19IYW5kbGVUeXBlRGVmKiBodHNjKTsKK3ZvaWQgSEFMX1RTQ19Nc3BEZUluaXQoVFNDX0hhbmRsZVR5cGVEZWYqIGh0c2MpOworLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGFkZHRvZ3JvdXAgVFNDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSW5wdXQgYW5kIE91dHB1dCBvcGVyYXRpb24gZnVuY3Rpb25zCisgKiAgQHsKKyAqLworLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9UU0NfU3RhcnQoVFNDX0hhbmRsZVR5cGVEZWYqIGh0c2MpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RTQ19TdGFydF9JVChUU0NfSGFuZGxlVHlwZURlZiogaHRzYyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVFNDX1N0b3AoVFNDX0hhbmRsZVR5cGVEZWYqIGh0c2MpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RTQ19TdG9wX0lUKFRTQ19IYW5kbGVUeXBlRGVmKiBodHNjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9UU0NfUG9sbEZvckFjcXVpc2l0aW9uKFRTQ19IYW5kbGVUeXBlRGVmKiBodHNjKTsKK1RTQ19Hcm91cFN0YXR1c1R5cGVEZWYgSEFMX1RTQ19Hcm91cEdldFN0YXR1cyhUU0NfSGFuZGxlVHlwZURlZiogaHRzYywgdWludDMyX3QgZ3hfaW5kZXgpOwordWludDMyX3QgSEFMX1RTQ19Hcm91cEdldFZhbHVlKFRTQ19IYW5kbGVUeXBlRGVmKiBodHNjLCB1aW50MzJfdCBneF9pbmRleCk7CisvKioKKyAgKiBAfQorICAqLworICAKKy8qKiBAYWRkdG9ncm91cCBUU0NfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKiAgQHsKKyAqLworLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9UU0NfSU9Db25maWcoVFNDX0hhbmRsZVR5cGVEZWYqIGh0c2MsIFRTQ19JT0NvbmZpZ1R5cGVEZWYqIGNvbmZpZyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVFNDX0lPRGlzY2hhcmdlKFRTQ19IYW5kbGVUeXBlRGVmKiBodHNjLCB1aW50MzJfdCBjaG9pY2UpOworLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGFkZHRvZ3JvdXAgVFNDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucworICogIEB7CisgKi8KKy8qIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfVFNDX1N0YXRlVHlwZURlZiBIQUxfVFNDX0dldFN0YXRlKFRTQ19IYW5kbGVUeXBlRGVmKiBodHNjKTsKKy8qKgorICAqIEB9CisgICovCisgIAorLyoqIEBhZGR0b2dyb3VwIFRTQ19JUlFfSGFuZGxlcl9hbmRfQ2FsbGJhY2tzIElSUSBIYW5kbGVyIGFuZCBDYWxsYmFja3MKKyAqIEB7CisgKi8gICAKKy8qKioqKioqIFRTQyBJUlFIYW5kbGVyIGFuZCBDYWxsYmFja3MgdXNlZCBpbiBJbnRlcnJ1cHQgbW9kZSAqLwordm9pZCBIQUxfVFNDX0lSUUhhbmRsZXIoVFNDX0hhbmRsZVR5cGVEZWYqIGh0c2MpOwordm9pZCBIQUxfVFNDX0NvbnZDcGx0Q2FsbGJhY2soVFNDX0hhbmRsZVR5cGVEZWYqIGh0c2MpOwordm9pZCBIQUxfVFNDX0Vycm9yQ2FsbGJhY2soVFNDX0hhbmRsZVR5cGVEZWYqIGh0c2MpOworLyoqCisgICogQH0KKyAgKi8KKyAgCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qX19TVE0zMkYzeHhfVFNDX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmYzeHhfaGFsX3VhcnQuaCBiL0luYy9zdG0zMmYzeHhfaGFsX3VhcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjNmYmI0Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjN4eF9oYWxfdWFydC5oCkBAIC0wLDAgKzEsMTQ0NiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfdWFydC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBVQVJUIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyRjN4eF9IQUxfVUFSVF9ICisjZGVmaW5lIF9fU1RNMzJGM3h4X0hBTF9VQVJUX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVUFSVAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVBUlRfRXhwb3J0ZWRfVHlwZXMgVUFSVCBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBVQVJUIEluaXQgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IEJhdWRSYXRlOyAgICAgICAgICAgICAgICAgIC8qITwgVGhpcyBtZW1iZXIgY29uZmlndXJlcyB0aGUgVUFSVCBjb21tdW5pY2F0aW9uIGJhdWQgcmF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgYmF1ZCByYXRlIHJlZ2lzdGVyIGlzIGNvbXB1dGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZm9ybXVsYToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIElmIG92ZXJzYW1wbGluZyBpcyAxNiBvciBpbiBMSU4gbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXVkIFJhdGUgUmVnaXN0ZXIgPSAoKFBDTEt4KSAvICgoaHVhcnQtPkluaXQuQmF1ZFJhdGUpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIElmIG92ZXJzYW1wbGluZyBpcyA4VSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXVkIFJhdGUgUmVnaXN0ZXJbMTU6NF0gPSAoKDJVICogUENMS3gpIC8gKChodWFydC0+SW5pdC5CYXVkUmF0ZSkpKVsxNTo0XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhdWQgUmF0ZSBSZWdpc3RlclszXSA9ICAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmF1ZCBSYXRlIFJlZ2lzdGVyWzI6MF0gPSAgKCgoMlUgKiBQQ0xLeCkgLyAoKGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSkpWzM6MF0pID4+IDEgICAgICAqLworCisgIHVpbnQzMl90IFdvcmRMZW5ndGg7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZGF0YSBiaXRzIHRyYW5zbWl0dGVkIG9yIHJlY2VpdmVkIGluIGEgZnJhbWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJURXhfV29yZF9MZW5ndGguICovCisKKyAgdWludDMyX3QgU3RvcEJpdHM7ICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzdG9wIGJpdHMgdHJhbnNtaXR0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX1N0b3BfQml0cy4gKi8KKworICB1aW50MzJfdCBQYXJpdHk7ICAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcGFyaXR5IG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX1Bhcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFdoZW4gcGFyaXR5IGlzIGVuYWJsZWQsIHRoZSBjb21wdXRlZCBwYXJpdHkgaXMgaW5zZXJ0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdCB0aGUgTVNCIHBvc2l0aW9uIG9mIHRoZSB0cmFuc21pdHRlZCBkYXRhICg5dGggYml0IHdoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgd29yZCBsZW5ndGggaXMgc2V0IHRvIDkgZGF0YSBiaXRzOyA4dGggYml0IHdoZW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZCBsZW5ndGggaXMgc2V0IHRvIDggZGF0YSBiaXRzKS4gKi8KKworICB1aW50MzJfdCBNb2RlOyAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBSZWNlaXZlIG9yIFRyYW5zbWl0IG1vZGUgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRfTW9kZS4gKi8KKworICB1aW50MzJfdCBId0Zsb3dDdGw7ICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBoYXJkd2FyZSBmbG93IGNvbnRyb2wgbW9kZSBpcyBlbmFibGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX0hhcmR3YXJlX0Zsb3dfQ29udHJvbC4gKi8KKworICB1aW50MzJfdCBPdmVyU2FtcGxpbmc7ICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBPdmVyIHNhbXBsaW5nIDggaXMgZW5hYmxlZCBvciBkaXNhYmxlZCwgdG8gYWNoaWV2ZSBoaWdoZXIgc3BlZWQgKHVwIHRvIGZfUENMSy84VSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX092ZXJfU2FtcGxpbmcuICovCisKKyAgdWludDMyX3QgT25lQml0U2FtcGxpbmc7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciBhIHNpbmdsZSBzYW1wbGUgb3IgdGhyZWUgc2FtcGxlcycgbWFqb3JpdHkgdm90ZSBpcyBzZWxlY3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RpbmcgdGhlIHNpbmdsZSBzYW1wbGUgbWV0aG9kIGluY3JlYXNlcyB0aGUgcmVjZWl2ZXIgdG9sZXJhbmNlIHRvIGNsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWF0aW9ucy4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX09uZUJpdF9TYW1wbGluZy4gKi8KK31VQVJUX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFVBUlQgQWR2YW5jZWQgRmVhdHVyZXMgaW5pdGFsaXphdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQWR2RmVhdHVyZUluaXQ7ICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGljaCBhZHZhbmNlZCBVQVJUIGZlYXR1cmVzIGlzIGluaXRpYWxpemVkLiBTZXZlcmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZHZhbmNlZCBGZWF0dXJlcyBtYXkgYmUgaW5pdGlhbGl6ZWQgYXQgdGhlIHNhbWUgdGltZSAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRfQWR2YW5jZWRfRmVhdHVyZXNfSW5pdGlhbGl6YXRpb25fVHlwZS4gKi8KKworICB1aW50MzJfdCBUeFBpbkxldmVsSW52ZXJ0OyAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFRYIHBpbiBhY3RpdmUgbGV2ZWwgaXMgaW52ZXJ0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRfVHhfSW52LiAgKi8KKworICB1aW50MzJfdCBSeFBpbkxldmVsSW52ZXJ0OyAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFJYIHBpbiBhY3RpdmUgbGV2ZWwgaXMgaW52ZXJ0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRfUnhfSW52LiAgKi8KKworICB1aW50MzJfdCBEYXRhSW52ZXJ0OyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgZGF0YSBhcmUgaW52ZXJ0ZWQgKHBvc2l0aXZlL2RpcmVjdCBsb2dpYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnMgbmVnYXRpdmUvaW52ZXJ0ZWQgbG9naWMpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX0RhdGFfSW52LiAqLworCisgIHVpbnQzMl90IFN3YXA7ICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciBUWCBhbmQgUlggcGlucyBhcmUgc3dhcHBlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9SeF9UeF9Td2FwLiAqLworCisgIHVpbnQzMl90IE92ZXJydW5EaXNhYmxlOyAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVjZXB0aW9uIG92ZXJydW4gZGV0ZWN0aW9uIGlzIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX092ZXJydW5fRGlzYWJsZS4gKi8KKworICB1aW50MzJfdCBETUFEaXNhYmxlb25SeEVycm9yOyAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIERNQSBpcyBkaXNhYmxlZCBpbiBjYXNlIG9mIHJlY2VwdGlvbiBlcnJvci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9ETUFfRGlzYWJsZV9vbl9SeF9FcnJvci4gKi8KKworICB1aW50MzJfdCBBdXRvQmF1ZFJhdGVFbmFibGU7ICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgYXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIGlzIGVuYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRfQXV0b0JhdWRSYXRlX0VuYWJsZSAqLworCisgIHVpbnQzMl90IEF1dG9CYXVkUmF0ZU1vZGU7ICAgICAgLyohPCBJZiBhdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24gaXMgZW5hYmxlZCwgc3BlY2lmaWVzIGhvdyB0aGUgcmF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0aW9uIGlzIGNhcnJpZWQgb3V0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX0F1dG9CYXVkX1JhdGVfTW9kZS4gKi8KKworICB1aW50MzJfdCBNU0JGaXJzdDsgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgTVNCIGlzIHNlbnQgZmlyc3Qgb24gVUFSVCBsaW5lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX01TQl9GaXJzdC4gKi8KK30gVUFSVF9BZHZGZWF0dXJlSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgVUFSVCB3YWtlIHVwIGZyb20gc3RvcCBtb2RlIHBhcmFtZXRlcnMKKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFdha2VVcEV2ZW50OyAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hpY2ggZXZlbnQgd2lsbCBhY3RpdmF0IHRoZSBXYWtldXAgZnJvbSBTdG9wIG1vZGUgZmxhZyAoV1VGKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9XYWtlVXBfZnJvbV9TdG9wX1NlbGVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHNldCB0byBVQVJUX1dBS0VVUF9PTl9BRERSRVNTLCB0aGUgdHdvIG90aGVyIGZpZWxkcyBiZWxvdyBtdXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBmaWxsZWQgdXAuICovCisKKyAgdWludDE2X3QgQWRkcmVzc0xlbmd0aDsgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBhZGRyZXNzIGlzIDQgb3IgNy1iaXQgbG9uZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9XYWtlVXBfQWRkcmVzc19MZW5ndGguICAqLworCisgIHVpbnQ4X3QgQWRkcmVzczsgICAgICAgICAgICAgLyohPCBVQVJUL1VTQVJUIG5vZGUgYWRkcmVzcyAoNy1iaXQgbG9uZyBtYXgpLiAqLworfSBVQVJUX1dha2VVcFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiBIQUwgVUFSVCBTdGF0ZSBzdHJ1Y3R1cmVzIGRlZmluaXRpb24KKyAgKiBAbm90ZSAgSEFMIFVBUlQgU3RhdGUgdmFsdWUgaXMgYSBjb21iaW5hdGlvbiBvZiAyIGRpZmZlcmVudCBzdWJzdGF0ZXM6IGdTdGF0ZSBhbmQgUnhTdGF0ZS4KKyAgKiAgICAgICAgLSBnU3RhdGUgY29udGFpbnMgVUFSVCBzdGF0ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGdsb2JhbCBIYW5kbGUgbWFuYWdlbWVudCAKKyAgKiAgICAgICAgICBhbmQgYWxzbyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIFR4IG9wZXJhdGlvbnMuCisgICogICAgICAgICAgZ1N0YXRlIHZhbHVlIGNvZGluZyBmb2xsb3cgYmVsb3cgZGVzY3JpYmVkIGJpdG1hcCA6CisgICogICAgICAgICAgYjctYjYgIEVycm9yIGluZm9ybWF0aW9uIAorICAqICAgICAgICAgICAgIDAwIDogTm8gRXJyb3IKKyAgKiAgICAgICAgICAgICAwMSA6IChOb3QgVXNlZCkKKyAgKiAgICAgICAgICAgICAxMCA6IFRpbWVvdXQKKyAgKiAgICAgICAgICAgICAxMSA6IEVycm9yCisgICogICAgICAgICAgYjUgICAgIElQIGluaXRpbGlzYXRpb24gc3RhdHVzCisgICogICAgICAgICAgICAgMCAgOiBSZXNldCAoSVAgbm90IGluaXRpYWxpemVkKQorICAqICAgICAgICAgICAgIDEgIDogSW5pdCBkb25lIChJUCBub3QgaW5pdGlhbGl6ZWQuIEhBTCBVQVJUIEluaXQgZnVuY3Rpb24gYWxyZWFkeSBjYWxsZWQpCisgICogICAgICAgICAgYjQtYjMgIChub3QgdXNlZCkKKyAgKiAgICAgICAgICAgICB4eCA6IFNob3VsZCBiZSBzZXQgdG8gMDAKKyAgKiAgICAgICAgICBiMiAgICAgSW50cmluc2ljIHByb2Nlc3Mgc3RhdGUKKyAgKiAgICAgICAgICAgICAwICA6IFJlYWR5CisgICogICAgICAgICAgICAgMSAgOiBCdXN5IChJUCBidXN5IHdpdGggc29tZSBjb25maWd1cmF0aW9uIG9yIGludGVybmFsIG9wZXJhdGlvbnMpCisgICogICAgICAgICAgYjEgICAgIChub3QgdXNlZCkKKyAgKiAgICAgICAgICAgICB4ICA6IFNob3VsZCBiZSBzZXQgdG8gMAorICAqICAgICAgICAgIGIwICAgICBUeCBzdGF0ZQorICAqICAgICAgICAgICAgIDAgIDogUmVhZHkgKG5vIFR4IG9wZXJhdGlvbiBvbmdvaW5nKQorICAqICAgICAgICAgICAgIDEgIDogQnVzeSAoVHggb3BlcmF0aW9uIG9uZ29pbmcpCisgICogICAgICAgIC0gUnhTdGF0ZSBjb250YWlucyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIFJ4IG9wZXJhdGlvbnMuCisgICogICAgICAgICAgUnhTdGF0ZSB2YWx1ZSBjb2RpbmcgZm9sbG93IGJlbG93IGRlc2NyaWJlZCBiaXRtYXAgOgorICAqICAgICAgICAgIGI3LWI2ICAobm90IHVzZWQpCisgICogICAgICAgICAgICAgeHggOiBTaG91bGQgYmUgc2V0IHRvIDAwCisgICogICAgICAgICAgYjUgICAgIElQIGluaXRpbGlzYXRpb24gc3RhdHVzCisgICogICAgICAgICAgICAgMCAgOiBSZXNldCAoSVAgbm90IGluaXRpYWxpemVkKQorICAqICAgICAgICAgICAgIDEgIDogSW5pdCBkb25lIChJUCBub3QgaW5pdGlhbGl6ZWQpCisgICogICAgICAgICAgYjQtYjIgIChub3QgdXNlZCkKKyAgKiAgICAgICAgICAgIHh4eCA6IFNob3VsZCBiZSBzZXQgdG8gMDAwCisgICogICAgICAgICAgYjEgICAgIFJ4IHN0YXRlCisgICogICAgICAgICAgICAgMCAgOiBSZWFkeSAobm8gUnggb3BlcmF0aW9uIG9uZ29pbmcpCisgICogICAgICAgICAgICAgMSAgOiBCdXN5IChSeCBvcGVyYXRpb24gb25nb2luZykKKyAgKiAgICAgICAgICBiMCAgICAgKG5vdCB1c2VkKQorICAqICAgICAgICAgICAgIHggIDogU2hvdWxkIGJlIHNldCB0byAwLgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9VQVJUX1NUQVRFX1JFU0VUICAgICAgICAgICAgID0gMHgwMFUsICAgLyohPCBQZXJpcGhlcmFsIGlzIG5vdCBpbml0aWFsaXplZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIGFuZCBSeFN0YXRlICovCisgIEhBTF9VQVJUX1NUQVRFX1JFQURZICAgICAgICAgICAgID0gMHgyMFUsICAgLyohPCBQZXJpcGhlcmFsIEluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgYW5kIFJ4U3RhdGUgKi8KKyAgSEFMX1VBUlRfU1RBVEVfQlVTWSAgICAgICAgICAgICAgPSAweDI0VSwgICAvKiE8IGFuIGludGVybmFsIHByb2Nlc3MgaXMgb25nb2luZyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBvbmx5ICovCisgIEhBTF9VQVJUX1NUQVRFX0JVU1lfVFggICAgICAgICAgID0gMHgyMVUsICAgLyohPCBEYXRhIFRyYW5zbWlzc2lvbiBwcm9jZXNzIGlzIG9uZ29pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBvbmx5ICovCisgIEhBTF9VQVJUX1NUQVRFX0JVU1lfUlggICAgICAgICAgID0gMHgyMlUsICAgLyohPCBEYXRhIFJlY2VwdGlvbiBwcm9jZXNzIGlzIG9uZ29pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIFJ4U3RhdGUgb25seSAqLworICBIQUxfVUFSVF9TVEFURV9CVVNZX1RYX1JYICAgICAgICA9IDB4MjNVLCAgIC8qITwgRGF0YSBUcmFuc21pc3Npb24gYW5kIFJlY2VwdGlvbiBwcm9jZXNzIGlzIG9uZ29pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdCB0byBiZSB1c2VkIGZvciBuZWl0aGVyIGdTdGF0ZSBub3IgUnhTdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIHJlc3VsdCBvZiBjb21iaW5hdGlvbiAoT3IpIGJldHdlZW4gZ1N0YXRlIGFuZCBSeFN0YXRlIHZhbHVlcyAqLworICBIQUxfVUFSVF9TVEFURV9USU1FT1VUICAgICAgICAgICA9IDB4QTBVLCAgIC8qITwgVGltZW91dCBzdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIG9ubHkgKi8KKyAgSEFMX1VBUlRfU1RBVEVfRVJST1IgICAgICAgICAgICAgPSAweEUwVSAgICAvKiE8IEVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgb25seSAqLworfUhBTF9VQVJUX1N0YXRlVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmIFVBUlQgY2xvY2sgc291cmNlcyBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMSAgICAgID0gMHgwMFUsICAgIC8qITwgUENMSzEgY2xvY2sgc291cmNlICAgICAqLworICBVQVJUX0NMT0NLU09VUkNFX1BDTEsyICAgICAgPSAweDAxVSwgICAgLyohPCBQQ0xLMiBjbG9jayBzb3VyY2UgICAgICovCisgIFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJICAgICAgICA9IDB4MDJVLCAgICAvKiE8IEhTSSBjbG9jayBzb3VyY2UgICAgICAgKi8KKyAgVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEsgICAgID0gMHgwNFUsICAgIC8qITwgU1lTQ0xLIGNsb2NrIHNvdXJjZSAgICAqLworICBVQVJUX0NMT0NLU09VUkNFX0xTRSAgICAgICAgPSAweDA4VSwgICAgLyohPCBMU0UgY2xvY2sgc291cmNlICAgICAgICovCisgIFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEICA9IDB4MTBVICAgICAvKiE8IFVuZGVmaW5lZCBjbG9jayBzb3VyY2UgKi8KK31VQVJUX0Nsb2NrU291cmNlVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBVQVJUIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgVVNBUlRfVHlwZURlZiAgICAgICAgICAgICpJbnN0YW5jZTsgICAgICAgIC8qITwgVUFSVCByZWdpc3RlcnMgYmFzZSBhZGRyZXNzICAgICAgICAqLworCisgIFVBUlRfSW5pdFR5cGVEZWYgICAgICAgICBJbml0OyAgICAgICAgICAgICAvKiE8IFVBUlQgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICAgICAgKi8KKworICBVQVJUX0FkdkZlYXR1cmVJbml0VHlwZURlZiBBZHZhbmNlZEluaXQ7ICAgLyohPCBVQVJUIEFkdmFuY2VkIEZlYXR1cmVzIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgKi8KKworICB1aW50OF90ICAgICAgICAgICAgICAgICAgKnBUeEJ1ZmZQdHI7ICAgICAgLyohPCBQb2ludGVyIHRvIFVBUlQgVHggdHJhbnNmZXIgQnVmZmVyICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgIFR4WGZlclNpemU7ICAgICAgIC8qITwgVUFSVCBUeCBUcmFuc2ZlciBzaXplICAgICAgICAgICAgICAqLworCisgIF9fSU8gdWludDE2X3QgICAgICAgICAgICBUeFhmZXJDb3VudDsgICAgICAvKiE8IFVBUlQgVHggVHJhbnNmZXIgQ291bnRlciAgICAgICAgICAgKi8KKworICB1aW50OF90ICAgICAgICAgICAgICAgICAgKnBSeEJ1ZmZQdHI7ICAgICAgLyohPCBQb2ludGVyIHRvIFVBUlQgUnggdHJhbnNmZXIgQnVmZmVyICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgIFJ4WGZlclNpemU7ICAgICAgIC8qITwgVUFSVCBSeCBUcmFuc2ZlciBzaXplICAgICAgICAgICAgICAqLworCisgIF9fSU8gdWludDE2X3QgICAgICAgICAgICBSeFhmZXJDb3VudDsgICAgICAvKiE8IFVBUlQgUnggVHJhbnNmZXIgQ291bnRlciAgICAgICAgICAgKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgTWFzazsgICAgICAgICAgICAgLyohPCBVQVJUIFJ4IFJEUiByZWdpc3RlciBtYXNrICAgICAgICAgICovCisKKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICpoZG1hdHg7ICAgICAgICAgIC8qITwgVUFSVCBUeCBETUEgSGFuZGxlIHBhcmFtZXRlcnMgICAgICAqLworCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAqaGRtYXJ4OyAgICAgICAgICAvKiE8IFVBUlQgUnggRE1BIEhhbmRsZSBwYXJhbWV0ZXJzICAgICAgKi8KKworICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICAgIExvY2s7ICAgICAgICAgICAgLyohPCBMb2NraW5nIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyBIQUxfVUFSVF9TdGF0ZVR5cGVEZWYgICAgZ1N0YXRlOyAgICAgIC8qITwgVUFSVCBzdGF0ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGdsb2JhbCBIYW5kbGUgbWFuYWdlbWVudCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFsc28gcmVsYXRlZCB0byBUeCBvcGVyYXRpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhBTF9VQVJUX1N0YXRlVHlwZURlZiAqLworCisgIF9fSU8gSEFMX1VBUlRfU3RhdGVUeXBlRGVmICAgIFJ4U3RhdGU7ICAgICAvKiE8IFVBUlQgc3RhdGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBSeCBvcGVyYXRpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhBTF9VQVJUX1N0YXRlVHlwZURlZiAqLworCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgRXJyb3JDb2RlOyAgICAgICAvKiE8IFVBUlQgRXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgKi8KKworfVVBUlRfSGFuZGxlVHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVUFSVF9FeHBvcnRlZF9Db25zdGFudHMgVUFSVCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfRXJyb3IgVUFSVCBFcnJvcgorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9VQVJUX0VSUk9SX05PTkUgICAgICAoMHgwMDAwMDAwMFUpICAgIC8qITwgTm8gZXJyb3IgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfVUFSVF9FUlJPUl9QRSAgICAgICAgKDB4MDAwMDAwMDFVKSAgICAvKiE8IFBhcml0eSBlcnJvciAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1VBUlRfRVJST1JfTkUgICAgICAgICgweDAwMDAwMDAyVSkgICAgLyohPCBOb2lzZSBlcnJvciAgICAgICAgICovCisjZGVmaW5lIEhBTF9VQVJUX0VSUk9SX0ZFICAgICAgICAoMHgwMDAwMDAwNFUpICAgIC8qITwgZnJhbWUgZXJyb3IgICAgICAgICAqLworI2RlZmluZSBIQUxfVUFSVF9FUlJPUl9PUkUgICAgICAgKDB4MDAwMDAwMDhVKSAgICAvKiE8IE92ZXJydW4gZXJyb3IgICAgICAgKi8KKyNkZWZpbmUgSEFMX1VBUlRfRVJST1JfRE1BICAgICAgICgweDAwMDAwMDEwVSkgICAgLyohPCBETUEgdHJhbnNmZXIgZXJyb3IgICovCisjZGVmaW5lIEhBTF9VQVJUX0VSUk9SX0JVU1kgICAgICAoMHgwMDAwMDAyMFUpICAgIC8qITwgQnVzeSBFcnJvciAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8gCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9TdG9wX0JpdHMgICBVQVJUIE51bWJlciBvZiBTdG9wIEJpdHMKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX1NUT1BCSVRTXzBfNSAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjJfU1RPUF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBmcmFtZSB3aXRoIDAuNSBzdG9wIGJpdCAgKi8KKyNkZWZpbmUgVUFSVF9TVE9QQklUU18xICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgZnJhbWUgd2l0aCAxIHN0b3AgYml0ICAgICovCisjZGVmaW5lIFVBUlRfU1RPUEJJVFNfMV81ICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpKFVTQVJUX0NSMl9TVE9QXzAgfCBVU0FSVF9DUjJfU1RPUF8xKSkgLyohPCBVQVJUIGZyYW1lIHdpdGggMS41IHN0b3AgYml0cyAqLworI2RlZmluZSBVQVJUX1NUT1BCSVRTXzIgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVVTQVJUX0NSMl9TVE9QXzEpICAgICAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBmcmFtZSB3aXRoIDIgc3RvcCBiaXRzICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9QYXJpdHkgIFVBUlQgUGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9QQVJJVFlfTk9ORSAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE5vIHBhcml0eSAgICovCisjZGVmaW5lIFVBUlRfUEFSSVRZX0VWRU4gICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpVVNBUlRfQ1IxX1BDRSkgICAgICAgICAgICAgICAgICAgICAgLyohPCBFdmVuIHBhcml0eSAqLworI2RlZmluZSBVQVJUX1BBUklUWV9PREQgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShVU0FSVF9DUjFfUENFIHwgVVNBUlRfQ1IxX1BTKSkgICAgIC8qITwgT2RkIHBhcml0eSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9IYXJkd2FyZV9GbG93X0NvbnRyb2wgVUFSVCBIYXJkd2FyZSBGbG93IENvbnRyb2wKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0hXQ09OVFJPTF9OT05FICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTm8gaGFyZHdhcmUgY29udHJvbCAgICAgICAqLworI2RlZmluZSBVQVJUX0hXQ09OVFJPTF9SVFMgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClVU0FSVF9DUjNfUlRTRSkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUmVxdWVzdCBUbyBTZW5kICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0hXQ09OVFJPTF9DVFMgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClVU0FSVF9DUjNfQ1RTRSkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2xlYXIgVG8gU2VuZCAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0hXQ09OVFJPTF9SVFNfQ1RTICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoVVNBUlRfQ1IzX1JUU0UgfCBVU0FSVF9DUjNfQ1RTRSkpICAgIC8qITwgUmVxdWVzdCBhbmQgQ2xlYXIgVG8gU2VuZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX01vZGUgVUFSVCBUcmFuc2ZlciBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9NT0RFX1JYICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClVU0FSVF9DUjFfUkUpICAgICAgICAgICAgICAgICAgICAvKiE8IFJYIG1vZGUgICAgICAgICovIAorI2RlZmluZSBVQVJUX01PREVfVFggICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVVTQVJUX0NSMV9URSkgICAgICAgICAgICAgICAgICAgIC8qITwgVFggbW9kZSAgICAgICAgKi8gCisjZGVmaW5lIFVBUlRfTU9ERV9UWF9SWCAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpKFVTQVJUX0NSMV9URSB8VVNBUlRfQ1IxX1JFKSkgICAgLyohPCBSWCBhbmQgVFggbW9kZSAqLyAKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9TdGF0ZSAgVUFSVCBTdGF0ZQorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfU1RBVEVfRElTQUJMRSAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIGRpc2FibGVkICAqLworI2RlZmluZSBVQVJUX1NUQVRFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVVTQVJUX0NSMV9VRSkgICAgICAgIC8qITwgVUFSVCBlbmFibGVkICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9PdmVyX1NhbXBsaW5nIFVBUlQgT3ZlciBTYW1wbGluZworICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfT1ZFUlNBTVBMSU5HXzE2ICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgLyohPCBPdmVyc2FtcGxpbmcgYnkgMTZVICovCisjZGVmaW5lIFVBUlRfT1ZFUlNBTVBMSU5HXzggICAgICAgICAgICAgICAgICgodWludDMyX3QpVVNBUlRfQ1IxX09WRVI4KSAgICAgLyohPCBPdmVyc2FtcGxpbmcgYnkgOCAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9PbmVCaXRfU2FtcGxpbmcgVUFSVCBPbmUgQml0IFNhbXBsaW5nIE1ldGhvZAorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfT05FX0JJVF9TQU1QTEVfRElTQUJMRSAgICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgLyohPCBPbmUtYml0IHNhbXBsaW5nIGRpc2FibGUgKi8KKyNkZWZpbmUgVUFSVF9PTkVfQklUX1NBTVBMRV9FTkFCTEUgICAgICAgICAgKCh1aW50MzJfdClVU0FSVF9DUjNfT05FQklUKSAgICAvKiE8IE9uZS1iaXQgc2FtcGxpbmcgZW5hYmxlICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0F1dG9CYXVkX1JhdGVfTW9kZSAgICBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgQXV0b0JhdWQgUmF0ZSBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9PTlNUQVJUQklUICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAvKiE8IEF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiBvbiBzdGFydCBiaXQgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFX09ORkFMTElOR0VER0UgKCh1aW50MzJfdClVU0FSVF9DUjJfQUJSTU9ERV8wKSAgIC8qITwgQXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIG9uIGZhbGxpbmcgZWRnZSAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfT04wWDdGRlJBTUUgICAoKHVpbnQzMl90KVVTQVJUX0NSMl9BQlJNT0RFXzEpICAgLyohPCBBdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24gb24gMHg3RiBmcmFtZSBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9PTjBYNTVGUkFNRSAgICgodWludDMyX3QpVVNBUlRfQ1IyX0FCUk1PREUpICAgICAvKiE8IEF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiBvbiAweDU1IGZyYW1lIGRldGVjdGlvbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX1JlY2VpdmVyX1RpbWVPdXQgVUFSVCBSZWNlaXZlciBUaW1lT3V0CisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9SRUNFSVZFUl9USU1FT1VUX0RJU0FCTEUgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCByZWNlaXZlciB0aW1lb3V0IGRpc2FibGUgKi8KKyNkZWZpbmUgVUFSVF9SRUNFSVZFUl9USU1FT1VUX0VOQUJMRSAgICAgICAgKCh1aW50MzJfdClVU0FSVF9DUjJfUlRPRU4pICAgICAgICAgICAgIC8qITwgVUFSVCByZWNlaXZlciB0aW1lb3V0IGVuYWJsZSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9MSU4gICAgVUFSVCBMb2NhbCBJbnRlcmNvbm5lY3Rpb24gTmV0d29yayBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9MSU5fRElTQUJMRSAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBMb2NhbCBJbnRlcmNvbm5lY3QgTmV0d29yayBkaXNhYmxlICovCisjZGVmaW5lIFVBUlRfTElOX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpVVNBUlRfQ1IyX0xJTkVOKSAgICAgICAgICAgIC8qITwgTG9jYWwgSW50ZXJjb25uZWN0IE5ldHdvcmsgZW5hYmxlICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0xJTl9CcmVha19EZXRlY3Rpb24gIFVBUlQgTElOIEJyZWFrIERldGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfTElOQlJFQUtERVRFQ1RMRU5HVEhfMTBCICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBMSU4gMTAtYml0IGJyZWFrIGRldGVjdGlvbiBsZW5ndGggKi8KKyNkZWZpbmUgVUFSVF9MSU5CUkVBS0RFVEVDVExFTkdUSF8xMUIgICAgICAgKCh1aW50MzJfdClVU0FSVF9DUjJfTEJETCkgICAgICAgICAgICAvKiE8IExJTiAxMS1iaXQgYnJlYWsgZGV0ZWN0aW9uIGxlbmd0aCAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9ETUFfVHggICAgVUFSVCBETUEgVHgKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0RNQV9UWF9ESVNBQkxFICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBETUEgVFggZGlzYWJsZWQgKi8KKyNkZWZpbmUgVUFSVF9ETUFfVFhfRU5BQkxFICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClVU0FSVF9DUjNfRE1BVCkgICAgICAgICAgICAvKiE8IFVBUlQgRE1BIFRYIGVuYWJsZWQgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfRE1BX1J4ICAgVUFSVCBETUEgUngKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0RNQV9SWF9ESVNBQkxFICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIERNQSBSWCBkaXNhYmxlZCAqLworI2RlZmluZSBVQVJUX0RNQV9SWF9FTkFCTEUgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVVTQVJUX0NSM19ETUFSKSAgICAgICAgICAgICAgLyohPCBVQVJUIERNQSBSWCBlbmFibGVkICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0hhbGZfRHVwbGV4X1NlbGVjdGlvbiAgVUFSVCBIYWxmIER1cGxleCBTZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0hBTEZfRFVQTEVYX0RJU0FCTEUgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIGhhbGYtZHVwbGV4IGRpc2FibGVkICovCisjZGVmaW5lIFVBUlRfSEFMRl9EVVBMRVhfRU5BQkxFICAgICAgICAgICAgICgodWludDMyX3QpVVNBUlRfQ1IzX0hEU0VMKSAgICAgICAgICAgICAvKiE8IFVBUlQgaGFsZi1kdXBsZXggZW5hYmxlZCAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9XYWtlVXBfQWRkcmVzc19MZW5ndGggICAgVUFSVCBXYWtlVXAgQWRkcmVzcyBMZW5ndGgKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0FERFJFU1NfREVURUNUXzRCICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgIC8qITwgNC1iaXQgbG9uZyB3YWtlLXVwIGFkZHJlc3MgKi8KKyNkZWZpbmUgVUFSVF9BRERSRVNTX0RFVEVDVF83QiAgICAgICAgICAgICAgKCh1aW50MzJfdClVU0FSVF9DUjJfQURETTcpICAvKiE8IDctYml0IGxvbmcgd2FrZS11cCBhZGRyZXNzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfV2FrZVVwX01ldGhvZHMgICBVQVJUIFdha2VVcCBNZXRob2RzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9XQUtFVVBNRVRIT0RfSURMRUxJTkUgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCB3YWtlLXVwIG9uIGlkbGUgbGluZSAgICAqLworI2RlZmluZSBVQVJUX1dBS0VVUE1FVEhPRF9BRERSRVNTTUFSSyAgICAgICAoKHVpbnQzMl90KVVTQVJUX0NSMV9XQUtFKSAgICAgICAgICAgICAgLyohPCBVQVJUIHdha2UtdXAgb24gYWRkcmVzcyBtYXJrICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfRmxhZ3MgICAgIFVBUlQgU3RhdHVzIEZsYWdzCisgICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAweFhYWFgKKyAgKiAgICAgICAgICAgLSAweFhYWFggIDogRmxhZyBtYXNrIGluIHRoZSBJU1IgcmVnaXN0ZXIKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0ZMQUdfUkVBQ0sgICAgICAgICAgICAgICAgICAgICAoMHgwMDQwMDAwMFUpICAgICAgICAgICAgICAvKiE8IFVBUlQgcmVjZWl2ZSBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZyAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19URUFDSyAgICAgICAgICAgICAgICAgICAgICgweDAwMjAwMDAwVSkgICAgICAgICAgICAgIC8qITwgVUFSVCB0cmFuc21pdCBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZyAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX1dVRiAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAxMDAwMDBVKSAgICAgICAgICAgICAgLyohPCBVQVJUIHdha2UtdXAgZnJvbSBzdG9wIG1vZGUgZmxhZyAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfUldVICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDA4MDAwMFUpICAgICAgICAgICAgICAvKiE8IFVBUlQgcmVjZWl2ZXIgd2FrZS11cCBmcm9tIG11dGUgbW9kZSBmbGFnICovCisjZGVmaW5lIFVBUlRfRkxBR19TQktGICAgICAgICAgICAgICAgICAgICAgICgweDAwMDQwMDAwVSkgICAgICAgICAgICAgIC8qITwgVUFSVCBzZW5kIGJyZWFrIGZsYWcgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX0NNRiAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMjAwMDBVKSAgICAgICAgICAgICAgLyohPCBVQVJUIGNoYXJhY3RlciBtYXRjaCBmbGFnICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfQlVTWSAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAxMDAwMFUpICAgICAgICAgICAgICAvKiE8IFVBUlQgYnVzeSBmbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19BQlJGICAgICAgICAgICAgICAgICAgICAgICgweDAwMDA4MDAwVSkgICAgICAgICAgICAgIC8qITwgVUFSVCBhdXRvIEJhdWQgcmF0ZSBmbGFnICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX0FCUkUgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDQwMDBVKSAgICAgICAgICAgICAgLyohPCBVQVJUIGF1dG8gQmF1ZCByYXRlIGVycm9yICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfRU9CRiAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMTAwMFUpICAgICAgICAgICAgICAvKiE8IFVBUlQgZW5kIG9mIGJsb2NrIGZsYWcgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19SVE9GICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwODAwVSkgICAgICAgICAgICAgIC8qITwgVUFSVCByZWNlaXZlciB0aW1lb3V0IGZsYWcgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX0NUUyAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDA0MDBVKSAgICAgICAgICAgICAgLyohPCBVQVJUIGNsZWFyIHRvIHNlbmQgZmxhZyAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfQ1RTSUYgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDIwMFUpICAgICAgICAgICAgICAvKiE8IFVBUlQgY2xlYXIgdG8gc2VuZCBpbnRlcnJ1cHQgZmxhZyAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19MQkRGICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMTAwVSkgICAgICAgICAgICAgIC8qITwgVUFSVCBMSU4gYnJlYWsgZGV0ZWN0aW9uIGZsYWcgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX1RYRSAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwODBVKSAgICAgICAgICAgICAgLyohPCBVQVJUIHRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfVEMgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDA0MFUpICAgICAgICAgICAgICAvKiE8IFVBUlQgdHJhbnNtaXNzaW9uIGNvbXBsZXRlICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19SWE5FICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDIwVSkgICAgICAgICAgICAgIC8qITwgVUFSVCByZWFkIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5ICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX0lETEUgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMTBVKSAgICAgICAgICAgICAgLyohPCBVQVJUIGlkbGUgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfT1JFICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwOFUpICAgICAgICAgICAgICAvKiE8IFVBUlQgb3ZlcnJ1biBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19ORSAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDA0VSkgICAgICAgICAgICAgIC8qITwgVUFSVCBub2lzZSBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX0ZFICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDJVKSAgICAgICAgICAgICAgLyohPCBVQVJUIGZyYW1lIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfUEUgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMVUpICAgICAgICAgICAgICAvKiE8IFVBUlQgcGFyaXR5IGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfSW50ZXJydXB0X2RlZmluaXRpb24gICBVQVJUIEludGVycnVwdHMgRGVmaW5pdGlvbgorICAqICAgICAgICBFbGVtZW50cyB2YWx1ZXMgY29udmVudGlvbjogMDAwWlpaWlowWFhZWVlZWWIKKyAgKiAgICAgICAgICAgLSBZWVlZWSAgOiBJbnRlcnJ1cHQgc291cmNlIHBvc2l0aW9uIGluIHRoZSBYWCByZWdpc3RlciAoNWJpdHMpCisgICogICAgICAgICAgIC0gWFggIDogSW50ZXJydXB0IHNvdXJjZSByZWdpc3RlciAoMmJpdHMpCisgICogICAgICAgICAgICAgICAgIC0gMDE6IENSMSByZWdpc3RlcgorICAqICAgICAgICAgICAgICAgICAtIDEwOiBDUjIgcmVnaXN0ZXIKKyAgKiAgICAgICAgICAgICAgICAgLSAxMTogQ1IzIHJlZ2lzdGVyCisgICogICAgICAgICAgIC0gWlpaWlogIDogRmxhZyBwb3NpdGlvbiBpbiB0aGUgSVNSIHJlZ2lzdGVyKDViaXRzKQorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfSVRfUEUgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMjhVKSAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBwYXJpdHkgZXJyb3IgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0lUX1RYRSAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwNzI3VSkgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgdHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBpbnRlcnJ1cHRpb24gKi8KKyNkZWZpbmUgVUFSVF9JVF9UQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDYyNlUpICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHRpb24gICAgICAgICovCisjZGVmaW5lIFVBUlRfSVRfUlhORSAgICAgICAgICAgICAgICAgICAgICAgICgweDA1MjVVKSAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCByZWFkIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdGlvbiAqLworI2RlZmluZSBVQVJUX0lUX0lETEUgICAgICAgICAgICAgICAgICAgICAgICAoMHgwNDI0VSkgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgaWRsZSBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9JVF9MQkQgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDg0NlUpICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIExJTiBicmVhayBkZXRlY3Rpb24gaW50ZXJydXB0aW9uICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfSVRfQ1RTICAgICAgICAgICAgICAgICAgICAgICAgICgweDA5NkFVKSAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBDVFMgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0lUX0NNICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxMTJFVSkgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgY2hhcmFjdGVyIG1hdGNoIGludGVycnVwdGlvbiAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9JVF9XVUYgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MTQ3NlUpICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIHdha2UtdXAgZnJvbSBzdG9wIG1vZGUgaW50ZXJydXB0aW9uICAgICAgICovCisjZGVmaW5lIFVBUlRfSVRfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwNjBVKSAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBlcnJvciBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0lUX09SRSAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMzAwVSkgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgb3ZlcnJ1biBlcnJvciBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICAgKi8gCisjZGVmaW5lIFVBUlRfSVRfTkUgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAyMDBVKSAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBub2lzZSBlcnJvciBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICAgICAqLyAKKyNkZWZpbmUgVUFSVF9JVF9GRSAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDEwMFUpICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIGZyYW1lIGVycm9yIGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAgICovIAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0lUX0NMRUFSX0ZsYWdzICBVQVJUIEludGVycnVwdGlvbiBDbGVhciBGbGFncworICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfUEVGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfUEVDRiAgICAgICAgICAgIC8qITwgUGFyaXR5IEVycm9yIENsZWFyIEZsYWcgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfRkVGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfRkVDRiAgICAgICAgICAgIC8qITwgRnJhbWluZyBFcnJvciBDbGVhciBGbGFnICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfTkVGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfTkNGICAgICAgICAgICAgIC8qITwgTm9pc2UgZGV0ZWN0ZWQgQ2xlYXIgRmxhZyAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfT1JFRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfT1JFQ0YgICAgICAgICAgIC8qITwgT3ZlcnJ1biBFcnJvciBDbGVhciBGbGFnICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfSURMRUYgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfSURMRUNGICAgICAgICAgIC8qITwgSURMRSBsaW5lIGRldGVjdGVkIENsZWFyIEZsYWcgICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfVENGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfVENDRiAgICAgICAgICAgIC8qITwgVHJhbnNtaXNzaW9uIENvbXBsZXRlIENsZWFyIEZsYWcgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfTEJERiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfTEJEQ0YgICAgICAgICAgIC8qITwgTElOIEJyZWFrIERldGVjdGlvbiBDbGVhciBGbGFnICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfQ1RTRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfQ1RTQ0YgICAgICAgICAgIC8qITwgQ1RTIEludGVycnVwdCBDbGVhciBGbGFnICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfUlRPRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfUlRPQ0YgICAgICAgICAgIC8qITwgUmVjZWl2ZXIgVGltZSBPdXQgQ2xlYXIgRmxhZyAgICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfRU9CRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfRU9CQ0YgICAgICAgICAgIC8qITwgRW5kIE9mIEJsb2NrIENsZWFyIEZsYWcgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfQ01GICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfQ01DRiAgICAgICAgICAgIC8qITwgQ2hhcmFjdGVyIE1hdGNoIENsZWFyIEZsYWcgICAgICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfV1VGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfV1VDRiAgICAgICAgICAgIC8qITwgV2FrZSBVcCBmcm9tIHN0b3AgbW9kZSBDbGVhciBGbGFnICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfUmVxdWVzdF9QYXJhbWV0ZXJzIFVBUlQgUmVxdWVzdCBQYXJhbWV0ZXJzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9BVVRPQkFVRF9SRVFVRVNUICAgICAgICAgICAgICAgKCh1aW50MzJfdClVU0FSVF9SUVJfQUJSUlEpICAgICAgICAvKiE8IEF1dG8tQmF1ZCBSYXRlIFJlcXVlc3QgICAgICAqLworI2RlZmluZSBVQVJUX1NFTkRCUkVBS19SRVFVRVNUICAgICAgICAgICAgICAoKHVpbnQzMl90KVVTQVJUX1JRUl9TQktSUSkgICAgICAgIC8qITwgU2VuZCBCcmVhayBSZXF1ZXN0ICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfTVVURV9NT0RFX1JFUVVFU1QgICAgICAgICAgICAgICgodWludDMyX3QpVVNBUlRfUlFSX01NUlEpICAgICAgICAgLyohPCBNdXRlIE1vZGUgUmVxdWVzdCAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCAgICAgICAgICAgKCh1aW50MzJfdClVU0FSVF9SUVJfUlhGUlEpICAgICAgICAvKiE8IFJlY2VpdmUgRGF0YSBmbHVzaCBSZXF1ZXN0ICAqLworI2RlZmluZSBVQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUICAgICAgICAgICAoKHVpbnQzMl90KVVTQVJUX1JRUl9UWEZSUSkgICAgICAgIC8qITwgVHJhbnNtaXQgZGF0YSBmbHVzaCBSZXF1ZXN0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfQWR2YW5jZWRfRmVhdHVyZXNfSW5pdGlhbGl6YXRpb25fVHlwZSAgVUFSVCBBZHZhbmNlZCBGZWF0dXJlIEluaXRpYWxpemF0aW9uIFR5cGUKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfTk9fSU5JVCAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAvKiE8IE5vIGFkdmFuY2VkIGZlYXR1cmUgaW5pdGlhbGl6YXRpb24gICAgICAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX1RYSU5WRVJUX0lOSVQgICAgICAgICAgICgweDAwMDAwMDAxVSkgICAgICAgICAgLyohPCBUWCBwaW4gYWN0aXZlIGxldmVsIGludmVyc2lvbiAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9SWElOVkVSVF9JTklUICAgICAgICAgICAoMHgwMDAwMDAwMlUpICAgICAgICAgIC8qITwgUlggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfREFUQUlOVkVSVF9JTklUICAgICAgICAgKDB4MDAwMDAwMDRVKSAgICAgICAgICAvKiE8IEJpbmFyeSBkYXRhIGludmVyc2lvbiAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX1NXQVBfSU5JVCAgICAgICAgICAgICAgICgweDAwMDAwMDA4VSkgICAgICAgICAgLyohPCBUWC9SWCBwaW5zIHN3YXAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9SWE9WRVJSVU5ESVNBQkxFX0lOSVQgICAoMHgwMDAwMDAxMFUpICAgICAgICAgIC8qITwgUlggb3ZlcnJ1biBkaXNhYmxlICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfRE1BRElTQUJMRU9ORVJST1JfSU5JVCAgKDB4MDAwMDAwMjBVKSAgICAgICAgICAvKiE8IERNQSBkaXNhYmxlIG9uIFJlY2VwdGlvbiBFcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9JTklUICAgICAgICgweDAwMDAwMDQwVSkgICAgICAgICAgLyohPCBBdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24gaW5pdGlhbGl6YXRpb24gICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9NU0JGSVJTVF9JTklUICAgICAgICAgICAoMHgwMDAwMDA4MFUpICAgICAgICAgIC8qITwgTW9zdCBzaWduaWZpY2FudCBiaXQgc2VudC9yZWNlaXZlZCBmaXJzdCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX1R4X0ludiBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgVFggUGluIEFjdGl2ZSBMZXZlbCBJbnZlcnNpb24KKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfVFhJTlZfRElTQUJMRSAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRYIHBpbiBhY3RpdmUgbGV2ZWwgaW52ZXJzaW9uIGRpc2FibGUgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX1RYSU5WX0VOQUJMRSAgICAgICAgKCh1aW50MzJfdClVU0FSVF9DUjJfVFhJTlYpICAgICAgICAgLyohPCBUWCBwaW4gYWN0aXZlIGxldmVsIGludmVyc2lvbiBlbmFibGUgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfUnhfSW52IFVBUlQgQWR2YW5jZWQgRmVhdHVyZSBSWCBQaW4gQWN0aXZlIExldmVsIEludmVyc2lvbgorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9SWElOVl9ESVNBQkxFICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUlggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gZGlzYWJsZSAqLyAKKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX1JYSU5WX0VOQUJMRSAgICAgICAgKCh1aW50MzJfdClVU0FSVF9DUjJfUlhJTlYpICAgICAgICAgLyohPCBSWCBwaW4gYWN0aXZlIGxldmVsIGludmVyc2lvbiBlbmFibGUgICovIAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0RhdGFfSW52ICBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgQmluYXJ5IERhdGEgSW52ZXJzaW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX0RBVEFJTlZfRElTQUJMRSAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCaW5hcnkgZGF0YSBpbnZlcnNpb24gZGlzYWJsZSAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfREFUQUlOVl9FTkFCTEUgICAgICAoKHVpbnQzMl90KVVTQVJUX0NSMl9EQVRBSU5WKSAgICAgICAvKiE8IEJpbmFyeSBkYXRhIGludmVyc2lvbiBlbmFibGUgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfUnhfVHhfU3dhcCBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgUlggVFggUGlucyBTd2FwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX1NXQVBfRElTQUJMRSAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUWC9SWCBwaW5zIHN3YXAgZGlzYWJsZSAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfU1dBUF9FTkFCTEUgICAgICAgICAoKHVpbnQzMl90KVVTQVJUX0NSMl9TV0FQKSAgICAgICAgICAvKiE8IFRYL1JYIHBpbnMgc3dhcCBlbmFibGUgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfT3ZlcnJ1bl9EaXNhYmxlICBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgT3ZlcnJ1biBEaXNhYmxlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX09WRVJSVU5fRU5BQkxFICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSWCBvdmVycnVuIGVuYWJsZSAgKi8gCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9PVkVSUlVOX0RJU0FCTEUgICAgICgodWludDMyX3QpVVNBUlRfQ1IzX09WUkRJUykgICAgICAgIC8qITwgUlggb3ZlcnJ1biBkaXNhYmxlICovIAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0F1dG9CYXVkUmF0ZV9FbmFibGUgIFVBUlQgQWR2YW5jZWQgRmVhdHVyZSBBdXRvIEJhdWRSYXRlIEVuYWJsZQorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfRElTQUJMRSAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgIC8qITwgUlggQXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIGVuYWJsZSAgKi8gCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfRU5BQkxFICAgICgodWludDMyX3QpVVNBUlRfQ1IyX0FCUkVOKSAgICAgIC8qITwgUlggQXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIGRpc2FibGUgKi8gCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfRE1BX0Rpc2FibGVfb25fUnhfRXJyb3IgICBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgRE1BIERpc2FibGUgT24gUnggRXJyb3IKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfRE1BX0VOQUJMRU9OUlhFUlJPUiAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAvKiE8IERNQSBlbmFibGUgb24gUmVjZXB0aW9uIEVycm9yICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfRE1BX0RJU0FCTEVPTlJYRVJST1IgICAoKHVpbnQzMl90KVVTQVJUX0NSM19ERFJFKSAgICAgICAvKiE8IERNQSBkaXNhYmxlIG9uIFJlY2VwdGlvbiBFcnJvciAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX01TQl9GaXJzdCAgIFVBUlQgQWR2YW5jZWQgRmVhdHVyZSBNU0IgRmlyc3QKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfTVNCRklSU1RfRElTQUJMRSAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1vc3Qgc2lnbmlmaWNhbnQgYml0IHNlbnQvcmVjZWl2ZWQgZmlyc3QgZGlzYWJsZSAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfTVNCRklSU1RfRU5BQkxFICAgICAoKHVpbnQzMl90KVVTQVJUX0NSMl9NU0JGSVJTVCkgICAgICAvKiE8IE1vc3Qgc2lnbmlmaWNhbnQgYml0IHNlbnQvcmVjZWl2ZWQgZmlyc3QgZW5hYmxlICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX1N0b3BfTW9kZV9FbmFibGUgICBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgU3RvcCBNb2RlIEVuYWJsZQorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9TVE9QTU9ERV9ESVNBQkxFICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBzdG9wIG1vZGUgZGlzYWJsZSAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfU1RPUE1PREVfRU5BQkxFICAgICAoKHVpbnQzMl90KVVTQVJUX0NSMV9VRVNNKSAgICAgICAgICAvKiE8IFVBUlQgc3RvcCBtb2RlIGVuYWJsZSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9NdXRlX01vZGUgICBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgTXV0ZSBNb2RlIEVuYWJsZQorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9NVVRFTU9ERV9ESVNBQkxFICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBtdXRlIG1vZGUgZGlzYWJsZSAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfTVVURU1PREVfRU5BQkxFICAgICAoKHVpbnQzMl90KVVTQVJUX0NSMV9NTUUpICAgICAgICAgICAvKiE8IFVBUlQgbXV0ZSBtb2RlIGVuYWJsZSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9DUjJfQUREUkVTU19MU0JfUE9TICAgIFVBUlQgQWRkcmVzcy1tYXRjaGluZyBMU0IgUG9zaXRpb24gSW4gQ1IyIFJlZ2lzdGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9DUjJfQUREUkVTU19MU0JfUE9TICAgICAgICAgICAgKCAyNFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIGFkZHJlc3MtbWF0Y2hpbmcgTFNCIHBvc2l0aW9uIGluIENSMiByZWdpc3RlciAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX1dha2VVcF9mcm9tX1N0b3BfU2VsZWN0aW9uICAgVUFSVCBXYWtlVXAgRnJvbSBTdG9wIFNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfV0FLRVVQX09OX0FERFJFU1MgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCB3YWtlLXVwIG9uIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9XQUtFVVBfT05fU1RBUlRCSVQgICAgICAgICAgICAgKCh1aW50MzJfdClVU0FSVF9DUjNfV1VTXzEpICAgICAgICAgLyohPCBVQVJUIHdha2UtdXAgb24gc3RhcnQgYml0ICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX1dBS0VVUF9PTl9SRUFEREFUQV9OT05FTVBUWSAgICAoKHVpbnQzMl90KVVTQVJUX0NSM19XVVMpICAgICAgICAgICAvKiE8IFVBUlQgd2FrZS11cCBvbiByZWNlaXZlIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfRHJpdmVyRW5hYmxlX1BvbGFyaXR5ICAgICAgVUFSVCBEcml2ZXJFbmFibGUgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0RFX1BPTEFSSVRZX0hJR0ggICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERyaXZlciBlbmFibGUgc2lnbmFsIGlzIGFjdGl2ZSBoaWdoICovCisjZGVmaW5lIFVBUlRfREVfUE9MQVJJVFlfTE9XICAgICAgICAgICAgICAgICgodWludDMyX3QpVVNBUlRfQ1IzX0RFUCkgICAgICAgICAgIC8qITwgRHJpdmVyIGVuYWJsZSBzaWduYWwgaXMgYWN0aXZlIGxvdyAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9DUjFfREVBVF9BRERSRVNTX0xTQl9QT1MgICAgVUFSVCBEcml2ZXIgRW5hYmxlIEFzc2VydGlvbiBUaW1lIExTQiBQb3NpdGlvbiBJbiBDUjEgUmVnaXN0ZXIKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0NSMV9ERUFUX0FERFJFU1NfTFNCX1BPUyAgICAgICAoIDIxVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgRHJpdmVyIEVuYWJsZSBhc3NlcnRpb24gdGltZSBMU0IgcG9zaXRpb24gaW4gQ1IxIHJlZ2lzdGVyICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfQ1IxX0RFRFRfQUREUkVTU19MU0JfUE9TICAgIFVBUlQgRHJpdmVyIEVuYWJsZSBEZUFzc2VydGlvbiBUaW1lIExTQiBQb3NpdGlvbiBJbiBDUjEgUmVnaXN0ZXIKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0NSMV9ERURUX0FERFJFU1NfTFNCX1BPUyAgICAgICAoIDE2VSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgRHJpdmVyIEVuYWJsZSBkZS1hc3NlcnRpb24gdGltZSBMU0IgcG9zaXRpb24gaW4gQ1IxIHJlZ2lzdGVyICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfSW50ZXJydXB0aW9uX01hc2sgICAgVUFSVCBJbnRlcnJ1cHRpb25zIEZsYWcgTWFzaworICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfSVRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMUZVKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBpbnRlcnJ1cHRpb25zIGZsYWdzIG1hc2sgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9UaW1lT3V0X1ZhbHVlICAgIFVBUlQgcG9sbGluZy1iYXNlZCBjb21tdW5pY2F0aW9ucyB0aW1lLW91dCB2YWx1ZQorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9VQVJUX1RJTUVPVVRfVkFMVUUgICAgICAgICAgICAgIDB4MUZGRkZGRiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBwb2xsaW5nLWJhc2VkIGNvbW11bmljYXRpb25zIHRpbWUtb3V0IHZhbHVlICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVQVJUX0V4cG9ydGVkX01hY3JvcyBVQVJUIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIFJlc2V0IFVBUlQgaGFuZGxlIHN0YXRlcy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRVNFVDsgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVTRVQ7ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisvKiogQGJyaWVmICBGbHVzaCB0aGUgVUFSVCBEYXRhIHJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9GTFVTSF9EUlJFR0lTVEVSKF9fSEFORExFX18pICBcCisgIGRveyAgICAgICAgICAgICAgICBcCisgICAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlJRUiwgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7IFwKKyAgICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UlFSLCBVQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUKTsgXAorICAgIH0gIHdoaWxlKDBVKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgc3BlY2lmaWVkIFVBUlQgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9QRUYgICAgICBQYXJpdHkgRXJyb3IgQ2xlYXIgRmxhZyAgICAgICAgICAgCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9GRUYgICAgICBGcmFtaW5nIEVycm9yIENsZWFyIEZsYWcgICAgICAgICAgCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9ORUYgICAgICBOb2lzZSBkZXRlY3RlZCBDbGVhciBGbGFnICAgICAgICAgCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9PUkVGICAgICBPdmVycnVuIEVycm9yIENsZWFyIEZsYWcgICAgICAgICAgCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9JRExFRiAgICBJRExFIGxpbmUgZGV0ZWN0ZWQgQ2xlYXIgRmxhZyAgICAgCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9UQ0YgICAgICBUcmFuc21pc3Npb24gQ29tcGxldGUgQ2xlYXIgRmxhZyAgCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9MQkRGICAgICBMSU4gQnJlYWsgRGV0ZWN0aW9uIENsZWFyIEZsYWcgIChub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfQ1RTRiAgICAgQ1RTIEludGVycnVwdCBDbGVhciBGbGFnICAgICAgICAgIAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfUlRPRiAgICAgUmVjZWl2ZXIgVGltZSBPdXQgQ2xlYXIgRmxhZyAgICAgIAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfRU9CRiAgICAgRW5kIE9mIEJsb2NrIENsZWFyIEZsYWcgKG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMpCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9DTUYgICAgICBDaGFyYWN0ZXIgTWF0Y2ggQ2xlYXIgRmxhZyAgICAgICAgCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9XVUYgICAgICBXYWtlIFVwIGZyb20gc3RvcCBtb2RlIENsZWFyIEZsYWcgKG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMpCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklDUiA9IChfX0ZMQUdfXykpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBVQVJUIFBFIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9DTEVBUl9QRUZMQUcoX19IQU5ETEVfXykgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBVQVJUX0NMRUFSX1BFRikKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFVBUlQgRkUgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VQVJUX0NMRUFSX0ZFRkxBRyhfX0hBTkRMRV9fKSAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFVBUlRfQ0xFQVJfRkVGKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgVUFSVCBORSBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfQ0xFQVJfTkVGTEFHKF9fSEFORExFX18pICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBVQVJUX0NMRUFSX05FRikKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFVBUlQgT1JFIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9DTEVBUl9PUkVGTEFHKF9fSEFORExFX18pICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgVUFSVF9DTEVBUl9PUkVGKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgVUFSVCBJRExFIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9DTEVBUl9JRExFRkxBRyhfX0hBTkRMRV9fKSAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFVBUlRfQ0xFQVJfSURMRUYpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVQVJUIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfUkVBQ0sgUmVjZWl2ZSBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19URUFDSyBUcmFuc21pdCBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19XVUYgICBXYWtlIHVwIGZyb20gc3RvcCBtb2RlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfUldVICAgUmVjZWl2ZXIgd2FrZSB1cCBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1NCS0YgIFNlbmQgQnJlYWsgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19DTUYgICBDaGFyYWN0ZXIgbWF0Y2ggZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19CVVNZICBCdXN5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfQUJSRiAgQXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfQUJSRSAgQXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIGVycm9yIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfRU9CRiAgRW5kIG9mIGJsb2NrIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfUlRPRiAgUmVjZWl2ZXIgdGltZW91dCBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX0NUUyAgIENUUyBDaGFuZ2UgZmxhZyAobm90IGF2YWlsYWJsZSBmb3IgVUFSVDQgYW5kIFVBUlQ1KQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19MQkRGICBMSU4gQnJlYWsgZGV0ZWN0aW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfVFhFICAgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1RDICAgIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1JYTkUgIFJlY2VpdmUgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19JRExFICBJZGxlIExpbmUgZGV0ZWN0aW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfT1JFICAgT3ZlcnJ1biBFcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX05FICAgIE5vaXNlIEVycm9yIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfRkUgICAgRnJhbWluZyBFcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1BFICAgIFBhcml0eSBFcnJvciBmbGFnCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRkxBR19fIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgJiAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKQorCisvKiogQGJyaWVmICBFbmFibGUgdGhlIHNwZWNpZmllZCBVQVJUIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBVQVJUIGludGVycnVwdCBzb3VyY2UgdG8gZW5hYmxlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9XVUYgIFdha2V1cCBmcm9tIHN0b3AgbW9kZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0NNICAgQ2hhcmFjdGVyIG1hdGNoIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfQ1RTICBDVFMgY2hhbmdlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfTEJEICBMSU4gQnJlYWsgZGV0ZWN0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVFhFICBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVEMgICBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SWE5FIFJlY2VpdmUgRGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9JRExFIElkbGUgbGluZSBkZXRlY3Rpb24gaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9QRSAgIFBhcml0eSBFcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0VSUiAgRXJyb3IgaW50ZXJydXB0IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgKCgoKCh1aW50OF90KShfX0lOVEVSUlVQVF9fKSkgPj4gNVUpID09IDFVKT8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSB8PSAoMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFVBUlRfSVRfTUFTSykpKTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgodWludDhfdCkoX19JTlRFUlJVUFRfXykpID4+IDVVKSA9PSAyVSk/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgfD0gKDFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBVQVJUX0lUX01BU0spKSk6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMyB8PSAoMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFVBUlRfSVRfTUFTSykpKSkKKworCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgVUFSVCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgVUFSVCBpbnRlcnJ1cHQgc291cmNlIHRvIGRpc2FibGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1dVRiAgV2FrZXVwIGZyb20gc3RvcCBtb2RlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfQ00gICBDaGFyYWN0ZXIgbWF0Y2ggaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9DVFMgIENUUyBjaGFuZ2UgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9MQkQgIExJTiBCcmVhayBkZXRlY3Rpb24gaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UWEUgIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UQyAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYTkUgUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0lETEUgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1BFICAgUGFyaXR5IEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfRVJSICBFcnJvciBpbnRlcnJ1cHQgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9ESVNBQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAoKCgoKHVpbnQ4X3QpKF9fSU5URVJSVVBUX18pKSA+PiA1VSkgPT0gMVUpPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICY9IH4gKDFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBVQVJUX0lUX01BU0spKSk6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKHVpbnQ4X3QpKF9fSU5URVJSVVBUX18pKSA+PiA1VSkgPT0gMlUpPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyICY9IH4gKDFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBVQVJUX0lUX01BU0spKSk6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMyAmPSB+ICgxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgVUFSVF9JVF9NQVNLKSkpKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVUFSVCBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSVRfXyBzcGVjaWZpZXMgdGhlIFVBUlQgaW50ZXJydXB0IHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9XVUYgIFdha2V1cCBmcm9tIHN0b3AgbW9kZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0NNICAgQ2hhcmFjdGVyIG1hdGNoIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfQ1RTICBDVFMgY2hhbmdlIGludGVycnVwdCAobm90IGF2YWlsYWJsZSBmb3IgVUFSVDQgYW5kIFVBUlQ1KQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfTEJEICBMSU4gQnJlYWsgZGV0ZWN0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVFhFICBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVEMgICBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SWE5FIFJlY2VpdmUgRGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9JRExFIElkbGUgbGluZSBkZXRlY3Rpb24gaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9PUkUgIE92ZXJydW4gRXJyb3IgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9ORSAgIE5vaXNlIEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfRkUgICBGcmFtaW5nIEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUEUgICBQYXJpdHkgRXJyb3IgaW50ZXJydXB0CisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fSVRfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfR0VUX0lUKF9fSEFORExFX18sIF9fSVRfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmICgxVSA8PCAoKF9fSVRfXyk+PiAweDA4VSkpKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVUFSVCBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JVF9fIHNwZWNpZmllcyB0aGUgVUFSVCBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9XVUYgIFdha2V1cCBmcm9tIHN0b3AgbW9kZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0NNICAgQ2hhcmFjdGVyIG1hdGNoIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfQ1RTICBDVFMgY2hhbmdlIGludGVycnVwdCAobm90IGF2YWlsYWJsZSBmb3IgVUFSVDQgYW5kIFVBUlQ1KQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfTEJEICBMSU4gQnJlYWsgZGV0ZWN0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVFhFICBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVEMgICBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SWE5FIFJlY2VpdmUgRGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9JRExFIElkbGUgbGluZSBkZXRlY3Rpb24gaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9FUlIgIEVycm9yIGludGVycnVwdCAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUEUgICBQYXJpdHkgRXJyb3IgaW50ZXJydXB0CisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fSVRfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lUX18pICgoKCgoKHVpbnQ4X3QpKF9fSVRfXykpID4+IDVVKSA9PSAxVSk/IChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMTooKCgoKHVpbnQ4X3QpKF9fSVRfXykpID4+IDVVKSA9PSAyVSk/IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgOiAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMpKSAmICgxVSA8PCAoKCh1aW50MTZfdCkoX19JVF9fKSkgJiBVQVJUX0lUX01BU0spKSkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBVQVJUIElTUiBmbGFnLCBpbiBzZXR0aW5nIHRoZSBwcm9wZXIgSUNSIHJlZ2lzdGVyIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHBhcmFtICBfX0lUX0NMRUFSX18gc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgY2xlYXIgcmVnaXN0ZXIgZmxhZyB0aGF0IG5lZWRzIHRvIGJlIHNldAorICAqICAgICAgICAgICAgICAgICAgICAgICB0byBjbGVhciB0aGUgY29ycmVzcG9uZGluZyBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfUEVGIFBhcml0eSBFcnJvciBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9GRUYgRnJhbWluZyBFcnJvciBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9ORUYgTm9pc2UgZGV0ZWN0ZWQgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfT1JFRiBPdmVycnVuIEVycm9yIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX0lETEVGIElETEUgbGluZSBkZXRlY3RlZCBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9UQ0YgVHJhbnNtaXNzaW9uIENvbXBsZXRlIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX0xCREYgTElOIEJyZWFrIERldGVjdGlvbiBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9DVFNGIENUUyBJbnRlcnJ1cHQgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfUlRPRiBSZWNlaXZlciBUaW1lIE91dCBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9FT0JGIEVuZCBPZiBCbG9jayBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9DTUYgQ2hhcmFjdGVyIE1hdGNoIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX1dVRiAgV2FrZSBVcCBmcm9tIHN0b3AgbW9kZSBDbGVhciBGbGFnCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfQ0xFQVJfSVQoX19IQU5ETEVfXywgX19JVF9DTEVBUl9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUNSID0gKHVpbnQzMl90KShfX0lUX0NMRUFSX18pKQorCisvKiogQGJyaWVmICBTZXQgYSBzcGVjaWZpYyBVQVJUIHJlcXVlc3QgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fUkVRX18gc3BlY2lmaWVzIHRoZSByZXF1ZXN0IGZsYWcgdG8gc2V0CisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0FVVE9CQVVEX1JFUVVFU1QgQXV0by1CYXVkIFJhdGUgUmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfU0VOREJSRUFLX1JFUVVFU1QgU2VuZCBCcmVhayBSZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9NVVRFX01PREVfUkVRVUVTVCBNdXRlIE1vZGUgUmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QgUmVjZWl2ZSBEYXRhIGZsdXNoIFJlcXVlc3QKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUIFRyYW5zbWl0IGRhdGEgZmx1c2ggUmVxdWVzdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VQVJUX1NFTkRfUkVRKF9fSEFORExFX18sIF9fUkVRX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SUVIgfD0gKHVpbnQzMl90KShfX1JFUV9fKSkKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBVQVJUIG9uZSBiaXQgc2FtcGxlIG1ldGhvZC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4gIAorICAqIEByZXR2YWwgTm9uZQorICAqLyAgICAgCisjZGVmaW5lIF9fSEFMX1VBUlRfT05FX0JJVF9TQU1QTEVfRU5BQkxFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjN8PSBVU0FSVF9DUjNfT05FQklUKQorCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBVQVJUIG9uZSBiaXQgc2FtcGxlIG1ldGhvZC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4gIAorICAqIEByZXR2YWwgTm9uZQorICAqLyAgICAgIAorI2RlZmluZSBfX0hBTF9VQVJUX09ORV9CSVRfU0FNUExFX0RJU0FCTEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMyAmPSAodWludDMyX3QpfigodWludDMyX3QpVVNBUlRfQ1IzX09ORUJJVCkpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSBVQVJULgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VQVJUX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxIHw9ICBVU0FSVF9DUjFfVUUpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgVUFSVC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmPSAgflVTQVJUX0NSMV9VRSkKKworLyoqIEBicmllZiAgRW5hYmxlIENUUyBmbG93IGNvbnRyb2wuCisgICogQG5vdGUgICBUaGlzIG1hY3JvIGFsbG93cyB0byBlbmFibGUgQ1RTIGhhcmR3YXJlIGZsb3cgY29udHJvbCBmb3IgYSBnaXZlbiBVQVJUIGluc3RhbmNlLCAKKyAgKiAgICAgICAgIHdpdGhvdXQgbmVlZCB0byBjYWxsIEhBTF9VQVJUX0luaXQoKSBmdW5jdGlvbi4KKyAgKiAgICAgICAgIEFzIGludm9sdmluZyBkaXJlY3QgYWNjZXNzIHRvIFVBUlQgcmVnaXN0ZXJzLCB1c2FnZSBvZiB0aGlzIG1hY3JvIHNob3VsZCBiZSBmdWxseSBlbmRvcnNlZCBieSB1c2VyLgorICAqIEBub3RlICAgQXMgbWFjcm8gaXMgZXhwZWN0ZWQgdG8gYmUgdXNlZCBmb3IgbW9kaWZ5aW5nIENUUyBIdyBmbG93IGNvbnRyb2wgZmVhdHVyZSBhY3RpdmF0aW9uLCB3aXRob3V0IG5lZWQKKyAgKiAgICAgICAgIGZvciBVU0FSVCBpbnN0YW5jZSBEZWluaXQvSW5pdCwgZm9sbG93aW5nIGNvbmRpdGlvbnMgZm9yIG1hY3JvIGNhbGwgc2hvdWxkIGJlIGZ1bGZpbGxlZCA6CisgICogICAgICAgICAgIC0gVUFSVCBpbnN0YW5jZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gaW5pdGlhbGlzZWQgKHRocm91Z2ggY2FsbCBvZiBIQUxfVUFSVF9Jbml0KCkgKQorICAqICAgICAgICAgICAtIG1hY3JvIGNvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gY29ycmVzcG9uZGluZyBVQVJUIGluc3RhbmNlIGlzIGRpc2FibGVkIChpLmUuIF9fSEFMX1VBUlRfRElTQUJMRShfX0hBTkRMRV9fKSkKKyAgKiAgICAgICAgICAgICBhbmQgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGFuIEVuYWJsZSBtYWNybyAoaS5lLiBfX0hBTF9VQVJUX0VOQUJMRShfX0hBTkRMRV9fKSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfSFdDT05UUk9MX0NUU19FTkFCTEUoX19IQU5ETEVfXykgICAgICAgIFwKKyAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfQ1RTRSk7ICBcCisgICAgKF9fSEFORExFX18pLT5Jbml0Lkh3Rmxvd0N0bCB8PSBVU0FSVF9DUjNfQ1RTRTsgICAgICAgIFwKKyAgfSB3aGlsZSgwVSkKKworLyoqIEBicmllZiAgRGlzYWJsZSBDVFMgZmxvdyBjb250cm9sLgorICAqIEBub3RlICAgVGhpcyBtYWNybyBhbGxvd3MgdG8gZGlzYWJsZSBDVFMgaGFyZHdhcmUgZmxvdyBjb250cm9sIGZvciBhIGdpdmVuIFVBUlQgaW5zdGFuY2UsIAorICAqICAgICAgICAgd2l0aG91dCBuZWVkIHRvIGNhbGwgSEFMX1VBUlRfSW5pdCgpIGZ1bmN0aW9uLgorICAqICAgICAgICAgQXMgaW52b2x2aW5nIGRpcmVjdCBhY2Nlc3MgdG8gVUFSVCByZWdpc3RlcnMsIHVzYWdlIG9mIHRoaXMgbWFjcm8gc2hvdWxkIGJlIGZ1bGx5IGVuZG9yc2VkIGJ5IHVzZXIuCisgICogQG5vdGUgICBBcyBtYWNybyBpcyBleHBlY3RlZCB0byBiZSB1c2VkIGZvciBtb2RpZnlpbmcgQ1RTIEh3IGZsb3cgY29udHJvbCBmZWF0dXJlIGFjdGl2YXRpb24sIHdpdGhvdXQgbmVlZAorICAqICAgICAgICAgZm9yIFVTQVJUIGluc3RhbmNlIERlaW5pdC9Jbml0LCBmb2xsb3dpbmcgY29uZGl0aW9ucyBmb3IgbWFjcm8gY2FsbCBzaG91bGQgYmUgZnVsZmlsbGVkIDoKKyAgKiAgICAgICAgICAgLSBVQVJUIGluc3RhbmNlIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXNlZCAodGhyb3VnaCBjYWxsIG9mIEhBTF9VQVJUX0luaXQoKSApCisgICogICAgICAgICAgIC0gbWFjcm8gY291bGQgb25seSBiZSBjYWxsZWQgd2hlbiBjb3JyZXNwb25kaW5nIFVBUlQgaW5zdGFuY2UgaXMgZGlzYWJsZWQgKGkuZS4gX19IQUxfVUFSVF9ESVNBQkxFKF9fSEFORExFX18pKQorICAqICAgICAgICAgICAgIGFuZCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYW4gRW5hYmxlIG1hY3JvIChpLmUuIF9fSEFMX1VBUlRfRU5BQkxFKF9fSEFORExFX18pKS4gCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfSFdDT05UUk9MX0NUU19ESVNBQkxFKF9fSEFORExFX18pICAgICAgICBcCisgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0NUU0UpOyBcCisgICAgKF9fSEFORExFX18pLT5Jbml0Lkh3Rmxvd0N0bCAmPSB+KFVTQVJUX0NSM19DVFNFKTsgICAgICBcCisgIH0gd2hpbGUoMFUpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSBSVFMgZmxvdyBjb250cm9sLgorICAqIEBub3RlICAgVGhpcyBtYWNybyBhbGxvd3MgdG8gZW5hYmxlIFJUUyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgZm9yIGEgZ2l2ZW4gVUFSVCBpbnN0YW5jZSwgCisgICogICAgICAgICB3aXRob3V0IG5lZWQgdG8gY2FsbCBIQUxfVUFSVF9Jbml0KCkgZnVuY3Rpb24uCisgICogICAgICAgICBBcyBpbnZvbHZpbmcgZGlyZWN0IGFjY2VzcyB0byBVQVJUIHJlZ2lzdGVycywgdXNhZ2Ugb2YgdGhpcyBtYWNybyBzaG91bGQgYmUgZnVsbHkgZW5kb3JzZWQgYnkgdXNlci4KKyAgKiBAbm90ZSAgIEFzIG1hY3JvIGlzIGV4cGVjdGVkIHRvIGJlIHVzZWQgZm9yIG1vZGlmeWluZyBSVFMgSHcgZmxvdyBjb250cm9sIGZlYXR1cmUgYWN0aXZhdGlvbiwgd2l0aG91dCBuZWVkCisgICogICAgICAgICBmb3IgVVNBUlQgaW5zdGFuY2UgRGVpbml0L0luaXQsIGZvbGxvd2luZyBjb25kaXRpb25zIGZvciBtYWNybyBjYWxsIHNob3VsZCBiZSBmdWxmaWxsZWQgOgorICAqICAgICAgICAgICAtIFVBUlQgaW5zdGFuY2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGluaXRpYWxpc2VkICh0aHJvdWdoIGNhbGwgb2YgSEFMX1VBUlRfSW5pdCgpICkKKyAgKiAgICAgICAgICAgLSBtYWNybyBjb3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIGNvcnJlc3BvbmRpbmcgVUFSVCBpbnN0YW5jZSBpcyBkaXNhYmxlZCAoaS5lLiBfX0hBTF9VQVJUX0RJU0FCTEUoX19IQU5ETEVfXykpCisgICogICAgICAgICAgICAgYW5kIHNob3VsZCBiZSBmb2xsb3dlZCBieSBhbiBFbmFibGUgbWFjcm8gKGkuZS4gX19IQUxfVUFSVF9FTkFCTEUoX19IQU5ETEVfXykpLiAKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9IV0NPTlRST0xfUlRTX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICBcCisgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfUlRTRSk7IFwKKyAgICAoX19IQU5ETEVfXyktPkluaXQuSHdGbG93Q3RsIHw9IFVTQVJUX0NSM19SVFNFOyAgICAgICBcCisgIH0gd2hpbGUoMFUpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgUlRTIGZsb3cgY29udHJvbC4KKyAgKiBAbm90ZSAgIFRoaXMgbWFjcm8gYWxsb3dzIHRvIGRpc2FibGUgUlRTIGhhcmR3YXJlIGZsb3cgY29udHJvbCBmb3IgYSBnaXZlbiBVQVJUIGluc3RhbmNlLCAKKyAgKiAgICAgICAgIHdpdGhvdXQgbmVlZCB0byBjYWxsIEhBTF9VQVJUX0luaXQoKSBmdW5jdGlvbi4KKyAgKiAgICAgICAgIEFzIGludm9sdmluZyBkaXJlY3QgYWNjZXNzIHRvIFVBUlQgcmVnaXN0ZXJzLCB1c2FnZSBvZiB0aGlzIG1hY3JvIHNob3VsZCBiZSBmdWxseSBlbmRvcnNlZCBieSB1c2VyLgorICAqIEBub3RlICAgQXMgbWFjcm8gaXMgZXhwZWN0ZWQgdG8gYmUgdXNlZCBmb3IgbW9kaWZ5aW5nIFJUUyBIdyBmbG93IGNvbnRyb2wgZmVhdHVyZSBhY3RpdmF0aW9uLCB3aXRob3V0IG5lZWQKKyAgKiAgICAgICAgIGZvciBVU0FSVCBpbnN0YW5jZSBEZWluaXQvSW5pdCwgZm9sbG93aW5nIGNvbmRpdGlvbnMgZm9yIG1hY3JvIGNhbGwgc2hvdWxkIGJlIGZ1bGZpbGxlZCA6CisgICogICAgICAgICAgIC0gVUFSVCBpbnN0YW5jZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gaW5pdGlhbGlzZWQgKHRocm91Z2ggY2FsbCBvZiBIQUxfVUFSVF9Jbml0KCkgKQorICAqICAgICAgICAgICAtIG1hY3JvIGNvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gY29ycmVzcG9uZGluZyBVQVJUIGluc3RhbmNlIGlzIGRpc2FibGVkIChpLmUuIF9fSEFMX1VBUlRfRElTQUJMRShfX0hBTkRMRV9fKSkKKyAgKiAgICAgICAgICAgICBhbmQgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGFuIEVuYWJsZSBtYWNybyAoaS5lLiBfX0hBTF9VQVJUX0VOQUJMRShfX0hBTkRMRV9fKSkuIAorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VQVJUX0hXQ09OVFJPTF9SVFNfRElTQUJMRShfX0hBTkRMRV9fKSAgICAgICBcCisgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDTEVBUl9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfUlRTRSk7XAorICAgIChfX0hBTkRMRV9fKS0+SW5pdC5Id0Zsb3dDdGwgJj0gfihVU0FSVF9DUjNfUlRTRSk7ICAgICBcCisgIH0gd2hpbGUoMFUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVUFSVF9Qcml2YXRlX01hY3JvcyAgIFVBUlQgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworLyoqIEBicmllZiAgQlJSIGRpdmlzaW9uIG9wZXJhdGlvbiB0byBzZXQgQlJSIHJlZ2lzdGVyIGluIDgtYml0IG92ZXJzYW1wbGluZyBtb2RlLgorICAqIEBwYXJhbSAgX19QQ0xLX18gVUFSVCBjbG9jay4KKyAgKiBAcGFyYW0gIF9fQkFVRF9fIEJhdWQgcmF0ZSBzZXQgYnkgdGhlIHVzZXIuCisgICogQHJldHZhbCBEaXZpc2lvbiByZXN1bHQKKyAgKi8KKyNkZWZpbmUgVUFSVF9ESVZfU0FNUExJTkc4KF9fUENMS19fLCBfX0JBVURfXykgICAoKCgoX19QQ0xLX18pKjJVKSArICgoX19CQVVEX18pLzJVKSkgLyAoX19CQVVEX18pKQorCisvKiogQGJyaWVmICBCUlIgZGl2aXNpb24gb3BlcmF0aW9uIHRvIHNldCBCUlIgcmVnaXN0ZXIgaW4gMTYtYml0IG92ZXJzYW1wbGluZyBtb2RlLgorICAqIEBwYXJhbSAgX19QQ0xLX18gVUFSVCBjbG9jay4KKyAgKiBAcGFyYW0gIF9fQkFVRF9fIEJhdWQgcmF0ZSBzZXQgYnkgdGhlIHVzZXIuCisgICogQHJldHZhbCBEaXZpc2lvbiByZXN1bHQKKyAgKi8KKyNkZWZpbmUgVUFSVF9ESVZfU0FNUExJTkcxNihfX1BDTEtfXywgX19CQVVEX18pICAoKChfX1BDTEtfXykgKyAoKF9fQkFVRF9fKS8yVSkpIC8gKF9fQkFVRF9fKSkKKworLyoqIEBicmllZiAgQ2hlY2sgVUFSVCBCYXVkIHJhdGUuCisgICogQHBhcmFtICBfX0JBVURSQVRFX18gQmF1ZHJhdGUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgorICAqICAgICAgICAgVGhlIG1heGltdW0gQmF1ZCBSYXRlIGlzIGRlcml2ZWQgZnJvbSB0aGUgbWF4aW11bSBjbG9jayBvbiBGMyAoaS5lLiA3MiBNSHopCisgICogICAgICAgICBkaXZpZGVkIGJ5IHRoZSBzbWFsbGVzdCBvdmVyc2FtcGxpbmcgdXNlZCBvbiB0aGUgVVNBUlQgKGkuZS4gOCkKKyAgKiBAcmV0dmFsIFNFVCAoX19CQVVEUkFURV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19CQVVEUkFURV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfQkFVRFJBVEUoX19CQVVEUkFURV9fKSAoKF9fQkFVRFJBVEVfXykgPCA5MDAwMDAxVSkKKworLyoqIEBicmllZiAgQ2hlY2sgVUFSVCBhc3NlcnRpb24gdGltZS4KKyAgKiBAcGFyYW0gIF9fVElNRV9fIDUtYml0IHZhbHVlIGFzc2VydGlvbiB0aW1lLgorICAqIEByZXR2YWwgVGVzdCByZXN1bHQgKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBJU19VQVJUX0FTU0VSVElPTlRJTUUoX19USU1FX18pICAgICgoX19USU1FX18pIDw9IDB4MUZVKQorCisvKiogQGJyaWVmICBDaGVjayBVQVJUIGRlYXNzZXJ0aW9uIHRpbWUuCisgICogQHBhcmFtICBfX1RJTUVfXyA1LWJpdCB2YWx1ZSBkZWFzc2VydGlvbiB0aW1lLgorICAqIEByZXR2YWwgVGVzdCByZXN1bHQgKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBJU19VQVJUX0RFQVNTRVJUSU9OVElNRShfX1RJTUVfXykgKChfX1RJTUVfXykgPD0gMHgxRlUpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGZyYW1lIG51bWJlciBvZiBzdG9wIGJpdHMgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fU1RPUEJJVFNfXyBVQVJUIGZyYW1lIG51bWJlciBvZiBzdG9wIGJpdHMuIAorICAqIEByZXR2YWwgU0VUIChfX1NUT1BCSVRTX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1NUT1BCSVRTX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9TVE9QQklUUyhfX1NUT1BCSVRTX18pICgoKF9fU1RPUEJJVFNfXykgPT0gVUFSVF9TVE9QQklUU18wXzUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1RPUEJJVFNfXykgPT0gVUFSVF9TVE9QQklUU18xKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1RPUEJJVFNfXykgPT0gVUFSVF9TVE9QQklUU18xXzUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1RPUEJJVFNfXykgPT0gVUFSVF9TVE9QQklUU18yKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgZnJhbWUgcGFyaXR5IGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1BBUklUWV9fIFVBUlQgZnJhbWUgcGFyaXR5LiAKKyAgKiBAcmV0dmFsIFNFVCAoX19QQVJJVFlfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fUEFSSVRZX18gaXMgaW52YWxpZCkKKyAgKi8gCisjZGVmaW5lIElTX1VBUlRfUEFSSVRZKF9fUEFSSVRZX18pICgoKF9fUEFSSVRZX18pID09IFVBUlRfUEFSSVRZX05PTkUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQVJJVFlfXykgPT0gVUFSVF9QQVJJVFlfRVZFTikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BBUklUWV9fKSA9PSBVQVJUX1BBUklUWV9PREQpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBoYXJkd2FyZSBmbG93IGNvbnRyb2wgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fQ09OVFJPTF9fIFVBUlQgaGFyZHdhcmUgZmxvdyBjb250cm9sLiAKKyAgKiBAcmV0dmFsIFNFVCAoX19DT05UUk9MX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0NPTlRST0xfXyBpcyBpbnZhbGlkKQorICAqLyAKKyNkZWZpbmUgSVNfVUFSVF9IQVJEV0FSRV9GTE9XX0NPTlRST0woX19DT05UUk9MX18pXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0NPTlRST0xfXykgPT0gVUFSVF9IV0NPTlRST0xfTk9ORSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NPTlRST0xfXykgPT0gVUFSVF9IV0NPTlRST0xfUlRTKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NPTlRST0xfXykgPT0gVUFSVF9IV0NPTlRST0xfQ1RTKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NPTlRST0xfXykgPT0gVUFSVF9IV0NPTlRST0xfUlRTX0NUUykpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGNvbW11bmljYXRpb24gbW9kZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19NT0RFX18gVUFSVCBjb21tdW5pY2F0aW9uIG1vZGUuIAorICAqIEByZXR2YWwgU0VUIChfX01PREVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTU9ERV9fIGlzIGludmFsaWQpCisgICovIAorI2RlZmluZSBJU19VQVJUX01PREUoX19NT0RFX18pICgoKChfX01PREVfXykgJiAofigodWludDMyX3QpKFVBUlRfTU9ERV9UWF9SWCkpKSkgPT0gMHgwMFUpICYmICgoX19NT0RFX18pICE9IDB4MDBVKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgc3RhdGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fU1RBVEVfXyBVQVJUIHN0YXRlLiAKKyAgKiBAcmV0dmFsIFNFVCAoX19TVEFURV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19TVEFURV9fIGlzIGludmFsaWQpCisgICovIAorI2RlZmluZSBJU19VQVJUX1NUQVRFKF9fU1RBVEVfXykgKCgoX19TVEFURV9fKSA9PSBVQVJUX1NUQVRFX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1RBVEVfXykgPT0gVUFSVF9TVEFURV9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBvdmVyc2FtcGxpbmcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fU0FNUExJTkdfXyBVQVJUIG92ZXJzYW1wbGluZy4gCisgICogQHJldHZhbCBTRVQgKF9fU0FNUExJTkdfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fU0FNUExJTkdfXyBpcyBpbnZhbGlkKQorICAqLyAKKyNkZWZpbmUgSVNfVUFSVF9PVkVSU0FNUExJTkcoX19TQU1QTElOR19fKSAoKChfX1NBTVBMSU5HX18pID09IFVBUlRfT1ZFUlNBTVBMSU5HXzE2KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TQU1QTElOR19fKSA9PSBVQVJUX09WRVJTQU1QTElOR184KSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgZnJhbWUgc2FtcGxpbmcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fT05FQklUX18gVUFSVCBmcmFtZSBzYW1wbGluZy4gCisgICogQHJldHZhbCBTRVQgKF9fT05FQklUX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX09ORUJJVF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfT05FX0JJVF9TQU1QTEUoX19PTkVCSVRfXykgKCgoX19PTkVCSVRfXykgPT0gVUFSVF9PTkVfQklUX1NBTVBMRV9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19PTkVCSVRfXykgPT0gVUFSVF9PTkVfQklUX1NBTVBMRV9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgQWRkcmVzcyBMZW5ndGggZGV0ZWN0aW9uIHBhcmFtZXRlciBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19BRERSRVNTX18gVUFSVCBBZHJlc3MgbGVuZ3RoIHZhbHVlLiAKKyAgKiBAcmV0dmFsIFNFVCAoX19BRERSRVNTX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0FERFJFU1NfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX0FERFJFU1NMRU5HVEhfREVURUNUKF9fQUREUkVTU19fKSAoKChfX0FERFJFU1NfXykgPT0gVUFSVF9BRERSRVNTX0RFVEVDVF80QikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0FERFJFU1NfXykgPT0gVUFSVF9BRERSRVNTX0RFVEVDVF83QikpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiBtb2RlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX01PREVfXyBVQVJUIGF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiBtb2RlLiAKKyAgKiBAcmV0dmFsIFNFVCAoX19NT0RFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX01PREVfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFTU9ERShfX01PREVfXykgICgoKF9fTU9ERV9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFX09OU1RBUlRCSVQpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9PTkZBTExJTkdFREdFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfT04wWDdGRlJBTUUpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFX09OMFg1NUZSQU1FKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgcmVjZWl2ZXIgdGltZW91dCBzZXR0aW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1RJTUVPVVRfXyBVQVJUIHJlY2VpdmVyIHRpbWVvdXQgc2V0dGluZy4gCisgICogQHJldHZhbCBTRVQgKF9fVElNRU9VVF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19USU1FT1VUX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9SRUNFSVZFUl9USU1FT1VUKF9fVElNRU9VVF9fKSAoKChfX1RJTUVPVVRfXykgPT0gVUFSVF9SRUNFSVZFUl9USU1FT1VUX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RJTUVPVVRfXykgPT0gVUFSVF9SRUNFSVZFUl9USU1FT1VUX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIExJTiBzdGF0ZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19MSU5fXyBVQVJUIExJTiBzdGF0ZS4gCisgICogQHJldHZhbCBTRVQgKF9fTElOX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0xJTl9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfTElOKF9fTElOX18pICAgICAgICAgICAgKCgoX19MSU5fXykgPT0gVUFSVF9MSU5fRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTElOX18pID09IFVBUlRfTElOX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIExJTiBicmVhayBkZXRlY3Rpb24gbGVuZ3RoIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0xFTkdUSF9fIFVBUlQgTElOIGJyZWFrIGRldGVjdGlvbiBsZW5ndGguIAorICAqIEByZXR2YWwgU0VUIChfX0xFTkdUSF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19MRU5HVEhfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX0xJTl9CUkVBS19ERVRFQ1RfTEVOR1RIKF9fTEVOR1RIX18pICgoKF9fTEVOR1RIX18pID09IFVBUlRfTElOQlJFQUtERVRFQ1RMRU5HVEhfMTBCKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVUFSVF9MSU5CUkVBS0RFVEVDVExFTkdUSF8xMUIpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBETUEgVFggc3RhdGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fRE1BVFhfXyBVQVJUIERNQSBUWCBzdGF0ZS4gCisgICogQHJldHZhbCBTRVQgKF9fRE1BVFhfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fRE1BVFhfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX0RNQV9UWChfX0RNQVRYX18pICAgICAoKChfX0RNQVRYX18pID09IFVBUlRfRE1BX1RYX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19ETUFUWF9fKSA9PSBVQVJUX0RNQV9UWF9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBETUEgUlggc3RhdGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fRE1BUlhfXyBVQVJUIERNQSBSWCBzdGF0ZS4gCisgICogQHJldHZhbCBTRVQgKF9fRE1BUlhfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fRE1BUlhfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX0RNQV9SWChfX0RNQVJYX18pICAgICAoKChfX0RNQVJYX18pID09IFVBUlRfRE1BX1JYX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19ETUFSWF9fKSA9PSBVQVJUX0RNQV9SWF9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBoYWxmLWR1cGxleCBzdGF0ZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19IRFNFTF9fIFVBUlQgaGFsZi1kdXBsZXggc3RhdGUuIAorICAqIEByZXR2YWwgU0VUIChfX0hEU0VMX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0hEU0VMX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9IQUxGX0RVUExFWChfX0hEU0VMX18pICAgICAoKChfX0hEU0VMX18pID09IFVBUlRfSEFMRl9EVVBMRVhfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSERTRUxfXykgPT0gVUFSVF9IQUxGX0RVUExFWF9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCB3YWtlLXVwIG1ldGhvZCBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19XQUtFVVBfXyBVQVJUIHdha2UtdXAgbWV0aG9kIC4gCisgICogQHJldHZhbCBTRVQgKF9fV0FLRVVQX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1dBS0VVUF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfV0FLRVVQTUVUSE9EKF9fV0FLRVVQX18pICgoKF9fV0FLRVVQX18pID09IFVBUlRfV0FLRVVQTUVUSE9EX0lETEVMSU5FKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fV0FLRVVQX18pID09IFVBUlRfV0FLRVVQTUVUSE9EX0FERFJFU1NNQVJLKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgYWR2YW5jZWQgZmVhdHVyZXMgaW5pdGlhbGl6YXRpb24gaXMgdmFsaWQuCisgICogQHBhcmFtIF9fSU5JVF9fIFVBUlQgYWR2YW5jZWQgZmVhdHVyZXMgaW5pdGlhbGl6YXRpb24uIAorICAqIEByZXR2YWwgU0VUIChfX0lOSVRfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fSU5JVF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfQURWRkVBVFVSRV9JTklUKF9fSU5JVF9fKSAgICgoX19JTklUX18pIDw9IChVQVJUX0FEVkZFQVRVUkVfTk9fSU5JVCAgICAgICAgICAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlRfQURWRkVBVFVSRV9UWElOVkVSVF9JTklUICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF9BRFZGRUFUVVJFX1JYSU5WRVJUX0lOSVQgICAgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUX0FEVkZFQVRVUkVfREFUQUlOVkVSVF9JTklUICAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlRfQURWRkVBVFVSRV9TV0FQX0lOSVQgICAgICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF9BRFZGRUFUVVJFX1JYT1ZFUlJVTkRJU0FCTEVfSU5JVCAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUX0FEVkZFQVRVUkVfRE1BRElTQUJMRU9ORVJST1JfSU5JVCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfSU5JVCAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF9BRFZGRUFUVVJFX01TQkZJUlNUX0lOSVQpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBmcmFtZSBUWCBpbnZlcnNpb24gc2V0dGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19UWElOVl9fIFVBUlQgZnJhbWUgVFggaW52ZXJzaW9uIHNldHRpbmcuIAorICAqIEByZXR2YWwgU0VUIChfX1RYSU5WX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1RYSU5WX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9BRFZGRUFUVVJFX1RYSU5WKF9fVFhJTlZfXykgKCgoX19UWElOVl9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfVFhJTlZfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RYSU5WX18pID09IFVBUlRfQURWRkVBVFVSRV9UWElOVl9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBmcmFtZSBSWCBpbnZlcnNpb24gc2V0dGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19SWElOVl9fIFVBUlQgZnJhbWUgUlggaW52ZXJzaW9uIHNldHRpbmcuIAorICAqIEByZXR2YWwgU0VUIChfX1JYSU5WX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1JYSU5WX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9BRFZGRUFUVVJFX1JYSU5WKF9fUlhJTlZfXykgKCgoX19SWElOVl9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfUlhJTlZfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JYSU5WX18pID09IFVBUlRfQURWRkVBVFVSRV9SWElOVl9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBmcmFtZSBkYXRhIGludmVyc2lvbiBzZXR0aW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0RBVEFJTlZfXyBVQVJUIGZyYW1lIGRhdGEgaW52ZXJzaW9uIHNldHRpbmcuIAorICAqIEByZXR2YWwgU0VUIChfX0RBVEFJTlZfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fREFUQUlOVl9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfQURWRkVBVFVSRV9EQVRBSU5WKF9fREFUQUlOVl9fKSAoKChfX0RBVEFJTlZfXykgPT0gVUFSVF9BRFZGRUFUVVJFX0RBVEFJTlZfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EQVRBSU5WX18pID09IFVBUlRfQURWRkVBVFVSRV9EQVRBSU5WX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGZyYW1lIFJYL1RYIHBpbnMgc3dhcCBzZXR0aW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1NXQVBfXyBVQVJUIGZyYW1lIFJYL1RYIHBpbnMgc3dhcCBzZXR0aW5nLiAKKyAgKiBAcmV0dmFsIFNFVCAoX19TV0FQX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1NXQVBfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX0FEVkZFQVRVUkVfU1dBUChfX1NXQVBfXykgKCgoX19TV0FQX18pID09IFVBUlRfQURWRkVBVFVSRV9TV0FQX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1dBUF9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfU1dBUF9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBmcmFtZSBvdmVycnVuIHNldHRpbmcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fT1ZFUlJVTl9fIFVBUlQgZnJhbWUgb3ZlcnJ1biBzZXR0aW5nLiAKKyAgKiBAcmV0dmFsIFNFVCAoX19PVkVSUlVOX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX09WRVJSVU5fXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX09WRVJSVU4oX19PVkVSUlVOX18pICAgICAoKChfX09WRVJSVU5fXykgPT0gVUFSVF9BRFZGRUFUVVJFX09WRVJSVU5fRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fT1ZFUlJVTl9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfT1ZFUlJVTl9ESVNBQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgYXV0byBCYXVkIHJhdGUgc3RhdGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fQVVUT0JBVURSQVRFX18gVUFSVCBhdXRvIEJhdWQgcmF0ZSBzdGF0ZS4gCisgICogQHJldHZhbCBTRVQgKF9fQVVUT0JBVURSQVRFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0FVVE9CQVVEUkFURV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEUoX19BVVRPQkFVRFJBVEVfXykgICgoKF9fQVVUT0JBVURSQVRFX18pID09IFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0FVVE9CQVVEUkFURV9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIERNQSBlbmFibGluZyBvciBkaXNhYmxpbmcgb24gZXJyb3Igc2V0dGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19ETUFfXyBVQVJUIERNQSBlbmFibGluZyBvciBkaXNhYmxpbmcgb24gZXJyb3Igc2V0dGluZy4gCisgICogQHJldHZhbCBTRVQgKF9fRE1BX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0RNQV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfQURWRkVBVFVSRV9ETUFPTlJYRVJST1IoX19ETUFfXykgICgoKF9fRE1BX18pID09IFVBUlRfQURWRkVBVFVSRV9ETUFfRU5BQkxFT05SWEVSUk9SKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRE1BX18pID09IFVBUlRfQURWRkVBVFVSRV9ETUFfRElTQUJMRU9OUlhFUlJPUikpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGZyYW1lIE1TQiBmaXJzdCBzZXR0aW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX01TQkZJUlNUX18gVUFSVCBmcmFtZSBNU0IgZmlyc3Qgc2V0dGluZy4gCisgICogQHJldHZhbCBTRVQgKF9fTVNCRklSU1RfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTVNCRklSU1RfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX0FEVkZFQVRVUkVfTVNCRklSU1QoX19NU0JGSVJTVF9fKSAoKChfX01TQkZJUlNUX18pID09IFVBUlRfQURWRkVBVFVSRV9NU0JGSVJTVF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTVNCRklSU1RfXykgPT0gVUFSVF9BRFZGRUFUVVJFX01TQkZJUlNUX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIHN0b3AgbW9kZSBzdGF0ZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19TVE9QTU9ERV9fIFVBUlQgc3RvcCBtb2RlIHN0YXRlLiAKKyAgKiBAcmV0dmFsIFNFVCAoX19TVE9QTU9ERV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19TVE9QTU9ERV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfQURWRkVBVFVSRV9TVE9QTU9ERShfX1NUT1BNT0RFX18pICgoKF9fU1RPUE1PREVfXykgPT0gVUFSVF9BRFZGRUFUVVJFX1NUT1BNT0RFX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TVE9QTU9ERV9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfU1RPUE1PREVfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgbXV0ZSBtb2RlIHN0YXRlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX01VVEVfXyBVQVJUIG11dGUgbW9kZSBzdGF0ZS4gCisgICogQHJldHZhbCBTRVQgKF9fTVVURV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19NVVRFX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9NVVRFX01PREUoX19NVVRFX18pICAgICAgICgoKF9fTVVURV9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfTVVURU1PREVfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NVVRFX18pID09IFVBUlRfQURWRkVBVFVSRV9NVVRFTU9ERV9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCB3YWtlLXVwIHNlbGVjdGlvbiBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19XQUtFX18gVUFSVCB3YWtlLXVwIHNlbGVjdGlvbi4gCisgICogQHJldHZhbCBTRVQgKF9fV0FLRV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19XQUtFX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9XQUtFVVBfU0VMRUNUSU9OKF9fV0FLRV9fKSAoKChfX1dBS0VfXykgPT0gVUFSVF9XQUtFVVBfT05fQUREUkVTUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fV0FLRV9fKSA9PSBVQVJUX1dBS0VVUF9PTl9TVEFSVEJJVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fV0FLRV9fKSA9PSBVQVJUX1dBS0VVUF9PTl9SRUFEREFUQV9OT05FTVBUWSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGRyaXZlciBlbmFibGUgcG9sYXJpdHkgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fUE9MQVJJVFlfXyBVQVJUIGRyaXZlciBlbmFibGUgcG9sYXJpdHkuIAorICAqIEByZXR2YWwgU0VUIChfX1BPTEFSSVRZX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1BPTEFSSVRZX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9ERV9QT0xBUklUWShfX1BPTEFSSVRZX18pICAgICgoKF9fUE9MQVJJVFlfXykgPT0gVUFSVF9ERV9QT0xBUklUWV9ISUdIKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IFVBUlRfREVfUE9MQVJJVFlfTE9XKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgcmVxdWVzdCBwYXJhbWV0ZXIgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fUEFSQU1fXyBVQVJUIHJlcXVlc3QgcGFyYW1ldGVyLiAKKyAgKiBAcmV0dmFsIFNFVCAoX19QQVJBTV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19QQVJBTV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfUkVRVUVTVF9QQVJBTUVURVIoX19QQVJBTV9fKSAoKChfX1BBUkFNX18pID09IFVBUlRfQVVUT0JBVURfUkVRVUVTVCkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUEFSQU1fXykgPT0gVUFSVF9TRU5EQlJFQUtfUkVRVUVTVCkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQVJBTV9fKSA9PSBVQVJUX01VVEVfTU9ERV9SRVFVRVNUKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BBUkFNX18pID09IFVBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUEFSQU1fXykgPT0gVUFSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCkpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEluY2x1ZGUgVUFSVCBIQUwgRXh0ZW5kZWQgbW9kdWxlICovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF91YXJ0X2V4LmgiCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnMgVUFSVCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfSW5pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IYWxmRHVwbGV4X0luaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTElOX0luaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDMyX3QgQnJlYWtEZXRlY3RMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX011bHRpUHJvY2Vzc29yX0luaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDhfdCBBZGRyZXNzLCB1aW50MzJfdCBXYWtlVXBNZXRob2QpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfRGVJbml0IChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK3ZvaWQgSEFMX1VBUlRfTXNwSW5pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK3ZvaWQgSEFMX1VBUlRfTXNwRGVJbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfVHJhbnNtaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfUmVjZWl2ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9UcmFuc21pdF9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9SZWNlaXZlX0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX1RyYW5zbWl0X0RNQShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9SZWNlaXZlX0RNQShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9ETUFQYXVzZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0RNQVJlc3VtZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0RNQVN0b3AoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CisvKiBUcmFuc2ZlciBBYm9ydCBmdW5jdGlvbnMgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfQWJvcnRUcmFuc21pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0X0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfQWJvcnRUcmFuc21pdF9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZV9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKKwordm9pZCBIQUxfVUFSVF9JUlFIYW5kbGVyKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVF9UeENwbHRDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK3ZvaWQgSEFMX1VBUlRfVHhIYWxmQ3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVF9SeENwbHRDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK3ZvaWQgSEFMX1VBUlRfUnhIYWxmQ3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjayAoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7Cit2b2lkIEhBTF9VQVJUX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTXVsdGlQcm9jZXNzb3JfRW5hYmxlTXV0ZU1vZGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTXVsdGlQcm9jZXNzb3JfRGlzYWJsZU11dGVNb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfTXVsdGlQcm9jZXNzb3JfRW50ZXJNdXRlTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IYWxmRHVwbGV4X0VuYWJsZVRyYW5zbWl0dGVyKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hhbGZEdXBsZXhfRW5hYmxlUmVjZWl2ZXIoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTElOX1NlbmRCcmVhayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVBUlRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9VQVJUX1N0YXRlVHlwZURlZiBIQUxfVUFSVF9HZXRTdGF0ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK3VpbnQzMl90ICAgICAgICAgICAgICBIQUxfVUFSVF9HZXRFcnJvcihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFVBUlRfUHJpdmF0ZV9GdW5jdGlvbnMgVUFSVCBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCitIQUxfU3RhdHVzVHlwZURlZiBVQVJUX1NldENvbmZpZyhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK3ZvaWQgVUFSVF9BZHZGZWF0dXJlQ29uZmlnKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgVUFSVF9DaGVja0lkbGVTdGF0ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIFVBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50MzJfdCBGbGFnLCBGbGFnU3RhdHVzIFN0YXR1cywgdWludDMyX3QgVGlja3N0YXJ0LCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIFVBUlRfVHJhbnNtaXRfSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitIQUxfU3RhdHVzVHlwZURlZiBVQVJUX0VuZFRyYW5zbWl0X0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgVUFSVF9SZWNlaXZlX0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBVQVJUX1dha2V1cF9BZGRyZXNzQ29uZmlnKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIFVBUlRfV2FrZVVwVHlwZURlZiBXYWtlVXBTZWxlY3Rpb24pOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkYzeHhfSEFMX1VBUlRfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLworCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2hhbF91YXJ0X2V4LmggYi9JbmMvc3RtMzJmM3h4X2hhbF91YXJ0X2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThlNDUxOAotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmYzeHhfaGFsX3VhcnRfZXguaApAQCAtMCwwICsxLDQ3NSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfdWFydF9leC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBVQVJUIEhBTCBFeHRlbmRlZCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyRjN4eF9IQUxfVUFSVF9FWF9ICisjZGVmaW5lIF9fU1RNMzJGM3h4X0hBTF9VQVJUX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVUFSVEV4CisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVBUlRFeF9FeHBvcnRlZF9Db25zdGFudHMgVUFSVEV4IEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVEV4X1dvcmRfTGVuZ3RoIFVBUlRFeCBXb3JkIExlbmd0aAorICAqIEB7CisgICovCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorI2RlZmluZSBVQVJUX1dPUkRMRU5HVEhfN0IgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVVTQVJUX0NSMV9NMSkgICAvKiE8IDctYml0IGxvbmcgVUFSVCBmcmFtZSAqLworI2RlZmluZSBVQVJUX1dPUkRMRU5HVEhfOEIgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAvKiE8IDgtYml0IGxvbmcgVUFSVCBmcmFtZSAqLworI2RlZmluZSBVQVJUX1dPUkRMRU5HVEhfOUIgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVVTQVJUX0NSMV9NMCkgICAvKiE8IDktYml0IGxvbmcgVUFSVCBmcmFtZSAqLworI2Vsc2UKKyNkZWZpbmUgVUFSVF9XT1JETEVOR1RIXzhCICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgLyohPCA4LWJpdCBsb25nIFVBUlQgZnJhbWUgKi8KKyNkZWZpbmUgVUFSVF9XT1JETEVOR1RIXzlCICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClVU0FSVF9DUjFfTSkgICAgLyohPCA5LWJpdCBsb25nIFVBUlQgZnJhbWUgKi8KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVUFSVEV4X0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBVQVJURXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCisKKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlM0ODVFeF9Jbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQzMl90IFBvbGFyaXR5LCB1aW50MzJfdCBBc3NlcnRpb25UaW1lLCB1aW50MzJfdCBEZWFzc2VydGlvblRpbWUpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogQGFkZHRvZ3JvdXAgVUFSVEV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMKKyAgKiBAeworICAqLworCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9TdG9wTW9kZVdha2VVcFNvdXJjZUNvbmZpZyhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCBVQVJUX1dha2VVcFR5cGVEZWYgV2FrZVVwU2VsZWN0aW9uKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJURXhfRW5hYmxlU3RvcE1vZGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X0Rpc2FibGVTdG9wTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9NdWx0aVByb2Nlc3NvckV4X0FkZHJlc3NMZW5ndGhfU2V0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQzMl90IEFkZHJlc3NMZW5ndGgpOwordm9pZCBIQUxfVUFSVEV4X1dha2V1cENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVQVJURXhfUHJpdmF0ZV9NYWNyb3MgVUFSVEV4IFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgUmVwb3J0IHRoZSBVQVJUIGNsb2NrIHNvdXJjZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fQ0xPQ0tTT1VSQ0VfXyBvdXRwdXQgdmFyaWFibGUuCisgICogQHJldHZhbCBVQVJUIGNsb2NraW5nIHNvdXJjZSwgd3JpdHRlbiBpbiBfX0NMT0NLU09VUkNFX18uCisgICovCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpCisjZGVmaW5lIFVBUlRfR0VUQ0xPQ0tTT1VSQ0UoX19IQU5ETEVfXyxfX0NMT0NLU09VUkNFX18pICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQxKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDFfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMjogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzI7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDIpICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDJfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDMpICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDNfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVQVJUNCkgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VQVJUNF9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VBUlQ0Q0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VBUlQ0Q0xLU09VUkNFX0hTSTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VBUlQ0Q0xLU09VUkNFX1NZU0NMSzogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VBUlQ0Q0xLU09VUkNFX0xTRTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVUFSVDUpICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VQVJUNV9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VBUlQ1Q0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VBUlQ1Q0xLU09VUkNFX0hTSTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VBUlQ1Q0xLU09VUkNFX1NZU0NMSzogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VBUlQ1Q0xLU09VUkNFX0xTRTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUoMFUpCisjZWxpZiBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorI2RlZmluZSBVQVJUX0dFVENMT0NLU09VUkNFKF9fSEFORExFX18sX19DTE9DS1NPVVJDRV9fKSAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZigoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQxX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0hTSTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0xTRTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQyKSAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDMpICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSgwVSkKKyNlbHNlCisjZGVmaW5lIFVBUlRfR0VUQ0xPQ0tTT1VSQ0UoX19IQU5ETEVfXyxfX0NMT0NLU09VUkNFX18pICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQxKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDFfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMjogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzI7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDIpICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDJfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDMpICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDNfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUoMFUpCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAgICAqLworCisKKy8qKiBAYnJpZWYgIENvbXB1dGUgdGhlIFVBUlQgbWFzayB0byBhcHBseSB0byByZXRyaWV2ZSB0aGUgcmVjZWl2ZWQgZGF0YQorICAqICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSB3b3JkIGxlbmd0aCBhbmQgdG8gdGhlIHBhcml0eSBiaXRzIGFjdGl2YXRpb24uCisgICogQG5vdGUgICBJZiBQQ0UgPSAxLCB0aGUgcGFyaXR5IGJpdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGRhdGEgZXh0cmFjdGVkCisgICogICAgICAgICBieSB0aGUgcmVjZXB0aW9uIEFQSSgpLgorICAqICAgICAgICAgVGhpcyBtYXNraW5nIG9wZXJhdGlvbiBpcyBub3QgY2FycmllZCBvdXQgaW4gdGhlIGNhc2Ugb2YKKyAgKiAgICAgICAgIERNQSB0cmFuc2ZlcnMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lLCB0aGUgbWFzayB0byBhcHBseSB0byBVQVJUIFJEUiByZWdpc3RlciBpcyBzdG9yZWQgaW4gKF9fSEFORExFX18pLT5NYXNrIGZpZWxkLgorICAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKyNkZWZpbmUgVUFSVF9NQVNLX0NPTVBVVEFUSU9OKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoKF9fSEFORExFX18pLT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzlCKSAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGlmICgoX19IQU5ETEVfXyktPkluaXQuUGFyaXR5ID09IFVBUlRfUEFSSVRZX05PTkUpICAgICAgICAgICAgICAgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMUZGVSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDBGRlUgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5Xb3JkTGVuZ3RoID09IFVBUlRfV09SRExFTkdUSF84QikgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5QYXJpdHkgPT0gVUFSVF9QQVJJVFlfTk9ORSkgICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwRkZVIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMDdGVSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZWxzZSBpZiAoKF9fSEFORExFX18pLT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzdCKSAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpZiAoKF9fSEFORExFX18pLT5Jbml0LlBhcml0eSA9PSBVQVJUX1BBUklUWV9OT05FKSAgICAgICAgICAgICAgIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDA3RlUgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwM0ZVIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSgwVSkKKyNlbHNlCisjZGVmaW5lIFVBUlRfTUFTS19DT01QVVRBVElPTihfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5Xb3JkTGVuZ3RoID09IFVBUlRfV09SRExFTkdUSF85QikgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpZiAoKF9fSEFORExFX18pLT5Jbml0LlBhcml0eSA9PSBVQVJUX1BBUklUWV9OT05FKSAgICAgICAgICAgICAgIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDFGRlUgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwRkZVIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBlbHNlIGlmICgoX19IQU5ETEVfXyktPkluaXQuV29yZExlbmd0aCA9PSBVQVJUX1dPUkRMRU5HVEhfOEIpICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGlmICgoX19IQU5ETEVfXyktPkluaXQuUGFyaXR5ID09IFVBUlRfUEFSSVRZX05PTkUpICAgICAgICAgICAgICAgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMEZGVSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDA3RlUgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlKDBVKQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBmcmFtZSBsZW5ndGggaXMgdmFsaWQuCisgICogQHBhcmFtIF9fTEVOR1RIX18gVUFSVCBmcmFtZSBsZW5ndGguIAorICAqIEByZXR2YWwgU0VUIChfX0xFTkdUSF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19MRU5HVEhfXyBpcyBpbnZhbGlkKQorICAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKyNkZWZpbmUgSVNfVUFSVF9XT1JEX0xFTkdUSChfX0xFTkdUSF9fKSAoKChfX0xFTkdUSF9fKSA9PSBVQVJUX1dPUkRMRU5HVEhfN0IpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFTkdUSF9fKSA9PSBVQVJUX1dPUkRMRU5HVEhfOEIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFTkdUSF9fKSA9PSBVQVJUX1dPUkRMRU5HVEhfOUIpKQorI2Vsc2UKKyNkZWZpbmUgSVNfVUFSVF9XT1JEX0xFTkdUSChfX0xFTkdUSF9fKSAoKChfX0xFTkdUSF9fKSA9PSBVQVJUX1dPUkRMRU5HVEhfOEIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFTkdUSF9fKSA9PSBVQVJUX1dPUkRMRU5HVEhfOUIpKQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkYzeHhfSEFMX1VBUlRfRVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLworCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2hhbF91c2FydC5oIGIvSW5jL3N0bTMyZjN4eF9oYWxfdXNhcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDRmYWQyCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjN4eF9oYWxfdXNhcnQuaApAQCAtMCwwICsxLDcxMCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfdXNhcnQuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgVVNBUlQgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0hBTF9VU0FSVF9ICisjZGVmaW5lIF9fU1RNMzJGM3h4X0hBTF9VU0FSVF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVTQVJUCisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVVNBUlRfRXhwb3J0ZWRfVHlwZXMgVVNBUlQgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgVVNBUlQgSW5pdCBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQmF1ZFJhdGU7ICAgICAgICAgICAgICAgICAgLyohPCBUaGlzIG1lbWJlciBjb25maWd1cmVzIHRoZSBVc2FydCBjb21tdW5pY2F0aW9uIGJhdWQgcmF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgYmF1ZCByYXRlIGlzIGNvbXB1dGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZm9ybXVsYToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXVkIFJhdGUgUmVnaXN0ZXIgPSAoKFBDTEt4KSAvICgoaHVhcnQtPkluaXQuQmF1ZFJhdGUpKSkuICovCisKKyAgdWludDMyX3QgV29yZExlbmd0aDsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBkYXRhIGJpdHMgdHJhbnNtaXR0ZWQgb3IgcmVjZWl2ZWQgaW4gYSBmcmFtZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVTQVJURXhfV29yZF9MZW5ndGguICovCisKKyAgdWludDMyX3QgU3RvcEJpdHM7ICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzdG9wIGJpdHMgdHJhbnNtaXR0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9TdG9wX0JpdHMuICovCisKKyAgdWludDMyX3QgUGFyaXR5OyAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcGFyaXR5IG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9QYXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBXaGVuIHBhcml0eSBpcyBlbmFibGVkLCB0aGUgY29tcHV0ZWQgcGFyaXR5IGlzIGluc2VydGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgdGhlIE1TQiBwb3NpdGlvbiBvZiB0aGUgdHJhbnNtaXR0ZWQgZGF0YSAoOXRoIGJpdCB3aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHdvcmQgbGVuZ3RoIGlzIHNldCB0byA5IGRhdGEgYml0czsgOHRoIGJpdCB3aGVuIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQgbGVuZ3RoIGlzIHNldCB0byA4IGRhdGEgYml0cykuICovCisKKyAgdWludDMyX3QgTW9kZTsgICAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgUmVjZWl2ZSBvciBUcmFuc21pdCBtb2RlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9Nb2RlLiAqLworCisgIHVpbnQzMl90IENMS1BvbGFyaXR5OyAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzdGVhZHkgc3RhdGUgb2YgdGhlIHNlcmlhbCBjbG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVTQVJUX0Nsb2NrX1BvbGFyaXR5LiAqLworCisgIHVpbnQzMl90IENMS1BoYXNlOyAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjbG9jayB0cmFuc2l0aW9uIG9uIHdoaWNoIHRoZSBiaXQgY2FwdHVyZSBpcyBtYWRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfQ2xvY2tfUGhhc2UuICovCisKKyAgdWludDMyX3QgQ0xLTGFzdEJpdDsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgY2xvY2sgcHVsc2UgY29ycmVzcG9uZGluZyB0byB0aGUgbGFzdCB0cmFuc21pdHRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgYml0IChNU0IpIGhhcyB0byBiZSBvdXRwdXQgb24gdGhlIFNDTEsgcGluIGluIHN5bmNocm9ub3VzIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9MYXN0X0JpdC4gKi8KK31VU0FSVF9Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmIEhBTCBVU0FSVCBTdGF0ZSBzdHJ1Y3R1cmVzIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfVVNBUlRfU1RBVEVfUkVTRVQgICAgICAgICAgICAgPSAweDAwVSwgICAgLyohPCBQZXJpcGhlcmFsIGlzIG5vdCBpbml0aWFsaXplZCAgICAgICAgICAgICAgICAgICovCisgIEhBTF9VU0FSVF9TVEFURV9SRUFEWSAgICAgICAgICAgICA9IDB4MDFVLCAgICAvKiE8IFBlcmlwaGVyYWwgSW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UgICAgICAgKi8KKyAgSEFMX1VTQVJUX1NUQVRFX0JVU1kgICAgICAgICAgICAgID0gMHgwMlUsICAgIC8qITwgYW4gaW50ZXJuYWwgcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAgICAqLworICBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWCAgICAgICAgICAgPSAweDEyVSwgICAgLyohPCBEYXRhIFRyYW5zbWlzc2lvbiBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICovCisgIEhBTF9VU0FSVF9TVEFURV9CVVNZX1JYICAgICAgICAgICA9IDB4MjJVLCAgICAvKiE8IERhdGEgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgICAgKi8KKyAgSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFhfUlggICAgICAgID0gMHgzMlUsICAgIC8qITwgRGF0YSBUcmFuc21pc3Npb24gUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZyAqLworICBIQUxfVVNBUlRfU1RBVEVfVElNRU9VVCAgICAgICAgICAgPSAweDAzVSwgICAgLyohPCBUaW1lb3V0IHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEhBTF9VU0FSVF9TVEFURV9FUlJPUiAgICAgICAgICAgICA9IDB4MDRVICAgICAvKiE8IEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK31IQUxfVVNBUlRfU3RhdGVUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFVTQVJUIGNsb2NrIHNvdXJjZXMgZGVmaW5pdGlvbnMKKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBVU0FSVF9DTE9DS1NPVVJDRV9QQ0xLMSAgICAgID0gMHgwMFUsICAgIC8qITwgUENMSzEgY2xvY2sgc291cmNlICAgICAqLworICBVU0FSVF9DTE9DS1NPVVJDRV9QQ0xLMiAgICAgID0gMHgwMVUsICAgIC8qITwgUENMSzIgY2xvY2sgc291cmNlICAgICAqLworICBVU0FSVF9DTE9DS1NPVVJDRV9IU0kgICAgICAgID0gMHgwMlUsICAgIC8qITwgSFNJIGNsb2NrIHNvdXJjZSAgICAgICAqLworICBVU0FSVF9DTE9DS1NPVVJDRV9TWVNDTEsgICAgID0gMHgwNFUsICAgIC8qITwgU1lTQ0xLIGNsb2NrIHNvdXJjZSAgICAqLworICBVU0FSVF9DTE9DS1NPVVJDRV9MU0UgICAgICAgID0gMHgwOFUsICAgIC8qITwgTFNFIGNsb2NrIHNvdXJjZSAgICAgICAqLworICBVU0FSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQgID0gMHgxMFUgICAgIC8qITwgVW5kZWZpbmVkIGNsb2NrIHNvdXJjZSAqLworfVVTQVJUX0Nsb2NrU291cmNlVHlwZURlZjsKKworCisvKioKKyAgKiBAYnJpZWYgIFVTQVJUIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgVVNBUlRfVHlwZURlZiAgICAgICAgICAgICAgICAgKkluc3RhbmNlOyAgICAgICAgLyohPCBVU0FSVCByZWdpc3RlcnMgYmFzZSBhZGRyZXNzICAgICAgICAqLworCisgIFVTQVJUX0luaXRUeXBlRGVmICAgICAgICAgICAgIEluaXQ7ICAgICAgICAgICAgIC8qITwgVVNBUlQgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICAgICAgKi8KKworICB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICAqcFR4QnVmZlB0cjsgICAgICAvKiE8IFBvaW50ZXIgdG8gVVNBUlQgVHggdHJhbnNmZXIgQnVmZmVyICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgVHhYZmVyU2l6ZTsgICAgICAgLyohPCBVU0FSVCBUeCBUcmFuc2ZlciBzaXplICAgICAgICAgICAgICAqLworCisgIF9fSU8gdWludDE2X3QgICAgICAgICAgICAgICAgIFR4WGZlckNvdW50OyAgICAgIC8qITwgVVNBUlQgVHggVHJhbnNmZXIgQ291bnRlciAgICAgICAgICAgKi8KKworICB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICAqcFJ4QnVmZlB0cjsgICAgICAvKiE8IFBvaW50ZXIgdG8gVVNBUlQgUnggdHJhbnNmZXIgQnVmZmVyICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgUnhYZmVyU2l6ZTsgICAgICAgLyohPCBVU0FSVCBSeCBUcmFuc2ZlciBzaXplICAgICAgICAgICAgICAqLworCisgIF9fSU8gdWludDE2X3QgICAgICAgICAgICAgICAgIFJ4WGZlckNvdW50OyAgICAgIC8qITwgVVNBUlQgUnggVHJhbnNmZXIgQ291bnRlciAgICAgICAgICAgKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICBNYXNrOyAgICAgICAgICAgICAvKiE8IFVTQVJUIFJ4IFJEUiByZWdpc3RlciBtYXNrICAgICAgICAgICovCisKKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICAgICAgKmhkbWF0eDsgICAgICAgICAgLyohPCBVU0FSVCBUeCBETUEgSGFuZGxlIHBhcmFtZXRlcnMgICAgICAqLworCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAgICAgICpoZG1hcng7ICAgICAgICAgIC8qITwgVVNBUlQgUnggRE1BIEhhbmRsZSBwYXJhbWV0ZXJzICAgICAgKi8KKworICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICAgICAgICBMb2NrOyAgICAgICAgICAgICAvKiE8IExvY2tpbmcgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyBIQUxfVVNBUlRfU3RhdGVUeXBlRGVmICAgU3RhdGU7ICAgICAgICAgICAgLyohPCBVU0FSVCBjb21tdW5pY2F0aW9uIHN0YXRlICAgICAgICAgICAqLworCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgICAgIEVycm9yQ29kZTsgICAgICAgIC8qITwgVVNBUlQgRXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgKi8KKworfVVTQVJUX0hhbmRsZVR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVTQVJUX0V4cG9ydGVkX0NvbnN0YW50cyBVU0FSVCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0Vycm9yIFVTQVJUIEVycm9yCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX1VTQVJUX0VSUk9SX05PTkUgICAgICAoMHgwMDAwMDAwMFUpICAgIC8qITwgTm8gZXJyb3IgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfVVNBUlRfRVJST1JfUEUgICAgICAgICgweDAwMDAwMDAxVSkgICAgLyohPCBQYXJpdHkgZXJyb3IgICAgICAgICovCisjZGVmaW5lIEhBTF9VU0FSVF9FUlJPUl9ORSAgICAgICAgKDB4MDAwMDAwMDJVKSAgICAvKiE8IE5vaXNlIGVycm9yICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1VTQVJUX0VSUk9SX0ZFICAgICAgICAoMHgwMDAwMDAwNFUpICAgIC8qITwgZnJhbWUgZXJyb3IgICAgICAgICAqLworI2RlZmluZSBIQUxfVVNBUlRfRVJST1JfT1JFICAgICAgICgweDAwMDAwMDA4VSkgICAgLyohPCBPdmVycnVuIGVycm9yICAgICAgICovCisjZGVmaW5lIEhBTF9VU0FSVF9FUlJPUl9ETUEgICAgICAgKDB4MDAwMDAwMTBVKSAgICAvKiE8IERNQSB0cmFuc2ZlciBlcnJvciAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfU3RvcF9CaXRzICBVU0FSVCBOdW1iZXIgb2YgU3RvcCBCaXRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVVNBUlRfU1RPUEJJVFNfMF81ICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClVU0FSVF9DUjJfU1RPUF8wKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVTQVJUIGZyYW1lIHdpdGggMC41IHN0b3AgYml0ICAqLworI2RlZmluZSBVU0FSVF9TVE9QQklUU18xICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVVNBUlQgZnJhbWUgd2l0aCAxIHN0b3AgYml0ICAgICovCisjZGVmaW5lIFVTQVJUX1NUT1BCSVRTXzFfNSAgICAgICAgICAgICAgICAgICgodWludDMyX3QpKFVTQVJUX0NSMl9TVE9QXzAgfCBVU0FSVF9DUjJfU1RPUF8xKSkgLyohPCBVU0FSVCBmcmFtZSB3aXRoIDEuNSBzdG9wIGJpdHMgKi8KKyNkZWZpbmUgVVNBUlRfU1RPUEJJVFNfMiAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClVU0FSVF9DUjJfU1RPUF8xKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVTQVJUIGZyYW1lIHdpdGggMiBzdG9wIGJpdHMgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9QYXJpdHkgICAgVVNBUlQgUGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgVVNBUlRfUEFSSVRZX05PTkUgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE5vIHBhcml0eSAgICovCisjZGVmaW5lIFVTQVJUX1BBUklUWV9FVkVOICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpVVNBUlRfQ1IxX1BDRSkgICAgICAgICAgICAgICAgICAgLyohPCBFdmVuIHBhcml0eSAqLworI2RlZmluZSBVU0FSVF9QQVJJVFlfT0REICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShVU0FSVF9DUjFfUENFIHwgVVNBUlRfQ1IxX1BTKSkgIC8qITwgT2RkIHBhcml0eSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTW9kZSAgIFVTQVJUIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBVU0FSVF9NT0RFX1JYICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVVTQVJUX0NSMV9SRSkgICAgICAgICAgICAgICAgICAgLyohPCBSWCBtb2RlICAgICAgICAqLworI2RlZmluZSBVU0FSVF9NT0RFX1RYICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVVTQVJUX0NSMV9URSkgICAgICAgICAgICAgICAgICAgLyohPCBUWCBtb2RlICAgICAgICAqLworI2RlZmluZSBVU0FSVF9NT0RFX1RYX1JYICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShVU0FSVF9DUjFfVEUgfFVTQVJUX0NSMV9SRSkpICAgLyohPCBSWCBhbmQgVFggbW9kZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9DbG9jayAgVVNBUlQgQ2xvY2sKKyAgKiBAeworICAqLworI2RlZmluZSBVU0FSVF9DTE9DS19ESVNBQkxFICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAvKiE8IFVTQVJUIGNsb2NrIGRpc2FibGUgKi8KKyNkZWZpbmUgVVNBUlRfQ0xPQ0tfRU5BQkxFICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClVU0FSVF9DUjJfQ0xLRU4pICAgLyohPCBVU0FSVCBjbG9jayBlbmFibGUgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0Nsb2NrX1BvbGFyaXR5ICBVU0FSVCBDbG9jayBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIFVTQVJUX1BPTEFSSVRZX0xPVyAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgLyohPCBVU0FSVCBDbG9jayBzaWduYWwgaXMgc3RlYWR5IExvdyAgKi8KKyNkZWZpbmUgVVNBUlRfUE9MQVJJVFlfSElHSCAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClVU0FSVF9DUjJfQ1BPTCkgICAvKiE8IFVTQVJUIENsb2NrIHNpZ25hbCBpcyBzdGVhZHkgSGlnaCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9DbG9ja19QaGFzZSAgIFVTQVJUIENsb2NrIFBoYXNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVVNBUlRfUEhBU0VfMUVER0UgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAvKiE8IFVTQVJUIGZyYW1lIHBoYXNlIG9uIGZpcnN0IGNsb2NrIHRyYW5zaXRpb24gICovCisjZGVmaW5lIFVTQVJUX1BIQVNFXzJFREdFICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpVVNBUlRfQ1IyX0NQSEEpICAgLyohPCBVU0FSVCBmcmFtZSBwaGFzZSBvbiBzZWNvbmQgY2xvY2sgdHJhbnNpdGlvbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MYXN0X0JpdCAgVVNBUlQgTGFzdCBCaXQKKyAgKiBAeworICAqLworI2RlZmluZSBVU0FSVF9MQVNUQklUX0RJU0FCTEUgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgIC8qITwgVVNBUlQgZnJhbWUgbGFzdCBkYXRhIGJpdCBjbG9jayBwdWxzZSBub3Qgb3V0cHV0IHRvIFNDTEsgcGluICovCisjZGVmaW5lIFVTQVJUX0xBU1RCSVRfRU5BQkxFICAgICAgICAgICAgICAgICgodWludDMyX3QpVVNBUlRfQ1IyX0xCQ0wpICAgLyohPCBVU0FSVCBmcmFtZSBsYXN0IGRhdGEgYml0IGNsb2NrIHB1bHNlIG91dHB1dCB0byBTQ0xLIHBpbiAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfUmVxdWVzdF9QYXJhbWV0ZXJzICBVU0FSVCBSZXF1ZXN0IFBhcmFtZXRlcnMKKyAgKiBAeworICAqLworI2RlZmluZSBVU0FSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCAgICAgICAgKCh1aW50MzJfdClVU0FSVF9SUVJfUlhGUlEpICAgIC8qITwgUmVjZWl2ZSBEYXRhIGZsdXNoIFJlcXVlc3QgICovCisjZGVmaW5lIFVTQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUICAgICAgICAoKHVpbnQzMl90KVVTQVJUX1JRUl9UWEZSUSkgICAgLyohPCBUcmFuc21pdCBkYXRhIGZsdXNoIFJlcXVlc3QgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfRmxhZ3MgICAgICBVU0FSVCBGbGFncworICAqICAgICAgICBFbGVtZW50cyB2YWx1ZXMgY29udmVudGlvbjogMHhYWFhYCisgICogICAgICAgICAgIC0gMHhYWFhYICA6IEZsYWcgbWFzayBpbiB0aGUgSVNSIHJlZ2lzdGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVVNBUlRfRkxBR19SRUFDSyAgICAgICAgICAgICAgICAgICAgICgweDAwNDAwMDAwVSkgICAgLyohPCBVU0FSVCByZWNlaXZlIGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnICAqLworI2RlZmluZSBVU0FSVF9GTEFHX1RFQUNLICAgICAgICAgICAgICAgICAgICAgKDB4MDAyMDAwMDBVKSAgICAvKiE8IFVTQVJUIHRyYW5zbWl0IGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnICovCisjZGVmaW5lIFVTQVJUX0ZMQUdfQlVTWSAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAxMDAwMFUpICAgIC8qITwgVVNBUlQgYnVzeSBmbGFnICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfRkxBR19DVFMgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwNDAwVSkgICAgLyohPCBVU0FSVCBjbGVhciB0byBzZW5kIGZsYWcgICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9GTEFHX0NUU0lGICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAyMDBVKSAgICAvKiE8IFVTQVJUIGNsZWFyIHRvIHNlbmQgaW50ZXJydXB0IGZsYWcgICAgICovCisjZGVmaW5lIFVTQVJUX0ZMQUdfTEJERiAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDEwMFUpICAgIC8qITwgVVNBUlQgTElOIGJyZWFrIGRldGVjdGlvbiBmbGFnICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfRkxBR19UWEUgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDgwVSkgICAgLyohPCBVU0FSVCB0cmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5ICAgICAqLworI2RlZmluZSBVU0FSVF9GTEFHX1RDICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwNDBVKSAgICAvKiE8IFVTQVJUIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSAgICAgICAgICAgICovCisjZGVmaW5lIFVTQVJUX0ZMQUdfUlhORSAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAyMFUpICAgIC8qITwgVVNBUlQgcmVhZCBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSAgICAgKi8KKyNkZWZpbmUgVVNBUlRfRkxBR19JRExFICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDEwVSkgICAgLyohPCBVU0FSVCBpZGxlIGZsYWcgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9GTEFHX09SRSAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDhVKSAgICAvKiE8IFVTQVJUIG92ZXJydW4gZXJyb3IgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVTQVJUX0ZMQUdfTkUgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwNFUpICAgIC8qITwgVVNBUlQgbm9pc2UgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfRkxBR19GRSAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAyVSkgICAgLyohPCBVU0FSVCBmcmFtZSBlcnJvciAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9GTEFHX1BFICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDFVKSAgICAvKiE8IFVTQVJUIHBhcml0eSBlcnJvciAgICAgICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0ludGVycnVwdF9kZWZpbml0aW9uIFVTQVJUIEludGVycnVwdHMgRGVmaW5pdGlvbgorICAqICAgICAgICBFbGVtZW50cyB2YWx1ZXMgY29udmVudGlvbjogMDAwMFpaWlowWFhZWVlZWWIKKyAgKiAgICAgICAgICAgLSBZWVlZWSAgOiBJbnRlcnJ1cHQgc291cmNlIHBvc2l0aW9uIGluIHRoZSBYWCByZWdpc3RlciAoNWJpdHMpCisgICogICAgICAgICAgIC0gWFggIDogSW50ZXJydXB0IHNvdXJjZSByZWdpc3RlciAoMmJpdHMpCisgICogICAgICAgICAgICAgICAgIC0gMDE6IENSMSByZWdpc3RlcgorICAqICAgICAgICAgICAgICAgICAtIDEwOiBDUjIgcmVnaXN0ZXIKKyAgKiAgICAgICAgICAgICAgICAgLSAxMTogQ1IzIHJlZ2lzdGVyCisgICogICAgICAgICAgIC0gWlpaWiAgOiBGbGFnIHBvc2l0aW9uIGluIHRoZSBJU1IgcmVnaXN0ZXIoNGJpdHMpCisgICogQHsKKyAgKi8KKworI2RlZmluZSBVU0FSVF9JVF9QRSAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMjhVKSAgICAgLyohPCBVU0FSVCBwYXJpdHkgZXJyb3IgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9JVF9UWEUgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDA3MjdVKSAgICAgLyohPCBVU0FSVCB0cmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGludGVycnVwdGlvbiAqLworI2RlZmluZSBVU0FSVF9JVF9UQyAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDA2MjZVKSAgICAgLyohPCBVU0FSVCB0cmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0aW9uICAgICAgICAqLworI2RlZmluZSBVU0FSVF9JVF9SWE5FICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDA1MjVVKSAgICAgLyohPCBVU0FSVCByZWFkIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdGlvbiAqLworI2RlZmluZSBVU0FSVF9JVF9JRExFICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDA0MjRVKSAgICAgLyohPCBVU0FSVCBpZGxlIGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9JVF9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwNjBVKSAgICAgLyohPCBVU0FSVCBlcnJvciBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9JVF9PUkUgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAzMDBVKSAgICAgLyohPCBVU0FSVCBvdmVycnVuIGVycm9yIGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9JVF9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAyMDBVKSAgICAgLyohPCBVU0FSVCBub2lzZSBlcnJvciBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9JVF9GRSAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAxMDBVKSAgICAgLyohPCBVU0FSVCBmcmFtZSBlcnJvciBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9JVF9DTEVBUl9GbGFncyAgICBVU0FSVCBJbnRlcnJ1cHRpb24gQ2xlYXIgRmxhZ3MKKyAgKiBAeworICAqLworI2RlZmluZSBVU0FSVF9DTEVBUl9QRUYgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9QRUNGICAgICAgICAgICAgLyohPCBQYXJpdHkgRXJyb3IgQ2xlYXIgRmxhZyAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9DTEVBUl9GRUYgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9GRUNGICAgICAgICAgICAgLyohPCBGcmFtaW5nIEVycm9yIENsZWFyIEZsYWcgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9DTEVBUl9ORUYgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9OQ0YgICAgICAgICAgICAgLyohPCBOb2lzZSBkZXRlY3RlZCBDbGVhciBGbGFnICAgICAgICAqLworI2RlZmluZSBVU0FSVF9DTEVBUl9PUkVGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9PUkVDRiAgICAgICAgICAgLyohPCBPdmVyUnVuIEVycm9yIENsZWFyIEZsYWcgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9DTEVBUl9JRExFRiAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9JRExFQ0YgICAgICAgICAgLyohPCBJRExFIGxpbmUgZGV0ZWN0ZWQgQ2xlYXIgRmxhZyAgICAqLworI2RlZmluZSBVU0FSVF9DTEVBUl9UQ0YgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9UQ0NGICAgICAgICAgICAgLyohPCBUcmFuc21pc3Npb24gQ29tcGxldGUgQ2xlYXIgRmxhZyAqLworI2RlZmluZSBVU0FSVF9DTEVBUl9DVFNGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9DVFNDRiAgICAgICAgICAgLyohPCBDVFMgSW50ZXJydXB0IENsZWFyIEZsYWcgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9JbnRlcnJ1cHRpb25fTWFzayAgICBVU0FSVCBJbnRlcnJ1cHRpb24gRmxhZ3MgTWFzaworICAqIEB7CisgICovCisjZGVmaW5lIFVTQVJUX0lUX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDFGVSkgICAgIC8qITwgVVNBUlQgaW50ZXJydXB0aW9ucyBmbGFncyBtYXNrICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVU0FSVF9FeHBvcnRlZF9NYWNyb3MgVVNBUlQgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgUmVzZXQgVVNBUlQgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VTQVJUX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVTRVQpCisKKy8qKiBAYnJpZWYgIEZsdXNoIHRoZSBVU0FSVCBEYXRhIHJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lICAKKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfRkxVU0hfRFJSRUdJU1RFUihfX0hBTkRMRV9fKSAgXAorICBkb3sgICAgICAgICAgICAgICAgXAorICAgICAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SUVIsIFVTQVJUX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsgXAorICAgICAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SUVIsIFVTQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUKTsgXAorICAgIH0gIHdoaWxlKDBVKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVVNBUlQgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIEhhbmRsZQorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0ZMQUdfUkVBQ0sgUmVjZWl2ZSBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0ZMQUdfVEVBQ0sgVHJhbnNtaXQgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9GTEFHX0JVU1kgIEJ1c3kgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0ZMQUdfQ1RTICAgQ1RTIENoYW5nZSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfRkxBR19UWEUgICBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9GTEFHX1RDICAgIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfRkxBR19SWE5FICBSZWNlaXZlIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9GTEFHX0lETEUgIElkbGUgTGluZSBkZXRlY3Rpb24gZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0ZMQUdfT1JFICAgT3ZlclJ1biBFcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfRkxBR19ORSAgICBOb2lzZSBFcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfRkxBR19GRSAgICBGcmFtaW5nIEVycm9yIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9GTEFHX1BFICAgIFBhcml0eSBFcnJvciBmbGFnCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRkxBR19fIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSICYgKF9fRkxBR19fKSkgPT0gKF9fRkxBR19fKSkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBVU0FSVCBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfQ0xFQVJfUEVGCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfQ0xFQVJfRkVGCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfQ0xFQVJfTkVGCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfQ0xFQVJfT1JFRgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0NMRUFSX0lETEVGCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfQ0xFQVJfVENGCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfQ0xFQVJfQ1RTRgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VU0FSVF9DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUNSID0gKF9fRkxBR19fKSkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFVTQVJUIFBFIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VTQVJUX0NMRUFSX1BFRkxBRyhfX0hBTkRMRV9fKSAgIF9fSEFMX1VTQVJUX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBVU0FSVF9DTEVBUl9QRUYpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBVU0FSVCBGRSBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VU0FSVF9DTEVBUl9GRUZMQUcoX19IQU5ETEVfXykgICBfX0hBTF9VU0FSVF9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgVVNBUlRfQ0xFQVJfRkVGKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgVVNBUlQgTkUgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfQ0xFQVJfTkVGTEFHKF9fSEFORExFX18pICBfX0hBTF9VU0FSVF9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgVVNBUlRfQ0xFQVJfTkVGKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgVVNBUlQgT1JFIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VTQVJUX0NMRUFSX09SRUZMQUcoX19IQU5ETEVfXykgICBfX0hBTF9VU0FSVF9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgVVNBUlRfQ0xFQVJfT1JFRikKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFVTQVJUIElETEUgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfQ0xFQVJfSURMRUZMQUcoX19IQU5ETEVfXykgICBfX0hBTF9VU0FSVF9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgVVNBUlRfQ0xFQVJfSURMRUYpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIFVTQVJUIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgVVNBUlQgaW50ZXJydXB0IHNvdXJjZSB0byBlbmFibGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9UWEUgIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfVEMgICBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfUlhORSBSZWNlaXZlIERhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX0lETEUgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9QRSAgIFBhcml0eSBFcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9FUlIgIEVycm9yIGludGVycnVwdChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VTQVJUX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICgoKCgoX19JTlRFUlJVUFRfXykgJiAweEZGVSkgPj4gNVUpID09IDFVKT8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSB8PSAoMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFVTQVJUX0lUX01BU0spKSk6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKChfX0lOVEVSUlVQVF9fKSAmIDB4RkZVKSA+PiA1VSkgPT0gMlUpPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyIHw9ICgxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgVVNBUlRfSVRfTUFTSykpKTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMyB8PSAoMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFVTQVJUX0lUX01BU0spKSkpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBVU0FSVCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIGludGVycnVwdCBzb3VyY2UgdG8gZGlzYWJsZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1RYRSAgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9UQyAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9SWE5FIFJlY2VpdmUgRGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfSURMRSBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1BFICAgUGFyaXR5IEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX0VSUiAgRXJyb3IgaW50ZXJydXB0KEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgKCgoKChfX0lOVEVSUlVQVF9fKSAmIDB4RkZVKSA+PiA1VSkgPT0gMVUpPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICY9IH4gKDFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBVU0FSVF9JVF9NQVNLKSkpOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoX19JTlRFUlJVUFRfXykgJiAweEZGVSkgPj4gNVUpID09IDJVKT8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiAmPSB+ICgxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgVVNBUlRfSVRfTUFTSykpKTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMyAmPSB+ICgxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgVVNBUlRfSVRfTUFTSykpKSkKKworCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVVNBUlQgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JVF9fIHNwZWNpZmllcyB0aGUgVVNBUlQgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1RYRSBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1RDICBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfUlhORSBSZWNlaXZlIERhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX0lETEUgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9PUkUgT3ZlclJ1biBFcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9ORSBOb2lzZSBFcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9GRSBGcmFtaW5nIEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1BFIFBhcml0eSBFcnJvciBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JVF9fIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfR0VUX0lUKF9fSEFORExFX18sIF9fSVRfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmICgxVSA8PCAoKF9fSVRfXyk+PiAweDA4VSkpKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVVNBUlQgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBIYW5kbGUuCisgICogQHBhcmFtICBfX0lUX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfVFhFIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfVEMgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9SWE5FIFJlY2VpdmUgRGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfSURMRSBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX09SRSBPdmVyUnVuIEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX05FIE5vaXNlIEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX0ZFIEZyYW1pbmcgRXJyb3IgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfUEUgUGFyaXR5IEVycm9yIGludGVycnVwdAorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0lUX18gKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBfX0hBTF9VU0FSVF9HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSVRfXykgKCgoKCgodWludDhfdCkoX19JVF9fKSkgPj4gNVUpID09IDFVKT8gKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxOigoKCgodWludDhfdCkoX19JVF9fKSkgPj4gNVUpID09IDJVKT8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyIDogKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzKSkgJiAoMVUgPDwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodWludDE2X3QpKF9fSVRfXykpICYgVVNBUlRfSVRfTUFTSykpKQorCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBzcGVjaWZpZWQgVVNBUlQgSVNSIGZsYWcsIGluIHNldHRpbmcgdGhlIHByb3BlciBJQ1IgcmVnaXN0ZXIgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBIYW5kbGUuCisgICogQHBhcmFtICBfX0lUX0NMRUFSX18gc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgY2xlYXIgcmVnaXN0ZXIgZmxhZyB0aGF0IG5lZWRzIHRvIGJlIHNldAorICAqICAgICAgICAgICAgICAgICAgICAgICB0byBjbGVhciB0aGUgY29ycmVzcG9uZGluZyBpbnRlcnJ1cHQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9DTEVBUl9QRUYgUGFyaXR5IEVycm9yIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9DTEVBUl9GRUYgRnJhbWluZyBFcnJvciBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfQ0xFQVJfTkVGIE5vaXNlIGRldGVjdGVkIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9DTEVBUl9PUkVGIE92ZXJSdW4gRXJyb3IgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0NMRUFSX0lETEVGIElETEUgbGluZSBkZXRlY3RlZCBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfQ0xFQVJfVENGIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfQ0xFQVJfQ1RTRiBDVFMgSW50ZXJydXB0IENsZWFyIEZsYWcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfQ0xFQVJfSVQoX19IQU5ETEVfXywgX19JVF9DTEVBUl9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUNSID0gKHVpbnQzMl90KShfX0lUX0NMRUFSX18pKQorCisvKiogQGJyaWVmICBTZXQgYSBzcGVjaWZpYyBVU0FSVCByZXF1ZXN0IGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19SRVFfXyBzcGVjaWZpZXMgdGhlIHJlcXVlc3QgZmxhZyB0byBzZXQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCBSZWNlaXZlIERhdGEgZmx1c2ggUmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUIFRyYW5zbWl0IGRhdGEgZmx1c2ggUmVxdWVzdAorICAqCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VTQVJUX1NFTkRfUkVRKF9fSEFORExFX18sIF9fUkVRX18pICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlJRUiB8PSAoX19SRVFfXykpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgVVNBUlQgb25lIGJpdCBzYW1wbGUgbWV0aG9kLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIEhhbmRsZS4gIAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VU0FSVF9PTkVfQklUX1NBTVBMRV9FTkFCTEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSM3w9IFVTQVJUX0NSM19PTkVCSVQpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIFVTQVJUIG9uZSBiaXQgc2FtcGxlIG1ldGhvZC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBIYW5kbGUuICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfT05FX0JJVF9TQU1QTEVfRElTQUJMRShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzICY9ICh1aW50MzJfdCl+KCh1aW50MzJfdClVU0FSVF9DUjNfT05FQklUKSkKKworLyoqIEBicmllZiAgRW5hYmxlIFVTQVJULgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxIHw9ICBVU0FSVF9DUjFfVUUpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgVVNBUlQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VU0FSVF9ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJj0gIH5VU0FSVF9DUjFfVUUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVVNBUlRfUHJpdmF0ZV9NYWNyb3MgICBVU0FSVCBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIENoZWNrIFVTQVJUIEJhdWQgcmF0ZS4KKyAgKiBAcGFyYW0gIF9fQkFVRFJBVEVfXyBCYXVkcmF0ZSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCisgICogICAgICAgICBUaGUgbWF4aW11bSBCYXVkIFJhdGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBtYXhpbXVtIGNsb2NrIG9uIEYzIChpLmUuIDcyIE1IeikKKyAgKiAgICAgICAgIGRpdmlkZWQgYnkgdGhlIHNtYWxsZXN0IG92ZXJzYW1wbGluZyB1c2VkIG9uIHRoZSBVU0FSVCAoaS5lLiA4KS4KKyAgKiBAcmV0dmFsIFRlc3QgcmVzdWx0IChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgSVNfVVNBUlRfQkFVRFJBVEUoX19CQVVEUkFURV9fKSAoKF9fQkFVRFJBVEVfXykgPCA5MDAwMDAxVSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVTQVJUIGZyYW1lIG51bWJlciBvZiBzdG9wIGJpdHMgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fU1RPUEJJVFNfXyBVU0FSVCBmcmFtZSBudW1iZXIgb2Ygc3RvcCBiaXRzLgorICAqIEByZXR2YWwgU0VUIChfX1NUT1BCSVRTX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1NUT1BCSVRTX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVVNBUlRfU1RPUEJJVFMoX19TVE9QQklUU19fKSAoKChfX1NUT1BCSVRTX18pID09IFVTQVJUX1NUT1BCSVRTXzBfNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1RPUEJJVFNfXykgPT0gVVNBUlRfU1RPUEJJVFNfMSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TVE9QQklUU19fKSA9PSBVU0FSVF9TVE9QQklUU18xXzUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUT1BCSVRTX18pID09IFVTQVJUX1NUT1BCSVRTXzIpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVVNBUlQgZnJhbWUgcGFyaXR5IGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1BBUklUWV9fIFVTQVJUIGZyYW1lIHBhcml0eS4gCisgICogQHJldHZhbCBTRVQgKF9fUEFSSVRZX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1BBUklUWV9fIGlzIGludmFsaWQpCisgICovIAorI2RlZmluZSBJU19VU0FSVF9QQVJJVFkoX19QQVJJVFlfXykgKCgoX19QQVJJVFlfXykgPT0gVVNBUlRfUEFSSVRZX05PTkUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUEFSSVRZX18pID09IFVTQVJUX1BBUklUWV9FVkVOKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BBUklUWV9fKSA9PSBVU0FSVF9QQVJJVFlfT0REKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVTQVJUIGNvbW11bmljYXRpb24gbW9kZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19NT0RFX18gVVNBUlQgY29tbXVuaWNhdGlvbiBtb2RlLiAKKyAgKiBAcmV0dmFsIFNFVCAoX19NT0RFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX01PREVfXyBpcyBpbnZhbGlkKQorICAqLyAKKyNkZWZpbmUgSVNfVVNBUlRfTU9ERShfX01PREVfXykgKCgoKF9fTU9ERV9fKSAmIDB4RkZGRkZGRjNVKSA9PSAweDAwVSkgJiYgKChfX01PREVfXykgIT0gMHgwMFUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVVNBUlQgY2xvY2sgc3RhdGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fQ0xPQ0tfXyBVU0FSVCBjbG9jayBzdGF0ZS4gCisgICogQHJldHZhbCBTRVQgKF9fQ0xPQ0tfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fQ0xPQ0tfXyBpcyBpbnZhbGlkKQorICAqLyAKKyNkZWZpbmUgSVNfVVNBUlRfQ0xPQ0soX19DTE9DS19fKSAoKChfX0NMT0NLX18pID09IFVTQVJUX0NMT0NLX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFVTQVJUX0NMT0NLX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVU0FSVCBmcmFtZSBwb2xhcml0eSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19DUE9MX18gVVNBUlQgZnJhbWUgcG9sYXJpdHkuIAorICAqIEByZXR2YWwgU0VUIChfX0NQT0xfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fQ1BPTF9fIGlzIGludmFsaWQpCisgICovIAorI2RlZmluZSBJU19VU0FSVF9QT0xBUklUWShfX0NQT0xfXykgKCgoX19DUE9MX18pID09IFVTQVJUX1BPTEFSSVRZX0xPVykgfHwgKChfX0NQT0xfXykgPT0gVVNBUlRfUE9MQVJJVFlfSElHSCkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVU0FSVCBmcmFtZSBwaGFzZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19DUEhBX18gVVNBUlQgZnJhbWUgcGhhc2UuIAorICAqIEByZXR2YWwgU0VUIChfX0NQSEFfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fQ1BIQV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VTQVJUX1BIQVNFKF9fQ1BIQV9fKSAoKChfX0NQSEFfXykgPT0gVVNBUlRfUEhBU0VfMUVER0UpIHx8ICgoX19DUEhBX18pID09IFVTQVJUX1BIQVNFXzJFREdFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVTQVJUIGZyYW1lIGxhc3QgYml0IGNsb2NrIHB1bHNlIHNldHRpbmcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fTEFTVEJJVF9fIFVTQVJUIGZyYW1lIGxhc3QgYml0IGNsb2NrIHB1bHNlIHNldHRpbmcuIAorICAqIEByZXR2YWwgU0VUIChfX0xBU1RCSVRfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTEFTVEJJVF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VTQVJUX0xBU1RCSVQoX19MQVNUQklUX18pICgoKF9fTEFTVEJJVF9fKSA9PSBVU0FSVF9MQVNUQklUX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MQVNUQklUX18pID09IFVTQVJUX0xBU1RCSVRfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVTQVJUIHJlcXVlc3QgcGFyYW1ldGVyIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1BBUkFNX18gVVNBUlQgcmVxdWVzdCBwYXJhbWV0ZXIuIAorICAqIEByZXR2YWwgU0VUIChfX1BBUkFNX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1BBUkFNX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVVNBUlRfUkVRVUVTVF9QQVJBTUVURVIoX19QQVJBTV9fKSAoKChfX1BBUkFNX18pID09IFVTQVJUX1JYREFUQV9GTFVTSF9SRVFVRVNUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQVJBTV9fKSA9PSBVU0FSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCkpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEluY2x1ZGUgVVNBUlQgSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfdXNhcnRfZXguaCIKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBVU0FSVF9FeHBvcnRlZF9GdW5jdGlvbnMgVVNBUlQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVTQVJUX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfSW5pdChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX0RlSW5pdChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOwordm9pZCBIQUxfVVNBUlRfTXNwSW5pdChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOwordm9pZCBIQUxfVVNBUlRfTXNwRGVJbml0KFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBVU0FSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0KFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDhfdCAqcFR4RGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfUmVjZWl2ZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0X0lUKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDhfdCAqcFR4RGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfUmVjZWl2ZV9JVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZV9JVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQ4X3QgKnBSeERhdGEsICB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9UcmFuc21pdF9ETUEoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50OF90ICpwVHhEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9SZWNlaXZlX0RNQShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZV9ETUEoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50OF90ICpwVHhEYXRhLCB1aW50OF90ICpwUnhEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9ETUFQYXVzZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX0RNQVJlc3VtZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX0RNQVN0b3AoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKKy8qIFRyYW5zZmVyIEFib3J0IGZ1bmN0aW9ucyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX0Fib3J0KFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfQWJvcnRfSVQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKKwordm9pZCBIQUxfVVNBUlRfSVJRSGFuZGxlcihVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOwordm9pZCBIQUxfVVNBUlRfVHhDcGx0Q2FsbGJhY2soVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKK3ZvaWQgSEFMX1VTQVJUX1R4SGFsZkNwbHRDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOwordm9pZCBIQUxfVVNBUlRfUnhDcGx0Q2FsbGJhY2soVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKK3ZvaWQgSEFMX1VTQVJUX1J4SGFsZkNwbHRDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOwordm9pZCBIQUxfVVNBUlRfVHhSeENwbHRDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOwordm9pZCBIQUxfVVNBUlRfRXJyb3JDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOwordm9pZCBIQUxfVVNBUlRfQWJvcnRDcGx0Q2FsbGJhY2sgKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiBAYWRkdG9ncm91cCBVU0FSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfVVNBUlRfU3RhdGVUeXBlRGVmIEhBTF9VU0FSVF9HZXRTdGF0ZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOwordWludDMyX3QgICAgICAgICAgICAgICBIQUxfVVNBUlRfR2V0RXJyb3IoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJGM3h4X0hBTF9VU0FSVF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCisKZGlmZiAtLWdpdCBhL0luYy9zdG0zMmYzeHhfaGFsX3VzYXJ0X2V4LmggYi9JbmMvc3RtMzJmM3h4X2hhbF91c2FydF9leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYzUwYjEKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2hhbF91c2FydF9leC5oCkBAIC0wLDAgKzEsMzIyIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2hhbF91c2FydF9leC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBVU0FSVCBIQUwgRXh0ZW5kZWQgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkYzeHhfSEFMX1VTQVJUX0VYX0gKKyNkZWZpbmUgX19TVE0zMkYzeHhfSEFMX1VTQVJUX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVVNBUlRFeAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVU0FSVEV4X0V4cG9ydGVkX0NvbnN0YW50cyBVU0FSVEV4IEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRFeF9Xb3JkX0xlbmd0aCBVU0FSVEV4IFdvcmQgTGVuZ3RoCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMzR4OCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisjZGVmaW5lIFVTQVJUX1dPUkRMRU5HVEhfN0IgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVVTQVJUX0NSMV9NMSkgICAvKiE8IDctYml0IGxvbmcgVVNBUlQgZnJhbWUgKi8KKyNkZWZpbmUgVVNBUlRfV09SRExFTkdUSF84QiAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgIC8qITwgOC1iaXQgbG9uZyBVU0FSVCBmcmFtZSAqLworI2RlZmluZSBVU0FSVF9XT1JETEVOR1RIXzlCICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClVU0FSVF9DUjFfTTApICAgLyohPCA5LWJpdCBsb25nIFVTQVJUIGZyYW1lICovCisjZWxzZQorI2RlZmluZSBVU0FSVF9XT1JETEVOR1RIXzhCICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgLyohPCA4LWJpdCBsb25nIFVTQVJUIGZyYW1lICovCisjZGVmaW5lIFVTQVJUX1dPUkRMRU5HVEhfOUIgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVVTQVJUX0NSMV9NKSAgICAvKiE8IDktYml0IGxvbmcgVVNBUlQgZnJhbWUgKi8KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMzNHg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVTQVJURXhfUHJpdmF0ZV9NYWNyb3MgVVNBUlRFeCBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIFJlcG9ydCB0aGUgVVNBUlQgY2xvY2sgc291cmNlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fQ0xPQ0tTT1VSQ0VfXyBvdXRwdXQgdmFyaWFibGUuCisgICogQHJldHZhbCB0aGUgVVNBUlQgY2xvY2tpbmcgc291cmNlLCB3cml0dGVuIGluIF9fQ0xPQ0tTT1VSQ0VfXy4KKyAgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKyNkZWZpbmUgVVNBUlRfR0VUQ0xPQ0tTT1VSQ0UoX19IQU5ETEVfXyxfX0NMT0NLU09VUkNFX18pICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZigoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMSkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDFfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVTQVJUX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0hTSTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVTQVJUX0NMT0NLU09VUkNFX0hTSTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1NZU0NMSzogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVTQVJUX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0xTRTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVTQVJUX0NMT0NLU09VUkNFX0xTRTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVTQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQyKSAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQzKSAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSgwVSkKKyNlbHNlCisjZGVmaW5lIFVTQVJUX0dFVENMT0NLU09VUkNFKF9fSEFORExFX18sX19DTE9DS1NPVVJDRV9fKSAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDEpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQxX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMjogICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9QQ0xLMjsgICAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9IU0k7ICAgICAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9TWVNDTEs7ICAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9MU0U7ICAgICAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZigoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMikgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQyX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9IU0k7ICAgICAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9TWVNDTEs7ICAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9MU0U7ICAgICAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZigoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMykgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQzX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9IU0k7ICAgICAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9TWVNDTEs7ICAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9MU0U7ICAgICAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVTQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUoMFUpICAKKyNlbmRpZiAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCAqLworCisvKiogQGJyaWVmICBDb21wdXRlIHRoZSBVU0FSVCBtYXNrIHRvIGFwcGx5IHRvIHJldHJpZXZlIHRoZSByZWNlaXZlZCBkYXRhCisgICogICAgICAgICBhY2NvcmRpbmcgdG8gdGhlIHdvcmQgbGVuZ3RoIGFuZCB0byB0aGUgcGFyaXR5IGJpdHMgYWN0aXZhdGlvbi4KKyAgKiBAbm90ZSAgIElmIFBDRSA9IDEsIHRoZSBwYXJpdHkgYml0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgZGF0YSBleHRyYWN0ZWQKKyAgKiAgICAgICAgIGJ5IHRoZSByZWNlcHRpb24gQVBJKCkuCisgICogICAgICAgICBUaGlzIG1hc2tpbmcgb3BlcmF0aW9uIGlzIG5vdCBjYXJyaWVkIG91dCBpbiB0aGUgY2FzZSBvZgorICAqICAgICAgICAgRE1BIHRyYW5zZmVycy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lLCB0aGUgbWFzayB0byBhcHBseSB0byBVU0FSVCBSRFIgcmVnaXN0ZXIgaXMgc3RvcmVkIGluIChfX0hBTkRMRV9fKS0+TWFzayBmaWVsZC4KKyAgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMzR4OCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisjZGVmaW5lIFVTQVJUX01BU0tfQ09NUFVUQVRJT04oX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5Xb3JkTGVuZ3RoID09IFVTQVJUX1dPUkRMRU5HVEhfOUIpICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpZiAoKF9fSEFORExFX18pLT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkgICAgICAgICAgICAgIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDFGRlUgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwRkZVIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBlbHNlIGlmICgoX19IQU5ETEVfXyktPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzhCKSAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGlmICgoX19IQU5ETEVfXyktPkluaXQuUGFyaXR5ID09IFVTQVJUX1BBUklUWV9OT05FKSAgICAgICAgICAgICAgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMEZGVSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDA3RlUgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5Xb3JkTGVuZ3RoID09IFVTQVJUX1dPUkRMRU5HVEhfN0IpICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5QYXJpdHkgPT0gVVNBUlRfUEFSSVRZX05PTkUpICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwN0ZVIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMDNGVSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUoMFUpCisjZWxzZQorI2RlZmluZSBVU0FSVF9NQVNLX0NPTVBVVEFUSU9OKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICgoX19IQU5ETEVfXyktPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzlCKSAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5QYXJpdHkgPT0gVVNBUlRfUEFSSVRZX05PTkUpICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAxRkZVIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMEZGVSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZWxzZSBpZiAoKF9fSEFORExFX18pLT5Jbml0LldvcmRMZW5ndGggPT0gVVNBUlRfV09SRExFTkdUSF84QikgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpZiAoKF9fSEFORExFX18pLT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkgICAgICAgICAgICAgIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDBGRlUgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwN0ZVIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSgwVSkKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMzNHg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggICAgKi8KKworCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVVNBUlQgZnJhbWUgbGVuZ3RoIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0xFTkdUSF9fIFVTQVJUIGZyYW1lIGxlbmd0aC4gCisgICogQHJldHZhbCBTRVQgKF9fTEVOR1RIX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0xFTkdUSF9fIGlzIGludmFsaWQpCisgICovCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzM0eDgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorI2RlZmluZSBJU19VU0FSVF9XT1JEX0xFTkdUSChfX0xFTkdUSF9fKSAoKChfX0xFTkdUSF9fKSA9PSBVU0FSVF9XT1JETEVOR1RIXzdCKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVOR1RIX18pID09IFVTQVJUX1dPUkRMRU5HVEhfOEIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVVNBUlRfV09SRExFTkdUSF85QikpCisjZWxzZQorI2RlZmluZSBJU19VU0FSVF9XT1JEX0xFTkdUSChfX0xFTkdUSF9fKSAoKChfX0xFTkdUSF9fKSA9PSBVU0FSVF9XT1JETEVOR1RIXzhCKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVOR1RIX18pID09IFVTQVJUX1dPUkRMRU5HVEhfOUIpKQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzM0eDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJGM3h4X0hBTF9VU0FSVF9FWF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCisKZGlmZiAtLWdpdCBhL0luYy9zdG0zMmYzeHhfaGFsX3d3ZGcuaCBiL0luYy9zdG0zMmYzeHhfaGFsX3d3ZGcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzczMzZkCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjN4eF9oYWxfd3dkZy5oCkBAIC0wLDAgKzEsMjgzIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2hhbF93d2RnLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFdXREcgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0hBTF9XV0RHX0gKKyNkZWZpbmUgX19TVE0zMkYzeHhfSEFMX1dXREdfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBXV0RHCisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBXV0RHX0V4cG9ydGVkX1R5cGVzIFdXREcgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKiogCisgICogQGJyaWVmICBXV0RHIEluaXQgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFByZXNjYWxlcjsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBwcmVzY2FsZXIgdmFsdWUgb2YgdGhlIFdXREcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBXV0RHX1ByZXNjYWxlciAqLworCisgIHVpbnQzMl90IFdpbmRvdzsgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBXV0RHIHdpbmRvdyB2YWx1ZSB0byBiZSBjb21wYXJlZCB0byB0aGUgZG93bmNvdW50ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBNaW5fRGF0YSA9IDB4NDAgYW5kIE1heF9EYXRhID0gMHg3RlUgKi8KKworICB1aW50MzJfdCBDb3VudGVyOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgV1dERyBmcmVlLXJ1bm5pbmcgZG93bmNvdW50ZXIgIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4NDAgYW5kIE1heF9EYXRhID0gMHg3RlUgKi8KKworICB1aW50MzJfdCBFV0lNb2RlIDsgICAgICAvKiE8IFNwZWNpZmllcyBpZiBXV0RHIEVhcmx5IFdha2V1cCBJbnRlcnVwdCBpcyBlbmFibGUgb3Igbm90LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgV1dER19FV0lfTW9kZSAqLworCit9V1dER19Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBXV0RHIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgV1dER19UeXBlRGVmICAgICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAgICAqLworCisgIFdXREdfSW5pdFR5cGVEZWYgICAgICAgICAgICAgSW5pdDsgICAgICAgLyohPCBXV0RHIHJlcXVpcmVkIHBhcmFtZXRlcnMgKi8KKworfVdXREdfSGFuZGxlVHlwZURlZjsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgV1dER19FeHBvcnRlZF9Db25zdGFudHMgV1dERyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFdXREdfSW50ZXJydXB0X2RlZmluaXRpb24gV1dERyBJbnRlcnJ1cHQgZGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFdXREdfSVRfRVdJICAgICAgICAgICAgICAgICAgICAgICAgIFdXREdfQ0ZSX0VXSSAgLyohPCBFYXJseSB3YWtldXAgaW50ZXJydXB0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFdXREdfRmxhZ19kZWZpbml0aW9uIFdXREcgRmxhZyBkZWZpbml0aW9uCisgICogQGJyaWVmIFdXREcgRmxhZyBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgV1dER19GTEFHX0VXSUYgICAgICAgICAgICAgICAgICAgICAgV1dER19TUl9FV0lGICAvKiE8IEVhcmx5IHdha2V1cCBpbnRlcnJ1cHQgZmxhZyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBXV0RHX1ByZXNjYWxlciBXV0RHIFByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIFdXREdfUFJFU0NBTEVSXzEgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDB1ICAgICAgIC8qITwgV1dERyBjb3VudGVyIGNsb2NrID0gKFBDTEsxLzQwOTZVKS8xVSAqLworI2RlZmluZSBXV0RHX1BSRVNDQUxFUl8yICAgICAgICAgICAgICAgICAgICBXV0RHX0NGUl9XREdUQl8wICAvKiE8IFdXREcgY291bnRlciBjbG9jayA9IChQQ0xLMS80MDk2VSkvMlUgKi8KKyNkZWZpbmUgV1dER19QUkVTQ0FMRVJfNCAgICAgICAgICAgICAgICAgICAgV1dER19DRlJfV0RHVEJfMSAgLyohPCBXV0RHIGNvdW50ZXIgY2xvY2sgPSAoUENMSzEvNDA5NlUpLzRVICovCisjZGVmaW5lIFdXREdfUFJFU0NBTEVSXzggICAgICAgICAgICAgICAgICAgIFdXREdfQ0ZSX1dER1RCICAgIC8qITwgV1dERyBjb3VudGVyIGNsb2NrID0gKFBDTEsxLzQwOTZVKS84VSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBXV0RHX0VXSV9Nb2RlIFdXREcgRWFybHkgV2FrZXVwIEludGVycnVwdCBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgV1dER19FV0lfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMHUgICAgICAgLyohPCBFV0kgRGlzYWJsZSAqLworI2RlZmluZSBXV0RHX0VXSV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICBXV0RHX0NGUl9FV0kgICAgICAvKiE8IEVXSSBFbmFibGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgV1dER19Qcml2YXRlX01hY3JvcyBXV0RHIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfV1dER19QUkVTQ0FMRVIoX19QUkVTQ0FMRVJfXykgICAgKCgoX19QUkVTQ0FMRVJfXykgPT0gV1dER19QUkVTQ0FMRVJfMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBXV0RHX1BSRVNDQUxFUl8yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IFdXREdfUFJFU0NBTEVSXzQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gV1dER19QUkVTQ0FMRVJfOCkpCisKKyNkZWZpbmUgSVNfV1dER19XSU5ET1coX19XSU5ET1dfXykgICAgICAgICAgKCgoX19XSU5ET1dfXykgPj0gV1dER19DRlJfV182KSAmJiAoKF9fV0lORE9XX18pIDw9IFdXREdfQ0ZSX1cpKQorCisjZGVmaW5lIElTX1dXREdfQ09VTlRFUihfX0NPVU5URVJfXykgICAgICAgICgoKF9fQ09VTlRFUl9fKSA+PSBXV0RHX0NSX1RfNikgJiYgKChfX0NPVU5URVJfXykgPD0gV1dER19DUl9UKSkKKworI2RlZmluZSBJU19XV0RHX0VXSV9NT0RFKF9fTU9ERV9fKSAgICAgICAgICAoKChfX01PREVfXykgPT0gV1dER19FV0lfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBXV0RHX0VXSV9ESVNBQkxFKSkKKy8qKgorICAqIEB9CisgICovCisKKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgV1dER19FeHBvcnRlZF9NYWNyb3MgV1dERyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgV1dERyBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyAgV1dERyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfV1dER19FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiwgV1dER19DUl9XREdBKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgV1dERyBlYXJseSB3YWtldXAgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBXV0RHIGhhbmRsZQorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyAgc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgdG8gZW5hYmxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgV1dER19JVF9FV0k6IEVhcmx5IHdha2V1cCBpbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIE9uY2UgZW5hYmxlZCB0aGlzIGludGVycnVwdCBjYW5ub3QgYmUgZGlzYWJsZWQgZXhjZXB0IGJ5IGEgc3lzdGVtIHJlc2V0LgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9XV0RHX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNGUiwgKF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNlbGVjdGVkIFdXREcgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fICBXV0RHIGhhbmRsZQorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyAgc3BlY2lmaWVzIHRoZSBpdCB0byBjaGVjay4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgV1dER19GTEFHX0VXSUY6IEVhcmx5IHdha2V1cCBpbnRlcnJ1cHQgSVQKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgV1dER19GTEFHIChTRVQgb3IgUkVTRVQpLgorICAqLworI2RlZmluZSBfX0hBTF9XV0RHX0dFVF9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgX19IQUxfV1dER19HRVRfRkxBRygoX19IQU5ETEVfXyksKF9fSU5URVJSVVBUX18pKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgV1dERyBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzLgorICAqICAgICAgICAgYml0cyB0byBjbGVhciB0aGUgc2VsZWN0ZWQgaW50ZXJydXB0IHBlbmRpbmcgYml0cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gIFdXREcgaGFuZGxlCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fICBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBwZW5kaW5nIGJpdCB0byBjbGVhci4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFdXREdfRkxBR19FV0lGOiBFYXJseSB3YWtldXAgaW50ZXJydXB0IGZsYWcKKyAgKi8KKyNkZWZpbmUgX19IQUxfV1dER19DTEVBUl9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgIF9fSEFMX1dXREdfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIChfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgV1dERyBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fICBXV0RHIGhhbmRsZQorICAqIEBwYXJhbSAgX19GTEFHX18gIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFdXREdfRkxBR19FV0lGOiBFYXJseSB3YWtldXAgaW50ZXJydXB0IGZsYWcKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgV1dER19GTEFHIChTRVQgb3IgUkVTRVQpLgorICAqLworI2RlZmluZSBfX0hBTF9XV0RHX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgICAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUiAmIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIFdXREcncyBwZW5kaW5nIGZsYWdzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyAgV1dERyBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fRkxBR19fICBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBXV0RHX0ZMQUdfRVdJRjogRWFybHkgd2FrZXVwIGludGVycnVwdCBmbGFnCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1dXREdfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1IgPSB+KF9fRkxBR19fKSkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFdXREcgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gIFdXREcgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyAgc3BlY2lmaWVzIHRoZSBXV0RHIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBXV0RHX0lUX0VXSTogRWFybHkgV2FrZXVwIEludGVycnVwdAorICAqIEByZXR2YWwgc3RhdGUgb2YgX19JTlRFUlJVUFRfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX1dXREdfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNGUiAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgV1dER19FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgV1dER19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgICogQHsKKyAgKi8KKy8qIEluaXRpYWxpemF0aW9uL2RlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmICAgICBIQUxfV1dER19Jbml0KFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcpOwordm9pZCAgICAgICAgICAgICAgICAgIEhBTF9XV0RHX01zcEluaXQoV1dER19IYW5kbGVUeXBlRGVmICpod3dkZyk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgV1dER19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgICogQHsKKyAgKi8KKy8qIEkvTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmICAgICBIQUxfV1dER19SZWZyZXNoKFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcpOwordm9pZCAgICAgICAgICAgICAgICAgIEhBTF9XV0RHX0lSUUhhbmRsZXIoV1dER19IYW5kbGVUeXBlRGVmICpod3dkZyk7Cit2b2lkICAgICAgICAgICAgICAgICAgSEFMX1dXREdfRWFybHlXYWtldXBDYWxsYmFjayhXV0RHX0hhbmRsZVR5cGVEZWYqIGh3d2RnKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyRjN4eF9IQUxfV1dER19IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2xsX2FkYy5oIGIvSW5jL3N0bTMyZjN4eF9sbF9hZGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmY1NjEyCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjN4eF9sbF9hZGMuaApAQCAtMCwwICsxLDEwODMzIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2xsX2FkYy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBBREMgTEwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkYzeHhfTExfQURDX0gKKyNkZWZpbmUgX19TVE0zMkYzeHhfTExfQURDX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qIE5vdGU6IERldmljZXMgb2YgU1RNMzJGMyBzZXJpZSBlbWJlZCAxIG91dCBvZiAyIGRpZmZlcmVudCBBREMgSVAuICAgICAgICAgICovCisvKiAgICAgICAtIFNUTTMyRjMweCwgU1RNMzJGMzF4LCBTVE0zMkYzMngsIFNUTTMyRjMzeCwgU1RNMzJGMzV4LCBTVE0zMkYzOXg6ICAqLworLyogICAgICAgICBBREMgSVAgNU1zYW1wbGVzL3NlYywgZnJvbSAxIHRvIDQgQURDIGluc3RhbmNlcyBhbmQgb3RoZXIgc3BlY2lmaWMgKi8KKy8qICAgICAgICAgZmVhdHVyZXMgKHJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAtIFNUTTMyRjM3eDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICBBREMgSVAgMU1zYW1wbGVzL3NlYywgMSBBREMgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZHJpdmVycyBvZiB0aGVzZSBBREMgSVAsIGxvY2F0ZWQgaW4gMiBhcmVhICAgICovCisvKiAgICAgICBkZWxpbWl0ZWQgYnkgY29tcGlsYXRpb24gc3dpdGNoZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjaWYgZGVmaW5lZChBREM1X1YxXzEpCisKKyNpZiBkZWZpbmVkIChBREMxKSB8fCBkZWZpbmVkIChBREMyKSB8fCBkZWZpbmVkIChBREMzKSB8fCBkZWZpbmVkIChBREM0KQorCisvKiogQGRlZmdyb3VwIEFEQ19MTCBBREMKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQURDX0xMX1ByaXZhdGVfQ29uc3RhbnRzIEFEQyBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qIEludGVybmFsIG1hc2sgZm9yIEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUbyBzZWxlY3QgaW50byBsaXRlcmFsIExMX0FEQ19SRUdfUkFOS194IHRoZSByZWxldmFudCBiaXRzIGZvcjogICAgICAgICAgICAqLworLyogLSBzZXF1ZW5jZXIgcmVnaXN0ZXIgb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0gc2VxdWVuY2VyIHJhbmsgYml0cyBwb3NpdGlvbiBpbnRvIHRoZSBzZWxlY3RlZCByZWdpc3RlciAgICAgICAgICAgICAgICAgICovCisKKy8qIEludGVybmFsIHJlZ2lzdGVyIG9mZnNldCBmb3IgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGNvbmZpZ3VyYXRpb24gKi8KKy8qIChvZmZzZXQgcGxhY2VkIGludG8gYSBzcGFyZSBhcmVhIG9mIGxpdGVyYWwgZGVmaW5pdGlvbikgKi8KKyNkZWZpbmUgQURDX1NRUjFfUkVHT0ZGU0VUICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQorI2RlZmluZSBBRENfU1FSMl9SRUdPRkZTRVQgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDEwMFUpCisjZGVmaW5lIEFEQ19TUVIzX1JFR09GRlNFVCAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMjAwVSkKKyNkZWZpbmUgQURDX1NRUjRfUkVHT0ZGU0VUICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAzMDBVKQorCisjZGVmaW5lIEFEQ19SRUdfU1FSWF9SRUdPRkZTRVRfTUFTSyAgICAgICAgKEFEQ19TUVIxX1JFR09GRlNFVCB8IEFEQ19TUVIyX1JFR09GRlNFVCB8IEFEQ19TUVIzX1JFR09GRlNFVCB8IEFEQ19TUVI0X1JFR09GRlNFVCkKKyNkZWZpbmUgQURDX1JFR19SQU5LX0lEX1NRUlhfTUFTSyAgICAgICAgICAoQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0tfUE9TQklUMCkKKworLyogRGVmaW5pdGlvbiBvZiBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgYml0cyBpbmZvcm1hdGlvbiB0byBiZSBpbnNlcnRlZCAgKi8KKy8qIGludG8gQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmtzIGxpdGVyYWxzIGRlZmluaXRpb24uICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19SRUdfUkFOS18xX1NRUlhfQklUT0ZGU0VUX1BPUyAgKCh1aW50MzJfdCkgNlUpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19TUVIxX1NRMSkgKi8KKyNkZWZpbmUgQURDX1JFR19SQU5LXzJfU1FSWF9CSVRPRkZTRVRfUE9TICAoKHVpbnQzMl90KTEyVSkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NRUjFfU1EyKSAqLworI2RlZmluZSBBRENfUkVHX1JBTktfM19TUVJYX0JJVE9GRlNFVF9QT1MgICgodWludDMyX3QpMThVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfU1FSMV9TUTMpICovCisjZGVmaW5lIEFEQ19SRUdfUkFOS180X1NRUlhfQklUT0ZGU0VUX1BPUyAgKCh1aW50MzJfdCkyNFUpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19TUVIxX1NRNCkgKi8KKyNkZWZpbmUgQURDX1JFR19SQU5LXzVfU1FSWF9CSVRPRkZTRVRfUE9TICAoKHVpbnQzMl90KSAwVSkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NRUjJfU1E1KSAqLworI2RlZmluZSBBRENfUkVHX1JBTktfNl9TUVJYX0JJVE9GRlNFVF9QT1MgICgodWludDMyX3QpIDZVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfU1FSMl9TUTYpICovCisjZGVmaW5lIEFEQ19SRUdfUkFOS183X1NRUlhfQklUT0ZGU0VUX1BPUyAgKCh1aW50MzJfdCkxMlUpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19TUVIyX1NRNykgKi8KKyNkZWZpbmUgQURDX1JFR19SQU5LXzhfU1FSWF9CSVRPRkZTRVRfUE9TICAoKHVpbnQzMl90KTE4VSkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NRUjJfU1E4KSAqLworI2RlZmluZSBBRENfUkVHX1JBTktfOV9TUVJYX0JJVE9GRlNFVF9QT1MgICgodWludDMyX3QpMjRVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfU1FSMl9TUTkpICovCisjZGVmaW5lIEFEQ19SRUdfUkFOS18xMF9TUVJYX0JJVE9GRlNFVF9QT1MgKCh1aW50MzJfdCkgMFUpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19TUVIzX1NRMTApICovCisjZGVmaW5lIEFEQ19SRUdfUkFOS18xMV9TUVJYX0JJVE9GRlNFVF9QT1MgKCh1aW50MzJfdCkgNlUpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19TUVIzX1NRMTEpICovCisjZGVmaW5lIEFEQ19SRUdfUkFOS18xMl9TUVJYX0JJVE9GRlNFVF9QT1MgKCh1aW50MzJfdCkxMlUpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19TUVIzX1NRMTIpICovCisjZGVmaW5lIEFEQ19SRUdfUkFOS18xM19TUVJYX0JJVE9GRlNFVF9QT1MgKCh1aW50MzJfdCkxOFUpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19TUVIzX1NRMTMpICovCisjZGVmaW5lIEFEQ19SRUdfUkFOS18xNF9TUVJYX0JJVE9GRlNFVF9QT1MgKCh1aW50MzJfdCkyNFUpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19TUVIzX1NRMTQpICovCisjZGVmaW5lIEFEQ19SRUdfUkFOS18xNV9TUVJYX0JJVE9GRlNFVF9QT1MgKCh1aW50MzJfdCkgMFUpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19TUVI0X1NRMTUpICovCisjZGVmaW5lIEFEQ19SRUdfUkFOS18xNl9TUVJYX0JJVE9GRlNFVF9QT1MgKCh1aW50MzJfdCkgNlUpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19TUVI0X1NRMTYpICovCisKKworCisvKiBJbnRlcm5hbCBtYXNrIGZvciBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVG8gc2VsZWN0IGludG8gbGl0ZXJhbCBMTF9BRENfSU5KX1JBTktfeCB0aGUgcmVsZXZhbnQgYml0cyBmb3I6ICAgICAgICAgICAgKi8KKy8qIC0gZGF0YSByZWdpc3RlciBvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtIHNlcXVlbmNlciByYW5rIGJpdHMgcG9zaXRpb24gaW50byB0aGUgc2VsZWN0ZWQgcmVnaXN0ZXIgICAgICAgICAgICAgICAgICAqLworCisvKiBJbnRlcm5hbCByZWdpc3RlciBvZmZzZXQgZm9yIEFEQyBncm91cCBpbmplY3RlZCBkYXRhIHJlZ2lzdGVyICovCisvKiAob2Zmc2V0IHBsYWNlZCBpbnRvIGEgc3BhcmUgYXJlYSBvZiBsaXRlcmFsIGRlZmluaXRpb24pICovCisjZGVmaW5lIEFEQ19KRFIxX1JFR09GRlNFVCAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgQURDX0pEUjJfUkVHT0ZGU0VUICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAxMDBVKQorI2RlZmluZSBBRENfSkRSM19SRUdPRkZTRVQgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDIwMFUpCisjZGVmaW5lIEFEQ19KRFI0X1JFR09GRlNFVCAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMzAwVSkKKworI2RlZmluZSBBRENfSU5KX0pEUlhfUkVHT0ZGU0VUX01BU0sgICAgICAgIChBRENfSkRSMV9SRUdPRkZTRVQgfCBBRENfSkRSMl9SRUdPRkZTRVQgfCBBRENfSkRSM19SRUdPRkZTRVQgfCBBRENfSkRSNF9SRUdPRkZTRVQpCisjZGVmaW5lIEFEQ19JTkpfUkFOS19JRF9KU1FSX01BU0sgICAgICAgICAgKEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLX1BPU0JJVDApCisKKy8qIERlZmluaXRpb24gb2YgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciBiaXRzIGluZm9ybWF0aW9uIHRvIGJlIGluc2VydGVkICovCisvKiBpbnRvIEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgcmFua3MgbGl0ZXJhbHMgZGVmaW5pdGlvbi4gICAgICAgICAgICAgICAqLworI2RlZmluZSBBRENfSU5KX1JBTktfMV9KU1FSX0JJVE9GRlNFVF9QT1MgICgodWludDMyX3QpIDhVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfSlNRUl9KU1ExKSAqLworI2RlZmluZSBBRENfSU5KX1JBTktfMl9KU1FSX0JJVE9GRlNFVF9QT1MgICgodWludDMyX3QpMTRVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfSlNRUl9KU1EyKSAqLworI2RlZmluZSBBRENfSU5KX1JBTktfM19KU1FSX0JJVE9GRlNFVF9QT1MgICgodWludDMyX3QpMjBVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfSlNRUl9KU1EzKSAqLworI2RlZmluZSBBRENfSU5KX1JBTktfNF9KU1FSX0JJVE9GRlNFVF9QT1MgICgodWludDMyX3QpMjZVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfSlNRUl9KU1E0KSAqLworCisKKworLyogSW50ZXJuYWwgbWFzayBmb3IgQURDIGdyb3VwIHJlZ3VsYXIgdHJpZ2dlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRvIHNlbGVjdCBpbnRvIGxpdGVyYWwgTExfQURDX1JFR19UUklHX3ggdGhlIHJlbGV2YW50IGJpdHMgZm9yOiAgICAgICAgICAgICovCisvKiAtIHJlZ3VsYXIgdHJpZ2dlciBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLSByZWd1bGFyIHRyaWdnZXIgZWRnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQgICAgICAgKEFEQ19DRkdSX0VYVEVOXzApIC8qIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHNvbWUgQURDIG9uIG90aGVyIFNUTTMyIGZhbWlsaWVzIGhhdmluZyB0aGlzIHNldHRpbmcgc2V0IGJ5IEhXIGRlZmF1bHQgdmFsdWUpICovCisKKy8qIE1hc2sgY29udGFpbmluZyB0cmlnZ2VyIHNvdXJjZSBtYXNrcyBmb3IgZWFjaCBvZiBwb3NzaWJsZSAgICAgICAgICAgICAgICAgICovCisvKiB0cmlnZ2VyIGVkZ2Ugc2VsZWN0aW9uIGR1cGxpY2F0ZWQgd2l0aCBzaGlmdHMgWzA7IDQ7IDg7IDEyXSAgICAgICAgICAgICAgICAqLworLyogY29ycmVzcG9uZGluZyB0byB7U1cgc3RhcnQ7IGV4dCB0cmlnZ2VyOyBleHQgdHJpZ2dlcjsgZXh0IHRyaWdnZXJ9LiAgICAgICAgKi8KKyNkZWZpbmUgQURDX1JFR19UUklHX1NPVVJDRV9NQVNLICAgICAgICAgICAgKCgoTExfQURDX1JFR19UUklHX1NPRlRXQVJFICYgQURDX0NGR1JfRVhUU0VMKSA8PCAoNFUgKiAwVSkpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRENfQ0ZHUl9FWFRTRUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICg0VSAqIDFVKSkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19DRkdSX0VYVFNFTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKDRVICogMlUpKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDX0NGR1JfRVhUU0VMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoNFUgKiAzVSkpICApCisKKy8qIE1hc2sgY29udGFpbmluZyB0cmlnZ2VyIGVkZ2UgbWFza3MgZm9yIGVhY2ggb2YgcG9zc2libGUgICAgICAgICAgICAgICAgICAgICovCisvKiB0cmlnZ2VyIGVkZ2Ugc2VsZWN0aW9uIGR1cGxpY2F0ZWQgd2l0aCBzaGlmdHMgWzA7IDQ7IDg7IDEyXSAgICAgICAgICAgICAgICAqLworLyogY29ycmVzcG9uZGluZyB0byB7U1cgc3RhcnQ7IGV4dCB0cmlnZ2VyOyBleHQgdHJpZ2dlcjsgZXh0IHRyaWdnZXJ9LiAgICAgICAgKi8KKyNkZWZpbmUgQURDX1JFR19UUklHX0VER0VfTUFTSyAgICAgICAgICAgICAgKCgoTExfQURDX1JFR19UUklHX1NPRlRXQVJFICYgQURDX0NGR1JfRVhURU4pIDw8ICg0VSAqIDBVKSkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICA8PCAoNFUgKiAxVSkpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgPDwgKDRVICogMlUpKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgIDw8ICg0VSAqIDNVKSkgICkKKworLyogRGVmaW5pdGlvbiBvZiBBREMgZ3JvdXAgcmVndWxhciB0cmlnZ2VyIGJpdHMgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX1JFR19UUklHX0VYVFNFTF9CSVRPRkZTRVRfUE9TICAoKHVpbnQzMl90KSA2VSkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX0NGR1JfRVhUU0VMKSAqLworI2RlZmluZSBBRENfUkVHX1RSSUdfRVhURU5fQklUT0ZGU0VUX1BPUyAgICgodWludDMyX3QpMTBVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfQ0ZHUl9FWFRFTikgKi8KKworCisKKy8qIEludGVybmFsIGRlZmluaXRpb25zIGZvciBBREMgZ3JvdXAgcmVndWxhciB0cmlnZ2VyIHNvdXJjZXM6ICAgICAgICAgICAgICAgICovCisvKiBUbyBkaWZmZXJlbnRpYXRlIGludG8gbGl0ZXJhbCBMTF9BRENfUkVHX1RSSUdfeCB0aGUgdHJpZ2dlciBzb3VyY2VzICAgICAgICAqLworLyogZGVwZW5kaW5nIG9uIEFEQyBpbnN0YW5jZXMgQURDMSwgQURDMiwgQURDMywgQURDNCAoaWYgQURDIGluc3RhbmNlIGlzICAgICAgKi8KKy8qIGF2YWlsYWJsZSBvbiB0aGUgc2VsZWN0ZWQgZGV2aWNlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KQorLyogSW50ZXJuYWwgbWFzayBvZmZzZXQgZm9yIEFEQyBncm91cCBpbmplY3RlZCB0cmlnZ2VyIHNvdXJjZXMgICAgICAgICAgICAgICAgKi8KKy8qIGF2YWlsYWJsZSBvbmx5IG9uIHNwZWNpZmljIEFEQyBpbnN0YW5jZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAob2Zmc2V0IHBsYWNlZCBpbnRvIGEgc3BhcmUgYXJlYSBvZiBsaXRlcmFsIGRlZmluaXRpb24pICovCisjZGVmaW5lIEFEQ19SRUdfVFJJR19FWFRfSU5TVF9BREMxMiAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxVSkgLyogTWFya2VyIGZvciBkaWZmZXJlbnRpYXRpb24gb2YgQURDIGdyb3VwIHJlZ3VsYXIgZXh0ZXJuYWwgdHJpZ2dlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzEsIEFEQzIgKi8KKyNkZWZpbmUgQURDX1JFR19UUklHX0VYVF9JTlNUX0FEQzM0ICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDJVKSAvKiBNYXJrZXIgZm9yIGRpZmZlcmVudGlhdGlvbiBvZiBBREMgZ3JvdXAgcmVndWxhciBleHRlcm5hbCB0cmlnZ2VyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMywgQURDNCAqLworI2VuZGlmCisKKy8qIEludGVybmFsIG1hc2sgZm9yIEFEQyBncm91cCBpbmplY3RlZCB0cmlnZ2VyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUbyBzZWxlY3QgaW50byBsaXRlcmFsIExMX0FEQ19JTkpfVFJJR194IHRoZSByZWxldmFudCBiaXRzIGZvcjogICAgICAgICAgICAqLworLyogLSBpbmplY3RlZCB0cmlnZ2VyIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0gaW5qZWN0ZWQgdHJpZ2dlciBlZGdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUICAgICAgKEFEQ19KU1FSX0pFWFRFTl8wKSAvKiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBzb21lIEFEQyBvbiBvdGhlciBTVE0zMiBmYW1pbGllcyBoYXZpbmcgdGhpcyBzZXR0aW5nIHNldCBieSBIVyBkZWZhdWx0IHZhbHVlKSAqLworCisvKiBNYXNrIGNvbnRhaW5pbmcgdHJpZ2dlciBzb3VyY2UgbWFza3MgZm9yIGVhY2ggb2YgcG9zc2libGUgICAgICAgICAgICAgICAgICAqLworLyogdHJpZ2dlciBlZGdlIHNlbGVjdGlvbiBkdXBsaWNhdGVkIHdpdGggc2hpZnRzIFswOyA0OyA4OyAxMl0gICAgICAgICAgICAgICAgKi8KKy8qIGNvcnJlc3BvbmRpbmcgdG8ge1NXIHN0YXJ0OyBleHQgdHJpZ2dlcjsgZXh0IHRyaWdnZXI7IGV4dCB0cmlnZ2VyfS4gICAgICAgICovCisjZGVmaW5lIEFEQ19JTkpfVFJJR19TT1VSQ0VfTUFTSyAgICAgICAgICAgICgoKExMX0FEQ19JTkpfVFJJR19TT0ZUV0FSRSAmIEFEQ19KU1FSX0pFWFRTRUwpIDw8ICg0VSAqIDBVKSkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDX0pTUVJfSkVYVFNFTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICg0VSAqIDFVKSkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDX0pTUVJfSkVYVFNFTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICg0VSAqIDJVKSkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDX0pTUVJfSkVYVFNFTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICg0VSAqIDNVKSkgICkKKworLyogTWFzayBjb250YWluaW5nIHRyaWdnZXIgZWRnZSBtYXNrcyBmb3IgZWFjaCBvZiBwb3NzaWJsZSAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHRyaWdnZXIgZWRnZSBzZWxlY3Rpb24gZHVwbGljYXRlZCB3aXRoIHNoaWZ0cyBbMDsgNDsgODsgMTJdICAgICAgICAgICAgICAgICovCisvKiBjb3JyZXNwb25kaW5nIHRvIHtTVyBzdGFydDsgZXh0IHRyaWdnZXI7IGV4dCB0cmlnZ2VyOyBleHQgdHJpZ2dlcn0uICAgICAgICAqLworI2RlZmluZSBBRENfSU5KX1RSSUdfRURHRV9NQVNLICAgICAgICAgICAgICAoKChMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUgJiBBRENfSlNRUl9KRVhURU4pIDw8ICg0VSAqIDBVKSkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgPDwgKDRVICogMVUpKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICA8PCAoNFUgKiAyVSkpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgIDw8ICg0VSAqIDNVKSkgICkKKworLyogRGVmaW5pdGlvbiBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQgdHJpZ2dlciBiaXRzIGluZm9ybWF0aW9uLiAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX0lOSl9UUklHX0VYVFNFTF9CSVRPRkZTRVRfUE9TICAoKHVpbnQzMl90KSAyVSkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX0pTUVJfSkVYVFNFTCkgKi8KKyNkZWZpbmUgQURDX0lOSl9UUklHX0VYVEVOX0JJVE9GRlNFVF9QT1MgICAoKHVpbnQzMl90KSA2VSkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX0pTUVJfSkVYVEVOKSAqLworCisKKworLyogSW50ZXJuYWwgZGVmaW5pdGlvbnMgZm9yIEFEQyBncm91cCBpbmplY3RlZCB0cmlnZ2VyIHNvdXJjZXM6ICAgICAgICAgICAgICAgKi8KKy8qIFRvIGRpZmZlcmVudGlhdGUgaW50byBsaXRlcmFsIExMX0FEQ19JTkpfVFJJR194IHRoZSB0cmlnZ2VyIHNvdXJjZXMgICAgICAgICovCisvKiBkZXBlbmRpbmcgb24gQURDIGluc3RhbmNlcyBBREMxLCBBREMyLCBBREMzLCBBREM0IChpZiBBREMgaW5zdGFuY2UgaXMgICAgICAqLworLyogYXZhaWxhYmxlIG9uIHRoZSBzZWxlY3RlZCBkZXZpY2UpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisvKiBJbnRlcm5hbCBtYXNrIG9mZnNldCBmb3IgQURDIGdyb3VwIGluamVjdGVkIHRyaWdnZXIgc291cmNlcyAgICAgICAgICAgICAgICAqLworLyogYXZhaWxhYmxlIG9ubHkgb24gc3BlY2lmaWMgQURDIGluc3RhbmNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIChvZmZzZXQgcGxhY2VkIGludG8gYSBzcGFyZSBhcmVhIG9mIGxpdGVyYWwgZGVmaW5pdGlvbikgKi8KKyNkZWZpbmUgQURDX0lOSl9UUklHX0VYVF9JTlNUX0FEQzEyICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDFVKSAvKiBNYXJrZXIgZm9yIGRpZmZlcmVudGlhdGlvbiBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQgZXh0ZXJuYWwgdHJpZ2dlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzEsIEFEQzIgKi8KKyNkZWZpbmUgQURDX0lOSl9UUklHX0VYVF9JTlNUX0FEQzM0ICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDJVKSAvKiBNYXJrZXIgZm9yIGRpZmZlcmVudGlhdGlvbiBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQgZXh0ZXJuYWwgdHJpZ2dlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzMsIEFEQzQgKi8KKyNlbmRpZgorCisKKworCisvKiBJbnRlcm5hbCBtYXNrIGZvciBBREMgY2hhbm5lbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVG8gc2VsZWN0IGludG8gbGl0ZXJhbCBMTF9BRENfQ0hBTk5FTF94IHRoZSByZWxldmFudCBiaXRzIGZvcjogICAgICAgICAgICAgKi8KKy8qIC0gY2hhbm5lbCBpZGVudGlmaWVyIGRlZmluZWQgYnkgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtIGNoYW5uZWwgaWRlbnRpZmllciBkZWZpbmVkIGJ5IGJpdGZpZWxkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLSBjaGFubmVsIGRpZmZlcmVudGlhdGlvbiBiZXR3ZWVuIGV4dGVybmFsIGNoYW5uZWxzIChjb25uZWN0ZWQgdG8gICAgICAgICAgKi8KKy8qICAgR1BJTyBwaW5zKSBhbmQgaW50ZXJuYWwgY2hhbm5lbHMgKGNvbm5lY3RlZCB0byBpbnRlcm5hbCBwYXRocykgICAgICAgICAgICovCisvKiAtIGNoYW5uZWwgc2FtcGxpbmcgdGltZSBkZWZpbmVkIGJ5IFNNUFJ4IHJlZ2lzdGVyIG9mZnNldCAgICAgICAgICAgICAgICAgICAqLworLyogICBhbmQgU01QeCBiaXRzIHBvc2l0aW9ucyBpbnRvIFNNUFJ4IHJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0sgICAgICAgICAoQURDX0NGR1JfQVdEMUNIKQorI2RlZmluZSBBRENfQ0hBTk5FTF9JRF9CSVRGSUVMRF9NQVNLICAgICAgIChBRENfQVdEMkNSX0FXRDJDSCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MgKCh1aW50MzJfdCkyNlUpLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0spICovCisjZGVmaW5lIEFEQ19DSEFOTkVMX0lEX01BU0sgICAgICAgICAgICAgICAgKEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLIHwgQURDX0NIQU5ORUxfSURfQklURklFTERfTUFTSyB8IEFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIX01BU0spCisvKiBFcXVpdmFsZW50IG1hc2sgb2YgQURDX0NIQU5ORUxfTlVNQkVSX01BU0sgYWxpZ25lZCBvbiByZWdpc3RlciBMU0IgKGJpdCAwKSAqLworI2RlZmluZSBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTS19QT1NCSVQwIChBRENfU1FSMl9TUTUpIC8qIEVxdWl2YWxlbnQgdG8gc2hpZnQ6IChBRENfQ0hBTk5FTF9OVU1CRVJfTUFTSyA+PiBQT1NJVElPTl9WQUwoQURDX0NIQU5ORUxfTlVNQkVSX01BU0spKSAqLworCisvKiBDaGFubmVsIGRpZmZlcmVudGlhdGlvbiBiZXR3ZWVuIGV4dGVybmFsIGFuZCBpbnRlcm5hbCBjaGFubmVscyAqLworI2RlZmluZSBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSCAgICAgICAgICgodWludDMyX3QpMHg4MDAwMDAwMFUpIC8qIE1hcmtlciBvZiBpbnRlcm5hbCBjaGFubmVsICovCisjZGVmaW5lIEFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIXzIgICAgICAgKCh1aW50MzJfdCkweDAwMDgwMDAwVSkgLyogTWFya2VyIG9mIGludGVybmFsIGNoYW5uZWwgZm9yIG90aGVyIEFEQyBpbnN0YW5jZXMsIGluIGNhc2Ugb2YgZGlmZmVyZW50IEFEQyBpbnRlcm5hbCBjaGFubmVscyBtYXBwZWQgb24gc2FtZSBjaGFubmVsIG51bWJlciBvbiBkaWZmZXJlbnQgQURDIGluc3RhbmNlcyAqLworI2RlZmluZSBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSF9NQVNLICAgIChBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSCB8IEFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIXzIpCisKKy8qIEludGVybmFsIHJlZ2lzdGVyIG9mZnNldCBmb3IgQURDIGNoYW5uZWwgc2FtcGxpbmcgdGltZSBjb25maWd1cmF0aW9uICovCisvKiAob2Zmc2V0IHBsYWNlZCBpbnRvIGEgc3BhcmUgYXJlYSBvZiBsaXRlcmFsIGRlZmluaXRpb24pICovCisjZGVmaW5lIEFEQ19TTVBSMV9SRUdPRkZTRVQgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgQURDX1NNUFIyX1JFR09GRlNFVCAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDIwMDAwMDBVKQorI2RlZmluZSBBRENfQ0hBTk5FTF9TTVBSWF9SRUdPRkZTRVRfTUFTSyAgIChBRENfU01QUjFfUkVHT0ZGU0VUIHwgQURDX1NNUFIyX1JFR09GRlNFVCkKKworI2RlZmluZSBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9NQVNLICAgICgodWludDMyX3QpMHgwMUYwMDAwMFUpCisjZGVmaW5lIEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUyAgICAgKCh1aW50MzJfdCkyMFUpICAgICAgICAgICAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9NQVNLKSAqLworCisvKiBEZWZpbml0aW9uIG9mIGNoYW5uZWxzIElEIG51bWJlciBpbmZvcm1hdGlvbiB0byBiZSBpbnNlcnRlZCBpbnRvICAgICAgICAgICAqLworLyogY2hhbm5lbHMgbGl0ZXJhbHMgZGVmaW5pdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMF9OVU1CRVIgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xX05VTUJFUiAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0FXRDFDSF8wKQorI2RlZmluZSBBRENfQ0hBTk5FTF8yX05VTUJFUiAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9BV0QxQ0hfMSAgICAgICAgICAgICAgICAgICAgKQorI2RlZmluZSBBRENfQ0hBTk5FTF8zX05VTUJFUiAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9BV0QxQ0hfMSB8IEFEQ19DRkdSX0FXRDFDSF8wKQorI2RlZmluZSBBRENfQ0hBTk5FTF80X05VTUJFUiAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfQVdEMUNIXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorI2RlZmluZSBBRENfQ0hBTk5FTF81X05VTUJFUiAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfQVdEMUNIXzIgICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFDSF8wKQorI2RlZmluZSBBRENfQ0hBTk5FTF82X05VTUJFUiAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfQVdEMUNIXzIgfCBBRENfQ0ZHUl9BV0QxQ0hfMSAgICAgICAgICAgICAgICAgICAgKQorI2RlZmluZSBBRENfQ0hBTk5FTF83X05VTUJFUiAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfQVdEMUNIXzIgfCBBRENfQ0ZHUl9BV0QxQ0hfMSB8IEFEQ19DRkdSX0FXRDFDSF8wKQorI2RlZmluZSBBRENfQ0hBTk5FTF84X05VTUJFUiAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0FXRDFDSF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorI2RlZmluZSBBRENfQ0hBTk5FTF85X05VTUJFUiAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0FXRDFDSF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFDSF8wKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xMF9OVU1CRVIgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0FXRDFDSF8zICAgICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9BV0QxQ0hfMSAgICAgICAgICAgICAgICAgICAgKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xMV9OVU1CRVIgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0FXRDFDSF8zICAgICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9BV0QxQ0hfMSB8IEFEQ19DRkdSX0FXRDFDSF8wKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xMl9OVU1CRVIgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0FXRDFDSF8zIHwgQURDX0NGR1JfQVdEMUNIXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xM19OVU1CRVIgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0FXRDFDSF8zIHwgQURDX0NGR1JfQVdEMUNIXzIgICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFDSF8wKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xNF9OVU1CRVIgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0FXRDFDSF8zIHwgQURDX0NGR1JfQVdEMUNIXzIgfCBBRENfQ0ZHUl9BV0QxQ0hfMSAgICAgICAgICAgICAgICAgICAgKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xNV9OVU1CRVIgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0FXRDFDSF8zIHwgQURDX0NGR1JfQVdEMUNIXzIgfCBBRENfQ0ZHUl9BV0QxQ0hfMSB8IEFEQ19DRkdSX0FXRDFDSF8wKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xNl9OVU1CRVIgICAgICAgICAgICAgIChBRENfQ0ZHUl9BV0QxQ0hfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xN19OVU1CRVIgICAgICAgICAgICAgIChBRENfQ0ZHUl9BV0QxQ0hfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFDSF8wKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xOF9OVU1CRVIgICAgICAgICAgICAgIChBRENfQ0ZHUl9BV0QxQ0hfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9BV0QxQ0hfMSAgICAgICAgICAgICAgICAgICAgKQorCisvKiBEZWZpbml0aW9uIG9mIGNoYW5uZWxzIElEIGJpdGZpZWxkIGluZm9ybWF0aW9uIHRvIGJlIGluc2VydGVkIGludG8gICAgICAgICAqLworLyogY2hhbm5lbHMgbGl0ZXJhbHMgZGVmaW5pdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMF9CSVRGSUVMRCAgICAgICAgICAgICAoQURDX0FXRDJDUl9BV0QyQ0hfMCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMV9CSVRGSUVMRCAgICAgICAgICAgICAoQURDX0FXRDJDUl9BV0QyQ0hfMSkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMl9CSVRGSUVMRCAgICAgICAgICAgICAoQURDX0FXRDJDUl9BV0QyQ0hfMikKKyNkZWZpbmUgQURDX0NIQU5ORUxfM19CSVRGSUVMRCAgICAgICAgICAgICAoQURDX0FXRDJDUl9BV0QyQ0hfMykKKyNkZWZpbmUgQURDX0NIQU5ORUxfNF9CSVRGSUVMRCAgICAgICAgICAgICAoQURDX0FXRDJDUl9BV0QyQ0hfNCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfNV9CSVRGSUVMRCAgICAgICAgICAgICAoQURDX0FXRDJDUl9BV0QyQ0hfNSkKKyNkZWZpbmUgQURDX0NIQU5ORUxfNl9CSVRGSUVMRCAgICAgICAgICAgICAoQURDX0FXRDJDUl9BV0QyQ0hfNikKKyNkZWZpbmUgQURDX0NIQU5ORUxfN19CSVRGSUVMRCAgICAgICAgICAgICAoQURDX0FXRDJDUl9BV0QyQ0hfNykKKyNkZWZpbmUgQURDX0NIQU5ORUxfOF9CSVRGSUVMRCAgICAgICAgICAgICAoQURDX0FXRDJDUl9BV0QyQ0hfOCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfOV9CSVRGSUVMRCAgICAgICAgICAgICAoQURDX0FXRDJDUl9BV0QyQ0hfOSkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTBfQklURklFTEQgICAgICAgICAgICAoQURDX0FXRDJDUl9BV0QyQ0hfMTApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzExX0JJVEZJRUxEICAgICAgICAgICAgKEFEQ19BV0QyQ1JfQVdEMkNIXzExKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xMl9CSVRGSUVMRCAgICAgICAgICAgIChBRENfQVdEMkNSX0FXRDJDSF8xMikKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTNfQklURklFTEQgICAgICAgICAgICAoQURDX0FXRDJDUl9BV0QyQ0hfMTMpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE0X0JJVEZJRUxEICAgICAgICAgICAgKEFEQ19BV0QyQ1JfQVdEMkNIXzE0KQorI2RlZmluZSBBRENfQ0hBTk5FTF8xNV9CSVRGSUVMRCAgICAgICAgICAgIChBRENfQVdEMkNSX0FXRDJDSF8xNSkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTZfQklURklFTEQgICAgICAgICAgICAoQURDX0FXRDJDUl9BV0QyQ0hfMTYpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE3X0JJVEZJRUxEICAgICAgICAgICAgKEFEQ19BV0QyQ1JfQVdEMkNIXzE3KQorI2RlZmluZSBBRENfQ0hBTk5FTF8xOF9CSVRGSUVMRCAgICAgICAgICAgIChBRENfQVdEMkNSX0FXRDJDSF8xOCkKKworLyogRGVmaW5pdGlvbiBvZiBjaGFubmVscyBzYW1wbGluZyB0aW1lIGluZm9ybWF0aW9uIHRvIGJlIGluc2VydGVkIGludG8gICAgICAgKi8KKy8qIGNoYW5uZWxzIGxpdGVyYWxzIGRlZmluaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzBfU01QICAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMV9SRUdPRkZTRVQgfCAoKCh1aW50MzJfdCkgMFUpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NNUFIxX1NNUDApICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzFfU01QICAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMV9SRUdPRkZTRVQgfCAoKCh1aW50MzJfdCkgM1UpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NNUFIxX1NNUDEpICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzJfU01QICAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMV9SRUdPRkZTRVQgfCAoKCh1aW50MzJfdCkgNlUpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NNUFIxX1NNUDIpICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzNfU01QICAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMV9SRUdPRkZTRVQgfCAoKCh1aW50MzJfdCkgOVUpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NNUFIxX1NNUDMpICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzRfU01QICAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMV9SRUdPRkZTRVQgfCAoKCh1aW50MzJfdCkxMlUpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NNUFIxX1NNUDQpICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzVfU01QICAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMV9SRUdPRkZTRVQgfCAoKCh1aW50MzJfdCkxNVUpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NNUFIxX1NNUDUpICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzZfU01QICAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMV9SRUdPRkZTRVQgfCAoKCh1aW50MzJfdCkxOFUpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NNUFIxX1NNUDYpICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzdfU01QICAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMV9SRUdPRkZTRVQgfCAoKCh1aW50MzJfdCkyMVUpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NNUFIxX1NNUDcpICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzhfU01QICAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMV9SRUdPRkZTRVQgfCAoKCh1aW50MzJfdCkyNFUpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NNUFIxX1NNUDgpICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzlfU01QICAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMV9SRUdPRkZTRVQgfCAoKCh1aW50MzJfdCkyN1UpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NNUFIxX1NNUDkpICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzEwX1NNUCAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMl9SRUdPRkZTRVQgfCAoKCh1aW50MzJfdCkgMFUpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NNUFIyX1NNUDEwKSAqLworI2RlZmluZSBBRENfQ0hBTk5FTF8xMV9TTVAgICAgICAgICAgICAgICAgIChBRENfU01QUjJfUkVHT0ZGU0VUIHwgKCgodWludDMyX3QpIDNVKSA8PCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKSAvKiBWYWx1ZSBzaGlmdGVkIGlzIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19TTVBSMl9TTVAxMSkgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMTJfU01QICAgICAgICAgICAgICAgICAoQURDX1NNUFIyX1JFR09GRlNFVCB8ICgoKHVpbnQzMl90KSA2VSkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkgLyogVmFsdWUgc2hpZnRlZCBpcyBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfU01QUjJfU01QMTIpICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzEzX1NNUCAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMl9SRUdPRkZTRVQgfCAoKCh1aW50MzJfdCkgOVUpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NNUFIyX1NNUDEzKSAqLworI2RlZmluZSBBRENfQ0hBTk5FTF8xNF9TTVAgICAgICAgICAgICAgICAgIChBRENfU01QUjJfUkVHT0ZGU0VUIHwgKCgodWludDMyX3QpMTJVKSA8PCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKSAvKiBWYWx1ZSBzaGlmdGVkIGlzIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19TTVBSMl9TTVAxNCkgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMTVfU01QICAgICAgICAgICAgICAgICAoQURDX1NNUFIyX1JFR09GRlNFVCB8ICgoKHVpbnQzMl90KTE1VSkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkgLyogVmFsdWUgc2hpZnRlZCBpcyBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfU01QUjJfU01QMTUpICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE2X1NNUCAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMl9SRUdPRkZTRVQgfCAoKCh1aW50MzJfdCkxOFUpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NNUFIyX1NNUDE2KSAqLworI2RlZmluZSBBRENfQ0hBTk5FTF8xN19TTVAgICAgICAgICAgICAgICAgIChBRENfU01QUjJfUkVHT0ZGU0VUIHwgKCgodWludDMyX3QpMjFVKSA8PCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKSAvKiBWYWx1ZSBzaGlmdGVkIGlzIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19TTVBSMl9TTVAxNykgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMThfU01QICAgICAgICAgICAgICAgICAoQURDX1NNUFIyX1JFR09GRlNFVCB8ICgoKHVpbnQzMl90KTI0VSkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkgLyogVmFsdWUgc2hpZnRlZCBpcyBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfU01QUjJfU01QMTgpICovCisKKworLyogSW50ZXJuYWwgbWFzayBmb3IgQURDIG1vZGUgc2luZ2xlIG9yIGRpZmZlcmVudGlhbCBlbmRlZDogICAgICAgICAgICAgICAgICAgKi8KKy8qIFRvIHNlbGVjdCBpbnRvIGxpdGVyYWxzIExMX0FEQ19TSU5HTEVfRU5ERUQgb3IgTExfQURDX1NJTkdMRV9ESUZGRVJFTlRJQUwgICovCisvKiB0aGUgcmVsZXZhbnQgYml0cyBmb3I6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogKGNvbmNhdGVuYXRpb24gb2YgbXVsdGlwbGUgYml0cyB1c2VkIGluIGRpZmZlcmVudCByZWdpc3RlcnMpICAgICAgICAgICAgICAgKi8KKy8qIC0gQURDIGNhbGlicmF0aW9uOiBjYWxpYnJhdGlvbiBzdGFydCwgY2FsaWJyYXRpb24gZmFjdG9yIGdldCBvciBzZXQgICAgICAgICovCisvKiAtIEFEQyBjaGFubmVsczogc2V0IGVhY2ggQURDIGNoYW5uZWwgZW5kaW5nIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRENfU0lOR0xFRElGRl9DQUxJQl9TVEFSVF9NQVNLICAgIChBRENfQ1JfQURDQUxESUYpCisjZGVmaW5lIEFEQ19TSU5HTEVESUZGX0NBTElCX0ZBQ1RPUl9NQVNLICAgKEFEQ19DQUxGQUNUX0NBTEZBQ1RfRCB8IEFEQ19DQUxGQUNUX0NBTEZBQ1RfUykKKyNkZWZpbmUgQURDX1NJTkdMRURJRkZfQ0hBTk5FTF9NQVNLICAgICAgICAoQURDX0NIQU5ORUxfSURfQklURklFTERfTUFTSykgLyogRXF1aXZhbGVudCB0byBBRENfRElGU0VMX0RJRlNFTCAqLworI2RlZmluZSBBRENfU0lOR0xFRElGRl9DSEFOTkVMX1NISUZUX01BU0sgIChBRENfQ0FMRkFDVF9DQUxGQUNUX1NfNSkgLyogQml0IGNob3NlbiB0byBwZXJmb3JtIG9mIHNoaWZ0IHdoZW4gc2luZ2xlIG1vZGUgaXMgc2VsZWN0ZWQsIHNoaWZ0IHZhbHVlIG91dCBvZiBjaGFubmVscyBiaXRzIHJhbmdlLiAqLworCisKKy8qIEludGVybmFsIG1hc2sgZm9yIEFEQyBhbmFsb2cgd2F0Y2hkb2c6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUbyBzZWxlY3QgaW50byBsaXRlcmFscyBMTF9BRENfQVdEX0NIQU5ORUx4X3h4eCB0aGUgcmVsZXZhbnQgYml0cyBmb3I6ICAgICAqLworLyogKGNvbmNhdGVuYXRpb24gb2YgbXVsdGlwbGUgYml0cyB1c2VkIGluIGRpZmZlcmVudCBhbmFsb2cgd2F0Y2hkb2dzLCAgICAgICAgKi8KKy8qIChmZWF0dXJlIG9mIHNldmVyYWwgd2F0Y2hkb2dzIG5vdCBhdmFpbGFibGUgb24gYWxsIFNUTTMyIGZhbWlsaWVzKSkuICAgICAgICovCisvKiAtIGFuYWxvZyB3YXRjaGRvZyAxOiBtb25pdG9yZWQgY2hhbm5lbCBkZWZpbmVkIGJ5IG51bWJlciwgICAgICAgICAgICAgICAgICAqLworLyogICBzZWxlY3Rpb24gb2YgQURDIGdyb3VwIChBREMgZ3JvdXBzIHJlZ3VsYXIgYW5kLW9yIGluamVjdGVkKS4gICAgICAgICAgICAgKi8KKy8qIC0gYW5hbG9nIHdhdGNoZG9nIDIgYW5kIDM6IG1vbml0b3JlZCBjaGFubmVsIGRlZmluZWQgYnkgYml0ZmllbGQsIG5vICAgICAgICovCisvKiAgIHNlbGVjdGlvbiBvbiBncm91cHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBJbnRlcm5hbCByZWdpc3RlciBvZmZzZXQgZm9yIEFEQyBhbmFsb2cgd2F0Y2hkb2cgY2hhbm5lbCBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIEFEQ19BV0RfQ1IxX1JFR09GRlNFVCAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgQURDX0FXRF9DUjJfUkVHT0ZGU0VUICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAxMDAwMDBVKQorI2RlZmluZSBBRENfQVdEX0NSM19SRUdPRkZTRVQgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDIwMDAwMFUpCisKKy8qIFJlZ2lzdGVyIG9mZnNldCBnYXAgYmV0d2VlbiBBV0QxIGFuZCBBV0QyLUFXRDMgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKi8KKy8qIChTZXQgc2VwYXJhdGVseSBhcyBBRENfQVdEX0NSWF9SRUdPRkZTRVQgdG8gc3BhcmUgMzIgYml0cyBzcGFjZSAqLworI2RlZmluZSBBRENfQVdEX0NSMTJfUkVHT0ZGU0VUR0FQX01BU0sgICAgIChBRENfQVdEMkNSX0FXRDJDSF8wKQorI2RlZmluZSBBRENfQVdEX0NSMTJfUkVHT0ZGU0VUR0FQX1ZBTCAgICAgICgodWludDMyX3QpMHgwMDAwMDAyNFUpCisKKyNkZWZpbmUgQURDX0FXRF9DUlhfUkVHT0ZGU0VUX01BU0sgICAgICAgICAoQURDX0FXRF9DUjFfUkVHT0ZGU0VUIHwgQURDX0FXRF9DUjJfUkVHT0ZGU0VUIHwgQURDX0FXRF9DUjNfUkVHT0ZGU0VUKQorCisjZGVmaW5lIEFEQ19BV0RfQ1IxX0NIQU5ORUxfTUFTSyAgICAgICAgICAgKEFEQ19DRkdSX0FXRDFDSCB8IEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKQorI2RlZmluZSBBRENfQVdEX0NSMjNfQ0hBTk5FTF9NQVNLICAgICAgICAgIChBRENfQVdEMkNSX0FXRDJDSCkKKyNkZWZpbmUgQURDX0FXRF9DUl9BTExfQ0hBTk5FTF9NQVNLICAgICAgICAoQURDX0FXRF9DUjFfQ0hBTk5FTF9NQVNLIHwgQURDX0FXRF9DUjIzX0NIQU5ORUxfTUFTSykKKworLyogSW50ZXJuYWwgcmVnaXN0ZXIgb2Zmc2V0IGZvciBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZCBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIEFEQ19BV0RfVFIxX1JFR09GRlNFVCAgICAgICAgICAgICAgKEFEQ19BV0RfQ1IxX1JFR09GRlNFVCkKKyNkZWZpbmUgQURDX0FXRF9UUjJfUkVHT0ZGU0VUICAgICAgICAgICAgICAoQURDX0FXRF9DUjJfUkVHT0ZGU0VUKQorI2RlZmluZSBBRENfQVdEX1RSM19SRUdPRkZTRVQgICAgICAgICAgICAgIChBRENfQVdEX0NSM19SRUdPRkZTRVQpCisjZGVmaW5lIEFEQ19BV0RfVFJYX1JFR09GRlNFVF9NQVNLICAgICAgICAgKEFEQ19BV0RfVFIxX1JFR09GRlNFVCB8IEFEQ19BV0RfVFIyX1JFR09GRlNFVCB8IEFEQ19BV0RfVFIzX1JFR09GRlNFVCkKKworCisvKiBJbnRlcm5hbCBtYXNrIGZvciBBREMgb2Zmc2V0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogSW50ZXJuYWwgcmVnaXN0ZXIgb2Zmc2V0IGZvciBBREMgb2Zmc2V0IG51bWJlciBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIEFEQ19PRlIxX1JFR09GRlNFVCAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgQURDX09GUjJfUkVHT0ZGU0VUICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDFVKQorI2RlZmluZSBBRENfT0ZSM19SRUdPRkZTRVQgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMlUpCisjZGVmaW5lIEFEQ19PRlI0X1JFR09GRlNFVCAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAzVSkKKyNkZWZpbmUgQURDX09GUnhfUkVHT0ZGU0VUX01BU0sgICAgICAgICAgICAoQURDX09GUjFfUkVHT0ZGU0VUIHwgQURDX09GUjJfUkVHT0ZGU0VUIHwgQURDX09GUjNfUkVHT0ZGU0VUIHwgQURDX09GUjRfUkVHT0ZGU0VUKQorCisKKy8qIEFEQyByZWdpc3RlcnMgYml0cyBwb3NpdGlvbnMgKi8KKyNkZWZpbmUgQURDX0NGR1JfUkVTX0JJVE9GRlNFVF9QT1MgICAgICAgICAoKHVpbnQzMl90KSAzVSkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX0NGR1JfUkVTKSAqLworI2RlZmluZSBBRENfQ0ZHUl9BV0QxU0dMX0JJVE9GRlNFVF9QT1MgICAgICgodWludDMyX3QpMjJVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfQ0ZHUl9BV0QxU0dMKSAqLworI2RlZmluZSBBRENfQ0ZHUl9BV0QxRU5fQklUT0ZGU0VUX1BPUyAgICAgICgodWludDMyX3QpMjNVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfQ0ZHUl9BV0QxRU4pICovCisjZGVmaW5lIEFEQ19DRkdSX0pBV0QxRU5fQklUT0ZGU0VUX1BPUyAgICAgKCh1aW50MzJfdCkyNFUpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19DRkdSX0pBV0QxRU4pICovCisjZGVmaW5lIEFEQ19UUjFfSFQxX0JJVE9GRlNFVF9QT1MgICAgICAgICAgKCh1aW50MzJfdCkxNlUpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19UUjFfSFQxKSAqLworCisKKy8qIEFEQyByZWdpc3RlcnMgYml0cyBncm91cHMgKi8KKyNkZWZpbmUgQURDX0NSX0JJVFNfUFJPUEVSVFlfUlMgICAgICAgICAgICAoQURDX0NSX0FEQ0FMIHwgQURDX0NSX0pBRFNUUCB8IEFEQ19DUl9BRFNUUCB8IEFEQ19DUl9KQURTVEFSVCB8IEFEQ19DUl9BRFNUQVJUIHwgQURDX0NSX0FERElTIHwgQURDX0NSX0FERU4pIC8qIEFEQyByZWdpc3RlciBDUiBiaXRzIHdpdGggSFcgcHJvcGVydHkgInJzIjogU29mdHdhcmUgY2FuIHJlYWQgYXMgd2VsbCBhcyBzZXQgdGhpcyBiaXQuIFdyaXRpbmcgJzAnIGhhcyBubyBlZmZlY3Qgb24gdGhlIGJpdCB2YWx1ZS4gKi8KKworCisvKiBBREMgaW50ZXJuYWwgY2hhbm5lbHMgcmVsYXRlZCBkZWZpbml0aW9ucyAqLworLyogSW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UgVnJlZkludCAqLworI2RlZmluZSBWUkVGSU5UX0NBTF9BRERSICAgICAgICAgICAgICAgICAgICgodWludDE2X3QqKSAoKHVpbnQzMl90KTB4MUZGRkY3QkFVKSkgLyogSW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UsIGFkZHJlc3Mgb2YgcGFyYW1ldGVyIFZSRUZJTlRfQ0FMOiBWcmVmSW50IEFEQyByYXcgZGF0YSBhY3F1aXJlZCBhdCB0ZW1wZXJhdHVyZSAzMCBEZWdDICh0b2xlcmFuY2U6ICstNSBEZWdDKSwgVnJlZisgPSAzLjMgViAodG9sZXJhbmNlOiArLTEwIG1WKS4gKi8KKyNkZWZpbmUgVlJFRklOVF9DQUxfVlJFRiAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KSAzMzAwVSkgICAgICAgICAgICAgICAgICAgIC8qIEFuYWxvZyB2b2x0YWdlIHJlZmVyZW5jZSAoVnJlZispIHZhbHVlIHdpdGggd2hpY2ggdGVtcGVyYXR1cmUgc2Vuc29yIGhhcyBiZWVuIGNhbGlicmF0ZWQgaW4gcHJvZHVjdGlvbiAodG9sZXJhbmNlOiArLTEwIG1WKSAodW5pdDogbVYpLiAqLworLyogVGVtcGVyYXR1cmUgc2Vuc29yICovCisjZGVmaW5lIFRFTVBTRU5TT1JfQ0FMMV9BRERSICAgICAgICAgICAgICAgKCh1aW50MTZfdCopICgodWludDMyX3QpMHgxRkZGRjdCOFUpKSAvKiBJbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IsIGFkZHJlc3Mgb2YgcGFyYW1ldGVyIFRTX0NBTDE6IE9uIFNUTTMyRjMsIHRlbXBlcmF0dXJlIHNlbnNvciBBREMgcmF3IGRhdGEgYWNxdWlyZWQgYXQgdGVtcGVyYXR1cmUgIDI1IERlZ0MgKHRvbGVyYW5jZTogKy01IERlZ0MpLCBWcmVmKyA9IDMuMyBWICh0b2xlcmFuY2U6ICstMTAgbVYpLiAqLworI2RlZmluZSBURU1QU0VOU09SX0NBTDJfQUREUiAgICAgICAgICAgICAgICgodWludDE2X3QqKSAoKHVpbnQzMl90KTB4MUZGRkY3QzJVKSkgLyogSW50ZXJuYWwgdGVtcGVyYXR1cmUgc2Vuc29yLCBhZGRyZXNzIG9mIHBhcmFtZXRlciBUU19DQUwyOiBPbiBTVE0zMkYzLCB0ZW1wZXJhdHVyZSBzZW5zb3IgQURDIHJhdyBkYXRhIGFjcXVpcmVkIGF0IHRlbXBlcmF0dXJlIDExMCBEZWdDICh0b2xlcmFuY2U6ICstNSBEZWdDKSwgVnJlZisgPSAzLjMgViAodG9sZXJhbmNlOiArLTEwIG1WKS4gKi8KKyNkZWZpbmUgVEVNUFNFTlNPUl9DQUwxX1RFTVAgICAgICAgICAgICAgICAoKCBpbnQzMl90KSAgIDI1KSAgICAgICAgICAgICAgICAgICAgIC8qIEludGVybmFsIHRlbXBlcmF0dXJlIHNlbnNvciwgdGVtcGVyYXR1cmUgYXQgd2hpY2ggdGVtcGVyYXR1cmUgc2Vuc29yIGhhcyBiZWVuIGNhbGlicmF0ZWQgaW4gcHJvZHVjdGlvbiBmb3IgZGF0YSBpbnRvIFRFTVBTRU5TT1JfQ0FMMV9BRERSICh0b2xlcmFuY2U6ICstNSBEZWdDKSAodW5pdDogRGVnQykuICovCisjZGVmaW5lIFRFTVBTRU5TT1JfQ0FMMl9URU1QICAgICAgICAgICAgICAgKCggaW50MzJfdCkgIDExMCkgICAgICAgICAgICAgICAgICAgICAvKiBJbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IsIHRlbXBlcmF0dXJlIGF0IHdoaWNoIHRlbXBlcmF0dXJlIHNlbnNvciBoYXMgYmVlbiBjYWxpYnJhdGVkIGluIHByb2R1Y3Rpb24gZm9yIGRhdGEgaW50byBURU1QU0VOU09SX0NBTDJfQUREUiAodG9sZXJhbmNlOiArLTUgRGVnQykgKHVuaXQ6IERlZ0MpLiAqLworI2RlZmluZSBURU1QU0VOU09SX0NBTF9WUkVGQU5BTE9HICAgICAgICAgICgodWludDMyX3QpIDMzMDBVKSAgICAgICAgICAgICAgICAgICAgLyogQW5hbG9nIHZvbHRhZ2UgcmVmZXJlbmNlIChWcmVmKykgdm9sdGFnZSB3aXRoIHdoaWNoIHRlbXBlcmF0dXJlIHNlbnNvciBoYXMgYmVlbiBjYWxpYnJhdGVkIGluIHByb2R1Y3Rpb24gKCstMTAgbVYpICh1bml0OiBtVikuICovCisKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBBRENfTExfUHJpdmF0ZV9NYWNyb3MgQURDIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBEcml2ZXIgbWFjcm8gcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZTogaXNvbGF0ZSBiaXRzIHdpdGggdGhlCisgICogICAgICAgICBzZWxlY3RlZCBtYXNrIGFuZCBzaGlmdCB0aGVtIHRvIHRoZSByZWdpc3RlciBMU0IKKyAgKiAgICAgICAgIChzaGlmdCBtYXNrIG9uIHJlZ2lzdGVyIHBvc2l0aW9uIGJpdCAwKS4KKyAgKiBAcGFyYW0gIF9fQklUU19fIEJpdHMgaW4gcmVnaXN0ZXIgMzIgYml0cworICAqIEBwYXJhbSAgX19NQVNLX18gTWFzayBpbiByZWdpc3RlciAzMiBiaXRzCisgICogQHJldHZhbCBCaXRzIGluIHJlZ2lzdGVyIDMyIGJpdHMKKyAgKi8KKyNkZWZpbmUgX19BRENfTUFTS19TSElGVChfX0JJVFNfXywgX19NQVNLX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fQklUU19fKSAmIChfX01BU0tfXykpID4+IFBPU0lUSU9OX1ZBTCgoX19NQVNLX18pKSkKKworLyoqCisgICogQGJyaWVmICBEcml2ZXIgbWFjcm8gcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZTogc2V0IGEgcG9pbnRlciB0bworICAqICAgICAgICAgYSByZWdpc3RlciBmcm9tIGEgcmVnaXN0ZXIgYmFzaXMgZnJvbSB3aGljaCBhbiBvZmZzZXQKKyAgKiAgICAgICAgIGlzIGFwcGxpZWQuCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIGJhc2lzIGZyb20gd2hpY2ggdGhlIG9mZnNldCBpcyBhcHBsaWVkLgorICAqIEBwYXJhbSAgX19SRUdfT0ZGRlNFVF9fIE9mZnNldCB0byBiZSBhcHBsaWVkICh1bml0OiBudW1iZXIgb2YgcmVnaXN0ZXJzKS4KKyAgKiBAcmV0dmFsIFBvaW50ZXIgdG8gcmVnaXN0ZXIgYWRkcmVzcworICAqLworI2RlZmluZSBfX0FEQ19QVFJfUkVHX09GRlNFVChfX1JFR19fLCBfX1JFR19PRkZGU0VUX18pICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAoKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSAoKHVpbnQzMl90KSgmKF9fUkVHX18pKSArICgoX19SRUdfT0ZGRlNFVF9fKSA8PCAyVSkpKSkKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBBRENfTExfRVNfSU5JVCBBREMgRXhwb3J0ZWQgSW5pdCBzdHJ1Y3R1cmUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFN0cnVjdHVyZSBkZWZpbml0aW9uIG9mIHNvbWUgZmVhdHVyZXMgb2YgQURDIGNvbW1vbiBwYXJhbWV0ZXJzCisgICogICAgICAgICBhbmQgbXVsdGltb2RlCisgICogICAgICAgICAoYWxsIEFEQyBpbnN0YW5jZXMgYmVsb25naW5nIHRvIHRoZSBzYW1lIEFEQyBjb21tb24gaW5zdGFuY2UpLgorICAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBieSBmdW5jdGlvbiBAcmVmIExMX0FEQ19Db21tb25Jbml0KCkKKyAgKiAgICAgICAgIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBpbnN0YW5jZXMgc3RhdGUgKGFsbCBBREMgaW5zdGFuY2VzCisgICogICAgICAgICBzaGFyaW5nIHRoZSBzYW1lIEFEQyBjb21tb24gaW5zdGFuY2UpOgorICAqICAgICAgICAgQWxsIEFEQyBpbnN0YW5jZXMgc2hhcmluZyB0aGUgc2FtZSBBREMgY29tbW9uIGluc3RhbmNlIG11c3QgYmUKKyAgKiAgICAgICAgIGRpc2FibGVkLgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQ29tbW9uQ2xvY2s7ICAgICAgICAgICAgICAgICAvKiE8IFNldCBwYXJhbWV0ZXIgY29tbW9uIHRvIHNldmVyYWwgQURDOiBDbG9jayBzb3VyY2UgYW5kIHByZXNjYWxlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX0NPTU1PTl9DTE9DS19TT1VSQ0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIE9uIHRoaXMgU1RNMzIgc2VyaWUsIGlmIEFEQyBncm91cCBpbmplY3RlZCBpcyB1c2VkLCBzb21lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9jayByYXRpbyBjb25zdHJhaW50cyBiZXR3ZWVuIEFEQyBjbG9jayBhbmQgQUhCIGNsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIHJlc3BlY3RlZC4gUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0Q29tbW9uQ2xvY2soKS4gKi8KKworI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQorICB1aW50MzJfdCBNdWx0aW1vZGU7ICAgICAgICAgICAgICAgICAgIC8qITwgU2V0IEFEQyBtdWx0aW1vZGUgY29uZmlndXJhdGlvbiB0byBvcGVyYXRlIGluIGluZGVwZW5kZW50IG1vZGUgb3IgbXVsdGltb2RlIChmb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDIGluc3RhbmNlcykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19MTF9FQ19NVUxUSV9NT0RFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX1NldE11bHRpbW9kZSgpLiAqLworCisgIHVpbnQzMl90IE11bHRpRE1BVHJhbnNmZXI7ICAgICAgICAgICAgLyohPCBTZXQgQURDIG11bHRpbW9kZSBjb252ZXJzaW9uIGRhdGEgdHJhbnNmZXI6IG5vIHRyYW5zZmVyIG9yIHRyYW5zZmVyIGJ5IERNQS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX01VTFRJX0RNQV9UUkFOU0ZFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRNdWx0aURNQVRyYW5zZmVyKCkuICovCisKKyAgdWludDMyX3QgTXVsdGlUd29TYW1wbGluZ0RlbGF5OyAgICAgICAvKiE8IFNldCBBREMgbXVsdGltb2RlIGRlbGF5IGJldHdlZW4gMiBzYW1wbGluZyBwaGFzZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19MTF9FQ19NVUxUSV9UV09TTVBfREVMQVkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0TXVsdGlUd29TYW1wbGluZ0RlbGF5KCkuICovCisjZW5kaWYgLyogQURDX01VTFRJTU9ERV9TVVBQT1JUICovCisKK30gTExfQURDX0NvbW1vbkluaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFN0cnVjdHVyZSBkZWZpbml0aW9uIG9mIHNvbWUgZmVhdHVyZXMgb2YgQURDIGluc3RhbmNlLgorICAqIEBub3RlICAgVGhlc2UgcGFyYW1ldGVycyBoYXZlIGFuIGltcGFjdCBvbiBBREMgc2NvcGU6IEFEQyBpbnN0YW5jZS4KKyAgKiAgICAgICAgIEFmZmVjdHMgYm90aCBncm91cCByZWd1bGFyIGFuZCBncm91cCBpbmplY3RlZCAoYXZhaWxhYmlsaXR5CisgICogICAgICAgICBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQgZGVwZW5kcyBvbiBTVE0zMiBmYW1pbGllcykuCisgICogICAgICAgICBSZWZlciB0byBjb3JyZXNwb25kaW5nIHVuaXRhcnkgZnVuY3Rpb25zIGludG8KKyAgKiAgICAgICAgIEByZWYgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX0luc3RhbmNlIC4KKyAgKiBAbm90ZSAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgYnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfSW5pdCgpCisgICogICAgICAgICBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgaW5zdGFuY2UgbXVzdCBiZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgY29uZGl0aW9uIGlzIGFwcGxpZWQgdG8gYWxsIEFEQyBmZWF0dXJlcywgZm9yIGVmZmljaWVuY3kKKyAgKiAgICAgICAgIGFuZCBjb21wYXRpYmlsaXR5IG92ZXIgYWxsIFNUTTMyIGZhbWlsaWVzLiBIb3dldmVyLCB0aGUgZGlmZmVyZW50CisgICogICAgICAgICBmZWF0dXJlcyBjYW4gYmUgc2V0IHVuZGVyIGRpZmZlcmVudCBBREMgc3RhdGUgY29uZGl0aW9ucworICAqICAgICAgICAgKHNldHRpbmcgcG9zc2libGUgd2l0aCBBREMgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcsCisgICogICAgICAgICBBREMgZW5hYmxlZCB3aXRoIGNvbnZlcnNpb24gb24gZ29pbmcsIC4uLikKKyAgKiAgICAgICAgIEVhY2ggZmVhdHVyZSBjYW4gYmUgdXBkYXRlZCBhZnRlcndhcmRzIHdpdGggYSB1bml0YXJ5IGZ1bmN0aW9uCisgICogICAgICAgICBhbmQgcG90ZW50aWFsbHkgd2l0aCBBREMgaW4gYSBkaWZmZXJlbnQgc3RhdGUgdGhhbiBkaXNhYmxlZCwKKyAgKiAgICAgICAgIHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIGVhY2ggZnVuY3Rpb24gZm9yIHNldHRpbmcKKyAgKiAgICAgICAgIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZS4KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFJlc29sdXRpb247ICAgICAgICAgICAgICAgICAgLyohPCBTZXQgQURDIHJlc29sdXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19MTF9FQ19SRVNPTFVUSU9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX1NldFJlc29sdXRpb24oKS4gKi8KKworICB1aW50MzJfdCBEYXRhQWxpZ25tZW50OyAgICAgICAgICAgICAgIC8qITwgU2V0IEFEQyBjb252ZXJzaW9uIGRhdGEgYWxpZ25tZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfTExfRUNfREFUQV9BTElHTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXREYXRhQWxpZ25tZW50KCkuICovCisKKyAgdWludDMyX3QgTG93UG93ZXJNb2RlOyAgICAgICAgICAgICAgICAvKiE8IFNldCBBREMgbG93IHBvd2VyIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19MTF9FQ19MUF9NT0RFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX1NldExvd1Bvd2VyTW9kZSgpLiAqLworCit9IExMX0FEQ19Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBvZiBzb21lIGZlYXR1cmVzIG9mIEFEQyBncm91cCByZWd1bGFyLgorICAqIEBub3RlICAgVGhlc2UgcGFyYW1ldGVycyBoYXZlIGFuIGltcGFjdCBvbiBBREMgc2NvcGU6IEFEQyBncm91cCByZWd1bGFyLgorICAqICAgICAgICAgUmVmZXIgdG8gY29ycmVzcG9uZGluZyB1bml0YXJ5IGZ1bmN0aW9ucyBpbnRvCisgICogICAgICAgICBAcmVmIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0FEQ19Hcm91cF9SZWd1bGFyCisgICogICAgICAgICAoZnVuY3Rpb25zIHdpdGggcHJlZml4ICJSRUciKS4KKyAgKiBAbm90ZSAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgYnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX0luaXQoKQorICAqICAgICAgICAgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIGluc3RhbmNlIG11c3QgYmUgZGlzYWJsZWQuCisgICogICAgICAgICBUaGlzIGNvbmRpdGlvbiBpcyBhcHBsaWVkIHRvIGFsbCBBREMgZmVhdHVyZXMsIGZvciBlZmZpY2llbmN5CisgICogICAgICAgICBhbmQgY29tcGF0aWJpbGl0eSBvdmVyIGFsbCBTVE0zMiBmYW1pbGllcy4gSG93ZXZlciwgdGhlIGRpZmZlcmVudAorICAqICAgICAgICAgZmVhdHVyZXMgY2FuIGJlIHNldCB1bmRlciBkaWZmZXJlbnQgQURDIHN0YXRlIGNvbmRpdGlvbnMKKyAgKiAgICAgICAgIChzZXR0aW5nIHBvc3NpYmxlIHdpdGggQURDIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nLAorICAqICAgICAgICAgQURDIGVuYWJsZWQgd2l0aCBjb252ZXJzaW9uIG9uIGdvaW5nLCAuLi4pCisgICogICAgICAgICBFYWNoIGZlYXR1cmUgY2FuIGJlIHVwZGF0ZWQgYWZ0ZXJ3YXJkcyB3aXRoIGEgdW5pdGFyeSBmdW5jdGlvbgorICAqICAgICAgICAgYW5kIHBvdGVudGlhbGx5IHdpdGggQURDIGluIGEgZGlmZmVyZW50IHN0YXRlIHRoYW4gZGlzYWJsZWQsCisgICogICAgICAgICByZWZlciB0byBkZXNjcmlwdGlvbiBvZiBlYWNoIGZ1bmN0aW9uIGZvciBzZXR0aW5nCisgICogICAgICAgICBjb25kaXRpb25lZCB0byBBREMgc3RhdGUuCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBUcmlnZ2VyU291cmNlOyAgICAgICAgICAgICAgIC8qITwgU2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBzb3VyY2U6IGludGVybmFsIChTVyBzdGFydCkgb3IgZnJvbSBleHRlcm5hbCBJUCAodGltZXIgZXZlbnQsIGV4dGVybmFsIGludGVycnVwdCBsaW5lKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX1JFR19UUklHR0VSX1NPVVJDRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyB0cmlnZ2VyIHNvdXJjZSB0byBleHRlcm5hbCB0cmlnZ2VyIGFsc28gc2V0IHRyaWdnZXIgcG9sYXJpdHkgdG8gcmlzaW5nIGVkZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IHNldHRpbmcgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBzb21lIEFEQyBvbiBvdGhlciBTVE0zMiBmYW1pbGllcyBoYXZpbmcgdGhpcyBzZXR0aW5nIHNldCBieSBIVyBkZWZhdWx0IHZhbHVlKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIGNhc2Ugb2YgbmVlZCB0byBtb2RpZnkgdHJpZ2dlciBlZGdlLCB1c2UgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFRyaWdnZXJFZGdlKCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19TZXRUcmlnZ2VyU291cmNlKCkuICovCisKKyAgdWludDMyX3QgU2VxdWVuY2VyTGVuZ3RoOyAgICAgICAgICAgICAvKiE8IFNldCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgbGVuZ3RoLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfTExfRUNfUkVHX1NFUV9TQ0FOX0xFTkdUSAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyTGVuZ3RoKCkuICovCisKKyAgdWludDMyX3QgU2VxdWVuY2VyRGlzY29udDsgICAgICAgICAgICAvKiE8IFNldCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlOiBzZXF1ZW5jZSBzdWJkaXZpZGVkIGFuZCBzY2FuIGNvbnZlcnNpb25zIGludGVycnVwdGVkIGV2ZXJ5IHNlbGVjdGVkIG51bWJlciBvZiByYW5rcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX1JFR19TRVFfRElTQ09OVF9NT0RFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIHBhcmFtZXRlciBoYXMgYW4gZWZmZWN0IG9ubHkgaWYgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgaXMgZW5hYmxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNjYW4gbGVuZ3RoIG9mIDIgcmFua3Mgb3IgbW9yZSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJEaXNjb250KCkuICovCisKKyAgdWludDMyX3QgQ29udGludW91c01vZGU7ICAgICAgICAgICAgICAvKiE8IFNldCBBREMgY29udGludW91cyBjb252ZXJzaW9uIG1vZGUgb24gQURDIGdyb3VwIHJlZ3VsYXIsIHdoZXRoZXIgQURDIGNvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQgaW4gc2luZ2xlIG1vZGUgKG9uZSBjb252ZXJzaW9uIHBlciB0cmlnZ2VyKSBvciBpbiBjb250aW51b3VzIG1vZGUgKGFmdGVyIHRoZSBmaXJzdCB0cmlnZ2VyLCBmb2xsb3dpbmcgY29udmVyc2lvbnMgbGF1bmNoZWQgc3VjY2Vzc2l2ZWx5IGF1dG9tYXRpY2FsbHkpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfTExfRUNfUkVHX0NPTlRJTlVPVVNfTU9ERQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogSXQgaXMgbm90IHBvc3NpYmxlIHRvIGVuYWJsZSBib3RoIEFEQyBncm91cCByZWd1bGFyIGNvbnRpbnVvdXMgbW9kZSBhbmQgZGlzY29udGludW91cyBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0Q29udGludW91c01vZGUoKS4gKi8KKworICB1aW50MzJfdCBETUFUcmFuc2ZlcjsgICAgICAgICAgICAgICAgIC8qITwgU2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gZGF0YSB0cmFuc2Zlcjogbm8gdHJhbnNmZXIgb3IgdHJhbnNmZXIgYnkgRE1BLCBhbmQgRE1BIHJlcXVlc3RzIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19MTF9FQ19SRUdfRE1BX1RSQU5TRkVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19TZXRETUFUcmFuc2ZlcigpLiAqLworCisgIHVpbnQzMl90IE92ZXJydW47ICAgICAgICAgICAgICAgICAgICAgLyohPCBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgYmVoYXZpb3IgaW4gY2FzZSBvZiBvdmVycnVuOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBwcmVzZXJ2ZWQgb3Igb3ZlcndyaXR0ZW4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19MTF9FQ19SRUdfT1ZSX0RBVEFfQkVIQVZJT1IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldE92ZXJydW4oKS4gKi8KKworfSBMTF9BRENfUkVHX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFN0cnVjdHVyZSBkZWZpbml0aW9uIG9mIHNvbWUgZmVhdHVyZXMgb2YgQURDIGdyb3VwIGluamVjdGVkLgorICAqIEBub3RlICAgVGhlc2UgcGFyYW1ldGVycyBoYXZlIGFuIGltcGFjdCBvbiBBREMgc2NvcGU6IEFEQyBncm91cCBpbmplY3RlZC4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGNvcnJlc3BvbmRpbmcgdW5pdGFyeSBmdW5jdGlvbnMgaW50bworICAqICAgICAgICAgQHJlZiBBRENfTExfRUZfQ29uZmlndXJhdGlvbl9BRENfR3JvdXBfUmVndWxhcgorICAqICAgICAgICAgKGZ1bmN0aW9ucyB3aXRoIHByZWZpeCAiSU5KIikuCisgICogQG5vdGUgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX0lOSl9Jbml0KCkKKyAgKiAgICAgICAgIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBpbnN0YW5jZSBtdXN0IGJlIGRpc2FibGVkLgorICAqICAgICAgICAgVGhpcyBjb25kaXRpb24gaXMgYXBwbGllZCB0byBhbGwgQURDIGZlYXR1cmVzLCBmb3IgZWZmaWNpZW5jeQorICAqICAgICAgICAgYW5kIGNvbXBhdGliaWxpdHkgb3ZlciBhbGwgU1RNMzIgZmFtaWxpZXMuIEhvd2V2ZXIsIHRoZSBkaWZmZXJlbnQKKyAgKiAgICAgICAgIGZlYXR1cmVzIGNhbiBiZSBzZXQgdW5kZXIgZGlmZmVyZW50IEFEQyBzdGF0ZSBjb25kaXRpb25zCisgICogICAgICAgICAoc2V0dGluZyBwb3NzaWJsZSB3aXRoIEFEQyBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZywKKyAgKiAgICAgICAgIEFEQyBlbmFibGVkIHdpdGggY29udmVyc2lvbiBvbiBnb2luZywgLi4uKQorICAqICAgICAgICAgRWFjaCBmZWF0dXJlIGNhbiBiZSB1cGRhdGVkIGFmdGVyd2FyZHMgd2l0aCBhIHVuaXRhcnkgZnVuY3Rpb24KKyAgKiAgICAgICAgIGFuZCBwb3RlbnRpYWxseSB3aXRoIEFEQyBpbiBhIGRpZmZlcmVudCBzdGF0ZSB0aGFuIGRpc2FibGVkLAorICAqICAgICAgICAgcmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgZWFjaCBmdW5jdGlvbiBmb3Igc2V0dGluZworICAqICAgICAgICAgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgVHJpZ2dlclNvdXJjZTsgICAgICAgICAgICAgICAvKiE8IFNldCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIHNvdXJjZTogaW50ZXJuYWwgKFNXIHN0YXJ0KSBvciBmcm9tIGV4dGVybmFsIElQICh0aW1lciBldmVudCwgZXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfTExfRUNfSU5KX1RSSUdHRVJfU09VUkNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIHRyaWdnZXIgc291cmNlIHRvIGV4dGVybmFsIHRyaWdnZXIgYWxzbyBzZXQgdHJpZ2dlciBwb2xhcml0eSB0byByaXNpbmcgZWRnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgc2V0dGluZyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHNvbWUgQURDIG9uIG90aGVyIFNUTTMyIGZhbWlsaWVzIGhhdmluZyB0aGlzIHNldHRpbmcgc2V0IGJ5IEhXIGRlZmF1bHQgdmFsdWUpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gY2FzZSBvZiBuZWVkIHRvIG1vZGlmeSB0cmlnZ2VyIGVkZ2UsIHVzZSBmdW5jdGlvbiBAcmVmIExMX0FEQ19JTkpfU2V0VHJpZ2dlckVkZ2UoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfSU5KX1NldFRyaWdnZXJTb3VyY2UoKS4gKi8KKworICB1aW50MzJfdCBTZXF1ZW5jZXJMZW5ndGg7ICAgICAgICAgICAgIC8qITwgU2V0IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgbGVuZ3RoLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfTExfRUNfSU5KX1NFUV9TQ0FOX0xFTkdUSAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0FEQ19JTkpfU2V0U2VxdWVuY2VyTGVuZ3RoKCkuICovCisKKyAgdWludDMyX3QgU2VxdWVuY2VyRGlzY29udDsgICAgICAgICAgICAvKiE8IFNldCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZTogc2VxdWVuY2Ugc3ViZGl2aWRlZCBhbmQgc2NhbiBjb252ZXJzaW9ucyBpbnRlcnJ1cHRlZCBldmVyeSBzZWxlY3RlZCBudW1iZXIgb2YgcmFua3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19MTF9FQ19JTkpfU0VRX0RJU0NPTlRfTU9ERQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBwYXJhbWV0ZXIgaGFzIGFuIGVmZmVjdCBvbmx5IGlmIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciBpcyBlbmFibGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2NhbiBsZW5ndGggb2YgMiByYW5rcyBvciBtb3JlKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfSU5KX1NldFNlcXVlbmNlckRpc2NvbnQoKS4gKi8KKworICB1aW50MzJfdCBUcmlnQXV0bzsgICAgICAgICAgICAgICAgICAgIC8qITwgU2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXI6IGluZGVwZW5kZW50IG9yIGZyb20gQURDIGdyb3VwIHJlZ3VsYXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19MTF9FQ19JTkpfVFJJR19BVVRPCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIHNldCB0byBzZXQgdG8gaW5kZXBlbmRlbnQgdHJpZ2dlciBpZiBpbmplY3RlZCB0cmlnZ2VyIHNvdXJjZSBpcyBzZXQgdG8gYW4gZXh0ZXJuYWwgdHJpZ2dlci4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX0lOSl9TZXRUcmlnQXV0bygpLiAqLworCit9IExMX0FEQ19JTkpfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FeHBvcnRlZF9Db25zdGFudHMgQURDIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0ZMQUcgQURDIGZsYWdzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9BRENfUmVhZFJlZyBmdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19GTEFHX0FEUkRZICAgICAgICAgICAgICAgICAgQURDX0lTUl9BRFJEWSAgICAgIC8qITwgQURDIGZsYWcgQURDIGluc3RhbmNlIHJlYWR5ICovCisjZGVmaW5lIExMX0FEQ19GTEFHX0VPQyAgICAgICAgICAgICAgICAgICAgQURDX0lTUl9FT0MgICAgICAgIC8qITwgQURDIGZsYWcgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbiAqLworI2RlZmluZSBMTF9BRENfRkxBR19FT1MgICAgICAgICAgICAgICAgICAgIEFEQ19JU1JfRU9TICAgICAgICAvKiE8IEFEQyBmbGFnIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucyAqLworI2RlZmluZSBMTF9BRENfRkxBR19PVlIgICAgICAgICAgICAgICAgICAgIEFEQ19JU1JfT1ZSICAgICAgICAvKiE8IEFEQyBmbGFnIEFEQyBncm91cCByZWd1bGFyIG92ZXJydW4gKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfRU9TTVAgICAgICAgICAgICAgICAgICBBRENfSVNSX0VPU01QICAgICAgLyohPCBBREMgZmxhZyBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2FtcGxpbmcgcGhhc2UgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfSkVPQyAgICAgICAgICAgICAgICAgICBBRENfSVNSX0pFT0MgICAgICAgLyohPCBBREMgZmxhZyBBREMgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbiAqLworI2RlZmluZSBMTF9BRENfRkxBR19KRU9TICAgICAgICAgICAgICAgICAgIEFEQ19JU1JfSkVPUyAgICAgICAvKiE8IEFEQyBmbGFnIEFEQyBncm91cCBpbmplY3RlZCBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfSlFPVkYgICAgICAgICAgICAgICAgICBBRENfSVNSX0pRT1ZGICAgICAgLyohPCBBREMgZmxhZyBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udGV4dHMgcXVldWUgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfQVdEMSAgICAgICAgICAgICAgICAgICBBRENfSVNSX0FXRDEgICAgICAgLyohPCBBREMgZmxhZyBBREMgYW5hbG9nIHdhdGNoZG9nIDEgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfQVdEMiAgICAgICAgICAgICAgICAgICBBRENfSVNSX0FXRDIgICAgICAgLyohPCBBREMgZmxhZyBBREMgYW5hbG9nIHdhdGNoZG9nIDIgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfQVdEMyAgICAgICAgICAgICAgICAgICBBRENfSVNSX0FXRDMgICAgICAgLyohPCBBREMgZmxhZyBBREMgYW5hbG9nIHdhdGNoZG9nIDMgKi8KKyNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkKKyNkZWZpbmUgTExfQURDX0ZMQUdfQURSRFlfTVNUICAgICAgICAgICAgICBBRENfQ1NSX0FEUkRZX01TVCAgLyohPCBBREMgZmxhZyBBREMgbXVsdGltb2RlIG1hc3RlciBpbnN0YW5jZSByZWFkeSAqLworI2RlZmluZSBMTF9BRENfRkxBR19BRFJEWV9TTFYgICAgICAgICAgICAgIEFEQ19DU1JfQURSRFlfU0xWICAvKiE8IEFEQyBmbGFnIEFEQyBtdWx0aW1vZGUgc2xhdmUgaW5zdGFuY2UgcmVhZHkgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfRU9DX01TVCAgICAgICAgICAgICAgICBBRENfQ1NSX0VPQ19NU1QgICAgLyohPCBBREMgZmxhZyBBREMgbXVsdGltb2RlIG1hc3RlciBncm91cCByZWd1bGFyIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfRU9DX1NMViAgICAgICAgICAgICAgICBBRENfQ1NSX0VPQ19TTFYgICAgLyohPCBBREMgZmxhZyBBREMgbXVsdGltb2RlIHNsYXZlIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbiAqLworI2RlZmluZSBMTF9BRENfRkxBR19FT1NfTVNUICAgICAgICAgICAgICAgIEFEQ19DU1JfRU9TX01TVCAgICAvKiE8IEFEQyBmbGFnIEFEQyBtdWx0aW1vZGUgbWFzdGVyIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zICovCisjZGVmaW5lIExMX0FEQ19GTEFHX0VPU19TTFYgICAgICAgICAgICAgICAgQURDX0NTUl9FT1NfU0xWICAgIC8qITwgQURDIGZsYWcgQURDIG11bHRpbW9kZSBzbGF2ZSBncm91cCByZWd1bGFyIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucyAqLworI2RlZmluZSBMTF9BRENfRkxBR19PVlJfTVNUICAgICAgICAgICAgICAgIEFEQ19DU1JfT1ZSX01TVCAgICAvKiE8IEFEQyBmbGFnIEFEQyBtdWx0aW1vZGUgbWFzdGVyIGdyb3VwIHJlZ3VsYXIgb3ZlcnJ1biAqLworI2RlZmluZSBMTF9BRENfRkxBR19PVlJfU0xWICAgICAgICAgICAgICAgIEFEQ19DU1JfT1ZSX1NMViAgICAvKiE8IEFEQyBmbGFnIEFEQyBtdWx0aW1vZGUgc2xhdmUgZ3JvdXAgcmVndWxhciBvdmVycnVuICovCisjZGVmaW5lIExMX0FEQ19GTEFHX0VPU01QX01TVCAgICAgICAgICAgICAgQURDX0NTUl9FT1NNUF9NU1QgIC8qITwgQURDIGZsYWcgQURDIG11bHRpbW9kZSBtYXN0ZXIgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2FtcGxpbmcgcGhhc2UgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfRU9TTVBfU0xWICAgICAgICAgICAgICBBRENfQ1NSX0VPU01QX1NMViAgLyohPCBBREMgZmxhZyBBREMgbXVsdGltb2RlIHNsYXZlIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNhbXBsaW5nIHBoYXNlICovCisjZGVmaW5lIExMX0FEQ19GTEFHX0pFT0NfTVNUICAgICAgICAgICAgICAgQURDX0NTUl9KRU9DX01TVCAgIC8qITwgQURDIGZsYWcgQURDIG11bHRpbW9kZSBtYXN0ZXIgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbiAqLworI2RlZmluZSBMTF9BRENfRkxBR19KRU9DX1NMViAgICAgICAgICAgICAgIEFEQ19DU1JfSkVPQ19TTFYgICAvKiE8IEFEQyBmbGFnIEFEQyBtdWx0aW1vZGUgc2xhdmUgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbiAqLworI2RlZmluZSBMTF9BRENfRkxBR19KRU9TX01TVCAgICAgICAgICAgICAgIEFEQ19DU1JfSkVPU19NU1QgICAvKiE8IEFEQyBmbGFnIEFEQyBtdWx0aW1vZGUgbWFzdGVyIGdyb3VwIGluamVjdGVkIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucyAqLworI2RlZmluZSBMTF9BRENfRkxBR19KRU9TX1NMViAgICAgICAgICAgICAgIEFEQ19DU1JfSkVPU19TTFYgICAvKiE8IEFEQyBmbGFnIEFEQyBtdWx0aW1vZGUgc2xhdmUgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zICovCisjZGVmaW5lIExMX0FEQ19GTEFHX0pRT1ZGX01TVCAgICAgICAgICAgICAgQURDX0NTUl9KUU9WRl9NU1QgIC8qITwgQURDIGZsYWcgQURDIG11bHRpbW9kZSBtYXN0ZXIgZ3JvdXAgaW5qZWN0ZWQgY29udGV4dHMgcXVldWUgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfSlFPVkZfU0xWICAgICAgICAgICAgICBBRENfQ1NSX0pRT1ZGX1NMViAgLyohPCBBREMgZmxhZyBBREMgbXVsdGltb2RlIHNsYXZlIGdyb3VwIGluamVjdGVkIGNvbnRleHRzIHF1ZXVlIG92ZXJmbG93ICovCisjZGVmaW5lIExMX0FEQ19GTEFHX0FXRDFfTVNUICAgICAgICAgICAgICAgQURDX0NTUl9BV0QxX01TVCAgIC8qITwgQURDIGZsYWcgQURDIG11bHRpbW9kZSBtYXN0ZXIgYW5hbG9nIHdhdGNoZG9nIDEgb2YgdGhlIEFEQyBtYXN0ZXIgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfQVdEMV9TTFYgICAgICAgICAgICAgICBBRENfQ1NSX0FXRDFfU0xWICAgLyohPCBBREMgZmxhZyBBREMgbXVsdGltb2RlIHNsYXZlIGFuYWxvZyB3YXRjaGRvZyAxIG9mIHRoZSBBREMgc2xhdmUgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfQVdEMl9NU1QgICAgICAgICAgICAgICBBRENfQ1NSX0FXRDJfTVNUICAgLyohPCBBREMgZmxhZyBBREMgbXVsdGltb2RlIG1hc3RlciBhbmFsb2cgd2F0Y2hkb2cgMiBvZiB0aGUgQURDIG1hc3RlciAqLworI2RlZmluZSBMTF9BRENfRkxBR19BV0QyX1NMViAgICAgICAgICAgICAgIEFEQ19DU1JfQVdEMl9TTFYgICAvKiE8IEFEQyBmbGFnIEFEQyBtdWx0aW1vZGUgc2xhdmUgYW5hbG9nIHdhdGNoZG9nIDIgb2YgdGhlIEFEQyBzbGF2ZSAqLworI2RlZmluZSBMTF9BRENfRkxBR19BV0QzX01TVCAgICAgICAgICAgICAgIEFEQ19DU1JfQVdEM19NU1QgICAvKiE8IEFEQyBmbGFnIEFEQyBtdWx0aW1vZGUgbWFzdGVyIGFuYWxvZyB3YXRjaGRvZyAzIG9mIHRoZSBBREMgbWFzdGVyICovCisjZGVmaW5lIExMX0FEQ19GTEFHX0FXRDNfU0xWICAgICAgICAgICAgICAgQURDX0NTUl9BV0QzX1NMViAgIC8qITwgQURDIGZsYWcgQURDIG11bHRpbW9kZSBzbGF2ZSBhbmFsb2cgd2F0Y2hkb2cgMyBvZiB0aGUgQURDIHNsYXZlICovCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0lUIEFEQyBpbnRlcnJ1cHRpb25zIGZvciBjb25maWd1cmF0aW9uIChpbnRlcnJ1cHRpb24gZW5hYmxlIG9yIGRpc2FibGUpCisgICogQGJyaWVmICAgIElUIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9BRENfUmVhZFJlZyBhbmQgIExMX0FEQ19Xcml0ZVJlZyBmdW5jdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfSVRfQURSRFkgICAgICAgICAgICAgICAgICAgIEFEQ19JRVJfQURSRFlJRSAgICAvKiE8IEFEQyBpbnRlcnJ1cHRpb24gQURDIGluc3RhbmNlIHJlYWR5ICovCisjZGVmaW5lIExMX0FEQ19JVF9FT0MgICAgICAgICAgICAgICAgICAgICAgQURDX0lFUl9FT0NJRSAgICAgIC8qITwgQURDIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uICovCisjZGVmaW5lIExMX0FEQ19JVF9FT1MgICAgICAgICAgICAgICAgICAgICAgQURDX0lFUl9FT1NJRSAgICAgIC8qITwgQURDIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMgKi8KKyNkZWZpbmUgTExfQURDX0lUX09WUiAgICAgICAgICAgICAgICAgICAgICBBRENfSUVSX09WUklFICAgICAgLyohPCBBREMgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIG92ZXJydW4gKi8KKyNkZWZpbmUgTExfQURDX0lUX0VPU01QICAgICAgICAgICAgICAgICAgICBBRENfSUVSX0VPU01QSUUgICAgLyohPCBBREMgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzYW1wbGluZyBwaGFzZSAqLworI2RlZmluZSBMTF9BRENfSVRfSkVPQyAgICAgICAgICAgICAgICAgICAgIEFEQ19JRVJfSkVPQ0lFICAgICAvKiE8IEFEQyBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgTExfQURDX0lUX0pFT1MgICAgICAgICAgICAgICAgICAgICBBRENfSUVSX0pFT1NJRSAgICAgLyohPCBBREMgaW50ZXJydXB0aW9uIEFEQyBncm91cCBpbmplY3RlZCBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMgKi8KKyNkZWZpbmUgTExfQURDX0lUX0pRT1ZGICAgICAgICAgICAgICAgICAgICBBRENfSUVSX0pRT1ZGSUUgICAgLyohPCBBREMgaW50ZXJydXB0aW9uIEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0cyBxdWV1ZSBvdmVyZmxvdyAqLworI2RlZmluZSBMTF9BRENfSVRfQVdEMSAgICAgICAgICAgICAgICAgICAgIEFEQ19JRVJfQVdEMUlFICAgICAvKiE8IEFEQyBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAxICovCisjZGVmaW5lIExMX0FEQ19JVF9BV0QyICAgICAgICAgICAgICAgICAgICAgQURDX0lFUl9BV0QySUUgICAgIC8qITwgQURDIGludGVycnVwdGlvbiBBREMgYW5hbG9nIHdhdGNoZG9nIDIgKi8KKyNkZWZpbmUgTExfQURDX0lUX0FXRDMgICAgICAgICAgICAgICAgICAgICBBRENfSUVSX0FXRDNJRSAgICAgLyohPCBBREMgaW50ZXJydXB0aW9uIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfUkVHSVNURVJTICBBREMgcmVnaXN0ZXJzIGNvbXBsaWFudCB3aXRoIHNwZWNpZmljIHB1cnBvc2UKKyAgKiBAeworICAqLworLyogTGlzdCBvZiBBREMgcmVnaXN0ZXJzIGludGVuZGVkIHRvIGJlIHVzZWQgKG1vc3QgY29tbW9ubHkpIHdpdGggICAgICAgICAgICAgKi8KKy8qIERNQSB0cmFuc2Zlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19ETUFfR2V0UmVnQWRkcigpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9BRENfRE1BX1JFR19SRUdVTEFSX0RBVEEgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyogQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhIHJlZ2lzdGVyIChjb3JyZXNwb25kaW5nIHRvIHJlZ2lzdGVyIERSKSB0byBiZSB1c2VkIHdpdGggQURDIGNvbmZpZ3VyZWQgaW4gaW5kZXBlbmRlbnQgbW9kZS4gV2l0aG91dCBETUEgdHJhbnNmZXIsIHJlZ2lzdGVyIGFjY2Vzc2VkIGJ5IExMIGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGEzMigpIGFuZCBvdGhlciBmdW5jdGlvbnMgQHJlZiBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YXgoKSAqLworI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQorI2RlZmluZSBMTF9BRENfRE1BX1JFR19SRUdVTEFSX0RBVEFfTVVMVEkgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxVSkgLyogQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhIHJlZ2lzdGVyIChjb3JyZXNwb25kaW5nIHRvIHJlZ2lzdGVyIENEUikgdG8gYmUgdXNlZCB3aXRoIEFEQyBjb25maWd1cmVkIGluIG11bHRpbW9kZSAoYXZhaWxhYmxlIG9uIFNUTTMyIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQyBpbnN0YW5jZXMpLiBXaXRob3V0IERNQSB0cmFuc2ZlciwgcmVnaXN0ZXIgYWNjZXNzZWQgYnkgTEwgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1JlYWRNdWx0aUNvbnZlcnNpb25EYXRhMzIoKSAqLworI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19DT01NT05fQ0xPQ0tfU09VUkNFICBBREMgY29tbW9uIC0gQ2xvY2sgc291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVYxICAgICAgICAoQURDX0NDUl9DS01PREVfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBzeW5jaHJvbm91cyBjbG9jayBkZXJpdmVkIGZyb20gQUhCIGNsb2NrIHdpdGhvdXQgcHJlc2NhbGVyICovCisjZGVmaW5lIExMX0FEQ19DTE9DS19TWU5DX1BDTEtfRElWMiAgICAgICAgKEFEQ19DQ1JfQ0tNT0RFXzEgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgLyohPCBBREMgc3luY2hyb25vdXMgY2xvY2sgZGVyaXZlZCBmcm9tIEFIQiBjbG9jayB3aXRoIHByZXNjYWxlciBkaXZpc2lvbiBieSAyICovCisjZGVmaW5lIExMX0FEQ19DTE9DS19TWU5DX1BDTEtfRElWNCAgICAgICAgKEFEQ19DQ1JfQ0tNT0RFXzEgfCBBRENfQ0NSX0NLTU9ERV8wKSAgICAgICAgICAgICAgICAgLyohPCBBREMgc3luY2hyb25vdXMgY2xvY2sgZGVyaXZlZCBmcm9tIEFIQiBjbG9jayB3aXRoIHByZXNjYWxlciBkaXZpc2lvbiBieSA0ICovCisjZGVmaW5lIExMX0FEQ19DTE9DS19BU1lOQ19ESVYxICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGhvdXQgcHJlc2NhbGVyICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19DT01NT05fUEFUSF9JTlRFUk5BTCAgQURDIGNvbW1vbiAtIE1lYXN1cmVtZW50IHBhdGggdG8gaW50ZXJuYWwgY2hhbm5lbHMKKyAgKiBAeworICAqLworLyogTm90ZTogT3RoZXIgbWVhc3VyZW1lbnQgcGF0aHMgdG8gaW50ZXJuYWwgY2hhbm5lbHMgbWF5IGJlIGF2YWlsYWJsZSAgICAgICAgKi8KKy8qICAgICAgIChjb25uZWN0aW9ucyB0byBvdGhlciBwZXJpcGhlcmFscykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBJZiB0aGV5IGFyZSBub3QgbGlzdGVkIGJlbG93LCB0aGV5IGRvIG5vdCByZXF1aXJlIGFueSBzcGVjaWZpYyAgICAgICAqLworLyogICAgICAgcGF0aCBlbmFibGUuIEluIHRoaXMgY2FzZSwgQWNjZXNzIHRvIG1lYXN1cmVtZW50IHBhdGggaXMgZG9uZSAgICAgICAgKi8KKy8qICAgICAgIG9ubHkgYnkgc2VsZWN0aW5nIHRoZSBjb3JyZXNwb25kaW5nIEFEQyBpbnRlcm5hbCBjaGFubmVsLiAgICAgICAgICAgICovCisjZGVmaW5lIExMX0FEQ19QQVRIX0lOVEVSTkFMX05PTkUgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkvKiE8IEFEQyBtZWFzdXJlbWVudCBwYXRoZXMgYWxsIGRpc2FibGVkICovCisjZGVmaW5lIExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZSRUZJTlQgICAgICAgKEFEQ19DQ1JfVlJFRkVOKSAgICAgICAvKiE8IEFEQyBtZWFzdXJlbWVudCBwYXRoIHRvIGludGVybmFsIGNoYW5uZWwgVnJlZkludCAqLworI2RlZmluZSBMTF9BRENfUEFUSF9JTlRFUk5BTF9URU1QU0VOU09SICAgIChBRENfQ0NSX1RTRU4pICAgICAgICAgLyohPCBBREMgbWVhc3VyZW1lbnQgcGF0aCB0byBpbnRlcm5hbCBjaGFubmVsIHRlbXBlcmF0dXJlIHNlbnNvciAqLworI2RlZmluZSBMTF9BRENfUEFUSF9JTlRFUk5BTF9WQkFUICAgICAgICAgIChBRENfQ0NSX1ZCQVRFTikgICAgICAgLyohPCBBREMgbWVhc3VyZW1lbnQgcGF0aCB0byBpbnRlcm5hbCBjaGFubmVsIFZiYXQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX1JFU09MVVRJT04gIEFEQyBpbnN0YW5jZSAtIFJlc29sdXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfUkVTT0xVVElPTl8xMkIgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAgIC8qITwgQURDIHJlc29sdXRpb24gMTIgYml0cyAqLworI2RlZmluZSBMTF9BRENfUkVTT0xVVElPTl8xMEIgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgIEFEQ19DRkdSX1JFU18wKSAgIC8qITwgQURDIHJlc29sdXRpb24gMTAgYml0cyAqLworI2RlZmluZSBMTF9BRENfUkVTT0xVVElPTl84QiAgICAgICAgICAgICAgIChBRENfQ0ZHUl9SRVNfMSAgICAgICAgICAgICAgICAgKSAgIC8qITwgQURDIHJlc29sdXRpb24gIDggYml0cyAqLworI2RlZmluZSBMTF9BRENfUkVTT0xVVElPTl82QiAgICAgICAgICAgICAgIChBRENfQ0ZHUl9SRVNfMSB8IEFEQ19DRkdSX1JFU18wKSAgIC8qITwgQURDIHJlc29sdXRpb24gIDYgYml0cyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfREFUQV9BTElHTiAgQURDIGluc3RhbmNlIC0gRGF0YSBhbGlnbm1lbnQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfREFUQV9BTElHTl9SSUdIVCAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpLyohPCBBREMgY29udmVyc2lvbiBkYXRhIGFsaWdubWVudDogcmlnaHQgYWxpZ25lZCAoYWxpZ25tZW50IG9uIGRhdGEgcmVnaXN0ZXIgTFNCIGJpdCAwKSovCisjZGVmaW5lIExMX0FEQ19EQVRBX0FMSUdOX0xFRlQgICAgICAgICAgICAgKEFEQ19DRkdSX0FMSUdOKSAgICAgICAvKiE8IEFEQyBjb252ZXJzaW9uIGRhdGEgYWxpZ25tZW50OiBsZWZ0IGFsaWduZWQgKGFsaWdtZW50IG9uIGRhdGEgcmVnaXN0ZXIgTVNCIGJpdCAxNSkqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfTFBfTU9ERSAgQURDIGluc3RhbmNlIC0gTG93IHBvd2VyIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfTFBfTU9ERV9OT05FICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAvKiE8IE5vIEFEQyBsb3cgcG93ZXIgbW9kZSBhY3RpdmF0ZWQgKi8KKyNkZWZpbmUgTExfQURDX0xQX0FVVE9XQUlUICAgICAgICAgICAgICAgICAoQURDX0NGR1JfQVVURExZKSAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBsb3cgcG93ZXIgbW9kZSBhdXRvIGRlbGF5OiBEeW5hbWljIGxvdyBwb3dlciBtb2RlLCBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCBvbmx5IHdoZW4gbmVjZXNzYXJ5ICh3aGVuIHByZXZpb3VzIEFEQyBjb252ZXJzaW9uIGRhdGEgaXMgcmVhZCkuIFNlZSBkZXNjcmlwdGlvbiB3aXRoIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldExvd1Bvd2VyTW9kZSgpLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfT0ZGU0VUX05CICBBREMgaW5zdGFuY2UgLSBPZmZzZXQgbnVtYmVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX09GRlNFVF8xICAgICAgICAgICAgICAgICAgICBBRENfT0ZSMV9SRUdPRkZTRVQgLyohPCBBREMgb2Zmc2V0IG51bWJlciAxOiBBREMgY2hhbm5lbCBhbmQgb2Zmc2V0IGxldmVsIHRvIHdoaWNoIHRoZSBvZmZzZXQgcHJvZ3JhbW1lZCB3aWxsIGJlIGFwcGxpZWQgKGluZGVwZW5kZW50bHkgb2YgY2hhbm5lbCBtYXBwZWQgb24gQURDIGdyb3VwIHJlZ3VsYXIgb3IgZ3JvdXAgaW5qZWN0ZWQpICovCisjZGVmaW5lIExMX0FEQ19PRkZTRVRfMiAgICAgICAgICAgICAgICAgICAgQURDX09GUjJfUkVHT0ZGU0VUIC8qITwgQURDIG9mZnNldCBudW1iZXIgMjogQURDIGNoYW5uZWwgYW5kIG9mZnNldCBsZXZlbCB0byB3aGljaCB0aGUgb2Zmc2V0IHByb2dyYW1tZWQgd2lsbCBiZSBhcHBsaWVkIChpbmRlcGVuZGVudGx5IG9mIGNoYW5uZWwgbWFwcGVkIG9uIEFEQyBncm91cCByZWd1bGFyIG9yIGdyb3VwIGluamVjdGVkKSAqLworI2RlZmluZSBMTF9BRENfT0ZGU0VUXzMgICAgICAgICAgICAgICAgICAgIEFEQ19PRlIzX1JFR09GRlNFVCAvKiE8IEFEQyBvZmZzZXQgbnVtYmVyIDM6IEFEQyBjaGFubmVsIGFuZCBvZmZzZXQgbGV2ZWwgdG8gd2hpY2ggdGhlIG9mZnNldCBwcm9ncmFtbWVkIHdpbGwgYmUgYXBwbGllZCAoaW5kZXBlbmRlbnRseSBvZiBjaGFubmVsIG1hcHBlZCBvbiBBREMgZ3JvdXAgcmVndWxhciBvciBncm91cCBpbmplY3RlZCkgKi8KKyNkZWZpbmUgTExfQURDX09GRlNFVF80ICAgICAgICAgICAgICAgICAgICBBRENfT0ZSNF9SRUdPRkZTRVQgLyohPCBBREMgb2Zmc2V0IG51bWJlciA0OiBBREMgY2hhbm5lbCBhbmQgb2Zmc2V0IGxldmVsIHRvIHdoaWNoIHRoZSBvZmZzZXQgcHJvZ3JhbW1lZCB3aWxsIGJlIGFwcGxpZWQgKGluZGVwZW5kZW50bHkgb2YgY2hhbm5lbCBtYXBwZWQgb24gQURDIGdyb3VwIHJlZ3VsYXIgb3IgZ3JvdXAgaW5qZWN0ZWQpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19PRkZTRVRfU1RBVEUgQURDIGluc3RhbmNlIC0gT2Zmc2V0IHN0YXRlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX09GRlNFVF9ESVNBQkxFICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKS8qITwgQURDIG9mZnNldCBkaXNhYmxlZCAoYW1vbmcgQURDIHNlbGVjdGVkIG9mZnNldCBudW1iZXIgMSwgMiwgMyBvciA0KSAqLworI2RlZmluZSBMTF9BRENfT0ZGU0VUX0VOQUJMRSAgICAgICAgICAgICAgIChBRENfT0ZSMV9PRkZTRVQxX0VOKSAgLyohPCBBREMgb2Zmc2V0IGVuYWJsZWQgKGFtb25nIEFEQyBzZWxlY3RlZCBvZmZzZXQgbnVtYmVyIDEsIDIsIDMgb3IgNCkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0dST1VQUyAgQURDIGluc3RhbmNlIC0gR3JvdXBzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0dST1VQX1JFR1VMQVIgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDFVKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIChhdmFpbGFibGUgb24gYWxsIFNUTTMyIGRldmljZXMpICovCisjZGVmaW5lIExMX0FEQ19HUk9VUF9JTkpFQ1RFRCAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAyVSkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgKG5vdCBhdmFpbGFibGUgb24gYWxsIFNUTTMyIGRldmljZXMpKi8KKyNkZWZpbmUgTExfQURDX0dST1VQX1JFR1VMQVJfSU5KRUNURUQgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDNVKSAvKiE8IEFEQyBib3RoIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfQ0hBTk5FTCAgQURDIGluc3RhbmNlIC0gQ2hhbm5lbCBudW1iZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8wICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8wX05VTUJFUiAgfCBBRENfQ0hBTk5FTF8wX1NNUCAgfCBBRENfQ0hBTk5FTF8wX0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4wICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xX05VTUJFUiAgfCBBRENfQ0hBTk5FTF8xX1NNUCAgfCBBRENfQ0hBTk5FTF8xX0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8yX05VTUJFUiAgfCBBRENfQ0hBTk5FTF8yX1NNUCAgfCBBRENfQ0hBTk5FTF8yX0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4yICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8zICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8zX05VTUJFUiAgfCBBRENfQ0hBTk5FTF8zX1NNUCAgfCBBRENfQ0hBTk5FTF8zX0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4zICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF80ICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF80X05VTUJFUiAgfCBBRENfQ0hBTk5FTF80X1NNUCAgfCBBRENfQ0hBTk5FTF80X0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU40ICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF81X05VTUJFUiAgfCBBRENfQ0hBTk5FTF81X1NNUCAgfCBBRENfQ0hBTk5FTF81X0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU41ICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF82ICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF82X05VTUJFUiAgfCBBRENfQ0hBTk5FTF82X1NNUCAgfCBBRENfQ0hBTk5FTF82X0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU42ICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF83ICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF83X05VTUJFUiAgfCBBRENfQ0hBTk5FTF83X1NNUCAgfCBBRENfQ0hBTk5FTF83X0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU43ICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF84ICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF84X05VTUJFUiAgfCBBRENfQ0hBTk5FTF84X1NNUCAgfCBBRENfQ0hBTk5FTF84X0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU44ICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF85ICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF85X05VTUJFUiAgfCBBRENfQ0hBTk5FTF85X1NNUCAgfCBBRENfQ0hBTk5FTF85X0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU45ICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xMCAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xMF9OVU1CRVIgfCBBRENfQ0hBTk5FTF8xMF9TTVAgfCBBRENfQ0hBTk5FTF8xMF9CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xMCAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xMSAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xMV9OVU1CRVIgfCBBRENfQ0hBTk5FTF8xMV9TTVAgfCBBRENfQ0hBTk5FTF8xMV9CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xMSAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xMiAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xMl9OVU1CRVIgfCBBRENfQ0hBTk5FTF8xMl9TTVAgfCBBRENfQ0hBTk5FTF8xMl9CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xMiAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xMyAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xM19OVU1CRVIgfCBBRENfQ0hBTk5FTF8xM19TTVAgfCBBRENfQ0hBTk5FTF8xM19CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xMyAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xNCAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xNF9OVU1CRVIgfCBBRENfQ0hBTk5FTF8xNF9TTVAgfCBBRENfQ0hBTk5FTF8xNF9CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xNCAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xNSAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xNV9OVU1CRVIgfCBBRENfQ0hBTk5FTF8xNV9TTVAgfCBBRENfQ0hBTk5FTF8xNV9CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xNSAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xNiAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xNl9OVU1CRVIgfCBBRENfQ0hBTk5FTF8xNl9TTVAgfCBBRENfQ0hBTk5FTF8xNl9CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xNiAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xNyAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xN19OVU1CRVIgfCBBRENfQ0hBTk5FTF8xN19TTVAgfCBBRENfQ0hBTk5FTF8xN19CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xNyAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xOCAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xOF9OVU1CRVIgfCBBRENfQ0hBTk5FTF8xOF9TTVAgfCBBRENfQ0hBTk5FTF8xOF9CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xOCAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgICAgICAgIChMTF9BRENfQ0hBTk5FTF8xOCB8IEFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIKSAvKiE8IEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBWcmVmSW50OiBJbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZS4gT24gU1RNMzJGMywgQURDIGNoYW5uZWwgYXZhaWxhYmxlIG9ubHkgb24gYWxsIEFEQyBpbnN0YW5jZXMsIGJ1dCBvbmx5IG9uZSBBREMgaW5zdGFuY2UgaXMgYWxsb3dlZCB0byBiZSBjb25uZWN0ZWQgdG8gVnJlZkludCBhdCB0aGUgc2FtZSB0aW1lLiAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SICAgICAgICAgIChMTF9BRENfQ0hBTk5FTF8xNiB8IEFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIKSAvKiE8IEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBUZW1wZXJhdHVyZSBzZW5zb3IuIE9uIFNUTTMyRjMsIEFEQyBjaGFubmVsIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS4gKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfVkJBVCAgICAgICAgICAgICAgICAoTExfQURDX0NIQU5ORUxfMTcgfCBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSCkgLyohPCBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gVmJhdC8zOiBWYmF0IHZvbHRhZ2UgdGhyb3VnaCBhIGRpdmlkZXIgbGFkZGVyIG9mIGZhY3RvciAxLzMgdG8gaGF2ZSBWYmF0IGFsd2F5cyBiZWxvdyBWZGRhLiBPbiBTVE0zMkYzLCBBREMgY2hhbm5lbCBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzEuICovCisjaWYgZGVmaW5lZChPUEFNUDFfQ1NSX09QQU1QMUVOKQorI2RlZmluZSBMTF9BRENfQ0hBTk5FTF9WT1BBTVAxICAgICAgICAgICAgIChMTF9BRENfQ0hBTk5FTF8xNSB8IEFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIKSAvKiE8IEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBPUEFNUDEgb3V0cHV0LiBPbiBTVE0zMkYzLCBBREMgY2hhbm5lbCBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzEuICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKE9QQU1QMl9DU1JfT1BBTVAyRU4pCisjZGVmaW5lIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIgICAgICAgICAgICAgKExMX0FEQ19DSEFOTkVMXzE3IHwgQURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0ggfCBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSF8yKSAvKiE8IEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBPUEFNUDIgb3V0cHV0LiBPbiBTVE0zMkYzLCBBREMgY2hhbm5lbCBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzIuICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKE9QQU1QM19DU1JfT1BBTVAzRU4pCisjZGVmaW5lIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDMgICAgICAgICAgICAgKExMX0FEQ19DSEFOTkVMXzE3IHwgQURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0ggfCBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSF8yKSAvKiE8IEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBPUEFNUDMgb3V0cHV0LiBPbiBTVE0zMkYzLCBBREMgY2hhbm5lbCBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzMuICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKE9QQU1QNF9DU1JfT1BBTVA0RU4pCisjZGVmaW5lIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDQgICAgICAgICAgICAgKExMX0FEQ19DSEFOTkVMXzE3IHwgQURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0ggfCBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSF8yKSAvKiE8IEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBPUEFNUDQgb3V0cHV0LiBPbiBTVE0zMkYzLCBBREMgY2hhbm5lbCBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzQuICovCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX1JFR19UUklHR0VSX1NPVVJDRSAgQURDIGdyb3VwIHJlZ3VsYXIgLSBUcmlnZ2VyIHNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgaW50ZXJuYWw6IFNXIHN0YXJ0LiAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisvKiBBREMgZ3JvdXAgcmVndWxhciBleHRlcm5hbCB0cmlnZ2VycyBmb3IgQURDIGluc3RhbmNlczogQURDMSwgQURDMiAoZm9yICAgICAqLworLyogQURDIGluc3RhbmNlcyBBREN4IGF2YWlsYWJsZSBvbiB0aGUgc2VsZWN0ZWQgZGV2aWNlKSAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5vdGU6IExpdGVyYWwgd2l0aG91dCBzdWZmaXggIkFEQ3h5IiBtZWFucyB0aGF0IGV4dGVybmFsIHRyaWdnZXIgICAgICAgICAgICovCisvKiAgICAgICBpcyBhdmFpbGFibGUgb24gYWxsIEFEQyBpbnN0YW5jZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTm90ZTogRm9yIGRldmljZXMgU1RNMzJGMzAzeEUsIFNUTTMyRjM5OHh4OiBzb21lIHRyaWdnZXJzIHJlcXVpcmUgdG8gc2V0ICAgKi8KKy8qICAgICAgIHJlZ2lzdGVyIFNZU0NGR19DRkdSNC4gUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbC4gICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDFfQURDMTIgICAgKEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMSBjaGFubmVsIDEgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDJfQURDMTIgICAgKEFEQ19DRkdSX0VYVFNFTF8wIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMSBjaGFubmVsIDIgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDMgICAgICAgICAgKEFEQ19DRkdSX0VYVFNFTF8xIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMSBjaGFubmVsIDMgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDJfQURDMTIgICAgKEFEQ19DRkdSX0VYVFNFTF8xIHwgQURDX0NGR1JfRVhUU0VMXzAgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMiBjaGFubmVsIDIgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19UUkdPX0FEQzEyICAgKEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMyBUUkdPLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfQ0g0X0FEQzEyICAgIChBRENfQ0ZHUl9FWFRTRUxfMiB8IEFEQ19DRkdSX0VYVFNFTF8wIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTQgY2hhbm5lbCA0IGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX0VYVElfTElORTExX0FEQzEyIChBRENfQ0ZHUl9FWFRTRUxfMiB8IEFEQ19DRkdSX0VYVFNFTF8xIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IGV4dGVybmFsIGludGVycnVwdCBsaW5lIDExLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfVFJHT19BREMxMiAgIChBRENfQ0ZHUl9FWFRTRUxfMiB8IEFEQ19DRkdSX0VYVFNFTF8xIHwgQURDX0NGR1JfRVhUU0VMXzAgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTggVFJHTy4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU04X1RSR08yICAgICAgICAoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU04IFRSR08yLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfVFJHTyAgICAgICAgIChBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8wIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTEgVFJHTy4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08yICAgICAgICAoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMSB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0xIFRSR08yLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfVFJHT19BREMxMiAgIChBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8xIHwgQURDX0NGR1JfRVhUU0VMXzAgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTIgVFJHTy4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU00X1RSR08gICAgICAgICAoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMiB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU00IFRSR08uIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNNl9UUkdPX0FEQzEyICAgKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfQ0ZHUl9FWFRTRUxfMCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNNiBUUkdPLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTE1X1RSR08gICAgICAgIChBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX0NGR1JfRVhUU0VMXzEgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTE1IFRSR08uIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19DSDRfQURDMTIgICAgKEFEQ19DRkdSX0VYVFNFTCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMyBjaGFubmVsIDQgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkKKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9UUkcwX0FEQzEyICAoTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0yMCBUUkdPLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX1RSRzAyX0FEQzEyIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfQ0gyX0FEQzEyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTIwIFRSR08yLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX0NIMV9BREMxMiAgIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfQ0g0X0FEQzEyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTIwIGNoYW5uZWwgMSBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9DSDJfQURDMTIgICAoTExfQURDX1JFR19UUklHX0VYVF9USU02X1RSR09fQURDMTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0yMCBjaGFubmVsIDIgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjBfQ0gzX0FEQzEyICAgKExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19DSDRfQURDMTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMjAgY2hhbm5lbCAzIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2VuZGlmIC8qIFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4ICovCisKKy8qIEFEQyBncm91cCByZWd1bGFyIGV4dGVybmFsIHRyaWdnZXJzIGZvciBBREMgaW5zdGFuY2VzOiBBREMzLCBBREM0IChmb3IgICAgICovCisvKiBBREMgaW5zdGFuY2VzIEFEQ3ggYXZhaWxhYmxlIG9uIHRoZSBzZWxlY3RlZCBkZXZpY2UpICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTm90ZTogTGl0ZXJhbCB3aXRob3V0IHN1ZmZpeCAiQURDeHkiIG1lYW5zIHRoYXQgZXh0ZXJuYWwgdHJpZ2dlciAgICAgICAgICAgKi8KKy8qICAgICAgIGlzIGF2YWlsYWJsZSBvbiBhbGwgQURDIGluc3RhbmNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOb3RlOiBGb3IgZGV2aWNlcyBTVE0zMkYzMDN4RSwgU1RNMzJGMzk4eHg6IHNvbWUgdHJpZ2dlcnMgcmVxdWlyZSB0byBzZXQgICAqLworLyogICAgICAgcmVnaXN0ZXIgU1lTQ0ZHX0NGR1I0LiBSZWZlciB0byByZWZlcmVuY2UgbWFudWFsLiAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0zX0NIMV9BREMzNCAgICAoQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0zIGNoYW5uZWwgMSBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIM19BREMzNCAgICAoQURDX0NGR1JfRVhUU0VMXzAgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0yIGNoYW5uZWwgMyBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMyAgICAgICAgICAoQURDX0NGR1JfRVhUU0VMXzEgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0xIGNoYW5uZWwgMyBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU04X0NIMV9BREMzNCAgICAoQURDX0NGR1JfRVhUU0VMXzEgfCBBRENfQ0ZHUl9FWFRTRUxfMCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU04IGNoYW5uZWwgMSBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU04X1RSR09fX0FEQzM0ICAoQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU04IFRSR08uIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfRVhUSV9MSU5FMl9BREMzNCAgKEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX0NGR1JfRVhUU0VMXzAgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogZXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMi4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU00X0NIMV9BREMzNCAgICAoQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfQ0ZHUl9FWFRTRUxfMSB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU00IGNoYW5uZWwgMSBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0yX1RSR09fX0FEQzM0ICAoQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfQ0ZHUl9FWFRTRUxfMSB8IEFEQ19DRkdSX0VYVFNFTF8wIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0yIFRSR08uIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNOF9UUkdPMiAgICAgICAgKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNOCBUUkdPMi4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08gICAgICAgICAoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0xIFRSR08uIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9UUkdPMiAgICAgICAgKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzEgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMSBUUkdPMi4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0zX1RSR09fX0FEQzM0ICAoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMSB8IEFEQ19DRkdSX0VYVFNFTF8wIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0zIFRSR08uIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9UUkdPICAgICAgICAgKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNNCBUUkdPLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTdfVFJHT19BREMzNCAgIChBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX0NGR1JfRVhUU0VMXzAgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTcgVFJHTy4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0xNV9UUkdPICAgICAgICAoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMiB8IEFEQ19DRkdSX0VYVFNFTF8xIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0xNSBUUkdPLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfQ0gxX0FEQzM0ICAgIChBRENfQ0ZHUl9FWFRTRUwgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTIgQ0N4LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjBfVFJHMF9BREMzNCAgKExMX0FEQ19SRUdfVFJJR19FWFRfRVhUSV9MSU5FMl9BREMzNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMjAgVFJHTy4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9UUkcwMl9BREMzNCAoTExfQURDX1JFR19UUklHX0VYVF9USU00X0NIMV9BREMzNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0yMCBUUkdPMi4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9DSDFfQURDMzQgICAoTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMV9BREMzNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0yMCBjaGFubmVsIDEgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovICAgICAgICAgICAgICAKKyNlbmRpZiAvKiBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCAqLworCisjZWxpZiBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KQorI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gxICAgICAgICAgIChBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTEgY2hhbm5lbCAxIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gyICAgICAgICAgIChBRENfQ0ZHUl9FWFRTRUxfMCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTEgY2hhbm5lbCAyIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gzICAgICAgICAgIChBRENfQ0ZHUl9FWFRTRUxfMSB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTEgY2hhbm5lbCAzIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfQ0gyICAgICAgICAgIChBRENfQ0ZHUl9FWFRTRUxfMSB8IEFEQ19DRkdSX0VYVFNFTF8wIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTIgY2hhbm5lbCAyIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfVFJHTyAgICAgICAgIChBRENfQ0ZHUl9FWFRTRUxfMiB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTMgVFJHTy4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU00X0NINCAgICAgICAgICAoQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfQ0ZHUl9FWFRTRUxfMCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU00IGNoYW5uZWwgNCBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9FWFRJX0xJTkUxMSAgICAgICAoQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfQ0ZHUl9FWFRTRUxfMSB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAxMS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU04X1RSR08gICAgICAgICAoQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfQ0ZHUl9FWFRTRUxfMSB8IEFEQ19DRkdSX0VYVFNFTF8wIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU04IFRSR08uIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9UUkdPICAgICAgICAgKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzAgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMSBUUkdPLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfVFJHTzIgICAgICAgIChBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8xIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTEgVFJHTzIuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9UUkdPICAgICAgICAgKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzEgfCBBRENfQ0ZHUl9FWFRTRUxfMCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMiBUUkdPLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfVFJHTyAgICAgICAgIChBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTQgVFJHTy4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU02X1RSR08gICAgICAgICAoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMiB8IEFEQ19DRkdSX0VYVFNFTF8wIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU02IFRSR08uIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMTVfVFJHTyAgICAgICAgKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfQ0ZHUl9FWFRTRUxfMSB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMTUgVFJHTy4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0zX0NINCAgICAgICAgICAoQURDX0NGR1JfRVhUU0VMIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0zIGNoYW5uZWwgNCBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKworI2VsaWYgZGVmaW5lZChTVE0zMkYzMzR4OCkKKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMSAgICAgICAgICAoQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0xIGNoYW5uZWwgMSBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMiAgICAgICAgICAoQURDX0NGR1JfRVhUU0VMXzAgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0xIGNoYW5uZWwgMiBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMyAgICAgICAgICAoQURDX0NGR1JfRVhUU0VMXzEgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0xIGNoYW5uZWwgMyBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMiAgICAgICAgICAoQURDX0NGR1JfRVhUU0VMXzEgfCBBRENfQ0ZHUl9FWFRTRUxfMCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0yIGNoYW5uZWwgMiBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0zX1RSR08gICAgICAgICAoQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0zIFRSR08uIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfRVhUSV9MSU5FMTEgICAgICAgKEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX0NGR1JfRVhUU0VMXzEgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogZXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMTEuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHMSAgICAgICAgKEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX0NGR1JfRVhUU0VMXzEgfCBBRENfQ0ZHUl9FWFRTRUxfMCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogSFJUSU0gVFJHMS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkczICAgICAgICAoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBIUlRJTSBUUkczLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfVFJHTyAgICAgICAgIChBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8wIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTEgVFJHTy4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08yICAgICAgICAoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMSB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0xIFRSR08yLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfVFJHTyAgICAgICAgIChBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8xIHwgQURDX0NGR1JfRVhUU0VMXzAgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTIgVFJHTy4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU02X1RSR08gICAgICAgICAoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMiB8IEFEQ19DRkdSX0VYVFNFTF8wIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU02IFRSR08uIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMTVfVFJHTyAgICAgICAgKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfQ0ZHUl9FWFRTRUxfMSB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMTUgVFJHTy4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0zX0NINCAgICAgICAgICAoQURDX0NGR1JfRVhUU0VMIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0zIGNoYW5uZWwgNCBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKworI2VsaWYgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDJ4RSkKKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMSAgICAgICAgICAoQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0xIGNoYW5uZWwgMSBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMiAgICAgICAgICAoQURDX0NGR1JfRVhUU0VMXzAgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0xIGNoYW5uZWwgMiBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMyAgICAgICAgICAoQURDX0NGR1JfRVhUU0VMXzEgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0xIGNoYW5uZWwgMyBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMiAgICAgICAgICAoQURDX0NGR1JfRVhUU0VMXzEgfCBBRENfQ0ZHUl9FWFRTRUxfMCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0yIGNoYW5uZWwgMiBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0zX1RSR08gICAgICAgICAoQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0zIFRSR08uIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9DSDQgICAgICAgICAgKEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX0NGR1JfRVhUU0VMXzAgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNNCBjaGFubmVsIDQgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfRVhUSV9MSU5FMTEgICAgICAgKEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX0NGR1JfRVhUU0VMXzEgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogZXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMTEuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9UUkdPICAgICAgICAgKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzAgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMSBUUkdPLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfVFJHTzIgICAgICAgIChBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8xIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTEgVFJHTzIuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9UUkdPICAgICAgICAgKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzEgfCBBRENfQ0ZHUl9FWFRTRUxfMCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMiBUUkdPLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfVFJHTyAgICAgICAgIChBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTQgVFJHTy4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU02X1RSR08gICAgICAgICAoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMiB8IEFEQ19DRkdSX0VYVFNFTF8wIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU02IFRSR08uIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMTVfVFJHTyAgICAgICAgKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfQ0ZHUl9FWFRTRUxfMSB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMTUgVFJHTy4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0zX0NINCAgICAgICAgICAoQURDX0NGR1JfRVhUU0VMIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0zIGNoYW5uZWwgNCBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKworI2VsaWYgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMSAgICAgICAgICAoQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0xIGNoYW5uZWwgMSBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMiAgICAgICAgICAoQURDX0NGR1JfRVhUU0VMXzAgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0xIGNoYW5uZWwgMiBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMyAgICAgICAgICAoQURDX0NGR1JfRVhUU0VMXzEgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0xIGNoYW5uZWwgMyBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9FWFRJX0xJTkUxMSAgICAgICAoQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfQ0ZHUl9FWFRTRUxfMSB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAxMS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08gICAgICAgICAoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0xIFRSR08uIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9UUkdPMiAgICAgICAgKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzEgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMSBUUkdPMi4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0yX1RSR08gICAgICAgICAoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMSB8IEFEQ19DRkdSX0VYVFNFTF8wIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0yIFRSR08uIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNNl9UUkdPICAgICAgICAgKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfQ0ZHUl9FWFRTRUxfMCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNNiBUUkdPLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTE1X1RSR08gICAgICAgIChBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX0NGR1JfRVhUU0VMXzEgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTE1IFRSR08uIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX1JFR19UUklHR0VSX0VER0UgIEFEQyBncm91cCByZWd1bGFyIC0gVHJpZ2dlciBlZGdlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9SSVNJTkcgICAgICAgICAoICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0VYVEVOXzApICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgcG9sYXJpdHkgc2V0IHRvIHJpc2luZyBlZGdlICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfRkFMTElORyAgICAgICAgKEFEQ19DRkdSX0VYVEVOXzEgICAgICAgICAgICAgICAgICAgKSAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIHBvbGFyaXR5IHNldCB0byBmYWxsaW5nIGVkZ2UgKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9SSVNJTkdGQUxMSU5HICAoQURDX0NGR1JfRVhURU5fMSB8IEFEQ19DRkdSX0VYVEVOXzApICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgcG9sYXJpdHkgc2V0IHRvIGJvdGggcmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2VzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdfQ09OVElOVU9VU19NT0RFICBBREMgZ3JvdXAgcmVndWxhciAtIENvbnRpbnVvdXMgbW9kZQorKiBAeworKi8KKyNkZWZpbmUgTExfQURDX1JFR19DT05WX1NJTkdMRSAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IEFEQyBjb252ZXJzaW9ucyBhcmUgcGVyZm9ybWVkIGluIHNpbmdsZSBtb2RlOiBvbmUgY29udmVyc2lvbiBwZXIgdHJpZ2dlciAqLworI2RlZmluZSBMTF9BRENfUkVHX0NPTlZfQ09OVElOVU9VUyAgICAgICAgIChBRENfQ0ZHUl9DT05UKSAgICAgICAgIC8qITwgQURDIGNvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQgaW4gY29udGludW91cyBtb2RlOiBhZnRlciB0aGUgZmlyc3QgdHJpZ2dlciwgZm9sbG93aW5nIGNvbnZlcnNpb25zIGxhdW5jaGVkIHN1Y2Nlc3NpdmVseSBhdXRvbWF0aWNhbGx5ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdfRE1BX1RSQU5TRkVSICBBREMgZ3JvdXAgcmVndWxhciAtIERNQSB0cmFuc2ZlciBvZiBBREMgY29udmVyc2lvbiBkYXRhCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX1JFR19ETUFfVFJBTlNGRVJfTk9ORSAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgLyohPCBBREMgY29udmVyc2lvbnMgYXJlIG5vdCB0cmFuc2ZlcnJlZCBieSBETUEgKi8KKyNkZWZpbmUgTExfQURDX1JFR19ETUFfVFJBTlNGRVJfTElNSVRFRCAgICAoICAgICAgICAgICAgICAgICAgQURDX0NGR1JfRE1BRU4pICAgLyohPCBBREMgY29udmVyc2lvbiBkYXRhIGFyZSB0cmFuc2ZlcnJlZCBieSBETUEsIGluIGxpbWl0ZWQgbW9kZSAob25lIHNob3QgbW9kZSk6IERNQSB0cmFuc2ZlciByZXF1ZXN0cyBhcmUgc3RvcHBlZCB3aGVuIG51bWJlciBvZiBETUEgZGF0YSB0cmFuc2ZlcnMgKG51bWJlciBvZiBBREMgY29udmVyc2lvbnMpIGlzIHJlYWNoZWQuIFRoaXMgQURDIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIERNQSBtb2RlIG5vbi1jaXJjdWxhci4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19ETUFfVFJBTlNGRVJfVU5MSU1JVEVEICAoQURDX0NGR1JfRE1BQ0ZHIHwgQURDX0NGR1JfRE1BRU4pICAgLyohPCBBREMgY29udmVyc2lvbiBkYXRhIGFyZSB0cmFuc2ZlcnJlZCBieSBETUEsIGluIHVubGltaXRlZCBtb2RlOiBETUEgdHJhbnNmZXIgcmVxdWVzdHMgYXJlIHVubGltaXRlZCwgd2hhdGV2ZXIgbnVtYmVyIG9mIERNQSBkYXRhIHRyYW5zZmVycmVkIChudW1iZXIgb2YgQURDIGNvbnZlcnNpb25zKS4gVGhpcyBBREMgbW9kZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggRE1BIG1vZGUgY2lyY3VsYXIuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdfT1ZSX0RBVEFfQkVIQVZJT1IgIEFEQyBncm91cCByZWd1bGFyIC0gT3ZlcnJ1biBiZWhhdmlvciBvbiBjb252ZXJzaW9uIGRhdGEKKyogQHsKKyovCisjZGVmaW5lIExMX0FEQ19SRUdfT1ZSX0RBVEFfUFJFU0VSVkVEICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkvKiE8IEFEQyBncm91cCByZWd1bGFyIGJlaGF2aW9yIGluIGNhc2Ugb2Ygb3ZlcnJ1bjogZGF0YSBwcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTExfQURDX1JFR19PVlJfREFUQV9PVkVSV1JJVFRFTiAgICAoQURDX0NGR1JfT1ZSTU9EKSAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgYmVoYXZpb3IgaW4gY2FzZSBvZiBvdmVycnVuOiBkYXRhIG92ZXJ3cml0dGVuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdfU0VRX1NDQU5fTEVOR1RIICBBREMgZ3JvdXAgcmVndWxhciAtIFNlcXVlbmNlciBzY2FuIGxlbmd0aAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRElTQUJMRSAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZGlzYWJsZSAoZXF1aXZhbGVudCB0byBzZXF1ZW5jZXIgb2YgMSByYW5rOiBBREMgY29udmVyc2lvbiBvbiBvbmx5IDEgY2hhbm5lbCkgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMlJBTktTICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NRUjFfTF8wKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBlbmFibGUgd2l0aCAyIHJhbmtzIGluIHRoZSBzZXF1ZW5jZSAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8zUkFOS1MgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU1FSMV9MXzEgICAgICAgICAgICAgICApIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGVuYWJsZSB3aXRoIDMgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzRSQU5LUyAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19TUVIxX0xfMSB8IEFEQ19TUVIxX0xfMCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggNCByYW5rcyBpbiB0aGUgc2VxdWVuY2UgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfNVJBTktTICAoICAgICAgICAgICAgICAgQURDX1NRUjFfTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBlbmFibGUgd2l0aCA1IHJhbmtzIGluIHRoZSBzZXF1ZW5jZSAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV82UkFOS1MgICggICAgICAgICAgICAgICBBRENfU1FSMV9MXzIgICAgICAgICAgICAgICAgfCBBRENfU1FSMV9MXzApIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGVuYWJsZSB3aXRoIDYgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzdSQU5LUyAgKCAgICAgICAgICAgICAgIEFEQ19TUVIxX0xfMiB8IEFEQ19TUVIxX0xfMSAgICAgICAgICAgICAgICkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggNyByYW5rcyBpbiB0aGUgc2VxdWVuY2UgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfOFJBTktTICAoICAgICAgICAgICAgICAgQURDX1NRUjFfTF8yIHwgQURDX1NRUjFfTF8xIHwgQURDX1NRUjFfTF8wKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBlbmFibGUgd2l0aCA4IHJhbmtzIGluIHRoZSBzZXF1ZW5jZSAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV85UkFOS1MgIChBRENfU1FSMV9MXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGVuYWJsZSB3aXRoIDkgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzEwUkFOS1MgKEFEQ19TUVIxX0xfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFEQ19TUVIxX0xfMCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMTAgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzExUkFOS1MgKEFEQ19TUVIxX0xfMyAgICAgICAgICAgICAgICB8IEFEQ19TUVIxX0xfMSAgICAgICAgICAgICAgICkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMTEgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzEyUkFOS1MgKEFEQ19TUVIxX0xfMyAgICAgICAgICAgICAgICB8IEFEQ19TUVIxX0xfMSB8IEFEQ19TUVIxX0xfMCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMTIgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzEzUkFOS1MgKEFEQ19TUVIxX0xfMyB8IEFEQ19TUVIxX0xfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMTMgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzE0UkFOS1MgKEFEQ19TUVIxX0xfMyB8IEFEQ19TUVIxX0xfMiAgICAgICAgICAgICAgICB8IEFEQ19TUVIxX0xfMCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMTQgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzE1UkFOS1MgKEFEQ19TUVIxX0xfMyB8IEFEQ19TUVIxX0xfMiB8IEFEQ19TUVIxX0xfMSAgICAgICAgICAgICAgICkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMTUgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzE2UkFOS1MgKEFEQ19TUVIxX0xfMyB8IEFEQ19TUVIxX0xfMiB8IEFEQ19TUVIxX0xfMSB8IEFEQ19TUVIxX0xfMCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMTYgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdfU0VRX0RJU0NPTlRfTU9ERSAgQURDIGdyb3VwIHJlZ3VsYXIgLSBTZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfRElTQ09OVF9ESVNBQkxFICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUgZGlzYWJsZSAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzFSQU5LICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9ESVNDRU4pIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZSBlbmFibGUgd2l0aCBzZXF1ZW5jZSBpbnRlcnJ1cHRpb24gZXZlcnkgcmFuayAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzJSQU5LUyAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9ESVNDTlVNXzAgfCBBRENfQ0ZHUl9ESVNDRU4pIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZSBlbmFibGVkIHdpdGggc2VxdWVuY2UgaW50ZXJydXB0aW9uIGV2ZXJ5IDIgcmFua3MgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfRElTQ09OVF8zUkFOS1MgICAgICAoICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfRElTQ05VTV8xICAgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfRElTQ0VOKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUgZW5hYmxlIHdpdGggc2VxdWVuY2UgaW50ZXJydXB0aW9uIGV2ZXJ5IDMgcmFua3MgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfRElTQ09OVF80UkFOS1MgICAgICAoICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfRElTQ05VTV8xIHwgQURDX0NGR1JfRElTQ05VTV8wIHwgQURDX0NGR1JfRElTQ0VOKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUgZW5hYmxlIHdpdGggc2VxdWVuY2UgaW50ZXJydXB0aW9uIGV2ZXJ5IDQgcmFua3MgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfRElTQ09OVF81UkFOS1MgICAgICAoQURDX0NGR1JfRElTQ05VTV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfRElTQ0VOKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUgZW5hYmxlIHdpdGggc2VxdWVuY2UgaW50ZXJydXB0aW9uIGV2ZXJ5IDUgcmFua3MgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfRElTQ09OVF82UkFOS1MgICAgICAoQURDX0NGR1JfRElTQ05VTV8yICAgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfRElTQ05VTV8wIHwgQURDX0NGR1JfRElTQ0VOKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUgZW5hYmxlIHdpdGggc2VxdWVuY2UgaW50ZXJydXB0aW9uIGV2ZXJ5IDYgcmFua3MgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfRElTQ09OVF83UkFOS1MgICAgICAoQURDX0NGR1JfRElTQ05VTV8yIHwgQURDX0NGR1JfRElTQ05VTV8xICAgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfRElTQ0VOKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUgZW5hYmxlIHdpdGggc2VxdWVuY2UgaW50ZXJydXB0aW9uIGV2ZXJ5IDcgcmFua3MgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfRElTQ09OVF84UkFOS1MgICAgICAoQURDX0NGR1JfRElTQ05VTV8yIHwgQURDX0NGR1JfRElTQ05VTV8xIHwgQURDX0NGR1JfRElTQ05VTV8wIHwgQURDX0NGR1JfRElTQ0VOKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUgZW5hYmxlIHdpdGggc2VxdWVuY2UgaW50ZXJydXB0aW9uIGV2ZXJ5IDggcmFua3MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX1JFR19TRVFfUkFOS1MgIEFEQyBncm91cCByZWd1bGFyIC0gU2VxdWVuY2VyIHJhbmtzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX1JFR19SQU5LXzEgICAgICAgICAgICAgICAgICAoQURDX1NRUjFfUkVHT0ZGU0VUIHwgQURDX1JFR19SQU5LXzFfU1FSWF9CSVRPRkZTRVRfUE9TKSAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAxICovCisjZGVmaW5lIExMX0FEQ19SRUdfUkFOS18yICAgICAgICAgICAgICAgICAgKEFEQ19TUVIxX1JFR09GRlNFVCB8IEFEQ19SRUdfUkFOS18yX1NRUlhfQklUT0ZGU0VUX1BPUykgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMiAqLworI2RlZmluZSBMTF9BRENfUkVHX1JBTktfMyAgICAgICAgICAgICAgICAgIChBRENfU1FSMV9SRUdPRkZTRVQgfCBBRENfUkVHX1JBTktfM19TUVJYX0JJVE9GRlNFVF9QT1MpICAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIDMgKi8KKyNkZWZpbmUgTExfQURDX1JFR19SQU5LXzQgICAgICAgICAgICAgICAgICAoQURDX1NRUjFfUkVHT0ZGU0VUIHwgQURDX1JFR19SQU5LXzRfU1FSWF9CSVRPRkZTRVRfUE9TKSAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayA0ICovCisjZGVmaW5lIExMX0FEQ19SRUdfUkFOS181ICAgICAgICAgICAgICAgICAgKEFEQ19TUVIyX1JFR09GRlNFVCB8IEFEQ19SRUdfUkFOS181X1NRUlhfQklUT0ZGU0VUX1BPUykgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgNSAqLworI2RlZmluZSBMTF9BRENfUkVHX1JBTktfNiAgICAgICAgICAgICAgICAgIChBRENfU1FSMl9SRUdPRkZTRVQgfCBBRENfUkVHX1JBTktfNl9TUVJYX0JJVE9GRlNFVF9QT1MpICAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIDYgKi8KKyNkZWZpbmUgTExfQURDX1JFR19SQU5LXzcgICAgICAgICAgICAgICAgICAoQURDX1NRUjJfUkVHT0ZGU0VUIHwgQURDX1JFR19SQU5LXzdfU1FSWF9CSVRPRkZTRVRfUE9TKSAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayA3ICovCisjZGVmaW5lIExMX0FEQ19SRUdfUkFOS184ICAgICAgICAgICAgICAgICAgKEFEQ19TUVIyX1JFR09GRlNFVCB8IEFEQ19SRUdfUkFOS184X1NRUlhfQklUT0ZGU0VUX1BPUykgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgOCAqLworI2RlZmluZSBMTF9BRENfUkVHX1JBTktfOSAgICAgICAgICAgICAgICAgIChBRENfU1FSMl9SRUdPRkZTRVQgfCBBRENfUkVHX1JBTktfOV9TUVJYX0JJVE9GRlNFVF9QT1MpICAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIDkgKi8KKyNkZWZpbmUgTExfQURDX1JFR19SQU5LXzEwICAgICAgICAgICAgICAgICAoQURDX1NRUjNfUkVHT0ZGU0VUIHwgQURDX1JFR19SQU5LXzEwX1NRUlhfQklUT0ZGU0VUX1BPUykgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAxMCAqLworI2RlZmluZSBMTF9BRENfUkVHX1JBTktfMTEgICAgICAgICAgICAgICAgIChBRENfU1FSM19SRUdPRkZTRVQgfCBBRENfUkVHX1JBTktfMTFfU1FSWF9CSVRPRkZTRVRfUE9TKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIDExICovCisjZGVmaW5lIExMX0FEQ19SRUdfUkFOS18xMiAgICAgICAgICAgICAgICAgKEFEQ19TUVIzX1JFR09GRlNFVCB8IEFEQ19SRUdfUkFOS18xMl9TUVJYX0JJVE9GRlNFVF9QT1MpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMTIgKi8KKyNkZWZpbmUgTExfQURDX1JFR19SQU5LXzEzICAgICAgICAgICAgICAgICAoQURDX1NRUjNfUkVHT0ZGU0VUIHwgQURDX1JFR19SQU5LXzEzX1NRUlhfQklUT0ZGU0VUX1BPUykgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAxMyAqLworI2RlZmluZSBMTF9BRENfUkVHX1JBTktfMTQgICAgICAgICAgICAgICAgIChBRENfU1FSM19SRUdPRkZTRVQgfCBBRENfUkVHX1JBTktfMTRfU1FSWF9CSVRPRkZTRVRfUE9TKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIDE0ICovCisjZGVmaW5lIExMX0FEQ19SRUdfUkFOS18xNSAgICAgICAgICAgICAgICAgKEFEQ19TUVI0X1JFR09GRlNFVCB8IEFEQ19SRUdfUkFOS18xNV9TUVJYX0JJVE9GRlNFVF9QT1MpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMTUgKi8KKyNkZWZpbmUgTExfQURDX1JFR19SQU5LXzE2ICAgICAgICAgICAgICAgICAoQURDX1NRUjRfUkVHT0ZGU0VUIHwgQURDX1JFR19SQU5LXzE2X1NRUlhfQklUT0ZGU0VUX1BPUykgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAxNiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfSU5KX1RSSUdHRVJfU09VUkNFICBBREMgZ3JvdXAgaW5qZWN0ZWQgLSBUcmlnZ2VyIHNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19TT0ZUV0FSRSAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgaW50ZXJuYWw6IFNXIHN0YXJ0Li4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KQorLyogQURDIGdyb3VwIGluamVjdGVkIGV4dGVybmFsIHRyaWdnZXJzIGZvciBBREMgaW5zdGFuY2VzOiBBREMxLCBBREMyIChmb3IgICAgKi8KKy8qIEFEQyBpbnN0YW5jZXMgQURDeCBhdmFpbGFibGUgb24gdGhlIHNlbGVjdGVkIGRldmljZSkgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOb3RlOiBMaXRlcmFsIHdpdGhvdXQgc3VmZml4ICJBREN4eSIgbWVhbnMgdGhhdCBleHRlcm5hbCB0cmlnZ2VyICAgICAgICAgICAqLworLyogICAgICAgaXMgYXZhaWxhYmxlIG9uIGFsbCBBREMgaW5zdGFuY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5vdGU6IEZvciBkZXZpY2VzIFNUTTMyRjMwM3hFLCBTVE0zMkYzOTh4eDogc29tZSB0cmlnZ2VycyByZXF1aXJlIHRvIHNldCAgICovCisvKiAgICAgICByZWdpc3RlciBTWVNDRkdfQ0ZHUjQuIFJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwuICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfVFJHTyAgICAgICAgIChBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTEgVFJHMC4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0xX0NINCAgICAgICAgICAoQURDX0pTUVJfSkVYVFNFTF8wIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0xIGNoYW5uZWwgNCBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0yX1RSR09fQURDMTIgICAoQURDX0pTUVJfSkVYVFNFTF8xIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0yIFRSRzAuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9DSDFfQURDMTIgICAgKEFEQ19KU1FSX0pFWFRTRUxfMSB8IEFEQ19KU1FSX0pFWFRTRUxfMCB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMiBjaGFubmVsIDEgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDRfQURDMTIgICAgKEFEQ19KU1FSX0pFWFRTRUxfMiB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMyBjaGFubmVsIDQgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9UUkdPX0FEQzEyICAgKEFEQ19KU1FSX0pFWFRTRUxfMiB8IEFEQ19KU1FSX0pFWFRTRUxfMCB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNNCBUUkcwLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX0VYVElfTElORTE1X0FEQzEyIChBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSlNRUl9KRVhUU0VMXzEgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IGV4dGVybmFsIGludGVycnVwdCBsaW5lIDE1LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfQ0g0X0FEQzEyICAgIChBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSlNRUl9KRVhUU0VMXzEgfCBBRENfSlNRUl9KRVhUU0VMXzAgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTggY2hhbm5lbCA0IGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfVFJHTzIgICAgICAgIChBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTEgVFJHMDIuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9UUkdPICAgICAgICAgKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMCB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNOCBUUkcwLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfVFJHTzIgICAgICAgIChBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSlNRUl9KRVhUU0VMXzEgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTggVFJHMDIuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDNfQURDMTIgICAgKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMSB8IEFEQ19KU1FSX0pFWFRTRUxfMCB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMyBjaGFubmVsIDMgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19UUkdPICAgICAgICAgKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMiB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMyBUUkcwLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0gxX0FEQzEyICAgIChBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSlNRUl9KRVhUU0VMXzAgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTMgY2hhbm5lbCAxIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTZfVFJHT19BREMxMiAgIChBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSlNRUl9KRVhUU0VMXzEgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTYgVFJHMC4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0xNV9UUkdPICAgICAgICAoQURDX0pTUVJfSkVYVFNFTCB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0xNSBUUkcwLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfVFJHT19BREMxMiAgKExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9DSDFfQURDMTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMjAgVFJHMC4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9UUkdPMl9BREMxMiAoTExfQURDX0lOSl9UUklHX0VYVF9FWFRJX0xJTkUxNV9BREMxMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0yMCBUUkcwMi4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9DSDRfQURDMTIgICAoTExfQURDX0lOSl9UUklHX0VYVF9USU0yX0NIMV9BREMxMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0yMCBjaGFubmVsIDQgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZW5kaWYgLyogU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggKi8KKworLyogQURDIGdyb3VwIGluamVjdGVkIGV4dGVybmFsIHRyaWdnZXJzIGZvciBBREMgaW5zdGFuY2VzOiBBREMzLCBBREM0IChmb3IgICAgKi8KKy8qIEFEQyBpbnN0YW5jZXMgQURDeCBhdmFpbGFibGUgb24gdGhlIHNlbGVjdGVkIGRldmljZSkgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOb3RlOiBMaXRlcmFsIHdpdGhvdXQgc3VmZml4ICJBREN4eSIgbWVhbnMgdGhhdCBleHRlcm5hbCB0cmlnZ2VyICAgICAgICAgICAqLworLyogICAgICAgaXMgYXZhaWxhYmxlIG9uIGFsbCBBREMgaW5zdGFuY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5vdGU6IEV4dGVybmFsIHRyaWdnZXJzIEpFWFQyIGFuZCBKRVhUNSBhcmUgdGhlIHNhbWUgKFRJTTRfQ0gzIGV2ZW50KS4gICAgICovCisvKiAgICAgICBKRVhUMiBpcyB0aGUgbWFpbiB0cmlnZ2VyLCBKRVhUNSBpcyBrZXB0IGFzIHNwYXJlIHRyaWdnZXIgZm9yICAgICAgICAqLworLyogICAgICAgZnV0dXJlIGRldmljZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5vdGU6IEZvciBkZXZpY2VzIFNUTTMyRjMwM3hFLCBTVE0zMkYzOTh4eDogc29tZSB0cmlnZ2VycyByZXF1aXJlIHRvIHNldCAgICovCisvKiAgICAgICByZWdpc3RlciBTWVNDRkdfQ0ZHUjQuIFJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwuICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfVFJHTyAgICAgICAgIChBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTEgVFJHMC4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0xX0NINCAgICAgICAgICAoQURDX0pTUVJfSkVYVFNFTF8wIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0xIGNoYW5uZWwgNCBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU00X0NIM19BREMzNCAgICAoQURDX0pTUVJfSkVYVFNFTF8xIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU00IGNoYW5uZWwgMyBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NIMl9BREMzNCAgICAoQURDX0pTUVJfSkVYVFNFTF8xIHwgQURDX0pTUVJfSkVYVFNFTF8wIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU04IGNoYW5uZWwgMiBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NINF9fQURDMzQgICAoQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU04IGNoYW5uZWwgNCBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU00X0NINF9BREMzNCAgICAoQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8xIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU00IGNoYW5uZWwgNCBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU00X1RSR09fX0FEQzM0ICAoQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8xIHwgQURDX0pTUVJfSkVYVFNFTF8wIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU00IFRSRzAuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPMiAgICAgICAgKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMSBUUkcwMi4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU04X1RSR08gICAgICAgICAoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8wIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU04IFRSRzAuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9UUkdPMiAgICAgICAgKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMSB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNOCBUUkcwMi4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0xX0NIM19BREMzNCAgICAoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8xIHwgQURDX0pTUVJfSkVYVFNFTF8wIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0xIGNoYW5uZWwgMyBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0zX1RSR08gICAgICAgICAoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0zIFRSRzAuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9UUkdPX19BREMzNCAgKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMiB8IEFEQ19KU1FSX0pFWFRTRUxfMCB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMiBUUkcwLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTdfVFJHT19BREMzNCAgIChBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSlNRUl9KRVhUU0VMXzEgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTcgVFJHMC4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0xNV9UUkdPICAgICAgICAoQURDX0pTUVJfSkVYVFNFTCB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0xNSBUUkcwLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfVFJHX0FEQzM0ICAgKEFEQ19KU1FSX0pFWFRTRUxfMiB8IEFEQ19KU1FSX0pFWFRTRUxfMCB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMjAgVFJHMC4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9UUkcyX0FEQzM0ICAoTExfQURDX0lOSl9UUklHX0VYVF9USU0xX0NIM19BREMzNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0yMCBUUkcwMi4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9DSDIgICAgICAgICAoTExfQURDX0lOSl9UUklHX0VYVF9USU0xNV9UUkdPKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0yMCBjaGFubmVsIDIgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZW5kaWYgLyogU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggKi8KKworI2VsaWYgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkKKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0xX1RSR08gICAgICAgICAoQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0xIFRSRzAuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9DSDQgICAgICAgICAgKEFEQ19KU1FSX0pFWFRTRUxfMCB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMSBjaGFubmVsIDQgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9UUkdPICAgICAgICAgKEFEQ19KU1FSX0pFWFRTRUxfMSB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMiBUUkcwLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfQ0gxICAgICAgICAgIChBRENfSlNRUl9KRVhUU0VMXzEgfCBBRENfSlNRUl9KRVhUU0VMXzAgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTIgY2hhbm5lbCAxIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0g0ICAgICAgICAgIChBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTMgY2hhbm5lbCA0IGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTRfVFJHTyAgICAgICAgIChBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSlNRUl9KRVhUU0VMXzAgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTQgVFJHMC4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9FWFRJX0xJTkUxNSAgICAgICAoQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8xIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAxNS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NINCAgICAgICAgICAoQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8xIHwgQURDX0pTUVJfSkVYVFNFTF8wIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU04IGNoYW5uZWwgNCBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0xX1RSR08yICAgICAgICAoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0xIFRSRzAyLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfVFJHTyAgICAgICAgIChBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSlNRUl9KRVhUU0VMXzAgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTggVFJHMC4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU04X1RSR08yICAgICAgICAoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8xIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU04IFRSRzAyLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0gzICAgICAgICAgIChBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSlNRUl9KRVhUU0VMXzEgfCBBRENfSlNRUl9KRVhUU0VMXzAgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTMgY2hhbm5lbCAzIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfVFJHTyAgICAgICAgIChBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTMgVFJHMC4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NIMSAgICAgICAgICAoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8wIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0zIGNoYW5uZWwgMSBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU02X1RSR08gICAgICAgICAoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8xIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU02IFRSRzAuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMTVfVFJHTyAgICAgICAgKEFEQ19KU1FSX0pFWFRTRUwgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMTUgVFJHMC4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKworI2VsaWYgZGVmaW5lZChTVE0zMkYzMzR4OCkKKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0xX1RSR08gICAgICAgICAoQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0xIFRSRzAuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9DSDQgICAgICAgICAgKEFEQ19KU1FSX0pFWFRTRUxfMCB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMSBjaGFubmVsIDQgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9UUkdPICAgICAgICAgKEFEQ19KU1FSX0pFWFRTRUxfMSB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMiBUUkcwLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfQ0gxICAgICAgICAgIChBRENfSlNRUl9KRVhUU0VMXzEgfCBBRENfSlNRUl9KRVhUU0VMXzAgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTIgY2hhbm5lbCAxIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0g0ICAgICAgICAgIChBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTMgY2hhbm5lbCA0IGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX0VYVElfTElORTE1ICAgICAgIChBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSlNRUl9KRVhUU0VMXzEgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IGV4dGVybmFsIGludGVycnVwdCBsaW5lIDE1LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfVFJHTzIgICAgICAgIChBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTEgVFJHMDIuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHMiAgICAgICAgKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMCB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogSFJUSU0gVFJHMi4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkc0ICAgICAgICAoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8xIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBIUlRJTSBUUkc0LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0gzICAgICAgICAgIChBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSlNRUl9KRVhUU0VMXzEgfCBBRENfSlNRUl9KRVhUU0VMXzAgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTMgY2hhbm5lbCAzIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfVFJHTyAgICAgICAgIChBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTMgVFJHMC4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NIMSAgICAgICAgICAoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8wIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0zIGNoYW5uZWwgMSBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU02X1RSR08gICAgICAgICAoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8xIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU02IFRSRzAuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMTVfVFJHTyAgICAgICAgKEFEQ19KU1FSX0pFWFRTRUwgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMTUgVFJHMC4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKworI2VsaWYgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDJ4RSkKKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0xX1RSR08gICAgICAgICAoQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0xIFRSRzAuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9DSDQgICAgICAgICAgKEFEQ19KU1FSX0pFWFRTRUxfMCB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMSBjaGFubmVsIDQgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9UUkdPICAgICAgICAgKEFEQ19KU1FSX0pFWFRTRUxfMSB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMiBUUkcwLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfQ0gxICAgICAgICAgIChBRENfSlNRUl9KRVhUU0VMXzEgfCBBRENfSlNRUl9KRVhUU0VMXzAgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTIgY2hhbm5lbCAxIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0g0ICAgICAgICAgIChBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTMgY2hhbm5lbCA0IGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTRfVFJHTyAgICAgICAgIChBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSlNRUl9KRVhUU0VMXzAgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTQgVFJHMC4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9FWFRJX0xJTkUxNSAgICAgICAoQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8xIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAxNS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0xX1RSR08yICAgICAgICAoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0xIFRSRzAyLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0gzICAgICAgICAgIChBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSlNRUl9KRVhUU0VMXzEgfCBBRENfSlNRUl9KRVhUU0VMXzAgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTMgY2hhbm5lbCAzIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfVFJHTyAgICAgICAgIChBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTMgVFJHMC4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NIMSAgICAgICAgICAoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8wIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0zIGNoYW5uZWwgMSBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU02X1RSR08gICAgICAgICAoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8xIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU02IFRSRzAuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMTVfVFJHTyAgICAgICAgKEFEQ19KU1FSX0pFWFRTRUwgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMTUgVFJHMC4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKworI2VsaWYgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0xX1RSR08gICAgICAgICAoQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0xIFRSRzAuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9DSDQgICAgICAgICAgKEFEQ19KU1FSX0pFWFRTRUxfMCB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMSBjaGFubmVsIDQgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfRVhUSV9MSU5FMTUgICAgICAgKEFEQ19KU1FSX0pFWFRTRUxfMiB8IEFEQ19KU1FSX0pFWFRTRUxfMSB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogZXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMTUuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPMiAgICAgICAgKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMSBUUkcwMi4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU02X1RSR08gICAgICAgICAoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8xIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU02IFRSRzAuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMTVfVFJHTyAgICAgICAgKEFEQ19KU1FSX0pFWFRTRUwgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMTUgVFJHMC4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfSU5KX1RSSUdHRVJfRURHRSAgQURDIGdyb3VwIGluamVjdGVkIC0gVHJpZ2dlciBlZGdlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9SSVNJTkcgICAgICAgICAoICAgICAgICAgICAgICAgICAgICBBRENfSlNRUl9KRVhURU5fMCkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIHBvbGFyaXR5IHNldCB0byByaXNpbmcgZWRnZSAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX0ZBTExJTkcgICAgICAgIChBRENfSlNRUl9KRVhURU5fMSAgICAgICAgICAgICAgICAgICAgKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgcG9sYXJpdHkgc2V0IHRvIGZhbGxpbmcgZWRnZSAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1JJU0lOR0ZBTExJTkcgIChBRENfSlNRUl9KRVhURU5fMSB8IEFEQ19KU1FSX0pFWFRFTl8wKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgcG9sYXJpdHkgc2V0IHRvIGJvdGggcmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2VzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19JTkpfVFJJR19BVVRPICBBREMgZ3JvdXAgaW5qZWN0ZWQgLSBBdXRvbWF0aWMgdHJpZ2dlciBtb2RlCisqIEB7CisqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfSU5ERVBFTkRFTlQgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGluZGVwZW5kZW50LiBTZXR0aW5nIG1hbmRhdG9yeSBpZiBBREMgZ3JvdXAgaW5qZWN0ZWQgaW5qZWN0ZWQgdHJpZ2dlciBzb3VyY2UgaXMgc2V0IHRvIGFuIGV4dGVybmFsIHRyaWdnZXIuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19GUk9NX0dSUF9SRUdVTEFSICAgKEFEQ19DRkdSX0pBVVRPKSAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBBREMgZ3JvdXAgcmVndWxhci4gU2V0dGluZyBjb21wbGlhbnQgb25seSB3aXRoIGdyb3VwIGluamVjdGVkIHRyaWdnZXIgc291cmNlIHNldCB0byBTVyBzdGFydCwgd2l0aG91dCBhbnkgZnVydGhlciBhY3Rpb24gb24gIEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHN0YXJ0IG9yIHN0b3A6IGluIHRoaXMgY2FzZSwgQURDIGdyb3VwIGluamVjdGVkIGlzIGNvbnRyb2xsZWQgb25seSBmcm9tIEFEQyBncm91cCByZWd1bGFyLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfSU5KX0NPTlRFWFRfUVVFVUUgIEFEQyBncm91cCBpbmplY3RlZCAtIENvbnRleHQgcXVldWUgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19JTkpfUVVFVUVfMkNPTlRFWFRTX0xBU1RfQUNUSVZFICgodWludDMyX3QpMHgwMDAwMDAwMFUpLyogR3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2UgY29udGV4dCBxdWV1ZSBpcyBlbmFibGVkIGFuZCBjYW4gY29udGFpbiB1cCB0byAyIGNvbnRleHRzLiBXaGVuIGFsbCBjb250ZXh0cyBoYXZlIGJlZW4gcHJvY2Vzc2VkLCB0aGUgcXVldWUgbWFpbnRhaW5zIHRoZSBsYXN0IGNvbnRleHQgYWN0aXZlIHBlcnBldHVhbGx5LiAqLworI2RlZmluZSBMTF9BRENfSU5KX1FVRVVFXzJDT05URVhUU19FTkRfRU1QVFkgICAoQURDX0NGR1JfSlFNKSAgICAgICAgIC8qIEdyb3VwIGluamVjdGVkIHNlcXVlbmNlIGNvbnRleHQgcXVldWUgaXMgZW5hYmxlZCBhbmQgY2FuIGNvbnRhaW4gdXAgdG8gMiBjb250ZXh0cy4gV2hlbiBhbGwgY29udGV4dHMgaGF2ZSBiZWVuIHByb2Nlc3NlZCwgdGhlIHF1ZXVlIGlzIGVtcHR5IGFuZCBpbmplY3RlZCBncm91cCB0cmlnZ2VycyBhcmUgZGlzYWJsZWQuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19JTkpfU0VRX1NDQU5fTEVOR1RIICBBREMgZ3JvdXAgaW5qZWN0ZWQgLSBTZXF1ZW5jZXIgc2NhbiBsZW5ndGgKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfSU5KX1NFUV9TQ0FOX0RJU0FCTEUgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGRpc2FibGUgKGVxdWl2YWxlbnQgdG8gc2VxdWVuY2VyIG9mIDEgcmFuazogQURDIGNvbnZlcnNpb24gb24gb25seSAxIGNoYW5uZWwpICovCisjZGVmaW5lIExMX0FEQ19JTkpfU0VRX1NDQU5fRU5BQkxFXzJSQU5LUyAgKCAgICAgICAgICAgICAgICBBRENfSlNRUl9KTF8wKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMiByYW5rcyBpbiB0aGUgc2VxdWVuY2UgKi8KKyNkZWZpbmUgTExfQURDX0lOSl9TRVFfU0NBTl9FTkFCTEVfM1JBTktTICAoQURDX0pTUVJfSkxfMSAgICAgICAgICAgICAgICApIC8qITwgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciBlbmFibGUgd2l0aCAzIHJhbmtzIGluIHRoZSBzZXF1ZW5jZSAqLworI2RlZmluZSBMTF9BRENfSU5KX1NFUV9TQ0FOX0VOQUJMRV80UkFOS1MgIChBRENfSlNRUl9KTF8xIHwgQURDX0pTUVJfSkxfMCkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGVuYWJsZSB3aXRoIDQgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19JTkpfU0VRX0RJU0NPTlRfTU9ERSAgQURDIGdyb3VwIGluamVjdGVkIC0gU2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19JTkpfU0VRX0RJU0NPTlRfRElTQUJMRSAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkvKiE8IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlIGRpc2FibGUgKi8KKyNkZWZpbmUgTExfQURDX0lOSl9TRVFfRElTQ09OVF8xUkFOSyAgICAgICAoQURDX0NGR1JfSkRJU0NFTikgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUgZW5hYmxlIHdpdGggc2VxdWVuY2UgaW50ZXJydXB0aW9uIGV2ZXJ5IHJhbmsgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0lOSl9TRVFfUkFOS1MgIEFEQyBncm91cCBpbmplY3RlZCAtIFNlcXVlbmNlciByYW5rcworICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19JTkpfUkFOS18xICAgICAgICAgICAgICAgICAgKEFEQ19KRFIxX1JFR09GRlNFVCB8IEFEQ19JTkpfUkFOS18xX0pTUVJfQklUT0ZGU0VUX1BPUykgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIHJhbmsgMSAqLworI2RlZmluZSBMTF9BRENfSU5KX1JBTktfMiAgICAgICAgICAgICAgICAgIChBRENfSkRSMl9SRUdPRkZTRVQgfCBBRENfSU5KX1JBTktfMl9KU1FSX0JJVE9GRlNFVF9QT1MpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciByYW5rIDIgKi8KKyNkZWZpbmUgTExfQURDX0lOSl9SQU5LXzMgICAgICAgICAgICAgICAgICAoQURDX0pEUjNfUkVHT0ZGU0VUIHwgQURDX0lOSl9SQU5LXzNfSlNRUl9CSVRPRkZTRVRfUE9TKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgcmFuayAzICovCisjZGVmaW5lIExMX0FEQ19JTkpfUkFOS180ICAgICAgICAgICAgICAgICAgKEFEQ19KRFI0X1JFR09GRlNFVCB8IEFEQ19JTkpfUkFOS180X0pTUVJfQklUT0ZGU0VUX1BPUykgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIHJhbmsgNCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfQ0hBTk5FTF9TQU1QTElOR1RJTUUgIENoYW5uZWwgLSBTYW1wbGluZyB0aW1lCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX1NBTVBMSU5HVElNRV8xQ1lDTEVfNSAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNhbXBsaW5nIHRpbWUgMS41IEFEQyBjbG9jayBjeWNsZSAqLworI2RlZmluZSBMTF9BRENfU0FNUExJTkdUSU1FXzJDWUNMRVNfNSAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NNUFIyX1NNUDEwXzApIC8qITwgU2FtcGxpbmcgdGltZSAyLjUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBMTF9BRENfU0FNUExJTkdUSU1FXzRDWUNMRVNfNSAgICAgICggICAgICAgICAgICAgICAgICAgIEFEQ19TTVBSMl9TTVAxMF8xICAgICAgICAgICAgICAgICAgICApIC8qITwgU2FtcGxpbmcgdGltZSA0LjUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBMTF9BRENfU0FNUExJTkdUSU1FXzdDWUNMRVNfNSAgICAgICggICAgICAgICAgICAgICAgICAgIEFEQ19TTVBSMl9TTVAxMF8xIHwgQURDX1NNUFIyX1NNUDEwXzApIC8qITwgU2FtcGxpbmcgdGltZSA3LjUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBMTF9BRENfU0FNUExJTkdUSU1FXzE5Q1lDTEVTXzUgICAgIChBRENfU01QUjJfU01QMTBfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgU2FtcGxpbmcgdGltZSAxOS41IEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgTExfQURDX1NBTVBMSU5HVElNRV82MUNZQ0xFU181ICAgICAoQURDX1NNUFIyX1NNUDEwXzIgICAgICAgICAgICAgICAgICAgICB8IEFEQ19TTVBSMl9TTVAxMF8wKSAvKiE8IFNhbXBsaW5nIHRpbWUgNjEuNSBBREMgY2xvY2sgY3ljbGVzICovCisjZGVmaW5lIExMX0FEQ19TQU1QTElOR1RJTUVfMTgxQ1lDTEVTXzUgICAgKEFEQ19TTVBSMl9TTVAxMF8yIHwgQURDX1NNUFIyX1NNUDEwXzEgICAgICAgICAgICAgICAgICAgICkgLyohPCBTYW1wbGluZyB0aW1lIDE4MS41IEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgTExfQURDX1NBTVBMSU5HVElNRV82MDFDWUNMRVNfNSAgICAoQURDX1NNUFIyX1NNUDEwXzIgfCBBRENfU01QUjJfU01QMTBfMSB8IEFEQ19TTVBSMl9TTVAxMF8wKSAvKiE8IFNhbXBsaW5nIHRpbWUgNjAxLjUgQURDIGNsb2NrIGN5Y2xlcyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfQ0hBTk5FTF9TSU5HTEVfRElGRl9FTkRJTkcgIENoYW5uZWwgLSBTaW5nbGUgb3IgZGlmZmVyZW50aWFsIGVuZGluZworICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19TSU5HTEVfRU5ERUQgICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgIEFEQ19DQUxGQUNUX0NBTEZBQ1RfUykgICAgICAgICAvKiE8IEFEQyBjaGFubmVsIGVuZGluZyBzZXQgdG8gc2luZ2xlIGVuZGVkIChsaXRlcmFsIGFsc28gdXNlZCB0byBzZXQgY2FsaWJyYXRpb24gbW9kZSkgKi8KKyNkZWZpbmUgTExfQURDX0RJRkZFUkVOVElBTF9FTkRFRCAgICAgICAgICAoQURDX0NSX0FEQ0FMRElGIHwgQURDX0NBTEZBQ1RfQ0FMRkFDVF9EKSAgICAgICAgIC8qITwgQURDIGNoYW5uZWwgZW5kaW5nIHNldCB0byBkaWZmZXJlbnRpYWwgKGxpdGVyYWwgYWxzbyB1c2VkIHRvIHNldCBjYWxpYnJhdGlvbiBtb2RlKSAqLworI2RlZmluZSBMTF9BRENfQk9USF9TSU5HTEVfRElGRl9FTkRFRCAgICAgIChMTF9BRENfU0lOR0xFX0VOREVEIHwgTExfQURDX0RJRkZFUkVOVElBTF9FTkRFRCkgLyohPCBBREMgY2hhbm5lbCBlbmRpbmcgc2V0IHRvIGJvdGggc2luZ2xlIGVuZGVkIGFuZCBkaWZmZXJlbnRpYWwgKGxpdGVyYWwgdXNlZCBvbmx5IHRvIHNldCBjYWxpYnJhdGlvbiBmYWN0b3JzKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfQVdEX05VTUJFUiBBbmFsb2cgd2F0Y2hkb2cgLSBBbmFsb2cgd2F0Y2hkb2cgbnVtYmVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0FXRDEgICAgICAgICAgICAgICAgICAgICAgICAoQURDX0FXRF9DUjFfQ0hBTk5FTF9NQVNLICB8IEFEQ19BV0RfQ1IxX1JFR09GRlNFVCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG51bWJlciAxICovCisjZGVmaW5lIExMX0FEQ19BV0QyICAgICAgICAgICAgICAgICAgICAgICAgKEFEQ19BV0RfQ1IyM19DSEFOTkVMX01BU0sgfCBBRENfQVdEX0NSMl9SRUdPRkZTRVQpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBudW1iZXIgMiAqLworI2RlZmluZSBMTF9BRENfQVdEMyAgICAgICAgICAgICAgICAgICAgICAgIChBRENfQVdEX0NSMjNfQ0hBTk5FTF9NQVNLIHwgQURDX0FXRF9DUjNfUkVHT0ZGU0VUKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbnVtYmVyIDMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0FXRF9DSEFOTkVMUyAgQW5hbG9nIHdhdGNoZG9nIC0gTW9uaXRvcmVkIGNoYW5uZWxzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9ESVNBQkxFICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3JpbmcgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfUkVHICAgICAgICAoQURDX0FXRF9DUjIzX0NIQU5ORUxfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMUVOICAgICAgICAgICAgICAgICAgICkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgYWxsIGNoYW5uZWxzLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQUxMX0NIQU5ORUxTX0lOSiAgICAgICAgKEFEQ19BV0RfQ1IyM19DSEFOTkVMX01BU0sgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfSkFXRDFFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIGFsbCBjaGFubmVscywgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfUkVHX0lOSiAgICAoQURDX0FXRF9DUjIzX0NIQU5ORUxfTUFTSyAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgQURDX0NGR1JfQVdEMUVOICAgICAgICAgICAgICAgICAgICkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgYWxsIGNoYW5uZWxzLCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzBfUkVHICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzAgICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMCwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMF9JTkogICAgICAgICAgICgoTExfQURDX0NIQU5ORUxfMCAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4wLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMF9SRUdfSU5KICAgICAgICgoTExfQURDX0NIQU5ORUxfMCAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4wLCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzFfUkVHICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzEgICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMSwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMV9JTkogICAgICAgICAgICgoTExfQURDX0NIQU5ORUxfMSAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMV9SRUdfSU5KICAgICAgICgoTExfQURDX0NIQU5ORUxfMSAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xLCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzJfUkVHICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzIgICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMiwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMl9JTkogICAgICAgICAgICgoTExfQURDX0NIQU5ORUxfMiAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4yLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMl9SRUdfSU5KICAgICAgICgoTExfQURDX0NIQU5ORUxfMiAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4yLCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzNfUkVHICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzMgICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMywgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfM19JTkogICAgICAgICAgICgoTExfQURDX0NIQU5ORUxfMyAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4zLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfM19SRUdfSU5KICAgICAgICgoTExfQURDX0NIQU5ORUxfMyAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4zLCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzRfUkVHICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzQgICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONCwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfNF9JTkogICAgICAgICAgICgoTExfQURDX0NIQU5ORUxfNCAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU40LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfNF9SRUdfSU5KICAgICAgICgoTExfQURDX0NIQU5ORUxfNCAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU40LCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzVfUkVHICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzUgICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONSwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfNV9JTkogICAgICAgICAgICgoTExfQURDX0NIQU5ORUxfNSAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU41LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfNV9SRUdfSU5KICAgICAgICgoTExfQURDX0NIQU5ORUxfNSAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU41LCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzZfUkVHICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzYgICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONiwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfNl9JTkogICAgICAgICAgICgoTExfQURDX0NIQU5ORUxfNiAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU42LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfNl9SRUdfSU5KICAgICAgICgoTExfQURDX0NIQU5ORUxfNiAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU42LCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzdfUkVHICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzcgICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONywgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfN19JTkogICAgICAgICAgICgoTExfQURDX0NIQU5ORUxfNyAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU43LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfN19SRUdfSU5KICAgICAgICgoTExfQURDX0NIQU5ORUxfNyAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU43LCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzhfUkVHICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzggICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOOCwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfOF9JTkogICAgICAgICAgICgoTExfQURDX0NIQU5ORUxfOCAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU44LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfOF9SRUdfSU5KICAgICAgICgoTExfQURDX0NIQU5ORUxfOCAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU44LCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzlfUkVHICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzkgICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOOSwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfOV9JTkogICAgICAgICAgICgoTExfQURDX0NIQU5ORUxfOSAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU45LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfOV9SRUdfSU5KICAgICAgICgoTExfQURDX0NIQU5ORUxfOSAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU45LCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzEwX1JFRyAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzEwICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTAsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzEwX0lOSiAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzEwICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTAsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xMF9SRUdfSU5KICAgICAgKChMTF9BRENfQ0hBTk5FTF8xMCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjEwLCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzExX1JFRyAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzExICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTEsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzExX0lOSiAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzExICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTEsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xMV9SRUdfSU5KICAgICAgKChMTF9BRENfQ0hBTk5FTF8xMSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjExLCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzEyX1JFRyAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzEyICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTIsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzEyX0lOSiAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzEyICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTIsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xMl9SRUdfSU5KICAgICAgKChMTF9BRENfQ0hBTk5FTF8xMiAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjEyLCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzEzX1JFRyAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzEzICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTMsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzEzX0lOSiAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzEzICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTMsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xM19SRUdfSU5KICAgICAgKChMTF9BRENfQ0hBTk5FTF8xMyAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjEzLCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzE0X1JFRyAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzE0ICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTQsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzE0X0lOSiAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzE0ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTQsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xNF9SRUdfSU5KICAgICAgKChMTF9BRENfQ0hBTk5FTF8xNCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE0LCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzE1X1JFRyAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzE1ICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTUsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzE1X0lOSiAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzE1ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTUsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xNV9SRUdfSU5KICAgICAgKChMTF9BRENfQ0hBTk5FTF8xNSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE1LCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzE2X1JFRyAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzE2ICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTYsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzE2X0lOSiAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzE2ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTYsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xNl9SRUdfSU5KICAgICAgKChMTF9BRENfQ0hBTk5FTF8xNiAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE2LCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzE3X1JFRyAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzE3ICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTcsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzE3X0lOSiAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzE3ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTcsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xN19SRUdfSU5KICAgICAgKChMTF9BRENfQ0hBTk5FTF8xNyAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE3LCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzE4X1JFRyAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzE4ICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTgsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzE4X0lOSiAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzE4ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTgsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xOF9SRUdfSU5KICAgICAgKChMTF9BRENfQ0hBTk5FTF8xOCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE4LCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSF9WUkVGSU5UX1JFRyAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSAgICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gVnJlZkludDogSW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSF9WUkVGSU5UX0lOSiAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gVnJlZkludDogSW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVlJFRklOVF9SRUdfSU5KICAgICAgKChMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIFZyZWZJbnQ6IEludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlLCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSF9URU1QU0VOU09SX1JFRyAgICAgICAoKExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSAgICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gVGVtcGVyYXR1cmUgc2Vuc29yLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVEVNUFNFTlNPUl9JTkogICAgICAgKChMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIFRlbXBlcmF0dXJlIHNlbnNvciwgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSF9URU1QU0VOU09SX1JFR19JTkogICAoKExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gVGVtcGVyYXR1cmUgc2Vuc29yLCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSF9WQkFUX1JFRyAgICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSAgICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gVmJhdC8zOiBWYmF0IHZvbHRhZ2UgdGhyb3VnaCBhIGRpdmlkZXIgbGFkZGVyIG9mIGZhY3RvciAxLzMgdG8gaGF2ZSBWYmF0IGFsd2F5cyBiZWxvdyBWZGRhLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVkJBVF9JTkogICAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF9WQkFUICAgICAgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIFZiYXQvMzogVmJhdCB2b2x0YWdlIHRocm91Z2ggYSBkaXZpZGVyIGxhZGRlciBvZiBmYWN0b3IgMS8zIHRvIGhhdmUgVmJhdCBhbHdheXMgYmVsb3cgVmRkYSwgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSF9WQkFUX1JFR19JTkogICAgICAgICAoKExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gVmJhdC8zOiBWYmF0IHZvbHRhZ2UgdGhyb3VnaCBhIGRpdmlkZXIgbGFkZGVyIG9mIGZhY3RvciAxLzMgdG8gaGF2ZSBWYmF0IGFsd2F5cyBiZWxvdyBWZGRhICovCisjaWYgZGVmaW5lZChPUEFNUDFfQ1NSX09QQU1QMUVOKQorI2RlZmluZSBMTF9BRENfQVdEX0NIX1ZPUEFNUDFfUkVHICAgICAgICAgICgoTExfQURDX0NIQU5ORUxfVk9QQU1QMSAgICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBEQUMxIGNoYW5uZWwgMSwgY2hhbm5lbCBzcGVjaWZpYyB0byBBREMyLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVk9QQU1QMV9JTkogICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF9WT1BBTVAxICAgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIERBQzEgY2hhbm5lbCAxLCBjaGFubmVsIHNwZWNpZmljIHRvIEFEQzIsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVk9QQU1QMV9SRUdfSU5KICAgICAgKChMTF9BRENfQ0hBTk5FTF9WT1BBTVAxICAgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIERBQzEgY2hhbm5lbCAxLCBjaGFubmVsIHNwZWNpZmljIHRvIEFEQzIsIGNvbnZlcnRlZCBieSBlaXRoZXIgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZCAqLworI2VuZGlmCisjaWYgZGVmaW5lZChPUEFNUDJfQ1NSX09QQU1QMkVOKQorI2RlZmluZSBMTF9BRENfQVdEX0NIX1ZPUEFNUDJfUkVHICAgICAgICAgICgoTExfQURDX0NIQU5ORUxfVk9QQU1QMiAgICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBEQUMxIGNoYW5uZWwgMSwgY2hhbm5lbCBzcGVjaWZpYyB0byBBREMyLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVk9QQU1QMl9JTkogICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF9WT1BBTVAyICAgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIERBQzEgY2hhbm5lbCAxLCBjaGFubmVsIHNwZWNpZmljIHRvIEFEQzIsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVk9QQU1QMl9SRUdfSU5KICAgICAgKChMTF9BRENfQ0hBTk5FTF9WT1BBTVAyICAgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIERBQzEgY2hhbm5lbCAxLCBjaGFubmVsIHNwZWNpZmljIHRvIEFEQzIsIGNvbnZlcnRlZCBieSBlaXRoZXIgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZCAqLworI2VuZGlmCisjaWYgZGVmaW5lZChPUEFNUDNfQ1NSX09QQU1QM0VOKQorI2RlZmluZSBMTF9BRENfQVdEX0NIX1ZPUEFNUDNfUkVHICAgICAgICAgICgoTExfQURDX0NIQU5ORUxfVk9QQU1QMyAgICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBEQUMxIGNoYW5uZWwgMSwgY2hhbm5lbCBzcGVjaWZpYyB0byBBREMzLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVk9QQU1QM19JTkogICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF9WT1BBTVAzICAgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIERBQzEgY2hhbm5lbCAxLCBjaGFubmVsIHNwZWNpZmljIHRvIEFEQzMsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVk9QQU1QM19SRUdfSU5KICAgICAgKChMTF9BRENfQ0hBTk5FTF9WT1BBTVAzICAgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIERBQzEgY2hhbm5lbCAxLCBjaGFubmVsIHNwZWNpZmljIHRvIEFEQzMsIGNvbnZlcnRlZCBieSBlaXRoZXIgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZCAqLworI2VuZGlmCisjaWYgZGVmaW5lZChPUEFNUDRfQ1NSX09QQU1QNEVOKQorI2RlZmluZSBMTF9BRENfQVdEX0NIX1ZPUEFNUDRfUkVHICAgICAgICAgICgoTExfQURDX0NIQU5ORUxfVk9QQU1QNCAgICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBEQUMxIGNoYW5uZWwgMSwgY2hhbm5lbCBzcGVjaWZpYyB0byBBREMzLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVk9QQU1QNF9JTkogICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICAgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIERBQzEgY2hhbm5lbCAxLCBjaGFubmVsIHNwZWNpZmljIHRvIEFEQzMsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVk9QQU1QNF9SRUdfSU5KICAgICAgKChMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICAgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIERBQzEgY2hhbm5lbCAxLCBjaGFubmVsIHNwZWNpZmljIHRvIEFEQzMsIGNvbnZlcnRlZCBieSBlaXRoZXIgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZCAqLworI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19BV0RfVEhSRVNIT0xEUyAgQW5hbG9nIHdhdGNoZG9nIC0gVGhyZXNob2xkcworICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19BV0RfVEhSRVNIT0xEX0hJR0ggICAgICAgICAgKEFEQ19UUjFfSFQxICAgICAgICAgICAgICApIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgaGlnaCAqLworI2RlZmluZSBMTF9BRENfQVdEX1RIUkVTSE9MRF9MT1cgICAgICAgICAgICggICAgICAgICAgICAgIEFEQ19UUjFfTFQxKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkIGxvdyAqLworI2RlZmluZSBMTF9BRENfQVdEX1RIUkVTSE9MRFNfSElHSF9MT1cgICAgIChBRENfVFIxX0hUMSB8IEFEQ19UUjFfTFQxKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgYm90aCB0aHJlc2hvbGRzIGhpZ2ggYW5kIGxvdyBjb25jYXRlbmF0ZWQgaW50byB0aGUgc2FtZSBkYXRhICovCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19NVUxUSV9NT0RFICBNdWx0aW1vZGUgLSBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX01VTFRJX0lOREVQRU5ERU5UICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGR1YWwgbW9kZSBkaXNhYmxlZCAoQURDIGluZGVwZW5kZW50IG1vZGUpICovCisjZGVmaW5lIExMX0FEQ19NVUxUSV9EVUFMX1JFR19TSU1VTFQgICAgICAgKCAgICAgICAgICAgICAgICAgQURDX0NDUl9EVUFMXzIgfCBBRENfQ0NSX0RVQUxfMSAgICAgICAgICAgICAgICAgKSAvKiE8IEFEQyBkdWFsIG1vZGUgZW5hYmxlZDogZ3JvdXAgcmVndWxhciBzaW11bHRhbmVvdXMgKi8KKyNkZWZpbmUgTExfQURDX01VTFRJX0RVQUxfUkVHX0lOVEVSTCAgICAgICAoICAgICAgICAgICAgICAgICBBRENfQ0NSX0RVQUxfMiB8IEFEQ19DQ1JfRFVBTF8xIHwgQURDX0NDUl9EVUFMXzApIC8qITwgQURDIGR1YWwgbW9kZSBlbmFibGVkOiBDb21iaW5lZCBncm91cCByZWd1bGFyIGludGVybGVhdmVkICovCisjZGVmaW5lIExMX0FEQ19NVUxUSV9EVUFMX0lOSl9TSU1VTFQgICAgICAgKCAgICAgICAgICAgICAgICAgQURDX0NDUl9EVUFMXzIgICAgICAgICAgICAgICAgICB8IEFEQ19DQ1JfRFVBTF8wKSAvKiE8IEFEQyBkdWFsIG1vZGUgZW5hYmxlZDogZ3JvdXAgaW5qZWN0ZWQgc2ltdWx0YW5lb3VzICovCisjZGVmaW5lIExMX0FEQ19NVUxUSV9EVUFMX0lOSl9BTFRFUk4gICAgICAgKEFEQ19DQ1JfRFVBTF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFEQ19DQ1JfRFVBTF8wKSAvKiE8IEFEQyBkdWFsIG1vZGUgZW5hYmxlZDogZ3JvdXAgaW5qZWN0ZWQgYWx0ZXJuYXRlIHRyaWdnZXIuIFdvcmtzIG9ubHkgd2l0aCBleHRlcm5hbCB0cmlnZ2VycyAobm90IGludGVybmFsIFNXIHN0YXJ0KSAqLworI2RlZmluZSBMTF9BRENfTVVMVElfRFVBTF9SRUdfU0lNX0lOSl9TSU0gICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0NSX0RVQUxfMCkgLyohPCBBREMgZHVhbCBtb2RlIGVuYWJsZWQ6IENvbWJpbmVkIGdyb3VwIHJlZ3VsYXIgc2ltdWx0YW5lb3VzICsgZ3JvdXAgaW5qZWN0ZWQgc2ltdWx0YW5lb3VzICovCisjZGVmaW5lIExMX0FEQ19NVUxUSV9EVUFMX1JFR19TSU1fSU5KX0FMVCAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0NSX0RVQUxfMSAgICAgICAgICAgICAgICAgKSAvKiE8IEFEQyBkdWFsIG1vZGUgZW5hYmxlZDogQ29tYmluZWQgZ3JvdXAgcmVndWxhciBzaW11bHRhbmVvdXMgKyBncm91cCBpbmplY3RlZCBhbHRlcm5hdGUgdHJpZ2dlciAqLworI2RlZmluZSBMTF9BRENfTVVMVElfRFVBTF9SRUdfSU5UX0lOSl9TSU0gICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NDUl9EVUFMXzEgfCBBRENfQ0NSX0RVQUxfMCkgLyohPCBBREMgZHVhbCBtb2RlIGVuYWJsZWQ6IENvbWJpbmVkIGdyb3VwIHJlZ3VsYXIgaW50ZXJsZWF2ZWQgKyBncm91cCBpbmplY3RlZCBzaW11bHRhbmVvdXMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX01VTFRJX0RNQV9UUkFOU0ZFUiAgTXVsdGltb2RlIC0gRE1BIHRyYW5zZmVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX01VTFRJX1JFR19ETUFfRUFDSF9BREMgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIG11bHRpbW9kZSBncm91cCByZWd1bGFyIGNvbnZlcnNpb25zIGFyZSB0cmFuc2ZlcnJlZCBieSBETUE6IGVhY2ggQURDIHVzZXMgaXRzIG93biBETUEgY2hhbm5lbCwgd2l0aCBpdHMgaW5kaXZpZHVhbCBETUEgdHJhbnNmZXIgc2V0dGluZ3MgKi8KKyNkZWZpbmUgTExfQURDX01VTFRJX1JFR19ETUFfTElNSVRfUkVTMTJfMTBCICggICAgICAgICAgICAgICAgIEFEQ19DQ1JfTURNQV8xICAgICAgICAgICAgICAgICApIC8qITwgQURDIG11bHRpbW9kZSBncm91cCByZWd1bGFyIGNvbnZlcnNpb25zIGFyZSB0cmFuc2ZlcnJlZCBieSBETUEsIG9uZSBETUEgY2hhbm5lbCBmb3IgYm90aCBBREMgKERNQSBvZiBBREMgbWFzdGVyKSwgaW4gbGltaXRlZCBtb2RlIChvbmUgc2hvdCBtb2RlKTogRE1BIHRyYW5zZmVyIHJlcXVlc3RzIGFyZSBzdG9wcGVkIHdoZW4gbnVtYmVyIG9mIERNQSBkYXRhIHRyYW5zZmVycyAobnVtYmVyIG9mIEFEQyBjb252ZXJzaW9ucykgaXMgcmVhY2hlZC4gVGhpcyBBREMgbW9kZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggRE1BIG1vZGUgbm9uLWNpcmN1bGFyLiBTZXR0aW5nIGZvciBBREMgcmVzb2x1dGlvbiBvZiAxMiBhbmQgMTAgYml0cyAqLworI2RlZmluZSBMTF9BRENfTVVMVElfUkVHX0RNQV9MSU1JVF9SRVM4XzZCICAgKCAgICAgICAgICAgICAgICAgQURDX0NDUl9NRE1BXzEgfCBBRENfQ0NSX01ETUFfMCkgLyohPCBBREMgbXVsdGltb2RlIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbnMgYXJlIHRyYW5zZmVycmVkIGJ5IERNQSwgb25lIERNQSBjaGFubmVsIGZvciBib3RoIEFEQyAoRE1BIG9mIEFEQyBtYXN0ZXIpLCBpbiBsaW1pdGVkIG1vZGUgKG9uZSBzaG90IG1vZGUpOiBETUEgdHJhbnNmZXIgcmVxdWVzdHMgYXJlIHN0b3BwZWQgd2hlbiBudW1iZXIgb2YgRE1BIGRhdGEgdHJhbnNmZXJzIChudW1iZXIgb2YgQURDIGNvbnZlcnNpb25zKSBpcyByZWFjaGVkLiBUaGlzIEFEQyBtb2RlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBETUEgbW9kZSBub24tY2lyY3VsYXIuIFNldHRpbmcgZm9yIEFEQyByZXNvbHV0aW9uIG9mIDggYW5kIDYgYml0cyAqLworI2RlZmluZSBMTF9BRENfTVVMVElfUkVHX0RNQV9VTkxNVF9SRVMxMl8xMEIgKEFEQ19DQ1JfRE1BQ0ZHIHwgQURDX0NDUl9NRE1BXzEgICAgICAgICAgICAgICAgICkgLyohPCBBREMgbXVsdGltb2RlIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbnMgYXJlIHRyYW5zZmVycmVkIGJ5IERNQSwgb25lIERNQSBjaGFubmVsIGZvciBib3RoIEFEQyAoRE1BIG9mIEFEQyBtYXN0ZXIpLCBpbiB1bmxpbWl0ZWQgbW9kZTogRE1BIHRyYW5zZmVyIHJlcXVlc3RzIGFyZSB1bmxpbWl0ZWQsIHdoYXRldmVyIG51bWJlciBvZiBETUEgZGF0YSB0cmFuc2ZlcnJlZCAobnVtYmVyIG9mIEFEQyBjb252ZXJzaW9ucykuIFRoaXMgQURDIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIERNQSBtb2RlIGNpcmN1bGFyLiBTZXR0aW5nIGZvciBBREMgcmVzb2x1dGlvbiBvZiAxMiBhbmQgMTAgYml0cyAqLworI2RlZmluZSBMTF9BRENfTVVMVElfUkVHX0RNQV9VTkxNVF9SRVM4XzZCICAgKEFEQ19DQ1JfRE1BQ0ZHIHwgQURDX0NDUl9NRE1BXzEgfCBBRENfQ0NSX01ETUFfMCkgLyohPCBBREMgbXVsdGltb2RlIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbnMgYXJlIHRyYW5zZmVycmVkIGJ5IERNQSwgb25lIERNQSBjaGFubmVsIGZvciBib3RoIEFEQyAoRE1BIG9mIEFEQyBtYXN0ZXIpLCBpbiB1bmxpbWl0ZWQgbW9kZTogRE1BIHRyYW5zZmVyIHJlcXVlc3RzIGFyZSB1bmxpbWl0ZWQsIHdoYXRldmVyIG51bWJlciBvZiBETUEgZGF0YSB0cmFuc2ZlcnJlZCAobnVtYmVyIG9mIEFEQyBjb252ZXJzaW9ucykuIFRoaXMgQURDIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIERNQSBtb2RlIGNpcmN1bGFyLiBTZXR0aW5nIGZvciBBREMgcmVzb2x1dGlvbiBvZiA4IGFuZCA2IGJpdHMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX01VTFRJX1RXT1NNUF9ERUxBWSAgTXVsdGltb2RlIC0gRGVsYXkgYmV0d2VlbiB0d28gc2FtcGxpbmcgcGhhc2VzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV8xQ1lDTEUgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBtdWx0aW1vZGUgZGVsYXkgYmV0d2VlbiB0d28gc2FtcGxpbmcgcGhhc2VzOiAxIEFEQyBjbG9jayBjeWNsZSAqLworI2RlZmluZSBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzJDWUNMRVMgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0NSX0RFTEFZXzApIC8qITwgQURDIG11bHRpbW9kZSBkZWxheSBiZXR3ZWVuIHR3byBzYW1wbGluZyBwaGFzZXM6IDIgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzNDWUNMRVMgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0NSX0RFTEFZXzEgICAgICAgICAgICAgICAgICApIC8qITwgQURDIG11bHRpbW9kZSBkZWxheSBiZXR3ZWVuIHR3byBzYW1wbGluZyBwaGFzZXM6IDMgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzRDWUNMRVMgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0NSX0RFTEFZXzEgfCBBRENfQ0NSX0RFTEFZXzApIC8qITwgQURDIG11bHRpbW9kZSBkZWxheSBiZXR3ZWVuIHR3byBzYW1wbGluZyBwaGFzZXM6IDQgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzVDWUNMRVMgICggICAgICAgICAgICAgICAgICBBRENfQ0NSX0RFTEFZXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgQURDIG11bHRpbW9kZSBkZWxheSBiZXR3ZWVuIHR3byBzYW1wbGluZyBwaGFzZXM6IDUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzZDWUNMRVMgICggICAgICAgICAgICAgICAgICBBRENfQ0NSX0RFTEFZXzIgICAgICAgICAgICAgICAgICAgfCBBRENfQ0NSX0RFTEFZXzApIC8qITwgQURDIG11bHRpbW9kZSBkZWxheSBiZXR3ZWVuIHR3byBzYW1wbGluZyBwaGFzZXM6IDYgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzdDWUNMRVMgICggICAgICAgICAgICAgICAgICBBRENfQ0NSX0RFTEFZXzIgfCBBRENfQ0NSX0RFTEFZXzEgICAgICAgICAgICAgICAgICApIC8qITwgQURDIG11bHRpbW9kZSBkZWxheSBiZXR3ZWVuIHR3byBzYW1wbGluZyBwaGFzZXM6IDcgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzhDWUNMRVMgICggICAgICAgICAgICAgICAgICBBRENfQ0NSX0RFTEFZXzIgfCBBRENfQ0NSX0RFTEFZXzEgfCBBRENfQ0NSX0RFTEFZXzApIC8qITwgQURDIG11bHRpbW9kZSBkZWxheSBiZXR3ZWVuIHR3byBzYW1wbGluZyBwaGFzZXM6IDggQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzlDWUNMRVMgIChBRENfQ0NSX0RFTEFZXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgQURDIG11bHRpbW9kZSBkZWxheSBiZXR3ZWVuIHR3byBzYW1wbGluZyBwaGFzZXM6IDkgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzEwQ1lDTEVTIChBRENfQ0NSX0RFTEFZXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBRENfQ0NSX0RFTEFZXzApIC8qITwgQURDIG11bHRpbW9kZSBkZWxheSBiZXR3ZWVuIHR3byBzYW1wbGluZyBwaGFzZXM6IDEwIEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV8xMUNZQ0xFUyAoQURDX0NDUl9ERUxBWV8zICAgICAgICAgICAgICAgICAgIHwgQURDX0NDUl9ERUxBWV8xICAgICAgICAgICAgICAgICAgKSAvKiE8IEFEQyBtdWx0aW1vZGUgZGVsYXkgYmV0d2VlbiB0d28gc2FtcGxpbmcgcGhhc2VzOiAxMSBBREMgY2xvY2sgY3ljbGVzICovCisjZGVmaW5lIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfMTJDWUNMRVMgKEFEQ19DQ1JfREVMQVlfMyAgICAgICAgICAgICAgICAgICB8IEFEQ19DQ1JfREVMQVlfMSB8IEFEQ19DQ1JfREVMQVlfMCkgLyohPCBBREMgbXVsdGltb2RlIGRlbGF5IGJldHdlZW4gdHdvIHNhbXBsaW5nIHBoYXNlczogMTIgQURDIGNsb2NrIGN5Y2xlcyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfTVVMVElfTUFTVEVSX1NMQVZFICBNdWx0aW1vZGUgLSBBREMgbWFzdGVyIG9yIHNsYXZlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX01VTFRJX01BU1RFUiAgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICBBRENfQ0RSX1JEQVRBX01TVCkgLyohPCBJbiBtdWx0aW1vZGUsIHNlbGVjdGlvbiBhbW9uZyBzZXZlcmFsIEFEQyBpbnN0YW5jZXM6IEFEQyBtYXN0ZXIgKi8KKyNkZWZpbmUgTExfQURDX01VTFRJX1NMQVZFICAgICAgICAgICAgICAgICAoQURDX0NEUl9SREFUQV9TTFYgICAgICAgICAgICAgICAgICAgICkgLyohPCBJbiBtdWx0aW1vZGUsIHNlbGVjdGlvbiBhbW9uZyBzZXZlcmFsIEFEQyBpbnN0YW5jZXM6IEFEQyBzbGF2ZSAqLworI2RlZmluZSBMTF9BRENfTVVMVElfTUFTVEVSX1NMQVZFICAgICAgICAgIChBRENfQ0RSX1JEQVRBX1NMViB8IEFEQ19DRFJfUkRBVEFfTVNUKSAvKiE8IEluIG11bHRpbW9kZSwgc2VsZWN0aW9uIGFtb25nIHNldmVyYWwgQURDIGluc3RhbmNlczogYm90aCBBREMgbWFzdGVyIGFuZCBBREMgc2xhdmUgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8KKworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19IV19ERUxBWVMgIERlZmluaXRpb25zIG9mIEFEQyBoYXJkd2FyZSBjb25zdHJhaW50cyBkZWxheXMKKyAgKiBAbm90ZSAgIE9ubHkgQURDIElQIEhXIGRlbGF5cyBhcmUgZGVmaW5lZCBpbiBBREMgTEwgZHJpdmVyIGRyaXZlciwKKyAgKiAgICAgICAgIG5vdCB0aW1lb3V0IHZhbHVlcy4KKyAgKiAgICAgICAgIEZvciBkZXRhaWxzIG9uIGRlbGF5cyB2YWx1ZXMsIHJlZmVyIHRvIGRlc2NyaXB0aW9ucyBpbiBzb3VyY2UgY29kZQorICAqICAgICAgICAgYWJvdmUgZWFjaCBsaXRlcmFsIGRlZmluaXRpb24uCisgICogQHsKKyAgKi8KKyAgCisvKiBOb3RlOiBPbmx5IEFEQyBJUCBIVyBkZWxheXMgYXJlIGRlZmluZWQgaW4gQURDIExMIGRyaXZlciBkcml2ZXIsICAgICAgICAgICAqLworLyogICAgICAgbm90IHRpbWVvdXQgdmFsdWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIFRpbWVvdXQgdmFsdWVzIGZvciBBREMgb3BlcmF0aW9ucyBhcmUgZGVwZW5kZW50IHRvIGRldmljZSBjbG9jayAgICAgICovCisvKiAgICAgICBjb25maWd1cmF0aW9uIChzeXN0ZW0gY2xvY2sgdmVyc3VzIEFEQyBjbG9jayksICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgYW5kIHRoZXJlZm9yZSBtdXN0IGJlIGRlZmluZWQgaW4gdXNlciBhcHBsaWNhdGlvbi4gICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIEluZGljYXRpb25zIGZvciBlc3RpbWF0aW9uIG9mIEFEQyB0aW1lb3V0IGRlbGF5cywgZm9yIHRoaXMgICAgICAgICAgICovCisvKiAgICAgICBTVE0zMiBzZXJpZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgLSBBREMgY2FsaWJyYXRpb24gdGltZTogbWF4aW11bSBkZWxheSBpcyAxMTIvZkFEQy4gICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQsIHBhcmFtZXRlciAidENBTCIpICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAtIEFEQyBlbmFibGUgdGltZTogbWF4aW11bSBkZWxheSBpcyAxIGNvbnZlcnNpb24gY3ljbGUuICAgICAgICAgICAgICAqLworLyogICAgICAgICAocmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgcGFyYW1ldGVyICJ0U1RBQiIpICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIC0gQURDIGRpc2FibGUgdGltZTogbWF4aW11bSBkZWxheSBzaG91bGQgYmUgYSBmZXcgQURDIGNsb2NrIGN5Y2xlcyAgICovCisvKiAgICAgICAtIEFEQyBzdG9wIGNvbnZlcnNpb24gdGltZTogbWF4aW11bSBkZWxheSBzaG91bGQgYmUgYSBmZXcgQURDIGNsb2NrICAqLworLyogICAgICAgICBjeWNsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIC0gQURDIGNvbnZlcnNpb24gdGltZTogZHVyYXRpb24gZGVwZW5kaW5nIG9uIEFEQyBjbG9jayBhbmQgQURDICAgICAgICovCisvKiAgICAgICAgIGNvbmZpZ3VyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAocmVmZXIgdG8gZGV2aWNlIHJlZmVyZW5jZSBtYW51YWwsIHNlY3Rpb24gIlRpbWluZyIpICAgICAgICAgICAgICAgKi8KKworLyogRGVsYXkgZm9yIEFEQyBzdGFiaWxpemF0aW9uIHRpbWUgKEFEQyB2b2x0YWdlIHJlZ3VsYXRvciBzdGFydC11cCB0aW1lKSAgICAgKi8KKy8qIERlbGF5IHNldCB0byBtYXhpbXVtIHZhbHVlIChyZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCAgICAgICAgICAgICAgICAgICAgICovCisvKiBwYXJhbWV0ZXIgInRBRENWUkVHX1NUVVAiKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVW5pdDogdXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfQURDX0RFTEFZX0lOVEVSTkFMX1JFR1VMX1NUQUJfVVMgKCh1aW50MzJfdCkgIDEwVSkgIC8qITwgRGVsYXkgZm9yIEFEQyBzdGFiaWxpemF0aW9uIHRpbWUgKEFEQyB2b2x0YWdlIHJlZ3VsYXRvciBzdGFydC11cCB0aW1lKSAqLworCisvKiBEZWxheSBmb3IgaW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2Ugc3RhYmlsaXphdGlvbiB0aW1lLiAgICAgICAgICAgICAgICAgICAqLworLyogRGVsYXkgc2V0IHRvIG1heGltdW0gdmFsdWUgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQsICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHBhcmFtZXRlciAidHN0YXJ0X3ZyZWZpbnQiKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBVbml0OiB1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9BRENfREVMQVlfVlJFRklOVF9TVEFCX1VTICAgICAgICgodWludDMyX3QpICAxMlUpICAvKiE8IERlbGF5IGZvciBpbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZSBzdGFiaWxpemF0aW9uIHRpbWUgKi8KKworLyogRGVsYXkgZm9yIHRlbXBlcmF0dXJlIHNlbnNvciBzdGFiaWxpemF0aW9uIHRpbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIExpdGVyYWwgc2V0IHRvIG1heGltdW0gdmFsdWUgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQsICAgICAgICAgICAgICAgICAgICovCisvKiBwYXJhbWV0ZXIgInRTVEFSVCIpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVW5pdDogdXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfQURDX0RFTEFZX1RFTVBTRU5TT1JfU1RBQl9VUyAgICAoKHVpbnQzMl90KSAxMjBVKSAgLyohPCBEZWxheSBmb3IgdGVtcGVyYXR1cmUgc2Vuc29yIHN0YWJpbGl6YXRpb24gdGltZSAqLworCisvKiBEZWxheSByZXF1aXJlZCBiZXR3ZWVuIEFEQyBlbmQgb2YgY2FsaWJyYXRpb24gYW5kIEFEQyBlbmFibGUuICAgICAgICAgICAgICAqLworLyogTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZSwgYSBtaW5pbXVtIG51bWJlciBvZiBBREMgY2xvY2sgY3ljbGVzICAgICAgICAgICAgKi8KKy8qICAgICAgIGFyZSByZXF1aXJlZCBiZXR3ZWVuIEFEQyBlbmQgb2YgY2FsaWJyYXRpb24gYW5kIEFEQyBlbmFibGUuICAgICAgICAgICovCisvKiAgICAgICBXYWl0IHRpbWUgY2FuIGJlIGNvbXB1dGVkIGluIHVzZXIgYXBwbGljYXRpb24gYnkgd2FpdGluZyBmb3IgdGhlICAgICAqLworLyogICAgICAgZXF1aXZhbGVudCBudW1iZXIgb2YgQ1BVIGN5Y2xlcywgYnkgdGFraW5nIGludG8gYWNjb3VudCAgICAgICAgICAgICAgKi8KKy8qICAgICAgIHJhdGlvIG9mIENQVSBjbG9jayB2ZXJzdXMgQURDIGNsb2NrIHByZXNjYWxlcnMuICAgICAgICAgICAgICAgICAgICAgICovCisvKiBVbml0OiBBREMgY2xvY2sgY3ljbGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9BRENfREVMQVlfQ0FMSUJfRU5BQkxFX0FEQ19DWUNMRVMgKCh1aW50MzJfdCkgNFUpICAvKiE8IERlbGF5IHJlcXVpcmVkIGJldHdlZW4gQURDIGVuZCBvZiBjYWxpYnJhdGlvbiBhbmQgQURDIGVuYWJsZSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FeHBvcnRlZF9NYWNyb3MgQURDIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIHdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gQURDIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gQURDIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9BRENfV3JpdGVSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fLCBfX1ZBTFVFX18pIFdSSVRFX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18sIChfX1ZBTFVFX18pKQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBBREMgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBBREMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfQURDX1JlYWRSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fKSBSRUFEX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18pCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FTV9IRUxQRVJfTUFDUk8gQURDIGhlbHBlciBtYWNybworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGdldCBBREMgY2hhbm5lbCBudW1iZXIgaW4gZGVjaW1hbCBmb3JtYXQKKyAgKiAgICAgICAgIGZyb20gbGl0ZXJhbHMgTExfQURDX0NIQU5ORUxfeC4KKyAgKiBAbm90ZSAgIEV4YW1wbGU6CisgICogICAgICAgICAgIF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQihMTF9BRENfQ0hBTk5FTF80KQorICAqICAgICAgICAgICB3aWxsIHJldHVybiBkZWNpbWFsIG51bWJlciAiNCIuCisgICogQG5vdGUgICBUaGUgaW5wdXQgY2FuIGJlIGEgdmFsdWUgZnJvbSBmdW5jdGlvbnMgd2hlcmUgYSBjaGFubmVsCisgICogICAgICAgICBudW1iZXIgaXMgcmV0dXJuZWQsIGVpdGhlciBkZWZpbmVkIHdpdGggbnVtYmVyCisgICogICAgICAgICBvciB3aXRoIGJpdGZpZWxkIChvbmx5IG9uZSBiaXQgbXVzdCBiZSBzZXQpLgorICAqIEBwYXJhbSAgX19DSEFOTkVMX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICg1KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WQkFUICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIgICAgICAoMikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzICAgICAgKDMpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNCAgICAgICg0KQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gU1RNMzJGMywgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbgorICAqICAgICAgICAgKDIpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzIuXG4KKyAgKiAgICAgICAgICgzKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMzLlxuCisgICogICAgICAgICAoNCkgT24gU1RNMzJGMywgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6IEFEQzQuXG4KKyAgKiAgICAgICAgICg1KSBPbiBTVE0zMkYzLCBBREMgY2hhbm5lbCBhdmFpbGFibGUgb25seSBvbiBhbGwgQURDIGluc3RhbmNlcywgYnV0CisgICogICAgICAgICAgICAgb25seSBvbmUgQURDIGluc3RhbmNlIGlzIGFsbG93ZWQgdG8gYmUgY29ubmVjdGVkIHRvIFZyZWZJbnQgYXQgdGhlIHNhbWUgdGltZS4KKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MTgKKyAgKi8KKyNkZWZpbmUgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKF9fQ0hBTk5FTF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hBTk5FTF9JRF9CSVRGSUVMRF9NQVNLKSA9PSAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgID8gKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLKSA+PiBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfQklUT0ZGU0VUX1BPUyBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgUE9TSVRJT05fVkFMKChfX0NIQU5ORUxfXykpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBnZXQgQURDIGNoYW5uZWwgaW4gbGl0ZXJhbCBmb3JtYXQgTExfQURDX0NIQU5ORUxfeAorICAqICAgICAgICAgZnJvbSBudW1iZXIgaW4gZGVjaW1hbCBmb3JtYXQuCisgICogQG5vdGUgICBFeGFtcGxlOgorICAqICAgICAgICAgICBfX0xMX0FEQ19ERUNJTUFMX05CX1RPX0NIQU5ORUwoNCkKKyAgKiAgICAgICAgICAgd2lsbCByZXR1cm4gYSBkYXRhIGVxdWl2YWxlbnQgdG8gIkxMX0FEQ19DSEFOTkVMXzQiLgorICAqIEBwYXJhbSAgX19ERUNJTUFMX05CX18gVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0xOAorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICg1KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WQkFUICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIgICAgICAoMikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzICAgICAgKDMpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNCAgICAgICg0KQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gU1RNMzJGMywgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbgorICAqICAgICAgICAgKDIpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzIuXG4KKyAgKiAgICAgICAgICgzKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMzLlxuCisgICogICAgICAgICAoNCkgT24gU1RNMzJGMywgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6IEFEQzQuXG4KKyAgKiAgICAgICAgICg1KSBPbiBTVE0zMkYzLCBBREMgY2hhbm5lbCBhdmFpbGFibGUgb25seSBvbiBhbGwgQURDIGluc3RhbmNlcywgYnV0CisgICogICAgICAgICAgICAgb25seSBvbmUgQURDIGluc3RhbmNlIGlzIGFsbG93ZWQgdG8gYmUgY29ubmVjdGVkIHRvIFZyZWZJbnQgYXQgdGhlIHNhbWUgdGltZS5cbgorICAqICAgICAgICAgKDEsIDIsIDMsIDQsIDUpIEZvciBBREMgY2hhbm5lbCByZWFkIGJhY2sgZnJvbSBBREMgcmVnaXN0ZXIsCisgICogICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbiB3aXRoIGludGVybmFsIGNoYW5uZWwgcGFyYW1ldGVyIHRvIGJlIGRvbmUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DSEFOTkVMX0lOVEVSTkFMX1RPX0VYVEVSTkFMKCkuCisgICovCisjZGVmaW5lIF9fTExfQURDX0RFQ0lNQUxfTkJfVE9fQ0hBTk5FTChfX0RFQ0lNQUxfTkJfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX0RFQ0lNQUxfTkJfXykgPD0gOVUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKChfX0RFQ0lNQUxfTkJfXykgPDwgQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgXAorICAgICAgIChBRENfQVdEMkNSX0FXRDJDSF8wIDw8IChfX0RFQ0lNQUxfTkJfXykpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgIFwKKyAgICAgICAoQURDX1NNUFIxX1JFR09GRlNFVCB8ICgoKHVpbnQzMl90KSAoM1UgKiAoX19ERUNJTUFMX05CX18pKSkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkgICAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKChfX0RFQ0lNQUxfTkJfXykgPDwgQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgXAorICAgICAgIChBRENfQVdEMkNSX0FXRDJDSF8wIDw8IChfX0RFQ0lNQUxfTkJfXykpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFwKKyAgICAgICAoQURDX1NNUFIyX1JFR09GRlNFVCB8ICgoKHVpbnQzMl90KSAoM1UgKiAoKF9fREVDSU1BTF9OQl9fKSAtIDEwVSkpKSA8PCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKSBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBzZWxlY3RlZCBjaGFubmVsCisgICogICAgICAgICBjb3JyZXNwb25kcyB0byBsaXRlcmFsIGRlZmluaXRpb25zIG9mIGRyaXZlci4KKyAgKiBAbm90ZSAgIFRoZSBkaWZmZXJlbnQgbGl0ZXJhbCBkZWZpbml0aW9ucyBvZiBBREMgY2hhbm5lbHMgYXJlOgorICAqICAgICAgICAgLSBBREMgaW50ZXJuYWwgY2hhbm5lbDoKKyAgKiAgICAgICAgICAgTExfQURDX0NIQU5ORUxfVlJFRklOVCwgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiwgLi4uCisgICogICAgICAgICAtIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBhIEdQSU8gcGluKToKKyAgKiAgICAgICAgICAgTExfQURDX0NIQU5ORUxfMSwgTExfQURDX0NIQU5ORUxfMiwgLi4uCisgICogQG5vdGUgICBUaGUgY2hhbm5lbCBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGRlZmluZWQgZnJvbSBsaXRlcmFsCisgICogICAgICAgICBkZWZpbml0aW9uIG9mIGEgQURDIGludGVybmFsIGNoYW5uZWwgKExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQsCisgICogICAgICAgICBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SLCAuLi4pLAorICAqICAgICAgICAgQURDIGV4dGVybmFsIGNoYW5uZWwgKExMX0FEQ19DSEFOTkVMXzEsIExMX0FEQ19DSEFOTkVMXzIsIC4uLiksCisgICogICAgICAgICBtdXN0IG5vdCBiZSBhIHZhbHVlIGZyb20gZnVuY3Rpb25zIHdoZXJlIGEgY2hhbm5lbCBudW1iZXIgaXMKKyAgKiAgICAgICAgIHJldHVybmVkIGZyb20gQURDIHJlZ2lzdGVycywKKyAgKiAgICAgICAgIGJlY2F1c2UgaW50ZXJuYWwgYW5kIGV4dGVybmFsIGNoYW5uZWxzIHNoYXJlIHRoZSBzYW1lIGNoYW5uZWwKKyAgKiAgICAgICAgIG51bWJlciBpbiBBREMgcmVnaXN0ZXJzLiBUaGUgZGlmZmVyZW50aWF0aW9uIGlzIG1hZGUgb25seSB3aXRoCisgICogICAgICAgICBwYXJhbWV0ZXJzIGRlZmluaXRpb25zIG9mIGRyaXZlci4KKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAoNSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkJBVCAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDEgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAyICAgICAgKDIpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMyAgICAgICgzKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDQgICAgICAoNCkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzEuXG4KKyAgKiAgICAgICAgICgyKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMyLlxuCisgICogICAgICAgICAoMykgT24gU1RNMzJGMywgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMy5cbgorICAqICAgICAgICAgKDQpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOiBBREM0LlxuCisgICogICAgICAgICAoNSkgT24gU1RNMzJGMywgQURDIGNoYW5uZWwgYXZhaWxhYmxlIG9ubHkgb24gYWxsIEFEQyBpbnN0YW5jZXMsIGJ1dAorICAqICAgICAgICAgICAgIG9ubHkgb25lIEFEQyBpbnN0YW5jZSBpcyBhbGxvd2VkIHRvIGJlIGNvbm5lY3RlZCB0byBWcmVmSW50IGF0IHRoZSBzYW1lIHRpbWUuCisgICogQHJldHZhbCBWYWx1ZSAiMCIgaWYgdGhlIGNoYW5uZWwgY29ycmVzcG9uZHMgdG8gYSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZiBhIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBhIEdQSU8gcGluKS4KKyAgKiAgICAgICAgIFZhbHVlICIxIiBpZiB0aGUgY2hhbm5lbCBjb3JyZXNwb25kcyB0byBhIHBhcmFtZXRlciBkZWZpbml0aW9uIG9mIGEgQURDIGludGVybmFsIGNoYW5uZWwuCisgICovCisjZGVmaW5lIF9fTExfQURDX0lTX0NIQU5ORUxfSU5URVJOQUwoX19DSEFOTkVMX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSF9NQVNLKSAhPSAwVSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY29udmVydCBhIGNoYW5uZWwgZGVmaW5lZCBmcm9tIHBhcmFtZXRlcgorICAqICAgICAgICAgZGVmaW5pdGlvbiBvZiBhIEFEQyBpbnRlcm5hbCBjaGFubmVsIChMTF9BRENfQ0hBTk5FTF9WUkVGSU5ULAorICAqICAgICAgICAgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiwgLi4uKSwKKyAgKiAgICAgICAgIHRvIGl0cyBlcXVpdmFsZW50IHBhcmFtZXRlciBkZWZpbml0aW9uIG9mIGEgQURDIGV4dGVybmFsIGNoYW5uZWwKKyAgKiAgICAgICAgIChMTF9BRENfQ0hBTk5FTF8xLCBMTF9BRENfQ0hBTk5FTF8yLCAuLi4pLgorICAqIEBub3RlICAgVGhlIGNoYW5uZWwgcGFyYW1ldGVyIGNhbiBiZSwgYWRkaXRpb25hbGx5IHRvIGEgdmFsdWUKKyAgKiAgICAgICAgIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZiBhIEFEQyBpbnRlcm5hbCBjaGFubmVsCisgICogICAgICAgICAoTExfQURDX0NIQU5ORUxfVlJFRklOVCwgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiwgLi4uKSwKKyAgKiAgICAgICAgIGEgdmFsdWUgZGVmaW5lZCBmcm9tIHBhcmFtZXRlciBkZWZpbml0aW9uIG9mCisgICogICAgICAgICBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoTExfQURDX0NIQU5ORUxfMSwgTExfQURDX0NIQU5ORUxfMiwgLi4uKQorICAqICAgICAgICAgb3IgYSB2YWx1ZSBmcm9tIGZ1bmN0aW9ucyB3aGVyZSBhIGNoYW5uZWwgbnVtYmVyIGlzIHJldHVybmVkCisgICogICAgICAgICBmcm9tIEFEQyByZWdpc3RlcnMuCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgKDUpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAxICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMiAgICAgICgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDMgICAgICAoMykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgKDQpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLlxuCisgICogICAgICAgICAoMikgT24gU1RNMzJGMywgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbgorICAqICAgICAgICAgKDMpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzMuXG4KKyAgKiAgICAgICAgICg0KSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczogQURDNC5cbgorICAqICAgICAgICAgKDUpIE9uIFNUTTMyRjMsIEFEQyBjaGFubmVsIGF2YWlsYWJsZSBvbmx5IG9uIGFsbCBBREMgaW5zdGFuY2VzLCBidXQKKyAgKiAgICAgICAgICAgICBvbmx5IG9uZSBBREMgaW5zdGFuY2UgaXMgYWxsb3dlZCB0byBiZSBjb25uZWN0ZWQgdG8gVnJlZkludCBhdCB0aGUgc2FtZSB0aW1lLgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE4CisgICovCisjZGVmaW5lIF9fTExfQURDX0NIQU5ORUxfSU5URVJOQUxfVE9fRVhURVJOQUwoX19DSEFOTkVMX18pICAgICAgICAgICAgICAgICAgICAgXAorICAoKF9fQ0hBTk5FTF9fKSAmIH5BRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSF9NQVNLKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgaW50ZXJuYWwgY2hhbm5lbAorICAqICAgICAgICAgc2VsZWN0ZWQgaXMgYXZhaWxhYmxlIG9uIHRoZSBBREMgaW5zdGFuY2Ugc2VsZWN0ZWQuCisgICogQG5vdGUgICBUaGUgY2hhbm5lbCBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIKKyAgKiAgICAgICAgIGRlZmluaXRpb24gb2YgYSBBREMgaW50ZXJuYWwgY2hhbm5lbCAoTExfQURDX0NIQU5ORUxfVlJFRklOVCwKKyAgKiAgICAgICAgIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IsIC4uLiksCisgICogICAgICAgICBtdXN0IG5vdCBiZSBhIHZhbHVlIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZgorICAqICAgICAgICAgQURDIGV4dGVybmFsIGNoYW5uZWwgKExMX0FEQ19DSEFOTkVMXzEsIExMX0FEQ19DSEFOTkVMXzIsIC4uLikKKyAgKiAgICAgICAgIG9yIGEgdmFsdWUgZnJvbSBmdW5jdGlvbnMgd2hlcmUgYSBjaGFubmVsIG51bWJlciBpcworICAqICAgICAgICAgcmV0dXJuZWQgZnJvbSBBREMgcmVnaXN0ZXJzLAorICAqICAgICAgICAgYmVjYXVzZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgY2hhbm5lbHMgc2hhcmUgdGhlIHNhbWUgY2hhbm5lbAorICAqICAgICAgICAgbnVtYmVyIGluIEFEQyByZWdpc3RlcnMuIFRoZSBkaWZmZXJlbnRpYXRpb24gaXMgbWFkZSBvbmx5IHdpdGgKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgZGVmaW5pdGlvbnMgb2YgZHJpdmVyLgorICAqIEBwYXJhbSAgX19BRENfSU5TVEFOQ0VfXyBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICg1KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WQkFUICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIgICAgICAoMikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzICAgICAgKDMpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNCAgICAgICg0KQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gU1RNMzJGMywgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbgorICAqICAgICAgICAgKDIpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzIuXG4KKyAgKiAgICAgICAgICgzKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMzLlxuCisgICogICAgICAgICAoNCkgT24gU1RNMzJGMywgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6IEFEQzQuXG4KKyAgKiAgICAgICAgICg1KSBPbiBTVE0zMkYzLCBBREMgY2hhbm5lbCBhdmFpbGFibGUgb25seSBvbiBhbGwgQURDIGluc3RhbmNlcywgYnV0CisgICogICAgICAgICAgICAgb25seSBvbmUgQURDIGluc3RhbmNlIGlzIGFsbG93ZWQgdG8gYmUgY29ubmVjdGVkIHRvIFZyZWZJbnQgYXQgdGhlIHNhbWUgdGltZS4KKyAgKiBAcmV0dmFsIFZhbHVlICIwIiBpZiB0aGUgaW50ZXJuYWwgY2hhbm5lbCBzZWxlY3RlZCBpcyBub3QgYXZhaWxhYmxlIG9uIHRoZSBBREMgaW5zdGFuY2Ugc2VsZWN0ZWQuCisgICogICAgICAgICBWYWx1ZSAiMSIgaWYgdGhlIGludGVybmFsIGNoYW5uZWwgc2VsZWN0ZWQgaXMgYXZhaWxhYmxlIG9uIHRoZSBBREMgaW5zdGFuY2Ugc2VsZWN0ZWQuCisgICovCisjaWYgZGVmaW5lZCAoQURDMSkgJiYgZGVmaW5lZCAoQURDMikgJiYgZGVmaW5lZCAoQURDMykgJiYgZGVmaW5lZCAoQURDNCkKKyNkZWZpbmUgX19MTF9BRENfSVNfQ0hBTk5FTF9JTlRFUk5BTF9BVkFJTEFCTEUoX19BRENfSU5TVEFOQ0VfXywgX19DSEFOTkVMX18pICBcCisgICgoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgID8gKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UKSAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKChfX0NIQU5ORUxfXykgPT0gTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZCQVQpICAgICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WT1BBTVAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICgoX19BRENfSU5TVEFOQ0VfXykgPT0gQURDMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gTExfQURDX0NIQU5ORUxfVlJFRklOVCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgID8gKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UKSB8fCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gTExfQURDX0NIQU5ORUxfVk9QQU1QMykgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgPyAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQpIHx8ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WT1BBTVA0KSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICgwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKyNlbGlmIGRlZmluZWQgKEFEQzEpICYmIGRlZmluZWQgKEFEQzIpCisjaWYgZGVmaW5lZChPUEFNUDFfQ1NSX09QQU1QMUVOKSAmJiBkZWZpbmVkKE9QQU1QMl9DU1JfT1BBTVAyRU4pCisjZGVmaW5lIF9fTExfQURDX0lTX0NIQU5ORUxfSU5URVJOQUxfQVZBSUxBQkxFKF9fQURDX0lOU1RBTkNFX18sIF9fQ0hBTk5FTF9fKSAgXAorICAoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKChfX0NIQU5ORUxfXykgPT0gTExfQURDX0NIQU5ORUxfVlJFRklOVCkgICAgfHwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WQkFUKSAgICAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKChfX0NIQU5ORUxfXykgPT0gTExfQURDX0NIQU5ORUxfVk9QQU1QMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgPyAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQpICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WT1BBTVAyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisjZWxpZiBkZWZpbmVkKE9QQU1QMl9DU1JfT1BBTVAyRU4pCisjZGVmaW5lIF9fTExfQURDX0lTX0NIQU5ORUxfSU5URVJOQUxfQVZBSUxBQkxFKF9fQURDX0lOU1RBTkNFX18sIF9fQ0hBTk5FTF9fKSAgXAorICAoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKChfX0NIQU5ORUxfXykgPT0gTExfQURDX0NIQU5ORUxfVlJFRklOVCkgICAgfHwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WQkFUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICgoX19BRENfSU5TVEFOQ0VfXykgPT0gQURDMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gTExfQURDX0NIQU5ORUxfVlJFRklOVCkgICAgfHwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKyNlbHNlCisjZGVmaW5lIF9fTExfQURDX0lTX0NIQU5ORUxfSU5URVJOQUxfQVZBSUxBQkxFKF9fQURDX0lOU1RBTkNFX18sIF9fQ0hBTk5FTF9fKSAgXAorICAoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKChfX0NIQU5ORUxfXykgPT0gTExfQURDX0NIQU5ORUxfVlJFRklOVCkgICAgfHwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WQkFUKSAgICAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKChfX0NIQU5ORUxfXykgPT0gTExfQURDX0NIQU5ORUxfVk9QQU1QMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgPyAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKyNlbmRpZgorI2VsaWYgZGVmaW5lZCAoQURDMSkKKyNpZiBkZWZpbmVkKE9QQU1QMV9DU1JfT1BBTVAxRU4pCisjZGVmaW5lIF9fTExfQURDX0lTX0NIQU5ORUxfSU5URVJOQUxfQVZBSUxBQkxFKF9fQURDX0lOU1RBTkNFX18sIF9fQ0hBTk5FTF9fKSAgXAorICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UKSAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChfX0NIQU5ORUxfXykgPT0gTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZCQVQpICAgICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WT1BBTVAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKyNlbHNlCisjZGVmaW5lIF9fTExfQURDX0lTX0NIQU5ORUxfSU5URVJOQUxfQVZBSUxBQkxFKF9fQURDX0lOU1RBTkNFX18sIF9fQ0hBTk5FTF9fKSAgXAorICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UKSAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChfX0NIQU5ORUxfXykgPT0gTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZCQVQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorI2VuZGlmCisjZW5kaWYKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZGVmaW5lIEFEQyBhbmFsb2cgd2F0Y2hkb2cgcGFyYW1ldGVyOgorICAqICAgICAgICAgZGVmaW5lIGEgc2luZ2xlIGNoYW5uZWwgdG8gbW9uaXRvciB3aXRoIGFuYWxvZyB3YXRjaGRvZworICAqICAgICAgICAgZnJvbSBzZXF1ZW5jZXIgY2hhbm5lbCBhbmQgZ3JvdXBzIGRlZmluaXRpb24uCisgICogQG5vdGUgICBUbyBiZSB1c2VkIHdpdGggZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzKCkuCisgICogICAgICAgICBFeGFtcGxlOgorICAqICAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzKAorICAqICAgICAgICAgICAgIEFEQzEsIExMX0FEQ19BV0QxLAorICAqICAgICAgICAgICAgIF9fTExfQURDX0FOQUxPR1dEX0NIQU5ORUxfR1JPVVAoTExfQURDX0NIQU5ORUw0LCBMTF9BRENfR1JPVVBfUkVHVUxBUikpCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgKDUpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAxICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMiAgICAgICgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDMgICAgICAoMykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgKDQpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLlxuCisgICogICAgICAgICAoMikgT24gU1RNMzJGMywgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbgorICAqICAgICAgICAgKDMpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzMuXG4KKyAgKiAgICAgICAgICg0KSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczogQURDNC5cbgorICAqICAgICAgICAgKDUpIE9uIFNUTTMyRjMsIEFEQyBjaGFubmVsIGF2YWlsYWJsZSBvbmx5IG9uIGFsbCBBREMgaW5zdGFuY2VzLCBidXQKKyAgKiAgICAgICAgICAgICBvbmx5IG9uZSBBREMgaW5zdGFuY2UgaXMgYWxsb3dlZCB0byBiZSBjb25uZWN0ZWQgdG8gVnJlZkludCBhdCB0aGUgc2FtZSB0aW1lLlxuCisgICogICAgICAgICAoMSwgMiwgMywgNCwgNSkgRm9yIEFEQyBjaGFubmVsIHJlYWQgYmFjayBmcm9tIEFEQyByZWdpc3RlciwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uIHdpdGggaW50ZXJuYWwgY2hhbm5lbCBwYXJhbWV0ZXIgdG8gYmUgZG9uZQorICAqICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NIQU5ORUxfSU5URVJOQUxfVE9fRVhURVJOQUwoKS4KKyAgKiBAcGFyYW0gIF9fR1JPVVBfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19HUk9VUF9SRUdVTEFSCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0dST1VQX0lOSkVDVEVECisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0dST1VQX1JFR1VMQVJfSU5KRUNURUQKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfUkVHICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0FMTF9DSEFOTkVMU19JTkogICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQUxMX0NIQU5ORUxTX1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMF9SRUcgICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8wX0lOSiAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzBfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xX1JFRyAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzFfSU5KICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMV9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzJfUkVHICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMl9JTkogICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8yX1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfM19SRUcgICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8zX0lOSiAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzNfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF80X1JFRyAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzRfSU5KICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNF9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzVfUkVHICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNV9JTkogICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF81X1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNl9SRUcgICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF82X0lOSiAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzZfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF83X1JFRyAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzdfSU5KICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfN19SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzhfUkVHICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOF9JTkogICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF84X1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOV9SRUcgICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF85X0lOSiAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzlfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMF9SRUcgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEwX0lOSiAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTBfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMV9SRUcgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzExX0lOSiAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTFfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMl9SRUcgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEyX0lOSiAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTJfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xM19SRUcgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEzX0lOSiAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTNfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNF9SRUcgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE0X0lOSiAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTRfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNV9SRUcgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE1X0lOSiAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTVfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNl9SRUcgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE2X0lOSiAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTZfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xN19SRUcgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE3X0lOSiAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTdfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xOF9SRUcgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE4X0lOSiAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMThfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVlJFRklOVF9SRUcgICAgICAgICAgKDApKDUpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WUkVGSU5UX0lOSiAgICAgICAgICAoMCkoNSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZSRUZJTlRfUkVHX0lOSiAgICAgICAgICg1KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVEVNUFNFTlNPUl9SRUcgICAgICAgKDApKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9URU1QU0VOU09SX0lOSiAgICAgICAoMCkoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1RFTVBTRU5TT1JfUkVHX0lOSiAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVkJBVF9SRUcgICAgICAgICAgICAgKDApKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WQkFUX0lOSiAgICAgICAgICAgICAoMCkoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZCQVRfUkVHX0lOSiAgICAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QMV9SRUcgICAgICAgICAgKDApKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVAxX0lOSiAgICAgICAgICAoMCkoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDFfUkVHX0lOSiAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QMl9SRUcgICAgICAgICAgKDApKDIpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVAyX0lOSiAgICAgICAgICAoMCkoMikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDJfUkVHX0lOSiAgICAgICAgICgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QM19SRUcgICAgICAgICAgKDApKDMpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVAzX0lOSiAgICAgICAgICAoMCkoMykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDNfUkVHX0lOSiAgICAgICAgICgzKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QNF9SRUcgICAgICAgICAgKDApKDQpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVA0X0lOSiAgICAgICAgICAoMCkoNCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDRfUkVHX0lOSiAgICAgICAgICg0KQorICAqICAgICAgICAgCisgICogICAgICAgICAoMCkgT24gU1RNMzJGMywgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIGFuYWxvZyB3YXRjaGRvZyBudW1iZXI6IEFXRDEuXG4KKyAgKiAgICAgICAgICgxKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLlxuCisgICogICAgICAgICAoMikgT24gU1RNMzJGMywgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbgorICAqICAgICAgICAgKDMpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzMuXG4KKyAgKiAgICAgICAgICg0KSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczogQURDNC5cbgorICAqICAgICAgICAgKDUpIE9uIFNUTTMyRjMsIEFEQyBjaGFubmVsIGF2YWlsYWJsZSBvbmx5IG9uIGFsbCBBREMgaW5zdGFuY2VzLCBidXQKKyAgKiAgICAgICAgICAgICBvbmx5IG9uZSBBREMgaW5zdGFuY2UgaXMgYWxsb3dlZCB0byBiZSBjb25uZWN0ZWQgdG8gVnJlZkludCBhdCB0aGUgc2FtZSB0aW1lLgorICAqLworI2RlZmluZSBfX0xMX0FEQ19BTkFMT0dXRF9DSEFOTkVMX0dST1VQKF9fQ0hBTk5FTF9fLCBfX0dST1VQX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19HUk9VUF9fKSA9PSBMTF9BRENfR1JPVVBfUkVHVUxBUikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgPyAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICgoX19HUk9VUF9fKSA9PSBMTF9BRENfR1JPVVBfSU5KRUNURUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgPyAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpICBcCisgICkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gc2V0IHRoZSB2YWx1ZSBvZiBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZCBoaWdoCisgICogICAgICAgICBvciBsb3cgaW4gZnVuY3Rpb24gb2YgQURDIHJlc29sdXRpb24sIHdoZW4gQURDIHJlc29sdXRpb24gaXMKKyAgKiAgICAgICAgIGRpZmZlcmVudCBvZiAxMiBiaXRzLgorICAqIEBub3RlICAgVG8gYmUgdXNlZCB3aXRoIGZ1bmN0aW9uIEByZWYgTExfQURDX0NvbmZpZ0FuYWxvZ1dEVGhyZXNob2xkcygpCisgICogICAgICAgICBvciBAcmVmIExMX0FEQ19TZXRBbmFsb2dXRFRocmVzaG9sZHMoKS4KKyAgKiAgICAgICAgIEV4YW1wbGUsIHdpdGggYSBBREMgcmVzb2x1dGlvbiBvZiA4IGJpdHMsIHRvIHNldCB0aGUgdmFsdWUgb2YKKyAgKiAgICAgICAgIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgaGlnaCAob24gOCBiaXRzKToKKyAgKiAgICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dEVGhyZXNob2xkcworICAqICAgICAgICAgICAgKDwgQURDeCBwYXJhbSA+LAorICAqICAgICAgICAgICAgIF9fTExfQURDX0FOQUxPR1dEX1NFVF9USFJFU0hPTERfUkVTT0xVVElPTihMTF9BRENfUkVTT0xVVElPTl84QiwgPHRocmVzaG9sZF92YWx1ZV84X2JpdHM+KQorICAqICAgICAgICAgICAgKTsKKyAgKiBAcGFyYW0gIF9fQURDX1JFU09MVVRJT05fXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEyQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEwQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzhCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fNkIKKyAgKiBAcGFyYW0gIF9fQVdEX1RIUkVTSE9MRF9fIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICAqLworI2RlZmluZSBfX0xMX0FEQ19BTkFMT0dXRF9TRVRfVEhSRVNIT0xEX1JFU09MVVRJT04oX19BRENfUkVTT0xVVElPTl9fLCBfX0FXRF9USFJFU0hPTERfXykgXAorICAoKF9fQVdEX1RIUkVTSE9MRF9fKSA8PCAoKF9fQURDX1JFU09MVVRJT05fXykgPj4gKEFEQ19DRkdSX1JFU19CSVRPRkZTRVRfUE9TIC0gMVUgKSkpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGdldCB0aGUgdmFsdWUgb2YgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgaGlnaAorICAqICAgICAgICAgb3IgbG93IGluIGZ1bmN0aW9uIG9mIEFEQyByZXNvbHV0aW9uLCB3aGVuIEFEQyByZXNvbHV0aW9uIGlzIAorICAqICAgICAgICAgZGlmZmVyZW50IG9mIDEyIGJpdHMuCisgICogQG5vdGUgICBUbyBiZSB1c2VkIHdpdGggZnVuY3Rpb24gQHJlZiBMTF9BRENfR2V0QW5hbG9nV0RUaHJlc2hvbGRzKCkuCisgICogICAgICAgICBFeGFtcGxlLCB3aXRoIGEgQURDIHJlc29sdXRpb24gb2YgOCBiaXRzLCB0byBnZXQgdGhlIHZhbHVlIG9mCisgICogICAgICAgICBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkIGhpZ2ggKG9uIDggYml0cyk6CisgICogICAgICAgICAgIDwgdGhyZXNob2xkX3ZhbHVlXzZfYml0cyA+ID0gX19MTF9BRENfQU5BTE9HV0RfR0VUX1RIUkVTSE9MRF9SRVNPTFVUSU9OCisgICogICAgICAgICAgICAoTExfQURDX1JFU09MVVRJT05fOEIsCisgICogICAgICAgICAgICAgTExfQURDX0dldEFuYWxvZ1dEVGhyZXNob2xkcyg8QURDeCBwYXJhbT4sIExMX0FEQ19BV0RfVEhSRVNIT0xEX0hJR0gpCisgICogICAgICAgICAgICApOworICAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTJCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTBCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl82QgorICAqIEBwYXJhbSAgX19BV0RfVEhSRVNIT0xEXzEyX0JJVFNfXyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKi8KKyNkZWZpbmUgX19MTF9BRENfQU5BTE9HV0RfR0VUX1RIUkVTSE9MRF9SRVNPTFVUSU9OKF9fQURDX1JFU09MVVRJT05fXywgX19BV0RfVEhSRVNIT0xEXzEyX0JJVFNfXykgXAorICAoKF9fQVdEX1RIUkVTSE9MRF8xMl9CSVRTX18pID4+ICgoX19BRENfUkVTT0xVVElPTl9fKSA+PiAoQURDX0NGR1JfUkVTX0JJVE9GRlNFVF9QT1MgLSAxVSApKSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZ2V0IHRoZSBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZCBoaWdoCisgICogICAgICAgICBvciBsb3cgZnJvbSByYXcgdmFsdWUgY29udGFpbmluZyBib3RoIHRocmVzaG9sZHMgY29uY2F0ZW5hdGVkLgorICAqIEBub3RlICAgVG8gYmUgdXNlZCB3aXRoIGZ1bmN0aW9uIEByZWYgTExfQURDX0dldEFuYWxvZ1dEVGhyZXNob2xkcygpLgorICAqICAgICAgICAgRXhhbXBsZSwgdG8gZ2V0IGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgaGlnaCBmcm9tIHRoZSByZWdpc3RlciByYXcgdmFsdWU6CisgICogICAgICAgICAgIF9fTExfQURDX0FOQUxPR1dEX1RIUkVTSE9MRFNfSElHSF9MT1coTExfQURDX0FXRF9USFJFU0hPTERfSElHSCwgPHJhd192YWx1ZV93aXRoX2JvdGhfdGhyZXNob2xkcz4pOworICAqIEBwYXJhbSAgX19BV0RfVEhSRVNIT0xEX1RZUEVfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfVEhSRVNIT0xEX0hJR0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX1RIUkVTSE9MRF9MT1cKKyAgKiBAcGFyYW0gIF9fQVdEX1RIUkVTSE9MRFNfXyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwMDAwMDAgYW5kIE1heF9EYXRhPTB4RkZGRkZGRkYKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGCisgICovCisjZGVmaW5lIF9fTExfQURDX0FOQUxPR1dEX1RIUkVTSE9MRFNfSElHSF9MT1coX19BV0RfVEhSRVNIT0xEX1RZUEVfXywgX19BV0RfVEhSRVNIT0xEU19fKSAgICAgICBcCisgICgoKF9fQVdEX1RIUkVTSE9MRFNfXykgPj4gUE9TSVRJT05fVkFMKChfX0FXRF9USFJFU0hPTERfVFlQRV9fKSkpICYgTExfQURDX0FXRF9USFJFU0hPTERfTE9XKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBzZXQgdGhlIEFEQyBjYWxpYnJhdGlvbiB2YWx1ZSB3aXRoIGJvdGggc2luZ2xlIGVuZGVkCisgICogICAgICAgICBhbmQgZGlmZmVyZW50aWFsIG1vZGVzIGNhbGlicmF0aW9uIGZhY3RvcnMgY29uY2F0ZW5hdGVkLgorICAqIEBub3RlICAgVG8gYmUgdXNlZCB3aXRoIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldENhbGlicmF0aW9uRmFjdG9yKCkuCisgICogICAgICAgICBFeGFtcGxlLCB0byBzZXQgY2FsaWJyYXRpb24gZmFjdG9ycyBzaW5nbGUgZW5kZWQgdG8gMHg1NQorICAqICAgICAgICAgYW5kIGRpZmZlcmVudGlhbCBlbmRlZCB0byAweDJBOgorICAqICAgICAgICAgICBMTF9BRENfU2V0Q2FsaWJyYXRpb25GYWN0b3IoCisgICogICAgICAgICAgICAgQURDMSwKKyAgKiAgICAgICAgICAgICBfX0xMX0FEQ19DQUxJQl9GQUNUT1JfU0lOR0xFX0RJRkYoMHg1NSwgMHgyQSkpCisgICogQHBhcmFtICBfX0NBTElCX0ZBQ1RPUl9TSU5HTEVfRU5ERURfXyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4N0YKKyAgKiBAcGFyYW0gIF9fQ0FMSUJfRkFDVE9SX0RJRkZFUkVOVElBTF9fIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg3RgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMDAwMDAwIGFuZCBNYXhfRGF0YT0weEZGRkZGRkZGCisgICovCisjZGVmaW5lIF9fTExfQURDX0NBTElCX0ZBQ1RPUl9TSU5HTEVfRElGRihfX0NBTElCX0ZBQ1RPUl9TSU5HTEVfRU5ERURfXywgX19DQUxJQl9GQUNUT1JfRElGRkVSRU5USUFMX18pICAgICAgICBcCisgICgoKF9fQ0FMSUJfRkFDVE9SX0RJRkZFUkVOVElBTF9fKSA8PCBQT1NJVElPTl9WQUwoQURDX0NBTEZBQ1RfQ0FMRkFDVF9EKSkgfCAoX19DQUxJQl9GQUNUT1JfU0lOR0xFX0VOREVEX18pKQorCisjaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBnZXQgdGhlIEFEQyBtdWx0aW1vZGUgY29udmVyc2lvbiBkYXRhIG9mIEFEQyBtYXN0ZXIKKyAgKiAgICAgICAgIG9yIEFEQyBzbGF2ZSBmcm9tIHJhdyB2YWx1ZSB3aXRoIGJvdGggQURDIGNvbnZlcnNpb24gZGF0YSBjb25jYXRlbmF0ZWQuCisgICogQG5vdGUgICBUaGlzIG1hY3JvIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2hlbiBtdWx0aW1vZGUgdHJhbnNmZXIgYnkgRE1BCisgICogICAgICAgICBpcyBlbmFibGVkOiByZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRNdWx0aURNQVRyYW5zZmVyKCkuCisgICogICAgICAgICBJbiB0aGlzIGNhc2UgdGhlIHRyYW5zZmVycmVkIGRhdGEgbmVlZCB0byBwcm9jZXNzZWQgd2l0aCB0aGlzIG1hY3JvCisgICogICAgICAgICB0byBzZXBhcmF0ZSB0aGUgY29udmVyc2lvbiBkYXRhIG9mIEFEQyBtYXN0ZXIgYW5kIEFEQyBzbGF2ZS4KKyAgKiBAcGFyYW0gIF9fQURDX01VTFRJX01BU1RFUl9TTEFWRV9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9TTEFWRQorICAqIEBwYXJhbSAgX19BRENfTVVMVElfQ09OVl9EQVRBX18gVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGCisgICovCisjZGVmaW5lIF9fTExfQURDX01VTFRJX0NPTlZfREFUQV9NQVNURVJfU0xBVkUoX19BRENfTVVMVElfTUFTVEVSX1NMQVZFX18sIF9fQURDX01VTFRJX0NPTlZfREFUQV9fKSAgXAorICAoKChfX0FEQ19NVUxUSV9DT05WX0RBVEFfXykgPj4gUE9TSVRJT05fVkFMKChfX0FEQ19NVUxUSV9NQVNURVJfU0xBVkVfXykpKSAmIEFEQ19DRFJfUkRBVEFfTVNUKQorI2VuZGlmCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIHNlbGVjdCB0aGUgQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgdG8gd2hpY2ggaXMgYmVsb25naW5nIHRoZSBzZWxlY3RlZCBBREMgaW5zdGFuY2UuCisgICogQG5vdGUgICBBREMgY29tbW9uIHJlZ2lzdGVyIGluc3RhbmNlIGNhbiBiZSB1c2VkIGZvcjoKKyAgKiAgICAgICAgIC0gU2V0IHBhcmFtZXRlcnMgY29tbW9uIHRvIHNldmVyYWwgQURDIGluc3RhbmNlcworICAqICAgICAgICAgLSBNdWx0aW1vZGUgKGZvciBkZXZpY2VzIHdpdGggc2V2ZXJhbCBBREMgaW5zdGFuY2VzKQorICAqICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb25zIGhhdmluZyBhcmd1bWVudCAiQURDeHlfQ09NTU9OIiBhcyBwYXJhbWV0ZXIuCisgICogQHBhcmFtICBfX0FEQ3hfXyBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFEQyBjb21tb24gcmVnaXN0ZXIgaW5zdGFuY2UKKyAgKi8KKyNpZiBkZWZpbmVkKEFEQzMpICYmIGRlZmluZWQoQURDNCkKKyNkZWZpbmUgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKF9fQURDeF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKChfX0FEQ3hfXykgPT0gQURDMSkgfHwgKChfX0FEQ3hfXykgPT0gQURDMikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgID8gKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAoQURDMTJfQ09NTU9OKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKEFEQzM0X0NPTU1PTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorI2VsaWYgZGVmaW5lZChBREMxKSAmJiBkZWZpbmVkKEFEQzIpCisjZGVmaW5lIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRShfX0FEQ3hfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDMTJfQ09NTU9OKQorI2Vsc2UKKyNkZWZpbmUgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKF9fQURDeF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBREMxX0NPTU1PTikKKyNlbmRpZgorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjaGVjayBpZiBhbGwgQURDIGluc3RhbmNlcyBzaGFyaW5nIHRoZSBzYW1lCisgICogICAgICAgICBBREMgY29tbW9uIGluc3RhbmNlIGFyZSBkaXNhYmxlZC4KKyAgKiBAbm90ZSAgIFRoaXMgY2hlY2sgaXMgcmVxdWlyZWQgYnkgZnVuY3Rpb25zIHdpdGggc2V0dGluZyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQWxsIEFEQyBpbnN0YW5jZXMgb2YgdGhlIEFEQyBjb21tb24gZ3JvdXAgbXVzdCBiZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9ucyBoYXZpbmcgYXJndW1lbnQgIkFEQ3h5X0NPTU1PTiIgYXMgcGFyYW1ldGVyLgorICAqIEBub3RlICAgT24gZGV2aWNlcyB3aXRoIG9ubHkgMSBBREMgY29tbW9uIGluc3RhbmNlLCBwYXJhbWV0ZXIgb2YgdGhpcyBtYWNybworICAqICAgICAgICAgaXMgdXNlbGVzcyBhbmQgY2FuIGJlIGlnbm9yZWQgKHBhcmFtZXRlciBrZXB0IGZvciBjb21wYXRpYmlsaXR5CisgICogICAgICAgICB3aXRoIGRldmljZXMgZmVhdHVyaW5nIHNldmVyYWwgQURDIGNvbW1vbiBpbnN0YW5jZXMpLgorICAqIEBwYXJhbSAgX19BRENYWV9DT01NT05fXyBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEByZXR2YWwgVmFsdWUgIjAiIGlmIGFsbCBBREMgaW5zdGFuY2VzIHNoYXJpbmcgdGhlIHNhbWUgQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgYXJlIGRpc2FibGVkLgorICAqICAgICAgICAgVmFsdWUgIjEiIGlmIGF0IGxlYXN0IG9uZSBBREMgaW5zdGFuY2Ugc2hhcmluZyB0aGUgc2FtZSBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICBpcyBlbmFibGVkLgorICAqLworI2lmIGRlZmluZWQoQURDMykgJiYgZGVmaW5lZChBREM0KQorI2RlZmluZSBfX0xMX0FEQ19JU19FTkFCTEVEX0FMTF9DT01NT05fSU5TVEFOQ0UoX19BRENYWV9DT01NT05fXykgICAgICAgICAgICAgIFwKKyAgKCgoX19BRENYWV9DT01NT05fXykgPT0gQURDMTJfQ09NTU9OKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgPyAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIChMTF9BRENfSXNFbmFibGVkKEFEQzEpIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTExfQURDX0lzRW5hYmxlZChBREMyKSAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKExMX0FEQ19Jc0VuYWJsZWQoQURDMykgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBMTF9BRENfSXNFbmFibGVkKEFEQzQpICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKyNlbGlmIGRlZmluZWQoQURDMSkgJiYgZGVmaW5lZChBREMyKQorI2RlZmluZSBfX0xMX0FEQ19JU19FTkFCTEVEX0FMTF9DT01NT05fSU5TVEFOQ0UoX19BRENYWV9DT01NT05fXykgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19Jc0VuYWJsZWQoQURDMSkgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBMTF9BRENfSXNFbmFibGVkKEFEQzIpICApCisjZWxzZQorI2RlZmluZSBfX0xMX0FEQ19JU19FTkFCTEVEX0FMTF9DT01NT05fSU5TVEFOQ0UoX19BRENYWV9DT01NT05fXykgICAgICAgICAgICAgIFwKKyAgTExfQURDX0lzRW5hYmxlZChBREMxKQorI2VuZGlmCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGRlZmluZSB0aGUgQURDIGNvbnZlcnNpb24gZGF0YSBmdWxsLXNjYWxlIGRpZ2l0YWwKKyAgKiAgICAgICAgIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNlbGVjdGVkIEFEQyByZXNvbHV0aW9uLgorICAqIEBub3RlICAgQURDIGNvbnZlcnNpb24gZGF0YSBmdWxsLXNjYWxlIGNvcnJlc3BvbmRzIHRvIHZvbHRhZ2UgcmFuZ2UKKyAgKiAgICAgICAgIGRldGVybWluZWQgYnkgYW5hbG9nIHZvbHRhZ2UgcmVmZXJlbmNlcyBWcmVmKyBhbmQgVnJlZi0KKyAgKiAgICAgICAgIChyZWZlciB0byByZWZlcmVuY2UgbWFudWFsKS4KKyAgKiBAcGFyYW0gIF9fQURDX1JFU09MVVRJT05fXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEyQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEwQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzhCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fNkIKKyAgKiBAcmV0dmFsIEFEQyBjb252ZXJzaW9uIGRhdGEgZXF1aXZhbGVudCB2b2x0YWdlIHZhbHVlICh1bml0OiBtVm9sdCkKKyAgKi8KKyNkZWZpbmUgX19MTF9BRENfRElHSVRBTF9TQ0FMRShfX0FEQ19SRVNPTFVUSU9OX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKHVpbnQzMl90KTB4RkZGVSkgPj4gKChfX0FEQ19SRVNPTFVUSU9OX18pID4+IChBRENfQ0ZHUl9SRVNfQklUT0ZGU0VUX1BPUyAtIDFVKSkpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNvbnZlcnQgdGhlIEFEQyBjb252ZXJzaW9uIGRhdGEgZnJvbQorICAqICAgICAgICAgYSByZXNvbHV0aW9uIHRvIGFub3RoZXIgcmVzb2x1dGlvbi4KKyAgKiBAcGFyYW0gIF9fREFUQV9fIEFEQyBjb252ZXJzaW9uIGRhdGEgdG8gYmUgY29udmVydGVkIAorICAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9DVVJSRU5UX18gUmVzb2x1dGlvbiBvZiB0byB0aGUgZGF0YSB0byBiZSBjb252ZXJ0ZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTJCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTBCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl82QgorICAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9UQVJHRVRfXyBSZXNvbHV0aW9uIG9mIHRoZSBkYXRhIGFmdGVyIGNvbnZlcnNpb24KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTJCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTBCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl82QgorICAqIEByZXR2YWwgQURDIGNvbnZlcnNpb24gZGF0YSB0byB0aGUgcmVxdWVzdGVkIHJlc29sdXRpb24KKyAgKi8KKyNkZWZpbmUgX19MTF9BRENfQ09OVkVSVF9EQVRBX1JFU09MVVRJT04oX19EQVRBX18sXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0FEQ19SRVNPTFVUSU9OX0NVUlJFTlRfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQURDX1JFU09MVVRJT05fVEFSR0VUX18pICAgICAgICAgICAgXAorICAoKChfX0RBVEFfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA8PCAoKF9fQURDX1JFU09MVVRJT05fQ1VSUkVOVF9fKSA+PiAoQURDX0NGR1JfUkVTX0JJVE9GRlNFVF9QT1MgLSAxVSkpKSAgICBcCisgICA+PiAoKF9fQURDX1JFU09MVVRJT05fVEFSR0VUX18pID4+IChBRENfQ0ZHUl9SRVNfQklUT0ZGU0VUX1BPUyAtIDFVKSkgICAgICAgXAorICApCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNhbGN1bGF0ZSB0aGUgdm9sdGFnZSAodW5pdDogbVZvbHQpCisgICogICAgICAgICBjb3JyZXNwb25kaW5nIHRvIGEgQURDIGNvbnZlcnNpb24gZGF0YSAodW5pdDogZGlnaXRhbCB2YWx1ZSkuCisgICogQG5vdGUgICBBbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKFZyZWYrKSBtdXN0IGJlIGVpdGhlciBrbm93biBmcm9tCisgICogICAgICAgICB1c2VyIGJvYXJkIGVudmlyb25tZW50IG9yIGNhbiBiZSBjYWxjdWxhdGVkIHVzaW5nIEFEQyBtZWFzdXJlbWVudAorICAqICAgICAgICAgYW5kIEFEQyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DQUxDX1ZSRUZBTkFMT0dfVk9MVEFHRSgpLgorICAqIEBwYXJhbSAgX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyBBbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKHVuaXQ6IG1WKQorICAqIEBwYXJhbSAgX19BRENfREFUQV9fIEFEQyBjb252ZXJzaW9uIGRhdGEgKHJlc29sdXRpb24gMTIgYml0cykKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgKHVuaXQ6IGRpZ2l0YWwgdmFsdWUpLgorICAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTJCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTBCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl82QgorICAqIEByZXR2YWwgQURDIGNvbnZlcnNpb24gZGF0YSBlcXVpdmFsZW50IHZvbHRhZ2UgdmFsdWUgKHVuaXQ6IG1Wb2x0KQorICAqLworI2RlZmluZSBfX0xMX0FEQ19DQUxDX0RBVEFfVE9fVk9MVEFHRShfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BRENfREFUQV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BRENfUkVTT0xVVElPTl9fKSAgICAgICAgICAgICAgICAgICAgICBcCisgICgoX19BRENfREFUQV9fKSAqIChfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgLyBfX0xMX0FEQ19ESUdJVEFMX1NDQUxFKF9fQURDX1JFU09MVVRJT05fXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgYW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlIChWcmVmKykKKyAgKiAgICAgICAgICh1bml0OiBtVm9sdCkgZnJvbSBBREMgY29udmVyc2lvbiBkYXRhIG9mIGludGVybmFsIHZvbHRhZ2UKKyAgKiAgICAgICAgIHJlZmVyZW5jZSBWcmVmSW50LgorICAqIEBub3RlICAgQ29tcHV0YXRpb24gaXMgdXNpbmcgVnJlZkludCBjYWxpYnJhdGlvbiB2YWx1ZQorICAqICAgICAgICAgc3RvcmVkIGluIHN5c3RlbSBtZW1vcnkgZm9yIGVhY2ggZGV2aWNlIGR1cmluZyBwcm9kdWN0aW9uLgorICAqIEBub3RlICAgVGhpcyB2b2x0YWdlIGRlcGVuZHMgb24gdXNlciBib2FyZCBlbnZpcm9ubWVudDogdm9sdGFnZSBsZXZlbAorICAqICAgICAgICAgY29ubmVjdGVkIHRvIHBpbiBWcmVmKy4KKyAgKiAgICAgICAgIE9uIGRldmljZXMgd2l0aCBzbWFsbCBwYWNrYWdlLCB0aGUgcGluIFZyZWYrIGlzIG5vdCBwcmVzZW50CisgICogICAgICAgICBhbmQgaW50ZXJuYWxseSBib25kZWQgdG8gcGluIFZkZGEuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBjYWxpYnJhdGlvbiBkYXRhIG9mIGludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlCisgICogICAgICAgICBWcmVmSW50IGNvcnJlc3BvbmRzIHRvIGEgcmVzb2x1dGlvbiBvZiAxMiBiaXRzLAorICAqICAgICAgICAgdGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgQURDIHJlc29sdXRpb24gdG8gY29udmVydCB2b2x0YWdlIG9mCisgICogICAgICAgICBpbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZSBWcmVmSW50LgorICAqICAgICAgICAgT3RoZXJ3aXNlLCB0aGlzIG1hY3JvIHBlcmZvcm1zIHRoZSBwcm9jZXNzaW5nIHRvIHNjYWxlCisgICogICAgICAgICBBREMgY29udmVyc2lvbiBkYXRhIHRvIDEyIGJpdHMuCisgICogQHBhcmFtICBfX1ZSRUZJTlRfQURDX0RBVEFfXyBBREMgY29udmVyc2lvbiBkYXRhIChyZXNvbHV0aW9uIDEyIGJpdHMpCisgICogICAgICAgICBvZiBpbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZSBWcmVmSW50ICh1bml0OiBkaWdpdGFsIHZhbHVlKS4KKyAgKiBAcGFyYW0gIF9fQURDX1JFU09MVVRJT05fXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEyQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEwQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzhCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fNkIKKyAgKiBAcmV0dmFsIEFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAodW5pdDogbVYpCisgICovCisjZGVmaW5lIF9fTExfQURDX0NBTENfVlJFRkFOQUxPR19WT0xUQUdFKF9fVlJFRklOVF9BRENfREFUQV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BRENfUkVTT0xVVElPTl9fKSAgICAgICAgICAgICAgICAgICBcCisgICgoKHVpbnQzMl90KSgqVlJFRklOVF9DQUxfQUREUikgKiBWUkVGSU5UX0NBTF9WUkVGKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8gX19MTF9BRENfQ09OVkVSVF9EQVRBX1JFU09MVVRJT04oKF9fVlJFRklOVF9BRENfREFUQV9fKSwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0FEQ19SRVNPTFVUSU9OX18pLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9BRENfUkVTT0xVVElPTl8xMkIpICAgICAgICAgICAgICAgICAgXAorICApCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNhbGN1bGF0ZSB0aGUgdGVtcGVyYXR1cmUgKHVuaXQ6IGRlZ3JlZSBDZWxzaXVzKQorICAqICAgICAgICAgZnJvbSBBREMgY29udmVyc2lvbiBkYXRhIG9mIGludGVybmFsIHRlbXBlcmF0dXJlIHNlbnNvci4KKyAgKiBAbm90ZSAgIENvbXB1dGF0aW9uIGlzIHVzaW5nIHRlbXBlcmF0dXJlIHNlbnNvciBjYWxpYnJhdGlvbiB2YWx1ZXMKKyAgKiAgICAgICAgIHN0b3JlZCBpbiBzeXN0ZW0gbWVtb3J5IGZvciBlYWNoIGRldmljZSBkdXJpbmcgcHJvZHVjdGlvbi4KKyAgKiBAbm90ZSAgIENhbGN1bGF0aW9uIGZvcm11bGE6CisgICogICAgICAgICAgIFRlbXBlcmF0dXJlID0gKChUU19BRENfREFUQSAtIFRTX0NBTDEpCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAqIChUU19DQUwyX1RFTVAgLSBUU19DQUwxX1RFTVApKQorICAqICAgICAgICAgICAgICAgICAgICAgICAgIC8gKFRTX0NBTDIgLSBUU19DQUwxKSArIFRTX0NBTDFfVEVNUAorICAqICAgICAgICAgICB3aXRoIFRTX0FEQ19EQVRBID0gdGVtcGVyYXR1cmUgc2Vuc29yIHJhdyBkYXRhIG1lYXN1cmVkIGJ5IEFEQworICAqICAgICAgICAgICAgICAgIEF2Z19TbG9wZSA9IChUU19DQUwyIC0gVFNfQ0FMMSkKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChUU19DQUwyX1RFTVAgLSBUU19DQUwxX1RFTVApCisgICogICAgICAgICAgICAgICAgVFNfQ0FMMSAgID0gZXF1aXZhbGVudCBUU19BRENfREFUQSBhdCB0ZW1wZXJhdHVyZQorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVBfREVHQ19DQUwxIChjYWxpYnJhdGVkIGluIGZhY3RvcnkpCisgICogICAgICAgICAgICAgICAgVFNfQ0FMMiAgID0gZXF1aXZhbGVudCBUU19BRENfREFUQSBhdCB0ZW1wZXJhdHVyZQorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVBfREVHQ19DQUwyIChjYWxpYnJhdGVkIGluIGZhY3RvcnkpCisgICogICAgICAgICBDYXV0aW9uOiBDYWxjdWxhdGlvbiByZWxldmFuY3kgdW5kZXIgcmVzZXJ2ZSB0aGF0IGNhbGlicmF0aW9uCisgICogICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGFyZSBjb3JyZWN0IChhZGRyZXNzIGFuZCBkYXRhKS4KKyAgKiAgICAgICAgICAgICAgICAgIFRvIGNhbGN1bGF0ZSB0ZW1wZXJhdHVyZSB1c2luZyB0ZW1wZXJhdHVyZSBzZW5zb3IKKyAgKiAgICAgICAgICAgICAgICAgIGRhdGFzaGVldCB0eXBpY2FsIHZhbHVlcyAoZ2VuZXJpYyB2YWx1ZXMgbGVzcywgdGhlcmVmb3JlCisgICogICAgICAgICAgICAgICAgICBsZXNzIGFjY3VyYXRlIHRoYW4gY2FsaWJyYXRlZCB2YWx1ZXMpLAorICAqICAgICAgICAgICAgICAgICAgdXNlIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NBTENfVEVNUEVSQVRVUkVfVFlQX1BBUkFNUygpLgorICAqIEBub3RlICAgQXMgY2FsY3VsYXRpb24gaW5wdXQsIHRoZSBhbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKFZyZWYrKSBtdXN0IGJlCisgICogICAgICAgICBkZWZpbmVkIGFzIGl0IGltcGFjdHMgdGhlIEFEQyBMU0IgZXF1aXZhbGVudCB2b2x0YWdlLgorICAqIEBub3RlICAgQW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlIChWcmVmKykgbXVzdCBiZSBlaXRoZXIga25vd24gZnJvbQorICAqICAgICAgICAgdXNlciBib2FyZCBlbnZpcm9ubWVudCBvciBjYW4gYmUgY2FsY3VsYXRlZCB1c2luZyBBREMgbWVhc3VyZW1lbnQKKyAgKiAgICAgICAgIGFuZCBBREMgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0FMQ19WUkVGQU5BTE9HX1ZPTFRBR0UoKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIGNhbGlicmF0aW9uIGRhdGEgb2YgdGVtcGVyYXR1cmUgc2Vuc29yCisgICogICAgICAgICBjb3JyZXNwb25kcyB0byBhIHJlc29sdXRpb24gb2YgMTIgYml0cywKKyAgKiAgICAgICAgIHRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIEFEQyByZXNvbHV0aW9uIHRvIGNvbnZlcnQgdm9sdGFnZSBvZgorICAqICAgICAgICAgdGVtcGVyYXR1cmUgc2Vuc29yLgorICAqICAgICAgICAgT3RoZXJ3aXNlLCB0aGlzIG1hY3JvIHBlcmZvcm1zIHRoZSBwcm9jZXNzaW5nIHRvIHNjYWxlCisgICogICAgICAgICBBREMgY29udmVyc2lvbiBkYXRhIHRvIDEyIGJpdHMuCisgICogQHBhcmFtICBfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fICBBbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKHVuaXQ6IG1WKQorICAqIEBwYXJhbSAgX19URU1QU0VOU09SX0FEQ19EQVRBX18gQURDIGNvbnZlcnNpb24gZGF0YSBvZiBpbnRlcm5hbAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGVyYXR1cmUgc2Vuc29yICh1bml0OiBkaWdpdGFsIHZhbHVlKS4KKyAgKiBAcGFyYW0gIF9fQURDX1JFU09MVVRJT05fXyAgICAgIEFEQyByZXNvbHV0aW9uIGF0IHdoaWNoIGludGVybmFsIHRlbXBlcmF0dXJlCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zb3Igdm9sdGFnZSBoYXMgYmVlbiBtZWFzdXJlZC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTJCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTBCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl82QgorICAqIEByZXR2YWwgVGVtcGVyYXR1cmUgKHVuaXQ6IGRlZ3JlZSBDZWxzaXVzKQorICAqLworI2RlZmluZSBfX0xMX0FEQ19DQUxDX1RFTVBFUkFUVVJFKF9fVlJFRkFOQUxPR19WT0xUQUdFX18sXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fVEVNUFNFTlNPUl9BRENfREFUQV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0FEQ19SRVNPTFVUSU9OX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoICgoaW50MzJfdCkoKF9fTExfQURDX0NPTlZFUlRfREFUQV9SRVNPTFVUSU9OKChfX1RFTVBTRU5TT1JfQURDX0RBVEFfXyksICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fQURDX1JFU09MVVRJT05fXyksICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9BRENfUkVTT0xVVElPTl8xMkIpICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICogKF9fVlJFRkFOQUxPR19WT0xUQUdFX18pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAvIFRFTVBTRU5TT1JfQ0FMX1ZSRUZBTkFMT0cpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLSAoaW50MzJfdCkgKlRFTVBTRU5TT1JfQ0FMMV9BRERSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICApICogKGludDMyX3QpKFRFTVBTRU5TT1JfQ0FMMl9URU1QIC0gVEVNUFNFTlNPUl9DQUwxX1RFTVApICAgICAgICAgICAgICAgICAgICBcCisgICAgKSAvIChpbnQzMl90KSgoaW50MzJfdCkqVEVNUFNFTlNPUl9DQUwyX0FERFIgLSAoaW50MzJfdCkqVEVNUFNFTlNPUl9DQUwxX0FERFIpIFwKKyAgICkgKyBURU1QU0VOU09SX0NBTDFfVEVNUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNhbGN1bGF0ZSB0aGUgdGVtcGVyYXR1cmUgKHVuaXQ6IGRlZ3JlZSBDZWxzaXVzKQorICAqICAgICAgICAgZnJvbSBBREMgY29udmVyc2lvbiBkYXRhIG9mIGludGVybmFsIHRlbXBlcmF0dXJlIHNlbnNvci4KKyAgKiBAbm90ZSAgIENvbXB1dGF0aW9uIGlzIHVzaW5nIHRlbXBlcmF0dXJlIHNlbnNvciB0eXBpY2FsIHZhbHVlcworICAqICAgICAgICAgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQpLgorICAqIEBub3RlICAgQ2FsY3VsYXRpb24gZm9ybXVsYToKKyAgKiAgICAgICAgICAgVGVtcGVyYXR1cmUgPSAoVFNfVFlQX0NBTHhfVk9MVCh1VikgLSBUU19BRENfREFUQSAqIENvbnZlcnNpb25fdVYpCisgICogICAgICAgICAgICAgICAgICAgICAgICAgLyBBdmdfU2xvcGUgKyBDQUx4X1RFTVAKKyAgKiAgICAgICAgICAgd2l0aCBUU19BRENfREFUQSAgICAgID0gdGVtcGVyYXR1cmUgc2Vuc29yIHJhdyBkYXRhIG1lYXN1cmVkIGJ5IEFEQworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5pdDogZGlnaXRhbCB2YWx1ZSkKKyAgKiAgICAgICAgICAgICAgICBBdmdfU2xvcGUgICAgICAgID0gdGVtcGVyYXR1cmUgc2Vuc29yIHNsb3BlCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bml0OiB1Vi9EZWdyZWUgQ2Vsc2l1cykKKyAgKiAgICAgICAgICAgICAgICBUU19UWVBfQ0FMeF9WT0xUID0gdGVtcGVyYXR1cmUgc2Vuc29yIGRpZ2l0YWwgdmFsdWUgYXQKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGVyYXR1cmUgQ0FMeF9URU1QICh1bml0OiBtVikKKyAgKiAgICAgICAgIENhdXRpb246IENhbGN1bGF0aW9uIHJlbGV2YW5jeSB1bmRlciByZXNlcnZlIHRoZSB0ZW1wZXJhdHVyZSBzZW5zb3IKKyAgKiAgICAgICAgICAgICAgICAgIG9mIHRoZSBjdXJyZW50IGRldmljZSBoYXMgY2hhcmFjdGVyaXN0aWNzIGluIGxpbmUgd2l0aAorICAqICAgICAgICAgICAgICAgICAgZGF0YXNoZWV0IHR5cGljYWwgdmFsdWVzLgorICAqICAgICAgICAgICAgICAgICAgSWYgdGVtcGVyYXR1cmUgc2Vuc29yIGNhbGlicmF0aW9uIHZhbHVlcyBhcmUgYXZhaWxhYmxlIG9uCisgICogICAgICAgICAgICAgICAgICBvbiB0aGlzIGRldmljZSAocHJlc2VuY2Ugb2YgbWFjcm8gX19MTF9BRENfQ0FMQ19URU1QRVJBVFVSRSgpKSwKKyAgKiAgICAgICAgICAgICAgICAgIHRlbXBlcmF0dXJlIGNhbGN1bGF0aW9uIHdpbGwgYmUgbW9yZSBhY2N1cmF0ZSB1c2luZworICAqICAgICAgICAgICAgICAgICAgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0FMQ19URU1QRVJBVFVSRSgpLgorICAqIEBub3RlICAgQXMgY2FsY3VsYXRpb24gaW5wdXQsIHRoZSBhbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKFZyZWYrKSBtdXN0IGJlCisgICogICAgICAgICBkZWZpbmVkIGFzIGl0IGltcGFjdHMgdGhlIEFEQyBMU0IgZXF1aXZhbGVudCB2b2x0YWdlLgorICAqIEBub3RlICAgQW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlIChWcmVmKykgbXVzdCBiZSBlaXRoZXIga25vd24gZnJvbQorICAqICAgICAgICAgdXNlciBib2FyZCBlbnZpcm9ubWVudCBvciBjYW4gYmUgY2FsY3VsYXRlZCB1c2luZyBBREMgbWVhc3VyZW1lbnQKKyAgKiAgICAgICAgIGFuZCBBREMgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0FMQ19WUkVGQU5BTE9HX1ZPTFRBR0UoKS4KKyAgKiBAbm90ZSAgIEFEQyBtZWFzdXJlbWVudCBkYXRhIG11c3QgY29ycmVzcG9uZCB0byBhIHJlc29sdXRpb24gb2YgMTJiaXRzCisgICogICAgICAgICAoZnVsbCBzY2FsZSBkaWdpdGFsIHZhbHVlIDQwOTUpLiBJZiBub3QgdGhlIGNhc2UsIHRoZSBkYXRhIG11c3QgYmUKKyAgKiAgICAgICAgIHByZWxpbWluYXJpbHkgcmVzY2FsZWQgdG8gYW4gZXF1aXZhbGVudCByZXNvbHV0aW9uIG9mIDEyIGJpdHMuCisgICogQHBhcmFtICBfX1RFTVBTRU5TT1JfVFlQX0FWR1NMT1BFX18gICBEZXZpY2UgZGF0YXNoZWV0IGRhdGE6IFRlbXBlcmF0dXJlIHNlbnNvciBzbG9wZSB0eXBpY2FsIHZhbHVlICh1bml0OiB1Vi9EZWdDZWxzaXVzKS4KKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uIFNUTTMyRjMsIHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgcGFyYW1ldGVyICJBdmdfU2xvcGUiLgorICAqIEBwYXJhbSAgX19URU1QU0VOU09SX1RZUF9DQUxYX1ZfXyAgICAgRGV2aWNlIGRhdGFzaGVldCBkYXRhOiBUZW1wZXJhdHVyZSBzZW5zb3Igdm9sdGFnZSB0eXBpY2FsIHZhbHVlIChhdCB0ZW1wZXJhdHVyZSBhbmQgVnJlZisgZGVmaW5lZCBpbiBwYXJhbWV0ZXJzIGJlbG93KSAodW5pdDogbVYpLgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gU1RNMzJGMywgcmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBwYXJhbWV0ZXIgIlYyNSIgKGNvcnJlc3BvbmRpbmcgdG8gVFNfQ0FMMSkuCisgICogQHBhcmFtICBfX1RFTVBTRU5TT1JfQ0FMWF9URU1QX18gICAgICBEZXZpY2UgZGF0YXNoZWV0IGRhdGE6IFRlbXBlcmF0dXJlIGF0IHdoaWNoIHRlbXBlcmF0dXJlIHNlbnNvciB2b2x0YWdlIChzZWUgcGFyYW1ldGVyIGFib3ZlKSBpcyBjb3JyZXNwb25kaW5nICh1bml0OiBtVikKKyAgKiBAcGFyYW0gIF9fVlJFRkFOQUxPR19WT0xUQUdFX18gICAgICAgIEFuYWxvZyB2b2x0YWdlIHJlZmVyZW5jZSAoVnJlZispIHZvbHRhZ2UgKHVuaXQ6IG1WKQorICAqIEBwYXJhbSAgX19URU1QU0VOU09SX0FEQ19EQVRBX18gICAgICAgQURDIGNvbnZlcnNpb24gZGF0YSBvZiBpbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IgKHVuaXQ6IGRpZ2l0YWwgdmFsdWUpLgorICAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9fICAgICAgICAgICAgQURDIHJlc29sdXRpb24gYXQgd2hpY2ggaW50ZXJuYWwgdGVtcGVyYXR1cmUgc2Vuc29yIHZvbHRhZ2UgaGFzIGJlZW4gbWVhc3VyZWQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEyQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEwQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzhCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fNkIKKyAgKiBAcmV0dmFsIFRlbXBlcmF0dXJlICh1bml0OiBkZWdyZWUgQ2Vsc2l1cykKKyAgKi8KKyNkZWZpbmUgX19MTF9BRENfQ0FMQ19URU1QRVJBVFVSRV9UWVBfUEFSQU1TKF9fVEVNUFNFTlNPUl9UWVBfQVZHU0xPUEVfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1RFTVBTRU5TT1JfVFlQX0NBTFhfVl9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fVEVNUFNFTlNPUl9DQUxYX1RFTVBfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fVEVNUFNFTlNPUl9BRENfREFUQV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQURDX1JFU09MVVRJT05fXykgICAgICAgICAgICAgICBcCisgICgoKCAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIChpbnQzMl90KSgoKF9fVEVNUFNFTlNPUl9UWVBfQ0FMWF9WX18pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgKiAxMDAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIChpbnQzMl90KSgoKChfX1RFTVBTRU5TT1JfQURDX0RBVEFfXykgKiAoX19WUkVGQU5BTE9HX1ZPTFRBR0VfXykpICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIC8gX19MTF9BRENfRElHSVRBTF9TQ0FMRShfX0FEQ19SRVNPTFVUSU9OX18pKSAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICogMTAwMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApIC8gKF9fVEVNUFNFTlNPUl9UWVBfQVZHU0xPUEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICApICsgKF9fVEVNUFNFTlNPUl9DQUxYX1RFTVBfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBBREMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUZfRE1BX01hbmFnZW1lbnQgQURDIERNQSBtYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKy8qIE5vdGU6IExMIEFEQyBmdW5jdGlvbnMgdG8gc2V0IERNQSB0cmFuc2ZlciBhcmUgbG9jYXRlZCBpbnRvIHNlY3Rpb25zIG9mICAgICovCisvKiAgICAgICBjb25maWd1cmF0aW9uIG9mIEFEQyBpbnN0YW5jZSwgZ3JvdXBzIGFuZCBtdWx0aW1vZGUgKGlmIGF2YWlsYWJsZSk6ICAqLworLyogICAgICAgQHJlZiBMTF9BRENfUkVHX1NldERNQVRyYW5zZmVyKCksIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyoqCisgICogQGJyaWVmICBGdW5jdGlvbiB0byBoZWxwIHRvIGNvbmZpZ3VyZSBETUEgdHJhbnNmZXIgZnJvbSBBREM6IHJldHJpZXZlIHRoZQorICAqICAgICAgICAgQURDIHJlZ2lzdGVyIGFkZHJlc3MgZnJvbSBBREMgaW5zdGFuY2UgYW5kIGEgbGlzdCBvZiBBREMgcmVnaXN0ZXJzCisgICogICAgICAgICBpbnRlbmRlZCB0byBiZSB1c2VkIChtb3N0IGNvbW1vbmx5KSB3aXRoIERNQSB0cmFuc2Zlci4KKyAgKiBAbm90ZSAgIFRoZXNlIEFEQyByZWdpc3RlcnMgYXJlIGRhdGEgcmVnaXN0ZXJzOgorICAqICAgICAgICAgd2hlbiBBREMgY29udmVyc2lvbiBkYXRhIGlzIGF2YWlsYWJsZSBpbiBBREMgZGF0YSByZWdpc3RlcnMsCisgICogICAgICAgICBBREMgZ2VuZXJhdGVzIGEgRE1BIHRyYW5zZmVyIHJlcXVlc3QuCisgICogQG5vdGUgICBUaGlzIG1hY3JvIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBMTCBETUEgZHJpdmVyLCByZWZlciB0bworICAqICAgICAgICAgZnVuY3Rpb24gIkxMX0RNQV9Db25maWdBZGRyZXNzZXMoKSIuCisgICogICAgICAgICBFeGFtcGxlOgorICAqICAgICAgICAgICBMTF9ETUFfQ29uZmlnQWRkcmVzc2VzKERNQTEsCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfRE1BX0NIQU5ORUxfMSwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9BRENfRE1BX0dldFJlZ0FkZHIoQURDMSwgTExfQURDX0RNQV9SRUdfUkVHVUxBUl9EQVRBKSwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJjwgYXJyYXkgb3IgdmFyaWFibGUgPiwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9ETUFfRElSRUNUSU9OX1BFUklQSF9UT19NRU1PUlkpOworICAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQzogaW4gbXVsdGltb2RlLCBzb21lIGRldmljZXMKKyAgKiAgICAgICAgIHVzZSBhIGRpZmZlcmVudCBkYXRhIHJlZ2lzdGVyIG91dHNpZGUgb2YgQURDIGluc3RhbmNlIHNjb3BlCisgICogICAgICAgICAoY29tbW9uIGRhdGEgcmVnaXN0ZXIpLiBUaGlzIG1hY3JvIG1hbmFnZXMgdGhpcyByZWdpc3RlciBkaWZmZXJlbmNlLAorICAqICAgICAgICAgb25seSBBREMgaW5zdGFuY2UgaGFzIHRvIGJlIHNldCBhcyBwYXJhbWV0ZXIuCisgICogQHJtdG9sbCBEUiAgICAgICBSREFUQSAgICAgICAgICBMTF9BRENfRE1BX0dldFJlZ0FkZHJcbgorICAqICAgICAgICAgQ0RSICAgICAgUkRBVEFfTVNUICAgICAgTExfQURDX0RNQV9HZXRSZWdBZGRyXG4KKyAgKiAgICAgICAgIENEUiAgICAgIFJEQVRBX1NMViAgICAgIExMX0FEQ19ETUFfR2V0UmVnQWRkcgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJlZ2lzdGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0RNQV9SRUdfUkVHVUxBUl9EQVRBCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0RNQV9SRUdfUkVHVUxBUl9EQVRBX01VTFRJICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgQXZhaWxhYmxlIG9uIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQyBpbnN0YW5jZXMuCisgICogQHJldHZhbCBBREMgcmVnaXN0ZXIgYWRkcmVzcworICAqLworI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQorX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19ETUFfR2V0UmVnQWRkcihBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgUmVnaXN0ZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGRhdGFfcmVnX2FkZHIgPSAwVTsKKyAgCisgIGlmIChSZWdpc3RlciA9PSBMTF9BRENfRE1BX1JFR19SRUdVTEFSX0RBVEEpCisgIHsKKyAgICAvKiBSZXRyaWV2ZSBhZGRyZXNzIG9mIHJlZ2lzdGVyIERSICovCisgICAgZGF0YV9yZWdfYWRkciA9ICh1aW50MzJfdCkmKEFEQ3gtPkRSKTsKKyAgfQorICBlbHNlIC8qIChSZWdpc3RlciA9PSBMTF9BRENfRE1BX1JFR19SRUdVTEFSX0RBVEFfTVVMVEkpICovCisgIHsKKyAgICAvKiBSZXRyaWV2ZSBhZGRyZXNzIG9mIHJlZ2lzdGVyIENEUiAqLworICAgIGRhdGFfcmVnX2FkZHIgPSAodWludDMyX3QpJigoX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKEFEQ3gpKS0+Q0RSKTsKKyAgfQorICAKKyAgcmV0dXJuIGRhdGFfcmVnX2FkZHI7Cit9CisjZWxzZQorX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19ETUFfR2V0UmVnQWRkcihBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgUmVnaXN0ZXIpCit7CisgIC8qIFJldHJpZXZlIGFkZHJlc3Mgb2YgcmVnaXN0ZXIgRFIgKi8KKyAgcmV0dXJuICh1aW50MzJfdCkmKEFEQ3gtPkRSKTsKK30KKyNlbmRpZgorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0FEQ19Db21tb24gQ29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiBjb21tb24gdG8gc2V2ZXJhbCBBREMgaW5zdGFuY2VzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgcGFyYW1ldGVyIGNvbW1vbiB0byBzZXZlcmFsIEFEQzogQ2xvY2sgc291cmNlIGFuZCBwcmVzY2FsZXIuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBpZiBBREMgZ3JvdXAgaW5qZWN0ZWQgaXMgdXNlZCwgc29tZQorICAqICAgICAgICAgY2xvY2sgcmF0aW8gY29uc3RyYWludHMgYmV0d2VlbiBBREMgY2xvY2sgYW5kIEFIQiBjbG9jaworICAqICAgICAgICAgbXVzdCBiZSByZXNwZWN0ZWQuCisgICogICAgICAgICBSZWZlciB0byByZWZlcmVuY2UgbWFudWFsLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFsbCBBREMgaW5zdGFuY2VzIG9mIHRoZSBBREMgY29tbW9uIGdyb3VwIG11c3QgYmUgZGlzYWJsZWQuCisgICogICAgICAgICBUaGlzIGNoZWNrIGNhbiBiZSBkb25lIHdpdGggZnVuY3Rpb24gQHJlZiBMTF9BRENfSXNFbmFibGVkKCkgZm9yIGVhY2gKKyAgKiAgICAgICAgIEFEQyBpbnN0YW5jZSBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8gaGVscGVyIG1hY3JvCisgICogICAgICAgICBAcmVmIF9fTExfQURDX0lTX0VOQUJMRURfQUxMX0NPTU1PTl9JTlNUQU5DRSgpLgorICAqIEBybXRvbGwgQ0NSICAgICAgQ0tNT0RFICAgICAgICAgTExfQURDX1NldENvbW1vbkNsb2NrXG4KKyAgKiAgICAgICAgIENDUiAgICAgIFBSRVNDICAgICAgICAgIExMX0FEQ19TZXRDb21tb25DbG9jaworICAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgICogQHBhcmFtICBDb21tb25DbG9jayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19TWU5DX1BDTEtfRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19TWU5DX1BDTEtfRElWMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19TWU5DX1BDTEtfRElWNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYxCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0Q29tbW9uQ2xvY2soQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04sIHVpbnQzMl90IENvbW1vbkNsb2NrKQoreworICBNT0RJRllfUkVHKEFEQ3h5X0NPTU1PTi0+Q0NSLCBBRENfQ0NSX0NLTU9ERSwgQ29tbW9uQ2xvY2spOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBwYXJhbWV0ZXIgY29tbW9uIHRvIHNldmVyYWwgQURDOiBDbG9jayBzb3VyY2UgYW5kIHByZXNjYWxlci4KKyAgKiBAcm10b2xsIENDUiAgICAgIENLTU9ERSAgICAgICAgIExMX0FEQ19HZXRDb21tb25DbG9ja1xuCisgICogICAgICAgICBDQ1IgICAgICBQUkVTQyAgICAgICAgICBMTF9BRENfR2V0Q29tbW9uQ2xvY2sKKyAgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRDb21tb25DbG9jayhBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTikKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeHlfQ09NTU9OLT5DQ1IsIEFEQ19DQ1JfQ0tNT0RFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHBhcmFtZXRlciBjb21tb24gdG8gc2V2ZXJhbCBBREM6IG1lYXN1cmVtZW50IHBhdGggdG8gaW50ZXJuYWwKKyAgKiAgICAgICAgIGNoYW5uZWxzIChWcmVmSW50LCB0ZW1wZXJhdHVyZSBzZW5zb3IsIC4uLikuCisgICogQG5vdGUgICBPbmUgb3Igc2V2ZXJhbCB2YWx1ZXMgY2FuIGJlIHNlbGVjdGVkLgorICAqICAgICAgICAgRXhhbXBsZTogKExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZSRUZJTlQgfAorICAqICAgICAgICAgICAgICAgICAgIExMX0FEQ19QQVRIX0lOVEVSTkFMX1RFTVBTRU5TT1IpCisgICogQG5vdGUgICBTdGFiaWxpemF0aW9uIHRpbWUgb2YgbWVhc3VyZW1lbnQgcGF0aCB0byBpbnRlcm5hbCBjaGFubmVsOgorICAqICAgICAgICAgQWZ0ZXIgZW5hYmxpbmcgaW50ZXJuYWwgcGF0aHMsIGJlZm9yZSBzdGFydGluZyBBREMgY29udmVyc2lvbiwKKyAgKiAgICAgICAgIGEgZGVsYXkgaXMgcmVxdWlyZWQgZm9yIGludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlIGFuZAorICAqICAgICAgICAgdGVtcGVyYXR1cmUgc2Vuc29yIHN0YWJpbGl6YXRpb24gdGltZS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQuCisgICogICAgICAgICBSZWZlciB0byBsaXRlcmFsIEByZWYgTExfQURDX0RFTEFZX1ZSRUZJTlRfU1RBQl9VUy4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGxpdGVyYWwgQHJlZiBMTF9BRENfREVMQVlfVEVNUFNFTlNPUl9TVEFCX1VTLgorICAqIEBub3RlICAgQURDIGludGVybmFsIGNoYW5uZWwgc2FtcGxpbmcgdGltZSBjb25zdHJhaW50OgorICAqICAgICAgICAgRm9yIEFEQyBjb252ZXJzaW9uIG9mIGludGVybmFsIGNoYW5uZWxzLAorICAqICAgICAgICAgYSBzYW1wbGluZyB0aW1lIG1pbmltdW0gdmFsdWUgaXMgcmVxdWlyZWQuCisgICogICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFsbCBBREMgaW5zdGFuY2VzIG9mIHRoZSBBREMgY29tbW9uIGdyb3VwIG11c3QgYmUgZGlzYWJsZWQuCisgICogICAgICAgICBUaGlzIGNoZWNrIGNhbiBiZSBkb25lIHdpdGggZnVuY3Rpb24gQHJlZiBMTF9BRENfSXNFbmFibGVkKCkgZm9yIGVhY2gKKyAgKiAgICAgICAgIEFEQyBpbnN0YW5jZSBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8gaGVscGVyIG1hY3JvCisgICogICAgICAgICBAcmVmIF9fTExfQURDX0lTX0VOQUJMRURfQUxMX0NPTU1PTl9JTlNUQU5DRSgpLgorICAqIEBybXRvbGwgQ0NSICAgICAgVlJFRkVOICAgICAgICAgTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoXG4KKyAgKiAgICAgICAgIENDUiAgICAgIFRTRU4gICAgICAgICAgIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaFxuCisgICogICAgICAgICBDQ1IgICAgICBWQkFURU4gICAgICAgICBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2gKKyAgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEBwYXJhbSAgUGF0aEludGVybmFsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19QQVRIX0lOVEVSTkFMX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUEFUSF9JTlRFUk5BTF9WUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1BBVEhfSU5URVJOQUxfVEVNUFNFTlNPUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZCQVQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaChBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTiwgdWludDMyX3QgUGF0aEludGVybmFsKQoreworICBNT0RJRllfUkVHKEFEQ3h5X0NPTU1PTi0+Q0NSLCBBRENfQ0NSX1ZSRUZFTiB8IEFEQ19DQ1JfVFNFTiB8IEFEQ19DQ1JfVkJBVEVOLCBQYXRoSW50ZXJuYWwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBwYXJhbWV0ZXIgY29tbW9uIHRvIHNldmVyYWwgQURDOiBtZWFzdXJlbWVudCBwYXRoIHRvIGludGVybmFsCisgICogICAgICAgICBjaGFubmVscyAoVnJlZkludCwgdGVtcGVyYXR1cmUgc2Vuc29yLCAuLi4pLgorICAqIEBub3RlICAgT25lIG9yIHNldmVyYWwgdmFsdWVzIGNhbiBiZSBzZWxlY3RlZC4KKyAgKiAgICAgICAgIEV4YW1wbGU6IChMTF9BRENfUEFUSF9JTlRFUk5BTF9WUkVGSU5UIHwKKyAgKiAgICAgICAgICAgICAgICAgICBMTF9BRENfUEFUSF9JTlRFUk5BTF9URU1QU0VOU09SKQorICAqIEBybXRvbGwgQ0NSICAgICAgVlJFRkVOICAgICAgICAgTExfQURDX0dldENvbW1vblBhdGhJbnRlcm5hbENoXG4KKyAgKiAgICAgICAgIENDUiAgICAgIFRTRU4gICAgICAgICAgIExMX0FEQ19HZXRDb21tb25QYXRoSW50ZXJuYWxDaFxuCisgICogICAgICAgICBDQ1IgICAgICBWQkFURU4gICAgICAgICBMTF9BRENfR2V0Q29tbW9uUGF0aEludGVybmFsQ2gKKyAgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1BBVEhfSU5URVJOQUxfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZSRUZJTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUEFUSF9JTlRFUk5BTF9URU1QU0VOU09SCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1BBVEhfSU5URVJOQUxfVkJBVAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRDb21tb25QYXRoSW50ZXJuYWxDaChBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTikKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeHlfQ09NTU9OLT5DQ1IsIEFEQ19DQ1JfVlJFRkVOIHwgQURDX0NDUl9UU0VOIHwgQURDX0NDUl9WQkFURU4pKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUZfQ29uZmlndXJhdGlvbl9BRENfSW5zdGFuY2UgQ29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiBBREMgaW5zdGFuY2UKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgY2FsaWJyYXRpb24gZmFjdG9yIGluIHRoZSBtb2RlIHNpbmdsZS1lbmRlZAorICAqICAgICAgICAgb3IgZGlmZmVyZW50aWFsIChmb3IgZGV2aWNlcyB3aXRoIGRpZmZlcmVudGlhbCBtb2RlIGF2YWlsYWJsZSkuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIHNldCBjYWxpYnJhdGlvbiBwYXJhbWV0ZXJzCisgICogICAgICAgICB3aXRob3V0IGhhdmluZyB0byBwZXJmb3JtIGEgbmV3IGNhbGlicmF0aW9uIHVzaW5nCisgICogICAgICAgICBAcmVmIExMX0FEQ19TdGFydENhbGlicmF0aW9uKCkuCisgICogQG5vdGUgICBGb3IgZGV2aWNlcyB3aXRoIGRpZmZlcmVudGlhbCBtb2RlIGF2YWlsYWJsZToKKyAgKiAgICAgICAgIENhbGlicmF0aW9uIG9mIG9mZnNldCBpcyBzcGVjaWZpYyB0byBlYWNoIG9mCisgICogICAgICAgICBzaW5nbGUtZW5kZWQgYW5kIGRpZmZlcmVudGlhbCBtb2RlcworICAqICAgICAgICAgKGNhbGlicmF0aW9uIGZhY3RvciBtdXN0IGJlIHNwZWNpZmllZCBmb3IgZWFjaCBvZiB0aGVzZQorICAqICAgICAgICAgZGlmZmVyZW50aWFsIG1vZGVzLCBpZiB1c2VkIGFmdGVyd2FyZHMgYW5kIGlmIHRoZSBhcHBsaWNhdGlvbgorICAqICAgICAgICAgcmVxdWlyZXMgdGhlaXIgY2FsaWJyYXRpb24pLgorICAqIEBub3RlICAgSW4gY2FzZSBvZiBzZXR0aW5nIGNhbGlicmF0aW9uIGZhY3RvcnMgb2YgYm90aCBtb2RlcyBzaW5nbGUgZW5kZWQKKyAgKiAgICAgICAgIGFuZCBkaWZmZXJlbnRpYWwgKHBhcmFtZXRlciBMTF9BRENfQk9USF9TSU5HTEVfRElGRl9FTkRFRCk6CisgICogICAgICAgICBib3RoIGNhbGlicmF0aW9uIGZhY3RvcnMgbXVzdCBiZSBjb25jYXRlbmF0ZWQuCisgICogICAgICAgICBUbyBwZXJmb3JtIHRoaXMgcHJvY2Vzc2luZywgdXNlIGhlbHBlciBtYWNybworICAqICAgICAgICAgQHJlZiBfX0xMX0FEQ19DQUxJQl9GQUNUT1JfU0lOR0xFX0RJRkYoKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBlbmFibGVkLCB3aXRob3V0IGNhbGlicmF0aW9uIG9uIGdvaW5nLCB3aXRob3V0IGNvbnZlcnNpb24KKyAgKiAgICAgICAgIG9uIGdvaW5nIG9uIGdyb3VwIHJlZ3VsYXIuCisgICogQHJtdG9sbCBDQUxGQUNUICBDQUxGQUNUX1MgICAgICBMTF9BRENfU2V0Q2FsaWJyYXRpb25GYWN0b3JcbgorICAqICAgICAgICAgQ0FMRkFDVCAgQ0FMRkFDVF9EICAgICAgTExfQURDX1NldENhbGlicmF0aW9uRmFjdG9yCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgU2luZ2xlRGlmZiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TSU5HTEVfRU5ERUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfRElGRkVSRU5USUFMX0VOREVECisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0JPVEhfU0lOR0xFX0RJRkZfRU5ERUQKKyAgKiBAcGFyYW0gIENhbGlicmF0aW9uRmFjdG9yIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg3RgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldENhbGlicmF0aW9uRmFjdG9yKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBTaW5nbGVEaWZmLCB1aW50MzJfdCBDYWxpYnJhdGlvbkZhY3RvcikKK3sKKyAgTU9ESUZZX1JFRyhBREN4LT5DQUxGQUNULAorICAgICAgICAgICAgIFNpbmdsZURpZmYgJiBBRENfU0lOR0xFRElGRl9DQUxJQl9GQUNUT1JfTUFTSywKKyAgICAgICAgICAgICBDYWxpYnJhdGlvbkZhY3RvciA8PCBQT1NJVElPTl9WQUwoU2luZ2xlRGlmZiAmIEFEQ19TSU5HTEVESUZGX0NBTElCX0ZBQ1RPUl9NQVNLKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBjYWxpYnJhdGlvbiBmYWN0b3IgaW4gdGhlIG1vZGUgc2luZ2xlLWVuZGVkCisgICogICAgICAgICBvciBkaWZmZXJlbnRpYWwgKGZvciBkZXZpY2VzIHdpdGggZGlmZmVyZW50aWFsIG1vZGUgYXZhaWxhYmxlKS4KKyAgKiBAbm90ZSAgIENhbGlicmF0aW9uIGZhY3RvcnMgYXJlIHNldCBieSBoYXJkd2FyZSBhZnRlciBwZXJmb3JtaW5nCisgICogICAgICAgICBhIGNhbGlicmF0aW9uIHJ1biB1c2luZyBmdW5jdGlvbiBAcmVmIExMX0FEQ19TdGFydENhbGlicmF0aW9uKCkuCisgICogQG5vdGUgICBGb3IgZGV2aWNlcyB3aXRoIGRpZmZlcmVudGlhbCBtb2RlIGF2YWlsYWJsZToKKyAgKiAgICAgICAgIENhbGlicmF0aW9uIG9mIG9mZnNldCBpcyBzcGVjaWZpYyB0byBlYWNoIG9mCisgICogICAgICAgICBzaW5nbGUtZW5kZWQgYW5kIGRpZmZlcmVudGlhbCBtb2RlcworICAqIEBybXRvbGwgQ0FMRkFDVCAgQ0FMRkFDVF9TICAgICAgTExfQURDX0dldENhbGlicmF0aW9uRmFjdG9yXG4KKyAgKiAgICAgICAgIENBTEZBQ1QgIENBTEZBQ1RfRCAgICAgIExMX0FEQ19HZXRDYWxpYnJhdGlvbkZhY3RvcgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFNpbmdsZURpZmYgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0lOR0xFX0VOREVECisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0RJRkZFUkVOVElBTF9FTkRFRAorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDdGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldENhbGlicmF0aW9uRmFjdG9yKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBTaW5nbGVEaWZmKQoreworICAvKiBSZXRyaWV2ZSBiaXRzIHdpdGggcG9zaXRpb24gaW4gcmVnaXN0ZXIgZGVwZW5kaW5nIG9uIHBhcmFtZXRlciAgICAgICAgICAgKi8KKyAgLyogIlNpbmdsZURpZmYiLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFBhcmFtZXRlciB1c2VkIHdpdGggbWFzayAiQURDX1NJTkdMRURJRkZfQ0FMSUJfRkFDVE9SX01BU0siIGJlY2F1c2UgICAgICAqLworICAvKiBjb250YWluaW5nIG90aGVyIGJpdHMgcmVzZXJ2ZWQgZm9yIG90aGVyIHB1cnBvc2UuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0FMRkFDVCwgKFNpbmdsZURpZmYgJiBBRENfU0lOR0xFRElGRl9DQUxJQl9GQUNUT1JfTUFTSykpID4+IFBPU0lUSU9OX1ZBTChTaW5nbGVEaWZmICYgQURDX1NJTkdMRURJRkZfQ0FMSUJfRkFDVE9SX01BU0spKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIHJlc29sdXRpb24uCisgICogICAgICAgICBSZWZlciB0byByZWZlcmVuY2UgbWFudWFsIGZvciBhbGlnbm1lbnRzIGZvcm1hdHMKKyAgKiAgICAgICAgIGRlcGVuZGVuY2llcyB0byBBREMgcmVzb2x1dGlvbnMuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4KKyAgKiBAcm10b2xsIENGR1IgICAgIFJFUyAgICAgICAgICAgIExMX0FEQ19TZXRSZXNvbHV0aW9uCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgUmVzb2x1dGlvbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEyQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEwQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzhCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fNkIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRSZXNvbHV0aW9uKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBSZXNvbHV0aW9uKQoreworICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX1JFUywgUmVzb2x1dGlvbik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyByZXNvbHV0aW9uLgorICAqICAgICAgICAgUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCBmb3IgYWxpZ25tZW50cyBmb3JtYXRzCisgICogICAgICAgICBkZXBlbmRlbmNpZXMgdG8gQURDIHJlc29sdXRpb25zLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgUkVTICAgICAgICAgICAgTExfQURDX0dldFJlc29sdXRpb24KKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEyQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEwQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzhCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fNkIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0UmVzb2x1dGlvbihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUiwgQURDX0NGR1JfUkVTKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBjb252ZXJzaW9uIGRhdGEgYWxpZ25tZW50LgorICAqIEBub3RlICAgUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCBmb3IgYWxpZ25tZW50cyBmb3JtYXRzCisgICogICAgICAgICBkZXBlbmRlbmNpZXMgdG8gQURDIHJlc29sdXRpb25zLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBlaXRoZXIgZ3JvdXBzIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuCisgICogQHJtdG9sbCBDRkdSICAgICBBTElHTiAgICAgICAgICBMTF9BRENfU2V0RGF0YUFsaWdubWVudAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERhdGFBbGlnbm1lbnQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfREFUQV9BTElHTl9SSUdIVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19EQVRBX0FMSUdOX0xFRlQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXREYXRhQWxpZ25tZW50KEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBEYXRhQWxpZ25tZW50KQoreworICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX0FMSUdOLCBEYXRhQWxpZ25tZW50KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGNvbnZlcnNpb24gZGF0YSBhbGlnbm1lbnQuCisgICogQG5vdGUgICBSZWZlciB0byByZWZlcmVuY2UgbWFudWFsIGZvciBhbGlnbm1lbnRzIGZvcm1hdHMKKyAgKiAgICAgICAgIGRlcGVuZGVuY2llcyB0byBBREMgcmVzb2x1dGlvbnMuCisgICogQHJtdG9sbCBDRkdSICAgICBBTElHTiAgICAgICAgICBMTF9BRENfR2V0RGF0YUFsaWdubWVudAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0RBVEFfQUxJR05fUklHSFQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfREFUQV9BTElHTl9MRUZUCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldERhdGFBbGlnbm1lbnQoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX0FMSUdOKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBsb3cgcG93ZXIgbW9kZS4KKyAgKiBAbm90ZSAgIERlc2NyaXB0aW9uIG9mIEFEQyBsb3cgcG93ZXIgbW9kZXM6CisgICogICAgICAgICAtIEFEQyBsb3cgcG93ZXIgbW9kZSAiYXV0byB3YWl0IjogRHluYW1pYyBsb3cgcG93ZXIgbW9kZSwKKyAgKiAgICAgICAgICAgQURDIGNvbnZlcnNpb25zIG9jY3VycmVuY2VzIGFyZSBsaW1pdGVkIHRvIHRoZSBtaW5pbXVtIG5lY2Vzc2FyeQorICAqICAgICAgICAgICBpbiBvcmRlciB0byByZWR1Y2UgcG93ZXIgY29uc3VtcHRpb24uCisgICogICAgICAgICAgIE5ldyBBREMgY29udmVyc2lvbiBzdGFydHMgb25seSB3aGVuIHRoZSBwcmV2aW91cworICAqICAgICAgICAgICB1bml0YXJ5IGNvbnZlcnNpb24gZGF0YSAoZm9yIEFEQyBncm91cCByZWd1bGFyKQorICAqICAgICAgICAgICBvciBwcmV2aW91cyBzZXF1ZW5jZSBjb252ZXJzaW9ucyBkYXRhIChmb3IgQURDIGdyb3VwIGluamVjdGVkKQorICAqICAgICAgICAgICBoYXMgYmVlbiByZXRyaWV2ZWQgYnkgdXNlciBzb2Z0d2FyZS4KKyAgKiAgICAgICAgICAgSW4gdGhlIG1lYW50aW1lLCBBREMgcmVtYWlucyBpZGxlOiBkb2VzIG5vdCBwZXJmb3JtcyBhbnkKKyAgKiAgICAgICAgICAgb3RoZXIgY29udmVyc2lvbi4KKyAgKiAgICAgICAgICAgVGhpcyBtb2RlIGFsbG93cyB0byBhdXRvbWF0aWNhbGx5IGFkYXB0IHRoZSBBREMgY29udmVyc2lvbnMKKyAgKiAgICAgICAgICAgdHJpZ2dlcnMgdG8gdGhlIHNwZWVkIG9mIHRoZSBzb2Z0d2FyZSB0aGF0IHJlYWRzIHRoZSBkYXRhLgorICAqICAgICAgICAgICBNb3Jlb3ZlciwgdGhpcyBhdm9pZHMgcmlzayBvZiBvdmVycnVuIGZvciBsb3cgZnJlcXVlbmN5CisgICogICAgICAgICAgIGFwcGxpY2F0aW9ucy4KKyAgKiAgICAgICAgICAgSG93IHRvIHVzZSB0aGlzIGxvdyBwb3dlciBtb2RlOgorICAqICAgICAgICAgICAtIERvIG5vdCB1c2Ugd2l0aCBpbnRlcnJ1cHRpb24gb3IgRE1BIHNpbmNlIHRoZXNlIG1vZGVzCisgICogICAgICAgICAgICAgaGF2ZSB0byBjbGVhciBpbW1lZGlhdGVseSB0aGUgRU9DIGZsYWcgdG8gZnJlZSB0aGUKKyAgKiAgICAgICAgICAgICBJUlEgdmVjdG9yIHNlcXVlbmNlci4KKyAgKiAgICAgICAgICAgLSBEbyB1c2Ugd2l0aCBwb2xsaW5nOiAxLiBTdGFydCBjb252ZXJzaW9uLAorICAqICAgICAgICAgICAgIDIuIExhdGVyIG9uLCB3aGVuIGNvbnZlcnNpb24gZGF0YSBpcyBuZWVkZWQ6IHBvbGwgZm9yIGVuZCBvZgorICAqICAgICAgICAgICAgIGNvbnZlcnNpb24gIHRvIGVuc3VyZSB0aGF0IGNvbnZlcnNpb24gaXMgY29tcGxldGVkIGFuZAorICAqICAgICAgICAgICAgIHJldHJpZXZlIEFEQyBjb252ZXJzaW9uIGRhdGEuIFRoaXMgd2lsbCB0cmlnIGFub3RoZXIKKyAgKiAgICAgICAgICAgICBBREMgY29udmVyc2lvbiBzdGFydC4KKyAgKiAgICAgICAgIC0gQURDIGxvdyBwb3dlciBtb2RlICJhdXRvIHBvd2VyLW9mZiIgKGZlYXR1cmUgYXZhaWxhYmxlIG9uCisgICogICAgICAgICAgIHRoaXMgZGV2aWNlIGlmIHBhcmFtZXRlciBMTF9BRENfTFBfTU9ERV9BVVRPT0ZGIGlzIGF2YWlsYWJsZSk6CisgICogICAgICAgICAgIHRoZSBBREMgYXV0b21hdGljYWxseSBwb3dlcnMtb2ZmIGFmdGVyIGEgY29udmVyc2lvbiBhbmQKKyAgKiAgICAgICAgICAgYXV0b21hdGljYWxseSB3YWtlcyB1cCB3aGVuIGEgbmV3IGNvbnZlcnNpb24gaXMgdHJpZ2dlcmVkCisgICogICAgICAgICAgICh3aXRoIHN0YXJ0dXAgdGltZSBiZXR3ZWVuIHRyaWdnZXIgYW5kIHN0YXJ0IG9mIHNhbXBsaW5nKS4KKyAgKiAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBjb21iaW5lZCB3aXRoIGxvdyBwb3dlciBtb2RlICJhdXRvIHdhaXQiLgorICAqIEBub3RlICAgV2l0aCBBREMgbG93IHBvd2VyIG1vZGUgImF1dG8gd2FpdCIsIHRoZSBBREMgY29udmVyc2lvbiBkYXRhIHJlYWQKKyAgKiAgICAgICAgIGlzIGNvcnJlc3BvbmRpbmcgdG8gcHJldmlvdXMgQURDIGNvbnZlcnNpb24gc3RhcnQsIGluZGVwZW5kZW50bHkKKyAgKiAgICAgICAgIG9mIGRlbGF5IGR1cmluZyB3aGljaCBBREMgd2FzIGlkbGUuCisgICogICAgICAgICBUaGVyZWZvcmUsIHRoZSBBREMgY29udmVyc2lvbiBkYXRhIG1heSBiZSBvdXRkYXRlZDogZG9lcyBub3QKKyAgKiAgICAgICAgIGNvcnJlc3BvbmQgdG8gdGhlIGN1cnJlbnQgdm9sdGFnZSBsZXZlbCBvbiB0aGUgc2VsZWN0ZWQKKyAgKiAgICAgICAgIEFEQyBjaGFubmVsLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBlaXRoZXIgZ3JvdXBzIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuCisgICogQHJtdG9sbCBDRkdSICAgICBBVVRETFkgICAgICAgICBMTF9BRENfU2V0TG93UG93ZXJNb2RlCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgTG93UG93ZXJNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0xQX01PREVfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19MUF9BVVRPV0FJVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldExvd1Bvd2VyTW9kZShBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgTG93UG93ZXJNb2RlKQoreworICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX0FVVERMWSwgTG93UG93ZXJNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGxvdyBwb3dlciBtb2RlOgorICAqIEBub3RlICAgRGVzY3JpcHRpb24gb2YgQURDIGxvdyBwb3dlciBtb2RlczoKKyAgKiAgICAgICAgIC0gQURDIGxvdyBwb3dlciBtb2RlICJhdXRvIHdhaXQiOiBEeW5hbWljIGxvdyBwb3dlciBtb2RlLAorICAqICAgICAgICAgICBBREMgY29udmVyc2lvbnMgb2NjdXJyZW5jZXMgYXJlIGxpbWl0ZWQgdG8gdGhlIG1pbmltdW0gbmVjZXNzYXJ5CisgICogICAgICAgICAgIGluIG9yZGVyIHRvIHJlZHVjZSBwb3dlciBjb25zdW1wdGlvbi4KKyAgKiAgICAgICAgICAgTmV3IEFEQyBjb252ZXJzaW9uIHN0YXJ0cyBvbmx5IHdoZW4gdGhlIHByZXZpb3VzCisgICogICAgICAgICAgIHVuaXRhcnkgY29udmVyc2lvbiBkYXRhIChmb3IgQURDIGdyb3VwIHJlZ3VsYXIpCisgICogICAgICAgICAgIG9yIHByZXZpb3VzIHNlcXVlbmNlIGNvbnZlcnNpb25zIGRhdGEgKGZvciBBREMgZ3JvdXAgaW5qZWN0ZWQpCisgICogICAgICAgICAgIGhhcyBiZWVuIHJldHJpZXZlZCBieSB1c2VyIHNvZnR3YXJlLgorICAqICAgICAgICAgICBJbiB0aGUgbWVhbnRpbWUsIEFEQyByZW1haW5zIGlkbGU6IGRvZXMgbm90IHBlcmZvcm1zIGFueQorICAqICAgICAgICAgICBvdGhlciBjb252ZXJzaW9uLgorICAqICAgICAgICAgICBUaGlzIG1vZGUgYWxsb3dzIHRvIGF1dG9tYXRpY2FsbHkgYWRhcHQgdGhlIEFEQyBjb252ZXJzaW9ucworICAqICAgICAgICAgICB0cmlnZ2VycyB0byB0aGUgc3BlZWQgb2YgdGhlIHNvZnR3YXJlIHRoYXQgcmVhZHMgdGhlIGRhdGEuCisgICogICAgICAgICAgIE1vcmVvdmVyLCB0aGlzIGF2b2lkcyByaXNrIG9mIG92ZXJydW4gZm9yIGxvdyBmcmVxdWVuY3kKKyAgKiAgICAgICAgICAgYXBwbGljYXRpb25zLgorICAqICAgICAgICAgICBIb3cgdG8gdXNlIHRoaXMgbG93IHBvd2VyIG1vZGU6CisgICogICAgICAgICAgIC0gRG8gbm90IHVzZSB3aXRoIGludGVycnVwdGlvbiBvciBETUEgc2luY2UgdGhlc2UgbW9kZXMKKyAgKiAgICAgICAgICAgICBoYXZlIHRvIGNsZWFyIGltbWVkaWF0ZWx5IHRoZSBFT0MgZmxhZyB0byBmcmVlIHRoZQorICAqICAgICAgICAgICAgIElSUSB2ZWN0b3Igc2VxdWVuY2VyLgorICAqICAgICAgICAgICAtIERvIHVzZSB3aXRoIHBvbGxpbmc6IDEuIFN0YXJ0IGNvbnZlcnNpb24sCisgICogICAgICAgICAgICAgMi4gTGF0ZXIgb24sIHdoZW4gY29udmVyc2lvbiBkYXRhIGlzIG5lZWRlZDogcG9sbCBmb3IgZW5kIG9mCisgICogICAgICAgICAgICAgY29udmVyc2lvbiAgdG8gZW5zdXJlIHRoYXQgY29udmVyc2lvbiBpcyBjb21wbGV0ZWQgYW5kCisgICogICAgICAgICAgICAgcmV0cmlldmUgQURDIGNvbnZlcnNpb24gZGF0YS4gVGhpcyB3aWxsIHRyaWcgYW5vdGhlcgorICAqICAgICAgICAgICAgIEFEQyBjb252ZXJzaW9uIHN0YXJ0LgorICAqICAgICAgICAgLSBBREMgbG93IHBvd2VyIG1vZGUgImF1dG8gcG93ZXItb2ZmIiAoZmVhdHVyZSBhdmFpbGFibGUgb24KKyAgKiAgICAgICAgICAgdGhpcyBkZXZpY2UgaWYgcGFyYW1ldGVyIExMX0FEQ19MUF9NT0RFX0FVVE9PRkYgaXMgYXZhaWxhYmxlKToKKyAgKiAgICAgICAgICAgdGhlIEFEQyBhdXRvbWF0aWNhbGx5IHBvd2Vycy1vZmYgYWZ0ZXIgYSBjb252ZXJzaW9uIGFuZAorICAqICAgICAgICAgICBhdXRvbWF0aWNhbGx5IHdha2VzIHVwIHdoZW4gYSBuZXcgY29udmVyc2lvbiBpcyB0cmlnZ2VyZWQKKyAgKiAgICAgICAgICAgKHdpdGggc3RhcnR1cCB0aW1lIGJldHdlZW4gdHJpZ2dlciBhbmQgc3RhcnQgb2Ygc2FtcGxpbmcpLgorICAqICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIGNvbWJpbmVkIHdpdGggbG93IHBvd2VyIG1vZGUgImF1dG8gd2FpdCIuCisgICogQG5vdGUgICBXaXRoIEFEQyBsb3cgcG93ZXIgbW9kZSAiYXV0byB3YWl0IiwgdGhlIEFEQyBjb252ZXJzaW9uIGRhdGEgcmVhZAorICAqICAgICAgICAgaXMgY29ycmVzcG9uZGluZyB0byBwcmV2aW91cyBBREMgY29udmVyc2lvbiBzdGFydCwgaW5kZXBlbmRlbnRseQorICAqICAgICAgICAgb2YgZGVsYXkgZHVyaW5nIHdoaWNoIEFEQyB3YXMgaWRsZS4KKyAgKiAgICAgICAgIFRoZXJlZm9yZSwgdGhlIEFEQyBjb252ZXJzaW9uIGRhdGEgbWF5IGJlIG91dGRhdGVkOiBkb2VzIG5vdAorICAqICAgICAgICAgY29ycmVzcG9uZCB0byB0aGUgY3VycmVudCB2b2x0YWdlIGxldmVsIG9uIHRoZSBzZWxlY3RlZAorICAqICAgICAgICAgQURDIGNoYW5uZWwuCisgICogQHJtdG9sbCBDRkdSICAgICBBVVRETFkgICAgICAgICBMTF9BRENfR2V0TG93UG93ZXJNb2RlCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTFBfTU9ERV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0xQX0FVVE9XQUlUCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldExvd1Bvd2VyTW9kZShBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUiwgQURDX0NGR1JfQVVURExZKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBzZWxlY3RlZCBvZmZzZXQgbnVtYmVyIDEsIDIsIDMgb3IgNC4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2V0IHRoZSAyIGl0ZW1zIG9mIG9mZnNldCBjb25maWd1cmF0aW9uOgorICAqICAgICAgICAgLSBBREMgY2hhbm5lbCB0byB3aGljaCB0aGUgb2Zmc2V0IHByb2dyYW1tZWQgd2lsbCBiZSBhcHBsaWVkCisgICogICAgICAgICAgIChpbmRlcGVuZGVudGx5IG9mIGNoYW5uZWwgbWFwcGVkIG9uIEFEQyBncm91cCByZWd1bGFyCisgICogICAgICAgICAgIG9yIGdyb3VwIGluamVjdGVkKQorICAqICAgICAgICAgLSBPZmZzZXQgbGV2ZWwgKG9mZnNldCB0byBiZSBzdWJ0cmFjdGVkIGZyb20gdGhlIHJhdworICAqICAgICAgICAgICBjb252ZXJ0ZWQgZGF0YSkuCisgICogQG5vdGUgICBDYXV0aW9uOiBPZmZzZXQgZm9ybWF0IGlzIGRlcGVuZGVudCB0byBBREMgcmVzb2x1dGlvbjoKKyAgKiAgICAgICAgIG9mZnNldCBoYXMgdG8gYmUgbGVmdC1hbGlnbmVkIG9uIGJpdCAxMSwgdGhlIExTQiAocmlnaHQgYml0cykKKyAgKiAgICAgICAgIGFyZSBzZXQgdG8gMC4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyB0aGUgb2Zmc2V0LCBieSBkZWZhdWx0LiBJdCBjYW4gYmUgZm9yY2VkCisgICogICAgICAgICB0byBkaXNhYmxlIHN0YXRlIHVzaW5nIGZ1bmN0aW9uIExMX0FEQ19TZXRPZmZzZXRTdGF0ZSgpLgorICAqIEBub3RlICAgSWYgYSBjaGFubmVsIGlzIG1hcHBlZCBvbiBzZXZlcmFsIG9mZnNldHMgbnVtYmVycywgb25seSB0aGUgb2Zmc2V0CisgICogICAgICAgICB3aXRoIHRoZSBsb3dlc3QgdmFsdWUgaXMgY29uc2lkZXJlZCBmb3IgdGhlIHN1YnRyYWN0aW9uLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBlaXRoZXIgZ3JvdXBzIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuCisgICogQHJtdG9sbCBPRlIxICAgICBPRkZTRVQxX0NIICAgICBMTF9BRENfU2V0T2Zmc2V0XG4KKyAgKiAgICAgICAgIE9GUjEgICAgIE9GRlNFVDEgICAgICAgIExMX0FEQ19TZXRPZmZzZXRcbgorICAqICAgICAgICAgT0ZSMSAgICAgT0ZGU0VUMV9FTiAgICAgTExfQURDX1NldE9mZnNldFxuCisgICogICAgICAgICBPRlIyICAgICBPRkZTRVQyX0NIICAgICBMTF9BRENfU2V0T2Zmc2V0XG4KKyAgKiAgICAgICAgIE9GUjIgICAgIE9GRlNFVDIgICAgICAgIExMX0FEQ19TZXRPZmZzZXRcbgorICAqICAgICAgICAgT0ZSMiAgICAgT0ZGU0VUMl9FTiAgICAgTExfQURDX1NldE9mZnNldFxuCisgICogICAgICAgICBPRlIzICAgICBPRkZTRVQzX0NIICAgICBMTF9BRENfU2V0T2Zmc2V0XG4KKyAgKiAgICAgICAgIE9GUjMgICAgIE9GRlNFVDMgICAgICAgIExMX0FEQ19TZXRPZmZzZXRcbgorICAqICAgICAgICAgT0ZSMyAgICAgT0ZGU0VUM19FTiAgICAgTExfQURDX1NldE9mZnNldFxuCisgICogICAgICAgICBPRlI0ICAgICBPRkZTRVQ0X0NIICAgICBMTF9BRENfU2V0T2Zmc2V0XG4KKyAgKiAgICAgICAgIE9GUjQgICAgIE9GRlNFVDQgICAgICAgIExMX0FEQ19TZXRPZmZzZXRcbgorICAqICAgICAgICAgT0ZSNCAgICAgT0ZGU0VUNF9FTiAgICAgTExfQURDX1NldE9mZnNldAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIE9mZnNldHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzQKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICg1KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WQkFUICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIgICAgICAoMikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzICAgICAgKDMpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNCAgICAgICg0KQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gU1RNMzJGMywgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbgorICAqICAgICAgICAgKDIpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzIuXG4KKyAgKiAgICAgICAgICgzKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMzLlxuCisgICogICAgICAgICAoNCkgT24gU1RNMzJGMywgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6IEFEQzQuXG4KKyAgKiAgICAgICAgICg1KSBPbiBTVE0zMkYzLCBBREMgY2hhbm5lbCBhdmFpbGFibGUgb25seSBvbiBhbGwgQURDIGluc3RhbmNlcywgYnV0CisgICogICAgICAgICAgICAgb25seSBvbmUgQURDIGluc3RhbmNlIGlzIGFsbG93ZWQgdG8gYmUgY29ubmVjdGVkIHRvIFZyZWZJbnQgYXQgdGhlIHNhbWUgdGltZS4KKyAgKiBAcGFyYW0gIE9mZnNldExldmVsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0T2Zmc2V0KEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBPZmZzZXR5LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBPZmZzZXRMZXZlbCkKK3sKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQURDX1BUUl9SRUdfT0ZGU0VUKEFEQ3gtPk9GUjEsIE9mZnNldHkpOworICAKKyAgTU9ESUZZX1JFRygqcHJlZywKKyAgICAgICAgICAgICBBRENfT0ZSMV9PRkZTRVQxX0VOIHwgQURDX09GUjFfT0ZGU0VUMV9DSCB8IEFEQ19PRlIxX09GRlNFVDEsCisgICAgICAgICAgICAgQURDX09GUjFfT0ZGU0VUMV9FTiB8IChDaGFubmVsICYgQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0spIHwgT2Zmc2V0TGV2ZWwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBmb3IgdGhlIEFEQyBzZWxlY3RlZCBvZmZzZXQgbnVtYmVyIDEsIDIsIDMgb3IgNDoKKyAgKiAgICAgICAgIENoYW5uZWwgdG8gd2hpY2ggdGhlIG9mZnNldCBwcm9ncmFtbWVkIHdpbGwgYmUgYXBwbGllZAorICAqICAgICAgICAgKGluZGVwZW5kZW50bHkgb2YgY2hhbm5lbCBtYXBwZWQgb24gQURDIGdyb3VwIHJlZ3VsYXIKKyAgKiAgICAgICAgIG9yIGdyb3VwIGluamVjdGVkKQorICAqIEBub3RlICAgVXNhZ2Ugb2YgdGhlIHJldHVybmVkIGNoYW5uZWwgbnVtYmVyOgorICAqICAgICAgICAgLSBUbyByZWluamVjdCB0aGlzIGNoYW5uZWwgaW50byBhbm90aGVyIGZ1bmN0aW9uIExMX0FEQ194eHg6CisgICogICAgICAgICAgIHRoZSByZXR1cm5lZCBjaGFubmVsIG51bWJlciBpcyBvbmx5IHBhcnRseSBmb3JtYXR0ZWQgb24gZGVmaW5pdGlvbgorICAqICAgICAgICAgICBvZiBsaXRlcmFscyBMTF9BRENfQ0hBTk5FTF94LiBUaGVyZWZvcmUsIGl0IGhhcyB0byBiZSBjb21wYXJlZAorICAqICAgICAgICAgICB3aXRoIHBhcnRzIG9mIGxpdGVyYWxzIExMX0FEQ19DSEFOTkVMX3ggb3IgdXNpbmcKKyAgKiAgICAgICAgICAgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKCkuCisgICogICAgICAgICAgIFRoZW4gdGhlIHNlbGVjdGVkIGxpdGVyYWwgTExfQURDX0NIQU5ORUxfeCBjYW4gYmUgdXNlZAorICAqICAgICAgICAgICBhcyBwYXJhbWV0ZXIgZm9yIGFub3RoZXIgZnVuY3Rpb24uCisgICogICAgICAgICAtIFRvIGdldCB0aGUgY2hhbm5lbCBudW1iZXIgaW4gZGVjaW1hbCBmb3JtYXQ6CisgICogICAgICAgICAgIHByb2Nlc3MgdGhlIHJldHVybmVkIHZhbHVlIHdpdGggdGhlIGhlbHBlciBtYWNybworICAqICAgICAgICAgICBAcmVmIF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQigpLgorICAqIEBybXRvbGwgT0ZSMSAgICAgT0ZGU0VUMV9DSCAgICAgTExfQURDX0dldE9mZnNldENoYW5uZWxcbgorICAqICAgICAgICAgT0ZSMiAgICAgT0ZGU0VUMl9DSCAgICAgTExfQURDX0dldE9mZnNldENoYW5uZWxcbgorICAqICAgICAgICAgT0ZSMyAgICAgT0ZGU0VUM19DSCAgICAgTExfQURDX0dldE9mZnNldENoYW5uZWxcbgorICAqICAgICAgICAgT0ZSNCAgICAgT0ZGU0VUNF9DSCAgICAgTExfQURDX0dldE9mZnNldENoYW5uZWwKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBPZmZzZXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF80CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgKDUpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAxICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMiAgICAgICgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDMgICAgICAoMykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgKDQpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLlxuCisgICogICAgICAgICAoMikgT24gU1RNMzJGMywgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbgorICAqICAgICAgICAgKDMpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzMuXG4KKyAgKiAgICAgICAgICg0KSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczogQURDNC5cbgorICAqICAgICAgICAgKDUpIE9uIFNUTTMyRjMsIEFEQyBjaGFubmVsIGF2YWlsYWJsZSBvbmx5IG9uIGFsbCBBREMgaW5zdGFuY2VzLCBidXQKKyAgKiAgICAgICAgICAgICBvbmx5IG9uZSBBREMgaW5zdGFuY2UgaXMgYWxsb3dlZCB0byBiZSBjb25uZWN0ZWQgdG8gVnJlZkludCBhdCB0aGUgc2FtZSB0aW1lLlxuCisgICogICAgICAgICAoMSwgMiwgMywgNCwgNSkgRm9yIEFEQyBjaGFubmVsIHJlYWQgYmFjayBmcm9tIEFEQyByZWdpc3RlciwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uIHdpdGggaW50ZXJuYWwgY2hhbm5lbCBwYXJhbWV0ZXIgdG8gYmUgZG9uZQorICAqICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NIQU5ORUxfSU5URVJOQUxfVE9fRVhURVJOQUwoKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0T2Zmc2V0Q2hhbm5lbChBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgT2Zmc2V0eSkKK3sKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQURDX1BUUl9SRUdfT0ZGU0VUKEFEQ3gtPk9GUjEsIE9mZnNldHkpOworICAKKyAgcmV0dXJuICh1aW50MzJfdCkgUkVBRF9CSVQoKnByZWcsIEFEQ19PRlIxX09GRlNFVDFfQ0gpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBmb3IgdGhlIEFEQyBzZWxlY3RlZCBvZmZzZXQgbnVtYmVyIDEsIDIsIDMgb3IgNDoKKyAgKiAgICAgICAgIE9mZnNldCBsZXZlbCAob2Zmc2V0IHRvIGJlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgcmF3CisgICogICAgICAgICBjb252ZXJ0ZWQgZGF0YSkuCisgICogQG5vdGUgICBDYXV0aW9uOiBPZmZzZXQgZm9ybWF0IGlzIGRlcGVuZGVudCB0byBBREMgcmVzb2x1dGlvbjoKKyAgKiAgICAgICAgIG9mZnNldCBoYXMgdG8gYmUgbGVmdC1hbGlnbmVkIG9uIGJpdCAxMSwgdGhlIExTQiAocmlnaHQgYml0cykKKyAgKiAgICAgICAgIGFyZSBzZXQgdG8gMC4KKyAgKiBAcm10b2xsIE9GUjEgICAgIE9GRlNFVDEgICAgICAgIExMX0FEQ19HZXRPZmZzZXRMZXZlbFxuCisgICogICAgICAgICBPRlIyICAgICBPRkZTRVQyICAgICAgICBMTF9BRENfR2V0T2Zmc2V0TGV2ZWxcbgorICAqICAgICAgICAgT0ZSMyAgICAgT0ZGU0VUMyAgICAgICAgTExfQURDX0dldE9mZnNldExldmVsXG4KKyAgKiAgICAgICAgIE9GUjQgICAgIE9GRlNFVDQgICAgICAgIExMX0FEQ19HZXRPZmZzZXRMZXZlbAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIE9mZnNldHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzQKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldE9mZnNldExldmVsKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBPZmZzZXR5KQoreworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoQURDeC0+T0ZSMSwgT2Zmc2V0eSk7CisgIAorICByZXR1cm4gKHVpbnQzMl90KSBSRUFEX0JJVCgqcHJlZywgQURDX09GUjFfT0ZGU0VUMSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGZvciB0aGUgQURDIHNlbGVjdGVkIG9mZnNldCBudW1iZXIgMSwgMiwgMyBvciA0OgorICAqICAgICAgICAgZm9yY2Ugb2Zmc2V0IHN0YXRlIGRpc2FibGUgb3IgZW5hYmxlCisgICogICAgICAgICB3aXRob3V0IG1vZGlmeWluZyBvZmZzZXQgY2hhbm5lbCBvciBvZmZzZXQgdmFsdWUuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBuZWVkZWQgb25seSBpbiBjYXNlIG9mIG9mZnNldCB0byBiZQorICAqICAgICAgICAgZW5hYmxlZC1kaXNhYmxlZCBkeW5hbWljYWxseSwgYW5kIHNob3VsZCBub3QgYmUgbmVlZGVkIGluIG90aGVyIGNhc2VzOgorICAqICAgICAgICAgZnVuY3Rpb24gTExfQURDX1NldE9mZnNldCgpIGF1dG9tYXRpY2FsbHkgZW5hYmxlcyB0aGUgb2Zmc2V0LgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBlaXRoZXIgZ3JvdXBzIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuCisgICogQHJtdG9sbCBPRlIxICAgICBPRkZTRVQxX0VOICAgICBMTF9BRENfU2V0T2Zmc2V0U3RhdGVcbgorICAqICAgICAgICAgT0ZSMiAgICAgT0ZGU0VUMl9FTiAgICAgTExfQURDX1NldE9mZnNldFN0YXRlXG4KKyAgKiAgICAgICAgIE9GUjMgICAgIE9GRlNFVDNfRU4gICAgIExMX0FEQ19TZXRPZmZzZXRTdGF0ZVxuCisgICogICAgICAgICBPRlI0ICAgICBPRkZTRVQ0X0VOICAgICBMTF9BRENfU2V0T2Zmc2V0U3RhdGUKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBPZmZzZXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF80CisgICogQHBhcmFtICBPZmZzZXRTdGF0ZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfRU5BQkxFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0T2Zmc2V0U3RhdGUoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IE9mZnNldHksIHVpbnQzMl90IE9mZnNldFN0YXRlKQoreworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwcmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpKCZBREN4LT5PRlIxKSArIChPZmZzZXR5KjRVKSkpOworICAKKyAgTU9ESUZZX1JFRygqcHJlZywKKyAgICAgICAgICAgICBBRENfT0ZSMV9PRkZTRVQxX0VOLAorICAgICAgICAgICAgIE9mZnNldFN0YXRlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZm9yIHRoZSBBREMgc2VsZWN0ZWQgb2Zmc2V0IG51bWJlciAxLCAyLCAzIG9yIDQ6CisgICogICAgICAgICBvZmZzZXQgc3RhdGUgZGlzYWJsZWQgb3IgZW5hYmxlZC4KKyAgKiBAcm10b2xsIE9GUjEgICAgIE9GRlNFVDFfRU4gICAgIExMX0FEQ19HZXRPZmZzZXRTdGF0ZVxuCisgICogICAgICAgICBPRlIyICAgICBPRkZTRVQyX0VOICAgICBMTF9BRENfR2V0T2Zmc2V0U3RhdGVcbgorICAqICAgICAgICAgT0ZSMyAgICAgT0ZGU0VUM19FTiAgICAgTExfQURDX0dldE9mZnNldFN0YXRlXG4KKyAgKiAgICAgICAgIE9GUjQgICAgIE9GRlNFVDRfRU4gICAgIExMX0FEQ19HZXRPZmZzZXRTdGF0ZQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIE9mZnNldHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzQKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF9FTkFCTEUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0T2Zmc2V0U3RhdGUoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IE9mZnNldHkpCit7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVChBREN4LT5PRlIxLCBPZmZzZXR5KTsKKyAgCisgIHJldHVybiAodWludDMyX3QpIFJFQURfQklUKCpwcmVnLCBBRENfT0ZSMV9PRkZTRVQxX0VOKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUZfQ29uZmlndXJhdGlvbl9BRENfR3JvdXBfUmVndWxhciBDb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6IGdyb3VwIHJlZ3VsYXIKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgc291cmNlOgorICAqICAgICAgICAgaW50ZXJuYWwgKFNXIHN0YXJ0KSBvciBmcm9tIGV4dGVybmFsIElQICh0aW1lciBldmVudCwKKyAgKiAgICAgICAgIGV4dGVybmFsIGludGVycnVwdCBsaW5lKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgdHJpZ2dlciBzb3VyY2UgdG8gZXh0ZXJuYWwgdHJpZ2dlcgorICAqICAgICAgICAgYWxzbyBzZXQgdHJpZ2dlciBwb2xhcml0eSB0byByaXNpbmcgZWRnZSAKKyAgKiAgICAgICAgIChkZWZhdWx0IHNldHRpbmcgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBzb21lIEFEQyBvbiBvdGhlcgorICAqICAgICAgICAgU1RNMzIgZmFtaWxpZXMgaGF2aW5nIHRoaXMgc2V0dGluZyBzZXQgYnkgSFcgZGVmYXVsdCB2YWx1ZSkuCisgICogICAgICAgICBJbiBjYXNlIG9mIG5lZWQgdG8gbW9kaWZ5IHRyaWdnZXIgZWRnZSwgdXNlCisgICogICAgICAgICBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0VHJpZ2dlckVkZ2UoKS4KKyAgKiBAbm90ZSAgIEF2YWlsYWJpbGl0eSBvZiBwYXJhbWV0ZXJzIG9mIHRyaWdnZXIgc291cmNlcyBmcm9tIHRpbWVyIAorICAqICAgICAgICAgZGVwZW5kcyBvbiB0aW1lcnMgYXZhaWxhYmlsaXR5IG9uIHRoZSBzZWxlY3RlZCBkZXZpY2UuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGdyb3VwIHJlZ3VsYXIuCisgICogQHJtdG9sbCBDRkdSICAgICBFWFRTRUwgICAgICAgICBMTF9BRENfUkVHX1NldFRyaWdnZXJTb3VyY2VcbgorICAqICAgICAgICAgQ0ZHUiAgICAgRVhURU4gICAgICAgICAgTExfQURDX1JFR19TZXRUcmlnZ2VyU291cmNlCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgVHJpZ2dlclNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9UUkdPCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMSAgICAgICAgICAgICAgICAoMykoNCkoNSkoNikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gxX0FEQzEyICAgICgxKSgyKSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDIgICAgICAgICAgICAgICAgKDMpKDQpKDUpKDYpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMl9BREMxMiAgICAoMSkoMikgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0yX1RSR08gICAgICAgICAgICAgICAoMykoNCkoNSkoNikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfVFJHT19BREMxMiAgICgxKSgyKSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9UUkdPX19BREMzNCAgKDEpKDIpICAgICAgICAgICAgICAgKDgpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMV9BREMzNCAgICAoMSkoMikgICAgICAgICAgICAgICAoOCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfQ0gyX0FEQzEyICAgICgxKSgyKSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDNfQURDMzQgICAgKDEpKDIpICAgICAgICAgICAgICAgKDgpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0zX1RSR08gICAgICAgICAgICAgICAoMykoNCkoNSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfVFJHT19BREMxMiAgICgxKSgyKSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19UUkdPX19BREMzNCAgKDEpKDIpICAgICAgICAgICAgICAgKDgpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0zX0NIMV9BREMzNCAgICAoMSkoMikgICAgICAgICAgICAgICAoOCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfQ0g0ICAgICAgICAgICAgICAgICgzKSg0KSg1KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19DSDRfQURDMTIgICAgKDEpKDIpICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU00X1RSR08gICAgICAgICAoMSkoMikoMykoNSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfQ0gxX0FEQzM0ICAgICgxKSgyKSAgICAgICAgICAgICAgICg4KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9DSDQgICAgICAgICAgICAgICAgKDMpICAgKDUpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU00X0NINF9BREMxMiAgICAoMSkoMikgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTZfVFJHTyAgICAgICAgICAgICAgICgzKSg0KSg1KSg2KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNNl9UUkdPX0FEQzEyICAgICgxKSgyKSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNOF9UUkdPICAgICAgICAgICAgICAgKDMpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU04X1RSR09fQURDMTIgICAoMSkoMikgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfVFJHTzIgICAgICAgICgxKSgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNNl9UUkdPX0FEQzEyICAgKDEpKDIpICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU03X1RSR09fQURDMzQgICAoMSkoMikgICAgICAgICAgICAgICAoOCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfVFJHT19fQURDMzQgICgxKSgyKSAgICAgICAgICAgICAgICg4KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNOF9UUkdPMiAgICAgICAgKDEpKDIpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU04X0NIMV9BREMzNCAgICAoMSkoMikgICAgICAgICAgICAgICAoOCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTE1X1RSR08gICAgICAgICAgICAgICAgICAgICg1KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjBfVFJHMF9BREMxMiAgKDEpICAgICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9UUkcwMl9BREMxMiAoMSkgICAgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX0NIMV9BREMxMiAgICgxKSAgICAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjBfQ0gyX0FEQzEyICAgKDEpICAgICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9DSDNfQURDMTIgICAoMSkgICAgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX1RSRzBfQURDMyAgICgxKSAgICAgICAgICAgICAgICAgICg4KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjBfVFJHMDJfQURDMzQgKDEpICAgICAgICAgICAgICAgICAgKDgpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9DSDFfQURDMzQgICAoMSkgICAgICAgICAgICAgICAgICAoOCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzEgICAgICAgICAgICAgICAgICg0KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHMyAgICAgICAgICAgICAgICAgKDQpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9FWFRJX0xJTkUyX0FEQzM0ICAoMSkoMikgICAgICAgICAgICAgICAoOCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0VYVElfTElORTExICAgICAgICAgICAgICgzKSg0KSg1KSg2KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfRVhUSV9MSU5FMTFfQURDMTIgKDEpKDIpICAgICAgICAgICAgKDcpCisgICAKKyAgKiAgICAgICAgICgxKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlczogYW1vbmcgb3RoZXJzLCBvbiBTVE0zMkYzMDN4RSwgU1RNMzJGMzk4eHguXG4KKyAgKiAgICAgICAgICgyKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlczogYW1vbmcgb3RoZXJzLCBvbiBTVE0zMkYzMDN4QywgU1RNMzJGMzU4eHguXG4KKyAgKiAgICAgICAgICgzKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlczogYW1vbmcgb3RoZXJzLCBvbiBTVE0zMkYzMDN4OCwgU1RNMzJGMzI4eHguXG4KKyAgKiAgICAgICAgICg0KSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlczogYW1vbmcgb3RoZXJzLCBvbiBTVE0zMkYzMzR4OC5cbgorICAqICAgICAgICAgKDUpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzOiBhbW9uZyBvdGhlcnMsIG9uIFNUTTMyRjMwMnhDLCBTVE0zMkYzMDJ4RS5cbgorICAqICAgICAgICAgKDYpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzOiBhbW9uZyBvdGhlcnMsIG9uIFNUTTMyRjMwMXg4LCBTVE0zMkYzMDJ4OCwgU1RNMzJGMzE4eHguXG4KKyAgKiAgICAgICAgICg3KSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgQURDIGluc3RhbmNlczogQURDMSwgQURDMiAoZm9yIEFEQyBpbnN0YW5jZXMgQURDeCBhdmFpbGFibGUgb24gdGhlIHNlbGVjdGVkIGRldmljZSkuXG4KKyAgKiAgICAgICAgICg4KSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgQURDIGluc3RhbmNlczogQURDMywgQURDNCAoZm9yIEFEQyBpbnN0YW5jZXMgQURDeCBhdmFpbGFibGUgb24gdGhlIHNlbGVjdGVkIGRldmljZSkuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1NldFRyaWdnZXJTb3VyY2UoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFRyaWdnZXJTb3VyY2UpCit7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUiwgQURDX0NGR1JfRVhURU4gfCBBRENfQ0ZHUl9FWFRTRUwsIFRyaWdnZXJTb3VyY2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgc291cmNlOgorICAqICAgICAgICAgaW50ZXJuYWwgKFNXIHN0YXJ0KSBvciBmcm9tIGV4dGVybmFsIElQICh0aW1lciBldmVudCwKKyAgKiAgICAgICAgIGV4dGVybmFsIGludGVycnVwdCBsaW5lKS4KKyAgKiBAbm90ZSAgIFRvIGRldGVybWluZSB3aGV0aGVyIGdyb3VwIHJlZ3VsYXIgdHJpZ2dlciBzb3VyY2UgaXMKKyAgKiAgICAgICAgIGludGVybmFsIChTVyBzdGFydCkgb3IgZXh0ZXJuYWwsIHdpdGhvdXQgZGV0YWlsCisgICogICAgICAgICBvZiB3aGljaCBwZXJpcGhlcmFsIGlzIHNlbGVjdGVkIGFzIGV4dGVybmFsIHRyaWdnZXIsCisgICogICAgICAgICAoZXF1aXZhbGVudCB0byAKKyAgKiAgICAgICAgICJpZihMTF9BRENfUkVHX0dldFRyaWdnZXJTb3VyY2UoQURDMSkgPT0gTExfQURDX1JFR19UUklHX1NPRlRXQVJFKSIpCisgICogICAgICAgICB1c2UgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX0lzVHJpZ2dlclNvdXJjZVNXU3RhcnQuCisgICogQG5vdGUgICBBdmFpbGFiaWxpdHkgb2YgcGFyYW1ldGVycyBvZiB0cmlnZ2VyIHNvdXJjZXMgZnJvbSB0aW1lciAKKyAgKiAgICAgICAgIGRlcGVuZHMgb24gdGltZXJzIGF2YWlsYWJpbGl0eSBvbiB0aGUgc2VsZWN0ZWQgZGV2aWNlLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgRVhUU0VMICAgICAgICAgTExfQURDX1JFR19HZXRUcmlnZ2VyU291cmNlXG4KKyAgKiAgICAgICAgIENGR1IgICAgIEVYVEVOICAgICAgICAgIExMX0FEQ19SRUdfR2V0VHJpZ2dlclNvdXJjZQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX1NPRlRXQVJFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfVFJHTzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gxICAgICAgICAgICAgICAgICgzKSg0KSg1KSg2KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDFfQURDMTIgICAgKDEpKDIpICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMiAgICAgICAgICAgICAgICAoMykoNCkoNSkoNikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gyX0FEQzEyICAgICgxKSgyKSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfVFJHTyAgICAgICAgICAgICAgICgzKSg0KSg1KSg2KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9UUkdPX0FEQzEyICAgKDEpKDIpICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0yX1RSR09fX0FEQzM0ICAoMSkoMikgICAgICAgICAgICAgICAoOCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfQ0gxX0FEQzM0ICAgICgxKSgyKSAgICAgICAgICAgICAgICg4KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDJfQURDMTIgICAgKDEpKDIpICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIM19BREMzNCAgICAoMSkoMikgICAgICAgICAgICAgICAoOCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfVFJHTyAgICAgICAgICAgICAgICgzKSg0KSg1KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19UUkdPX0FEQzEyICAgKDEpKDIpICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0zX1RSR09fX0FEQzM0ICAoMSkoMikgICAgICAgICAgICAgICAoOCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfQ0gxX0FEQzM0ICAgICgxKSgyKSAgICAgICAgICAgICAgICg4KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19DSDQgICAgICAgICAgICAgICAgKDMpKDQpKDUpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0zX0NINF9BREMxMiAgICAoMSkoMikgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfVFJHTyAgICAgICAgICgxKSgyKSgzKSg1KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9DSDFfQURDMzQgICAgKDEpKDIpICAgICAgICAgICAgICAgKDgpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU00X0NINCAgICAgICAgICAgICAgICAoMykgICAoNSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfQ0g0X0FEQzEyICAgICgxKSgyKSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNNl9UUkdPICAgICAgICAgICAgICAgKDMpKDQpKDUpKDYpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU02X1RSR09fQURDMTIgICAgKDEpKDIpICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU04X1RSR08gICAgICAgICAgICAgICAoMykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfVFJHT19BREMxMiAgICgxKSgyKSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNOF9UUkdPMiAgICAgICAgKDEpKDIpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU02X1RSR09fQURDMTIgICAoMSkoMikgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTdfVFJHT19BREMzNCAgICgxKSgyKSAgICAgICAgICAgICAgICg4KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNOF9UUkdPX19BREMzNCAgKDEpKDIpICAgICAgICAgICAgICAgKDgpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU04X1RSR08yICAgICAgICAoMSkoMikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfQ0gxX0FEQzM0ICAgICgxKSgyKSAgICAgICAgICAgICAgICg4KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMTVfVFJHTyAgICAgICAgICAgICAgICAgICAgKDUpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9UUkcwX0FEQzEyICAoMSkgICAgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX1RSRzAyX0FEQzEyICgxKSAgICAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjBfQ0gxX0FEQzEyICAgKDEpICAgICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9DSDJfQURDMTIgICAoMSkgICAgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX0NIM19BREMxMiAgICgxKSAgICAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjBfVFJHMF9BREMzICAgKDEpICAgICAgICAgICAgICAgICAgKDgpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9UUkcwMl9BREMzNCAoMSkgICAgICAgICAgICAgICAgICAoOCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX0NIMV9BREMzNCAgICgxKSAgICAgICAgICAgICAgICAgICg4KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHMSAgICAgICAgICAgICAgICAgKDQpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkczICAgICAgICAgICAgICAgICAoNCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0VYVElfTElORTJfQURDMzQgICgxKSgyKSAgICAgICAgICAgICAgICg4KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfRVhUSV9MSU5FMTEgICAgICAgICAgICAgKDMpKDQpKDUpKDYpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9FWFRJX0xJTkUxMV9BREMxMiAoMSkoMikgICAgICAgICAgICAoNykKKyAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzOiBhbW9uZyBvdGhlcnMsIG9uIFNUTTMyRjMwM3hFLCBTVE0zMkYzOTh4eC5cbgorICAqICAgICAgICAgKDIpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzOiBhbW9uZyBvdGhlcnMsIG9uIFNUTTMyRjMwM3hDLCBTVE0zMkYzNTh4eC5cbgorICAqICAgICAgICAgKDMpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzOiBhbW9uZyBvdGhlcnMsIG9uIFNUTTMyRjMwM3g4LCBTVE0zMkYzMjh4eC5cbgorICAqICAgICAgICAgKDQpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzOiBhbW9uZyBvdGhlcnMsIG9uIFNUTTMyRjMzNHg4LlxuCisgICogICAgICAgICAoNSkgT24gU1RNMzJGMywgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXM6IGFtb25nIG90aGVycywgb24gU1RNMzJGMzAyeEMsIFNUTTMyRjMwMnhFLlxuCisgICogICAgICAgICAoNikgT24gU1RNMzJGMywgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXM6IGFtb25nIG90aGVycywgb24gU1RNMzJGMzAxeDgsIFNUTTMyRjMwMng4LCBTVE0zMkYzMTh4eC5cbgorICAqICAgICAgICAgKDcpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBBREMgaW5zdGFuY2VzOiBBREMxLCBBREMyIChmb3IgQURDIGluc3RhbmNlcyBBREN4IGF2YWlsYWJsZSBvbiB0aGUgc2VsZWN0ZWQgZGV2aWNlKS5cbgorICAqICAgICAgICAgKDgpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBBREMgaW5zdGFuY2VzOiBBREMzLCBBREM0IChmb3IgQURDIGluc3RhbmNlcyBBREN4IGF2YWlsYWJsZSBvbiB0aGUgc2VsZWN0ZWQgZGV2aWNlKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfUkVHX0dldFRyaWdnZXJTb3VyY2UoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IFRyaWdnZXJTb3VyY2UgPSBSRUFEX0JJVChBREN4LT5DRkdSLCBBRENfQ0ZHUl9FWFRTRUwgfCBBRENfQ0ZHUl9FWFRFTik7CisgIAorICAvKiBWYWx1ZSBmb3Igc2hpZnQgb2YgezA7IDQ7IDg7IDEyfSBkZXBlbmRpbmcgb24gdmFsdWUgb2YgYml0ZmllbGQgICAgICAgICAgKi8KKyAgLyogY29ycmVzcG9uZGluZyB0byBBRENfQ0ZHUl9FWFRFTiB7MDsgMTsgMjsgM30uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHJlZ2lzdGVyIHVpbnQzMl90IFNoaWZ0RXh0ZW4gPSAoKFRyaWdnZXJTb3VyY2UgJiBBRENfQ0ZHUl9FWFRFTikgPj4gKEFEQ19SRUdfVFJJR19FWFRFTl9CSVRPRkZTRVRfUE9TIC0gMlUpKTsKKyAgCisgIC8qIFNldCBiaXRmaWVsZCBjb3JyZXNwb25kaW5nIHRvIEFEQ19DRkdSX0VYVEVOIGFuZCBBRENfQ0ZHUl9FWFRTRUwgICAgICAgICAqLworICAvKiB0byBtYXRjaCB3aXRoIHRyaWdnZXJzIGxpdGVyYWxzIGRlZmluaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgcmV0dXJuICgoVHJpZ2dlclNvdXJjZQorICAgICAgICAgICAmIChBRENfUkVHX1RSSUdfU09VUkNFX01BU0sgPj4gU2hpZnRFeHRlbikgJiBBRENfQ0ZHUl9FWFRTRUwpCisgICAgICAgICAgfCAoKEFEQ19SRUdfVFJJR19FREdFX01BU0sgPj4gU2hpZnRFeHRlbikgJiBBRENfQ0ZHUl9FWFRFTikKKyAgICAgICAgICk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBzb3VyY2UgaW50ZXJuYWwgKFNXIHN0YXJ0KQorICAgICAgICAgICAgb3IgZXh0ZXJuYWwuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIGdyb3VwIHJlZ3VsYXIgdHJpZ2dlciBzb3VyY2Ugc2V0IHRvIGV4dGVybmFsIHRyaWdnZXIsCisgICogICAgICAgICB0byBkZXRlcm1pbmUgd2hpY2ggcGVyaXBoZXJhbCBpcyBzZWxlY3RlZCBhcyBleHRlcm5hbCB0cmlnZ2VyLAorICAqICAgICAgICAgdXNlIGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19HZXRUcmlnZ2VyU291cmNlKCkuCisgICogQHJtdG9sbCBDRkdSICAgICBFWFRFTiAgICAgICAgICBMTF9BRENfUkVHX0lzVHJpZ2dlclNvdXJjZVNXU3RhcnQKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSAiMCIgaWYgdHJpZ2dlciBzb3VyY2UgZXh0ZXJuYWwgdHJpZ2dlcgorICAqICAgICAgICAgVmFsdWUgIjEiIGlmIHRyaWdnZXIgc291cmNlIFNXIHN0YXJ0LgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfSXNUcmlnZ2VyU291cmNlU1dTdGFydChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChBREN4LT5DRkdSLCBBRENfQ0ZHUl9FWFRFTikgPT0gKExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSAmIEFEQ19DRkdSX0VYVEVOKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBwb2xhcml0eS4KKyAgKiBAbm90ZSAgIEFwcGxpY2FibGUgb25seSBmb3IgdHJpZ2dlciBzb3VyY2Ugc2V0IHRvIGV4dGVybmFsIHRyaWdnZXIuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGdyb3VwIHJlZ3VsYXIuCisgICogQHJtdG9sbCBDRkdSICAgICBFWFRFTiAgICAgICAgICBMTF9BRENfUkVHX1NldFRyaWdnZXJFZGdlCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgRXh0ZXJuYWxUcmlnZ2VyRWRnZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfUklTSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9GQUxMSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9SSVNJTkdGQUxMSU5HCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1NldFRyaWdnZXJFZGdlKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBFeHRlcm5hbFRyaWdnZXJFZGdlKQoreworICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX0VYVEVOLCBFeHRlcm5hbFRyaWdnZXJFZGdlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIHBvbGFyaXR5LgorICAqIEBub3RlICAgQXBwbGljYWJsZSBvbmx5IGZvciB0cmlnZ2VyIHNvdXJjZSBzZXQgdG8gZXh0ZXJuYWwgdHJpZ2dlci4KKyAgKiBAcm10b2xsIENGR1IgICAgIEVYVEVOICAgICAgICAgIExMX0FEQ19SRUdfR2V0VHJpZ2dlckVkZ2UKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfUklTSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9GQUxMSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9SSVNJTkdGQUxMSU5HCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19HZXRUcmlnZ2VyRWRnZShBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUiwgQURDX0NGR1JfRVhURU4pKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBzY2FuIGRpcmVjdGlvbi4KKyAgKiBAbm90ZSAgIERlc2NyaXB0aW9uIG9mIEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBmZWF0dXJlczoKKyAgKiAgICAgICAgIC0gRm9yIGRldmljZXMgd2l0aCBzZXF1ZW5jZXIgZnVsbHkgY29uZmlndXJhYmxlCisgICogICAgICAgICAgIChmdW5jdGlvbiAiTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rcygpIiBhdmFpbGFibGUpOgorICAqICAgICAgICAgICBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBlYWNoIHJhbmsgYWZmZWN0YXRpb24gdG8gYSBjaGFubmVsCisgICogICAgICAgICAgIGFyZSBjb25maWd1cmFibGUuCisgICogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgY29uZmlndXJhdGlvbiBvZjoKKyAgKiAgICAgICAgICAgLSBTZXF1ZW5jZSBsZW5ndGg6IE51bWJlciBvZiByYW5rcyBpbiB0aGUgc2NhbiBzZXF1ZW5jZS4KKyAgKiAgICAgICAgICAgLSBTZXF1ZW5jZSBkaXJlY3Rpb246IFVubGVzcyBzcGVjaWZpZWQgaW4gcGFyYW1ldGVycywgc2VxdWVuY2VyCisgICogICAgICAgICAgICAgc2NhbiBkaXJlY3Rpb24gaXMgZm9yd2FyZCAoZnJvbSByYW5rIDEgdG8gcmFuayBuKS4KKyAgKiAgICAgICAgICAgU2VxdWVuY2VyIHJhbmtzIGFyZSBzZWxlY3RlZCB1c2luZworICAqICAgICAgICAgICBmdW5jdGlvbiAiTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rcygpIi4KKyAgKiAgICAgICAgIC0gRm9yIGRldmljZXMgd2l0aCBzZXF1ZW5jZXIgbm90IGZ1bGx5IGNvbmZpZ3VyYWJsZQorICAqICAgICAgICAgICAoZnVuY3Rpb24gIkxMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hhbm5lbHMoKSIgYXZhaWxhYmxlKToKKyAgKiAgICAgICAgICAgc2VxdWVuY2VyIGxlbmd0aCBhbmQgZWFjaCByYW5rIGFmZmVjdGF0aW9uIHRvIGEgY2hhbm5lbAorICAqICAgICAgICAgICBhcmUgZGVmaW5lZCBieSBjaGFubmVsIG51bWJlci4KKyAgKiAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBjb25maWd1cmF0aW9uIG9mOgorICAqICAgICAgICAgICAtIFNlcXVlbmNlIGxlbmd0aDogTnVtYmVyIG9mIHJhbmtzIGluIHRoZSBzY2FuIHNlcXVlbmNlIGlzCisgICogICAgICAgICAgICAgZGVmaW5lZCBieSBudW1iZXIgb2YgY2hhbm5lbHMgc2V0IGluIHRoZSBzZXF1ZW5jZSwKKyAgKiAgICAgICAgICAgICByYW5rIG9mIGVhY2ggY2hhbm5lbCBpcyBmaXhlZCBieSBjaGFubmVsIEhXIG51bWJlci4KKyAgKiAgICAgICAgICAgICAoY2hhbm5lbCAwIGZpeGVkIG9uIHJhbmsgMCwgY2hhbm5lbCAxIGZpeGVkIG9uIHJhbmsxLCAuLi4pLgorICAqICAgICAgICAgICAtIFNlcXVlbmNlIGRpcmVjdGlvbjogVW5sZXNzIHNwZWNpZmllZCBpbiBwYXJhbWV0ZXJzLCBzZXF1ZW5jZXIKKyAgKiAgICAgICAgICAgICBzY2FuIGRpcmVjdGlvbiBpcyBmb3J3YXJkIChmcm9tIGxvd2VzdCBjaGFubmVsIG51bWJlciB0bworICAqICAgICAgICAgICAgIGhpZ2hlc3QgY2hhbm5lbCBudW1iZXIpLgorICAqICAgICAgICAgICBTZXF1ZW5jZXIgcmFua3MgYXJlIHNlbGVjdGVkIHVzaW5nCisgICogICAgICAgICAgIGZ1bmN0aW9uICJMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoYW5uZWxzKCkiLgorICAqIEBub3RlICAgU2VxdWVuY2VyIGRpc2FibGVkIGlzIGVxdWl2YWxlbnQgdG8gc2VxdWVuY2VyIG9mIDEgcmFuazoKKyAgKiAgICAgICAgIEFEQyBjb252ZXJzaW9uIG9uIG9ubHkgMSBjaGFubmVsLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBncm91cCByZWd1bGFyLgorICAqIEBybXRvbGwgU1FSMSAgICAgTCAgICAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJMZW5ndGgKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBTZXF1ZW5jZXJOYlJhbmtzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMlJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfM1JBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfNFJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfNVJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfNlJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfN1JBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfOFJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfOVJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTBSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzExUkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xMlJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTNSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzE0UkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xNVJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTZSQU5LUworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJMZW5ndGgoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFNlcXVlbmNlck5iUmFua3MpCit7CisgIE1PRElGWV9SRUcoQURDeC0+U1FSMSwgQURDX1NRUjFfTCwgU2VxdWVuY2VyTmJSYW5rcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBsZW5ndGggYW5kIHNjYW4gZGlyZWN0aW9uLgorICAqIEBub3RlICAgRGVzY3JpcHRpb24gb2YgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGZlYXR1cmVzOgorICAqICAgICAgICAgLSBGb3IgZGV2aWNlcyB3aXRoIHNlcXVlbmNlciBmdWxseSBjb25maWd1cmFibGUKKyAgKiAgICAgICAgICAgKGZ1bmN0aW9uICJMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzKCkiIGF2YWlsYWJsZSk6CisgICogICAgICAgICAgIHNlcXVlbmNlciBsZW5ndGggYW5kIGVhY2ggcmFuayBhZmZlY3RhdGlvbiB0byBhIGNoYW5uZWwKKyAgKiAgICAgICAgICAgYXJlIGNvbmZpZ3VyYWJsZS4KKyAgKiAgICAgICAgICAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXM6CisgICogICAgICAgICAgIC0gU2VxdWVuY2UgbGVuZ3RoOiBOdW1iZXIgb2YgcmFua3MgaW4gdGhlIHNjYW4gc2VxdWVuY2UuCisgICogICAgICAgICAgIC0gU2VxdWVuY2UgZGlyZWN0aW9uOiBVbmxlc3Mgc3BlY2lmaWVkIGluIHBhcmFtZXRlcnMsIHNlcXVlbmNlcgorICAqICAgICAgICAgICAgIHNjYW4gZGlyZWN0aW9uIGlzIGZvcndhcmQgKGZyb20gcmFuayAxIHRvIHJhbmsgbikuCisgICogICAgICAgICAgIFNlcXVlbmNlciByYW5rcyBhcmUgc2VsZWN0ZWQgdXNpbmcKKyAgKiAgICAgICAgICAgZnVuY3Rpb24gIkxMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3MoKSIuCisgICogICAgICAgICAtIEZvciBkZXZpY2VzIHdpdGggc2VxdWVuY2VyIG5vdCBmdWxseSBjb25maWd1cmFibGUKKyAgKiAgICAgICAgICAgKGZ1bmN0aW9uICJMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoYW5uZWxzKCkiIGF2YWlsYWJsZSk6CisgICogICAgICAgICAgIHNlcXVlbmNlciBsZW5ndGggYW5kIGVhY2ggcmFuayBhZmZlY3RhdGlvbiB0byBhIGNoYW5uZWwKKyAgKiAgICAgICAgICAgYXJlIGRlZmluZWQgYnkgY2hhbm5lbCBudW1iZXIuCisgICogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzOgorICAqICAgICAgICAgICAtIFNlcXVlbmNlIGxlbmd0aDogTnVtYmVyIG9mIHJhbmtzIGluIHRoZSBzY2FuIHNlcXVlbmNlIGlzCisgICogICAgICAgICAgICAgZGVmaW5lZCBieSBudW1iZXIgb2YgY2hhbm5lbHMgc2V0IGluIHRoZSBzZXF1ZW5jZSwKKyAgKiAgICAgICAgICAgICByYW5rIG9mIGVhY2ggY2hhbm5lbCBpcyBmaXhlZCBieSBjaGFubmVsIEhXIG51bWJlci4KKyAgKiAgICAgICAgICAgICAoY2hhbm5lbCAwIGZpeGVkIG9uIHJhbmsgMCwgY2hhbm5lbCAxIGZpeGVkIG9uIHJhbmsxLCAuLi4pLgorICAqICAgICAgICAgICAtIFNlcXVlbmNlIGRpcmVjdGlvbjogVW5sZXNzIHNwZWNpZmllZCBpbiBwYXJhbWV0ZXJzLCBzZXF1ZW5jZXIKKyAgKiAgICAgICAgICAgICBzY2FuIGRpcmVjdGlvbiBpcyBmb3J3YXJkIChmcm9tIGxvd2VzdCBjaGFubmVsIG51bWJlciB0bworICAqICAgICAgICAgICAgIGhpZ2hlc3QgY2hhbm5lbCBudW1iZXIpLgorICAqICAgICAgICAgICBTZXF1ZW5jZXIgcmFua3MgYXJlIHNlbGVjdGVkIHVzaW5nCisgICogICAgICAgICAgIGZ1bmN0aW9uICJMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoYW5uZWxzKCkiLgorICAqIEBub3RlICAgU2VxdWVuY2VyIGRpc2FibGVkIGlzIGVxdWl2YWxlbnQgdG8gc2VxdWVuY2VyIG9mIDEgcmFuazoKKyAgKiAgICAgICAgIEFEQyBjb252ZXJzaW9uIG9uIG9ubHkgMSBjaGFubmVsLgorICAqIEBybXRvbGwgU1FSMSAgICAgTCAgICAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJMZW5ndGgKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzJSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzNSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzRSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzVSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzZSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzdSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzhSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzlSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzEwUkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xMVJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTJSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzEzUkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xNFJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTVSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzE2UkFOS1MKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfUkVHX0dldFNlcXVlbmNlckxlbmd0aChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+U1FSMSwgQURDX1NRUjFfTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlOgorICAqICAgICAgICAgc2VxdWVuY2Ugc3ViZGl2aWRlZCBhbmQgc2NhbiBjb252ZXJzaW9ucyBpbnRlcnJ1cHRlZCBldmVyeSBzZWxlY3RlZAorICAqICAgICAgICAgbnVtYmVyIG9mIHJhbmtzLgorICAqIEBub3RlICAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIGVuYWJsZSBib3RoIEFEQyBncm91cCByZWd1bGFyIAorICAqICAgICAgICAgY29udGludW91cyBtb2RlIGFuZCBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlLgorICAqIEBub3RlICAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIGVuYWJsZSBib3RoIEFEQyBhdXRvLWluamVjdGVkIG1vZGUKKyAgKiAgICAgICAgIGFuZCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBncm91cCByZWd1bGFyLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgRElTQ0VOICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJEaXNjb250XG4KKyAgKiAgICAgICAgIENGR1IgICAgIERJU0NOVU0gICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyRGlzY29udAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFNlcURpc2NvbnQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzFSQU5LCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfRElTQ09OVF8yUkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzNSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfNFJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfRElTQ09OVF81UkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzZSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfN1JBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfRElTQ09OVF84UkFOS1MKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyRGlzY29udChBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgU2VxRGlzY29udCkKK3sKKyAgTU9ESUZZX1JFRyhBREN4LT5DRkdSLCBBRENfQ0ZHUl9ESVNDRU4gfCBBRENfQ0ZHUl9ESVNDTlVNLCBTZXFEaXNjb250KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZToKKyAgKiAgICAgICAgIHNlcXVlbmNlIHN1YmRpdmlkZWQgYW5kIHNjYW4gY29udmVyc2lvbnMgaW50ZXJydXB0ZWQgZXZlcnkgc2VsZWN0ZWQKKyAgKiAgICAgICAgIG51bWJlciBvZiByYW5rcy4KKyAgKiBAcm10b2xsIENGR1IgICAgIERJU0NFTiAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyRGlzY29udFxuCisgICogICAgICAgICBDRkdSICAgICBESVNDTlVNICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlckRpc2NvbnQKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfMVJBTksKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzJSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfM1JBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfRElTQ09OVF80UkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzVSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfNlJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfRElTQ09OVF83UkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzhSQU5LUworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyRGlzY29udChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUiwgQURDX0NGR1JfRElTQ0VOIHwgQURDX0NGR1JfRElTQ05VTSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZTogY2hhbm5lbCBvbiB0aGUgc2VsZWN0ZWQKKyAgKiAgICAgICAgIHNjYW4gc2VxdWVuY2UgcmFuay4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgY29uZmlndXJhdGlvbiBvZjoKKyAgKiAgICAgICAgIC0gQ2hhbm5lbHMgb3JkZXJpbmcgaW50byBlYWNoIHJhbmsgb2Ygc2NhbiBzZXF1ZW5jZToKKyAgKiAgICAgICAgICAgd2hhdGV2ZXIgY2hhbm5lbCBjYW4gYmUgcGxhY2VkIGludG8gd2hhdGV2ZXIgcmFuay4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBpcworICAqICAgICAgICAgZnVsbHkgY29uZmlndXJhYmxlOiBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBlYWNoIHJhbmsKKyAgKiAgICAgICAgIGFmZmVjdGF0aW9uIHRvIGEgY2hhbm5lbCBhcmUgY29uZmlndXJhYmxlLgorICAqICAgICAgICAgUmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlckxlbmd0aCgpLgorICAqIEBub3RlICAgRGVwZW5kaW5nIG9uIGRldmljZXMgYW5kIHBhY2thZ2VzLCBzb21lIGNoYW5uZWxzIG1heSBub3QgYmUgYXZhaWxhYmxlLgorICAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgdG8gbWVhc3VyZSBpbnRlcm5hbCBjaGFubmVscyAoVnJlZkludCwKKyAgKiAgICAgICAgIFRlbXBTZW5zb3IsIC4uLiksIG1lYXN1cmVtZW50IHBhdGhzIHRvIGludGVybmFsIGNoYW5uZWxzIG11c3QgYmUKKyAgKiAgICAgICAgIGVuYWJsZWQgc2VwYXJhdGVseS4KKyAgKiAgICAgICAgIFRoaXMgY2FuIGJlIGRvbmUgdXNpbmcgZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2goKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4KKyAgKiBAcm10b2xsIFNRUjEgICAgIFNRMSAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSMSAgICAgU1EyICAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVIxICAgICBTUTMgICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjEgICAgIFNRNCAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSMiAgICAgU1E1ICAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVIyICAgICBTUTYgICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjIgICAgIFNRNyAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSMiAgICAgU1E4ICAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVIyICAgICBTUTkgICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjMgICAgIFNRMTAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSMyAgICAgU1ExMSAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVIzICAgICBTUTEyICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjMgICAgIFNRMTMgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSMyAgICAgU1ExNCAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVI0ICAgICBTUTE1ICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjQgICAgIFNRMTYgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3MKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBSYW5rIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS182CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS185CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzE2CisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAoNSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkJBVCAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDEgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAyICAgICAgKDIpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMyAgICAgICgzKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDQgICAgICAoNCkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzEuXG4KKyAgKiAgICAgICAgICgyKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMyLlxuCisgICogICAgICAgICAoMykgT24gU1RNMzJGMywgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMy5cbgorICAqICAgICAgICAgKDQpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOiBBREM0LlxuCisgICogICAgICAgICAoNSkgT24gU1RNMzJGMywgQURDIGNoYW5uZWwgYXZhaWxhYmxlIG9ubHkgb24gYWxsIEFEQyBpbnN0YW5jZXMsIGJ1dAorICAqICAgICAgICAgICAgIG9ubHkgb25lIEFEQyBpbnN0YW5jZSBpcyBhbGxvd2VkIHRvIGJlIGNvbm5lY3RlZCB0byBWcmVmSW50IGF0IHRoZSBzYW1lIHRpbWUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBSYW5rLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBTZXQgYml0cyB3aXRoIGNvbnRlbnQgb2YgcGFyYW1ldGVyICJDaGFubmVsIiB3aXRoIGJpdHMgcG9zaXRpb24gICAgICAgICAgKi8KKyAgLyogaW4gcmVnaXN0ZXIgYW5kIHJlZ2lzdGVyIHBvc2l0aW9uIGRlcGVuZGluZyBvbiBwYXJhbWV0ZXIgIlJhbmsiLiAgICAgICAgICovCisgIC8qIFBhcmFtZXRlcnMgIlJhbmsiIGFuZCAiQ2hhbm5lbCIgYXJlIHVzZWQgd2l0aCBtYXNrcyBiZWNhdXNlIGNvbnRhaW5pbmcgICAqLworICAvKiBvdGhlciBiaXRzIHJlc2VydmVkIGZvciBvdGhlciBwdXJwb3NlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQURDX1BUUl9SRUdfT0ZGU0VUKEFEQ3gtPlNRUjEsIF9fQURDX01BU0tfU0hJRlQoUmFuaywgQURDX1JFR19TUVJYX1JFR09GRlNFVF9NQVNLKSk7CisgIAorICBNT0RJRllfUkVHKCpwcmVnLAorICAgICAgICAgICAgIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLX1BPU0JJVDAgPDwgKFJhbmsgJiBBRENfUkVHX1JBTktfSURfU1FSWF9NQVNLKSwKKyAgICAgICAgICAgICAoQ2hhbm5lbCAmIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLKSA+PiAoQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MgLSAoUmFuayAmIEFEQ19SRUdfUkFOS19JRF9TUVJYX01BU0spKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlOiBjaGFubmVsIG9uIHRoZSBzZWxlY3RlZAorICAqICAgICAgICAgc2NhbiBzZXF1ZW5jZSByYW5rLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGlzCisgICogICAgICAgICBmdWxseSBjb25maWd1cmFibGU6IHNlcXVlbmNlciBsZW5ndGggYW5kIGVhY2ggcmFuaworICAqICAgICAgICAgYWZmZWN0YXRpb24gdG8gYSBjaGFubmVsIGFyZSBjb25maWd1cmFibGUuCisgICogICAgICAgICBSZWZlciB0byBkZXNjcmlwdGlvbiBvZiBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyTGVuZ3RoKCkuCisgICogQG5vdGUgICBEZXBlbmRpbmcgb24gZGV2aWNlcyBhbmQgcGFja2FnZXMsIHNvbWUgY2hhbm5lbHMgbWF5IG5vdCBiZSBhdmFpbGFibGUuCisgICogICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuCisgICogQG5vdGUgICBVc2FnZSBvZiB0aGUgcmV0dXJuZWQgY2hhbm5lbCBudW1iZXI6CisgICogICAgICAgICAtIFRvIHJlaW5qZWN0IHRoaXMgY2hhbm5lbCBpbnRvIGFub3RoZXIgZnVuY3Rpb24gTExfQURDX3h4eDoKKyAgKiAgICAgICAgICAgdGhlIHJldHVybmVkIGNoYW5uZWwgbnVtYmVyIGlzIG9ubHkgcGFydGx5IGZvcm1hdHRlZCBvbiBkZWZpbml0aW9uCisgICogICAgICAgICAgIG9mIGxpdGVyYWxzIExMX0FEQ19DSEFOTkVMX3guIFRoZXJlZm9yZSwgaXQgaGFzIHRvIGJlIGNvbXBhcmVkCisgICogICAgICAgICAgIHdpdGggcGFydHMgb2YgbGl0ZXJhbHMgTExfQURDX0NIQU5ORUxfeCBvciB1c2luZworICAqICAgICAgICAgICBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoKS4KKyAgKiAgICAgICAgICAgVGhlbiB0aGUgc2VsZWN0ZWQgbGl0ZXJhbCBMTF9BRENfQ0hBTk5FTF94IGNhbiBiZSB1c2VkCisgICogICAgICAgICAgIGFzIHBhcmFtZXRlciBmb3IgYW5vdGhlciBmdW5jdGlvbi4KKyAgKiAgICAgICAgIC0gVG8gZ2V0IHRoZSBjaGFubmVsIG51bWJlciBpbiBkZWNpbWFsIGZvcm1hdDoKKyAgKiAgICAgICAgICAgcHJvY2VzcyB0aGUgcmV0dXJuZWQgdmFsdWUgd2l0aCB0aGUgaGVscGVyIG1hY3JvCisgICogICAgICAgICAgIEByZWYgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKCkuCisgICogQHJtdG9sbCBTUVIxICAgICBTUTEgICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjEgICAgIFNRMiAgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSMSAgICAgU1EzICAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVIxICAgICBTUTQgICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjIgICAgIFNRNSAgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSMiAgICAgU1E2ICAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVIyICAgICBTUTcgICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjIgICAgIFNROCAgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSMiAgICAgU1E5ICAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVIzICAgICBTUTEwICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjMgICAgIFNRMTEgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSMyAgICAgU1ExMiAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVIzICAgICBTUTEzICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjMgICAgIFNRMTQgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSNCAgICAgU1ExNSAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVI0ICAgICBTUTE2ICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgUmFuayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS180CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS183CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18xNgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICg1KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WQkFUICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIgICAgICAoMikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzICAgICAgKDMpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNCAgICAgICg0KQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gU1RNMzJGMywgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbgorICAqICAgICAgICAgKDIpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzIuXG4KKyAgKiAgICAgICAgICgzKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMzLlxuCisgICogICAgICAgICAoNCkgT24gU1RNMzJGMywgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6IEFEQzQuXG4KKyAgKiAgICAgICAgICg1KSBPbiBTVE0zMkYzLCBBREMgY2hhbm5lbCBhdmFpbGFibGUgb25seSBvbiBhbGwgQURDIGluc3RhbmNlcywgYnV0CisgICogICAgICAgICAgICAgb25seSBvbmUgQURDIGluc3RhbmNlIGlzIGFsbG93ZWQgdG8gYmUgY29ubmVjdGVkIHRvIFZyZWZJbnQgYXQgdGhlIHNhbWUgdGltZS5cbgorICAqICAgICAgICAgKDEsIDIsIDMsIDQsIDUpIEZvciBBREMgY2hhbm5lbCByZWFkIGJhY2sgZnJvbSBBREMgcmVnaXN0ZXIsCisgICogICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbiB3aXRoIGludGVybmFsIGNoYW5uZWwgcGFyYW1ldGVyIHRvIGJlIGRvbmUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DSEFOTkVMX0lOVEVSTkFMX1RPX0VYVEVSTkFMKCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rcyhBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgUmFuaykKK3sKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQURDX1BUUl9SRUdfT0ZGU0VUKEFEQ3gtPlNRUjEsIF9fQURDX01BU0tfU0hJRlQoUmFuaywgQURDX1JFR19TUVJYX1JFR09GRlNFVF9NQVNLKSk7CisgIAorICByZXR1cm4gKHVpbnQzMl90KSAoUkVBRF9CSVQoKnByZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTS19QT1NCSVQwIDw8IChSYW5rICYgQURDX1JFR19SQU5LX0lEX1NRUlhfTUFTSykpCisgICAgICAgICAgICAgICAgICAgICA8PCAoQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MgLSAoUmFuayAmIEFEQ19SRUdfUkFOS19JRF9TUVJYX01BU0spKQorICAgICAgICAgICAgICAgICAgICApOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgY29udGludW91cyBjb252ZXJzaW9uIG1vZGUgb24gQURDIGdyb3VwIHJlZ3VsYXIuCisgICogQG5vdGUgICBEZXNjcmlwdGlvbiBvZiBBREMgY29udGludW91cyBjb252ZXJzaW9uIG1vZGU6CisgICogICAgICAgICAtIHNpbmdsZSBtb2RlOiBvbmUgY29udmVyc2lvbiBwZXIgdHJpZ2dlcgorICAqICAgICAgICAgLSBjb250aW51b3VzIG1vZGU6IGFmdGVyIHRoZSBmaXJzdCB0cmlnZ2VyLCBmb2xsb3dpbmcKKyAgKiAgICAgICAgICAgY29udmVyc2lvbnMgbGF1bmNoZWQgc3VjY2Vzc2l2ZWx5IGF1dG9tYXRpY2FsbHkuCisgICogQG5vdGUgICBJdCBpcyBub3QgcG9zc2libGUgdG8gZW5hYmxlIGJvdGggQURDIGdyb3VwIHJlZ3VsYXIgCisgICogICAgICAgICBjb250aW51b3VzIG1vZGUgYW5kIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGdyb3VwIHJlZ3VsYXIuCisgICogQHJtdG9sbCBDRkdSICAgICBDT05UICAgICAgICAgICBMTF9BRENfUkVHX1NldENvbnRpbnVvdXNNb2RlCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ29udGludW91cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfQ09OVl9TSU5HTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX0NPTlZfQ09OVElOVU9VUworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1JFR19TZXRDb250aW51b3VzTW9kZShBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgQ29udGludW91cykKK3sKKyAgTU9ESUZZX1JFRyhBREN4LT5DRkdSLCBBRENfQ0ZHUl9DT05ULCBDb250aW51b3VzKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGNvbnRpbnVvdXMgY29udmVyc2lvbiBtb2RlIG9uIEFEQyBncm91cCByZWd1bGFyLgorICAqIEBub3RlICAgRGVzY3JpcHRpb24gb2YgQURDIGNvbnRpbnVvdXMgY29udmVyc2lvbiBtb2RlOgorICAqICAgICAgICAgLSBzaW5nbGUgbW9kZTogb25lIGNvbnZlcnNpb24gcGVyIHRyaWdnZXIKKyAgKiAgICAgICAgIC0gY29udGludW91cyBtb2RlOiBhZnRlciB0aGUgZmlyc3QgdHJpZ2dlciwgZm9sbG93aW5nCisgICogICAgICAgICAgIGNvbnZlcnNpb25zIGxhdW5jaGVkIHN1Y2Nlc3NpdmVseSBhdXRvbWF0aWNhbGx5LgorICAqIEBybXRvbGwgQ0ZHUiAgICAgQ09OVCAgICAgICAgICAgTExfQURDX1JFR19HZXRDb250aW51b3VzTW9kZQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19DT05WX1NJTkdMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfQ09OVl9DT05USU5VT1VTCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19HZXRDb250aW51b3VzTW9kZShBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUiwgQURDX0NGR1JfQ09OVCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIGRhdGEgdHJhbnNmZXI6IG5vIHRyYW5zZmVyIG9yCisgICogICAgICAgICB0cmFuc2ZlciBieSBETUEsIGFuZCBETUEgcmVxdWVzdHMgbW9kZS4KKyAgKiBAbm90ZSAgIElmIHRyYW5zZmVyIGJ5IERNQSBzZWxlY3RlZCwgc3BlY2lmaWVzIHRoZSBETUEgcmVxdWVzdHMKKyAgKiAgICAgICAgIG1vZGU6CisgICogICAgICAgICAtIExpbWl0ZWQgbW9kZSAoT25lIHNob3QgbW9kZSk6IERNQSB0cmFuc2ZlciByZXF1ZXN0cyBhcmUgc3RvcHBlZAorICAqICAgICAgICAgICB3aGVuIG51bWJlciBvZiBETUEgZGF0YSB0cmFuc2ZlcnMgKG51bWJlciBvZgorICAqICAgICAgICAgICBBREMgY29udmVyc2lvbnMpIGlzIHJlYWNoZWQuCisgICogICAgICAgICAgIFRoaXMgQURDIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIERNQSBtb2RlIG5vbi1jaXJjdWxhci4KKyAgKiAgICAgICAgIC0gVW5saW1pdGVkIG1vZGU6IERNQSB0cmFuc2ZlciByZXF1ZXN0cyBhcmUgdW5saW1pdGVkLAorICAqICAgICAgICAgICB3aGF0ZXZlciBudW1iZXIgb2YgRE1BIGRhdGEgdHJhbnNmZXJzIChudW1iZXIgb2YKKyAgKiAgICAgICAgICAgQURDIGNvbnZlcnNpb25zKS4KKyAgKiAgICAgICAgICAgVGhpcyBBREMgbW9kZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggRE1BIG1vZGUgY2lyY3VsYXIuCisgICogQG5vdGUgICBJZiBBREMgRE1BIHJlcXVlc3RzIG1vZGUgaXMgc2V0IHRvIHVubGltaXRlZCBhbmQgRE1BIGlzIHNldCB0bworICAqICAgICAgICAgbW9kZSBub24tY2lyY3VsYXI6CisgICogICAgICAgICB3aGVuIERNQSB0cmFuc2ZlcnMgc2l6ZSB3aWxsIGJlIHJlYWNoZWQsIERNQSB3aWxsIHN0b3AgdHJhbnNmZXJzIG9mCisgICogICAgICAgICBBREMgY29udmVyc2lvbnMgZGF0YSBBREMgd2lsbCByYWlzZSBhbiBvdmVycnVuIGVycm9yCisgICogICAgICAgIChvdmVycnVuIGZsYWcgYW5kIGludGVycnVwdGlvbiBpZiBlbmFibGVkKS4KKyAgKiBAbm90ZSAgIEZvciBkZXZpY2VzIHdpdGggc2V2ZXJhbCBBREMgaW5zdGFuY2VzOiBBREMgbXVsdGltb2RlIERNQQorICAqICAgICAgICAgc2V0dGluZ3MgYXJlIGF2YWlsYWJsZSB1c2luZyBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRNdWx0aURNQVRyYW5zZmVyKCkuCisgICogQG5vdGUgICBUbyBjb25maWd1cmUgRE1BIHNvdXJjZSBhZGRyZXNzIChwZXJpcGhlcmFsIGFkZHJlc3MpLAorICAqICAgICAgICAgdXNlIGZ1bmN0aW9uIEByZWYgTExfQURDX0RNQV9HZXRSZWdBZGRyKCkuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4KKyAgKiBAcm10b2xsIENGR1IgICAgIERNQUVOICAgICAgICAgIExMX0FEQ19SRUdfU2V0RE1BVHJhbnNmZXJcbgorICAqICAgICAgICAgQ0ZHUiAgICAgRE1BQ0ZHICAgICAgICAgTExfQURDX1JFR19TZXRETUFUcmFuc2ZlcgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERNQVRyYW5zZmVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19ETUFfVFJBTlNGRVJfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX0xJTUlURUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9VTkxJTUlURUQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19SRUdfU2V0RE1BVHJhbnNmZXIoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IERNQVRyYW5zZmVyKQoreworICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX0RNQUVOIHwgQURDX0NGR1JfRE1BQ0ZHLCBETUFUcmFuc2Zlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gZGF0YSB0cmFuc2Zlcjogbm8gdHJhbnNmZXIgb3IKKyAgKiAgICAgICAgIHRyYW5zZmVyIGJ5IERNQSwgYW5kIERNQSByZXF1ZXN0cyBtb2RlLgorICAqIEBub3RlICAgSWYgdHJhbnNmZXIgYnkgRE1BIHNlbGVjdGVkLCBzcGVjaWZpZXMgdGhlIERNQSByZXF1ZXN0cworICAqICAgICAgICAgbW9kZToKKyAgKiAgICAgICAgIC0gTGltaXRlZCBtb2RlIChPbmUgc2hvdCBtb2RlKTogRE1BIHRyYW5zZmVyIHJlcXVlc3RzIGFyZSBzdG9wcGVkCisgICogICAgICAgICAgIHdoZW4gbnVtYmVyIG9mIERNQSBkYXRhIHRyYW5zZmVycyAobnVtYmVyIG9mCisgICogICAgICAgICAgIEFEQyBjb252ZXJzaW9ucykgaXMgcmVhY2hlZC4KKyAgKiAgICAgICAgICAgVGhpcyBBREMgbW9kZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggRE1BIG1vZGUgbm9uLWNpcmN1bGFyLgorICAqICAgICAgICAgLSBVbmxpbWl0ZWQgbW9kZTogRE1BIHRyYW5zZmVyIHJlcXVlc3RzIGFyZSB1bmxpbWl0ZWQsCisgICogICAgICAgICAgIHdoYXRldmVyIG51bWJlciBvZiBETUEgZGF0YSB0cmFuc2ZlcnMgKG51bWJlciBvZgorICAqICAgICAgICAgICBBREMgY29udmVyc2lvbnMpLgorICAqICAgICAgICAgICBUaGlzIEFEQyBtb2RlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBETUEgbW9kZSBjaXJjdWxhci4KKyAgKiBAbm90ZSAgIElmIEFEQyBETUEgcmVxdWVzdHMgbW9kZSBpcyBzZXQgdG8gdW5saW1pdGVkIGFuZCBETUEgaXMgc2V0IHRvCisgICogICAgICAgICBtb2RlIG5vbi1jaXJjdWxhcjoKKyAgKiAgICAgICAgIHdoZW4gRE1BIHRyYW5zZmVycyBzaXplIHdpbGwgYmUgcmVhY2hlZCwgRE1BIHdpbGwgc3RvcCB0cmFuc2ZlcnMgb2YKKyAgKiAgICAgICAgIEFEQyBjb252ZXJzaW9ucyBkYXRhIEFEQyB3aWxsIHJhaXNlIGFuIG92ZXJydW4gZXJyb3IKKyAgKiAgICAgICAgIChvdmVycnVuIGZsYWcgYW5kIGludGVycnVwdGlvbiBpZiBlbmFibGVkKS4KKyAgKiBAbm90ZSAgIEZvciBkZXZpY2VzIHdpdGggc2V2ZXJhbCBBREMgaW5zdGFuY2VzOiBBREMgbXVsdGltb2RlIERNQQorICAqICAgICAgICAgc2V0dGluZ3MgYXJlIGF2YWlsYWJsZSB1c2luZyBmdW5jdGlvbiBAcmVmIExMX0FEQ19HZXRNdWx0aURNQVRyYW5zZmVyKCkuCisgICogQG5vdGUgICBUbyBjb25maWd1cmUgRE1BIHNvdXJjZSBhZGRyZXNzIChwZXJpcGhlcmFsIGFkZHJlc3MpLAorICAqICAgICAgICAgdXNlIGZ1bmN0aW9uIEByZWYgTExfQURDX0RNQV9HZXRSZWdBZGRyKCkuCisgICogQHJtdG9sbCBDRkdSICAgICBETUFFTiAgICAgICAgICBMTF9BRENfUkVHX0dldERNQVRyYW5zZmVyXG4KKyAgKiAgICAgICAgIENGR1IgICAgIERNQUNGRyAgICAgICAgIExMX0FEQ19SRUdfR2V0RE1BVHJhbnNmZXIKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9MSU1JVEVECisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19ETUFfVFJBTlNGRVJfVU5MSU1JVEVECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19HZXRETUFUcmFuc2ZlcihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUiwgQURDX0NGR1JfRE1BRU4gfCBBRENfQ0ZHUl9ETUFDRkcpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgYmVoYXZpb3IgaW4gY2FzZSBvZiBvdmVycnVuOgorICAqICAgICAgICAgZGF0YSBwcmVzZXJ2ZWQgb3Igb3ZlcndyaXR0ZW4uCisgICogQG5vdGUgICBDb21wYXRpYmlsaXR5IHdpdGggZGV2aWNlcyB3aXRob3V0IGZlYXR1cmUgb3ZlcnJ1bjoKKyAgKiAgICAgICAgIG90aGVyIGRldmljZXMgd2l0aG91dCB0aGlzIGZlYXR1cmUgaGF2ZSBhIGJlaGF2aW9yCisgICogICAgICAgICBlcXVpdmFsZW50IHRvIGRhdGEgb3ZlcndyaXR0ZW4uCisgICogICAgICAgICBUaGUgZGVmYXVsdCBzZXR0aW5nIG9mIG92ZXJydW4gaXMgZGF0YSBwcmVzZXJ2ZWQuCisgICogICAgICAgICBUaGVyZWZvcmUsIGZvciBjb21wYXRpYmlsaXR5IHdpdGggYWxsIGRldmljZXMsIHBhcmFtZXRlcgorICAqICAgICAgICAgb3ZlcnJ1biBzaG91bGQgYmUgc2V0IHRvIGRhdGEgb3ZlcndyaXR0ZW4uCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGdyb3VwIHJlZ3VsYXIuCisgICogQHJtdG9sbCBDRkdSICAgICBPVlJNT0QgICAgICAgICBMTF9BRENfUkVHX1NldE92ZXJydW4KKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBPdmVycnVuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19PVlJfREFUQV9QUkVTRVJWRUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX09WUl9EQVRBX09WRVJXUklUVEVOCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1NldE92ZXJydW4oQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IE92ZXJydW4pCit7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUiwgQURDX0NGR1JfT1ZSTU9ELCBPdmVycnVuKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgYmVoYXZpb3IgaW4gY2FzZSBvZiBvdmVycnVuOgorICAqICAgICAgICAgZGF0YSBwcmVzZXJ2ZWQgb3Igb3ZlcndyaXR0ZW4uCisgICogQHJtdG9sbCBDRkdSICAgICBPVlJNT0QgICAgICAgICBMTF9BRENfUkVHX0dldE92ZXJydW4KKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfT1ZSX0RBVEFfUFJFU0VSVkVECisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19PVlJfREFUQV9PVkVSV1JJVFRFTgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfR2V0T3ZlcnJ1bihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUiwgQURDX0NGR1JfT1ZSTU9EKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX0dyb3VwX0luamVjdGVkIENvbmZpZ3VyYXRpb24gb2YgQURDIGhpZXJhcmNoaWNhbCBzY29wZTogZ3JvdXAgaW5qZWN0ZWQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIHNvdXJjZToKKyAgKiAgICAgICAgIGludGVybmFsIChTVyBzdGFydCkgb3IgZnJvbSBleHRlcm5hbCBJUCAodGltZXIgZXZlbnQsCisgICogICAgICAgICBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSkuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIHRyaWdnZXIgc291cmNlIHRvIGV4dGVybmFsIHRyaWdnZXIKKyAgKiAgICAgICAgIGFsc28gc2V0IHRyaWdnZXIgcG9sYXJpdHkgdG8gcmlzaW5nIGVkZ2UgCisgICogICAgICAgICAoZGVmYXVsdCBzZXR0aW5nIGZvciBjb21wYXRpYmlsaXR5IHdpdGggc29tZSBBREMgb24gb3RoZXIKKyAgKiAgICAgICAgIFNUTTMyIGZhbWlsaWVzIGhhdmluZyB0aGlzIHNldHRpbmcgc2V0IGJ5IEhXIGRlZmF1bHQgdmFsdWUpLgorICAqICAgICAgICAgSW4gY2FzZSBvZiBuZWVkIHRvIG1vZGlmeSB0cmlnZ2VyIGVkZ2UsIHVzZQorICAqICAgICAgICAgZnVuY3Rpb24gQHJlZiBMTF9BRENfSU5KX1NldFRyaWdnZXJFZGdlKCkuCisgICogQG5vdGUgICBDYXV0aW9uIHRvIEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0cyBxdWV1ZTogT24gdGhpcyBTVE0zMiBzZXJpZSwgCisgICogICAgICAgICB1c2luZyBzdWNjZXNzaXZlbHkgc2V2ZXJhbCB0aW1lcyB0aGlzIGZ1bmN0aW9uIHdpbGwgYXBwZWFyIGhhcworICAqICAgICAgICAgaGF2aW5nIG5vIGVmZmVjdC4KKyAgKiAgICAgICAgIFRoaXMgaXMgZHVlIHRvIEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0cyBxdWV1ZSAodGhpcyBmZWF0dXJlCisgICogICAgICAgICBjYW5ub3QgYmUgZGlzYWJsZWQgb24gdGhpcyBTVE0zMiBzZXJpZSkuCisgICogICAgICAgICBUbyBzZXQgc2V2ZXJhbCBmZWF0dXJlcyBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQsIHVzZQorICAqICAgICAgICAgZnVuY3Rpb24gQHJlZiBMTF9BRENfSU5KX0NvbmZpZ1F1ZXVlQ29udGV4dCgpLgorICAqIEBub3RlICAgQXZhaWxhYmlsaXR5IG9mIHBhcmFtZXRlcnMgb2YgdHJpZ2dlciBzb3VyY2VzIGZyb20gdGltZXIgCisgICogICAgICAgICBkZXBlbmRzIG9uIHRpbWVycyBhdmFpbGFiaWxpdHkgb24gdGhlIHNlbGVjdGVkIGRldmljZS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBub3QgYmUgZGlzYWJsZWQuIENhbiBiZSBlbmFibGVkIHdpdGggb3Igd2l0aG91dCBjb252ZXJzaW9uCisgICogICAgICAgICBvbiBnb2luZyBvbiBlaXRoZXIgZ3JvdXBzIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuCisgICogQHJtdG9sbCBKU1FSICAgICBKRVhUU0VMICAgICAgICBMTF9BRENfSU5KX1NldFRyaWdnZXJTb3VyY2VcbgorICAqICAgICAgICAgSlNRUiAgICAgSkVYVEVOICAgICAgICAgTExfQURDX0lOSl9TZXRUcmlnZ2VyU291cmNlCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgVHJpZ2dlclNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19TT0ZUV0FSRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0xX1RSR08yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0xX0NIM19BREMzNCAgICAoMSkoMikgICAgICAgICAgICAgICAoOCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0yX1RSR08gICAgICAgICAgICAgICAoMykoNCkoNSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfVFJHT19BREMxMiAgICgxKSgyKSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9UUkdPX19BREMzNCAgKDEpKDIpICAgICAgICAgICAgICAgKDgpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0yX0NIMSAgICAgICAgICAgICAgICAoMykoNCkoNSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfQ0gxX0FEQzEyICAgICgxKSgyKSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19UUkdPICAgICAgICAgKDEpKDIpKDMpKDQpKDUpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NIMSAgICAgICAgICAgICAgICAoMykoNCkoNSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0gxX0FEQzEyICAgICgxKSgyKSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDMgICAgICAgICAgICAgICAgKDMpKDQpKDUpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NIM19BREMxMiAgICAoMSkoMikgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0g0ICAgICAgICAgICAgICAgICgzKSg0KSg1KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDRfQURDMTIgICAgKDEpKDIpKDMpKDQpKDUpICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU00X1RSR08gICAgICAgICAgICAgICAoMykgICAoNSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTRfVFJHT19BREMxMiAgICgxKSgyKSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9UUkdPX19BREMzNCAgKDEpKDIpICAgICAgICAgICAgICAgKDgpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU00X0NIM19BREMzNCAgICAoMSkoMikgICAgICAgICAgICAgICAoOCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTRfQ0g0X0FEQzM0ICAgICgxKSgyKSAgICAgICAgICAgICAgICg4KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNNl9UUkdPICAgICAgICAgICAgICAgKDMpKDQpKDUpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU02X1RSR09fQURDMTIgICAoMSkoMikgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTdfVFJHT19BREMzNCAgICgxKSgyKSAgICAgICAgICAgICAgICg4KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9UUkdPICAgICAgICAgKDEpKDIpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU04X1RSR08yICAgICAgICAoMSkoMikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfQ0gyX0FEQzM0ICAgICgxKSgyKSAgICAgICAgICAgICAgICg4KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9DSDRfQURDMTIgICAgKDEpKDIpICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NINF9fQURDMzQgICAoMSkoMikgICAgICAgICAgICAgICAoOCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTE1X1RSR08KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTIwX1RSR09fQURDMTIgICgxKSAgICAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfVFJHTzJfQURDMTIgKDEpICAgICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9DSDRfQURDMTIgICAoMSkgICAgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTIwX1RSR19BREMzNCAgICgxKSAgICAgICAgICAgICAgICAgICg4KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfVFJHMl9BREMzNCAgKDEpICAgICAgICAgICAgICAgICAgKDgpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9DSDJfQURDMzQgICAoMSkgICAgICAgICAgICAgICAgICAoOCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzIgICAgICAgICAgICAgICAgICg0KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHNCAgICAgICAgICAgICAgICAgKDQpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9FWFRJX0xJTkUxNSAgICAgICAgICAgICAoMykoNCkoNSkoNikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0VYVElfTElORTE1X0FEQzEyICgxKSgyKSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gU1RNMzJGMywgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXM6IGFtb25nIG90aGVycywgb24gU1RNMzJGMzAzeEUsIFNUTTMyRjM5OHh4LlxuCisgICogICAgICAgICAoMikgT24gU1RNMzJGMywgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXM6IGFtb25nIG90aGVycywgb24gU1RNMzJGMzAzeEMsIFNUTTMyRjM1OHh4LlxuCisgICogICAgICAgICAoMykgT24gU1RNMzJGMywgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXM6IGFtb25nIG90aGVycywgb24gU1RNMzJGMzAzeDgsIFNUTTMyRjMyOHh4LlxuCisgICogICAgICAgICAoNCkgT24gU1RNMzJGMywgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXM6IGFtb25nIG90aGVycywgb24gU1RNMzJGMzM0eDguXG4KKyAgKiAgICAgICAgICg1KSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlczogYW1vbmcgb3RoZXJzLCBvbiBTVE0zMkYzMDJ4QywgU1RNMzJGMzAyeEUuXG4KKyAgKiAgICAgICAgICg2KSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlczogYW1vbmcgb3RoZXJzLCBvbiBTVE0zMkYzMDF4OCwgU1RNMzJGMzAyeDgsIFNUTTMyRjMxOHh4LlxuCisgICogICAgICAgICAoNykgT24gU1RNMzJGMywgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIEFEQyBpbnN0YW5jZXM6IEFEQzEsIEFEQzIgKGZvciBBREMgaW5zdGFuY2VzIEFEQ3ggYXZhaWxhYmxlIG9uIHRoZSBzZWxlY3RlZCBkZXZpY2UpLlxuCisgICogICAgICAgICAoOCkgT24gU1RNMzJGMywgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIEFEQyBpbnN0YW5jZXM6IEFEQzMsIEFEQzQgKGZvciBBREMgaW5zdGFuY2VzIEFEQ3ggYXZhaWxhYmxlIG9uIHRoZSBzZWxlY3RlZCBkZXZpY2UpLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0lOSl9TZXRUcmlnZ2VyU291cmNlKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBUcmlnZ2VyU291cmNlKQoreworICBNT0RJRllfUkVHKEFEQ3gtPkpTUVIsIEFEQ19KU1FSX0pFWFRTRUwgfCBBRENfSlNRUl9KRVhURU4sIFRyaWdnZXJTb3VyY2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIHNvdXJjZToKKyAgKiAgICAgICAgIGludGVybmFsIChTVyBzdGFydCkgb3IgZnJvbSBleHRlcm5hbCBJUCAodGltZXIgZXZlbnQsCisgICogICAgICAgICBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSkuCisgICogQG5vdGUgICBUbyBkZXRlcm1pbmUgd2hldGhlciBncm91cCBpbmplY3RlZCB0cmlnZ2VyIHNvdXJjZSBpcworICAqICAgICAgICAgaW50ZXJuYWwgKFNXIHN0YXJ0KSBvciBleHRlcm5hbCwgd2l0aG91dCBkZXRhaWwKKyAgKiAgICAgICAgIG9mIHdoaWNoIHBlcmlwaGVyYWwgaXMgc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgdHJpZ2dlciwKKyAgKiAgICAgICAgIChlcXVpdmFsZW50IHRvIAorICAqICAgICAgICAgImlmKExMX0FEQ19JTkpfR2V0VHJpZ2dlclNvdXJjZShBREMxKSA9PSBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUpIikKKyAgKiAgICAgICAgIHVzZSBmdW5jdGlvbiBAcmVmIExMX0FEQ19JTkpfSXNUcmlnZ2VyU291cmNlU1dTdGFydC4KKyAgKiBAbm90ZSAgIEF2YWlsYWJpbGl0eSBvZiBwYXJhbWV0ZXJzIG9mIHRyaWdnZXIgc291cmNlcyBmcm9tIHRpbWVyIAorICAqICAgICAgICAgZGVwZW5kcyBvbiB0aW1lcnMgYXZhaWxhYmlsaXR5IG9uIHRoZSBzZWxlY3RlZCBkZXZpY2UuCisgICogQHJtdG9sbCBKU1FSICAgICBKRVhUU0VMICAgICAgICBMTF9BRENfSU5KX0dldFRyaWdnZXJTb3VyY2VcbgorICAqICAgICAgICAgSlNRUiAgICAgSkVYVEVOICAgICAgICAgTExfQURDX0lOSl9HZXRUcmlnZ2VyU291cmNlCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfVFJHTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9DSDNfQURDMzQgICAgKDEpKDIpICAgICAgICAgICAgICAgKDgpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0xX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9UUkdPICAgICAgICAgICAgICAgKDMpKDQpKDUpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0yX1RSR09fQURDMTIgICAoMSkoMikgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfVFJHT19fQURDMzQgICgxKSgyKSAgICAgICAgICAgICAgICg4KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9DSDEgICAgICAgICAgICAgICAgKDMpKDQpKDUpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0yX0NIMV9BREMxMiAgICAoMSkoMikgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfVFJHTyAgICAgICAgICgxKSgyKSgzKSg0KSg1KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDEgICAgICAgICAgICAgICAgKDMpKDQpKDUpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NIMV9BREMxMiAgICAoMSkoMikgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0gzICAgICAgICAgICAgICAgICgzKSg0KSg1KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDNfQURDMTIgICAgKDEpKDIpICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NINCAgICAgICAgICAgICAgICAoMykoNCkoNSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0g0X0FEQzEyICAgICgxKSgyKSgzKSg0KSg1KSAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9UUkdPICAgICAgICAgICAgICAgKDMpICAgKDUpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU00X1RSR09fQURDMTIgICAoMSkoMikgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTRfVFJHT19fQURDMzQgICgxKSgyKSAgICAgICAgICAgICAgICg4KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9DSDNfQURDMzQgICAgKDEpKDIpICAgICAgICAgICAgICAgKDgpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU00X0NINF9BREMzNCAgICAoMSkoMikgICAgICAgICAgICAgICAoOCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTZfVFJHTyAgICAgICAgICAgICAgICgzKSg0KSg1KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNNl9UUkdPX0FEQzEyICAgKDEpKDIpICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU03X1RSR09fQURDMzQgICAoMSkoMikgICAgICAgICAgICAgICAoOCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfVFJHTyAgICAgICAgICgxKSgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9UUkdPMiAgICAgICAgKDEpKDIpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NIMl9BREMzNCAgICAoMSkoMikgICAgICAgICAgICAgICAoOCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfQ0g0X0FEQzEyICAgICgxKSgyKSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9DSDRfX0FEQzM0ICAgKDEpKDIpICAgICAgICAgICAgICAgKDgpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0xNV9UUkdPCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9UUkdPX0FEQzEyICAoMSkgICAgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTIwX1RSR08yX0FEQzEyICgxKSAgICAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfQ0g0X0FEQzEyICAgKDEpICAgICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9UUkdfQURDMzQgICAoMSkgICAgICAgICAgICAgICAgICAoOCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTIwX1RSRzJfQURDMzQgICgxKSAgICAgICAgICAgICAgICAgICg4KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfQ0gyX0FEQzM0ICAgKDEpICAgICAgICAgICAgICAgICAgKDgpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkcyICAgICAgICAgICAgICAgICAoNCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzQgICAgICAgICAgICAgICAgICg0KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfRVhUSV9MSU5FMTUgICAgICAgICAgICAgKDMpKDQpKDUpKDYpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9FWFRJX0xJTkUxNV9BREMxMiAoMSkoMikgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzOiBhbW9uZyBvdGhlcnMsIG9uIFNUTTMyRjMwM3hFLCBTVE0zMkYzOTh4eC5cbgorICAqICAgICAgICAgKDIpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzOiBhbW9uZyBvdGhlcnMsIG9uIFNUTTMyRjMwM3hDLCBTVE0zMkYzNTh4eC5cbgorICAqICAgICAgICAgKDMpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzOiBhbW9uZyBvdGhlcnMsIG9uIFNUTTMyRjMwM3g4LCBTVE0zMkYzMjh4eC5cbgorICAqICAgICAgICAgKDQpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzOiBhbW9uZyBvdGhlcnMsIG9uIFNUTTMyRjMzNHg4LlxuCisgICogICAgICAgICAoNSkgT24gU1RNMzJGMywgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXM6IGFtb25nIG90aGVycywgb24gU1RNMzJGMzAyeEMsIFNUTTMyRjMwMnhFLlxuCisgICogICAgICAgICAoNikgT24gU1RNMzJGMywgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXM6IGFtb25nIG90aGVycywgb24gU1RNMzJGMzAxeDgsIFNUTTMyRjMwMng4LCBTVE0zMkYzMTh4eC5cbgorICAqICAgICAgICAgKDcpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBBREMgaW5zdGFuY2VzOiBBREMxLCBBREMyIChmb3IgQURDIGluc3RhbmNlcyBBREN4IGF2YWlsYWJsZSBvbiB0aGUgc2VsZWN0ZWQgZGV2aWNlKS5cbgorICAqICAgICAgICAgKDgpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBBREMgaW5zdGFuY2VzOiBBREMzLCBBREM0IChmb3IgQURDIGluc3RhbmNlcyBBREN4IGF2YWlsYWJsZSBvbiB0aGUgc2VsZWN0ZWQgZGV2aWNlKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSU5KX0dldFRyaWdnZXJTb3VyY2UoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IFRyaWdnZXJTb3VyY2UgPSBSRUFEX0JJVChBREN4LT5KU1FSLCBBRENfSlNRUl9KRVhUU0VMIHwgQURDX0pTUVJfSkVYVEVOKTsKKyAgCisgIC8qIFZhbHVlIGZvciBzaGlmdCBvZiB7MDsgNDsgODsgMTJ9IGRlcGVuZGluZyBvbiB2YWx1ZSBvZiBiaXRmaWVsZCAgICAgICAgICAqLworICAvKiBjb3JyZXNwb25kaW5nIHRvIEFEQ19KU1FSX0pFWFRFTiB7MDsgMTsgMjsgM30uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgcmVnaXN0ZXIgdWludDMyX3QgU2hpZnRKZXh0ZW4gPSAoKFRyaWdnZXJTb3VyY2UgJiBBRENfSlNRUl9KRVhURU4pID4+IChBRENfSU5KX1RSSUdfRVhURU5fQklUT0ZGU0VUX1BPUyAtIDJVKSk7CisgIAorICAvKiBTZXQgYml0ZmllbGQgY29ycmVzcG9uZGluZyB0byBBRENfSlNRUl9KRVhURU4gYW5kIEFEQ19KU1FSX0pFWFRTRUwgICAgICAgKi8KKyAgLyogdG8gbWF0Y2ggd2l0aCB0cmlnZ2VycyBsaXRlcmFscyBkZWZpbml0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHJldHVybiAoKFRyaWdnZXJTb3VyY2UKKyAgICAgICAgICAgJiAoQURDX0lOSl9UUklHX1NPVVJDRV9NQVNLID4+IFNoaWZ0SmV4dGVuKSAmIEFEQ19KU1FSX0pFWFRTRUwpCisgICAgICAgICAgfCAoKEFEQ19JTkpfVFJJR19FREdFX01BU0sgPj4gU2hpZnRKZXh0ZW4pICYgQURDX0pTUVJfSkVYVEVOKQorICAgICAgICAgKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBzb3VyY2UgaW50ZXJuYWwgKFNXIHN0YXJ0KQorICAgICAgICAgICAgb3IgZXh0ZXJuYWwKKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgZ3JvdXAgaW5qZWN0ZWQgdHJpZ2dlciBzb3VyY2Ugc2V0IHRvIGV4dGVybmFsIHRyaWdnZXIsCisgICogICAgICAgICB0byBkZXRlcm1pbmUgd2hpY2ggcGVyaXBoZXJhbCBpcyBzZWxlY3RlZCBhcyBleHRlcm5hbCB0cmlnZ2VyLAorICAqICAgICAgICAgdXNlIGZ1bmN0aW9uIEByZWYgTExfQURDX0lOSl9HZXRUcmlnZ2VyU291cmNlLgorICAqIEBybXRvbGwgSlNRUiAgICAgSkVYVEVOICAgICAgICAgTExfQURDX0lOSl9Jc1RyaWdnZXJTb3VyY2VTV1N0YXJ0CisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgIjAiIGlmIHRyaWdnZXIgc291cmNlIGV4dGVybmFsIHRyaWdnZXIKKyAgKiAgICAgICAgIFZhbHVlICIxIiBpZiB0cmlnZ2VyIHNvdXJjZSBTVyBzdGFydC4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSU5KX0lzVHJpZ2dlclNvdXJjZVNXU3RhcnQoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoQURDeC0+SlNRUiwgQURDX0pTUVJfSkVYVEVOKSA9PSAoTExfQURDX0lOSl9UUklHX1NPRlRXQVJFICYgQURDX0pTUVJfSkVYVEVOKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgcG9sYXJpdHkuCisgICogICAgICAgICBBcHBsaWNhYmxlIG9ubHkgZm9yIHRyaWdnZXIgc291cmNlIHNldCB0byBleHRlcm5hbCB0cmlnZ2VyLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IG5vdCBiZSBkaXNhYmxlZC4gQ2FuIGJlIGVuYWJsZWQgd2l0aCBvciB3aXRob3V0IGNvbnZlcnNpb24KKyAgKiAgICAgICAgIG9uIGdvaW5nIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4KKyAgKiBAcm10b2xsIEpTUVIgICAgIEpFWFRFTiAgICAgICAgIExMX0FEQ19JTkpfU2V0VHJpZ2dlckVkZ2UKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBFeHRlcm5hbFRyaWdnZXJFZGdlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9SSVNJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0ZBTExJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1JJU0lOR0ZBTExJTkcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19JTkpfU2V0VHJpZ2dlckVkZ2UoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IEV4dGVybmFsVHJpZ2dlckVkZ2UpCit7CisgIE1PRElGWV9SRUcoQURDeC0+SlNRUiwgQURDX0pTUVJfSkVYVEVOLCBFeHRlcm5hbFRyaWdnZXJFZGdlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBwb2xhcml0eS4KKyAgKiAgICAgICAgIEFwcGxpY2FibGUgb25seSBmb3IgdHJpZ2dlciBzb3VyY2Ugc2V0IHRvIGV4dGVybmFsIHRyaWdnZXIuCisgICogQHJtdG9sbCBKU1FSICAgICBKRVhURU4gICAgICAgICBMTF9BRENfSU5KX0dldFRyaWdnZXJFZGdlCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1JJU0lORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfRkFMTElORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfUklTSU5HRkFMTElORworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19JTkpfR2V0VHJpZ2dlckVkZ2UoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkpTUVIsIEFEQ19KU1FSX0pFWFRFTikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGxlbmd0aCBhbmQgc2NhbiBkaXJlY3Rpb24uCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGNvbmZpZ3VyYXRpb24gb2Y6CisgICogICAgICAgICAtIFNlcXVlbmNlIGxlbmd0aDogTnVtYmVyIG9mIHJhbmtzIGluIHRoZSBzY2FuIHNlcXVlbmNlLgorICAqICAgICAgICAgLSBTZXF1ZW5jZSBkaXJlY3Rpb246IFVubGVzcyBzcGVjaWZpZWQgaW4gcGFyYW1ldGVycywgc2VxdWVuY2VyCisgICogICAgICAgICAgIHNjYW4gZGlyZWN0aW9uIGlzIGZvcndhcmQgKGZyb20gcmFuayAxIHRvIHJhbmsgbikuCisgICogQG5vdGUgICBTZXF1ZW5jZXIgZGlzYWJsZWQgaXMgZXF1aXZhbGVudCB0byBzZXF1ZW5jZXIgb2YgMSByYW5rOgorICAqICAgICAgICAgQURDIGNvbnZlcnNpb24gb24gb25seSAxIGNoYW5uZWwuCisgICogQG5vdGUgICBDYXV0aW9uIHRvIEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0cyBxdWV1ZTogT24gdGhpcyBTVE0zMiBzZXJpZSwgCisgICogICAgICAgICB1c2luZyBzdWNjZXNzaXZlbHkgc2V2ZXJhbCB0aW1lcyB0aGlzIGZ1bmN0aW9uIHdpbGwgYXBwZWFyIGhhcworICAqICAgICAgICAgaGF2aW5nIG5vIGVmZmVjdC4KKyAgKiAgICAgICAgIFRoaXMgaXMgZHVlIHRvIEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0cyBxdWV1ZSAodGhpcyBmZWF0dXJlCisgICogICAgICAgICBjYW5ub3QgYmUgZGlzYWJsZWQgb24gdGhpcyBTVE0zMiBzZXJpZSkuCisgICogICAgICAgICBUbyBzZXQgc2V2ZXJhbCBmZWF0dXJlcyBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQsIHVzZQorICAqICAgICAgICAgZnVuY3Rpb24gQHJlZiBMTF9BRENfSU5KX0NvbmZpZ1F1ZXVlQ29udGV4dCgpLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IG5vdCBiZSBkaXNhYmxlZC4gQ2FuIGJlIGVuYWJsZWQgd2l0aCBvciB3aXRob3V0IGNvbnZlcnNpb24KKyAgKiAgICAgICAgIG9uIGdvaW5nIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4KKyAgKiBAcm10b2xsIEpTUVIgICAgIEpMICAgICAgICAgICAgIExMX0FEQ19JTkpfU2V0U2VxdWVuY2VyTGVuZ3RoCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgU2VxdWVuY2VyTmJSYW5rcyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX1NDQU5fRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX1NDQU5fRU5BQkxFXzJSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX1NDQU5fRU5BQkxFXzNSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX1NDQU5fRU5BQkxFXzRSQU5LUworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0lOSl9TZXRTZXF1ZW5jZXJMZW5ndGgoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFNlcXVlbmNlck5iUmFua3MpCit7CisgIE1PRElGWV9SRUcoQURDeC0+SlNRUiwgQURDX0pTUVJfSkwsIFNlcXVlbmNlck5iUmFua3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGxlbmd0aCBhbmQgc2NhbiBkaXJlY3Rpb24uCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlczoKKyAgKiAgICAgICAgIC0gU2VxdWVuY2UgbGVuZ3RoOiBOdW1iZXIgb2YgcmFua3MgaW4gdGhlIHNjYW4gc2VxdWVuY2UuCisgICogICAgICAgICAtIFNlcXVlbmNlIGRpcmVjdGlvbjogVW5sZXNzIHNwZWNpZmllZCBpbiBwYXJhbWV0ZXJzLCBzZXF1ZW5jZXIKKyAgKiAgICAgICAgICAgc2NhbiBkaXJlY3Rpb24gaXMgZm9yd2FyZCAoZnJvbSByYW5rIDEgdG8gcmFuayBuKS4KKyAgKiBAbm90ZSAgIFNlcXVlbmNlciBkaXNhYmxlZCBpcyBlcXVpdmFsZW50IHRvIHNlcXVlbmNlciBvZiAxIHJhbms6CisgICogICAgICAgICBBREMgY29udmVyc2lvbiBvbiBvbmx5IDEgY2hhbm5lbC4KKyAgKiBAcm10b2xsIEpTUVIgICAgIEpMICAgICAgICAgICAgIExMX0FEQ19JTkpfR2V0U2VxdWVuY2VyTGVuZ3RoCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1NFUV9TQ0FOX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1NFUV9TQ0FOX0VOQUJMRV8yUkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1NFUV9TQ0FOX0VOQUJMRV8zUkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1NFUV9TQ0FOX0VOQUJMRV80UkFOS1MKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSU5KX0dldFNlcXVlbmNlckxlbmd0aChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+SlNRUiwgQURDX0pTUVJfSkwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGU6CisgICogICAgICAgICBzZXF1ZW5jZSBzdWJkaXZpZGVkIGFuZCBzY2FuIGNvbnZlcnNpb25zIGludGVycnVwdGVkIGV2ZXJ5IHNlbGVjdGVkCisgICogICAgICAgICBudW1iZXIgb2YgcmFua3MuCisgICogQG5vdGUgICBJdCBpcyBub3QgcG9zc2libGUgdG8gZW5hYmxlIGJvdGggQURDIGdyb3VwIGluamVjdGVkCisgICogICAgICAgICBhdXRvLWluamVjdGVkIG1vZGUgYW5kIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUuCisgICogQHJtdG9sbCBDRkdSICAgICBKRElTQ0VOICAgICAgICBMTF9BRENfSU5KX1NldFNlcXVlbmNlckRpc2NvbnQKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBTZXFEaXNjb250IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9TRVFfRElTQ09OVF9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9TRVFfRElTQ09OVF8xUkFOSworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0lOSl9TZXRTZXF1ZW5jZXJEaXNjb250KEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBTZXFEaXNjb250KQoreworICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX0pESVNDRU4sIFNlcURpc2NvbnQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZToKKyAgKiAgICAgICAgIHNlcXVlbmNlIHN1YmRpdmlkZWQgYW5kIHNjYW4gY29udmVyc2lvbnMgaW50ZXJydXB0ZWQgZXZlcnkgc2VsZWN0ZWQKKyAgKiAgICAgICAgIG51bWJlciBvZiByYW5rcy4KKyAgKiBAcm10b2xsIENGR1IgICAgIEpESVNDRU4gICAgICAgIExMX0FEQ19JTkpfR2V0U2VxdWVuY2VyRGlzY29udAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9TRVFfRElTQ09OVF9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9TRVFfRElTQ09OVF8xUkFOSworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19JTkpfR2V0U2VxdWVuY2VyRGlzY29udChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUiwgQURDX0NGR1JfSkRJU0NFTikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2U6IGNoYW5uZWwgb24gdGhlIHNlbGVjdGVkCisgICogICAgICAgICBzZXF1ZW5jZSByYW5rLgorICAqIEBub3RlICAgRGVwZW5kaW5nIG9uIGRldmljZXMgYW5kIHBhY2thZ2VzLCBzb21lIGNoYW5uZWxzIG1heSBub3QgYmUgYXZhaWxhYmxlLgorICAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgdG8gbWVhc3VyZSBpbnRlcm5hbCBjaGFubmVscyAoVnJlZkludCwKKyAgKiAgICAgICAgIFRlbXBTZW5zb3IsIC4uLiksIG1lYXN1cmVtZW50IHBhdGhzIHRvIGludGVybmFsIGNoYW5uZWxzIG11c3QgYmUKKyAgKiAgICAgICAgIGVuYWJsZWQgc2VwYXJhdGVseS4KKyAgKiAgICAgICAgIFRoaXMgY2FuIGJlIGRvbmUgdXNpbmcgZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2goKS4KKyAgKiBAbm90ZSAgIENhdXRpb24gdG8gQURDIGdyb3VwIGluamVjdGVkIGNvbnRleHRzIHF1ZXVlOiBPbiB0aGlzIFNUTTMyIHNlcmllLCAKKyAgKiAgICAgICAgIHVzaW5nIHN1Y2Nlc3NpdmVseSBzZXZlcmFsIHRpbWVzIHRoaXMgZnVuY3Rpb24gd2lsbCBhcHBlYXIgaGFzCisgICogICAgICAgICBoYXZpbmcgbm8gZWZmZWN0LgorICAqICAgICAgICAgVGhpcyBpcyBkdWUgdG8gQURDIGdyb3VwIGluamVjdGVkIGNvbnRleHRzIHF1ZXVlICh0aGlzIGZlYXR1cmUKKyAgKiAgICAgICAgIGNhbm5vdCBiZSBkaXNhYmxlZCBvbiB0aGlzIFNUTTMyIHNlcmllKS4KKyAgKiAgICAgICAgIFRvIHNldCBzZXZlcmFsIGZlYXR1cmVzIG9mIEFEQyBncm91cCBpbmplY3RlZCwgdXNlCisgICogICAgICAgICBmdW5jdGlvbiBAcmVmIExMX0FEQ19JTkpfQ29uZmlnUXVldWVDb250ZXh0KCkuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3Qgbm90IGJlIGRpc2FibGVkLiBDYW4gYmUgZW5hYmxlZCB3aXRoIG9yIHdpdGhvdXQgY29udmVyc2lvbgorICAqICAgICAgICAgb24gZ29pbmcgb24gZWl0aGVyIGdyb3VwcyByZWd1bGFyIG9yIGluamVjdGVkLgorICAqIEBybXRvbGwgSlNRUiAgICAgSlNRMSAgICAgICAgICAgTExfQURDX0lOSl9TZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBKU1FSICAgICBKU1EyICAgICAgICAgICBMTF9BRENfSU5KX1NldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIEpTUVIgICAgIEpTUTMgICAgICAgICAgIExMX0FEQ19JTkpfU2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgSlNRUiAgICAgSlNRNCAgICAgICAgICAgTExfQURDX0lOSl9TZXRTZXF1ZW5jZXJSYW5rcworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJhbmsgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfNAorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgKDUpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAxICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMiAgICAgICgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDMgICAgICAoMykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgKDQpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLlxuCisgICogICAgICAgICAoMikgT24gU1RNMzJGMywgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbgorICAqICAgICAgICAgKDMpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzMuXG4KKyAgKiAgICAgICAgICg0KSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczogQURDNC5cbgorICAqICAgICAgICAgKDUpIE9uIFNUTTMyRjMsIEFEQyBjaGFubmVsIGF2YWlsYWJsZSBvbmx5IG9uIGFsbCBBREMgaW5zdGFuY2VzLCBidXQKKyAgKiAgICAgICAgICAgICBvbmx5IG9uZSBBREMgaW5zdGFuY2UgaXMgYWxsb3dlZCB0byBiZSBjb25uZWN0ZWQgdG8gVnJlZkludCBhdCB0aGUgc2FtZSB0aW1lLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0lOSl9TZXRTZXF1ZW5jZXJSYW5rcyhBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgUmFuaywgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogU2V0IGJpdHMgd2l0aCBjb250ZW50IG9mIHBhcmFtZXRlciAiQ2hhbm5lbCIgd2l0aCBiaXRzIHBvc2l0aW9uICAgICAgICAgICovCisgIC8qIGluIHJlZ2lzdGVyIGRlcGVuZGluZyBvbiBwYXJhbWV0ZXIgIlJhbmsiLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBQYXJhbWV0ZXJzICJSYW5rIiBhbmQgIkNoYW5uZWwiIGFyZSB1c2VkIHdpdGggbWFza3MgYmVjYXVzZSBjb250YWluaW5nICAgKi8KKyAgLyogb3RoZXIgYml0cyByZXNlcnZlZCBmb3Igb3RoZXIgcHVycG9zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIE1PRElGWV9SRUcoQURDeC0+SlNRUiwKKyAgICAgICAgICAgICBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSyA+PiAoQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MgLSAoUmFuayAmIEFEQ19JTkpfUkFOS19JRF9KU1FSX01BU0spKSwKKyAgICAgICAgICAgICAoQ2hhbm5lbCAmIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLKSA+PiAoQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MgLSAoUmFuayAmIEFEQ19JTkpfUkFOS19JRF9KU1FSX01BU0spKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZTogY2hhbm5lbCBvbiB0aGUgc2VsZWN0ZWQKKyAgKiAgICAgICAgIHNlcXVlbmNlIHJhbmsuCisgICogQG5vdGUgICBEZXBlbmRpbmcgb24gZGV2aWNlcyBhbmQgcGFja2FnZXMsIHNvbWUgY2hhbm5lbHMgbWF5IG5vdCBiZSBhdmFpbGFibGUuCisgICogICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuCisgICogQG5vdGUgICBVc2FnZSBvZiB0aGUgcmV0dXJuZWQgY2hhbm5lbCBudW1iZXI6CisgICogICAgICAgICAtIFRvIHJlaW5qZWN0IHRoaXMgY2hhbm5lbCBpbnRvIGFub3RoZXIgZnVuY3Rpb24gTExfQURDX3h4eDoKKyAgKiAgICAgICAgICAgdGhlIHJldHVybmVkIGNoYW5uZWwgbnVtYmVyIGlzIG9ubHkgcGFydGx5IGZvcm1hdHRlZCBvbiBkZWZpbml0aW9uCisgICogICAgICAgICAgIG9mIGxpdGVyYWxzIExMX0FEQ19DSEFOTkVMX3guIFRoZXJlZm9yZSwgaXQgaGFzIHRvIGJlIGNvbXBhcmVkCisgICogICAgICAgICAgIHdpdGggcGFydHMgb2YgbGl0ZXJhbHMgTExfQURDX0NIQU5ORUxfeCBvciB1c2luZworICAqICAgICAgICAgICBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoKS4KKyAgKiAgICAgICAgICAgVGhlbiB0aGUgc2VsZWN0ZWQgbGl0ZXJhbCBMTF9BRENfQ0hBTk5FTF94IGNhbiBiZSB1c2VkCisgICogICAgICAgICAgIGFzIHBhcmFtZXRlciBmb3IgYW5vdGhlciBmdW5jdGlvbi4KKyAgKiAgICAgICAgIC0gVG8gZ2V0IHRoZSBjaGFubmVsIG51bWJlciBpbiBkZWNpbWFsIGZvcm1hdDoKKyAgKiAgICAgICAgICAgcHJvY2VzcyB0aGUgcmV0dXJuZWQgdmFsdWUgd2l0aCB0aGUgaGVscGVyIG1hY3JvCisgICogICAgICAgICAgIEByZWYgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKCkuCisgICogQHJtdG9sbCBKU1FSICAgICBKU1ExICAgICAgICAgICBMTF9BRENfSU5KX0dldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIEpTUVIgICAgIEpTUTIgICAgICAgICAgIExMX0FEQ19JTkpfR2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgSlNRUiAgICAgSlNRMyAgICAgICAgICAgTExfQURDX0lOSl9HZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBKU1FSICAgICBKU1E0ICAgICAgICAgICBMTF9BRENfSU5KX0dldFNlcXVlbmNlclJhbmtzCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgUmFuayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS180CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgKDUpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAxICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMiAgICAgICgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDMgICAgICAoMykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgKDQpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLlxuCisgICogICAgICAgICAoMikgT24gU1RNMzJGMywgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbgorICAqICAgICAgICAgKDMpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzMuXG4KKyAgKiAgICAgICAgICg0KSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczogQURDNC5cbgorICAqICAgICAgICAgKDUpIE9uIFNUTTMyRjMsIEFEQyBjaGFubmVsIGF2YWlsYWJsZSBvbmx5IG9uIGFsbCBBREMgaW5zdGFuY2VzLCBidXQKKyAgKiAgICAgICAgICAgICBvbmx5IG9uZSBBREMgaW5zdGFuY2UgaXMgYWxsb3dlZCB0byBiZSBjb25uZWN0ZWQgdG8gVnJlZkludCBhdCB0aGUgc2FtZSB0aW1lLlxuCisgICogICAgICAgICAoMSwgMiwgMywgNCwgNSkgRm9yIEFEQyBjaGFubmVsIHJlYWQgYmFjayBmcm9tIEFEQyByZWdpc3RlciwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uIHdpdGggaW50ZXJuYWwgY2hhbm5lbCBwYXJhbWV0ZXIgdG8gYmUgZG9uZQorICAqICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NIQU5ORUxfSU5URVJOQUxfVE9fRVhURVJOQUwoKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSU5KX0dldFNlcXVlbmNlclJhbmtzKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBSYW5rKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5KU1FSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSyA+PiAoQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MgLSAoUmFuayAmIEFEQ19JTkpfUkFOS19JRF9KU1FSX01BU0spKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgKEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TIC0gKFJhbmsgJiBBRENfSU5KX1JBTktfSURfSlNRUl9NQVNLKSkKKyAgICAgICAgICAgICAgICAgICApOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyOgorICAqICAgICAgICAgaW5kZXBlbmRlbnQgb3IgZnJvbSBBREMgZ3JvdXAgcmVndWxhci4KKyAgKiBAbm90ZSAgIFRoaXMgbW9kZSBjYW4gYmUgdXNlZCB0byBleHRlbmQgbnVtYmVyIG9mIGRhdGEgcmVnaXN0ZXJzCisgICogICAgICAgICB1cGRhdGVkIGFmdGVyIG9uZSBBREMgY29udmVyc2lvbiB0cmlnZ2VyIGFuZCB3aXRoIGRhdGEgCisgICogICAgICAgICBwZXJtYW5lbnRseSBrZXB0IChub3QgZXJhc2VkIGJ5IHN1Y2Nlc3NpdmUgY29udmVyc2lvbnMgb2Ygc2NhbiBvZgorICAqICAgICAgICAgQURDIHNlcXVlbmNlciByYW5rcyksIHVwIHRvIDUgZGF0YSByZWdpc3RlcnM6CisgICogICAgICAgICAxIGRhdGEgcmVnaXN0ZXIgb24gQURDIGdyb3VwIHJlZ3VsYXIsIDQgZGF0YSByZWdpc3RlcnMKKyAgKiAgICAgICAgIG9uIEFEQyBncm91cCBpbmplY3RlZC4gICAgICAgICAgICAKKyAgKiBAbm90ZSAgIElmIEFEQyBncm91cCBpbmplY3RlZCBpbmplY3RlZCB0cmlnZ2VyIHNvdXJjZSBpcyBzZXQgdG8gYW4KKyAgKiAgICAgICAgIGV4dGVybmFsIHRyaWdnZXIsIHRoaXMgZmVhdHVyZSBtdXN0IGJlIG11c3QgYmUgc2V0IHRvCisgICogICAgICAgICBpbmRlcGVuZGVudCB0cmlnZ2VyLgorICAqICAgICAgICAgQURDIGdyb3VwIGluamVjdGVkIGF1dG9tYXRpYyB0cmlnZ2VyIGlzIGNvbXBsaWFudCBvbmx5IHdpdGggCisgICogICAgICAgICBncm91cCBpbmplY3RlZCB0cmlnZ2VyIHNvdXJjZSBzZXQgdG8gU1cgc3RhcnQsIHdpdGhvdXQgYW55IAorICAqICAgICAgICAgZnVydGhlciBhY3Rpb24gb24gIEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHN0YXJ0IG9yIHN0b3A6IAorICAqICAgICAgICAgaW4gdGhpcyBjYXNlLCBBREMgZ3JvdXAgaW5qZWN0ZWQgaXMgY29udHJvbGxlZCBvbmx5IAorICAqICAgICAgICAgZnJvbSBBREMgZ3JvdXAgcmVndWxhci4KKyAgKiBAbm90ZSAgIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBlbmFibGUgYm90aCBBREMgZ3JvdXAgaW5qZWN0ZWQKKyAgKiAgICAgICAgIGF1dG8taW5qZWN0ZWQgbW9kZSBhbmQgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZWl0aGVyIGdyb3VwcyByZWd1bGFyIG9yIGluamVjdGVkLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgSkFVVE8gICAgICAgICAgTExfQURDX0lOSl9TZXRUcmlnQXV0bworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRyaWdBdXRvIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0lOREVQRU5ERU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0ZST01fR1JQX1JFR1VMQVIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19JTkpfU2V0VHJpZ0F1dG8oQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFRyaWdBdXRvKQoreworICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX0pBVVRPLCBUcmlnQXV0byk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXI6CisgICogICAgICAgICBpbmRlcGVuZGVudCBvciBmcm9tIEFEQyBncm91cCByZWd1bGFyLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgSkFVVE8gICAgICAgICAgTExfQURDX0lOSl9HZXRUcmlnQXV0bworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0lOREVQRU5ERU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0ZST01fR1JQX1JFR1VMQVIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSU5KX0dldFRyaWdBdXRvKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DRkdSLCBBRENfQ0ZHUl9KQVVUTykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udGV4dHMgcXVldWUgbW9kZS4KKyAgKiBAbm90ZSAgIEEgY29udGV4dCBpcyBhIHNldHRpbmcgb2YgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyOgorICAqICAgICAgICAgLSBncm91cCBpbmplY3RlZCB0cmlnZ2VyCisgICogICAgICAgICAtIHNlcXVlbmNlciBsZW5ndGgKKyAgKiAgICAgICAgIC0gc2VxdWVuY2VyIHJhbmtzCisgICogICAgICAgICBJZiBjb250ZXh0cyBxdWV1ZSBpcyBkaXNhYmxlZDoKKyAgKiAgICAgICAgIC0gb25seSAxIHNlcXVlbmNlIGNhbiBiZSBjb25maWd1cmVkCisgICogICAgICAgICAgIGFuZCBpcyBhY3RpdmUgcGVycGV0dWFsbHkuCisgICogICAgICAgICBJZiBjb250ZXh0cyBxdWV1ZSBpcyBlbmFibGVkOgorICAqICAgICAgICAgLSB1cCB0byAyIGNvbnRleHRzIGNhbiBiZSBxdWV1ZWQKKyAgKiAgICAgICAgICAgYW5kIGFyZSBjaGVja2VkIGluIGFuZCBvdXQgYXMgYSBGSUZPIHN0YWNrIChmaXJzdC1pbiwgZmlyc3Qtb3V0KS4KKyAgKiAgICAgICAgIC0gSWYgYSBuZXcgY29udGV4dCBpcyBzZXQgd2hlbiBxdWV1ZXMgaXMgZnVsbCwgZXJyb3IgaXMgdHJpZ2dlcmVkCisgICogICAgICAgICAgIGJ5IGludGVycnVwdGlvbiAiSW5qZWN0ZWQgUXVldWUgT3ZlcmZsb3ciLgorICAqICAgICAgICAgLSBUd28gYmVoYXZpb3JzIGFyZSBwb3NzaWJsZSB3aGVuIGFsbCBjb250ZXh0cyBoYXZlIGJlZW4gcHJvY2Vzc2VkOgorICAqICAgICAgICAgICB0aGUgY29udGV4dHMgcXVldWUgY2FuIG1haW50YWluIHRoZSBsYXN0IGNvbnRleHQgYWN0aXZlIHBlcnBldHVhbGx5CisgICogICAgICAgICAgIG9yIGNhbiBiZSBlbXB0eSBhbmQgaW5qZWN0ZWQgZ3JvdXAgdHJpZ2dlcnMgYXJlIGRpc2FibGVkLgorICAqICAgICAgICAgLSBUcmlnZ2VycyBjYW4gYmUgb25seSBleHRlcm5hbCAobm90IGludGVybmFsIFNXIHN0YXJ0KQorICAqICAgICAgICAgLSBDYXV0aW9uOiBUaGUgc2VxdWVuY2UgbXVzdCBiZSBmdWxseSBjb25maWd1cmVkIGluIG9uZSB0aW1lCisgICogICAgICAgICAgIChvbmUgd3JpdGUgb2YgcmVnaXN0ZXIgSlNRUiBtYWtlcyBhIGNoZWNrLWluIG9mIGEgbmV3IGNvbnRleHQKKyAgKiAgICAgICAgICAgaW50byB0aGUgcXVldWUpLgorICAqICAgICAgICAgICBUaGVyZWZvcmUgZnVuY3Rpb25zIHRvIHNldCBzZXBhcmF0ZWx5IGluamVjdGVkIHRyaWdnZXIgYW5kCisgICogICAgICAgICAgIHNlcXVlbmNlciBjaGFubmVscyBjYW5ub3QgYmUgdXNlZCwgcmVnaXN0ZXIgSlNRUiBtdXN0IGJlIHNldAorICAqICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBAcmVmIExMX0FEQ19JTkpfQ29uZmlnUXVldWVDb250ZXh0KCkuCisgICogQG5vdGUgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgbW9kaWZpZWQgb25seSB3aGVuIG5vIGNvbnZlcnNpb24gaXMgb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4KKyAgKiBAbm90ZSAgIEEgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250ZXh0IG1vZGUgKGJpdCBKUURJUykgY2F1c2VzIHRoZSBjb250ZXh0cworICAqICAgICAgICAgcXVldWUgdG8gYmUgZmx1c2hlZCBhbmQgdGhlIHJlZ2lzdGVyIEpTUVIgaXMgY2xlYXJlZC4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZWl0aGVyIGdyb3VwcyByZWd1bGFyIG9yIGluamVjdGVkLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgSlFNICAgICAgICAgICAgTExfQURDX0lOSl9TZXRRdWV1ZU1vZGUKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBRdWV1ZU1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1FVRVVFXzJDT05URVhUU19MQVNUX0FDVElWRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUVVFVUVfMkNPTlRFWFRTX0VORF9FTVBUWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0lOSl9TZXRRdWV1ZU1vZGUoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFF1ZXVlTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhBREN4LT5DRkdSLCBBRENfQ0ZHUl9KUU0sIFF1ZXVlTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0IHF1ZXVlIG1vZGUuCisgICogQHJtdG9sbCBDRkdSICAgICBKUU0gICAgICAgICAgICBMTF9BRENfSU5KX0dldFF1ZXVlTW9kZQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9RVUVVRV8yQ09OVEVYVFNfTEFTVF9BQ1RJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1FVRVVFXzJDT05URVhUU19FTkRfRU1QVFkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSU5KX0dldFF1ZXVlTW9kZShBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUiwgQURDX0NGR1JfSlFNKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IG9uZSBjb250ZXh0IG9uIEFEQyBncm91cCBpbmplY3RlZCB0aGF0IHdpbGwgYmUgY2hlY2tlZCBpbgorICAqICAgICAgICAgY29udGV4dHMgcXVldWUuCisgICogQG5vdGUgICBBIGNvbnRleHQgaXMgYSBzZXR0aW5nIG9mIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlcjoKKyAgKiAgICAgICAgIC0gZ3JvdXAgaW5qZWN0ZWQgdHJpZ2dlcgorICAqICAgICAgICAgLSBzZXF1ZW5jZXIgbGVuZ3RoCisgICogICAgICAgICAtIHNlcXVlbmNlciByYW5rcworICAqICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdoZW4gY29udGV4dHMgcXVldWUgaXMgZW5hYmxlZCwKKyAgKiAgICAgICAgIGJlY2F1c2UgdGhlIHNlcXVlbmNlIG11c3QgYmUgZnVsbHkgY29uZmlndXJlZCBpbiBvbmUgdGltZQorICAqICAgICAgICAgKGZ1bmN0aW9ucyB0byBzZXQgc2VwYXJhdGVseSBpbmplY3RlZCB0cmlnZ2VyIGFuZCBzZXF1ZW5jZXIgY2hhbm5lbHMKKyAgKiAgICAgICAgIGNhbm5vdCBiZSB1c2VkKToKKyAgKiAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX0lOSl9TZXRRdWV1ZU1vZGUoKS4KKyAgKiBAbm90ZSAgIEluIHRoZSBjb250ZXh0cyBxdWV1ZSwgb25seSB0aGUgYWN0aXZlIGNvbnRleHQgY2FuIGJlIHJlYWQuCisgICogICAgICAgICBUaGUgcGFyYW1ldGVycyBvZiB0aGlzIGZ1bmN0aW9uIGNhbiBiZSByZWFkIHVzaW5nIGZ1bmN0aW9uczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX0dldFRyaWdnZXJTb3VyY2UoKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfR2V0VHJpZ2dlckVkZ2UoKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfR2V0U2VxdWVuY2VyUmFua3MoKQorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgdG8gbWVhc3VyZSBpbnRlcm5hbCBjaGFubmVscyAoVnJlZkludCwKKyAgKiAgICAgICAgIFRlbXBTZW5zb3IsIC4uLiksIG1lYXN1cmVtZW50IHBhdGhzIHRvIGludGVybmFsIGNoYW5uZWxzIG11c3QgYmUKKyAgKiAgICAgICAgIGVuYWJsZWQgc2VwYXJhdGVseS4KKyAgKiAgICAgICAgIFRoaXMgY2FuIGJlIGRvbmUgdXNpbmcgZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2goKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBub3QgYmUgZGlzYWJsZWQuIENhbiBiZSBlbmFibGVkIHdpdGggb3Igd2l0aG91dCBjb252ZXJzaW9uCisgICogICAgICAgICBvbiBnb2luZyBvbiBlaXRoZXIgZ3JvdXBzIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuCisgICogQHJtdG9sbCBKU1FSICAgICBKRVhUU0VMICAgICAgICBMTF9BRENfSU5KX0NvbmZpZ1F1ZXVlQ29udGV4dFxuCisgICogICAgICAgICBKU1FSICAgICBKRVhURU4gICAgICAgICBMTF9BRENfSU5KX0NvbmZpZ1F1ZXVlQ29udGV4dFxuCisgICogICAgICAgICBKU1FSICAgICBKTCAgICAgICAgICAgICBMTF9BRENfSU5KX0NvbmZpZ1F1ZXVlQ29udGV4dFxuCisgICogICAgICAgICBKU1FSICAgICBKU1ExICAgICAgICAgICBMTF9BRENfSU5KX0NvbmZpZ1F1ZXVlQ29udGV4dFxuCisgICogICAgICAgICBKU1FSICAgICBKU1EyICAgICAgICAgICBMTF9BRENfSU5KX0NvbmZpZ1F1ZXVlQ29udGV4dFxuCisgICogICAgICAgICBKU1FSICAgICBKU1EzICAgICAgICAgICBMTF9BRENfSU5KX0NvbmZpZ1F1ZXVlQ29udGV4dFxuCisgICogICAgICAgICBKU1FSICAgICBKU1E0ICAgICAgICAgICBMTF9BRENfSU5KX0NvbmZpZ1F1ZXVlQ29udGV4dAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRyaWdnZXJTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfVFJHTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9DSDNfQURDMzQgICAgKDEpKDIpICAgICAgICAgICAgICAgKDgpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0xX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9UUkdPICAgICAgICAgICAgICAgKDMpKDQpKDUpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0yX1RSR09fQURDMTIgICAoMSkoMikgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfVFJHT19fQURDMzQgICgxKSgyKSAgICAgICAgICAgICAgICg4KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9DSDEgICAgICAgICAgICAgICAgKDMpKDQpKDUpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0yX0NIMV9BREMxMiAgICAoMSkoMikgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfVFJHTyAgICAgICAgICgxKSgyKSgzKSg0KSg1KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDEgICAgICAgICAgICAgICAgKDMpKDQpKDUpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NIMV9BREMxMiAgICAoMSkoMikgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0gzICAgICAgICAgICAgICAgICgzKSg0KSg1KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDNfQURDMTIgICAgKDEpKDIpICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NINCAgICAgICAgICAgICAgICAoMykoNCkoNSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0g0X0FEQzEyICAgICgxKSgyKSgzKSg0KSg1KSAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9UUkdPICAgICAgICAgICAgICAgKDMpICAgKDUpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU00X1RSR09fQURDMTIgICAoMSkoMikgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTRfVFJHT19fQURDMzQgICgxKSgyKSAgICAgICAgICAgICAgICg4KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9DSDNfQURDMzQgICAgKDEpKDIpICAgICAgICAgICAgICAgKDgpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU00X0NINF9BREMzNCAgICAoMSkoMikgICAgICAgICAgICAgICAoOCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTZfVFJHTyAgICAgICAgICAgICAgICgzKSg0KSg1KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNNl9UUkdPX0FEQzEyICAgKDEpKDIpICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU03X1RSR09fQURDMzQgICAoMSkoMikgICAgICAgICAgICAgICAoOCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfVFJHTyAgICAgICAgICgxKSgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9UUkdPMiAgICAgICAgKDEpKDIpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NIMl9BREMzNCAgICAoMSkoMikgICAgICAgICAgICAgICAoOCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfQ0g0X0FEQzEyICAgICgxKSgyKSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9DSDRfX0FEQzM0ICAgKDEpKDIpICAgICAgICAgICAgICAgKDgpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0xNV9UUkdPCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9UUkdPX0FEQzEyICAoMSkgICAgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTIwX1RSR08yX0FEQzEyICgxKSAgICAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfQ0g0X0FEQzEyICAgKDEpICAgICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9UUkdfQURDMzQgICAoMSkgICAgICAgICAgICAgICAgICAoOCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTIwX1RSRzJfQURDMzQgICgxKSAgICAgICAgICAgICAgICAgICg4KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfQ0gyX0FEQzM0ICAgKDEpICAgICAgICAgICAgICAgICAgKDgpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkcyICAgICAgICAgICAgICAgICAoNCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzQgICAgICAgICAgICAgICAgICg0KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfRVhUSV9MSU5FMTUgICAgICAgICAgICAgKDMpKDQpKDUpKDYpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9FWFRJX0xJTkUxNV9BREMxMiAoMSkoMikgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzOiBhbW9uZyBvdGhlcnMsIG9uIFNUTTMyRjMwM3hFLCBTVE0zMkYzOTh4eC5cbgorICAqICAgICAgICAgKDIpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzOiBhbW9uZyBvdGhlcnMsIG9uIFNUTTMyRjMwM3hDLCBTVE0zMkYzNTh4eC5cbgorICAqICAgICAgICAgKDMpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzOiBhbW9uZyBvdGhlcnMsIG9uIFNUTTMyRjMwM3g4LCBTVE0zMkYzMjh4eC5cbgorICAqICAgICAgICAgKDQpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzOiBhbW9uZyBvdGhlcnMsIG9uIFNUTTMyRjMzNHg4LlxuCisgICogICAgICAgICAoNSkgT24gU1RNMzJGMywgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXM6IGFtb25nIG90aGVycywgb24gU1RNMzJGMzAyeEMsIFNUTTMyRjMwMnhFLlxuCisgICogICAgICAgICAoNikgT24gU1RNMzJGMywgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXM6IGFtb25nIG90aGVycywgb24gU1RNMzJGMzAxeDgsIFNUTTMyRjMwMng4LCBTVE0zMkYzMTh4eC5cbgorICAqICAgICAgICAgKDcpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBBREMgaW5zdGFuY2VzOiBBREMxLCBBREMyIChmb3IgQURDIGluc3RhbmNlcyBBREN4IGF2YWlsYWJsZSBvbiB0aGUgc2VsZWN0ZWQgZGV2aWNlKS5cbgorICAqICAgICAgICAgKDgpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBBREMgaW5zdGFuY2VzOiBBREMzLCBBREM0IChmb3IgQURDIGluc3RhbmNlcyBBREN4IGF2YWlsYWJsZSBvbiB0aGUgc2VsZWN0ZWQgZGV2aWNlKS4KKyAgKiBAcGFyYW0gIEV4dGVybmFsVHJpZ2dlckVkZ2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1JJU0lORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfRkFMTElORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfUklTSU5HRkFMTElORworICAqCisgICogICAgICAgICBOb3RlOiBUaGlzIHBhcmFtZXRlciBpcyBkaXNjYXJkZWQgaW4gY2FzZSBvZiBTVyBzdGFydDoKKyAgKiAgICAgICAgICAgICAgIHBhcmFtZXRlciAiVHJpZ2dlclNvdXJjZSIgc2V0IHRvICJMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUiLgorICAqIEBwYXJhbSAgU2VxdWVuY2VyTmJSYW5rcyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX1NDQU5fRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX1NDQU5fRU5BQkxFXzJSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX1NDQU5fRU5BQkxFXzNSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX1NDQU5fRU5BQkxFXzRSQU5LUworICAqIEBwYXJhbSAgUmFuazFfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgKDUpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAxICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMiAgICAgICgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDMgICAgICAoMykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgKDQpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLlxuCisgICogICAgICAgICAoMikgT24gU1RNMzJGMywgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbgorICAqICAgICAgICAgKDMpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzMuXG4KKyAgKiAgICAgICAgICg0KSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczogQURDNC5cbgorICAqICAgICAgICAgKDUpIE9uIFNUTTMyRjMsIEFEQyBjaGFubmVsIGF2YWlsYWJsZSBvbmx5IG9uIGFsbCBBREMgaW5zdGFuY2VzLCBidXQKKyAgKiAgICAgICAgICAgICBvbmx5IG9uZSBBREMgaW5zdGFuY2UgaXMgYWxsb3dlZCB0byBiZSBjb25uZWN0ZWQgdG8gVnJlZkludCBhdCB0aGUgc2FtZSB0aW1lLgorICAqIEBwYXJhbSAgUmFuazJfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgKDUpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAxICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMiAgICAgICgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDMgICAgICAoMykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgKDQpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLlxuCisgICogICAgICAgICAoMikgT24gU1RNMzJGMywgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbgorICAqICAgICAgICAgKDMpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzMuXG4KKyAgKiAgICAgICAgICg0KSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczogQURDNC5cbgorICAqICAgICAgICAgKDUpIE9uIFNUTTMyRjMsIEFEQyBjaGFubmVsIGF2YWlsYWJsZSBvbmx5IG9uIGFsbCBBREMgaW5zdGFuY2VzLCBidXQKKyAgKiAgICAgICAgICAgICBvbmx5IG9uZSBBREMgaW5zdGFuY2UgaXMgYWxsb3dlZCB0byBiZSBjb25uZWN0ZWQgdG8gVnJlZkludCBhdCB0aGUgc2FtZSB0aW1lLgorICAqIEBwYXJhbSAgUmFuazNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgKDUpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAxICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMiAgICAgICgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDMgICAgICAoMykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgKDQpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLlxuCisgICogICAgICAgICAoMikgT24gU1RNMzJGMywgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbgorICAqICAgICAgICAgKDMpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzMuXG4KKyAgKiAgICAgICAgICg0KSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczogQURDNC5cbgorICAqICAgICAgICAgKDUpIE9uIFNUTTMyRjMsIEFEQyBjaGFubmVsIGF2YWlsYWJsZSBvbmx5IG9uIGFsbCBBREMgaW5zdGFuY2VzLCBidXQKKyAgKiAgICAgICAgICAgICBvbmx5IG9uZSBBREMgaW5zdGFuY2UgaXMgYWxsb3dlZCB0byBiZSBjb25uZWN0ZWQgdG8gVnJlZkludCBhdCB0aGUgc2FtZSB0aW1lLgorICAqIEBwYXJhbSAgUmFuazRfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgKDUpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAxICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMiAgICAgICgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDMgICAgICAoMykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgKDQpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLlxuCisgICogICAgICAgICAoMikgT24gU1RNMzJGMywgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbgorICAqICAgICAgICAgKDMpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzMuXG4KKyAgKiAgICAgICAgICg0KSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczogQURDNC5cbgorICAqICAgICAgICAgKDUpIE9uIFNUTTMyRjMsIEFEQyBjaGFubmVsIGF2YWlsYWJsZSBvbmx5IG9uIGFsbCBBREMgaW5zdGFuY2VzLCBidXQKKyAgKiAgICAgICAgICAgICBvbmx5IG9uZSBBREMgaW5zdGFuY2UgaXMgYWxsb3dlZCB0byBiZSBjb25uZWN0ZWQgdG8gVnJlZkludCBhdCB0aGUgc2FtZSB0aW1lLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0lOSl9Db25maWdRdWV1ZUNvbnRleHQoQURDX1R5cGVEZWYgKkFEQ3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUcmlnZ2VyU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRXh0ZXJuYWxUcmlnZ2VyRWRnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNlcXVlbmNlck5iUmFua3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSYW5rMV9DaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUmFuazJfQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFJhbmszX0NoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSYW5rNF9DaGFubmVsKQoreworICAvKiBTZXQgYml0cyB3aXRoIGNvbnRlbnQgb2YgcGFyYW1ldGVyICJSYW5reF9DaGFubmVsIiB3aXRoIGJpdHMgcG9zaXRpb24gICAgKi8KKyAgLyogaW4gcmVnaXN0ZXIgZGVwZW5kaW5nIG9uIGxpdGVyYWwgIkxMX0FEQ19JTkpfUkFOS194Ii4gICAgICAgICAgICAgICAgICAgICovCisgIC8qIFBhcmFtZXRlcnMgIlJhbmt4X0NoYW5uZWwiIGFuZCAiTExfQURDX0lOSl9SQU5LX3giIGFyZSB1c2VkIHdpdGggbWFza3MgICAqLworICAvKiBiZWNhdXNlIGNvbnRhaW5pbmcgb3RoZXIgYml0cyByZXNlcnZlZCBmb3Igb3RoZXIgcHVycG9zZS4gICAgICAgICAgICAgICAgKi8KKyAgLyogSWYgcGFyYW1ldGVyICJUcmlnZ2VyU291cmNlIiBpcyBzZXQgdG8gU1cgc3RhcnQsIHRoZW4gcGFyYW1ldGVyICAgICAgICAgICovCisgIC8qICJFeHRlcm5hbFRyaWdnZXJFZGdlIiBpcyBkaXNjYXJkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBNT0RJRllfUkVHKEFEQ3gtPkpTUVIgICAgICAgICAgICwKKyAgICAgICAgICAgICBBRENfSlNRUl9KRVhUU0VMIHwKKyAgICAgICAgICAgICBBRENfSlNRUl9KRVhURU4gIHwKKyAgICAgICAgICAgICBBRENfSlNRUl9KU1E0ICAgIHwKKyAgICAgICAgICAgICBBRENfSlNRUl9KU1EzICAgIHwKKyAgICAgICAgICAgICBBRENfSlNRUl9KU1EyICAgIHwKKyAgICAgICAgICAgICBBRENfSlNRUl9KU1ExICAgIHwKKyAgICAgICAgICAgICBBRENfSlNRUl9KTCAgICAgICAgICAsCisgICAgICAgICAgICAgVHJpZ2dlclNvdXJjZSAgICAgICB8CisgICAgICAgICAgICAgKEV4dGVybmFsVHJpZ2dlckVkZ2UgKiAoKFRyaWdnZXJTb3VyY2UgIT0gTExfQURDX0lOSl9UUklHX1NPRlRXQVJFKSkpIHwKKyAgICAgICAgICAgICAoKFJhbms0X0NoYW5uZWwgJiBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSykgPj4gKEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TIC0gKExMX0FEQ19JTkpfUkFOS180ICYgQURDX0lOSl9SQU5LX0lEX0pTUVJfTUFTSykpKSB8CisgICAgICAgICAgICAgKChSYW5rM19DaGFubmVsICYgQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0spID4+IChBRENfQ0hBTk5FTF9JRF9OVU1CRVJfQklUT0ZGU0VUX1BPUyAtIChMTF9BRENfSU5KX1JBTktfMyAmIEFEQ19JTkpfUkFOS19JRF9KU1FSX01BU0spKSkgfAorICAgICAgICAgICAgICgoUmFuazJfQ2hhbm5lbCAmIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLKSA+PiAoQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MgLSAoTExfQURDX0lOSl9SQU5LXzIgJiBBRENfSU5KX1JBTktfSURfSlNRUl9NQVNLKSkpIHwKKyAgICAgICAgICAgICAoKFJhbmsxX0NoYW5uZWwgJiBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSykgPj4gKEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TIC0gKExMX0FEQ19JTkpfUkFOS18xICYgQURDX0lOSl9SQU5LX0lEX0pTUVJfTUFTSykpKSB8CisgICAgICAgICAgICAgU2VxdWVuY2VyTmJSYW5rcworICAgICAgICAgICAgKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUZfQ29uZmlndXJhdGlvbl9DaGFubmVscyBDb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6IGNoYW5uZWxzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgc2FtcGxpbmcgdGltZSBvZiB0aGUgc2VsZWN0ZWQgQURDIGNoYW5uZWwKKyAgKiAgICAgICAgIFVuaXQ6IEFEQyBjbG9jayBjeWNsZXMuCisgICogQG5vdGUgICBPbiB0aGlzIGRldmljZSwgc2FtcGxpbmcgdGltZSBpcyBvbiBjaGFubmVsIHNjb3BlOiBpbmRlcGVuZGVudGx5CisgICogICAgICAgICBvZiBjaGFubmVsIG1hcHBlZCBvbiBBREMgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZC4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgaW50ZXJuYWwgY2hhbm5lbCAoVnJlZkludCwgVGVtcFNlbnNvciwgLi4uKSB0byBiZQorICAqICAgICAgICAgY29udmVydGVkOgorICAqICAgICAgICAgc2FtcGxpbmcgdGltZSBjb25zdHJhaW50cyBtdXN0IGJlIHJlc3BlY3RlZCAoc2FtcGxpbmcgdGltZSBjYW4gYmUKKyAgKiAgICAgICAgIGFkanVzdGVkIGluIGZ1bmN0aW9uIG9mIEFEQyBjbG9jayBmcmVxdWVuY3kgYW5kIHNhbXBsaW5nIHRpbWUKKyAgKiAgICAgICAgIHNldHRpbmcpLgorICAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgdGltaW5ncyB2YWx1ZXMgKHBhcmFtZXRlcnMgVFNfdnJlZmludCwKKyAgKiAgICAgICAgIFRTX3RlbXAsIC4uLikuCisgICogQG5vdGUgICBDb252ZXJzaW9uIHRpbWUgaXMgdGhlIGFkZGl0aW9uIG9mIHNhbXBsaW5nIHRpbWUgYW5kIHByb2Nlc3NpbmcgdGltZS4KKyAgKiAgICAgICAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIEFEQyBwcm9jZXNzaW5nIHRpbWUgaXM6CisgICogICAgICAgICAtIDEyLjUgQURDIGNsb2NrIGN5Y2xlcyBhdCBBREMgcmVzb2x1dGlvbiAxMiBiaXRzCisgICogICAgICAgICAtIDEwLjUgQURDIGNsb2NrIGN5Y2xlcyBhdCBBREMgcmVzb2x1dGlvbiAxMCBiaXRzCisgICogICAgICAgICAtIDguNSBBREMgY2xvY2sgY3ljbGVzIGF0IEFEQyByZXNvbHV0aW9uIDggYml0cworICAqICAgICAgICAgLSA2LjUgQURDIGNsb2NrIGN5Y2xlcyBhdCBBREMgcmVzb2x1dGlvbiA2IGJpdHMKKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgQURDIGNvbnZlcnNpb24gb2YgaW50ZXJuYWwgY2hhbm5lbCAoVnJlZkludCwKKyAgKiAgICAgICAgIHRlbXBlcmF0dXJlIHNlbnNvciwgLi4uKSwgYSBzYW1wbGluZyB0aW1lIG1pbmltdW0gdmFsdWUKKyAgKiAgICAgICAgIGlzIHJlcXVpcmVkLgorICAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldC4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZWl0aGVyIGdyb3VwcyByZWd1bGFyIG9yIGluamVjdGVkLgorICAqIEBybXRvbGwgU01QUjEgICAgU01QMCAgICAgICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjEgICAgU01QMSAgICAgICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjEgICAgU01QMiAgICAgICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjEgICAgU01QMyAgICAgICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjEgICAgU01QNCAgICAgICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjEgICAgU01QNSAgICAgICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjEgICAgU01QNiAgICAgICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjEgICAgU01QNyAgICAgICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjEgICAgU01QOCAgICAgICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjEgICAgU01QOSAgICAgICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjIgICAgU01QMTAgICAgICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjIgICAgU01QMTEgICAgICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjIgICAgU01QMTIgICAgICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjIgICAgU01QMTMgICAgICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjIgICAgU01QMTQgICAgICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjIgICAgU01QMTUgICAgICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjIgICAgU01QMTYgICAgICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjIgICAgU01QMTcgICAgICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjIgICAgU01QMTggICAgICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWUKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAoNSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkJBVCAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDEgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAyICAgICAgKDIpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMyAgICAgICgzKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDQgICAgICAoNCkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzEuXG4KKyAgKiAgICAgICAgICgyKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMyLlxuCisgICogICAgICAgICAoMykgT24gU1RNMzJGMywgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMy5cbgorICAqICAgICAgICAgKDQpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOiBBREM0LlxuCisgICogICAgICAgICAoNSkgT24gU1RNMzJGMywgQURDIGNoYW5uZWwgYXZhaWxhYmxlIG9ubHkgb24gYWxsIEFEQyBpbnN0YW5jZXMsIGJ1dAorICAqICAgICAgICAgICAgIG9ubHkgb25lIEFEQyBpbnN0YW5jZSBpcyBhbGxvd2VkIHRvIGJlIGNvbm5lY3RlZCB0byBWcmVmSW50IGF0IHRoZSBzYW1lIHRpbWUuCisgICogQHBhcmFtICBTYW1wbGluZ1RpbWUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzFDWUNMRV81CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV8yQ1lDTEVTXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzRDWUNMRVNfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfN0NZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV8xOUNZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV82MUNZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV8xODFDWUNMRVNfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfNjAxQ1lDTEVTXzUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBTYW1wbGluZ1RpbWUpCit7CisgIC8qIFNldCBiaXRzIHdpdGggY29udGVudCBvZiBwYXJhbWV0ZXIgIlNhbXBsaW5nVGltZSIgd2l0aCBiaXRzIHBvc2l0aW9uICAgICAqLworICAvKiBpbiByZWdpc3RlciBhbmQgcmVnaXN0ZXIgcG9zaXRpb24gZGVwZW5kaW5nIG9uIHBhcmFtZXRlciAiQ2hhbm5lbCIuICAgICAgKi8KKyAgLyogUGFyYW1ldGVyICJDaGFubmVsIiBpcyB1c2VkIHdpdGggbWFza3MgYmVjYXVzZSBjb250YWluaW5nICAgICAgICAgICAgICAgICovCisgIC8qIG90aGVyIGJpdHMgcmVzZXJ2ZWQgZm9yIG90aGVyIHB1cnBvc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoQURDeC0+U01QUjEsIF9fQURDX01BU0tfU0hJRlQoQ2hhbm5lbCwgQURDX0NIQU5ORUxfU01QUlhfUkVHT0ZGU0VUX01BU0spKTsKKyAgCisgIE1PRElGWV9SRUcoKnByZWcsCisgICAgICAgICAgICAgQURDX1NNUFIxX1NNUDAgPDwgX19BRENfTUFTS19TSElGVChDaGFubmVsLCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9NQVNLKSwKKyAgICAgICAgICAgICBTYW1wbGluZ1RpbWUgICA8PCBfX0FEQ19NQVNLX1NISUZUKENoYW5uZWwsIEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX01BU0spKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgc2FtcGxpbmcgdGltZSBvZiB0aGUgc2VsZWN0ZWQgQURDIGNoYW5uZWwKKyAgKiAgICAgICAgIFVuaXQ6IEFEQyBjbG9jayBjeWNsZXMuCisgICogQG5vdGUgICBPbiB0aGlzIGRldmljZSwgc2FtcGxpbmcgdGltZSBpcyBvbiBjaGFubmVsIHNjb3BlOiBpbmRlcGVuZGVudGx5CisgICogICAgICAgICBvZiBjaGFubmVsIG1hcHBlZCBvbiBBREMgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZC4KKyAgKiBAbm90ZSAgIENvbnZlcnNpb24gdGltZSBpcyB0aGUgYWRkaXRpb24gb2Ygc2FtcGxpbmcgdGltZSBhbmQgcHJvY2Vzc2luZyB0aW1lLgorICAqICAgICAgICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgQURDIHByb2Nlc3NpbmcgdGltZSBpczoKKyAgKiAgICAgICAgIC0gMTIuNSBBREMgY2xvY2sgY3ljbGVzIGF0IEFEQyByZXNvbHV0aW9uIDEyIGJpdHMKKyAgKiAgICAgICAgIC0gMTAuNSBBREMgY2xvY2sgY3ljbGVzIGF0IEFEQyByZXNvbHV0aW9uIDEwIGJpdHMKKyAgKiAgICAgICAgIC0gOC41IEFEQyBjbG9jayBjeWNsZXMgYXQgQURDIHJlc29sdXRpb24gOCBiaXRzCisgICogICAgICAgICAtIDYuNSBBREMgY2xvY2sgY3ljbGVzIGF0IEFEQyByZXNvbHV0aW9uIDYgYml0cworICAqIEBybXRvbGwgU01QUjEgICAgU01QMCAgICAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjEgICAgU01QMSAgICAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjEgICAgU01QMiAgICAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjEgICAgU01QMyAgICAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjEgICAgU01QNCAgICAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjEgICAgU01QNSAgICAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjEgICAgU01QNiAgICAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjEgICAgU01QNyAgICAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjEgICAgU01QOCAgICAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjEgICAgU01QOSAgICAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjIgICAgU01QMTAgICAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjIgICAgU01QMTEgICAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjIgICAgU01QMTIgICAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjIgICAgU01QMTMgICAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjIgICAgU01QMTQgICAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjIgICAgU01QMTUgICAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjIgICAgU01QMTYgICAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjIgICAgU01QMTcgICAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUjIgICAgU01QMTggICAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWUKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAoNSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkJBVCAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDEgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAyICAgICAgKDIpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMyAgICAgICgzKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDQgICAgICAoNCkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzEuXG4KKyAgKiAgICAgICAgICgyKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMyLlxuCisgICogICAgICAgICAoMykgT24gU1RNMzJGMywgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMy5cbgorICAqICAgICAgICAgKDQpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOiBBREM0LlxuCisgICogICAgICAgICAoNSkgT24gU1RNMzJGMywgQURDIGNoYW5uZWwgYXZhaWxhYmxlIG9ubHkgb24gYWxsIEFEQyBpbnN0YW5jZXMsIGJ1dAorICAqICAgICAgICAgICAgIG9ubHkgb25lIEFEQyBpbnN0YW5jZSBpcyBhbGxvd2VkIHRvIGJlIGNvbm5lY3RlZCB0byBWcmVmSW50IGF0IHRoZSBzYW1lIHRpbWUuCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfMUNZQ0xFXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzJDWUNMRVNfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfNENZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV83Q1lDTEVTXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzE5Q1lDTEVTXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzYxQ1lDTEVTXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzE4MUNZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV82MDFDWUNMRVNfNQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoQURDeC0+U01QUjEsIF9fQURDX01BU0tfU0hJRlQoQ2hhbm5lbCwgQURDX0NIQU5ORUxfU01QUlhfUkVHT0ZGU0VUX01BU0spKTsKKyAgCisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKCpwcmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU01QUjFfU01QMCA8PCBfX0FEQ19NQVNLX1NISUZUKENoYW5uZWwsIEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX01BU0spKQorICAgICAgICAgICAgICAgICAgICA+PiBfX0FEQ19NQVNLX1NISUZUKENoYW5uZWwsIEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX01BU0spCisgICAgICAgICAgICAgICAgICAgKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgbW9kZSBzaW5nbGUtZW5kZWQgb3IgZGlmZmVyZW50aWFsIGlucHV0IG9mIHRoZSBzZWxlY3RlZAorICAqICAgICAgICAgQURDIGNoYW5uZWwuCisgICogQG5vdGUgICBDaGFubmVsIGVuZGluZyBpcyBvbiBjaGFubmVsIHNjb3BlOiBpbmRlcGVuZGVudGx5IG9mIGNoYW5uZWwgbWFwcGVkCisgICogICAgICAgICBvbiBBREMgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZC4KKyAgKiAgICAgICAgIEluIGRpZmZlcmVudGlhbCBtb2RlOiBEaWZmZXJlbnRpYWwgbWVhc3VyZW1lbnQgaXMgY2FycmllZCBvdXQKKyAgKiAgICAgICAgIGJldHdlZW4gdGhlIHNlbGVjdGVkIGNoYW5uZWwgJ2knIChwb3NpdGl2ZSBpbnB1dCkgYW5kCisgICogICAgICAgICBjaGFubmVsICdpKzEnIChuZWdhdGl2ZSBpbnB1dCkuIE9ubHkgY2hhbm5lbCAnaScgaGFzIHRvIGJlCisgICogICAgICAgICBjb25maWd1cmVkLCBjaGFubmVsICdpKzEnIGlzIGNvbmZpZ3VyZWQgYXV0b21hdGljYWxseS4KKyAgKiBAbm90ZSAgIFJlZmVyIHRvIFJlZmVyZW5jZSBNYW51YWwgdG8gZW5zdXJlIHRoZSBzZWxlY3RlZCBjaGFubmVsIGlzCisgICogICAgICAgICBhdmFpbGFibGUgaW4gZGlmZmVyZW50aWFsIG1vZGUuCisgICogICAgICAgICBGb3IgZXhhbXBsZSwgaW50ZXJuYWwgY2hhbm5lbHMgKFZyZWZJbnQsIFRlbXBTZW5zb3IsIC4uLikgYXJlCisgICogICAgICAgICBub3QgYXZhaWxhYmxlIGluIGRpZmZlcmVudGlhbCBtb2RlLgorICAqIEBub3RlICAgV2hlbiBjb25maWd1cmluZyBhIGNoYW5uZWwgJ2knIGluIGRpZmZlcmVudGlhbCBtb2RlLAorICAqICAgICAgICAgdGhlIGNoYW5uZWwgJ2krMScgaXMgbm90IHVzYWJsZSBzZXBhcmF0ZWx5LgorICAqIEBub3RlICAgT24gU1RNMzJGMywgY2hhbm5lbHMgMTYsIDE3LCAxOCBvZiBBREMxLAorICAqICAgICAgICAgY2hhbm5lbHMgMTcsIDE4IG9mIEFEQzIsIEFEQzMsIEFEQzQgKGlmIGF2YWlsYWJsZSkKKyAgKiAgICAgICAgIGFyZSBpbnRlcm5hbGx5IGZpeGVkIHRvIHNpbmdsZS1lbmRlZCBpbnB1dHMgY29uZmlndXJhdGlvbi4KKyAgKiBAbm90ZSAgIEZvciBBREMgY2hhbm5lbHMgY29uZmlndXJlZCBpbiBkaWZmZXJlbnRpYWwgbW9kZSwgYm90aCBpbnB1dHMKKyAgKiAgICAgICAgIHNob3VsZCBiZSBiaWFzZWQgYXQgKFZyZWYrKS8yICsvLTIwMG1WLgorICAqICAgICAgICAgKFZyZWYrIGlzIHRoZSBhbmFsb2cgdm9sdGFnZSByZWZlcmVuY2UpCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgQURDIGRpc2FibGVkLgorICAqIEBub3RlICAgT25lIG9yIHNldmVyYWwgdmFsdWVzIGNhbiBiZSBzZWxlY3RlZC4KKyAgKiAgICAgICAgIEV4YW1wbGU6IChMTF9BRENfQ0hBTk5FTF80IHwgTExfQURDX0NIQU5ORUxfMTIgfCAuLi4pCisgICogQHJtdG9sbCBESUZTRUwgICBESUZTRUwgICAgICAgICBMTF9BRENfR2V0Q2hhbm5lbFNhbXBsaW5nVGltZQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNiAgICAgICAgICAgKDEpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLgorICAqIEBwYXJhbSAgU2luZ2xlRGlmZiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0lOR0xFX0VOREVECisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0RJRkZFUkVOVElBTF9FTkRFRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldENoYW5uZWxTaW5nbGVEaWZmKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBTaW5nbGVEaWZmKQoreworICAvKiBCaXRzIG9mIGNoYW5uZWxzIGluIHNpbmdsZSBvciBkaWZmZXJlbnRpYWwgbW9kZSBhcmUgc2V0IG9ubHkgZm9yICAgICAgICAgKi8KKyAgLyogZGlmZmVyZW50aWFsIG1vZGUgKGZvciBzaW5nbGUgbW9kZSwgbWFzayBvZiBiaXRzIGFsbG93ZWQgdG8gYmUgc2V0IGlzICAgICovCisgIC8qIHNoaWZ0ZWQgb3V0IG9mIHJhbmdlIG9mIGJpdHMgb2YgY2hhbm5lbHMgaW4gc2luZ2xlIG9yIGRpZmZlcmVudGlhbCBtb2RlLiAqLworICBNT0RJRllfUkVHKEFEQ3gtPkRJRlNFTCwKKyAgICAgICAgICAgICBDaGFubmVsICYgQURDX1NJTkdMRURJRkZfQ0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgIChDaGFubmVsICYgQURDX1NJTkdMRURJRkZfQ0hBTk5FTF9NQVNLKSAmIChBRENfRElGU0VMX0RJRlNFTCA8PCAoU2luZ2xlRGlmZiAmIEFEQ19TSU5HTEVESUZGX0NIQU5ORUxfU0hJRlRfTUFTSykpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgbW9kZSBzaW5nbGUtZW5kZWQgb3IgZGlmZmVyZW50aWFsIGlucHV0IG9mIHRoZSBzZWxlY3RlZAorICAqICAgICAgICAgQURDIGNoYW5uZWwuCisgICogQG5vdGUgICBXaGVuIGNvbmZpZ3VyaW5nIGEgY2hhbm5lbCAnaScgaW4gZGlmZmVyZW50aWFsIG1vZGUsCisgICogICAgICAgICB0aGUgY2hhbm5lbCAnaSsxJyBpcyBub3QgdXNhYmxlIHNlcGFyYXRlbHkuCisgICogICAgICAgICBUaGVyZWZvcmUsIHRvIGVuc3VyZSBhIGNoYW5uZWwgaXMgY29uZmlndXJlZCBpbiBzaW5nbGUtZW5kZWQgbW9kZSwKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIG9mIGNoYW5uZWwgaXRzZWxmIGFuZCB0aGUgY2hhbm5lbCAnaS0xJyBtdXN0IGJlCisgICogICAgICAgICByZWFkIGJhY2sgKHRvIGVuc3VyZSB0aGF0IHRoZSBzZWxlY3RlZCBjaGFubmVsIGNoYW5uZWwgaGFzIG5vdCBiZWVuCisgICogICAgICAgICBjb25maWd1cmVkIGluIGRpZmZlcmVudGlhbCBtb2RlIGJ5IHRoZSBwcmV2aW91cyBjaGFubmVsKS4KKyAgKiBAbm90ZSAgIFJlZmVyIHRvIFJlZmVyZW5jZSBNYW51YWwgdG8gZW5zdXJlIHRoZSBzZWxlY3RlZCBjaGFubmVsIGlzCisgICogICAgICAgICBhdmFpbGFibGUgaW4gZGlmZmVyZW50aWFsIG1vZGUuCisgICogICAgICAgICBGb3IgZXhhbXBsZSwgaW50ZXJuYWwgY2hhbm5lbHMgKFZyZWZJbnQsIFRlbXBTZW5zb3IsIC4uLikgYXJlCisgICogICAgICAgICBub3QgYXZhaWxhYmxlIGluIGRpZmZlcmVudGlhbCBtb2RlLgorICAqIEBub3RlICAgV2hlbiBjb25maWd1cmluZyBhIGNoYW5uZWwgJ2knIGluIGRpZmZlcmVudGlhbCBtb2RlLAorICAqICAgICAgICAgdGhlIGNoYW5uZWwgJ2krMScgaXMgbm90IHVzYWJsZSBzZXBhcmF0ZWx5LgorICAqIEBub3RlICAgT24gU1RNMzJGMywgY2hhbm5lbHMgMTYsIDE3LCAxOCBvZiBBREMxLAorICAqICAgICAgICAgY2hhbm5lbHMgMTcsIDE4IG9mIEFEQzIsIEFEQzMsIEFEQzQgKGlmIGF2YWlsYWJsZSkKKyAgKiAgICAgICAgIGFyZSBpbnRlcm5hbGx5IGZpeGVkIHRvIHNpbmdsZS1lbmRlZCBpbnB1dHMgY29uZmlndXJhdGlvbi4KKyAgKiBAbm90ZSAgIE9uZSBvciBzZXZlcmFsIHZhbHVlcyBjYW4gYmUgc2VsZWN0ZWQuIEluIHRoaXMgY2FzZSwgdGhlIHZhbHVlCisgICogICAgICAgICByZXR1cm5lZCBpcyBudWxsIGlmIGFsbCBjaGFubmVscyBhcmUgaW4gc2luZ2xlIGVuZGVkLW1vZGUuCisgICogICAgICAgICBFeGFtcGxlOiAoTExfQURDX0NIQU5ORUxfNCB8IExMX0FEQ19DSEFOTkVMXzEyIHwgLi4uKQorICAqIEBybXRvbGwgRElGU0VMICAgRElGU0VMICAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWUKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNiAgICAgICAgICAgKDEpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLgorICAqIEByZXR2YWwgMDogY2hhbm5lbCBpbiBzaW5nbGUtZW5kZWQgbW9kZSwgZWxzZTogY2hhbm5lbCBpbiBkaWZmZXJlbnRpYWwgbW9kZQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRDaGFubmVsU2luZ2xlRGlmZihBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+RElGU0VMLCAoQ2hhbm5lbCAmIEFEQ19TSU5HTEVESUZGX0NIQU5ORUxfTUFTSykpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUZfQ29uZmlndXJhdGlvbl9BRENfQW5hbG9nV2F0Y2hkb2cgQ29uZmlndXJhdGlvbiBvZiBBREMgdHJhbnN2ZXJzYWwgc2NvcGU6IGFuYWxvZyB3YXRjaGRvZworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmVkIGNoYW5uZWxzOgorICAqICAgICAgICAgYSBzaW5nbGUgY2hhbm5lbCwgbXVsdGlwbGUgY2hhbm5lbHMgb3IgYWxsIGNoYW5uZWxzLAorICAqICAgICAgICAgb24gQURDIGdyb3VwcyByZWd1bGFyIGFuZC1vciBpbmplY3RlZC4KKyAgKiBAbm90ZSAgIE9uY2UgbW9uaXRvcmVkIGNoYW5uZWxzIGFyZSBzZWxlY3RlZCwgYW5hbG9nIHdhdGNoZG9nCisgICogICAgICAgICBpcyBlbmFibGVkLgorICAqIEBub3RlICAgSW4gY2FzZSBvZiBuZWVkIHRvIGRlZmluZSBhIHNpbmdsZSBjaGFubmVsIHRvIG1vbml0b3IKKyAgKiAgICAgICAgIHdpdGggYW5hbG9nIHdhdGNoZG9nIGZyb20gc2VxdWVuY2VyIGNoYW5uZWwgZGVmaW5pdGlvbiwKKyAgKiAgICAgICAgIHVzZSBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19BTkFMT0dXRF9DSEFOTkVMX0dST1VQKCkuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCB0aGVyZSBhcmUgMiBraW5kcyBvZiBhbmFsb2cgd2F0Y2hkb2cKKyAgKiAgICAgICAgIGluc3RhbmNlOgorICAqICAgICAgICAgLSBBV0Qgc3RhbmRhcmQgKGluc3RhbmNlIEFXRDEpOgorICAqICAgICAgICAgICAtIGNoYW5uZWxzIG1vbml0b3JlZDogY2FuIG1vbml0b3IgMSBjaGFubmVsIG9yIGFsbCBjaGFubmVscy4KKyAgKiAgICAgICAgICAgLSBncm91cHMgbW9uaXRvcmVkOiBBREMgZ3JvdXBzIHJlZ3VsYXIgYW5kLW9yIGluamVjdGVkLgorICAqICAgICAgICAgICAtIHJlc29sdXRpb246IHJlc29sdXRpb24gaXMgbm90IGxpbWl0ZWQgKGNvcnJlc3BvbmRzIHRvCisgICogICAgICAgICAgICAgQURDIHJlc29sdXRpb24gY29uZmlndXJlZCkuCisgICogICAgICAgICAtIEFXRCBmbGV4aWJsZSAoaW5zdGFuY2VzIEFXRDIsIEFXRDMpOgorICAqICAgICAgICAgICAtIGNoYW5uZWxzIG1vbml0b3JlZDogZmxleGlibGUgb24gY2hhbm5lbHMgbW9uaXRvcmVkLCBzZWxlY3Rpb24gaXMKKyAgKiAgICAgICAgICAgICBjaGFubmVsIHdpc2UsIGZyb20gZnJvbSAxIHRvIGFsbCBjaGFubmVscy4KKyAgKiAgICAgICAgICAgICBTcGVjaWZpY2l0eSBvZiB0aGlzIGFuYWxvZyB3YXRjaGRvZzogTXVsdGlwbGUgY2hhbm5lbHMgY2FuCisgICogICAgICAgICAgICAgYmUgc2VsZWN0ZWQuIEZvciBleGFtcGxlOgorICAqICAgICAgICAgICAgIChMTF9BRENfQVdEX0NIQU5ORUw0X1JFR19JTkogfCBMTF9BRENfQVdEX0NIQU5ORUw1X1JFR19JTkogfCAuLi4pCisgICogICAgICAgICAgIC0gZ3JvdXBzIG1vbml0b3JlZDogbm90IHNlbGVjdGlvbiBwb3NzaWJsZSAobW9uaXRvcmluZyBvbiBib3RoCisgICogICAgICAgICAgICAgZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkKS4KKyAgKiAgICAgICAgICAgICBDaGFubmVscyBzZWxlY3RlZCBhcmUgbW9uaXRvcmVkIG9uIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZDoKKyAgKiAgICAgICAgICAgICBMTF9BRENfQVdEX0NIQU5ORUx4eF9SRUdfSU5KIChkbyBub3QgdXNlIHBhcmFtZXRlcnMKKyAgKiAgICAgICAgICAgICBMTF9BRENfQVdEX0NIQU5ORUx4eF9SRUcgYW5kIExMX0FEQ19BV0RfQ0hBTk5FTHh4X0lOSikKKyAgKiAgICAgICAgICAgLSByZXNvbHV0aW9uOiByZXNvbHV0aW9uIGlzIGxpbWl0ZWQgdG8gOCBiaXRzOiBpZiBBREMgcmVzb2x1dGlvbiBpcworICAqICAgICAgICAgICAgIDEyIGJpdHMgdGhlIDQgTFNCIGFyZSBpZ25vcmVkLCBpZiBBREMgcmVzb2x1dGlvbiBpcyAxMCBiaXRzCisgICogICAgICAgICAgICAgdGhlIDIgTFNCIGFyZSBpZ25vcmVkLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBlaXRoZXIgZ3JvdXBzIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuCisgICogQHJtdG9sbCBDRkdSICAgICBBV0QxQ0ggICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzXG4KKyAgKiAgICAgICAgIENGR1IgICAgIEFXRDFTR0wgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHNcbgorICAqICAgICAgICAgQ0ZHUiAgICAgQVdEMUVOICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dETW9uaXRDaGFubmVsc1xuCisgICogICAgICAgICBDRkdSICAgICBKQVdEMUVOICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzXG4KKyAgKiAgICAgICAgIEFXRDJDUiAgIEFXRDJDSCAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHNcbgorICAqICAgICAgICAgQVdEM0NSICAgQVdEM0NIICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dETW9uaXRDaGFubmVscworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEFXRHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0QyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRDMKKyAgKiBAcGFyYW0gIEFXRENoYW5uZWxHcm91cCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQUxMX0NIQU5ORUxTX1JFRyAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfSU5KICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0FMTF9DSEFOTkVMU19SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzBfUkVHICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMF9JTkogICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8wX1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMV9SRUcgICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xX0lOSiAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzFfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8yX1JFRyAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzJfSU5KICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMl9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzNfUkVHICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfM19JTkogICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8zX1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNF9SRUcgICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF80X0lOSiAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzRfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF81X1JFRyAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzVfSU5KICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNV9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzZfUkVHICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNl9JTkogICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF82X1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfN19SRUcgICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF83X0lOSiAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzdfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF84X1JFRyAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzhfSU5KICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOF9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzlfUkVHICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOV9JTkogICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF85X1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTBfUkVHICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMF9JTkogICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEwX1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTFfUkVHICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMV9JTkogICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzExX1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTJfUkVHICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMl9JTkogICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEyX1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTNfUkVHICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xM19JTkogICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEzX1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTRfUkVHICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNF9JTkogICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE0X1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTVfUkVHICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNV9JTkogICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE1X1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTZfUkVHICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNl9JTkogICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE2X1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTdfUkVHICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xN19JTkogICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE3X1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMThfUkVHICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xOF9JTkogICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE4X1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZSRUZJTlRfUkVHICAgICAgICAgICgwKSg1KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVlJFRklOVF9JTkogICAgICAgICAgKDApKDUpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WUkVGSU5UX1JFR19JTkogICAgICAgICAoNSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1RFTVBTRU5TT1JfUkVHICAgICAgICgwKSgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVEVNUFNFTlNPUl9JTkogICAgICAgKDApKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9URU1QU0VOU09SX1JFR19JTkogICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZCQVRfUkVHICAgICAgICAgICAgICgwKSgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVkJBVF9JTkogICAgICAgICAgICAgKDApKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WQkFUX1JFR19JTkogICAgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDFfUkVHICAgICAgICAgICgwKSgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QMV9JTkogICAgICAgICAgKDApKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVAxX1JFR19JTkogICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDJfUkVHICAgICAgICAgICgwKSgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QMl9JTkogICAgICAgICAgKDApKDIpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVAyX1JFR19JTkogICAgICAgICAoMikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDNfUkVHICAgICAgICAgICgwKSgzKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QM19JTkogICAgICAgICAgKDApKDMpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVAzX1JFR19JTkogICAgICAgICAoMykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDRfUkVHICAgICAgICAgICgwKSg0KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QNF9JTkogICAgICAgICAgKDApKDQpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVA0X1JFR19JTkogICAgICAgICAoNCkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDApIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBhbmFsb2cgd2F0Y2hkb2cgbnVtYmVyOiBBV0QxLlxuCisgICogICAgICAgICAoMSkgT24gU1RNMzJGMywgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbgorICAqICAgICAgICAgKDIpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzIuXG4KKyAgKiAgICAgICAgICgzKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMzLlxuCisgICogICAgICAgICAoNCkgT24gU1RNMzJGMywgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6IEFEQzQuXG4KKyAgKiAgICAgICAgICg1KSBPbiBTVE0zMkYzLCBBREMgY2hhbm5lbCBhdmFpbGFibGUgb25seSBvbiBhbGwgQURDIGluc3RhbmNlcywgYnV0CisgICogICAgICAgICAgICAgb25seSBvbmUgQURDIGluc3RhbmNlIGlzIGFsbG93ZWQgdG8gYmUgY29ubmVjdGVkIHRvIFZyZWZJbnQgYXQgdGhlIHNhbWUgdGltZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHMoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IEFXRHksIHVpbnQzMl90IEFXRENoYW5uZWxHcm91cCkKK3sKKyAgLyogU2V0IGJpdHMgd2l0aCBjb250ZW50IG9mIHBhcmFtZXRlciAiQVdEQ2hhbm5lbEdyb3VwIiB3aXRoIGJpdHMgcG9zaXRpb24gICovCisgIC8qIGluIHJlZ2lzdGVyIGFuZCByZWdpc3RlciBwb3NpdGlvbiBkZXBlbmRpbmcgb24gcGFyYW1ldGVyICJBV0R5Ii4gICAgICAgICAqLworICAvKiBQYXJhbWV0ZXJzICJBV0RDaGFubmVsR3JvdXAiIGFuZCAiQVdEeSIgYXJlIHVzZWQgd2l0aCBtYXNrcyBiZWNhdXNlICAgICAgKi8KKyAgLyogY29udGFpbmluZyBvdGhlciBiaXRzIHJlc2VydmVkIGZvciBvdGhlciBwdXJwb3NlLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVChBREN4LT5DRkdSLCBfX0FEQ19NQVNLX1NISUZUKEFXRHksIEFEQ19BV0RfQ1JYX1JFR09GRlNFVF9NQVNLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKChBV0R5ICYgQURDX0FXRF9DUjEyX1JFR09GRlNFVEdBUF9NQVNLKSAqIEFEQ19BV0RfQ1IxMl9SRUdPRkZTRVRHQVBfVkFMKSk7CisgIAorICBNT0RJRllfUkVHKCpwcmVnLAorICAgICAgICAgICAgIChBV0R5ICYgQURDX0FXRF9DUl9BTExfQ0hBTk5FTF9NQVNLKSwKKyAgICAgICAgICAgICBBV0RDaGFubmVsR3JvdXAgJiBBV0R5KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yZWQgY2hhbm5lbC4KKyAgKiBAbm90ZSAgIFVzYWdlIG9mIHRoZSByZXR1cm5lZCBjaGFubmVsIG51bWJlcjoKKyAgKiAgICAgICAgIC0gVG8gcmVpbmplY3QgdGhpcyBjaGFubmVsIGludG8gYW5vdGhlciBmdW5jdGlvbiBMTF9BRENfeHh4OgorICAqICAgICAgICAgICB0aGUgcmV0dXJuZWQgY2hhbm5lbCBudW1iZXIgaXMgb25seSBwYXJ0bHkgZm9ybWF0dGVkIG9uIGRlZmluaXRpb24KKyAgKiAgICAgICAgICAgb2YgbGl0ZXJhbHMgTExfQURDX0NIQU5ORUxfeC4gVGhlcmVmb3JlLCBpdCBoYXMgdG8gYmUgY29tcGFyZWQKKyAgKiAgICAgICAgICAgd2l0aCBwYXJ0cyBvZiBsaXRlcmFscyBMTF9BRENfQ0hBTk5FTF94IG9yIHVzaW5nCisgICogICAgICAgICAgIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQigpLgorICAqICAgICAgICAgICBUaGVuIHRoZSBzZWxlY3RlZCBsaXRlcmFsIExMX0FEQ19DSEFOTkVMX3ggY2FuIGJlIHVzZWQKKyAgKiAgICAgICAgICAgYXMgcGFyYW1ldGVyIGZvciBhbm90aGVyIGZ1bmN0aW9uLgorICAqICAgICAgICAgLSBUbyBnZXQgdGhlIGNoYW5uZWwgbnVtYmVyIGluIGRlY2ltYWwgZm9ybWF0OgorICAqICAgICAgICAgICBwcm9jZXNzIHRoZSByZXR1cm5lZCB2YWx1ZSB3aXRoIHRoZSBoZWxwZXIgbWFjcm8KKyAgKiAgICAgICAgICAgQHJlZiBfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoKS4KKyAgKiAgICAgICAgICAgQXBwbGljYWJsZSBvbmx5IHdoZW4gdGhlIGFuYWxvZyB3YXRjaGRvZyBpcyBzZXQgdG8gbW9uaXRvcgorICAqICAgICAgICAgICBvbmUgY2hhbm5lbC4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHRoZXJlIGFyZSAyIGtpbmRzIG9mIGFuYWxvZyB3YXRjaGRvZworICAqICAgICAgICAgaW5zdGFuY2U6CisgICogICAgICAgICAtIEFXRCBzdGFuZGFyZCAoaW5zdGFuY2UgQVdEMSk6CisgICogICAgICAgICAgIC0gY2hhbm5lbHMgbW9uaXRvcmVkOiBjYW4gbW9uaXRvciAxIGNoYW5uZWwgb3IgYWxsIGNoYW5uZWxzLgorICAqICAgICAgICAgICAtIGdyb3VwcyBtb25pdG9yZWQ6IEFEQyBncm91cHMgcmVndWxhciBhbmQtb3IgaW5qZWN0ZWQuCisgICogICAgICAgICAgIC0gcmVzb2x1dGlvbjogcmVzb2x1dGlvbiBpcyBub3QgbGltaXRlZCAoY29ycmVzcG9uZHMgdG8KKyAgKiAgICAgICAgICAgICBBREMgcmVzb2x1dGlvbiBjb25maWd1cmVkKS4KKyAgKiAgICAgICAgIC0gQVdEIGZsZXhpYmxlIChpbnN0YW5jZXMgQVdEMiwgQVdEMyk6CisgICogICAgICAgICAgIC0gY2hhbm5lbHMgbW9uaXRvcmVkOiBmbGV4aWJsZSBvbiBjaGFubmVscyBtb25pdG9yZWQsIHNlbGVjdGlvbiBpcworICAqICAgICAgICAgICAgIGNoYW5uZWwgd2lzZSwgZnJvbSBmcm9tIDEgdG8gYWxsIGNoYW5uZWxzLgorICAqICAgICAgICAgICAgIFNwZWNpZmljaXR5IG9mIHRoaXMgYW5hbG9nIHdhdGNoZG9nOiBNdWx0aXBsZSBjaGFubmVscyBjYW4KKyAgKiAgICAgICAgICAgICBiZSBzZWxlY3RlZC4gRm9yIGV4YW1wbGU6CisgICogICAgICAgICAgICAgKExMX0FEQ19BV0RfQ0hBTk5FTDRfUkVHX0lOSiB8IExMX0FEQ19BV0RfQ0hBTk5FTDVfUkVHX0lOSiB8IC4uLikKKyAgKiAgICAgICAgICAgLSBncm91cHMgbW9uaXRvcmVkOiBub3Qgc2VsZWN0aW9uIHBvc3NpYmxlIChtb25pdG9yaW5nIG9uIGJvdGgKKyAgKiAgICAgICAgICAgICBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQpLgorICAqICAgICAgICAgICAgIENoYW5uZWxzIHNlbGVjdGVkIGFyZSBtb25pdG9yZWQgb24gZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkOgorICAqICAgICAgICAgICAgIExMX0FEQ19BV0RfQ0hBTk5FTHh4X1JFR19JTkogKGRvIG5vdCB1c2UgcGFyYW1ldGVycworICAqICAgICAgICAgICAgIExMX0FEQ19BV0RfQ0hBTk5FTHh4X1JFRyBhbmQgTExfQURDX0FXRF9DSEFOTkVMeHhfSU5KKQorICAqICAgICAgICAgICAtIHJlc29sdXRpb246IHJlc29sdXRpb24gaXMgbGltaXRlZCB0byA4IGJpdHM6IGlmIEFEQyByZXNvbHV0aW9uIGlzCisgICogICAgICAgICAgICAgMTIgYml0cyB0aGUgNCBMU0IgYXJlIGlnbm9yZWQsIGlmIEFEQyByZXNvbHV0aW9uIGlzIDEwIGJpdHMKKyAgKiAgICAgICAgICAgICB0aGUgMiBMU0IgYXJlIGlnbm9yZWQuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4KKyAgKiBAcm10b2xsIENGR1IgICAgIEFXRDFDSCAgICAgICAgIExMX0FEQ19HZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHNcbgorICAqICAgICAgICAgQ0ZHUiAgICAgQVdEMVNHTCAgICAgICAgTExfQURDX0dldEFuYWxvZ1dETW9uaXRDaGFubmVsc1xuCisgICogICAgICAgICBDRkdSICAgICBBV0QxRU4gICAgICAgICBMTF9BRENfR2V0QW5hbG9nV0RNb25pdENoYW5uZWxzXG4KKyAgKiAgICAgICAgIENGR1IgICAgIEpBV0QxRU4gICAgICAgIExMX0FEQ19HZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHNcbgorICAqICAgICAgICAgQVdEMkNSICAgQVdEMkNIICAgICAgICAgTExfQURDX0dldEFuYWxvZ1dETW9uaXRDaGFubmVsc1xuCisgICogICAgICAgICBBV0QzQ1IgICBBV0QzQ0ggICAgICAgICBMTF9BRENfR2V0QW5hbG9nV0RNb25pdENoYW5uZWxzCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgQVdEeSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0QxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRDIgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRDMgKDEpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiB0aGlzIEFXRCBudW1iZXIsIG1vbml0b3JlZCBjaGFubmVsIGNhbiBiZSByZXRyaWV2ZWQKKyAgKiAgICAgICAgICAgICBpZiBvbmx5IDEgY2hhbm5lbCBpcyBwcm9ncmFtbWVkIChvciBub25lIG9yIGFsbCBjaGFubmVscykuCisgICogICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3QgcmV0cmlldmUgbW9uaXRvcmVkIGNoYW5uZWwgaWYKKyAgKiAgICAgICAgICAgICBtdWx0aXBsZSBjaGFubmVscyBhcmUgcHJvZ3JhbW1lZCBzaW11bHRhbmVvdXNseQorICAqICAgICAgICAgICAgIGJ5IGJpdGZpZWxkLgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0FMTF9DSEFOTkVMU19SRUcgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQUxMX0NIQU5ORUxTX0lOSiAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8wX1JFRyAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzBfSU5KICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMF9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzFfUkVHICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMV9JTkogICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xX1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMl9SRUcgICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8yX0lOSiAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzJfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8zX1JFRyAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzNfSU5KICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfM19SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzRfUkVHICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNF9JTkogICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF80X1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNV9SRUcgICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF81X0lOSiAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzVfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF82X1JFRyAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzZfSU5KICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNl9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzdfUkVHICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfN19JTkogICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF83X1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOF9SRUcgICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF84X0lOSiAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzhfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF85X1JFRyAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzlfSU5KICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOV9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEwX1JFRyAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTBfSU5KICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMF9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzExX1JFRyAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTFfSU5KICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMV9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEyX1JFRyAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTJfSU5KICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMl9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEzX1JFRyAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTNfSU5KICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xM19SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE0X1JFRyAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTRfSU5KICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNF9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE1X1JFRyAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTVfSU5KICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNV9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE2X1JFRyAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTZfSU5KICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNl9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE3X1JFRyAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTdfSU5KICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xN19SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE4X1JFRyAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMThfSU5KICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xOF9SRUdfSU5KCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgwKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gYW5hbG9nIHdhdGNoZG9nIG51bWJlcjogQVdEMS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0QW5hbG9nV0RNb25pdENoYW5uZWxzKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBBV0R5KQoreworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoQURDeC0+Q0ZHUiwgX19BRENfTUFTS19TSElGVChBV0R5LCBBRENfQVdEX0NSWF9SRUdPRkZTRVRfTUFTSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoQVdEeSAmIEFEQ19BV0RfQ1IxMl9SRUdPRkZTRVRHQVBfTUFTSykgKiBBRENfQVdEX0NSMTJfUkVHT0ZGU0VUR0FQX1ZBTCkpOworICAKKyAgLyogVmFyaWFibGUgIkFXRHkiIHVzZWQgdG8gcmV0cmlldmUgYXBwcm9wcmlhdGUgYml0ZmllbGQgY29ycmVzcG9uZGluZyB0byAgICovCisgIC8qIEFEQ19BV0RfQ1IxX0NIQU5ORUxfTUFTSyBvciBBRENfQVdEX0NSMjNfQ0hBTk5FTF9NQVNLLiAgICAgICAgICAgICAgICAgICAqLworICByZWdpc3RlciB1aW50MzJfdCBBV0QxMjNDaGFubmVsR3JvdXAgPSBSRUFEX0JJVCgqcHJlZywgKEFXRHkgfCBBRENfQVdEX0NSX0FMTF9DSEFOTkVMX01BU0spKTsKKyAgCisgIC8qIFNldCB2YXJpYWJsZSBvZiBBV0QxIG1vbml0b3JlZCBjaGFubmVsIGFjY29yZGluZyB0byBBV0QxIGZlYXR1cmVzICAgICAgICAqLworICAvKiBhbmQgQURDIGNoYW5uZWwgZGVmaW5pdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogLSBjaGFubmVsIElEIHdpdGggbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIC0gY2hhbm5lbCBJRCB3aXRoIGJpdGZpZWxkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAtIEFXRDEgc2luZ2xlIG9yIGFsbCBjaGFubmVscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogLSBBV0QxIGVuYWJsZSBvciBkaXNhYmxlIChhbHNvIHVzZWQgdG8gZGlzY2FyZCBBV0QxIGJpdGZpZWxkIGluIGNhc2Ugb2YgICovCisgIC8qICAgQVdEMiBvciBBV0QzIHNlbGVjdGVkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICByZWdpc3RlciB1aW50MzJfdCBBV0QxQ2hhbm5lbFNpbmdsZSA9ICgoQVdEMTIzQ2hhbm5lbEdyb3VwICYgQURDX0NGR1JfQVdEMVNHTCkgPj4gQURDX0NGR1JfQVdEMVNHTF9CSVRPRkZTRVRfUE9TKTsKKyAgCisgIHJlZ2lzdGVyIHVpbnQzMl90IEFXRDFDaGFubmVsR3JvdXAgPSAoICggIEFXRDEyM0NoYW5uZWxHcm91cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKEFEQ19DSEFOTkVMXzBfQklURklFTEQgPDwgKChBV0QxMjNDaGFubmVsR3JvdXAgJiBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSykgPj4gQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MpKSAqIEFXRDFDaGFubmVsU2luZ2xlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoQURDX0NIQU5ORUxfSURfQklURklFTERfTUFTSyAqICh+QVdEMUNoYW5uZWxTaW5nbGUgJiAoKHVpbnQzMl90KTB4MDAwMDAwMDFVKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICgoKEFXRDEyM0NoYW5uZWxHcm91cCAmIEFEQ19DRkdSX0pBV0QxRU4pID4+IEFEQ19DRkdSX0pBV0QxRU5fQklUT0ZGU0VUX1BPUykgfCAoKEFXRDEyM0NoYW5uZWxHcm91cCAmIEFEQ19DRkdSX0FXRDFFTikgPj4gQURDX0NGR1JfQVdEMUVOX0JJVE9GRlNFVF9QT1MpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgCisgIC8qIFNldCB2YXJpYWJsZSBvZiBBV0QyIGFuZCBBV0QzIG1vbml0b3JlZCBjaGFubmVsIGFjY29yZGluZyB0byBBV0QyLTMgICAgICAqLworICAvKiBmZWF0dXJlcyBhbmQgQURDIGNoYW5uZWwgZGVmaW5pdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogLSBjaGFubmVsIElEIHdpdGggbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIC0gY2hhbm5lbCBJRCB3aXRoIGJpdGZpZWxkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAtIEFXRDItMyBzaW5nbGUgb3IgYWxsIGNoYW5uZWxzIChzaGlmdCB2YWx1ZSAzMiAoMHgxIHNoaWZ0IDUpIHVzZWQgdG8gICAgKi8KKyAgLyogICBzaGlmdCBBV0QxIGVxdWl2YWxlbnQgc2luZ2xlLWFsbCBjaGFubmVscyBvdXQgb2YgcmVnaXN0ZXIpICAgICAgICAgICAgICovCisgIC8qIC0gQVdEMi0zIGVuYWJsZSBvciBkaXNhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBOb3RlOiBVc2UgbW9kdWxvIDMgdG8gYXZvaWQgYSBzaGlmdCB2YWx1ZSB0b28gbG9uZy4gT24gQVdEMiBhbmQgQVdEMywgICAgKi8KKyAgLyogICAgICAgY2hhbm5lbCBjYW4gYmUgcmVhZCBiYWNrIGlmIG9ubHkgMSBjaGFubmVsIG1vbml0b3JpbmcgICAgICAgICAgICAgICovCisgIC8qICAgICAgIGlzIGFjdGl2YXRlZCwgdGhlcmVmb3JlIHRoZSBjaGFubmVsIG1vbml0b3JpbmcgdmFsdWUgY2hhbm5lbCAiMyIgICAqLworICAvKiAgICAgICBpcyBub3Qgbm90IHN1cHBvcnRlZCBieSB0aGlzIGZ1bmN0aW9uLCB0aGVyZSBpcyBubyByaXNrIG9mICAgICAgICAgKi8KKyAgLyogICAgICAgY29uZmxpY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHJlZ2lzdGVyIHVpbnQzMl90IEFXRDIzRW5hYmxlZCA9ICgoKCh1aW50MzJfdCkweDAwMDAwMDAxVSkgPj4gKEFXRDEyM0NoYW5uZWxHcm91cCAlIDNVKSkgPDwgNlUpOyAvKiBWYWx1ZSAiMCIgaWYgQVdEMi0zIGlzIGVuYWJsZWQsIHZhbHVlICIzMiIgaWYgQVdEMi0zIGlzIGRpc2FibGVkICovCisgIAorICByZWdpc3RlciB1aW50MzJfdCBBV0QyM0NoYW5uZWxHcm91cCA9ICgoKCAgQVdEMTIzQ2hhbm5lbEdyb3VwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKHVpbnQzMl90KVBPU0lUSU9OX1ZBTChBV0QxMjNDaGFubmVsR3JvdXApIDw8IEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChBRENfQ0ZHUl9BV0QxU0dMKSA+PiAoKCgodWludDMyX3QpMHgwMDAwMDAwMVUpID4+IChBRENfQVdEX0NSMjNfQ0hBTk5FTF9NQVNLIC0gQVdEMTIzQ2hhbm5lbEdyb3VwKSkgPDwgNVUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApID4+IEFXRDIzRW5hYmxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApID4+ICgoKEFXRHkgJiBBRENfQ0ZHUl9BV0QxU0dMKSA+PiBBRENfQ0ZHUl9BV0QxU0dMX0JJVE9GRlNFVF9QT1MpIDw8IDVVKSk7CisgIAorICByZXR1cm4gKEFXRDFDaGFubmVsR3JvdXAgfCBBV0QyM0NoYW5uZWxHcm91cCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyB2YWx1ZSBvZiBib3RoIHRocmVzaG9sZHMKKyAgKiAgICAgICAgIGhpZ2ggYW5kIGxvdy4KKyAgKiBAbm90ZSAgIElmIHZhbHVlIG9mIG9ubHkgb25lIHRocmVzaG9sZCBoaWdoIG9yIGxvdyBtdXN0IGJlIHNldCwKKyAgKiAgICAgICAgIHVzZSBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRBbmFsb2dXRFRocmVzaG9sZHMoKS4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgQURDIHJlc29sdXRpb24gZGlmZmVyZW50IG9mIDEyIGJpdHMsCisgICogICAgICAgICBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyBkYXRhIHJlcXVpcmUgYSBzcGVjaWZpYyBzaGlmdC4KKyAgKiAgICAgICAgIFVzZSBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19BTkFMT0dXRF9TRVRfVEhSRVNIT0xEX1JFU09MVVRJT04oKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHRoZXJlIGFyZSAyIGtpbmRzIG9mIGFuYWxvZyB3YXRjaGRvZworICAqICAgICAgICAgaW5zdGFuY2U6CisgICogICAgICAgICAtIEFXRCBzdGFuZGFyZCAoaW5zdGFuY2UgQVdEMSk6CisgICogICAgICAgICAgIC0gY2hhbm5lbHMgbW9uaXRvcmVkOiBjYW4gbW9uaXRvciAxIGNoYW5uZWwgb3IgYWxsIGNoYW5uZWxzLgorICAqICAgICAgICAgICAtIGdyb3VwcyBtb25pdG9yZWQ6IEFEQyBncm91cHMgcmVndWxhciBhbmQtb3IgaW5qZWN0ZWQuCisgICogICAgICAgICAgIC0gcmVzb2x1dGlvbjogcmVzb2x1dGlvbiBpcyBub3QgbGltaXRlZCAoY29ycmVzcG9uZHMgdG8KKyAgKiAgICAgICAgICAgICBBREMgcmVzb2x1dGlvbiBjb25maWd1cmVkKS4KKyAgKiAgICAgICAgIC0gQVdEIGZsZXhpYmxlIChpbnN0YW5jZXMgQVdEMiwgQVdEMyk6CisgICogICAgICAgICAgIC0gY2hhbm5lbHMgbW9uaXRvcmVkOiBmbGV4aWJsZSBvbiBjaGFubmVscyBtb25pdG9yZWQsIHNlbGVjdGlvbiBpcworICAqICAgICAgICAgICAgIGNoYW5uZWwgd2lzZSwgZnJvbSBmcm9tIDEgdG8gYWxsIGNoYW5uZWxzLgorICAqICAgICAgICAgICAgIFNwZWNpZmljaXR5IG9mIHRoaXMgYW5hbG9nIHdhdGNoZG9nOiBNdWx0aXBsZSBjaGFubmVscyBjYW4KKyAgKiAgICAgICAgICAgICBiZSBzZWxlY3RlZC4gRm9yIGV4YW1wbGU6CisgICogICAgICAgICAgICAgKExMX0FEQ19BV0RfQ0hBTk5FTDRfUkVHX0lOSiB8IExMX0FEQ19BV0RfQ0hBTk5FTDVfUkVHX0lOSiB8IC4uLikKKyAgKiAgICAgICAgICAgLSBncm91cHMgbW9uaXRvcmVkOiBub3Qgc2VsZWN0aW9uIHBvc3NpYmxlIChtb25pdG9yaW5nIG9uIGJvdGgKKyAgKiAgICAgICAgICAgICBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQpLgorICAqICAgICAgICAgICAgIENoYW5uZWxzIHNlbGVjdGVkIGFyZSBtb25pdG9yZWQgb24gZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkOgorICAqICAgICAgICAgICAgIExMX0FEQ19BV0RfQ0hBTk5FTHh4X1JFR19JTkogKGRvIG5vdCB1c2UgcGFyYW1ldGVycworICAqICAgICAgICAgICAgIExMX0FEQ19BV0RfQ0hBTk5FTHh4X1JFRyBhbmQgTExfQURDX0FXRF9DSEFOTkVMeHhfSU5KKQorICAqICAgICAgICAgICAtIHJlc29sdXRpb246IHJlc29sdXRpb24gaXMgbGltaXRlZCB0byA4IGJpdHM6IGlmIEFEQyByZXNvbHV0aW9uIGlzCisgICogICAgICAgICAgICAgMTIgYml0cyB0aGUgNCBMU0IgYXJlIGlnbm9yZWQsIGlmIEFEQyByZXNvbHV0aW9uIGlzIDEwIGJpdHMKKyAgKiAgICAgICAgICAgICB0aGUgMiBMU0IgYXJlIGlnbm9yZWQuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4KKyAgKiBAcm10b2xsIFRSMSAgICAgIEhUMSAgICAgICAgICAgIExMX0FEQ19Db25maWdBbmFsb2dXRFRocmVzaG9sZHNcbgorICAqICAgICAgICAgVFIyICAgICAgSFQyICAgICAgICAgICAgTExfQURDX0NvbmZpZ0FuYWxvZ1dEVGhyZXNob2xkc1xuCisgICogICAgICAgICBUUjMgICAgICBIVDMgICAgICAgICAgICBMTF9BRENfQ29uZmlnQW5hbG9nV0RUaHJlc2hvbGRzXG4KKyAgKiAgICAgICAgIFRSMSAgICAgIExUMSAgICAgICAgICAgIExMX0FEQ19Db25maWdBbmFsb2dXRFRocmVzaG9sZHNcbgorICAqICAgICAgICAgVFIyICAgICAgTFQyICAgICAgICAgICAgTExfQURDX0NvbmZpZ0FuYWxvZ1dEVGhyZXNob2xkc1xuCisgICogICAgICAgICBUUjMgICAgICBMVDMgICAgICAgICAgICBMTF9BRENfQ29uZmlnQW5hbG9nV0RUaHJlc2hvbGRzCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgQVdEeSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0QxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEMworICAqIEBwYXJhbSAgQVdEVGhyZXNob2xkSGlnaFZhbHVlIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGCisgICogQHBhcmFtICBBV0RUaHJlc2hvbGRMb3dWYWx1ZSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0NvbmZpZ0FuYWxvZ1dEVGhyZXNob2xkcyhBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgQVdEeSwgdWludDMyX3QgQVdEVGhyZXNob2xkSGlnaFZhbHVlLCB1aW50MzJfdCBBV0RUaHJlc2hvbGRMb3dWYWx1ZSkKK3sKKyAgLyogU2V0IGJpdHMgd2l0aCBjb250ZW50IG9mIHBhcmFtZXRlciAiQVdEVGhyZXNob2xkeHh4VmFsdWUiIHdpdGggYml0cyAgICAgICovCisgIC8qIHBvc2l0aW9uIGluIHJlZ2lzdGVyIGFuZCByZWdpc3RlciBwb3NpdGlvbiBkZXBlbmRpbmcgb24gcGFyYW1ldGVyICAgICAgICAqLworICAvKiAiQVdEeSIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUGFyYW1ldGVycyAiQVdEeSIgYW5kICJBV0RUaHJlc2hvbGR4eHhWYWx1ZSIgYXJlIHVzZWQgd2l0aCBtYXNrcyBiZWNhdXNlICovCisgIC8qIGNvbnRhaW5pbmcgb3RoZXIgYml0cyByZXNlcnZlZCBmb3Igb3RoZXIgcHVycG9zZS4gICAgICAgICAgICAgICAgICAgICAgICAqLworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoQURDeC0+VFIxLCBfX0FEQ19NQVNLX1NISUZUKEFXRHksIEFEQ19BV0RfVFJYX1JFR09GRlNFVF9NQVNLKSk7CisgIAorICBNT0RJRllfUkVHKCpwcmVnLAorICAgICAgICAgICAgIEFEQ19UUjFfSFQxIHwgQURDX1RSMV9MVDEsCisgICAgICAgICAgICAgKEFXRFRocmVzaG9sZEhpZ2hWYWx1ZSA8PCBBRENfVFIxX0hUMV9CSVRPRkZTRVRfUE9TKSB8IEFXRFRocmVzaG9sZExvd1ZhbHVlKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgdmFsdWUgb2YgdGhyZXNob2xkCisgICogICAgICAgICBoaWdoIG9yIGxvdy4KKyAgKiBAbm90ZSAgIElmIHZhbHVlcyBvZiBib3RoIHRocmVzaG9sZHMgaGlnaCBvciBsb3cgbXVzdCBiZSBzZXQsCisgICogICAgICAgICB1c2UgZnVuY3Rpb24gQHJlZiBMTF9BRENfQ29uZmlnQW5hbG9nV0RUaHJlc2hvbGRzKCkuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIEFEQyByZXNvbHV0aW9uIGRpZmZlcmVudCBvZiAxMiBiaXRzLAorICAqICAgICAgICAgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgZGF0YSByZXF1aXJlIGEgc3BlY2lmaWMgc2hpZnQuCisgICogICAgICAgICBVc2UgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQU5BTE9HV0RfU0VUX1RIUkVTSE9MRF9SRVNPTFVUSU9OKCkuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCB0aGVyZSBhcmUgMiBraW5kcyBvZiBhbmFsb2cgd2F0Y2hkb2cKKyAgKiAgICAgICAgIGluc3RhbmNlOgorICAqICAgICAgICAgLSBBV0Qgc3RhbmRhcmQgKGluc3RhbmNlIEFXRDEpOgorICAqICAgICAgICAgICAtIGNoYW5uZWxzIG1vbml0b3JlZDogY2FuIG1vbml0b3IgMSBjaGFubmVsIG9yIGFsbCBjaGFubmVscy4KKyAgKiAgICAgICAgICAgLSBncm91cHMgbW9uaXRvcmVkOiBBREMgZ3JvdXBzIHJlZ3VsYXIgYW5kLW9yIGluamVjdGVkLgorICAqICAgICAgICAgICAtIHJlc29sdXRpb246IHJlc29sdXRpb24gaXMgbm90IGxpbWl0ZWQgKGNvcnJlc3BvbmRzIHRvCisgICogICAgICAgICAgICAgQURDIHJlc29sdXRpb24gY29uZmlndXJlZCkuCisgICogICAgICAgICAtIEFXRCBmbGV4aWJsZSAoaW5zdGFuY2VzIEFXRDIsIEFXRDMpOgorICAqICAgICAgICAgICAtIGNoYW5uZWxzIG1vbml0b3JlZDogZmxleGlibGUgb24gY2hhbm5lbHMgbW9uaXRvcmVkLCBzZWxlY3Rpb24gaXMKKyAgKiAgICAgICAgICAgICBjaGFubmVsIHdpc2UsIGZyb20gZnJvbSAxIHRvIGFsbCBjaGFubmVscy4KKyAgKiAgICAgICAgICAgICBTcGVjaWZpY2l0eSBvZiB0aGlzIGFuYWxvZyB3YXRjaGRvZzogTXVsdGlwbGUgY2hhbm5lbHMgY2FuCisgICogICAgICAgICAgICAgYmUgc2VsZWN0ZWQuIEZvciBleGFtcGxlOgorICAqICAgICAgICAgICAgIChMTF9BRENfQVdEX0NIQU5ORUw0X1JFR19JTkogfCBMTF9BRENfQVdEX0NIQU5ORUw1X1JFR19JTkogfCAuLi4pCisgICogICAgICAgICAgIC0gZ3JvdXBzIG1vbml0b3JlZDogbm90IHNlbGVjdGlvbiBwb3NzaWJsZSAobW9uaXRvcmluZyBvbiBib3RoCisgICogICAgICAgICAgICAgZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkKS4KKyAgKiAgICAgICAgICAgICBDaGFubmVscyBzZWxlY3RlZCBhcmUgbW9uaXRvcmVkIG9uIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZDoKKyAgKiAgICAgICAgICAgICBMTF9BRENfQVdEX0NIQU5ORUx4eF9SRUdfSU5KIChkbyBub3QgdXNlIHBhcmFtZXRlcnMKKyAgKiAgICAgICAgICAgICBMTF9BRENfQVdEX0NIQU5ORUx4eF9SRUcgYW5kIExMX0FEQ19BV0RfQ0hBTk5FTHh4X0lOSikKKyAgKiAgICAgICAgICAgLSByZXNvbHV0aW9uOiByZXNvbHV0aW9uIGlzIGxpbWl0ZWQgdG8gOCBiaXRzOiBpZiBBREMgcmVzb2x1dGlvbiBpcworICAqICAgICAgICAgICAgIDEyIGJpdHMgdGhlIDQgTFNCIGFyZSBpZ25vcmVkLCBpZiBBREMgcmVzb2x1dGlvbiBpcyAxMCBiaXRzCisgICogICAgICAgICAgICAgdGhlIDIgTFNCIGFyZSBpZ25vcmVkLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBlaXRoZXIgZ3JvdXBzIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuCisgICogQHJtdG9sbCBUUjEgICAgICBIVDEgICAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RUaHJlc2hvbGRzXG4KKyAgKiAgICAgICAgIFRSMiAgICAgIEhUMiAgICAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRFRocmVzaG9sZHNcbgorICAqICAgICAgICAgVFIzICAgICAgSFQzICAgICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dEVGhyZXNob2xkc1xuCisgICogICAgICAgICBUUjEgICAgICBMVDEgICAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RUaHJlc2hvbGRzXG4KKyAgKiAgICAgICAgIFRSMiAgICAgIExUMiAgICAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRFRocmVzaG9sZHNcbgorICAqICAgICAgICAgVFIzICAgICAgTFQzICAgICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dEVGhyZXNob2xkcworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEFXRHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0QyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRDMKKyAgKiBAcGFyYW0gIEFXRFRocmVzaG9sZHNIaWdoTG93IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9USFJFU0hPTERfSElHSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfVEhSRVNIT0xEX0xPVworICAqIEBwYXJhbSAgQVdEVGhyZXNob2xkVmFsdWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRBbmFsb2dXRFRocmVzaG9sZHMoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IEFXRHksIHVpbnQzMl90IEFXRFRocmVzaG9sZHNIaWdoTG93LCB1aW50MzJfdCBBV0RUaHJlc2hvbGRWYWx1ZSkKK3sKKyAgLyogU2V0IGJpdHMgd2l0aCBjb250ZW50IG9mIHBhcmFtZXRlciAiQVdEVGhyZXNob2xkVmFsdWUiIHdpdGggYml0cyAgICAgICAgICovCisgIC8qIHBvc2l0aW9uIGluIHJlZ2lzdGVyIGFuZCByZWdpc3RlciBwb3NpdGlvbiBkZXBlbmRpbmcgb24gcGFyYW1ldGVycyAgICAgICAqLworICAvKiAiQVdEVGhyZXNob2xkc0hpZ2hMb3ciIGFuZCAiQVdEeSIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUGFyYW1ldGVycyAiQVdEeSIgYW5kICJBV0RUaHJlc2hvbGRWYWx1ZSIgYXJlIHVzZWQgd2l0aCBtYXNrcyBiZWNhdXNlICAgICovCisgIC8qIGNvbnRhaW5pbmcgb3RoZXIgYml0cyByZXNlcnZlZCBmb3Igb3RoZXIgcHVycG9zZS4gICAgICAgICAgICAgICAgICAgICAgICAqLworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoQURDeC0+VFIxLCBfX0FEQ19NQVNLX1NISUZUKEFXRHksIEFEQ19BV0RfVFJYX1JFR09GRlNFVF9NQVNLKSk7CisgIAorICBNT0RJRllfUkVHKCpwcmVnLAorICAgICAgICAgICAgIEFXRFRocmVzaG9sZHNIaWdoTG93LAorICAgICAgICAgICAgIEFXRFRocmVzaG9sZFZhbHVlIDw8IFBPU0lUSU9OX1ZBTChBV0RUaHJlc2hvbGRzSGlnaExvdykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZCB2YWx1ZSBvZiB0aHJlc2hvbGQgaGlnaCwKKyAgKiAgICAgICAgIHRocmVzaG9sZCBsb3cgb3IgcmF3IGRhdGEgd2l0aCBBREMgdGhyZXNob2xkcyBoaWdoIGFuZCBsb3cKKyAgKiAgICAgICAgIGNvbmNhdGVuYXRlZC4KKyAgKiBAbm90ZSAgIElmIHJhdyBkYXRhIHdpdGggQURDIHRocmVzaG9sZHMgaGlnaCBhbmQgbG93IGlzIHJldHJpZXZlZCwKKyAgKiAgICAgICAgIHRoZSBkYXRhIG9mIGVhY2ggdGhyZXNob2xkIGhpZ2ggb3IgbG93IGNhbiBiZSBpc29sYXRlZAorICAqICAgICAgICAgdXNpbmcgaGVscGVyIG1hY3JvOgorICAqICAgICAgICAgQHJlZiBfX0xMX0FEQ19BTkFMT0dXRF9USFJFU0hPTERTX0hJR0hfTE9XKCkuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIEFEQyByZXNvbHV0aW9uIGRpZmZlcmVudCBvZiAxMiBiaXRzLAorICAqICAgICAgICAgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgZGF0YSByZXF1aXJlIGEgc3BlY2lmaWMgc2hpZnQuCisgICogICAgICAgICBVc2UgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQU5BTE9HV0RfR0VUX1RIUkVTSE9MRF9SRVNPTFVUSU9OKCkuCisgICogQHJtdG9sbCBUUjEgICAgICBIVDEgICAgICAgICAgICBMTF9BRENfR2V0QW5hbG9nV0RUaHJlc2hvbGRzXG4KKyAgKiAgICAgICAgIFRSMiAgICAgIEhUMiAgICAgICAgICAgIExMX0FEQ19HZXRBbmFsb2dXRFRocmVzaG9sZHNcbgorICAqICAgICAgICAgVFIzICAgICAgSFQzICAgICAgICAgICAgTExfQURDX0dldEFuYWxvZ1dEVGhyZXNob2xkc1xuCisgICogICAgICAgICBUUjEgICAgICBMVDEgICAgICAgICAgICBMTF9BRENfR2V0QW5hbG9nV0RUaHJlc2hvbGRzXG4KKyAgKiAgICAgICAgIFRSMiAgICAgIExUMiAgICAgICAgICAgIExMX0FEQ19HZXRBbmFsb2dXRFRocmVzaG9sZHNcbgorICAqICAgICAgICAgVFIzICAgICAgTFQzICAgICAgICAgICAgTExfQURDX0dldEFuYWxvZ1dEVGhyZXNob2xkcworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEFXRHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0QyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRDMKKyAgKiBAcGFyYW0gIEFXRFRocmVzaG9sZHNIaWdoTG93IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9USFJFU0hPTERfSElHSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfVEhSRVNIT0xEX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfVEhSRVNIT0xEU19ISUdIX0xPVworICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldEFuYWxvZ1dEVGhyZXNob2xkcyhBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgQVdEeSwgdWludDMyX3QgQVdEVGhyZXNob2xkc0hpZ2hMb3cpCit7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVChBREN4LT5UUjEsIF9fQURDX01BU0tfU0hJRlQoQVdEeSwgQURDX0FXRF9UUlhfUkVHT0ZGU0VUX01BU0spKTsKKyAgCisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKCpwcmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVdEVGhyZXNob2xkc0hpZ2hMb3cgfCBBRENfVFIxX0xUMSkpCisgICAgICAgICAgICAgICAgICAgID4+IFBPU0lUSU9OX1ZBTChBV0RUaHJlc2hvbGRzSGlnaExvdykKKyAgICAgICAgICAgICAgICAgICApOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0FEQ19NdWx0aW1vZGUgQ29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiBtdWx0aW1vZGUKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgbXVsdGltb2RlIGNvbmZpZ3VyYXRpb24gdG8gb3BlcmF0ZSBpbiBpbmRlcGVuZGVudCBtb2RlCisgICogICAgICAgICBvciBtdWx0aW1vZGUgKGZvciBkZXZpY2VzIHdpdGggc2V2ZXJhbCBBREMgaW5zdGFuY2VzKS4KKyAgKiBAbm90ZSAgIElmIG11bHRpbW9kZSBjb25maWd1cmF0aW9uOiB0aGUgc2VsZWN0ZWQgQURDIGluc3RhbmNlIGlzCisgICogICAgICAgICBlaXRoZXIgbWFzdGVyIG9yIHNsYXZlIGRlcGVuZGluZyBvbiBoYXJkd2FyZS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQWxsIEFEQyBpbnN0YW5jZXMgb2YgdGhlIEFEQyBjb21tb24gZ3JvdXAgbXVzdCBiZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgY2hlY2sgY2FuIGJlIGRvbmUgd2l0aCBmdW5jdGlvbiBAcmVmIExMX0FEQ19Jc0VuYWJsZWQoKSBmb3IgZWFjaAorICAqICAgICAgICAgQURDIGluc3RhbmNlIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybworICAqICAgICAgICAgQHJlZiBfX0xMX0FEQ19JU19FTkFCTEVEX0FMTF9DT01NT05fSU5TVEFOQ0UoKS4KKyAgKiBAcm10b2xsIENDUiAgICAgIERVQUwgICAgICAgICAgIExMX0FEQ19TZXRNdWx0aW1vZGUKKyAgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEBwYXJhbSAgTXVsdGltb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX0lOREVQRU5ERU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX0RVQUxfUkVHX1NJTVVMVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9EVUFMX1JFR19JTlRFUkwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfRFVBTF9JTkpfU0lNVUxUCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX0RVQUxfSU5KX0FMVEVSTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9EVUFMX1JFR19TSU1fSU5KX1NJTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9EVUFMX1JFR19TSU1fSU5KX0FMVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9EVUFMX1JFR19JTlRfSU5KX1NJTQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldE11bHRpbW9kZShBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTiwgdWludDMyX3QgTXVsdGltb2RlKQoreworICBNT0RJRllfUkVHKEFEQ3h5X0NPTU1PTi0+Q0NSLCBBRENfQ0NSX0RVQUwsIE11bHRpbW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBtdWx0aW1vZGUgY29uZmlndXJhdGlvbiB0byBvcGVyYXRlIGluIGluZGVwZW5kZW50IG1vZGUKKyAgKiAgICAgICAgIG9yIG11bHRpbW9kZSAoZm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQyBpbnN0YW5jZXMpLgorICAqIEBub3RlICAgSWYgbXVsdGltb2RlIGNvbmZpZ3VyYXRpb246IHRoZSBzZWxlY3RlZCBBREMgaW5zdGFuY2UgaXMKKyAgKiAgICAgICAgIGVpdGhlciBtYXN0ZXIgb3Igc2xhdmUgZGVwZW5kaW5nIG9uIGhhcmR3YXJlLgorICAqICAgICAgICAgUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbC4KKyAgKiBAcm10b2xsIENDUiAgICAgIERVQUwgICAgICAgICAgIExMX0FEQ19HZXRNdWx0aW1vZGUKKyAgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfSU5ERVBFTkRFTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfRFVBTF9SRUdfU0lNVUxUCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX0RVQUxfUkVHX0lOVEVSTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9EVUFMX0lOSl9TSU1VTFQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfRFVBTF9JTkpfQUxURVJOCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX0RVQUxfUkVHX1NJTV9JTkpfU0lNCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX0RVQUxfUkVHX1NJTV9JTkpfQUxUCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX0RVQUxfUkVHX0lOVF9JTkpfU0lNCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldE11bHRpbW9kZShBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTikKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeHlfQ09NTU9OLT5DQ1IsIEFEQ19DQ1JfRFVBTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgbXVsdGltb2RlIGNvbnZlcnNpb24gZGF0YSB0cmFuc2Zlcjogbm8gdHJhbnNmZXIKKyAgKiAgICAgICAgIG9yIHRyYW5zZmVyIGJ5IERNQS4KKyAgKiBAbm90ZSAgIElmIEFEQyBtdWx0aW1vZGUgdHJhbnNmZXIgYnkgRE1BIGlzIG5vdCBzZWxlY3RlZDoKKyAgKiAgICAgICAgIGVhY2ggQURDIHVzZXMgaXRzIG93biBETUEgY2hhbm5lbCwgd2l0aCBpdHMgaW5kaXZpZHVhbAorICAqICAgICAgICAgRE1BIHRyYW5zZmVyIHNldHRpbmdzLgorICAqICAgICAgICAgSWYgQURDIG11bHRpbW9kZSB0cmFuc2ZlciBieSBETUEgaXMgc2VsZWN0ZWQ6CisgICogICAgICAgICBPbmUgRE1BIGNoYW5uZWwgaXMgdXNlZCBmb3IgYm90aCBBREMgKERNQSBvZiBBREMgbWFzdGVyKQorICAqICAgICAgICAgU3BlY2lmaWVzIHRoZSBETUEgcmVxdWVzdHMgbW9kZToKKyAgKiAgICAgICAgIC0gTGltaXRlZCBtb2RlIChPbmUgc2hvdCBtb2RlKTogRE1BIHRyYW5zZmVyIHJlcXVlc3RzIGFyZSBzdG9wcGVkCisgICogICAgICAgICAgIHdoZW4gbnVtYmVyIG9mIERNQSBkYXRhIHRyYW5zZmVycyAobnVtYmVyIG9mCisgICogICAgICAgICAgIEFEQyBjb252ZXJzaW9ucykgaXMgcmVhY2hlZC4KKyAgKiAgICAgICAgICAgVGhpcyBBREMgbW9kZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggRE1BIG1vZGUgbm9uLWNpcmN1bGFyLgorICAqICAgICAgICAgLSBVbmxpbWl0ZWQgbW9kZTogRE1BIHRyYW5zZmVyIHJlcXVlc3RzIGFyZSB1bmxpbWl0ZWQsCisgICogICAgICAgICAgIHdoYXRldmVyIG51bWJlciBvZiBETUEgZGF0YSB0cmFuc2ZlcnMgKG51bWJlciBvZgorICAqICAgICAgICAgICBBREMgY29udmVyc2lvbnMpLgorICAqICAgICAgICAgICBUaGlzIEFEQyBtb2RlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBETUEgbW9kZSBjaXJjdWxhci4KKyAgKiBAbm90ZSAgIElmIEFEQyBETUEgcmVxdWVzdHMgbW9kZSBpcyBzZXQgdG8gdW5saW1pdGVkIGFuZCBETUEgaXMgc2V0IHRvCisgICogICAgICAgICBtb2RlIG5vbi1jaXJjdWxhcjoKKyAgKiAgICAgICAgIHdoZW4gRE1BIHRyYW5zZmVycyBzaXplIHdpbGwgYmUgcmVhY2hlZCwgRE1BIHdpbGwgc3RvcCB0cmFuc2ZlcnMgb2YKKyAgKiAgICAgICAgIEFEQyBjb252ZXJzaW9ucyBkYXRhIEFEQyB3aWxsIHJhaXNlIGFuIG92ZXJydW4gZXJyb3IKKyAgKiAgICAgICAgIChvdmVycnVuIGZsYWcgYW5kIGludGVycnVwdGlvbiBpZiBlbmFibGVkKS4KKyAgKiBAbm90ZSAgIEhvdyB0byByZXRyaWV2ZSBtdWx0aW1vZGUgY29udmVyc2lvbiBkYXRhOgorICAqICAgICAgICAgV2hhdGV2ZXIgbXVsdGltb2RlIHRyYW5zZmVyIGJ5IERNQSBzZXR0aW5nOiB1c2luZyBmdW5jdGlvbgorICAqICAgICAgICAgQHJlZiBMTF9BRENfUkVHX1JlYWRNdWx0aUNvbnZlcnNpb25EYXRhMzIoKS4KKyAgKiAgICAgICAgIElmIEFEQyBtdWx0aW1vZGUgdHJhbnNmZXIgYnkgRE1BIGlzIHNlbGVjdGVkOiBjb252ZXJzaW9uIGRhdGEKKyAgKiAgICAgICAgIGlzIGEgcmF3IGRhdGEgd2l0aCBBREMgbWFzdGVyIGFuZCBzbGF2ZSBjb25jYXRlbmF0ZWQuCisgICogICAgICAgICBBIG1hY3JvIGlzIGF2YWlsYWJsZSB0byBnZXQgdGhlIGNvbnZlcnNpb24gZGF0YSBvZgorICAqICAgICAgICAgQURDIG1hc3RlciBvciBBREMgc2xhdmU6IHNlZSBoZWxwZXIgbWFjcm8KKyAgKiAgICAgICAgIEByZWYgX19MTF9BRENfTVVMVElfQ09OVl9EQVRBX01BU1RFUl9TTEFWRSgpLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFsbCBBREMgaW5zdGFuY2VzIG9mIHRoZSBBREMgY29tbW9uIGdyb3VwIG11c3QgYmUgZGlzYWJsZWQKKyAgKiAgICAgICAgIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIGdyb3VwIHJlZ3VsYXIuCisgICogQHJtdG9sbCBDQ1IgICAgICBNRE1BICAgICAgICAgICBMTF9BRENfU2V0TXVsdGlETUFUcmFuc2ZlclxuCisgICogICAgICAgICBDQ1IgICAgICBETUFDRkcgICAgICAgICBMTF9BRENfU2V0TXVsdGlETUFUcmFuc2ZlcgorICAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgICogQHBhcmFtICBNdWx0aURNQVRyYW5zZmVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1JFR19ETUFfRUFDSF9BREMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfUkVHX0RNQV9MSU1JVF9SRVMxMl8xMEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfUkVHX0RNQV9MSU1JVF9SRVM4XzZCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1JFR19ETUFfVU5MTVRfUkVTMTJfMTBCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1JFR19ETUFfVU5MTVRfUkVTOF82QgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldE11bHRpRE1BVHJhbnNmZXIoQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04sIHVpbnQzMl90IE11bHRpRE1BVHJhbnNmZXIpCit7CisgIE1PRElGWV9SRUcoQURDeHlfQ09NTU9OLT5DQ1IsIEFEQ19DQ1JfTURNQSB8IEFEQ19DQ1JfRE1BQ0ZHLCBNdWx0aURNQVRyYW5zZmVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIG11bHRpbW9kZSBjb252ZXJzaW9uIGRhdGEgdHJhbnNmZXI6IG5vIHRyYW5zZmVyCisgICogICAgICAgICBvciB0cmFuc2ZlciBieSBETUEuCisgICogQG5vdGUgICBJZiBBREMgbXVsdGltb2RlIHRyYW5zZmVyIGJ5IERNQSBpcyBub3Qgc2VsZWN0ZWQ6CisgICogICAgICAgICBlYWNoIEFEQyB1c2VzIGl0cyBvd24gRE1BIGNoYW5uZWwsIHdpdGggaXRzIGluZGl2aWR1YWwKKyAgKiAgICAgICAgIERNQSB0cmFuc2ZlciBzZXR0aW5ncy4KKyAgKiAgICAgICAgIElmIEFEQyBtdWx0aW1vZGUgdHJhbnNmZXIgYnkgRE1BIGlzIHNlbGVjdGVkOgorICAqICAgICAgICAgT25lIERNQSBjaGFubmVsIGlzIHVzZWQgZm9yIGJvdGggQURDIChETUEgb2YgQURDIG1hc3RlcikKKyAgKiAgICAgICAgIFNwZWNpZmllcyB0aGUgRE1BIHJlcXVlc3RzIG1vZGU6CisgICogICAgICAgICAtIExpbWl0ZWQgbW9kZSAoT25lIHNob3QgbW9kZSk6IERNQSB0cmFuc2ZlciByZXF1ZXN0cyBhcmUgc3RvcHBlZAorICAqICAgICAgICAgICB3aGVuIG51bWJlciBvZiBETUEgZGF0YSB0cmFuc2ZlcnMgKG51bWJlciBvZgorICAqICAgICAgICAgICBBREMgY29udmVyc2lvbnMpIGlzIHJlYWNoZWQuCisgICogICAgICAgICAgIFRoaXMgQURDIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIERNQSBtb2RlIG5vbi1jaXJjdWxhci4KKyAgKiAgICAgICAgIC0gVW5saW1pdGVkIG1vZGU6IERNQSB0cmFuc2ZlciByZXF1ZXN0cyBhcmUgdW5saW1pdGVkLAorICAqICAgICAgICAgICB3aGF0ZXZlciBudW1iZXIgb2YgRE1BIGRhdGEgdHJhbnNmZXJzIChudW1iZXIgb2YKKyAgKiAgICAgICAgICAgQURDIGNvbnZlcnNpb25zKS4KKyAgKiAgICAgICAgICAgVGhpcyBBREMgbW9kZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggRE1BIG1vZGUgY2lyY3VsYXIuCisgICogQG5vdGUgICBJZiBBREMgRE1BIHJlcXVlc3RzIG1vZGUgaXMgc2V0IHRvIHVubGltaXRlZCBhbmQgRE1BIGlzIHNldCB0bworICAqICAgICAgICAgbW9kZSBub24tY2lyY3VsYXI6CisgICogICAgICAgICB3aGVuIERNQSB0cmFuc2ZlcnMgc2l6ZSB3aWxsIGJlIHJlYWNoZWQsIERNQSB3aWxsIHN0b3AgdHJhbnNmZXJzIG9mCisgICogICAgICAgICBBREMgY29udmVyc2lvbnMgZGF0YSBBREMgd2lsbCByYWlzZSBhbiBvdmVycnVuIGVycm9yCisgICogICAgICAgICAob3ZlcnJ1biBmbGFnIGFuZCBpbnRlcnJ1cHRpb24gaWYgZW5hYmxlZCkuCisgICogQG5vdGUgICBIb3cgdG8gcmV0cmlldmUgbXVsdGltb2RlIGNvbnZlcnNpb24gZGF0YToKKyAgKiAgICAgICAgIFdoYXRldmVyIG11bHRpbW9kZSB0cmFuc2ZlciBieSBETUEgc2V0dGluZzogdXNpbmcgZnVuY3Rpb24KKyAgKiAgICAgICAgIEByZWYgTExfQURDX1JFR19SZWFkTXVsdGlDb252ZXJzaW9uRGF0YTMyKCkuCisgICogICAgICAgICBJZiBBREMgbXVsdGltb2RlIHRyYW5zZmVyIGJ5IERNQSBpcyBzZWxlY3RlZDogY29udmVyc2lvbiBkYXRhCisgICogICAgICAgICBpcyBhIHJhdyBkYXRhIHdpdGggQURDIG1hc3RlciBhbmQgc2xhdmUgY29uY2F0ZW5hdGVkLgorICAqICAgICAgICAgQSBtYWNybyBpcyBhdmFpbGFibGUgdG8gZ2V0IHRoZSBjb252ZXJzaW9uIGRhdGEgb2YKKyAgKiAgICAgICAgIEFEQyBtYXN0ZXIgb3IgQURDIHNsYXZlOiBzZWUgaGVscGVyIG1hY3JvCisgICogICAgICAgICBAcmVmIF9fTExfQURDX01VTFRJX0NPTlZfREFUQV9NQVNURVJfU0xBVkUoKS4KKyAgKiBAcm10b2xsIENDUiAgICAgIE1ETUEgICAgICAgICAgIExMX0FEQ19HZXRNdWx0aURNQVRyYW5zZmVyXG4KKyAgKiAgICAgICAgIENDUiAgICAgIERNQUNGRyAgICAgICAgIExMX0FEQ19HZXRNdWx0aURNQVRyYW5zZmVyCisgICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1JFR19ETUFfRUFDSF9BREMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfUkVHX0RNQV9MSU1JVF9SRVMxMl8xMEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfUkVHX0RNQV9MSU1JVF9SRVM4XzZCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1JFR19ETUFfVU5MTVRfUkVTMTJfMTBCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1JFR19ETUFfVU5MTVRfUkVTOF82QgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRNdWx0aURNQVRyYW5zZmVyKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4eV9DT01NT04tPkNDUiwgQURDX0NDUl9NRE1BIHwgQURDX0NDUl9ETUFDRkcpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIG11bHRpbW9kZSBkZWxheSBiZXR3ZWVuIDIgc2FtcGxpbmcgcGhhc2VzLgorICAqIEBub3RlICAgVGhlIHNhbXBsaW5nIGRlbGF5IHJhbmdlIGRlcGVuZHMgb24gQURDIHJlc29sdXRpb246CisgICogICAgICAgICAtIEFEQyByZXNvbHV0aW9uIDEyIGJpdHMgY2FuIGhhdmUgbWF4aW11bSBkZWxheSBvZiAxMiBjeWNsZXMuCisgICogICAgICAgICAtIEFEQyByZXNvbHV0aW9uIDEwIGJpdHMgY2FuIGhhdmUgbWF4aW11bSBkZWxheSBvZiAxMCBjeWNsZXMuCisgICogICAgICAgICAtIEFEQyByZXNvbHV0aW9uICA4IGJpdHMgY2FuIGhhdmUgbWF4aW11bSBkZWxheSBvZiAgOCBjeWNsZXMuCisgICogICAgICAgICAtIEFEQyByZXNvbHV0aW9uICA2IGJpdHMgY2FuIGhhdmUgbWF4aW11bSBkZWxheSBvZiAgNiBjeWNsZXMuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQWxsIEFEQyBpbnN0YW5jZXMgb2YgdGhlIEFEQyBjb21tb24gZ3JvdXAgbXVzdCBiZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgY2hlY2sgY2FuIGJlIGRvbmUgd2l0aCBmdW5jdGlvbiBAcmVmIExMX0FEQ19Jc0VuYWJsZWQoKSBmb3IgZWFjaAorICAqICAgICAgICAgQURDIGluc3RhbmNlIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybyBoZWxwZXIgbWFjcm8KKyAgKiAgICAgICAgIEByZWYgX19MTF9BRENfSVNfRU5BQkxFRF9BTExfQ09NTU9OX0lOU1RBTkNFKCkuCisgICogQHJtdG9sbCBDQ1IgICAgICBERUxBWSAgICAgICAgICBMTF9BRENfU2V0TXVsdGlUd29TYW1wbGluZ0RlbGF5CisgICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAgKiBAcGFyYW0gIE11bHRpVHdvU2FtcGxpbmdEZWxheSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfMUNZQ0xFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV8yQ1lDTEVTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV8zQ1lDTEVTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV80Q1lDTEVTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV81Q1lDTEVTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV82Q1lDTEVTICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzdDWUNMRVMgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfOENZQ0xFUyAgKDIpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV85Q1lDTEVTICAoMikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzEwQ1lDTEVTICgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfMTFDWUNMRVMgKDMpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV8xMkNZQ0xFUyAoMykKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIFBhcmFtZXRlciBhdmFpbGFibGUgb25seSBpZiBBREMgcmVzb2x1dGlvbiBpcyAxMiwgMTAgb3IgOCBiaXRzLlxuCisgICogICAgICAgICAoMikgUGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IGlmIEFEQyByZXNvbHV0aW9uIGlzIDEyIG9yIDEwIGJpdHMuXG4KKyAgKiAgICAgICAgICgzKSBQYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgaWYgQURDIHJlc29sdXRpb24gaXMgMTIgYml0cy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRNdWx0aVR3b1NhbXBsaW5nRGVsYXkoQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04sIHVpbnQzMl90IE11bHRpVHdvU2FtcGxpbmdEZWxheSkKK3sKKyAgTU9ESUZZX1JFRyhBREN4eV9DT01NT04tPkNDUiwgQURDX0NDUl9ERUxBWSwgTXVsdGlUd29TYW1wbGluZ0RlbGF5KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIG11bHRpbW9kZSBkZWxheSBiZXR3ZWVuIDIgc2FtcGxpbmcgcGhhc2VzLgorICAqIEBybXRvbGwgQ0NSICAgICAgREVMQVkgICAgICAgICAgTExfQURDX0dldE11bHRpVHdvU2FtcGxpbmdEZWxheQorICAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfMUNZQ0xFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV8yQ1lDTEVTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV8zQ1lDTEVTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV80Q1lDTEVTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV81Q1lDTEVTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV82Q1lDTEVTICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzdDWUNMRVMgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfOENZQ0xFUyAgKDIpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV85Q1lDTEVTICAoMikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzEwQ1lDTEVTICgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfMTFDWUNMRVMgKDMpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV8xMkNZQ0xFUyAoMykKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIFBhcmFtZXRlciBhdmFpbGFibGUgb25seSBpZiBBREMgcmVzb2x1dGlvbiBpcyAxMiwgMTAgb3IgOCBiaXRzLlxuCisgICogICAgICAgICAoMikgUGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IGlmIEFEQyByZXNvbHV0aW9uIGlzIDEyIG9yIDEwIGJpdHMuXG4KKyAgKiAgICAgICAgICgzKSBQYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgaWYgQURDIHJlc29sdXRpb24gaXMgMTIgYml0cy4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0TXVsdGlUd29TYW1wbGluZ0RlbGF5KEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4eV9DT01NT04tPkNDUiwgQURDX0NDUl9ERUxBWSkpOworfQorI2VuZGlmIC8qIEFEQ19NVUxUSU1PREVfU1VQUE9SVCAqLworCisvKioKKyAgKiBAfQorICAqLworLyoqIEBkZWZncm91cCBBRENfTExfRUZfT3BlcmF0aW9uX0FEQ19JbnN0YW5jZSBPcGVyYXRpb24gb24gQURDIGhpZXJhcmNoaWNhbCBzY29wZTogQURDIGluc3RhbmNlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQURDIGluc3RhbmNlIGludGVybmFsIHZvbHRhZ2UgcmVndWxhdG9yLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgYWZ0ZXIgQURDIGludGVybmFsIHZvbHRhZ2UgcmVndWxhdG9yIGVuYWJsZSwKKyAgKiAgICAgICAgIGEgZGVsYXkgZm9yIEFEQyBpbnRlcm5hbCB2b2x0YWdlIHJlZ3VsYXRvciBzdGFiaWxpemF0aW9uCisgICogICAgICAgICBpcyByZXF1aXJlZCBiZWZvcmUgcGVyZm9ybWluZyBhIEFEQyBjYWxpYnJhdGlvbiBvciBBREMgZW5hYmxlLgorICAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgcGFyYW1ldGVyIHRBRENWUkVHX1NUVVAuCisgICogICAgICAgICBSZWZlciB0byBsaXRlcmFsIEByZWYgTExfQURDX0RFTEFZX0lOVEVSTkFMX1JFR1VMX1NUQUJfVVMuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgQURDIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IgICAgICAgQURWUkVHRU4gICAgICAgTExfQURDX0VuYWJsZUludGVybmFsUmVndWxhdG9yCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0VuYWJsZUludGVybmFsUmVndWxhdG9yKEFEQ19UeXBlRGVmICpBREN4KQoreworICAvKiAxLiBTZXQgdGhlIGludGVybWVkaWF0ZSBzdGF0ZSBiZWZvcmUgbW92aW5nIHRoZSBBREMgdm9sdGFnZSByZWd1bGF0b3IgICAgKi8KKyAgLyogICAgdG8gc3RhdGUgZW5hYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIENMRUFSX0JJVChBREN4LT5DUiwgKEFEQ19DUl9BRFZSRUdFTl8xIHwgQURDX0NSX0FEVlJFR0VOXzApKTsKKyAgLyogMi4gU2V0IHRoZSBmaW5hbCBzdGF0ZSBvZiBBREMgdm9sdGFnZSByZWd1bGF0b3IgZW5hYmxlICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIChBRFZSRUdFTiBiaXRzIHNldCB0byAweDAxKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBOb3RlOiBXcml0ZSByZWdpc3RlciB3aXRoIHNvbWUgYWRkaXRpb25hbCBiaXRzIGZvcmNlZCB0byBzdGF0ZSByZXNldCAgICAgKi8KKyAgLyogICAgICAgaW5zdGVhZCBvZiBtb2RpZnlpbmcgb25seSB0aGUgc2VsZWN0ZWQgYml0IGZvciB0aGlzIGZ1bmN0aW9uLCAgICAgICovCisgIC8qICAgICAgIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBiaXRzIHdpdGggSFcgcHJvcGVydHkgInJzIi4gICAgICAgICAgICAgICAgICAqLworICBNT0RJRllfUkVHKEFEQ3gtPkNSLAorICAgICAgICAgICAgIEFEQ19DUl9CSVRTX1BST1BFUlRZX1JTLAorICAgICAgICAgICAgIEFEQ19DUl9BRFZSRUdFTl8wKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEFEQyBpbnRlcm5hbCB2b2x0YWdlIHJlZ3VsYXRvci4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBBREMgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUiAgICAgICBBRFZSRUdFTiAgICAgICBMTF9BRENfRGlzYWJsZUludGVybmFsUmVndWxhdG9yCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJbnRlcm5hbFJlZ3VsYXRvcihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgQ0xFQVJfQklUKEFEQ3gtPkNSLCAoQURDX0NSX0FEVlJFR0VOIHwgQURDX0NSX0JJVFNfUFJPUEVSVFlfUlMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHNlbGVjdGVkIEFEQyBpbnN0YW5jZSBpbnRlcm5hbCB2b2x0YWdlIHJlZ3VsYXRvciBzdGF0ZS4KKyAgKiBAcm10b2xsIENSICAgICAgIEFEVlJFR0VOICAgICAgIExMX0FEQ19Jc0ludGVybmFsUmVndWxhdG9yRW5hYmxlZAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIDA6IGludGVybmFsIHJlZ3VsYXRvciBpcyBkaXNhYmxlZCwgMTogaW50ZXJuYWwgcmVndWxhdG9yIGlzIGVuYWJsZWQuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzSW50ZXJuYWxSZWd1bGF0b3JFbmFibGVkKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3gtPkNSLCAoQURDX0NSX0FEVlJFR0VOXzEgfCBBRENfQ1JfQURWUkVHRU5fMCkpID09IChBRENfQ1JfQURWUkVHRU5fMCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgc2VsZWN0ZWQgQURDIGluc3RhbmNlLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgYWZ0ZXIgQURDIGVuYWJsZSwgYSBkZWxheSBmb3IgCisgICogICAgICAgICBBREMgaW50ZXJuYWwgYW5hbG9nIHN0YWJpbGl6YXRpb24gaXMgcmVxdWlyZWQgYmVmb3JlIHBlcmZvcm1pbmcgYQorICAqICAgICAgICAgQURDIGNvbnZlcnNpb24gc3RhcnQuCisgICogICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCBwYXJhbWV0ZXIgdFNUQUIuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBmbGFnIExMX0FEQ19GTEFHX0FEUkRZIGlzIHJhaXNlZCB3aGVuIHRoZSBBREMKKyAgKiAgICAgICAgIGlzIGVuYWJsZWQgYW5kIHdoZW4gY29udmVyc2lvbiBjbG9jayBpcyBhY3RpdmUuCisgICogICAgICAgICAobm90IG9ubHkgY29yZSBjbG9jazogdGhpcyBBREMgaGFzIGEgZHVhbCBjbG9jayBkb21haW4pCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgQURDIGRpc2FibGVkIGFuZCBBREMgaW50ZXJuYWwgdm9sdGFnZSByZWd1bGF0b3IgZW5hYmxlZC4KKyAgKiBAcm10b2xsIENSICAgICAgIEFERU4gICAgICAgICAgIExMX0FEQ19FbmFibGUKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlKEFEQ19UeXBlRGVmICpBREN4KQoreworICAvKiBOb3RlOiBXcml0ZSByZWdpc3RlciB3aXRoIHNvbWUgYWRkaXRpb25hbCBiaXRzIGZvcmNlZCB0byBzdGF0ZSByZXNldCAgICAgKi8KKyAgLyogICAgICAgaW5zdGVhZCBvZiBtb2RpZnlpbmcgb25seSB0aGUgc2VsZWN0ZWQgYml0IGZvciB0aGlzIGZ1bmN0aW9uLCAgICAgICovCisgIC8qICAgICAgIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBiaXRzIHdpdGggSFcgcHJvcGVydHkgInJzIi4gICAgICAgICAgICAgICAgICAqLworICBNT0RJRllfUkVHKEFEQ3gtPkNSLAorICAgICAgICAgICAgIEFEQ19DUl9CSVRTX1BST1BFUlRZX1JTLAorICAgICAgICAgICAgIEFEQ19DUl9BREVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBzZWxlY3RlZCBBREMgaW5zdGFuY2UuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgbm90IGRpc2FibGVkLiBNdXN0IGJlIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBlaXRoZXIgZ3JvdXBzIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuCisgICogQHJtdG9sbCBDUiAgICAgICBBRERJUyAgICAgICAgICBMTF9BRENfRGlzYWJsZQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19EaXNhYmxlKEFEQ19UeXBlRGVmICpBREN4KQoreworICAvKiBOb3RlOiBXcml0ZSByZWdpc3RlciB3aXRoIHNvbWUgYWRkaXRpb25hbCBiaXRzIGZvcmNlZCB0byBzdGF0ZSByZXNldCAgICAgKi8KKyAgLyogICAgICAgaW5zdGVhZCBvZiBtb2RpZnlpbmcgb25seSB0aGUgc2VsZWN0ZWQgYml0IGZvciB0aGlzIGZ1bmN0aW9uLCAgICAgICovCisgIC8qICAgICAgIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBiaXRzIHdpdGggSFcgcHJvcGVydHkgInJzIi4gICAgICAgICAgICAgICAgICAqLworICBNT0RJRllfUkVHKEFEQ3gtPkNSLAorICAgICAgICAgICAgIEFEQ19DUl9CSVRTX1BST1BFUlRZX1JTLAorICAgICAgICAgICAgIEFEQ19DUl9BRERJUyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBzZWxlY3RlZCBBREMgaW5zdGFuY2UgZW5hYmxlIHN0YXRlLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgZmxhZyBMTF9BRENfRkxBR19BRFJEWSBpcyByYWlzZWQgd2hlbiB0aGUgQURDCisgICogICAgICAgICBpcyBlbmFibGVkIGFuZCB3aGVuIGNvbnZlcnNpb24gY2xvY2sgaXMgYWN0aXZlLgorICAqICAgICAgICAgKG5vdCBvbmx5IGNvcmUgY2xvY2s6IHRoaXMgQURDIGhhcyBhIGR1YWwgY2xvY2sgZG9tYWluKQorICAqIEBybXRvbGwgQ1IgICAgICAgQURFTiAgICAgICAgICAgTExfQURDX0lzRW5hYmxlZAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIDA6IEFEQyBpcyBkaXNhYmxlZCwgMTogQURDIGlzIGVuYWJsZWQuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChBREN4LT5DUiwgQURDX0NSX0FERU4pID09IChBRENfQ1JfQURFTikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgc2VsZWN0ZWQgQURDIGluc3RhbmNlIGRpc2FibGUgc3RhdGUuCisgICogQHJtdG9sbCBDUiAgICAgICBBRERJUyAgICAgICAgICBMTF9BRENfSXNEaXNhYmxlT25nb2luZworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIDA6IG5vIEFEQyBkaXNhYmxlIGNvbW1hbmQgb24gZ29pbmcuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRGlzYWJsZU9uZ29pbmcoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoQURDeC0+Q1IsIEFEQ19DUl9BRERJUykgPT0gKEFEQ19DUl9BRERJUykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IEFEQyBjYWxpYnJhdGlvbiBpbiB0aGUgbW9kZSBzaW5nbGUtZW5kZWQKKyAgKiAgICAgICAgIG9yIGRpZmZlcmVudGlhbCAoZm9yIGRldmljZXMgd2l0aCBkaWZmZXJlbnRpYWwgbW9kZSBhdmFpbGFibGUpLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgYSBtaW5pbXVtIG51bWJlciBvZiBBREMgY2xvY2sgY3ljbGVzCisgICogICAgICAgICBhcmUgcmVxdWlyZWQgYmV0d2VlbiBBREMgZW5kIG9mIGNhbGlicmF0aW9uIGFuZCBBREMgZW5hYmxlLgorICAqICAgICAgICAgUmVmZXIgdG8gbGl0ZXJhbCBAcmVmIExMX0FEQ19ERUxBWV9DQUxJQl9FTkFCTEVfQURDX0NZQ0xFUy4KKyAgKiBAbm90ZSAgIEZvciBkZXZpY2VzIHdpdGggZGlmZmVyZW50aWFsIG1vZGUgYXZhaWxhYmxlOgorICAqICAgICAgICAgQ2FsaWJyYXRpb24gb2Ygb2Zmc2V0IGlzIHNwZWNpZmljIHRvIGVhY2ggb2YKKyAgKiAgICAgICAgIHNpbmdsZS1lbmRlZCBhbmQgZGlmZmVyZW50aWFsIG1vZGVzCisgICogICAgICAgICAoY2FsaWJyYXRpb24gcnVuIG11c3QgYmUgcGVyZm9ybWVkIGZvciBlYWNoIG9mIHRoZXNlCisgICogICAgICAgICBkaWZmZXJlbnRpYWwgbW9kZXMsIGlmIHVzZWQgYWZ0ZXJ3YXJkcyBhbmQgaWYgdGhlIGFwcGxpY2F0aW9uCisgICogICAgICAgICByZXF1aXJlcyB0aGVpciBjYWxpYnJhdGlvbikuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgQURDIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IgICAgICAgQURDQUwgICAgICAgICAgTExfQURDX1N0YXJ0Q2FsaWJyYXRpb25cbgorICAqICAgICAgICAgQ1IgICAgICAgQURDQUxESUYgICAgICAgTExfQURDX1N0YXJ0Q2FsaWJyYXRpb24KKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBTaW5nbGVEaWZmIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NJTkdMRV9FTkRFRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19ESUZGRVJFTlRJQUxfRU5ERUQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TdGFydENhbGlicmF0aW9uKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBTaW5nbGVEaWZmKQoreworICAvKiBOb3RlOiBXcml0ZSByZWdpc3RlciB3aXRoIHNvbWUgYWRkaXRpb25hbCBiaXRzIGZvcmNlZCB0byBzdGF0ZSByZXNldCAgICAgKi8KKyAgLyogICAgICAgaW5zdGVhZCBvZiBtb2RpZnlpbmcgb25seSB0aGUgc2VsZWN0ZWQgYml0IGZvciB0aGlzIGZ1bmN0aW9uLCAgICAgICovCisgIC8qICAgICAgIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBiaXRzIHdpdGggSFcgcHJvcGVydHkgInJzIi4gICAgICAgICAgICAgICAgICAqLworICBNT0RJRllfUkVHKEFEQ3gtPkNSLAorICAgICAgICAgICAgIEFEQ19DUl9BRENBTERJRiB8IEFEQ19DUl9CSVRTX1BST1BFUlRZX1JTLAorICAgICAgICAgICAgIEFEQ19DUl9BRENBTCB8IChTaW5nbGVEaWZmICYgQURDX1NJTkdMRURJRkZfQ0FMSUJfU1RBUlRfTUFTSykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgY2FsaWJyYXRpb24gc3RhdGUuCisgICogQHJtdG9sbCBDUiAgICAgICBBRENBTCAgICAgICAgICBMTF9BRENfSXNDYWxpYnJhdGlvbk9uR29pbmcKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCAwOiBjYWxpYnJhdGlvbiBjb21wbGV0ZSwgMTogY2FsaWJyYXRpb24gaW4gcHJvZ3Jlc3MuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzQ2FsaWJyYXRpb25PbkdvaW5nKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3gtPkNSLCBBRENfQ1JfQURDQUwpID09IChBRENfQ1JfQURDQUwpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUZfT3BlcmF0aW9uX0FEQ19Hcm91cF9SZWd1bGFyIE9wZXJhdGlvbiBvbiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiBncm91cCByZWd1bGFyCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTdGFydCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgdGhpcyBmdW5jdGlvbiBpcyByZWxldmFudCBmb3IgYm90aCAKKyAgKiAgICAgICAgIGludGVybmFsIHRyaWdnZXIgKFNXIHN0YXJ0KSBhbmQgZXh0ZXJuYWwgdHJpZ2dlcjoKKyAgKiAgICAgICAgIC0gSWYgQURDIHRyaWdnZXIgaGFzIGJlZW4gc2V0IHRvIHNvZnR3YXJlIHN0YXJ0LCBBREMgY29udmVyc2lvbgorICAqICAgICAgICAgICBzdGFydHMgaW1tZWRpYXRlbHkuCisgICogICAgICAgICAtIElmIEFEQyB0cmlnZ2VyIGhhcyBiZWVuIHNldCB0byBleHRlcm5hbCB0cmlnZ2VyLCBBREMgY29udmVyc2lvbgorICAqICAgICAgICAgICB3aWxsIHN0YXJ0IGF0IG5leHQgdHJpZ2dlciBldmVudCAob24gdGhlIHNlbGVjdGVkIHRyaWdnZXIgZWRnZSkKKyAgKiAgICAgICAgICAgZm9sbG93aW5nIHRoZSBBREMgc3RhcnQgY29udmVyc2lvbiBjb21tYW5kLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIGdyb3VwIHJlZ3VsYXIsCisgICogICAgICAgICB3aXRob3V0IGNvbnZlcnNpb24gc3RvcCBjb21tYW5kIG9uIGdvaW5nIG9uIGdyb3VwIHJlZ3VsYXIsCisgICogICAgICAgICB3aXRob3V0IEFEQyBkaXNhYmxlIGNvbW1hbmQgb24gZ29pbmcuCisgICogQHJtdG9sbCBDUiAgICAgICBBRFNUQVJUICAgICAgICBMTF9BRENfUkVHX1N0YXJ0Q29udmVyc2lvbgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19SRUdfU3RhcnRDb252ZXJzaW9uKEFEQ19UeXBlRGVmICpBREN4KQoreworICAvKiBOb3RlOiBXcml0ZSByZWdpc3RlciB3aXRoIHNvbWUgYWRkaXRpb25hbCBiaXRzIGZvcmNlZCB0byBzdGF0ZSByZXNldCAgICAgKi8KKyAgLyogICAgICAgaW5zdGVhZCBvZiBtb2RpZnlpbmcgb25seSB0aGUgc2VsZWN0ZWQgYml0IGZvciB0aGlzIGZ1bmN0aW9uLCAgICAgICovCisgIC8qICAgICAgIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBiaXRzIHdpdGggSFcgcHJvcGVydHkgInJzIi4gICAgICAgICAgICAgICAgICAqLworICBNT0RJRllfUkVHKEFEQ3gtPkNSLAorICAgICAgICAgICAgIEFEQ19DUl9CSVRTX1BST1BFUlRZX1JTLAorICAgICAgICAgICAgIEFEQ19DUl9BRFNUQVJUKTsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24uCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZW5hYmxlZCB3aXRoIGNvbnZlcnNpb24gb24gZ29pbmcgb24gZ3JvdXAgcmVndWxhciwKKyAgKiAgICAgICAgIHdpdGhvdXQgQURDIGRpc2FibGUgY29tbWFuZCBvbiBnb2luZy4KKyAgKiBAcm10b2xsIENSICAgICAgIEFEU1RQICAgICAgICAgIExMX0FEQ19SRUdfU3RvcENvbnZlcnNpb24KKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1N0b3BDb252ZXJzaW9uKEFEQ19UeXBlRGVmICpBREN4KQoreworICAvKiBOb3RlOiBXcml0ZSByZWdpc3RlciB3aXRoIHNvbWUgYWRkaXRpb25hbCBiaXRzIGZvcmNlZCB0byBzdGF0ZSByZXNldCAgICAgKi8KKyAgLyogICAgICAgaW5zdGVhZCBvZiBtb2RpZnlpbmcgb25seSB0aGUgc2VsZWN0ZWQgYml0IGZvciB0aGlzIGZ1bmN0aW9uLCAgICAgICovCisgIC8qICAgICAgIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBiaXRzIHdpdGggSFcgcHJvcGVydHkgInJzIi4gICAgICAgICAgICAgICAgICAqLworICBNT0RJRllfUkVHKEFEQ3gtPkNSLAorICAgICAgICAgICAgIEFEQ19DUl9CSVRTX1BST1BFUlRZX1JTLAorICAgICAgICAgICAgIEFEQ19DUl9BRFNUUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gc3RhdGUuCisgICogQHJtdG9sbCBDUiAgICAgICBBRFNUQVJUICAgICAgICBMTF9BRENfUkVHX0lzQ29udmVyc2lvbk9uZ29pbmcKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCAwOiBubyBjb252ZXJzaW9uIGlzIG9uIGdvaW5nIG9uIEFEQyBncm91cCByZWd1bGFyLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChBREN4LT5DUiwgQURDX0NSX0FEU1RBUlQpID09IChBRENfQ1JfQURTVEFSVCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBjb21tYW5kIG9mIGNvbnZlcnNpb24gc3RvcCBzdGF0ZQorICAqIEBybXRvbGwgQ1IgICAgICAgQURTVFAgICAgICAgICAgTExfQURDX1JFR19Jc1N0b3BDb252ZXJzaW9uT25nb2luZworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIDA6IG5vIGNvbW1hbmQgb2YgY29udmVyc2lvbiBzdG9wIGlzIG9uIGdvaW5nIG9uIEFEQyBncm91cCByZWd1bGFyLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfSXNTdG9wQ29udmVyc2lvbk9uZ29pbmcoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoQURDeC0+Q1IsIEFEQ19DUl9BRFNUUCkgPT0gKEFEQ19DUl9BRFNUUCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIGRhdGEsIHJhbmdlIGZpdCBmb3IKKyAgKiAgICAgICAgIGFsbCBBREMgY29uZmlndXJhdGlvbnM6IGFsbCBBREMgcmVzb2x1dGlvbnMgYW5kCisgICogICAgICAgICBhbGwgb3ZlcnNhbXBsaW5nIGluY3JlYXNlZCBkYXRhIHdpZHRoIChmb3IgZGV2aWNlcworICAqICAgICAgICAgd2l0aCBmZWF0dXJlIG92ZXJzYW1wbGluZykuCisgICogQHJtdG9sbCBEUiAgICAgICBSREFUQSAgICAgICAgICBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTMyCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMDAwMDAwIGFuZCBNYXhfRGF0YT0weEZGRkZGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGEzMihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+RFIsIEFEQ19EUl9SREFUQSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIGRhdGEsIHJhbmdlIGZpdCBmb3IKKyAgKiAgICAgICAgIEFEQyByZXNvbHV0aW9uIDEyIGJpdHMuCisgICogQG5vdGUgICBGb3IgZGV2aWNlcyB3aXRoIGZlYXR1cmUgb3ZlcnNhbXBsaW5nOiBPdmVyc2FtcGxpbmcKKyAgKiAgICAgICAgIGNhbiBpbmNyZWFzZSBkYXRhIHdpZHRoLCBmdW5jdGlvbiBmb3IgZXh0ZW5kZWQgcmFuZ2UKKyAgKiAgICAgICAgIG1heSBiZSBuZWVkZWQ6IEByZWYgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGEzMi4KKyAgKiBAcm10b2xsIERSICAgICAgIFJEQVRBICAgICAgICAgIExMX0FEQ19SRUdfUmVhZENvbnZlcnNpb25EYXRhMTIKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQxNl90IExMX0FEQ19SRUdfUmVhZENvbnZlcnNpb25EYXRhMTIoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAodWludDE2X3QpKFJFQURfQklUKEFEQ3gtPkRSLCBBRENfRFJfUkRBVEEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhLCByYW5nZSBmaXQgZm9yCisgICogICAgICAgICBBREMgcmVzb2x1dGlvbiAxMCBiaXRzLgorICAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBmZWF0dXJlIG92ZXJzYW1wbGluZzogT3ZlcnNhbXBsaW5nCisgICogICAgICAgICBjYW4gaW5jcmVhc2UgZGF0YSB3aWR0aCwgZnVuY3Rpb24gZm9yIGV4dGVuZGVkIHJhbmdlCisgICogICAgICAgICBtYXkgYmUgbmVlZGVkOiBAcmVmIExMX0FEQ19SRUdfUmVhZENvbnZlcnNpb25EYXRhMzIuCisgICogQHJtdG9sbCBEUiAgICAgICBSREFUQSAgICAgICAgICBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTEwCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHgzRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MTZfdCBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTEwKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQxNl90KShSRUFEX0JJVChBREN4LT5EUiwgQURDX0RSX1JEQVRBKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gZGF0YSwgcmFuZ2UgZml0IGZvcgorICAqICAgICAgICAgQURDIHJlc29sdXRpb24gOCBiaXRzLgorICAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBmZWF0dXJlIG92ZXJzYW1wbGluZzogT3ZlcnNhbXBsaW5nCisgICogICAgICAgICBjYW4gaW5jcmVhc2UgZGF0YSB3aWR0aCwgZnVuY3Rpb24gZm9yIGV4dGVuZGVkIHJhbmdlCisgICogICAgICAgICBtYXkgYmUgbmVlZGVkOiBAcmVmIExMX0FEQ19SRUdfUmVhZENvbnZlcnNpb25EYXRhMzIuCisgICogQHJtdG9sbCBEUiAgICAgICBSREFUQSAgICAgICAgICBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTgKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50OF90IExMX0FEQ19SRUdfUmVhZENvbnZlcnNpb25EYXRhOChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50OF90KShSRUFEX0JJVChBREN4LT5EUiwgQURDX0RSX1JEQVRBKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gZGF0YSwgcmFuZ2UgZml0IGZvcgorICAqICAgICAgICAgQURDIHJlc29sdXRpb24gNiBiaXRzLgorICAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBmZWF0dXJlIG92ZXJzYW1wbGluZzogT3ZlcnNhbXBsaW5nCisgICogICAgICAgICBjYW4gaW5jcmVhc2UgZGF0YSB3aWR0aCwgZnVuY3Rpb24gZm9yIGV4dGVuZGVkIHJhbmdlCisgICogICAgICAgICBtYXkgYmUgbmVlZGVkOiBAcmVmIExMX0FEQ19SRUdfUmVhZENvbnZlcnNpb25EYXRhMzIuCisgICogQHJtdG9sbCBEUiAgICAgICBSREFUQSAgICAgICAgICBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTYKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4M0YKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50OF90IExMX0FEQ19SRUdfUmVhZENvbnZlcnNpb25EYXRhNihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50OF90KShSRUFEX0JJVChBREN4LT5EUiwgQURDX0RSX1JEQVRBKSk7Cit9CisKKyNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBtdWx0aW1vZGUgY29udmVyc2lvbiBkYXRhIG9mIEFEQyBtYXN0ZXIsIEFEQyBzbGF2ZQorICAqICAgICAgICAgb3IgcmF3IGRhdGEgd2l0aCBBREMgbWFzdGVyIGFuZCBzbGF2ZSBjb25jYXRlbmF0ZWQuCisgICogQG5vdGUgICBJZiByYXcgZGF0YSB3aXRoIEFEQyBtYXN0ZXIgYW5kIHNsYXZlIGNvbmNhdGVuYXRlZCBpcyByZXRyaWV2ZWQsCisgICogICAgICAgICBhIG1hY3JvIGlzIGF2YWlsYWJsZSB0byBnZXQgdGhlIGNvbnZlcnNpb24gZGF0YSBvZgorICAqICAgICAgICAgQURDIG1hc3RlciBvciBBREMgc2xhdmU6IHNlZSBoZWxwZXIgbWFjcm8KKyAgKiAgICAgICAgIEByZWYgX19MTF9BRENfTVVMVElfQ09OVl9EQVRBX01BU1RFUl9TTEFWRSgpLgorICAqICAgICAgICAgKGhvd2V2ZXIgdGhpcyBtYWNybyBpcyBtYWlubHkgaW50ZW5kZWQgZm9yIG11bHRpbW9kZQorICAqICAgICAgICAgdHJhbnNmZXIgYnkgRE1BLCBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gY2FuIGRvIHRoZSBzYW1lCisgICogICAgICAgICBieSBnZXR0aW5nIG11bHRpbW9kZSBjb252ZXJzaW9uIGRhdGEgb2YgQURDIG1hc3RlciBvciBBREMgc2xhdmUKKyAgKiAgICAgICAgIHNlcGFyYXRlbHkpLgorICAqIEBybXRvbGwgQ0RSICAgICAgUkRBVEFfTVNUICAgICAgTExfQURDX1JFR19SZWFkTXVsdGlDb252ZXJzaW9uRGF0YTMyXG4KKyAgKiAgICAgICAgIENEUiAgICAgIFJEQVRBX1NMViAgICAgIExMX0FEQ19SRUdfUmVhZE11bHRpQ29udmVyc2lvbkRhdGEzMgorICAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgICogQHBhcmFtICBDb252ZXJzaW9uRGF0YSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfU0xBVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfTUFTVEVSX1NMQVZFCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwMDAwMDAgYW5kIE1heF9EYXRhPTB4RkZGRkZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfUkVHX1JlYWRNdWx0aUNvbnZlcnNpb25EYXRhMzIoQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04sIHVpbnQzMl90IENvbnZlcnNpb25EYXRhKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4eV9DT01NT04tPkNEUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVyc2lvbkRhdGEpCisgICAgICAgICAgICAgICAgICAgID4+IFBPU0lUSU9OX1ZBTChDb252ZXJzaW9uRGF0YSkKKyAgICAgICAgICAgICAgICAgICApOworfQorI2VuZGlmIC8qIEFEQ19NVUxUSU1PREVfU1VQUE9SVCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9PcGVyYXRpb25fQURDX0dyb3VwX0luamVjdGVkIE9wZXJhdGlvbiBvbiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiBncm91cCBpbmplY3RlZAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU3RhcnQgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24uCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCB0aGlzIGZ1bmN0aW9uIGlzIHJlbGV2YW50IGZvciBib3RoIAorICAqICAgICAgICAgaW50ZXJuYWwgdHJpZ2dlciAoU1cgc3RhcnQpIGFuZCBleHRlcm5hbCB0cmlnZ2VyOgorICAqICAgICAgICAgLSBJZiBBREMgdHJpZ2dlciBoYXMgYmVlbiBzZXQgdG8gc29mdHdhcmUgc3RhcnQsIEFEQyBjb252ZXJzaW9uCisgICogICAgICAgICAgIHN0YXJ0cyBpbW1lZGlhdGVseS4KKyAgKiAgICAgICAgIC0gSWYgQURDIHRyaWdnZXIgaGFzIGJlZW4gc2V0IHRvIGV4dGVybmFsIHRyaWdnZXIsIEFEQyBjb252ZXJzaW9uCisgICogICAgICAgICAgIHdpbGwgc3RhcnQgYXQgbmV4dCB0cmlnZ2VyIGV2ZW50IChvbiB0aGUgc2VsZWN0ZWQgdHJpZ2dlciBlZGdlKQorICAqICAgICAgICAgICBmb2xsb3dpbmcgdGhlIEFEQyBzdGFydCBjb252ZXJzaW9uIGNvbW1hbmQuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcgb24gZ3JvdXAgaW5qZWN0ZWQsCisgICogICAgICAgICB3aXRob3V0IGNvbnZlcnNpb24gc3RvcCBjb21tYW5kIG9uIGdvaW5nIG9uIGdyb3VwIGluamVjdGVkLAorICAqICAgICAgICAgd2l0aG91dCBBREMgZGlzYWJsZSBjb21tYW5kIG9uIGdvaW5nLgorICAqIEBybXRvbGwgQ1IgICAgICAgSkFEU1RBUlQgICAgICAgTExfQURDX0lOSl9TdGFydENvbnZlcnNpb24KKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfSU5KX1N0YXJ0Q29udmVyc2lvbihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgLyogTm90ZTogV3JpdGUgcmVnaXN0ZXIgd2l0aCBzb21lIGFkZGl0aW9uYWwgYml0cyBmb3JjZWQgdG8gc3RhdGUgcmVzZXQgICAgICovCisgIC8qICAgICAgIGluc3RlYWQgb2YgbW9kaWZ5aW5nIG9ubHkgdGhlIHNlbGVjdGVkIGJpdCBmb3IgdGhpcyBmdW5jdGlvbiwgICAgICAqLworICAvKiAgICAgICB0byBub3QgaW50ZXJmZXJlIHdpdGggYml0cyB3aXRoIEhXIHByb3BlcnR5ICJycyIuICAgICAgICAgICAgICAgICAgKi8KKyAgTU9ESUZZX1JFRyhBREN4LT5DUiwKKyAgICAgICAgICAgICBBRENfQ1JfQklUU19QUk9QRVJUWV9SUywKKyAgICAgICAgICAgICBBRENfQ1JfSkFEU1RBUlQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24uCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZW5hYmxlZCB3aXRoIGNvbnZlcnNpb24gb24gZ29pbmcgb24gZ3JvdXAgaW5qZWN0ZWQsCisgICogICAgICAgICB3aXRob3V0IEFEQyBkaXNhYmxlIGNvbW1hbmQgb24gZ29pbmcuCisgICogQHJtdG9sbCBDUiAgICAgICBKQURTVFAgICAgICAgICBMTF9BRENfSU5KX1N0b3BDb252ZXJzaW9uCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0lOSl9TdG9wQ29udmVyc2lvbihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgLyogTm90ZTogV3JpdGUgcmVnaXN0ZXIgd2l0aCBzb21lIGFkZGl0aW9uYWwgYml0cyBmb3JjZWQgdG8gc3RhdGUgcmVzZXQgICAgICovCisgIC8qICAgICAgIGluc3RlYWQgb2YgbW9kaWZ5aW5nIG9ubHkgdGhlIHNlbGVjdGVkIGJpdCBmb3IgdGhpcyBmdW5jdGlvbiwgICAgICAqLworICAvKiAgICAgICB0byBub3QgaW50ZXJmZXJlIHdpdGggYml0cyB3aXRoIEhXIHByb3BlcnR5ICJycyIuICAgICAgICAgICAgICAgICAgKi8KKyAgTU9ESUZZX1JFRyhBREN4LT5DUiwKKyAgICAgICAgICAgICBBRENfQ1JfQklUU19QUk9QRVJUWV9SUywKKyAgICAgICAgICAgICBBRENfQ1JfSkFEU1RQKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gc3RhdGUuCisgICogQHJtdG9sbCBDUiAgICAgICBKQURTVEFSVCAgICAgICBMTF9BRENfSU5KX0lzQ29udmVyc2lvbk9uZ29pbmcKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCAwOiBubyBjb252ZXJzaW9uIGlzIG9uIGdvaW5nIG9uIEFEQyBncm91cCBpbmplY3RlZC4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSU5KX0lzQ29udmVyc2lvbk9uZ29pbmcoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoQURDeC0+Q1IsIEFEQ19DUl9KQURTVEFSVCkgPT0gKEFEQ19DUl9KQURTVEFSVCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29tbWFuZCBvZiBjb252ZXJzaW9uIHN0b3Agc3RhdGUKKyAgKiBAcm10b2xsIENSICAgICAgIEpBRFNUUCAgICAgICAgIExMX0FEQ19JTkpfSXNTdG9wQ29udmVyc2lvbk9uZ29pbmcKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCAwOiBubyBjb21tYW5kIG9mIGNvbnZlcnNpb24gc3RvcCBpcyBvbiBnb2luZyBvbiBBREMgZ3JvdXAgaW5qZWN0ZWQuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lOSl9Jc1N0b3BDb252ZXJzaW9uT25nb2luZyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChBREN4LT5DUiwgQURDX0NSX0pBRFNUUCkgPT0gKEFEQ19DUl9KQURTVFApKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhLCByYW5nZSBmaXQgZm9yCisgICogICAgICAgICBhbGwgQURDIGNvbmZpZ3VyYXRpb25zOiBhbGwgQURDIHJlc29sdXRpb25zIGFuZAorICAqICAgICAgICAgYWxsIG92ZXJzYW1wbGluZyBpbmNyZWFzZWQgZGF0YSB3aWR0aCAoZm9yIGRldmljZXMKKyAgKiAgICAgICAgIHdpdGggZmVhdHVyZSBvdmVyc2FtcGxpbmcpLgorICAqIEBybXRvbGwgSkRSMSAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGEzMlxuCisgICogICAgICAgICBKRFIyICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTMyXG4KKyAgKiAgICAgICAgIEpEUjMgICAgIEpEQVRBICAgICAgICAgIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMzJcbgorICAqICAgICAgICAgSkRSNCAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGEzMgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJhbmsgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfNAorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMDAwMDAwIGFuZCBNYXhfRGF0YT0weEZGRkZGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGEzMihBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgUmFuaykKK3sKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQURDX1BUUl9SRUdfT0ZGU0VUKEFEQ3gtPkpEUjEsIF9fQURDX01BU0tfU0hJRlQoUmFuaywgQURDX0lOSl9KRFJYX1JFR09GRlNFVF9NQVNLKSk7CisgIAorICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVCgqcHJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0pEUjFfSkRBVEEpCisgICAgICAgICAgICAgICAgICAgKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gZGF0YSwgcmFuZ2UgZml0IGZvcgorICAqICAgICAgICAgQURDIHJlc29sdXRpb24gMTIgYml0cy4KKyAgKiBAbm90ZSAgIEZvciBkZXZpY2VzIHdpdGggZmVhdHVyZSBvdmVyc2FtcGxpbmc6IE92ZXJzYW1wbGluZworICAqICAgICAgICAgY2FuIGluY3JlYXNlIGRhdGEgd2lkdGgsIGZ1bmN0aW9uIGZvciBleHRlbmRlZCByYW5nZQorICAqICAgICAgICAgbWF5IGJlIG5lZWRlZDogQHJlZiBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTMyLgorICAqIEBybXRvbGwgSkRSMSAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGExMlxuCisgICogICAgICAgICBKRFIyICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTEyXG4KKyAgKiAgICAgICAgIEpEUjMgICAgIEpEQVRBICAgICAgICAgIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMTJcbgorICAqICAgICAgICAgSkRSNCAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGExMgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJhbmsgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfNAorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MTZfdCBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTEyKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBSYW5rKQoreworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoQURDeC0+SkRSMSwgX19BRENfTUFTS19TSElGVChSYW5rLCBBRENfSU5KX0pEUlhfUkVHT0ZGU0VUX01BU0spKTsKKyAgCisgIHJldHVybiAodWludDE2X3QpKFJFQURfQklUKCpwcmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSkRSMV9KREFUQSkKKyAgICAgICAgICAgICAgICAgICApOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBkYXRhLCByYW5nZSBmaXQgZm9yCisgICogICAgICAgICBBREMgcmVzb2x1dGlvbiAxMCBiaXRzLgorICAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBmZWF0dXJlIG92ZXJzYW1wbGluZzogT3ZlcnNhbXBsaW5nCisgICogICAgICAgICBjYW4gaW5jcmVhc2UgZGF0YSB3aWR0aCwgZnVuY3Rpb24gZm9yIGV4dGVuZGVkIHJhbmdlCisgICogICAgICAgICBtYXkgYmUgbmVlZGVkOiBAcmVmIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMzIuCisgICogQHJtdG9sbCBKRFIxICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTEwXG4KKyAgKiAgICAgICAgIEpEUjIgICAgIEpEQVRBICAgICAgICAgIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMTBcbgorICAqICAgICAgICAgSkRSMyAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGExMFxuCisgICogICAgICAgICBKRFI0ICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTEwCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgUmFuayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS180CisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weDNGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQxNl90IExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMTAoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFJhbmspCit7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVChBREN4LT5KRFIxLCBfX0FEQ19NQVNLX1NISUZUKFJhbmssIEFEQ19JTkpfSkRSWF9SRUdPRkZTRVRfTUFTSykpOworICAKKyAgcmV0dXJuICh1aW50MTZfdCkoUkVBRF9CSVQoKnByZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19KRFIxX0pEQVRBKQorICAgICAgICAgICAgICAgICAgICk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIGRhdGEsIHJhbmdlIGZpdCBmb3IKKyAgKiAgICAgICAgIEFEQyByZXNvbHV0aW9uIDggYml0cy4KKyAgKiBAbm90ZSAgIEZvciBkZXZpY2VzIHdpdGggZmVhdHVyZSBvdmVyc2FtcGxpbmc6IE92ZXJzYW1wbGluZworICAqICAgICAgICAgY2FuIGluY3JlYXNlIGRhdGEgd2lkdGgsIGZ1bmN0aW9uIGZvciBleHRlbmRlZCByYW5nZQorICAqICAgICAgICAgbWF5IGJlIG5lZWRlZDogQHJlZiBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTMyLgorICAqIEBybXRvbGwgSkRSMSAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGE4XG4KKyAgKiAgICAgICAgIEpEUjIgICAgIEpEQVRBICAgICAgICAgIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhOFxuCisgICogICAgICAgICBKRFIzICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YThcbgorICAqICAgICAgICAgSkRSNCAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGE4CisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgUmFuayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS180CisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50OF90IExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhOChBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgUmFuaykKK3sKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQURDX1BUUl9SRUdfT0ZGU0VUKEFEQ3gtPkpEUjEsIF9fQURDX01BU0tfU0hJRlQoUmFuaywgQURDX0lOSl9KRFJYX1JFR09GRlNFVF9NQVNLKSk7CisgIAorICByZXR1cm4gKHVpbnQ4X3QpKFJFQURfQklUKCpwcmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19KRFIxX0pEQVRBKQorICAgICAgICAgICAgICAgICAgKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gZGF0YSwgcmFuZ2UgZml0IGZvcgorICAqICAgICAgICAgQURDIHJlc29sdXRpb24gNiBiaXRzLgorICAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBmZWF0dXJlIG92ZXJzYW1wbGluZzogT3ZlcnNhbXBsaW5nCisgICogICAgICAgICBjYW4gaW5jcmVhc2UgZGF0YSB3aWR0aCwgZnVuY3Rpb24gZm9yIGV4dGVuZGVkIHJhbmdlCisgICogICAgICAgICBtYXkgYmUgbmVlZGVkOiBAcmVmIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMzIuCisgICogQHJtdG9sbCBKRFIxICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTZcbgorICAqICAgICAgICAgSkRSMiAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGE2XG4KKyAgKiAgICAgICAgIEpEUjMgICAgIEpEQVRBICAgICAgICAgIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhNlxuCisgICogICAgICAgICBKRFI0ICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTYKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBSYW5rIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzQKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgzRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQ4X3QgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGE2KEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBSYW5rKQoreworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoQURDeC0+SkRSMSwgX19BRENfTUFTS19TSElGVChSYW5rLCBBRENfSU5KX0pEUlhfUkVHT0ZGU0VUX01BU0spKTsKKyAgCisgIHJldHVybiAodWludDhfdCkoUkVBRF9CSVQoKnByZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0pEUjFfSkRBVEEpCisgICAgICAgICAgICAgICAgICApOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9GTEFHX01hbmFnZW1lbnQgQURDIGZsYWcgbWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgR2V0IGZsYWcgQURDIHJlYWR5LgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgZmxhZyBMTF9BRENfRkxBR19BRFJEWSBpcyByYWlzZWQgd2hlbiB0aGUgQURDCisgICogICAgICAgICBpcyBlbmFibGVkIGFuZCB3aGVuIGNvbnZlcnNpb24gY2xvY2sgaXMgYWN0aXZlLgorICAqICAgICAgICAgKG5vdCBvbmx5IGNvcmUgY2xvY2s6IHRoaXMgQURDIGhhcyBhIGR1YWwgY2xvY2sgZG9tYWluKQorICAqIEBybXRvbGwgSVNSICAgICAgQURSRFkgICAgICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19BRFJEWQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX0FEUkRZKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfQURSRFkpID09IChMTF9BRENfRkxBR19BRFJEWSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBmbGFnIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24uCisgICogQHJtdG9sbCBJU1IgICAgICBFT0MgICAgICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX0VPQworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX0VPQyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChBREN4LT5JU1IsIEFEQ19JU1JfRU9DKSA9PSAoQURDX0lTUl9FT0MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZmxhZyBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMuCisgICogQHJtdG9sbCBJU1IgICAgICBFT1MgICAgICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX0VPUworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX0VPUyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChBREN4LT5JU1IsIExMX0FEQ19GTEFHX0VPUykgPT0gKExMX0FEQ19GTEFHX0VPUykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBmbGFnIEFEQyBncm91cCByZWd1bGFyIG92ZXJydW4uCisgICogQHJtdG9sbCBJU1IgICAgICBPVlIgICAgICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX09WUgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX09WUihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChBREN4LT5JU1IsIExMX0FEQ19GTEFHX09WUikgPT0gKExMX0FEQ19GTEFHX09WUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBmbGFnIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzYW1wbGluZyBwaGFzZS4KKyAgKiBAcm10b2xsIElTUiAgICAgIEVPU01QICAgICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfRU9TTVAKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzQWN0aXZlRmxhZ19FT1NNUChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChBREN4LT5JU1IsIExMX0FEQ19GTEFHX0VPU01QKSA9PSAoTExfQURDX0ZMQUdfRU9TTVApKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZmxhZyBBREMgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbi4KKyAgKiBAcm10b2xsIElTUiAgICAgIEpFT0MgICAgICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfSkVPQworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX0pFT0MoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoQURDeC0+SVNSLCBMTF9BRENfRkxBR19KRU9DKSA9PSAoTExfQURDX0ZMQUdfSkVPQykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBmbGFnIEFEQyBncm91cCBpbmplY3RlZCBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMuCisgICogQHJtdG9sbCBJU1IgICAgICBKRU9TICAgICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX0pFT1MKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzQWN0aXZlRmxhZ19KRU9TKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfSkVPUykgPT0gKExMX0FEQ19GTEFHX0pFT1MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZmxhZyBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udGV4dHMgcXVldWUgb3ZlcmZsb3cuCisgICogQHJtdG9sbCBJU1IgICAgICBKUU9WRiAgICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX0pRT1ZGCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfSlFPVkYoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoQURDeC0+SVNSLCBMTF9BRENfRkxBR19KUU9WRikgPT0gKExMX0FEQ19GTEFHX0pRT1ZGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGZsYWcgQURDIGFuYWxvZyB3YXRjaGRvZyAxIGZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgIEFXRDEgICAgICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfQVdEMQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX0FXRDEoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoQURDeC0+SVNSLCBMTF9BRENfRkxBR19BV0QxKSA9PSAoTExfQURDX0ZMQUdfQVdEMSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBmbGFnIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMi4KKyAgKiBAcm10b2xsIElTUiAgICAgIEFXRDIgICAgICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfQVdEMgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX0FXRDIoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoQURDeC0+SVNSLCBMTF9BRENfRkxBR19BV0QyKSA9PSAoTExfQURDX0ZMQUdfQVdEMikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBmbGFnIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMy4KKyAgKiBAcm10b2xsIElTUiAgICAgIEFXRDMgICAgICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfQVdEMworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX0FXRDMoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoQURDeC0+SVNSLCBMTF9BRENfRkxBR19BV0QzKSA9PSAoTExfQURDX0ZMQUdfQVdEMykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIGZsYWcgQURDIHJlYWR5LgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgZmxhZyBMTF9BRENfRkxBR19BRFJEWSBpcyByYWlzZWQgd2hlbiB0aGUgQURDCisgICogICAgICAgICBpcyBlbmFibGVkIGFuZCB3aGVuIGNvbnZlcnNpb24gY2xvY2sgaXMgYWN0aXZlLgorICAqICAgICAgICAgKG5vdCBvbmx5IGNvcmUgY2xvY2s6IHRoaXMgQURDIGhhcyBhIGR1YWwgY2xvY2sgZG9tYWluKQorICAqIEBybXRvbGwgSVNSICAgICAgQURSRFkgICAgICAgICAgTExfQURDX0NsZWFyRmxhZ19BRFJEWQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19DbGVhckZsYWdfQURSRFkoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFdSSVRFX1JFRyhBREN4LT5JU1IsIExMX0FEQ19GTEFHX0FEUkRZKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBmbGFnIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24uCisgICogQHJtdG9sbCBJU1IgICAgICBFT0MgICAgICAgICAgICBMTF9BRENfQ2xlYXJGbGFnX0VPQworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19DbGVhckZsYWdfRU9DKEFEQ19UeXBlRGVmICpBREN4KQoreworICBXUklURV9SRUcoQURDeC0+SVNSLCBMTF9BRENfRkxBR19FT0MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIGZsYWcgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zLgorICAqIEBybXRvbGwgSVNSICAgICAgRU9TICAgICAgICAgICAgTExfQURDX0NsZWFyRmxhZ19FT1MKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfQ2xlYXJGbGFnX0VPUyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgV1JJVEVfUkVHKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfRU9TKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBmbGFnIEFEQyBncm91cCByZWd1bGFyIG92ZXJydW4uCisgICogQHJtdG9sbCBJU1IgICAgICBPVlIgICAgICAgICAgICBMTF9BRENfQ2xlYXJGbGFnX09WUgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19DbGVhckZsYWdfT1ZSKEFEQ19UeXBlRGVmICpBREN4KQoreworICBXUklURV9SRUcoQURDeC0+SVNSLCBMTF9BRENfRkxBR19PVlIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIGZsYWcgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNhbXBsaW5nIHBoYXNlLgorICAqIEBybXRvbGwgSVNSICAgICAgRU9TTVAgICAgICAgICAgTExfQURDX0NsZWFyRmxhZ19FT1NNUAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19DbGVhckZsYWdfRU9TTVAoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFdSSVRFX1JFRyhBREN4LT5JU1IsIExMX0FEQ19GTEFHX0VPU01QKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBmbGFnIEFEQyBncm91cCBpbmplY3RlZCBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uLgorICAqIEBybXRvbGwgSVNSICAgICAgSkVPQyAgICAgICAgICAgTExfQURDX0NsZWFyRmxhZ19KRU9DCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0NsZWFyRmxhZ19KRU9DKEFEQ19UeXBlRGVmICpBREN4KQoreworICBXUklURV9SRUcoQURDeC0+SVNSLCBMTF9BRENfRkxBR19KRU9DKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBmbGFnIEFEQyBncm91cCBpbmplY3RlZCBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMuCisgICogQHJtdG9sbCBJU1IgICAgICBKRU9TICAgICAgICAgICBMTF9BRENfQ2xlYXJGbGFnX0pFT1MKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfQ2xlYXJGbGFnX0pFT1MoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFdSSVRFX1JFRyhBREN4LT5JU1IsIExMX0FEQ19GTEFHX0pFT1MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIGZsYWcgQURDIGdyb3VwIGluamVjdGVkIGNvbnRleHRzIHF1ZXVlIG92ZXJmbG93LgorICAqIEBybXRvbGwgSVNSICAgICAgSlFPVkYgICAgICAgICAgTExfQURDX0NsZWFyRmxhZ19KUU9WRgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19DbGVhckZsYWdfSlFPVkYoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFdSSVRFX1JFRyhBREN4LT5JU1IsIExMX0FEQ19GTEFHX0pRT1ZGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBmbGFnIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMS4KKyAgKiBAcm10b2xsIElTUiAgICAgIEFXRDEgICAgICAgICAgIExMX0FEQ19DbGVhckZsYWdfQVdEMQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19DbGVhckZsYWdfQVdEMShBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgV1JJVEVfUkVHKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfQVdEMSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgZmxhZyBBREMgYW5hbG9nIHdhdGNoZG9nIDIuCisgICogQHJtdG9sbCBJU1IgICAgICBBV0QyICAgICAgICAgICBMTF9BRENfQ2xlYXJGbGFnX0FXRDIKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfQ2xlYXJGbGFnX0FXRDIoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFdSSVRFX1JFRyhBREN4LT5JU1IsIExMX0FEQ19GTEFHX0FXRDIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIGZsYWcgQURDIGFuYWxvZyB3YXRjaGRvZyAzLgorICAqIEBybXRvbGwgSVNSICAgICAgQVdEMyAgICAgICAgICAgTExfQURDX0NsZWFyRmxhZ19BV0QzCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0NsZWFyRmxhZ19BV0QzKEFEQ19UeXBlRGVmICpBREN4KQoreworICBXUklURV9SRUcoQURDeC0+SVNSLCBMTF9BRENfRkxBR19BV0QzKTsKK30KKworI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBHZXQgZmxhZyBtdWx0aW1vZGUgQURDIHJlYWR5IG9mIHRoZSBBREMgbWFzdGVyLgorICAqIEBybXRvbGwgQ1NSICAgICAgQURSRFlfTVNUICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19NU1RfQURSRFkKKyAgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfTVNUX0FEUkRZKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q1NSLCBMTF9BRENfRkxBR19BRFJEWV9NU1QpID09IChMTF9BRENfRkxBR19BRFJEWV9NU1QpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZmxhZyBtdWx0aW1vZGUgQURDIHJlYWR5IG9mIHRoZSBBREMgc2xhdmUuCisgICogQHJtdG9sbCBDU1IgICAgICBBRFJEWV9TTFYgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX1NMVl9BRFJEWQorICAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzQWN0aXZlRmxhZ19TTFZfQURSRFkoQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pCit7CisgIHJldHVybiAoUkVBRF9CSVQoQURDeHlfQ09NTU9OLT5DU1IsIExMX0FEQ19GTEFHX0FEUkRZX1NMVikgPT0gKExMX0FEQ19GTEFHX0FEUkRZX1NMVikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBmbGFnIG11bHRpbW9kZSBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uIG9mIHRoZSBBREMgbWFzdGVyLgorICAqIEBybXRvbGwgQ1NSICAgICAgRU9DX01TVCAgICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19NU1RfRU9DCisgICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX01TVF9FT0MoQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pCit7CisgIHJldHVybiAoUkVBRF9CSVQoQURDeHlfQ09NTU9OLT5DU1IsIExMX0FEQ19GTEFHX0VPQ19TTFYpID09IChMTF9BRENfRkxBR19FT0NfU0xWKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGZsYWcgbXVsdGltb2RlIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24gb2YgdGhlIEFEQyBzbGF2ZS4KKyAgKiBAcm10b2xsIENTUiAgICAgIEVPQ19TTFYgICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfU0xWX0VPQworICAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzQWN0aXZlRmxhZ19TTFZfRU9DKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q1NSLCBMTF9BRENfRkxBR19FT0NfU0xWKSA9PSAoTExfQURDX0ZMQUdfRU9DX1NMVikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBmbGFnIG11bHRpbW9kZSBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMgb2YgdGhlIEFEQyBtYXN0ZXIuCisgICogQHJtdG9sbCBDU1IgICAgICBFT1NfTVNUICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX01TVF9FT1MKKyAgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfTVNUX0VPUyhBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTikKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChBREN4eV9DT01NT04tPkNTUiwgTExfQURDX0ZMQUdfRU9TX01TVCkgPT0gKExMX0FEQ19GTEFHX0VPU19NU1QpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZmxhZyBtdWx0aW1vZGUgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zIG9mIHRoZSBBREMgc2xhdmUuCisgICogQHJtdG9sbCBDU1IgICAgICBFT1NfU0xWICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX1NMVl9FT1MKKyAgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfU0xWX0VPUyhBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTikKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChBREN4eV9DT01NT04tPkNTUiwgTExfQURDX0ZMQUdfRU9TX1NMVikgPT0gKExMX0FEQ19GTEFHX0VPU19TTFYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZmxhZyBtdWx0aW1vZGUgQURDIGdyb3VwIHJlZ3VsYXIgb3ZlcnJ1biBvZiB0aGUgQURDIG1hc3Rlci4KKyAgKiBAcm10b2xsIENTUiAgICAgIE9WUl9NU1QgICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfTVNUX09WUgorICAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzQWN0aXZlRmxhZ19NU1RfT1ZSKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q1NSLCBMTF9BRENfRkxBR19PVlJfTVNUKSA9PSAoTExfQURDX0ZMQUdfT1ZSX01TVCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBmbGFnIG11bHRpbW9kZSBBREMgZ3JvdXAgcmVndWxhciBvdmVycnVuIG9mIHRoZSBBREMgc2xhdmUuCisgICogQHJtdG9sbCBDU1IgICAgICBPVlJfU0xWICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX1NMVl9PVlIKKyAgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfU0xWX09WUihBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTikKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChBREN4eV9DT01NT04tPkNTUiwgTExfQURDX0ZMQUdfT1ZSX1NMVikgPT0gKExMX0FEQ19GTEFHX09WUl9TTFYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZmxhZyBtdWx0aW1vZGUgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNhbXBsaW5nIG9mIHRoZSBBREMgbWFzdGVyLgorICAqIEBybXRvbGwgQ1NSICAgICAgRU9TTVBfTVNUICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19NU1RfRU9TTVAKKyAgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfTVNUX0VPU01QKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q1NSLCBMTF9BRENfRkxBR19FT1NNUF9NU1QpID09IChMTF9BRENfRkxBR19FT1NNUF9NU1QpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZmxhZyBtdWx0aW1vZGUgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNhbXBsaW5nIG9mIHRoZSBBREMgc2xhdmUuCisgICogQHJtdG9sbCBDU1IgICAgICBFT1NNUF9TTFYgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX1NMVl9FT1NNUAorICAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzQWN0aXZlRmxhZ19TTFZfRU9TTVAoQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pCit7CisgIHJldHVybiAoUkVBRF9CSVQoQURDeHlfQ09NTU9OLT5DU1IsIExMX0FEQ19GTEFHX0VPU01QX1NMVikgPT0gKExMX0FEQ19GTEFHX0VPU01QX1NMVikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBmbGFnIG11bHRpbW9kZSBBREMgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbiBvZiB0aGUgQURDIG1hc3Rlci4KKyAgKiBAcm10b2xsIENTUiAgICAgIEpFT0NfTVNUICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfTVNUX0pFT0MKKyAgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfTVNUX0pFT0MoQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pCit7CisgIHJldHVybiAoUkVBRF9CSVQoQURDeHlfQ09NTU9OLT5DU1IsIExMX0FEQ19GTEFHX0pFT0NfTVNUKSA9PSAoTExfQURDX0ZMQUdfSkVPQ19NU1QpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZmxhZyBtdWx0aW1vZGUgQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24gb2YgdGhlIEFEQyBzbGF2ZS4KKyAgKiBAcm10b2xsIENTUiAgICAgIEpFT0NfU0xWICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfU0xWX0pFT0MKKyAgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfU0xWX0pFT0MoQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pCit7CisgIHJldHVybiAoUkVBRF9CSVQoQURDeHlfQ09NTU9OLT5DU1IsIExMX0FEQ19GTEFHX0pFT0NfU0xWKSA9PSAoTExfQURDX0ZMQUdfSkVPQ19TTFYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZmxhZyBtdWx0aW1vZGUgQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucyBvZiB0aGUgQURDIG1hc3Rlci4KKyAgKiBAcm10b2xsIENTUiAgICAgIEpFT1NfTVNUICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfTVNUX0pFT1MKKyAgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfTVNUX0pFT1MoQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pCit7CisgIHJldHVybiAoUkVBRF9CSVQoQURDeHlfQ09NTU9OLT5DU1IsIExMX0FEQ19GTEFHX0pFT1NfTVNUKSA9PSAoTExfQURDX0ZMQUdfSkVPU19NU1QpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZmxhZyBtdWx0aW1vZGUgQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucyBvZiB0aGUgQURDIHNsYXZlLgorICAqIEBybXRvbGwgQ1NSICAgICAgSkVPU19TTFYgICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19TTFZfSkVPUworICAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzQWN0aXZlRmxhZ19TTFZfSkVPUyhBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTikKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChBREN4eV9DT01NT04tPkNTUiwgTExfQURDX0ZMQUdfSkVPU19TTFYpID09IChMTF9BRENfRkxBR19KRU9TX1NMVikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBmbGFnIG11bHRpbW9kZSBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udGV4dCBxdWV1ZSBvdmVyZmxvdyBvZiB0aGUgQURDIG1hc3Rlci4KKyAgKiBAcm10b2xsIENTUiAgICAgIEpRT1ZGX01TVCAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfTVNUX0pRT1ZGCisgICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX01TVF9KUU9WRihBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTikKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChBREN4eV9DT01NT04tPkNTUiwgTExfQURDX0ZMQUdfSlFPVkZfTVNUKSA9PSAoTExfQURDX0ZMQUdfSlFPVkZfTVNUKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGZsYWcgbXVsdGltb2RlIEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0IHF1ZXVlIG92ZXJmbG93IG9mIHRoZSBBREMgc2xhdmUuCisgICogQHJtdG9sbCBDU1IgICAgICBKUU9WRl9TTFYgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX1NMVl9KUU9WRgorICAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzQWN0aXZlRmxhZ19TTFZfSlFPVkYoQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pCit7CisgIHJldHVybiAoUkVBRF9CSVQoQURDeHlfQ09NTU9OLT5DU1IsIExMX0FEQ19GTEFHX0pRT1ZGX1NMVikgPT0gKExMX0FEQ19GTEFHX0pRT1ZGX1NMVikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBmbGFnIG11bHRpbW9kZSBBREMgYW5hbG9nIHdhdGNoZG9nIDEgb2YgdGhlIEFEQyBtYXN0ZXIuCisgICogQHJtdG9sbCBDU1IgICAgICBBV0QxX01TVCAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX01TVF9BV0QxCisgICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX01TVF9BV0QxKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q1NSLCBMTF9BRENfRkxBR19BV0QxX01TVCkgPT0gKExMX0FEQ19GTEFHX0FXRDFfTVNUKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGZsYWcgbXVsdGltb2RlIGFuYWxvZyB3YXRjaGRvZyAxIG9mIHRoZSBBREMgc2xhdmUuCisgICogQHJtdG9sbCBDU1IgICAgICBBV0QxX1NMViAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX1NMVl9BV0QxCisgICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX1NMVl9BV0QxKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q1NSLCBMTF9BRENfRkxBR19BV0QxX1NMVikgPT0gKExMX0FEQ19GTEFHX0FXRDFfU0xWKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGZsYWcgbXVsdGltb2RlIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMiBvZiB0aGUgQURDIG1hc3Rlci4KKyAgKiBAcm10b2xsIENTUiAgICAgIEFXRDJfTVNUICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfTVNUX0FXRDIKKyAgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfTVNUX0FXRDIoQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pCit7CisgIHJldHVybiAoUkVBRF9CSVQoQURDeHlfQ09NTU9OLT5DU1IsIExMX0FEQ19GTEFHX0FXRDJfTVNUKSA9PSAoTExfQURDX0ZMQUdfQVdEMl9NU1QpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZmxhZyBtdWx0aW1vZGUgQURDIGFuYWxvZyB3YXRjaGRvZyAyIG9mIHRoZSBBREMgc2xhdmUuCisgICogQHJtdG9sbCBDU1IgICAgICBBV0QyX1NMViAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX1NMVl9BV0QyCisgICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX1NMVl9BV0QyKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q1NSLCBMTF9BRENfRkxBR19BV0QyX1NMVikgPT0gKExMX0FEQ19GTEFHX0FXRDJfU0xWKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGZsYWcgbXVsdGltb2RlIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMyBvZiB0aGUgQURDIG1hc3Rlci4KKyAgKiBAcm10b2xsIENTUiAgICAgIEFXRDNfTVNUICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfTVNUX0FXRDMKKyAgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfTVNUX0FXRDMoQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pCit7CisgIHJldHVybiAoUkVBRF9CSVQoQURDeHlfQ09NTU9OLT5DU1IsIExMX0FEQ19GTEFHX0FXRDNfTVNUKSA9PSAoTExfQURDX0ZMQUdfQVdEM19NU1QpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZmxhZyBtdWx0aW1vZGUgQURDIGFuYWxvZyB3YXRjaGRvZyAzIG9mIHRoZSBBREMgc2xhdmUuCisgICogQHJtdG9sbCBDU1IgICAgICBBV0QzX1NMViAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX1NMVl9BV0QzCisgICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX1NMVl9BV0QzKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q1NSLCBMTF9BRENfRkxBR19BV0QzX1NMVikgPT0gKExMX0FEQ19GTEFHX0FXRDNfU0xWKSk7Cit9CisjZW5kaWYgLyogQURDX01VTFRJTU9ERV9TVVBQT1JUICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX0lUX01hbmFnZW1lbnQgQURDIElUIG1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBREMgcmVhZHkuCisgICogQHJtdG9sbCBJRVIgICAgICBBRFJEWUlFICAgICAgICBMTF9BRENfRW5hYmxlSVRfQURSRFkKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlSVRfQURSRFkoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFNFVF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQURSRFkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbi4KKyAgKiBAcm10b2xsIElFUiAgICAgIEVPQ0lFICAgICAgICAgIExMX0FEQ19FbmFibGVJVF9FT0MKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlSVRfRU9DKEFEQ19UeXBlRGVmICpBREN4KQoreworICBTRVRfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0VPQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMuCisgICogQHJtdG9sbCBJRVIgICAgICBFT1NJRSAgICAgICAgICBMTF9BRENfRW5hYmxlSVRfRU9TCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0VuYWJsZUlUX0VPUyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgU0VUX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9FT1MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBREMgZ3JvdXAgcmVndWxhciBpbnRlcnJ1cHRpb24gb3ZlcnJ1bi4KKyAgKiBAcm10b2xsIElFUiAgICAgIE9WUklFICAgICAgICAgIExMX0FEQ19FbmFibGVJVF9PVlIKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlSVRfT1ZSKEFEQ19UeXBlRGVmICpBREN4KQoreworICBTRVRfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX09WUik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2FtcGxpbmcuCisgICogQHJtdG9sbCBJRVIgICAgICBFT1NNUElFICAgICAgICBMTF9BRENfRW5hYmxlSVRfRU9TTVAKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlSVRfRU9TTVAoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFNFVF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfRU9TTVApOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24uCisgICogQHJtdG9sbCBJRVIgICAgICBKRU9DSUUgICAgICAgICBMTF9BRENfRW5hYmxlSVRfSkVPQworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19FbmFibGVJVF9KRU9DKEFEQ19UeXBlRGVmICpBREN4KQoreworICBTRVRfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0pFT0MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucy4KKyAgKiBAcm10b2xsIElFUiAgICAgIEpFT1NJRSAgICAgICAgIExMX0FEQ19FbmFibGVJVF9KRU9TCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0VuYWJsZUlUX0pFT1MoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFNFVF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfSkVPUyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGludGVycnVwdGlvbiBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udGV4dCBxdWV1ZSBvdmVyZmxvdy4KKyAgKiBAcm10b2xsIElFUiAgICAgIEpRT1ZGSUUgICAgICAgIExMX0FEQ19FbmFibGVJVF9KUU9WRgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19FbmFibGVJVF9KUU9WRihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgU0VUX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9KUU9WRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGludGVycnVwdGlvbiBBREMgYW5hbG9nIHdhdGNoZG9nIDEuCisgICogQHJtdG9sbCBJRVIgICAgICBBV0QxSUUgICAgICAgICBMTF9BRENfRW5hYmxlSVRfQVdEMQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19FbmFibGVJVF9BV0QxKEFEQ19UeXBlRGVmICpBREN4KQoreworICBTRVRfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0FXRDEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAyLgorICAqIEBybXRvbGwgSUVSICAgICAgQVdEMklFICAgICAgICAgTExfQURDX0VuYWJsZUlUX0FXRDIKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlSVRfQVdEMihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgU0VUX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9BV0QyKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgaW50ZXJydXB0aW9uIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMy4KKyAgKiBAcm10b2xsIElFUiAgICAgIEFXRDNJRSAgICAgICAgIExMX0FEQ19FbmFibGVJVF9BV0QzCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0VuYWJsZUlUX0FXRDMoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFNFVF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQVdEMyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIHJlYWR5LgorICAqIEBybXRvbGwgSUVSICAgICAgQURSRFlJRSAgICAgICAgTExfQURDX0Rpc2FibGVJVF9BRFJEWQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19EaXNhYmxlSVRfQURSRFkoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIENMRUFSX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9BRFJEWSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbi4KKyAgKiBAcm10b2xsIElFUiAgICAgIEVPQ0lFICAgICAgICAgIExMX0FEQ19EaXNhYmxlSVRfRU9DCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9FT0MoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIENMRUFSX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9FT0MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucy4KKyAgKiBAcm10b2xsIElFUiAgICAgIEVPU0lFICAgICAgICAgIExMX0FEQ19EaXNhYmxlSVRfRU9TCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9FT1MoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIENMRUFSX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9FT1MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIG92ZXJydW4uCisgICogQHJtdG9sbCBJRVIgICAgICBPVlJJRSAgICAgICAgICBMTF9BRENfRGlzYWJsZUlUX09WUgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19EaXNhYmxlSVRfT1ZSKEFEQ19UeXBlRGVmICpBREN4KQoreworICBDTEVBUl9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfT1ZSKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2FtcGxpbmcuCisgICogQHJtdG9sbCBJRVIgICAgICBFT1NNUElFICAgICAgICBMTF9BRENfRGlzYWJsZUlUX0VPU01QCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9FT1NNUChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgQ0xFQVJfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0VPU01QKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uLgorICAqIEBybXRvbGwgSUVSICAgICAgSkVPQ0lFICAgICAgICAgTExfQURDX0Rpc2FibGVJVF9KRU9DCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9KRU9DKEFEQ19UeXBlRGVmICpBREN4KQoreworICBDTEVBUl9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfSkVPQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucy4KKyAgKiBAcm10b2xsIElFUiAgICAgIEpFT1NJRSAgICAgICAgIExMX0FEQ19EaXNhYmxlSVRfSkVPUworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19EaXNhYmxlSVRfSkVPUyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgQ0xFQVJfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0pFT1MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgaW50ZXJydXB0aW9uIEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0IHF1ZXVlIG92ZXJmbG93LgorICAqIEBybXRvbGwgSUVSICAgICAgSlFPVkZJRSAgICAgICAgTExfQURDX0Rpc2FibGVJVF9KUU9WRgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19EaXNhYmxlSVRfSlFPVkYoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIENMRUFSX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9KUU9WRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAxLgorICAqIEBybXRvbGwgSUVSICAgICAgQVdEMUlFICAgICAgICAgTExfQURDX0Rpc2FibGVJVF9BV0QxCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9BV0QxKEFEQ19UeXBlRGVmICpBREN4KQoreworICBDTEVBUl9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQVdEMSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAyLgorICAqIEBybXRvbGwgSUVSICAgICAgQVdEMklFICAgICAgICAgTExfQURDX0Rpc2FibGVJVF9BV0QyCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9BV0QyKEFEQ19UeXBlRGVmICpBREN4KQoreworICBDTEVBUl9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQVdEMik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAzLgorICAqIEBybXRvbGwgSUVSICAgICAgQVdEM0lFICAgICAgICAgTExfQURDX0Rpc2FibGVJVF9BV0QzCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9BV0QzKEFEQ19UeXBlRGVmICpBREN4KQoreworICBDTEVBUl9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQVdEMyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBBREMgcmVhZHkKKyAgKiAgICAgICAgICgwOiBpbnRlcnJ1cHQgZGlzYWJsZWQsIDE6IGludGVycnVwdCBlbmFibGVkKS4KKyAgKiBAcm10b2xsIElFUiAgICAgIEFEUkRZSUUgICAgICAgIExMX0FEQ19Jc0VuYWJsZWRJVF9BRFJEWQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNFbmFibGVkSVRfQURSRFkoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQURSRFkpID09IChMTF9BRENfSVRfQURSRFkpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgc3RhdGUgb2YgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24KKyAgKiAgICAgICAgICgwOiBpbnRlcnJ1cHQgZGlzYWJsZWQsIDE6IGludGVycnVwdCBlbmFibGVkKS4KKyAgKiBAcm10b2xsIElFUiAgICAgIEVPQ0lFICAgICAgICAgIExMX0FEQ19Jc0VuYWJsZWRJVF9FT0MKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZElUX0VPQyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9FT0MpID09IChMTF9BRENfSVRfRU9DKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMKKyAgKiAgICAgICAgICgwOiBpbnRlcnJ1cHQgZGlzYWJsZWQsIDE6IGludGVycnVwdCBlbmFibGVkKS4KKyAgKiBAcm10b2xsIElFUiAgICAgIEVPU0lFICAgICAgICAgIExMX0FEQ19Jc0VuYWJsZWRJVF9FT1MKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZElUX0VPUyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9FT1MpID09IChMTF9BRENfSVRfRU9TKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBvdmVycnVuCisgICogICAgICAgICAoMDogaW50ZXJydXB0IGRpc2FibGVkLCAxOiBpbnRlcnJ1cHQgZW5hYmxlZCkuCisgICogQHJtdG9sbCBJRVIgICAgICBPVlJJRSAgICAgICAgICBMTF9BRENfSXNFbmFibGVkSVRfT1ZSCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0VuYWJsZWRJVF9PVlIoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfT1ZSKSA9PSAoTExfQURDX0lUX09WUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBzdGF0ZSBvZiBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNhbXBsaW5nCisgICogICAgICAgICAoMDogaW50ZXJydXB0IGRpc2FibGVkLCAxOiBpbnRlcnJ1cHQgZW5hYmxlZCkuCisgICogQHJtdG9sbCBJRVIgICAgICBFT1NNUElFICAgICAgICBMTF9BRENfSXNFbmFibGVkSVRfRU9TTVAKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZElUX0VPU01QKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0VPU01QKSA9PSAoTExfQURDX0lUX0VPU01QKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBBREMgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbgorICAqICAgICAgICAgKDA6IGludGVycnVwdCBkaXNhYmxlZCwgMTogaW50ZXJydXB0IGVuYWJsZWQpLgorICAqIEBybXRvbGwgSUVSICAgICAgSkVPQ0lFICAgICAgICAgTExfQURDX0lzRW5hYmxlZElUX0pFT0MKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZElUX0pFT0MoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfSkVPQykgPT0gKExMX0FEQ19JVF9KRU9DKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBBREMgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zCisgICogICAgICAgICAoMDogaW50ZXJydXB0IGRpc2FibGVkLCAxOiBpbnRlcnJ1cHQgZW5hYmxlZCkuCisgICogQHJtdG9sbCBJRVIgICAgICBKRU9TSUUgICAgICAgICBMTF9BRENfSXNFbmFibGVkSVRfSkVPUworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNFbmFibGVkSVRfSkVPUyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9KRU9TKSA9PSAoTExfQURDX0lUX0pFT1MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgc3RhdGUgb2YgaW50ZXJydXB0aW9uIEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0IHF1ZXVlIG92ZXJmbG93IGludGVycnVwdCBzdGF0ZQorICAqICAgICAgICAgKDA6IGludGVycnVwdCBkaXNhYmxlZCwgMTogaW50ZXJydXB0IGVuYWJsZWQpLgorICAqIEBybXRvbGwgSUVSICAgICAgSlFPVkZJRSAgICAgICAgTExfQURDX0lzRW5hYmxlZElUX0pRT1ZGCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0VuYWJsZWRJVF9KUU9WRihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9KUU9WRikgPT0gKExMX0FEQ19JVF9KUU9WRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBzdGF0ZSBvZiBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAxCisgICogICAgICAgICAoMDogaW50ZXJydXB0IGRpc2FibGVkLCAxOiBpbnRlcnJ1cHQgZW5hYmxlZCkuCisgICogQHJtdG9sbCBJRVIgICAgICBBV0QxSUUgICAgICAgICBMTF9BRENfSXNFbmFibGVkSVRfQVdEMQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNFbmFibGVkSVRfQVdEMShBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9BV0QxKSA9PSAoTExfQURDX0lUX0FXRDEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgc3RhdGUgb2YgaW50ZXJydXB0aW9uIEdldCBBREMgYW5hbG9nIHdhdGNoZG9nIDIKKyAgKiAgICAgICAgICgwOiBpbnRlcnJ1cHQgZGlzYWJsZWQsIDE6IGludGVycnVwdCBlbmFibGVkKS4KKyAgKiBAcm10b2xsIElFUiAgICAgIEFXRDJJRSAgICAgICAgIExMX0FEQ19Jc0VuYWJsZWRJVF9BV0QyCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0VuYWJsZWRJVF9BV0QyKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0FXRDIpID09IChMTF9BRENfSVRfQVdEMikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBzdGF0ZSBvZiBpbnRlcnJ1cHRpb24gR2V0IEFEQyBhbmFsb2cgd2F0Y2hkb2cgMworICAqICAgICAgICAgKDA6IGludGVycnVwdCBkaXNhYmxlZCwgMTogaW50ZXJydXB0IGVuYWJsZWQpLgorICAqIEBybXRvbGwgSUVSICAgICAgQVdEM0lFICAgICAgICAgTExfQURDX0lzRW5hYmxlZElUX0FXRDMKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZElUX0FXRDMoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQVdEMykgPT0gKExMX0FEQ19JVF9BV0QzKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIEluaXRpYWxpemF0aW9uIG9mIHNvbWUgZmVhdHVyZXMgb2YgQURDIGNvbW1vbiBwYXJhbWV0ZXJzIGFuZCBtdWx0aW1vZGUgKi8KK0Vycm9yU3RhdHVzIExMX0FEQ19Db21tb25EZUluaXQoQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pOworRXJyb3JTdGF0dXMgTExfQURDX0NvbW1vbkluaXQoQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04sIExMX0FEQ19Db21tb25Jbml0VHlwZURlZiAqQURDX0NvbW1vbkluaXRTdHJ1Y3QpOwordm9pZCAgICAgICAgTExfQURDX0NvbW1vblN0cnVjdEluaXQoTExfQURDX0NvbW1vbkluaXRUeXBlRGVmICpBRENfQ29tbW9uSW5pdFN0cnVjdCk7CisKKy8qIERlLWluaXRpYWxpemF0aW9uIG9mIEFEQyBpbnN0YW5jZSwgQURDIGdyb3VwIHJlZ3VsYXIgYW5kIEFEQyBncm91cCBpbmplY3RlZCAqLworLyogKGF2YWlsYWJpbGl0eSBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQgZGVwZW5kcyBvbiBTVE0zMiBmYW1pbGllcykgKi8KK0Vycm9yU3RhdHVzIExMX0FEQ19EZUluaXQoQURDX1R5cGVEZWYgKkFEQ3gpOworCisvKiBJbml0aWFsaXphdGlvbiBvZiBzb21lIGZlYXR1cmVzIG9mIEFEQyBpbnN0YW5jZSAqLworRXJyb3JTdGF0dXMgTExfQURDX0luaXQoQURDX1R5cGVEZWYgKkFEQ3gsIExMX0FEQ19Jbml0VHlwZURlZiAqQURDX0luaXRTdHJ1Y3QpOwordm9pZCAgICAgICAgTExfQURDX1N0cnVjdEluaXQoTExfQURDX0luaXRUeXBlRGVmICpBRENfSW5pdFN0cnVjdCk7CisKKy8qIEluaXRpYWxpemF0aW9uIG9mIHNvbWUgZmVhdHVyZXMgb2YgQURDIGluc3RhbmNlIGFuZCBBREMgZ3JvdXAgcmVndWxhciAqLworRXJyb3JTdGF0dXMgTExfQURDX1JFR19Jbml0KEFEQ19UeXBlRGVmICpBREN4LCBMTF9BRENfUkVHX0luaXRUeXBlRGVmICpBRENfUkVHX0luaXRTdHJ1Y3QpOwordm9pZCAgICAgICAgTExfQURDX1JFR19TdHJ1Y3RJbml0KExMX0FEQ19SRUdfSW5pdFR5cGVEZWYgKkFEQ19SRUdfSW5pdFN0cnVjdCk7CisKKy8qIEluaXRpYWxpemF0aW9uIG9mIHNvbWUgZmVhdHVyZXMgb2YgQURDIGluc3RhbmNlIGFuZCBBREMgZ3JvdXAgaW5qZWN0ZWQgKi8KK0Vycm9yU3RhdHVzIExMX0FEQ19JTkpfSW5pdChBRENfVHlwZURlZiAqQURDeCwgTExfQURDX0lOSl9Jbml0VHlwZURlZiAqQURDX0lOSl9Jbml0U3RydWN0KTsKK3ZvaWQgICAgICAgIExMX0FEQ19JTkpfU3RydWN0SW5pdChMTF9BRENfSU5KX0luaXRUeXBlRGVmICpBRENfSU5KX0luaXRTdHJ1Y3QpOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogQURDMSB8fCBBREMyIHx8IEFEQzMgfHwgQURDNCAqLworCisKKyNlbmRpZiAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzMTh4eCB8fCBTVE0zMkYzMjh4eCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzNTh4eCB8fCBTVE0zMkYzOTh4eCAqLworCisjaWYgZGVmaW5lZCAoQURDMV9WMl81KQorCisjaWYgZGVmaW5lZCAoQURDMSkKKworLyoqIEBkZWZncm91cCBBRENfTEwgQURDCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEFEQ19MTF9Qcml2YXRlX0NvbnN0YW50cyBBREMgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiBJbnRlcm5hbCBtYXNrIGZvciBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVG8gc2VsZWN0IGludG8gbGl0ZXJhbCBMTF9BRENfUkVHX1JBTktfeCB0aGUgcmVsZXZhbnQgYml0cyBmb3I6ICAgICAgICAgICAgKi8KKy8qIC0gc2VxdWVuY2VyIHJlZ2lzdGVyIG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtIHNlcXVlbmNlciByYW5rIGJpdHMgcG9zaXRpb24gaW50byB0aGUgc2VsZWN0ZWQgcmVnaXN0ZXIgICAgICAgICAgICAgICAgICAqLworCisvKiBJbnRlcm5hbCByZWdpc3RlciBvZmZzZXQgZm9yIEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBjb25maWd1cmF0aW9uICovCisvKiAob2Zmc2V0IHBsYWNlZCBpbnRvIGEgc3BhcmUgYXJlYSBvZiBsaXRlcmFsIGRlZmluaXRpb24pICovCisjZGVmaW5lIEFEQ19TUVIxX1JFR09GRlNFVCAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgQURDX1NRUjJfUkVHT0ZGU0VUICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAxMDBVKQorI2RlZmluZSBBRENfU1FSM19SRUdPRkZTRVQgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDIwMFUpCisjZGVmaW5lIEFEQ19TUVI0X1JFR09GRlNFVCAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMzAwVSkKKworI2RlZmluZSBBRENfUkVHX1NRUlhfUkVHT0ZGU0VUX01BU0sgICAgICAgIChBRENfU1FSMV9SRUdPRkZTRVQgfCBBRENfU1FSMl9SRUdPRkZTRVQgfCBBRENfU1FSM19SRUdPRkZTRVQgfCBBRENfU1FSNF9SRUdPRkZTRVQpCisjZGVmaW5lIEFEQ19SRUdfUkFOS19JRF9TUVJYX01BU0sgICAgICAgICAgKEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLX1BPU0JJVDApCisKKy8qIERlZmluaXRpb24gb2YgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGJpdHMgaW5mb3JtYXRpb24gdG8gYmUgaW5zZXJ0ZWQgICovCisvKiBpbnRvIEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rcyBsaXRlcmFscyBkZWZpbml0aW9uLiAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRENfUkVHX1JBTktfMV9TUVJYX0JJVE9GRlNFVF9QT1MgICgodWludDMyX3QpIDBVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfU1FSM19TUTEpICovCisjZGVmaW5lIEFEQ19SRUdfUkFOS18yX1NRUlhfQklUT0ZGU0VUX1BPUyAgKCh1aW50MzJfdCkgNVUpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19TUVIzX1NRMikgKi8KKyNkZWZpbmUgQURDX1JFR19SQU5LXzNfU1FSWF9CSVRPRkZTRVRfUE9TICAoKHVpbnQzMl90KTEwVSkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NRUjNfU1EzKSAqLworI2RlZmluZSBBRENfUkVHX1JBTktfNF9TUVJYX0JJVE9GRlNFVF9QT1MgICgodWludDMyX3QpMTVVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfU1FSM19TUTQpICovCisjZGVmaW5lIEFEQ19SRUdfUkFOS181X1NRUlhfQklUT0ZGU0VUX1BPUyAgKCh1aW50MzJfdCkyMFUpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19TUVIzX1NRNSkgKi8KKyNkZWZpbmUgQURDX1JFR19SQU5LXzZfU1FSWF9CSVRPRkZTRVRfUE9TICAoKHVpbnQzMl90KTI1VSkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NRUjNfU1E2KSAqLworI2RlZmluZSBBRENfUkVHX1JBTktfN19TUVJYX0JJVE9GRlNFVF9QT1MgICgodWludDMyX3QpIDBVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfU1FSMl9TUTcpICovCisjZGVmaW5lIEFEQ19SRUdfUkFOS184X1NRUlhfQklUT0ZGU0VUX1BPUyAgKCh1aW50MzJfdCkgNVUpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19TUVIyX1NROCkgKi8KKyNkZWZpbmUgQURDX1JFR19SQU5LXzlfU1FSWF9CSVRPRkZTRVRfUE9TICAoKHVpbnQzMl90KTEwVSkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NRUjJfU1E5KSAqLworI2RlZmluZSBBRENfUkVHX1JBTktfMTBfU1FSWF9CSVRPRkZTRVRfUE9TICgodWludDMyX3QpMTVVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfU1FSMl9TUTEwKSAqLworI2RlZmluZSBBRENfUkVHX1JBTktfMTFfU1FSWF9CSVRPRkZTRVRfUE9TICgodWludDMyX3QpMjBVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfU1FSMl9TUTExKSAqLworI2RlZmluZSBBRENfUkVHX1JBTktfMTJfU1FSWF9CSVRPRkZTRVRfUE9TICgodWludDMyX3QpMjVVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfU1FSMl9TUTEyKSAqLworI2RlZmluZSBBRENfUkVHX1JBTktfMTNfU1FSWF9CSVRPRkZTRVRfUE9TICgodWludDMyX3QpIDBVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfU1FSMV9TUTEzKSAqLworI2RlZmluZSBBRENfUkVHX1JBTktfMTRfU1FSWF9CSVRPRkZTRVRfUE9TICgodWludDMyX3QpIDVVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfU1FSMV9TUTE0KSAqLworI2RlZmluZSBBRENfUkVHX1JBTktfMTVfU1FSWF9CSVRPRkZTRVRfUE9TICgodWludDMyX3QpMTBVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfU1FSMV9TUTE1KSAqLworI2RlZmluZSBBRENfUkVHX1JBTktfMTZfU1FSWF9CSVRPRkZTRVRfUE9TICgodWludDMyX3QpMTVVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfU1FSMV9TUTE2KSAqLworCisKKworLyogSW50ZXJuYWwgbWFzayBmb3IgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRvIHNlbGVjdCBpbnRvIGxpdGVyYWwgTExfQURDX0lOSl9SQU5LX3ggdGhlIHJlbGV2YW50IGJpdHMgZm9yOiAgICAgICAgICAgICovCisvKiAtIGRhdGEgcmVnaXN0ZXIgb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLSBvZmZzZXQgcmVnaXN0ZXIgb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0gc2VxdWVuY2VyIHJhbmsgYml0cyBwb3NpdGlvbiBpbnRvIHRoZSBzZWxlY3RlZCByZWdpc3RlciAgICAgICAgICAgICAgICAgICovCisKKy8qIEludGVybmFsIHJlZ2lzdGVyIG9mZnNldCBmb3IgQURDIGdyb3VwIGluamVjdGVkIGRhdGEgcmVnaXN0ZXIgKi8KKy8qIChvZmZzZXQgcGxhY2VkIGludG8gYSBzcGFyZSBhcmVhIG9mIGxpdGVyYWwgZGVmaW5pdGlvbikgKi8KKyNkZWZpbmUgQURDX0pEUjFfUkVHT0ZGU0VUICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQorI2RlZmluZSBBRENfSkRSMl9SRUdPRkZTRVQgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDEwMFUpCisjZGVmaW5lIEFEQ19KRFIzX1JFR09GRlNFVCAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMjAwVSkKKyNkZWZpbmUgQURDX0pEUjRfUkVHT0ZGU0VUICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAzMDBVKQorCisvKiBJbnRlcm5hbCByZWdpc3RlciBvZmZzZXQgZm9yIEFEQyBncm91cCBpbmplY3RlZCBvZmZzZXQgY29uZmlndXJhdGlvbiAqLworLyogKG9mZnNldCBwbGFjZWQgaW50byBhIHNwYXJlIGFyZWEgb2YgbGl0ZXJhbCBkZWZpbml0aW9uKSAqLworI2RlZmluZSBBRENfSk9GUjFfUkVHT0ZGU0VUICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisjZGVmaW5lIEFEQ19KT0ZSMl9SRUdPRkZTRVQgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAxMDAwVSkKKyNkZWZpbmUgQURDX0pPRlIzX1JFR09GRlNFVCAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDIwMDBVKQorI2RlZmluZSBBRENfSk9GUjRfUkVHT0ZGU0VUICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMzAwMFUpCisKKyNkZWZpbmUgQURDX0lOSl9KRFJYX1JFR09GRlNFVF9NQVNLICAgICAgICAoQURDX0pEUjFfUkVHT0ZGU0VUIHwgQURDX0pEUjJfUkVHT0ZGU0VUIHwgQURDX0pEUjNfUkVHT0ZGU0VUIHwgQURDX0pEUjRfUkVHT0ZGU0VUKQorI2RlZmluZSBBRENfSU5KX0pPRlJYX1JFR09GRlNFVF9NQVNLICAgICAgIChBRENfSk9GUjFfUkVHT0ZGU0VUIHwgQURDX0pPRlIyX1JFR09GRlNFVCB8IEFEQ19KT0ZSM19SRUdPRkZTRVQgfCBBRENfSk9GUjRfUkVHT0ZGU0VUKQorI2RlZmluZSBBRENfSU5KX1JBTktfSURfSlNRUl9NQVNLICAgICAgICAgIChBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTS19QT1NCSVQwKQorCisvKiBEZWZpbml0aW9uIG9mIEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgYml0cyBpbmZvcm1hdGlvbiB0byBiZSBpbnNlcnRlZCAqLworLyogaW50byBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIHJhbmtzIGxpdGVyYWxzIGRlZmluaXRpb24uICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX0lOSl9SQU5LXzFfSlNRUl9CSVRPRkZTRVRfUE9TICAoKHVpbnQzMl90KSAwVSkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX0pTUVJfSlNRMSkgKi8KKyNkZWZpbmUgQURDX0lOSl9SQU5LXzJfSlNRUl9CSVRPRkZTRVRfUE9TICAoKHVpbnQzMl90KSA1VSkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX0pTUVJfSlNRMikgKi8KKyNkZWZpbmUgQURDX0lOSl9SQU5LXzNfSlNRUl9CSVRPRkZTRVRfUE9TICAoKHVpbnQzMl90KTEwVSkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX0pTUVJfSlNRMykgKi8KKyNkZWZpbmUgQURDX0lOSl9SQU5LXzRfSlNRUl9CSVRPRkZTRVRfUE9TICAoKHVpbnQzMl90KTE1VSkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX0pTUVJfSlNRNCkgKi8KKworCisKKy8qIEludGVybmFsIG1hc2sgZm9yIEFEQyBjaGFubmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUbyBzZWxlY3QgaW50byBsaXRlcmFsIExMX0FEQ19DSEFOTkVMX3ggdGhlIHJlbGV2YW50IGJpdHMgZm9yOiAgICAgICAgICAgICAqLworLyogLSBjaGFubmVsIGlkZW50aWZpZXIgZGVmaW5lZCBieSBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0gY2hhbm5lbCBkaWZmZXJlbnRpYXRpb24gYmV0d2VlbiBleHRlcm5hbCBjaGFubmVscyAoY29ubmVjdGVkIHRvICAgICAgICAgICovCisvKiAgIEdQSU8gcGlucykgYW5kIGludGVybmFsIGNoYW5uZWxzIChjb25uZWN0ZWQgdG8gaW50ZXJuYWwgcGF0aHMpICAgICAgICAgICAqLworLyogLSBjaGFubmVsIHNhbXBsaW5nIHRpbWUgZGVmaW5lZCBieSBTTVBSeCByZWdpc3RlciBvZmZzZXQgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgYW5kIFNNUHggYml0cyBwb3NpdGlvbnMgaW50byBTTVBSeCByZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLICAgICAgICAgKEFEQ19DUjFfQVdEQ0gpCisjZGVmaW5lIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TICgodWludDMyX3QpIDBVKS8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLKSAqLworI2RlZmluZSBBRENfQ0hBTk5FTF9JRF9NQVNLICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSyB8IEFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIX01BU0spCisvKiBFcXVpdmFsZW50IG1hc2sgb2YgQURDX0NIQU5ORUxfTlVNQkVSX01BU0sgYWxpZ25lZCBvbiByZWdpc3RlciBMU0IgKGJpdCAwKSAqLworI2RlZmluZSBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTS19QT1NCSVQwICgodWludDMyX3QpMHgwMDAwMDAxRlUpIC8qIEVxdWl2YWxlbnQgdG8gc2hpZnQ6IChBRENfQ0hBTk5FTF9OVU1CRVJfTUFTSyA+PiBQT1NJVElPTl9WQUwoQURDX0NIQU5ORUxfTlVNQkVSX01BU0spKSAqLworCisvKiBDaGFubmVsIGRpZmZlcmVudGlhdGlvbiBiZXR3ZWVuIGV4dGVybmFsIGFuZCBpbnRlcm5hbCBjaGFubmVscyAqLworI2RlZmluZSBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSCAgICAgICAgICgodWludDMyX3QpMHg4MDAwMDAwMFUpIC8qIE1hcmtlciBvZiBpbnRlcm5hbCBjaGFubmVsICovCisjZGVmaW5lIEFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIXzIgICAgICAgKCh1aW50MzJfdCkweDQwMDAwMDAwVSkgLyogTWFya2VyIG9mIGludGVybmFsIGNoYW5uZWwgZm9yIG90aGVyIEFEQyBpbnN0YW5jZXMsIGluIGNhc2Ugb2YgZGlmZmVyZW50IEFEQyBpbnRlcm5hbCBjaGFubmVscyBtYXBwZWQgb24gc2FtZSBjaGFubmVsIG51bWJlciBvbiBkaWZmZXJlbnQgQURDIGluc3RhbmNlcyAqLworI2RlZmluZSBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSF9NQVNLICAgIChBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSCB8IEFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIXzIpCisKKy8qIEludGVybmFsIHJlZ2lzdGVyIG9mZnNldCBmb3IgQURDIGNoYW5uZWwgc2FtcGxpbmcgdGltZSBjb25maWd1cmF0aW9uICovCisvKiAob2Zmc2V0IHBsYWNlZCBpbnRvIGEgc3BhcmUgYXJlYSBvZiBsaXRlcmFsIGRlZmluaXRpb24pICovCisjZGVmaW5lIEFEQ19TTVBSMV9SRUdPRkZTRVQgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgQURDX1NNUFIyX1JFR09GRlNFVCAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDIwMDAwMDBVKQorI2RlZmluZSBBRENfQ0hBTk5FTF9TTVBSWF9SRUdPRkZTRVRfTUFTSyAgIChBRENfU01QUjFfUkVHT0ZGU0VUIHwgQURDX1NNUFIyX1JFR09GRlNFVCkKKworI2RlZmluZSBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9NQVNLICAgICgodWludDMyX3QpMHgwMUYwMDAwMFUpCisjZGVmaW5lIEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUyAgICAgKCh1aW50MzJfdCkyMFUpICAgICAgICAgICAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9NQVNLKSAqLworCisvKiBEZWZpbml0aW9uIG9mIGNoYW5uZWxzIElEIG51bWJlciBpbmZvcm1hdGlvbiB0byBiZSBpbnNlcnRlZCBpbnRvICAgICAgICAgICAqLworLyogY2hhbm5lbHMgbGl0ZXJhbHMgZGVmaW5pdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMF9OVU1CRVIgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xX05VTUJFUiAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ1IxX0FXRENIXzApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzJfTlVNQkVSICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DUjFfQVdEQ0hfMSAgICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgQURDX0NIQU5ORUxfM19OVU1CRVIgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NSMV9BV0RDSF8xIHwgQURDX0NSMV9BV0RDSF8wKQorI2RlZmluZSBBRENfQ0hBTk5FTF80X05VTUJFUiAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ1IxX0FXRENIXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzVfTlVNQkVSICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DUjFfQVdEQ0hfMiAgICAgICAgICAgICAgICAgICB8IEFEQ19DUjFfQVdEQ0hfMCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfNl9OVU1CRVIgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NSMV9BV0RDSF8yIHwgQURDX0NSMV9BV0RDSF8xICAgICAgICAgICAgICAgICAgKQorI2RlZmluZSBBRENfQ0hBTk5FTF83X05VTUJFUiAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ1IxX0FXRENIXzIgfCBBRENfQ1IxX0FXRENIXzEgfCBBRENfQ1IxX0FXRENIXzApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzhfTlVNQkVSICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgIEFEQ19DUjFfQVdEQ0hfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgQURDX0NIQU5ORUxfOV9OVU1CRVIgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgQURDX0NSMV9BV0RDSF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQURDX0NSMV9BV0RDSF8wKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xMF9OVU1CRVIgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICBBRENfQ1IxX0FXRENIXzMgICAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXRENIXzEgICAgICAgICAgICAgICAgICApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzExX05VTUJFUiAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgIEFEQ19DUjFfQVdEQ0hfMyAgICAgICAgICAgICAgICAgICB8IEFEQ19DUjFfQVdEQ0hfMSB8IEFEQ19DUjFfQVdEQ0hfMCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTJfTlVNQkVSICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgQURDX0NSMV9BV0RDSF8zIHwgQURDX0NSMV9BV0RDSF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xM19OVU1CRVIgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICBBRENfQ1IxX0FXRENIXzMgfCBBRENfQ1IxX0FXRENIXzIgICAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXRENIXzApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE0X05VTUJFUiAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgIEFEQ19DUjFfQVdEQ0hfMyB8IEFEQ19DUjFfQVdEQ0hfMiB8IEFEQ19DUjFfQVdEQ0hfMSAgICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTVfTlVNQkVSICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgQURDX0NSMV9BV0RDSF8zIHwgQURDX0NSMV9BV0RDSF8yIHwgQURDX0NSMV9BV0RDSF8xIHwgQURDX0NSMV9BV0RDSF8wKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xNl9OVU1CRVIgICAgICAgICAgICAgIChBRENfQ1IxX0FXRENIXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE3X05VTUJFUiAgICAgICAgICAgICAgKEFEQ19DUjFfQVdEQ0hfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFEQ19DUjFfQVdEQ0hfMCkKKworLyogRGVmaW5pdGlvbiBvZiBjaGFubmVscyBzYW1wbGluZyB0aW1lIGluZm9ybWF0aW9uIHRvIGJlIGluc2VydGVkIGludG8gICAgICAgKi8KKy8qIGNoYW5uZWxzIGxpdGVyYWxzIGRlZmluaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzBfU01QICAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMl9SRUdPRkZTRVQgfCAoKCh1aW50MzJfdCkgMFUpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NNUFIyX1NNUDApICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzFfU01QICAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMl9SRUdPRkZTRVQgfCAoKCh1aW50MzJfdCkgM1UpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NNUFIyX1NNUDEpICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzJfU01QICAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMl9SRUdPRkZTRVQgfCAoKCh1aW50MzJfdCkgNlUpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NNUFIyX1NNUDIpICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzNfU01QICAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMl9SRUdPRkZTRVQgfCAoKCh1aW50MzJfdCkgOVUpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NNUFIyX1NNUDMpICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzRfU01QICAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMl9SRUdPRkZTRVQgfCAoKCh1aW50MzJfdCkxMlUpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NNUFIyX1NNUDQpICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzVfU01QICAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMl9SRUdPRkZTRVQgfCAoKCh1aW50MzJfdCkxNVUpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NNUFIyX1NNUDUpICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzZfU01QICAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMl9SRUdPRkZTRVQgfCAoKCh1aW50MzJfdCkxOFUpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NNUFIyX1NNUDYpICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzdfU01QICAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMl9SRUdPRkZTRVQgfCAoKCh1aW50MzJfdCkyMVUpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NNUFIyX1NNUDcpICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzhfU01QICAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMl9SRUdPRkZTRVQgfCAoKCh1aW50MzJfdCkyNFUpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NNUFIyX1NNUDgpICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzlfU01QICAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMl9SRUdPRkZTRVQgfCAoKCh1aW50MzJfdCkyN1UpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NNUFIyX1NNUDkpICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzEwX1NNUCAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMV9SRUdPRkZTRVQgfCAoKCh1aW50MzJfdCkgMFUpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NNUFIxX1NNUDEwKSAqLworI2RlZmluZSBBRENfQ0hBTk5FTF8xMV9TTVAgICAgICAgICAgICAgICAgIChBRENfU01QUjFfUkVHT0ZGU0VUIHwgKCgodWludDMyX3QpIDNVKSA8PCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKSAvKiBWYWx1ZSBzaGlmdGVkIGlzIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19TTVBSMV9TTVAxMSkgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMTJfU01QICAgICAgICAgICAgICAgICAoQURDX1NNUFIxX1JFR09GRlNFVCB8ICgoKHVpbnQzMl90KSA2VSkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkgLyogVmFsdWUgc2hpZnRlZCBpcyBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfU01QUjFfU01QMTIpICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzEzX1NNUCAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMV9SRUdPRkZTRVQgfCAoKCh1aW50MzJfdCkgOVUpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NNUFIxX1NNUDEzKSAqLworI2RlZmluZSBBRENfQ0hBTk5FTF8xNF9TTVAgICAgICAgICAgICAgICAgIChBRENfU01QUjFfUkVHT0ZGU0VUIHwgKCgodWludDMyX3QpMTJVKSA8PCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKSAvKiBWYWx1ZSBzaGlmdGVkIGlzIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19TTVBSMV9TTVAxNCkgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMTVfU01QICAgICAgICAgICAgICAgICAoQURDX1NNUFIxX1JFR09GRlNFVCB8ICgoKHVpbnQzMl90KTE1VSkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkgLyogVmFsdWUgc2hpZnRlZCBpcyBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfU01QUjFfU01QMTUpICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE2X1NNUCAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMV9SRUdPRkZTRVQgfCAoKCh1aW50MzJfdCkxOFUpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1NNUFIxX1NNUDE2KSAqLworI2RlZmluZSBBRENfQ0hBTk5FTF8xN19TTVAgICAgICAgICAgICAgICAgIChBRENfU01QUjFfUkVHT0ZGU0VUIHwgKCgodWludDMyX3QpMjFVKSA8PCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKSAvKiBWYWx1ZSBzaGlmdGVkIGlzIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19TTVBSMV9TTVAxNykgKi8KKworCisvKiBJbnRlcm5hbCBtYXNrIGZvciBBREMgYW5hbG9nIHdhdGNoZG9nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVG8gc2VsZWN0IGludG8gbGl0ZXJhbHMgTExfQURDX0FXRF9DSEFOTkVMeF94eHggdGhlIHJlbGV2YW50IGJpdHMgZm9yOiAgICAgKi8KKy8qIChjb25jYXRlbmF0aW9uIG9mIG11bHRpcGxlIGJpdHMgdXNlZCBpbiBkaWZmZXJlbnQgYW5hbG9nIHdhdGNoZG9ncywgICAgICAgICovCisvKiAoZmVhdHVyZSBvZiBzZXZlcmFsIHdhdGNoZG9ncyBub3QgYXZhaWxhYmxlIG9uIGFsbCBTVE0zMiBmYW1pbGllcykpLiAgICAgICAqLworLyogLSBhbmFsb2cgd2F0Y2hkb2cgMTogbW9uaXRvcmVkIGNoYW5uZWwgZGVmaW5lZCBieSBudW1iZXIsICAgICAgICAgICAgICAgICAgKi8KKy8qICAgc2VsZWN0aW9uIG9mIEFEQyBncm91cCAoQURDIGdyb3VwcyByZWd1bGFyIGFuZC1vciBpbmplY3RlZCkuICAgICAgICAgICAgICovCisKKy8qIEludGVybmFsIHJlZ2lzdGVyIG9mZnNldCBmb3IgQURDIGFuYWxvZyB3YXRjaGRvZyBjaGFubmVsIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgQURDX0FXRF9DUjFfUkVHT0ZGU0VUICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQorCisjZGVmaW5lIEFEQ19BV0RfQ1JYX1JFR09GRlNFVF9NQVNLICAgICAgICAgKEFEQ19BV0RfQ1IxX1JFR09GRlNFVCkKKworI2RlZmluZSBBRENfQVdEX0NSMV9DSEFOTkVMX01BU0sgICAgICAgICAgIChBRENfQ1IxX0FXRENIIHwgQURDX0NSMV9KQVdERU4gfCBBRENfQ1IxX0FXREVOIHwgQURDX0NSMV9BV0RTR0wpCisjZGVmaW5lIEFEQ19BV0RfQ1JfQUxMX0NIQU5ORUxfTUFTSyAgICAgICAgKEFEQ19BV0RfQ1IxX0NIQU5ORUxfTUFTSykKKworLyogSW50ZXJuYWwgcmVnaXN0ZXIgb2Zmc2V0IGZvciBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZCBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIEFEQ19BV0RfVFIxX0hJR0hfUkVHT0ZGU0VUICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgQURDX0FXRF9UUjFfTE9XX1JFR09GRlNFVCAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDFVKQorI2RlZmluZSBBRENfQVdEX1RSWF9SRUdPRkZTRVRfTUFTSyAgICAgICAgIChBRENfQVdEX1RSMV9ISUdIX1JFR09GRlNFVCB8IEFEQ19BV0RfVFIxX0xPV19SRUdPRkZTRVQpCisKKworLyogQURDIHJlZ2lzdGVycyBiaXRzIHBvc2l0aW9ucyAqLworI2RlZmluZSBBRENfQ1IxX0RVQUxNT0RfQklUT0ZGU0VUX1BPUyAgICAgICgodWludDMyX3QpMTZVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfQ1IxX0RVQUxNT0QpICovCisKKworLyogQURDIGludGVybmFsIGNoYW5uZWxzIHJlbGF0ZWQgZGVmaW5pdGlvbnMgKi8KKy8qIEludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlIFZyZWZJbnQgKi8KKyNkZWZpbmUgVlJFRklOVF9DQUxfQUREUiAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KikgKCh1aW50MzJfdCkweDFGRkZGN0JBVSkpIC8qIEludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlLCBhZGRyZXNzIG9mIHBhcmFtZXRlciBWUkVGSU5UX0NBTDogVnJlZkludCBBREMgcmF3IGRhdGEgYWNxdWlyZWQgYXQgdGVtcGVyYXR1cmUgMzAgRGVnQyAodG9sZXJhbmNlOiArLTUgRGVnQyksIFZyZWYrID0gMy4zIFYgKHRvbGVyYW5jZTogKy0xMCBtVikuICovCisjZGVmaW5lIFZSRUZJTlRfQ0FMX1ZSRUYgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkgMzMwMFUpICAgICAgICAgICAgICAgICAgICAvKiBBbmFsb2cgdm9sdGFnZSByZWZlcmVuY2UgKFZyZWYrKSB2YWx1ZSB3aXRoIHdoaWNoIHRlbXBlcmF0dXJlIHNlbnNvciBoYXMgYmVlbiBjYWxpYnJhdGVkIGluIHByb2R1Y3Rpb24gKHRvbGVyYW5jZTogKy0xMCBtVikgKHVuaXQ6IG1WKS4gKi8KKy8qIFRlbXBlcmF0dXJlIHNlbnNvciAqLworI2RlZmluZSBURU1QU0VOU09SX0NBTDFfQUREUiAgICAgICAgICAgICAgICgodWludDE2X3QqKSAoKHVpbnQzMl90KTB4MUZGRkY3QjhVKSkgLyogSW50ZXJuYWwgdGVtcGVyYXR1cmUgc2Vuc29yLCBhZGRyZXNzIG9mIHBhcmFtZXRlciBUU19DQUwxOiBPbiBTVE0zMkYzN3gsIHRlbXBlcmF0dXJlIHNlbnNvciBBREMgcmF3IGRhdGEgYWNxdWlyZWQgYXQgdGVtcGVyYXR1cmUgIDMwIERlZ0MgKHRvbGVyYW5jZTogKy01IERlZ0MpLCBWcmVmKyA9IDMuMyBWICh0b2xlcmFuY2U6ICstMTAgbVYpLiAqLworI2RlZmluZSBURU1QU0VOU09SX0NBTDJfQUREUiAgICAgICAgICAgICAgICgodWludDE2X3QqKSAoKHVpbnQzMl90KTB4MUZGRkY3QzJVKSkgLyogSW50ZXJuYWwgdGVtcGVyYXR1cmUgc2Vuc29yLCBhZGRyZXNzIG9mIHBhcmFtZXRlciBUU19DQUwyOiBPbiBTVE0zMkYzN3gsIHRlbXBlcmF0dXJlIHNlbnNvciBBREMgcmF3IGRhdGEgYWNxdWlyZWQgYXQgdGVtcGVyYXR1cmUgMTEwIERlZ0MgKHRvbGVyYW5jZTogKy01IERlZ0MpLCBWcmVmKyA9IDMuMyBWICh0b2xlcmFuY2U6ICstMTAgbVYpLiAqLworI2RlZmluZSBURU1QU0VOU09SX0NBTDFfVEVNUCAgICAgICAgICAgICAgICgoIGludDMyX3QpICAgMzApICAgICAgICAgICAgICAgICAgICAgLyogSW50ZXJuYWwgdGVtcGVyYXR1cmUgc2Vuc29yLCB0ZW1wZXJhdHVyZSBhdCB3aGljaCB0ZW1wZXJhdHVyZSBzZW5zb3IgaGFzIGJlZW4gY2FsaWJyYXRlZCBpbiBwcm9kdWN0aW9uIGZvciBkYXRhIGludG8gVEVNUFNFTlNPUl9DQUwxX0FERFIgKHRvbGVyYW5jZTogKy01IERlZ0MpICh1bml0OiBEZWdDKS4gKi8KKyNkZWZpbmUgVEVNUFNFTlNPUl9DQUwyX1RFTVAgICAgICAgICAgICAgICAoKCBpbnQzMl90KSAgMTEwKSAgICAgICAgICAgICAgICAgICAgIC8qIEludGVybmFsIHRlbXBlcmF0dXJlIHNlbnNvciwgdGVtcGVyYXR1cmUgYXQgd2hpY2ggdGVtcGVyYXR1cmUgc2Vuc29yIGhhcyBiZWVuIGNhbGlicmF0ZWQgaW4gcHJvZHVjdGlvbiBmb3IgZGF0YSBpbnRvIFRFTVBTRU5TT1JfQ0FMMl9BRERSICh0b2xlcmFuY2U6ICstNSBEZWdDKSAodW5pdDogRGVnQykuICovCisjZGVmaW5lIFRFTVBTRU5TT1JfQ0FMX1ZSRUZBTkFMT0cgICAgICAgICAgKCh1aW50MzJfdCkgMzMwMFUpICAgICAgICAgICAgICAgICAgICAvKiBBbmFsb2cgdm9sdGFnZSByZWZlcmVuY2UgKFZyZWYrKSB2b2x0YWdlIHdpdGggd2hpY2ggdGVtcGVyYXR1cmUgc2Vuc29yIGhhcyBiZWVuIGNhbGlicmF0ZWQgaW4gcHJvZHVjdGlvbiAoKy0xMCBtVikgKHVuaXQ6IG1WKS4gKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEFEQ19MTF9Qcml2YXRlX01hY3JvcyBBREMgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERyaXZlciBtYWNybyByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlOiBpc29sYXRlIGJpdHMgd2l0aCB0aGUKKyAgKiAgICAgICAgIHNlbGVjdGVkIG1hc2sgYW5kIHNoaWZ0IHRoZW0gdG8gdGhlIHJlZ2lzdGVyIExTQgorICAqICAgICAgICAgKHNoaWZ0IG1hc2sgb24gcmVnaXN0ZXIgcG9zaXRpb24gYml0IDApLgorICAqIEBwYXJhbSAgX19CSVRTX18gQml0cyBpbiByZWdpc3RlciAzMiBiaXRzCisgICogQHBhcmFtICBfX01BU0tfXyBNYXNrIGluIHJlZ2lzdGVyIDMyIGJpdHMKKyAgKiBAcmV0dmFsIEJpdHMgaW4gcmVnaXN0ZXIgMzIgYml0cworICAqLworI2RlZmluZSBfX0FEQ19NQVNLX1NISUZUKF9fQklUU19fLCBfX01BU0tfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19CSVRTX18pICYgKF9fTUFTS19fKSkgPj4gUE9TSVRJT05fVkFMKChfX01BU0tfXykpKQorCisvKioKKyAgKiBAYnJpZWYgIERyaXZlciBtYWNybyByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlOiBzZXQgYSBwb2ludGVyIHRvCisgICogICAgICAgICBhIHJlZ2lzdGVyIGZyb20gYSByZWdpc3RlciBiYXNpcyBmcm9tIHdoaWNoIGFuIG9mZnNldAorICAqICAgICAgICAgaXMgYXBwbGllZC4KKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgYmFzaXMgZnJvbSB3aGljaCB0aGUgb2Zmc2V0IGlzIGFwcGxpZWQuCisgICogQHBhcmFtICBfX1JFR19PRkZGU0VUX18gT2Zmc2V0IHRvIGJlIGFwcGxpZWQgKHVuaXQ6IG51bWJlciBvZiByZWdpc3RlcnMpLgorICAqIEByZXR2YWwgUG9pbnRlciB0byByZWdpc3RlciBhZGRyZXNzCisgICovCisjZGVmaW5lIF9fQURDX1BUUl9SRUdfT0ZGU0VUKF9fUkVHX18sIF9fUkVHX09GRkZTRVRfXykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICgodWludDMyX3QgKikoKHVpbnQzMl90KSAoKHVpbnQzMl90KSgmKF9fUkVHX18pKSArICgoX19SRUdfT0ZGRlNFVF9fKSA8PCAyVSkpKSkKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBBRENfTExfRVNfSU5JVCBBREMgRXhwb3J0ZWQgSW5pdCBzdHJ1Y3R1cmUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFN0cnVjdHVyZSBkZWZpbml0aW9uIG9mIHNvbWUgZmVhdHVyZXMgb2YgQURDIGluc3RhbmNlLgorICAqIEBub3RlICAgVGhlc2UgcGFyYW1ldGVycyBoYXZlIGFuIGltcGFjdCBvbiBBREMgc2NvcGU6IEFEQyBpbnN0YW5jZS4KKyAgKiAgICAgICAgIEFmZmVjdHMgYm90aCBncm91cCByZWd1bGFyIGFuZCBncm91cCBpbmplY3RlZCAoYXZhaWxhYmlsaXR5CisgICogICAgICAgICBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQgZGVwZW5kcyBvbiBTVE0zMiBmYW1pbGllcykuCisgICogICAgICAgICBSZWZlciB0byBjb3JyZXNwb25kaW5nIHVuaXRhcnkgZnVuY3Rpb25zIGludG8KKyAgKiAgICAgICAgIEByZWYgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX0luc3RhbmNlIC4KKyAgKiBAbm90ZSAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgYnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfSW5pdCgpCisgICogICAgICAgICBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgaW5zdGFuY2UgbXVzdCBiZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgY29uZGl0aW9uIGlzIGFwcGxpZWQgdG8gYWxsIEFEQyBmZWF0dXJlcywgZm9yIGVmZmljaWVuY3kKKyAgKiAgICAgICAgIGFuZCBjb21wYXRpYmlsaXR5IG92ZXIgYWxsIFNUTTMyIGZhbWlsaWVzLiBIb3dldmVyLCB0aGUgZGlmZmVyZW50CisgICogICAgICAgICBmZWF0dXJlcyBjYW4gYmUgc2V0IHVuZGVyIGRpZmZlcmVudCBBREMgc3RhdGUgY29uZGl0aW9ucworICAqICAgICAgICAgKHNldHRpbmcgcG9zc2libGUgd2l0aCBBREMgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcsCisgICogICAgICAgICBBREMgZW5hYmxlZCB3aXRoIGNvbnZlcnNpb24gb24gZ29pbmcsIC4uLikKKyAgKiAgICAgICAgIEVhY2ggZmVhdHVyZSBjYW4gYmUgdXBkYXRlZCBhZnRlcndhcmRzIHdpdGggYSB1bml0YXJ5IGZ1bmN0aW9uCisgICogICAgICAgICBhbmQgcG90ZW50aWFsbHkgd2l0aCBBREMgaW4gYSBkaWZmZXJlbnQgc3RhdGUgdGhhbiBkaXNhYmxlZCwKKyAgKiAgICAgICAgIHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIGVhY2ggZnVuY3Rpb24gZm9yIHNldHRpbmcKKyAgKiAgICAgICAgIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZS4KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IERhdGFBbGlnbm1lbnQ7ICAgICAgICAgICAgICAgLyohPCBTZXQgQURDIGNvbnZlcnNpb24gZGF0YSBhbGlnbm1lbnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19MTF9FQ19EQVRBX0FMSUdOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX1NldERhdGFBbGlnbm1lbnQoKS4gKi8KKworICB1aW50MzJfdCBTZXF1ZW5jZXJzU2Nhbk1vZGU7ICAgICAgICAgIC8qITwgU2V0IEFEQyBzY2FuIHNlbGVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX1NDQU5fU0VMRUNUSU9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX1NldFNlcXVlbmNlcnNTY2FuTW9kZSgpLiAqLworCit9IExMX0FEQ19Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBvZiBzb21lIGZlYXR1cmVzIG9mIEFEQyBncm91cCByZWd1bGFyLgorICAqIEBub3RlICAgVGhlc2UgcGFyYW1ldGVycyBoYXZlIGFuIGltcGFjdCBvbiBBREMgc2NvcGU6IEFEQyBncm91cCByZWd1bGFyLgorICAqICAgICAgICAgUmVmZXIgdG8gY29ycmVzcG9uZGluZyB1bml0YXJ5IGZ1bmN0aW9ucyBpbnRvCisgICogICAgICAgICBAcmVmIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0FEQ19Hcm91cF9SZWd1bGFyCisgICogICAgICAgICAoZnVuY3Rpb25zIHdpdGggcHJlZml4ICJSRUciKS4KKyAgKiBAbm90ZSAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgYnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX0luaXQoKQorICAqICAgICAgICAgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIGluc3RhbmNlIG11c3QgYmUgZGlzYWJsZWQuCisgICogICAgICAgICBUaGlzIGNvbmRpdGlvbiBpcyBhcHBsaWVkIHRvIGFsbCBBREMgZmVhdHVyZXMsIGZvciBlZmZpY2llbmN5CisgICogICAgICAgICBhbmQgY29tcGF0aWJpbGl0eSBvdmVyIGFsbCBTVE0zMiBmYW1pbGllcy4gSG93ZXZlciwgdGhlIGRpZmZlcmVudAorICAqICAgICAgICAgZmVhdHVyZXMgY2FuIGJlIHNldCB1bmRlciBkaWZmZXJlbnQgQURDIHN0YXRlIGNvbmRpdGlvbnMKKyAgKiAgICAgICAgIChzZXR0aW5nIHBvc3NpYmxlIHdpdGggQURDIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nLAorICAqICAgICAgICAgQURDIGVuYWJsZWQgd2l0aCBjb252ZXJzaW9uIG9uIGdvaW5nLCAuLi4pCisgICogICAgICAgICBFYWNoIGZlYXR1cmUgY2FuIGJlIHVwZGF0ZWQgYWZ0ZXJ3YXJkcyB3aXRoIGEgdW5pdGFyeSBmdW5jdGlvbgorICAqICAgICAgICAgYW5kIHBvdGVudGlhbGx5IHdpdGggQURDIGluIGEgZGlmZmVyZW50IHN0YXRlIHRoYW4gZGlzYWJsZWQsCisgICogICAgICAgICByZWZlciB0byBkZXNjcmlwdGlvbiBvZiBlYWNoIGZ1bmN0aW9uIGZvciBzZXR0aW5nCisgICogICAgICAgICBjb25kaXRpb25lZCB0byBBREMgc3RhdGUuCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBUcmlnZ2VyU291cmNlOyAgICAgICAgICAgICAgIC8qITwgU2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBzb3VyY2U6IGludGVybmFsIChTVyBzdGFydCkgb3IgZXh0ZXJuYWwgZnJvbSB0aW1lciBvciBleHRlcm5hbCBpbnRlcnJ1cHQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19MTF9FQ19SRUdfVFJJR0dFUl9TT1VSQ0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIE9uIHRoaXMgU1RNMzIgc2VyaWUsIGV4dGVybmFsIHRyaWdnZXIgaXMgc2V0IHdpdGggdHJpZ2dlciBwb2xhcml0eTogcmlzaW5nIGVkZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbmx5IHRyaWdnZXIgcG9sYXJpdHkgYXZhaWxhYmxlIG9uIHRoaXMgU1RNMzIgc2VyaWUpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0VHJpZ2dlclNvdXJjZSgpLiAqLworCisgIHVpbnQzMl90IFNlcXVlbmNlckxlbmd0aDsgICAgICAgICAgICAgLyohPCBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGxlbmd0aC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX1JFR19TRVFfU0NBTl9MRU5HVEgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgcGFyYW1ldGVyIGlzIGRpc2NhcmRlZCBpZiBzY2FuIG1vZGUgaXMgZGlzYWJsZWQgKHJlZmVyIHRvIHBhcmFtZXRlciAnQURDX1NlcXVlbmNlcnNTY2FuTW9kZScpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyTGVuZ3RoKCkuICovCisKKyAgdWludDMyX3QgU2VxdWVuY2VyRGlzY29udDsgICAgICAgICAgICAvKiE8IFNldCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlOiBzZXF1ZW5jZSBzdWJkaXZpZGVkIGFuZCBzY2FuIGNvbnZlcnNpb25zIGludGVycnVwdGVkIGV2ZXJ5IHNlbGVjdGVkIG51bWJlciBvZiByYW5rcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX1JFR19TRVFfRElTQ09OVF9NT0RFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIHBhcmFtZXRlciBoYXMgYW4gZWZmZWN0IG9ubHkgaWYgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgaXMgZW5hYmxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNjYW4gbGVuZ3RoIG9mIDIgcmFua3Mgb3IgbW9yZSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJEaXNjb250KCkuICovCisKKyAgdWludDMyX3QgQ29udGludW91c01vZGU7ICAgICAgICAgICAgICAvKiE8IFNldCBBREMgY29udGludW91cyBjb252ZXJzaW9uIG1vZGUgb24gQURDIGdyb3VwIHJlZ3VsYXIsIHdoZXRoZXIgQURDIGNvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQgaW4gc2luZ2xlIG1vZGUgKG9uZSBjb252ZXJzaW9uIHBlciB0cmlnZ2VyKSBvciBpbiBjb250aW51b3VzIG1vZGUgKGFmdGVyIHRoZSBmaXJzdCB0cmlnZ2VyLCBmb2xsb3dpbmcgY29udmVyc2lvbnMgbGF1bmNoZWQgc3VjY2Vzc2l2ZWx5IGF1dG9tYXRpY2FsbHkpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfTExfRUNfUkVHX0NPTlRJTlVPVVNfTU9ERQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogSXQgaXMgbm90IHBvc3NpYmxlIHRvIGVuYWJsZSBib3RoIEFEQyBncm91cCByZWd1bGFyIGNvbnRpbnVvdXMgbW9kZSBhbmQgZGlzY29udGludW91cyBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0Q29udGludW91c01vZGUoKS4gKi8KKworICB1aW50MzJfdCBETUFUcmFuc2ZlcjsgICAgICAgICAgICAgICAgIC8qITwgU2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gZGF0YSB0cmFuc2Zlcjogbm8gdHJhbnNmZXIgb3IgdHJhbnNmZXIgYnkgRE1BLCBhbmQgRE1BIHJlcXVlc3RzIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19MTF9FQ19SRUdfRE1BX1RSQU5TRkVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19TZXRETUFUcmFuc2ZlcigpLiAqLworCit9IExMX0FEQ19SRUdfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgU3RydWN0dXJlIGRlZmluaXRpb24gb2Ygc29tZSBmZWF0dXJlcyBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQuCisgICogQG5vdGUgICBUaGVzZSBwYXJhbWV0ZXJzIGhhdmUgYW4gaW1wYWN0IG9uIEFEQyBzY29wZTogQURDIGdyb3VwIGluamVjdGVkLgorICAqICAgICAgICAgUmVmZXIgdG8gY29ycmVzcG9uZGluZyB1bml0YXJ5IGZ1bmN0aW9ucyBpbnRvCisgICogICAgICAgICBAcmVmIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0FEQ19Hcm91cF9SZWd1bGFyCisgICogICAgICAgICAoZnVuY3Rpb25zIHdpdGggcHJlZml4ICJJTkoiKS4KKyAgKiBAbm90ZSAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgYnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfSU5KX0luaXQoKQorICAqICAgICAgICAgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIGluc3RhbmNlIG11c3QgYmUgZGlzYWJsZWQuCisgICogICAgICAgICBUaGlzIGNvbmRpdGlvbiBpcyBhcHBsaWVkIHRvIGFsbCBBREMgZmVhdHVyZXMsIGZvciBlZmZpY2llbmN5CisgICogICAgICAgICBhbmQgY29tcGF0aWJpbGl0eSBvdmVyIGFsbCBTVE0zMiBmYW1pbGllcy4gSG93ZXZlciwgdGhlIGRpZmZlcmVudAorICAqICAgICAgICAgZmVhdHVyZXMgY2FuIGJlIHNldCB1bmRlciBkaWZmZXJlbnQgQURDIHN0YXRlIGNvbmRpdGlvbnMKKyAgKiAgICAgICAgIChzZXR0aW5nIHBvc3NpYmxlIHdpdGggQURDIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nLAorICAqICAgICAgICAgQURDIGVuYWJsZWQgd2l0aCBjb252ZXJzaW9uIG9uIGdvaW5nLCAuLi4pCisgICogICAgICAgICBFYWNoIGZlYXR1cmUgY2FuIGJlIHVwZGF0ZWQgYWZ0ZXJ3YXJkcyB3aXRoIGEgdW5pdGFyeSBmdW5jdGlvbgorICAqICAgICAgICAgYW5kIHBvdGVudGlhbGx5IHdpdGggQURDIGluIGEgZGlmZmVyZW50IHN0YXRlIHRoYW4gZGlzYWJsZWQsCisgICogICAgICAgICByZWZlciB0byBkZXNjcmlwdGlvbiBvZiBlYWNoIGZ1bmN0aW9uIGZvciBzZXR0aW5nCisgICogICAgICAgICBjb25kaXRpb25lZCB0byBBREMgc3RhdGUuCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBUcmlnZ2VyU291cmNlOyAgICAgICAgICAgICAgIC8qITwgU2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgc291cmNlOiBpbnRlcm5hbCAoU1cgc3RhcnQpIG9yIGV4dGVybmFsIGZyb20gdGltZXIgb3IgZXh0ZXJuYWwgaW50ZXJydXB0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfTExfRUNfSU5KX1RSSUdHRVJfU09VUkNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBPbiB0aGlzIFNUTTMyIHNlcmllLCBleHRlcm5hbCB0cmlnZ2VyIGlzIHNldCB3aXRoIHRyaWdnZXIgcG9sYXJpdHk6IHJpc2luZyBlZGdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25seSB0cmlnZ2VyIHBvbGFyaXR5IGF2YWlsYWJsZSBvbiB0aGlzIFNUTTMyIHNlcmllKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfSU5KX1NldFRyaWdnZXJTb3VyY2UoKS4gKi8KKworICB1aW50MzJfdCBTZXF1ZW5jZXJMZW5ndGg7ICAgICAgICAgICAgIC8qITwgU2V0IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgbGVuZ3RoLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfTExfRUNfSU5KX1NFUV9TQ0FOX0xFTkdUSAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBwYXJhbWV0ZXIgaXMgZGlzY2FyZGVkIGlmIHNjYW4gbW9kZSBpcyBkaXNhYmxlZCAocmVmZXIgdG8gcGFyYW1ldGVyICdBRENfU2VxdWVuY2Vyc1NjYW5Nb2RlJykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX0lOSl9TZXRTZXF1ZW5jZXJMZW5ndGgoKS4gKi8KKworICB1aW50MzJfdCBTZXF1ZW5jZXJEaXNjb250OyAgICAgICAgICAgIC8qITwgU2V0IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlOiBzZXF1ZW5jZSBzdWJkaXZpZGVkIGFuZCBzY2FuIGNvbnZlcnNpb25zIGludGVycnVwdGVkIGV2ZXJ5IHNlbGVjdGVkIG51bWJlciBvZiByYW5rcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX0lOSl9TRVFfRElTQ09OVF9NT0RFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIHBhcmFtZXRlciBoYXMgYW4gZWZmZWN0IG9ubHkgaWYgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGlzIGVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzY2FuIGxlbmd0aCBvZiAyIHJhbmtzIG9yIG1vcmUpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0FEQ19JTkpfU2V0U2VxdWVuY2VyRGlzY29udCgpLiAqLworCisgIHVpbnQzMl90IFRyaWdBdXRvOyAgICAgICAgICAgICAgICAgICAgLyohPCBTZXQgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlcjogaW5kZXBlbmRlbnQgb3IgZnJvbSBBREMgZ3JvdXAgcmVndWxhci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX0lOSl9UUklHX0FVVE8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgc2V0IHRvIHNldCB0byBpbmRlcGVuZGVudCB0cmlnZ2VyIGlmIGluamVjdGVkIHRyaWdnZXIgc291cmNlIGlzIHNldCB0byBhbiBleHRlcm5hbCB0cmlnZ2VyLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfSU5KX1NldFRyaWdBdXRvKCkuICovCisKK30gTExfQURDX0lOSl9Jbml0VHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBBREMgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfRkxBRyBBREMgZmxhZ3MKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0FEQ19SZWFkUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfU1RSVCAgICAgICAgICAgICAgICAgICBBRENfU1JfU1RSVCAgICAgICAgLyohPCBBREMgZmxhZyBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHN0YXJ0ICovCisjZGVmaW5lIExMX0FEQ19GTEFHX0VPUyAgICAgICAgICAgICAgICAgICAgQURDX1NSX0VPQyAgICAgICAgIC8qITwgQURDIGZsYWcgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zIChOb3RlOiBvbiB0aGlzIFNUTTMyIHNlcmllLCB0aGVyZSBpcyBubyBmbGFnIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24uIEZsYWcgbm90ZWQgYXMgIkVPQyIgaXMgY29ycmVzcG9uZGluZyB0byBmbGFnICJFT1MiIGluIG90aGVyIFNUTTMyIGZhbWlsaWVzKSAqLworI2RlZmluZSBMTF9BRENfRkxBR19KU1RSVCAgICAgICAgICAgICAgICAgIEFEQ19TUl9KU1RSVCAgICAgICAvKiE8IEFEQyBmbGFnIEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHN0YXJ0ICovCisjZGVmaW5lIExMX0FEQ19GTEFHX0pFT1MgICAgICAgICAgICAgICAgICAgQURDX1NSX0pFT0MgICAgICAgIC8qITwgQURDIGZsYWcgQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucyAoTm90ZTogb24gdGhpcyBTVE0zMiBzZXJpZSwgdGhlcmUgaXMgbm8gZmxhZyBBREMgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbi4gRmxhZyBub3RlZCBhcyAiSkVPQyIgaXMgY29ycmVzcG9uZGluZyB0byBmbGFnICJKRU9TIiBpbiBvdGhlciBTVE0zMiBmYW1pbGllcykgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfQVdEMSAgICAgICAgICAgICAgICAgICBBRENfU1JfQVdEICAgICAgICAgLyohPCBBREMgZmxhZyBBREMgYW5hbG9nIHdhdGNoZG9nIDEgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0lUIEFEQyBpbnRlcnJ1cHRpb25zIGZvciBjb25maWd1cmF0aW9uIChpbnRlcnJ1cHRpb24gZW5hYmxlIG9yIGRpc2FibGUpCisgICogQGJyaWVmICAgIElUIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9BRENfUmVhZFJlZyBhbmQgIExMX0FEQ19Xcml0ZVJlZyBmdW5jdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfSVRfRU9TICAgICAgICAgICAgICAgICAgICAgIEFEQ19DUjFfRU9DSUUgICAgICAvKiE8IEFEQyBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zIChOb3RlOiBvbiB0aGlzIFNUTTMyIHNlcmllLCB0aGVyZSBpcyBubyBmbGFnIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24uIEZsYWcgbm90ZWQgYXMgIkVPQyIgaXMgY29ycmVzcG9uZGluZyB0byBmbGFnICJFT1MiIGluIG90aGVyIFNUTTMyIGZhbWlsaWVzKSAqLworI2RlZmluZSBMTF9BRENfSVRfSkVPUyAgICAgICAgICAgICAgICAgICAgIEFEQ19DUjFfSkVPQ0lFICAgICAvKiE8IEFEQyBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucyAoTm90ZTogb24gdGhpcyBTVE0zMiBzZXJpZSwgdGhlcmUgaXMgbm8gZmxhZyBBREMgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbi4gRmxhZyBub3RlZCBhcyAiSkVPQyIgaXMgY29ycmVzcG9uZGluZyB0byBmbGFnICJKRU9TIiBpbiBvdGhlciBTVE0zMiBmYW1pbGllcykgKi8KKyNkZWZpbmUgTExfQURDX0lUX0FXRDEgICAgICAgICAgICAgICAgICAgICBBRENfQ1IxX0FXRElFICAgICAgLyohPCBBREMgaW50ZXJydXB0aW9uIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfUkVHSVNURVJTICBBREMgcmVnaXN0ZXJzIGNvbXBsaWFudCB3aXRoIHNwZWNpZmljIHB1cnBvc2UKKyAgKiBAeworICAqLworLyogTGlzdCBvZiBBREMgcmVnaXN0ZXJzIGludGVuZGVkIHRvIGJlIHVzZWQgKG1vc3QgY29tbW9ubHkpIHdpdGggICAgICAgICAgICAgKi8KKy8qIERNQSB0cmFuc2Zlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19ETUFfR2V0UmVnQWRkcigpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9BRENfRE1BX1JFR19SRUdVTEFSX0RBVEEgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyogQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhIHJlZ2lzdGVyIChjb3JyZXNwb25kaW5nIHRvIHJlZ2lzdGVyIERSKSB0byBiZSB1c2VkIHdpdGggQURDIGNvbmZpZ3VyZWQgaW4gaW5kZXBlbmRlbnQgbW9kZS4gV2l0aG91dCBETUEgdHJhbnNmZXIsIHJlZ2lzdGVyIGFjY2Vzc2VkIGJ5IExMIGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGEzMigpIGFuZCBvdGhlciBmdW5jdGlvbnMgQHJlZiBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YXgoKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfQ09NTU9OX1BBVEhfSU5URVJOQUwgIEFEQyBjb21tb24gLSBNZWFzdXJlbWVudCBwYXRoIHRvIGludGVybmFsIGNoYW5uZWxzCisgICogQHsKKyAgKi8KKy8qIE5vdGU6IE90aGVyIG1lYXN1cmVtZW50IHBhdGhzIHRvIGludGVybmFsIGNoYW5uZWxzIG1heSBiZSBhdmFpbGFibGUgICAgICAgICovCisvKiAgICAgICAoY29ubmVjdGlvbnMgdG8gb3RoZXIgcGVyaXBoZXJhbHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgSWYgdGhleSBhcmUgbm90IGxpc3RlZCBiZWxvdywgdGhleSBkbyBub3QgcmVxdWlyZSBhbnkgc3BlY2lmaWMgICAgICAgKi8KKy8qICAgICAgIHBhdGggZW5hYmxlLiBJbiB0aGlzIGNhc2UsIEFjY2VzcyB0byBtZWFzdXJlbWVudCBwYXRoIGlzIGRvbmUgICAgICAgICovCisvKiAgICAgICBvbmx5IGJ5IHNlbGVjdGluZyB0aGUgY29ycmVzcG9uZGluZyBBREMgaW50ZXJuYWwgY2hhbm5lbC4gICAgICAgICAgICAqLworI2RlZmluZSBMTF9BRENfUEFUSF9JTlRFUk5BTF9OT05FICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpLyohPCBBREMgbWVhc3VyZW1lbnQgcGF0aGVzIGFsbCBkaXNhYmxlZCAqLworI2RlZmluZSBMTF9BRENfUEFUSF9JTlRFUk5BTF9WUkVGSU5UICAgICAgIChBRENfQ1IyX1RTVlJFRkUpICAgICAgLyohPCBBREMgbWVhc3VyZW1lbnQgcGF0aCB0byBpbnRlcm5hbCBjaGFubmVsIFZyZWZJbnQgKi8KKyNkZWZpbmUgTExfQURDX1BBVEhfSU5URVJOQUxfVEVNUFNFTlNPUiAgICAoQURDX0NSMl9UU1ZSRUZFKSAgICAgIC8qITwgQURDIG1lYXN1cmVtZW50IHBhdGggdG8gaW50ZXJuYWwgY2hhbm5lbCB0ZW1wZXJhdHVyZSBzZW5zb3IgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX1JFU09MVVRJT04gIEFEQyBpbnN0YW5jZSAtIFJlc29sdXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfUkVTT0xVVElPTl8xMkIgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAgIC8qITwgQURDIHJlc29sdXRpb24gMTIgYml0cyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfREFUQV9BTElHTiAgQURDIGluc3RhbmNlIC0gRGF0YSBhbGlnbm1lbnQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfREFUQV9BTElHTl9SSUdIVCAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpLyohPCBBREMgY29udmVyc2lvbiBkYXRhIGFsaWdubWVudDogcmlnaHQgYWxpZ25lZCAoYWxpZ25tZW50IG9uIGRhdGEgcmVnaXN0ZXIgTFNCIGJpdCAwKSovCisjZGVmaW5lIExMX0FEQ19EQVRBX0FMSUdOX0xFRlQgICAgICAgICAgICAgKEFEQ19DUjJfQUxJR04pICAgICAgICAvKiE8IEFEQyBjb252ZXJzaW9uIGRhdGEgYWxpZ25tZW50OiBsZWZ0IGFsaWduZWQgKGFsaWdtZW50IG9uIGRhdGEgcmVnaXN0ZXIgTVNCIGJpdCAxNSkqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfU0NBTl9TRUxFQ1RJT04gQURDIGluc3RhbmNlIC0gU2NhbiBzZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfU0VRX1NDQU5fRElTQUJMRSAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAvKiE8IEFEQyBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZCBpbiB1bml0YXJ5IGNvbnZlcnNpb24gbW9kZSAob25lIGNoYW5uZWwgY29udmVydGVkLCB0aGF0IGRlZmluZWQgaW4gcmFuayAxKS4gQ29uZmlndXJhdGlvbiBvZiBib3RoIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZCBzZXF1ZW5jZXJzIChzZXF1ZW5jZSBsZW5ndGgsIC4uLikgaXMgZGlzY2FyZGVkOiBlcXVpdmFsZW50IHRvIGxlbmd0aCBvZiAxIHJhbmsuKi8KKyNkZWZpbmUgTExfQURDX1NFUV9TQ0FOX0VOQUJMRSAgICAgICAgICAgICAoKHVpbnQzMl90KUFEQ19DUjFfU0NBTikgLyohPCBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCBpbiBzZXF1ZW5jZSBjb252ZXJzaW9ucyBtb2RlLCBhY2NvcmRpbmcgdG8gY29uZmlndXJhdGlvbiBvZiBib3RoIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZCBzZXF1ZW5jZXJzIChzZXF1ZW5jZSBsZW5ndGgsIC4uLikuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19HUk9VUFMgIEFEQyBpbnN0YW5jZSAtIEdyb3VwcworICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19HUk9VUF9SRUdVTEFSICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxVSkgLyohPCBBREMgZ3JvdXAgcmVndWxhciAoYXZhaWxhYmxlIG9uIGFsbCBTVE0zMiBkZXZpY2VzKSAqLworI2RlZmluZSBMTF9BRENfR1JPVVBfSU5KRUNURUQgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMlUpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIChub3QgYXZhaWxhYmxlIG9uIGFsbCBTVE0zMiBkZXZpY2VzKSovCisjZGVmaW5lIExMX0FEQ19HUk9VUF9SRUdVTEFSX0lOSkVDVEVEICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAzVSkgLyohPCBBREMgYm90aCBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0NIQU5ORUwgIEFEQyBpbnN0YW5jZSAtIENoYW5uZWwgbnVtYmVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfMCAgICAgICAgICAgICAgICAgICAoQURDX0NIQU5ORUxfMF9OVU1CRVIgIHwgQURDX0NIQU5ORUxfMF9TTVApICAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjAgICovCisjZGVmaW5lIExMX0FEQ19DSEFOTkVMXzEgICAgICAgICAgICAgICAgICAgKEFEQ19DSEFOTkVMXzFfTlVNQkVSICB8IEFEQ19DSEFOTkVMXzFfU01QKSAgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8yX05VTUJFUiAgfCBBRENfQ0hBTk5FTF8yX1NNUCkgIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMiAgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfMyAgICAgICAgICAgICAgICAgICAoQURDX0NIQU5ORUxfM19OVU1CRVIgIHwgQURDX0NIQU5ORUxfM19TTVApICAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjMgICovCisjZGVmaW5lIExMX0FEQ19DSEFOTkVMXzQgICAgICAgICAgICAgICAgICAgKEFEQ19DSEFOTkVMXzRfTlVNQkVSICB8IEFEQ19DSEFOTkVMXzRfU01QKSAgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU40ICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF81X05VTUJFUiAgfCBBRENfQ0hBTk5FTF81X1NNUCkgIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONSAgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfNiAgICAgICAgICAgICAgICAgICAoQURDX0NIQU5ORUxfNl9OVU1CRVIgIHwgQURDX0NIQU5ORUxfNl9TTVApICAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjYgICovCisjZGVmaW5lIExMX0FEQ19DSEFOTkVMXzcgICAgICAgICAgICAgICAgICAgKEFEQ19DSEFOTkVMXzdfTlVNQkVSICB8IEFEQ19DSEFOTkVMXzdfU01QKSAgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU43ICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF84ICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF84X05VTUJFUiAgfCBBRENfQ0hBTk5FTF84X1NNUCkgIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOOCAgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfOSAgICAgICAgICAgICAgICAgICAoQURDX0NIQU5ORUxfOV9OVU1CRVIgIHwgQURDX0NIQU5ORUxfOV9TTVApICAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjkgICovCisjZGVmaW5lIExMX0FEQ19DSEFOTkVMXzEwICAgICAgICAgICAgICAgICAgKEFEQ19DSEFOTkVMXzEwX05VTUJFUiB8IEFEQ19DSEFOTkVMXzEwX1NNUCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xMCAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xMSAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xMV9OVU1CRVIgfCBBRENfQ0hBTk5FTF8xMV9TTVApIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTEgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfMTIgICAgICAgICAgICAgICAgICAoQURDX0NIQU5ORUxfMTJfTlVNQkVSIHwgQURDX0NIQU5ORUxfMTJfU01QKSAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjEyICovCisjZGVmaW5lIExMX0FEQ19DSEFOTkVMXzEzICAgICAgICAgICAgICAgICAgKEFEQ19DSEFOTkVMXzEzX05VTUJFUiB8IEFEQ19DSEFOTkVMXzEzX1NNUCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xMyAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xNCAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xNF9OVU1CRVIgfCBBRENfQ0hBTk5FTF8xNF9TTVApIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTQgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfMTUgICAgICAgICAgICAgICAgICAoQURDX0NIQU5ORUxfMTVfTlVNQkVSIHwgQURDX0NIQU5ORUxfMTVfU01QKSAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE1ICovCisjZGVmaW5lIExMX0FEQ19DSEFOTkVMXzE2ICAgICAgICAgICAgICAgICAgKEFEQ19DSEFOTkVMXzE2X05VTUJFUiB8IEFEQ19DSEFOTkVMXzE2X1NNUCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xNiAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xNyAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xN19OVU1CRVIgfCBBRENfQ0hBTk5FTF8xN19TTVApIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTcgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICAgICAgICAoTExfQURDX0NIQU5ORUxfMTcgfCBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSCkgLyohPCBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gVnJlZkludDogSW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UuIE9uIFNUTTMyRjM3eCwgQURDIGNoYW5uZWwgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLiAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SICAgICAgICAgIChMTF9BRENfQ0hBTk5FTF8xNiB8IEFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIKSAvKiE8IEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBUZW1wZXJhdHVyZSBzZW5zb3IuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdfVFJJR0dFUl9TT1VSQ0UgIEFEQyBncm91cCByZWd1bGFyIC0gVHJpZ2dlciBzb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfU09GVFdBUkUgICAgICAgICAgIChBRENfQ1IyX0VYVFNFTF8yIHwgQURDX0NSMl9FWFRTRUxfMSB8IEFEQ19DUjJfRVhUU0VMXzApIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGludGVybmFsIChTVyBzdGFydCkgKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMiAgICAgICAoQURDX0NSMl9FWFRTRUxfMSB8IEFEQ19DUjJfRVhUU0VMXzApICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBleHRlcm5hbCBmcm9tIFRJTTIgQ0MyLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfVFJHTyAgICAgIChBRENfQ1IyX0VYVFNFTF8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGV4dGVybmFsIGZyb20gVElNMyBUUkdPLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfQ0gyICAgICAgIChBRENfQ1IyX0VYVFNFTF8yIHwgQURDX0NSMl9FWFRTRUxfMCkgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGV4dGVybmFsIGZyb20gVElNNCBDQzQuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMTlfVFJHTyAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZXh0ZXJuYWwgZnJvbSBUSU0xOSBUUkdPLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTE5X0NIMyAgICAgIChBRENfQ1IyX0VYVFNFTF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGV4dGVybmFsIGZyb20gVElNMTkgQ0MzLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTE5X0NINCAgICAgIChBRENfQ1IyX0VYVFNFTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGV4dGVybmFsIGZyb20gVElNMTkgQ0M0LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX0VYVElfTElORTExICAgIChBRENfQ1IyX0VYVFNFTF8yIHwgQURDX0NSMl9FWFRTRUxfMSkgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGV4dGVybmFsIGludGVycnVwdCBsaW5lIDExLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfUkVHX1RSSUdHRVJfRURHRSAgQURDIGdyb3VwIHJlZ3VsYXIgLSBUcmlnZ2VyIGVkZ2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1JJU0lORyAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBwb2xhcml0eSBzZXQgdG8gcmlzaW5nIGVkZ2UgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX1JFR19DT05USU5VT1VTX01PREUgIEFEQyBncm91cCByZWd1bGFyIC0gQ29udGludW91cyBtb2RlCisqIEB7CisqLworI2RlZmluZSBMTF9BRENfUkVHX0NPTlZfU0lOR0xFICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpLyohPCBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCBpbiBzaW5nbGUgbW9kZTogb25lIGNvbnZlcnNpb24gcGVyIHRyaWdnZXIgKi8KKyNkZWZpbmUgTExfQURDX1JFR19DT05WX0NPTlRJTlVPVVMgICAgICAgICAoQURDX0NSMl9DT05UKSAgICAgICAgIC8qITwgQURDIGNvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQgaW4gY29udGludW91cyBtb2RlOiBhZnRlciB0aGUgZmlyc3QgdHJpZ2dlciwgZm9sbG93aW5nIGNvbnZlcnNpb25zIGxhdW5jaGVkIHN1Y2Nlc3NpdmVseSBhdXRvbWF0aWNhbGx5ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdfRE1BX1RSQU5TRkVSICBBREMgZ3JvdXAgcmVndWxhciAtIERNQSB0cmFuc2ZlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX05PTkUgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgIC8qITwgQURDIGNvbnZlcnNpb25zIGFyZSBub3QgdHJhbnNmZXJyZWQgYnkgRE1BICovCisjZGVmaW5lIExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX1VOTElNSVRFRCAgKEFEQ19DUjJfRE1BKSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGNvbnZlcnNpb25zIGFyZSB0cmFuc2ZlcnJlZCBieSBETUEsIGluIHVubGltaXRlZCBtb2RlOiBETUEgdHJhbnNmZXIgcmVxdWVzdHMgYXJlIHVubGltaXRlZCwgd2hhdGV2ZXIgbnVtYmVyIG9mIERNQSBkYXRhIHRyYW5zZmVycmVkIChudW1iZXIgb2YgQURDIGNvbnZlcnNpb25zKS4gVGhpcyBBREMgbW9kZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggRE1BIG1vZGUgY2lyY3VsYXIuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdfU0VRX1NDQU5fTEVOR1RIICBBREMgZ3JvdXAgcmVndWxhciAtIFNlcXVlbmNlciBzY2FuIGxlbmd0aAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRElTQUJMRSAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZGlzYWJsZSAoZXF1aXZhbGVudCB0byBzZXF1ZW5jZXIgb2YgMSByYW5rOiBBREMgY29udmVyc2lvbiBvbiBvbmx5IDEgY2hhbm5lbCkgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMlJBTktTICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NRUjFfTF8wKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBlbmFibGUgd2l0aCAyIHJhbmtzIGluIHRoZSBzZXF1ZW5jZSAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8zUkFOS1MgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU1FSMV9MXzEgICAgICAgICAgICAgICApIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGVuYWJsZSB3aXRoIDMgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzRSQU5LUyAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19TUVIxX0xfMSB8IEFEQ19TUVIxX0xfMCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggNCByYW5rcyBpbiB0aGUgc2VxdWVuY2UgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfNVJBTktTICAoICAgICAgICAgICAgICAgQURDX1NRUjFfTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBlbmFibGUgd2l0aCA1IHJhbmtzIGluIHRoZSBzZXF1ZW5jZSAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV82UkFOS1MgICggICAgICAgICAgICAgICBBRENfU1FSMV9MXzIgICAgICAgICAgICAgICAgfCBBRENfU1FSMV9MXzApIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGVuYWJsZSB3aXRoIDYgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzdSQU5LUyAgKCAgICAgICAgICAgICAgIEFEQ19TUVIxX0xfMiB8IEFEQ19TUVIxX0xfMSAgICAgICAgICAgICAgICkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggNyByYW5rcyBpbiB0aGUgc2VxdWVuY2UgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfOFJBTktTICAoICAgICAgICAgICAgICAgQURDX1NRUjFfTF8yIHwgQURDX1NRUjFfTF8xIHwgQURDX1NRUjFfTF8wKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBlbmFibGUgd2l0aCA4IHJhbmtzIGluIHRoZSBzZXF1ZW5jZSAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV85UkFOS1MgIChBRENfU1FSMV9MXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGVuYWJsZSB3aXRoIDkgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzEwUkFOS1MgKEFEQ19TUVIxX0xfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFEQ19TUVIxX0xfMCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMTAgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzExUkFOS1MgKEFEQ19TUVIxX0xfMyAgICAgICAgICAgICAgICB8IEFEQ19TUVIxX0xfMSAgICAgICAgICAgICAgICkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMTEgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzEyUkFOS1MgKEFEQ19TUVIxX0xfMyAgICAgICAgICAgICAgICB8IEFEQ19TUVIxX0xfMSB8IEFEQ19TUVIxX0xfMCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMTIgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzEzUkFOS1MgKEFEQ19TUVIxX0xfMyB8IEFEQ19TUVIxX0xfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMTMgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzE0UkFOS1MgKEFEQ19TUVIxX0xfMyB8IEFEQ19TUVIxX0xfMiAgICAgICAgICAgICAgICB8IEFEQ19TUVIxX0xfMCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMTQgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzE1UkFOS1MgKEFEQ19TUVIxX0xfMyB8IEFEQ19TUVIxX0xfMiB8IEFEQ19TUVIxX0xfMSAgICAgICAgICAgICAgICkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMTUgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzE2UkFOS1MgKEFEQ19TUVIxX0xfMyB8IEFEQ19TUVIxX0xfMiB8IEFEQ19TUVIxX0xfMSB8IEFEQ19TUVIxX0xfMCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMTYgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdfU0VRX0RJU0NPTlRfTU9ERSAgQURDIGdyb3VwIHJlZ3VsYXIgLSBTZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfRElTQ09OVF9ESVNBQkxFICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUgZGlzYWJsZSAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzFSQU5LICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ1IxX0RJU0NFTikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlIGVuYWJsZSB3aXRoIHNlcXVlbmNlIGludGVycnVwdGlvbiBldmVyeSByYW5rICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfMlJBTktTICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ1IxX0RJU0NOVU1fMCB8IEFEQ19DUjFfRElTQ0VOKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUgZW5hYmxlZCB3aXRoIHNlcXVlbmNlIGludGVycnVwdGlvbiBldmVyeSAyIHJhbmtzICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfM1JBTktTICAgICAgKCAgICAgICAgICAgICAgICAgICAgQURDX0NSMV9ESVNDTlVNXzEgICAgICAgICAgICAgICAgICAgICB8IEFEQ19DUjFfRElTQ0VOKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUgZW5hYmxlIHdpdGggc2VxdWVuY2UgaW50ZXJydXB0aW9uIGV2ZXJ5IDMgcmFua3MgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfRElTQ09OVF80UkFOS1MgICAgICAoICAgICAgICAgICAgICAgICAgICBBRENfQ1IxX0RJU0NOVU1fMSB8IEFEQ19DUjFfRElTQ05VTV8wIHwgQURDX0NSMV9ESVNDRU4pIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZSBlbmFibGUgd2l0aCBzZXF1ZW5jZSBpbnRlcnJ1cHRpb24gZXZlcnkgNCByYW5rcyAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzVSQU5LUyAgICAgIChBRENfQ1IxX0RJU0NOVU1fMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0RJU0NFTikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlIGVuYWJsZSB3aXRoIHNlcXVlbmNlIGludGVycnVwdGlvbiBldmVyeSA1IHJhbmtzICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfNlJBTktTICAgICAgKEFEQ19DUjFfRElTQ05VTV8yICAgICAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0RJU0NOVU1fMCB8IEFEQ19DUjFfRElTQ0VOKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUgZW5hYmxlIHdpdGggc2VxdWVuY2UgaW50ZXJydXB0aW9uIGV2ZXJ5IDYgcmFua3MgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfRElTQ09OVF83UkFOS1MgICAgICAoQURDX0NSMV9ESVNDTlVNXzIgfCBBRENfQ1IxX0RJU0NOVU1fMSAgICAgICAgICAgICAgICAgICAgIHwgQURDX0NSMV9ESVNDRU4pIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZSBlbmFibGUgd2l0aCBzZXF1ZW5jZSBpbnRlcnJ1cHRpb24gZXZlcnkgNyByYW5rcyAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzhSQU5LUyAgICAgIChBRENfQ1IxX0RJU0NOVU1fMiB8IEFEQ19DUjFfRElTQ05VTV8xIHwgQURDX0NSMV9ESVNDTlVNXzAgfCBBRENfQ1IxX0RJU0NFTikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlIGVuYWJsZSB3aXRoIHNlcXVlbmNlIGludGVycnVwdGlvbiBldmVyeSA4IHJhbmtzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdfUkFOS1MgIEFEQyBncm91cCByZWd1bGFyIC0gU2VxdWVuY2VyIHJhbmtzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX1JFR19SQU5LXzEgICAgICAgICAgICAgICAgICAoQURDX1NRUjNfUkVHT0ZGU0VUIHwgQURDX1JFR19SQU5LXzFfU1FSWF9CSVRPRkZTRVRfUE9TKSAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAxICovCisjZGVmaW5lIExMX0FEQ19SRUdfUkFOS18yICAgICAgICAgICAgICAgICAgKEFEQ19TUVIzX1JFR09GRlNFVCB8IEFEQ19SRUdfUkFOS18yX1NRUlhfQklUT0ZGU0VUX1BPUykgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMiAqLworI2RlZmluZSBMTF9BRENfUkVHX1JBTktfMyAgICAgICAgICAgICAgICAgIChBRENfU1FSM19SRUdPRkZTRVQgfCBBRENfUkVHX1JBTktfM19TUVJYX0JJVE9GRlNFVF9QT1MpICAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIDMgKi8KKyNkZWZpbmUgTExfQURDX1JFR19SQU5LXzQgICAgICAgICAgICAgICAgICAoQURDX1NRUjNfUkVHT0ZGU0VUIHwgQURDX1JFR19SQU5LXzRfU1FSWF9CSVRPRkZTRVRfUE9TKSAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayA0ICovCisjZGVmaW5lIExMX0FEQ19SRUdfUkFOS181ICAgICAgICAgICAgICAgICAgKEFEQ19TUVIzX1JFR09GRlNFVCB8IEFEQ19SRUdfUkFOS181X1NRUlhfQklUT0ZGU0VUX1BPUykgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgNSAqLworI2RlZmluZSBMTF9BRENfUkVHX1JBTktfNiAgICAgICAgICAgICAgICAgIChBRENfU1FSM19SRUdPRkZTRVQgfCBBRENfUkVHX1JBTktfNl9TUVJYX0JJVE9GRlNFVF9QT1MpICAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIDYgKi8KKyNkZWZpbmUgTExfQURDX1JFR19SQU5LXzcgICAgICAgICAgICAgICAgICAoQURDX1NRUjJfUkVHT0ZGU0VUIHwgQURDX1JFR19SQU5LXzdfU1FSWF9CSVRPRkZTRVRfUE9TKSAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayA3ICovCisjZGVmaW5lIExMX0FEQ19SRUdfUkFOS184ICAgICAgICAgICAgICAgICAgKEFEQ19TUVIyX1JFR09GRlNFVCB8IEFEQ19SRUdfUkFOS184X1NRUlhfQklUT0ZGU0VUX1BPUykgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgOCAqLworI2RlZmluZSBMTF9BRENfUkVHX1JBTktfOSAgICAgICAgICAgICAgICAgIChBRENfU1FSMl9SRUdPRkZTRVQgfCBBRENfUkVHX1JBTktfOV9TUVJYX0JJVE9GRlNFVF9QT1MpICAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIDkgKi8KKyNkZWZpbmUgTExfQURDX1JFR19SQU5LXzEwICAgICAgICAgICAgICAgICAoQURDX1NRUjJfUkVHT0ZGU0VUIHwgQURDX1JFR19SQU5LXzEwX1NRUlhfQklUT0ZGU0VUX1BPUykgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAxMCAqLworI2RlZmluZSBMTF9BRENfUkVHX1JBTktfMTEgICAgICAgICAgICAgICAgIChBRENfU1FSMl9SRUdPRkZTRVQgfCBBRENfUkVHX1JBTktfMTFfU1FSWF9CSVRPRkZTRVRfUE9TKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIDExICovCisjZGVmaW5lIExMX0FEQ19SRUdfUkFOS18xMiAgICAgICAgICAgICAgICAgKEFEQ19TUVIyX1JFR09GRlNFVCB8IEFEQ19SRUdfUkFOS18xMl9TUVJYX0JJVE9GRlNFVF9QT1MpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMTIgKi8KKyNkZWZpbmUgTExfQURDX1JFR19SQU5LXzEzICAgICAgICAgICAgICAgICAoQURDX1NRUjFfUkVHT0ZGU0VUIHwgQURDX1JFR19SQU5LXzEzX1NRUlhfQklUT0ZGU0VUX1BPUykgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAxMyAqLworI2RlZmluZSBMTF9BRENfUkVHX1JBTktfMTQgICAgICAgICAgICAgICAgIChBRENfU1FSMV9SRUdPRkZTRVQgfCBBRENfUkVHX1JBTktfMTRfU1FSWF9CSVRPRkZTRVRfUE9TKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIDE0ICovCisjZGVmaW5lIExMX0FEQ19SRUdfUkFOS18xNSAgICAgICAgICAgICAgICAgKEFEQ19TUVIxX1JFR09GRlNFVCB8IEFEQ19SRUdfUkFOS18xNV9TUVJYX0JJVE9GRlNFVF9QT1MpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMTUgKi8KKyNkZWZpbmUgTExfQURDX1JFR19SQU5LXzE2ICAgICAgICAgICAgICAgICAoQURDX1NRUjFfUkVHT0ZGU0VUIHwgQURDX1JFR19SQU5LXzE2X1NRUlhfQklUT0ZGU0VUX1BPUykgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAxNiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfSU5KX1RSSUdHRVJfU09VUkNFICBBREMgZ3JvdXAgaW5qZWN0ZWQgLSBUcmlnZ2VyIHNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19TT0ZUV0FSRSAgICAgICAgICAgKEFEQ19DUjJfSkVYVFNFTF8yIHwgQURDX0NSMl9KRVhUU0VMXzEgfCBBRENfQ1IyX0pFWFRTRUxfMCkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGludGVybmFsIChTVyBzdGFydCkgKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0yX1RSR08gICAgICAoQURDX0NSMl9KRVhUU0VMXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZXh0ZXJuYWwgZnJvbSBUSU0yIFRSR08uIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9DSDEgICAgICAgKEFEQ19DUjJfSkVYVFNFTF8xIHwgQURDX0NSMl9KRVhUU0VMXzApICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGV4dGVybmFsIGZyb20gVElNMiBDQzEuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDQgICAgICAgKEFEQ19DUjJfSkVYVFNFTF8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGV4dGVybmFsIGZyb20gVElNMyBDQzQuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9UUkdPICAgICAgKEFEQ19DUjJfSkVYVFNFTF8yIHwgQURDX0NSMl9KRVhUU0VMXzApICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGV4dGVybmFsIGZyb20gVElNNCBUUkdPLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTE5X0NIMSAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBleHRlcm5hbCBmcm9tIFRJTTE5IENDMS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0xOV9DSDIgICAgICAoQURDX0NSMl9KRVhUU0VMXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZXh0ZXJuYWwgZnJvbSBUSU0xOSBDQzIuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfRVhUSV9MSU5FMTUgICAgKEFEQ19DUjJfSkVYVFNFTF8yIHwgQURDX0NSMl9KRVhUU0VMXzEpICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGV4dGVybmFsIGludGVycnVwdCBsaW5lIDE1LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfSU5KX1RSSUdHRVJfRURHRSAgQURDIGdyb3VwIGluamVjdGVkIC0gVHJpZ2dlciBlZGdlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9SSVNJTkcgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIHBvbGFyaXR5IHNldCB0byByaXNpbmcgZWRnZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfSU5KX1RSSUdfQVVUTyAgQURDIGdyb3VwIGluamVjdGVkIC0gQXV0b21hdGljIHRyaWdnZXIgbW9kZQorKiBAeworKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0lOREVQRU5ERU5UICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKS8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBpbmRlcGVuZGVudC4gU2V0dGluZyBtYW5kYXRvcnkgaWYgQURDIGdyb3VwIGluamVjdGVkIGluamVjdGVkIHRyaWdnZXIgc291cmNlIGlzIHNldCB0byBhbiBleHRlcm5hbCB0cmlnZ2VyLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRlJPTV9HUlBfUkVHVUxBUiAgIChBRENfQ1IxX0pBVVRPKSAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gQURDIGdyb3VwIHJlZ3VsYXIuIFNldHRpbmcgY29tcGxpYW50IG9ubHkgd2l0aCBncm91cCBpbmplY3RlZCB0cmlnZ2VyIHNvdXJjZSBzZXQgdG8gU1cgc3RhcnQsIHdpdGhvdXQgYW55IGZ1cnRoZXIgYWN0aW9uIG9uICBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBzdGFydCBvciBzdG9wOiBpbiB0aGlzIGNhc2UsIEFEQyBncm91cCBpbmplY3RlZCBpcyBjb250cm9sbGVkIG9ubHkgZnJvbSBBREMgZ3JvdXAgcmVndWxhci4gKi8KKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfSU5KX1NFUV9TQ0FOX0xFTkdUSCAgQURDIGdyb3VwIGluamVjdGVkIC0gU2VxdWVuY2VyIHNjYW4gbGVuZ3RoCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0lOSl9TRVFfU0NBTl9ESVNBQkxFICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciBkaXNhYmxlIChlcXVpdmFsZW50IHRvIHNlcXVlbmNlciBvZiAxIHJhbms6IEFEQyBjb252ZXJzaW9uIG9uIG9ubHkgMSBjaGFubmVsKSAqLworI2RlZmluZSBMTF9BRENfSU5KX1NFUV9TQ0FOX0VOQUJMRV8yUkFOS1MgICggICAgICAgICAgICAgICAgQURDX0pTUVJfSkxfMCkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGVuYWJsZSB3aXRoIDIgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19JTkpfU0VRX1NDQU5fRU5BQkxFXzNSQU5LUyAgKEFEQ19KU1FSX0pMXzEgICAgICAgICAgICAgICAgKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMyByYW5rcyBpbiB0aGUgc2VxdWVuY2UgKi8KKyNkZWZpbmUgTExfQURDX0lOSl9TRVFfU0NBTl9FTkFCTEVfNFJBTktTICAoQURDX0pTUVJfSkxfMSB8IEFEQ19KU1FSX0pMXzApIC8qITwgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciBlbmFibGUgd2l0aCA0IHJhbmtzIGluIHRoZSBzZXF1ZW5jZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfSU5KX1NFUV9ESVNDT05UX01PREUgIEFEQyBncm91cCBpbmplY3RlZCAtIFNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfSU5KX1NFUV9ESVNDT05UX0RJU0FCTEUgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZSBkaXNhYmxlICovCisjZGVmaW5lIExMX0FEQ19JTkpfU0VRX0RJU0NPTlRfMVJBTksgICAgICAgKEFEQ19DUjFfSkRJU0NFTikgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlIGVuYWJsZSB3aXRoIHNlcXVlbmNlIGludGVycnVwdGlvbiBldmVyeSByYW5rICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19JTkpfUkFOS1MgIEFEQyBncm91cCBpbmplY3RlZCAtIFNlcXVlbmNlciByYW5rcworICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19JTkpfUkFOS18xICAgICAgICAgICAgICAgICAgKEFEQ19KRFIxX1JFR09GRlNFVCB8IEFEQ19KT0ZSMV9SRUdPRkZTRVQgfCBBRENfSU5KX1JBTktfMV9KU1FSX0JJVE9GRlNFVF9QT1MpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciByYW5rIDEgKi8KKyNkZWZpbmUgTExfQURDX0lOSl9SQU5LXzIgICAgICAgICAgICAgICAgICAoQURDX0pEUjJfUkVHT0ZGU0VUIHwgQURDX0pPRlIyX1JFR09GRlNFVCB8IEFEQ19JTkpfUkFOS18yX0pTUVJfQklUT0ZGU0VUX1BPUykgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIHJhbmsgMiAqLworI2RlZmluZSBMTF9BRENfSU5KX1JBTktfMyAgICAgICAgICAgICAgICAgIChBRENfSkRSM19SRUdPRkZTRVQgfCBBRENfSk9GUjNfUkVHT0ZGU0VUIHwgQURDX0lOSl9SQU5LXzNfSlNRUl9CSVRPRkZTRVRfUE9TKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgcmFuayAzICovCisjZGVmaW5lIExMX0FEQ19JTkpfUkFOS180ICAgICAgICAgICAgICAgICAgKEFEQ19KRFI0X1JFR09GRlNFVCB8IEFEQ19KT0ZSNF9SRUdPRkZTRVQgfCBBRENfSU5KX1JBTktfNF9KU1FSX0JJVE9GRlNFVF9QT1MpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciByYW5rIDQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX1NBTVBMSU5HVElNRSAgQ2hhbm5lbCAtIFNhbXBsaW5nIHRpbWUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfU0FNUExJTkdUSU1FXzFDWUNMRV81ICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU2FtcGxpbmcgdGltZSAxLjUgQURDIGNsb2NrIGN5Y2xlICovCisjZGVmaW5lIExMX0FEQ19TQU1QTElOR1RJTUVfN0NZQ0xFU181ICAgICAgKEFEQ19TTVBSMl9TTVAwXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTYW1wbGluZyB0aW1lIDcuNSBBREMgY2xvY2sgY3ljbGVzICovCisjZGVmaW5lIExMX0FEQ19TQU1QTElOR1RJTUVfMTNDWUNMRVNfNSAgICAgKEFEQ19TTVBSMl9TTVAwXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTYW1wbGluZyB0aW1lIDEzLjUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBMTF9BRENfU0FNUExJTkdUSU1FXzI4Q1lDTEVTXzUgICAgIChBRENfU01QUjJfU01QMF8xIHwgQURDX1NNUFIyX1NNUDBfMCkgICAgICAgICAgICAgICAgICAgIC8qITwgU2FtcGxpbmcgdGltZSAyOC41IEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgTExfQURDX1NBTVBMSU5HVElNRV80MUNZQ0xFU181ICAgICAoQURDX1NNUFIyX1NNUDBfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNhbXBsaW5nIHRpbWUgNDEuNSBBREMgY2xvY2sgY3ljbGVzICovCisjZGVmaW5lIExMX0FEQ19TQU1QTElOR1RJTUVfNTVDWUNMRVNfNSAgICAgKEFEQ19TTVBSMl9TTVAwXzIgfCBBRENfU01QUjJfU01QMF8wKSAgICAgICAgICAgICAgICAgICAgLyohPCBTYW1wbGluZyB0aW1lIDU1LjUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBMTF9BRENfU0FNUExJTkdUSU1FXzcxQ1lDTEVTXzUgICAgIChBRENfU01QUjJfU01QMF8yIHwgQURDX1NNUFIyX1NNUDBfMSkgICAgICAgICAgICAgICAgICAgIC8qITwgU2FtcGxpbmcgdGltZSA3MS41IEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgTExfQURDX1NBTVBMSU5HVElNRV8yMzlDWUNMRVNfNSAgICAoQURDX1NNUFIyX1NNUDBfMiB8IEFEQ19TTVBSMl9TTVAwXzEgfCBBRENfU01QUjJfU01QMF8wKSAvKiE8IFNhbXBsaW5nIHRpbWUgMjM5LjUgQURDIGNsb2NrIGN5Y2xlcyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfQVdEX05VTUJFUiBBbmFsb2cgd2F0Y2hkb2cgLSBBbmFsb2cgd2F0Y2hkb2cgbnVtYmVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0FXRDEgICAgICAgICAgICAgICAgICAgICAgICAoQURDX0FXRF9DUjFfQ0hBTk5FTF9NQVNLICB8IEFEQ19BV0RfQ1IxX1JFR09GRlNFVCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG51bWJlciAxICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19BV0RfQ0hBTk5FTFMgIEFuYWxvZyB3YXRjaGRvZyAtIE1vbml0b3JlZCBjaGFubmVscworICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19BV0RfRElTQUJMRSAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIGRpc2FibGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQUxMX0NIQU5ORUxTX1JFRyAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ1IxX0FXREVOICAgICAgICAgICAgICAgICApIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIGFsbCBjaGFubmVscywgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0FMTF9DSEFOTkVMU19JTkogICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DUjFfSkFXREVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBhbGwgY2hhbm5lbHMsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQUxMX0NIQU5ORUxTX1JFR19JTkogICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NSMV9KQVdERU4gfCBBRENfQ1IxX0FXREVOICAgICAgICAgICAgICAgICApIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIGFsbCBjaGFubmVscywgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8wX1JFRyAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8wICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXREVOIHwgQURDX0NSMV9BV0RTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjAsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzBfSU5KICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzAgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ1IxX0pBV0RFTiAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXRFNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMCwgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzBfUkVHX0lOSiAgICAgICAoKExMX0FEQ19DSEFOTkVMXzAgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ1IxX0pBV0RFTiB8IEFEQ19DUjFfQVdERU4gfCBBRENfQ1IxX0FXRFNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMCwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xX1JFRyAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXREVOIHwgQURDX0NSMV9BV0RTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjEsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzFfSU5KICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzEgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ1IxX0pBV0RFTiAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXRFNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMSwgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzFfUkVHX0lOSiAgICAgICAoKExMX0FEQ19DSEFOTkVMXzEgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ1IxX0pBV0RFTiB8IEFEQ19DUjFfQVdERU4gfCBBRENfQ1IxX0FXRFNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMSwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8yX1JFRyAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8yICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXREVOIHwgQURDX0NSMV9BV0RTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjIsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzJfSU5KICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzIgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ1IxX0pBV0RFTiAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXRFNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMiwgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzJfUkVHX0lOSiAgICAgICAoKExMX0FEQ19DSEFOTkVMXzIgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ1IxX0pBV0RFTiB8IEFEQ19DUjFfQVdERU4gfCBBRENfQ1IxX0FXRFNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMiwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8zX1JFRyAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8zICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXREVOIHwgQURDX0NSMV9BV0RTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjMsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzNfSU5KICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzMgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ1IxX0pBV0RFTiAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXRFNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMywgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzNfUkVHX0lOSiAgICAgICAoKExMX0FEQ19DSEFOTkVMXzMgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ1IxX0pBV0RFTiB8IEFEQ19DUjFfQVdERU4gfCBBRENfQ1IxX0FXRFNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMywgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF80X1JFRyAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF80ICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXREVOIHwgQURDX0NSMV9BV0RTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjQsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzRfSU5KICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzQgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ1IxX0pBV0RFTiAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXRFNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONCwgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzRfUkVHX0lOSiAgICAgICAoKExMX0FEQ19DSEFOTkVMXzQgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ1IxX0pBV0RFTiB8IEFEQ19DUjFfQVdERU4gfCBBRENfQ1IxX0FXRFNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONCwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF81X1JFRyAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF81ICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXREVOIHwgQURDX0NSMV9BV0RTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjUsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzVfSU5KICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzUgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ1IxX0pBV0RFTiAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXRFNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONSwgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzVfUkVHX0lOSiAgICAgICAoKExMX0FEQ19DSEFOTkVMXzUgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ1IxX0pBV0RFTiB8IEFEQ19DUjFfQVdERU4gfCBBRENfQ1IxX0FXRFNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONSwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF82X1JFRyAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF82ICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXREVOIHwgQURDX0NSMV9BV0RTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjYsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzZfSU5KICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzYgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ1IxX0pBV0RFTiAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXRFNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONiwgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzZfUkVHX0lOSiAgICAgICAoKExMX0FEQ19DSEFOTkVMXzYgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ1IxX0pBV0RFTiB8IEFEQ19DUjFfQVdERU4gfCBBRENfQ1IxX0FXRFNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONiwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF83X1JFRyAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF83ICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXREVOIHwgQURDX0NSMV9BV0RTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjcsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzdfSU5KICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzcgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ1IxX0pBV0RFTiAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXRFNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONywgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzdfUkVHX0lOSiAgICAgICAoKExMX0FEQ19DSEFOTkVMXzcgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ1IxX0pBV0RFTiB8IEFEQ19DUjFfQVdERU4gfCBBRENfQ1IxX0FXRFNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONywgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF84X1JFRyAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF84ICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXREVOIHwgQURDX0NSMV9BV0RTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjgsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzhfSU5KICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzggICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ1IxX0pBV0RFTiAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXRFNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOOCwgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzhfUkVHX0lOSiAgICAgICAoKExMX0FEQ19DSEFOTkVMXzggICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ1IxX0pBV0RFTiB8IEFEQ19DUjFfQVdERU4gfCBBRENfQ1IxX0FXRFNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOOCwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF85X1JFRyAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF85ICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXREVOIHwgQURDX0NSMV9BV0RTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjksIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzlfSU5KICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzkgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ1IxX0pBV0RFTiAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXRFNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOOSwgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzlfUkVHX0lOSiAgICAgICAoKExMX0FEQ19DSEFOTkVMXzkgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ1IxX0pBV0RFTiB8IEFEQ19DUjFfQVdERU4gfCBBRENfQ1IxX0FXRFNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOOSwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xMF9SRUcgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xMCAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXREVOIHwgQURDX0NSMV9BV0RTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjEwLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xMF9JTkogICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xMCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NSMV9KQVdERU4gICAgICAgICAgICAgICAgIHwgQURDX0NSMV9BV0RTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjEwLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMTBfUkVHX0lOSiAgICAgICgoTExfQURDX0NIQU5ORUxfMTAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DUjFfSkFXREVOIHwgQURDX0NSMV9BV0RFTiB8IEFEQ19DUjFfQVdEU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xMCwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xMV9SRUcgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xMSAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXREVOIHwgQURDX0NSMV9BV0RTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjExLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xMV9JTkogICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xMSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NSMV9KQVdERU4gICAgICAgICAgICAgICAgIHwgQURDX0NSMV9BV0RTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjExLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMTFfUkVHX0lOSiAgICAgICgoTExfQURDX0NIQU5ORUxfMTEgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DUjFfSkFXREVOIHwgQURDX0NSMV9BV0RFTiB8IEFEQ19DUjFfQVdEU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xMSwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xMl9SRUcgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xMiAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXREVOIHwgQURDX0NSMV9BV0RTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjEyLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xMl9JTkogICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xMiAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NSMV9KQVdERU4gICAgICAgICAgICAgICAgIHwgQURDX0NSMV9BV0RTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjEyLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMTJfUkVHX0lOSiAgICAgICgoTExfQURDX0NIQU5ORUxfMTIgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DUjFfSkFXREVOIHwgQURDX0NSMV9BV0RFTiB8IEFEQ19DUjFfQVdEU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xMiwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xM19SRUcgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xMyAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXREVOIHwgQURDX0NSMV9BV0RTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjEzLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xM19JTkogICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xMyAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NSMV9KQVdERU4gICAgICAgICAgICAgICAgIHwgQURDX0NSMV9BV0RTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjEzLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMTNfUkVHX0lOSiAgICAgICgoTExfQURDX0NIQU5ORUxfMTMgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DUjFfSkFXREVOIHwgQURDX0NSMV9BV0RFTiB8IEFEQ19DUjFfQVdEU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xMywgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xNF9SRUcgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xNCAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXREVOIHwgQURDX0NSMV9BV0RTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE0LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xNF9JTkogICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xNCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NSMV9KQVdERU4gICAgICAgICAgICAgICAgIHwgQURDX0NSMV9BV0RTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE0LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMTRfUkVHX0lOSiAgICAgICgoTExfQURDX0NIQU5ORUxfMTQgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DUjFfSkFXREVOIHwgQURDX0NSMV9BV0RFTiB8IEFEQ19DUjFfQVdEU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xNCwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xNV9SRUcgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xNSAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXREVOIHwgQURDX0NSMV9BV0RTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE1LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xNV9JTkogICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xNSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NSMV9KQVdERU4gICAgICAgICAgICAgICAgIHwgQURDX0NSMV9BV0RTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE1LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMTVfUkVHX0lOSiAgICAgICgoTExfQURDX0NIQU5ORUxfMTUgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DUjFfSkFXREVOIHwgQURDX0NSMV9BV0RFTiB8IEFEQ19DUjFfQVdEU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xNSwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xNl9SRUcgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xNiAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXREVOIHwgQURDX0NSMV9BV0RTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE2LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xNl9JTkogICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xNiAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NSMV9KQVdERU4gICAgICAgICAgICAgICAgIHwgQURDX0NSMV9BV0RTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE2LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMTZfUkVHX0lOSiAgICAgICgoTExfQURDX0NIQU5ORUxfMTYgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DUjFfSkFXREVOIHwgQURDX0NSMV9BV0RFTiB8IEFEQ19DUjFfQVdEU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xNiwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xN19SRUcgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xNyAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXREVOIHwgQURDX0NSMV9BV0RTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE3LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xN19JTkogICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xNyAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NSMV9KQVdERU4gICAgICAgICAgICAgICAgIHwgQURDX0NSMV9BV0RTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE3LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMTdfUkVHX0lOSiAgICAgICgoTExfQURDX0NIQU5ORUxfMTcgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DUjFfSkFXREVOIHwgQURDX0NSMV9BV0RFTiB8IEFEQ19DUjFfQVdEU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xNywgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVlJFRklOVF9SRUcgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICAgICAgICAgICB8IEFEQ19DUjFfQVdERU4gfCBBRENfQ1IxX0FXRFNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIFZyZWZJbnQ6IEludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVlJFRklOVF9JTkogICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ1IxX0pBV0RFTiAgICAgICAgICAgICAgICAgfCBBRENfQ1IxX0FXRFNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIFZyZWZJbnQ6IEludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIX1ZSRUZJTlRfUkVHX0lOSiAgICAgICgoTExfQURDX0NIQU5ORUxfVlJFRklOVCAgICAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NSMV9KQVdERU4gfCBBRENfQ1IxX0FXREVOIHwgQURDX0NSMV9BV0RTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBWcmVmSW50OiBJbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZSwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVEVNUFNFTlNPUl9SRUcgICAgICAgKChMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICAgICAgICAgICB8IEFEQ19DUjFfQVdERU4gfCBBRENfQ1IxX0FXRFNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIFRlbXBlcmF0dXJlIHNlbnNvciwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIX1RFTVBTRU5TT1JfSU5KICAgICAgICgoTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NSMV9KQVdERU4gICAgICAgICAgICAgICAgIHwgQURDX0NSMV9BV0RTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBUZW1wZXJhdHVyZSBzZW5zb3IsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVEVNUFNFTlNPUl9SRUdfSU5KICAgKChMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ1IxX0pBV0RFTiB8IEFEQ19DUjFfQVdERU4gfCBBRENfQ1IxX0FXRFNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIFRlbXBlcmF0dXJlIHNlbnNvciwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19BV0RfVEhSRVNIT0xEUyAgQW5hbG9nIHdhdGNoZG9nIC0gVGhyZXNob2xkcworICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19BV0RfVEhSRVNIT0xEX0hJR0ggICAgICAgICAgKEFEQ19BV0RfVFIxX0hJR0hfUkVHT0ZGU0VUKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkIGhpZ2ggKi8KKyNkZWZpbmUgTExfQURDX0FXRF9USFJFU0hPTERfTE9XICAgICAgICAgICAoQURDX0FXRF9UUjFfTE9XX1JFR09GRlNFVCkgIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgbG93ICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0hXX0RFTEFZUyAgRGVmaW5pdGlvbnMgb2YgQURDIGhhcmR3YXJlIGNvbnN0cmFpbnRzIGRlbGF5cworICAqIEBub3RlICAgT25seSBBREMgSVAgSFcgZGVsYXlzIGFyZSBkZWZpbmVkIGluIEFEQyBMTCBkcml2ZXIgZHJpdmVyLAorICAqICAgICAgICAgbm90IHRpbWVvdXQgdmFsdWVzLgorICAqICAgICAgICAgRm9yIGRldGFpbHMgb24gZGVsYXlzIHZhbHVlcywgcmVmZXIgdG8gZGVzY3JpcHRpb25zIGluIHNvdXJjZSBjb2RlCisgICogICAgICAgICBhYm92ZSBlYWNoIGxpdGVyYWwgZGVmaW5pdGlvbi4KKyAgKiBAeworICAqLworICAKKy8qIE5vdGU6IE9ubHkgQURDIElQIEhXIGRlbGF5cyBhcmUgZGVmaW5lZCBpbiBBREMgTEwgZHJpdmVyIGRyaXZlciwgICAgICAgICAgICovCisvKiAgICAgICBub3QgdGltZW91dCB2YWx1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgVGltZW91dCB2YWx1ZXMgZm9yIEFEQyBvcGVyYXRpb25zIGFyZSBkZXBlbmRlbnQgdG8gZGV2aWNlIGNsb2NrICAgICAgKi8KKy8qICAgICAgIGNvbmZpZ3VyYXRpb24gKHN5c3RlbSBjbG9jayB2ZXJzdXMgQURDIGNsb2NrKSwgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBhbmQgdGhlcmVmb3JlIG11c3QgYmUgZGVmaW5lZCBpbiB1c2VyIGFwcGxpY2F0aW9uLiAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgSW5kaWNhdGlvbnMgZm9yIGVzdGltYXRpb24gb2YgQURDIHRpbWVvdXQgZGVsYXlzLCBmb3IgdGhpcyAgICAgICAgICAgKi8KKy8qICAgICAgIFNUTTMyIHNlcmllOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAtIEFEQyBlbmFibGUgdGltZTogbWF4aW11bSBkZWxheSBpcyAxdXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAocmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgcGFyYW1ldGVyICJ0U1RBQiIpICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIC0gQURDIGNvbnZlcnNpb24gdGltZTogZHVyYXRpb24gZGVwZW5kaW5nIG9uIEFEQyBjbG9jayBhbmQgQURDICAgICAgICovCisvKiAgICAgICAgIGNvbmZpZ3VyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAocmVmZXIgdG8gZGV2aWNlIHJlZmVyZW5jZSBtYW51YWwsIHNlY3Rpb24gIlRpbWluZyIpICAgICAgICAgICAgICAgKi8KKworLyogRGVsYXkgZm9yIHRlbXBlcmF0dXJlIHNlbnNvciBzdGFiaWxpemF0aW9uIHRpbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIExpdGVyYWwgc2V0IHRvIG1heGltdW0gdmFsdWUgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQsICAgICAgICAgICAgICAgICAgICovCisvKiBwYXJhbWV0ZXIgInRTVEFSVCIpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVW5pdDogdXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfQURDX0RFTEFZX1RFTVBTRU5TT1JfU1RBQl9VUyAgICAoKHVpbnQzMl90KSAgMTBVKSAgLyohPCBEZWxheSBmb3IgaW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2Ugc3RhYmlsaXphdGlvbiB0aW1lICovCisKKy8qIERlbGF5IHJlcXVpcmVkIGJldHdlZW4gQURDIGRpc2FibGUgYW5kIEFEQyBjYWxpYnJhdGlvbiBzdGFydC4gICAgICAgICAgICAgICovCisvKiBOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllLCBiZWZvcmUgc3RhcnRpbmcgYSBjYWxpYnJhdGlvbiwgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIEEgbWluaW11bSBudW1iZXIgb2YgQURDIGNsb2NrIGN5Y2xlcyBhcmUgcmVxdWlyZWQgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBiZXR3ZWVuIEFEQyBkaXNhYmxlIHN0YXRlIGFuZCBjYWxpYnJhdGlvbiBzdGFydC4gICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgUmVmZXIgdG8gbGl0ZXJhbCBAcmVmIExMX0FEQ19ERUxBWV9DQUxJQl9FTkFCTEVfQURDX0NZQ0xFUy4gICAgICAgICAgKi8KKy8qICAgICAgIFdhaXQgdGltZSBjYW4gYmUgY29tcHV0ZWQgaW4gdXNlciBhcHBsaWNhdGlvbiBieSB3YWl0aW5nIGZvciB0aGUgICAgICovCisvKiAgICAgICBlcXVpdmFsZW50IG51bWJlciBvZiBDUFUgY3ljbGVzLCBieSB0YWtpbmcgaW50byBhY2NvdW50ICAgICAgICAgICAgICAqLworLyogICAgICAgcmF0aW8gb2YgQ1BVIGNsb2NrIHZlcnN1cyBBREMgY2xvY2sgcHJlc2NhbGVycy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFVuaXQ6IEFEQyBjbG9jayBjeWNsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0FEQ19ERUxBWV9ESVNBQkxFX0NBTElCX0FEQ19DWUNMRVMgKCh1aW50MzJfdCkgMlUpICAvKiE8IERlbGF5IHJlcXVpcmVkIGJldHdlZW4gQURDIGRpc2FibGUgYW5kIEFEQyBjYWxpYnJhdGlvbiBzdGFydCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FeHBvcnRlZF9NYWNyb3MgQURDIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIHdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gQURDIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gQURDIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9BRENfV3JpdGVSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fLCBfX1ZBTFVFX18pIFdSSVRFX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18sIChfX1ZBTFVFX18pKQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBBREMgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBBREMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfQURDX1JlYWRSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fKSBSRUFEX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18pCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FTV9IRUxQRVJfTUFDUk8gQURDIGhlbHBlciBtYWNybworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGdldCBBREMgY2hhbm5lbCBudW1iZXIgaW4gZGVjaW1hbCBmb3JtYXQKKyAgKiAgICAgICAgIGZyb20gbGl0ZXJhbHMgTExfQURDX0NIQU5ORUxfeC4KKyAgKiBAbm90ZSAgIEV4YW1wbGU6CisgICogICAgICAgICAgIF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQihMTF9BRENfQ0hBTk5FTF80KQorICAqICAgICAgICAgICB3aWxsIHJldHVybiBkZWNpbWFsIG51bWJlciAiNCIuCisgICogQG5vdGUgICBUaGUgaW5wdXQgY2FuIGJlIGEgdmFsdWUgZnJvbSBmdW5jdGlvbnMgd2hlcmUgYSBjaGFubmVsCisgICogICAgICAgICBudW1iZXIgaXMgcmV0dXJuZWQsIGVpdGhlciBkZWZpbmVkIHdpdGggbnVtYmVyCisgICogICAgICAgICBvciB3aXRoIGJpdGZpZWxkIChvbmx5IG9uZSBiaXQgbXVzdCBiZSBzZXQpLgorICAqIEBwYXJhbSAgX19DSEFOTkVMX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SICAgKDEpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiBTVE0zMkYzN3gsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzEuCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTE4CisgICovCisjZGVmaW5lIF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQihfX0NIQU5ORUxfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSykgPj4gQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGdldCBBREMgY2hhbm5lbCBpbiBsaXRlcmFsIGZvcm1hdCBMTF9BRENfQ0hBTk5FTF94CisgICogICAgICAgICBmcm9tIG51bWJlciBpbiBkZWNpbWFsIGZvcm1hdC4KKyAgKiBAbm90ZSAgIEV4YW1wbGU6CisgICogICAgICAgICAgIF9fTExfQURDX0RFQ0lNQUxfTkJfVE9fQ0hBTk5FTCg0KQorICAqICAgICAgICAgICB3aWxsIHJldHVybiBhIGRhdGEgZXF1aXZhbGVudCB0byAiTExfQURDX0NIQU5ORUxfNCIuCisgICogQHBhcmFtICBfX0RFQ0lNQUxfTkJfXyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTE4CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IgICAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyRjM3eCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbgorICAqICAgICAgICAgKDEpIEZvciBBREMgY2hhbm5lbCByZWFkIGJhY2sgZnJvbSBBREMgcmVnaXN0ZXIsCisgICogICAgICAgICAgICAgY29tcGFyaXNvbiB3aXRoIGludGVybmFsIGNoYW5uZWwgcGFyYW1ldGVyIHRvIGJlIGRvbmUKKyAgKiAgICAgICAgICAgICB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DSEFOTkVMX0lOVEVSTkFMX1RPX0VYVEVSTkFMKCkuCisgICovCisjZGVmaW5lIF9fTExfQURDX0RFQ0lNQUxfTkJfVE9fQ0hBTk5FTChfX0RFQ0lNQUxfTkJfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX0RFQ0lNQUxfTkJfXykgPD0gOVUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKChfX0RFQ0lNQUxfTkJfXykgPDwgQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgXAorICAgICAgIChBRENfU01QUjJfUkVHT0ZGU0VUIHwgKCgodWludDMyX3QpICgzVSAqIChfX0RFQ0lNQUxfTkJfXykpKSA8PCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKSAgICAgICAgIFwKKyAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAoKF9fREVDSU1BTF9OQl9fKSA8PCBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfQklUT0ZGU0VUX1BPUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBcCisgICAgICAgKEFEQ19TTVBSMV9SRUdPRkZTRVQgfCAoKCh1aW50MzJfdCkgKDNVICogKChfX0RFQ0lNQUxfTkJfXykgLSAxMFUpKSkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgc2VsZWN0ZWQgY2hhbm5lbAorICAqICAgICAgICAgY29ycmVzcG9uZHMgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBvZiBkcml2ZXIuCisgICogQG5vdGUgICBUaGUgZGlmZmVyZW50IGxpdGVyYWwgZGVmaW5pdGlvbnMgb2YgQURDIGNoYW5uZWxzIGFyZToKKyAgKiAgICAgICAgIC0gQURDIGludGVybmFsIGNoYW5uZWw6CisgICogICAgICAgICAgIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQsIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IsIC4uLgorICAqICAgICAgICAgLSBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gYSBHUElPIHBpbik6CisgICogICAgICAgICAgIExMX0FEQ19DSEFOTkVMXzEsIExMX0FEQ19DSEFOTkVMXzIsIC4uLgorICAqIEBub3RlICAgVGhlIGNoYW5uZWwgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBkZWZpbmVkIGZyb20gbGl0ZXJhbAorICAqICAgICAgICAgZGVmaW5pdGlvbiBvZiBhIEFEQyBpbnRlcm5hbCBjaGFubmVsIChMTF9BRENfQ0hBTk5FTF9WUkVGSU5ULAorICAqICAgICAgICAgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiwgLi4uKSwKKyAgKiAgICAgICAgIEFEQyBleHRlcm5hbCBjaGFubmVsIChMTF9BRENfQ0hBTk5FTF8xLCBMTF9BRENfQ0hBTk5FTF8yLCAuLi4pLAorICAqICAgICAgICAgbXVzdCBub3QgYmUgYSB2YWx1ZSBmcm9tIGZ1bmN0aW9ucyB3aGVyZSBhIGNoYW5uZWwgbnVtYmVyIGlzCisgICogICAgICAgICByZXR1cm5lZCBmcm9tIEFEQyByZWdpc3RlcnMsCisgICogICAgICAgICBiZWNhdXNlIGludGVybmFsIGFuZCBleHRlcm5hbCBjaGFubmVscyBzaGFyZSB0aGUgc2FtZSBjaGFubmVsCisgICogICAgICAgICBudW1iZXIgaW4gQURDIHJlZ2lzdGVycy4gVGhlIGRpZmZlcmVudGlhdGlvbiBpcyBtYWRlIG9ubHkgd2l0aAorICAqICAgICAgICAgcGFyYW1ldGVycyBkZWZpbml0aW9ucyBvZiBkcml2ZXIuCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IgICAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyRjM3eCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS4KKyAgKiBAcmV0dmFsIFZhbHVlICIwIiBpZiB0aGUgY2hhbm5lbCBjb3JyZXNwb25kcyB0byBhIHBhcmFtZXRlciBkZWZpbml0aW9uIG9mIGEgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIGEgR1BJTyBwaW4pCisgICogICAgICAgICBWYWx1ZSAiMSIgaWYgdGhlIGNoYW5uZWwgY29ycmVzcG9uZHMgdG8gYSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZiBhIEFEQyBpbnRlcm5hbCBjaGFubmVsCisgICovCisjZGVmaW5lIF9fTExfQURDX0lTX0NIQU5ORUxfSU5URVJOQUwoX19DSEFOTkVMX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSF9NQVNLKSAhPSAwVSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY29udmVydCBhIGNoYW5uZWwgZGVmaW5lZCBmcm9tIHBhcmFtZXRlcgorICAqICAgICAgICAgZGVmaW5pdGlvbiBvZiBhIEFEQyBpbnRlcm5hbCBjaGFubmVsIChMTF9BRENfQ0hBTk5FTF9WUkVGSU5ULAorICAqICAgICAgICAgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiwgLi4uKSwKKyAgKiAgICAgICAgIHRvIGl0cyBlcXVpdmFsZW50IHBhcmFtZXRlciBkZWZpbml0aW9uIG9mIGEgQURDIGV4dGVybmFsIGNoYW5uZWwKKyAgKiAgICAgICAgIChMTF9BRENfQ0hBTk5FTF8xLCBMTF9BRENfQ0hBTk5FTF8yLCAuLi4pLgorICAqIEBub3RlICAgVGhlIGNoYW5uZWwgcGFyYW1ldGVyIGNhbiBiZSwgYWRkaXRpb25hbGx5IHRvIGEgdmFsdWUKKyAgKiAgICAgICAgIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZiBhIEFEQyBpbnRlcm5hbCBjaGFubmVsCisgICogICAgICAgICAoTExfQURDX0NIQU5ORUxfVlJFRklOVCwgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiwgLi4uKSwKKyAgKiAgICAgICAgIGEgdmFsdWUgZGVmaW5lZCBmcm9tIHBhcmFtZXRlciBkZWZpbml0aW9uIG9mCisgICogICAgICAgICBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoTExfQURDX0NIQU5ORUxfMSwgTExfQURDX0NIQU5ORUxfMiwgLi4uKQorICAqICAgICAgICAgb3IgYSB2YWx1ZSBmcm9tIGZ1bmN0aW9ucyB3aGVyZSBhIGNoYW5uZWwgbnVtYmVyIGlzIHJldHVybmVkCisgICogICAgICAgICBmcm9tIEFEQyByZWdpc3RlcnMuCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IgICAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyRjM3eCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS4KKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTcKKyAgKi8KKyNkZWZpbmUgX19MTF9BRENfQ0hBTk5FTF9JTlRFUk5BTF9UT19FWFRFUk5BTChfX0NIQU5ORUxfXykgICAgICAgICAgICAgICAgICAgICBcCisgICgoX19DSEFOTkVMX18pICYgfkFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIX01BU0spCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBpbnRlcm5hbCBjaGFubmVsCisgICogICAgICAgICBzZWxlY3RlZCBpcyBhdmFpbGFibGUgb24gdGhlIEFEQyBpbnN0YW5jZSBzZWxlY3RlZC4KKyAgKiBAbm90ZSAgIFRoZSBjaGFubmVsIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgZGVmaW5lZCBmcm9tIHBhcmFtZXRlcgorICAqICAgICAgICAgZGVmaW5pdGlvbiBvZiBhIEFEQyBpbnRlcm5hbCBjaGFubmVsIChMTF9BRENfQ0hBTk5FTF9WUkVGSU5ULAorICAqICAgICAgICAgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiwgLi4uKSwKKyAgKiAgICAgICAgIG11c3Qgbm90IGJlIGEgdmFsdWUgZGVmaW5lZCBmcm9tIHBhcmFtZXRlciBkZWZpbml0aW9uIG9mCisgICogICAgICAgICBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoTExfQURDX0NIQU5ORUxfMSwgTExfQURDX0NIQU5ORUxfMiwgLi4uKQorICAqICAgICAgICAgb3IgYSB2YWx1ZSBmcm9tIGZ1bmN0aW9ucyB3aGVyZSBhIGNoYW5uZWwgbnVtYmVyIGlzCisgICogICAgICAgICByZXR1cm5lZCBmcm9tIEFEQyByZWdpc3RlcnMsCisgICogICAgICAgICBiZWNhdXNlIGludGVybmFsIGFuZCBleHRlcm5hbCBjaGFubmVscyBzaGFyZSB0aGUgc2FtZSBjaGFubmVsCisgICogICAgICAgICBudW1iZXIgaW4gQURDIHJlZ2lzdGVycy4gVGhlIGRpZmZlcmVudGlhdGlvbiBpcyBtYWRlIG9ubHkgd2l0aAorICAqICAgICAgICAgcGFyYW1ldGVycyBkZWZpbml0aW9ucyBvZiBkcml2ZXIuCisgICogQHBhcmFtICBfX0FEQ19JTlNUQU5DRV9fIEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgX19DSEFOTkVMX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiAgICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gU1RNMzJGMzd4LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLgorICAqIEByZXR2YWwgVmFsdWUgIjAiIGlmIHRoZSBpbnRlcm5hbCBjaGFubmVsIHNlbGVjdGVkIGlzIG5vdCBhdmFpbGFibGUgb24gdGhlIEFEQyBpbnN0YW5jZSBzZWxlY3RlZC4KKyAgKiAgICAgICAgIFZhbHVlICIxIiBpZiB0aGUgaW50ZXJuYWwgY2hhbm5lbCBzZWxlY3RlZCBpcyBhdmFpbGFibGUgb24gdGhlIEFEQyBpbnN0YW5jZSBzZWxlY3RlZC4KKyAgKi8KKyNkZWZpbmUgX19MTF9BRENfSVNfQ0hBTk5FTF9JTlRFUk5BTF9BVkFJTEFCTEUoX19BRENfSU5TVEFOQ0VfXywgX19DSEFOTkVMX18pICBcCisgICgoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgID8gKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UKSAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKChfX0NIQU5ORUxfXykgPT0gTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUikgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGRlZmluZSBBREMgYW5hbG9nIHdhdGNoZG9nIHBhcmFtZXRlcjoKKyAgKiAgICAgICAgIGRlZmluZSBhIHNpbmdsZSBjaGFubmVsIHRvIG1vbml0b3Igd2l0aCBhbmFsb2cgd2F0Y2hkb2cKKyAgKiAgICAgICAgIGZyb20gc2VxdWVuY2VyIGNoYW5uZWwgYW5kIGdyb3VwcyBkZWZpbml0aW9uLgorICAqIEBub3RlICAgVG8gYmUgdXNlZCB3aXRoIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldEFuYWxvZ1dETW9uaXRDaGFubmVscygpLgorICAqICAgICAgICAgRXhhbXBsZToKKyAgKiAgICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dETW9uaXRDaGFubmVscygKKyAgKiAgICAgICAgICAgICBBREMxLCBMTF9BRENfQVdEMSwKKyAgKiAgICAgICAgICAgICBfX0xMX0FEQ19BTkFMT0dXRF9DSEFOTkVMX0dST1VQKExMX0FEQ19DSEFOTkVMNCwgTExfQURDX0dST1VQX1JFR1VMQVIpKQorICAqIEBwYXJhbSAgX19DSEFOTkVMX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SICAgKDEpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiBTVE0zMkYzN3gsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzEuXG4KKyAgKiAgICAgICAgICgxKSBGb3IgQURDIGNoYW5uZWwgcmVhZCBiYWNrIGZyb20gQURDIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAgIGNvbXBhcmlzb24gd2l0aCBpbnRlcm5hbCBjaGFubmVsIHBhcmFtZXRlciB0byBiZSBkb25lCisgICogICAgICAgICAgICAgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0hBTk5FTF9JTlRFUk5BTF9UT19FWFRFUk5BTCgpLgorICAqIEBwYXJhbSAgX19HUk9VUF9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0dST1VQX1JFR1VMQVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfR1JPVVBfSU5KRUNURUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfR1JPVVBfUkVHVUxBUl9JTkpFQ1RFRAorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0FMTF9DSEFOTkVMU19SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0FMTF9DSEFOTkVMU19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0FMTF9DSEFOTkVMU19SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzBfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8wX0lOSiAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMF9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzFfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xX0lOSiAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMV9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzJfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8yX0lOSiAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMl9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzNfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8zX0lOSiAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfM19SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzRfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF80X0lOSiAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNF9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzVfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF81X0lOSiAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNV9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzZfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF82X0lOSiAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNl9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzdfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF83X0lOSiAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfN19SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzhfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF84X0lOSiAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOF9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzlfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF85X0lOSiAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOV9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEwX1JFRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMF9JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTBfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMV9SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTFfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzExX1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTJfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEyX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMl9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEzX1JFRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xM19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTNfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNF9SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTRfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE0X1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTVfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE1X0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNV9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE2X1JFRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNl9JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTZfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xN19SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE3X1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZSRUZJTlRfUkVHICAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVlJFRklOVF9JTkogICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WUkVGSU5UX1JFR19JTkogICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1RFTVBTRU5TT1JfUkVHICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVEVNUFNFTlNPUl9JTkogICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9URU1QU0VOU09SX1JFR19JTkogICAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyRjM3eCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS4KKyAgKi8KKyNkZWZpbmUgX19MTF9BRENfQU5BTE9HV0RfQ0hBTk5FTF9HUk9VUChfX0NIQU5ORUxfXywgX19HUk9VUF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fR1JPVVBfXykgPT0gTExfQURDX0dST1VQX1JFR1VMQVIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgID8gKCgoX19DSEFOTkVMX18pICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ1IxX0FXREVOIHwgQURDX0NSMV9BV0RTR0wpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoKF9fR1JPVVBfXykgPT0gTExfQURDX0dST1VQX0lOSkVDVEVEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgID8gKCgoX19DSEFOTkVMX18pICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ1IxX0pBV0RFTiB8IEFEQ19DUjFfQVdEU0dMKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DUjFfSkFXREVOIHwgQURDX0NSMV9BV0RFTiB8IEFEQ19DUjFfQVdEU0dMKSAgICAgICAgXAorICApCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIHNldCB0aGUgdmFsdWUgb2YgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgaGlnaAorICAqICAgICAgICAgb3IgbG93IGluIGZ1bmN0aW9uIG9mIEFEQyByZXNvbHV0aW9uLCB3aGVuIEFEQyByZXNvbHV0aW9uIGlzCisgICogICAgICAgICBkaWZmZXJlbnQgb2YgMTIgYml0cy4KKyAgKiBAbm90ZSAgIFRvIGJlIHVzZWQgd2l0aCBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRBbmFsb2dXRFRocmVzaG9sZHMoKS4KKyAgKiAgICAgICAgIEV4YW1wbGUsIHdpdGggYSBBREMgcmVzb2x1dGlvbiBvZiA4IGJpdHMsIHRvIHNldCB0aGUgdmFsdWUgb2YKKyAgKiAgICAgICAgIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgaGlnaCAob24gOCBiaXRzKToKKyAgKiAgICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dEVGhyZXNob2xkcworICAqICAgICAgICAgICAgKDwgQURDeCBwYXJhbSA+LAorICAqICAgICAgICAgICAgIF9fTExfQURDX0FOQUxPR1dEX1NFVF9USFJFU0hPTERfUkVTT0xVVElPTihMTF9BRENfUkVTT0xVVElPTl84QiwgPHRocmVzaG9sZF92YWx1ZV84X2JpdHM+KQorICAqICAgICAgICAgICAgKTsKKyAgKiBAcGFyYW0gIF9fQURDX1JFU09MVVRJT05fXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEyQgorICAqIEBwYXJhbSAgX19BV0RfVEhSRVNIT0xEX18gVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGCisgICovCisvKiBOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllLCBBREMgaXMgZml4ZWQgdG8gcmVzb2x1dGlvbiAxMiBiaXRzLiAgICAgICAgICAgICAqLworLyogICAgICAgVGhpcyBtYWNybyBoYXMgYmVlbiBrZXB0IGFueXdheSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyICAgICAgICAgKi8KKy8qICAgICAgIFNUTTMyIGZhbWlsaWVzIGZlYXR1cmluZyBkaWZmZXJlbnQgQURDIHJlc29sdXRpb25zLiAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIF9fTExfQURDX0FOQUxPR1dEX1NFVF9USFJFU0hPTERfUkVTT0xVVElPTihfX0FEQ19SRVNPTFVUSU9OX18sIF9fQVdEX1RIUkVTSE9MRF9fKSBcCisgICgoX19BV0RfVEhSRVNIT0xEX18pIDw8ICgwVSkpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGdldCB0aGUgdmFsdWUgb2YgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgaGlnaAorICAqICAgICAgICAgb3IgbG93IGluIGZ1bmN0aW9uIG9mIEFEQyByZXNvbHV0aW9uLCB3aGVuIEFEQyByZXNvbHV0aW9uIGlzIAorICAqICAgICAgICAgZGlmZmVyZW50IG9mIDEyIGJpdHMuCisgICogQG5vdGUgICBUbyBiZSB1c2VkIHdpdGggZnVuY3Rpb24gQHJlZiBMTF9BRENfR2V0QW5hbG9nV0RUaHJlc2hvbGRzKCkuCisgICogICAgICAgICBFeGFtcGxlLCB3aXRoIGEgQURDIHJlc29sdXRpb24gb2YgOCBiaXRzLCB0byBnZXQgdGhlIHZhbHVlIG9mCisgICogICAgICAgICBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkIGhpZ2ggKG9uIDggYml0cyk6CisgICogICAgICAgICAgIDwgdGhyZXNob2xkX3ZhbHVlXzZfYml0cyA+ID0gX19MTF9BRENfQU5BTE9HV0RfR0VUX1RIUkVTSE9MRF9SRVNPTFVUSU9OCisgICogICAgICAgICAgICAoTExfQURDX1JFU09MVVRJT05fOEIsCisgICogICAgICAgICAgICAgTExfQURDX0dldEFuYWxvZ1dEVGhyZXNob2xkcyg8QURDeCBwYXJhbT4sIExMX0FEQ19BV0RfVEhSRVNIT0xEX0hJR0gpCisgICogICAgICAgICAgICApOworICAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTJCCisgICogQHBhcmFtICBfX0FXRF9USFJFU0hPTERfMTJfQklUU19fIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICAqLworLyogTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZSwgQURDIGlzIGZpeGVkIHRvIHJlc29sdXRpb24gMTIgYml0cy4gICAgICAgICAgICAgKi8KKy8qICAgICAgIFRoaXMgbWFjcm8gaGFzIGJlZW4ga2VwdCBhbnl3YXkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciAgICAgICAgICovCisvKiAgICAgICBTVE0zMiBmYW1pbGllcyBmZWF0dXJpbmcgZGlmZmVyZW50IEFEQyByZXNvbHV0aW9ucy4gICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX0xMX0FEQ19BTkFMT0dXRF9HRVRfVEhSRVNIT0xEX1JFU09MVVRJT04oX19BRENfUkVTT0xVVElPTl9fLCBfX0FXRF9USFJFU0hPTERfMTJfQklUU19fKSBcCisgIChfX0FXRF9USFJFU0hPTERfMTJfQklUU19fKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBzZWxlY3QgdGhlIEFEQyBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIHRvIHdoaWNoIGlzIGJlbG9uZ2luZyB0aGUgc2VsZWN0ZWQgQURDIGluc3RhbmNlLgorICAqIEBub3RlICAgQURDIGNvbW1vbiByZWdpc3RlciBpbnN0YW5jZSBjYW4gYmUgdXNlZCBmb3I6CisgICogICAgICAgICAtIFNldCBwYXJhbWV0ZXJzIGNvbW1vbiB0byBzZXZlcmFsIEFEQyBpbnN0YW5jZXMKKyAgKiAgICAgICAgIC0gTXVsdGltb2RlIChmb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDIGluc3RhbmNlcykKKyAgKiAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9ucyBoYXZpbmcgYXJndW1lbnQgIkFEQ3h5X0NPTU1PTiIgYXMgcGFyYW1ldGVyLgorICAqIEBub3RlICAgT24gU1RNMzJGMzd4LCB0aGVyZSBpcyBubyBjb21tb24gQURDIGluc3RhbmNlLgorICAqICAgICAgICAgSG93ZXZlciwgQURDIGluc3RhbmNlIEFEQzEgaGFzIGEgcm9sZSBvZiBjb21tb24gQURDIGluc3RhbmNlCisgICogICAgICAgICAoZXF1aXZhbGVuY2Ugd2l0aCBvdGhlciBTVE0zMiBmYW1pbGllcyBmZWF0dXJpbmcgc2V2ZXJhbAorICAqICAgICAgICAgQURDIGluc3RhbmNlcykuCisgICogQHBhcmFtICBfX0FEQ3hfXyBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFEQyBjb21tb24gcmVnaXN0ZXIgaW5zdGFuY2UKKyAgKi8KKyNkZWZpbmUgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKF9fQURDeF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBREMxX0NPTU1PTikKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2hlY2sgaWYgYWxsIEFEQyBpbnN0YW5jZXMgc2hhcmluZyB0aGUgc2FtZQorICAqICAgICAgICAgQURDIGNvbW1vbiBpbnN0YW5jZSBhcmUgZGlzYWJsZWQuCisgICogQG5vdGUgICBUaGlzIGNoZWNrIGlzIHJlcXVpcmVkIGJ5IGZ1bmN0aW9ucyB3aXRoIHNldHRpbmcgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFsbCBBREMgaW5zdGFuY2VzIG9mIHRoZSBBREMgY29tbW9uIGdyb3VwIG11c3QgYmUgZGlzYWJsZWQuCisgICogICAgICAgICBSZWZlciB0byBmdW5jdGlvbnMgaGF2aW5nIGFyZ3VtZW50ICJBREN4eV9DT01NT04iIGFzIHBhcmFtZXRlci4KKyAgKiBAbm90ZSAgIE9uIGRldmljZXMgd2l0aCBvbmx5IDEgQURDIGNvbW1vbiBpbnN0YW5jZSwgcGFyYW1ldGVyIG9mIHRoaXMgbWFjcm8KKyAgKiAgICAgICAgIGlzIHVzZWxlc3MgYW5kIGNhbiBiZSBpZ25vcmVkIChwYXJhbWV0ZXIga2VwdCBmb3IgY29tcGF0aWJpbGl0eQorICAqICAgICAgICAgd2l0aCBkZXZpY2VzIGZlYXR1cmluZyBzZXZlcmFsIEFEQyBjb21tb24gaW5zdGFuY2VzKS4KKyAgKiBAbm90ZSAgIE9uIFNUTTMyRjM3eCwgdGhlcmUgaXMgbm8gY29tbW9uIEFEQyBpbnN0YW5jZS4KKyAgKiAgICAgICAgIEhvd2V2ZXIsIEFEQyBpbnN0YW5jZSBBREMxIGhhcyBhIHJvbGUgb2YgY29tbW9uIEFEQyBpbnN0YW5jZQorICAqICAgICAgICAgKGVxdWl2YWxlbmNlIHdpdGggb3RoZXIgU1RNMzIgZmFtaWxpZXMgZmVhdHVyaW5nIHNldmVyYWwKKyAgKiAgICAgICAgIEFEQyBpbnN0YW5jZXMpLgorICAqIEBwYXJhbSAgX19BRENYWV9DT01NT05fXyBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEByZXR2YWwgVmFsdWUgIjAiIEFsbCBBREMgaW5zdGFuY2VzIHNoYXJpbmcgdGhlIHNhbWUgQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgYXJlIGRpc2FibGVkLgorICAqICAgICAgICAgVmFsdWUgIjEiIEF0IGxlYXN0IG9uZSBBREMgaW5zdGFuY2Ugc2hhcmluZyB0aGUgc2FtZSBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICBpcyBlbmFibGVkCisgICovCisjZGVmaW5lIF9fTExfQURDX0lTX0VOQUJMRURfQUxMX0NPTU1PTl9JTlNUQU5DRShfX0FEQ1hZX0NPTU1PTl9fKSAgICAgICAgICAgICAgXAorICBMTF9BRENfSXNFbmFibGVkKEFEQzEpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGRlZmluZSB0aGUgQURDIGNvbnZlcnNpb24gZGF0YSBmdWxsLXNjYWxlIGRpZ2l0YWwKKyAgKiAgICAgICAgIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNlbGVjdGVkIEFEQyByZXNvbHV0aW9uLgorICAqIEBub3RlICAgQURDIGNvbnZlcnNpb24gZGF0YSBmdWxsLXNjYWxlIGNvcnJlc3BvbmRzIHRvIHZvbHRhZ2UgcmFuZ2UKKyAgKiAgICAgICAgIGRldGVybWluZWQgYnkgYW5hbG9nIHZvbHRhZ2UgcmVmZXJlbmNlcyBWcmVmKyBhbmQgVnJlZi0KKyAgKiAgICAgICAgIChyZWZlciB0byByZWZlcmVuY2UgbWFudWFsKS4KKyAgKiBAcGFyYW0gIF9fQURDX1JFU09MVVRJT05fXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEyQgorICAqIEByZXR2YWwgQURDIGNvbnZlcnNpb24gZGF0YSBlcXVpdmFsZW50IHZvbHRhZ2UgdmFsdWUgKHVuaXQ6IG1Wb2x0KQorICAqLworI2RlZmluZSBfX0xMX0FEQ19ESUdJVEFMX1NDQUxFKF9fQURDX1JFU09MVVRJT05fXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh1aW50MzJfdCkweEZGRlUpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNvbnZlcnQgdGhlIEFEQyBjb252ZXJzaW9uIGRhdGEgZnJvbQorICAqICAgICAgICAgYSByZXNvbHV0aW9uIHRvIGFub3RoZXIgcmVzb2x1dGlvbi4KKyAgKiBAbm90ZSAgIE9uIFNUTTMyRjM3eCwgdGhlIG9ubHkgQURDIHJlc29sdXRpb24gYXZhaWxhYmxlIGlzIDEyIGJpdHMuCisgICogICAgICAgICBUaGlzIG1hY3JvIGhhcyBiZWVuIGtlcHQgZm9yIGNvbXBhdGliaWxpdHkgcHVycG9zZSBvdmVyIG90aGVyIAorICAqICAgICAgICAgU1RNMzIgZmFtaWxpZXMuCisgICogQHBhcmFtICBfX0RBVEFfXyBBREMgY29udmVyc2lvbiBkYXRhIHRvIGJlIGNvbnZlcnRlZCAKKyAgKiBAcGFyYW0gIF9fQURDX1JFU09MVVRJT05fQ1VSUkVOVF9fIFJlc29sdXRpb24gb2YgdG8gdGhlIGRhdGEgdG8gYmUgY29udmVydGVkCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEyQgorICAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9UQVJHRVRfXyBSZXNvbHV0aW9uIG9mIHRoZSBkYXRhIGFmdGVyIGNvbnZlcnNpb24KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTJCCisgICogQHJldHZhbCBBREMgY29udmVyc2lvbiBkYXRhIHRvIHRoZSByZXF1ZXN0ZWQgcmVzb2x1dGlvbgorICAqLworI2RlZmluZSBfX0xMX0FEQ19DT05WRVJUX0RBVEFfUkVTT0xVVElPTihfX0RBVEFfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQURDX1JFU09MVVRJT05fQ1VSUkVOVF9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BRENfUkVTT0xVVElPTl9UQVJHRVRfXykgICAgICAgICAgICBcCisgICgoKF9fREFUQV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDw8ICgoX19BRENfUkVTT0xVVElPTl9DVVJSRU5UX18pID4+ICgwVSkpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgID4+ICgoX19BRENfUkVTT0xVVElPTl9UQVJHRVRfXykgPj4gKDBVKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2FsY3VsYXRlIHRoZSB2b2x0YWdlICh1bml0OiBtVm9sdCkKKyAgKiAgICAgICAgIGNvcnJlc3BvbmRpbmcgdG8gYSBBREMgY29udmVyc2lvbiBkYXRhICh1bml0OiBkaWdpdGFsIHZhbHVlKS4KKyAgKiBAbm90ZSAgIEFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAoVnJlZispIG11c3QgYmUgZWl0aGVyIGtub3duIGZyb20KKyAgKiAgICAgICAgIHVzZXIgYm9hcmQgZW52aXJvbm1lbnQgb3IgY2FuIGJlIGNhbGN1bGF0ZWQgdXNpbmcgQURDIG1lYXN1cmVtZW50CisgICogICAgICAgICBhbmQgQURDIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NBTENfVlJFRkFOQUxPR19WT0xUQUdFKCkuCisgICogQHBhcmFtICBfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fIEFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAodW5pdDogbVYpCisgICogQHBhcmFtICBfX0FEQ19EQVRBX18gQURDIGNvbnZlcnNpb24gZGF0YSAocmVzb2x1dGlvbiAxMiBiaXRzKQorICAqICAgICAgICAgICAgICAgICAgICAgICAodW5pdDogZGlnaXRhbCB2YWx1ZSkuCisgICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMkIKKyAgKiBAcmV0dmFsIEFEQyBjb252ZXJzaW9uIGRhdGEgZXF1aXZhbGVudCB2b2x0YWdlIHZhbHVlICh1bml0OiBtVm9sdCkKKyAgKi8KKyNkZWZpbmUgX19MTF9BRENfQ0FMQ19EQVRBX1RPX1ZPTFRBR0UoX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQURDX0RBVEFfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQURDX1JFU09MVVRJT05fXykgICAgICAgICAgICAgICAgICAgICAgXAorICAoKF9fQURDX0RBVEFfXykgKiAoX19WUkVGQU5BTE9HX1ZPTFRBR0VfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIC8gX19MTF9BRENfRElHSVRBTF9TQ0FMRShfX0FEQ19SRVNPTFVUSU9OX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKworCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgYW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlIChWcmVmKykKKyAgKiAgICAgICAgICh1bml0OiBtVm9sdCkgZnJvbSBBREMgY29udmVyc2lvbiBkYXRhIG9mIGludGVybmFsIHZvbHRhZ2UKKyAgKiAgICAgICAgIHJlZmVyZW5jZSBWcmVmSW50LgorICAqIEBub3RlICAgQ29tcHV0YXRpb24gaXMgdXNpbmcgVnJlZkludCBjYWxpYnJhdGlvbiB2YWx1ZQorICAqICAgICAgICAgc3RvcmVkIGluIHN5c3RlbSBtZW1vcnkgZm9yIGVhY2ggZGV2aWNlIGR1cmluZyBwcm9kdWN0aW9uLgorICAqIEBub3RlICAgVGhpcyB2b2x0YWdlIGRlcGVuZHMgb24gdXNlciBib2FyZCBlbnZpcm9ubWVudDogdm9sdGFnZSBsZXZlbAorICAqICAgICAgICAgY29ubmVjdGVkIHRvIHBpbiBWcmVmKy4KKyAgKiAgICAgICAgIE9uIGRldmljZXMgd2l0aCBzbWFsbCBwYWNrYWdlLCB0aGUgcGluIFZyZWYrIGlzIG5vdCBwcmVzZW50CisgICogICAgICAgICBhbmQgaW50ZXJuYWxseSBib25kZWQgdG8gcGluIFZkZGEuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBjYWxpYnJhdGlvbiBkYXRhIG9mIGludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlCisgICogICAgICAgICBWcmVmSW50IGNvcnJlc3BvbmRzIHRvIGEgcmVzb2x1dGlvbiBvZiAxMiBiaXRzLAorICAqICAgICAgICAgdGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgQURDIHJlc29sdXRpb24gdG8gY29udmVydCB2b2x0YWdlIG9mCisgICogICAgICAgICBpbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZSBWcmVmSW50LgorICAqICAgICAgICAgT24gU1RNMzJGMzd4LCB0aGUgb25seSBBREMgcmVzb2x1dGlvbiBhdmFpbGFibGUgaXMgMTIgYml0cy4KKyAgKiAgICAgICAgIFRoZSBwYXJhbWV0ZXIgb2YgQURDIHJlc29sdXRpb24gaXMga2VwdCBmb3IgY29tcGF0aWJpbGl0eSBwdXJwb3NlCisgICogICAgICAgICBvdmVyIG90aGVyIFNUTTMyIGZhbWlsaWVzLgorICAqIEBwYXJhbSAgX19WUkVGSU5UX0FEQ19EQVRBX18gQURDIGNvbnZlcnNpb24gZGF0YSAocmVzb2x1dGlvbiAxMiBiaXRzKQorICAqICAgICAgICAgb2YgaW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UgVnJlZkludCAodW5pdDogZGlnaXRhbCB2YWx1ZSkuCisgICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMkIKKyAgKiBAcmV0dmFsIEFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAodW5pdDogbVYpCisgICovCisjZGVmaW5lIF9fTExfQURDX0NBTENfVlJFRkFOQUxPR19WT0xUQUdFKF9fVlJFRklOVF9BRENfREFUQV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BRENfUkVTT0xVVElPTl9fKSAgICAgICAgICAgICAgICAgICBcCisgICgoKHVpbnQzMl90KSgqVlJFRklOVF9DQUxfQUREUikgKiBWUkVGSU5UX0NBTF9WUkVGKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8gX19MTF9BRENfQ09OVkVSVF9EQVRBX1JFU09MVVRJT04oKF9fVlJFRklOVF9BRENfREFUQV9fKSwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0FEQ19SRVNPTFVUSU9OX18pLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9BRENfUkVTT0xVVElPTl8xMkIpICAgICAgICAgICAgICAgICAgXAorICApCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNhbGN1bGF0ZSB0aGUgdGVtcGVyYXR1cmUgKHVuaXQ6IGRlZ3JlZSBDZWxzaXVzKQorICAqICAgICAgICAgZnJvbSBBREMgY29udmVyc2lvbiBkYXRhIG9mIGludGVybmFsIHRlbXBlcmF0dXJlIHNlbnNvci4KKyAgKiBAbm90ZSAgIENvbXB1dGF0aW9uIGlzIHVzaW5nIHRlbXBlcmF0dXJlIHNlbnNvciBjYWxpYnJhdGlvbiB2YWx1ZXMKKyAgKiAgICAgICAgIHN0b3JlZCBpbiBzeXN0ZW0gbWVtb3J5IGZvciBlYWNoIGRldmljZSBkdXJpbmcgcHJvZHVjdGlvbi4KKyAgKiBAbm90ZSAgIENhbGN1bGF0aW9uIGZvcm11bGE6CisgICogICAgICAgICAgIFRlbXBlcmF0dXJlID0gKChUU19BRENfREFUQSAtIFRTX0NBTDEpCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAqIChUU19DQUwyX1RFTVAgLSBUU19DQUwxX1RFTVApKQorICAqICAgICAgICAgICAgICAgICAgICAgICAgIC8gKFRTX0NBTDIgLSBUU19DQUwxKSArIFRTX0NBTDFfVEVNUAorICAqICAgICAgICAgICB3aXRoIFRTX0FEQ19EQVRBID0gdGVtcGVyYXR1cmUgc2Vuc29yIHJhdyBkYXRhIG1lYXN1cmVkIGJ5IEFEQworICAqICAgICAgICAgICAgICAgIEF2Z19TbG9wZSA9IChUU19DQUwyIC0gVFNfQ0FMMSkKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChUU19DQUwyX1RFTVAgLSBUU19DQUwxX1RFTVApCisgICogICAgICAgICAgICAgICAgVFNfQ0FMMSAgID0gZXF1aXZhbGVudCBUU19BRENfREFUQSBhdCB0ZW1wZXJhdHVyZQorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVBfREVHQ19DQUwxIChjYWxpYnJhdGVkIGluIGZhY3RvcnkpCisgICogICAgICAgICAgICAgICAgVFNfQ0FMMiAgID0gZXF1aXZhbGVudCBUU19BRENfREFUQSBhdCB0ZW1wZXJhdHVyZQorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVBfREVHQ19DQUwyIChjYWxpYnJhdGVkIGluIGZhY3RvcnkpCisgICogICAgICAgICBDYXV0aW9uOiBDYWxjdWxhdGlvbiByZWxldmFuY3kgdW5kZXIgcmVzZXJ2ZSB0aGF0IGNhbGlicmF0aW9uCisgICogICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGFyZSBjb3JyZWN0IChhZGRyZXNzIGFuZCBkYXRhKS4KKyAgKiAgICAgICAgICAgICAgICAgIFRvIGNhbGN1bGF0ZSB0ZW1wZXJhdHVyZSB1c2luZyB0ZW1wZXJhdHVyZSBzZW5zb3IKKyAgKiAgICAgICAgICAgICAgICAgIGRhdGFzaGVldCB0eXBpY2FsIHZhbHVlcyAoZ2VuZXJpYyB2YWx1ZXMgbGVzcywgdGhlcmVmb3JlCisgICogICAgICAgICAgICAgICAgICBsZXNzIGFjY3VyYXRlIHRoYW4gY2FsaWJyYXRlZCB2YWx1ZXMpLAorICAqICAgICAgICAgICAgICAgICAgdXNlIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NBTENfVEVNUEVSQVRVUkVfVFlQX1BBUkFNUygpLgorICAqIEBub3RlICAgQXMgY2FsY3VsYXRpb24gaW5wdXQsIHRoZSBhbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKFZyZWYrKSBtdXN0IGJlCisgICogICAgICAgICBkZWZpbmVkIGFzIGl0IGltcGFjdHMgdGhlIEFEQyBMU0IgZXF1aXZhbGVudCB2b2x0YWdlLgorICAqIEBub3RlICAgQW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlIChWcmVmKykgbXVzdCBiZSBlaXRoZXIga25vd24gZnJvbQorICAqICAgICAgICAgdXNlciBib2FyZCBlbnZpcm9ubWVudCBvciBjYW4gYmUgY2FsY3VsYXRlZCB1c2luZyBBREMgbWVhc3VyZW1lbnQKKyAgKiAgICAgICAgIGFuZCBBREMgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0FMQ19WUkVGQU5BTE9HX1ZPTFRBR0UoKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIGNhbGlicmF0aW9uIGRhdGEgb2YgdGVtcGVyYXR1cmUgc2Vuc29yCisgICogICAgICAgICBjb3JyZXNwb25kcyB0byBhIHJlc29sdXRpb24gb2YgMTIgYml0cywKKyAgKiAgICAgICAgIHRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIEFEQyByZXNvbHV0aW9uIHRvIGNvbnZlcnQgdm9sdGFnZSBvZgorICAqICAgICAgICAgdGVtcGVyYXR1cmUgc2Vuc29yLgorICAqICAgICAgICAgT24gU1RNMzJGMzd4LCB0aGUgb25seSBBREMgcmVzb2x1dGlvbiBhdmFpbGFibGUgaXMgMTIgYml0cy4KKyAgKiAgICAgICAgIFRoZSBwYXJhbWV0ZXIgb2YgQURDIHJlc29sdXRpb24gaXMga2VwdCBmb3IgY29tcGF0aWJpbGl0eSBwdXJwb3NlCisgICogICAgICAgICBvdmVyIG90aGVyIFNUTTMyIGZhbWlsaWVzLgorICAqIEBwYXJhbSAgX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyAgQW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlICh1bml0OiBtVikKKyAgKiBAcGFyYW0gIF9fVEVNUFNFTlNPUl9BRENfREFUQV9fIEFEQyBjb252ZXJzaW9uIGRhdGEgb2YgaW50ZXJuYWwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBlcmF0dXJlIHNlbnNvciAodW5pdDogZGlnaXRhbCB2YWx1ZSkuCisgICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX18gICAgICBBREMgcmVzb2x1dGlvbiBhdCB3aGljaCBpbnRlcm5hbCB0ZW1wZXJhdHVyZQorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc29yIHZvbHRhZ2UgaGFzIGJlZW4gbWVhc3VyZWQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEyQgorICAqIEByZXR2YWwgVGVtcGVyYXR1cmUgKHVuaXQ6IGRlZ3JlZSBDZWxzaXVzKQorICAqLworI2RlZmluZSBfX0xMX0FEQ19DQUxDX1RFTVBFUkFUVVJFKF9fVlJFRkFOQUxPR19WT0xUQUdFX18sXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fVEVNUFNFTlNPUl9BRENfREFUQV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0FEQ19SRVNPTFVUSU9OX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoICgoaW50MzJfdCkoKF9fTExfQURDX0NPTlZFUlRfREFUQV9SRVNPTFVUSU9OKChfX1RFTVBTRU5TT1JfQURDX0RBVEFfXyksICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fQURDX1JFU09MVVRJT05fXyksICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9BRENfUkVTT0xVVElPTl8xMkIpICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICogKF9fVlJFRkFOQUxPR19WT0xUQUdFX18pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAvIFRFTVBTRU5TT1JfQ0FMX1ZSRUZBTkFMT0cpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLSAoaW50MzJfdCkgKlRFTVBTRU5TT1JfQ0FMMV9BRERSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICApICogKGludDMyX3QpKFRFTVBTRU5TT1JfQ0FMMl9URU1QIC0gVEVNUFNFTlNPUl9DQUwxX1RFTVApICAgICAgICAgICAgICAgICAgICBcCisgICAgKSAvIChpbnQzMl90KSgoaW50MzJfdCkqVEVNUFNFTlNPUl9DQUwyX0FERFIgLSAoaW50MzJfdCkqVEVNUFNFTlNPUl9DQUwxX0FERFIpIFwKKyAgICkgKyBURU1QU0VOU09SX0NBTDFfVEVNUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNhbGN1bGF0ZSB0aGUgdGVtcGVyYXR1cmUgKHVuaXQ6IGRlZ3JlZSBDZWxzaXVzKQorICAqICAgICAgICAgZnJvbSBBREMgY29udmVyc2lvbiBkYXRhIG9mIGludGVybmFsIHRlbXBlcmF0dXJlIHNlbnNvci4KKyAgKiBAbm90ZSAgIENvbXB1dGF0aW9uIGlzIHVzaW5nIHRlbXBlcmF0dXJlIHNlbnNvciB0eXBpY2FsIHZhbHVlcworICAqICAgICAgICAgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQpLgorICAqIEBub3RlICAgQ2FsY3VsYXRpb24gZm9ybXVsYToKKyAgKiAgICAgICAgICAgVGVtcGVyYXR1cmUgPSAoVFNfVFlQX0NBTHhfVk9MVCh1VikgLSBUU19BRENfREFUQSAqIENvbnZlcnNpb25fdVYpCisgICogICAgICAgICAgICAgICAgICAgICAgICAgLyBBdmdfU2xvcGUgKyBDQUx4X1RFTVAKKyAgKiAgICAgICAgICAgd2l0aCBUU19BRENfREFUQSAgICAgID0gdGVtcGVyYXR1cmUgc2Vuc29yIHJhdyBkYXRhIG1lYXN1cmVkIGJ5IEFEQworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5pdDogZGlnaXRhbCB2YWx1ZSkKKyAgKiAgICAgICAgICAgICAgICBBdmdfU2xvcGUgICAgICAgID0gdGVtcGVyYXR1cmUgc2Vuc29yIHNsb3BlCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bml0OiB1Vi9EZWdyZWUgQ2Vsc2l1cykKKyAgKiAgICAgICAgICAgICAgICBUU19UWVBfQ0FMeF9WT0xUID0gdGVtcGVyYXR1cmUgc2Vuc29yIGRpZ2l0YWwgdmFsdWUgYXQKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGVyYXR1cmUgQ0FMeF9URU1QICh1bml0OiBtVikKKyAgKiAgICAgICAgIENhdXRpb246IENhbGN1bGF0aW9uIHJlbGV2YW5jeSB1bmRlciByZXNlcnZlIHRoZSB0ZW1wZXJhdHVyZSBzZW5zb3IKKyAgKiAgICAgICAgICAgICAgICAgIG9mIHRoZSBjdXJyZW50IGRldmljZSBoYXMgY2hhcmFjdGVyaXN0aWNzIGluIGxpbmUgd2l0aAorICAqICAgICAgICAgICAgICAgICAgZGF0YXNoZWV0IHR5cGljYWwgdmFsdWVzLgorICAqICAgICAgICAgICAgICAgICAgSWYgdGVtcGVyYXR1cmUgc2Vuc29yIGNhbGlicmF0aW9uIHZhbHVlcyBhcmUgYXZhaWxhYmxlIG9uCisgICogICAgICAgICAgICAgICAgICBvbiB0aGlzIGRldmljZSAocHJlc2VuY2Ugb2YgbWFjcm8gX19MTF9BRENfQ0FMQ19URU1QRVJBVFVSRSgpKSwKKyAgKiAgICAgICAgICAgICAgICAgIHRlbXBlcmF0dXJlIGNhbGN1bGF0aW9uIHdpbGwgYmUgbW9yZSBhY2N1cmF0ZSB1c2luZworICAqICAgICAgICAgICAgICAgICAgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0FMQ19URU1QRVJBVFVSRSgpLgorICAqIEBub3RlICAgQXMgY2FsY3VsYXRpb24gaW5wdXQsIHRoZSBhbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKFZyZWYrKSBtdXN0IGJlCisgICogICAgICAgICBkZWZpbmVkIGFzIGl0IGltcGFjdHMgdGhlIEFEQyBMU0IgZXF1aXZhbGVudCB2b2x0YWdlLgorICAqIEBub3RlICAgQW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlIChWcmVmKykgbXVzdCBiZSBlaXRoZXIga25vd24gZnJvbQorICAqICAgICAgICAgdXNlciBib2FyZCBlbnZpcm9ubWVudCBvciBjYW4gYmUgY2FsY3VsYXRlZCB1c2luZyBBREMgbWVhc3VyZW1lbnQKKyAgKiAgICAgICAgIGFuZCBBREMgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0FMQ19WUkVGQU5BTE9HX1ZPTFRBR0UoKS4KKyAgKiBAbm90ZSAgIEFEQyBtZWFzdXJlbWVudCBkYXRhIG11c3QgY29ycmVzcG9uZCB0byBhIHJlc29sdXRpb24gb2YgMTJiaXRzCisgICogICAgICAgICAoZnVsbCBzY2FsZSBkaWdpdGFsIHZhbHVlIDQwOTUpLiBJZiBub3QgdGhlIGNhc2UsIHRoZSBkYXRhIG11c3QgYmUKKyAgKiAgICAgICAgIHByZWxpbWluYXJpbHkgcmVzY2FsZWQgdG8gYW4gZXF1aXZhbGVudCByZXNvbHV0aW9uIG9mIDEyIGJpdHMuCisgICogQHBhcmFtICBfX1RFTVBTRU5TT1JfVFlQX0FWR1NMT1BFX18gICBEZXZpY2UgZGF0YXNoZWV0IGRhdGE6IFRlbXBlcmF0dXJlIHNlbnNvciBzbG9wZSB0eXBpY2FsIHZhbHVlICh1bml0OiB1Vi9EZWdDZWxzaXVzKS4KKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uIFNUTTMyRjM3eCwgcmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBwYXJhbWV0ZXIgIkF2Z19TbG9wZSIuCisgICogQHBhcmFtICBfX1RFTVBTRU5TT1JfVFlQX0NBTFhfVl9fICAgICBEZXZpY2UgZGF0YXNoZWV0IGRhdGE6IFRlbXBlcmF0dXJlIHNlbnNvciB2b2x0YWdlIHR5cGljYWwgdmFsdWUgKGF0IHRlbXBlcmF0dXJlIGFuZCBWcmVmKyBkZWZpbmVkIGluIHBhcmFtZXRlcnMgYmVsb3cpICh1bml0OiBtVikuCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbiBTVE0zMkYzN3gsIHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgcGFyYW1ldGVyICJWMjUiLgorICAqIEBwYXJhbSAgX19URU1QU0VOU09SX0NBTFhfVEVNUF9fICAgICAgRGV2aWNlIGRhdGFzaGVldCBkYXRhOiBUZW1wZXJhdHVyZSBhdCB3aGljaCB0ZW1wZXJhdHVyZSBzZW5zb3Igdm9sdGFnZSAoc2VlIHBhcmFtZXRlciBhYm92ZSkgaXMgY29ycmVzcG9uZGluZyAodW5pdDogbVYpCisgICogQHBhcmFtICBfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fICAgICAgICBBbmFsb2cgdm9sdGFnZSByZWZlcmVuY2UgKFZyZWYrKSB2b2x0YWdlICh1bml0OiBtVikKKyAgKiBAcGFyYW0gIF9fVEVNUFNFTlNPUl9BRENfREFUQV9fICAgICAgIEFEQyBjb252ZXJzaW9uIGRhdGEgb2YgaW50ZXJuYWwgdGVtcGVyYXR1cmUgc2Vuc29yICh1bml0OiBkaWdpdGFsIHZhbHVlKS4KKyAgKiBAcGFyYW0gIF9fQURDX1JFU09MVVRJT05fXyAgICAgICAgICAgIEFEQyByZXNvbHV0aW9uIGF0IHdoaWNoIGludGVybmFsIHRlbXBlcmF0dXJlIHNlbnNvciB2b2x0YWdlIGhhcyBiZWVuIG1lYXN1cmVkLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMkIKKyAgKiBAcmV0dmFsIFRlbXBlcmF0dXJlICh1bml0OiBkZWdyZWUgQ2Vsc2l1cykKKyAgKi8KKyNkZWZpbmUgX19MTF9BRENfQ0FMQ19URU1QRVJBVFVSRV9UWVBfUEFSQU1TKF9fVEVNUFNFTlNPUl9UWVBfQVZHU0xPUEVfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1RFTVBTRU5TT1JfVFlQX0NBTFhfVl9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fVEVNUFNFTlNPUl9DQUxYX1RFTVBfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fVEVNUFNFTlNPUl9BRENfREFUQV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQURDX1JFU09MVVRJT05fXykgICAgICAgICAgICAgICBcCisgICgoKCAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIChpbnQzMl90KSgoKF9fVEVNUFNFTlNPUl9UWVBfQ0FMWF9WX18pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgKiAxMDAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIChpbnQzMl90KSgoKChfX1RFTVBTRU5TT1JfQURDX0RBVEFfXykgKiAoX19WUkVGQU5BTE9HX1ZPTFRBR0VfXykpICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIC8gX19MTF9BRENfRElHSVRBTF9TQ0FMRShfX0FEQ19SRVNPTFVUSU9OX18pKSAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICogMTAwMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApIC8gKF9fVEVNUFNFTlNPUl9UWVBfQVZHU0xPUEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICApICsgKF9fVEVNUFNFTlNPUl9DQUxYX1RFTVBfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBBREMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUZfRE1BX01hbmFnZW1lbnQgQURDIERNQSBtYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKy8qIE5vdGU6IExMIEFEQyBmdW5jdGlvbnMgdG8gc2V0IERNQSB0cmFuc2ZlciBhcmUgbG9jYXRlZCBpbnRvIHNlY3Rpb25zIG9mICAgICovCisvKiAgICAgICBjb25maWd1cmF0aW9uIG9mIEFEQyBpbnN0YW5jZSwgZ3JvdXBzIGFuZCBtdWx0aW1vZGUgKGlmIGF2YWlsYWJsZSk6ICAqLworLyogICAgICAgQHJlZiBMTF9BRENfUkVHX1NldERNQVRyYW5zZmVyKCksIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyoqCisgICogQGJyaWVmICBGdW5jdGlvbiB0byBoZWxwIHRvIGNvbmZpZ3VyZSBETUEgdHJhbnNmZXIgZnJvbSBBREM6IHJldHJpZXZlIHRoZQorICAqICAgICAgICAgQURDIHJlZ2lzdGVyIGFkZHJlc3MgZnJvbSBBREMgaW5zdGFuY2UgYW5kIGEgbGlzdCBvZiBBREMgcmVnaXN0ZXJzCisgICogICAgICAgICBpbnRlbmRlZCB0byBiZSB1c2VkIChtb3N0IGNvbW1vbmx5KSB3aXRoIERNQSB0cmFuc2Zlci4KKyAgKiBAbm90ZSAgIFRoZXNlIEFEQyByZWdpc3RlcnMgYXJlIGRhdGEgcmVnaXN0ZXJzOgorICAqICAgICAgICAgd2hlbiBBREMgY29udmVyc2lvbiBkYXRhIGlzIGF2YWlsYWJsZSBpbiBBREMgZGF0YSByZWdpc3RlcnMsCisgICogICAgICAgICBBREMgZ2VuZXJhdGVzIGEgRE1BIHRyYW5zZmVyIHJlcXVlc3QuCisgICogQG5vdGUgICBUaGlzIG1hY3JvIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBMTCBETUEgZHJpdmVyLCByZWZlciB0bworICAqICAgICAgICAgZnVuY3Rpb24gIkxMX0RNQV9Db25maWdBZGRyZXNzZXMoKSIuCisgICogICAgICAgICBFeGFtcGxlOgorICAqICAgICAgICAgICBMTF9ETUFfQ29uZmlnQWRkcmVzc2VzKERNQTEsCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfRE1BX0NIQU5ORUxfMSwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9BRENfRE1BX0dldFJlZ0FkZHIoQURDMSwgTExfQURDX0RNQV9SRUdfUkVHVUxBUl9EQVRBKSwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJjwgYXJyYXkgb3IgdmFyaWFibGUgPiwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9ETUFfRElSRUNUSU9OX1BFUklQSF9UT19NRU1PUlkpOworICAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQzogaW4gbXVsdGltb2RlLCBzb21lIGRldmljZXMKKyAgKiAgICAgICAgIHVzZSBhIGRpZmZlcmVudCBkYXRhIHJlZ2lzdGVyIG91dHNpZGUgb2YgQURDIGluc3RhbmNlIHNjb3BlCisgICogICAgICAgICAoY29tbW9uIGRhdGEgcmVnaXN0ZXIpLiBUaGlzIG1hY3JvIG1hbmFnZXMgdGhpcyByZWdpc3RlciBkaWZmZXJlbmNlLAorICAqICAgICAgICAgb25seSBBREMgaW5zdGFuY2UgaGFzIHRvIGJlIHNldCBhcyBwYXJhbWV0ZXIuCisgICogQHJtdG9sbCBEUiAgICAgICBEQVRBICAgICAgICAgICBMTF9BRENfRE1BX0dldFJlZ0FkZHIKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBSZWdpc3RlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19ETUFfUkVHX1JFR1VMQVJfREFUQQorICAqIEByZXR2YWwgQURDIHJlZ2lzdGVyIGFkZHJlc3MKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfRE1BX0dldFJlZ0FkZHIoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFJlZ2lzdGVyKQoreworICAvKiBSZXRyaWV2ZSBhZGRyZXNzIG9mIHJlZ2lzdGVyIERSICovCisgIHJldHVybiAodWludDMyX3QpJihBREN4LT5EUik7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX0NvbW1vbiBDb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6IGNvbW1vbiB0byBzZXZlcmFsIEFEQyBpbnN0YW5jZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBwYXJhbWV0ZXIgY29tbW9uIHRvIHNldmVyYWwgQURDOiBtZWFzdXJlbWVudCBwYXRoIHRvIGludGVybmFsCisgICogICAgICAgICBjaGFubmVscyAoVnJlZkludCwgdGVtcGVyYXR1cmUgc2Vuc29yLCAuLi4pLgorICAqIEBub3RlICAgT25lIG9yIHNldmVyYWwgdmFsdWVzIGNhbiBiZSBzZWxlY3RlZC4KKyAgKiAgICAgICAgIEV4YW1wbGU6IChMTF9BRENfUEFUSF9JTlRFUk5BTF9WUkVGSU5UIHwKKyAgKiAgICAgICAgICAgICAgICAgICBMTF9BRENfUEFUSF9JTlRFUk5BTF9URU1QU0VOU09SKQorICAqIEBub3RlICAgU3RhYmlsaXphdGlvbiB0aW1lIG9mIG1lYXN1cmVtZW50IHBhdGggdG8gaW50ZXJuYWwgY2hhbm5lbDoKKyAgKiAgICAgICAgIEFmdGVyIGVuYWJsaW5nIGludGVybmFsIHBhdGhzLCBiZWZvcmUgc3RhcnRpbmcgQURDIGNvbnZlcnNpb24sCisgICogICAgICAgICBhIGRlbGF5IGlzIHJlcXVpcmVkIGZvciBpbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZSBhbmQKKyAgKiAgICAgICAgIHRlbXBlcmF0dXJlIHNlbnNvciBzdGFiaWxpemF0aW9uIHRpbWUuCisgICogICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LgorICAqICAgICAgICAgUmVmZXIgdG8gbGl0ZXJhbCBAcmVmIExMX0FEQ19ERUxBWV9URU1QU0VOU09SX1NUQUJfVVMuCisgICogQG5vdGUgICBBREMgaW50ZXJuYWwgY2hhbm5lbCBzYW1wbGluZyB0aW1lIGNvbnN0cmFpbnQ6CisgICogICAgICAgICBGb3IgQURDIGNvbnZlcnNpb24gb2YgaW50ZXJuYWwgY2hhbm5lbHMsCisgICogICAgICAgICBhIHNhbXBsaW5nIHRpbWUgbWluaW11bSB2YWx1ZSBpcyByZXF1aXJlZC4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQuCisgICogQHJtdG9sbCBDUjIgICAgICBUU1ZSRUZFICAgICAgICBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2gKKyAgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEBwYXJhbSAgUGF0aEludGVybmFsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19QQVRIX0lOVEVSTkFMX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUEFUSF9JTlRFUk5BTF9WUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1BBVEhfSU5URVJOQUxfVEVNUFNFTlNPUgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OLCB1aW50MzJfdCBQYXRoSW50ZXJuYWwpCit7CisgIE1PRElGWV9SRUcoQURDeHlfQ09NTU9OLT5DUjIsIChBRENfQ1IyX1RTVlJFRkUpLCBQYXRoSW50ZXJuYWwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBwYXJhbWV0ZXIgY29tbW9uIHRvIHNldmVyYWwgQURDOiBtZWFzdXJlbWVudCBwYXRoIHRvIGludGVybmFsCisgICogICAgICAgICBjaGFubmVscyAoVnJlZkludCwgdGVtcGVyYXR1cmUgc2Vuc29yLCAuLi4pLgorICAqIEBub3RlICAgT25lIG9yIHNldmVyYWwgdmFsdWVzIGNhbiBiZSBzZWxlY3RlZC4KKyAgKiAgICAgICAgIEV4YW1wbGU6IChMTF9BRENfUEFUSF9JTlRFUk5BTF9WUkVGSU5UIHwKKyAgKiAgICAgICAgICAgICAgICAgICBMTF9BRENfUEFUSF9JTlRFUk5BTF9URU1QU0VOU09SKQorICAqIEBybXRvbGwgQ1IyICAgICAgVFNWUkVGRSAgICAgICAgTExfQURDX0dldENvbW1vblBhdGhJbnRlcm5hbENoCisgICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19QQVRIX0lOVEVSTkFMX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUEFUSF9JTlRFUk5BTF9WUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1BBVEhfSU5URVJOQUxfVEVNUFNFTlNPUgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRDb21tb25QYXRoSW50ZXJuYWxDaChBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTikKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeHlfQ09NTU9OLT5DUjIsIEFEQ19DUjJfVFNWUkVGRSkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0FEQ19JbnN0YW5jZSBDb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6IEFEQyBpbnN0YW5jZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBjb252ZXJzaW9uIGRhdGEgYWxpZ25tZW50LgorICAqIEBub3RlICAgUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCBmb3IgYWxpZ25tZW50cyBmb3JtYXRzCisgICogICAgICAgICBkZXBlbmRlbmNpZXMgdG8gQURDIHJlc29sdXRpb25zLgorICAqIEBybXRvbGwgQ1IyICAgICAgQUxJR04gICAgICAgICAgTExfQURDX1NldERhdGFBbGlnbm1lbnQKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBEYXRhQWxpZ25tZW50IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0RBVEFfQUxJR05fUklHSFQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfREFUQV9BTElHTl9MRUZUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0RGF0YUFsaWdubWVudChBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgRGF0YUFsaWdubWVudCkKK3sKKyAgTU9ESUZZX1JFRyhBREN4LT5DUjIsIEFEQ19DUjJfQUxJR04sIERhdGFBbGlnbm1lbnQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgY29udmVyc2lvbiBkYXRhIGFsaWdubWVudC4KKyAgKiBAbm90ZSAgIFJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwgZm9yIGFsaWdubWVudHMgZm9ybWF0cworICAqICAgICAgICAgZGVwZW5kZW5jaWVzIHRvIEFEQyByZXNvbHV0aW9ucy4KKyAgKiBAcm10b2xsIENSMiAgICAgIEFMSUdOICAgICAgICAgIExMX0FEQ19TZXREYXRhQWxpZ25tZW50CisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfREFUQV9BTElHTl9SSUdIVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19EQVRBX0FMSUdOX0xFRlQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0RGF0YUFsaWdubWVudChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q1IyLCBBRENfQ1IyX0FMSUdOKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBzZXF1ZW5jZXJzIHNjYW4gbW9kZSwgZm9yIGFsbCBBREMgZ3JvdXBzCisgICogICAgICAgICAoZ3JvdXAgcmVndWxhciwgZ3JvdXAgaW5qZWN0ZWQpLgorICAqIEBub3RlICBBY2NvcmRpbmcgdG8gc2VxdWVuY2VycyBzY2FuIG1vZGUgOgorICAqICAgICAgICAgLSBJZiBkaXNhYmxlZDogQURDIGNvbnZlcnNpb24gaXMgcGVyZm9ybWVkIGluIHVuaXRhcnkgY29udmVyc2lvbgorICAqICAgICAgICAgICBtb2RlIChvbmUgY2hhbm5lbCBjb252ZXJ0ZWQsIHRoYXQgZGVmaW5lZCBpbiByYW5rIDEpLgorICAqICAgICAgICAgICBDb25maWd1cmF0aW9uIG9mIHNlcXVlbmNlcnMgb2YgYWxsIEFEQyBncm91cHMKKyAgKiAgICAgICAgICAgKHNlcXVlbmNlciBzY2FuIGxlbmd0aCwgLi4uKSBpcyBkaXNjYXJkZWQ6IGVxdWl2YWxlbnQgdG8KKyAgKiAgICAgICAgICAgc2NhbiBsZW5ndGggb2YgMSByYW5rLgorICAqICAgICAgICAgLSBJZiBlbmFibGVkOiBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCBpbiBzZXF1ZW5jZSBjb252ZXJzaW9ucworICAqICAgICAgICAgICBtb2RlLCBhY2NvcmRpbmcgdG8gY29uZmlndXJhdGlvbiBvZiBzZXF1ZW5jZXJzIG9mCisgICogICAgICAgICAgIGVhY2ggQURDIGdyb3VwIChzZXF1ZW5jZXIgc2NhbiBsZW5ndGgsIC4uLikuCisgICogICAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJMZW5ndGgoKQorICAqICAgICAgICAgICBhbmQgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfSU5KX1NldFNlcXVlbmNlckxlbmd0aCgpLgorICAqIEBybXRvbGwgQ1IxICAgICAgU0NBTiAgICAgICAgICAgTExfQURDX1NldFNlcXVlbmNlcnNTY2FuTW9kZQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFNjYW5Nb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NFUV9TQ0FOX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0VRX1NDQU5fRU5BQkxFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0U2VxdWVuY2Vyc1NjYW5Nb2RlKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBTY2FuTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhBREN4LT5DUjEsIEFEQ19DUjFfU0NBTiwgU2Nhbk1vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgc2VxdWVuY2VycyBzY2FuIG1vZGUsIGZvciBhbGwgQURDIGdyb3VwcworICAqICAgICAgICAgKGdyb3VwIHJlZ3VsYXIsIGdyb3VwIGluamVjdGVkKS4KKyAgKiBAbm90ZSAgQWNjb3JkaW5nIHRvIHNlcXVlbmNlcnMgc2NhbiBtb2RlIDoKKyAgKiAgICAgICAgIC0gSWYgZGlzYWJsZWQ6IEFEQyBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZCBpbiB1bml0YXJ5IGNvbnZlcnNpb24KKyAgKiAgICAgICAgICAgbW9kZSAob25lIGNoYW5uZWwgY29udmVydGVkLCB0aGF0IGRlZmluZWQgaW4gcmFuayAxKS4KKyAgKiAgICAgICAgICAgQ29uZmlndXJhdGlvbiBvZiBzZXF1ZW5jZXJzIG9mIGFsbCBBREMgZ3JvdXBzCisgICogICAgICAgICAgIChzZXF1ZW5jZXIgc2NhbiBsZW5ndGgsIC4uLikgaXMgZGlzY2FyZGVkOiBlcXVpdmFsZW50IHRvCisgICogICAgICAgICAgIHNjYW4gbGVuZ3RoIG9mIDEgcmFuay4KKyAgKiAgICAgICAgIC0gSWYgZW5hYmxlZDogQURDIGNvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQgaW4gc2VxdWVuY2UgY29udmVyc2lvbnMKKyAgKiAgICAgICAgICAgbW9kZSwgYWNjb3JkaW5nIHRvIGNvbmZpZ3VyYXRpb24gb2Ygc2VxdWVuY2VycyBvZgorICAqICAgICAgICAgICBlYWNoIEFEQyBncm91cCAoc2VxdWVuY2VyIHNjYW4gbGVuZ3RoLCAuLi4pLgorICAqICAgICAgICAgICBSZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyTGVuZ3RoKCkKKyAgKiAgICAgICAgICAgYW5kIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX0lOSl9TZXRTZXF1ZW5jZXJMZW5ndGgoKS4KKyAgKiBAcm10b2xsIENSMSAgICAgIFNDQU4gICAgICAgICAgIExMX0FEQ19HZXRTZXF1ZW5jZXJzU2Nhbk1vZGUKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TRVFfU0NBTl9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NFUV9TQ0FOX0VOQUJMRQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRTZXF1ZW5jZXJzU2Nhbk1vZGUoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNSMSwgQURDX0NSMV9TQ0FOKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX0dyb3VwX1JlZ3VsYXIgQ29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiBncm91cCByZWd1bGFyCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIHNvdXJjZToKKyAgKiAgICAgICAgIGludGVybmFsIChTVyBzdGFydCkgb3IgZXh0ZXJuYWwgZnJvbSB0aW1lciBvciBleHRlcm5hbCBpbnRlcnJ1cHQuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBleHRlcm5hbCB0cmlnZ2VyIGlzIHNldCB3aXRoIHRyaWdnZXIgcG9sYXJpdHk6CisgICogICAgICAgICByaXNpbmcgZWRnZSAob25seSB0cmlnZ2VyIHBvbGFyaXR5IGF2YWlsYWJsZSBvbiB0aGlzIFNUTTMyIHNlcmllKS4KKyAgKiBAbm90ZSAgIEF2YWlsYWJpbGl0eSBvZiBwYXJhbWV0ZXJzIG9mIHRyaWdnZXIgc291cmNlcyBmcm9tIHRpbWVyIAorICAqICAgICAgICAgZGVwZW5kcyBvbiB0aW1lcnMgYXZhaWxhYmlsaXR5IG9uIHRoZSBzZWxlY3RlZCBkZXZpY2UuCisgICogQHJtdG9sbCBDUjIgICAgICBFWFRTRUwgICAgICAgICBMTF9BRENfUkVHX1NldFRyaWdnZXJTb3VyY2UKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBUcmlnZ2VyU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX1NPRlRXQVJFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19UUkdPCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU00X0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMTlfVFJHTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMTlfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0xOV9DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0VYVElfTElORTExCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1NldFRyaWdnZXJTb3VyY2UoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFRyaWdnZXJTb3VyY2UpCit7CisvKiBOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllLCBBREMgZ3JvdXAgcmVndWxhciBleHRlcm5hbCB0cmlnZ2VyIGVkZ2UgICAgICAgICAqLworLyogICAgICAgaXMgdXNlZCB0byBwZXJmb3JtIGEgQURDIGNvbnZlcnNpb24gc3RhcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgc2V0IGV4dGVybmFsIHRyaWdnZXIgZWRnZS4gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBUaGlzIGZlYXR1cmUgaXMgc2V0IHVzaW5nIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgQHJlZiBMTF9BRENfUkVHX1N0YXJ0Q29udmVyc2lvbkV4dFRyaWcoKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTU9ESUZZX1JFRyhBREN4LT5DUjIsIEFEQ19DUjJfRVhUU0VMLCAoVHJpZ2dlclNvdXJjZSAmIEFEQ19DUjJfRVhUU0VMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBzb3VyY2U6CisgICogICAgICAgICBpbnRlcm5hbCAoU1cgc3RhcnQpIG9yIGV4dGVybmFsIGZyb20gdGltZXIgb3IgZXh0ZXJuYWwgaW50ZXJydXB0LgorICAqIEBub3RlICAgVG8gZGV0ZXJtaW5lIHdoZXRoZXIgZ3JvdXAgcmVndWxhciB0cmlnZ2VyIHNvdXJjZSBpcworICAqICAgICAgICAgaW50ZXJuYWwgKFNXIHN0YXJ0KSBvciBleHRlcm5hbCwgd2l0aG91dCBkZXRhaWwKKyAgKiAgICAgICAgIG9mIHdoaWNoIHBlcmlwaGVyYWwgaXMgc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgdHJpZ2dlciwKKyAgKiAgICAgICAgIChlcXVpdmFsZW50IHRvIAorICAqICAgICAgICAgImlmKExMX0FEQ19SRUdfR2V0VHJpZ2dlclNvdXJjZShBREMxKSA9PSBMTF9BRENfUkVHX1RSSUdfU09GVFdBUkUpIikKKyAgKiAgICAgICAgIHVzZSBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfSXNUcmlnZ2VyU291cmNlU1dTdGFydC4KKyAgKiBAbm90ZSAgIEF2YWlsYWJpbGl0eSBvZiBwYXJhbWV0ZXJzIG9mIHRyaWdnZXIgc291cmNlcyBmcm9tIHRpbWVyIAorICAqICAgICAgICAgZGVwZW5kcyBvbiB0aW1lcnMgYXZhaWxhYmlsaXR5IG9uIHRoZSBzZWxlY3RlZCBkZXZpY2UuCisgICogQHJtdG9sbCBDUjIgICAgICBFWFRTRUwgICAgICAgICBMTF9BRENfUkVHX0dldFRyaWdnZXJTb3VyY2UKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfVFJHTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTE5X1RSR08KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTE5X0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMTlfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9FWFRJX0xJTkUxMQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfR2V0VHJpZ2dlclNvdXJjZShBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q1IyLCBBRENfQ1IyX0VYVFNFTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgc291cmNlIGludGVybmFsIChTVyBzdGFydCkKKyAgICAgICAgICAgIG9yIGV4dGVybmFsLgorICAqIEBub3RlICAgSW4gY2FzZSBvZiBncm91cCByZWd1bGFyIHRyaWdnZXIgc291cmNlIHNldCB0byBleHRlcm5hbCB0cmlnZ2VyLAorICAqICAgICAgICAgdG8gZGV0ZXJtaW5lIHdoaWNoIHBlcmlwaGVyYWwgaXMgc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgdHJpZ2dlciwKKyAgKiAgICAgICAgIHVzZSBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfR2V0VHJpZ2dlclNvdXJjZSgpLgorICAqIEBybXRvbGwgQ1IyICAgICAgRVhUU0VMICAgICAgICAgTExfQURDX1JFR19Jc1RyaWdnZXJTb3VyY2VTV1N0YXJ0CisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgIjAiIHRyaWdnZXIgc291cmNlIGV4dGVybmFsIHRyaWdnZXIKKyAgKiAgICAgICAgIFZhbHVlICIxIiB0cmlnZ2VyIHNvdXJjZSBTVyBzdGFydC4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfUkVHX0lzVHJpZ2dlclNvdXJjZVNXU3RhcnQoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoQURDeC0+Q1IyLCBBRENfQ1IyX0VYVFNFTCkgPT0gKExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSkpOworfQorCisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBsZW5ndGggYW5kIHNjYW4gZGlyZWN0aW9uLgorICAqIEBub3RlICAgRGVzY3JpcHRpb24gb2YgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGZlYXR1cmVzOgorICAqICAgICAgICAgLSBGb3IgZGV2aWNlcyB3aXRoIHNlcXVlbmNlciBmdWxseSBjb25maWd1cmFibGUKKyAgKiAgICAgICAgICAgKGZ1bmN0aW9uICJMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzKCkiIGF2YWlsYWJsZSk6CisgICogICAgICAgICAgIHNlcXVlbmNlciBsZW5ndGggYW5kIGVhY2ggcmFuayBhZmZlY3RhdGlvbiB0byBhIGNoYW5uZWwKKyAgKiAgICAgICAgICAgYXJlIGNvbmZpZ3VyYWJsZS4KKyAgKiAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBjb25maWd1cmF0aW9uIG9mOgorICAqICAgICAgICAgICAtIFNlcXVlbmNlIGxlbmd0aDogTnVtYmVyIG9mIHJhbmtzIGluIHRoZSBzY2FuIHNlcXVlbmNlLgorICAqICAgICAgICAgICAtIFNlcXVlbmNlIGRpcmVjdGlvbjogVW5sZXNzIHNwZWNpZmllZCBpbiBwYXJhbWV0ZXJzLCBzZXF1ZW5jZXIKKyAgKiAgICAgICAgICAgICBzY2FuIGRpcmVjdGlvbiBpcyBmb3J3YXJkIChmcm9tIHJhbmsgMSB0byByYW5rIG4pLgorICAqICAgICAgICAgICBTZXF1ZW5jZXIgcmFua3MgYXJlIHNlbGVjdGVkIHVzaW5nCisgICogICAgICAgICAgIGZ1bmN0aW9uICJMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzKCkiLgorICAqICAgICAgICAgLSBGb3IgZGV2aWNlcyB3aXRoIHNlcXVlbmNlciBub3QgZnVsbHkgY29uZmlndXJhYmxlCisgICogICAgICAgICAgIChmdW5jdGlvbiAiTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaGFubmVscygpIiBhdmFpbGFibGUpOgorICAqICAgICAgICAgICBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBlYWNoIHJhbmsgYWZmZWN0YXRpb24gdG8gYSBjaGFubmVsCisgICogICAgICAgICAgIGFyZSBkZWZpbmVkIGJ5IGNoYW5uZWwgbnVtYmVyLgorICAqICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGNvbmZpZ3VyYXRpb24gb2Y6CisgICogICAgICAgICAgIC0gU2VxdWVuY2UgbGVuZ3RoOiBOdW1iZXIgb2YgcmFua3MgaW4gdGhlIHNjYW4gc2VxdWVuY2UgaXMKKyAgKiAgICAgICAgICAgICBkZWZpbmVkIGJ5IG51bWJlciBvZiBjaGFubmVscyBzZXQgaW4gdGhlIHNlcXVlbmNlLAorICAqICAgICAgICAgICAgIHJhbmsgb2YgZWFjaCBjaGFubmVsIGlzIGZpeGVkIGJ5IGNoYW5uZWwgSFcgbnVtYmVyLgorICAqICAgICAgICAgICAgIChjaGFubmVsIDAgZml4ZWQgb24gcmFuayAwLCBjaGFubmVsIDEgZml4ZWQgb24gcmFuazEsIC4uLikuCisgICogICAgICAgICAgIC0gU2VxdWVuY2UgZGlyZWN0aW9uOiBVbmxlc3Mgc3BlY2lmaWVkIGluIHBhcmFtZXRlcnMsIHNlcXVlbmNlcgorICAqICAgICAgICAgICAgIHNjYW4gZGlyZWN0aW9uIGlzIGZvcndhcmQgKGZyb20gbG93ZXN0IGNoYW5uZWwgbnVtYmVyIHRvCisgICogICAgICAgICAgICAgaGlnaGVzdCBjaGFubmVsIG51bWJlcikuCisgICogICAgICAgICAgIFNlcXVlbmNlciByYW5rcyBhcmUgc2VsZWN0ZWQgdXNpbmcKKyAgKiAgICAgICAgICAgZnVuY3Rpb24gIkxMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hhbm5lbHMoKSIuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBncm91cCByZWd1bGFyIHNlcXVlbmNlciBjb25maWd1cmF0aW9uCisgICogICAgICAgICBpcyBjb25kaXRpb25lZCB0byBBREMgaW5zdGFuY2Ugc2VxdWVuY2VyIG1vZGUuCisgICogICAgICAgICBJZiBBREMgaW5zdGFuY2Ugc2VxdWVuY2VyIG1vZGUgaXMgZGlzYWJsZWQsIHNlcXVlbmNlcnMgb2YKKyAgKiAgICAgICAgIGFsbCBncm91cHMgKGdyb3VwIHJlZ3VsYXIsIGdyb3VwIGluamVjdGVkKSBjYW4gYmUgY29uZmlndXJlZAorICAqICAgICAgICAgYnV0IHRoZWlyIGV4ZWN1dGlvbiBpcyBkaXNhYmxlZCAobGltaXRlZCB0byByYW5rIDEpLgorICAqICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0U2VxdWVuY2Vyc1NjYW5Nb2RlKCkuCisgICogQG5vdGUgICBTZXF1ZW5jZXIgZGlzYWJsZWQgaXMgZXF1aXZhbGVudCB0byBzZXF1ZW5jZXIgb2YgMSByYW5rOgorICAqICAgICAgICAgQURDIGNvbnZlcnNpb24gb24gb25seSAxIGNoYW5uZWwuCisgICogQHJtdG9sbCBTUVIxICAgICBMICAgICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckxlbmd0aAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFNlcXVlbmNlck5iUmFua3MgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8yUkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8zUkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV80UkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV81UkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV82UkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV83UkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV84UkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV85UkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xMFJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTFSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzEyUkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xM1JBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTRSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzE1UkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xNlJBTktTCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1NldFNlcXVlbmNlckxlbmd0aChBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgU2VxdWVuY2VyTmJSYW5rcykKK3sKKyAgTU9ESUZZX1JFRyhBREN4LT5TUVIxLCBBRENfU1FSMV9MLCBTZXF1ZW5jZXJOYlJhbmtzKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGxlbmd0aCBhbmQgc2NhbiBkaXJlY3Rpb24uCisgICogQG5vdGUgICBEZXNjcmlwdGlvbiBvZiBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZmVhdHVyZXM6CisgICogICAgICAgICAtIEZvciBkZXZpY2VzIHdpdGggc2VxdWVuY2VyIGZ1bGx5IGNvbmZpZ3VyYWJsZQorICAqICAgICAgICAgICAoZnVuY3Rpb24gIkxMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3MoKSIgYXZhaWxhYmxlKToKKyAgKiAgICAgICAgICAgc2VxdWVuY2VyIGxlbmd0aCBhbmQgZWFjaCByYW5rIGFmZmVjdGF0aW9uIHRvIGEgY2hhbm5lbAorICAqICAgICAgICAgICBhcmUgY29uZmlndXJhYmxlLgorICAqICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlczoKKyAgKiAgICAgICAgICAgLSBTZXF1ZW5jZSBsZW5ndGg6IE51bWJlciBvZiByYW5rcyBpbiB0aGUgc2NhbiBzZXF1ZW5jZS4KKyAgKiAgICAgICAgICAgLSBTZXF1ZW5jZSBkaXJlY3Rpb246IFVubGVzcyBzcGVjaWZpZWQgaW4gcGFyYW1ldGVycywgc2VxdWVuY2VyCisgICogICAgICAgICAgICAgc2NhbiBkaXJlY3Rpb24gaXMgZm9yd2FyZCAoZnJvbSByYW5rIDEgdG8gcmFuayBuKS4KKyAgKiAgICAgICAgICAgU2VxdWVuY2VyIHJhbmtzIGFyZSBzZWxlY3RlZCB1c2luZworICAqICAgICAgICAgICBmdW5jdGlvbiAiTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rcygpIi4KKyAgKiAgICAgICAgIC0gRm9yIGRldmljZXMgd2l0aCBzZXF1ZW5jZXIgbm90IGZ1bGx5IGNvbmZpZ3VyYWJsZQorICAqICAgICAgICAgICAoZnVuY3Rpb24gIkxMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hhbm5lbHMoKSIgYXZhaWxhYmxlKToKKyAgKiAgICAgICAgICAgc2VxdWVuY2VyIGxlbmd0aCBhbmQgZWFjaCByYW5rIGFmZmVjdGF0aW9uIHRvIGEgY2hhbm5lbAorICAqICAgICAgICAgICBhcmUgZGVmaW5lZCBieSBjaGFubmVsIG51bWJlci4KKyAgKiAgICAgICAgICAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXM6CisgICogICAgICAgICAgIC0gU2VxdWVuY2UgbGVuZ3RoOiBOdW1iZXIgb2YgcmFua3MgaW4gdGhlIHNjYW4gc2VxdWVuY2UgaXMKKyAgKiAgICAgICAgICAgICBkZWZpbmVkIGJ5IG51bWJlciBvZiBjaGFubmVscyBzZXQgaW4gdGhlIHNlcXVlbmNlLAorICAqICAgICAgICAgICAgIHJhbmsgb2YgZWFjaCBjaGFubmVsIGlzIGZpeGVkIGJ5IGNoYW5uZWwgSFcgbnVtYmVyLgorICAqICAgICAgICAgICAgIChjaGFubmVsIDAgZml4ZWQgb24gcmFuayAwLCBjaGFubmVsIDEgZml4ZWQgb24gcmFuazEsIC4uLikuCisgICogICAgICAgICAgIC0gU2VxdWVuY2UgZGlyZWN0aW9uOiBVbmxlc3Mgc3BlY2lmaWVkIGluIHBhcmFtZXRlcnMsIHNlcXVlbmNlcgorICAqICAgICAgICAgICAgIHNjYW4gZGlyZWN0aW9uIGlzIGZvcndhcmQgKGZyb20gbG93ZXN0IGNoYW5uZWwgbnVtYmVyIHRvCisgICogICAgICAgICAgICAgaGlnaGVzdCBjaGFubmVsIG51bWJlcikuCisgICogICAgICAgICAgIFNlcXVlbmNlciByYW5rcyBhcmUgc2VsZWN0ZWQgdXNpbmcKKyAgKiAgICAgICAgICAgZnVuY3Rpb24gIkxMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hhbm5lbHMoKSIuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBncm91cCByZWd1bGFyIHNlcXVlbmNlciBjb25maWd1cmF0aW9uCisgICogICAgICAgICBpcyBjb25kaXRpb25lZCB0byBBREMgaW5zdGFuY2Ugc2VxdWVuY2VyIG1vZGUuCisgICogICAgICAgICBJZiBBREMgaW5zdGFuY2Ugc2VxdWVuY2VyIG1vZGUgaXMgZGlzYWJsZWQsIHNlcXVlbmNlcnMgb2YKKyAgKiAgICAgICAgIGFsbCBncm91cHMgKGdyb3VwIHJlZ3VsYXIsIGdyb3VwIGluamVjdGVkKSBjYW4gYmUgY29uZmlndXJlZAorICAqICAgICAgICAgYnV0IHRoZWlyIGV4ZWN1dGlvbiBpcyBkaXNhYmxlZCAobGltaXRlZCB0byByYW5rIDEpLgorICAqICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0U2VxdWVuY2Vyc1NjYW5Nb2RlKCkuCisgICogQG5vdGUgICBTZXF1ZW5jZXIgZGlzYWJsZWQgaXMgZXF1aXZhbGVudCB0byBzZXF1ZW5jZXIgb2YgMSByYW5rOgorICAqICAgICAgICAgQURDIGNvbnZlcnNpb24gb24gb25seSAxIGNoYW5uZWwuCisgICogQHJtdG9sbCBTUVIxICAgICBMICAgICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckxlbmd0aAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMlJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfM1JBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfNFJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfNVJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfNlJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfN1JBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfOFJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfOVJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTBSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzExUkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xMlJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTNSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzE0UkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xNVJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTZSQU5LUworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyTGVuZ3RoKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5TUVIxLCBBRENfU1FSMV9MKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGU6CisgICogICAgICAgICBzZXF1ZW5jZSBzdWJkaXZpZGVkIGFuZCBzY2FuIGNvbnZlcnNpb25zIGludGVycnVwdGVkIGV2ZXJ5IHNlbGVjdGVkCisgICogICAgICAgICBudW1iZXIgb2YgcmFua3MuCisgICogQG5vdGUgICBJdCBpcyBub3QgcG9zc2libGUgdG8gZW5hYmxlIGJvdGggQURDIGdyb3VwIHJlZ3VsYXIgCisgICogICAgICAgICBjb250aW51b3VzIG1vZGUgYW5kIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUuCisgICogQG5vdGUgICBJdCBpcyBub3QgcG9zc2libGUgdG8gZW5hYmxlIGJvdGggQURDIGF1dG8taW5qZWN0ZWQgbW9kZQorICAqICAgICAgICAgYW5kIEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUuCisgICogQHJtdG9sbCBDUjEgICAgICBESVNDRU4gICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckRpc2NvbnRcbgorICAqICAgICAgICAgQ1IxICAgICAgRElTQ05VTSAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJEaXNjb250CisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgU2VxRGlzY29udCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfMVJBTksKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzJSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfM1JBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfRElTQ09OVF80UkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzVSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfNlJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfRElTQ09OVF83UkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzhSQU5LUworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJEaXNjb250KEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBTZXFEaXNjb250KQoreworICBNT0RJRllfUkVHKEFEQ3gtPkNSMSwgQURDX0NSMV9ESVNDRU4gfCBBRENfQ1IxX0RJU0NOVU0sIFNlcURpc2NvbnQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlOgorICAqICAgICAgICAgc2VxdWVuY2Ugc3ViZGl2aWRlZCBhbmQgc2NhbiBjb252ZXJzaW9ucyBpbnRlcnJ1cHRlZCBldmVyeSBzZWxlY3RlZAorICAqICAgICAgICAgbnVtYmVyIG9mIHJhbmtzLgorICAqIEBybXRvbGwgQ1IxICAgICAgRElTQ0VOICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJEaXNjb250XG4KKyAgKiAgICAgICAgIENSMSAgICAgIERJU0NOVU0gICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyRGlzY29udAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfRElTQ09OVF9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfRElTQ09OVF8xUkFOSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfMlJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfRElTQ09OVF8zUkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzRSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfNVJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfRElTQ09OVF82UkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzdSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfOFJBTktTCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJEaXNjb250KEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DUjEsIEFEQ19DUjFfRElTQ0VOIHwgQURDX0NSMV9ESVNDTlVNKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlOiBjaGFubmVsIG9uIHRoZSBzZWxlY3RlZAorICAqICAgICAgICAgc2NhbiBzZXF1ZW5jZSByYW5rLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBjb25maWd1cmF0aW9uIG9mOgorICAqICAgICAgICAgLSBDaGFubmVscyBvcmRlcmluZyBpbnRvIGVhY2ggcmFuayBvZiBzY2FuIHNlcXVlbmNlOgorICAqICAgICAgICAgICB3aGF0ZXZlciBjaGFubmVsIGNhbiBiZSBwbGFjZWQgaW50byB3aGF0ZXZlciByYW5rLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGlzCisgICogICAgICAgICBmdWxseSBjb25maWd1cmFibGU6IHNlcXVlbmNlciBsZW5ndGggYW5kIGVhY2ggcmFuaworICAqICAgICAgICAgYWZmZWN0YXRpb24gdG8gYSBjaGFubmVsIGFyZSBjb25maWd1cmFibGUuCisgICogICAgICAgICBSZWZlciB0byBkZXNjcmlwdGlvbiBvZiBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyTGVuZ3RoKCkuCisgICogQG5vdGUgICBEZXBlbmRpbmcgb24gZGV2aWNlcyBhbmQgcGFja2FnZXMsIHNvbWUgY2hhbm5lbHMgbWF5IG5vdCBiZSBhdmFpbGFibGUuCisgICogICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCB0byBtZWFzdXJlIGludGVybmFsIGNoYW5uZWxzIChWcmVmSW50LAorICAqICAgICAgICAgVGVtcFNlbnNvciwgLi4uKSwgbWVhc3VyZW1lbnQgcGF0aHMgdG8gaW50ZXJuYWwgY2hhbm5lbHMgbXVzdCBiZQorICAqICAgICAgICAgZW5hYmxlZCBzZXBhcmF0ZWx5LgorICAqICAgICAgICAgVGhpcyBjYW4gYmUgZG9uZSB1c2luZyBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaCgpLgorICAqIEBybXRvbGwgU1FSMyAgICAgU1ExICAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVIzICAgICBTUTIgICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjMgICAgIFNRMyAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSMyAgICAgU1E0ICAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVIzICAgICBTUTUgICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjMgICAgIFNRNiAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSMiAgICAgU1E3ICAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVIyICAgICBTUTggICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjIgICAgIFNROSAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSMiAgICAgU1ExMCAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVIyICAgICBTUTExICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjIgICAgIFNRMTIgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSMSAgICAgU1ExMyAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVIxICAgICBTUTE0ICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjEgICAgIFNRMTUgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSMSAgICAgU1ExNiAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rcworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJhbmsgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS184CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMTYKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SICAgKDEpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiBTVE0zMkYzN3gsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzEuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBSYW5rLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBTZXQgYml0cyB3aXRoIGNvbnRlbnQgb2YgcGFyYW1ldGVyICJDaGFubmVsIiB3aXRoIGJpdHMgcG9zaXRpb24gICAgICAgICAgKi8KKyAgLyogaW4gcmVnaXN0ZXIgYW5kIHJlZ2lzdGVyIHBvc2l0aW9uIGRlcGVuZGluZyBvbiBwYXJhbWV0ZXIgIlJhbmsiLiAgICAgICAgICovCisgIC8qIFBhcmFtZXRlcnMgIlJhbmsiIGFuZCAiQ2hhbm5lbCIgYXJlIHVzZWQgd2l0aCBtYXNrcyBiZWNhdXNlIGNvbnRhaW5pbmcgICAqLworICAvKiBvdGhlciBiaXRzIHJlc2VydmVkIGZvciBvdGhlciBwdXJwb3NlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQURDX1BUUl9SRUdfT0ZGU0VUKEFEQ3gtPlNRUjEsIF9fQURDX01BU0tfU0hJRlQoUmFuaywgQURDX1JFR19TUVJYX1JFR09GRlNFVF9NQVNLKSk7CisgIAorICBNT0RJRllfUkVHKCpwcmVnLAorICAgICAgICAgICAgIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLIDw8IChSYW5rICYgQURDX1JFR19SQU5LX0lEX1NRUlhfTUFTSyksCisgICAgICAgICAgICAgKENoYW5uZWwgJiBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSykgPDwgKFJhbmsgJiBBRENfUkVHX1JBTktfSURfU1FSWF9NQVNLKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlOiBjaGFubmVsIG9uIHRoZSBzZWxlY3RlZAorICAqICAgICAgICAgc2NhbiBzZXF1ZW5jZSByYW5rLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGlzCisgICogICAgICAgICBmdWxseSBjb25maWd1cmFibGU6IHNlcXVlbmNlciBsZW5ndGggYW5kIGVhY2ggcmFuaworICAqICAgICAgICAgYWZmZWN0YXRpb24gdG8gYSBjaGFubmVsIGFyZSBjb25maWd1cmFibGUuCisgICogICAgICAgICBSZWZlciB0byBkZXNjcmlwdGlvbiBvZiBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyTGVuZ3RoKCkuCisgICogQG5vdGUgICBEZXBlbmRpbmcgb24gZGV2aWNlcyBhbmQgcGFja2FnZXMsIHNvbWUgY2hhbm5lbHMgbWF5IG5vdCBiZSBhdmFpbGFibGUuCisgICogICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuCisgICogQG5vdGUgICBVc2FnZSBvZiB0aGUgcmV0dXJuZWQgY2hhbm5lbCBudW1iZXI6CisgICogICAgICAgICAtIFRvIHJlaW5qZWN0IHRoaXMgY2hhbm5lbCBpbnRvIGFub3RoZXIgZnVuY3Rpb24gTExfQURDX3h4eDoKKyAgKiAgICAgICAgICAgdGhlIHJldHVybmVkIGNoYW5uZWwgbnVtYmVyIGlzIG9ubHkgcGFydGx5IGZvcm1hdHRlZCBvbiBkZWZpbml0aW9uCisgICogICAgICAgICAgIG9mIGxpdGVyYWxzIExMX0FEQ19DSEFOTkVMX3guIFRoZXJlZm9yZSwgaXQgaGFzIHRvIGJlIGNvbXBhcmVkCisgICogICAgICAgICAgIHdpdGggcGFydHMgb2YgbGl0ZXJhbHMgTExfQURDX0NIQU5ORUxfeCBvciB1c2luZworICAqICAgICAgICAgICBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoKS4KKyAgKiAgICAgICAgICAgVGhlbiB0aGUgc2VsZWN0ZWQgbGl0ZXJhbCBMTF9BRENfQ0hBTk5FTF94IGNhbiBiZSB1c2VkCisgICogICAgICAgICAgIGFzIHBhcmFtZXRlciBmb3IgYW5vdGhlciBmdW5jdGlvbi4KKyAgKiAgICAgICAgIC0gVG8gZ2V0IHRoZSBjaGFubmVsIG51bWJlciBpbiBkZWNpbWFsIGZvcm1hdDoKKyAgKiAgICAgICAgICAgcHJvY2VzcyB0aGUgcmV0dXJuZWQgdmFsdWUgd2l0aCB0aGUgaGVscGVyIG1hY3JvCisgICogICAgICAgICAgIEByZWYgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKCkuCisgICogQHJtdG9sbCBTUVIzICAgICBTUTEgICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjMgICAgIFNRMiAgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSMyAgICAgU1EzICAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVIzICAgICBTUTQgICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjMgICAgIFNRNSAgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSMyAgICAgU1E2ICAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVIyICAgICBTUTcgICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjIgICAgIFNROCAgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSMiAgICAgU1E5ICAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVIyICAgICBTUTEwICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjIgICAgIFNRMTEgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSMiAgICAgU1ExMiAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVIxICAgICBTUTEzICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjEgICAgIFNRMTQgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSMSAgICAgU1ExNSAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVIxICAgICBTUTE2ICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgUmFuayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS180CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS183CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18xNgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SICAgKDEpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiBTVE0zMkYzN3gsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzEuXG4KKyAgKiAgICAgICAgICgxKSBGb3IgQURDIGNoYW5uZWwgcmVhZCBiYWNrIGZyb20gQURDIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAgIGNvbXBhcmlzb24gd2l0aCBpbnRlcm5hbCBjaGFubmVsIHBhcmFtZXRlciB0byBiZSBkb25lCisgICogICAgICAgICAgICAgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0hBTk5FTF9JTlRFUk5BTF9UT19FWFRFUk5BTCgpLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3MoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFJhbmspCit7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVChBREN4LT5TUVIxLCBfX0FEQ19NQVNLX1NISUZUKFJhbmssIEFEQ19SRUdfU1FSWF9SRUdPRkZTRVRfTUFTSykpOworICAKKyAgcmV0dXJuICh1aW50MzJfdCkgKFJFQURfQklUKCpwcmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0sgPDwgKFJhbmsgJiBBRENfUkVHX1JBTktfSURfU1FSWF9NQVNLKSkKKyAgICAgICAgICAgICAgICAgICAgID4+IChSYW5rICYgQURDX1JFR19SQU5LX0lEX1NRUlhfTUFTSykKKyAgICAgICAgICAgICAgICAgICAgKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIGNvbnRpbnVvdXMgY29udmVyc2lvbiBtb2RlIG9uIEFEQyBncm91cCByZWd1bGFyLgorICAqIEBub3RlICAgRGVzY3JpcHRpb24gb2YgQURDIGNvbnRpbnVvdXMgY29udmVyc2lvbiBtb2RlOgorICAqICAgICAgICAgLSBzaW5nbGUgbW9kZTogb25lIGNvbnZlcnNpb24gcGVyIHRyaWdnZXIKKyAgKiAgICAgICAgIC0gY29udGludW91cyBtb2RlOiBhZnRlciB0aGUgZmlyc3QgdHJpZ2dlciwgZm9sbG93aW5nCisgICogICAgICAgICAgIGNvbnZlcnNpb25zIGxhdW5jaGVkIHN1Y2Nlc3NpdmVseSBhdXRvbWF0aWNhbGx5LgorICAqIEBub3RlICAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIGVuYWJsZSBib3RoIEFEQyBncm91cCByZWd1bGFyIAorICAqICAgICAgICAgY29udGludW91cyBtb2RlIGFuZCBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlLgorICAqIEBybXRvbGwgQ1IyICAgICAgQ09OVCAgICAgICAgICAgTExfQURDX1JFR19TZXRDb250aW51b3VzTW9kZQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENvbnRpbnVvdXMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX0NPTlZfU0lOR0xFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19DT05WX0NPTlRJTlVPVVMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19SRUdfU2V0Q29udGludW91c01vZGUoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IENvbnRpbnVvdXMpCit7CisgIE1PRElGWV9SRUcoQURDeC0+Q1IyLCBBRENfQ1IyX0NPTlQsIENvbnRpbnVvdXMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgY29udGludW91cyBjb252ZXJzaW9uIG1vZGUgb24gQURDIGdyb3VwIHJlZ3VsYXIuCisgICogQG5vdGUgICBEZXNjcmlwdGlvbiBvZiBBREMgY29udGludW91cyBjb252ZXJzaW9uIG1vZGU6CisgICogICAgICAgICAtIHNpbmdsZSBtb2RlOiBvbmUgY29udmVyc2lvbiBwZXIgdHJpZ2dlcgorICAqICAgICAgICAgLSBjb250aW51b3VzIG1vZGU6IGFmdGVyIHRoZSBmaXJzdCB0cmlnZ2VyLCBmb2xsb3dpbmcKKyAgKiAgICAgICAgICAgY29udmVyc2lvbnMgbGF1bmNoZWQgc3VjY2Vzc2l2ZWx5IGF1dG9tYXRpY2FsbHkuCisgICogQHJtdG9sbCBDUjIgICAgICBDT05UICAgICAgICAgICBMTF9BRENfUkVHX0dldENvbnRpbnVvdXNNb2RlCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX0NPTlZfU0lOR0xFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19DT05WX0NPTlRJTlVPVVMKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfUkVHX0dldENvbnRpbnVvdXNNb2RlKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DUjIsIEFEQ19DUjJfQ09OVCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIGRhdGEgdHJhbnNmZXI6IG5vIHRyYW5zZmVyIG9yCisgICogICAgICAgICB0cmFuc2ZlciBieSBETUEsIGFuZCBETUEgcmVxdWVzdHMgbW9kZS4KKyAgKiBAbm90ZSAgIElmIHRyYW5zZmVyIGJ5IERNQSBzZWxlY3RlZCwgc3BlY2lmaWVzIHRoZSBETUEgcmVxdWVzdHMKKyAgKiAgICAgICAgIG1vZGU6CisgICogICAgICAgICAtIExpbWl0ZWQgbW9kZSAoT25lIHNob3QgbW9kZSk6IERNQSB0cmFuc2ZlciByZXF1ZXN0cyBhcmUgc3RvcHBlZAorICAqICAgICAgICAgICB3aGVuIG51bWJlciBvZiBETUEgZGF0YSB0cmFuc2ZlcnMgKG51bWJlciBvZgorICAqICAgICAgICAgICBBREMgY29udmVyc2lvbnMpIGlzIHJlYWNoZWQuCisgICogICAgICAgICAgIFRoaXMgQURDIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIERNQSBtb2RlIG5vbi1jaXJjdWxhci4KKyAgKiAgICAgICAgIC0gVW5saW1pdGVkIG1vZGU6IERNQSB0cmFuc2ZlciByZXF1ZXN0cyBhcmUgdW5saW1pdGVkLAorICAqICAgICAgICAgICB3aGF0ZXZlciBudW1iZXIgb2YgRE1BIGRhdGEgdHJhbnNmZXJzIChudW1iZXIgb2YKKyAgKiAgICAgICAgICAgQURDIGNvbnZlcnNpb25zKS4KKyAgKiAgICAgICAgICAgVGhpcyBBREMgbW9kZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggRE1BIG1vZGUgY2lyY3VsYXIuCisgICogQG5vdGUgICBJZiBBREMgRE1BIHJlcXVlc3RzIG1vZGUgaXMgc2V0IHRvIHVubGltaXRlZCBhbmQgRE1BIGlzIHNldCB0bworICAqICAgICAgICAgbW9kZSBub24tY2lyY3VsYXI6CisgICogICAgICAgICB3aGVuIERNQSB0cmFuc2ZlcnMgc2l6ZSB3aWxsIGJlIHJlYWNoZWQsIERNQSB3aWxsIHN0b3AgdHJhbnNmZXJzIG9mCisgICogICAgICAgICBBREMgY29udmVyc2lvbnMgZGF0YSBBREMgd2lsbCByYWlzZSBhbiBvdmVycnVuIGVycm9yCisgICogICAgICAgIChvdmVycnVuIGZsYWcgYW5kIGludGVycnVwdGlvbiBpZiBlbmFibGVkKS4KKyAgKiBAbm90ZSAgIFRvIGNvbmZpZ3VyZSBETUEgc291cmNlIGFkZHJlc3MgKHBlcmlwaGVyYWwgYWRkcmVzcyksCisgICogICAgICAgICB1c2UgZnVuY3Rpb24gQHJlZiBMTF9BRENfRE1BX0dldFJlZ0FkZHIoKS4KKyAgKiBAcm10b2xsIENSMiAgICAgIERNQSAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0RE1BVHJhbnNmZXIKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBETUFUcmFuc2ZlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9VTkxJTUlURUQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19SRUdfU2V0RE1BVHJhbnNmZXIoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IERNQVRyYW5zZmVyKQoreworICBNT0RJRllfUkVHKEFEQ3gtPkNSMiwgQURDX0NSMl9ETUEsIERNQVRyYW5zZmVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhIHRyYW5zZmVyOiBubyB0cmFuc2ZlciBvcgorICAqICAgICAgICAgdHJhbnNmZXIgYnkgRE1BLCBhbmQgRE1BIHJlcXVlc3RzIG1vZGUuCisgICogQG5vdGUgICBJZiB0cmFuc2ZlciBieSBETUEgc2VsZWN0ZWQsIHNwZWNpZmllcyB0aGUgRE1BIHJlcXVlc3RzCisgICogICAgICAgICBtb2RlOgorICAqICAgICAgICAgLSBMaW1pdGVkIG1vZGUgKE9uZSBzaG90IG1vZGUpOiBETUEgdHJhbnNmZXIgcmVxdWVzdHMgYXJlIHN0b3BwZWQKKyAgKiAgICAgICAgICAgd2hlbiBudW1iZXIgb2YgRE1BIGRhdGEgdHJhbnNmZXJzIChudW1iZXIgb2YKKyAgKiAgICAgICAgICAgQURDIGNvbnZlcnNpb25zKSBpcyByZWFjaGVkLgorICAqICAgICAgICAgICBUaGlzIEFEQyBtb2RlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBETUEgbW9kZSBub24tY2lyY3VsYXIuCisgICogICAgICAgICAtIFVubGltaXRlZCBtb2RlOiBETUEgdHJhbnNmZXIgcmVxdWVzdHMgYXJlIHVubGltaXRlZCwKKyAgKiAgICAgICAgICAgd2hhdGV2ZXIgbnVtYmVyIG9mIERNQSBkYXRhIHRyYW5zZmVycyAobnVtYmVyIG9mCisgICogICAgICAgICAgIEFEQyBjb252ZXJzaW9ucykuCisgICogICAgICAgICAgIFRoaXMgQURDIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIERNQSBtb2RlIGNpcmN1bGFyLgorICAqIEBub3RlICAgSWYgQURDIERNQSByZXF1ZXN0cyBtb2RlIGlzIHNldCB0byB1bmxpbWl0ZWQgYW5kIERNQSBpcyBzZXQgdG8KKyAgKiAgICAgICAgIG1vZGUgbm9uLWNpcmN1bGFyOgorICAqICAgICAgICAgd2hlbiBETUEgdHJhbnNmZXJzIHNpemUgd2lsbCBiZSByZWFjaGVkLCBETUEgd2lsbCBzdG9wIHRyYW5zZmVycyBvZgorICAqICAgICAgICAgQURDIGNvbnZlcnNpb25zIGRhdGEgQURDIHdpbGwgcmFpc2UgYW4gb3ZlcnJ1biBlcnJvcgorICAqICAgICAgICAgKG92ZXJydW4gZmxhZyBhbmQgaW50ZXJydXB0aW9uIGlmIGVuYWJsZWQpLgorICAqIEBub3RlICAgVG8gY29uZmlndXJlIERNQSBzb3VyY2UgYWRkcmVzcyAocGVyaXBoZXJhbCBhZGRyZXNzKSwKKyAgKiAgICAgICAgIHVzZSBmdW5jdGlvbiBAcmVmIExMX0FEQ19ETUFfR2V0UmVnQWRkcigpLgorICAqIEBybXRvbGwgQ1IyICAgICAgRE1BICAgICAgICAgICAgTExfQURDX1JFR19HZXRETUFUcmFuc2ZlcgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19ETUFfVFJBTlNGRVJfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX1VOTElNSVRFRAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfR2V0RE1BVHJhbnNmZXIoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNSMiwgQURDX0NSMl9ETUEpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUZfQ29uZmlndXJhdGlvbl9BRENfR3JvdXBfSW5qZWN0ZWQgQ29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiBncm91cCBpbmplY3RlZAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgc291cmNlOgorICAqICAgICAgICAgaW50ZXJuYWwgKFNXIHN0YXJ0KSBvciBleHRlcm5hbCBmcm9tIHRpbWVyIG9yIGV4dGVybmFsIGludGVycnVwdC4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIGV4dGVybmFsIHRyaWdnZXIgaXMgc2V0IHdpdGggdHJpZ2dlciBwb2xhcml0eToKKyAgKiAgICAgICAgIHJpc2luZyBlZGdlIChvbmx5IHRyaWdnZXIgcG9sYXJpdHkgYXZhaWxhYmxlIG9uIHRoaXMgU1RNMzIgc2VyaWUpLgorICAqIEBub3RlICAgQXZhaWxhYmlsaXR5IG9mIHBhcmFtZXRlcnMgb2YgdHJpZ2dlciBzb3VyY2VzIGZyb20gdGltZXIgCisgICogICAgICAgICBkZXBlbmRzIG9uIHRpbWVycyBhdmFpbGFiaWxpdHkgb24gdGhlIHNlbGVjdGVkIGRldmljZS4KKyAgKiBAcm10b2xsIENSMiAgICAgIEpFWFRTRUwgICAgICAgIExMX0FEQ19JTkpfU2V0VHJpZ2dlclNvdXJjZQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRyaWdnZXJTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfVFJHTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU00X1RSR08KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTE5X0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMTlfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9FWFRJX0xJTkUxNQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0lOSl9TZXRUcmlnZ2VyU291cmNlKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBUcmlnZ2VyU291cmNlKQoreworLyogTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZSwgQURDIGdyb3VwIGluamVjdGVkIGV4dGVybmFsIHRyaWdnZXIgZWRnZSAgICAgICAgKi8KKy8qICAgICAgIGlzIHVzZWQgdG8gcGVyZm9ybSBhIEFEQyBjb252ZXJzaW9uIHN0YXJ0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHNldCBleHRlcm5hbCB0cmlnZ2VyIGVkZ2UuICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgVGhpcyBmZWF0dXJlIGlzIHNldCB1c2luZyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIEByZWYgTExfQURDX0lOSl9TdGFydENvbnZlcnNpb25FeHRUcmlnKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIE1PRElGWV9SRUcoQURDeC0+Q1IyLCBBRENfQ1IyX0pFWFRTRUwsIChUcmlnZ2VyU291cmNlICYgQURDX0NSMl9KRVhUU0VMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgc291cmNlOgorICAqICAgICAgICAgaW50ZXJuYWwgKFNXIHN0YXJ0KSBvciBleHRlcm5hbCBmcm9tIHRpbWVyIG9yIGV4dGVybmFsIGludGVycnVwdC4KKyAgKiBAbm90ZSAgIFRvIGRldGVybWluZSB3aGV0aGVyIGdyb3VwIGluamVjdGVkIHRyaWdnZXIgc291cmNlIGlzCisgICogICAgICAgICBpbnRlcm5hbCAoU1cgc3RhcnQpIG9yIGV4dGVybmFsLCB3aXRob3V0IGRldGFpbAorICAqICAgICAgICAgb2Ygd2hpY2ggcGVyaXBoZXJhbCBpcyBzZWxlY3RlZCBhcyBleHRlcm5hbCB0cmlnZ2VyLAorICAqICAgICAgICAgKGVxdWl2YWxlbnQgdG8gCisgICogICAgICAgICAiaWYoTExfQURDX0lOSl9HZXRUcmlnZ2VyU291cmNlKEFEQzEpID09IExMX0FEQ19JTkpfVFJJR19TT0ZUV0FSRSkiKQorICAqICAgICAgICAgdXNlIGZ1bmN0aW9uIEByZWYgTExfQURDX0lOSl9Jc1RyaWdnZXJTb3VyY2VTV1N0YXJ0LgorICAqIEBub3RlICAgQXZhaWxhYmlsaXR5IG9mIHBhcmFtZXRlcnMgb2YgdHJpZ2dlciBzb3VyY2VzIGZyb20gdGltZXIgCisgICogICAgICAgICBkZXBlbmRzIG9uIHRpbWVycyBhdmFpbGFiaWxpdHkgb24gdGhlIHNlbGVjdGVkIGRldmljZS4KKyAgKiBAcm10b2xsIENSMiAgICAgIEpFWFRTRUwgICAgICAgIExMX0FEQ19JTkpfR2V0VHJpZ2dlclNvdXJjZQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX1NPRlRXQVJFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0yX1RSR08KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9UUkdPCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0xOV9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTE5X0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfRVhUSV9MSU5FMTUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSU5KX0dldFRyaWdnZXJTb3VyY2UoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNSMiwgQURDX0NSMl9KRVhUU0VMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgc291cmNlIGludGVybmFsIChTVyBzdGFydCkKKyAgICAgICAgICAgIG9yIGV4dGVybmFsCisgICogQG5vdGUgICBJbiBjYXNlIG9mIGdyb3VwIGluamVjdGVkIHRyaWdnZXIgc291cmNlIHNldCB0byBleHRlcm5hbCB0cmlnZ2VyLAorICAqICAgICAgICAgdG8gZGV0ZXJtaW5lIHdoaWNoIHBlcmlwaGVyYWwgaXMgc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgdHJpZ2dlciwKKyAgKiAgICAgICAgIHVzZSBmdW5jdGlvbiBAcmVmIExMX0FEQ19JTkpfR2V0VHJpZ2dlclNvdXJjZS4KKyAgKiBAcm10b2xsIENSMiAgICAgIEpFWFRTRUwgICAgICAgIExMX0FEQ19JTkpfSXNUcmlnZ2VyU291cmNlU1dTdGFydAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlICIwIiB0cmlnZ2VyIHNvdXJjZSBleHRlcm5hbCB0cmlnZ2VyCisgICogICAgICAgICBWYWx1ZSAiMSIgdHJpZ2dlciBzb3VyY2UgU1cgc3RhcnQuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lOSl9Jc1RyaWdnZXJTb3VyY2VTV1N0YXJ0KEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3gtPkNSMiwgQURDX0NSMl9KRVhUU0VMKSA9PSBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGxlbmd0aCBhbmQgc2NhbiBkaXJlY3Rpb24uCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGNvbmZpZ3VyYXRpb24gb2Y6CisgICogICAgICAgICAtIFNlcXVlbmNlIGxlbmd0aDogTnVtYmVyIG9mIHJhbmtzIGluIHRoZSBzY2FuIHNlcXVlbmNlLgorICAqICAgICAgICAgLSBTZXF1ZW5jZSBkaXJlY3Rpb246IFVubGVzcyBzcGVjaWZpZWQgaW4gcGFyYW1ldGVycywgc2VxdWVuY2VyCisgICogICAgICAgICAgIHNjYW4gZGlyZWN0aW9uIGlzIGZvcndhcmQgKGZyb20gcmFuayAxIHRvIHJhbmsgbikuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgY29uZmlndXJhdGlvbgorICAqICAgICAgICAgaXMgY29uZGl0aW9uZWQgdG8gQURDIGluc3RhbmNlIHNlcXVlbmNlciBtb2RlLgorICAqICAgICAgICAgSWYgQURDIGluc3RhbmNlIHNlcXVlbmNlciBtb2RlIGlzIGRpc2FibGVkLCBzZXF1ZW5jZXJzIG9mCisgICogICAgICAgICBhbGwgZ3JvdXBzIChncm91cCByZWd1bGFyLCBncm91cCBpbmplY3RlZCkgY2FuIGJlIGNvbmZpZ3VyZWQKKyAgKiAgICAgICAgIGJ1dCB0aGVpciBleGVjdXRpb24gaXMgZGlzYWJsZWQgKGxpbWl0ZWQgdG8gcmFuayAxKS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldFNlcXVlbmNlcnNTY2FuTW9kZSgpLgorICAqIEBub3RlICAgU2VxdWVuY2VyIGRpc2FibGVkIGlzIGVxdWl2YWxlbnQgdG8gc2VxdWVuY2VyIG9mIDEgcmFuazoKKyAgKiAgICAgICAgIEFEQyBjb252ZXJzaW9uIG9uIG9ubHkgMSBjaGFubmVsLgorICAqIEBybXRvbGwgSlNRUiAgICAgSkwgICAgICAgICAgICAgTExfQURDX0lOSl9TZXRTZXF1ZW5jZXJMZW5ndGgKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBTZXF1ZW5jZXJOYlJhbmtzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9TRVFfU0NBTl9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9TRVFfU0NBTl9FTkFCTEVfMlJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9TRVFfU0NBTl9FTkFCTEVfM1JBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9TRVFfU0NBTl9FTkFCTEVfNFJBTktTCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfSU5KX1NldFNlcXVlbmNlckxlbmd0aChBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgU2VxdWVuY2VyTmJSYW5rcykKK3sKKyAgTU9ESUZZX1JFRyhBREN4LT5KU1FSLCBBRENfSlNRUl9KTCwgU2VxdWVuY2VyTmJSYW5rcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBzY2FuIGRpcmVjdGlvbi4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzOgorICAqICAgICAgICAgLSBTZXF1ZW5jZSBsZW5ndGg6IE51bWJlciBvZiByYW5rcyBpbiB0aGUgc2NhbiBzZXF1ZW5jZS4KKyAgKiAgICAgICAgIC0gU2VxdWVuY2UgZGlyZWN0aW9uOiBVbmxlc3Mgc3BlY2lmaWVkIGluIHBhcmFtZXRlcnMsIHNlcXVlbmNlcgorICAqICAgICAgICAgICBzY2FuIGRpcmVjdGlvbiBpcyBmb3J3YXJkIChmcm9tIHJhbmsgMSB0byByYW5rIG4pLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGNvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBpbnN0YW5jZSBzZXF1ZW5jZXIgbW9kZS4KKyAgKiAgICAgICAgIElmIEFEQyBpbnN0YW5jZSBzZXF1ZW5jZXIgbW9kZSBpcyBkaXNhYmxlZCwgc2VxdWVuY2VycyBvZgorICAqICAgICAgICAgYWxsIGdyb3VwcyAoZ3JvdXAgcmVndWxhciwgZ3JvdXAgaW5qZWN0ZWQpIGNhbiBiZSBjb25maWd1cmVkCisgICogICAgICAgICBidXQgdGhlaXIgZXhlY3V0aW9uIGlzIGRpc2FibGVkIChsaW1pdGVkIHRvIHJhbmsgMSkuCisgICogICAgICAgICBSZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRTZXF1ZW5jZXJzU2Nhbk1vZGUoKS4KKyAgKiBAbm90ZSAgIFNlcXVlbmNlciBkaXNhYmxlZCBpcyBlcXVpdmFsZW50IHRvIHNlcXVlbmNlciBvZiAxIHJhbms6CisgICogICAgICAgICBBREMgY29udmVyc2lvbiBvbiBvbmx5IDEgY2hhbm5lbC4KKyAgKiBAcm10b2xsIEpTUVIgICAgIEpMICAgICAgICAgICAgIExMX0FEQ19JTkpfR2V0U2VxdWVuY2VyTGVuZ3RoCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1NFUV9TQ0FOX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1NFUV9TQ0FOX0VOQUJMRV8yUkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1NFUV9TQ0FOX0VOQUJMRV8zUkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1NFUV9TQ0FOX0VOQUJMRV80UkFOS1MKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSU5KX0dldFNlcXVlbmNlckxlbmd0aChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+SlNRUiwgQURDX0pTUVJfSkwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGU6CisgICogICAgICAgICBzZXF1ZW5jZSBzdWJkaXZpZGVkIGFuZCBzY2FuIGNvbnZlcnNpb25zIGludGVycnVwdGVkIGV2ZXJ5IHNlbGVjdGVkCisgICogICAgICAgICBudW1iZXIgb2YgcmFua3MuCisgICogQG5vdGUgICBJdCBpcyBub3QgcG9zc2libGUgdG8gZW5hYmxlIGJvdGggQURDIGdyb3VwIGluamVjdGVkCisgICogICAgICAgICBhdXRvLWluamVjdGVkIG1vZGUgYW5kIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUuCisgICogQHJtdG9sbCBDUjEgICAgICBESVNDRU4gICAgICAgICBMTF9BRENfSU5KX1NldFNlcXVlbmNlckRpc2NvbnQKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBTZXFEaXNjb250IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9TRVFfRElTQ09OVF9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9TRVFfRElTQ09OVF8xUkFOSworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0lOSl9TZXRTZXF1ZW5jZXJEaXNjb250KEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBTZXFEaXNjb250KQoreworICBNT0RJRllfUkVHKEFEQ3gtPkNSMSwgQURDX0NSMV9KRElTQ0VOLCBTZXFEaXNjb250KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGU6CisgICogICAgICAgICBzZXF1ZW5jZSBzdWJkaXZpZGVkIGFuZCBzY2FuIGNvbnZlcnNpb25zIGludGVycnVwdGVkIGV2ZXJ5IHNlbGVjdGVkCisgICogICAgICAgICBudW1iZXIgb2YgcmFua3MuCisgICogQHJtdG9sbCBDUjEgICAgICBESVNDRU4gICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlckRpc2NvbnQKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX0RJU0NPTlRfRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX0RJU0NPTlRfMVJBTksKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSU5KX0dldFNlcXVlbmNlckRpc2NvbnQoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNSMSwgQURDX0NSMV9KRElTQ0VOKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZTogY2hhbm5lbCBvbiB0aGUgc2VsZWN0ZWQKKyAgKiAgICAgICAgIHNlcXVlbmNlIHJhbmsuCisgICogQG5vdGUgICBEZXBlbmRpbmcgb24gZGV2aWNlcyBhbmQgcGFja2FnZXMsIHNvbWUgY2hhbm5lbHMgbWF5IG5vdCBiZSBhdmFpbGFibGUuCisgICogICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCB0byBtZWFzdXJlIGludGVybmFsIGNoYW5uZWxzIChWcmVmSW50LAorICAqICAgICAgICAgVGVtcFNlbnNvciwgLi4uKSwgbWVhc3VyZW1lbnQgcGF0aHMgdG8gaW50ZXJuYWwgY2hhbm5lbHMgbXVzdCBiZQorICAqICAgICAgICAgZW5hYmxlZCBzZXBhcmF0ZWx5LgorICAqICAgICAgICAgVGhpcyBjYW4gYmUgZG9uZSB1c2luZyBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaCgpLgorICAqIEBybXRvbGwgSlNRUiAgICAgSlNRMSAgICAgICAgICAgTExfQURDX0lOSl9TZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBKU1FSICAgICBKU1EyICAgICAgICAgICBMTF9BRENfSU5KX1NldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIEpTUVIgICAgIEpTUTMgICAgICAgICAgIExMX0FEQ19JTkpfU2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgSlNRUiAgICAgSlNRNCAgICAgICAgICAgTExfQURDX0lOSl9TZXRTZXF1ZW5jZXJSYW5rcworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJhbmsgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfNAorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IgICAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyRjM3eCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19JTkpfU2V0U2VxdWVuY2VyUmFua3MoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFJhbmssIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIFNldCBiaXRzIHdpdGggY29udGVudCBvZiBwYXJhbWV0ZXIgIkNoYW5uZWwiIHdpdGggYml0cyBwb3NpdGlvbiAgICAgICAgICAqLworICAvKiBpbiByZWdpc3RlciBkZXBlbmRpbmcgb24gcGFyYW1ldGVyICJSYW5rIi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUGFyYW1ldGVycyAiUmFuayIgYW5kICJDaGFubmVsIiBhcmUgdXNlZCB3aXRoIG1hc2tzIGJlY2F1c2UgY29udGFpbmluZyAgICovCisgIC8qIG90aGVyIGJpdHMgcmVzZXJ2ZWQgZm9yIG90aGVyIHB1cnBvc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBNT0RJRllfUkVHKEFEQ3gtPkpTUVIsCisgICAgICAgICAgICAgQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0sgPDwgKFJhbmsgJiBBRENfSU5KX1JBTktfSURfSlNRUl9NQVNLKSwKKyAgICAgICAgICAgICAoQ2hhbm5lbCAmIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLKSA8PCAoUmFuayAmIEFEQ19JTkpfUkFOS19JRF9KU1FSX01BU0spKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlOiBjaGFubmVsIG9uIHRoZSBzZWxlY3RlZAorICAqICAgICAgICAgc2VxdWVuY2UgcmFuay4KKyAgKiBAbm90ZSAgIERlcGVuZGluZyBvbiBkZXZpY2VzIGFuZCBwYWNrYWdlcywgc29tZSBjaGFubmVscyBtYXkgbm90IGJlIGF2YWlsYWJsZS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAgKiBAbm90ZSAgIFVzYWdlIG9mIHRoZSByZXR1cm5lZCBjaGFubmVsIG51bWJlcjoKKyAgKiAgICAgICAgIC0gVG8gcmVpbmplY3QgdGhpcyBjaGFubmVsIGludG8gYW5vdGhlciBmdW5jdGlvbiBMTF9BRENfeHh4OgorICAqICAgICAgICAgICB0aGUgcmV0dXJuZWQgY2hhbm5lbCBudW1iZXIgaXMgb25seSBwYXJ0bHkgZm9ybWF0dGVkIG9uIGRlZmluaXRpb24KKyAgKiAgICAgICAgICAgb2YgbGl0ZXJhbHMgTExfQURDX0NIQU5ORUxfeC4gVGhlcmVmb3JlLCBpdCBoYXMgdG8gYmUgY29tcGFyZWQKKyAgKiAgICAgICAgICAgd2l0aCBwYXJ0cyBvZiBsaXRlcmFscyBMTF9BRENfQ0hBTk5FTF94IG9yIHVzaW5nCisgICogICAgICAgICAgIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQigpLgorICAqICAgICAgICAgICBUaGVuIHRoZSBzZWxlY3RlZCBsaXRlcmFsIExMX0FEQ19DSEFOTkVMX3ggY2FuIGJlIHVzZWQKKyAgKiAgICAgICAgICAgYXMgcGFyYW1ldGVyIGZvciBhbm90aGVyIGZ1bmN0aW9uLgorICAqICAgICAgICAgLSBUbyBnZXQgdGhlIGNoYW5uZWwgbnVtYmVyIGluIGRlY2ltYWwgZm9ybWF0OgorICAqICAgICAgICAgICBwcm9jZXNzIHRoZSByZXR1cm5lZCB2YWx1ZSB3aXRoIHRoZSBoZWxwZXIgbWFjcm8KKyAgKiAgICAgICAgICAgQHJlZiBfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoKS4KKyAgKiBAcm10b2xsIEpTUVIgICAgIEpTUTEgICAgICAgICAgIExMX0FEQ19JTkpfU2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgSlNRUiAgICAgSlNRMiAgICAgICAgICAgTExfQURDX0lOSl9TZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBKU1FSICAgICBKU1EzICAgICAgICAgICBMTF9BRENfSU5KX1NldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIEpTUVIgICAgIEpTUTQgICAgICAgICAgIExMX0FEQ19JTkpfU2V0U2VxdWVuY2VyUmFua3MKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBSYW5rIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzQKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiAgICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gU1RNMzJGMzd4LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLlxuCisgICogICAgICAgICAoMSkgRm9yIEFEQyBjaGFubmVsIHJlYWQgYmFjayBmcm9tIEFEQyByZWdpc3RlciwKKyAgKiAgICAgICAgICAgICBjb21wYXJpc29uIHdpdGggaW50ZXJuYWwgY2hhbm5lbCBwYXJhbWV0ZXIgdG8gYmUgZG9uZQorICAqICAgICAgICAgICAgIHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NIQU5ORUxfSU5URVJOQUxfVE9fRVhURVJOQUwoKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSU5KX0dldFNlcXVlbmNlclJhbmtzKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBSYW5rKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5KU1FSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSyA8PCAoUmFuayAmIEFEQ19JTkpfUkFOS19JRF9KU1FSX01BU0spKQorICAgICAgICAgICAgICAgICAgICA+PiAoUmFuayAmIEFEQ19JTkpfUkFOS19JRF9KU1FSX01BU0spCisgICAgICAgICAgICAgICAgICAgKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlcjoKKyAgKiAgICAgICAgIGluZGVwZW5kZW50IG9yIGZyb20gQURDIGdyb3VwIHJlZ3VsYXIuCisgICogQG5vdGUgICBUaGlzIG1vZGUgY2FuIGJlIHVzZWQgdG8gZXh0ZW5kIG51bWJlciBvZiBkYXRhIHJlZ2lzdGVycworICAqICAgICAgICAgdXBkYXRlZCBhZnRlciBvbmUgQURDIGNvbnZlcnNpb24gdHJpZ2dlciBhbmQgd2l0aCBkYXRhIAorICAqICAgICAgICAgcGVybWFuZW50bHkga2VwdCAobm90IGVyYXNlZCBieSBzdWNjZXNzaXZlIGNvbnZlcnNpb25zIG9mIHNjYW4gb2YKKyAgKiAgICAgICAgIEFEQyBzZXF1ZW5jZXIgcmFua3MpLCB1cCB0byA1IGRhdGEgcmVnaXN0ZXJzOgorICAqICAgICAgICAgMSBkYXRhIHJlZ2lzdGVyIG9uIEFEQyBncm91cCByZWd1bGFyLCA0IGRhdGEgcmVnaXN0ZXJzCisgICogICAgICAgICBvbiBBREMgZ3JvdXAgaW5qZWN0ZWQuICAgICAgICAgICAgCisgICogQG5vdGUgICBJZiBBREMgZ3JvdXAgaW5qZWN0ZWQgaW5qZWN0ZWQgdHJpZ2dlciBzb3VyY2UgaXMgc2V0IHRvIGFuCisgICogICAgICAgICBleHRlcm5hbCB0cmlnZ2VyLCB0aGlzIGZlYXR1cmUgbXVzdCBiZSBtdXN0IGJlIHNldCB0bworICAqICAgICAgICAgaW5kZXBlbmRlbnQgdHJpZ2dlci4KKyAgKiAgICAgICAgIEFEQyBncm91cCBpbmplY3RlZCBhdXRvbWF0aWMgdHJpZ2dlciBpcyBjb21wbGlhbnQgb25seSB3aXRoIAorICAqICAgICAgICAgZ3JvdXAgaW5qZWN0ZWQgdHJpZ2dlciBzb3VyY2Ugc2V0IHRvIFNXIHN0YXJ0LCB3aXRob3V0IGFueSAKKyAgKiAgICAgICAgIGZ1cnRoZXIgYWN0aW9uIG9uICBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBzdGFydCBvciBzdG9wOiAKKyAgKiAgICAgICAgIGluIHRoaXMgY2FzZSwgQURDIGdyb3VwIGluamVjdGVkIGlzIGNvbnRyb2xsZWQgb25seSAKKyAgKiAgICAgICAgIGZyb20gQURDIGdyb3VwIHJlZ3VsYXIuCisgICogQG5vdGUgICBJdCBpcyBub3QgcG9zc2libGUgdG8gZW5hYmxlIGJvdGggQURDIGdyb3VwIGluamVjdGVkCisgICogICAgICAgICBhdXRvLWluamVjdGVkIG1vZGUgYW5kIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUuCisgICogQHJtdG9sbCBDUjEgICAgICBKQVVUTyAgICAgICAgICBMTF9BRENfSU5KX1NldFRyaWdBdXRvCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgVHJpZ0F1dG8gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfSU5ERVBFTkRFTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRlJPTV9HUlBfUkVHVUxBUgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0lOSl9TZXRUcmlnQXV0byhBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgVHJpZ0F1dG8pCit7CisgIE1PRElGWV9SRUcoQURDeC0+Q1IxLCBBRENfQ1IxX0pBVVRPLCBUcmlnQXV0byk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXI6CisgICogICAgICAgICBpbmRlcGVuZGVudCBvciBmcm9tIEFEQyBncm91cCByZWd1bGFyLgorICAqIEBybXRvbGwgQ1IxICAgICAgSkFVVE8gICAgICAgICAgTExfQURDX0lOSl9HZXRUcmlnQXV0bworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0lOREVQRU5ERU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0ZST01fR1JQX1JFR1VMQVIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSU5KX0dldFRyaWdBdXRvKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DUjEsIEFEQ19DUjFfSkFVVE8pKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIGdyb3VwIGluamVjdGVkIG9mZnNldC4KKyAgKiBAbm90ZSAgIEl0IHNldHM6CisgICogICAgICAgICAtIEFEQyBncm91cCBpbmplY3RlZCByYW5rIHRvIHdoaWNoIHRoZSBvZmZzZXQgcHJvZ3JhbW1lZAorICAqICAgICAgICAgICB3aWxsIGJlIGFwcGxpZWQKKyAgKiAgICAgICAgIC0gT2Zmc2V0IGxldmVsIChvZmZzZXQgdG8gYmUgc3VidHJhY3RlZCBmcm9tIHRoZSByYXcKKyAgKiAgICAgICAgICAgY29udmVydGVkIGRhdGEpLgorICAqICAgICAgICAgQ2F1dGlvbjogT2Zmc2V0IGZvcm1hdCBpcyBkZXBlbmRlbnQgdG8gQURDIHJlc29sdXRpb246CisgICogICAgICAgICBvZmZzZXQgaGFzIHRvIGJlIGxlZnQtYWxpZ25lZCBvbiBiaXQgMTEsIHRoZSBMU0IgKHJpZ2h0IGJpdHMpCisgICogICAgICAgICBhcmUgc2V0IHRvIDAuCisgICogQG5vdGUgICBPZmZzZXQgY2Fubm90IGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogICAgICAgICBUbyBlbXVsYXRlIG9mZnNldCBkaXNhYmxlZCwgc2V0IGFuIG9mZnNldCB2YWx1ZSBlcXVhbCB0byAwLgorICAqIEBybXRvbGwgSk9GUjEgICAgSk9GRlNFVDEgICAgICAgTExfQURDX0lOSl9TZXRPZmZzZXRcbgorICAqICAgICAgICAgSk9GUjIgICAgSk9GRlNFVDIgICAgICAgTExfQURDX0lOSl9TZXRPZmZzZXRcbgorICAqICAgICAgICAgSk9GUjMgICAgSk9GRlNFVDMgICAgICAgTExfQURDX0lOSl9TZXRPZmZzZXRcbgorICAqICAgICAgICAgSk9GUjQgICAgSk9GRlNFVDQgICAgICAgTExfQURDX0lOSl9TZXRPZmZzZXQKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBSYW5rIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzQKKyAgKiBAcGFyYW0gIE9mZnNldExldmVsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfSU5KX1NldE9mZnNldChBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgUmFuaywgdWludDMyX3QgT2Zmc2V0TGV2ZWwpCit7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVChBREN4LT5KT0ZSMSwgX19BRENfTUFTS19TSElGVChSYW5rLCBBRENfSU5KX0pPRlJYX1JFR09GRlNFVF9NQVNLKSk7CisgIAorICBNT0RJRllfUkVHKCpwcmVnLAorICAgICAgICAgICAgIEFEQ19KT0ZSMV9KT0ZGU0VUMSwKKyAgICAgICAgICAgICBPZmZzZXRMZXZlbCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCBpbmplY3RlZCBvZmZzZXQuCisgICogQG5vdGUgICBJdCBnaXZlcyBvZmZzZXQgbGV2ZWwgKG9mZnNldCB0byBiZSBzdWJ0cmFjdGVkIGZyb20gdGhlIHJhdyBjb252ZXJ0ZWQgZGF0YSkuCisgICogICAgICAgICBDYXV0aW9uOiBPZmZzZXQgZm9ybWF0IGlzIGRlcGVuZGVudCB0byBBREMgcmVzb2x1dGlvbjoKKyAgKiAgICAgICAgIG9mZnNldCBoYXMgdG8gYmUgbGVmdC1hbGlnbmVkIG9uIGJpdCAxMSwgdGhlIExTQiAocmlnaHQgYml0cykKKyAgKiAgICAgICAgIGFyZSBzZXQgdG8gMC4KKyAgKiBAcm10b2xsIEpPRlIxICAgIEpPRkZTRVQxICAgICAgIExMX0FEQ19JTkpfR2V0T2Zmc2V0XG4KKyAgKiAgICAgICAgIEpPRlIyICAgIEpPRkZTRVQyICAgICAgIExMX0FEQ19JTkpfR2V0T2Zmc2V0XG4KKyAgKiAgICAgICAgIEpPRlIzICAgIEpPRkZTRVQzICAgICAgIExMX0FEQ19JTkpfR2V0T2Zmc2V0XG4KKyAgKiAgICAgICAgIEpPRlI0ICAgIEpPRkZTRVQ0ICAgICAgIExMX0FEQ19JTkpfR2V0T2Zmc2V0CisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgUmFuayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS180CisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19JTkpfR2V0T2Zmc2V0KEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBSYW5rKQoreworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoQURDeC0+Sk9GUjEsIF9fQURDX01BU0tfU0hJRlQoUmFuaywgQURDX0lOSl9KT0ZSWF9SRUdPRkZTRVRfTUFTSykpOworICAKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoKnByZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19KT0ZSMV9KT0ZGU0VUMSkKKyAgICAgICAgICAgICAgICAgICApOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0NoYW5uZWxzIENvbmZpZ3VyYXRpb24gb2YgQURDIGhpZXJhcmNoaWNhbCBzY29wZTogY2hhbm5lbHMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBzYW1wbGluZyB0aW1lIG9mIHRoZSBzZWxlY3RlZCBBREMgY2hhbm5lbAorICAqICAgICAgICAgVW5pdDogQURDIGNsb2NrIGN5Y2xlcy4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgZGV2aWNlLCBzYW1wbGluZyB0aW1lIGlzIG9uIGNoYW5uZWwgc2NvcGU6IGluZGVwZW5kZW50bHkKKyAgKiAgICAgICAgIG9mIGNoYW5uZWwgbWFwcGVkIG9uIEFEQyBncm91cCByZWd1bGFyIG9yIGluamVjdGVkLgorICAqIEBub3RlICAgSW4gY2FzZSBvZiBpbnRlcm5hbCBjaGFubmVsIChWcmVmSW50LCBUZW1wU2Vuc29yLCAuLi4pIHRvIGJlCisgICogICAgICAgICBjb252ZXJ0ZWQ6CisgICogICAgICAgICBzYW1wbGluZyB0aW1lIGNvbnN0cmFpbnRzIG11c3QgYmUgcmVzcGVjdGVkIChzYW1wbGluZyB0aW1lIGNhbiBiZQorICAqICAgICAgICAgYWRqdXN0ZWQgaW4gZnVuY3Rpb24gb2YgQURDIGNsb2NrIGZyZXF1ZW5jeSBhbmQgc2FtcGxpbmcgdGltZQorICAqICAgICAgICAgc2V0dGluZykuCisgICogICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciB0aW1pbmdzIHZhbHVlcyAocGFyYW1ldGVycyBUU192cmVmaW50LAorICAqICAgICAgICAgVFNfdGVtcCwgLi4uKS4KKyAgKiBAbm90ZSAgIENvbnZlcnNpb24gdGltZSBpcyB0aGUgYWRkaXRpb24gb2Ygc2FtcGxpbmcgdGltZSBhbmQgcHJvY2Vzc2luZyB0aW1lLgorICAqICAgICAgICAgUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCBmb3IgQURDIHByb2Nlc3NpbmcgdGltZSBvZgorICAqICAgICAgICAgdGhpcyBTVE0zMiBzZXJpZS4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgQURDIGNvbnZlcnNpb24gb2YgaW50ZXJuYWwgY2hhbm5lbCAoVnJlZkludCwKKyAgKiAgICAgICAgIHRlbXBlcmF0dXJlIHNlbnNvciwgLi4uKSwgYSBzYW1wbGluZyB0aW1lIG1pbmltdW0gdmFsdWUKKyAgKiAgICAgICAgIGlzIHJlcXVpcmVkLgorICAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldC4KKyAgKiBAcm10b2xsIFNNUFIxICAgIFNNUDE3ICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIxICAgIFNNUDE2ICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIxICAgIFNNUDE1ICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIxICAgIFNNUDE0ICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIxICAgIFNNUDEzICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIxICAgIFNNUDEyICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIxICAgIFNNUDExICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIxICAgIFNNUDEwICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDkgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDggICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDcgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDYgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDUgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDQgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDMgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDIgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDEgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDAgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IgICAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyRjM3eCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS4KKyAgKiBAcGFyYW0gIFNhbXBsaW5nVGltZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfMUNZQ0xFXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzdDWUNMRVNfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfMTNDWUNMRVNfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfMjhDWUNMRVNfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfNDFDWUNMRVNfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfNTVDWUNMRVNfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfNzFDWUNMRVNfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfMjM5Q1lDTEVTXzUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBTYW1wbGluZ1RpbWUpCit7CisgIC8qIFNldCBiaXRzIHdpdGggY29udGVudCBvZiBwYXJhbWV0ZXIgIlNhbXBsaW5nVGltZSIgd2l0aCBiaXRzIHBvc2l0aW9uICAgICAqLworICAvKiBpbiByZWdpc3RlciBhbmQgcmVnaXN0ZXIgcG9zaXRpb24gZGVwZW5kaW5nIG9uIHBhcmFtZXRlciAiQ2hhbm5lbCIuICAgICAgKi8KKyAgLyogUGFyYW1ldGVyICJDaGFubmVsIiBpcyB1c2VkIHdpdGggbWFza3MgYmVjYXVzZSBjb250YWluaW5nICAgICAgICAgICAgICAgICovCisgIC8qIG90aGVyIGJpdHMgcmVzZXJ2ZWQgZm9yIG90aGVyIHB1cnBvc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoQURDeC0+U01QUjEsIF9fQURDX01BU0tfU0hJRlQoQ2hhbm5lbCwgQURDX0NIQU5ORUxfU01QUlhfUkVHT0ZGU0VUX01BU0spKTsKKyAgCisgIE1PRElGWV9SRUcoKnByZWcsCisgICAgICAgICAgICAgQURDX1NNUFIyX1NNUDAgPDwgX19BRENfTUFTS19TSElGVChDaGFubmVsLCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9NQVNLKSwKKyAgICAgICAgICAgICBTYW1wbGluZ1RpbWUgICA8PCBfX0FEQ19NQVNLX1NISUZUKENoYW5uZWwsIEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX01BU0spKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgc2FtcGxpbmcgdGltZSBvZiB0aGUgc2VsZWN0ZWQgQURDIGNoYW5uZWwKKyAgKiAgICAgICAgIFVuaXQ6IEFEQyBjbG9jayBjeWNsZXMuCisgICogQG5vdGUgICBPbiB0aGlzIGRldmljZSwgc2FtcGxpbmcgdGltZSBpcyBvbiBjaGFubmVsIHNjb3BlOiBpbmRlcGVuZGVudGx5CisgICogICAgICAgICBvZiBjaGFubmVsIG1hcHBlZCBvbiBBREMgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZC4KKyAgKiBAbm90ZSAgIENvbnZlcnNpb24gdGltZSBpcyB0aGUgYWRkaXRpb24gb2Ygc2FtcGxpbmcgdGltZSBhbmQgcHJvY2Vzc2luZyB0aW1lLgorICAqICAgICAgICAgUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCBmb3IgQURDIHByb2Nlc3NpbmcgdGltZSBvZgorICAqICAgICAgICAgdGhpcyBTVE0zMiBzZXJpZS4KKyAgKiBAcm10b2xsIFNNUFIxICAgIFNNUDE3ICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIxICAgIFNNUDE2ICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIxICAgIFNNUDE1ICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIxICAgIFNNUDE0ICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIxICAgIFNNUDEzICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIxICAgIFNNUDEyICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIxICAgIFNNUDExICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIxICAgIFNNUDEwICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDkgICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDggICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDcgICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDYgICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDUgICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDQgICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDMgICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDIgICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDEgICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDAgICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IgICAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyRjM3eCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS4KKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV8xQ1lDTEVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfN0NZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV8xM0NZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV8yOENZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV80MUNZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV81NUNZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV83MUNZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV8yMzlDWUNMRVNfNQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoQURDeC0+U01QUjEsIF9fQURDX01BU0tfU0hJRlQoQ2hhbm5lbCwgQURDX0NIQU5ORUxfU01QUlhfUkVHT0ZGU0VUX01BU0spKTsKKyAgCisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKCpwcmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU01QUjJfU01QMCA8PCBfX0FEQ19NQVNLX1NISUZUKENoYW5uZWwsIEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX01BU0spKQorICAgICAgICAgICAgICAgICAgICA+PiBfX0FEQ19NQVNLX1NISUZUKENoYW5uZWwsIEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX01BU0spCisgICAgICAgICAgICAgICAgICAgKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUZfQ29uZmlndXJhdGlvbl9BRENfQW5hbG9nV2F0Y2hkb2cgQ29uZmlndXJhdGlvbiBvZiBBREMgdHJhbnN2ZXJzYWwgc2NvcGU6IGFuYWxvZyB3YXRjaGRvZworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmVkIGNoYW5uZWxzOgorICAqICAgICAgICAgYSBzaW5nbGUgY2hhbm5lbCBvciBhbGwgY2hhbm5lbHMsCisgICogICAgICAgICBvbiBBREMgZ3JvdXBzIHJlZ3VsYXIgYW5kLW9yIGluamVjdGVkLgorICAqIEBub3RlICAgT25jZSBtb25pdG9yZWQgY2hhbm5lbHMgYXJlIHNlbGVjdGVkLCBhbmFsb2cgd2F0Y2hkb2cKKyAgKiAgICAgICAgIGlzIGVuYWJsZWQuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIG5lZWQgdG8gZGVmaW5lIGEgc2luZ2xlIGNoYW5uZWwgdG8gbW9uaXRvcgorICAqICAgICAgICAgd2l0aCBhbmFsb2cgd2F0Y2hkb2cgZnJvbSBzZXF1ZW5jZXIgY2hhbm5lbCBkZWZpbml0aW9uLAorICAqICAgICAgICAgdXNlIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0FOQUxPR1dEX0NIQU5ORUxfR1JPVVAoKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHRoZXJlIGlzIG9ubHkgMSBraW5kIG9mIGFuYWxvZyB3YXRjaGRvZworICAqICAgICAgICAgaW5zdGFuY2U6CisgICogICAgICAgICAtIEFXRCBzdGFuZGFyZCAoaW5zdGFuY2UgQVdEMSk6CisgICogICAgICAgICAgIC0gY2hhbm5lbHMgbW9uaXRvcmVkOiBjYW4gbW9uaXRvciAxIGNoYW5uZWwgb3IgYWxsIGNoYW5uZWxzLgorICAqICAgICAgICAgICAtIGdyb3VwcyBtb25pdG9yZWQ6IEFEQyBncm91cHMgcmVndWxhciBhbmQtb3IgaW5qZWN0ZWQuCisgICogICAgICAgICAgIC0gcmVzb2x1dGlvbjogcmVzb2x1dGlvbiBpcyBub3QgbGltaXRlZCAoY29ycmVzcG9uZHMgdG8KKyAgKiAgICAgICAgICAgICBBREMgcmVzb2x1dGlvbiBjb25maWd1cmVkKS4KKyAgKiBAcm10b2xsIENSMSAgICAgIEFXRDFDSCAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHNcbgorICAqICAgICAgICAgQ1IxICAgICAgQVdEMVNHTCAgICAgICAgTExfQURDX1NldEFuYWxvZ1dETW9uaXRDaGFubmVsc1xuCisgICogICAgICAgICBDUjEgICAgICBBV0QxRU4gICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgQVdEQ2hhbm5lbEdyb3VwIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8wX1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMF9JTkogCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzBfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xX1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMV9JTkogCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzFfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8yX1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMl9JTkogCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzJfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8zX1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfM19JTkogCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzNfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF80X1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNF9JTkogCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzRfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF81X1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNV9JTkogCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzVfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF82X1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNl9JTkogCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzZfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF83X1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfN19JTkogCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzdfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF84X1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOF9JTkogCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzhfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF85X1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOV9JTkogCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzlfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMF9SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTBfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEwX1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTFfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzExX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMV9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEyX1JFRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMl9JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTJfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xM19SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTNfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEzX1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTRfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE0X0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNF9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE1X1JFRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNV9JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTVfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNl9SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTZfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE2X1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTdfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE3X0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xN19SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WUkVGSU5UX1JFRyAgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZSRUZJTlRfSU5KICAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVlJFRklOVF9SRUdfSU5KICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9URU1QU0VOU09SX1JFRyAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1RFTVBTRU5TT1JfSU5KICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVEVNUFNFTlNPUl9SRUdfSU5KICAgKDEpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiBTVE0zMkYzN3gsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzEuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBBV0RDaGFubmVsR3JvdXApCit7CisgIE1PRElGWV9SRUcoQURDeC0+Q1IxLAorICAgICAgICAgICAgIChBRENfQ1IxX0FXREVOIHwgQURDX0NSMV9KQVdERU4gfCBBRENfQ1IxX0FXRFNHTCB8IEFEQ19DUjFfQVdEQ0gpLAorICAgICAgICAgICAgIEFXRENoYW5uZWxHcm91cCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmVkIGNoYW5uZWwuCisgICogQG5vdGUgICBVc2FnZSBvZiB0aGUgcmV0dXJuZWQgY2hhbm5lbCBudW1iZXI6CisgICogICAgICAgICAtIFRvIHJlaW5qZWN0IHRoaXMgY2hhbm5lbCBpbnRvIGFub3RoZXIgZnVuY3Rpb24gTExfQURDX3h4eDoKKyAgKiAgICAgICAgICAgdGhlIHJldHVybmVkIGNoYW5uZWwgbnVtYmVyIGlzIG9ubHkgcGFydGx5IGZvcm1hdHRlZCBvbiBkZWZpbml0aW9uCisgICogICAgICAgICAgIG9mIGxpdGVyYWxzIExMX0FEQ19DSEFOTkVMX3guIFRoZXJlZm9yZSwgaXQgaGFzIHRvIGJlIGNvbXBhcmVkCisgICogICAgICAgICAgIHdpdGggcGFydHMgb2YgbGl0ZXJhbHMgTExfQURDX0NIQU5ORUxfeCBvciB1c2luZworICAqICAgICAgICAgICBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoKS4KKyAgKiAgICAgICAgICAgVGhlbiB0aGUgc2VsZWN0ZWQgbGl0ZXJhbCBMTF9BRENfQ0hBTk5FTF94IGNhbiBiZSB1c2VkCisgICogICAgICAgICAgIGFzIHBhcmFtZXRlciBmb3IgYW5vdGhlciBmdW5jdGlvbi4KKyAgKiAgICAgICAgIC0gVG8gZ2V0IHRoZSBjaGFubmVsIG51bWJlciBpbiBkZWNpbWFsIGZvcm1hdDoKKyAgKiAgICAgICAgICAgcHJvY2VzcyB0aGUgcmV0dXJuZWQgdmFsdWUgd2l0aCB0aGUgaGVscGVyIG1hY3JvCisgICogICAgICAgICAgIEByZWYgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKCkuCisgICogICAgICAgICAgIEFwcGxpY2FibGUgb25seSB3aGVuIHRoZSBhbmFsb2cgd2F0Y2hkb2cgaXMgc2V0IHRvIG1vbml0b3IKKyAgKiAgICAgICAgICAgb25lIGNoYW5uZWwuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCB0aGVyZSBpcyBvbmx5IDEga2luZCBvZiBhbmFsb2cgd2F0Y2hkb2cKKyAgKiAgICAgICAgIGluc3RhbmNlOgorICAqICAgICAgICAgLSBBV0Qgc3RhbmRhcmQgKGluc3RhbmNlIEFXRDEpOgorICAqICAgICAgICAgICAtIGNoYW5uZWxzIG1vbml0b3JlZDogY2FuIG1vbml0b3IgMSBjaGFubmVsIG9yIGFsbCBjaGFubmVscy4KKyAgKiAgICAgICAgICAgLSBncm91cHMgbW9uaXRvcmVkOiBBREMgZ3JvdXBzIHJlZ3VsYXIgYW5kLW9yIGluamVjdGVkLgorICAqICAgICAgICAgICAtIHJlc29sdXRpb246IHJlc29sdXRpb24gaXMgbm90IGxpbWl0ZWQgKGNvcnJlc3BvbmRzIHRvCisgICogICAgICAgICAgICAgQURDIHJlc29sdXRpb24gY29uZmlndXJlZCkuCisgICogQHJtdG9sbCBDUjEgICAgICBBV0QxQ0ggICAgICAgICBMTF9BRENfR2V0QW5hbG9nV0RNb25pdENoYW5uZWxzXG4KKyAgKiAgICAgICAgIENSMSAgICAgIEFXRDFTR0wgICAgICAgIExMX0FEQ19HZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHNcbgorICAqICAgICAgICAgQ1IxICAgICAgQVdEMUVOICAgICAgICAgTExfQURDX0dldEFuYWxvZ1dETW9uaXRDaGFubmVscworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8wX1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMF9JTkogCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzBfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xX1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMV9JTkogCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzFfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8yX1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMl9JTkogCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzJfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8zX1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfM19JTkogCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzNfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF80X1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNF9JTkogCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzRfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF81X1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNV9JTkogCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzVfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF82X1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNl9JTkogCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzZfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF83X1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfN19JTkogCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzdfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF84X1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOF9JTkogCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzhfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF85X1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOV9JTkogCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzlfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMF9SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTBfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEwX1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTFfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzExX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMV9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEyX1JFRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMl9JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTJfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xM19SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTNfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEzX1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTRfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE0X0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNF9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE1X1JFRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNV9JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTVfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNl9SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTZfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE2X1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTdfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE3X0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xN19SRUdfSU5KCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldEFuYWxvZ1dETW9uaXRDaGFubmVscyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q1IxLCAoQURDX0NSMV9BV0RFTiB8IEFEQ19DUjFfSkFXREVOIHwgQURDX0NSMV9BV0RTR0wgfCBBRENfQ1IxX0FXRENIKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZCB2YWx1ZSBvZiB0aHJlc2hvbGQKKyAgKiAgICAgICAgIGhpZ2ggb3IgbG93LgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgdGhlcmUgaXMgb25seSAxIGtpbmQgb2YgYW5hbG9nIHdhdGNoZG9nCisgICogICAgICAgICBpbnN0YW5jZToKKyAgKiAgICAgICAgIC0gQVdEIHN0YW5kYXJkIChpbnN0YW5jZSBBV0QxKToKKyAgKiAgICAgICAgICAgLSBjaGFubmVscyBtb25pdG9yZWQ6IGNhbiBtb25pdG9yIDEgY2hhbm5lbCBvciBhbGwgY2hhbm5lbHMuCisgICogICAgICAgICAgIC0gZ3JvdXBzIG1vbml0b3JlZDogQURDIGdyb3VwcyByZWd1bGFyIGFuZC1vciBpbmplY3RlZC4KKyAgKiAgICAgICAgICAgLSByZXNvbHV0aW9uOiByZXNvbHV0aW9uIGlzIG5vdCBsaW1pdGVkIChjb3JyZXNwb25kcyB0bworICAqICAgICAgICAgICAgIEFEQyByZXNvbHV0aW9uIGNvbmZpZ3VyZWQpLgorICAqIEBybXRvbGwgSFRSICAgICAgSFQgICAgICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dEVGhyZXNob2xkc1xuCisgICogICAgICAgICBMVFIgICAgICBMVCAgICAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RUaHJlc2hvbGRzCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgQVdEVGhyZXNob2xkc0hpZ2hMb3cgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX1RIUkVTSE9MRF9ISUdICisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9USFJFU0hPTERfTE9XCisgICogQHBhcmFtICBBV0RUaHJlc2hvbGRWYWx1ZSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldEFuYWxvZ1dEVGhyZXNob2xkcyhBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgQVdEVGhyZXNob2xkc0hpZ2hMb3csIHVpbnQzMl90IEFXRFRocmVzaG9sZFZhbHVlKQoreworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoQURDeC0+SFRSLCBBV0RUaHJlc2hvbGRzSGlnaExvdyk7CisgIAorICBNT0RJRllfUkVHKCpwcmVnLAorICAgICAgICAgICAgIEFEQ19IVFJfSFQsCisgICAgICAgICAgICAgQVdEVGhyZXNob2xkVmFsdWUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZCB2YWx1ZSBvZiB0aHJlc2hvbGQgaGlnaCBvcgorICAqICAgICAgICAgdGhyZXNob2xkIGxvdy4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgQURDIHJlc29sdXRpb24gZGlmZmVyZW50IG9mIDEyIGJpdHMsCisgICogICAgICAgICBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyBkYXRhIHJlcXVpcmUgYSBzcGVjaWZpYyBzaGlmdC4KKyAgKiAgICAgICAgIFVzZSBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19BTkFMT0dXRF9HRVRfVEhSRVNIT0xEX1JFU09MVVRJT04oKS4KKyAgKiBAcm10b2xsIEhUUiAgICAgIEhUICAgICAgICAgICAgIExMX0FEQ19HZXRBbmFsb2dXRFRocmVzaG9sZHNcbgorICAqICAgICAgICAgTFRSICAgICAgTFQgICAgICAgICAgICAgTExfQURDX0dldEFuYWxvZ1dEVGhyZXNob2xkcworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEFXRFRocmVzaG9sZHNIaWdoTG93IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9USFJFU0hPTERfSElHSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfVEhSRVNIT0xEX0xPVworICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldEFuYWxvZ1dEVGhyZXNob2xkcyhBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgQVdEVGhyZXNob2xkc0hpZ2hMb3cpCit7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVChBREN4LT5IVFIsIEFXRFRocmVzaG9sZHNIaWdoTG93KTsKKyAgCisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKCpwcmVnLCBBRENfSFRSX0hUKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX09wZXJhdGlvbl9BRENfSW5zdGFuY2UgT3BlcmF0aW9uIG9uIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6IEFEQyBpbnN0YW5jZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBzZWxlY3RlZCBBREMgaW5zdGFuY2UuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBhZnRlciBBREMgZW5hYmxlLCBhIGRlbGF5IGZvciAKKyAgKiAgICAgICAgIEFEQyBpbnRlcm5hbCBhbmFsb2cgc3RhYmlsaXphdGlvbiBpcyByZXF1aXJlZCBiZWZvcmUgcGVyZm9ybWluZyBhCisgICogICAgICAgICBBREMgY29udmVyc2lvbiBzdGFydC4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQsIHBhcmFtZXRlciB0U1RBQi4KKyAgKiBAcm10b2xsIENSMiAgICAgIEFET04gICAgICAgICAgIExMX0FEQ19FbmFibGUKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlKEFEQ19UeXBlRGVmICpBREN4KQoreworICBTRVRfQklUKEFEQ3gtPkNSMiwgQURDX0NSMl9BRE9OKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBzZWxlY3RlZCBBREMgaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICBBRE9OICAgICAgICAgICBMTF9BRENfRGlzYWJsZQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19EaXNhYmxlKEFEQ19UeXBlRGVmICpBREN4KQoreworICBDTEVBUl9CSVQoQURDeC0+Q1IyLCBBRENfQ1IyX0FET04pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgc2VsZWN0ZWQgQURDIGluc3RhbmNlIGVuYWJsZSBzdGF0ZS4KKyAgKiBAcm10b2xsIENSMiAgICAgIEFET04gICAgICAgICAgIExMX0FEQ19Jc0VuYWJsZWQKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCAwOiBBREMgaXMgZGlzYWJsZWQsIDE6IEFEQyBpcyBlbmFibGVkLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0VuYWJsZWQoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoQURDeC0+Q1IyLCBBRENfQ1IyX0FET04pID09IChBRENfQ1IyX0FET04pKTsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydCBBREMgY2FsaWJyYXRpb24gaW4gdGhlIG1vZGUgc2luZ2xlLWVuZGVkCisgICogICAgICAgICBvciBkaWZmZXJlbnRpYWwgKGZvciBkZXZpY2VzIHdpdGggZGlmZmVyZW50aWFsIG1vZGUgYXZhaWxhYmxlKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIGJlZm9yZSBzdGFydGluZyBhIGNhbGlicmF0aW9uLAorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQuCisgICogICAgICAgICBBIG1pbmltdW0gbnVtYmVyIG9mIEFEQyBjbG9jayBjeWNsZXMgYXJlIHJlcXVpcmVkCisgICogICAgICAgICBiZXR3ZWVuIEFEQyBkaXNhYmxlIHN0YXRlIGFuZCBjYWxpYnJhdGlvbiBzdGFydC4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGxpdGVyYWwgQHJlZiBMTF9BRENfREVMQVlfRElTQUJMRV9DQUxJQl9BRENfQ1lDTEVTLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgaGFyZHdhcmUgcHJlcmVxdWlzaXRlIGJlZm9yZSBzdGFydGluZyBhIGNhbGlicmF0aW9uOgorICAgICAgICAgICAgdGhlIEFEQyBtdXN0IGhhdmUgYmVlbiBpbiBwb3dlci1vbiBzdGF0ZSBmb3IgYXQgbGVhc3QKKyAgICAgICAgICAgIHR3byBBREMgY2xvY2sgY3ljbGVzLgorICAqIEBybXRvbGwgQ1IyICAgICAgQ0FMICAgICAgICAgICAgTExfQURDX1N0YXJ0Q2FsaWJyYXRpb24KKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU3RhcnRDYWxpYnJhdGlvbihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgU0VUX0JJVChBREN4LT5DUjIsIEFEQ19DUjJfQ0FMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGNhbGlicmF0aW9uIHN0YXRlLgorICAqIEBybXRvbGwgQ1IyICAgICAgQ0FMICAgICAgICAgICAgTExfQURDX0lzQ2FsaWJyYXRpb25PbkdvaW5nCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgMDogY2FsaWJyYXRpb24gY29tcGxldGUsIDE6IGNhbGlicmF0aW9uIGluIHByb2dyZXNzLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0NhbGlicmF0aW9uT25Hb2luZyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChBREN4LT5DUjIsIEFEQ19DUjJfQ0FMKSA9PSAoQURDX0NSMl9DQUwpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUZfT3BlcmF0aW9uX0FEQ19Hcm91cF9SZWd1bGFyIE9wZXJhdGlvbiBvbiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiBncm91cCByZWd1bGFyCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTdGFydCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgdGhpcyBmdW5jdGlvbiBpcyByZWxldmFudCBmb3IgYm90aCAKKyAgKiAgICAgICAgIGludGVybmFsIHRyaWdnZXIgKFNXIHN0YXJ0KSBhbmQgZXh0ZXJuYWwgdHJpZ2dlcjoKKyAgKiAgICAgICAgIC0gSWYgQURDIHRyaWdnZXIgaGFzIGJlZW4gc2V0IHRvIHNvZnR3YXJlIHN0YXJ0LCBBREMgY29udmVyc2lvbgorICAqICAgICAgICAgICBzdGFydHMgaW1tZWRpYXRlbHkuCisgICogICAgICAgICAtIElmIEFEQyB0cmlnZ2VyIGhhcyBiZWVuIHNldCB0byBleHRlcm5hbCB0cmlnZ2VyLCBBREMgY29udmVyc2lvbgorICAqICAgICAgICAgICB3aWxsIHN0YXJ0IGF0IG5leHQgdHJpZ2dlciBldmVudCAob24gdGhlIHNlbGVjdGVkIHRyaWdnZXIgZWRnZSkKKyAgKiAgICAgICAgICAgZm9sbG93aW5nIHRoZSBBREMgc3RhcnQgY29udmVyc2lvbiBjb21tYW5kLgorICAqIEBybXRvbGwgQ1IyICAgICAgRVhUVFJJRyAgICAgICAgTExfQURDX1JFR19TdGFydENvbnZlcnNpb24KKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1N0YXJ0Q29udmVyc2lvbihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgLyogTm90ZTogU2V0IGJpdCBBRENfQ1IyX1NXU1RBUlQgZm9yIGNhc2Ugb2YgdHJpZ2dlciBzb3VyY2Ugc2V0IHRvICAgICAgICAgICovCisgIC8qICAgICAgIFNXIHN0YXJ0LiBJbiBjYXNlIG9mIGV4dGVybmFsIHRyaWdnZXIgc2VsZWN0ZWQsIHRoaXMgYml0ICAgICAgICAgICAqLworICAvKiAgICAgICBoYXMgbm8gZWZmZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgU0VUX0JJVChBREN4LT5DUjIsIChBRENfQ1IyX1NXU1RBUlQgfCBBRENfQ1IyX0VYVFRSSUcpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gZnJvbSBleHRlcm5hbCB0cmlnZ2VyLgorICAqIEBub3RlICAgTm8gbW9yZSBBREMgY29udmVyc2lvbiB3aWxsIHN0YXJ0IGF0IG5leHQgdHJpZ2dlciBldmVudAorICAqICAgICAgICAgZm9sbG93aW5nIHRoZSBBREMgc3RvcCBjb252ZXJzaW9uIGNvbW1hbmQuCisgICogICAgICAgICBJZiBhIGNvbnZlcnNpb24gaXMgb24tZ29pbmcsIGl0IHdpbGwgYmUgY29tcGxldGVkLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgdGhlcmUgaXMgbm8gc3BlY2lmaWMgY29tbWFuZAorICAqICAgICAgICAgdG8gc3RvcCBhIGNvbnZlcnNpb24gb24tZ29pbmcgb3IgdG8gc3RvcCBBREMgY29udmVydGluZworICAqICAgICAgICAgaW4gY29udGludW91cyBtb2RlLiBUaGVzZSBhY3Rpb25zIGNhbiBiZSBwZXJmb3JtZWQKKyAgKiAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEByZWYgTExfQURDX0Rpc2FibGUoKS4KKyAgKiBAcm10b2xsIENSMiAgICAgIEVYVFNFTCAgICAgICAgIExMX0FEQ19SRUdfU3RvcENvbnZlcnNpb25FeHRUcmlnCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1JFR19TdG9wQ29udmVyc2lvbkV4dFRyaWcoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFNFVF9CSVQoQURDeC0+Q1IyLCBBRENfQ1IyX0VYVFNFTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gZGF0YSwgcmFuZ2UgZml0IGZvcgorICAqICAgICAgICAgYWxsIEFEQyBjb25maWd1cmF0aW9uczogYWxsIEFEQyByZXNvbHV0aW9ucyBhbmQKKyAgKiAgICAgICAgIGFsbCBvdmVyc2FtcGxpbmcgaW5jcmVhc2VkIGRhdGEgd2lkdGggKGZvciBkZXZpY2VzCisgICogICAgICAgICB3aXRoIGZlYXR1cmUgb3ZlcnNhbXBsaW5nKS4KKyAgKiBAcm10b2xsIERSICAgICAgIFJEQVRBICAgICAgICAgIExMX0FEQ19SRUdfUmVhZENvbnZlcnNpb25EYXRhMzIKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwMDAwMDAgYW5kIE1heF9EYXRhPTB4RkZGRkZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTMyKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQxNl90KShSRUFEX0JJVChBREN4LT5EUiwgQURDX0RSX0RBVEEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhLCByYW5nZSBmaXQgZm9yCisgICogICAgICAgICBBREMgcmVzb2x1dGlvbiAxMiBiaXRzLgorICAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBmZWF0dXJlIG92ZXJzYW1wbGluZzogT3ZlcnNhbXBsaW5nCisgICogICAgICAgICBjYW4gaW5jcmVhc2UgZGF0YSB3aWR0aCwgZnVuY3Rpb24gZm9yIGV4dGVuZGVkIHJhbmdlCisgICogICAgICAgICBtYXkgYmUgbmVlZGVkOiBAcmVmIExMX0FEQ19SRUdfUmVhZENvbnZlcnNpb25EYXRhMzIuCisgICogQHJtdG9sbCBEUiAgICAgICBSREFUQSAgICAgICAgICBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTEyCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MTZfdCBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTEyKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQxNl90KShSRUFEX0JJVChBREN4LT5EUiwgQURDX0RSX0RBVEEpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUZfT3BlcmF0aW9uX0FEQ19Hcm91cF9JbmplY3RlZCBPcGVyYXRpb24gb24gQURDIGhpZXJhcmNoaWNhbCBzY29wZTogZ3JvdXAgaW5qZWN0ZWQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgdGhpcyBmdW5jdGlvbiBpcyByZWxldmFudCBmb3IgYm90aCAKKyAgKiAgICAgICAgIGludGVybmFsIHRyaWdnZXIgKFNXIHN0YXJ0KSBhbmQgZXh0ZXJuYWwgdHJpZ2dlcjoKKyAgKiAgICAgICAgIC0gSWYgQURDIHRyaWdnZXIgaGFzIGJlZW4gc2V0IHRvIHNvZnR3YXJlIHN0YXJ0LCBBREMgY29udmVyc2lvbgorICAqICAgICAgICAgICBzdGFydHMgaW1tZWRpYXRlbHkuCisgICogICAgICAgICAtIElmIEFEQyB0cmlnZ2VyIGhhcyBiZWVuIHNldCB0byBleHRlcm5hbCB0cmlnZ2VyLCBBREMgY29udmVyc2lvbgorICAqICAgICAgICAgICB3aWxsIHN0YXJ0IGF0IG5leHQgdHJpZ2dlciBldmVudCAob24gdGhlIHNlbGVjdGVkIHRyaWdnZXIgZWRnZSkKKyAgKiAgICAgICAgICAgZm9sbG93aW5nIHRoZSBBREMgc3RhcnQgY29udmVyc2lvbiBjb21tYW5kLgorICAqIEBybXRvbGwgQ1IyICAgICAgSkVYVFRSSUcgICAgICAgTExfQURDX1JFR19TdGFydENvbnZlcnNpb24KKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfSU5KX1N0YXJ0Q29udmVyc2lvbihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgLyogTm90ZTogU2V0IGJpdCBBRENfQ1IyX0pTV1NUQVJUIGZvciBjYXNlIG9mIHRyaWdnZXIgc291cmNlIHNldCB0byAgICAgICAgICovCisgIC8qICAgICAgIFNXIHN0YXJ0LiBJbiBjYXNlIG9mIGV4dGVybmFsIHRyaWdnZXIgc2VsZWN0ZWQsIHRoaXMgYml0ICAgICAgICAgICAqLworICAvKiAgICAgICBoYXMgbm8gZWZmZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgU0VUX0JJVChBREN4LT5DUjIsIChBRENfQ1IyX0pTV1NUQVJUIHwgQURDX0NSMl9KRVhUVFJJRykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gZnJvbSBleHRlcm5hbCB0cmlnZ2VyLgorICAqIEBub3RlICAgTm8gbW9yZSBBREMgY29udmVyc2lvbiB3aWxsIHN0YXJ0IGF0IG5leHQgdHJpZ2dlciBldmVudAorICAqICAgICAgICAgZm9sbG93aW5nIHRoZSBBREMgc3RvcCBjb252ZXJzaW9uIGNvbW1hbmQuCisgICogICAgICAgICBJZiBhIGNvbnZlcnNpb24gaXMgb24tZ29pbmcsIGl0IHdpbGwgYmUgY29tcGxldGVkLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgdGhlcmUgaXMgbm8gc3BlY2lmaWMgY29tbWFuZAorICAqICAgICAgICAgdG8gc3RvcCBhIGNvbnZlcnNpb24gb24tZ29pbmcgb3IgdG8gc3RvcCBBREMgY29udmVydGluZworICAqICAgICAgICAgaW4gY29udGludW91cyBtb2RlLiBUaGVzZSBhY3Rpb25zIGNhbiBiZSBwZXJmb3JtZWQKKyAgKiAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEByZWYgTExfQURDX0Rpc2FibGUoKS4KKyAgKiBAcm10b2xsIENSMiAgICAgIEpFWFRTRUwgICAgICAgIExMX0FEQ19JTkpfU3RvcENvbnZlcnNpb25FeHRUcmlnCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0lOSl9TdG9wQ29udmVyc2lvbkV4dFRyaWcoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFNFVF9CSVQoQURDeC0+Q1IyLCBBRENfQ1IyX0pFWFRTRUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIGRhdGEsIHJhbmdlIGZpdCBmb3IKKyAgKiAgICAgICAgIGFsbCBBREMgY29uZmlndXJhdGlvbnM6IGFsbCBBREMgcmVzb2x1dGlvbnMgYW5kCisgICogICAgICAgICBhbGwgb3ZlcnNhbXBsaW5nIGluY3JlYXNlZCBkYXRhIHdpZHRoIChmb3IgZGV2aWNlcworICAqICAgICAgICAgd2l0aCBmZWF0dXJlIG92ZXJzYW1wbGluZykuCisgICogQHJtdG9sbCBKRFIxICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTMyXG4KKyAgKiAgICAgICAgIEpEUjIgICAgIEpEQVRBICAgICAgICAgIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMzJcbgorICAqICAgICAgICAgSkRSMyAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGEzMlxuCisgICogICAgICAgICBKRFI0ICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTMyCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgUmFuayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS180CisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwMDAwMDAgYW5kIE1heF9EYXRhPTB4RkZGRkZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTMyKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBSYW5rKQoreworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoQURDeC0+SkRSMSwgX19BRENfTUFTS19TSElGVChSYW5rLCBBRENfSU5KX0pEUlhfUkVHT0ZGU0VUX01BU0spKTsKKyAgCisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKCpwcmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSkRSMV9KREFUQSkKKyAgICAgICAgICAgICAgICAgICApOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBkYXRhLCByYW5nZSBmaXQgZm9yCisgICogICAgICAgICBBREMgcmVzb2x1dGlvbiAxMiBiaXRzLgorICAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBmZWF0dXJlIG92ZXJzYW1wbGluZzogT3ZlcnNhbXBsaW5nCisgICogICAgICAgICBjYW4gaW5jcmVhc2UgZGF0YSB3aWR0aCwgZnVuY3Rpb24gZm9yIGV4dGVuZGVkIHJhbmdlCisgICogICAgICAgICBtYXkgYmUgbmVlZGVkOiBAcmVmIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMzIuCisgICogQHJtdG9sbCBKRFIxICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTEyXG4KKyAgKiAgICAgICAgIEpEUjIgICAgIEpEQVRBICAgICAgICAgIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMTJcbgorICAqICAgICAgICAgSkRSMyAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGExMlxuCisgICogICAgICAgICBKRFI0ICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTEyCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgUmFuayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS180CisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQxNl90IExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMTIoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFJhbmspCit7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVChBREN4LT5KRFIxLCBfX0FEQ19NQVNLX1NISUZUKFJhbmssIEFEQ19JTkpfSkRSWF9SRUdPRkZTRVRfTUFTSykpOworICAKKyAgcmV0dXJuICh1aW50MTZfdCkoUkVBRF9CSVQoKnByZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19KRFIxX0pEQVRBKQorICAgICAgICAgICAgICAgICAgICk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX0ZMQUdfTWFuYWdlbWVudCBBREMgZmxhZyBtYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBHZXQgZmxhZyBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMuCisgICogQHJtdG9sbCBTUiAgICAgICBFT0MgICAgICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX0VPUworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX0VPUyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgLyogTm90ZTogb24gdGhpcyBTVE0zMiBzZXJpZSwgdGhlcmUgaXMgbm8gZmxhZyBBREMgZ3JvdXAgcmVndWxhciAgICAgICAgICAgICovCisgIC8qICAgICAgIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICBGbGFnIG5vdGVkIGFzICJFT0MiIGlzIGNvcnJlc3BvbmRpbmcgdG8gZmxhZyAiRU9TIiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgaW4gb3RoZXIgU1RNMzIgZmFtaWxpZXMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHJldHVybiAoUkVBRF9CSVQoQURDeC0+U1IsIExMX0FEQ19GTEFHX0VPUykgPT0gKExMX0FEQ19GTEFHX0VPUykpOworfQorCisKKy8qKgorICAqIEBicmllZiAgR2V0IGZsYWcgQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucy4KKyAgKiBAcm10b2xsIFNSICAgICAgIEpFT0MgICAgICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfSkVPUworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX0pFT1MoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIC8qIE5vdGU6IG9uIHRoaXMgU1RNMzIgc2VyaWUsIHRoZXJlIGlzIG5vIGZsYWcgQURDIGdyb3VwIGluamVjdGVkICAgICAgICAgICAqLworICAvKiAgICAgICBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgRmxhZyBub3RlZCBhcyAiSkVPQyIgaXMgY29ycmVzcG9uZGluZyB0byBmbGFnICJKRU9TIiAgICAgICAgICAgICAgICovCisgIC8qICAgICAgIGluIG90aGVyIFNUTTMyIGZhbWlsaWVzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICByZXR1cm4gKFJFQURfQklUKEFEQ3gtPlNSLCBMTF9BRENfRkxBR19KRU9TKSA9PSAoTExfQURDX0ZMQUdfSkVPUykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBmbGFnIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMSBmbGFnCisgICogQHJtdG9sbCBTUiAgICAgICBBV0QgICAgICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX0FXRDEKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzQWN0aXZlRmxhZ19BV0QxKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3gtPlNSLCBMTF9BRENfRkxBR19BV0QxKSA9PSAoTExfQURDX0ZMQUdfQVdEMSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIGZsYWcgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zLgorICAqIEBybXRvbGwgU1IgICAgICAgRU9DICAgICAgICAgICAgTExfQURDX0NsZWFyRmxhZ19FT1MKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfQ2xlYXJGbGFnX0VPUyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgLyogTm90ZTogb24gdGhpcyBTVE0zMiBzZXJpZSwgdGhlcmUgaXMgbm8gZmxhZyBBREMgZ3JvdXAgcmVndWxhciAgICAgICAgICAgICovCisgIC8qICAgICAgIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICBGbGFnIG5vdGVkIGFzICJFT0MiIGlzIGNvcnJlc3BvbmRpbmcgdG8gZmxhZyAiRU9TIiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgaW4gb3RoZXIgU1RNMzIgZmFtaWxpZXMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFdSSVRFX1JFRyhBREN4LT5TUiwgfkxMX0FEQ19GTEFHX0VPUyk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBDbGVhciBmbGFnIEFEQyBncm91cCBpbmplY3RlZCBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMuCisgICogQHJtdG9sbCBTUiAgICAgICBKRU9DICAgICAgICAgICBMTF9BRENfQ2xlYXJGbGFnX0pFT1MKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfQ2xlYXJGbGFnX0pFT1MoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIC8qIE5vdGU6IG9uIHRoaXMgU1RNMzIgc2VyaWUsIHRoZXJlIGlzIG5vIGZsYWcgQURDIGdyb3VwIGluamVjdGVkICAgICAgICAgICAqLworICAvKiAgICAgICBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgRmxhZyBub3RlZCBhcyAiSkVPQyIgaXMgY29ycmVzcG9uZGluZyB0byBmbGFnICJKRU9TIiAgICAgICAgICAgICAgICovCisgIC8qICAgICAgIGluIG90aGVyIFNUTTMyIGZhbWlsaWVzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBXUklURV9SRUcoQURDeC0+U1IsIH5MTF9BRENfRkxBR19KRU9TKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBmbGFnIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMS4KKyAgKiBAcm10b2xsIFNSICAgICAgIEFXRCAgICAgICAgICAgIExMX0FEQ19DbGVhckZsYWdfQVdEMQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19DbGVhckZsYWdfQVdEMShBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgV1JJVEVfUkVHKEFEQ3gtPlNSLCB+TExfQURDX0ZMQUdfQVdEMSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX0lUX01hbmFnZW1lbnQgQURDIElUIG1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zLgorICAqIEBybXRvbGwgQ1IxICAgICAgRU9DSUUgICAgICAgICAgTExfQURDX0VuYWJsZUlUX0VPUworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19FbmFibGVJVF9FT1MoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIC8qIE5vdGU6IG9uIHRoaXMgU1RNMzIgc2VyaWUsIHRoZXJlIGlzIG5vIGZsYWcgQURDIGdyb3VwIHJlZ3VsYXIgICAgICAgICAgICAqLworICAvKiAgICAgICBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgRmxhZyBub3RlZCBhcyAiRU9DIiBpcyBjb3JyZXNwb25kaW5nIHRvIGZsYWcgIkVPUyIgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgIGluIG90aGVyIFNUTTMyIGZhbWlsaWVzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBTRVRfQklUKEFEQ3gtPkNSMSwgQURDX0NSMV9FT0NJRSk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgaW50ZXJydXB0aW9uIEFEQyBncm91cCBpbmplY3RlZCBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMuCisgICogQHJtdG9sbCBDUjEgICAgICBKRU9DSUUgICAgICAgICBMTF9BRENfRW5hYmxlSVRfSkVPUworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19FbmFibGVJVF9KRU9TKEFEQ19UeXBlRGVmICpBREN4KQoreworICAvKiBOb3RlOiBvbiB0aGlzIFNUTTMyIHNlcmllLCB0aGVyZSBpcyBubyBmbGFnIEFEQyBncm91cCBpbmplY3RlZCAgICAgICAgICAgKi8KKyAgLyogICAgICAgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgIEZsYWcgbm90ZWQgYXMgIkpFT0MiIGlzIGNvcnJlc3BvbmRpbmcgdG8gZmxhZyAiSkVPUyIgICAgICAgICAgICAgICAqLworICAvKiAgICAgICBpbiBvdGhlciBTVE0zMiBmYW1pbGllcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgU0VUX0JJVChBREN4LT5DUjEsIExMX0FEQ19JVF9KRU9TKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgaW50ZXJydXB0aW9uIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMS4KKyAgKiBAcm10b2xsIENSMSAgICAgIEFXRElFICAgICAgICAgIExMX0FEQ19FbmFibGVJVF9BV0QxCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0VuYWJsZUlUX0FXRDEoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFNFVF9CSVQoQURDeC0+Q1IxLCBMTF9BRENfSVRfQVdEMSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zLgorICAqIEBybXRvbGwgQ1IxICAgICAgRU9DSUUgICAgICAgICAgTExfQURDX0Rpc2FibGVJVF9FT1MKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRGlzYWJsZUlUX0VPUyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgLyogTm90ZTogb24gdGhpcyBTVE0zMiBzZXJpZSwgdGhlcmUgaXMgbm8gZmxhZyBBREMgZ3JvdXAgcmVndWxhciAgICAgICAgICAgICovCisgIC8qICAgICAgIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICBGbGFnIG5vdGVkIGFzICJFT0MiIGlzIGNvcnJlc3BvbmRpbmcgdG8gZmxhZyAiRU9TIiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgaW4gb3RoZXIgU1RNMzIgZmFtaWxpZXMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIENMRUFSX0JJVChBREN4LT5DUjEsIEFEQ19DUjFfRU9DSUUpOworfQorCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucy4KKyAgKiBAcm10b2xsIENSMSAgICAgIEpFT0NJRSAgICAgICAgIExMX0FEQ19FbmFibGVJVF9KRU9TCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9KRU9TKEFEQ19UeXBlRGVmICpBREN4KQoreworICAvKiBOb3RlOiBvbiB0aGlzIFNUTTMyIHNlcmllLCB0aGVyZSBpcyBubyBmbGFnIEFEQyBncm91cCBpbmplY3RlZCAgICAgICAgICAgKi8KKyAgLyogICAgICAgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgIEZsYWcgbm90ZWQgYXMgIkpFT0MiIGlzIGNvcnJlc3BvbmRpbmcgdG8gZmxhZyAiSkVPUyIgICAgICAgICAgICAgICAqLworICAvKiAgICAgICBpbiBvdGhlciBTVE0zMiBmYW1pbGllcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQ0xFQVJfQklUKEFEQ3gtPkNSMSwgTExfQURDX0lUX0pFT1MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgaW50ZXJydXB0aW9uIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMS4KKyAgKiBAcm10b2xsIENSMSAgICAgIEFXRElFICAgICAgICAgIExMX0FEQ19FbmFibGVJVF9BV0QxCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9BV0QxKEFEQ19UeXBlRGVmICpBREN4KQoreworICBDTEVBUl9CSVQoQURDeC0+Q1IxLCBMTF9BRENfSVRfQVdEMSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMKKyAgKiAgICAgICAgICgwOiBpbnRlcnJ1cHQgZGlzYWJsZWQsIDE6IGludGVycnVwdCBlbmFibGVkKS4KKyAgKiBAcm10b2xsIENSMSAgICAgIEVPQ0lFICAgICAgICAgIExMX0FEQ19Jc0VuYWJsZWRJVF9FT1MKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZElUX0VPUyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgLyogTm90ZTogb24gdGhpcyBTVE0zMiBzZXJpZSwgdGhlcmUgaXMgbm8gZmxhZyBBREMgZ3JvdXAgcmVndWxhciAgICAgICAgICAgICovCisgIC8qICAgICAgIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICBGbGFnIG5vdGVkIGFzICJFT0MiIGlzIGNvcnJlc3BvbmRpbmcgdG8gZmxhZyAiRU9TIiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgaW4gb3RoZXIgU1RNMzIgZmFtaWxpZXMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHJldHVybiAoUkVBRF9CSVQoQURDeC0+Q1IxLCBMTF9BRENfSVRfRU9TKSA9PSAoTExfQURDX0lUX0VPUykpOworfQorCisKKy8qKgorICAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBBREMgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zCisgICogICAgICAgICAoMDogaW50ZXJydXB0IGRpc2FibGVkLCAxOiBpbnRlcnJ1cHQgZW5hYmxlZCkuCisgICogQHJtdG9sbCBDUjEgICAgICBKRU9DSUUgICAgICAgICBMTF9BRENfRW5hYmxlSVRfSkVPUworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNFbmFibGVkSVRfSkVPUyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgLyogTm90ZTogb24gdGhpcyBTVE0zMiBzZXJpZSwgdGhlcmUgaXMgbm8gZmxhZyBBREMgZ3JvdXAgaW5qZWN0ZWQgICAgICAgICAgICovCisgIC8qICAgICAgIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICBGbGFnIG5vdGVkIGFzICJKRU9DIiBpcyBjb3JyZXNwb25kaW5nIHRvIGZsYWcgIkpFT1MiICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgaW4gb3RoZXIgU1RNMzIgZmFtaWxpZXMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHJldHVybiAoUkVBRF9CSVQoQURDeC0+Q1IxLCBMTF9BRENfSVRfSkVPUykgPT0gKExMX0FEQ19JVF9KRU9TKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBBREMgYW5hbG9nIHdhdGNoZG9nIDEKKyAgKiAgICAgICAgICgwOiBpbnRlcnJ1cHQgZGlzYWJsZWQsIDE6IGludGVycnVwdCBlbmFibGVkKS4KKyAgKiBAcm10b2xsIENSMSAgICAgIEFXRElFICAgICAgICAgIExMX0FEQ19FbmFibGVJVF9BV0QxCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0VuYWJsZWRJVF9BV0QxKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3gtPkNSMSwgTExfQURDX0lUX0FXRDEpID09IChMTF9BRENfSVRfQVdEMSkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9Jbml0IEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbiBvZiBzb21lIGZlYXR1cmVzIG9mIEFEQyBjb21tb24gcGFyYW1ldGVycyBhbmQgbXVsdGltb2RlICovCisvKiBOb3RlOiBPbiBTVE0zMkYzN3ggQURDLCB0aGVyZSBpcyBubyBBREMgY29tbW9uIGluaXRpYWxpemF0aW9uICAgICAgICAgICAgICAqLworLyogICAgICAgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK0Vycm9yU3RhdHVzIExMX0FEQ19Db21tb25EZUluaXQoQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pOworCisvKiBEZS1pbml0aWFsaXphdGlvbiBvZiBBREMgaW5zdGFuY2UsIEFEQyBncm91cCByZWd1bGFyIGFuZCBBREMgZ3JvdXAgaW5qZWN0ZWQgKi8KKy8qIChhdmFpbGFiaWxpdHkgb2YgQURDIGdyb3VwIGluamVjdGVkIGRlcGVuZHMgb24gU1RNMzIgZmFtaWxpZXMpICovCitFcnJvclN0YXR1cyBMTF9BRENfRGVJbml0KEFEQ19UeXBlRGVmICpBREN4KTsKKworLyogSW5pdGlhbGl6YXRpb24gb2Ygc29tZSBmZWF0dXJlcyBvZiBBREMgaW5zdGFuY2UgKi8KK0Vycm9yU3RhdHVzIExMX0FEQ19Jbml0KEFEQ19UeXBlRGVmICpBREN4LCBMTF9BRENfSW5pdFR5cGVEZWYgKkFEQ19Jbml0U3RydWN0KTsKK3ZvaWQgICAgICAgIExMX0FEQ19TdHJ1Y3RJbml0KExMX0FEQ19Jbml0VHlwZURlZiAqQURDX0luaXRTdHJ1Y3QpOworCisvKiBJbml0aWFsaXphdGlvbiBvZiBzb21lIGZlYXR1cmVzIG9mIEFEQyBpbnN0YW5jZSBhbmQgQURDIGdyb3VwIHJlZ3VsYXIgKi8KK0Vycm9yU3RhdHVzIExMX0FEQ19SRUdfSW5pdChBRENfVHlwZURlZiAqQURDeCwgTExfQURDX1JFR19Jbml0VHlwZURlZiAqQURDX1JFR19Jbml0U3RydWN0KTsKK3ZvaWQgICAgICAgIExMX0FEQ19SRUdfU3RydWN0SW5pdChMTF9BRENfUkVHX0luaXRUeXBlRGVmICpBRENfUkVHX0luaXRTdHJ1Y3QpOworCisvKiBJbml0aWFsaXphdGlvbiBvZiBzb21lIGZlYXR1cmVzIG9mIEFEQyBpbnN0YW5jZSBhbmQgQURDIGdyb3VwIGluamVjdGVkICovCitFcnJvclN0YXR1cyBMTF9BRENfSU5KX0luaXQoQURDX1R5cGVEZWYgKkFEQ3gsIExMX0FEQ19JTkpfSW5pdFR5cGVEZWYgKkFEQ19JTkpfSW5pdFN0cnVjdCk7Cit2b2lkICAgICAgICBMTF9BRENfSU5KX1N0cnVjdEluaXQoTExfQURDX0lOSl9Jbml0VHlwZURlZiAqQURDX0lOSl9Jbml0U3RydWN0KTsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEFEQzEgKi8KKworCisjZW5kaWYgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJGM3h4X0xMX0FEQ19IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2xsX2J1cy5oIGIvSW5jL3N0bTMyZjN4eF9sbF9idXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2U1ODQ5Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjN4eF9sbF9idXMuaApAQCAtMCwwICsxLDEwNzkgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfbGxfYnVzLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIEJVUyBMTCBtb2R1bGUuCisKKyAgQHZlcmJhdGltICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFJDQyBMaW1pdGF0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICAKKyAgICAgIEEgZGVsYXkgYmV0d2VlbiBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGUgYW5kIHRoZSBlZmZlY3RpdmUgcGVyaXBoZXJhbCAKKyAgICAgIGVuYWJsaW5nIHNob3VsZCBiZSB0YWtlbiBpbnRvIGFjY291bnQgaW4gb3JkZXIgdG8gbWFuYWdlIHRoZSBwZXJpcGhlcmFsIHJlYWQvd3JpdGUgCisgICAgICBmcm9tL3RvIHJlZ2lzdGVycy4KKyAgICAgICgrKSBUaGlzIGRlbGF5IGRlcGVuZHMgb24gdGhlIHBlcmlwaGVyYWwgbWFwcGluZy4KKyAgICAgICAgKCsrKSBBSEIgJiBBUEIgcGVyaXBoZXJhbHMsIDEgZHVtbXkgcmVhZCBpcyBuZWNlc3NhcnkKKworICAgIFsuLl0gIAorICAgICAgV29ya2Fyb3VuZHM6CisgICAgICAoIykgRm9yIEFIQiAmIEFQQiBwZXJpcGhlcmFscywgYSBkdW1teSByZWFkIHRvIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIGhhcyBiZWVuCisgICAgICAgICAgaW5zZXJ0ZWQgaW4gZWFjaCBMTF97QlVTfV9HUlB7eH1fRW5hYmxlQ2xvY2soKSBmdW5jdGlvbi4KKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0xMX0JVU19ICisjZGVmaW5lIF9fU1RNMzJGM3h4X0xMX0JVU19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChSQ0MpCisKKy8qKiBAZGVmZ3JvdXAgQlVTX0xMIEJVUworICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQlVTX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBCVVMgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBCVVNfTExfRUNfQUhCMV9HUlAxX1BFUklQSCAgQUhCMSBHUlAxIFBFUklQSAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0FIQjFfR1JQMV9QRVJJUEhfQUxMICAgICAgICAgICAgKHVpbnQzMl90KTB4RkZGRkZGRkZVCisjZGVmaW5lIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMSAgICAgICAgICAgUkNDX0FIQkVOUl9ETUExRU4KKyNpZiBkZWZpbmVkKERNQTIpCisjZGVmaW5lIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMiAgICAgICAgICAgUkNDX0FIQkVOUl9ETUEyRU4KKyNlbmRpZiAvKkRNQTIqLworI2RlZmluZSBMTF9BSEIxX0dSUDFfUEVSSVBIX1NSQU0gICAgICAgICAgIFJDQ19BSEJFTlJfU1JBTUVOCisjZGVmaW5lIExMX0FIQjFfR1JQMV9QRVJJUEhfRkxBU0ggICAgICAgICAgUkNDX0FIQkVOUl9GTElURkVOCisjaWYgZGVmaW5lZChGTUNfQmFuazEpCisjZGVmaW5lIExMX0FIQjFfR1JQMV9QRVJJUEhfRk1DICAgICAgICAgICAgUkNDX0FIQkVOUl9GTUNFTgorI2VuZGlmIC8qRk1DX0JhbmsxKi8KKyNkZWZpbmUgTExfQUhCMV9HUlAxX1BFUklQSF9DUkMgICAgICAgICAgICBSQ0NfQUhCRU5SX0NSQ0VOCisjaWYgZGVmaW5lZChHUElPSCkKKyNkZWZpbmUgTExfQUhCMV9HUlAxX1BFUklQSF9HUElPSCAgICAgICAgICBSQ0NfQUhCRU5SX0dQSU9IRU4KKyNlbmRpZiAvKkdQSU9IKi8KKyNkZWZpbmUgTExfQUhCMV9HUlAxX1BFUklQSF9HUElPQSAgICAgICAgICBSQ0NfQUhCRU5SX0dQSU9BRU4KKyNkZWZpbmUgTExfQUhCMV9HUlAxX1BFUklQSF9HUElPQiAgICAgICAgICBSQ0NfQUhCRU5SX0dQSU9CRU4KKyNkZWZpbmUgTExfQUhCMV9HUlAxX1BFUklQSF9HUElPQyAgICAgICAgICBSQ0NfQUhCRU5SX0dQSU9DRU4KKyNkZWZpbmUgTExfQUhCMV9HUlAxX1BFUklQSF9HUElPRCAgICAgICAgICBSQ0NfQUhCRU5SX0dQSU9ERU4KKyNpZiBkZWZpbmVkKEdQSU9FKQorI2RlZmluZSBMTF9BSEIxX0dSUDFfUEVSSVBIX0dQSU9FICAgICAgICAgIFJDQ19BSEJFTlJfR1BJT0VFTgorI2VuZGlmIC8qR1BJT0UqLworI2RlZmluZSBMTF9BSEIxX0dSUDFfUEVSSVBIX0dQSU9GICAgICAgICAgIFJDQ19BSEJFTlJfR1BJT0ZFTgorI2lmIGRlZmluZWQoR1BJT0cpCisjZGVmaW5lIExMX0FIQjFfR1JQMV9QRVJJUEhfR1BJT0cgICAgICAgICAgUkNDX0FIQkVOUl9HUElPR0VOCisjZW5kaWYgLypHUElPSCovCisjZGVmaW5lIExMX0FIQjFfR1JQMV9QRVJJUEhfVFNDICAgICAgICAgICAgUkNDX0FIQkVOUl9UU0NFTgorI2lmIGRlZmluZWQoUkNDX0FIQkVOUl9BREMxRU4pCisjZGVmaW5lIExMX0FIQjFfR1JQMV9QRVJJUEhfQURDMSAgICAgICAgICAgUkNDX0FIQkVOUl9BREMxRU4KKyNlbmRpZiAvKlJDQ19BSEJFTlJfQURDMUVOKi8KKyNpZiBkZWZpbmVkKEFEQzFfMl9DT01NT04pCisjZGVmaW5lIExMX0FIQjFfR1JQMV9QRVJJUEhfQURDMTIgICAgICAgICAgUkNDX0FIQkVOUl9BREMxMkVOCisjZW5kaWYgLypBREMxXzJfQ09NTU9OKi8KKyNpZiBkZWZpbmVkKEFEQzNfNF9DT01NT04pCisjZGVmaW5lIExMX0FIQjFfR1JQMV9QRVJJUEhfQURDMzQgICAgICAgICAgUkNDX0FIQkVOUl9BREMzNEVOCisjZW5kaWYgLypBREMzXzRfQ09NTU9OKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQlVTX0xMX0VDX0FQQjFfR1JQMV9QRVJJUEggIEFQQjEgR1JQMSBQRVJJUEgKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX0FMTCAgICAgICAgICAgICh1aW50MzJfdCkweEZGRkZGRkZGVQorI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTIgICAgICAgICAgIFJDQ19BUEIxRU5SX1RJTTJFTgorI2lmIGRlZmluZWQoVElNMykKKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9USU0zICAgICAgICAgICBSQ0NfQVBCMUVOUl9USU0zRU4KKyNlbmRpZiAvKlRJTTMqLworI2lmIGRlZmluZWQoVElNNCkKKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9USU00ICAgICAgICAgICBSQ0NfQVBCMUVOUl9USU00RU4KKyNlbmRpZiAvKlRJTTQqLworI2lmIGRlZmluZWQoVElNNSkKKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9USU01ICAgICAgICAgICBSQ0NfQVBCMUVOUl9USU01RU4KKyNlbmRpZiAvKlRJTTUqLworI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTYgICAgICAgICAgIFJDQ19BUEIxRU5SX1RJTTZFTgorI2lmIGRlZmluZWQoVElNNykKKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9USU03ICAgICAgICAgICBSQ0NfQVBCMUVOUl9USU03RU4KKyNlbmRpZiAvKlRJTTcqLworI2lmIGRlZmluZWQoVElNMTIpCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMTIgICAgICAgICAgUkNDX0FQQjFFTlJfVElNMTJFTgorI2VuZGlmIC8qVElNMTIqLworI2lmIGRlZmluZWQoVElNMTMpCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMTMgICAgICAgICAgUkNDX0FQQjFFTlJfVElNMTNFTgorI2VuZGlmIC8qVElNMTMqLworI2lmIGRlZmluZWQoVElNMTQpCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMTQgICAgICAgICAgUkNDX0FQQjFFTlJfVElNMTRFTgorI2VuZGlmIC8qVElNMTQqLworI2lmIGRlZmluZWQoVElNMTgpCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMTggICAgICAgICAgUkNDX0FQQjFFTlJfVElNMThFTgorI2VuZGlmIC8qVElNMTgqLworI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX1dXREcgICAgICAgICAgIFJDQ19BUEIxRU5SX1dXREdFTgorI2lmIGRlZmluZWQoU1BJMikKKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9TUEkyICAgICAgICAgICBSQ0NfQVBCMUVOUl9TUEkyRU4KKyNlbmRpZiAvKlNQSTIqLworI2lmIGRlZmluZWQoU1BJMykKKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9TUEkzICAgICAgICAgICBSQ0NfQVBCMUVOUl9TUEkzRU4KKyNlbmRpZiAvKlNQSTMqLworI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUMiAgICAgICAgIFJDQ19BUEIxRU5SX1VTQVJUMkVOCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQzICAgICAgICAgUkNDX0FQQjFFTlJfVVNBUlQzRU4KKyNpZiBkZWZpbmVkKFVBUlQ0KQorI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX1VBUlQ0ICAgICAgICAgIFJDQ19BUEIxRU5SX1VBUlQ0RU4KKyNlbmRpZiAvKlVBUlQ0Ki8KKyNpZiBkZWZpbmVkKFVBUlQ1KQorI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX1VBUlQ1ICAgICAgICAgIFJDQ19BUEIxRU5SX1VBUlQ1RU4KKyNlbmRpZiAvKlVBUlQ1Ki8KKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMxICAgICAgICAgICBSQ0NfQVBCMUVOUl9JMkMxRU4KKyNpZiBkZWZpbmVkKEkyQzIpCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMiAgICAgICAgICAgUkNDX0FQQjFFTlJfSTJDMkVOCisjZW5kaWYgLypJMkMyKi8KKyNpZiBkZWZpbmVkKFVTQikKKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9VU0IgICAgICAgICAgICBSQ0NfQVBCMUVOUl9VU0JFTgorI2VuZGlmIC8qVVNCKi8KKyNpZiBkZWZpbmVkKENBTikKKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9DQU4gICAgICAgICAgICBSQ0NfQVBCMUVOUl9DQU5FTgorI2VuZGlmIC8qQ0FOKi8KKyNpZiBkZWZpbmVkKERBQzIpCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfREFDMiAgICAgICAgICAgUkNDX0FQQjFFTlJfREFDMkVOCisjZW5kaWYgLypEQUMyKi8KKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9QV1IgICAgICAgICAgICBSQ0NfQVBCMUVOUl9QV1JFTgorI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX0RBQzEgICAgICAgICAgIFJDQ19BUEIxRU5SX0RBQzFFTgorI2lmIGRlZmluZWQoQ0VDKQorI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX0NFQyAgICAgICAgICAgIFJDQ19BUEIxRU5SX0NFQ0VOCisjZW5kaWYgLypDRUMqLworI2lmIGRlZmluZWQoSTJDMykKKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMzICAgICAgICAgICBSQ0NfQVBCMUVOUl9JMkMzRU4KKyNlbmRpZiAvKkkyQzMqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBCVVNfTExfRUNfQVBCMl9HUlAxX1BFUklQSCAgQVBCMiBHUlAxIFBFUklQSAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0FQQjJfR1JQMV9QRVJJUEhfQUxMICAgICAgICAgICAgKHVpbnQzMl90KTB4RkZGRkZGRkZVCisjZGVmaW5lIExMX0FQQjJfR1JQMV9QRVJJUEhfU1lTQ0ZHICAgICAgICAgUkNDX0FQQjJFTlJfU1lTQ0ZHRU4KKyNpZiBkZWZpbmVkKFJDQ19BUEIyRU5SX0FEQzFFTikKKyNkZWZpbmUgTExfQVBCMl9HUlAxX1BFUklQSF9BREMxICAgICAgICAgICBSQ0NfQVBCMkVOUl9BREMxRU4KKyNlbmRpZiAvKlJDQ19BUEIyRU5SX0FEQzFFTiovCisjaWYgZGVmaW5lZChUSU0xKQorI2RlZmluZSBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTEgICAgICAgICAgIFJDQ19BUEIyRU5SX1RJTTFFTgorI2VuZGlmIC8qVElNMSovCisjaWYgZGVmaW5lZChTUEkxKQorI2RlZmluZSBMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTEgICAgICAgICAgIFJDQ19BUEIyRU5SX1NQSTFFTgorI2VuZGlmIC8qU1BJMSovCisjaWYgZGVmaW5lZChUSU04KQorI2RlZmluZSBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTggICAgICAgICAgIFJDQ19BUEIyRU5SX1RJTThFTgorI2VuZGlmIC8qVElNOCovCisjZGVmaW5lIExMX0FQQjJfR1JQMV9QRVJJUEhfVVNBUlQxICAgICAgICAgUkNDX0FQQjJFTlJfVVNBUlQxRU4KKyNpZiBkZWZpbmVkKFNQSTQpCisjZGVmaW5lIExMX0FQQjJfR1JQMV9QRVJJUEhfU1BJNCAgICAgICAgICAgUkNDX0FQQjJFTlJfU1BJNEVOCisjZW5kaWYgLypTUEk0Ki8KKyNkZWZpbmUgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNSAgICAgICAgICBSQ0NfQVBCMkVOUl9USU0xNUVOCisjZGVmaW5lIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTYgICAgICAgICAgUkNDX0FQQjJFTlJfVElNMTZFTgorI2RlZmluZSBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE3ICAgICAgICAgIFJDQ19BUEIyRU5SX1RJTTE3RU4KKyNpZiBkZWZpbmVkKFRJTTE5KQorI2RlZmluZSBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE5ICAgICAgICAgIFJDQ19BUEIyRU5SX1RJTTE5RU4KKyNlbmRpZiAvKlRJTTE5Ki8KKyNpZiBkZWZpbmVkKFRJTTIwKQorI2RlZmluZSBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTIwICAgICAgICAgIFJDQ19BUEIyRU5SX1RJTTIwRU4KKyNlbmRpZiAvKlRJTTIwKi8KKyNpZiBkZWZpbmVkKEhSVElNMSkKKyNkZWZpbmUgTExfQVBCMl9HUlAxX1BFUklQSF9IUlRJTTEgICAgICAgICBSQ0NfQVBCMkVOUl9IUlRJTTFFTgorI2VuZGlmIC8qSFJUSU0xKi8KKyNpZiBkZWZpbmVkKFNEQURDMSkKKyNkZWZpbmUgTExfQVBCMl9HUlAxX1BFUklQSF9TREFEQzEgICAgICAgICBSQ0NfQVBCMkVOUl9TREFEQzFFTgorI2VuZGlmIC8qU0RBREMxKi8KKyNpZiBkZWZpbmVkKFNEQURDMikKKyNkZWZpbmUgTExfQVBCMl9HUlAxX1BFUklQSF9TREFEQzIgICAgICAgICBSQ0NfQVBCMkVOUl9TREFEQzJFTgorI2VuZGlmIC8qU0RBREMyKi8KKyNpZiBkZWZpbmVkKFNEQURDMykKKyNkZWZpbmUgTExfQVBCMl9HUlAxX1BFUklQSF9TREFEQzMgICAgICAgICBSQ0NfQVBCMkVOUl9TREFEQzNFTgorI2VuZGlmIC8qU0RBREMzKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEJVU19MTF9FeHBvcnRlZF9GdW5jdGlvbnMgQlVTIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQlVTX0xMX0VGX0FIQjEgQUhCMQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEFIQjEgcGVyaXBoZXJhbHMgY2xvY2suCisgICogQHJtdG9sbCBBSEJFTlIgICAgICAgRE1BMUVOICAgICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCRU5SICAgICAgIERNQTJFTiAgICAgICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgICBTUkFNRU4gICAgICAgIExMX0FIQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBSEJFTlIgICAgICAgRkxJVEZFTiAgICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCRU5SICAgICAgIEZNQ0VOICAgICAgICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgICBDUkNFTiAgICAgICAgIExMX0FIQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBSEJFTlIgICAgICAgR1BJT0hFTiAgICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCRU5SICAgICAgIEdQSU9BRU4gICAgICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgICBHUElPQkVOICAgICAgIExMX0FIQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBSEJFTlIgICAgICAgR1BJT0NFTiAgICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCRU5SICAgICAgIEdQSU9ERU4gICAgICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgICBHUElPRUVOICAgICAgIExMX0FIQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBSEJFTlIgICAgICAgR1BJT0ZFTiAgICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCRU5SICAgICAgIEdQSU9HRU4gICAgICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgICBUU0NFTiAgICAgICAgIExMX0FIQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBSEJFTlIgICAgICAgQURDMUVOICAgICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCRU5SICAgICAgIEFEQzEyRU4gICAgICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgICBBREMzNEVOICAgICAgIExMX0FIQjFfR1JQMV9FbmFibGVDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9TUkFNCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9GTEFTSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRk1DICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQ1JDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9HUElPSCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0dQSU9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9HUElPQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfR1BJT0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0dQSU9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9HUElPRSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0dQSU9GCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9HUElPRyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX1RTQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQURDMSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0FEQzEyICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQURDMzQgKCopCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2sodWludDMyX3QgUGVyaXBocykKK3sKKyAgX19JTyB1aW50MzJfdCB0bXByZWc7CisgIFNFVF9CSVQoUkNDLT5BSEJFTlIsIFBlcmlwaHMpOworICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLworICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQkVOUiwgUGVyaXBocyk7CisgICh2b2lkKXRtcHJlZzsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBBSEIxIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIEFIQkVOUiAgICAgICBETUExRU4gICAgICAgIExMX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBSEJFTlIgICAgICAgRE1BMkVOICAgICAgICBMTF9BSEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQUhCRU5SICAgICAgIFNSQU1FTiAgICAgICAgTExfQUhCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgICBGTElURkVOICAgICAgIExMX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBSEJFTlIgICAgICAgRk1DRU4gICAgICAgICBMTF9BSEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQUhCRU5SICAgICAgIENSQ0VOICAgICAgICAgTExfQUhCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgICBHUElPSEVOICAgICAgIExMX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBSEJFTlIgICAgICAgR1BJT0FFTiAgICAgICBMTF9BSEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQUhCRU5SICAgICAgIEdQSU9CRU4gICAgICAgTExfQUhCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgICBHUElPQ0VOICAgICAgIExMX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBSEJFTlIgICAgICAgR1BJT0RFTiAgICAgICBMTF9BSEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQUhCRU5SICAgICAgIEdQSU9FRU4gICAgICAgTExfQUhCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgICBHUElPRkVOICAgICAgIExMX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBSEJFTlIgICAgICAgR1BJT0dFTiAgICAgICBMTF9BSEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQUhCRU5SICAgICAgIFRTQ0VOICAgICAgICAgTExfQUhCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgICBBREMxRU4gICAgICAgIExMX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBSEJFTlIgICAgICAgQURDMTJFTiAgICAgICBMTF9BSEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQUhCRU5SICAgICAgIEFEQzM0RU4gICAgICAgTExfQUhCMV9HUlAxX0lzRW5hYmxlZENsb2NrCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX1NSQU0KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0ZMQVNICisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9GTUMgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9DUkMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0dQSU9IICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfR1BJT0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0dQSU9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9HUElPQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfR1BJT0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0dQSU9FICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfR1BJT0YKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0dQSU9HICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfVFNDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9BREMxICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQURDMTIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9BREMzNCAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgU3RhdGUgb2YgUGVyaXBocyAoMSBvciAwKS4KKyovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQUhCMV9HUlAxX0lzRW5hYmxlZENsb2NrKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIHJldHVybiAoUkVBRF9CSVQoUkNDLT5BSEJFTlIsIFBlcmlwaHMpID09IFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQUhCMSBwZXJpcGhlcmFscyBjbG9jay4KKyAgKiBAcm10b2xsIEFIQkVOUiAgICAgICBETUExRU4gICAgICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCRU5SICAgICAgIERNQTJFTiAgICAgICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBSEJFTlIgICAgICAgU1JBTUVOICAgICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgICBGTElURkVOICAgICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCRU5SICAgICAgIEZNQ0VOICAgICAgICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBSEJFTlIgICAgICAgQ1JDRU4gICAgICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgICBHUElPSEVOICAgICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCRU5SICAgICAgIEdQSU9BRU4gICAgICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBSEJFTlIgICAgICAgR1BJT0JFTiAgICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgICBHUElPQ0VOICAgICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCRU5SICAgICAgIEdQSU9ERU4gICAgICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBSEJFTlIgICAgICAgR1BJT0VFTiAgICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgICBHUElPRkVOICAgICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCRU5SICAgICAgIEdQSU9HRU4gICAgICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBSEJFTlIgICAgICAgVFNDRU4gICAgICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgICBBREMxRU4gICAgICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCRU5SICAgICAgIEFEQzEyRU4gICAgICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBSEJFTlIgICAgICAgQURDMzRFTiAgICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX1NSQU0KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0ZMQVNICisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9GTUMgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9DUkMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0dQSU9IICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfR1BJT0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0dQSU9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9HUElPQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfR1BJT0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0dQSU9FICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfR1BJT0YKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0dQSU9HICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfVFNDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9BREMxICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQURDMTIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9BREMzNCAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2sodWludDMyX3QgUGVyaXBocykKK3sKKyAgQ0xFQVJfQklUKFJDQy0+QUhCRU5SLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBGb3JjZSBBSEIxIHBlcmlwaGVyYWxzIHJlc2V0LgorICAqIEBybXRvbGwgQUhCUlNUUiAgICAgIEZNQ1JTVCAgICAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQUhCUlNUUiAgICAgIEdQSU9IUlNUICAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQUhCUlNUUiAgICAgIEdQSU9BUlNUICAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQUhCUlNUUiAgICAgIEdQSU9CUlNUICAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQUhCUlNUUiAgICAgIEdQSU9DUlNUICAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQUhCUlNUUiAgICAgIEdQSU9EUlNUICAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQUhCUlNUUiAgICAgIEdQSU9FUlNUICAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQUhCUlNUUiAgICAgIEdQSU9GUlNUICAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQUhCUlNUUiAgICAgIEdQSU9HUlNUICAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQUhCUlNUUiAgICAgIFRTQ1JTVCAgICAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQUhCUlNUUiAgICAgIEFEQzFSU1QgICAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQUhCUlNUUiAgICAgIEFEQzEyUlNUICAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQUhCUlNUUiAgICAgIEFEQzM0UlNUICAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXQKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9BTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0ZNQyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0dQSU9IICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfR1BJT0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0dQSU9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9HUElPQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfR1BJT0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0dQSU9FICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfR1BJT0YKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0dQSU9HICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfVFNDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9BREMxICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQURDMTIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9BREMzNCAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0KHVpbnQzMl90IFBlcmlwaHMpCit7CisgIFNFVF9CSVQoUkNDLT5BSEJSU1RSLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWxlYXNlIEFIQjEgcGVyaXBoZXJhbHMgcmVzZXQuCisgICogQHJtdG9sbCBBSEJSU1RSICAgICAgRk1DUlNUICAgICAgICBMTF9BSEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQlJTVFIgICAgICBHUElPSFJTVCAgICAgIExMX0FIQjFfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQUhCUlNUUiAgICAgIEdQSU9BUlNUICAgICAgTExfQUhCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBSEJSU1RSICAgICAgR1BJT0JSU1QgICAgICBMTF9BSEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQlJTVFIgICAgICBHUElPQ1JTVCAgICAgIExMX0FIQjFfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQUhCUlNUUiAgICAgIEdQSU9EUlNUICAgICAgTExfQUhCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBSEJSU1RSICAgICAgR1BJT0VSU1QgICAgICBMTF9BSEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQlJTVFIgICAgICBHUElPRlJTVCAgICAgIExMX0FIQjFfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQUhCUlNUUiAgICAgIEdQSU9HUlNUICAgICAgTExfQUhCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBSEJSU1RSICAgICAgVFNDUlNUICAgICAgICBMTF9BSEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQlJTVFIgICAgICBBREMxUlNUICAgICAgIExMX0FIQjFfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQUhCUlNUUiAgICAgIEFEQzEyUlNUICAgICAgTExfQUhCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBSEJSU1RSICAgICAgQURDMzRSU1QgICAgICBMTF9BSEIxX0dSUDFfUmVsZWFzZVJlc2V0CisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQUxMCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9GTUMgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9HUElPSCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0dQSU9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9HUElPQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfR1BJT0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0dQSU9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9HUElPRSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0dQSU9GCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9HUElPRyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX1RTQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQURDMSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0FEQzEyICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQURDMzQgKCopCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BSEIxX0dSUDFfUmVsZWFzZVJlc2V0KHVpbnQzMl90IFBlcmlwaHMpCit7CisgIENMRUFSX0JJVChSQ0MtPkFIQlJTVFIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEJVU19MTF9FRl9BUEIxIEFQQjEKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBUEIxIHBlcmlwaGVyYWxzIGNsb2NrLgorICAqIEBybXRvbGwgQVBCMUVOUiAgICAgIFRJTTJFTiAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgICBUSU0zRU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICAgVElNNEVOICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgIFRJTTVFTiAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgICBUSU02RU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICAgVElNN0VOICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgIFRJTTEyRU4gICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgICBUSU0xM0VOICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICAgVElNMTRFTiAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgIFRJTTE4RU4gICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgICBXV0RHRU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICAgU1BJMkVOICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgIFNQSTNFTiAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgICBVU0FSVDJFTiAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICAgVVNBUlQzRU4gICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgIFVBUlQ0RU4gICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgICBVQVJUNUVOICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICAgSTJDMUVOICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgIEkyQzJFTiAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgICBVU0JFTiAgICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICAgQ0FORU4gICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgIERBQzJFTiAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgICBQV1JFTiAgICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICAgREFDMUVOICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgIENFQ0VOICAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgICBJMkMzRU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTMgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU00ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTcgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU0xMiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTEzICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMTQgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU0xOCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1dXREcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1NQSTIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9TUEkzICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VBUlQ0ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVUFSVDUgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMyICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNCICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfQ0FOICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfREFDMiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1BXUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfREFDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfQ0VDICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMyAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjFfR1JQMV9FbmFibGVDbG9jayh1aW50MzJfdCBQZXJpcGhzKQoreworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKyAgU0VUX0JJVChSQ0MtPkFQQjFFTlIsIFBlcmlwaHMpOworICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLworICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFBlcmlwaHMpOworICAodm9pZCl0bXByZWc7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgQVBCMSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBBUEIxRU5SICAgICAgVElNMkVOICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgIFRJTTNFTiAgICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgICBUSU00RU4gICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICAgVElNNUVOICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgIFRJTTZFTiAgICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgICBUSU03RU4gICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICAgVElNMTJFTiAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgIFRJTTEzRU4gICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgICBUSU0xNEVOICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICAgVElNMThFTiAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgIFdXREdFTiAgICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgICBTUEkyRU4gICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICAgU1BJM0VOICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgIFVTQVJUMkVOICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgICBVU0FSVDNFTiAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICAgVUFSVDRFTiAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgIFVBUlQ1RU4gICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgICBJMkMxRU4gICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICAgSTJDMkVOICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgIFVTQkVOICAgICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgICBDQU5FTiAgICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICAgREFDMkVOICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgIFBXUkVOICAgICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgICBEQUMxRU4gICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICAgQ0VDRU4gICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgIEkyQzNFTiAgICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTQgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU01ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTEyICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMTMgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU0xNCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTE4ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfV1dERworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1NQSTMgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVUFSVDQgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VQVJUNSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0IgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9DQU4gKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9EQUMyICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfUFdSCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9EQUMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9DRUMgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMzICgqKQorICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgICogQHJldHZhbCBTdGF0ZSBvZiBQZXJpcGhzICgxIG9yIDApLgorKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2sodWludDMyX3QgUGVyaXBocykKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFBlcmlwaHMpID09IFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQVBCMSBwZXJpcGhlcmFscyBjbG9jay4KKyAgKiBAcm10b2xsIEFQQjFFTlIgICAgICBUSU0yRU4gICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgIFRJTTNFTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICAgVElNNEVOICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgICBUSU01RU4gICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgIFRJTTZFTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICAgVElNN0VOICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgICBUSU0xMkVOICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgIFRJTTEzRU4gICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICAgVElNMTRFTiAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgICBUSU0xOEVOICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgIFdXREdFTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICAgU1BJMkVOICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgICBTUEkzRU4gICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgIFVTQVJUMkVOICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICAgVVNBUlQzRU4gICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgICBVQVJUNEVOICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgIFVBUlQ1RU4gICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICAgSTJDMUVOICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgICBJMkMyRU4gICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgIFVTQkVOICAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICAgQ0FORU4gICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgICBEQUMyRU4gICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgIFBXUkVOICAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICAgREFDMUVOICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgICBDRUNFTiAgICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgIEkyQzNFTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTMgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU00ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTcgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU0xMiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTEzICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMTQgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU0xOCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1dXREcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1NQSTIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9TUEkzICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VBUlQ0ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVUFSVDUgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMyICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNCICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfQ0FOICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfREFDMiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1BXUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfREFDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfQ0VDICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMyAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2sodWludDMyX3QgUGVyaXBocykKK3sKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUiwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRm9yY2UgQVBCMSBwZXJpcGhlcmFscyByZXNldC4KKyAgKiBAcm10b2xsIEFQQjFSU1RSICAgICBUSU0yUlNUICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBUSU0zUlNUICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBUSU00UlNUICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBUSU01UlNUICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBUSU02UlNUICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBUSU03UlNUICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBUSU0xMlJTVCAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBUSU0xM1JTVCAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBUSU0xNFJTVCAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBUSU0xOFJTVCAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBXV0RHUlNUICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBTUEkyUlNUICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBTUEkzUlNUICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBVU0FSVDJSU1QgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBVU0FSVDNSU1QgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBVQVJUNFJTVCAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBVQVJUNVJTVCAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBJMkMxUlNUICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBJMkMyUlNUICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBVU0JSU1QgICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBDQU5SU1QgICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBEQUMyUlNUICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBQV1JSU1QgICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBEQUMxUlNUICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBDRUNSU1QgICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBJMkMzUlNUICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0CisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfQUxMCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU0yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU0zICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTUgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU02CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU03ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMTIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU0xMyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTE0ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMTggKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9XV0RHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9TUEkyICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VQVJUNCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VBUlQ1ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0NBTiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0RBQzIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9QV1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0RBQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0NFQyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzMgKCopCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldCh1aW50MzJfdCBQZXJpcGhzKQoreworICBTRVRfQklUKFJDQy0+QVBCMVJTVFIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlbGVhc2UgQVBCMSBwZXJpcGhlcmFscyByZXNldC4KKyAgKiBAcm10b2xsIEFQQjFSU1RSICAgICBUSU0yUlNUICAgICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMVJTVFIgICAgIFRJTTNSU1QgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBUEIxUlNUUiAgICAgVElNNFJTVCAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBUSU01UlNUICAgICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMVJTVFIgICAgIFRJTTZSU1QgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBUEIxUlNUUiAgICAgVElNN1JTVCAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBUSU0xMlJTVCAgICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMVJTVFIgICAgIFRJTTEzUlNUICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBUEIxUlNUUiAgICAgVElNMTRSU1QgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBUSU0xOFJTVCAgICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMVJTVFIgICAgIFdXREdSU1QgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBUEIxUlNUUiAgICAgU1BJMlJTVCAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBTUEkzUlNUICAgICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMVJTVFIgICAgIFVTQVJUMlJTVCAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBUEIxUlNUUiAgICAgVVNBUlQzUlNUICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBVQVJUNFJTVCAgICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMVJTVFIgICAgIFVBUlQ1UlNUICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBUEIxUlNUUiAgICAgSTJDMVJTVCAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBJMkMyUlNUICAgICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMVJTVFIgICAgIFVTQlJTVCAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBUEIxUlNUUiAgICAgQ0FOUlNUICAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBEQUMyUlNUICAgICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMVJTVFIgICAgIFBXUlJTVCAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBUEIxUlNUUiAgICAgREFDMVJTVCAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBDRUNSU1QgICAgICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMVJTVFIgICAgIEkyQzNSU1QgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0FMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTQgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU01ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTEyICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMTMgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU0xNCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTE4ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfV1dERworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1NQSTMgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVUFSVDQgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VQVJUNSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0IgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9DQU4gKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9EQUMyICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfUFdSCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9EQUMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9DRUMgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMzICgqKQorICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldCh1aW50MzJfdCBQZXJpcGhzKQoreworICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUiwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQlVTX0xMX0VGX0FQQjIgQVBCMgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEFQQjIgcGVyaXBoZXJhbHMgY2xvY2suCisgICogQHJtdG9sbCBBUEIyRU5SICAgICAgU1lTQ0ZHRU4gICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMkVOUiAgICAgIEFEQzFFTiAgICAgICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjJFTlIgICAgICBUSU0xRU4gICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEIyRU5SICAgICAgU1BJMUVOICAgICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMkVOUiAgICAgIFRJTThFTiAgICAgICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjJFTlIgICAgICBVU0FSVDFFTiAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEIyRU5SICAgICAgU1BJNEVOICAgICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMkVOUiAgICAgIFRJTTE1RU4gICAgICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjJFTlIgICAgICBUSU0xNkVOICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEIyRU5SICAgICAgVElNMTdFTiAgICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMkVOUiAgICAgIFRJTTE5RU4gICAgICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjJFTlIgICAgICBUSU0yMEVOICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEIyRU5SICAgICAgSFJUSU0xRU4gICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMkVOUiAgICAgIFNEQURDMUVOICAgICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjJFTlIgICAgICBTREFEQzJFTiAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEIyRU5SICAgICAgU0RBREMzRU4gICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2sKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TWVNDRkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX0FEQzEgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1BJMSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTggKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9VU0FSVDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTQgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xOSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTIwICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfSFJUSU0xICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU0RBREMxICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU0RBREMyICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU0RBREMzICgqKQorICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICBTRVRfQklUKFJDQy0+QVBCMkVOUiwgUGVyaXBocyk7CisgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovCisgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUGVyaXBocyk7CisgICh2b2lkKXRtcHJlZzsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBBUEIyIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIEFQQjJFTlIgICAgICBTWVNDRkdFTiAgICAgIExMX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIyRU5SICAgICAgQURDMUVOICAgICAgICBMTF9BUEIyX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCMkVOUiAgICAgIFRJTTFFTiAgICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQjJFTlIgICAgICBTUEkxRU4gICAgICAgIExMX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIyRU5SICAgICAgVElNOEVOICAgICAgICBMTF9BUEIyX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCMkVOUiAgICAgIFVTQVJUMUVOICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQjJFTlIgICAgICBTUEk0RU4gICAgICAgIExMX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIyRU5SICAgICAgVElNMTVFTiAgICAgICBMTF9BUEIyX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCMkVOUiAgICAgIFRJTTE2RU4gICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQjJFTlIgICAgICBUSU0xN0VOICAgICAgIExMX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIyRU5SICAgICAgVElNMTlFTiAgICAgICBMTF9BUEIyX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCMkVOUiAgICAgIFRJTTIwRU4gICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQjJFTlIgICAgICBIUlRJTTFFTiAgICAgIExMX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIyRU5SICAgICAgU0RBREMxRU4gICAgICBMTF9BUEIyX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCMkVOUiAgICAgIFNEQURDMkVOICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQjJFTlIgICAgICBTREFEQzNFTiAgICAgIExMX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NZU0NGRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfQURDMSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTEgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TUEkxICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNOCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1BJNCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE5ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMjAgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9IUlRJTTEgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TREFEQzEgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TREFEQzIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TREFEQzMgKCopCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIFBlcmlwaHMgKDEgb3IgMCkuCisqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9jayh1aW50MzJfdCBQZXJpcGhzKQoreworICByZXR1cm4gKFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUGVyaXBocykgPT0gUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBUEIyIHBlcmlwaGVyYWxzIGNsb2NrLgorICAqIEBybXRvbGwgQVBCMkVOUiAgICAgIFNZU0NGR0VOICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEIyRU5SICAgICAgQURDMUVOICAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjJFTlIgICAgICBUSU0xRU4gICAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMkVOUiAgICAgIFNQSTFFTiAgICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEIyRU5SICAgICAgVElNOEVOICAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjJFTlIgICAgICBVU0FSVDFFTiAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMkVOUiAgICAgIFNQSTRFTiAgICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEIyRU5SICAgICAgVElNMTVFTiAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjJFTlIgICAgICBUSU0xNkVOICAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMkVOUiAgICAgIFRJTTE3RU4gICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEIyRU5SICAgICAgVElNMTlFTiAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjJFTlIgICAgICBUSU0yMEVOICAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMkVOUiAgICAgIEhSVElNMUVOICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEIyRU5SICAgICAgU0RBREMxRU4gICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjJFTlIgICAgICBTREFEQzJFTiAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMkVOUiAgICAgIFNEQURDM0VOICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NZU0NGRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfQURDMSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTEgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TUEkxICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNOCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1BJNCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE5ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMjAgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9IUlRJTTEgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TREFEQzEgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TREFEQzIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TREFEQzMgKCopCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIENMRUFSX0JJVChSQ0MtPkFQQjJFTlIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEZvcmNlIEFQQjIgcGVyaXBoZXJhbHMgcmVzZXQuCisgICogQHJtdG9sbCBBUEIyUlNUUiAgICAgU1lTQ0ZHUlNUICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEIyUlNUUiAgICAgQURDMVJTVCAgICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEIyUlNUUiAgICAgVElNMVJTVCAgICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEIyUlNUUiAgICAgU1BJMVJTVCAgICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEIyUlNUUiAgICAgVElNOFJTVCAgICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEIyUlNUUiAgICAgVVNBUlQxUlNUICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEIyUlNUUiAgICAgU1BJNFJTVCAgICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEIyUlNUUiAgICAgVElNMTVSU1QgICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEIyUlNUUiAgICAgVElNMTZSU1QgICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEIyUlNUUiAgICAgVElNMTdSU1QgICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEIyUlNUUiAgICAgVElNMTlSU1QgICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEIyUlNUUiAgICAgVElNMjBSU1QgICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEIyUlNUUiAgICAgSFJUSU0xUlNUICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEIyUlNUUiAgICAgU0RBREMxUlNUICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEIyUlNUUiAgICAgU0RBREMyUlNUICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEIyUlNUUiAgICAgU0RBREMzUlNUICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX0FMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1lTQ0ZHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9BREMxICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTEgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU04ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVVNBUlQxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TUEk0ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTkgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0yMCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX0hSVElNMSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NEQURDMSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NEQURDMiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NEQURDMyAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0KHVpbnQzMl90IFBlcmlwaHMpCit7CisgIFNFVF9CSVQoUkNDLT5BUEIyUlNUUiwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVsZWFzZSBBUEIyIHBlcmlwaGVyYWxzIHJlc2V0LgorICAqIEBybXRvbGwgQVBCMlJTVFIgICAgIFNZU0NGR1JTVCAgICAgTExfQVBCMl9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBUEIyUlNUUiAgICAgQURDMVJTVCAgICAgICBMTF9BUEIyX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjJSU1RSICAgICBUSU0xUlNUICAgICAgIExMX0FQQjJfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMlJTVFIgICAgIFNQSTFSU1QgICAgICAgTExfQVBCMl9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBUEIyUlNUUiAgICAgVElNOFJTVCAgICAgICBMTF9BUEIyX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjJSU1RSICAgICBVU0FSVDFSU1QgICAgIExMX0FQQjJfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMlJTVFIgICAgIFNQSTRSU1QgICAgICAgTExfQVBCMl9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBUEIyUlNUUiAgICAgVElNMTVSU1QgICAgICBMTF9BUEIyX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjJSU1RSICAgICBUSU0xNlJTVCAgICAgIExMX0FQQjJfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMlJTVFIgICAgIFRJTTE3UlNUICAgICAgTExfQVBCMl9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBUEIyUlNUUiAgICAgVElNMTlSU1QgICAgICBMTF9BUEIyX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjJSU1RSICAgICBUSU0yMFJTVCAgICAgIExMX0FQQjJfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMlJTVFIgICAgIEhSVElNMVJTVCAgICAgTExfQVBCMl9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBUEIyUlNUUiAgICAgU0RBREMxUlNUICAgICBMTF9BUEIyX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjJSU1RSICAgICBTREFEQzJSU1QgICAgIExMX0FQQjJfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMlJTVFIgICAgIFNEQURDM1JTVCAgICAgTExfQVBCMl9HUlAxX1JlbGVhc2VSZXNldAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX0FMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1lTQ0ZHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9BREMxICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTEgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU04ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVVNBUlQxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TUEk0ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTkgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0yMCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX0hSVElNMSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NEQURDMSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NEQURDMiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NEQURDMyAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjJfR1JQMV9SZWxlYXNlUmVzZXQodWludDMyX3QgUGVyaXBocykKK3sKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMlJTVFIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBkZWZpbmVkKFJDQykgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJGM3h4X0xMX0JVU19IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2xsX2NvbXAuaCBiL0luYy9zdG0zMmYzeHhfbGxfY29tcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMzEyZTQKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2xsX2NvbXAuaApAQCAtMCwwICsxLDIyNzcgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfbGxfY29tcC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBDT01QIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0xMX0NPTVBfSAorI2RlZmluZSBfX1NUTTMyRjN4eF9MTF9DT01QX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qIE5vdGU6IERldmljZXMgb2YgU1RNMzJGMyBzZXJpZSBlbWJlZCAxIG91dCBvZiAyIGRpZmZlcmVudCBjb21wYXJhdG9yIElQLiAgICovCisvKiAgICAgICAtIFNUTTMyRjMweCwgU1RNMzJGMzF4LCBTVE0zMkYzMngsIFNUTTMyRjMzeCwgU1RNMzJGMzV4LCBTVE0zMkYzOXg6ICAqLworLyogICAgICAgICBDT01QIElQIGZyb20gMyB0byA3IGluc3RhbmNlcyBhbmQgb3RoZXIgc3BlY2lmaWMgZmVhdHVyZXMgICAgICAgICAgKi8KKy8qICAgICAgICAgKGNvbXBhcmF0b3Igb3V0cHV0IGJsYW5raW5nLCAuLi4pIChyZWZlciB0byByZWZlcmVuY2UgbWFudWFsKS4gICAgICovCisvKiAgICAgICAtIFNUTTMyRjM3eDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICBDT01QIElQIHdpdGggMiBpbnN0YW5jZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZHJpdmVycyBvZiB0aGVzZSBDT01QIElQLCBsb2NhdGVkIGluIDIgYXJlYSAgICAqLworLyogICAgICAgZGVsaW1pdGVkIGJ5IGNvbXBpbGF0aW9uIHN3aXRjaGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2lmIGRlZmluZWQoQ09NUF9WMV8zXzBfMCkKKworI2lmIGRlZmluZWQgKENPTVAxKSB8fCBkZWZpbmVkIChDT01QMikgfHwgZGVmaW5lZCAoQ09NUDMpIHx8IGRlZmluZWQgKENPTVA0KSB8fCBkZWZpbmVkIChDT01QNSkgfHwgZGVmaW5lZCAoQ09NUDYpIHx8IGRlZmluZWQgKENPTVA3KQorCisvKiogQGRlZmdyb3VwIENPTVBfTEwgQ09NUAorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9Qcml2YXRlX0NvbnN0YW50cyBDT01QIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyogQ09NUCByZWdpc3RlcnMgYml0cyBwb3NpdGlvbnMgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfTEVWRUxfQklUT0ZGU0VUX1BPUyAoKHVpbnQzMl90KTMwVSkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQ09NUHhPVVQpICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBDT01QX0xMX0VTX0lOSVQgQ09NUCBFeHBvcnRlZCBJbml0IHN0cnVjdHVyZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU3RydWN0dXJlIGRlZmluaXRpb24gb2Ygc29tZSBmZWF0dXJlcyBvZiBDT01QIGluc3RhbmNlLgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgUG93ZXJNb2RlOyAgICAgICAgICAgICAgICAgICAvKiE8IFNldCBjb21wYXJhdG9yIG9wZXJhdGluZyBtb2RlIHRvIGFkanVzdCBwb3dlciBhbmQgc3BlZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPTVBfTExfRUNfUE9XRVJNT0RFCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQ09NUF9TZXRQb3dlck1vZGUoKS4gKi8KKworICB1aW50MzJfdCBJbnB1dFBsdXM7ICAgICAgICAgICAgICAgICAgIC8qITwgU2V0IGNvbXBhcmF0b3IgaW5wdXQgcGx1cyAobm9uLWludmVydGluZyBpbnB1dCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPTVBfTExfRUNfSU5QVVRfUExVUworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0NPTVBfU2V0SW5wdXRQbHVzKCkuICovCisKKyAgdWludDMyX3QgSW5wdXRNaW51czsgICAgICAgICAgICAgICAgICAvKiE8IFNldCBjb21wYXJhdG9yIGlucHV0IG1pbnVzIChpbnZlcnRpbmcgaW5wdXQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QX0xMX0VDX0lOUFVUX01JTlVTCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQ09NUF9TZXRJbnB1dE1pbnVzKCkuICovCisKKyAgdWludDMyX3QgSW5wdXRIeXN0ZXJlc2lzOyAgICAgICAgICAgICAvKiE8IFNldCBjb21wYXJhdG9yIGh5c3RlcmVzaXMgbW9kZSBvZiB0aGUgaW5wdXQgbWludXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPTVBfTExfRUNfSU5QVVRfSFlTVEVSRVNJUworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0NPTVBfU2V0SW5wdXRIeXN0ZXJlc2lzKCkuICovCisKKyAgdWludDMyX3QgT3V0cHV0U2VsZWN0aW9uOyAgICAgICAgICAgICAvKiE8IFNldCBjb21wYXJhdG9yIG91dHB1dCBzZWxlY3Rpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPTVBfTExfRUNfT1VUUFVUX1NFTEVDVElPTgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0NPTVBfU2V0T3V0cHV0U2VsZWN0aW9uKCkuICovCisKKyAgdWludDMyX3QgT3V0cHV0UG9sYXJpdHk7ICAgICAgICAgICAgICAvKiE8IFNldCBjb21wYXJhdG9yIG91dHB1dCBwb2xhcml0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09NUF9MTF9FQ19PVVRQVVRfUE9MQVJJVFkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9DT01QX1NldE91dHB1dFBvbGFyaXR5KCkuICovCisKKyAgdWludDMyX3QgT3V0cHV0QmxhbmtpbmdTb3VyY2U7ICAgICAgICAvKiE8IFNldCBjb21wYXJhdG9yIGJsYW5raW5nIHNvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09NUF9MTF9FQ19PVVRQVVRfQkxBTktJTkdfU09VUkNFCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQ09NUF9TZXRPdXRwdXRCbGFua2luZ1NvdXJjZSgpLiAqLworCit9IExMX0NPTVBfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENPTVBfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIENPTVAgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0xMX0VDX0NPTU1PTl9XSU5ET1dNT0RFIENvbXBhcmF0b3IgY29tbW9uIG1vZGVzIC0gV2luZG93IG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9DT01QX1dJTkRPV01PREVfRElTQUJMRSAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBXaW5kb3cgbW9kZSBkaXNhYmxlOiBDb21wYXJhdG9ycyAxIGFuZCAyIGFyZSBpbmRlcGVuZGVudCAqLworI2lmIGRlZmluZWQoQ09NUDJfQ1NSX0NPTVAyV05EV0VOKQorI2RlZmluZSBMTF9DT01QX1dJTkRPV01PREVfQ09NUDFfSU5QVVRfUExVU19DT01NT04gKENPTVAyX0NTUl9DT01QMldORFdFTikgLyohPCBXaW5kb3cgbW9kZSBlbmFibGU6IENvbXBhcmF0b3JzIGluc3RhbmNlcyBwYWlyIENPTVAxIGFuZCBDT01QMiBoYXZlIHRoZWlyIGlucHV0IHBsdXMgY29ubmVjdGVkIHRvZ2V0aGVyLiBUaGUgY29tbW9uIGlucHV0IGlzIENPTVAxIGlucHV0IHBsdXMgKENPTVAyIGlucHV0IHBsdXMgaXMgbm8gbW9yZSBhY2Nlc3NpYmxlKS4gKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09NUDRfQ1NSX0NPTVA0V05EV0VOKQorI2RlZmluZSBMTF9DT01QX1dJTkRPV01PREVfQ09NUDNfSU5QVVRfUExVU19DT01NT04gKENPTVA0X0NTUl9DT01QNFdORFdFTikgLyohPCBXaW5kb3cgbW9kZSBlbmFibGU6IENvbXBhcmF0b3JzIGluc3RhbmNlcyBwYWlyIENPTVAzIGFuZCBDT01QNCBoYXZlIHRoZWlyIGlucHV0IHBsdXMgY29ubmVjdGVkIHRvZ2V0aGVyLiBUaGUgY29tbW9uIGlucHV0IGlzIENPTVAzIGlucHV0IHBsdXMgKENPTVA0IGlucHV0IHBsdXMgaXMgbm8gbW9yZSBhY2Nlc3NpYmxlKS4gKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09NUDZfQ1NSX0NPTVA2V05EV0VOKQorI2RlZmluZSBMTF9DT01QX1dJTkRPV01PREVfQ09NUDVfSU5QVVRfUExVU19DT01NT04gKENPTVA2X0NTUl9DT01QNldORFdFTikgLyohPCBXaW5kb3cgbW9kZSBlbmFibGU6IENvbXBhcmF0b3JzIGluc3RhbmNlcyBwYWlyIENPTVA1IGFuZCBDT01QNiBoYXZlIHRoZWlyIGlucHV0IHBsdXMgY29ubmVjdGVkIHRvZ2V0aGVyLiBUaGUgY29tbW9uIGlucHV0IGlzIENPTVA1IGlucHV0IHBsdXMgKENPTVA2IGlucHV0IHBsdXMgaXMgbm8gbW9yZSBhY2Nlc3NpYmxlKS4gKi8KKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0xMX0VDX1BPV0VSTU9ERSBDb21wYXJhdG9yIG1vZGVzIC0gUG93ZXIgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0NPTVBfUE9XRVJNT0RFX0hJR0hTUEVFRCAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ09NUCBwb3dlciBtb2RlIHRvIGhpZ2ggc3BlZWQgKi8KKyNpZiBkZWZpbmVkKENPTVBfQ1NSX0NPTVB4TU9ERSkKKyNkZWZpbmUgTExfQ09NUF9QT1dFUk1PREVfTUVESVVNU1BFRUQgICAoQ09NUF9DU1JfQ09NUHhNT0RFXzApICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIHBvd2VyIG1vZGUgdG8gbWVkaXVtIHNwZWVkICovCisjZGVmaW5lIExMX0NPTVBfUE9XRVJNT0RFX0xPV1BPV0VSICAgICAgKENPTVBfQ1NSX0NPTVB4TU9ERV8xKSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ09NUCBwb3dlciBtb2RlIHRvIGxvdyBwb3dlciAqLworI2RlZmluZSBMTF9DT01QX1BPV0VSTU9ERV9VTFRSQUxPV1BPV0VSIChDT01QX0NTUl9DT01QeE1PREVfMSB8IENPTVBfQ1NSX0NPTVB4TU9ERV8wKSAvKiE8IENPTVAgcG93ZXIgbW9kZSB0byB1bHRyYS1sb3cgcG93ZXIgKi8KKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0xMX0VDX0lOUFVUX1BMVVMgQ29tcGFyYXRvciBpbnB1dHMgLSBJbnB1dCBwbHVzIChpbnB1dCBub24taW52ZXJ0aW5nKSBzZWxlY3Rpb24KKyAgKiBAeworICAqLworI2lmICFkZWZpbmVkKENPTVBfQ1NSX0NPTVB4Tk9OSU5TRUwpCisjZGVmaW5lIExMX0NPTVBfSU5QVVRfUExVU19JTzEgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgIC8qITwgQ29tcGFyYXRvciBpbnB1dCBwbHVzIGNvbm5lY3RlZCB0byBJTzEgKHBpbiBQQTEgZm9yIENPTVAxLCBQQTMgZm9yIENPTVAyIChleGNlcHQgU1RNMzJGMzM0eHg6IFBBNyksIFBCMTQgZm9yIENPTVAzLCBQQjAgZm9yIENPTVA0LCBQRDEyIGZvciBDT01QNSwgUEQxMSBmb3IgQ09NUDYsIFBBMCAgZm9yIENPTVA3KSAoQ09NUCBpbnN0YW5jZSBhdmFpbGFiaWxpdHkgZGVwZW5kcyBvbiB0aGUgc2VsZWN0ZWQgZGV2aWNlKSAqLworI2RlZmluZSBMTF9DT01QX0lOUFVUX1BMVVNfSU8yICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAvKiE8IENvbXBhcmF0b3IgaW5wdXQgcGx1cyBjb25uZWN0ZWQgdG8gSU8yOiBTYW1lIGFzIElPMSAqLworI2Vsc2UKKyNkZWZpbmUgTExfQ09NUF9JTlBVVF9QTFVTX0lPMSAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgLyohPCBDb21wYXJhdG9yIGlucHV0IHBsdXMgY29ubmVjdGVkIHRvIElPMSAocGluIFBBNyBmb3IgQ09NUDIsIFBCMTQgZm9yIENPTVAzLCBQQjAgZm9yIENPTVA0LCBQRDEyIGZvciBDT01QNSwgUEQxMSBmb3IgQ09NUDYsIFBBMCAgZm9yIENPTVA3KSAoQ09NUCBpbnN0YW5jZSBhdmFpbGFiaWxpdHkgZGVwZW5kcyBvbiB0aGUgc2VsZWN0ZWQgZGV2aWNlKSAqLworI2RlZmluZSBMTF9DT01QX0lOUFVUX1BMVVNfSU8yICAgICAgICAgIChDT01QX0NTUl9DT01QeE5PTklOU0VMKSAvKiE8IENvbXBhcmF0b3IgaW5wdXQgcGx1cyBjb25uZWN0ZWQgdG8gSU8yIChwaW4gUEEzIGZvciBDT01QMiwgUEQxNCBmb3IgQ09NUDMsIFBFNyBmb3IgQ09NUDQsIFBCMTMgZm9yIENPTVA1LCBQQjExIGZvciBDT01QNiwgUEMxIGZvciBDT01QNykgKENPTVAgaW5zdGFuY2UgYXZhaWxhYmlsaXR5IGRlcGVuZHMgb24gdGhlIHNlbGVjdGVkIGRldmljZSkgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisjZGVmaW5lIExMX0NPTVBfSU5QVVRfUExVU19EQUMxX0NIMV9DT01QMSAoQ09NUF9DU1JfQ09NUHhTVzEpICAgIC8qITwgQ29tcGFyYXRvciBpbnB1dCBwbHVzIGNvbm5lY3RlZCB0byBEQUMxIGNoYW5uZWwgMSAoREFDX09VVDEpLCB0aHJvdWdoIGRlZGljYXRlZCBzd2l0Y2ggKE5vdGU6IHRoaXMgc3dpdGNoIGlzIHNvbGVseSBpbnRlbmRlZCB0byByZWRpcmVjdCBzaWduYWxzIG9udG8gaGlnaCBpbXBlZGFuY2UgaW5wdXQsIHN1Y2ggYXMgQ09NUDEgaW5wdXQgcGx1cyAoaGlnaGx5IHJlc2lzdGl2ZSBzd2l0Y2gpKSAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDEpICovCisKKy8qIE5vdGU6IENvbXBhcmF0b3IgaW5wdXQgcGx1cyBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoICAgICAgICovCisvKiAgICAgICBnZW5lcmljIG5hbWluZyBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAgICAqLworLyogICAgICAgUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gICAgKi8KKyNkZWZpbmUgTExfQ09NUF9JTlBVVF9QTFVTX0RBQzFfQ0gxICAgICBMTF9DT01QX0lOUFVUX1BMVVNfREFDMV9DSDFfQ09NUDEgICAgICAvKiE8IENvbXBhcmF0b3IgaW5wdXQgcGx1cyBjb25uZWN0ZWQgdG8gREFDMSBjaGFubmVsIDEgKERBQ19PVVQxKSwgdGhyb3VnaCBkZWRpY2F0ZWQgc3dpdGNoLiBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKworI2VsaWYgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkKKyNkZWZpbmUgTExfQ09NUF9JTlBVVF9QTFVTX0RBQzFfQ0gxX0NPTVAyIChDT01QX0NTUl9DT01QeFNXMSkgICAgLyohPCBDb21wYXJhdG9yIGlucHV0IHBsdXMgY29ubmVjdGVkIHRvIERBQzEgY2hhbm5lbCAxIChEQUNfT1VUMSksIHRocm91Z2ggZGVkaWNhdGVkIHN3aXRjaCAoTm90ZTogdGhpcyBzd2l0Y2ggaXMgc29sZWx5IGludGVuZGVkIHRvIHJlZGlyZWN0IHNpZ25hbHMgb250byBoaWdoIGltcGVkYW5jZSBpbnB1dCwgc3VjaCBhcyBDT01QMiBpbnB1dCBwbHVzIChoaWdobHkgcmVzaXN0aXZlIHN3aXRjaCkpIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QMikgKi8KKworLyogTm90ZTogQ29tcGFyYXRvciBpbnB1dCBwbHVzIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggICAgICAgKi8KKy8qICAgICAgIGdlbmVyaWMgbmFtaW5nIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICAgICovCisvKiAgICAgICBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAgICAqLworI2RlZmluZSBMTF9DT01QX0lOUFVUX1BMVVNfREFDMV9DSDEgICAgIExMX0NPTVBfSU5QVVRfUExVU19EQUMxX0NIMV9DT01QMiAgICAgIC8qITwgQ29tcGFyYXRvciBpbnB1dCBwbHVzIGNvbm5lY3RlZCB0byBEQUMxIGNoYW5uZWwgMSAoREFDX09VVDEpLCB0aHJvdWdoIGRlZGljYXRlZCBzd2l0Y2guIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FQ19JTlBVVF9NSU5VUyBDb21wYXJhdG9yIGlucHV0cyAtIElucHV0IG1pbnVzIChpbnB1dCBpbnZlcnRpbmcpIHNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0NPTVBfSU5QVVRfTUlOVVNfMV80VlJFRklOVCAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbXBhcmF0b3IgaW5wdXQgbWludXMgY29ubmVjdGVkIHRvIDEvNCBWcmVmSW50ICAqLworI2RlZmluZSBMTF9DT01QX0lOUFVUX01JTlVTXzFfMlZSRUZJTlQgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBfQ1NSX0NPTVB4SU5TRUxfMCkgLyohPCBDb21wYXJhdG9yIGlucHV0IG1pbnVzIGNvbm5lY3RlZCB0byAxLzIgVnJlZkludCAgKi8KKyNkZWZpbmUgTExfQ09NUF9JTlBVVF9NSU5VU18zXzRWUkVGSU5UICAoICAgICAgICAgICAgICAgICAgICAgICBDT01QX0NTUl9DT01QeElOU0VMXzEgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgQ29tcGFyYXRvciBpbnB1dCBtaW51cyBjb25uZWN0ZWQgdG8gMy80IFZyZWZJbnQgICovCisjZGVmaW5lIExMX0NPTVBfSU5QVVRfTUlOVVNfVlJFRklOVCAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgQ09NUF9DU1JfQ09NUHhJTlNFTF8xIHwgQ09NUF9DU1JfQ09NUHhJTlNFTF8wKSAvKiE8IENvbXBhcmF0b3IgaW5wdXQgbWludXMgY29ubmVjdGVkIHRvIFZyZWZJbnQgKi8KKyNkZWZpbmUgTExfQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMSAgICAoQ09NUF9DU1JfQ09NUHhJTlNFTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgQ29tcGFyYXRvciBpbnB1dCBtaW51cyBjb25uZWN0ZWQgdG8gREFDMSBjaGFubmVsIDEgKERBQ19PVVQxKSAgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwMnhFKQorLyogVGhpcyBkZXZpY2UgaGFzIG5vIGNvbXBhcmF0b3IgaW5wdXQgbWludXMgREFDMV9DSDIgKi8KKyNlbHNlCisjZGVmaW5lIExMX0NPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDIgICAgKENPTVBfQ1NSX0NPTVB4SU5TRUxfMiAgICAgICAgICAgICAgICAgICAgICAgIHwgQ09NUF9DU1JfQ09NUHhJTlNFTF8wKSAvKiE8IENvbXBhcmF0b3IgaW5wdXQgbWludXMgY29ubmVjdGVkIHRvIERBQzEgY2hhbm5lbCAyIChEQUNfT1VUMikgICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KQorI2RlZmluZSBMTF9DT01QX0lOUFVUX01JTlVTX0lPMSAgICAgICAgIChDT01QX0NTUl9DT01QeElOU0VMXzIgfCBDT01QX0NTUl9DT01QeElOU0VMXzEgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgQ29tcGFyYXRvciBpbnB1dCBtaW51cyBjb25uZWN0ZWQgdG8gSU8xIChwaW4gUEEyIGZvciBDT01QMikgKi8KKyNlbHNlCisjZGVmaW5lIExMX0NPTVBfSU5QVVRfTUlOVVNfSU8xICAgICAgICAgKENPTVBfQ1NSX0NPTVB4SU5TRUxfMiB8IENPTVBfQ1NSX0NPTVB4SU5TRUxfMSAgICAgICAgICAgICAgICAgICAgICAgICkgLyohPCBDb21wYXJhdG9yIGlucHV0IG1pbnVzIGNvbm5lY3RlZCB0byBJTzEgKHBpbiBQQTAgZm9yIENPTVAxLCBwaW4gUEEyIGZvciBDT01QMiwgUEQxNSBmb3IgQ09NUDMsIFBFOCBmb3IgQ09NUDQsIFBEMTMgZm9yIENPTVA1LCBQRDEwIGZvciBDT01QNiwgUEMwIGZvciBDT01QNyAoQ09NUCBpbnN0YW5jZSBhdmFpbGFiaWxpdHkgZGVwZW5kcyBvbiB0aGUgc2VsZWN0ZWQgZGV2aWNlKSkgKi8KKyNlbmRpZgorI2RlZmluZSBMTF9DT01QX0lOUFVUX01JTlVTX0lPMiAgICAgICAgIChDT01QX0NTUl9DT01QeElOU0VMXzIgfCBDT01QX0NTUl9DT01QeElOU0VMXzEgfCBDT01QX0NTUl9DT01QeElOU0VMXzApIC8qITwgQ29tcGFyYXRvciBpbnB1dCBtaW51cyBjb25uZWN0ZWQgdG8gSU8yIChQQjEyIGZvciBDT01QMywgUEIyIGZvciBDT01QNCwgUEIxMCBmb3IgQ09NUDUsIFBCMTUgZm9yIENPTVA2IChDT01QIGluc3RhbmNlIGF2YWlsYWJpbGl0eSBkZXBlbmRzIG9uIHRoZSBzZWxlY3RlZCBkZXZpY2UpKSAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpCisvKiBUaGlzIGRldmljZSBoYXMgbm8gY29tcGFyYXRvciBpbnB1dCBtaW51cyBJTzMgKi8KKyNlbHNlCisjZGVmaW5lIExMX0NPTVBfSU5QVVRfTUlOVVNfSU8zICAgICAgICAgKENPTVBfQ1NSX0NPTVB4SU5TRUxfMiAgICAgICAgICAgICAgICAgICAgICAgICB8IENPTVBfQ1NSX0NPTVB4SU5TRUxfMCkgLyohPCBDb21wYXJhdG9yIGlucHV0IG1pbnVzIGNvbm5lY3RlZCB0byBJTzMgKHBpbiBQQTUgZm9yIENPTVAxLzIvMy80LzUvNi83IChDT01QIGluc3RhbmNlIGF2YWlsYWJpbGl0eSBkZXBlbmRzIG9uIHRoZSBzZWxlY3RlZCBkZXZpY2UpKSAqLworI2VuZGlmCisjZGVmaW5lIExMX0NPTVBfSU5QVVRfTUlOVVNfSU80ICAgICAgICAgKENPTVBfQ1NSX0NPTVB4SU5TRUxfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgLyohPCBDb21wYXJhdG9yIGlucHV0IG1pbnVzIGNvbm5lY3RlZCB0byBJTzQgKHBpbiBQQTQgZm9yIENPTVAxLzIvMy80LzUvNi83IChDT01QIGluc3RhbmNlIGF2YWlsYWJpbGl0eSBkZXBlbmRzIG9uIHRoZSBzZWxlY3RlZCBkZXZpY2UpKSAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpCisjZGVmaW5lIExMX0NPTVBfSU5QVVRfTUlOVVNfREFDMl9DSDEgICAgKENPTVBfQ1NSX0NPTVB4SU5TRUxfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgLyohPCBDb21wYXJhdG9yIGlucHV0IG1pbnVzIGNvbm5lY3RlZCB0byBEQUMyIGNoYW5uZWwgMSAoREFDMl9PVVQxKSAgKi8KKyNlbHNlCisvKiBUaGlzIGRldmljZSBoYXMgbm8gY29tcGFyYXRvciBpbnB1dCBtaW51cyBEQUMyX0NIMSAqLworI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfTExfRUNfSU5QVVRfSFlTVEVSRVNJUyBDb21wYXJhdG9yIGlucHV0IC0gSHlzdGVyZXNpcworICAqIEB7CisgICovCisjZGVmaW5lIExMX0NPTVBfSFlTVEVSRVNJU19OT05FICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTm8gaHlzdGVyZXNpcyAqLworI2lmIGRlZmluZWQoQ09NUF9DU1JfQ09NUHhIWVNUKQorI2RlZmluZSBMTF9DT01QX0hZU1RFUkVTSVNfTE9XICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgIENPTVBfQ1NSX0NPTVB4SFlTVF8wKSAvKiE8IEh5c3RlcmVzaXMgbGV2ZWwgbG93IChhdmFpbGFibGUgb25seSBvbiBkZXZpY2VzOiBTVE0zMkYzMDN4Qi9DLCBTVE0zMkYzNTh4QykgKi8KKyNkZWZpbmUgTExfQ09NUF9IWVNURVJFU0lTX01FRElVTSAgICAgICAoQ09NUF9DU1JfQ09NUHhIWVNUXzEgICAgICAgICAgICAgICAgICAgICAgICkgLyohPCBIeXN0ZXJlc2lzIGxldmVsIG1lZGl1bSAoYXZhaWxhYmxlIG9ubHkgb24gZGV2aWNlczogU1RNMzJGMzAzeEIvQywgU1RNMzJGMzU4eEMpICovCisjZGVmaW5lIExMX0NPTVBfSFlTVEVSRVNJU19ISUdIICAgICAgICAgKENPTVBfQ1NSX0NPTVB4SFlTVF8xIHwgQ09NUF9DU1JfQ09NUHhIWVNUXzApIC8qITwgSHlzdGVyZXNpcyBsZXZlbCBoaWdoIChhdmFpbGFibGUgb25seSBvbiBkZXZpY2VzOiBTVE0zMkYzMDN4Qi9DLCBTVE0zMkYzNTh4QykgKi8KKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0xMX0VDX09VVFBVVF9TRUxFQ1RJT04gQ29tcGFyYXRvciBvdXRwdXQgLSBPdXRwdXQgc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfTk9ORSAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIG91dHB1dCBpcyBub3QgY29ubmVjdGVkIHRvIG90aGVyIHBlcmlwaGVyYWxzIChleGNlcHQgR1BJTyBhbmQgRVhUSSB0aGF0IGFyZSBhbHdheXMgY29ubmVjdGVkIHRvIENPTVAgb3V0cHV0KSAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDIpICovCisjaWYgZGVmaW5lZChDT01QX0NTUl9DT01QeE9VVCkKKy8qIE5vdGU6IE91dHB1dCByZWRpcmVjdGlvbiBjb21tb24gdG8gYWxsIENPTVAgaW5zdGFuY2VzLCBhbGwgU1RNMzJGMyBzZXJpZSAgICovCisvKiAgICAgICBkZXZpY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0xX0JLSU4gICAgICAgIChDT01QX0NTUl9DT01QeE9VVFNFTF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xIGJyZWFrIGlucHV0IChCS0lOKSAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0xX0JLSU4yICAgICAgIChDT01QX0NTUl9DT01QeE9VVFNFTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xIGJyZWFrIGlucHV0IDIgKEJLSU4yKSAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKy8qIE5vdGU6IE91dHB1dCByZWRpcmVjdGlvbiBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QMiAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0xX0lDMV9DT01QMiAgICAoQ09NUF9DU1JfQ09NUHhPVVRTRUxfMiB8IENPTVBfQ1NSX0NPTVB4T1VUU0VMXzEgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8wKSAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xIGlucHV0IGNhcHR1cmUgMSAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDIpICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTJfSUM0X0NPTVAyICAgIChDT01QX0NTUl9DT01QeE9VVFNFTF8zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTEgaW5wdXQgY2FwdHVyZSA0IChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QMikgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMV9PQ0NMUl9DT01QMiAgKENPTVBfQ1NSX0NPTVB4T1VUU0VMXzIgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMSBPQ1JFRiBjbGVhciAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDIpICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTJfT0NDTFJfQ09NUDIgIChDT01QX0NTUl9DT01QeE9VVFNFTF8zIHwgQ09NUF9DU1JfQ09NUHhPVVRTRUxfMCkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTIgT0NSRUYgY2xlYXIgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVAyKSAqLworLyogTm90ZTogT3V0cHV0IHJlZGlyZWN0aW9uIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVA0ICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTE1X0lDMl9DT01QNCAgIChDT01QX0NTUl9DT01QeE9VVFNFTF8zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTE1IGlucHV0IGNhcHR1cmUgMSAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDQpICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTE1X09DQ0xSX0NPTVA0IChDT01QX0NTUl9DT01QeE9VVFNFTF8zIHwgQ09NUF9DU1JfQ09NUHhPVVRTRUxfMSkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTE1IE9DUkVGIGNsZWFyIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QNCkgKi8KKy8qIE5vdGU6IE91dHB1dCByZWRpcmVjdGlvbiBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QNiAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0yX0lDMl9DT01QNiAgICAoQ09NUF9DU1JfQ09NUHhPVVRTRUxfMiB8IENPTVBfQ1NSX0NPTVB4T1VUU0VMXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0yIGlucHV0IGNhcHR1cmUgMiAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDYpICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTJfT0NDTFJfQ09NUDYgIChDT01QX0NTUl9DT01QeE9VVFNFTF8zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTIgT0NSRUYgY2xlYXIgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVA2KSAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0xNl9JQzFfQ09NUDYgICAoQ09NUF9DU1JfQ09NUHhPVVRTRUxfMyB8IENPTVBfQ1NSX0NPTVB4T1VUU0VMXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNiBpbnB1dCBjYXB0dXJlIDEgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVA2KSAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0xNl9PQ0NMUl9DT01QNiAoQ09NUF9DU1JfQ09NUHhPVVRTRUxfMyB8IENPTVBfQ1NSX0NPTVB4T1VUU0VMXzApICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNiBPQ1JFRiBjbGVhciAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDYpICovCisKKy8qIE5vdGU6IE91dHB1dCByZWRpcmVjdGlvbiBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoICAgICAgICAgICovCisvKiAgICAgICBnZW5lcmljIG5hbWluZyBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAgICAqLworLyogICAgICAgUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gICAgKi8KKy8qIE5vdGU6IFNvbWUgb3V0cHV0IHJlZGlyZWN0aW9ucyBjYW5ub3QgaGF2ZSBhIGdlbmVyaWMgbmFtaW5nLCAgICAgICAgICAgICAgICovCisvKiAgICAgICBkdWUgdG8gbGl0ZXJhbCB2YWx1ZSBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIENPTVAgaW5zdGFuY2UuICAgICAgICAgICAqLworLyogICAgICAgKEZvciBleGVtcGxlOiBMTF9DT01QX09VVFBVVF9USU0yX09DQ0xSX0NPTVAyIGFuZCAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIExMX0NPTVBfT1VUUFVUX1RJTTJfT0NDTFJfQ09NUDYpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTFfSUMxICAgICAgICAgIExMX0NPTVBfT1VUUFVUX1RJTTFfSUMxX0NPTVAyICAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMSBpbnB1dCBjYXB0dXJlIDEuICAgICBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMV9PQ0NMUiAgICAgICAgTExfQ09NUF9PVVRQVVRfVElNMV9PQ0NMUl9DT01QMiAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xIE9DUkVGIGNsZWFyLiAgICAgICAgIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0yX0lDMiAgICAgICAgICBMTF9DT01QX09VVFBVVF9USU0yX0lDMl9DT01QNiAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTIgaW5wdXQgY2FwdHVyZSAyLiAgICAgQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTJfSUM0ICAgICAgICAgIExMX0NPTVBfT1VUUFVUX1RJTTJfSUM0X0NPTVAyICAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMiBpbnB1dCBjYXB0dXJlIDQuICAgICBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMTVfSUMyICAgICAgICAgTExfQ09NUF9PVVRQVVRfVElNMTVfSUMyX0NPTVA0ICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNSBpbnB1dCBjYXB0dXJlIDEuICAgIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0xNV9PQ0NMUiAgICAgICBMTF9DT01QX09VVFBVVF9USU0xNV9PQ0NMUl9DT01QNCAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTE1IE9DUkVGIGNsZWFyLiAgICAgICAgQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTE2X0lDMSAgICAgICAgIExMX0NPTVBfT1VUUFVUX1RJTTE2X0lDMV9DT01QNiAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMTYgaW5wdXQgY2FwdHVyZSAxLiAgICBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMTZfT0NDTFIgICAgICAgTExfQ09NUF9PVVRQVVRfVElNMTZfT0NDTFJfQ09NUDYgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNiBPQ1JFRiBjbGVhci4gICAgICAgIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworLyogTm90ZTogT3V0cHV0IHJlZGlyZWN0aW9uIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggICAgICAgICAgKi8KKy8qICAgICAgIHBhcnRpYWxseSBnZW5lcmljIG5hbWluZyBncm91cGluZyBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAgICAgICAgICovCisvKiAgICAgICBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAgICAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0yX09DQ0xSX0NPTVAxXzJfMyAgTExfQ09NUF9PVVRQVVRfVElNMl9PQ0NMUl9DT01QMiAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTIgT0NSRUYgY2xlYXIuICAgICAgICAgQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisKKyNlbGlmIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkKKy8qIE5vdGU6IE91dHB1dCByZWRpcmVjdGlvbiBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QMiwgQ09NUDQgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNM19PQ0NMUl9DT01QMl80IChDT01QX0NTUl9DT01QeE9VVFNFTF8zIHwgQ09NUF9DU1JfQ09NUHhPVVRTRUxfMSB8IENPTVBfQ1NSX0NPTVB4T1VUU0VMXzApIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTMgT0NSRUYgY2xlYXIgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVAyLCBDT01QNCkgKi8KKy8qIE5vdGU6IE91dHB1dCByZWRpcmVjdGlvbiBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QMiAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0xX0lDMV9DT01QMiAgICAoQ09NUF9DU1JfQ09NUHhPVVRTRUxfMiB8IENPTVBfQ1NSX0NPTVB4T1VUU0VMXzEgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8wKSAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xIGlucHV0IGNhcHR1cmUgMSAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDIpICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTJfSUM0X0NPTVAyICAgIChDT01QX0NTUl9DT01QeE9VVFNFTF8zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTEgaW5wdXQgY2FwdHVyZSA0IChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QMikgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMV9PQ0NMUl9DT01QMiAgKENPTVBfQ1NSX0NPTVB4T1VUU0VMXzIgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMSBPQ1JFRiBjbGVhciAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDIpICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTJfT0NDTFJfQ09NUDIgIChDT01QX0NTUl9DT01QeE9VVFNFTF8zIHwgQ09NUF9DU1JfQ09NUHhPVVRTRUxfMCkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTIgT0NSRUYgY2xlYXIgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVAyKSAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0zX0lDMV9DT01QMiAgICAoQ09NUF9DU1JfQ09NUHhPVVRTRUxfMyB8IENPTVBfQ1NSX0NPTVB4T1VUU0VMXzEgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8wKSAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0zIGlucHV0IGNhcHR1cmUgMSAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDIpICovCisvKiBOb3RlOiBPdXRwdXQgcmVkaXJlY3Rpb24gc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDQgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNM19JQzNfQ09NUDQgICAgKENPTVBfQ1NSX0NPTVB4T1VUU0VMXzIgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMyBpbnB1dCBjYXB0dXJlIDMgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVA0KSAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0xNV9JQzJfQ09NUDQgICAoQ09NUF9DU1JfQ09NUHhPVVRTRUxfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNSBpbnB1dCBjYXB0dXJlIDEgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVA0KSAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0xNV9PQ0NMUl9DT01QNCAoQ09NUF9DU1JfQ09NUHhPVVRTRUxfMyB8IENPTVBfQ1NSX0NPTVB4T1VUU0VMXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNSBPQ1JFRiBjbGVhciAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDQpICovCisvKiBOb3RlOiBPdXRwdXQgcmVkaXJlY3Rpb24gc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDYgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMl9JQzJfQ09NUDYgICAgKENPTVBfQ1NSX0NPTVB4T1VUU0VMXzIgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMiBpbnB1dCBjYXB0dXJlIDIgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVA2KSAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0yX09DQ0xSX0NPTVA2ICAoQ09NUF9DU1JfQ09NUHhPVVRTRUxfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0yIE9DUkVGIGNsZWFyIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QNikgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMTZfSUMxX0NPTVA2ICAgKENPTVBfQ1NSX0NPTVB4T1VUU0VMXzMgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMTYgaW5wdXQgY2FwdHVyZSAxIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QNikgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMTZfT0NDTFJfQ09NUDYgKENPTVBfQ1NSX0NPTVB4T1VUU0VMXzMgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMTYgT0NSRUYgY2xlYXIgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVA2KSAqLworCisvKiBOb3RlOiBPdXRwdXQgcmVkaXJlY3Rpb24gc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCAgICAgICAgICAqLworLyogICAgICAgZ2VuZXJpYyBuYW1pbmcgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gICAgKi8KKy8qICAgICAgIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICAgICovCisvKiBOb3RlOiBTb21lIG91dHB1dCByZWRpcmVjdGlvbnMgY2Fubm90IGhhdmUgYSBnZW5lcmljIG5hbWluZywgICAgICAgICAgICAgICAqLworLyogICAgICAgZHVlIHRvIGxpdGVyYWwgdmFsdWUgZGlmZmVyZW50IGRlcGVuZGluZyBvbiBDT01QIGluc3RhbmNlLiAgICAgICAgICAgKi8KKy8qICAgICAgIChGb3IgZXhlbXBsZTogTExfQ09NUF9PVVRQVVRfVElNMl9PQ0NMUl9DT01QMiBhbmQgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBMTF9DT01QX09VVFBVVF9USU0yX09DQ0xSX0NPTVA2KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0xX0lDMSAgICAgICAgICBMTF9DT01QX09VVFBVVF9USU0xX0lDMV9DT01QMiAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTEgaW5wdXQgY2FwdHVyZSAxLiAgICAgQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTFfT0NDTFIgICAgICAgIExMX0NPTVBfT1VUUFVUX1RJTTFfT0NDTFJfQ09NUDIgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMSBPQ1JFRiBjbGVhci4gICAgICAgICBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMl9JQzIgICAgICAgICAgTExfQ09NUF9PVVRQVVRfVElNMl9JQzJfQ09NUDYgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0yIGlucHV0IGNhcHR1cmUgMi4gICAgIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0yX0lDNCAgICAgICAgICBMTF9DT01QX09VVFBVVF9USU0yX0lDNF9DT01QMiAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTIgaW5wdXQgY2FwdHVyZSA0LiAgICAgQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTNfSUMxICAgICAgICAgIExMX0NPTVBfT1VUUFVUX1RJTTNfSUMxX0NPTVAyICAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMyBpbnB1dCBjYXB0dXJlIDEuICAgICBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNM19JQzMgICAgICAgICAgTExfQ09NUF9PVVRQVVRfVElNM19JQzNfQ09NUDQgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0zIGlucHV0IGNhcHR1cmUgMy4gICAgIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0zX09DQ0xSICAgICAgICBMTF9DT01QX09VVFBVVF9USU0zX09DQ0xSX0NPTVAyXzQgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTMgT0NSRUYgY2xlYXIuICAgICAgICAgQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTE1X0lDMiAgICAgICAgIExMX0NPTVBfT1VUUFVUX1RJTTE1X0lDMl9DT01QNCAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMTUgaW5wdXQgY2FwdHVyZSAxLiAgICBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMTVfT0NDTFIgICAgICAgTExfQ09NUF9PVVRQVVRfVElNMTVfT0NDTFJfQ09NUDQgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNSBPQ1JFRiBjbGVhci4gICAgICAgIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0xNl9JQzEgICAgICAgICBMTF9DT01QX09VVFBVVF9USU0xNl9JQzFfQ09NUDYgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTE2IGlucHV0IGNhcHR1cmUgMS4gICAgQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTE2X09DQ0xSICAgICAgIExMX0NPTVBfT1VUUFVUX1RJTTE2X09DQ0xSX0NPTVA2ICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMTYgT0NSRUYgY2xlYXIuICAgICAgICBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKy8qIE5vdGU6IE91dHB1dCByZWRpcmVjdGlvbiBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoICAgICAgICAgICovCisvKiAgICAgICBwYXJ0aWFsbHkgZ2VuZXJpYyBuYW1pbmcgZ3JvdXBpbmcgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gICAgICAgICAqLworLyogICAgICAgUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gICAgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMl9PQ0NMUl9DT01QMV8yXzMgIExMX0NPTVBfT1VUUFVUX1RJTTJfT0NDTFJfQ09NUDIgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0yIE9DUkVGIGNsZWFyLiAgICAgICAgIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworCisjZWxpZiBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwMnhFKQorLyogTm90ZTogT3V0cHV0IHJlZGlyZWN0aW9uIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVAxLCBDT01QMiwgQ09NUDQgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNM19PQ0NMUl9DT01QMV8yXzQgKENPTVBfQ1NSX0NPTVB4T1VUU0VMXzMgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8xIHwgQ09NUF9DU1JfQ09NUHhPVVRTRUxfMCkgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMyBPQ1JFRiBjbGVhciAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDIsIENPTVA0KSAqLworLyogTm90ZTogT3V0cHV0IHJlZGlyZWN0aW9uIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVAxLCBDT01QMiAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0xX0lDMV9DT01QMV8yICAgIChDT01QX0NTUl9DT01QeE9VVFNFTF8yIHwgQ09NUF9DU1JfQ09NUHhPVVRTRUxfMSB8IENPTVBfQ1NSX0NPTVB4T1VUU0VMXzApIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTEgaW5wdXQgY2FwdHVyZSAxIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QMikgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMl9JQzRfQ09NUDFfMiAgICAoQ09NUF9DU1JfQ09NUHhPVVRTRUxfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0yIGlucHV0IGNhcHR1cmUgNCAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDIpICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTFfT0NDTFJfQ09NUDFfMiAgKENPTVBfQ1NSX0NPTVB4T1VUU0VMXzIgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMSBPQ1JFRiBjbGVhciAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDIpICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTJfT0NDTFJfQ09NUDFfMiAgKENPTVBfQ1NSX0NPTVB4T1VUU0VMXzMgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMiBPQ1JFRiBjbGVhciAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDIpICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTNfSUMxX0NPTVAxXzIgICAgKENPTVBfQ1NSX0NPTVB4T1VUU0VMXzMgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8xIHwgQ09NUF9DU1JfQ09NUHhPVVRTRUxfMCkgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMyBpbnB1dCBjYXB0dXJlIDEgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVAyKSAqLworLyogTm90ZTogT3V0cHV0IHJlZGlyZWN0aW9uIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVA0ICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTNfSUMzX0NPTVA0ICAgICAgKENPTVBfQ1NSX0NPTVB4T1VUU0VMXzIgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMyBpbnB1dCBjYXB0dXJlIDMgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVA0KSAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU00X0lDMl9DT01QNCAgICAgIChDT01QX0NTUl9DT01QeE9VVFNFTF8zIHwgQ09NUF9DU1JfQ09NUHhPVVRTRUxfMCkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTQgaW5wdXQgY2FwdHVyZSAyIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QNCkgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMTVfSUMyX0NPTVA0ICAgICAoQ09NUF9DU1JfQ09NUHhPVVRTRUxfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNSBpbnB1dCBjYXB0dXJlIDEgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVA0KSAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0xNV9PQ0NMUl9DT01QNCAgIChDT01QX0NTUl9DT01QeE9VVFNFTF8zIHwgQ09NUF9DU1JfQ09NUHhPVVRTRUxfMSkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTE1IE9DUkVGIGNsZWFyIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QNCkgKi8KKy8qIE5vdGU6IE91dHB1dCByZWRpcmVjdGlvbiBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QNiAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0yX0lDMl9DT01QNiAgICAgIChDT01QX0NTUl9DT01QeE9VVFNFTF8yIHwgQ09NUF9DU1JfQ09NUHhPVVRTRUxfMSkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTIgaW5wdXQgY2FwdHVyZSAyIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QNikgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMl9PQ0NMUl9DT01QNiAgICAoQ09NUF9DU1JfQ09NUHhPVVRTRUxfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0yIE9DUkVGIGNsZWFyIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QNikgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNNF9JQzRfQ09NUDYgICAgICAoQ09NUF9DU1JfQ09NUHhPVVRTRUxfMyB8IENPTVBfQ1NSX0NPTVB4T1VUU0VMXzEgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8wKSAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU00IGlucHV0IGNhcHR1cmUgNCAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDYpICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTE2X0lDMV9DT01QNiAgICAgKENPTVBfQ1NSX0NPTVB4T1VUU0VMXzMgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMTYgaW5wdXQgY2FwdHVyZSAxIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QNikgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMTZfT0NDTFJfQ09NUDYgICAoQ09NUF9DU1JfQ09NUHhPVVRTRUxfMyB8IENPTVBfQ1NSX0NPTVB4T1VUU0VMXzEgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8wKSAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNiBPQ1JFRiBjbGVhciAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDYpICovCisKKy8qIE5vdGU6IE91dHB1dCByZWRpcmVjdGlvbiBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoICAgICAgICAgICovCisvKiAgICAgICBnZW5lcmljIG5hbWluZyBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAgICAqLworLyogICAgICAgUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gICAgKi8KKy8qIE5vdGU6IFNvbWUgb3V0cHV0IHJlZGlyZWN0aW9ucyBjYW5ub3QgaGF2ZSBhIGdlbmVyaWMgbmFtaW5nLCAgICAgICAgICAgICAgICovCisvKiAgICAgICBkdWUgdG8gbGl0ZXJhbCB2YWx1ZSBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIENPTVAgaW5zdGFuY2UuICAgICAgICAgICAqLworLyogICAgICAgKEZvciBleGVtcGxlOiBMTF9DT01QX09VVFBVVF9USU0yX09DQ0xSX0NPTVAxXzIgYW5kICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIExMX0NPTVBfT1VUUFVUX1RJTTJfT0NDTFJfQ09NUDYpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTFfSUMxICAgICAgICAgIExMX0NPTVBfT1VUUFVUX1RJTTFfSUMxX0NPTVAxXzIgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMSBpbnB1dCBjYXB0dXJlIDEuICAgICBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMV9PQ0NMUiAgICAgICAgTExfQ09NUF9PVVRQVVRfVElNMV9PQ0NMUl9DT01QMV8yICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xIE9DUkVGIGNsZWFyLiAgICAgICAgIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0yX0lDMiAgICAgICAgICBMTF9DT01QX09VVFBVVF9USU0yX0lDMl9DT01QNiAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTIgaW5wdXQgY2FwdHVyZSAyLiAgICAgQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTJfSUM0ICAgICAgICAgIExMX0NPTVBfT1VUUFVUX1RJTTJfSUM0X0NPTVAxXzIgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMiBpbnB1dCBjYXB0dXJlIDQuICAgICBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNM19JQzEgICAgICAgICAgTExfQ09NUF9PVVRQVVRfVElNM19JQzFfQ09NUDFfMiAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0zIGlucHV0IGNhcHR1cmUgMS4gICAgIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0zX0lDMyAgICAgICAgICBMTF9DT01QX09VVFBVVF9USU0zX0lDM19DT01QNCAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTMgaW5wdXQgY2FwdHVyZSAzLiAgICAgQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTNfT0NDTFIgICAgICAgIExMX0NPTVBfT1VUUFVUX1RJTTNfT0NDTFJfQ09NUDFfMl80ICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMyBPQ1JFRiBjbGVhci4gICAgICAgICBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNNF9JQzIgICAgICAgICAgTExfQ09NUF9PVVRQVVRfVElNNF9JQzJfQ09NUDQgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU00IGlucHV0IGNhcHR1cmUgMi4gICAgIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU00X0lDNCAgICAgICAgICBMTF9DT01QX09VVFBVVF9USU00X0lDNF9DT01QNiAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTQgaW5wdXQgY2FwdHVyZSA0LiAgICAgQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTE1X0lDMiAgICAgICAgIExMX0NPTVBfT1VUUFVUX1RJTTE1X0lDMl9DT01QNCAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMTUgaW5wdXQgY2FwdHVyZSAxLiAgICBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMTVfT0NDTFIgICAgICAgTExfQ09NUF9PVVRQVVRfVElNMTVfT0NDTFJfQ09NUDQgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNSBPQ1JFRiBjbGVhci4gICAgICAgIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0xNl9JQzEgICAgICAgICBMTF9DT01QX09VVFBVVF9USU0xNl9JQzFfQ09NUDYgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTE2IGlucHV0IGNhcHR1cmUgMS4gICAgQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTE2X09DQ0xSICAgICAgIExMX0NPTVBfT1VUUFVUX1RJTTE2X09DQ0xSX0NPTVA2ICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMTYgT0NSRUYgY2xlYXIuICAgICAgICBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKy8qIE5vdGU6IE91dHB1dCByZWRpcmVjdGlvbiBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoICAgICAgICAgICovCisvKiAgICAgICBwYXJ0aWFsbHkgZ2VuZXJpYyBuYW1pbmcgZ3JvdXBpbmcgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gICAgICAgICAqLworLyogICAgICAgUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gICAgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMl9PQ0NMUl9DT01QMV8yXzMgIExMX0NPTVBfT1VUUFVUX1RJTTJfT0NDTFJfQ09NUDFfMiAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTIgT0NSRUYgY2xlYXIuICAgICAgICAgQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisKKyNlbGlmIGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisvKiBOb3RlOiBPdXRwdXQgcmVkaXJlY3Rpb24gY29tbW9uIHRvIGFsbCBDT01QIGluc3RhbmNlcyAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU04X0JLSU4gICAgICAgICAoQ09NUF9DU1JfQ09NUHhPVVRTRUxfMSB8IENPTVBfQ1NSX0NPTVB4T1VUU0VMXzApICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU04IGJyZWFrIGlucHV0IChCS0lOKSAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU04X0JLSU4yICAgICAgICAoQ09NUF9DU1JfQ09NUHhPVVRTRUxfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU04IGJyZWFrIGlucHV0IDIgKEJLSU4yKSAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0xX1RJTThfQktJTjIgICAoQ09NUF9DU1JfQ09NUHhPVVRTRUxfMnwgQ09NUF9DU1JfQ09NUHhPVVRTRUxfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xIGJyZWFrIGlucHV0IDIgYW5kIFRJTTggYnJlYWsgaW5wdXQgMiAoQktJTjIpICovCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkKKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMjBfQktJTiAgICAgICAgKENPTVBfQ1NSX0NPTVB4T1VUU0VMXzMgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNOCBicmVhayBpbnB1dCAoQktJTikgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMjBfQktJTjIgICAgICAgKENPTVBfQ1NSX0NPTVB4T1VUU0VMXzMgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8yIHwgQ09NUF9DU1JfQ09NUHhPVVRTRUxfMCkgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNOCBicmVhayBpbnB1dCAyIChCS0lOMikgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMV9USU04X1RJTTIwX0JLSU4yIChDT01QX0NTUl9DT01QeE9VVFNFTF8zIHwgQ09NUF9DU1JfQ09NUHhPVVRTRUxfMnwgQ09NUF9DU1JfQ09NUHhPVVRTRUxfMSkgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMSBicmVhayBpbnB1dCAyLCBUSU04IGJyZWFrIGlucHV0IDIgYW5kIFRJTTIwIGJyZWFrIGlucHV0IDIgKEJLSU4yKSAqLworI2VuZGlmCisvKiBOb3RlOiBPdXRwdXQgcmVkaXJlY3Rpb24gc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDEsIENPTVAyLCBDT01QMywgQ09NUDcgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMV9PQ0NMUl9DT01QMV8yXzNfNyAoQ09NUF9DU1JfQ09NUHhPVVRTRUxfMiB8IENPTVBfQ1NSX0NPTVB4T1VUU0VMXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xIE9DUkVGIGNsZWFyIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QMSwgQ09NUDIsIENPTVAzLCBDT01QNykgKi8KKy8qIE5vdGU6IE91dHB1dCByZWRpcmVjdGlvbiBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QMSwgQ09NUDIsIENPTVAzICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTJfT0NDTFJfQ09NUDFfMl8zIChDT01QX0NTUl9DT01QeE9VVFNFTF8zIHwgQ09NUF9DU1JfQ09NUHhPVVRTRUxfMCkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTIgT0NSRUYgY2xlYXIgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVAxLCBDT01QMiwgQ09NUDMpICovCisvKiBOb3RlOiBPdXRwdXQgcmVkaXJlY3Rpb24gc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDEsIENPTVAyLCBDT01QNCwgQ09NUDUgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNM19PQ0NMUl9DT01QMV8yXzRfNSAoQ09NUF9DU1JfQ09NUHhPVVRTRUxfMyB8IENPTVBfQ1NSX0NPTVB4T1VUU0VMXzEgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8wKSAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0zIE9DUkVGIGNsZWFyIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QMSwgQ09NUDIsIENPTVA0LCBDT01QNSkgKi8KKy8qIE5vdGU6IE91dHB1dCByZWRpcmVjdGlvbiBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QNCwgQ09NUDUsIENPTVA2LCBDT01QNyAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU04X09DQ0xSX0NPTVA0XzVfNl83IChDT01QX0NTUl9DT01QeE9VVFNFTF8yIHwgQ09NUF9DU1JfQ09NUHhPVVRTRUxfMSB8IENPTVBfQ1NSX0NPTVB4T1VUU0VMXzApIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTggT0NSRUYgY2xlYXIgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVA0LCBDT01QNSwgQ09NUDYsIENPTVA3KSAqLworLyogTm90ZTogT3V0cHV0IHJlZGlyZWN0aW9uIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVAxLCBDT01QMiAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0xX0lDMV9DT01QMV8yICAoQ09NUF9DU1JfQ09NUHhPVVRTRUxfMiB8IENPTVBfQ1NSX0NPTVB4T1VUU0VMXzEgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8wKSAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xIGlucHV0IGNhcHR1cmUgMSAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDIpICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTJfSUM0X0NPTVAxXzIgIChDT01QX0NTUl9DT01QeE9VVFNFTF8zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTIgaW5wdXQgY2FwdHVyZSA0IChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QMikgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNM19JQzFfQ09NUDFfMiAgKENPTVBfQ1NSX0NPTVB4T1VUU0VMXzMgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8xIHwgQ09NUF9DU1JfQ09NUHhPVVRTRUxfMCkgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMyBpbnB1dCBjYXB0dXJlIDEgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVAyKSAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTIwX09DQ0xSX0NPTVAyIChDT01QX0NTUl9DT01QeE9VVFNFTF8zIHwgQ09NUF9DU1JfQ09NUHhPVVRTRUxfMiB8IENPTVBfQ1NSX0NPTVB4T1VUU0VMXzEgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8wKSAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0yMCBPQ1JFRiBjbGVhciAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDIpICovCisjZW5kaWYKKy8qIE5vdGU6IE91dHB1dCByZWRpcmVjdGlvbiBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QMyAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0zX0lDMl9DT01QMyAgICAoQ09NUF9DU1JfQ09NUHhPVVRTRUxfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0zIGlucHV0IGNhcHR1cmUgMiAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDMpICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTRfSUMxX0NPTVAzICAgIChDT01QX0NTUl9DT01QeE9VVFNFTF8yIHwgQ09NUF9DU1JfQ09NUHhPVVRTRUxfMSB8IENPTVBfQ1NSX0NPTVB4T1VUU0VMXzApIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTQgaW5wdXQgY2FwdHVyZSAxIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QMykgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMTVfSUMxX0NPTVAzICAgKENPTVBfQ1NSX0NPTVB4T1VUU0VMXzMgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMTUgaW5wdXQgY2FwdHVyZSAxIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QMykgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMTVfQktJTl9DT01QMyAgKENPTVBfQ1NSX0NPTVB4T1VUU0VMXzMgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8xIHwgQ09NUF9DU1JfQ09NUHhPVVRTRUxfMCkgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMTUgYnJlYWsgaW5wdXQgKEJLSU4pICovCisvKiBOb3RlOiBPdXRwdXQgcmVkaXJlY3Rpb24gc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDQgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNM19JQzNfQ09NUDQgICAgKENPTVBfQ1NSX0NPTVB4T1VUU0VMXzIgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMyBpbnB1dCBjYXB0dXJlIDMgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVA0KSAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU00X0lDMl9DT01QNCAgICAoQ09NUF9DU1JfQ09NUHhPVVRTRUxfMyB8IENPTVBfQ1NSX0NPTVB4T1VUU0VMXzApICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU00IGlucHV0IGNhcHR1cmUgMiAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDQpICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTE1X0lDMl9DT01QNCAgIChDT01QX0NTUl9DT01QeE9VVFNFTF8zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTE1IGlucHV0IGNhcHR1cmUgMSAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDQpICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTE1X09DQ0xSX0NPTVA0IChDT01QX0NTUl9DT01QeE9VVFNFTF8zIHwgQ09NUF9DU1JfQ09NUHhPVVRTRUxfMSkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTE1IE9DUkVGIGNsZWFyIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QNCkgKi8KKy8qIE5vdGU6IE91dHB1dCByZWRpcmVjdGlvbiBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QNSAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0yX0lDMV9DT01QNSAgICAoQ09NUF9DU1JfQ09NUHhPVVRTRUxfMiB8IENPTVBfQ1NSX0NPTVB4T1VUU0VMXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0yIGlucHV0IGNhcHR1cmUgMSAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDUpICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTRfSUMzX0NPTVA1ICAgIChDT01QX0NTUl9DT01QeE9VVFNFTF8zIHwgQ09NUF9DU1JfQ09NUHhPVVRTRUxfMCkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTQgaW5wdXQgY2FwdHVyZSAzIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QNSkgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMTdfSUMxX0NPTVA1ICAgKENPTVBfQ1NSX0NPTVB4T1VUU0VMXzMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMTcgaW5wdXQgY2FwdHVyZSAxIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QNSkgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMTZfQktJTl9DT01QNSAgKENPTVBfQ1NSX0NPTVB4T1VUU0VMXzMgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMTYgYnJlYWsgaW5wdXQgKEJLSU4pICovCisvKiBOb3RlOiBPdXRwdXQgcmVkaXJlY3Rpb24gc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDYgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMl9JQzJfQ09NUDYgICAgKENPTVBfQ1NSX0NPTVB4T1VUU0VMXzIgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMiBpbnB1dCBjYXB0dXJlIDIgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVA2KSAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0yX09DQ0xSX0NPTVA2ICAoQ09NUF9DU1JfQ09NUHhPVVRTRUxfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0yIE9DUkVGIGNsZWFyIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QNikgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNNF9JQzRfQ09NUDYgICAgKENPTVBfQ1NSX0NPTVB4T1VUU0VMXzMgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8xIHwgQ09NUF9DU1JfQ09NUHhPVVRTRUxfMCkgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNNCBpbnB1dCBjYXB0dXJlIDQgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVA2KSAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0xNl9JQzFfQ09NUDYgICAoQ09NUF9DU1JfQ09NUHhPVVRTRUxfMyB8IENPTVBfQ1NSX0NPTVB4T1VUU0VMXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNiBpbnB1dCBjYXB0dXJlIDEgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVA2KSAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0xNl9PQ0NMUl9DT01QNiAoQ09NUF9DU1JfQ09NUHhPVVRTRUxfMyB8IENPTVBfQ1NSX0NPTVB4T1VUU0VMXzEgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8wKSAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNiBPQ1JFRiBjbGVhciAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDYpICovCisvKiBOb3RlOiBPdXRwdXQgcmVkaXJlY3Rpb24gc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDcgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMV9JQzJfQ09NUDcgICAgKENPTVBfQ1NSX0NPTVB4T1VUU0VMXzMgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMiBpbnB1dCBjYXB0dXJlIDEgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVA3KSAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0yX0lDM19DT01QNyAgICAoQ09NUF9DU1JfQ09NUHhPVVRTRUxfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU00IGlucHV0IGNhcHR1cmUgMyAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDcpICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTE3X09DQ0xSX0NPTVA3IChDT01QX0NTUl9DT01QeE9VVFNFTF8zIHwgQ09NUF9DU1JfQ09NUHhPVVRTRUxfMSkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTE3IE9DUkVGIGNsZWFyIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QNykgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMTdfQktJTl9DT01QNyAgKENPTVBfQ1NSX0NPTVB4T1VUU0VMXzMgfCBDT01QX0NTUl9DT01QeE9VVFNFTF8xIHwgQ09NUF9DU1JfQ09NUHhPVVRTRUxfMCkgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMTcgYnJlYWsgaW5wdXQgKEJLSU4pICovCisKKy8qIE5vdGU6IE91dHB1dCByZWRpcmVjdGlvbiBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoICAgICAgICAgICovCisvKiAgICAgICBnZW5lcmljIG5hbWluZyBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAgICAqLworLyogICAgICAgUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gICAgKi8KKy8qIE5vdGU6IFNvbWUgb3V0cHV0IHJlZGlyZWN0aW9ucyBjYW5ub3QgaGF2ZSBhIGdlbmVyaWMgbmFtaW5nLCAgICAgICAgICAgICAgICovCisvKiAgICAgICBkdWUgdG8gbGl0ZXJhbCB2YWx1ZSBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIENPTVAgaW5zdGFuY2UuICAgICAgICAgICAqLworLyogICAgICAgKEZvciBleGVtcGxlOiBMTF9DT01QX09VVFBVVF9USU0yX09DQ0xSX0NPTVAxXzJfMyBhbmQgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIExMX0NPTVBfT1VUUFVUX1RJTTJfT0NDTFJfQ09NUDYpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTFfSUMxICAgICAgICAgIExMX0NPTVBfT1VUUFVUX1RJTTFfSUMxX0NPTVAxXzIgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMSBpbnB1dCBjYXB0dXJlIDEuICAgICBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMV9JQzIgICAgICAgICAgTExfQ09NUF9PVVRQVVRfVElNMV9JQzJfQ09NUDcgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0yIGlucHV0IGNhcHR1cmUgMS4gICAgIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0xX09DQ0xSICAgICAgICBMTF9DT01QX09VVFBVVF9USU0xX09DQ0xSX0NPTVAxXzJfM183IC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTEgT0NSRUYgY2xlYXIuICAgICAgICAgQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTJfSUMxICAgICAgICAgIExMX0NPTVBfT1VUUFVUX1RJTTJfSUMxX0NPTVA1ICAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMiBpbnB1dCBjYXB0dXJlIDEuICAgICBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMl9JQzIgICAgICAgICAgTExfQ09NUF9PVVRQVVRfVElNMl9JQzJfQ09NUDYgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0yIGlucHV0IGNhcHR1cmUgMi4gICAgIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0yX0lDMyAgICAgICAgICBMTF9DT01QX09VVFBVVF9USU0yX0lDM19DT01QNyAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTQgaW5wdXQgY2FwdHVyZSAzLiAgICAgQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTJfSUM0ICAgICAgICAgIExMX0NPTVBfT1VUUFVUX1RJTTJfSUM0X0NPTVAxXzIgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMiBpbnB1dCBjYXB0dXJlIDQuICAgICBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNM19JQzEgICAgICAgICAgTExfQ09NUF9PVVRQVVRfVElNM19JQzFfQ09NUDFfMiAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0zIGlucHV0IGNhcHR1cmUgMS4gICAgIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0zX0lDMiAgICAgICAgICBMTF9DT01QX09VVFBVVF9USU0zX0lDMl9DT01QMyAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTMgaW5wdXQgY2FwdHVyZSAyLiAgICAgQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTNfSUMzICAgICAgICAgIExMX0NPTVBfT1VUUFVUX1RJTTNfSUMzX0NPTVA0ICAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMyBpbnB1dCBjYXB0dXJlIDMuICAgICBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNM19PQ0NMUiAgICAgICAgTExfQ09NUF9PVVRQVVRfVElNM19PQ0NMUl9DT01QMV8yXzRfNSAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0zIE9DUkVGIGNsZWFyLiAgICAgICAgIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU00X0lDMSAgICAgICAgICBMTF9DT01QX09VVFBVVF9USU00X0lDMV9DT01QMyAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTQgaW5wdXQgY2FwdHVyZSAxLiAgICAgQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTRfSUMyICAgICAgICAgIExMX0NPTVBfT1VUUFVUX1RJTTRfSUMyX0NPTVA0ICAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNNCBpbnB1dCBjYXB0dXJlIDIuICAgICBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNNF9JQzMgICAgICAgICAgTExfQ09NUF9PVVRQVVRfVElNNF9JQzNfQ09NUDUgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU00IGlucHV0IGNhcHR1cmUgMy4gICAgIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU00X0lDNCAgICAgICAgICBMTF9DT01QX09VVFBVVF9USU00X0lDNF9DT01QNiAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTQgaW5wdXQgY2FwdHVyZSA0LiAgICAgQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTThfT0NDTFIgICAgICAgIExMX0NPTVBfT1VUUFVUX1RJTThfT0NDTFJfQ09NUDRfNV82XzcgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNOCBPQ1JFRiBjbGVhci4gICAgICAgICBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMTVfSUMxICAgICAgICAgTExfQ09NUF9PVVRQVVRfVElNMTVfSUMxX0NPTVAzICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNSBpbnB1dCBjYXB0dXJlIDEuICAgIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0xNV9JQzIgICAgICAgICBMTF9DT01QX09VVFBVVF9USU0xNV9JQzJfQ09NUDQgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTE1IGlucHV0IGNhcHR1cmUgMS4gICAgQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTE1X0JLSU4gICAgICAgIExMX0NPTVBfT1VUUFVUX1RJTTE1X0JLSU5fQ09NUDMgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMTUgYnJlYWsgaW5wdXQgKEJLSU4pLiBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMTVfT0NDTFIgICAgICAgTExfQ09NUF9PVVRQVVRfVElNMTVfT0NDTFJfQ09NUDQgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNSBPQ1JFRiBjbGVhci4gICAgICAgIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0xNl9JQzEgICAgICAgICBMTF9DT01QX09VVFBVVF9USU0xNl9JQzFfQ09NUDYgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTE2IGlucHV0IGNhcHR1cmUgMS4gICAgQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTE2X0JLSU4gICAgICAgIExMX0NPTVBfT1VUUFVUX1RJTTE2X0JLSU5fQ09NUDUgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMTYgYnJlYWsgaW5wdXQgKEJLSU4pLiBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMTZfT0NDTFIgICAgICAgTExfQ09NUF9PVVRQVVRfVElNMTZfT0NDTFJfQ09NUDYgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNiBPQ1JFRiBjbGVhci4gICAgICAgIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0xN19JQzEgICAgICAgICBMTF9DT01QX09VVFBVVF9USU0xN19JQzFfQ09NUDUgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTE3IGlucHV0IGNhcHR1cmUgMS4gICAgQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTE3X0JLSU4gICAgICAgIExMX0NPTVBfT1VUUFVUX1RJTTE3X0JLSU5fQ09NUDcgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMTcgYnJlYWsgaW5wdXQgKEJLSU4pLiBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMTdfT0NDTFIgICAgICAgTExfQ09NUF9PVVRQVVRfVElNMTdfT0NDTFJfQ09NUDcgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNyBPQ1JFRiBjbGVhci4gICAgICAgIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTIwX09DQ0xSICAgICAgIExMX0NPTVBfT1VUUFVUX1RJTTIwX09DQ0xSX0NPTVAyICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMjAgT0NSRUYgY2xlYXIuICAgICAgICBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKyNlbmRpZgorCisjZW5kaWYKKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0xMX0VDX09VVFBVVF9QT0xBUklUWSBDb21wYXJhdG9yIG91dHB1dCAtIE91dHB1dCBwb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUUE9MX05PTklOVkVSVEVEICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBDT01QIG91dHB1dCBwb2xhcml0eSBpcyBub3QgaW52ZXJ0ZWQ6IGNvbXBhcmF0b3Igb3V0cHV0IGlzIGhpZ2ggd2hlbiB0aGUgcGx1cyAobm9uLWludmVydGluZykgaW5wdXQgaXMgYXQgYSBoaWdoZXIgdm9sdGFnZSB0aGFuIHRoZSBtaW51cyAoaW52ZXJ0aW5nKSBpbnB1dCAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVFBPTF9JTlZFUlRFRCAgICAgIChDT01QX0NTUl9DT01QeFBPTCkgICAgIC8qITwgQ09NUCBvdXRwdXQgcG9sYXJpdHkgaXMgaW52ZXJ0ZWQ6IGNvbXBhcmF0b3Igb3V0cHV0IGlzIGxvdyB3aGVuIHRoZSBwbHVzIChub24taW52ZXJ0aW5nKSBpbnB1dCBpcyBhdCBhIGxvd2VyIHZvbHRhZ2UgdGhhbiB0aGUgbWludXMgKGludmVydGluZykgaW5wdXQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FQ19PVVRQVVRfQkxBTktJTkdfU09VUkNFIENvbXBhcmF0b3Igb3V0cHV0IC0gQmxhbmtpbmcgc291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ09NUF9CTEFOS0lOR1NSQ19OT05FICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPENvbXBhcmF0b3Igb3V0cHV0IHdpdGhvdXQgYmxhbmtpbmcgKi8KKyNpZiBkZWZpbmVkKENPTVBfQ1NSX0NPTVB4QkxBTktJTkcpCisjaWYgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkgfHwgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkKKy8qIE5vdGU6IE91dHB1dCBibGFua2luZyBzb3VyY2Ugc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDIgKi8KKyNkZWZpbmUgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0xX09DNV9DT01QMiAgKENPTVBfQ1NSX0NPTVB4QkxBTktJTkdfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJhdG9yIG91dHB1dCBibGFua2luZyBzb3VyY2UgVElNMSBPQzUgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVAyKSAqLworI2RlZmluZSBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTJfT0MzX0NPTVAyICAoQ09NUF9DU1JfQ09NUHhCTEFOS0lOR18xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IGJsYW5raW5nIHNvdXJjZSBUSU0yIE9DMyAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDIpICovCisjZGVmaW5lIExMX0NPTVBfQkxBTktJTkdTUkNfVElNM19PQzNfQ09NUDIgIChDT01QX0NTUl9DT01QeEJMQU5LSU5HXzEgfCBDT01QX0NTUl9DT01QeEJMQU5LSU5HXzApIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgYmxhbmtpbmcgc291cmNlIFRJTTMgT0MzIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QMikgKi8KKy8qIE5vdGU6IE91dHB1dCBibGFua2luZyBzb3VyY2Ugc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDQgKi8KKyNkZWZpbmUgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0zX09DNF9DT01QNCAgKENPTVBfQ1NSX0NPTVB4QkxBTktJTkdfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJhdG9yIG91dHB1dCBibGFua2luZyBzb3VyY2UgVElNMyBPQzQgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVA0KSAqLworI2RlZmluZSBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTE1X09DMV9DT01QNCAoQ09NUF9DU1JfQ09NUHhCTEFOS0lOR18wIHwgQ09NUF9DU1JfQ09NUHhCTEFOS0lOR18xKSAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IGJsYW5raW5nIHNvdXJjZSBUSU0xNSBPQzEgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVA0KSAqLworLyogTm90ZTogT3V0cHV0IGJsYW5raW5nIHNvdXJjZSBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QNiAqLworI2RlZmluZSBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTJfT0M0X0NPTVA2ICAoQ09NUF9DU1JfQ09NUHhCTEFOS0lOR18wIHwgQ09NUF9DU1JfQ09NUHhCTEFOS0lOR18xKSAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IGJsYW5raW5nIHNvdXJjZSBUSU0yIE9DNCAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDYpICovCisjZGVmaW5lIExMX0NPTVBfQkxBTktJTkdTUkNfVElNMTVfT0MyX0NPTVA2IChDT01QX0NTUl9DT01QeEJMQU5LSU5HXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgYmxhbmtpbmcgc291cmNlIFRJTTE1IE9DMiAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDYpICovCisKKy8qIE5vdGU6IE91dHB1dCBibGFua2luZyBzb3VyY2Ugc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCAgICAgICovCisvKiAgICAgICBnZW5lcmljIG5hbWluZyBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAgICAqLworLyogICAgICAgUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gICAgKi8KKyNkZWZpbmUgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0xX09DNSAgICAgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0xX09DNV9DT01QMiAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgYmxhbmtpbmcgc291cmNlIFRJTTEgT0M1LiAgQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisjZGVmaW5lIExMX0NPTVBfQkxBTktJTkdTUkNfVElNMl9PQzMgICAgIExMX0NPTVBfQkxBTktJTkdTUkNfVElNMl9PQzNfQ09NUDIgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IGJsYW5raW5nIHNvdXJjZSBUSU0yIE9DMy4gIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworI2RlZmluZSBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTJfT0M0ICAgICBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTJfT0M0X0NPTVA2ICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJhdG9yIG91dHB1dCBibGFua2luZyBzb3VyY2UgVElNMiBPQzQuICBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKyNkZWZpbmUgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0zX09DMyAgICAgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0zX09DM19DT01QMiAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgYmxhbmtpbmcgc291cmNlIFRJTTMgT0MzLiAgQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisjZGVmaW5lIExMX0NPTVBfQkxBTktJTkdTUkNfVElNM19PQzQgICAgIExMX0NPTVBfQkxBTktJTkdTUkNfVElNM19PQzRfQ09NUDQgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IGJsYW5raW5nIHNvdXJjZSBUSU0zIE9DNC4gIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworI2RlZmluZSBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTE1X09DMSAgICBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTE1X09DMV9DT01QNCAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJhdG9yIG91dHB1dCBibGFua2luZyBzb3VyY2UgVElNMTUgT0MxLiBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKyNkZWZpbmUgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0xNV9PQzIgICAgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0xNV9PQzJfQ09NUDYgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgYmxhbmtpbmcgc291cmNlIFRJTTE1IE9DMi4gQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisKKyNlbGlmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAyeEMpCisvKiBOb3RlOiBPdXRwdXQgYmxhbmtpbmcgc291cmNlIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVAxLCBDT01QMiAqLworI2RlZmluZSBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTFfT0M1X0NPTVAxXzIgKENPTVBfQ1NSX0NPTVB4QkxBTktJTkdfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJhdG9yIG91dHB1dCBibGFua2luZyBzb3VyY2UgVElNMSBPQzUgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVAxLCBDT01QMikgKi8KKyNkZWZpbmUgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0yX09DM19DT01QMV8yIChDT01QX0NTUl9DT01QeEJMQU5LSU5HXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgYmxhbmtpbmcgc291cmNlIFRJTTIgT0MzIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QMSwgQ09NUDIpICovCisjZGVmaW5lIExMX0NPTVBfQkxBTktJTkdTUkNfVElNM19PQzNfQ09NUDFfMiAoQ09NUF9DU1JfQ09NUHhCTEFOS0lOR18xIHwgQ09NUF9DU1JfQ09NUHhCTEFOS0lOR18wKSAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IGJsYW5raW5nIHNvdXJjZSBUSU0zIE9DMyAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDEsIENPTVAyKSAqLworLyogTm90ZTogT3V0cHV0IGJsYW5raW5nIHNvdXJjZSBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QNCAqLworI2RlZmluZSBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTNfT0M0X0NPTVA0ICAoQ09NUF9DU1JfQ09NUHhCTEFOS0lOR18wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJhdG9yIG91dHB1dCBibGFua2luZyBzb3VyY2UgVElNMyBPQzQgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVA0KSAqLworI2RlZmluZSBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTE1X09DMV9DT01QNCAoQ09NUF9DU1JfQ09NUHhCTEFOS0lOR18wIHwgQ09NUF9DU1JfQ09NUHhCTEFOS0lOR18xKSAgLyohPCBDb21wYXJhdG9yIG91dHB1dCBibGFua2luZyBzb3VyY2UgVElNMTUgT0MxIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QNCkgKi8KKy8qIE5vdGU6IE91dHB1dCBibGFua2luZyBzb3VyY2Ugc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDYgKi8KKyNkZWZpbmUgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0yX09DNF9DT01QNiAgKENPTVBfQ1NSX0NPTVB4QkxBTktJTkdfMCB8IENPTVBfQ1NSX0NPTVB4QkxBTktJTkdfMSkgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgYmxhbmtpbmcgc291cmNlIFRJTTIgT0M0IChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QNikgKi8KKyNkZWZpbmUgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0xNV9PQzJfQ09NUDYgKENPTVBfQ1NSX0NPTVB4QkxBTktJTkdfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgYmxhbmtpbmcgc291cmNlIFRJTTE1IE9DMiAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDYpICovCisKKy8qIE5vdGU6IE91dHB1dCBibGFua2luZyBzb3VyY2Ugc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCAgICAgICovCisvKiAgICAgICBnZW5lcmljIG5hbWluZyBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAgICAqLworLyogICAgICAgUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gICAgKi8KKyNkZWZpbmUgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0xX09DNSAgICAgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0xX09DNV9DT01QMV8yICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgYmxhbmtpbmcgc291cmNlIFRJTTEgT0M1LiAgQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisjZGVmaW5lIExMX0NPTVBfQkxBTktJTkdTUkNfVElNMl9PQzMgICAgIExMX0NPTVBfQkxBTktJTkdTUkNfVElNMl9PQzNfQ09NUDFfMiAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IGJsYW5raW5nIHNvdXJjZSBUSU0yIE9DMy4gIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworI2RlZmluZSBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTJfT0M0ICAgICBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTJfT0M0X0NPTVA2ICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJhdG9yIG91dHB1dCBibGFua2luZyBzb3VyY2UgVElNMiBPQzQuICBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKyNkZWZpbmUgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0zX09DMyAgICAgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0zX09DM19DT01QMV8yICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgYmxhbmtpbmcgc291cmNlIFRJTTMgT0MzLiAgQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisjZGVmaW5lIExMX0NPTVBfQkxBTktJTkdTUkNfVElNM19PQzQgICAgIExMX0NPTVBfQkxBTktJTkdTUkNfVElNM19PQzRfQ09NUDQgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IGJsYW5raW5nIHNvdXJjZSBUSU0zIE9DNC4gIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworI2RlZmluZSBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTE1X09DMSAgICBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTE1X09DMV9DT01QNCAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJhdG9yIG91dHB1dCBibGFua2luZyBzb3VyY2UgVElNMTUgT0MxLiBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKyNkZWZpbmUgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0xNV9PQzIgICAgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0xNV9PQzJfQ09NUDYgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgYmxhbmtpbmcgc291cmNlIFRJTTE1IE9DMi4gQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisKKyNlbGlmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpCisvKiBOb3RlOiBPdXRwdXQgYmxhbmtpbmcgc291cmNlIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVAxLCBDT01QMiwgQ09NUDcgKi8KKyNkZWZpbmUgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0xX09DNV9DT01QMV8yXzcgKENPTVBfQ1NSX0NPTVB4QkxBTktJTkdfMCkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgYmxhbmtpbmcgc291cmNlIFRJTTEgT0M1IChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QMSwgQ09NUDIsIENPTVA3KSAqLworLyogTm90ZTogT3V0cHV0IGJsYW5raW5nIHNvdXJjZSBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QMSwgQ09NUDIgKi8KKyNkZWZpbmUgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0yX09DM19DT01QMV8yIChDT01QX0NTUl9DT01QeEJMQU5LSU5HXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgYmxhbmtpbmcgc291cmNlIFRJTTIgT0MzIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QMSwgQ09NUDIpICovCisjZGVmaW5lIExMX0NPTVBfQkxBTktJTkdTUkNfVElNM19PQzNfQ09NUDFfMiAoQ09NUF9DU1JfQ09NUHhCTEFOS0lOR18xIHwgQ09NUF9DU1JfQ09NUHhCTEFOS0lOR18wKSAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IGJsYW5raW5nIHNvdXJjZSBUSU0zIE9DMyAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDEsIENPTVAyKSAqLworLyogTm90ZTogT3V0cHV0IGJsYW5raW5nIHNvdXJjZSBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QMywgQ09NUDYgKi8KKyNkZWZpbmUgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0yX09DNF9DT01QM182IChDT01QX0NTUl9DT01QeEJMQU5LSU5HXzEgfCBDT01QX0NTUl9DT01QeEJMQU5LSU5HXzApIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgYmxhbmtpbmcgc291cmNlIFRJTTIgT0M0IChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QMywgQ09NUDYpICovCisvKiBOb3RlOiBPdXRwdXQgYmxhbmtpbmcgc291cmNlIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVA0LCBDT01QNSwgQ09NUDYsIENPTVA3ICovCisjZGVmaW5lIExMX0NPTVBfQkxBTktJTkdTUkNfVElNOF9PQzVfQ09NUDRfNV82XzcgKENPTVBfQ1NSX0NPTVB4QkxBTktJTkdfMSkgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IGJsYW5raW5nIHNvdXJjZSBUSU04IE9DNSAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDQsIENPTVA1LCBDT01QNiwgQ09NUDcpICovCisvKiBOb3RlOiBPdXRwdXQgYmxhbmxpbmcgc291cmNlIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVA2LCBDT01QNyAqLworI2RlZmluZSBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTE1X09DMl9DT01QNl83IChDT01QX0NTUl9DT01QeEJMQU5LSU5HXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJhdG9yIG91dHB1dCBibGFua2luZyBzb3VyY2UgVElNMTUgT0MyIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QNiwgQ09NUDcpICovCisvKiBOb3RlOiBPdXRwdXQgYmxhbmtpbmcgc291cmNlIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVA0ICovCisjZGVmaW5lIExMX0NPTVBfQkxBTktJTkdTUkNfVElNM19PQzRfQ09NUDQgICAoQ09NUF9DU1JfQ09NUHhCTEFOS0lOR18wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IGJsYW5raW5nIHNvdXJjZSBUSU0zIE9DNCAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDQpICovCisjZGVmaW5lIExMX0NPTVBfQkxBTktJTkdTUkNfVElNMTVfT0MxX0NPTVA0ICAoQ09NUF9DU1JfQ09NUHhCTEFOS0lOR18xIHwgQ09NUF9DU1JfQ09NUHhCTEFOS0lOR18wKSAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IGJsYW5raW5nIHNvdXJjZSBUSU0xNSBPQzEgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVA0KSAqLworCisvKiBOb3RlOiBPdXRwdXQgYmxhbmtpbmcgc291cmNlIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggICAgICAqLworLyogICAgICAgZ2VuZXJpYyBuYW1pbmcgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gICAgKi8KKy8qICAgICAgIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICAgICovCisjZGVmaW5lIExMX0NPTVBfQkxBTktJTkdTUkNfVElNMV9PQzUgICAgIExMX0NPTVBfQkxBTktJTkdTUkNfVElNMV9PQzVfQ09NUDFfMl83ICAgICAgICAgICAgICAgICAgICAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IGJsYW5raW5nIHNvdXJjZSBUSU0xIE9DNS4gIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworI2RlZmluZSBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTJfT0MzICAgICBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTJfT0MzX0NPTVAxXzIgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJhdG9yIG91dHB1dCBibGFua2luZyBzb3VyY2UgVElNMiBPQzMuICBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKyNkZWZpbmUgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0yX09DNCAgICAgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0yX09DNF9DT01QM182ICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgYmxhbmtpbmcgc291cmNlIFRJTTIgT0M0LiAgQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisjZGVmaW5lIExMX0NPTVBfQkxBTktJTkdTUkNfVElNM19PQzMgICAgIExMX0NPTVBfQkxBTktJTkdTUkNfVElNM19PQzNfQ09NUDFfMiAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IGJsYW5raW5nIHNvdXJjZSBUSU0zIE9DMy4gIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworI2RlZmluZSBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTNfT0M0ICAgICBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTNfT0M0X0NPTVA0ICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJhdG9yIG91dHB1dCBibGFua2luZyBzb3VyY2UgVElNMyBPQzQuICBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKyNkZWZpbmUgTExfQ09NUF9CTEFOS0lOR1NSQ19USU04X09DNSAgICAgTExfQ09NUF9CTEFOS0lOR1NSQ19USU04X09DNV9DT01QNF81XzZfNyAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgYmxhbmtpbmcgc291cmNlIFRJTTggT0M1LiAgQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisjZGVmaW5lIExMX0NPTVBfQkxBTktJTkdTUkNfVElNMTVfT0MxICAgIExMX0NPTVBfQkxBTktJTkdTUkNfVElNMTVfT0MxX0NPTVA0ICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IGJsYW5raW5nIHNvdXJjZSBUSU0xNSBPQzEuIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworI2RlZmluZSBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTE1X09DMiAgICBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTE1X09DMl9DT01QNl83ICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJhdG9yIG91dHB1dCBibGFua2luZyBzb3VyY2UgVElNMTUgT0MyLiBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKworI2VuZGlmCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FQ19PVVRQVVRfTEVWRUwgQ29tcGFyYXRvciBvdXRwdXQgLSBPdXRwdXQgbGV2ZWwKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9MRVZFTF9MT1cgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgbGV2ZWwgbG93IChpZiB0aGUgcG9sYXJpdHkgaXMgbm90IGludmVydGVkLCBvdGhlcndpc2UgdG8gYmUgY29tcGxlbWVudGVkKSAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9MRVZFTF9ISUdIICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMVUpIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgbGV2ZWwgaGlnaCAoaWYgdGhlIHBvbGFyaXR5IGlzIG5vdCBpbnZlcnRlZCwgb3RoZXJ3aXNlIHRvIGJlIGNvbXBsZW1lbnRlZCkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FQ19IV19ERUxBWVMgIERlZmluaXRpb25zIG9mIENPTVAgaGFyZHdhcmUgY29uc3RyYWludHMgZGVsYXlzCisgICogQG5vdGUgICBPbmx5IENPTVAgSVAgSFcgZGVsYXlzIGFyZSBkZWZpbmVkIGluIENPTVAgTEwgZHJpdmVyIGRyaXZlciwKKyAgKiAgICAgICAgIG5vdCB0aW1lb3V0IHZhbHVlcy4KKyAgKiAgICAgICAgIEZvciBkZXRhaWxzIG9uIGRlbGF5cyB2YWx1ZXMsIHJlZmVyIHRvIGRlc2NyaXB0aW9ucyBpbiBzb3VyY2UgY29kZQorICAqICAgICAgICAgYWJvdmUgZWFjaCBsaXRlcmFsIGRlZmluaXRpb24uCisgICogQHsKKyAgKi8KKworLyogRGVsYXkgZm9yIGNvbXBhcmF0b3Igc3RhcnR1cCB0aW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5vdGU6IERlbGF5IHJlcXVpcmVkIHRvIHJlYWNoIHByb3BhZ2F0aW9uIGRlbGF5IHNwZWNpZmljYXRpb24uICAgICAgICAgICAgICovCisvKiBMaXRlcmFsIHNldCB0byBtYXhpbXVtIHZhbHVlIChyZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCAgICAgICAgICAgICAgICAgICAqLworLyogcGFyYW1ldGVyICJ0U1RBUlQiKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFVuaXQ6IHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkKKyNkZWZpbmUgTExfQ09NUF9ERUxBWV9TVEFSVFVQX1VTICAgICAgICAgICgodWludDMyX3QpIDYwVSkgIC8qITwgRGVsYXkgZm9yIENPTVAgc3RhcnR1cCB0aW1lICovCisjZWxzZQorI2RlZmluZSBMTF9DT01QX0RFTEFZX1NUQVJUVVBfVVMgICAgICAgICAgKCh1aW50MzJfdCkgMTBVKSAgLyohPCBEZWxheSBmb3IgQ09NUCBzdGFydHVwIHRpbWUgKi8KKyNlbmRpZgorCisvKiBEZWxheSBmb3IgY29tcGFyYXRvciB2b2x0YWdlIHNjYWxlciBzdGFiaWxpemF0aW9uIHRpbWUuICAgICAgICAgICAgICAgICAgICAqLworLyogTm90ZTogVm9sdGFnZSBzY2FsZXIgaXMgdXNlZCB3aGVuIHNlbGVjdGluZyBjb21wYXJhdG9yIGlucHV0ICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIGJhc2VkIG9uIFZyZWZJbnQ6IFZyZWZJbnQgb3Igc3ViZGl2aXNpb24gb2YgVnJlZkludC4gICAgICAgICAgICAgICAgICovCisvKiBMaXRlcmFsIHNldCB0byBtYXhpbXVtIHZhbHVlIChyZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCAgICAgICAgICAgICAgICAgICAqLworLyogcGFyYW1ldGVyICJ0U19TQyIpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFVuaXQ6IHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0NPTVBfREVMQVlfVk9MVEFHRV9TQ0FMRVJfU1RBQl9VUyAoKHVpbnQzMl90KSAyMDBVKSAgLyohPCBEZWxheSBmb3IgQ09NUCB2b2x0YWdlIHNjYWxlciBzdGFiaWxpemF0aW9uIHRpbWUgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FeHBvcnRlZF9NYWNyb3MgQ09NUCBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworLyoqIEBkZWZncm91cCBDT01QX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIHdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBtYWNybworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBDT01QIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gY29tcGFyYXRvciBpbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuCisgICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgTExfQ09NUF9Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIENPTVAgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBjb21wYXJhdG9yIGluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX0NPTVBfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FTV9IRUxQRVJfTUFDUk8gQ09NUCBoZWxwZXIgbWFjcm8KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBzZWxlY3QgdGhlIENPTVAgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICB0byB3aGljaCBpcyBiZWxvbmdpbmcgdGhlIHNlbGVjdGVkIENPTVAgaW5zdGFuY2UuCisgICogQG5vdGUgICBDT01QIGNvbW1vbiByZWdpc3RlciBpbnN0YW5jZSBjYW4gYmUgdXNlZCB0bworICAqICAgICAgICAgc2V0IHBhcmFtZXRlcnMgY29tbW9uIHRvIHNldmVyYWwgQ09NUCBpbnN0YW5jZXMuCisgICogICAgICAgICBSZWZlciB0byBmdW5jdGlvbnMgaGF2aW5nIGFyZ3VtZW50ICJDT01QeHlfQ09NTU9OIiBhcyBwYXJhbWV0ZXIuCisgICogQHBhcmFtICBfX0NPTVB4X18gQ09NUCBpbnN0YW5jZQorICAqIEByZXR2YWwgQ09NUCBjb21tb24gaW5zdGFuY2Ugb3IgdmFsdWUgIjAiIGlmIHRoZXJlIGlzIG5vIENPTVAgY29tbW9uIGluc3RhbmNlLgorICAqLworI2lmIGRlZmluZWQoQ09NUDEpICYmIGRlZmluZWQoQ09NUDIpICYmIGRlZmluZWQoQ09NUDMpICYmIGRlZmluZWQoQ09NUDQpICYmIGRlZmluZWQoQ09NUDUpICYmIGRlZmluZWQoQ09NUDYpICYmIGRlZmluZWQoQ09NUDcpCisvKiBOb3RlOiBPbiBTVE0zMkYzIHNlcmllIGRldmljZXMgd2l0aCA3IGNvbXBhcmF0b3IgaW5zdGFuY2VzLCAgICAgICAgICAgICAgICAqLworLyogICAgICAgQ09NUCBpbnN0YW5jZSBDT01QNyBoYXMgbm8gb3RoZXIgY29tcGFyYXRvciBpbnN0YW5jZSB0byB3b3JrICAgICAgICAgKi8KKy8qICAgICAgIGluIHBhaXIgd2l0aDogd2luZG93IG1vZGUgaXMgbm90IGF2YWlsYWJsZSBmb3IgQ09NUDcuICAgICAgICAgICAgICAgICovCisjZGVmaW5lIF9fTExfQ09NUF9DT01NT05fSU5TVEFOQ0UoX19DT01QeF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoX19DT01QeF9fKSA9PSBDT01QMSkgfHwgKChfX0NPTVB4X18pID09IENPTVAyKSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKENPTVAxMl9DT01NT04pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoKCgoX19DT01QeF9fKSA9PSBDT01QMykgfHwgKChfX0NPTVB4X18pID09IENPTVA0KSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgKENPTVAzNF9DT01NT04pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoKCgoX19DT01QeF9fKSA9PSBDT01QNSkgfHwgKChfX0NPTVB4X18pID09IENPTVA2KSkgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgKENPTVA1Nl9DT01NT04pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICgodWludDMyX3QpMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKyNlbGlmIGRlZmluZWQoQ09NUDEpICYmIGRlZmluZWQoQ09NUDIpICYmIGRlZmluZWQoQ09NUDQpICYmIGRlZmluZWQoQ09NUDYpCisjZGVmaW5lIF9fTExfQ09NUF9DT01NT05fSU5TVEFOQ0UoX19DT01QeF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoX19DT01QeF9fKSA9PSBDT01QMSkgfHwgKChfX0NPTVB4X18pID09IENPTVAyKSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKENPTVAxMl9DT01NT04pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICgodWludDMyX3QpMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKyNlbGlmIGRlZmluZWQoQ09NUDIpICYmIGRlZmluZWQoQ09NUDQpICYmIGRlZmluZWQoQ09NUDYpCisvKiBOb3RlOiBPbiBTVE0zMkYzIHNlcmllIGRldmljZXMgd2l0aCAzIGNvbXBhcmF0b3IgaW5zdGFuY2VzIChDT01QMiwgNCwgNikgICAqLworLyogICAgICAgQ09NUCBpbnN0YW5jZXMgaGF2ZSBubyBvdGhlciBjb21wYXJhdG9yIGluc3RhbmNlIHRvIHdvcmsgICAgICAgICAgICAgKi8KKy8qICAgICAgIGluIHBhaXIgd2l0aDogd2luZG93IG1vZGUgaXMgbm90IGF2YWlsYWJsZSBmb3IgYWxsIENPTVAgaW5zdGFuY2VzLiAgICovCisjZGVmaW5lIF9fTExfQ09NUF9DT01NT05fSU5TVEFOQ0UoX19DT01QeF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKHVpbnQzMl90KTBVKQorI2VuZGlmCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENPTVBfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIENPTVAgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0xMX0VGX0NvbmZpZ3VyYXRpb25fY29tcGFyYXRvcl9jb21tb24gQ29uZmlndXJhdGlvbiBvZiBDT01QIGhpZXJhcmNoaWNhbCBzY29wZTogY29tbW9uIHRvIHNldmVyYWwgQ09NUCBpbnN0YW5jZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCB3aW5kb3cgbW9kZSBvZiBhIHBhaXIgb2YgY29tcGFyYXRvcnMgaW5zdGFuY2VzCisgICogICAgICAgICAoMiBjb25zZWN1dGl2ZSBDT01QIGluc3RhbmNlcyBvZGQgYW5kIGV2ZW4gQ09NUDx4PiBhbmQgQ09NUDx4KzE+KS4KKyAgKiBAcm10b2xsIENTUiAgICAgIENPTVB4V05EV0VOICAgIExMX0NPTVBfU2V0Q29tbW9uV2luZG93TW9kZQorICAqIEBwYXJhbSAgQ09NUHh5X0NPTU1PTiBDb21wYXJhdG9yIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQ09NUF9DT01NT05fSU5TVEFOQ0UoKSApCisgICogQHBhcmFtICBXaW5kb3dNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9XSU5ET1dNT0RFX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX1dJTkRPV01PREVfQ09NUDFfSU5QVVRfUExVU19DT01NT04gKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9XSU5ET1dNT0RFX0NPTVAzX0lOUFVUX1BMVVNfQ09NTU9OICgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfV0lORE9XTU9ERV9DT01QNV9JTlBVVF9QTFVTX0NPTU1PTiAoMikKKyAgKgorICAqICAgICAgICAgKDEpIFBhcmFtZXRlciBhdmFpbGFibGUgb24gZGV2aWNlczogU1RNMzJGMzAyeEIvQywgU1RNMzJGMzAzeEIvQywgU1RNMzJGMzU4eEMKKyAgKiAgICAgICAgICgyKSBQYXJhbWV0ZXIgYXZhaWxhYmxlIG9uIGRldmljZXM6IFNUTTMyRjMwM3hCL0MsIFNUTTMyRjM1OHhDCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DT01QX1NldENvbW1vbldpbmRvd01vZGUoQ09NUF9Db21tb25fVHlwZURlZiAqQ09NUHh5X0NPTU1PTiwgdWludDMyX3QgV2luZG93TW9kZSkKK3sKKyNpZiBkZWZpbmVkKENPTVBfQ1NSX0NPTVB4V05EV0VOKQorICBNT0RJRllfUkVHKENPTVB4eV9DT01NT04tPkNTUiwgQ09NUF9DU1JfQ09NUHhXTkRXRU4sIFdpbmRvd01vZGUpOworI2Vsc2UKKyAgLyogRGV2aWNlIHdpdGhvdXQgcGFpciBvZiBjb21wYXJhdG9yIHdvcmtpbmcgaW4gd2luZG93IG1vZGUgKi8KKyAgLyogTm8gdXBkYXRlIG9mIGNvbXBhcmF0b3IgcmVnaXN0ZXIgKGNvcnJlc3BvbmRzIHRvIHNldHRpbmcgICAgICAgICAgICAgICAgICovCisgIC8qICJMTF9DT01QX1dJTkRPV01PREVfRElTQUJMRSIpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2VuZGlmCit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHdpbmRvdyBtb2RlIG9mIGEgcGFpciBvZiBjb21wYXJhdG9ycyBpbnN0YW5jZXMKKyAgKiAgICAgICAgICgyIGNvbnNlY3V0aXZlIENPTVAgaW5zdGFuY2VzIG9kZCBhbmQgZXZlbiBDT01QPHg+IGFuZCBDT01QPHgrMT4pLgorICAqIEBybXRvbGwgQ1NSICAgICAgQ09NUHhXTkRXRU4gICAgTExfQ09NUF9HZXRDb21tb25XaW5kb3dNb2RlCisgICogQHBhcmFtICBDT01QeHlfQ09NTU9OIENvbXBhcmF0b3IgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9DT01QX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9XSU5ET1dNT0RFX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX1dJTkRPV01PREVfQ09NUDFfSU5QVVRfUExVU19DT01NT04gKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9XSU5ET1dNT0RFX0NPTVAzX0lOUFVUX1BMVVNfQ09NTU9OICgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfV0lORE9XTU9ERV9DT01QNV9JTlBVVF9QTFVTX0NPTU1PTiAoMikKKyAgKgorICAqICAgICAgICAgKDEpIFBhcmFtZXRlciBhdmFpbGFibGUgb24gZGV2aWNlczogU1RNMzJGMzAyeEIvQywgU1RNMzJGMzAzeEIvQywgU1RNMzJGMzU4eEMKKyAgKiAgICAgICAgICgyKSBQYXJhbWV0ZXIgYXZhaWxhYmxlIG9uIGRldmljZXM6IFNUTTMyRjMwM3hCL0MsIFNUTTMyRjM1OHhDCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ09NUF9HZXRDb21tb25XaW5kb3dNb2RlKENPTVBfQ29tbW9uX1R5cGVEZWYgKkNPTVB4eV9DT01NT04pCit7CisjaWYgZGVmaW5lZChDT01QX0NTUl9DT01QeFdORFdFTikKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ09NUHh5X0NPTU1PTi0+Q1NSLCBDT01QX0NTUl9DT01QeFdORFdFTikpOworI2Vsc2UKKyAgLyogRGV2aWNlIHdpdGhvdXQgcGFpciBvZiBjb21wYXJhdG9yIHdvcmtpbmcgaW4gd2luZG93IG1vZGUgKi8KKyAgcmV0dXJuIChMTF9DT01QX1dJTkRPV01PREVfRElTQUJMRSk7CisjZW5kaWYKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0xMX0VGX0NvbmZpZ3VyYXRpb25fY29tcGFyYXRvcl9tb2RlcyBDb25maWd1cmF0aW9uIG9mIGNvbXBhcmF0b3IgbW9kZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBjb21wYXJhdG9yIGluc3RhbmNlIG9wZXJhdGluZyBtb2RlIHRvIGFkanVzdCBwb3dlciBhbmQgc3BlZWQuCisgICogQHJtdG9sbCBDU1IgICAgICBDT01QeE1PREUgICAgICBMTF9DT01QX1NldFBvd2VyTW9kZQorICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEBwYXJhbSAgUG93ZXJNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9QT1dFUk1PREVfSElHSFNQRUVECisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9QT1dFUk1PREVfTUVESVVNU1BFRUQgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX1BPV0VSTU9ERV9MT1dQT1dFUiAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfUE9XRVJNT0RFX1VMVFJBTE9XUE9XRVIgKDEpCisgICoKKyAgKiAgICAgICAgICgxKSBQYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gZGV2aWNlczogU1RNMzJGMzAyeEIvQywgU1RNMzJGMzAzeEIvQywgU1RNMzJGMzU4eEMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NPTVBfU2V0UG93ZXJNb2RlKENPTVBfVHlwZURlZiAqQ09NUHgsIHVpbnQzMl90IFBvd2VyTW9kZSkKK3sKKyNpZiBkZWZpbmVkKENPTVBfQ1NSX0NPTVB4TU9ERSkKKyAgTU9ESUZZX1JFRyhDT01QeC0+Q1NSLCBDT01QX0NTUl9DT01QeE1PREUsIFBvd2VyTW9kZSk7CisjZWxzZQorICAvKiBEZXZpY2Ugd2l0aG91dCBjb21wYXJhdG9yIHBvd2VyIG1vZGUgY29uZmlndXJhYmxlICovCisgIC8qIE5vIHVwZGF0ZSBvZiBjb21wYXJhdG9yIHJlZ2lzdGVyIChjb3JyZXNwb25kcyB0byBzZXR0aW5nICAgICAgICAgICAgICAgICAqLworICAvKiAiTExfQ09NUF9QT1dFUk1PREVfSElHSFNQRUVEIikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNlbmRpZgorfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjb21wYXJhdG9yIGluc3RhbmNlIG9wZXJhdGluZyBtb2RlIHRvIGFkanVzdCBwb3dlciBhbmQgc3BlZWQuCisgICogQHJtdG9sbCBDU1IgICAgICBDT01QeE1PREUgICAgICBMTF9DT01QX0dldFBvd2VyTW9kZQorICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX1BPV0VSTU9ERV9ISUdIU1BFRUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX1BPV0VSTU9ERV9NRURJVU1TUEVFRCAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfUE9XRVJNT0RFX0xPV1BPV0VSICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9QT1dFUk1PREVfVUxUUkFMT1dQT1dFUiAoMSkKKyAgKgorICAqICAgICAgICAgKDEpIFBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBkZXZpY2VzOiBTVE0zMkYzMDJ4Qi9DLCBTVE0zMkYzMDN4Qi9DLCBTVE0zMkYzNTh4QworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NPTVBfR2V0UG93ZXJNb2RlKENPTVBfVHlwZURlZiAqQ09NUHgpCit7CisjaWYgZGVmaW5lZChDT01QX0NTUl9DT01QeE1PREUpCisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKENPTVB4LT5DU1IsIENPTVBfQ1NSX0NPTVB4TU9ERSkpOworI2Vsc2UKKyAgLyogRGV2aWNlIHdpdGhvdXQgY29tcGFyYXRvciBwb3dlciBtb2RlIGNvbmZpZ3VyYWJsZSAqLworICByZXR1cm4gKExMX0NPTVBfUE9XRVJNT0RFX0hJR0hTUEVFRCk7CisjZW5kaWYKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0xMX0VGX0NvbmZpZ3VyYXRpb25fY29tcGFyYXRvcl9pbnB1dHMgQ29uZmlndXJhdGlvbiBvZiBjb21wYXJhdG9yIGlucHV0cworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IGNvbXBhcmF0b3IgaW5wdXRzIG1pbnVzIChpbnZlcnRpbmcpIGFuZCBwbHVzIChub24taW52ZXJ0aW5nKS4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgY29tcGFyYXRvciBpbnB1dCBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gSU86CisgICogICAgICAgICBHUElPIHBpbnMgYXJlIHNwZWNpZmljIHRvIGVhY2ggY29tcGFyYXRvciBpbnN0YW5jZS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHBhcmFtZXRlcnMgb3IgdG8gcmVmZXJlbmNlIG1hbnVhbC4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIGEgdm9sdGFnZSBzY2FsZXIgaXMgdXNlZAorICAqICAgICAgICAgd2hlbiBDT01QIGlucHV0IGlzIGJhc2VkIG9uIFZyZWZJbnQgKFZyZWZJbnQgb3Igc3ViZGl2aXNpb24KKyAgKiAgICAgICAgIG9mIFZyZWZJbnQpOgorICAqICAgICAgICAgVm9sdGFnZSBzY2FsZXIgcmVxdWlyZXMgYSBkZWxheSBmb3Igdm9sdGFnZSBzdGFiaWxpemF0aW9uLgorICAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgcGFyYW1ldGVyICJ0U19TQyIuCisgICogQHJtdG9sbCBDU1IgICAgICBJTk1TRUwgICAgICAgICBMTF9DT01QX0NvbmZpZ0lucHV0c1xuCisgICogICAgICAgICBDU1IgICAgICBOT05JTlNFTCAgICAgICBMTF9DT01QX0NvbmZpZ0lucHV0cworICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEBwYXJhbSAgSW5wdXRNaW51cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfMV80VlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfMV8yVlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfM180VlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfVlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX0RBQzFfQ0gyICAgKDMpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19EQUMyX0NIMSAgICgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfSU8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19JTzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX0lPMyAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19JTzQKKyAgKiAgICAgICAgICgxKSBQYXJhbWV0ZXIgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzIGV4Y2VwdCBTVE0zMkYzMDF4Ni84LCBTVE0zMkYzMTh4OCwgU1RNMzJGMzAyeDYvOCwgU1RNMzJGMzAzeDYvOCwgU1RNMzJGMzI4eHgsIFNUTTMyRjMzNHh4LlxuCisgICogICAgICAgICAoMikgUGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIGRldmljZXMgU1RNMzJGMzAzeDYvOCwgU1RNMzJGMzI4eDgsIFNUTTMyRjMzNHh4LlxuCisgICogICAgICAgICAoMykgUGFyYW1ldGVyIGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcyBleGNlcHQgU1RNMzJGMzAxeDYvOCwgU1RNMzJGMzE4eDgsIFNUTTMyRjMwMnh4LlxuCisgICogQHBhcmFtICBJbnB1dFBsdXMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX1BMVVNfSU8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9QTFVTX0lPMiAgICAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfUExVU19EQUMxX0NIMV9DT01QMSAoMikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX1BMVVNfREFDMV9DSDFfQ09NUDIgKDMpCisgICoKKyAgKiAgICAgICAgICgxKSBQYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gZGV2aWNlcyBTVE0zMkYzMDJ4Qi9DLCBTVE0zMkYzMDN4Qi9DLCBTVE0zMkYzNTh4Qy5cbgorICAqICAgICAgICAgKDIpIFBhcmFtZXRlciBhdmFpbGFibGUgb24gZGV2aWNlczogU1RNMzJGMzAyeEIvQywgU1RNMzJGMzAyeEQvRSwgU1RNMzJGMzAzeEIvQy9EL0UsIFNUTTMyRjM1OHhDLCBTVE0zMkYzOTh4RS5cbgorICAqICAgICAgICAgKDMpIFBhcmFtZXRlciBhdmFpbGFibGUgb24gZGV2aWNlczogU1RNMzJGMzAxeDYvOCwgU1RNMzJGMzE4eHgsIFNUTTMyRjMwMng2LzguCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DT01QX0NvbmZpZ0lucHV0cyhDT01QX1R5cGVEZWYgKkNPTVB4LCB1aW50MzJfdCBJbnB1dE1pbnVzLCB1aW50MzJfdCBJbnB1dFBsdXMpCit7CisjaWYgZGVmaW5lZChDT01QX0NTUl9DT01QeE5PTklOU0VMKSAmJiBkZWZpbmVkKENPTVBfQ1NSX0NPTVB4U1cxKQorICBNT0RJRllfUkVHKENPTVB4LT5DU1IsCisgICAgICAgICAgICAgQ09NUF9DU1JfQ09NUHhJTlNFTCB8IENPTVBfQ1NSX0NPTVB4Tk9OSU5TRUwgfCBDT01QX0NTUl9DT01QeFNXMSwKKyAgICAgICAgICAgICBJbnB1dE1pbnVzIHwgSW5wdXRQbHVzKTsKKyNlbGlmIGRlZmluZWQoQ09NUF9DU1JfQ09NUHhOT05JTlNFTCkKKyAgTU9ESUZZX1JFRyhDT01QeC0+Q1NSLAorICAgICAgICAgICAgIENPTVBfQ1NSX0NPTVB4SU5TRUwgfCBDT01QX0NTUl9DT01QeE5PTklOU0VMLAorICAgICAgICAgICAgIElucHV0TWludXMgfCBJbnB1dFBsdXMpOworI2VsaWYgZGVmaW5lZChDT01QX0NTUl9DT01QeFNXMSkKKyAgTU9ESUZZX1JFRyhDT01QeC0+Q1NSLAorICAgICAgICAgICAgIENPTVBfQ1NSX0NPTVB4SU5TRUwgfCBDT01QX0NTUl9DT01QeFNXMSwKKyAgICAgICAgICAgICBJbnB1dE1pbnVzIHwgSW5wdXRQbHVzKTsKKyNlbHNlCisgIC8qIERldmljZSB3aXRob3V0IGNvbXBhcmF0b3IgaW5wdXQgcGx1cyBjb25maWd1cmFibGUgKi8KKyAgLyogTm8gdXBkYXRlIG9mIGNvbXBhcmF0b3IgcmVnaXN0ZXIgKGNvcnJlc3BvbmRzIHRvIHNldHRpbmcgICAgICAgICAgICAgICAgICovCisgIC8qICJMTF9DT01QX0lOUFVUX1BMVVNfSU8xIiBvciAiTExfQ09NUF9JTlBVVF9QTFVTX0lPMiIgY29tcGFyZWQgdG8gICAgICAgICAqLworICAvKiBvdGhlciBTVE0zMkYzIGRldmljZXMsIGRlcGVuZGluZyBvbiBjb21wYXJhdG9yIGluc3RhbmNlICAgICAgICAgICAgICAgICAgKi8KKyAgLyogKHJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwpKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIE1PRElGWV9SRUcoQ09NUHgtPkNTUiwKKyAgICAgICAgICAgICBDT01QX0NTUl9DT01QeElOU0VMLAorICAgICAgICAgICAgIElucHV0TWludXMpOworI2VuZGlmCit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGNvbXBhcmF0b3IgaW5wdXQgcGx1cyAobm9uLWludmVydGluZykuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIGNvbXBhcmF0b3IgaW5wdXQgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElPOgorICAqICAgICAgICAgR1BJTyBwaW5zIGFyZSBzcGVjaWZpYyB0byBlYWNoIGNvbXBhcmF0b3IgaW5zdGFuY2UuCisgICogICAgICAgICBSZWZlciB0byBkZXNjcmlwdGlvbiBvZiBwYXJhbWV0ZXJzIG9yIHRvIHJlZmVyZW5jZSBtYW51YWwuCisgICogQHJtdG9sbCBDU1IgICAgICBOT05JTlNFTCAgICAgICBMTF9DT01QX1NldElucHV0UGx1cworICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEBwYXJhbSAgSW5wdXRQbHVzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9QTFVTX0lPMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfUExVU19JTzIgICAgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX1BMVVNfREFDMV9DSDFfQ09NUDEgKDIpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9QTFVTX0RBQzFfQ0gxX0NPTVAyICgzKQorICAqCisgICogICAgICAgICAoMSkgUGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIGRldmljZXMgU1RNMzJGMzAyeEIvQywgU1RNMzJGMzAzeEIvQywgU1RNMzJGMzU4eEMuXG4KKyAgKiAgICAgICAgICgyKSBQYXJhbWV0ZXIgYXZhaWxhYmxlIG9uIGRldmljZXM6IFNUTTMyRjMwMnhCL0MsIFNUTTMyRjMwMnhEL0UsIFNUTTMyRjMwM3hCL0MvRC9FLCBTVE0zMkYzNTh4QywgU1RNMzJGMzk4eEUuXG4KKyAgKiAgICAgICAgICgzKSBQYXJhbWV0ZXIgYXZhaWxhYmxlIG9uIGRldmljZXM6IFNUTTMyRjMwMXg2LzgsIFNUTTMyRjMxOHh4LCBTVE0zMkYzMDJ4Ni84LgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ09NUF9TZXRJbnB1dFBsdXMoQ09NUF9UeXBlRGVmICpDT01QeCwgdWludDMyX3QgSW5wdXRQbHVzKQoreworI2lmIGRlZmluZWQoQ09NUF9DU1JfQ09NUHhOT05JTlNFTCkgJiYgZGVmaW5lZChDT01QX0NTUl9DT01QeFNXMSkKKyAgTU9ESUZZX1JFRyhDT01QeC0+Q1NSLCAoQ09NUF9DU1JfQ09NUHhOT05JTlNFTCB8IENPTVBfQ1NSX0NPTVB4U1cxKSwgSW5wdXRQbHVzKTsKKyNlbGlmIGRlZmluZWQoQ09NUF9DU1JfQ09NUHhOT05JTlNFTCkKKyAgTU9ESUZZX1JFRyhDT01QeC0+Q1NSLCBDT01QX0NTUl9DT01QeE5PTklOU0VMLCBJbnB1dFBsdXMpOworI2VsaWYgZGVmaW5lZChDT01QX0NTUl9DT01QeFNXMSkKKyAgTU9ESUZZX1JFRyhDT01QeC0+Q1NSLCBDT01QX0NTUl9DT01QeFNXMSwgSW5wdXRQbHVzKTsKKyNlbHNlCisgIC8qIERldmljZSB3aXRob3V0IGNvbXBhcmF0b3IgaW5wdXQgcGx1cyBjb25maWd1cmFibGUgKi8KKyAgLyogTm8gdXBkYXRlIG9mIGNvbXBhcmF0b3IgcmVnaXN0ZXIgKGNvcnJlc3BvbmRzIHRvIHNldHRpbmcgICAgICAgICAgICAgICAgICovCisgIC8qICJMTF9DT01QX0lOUFVUX1BMVVNfSU8xIiBvciAiTExfQ09NUF9JTlBVVF9QTFVTX0lPMiIgY29tcGFyZWQgdG8gICAgICAgICAqLworICAvKiBvdGhlciBTVE0zMkYzIGRldmljZXMsIGRlcGVuZGluZyBvbiBjb21wYXJhdG9yIGluc3RhbmNlICAgICAgICAgICAgICAgICAgKi8KKyAgLyogKHJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwpKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZW5kaWYKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY29tcGFyYXRvciBpbnB1dCBwbHVzIChub24taW52ZXJ0aW5nKS4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgY29tcGFyYXRvciBpbnB1dCBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gSU86CisgICogICAgICAgICBHUElPIHBpbnMgYXJlIHNwZWNpZmljIHRvIGVhY2ggY29tcGFyYXRvciBpbnN0YW5jZS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHBhcmFtZXRlcnMgb3IgdG8gcmVmZXJlbmNlIG1hbnVhbC4KKyAgKiBAcm10b2xsIENTUiAgICAgIE5PTklOU0VMICAgICAgIExMX0NPTVBfR2V0SW5wdXRQbHVzCisgICogQHBhcmFtICBDT01QeCBDb21wYXJhdG9yIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfUExVU19JTzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX1BMVVNfSU8yICAgICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9QTFVTX0RBQzFfQ0gxX0NPTVAxICgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfUExVU19EQUMxX0NIMV9DT01QMiAoMykKKyAgKgorICAqICAgICAgICAgKDEpIFBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBkZXZpY2VzIFNUTTMyRjMwMnhCL0MsIFNUTTMyRjMwM3hCL0MsIFNUTTMyRjM1OHhDLlxuCisgICogICAgICAgICAoMikgUGFyYW1ldGVyIGF2YWlsYWJsZSBvbiBkZXZpY2VzOiBTVE0zMkYzMDJ4Qi9DLCBTVE0zMkYzMDJ4RC9FLCBTVE0zMkYzMDN4Qi9DL0QvRSwgU1RNMzJGMzU4eEMsIFNUTTMyRjM5OHhFLlxuCisgICogICAgICAgICAoMykgUGFyYW1ldGVyIGF2YWlsYWJsZSBvbiBkZXZpY2VzOiBTVE0zMkYzMDF4Ni84LCBTVE0zMkYzMTh4eCwgU1RNMzJGMzAyeDYvOC4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DT01QX0dldElucHV0UGx1cyhDT01QX1R5cGVEZWYgKkNPTVB4KQoreworI2lmIGRlZmluZWQoQ09NUF9DU1JfQ09NUHhOT05JTlNFTCkgJiYgZGVmaW5lZChDT01QX0NTUl9DT01QeFNXMSkKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ09NUHgtPkNTUiwgKENPTVBfQ1NSX0NPTVB4Tk9OSU5TRUwgfCBDT01QX0NTUl9DT01QeFNXMSkpKTsKKyNlbGlmIGRlZmluZWQoQ09NUF9DU1JfQ09NUHhOT05JTlNFTCkKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ09NUHgtPkNTUiwgQ09NUF9DU1JfQ09NUHhOT05JTlNFTCkpOworI2VsaWYgZGVmaW5lZChDT01QX0NTUl9DT01QeFNXMSkKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ09NUHgtPkNTUiwgQ09NUF9DU1JfQ09NUHhTVzEpKTsKKyNlbHNlCisgIC8qIERldmljZSB3aXRob3V0IGNvbXBhcmF0b3IgaW5wdXQgcGx1cyBjb25maWd1cmFibGUgKi8KKyAgLyogTm8gdXBkYXRlIG9mIGNvbXBhcmF0b3IgcmVnaXN0ZXIgKGNvcnJlc3BvbmRzIHRvIHNldHRpbmcgICAgICAgICAgICAgICAgICovCisgIC8qICJMTF9DT01QX0lOUFVUX1BMVVNfSU8xIiBvciAiTExfQ09NUF9JTlBVVF9QTFVTX0lPMiIgY29tcGFyZWQgdG8gICAgICAgICAqLworICAvKiBvdGhlciBTVE0zMkYzIGRldmljZXMsIGRlcGVuZGluZyBvbiBjb21wYXJhdG9yIGluc3RhbmNlICAgICAgICAgICAgICAgICAgKi8KKyAgLyogKHJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwpKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHJldHVybiAoTExfQ09NUF9JTlBVVF9QTFVTX0lPMSk7CisjZW5kaWYKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgY29tcGFyYXRvciBpbnB1dCBtaW51cyAoaW52ZXJ0aW5nKS4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgY29tcGFyYXRvciBpbnB1dCBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gSU86CisgICogICAgICAgICBHUElPIHBpbnMgYXJlIHNwZWNpZmljIHRvIGVhY2ggY29tcGFyYXRvciBpbnN0YW5jZS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHBhcmFtZXRlcnMgb3IgdG8gcmVmZXJlbmNlIG1hbnVhbC4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIGEgdm9sdGFnZSBzY2FsZXIgaXMgdXNlZAorICAqICAgICAgICAgd2hlbiBDT01QIGlucHV0IGlzIGJhc2VkIG9uIFZyZWZJbnQgKFZyZWZJbnQgb3Igc3ViZGl2aXNpb24KKyAgKiAgICAgICAgIG9mIFZyZWZJbnQpOgorICAqICAgICAgICAgVm9sdGFnZSBzY2FsZXIgcmVxdWlyZXMgYSBkZWxheSBmb3Igdm9sdGFnZSBzdGFiaWxpemF0aW9uLgorICAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgcGFyYW1ldGVyICJ0U19TQyIuCisgICogQHJtdG9sbCBDU1IgICAgICBJTk1TRUwgICAgICAgICBMTF9DT01QX1NldElucHV0TWludXMKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIElucHV0TWludXMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTXzFfNFZSRUZJTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTXzFfMlZSRUZJTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTXzNfNFZSRUZJTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX1ZSRUZJTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX0RBQzFfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMiAgICgzKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfREFDMl9DSDEgICAoMikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX0lPMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfSU8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19JTzMgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfSU80CisgICogICAgICAgICAoMSkgUGFyYW1ldGVyIGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcyBleGNlcHQgU1RNMzJGMzAxeDYvOCwgU1RNMzJGMzE4eDgsIFNUTTMyRjMwMng2LzgsIFNUTTMyRjMwM3g2LzgsIFNUTTMyRjMyOHh4LCBTVE0zMkYzMzR4eC5cbgorICAqICAgICAgICAgKDIpIFBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBkZXZpY2VzIFNUTTMyRjMwM3g2LzgsIFNUTTMyRjMyOHg4LCBTVE0zMkYzMzR4eC5cbgorICAqICAgICAgICAgKDMpIFBhcmFtZXRlciBhdmFpbGFibGUgb24gYWxsIGRldmljZXMgZXhjZXB0IFNUTTMyRjMwMXg2LzgsIFNUTTMyRjMxOHg4LCBTVE0zMkYzMDJ4eC5cbgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ09NUF9TZXRJbnB1dE1pbnVzKENPTVBfVHlwZURlZiAqQ09NUHgsIHVpbnQzMl90IElucHV0TWludXMpCit7CisgIE1PRElGWV9SRUcoQ09NUHgtPkNTUiwgQ09NUF9DU1JfQ09NUHhJTlNFTCwgSW5wdXRNaW51cyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNvbXBhcmF0b3IgaW5wdXQgbWludXMgKGludmVydGluZykuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIGNvbXBhcmF0b3IgaW5wdXQgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElPOgorICAqICAgICAgICAgR1BJTyBwaW5zIGFyZSBzcGVjaWZpYyB0byBlYWNoIGNvbXBhcmF0b3IgaW5zdGFuY2UuCisgICogICAgICAgICBSZWZlciB0byBkZXNjcmlwdGlvbiBvZiBwYXJhbWV0ZXJzIG9yIHRvIHJlZmVyZW5jZSBtYW51YWwuCisgICogQHJtdG9sbCBDU1IgICAgICBJTk1TRUwgICAgICAgICBMTF9DT01QX0dldElucHV0TWludXMKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU18xXzRWUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU18xXzJWUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU18zXzRWUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19WUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDIgICAoMykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX0RBQzJfQ0gxICAgKDIpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19JTzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX0lPMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfSU8zICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX0lPNAorICAqICAgICAgICAgKDEpIFBhcmFtZXRlciBhdmFpbGFibGUgb24gYWxsIGRldmljZXMgZXhjZXB0IFNUTTMyRjMwMXg2LzgsIFNUTTMyRjMxOHg4LCBTVE0zMkYzMDJ4Ni84LCBTVE0zMkYzMDN4Ni84LCBTVE0zMkYzMjh4eCwgU1RNMzJGMzM0eHguXG4KKyAgKiAgICAgICAgICgyKSBQYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gZGV2aWNlcyBTVE0zMkYzMDN4Ni84LCBTVE0zMkYzMjh4OCwgU1RNMzJGMzM0eHguXG4KKyAgKiAgICAgICAgICgzKSBQYXJhbWV0ZXIgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzIGV4Y2VwdCBTVE0zMkYzMDF4Ni84LCBTVE0zMkYzMTh4OCwgU1RNMzJGMzAyeHguXG4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DT01QX0dldElucHV0TWludXMoQ09NUF9UeXBlRGVmICpDT01QeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ09NUHgtPkNTUiwgQ09NUF9DU1JfQ09NUHhJTlNFTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBjb21wYXJhdG9yIGluc3RhbmNlIGh5c3RlcmVzaXMgbW9kZSBvZiB0aGUgaW5wdXQgbWludXMgKGludmVydGluZyBpbnB1dCkuCisgICogQHJtdG9sbCBDU1IgICAgICBDT01QeEhZU1QgICAgICBMTF9DT01QX1NldElucHV0SHlzdGVyZXNpcworICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEBwYXJhbSAgSW5wdXRIeXN0ZXJlc2lzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9IWVNURVJFU0lTX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0hZU1RFUkVTSVNfTE9XICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9IWVNURVJFU0lTX01FRElVTSAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSFlTVEVSRVNJU19ISUdIICAgICAgICAoMSkKKyAgKgorICAqICAgICAgICAgKDEpIFBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBkZXZpY2VzOiBTVE0zMkYzMDJ4Qi9DLCBTVE0zMkYzMDN4Qi9DLCBTVE0zMkYzNTh4QworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ09NUF9TZXRJbnB1dEh5c3RlcmVzaXMoQ09NUF9UeXBlRGVmICpDT01QeCwgdWludDMyX3QgSW5wdXRIeXN0ZXJlc2lzKQoreworI2lmIGRlZmluZWQoQ09NUF9DU1JfQ09NUHhIWVNUKQorICBNT0RJRllfUkVHKENPTVB4LT5DU1IsIENPTVBfQ1NSX0NPTVB4SFlTVCwgSW5wdXRIeXN0ZXJlc2lzKTsKKyNlbHNlCisgIC8qIERldmljZSB3aXRob3V0IGNvbXBhcmF0b3IgaW5wdXQgaHlzdGVyZXNpcyAqLworICAvKiBObyB1cGRhdGUgb2YgY29tcGFyYXRvciByZWdpc3RlciAoY29ycmVzcG9uZHMgdG8gc2V0dGluZyAgICAgICAgICAgICAgICAgKi8KKyAgLyogIkxMX0NPTVBfSFlTVEVSRVNJU19OT05FIikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZW5kaWYKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY29tcGFyYXRvciBpbnN0YW5jZSBoeXN0ZXJlc2lzIG1vZGUgb2YgdGhlIG1pbnVzIChpbnZlcnRpbmcpIGlucHV0LgorICAqIEBybXRvbGwgQ1NSICAgICAgQ09NUHhIWVNUICAgICAgTExfQ09NUF9HZXRJbnB1dEh5c3RlcmVzaXMKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9IWVNURVJFU0lTX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0hZU1RFUkVTSVNfTE9XICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9IWVNURVJFU0lTX01FRElVTSAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSFlTVEVSRVNJU19ISUdIICAgICAgICAoMSkKKyAgKgorICAqICAgICAgICAgKDEpIFBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBkZXZpY2VzOiBTVE0zMkYzMDJ4Qi9DLCBTVE0zMkYzMDN4Qi9DLCBTVE0zMkYzNTh4QworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NPTVBfR2V0SW5wdXRIeXN0ZXJlc2lzKENPTVBfVHlwZURlZiAqQ09NUHgpCit7CisjaWYgZGVmaW5lZChDT01QX0NTUl9DT01QeEhZU1QpCisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKENPTVB4LT5DU1IsIENPTVBfQ1NSX0NPTVB4SFlTVCkpOworI2Vsc2UKKyAgLyogRGV2aWNlIHdpdGhvdXQgY29tcGFyYXRvciBpbnB1dCBoeXN0ZXJlc2lzICovCisgIHJldHVybiAoTExfQ09NUF9IWVNURVJFU0lTX05PTkUpOworI2VuZGlmCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FRl9Db25maWd1cmF0aW9uX2NvbXBhcmF0b3Jfb3V0cHV0IENvbmZpZ3VyYXRpb24gb2YgY29tcGFyYXRvciBvdXRwdXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBjb21wYXJhdG9yIG91dHB1dCBzZWxlY3Rpb24uCisgICogQG5vdGUgICBBdmFpbGFiaWxpdHkgb2YgcGFyYW1ldGVycyBvZiBvdXRwdXQgc2VsZWN0aW9uIHRvIHRpbWVyCisgICogICAgICAgICBkZXBlbmRzIG9uIHRpbWVycyBhdmFpbGFiaWxpdHkgb24gdGhlIHNlbGVjdGVkIGRldmljZS4KKyAgKiBAcm10b2xsIENTUiAgICAgIENPTVB4T1VUU0VMICAgIExMX0NPTVBfU2V0T3V0cHV0U2VsZWN0aW9uCisgICogQHBhcmFtICBDT01QeCBDb21wYXJhdG9yIGluc3RhbmNlCisgICogQHBhcmFtICBPdXRwdXRTZWxlY3Rpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNMV9CS0lOCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNMV9CS0lOMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX1RJTTFfVElNOF9CS0lOMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX1RJTThfQktJTiAgICAgICAgICAgICAgKDQpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNOF9CS0lOMiAgICAgICAgICAgICAoNCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0xX1RJTThfQktJTjIgICAgICAgICg0KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX1RJTTIwX0JLSU4gICAgICAgICAgICAgKDUpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNMjBfQktJTjIgICAgICAgICAgICAoNSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0xX1RJTThfVElNMjBfQktJTjIgICg1KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX1RJTTFfT0NDTFJfQ09NUDFfMl8zXzcgKDQpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNMl9PQ0NMUl9DT01QMV8yXzMgICAoNCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0zX09DQ0xSX0NPTVAxXzJfNF81ICg0KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX1RJTThfT0NDTFJfQ09NUDRfNV82XzcgKDQpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNM19PQ0NMUl9DT01QMl80ICAgICAoNikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0xX0lDMV9DT01QMiAgICAgICAgICgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX1RJTTJfSUM0X0NPTVAyICAgICAgICAgKDIpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNM19JQzFfQ09NUDIgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0xX0lDMV9DT01QMV8yICAgICAgICgzKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX1RJTTJfSUM0X0NPTVAxXzIgICAgICAgKDMpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNM19JQzFfQ09NUDFfMiAgICAgICAoMykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0yMF9PQ0NMUl9DT01QMiAgICAgICg1KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX1RJTTNfSUMyX0NPTVAzICAgICAgICAgKDQpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNNF9JQzFfQ09NUDMgICAgICAgICAoNCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0xNV9JQzFfQ09NUDMgICAgICAgICg0KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX1RJTTE1X0JLSU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0zX0lDM19DT01QNCAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX1RJTTRfSUMyX0NPTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNMTVfSUMyX0NPTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNMTVfT0NDTFJfQ09NUDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0yX0lDMV9DT01QNSAgICAgICAgICg0KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX1RJTTRfSUMzX0NPTVA1ICAgICAgICAgKDQpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNMTdfSUMxX0NPTVA1ICAgICAgICAoNCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0xNl9CS0lOCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNMl9JQzJfQ09NUDYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0yX09DQ0xSX0NPTVA2CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNNF9JQzRfQ09NUDYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0xNl9JQzFfQ09NUDYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0xNl9PQ0NMUl9DT01QNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX1RJTTFfSUMyX0NPTVA3ICAgICAgICAgKDQpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNMl9JQzNfQ09NUDcgICAgICAgICAoNCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0xN19PQ0NMUl9DT01QNyAgICAgICg0KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX1RJTTE3X0JLSU4gICAgICAgICAgICAgKDQpCisgICoKKyAgKiAgICAgICAgICgxKSBQYXJhbWV0ZXIgYXZhaWxhYmxlIG9uIGRldmljZXM6IFNUTTMyRjMwMng4LCBTVE0zMkYzMTh4eCwgU1RNMzJGMzAzeDgsIFNUTTMyRjMyOHh4LCBTVE0zMkYzMzR4OCwgU1RNMzJGMzAyeEMsIFNUTTMyRjMwMnhFLCBTVE0zMkYzMDN4QywgU1RNMzJGMzU4eHgsIFNUTTMyRjMwM3hFLCBTVE0zMkYzOTh4eC5cbgorICAqICAgICAgICAgKDIpIFBhcmFtZXRlciBhdmFpbGFibGUgb24gZGV2aWNlczogU1RNMzJGMzAxeDgsIFNUTTMyRjMwMng4LCBTVE0zMkYzMTh4eCwgU1RNMzJGMzAzeDgsIFNUTTMyRjMyOHh4LCBTVE0zMkYzMzR4OC5cbgorICAqICAgICAgICAgKDMpIFBhcmFtZXRlciBhdmFpbGFibGUgb24gZGV2aWNlczogU1RNMzJGMzAyeEMsIFNUTTMyRjMwMnhFLCBTVE0zMkYzMDN4QywgU1RNMzJGMzU4eHgsIFNUTTMyRjMwM3hFLCBTVE0zMkYzOTh4eC5cbgorICAqICAgICAgICAgKDQpIFBhcmFtZXRlciBhdmFpbGFibGUgb24gZGV2aWNlczogU1RNMzJGMzAzeEMsIFNUTTMyRjM1OHh4LCBTVE0zMkYzMDN4RSwgU1RNMzJGMzk4eHguXG4KKyAgKiAgICAgICAgICg1KSBQYXJhbWV0ZXIgYXZhaWxhYmxlIG9uIGRldmljZXM6IFNUTTMyRjMwM3hFLCBTVE0zMkYzOTh4eC5cbgorICAqICAgICAgICAgKDYpIFBhcmFtZXRlciBhdmFpbGFibGUgb24gZGV2aWNlczogU1RNMzJGMzAzeDgsIFNUTTMyRjMyOHh4LCBTVE0zMkYzMzR4OC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NPTVBfU2V0T3V0cHV0U2VsZWN0aW9uKENPTVBfVHlwZURlZiAqQ09NUHgsIHVpbnQzMl90IE91dHB1dFNlbGVjdGlvbikKK3sKKyAgTU9ESUZZX1JFRyhDT01QeC0+Q1NSLCBDT01QX0NTUl9DT01QeE9VVFNFTCwgT3V0cHV0U2VsZWN0aW9uKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY29tcGFyYXRvciBvdXRwdXQgc2VsZWN0aW9uLgorICAqIEBub3RlICAgQXZhaWxhYmlsaXR5IG9mIHBhcmFtZXRlcnMgb2Ygb3V0cHV0IHNlbGVjdGlvbiB0byB0aW1lcgorICAqICAgICAgICAgZGVwZW5kcyBvbiB0aW1lcnMgYXZhaWxhYmlsaXR5IG9uIHRoZSBzZWxlY3RlZCBkZXZpY2UuCisgICogQHJtdG9sbCBDU1IgICAgICBDT01QeE9VVFNFTCAgICBMTF9DT01QX0dldE91dHB1dFNlbGVjdGlvbgorICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNMV9CS0lOCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNMV9CS0lOMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX1RJTTFfVElNOF9CS0lOMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX1RJTThfQktJTiAgICAgICAgICAgICAgKDQpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNOF9CS0lOMiAgICAgICAgICAgICAoNCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0xX1RJTThfQktJTjIgICAgICAgICg0KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX1RJTTIwX0JLSU4gICAgICAgICAgICAgKDUpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNMjBfQktJTjIgICAgICAgICAgICAoNSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0xX1RJTThfVElNMjBfQktJTjIgICg1KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX1RJTTFfT0NDTFJfQ09NUDFfMl8zXzcgKDQpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNMl9PQ0NMUl9DT01QMV8yXzMgICAoNCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0zX09DQ0xSX0NPTVAxXzJfNF81ICg0KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX1RJTThfT0NDTFJfQ09NUDRfNV82XzcgKDQpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNM19PQ0NMUl9DT01QMl80ICAgICAoNikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0xX0lDMV9DT01QMiAgICAgICAgICgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX1RJTTJfSUM0X0NPTVAyICAgICAgICAgKDIpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNM19JQzFfQ09NUDIgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0xX0lDMV9DT01QMV8yICAgICAgICgzKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX1RJTTJfSUM0X0NPTVAxXzIgICAgICAgKDMpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNM19JQzFfQ09NUDFfMiAgICAgICAoMykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0yMF9PQ0NMUl9DT01QMiAgICAgICg1KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX1RJTTNfSUMyX0NPTVAzICAgICAgICAgKDQpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNNF9JQzFfQ09NUDMgICAgICAgICAoNCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0xNV9JQzFfQ09NUDMgICAgICAgICg0KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX1RJTTE1X0JLSU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0zX0lDM19DT01QNCAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX1RJTTRfSUMyX0NPTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNMTVfSUMyX0NPTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNMTVfT0NDTFJfQ09NUDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0yX0lDMV9DT01QNSAgICAgICAgICg0KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX1RJTTRfSUMzX0NPTVA1ICAgICAgICAgKDQpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNMTdfSUMxX0NPTVA1ICAgICAgICAoNCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0xNl9CS0lOCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNMl9JQzJfQ09NUDYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0yX09DQ0xSX0NPTVA2CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNNF9JQzRfQ09NUDYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0xNl9JQzFfQ09NUDYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0xNl9PQ0NMUl9DT01QNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX1RJTTFfSUMyX0NPTVA3ICAgICAgICAgKDQpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNMl9JQzNfQ09NUDcgICAgICAgICAoNCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0xN19PQ0NMUl9DT01QNyAgICAgICg0KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX1RJTTE3X0JLSU4gICAgICAgICAgICAgKDQpCisgICoKKyAgKiAgICAgICAgICgxKSBQYXJhbWV0ZXIgYXZhaWxhYmxlIG9uIGRldmljZXM6IFNUTTMyRjMwMng4LCBTVE0zMkYzMTh4eCwgU1RNMzJGMzAzeDgsIFNUTTMyRjMyOHh4LCBTVE0zMkYzMzR4OCwgU1RNMzJGMzAyeEMsIFNUTTMyRjMwMnhFLCBTVE0zMkYzMDN4QywgU1RNMzJGMzU4eHgsIFNUTTMyRjMwM3hFLCBTVE0zMkYzOTh4eC5cbgorICAqICAgICAgICAgKDIpIFBhcmFtZXRlciBhdmFpbGFibGUgb24gZGV2aWNlczogU1RNMzJGMzAxeDgsIFNUTTMyRjMwMng4LCBTVE0zMkYzMTh4eCwgU1RNMzJGMzAzeDgsIFNUTTMyRjMyOHh4LCBTVE0zMkYzMzR4OC5cbgorICAqICAgICAgICAgKDMpIFBhcmFtZXRlciBhdmFpbGFibGUgb24gZGV2aWNlczogU1RNMzJGMzAyeEMsIFNUTTMyRjMwMnhFLCBTVE0zMkYzMDN4QywgU1RNMzJGMzU4eHgsIFNUTTMyRjMwM3hFLCBTVE0zMkYzOTh4eC5cbgorICAqICAgICAgICAgKDQpIFBhcmFtZXRlciBhdmFpbGFibGUgb24gZGV2aWNlczogU1RNMzJGMzAzeEMsIFNUTTMyRjM1OHh4LCBTVE0zMkYzMDN4RSwgU1RNMzJGMzk4eHguXG4KKyAgKiAgICAgICAgICg1KSBQYXJhbWV0ZXIgYXZhaWxhYmxlIG9uIGRldmljZXM6IFNUTTMyRjMwM3hFLCBTVE0zMkYzOTh4eC5cbgorICAqICAgICAgICAgKDYpIFBhcmFtZXRlciBhdmFpbGFibGUgb24gZGV2aWNlczogU1RNMzJGMzAzeDgsIFNUTTMyRjMyOHh4LCBTVE0zMkYzMzR4OC4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DT01QX0dldE91dHB1dFNlbGVjdGlvbihDT01QX1R5cGVEZWYgKkNPTVB4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDT01QeC0+Q1NSLCBDT01QX0NTUl9DT01QeE9VVFNFTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBjb21wYXJhdG9yIGluc3RhbmNlIG91dHB1dCBwb2xhcml0eS4KKyAgKiBAcm10b2xsIENTUiAgICAgIENPTVB4UE9MICAgICAgIExMX0NPTVBfU2V0T3V0cHV0UG9sYXJpdHkKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIE91dHB1dFBvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRQT0xfTk9OSU5WRVJURUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVFBPTF9JTlZFUlRFRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ09NUF9TZXRPdXRwdXRQb2xhcml0eShDT01QX1R5cGVEZWYgKkNPTVB4LCB1aW50MzJfdCBPdXRwdXRQb2xhcml0eSkKK3sKKyAgTU9ESUZZX1JFRyhDT01QeC0+Q1NSLCBDT01QX0NTUl9DT01QeFBPTCwgT3V0cHV0UG9sYXJpdHkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjb21wYXJhdG9yIGluc3RhbmNlIG91dHB1dCBwb2xhcml0eS4KKyAgKiBAcm10b2xsIENTUiAgICAgIENPTVB4UE9MICAgICAgIExMX0NPTVBfR2V0T3V0cHV0UG9sYXJpdHkKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRQT0xfTk9OSU5WRVJURUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVFBPTF9JTlZFUlRFRAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NPTVBfR2V0T3V0cHV0UG9sYXJpdHkoQ09NUF9UeXBlRGVmICpDT01QeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ09NUHgtPkNTUiwgQ09NUF9DU1JfQ09NUHhQT0wpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgY29tcGFyYXRvciBpbnN0YW5jZSBibGFua2luZyBzb3VyY2UuCisgICogQG5vdGUgICBCbGFua2luZyBzb3VyY2UgbWF5IGJlIHNwZWNpZmljIHRvIGVhY2ggY29tcGFyYXRvciBpbnN0YW5jZS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHBhcmFtZXRlcnMgb3IgdG8gcmVmZXJlbmNlIG1hbnVhbC4KKyAgKiBAbm90ZSAgIEF2YWlsYWJpbGl0eSBvZiBwYXJhbWV0ZXJzIG9mIGJsYW5raW5nIHNvdXJjZSBmcm9tIHRpbWVyCisgICogICAgICAgICBkZXBlbmRzIG9uIHRpbWVycyBhdmFpbGFiaWxpdHkgb24gdGhlIHNlbGVjdGVkIGRldmljZS4KKyAgKiBAcm10b2xsIENTUiAgICAgIENPTVB4QkxBTktJTkcgIExMX0NPTVBfU2V0T3V0cHV0QmxhbmtpbmdTb3VyY2UKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEJsYW5raW5nU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9CTEFOS0lOR1NSQ19OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0xX09DNV9DT01QMiAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTJfT0MzX0NPTVAyICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfQkxBTktJTkdTUkNfVElNM19PQzNfQ09NUDIgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0xX09DNV9DT01QMV8yICAgICAoMikoMykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTJfT0MzX0NPTVAxXzIgICAgICgyKSgzKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfQkxBTktJTkdTUkNfVElNM19PQzNfQ09NUDFfMiAgICAgKDIpKDMpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0zX09DNF9DT01QNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfQkxBTktJTkdTUkNfVElNMTVfT0MxX0NPTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0yX09DNF9DT01QNiAgICAgICAoMikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTE1X09DMl9DT01QNiAgICAgICgxKSgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfQkxBTktJTkdTUkNfVElNMV9PQzVfQ09NUDFfMl83ICAgKDMpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0yX09DNF9DT01QM182ICAgICAoMykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTThfT0M1X0NPTVA0XzVfNl83ICgzKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfQkxBTktJTkdTUkNfVElNMTVfT0MyX0NPTVA2XzcgICAgKDMpCisgICoKKyAgKiAgICAgICAgICgxKSBQYXJhbWV0ZXIgYXZhaWxhYmxlIG9uIGRldmljZXM6IFNUTTMyRjMwMXg4LCBTVE0zMkYzMDJ4OCwgU1RNMzJGMzE4eHgsIFNUTTMyRjMwM3g4LCBTVE0zMkYzMzR4OCwgU1RNMzJGMzI4eHguXG4KKyAgKiAgICAgICAgICgyKSBQYXJhbWV0ZXIgYXZhaWxhYmxlIG9uIGRldmljZXM6IFNUTTMyRjMwMnhFLCBTVE0zMkYzMDJ4Qy5cbgorICAqICAgICAgICAgKDMpIFBhcmFtZXRlciBhdmFpbGFibGUgb24gZGV2aWNlczogU1RNMzJGMzAzeEUsIFNUTTMyRjM5OHh4LCBTVE0zMkYzMDN4QywgU1RNMzJGMzU4eHguCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DT01QX1NldE91dHB1dEJsYW5raW5nU291cmNlKENPTVBfVHlwZURlZiAqQ09NUHgsIHVpbnQzMl90IEJsYW5raW5nU291cmNlKQoreworICBNT0RJRllfUkVHKENPTVB4LT5DU1IsIENPTVBfQ1NSX0NPTVB4QkxBTktJTkcsIEJsYW5raW5nU291cmNlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY29tcGFyYXRvciBpbnN0YW5jZSBibGFua2luZyBzb3VyY2UuCisgICogQG5vdGUgICBBdmFpbGFiaWxpdHkgb2YgcGFyYW1ldGVycyBvZiBibGFua2luZyBzb3VyY2UgZnJvbSB0aW1lcgorICAqICAgICAgICAgZGVwZW5kcyBvbiB0aW1lcnMgYXZhaWxhYmlsaXR5IG9uIHRoZSBzZWxlY3RlZCBkZXZpY2UuCisgICogQG5vdGUgICBCbGFua2luZyBzb3VyY2UgbWF5IGJlIHNwZWNpZmljIHRvIGVhY2ggY29tcGFyYXRvciBpbnN0YW5jZS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHBhcmFtZXRlcnMgb3IgdG8gcmVmZXJlbmNlIG1hbnVhbC4KKyAgKiBAcm10b2xsIENTUiAgICAgIENPTVB4QkxBTktJTkcgIExMX0NPTVBfR2V0T3V0cHV0QmxhbmtpbmdTb3VyY2UKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9CTEFOS0lOR1NSQ19OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0xX09DNV9DT01QMiAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTJfT0MzX0NPTVAyICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfQkxBTktJTkdTUkNfVElNM19PQzNfQ09NUDIgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0xX09DNV9DT01QMV8yICAgICAoMikoMykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTJfT0MzX0NPTVAxXzIgICAgICgyKSgzKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfQkxBTktJTkdTUkNfVElNM19PQzNfQ09NUDFfMiAgICAgKDIpKDMpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0zX09DNF9DT01QNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfQkxBTktJTkdTUkNfVElNMTVfT0MxX0NPTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0yX09DNF9DT01QNiAgICAgICAoMikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTE1X09DMl9DT01QNiAgICAgICgxKSgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfQkxBTktJTkdTUkNfVElNMV9PQzVfQ09NUDFfMl83ICAgKDMpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0yX09DNF9DT01QM182ICAgICAoMykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTThfT0M1X0NPTVA0XzVfNl83ICgzKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfQkxBTktJTkdTUkNfVElNMTVfT0MyX0NPTVA2XzcgICAgKDMpCisgICoKKyAgKiAgICAgICAgICgxKSBQYXJhbWV0ZXIgYXZhaWxhYmxlIG9uIGRldmljZXM6IFNUTTMyRjMwMXg4LCBTVE0zMkYzMDJ4OCwgU1RNMzJGMzE4eHgsIFNUTTMyRjMwM3g4LCBTVE0zMkYzMzR4OCwgU1RNMzJGMzI4eHguXG4KKyAgKiAgICAgICAgICgyKSBQYXJhbWV0ZXIgYXZhaWxhYmxlIG9uIGRldmljZXM6IFNUTTMyRjMwMnhFLCBTVE0zMkYzMDJ4Qy5cbgorICAqICAgICAgICAgKDMpIFBhcmFtZXRlciBhdmFpbGFibGUgb24gZGV2aWNlczogU1RNMzJGMzAzeEUsIFNUTTMyRjM5OHh4LCBTVE0zMkYzMDN4QywgU1RNMzJGMzU4eHguCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ09NUF9HZXRPdXRwdXRCbGFua2luZ1NvdXJjZShDT01QX1R5cGVEZWYgKkNPTVB4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDT01QeC0+Q1NSLCBDT01QX0NTUl9DT01QeEJMQU5LSU5HKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FRl9PcGVyYXRpb24gT3BlcmF0aW9uIG9uIGNvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBjb21wYXJhdG9yIGluc3RhbmNlLgorICAqIEBub3RlICAgQWZ0ZXIgZW5hYmxlIGZyb20gb2ZmIHN0YXRlLCBjb21wYXJhdG9yIHJlcXVpcmVzIGEgZGVsYXkKKyAgKiAgICAgICAgIHRvIHJlYWNoIHJlYWNoIHByb3BhZ2F0aW9uIGRlbGF5IHNwZWNpZmljYXRpb24uCisgICogICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCBwYXJhbWV0ZXIgInRTVEFSVCIuCisgICogQHJtdG9sbCBDU1IgICAgICBDT01QeEVOICAgICAgICBMTF9DT01QX0VuYWJsZQorICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ09NUF9FbmFibGUoQ09NUF9UeXBlRGVmICpDT01QeCkKK3sKKyAgU0VUX0JJVChDT01QeC0+Q1NSLCBDT01QX0NTUl9DT01QeEVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGNvbXBhcmF0b3IgaW5zdGFuY2UuCisgICogQHJtdG9sbCBDU1IgICAgICBDT01QeEVOICAgICAgICBMTF9DT01QX0Rpc2FibGUKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NPTVBfRGlzYWJsZShDT01QX1R5cGVEZWYgKkNPTVB4KQoreworICBDTEVBUl9CSVQoQ09NUHgtPkNTUiwgQ09NUF9DU1JfQ09NUHhFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNvbXBhcmF0b3IgZW5hYmxlIHN0YXRlCisgICogICAgICAgICAoMDogQ09NUCBpcyBkaXNhYmxlZCwgMTogQ09NUCBpcyBlbmFibGVkKQorICAqIEBybXRvbGwgQ1NSICAgICAgQ09NUHhFTiAgICAgICAgTExfQ09NUF9Jc0VuYWJsZWQKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DT01QX0lzRW5hYmxlZChDT01QX1R5cGVEZWYgKkNPTVB4KQoreworICByZXR1cm4gKFJFQURfQklUKENPTVB4LT5DU1IsIENPTVBfQ1NSX0NPTVB4RU4pID09IChDT01QX0NTUl9DT01QeEVOKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgTG9jayBjb21wYXJhdG9yIGluc3RhbmNlLgorICAqIEBub3RlICAgT25jZSBsb2NrZWQsIGNvbXBhcmF0b3IgY29uZmlndXJhdGlvbiBjYW4gYmUgYWNjZXNzZWQgaW4gcmVhZC1vbmx5LgorICAqIEBub3RlICAgVGhlIG9ubHkgd2F5IHRvIHVubG9jayB0aGUgY29tcGFyYXRvciBpcyBhIGRldmljZSBoYXJkd2FyZSByZXNldC4KKyAgKiBAcm10b2xsIENTUiAgICAgIENPTVB4TE9DSyAgICAgIExMX0NPTVBfTG9jaworICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ09NUF9Mb2NrKENPTVBfVHlwZURlZiAqQ09NUHgpCit7CisgIFNFVF9CSVQoQ09NUHgtPkNTUiwgQ09NUF9DU1JfQ09NUHhMT0NLKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY29tcGFyYXRvciBsb2NrIHN0YXRlCisgICogICAgICAgICAoMDogQ09NUCBpcyB1bmxvY2tlZCwgMTogQ09NUCBpcyBsb2NrZWQpLgorICAqIEBub3RlICAgT25jZSBsb2NrZWQsIGNvbXBhcmF0b3IgY29uZmlndXJhdGlvbiBjYW4gYmUgYWNjZXNzZWQgaW4gcmVhZC1vbmx5LgorICAqIEBub3RlICAgVGhlIG9ubHkgd2F5IHRvIHVubG9jayB0aGUgY29tcGFyYXRvciBpcyBhIGRldmljZSBoYXJkd2FyZSByZXNldC4KKyAgKiBAcm10b2xsIENTUiAgICAgIENPTVB4TE9DSyAgICAgIExMX0NPTVBfSXNMb2NrZWQKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DT01QX0lzTG9ja2VkKENPTVBfVHlwZURlZiAqQ09NUHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoQ09NUHgtPkNTUiwgQ09NUF9DU1JfQ09NUHhMT0NLKSA9PSAoQ09NUF9DU1JfQ09NUHhMT0NLKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVhZCBjb21wYXJhdG9yIGluc3RhbmNlIG91dHB1dCBsZXZlbC4KKyAgKiBAbm90ZSAgIFRoZSBjb21wYXJhdG9yIG91dHB1dCBsZXZlbCBkZXBlbmRzIG9uIHRoZSBzZWxlY3RlZCBwb2xhcml0eQorICAqICAgICAgICAgKFJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQ09NUF9TZXRPdXRwdXRQb2xhcml0eSgpKS4KKyAgKiAgICAgICAgIElmIHRoZSBjb21wYXJhdG9yIHBvbGFyaXR5IGlzIG5vdCBpbnZlcnRlZDoKKyAgKiAgICAgICAgICAtIENvbXBhcmF0b3Igb3V0cHV0IGlzIGxvdyB3aGVuIHRoZSBpbnB1dCBwbHVzCisgICogICAgICAgICAgICBpcyBhdCBhIGxvd2VyIHZvbHRhZ2UgdGhhbiB0aGUgaW5wdXQgbWludXMKKyAgKiAgICAgICAgICAtIENvbXBhcmF0b3Igb3V0cHV0IGlzIGhpZ2ggd2hlbiB0aGUgaW5wdXQgcGx1cworICAqICAgICAgICAgICAgaXMgYXQgYSBoaWdoZXIgdm9sdGFnZSB0aGFuIHRoZSBpbnB1dCBtaW51cworICAqICAgICAgICAgSWYgdGhlIGNvbXBhcmF0b3IgcG9sYXJpdHkgaXMgaW52ZXJ0ZWQ6CisgICogICAgICAgICAgLSBDb21wYXJhdG9yIG91dHB1dCBpcyBoaWdoIHdoZW4gdGhlIGlucHV0IHBsdXMKKyAgKiAgICAgICAgICAgIGlzIGF0IGEgbG93ZXIgdm9sdGFnZSB0aGFuIHRoZSBpbnB1dCBtaW51cworICAqICAgICAgICAgIC0gQ29tcGFyYXRvciBvdXRwdXQgaXMgbG93IHdoZW4gdGhlIGlucHV0IHBsdXMKKyAgKiAgICAgICAgICAgIGlzIGF0IGEgaGlnaGVyIHZvbHRhZ2UgdGhhbiB0aGUgaW5wdXQgbWludXMKKyAgKiBAcm10b2xsIENTUiAgICAgIENPTVB4T1VUICAgICAgIExMX0NPTVBfUmVhZE91dHB1dExldmVsCisgICogQHBhcmFtICBDT01QeCBDb21wYXJhdG9yIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX0xFVkVMX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX0xFVkVMX0hJR0gKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DT01QX1JlYWRPdXRwdXRMZXZlbChDT01QX1R5cGVEZWYgKkNPTVB4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDT01QeC0+Q1NSLCBDT01QX0NTUl9DT01QeE9VVCkKKyAgICAgICAgICAgICAgICAgICAgPj4gTExfQ09NUF9PVVRQVVRfTEVWRUxfQklUT0ZGU0VUX1BPUyk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FRl9Jbml0IEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCitFcnJvclN0YXR1cyBMTF9DT01QX0RlSW5pdChDT01QX1R5cGVEZWYgKkNPTVB4KTsKK0Vycm9yU3RhdHVzIExMX0NPTVBfSW5pdChDT01QX1R5cGVEZWYgKkNPTVB4LCBMTF9DT01QX0luaXRUeXBlRGVmICpDT01QX0luaXRTdHJ1Y3QpOwordm9pZCAgICAgICAgTExfQ09NUF9TdHJ1Y3RJbml0KExMX0NPTVBfSW5pdFR5cGVEZWYgKkNPTVBfSW5pdFN0cnVjdCk7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBDT01QMSB8fCBDT01QMiB8fCBDT01QMyB8fCBDT01QNCB8fCBDT01QNSB8fCBDT01QNiB8fCBDT01QNyAqLworCisKKyNlbmRpZiAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzMTh4eCB8fCBTVE0zMkYzMjh4eCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzNTh4eCB8fCBTVE0zMkYzOTh4eCAqLworCisjaWYgZGVmaW5lZCAoQ09NUF9WMV8xXzBfMCkKKworI2lmIGRlZmluZWQgKENPTVAxKSB8fCBkZWZpbmVkIChDT01QMikKKworLyoqIEBkZWZncm91cCBDT01QX0xMIENPTVAKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENPTVBfTExfUHJpdmF0ZV9Db25zdGFudHMgQ09NUCBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qIERpZmZlcmVudGlhdGlvbiBiZXR3ZWVuIENPTVAgaW5zdGFuY2VzICovCisvKiBOb3RlOiBWYWx1ZSBub3QgY29ycmVzcG9uZGluZyB0byBhIHJlZ2lzdGVyIG9mZnNldCBzaW5jZSBib3RoICAgICAgICAgICAgICAqLworLyogICAgICAgQ09NUCBpbnN0YW5jZXMgYXJlIHNoYXJpbmcgdGhlIHNhbWUgcmVnaXN0ZXIpIC4gICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09NUFhfQkFTRSAgQ09NUF9CQVNFCisjZGVmaW5lIENPTVBYICAgICAgIChDT01QMSAtIENPTVAyKQorCisvKiBDT01QIHJlZ2lzdGVycyBiaXRzIHBvc2l0aW9ucyAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9MRVZFTF9CSVRPRkZTRVRfUE9TICgodWludDMyX3QpMTRVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChDT01QX0NTUl9DT01QMU9VVCkgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9Qcml2YXRlX01hY3JvcyBDT01QIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBEcml2ZXIgbWFjcm8gcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZTogaWYgQ09NUCBpbnN0YW5jZSBzZWxlY3RlZAorICAqICAgICAgICAgaXMgb2RkIChDT01QMSwgQ09NUDMsIC4uLiksIHJldHVybiB2YWx1ZSAnMScsIGVsc2UgcmV0dXJuICcwJy4KKyAgKiBAcGFyYW0gIF9fQ09NUF9JTlNUQU5DRV9fIENPTVAgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIElmIENPTVAgaW5zdGFuY2UgaXMgb2RkLCB2YWx1ZSAnMScuIEVsc2UsIHZhbHVlICcwJy4KKyovCisjZGVmaW5lIF9fQ09NUF9JU19JTlNUQU5DRV9PREQoX19DT01QX0lOU1RBTkNFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKH4oKCh1aW50MzJfdCkoX19DT01QX0lOU1RBTkNFX18pIC0gQ09NUF9CQVNFKSA+PiAxVSkpICYgMHgwMDAwMDAwMSkKKworLyoqCisgICogQGJyaWVmICBEcml2ZXIgbWFjcm8gcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZTogaWYgQ09NUCBpbnN0YW5jZSBzZWxlY3RlZAorICAqICAgICAgICAgaXMgZXZlbiAoQ09NUDIsIENPTVA0LCAuLi4pLCByZXR1cm4gdmFsdWUgJzEnLCBlbHNlIHJldHVybiAnMCcuCisgICogQHBhcmFtICBfX0NPTVBfSU5TVEFOQ0VfXyBDT01QIGluc3RhbmNlCisgICogQHJldHZhbCBJZiBDT01QIGluc3RhbmNlIGlzIGV2ZW4sIHZhbHVlICcxJy4gRWxzZSwgdmFsdWUgJzAnLgorKi8KKyNkZWZpbmUgX19DT01QX0lTX0lOU1RBTkNFX0VWRU4oX19DT01QX0lOU1RBTkNFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKHVpbnQzMl90KShfX0NPTVBfSU5TVEFOQ0VfXykgLSBDT01QX0JBU0UpID4+IDFVKQorCisvKioKKyAgKiBAYnJpZWYgIERyaXZlciBtYWNybyByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlOiBmcm9tIENPTVAgaW5zdGFuY2UKKyAgKiAgICAgICAgIHNlbGVjdGVkLCBzZXQgb2Zmc2V0IG9mIGJpdHMgaW50byBDT01QIHJlZ2lzdGVyLgorICAqIEBub3RlICAgU2luY2UgYm90aCBDT01QIGluc3RhbmNlcyBhcmUgc2hhcmluZyB0aGUgc2FtZSByZWdpc3RlcgorICAqICAgICAgICAgd2l0aCAyIGFyZWEgb2YgYml0cyB3aXRoIGFuIG9mZnNldCBvZiAxNiBiaXRzLCB0aGlzIGZ1bmN0aW9uCisgICogICAgICAgICByZXR1cm5zIHZhbHVlICIwIiBpZiBDT01QMSBpcyBzZWxlY3RlZCBhbmQgIjE2IiBpZiBDT01QMiBpcworICAqICAgICAgICAgc2VsZWN0ZWQuCisgICogQHBhcmFtICBfX0NPTVBfSU5TVEFOQ0VfXyBDT01QIGluc3RhbmNlCisgICogQHJldHZhbCBCaXRzIG9mZnNldCBpbiByZWdpc3RlciAzMiBiaXRzCisqLworI2RlZmluZSBfX0NPTVBfQklUT0ZGU0VUX0lOU1RBTkNFKF9fQ09NUF9JTlNUQU5DRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgodWludDMyX3QpKF9fQ09NUF9JTlNUQU5DRV9fKSAtIENPTVBfQkFTRSkgPDwgM1UpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIENPTVBfTExfRVNfSU5JVCBDT01QIEV4cG9ydGVkIEluaXQgc3RydWN0dXJlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBvZiBzb21lIGZlYXR1cmVzIG9mIENPTVAgaW5zdGFuY2UuCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQb3dlck1vZGU7ICAgICAgICAgICAgICAgICAgIC8qITwgU2V0IGNvbXBhcmF0b3Igb3BlcmF0aW5nIG1vZGUgdG8gYWRqdXN0IHBvd2VyIGFuZCBzcGVlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09NUF9MTF9FQ19QT1dFUk1PREUKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9DT01QX1NldFBvd2VyTW9kZSgpLiAqLworCisgIHVpbnQzMl90IElucHV0UGx1czsgICAgICAgICAgICAgICAgICAgLyohPCBTZXQgY29tcGFyYXRvciBpbnB1dCBwbHVzIChub24taW52ZXJ0aW5nIGlucHV0KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09NUF9MTF9FQ19JTlBVVF9QTFVTCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQ09NUF9TZXRJbnB1dFBsdXMoKS4gKi8KKworICB1aW50MzJfdCBJbnB1dE1pbnVzOyAgICAgICAgICAgICAgICAgIC8qITwgU2V0IGNvbXBhcmF0b3IgaW5wdXQgbWludXMgKGludmVydGluZyBpbnB1dCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPTVBfTExfRUNfSU5QVVRfTUlOVVMKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9DT01QX1NldElucHV0TWludXMoKS4gKi8KKworICB1aW50MzJfdCBJbnB1dEh5c3RlcmVzaXM7ICAgICAgICAgICAgIC8qITwgU2V0IGNvbXBhcmF0b3IgaHlzdGVyZXNpcyBtb2RlIG9mIHRoZSBpbnB1dCBtaW51cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09NUF9MTF9FQ19JTlBVVF9IWVNURVJFU0lTCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQ09NUF9TZXRJbnB1dEh5c3RlcmVzaXMoKS4gKi8KKworICB1aW50MzJfdCBPdXRwdXRTZWxlY3Rpb247ICAgICAgICAgICAgIC8qITwgU2V0IGNvbXBhcmF0b3Igb3V0cHV0IHNlbGVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09NUF9MTF9FQ19PVVRQVVRfU0VMRUNUSU9OCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQ09NUF9TZXRPdXRwdXRTZWxlY3Rpb24oKS4gKi8KKworICB1aW50MzJfdCBPdXRwdXRQb2xhcml0eTsgICAgICAgICAgICAgIC8qITwgU2V0IGNvbXBhcmF0b3Igb3V0cHV0IHBvbGFyaXR5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QX0xMX0VDX09VVFBVVF9QT0xBUklUWQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0NPTVBfU2V0T3V0cHV0UG9sYXJpdHkoKS4gKi8KKworfSBMTF9DT01QX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDT01QX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBDT01QIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FQ19DT01NT05fV0lORE9XTU9ERSBDb21wYXJhdG9yIGNvbW1vbiBtb2RlcyAtIFdpbmRvdyBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ09NUF9XSU5ET1dNT0RFX0RJU0FCTEUgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpIC8qITwgV2luZG93IG1vZGUgZGlzYWJsZTogQ29tcGFyYXRvcnMgMSBhbmQgMiBhcmUgaW5kZXBlbmRlbnQgKi8KKyNkZWZpbmUgTExfQ09NUF9XSU5ET1dNT0RFX0NPTVAxX0lOUFVUX1BMVVNfQ09NTU9OIChDT01QX0NTUl9XTkRXRU4pICAgICAgIC8qITwgV2luZG93IG1vZGUgZW5hYmxlOiBDb21wYXJhdG9ycyBpbnN0YW5jZXMgcGFpciBDT01QMSBhbmQgQ09NUDIgaGF2ZSB0aGVpciBpbnB1dCBwbHVzIGNvbm5lY3RlZCB0b2dldGhlci4gVGhlIGNvbW1vbiBpbnB1dCBpcyBDT01QMSBpbnB1dCBwbHVzIChDT01QMiBpbnB1dCBwbHVzIGlzIG5vIG1vcmUgYWNjZXNzaWJsZSkuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfTExfRUNfUE9XRVJNT0RFIENvbXBhcmF0b3IgbW9kZXMgLSBQb3dlciBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ09NUF9QT1dFUk1PREVfSElHSFNQRUVEICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIHBvd2VyIG1vZGUgdG8gaGlnaCBzcGVlZCAqLworI2RlZmluZSBMTF9DT01QX1BPV0VSTU9ERV9NRURJVU1TUEVFRCAgIChDT01QX0NTUl9DT01QMU1PREVfMCkgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgcG93ZXIgbW9kZSB0byBtZWRpdW0gc3BlZWQgKi8KKyNkZWZpbmUgTExfQ09NUF9QT1dFUk1PREVfTE9XUE9XRVIgICAgICAoQ09NUF9DU1JfQ09NUDFNT0RFXzEpICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIHBvd2VyIG1vZGUgdG8gbG93IHBvd2VyICovCisjZGVmaW5lIExMX0NPTVBfUE9XRVJNT0RFX1VMVFJBTE9XUE9XRVIgKENPTVBfQ1NSX0NPTVAxTU9ERV8xIHwgQ09NUF9DU1JfQ09NUDFNT0RFXzApIC8qITwgQ09NUCBwb3dlciBtb2RlIHRvIHVsdHJhLWxvdyBwb3dlciAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0xMX0VDX0lOUFVUX1BMVVMgQ29tcGFyYXRvciBpbnB1dHMgLSBJbnB1dCBwbHVzIChpbnB1dCBub24taW52ZXJ0aW5nKSBzZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9DT01QX0lOUFVUX1BMVVNfSU8xICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpIC8qITwgQ29tcGFyYXRvciBpbnB1dCBwbHVzIGNvbm5lY3RlZCB0byBJTzEgKHBpbiBQQTEgZm9yIENPTVAxLCBwaW4gUEEzIGZvciBDT01QMikgKi8KKyNkZWZpbmUgTExfQ09NUF9JTlBVVF9QTFVTX0RBQzFfQ0gxICAgICAoQ09NUF9DU1JfQ09NUDFTVzEpICAgICAvKiE8IENvbXBhcmF0b3IgaW5wdXQgcGx1cyBjb25uZWN0ZWQgdG8gREFDMSBjaGFubmVsIDEgKERBQ19PVVQxKSwgdGhyb3VnaCBkZWRpY2F0ZWQgc3dpdGNoIChOb3RlOiB0aGlzIHN3aXRjaCBpcyBzb2xlbHkgaW50ZW5kZWQgdG8gcmVkaXJlY3Qgc2lnbmFscyBvbnRvIGhpZ2ggaW1wZWRhbmNlIGlucHV0LCBzdWNoIGFzIENPTVAxIGlucHV0IHBsdXMgKGhpZ2hseSByZXNpc3RpdmUgc3dpdGNoKSkgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVAxKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0xMX0VDX0lOUFVUX01JTlVTIENvbXBhcmF0b3IgaW5wdXRzIC0gSW5wdXQgbWludXMgKGlucHV0IGludmVydGluZykgc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ09NUF9JTlBVVF9NSU5VU18xXzRWUkVGSU5UICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbXBhcmF0b3IgaW5wdXQgbWludXMgY29ubmVjdGVkIHRvIDEvNCBWcmVmSW50ICAqLworI2RlZmluZSBMTF9DT01QX0lOUFVUX01JTlVTXzFfMlZSRUZJTlQgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QX0NTUl9DT01QMUlOU0VMXzApIC8qITwgQ29tcGFyYXRvciBpbnB1dCBtaW51cyBjb25uZWN0ZWQgdG8gMS8yIFZyZWZJbnQgICovCisjZGVmaW5lIExMX0NPTVBfSU5QVVRfTUlOVVNfM180VlJFRklOVCAgKCAgICAgICAgICAgICAgICAgICAgICAgIENPTVBfQ1NSX0NPTVAxSU5TRUxfMSAgICAgICAgICAgICAgICAgICAgICAgICkgLyohPCBDb21wYXJhdG9yIGlucHV0IG1pbnVzIGNvbm5lY3RlZCB0byAzLzQgVnJlZkludCAgKi8KKyNkZWZpbmUgTExfQ09NUF9JTlBVVF9NSU5VU19WUkVGSU5UICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgQ09NUF9DU1JfQ09NUDFJTlNFTF8xIHwgQ09NUF9DU1JfQ09NUDFJTlNFTF8wKSAvKiE8IENvbXBhcmF0b3IgaW5wdXQgbWludXMgY29ubmVjdGVkIHRvIFZyZWZJbnQgKi8KKyNkZWZpbmUgTExfQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMSAgICAoQ09NUF9DU1JfQ09NUDFJTlNFTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAvKiE8IENvbXBhcmF0b3IgaW5wdXQgbWludXMgY29ubmVjdGVkIHRvIERBQzEgY2hhbm5lbCAxIChEQUNfT1VUMSkgICovCisjZGVmaW5lIExMX0NPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDIgICAgKENPTVBfQ1NSX0NPTVAxSU5TRUxfMiAgICAgICAgICAgICAgICAgICAgICAgICB8IENPTVBfQ1NSX0NPTVAxSU5TRUxfMCkgLyohPCBDb21wYXJhdG9yIGlucHV0IG1pbnVzIGNvbm5lY3RlZCB0byBEQUMxIGNoYW5uZWwgMiAoREFDX09VVDIpICAqLworI2RlZmluZSBMTF9DT01QX0lOUFVUX01JTlVTX0lPMSAgICAgICAgIChDT01QX0NTUl9DT01QMUlOU0VMXzIgfCBDT01QX0NTUl9DT01QMUlOU0VMXzEgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgQ29tcGFyYXRvciBpbnB1dCBtaW51cyBjb25uZWN0ZWQgdG8gSU8xIChwaW4gUEEwIGZvciBDT01QMSwgcGluIFBBMiBmb3IgQ09NUDIpICovCisjZGVmaW5lIExMX0NPTVBfSU5QVVRfTUlOVVNfSU8yICAgICAgICAgKENPTVBfQ1NSX0NPTVAxSU5TRUxfMiB8IENPTVBfQ1NSX0NPTVAxSU5TRUxfMSB8IENPTVBfQ1NSX0NPTVAxSU5TRUxfMCkgLyohPCBDb21wYXJhdG9yIGlucHV0IG1pbnVzIGNvbm5lY3RlZCB0byBJTzIgKHBpbiBQQTYgZm9yIENPTVAxICYgQ09NUDIpICovCisjZGVmaW5lIExMX0NPTVBfSU5QVVRfTUlOVVNfSU8zICAgICAgICAgKENPTVBfQ1NSX0NPTVAxSU5TRUxfMiB8ICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBfQ1NSX0NPTVAxSU5TRUxfMCkgLyohPCBDb21wYXJhdG9yIGlucHV0IG1pbnVzIGNvbm5lY3RlZCB0byBJTzMgKHBpbiBQQTUgZm9yIENPTVAxICYgQ09NUDIpICovCisjZGVmaW5lIExMX0NPTVBfSU5QVVRfTUlOVVNfSU80ICAgICAgICAgKENPTVBfQ1NSX0NPTVAxSU5TRUxfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgLyohPCBDb21wYXJhdG9yIGlucHV0IG1pbnVzIGNvbm5lY3RlZCB0byBJTzQgKHBpbiBQQTQgZm9yIENPTVAxICYgQ09NUDIpICovCisjZGVmaW5lIExMX0NPTVBfSU5QVVRfTUlOVVNfREFDMl9DSDEgICAgKENPTVBfQ1NSX0NPTVAxSU5TRUxfMiB8IENPTVBfQ1NSX0NPTVAxSU5TRUxfMSB8IENPTVBfQ1NSX0NPTVAxSU5TRUxfMCkgLyohPCBDb21wYXJhdG9yIGlucHV0IG1pbnVzIGNvbm5lY3RlZCB0byBEQUMyIGNoYW5uZWwgMSAoREFDMl9PVVQxKSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FQ19JTlBVVF9IWVNURVJFU0lTIENvbXBhcmF0b3IgaW5wdXQgLSBIeXN0ZXJlc2lzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ09NUF9IWVNURVJFU0lTX05PTkUgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBObyBoeXN0ZXJlc2lzICovCisjZGVmaW5lIExMX0NPTVBfSFlTVEVSRVNJU19MT1cgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgQ09NUF9DU1JfQ09NUDFIWVNUXzApIC8qITwgSHlzdGVyZXNpcyBsZXZlbCBsb3cgKi8KKyNkZWZpbmUgTExfQ09NUF9IWVNURVJFU0lTX01FRElVTSAgICAgICAoQ09NUF9DU1JfQ09NUDFIWVNUXzEgICAgICAgICAgICAgICAgICAgICAgICkgLyohPCBIeXN0ZXJlc2lzIGxldmVsIG1lZGl1bSAqLworI2RlZmluZSBMTF9DT01QX0hZU1RFUkVTSVNfSElHSCAgICAgICAgIChDT01QX0NTUl9DT01QMUhZU1RfMSB8IENPTVBfQ1NSX0NPTVAxSFlTVF8wKSAvKiE8IEh5c3RlcmVzaXMgbGV2ZWwgaGlnaCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0xMX0VDX09VVFBVVF9TRUxFQ1RJT04gQ29tcGFyYXRvciBvdXRwdXQgLSBPdXRwdXQgc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKy8qIE5vdGU6IE91dHB1dCByZWRpcmVjdGlvbiBpcyBjb21tb24gZm9yIENPTVAxIGFuZCBDT01QMiAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9OT05FICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgaXMgbm90IGNvbm5lY3RlZCB0byBvdGhlciBwZXJpcGhlcmFscyAoZXhjZXB0IEdQSU8gYW5kIEVYVEkgdGhhdCBhcmUgYWx3YXlzIGNvbm5lY3RlZCB0byBDT01QIG91dHB1dCkgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMl9JQzQgICAgICAgICAoQ09NUF9DU1JfQ09NUDFPVVRTRUxfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0yIGlucHV0IGNhcHR1cmUgNCAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0yX09DQ0xSICAgICAgIChDT01QX0NTUl9DT01QMU9VVFNFTF8yIHwgQ09NUF9DU1JfQ09NUDFPVVRTRUxfMCkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTIgT0NSRUYgY2xlYXIgKi8KKworLyogTm90ZTogT3V0cHV0IHJlZGlyZWN0aW9uIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVAxICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTE1X0JLSU5fQ09NUDEgKENPTVBfQ1NSX0NPTVAxT1VUU0VMXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMTUgYnJlYWsgaW5wdXQgKEJLSU4pIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QMSkgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNM19JQzFfQ09NUDEgICAoQ09NUF9DU1JfQ09NUDFPVVRTRUxfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0zIGlucHV0IGNhcHR1cmUgMSAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDEpICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTNfT0NDTFJfQ09NUDEgKENPTVBfQ1NSX0NPTVAxT1VUU0VMXzEgfCBDT01QX0NTUl9DT01QMU9VVFNFTF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMyBPQ1JFRiBjbGVhciAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDEpICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTVfSUM0X0NPTVAxICAgKENPTVBfQ1NSX0NPTVAxT1VUU0VMXzIgfCBDT01QX0NTUl9DT01QMU9VVFNFTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNNSBpbnB1dCBjYXB0dXJlIDQgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVAxKSAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU01X09DQ0xSX0NPTVAxIChDT01QX0NTUl9DT01QMU9VVFNFTF8yIHwgQ09NUF9DU1JfQ09NUDFPVVRTRUxfMSB8IENPTVBfQ1NSX0NPTVAxT1VUU0VMXzApIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTUgT0NSRUYgY2xlYXIgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVAxKSAqLworCisvKiBOb3RlOiBPdXRwdXQgcmVkaXJlY3Rpb24gc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDIgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNMTZfQktJTl9DT01QMiAoQ09NUF9DU1JfQ09NUDFPVVRTRUxfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNiBicmVhayBpbnB1dCAoQktJTikgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVAyKSAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU00X0lDMV9DT01QMiAgIChDT01QX0NTUl9DT01QMU9VVFNFTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTQgaW5wdXQgY2FwdHVyZSAxIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QMikgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNNF9PQ0NMUl9DT01QMiAoQ09NUF9DU1JfQ09NUDFPVVRTRUxfMSB8IENPTVBfQ1NSX0NPTVAxT1VUU0VMXzApICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU00IE9DUkVGIGNsZWFyIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QMikgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNM19JQzFfQ09NUDIgICAoQ09NUF9DU1JfQ09NUDFPVVRTRUxfMiB8IENPTVBfQ1NSX0NPTVAxT1VUU0VMXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0zIGlucHV0IGNhcHR1cmUgMSAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDIpICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTNfT0NDTFJfQ09NUDIgKENPTVBfQ1NSX0NPTVAxT1VUU0VMXzIgfCBDT01QX0NTUl9DT01QMU9VVFNFTF8xIHwgQ09NUF9DU1JfQ09NUDFPVVRTRUxfMCkgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMyBPQ1JFRiBjbGVhciAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDIpICovCisKKy8qIE5vdGU6IE91dHB1dCByZWRpcmVjdGlvbiBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoICAgICAgICAgICovCisvKiAgICAgICBnZW5lcmljIG5hbWluZyBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAgICAqLworLyogICAgICAgUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gICAgKi8KKy8qIE5vdGU6IFNvbWUgb3V0cHV0IHJlZGlyZWN0aW9ucyBjYW5ub3QgaGF2ZSBhIGdlbmVyaWMgbmFtaW5nLCAgICAgICAgICAgICAgICovCisvKiAgICAgICBkdWUgdG8gbGl0ZXJhbCB2YWx1ZSBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIENPTVAgaW5zdGFuY2UuICAgICAgICAgICAqLworLyogICAgICAgKEZvciBleGVtcGxlOiBMTF9DT01QX09VVFBVVF9USU0zX0lDMV9DT01QMSBhbmQgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIExMX0NPTVBfT1VUUFVUX1RJTTNfSUMxX0NPTVAyKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTE1X0JLSU4gICAgICAgTExfQ09NUF9PVVRQVVRfVElNMTVfQktJTl9DT01QMSAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0xNSBicmVhayBpbnB1dCAoQktJTikuIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU0xNl9CS0lOICAgICAgIExMX0NPTVBfT1VUUFVUX1RJTTE2X0JLSU5fQ09NUDIgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMTYgYnJlYWsgaW5wdXQgKEJLSU4pLiBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNNF9JQzEgICAgICAgICBMTF9DT01QX09VVFBVVF9USU00X0lDMV9DT01QMiAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTQgaW5wdXQgY2FwdHVyZSAxLiAgICAgQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX1RJTTRfT0NDTFIgICAgICAgTExfQ09NUF9PVVRQVVRfVElNNF9PQ0NMUl9DT01QMiAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU00IE9DUkVGIGNsZWFyLiAgICAgICAgIENhdXRpb246IFBhcmFtZXRlciBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcywgZGVmaW5lZCB3aXRoIGdlbmVyaWMgbmFtaW5nLCBub3QgdGFraW5nIGludG8gYWNjb3VudCBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiBSZWZlciB0byBsaXRlcmFsIGRlZmluaXRpb25zIGFib3ZlIGZvciBDT01QIGluc3RhbmNlIGNvbnN0cmFpbnRzLiAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9USU01X0lDNCAgICAgICAgIExMX0NPTVBfT1VUUFVUX1RJTTVfSUMxX0NPTVAxICAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNNSBpbnB1dCBjYXB0dXJlIDQuICAgICBDYXV0aW9uOiBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXMsIGRlZmluZWQgd2l0aCBnZW5lcmljIG5hbWluZywgbm90IHRha2luZyBpbnRvIGFjY291bnQgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gUmVmZXIgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBhYm92ZSBmb3IgQ09NUCBpbnN0YW5jZSBjb25zdHJhaW50cy4gKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfVElNNV9PQ0NMUiAgICAgICBMTF9DT01QX09VVFBVVF9USU01X09DQ0xSX0NPTVAxICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTUgT0NSRUYgY2xlYXIuICAgICAgICAgQ2F1dGlvbjogUGFyYW1ldGVyIHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2VzLCBkZWZpbmVkIHdpdGggZ2VuZXJpYyBuYW1pbmcsIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuIFJlZmVyIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgYWJvdmUgZm9yIENPTVAgaW5zdGFuY2UgY29uc3RyYWludHMuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfTExfRUNfT1VUUFVUX1BPTEFSSVRZIENvbXBhcmF0b3Igb3V0cHV0IC0gT3V0cHV0IHBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRQT0xfTk9OSU5WRVJURUQgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgLyohPCBDT01QIG91dHB1dCBwb2xhcml0eSBpcyBub3QgaW52ZXJ0ZWQ6IGNvbXBhcmF0b3Igb3V0cHV0IGlzIGhpZ2ggd2hlbiB0aGUgcGx1cyAobm9uLWludmVydGluZykgaW5wdXQgaXMgYXQgYSBoaWdoZXIgdm9sdGFnZSB0aGFuIHRoZSBtaW51cyAoaW52ZXJ0aW5nKSBpbnB1dCAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVFBPTF9JTlZFUlRFRCAgICAgIChDT01QX0NTUl9DT01QMVBPTCkgICAgICAvKiE8IENPTVAgb3V0cHV0IHBvbGFyaXR5IGlzIGludmVydGVkOiBjb21wYXJhdG9yIG91dHB1dCBpcyBsb3cgd2hlbiB0aGUgcGx1cyAobm9uLWludmVydGluZykgaW5wdXQgaXMgYXQgYSBsb3dlciB2b2x0YWdlIHRoYW4gdGhlIG1pbnVzIChpbnZlcnRpbmcpIGlucHV0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfTExfRUNfT1VUUFVUX0xFVkVMIENvbXBhcmF0b3Igb3V0cHV0IC0gT3V0cHV0IGxldmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfTEVWRUxfTE9XICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IGxldmVsIGxvdyAoaWYgdGhlIHBvbGFyaXR5IGlzIG5vdCBpbnZlcnRlZCwgb3RoZXJ3aXNlIHRvIGJlIGNvbXBsZW1lbnRlZCkgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfTEVWRUxfSElHSCAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDFVKSAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IGxldmVsIGhpZ2ggKGlmIHRoZSBwb2xhcml0eSBpcyBub3QgaW52ZXJ0ZWQsIG90aGVyd2lzZSB0byBiZSBjb21wbGVtZW50ZWQpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfTExfRUNfSFdfREVMQVlTICBEZWZpbml0aW9ucyBvZiBDT01QIGhhcmR3YXJlIGNvbnN0cmFpbnRzIGRlbGF5cworICAqIEBub3RlICAgT25seSBDT01QIElQIEhXIGRlbGF5cyBhcmUgZGVmaW5lZCBpbiBDT01QIExMIGRyaXZlciBkcml2ZXIsCisgICogICAgICAgICBub3QgdGltZW91dCB2YWx1ZXMuCisgICogICAgICAgICBGb3IgZGV0YWlscyBvbiBkZWxheXMgdmFsdWVzLCByZWZlciB0byBkZXNjcmlwdGlvbnMgaW4gc291cmNlIGNvZGUKKyAgKiAgICAgICAgIGFib3ZlIGVhY2ggbGl0ZXJhbCBkZWZpbml0aW9uLgorICAqIEB7CisgICovCisKKy8qIERlbGF5IGZvciBjb21wYXJhdG9yIHN0YXJ0dXAgdGltZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOb3RlOiBEZWxheSByZXF1aXJlZCB0byByZWFjaCBwcm9wYWdhdGlvbiBkZWxheSBzcGVjaWZpY2F0aW9uLiAgICAgICAgICAgICAqLworLyogTGl0ZXJhbCBzZXQgdG8gbWF4aW11bSB2YWx1ZSAocmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgICAgICAgICAgICAgICAgICAgKi8KKy8qIHBhcmFtZXRlciAidFNUQVJUIikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBVbml0OiB1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9DT01QX0RFTEFZX1NUQVJUVVBfVVMgICAgICAgICAgKCh1aW50MzJfdCkgNjBVKSAgLyohPCBEZWxheSBmb3IgQ09NUCBzdGFydHVwIHRpbWUgKi8KKworLyogRGVsYXkgZm9yIGNvbXBhcmF0b3Igdm9sdGFnZSBzY2FsZXIgc3RhYmlsaXphdGlvbiB0aW1lICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICh2b2x0YWdlIGZyb20gVnJlZkludCwgZGVsYXkgYmFzZWQgb24gVnJlZkludCBzdGFydHVwIHRpbWUpLiAgICAgICAgICAgICAgICovCisvKiBMaXRlcmFsIHNldCB0byBtYXhpbXVtIHZhbHVlIChyZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCAgICAgICAgICAgICAgICAgICAqLworLyogcGFyYW1ldGVyICJ0U19TQyIpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFVuaXQ6IHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0NPTVBfREVMQVlfVk9MVEFHRV9TQ0FMRVJfU1RBQl9VUyAoKHVpbnQzMl90KSAyMDBVKSAgLyohPCBEZWxheSBmb3IgQ09NUCB2b2x0YWdlIHNjYWxlciBzdGFiaWxpemF0aW9uIHRpbWUgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDT01QX0xMX0V4cG9ydGVkX01hY3JvcyBDT01QIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisvKiogQGRlZmdyb3VwIENPTVBfTExfRU1fV1JJVEVfUkVBRCBDb21tb24gd3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIG1hY3JvCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIENPTVAgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBjb21wYXJhdG9yIGluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9DT01QX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gQ09NUCByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIGNvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfQ09NUF9SZWFkUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXykgUkVBRF9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0xMX0VNX0hFTFBFUl9NQUNSTyBDT01QIGhlbHBlciBtYWNybworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIHNlbGVjdCB0aGUgQ09NUCBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIHRvIHdoaWNoIGlzIGJlbG9uZ2luZyB0aGUgc2VsZWN0ZWQgQ09NUCBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIENPTVAgY29tbW9uIHJlZ2lzdGVyIGluc3RhbmNlIGNhbiBiZSB1c2VkIHRvCisgICogICAgICAgICBzZXQgcGFyYW1ldGVycyBjb21tb24gdG8gc2V2ZXJhbCBDT01QIGluc3RhbmNlcy4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9ucyBoYXZpbmcgYXJndW1lbnQgIkNPTVB4eV9DT01NT04iIGFzIHBhcmFtZXRlci4KKyAgKiBAcGFyYW0gIF9fQ09NUHhfXyBDT01QIGluc3RhbmNlCisgICogQHJldHZhbCBDT01QIGNvbW1vbiBpbnN0YW5jZSBvciB2YWx1ZSAiMCIgaWYgdGhlcmUgaXMgbm8gQ09NUCBjb21tb24gaW5zdGFuY2UuCisgICovCisjZGVmaW5lIF9fTExfQ09NUF9DT01NT05fSU5TVEFOQ0UoX19DT01QeF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQ09NUDEyX0NPTU1PTikKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgQ09NUCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfTExfRUZfQ29uZmlndXJhdGlvbl9jb21wYXJhdG9yX2NvbW1vbiBDb25maWd1cmF0aW9uIG9mIENPTVAgaGllcmFyY2hpY2FsIHNjb3BlOiBjb21tb24gdG8gc2V2ZXJhbCBDT01QIGluc3RhbmNlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IHdpbmRvdyBtb2RlIG9mIGEgcGFpciBvZiBjb21wYXJhdG9ycyBpbnN0YW5jZXMKKyAgKiAgICAgICAgICgyIGNvbnNlY3V0aXZlIENPTVAgaW5zdGFuY2VzIG9kZCBhbmQgZXZlbiBDT01QPHg+IGFuZCBDT01QPHgrMT4pLgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgV05EV0VOICAgICAgICAgIExMX0NPTVBfU2V0Q29tbW9uV2luZG93TW9kZQorICAqIEBwYXJhbSAgQ09NUHh5X0NPTU1PTiBDb21wYXJhdG9yIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQ09NUF9DT01NT05fSU5TVEFOQ0UoKSApCisgICogQHBhcmFtICBXaW5kb3dNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9XSU5ET1dNT0RFX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX1dJTkRPV01PREVfQ09NUDFfSU5QVVRfUExVU19DT01NT04KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NPTVBfU2V0Q29tbW9uV2luZG93TW9kZShDT01QX0NvbW1vbl9UeXBlRGVmICpDT01QeHlfQ09NTU9OLCB1aW50MzJfdCBXaW5kb3dNb2RlKQoreworICBNT0RJRllfUkVHKENPTVB4eV9DT01NT04tPkNTUiwgQ09NUF9DU1JfV05EV0VOLCBXaW5kb3dNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgd2luZG93IG1vZGUgb2YgYSBwYWlyIG9mIGNvbXBhcmF0b3JzIGluc3RhbmNlcworICAqICAgICAgICAgKDIgY29uc2VjdXRpdmUgQ09NUCBpbnN0YW5jZXMgb2RkIGFuZCBldmVuIENPTVA8eD4gYW5kIENPTVA8eCsxPikuCisgICogQHJtdG9sbCBDU1IgICAgICAgICBXTkRXRU4gICAgICAgICAgTExfQ09NUF9HZXRDb21tb25XaW5kb3dNb2RlCisgICogQHBhcmFtICBDT01QeHlfQ09NTU9OIENvbXBhcmF0b3IgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9DT01QX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9XSU5ET1dNT0RFX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX1dJTkRPV01PREVfQ09NUDFfSU5QVVRfUExVU19DT01NT04KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DT01QX0dldENvbW1vbldpbmRvd01vZGUoQ09NUF9Db21tb25fVHlwZURlZiAqQ09NUHh5X0NPTU1PTikKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ09NUHh5X0NPTU1PTi0+Q1NSLCBDT01QX0NTUl9XTkRXRU4pKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0xMX0VGX0NvbmZpZ3VyYXRpb25fY29tcGFyYXRvcl9tb2RlcyBDb25maWd1cmF0aW9uIG9mIGNvbXBhcmF0b3IgbW9kZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBjb21wYXJhdG9yIGluc3RhbmNlIG9wZXJhdGluZyBtb2RlIHRvIGFkanVzdCBwb3dlciBhbmQgc3BlZWQuCisgICogQHJtdG9sbCBDU1IgICAgICAgICBDT01QMU1PREUgICAgICAgTExfQ09NUF9TZXRQb3dlck1vZGVcbgorICAqICAgICAgICAgICAgICAgICAgICAgQ09NUDJNT0RFICAgICAgIExMX0NPTVBfU2V0UG93ZXJNb2RlCisgICogQHBhcmFtICBDT01QeCBDb21wYXJhdG9yIGluc3RhbmNlCisgICogQHBhcmFtICBQb3dlck1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX1BPV0VSTU9ERV9ISUdIU1BFRUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX1BPV0VSTU9ERV9NRURJVU1TUEVFRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfUE9XRVJNT0RFX0xPV1BPV0VSCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9QT1dFUk1PREVfVUxUUkFMT1dQT1dFUgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ09NUF9TZXRQb3dlck1vZGUoQ09NUF9UeXBlRGVmICpDT01QeCwgdWludDMyX3QgUG93ZXJNb2RlKQoreworICBNT0RJRllfUkVHKENPTVAtPkNTUiwKKyAgICAgICAgICAgICBDT01QX0NTUl9DT01QMU1PREUgPDwgX19DT01QX0JJVE9GRlNFVF9JTlNUQU5DRShDT01QeCksCisgICAgICAgICAgICAgUG93ZXJNb2RlICAgICAgICAgIDw8IF9fQ09NUF9CSVRPRkZTRVRfSU5TVEFOQ0UoQ09NUHgpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY29tcGFyYXRvciBpbnN0YW5jZSBvcGVyYXRpbmcgbW9kZSB0byBhZGp1c3QgcG93ZXIgYW5kIHNwZWVkLgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgQ09NUDFNT0RFICAgICAgIExMX0NPTVBfR2V0UG93ZXJNb2RlXG4KKyAgKiAgICAgICAgICAgICAgICAgICAgIENPTVAyTU9ERSAgICAgICBMTF9DT01QX0dldFBvd2VyTW9kZQorICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX1BPV0VSTU9ERV9ISUdIU1BFRUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX1BPV0VSTU9ERV9NRURJVU1TUEVFRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfUE9XRVJNT0RFX0xPV1BPV0VSCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9QT1dFUk1PREVfVUxUUkFMT1dQT1dFUgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NPTVBfR2V0UG93ZXJNb2RlKENPTVBfVHlwZURlZiAqQ09NUHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKENPTVAtPkNTUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NUF9DU1JfQ09NUDFNT0RFIDw8IF9fQ09NUF9CSVRPRkZTRVRfSU5TVEFOQ0UoQ09NUHgpKQorICAgICAgICAgICAgICAgICAgICA+PiBfX0NPTVBfQklUT0ZGU0VUX0lOU1RBTkNFKENPTVB4KQorICAgICAgICAgICAgICAgICAgICk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FRl9Db25maWd1cmF0aW9uX2NvbXBhcmF0b3JfaW5wdXRzIENvbmZpZ3VyYXRpb24gb2YgY29tcGFyYXRvciBpbnB1dHMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBjb21wYXJhdG9yIGlucHV0cyBtaW51cyAoaW52ZXJ0aW5nKSBhbmQgcGx1cyAobm9uLWludmVydGluZykuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIGNvbXBhcmF0b3IgaW5wdXQgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElPOgorICAqICAgICAgICAgR1BJTyBwaW5zIGFyZSBzcGVjaWZpYyB0byBlYWNoIGNvbXBhcmF0b3IgaW5zdGFuY2UuCisgICogICAgICAgICBSZWZlciB0byBkZXNjcmlwdGlvbiBvZiBwYXJhbWV0ZXJzIG9yIHRvIHJlZmVyZW5jZSBtYW51YWwuCisgICogQHJtdG9sbCBDU1IgICAgICAgICBDT01QMUlOU0VMICAgICAgTExfQ09NUF9Db25maWdJbnB1dHNcbgorICAqICAgICAgICAgQ1NSICAgICAgICAgQ09NUDJJTlNFTCAgICAgIExMX0NPTVBfQ29uZmlnSW5wdXRzXG4KKyAgKiAgICAgICAgIENTUiAgICAgICAgIENPTVAxU1cxICAgICAgICBMTF9DT01QX0NvbmZpZ0lucHV0cworICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEBwYXJhbSAgSW5wdXRNaW51cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfMV80VlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfMV8yVlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfM180VlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfVlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX0RBQzFfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19JTzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX0lPMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfSU8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19JTzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX0RBQzJfQ0gxCisgICogQHBhcmFtICBJbnB1dFBsdXMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX1BMVVNfSU8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9QTFVTX0RBQzFfQ0gxICgxKQorICAqCisgICogICAgICAgICAoMSkgUGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIENPTVAgaW5zdGFuY2U6IENPTVAxLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ09NUF9Db25maWdJbnB1dHMoQ09NUF9UeXBlRGVmICpDT01QeCwgdWludDMyX3QgSW5wdXRNaW51cywgdWludDMyX3QgSW5wdXRQbHVzKQoreworICAvKiBOb3RlOiBDb25uZWN0aW9uIHN3aXRjaCBpcyBhcHBsaWNhYmxlIG9ubHkgdG8gQ09NUCBpbnN0YW5jZSBDT01QMSwgICAgICAgKi8KKyAgLyogICAgICAgdGhlcmVmb3JlIGlmIENPTVAyIGlzIHNlbGVjdGVkIHRoZSBlcXVpdmFsZW50IGJpdCBpcyAgICAgICAgICAgICAgICovCisgIC8qICAgICAgIGtlcHQgdW5tb2RpZmllZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBNT0RJRllfUkVHKENPTVAtPkNTUiwKKyAgICAgICAgICAgICAoQ09NUF9DU1JfQ09NUDFJTlNFTCB8IChDT01QX0NTUl9DT01QMVNXMSAqIF9fQ09NUF9JU19JTlNUQU5DRV9PREQoQ09NUHgpKSkgPDwgX19DT01QX0JJVE9GRlNFVF9JTlNUQU5DRShDT01QeCksCisgICAgICAgICAgICAgKElucHV0TWludXMgfCBJbnB1dFBsdXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IF9fQ09NUF9CSVRPRkZTRVRfSU5TVEFOQ0UoQ09NUHgpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgY29tcGFyYXRvciBpbnB1dCBwbHVzIChub24taW52ZXJ0aW5nKS4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgY29tcGFyYXRvciBpbnB1dCBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gSU86CisgICogICAgICAgICBHUElPIHBpbnMgYXJlIHNwZWNpZmljIHRvIGVhY2ggY29tcGFyYXRvciBpbnN0YW5jZS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHBhcmFtZXRlcnMgb3IgdG8gcmVmZXJlbmNlIG1hbnVhbC4KKyAgKiBAcm10b2xsIENTUiAgICAgICAgIENPTVAxSU5TRUwgICAgICBMTF9DT01QX1NldElucHV0UGx1c1xuCisgICogICAgICAgICBDU1IgICAgICAgICBDT01QMklOU0VMICAgICAgTExfQ09NUF9TZXRJbnB1dFBsdXMKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIElucHV0UGx1cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfUExVU19JTzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX1BMVVNfREFDMV9DSDEgKDEpCisgICoKKyAgKiAgICAgICAgICgxKSBQYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQ09NUCBpbnN0YW5jZTogQ09NUDEuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DT01QX1NldElucHV0UGx1cyhDT01QX1R5cGVEZWYgKkNPTVB4LCB1aW50MzJfdCBJbnB1dFBsdXMpCit7CisgIC8qIE5vdGU6IENvbm5lY3Rpb24gc3dpdGNoIGlzIGFwcGxpY2FibGUgb25seSB0byBDT01QIGluc3RhbmNlIENPTVAxLCAgICAgICAqLworICAvKiAgICAgICB0aGVyZWZvcmUgaWYgQ09NUDIgaXMgc2VsZWN0ZWQgdGhlIGVxdWl2YWxlbnQgYml0IGlzICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAga2VwdCB1bm1vZGlmaWVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIE1PRElGWV9SRUcoQ09NUC0+Q1NSLAorICAgICAgICAgICAgIChDT01QX0NTUl9DT01QMVNXMSAqIF9fQ09NUF9JU19JTlNUQU5DRV9PREQoQ09NUHgpKSA8PCBfX0NPTVBfQklUT0ZGU0VUX0lOU1RBTkNFKENPTVB4KSwKKyAgICAgICAgICAgICBJbnB1dFBsdXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgX19DT01QX0JJVE9GRlNFVF9JTlNUQU5DRShDT01QeCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjb21wYXJhdG9yIGlucHV0IHBsdXMgKG5vbi1pbnZlcnRpbmcpLgorICAqIEBub3RlICAgSW4gY2FzZSBvZiBjb21wYXJhdG9yIGlucHV0IHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBJTzoKKyAgKiAgICAgICAgIEdQSU8gcGlucyBhcmUgc3BlY2lmaWMgdG8gZWFjaCBjb21wYXJhdG9yIGluc3RhbmNlLgorICAqICAgICAgICAgUmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgcGFyYW1ldGVycyBvciB0byByZWZlcmVuY2UgbWFudWFsLgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgQ09NUDFJTlNFTCAgICAgIExMX0NPTVBfR2V0SW5wdXRQbHVzXG4KKyAgKiAgICAgICAgIENTUiAgICAgICAgIENPTVAySU5TRUwgICAgICBMTF9DT01QX0dldElucHV0UGx1cworICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX1BMVVNfSU8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9QTFVTX0RBQzFfQ0gxICgxKQorICAqCisgICogICAgICAgICAoMSkgUGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIENPTVAgaW5zdGFuY2U6IENPTVAxLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NPTVBfR2V0SW5wdXRQbHVzKENPTVBfVHlwZURlZiAqQ09NUHgpCit7CisgIC8qIE5vdGU6IENvbm5lY3Rpb24gc3dpdGNoIGlzIGFwcGxpY2FibGUgb25seSB0byBDT01QIGluc3RhbmNlIENPTVAxLCAgICAgICAqLworICAvKiAgICAgICB0aGVyZWZvcmUgaXMgQ09NUDIgaXMgc2VsZWN0ZWQgdGhlIHJldHVybmVkIHZhbHVlIHdpbGwgYmUgbnVsbC4gICAgKi8KKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ09NUC0+Q1NSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QX0NTUl9DT01QMVNXMSA8PCBfX0NPTVBfQklUT0ZGU0VUX0lOU1RBTkNFKENPTVB4KSkKKyAgICAgICAgICAgICAgICAgICAgPj4gX19DT01QX0JJVE9GRlNFVF9JTlNUQU5DRShDT01QeCkKKyAgICAgICAgICAgICAgICAgICApOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBjb21wYXJhdG9yIGlucHV0IG1pbnVzIChpbnZlcnRpbmcpLgorICAqIEBub3RlICAgSW4gY2FzZSBvZiBjb21wYXJhdG9yIGlucHV0IHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBJTzoKKyAgKiAgICAgICAgIEdQSU8gcGlucyBhcmUgc3BlY2lmaWMgdG8gZWFjaCBjb21wYXJhdG9yIGluc3RhbmNlLgorICAqICAgICAgICAgUmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgcGFyYW1ldGVycyBvciB0byByZWZlcmVuY2UgbWFudWFsLgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgQ09NUDFTVzEgICAgICAgIExMX0NPTVBfU2V0SW5wdXRNaW51cworICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEBwYXJhbSAgSW5wdXRNaW51cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfMV80VlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfMV8yVlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfM180VlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfVlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX0RBQzFfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19JTzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX0lPMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfSU8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19JTzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX0RBQzJfQ0gxCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DT01QX1NldElucHV0TWludXMoQ09NUF9UeXBlRGVmICpDT01QeCwgdWludDMyX3QgSW5wdXRNaW51cykKK3sKKyAgTU9ESUZZX1JFRyhDT01QLT5DU1IsCisgICAgICAgICAgICAgQ09NUF9DU1JfQ09NUDFJTlNFTCA8PCBfX0NPTVBfQklUT0ZGU0VUX0lOU1RBTkNFKENPTVB4KSwKKyAgICAgICAgICAgICBJbnB1dE1pbnVzICAgICAgICAgIDw8IF9fQ09NUF9CSVRPRkZTRVRfSU5TVEFOQ0UoQ09NUHgpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY29tcGFyYXRvciBpbnB1dCBtaW51cyAoaW52ZXJ0aW5nKS4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgY29tcGFyYXRvciBpbnB1dCBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gSU86CisgICogICAgICAgICBHUElPIHBpbnMgYXJlIHNwZWNpZmljIHRvIGVhY2ggY29tcGFyYXRvciBpbnN0YW5jZS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHBhcmFtZXRlcnMgb3IgdG8gcmVmZXJlbmNlIG1hbnVhbC4KKyAgKiBAcm10b2xsIENTUiAgICAgICAgIENPTVAxU1cxICAgICAgICBMTF9DT01QX0dldElucHV0TWludXMKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU18xXzRWUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU18xXzJWUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU18zXzRWUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19WUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX0lPMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfSU8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19JTzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX0lPNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfREFDMl9DSDEKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DT01QX0dldElucHV0TWludXMoQ09NUF9UeXBlRGVmICpDT01QeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ09NUC0+Q1NSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QX0NTUl9DT01QMUlOU0VMIDw8IF9fQ09NUF9CSVRPRkZTRVRfSU5TVEFOQ0UoQ09NUHgpKQorICAgICAgICAgICAgICAgICAgICA+PiBfX0NPTVBfQklUT0ZGU0VUX0lOU1RBTkNFKENPTVB4KQorICAgICAgICAgICAgICAgICAgICk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGNvbXBhcmF0b3IgaW5zdGFuY2UgaHlzdGVyZXNpcyBtb2RlIG9mIHRoZSBpbnB1dCBtaW51cyAoaW52ZXJ0aW5nIGlucHV0KS4KKyAgKiBAcm10b2xsIENTUiAgICAgQ09NUDFIWVNUICAgICAgIExMX0NPTVBfU2V0SW5wdXRIeXN0ZXJlc2lzXG4KKyAgKiAgICAgICAgICAgICAgICAgQ09NUDJIWVNUICAgICAgIExMX0NPTVBfU2V0SW5wdXRIeXN0ZXJlc2lzCisgICogQHBhcmFtICBDT01QeCBDb21wYXJhdG9yIGluc3RhbmNlCisgICogQHBhcmFtICBJbnB1dEh5c3RlcmVzaXMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0hZU1RFUkVTSVNfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSFlTVEVSRVNJU19MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0hZU1RFUkVTSVNfTUVESVVNCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9IWVNURVJFU0lTX0hJR0gKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NPTVBfU2V0SW5wdXRIeXN0ZXJlc2lzKENPTVBfVHlwZURlZiAqQ09NUHgsIHVpbnQzMl90IElucHV0SHlzdGVyZXNpcykKK3sKKyAgTU9ESUZZX1JFRyhDT01QLT5DU1IsCisgICAgICAgICAgICAgQ09NUF9DU1JfQ09NUDFIWVNUIDw8IF9fQ09NUF9CSVRPRkZTRVRfSU5TVEFOQ0UoQ09NUHgpLAorICAgICAgICAgICAgIElucHV0SHlzdGVyZXNpcyAgICA8PCBfX0NPTVBfQklUT0ZGU0VUX0lOU1RBTkNFKENPTVB4KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNvbXBhcmF0b3IgaW5zdGFuY2UgaHlzdGVyZXNpcyBtb2RlIG9mIHRoZSBtaW51cyAoaW52ZXJ0aW5nKSBpbnB1dC4KKyAgKiBAcm10b2xsIENTUiAgICAgQ09NUDFIWVNUICAgICAgIExMX0NPTVBfR2V0SW5wdXRIeXN0ZXJlc2lzXG4KKyAgKiAgICAgICAgICAgICAgICAgQ09NUDJIWVNUICAgICAgIExMX0NPTVBfR2V0SW5wdXRIeXN0ZXJlc2lzCisgICogQHBhcmFtICBDT01QeCBDb21wYXJhdG9yIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSFlTVEVSRVNJU19OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9IWVNURVJFU0lTX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSFlTVEVSRVNJU19NRURJVU0KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0hZU1RFUkVTSVNfSElHSAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NPTVBfR2V0SW5wdXRIeXN0ZXJlc2lzKENPTVBfVHlwZURlZiAqQ09NUHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKENPTVAtPkNTUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NUF9DU1JfQ09NUDFIWVNUIDw8IF9fQ09NUF9CSVRPRkZTRVRfSU5TVEFOQ0UoQ09NUHgpKQorICAgICAgICAgICAgICAgICAgICA+PiBfX0NPTVBfQklUT0ZGU0VUX0lOU1RBTkNFKENPTVB4KQorICAgICAgICAgICAgICAgICAgICk7CisKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0xMX0VGX0NvbmZpZ3VyYXRpb25fY29tcGFyYXRvcl9vdXRwdXQgQ29uZmlndXJhdGlvbiBvZiBjb21wYXJhdG9yIG91dHB1dAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IGNvbXBhcmF0b3Igb3V0cHV0IHNlbGVjdGlvbi4KKyAgKiBAbm90ZSAgIEF2YWlsYWJpbGl0eSBvZiBwYXJhbWV0ZXJzIG9mIG91dHB1dCBzZWxlY3Rpb24gdG8gdGltZXIKKyAgKiAgICAgICAgIGRlcGVuZHMgb24gdGltZXJzIGF2YWlsYWJpbGl0eSBvbiB0aGUgc2VsZWN0ZWQgZGV2aWNlLgorICAqIEBybXRvbGwgQ1NSICAgICBDT01QMU9VVFNFTCAgICAgTExfQ09NUF9TZXRPdXRwdXRTZWxlY3Rpb25cbgorICAqICAgICAgICAgICAgICAgICBDT01QMk9VVFNFTCAgICAgTExfQ09NUF9TZXRPdXRwdXRTZWxlY3Rpb24KKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIE91dHB1dFNlbGVjdGlvbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0xNl9CS0lOICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU00X0lDMSAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU00X09DQ0xSICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0yX0lDNCAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0yX09DQ0xSICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0zX0lDMSAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9USU0zX09DQ0xSICAgICAoMSkKKyAgKgorICAqICAgICAgICAgKDEpIFBhcmFtZXRlciBhdmFpbGFiaWxpdHkgZGVwZW5kaW5nIG9uIHRpbWVyIGF2YWlsYWJpbGl0eQorICAqICAgICAgICAgICAgIG9uIHRoZSBzZWxlY3RlZCBkZXZpY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DT01QX1NldE91dHB1dFNlbGVjdGlvbihDT01QX1R5cGVEZWYgKkNPTVB4LCB1aW50MzJfdCBPdXRwdXRTZWxlY3Rpb24pCit7CisgIE1PRElGWV9SRUcoQ09NUC0+Q1NSLAorICAgICAgICAgICAgIENPTVBfQ1NSX0NPTVAxT1VUU0VMIDw8IF9fQ09NUF9CSVRPRkZTRVRfSU5TVEFOQ0UoQ09NUHgpLAorICAgICAgICAgICAgIE91dHB1dFNlbGVjdGlvbiAgICAgIDw8IF9fQ09NUF9CSVRPRkZTRVRfSU5TVEFOQ0UoQ09NUHgpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY29tcGFyYXRvciBvdXRwdXQgc2VsZWN0aW9uLgorICAqIEBub3RlICAgQXZhaWxhYmlsaXR5IG9mIHBhcmFtZXRlcnMgb2Ygb3V0cHV0IHNlbGVjdGlvbiB0byB0aW1lcgorICAqICAgICAgICAgZGVwZW5kcyBvbiB0aW1lcnMgYXZhaWxhYmlsaXR5IG9uIHRoZSBzZWxlY3RlZCBkZXZpY2UuCisgICogQHJtdG9sbCBDU1IgICAgIENPTVAxT1VUU0VMICAgICBMTF9DT01QX0dldE91dHB1dFNlbGVjdGlvblxuCisgICogICAgICAgICAgICAgICAgIENPTVAyT1VUU0VMICAgICBMTF9DT01QX0dldE91dHB1dFNlbGVjdGlvbgorICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNMTZfQktJTiAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNNF9JQzEgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNNF9PQ0NMUiAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNMl9JQzQgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNMl9PQ0NMUiAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNM19JQzEgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfVElNM19PQ0NMUiAgICAgKDEpCisgICoKKyAgKiAgICAgICAgICgxKSBQYXJhbWV0ZXIgYXZhaWxhYmlsaXR5IGRlcGVuZGluZyBvbiB0aW1lciBhdmFpbGFiaWxpdHkKKyAgKiAgICAgICAgICAgICBvbiB0aGUgc2VsZWN0ZWQgZGV2aWNlLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NPTVBfR2V0T3V0cHV0U2VsZWN0aW9uKENPTVBfVHlwZURlZiAqQ09NUHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKENPTVAtPkNTUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NUF9DU1JfQ09NUDFPVVRTRUwgPDwgX19DT01QX0JJVE9GRlNFVF9JTlNUQU5DRShDT01QeCkpCisgICAgICAgICAgICAgICAgICAgID4+IF9fQ09NUF9CSVRPRkZTRVRfSU5TVEFOQ0UoQ09NUHgpCisgICAgICAgICAgICAgICAgICAgKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgY29tcGFyYXRvciBpbnN0YW5jZSBvdXRwdXQgcG9sYXJpdHkuCisgICogQHJtdG9sbCBDU1IgICAgICAgICBDT01QMVBPTCAgICAgICAgTExfQ09NUF9TZXRPdXRwdXRQb2xhcml0eVxuCisgICogICAgICAgICAgICAgICAgICAgICBDT01QMlBPTCAgICAgICAgTExfQ09NUF9TZXRPdXRwdXRQb2xhcml0eQorICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEBwYXJhbSAgT3V0cHV0UG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVFBPTF9OT05JTlZFUlRFRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUUE9MX0lOVkVSVEVECisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DT01QX1NldE91dHB1dFBvbGFyaXR5KENPTVBfVHlwZURlZiAqQ09NUHgsIHVpbnQzMl90IE91dHB1dFBvbGFyaXR5KQoreworICBNT0RJRllfUkVHKENPTVAtPkNTUiwKKyAgICAgICAgICAgICBDT01QX0NTUl9DT01QMVBPTCA8PCBfX0NPTVBfQklUT0ZGU0VUX0lOU1RBTkNFKENPTVB4KSwKKyAgICAgICAgICAgICBPdXRwdXRQb2xhcml0eSAgICA8PCBfX0NPTVBfQklUT0ZGU0VUX0lOU1RBTkNFKENPTVB4KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNvbXBhcmF0b3IgaW5zdGFuY2Ugb3V0cHV0IHBvbGFyaXR5LgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgQ09NUDFQT0wgICAgICAgIExMX0NPTVBfR2V0T3V0cHV0UG9sYXJpdHlcbgorICAqICAgICAgICAgICAgICAgICAgICAgQ09NUDJQT0wgICAgICAgIExMX0NPTVBfR2V0T3V0cHV0UG9sYXJpdHkKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRQT0xfTk9OSU5WRVJURUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVFBPTF9JTlZFUlRFRAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NPTVBfR2V0T3V0cHV0UG9sYXJpdHkoQ09NUF9UeXBlRGVmICpDT01QeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ09NUC0+Q1NSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QX0NTUl9DT01QMVBPTCA8PCBfX0NPTVBfQklUT0ZGU0VUX0lOU1RBTkNFKENPTVB4KSkKKyAgICAgICAgICAgICAgICAgICAgPj4gX19DT01QX0JJVE9GRlNFVF9JTlNUQU5DRShDT01QeCkKKyAgICAgICAgICAgICAgICAgICApOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfTExfRUZfT3BlcmF0aW9uIE9wZXJhdGlvbiBvbiBjb21wYXJhdG9yIGluc3RhbmNlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgY29tcGFyYXRvciBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIEFmdGVyIGVuYWJsZSBmcm9tIG9mZiBzdGF0ZSwgY29tcGFyYXRvciByZXF1aXJlcyBhIGRlbGF5CisgICogICAgICAgICB0byByZWFjaCByZWFjaCBwcm9wYWdhdGlvbiBkZWxheSBzcGVjaWZpY2F0aW9uLgorICAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgcGFyYW1ldGVyICJ0U1RBUlQiLgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgQ09NUDFFTiAgICAgICAgIExMX0NPTVBfRW5hYmxlXG4KKyAgKiAgICAgICAgICAgICAgICAgICAgIENPTVAyRU4gICAgICAgICBMTF9DT01QX0VuYWJsZQorICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ09NUF9FbmFibGUoQ09NUF9UeXBlRGVmICpDT01QeCkKK3sKKyAgU0VUX0JJVChDT01QLT5DU1IsIENPTVBfQ1NSX0NPTVAxRU4gPDwgX19DT01QX0JJVE9GRlNFVF9JTlNUQU5DRShDT01QeCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgY29tcGFyYXRvciBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENTUiAgICAgICAgIENPTVAxRU4gICAgICAgICBMTF9DT01QX0Rpc2FibGVcbgorICAqICAgICAgICAgICAgICAgICAgICAgQ09NUDJFTiAgICAgICAgIExMX0NPTVBfRGlzYWJsZQorICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ09NUF9EaXNhYmxlKENPTVBfVHlwZURlZiAqQ09NUHgpCit7CisgIENMRUFSX0JJVChDT01QLT5DU1IsIENPTVBfQ1NSX0NPTVAxRU4gPDwgX19DT01QX0JJVE9GRlNFVF9JTlNUQU5DRShDT01QeCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjb21wYXJhdG9yIGVuYWJsZSBzdGF0ZQorICAqICAgICAgICAgKDA6IENPTVAgaXMgZGlzYWJsZWQsIDE6IENPTVAgaXMgZW5hYmxlZCkKKyAgKiBAcm10b2xsIENTUiAgICAgICAgIENPTVAxRU4gICAgICAgICBMTF9DT01QX0lzRW5hYmxlZFxuCisgICogICAgICAgICAgICAgICAgICAgICBDT01QMkVOICAgICAgICAgTExfQ09NUF9Jc0VuYWJsZWQKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DT01QX0lzRW5hYmxlZChDT01QX1R5cGVEZWYgKkNPTVB4KQoreworICByZXR1cm4gKFJFQURfQklUKENPTVAtPkNTUiwgQ09NUF9DU1JfQ09NUDFFTiA8PCBfX0NPTVBfQklUT0ZGU0VUX0lOU1RBTkNFKENPTVB4KSkgPT0gQ09NUF9DU1JfQ09NUDFFTiA8PAorICAgICAgICAgIF9fQ09NUF9CSVRPRkZTRVRfSU5TVEFOQ0UoQ09NUHgpKTsKK30KKworLyoqCisgICogQGJyaWVmICBMb2NrIGNvbXBhcmF0b3IgaW5zdGFuY2UuCisgICogQG5vdGUgICBPbmNlIGxvY2tlZCwgY29tcGFyYXRvciBjb25maWd1cmF0aW9uIGNhbiBiZSBhY2Nlc3NlZCBpbiByZWFkLW9ubHkuCisgICogQG5vdGUgICBUaGUgb25seSB3YXkgdG8gdW5sb2NrIHRoZSBjb21wYXJhdG9yIGlzIGEgZGV2aWNlIGhhcmR3YXJlIHJlc2V0LgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgQ09NUDFMT0NLICAgICAgIExMX0NPTVBfTG9ja1xuCisgICogICAgICAgICAgICAgICAgICAgICBDT01QMkxPQ0sgICAgICAgTExfQ09NUF9Mb2NrCisgICogQHBhcmFtICBDT01QeCBDb21wYXJhdG9yIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DT01QX0xvY2soQ09NUF9UeXBlRGVmICpDT01QeCkKK3sKKyAgU0VUX0JJVChDT01QLT5DU1IsIENPTVBfQ1NSX0NPTVAxTE9DSyA8PCBfX0NPTVBfQklUT0ZGU0VUX0lOU1RBTkNFKENPTVB4KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNvbXBhcmF0b3IgbG9jayBzdGF0ZQorICAqICAgICAgICAgKDA6IENPTVAgaXMgdW5sb2NrZWQsIDE6IENPTVAgaXMgbG9ja2VkKS4KKyAgKiBAbm90ZSAgIE9uY2UgbG9ja2VkLCBjb21wYXJhdG9yIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGFjY2Vzc2VkIGluIHJlYWQtb25seS4KKyAgKiBAbm90ZSAgIFRoZSBvbmx5IHdheSB0byB1bmxvY2sgdGhlIGNvbXBhcmF0b3IgaXMgYSBkZXZpY2UgaGFyZHdhcmUgcmVzZXQuCisgICogQHJtdG9sbCBDU1IgICAgICAgICBDT01QMUxPQ0sgICAgICAgTExfQ09NUF9Jc0xvY2tlZFxuCisgICogICAgICAgICAgICAgICAgICAgICBDT01QMkxPQ0sgICAgICAgTExfQ09NUF9Jc0xvY2tlZAorICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NPTVBfSXNMb2NrZWQoQ09NUF9UeXBlRGVmICpDT01QeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChDT01QLT5DU1IsIENPTVBfQ1NSX0NPTVAxTE9DSyA8PCBfX0NPTVBfQklUT0ZGU0VUX0lOU1RBTkNFKENPTVB4KSkgPT0gQ09NUF9DU1JfQ09NUDFMT0NLIDw8CisgICAgICAgICAgX19DT01QX0JJVE9GRlNFVF9JTlNUQU5DRShDT01QeCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgY29tcGFyYXRvciBpbnN0YW5jZSBvdXRwdXQgbGV2ZWwuCisgICogQG5vdGUgICBUaGUgY29tcGFyYXRvciBvdXRwdXQgbGV2ZWwgZGVwZW5kcyBvbiB0aGUgc2VsZWN0ZWQgcG9sYXJpdHkKKyAgKiAgICAgICAgIChSZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0NPTVBfU2V0T3V0cHV0UG9sYXJpdHkoKSkuCisgICogICAgICAgICBJZiB0aGUgY29tcGFyYXRvciBwb2xhcml0eSBpcyBub3QgaW52ZXJ0ZWQ6CisgICogICAgICAgICAgLSBDb21wYXJhdG9yIG91dHB1dCBpcyBsb3cgd2hlbiB0aGUgaW5wdXQgcGx1cworICAqICAgICAgICAgICAgaXMgYXQgYSBsb3dlciB2b2x0YWdlIHRoYW4gdGhlIGlucHV0IG1pbnVzCisgICogICAgICAgICAgLSBDb21wYXJhdG9yIG91dHB1dCBpcyBoaWdoIHdoZW4gdGhlIGlucHV0IHBsdXMKKyAgKiAgICAgICAgICAgIGlzIGF0IGEgaGlnaGVyIHZvbHRhZ2UgdGhhbiB0aGUgaW5wdXQgbWludXMKKyAgKiAgICAgICAgIElmIHRoZSBjb21wYXJhdG9yIHBvbGFyaXR5IGlzIGludmVydGVkOgorICAqICAgICAgICAgIC0gQ29tcGFyYXRvciBvdXRwdXQgaXMgaGlnaCB3aGVuIHRoZSBpbnB1dCBwbHVzCisgICogICAgICAgICAgICBpcyBhdCBhIGxvd2VyIHZvbHRhZ2UgdGhhbiB0aGUgaW5wdXQgbWludXMKKyAgKiAgICAgICAgICAtIENvbXBhcmF0b3Igb3V0cHV0IGlzIGxvdyB3aGVuIHRoZSBpbnB1dCBwbHVzCisgICogICAgICAgICAgICBpcyBhdCBhIGhpZ2hlciB2b2x0YWdlIHRoYW4gdGhlIGlucHV0IG1pbnVzCisgICogQHJtdG9sbCBDU1IgICAgICAgICBDT01QMU9VVCAgICAgICAgTExfQ09NUF9SZWFkT3V0cHV0TGV2ZWxcbgorICAqICAgICAgICAgICAgICAgICAgICAgQ09NUDJPVVQgICAgICAgIExMX0NPTVBfUmVhZE91dHB1dExldmVsCisgICogQHBhcmFtICBDT01QeCBDb21wYXJhdG9yIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX0xFVkVMX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX0xFVkVMX0hJR0gKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DT01QX1JlYWRPdXRwdXRMZXZlbChDT01QX1R5cGVEZWYgKkNPTVB4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDT01QLT5DU1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBfQ1NSX0NPTVAxT1VUIDw8IF9fQ09NUF9CSVRPRkZTRVRfSU5TVEFOQ0UoQ09NUHgpKQorICAgICAgICAgICAgICAgICAgICA+PiAoX19DT01QX0JJVE9GRlNFVF9JTlNUQU5DRShDT01QeCkgKyBMTF9DT01QX09VVFBVVF9MRVZFTF9CSVRPRkZTRVRfUE9TKQorICAgICAgICAgICAgICAgICAgICk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FRl9Jbml0IEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCitFcnJvclN0YXR1cyBMTF9DT01QX0RlSW5pdChDT01QX1R5cGVEZWYgKkNPTVB4KTsKK0Vycm9yU3RhdHVzIExMX0NPTVBfSW5pdChDT01QX1R5cGVEZWYgKkNPTVB4LCBMTF9DT01QX0luaXRUeXBlRGVmICpDT01QX0luaXRTdHJ1Y3QpOwordm9pZCAgICAgICAgTExfQ09NUF9TdHJ1Y3RJbml0KExMX0NPTVBfSW5pdFR5cGVEZWYgKkNPTVBfSW5pdFN0cnVjdCk7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBDT01QMSB8fCBDT01QMiAqLworCisKKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkYzeHhfTExfQ09NUF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2xsX2NvcnRleC5oIGIvSW5jL3N0bTMyZjN4eF9sbF9jb3J0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTA5MzBiCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjN4eF9sbF9jb3J0ZXguaApAQCAtMCwwICsxLDY1NiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9sbF9jb3J0ZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgQ09SVEVYIExMIG1vZHVsZS4KKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhlIExMIENPUlRFWCBkcml2ZXIgY29udGFpbnMgYSBzZXQgb2YgZ2VuZXJpYyBBUElzIHRoYXQgY2FuIGJlCisgICAgdXNlZCBieSB1c2VyOgorICAgICAgKCspIFNZU1RJQ0sgY29uZmlndXJhdGlvbiB1c2VkIGJ5IEByZWYgTExfbURlbGF5IGFuZCBAcmVmIExMX0luaXQxbXNUaWNrCisgICAgICAgICAgZnVuY3Rpb25zCisgICAgICAoKykgTG93IHBvd2VyIG1vZGUgY29uZmlndXJhdGlvbiAoU0NCIHJlZ2lzdGVyIG9mIENvcnRleC1NQ1UpCisgICAgICAoKykgTVBVIEFQSSB0byBjb25maWd1cmUgYW5kIGVuYWJsZSByZWdpb25zCisgICAgICAgICAgKE1QVSBzZXJ2aWNlcyBwcm92aWRlZCBvbmx5IG9uIHNvbWUgZGV2aWNlcykKKyAgICAgICgrKSBBUEkgdG8gYWNjZXNzIHRvIE1DVSBpbmZvIChDUFVJRCByZWdpc3RlcikKKyAgICAgICgrKSBBUEkgdG8gZW5hYmxlIGZhdWx0IGhhbmRsZXIgKFNIQ1NSIGFjY2Vzc2VzKQorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkYzeHhfTExfQ09SVEVYX0gKKyNkZWZpbmUgX19TVE0zMkYzeHhfTExfQ09SVEVYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMIENPUlRFWAorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBDT1JURVggRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUNfQ0xLU09VUkNFX0hDTEsgU1lTVElDSyBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TWVNUSUNLX0NMS1NPVVJDRV9IQ0xLX0RJVjggICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAvKiE8IEFIQiBjbG9jayBkaXZpZGVkIGJ5IDggc2VsZWN0ZWQgYXMgU3lzVGljayBjbG9jayBzb3VyY2UuKi8KKyNkZWZpbmUgTExfU1lTVElDS19DTEtTT1VSQ0VfSENMSyAgICAgICAgICBTeXNUaWNrX0NUUkxfQ0xLU09VUkNFX01zayAgLyohPCBBSEIgY2xvY2sgc2VsZWN0ZWQgYXMgU3lzVGljayBjbG9jayBzb3VyY2UuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FQ19GQVVMVCBIYW5kbGVyIEZhdWx0IHR5cGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9IQU5ETEVSX0ZBVUxUX1VTRyAgICAgICAgICAgICAgIFNDQl9TSENTUl9VU0dGQVVMVEVOQV9Nc2sgICAgICAgICAgICAgIC8qITwgVXNhZ2UgZmF1bHQgKi8KKyNkZWZpbmUgTExfSEFORExFUl9GQVVMVF9CVVMgICAgICAgICAgICAgICBTQ0JfU0hDU1JfQlVTRkFVTFRFTkFfTXNrICAgICAgICAgICAgICAvKiE8IEJ1cyBmYXVsdCAqLworI2RlZmluZSBMTF9IQU5ETEVSX0ZBVUxUX01FTSAgICAgICAgICAgICAgIFNDQl9TSENTUl9NRU1GQVVMVEVOQV9Nc2sgICAgICAgICAgICAgIC8qITwgTWVtb3J5IG1hbmFnZW1lbnQgZmF1bHQgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNpZiBfX01QVV9QUkVTRU5UCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0VDX0NUUkxfSEZOTUlfUFJJVkRFRiBNUFUgQ29udHJvbAorICAqIEB7CisgICovCisjZGVmaW5lIExMX01QVV9DVFJMX0hGTk1JX1BSSVZERUZfTk9ORSAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERpc2FibGUgTk1JIGFuZCBwcml2aWxlZ2VkIFNXIGFjY2VzcyAqLworI2RlZmluZSBMTF9NUFVfQ1RSTF9IQVJERkFVTFRfTk1JICAgICAgICAgIE1QVV9DVFJMX0hGTk1JRU5BX01zayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFbmFibGVzIHRoZSBvcGVyYXRpb24gb2YgTVBVIGR1cmluZyBoYXJkIGZhdWx0LCBOTUksIGFuZCBGQVVMVE1BU0sgaGFuZGxlcnMgKi8KKyNkZWZpbmUgTExfTVBVX0NUUkxfUFJJVklMRUdFRF9ERUZBVUxUICAgICBNUFVfQ1RSTF9QUklWREVGRU5BX01zayAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRW5hYmxlIHByaXZpbGVnZWQgc29mdHdhcmUgYWNjZXNzIHRvIGRlZmF1bHQgbWVtb3J5IG1hcCAqLworI2RlZmluZSBMTF9NUFVfQ1RSTF9IRk5NSV9QUklWREVGICAgICAgICAgIChNUFVfQ1RSTF9IRk5NSUVOQV9Nc2sgfCBNUFVfQ1RSTF9QUklWREVGRU5BX01zaykgLyohPCBFbmFibGUgTk1JIGFuZCBwcml2aWxlZ2VkIFNXIGFjY2VzcyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUNfUkVHSU9OIE1QVSBSZWdpb24gTnVtYmVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9OVU1CRVIwICAgICAgICAgICAgICAweDAwVSAvKiE8IFJFR0lPTiBOdW1iZXIgMCAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX05VTUJFUjEgICAgICAgICAgICAgIDB4MDFVIC8qITwgUkVHSU9OIE51bWJlciAxICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fTlVNQkVSMiAgICAgICAgICAgICAgMHgwMlUgLyohPCBSRUdJT04gTnVtYmVyIDIgKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9OVU1CRVIzICAgICAgICAgICAgICAweDAzVSAvKiE8IFJFR0lPTiBOdW1iZXIgMyAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX05VTUJFUjQgICAgICAgICAgICAgIDB4MDRVIC8qITwgUkVHSU9OIE51bWJlciA0ICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fTlVNQkVSNSAgICAgICAgICAgICAgMHgwNVUgLyohPCBSRUdJT04gTnVtYmVyIDUgKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9OVU1CRVI2ICAgICAgICAgICAgICAweDA2VSAvKiE8IFJFR0lPTiBOdW1iZXIgNiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX05VTUJFUjcgICAgICAgICAgICAgIDB4MDdVIC8qITwgUkVHSU9OIE51bWJlciA3ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FQ19SRUdJT05fU0laRSBNUFUgUmVnaW9uIFNpemUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMzJCICAgICAgICAgICAgICgweDA0VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAzMkIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV82NEIgICAgICAgICAgICAgKDB4MDVVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDY0QiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzEyOEIgICAgICAgICAgICAoMHgwNlUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgMTI4QiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzI1NkIgICAgICAgICAgICAoMHgwN1UgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgMjU2QiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzUxMkIgICAgICAgICAgICAoMHgwOFUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgNTEyQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzFLQiAgICAgICAgICAgICAoMHgwOVUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgMUtCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMktCICAgICAgICAgICAgICgweDBBVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAyS0IgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV80S0IgICAgICAgICAgICAgKDB4MEJVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDRLQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzhLQiAgICAgICAgICAgICAoMHgwQ1UgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgOEtCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMTZLQiAgICAgICAgICAgICgweDBEVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAxNktCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMzJLQiAgICAgICAgICAgICgweDBFVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAzMktCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfNjRLQiAgICAgICAgICAgICgweDBGVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCA2NEtCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMTI4S0IgICAgICAgICAgICgweDEwVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAxMjhLQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzI1NktCICAgICAgICAgICAoMHgxMVUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgMjU2S0IgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV81MTJLQiAgICAgICAgICAgKDB4MTJVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDUxMktCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMU1CICAgICAgICAgICAgICgweDEzVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAxTUIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8yTUIgICAgICAgICAgICAgKDB4MTRVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDJNQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzRNQiAgICAgICAgICAgICAoMHgxNVUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgNE1CIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfOE1CICAgICAgICAgICAgICgweDE2VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCA4TUIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8xNk1CICAgICAgICAgICAgKDB4MTdVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDE2TUIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8zMk1CICAgICAgICAgICAgKDB4MThVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDMyTUIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV82NE1CICAgICAgICAgICAgKDB4MTlVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDY0TUIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8xMjhNQiAgICAgICAgICAgKDB4MUFVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDEyOE1CIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMjU2TUIgICAgICAgICAgICgweDFCVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAyNTZNQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzUxMk1CICAgICAgICAgICAoMHgxQ1UgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgNTEyTUIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8xR0IgICAgICAgICAgICAgKDB4MURVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDFHQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzJHQiAgICAgICAgICAgICAoMHgxRVUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgMkdCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfNEdCICAgICAgICAgICAgICgweDFGVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCA0R0IgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FQ19SRUdJT05fUFJJVklMRURHRVMgTVBVIFJlZ2lvbiBQcml2aWxlZ2VzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9OT19BQ0NFU1MgICAgICAgICAgICAoMHgwMFUgPDwgTVBVX1JBU1JfQVBfUG9zKSAvKiE8IE5vIGFjY2VzcyovCisjZGVmaW5lIExMX01QVV9SRUdJT05fUFJJVl9SVyAgICAgICAgICAgICAgKDB4MDFVIDw8IE1QVV9SQVNSX0FQX1BvcykgLyohPCBSVyBwcml2aWxlZ2VkIChwcml2aWxlZ2VkIGFjY2VzcyBvbmx5KSovCisjZGVmaW5lIExMX01QVV9SRUdJT05fUFJJVl9SV19VUk8gICAgICAgICAgKDB4MDJVIDw8IE1QVV9SQVNSX0FQX1BvcykgLyohPCBSVyBwcml2aWxlZ2VkIC0gUk8gdXNlciAoV3JpdGUgaW4gYSB1c2VyIHByb2dyYW0gZ2VuZXJhdGVzIGEgZmF1bHQpICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fRlVMTF9BQ0NFU1MgICAgICAgICAgKDB4MDNVIDw8IE1QVV9SQVNSX0FQX1BvcykgLyohPCBSVyBwcml2aWxlZ2VkICYgdXNlciAoRnVsbCBhY2Nlc3MpICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fUFJJVl9STyAgICAgICAgICAgICAgKDB4MDVVIDw8IE1QVV9SQVNSX0FQX1BvcykgLyohPCBSTyBwcml2aWxlZ2VkIChwcml2aWxlZ2VkIHJlYWQgb25seSkqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1BSSVZfUk9fVVJPICAgICAgICAgICgweDA2VSA8PCBNUFVfUkFTUl9BUF9Qb3MpIC8qITwgUk8gcHJpdmlsZWdlZCAmIHVzZXIgKHJlYWQgb25seSkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0VDX1RFWCBNUFUgVEVYIExldmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTVBVX1RFWF9MRVZFTDAgICAgICAgICAgICAgICAgICAoMHgwMFUgPDwgTVBVX1JBU1JfVEVYX1BvcykgLyohPCBiMDAwIGZvciBURVggYml0cyAqLworI2RlZmluZSBMTF9NUFVfVEVYX0xFVkVMMSAgICAgICAgICAgICAgICAgICgweDAxVSA8PCBNUFVfUkFTUl9URVhfUG9zKSAvKiE8IGIwMDEgZm9yIFRFWCBiaXRzICovCisjZGVmaW5lIExMX01QVV9URVhfTEVWRUwyICAgICAgICAgICAgICAgICAgKDB4MDJVIDw8IE1QVV9SQVNSX1RFWF9Qb3MpIC8qITwgYjAxMCBmb3IgVEVYIGJpdHMgKi8KKyNkZWZpbmUgTExfTVBVX1RFWF9MRVZFTDQgICAgICAgICAgICAgICAgICAoMHgwNFUgPDwgTVBVX1JBU1JfVEVYX1BvcykgLyohPCBiMTAwIGZvciBURVggYml0cyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUNfSU5TVFJVQ1RJT05fQUNDRVNTIE1QVSBJbnN0cnVjdGlvbiBBY2Nlc3MKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9NUFVfSU5TVFJVQ1RJT05fQUNDRVNTX0VOQUJMRSAgIDB4MDBVICAgICAgICAgICAgLyohPCBJbnN0cnVjdGlvbiBmZXRjaGVzIGVuYWJsZWQgKi8KKyNkZWZpbmUgTExfTVBVX0lOU1RSVUNUSU9OX0FDQ0VTU19ESVNBQkxFICBNUFVfUkFTUl9YTl9Nc2sgIC8qITwgSW5zdHJ1Y3Rpb24gZmV0Y2hlcyBkaXNhYmxlZCovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FQ19TSEFSRUFCTEVfQUNDRVNTIE1QVSBTaGFyZWFibGUgQWNjZXNzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTVBVX0FDQ0VTU19TSEFSRUFCTEUgICAgICAgICAgICBNUFVfUkFTUl9TX01zayAgIC8qITwgU2hhcmVhYmxlIG1lbW9yeSBhdHRyaWJ1dGUgKi8KKyNkZWZpbmUgTExfTVBVX0FDQ0VTU19OT1RfU0hBUkVBQkxFICAgICAgICAweDAwVSAgICAgICAgICAgIC8qITwgTm90IFNoYXJlYWJsZSBtZW1vcnkgYXR0cmlidXRlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FQ19DQUNIRUFCTEVfQUNDRVNTIE1QVSBDYWNoZWFibGUgQWNjZXNzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTVBVX0FDQ0VTU19DQUNIRUFCTEUgICAgICAgICAgICBNUFVfUkFTUl9DX01zayAgIC8qITwgQ2FjaGVhYmxlIG1lbW9yeSBhdHRyaWJ1dGUgKi8KKyNkZWZpbmUgTExfTVBVX0FDQ0VTU19OT1RfQ0FDSEVBQkxFICAgICAgICAweDAwVSAgICAgICAgICAgIC8qITwgTm90IENhY2hlYWJsZSBtZW1vcnkgYXR0cmlidXRlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FQ19CVUZGRVJBQkxFX0FDQ0VTUyBNUFUgQnVmZmVyYWJsZSBBY2Nlc3MKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9NUFVfQUNDRVNTX0JVRkZFUkFCTEUgICAgICAgICAgIE1QVV9SQVNSX0JfTXNrICAgLyohPCBCdWZmZXJhYmxlIG1lbW9yeSBhdHRyaWJ1dGUgKi8KKyNkZWZpbmUgTExfTVBVX0FDQ0VTU19OT1RfQlVGRkVSQUJMRSAgICAgICAweDAwVSAgICAgICAgICAgIC8qITwgTm90IEJ1ZmZlcmFibGUgbWVtb3J5IGF0dHJpYnV0ZSAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBfX01QVV9QUkVTRU5UICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDT1JURVhfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIENPUlRFWCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FRl9TWVNUSUNLIFNZU1RJQ0sKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBTeXN0aWNrIGNvdW50ZXIgZmxhZyBpcyBhY3RpdmUgb3Igbm90LgorICAqIEBub3RlICAgSXQgY2FuIGJlIHVzZWQgaW4gdGltZW91dCBmdW5jdGlvbiBvbiBhcHBsaWNhdGlvbiBzaWRlLgorICAqIEBybXRvbGwgU1RLX0NUUkwgICAgIENPVU5URkxBRyAgICAgTExfU1lTVElDS19Jc0FjdGl2ZUNvdW50ZXJGbGFnCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTVElDS19Jc0FjdGl2ZUNvdW50ZXJGbGFnKHZvaWQpCit7CisgIHJldHVybiAoKFN5c1RpY2stPkNUUkwgJiBTeXNUaWNrX0NUUkxfQ09VTlRGTEFHX01zaykgPT0gKFN5c1RpY2tfQ1RSTF9DT1VOVEZMQUdfTXNrKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgU3lzVGljayBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIFNUS19DVFJMICAgICBDTEtTT1VSQ0UgICAgIExMX1NZU1RJQ0tfU2V0Q2xrU291cmNlCisgICogQHBhcmFtICBTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNUSUNLX0NMS1NPVVJDRV9IQ0xLX0RJVjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNUSUNLX0NMS1NPVVJDRV9IQ0xLCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNUSUNLX1NldENsa1NvdXJjZSh1aW50MzJfdCBTb3VyY2UpCit7CisgIGlmIChTb3VyY2UgPT0gTExfU1lTVElDS19DTEtTT1VSQ0VfSENMSykKKyAgeworICAgIFNFVF9CSVQoU3lzVGljay0+Q1RSTCwgTExfU1lTVElDS19DTEtTT1VSQ0VfSENMSyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgQ0xFQVJfQklUKFN5c1RpY2stPkNUUkwsIExMX1NZU1RJQ0tfQ0xLU09VUkNFX0hDTEspOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBTeXNUaWNrIGNsb2NrIHNvdXJjZQorICAqIEBybXRvbGwgU1RLX0NUUkwgICAgIENMS1NPVVJDRSAgICAgTExfU1lTVElDS19HZXRDbGtTb3VyY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTVElDS19DTEtTT1VSQ0VfSENMS19ESVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTVElDS19DTEtTT1VSQ0VfSENMSworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU1RJQ0tfR2V0Q2xrU291cmNlKHZvaWQpCit7CisgIHJldHVybiBSRUFEX0JJVChTeXNUaWNrLT5DVFJMLCBMTF9TWVNUSUNLX0NMS1NPVVJDRV9IQ0xLKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgU3lzVGljayBleGNlcHRpb24gcmVxdWVzdAorICAqIEBybXRvbGwgU1RLX0NUUkwgICAgIFRJQ0tJTlQgICAgICAgTExfU1lTVElDS19FbmFibGVJVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTVElDS19FbmFibGVJVCh2b2lkKQoreworICBTRVRfQklUKFN5c1RpY2stPkNUUkwsIFN5c1RpY2tfQ1RSTF9USUNLSU5UX01zayk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBTeXNUaWNrIGV4Y2VwdGlvbiByZXF1ZXN0CisgICogQHJtdG9sbCBTVEtfQ1RSTCAgICAgVElDS0lOVCAgICAgICBMTF9TWVNUSUNLX0Rpc2FibGVJVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTVElDS19EaXNhYmxlSVQodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFN5c1RpY2stPkNUUkwsIFN5c1RpY2tfQ1RSTF9USUNLSU5UX01zayk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2tzIGlmIHRoZSBTWVNUSUNLIGludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgU1RLX0NUUkwgICAgIFRJQ0tJTlQgICAgICAgTExfU1lTVElDS19Jc0VuYWJsZWRJVAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU1RJQ0tfSXNFbmFibGVkSVQodm9pZCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChTeXNUaWNrLT5DVFJMLCBTeXNUaWNrX0NUUkxfVElDS0lOVF9Nc2spID09IChTeXNUaWNrX0NUUkxfVElDS0lOVF9Nc2spKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUZfTE9XX1BPV0VSX01PREUgTE9XIFBPV0VSIE1PREUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFByb2Nlc3NvciB1c2VzIHNsZWVwIGFzIGl0cyBsb3cgcG93ZXIgbW9kZQorICAqIEBybXRvbGwgU0NCX1NDUiAgICAgIFNMRUVQREVFUCAgICAgTExfTFBNX0VuYWJsZVNsZWVwCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUE1fRW5hYmxlU2xlZXAodm9pZCkKK3sKKyAgLyogQ2xlYXIgU0xFRVBERUVQIGJpdCBvZiBDb3J0ZXggU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgQ0xFQVJfQklUKFNDQi0+U0NSLCAoKHVpbnQzMl90KVNDQl9TQ1JfU0xFRVBERUVQX01zaykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFByb2Nlc3NvciB1c2VzIGRlZXAgc2xlZXAgYXMgaXRzIGxvdyBwb3dlciBtb2RlCisgICogQHJtdG9sbCBTQ0JfU0NSICAgICAgU0xFRVBERUVQICAgICBMTF9MUE1fRW5hYmxlRGVlcFNsZWVwCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUE1fRW5hYmxlRGVlcFNsZWVwKHZvaWQpCit7CisgIC8qIFNldCBTTEVFUERFRVAgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBTRVRfQklUKFNDQi0+U0NSLCAoKHVpbnQzMl90KVNDQl9TQ1JfU0xFRVBERUVQX01zaykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgc2xlZXAtb24tZXhpdCB3aGVuIHJldHVybmluZyBmcm9tIEhhbmRsZXIgbW9kZSB0byBUaHJlYWQgbW9kZS4KKyAgKiBAbm90ZSAgIFNldHRpbmcgdGhpcyBiaXQgdG8gMSBlbmFibGVzIGFuIGludGVycnVwdC1kcml2ZW4gYXBwbGljYXRpb24gdG8gYXZvaWQgcmV0dXJuaW5nIHRvIGFuCisgICogICAgICAgICBlbXB0eSBtYWluIGFwcGxpY2F0aW9uLgorICAqIEBybXRvbGwgU0NCX1NDUiAgICAgIFNMRUVQT05FWElUICAgTExfTFBNX0VuYWJsZVNsZWVwT25FeGl0CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUE1fRW5hYmxlU2xlZXBPbkV4aXQodm9pZCkKK3sKKyAgLyogU2V0IFNMRUVQT05FWElUIGJpdCBvZiBDb3J0ZXggU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgU0VUX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NMRUVQT05FWElUX01zaykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERvIG5vdCBzbGVlcCB3aGVuIHJldHVybmluZyB0byBUaHJlYWQgbW9kZS4KKyAgKiBAcm10b2xsIFNDQl9TQ1IgICAgICBTTEVFUE9ORVhJVCAgIExMX0xQTV9EaXNhYmxlU2xlZXBPbkV4aXQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQTV9EaXNhYmxlU2xlZXBPbkV4aXQodm9pZCkKK3sKKyAgLyogQ2xlYXIgU0xFRVBPTkVYSVQgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBDTEVBUl9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TTEVFUE9ORVhJVF9Nc2spKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGVkIGV2ZW50cyBhbmQgYWxsIGludGVycnVwdHMsIGluY2x1ZGluZyBkaXNhYmxlZCBpbnRlcnJ1cHRzLCBjYW4gd2FrZXVwIHRoZQorICAqICAgICAgICAgcHJvY2Vzc29yLgorICAqIEBybXRvbGwgU0NCX1NDUiAgICAgIFNFVkVPTlBFTkQgICAgTExfTFBNX0VuYWJsZUV2ZW50T25QZW5kCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUE1fRW5hYmxlRXZlbnRPblBlbmQodm9pZCkKK3sKKyAgLyogU2V0IFNFVkVPTlBFTkQgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBTRVRfQklUKFNDQi0+U0NSLCAoKHVpbnQzMl90KVNDQl9TQ1JfU0VWT05QRU5EX01zaykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIE9ubHkgZW5hYmxlZCBpbnRlcnJ1cHRzIG9yIGV2ZW50cyBjYW4gd2FrZXVwIHRoZSBwcm9jZXNzb3IsIGRpc2FibGVkIGludGVycnVwdHMgYXJlCisgICogICAgICAgICBleGNsdWRlZAorICAqIEBybXRvbGwgU0NCX1NDUiAgICAgIFNFVkVPTlBFTkQgICAgTExfTFBNX0Rpc2FibGVFdmVudE9uUGVuZAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBNX0Rpc2FibGVFdmVudE9uUGVuZCh2b2lkKQoreworICAvKiBDbGVhciBTRVZFT05QRU5EIGJpdCBvZiBDb3J0ZXggU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgQ0xFQVJfQklUKFNDQi0+U0NSLCAoKHVpbnQzMl90KVNDQl9TQ1JfU0VWT05QRU5EX01zaykpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FRl9IQU5ETEVSIEhBTkRMRVIKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBhIGZhdWx0IGluIFN5c3RlbSBoYW5kbGVyIGNvbnRyb2wgcmVnaXN0ZXIgKFNIQ1NSKQorICAqIEBybXRvbGwgU0NCX1NIQ1NSICAgIE1FTUZBVUxURU5BICAgTExfSEFORExFUl9FbmFibGVGYXVsdAorICAqIEBwYXJhbSAgRmF1bHQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSEFORExFUl9GQVVMVF9VU0cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IQU5ETEVSX0ZBVUxUX0JVUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hBTkRMRVJfRkFVTFRfTUVNCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IQU5ETEVSX0VuYWJsZUZhdWx0KHVpbnQzMl90IEZhdWx0KQoreworICAvKiBFbmFibGUgdGhlIHN5c3RlbSBoYW5kbGVyIGZhdWx0ICovCisgIFNFVF9CSVQoU0NCLT5TSENTUiwgRmF1bHQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgYSBmYXVsdCBpbiBTeXN0ZW0gaGFuZGxlciBjb250cm9sIHJlZ2lzdGVyIChTSENTUikKKyAgKiBAcm10b2xsIFNDQl9TSENTUiAgICBNRU1GQVVMVEVOQSAgIExMX0hBTkRMRVJfRGlzYWJsZUZhdWx0CisgICogQHBhcmFtICBGYXVsdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IQU5ETEVSX0ZBVUxUX1VTRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hBTkRMRVJfRkFVTFRfQlVTCisgICogICAgICAgICBAYXJnIEByZWYgTExfSEFORExFUl9GQVVMVF9NRU0KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hBTkRMRVJfRGlzYWJsZUZhdWx0KHVpbnQzMl90IEZhdWx0KQoreworICAvKiBEaXNhYmxlIHRoZSBzeXN0ZW0gaGFuZGxlciBmYXVsdCAqLworICBDTEVBUl9CSVQoU0NCLT5TSENTUiwgRmF1bHQpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FRl9NQ1VfSU5GTyBNQ1UgSU5GTworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgR2V0IEltcGxlbWVudGVyIGNvZGUKKyAgKiBAcm10b2xsIFNDQl9DUFVJRCAgICBJTVBMRU1FTlRFUiAgIExMX0NQVUlEX0dldEltcGxlbWVudGVyCisgICogQHJldHZhbCBWYWx1ZSBzaG91bGQgYmUgZXF1YWwgdG8gMHg0MSBmb3IgQVJNCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1BVSURfR2V0SW1wbGVtZW50ZXIodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU0NCLT5DUFVJRCwgU0NCX0NQVUlEX0lNUExFTUVOVEVSX01zaykgPj4gU0NCX0NQVUlEX0lNUExFTUVOVEVSX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFZhcmlhbnQgbnVtYmVyIChUaGUgciB2YWx1ZSBpbiB0aGUgcm5wbiBwcm9kdWN0IHJldmlzaW9uIGlkZW50aWZpZXIpCisgICogQHJtdG9sbCBTQ0JfQ1BVSUQgICAgVkFSSUFOVCAgICAgICBMTF9DUFVJRF9HZXRWYXJpYW50CisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIDAgYW5kIDI1NSAoMHgwOiByZXZpc2lvbiAwKQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NQVUlEX0dldFZhcmlhbnQodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU0NCLT5DUFVJRCwgU0NCX0NQVUlEX1ZBUklBTlRfTXNrKSA+PiBTQ0JfQ1BVSURfVkFSSUFOVF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDb25zdGFudCBudW1iZXIKKyAgKiBAcm10b2xsIFNDQl9DUFVJRCAgICBBUkNISVRFQ1RVUkUgIExMX0NQVUlEX0dldENvbnN0YW50CisgICogQHJldHZhbCBWYWx1ZSBzaG91bGQgYmUgZXF1YWwgdG8gMHhGIGZvciBDb3J0ZXgtTTQgZGV2aWNlcworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NQVUlEX0dldENvbnN0YW50KHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNDQi0+Q1BVSUQsIFNDQl9DUFVJRF9BUkNISVRFQ1RVUkVfTXNrKSA+PiBTQ0JfQ1BVSURfQVJDSElURUNUVVJFX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFBhcnQgbnVtYmVyCisgICogQHJtdG9sbCBTQ0JfQ1BVSUQgICAgUEFSVE5PICAgICAgICBMTF9DUFVJRF9HZXRQYXJObworICAqIEByZXR2YWwgVmFsdWUgc2hvdWxkIGJlIGVxdWFsIHRvIDB4QzI0IGZvciBDb3J0ZXgtTTQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUFVJRF9HZXRQYXJObyh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTQ0ItPkNQVUlELCBTQ0JfQ1BVSURfUEFSVE5PX01zaykgPj4gU0NCX0NQVUlEX1BBUlROT19Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBSZXZpc2lvbiBudW1iZXIgKFRoZSBwIHZhbHVlIGluIHRoZSBybnBuIHByb2R1Y3QgcmV2aXNpb24gaWRlbnRpZmllciwgaW5kaWNhdGVzIHBhdGNoIHJlbGVhc2UpCisgICogQHJtdG9sbCBTQ0JfQ1BVSUQgICAgUkVWSVNJT04gICAgICBMTF9DUFVJRF9HZXRSZXZpc2lvbgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUgKDB4MTogcGF0Y2ggMSkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUFVJRF9HZXRSZXZpc2lvbih2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTQ0ItPkNQVUlELCBTQ0JfQ1BVSURfUkVWSVNJT05fTXNrKSA+PiBTQ0JfQ1BVSURfUkVWSVNJT05fUG9zKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmIF9fTVBVX1BSRVNFTlQKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0VGX01QVSBNUFUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBNUFUgd2l0aCBpbnB1dCBvcHRpb25zCisgICogQHJtdG9sbCBNUFVfQ1RSTCAgICAgRU5BQkxFICAgICAgICBMTF9NUFVfRW5hYmxlCisgICogQHBhcmFtICBPcHRpb25zIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX0NUUkxfSEZOTUlfUFJJVkRFRl9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX0NUUkxfSEFSREZBVUxUX05NSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9DVFJMX1BSSVZJTEVHRURfREVGQVVMVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9DVFJMX0hGTk1JX1BSSVZERUYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX01QVV9FbmFibGUodWludDMyX3QgT3B0aW9ucykKK3sKKyAgLyogRW5hYmxlIHRoZSBNUFUqLworICBXUklURV9SRUcoTVBVLT5DVFJMLCAoTVBVX0NUUkxfRU5BQkxFX01zayB8IE9wdGlvbnMpKTsKKyAgLyogRW5zdXJlIE1QVSBzZXR0aW5ncyB0YWtlIGVmZmVjdHMgKi8KKyAgX19EU0IoKTsKKyAgLyogU2VxdWVuY2UgaW5zdHJ1Y3Rpb24gZmV0Y2hlcyB1c2luZyB1cGRhdGUgc2V0dGluZ3MgKi8KKyAgX19JU0IoKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIE1QVQorICAqIEBybXRvbGwgTVBVX0NUUkwgICAgIEVOQUJMRSAgICAgICAgTExfTVBVX0Rpc2FibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX01QVV9EaXNhYmxlKHZvaWQpCit7CisgIC8qIE1ha2Ugc3VyZSBvdXRzdGFuZGluZyB0cmFuc2ZlcnMgYXJlIGRvbmUgKi8KKyAgX19ETUIoKTsKKyAgLyogRGlzYWJsZSBNUFUqLworICBXUklURV9SRUcoTVBVLT5DVFJMLCAwVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgTVBVIGlzIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBNUFVfQ1RSTCAgICAgRU5BQkxFICAgICAgICBMTF9NUFVfSXNFbmFibGVkCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTVBVX0lzRW5hYmxlZCh2b2lkKQoreworICByZXR1cm4gKFJFQURfQklUKE1QVS0+Q1RSTCwgTVBVX0NUUkxfRU5BQkxFX01zaykgPT0gKE1QVV9DVFJMX0VOQUJMRV9Nc2spKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgYSBNUFUgcmVnaW9uCisgICogQHJtdG9sbCBNUFVfUkFTUiAgICAgRU5BQkxFICAgICAgICBMTF9NUFVfRW5hYmxlUmVnaW9uCisgICogQHBhcmFtICBSZWdpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX01QVV9FbmFibGVSZWdpb24odWludDMyX3QgUmVnaW9uKQoreworICAvKiBTZXQgUmVnaW9uIG51bWJlciAqLworICBXUklURV9SRUcoTVBVLT5STlIsIFJlZ2lvbik7CisgIC8qIEVuYWJsZSB0aGUgTVBVIHJlZ2lvbiAqLworICBTRVRfQklUKE1QVS0+UkFTUiwgTVBVX1JBU1JfRU5BQkxFX01zayk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIGFuZCBlbmFibGUgYSByZWdpb24KKyAgKiBAcm10b2xsIE1QVV9STlIgICAgICBSRUdJT04gICAgICAgIExMX01QVV9Db25maWdSZWdpb25cbgorICAqICAgICAgICAgTVBVX1JCQVIgICAgIFJFR0lPTiAgICAgICAgTExfTVBVX0NvbmZpZ1JlZ2lvblxuCisgICogICAgICAgICBNUFVfUkJBUiAgICAgQUREUiAgICAgICAgICBMTF9NUFVfQ29uZmlnUmVnaW9uXG4KKyAgKiAgICAgICAgIE1QVV9SQVNSICAgICBYTiAgICAgICAgICAgIExMX01QVV9Db25maWdSZWdpb25cbgorICAqICAgICAgICAgTVBVX1JBU1IgICAgIEFQICAgICAgICAgICAgTExfTVBVX0NvbmZpZ1JlZ2lvblxuCisgICogICAgICAgICBNUFVfUkFTUiAgICAgUyAgICAgICAgICAgICBMTF9NUFVfQ29uZmlnUmVnaW9uXG4KKyAgKiAgICAgICAgIE1QVV9SQVNSICAgICBDICAgICAgICAgICAgIExMX01QVV9Db25maWdSZWdpb25cbgorICAqICAgICAgICAgTVBVX1JBU1IgICAgIEIgICAgICAgICAgICAgTExfTVBVX0NvbmZpZ1JlZ2lvblxuCisgICogICAgICAgICBNUFVfUkFTUiAgICAgU0laRSAgICAgICAgICBMTF9NUFVfQ29uZmlnUmVnaW9uCisgICogQHBhcmFtICBSZWdpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjcKKyAgKiBAcGFyYW0gIEFkZHJlc3MgVmFsdWUgb2YgcmVnaW9uIGJhc2UgYWRkcmVzcworICAqIEBwYXJhbSAgU3ViUmVnaW9uRGlzYWJsZSBTdWItcmVnaW9uIGRpc2FibGUgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHhGRgorICAqIEBwYXJhbSAgQXR0cmlidXRlcyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfMzJCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzY0QiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV8xMjhCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzI1NkIgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfNTEyQgorICAqICAgICAgICAgICBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV8xS0Igb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfMktCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzRLQiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV84S0Igb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfMTZLQgorICAqICAgICAgICAgICBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV8zMktCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzY0S0Igb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfMTI4S0Igb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfMjU2S0Igb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfNTEyS0IKKyAgKiAgICAgICAgICAgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfMU1CIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzJNQiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV80TUIgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfOE1CIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzE2TUIKKyAgKiAgICAgICAgICAgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfMzJNQiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV82NE1CIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzEyOE1CIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzI1Nk1CIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzUxMk1CCisgICogICAgICAgICAgIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzFHQiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV8yR0Igb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfNEdCCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OT19BQ0NFU1Mgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1BSSVZfUlcgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1BSSVZfUldfVVJPIG9yIEByZWYgTExfTVBVX1JFR0lPTl9GVUxMX0FDQ0VTUworICAqICAgICAgICAgICBvciBAcmVmIExMX01QVV9SRUdJT05fUFJJVl9STyBvciBAcmVmIExMX01QVV9SRUdJT05fUFJJVl9ST19VUk8KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfVEVYX0xFVkVMMCBvciBAcmVmIExMX01QVV9URVhfTEVWRUwxIG9yIEByZWYgTExfTVBVX1RFWF9MRVZFTDIgb3IgQHJlZiBMTF9NUFVfVEVYX0xFVkVMNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9JTlNUUlVDVElPTl9BQ0NFU1NfRU5BQkxFIG9yICBAcmVmIExMX01QVV9JTlNUUlVDVElPTl9BQ0NFU1NfRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9BQ0NFU1NfU0hBUkVBQkxFIG9yIEByZWYgTExfTVBVX0FDQ0VTU19OT1RfU0hBUkVBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX0FDQ0VTU19DQUNIRUFCTEUgb3IgQHJlZiBMTF9NUFVfQUNDRVNTX05PVF9DQUNIRUFCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfQUNDRVNTX0JVRkZFUkFCTEUgb3IgQHJlZiBMTF9NUFVfQUNDRVNTX05PVF9CVUZGRVJBQkxFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9NUFVfQ29uZmlnUmVnaW9uKHVpbnQzMl90IFJlZ2lvbiwgdWludDMyX3QgU3ViUmVnaW9uRGlzYWJsZSwgdWludDMyX3QgQWRkcmVzcywgdWludDMyX3QgQXR0cmlidXRlcykKK3sKKyAgLyogU2V0IFJlZ2lvbiBudW1iZXIgKi8KKyAgV1JJVEVfUkVHKE1QVS0+Uk5SLCBSZWdpb24pOworICAvKiBTZXQgYmFzZSBhZGRyZXNzICovCisgIFdSSVRFX1JFRyhNUFUtPlJCQVIsIChBZGRyZXNzICYgMHhGRkZGRkZFMFUpKTsKKyAgLyogQ29uZmlndXJlIE1QVSAqLworICBXUklURV9SRUcoTVBVLT5SQVNSLCAoTVBVX1JBU1JfRU5BQkxFX01zayB8IEF0dHJpYnV0ZXMgfCBTdWJSZWdpb25EaXNhYmxlIDw8IE1QVV9SQVNSX1NSRF9Qb3MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGEgcmVnaW9uCisgICogQHJtdG9sbCBNUFVfUk5SICAgICAgUkVHSU9OICAgICAgICBMTF9NUFVfRGlzYWJsZVJlZ2lvblxuCisgICogICAgICAgICBNUFVfUkFTUiAgICAgRU5BQkxFICAgICAgICBMTF9NUFVfRGlzYWJsZVJlZ2lvbgorICAqIEBwYXJhbSAgUmVnaW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI1CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI3CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9NUFVfRGlzYWJsZVJlZ2lvbih1aW50MzJfdCBSZWdpb24pCit7CisgIC8qIFNldCBSZWdpb24gbnVtYmVyICovCisgIFdSSVRFX1JFRyhNUFUtPlJOUiwgUmVnaW9uKTsKKyAgLyogRGlzYWJsZSB0aGUgTVBVIHJlZ2lvbiAqLworICBDTEVBUl9CSVQoTVBVLT5SQVNSLCBNUFVfUkFTUl9FTkFCTEVfTXNrKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIF9fTVBVX1BSRVNFTlQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyRjN4eF9MTF9DT1JURVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjN4eF9sbF9jcmMuaCBiL0luYy9zdG0zMmYzeHhfbGxfY3JjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA3ZDkzYQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmYzeHhfbGxfY3JjLmgKQEAgLTAsMCArMSw0NzcgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfbGxfY3JjLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIENSQyBMTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyRjN4eF9MTF9DUkNfSAorI2RlZmluZSBfX1NUTTMyRjN4eF9MTF9DUkNfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoQ1JDKQorCisvKiogQGRlZmdyb3VwIENSQ19MTCBDUkMKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JDX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBDUkMgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNfTExfRUNfUE9MWUxFTkdUSCBQb2x5bm9taWFsIGxlbmd0aAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0NSQ19QT0xZTEVOR1RIXzMyQiAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDMyIGJpdHMgUG9seW5vbWlhbCBzaXplICovCisjZGVmaW5lIExMX0NSQ19QT0xZTEVOR1RIXzE2QiAgICAgICAgICAgICAgQ1JDX0NSX1BPTFlTSVpFXzAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDE2IGJpdHMgUG9seW5vbWlhbCBzaXplICovCisjZGVmaW5lIExMX0NSQ19QT0xZTEVOR1RIXzhCICAgICAgICAgICAgICAgQ1JDX0NSX1BPTFlTSVpFXzEgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDggYml0cyBQb2x5bm9taWFsIHNpemUgKi8KKyNkZWZpbmUgTExfQ1JDX1BPTFlMRU5HVEhfN0IgICAgICAgICAgICAgICAoQ1JDX0NSX1BPTFlTSVpFXzEgfCBDUkNfQ1JfUE9MWVNJWkVfMCkgIC8qITwgNyBiaXRzIFBvbHlub21pYWwgc2l6ZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNfTExfRUNfSU5EQVRBX1JFVkVSU0UgSW5wdXQgRGF0YSBSZXZlcnNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ1JDX0lOREFUQV9SRVZFUlNFX05PTkUgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSW5wdXQgRGF0YSBiaXQgb3JkZXIgbm90IGFmZmVjdGVkICovCisjZGVmaW5lIExMX0NSQ19JTkRBVEFfUkVWRVJTRV9CWVRFICAgICAgICAgQ1JDX0NSX1JFVl9JTl8wICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IElucHV0IERhdGEgYml0IHJldmVyc2FsIGRvbmUgYnkgYnl0ZSAqLworI2RlZmluZSBMTF9DUkNfSU5EQVRBX1JFVkVSU0VfSEFMRldPUkQgICAgIENSQ19DUl9SRVZfSU5fMSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBEYXRhIGJpdCByZXZlcnNhbCBkb25lIGJ5IGhhbGYtd29yZCAqLworI2RlZmluZSBMTF9DUkNfSU5EQVRBX1JFVkVSU0VfV09SRCAgICAgICAgIChDUkNfQ1JfUkVWX0lOXzEgfCBDUkNfQ1JfUkVWX0lOXzApICAgICAgLyohPCBJbnB1dCBEYXRhIGJpdCByZXZlcnNhbCBkb25lIGJ5IHdvcmQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDX0xMX0VDX09VVERBVEFfUkVWRVJTRSBPdXRwdXQgRGF0YSBSZXZlcnNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ1JDX09VVERBVEFfUkVWRVJTRV9OT05FICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE91dHB1dCBEYXRhIGJpdCBvcmRlciBub3QgYWZmZWN0ZWQgKi8KKyNkZWZpbmUgTExfQ1JDX09VVERBVEFfUkVWRVJTRV9CSVQgICAgICAgICBDUkNfQ1JfUkVWX09VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE91dHB1dCBEYXRhIGJpdCByZXZlcnNhbCBkb25lIGJ5IGJpdCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNfTExfRUNfRGVmYXVsdF9Qb2x5bm9taWFsX1ZhbHVlICAgIERlZmF1bHQgQ1JDIGdlbmVyYXRpbmcgcG9seW5vbWlhbCB2YWx1ZQorICAqIEBicmllZiAgICBOb3JtYWwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwb2x5bm9taWFsIHZhbHVlIGlzCisgICogICAgICAgICAgIFheMzIgKyBYXjI2ICsgWF4yMyArIFheMjIgKyBYXjE2ICsgWF4xMiArIFheMTEgKyBYXjEwICtYXjggKyBYXjcgKyBYXjUgKyBYXjQgKyBYXjIgKyBYICsgMSAuCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ1JDX0RFRkFVTFRfQ1JDMzJfUE9MWSAgICAgICAgICAweDA0QzExREI3VSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERlZmF1bHQgQ1JDIGdlbmVyYXRpbmcgcG9seW5vbWlhbCB2YWx1ZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNfTExfRUNfRGVmYXVsdF9Jbml0VmFsdWUgICAgRGVmYXVsdCBDUkMgY29tcHV0YXRpb24gaW5pdGlhbGl6YXRpb24gdmFsdWUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9DUkNfREVGQVVMVF9DUkNfSU5JVFZBTFVFICAgICAgIDB4RkZGRkZGRkZVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGVmYXVsdCBDUkMgY29tcHV0YXRpb24gaW5pdGlhbGl6YXRpb24gdmFsdWUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENSQ19MTF9FeHBvcnRlZF9NYWNyb3MgQ1JDIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gQ1JDIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gQ1JDIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9DUkNfV3JpdGVSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fLCBfX1ZBTFVFX18pIFdSSVRFX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18sIChfX1ZBTFVFX18pKQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBDUkMgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBDUkMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfQ1JDX1JlYWRSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fKSBSRUFEX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18pCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENSQ19MTF9FeHBvcnRlZF9GdW5jdGlvbnMgQ1JDIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDX0xMX0VGX0NvbmZpZ3VyYXRpb24gQ1JDIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXNldCB0aGUgQ1JDIGNhbGN1bGF0aW9uIHVuaXQuCisgICogQG5vdGUgICBJZiBQcm9ncmFtbWFibGUgSW5pdGlhbCBDUkMgdmFsdWUgZmVhdHVyZQorICAqICAgICAgICAgaXMgYXZhaWxhYmxlLCBhbHNvIHNldCB0aGUgRGF0YSBSZWdpc3RlciB0byB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZQorICAqICAgICAgICAgQ1JDX0lOSVQgcmVnaXN0ZXIsIG90aGVyd2lzZSwgcmVzZXQgRGF0YSBSZWdpc3RlciB0byBpdHMgZGVmYXVsdCB2YWx1ZS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBSRVNFVCAgICAgICAgIExMX0NSQ19SZXNldENSQ0NhbGN1bGF0aW9uVW5pdAorICAqIEBwYXJhbSAgQ1JDeCBDUkMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSQ19SZXNldENSQ0NhbGN1bGF0aW9uVW5pdChDUkNfVHlwZURlZiAqQ1JDeCkKK3sKKyAgU0VUX0JJVChDUkN4LT5DUiwgQ1JDX0NSX1JFU0VUKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgc2l6ZSBvZiB0aGUgcG9seW5vbWlhbC4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBQT0xZU0laRSAgICAgIExMX0NSQ19TZXRQb2x5bm9taWFsU2l6ZQorICAqIEBwYXJhbSAgQ1JDeCBDUkMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBvbHlTaXplIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JDX1BPTFlMRU5HVEhfMzJCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JDX1BPTFlMRU5HVEhfMTZCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JDX1BPTFlMRU5HVEhfOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUkNfUE9MWUxFTkdUSF83QgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JDX1NldFBvbHlub21pYWxTaXplKENSQ19UeXBlRGVmICpDUkN4LCB1aW50MzJfdCBQb2x5U2l6ZSkKK3sKKyAgTU9ESUZZX1JFRyhDUkN4LT5DUiwgQ1JDX0NSX1BPTFlTSVpFLCBQb2x5U2l6ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHNpemUgb2YgdGhlIHBvbHlub21pYWwuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgUE9MWVNJWkUgICAgICBMTF9DUkNfR2V0UG9seW5vbWlhbFNpemUKKyAgKiBAcGFyYW0gIENSQ3ggQ1JDIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSQ19QT0xZTEVOR1RIXzMyQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSQ19QT0xZTEVOR1RIXzE2QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSQ19QT0xZTEVOR1RIXzhCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JDX1BPTFlMRU5HVEhfN0IKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUkNfR2V0UG9seW5vbWlhbFNpemUoQ1JDX1R5cGVEZWYgKkNSQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKENSQ3gtPkNSLCBDUkNfQ1JfUE9MWVNJWkUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIHJldmVyc2FsIG9mIHRoZSBiaXQgb3JkZXIgb2YgdGhlIGlucHV0IGRhdGEKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBSRVZfSU4gICAgICAgIExMX0NSQ19TZXRJbnB1dERhdGFSZXZlcnNlTW9kZQorICAqIEBwYXJhbSAgQ1JDeCBDUkMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJldmVyc2VNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JDX0lOREFUQV9SRVZFUlNFX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUkNfSU5EQVRBX1JFVkVSU0VfQllURQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSQ19JTkRBVEFfUkVWRVJTRV9IQUxGV09SRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSQ19JTkRBVEFfUkVWRVJTRV9XT1JECisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUkNfU2V0SW5wdXREYXRhUmV2ZXJzZU1vZGUoQ1JDX1R5cGVEZWYgKkNSQ3gsIHVpbnQzMl90IFJldmVyc2VNb2RlKQoreworICBNT0RJRllfUkVHKENSQ3gtPkNSLCBDUkNfQ1JfUkVWX0lOLCBSZXZlcnNlTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHR5cGUgb2YgcmV2ZXJzYWwgZm9yIGlucHV0IGRhdGEgYml0IG9yZGVyCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgUkVWX0lOICAgICAgICBMTF9DUkNfR2V0SW5wdXREYXRhUmV2ZXJzZU1vZGUKKyAgKiBAcGFyYW0gIENSQ3ggQ1JDIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSQ19JTkRBVEFfUkVWRVJTRV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JDX0lOREFUQV9SRVZFUlNFX0JZVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUkNfSU5EQVRBX1JFVkVSU0VfSEFMRldPUkQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUkNfSU5EQVRBX1JFVkVSU0VfV09SRAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSQ19HZXRJbnB1dERhdGFSZXZlcnNlTW9kZShDUkNfVHlwZURlZiAqQ1JDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ1JDeC0+Q1IsIENSQ19DUl9SRVZfSU4pKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIHJldmVyc2FsIG9mIHRoZSBiaXQgb3JkZXIgb2YgdGhlIE91dHB1dCBkYXRhCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgUkVWX09VVCAgICAgICBMTF9DUkNfU2V0T3V0cHV0RGF0YVJldmVyc2VNb2RlCisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgUmV2ZXJzZU1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUkNfT1VUREFUQV9SRVZFUlNFX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUkNfT1VUREFUQV9SRVZFUlNFX0JJVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JDX1NldE91dHB1dERhdGFSZXZlcnNlTW9kZShDUkNfVHlwZURlZiAqQ1JDeCwgdWludDMyX3QgUmV2ZXJzZU1vZGUpCit7CisgIE1PRElGWV9SRUcoQ1JDeC0+Q1IsIENSQ19DUl9SRVZfT1VULCBSZXZlcnNlTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSByZXZlcnNhbCBvZiB0aGUgYml0IG9yZGVyIG9mIHRoZSBPdXRwdXQgZGF0YQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFJFVl9PVVQgICAgICAgTExfQ1JDX0dldE91dHB1dERhdGFSZXZlcnNlTW9kZQorICAqIEBwYXJhbSAgQ1JDeCBDUkMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JDX09VVERBVEFfUkVWRVJTRV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JDX09VVERBVEFfUkVWRVJTRV9CSVQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUkNfR2V0T3V0cHV0RGF0YVJldmVyc2VNb2RlKENSQ19UeXBlRGVmICpDUkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDUkN4LT5DUiwgQ1JDX0NSX1JFVl9PVVQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBQcm9ncmFtbWFibGUgaW5pdGlhbCBDUkMgdmFsdWUuCisgICogQG5vdGUgICBJZiB0aGUgQ1JDIHNpemUgaXMgbGVzcyB0aGFuIDMyIGJpdHMsIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzCisgICogICAgICAgICBhcmUgdXNlZCB0byB3cml0ZSB0aGUgY29ycmVjdCB2YWx1ZQorICAqIEBub3RlICAgTExfQ1JDX0RFRkFVTFRfQ1JDX0lOSVRWQUxVRSBjb3VsZCBiZSB1c2VkIGFzIHZhbHVlIGZvciBJbml0Q3JjIHBhcmFtZXRlci4KKyAgKiBAcm10b2xsIElOSVQgICAgICAgICBJTklUICAgICAgICAgIExMX0NSQ19TZXRJbml0aWFsRGF0YQorICAqIEBwYXJhbSAgQ1JDeCBDUkMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEluaXRDcmMgVmFsdWUgdG8gYmUgcHJvZ3JhbW1lZCBpbiBQcm9ncmFtbWFibGUgaW5pdGlhbCBDUkMgdmFsdWUgcmVnaXN0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSQ19TZXRJbml0aWFsRGF0YShDUkNfVHlwZURlZiAqQ1JDeCwgdWludDMyX3QgSW5pdENyYykKK3sKKyAgV1JJVEVfUkVHKENSQ3gtPklOSVQsIEluaXRDcmMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBjdXJyZW50IEluaXRpYWwgQ1JDIHZhbHVlLgorICAqIEBub3RlICAgSWYgdGhlIENSQyBzaXplIGlzIGxlc3MgdGhhbiAzMiBiaXRzLCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cworICAqICAgICAgICAgYXJlIHVzZWQgdG8gcmVhZCB0aGUgY29ycmVjdCB2YWx1ZQorICAqIEBybXRvbGwgSU5JVCAgICAgICAgIElOSVQgICAgICAgICAgTExfQ1JDX0dldEluaXRpYWxEYXRhCisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgcHJvZ3JhbW1lZCBpbiBQcm9ncmFtbWFibGUgaW5pdGlhbCBDUkMgdmFsdWUgcmVnaXN0ZXIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUkNfR2V0SW5pdGlhbERhdGEoQ1JDX1R5cGVEZWYgKkNSQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKENSQ3gtPklOSVQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBQcm9ncmFtbWFibGUgcG9seW5vbWlhbCB2YWx1ZQorICAqICAgICAgICAgKGNvZWZmaWNpZW50cyBvZiB0aGUgcG9seW5vbWlhbCB0byBiZSB1c2VkIGZvciBDUkMgY2FsY3VsYXRpb24pLgorICAqIEBub3RlICAgTExfQ1JDX0RFRkFVTFRfQ1JDMzJfUE9MWSBjb3VsZCBiZSB1c2VkIGFzIHZhbHVlIGZvciBQb2x5bm9tQ29lZiBwYXJhbWV0ZXIuCisgICogQG5vdGUgICBQbGVhc2UgY2hlY2sgUmVmZXJlbmNlIE1hbnVhbCBhbmQgZXhpc3RpbmcgRXJyYXRhIFNoZWV0cywKKyAgKiAgICAgICAgIHJlZ2FyZGluZyBwb3NzaWJsZSBsaW1pdGF0aW9ucyBmb3IgUG9seW5vbWlhbCB2YWx1ZXMgdXNhZ2UuCisgICogICAgICAgICBGb3IgZXhhbXBsZSwgZm9yIGEgcG9seW5vbWlhbCBvZiBkZWdyZWUgNywgWF43ICsgWF42ICsgWF41ICsgWF4yICsgMSBpcyB3cml0dGVuIDB4NjUKKyAgKiBAcm10b2xsIFBPTCAgICAgICAgICBQT0wgICAgICAgICAgIExMX0NSQ19TZXRQb2x5bm9taWFsQ29lZgorICAqIEBwYXJhbSAgQ1JDeCBDUkMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBvbHlub21Db2VmIFZhbHVlIHRvIGJlIHByb2dyYW1tZWQgaW4gUHJvZ3JhbW1hYmxlIFBvbHlub21pYWwgdmFsdWUgcmVnaXN0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSQ19TZXRQb2x5bm9taWFsQ29lZihDUkNfVHlwZURlZiAqQ1JDeCwgdWludDMyX3QgUG9seW5vbUNvZWYpCit7CisgIFdSSVRFX1JFRyhDUkN4LT5QT0wsIFBvbHlub21Db2VmKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gY3VycmVudCBQcm9ncmFtbWFibGUgcG9seW5vbWlhbCB2YWx1ZQorICAqIEBub3RlICAgUGxlYXNlIGNoZWNrIFJlZmVyZW5jZSBNYW51YWwgYW5kIGV4aXN0aW5nIEVycmF0YSBTaGVldHMsCisgICogICAgICAgICByZWdhcmRpbmcgcG9zc2libGUgbGltaXRhdGlvbnMgZm9yIFBvbHlub21pYWwgdmFsdWVzIHVzYWdlLgorICAqICAgICAgICAgRm9yIGV4YW1wbGUsIGZvciBhIHBvbHlub21pYWwgb2YgZGVncmVlIDcsIFheNyArIFheNiArIFheNSArIFheMiArIDEgaXMgd3JpdHRlbiAweDY1CisgICogQHJtdG9sbCBQT0wgICAgICAgICAgUE9MICAgICAgICAgICBMTF9DUkNfR2V0UG9seW5vbWlhbENvZWYKKyAgKiBAcGFyYW0gIENSQ3ggQ1JDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBwcm9ncmFtbWVkIGluIFByb2dyYW1tYWJsZSBQb2x5bm9taWFsIHZhbHVlIHJlZ2lzdGVyCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JDX0dldFBvbHlub21pYWxDb2VmKENSQ19UeXBlRGVmICpDUkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhDUkN4LT5QT0wpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNfTExfRUZfRGF0YV9NYW5hZ2VtZW50IERhdGFfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgZ2l2ZW4gMzItYml0IGRhdGEgdG8gdGhlIENSQyBjYWxjdWxhdG9yCisgICogQHJtdG9sbCBEUiAgICAgICAgICAgRFIgICAgICAgICAgICBMTF9DUkNfRmVlZERhdGEzMgorICAqIEBwYXJhbSAgQ1JDeCBDUkMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEluRGF0YSB2YWx1ZSB0byBiZSBwcm92aWRlZCB0byBDUkMgY2FsY3VsYXRvciBiZXR3ZWVuIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGRkZGRkZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JDX0ZlZWREYXRhMzIoQ1JDX1R5cGVEZWYgKkNSQ3gsIHVpbnQzMl90IEluRGF0YSkKK3sKKyAgV1JJVEVfUkVHKENSQ3gtPkRSLCBJbkRhdGEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGdpdmVuIDE2LWJpdCBkYXRhIHRvIHRoZSBDUkMgY2FsY3VsYXRvcgorICAqIEBybXRvbGwgRFIgICAgICAgICAgIERSICAgICAgICAgICAgTExfQ1JDX0ZlZWREYXRhMTYKKyAgKiBAcGFyYW0gIENSQ3ggQ1JDIEluc3RhbmNlCisgICogQHBhcmFtICBJbkRhdGEgMTYgYml0IHZhbHVlIHRvIGJlIHByb3ZpZGVkIHRvIENSQyBjYWxjdWxhdG9yIGJldHdlZW4gYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weEZGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSQ19GZWVkRGF0YTE2KENSQ19UeXBlRGVmICpDUkN4LCB1aW50MTZfdCBJbkRhdGEpCit7CisgICoodWludDE2X3QgX19JTyAqKSgmQ1JDeC0+RFIpID0gKHVpbnQxNl90KSBJbkRhdGE7Cit9CisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgZ2l2ZW4gOC1iaXQgZGF0YSB0byB0aGUgQ1JDIGNhbGN1bGF0b3IKKyAgKiBAcm10b2xsIERSICAgICAgICAgICBEUiAgICAgICAgICAgIExMX0NSQ19GZWVkRGF0YTgKKyAgKiBAcGFyYW0gIENSQ3ggQ1JDIEluc3RhbmNlCisgICogQHBhcmFtICBJbkRhdGEgOCBiaXQgdmFsdWUgdG8gYmUgcHJvdmlkZWQgdG8gQ1JDIGNhbGN1bGF0b3IgYmV0d2VlbiBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSQ19GZWVkRGF0YTgoQ1JDX1R5cGVEZWYgKkNSQ3gsIHVpbnQ4X3QgSW5EYXRhKQoreworICAqKHVpbnQ4X3QgX19JTyAqKSgmQ1JDeC0+RFIpID0gKHVpbnQ4X3QpIEluRGF0YTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gY3VycmVudCBDUkMgY2FsY3VsYXRpb24gcmVzdWx0LiAzMiBiaXRzIHZhbHVlIGlzIHJldHVybmVkLgorICAqIEBybXRvbGwgRFIgICAgICAgICAgIERSICAgICAgICAgICAgTExfQ1JDX1JlYWREYXRhMzIKKyAgKiBAcGFyYW0gIENSQ3ggQ1JDIEluc3RhbmNlCisgICogQHJldHZhbCBDdXJyZW50IENSQyBjYWxjdWxhdGlvbiByZXN1bHQgYXMgc3RvcmVkIGluIENSQ19EUiByZWdpc3RlciAoMzIgYml0cykuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JDX1JlYWREYXRhMzIoQ1JDX1R5cGVEZWYgKkNSQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKENSQ3gtPkRSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGN1cnJlbnQgQ1JDIGNhbGN1bGF0aW9uIHJlc3VsdC4gMTYgYml0cyB2YWx1ZSBpcyByZXR1cm5lZC4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gYmUgdXNlZCBpbiBhIDE2IGJpdHMgQ1JDIHBvbHlub21pYWwgc2l6ZSBjb250ZXh0LgorICAqIEBybXRvbGwgRFIgICAgICAgICAgIERSICAgICAgICAgICAgTExfQ1JDX1JlYWREYXRhMTYKKyAgKiBAcGFyYW0gIENSQ3ggQ1JDIEluc3RhbmNlCisgICogQHJldHZhbCBDdXJyZW50IENSQyBjYWxjdWxhdGlvbiByZXN1bHQgYXMgc3RvcmVkIGluIENSQ19EUiByZWdpc3RlciAoMTYgYml0cykuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDE2X3QgTExfQ1JDX1JlYWREYXRhMTYoQ1JDX1R5cGVEZWYgKkNSQ3gpCit7CisgIHJldHVybiAodWludDE2X3QpUkVBRF9SRUcoQ1JDeC0+RFIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBjdXJyZW50IENSQyBjYWxjdWxhdGlvbiByZXN1bHQuIDggYml0cyB2YWx1ZSBpcyByZXR1cm5lZC4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gYmUgdXNlZCBpbiBhIDggYml0cyBDUkMgcG9seW5vbWlhbCBzaXplIGNvbnRleHQuCisgICogQHJtdG9sbCBEUiAgICAgICAgICAgRFIgICAgICAgICAgICBMTF9DUkNfUmVhZERhdGE4CisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEByZXR2YWwgQ3VycmVudCBDUkMgY2FsY3VsYXRpb24gcmVzdWx0IGFzIHN0b3JlZCBpbiBDUkNfRFIgcmVnaXN0ZXIgKDggYml0cykuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDhfdCBMTF9DUkNfUmVhZERhdGE4KENSQ19UeXBlRGVmICpDUkN4KQoreworICByZXR1cm4gKHVpbnQ4X3QpUkVBRF9SRUcoQ1JDeC0+RFIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBjdXJyZW50IENSQyBjYWxjdWxhdGlvbiByZXN1bHQuIDcgYml0cyB2YWx1ZSBpcyByZXR1cm5lZC4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gYmUgdXNlZCBpbiBhIDcgYml0cyBDUkMgcG9seW5vbWlhbCBzaXplIGNvbnRleHQuCisgICogQHJtdG9sbCBEUiAgICAgICAgICAgRFIgICAgICAgICAgICBMTF9DUkNfUmVhZERhdGE3CisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEByZXR2YWwgQ3VycmVudCBDUkMgY2FsY3VsYXRpb24gcmVzdWx0IGFzIHN0b3JlZCBpbiBDUkNfRFIgcmVnaXN0ZXIgKDcgYml0cykuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDhfdCBMTF9DUkNfUmVhZERhdGE3KENSQ19UeXBlRGVmICpDUkN4KQoreworICByZXR1cm4gKHVpbnQ4X3QpKFJFQURfUkVHKENSQ3gtPkRSKSAmIDB4N0ZVKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gZGF0YSBzdG9yZWQgaW4gdGhlIEluZGVwZW5kZW50IERhdGEoSURSKSByZWdpc3Rlci4KKyAgKiBAbm90ZSAgIFRoaXMgcmVnaXN0ZXIgY2FuIGJlIHVzZWQgYXMgYSB0ZW1wb3Jhcnkgc3RvcmFnZSBsb2NhdGlvbiBmb3Igb25lIGJ5dGUuCisgICogQHJtdG9sbCBJRFIgICAgICAgICAgSURSICAgICAgICAgICBMTF9DUkNfUmVhZF9JRFIKKyAgKiBAcGFyYW0gIENSQ3ggQ1JDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBzdG9yZWQgaW4gQ1JDX0lEUiByZWdpc3RlciAoR2VuZXJhbC1wdXJwb3NlIDgtYml0IGRhdGEgcmVnaXN0ZXIpLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSQ19SZWFkX0lEUihDUkNfVHlwZURlZiAqQ1JDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoQ1JDeC0+SURSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcmUgZGF0YSBpbiB0aGUgSW5kZXBlbmRlbnQgRGF0YShJRFIpIHJlZ2lzdGVyLgorICAqIEBub3RlICAgVGhpcyByZWdpc3RlciBjYW4gYmUgdXNlZCBhcyBhIHRlbXBvcmFyeSBzdG9yYWdlIGxvY2F0aW9uIGZvciBvbmUgYnl0ZS4KKyAgKiBAcm10b2xsIElEUiAgICAgICAgICBJRFIgICAgICAgICAgIExMX0NSQ19Xcml0ZV9JRFIKKyAgKiBAcGFyYW0gIENSQ3ggQ1JDIEluc3RhbmNlCisgICogQHBhcmFtICBJbkRhdGEgdmFsdWUgdG8gYmUgc3RvcmVkIGluIENSQ19JRFIgcmVnaXN0ZXIgKDgtYml0KSBiZXR3ZWVuIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JDX1dyaXRlX0lEUihDUkNfVHlwZURlZiAqQ1JDeCwgdWludDMyX3QgSW5EYXRhKQoreworICAqKCh1aW50OF90IF9fSU8gKikoJkNSQ3gtPklEUikpID0gKHVpbnQ4X3QpIEluRGF0YTsKK30KKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgQ1JDX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKK0Vycm9yU3RhdHVzIExMX0NSQ19EZUluaXQoQ1JDX1R5cGVEZWYgKkNSQ3gpOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogZGVmaW5lZChDUkMpICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyRjN4eF9MTF9DUkNfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjN4eF9sbF9kYWMuaCBiL0luYy9zdG0zMmYzeHhfbGxfZGFjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y4YmRjYgotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmYzeHhfbGxfZGFjLmgKQEAgLTAsMCArMSwxNTI2IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2xsX2RhYy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBEQUMgTEwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkYzeHhfTExfREFDX0gKKyNkZWZpbmUgX19TVE0zMkYzeHhfTExfREFDX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkIChEQUMxKSB8fCBkZWZpbmVkIChEQUMyKQorCisvKiogQGRlZmdyb3VwIERBQ19MTCBEQUMKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgREFDX0xMX1ByaXZhdGVfQ29uc3RhbnRzIERBQyBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qIEludGVybmFsIG1hc2tzIGZvciBEQUMgY2hhbm5lbHMgZGVmaW5pdGlvbiAqLworLyogVG8gc2VsZWN0IGludG8gbGl0ZXJhbCBMTF9EQUNfQ0hBTk5FTF94IHRoZSByZWxldmFudCBiaXRzIGZvcjogICAgICAgICAgICAgKi8KKy8qIC0gY2hhbm5lbCBiaXRzIHBvc2l0aW9uIGludG8gcmVnaXN0ZXIgQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtIGNoYW5uZWwgYml0cyBwb3NpdGlvbiBpbnRvIHJlZ2lzdGVyIFNXVFJJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLSBjaGFubmVsIHJlZ2lzdGVyIG9mZnNldCBvZiBkYXRhIGhvbGRpbmcgcmVnaXN0ZXIgREhSeCAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0gY2hhbm5lbCByZWdpc3RlciBvZmZzZXQgb2YgZGF0YSBvdXRwdXQgcmVnaXN0ZXIgRE9SeCAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERBQ19DUl9DSDFfQklUT0ZGU0VUICAgICAgICAgICAwVSAgICAvKiBQb3NpdGlvbiBvZiBjaGFubmVsIGJpdHMgaW50byByZWdpc3RlcnMgQ1IsIE1DUiwgQ0NSLCBTSEhSLCBTSFJSIG9mIGNoYW5uZWwgMSAqLworI2RlZmluZSBEQUNfQ1JfQ0gyX0JJVE9GRlNFVCAgICAgICAgICAgMTZVICAgLyogUG9zaXRpb24gb2YgY2hhbm5lbCBiaXRzIGludG8gcmVnaXN0ZXJzIENSLCBNQ1IsIENDUiwgU0hIUiwgU0hSUiBvZiBjaGFubmVsIDIgKi8KKyNkZWZpbmUgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSyAgICAgIChEQUNfQ1JfQ0gxX0JJVE9GRlNFVCB8IERBQ19DUl9DSDJfQklUT0ZGU0VUKQorCisjZGVmaW5lIERBQ19TV1RSX0NIMSAgICAgICAgICAgICAgICAgICAoREFDX1NXVFJJR1JfU1dUUklHMSkgLyogQ2hhbm5lbCBiaXQgaW50byByZWdpc3RlciBTV1RSSUdSIG9mIGNoYW5uZWwgMS4gVGhpcyBiaXQgaXMgaW50byBhcmVhIG9mIExMX0RBQ19DUl9DSHhfQklUT0ZGU0VUIGJ1dCBleGNsdWRlZCBieSBtYXNrIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0sgKGRvbmUgdG8gYmUgZW5hYmxlIHRvIHRyaWcgU1cgc3RhcnQgb2YgYm90aCBEQUMgY2hhbm5lbHMgc2ltdWx0YW5lb3VzbHkpLiAqLworI2lmIGRlZmluZWQoREFDX0NIQU5ORUwyX1NVUFBPUlQpCisjZGVmaW5lIERBQ19TV1RSX0NIMiAgICAgICAgICAgICAgICAgICAoREFDX1NXVFJJR1JfU1dUUklHMikgLyogQ2hhbm5lbCBiaXQgaW50byByZWdpc3RlciBTV1RSSUdSIG9mIGNoYW5uZWwgMi4gVGhpcyBiaXQgaXMgaW50byBhcmVhIG9mIExMX0RBQ19DUl9DSHhfQklUT0ZGU0VUIGJ1dCBleGNsdWRlZCBieSBtYXNrIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0sgKGRvbmUgdG8gYmUgZW5hYmxlIHRvIHRyaWcgU1cgc3RhcnQgb2YgYm90aCBEQUMgY2hhbm5lbHMgc2ltdWx0YW5lb3VzbHkpLiAqLworI2RlZmluZSBEQUNfU1dUUl9DSFhfTUFTSyAgICAgICAgICAgICAgKERBQ19TV1RSX0NIMSB8IERBQ19TV1RSX0NIMikKKyNlbHNlCisjZGVmaW5lIERBQ19TV1RSX0NIWF9NQVNLICAgICAgICAgICAgICAoREFDX1NXVFJfQ0gxKQorI2VuZGlmIC8qIERBQ19DSEFOTkVMMl9TVVBQT1JUICovCisKKyNkZWZpbmUgREFDX1JFR19ESFIxMlIxX1JFR09GRlNFVCAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qIFJlZ2lzdGVyIERIUjEyUnggY2hhbm5lbCAxIHRha2VuIGFzIHJlZmVyZW5jZSAqLworI2RlZmluZSBEQUNfUkVHX0RIUjEyTDFfUkVHT0ZGU0VUICAgICAgMHgwMDEwMDAwMFUgICAgICAgICAgICAgLyogUmVnaXN0ZXIgb2Zmc2V0IG9mIERIUjEyTHggY2hhbm5lbCAxIHZlcnN1cyBESFIxMlJ4IGNoYW5uZWwgMSAoc2hpZnRlZCBsZWZ0IG9mIDIwIGJpdHMpICovCisjZGVmaW5lIERBQ19SRUdfREhSOFIxX1JFR09GRlNFVCAgICAgICAweDAyMDAwMDAwVSAgICAgICAgICAgICAvKiBSZWdpc3RlciBvZmZzZXQgb2YgREhSOFJ4ICBjaGFubmVsIDEgdmVyc3VzIERIUjEyUnggY2hhbm5lbCAxIChzaGlmdGVkIGxlZnQgb2YgMjQgYml0cykgKi8KKyNpZiBkZWZpbmVkKERBQ19DSEFOTkVMMl9TVVBQT1JUKQorI2RlZmluZSBEQUNfUkVHX0RIUjEyUjJfUkVHT0ZGU0VUICAgICAgMHgwMDAzMDAwMFUgICAgICAgICAgICAgLyogUmVnaXN0ZXIgb2Zmc2V0IG9mIERIUjEyUnggY2hhbm5lbCAyIHZlcnN1cyBESFIxMlJ4IGNoYW5uZWwgMSAoc2hpZnRlZCBsZWZ0IG9mIDE2IGJpdHMpICovCisjZGVmaW5lIERBQ19SRUdfREhSMTJMMl9SRUdPRkZTRVQgICAgICAweDAwNDAwMDAwVSAgICAgICAgICAgICAvKiBSZWdpc3RlciBvZmZzZXQgb2YgREhSMTJMeCBjaGFubmVsIDIgdmVyc3VzIERIUjEyUnggY2hhbm5lbCAxIChzaGlmdGVkIGxlZnQgb2YgMjAgYml0cykgKi8KKyNkZWZpbmUgREFDX1JFR19ESFI4UjJfUkVHT0ZGU0VUICAgICAgIDB4MDUwMDAwMDBVICAgICAgICAgICAgIC8qIFJlZ2lzdGVyIG9mZnNldCBvZiBESFI4UnggIGNoYW5uZWwgMiB2ZXJzdXMgREhSMTJSeCBjaGFubmVsIDEgKHNoaWZ0ZWQgbGVmdCBvZiAyNCBiaXRzKSAqLworI2VuZGlmIC8qIERBQ19DSEFOTkVMMl9TVVBQT1JUICovCisjZGVmaW5lIERBQ19SRUdfREhSMTJSWF9SRUdPRkZTRVRfTUFTSyAweDAwMEYwMDAwVQorI2RlZmluZSBEQUNfUkVHX0RIUjEyTFhfUkVHT0ZGU0VUX01BU0sgMHgwMEYwMDAwMFUKKyNkZWZpbmUgREFDX1JFR19ESFI4UlhfUkVHT0ZGU0VUX01BU0sgIDB4MEYwMDAwMDBVCisjZGVmaW5lIERBQ19SRUdfREhSWF9SRUdPRkZTRVRfTUFTSyAgICAoREFDX1JFR19ESFIxMlJYX1JFR09GRlNFVF9NQVNLIHwgREFDX1JFR19ESFIxMkxYX1JFR09GRlNFVF9NQVNLIHwgREFDX1JFR19ESFI4UlhfUkVHT0ZGU0VUX01BU0spCisKKyNkZWZpbmUgREFDX1JFR19ET1IxX1JFR09GRlNFVCAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qIFJlZ2lzdGVyIERPUnggY2hhbm5lbCAxIHRha2VuIGFzIHJlZmVyZW5jZSAqLworI2lmIGRlZmluZWQoREFDX0NIQU5ORUwyX1NVUFBPUlQpCisjZGVmaW5lIERBQ19SRUdfRE9SMl9SRUdPRkZTRVQgICAgICAgICAweDEwMDAwMDAwVSAgICAgICAgICAgICAvKiBSZWdpc3RlciBvZmZzZXQgb2YgRE9SeCBjaGFubmVsIDEgdmVyc3VzIERPUnggY2hhbm5lbCAyIChzaGlmdGVkIGxlZnQgb2YgMjggYml0cykgKi8KKyNkZWZpbmUgREFDX1JFR19ET1JYX1JFR09GRlNFVF9NQVNLICAgIChEQUNfUkVHX0RPUjFfUkVHT0ZGU0VUIHwgREFDX1JFR19ET1IyX1JFR09GRlNFVCkKKyNlbHNlCisjZGVmaW5lIERBQ19SRUdfRE9SWF9SRUdPRkZTRVRfTUFTSyAgICAoREFDX1JFR19ET1IxX1JFR09GRlNFVCkKKyNlbmRpZiAvKiBEQUNfQ0hBTk5FTDJfU1VQUE9SVCAqLworCisvKiBEQUMgcmVnaXN0ZXJzIGJpdHMgcG9zaXRpb25zICovCisjaWYgZGVmaW5lZChEQUNfQ0hBTk5FTDJfU1VQUE9SVCkKKyNkZWZpbmUgREFDX0RIUjEyUkRfREFDQzJESFJfQklUT0ZGU0VUX1BPUyAgICAgICAgICAgICAgICAxNlUgIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKERBQ19ESFIxMlJEX0RBQ0MyREhSKSAqLworI2RlZmluZSBEQUNfREhSMTJMRF9EQUNDMkRIUl9CSVRPRkZTRVRfUE9TICAgICAgICAgICAgICAgIDIwVSAgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoREFDX0RIUjEyTERfREFDQzJESFIpICovCisjZGVmaW5lIERBQ19ESFI4UkRfREFDQzJESFJfQklUT0ZGU0VUX1BPUyAgICAgICAgICAgICAgICAgIDhVICAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChEQUNfREhSOFJEX0RBQ0MyREhSKSAqLworI2VuZGlmIC8qIERBQ19DSEFOTkVMMl9TVVBQT1JUICovCisKKy8qIE1pc2NlbGxhbmVvdXMgZGF0YSAqLworI2RlZmluZSBEQUNfRElHSVRBTF9TQ0FMRV8xMkJJVFMgICAgICAgICAgICAgICAgICAgICAgICA0MDk1VSAgLyogRnVsbC1zY2FsZSBkaWdpdGFsIHZhbHVlIHdpdGggYSByZXNvbHV0aW9uIG9mIDEyIGJpdHMgKHZvbHRhZ2UgcmFuZ2UgZGV0ZXJtaW5lZCBieSBhbmFsb2cgdm9sdGFnZSByZWZlcmVuY2VzIFZyZWYrIGFuZCBWcmVmLSwgcmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCkgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBEQUNfTExfUHJpdmF0ZV9NYWNyb3MgREFDIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBEcml2ZXIgbWFjcm8gcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZTogaXNvbGF0ZSBiaXRzIHdpdGggdGhlCisgICogICAgICAgICBzZWxlY3RlZCBtYXNrIGFuZCBzaGlmdCB0aGVtIHRvIHRoZSByZWdpc3RlciBMU0IKKyAgKiAgICAgICAgIChzaGlmdCBtYXNrIG9uIHJlZ2lzdGVyIHBvc2l0aW9uIGJpdCAwKS4KKyAgKiBAcGFyYW0gIF9fQklUU19fIEJpdHMgaW4gcmVnaXN0ZXIgMzIgYml0cworICAqIEBwYXJhbSAgX19NQVNLX18gTWFzayBpbiByZWdpc3RlciAzMiBiaXRzCisgICogQHJldHZhbCBCaXRzIGluIHJlZ2lzdGVyIDMyIGJpdHMKKyovCisjZGVmaW5lIF9fREFDX01BU0tfU0hJRlQoX19CSVRTX18sIF9fTUFTS19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX0JJVFNfXykgJiAoX19NQVNLX18pKSA+PiBQT1NJVElPTl9WQUwoKF9fTUFTS19fKSkpCisKKy8qKgorICAqIEBicmllZiAgRHJpdmVyIG1hY3JvIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2U6IHNldCBhIHBvaW50ZXIgdG8KKyAgKiAgICAgICAgIGEgcmVnaXN0ZXIgZnJvbSBhIHJlZ2lzdGVyIGJhc2lzIGZyb20gd2hpY2ggYW4gb2Zmc2V0CisgICogICAgICAgICBpcyBhcHBsaWVkLgorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciBiYXNpcyBmcm9tIHdoaWNoIHRoZSBvZmZzZXQgaXMgYXBwbGllZC4KKyAgKiBAcGFyYW0gIF9fUkVHX09GRkZTRVRfXyBPZmZzZXQgdG8gYmUgYXBwbGllZCAodW5pdDogbnVtYmVyIG9mIHJlZ2lzdGVycykuCisgICogQHJldHZhbCBQb2ludGVyIHRvIHJlZ2lzdGVyIGFkZHJlc3MKKyovCisjZGVmaW5lIF9fREFDX1BUUl9SRUdfT0ZGU0VUKF9fUkVHX18sIF9fUkVHX09GRkZTRVRfXykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICgoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpICgodWludDMyX3QpKCYoX19SRUdfXykpICsgKChfX1JFR19PRkZGU0VUX18pIDw8IDJVKSkpKQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIERBQ19MTF9FU19JTklUIERBQyBFeHBvcnRlZCBJbml0IHN0cnVjdHVyZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU3RydWN0dXJlIGRlZmluaXRpb24gb2Ygc29tZSBmZWF0dXJlcyBvZiBEQUMgaW5zdGFuY2UuCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBUcmlnZ2VyU291cmNlOyAgICAgICAgICAgICAgIC8qITwgU2V0IHRoZSBjb252ZXJzaW9uIHRyaWdnZXIgc291cmNlIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWw6IGludGVybmFsIChTVyBzdGFydCkgb3IgZnJvbSBleHRlcm5hbCBJUCAodGltZXIgZXZlbnQsIGV4dGVybmFsIGludGVycnVwdCBsaW5lKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgREFDX0xMX0VDX1RSSUdHRVJfU09VUkNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfREFDX1NldFRyaWdnZXJTb3VyY2UoKS4gKi8KKworICB1aW50MzJfdCBXYXZlQXV0b0dlbmVyYXRpb247ICAgICAgICAgIC8qITwgU2V0IHRoZSB3YXZlZm9ybSBhdXRvbWF0aWMgZ2VuZXJhdGlvbiBtb2RlIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERBQ19MTF9FQ19XQVZFX0FVVE9fR0VORVJBVElPTl9NT0RFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfREFDX1NldFdhdmVBdXRvR2VuZXJhdGlvbigpLiAqLworCisgIHVpbnQzMl90IFdhdmVBdXRvR2VuZXJhdGlvbkNvbmZpZzsgICAgLyohPCBTZXQgdGhlIHdhdmVmb3JtIGF1dG9tYXRpYyBnZW5lcmF0aW9uIG1vZGUgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHdhdmVmb3JtIGF1dG9tYXRpYyBnZW5lcmF0aW9uIG1vZGUgaXMgc2V0IHRvIG5vaXNlLCB0aGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERBQ19MTF9FQ19XQVZFX05PSVNFX0xGU1JfVU5NQVNLX0JJVFMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHdhdmVmb3JtIGF1dG9tYXRpYyBnZW5lcmF0aW9uIG1vZGUgaXMgc2V0IHRvIHRyaWFuZ2xlLCB0aGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERBQ19MTF9FQ19XQVZFX1RSSUFOR0xFX0FNUExJVFVERQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgSWYgd2F2ZWZvcm0gYXV0b21hdGljIGdlbmVyYXRpb24gbW9kZSBpcyBkaXNhYmxlZCwgdGhpcyBwYXJhbWV0ZXIgaXMgZGlzY2FyZGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0RBQ19TZXRXYXZlTm9pc2VMRlNSKCkgb3IgQHJlZiBMTF9EQUNfU2V0V2F2ZVRyaWFuZ2xlQW1wbGl0dWRlKCksIGRlcGVuZGluZyBvbiB0aGUgd2F2ZSBhdXRvbWF0aWMgZ2VuZXJhdGlvbiBzZWxlY3RlZC4gKi8KKworICB1aW50MzJfdCBPdXRwdXRCdWZmZXI7ICAgICAgICAgICAgICAgIC8qITwgU2V0IHRoZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERBQ19MTF9FQ19PVVRQVVRfQlVGRkVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfREFDX1NldE91dHB1dEJ1ZmZlcigpLiAqLworCit9IExMX0RBQ19Jbml0VHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgREFDX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBEQUMgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfTExfRUNfR0VUX0ZMQUcgREFDIGZsYWdzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9EQUNfUmVhZFJlZyBmdW5jdGlvbgorICAqIEB7CisgICovCisvKiBEQUMgY2hhbm5lbCAxIGZsYWdzICovCisjZGVmaW5lIExMX0RBQ19GTEFHX0RNQVVEUjEgICAgICAgICAgICAgICAgKERBQ19TUl9ETUFVRFIxKSAgIC8qITwgREFDIGNoYW5uZWwgMSBmbGFnIERNQSB1bmRlcnJ1biAqLworCisjaWYgZGVmaW5lZChEQUNfQ0hBTk5FTDJfU1VQUE9SVCkKKy8qIERBQyBjaGFubmVsIDIgZmxhZ3MgKi8KKyNkZWZpbmUgTExfREFDX0ZMQUdfRE1BVURSMiAgICAgICAgICAgICAgICAoREFDX1NSX0RNQVVEUjIpICAgLyohPCBEQUMgY2hhbm5lbCAyIGZsYWcgRE1BIHVuZGVycnVuICovCisjZW5kaWYgLyogREFDX0NIQU5ORUwyX1NVUFBPUlQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0xMX0VDX0lUIERBQyBpbnRlcnJ1cHRpb25zCisgICogQGJyaWVmICAgIElUIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9EQUNfUmVhZFJlZyBhbmQgIExMX0RBQ19Xcml0ZVJlZyBmdW5jdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9EQUNfSVRfRE1BVURSSUUxICAgICAgICAgICAgICAgIChEQUNfQ1JfRE1BVURSSUUxKSAvKiE8IERBQyBjaGFubmVsIDEgaW50ZXJydXB0aW9uIERNQSB1bmRlcnJ1biAqLworI2lmIGRlZmluZWQoREFDX0NIQU5ORUwyX1NVUFBPUlQpCisjZGVmaW5lIExMX0RBQ19JVF9ETUFVRFJJRTIgICAgICAgICAgICAgICAgKERBQ19DUl9ETUFVRFJJRTIpIC8qITwgREFDIGNoYW5uZWwgMiBpbnRlcnJ1cHRpb24gRE1BIHVuZGVycnVuICovCisjZW5kaWYgLyogREFDX0NIQU5ORUwyX1NVUFBPUlQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0xMX0VDX0NIQU5ORUwgREFDIGNoYW5uZWxzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfREFDX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgICAoREFDX1JFR19ET1IxX1JFR09GRlNFVCB8IERBQ19SRUdfREhSMTJSMV9SRUdPRkZTRVQgfCBEQUNfUkVHX0RIUjEyTDFfUkVHT0ZGU0VUIHwgREFDX1JFR19ESFI4UjFfUkVHT0ZGU0VUIHwgREFDX0NSX0NIMV9CSVRPRkZTRVQgfCBEQUNfU1dUUl9DSDEpIC8qITwgREFDIGNoYW5uZWwgMSAqLworI2lmIGRlZmluZWQoREFDX0NIQU5ORUwyX1NVUFBPUlQpCisjZGVmaW5lIExMX0RBQ19DSEFOTkVMXzIgICAgICAgICAgICAgICAgICAgKERBQ19SRUdfRE9SMl9SRUdPRkZTRVQgfCBEQUNfUkVHX0RIUjEyUjJfUkVHT0ZGU0VUIHwgREFDX1JFR19ESFIxMkwyX1JFR09GRlNFVCB8IERBQ19SRUdfREhSOFIyX1JFR09GRlNFVCB8IERBQ19DUl9DSDJfQklUT0ZGU0VUIHwgREFDX1NXVFJfQ0gyKSAvKiE8IERBQyBjaGFubmVsIDIgKi8KKyNlbmRpZiAvKiBEQUNfQ0hBTk5FTDJfU1VQUE9SVCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfTExfRUNfVFJJR0dFUl9TT1VSQ0UgREFDIHRyaWdnZXIgc291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfREFDX1RSSUdfU09GVFdBUkUgICAgICAgICAgICAgICAoREFDX0NSX1RTRUwxXzIgfCBEQUNfQ1JfVFNFTDFfMSB8IERBQ19DUl9UU0VMMV8wKSAvKiE8IERBQyBjaGFubmVsIGNvbnZlcnNpb24gdHJpZ2dlciBpbnRlcm5hbCAoU1cgc3RhcnQpICovCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkKKyNkZWZpbmUgTExfREFDX1RSSUdfRVhUX1RJTTZfVFJHTyAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERBQyBjaGFubmVsIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU02IFRSR08uICovCisjZGVmaW5lIExMX0RBQ19UUklHX0VYVF9USU0zX1RSR08gICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUNfQ1JfVFNFTDFfMCkgLyohPCBEQUMgY2hhbm5lbCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMyBUUkdPLiBUcmlnZ2VyIHJlbWFwOiBieSBkZWZhdWx0LCBkZWZhdWx0IHRyaWdnZXIuIElmIG5lZWRlZCB0byByZXN0b3JlIHRyaWdnZXIsIHVzZSBAcmVmIExMX1NZU0NGR19EQUMxX1RSSUcxX1JFTUFQX1RJTTNfVFJHTyBmb3IgVElNMyBzZWxlY3Rpb24uICovCisjZGVmaW5lIExMX0RBQ19UUklHX0VYVF9USU03X1RSR08gICAgICAgICAgKCAgICAgICAgICAgICAgICAgREFDX0NSX1RTRUwxXzEgICAgICAgICAgICAgICAgICkgLyohPCBEQUMgY2hhbm5lbCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNNyBUUkdPLiAqLworI2RlZmluZSBMTF9EQUNfVFJJR19FWFRfVElNMTVfVFJHTyAgICAgICAgICggICAgICAgICAgICAgICAgIERBQ19DUl9UU0VMMV8xIHwgREFDX0NSX1RTRUwxXzApIC8qITwgREFDIGNoYW5uZWwgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTUgVFJHTy4gKi8KKyNkZWZpbmUgTExfREFDX1RSSUdfRVhUX1RJTTJfVFJHTyAgICAgICAgICAoREFDX0NSX1RTRUwxXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAvKiE8IERBQyBjaGFubmVsIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0yIFRSR08uICovCisjZGVmaW5lIExMX0RBQ19UUklHX0VYVF9USU00X1RSR08gICAgICAgICAgKERBQ19DUl9UU0VMMV8yICAgICAgICAgICAgICAgICAgfCBEQUNfQ1JfVFNFTDFfMCkgLyohPCBEQUMgY2hhbm5lbCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNNCBUUkdPLiAqLworI2RlZmluZSBMTF9EQUNfVFJJR19FWFRfVElNOF9UUkdPICAgICAgICAgIChMTF9EQUNfVFJJR19FWFRfVElNM19UUkdPKSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgREFDIGNoYW5uZWwgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTggVFJHTy4gVHJpZ2dlciByZW1hcDogdXNlIEByZWYgTExfU1lTQ0ZHX0RBQzFfVFJJRzFfUkVNQVBfVElNOF9UUkdPIGZvciBUSU04IHNlbGVjdGlvbi4gKi8KKyNkZWZpbmUgTExfREFDX1RSSUdfRVhUX0VYVElfTElORTkgICAgICAgICAoREFDX0NSX1RTRUwxXzIgfCBEQUNfQ1JfVFNFTDFfMSAgICAgICAgICAgICAgICAgKSAvKiE8IERBQyBjaGFubmVsIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSA5LiAqLworCisjZWxpZiBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KQorI2RlZmluZSBMTF9EQUNfVFJJR19FWFRfVElNNl9UUkdPICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgREFDIGNoYW5uZWwgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTYgVFJHTy4gKi8KKyNkZWZpbmUgTExfREFDX1RSSUdfRVhUX1RJTTNfVFJHTyAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBQ19DUl9UU0VMMV8wKSAvKiE8IERBQyBjaGFubmVsIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0zIFRSR08uICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgTExfREFDX1RSSUdfRVhUX1RJTTdfVFJHTyAgICAgICAgICAoICAgICAgICAgICAgICAgICBEQUNfQ1JfVFNFTDFfMSAgICAgICAgICAgICAgICAgKSAvKiE8IERBQyBjaGFubmVsIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU03IFRSR08uICovCisjZGVmaW5lIExMX0RBQ19UUklHX0VYVF9USU0xNV9UUkdPICAgICAgICAgKCAgICAgICAgICAgICAgICAgREFDX0NSX1RTRUwxXzEgfCBEQUNfQ1JfVFNFTDFfMCkgLyohPCBEQUMgY2hhbm5lbCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNNSBUUkdPLiAqLworI2RlZmluZSBMTF9EQUNfVFJJR19FWFRfVElNMl9UUkdPICAgICAgICAgIChEQUNfQ1JfVFNFTDFfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgREFDIGNoYW5uZWwgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTIgVFJHTy4gKi8KKyNkZWZpbmUgTExfREFDX1RSSUdfRVhUX0VYVElfTElORTkgICAgICAgICAoREFDX0NSX1RTRUwxXzIgfCBEQUNfQ1JfVFNFTDFfMSAgICAgICAgICAgICAgICAgKSAvKiE8IERBQyBjaGFubmVsIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSA5LiAqLworCisjZWxpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KQorI2RlZmluZSBMTF9EQUNfVFJJR19FWFRfVElNNl9UUkdPICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgREFDIGNoYW5uZWwgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTYgVFJHTy4gKi8KKyNkZWZpbmUgTExfREFDX1RSSUdfRVhUX1RJTTNfVFJHTyAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBQ19DUl9UU0VMMV8wKSAvKiE8IERBQyBjaGFubmVsIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0zIFRSR08uICovCisjZGVmaW5lIExMX0RBQ19UUklHX0VYVF9USU0xNV9UUkdPICAgICAgICAgKCAgICAgICAgICAgICAgICAgREFDX0NSX1RTRUwxXzEgfCBEQUNfQ1JfVFNFTDFfMCkgLyohPCBEQUMgY2hhbm5lbCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNNSBUUkdPLiAqLworI2RlZmluZSBMTF9EQUNfVFJJR19FWFRfVElNMl9UUkdPICAgICAgICAgIChEQUNfQ1JfVFNFTDFfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgREFDIGNoYW5uZWwgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTIgVFJHTy4gKi8KKyNkZWZpbmUgTExfREFDX1RSSUdfRVhUX1RJTTRfVFJHTyAgICAgICAgICAoREFDX0NSX1RTRUwxXzIgfCBEQUNfQ1JfVFNFTDFfMCAgICAgICAgICAgICAgICAgKSAvKiE8IERBQyBjaGFubmVsIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU00IFRSR08uICovCisjZGVmaW5lIExMX0RBQ19UUklHX0VYVF9FWFRJX0xJTkU5ICAgICAgICAgKERBQ19DUl9UU0VMMV8yIHwgREFDX0NSX1RTRUwxXzEgICAgICAgICAgICAgICAgICkgLyohPCBEQUMgY2hhbm5lbCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogZXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgOS4gKi8KKworI2VsaWYgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKyNkZWZpbmUgTExfREFDX1RSSUdfRVhUX1RJTTZfVFJHTyAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERBQyBjaGFubmVsIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU02IFRSR08uICovCisjZGVmaW5lIExMX0RBQ19UUklHX0VYVF9USU0yX1RSR08gICAgICAgICAgKERBQ19DUl9UU0VMMV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgLyohPCBEQUMgY2hhbm5lbCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMiBUUkdPLiAqLworI2RlZmluZSBMTF9EQUNfVFJJR19FWFRfVElNMTVfVFJHTyAgICAgICAgICggICAgICAgICAgICAgICAgIERBQ19DUl9UU0VMMV8xIHwgREFDX0NSX1RTRUwxXzApIC8qITwgREFDIGNoYW5uZWwgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTUgVFJHTy4gKi8KKyNkZWZpbmUgTExfREFDX1RSSUdfRVhUX0VYVElfTElORTkgICAgICAgICAoREFDX0NSX1RTRUwxXzIgfCBEQUNfQ1JfVFNFTDFfMSAgICAgICAgICAgICAgICAgKSAvKiE8IERBQyBjaGFubmVsIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSA5LiAqLworCisjZWxpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorI2RlZmluZSBMTF9EQUNfVFJJR19FWFRfVElNNl9UUkdPICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgREFDIGNoYW5uZWwgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTYgVFJHTy4gKi8KKyNkZWZpbmUgTExfREFDX1RSSUdfRVhUX1RJTTNfVFJHTyAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBQ19DUl9UU0VMMV8wKSAvKiE8IERBQyBjaGFubmVsIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0zIFRSR08uICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgTExfREFDX1RSSUdfRVhUX1RJTTdfVFJHTyAgICAgICAgICAoICAgICAgICAgICAgICAgICBEQUNfQ1JfVFNFTDFfMSAgICAgICAgICAgICAgICAgKSAvKiE8IERBQyBjaGFubmVsIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU03IFRSR08uICovCisjZGVmaW5lIExMX0RBQ19UUklHX0VYVF9USU01X1RSR08gICAgICAgICAgKCAgICAgICAgICAgICAgICAgREFDX0NSX1RTRUwxXzEgfCBEQUNfQ1JfVFNFTDFfMCkgLyohPCBEQUMgY2hhbm5lbCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNNSBUUkdPLiAqLworI2RlZmluZSBMTF9EQUNfVFJJR19FWFRfVElNMl9UUkdPICAgICAgICAgIChEQUNfQ1JfVFNFTDFfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgREFDIGNoYW5uZWwgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTIgVFJHTy4gKi8KKyNkZWZpbmUgTExfREFDX1RSSUdfRVhUX1RJTTRfVFJHTyAgICAgICAgICAoREFDX0NSX1RTRUwxXzIgICAgICAgICAgICAgICAgICB8IERBQ19DUl9UU0VMMV8wKSAvKiE8IERBQyBjaGFubmVsIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU00IFRSR08uICovCisjZGVmaW5lIExMX0RBQ19UUklHX0VYVF9USU0xOF9UUkdPICAgICAgICAgKExMX0RBQ19UUklHX0VYVF9USU01X1RSR08pICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEQUMgY2hhbm5lbCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMTggVFJHTy4gKi8KKyNkZWZpbmUgTExfREFDX1RSSUdfRVhUX0VYVElfTElORTkgICAgICAgICAoREFDX0NSX1RTRUwxXzIgfCBEQUNfQ1JfVFNFTDFfMSAgICAgICAgICAgICAgICAgKSAvKiE8IERBQyBjaGFubmVsIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSA5LiAqLworCisjZWxpZiBkZWZpbmVkKFNUTTMyRjMzNHg4KQorI2RlZmluZSBMTF9EQUNfVFJJR19FWFRfVElNNl9UUkdPICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgREFDIGNoYW5uZWwgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTYgVFJHTy4gKi8KKyNkZWZpbmUgTExfREFDX1RSSUdfRVhUX1RJTTNfVFJHTyAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBQ19DUl9UU0VMMV8wKSAvKiE8IERBQyBjaGFubmVsIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0zIFRSR08uIFRyaWdnZXIgcmVtYXA6IGJ5IGRlZmF1bHQsIGRlZmF1bHQgdHJpZ2dlci4gSWYgbmVlZGVkIHRvIHJlc3RvcmUgdHJpZ2dlciwgdXNlIEByZWYgTExfU1lTQ0ZHX0RBQzFfVFJJRzFfUkVNQVBfVElNM19UUkdPIGZvciBUSU0zIHNlbGVjdGlvbi4gKi8KKyNkZWZpbmUgTExfREFDX1RSSUdfRVhUX1RJTTdfVFJHTyAgICAgICAgICAoICAgICAgICAgICAgICAgICBEQUNfQ1JfVFNFTDFfMSAgICAgICAgICAgICAgICAgKSAvKiE8IERBQyBjaGFubmVsIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU03IFRSR08uICovCisjZGVmaW5lIExMX0RBQ19UUklHX0VYVF9USU0yX1RSR08gICAgICAgICAgKERBQ19DUl9UU0VMMV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgLyohPCBEQUMgY2hhbm5lbCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMiBUUkdPLiAqLworI2RlZmluZSBMTF9EQUNfVFJJR19FWFRfVElNMTVfVFJHTyAgICAgICAgICggICAgICAgICAgICAgICAgIERBQ19DUl9UU0VMMV8xIHwgREFDX0NSX1RTRUwxXzApIC8qITwgREFDIGNoYW5uZWwgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTE1IFRSR08uIFRyaWdnZXIgcmVtYXA6IGJ5IGRlZmF1bHQsIGRlZmF1bHQgdHJpZ2dlci4gSWYgbmVlZGVkIHRvIHJlc3RvcmUgdHJpZ2dlciwgdXNlIEByZWYgTExfU1lTQ0ZHX0RBQzFfVFJJRzNfUkVNQVBfVElNMTVfVFJHTyBmb3IgVElNMTUgc2VsZWN0aW9uLiAqLworI2RlZmluZSBMTF9EQUNfVFJJR0dFUl9IUlRJTTFfREFDVFJHMSAgICAgIChMTF9EQUNfVFJJR19FWFRfVElNMTVfVFJHTykgICAgICAgICAgICAgICAgICAgICAgIC8qITwgREFDIGNoYW5uZWwgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IEhSVElNMSBEQUNUUkcxLiBBdmFpbGFibGUgb25seSBvbiBEQUMgaW5zdGFuY2U6IERBQzEuIFRyaWdnZXIgcmVtYXA6IHVzZSBAcmVmIExMX1NZU0NGR19EQUMxX1RSSUczX1JFTUFQX0hSVElNMV9EQUMxX1RSSUcxIGZvciBIUlRJTTEgVFJJRzEgc2VsZWN0aW9uLiAqLworI2RlZmluZSBMTF9EQUNfVFJJR0dFUl9IUlRJTTFfREFDVFJHMiAgICAgIChEQUNfQ1JfVFNFTDFfMiAgICAgICAgICAgICAgICAgIHwgREFDX0NSX1RTRUwxXzApIC8qITwgREFDIGNoYW5uZWwgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IEhSVElNMSBEQUNUUkcyLiBBdmFpbGFibGUgb25seSBvbiBEQUMgaW5zdGFuY2U6IERBQzIuIFRyaWdnZXIgcmVtYXA6IHVzZSBAcmVmIExMX1NZU0NGR19EQUMxX1RSSUc1X1JFTUFQX0hSVElNMV9EQUMxX1RSSUcyIGZvciBIUlRJTTEgVFJJRzIgc2VsZWN0aW9uLiAqLworI2RlZmluZSBMTF9EQUNfVFJJR0dFUl9IUlRJTTFfREFDVFJHMyAgICAgIChMTF9EQUNfVFJJR0dFUl9IUlRJTTFfREFDVFJHMikgICAgICAgICAgICAgICAgICAgIC8qITwgREFDIGNoYW5uZWwgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IEhSVElNMSBEQUNUUkczLiAqLworI2RlZmluZSBMTF9EQUNfVFJJR19FWFRfRVhUSV9MSU5FOSAgICAgICAgIChEQUNfQ1JfVFNFTDFfMiB8IERBQ19DUl9UU0VMMV8xICAgICAgICAgICAgICAgICApIC8qITwgREFDIGNoYW5uZWwgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IGV4dGVybmFsIGludGVycnVwdCBsaW5lIDkuICovCisKKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfTExfRUNfV0FWRV9BVVRPX0dFTkVSQVRJT05fTU9ERSBEQUMgd2F2ZWZvcm0gYXV0b21hdGljIGdlbmVyYXRpb24gbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RBQ19XQVZFX0FVVE9fR0VORVJBVElPTl9OT05FICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IERBQyBjaGFubmVsIHdhdmUgYXV0byBnZW5lcmF0aW9uIG1vZGUgZGlzYWJsZWQuICovCisjZGVmaW5lIExMX0RBQ19XQVZFX0FVVE9fR0VORVJBVElPTl9OT0lTRSAgICAoREFDX0NSX1dBVkUxXzApICAgICAgICAvKiE8IERBQyBjaGFubmVsIHdhdmUgYXV0byBnZW5lcmF0aW9uIG1vZGUgZW5hYmxlZCwgc2V0IGdlbmVyYXRlZCBub2lzZSB3YXZlZm9ybS4gKi8KKyNkZWZpbmUgTExfREFDX1dBVkVfQVVUT19HRU5FUkFUSU9OX1RSSUFOR0xFIChEQUNfQ1JfV0FWRTFfMSkgICAgICAgIC8qITwgREFDIGNoYW5uZWwgd2F2ZSBhdXRvIGdlbmVyYXRpb24gbW9kZSBlbmFibGVkLCBzZXQgZ2VuZXJhdGVkIHRyaWFuZ2xlIHdhdmVmb3JtLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfTExfRUNfV0FWRV9OT0lTRV9MRlNSX1VOTUFTS19CSVRTIERBQyB3YXZlIGdlbmVyYXRpb24gLSBOb2lzZSBMRlNSIHVubWFzayBiaXRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVDAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTm9pc2Ugd2F2ZSBnZW5lcmF0aW9uLCB1bm1hc2sgTEZTUiBiaXQwLCBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsICovCisjZGVmaW5lIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTMV8wICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBQ19DUl9NQU1QMV8wKSAvKiE8IE5vaXNlIHdhdmUgZ2VuZXJhdGlvbiwgdW5tYXNrIExGU1IgYml0c1sxOjBdLCBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsICovCisjZGVmaW5lIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTMl8wICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUNfQ1JfTUFNUDFfMSAgICAgICAgICAgICAgICAgKSAvKiE8IE5vaXNlIHdhdmUgZ2VuZXJhdGlvbiwgdW5tYXNrIExGU1IgYml0c1syOjBdLCBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsICovCisjZGVmaW5lIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTM18wICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUNfQ1JfTUFNUDFfMSB8IERBQ19DUl9NQU1QMV8wKSAvKiE8IE5vaXNlIHdhdmUgZ2VuZXJhdGlvbiwgdW5tYXNrIExGU1IgYml0c1szOjBdLCBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsICovCisjZGVmaW5lIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTNF8wICAgKCAgICAgICAgICAgICAgICAgREFDX0NSX01BTVAxXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAvKiE8IE5vaXNlIHdhdmUgZ2VuZXJhdGlvbiwgdW5tYXNrIExGU1IgYml0c1s0OjBdLCBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsICovCisjZGVmaW5lIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTNV8wICAgKCAgICAgICAgICAgICAgICAgREFDX0NSX01BTVAxXzIgICAgICAgICAgICAgICAgICB8IERBQ19DUl9NQU1QMV8wKSAvKiE8IE5vaXNlIHdhdmUgZ2VuZXJhdGlvbiwgdW5tYXNrIExGU1IgYml0c1s1OjBdLCBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsICovCisjZGVmaW5lIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTNl8wICAgKCAgICAgICAgICAgICAgICAgREFDX0NSX01BTVAxXzIgfCBEQUNfQ1JfTUFNUDFfMSAgICAgICAgICAgICAgICAgKSAvKiE8IE5vaXNlIHdhdmUgZ2VuZXJhdGlvbiwgdW5tYXNrIExGU1IgYml0c1s2OjBdLCBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsICovCisjZGVmaW5lIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTN18wICAgKCAgICAgICAgICAgICAgICAgREFDX0NSX01BTVAxXzIgfCBEQUNfQ1JfTUFNUDFfMSB8IERBQ19DUl9NQU1QMV8wKSAvKiE8IE5vaXNlIHdhdmUgZ2VuZXJhdGlvbiwgdW5tYXNrIExGU1IgYml0c1s3OjBdLCBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsICovCisjZGVmaW5lIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTOF8wICAgKERBQ19DUl9NQU1QMV8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAvKiE8IE5vaXNlIHdhdmUgZ2VuZXJhdGlvbiwgdW5tYXNrIExGU1IgYml0c1s4OjBdLCBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsICovCisjZGVmaW5lIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTOV8wICAgKERBQ19DUl9NQU1QMV8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERBQ19DUl9NQU1QMV8wKSAvKiE8IE5vaXNlIHdhdmUgZ2VuZXJhdGlvbiwgdW5tYXNrIExGU1IgYml0c1s5OjBdLCBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsICovCisjZGVmaW5lIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTMTBfMCAgKERBQ19DUl9NQU1QMV8zICAgICAgICAgICAgICAgICAgfCBEQUNfQ1JfTUFNUDFfMSAgICAgICAgICAgICAgICAgKSAvKiE8IE5vaXNlIHdhdmUgZ2VuZXJhdGlvbiwgdW5tYXNrIExGU1IgYml0c1sxMDowXSwgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzExXzAgIChEQUNfQ1JfTUFNUDFfMyAgICAgICAgICAgICAgICAgIHwgREFDX0NSX01BTVAxXzEgfCBEQUNfQ1JfTUFNUDFfMCkgLyohPCBOb2lzZSB3YXZlIGdlbmVyYXRpb24sIHVubWFzayBMRlNSIGJpdHNbMTE6MF0sIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0xMX0VDX1dBVkVfVFJJQU5HTEVfQU1QTElUVURFIERBQyB3YXZlIGdlbmVyYXRpb24gLSBUcmlhbmdsZSBhbXBsaXR1ZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzEgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmlhbmdsZSB3YXZlIGdlbmVyYXRpb24sIGFtcGxpdHVkZSBvZiAxIExTQiBvZiBEQUMgb3V0cHV0IHJhbmdlLCBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsICovCisjZGVmaW5lIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfMyAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBQ19DUl9NQU1QMV8wKSAvKiE8IFRyaWFuZ2xlIHdhdmUgZ2VuZXJhdGlvbiwgYW1wbGl0dWRlIG9mIDMgTFNCIG9mIERBQyBvdXRwdXQgcmFuZ2UsIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV83ICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBQ19DUl9NQU1QMV8xICAgICAgICAgICAgICAgICApIC8qITwgVHJpYW5nbGUgd2F2ZSBnZW5lcmF0aW9uLCBhbXBsaXR1ZGUgb2YgNyBMU0Igb2YgREFDIG91dHB1dCByYW5nZSwgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzE1ICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFDX0NSX01BTVAxXzEgfCBEQUNfQ1JfTUFNUDFfMCkgLyohPCBUcmlhbmdsZSB3YXZlIGdlbmVyYXRpb24sIGFtcGxpdHVkZSBvZiAxNSBMU0Igb2YgREFDIG91dHB1dCByYW5nZSwgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzMxICAgICAgICggICAgICAgICAgICAgICAgIERBQ19DUl9NQU1QMV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgLyohPCBUcmlhbmdsZSB3YXZlIGdlbmVyYXRpb24sIGFtcGxpdHVkZSBvZiAzMSBMU0Igb2YgREFDIG91dHB1dCByYW5nZSwgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzYzICAgICAgICggICAgICAgICAgICAgICAgIERBQ19DUl9NQU1QMV8yICAgICAgICAgICAgICAgICAgfCBEQUNfQ1JfTUFNUDFfMCkgLyohPCBUcmlhbmdsZSB3YXZlIGdlbmVyYXRpb24sIGFtcGxpdHVkZSBvZiA2MyBMU0Igb2YgREFDIG91dHB1dCByYW5nZSwgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzEyNyAgICAgICggICAgICAgICAgICAgICAgIERBQ19DUl9NQU1QMV8yIHwgREFDX0NSX01BTVAxXzEgICAgICAgICAgICAgICAgICkgLyohPCBUcmlhbmdsZSB3YXZlIGdlbmVyYXRpb24sIGFtcGxpdHVkZSBvZiAxMjcgTFNCIG9mIERBQyBvdXRwdXQgcmFuZ2UsIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8yNTUgICAgICAoICAgICAgICAgICAgICAgICBEQUNfQ1JfTUFNUDFfMiB8IERBQ19DUl9NQU1QMV8xIHwgREFDX0NSX01BTVAxXzApIC8qITwgVHJpYW5nbGUgd2F2ZSBnZW5lcmF0aW9uLCBhbXBsaXR1ZGUgb2YgMjU1IExTQiBvZiBEQUMgb3V0cHV0IHJhbmdlLCBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsICovCisjZGVmaW5lIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfNTExICAgICAgKERBQ19DUl9NQU1QMV8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAvKiE8IFRyaWFuZ2xlIHdhdmUgZ2VuZXJhdGlvbiwgYW1wbGl0dWRlIG9mIDUxMiBMU0Igb2YgREFDIG91dHB1dCByYW5nZSwgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzEwMjMgICAgIChEQUNfQ1JfTUFNUDFfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEQUNfQ1JfTUFNUDFfMCkgLyohPCBUcmlhbmdsZSB3YXZlIGdlbmVyYXRpb24sIGFtcGxpdHVkZSBvZiAxMDIzIExTQiBvZiBEQUMgb3V0cHV0IHJhbmdlLCBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsICovCisjZGVmaW5lIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfMjA0NyAgICAgKERBQ19DUl9NQU1QMV8zICAgICAgICAgICAgICAgICAgfCBEQUNfQ1JfTUFNUDFfMSAgICAgICAgICAgICAgICAgKSAvKiE8IFRyaWFuZ2xlIHdhdmUgZ2VuZXJhdGlvbiwgYW1wbGl0dWRlIG9mIDIwNDcgTFNCIG9mIERBQyBvdXRwdXQgcmFuZ2UsIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV80MDk1ICAgICAoREFDX0NSX01BTVAxXzMgICAgICAgICAgICAgICAgICB8IERBQ19DUl9NQU1QMV8xIHwgREFDX0NSX01BTVAxXzApIC8qITwgVHJpYW5nbGUgd2F2ZSBnZW5lcmF0aW9uLCBhbXBsaXR1ZGUgb2YgNDA5NSBMU0Igb2YgREFDIG91dHB1dCByYW5nZSwgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfTExfRUNfT1VUUFVUX0JVRkZFUiBEQUMgY2hhbm5lbCBvdXRwdXQgYnVmZmVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfREFDX09VVFBVVF9CVUZGRVJfRU5BQkxFICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IFRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCBvdXRwdXQgaXMgYnVmZmVyZWQ6IGhpZ2hlciBkcml2ZSBjdXJyZW50IGNhcGFiaWxpdHksIGJ1dCBhbHNvIGhpZ2hlciBjdXJyZW50IGNvbnN1bXB0aW9uICovCisjZGVmaW5lIExMX0RBQ19PVVRQVVRfQlVGRkVSX0RJU0FCTEUgICAgICAgKERBQ19DUl9CT0ZGMSkgICAgICAgICAgLyohPCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgb3V0cHV0IGlzIG5vdCBidWZmZXJlZDogbG93ZXIgZHJpdmUgY3VycmVudCBjYXBhYmlsaXR5LCBidXQgYWxzbyBsb3dlciBjdXJyZW50IGNvbnN1bXB0aW9uICovCisKKyNpZiBkZWZpbmVkKERBQ19DUl9PVVRFTjEpIHx8IGRlZmluZWQoREFDX0NSX09VVEVOMikKKyNkZWZpbmUgTExfREFDX09VVFBVVF9TV0lUQ0hfRElTQUJMRSAgICAgICAoTExfREFDX09VVFBVVF9CVUZGRVJfRU5BQkxFKSAgLyohPCBGZWF0dXJlIHNwZWNpZmljIHRvIFNUTTMyRjMwM3g2LzggYW5kIFNUTTMyRjMyODogT24gREFDMSBjaGFubmVsIDIsIG91dHB1dCBidWZmZXIgaXMgcmVwbGFjZWQgYnkgYSBzd2l0Y2ggdG8gY29ubmVjdCBEQUMgY2hhbm5lbCBvdXRwdXQgdG8gcGluIFBBNS4gT24gREFDMiBjaGFubmVsIDEsIG91dHB1dCBidWZmZXIgaXMgcmVwbGFjZWQgYnkgYSBzd2l0Y2ggdG8gY29ubmVjdCBEQUMgY2hhbm5lbCBvdXRwdXQgdG8gcGluIFBBNi4gU2VsZWN0aW9uIG9mIHN3aXRjaCBkaXNhYmxlZDogREFDIGNoYW5uZWwgb3V0cHV0IG5vdCBjb25uZWN0ZWQgdG8gR1BJTy4gKi8KKyNkZWZpbmUgTExfREFDX09VVFBVVF9TV0lUQ0hfRU5BQkxFICAgICAgICAoTExfREFDX09VVFBVVF9CVUZGRVJfRElTQUJMRSkgLyohPCBGZWF0dXJlIHNwZWNpZmljIHRvIFNUTTMyRjMwM3g2LzggYW5kIFNUTTMyRjMyODogT24gREFDMSBjaGFubmVsIDIsIG91dHB1dCBidWZmZXIgaXMgcmVwbGFjZWQgYnkgYSBzd2l0Y2ggdG8gY29ubmVjdCBEQUMgY2hhbm5lbCBvdXRwdXQgdG8gcGluIFBBNS4gT24gREFDMiBjaGFubmVsIDEsIG91dHB1dCBidWZmZXIgaXMgcmVwbGFjZWQgYnkgYSBzd2l0Y2ggdG8gY29ubmVjdCBEQUMgY2hhbm5lbCBvdXRwdXQgdG8gcGluIFBBNi4gKi8KKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIERBQ19MTF9FQ19SRVNPTFVUSU9OICBEQUMgY2hhbm5lbCBvdXRwdXQgcmVzb2x1dGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RBQ19SRVNPTFVUSU9OXzEyQiAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBEQUMgY2hhbm5lbCByZXNvbHV0aW9uIDEyIGJpdHMgKi8KKyNkZWZpbmUgTExfREFDX1JFU09MVVRJT05fOEIgICAgICAgICAgICAgICAweDAwMDAwMDAyVSAgICAgICAgICAgICAvKiE8IERBQyBjaGFubmVsIHJlc29sdXRpb24gOCBiaXRzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERBQ19MTF9FQ19SRUdJU1RFUlMgIERBQyByZWdpc3RlcnMgY29tcGxpYW50IHdpdGggc3BlY2lmaWMgcHVycG9zZQorICAqIEB7CisgICovCisvKiBMaXN0IG9mIERBQyByZWdpc3RlcnMgaW50ZW5kZWQgdG8gYmUgdXNlZCAobW9zdCBjb21tb25seSkgd2l0aCAgICAgICAgICAgICAqLworLyogRE1BIHRyYW5zZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfREFDX0RNQV9HZXRSZWdBZGRyKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RBQ19ETUFfUkVHX0RBVEFfMTJCSVRTX1JJR0hUX0FMSUdORUQgIERBQ19SRUdfREhSMTJSWF9SRUdPRkZTRVRfTUFTSyAvKiE8IERBQyBjaGFubmVsIGRhdGEgaG9sZGluZyByZWdpc3RlciAxMiBiaXRzIHJpZ2h0IGFsaWduZWQgKi8KKyNkZWZpbmUgTExfREFDX0RNQV9SRUdfREFUQV8xMkJJVFNfTEVGVF9BTElHTkVEICAgREFDX1JFR19ESFIxMkxYX1JFR09GRlNFVF9NQVNLIC8qITwgREFDIGNoYW5uZWwgZGF0YSBob2xkaW5nIHJlZ2lzdGVyIDEyIGJpdHMgbGVmdCBhbGlnbmVkICovCisjZGVmaW5lIExMX0RBQ19ETUFfUkVHX0RBVEFfOEJJVFNfUklHSFRfQUxJR05FRCAgIERBQ19SRUdfREhSOFJYX1JFR09GRlNFVF9NQVNLICAvKiE8IERBQyBjaGFubmVsIGRhdGEgaG9sZGluZyByZWdpc3RlciA4IGJpdHMgcmlnaHQgYWxpZ25lZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfTExfRUNfSFdfREVMQVlTICBEZWZpbml0aW9ucyBvZiBEQUMgaGFyZHdhcmUgY29uc3RyYWludHMgZGVsYXlzCisgICogQG5vdGUgICBPbmx5IERBQyBJUCBIVyBkZWxheXMgYXJlIGRlZmluZWQgaW4gREFDIExMIGRyaXZlciBkcml2ZXIsCisgICogICAgICAgICBub3QgdGltZW91dCB2YWx1ZXMuCisgICogICAgICAgICBGb3IgZGV0YWlscyBvbiBkZWxheXMgdmFsdWVzLCByZWZlciB0byBkZXNjcmlwdGlvbnMgaW4gc291cmNlIGNvZGUKKyAgKiAgICAgICAgIGFib3ZlIGVhY2ggbGl0ZXJhbCBkZWZpbml0aW9uLgorICAqIEB7CisgICovCisKKy8qIERlbGF5IGZvciBEQUMgY2hhbm5lbCB2b2x0YWdlIHNldHRsaW5nIHRpbWUgZnJvbSBEQUMgY2hhbm5lbCBzdGFydHVwICAgICAgICovCisvKiAodHJhbnNpdGlvbiBmcm9tIGRpc2FibGUgdG8gZW5hYmxlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTm90ZTogREFDIGNoYW5uZWwgc3RhcnR1cCB0aW1lIGRlcGVuZHMgb24gYm9hcmQgYXBwbGljYXRpb24gZW52aXJvbm1lbnQ6ICAgKi8KKy8qICAgICAgIGltcGVkYW5jZSBjb25uZWN0ZWQgdG8gREFDIGNoYW5uZWwgb3V0cHV0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBUaGUgZGVsYXkgYmVsb3cgaXMgc3BlY2lmaWVkIHVuZGVyIGNvbmRpdGlvbnM6ICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIC0gdm9sdGFnZSBtYXhpbXVtIHRyYW5zaXRpb24gKGxvd2VzdCB0byBoaWdoZXN0IHZhbHVlKSAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAtIHVudGlsIHZvbHRhZ2UgcmVhY2hlcyBmaW5hbCB2YWx1ZSArLTFMU0IgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgLSBEQUMgY2hhbm5lbCBvdXRwdXQgYnVmZmVyIGVuYWJsZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIC0gbG9hZCBpbXBlZGFuY2Ugb2YgNWtPaG0gKG1pbiksIDUwcEYgKG1heCkgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIExpdGVyYWwgc2V0IHRvIG1heGltdW0gdmFsdWUgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQsICAgICAgICAgICAgICAgICAgICovCisvKiBwYXJhbWV0ZXIgInRXQUtFVVAiKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVW5pdDogdXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfREFDX0RFTEFZX1NUQVJUVVBfVk9MVEFHRV9TRVRUTElOR19VUyAgICAgICAgICAgICAxNVUgIC8qITwgRGVsYXkgZm9yIERBQyBjaGFubmVsIHZvbHRhZ2Ugc2V0dGxpbmcgdGltZSBmcm9tIERBQyBjaGFubmVsIHN0YXJ0dXAgKHRyYW5zaXRpb24gZnJvbSBkaXNhYmxlIHRvIGVuYWJsZSkgKi8KKworLyogRGVsYXkgZm9yIERBQyBjaGFubmVsIHZvbHRhZ2Ugc2V0dGxpbmcgdGltZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5vdGU6IERBQyBjaGFubmVsIHN0YXJ0dXAgdGltZSBkZXBlbmRzIG9uIGJvYXJkIGFwcGxpY2F0aW9uIGVudmlyb25tZW50OiAgICovCisvKiAgICAgICBpbXBlZGFuY2UgY29ubmVjdGVkIHRvIERBQyBjaGFubmVsIG91dHB1dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgVGhlIGRlbGF5IGJlbG93IGlzIHNwZWNpZmllZCB1bmRlciBjb25kaXRpb25zOiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAtIHZvbHRhZ2UgbWF4aW11bSB0cmFuc2l0aW9uIChsb3dlc3QgdG8gaGlnaGVzdCB2YWx1ZSkgICAgICAgICAgICAgICovCisvKiAgICAgICAgLSB1bnRpbCB2b2x0YWdlIHJlYWNoZXMgZmluYWwgdmFsdWUgKy0xTFNCICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIC0gREFDIGNoYW5uZWwgb3V0cHV0IGJ1ZmZlciBlbmFibGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAtIGxvYWQgaW1wZWRhbmNlIG9mIDVrT2htIG1pbiwgNTBwRiBtYXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBMaXRlcmFsIHNldCB0byBtYXhpbXVtIHZhbHVlIChyZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCAgICAgICAgICAgICAgICAgICAqLworLyogcGFyYW1ldGVyICJ0U0VUVExJTkciKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFVuaXQ6IHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RBQ19ERUxBWV9WT0xUQUdFX1NFVFRMSU5HX1VTICAgICAgICAgICAgICAgICAgICAxMlUgIC8qITwgRGVsYXkgZm9yIERBQyBjaGFubmVsIHZvbHRhZ2Ugc2V0dGxpbmcgdGltZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgREFDX0xMX0V4cG9ydGVkX01hY3JvcyBEQUMgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfTExfRU1fV1JJVEVfUkVBRCBDb21tb24gd3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIG1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBEQUMgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBEQUMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIExMX0RBQ19Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIERBQyByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIERBQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICAqLworI2RlZmluZSBMTF9EQUNfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfTExfRU1fSEVMUEVSX01BQ1JPIERBQyBoZWxwZXIgbWFjcm8KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBnZXQgREFDIGNoYW5uZWwgbnVtYmVyIGluIGRlY2ltYWwgZm9ybWF0CisgICogICAgICAgICBmcm9tIGxpdGVyYWxzIExMX0RBQ19DSEFOTkVMX3guCisgICogICAgICAgICBFeGFtcGxlOgorICAqICAgICAgICAgICAgX19MTF9EQUNfQ0hBTk5FTF9UT19ERUNJTUFMX05CKExMX0RBQ19DSEFOTkVMXzEpCisgICogICAgICAgICAgICB3aWxsIHJldHVybiBkZWNpbWFsIG51bWJlciAiMSIuCisgICogQG5vdGUgICBUaGUgaW5wdXQgY2FuIGJlIGEgdmFsdWUgZnJvbSBmdW5jdGlvbnMgd2hlcmUgYSBjaGFubmVsCisgICogICAgICAgICBudW1iZXIgaXMgcmV0dXJuZWQuCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gdGhpcyBTVE0zMiBzZXJpZSwgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuCisgICogICAgICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LgorICAqIEByZXR2YWwgMS4uLjIgKHZhbHVlICIyIiBkZXBlbmRpbmcgb24gREFDIGNoYW5uZWwgMiBhdmFpbGFiaWxpdHkpCisgICovCisjZGVmaW5lIF9fTExfREFDX0NIQU5ORUxfVE9fREVDSU1BTF9OQihfX0NIQU5ORUxfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKF9fQ0hBTk5FTF9fKSAmIERBQ19TV1RSX0NIWF9NQVNLKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBnZXQgREFDIGNoYW5uZWwgaW4gbGl0ZXJhbCBmb3JtYXQgTExfREFDX0NIQU5ORUxfeAorICAqICAgICAgICAgZnJvbSBudW1iZXIgaW4gZGVjaW1hbCBmb3JtYXQuCisgICogICAgICAgICBFeGFtcGxlOgorICAqICAgICAgICAgICBfX0xMX0RBQ19ERUNJTUFMX05CX1RPX0NIQU5ORUwoMSkKKyAgKiAgICAgICAgICAgd2lsbCByZXR1cm4gYSBkYXRhIGVxdWl2YWxlbnQgdG8gIkxMX0RBQ19DSEFOTkVMXzEiLgorICAqIEBub3RlICBJZiB0aGUgaW5wdXQgcGFyYW1ldGVyIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBEQUMgY2hhbm5lbCwKKyAgKiAgICAgICAgdGhpcyBtYWNybyByZXR1cm5zIHZhbHVlICcwJy4KKyAgKiBAcGFyYW0gIF9fREVDSU1BTF9OQl9fIDEuLi4yICh2YWx1ZSAiMiIgZGVwZW5kaW5nIG9uIERBQyBjaGFubmVsIDIgYXZhaWxhYmlsaXR5KQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMiAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLgorICAqICAgICAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAgKi8KKyNpZiBkZWZpbmVkKERBQ19DSEFOTkVMMl9TVVBQT1JUKQorI2RlZmluZSBfX0xMX0RBQ19ERUNJTUFMX05CX1RPX0NIQU5ORUwoX19ERUNJTUFMX05CX18pICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19ERUNJTUFMX05CX18pID09IDFVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgID8gKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBMTF9EQUNfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICgoKF9fREVDSU1BTF9OQl9fKSA9PSAyVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgTExfREFDX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKyNlbHNlCisjZGVmaW5lIF9fTExfREFDX0RFQ0lNQUxfTkJfVE9fQ0hBTk5FTChfX0RFQ0lNQUxfTkJfXykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX0RFQ0lNQUxfTkJfXykgPT0gMVUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgPyAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIExMX0RBQ19DSEFOTkVMXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisjZW5kaWYgIC8qIERBQ19DSEFOTkVMMl9TVVBQT1JUICovCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGRlZmluZSB0aGUgREFDIGNvbnZlcnNpb24gZGF0YSBmdWxsLXNjYWxlIGRpZ2l0YWwKKyAgKiAgICAgICAgIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNlbGVjdGVkIERBQyByZXNvbHV0aW9uLgorICAqIEBub3RlICAgREFDIGNvbnZlcnNpb24gZGF0YSBmdWxsLXNjYWxlIGNvcnJlc3BvbmRzIHRvIHZvbHRhZ2UgcmFuZ2UKKyAgKiAgICAgICAgIGRldGVybWluZWQgYnkgYW5hbG9nIHZvbHRhZ2UgcmVmZXJlbmNlcyBWcmVmKyBhbmQgVnJlZi0KKyAgKiAgICAgICAgIChyZWZlciB0byByZWZlcmVuY2UgbWFudWFsKS4KKyAgKiBAcGFyYW0gIF9fREFDX1JFU09MVVRJT05fXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19SRVNPTFVUSU9OXzEyQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19SRVNPTFVUSU9OXzhCCisgICogQHJldHZhbCBBREMgY29udmVyc2lvbiBkYXRhIGVxdWl2YWxlbnQgdm9sdGFnZSB2YWx1ZSAodW5pdDogbVZvbHQpCisgICovCisjZGVmaW5lIF9fTExfREFDX0RJR0lUQUxfU0NBTEUoX19EQUNfUkVTT0xVVElPTl9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKDB4MDAwMDBGRkZVKSA+PiAoKF9fREFDX1JFU09MVVRJT05fXykgPDwgMVUpKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIERBQyBjb252ZXJzaW9uIGRhdGEgKHVuaXQ6IGRpZ2l0YWwKKyAgKiAgICAgICAgIHZhbHVlKSBjb3JyZXNwb25kaW5nIHRvIGEgdm9sdGFnZSAodW5pdDogbVZvbHQpLgorICAqIEBub3RlICAgVGhpcyBoZWxwZXIgbWFjcm8gaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBpbnB1dCBkYXRhIGluIHZvbHRhZ2UKKyAgKiAgICAgICAgIHJhdGhlciB0aGFuIGRpZ2l0YWwgdmFsdWUsCisgICogICAgICAgICB0byBiZSB1c2VkIHdpdGggTEwgREFDIGZ1bmN0aW9ucyBzdWNoIGFzCisgICogICAgICAgICBAcmVmIExMX0RBQ19Db252ZXJ0RGF0YTEyUmlnaHRBbGlnbmVkKCkuCisgICogQG5vdGUgICBBbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKFZyZWYrKSBtdXN0IGJlIGVpdGhlciBrbm93biBmcm9tCisgICogICAgICAgICB1c2VyIGJvYXJkIGVudmlyb25tZW50IG9yIGNhbiBiZSBjYWxjdWxhdGVkIHVzaW5nIEFEQyBtZWFzdXJlbWVudAorICAqICAgICAgICAgYW5kIEFEQyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DQUxDX1ZSRUZBTkFMT0dfVk9MVEFHRSgpLgorICAqIEBwYXJhbSAgX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyBBbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKHVuaXQ6IG1WKQorICAqIEBwYXJhbSAgX19EQUNfVk9MVEFHRV9fIFZvbHRhZ2UgdG8gYmUgZ2VuZXJhdGVkIGJ5IERBQyBjaGFubmVsCisgICogICAgICAgICAgICAgICAgICAgICAgICAgKHVuaXQ6IG1Wb2x0KS4KKyAgKiBAcGFyYW0gIF9fREFDX1JFU09MVVRJT05fXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19SRVNPTFVUSU9OXzEyQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19SRVNPTFVUSU9OXzhCCisgICogQHJldHZhbCBEQUMgY29udmVyc2lvbiBkYXRhICh1bml0OiBkaWdpdGFsIHZhbHVlKQorICAqLworI2RlZmluZSBfX0xMX0RBQ19DQUxDX1ZPTFRBR0VfVE9fREFUQShfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19EQUNfVk9MVEFHRV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19EQUNfUkVTT0xVVElPTl9fKSAgICAgICAgICAgICAgICAgICAgICBcCisgICgoX19EQUNfVk9MVEFHRV9fKSAqIF9fTExfREFDX0RJR0lUQUxfU0NBTEUoX19EQUNfUkVTT0xVVElPTl9fKSAgICAgICAgICAgICAgXAorICAgLyAoX19WUkVGQU5BTE9HX1ZPTFRBR0VfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIERBQ19MTF9FeHBvcnRlZF9GdW5jdGlvbnMgREFDIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiogQGRlZmdyb3VwIERBQ19MTF9FRl9Db25maWd1cmF0aW9uIENvbmZpZ3VyYXRpb24gb2YgREFDIGNoYW5uZWxzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGNvbnZlcnNpb24gdHJpZ2dlciBzb3VyY2UgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4KKyAgKiBAbm90ZSAgIEZvciBjb252ZXJzaW9uIHRyaWdnZXIgc291cmNlIHRvIGJlIGVmZmVjdGl2ZSwgREFDIHRyaWdnZXIKKyAgKiAgICAgICAgIG11c3QgYmUgZW5hYmxlZCB1c2luZyBmdW5jdGlvbiBAcmVmIExMX0RBQ19FbmFibGVUcmlnZ2VyKCkuCisgICogQG5vdGUgICBUbyBzZXQgY29udmVyc2lvbiB0cmlnZ2VyIHNvdXJjZSwgREFDIGNoYW5uZWwgbXVzdCBiZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIE90aGVyd2lzZSwgdGhlIHNldHRpbmcgaXMgZGlzY2FyZGVkLgorICAqIEBub3RlICAgQXZhaWxhYmlsaXR5IG9mIHBhcmFtZXRlcnMgb2YgdHJpZ2dlciBzb3VyY2VzIGZyb20gdGltZXIKKyAgKiAgICAgICAgIGRlcGVuZHMgb24gdGltZXJzIGF2YWlsYWJpbGl0eSBvbiB0aGUgc2VsZWN0ZWQgZGV2aWNlLgorICAqIEBybXRvbGwgQ1IgICAgICAgVFNFTDEgICAgICAgICAgTExfREFDX1NldFRyaWdnZXJTb3VyY2VcbgorICAqICAgICAgICAgQ1IgICAgICAgVFNFTDIgICAgICAgICAgTExfREFDX1NldFRyaWdnZXJTb3VyY2UKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gdGhpcyBTVE0zMiBzZXJpZSwgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuCisgICogICAgICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LgorICAqIEBwYXJhbSAgVHJpZ2dlclNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklHX1NPRlRXQVJFCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUdfRVhUX1RJTTJfVFJHTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklHX0VYVF9USU0zX1RSR08gICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklHX0VYVF9USU00X1RSR08gICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklHX0VYVF9USU01X1RSR08gICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklHX0VYVF9USU02X1RSR08KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJR19FWFRfVElNN19UUkdPICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJR19FWFRfVElNOF9UUkdPICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJR19FWFRfVElNMTVfVFJHTyAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJR19FWFRfVElNMThfVFJHTyAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJR19FWFRfSFJUSU0xX0RBQ1RSRzEgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJR19FWFRfSFJUSU0xX0RBQ1RSRzIgICAoMSkoMikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJR19FWFRfSFJUSU0xX0RBQ1RSRzMgICAoMSkgICAoMykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJR19FWFRfRVhUSV9MSU5FOQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gU1RNMzJGMywgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMKKyAgKiAgICAgICAgICgyKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgREFDIGluc3RhbmNlczogREFDMSAoZm9yIERBQyBpbnN0YW5jZXMgREFDeCBhdmFpbGFibGUgb24gdGhlIHNlbGVjdGVkIGRldmljZSkuXG4KKyAgKiAgICAgICAgICgzKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgREFDIGluc3RhbmNlczogREFDMiAoZm9yIERBQyBpbnN0YW5jZXMgREFDeCBhdmFpbGFibGUgb24gdGhlIHNlbGVjdGVkIGRldmljZSkuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQUNfU2V0VHJpZ2dlclNvdXJjZShEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwsIHVpbnQzMl90IFRyaWdnZXJTb3VyY2UpCit7CisgIE1PRElGWV9SRUcoREFDeC0+Q1IsCisgICAgICAgICAgICAgREFDX0NSX1RTRUwxIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spLAorICAgICAgICAgICAgIFRyaWdnZXJTb3VyY2UgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgY29udmVyc2lvbiB0cmlnZ2VyIHNvdXJjZSBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLgorICAqIEBub3RlICAgRm9yIGNvbnZlcnNpb24gdHJpZ2dlciBzb3VyY2UgdG8gYmUgZWZmZWN0aXZlLCBEQUMgdHJpZ2dlcgorICAqICAgICAgICAgbXVzdCBiZSBlbmFibGVkIHVzaW5nIGZ1bmN0aW9uIEByZWYgTExfREFDX0VuYWJsZVRyaWdnZXIoKS4KKyAgKiBAbm90ZSAgIEF2YWlsYWJpbGl0eSBvZiBwYXJhbWV0ZXJzIG9mIHRyaWdnZXIgc291cmNlcyBmcm9tIHRpbWVyCisgICogICAgICAgICBkZXBlbmRzIG9uIHRpbWVycyBhdmFpbGFiaWxpdHkgb24gdGhlIHNlbGVjdGVkIGRldmljZS4KKyAgKiBAcm10b2xsIENSICAgICAgIFRTRUwxICAgICAgICAgIExMX0RBQ19HZXRUcmlnZ2VyU291cmNlXG4KKyAgKiAgICAgICAgIENSICAgICAgIFRTRUwyICAgICAgICAgIExMX0RBQ19HZXRUcmlnZ2VyU291cmNlCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMiAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLgorICAqICAgICAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUdfU09GVFdBUkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJR19FWFRfVElNMl9UUkdPCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUdfRVhUX1RJTTNfVFJHTyAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUdfRVhUX1RJTTRfVFJHTyAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUdfRVhUX1RJTTVfVFJHTyAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUdfRVhUX1RJTTZfVFJHTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklHX0VYVF9USU03X1RSR08gICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklHX0VYVF9USU04X1RSR08gICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklHX0VYVF9USU0xNV9UUkdPICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklHX0VYVF9USU0xOF9UUkdPICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklHX0VYVF9IUlRJTTFfREFDVFJHMSAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklHX0VYVF9IUlRJTTFfREFDVFJHMiAgICgxKSgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklHX0VYVF9IUlRJTTFfREFDVFJHMyAgICgxKSAgICgzKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklHX0VYVF9FWFRJX0xJTkU5CisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiBTVE0zMkYzLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcworICAqICAgICAgICAgKDIpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBEQUMgaW5zdGFuY2VzOiBEQUMxIChmb3IgREFDIGluc3RhbmNlcyBEQUN4IGF2YWlsYWJsZSBvbiB0aGUgc2VsZWN0ZWQgZGV2aWNlKS5cbgorICAqICAgICAgICAgKDMpIE9uIFNUTTMyRjMsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBEQUMgaW5zdGFuY2VzOiBEQUMyIChmb3IgREFDIGluc3RhbmNlcyBEQUN4IGF2YWlsYWJsZSBvbiB0aGUgc2VsZWN0ZWQgZGV2aWNlKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9EQUNfR2V0VHJpZ2dlclNvdXJjZShEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKERBQ3gtPkNSLCBEQUNfQ1JfVFNFTDEgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpCisgICAgICAgICAgICAgICAgICAgID4+IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spCisgICAgICAgICAgICAgICAgICAgKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHdhdmVmb3JtIGF1dG9tYXRpYyBnZW5lcmF0aW9uIG1vZGUKKyAgKiAgICAgICAgIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICogQHJtdG9sbCBDUiAgICAgICBXQVZFMSAgICAgICAgICBMTF9EQUNfU2V0V2F2ZUF1dG9HZW5lcmF0aW9uXG4KKyAgKiAgICAgICAgIENSICAgICAgIFdBVkUyICAgICAgICAgIExMX0RBQ19TZXRXYXZlQXV0b0dlbmVyYXRpb24KKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gdGhpcyBTVE0zMiBzZXJpZSwgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuCisgICogICAgICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LgorICAqIEBwYXJhbSAgV2F2ZUF1dG9HZW5lcmF0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1dBVkVfQVVUT19HRU5FUkFUSU9OX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfV0FWRV9BVVRPX0dFTkVSQVRJT05fTk9JU0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfV0FWRV9BVVRPX0dFTkVSQVRJT05fVFJJQU5HTEUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RBQ19TZXRXYXZlQXV0b0dlbmVyYXRpb24oREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERBQ19DaGFubmVsLCB1aW50MzJfdCBXYXZlQXV0b0dlbmVyYXRpb24pCit7CisgIE1PRElGWV9SRUcoREFDeC0+Q1IsCisgICAgICAgICAgICAgREFDX0NSX1dBVkUxIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spLAorICAgICAgICAgICAgIFdhdmVBdXRvR2VuZXJhdGlvbiA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSB3YXZlZm9ybSBhdXRvbWF0aWMgZ2VuZXJhdGlvbiBtb2RlCisgICogICAgICAgICBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLgorICAqIEBybXRvbGwgQ1IgICAgICAgV0FWRTEgICAgICAgICAgTExfREFDX0dldFdhdmVBdXRvR2VuZXJhdGlvblxuCisgICogICAgICAgICBDUiAgICAgICBXQVZFMiAgICAgICAgICBMTF9EQUNfR2V0V2F2ZUF1dG9HZW5lcmF0aW9uCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMiAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLgorICAqICAgICAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1dBVkVfQVVUT19HRU5FUkFUSU9OX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfV0FWRV9BVVRPX0dFTkVSQVRJT05fTk9JU0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfV0FWRV9BVVRPX0dFTkVSQVRJT05fVFJJQU5HTEUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9EQUNfR2V0V2F2ZUF1dG9HZW5lcmF0aW9uKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoREFDeC0+Q1IsIERBQ19DUl9XQVZFMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSkKKyAgICAgICAgICAgICAgICAgICAgPj4gKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykKKyAgICAgICAgICAgICAgICAgICApOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgbm9pc2Ugd2F2ZWZvcm0gZ2VuZXJhdGlvbiBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsOgorICAqICAgICAgICAgTm9pc2UgbW9kZSBhbmQgcGFyYW1ldGVycyBMRlNSIChsaW5lYXIgZmVlZGJhY2sgc2hpZnQgcmVnaXN0ZXIpLgorICAqIEBub3RlICAgRm9yIHdhdmUgZ2VuZXJhdGlvbiB0byBiZSBlZmZlY3RpdmUsIERBQyBjaGFubmVsCisgICogICAgICAgICB3YXZlIGdlbmVyYXRpb24gbW9kZSBtdXN0IGJlIGVuYWJsZWQgdXNpbmcKKyAgKiAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfREFDX1NldFdhdmVBdXRvR2VuZXJhdGlvbigpLgorICAqIEBub3RlICAgVGhpcyBzZXR0aW5nIGNhbiBiZSBzZXQgd2hlbiB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgaXMgZGlzYWJsZWQKKyAgKiAgICAgICAgIChvdGhlcndpc2UsIHRoZSBzZXR0aW5nIG9wZXJhdGlvbiBpcyBpZ25vcmVkKS4KKyAgKiBAcm10b2xsIENSICAgICAgIE1BTVAxICAgICAgICAgIExMX0RBQ19TZXRXYXZlTm9pc2VMRlNSXG4KKyAgKiAgICAgICAgIENSICAgICAgIE1BTVAyICAgICAgICAgIExMX0RBQ19TZXRXYXZlTm9pc2VMRlNSCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMiAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLgorICAqICAgICAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAgKiBAcGFyYW0gIE5vaXNlTEZTUk1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTMV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFMyXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzNfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTNF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFM1XzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzZfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTN18wCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFM4XzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzlfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTMTBfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTMTFfMAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREFDX1NldFdhdmVOb2lzZUxGU1IoREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERBQ19DaGFubmVsLCB1aW50MzJfdCBOb2lzZUxGU1JNYXNrKQoreworICBNT0RJRllfUkVHKERBQ3gtPkNSLAorICAgICAgICAgICAgIERBQ19DUl9NQU1QMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSwKKyAgICAgICAgICAgICBOb2lzZUxGU1JNYXNrIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIG5vaXNlIHdhdmVmb3JtIGdlbmVyYXRpb24gZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbDoKKyAgKiAgICAgICAgIE5vaXNlIG1vZGUgYW5kIHBhcmFtZXRlcnMgTEZTUiAobGluZWFyIGZlZWRiYWNrIHNoaWZ0IHJlZ2lzdGVyKS4KKyAgKiBAcm10b2xsIENSICAgICAgIE1BTVAxICAgICAgICAgIExMX0RBQ19HZXRXYXZlTm9pc2VMRlNSXG4KKyAgKiAgICAgICAgIENSICAgICAgIE1BTVAyICAgICAgICAgIExMX0RBQ19HZXRXYXZlTm9pc2VMRlNSCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMiAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLgorICAqICAgICAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVDAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzFfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTMl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFMzXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzRfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTNV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFM2XzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzdfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTOF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFM5XzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzEwXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzExXzAKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9EQUNfR2V0V2F2ZU5vaXNlTEZTUihEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKERBQ3gtPkNSLCBEQUNfQ1JfTUFNUDEgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpCisgICAgICAgICAgICAgICAgICAgID4+IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spCisgICAgICAgICAgICAgICAgICAgKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHRyaWFuZ2xlIHdhdmVmb3JtIGdlbmVyYXRpb24gZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbDoKKyAgKiAgICAgICAgIHRyaWFuZ2xlIG1vZGUgYW5kIGFtcGxpdHVkZS4KKyAgKiBAbm90ZSAgIEZvciB3YXZlIGdlbmVyYXRpb24gdG8gYmUgZWZmZWN0aXZlLCBEQUMgY2hhbm5lbAorICAqICAgICAgICAgd2F2ZSBnZW5lcmF0aW9uIG1vZGUgbXVzdCBiZSBlbmFibGVkIHVzaW5nCisgICogICAgICAgICBmdW5jdGlvbiBAcmVmIExMX0RBQ19TZXRXYXZlQXV0b0dlbmVyYXRpb24oKS4KKyAgKiBAbm90ZSAgIFRoaXMgc2V0dGluZyBjYW4gYmUgc2V0IHdoZW4gdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsIGlzIGRpc2FibGVkCisgICogICAgICAgICAob3RoZXJ3aXNlLCB0aGUgc2V0dGluZyBvcGVyYXRpb24gaXMgaWdub3JlZCkuCisgICogQHJtdG9sbCBDUiAgICAgICBNQU1QMSAgICAgICAgICBMTF9EQUNfU2V0V2F2ZVRyaWFuZ2xlQW1wbGl0dWRlXG4KKyAgKiAgICAgICAgIENSICAgICAgIE1BTVAyICAgICAgICAgIExMX0RBQ19TZXRXYXZlVHJpYW5nbGVBbXBsaXR1ZGUKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gdGhpcyBTVE0zMiBzZXJpZSwgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuCisgICogICAgICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LgorICAqIEBwYXJhbSAgVHJpYW5nbGVBbXBsaXR1ZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8zMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfNjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzEyNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfMjU1CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV81MTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzEwMjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzIwNDcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzQwOTUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RBQ19TZXRXYXZlVHJpYW5nbGVBbXBsaXR1ZGUoREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERBQ19DaGFubmVsLCB1aW50MzJfdCBUcmlhbmdsZUFtcGxpdHVkZSkKK3sKKyAgTU9ESUZZX1JFRyhEQUN4LT5DUiwKKyAgICAgICAgICAgICBEQUNfQ1JfTUFNUDEgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSyksCisgICAgICAgICAgICAgVHJpYW5nbGVBbXBsaXR1ZGUgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgdHJpYW5nbGUgd2F2ZWZvcm0gZ2VuZXJhdGlvbiBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsOgorICAqICAgICAgICAgdHJpYW5nbGUgbW9kZSBhbmQgYW1wbGl0dWRlLgorICAqIEBybXRvbGwgQ1IgICAgICAgTUFNUDEgICAgICAgICAgTExfREFDX0dldFdhdmVUcmlhbmdsZUFtcGxpdHVkZVxuCisgICogICAgICAgICBDUiAgICAgICBNQU1QMiAgICAgICAgICBMTF9EQUNfR2V0V2F2ZVRyaWFuZ2xlQW1wbGl0dWRlCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMiAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLgorICAqICAgICAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfMzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzYzCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8xMjcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzI1NQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfNTExCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8xMDIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8yMDQ3CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV80MDk1CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfREFDX0dldFdhdmVUcmlhbmdsZUFtcGxpdHVkZShEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKERBQ3gtPkNSLCBEQUNfQ1JfTUFNUDEgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpCisgICAgICAgICAgICAgICAgICAgID4+IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spCisgICAgICAgICAgICAgICAgICAgKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIG91dHB1dCBidWZmZXIgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4KKyAgKiBAcm10b2xsIENSICAgICAgIEJPRkYxICAgICAgICAgIExMX0RBQ19TZXRPdXRwdXRCdWZmZXJcbgorICAqICAgICAgICAgQ1IgICAgICAgQk9GRjIgICAgICAgICAgTExfREFDX1NldE91dHB1dEJ1ZmZlcgorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERBQ19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzIgKDEpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiB0aGlzIFNUTTMyIHNlcmllLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4KKyAgKiAgICAgICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuCisgICogQHBhcmFtICBPdXRwdXRCdWZmZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfT1VUUFVUX0JVRkZFUl9FTkFCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfT1VUUFVUX0JVRkZFUl9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX09VVFBVVF9TV0lUQ0hfRElTQUJMRSAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfT1VUUFVUX1NXSVRDSF9FTkFCTEUgICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgRmVhdHVyZSBzcGVjaWZpYyB0byBTVE0zMkYzMDN4Ni84IGFuZCBTVE0zMkYzMjg6CisgICogICAgICAgICAgICAgT24gREFDMSBjaGFubmVsIDIsIG91dHB1dCBidWZmZXIgaXMgcmVwbGFjZWQgYnkgYSBzd2l0Y2gKKyAgKiAgICAgICAgICAgICB0byBjb25uZWN0IERBQyBjaGFubmVsIG91dHB1dCB0byBwaW4gUEE1LgorICAqICAgICAgICAgICAgIE9uIERBQzIgY2hhbm5lbCAxLCBvdXRwdXQgYnVmZmVyIGlzIHJlcGxhY2VkIGJ5IGEgc3dpdGNoCisgICogICAgICAgICAgICAgdG8gY29ubmVjdCBEQUMgY2hhbm5lbCBvdXRwdXQgdG8gcGluIFBBNi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RBQ19TZXRPdXRwdXRCdWZmZXIoREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERBQ19DaGFubmVsLCB1aW50MzJfdCBPdXRwdXRCdWZmZXIpCit7CisgIE1PRElGWV9SRUcoREFDeC0+Q1IsCisgICAgICAgICAgICAgREFDX0NSX0JPRkYxIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spLAorICAgICAgICAgICAgIE91dHB1dEJ1ZmZlciA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBvdXRwdXQgYnVmZmVyIHN0YXRlIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICogQHJtdG9sbCBDUiAgICAgICBCT0ZGMSAgICAgICAgICBMTF9EQUNfR2V0T3V0cHV0QnVmZmVyXG4KKyAgKiAgICAgICAgIENSICAgICAgIEJPRkYyICAgICAgICAgIExMX0RBQ19HZXRPdXRwdXRCdWZmZXIKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gdGhpcyBTVE0zMiBzZXJpZSwgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuCisgICogICAgICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfT1VUUFVUX0JVRkZFUl9FTkFCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfT1VUUFVUX0JVRkZFUl9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX09VVFBVVF9TV0lUQ0hfRElTQUJMRSAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfT1VUUFVUX1NXSVRDSF9FTkFCTEUgICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgRmVhdHVyZSBzcGVjaWZpYyB0byBTVE0zMkYzMDN4Ni84IGFuZCBTVE0zMkYzMjg6CisgICogICAgICAgICAgICAgT24gREFDMSBjaGFubmVsIDIsIG91dHB1dCBidWZmZXIgaXMgcmVwbGFjZWQgYnkgYSBzd2l0Y2gKKyAgKiAgICAgICAgICAgICB0byBjb25uZWN0IERBQyBjaGFubmVsIG91dHB1dCB0byBwaW4gUEE1LgorICAqICAgICAgICAgICAgIE9uIERBQzIgY2hhbm5lbCAxLCBvdXRwdXQgYnVmZmVyIGlzIHJlcGxhY2VkIGJ5IGEgc3dpdGNoCisgICogICAgICAgICAgICAgdG8gY29ubmVjdCBEQUMgY2hhbm5lbCBvdXRwdXQgdG8gcGluIFBBNi4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9EQUNfR2V0T3V0cHV0QnVmZmVyKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoREFDeC0+Q1IsIERBQ19DUl9CT0ZGMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSkKKyAgICAgICAgICAgICAgICAgICAgPj4gKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykKKyAgICAgICAgICAgICAgICAgICApOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERBQ19MTF9FRl9ETUFfTWFuYWdlbWVudCBETUEgTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERBQyBETUEgdHJhbnNmZXIgcmVxdWVzdCBvZiB0aGUgc2VsZWN0ZWQgY2hhbm5lbC4KKyAgKiBAbm90ZSAgIFRvIGNvbmZpZ3VyZSBETUEgc291cmNlIGFkZHJlc3MgKHBlcmlwaGVyYWwgYWRkcmVzcyksCisgICogICAgICAgICB1c2UgZnVuY3Rpb24gQHJlZiBMTF9EQUNfRE1BX0dldFJlZ0FkZHIoKS4KKyAgKiBAcm10b2xsIENSICAgICAgIERNQUVOMSAgICAgICAgIExMX0RBQ19FbmFibGVETUFSZXFcbgorICAqICAgICAgICAgQ1IgICAgICAgRE1BRU4yICAgICAgICAgTExfREFDX0VuYWJsZURNQVJlcQorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERBQ19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzIgKDEpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiB0aGlzIFNUTTMyIHNlcmllLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4KKyAgKiAgICAgICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQUNfRW5hYmxlRE1BUmVxKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCkKK3sKKyAgU0VUX0JJVChEQUN4LT5DUiwKKyAgICAgICAgICBEQUNfQ1JfRE1BRU4xIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIERBQyBETUEgdHJhbnNmZXIgcmVxdWVzdCBvZiB0aGUgc2VsZWN0ZWQgY2hhbm5lbC4KKyAgKiBAbm90ZSAgIFRvIGNvbmZpZ3VyZSBETUEgc291cmNlIGFkZHJlc3MgKHBlcmlwaGVyYWwgYWRkcmVzcyksCisgICogICAgICAgICB1c2UgZnVuY3Rpb24gQHJlZiBMTF9EQUNfRE1BX0dldFJlZ0FkZHIoKS4KKyAgKiBAcm10b2xsIENSICAgICAgIERNQUVOMSAgICAgICAgIExMX0RBQ19EaXNhYmxlRE1BUmVxXG4KKyAgKiAgICAgICAgIENSICAgICAgIERNQUVOMiAgICAgICAgIExMX0RBQ19EaXNhYmxlRE1BUmVxCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMiAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLgorICAqICAgICAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RBQ19EaXNhYmxlRE1BUmVxKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCkKK3sKKyAgQ0xFQVJfQklUKERBQ3gtPkNSLAorICAgICAgICAgICAgREFDX0NSX0RNQUVOMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IERBQyBETUEgdHJhbnNmZXIgcmVxdWVzdCBzdGF0ZSBvZiB0aGUgc2VsZWN0ZWQgY2hhbm5lbC4KKyAgKiAgICAgICAgICgwOiBEQUMgRE1BIHRyYW5zZmVyIHJlcXVlc3QgaXMgZGlzYWJsZWQsIDE6IERBQyBETUEgdHJhbnNmZXIgcmVxdWVzdCBpcyBlbmFibGVkKQorICAqIEBybXRvbGwgQ1IgICAgICAgRE1BRU4xICAgICAgICAgTExfREFDX0lzRE1BUmVxRW5hYmxlZFxuCisgICogICAgICAgICBDUiAgICAgICBETUFFTjIgICAgICAgICBMTF9EQUNfSXNETUFSZXFFbmFibGVkCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMiAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLgorICAqICAgICAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9EQUNfSXNETUFSZXFFbmFibGVkKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChEQUN4LT5DUiwKKyAgICAgICAgICAgICAgICAgICBEQUNfQ1JfRE1BRU4xIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spKQorICAgICAgICAgID09IChEQUNfQ1JfRE1BRU4xIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRnVuY3Rpb24gdG8gaGVscCB0byBjb25maWd1cmUgRE1BIHRyYW5zZmVyIHRvIERBQzogcmV0cmlldmUgdGhlCisgICogICAgICAgICBEQUMgcmVnaXN0ZXIgYWRkcmVzcyBmcm9tIERBQyBpbnN0YW5jZSBhbmQgYSBsaXN0IG9mIERBQyByZWdpc3RlcnMKKyAgKiAgICAgICAgIGludGVuZGVkIHRvIGJlIHVzZWQgKG1vc3QgY29tbW9ubHkpIHdpdGggRE1BIHRyYW5zZmVyLgorICAqIEBub3RlICAgVGhlc2UgREFDIHJlZ2lzdGVycyBhcmUgZGF0YSBob2xkaW5nIHJlZ2lzdGVyczoKKyAgKiAgICAgICAgIHdoZW4gREFDIGNvbnZlcnNpb24gaXMgcmVxdWVzdGVkLCBEQUMgZ2VuZXJhdGVzIGEgRE1BIHRyYW5zZmVyCisgICogICAgICAgICByZXF1ZXN0IHRvIGhhdmUgZGF0YSBhdmFpbGFibGUgaW4gREFDIGRhdGEgaG9sZGluZyByZWdpc3RlcnMuCisgICogQG5vdGUgICBUaGlzIG1hY3JvIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBMTCBETUEgZHJpdmVyLCByZWZlciB0bworICAqICAgICAgICAgZnVuY3Rpb24gIkxMX0RNQV9Db25maWdBZGRyZXNzZXMoKSIuCisgICogICAgICAgICBFeGFtcGxlOgorICAqICAgICAgICAgICBMTF9ETUFfQ29uZmlnQWRkcmVzc2VzKERNQTEsCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfRE1BX0NIQU5ORUxfMSwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJjwgYXJyYXkgb3IgdmFyaWFibGUgPiwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9EQUNfRE1BX0dldFJlZ0FkZHIoREFDMSwgTExfREFDX0NIQU5ORUxfMSwgTExfREFDX0RNQV9SRUdfREFUQV8xMkJJVFNfUklHSFRfQUxJR05FRCksCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fUEVSSVBIKTsKKyAgKiBAcm10b2xsIERIUjEyUjEgIERBQ0MxREhSICAgICAgIExMX0RBQ19ETUFfR2V0UmVnQWRkclxuCisgICogICAgICAgICBESFIxMkwxICBEQUNDMURIUiAgICAgICBMTF9EQUNfRE1BX0dldFJlZ0FkZHJcbgorICAqICAgICAgICAgREhSOFIxICAgREFDQzFESFIgICAgICAgTExfREFDX0RNQV9HZXRSZWdBZGRyXG4KKyAgKiAgICAgICAgIERIUjEyUjIgIERBQ0MyREhSICAgICAgIExMX0RBQ19ETUFfR2V0UmVnQWRkclxuCisgICogICAgICAgICBESFIxMkwyICBEQUNDMkRIUiAgICAgICBMTF9EQUNfRE1BX0dldFJlZ0FkZHJcbgorICAqICAgICAgICAgREhSOFIyICAgREFDQzJESFIgICAgICAgTExfREFDX0RNQV9HZXRSZWdBZGRyCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMiAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLgorICAqICAgICAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAgKiBAcGFyYW0gIFJlZ2lzdGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0RNQV9SRUdfREFUQV8xMkJJVFNfUklHSFRfQUxJR05FRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19ETUFfUkVHX0RBVEFfMTJCSVRTX0xFRlRfQUxJR05FRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19ETUFfUkVHX0RBVEFfOEJJVFNfUklHSFRfQUxJR05FRAorICAqIEByZXR2YWwgREFDIHJlZ2lzdGVyIGFkZHJlc3MKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9EQUNfRE1BX0dldFJlZ0FkZHIoREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERBQ19DaGFubmVsLCB1aW50MzJfdCBSZWdpc3RlcikKK3sKKyAgLyogUmV0cmlldmUgYWRkcmVzcyBvZiByZWdpc3RlciBESFIxMlJ4LCBESFIxMkx4IG9yIERIUjhSeCBkZXBlbmRpbmcgb24gICAgICovCisgIC8qIERBQyBjaGFubmVsIHNlbGVjdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICByZXR1cm4gKCh1aW50MzJfdCkoX19EQUNfUFRSX1JFR19PRkZTRVQoKERBQ3gpLT5ESFIxMlIxLCBfX0RBQ19NQVNLX1NISUZUKERBQ19DaGFubmVsLCBSZWdpc3RlcikpKSk7Cit9CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERBQ19MTF9FRl9PcGVyYXRpb24gT3BlcmF0aW9uIG9uIERBQyBjaGFubmVscworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERBQyBzZWxlY3RlZCBjaGFubmVsLgorICAqIEBybXRvbGwgQ1IgICAgICAgRU4xICAgICAgICAgICAgTExfREFDX0VuYWJsZVxuCisgICogICAgICAgICBDUiAgICAgICBFTjIgICAgICAgICAgICBMTF9EQUNfRW5hYmxlCisgICogQG5vdGUgICBBZnRlciBlbmFibGUgZnJvbSBvZmYgc3RhdGUsIERBQyBjaGFubmVsIHJlcXVpcmVzIGEgZGVsYXkKKyAgKiAgICAgICAgIGZvciBvdXRwdXQgdm9sdGFnZSB0byByZWFjaCBhY2N1cmFjeSArLy0gMSBMU0IuCisgICogICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCBwYXJhbWV0ZXIgInRXQUtFVVAiLgorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERBQ19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzIgKDEpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiB0aGlzIFNUTTMyIHNlcmllLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4KKyAgKiAgICAgICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQUNfRW5hYmxlKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCkKK3sKKyAgU0VUX0JJVChEQUN4LT5DUiwKKyAgICAgICAgICBEQUNfQ1JfRU4xIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIERBQyBzZWxlY3RlZCBjaGFubmVsLgorICAqIEBybXRvbGwgQ1IgICAgICAgRU4xICAgICAgICAgICAgTExfREFDX0Rpc2FibGVcbgorICAqICAgICAgICAgQ1IgICAgICAgRU4yICAgICAgICAgICAgTExfREFDX0Rpc2FibGUKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gdGhpcyBTVE0zMiBzZXJpZSwgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuCisgICogICAgICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREFDX0Rpc2FibGUoREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERBQ19DaGFubmVsKQoreworICBDTEVBUl9CSVQoREFDeC0+Q1IsCisgICAgICAgICAgICBEQUNfQ1JfRU4xIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgREFDIGVuYWJsZSBzdGF0ZSBvZiB0aGUgc2VsZWN0ZWQgY2hhbm5lbC4KKyAgKiAgICAgICAgICgwOiBEQUMgY2hhbm5lbCBpcyBkaXNhYmxlZCwgMTogREFDIGNoYW5uZWwgaXMgZW5hYmxlZCkKKyAgKiBAcm10b2xsIENSICAgICAgIEVOMSAgICAgICAgICAgIExMX0RBQ19Jc0VuYWJsZWRcbgorICAqICAgICAgICAgQ1IgICAgICAgRU4yICAgICAgICAgICAgTExfREFDX0lzRW5hYmxlZAorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERBQ19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzIgKDEpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiB0aGlzIFNUTTMyIHNlcmllLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4KKyAgKiAgICAgICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfREFDX0lzRW5hYmxlZChEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwpCit7CisgIHJldHVybiAoUkVBRF9CSVQoREFDeC0+Q1IsCisgICAgICAgICAgICAgICAgICAgREFDX0NSX0VOMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSkKKyAgICAgICAgICA9PSAoREFDX0NSX0VOMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBEQUMgdHJpZ2dlciBvZiB0aGUgc2VsZWN0ZWQgY2hhbm5lbC4KKyAgKiBAbm90ZSAgIC0gSWYgREFDIHRyaWdnZXIgaXMgZGlzYWJsZWQsIERBQyBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZAorICAqICAgICAgICAgICBhdXRvbWF0aWNhbGx5IG9uY2UgdGhlIGRhdGEgaG9sZGluZyByZWdpc3RlciBpcyB1cGRhdGVkLAorICAqICAgICAgICAgICB1c2luZyBmdW5jdGlvbnMgIkxMX0RBQ19Db252ZXJ0RGF0YXs4OyAxMn17UmlnaHQ7IExlZnR9IEFsaWduZWQoKSI6CisgICogICAgICAgICAgIEByZWYgTExfREFDX0NvbnZlcnREYXRhMTJSaWdodEFsaWduZWQoKSwgLi4uCisgICogICAgICAgICAtIElmIERBQyB0cmlnZ2VyIGlzIGVuYWJsZWQsIERBQyBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZAorICAqICAgICAgICAgICBvbmx5IHdoZW4gYSBoYXJkd2FyZSBvZiBzb2Z0d2FyZSB0cmlnZ2VyIGV2ZW50IGlzIG9jY3VycmluZy4KKyAgKiAgICAgICAgICAgU2VsZWN0IHRyaWdnZXIgc291cmNlIHVzaW5nCisgICogICAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfREFDX1NldFRyaWdnZXJTb3VyY2UoKS4KKyAgKiBAcm10b2xsIENSICAgICAgIFRFTjEgICAgICAgICAgIExMX0RBQ19FbmFibGVUcmlnZ2VyXG4KKyAgKiAgICAgICAgIENSICAgICAgIFRFTjIgICAgICAgICAgIExMX0RBQ19FbmFibGVUcmlnZ2VyCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMiAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLgorICAqICAgICAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RBQ19FbmFibGVUcmlnZ2VyKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCkKK3sKKyAgU0VUX0JJVChEQUN4LT5DUiwKKyAgICAgICAgICBEQUNfQ1JfVEVOMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBEQUMgdHJpZ2dlciBvZiB0aGUgc2VsZWN0ZWQgY2hhbm5lbC4KKyAgKiBAcm10b2xsIENSICAgICAgIFRFTjEgICAgICAgICAgIExMX0RBQ19EaXNhYmxlVHJpZ2dlclxuCisgICogICAgICAgICBDUiAgICAgICBURU4yICAgICAgICAgICBMTF9EQUNfRGlzYWJsZVRyaWdnZXIKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gdGhpcyBTVE0zMiBzZXJpZSwgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuCisgICogICAgICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREFDX0Rpc2FibGVUcmlnZ2VyKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCkKK3sKKyAgQ0xFQVJfQklUKERBQ3gtPkNSLAorICAgICAgICAgICAgREFDX0NSX1RFTjEgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBEQUMgdHJpZ2dlciBzdGF0ZSBvZiB0aGUgc2VsZWN0ZWQgY2hhbm5lbC4KKyAgKiAgICAgICAgICgwOiBEQUMgdHJpZ2dlciBpcyBkaXNhYmxlZCwgMTogREFDIHRyaWdnZXIgaXMgZW5hYmxlZCkKKyAgKiBAcm10b2xsIENSICAgICAgIFRFTjEgICAgICAgICAgIExMX0RBQ19Jc1RyaWdnZXJFbmFibGVkXG4KKyAgKiAgICAgICAgIENSICAgICAgIFRFTjIgICAgICAgICAgIExMX0RBQ19Jc1RyaWdnZXJFbmFibGVkCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMiAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLgorICAqICAgICAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9EQUNfSXNUcmlnZ2VyRW5hYmxlZChEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwpCit7CisgIHJldHVybiAoUkVBRF9CSVQoREFDeC0+Q1IsCisgICAgICAgICAgICAgICAgICAgREFDX0NSX1RFTjEgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpCisgICAgICAgICAgPT0gKERBQ19DUl9URU4xIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVHJpZyBEQUMgY29udmVyc2lvbiBieSBzb2Z0d2FyZSBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLgorICAqIEBub3RlICAgUHJlbGltaW5hcmlseSwgREFDIHRyaWdnZXIgbXVzdCBiZSBzZXQgdG8gc29mdHdhcmUgdHJpZ2dlcgorICAqICAgICAgICAgdXNpbmcgZnVuY3Rpb24gQHJlZiBMTF9EQUNfU2V0VHJpZ2dlclNvdXJjZSgpCisgICogICAgICAgICB3aXRoIHBhcmFtZXRlciAiTExfREFDX1RSSUdHRVJfU09GVFdBUkUiLgorICAqICAgICAgICAgYW5kIERBQyB0cmlnZ2VyIG11c3QgYmUgZW5hYmxlZCB1c2luZworICAqICAgICAgICAgZnVuY3Rpb24gQHJlZiBMTF9EQUNfRW5hYmxlVHJpZ2dlcigpLgorICAqIEBub3RlICAgRm9yIGRldmljZXMgZmVhdHVyaW5nIERBQyB3aXRoIDIgY2hhbm5lbHM6IHRoaXMgZnVuY3Rpb24KKyAgKiAgICAgICAgIGNhbiBwZXJmb3JtIGEgU1cgc3RhcnQgb2YgYm90aCBEQUMgY2hhbm5lbHMgc2ltdWx0YW5lb3VzbHkuCisgICogICAgICAgICBUd28gY2hhbm5lbHMgY2FuIGJlIHNlbGVjdGVkIGFzIHBhcmFtZXRlci4KKyAgKiAgICAgICAgIEV4YW1wbGU6IChMTF9EQUNfQ0hBTk5FTF8xIHwgTExfREFDX0NIQU5ORUxfMikKKyAgKiBAcm10b2xsIFNXVFJJR1IgIFNXVFJJRzEgICAgICAgIExMX0RBQ19UcmlnU1dDb252ZXJzaW9uXG4KKyAgKiAgICAgICAgIFNXVFJJR1IgIFNXVFJJRzIgICAgICAgIExMX0RBQ19UcmlnU1dDb252ZXJzaW9uCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgIFRoaXMgcGFyYW1ldGVyIGNhbiBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gdGhpcyBTVE0zMiBzZXJpZSwgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuCisgICogICAgICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREFDX1RyaWdTV0NvbnZlcnNpb24oREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERBQ19DaGFubmVsKQoreworICBTRVRfQklUKERBQ3gtPlNXVFJJR1IsCisgICAgICAgICAgKERBQ19DaGFubmVsICYgREFDX1NXVFJfQ0hYX01BU0spKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGRhdGEgdG8gYmUgbG9hZGVkIGluIHRoZSBkYXRhIGhvbGRpbmcgcmVnaXN0ZXIKKyAgKiAgICAgICAgIGluIGZvcm1hdCAxMiBiaXRzIGxlZnQgYWxpZ25tZW50IChMU0IgYWxpZ25lZCBvbiBiaXQgMCksCisgICogICAgICAgICBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLgorICAqIEBybXRvbGwgREhSMTJSMSAgREFDQzFESFIgICAgICAgTExfREFDX0NvbnZlcnREYXRhMTJSaWdodEFsaWduZWRcbgorICAqICAgICAgICAgREhSMTJSMiAgREFDQzJESFIgICAgICAgTExfREFDX0NvbnZlcnREYXRhMTJSaWdodEFsaWduZWQKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gdGhpcyBTVE0zMiBzZXJpZSwgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuCisgICogICAgICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LgorICAqIEBwYXJhbSAgRGF0YSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREFDX0NvbnZlcnREYXRhMTJSaWdodEFsaWduZWQoREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERBQ19DaGFubmVsLCB1aW50MzJfdCBEYXRhKQoreworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19EQUNfUFRSX1JFR19PRkZTRVQoREFDeC0+REhSMTJSMSwgX19EQUNfTUFTS19TSElGVChEQUNfQ2hhbm5lbCwgREFDX1JFR19ESFIxMlJYX1JFR09GRlNFVF9NQVNLKSk7CisgIAorICBNT0RJRllfUkVHKCpwcmVnLAorICAgICAgICAgICAgIERBQ19ESFIxMlIxX0RBQ0MxREhSLAorICAgICAgICAgICAgIERhdGEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgZGF0YSB0byBiZSBsb2FkZWQgaW4gdGhlIGRhdGEgaG9sZGluZyByZWdpc3RlcgorICAqICAgICAgICAgaW4gZm9ybWF0IDEyIGJpdHMgbGVmdCBhbGlnbm1lbnQgKE1TQiBhbGlnbmVkIG9uIGJpdCAxNSksCisgICogICAgICAgICBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLgorICAqIEBybXRvbGwgREhSMTJMMSAgREFDQzFESFIgICAgICAgTExfREFDX0NvbnZlcnREYXRhMTJMZWZ0QWxpZ25lZFxuCisgICogICAgICAgICBESFIxMkwyICBEQUNDMkRIUiAgICAgICBMTF9EQUNfQ29udmVydERhdGExMkxlZnRBbGlnbmVkCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMiAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLgorICAqICAgICAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAgKiBAcGFyYW0gIERhdGEgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RBQ19Db252ZXJ0RGF0YTEyTGVmdEFsaWduZWQoREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERBQ19DaGFubmVsLCB1aW50MzJfdCBEYXRhKQoreworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19EQUNfUFRSX1JFR19PRkZTRVQoREFDeC0+REhSMTJSMSwgX19EQUNfTUFTS19TSElGVChEQUNfQ2hhbm5lbCwgREFDX1JFR19ESFIxMkxYX1JFR09GRlNFVF9NQVNLKSk7CisgIAorICBNT0RJRllfUkVHKCpwcmVnLAorICAgICAgICAgICAgIERBQ19ESFIxMkwxX0RBQ0MxREhSLAorICAgICAgICAgICAgIERhdGEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgZGF0YSB0byBiZSBsb2FkZWQgaW4gdGhlIGRhdGEgaG9sZGluZyByZWdpc3RlcgorICAqICAgICAgICAgaW4gZm9ybWF0IDggYml0cyBsZWZ0IGFsaWdubWVudCAoTFNCIGFsaWduZWQgb24gYml0IDApLAorICAqICAgICAgICAgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4KKyAgKiBAcm10b2xsIERIUjhSMSAgIERBQ0MxREhSICAgICAgIExMX0RBQ19Db252ZXJ0RGF0YThSaWdodEFsaWduZWRcbgorICAqICAgICAgICAgREhSOFIyICAgREFDQzJESFIgICAgICAgTExfREFDX0NvbnZlcnREYXRhOFJpZ2h0QWxpZ25lZAorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERBQ19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzIgKDEpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiB0aGlzIFNUTTMyIHNlcmllLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4KKyAgKiAgICAgICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuCisgICogQHBhcmFtICBEYXRhIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREFDX0NvbnZlcnREYXRhOFJpZ2h0QWxpZ25lZChEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwsIHVpbnQzMl90IERhdGEpCit7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0RBQ19QVFJfUkVHX09GRlNFVChEQUN4LT5ESFIxMlIxLCBfX0RBQ19NQVNLX1NISUZUKERBQ19DaGFubmVsLCBEQUNfUkVHX0RIUjhSWF9SRUdPRkZTRVRfTUFTSykpOworICAKKyAgTU9ESUZZX1JFRygqcHJlZywKKyAgICAgICAgICAgICBEQUNfREhSOFIxX0RBQ0MxREhSLAorICAgICAgICAgICAgIERhdGEpOworfQorCisjaWYgZGVmaW5lZChEQUNfQ0hBTk5FTDJfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBkYXRhIHRvIGJlIGxvYWRlZCBpbiB0aGUgZGF0YSBob2xkaW5nIHJlZ2lzdGVyCisgICogICAgICAgICBpbiBmb3JtYXQgMTIgYml0cyBsZWZ0IGFsaWdubWVudCAoTFNCIGFsaWduZWQgb24gYml0IDApLAorICAqICAgICAgICAgZm9yIGJvdGggREFDIGNoYW5uZWxzLgorICAqIEBybXRvbGwgREhSMTJSRCAgREFDQzFESFIgICAgICAgTExfREFDX0NvbnZlcnREdWFsRGF0YTEyUmlnaHRBbGlnbmVkXG4KKyAgKiAgICAgICAgIERIUjEyUkQgIERBQ0MyREhSICAgICAgIExMX0RBQ19Db252ZXJ0RHVhbERhdGExMlJpZ2h0QWxpZ25lZAorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERhdGFDaGFubmVsMSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICAqIEBwYXJhbSAgRGF0YUNoYW5uZWwyIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQUNfQ29udmVydER1YWxEYXRhMTJSaWdodEFsaWduZWQoREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERhdGFDaGFubmVsMSwgdWludDMyX3QgRGF0YUNoYW5uZWwyKQoreworICBNT0RJRllfUkVHKERBQ3gtPkRIUjEyUkQsCisgICAgICAgICAgICAgKERBQ19ESFIxMlJEX0RBQ0MyREhSIHwgREFDX0RIUjEyUkRfREFDQzFESFIpLAorICAgICAgICAgICAgICgoRGF0YUNoYW5uZWwyIDw8IERBQ19ESFIxMlJEX0RBQ0MyREhSX0JJVE9GRlNFVF9QT1MpIHwgRGF0YUNoYW5uZWwxKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBkYXRhIHRvIGJlIGxvYWRlZCBpbiB0aGUgZGF0YSBob2xkaW5nIHJlZ2lzdGVyCisgICogICAgICAgICBpbiBmb3JtYXQgMTIgYml0cyBsZWZ0IGFsaWdubWVudCAoTVNCIGFsaWduZWQgb24gYml0IDE1KSwKKyAgKiAgICAgICAgIGZvciBib3RoIERBQyBjaGFubmVscy4KKyAgKiBAcm10b2xsIERIUjEyTEQgIERBQ0MxREhSICAgICAgIExMX0RBQ19Db252ZXJ0RHVhbERhdGExMkxlZnRBbGlnbmVkXG4KKyAgKiAgICAgICAgIERIUjEyTEQgIERBQ0MyREhSICAgICAgIExMX0RBQ19Db252ZXJ0RHVhbERhdGExMkxlZnRBbGlnbmVkCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgRGF0YUNoYW5uZWwxIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGCisgICogQHBhcmFtICBEYXRhQ2hhbm5lbDIgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RBQ19Db252ZXJ0RHVhbERhdGExMkxlZnRBbGlnbmVkKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEYXRhQ2hhbm5lbDEsIHVpbnQzMl90IERhdGFDaGFubmVsMikKK3sKKyAgLyogTm90ZTogRGF0YSBvZiBEQUMgY2hhbm5lbCAyIHNoaWZ0IHZhbHVlIHN1YnRyYWN0ZWQgb2YgNCBiZWNhdXNlICAgICAgICAgICovCisgIC8qICAgICAgIGRhdGEgb24gMTYgYml0cyBhbmQgREFDIGNoYW5uZWwgMiBiaXRzIGZpZWxkIGlzIG9uIHRoZSAxMiBNU0IsICAgICAqLworICAvKiAgICAgICB0aGUgNCBMU0IgbXVzdCBiZSB0YWtlbiBpbnRvIGFjY291bnQgZm9yIHRoZSBzaGlmdCB2YWx1ZS4gICAgICAgICAgKi8KKyAgTU9ESUZZX1JFRyhEQUN4LT5ESFIxMkxELAorICAgICAgICAgICAgIChEQUNfREhSMTJMRF9EQUNDMkRIUiB8IERBQ19ESFIxMkxEX0RBQ0MxREhSKSwKKyAgICAgICAgICAgICAoKERhdGFDaGFubmVsMiA8PCAoREFDX0RIUjEyTERfREFDQzJESFJfQklUT0ZGU0VUX1BPUyAtIDRVKSkgfCBEYXRhQ2hhbm5lbDEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGRhdGEgdG8gYmUgbG9hZGVkIGluIHRoZSBkYXRhIGhvbGRpbmcgcmVnaXN0ZXIKKyAgKiAgICAgICAgIGluIGZvcm1hdCA4IGJpdHMgbGVmdCBhbGlnbm1lbnQgKExTQiBhbGlnbmVkIG9uIGJpdCAwKSwKKyAgKiAgICAgICAgIGZvciBib3RoIERBQyBjaGFubmVscy4KKyAgKiBAcm10b2xsIERIUjhSRCAgREFDQzFESFIgICAgICAgTExfREFDX0NvbnZlcnREdWFsRGF0YThSaWdodEFsaWduZWRcbgorICAqICAgICAgICAgREhSOFJEICBEQUNDMkRIUiAgICAgICBMTF9EQUNfQ29udmVydER1YWxEYXRhOFJpZ2h0QWxpZ25lZAorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERhdGFDaGFubmVsMSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKiBAcGFyYW0gIERhdGFDaGFubmVsMiBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RBQ19Db252ZXJ0RHVhbERhdGE4UmlnaHRBbGlnbmVkKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEYXRhQ2hhbm5lbDEsIHVpbnQzMl90IERhdGFDaGFubmVsMikKK3sKKyAgTU9ESUZZX1JFRyhEQUN4LT5ESFI4UkQsCisgICAgICAgICAgICAgKERBQ19ESFI4UkRfREFDQzJESFIgfCBEQUNfREhSOFJEX0RBQ0MxREhSKSwKKyAgICAgICAgICAgICAoKERhdGFDaGFubmVsMiA8PCBEQUNfREhSOFJEX0RBQ0MyREhSX0JJVE9GRlNFVF9QT1MpIHwgRGF0YUNoYW5uZWwxKSk7Cit9CisKKyNlbmRpZiAvKiBEQUNfQ0hBTk5FTDJfU1VQUE9SVCAqLworLyoqCisgICogQGJyaWVmICBSZXRyaWV2ZSBvdXRwdXQgZGF0YSBjdXJyZW50bHkgZ2VuZXJhdGVkIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICogQG5vdGUgICBXaGF0ZXZlciBhbGlnbm1lbnQgYW5kIHJlc29sdXRpb24gc2V0dGluZ3MKKyAgKiAgICAgICAgICh1c2luZyBmdW5jdGlvbnMgIkxMX0RBQ19Db252ZXJ0RGF0YXs4OyAxMn17UmlnaHQ7IExlZnR9IEFsaWduZWQoKSI6CisgICogICAgICAgICBAcmVmIExMX0RBQ19Db252ZXJ0RGF0YTEyUmlnaHRBbGlnbmVkKCksIC4uLiksCisgICogICAgICAgICBvdXRwdXQgZGF0YSBmb3JtYXQgaXMgMTIgYml0cyByaWdodCBhbGlnbmVkIChMU0IgYWxpZ25lZCBvbiBiaXQgMCkuCisgICogQHJtdG9sbCBET1IxICAgICBEQUNDMURPUiAgICAgICBMTF9EQUNfUmV0cmlldmVPdXRwdXREYXRhXG4KKyAgKiAgICAgICAgIERPUjIgICAgIERBQ0MyRE9SICAgICAgIExMX0RBQ19SZXRyaWV2ZU91dHB1dERhdGEKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gdGhpcyBTVE0zMiBzZXJpZSwgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuCisgICogICAgICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9EQUNfUmV0cmlldmVPdXRwdXREYXRhKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCkKK3sKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fREFDX1BUUl9SRUdfT0ZGU0VUKERBQ3gtPkRPUjEsIF9fREFDX01BU0tfU0hJRlQoREFDX0NoYW5uZWwsIERBQ19SRUdfRE9SWF9SRUdPRkZTRVRfTUFTSykpOworICAKKyAgcmV0dXJuICh1aW50MTZfdCkgUkVBRF9CSVQoKnByZWcsIERBQ19ET1IxX0RBQ0MxRE9SKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfTExfRUZfRkxBR19NYW5hZ2VtZW50IEZMQUcgTWFuYWdlbWVudAorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEdldCBEQUMgdW5kZXJydW4gZmxhZyBmb3IgREFDIGNoYW5uZWwgMQorICAqIEBybXRvbGwgU1IgICAgICAgRE1BVURSMSAgICAgICAgTExfREFDX0lzQWN0aXZlRmxhZ19ETUFVRFIxCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RBQ19Jc0FjdGl2ZUZsYWdfRE1BVURSMShEQUNfVHlwZURlZiAqREFDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChEQUN4LT5TUiwgTExfREFDX0ZMQUdfRE1BVURSMSkgPT0gKExMX0RBQ19GTEFHX0RNQVVEUjEpKTsKK30KKworI2lmIGRlZmluZWQoREFDX0NIQU5ORUwyX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIEdldCBEQUMgdW5kZXJydW4gZmxhZyBmb3IgREFDIGNoYW5uZWwgMgorICAqIEBybXRvbGwgU1IgICAgICAgRE1BVURSMiAgICAgICAgTExfREFDX0lzQWN0aXZlRmxhZ19ETUFVRFIyCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RBQ19Jc0FjdGl2ZUZsYWdfRE1BVURSMihEQUNfVHlwZURlZiAqREFDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChEQUN4LT5TUiwgTExfREFDX0ZMQUdfRE1BVURSMikgPT0gKExMX0RBQ19GTEFHX0RNQVVEUjIpKTsKK30KKyNlbmRpZiAvKiBEQUNfQ0hBTk5FTDJfU1VQUE9SVCAqLworCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIERBQyB1bmRlcnJ1biBmbGFnIGZvciBEQUMgY2hhbm5lbCAxCisgICogQHJtdG9sbCBTUiAgICAgICBETUFVRFIxICAgICAgICBMTF9EQUNfQ2xlYXJGbGFnX0RNQVVEUjEKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQUNfQ2xlYXJGbGFnX0RNQVVEUjEoREFDX1R5cGVEZWYgKkRBQ3gpCit7CisgIFdSSVRFX1JFRyhEQUN4LT5TUiwgTExfREFDX0ZMQUdfRE1BVURSMSk7Cit9CisKKyNpZiBkZWZpbmVkKERBQ19DSEFOTkVMMl9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBDbGVhciBEQUMgdW5kZXJydW4gZmxhZyBmb3IgREFDIGNoYW5uZWwgMgorICAqIEBybXRvbGwgU1IgICAgICAgRE1BVURSMiAgICAgICAgTExfREFDX0NsZWFyRmxhZ19ETUFVRFIyCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREFDX0NsZWFyRmxhZ19ETUFVRFIyKERBQ19UeXBlRGVmICpEQUN4KQoreworICBXUklURV9SRUcoREFDeC0+U1IsIExMX0RBQ19GTEFHX0RNQVVEUjIpOworfQorI2VuZGlmIC8qIERBQ19DSEFOTkVMMl9TVVBQT1JUICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0xMX0VGX0lUX01hbmFnZW1lbnQgSVQgbWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERNQSB1bmRlcnJ1biBpbnRlcnJ1cHQgZm9yIERBQyBjaGFubmVsIDEKKyAgKiBAcm10b2xsIENSICAgICAgIERNQVVEUklFMSAgICAgIExMX0RBQ19FbmFibGVJVF9ETUFVRFIxCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREFDX0VuYWJsZUlUX0RNQVVEUjEoREFDX1R5cGVEZWYgKkRBQ3gpCit7CisgIFNFVF9CSVQoREFDeC0+Q1IsIExMX0RBQ19JVF9ETUFVRFJJRTEpOworfQorCisjaWYgZGVmaW5lZChEQUNfQ0hBTk5FTDJfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERNQSB1bmRlcnJ1biBpbnRlcnJ1cHQgZm9yIERBQyBjaGFubmVsIDIKKyAgKiBAcm10b2xsIENSICAgICAgIERNQVVEUklFMiAgICAgIExMX0RBQ19FbmFibGVJVF9ETUFVRFIyCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREFDX0VuYWJsZUlUX0RNQVVEUjIoREFDX1R5cGVEZWYgKkRBQ3gpCit7CisgIFNFVF9CSVQoREFDeC0+Q1IsIExMX0RBQ19JVF9ETUFVRFJJRTIpOworfQorI2VuZGlmIC8qIERBQ19DSEFOTkVMMl9TVVBQT1JUICovCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBETUEgdW5kZXJydW4gaW50ZXJydXB0IGZvciBEQUMgY2hhbm5lbCAxCisgICogQHJtdG9sbCBDUiAgICAgICBETUFVRFJJRTEgICAgICBMTF9EQUNfRGlzYWJsZUlUX0RNQVVEUjEKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQUNfRGlzYWJsZUlUX0RNQVVEUjEoREFDX1R5cGVEZWYgKkRBQ3gpCit7CisgIENMRUFSX0JJVChEQUN4LT5DUiwgTExfREFDX0lUX0RNQVVEUklFMSk7Cit9CisKKyNpZiBkZWZpbmVkKERBQ19DSEFOTkVMMl9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBEaXNhYmxlIERNQSB1bmRlcnJ1biBpbnRlcnJ1cHQgZm9yIERBQyBjaGFubmVsIDIKKyAgKiBAcm10b2xsIENSICAgICAgIERNQVVEUklFMiAgICAgIExMX0RBQ19EaXNhYmxlSVRfRE1BVURSMgorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RBQ19EaXNhYmxlSVRfRE1BVURSMihEQUNfVHlwZURlZiAqREFDeCkKK3sKKyAgQ0xFQVJfQklUKERBQ3gtPkNSLCBMTF9EQUNfSVRfRE1BVURSSUUyKTsKK30KKyNlbmRpZiAvKiBEQUNfQ0hBTk5FTDJfU1VQUE9SVCAqLworCisvKioKKyAgKiBAYnJpZWYgIEdldCBETUEgdW5kZXJydW4gaW50ZXJydXB0IGZvciBEQUMgY2hhbm5lbCAxCisgICogQHJtdG9sbCBDUiAgICAgICBETUFVRFJJRTEgICAgICBMTF9EQUNfSXNFbmFibGVkSVRfRE1BVURSMQorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9EQUNfSXNFbmFibGVkSVRfRE1BVURSMShEQUNfVHlwZURlZiAqREFDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChEQUN4LT5DUiwgTExfREFDX0lUX0RNQVVEUklFMSkgPT0gKExMX0RBQ19JVF9ETUFVRFJJRTEpKTsKK30KKworI2lmIGRlZmluZWQoREFDX0NIQU5ORUwyX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIEdldCBETUEgdW5kZXJydW4gaW50ZXJydXB0IGZvciBEQUMgY2hhbm5lbCAyCisgICogQHJtdG9sbCBDUiAgICAgICBETUFVRFJJRTIgICAgICBMTF9EQUNfSXNFbmFibGVkSVRfRE1BVURSMgorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9EQUNfSXNFbmFibGVkSVRfRE1BVURSMihEQUNfVHlwZURlZiAqREFDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChEQUN4LT5DUiwgTExfREFDX0lUX0RNQVVEUklFMikgPT0gKExMX0RBQ19JVF9ETUFVRFJJRTIpKTsKK30KKyNlbmRpZiAvKiBEQUNfQ0hBTk5FTDJfU1VQUE9SVCAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIERBQ19MTF9FRl9Jbml0IEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCitFcnJvclN0YXR1cyBMTF9EQUNfRGVJbml0KERBQ19UeXBlRGVmKiBEQUN4KTsKK0Vycm9yU3RhdHVzIExMX0RBQ19Jbml0KERBQ19UeXBlRGVmKiBEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCwgTExfREFDX0luaXRUeXBlRGVmKiBEQUNfSW5pdFN0cnVjdCk7Cit2b2lkICAgICAgICBMTF9EQUNfU3RydWN0SW5pdChMTF9EQUNfSW5pdFR5cGVEZWYqIERBQ19Jbml0U3RydWN0KTsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIERBQzEgfHwgREFDMiAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkYzeHhfTExfREFDX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmYzeHhfbGxfZG1hLmggYi9JbmMvc3RtMzJmM3h4X2xsX2RtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhOGNhZTkKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2xsX2RtYS5oCkBAIC0wLDAgKzEsMjAxMiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9sbF9kbWEuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgRE1BIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0xMX0RNQV9ICisjZGVmaW5lIF9fU1RNMzJGM3h4X0xMX0RNQV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoRE1BMSkgfHwgZGVmaW5lZCAoRE1BMikKKworLyoqIEBkZWZncm91cCBETUFfTEwgRE1BCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIERNQV9MTF9Qcml2YXRlX1ZhcmlhYmxlcyBETUEgUHJpdmF0ZSBWYXJpYWJsZXMKKyAgKiBAeworICAqLworLyogQXJyYXkgdXNlZCB0byBnZXQgdGhlIERNQSBjaGFubmVsIHJlZ2lzdGVyIG9mZnNldCB2ZXJzdXMgY2hhbm5lbCBpbmRleCBMTF9ETUFfQ0hBTk5FTF94ICovCitzdGF0aWMgY29uc3QgdWludDhfdCBDSEFOTkVMX09GRlNFVF9UQUJbXSA9Cit7CisgICh1aW50OF90KShETUExX0NoYW5uZWwxX0JBU0UgLSBETUExX0JBU0UpLAorICAodWludDhfdCkoRE1BMV9DaGFubmVsMl9CQVNFIC0gRE1BMV9CQVNFKSwKKyAgKHVpbnQ4X3QpKERNQTFfQ2hhbm5lbDNfQkFTRSAtIERNQTFfQkFTRSksCisgICh1aW50OF90KShETUExX0NoYW5uZWw0X0JBU0UgLSBETUExX0JBU0UpLAorICAodWludDhfdCkoRE1BMV9DaGFubmVsNV9CQVNFIC0gRE1BMV9CQVNFKSwKKyAgKHVpbnQ4X3QpKERNQTFfQ2hhbm5lbDZfQkFTRSAtIERNQTFfQkFTRSksCisgICh1aW50OF90KShETUExX0NoYW5uZWw3X0JBU0UgLSBETUExX0JBU0UpCit9OworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIERNQV9MTF9Qcml2YXRlX01hY3JvcyBETUEgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIERNQV9MTF9FU19JTklUIERNQSBFeHBvcnRlZCBJbml0IHN0cnVjdHVyZQorICAqIEB7CisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQZXJpcGhPck0yTVNyY0FkZHJlc3M7ICAvKiE8IFNwZWNpZmllcyB0aGUgcGVyaXBoZXJhbCBiYXNlIGFkZHJlc3MgZm9yIERNQSB0cmFuc2ZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGFzIFNvdXJjZSBiYXNlIGFkZHJlc3MgaW4gY2FzZSBvZiBtZW1vcnkgdG8gbWVtb3J5IHRyYW5zZmVyIGRpcmVjdGlvbi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGLiAqLworCisgIHVpbnQzMl90IE1lbW9yeU9yTTJNRHN0QWRkcmVzczsgIC8qITwgU3BlY2lmaWVzIHRoZSBtZW1vcnkgYmFzZSBhZGRyZXNzIGZvciBETUEgdHJhbnNmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBhcyBEZXN0aW5hdGlvbiBiYXNlIGFkZHJlc3MgaW4gY2FzZSBvZiBtZW1vcnkgdG8gbWVtb3J5IHRyYW5zZmVyIGRpcmVjdGlvbi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGLiAqLworCisgIHVpbnQzMl90IERpcmVjdGlvbjsgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIGlmIHRoZSBkYXRhIHdpbGwgYmUgdHJhbnNmZXJyZWQgZnJvbSBtZW1vcnkgdG8gcGVyaXBoZXJhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIG1lbW9yeSB0byBtZW1vcnkgb3IgZnJvbSBwZXJpcGhlcmFsIHRvIG1lbW9yeS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERNQV9MTF9FQ19ESVJFQ1RJT04KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfRE1BX1NldERhdGFUcmFuc2ZlckRpcmVjdGlvbigpLiAqLworCisgIHVpbnQzMl90IE1vZGU7ICAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBub3JtYWwgb3IgY2lyY3VsYXIgb3BlcmF0aW9uIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfTExfRUNfTU9ERQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlOiBUaGUgY2lyY3VsYXIgYnVmZmVyIG1vZGUgY2Fubm90IGJlIHVzZWQgaWYgdGhlIG1lbW9yeSB0byBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24gaXMgY29uZmlndXJlZCBvbiB0aGUgc2VsZWN0ZWQgQ2hhbm5lbAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9ETUFfU2V0TW9kZSgpLiAqLworCisgIHVpbnQzMl90IFBlcmlwaE9yTTJNU3JjSW5jTW9kZTsgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFBlcmlwaGVyYWwgYWRkcmVzcyBvciBTb3VyY2UgYWRkcmVzcyBpbiBjYXNlIG9mIG1lbW9yeSB0byBtZW1vcnkgdHJhbnNmZXIgZGlyZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgaW5jcmVtZW50ZWQgb3Igbm90LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRE1BX0xMX0VDX1BFUklQSAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9ETUFfU2V0UGVyaXBoSW5jTW9kZSgpLiAqLworCisgIHVpbnQzMl90IE1lbW9yeU9yTTJNRHN0SW5jTW9kZTsgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIE1lbW9yeSBhZGRyZXNzIG9yIERlc3RpbmF0aW9uIGFkZHJlc3MgaW4gY2FzZSBvZiBtZW1vcnkgdG8gbWVtb3J5IHRyYW5zZmVyIGRpcmVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGluY3JlbWVudGVkIG9yIG5vdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERNQV9MTF9FQ19NRU1PUlkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfRE1BX1NldE1lbW9yeUluY01vZGUoKS4gKi8KKworICB1aW50MzJfdCBQZXJpcGhPck0yTVNyY0RhdGFTaXplOyAvKiE8IFNwZWNpZmllcyB0aGUgUGVyaXBoZXJhbCBkYXRhIHNpemUgYWxpZ25tZW50IG9yIFNvdXJjZSBkYXRhIHNpemUgYWxpZ25tZW50IChieXRlLCBoYWxmIHdvcmQsIHdvcmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gY2FzZSBvZiBtZW1vcnkgdG8gbWVtb3J5IHRyYW5zZmVyIGRpcmVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERNQV9MTF9FQ19QREFUQUFMSUdOCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0RNQV9TZXRQZXJpcGhTaXplKCkuICovCisKKyAgdWludDMyX3QgTWVtb3J5T3JNMk1Ec3REYXRhU2l6ZTsgLyohPCBTcGVjaWZpZXMgdGhlIE1lbW9yeSBkYXRhIHNpemUgYWxpZ25tZW50IG9yIERlc3RpbmF0aW9uIGRhdGEgc2l6ZSBhbGlnbm1lbnQgKGJ5dGUsIGhhbGYgd29yZCwgd29yZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBjYXNlIG9mIG1lbW9yeSB0byBtZW1vcnkgdHJhbnNmZXIgZGlyZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRE1BX0xMX0VDX01EQVRBQUxJR04KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfRE1BX1NldE1lbW9yeVNpemUoKS4gKi8KKworICB1aW50MzJfdCBOYkRhdGE7ICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRhdGEgdG8gdHJhbnNmZXIsIGluIGRhdGEgdW5pdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGF0YSB1bml0IGlzIGVxdWFsIHRvIHRoZSBzb3VyY2UgYnVmZmVyIGNvbmZpZ3VyYXRpb24gc2V0IGluIFBlcmlwaGVyYWxTaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgTWVtb3J5U2l6ZSBwYXJhbWV0ZXJzIGRlcGVuZGluZyBpbiB0aGUgdHJhbnNmZXIgZGlyZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweDAwMDBGRkZGCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0RNQV9TZXREYXRhTGVuZ3RoKCkuICovCisKKyAgdWludDMyX3QgUHJpb3JpdHk7ICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGNoYW5uZWwgcHJpb3JpdHkgbGV2ZWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfTExfRUNfUFJJT1JJVFkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfRE1BX1NldENoYW5uZWxQcmlvcml0eUxldmVsKCkuICovCisKK30gTExfRE1BX0luaXRUeXBlRGVmOworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIERNQV9MTF9FeHBvcnRlZF9Db25zdGFudHMgRE1BIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisvKiogQGRlZmdyb3VwIERNQV9MTF9FQ19DTEVBUl9GTEFHIENsZWFyIEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0RNQV9Xcml0ZVJlZyBmdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NHSUYxICAgICAgICAgICAgICAgICBETUFfSUZDUl9DR0lGMSAgICAgICAgLyohPCBDaGFubmVsIDEgZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DVENJRjEgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ1RDSUYxICAgICAgIC8qITwgQ2hhbm5lbCAxIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ0hUSUYxICAgICAgICAgICAgICAgIERNQV9JRkNSX0NIVElGMSAgICAgICAvKiE8IENoYW5uZWwgMSBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NURUlGMSAgICAgICAgICAgICAgICBETUFfSUZDUl9DVEVJRjEgICAgICAgLyohPCBDaGFubmVsIDEgdHJhbnNmZXIgZXJyb3IgZmxhZyAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DR0lGMiAgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ0dJRjIgICAgICAgIC8qITwgQ2hhbm5lbCAyIGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ1RDSUYyICAgICAgICAgICAgICAgIERNQV9JRkNSX0NUQ0lGMiAgICAgICAvKiE8IENoYW5uZWwgMiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NIVElGMiAgICAgICAgICAgICAgICBETUFfSUZDUl9DSFRJRjIgICAgICAgLyohPCBDaGFubmVsIDIgaGFsZiB0cmFuc2ZlciBmbGFnICAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DVEVJRjIgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ1RFSUYyICAgICAgIC8qITwgQ2hhbm5lbCAyIHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ0dJRjMgICAgICAgICAgICAgICAgIERNQV9JRkNSX0NHSUYzICAgICAgICAvKiE8IENoYW5uZWwgMyBnbG9iYWwgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NUQ0lGMyAgICAgICAgICAgICAgICBETUFfSUZDUl9DVENJRjMgICAgICAgLyohPCBDaGFubmVsIDMgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DSFRJRjMgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ0hUSUYzICAgICAgIC8qITwgQ2hhbm5lbCAzIGhhbGYgdHJhbnNmZXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ1RFSUYzICAgICAgICAgICAgICAgIERNQV9JRkNSX0NURUlGMyAgICAgICAvKiE8IENoYW5uZWwgMyB0cmFuc2ZlciBlcnJvciBmbGFnICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NHSUY0ICAgICAgICAgICAgICAgICBETUFfSUZDUl9DR0lGNCAgICAgICAgLyohPCBDaGFubmVsIDQgZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DVENJRjQgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ1RDSUY0ICAgICAgIC8qITwgQ2hhbm5lbCA0IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ0hUSUY0ICAgICAgICAgICAgICAgIERNQV9JRkNSX0NIVElGNCAgICAgICAvKiE8IENoYW5uZWwgNCBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NURUlGNCAgICAgICAgICAgICAgICBETUFfSUZDUl9DVEVJRjQgICAgICAgLyohPCBDaGFubmVsIDQgdHJhbnNmZXIgZXJyb3IgZmxhZyAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DR0lGNSAgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ0dJRjUgICAgICAgIC8qITwgQ2hhbm5lbCA1IGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ1RDSUY1ICAgICAgICAgICAgICAgIERNQV9JRkNSX0NUQ0lGNSAgICAgICAvKiE8IENoYW5uZWwgNSB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NIVElGNSAgICAgICAgICAgICAgICBETUFfSUZDUl9DSFRJRjUgICAgICAgLyohPCBDaGFubmVsIDUgaGFsZiB0cmFuc2ZlciBmbGFnICAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DVEVJRjUgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ1RFSUY1ICAgICAgIC8qITwgQ2hhbm5lbCA1IHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ0dJRjYgICAgICAgICAgICAgICAgIERNQV9JRkNSX0NHSUY2ICAgICAgICAvKiE8IENoYW5uZWwgNiBnbG9iYWwgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NUQ0lGNiAgICAgICAgICAgICAgICBETUFfSUZDUl9DVENJRjYgICAgICAgLyohPCBDaGFubmVsIDYgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DSFRJRjYgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ0hUSUY2ICAgICAgIC8qITwgQ2hhbm5lbCA2IGhhbGYgdHJhbnNmZXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ1RFSUY2ICAgICAgICAgICAgICAgIERNQV9JRkNSX0NURUlGNiAgICAgICAvKiE8IENoYW5uZWwgNiB0cmFuc2ZlciBlcnJvciBmbGFnICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NHSUY3ICAgICAgICAgICAgICAgICBETUFfSUZDUl9DR0lGNyAgICAgICAgLyohPCBDaGFubmVsIDcgZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DVENJRjcgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ1RDSUY3ICAgICAgIC8qITwgQ2hhbm5lbCA3IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ0hUSUY3ICAgICAgICAgICAgICAgIERNQV9JRkNSX0NIVElGNyAgICAgICAvKiE8IENoYW5uZWwgNyBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NURUlGNyAgICAgICAgICAgICAgICBETUFfSUZDUl9DVEVJRjcgICAgICAgLyohPCBDaGFubmVsIDcgdHJhbnNmZXIgZXJyb3IgZmxhZyAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfTExfRUNfR0VUX0ZMQUcgR2V0IEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0RNQV9SZWFkUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9HSUYxICAgICAgICAgICAgICAgICAgIERNQV9JU1JfR0lGMSAgICAgICAgICAvKiE8IENoYW5uZWwgMSBnbG9iYWwgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfVENJRjEgICAgICAgICAgICAgICAgICBETUFfSVNSX1RDSUYxICAgICAgICAgLyohPCBDaGFubmVsIDEgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9ETUFfSVNSX0hUSUYxICAgICAgICAgICAgICAgICAgRE1BX0lTUl9IVElGMSAgICAgICAgIC8qITwgQ2hhbm5lbCAxIGhhbGYgdHJhbnNmZXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9URUlGMSAgICAgICAgICAgICAgICAgIERNQV9JU1JfVEVJRjEgICAgICAgICAvKiE8IENoYW5uZWwgMSB0cmFuc2ZlciBlcnJvciBmbGFnICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfR0lGMiAgICAgICAgICAgICAgICAgICBETUFfSVNSX0dJRjIgICAgICAgICAgLyohPCBDaGFubmVsIDIgZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX1RDSUYyICAgICAgICAgICAgICAgICAgRE1BX0lTUl9UQ0lGMiAgICAgICAgIC8qITwgQ2hhbm5lbCAyIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9IVElGMiAgICAgICAgICAgICAgICAgIERNQV9JU1JfSFRJRjIgICAgICAgICAvKiE8IENoYW5uZWwgMiBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfVEVJRjIgICAgICAgICAgICAgICAgICBETUFfSVNSX1RFSUYyICAgICAgICAgLyohPCBDaGFubmVsIDIgdHJhbnNmZXIgZXJyb3IgZmxhZyAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX0dJRjMgICAgICAgICAgICAgICAgICAgRE1BX0lTUl9HSUYzICAgICAgICAgIC8qITwgQ2hhbm5lbCAzIGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9UQ0lGMyAgICAgICAgICAgICAgICAgIERNQV9JU1JfVENJRjMgICAgICAgICAvKiE8IENoYW5uZWwgMyB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisjZGVmaW5lIExMX0RNQV9JU1JfSFRJRjMgICAgICAgICAgICAgICAgICBETUFfSVNSX0hUSUYzICAgICAgICAgLyohPCBDaGFubmVsIDMgaGFsZiB0cmFuc2ZlciBmbGFnICAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX1RFSUYzICAgICAgICAgICAgICAgICAgRE1BX0lTUl9URUlGMyAgICAgICAgIC8qITwgQ2hhbm5lbCAzIHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9HSUY0ICAgICAgICAgICAgICAgICAgIERNQV9JU1JfR0lGNCAgICAgICAgICAvKiE8IENoYW5uZWwgNCBnbG9iYWwgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfVENJRjQgICAgICAgICAgICAgICAgICBETUFfSVNSX1RDSUY0ICAgICAgICAgLyohPCBDaGFubmVsIDQgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9ETUFfSVNSX0hUSUY0ICAgICAgICAgICAgICAgICAgRE1BX0lTUl9IVElGNCAgICAgICAgIC8qITwgQ2hhbm5lbCA0IGhhbGYgdHJhbnNmZXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9URUlGNCAgICAgICAgICAgICAgICAgIERNQV9JU1JfVEVJRjQgICAgICAgICAvKiE8IENoYW5uZWwgNCB0cmFuc2ZlciBlcnJvciBmbGFnICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfR0lGNSAgICAgICAgICAgICAgICAgICBETUFfSVNSX0dJRjUgICAgICAgICAgLyohPCBDaGFubmVsIDUgZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX1RDSUY1ICAgICAgICAgICAgICAgICAgRE1BX0lTUl9UQ0lGNSAgICAgICAgIC8qITwgQ2hhbm5lbCA1IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9IVElGNSAgICAgICAgICAgICAgICAgIERNQV9JU1JfSFRJRjUgICAgICAgICAvKiE8IENoYW5uZWwgNSBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfVEVJRjUgICAgICAgICAgICAgICAgICBETUFfSVNSX1RFSUY1ICAgICAgICAgLyohPCBDaGFubmVsIDUgdHJhbnNmZXIgZXJyb3IgZmxhZyAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX0dJRjYgICAgICAgICAgICAgICAgICAgRE1BX0lTUl9HSUY2ICAgICAgICAgIC8qITwgQ2hhbm5lbCA2IGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9UQ0lGNiAgICAgICAgICAgICAgICAgIERNQV9JU1JfVENJRjYgICAgICAgICAvKiE8IENoYW5uZWwgNiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisjZGVmaW5lIExMX0RNQV9JU1JfSFRJRjYgICAgICAgICAgICAgICAgICBETUFfSVNSX0hUSUY2ICAgICAgICAgLyohPCBDaGFubmVsIDYgaGFsZiB0cmFuc2ZlciBmbGFnICAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX1RFSUY2ICAgICAgICAgICAgICAgICAgRE1BX0lTUl9URUlGNiAgICAgICAgIC8qITwgQ2hhbm5lbCA2IHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9HSUY3ICAgICAgICAgICAgICAgICAgIERNQV9JU1JfR0lGNyAgICAgICAgICAvKiE8IENoYW5uZWwgNyBnbG9iYWwgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfVENJRjcgICAgICAgICAgICAgICAgICBETUFfSVNSX1RDSUY3ICAgICAgICAgLyohPCBDaGFubmVsIDcgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9ETUFfSVNSX0hUSUY3ICAgICAgICAgICAgICAgICAgRE1BX0lTUl9IVElGNyAgICAgICAgIC8qITwgQ2hhbm5lbCA3IGhhbGYgdHJhbnNmZXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9URUlGNyAgICAgICAgICAgICAgICAgIERNQV9JU1JfVEVJRjcgICAgICAgICAvKiE8IENoYW5uZWwgNyB0cmFuc2ZlciBlcnJvciBmbGFnICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9MTF9FQ19JVCBJVCBEZWZpbmVzCisgICogQGJyaWVmICAgIElUIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9ETUFfUmVhZFJlZyBhbmQgIExMX0RNQV9Xcml0ZVJlZyBmdW5jdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9ETUFfQ0NSX1RDSUUgICAgICAgICAgICAgICAgICAgRE1BX0NDUl9UQ0lFICAgICAgICAgIC8qITwgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0ICovCisjZGVmaW5lIExMX0RNQV9DQ1JfSFRJRSAgICAgICAgICAgICAgICAgICBETUFfQ0NSX0hUSUUgICAgICAgICAgLyohPCBIYWxmIFRyYW5zZmVyIGludGVycnVwdCAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0NDUl9URUlFICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfVEVJRSAgICAgICAgICAvKiE8IFRyYW5zZmVyIGVycm9yIGludGVycnVwdCAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfTExfRUNfQ0hBTk5FTCBDSEFOTkVMCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRE1BX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVIC8qITwgRE1BIENoYW5uZWwgMSAqLworI2RlZmluZSBMTF9ETUFfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlUgLyohPCBETUEgQ2hhbm5lbCAyICovCisjZGVmaW5lIExMX0RNQV9DSEFOTkVMXzMgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzVSAvKiE8IERNQSBDaGFubmVsIDMgKi8KKyNkZWZpbmUgTExfRE1BX0NIQU5ORUxfNCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVIC8qITwgRE1BIENoYW5uZWwgNCAqLworI2RlZmluZSBMTF9ETUFfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNVUgLyohPCBETUEgQ2hhbm5lbCA1ICovCisjZGVmaW5lIExMX0RNQV9DSEFOTkVMXzYgICAgICAgICAgICAgICAgICAweDAwMDAwMDA2VSAvKiE8IERNQSBDaGFubmVsIDYgKi8KKyNkZWZpbmUgTExfRE1BX0NIQU5ORUxfNyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDdVIC8qITwgRE1BIENoYW5uZWwgNyAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorI2RlZmluZSBMTF9ETUFfQ0hBTk5FTF9BTEwgICAgICAgICAgICAgICAgMHhGRkZGMDAwMFUgLyohPCBETUEgQ2hhbm5lbCBhbGwgKHVzZWQgb25seSBmb3IgZnVuY3Rpb24gQHJlZiBMTF9ETUFfRGVJbml0KCkuICovCisjZW5kaWYgLypVU0VfRlVMTF9MTF9EUklWRVIqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfTExfRUNfRElSRUNUSU9OIFRyYW5zZmVyIERpcmVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RNQV9ESVJFQ1RJT05fUEVSSVBIX1RPX01FTU9SWSAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IFBlcmlwaGVyYWwgdG8gbWVtb3J5IGRpcmVjdGlvbiAqLworI2RlZmluZSBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19QRVJJUEggRE1BX0NDUl9ESVIgICAgICAgICAgICAgLyohPCBNZW1vcnkgdG8gcGVyaXBoZXJhbCBkaXJlY3Rpb24gKi8KKyNkZWZpbmUgTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fTUVNT1JZIERNQV9DQ1JfTUVNMk1FTSAgICAgICAgIC8qITwgTWVtb3J5IHRvIG1lbW9yeSBkaXJlY3Rpb24gICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9MTF9FQ19NT0RFIFRyYW5zZmVyIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9ETUFfTU9ERV9OT1JNQUwgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBOb3JtYWwgTW9kZSAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9NT0RFX0NJUkNVTEFSICAgICAgICAgICAgICBETUFfQ0NSX0NJUkMgICAgICAgICAgICAvKiE8IENpcmN1bGFyIE1vZGUgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VDX1BFUklQSCBQZXJpcGhlcmFsIGluY3JlbWVudCBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRE1BX1BFUklQSF9JTkNSRU1FTlQgICAgICAgICAgIERNQV9DQ1JfUElOQyAgICAgICAgICAgIC8qITwgUGVyaXBoZXJhbCBpbmNyZW1lbnQgbW9kZSBFbmFibGUgKi8KKyNkZWZpbmUgTExfRE1BX1BFUklQSF9OT0lOQ1JFTUVOVCAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgUGVyaXBoZXJhbCBpbmNyZW1lbnQgbW9kZSBEaXNhYmxlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9MTF9FQ19NRU1PUlkgTWVtb3J5IGluY3JlbWVudCBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRE1BX01FTU9SWV9JTkNSRU1FTlQgICAgICAgICAgIERNQV9DQ1JfTUlOQyAgICAgICAgICAgIC8qITwgTWVtb3J5IGluY3JlbWVudCBtb2RlIEVuYWJsZSAgKi8KKyNkZWZpbmUgTExfRE1BX01FTU9SWV9OT0lOQ1JFTUVOVCAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgTWVtb3J5IGluY3JlbWVudCBtb2RlIERpc2FibGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VDX1BEQVRBQUxJR04gUGVyaXBoZXJhbCBkYXRhIGFsaWdubWVudAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RNQV9QREFUQUFMSUdOX0JZVEUgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IFBlcmlwaGVyYWwgZGF0YSBhbGlnbm1lbnQgOiBCeXRlICAgICAqLworI2RlZmluZSBMTF9ETUFfUERBVEFBTElHTl9IQUxGV09SRCAgICAgICAgRE1BX0NDUl9QU0laRV8wICAgICAgICAgLyohPCBQZXJpcGhlcmFsIGRhdGEgYWxpZ25tZW50IDogSGFsZldvcmQgKi8KKyNkZWZpbmUgTExfRE1BX1BEQVRBQUxJR05fV09SRCAgICAgICAgICAgIERNQV9DQ1JfUFNJWkVfMSAgICAgICAgIC8qITwgUGVyaXBoZXJhbCBkYXRhIGFsaWdubWVudCA6IFdvcmQgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9MTF9FQ19NREFUQUFMSUdOIE1lbW9yeSBkYXRhIGFsaWdubWVudAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RNQV9NREFUQUFMSUdOX0JZVEUgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IE1lbW9yeSBkYXRhIGFsaWdubWVudCA6IEJ5dGUgICAgICovCisjZGVmaW5lIExMX0RNQV9NREFUQUFMSUdOX0hBTEZXT1JEICAgICAgICBETUFfQ0NSX01TSVpFXzAgICAgICAgICAvKiE8IE1lbW9yeSBkYXRhIGFsaWdubWVudCA6IEhhbGZXb3JkICovCisjZGVmaW5lIExMX0RNQV9NREFUQUFMSUdOX1dPUkQgICAgICAgICAgICBETUFfQ0NSX01TSVpFXzEgICAgICAgICAvKiE8IE1lbW9yeSBkYXRhIGFsaWdubWVudCA6IFdvcmQgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9MTF9FQ19QUklPUklUWSBUcmFuc2ZlciBQcmlvcml0eSBsZXZlbAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RNQV9QUklPUklUWV9MT1cgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IFByaW9yaXR5IGxldmVsIDogTG93ICAgICAgICovCisjZGVmaW5lIExMX0RNQV9QUklPUklUWV9NRURJVU0gICAgICAgICAgICBETUFfQ0NSX1BMXzAgICAgICAgICAgICAvKiE8IFByaW9yaXR5IGxldmVsIDogTWVkaXVtICAgICovCisjZGVmaW5lIExMX0RNQV9QUklPUklUWV9ISUdIICAgICAgICAgICAgICBETUFfQ0NSX1BMXzEgICAgICAgICAgICAvKiE8IFByaW9yaXR5IGxldmVsIDogSGlnaCAgICAgICovCisjZGVmaW5lIExMX0RNQV9QUklPUklUWV9WRVJZSElHSCAgICAgICAgICBETUFfQ0NSX1BMICAgICAgICAgICAgICAvKiE8IFByaW9yaXR5IGxldmVsIDogVmVyeV9IaWdoICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIERNQV9MTF9FeHBvcnRlZF9NYWNyb3MgRE1BIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBtYWNyb3MKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIERNQSByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIERNQSBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuCisgICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgTExfRE1BX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gRE1BIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gRE1BIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX0RNQV9SZWFkUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXykgUkVBRF9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfTExfRU1fQ09OVkVSVF9ETUF4Q0hBTk5FTHkgQ29udmVydCBETUF4Q2hhbm5lbHkKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBDb252ZXJ0IERNQXhfQ2hhbm5lbHkgaW50byBETUF4CisgICogQHBhcmFtICBfX0NIQU5ORUxfSU5TVEFOQ0VfXyBETUF4X0NoYW5uZWx5CisgICogQHJldHZhbCBETUF4CisgICovCisjaWYgZGVmaW5lZChETUEyKQorI2RlZmluZSBfX0xMX0RNQV9HRVRfSU5TVEFOQ0UoX19DSEFOTkVMX0lOU1RBTkNFX18pICAgXAorKCgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA+ICgodWludDMyX3QpRE1BMV9DaGFubmVsNykpID8gIERNQTIgOiBETUExKQorI2Vsc2UKKyNkZWZpbmUgX19MTF9ETUFfR0VUX0lOU1RBTkNFKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSAgKERNQTEpCisjZW5kaWYKKworLyoqCisgICogQGJyaWVmICBDb252ZXJ0IERNQXhfQ2hhbm5lbHkgaW50byBMTF9ETUFfQ0hBTk5FTF95CisgICogQHBhcmFtICBfX0NIQU5ORUxfSU5TVEFOQ0VfXyBETUF4X0NoYW5uZWx5CisgICogQHJldHZhbCBMTF9ETUFfQ0hBTk5FTF95CisgICovCisjaWYgZGVmaW5lZCAoRE1BMikKKyNpZiBkZWZpbmVkIChETUEyX0NoYW5uZWw2KSAmJiBkZWZpbmVkIChETUEyX0NoYW5uZWw3KQorI2RlZmluZSBfX0xMX0RNQV9HRVRfQ0hBTk5FTChfX0NIQU5ORUxfSU5TVEFOQ0VfXykgICBcCisoKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMSkpID8gTExfRE1BX0NIQU5ORUxfMSA6IFwKKyAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwxKSkgPyBMTF9ETUFfQ0hBTk5FTF8xIDogXAorICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIpKSA/IExMX0RNQV9DSEFOTkVMXzIgOiBcCisgKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsMikpID8gTExfRE1BX0NIQU5ORUxfMiA6IFwKKyAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwzKSkgPyBMTF9ETUFfQ0hBTk5FTF8zIDogXAorICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDMpKSA/IExMX0RNQV9DSEFOTkVMXzMgOiBcCisgKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNCkpID8gTExfRE1BX0NIQU5ORUxfNCA6IFwKKyAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw0KSkgPyBMTF9ETUFfQ0hBTk5FTF80IDogXAorICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDUpKSA/IExMX0RNQV9DSEFOTkVMXzUgOiBcCisgKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsNSkpID8gTExfRE1BX0NIQU5ORUxfNSA6IFwKKyAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw2KSkgPyBMTF9ETUFfQ0hBTk5FTF82IDogXAorICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDYpKSA/IExMX0RNQV9DSEFOTkVMXzYgOiBcCisgTExfRE1BX0NIQU5ORUxfNykKKyNlbHNlCisjZGVmaW5lIF9fTExfRE1BX0dFVF9DSEFOTkVMKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSAgIFwKKygoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwxKSkgPyBMTF9ETUFfQ0hBTk5FTF8xIDogXAorICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDEpKSA/IExMX0RNQV9DSEFOTkVMXzEgOiBcCisgKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMikpID8gTExfRE1BX0NIQU5ORUxfMiA6IFwKKyAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwyKSkgPyBMTF9ETUFfQ0hBTk5FTF8yIDogXAorICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDMpKSA/IExMX0RNQV9DSEFOTkVMXzMgOiBcCisgKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsMykpID8gTExfRE1BX0NIQU5ORUxfMyA6IFwKKyAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw0KSkgPyBMTF9ETUFfQ0hBTk5FTF80IDogXAorICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDQpKSA/IExMX0RNQV9DSEFOTkVMXzQgOiBcCisgKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNSkpID8gTExfRE1BX0NIQU5ORUxfNSA6IFwKKyAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw1KSkgPyBMTF9ETUFfQ0hBTk5FTF81IDogXAorICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDYpKSA/IExMX0RNQV9DSEFOTkVMXzYgOiBcCisgTExfRE1BX0NIQU5ORUxfNykKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgX19MTF9ETUFfR0VUX0NIQU5ORUwoX19DSEFOTkVMX0lOU1RBTkNFX18pICAgXAorKCgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDEpKSA/IExMX0RNQV9DSEFOTkVMXzEgOiBcCisgKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMikpID8gTExfRE1BX0NIQU5ORUxfMiA6IFwKKyAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwzKSkgPyBMTF9ETUFfQ0hBTk5FTF8zIDogXAorICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDQpKSA/IExMX0RNQV9DSEFOTkVMXzQgOiBcCisgKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNSkpID8gTExfRE1BX0NIQU5ORUxfNSA6IFwKKyAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw2KSkgPyBMTF9ETUFfQ0hBTk5FTF82IDogXAorIExMX0RNQV9DSEFOTkVMXzcpCisjZW5kaWYKKworLyoqCisgICogQGJyaWVmICBDb252ZXJ0IERNQSBJbnN0YW5jZSBETUF4IGFuZCBMTF9ETUFfQ0hBTk5FTF95IGludG8gRE1BeF9DaGFubmVseQorICAqIEBwYXJhbSAgX19ETUFfSU5TVEFOQ0VfXyBETUF4CisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBMTF9ETUFfQ0hBTk5FTF95CisgICogQHJldHZhbCBETUF4X0NoYW5uZWx5CisgICovCisjaWYgZGVmaW5lZCAoRE1BMikKKyNpZiBkZWZpbmVkIChETUEyX0NoYW5uZWw2KSAmJiBkZWZpbmVkIChETUEyX0NoYW5uZWw3KQorI2RlZmluZSBfX0xMX0RNQV9HRVRfQ0hBTk5FTF9JTlNUQU5DRShfX0RNQV9JTlNUQU5DRV9fLCBfX0NIQU5ORUxfXykgICBcCisoKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzEpKSkgPyBETUExX0NoYW5uZWwxIDogXAorICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTIpKSAmJiAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF8xKSkpID8gRE1BMl9DaGFubmVsMSA6IFwKKyAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExKSkgJiYgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfMikpKSA/IERNQTFfQ2hhbm5lbDIgOiBcCisgKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMikpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzIpKSkgPyBETUEyX0NoYW5uZWwyIDogXAorICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTEpKSAmJiAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF8zKSkpID8gRE1BMV9DaGFubmVsMyA6IFwKKyAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyKSkgJiYgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfMykpKSA/IERNQTJfQ2hhbm5lbDMgOiBcCisgKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzQpKSkgPyBETUExX0NoYW5uZWw0IDogXAorICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTIpKSAmJiAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF80KSkpID8gRE1BMl9DaGFubmVsNCA6IFwKKyAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExKSkgJiYgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfNSkpKSA/IERNQTFfQ2hhbm5lbDUgOiBcCisgKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMikpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzUpKSkgPyBETUEyX0NoYW5uZWw1IDogXAorICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTEpKSAmJiAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF82KSkpID8gRE1BMV9DaGFubmVsNiA6IFwKKyAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyKSkgJiYgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfNikpKSA/IERNQTJfQ2hhbm5lbDYgOiBcCisgKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzcpKSkgPyBETUExX0NoYW5uZWw3IDogXAorIERNQTJfQ2hhbm5lbDcpCisjZWxzZQorI2RlZmluZSBfX0xMX0RNQV9HRVRfQ0hBTk5FTF9JTlNUQU5DRShfX0RNQV9JTlNUQU5DRV9fLCBfX0NIQU5ORUxfXykgICBcCisoKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzEpKSkgPyBETUExX0NoYW5uZWwxIDogXAorICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTIpKSAmJiAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF8xKSkpID8gRE1BMl9DaGFubmVsMSA6IFwKKyAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExKSkgJiYgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfMikpKSA/IERNQTFfQ2hhbm5lbDIgOiBcCisgKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMikpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzIpKSkgPyBETUEyX0NoYW5uZWwyIDogXAorICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTEpKSAmJiAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF8zKSkpID8gRE1BMV9DaGFubmVsMyA6IFwKKyAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyKSkgJiYgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfMykpKSA/IERNQTJfQ2hhbm5lbDMgOiBcCisgKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzQpKSkgPyBETUExX0NoYW5uZWw0IDogXAorICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTIpKSAmJiAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF80KSkpID8gRE1BMl9DaGFubmVsNCA6IFwKKyAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExKSkgJiYgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfNSkpKSA/IERNQTFfQ2hhbm5lbDUgOiBcCisgKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMikpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzUpKSkgPyBETUEyX0NoYW5uZWw1IDogXAorICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTEpKSAmJiAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF82KSkpID8gRE1BMV9DaGFubmVsNiA6IFwKKyBETUExX0NoYW5uZWw3KQorI2VuZGlmCisjZWxzZQorI2RlZmluZSBfX0xMX0RNQV9HRVRfQ0hBTk5FTF9JTlNUQU5DRShfX0RNQV9JTlNUQU5DRV9fLCBfX0NIQU5ORUxfXykgICBcCisoKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzEpKSkgPyBETUExX0NoYW5uZWwxIDogXAorICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTEpKSAmJiAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF8yKSkpID8gRE1BMV9DaGFubmVsMiA6IFwKKyAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExKSkgJiYgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfMykpKSA/IERNQTFfQ2hhbm5lbDMgOiBcCisgKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzQpKSkgPyBETUExX0NoYW5uZWw0IDogXAorICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTEpKSAmJiAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF81KSkpID8gRE1BMV9DaGFubmVsNSA6IFwKKyAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExKSkgJiYgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfNikpKSA/IERNQTFfQ2hhbm5lbDYgOiBcCisgRE1BMV9DaGFubmVsNykKKyNlbmRpZgorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBETUFfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIERNQSBFeHBvcnRlZCBGdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBETUFfTExfRUZfQ29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERNQSBjaGFubmVsLgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIEVOICAgICAgICAgICAgTExfRE1BX0VuYWJsZUNoYW5uZWwKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9FbmFibGVDaGFubmVsKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKQoreworICBTRVRfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUF4ICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKSktPkNDUiwgRE1BX0NDUl9FTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBETUEgY2hhbm5lbC4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBFTiAgICAgICAgICAgIExMX0RNQV9EaXNhYmxlQ2hhbm5lbAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0Rpc2FibGVDaGFubmVsKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKQoreworICBDTEVBUl9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQXggKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpKS0+Q0NSLCBETUFfQ0NSX0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBETUEgY2hhbm5lbCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIEVOICAgICAgICAgICAgTExfRE1BX0lzRW5hYmxlZENoYW5uZWwKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNFbmFibGVkQ2hhbm5lbChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DQ1IsCisgICAgICAgICAgICAgICAgICAgRE1BX0NDUl9FTikgPT0gKERNQV9DQ1JfRU4pKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgYWxsIHBhcmFtZXRlcnMgbGluayB0byBETUEgdHJhbnNmZXIuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgRElSICAgICAgICAgICBMTF9ETUFfQ29uZmlnVHJhbnNmZXJcbgorICAqICAgICAgICAgQ0NSICAgICAgICAgIE1FTTJNRU0gICAgICAgTExfRE1BX0NvbmZpZ1RyYW5zZmVyXG4KKyAgKiAgICAgICAgIENDUiAgICAgICAgICBDSVJDICAgICAgICAgIExMX0RNQV9Db25maWdUcmFuc2ZlclxuCisgICogICAgICAgICBDQ1IgICAgICAgICAgUElOQyAgICAgICAgICBMTF9ETUFfQ29uZmlnVHJhbnNmZXJcbgorICAqICAgICAgICAgQ0NSICAgICAgICAgIE1JTkMgICAgICAgICAgTExfRE1BX0NvbmZpZ1RyYW5zZmVyXG4KKyAgKiAgICAgICAgIENDUiAgICAgICAgICBQU0laRSAgICAgICAgIExMX0RNQV9Db25maWdUcmFuc2ZlclxuCisgICogICAgICAgICBDQ1IgICAgICAgICAgTVNJWkUgICAgICAgICBMTF9ETUFfQ29uZmlnVHJhbnNmZXJcbgorICAqICAgICAgICAgQ0NSICAgICAgICAgIFBMICAgICAgICAgICAgTExfRE1BX0NvbmZpZ1RyYW5zZmVyCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHBhcmFtICBDb25maWd1cmF0aW9uIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBjb21iaW5hdGlvbiBvZiBhbGwgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0RJUkVDVElPTl9QRVJJUEhfVE9fTUVNT1JZIG9yIEByZWYgTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fUEVSSVBIIG9yIEByZWYgTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fTUVNT1JZCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01PREVfTk9STUFMIG9yIEByZWYgTExfRE1BX01PREVfQ0lSQ1VMQVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUEVSSVBIX0lOQ1JFTUVOVCBvciBAcmVmIExMX0RNQV9QRVJJUEhfTk9JTkNSRU1FTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTUVNT1JZX0lOQ1JFTUVOVCBvciBAcmVmIExMX0RNQV9NRU1PUllfTk9JTkNSRU1FTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUERBVEFBTElHTl9CWVRFIG9yIEByZWYgTExfRE1BX1BEQVRBQUxJR05fSEFMRldPUkQgb3IgQHJlZiBMTF9ETUFfUERBVEFBTElHTl9XT1JECisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01EQVRBQUxJR05fQllURSBvciBAcmVmIExMX0RNQV9NREFUQUFMSUdOX0hBTEZXT1JEIG9yIEByZWYgTExfRE1BX01EQVRBQUxJR05fV09SRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QUklPUklUWV9MT1cgb3IgQHJlZiBMTF9ETUFfUFJJT1JJVFlfTUVESVVNIG9yIEByZWYgTExfRE1BX1BSSU9SSVRZX0hJR0ggb3IgQHJlZiBMTF9ETUFfUFJJT1JJVFlfVkVSWUhJR0gKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9Db25maWdUcmFuc2ZlcihETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgQ29uZmlndXJhdGlvbikKK3sKKyAgTU9ESUZZX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DQ1IsCisgICAgICAgICAgICAgRE1BX0NDUl9ESVIgfCBETUFfQ0NSX01FTTJNRU0gfCBETUFfQ0NSX0NJUkMgfCBETUFfQ0NSX1BJTkMgfCBETUFfQ0NSX01JTkMgfCBETUFfQ0NSX1BTSVpFIHwgRE1BX0NDUl9NU0laRSB8IERNQV9DQ1JfUEwsCisgICAgICAgICAgICAgQ29uZmlndXJhdGlvbik7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IERhdGEgdHJhbnNmZXIgZGlyZWN0aW9uIChyZWFkIGZyb20gcGVyaXBoZXJhbCBvciBmcm9tIG1lbW9yeSkuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgRElSICAgICAgICAgICBMTF9ETUFfU2V0RGF0YVRyYW5zZmVyRGlyZWN0aW9uXG4KKyAgKiAgICAgICAgIENDUiAgICAgICAgICBNRU0yTUVNICAgICAgIExMX0RNQV9TZXREYXRhVHJhbnNmZXJEaXJlY3Rpb24KKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcGFyYW0gIERpcmVjdGlvbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9ESVJFQ1RJT05fUEVSSVBIX1RPX01FTU9SWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX1BFUklQSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX01FTU9SWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldERhdGFUcmFuc2ZlckRpcmVjdGlvbihETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgRGlyZWN0aW9uKQoreworICBNT0RJRllfUkVHKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUF4ICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKSktPkNDUiwKKyAgICAgICAgICAgICBETUFfQ0NSX0RJUiB8IERNQV9DQ1JfTUVNMk1FTSwgRGlyZWN0aW9uKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgRGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24gKHJlYWQgZnJvbSBwZXJpcGhlcmFsIG9yIGZyb20gbWVtb3J5KS4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBESVIgICAgICAgICAgIExMX0RNQV9HZXREYXRhVHJhbnNmZXJEaXJlY3Rpb25cbgorICAqICAgICAgICAgQ0NSICAgICAgICAgIE1FTTJNRU0gICAgICAgTExfRE1BX0dldERhdGFUcmFuc2ZlckRpcmVjdGlvbgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfRElSRUNUSU9OX1BFUklQSF9UT19NRU1PUlkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19QRVJJUEgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19NRU1PUlkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0RGF0YVRyYW5zZmVyRGlyZWN0aW9uKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZXR1cm4gKFJFQURfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUF4ICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKSktPkNDUiwKKyAgICAgICAgICAgICAgICAgICBETUFfQ0NSX0RJUiB8IERNQV9DQ1JfTUVNMk1FTSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBETUEgbW9kZSBjaXJjdWxhciBvciBub3JtYWwuCisgICogQG5vdGUgVGhlIGNpcmN1bGFyIGJ1ZmZlciBtb2RlIGNhbm5vdCBiZSB1c2VkIGlmIHRoZSBtZW1vcnktdG8tbWVtb3J5CisgICogZGF0YSB0cmFuc2ZlciBpcyBjb25maWd1cmVkIG9uIHRoZSBzZWxlY3RlZCBDaGFubmVsLgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIENJUkMgICAgICAgICAgTExfRE1BX1NldE1vZGUKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcGFyYW0gIE1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTU9ERV9OT1JNQUwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTU9ERV9DSVJDVUxBUgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldE1vZGUoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IE1vZGUpCit7CisgIE1PRElGWV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQXggKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpKS0+Q0NSLCBETUFfQ0NSX0NJUkMsCisgICAgICAgICAgICAgTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IERNQSBtb2RlIGNpcmN1bGFyIG9yIG5vcm1hbC4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBDSVJDICAgICAgICAgIExMX0RNQV9HZXRNb2RlCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NT0RFX05PUk1BTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NT0RFX0NJUkNVTEFSCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0dldE1vZGUoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJldHVybiAoUkVBRF9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQXggKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpKS0+Q0NSLAorICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfQ0lSQykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBQZXJpcGhlcmFsIGluY3JlbWVudCBtb2RlLgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIFBJTkMgICAgICAgICAgTExfRE1BX1NldFBlcmlwaEluY01vZGUKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcGFyYW0gIFBlcmlwaE9yTTJNU3JjSW5jTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QRVJJUEhfSU5DUkVNRU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BFUklQSF9OT0lOQ1JFTUVOVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldFBlcmlwaEluY01vZGUoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IFBlcmlwaE9yTTJNU3JjSW5jTW9kZSkKK3sKKyAgTU9ESUZZX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DQ1IsIERNQV9DQ1JfUElOQywKKyAgICAgICAgICAgICBQZXJpcGhPck0yTVNyY0luY01vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBQZXJpcGhlcmFsIGluY3JlbWVudCBtb2RlLgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIFBJTkMgICAgICAgICAgTExfRE1BX0dldFBlcmlwaEluY01vZGUKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BFUklQSF9JTkNSRU1FTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUEVSSVBIX05PSU5DUkVNRU5UCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0dldFBlcmlwaEluY01vZGUoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJldHVybiAoUkVBRF9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQXggKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpKS0+Q0NSLAorICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfUElOQykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBNZW1vcnkgaW5jcmVtZW50IG1vZGUuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgTUlOQyAgICAgICAgICBMTF9ETUFfU2V0TWVtb3J5SW5jTW9kZQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEBwYXJhbSAgTWVtb3J5T3JNMk1Ec3RJbmNNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01FTU9SWV9JTkNSRU1FTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTUVNT1JZX05PSU5DUkVNRU5UCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfU2V0TWVtb3J5SW5jTW9kZShETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgTWVtb3J5T3JNMk1Ec3RJbmNNb2RlKQoreworICBNT0RJRllfUkVHKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUF4ICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKSktPkNDUiwgRE1BX0NDUl9NSU5DLAorICAgICAgICAgICAgIE1lbW9yeU9yTTJNRHN0SW5jTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IE1lbW9yeSBpbmNyZW1lbnQgbW9kZS4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBNSU5DICAgICAgICAgIExMX0RNQV9HZXRNZW1vcnlJbmNNb2RlCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NRU1PUllfSU5DUkVNRU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01FTU9SWV9OT0lOQ1JFTUVOVAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9HZXRNZW1vcnlJbmNNb2RlKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZXR1cm4gKFJFQURfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUF4ICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKSktPkNDUiwKKyAgICAgICAgICAgICAgICAgICBETUFfQ0NSX01JTkMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgUGVyaXBoZXJhbCBzaXplLgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIFBTSVpFICAgICAgICAgTExfRE1BX1NldFBlcmlwaFNpemUKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcGFyYW0gIFBlcmlwaE9yTTJNU3JjRGF0YVNpemUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUERBVEFBTElHTl9CWVRFCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BEQVRBQUxJR05fSEFMRldPUkQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUERBVEFBTElHTl9XT1JECisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfU2V0UGVyaXBoU2l6ZShETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgUGVyaXBoT3JNMk1TcmNEYXRhU2l6ZSkKK3sKKyAgTU9ESUZZX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DQ1IsIERNQV9DQ1JfUFNJWkUsCisgICAgICAgICAgICAgUGVyaXBoT3JNMk1TcmNEYXRhU2l6ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFBlcmlwaGVyYWwgc2l6ZS4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBQU0laRSAgICAgICAgIExMX0RNQV9HZXRQZXJpcGhTaXplCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QREFUQUFMSUdOX0JZVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUERBVEFBTElHTl9IQUxGV09SRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QREFUQUFMSUdOX1dPUkQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0UGVyaXBoU2l6ZShETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DQ1IsCisgICAgICAgICAgICAgICAgICAgRE1BX0NDUl9QU0laRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBNZW1vcnkgc2l6ZS4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBNU0laRSAgICAgICAgIExMX0RNQV9TZXRNZW1vcnlTaXplCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHBhcmFtICBNZW1vcnlPck0yTURzdERhdGFTaXplIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01EQVRBQUxJR05fQllURQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NREFUQUFMSUdOX0hBTEZXT1JECisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01EQVRBQUxJR05fV09SRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldE1lbW9yeVNpemUoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IE1lbW9yeU9yTTJNRHN0RGF0YVNpemUpCit7CisgIE1PRElGWV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQXggKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpKS0+Q0NSLCBETUFfQ0NSX01TSVpFLAorICAgICAgICAgICAgIE1lbW9yeU9yTTJNRHN0RGF0YVNpemUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBNZW1vcnkgc2l6ZS4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBNU0laRSAgICAgICAgIExMX0RNQV9HZXRNZW1vcnlTaXplCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NREFUQUFMSUdOX0JZVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTURBVEFBTElHTl9IQUxGV09SRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NREFUQUFMSUdOX1dPUkQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0TWVtb3J5U2l6ZShETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DQ1IsCisgICAgICAgICAgICAgICAgICAgRE1BX0NDUl9NU0laRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBDaGFubmVsIHByaW9yaXR5IGxldmVsLgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIFBMICAgICAgICAgICAgTExfRE1BX1NldENoYW5uZWxQcmlvcml0eUxldmVsCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHBhcmFtICBQcmlvcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QUklPUklUWV9MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUFJJT1JJVFlfTUVESVVNCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BSSU9SSVRZX0hJR0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUFJJT1JJVFlfVkVSWUhJR0gKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9TZXRDaGFubmVsUHJpb3JpdHlMZXZlbChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgUHJpb3JpdHkpCit7CisgIE1PRElGWV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQXggKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpKS0+Q0NSLCBETUFfQ0NSX1BMLAorICAgICAgICAgICAgIFByaW9yaXR5KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCBwcmlvcml0eSBsZXZlbC4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBQTCAgICAgICAgICAgIExMX0RNQV9HZXRDaGFubmVsUHJpb3JpdHlMZXZlbAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUFJJT1JJVFlfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BSSU9SSVRZX01FRElVTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QUklPUklUWV9ISUdICisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BSSU9SSVRZX1ZFUllISUdICisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0dldENoYW5uZWxQcmlvcml0eUxldmVsKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZXR1cm4gKFJFQURfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUF4ICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKSktPkNDUiwKKyAgICAgICAgICAgICAgICAgICBETUFfQ0NSX1BMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IE51bWJlciBvZiBkYXRhIHRvIHRyYW5zZmVyLgorICAqIEBub3RlICAgVGhpcyBhY3Rpb24gaGFzIG5vIGVmZmVjdCBpZgorICAqICAgICAgICAgY2hhbm5lbCBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgQ05EVFIgICAgICAgIE5EVCAgICAgICAgICAgTExfRE1BX1NldERhdGFMZW5ndGgKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcGFyYW0gIE5iRGF0YSBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweDAwMDBGRkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfU2V0RGF0YUxlbmd0aChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgTmJEYXRhKQoreworICBNT0RJRllfUkVHKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUF4ICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKSktPkNORFRSLAorICAgICAgICAgICAgIERNQV9DTkRUUl9ORFQsIE5iRGF0YSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IE51bWJlciBvZiBkYXRhIHRvIHRyYW5zZmVyLgorICAqIEBub3RlICAgT25jZSB0aGUgY2hhbm5lbCBpcyBlbmFibGVkLCB0aGUgcmV0dXJuIHZhbHVlIGluZGljYXRlIHRoZQorICAqICAgICAgICAgcmVtYWluaW5nIGJ5dGVzIHRvIGJlIHRyYW5zbWl0dGVkLgorICAqIEBybXRvbGwgQ05EVFIgICAgICAgIE5EVCAgICAgICAgICAgTExfRE1BX0dldERhdGFMZW5ndGgKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIEJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRkZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0RGF0YUxlbmd0aChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DTkRUUiwKKyAgICAgICAgICAgICAgICAgICBETUFfQ05EVFJfTkRUKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBTb3VyY2UgYW5kIERlc3RpbmF0aW9uIGFkZHJlc3Nlcy4KKyAgKiBAbm90ZSAgIFRoaXMgQVBJIG11c3Qgbm90IGJlIGNhbGxlZCB3aGVuIHRoZSBETUEgY2hhbm5lbCBpcyBlbmFibGVkLgorICAqIEBub3RlICAgRWFjaCBJUCB1c2luZyBETUEgcHJvdmlkZXMgYW4gQVBJIHRvIGdldCBkaXJlY3RseSB0aGUgcmVnaXN0ZXIgYWRyZXNzIChMTF9QUFBfRE1BX0dldFJlZ0FkZHIpLgorICAqIEBybXRvbGwgQ1BBUiAgICAgICAgIFBBICAgICAgICAgICAgTExfRE1BX0NvbmZpZ0FkZHJlc3Nlc1xuCisgICogICAgICAgICBDTUFSICAgICAgICAgTUEgICAgICAgICAgICBMTF9ETUFfQ29uZmlnQWRkcmVzc2VzCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHBhcmFtICBTcmNBZGRyZXNzIEJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRkZGRkYKKyAgKiBAcGFyYW0gIERzdEFkZHJlc3MgQmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGRkZGRgorICAqIEBwYXJhbSAgRGlyZWN0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0RJUkVDVElPTl9QRVJJUEhfVE9fTUVNT1JZCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fUEVSSVBICisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fTUVNT1JZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ29uZmlnQWRkcmVzc2VzKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBTcmNBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBEc3RBZGRyZXNzLCB1aW50MzJfdCBEaXJlY3Rpb24pCit7CisgIC8qIERpcmVjdGlvbiBNZW1vcnkgdG8gUGVyaXBoICovCisgIGlmIChEaXJlY3Rpb24gPT0gTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fUEVSSVBIKQorICB7CisgICAgV1JJVEVfUkVHKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUF4ICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKSktPkNNQVIsIFNyY0FkZHJlc3MpOworICAgIFdSSVRFX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DUEFSLCBEc3RBZGRyZXNzKTsKKyAgfQorICAvKiBEaXJlY3Rpb24gUGVyaXBoIHRvIE1lbW9yeSBhbmQgTWVtb3J5IHRvIE1lbW9yeSAqLworICBlbHNlCisgIHsKKyAgICBXUklURV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQXggKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpKS0+Q1BBUiwgU3JjQWRkcmVzcyk7CisgICAgV1JJVEVfUkVHKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUF4ICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKSktPkNNQVIsIERzdEFkZHJlc3MpOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBNZW1vcnkgYWRkcmVzcy4KKyAgKiBAbm90ZSAgIEludGVyZmFjZSB1c2VkIGZvciBkaXJlY3Rpb24gTExfRE1BX0RJUkVDVElPTl9QRVJJUEhfVE9fTUVNT1JZIG9yIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX1BFUklQSCBvbmx5LgorICAqIEBub3RlICAgVGhpcyBBUEkgbXVzdCBub3QgYmUgY2FsbGVkIHdoZW4gdGhlIERNQSBjaGFubmVsIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBDTUFSICAgICAgICAgTUEgICAgICAgICAgICBMTF9ETUFfU2V0TWVtb3J5QWRkcmVzcworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEBwYXJhbSAgTWVtb3J5QWRkcmVzcyBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfU2V0TWVtb3J5QWRkcmVzcyhETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgTWVtb3J5QWRkcmVzcykKK3sKKyAgV1JJVEVfUkVHKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUF4ICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKSktPkNNQVIsIE1lbW9yeUFkZHJlc3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgUGVyaXBoZXJhbCBhZGRyZXNzLgorICAqIEBub3RlICAgSW50ZXJmYWNlIHVzZWQgZm9yIGRpcmVjdGlvbiBMTF9ETUFfRElSRUNUSU9OX1BFUklQSF9UT19NRU1PUlkgb3IgTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fUEVSSVBIIG9ubHkuCisgICogQG5vdGUgICBUaGlzIEFQSSBtdXN0IG5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgRE1BIGNoYW5uZWwgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIENQQVIgICAgICAgICBQQSAgICAgICAgICAgIExMX0RNQV9TZXRQZXJpcGhBZGRyZXNzCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHBhcmFtICBQZXJpcGhBZGRyZXNzIEJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRkZGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9TZXRQZXJpcGhBZGRyZXNzKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBQZXJpcGhBZGRyZXNzKQoreworICBXUklURV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQXggKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpKS0+Q1BBUiwgUGVyaXBoQWRkcmVzcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IE1lbW9yeSBhZGRyZXNzLgorICAqIEBub3RlICAgSW50ZXJmYWNlIHVzZWQgZm9yIGRpcmVjdGlvbiBMTF9ETUFfRElSRUNUSU9OX1BFUklQSF9UT19NRU1PUlkgb3IgTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fUEVSSVBIIG9ubHkuCisgICogQHJtdG9sbCBDTUFSICAgICAgICAgTUEgICAgICAgICAgICBMTF9ETUFfR2V0TWVtb3J5QWRkcmVzcworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgQmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGRkZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9HZXRNZW1vcnlBZGRyZXNzKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZXR1cm4gKFJFQURfUkVHKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUF4ICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKSktPkNNQVIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgUGVyaXBoZXJhbCBhZGRyZXNzLgorICAqIEBub3RlICAgSW50ZXJmYWNlIHVzZWQgZm9yIGRpcmVjdGlvbiBMTF9ETUFfRElSRUNUSU9OX1BFUklQSF9UT19NRU1PUlkgb3IgTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fUEVSSVBIIG9ubHkuCisgICogQHJtdG9sbCBDUEFSICAgICAgICAgUEEgICAgICAgICAgICBMTF9ETUFfR2V0UGVyaXBoQWRkcmVzcworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgQmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGRkZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9HZXRQZXJpcGhBZGRyZXNzKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZXR1cm4gKFJFQURfUkVHKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUF4ICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKSktPkNQQVIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIE1lbW9yeSB0byBNZW1vcnkgU291cmNlIGFkZHJlc3MuCisgICogQG5vdGUgICBJbnRlcmZhY2UgdXNlZCBmb3IgZGlyZWN0aW9uIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX01FTU9SWSBvbmx5LgorICAqIEBub3RlICAgVGhpcyBBUEkgbXVzdCBub3QgYmUgY2FsbGVkIHdoZW4gdGhlIERNQSBjaGFubmVsIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBDUEFSICAgICAgICAgUEEgICAgICAgICAgICBMTF9ETUFfU2V0TTJNU3JjQWRkcmVzcworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEBwYXJhbSAgTWVtb3J5QWRkcmVzcyBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfU2V0TTJNU3JjQWRkcmVzcyhETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgTWVtb3J5QWRkcmVzcykKK3sKKyAgV1JJVEVfUkVHKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUF4ICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKSktPkNQQVIsIE1lbW9yeUFkZHJlc3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgTWVtb3J5IHRvIE1lbW9yeSBEZXN0aW5hdGlvbiBhZGRyZXNzLgorICAqIEBub3RlICAgSW50ZXJmYWNlIHVzZWQgZm9yIGRpcmVjdGlvbiBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19NRU1PUlkgb25seS4KKyAgKiBAbm90ZSAgIFRoaXMgQVBJIG11c3Qgbm90IGJlIGNhbGxlZCB3aGVuIHRoZSBETUEgY2hhbm5lbCBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgQ01BUiAgICAgICAgIE1BICAgICAgICAgICAgTExfRE1BX1NldE0yTURzdEFkZHJlc3MKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcGFyYW0gIE1lbW9yeUFkZHJlc3MgQmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGRkZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldE0yTURzdEFkZHJlc3MoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IE1lbW9yeUFkZHJlc3MpCit7CisgIFdSSVRFX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DTUFSLCBNZW1vcnlBZGRyZXNzKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIE1lbW9yeSB0byBNZW1vcnkgU291cmNlIGFkZHJlc3MuCisgICogQG5vdGUgICBJbnRlcmZhY2UgdXNlZCBmb3IgZGlyZWN0aW9uIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX01FTU9SWSBvbmx5LgorICAqIEBybXRvbGwgQ1BBUiAgICAgICAgIFBBICAgICAgICAgICAgTExfRE1BX0dldE0yTVNyY0FkZHJlc3MKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIEJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRkZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0TTJNU3JjQWRkcmVzcyhETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmV0dXJuIChSRUFEX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DUEFSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBNZW1vcnkgdG8gTWVtb3J5IERlc3RpbmF0aW9uIGFkZHJlc3MuCisgICogQG5vdGUgICBJbnRlcmZhY2UgdXNlZCBmb3IgZGlyZWN0aW9uIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX01FTU9SWSBvbmx5LgorICAqIEBybXRvbGwgQ01BUiAgICAgICAgIE1BICAgICAgICAgICAgTExfRE1BX0dldE0yTURzdEFkZHJlc3MKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIEJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRkZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0TTJNRHN0QWRkcmVzcyhETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmV0dXJuIChSRUFEX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DTUFSKSk7Cit9CisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfTExfRUZfRkxBR19NYW5hZ2VtZW50IEZMQUdfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgMSBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgR0lGMSAgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJMQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTEoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX0dJRjEpID09IChETUFfSVNSX0dJRjEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCAyIGdsb2JhbCBpbnRlcnJ1cHQgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBHSUYyICAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfR0kyCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJMihETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfR0lGMikgPT0gKERNQV9JU1JfR0lGMikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDMgZ2xvYmFsIGludGVycnVwdCBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEdJRjMgICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTMKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfR0kzKERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9HSUYzKSA9PSAoRE1BX0lTUl9HSUYzKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgNCBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgR0lGNCAgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJNAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTQoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX0dJRjQpID09IChETUFfSVNSX0dJRjQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCA1IGdsb2JhbCBpbnRlcnJ1cHQgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBHSUY1ICAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfR0k1CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJNShETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfR0lGNSkgPT0gKERNQV9JU1JfR0lGNSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDYgZ2xvYmFsIGludGVycnVwdCBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEdJRjYgICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTYKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfR0k2KERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9HSUY2KSA9PSAoRE1BX0lTUl9HSUY2KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgNyBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgR0lGNyAgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJNworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTcoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX0dJRjcpID09IChETUFfSVNSX0dJRjcpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCAxIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVENJRjEgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDMQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzEoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RDSUYxKSA9PSAoRE1BX0lTUl9UQ0lGMSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDIgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUQ0lGMiAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEMyCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDMihETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfVENJRjIpID09IChETUFfSVNSX1RDSUYyKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgMyB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRDSUYzICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzMKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEMzKERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9UQ0lGMykgPT0gKERNQV9JU1JfVENJRjMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCA0IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVENJRjQgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDNAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzQoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RDSUY0KSA9PSAoRE1BX0lTUl9UQ0lGNCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDUgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUQ0lGNSAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEM1CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDNShETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfVENJRjUpID09IChETUFfSVNSX1RDSUY1KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgNiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRDSUY2ICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzYKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEM2KERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9UQ0lGNikgPT0gKERNQV9JU1JfVENJRjYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCA3IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVENJRjcgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDNworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzcoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RDSUY3KSA9PSAoRE1BX0lTUl9UQ0lGNykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDEgaGFsZiB0cmFuc2ZlciBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEhUSUYxICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDEKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQxKERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9IVElGMSkgPT0gKERNQV9JU1JfSFRJRjEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCAyIGhhbGYgdHJhbnNmZXIgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBIVElGMiAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQyCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX0hUMihETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfSFRJRjIpID09IChETUFfSVNSX0hUSUYyKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgMyBoYWxmIHRyYW5zZmVyIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgSFRJRjMgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX0hUMworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDMoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX0hUSUYzKSA9PSAoRE1BX0lTUl9IVElGMykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDQgaGFsZiB0cmFuc2ZlciBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEhUSUY0ICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDQKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQ0KERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9IVElGNCkgPT0gKERNQV9JU1JfSFRJRjQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCA1IGhhbGYgdHJhbnNmZXIgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBIVElGNSAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQ1CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX0hUNShETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfSFRJRjUpID09IChETUFfSVNSX0hUSUY1KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgNiBoYWxmIHRyYW5zZmVyIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgSFRJRjYgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX0hUNgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDYoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX0hUSUY2KSA9PSAoRE1BX0lTUl9IVElGNikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDcgaGFsZiB0cmFuc2ZlciBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEhUSUY3ICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDcKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQ3KERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9IVElGNykgPT0gKERNQV9JU1JfSFRJRjcpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCAxIHRyYW5zZmVyIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVEVJRjEgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RFMQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19URTEoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RFSUYxKSA9PSAoRE1BX0lTUl9URUlGMSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDIgdHJhbnNmZXIgZXJyb3IgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBURUlGMiAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEUyCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX1RFMihETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfVEVJRjIpID09IChETUFfSVNSX1RFSUYyKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgMyB0cmFuc2ZlciBlcnJvciBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRFSUYzICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19URTMKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEUzKERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9URUlGMykgPT0gKERNQV9JU1JfVEVJRjMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCA0IHRyYW5zZmVyIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVEVJRjQgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RFNAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19URTQoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RFSUY0KSA9PSAoRE1BX0lTUl9URUlGNCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDUgdHJhbnNmZXIgZXJyb3IgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBURUlGNSAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEU1CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX1RFNShETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfVEVJRjUpID09IChETUFfSVNSX1RFSUY1KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgNiB0cmFuc2ZlciBlcnJvciBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRFSUY2ICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19URTYKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEU2KERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9URUlGNikgPT0gKERNQV9JU1JfVEVJRjYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCA3IHRyYW5zZmVyIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVEVJRjcgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RFNworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19URTcoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RFSUY3KSA9PSAoRE1BX0lTUl9URUlGNykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgMSBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0dJRjEgICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0dJMQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0dJMShETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NHSUYxKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDIgZ2xvYmFsIGludGVycnVwdCBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENHSUYyICAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19HSTIKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19HSTIoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DR0lGMik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCAzIGdsb2JhbCBpbnRlcnJ1cHQgZmxhZy4KKyAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDR0lGMyAgICAgICAgIExMX0RNQV9DbGVhckZsYWdfR0kzCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfR0kzKERNQV9UeXBlRGVmICpETUF4KQoreworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0dJRjMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNCBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0dJRjQgICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0dJNAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0dJNChETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NHSUY0KTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDUgZ2xvYmFsIGludGVycnVwdCBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENHSUY1ICAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19HSTUKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19HSTUoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DR0lGNSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA2IGdsb2JhbCBpbnRlcnJ1cHQgZmxhZy4KKyAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDR0lGNiAgICAgICAgIExMX0RNQV9DbGVhckZsYWdfR0k2CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfR0k2KERNQV9UeXBlRGVmICpETUF4KQoreworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0dJRjYpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNyBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0dJRjcgICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0dJNworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0dJNyhETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NHSUY3KTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDEgIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RDSUYxICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RDMQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RDMShETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NUQ0lGMSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCAyICB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENUQ0lGMiAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19UQzIKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19UQzIoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DVENJRjIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgMyAgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4KKyAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDVENJRjMgICAgICAgIExMX0RNQV9DbGVhckZsYWdfVEMzCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfVEMzKERNQV9UeXBlRGVmICpETUF4KQoreworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ1RDSUYzKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDQgIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RDSUY0ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RDNAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RDNChETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NUQ0lGNCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA1ICB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENUQ0lGNSAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19UQzUKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19UQzUoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DVENJRjUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNiAgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4KKyAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDVENJRjYgICAgICAgIExMX0RNQV9DbGVhckZsYWdfVEM2CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfVEM2KERNQV9UeXBlRGVmICpETUF4KQoreworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ1RDSUY2KTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDcgIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RDSUY3ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RDNworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RDNyhETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NUQ0lGNyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCAxICBoYWxmIHRyYW5zZmVyIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0hUSUYxICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0hUMQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0hUMShETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NIVElGMSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCAyICBoYWxmIHRyYW5zZmVyIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0hUSUYyICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0hUMgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0hUMihETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NIVElGMik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCAzICBoYWxmIHRyYW5zZmVyIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0hUSUYzICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0hUMworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0hUMyhETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NIVElGMyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA0ICBoYWxmIHRyYW5zZmVyIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0hUSUY0ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0hUNAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0hUNChETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NIVElGNCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA1ICBoYWxmIHRyYW5zZmVyIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0hUSUY1ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0hUNQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0hUNShETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NIVElGNSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA2ICBoYWxmIHRyYW5zZmVyIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0hUSUY2ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0hUNgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0hUNihETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NIVElGNik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA3ICBoYWxmIHRyYW5zZmVyIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0hUSUY3ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0hUNworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0hUNyhETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NIVElGNyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCAxIHRyYW5zZmVyIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RFSUYxICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RFMQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RFMShETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NURUlGMSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCAyIHRyYW5zZmVyIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RFSUYyICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RFMgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RFMihETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NURUlGMik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCAzIHRyYW5zZmVyIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RFSUYzICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RFMworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RFMyhETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NURUlGMyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA0IHRyYW5zZmVyIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RFSUY0ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RFNAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RFNChETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NURUlGNCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA1IHRyYW5zZmVyIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RFSUY1ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RFNQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RFNShETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NURUlGNSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA2IHRyYW5zZmVyIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RFSUY2ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RFNgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RFNihETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NURUlGNik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA3IHRyYW5zZmVyIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RFSUY3ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RFNworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RFNyhETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NURUlGNyk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VGX0lUX01hbmFnZW1lbnQgSVRfTWFuYWdlbWVudAorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBUcmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgVENJRSAgICAgICAgICBMTF9ETUFfRW5hYmxlSVRfVEMKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9FbmFibGVJVF9UQyhETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgU0VUX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DQ1IsIERNQV9DQ1JfVENJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEhhbGYgdHJhbnNmZXIgaW50ZXJydXB0LgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIEhUSUUgICAgICAgICAgTExfRE1BX0VuYWJsZUlUX0hUCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfRW5hYmxlSVRfSFQoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIFNFVF9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQXggKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpKS0+Q0NSLCBETUFfQ0NSX0hUSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBUcmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgVEVJRSAgICAgICAgICBMTF9ETUFfRW5hYmxlSVRfVEUKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9FbmFibGVJVF9URShETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgU0VUX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DQ1IsIERNQV9DQ1JfVEVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBUcmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgVENJRSAgICAgICAgICBMTF9ETUFfRGlzYWJsZUlUX1RDCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfRGlzYWJsZUlUX1RDKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKQoreworICBDTEVBUl9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQXggKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpKS0+Q0NSLCBETUFfQ0NSX1RDSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgSGFsZiB0cmFuc2ZlciBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgSFRJRSAgICAgICAgICBMTF9ETUFfRGlzYWJsZUlUX0hUCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfRGlzYWJsZUlUX0hUKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKQoreworICBDTEVBUl9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQXggKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpKS0+Q0NSLCBETUFfQ0NSX0hUSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0LgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIFRFSUUgICAgICAgICAgTExfRE1BX0Rpc2FibGVJVF9URQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0Rpc2FibGVJVF9URShETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgQ0xFQVJfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUF4ICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKSktPkNDUiwgRE1BX0NDUl9URUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUcmFuc2ZlciBjb21wbGV0ZSBJbnRlcnJ1cHQgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBUQ0lFICAgICAgICAgIExMX0RNQV9Jc0VuYWJsZWRJVF9UQworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0VuYWJsZWRJVF9UQyhETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DQ1IsCisgICAgICAgICAgICAgICAgICAgRE1BX0NDUl9UQ0lFKSA9PSAoRE1BX0NDUl9UQ0lFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgSGFsZiB0cmFuc2ZlciBJbnRlcnJ1cHQgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBIVElFICAgICAgICAgIExMX0RNQV9Jc0VuYWJsZWRJVF9IVAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0VuYWJsZWRJVF9IVChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DQ1IsCisgICAgICAgICAgICAgICAgICAgRE1BX0NDUl9IVElFKSA9PSAoRE1BX0NDUl9IVElFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgVHJhbnNmZXIgZXJyb3IgSW50ZXJydXB0IGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgVEVJRSAgICAgICAgICBMTF9ETUFfSXNFbmFibGVkSVRfVEUKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNFbmFibGVkSVRfVEUoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJldHVybiAoUkVBRF9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQXggKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpKS0+Q0NSLAorICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfVEVJRSkgPT0gKERNQV9DQ1JfVEVJRSkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIERNQV9MTF9FRl9Jbml0IEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCit1aW50MzJfdCBMTF9ETUFfSW5pdChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCwgTExfRE1BX0luaXRUeXBlRGVmICpETUFfSW5pdFN0cnVjdCk7Cit1aW50MzJfdCBMTF9ETUFfRGVJbml0KERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKTsKK3ZvaWQgTExfRE1BX1N0cnVjdEluaXQoTExfRE1BX0luaXRUeXBlRGVmICpETUFfSW5pdFN0cnVjdCk7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBETUExIHx8IERNQTIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJGM3h4X0xMX0RNQV9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2xsX2V4dGkuaCBiL0luYy9zdG0zMmYzeHhfbGxfZXh0aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZWJhZTcKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2xsX2V4dGkuaApAQCAtMCwwICsxLDEzOTkgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfbGxfZXh0aS5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBFWFRJIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0xMX0VYVElfSAorI2RlZmluZSBfX1NUTTMyRjN4eF9MTF9FWFRJX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkIChFWFRJKQorCisvKiogQGRlZmdyb3VwIEVYVElfTEwgRVhUSQorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgTWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIEVYVElfTExfUHJpdmF0ZV9NYWNyb3MgRVhUSSBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIEVYVElfTExfRVNfSU5JVCBFWFRJIEV4cG9ydGVkIEluaXQgc3RydWN0dXJlCisgICogQHsKKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisKKyAgdWludDMyX3QgTGluZV8wXzMxOyAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIEVYVEkgbGluZXMgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZCBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgQHJlZiBFWFRJX0xMX0VDX0xJTkUgKi8KKyNpZiBkZWZpbmVkKEVYVElfMzJfNjNfU1VQUE9SVCkKKworICB1aW50MzJfdCBMaW5lXzMyXzYzOyAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgRVhUSSBsaW5lcyB0byBiZSBlbmFibGVkIG9yIGRpc2FibGVkIGZvciBMaW5lcyBpbiByYW5nZSAzMiB0byA2MworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgQHJlZiBFWFRJX0xMX0VDX0xJTkUgKi8KKyNlbmRpZgorCisgIEZ1bmN0aW9uYWxTdGF0ZSBMaW5lQ29tbWFuZDsgIC8qITwgU3BlY2lmaWVzIHRoZSBuZXcgc3RhdGUgb2YgdGhlIHNlbGVjdGVkIEVYVEkgbGluZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCBlaXRoZXIgdG8gRU5BQkxFIG9yIERJU0FCTEUgKi8KKworICB1aW50OF90IE1vZGU7ICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbW9kZSBmb3IgdGhlIEVYVEkgbGluZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBFWFRJX0xMX0VDX01PREUuICovCisKKyAgdWludDhfdCBUcmlnZ2VyOyAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHRyaWdnZXIgc2lnbmFsIGFjdGl2ZSBlZGdlIGZvciB0aGUgRVhUSSBsaW5lcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEVYVElfTExfRUNfVFJJR0dFUi4gKi8KK30gTExfRVhUSV9Jbml0VHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEVYVElfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIEVYVEkgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBFWFRJX0xMX0VDX0xJTkUgTElORQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0VYVElfTElORV8wICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTAgICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAwICovCisjZGVmaW5lIExMX0VYVElfTElORV8xICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTEgICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAxICovCisjZGVmaW5lIExMX0VYVElfTElORV8yICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTIgICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAyICovCisjZGVmaW5lIExMX0VYVElfTElORV8zICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTMgICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAzICovCisjZGVmaW5lIExMX0VYVElfTElORV80ICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTQgICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSA0ICovCisjZGVmaW5lIExMX0VYVElfTElORV81ICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTUgICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSA1ICovCisjZGVmaW5lIExMX0VYVElfTElORV82ICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTYgICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSA2ICovCisjZGVmaW5lIExMX0VYVElfTElORV83ICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTcgICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSA3ICovCisjZGVmaW5lIExMX0VYVElfTElORV84ICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTggICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSA4ICovCisjZGVmaW5lIExMX0VYVElfTElORV85ICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTkgICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSA5ICovCisjZGVmaW5lIExMX0VYVElfTElORV8xMCAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTEwICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAxMCAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfMTEgICAgICAgICAgICAgICAgRVhUSV9JTVJfSU0xMSAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMTEgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzEyICAgICAgICAgICAgICAgIEVYVElfSU1SX0lNMTIgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDEyICovCisjZGVmaW5lIExMX0VYVElfTElORV8xMyAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTEzICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAxMyAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfMTQgICAgICAgICAgICAgICAgRVhUSV9JTVJfSU0xNCAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMTQgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzE1ICAgICAgICAgICAgICAgIEVYVElfSU1SX0lNMTUgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDE1ICovCisjaWYgZGVmaW5lZChFWFRJX0lNUl9JTTE2KQorI2RlZmluZSBMTF9FWFRJX0xJTkVfMTYgICAgICAgICAgICAgICAgRVhUSV9JTVJfSU0xNiAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMTYgKi8KKyNlbmRpZgorI2RlZmluZSBMTF9FWFRJX0xJTkVfMTcgICAgICAgICAgICAgICAgRVhUSV9JTVJfSU0xNyAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMTcgKi8KKyNpZiBkZWZpbmVkKEVYVElfSU1SX0lNMTgpCisjZGVmaW5lIExMX0VYVElfTElORV8xOCAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTE4ICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAxOCAqLworI2VuZGlmCisjZGVmaW5lIExMX0VYVElfTElORV8xOSAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTE5ICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAxOSAqLworI2lmIGRlZmluZWQoRVhUSV9JTVJfSU0yMCkKKyNkZWZpbmUgTExfRVhUSV9MSU5FXzIwICAgICAgICAgICAgICAgIEVYVElfSU1SX0lNMjAgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDIwICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKEVYVElfSU1SX0lNMjEpCisjZGVmaW5lIExMX0VYVElfTElORV8yMSAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTIxICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAyMSAqLworI2VuZGlmCisjaWYgZGVmaW5lZChFWFRJX0lNUl9JTTIyKQorI2RlZmluZSBMTF9FWFRJX0xJTkVfMjIgICAgICAgICAgICAgICAgRVhUSV9JTVJfSU0yMiAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMjIgKi8KKyNlbmRpZgorI2RlZmluZSBMTF9FWFRJX0xJTkVfMjMgICAgICAgICAgICAgICAgRVhUSV9JTVJfSU0yMyAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMjMgKi8KKyNpZiBkZWZpbmVkKEVYVElfSU1SX0lNMjQpCisjZGVmaW5lIExMX0VYVElfTElORV8yNCAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTI0ICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAyNCAqLworI2VuZGlmCisjaWYgZGVmaW5lZChFWFRJX0lNUl9JTTI1KQorI2RlZmluZSBMTF9FWFRJX0xJTkVfMjUgICAgICAgICAgICAgICAgRVhUSV9JTVJfSU0yNSAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMjUgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoRVhUSV9JTVJfSU0yNikKKyNkZWZpbmUgTExfRVhUSV9MSU5FXzI2ICAgICAgICAgICAgICAgIEVYVElfSU1SX0lNMjYgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDI2ICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKEVYVElfSU1SX0lNMjcpCisjZGVmaW5lIExMX0VYVElfTElORV8yNyAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTI3ICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAyNyAqLworI2VuZGlmCisjaWYgZGVmaW5lZChFWFRJX0lNUl9JTTI4KQorI2RlZmluZSBMTF9FWFRJX0xJTkVfMjggICAgICAgICAgICAgICAgRVhUSV9JTVJfSU0yOCAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMjggKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoRVhUSV9JTVJfSU0yOSkKKyNkZWZpbmUgTExfRVhUSV9MSU5FXzI5ICAgICAgICAgICAgICAgIEVYVElfSU1SX0lNMjkgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDI5ICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKEVYVElfSU1SX0lNMzApCisjZGVmaW5lIExMX0VYVElfTElORV8zMCAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTMwICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAzMCAqLworI2VuZGlmCisjaWYgZGVmaW5lZChFWFRJX0lNUl9JTTMxKQorI2RlZmluZSBMTF9FWFRJX0xJTkVfMzEgICAgICAgICAgICAgICAgRVhUSV9JTVJfSU0zMSAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMzEgKi8KKyNlbmRpZgorI2RlZmluZSBMTF9FWFRJX0xJTkVfQUxMXzBfMzEgICAgICAgICAgRVhUSV9JTVJfSU0gICAgICAgICAgICAvKiE8IEFsbCBFeHRlbmRlZCBsaW5lIG5vdCByZXNlcnZlZCovCisKKyNpZiBkZWZpbmVkKEVYVElfMzJfNjNfU1VQUE9SVCkKKyNkZWZpbmUgTExfRVhUSV9MSU5FXzMyICAgICAgICAgICAgICAgIEVYVElfSU1SMl9JTTMyICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAzMiAqLworI2lmIGRlZmluZWQoRVhUSV9JTVIyX0lNMzMpCisjZGVmaW5lIExMX0VYVElfTElORV8zMyAgICAgICAgICAgICAgICBFWFRJX0lNUjJfSU0zMyAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMzMgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoRVhUSV9JTVIyX0lNMzQpCisjZGVmaW5lIExMX0VYVElfTElORV8zNCAgICAgICAgICAgICAgICBFWFRJX0lNUjJfSU0zNCAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMzQgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoRVhUSV9JTVIyX0lNMzUpCisjZGVmaW5lIExMX0VYVElfTElORV8zNSAgICAgICAgICAgICAgICBFWFRJX0lNUjJfSU0zNSAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMzUgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoRVhUSV9JTVIyX0lNMzYpCisjZGVmaW5lIExMX0VYVElfTElORV8zNiAgICAgICAgICAgICAgICBFWFRJX0lNUjJfSU0zNiAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMzYgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoRVhUSV9JTVIyX0lNMzcpCisjZGVmaW5lIExMX0VYVElfTElORV8zNyAgICAgICAgICAgICAgICBFWFRJX0lNUjJfSU0zNyAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMzcgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoRVhUSV9JTVIyX0lNMzgpCisjZGVmaW5lIExMX0VYVElfTElORV8zOCAgICAgICAgICAgICAgICBFWFRJX0lNUjJfSU0zOCAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMzggKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoRVhUSV9JTVIyX0lNMzkpCisjZGVmaW5lIExMX0VYVElfTElORV8zOSAgICAgICAgICAgICAgICBFWFRJX0lNUjJfSU0zOSAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMzkgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoRVhUSV9JTVIyX0lNNDApCisjZGVmaW5lIExMX0VYVElfTElORV80MCAgICAgICAgICAgICAgICBFWFRJX0lNUjJfSU00MCAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgNDAgKi8KKyNlbmRpZgorI2RlZmluZSBMTF9FWFRJX0xJTkVfQUxMXzMyXzYzICAgICAgICAgRVhUSV9JTVIyX0lNICAgICAgICAgICAgLyohPCBBbGwgRXh0ZW5kZWQgbGluZSBub3QgcmVzZXJ2ZWQqLworCisjZW5kaWYKKworI2RlZmluZSBMTF9FWFRJX0xJTkVfQUxMICAgICAgICAgICAgICAgKDB4RkZGRkZGRkZVKSAgLyohPCBBbGwgRXh0ZW5kZWQgbGluZSAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisjZGVmaW5lIExMX0VYVElfTElORV9OT05FICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAvKiE8IE5vbmUgRXh0ZW5kZWQgbGluZSAqLworI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKworLyoqCisgICogQH0KKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyoqIEBkZWZncm91cCBFWFRJX0xMX0VDX01PREUgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0VYVElfTU9ERV9JVCAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAvKiE8IEludGVycnVwdCBNb2RlICovCisjZGVmaW5lIExMX0VYVElfTU9ERV9FVkVOVCAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDFVKSAvKiE8IEV2ZW50IE1vZGUgKi8KKyNkZWZpbmUgTExfRVhUSV9NT0RFX0lUX0VWRU5UICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpIC8qITwgSW50ZXJydXB0ICYgRXZlbnQgTW9kZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBFWFRJX0xMX0VDX1RSSUdHRVIgRWRnZSBUcmlnZ2VyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRVhUSV9UUklHR0VSX05PTkUgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpIC8qITwgTm8gVHJpZ2dlciBNb2RlICovCisjZGVmaW5lIExMX0VYVElfVFJJR0dFUl9SSVNJTkcgICAgICAgICAgKCh1aW50OF90KTB4MDFVKSAvKiE8IFRyaWdnZXIgUmlzaW5nIE1vZGUgKi8KKyNkZWZpbmUgTExfRVhUSV9UUklHR0VSX0ZBTExJTkcgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpIC8qITwgVHJpZ2dlciBGYWxsaW5nIE1vZGUgKi8KKyNkZWZpbmUgTExfRVhUSV9UUklHR0VSX1JJU0lOR19GQUxMSU5HICAoKHVpbnQ4X3QpMHgwM1UpIC8qITwgVHJpZ2dlciBSaXNpbmcgJiBGYWxsaW5nIE1vZGUgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisjZW5kaWYgLypVU0VfRlVMTF9MTF9EUklWRVIqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEVYVElfTExfRXhwb3J0ZWRfTWFjcm9zIEVYVEkgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBFWFRJX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gRVhUSSByZWdpc3RlcgorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuCisgICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgTExfRVhUSV9Xcml0ZVJlZyhfX1JFR19fLCBfX1ZBTFVFX18pIFdSSVRFX1JFRyhFWFRJLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gRVhUSSByZWdpc3RlcgorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICAqLworI2RlZmluZSBMTF9FWFRJX1JlYWRSZWcoX19SRUdfXykgUkVBRF9SRUcoRVhUSS0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKworLyoqCisgICogQH0KKyAgKi8KKworCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEVYVElfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIEVYVEkgRXhwb3J0ZWQgRnVuY3Rpb25zCisgKiBAeworICovCisvKiogQGRlZmdyb3VwIEVYVElfTExfRUZfSVRfTWFuYWdlbWVudCBJVF9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRXh0aUxpbmUgSW50ZXJydXB0IHJlcXVlc3QgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAgKiBAbm90ZSBUaGUgcmVzZXQgdmFsdWUgZm9yIHRoZSBkaXJlY3Qgb3IgaW50ZXJuYWwgbGluZXMgKHNlZSBSTSkKKyAgKiAgICAgICBpcyBzZXQgdG8gMSBpbiBvcmRlciB0byBlbmFibGUgdGhlIGludGVycnVwdCBieSBkZWZhdWx0LgorICAqICAgICAgIEJpdHMgYXJlIHNldCBhdXRvbWF0aWNhbGx5IGF0IFBvd2VyIG9uLgorICAqIEBybXRvbGwgSU1SICAgICAgICAgSU14ICAgICAgICAgICBMTF9FWFRJX0VuYWJsZUlUXzBfMzEKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfQUxMXzBfMzEKKyAgKiBAbm90ZSAgIFBsZWFzZSBjaGVjayBlYWNoIGRldmljZSBsaW5lIG1hcHBpbmcgZm9yIEVYVEkgTGluZSBhdmFpbGFiaWxpdHkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRW5hYmxlSVRfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgU0VUX0JJVChFWFRJLT5JTVIsIEV4dGlMaW5lKTsKK30KKyNpZiBkZWZpbmVkKEVYVElfMzJfNjNfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEV4dGlMaW5lIEludGVycnVwdCByZXF1ZXN0IGZvciBMaW5lcyBpbiByYW5nZSAzMiB0byA2MworICAqIEBub3RlIFRoZSByZXNldCB2YWx1ZSBmb3IgdGhlIGRpcmVjdCBsaW5lcyAobGluZXMgZnJvbSAzMiB0byAzNCwgbGluZQorICAqICAgICAgIDM5KSBpcyBzZXQgdG8gMSBpbiBvcmRlciB0byBlbmFibGUgdGhlIGludGVycnVwdCBieSBkZWZhdWx0LgorICAqICAgICAgIEJpdHMgYXJlIHNldCBhdXRvbWF0aWNhbGx5IGF0IFBvd2VyIG9uLgorICAqIEBybXRvbGwgSU1SMiAgICAgICAgIElNeCAgICAgICAgICAgTExfRVhUSV9FbmFibGVJVF8zMl82MworICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfQUxMXzMyXzYzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9FWFRJX0VuYWJsZUlUXzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBTRVRfQklUKEVYVEktPklNUjIsIEV4dGlMaW5lKTsKK30KKyNlbmRpZgorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRXh0aUxpbmUgSW50ZXJydXB0IHJlcXVlc3QgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAgKiBAbm90ZSBUaGUgcmVzZXQgdmFsdWUgZm9yIHRoZSBkaXJlY3Qgb3IgaW50ZXJuYWwgbGluZXMgKHNlZSBSTSkKKyAgKiAgICAgICBpcyBzZXQgdG8gMSBpbiBvcmRlciB0byBlbmFibGUgdGhlIGludGVycnVwdCBieSBkZWZhdWx0LgorICAqICAgICAgIEJpdHMgYXJlIHNldCBhdXRvbWF0aWNhbGx5IGF0IFBvd2VyIG9uLgorICAqIEBybXRvbGwgSU1SICAgICAgICAgSU14ICAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVJVF8wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FX0FMTF8wXzMxCisgICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9FWFRJX0Rpc2FibGVJVF8wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBDTEVBUl9CSVQoRVhUSS0+SU1SLCBFeHRpTGluZSk7Cit9CisKKyNpZiBkZWZpbmVkKEVYVElfMzJfNjNfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBFeHRpTGluZSBJbnRlcnJ1cHQgcmVxdWVzdCBmb3IgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMKKyAgKiBAbm90ZSBUaGUgcmVzZXQgdmFsdWUgZm9yIHRoZSBkaXJlY3QgbGluZXMgKGxpbmVzIGZyb20gMzIgdG8gMzQsIGxpbmUKKyAgKiAgICAgICAzOSkgaXMgc2V0IHRvIDEgaW4gb3JkZXIgdG8gZW5hYmxlIHRoZSBpbnRlcnJ1cHQgYnkgZGVmYXVsdC4KKyAgKiAgICAgICBCaXRzIGFyZSBzZXQgYXV0b21hdGljYWxseSBhdCBQb3dlciBvbi4KKyAgKiBAcm10b2xsIElNUjIgICAgICAgICBJTXggICAgICAgICAgIExMX0VYVElfRGlzYWJsZUlUXzMyXzYzCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMzJfNjMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRGlzYWJsZUlUXzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBDTEVBUl9CSVQoRVhUSS0+SU1SMiwgRXh0aUxpbmUpOworfQorI2VuZGlmCisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgRXh0aUxpbmUgSW50ZXJydXB0IHJlcXVlc3QgaXMgZW5hYmxlZCBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQorICAqIEBub3RlIFRoZSByZXNldCB2YWx1ZSBmb3IgdGhlIGRpcmVjdCBvciBpbnRlcm5hbCBsaW5lcyAoc2VlIFJNKQorICAqICAgICAgIGlzIHNldCB0byAxIGluIG9yZGVyIHRvIGVuYWJsZSB0aGUgaW50ZXJydXB0IGJ5IGRlZmF1bHQuCisgICogICAgICAgQml0cyBhcmUgc2V0IGF1dG9tYXRpY2FsbHkgYXQgUG93ZXIgb24uCisgICogQHJtdG9sbCBJTVIgICAgICAgICBJTXggICAgICAgICAgIExMX0VYVElfSXNFbmFibGVkSVRfMF8zMQorICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMF8zMQorICAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0VYVElfSXNFbmFibGVkSVRfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChFWFRJLT5JTVIsIEV4dGlMaW5lKSA9PSAoRXh0aUxpbmUpKTsKK30KKworI2lmIGRlZmluZWQoRVhUSV8zMl82M19TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBFeHRpTGluZSBJbnRlcnJ1cHQgcmVxdWVzdCBpcyBlbmFibGVkIGZvciBMaW5lcyBpbiByYW5nZSAzMiB0byA2MworICAqIEBub3RlIFRoZSByZXNldCB2YWx1ZSBmb3IgdGhlIGRpcmVjdCBsaW5lcyAobGluZXMgZnJvbSAzMiB0byAzNCwgbGluZQorICAqICAgICAgIDM5KSBpcyBzZXQgdG8gMSBpbiBvcmRlciB0byBlbmFibGUgdGhlIGludGVycnVwdCBieSBkZWZhdWx0LgorICAqICAgICAgIEJpdHMgYXJlIHNldCBhdXRvbWF0aWNhbGx5IGF0IFBvd2VyIG9uLgorICAqIEBybXRvbGwgSU1SMiAgICAgICAgIElNeCAgICAgICAgICAgTExfRVhUSV9Jc0VuYWJsZWRJVF8zMl82MworICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfQUxMXzMyXzYzCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRVhUSV9Jc0VuYWJsZWRJVF8zMl82Myh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChFWFRJLT5JTVIyLCBFeHRpTGluZSkgPT0gKEV4dGlMaW5lKSk7Cit9CisjZW5kaWYKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBFWFRJX0xMX0VGX0V2ZW50X01hbmFnZW1lbnQgRXZlbnRfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEV4dGlMaW5lIEV2ZW50IHJlcXVlc3QgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAgKiBAcm10b2xsIEVNUiAgICAgICAgIEVNeCAgICAgICAgICAgTExfRVhUSV9FbmFibGVFdmVudF8wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FX0FMTF8wXzMxCisgICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9FWFRJX0VuYWJsZUV2ZW50XzBfMzEodWludDMyX3QgRXh0aUxpbmUpCit7CisgIFNFVF9CSVQoRVhUSS0+RU1SLCBFeHRpTGluZSk7CisKK30KKworI2lmIGRlZmluZWQoRVhUSV8zMl82M19TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBFbmFibGUgRXh0aUxpbmUgRXZlbnQgcmVxdWVzdCBmb3IgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMKKyAgKiBAcm10b2xsIEVNUjIgICAgICAgICBFTXggICAgICAgICAgIExMX0VYVElfRW5hYmxlRXZlbnRfMzJfNjMKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMzJfNjMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRW5hYmxlRXZlbnRfMzJfNjModWludDMyX3QgRXh0aUxpbmUpCit7CisgIFNFVF9CSVQoRVhUSS0+RU1SMiwgRXh0aUxpbmUpOworfQorI2VuZGlmCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBFeHRpTGluZSBFdmVudCByZXF1ZXN0IGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxCisgICogQHJtdG9sbCBFTVIgICAgICAgICBFTXggICAgICAgICAgIExMX0VYVElfRGlzYWJsZUV2ZW50XzBfMzEKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfQUxMXzBfMzEKKyAgKiBAbm90ZSAgIFBsZWFzZSBjaGVjayBlYWNoIGRldmljZSBsaW5lIG1hcHBpbmcgZm9yIEVYVEkgTGluZSBhdmFpbGFiaWxpdHkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRGlzYWJsZUV2ZW50XzBfMzEodWludDMyX3QgRXh0aUxpbmUpCit7CisgIENMRUFSX0JJVChFWFRJLT5FTVIsIEV4dGlMaW5lKTsKK30KKworI2lmIGRlZmluZWQoRVhUSV8zMl82M19TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEV4dGlMaW5lIEV2ZW50IHJlcXVlc3QgZm9yIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzCisgICogQHJtdG9sbCBFTVIyICAgICAgICAgRU14ICAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVFdmVudF8zMl82MworICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FX0FMTF8zMl82MworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9EaXNhYmxlRXZlbnRfMzJfNjModWludDMyX3QgRXh0aUxpbmUpCit7CisgIENMRUFSX0JJVChFWFRJLT5FTVIyLCBFeHRpTGluZSk7Cit9CisjZW5kaWYKKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBFeHRpTGluZSBFdmVudCByZXF1ZXN0IGlzIGVuYWJsZWQgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAgKiBAcm10b2xsIEVNUiAgICAgICAgIEVNeCAgICAgICAgICAgTExfRVhUSV9Jc0VuYWJsZWRFdmVudF8wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FX0FMTF8wXzMxCisgICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRVhUSV9Jc0VuYWJsZWRFdmVudF8wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICByZXR1cm4gKFJFQURfQklUKEVYVEktPkVNUiwgRXh0aUxpbmUpID09IChFeHRpTGluZSkpOworCit9CisKKyNpZiBkZWZpbmVkKEVYVElfMzJfNjNfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgRXh0aUxpbmUgRXZlbnQgcmVxdWVzdCBpcyBlbmFibGVkIGZvciBMaW5lcyBpbiByYW5nZSAzMiB0byA2MworICAqIEBybXRvbGwgRU1SMiAgICAgICAgIEVNeCAgICAgICAgICAgTExfRVhUSV9Jc0VuYWJsZWRFdmVudF8zMl82MworICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FX0FMTF8zMl82MworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0VYVElfSXNFbmFibGVkRXZlbnRfMzJfNjModWludDMyX3QgRXh0aUxpbmUpCit7CisgIHJldHVybiAoUkVBRF9CSVQoRVhUSS0+RU1SMiwgRXh0aUxpbmUpID09IChFeHRpTGluZSkpOworfQorI2VuZGlmCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FRl9SaXNpbmdfVHJpZ2dlcl9NYW5hZ2VtZW50IFJpc2luZ19UcmlnZ2VyX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBFeHRpTGluZSBSaXNpbmcgRWRnZSBUcmlnZ2VyIGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxCisgICogQG5vdGUgVGhlIGNvbmZpZ3VyYWJsZSB3YWtldXAgbGluZXMgYXJlIGVkZ2UtdHJpZ2dlcmVkLiBObyBnbGl0Y2ggbXVzdCBiZQorICAqICAgICAgIGdlbmVyYXRlZCBvbiB0aGVzZSBsaW5lcy4gSWYgYSByaXNpbmcgZWRnZSBvbiBhIGNvbmZpZ3VyYWJsZSBpbnRlcnJ1cHQKKyAgKiAgICAgICBsaW5lIG9jY3VycyBkdXJpbmcgYSB3cml0ZSBvcGVyYXRpb24gaW4gdGhlIEVYVElfUlRTUiByZWdpc3RlciwgdGhlCisgICogICAgICAgcGVuZGluZyBiaXQgaXMgbm90IHNldC4KKyAgKiAgICAgICBSaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSB0cmlnZ2VycyBjYW4gYmUgc2V0IGZvcgorICAqICAgICAgIHRoZSBzYW1lIGludGVycnVwdCBsaW5lLiBJbiB0aGlzIGNhc2UsIGJvdGggZ2VuZXJhdGUgYSB0cmlnZ2VyCisgICogICAgICAgY29uZGl0aW9uLgorICAqIEBybXRvbGwgUlRTUiAgICAgICAgUlR4ICAgICAgICAgICBMTF9FWFRJX0VuYWJsZVJpc2luZ1RyaWdfMF8zMQorICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzEKKyAgKiBAbm90ZSAgIFBsZWFzZSBjaGVjayBlYWNoIGRldmljZSBsaW5lIG1hcHBpbmcgZm9yIEVYVEkgTGluZSBhdmFpbGFiaWxpdHkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRW5hYmxlUmlzaW5nVHJpZ18wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBTRVRfQklUKEVYVEktPlJUU1IsIEV4dGlMaW5lKTsKKworfQorCisjaWYgZGVmaW5lZChFWFRJXzMyXzYzX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBFeHRpTGluZSBSaXNpbmcgRWRnZSBUcmlnZ2VyIGZvciBMaW5lcyBpbiByYW5nZSAzMiB0byA2MworICAqIEBub3RlIFRoZSBjb25maWd1cmFibGUgd2FrZXVwIGxpbmVzIGFyZSBlZGdlLXRyaWdnZXJlZC4gTm8gZ2xpdGNoIG11c3QgYmUKKyAgKiAgICAgICBnZW5lcmF0ZWQgb24gdGhlc2UgbGluZXMuIElmIGEgcmlzaW5nIGVkZ2Ugb24gYSBjb25maWd1cmFibGUgaW50ZXJydXB0CisgICogICAgICAgbGluZSBvY2N1cnMgZHVyaW5nIGEgd3JpdGUgb3BlcmF0aW9uIGluIHRoZSBFWFRJX1JUU1IgcmVnaXN0ZXIsIHRoZQorICAqICAgICAgIHBlbmRpbmcgYml0IGlzIG5vdCBzZXQuUmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2UgdHJpZ2dlcnMgY2FuIGJlIHNldCBmb3IKKyAgKiAgICAgICB0aGUgc2FtZSBpbnRlcnJ1cHQgbGluZS4gSW4gdGhpcyBjYXNlLCBib3RoIGdlbmVyYXRlIGEgdHJpZ2dlcgorICAqICAgICAgIGNvbmRpdGlvbi4KKyAgKiBAcm10b2xsIFJUU1IyICAgICAgICBSVHggICAgICAgICAgIExMX0VYVElfRW5hYmxlUmlzaW5nVHJpZ18zMl82MworICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM4CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9FWFRJX0VuYWJsZVJpc2luZ1RyaWdfMzJfNjModWludDMyX3QgRXh0aUxpbmUpCit7CisgIFNFVF9CSVQoRVhUSS0+UlRTUjIsIEV4dGlMaW5lKTsKK30KKyNlbmRpZgorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRXh0aUxpbmUgUmlzaW5nIEVkZ2UgVHJpZ2dlciBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQorICAqIEBub3RlIFRoZSBjb25maWd1cmFibGUgd2FrZXVwIGxpbmVzIGFyZSBlZGdlLXRyaWdnZXJlZC4gTm8gZ2xpdGNoIG11c3QgYmUKKyAgKiAgICAgICBnZW5lcmF0ZWQgb24gdGhlc2UgbGluZXMuIElmIGEgcmlzaW5nIGVkZ2Ugb24gYSBjb25maWd1cmFibGUgaW50ZXJydXB0CisgICogICAgICAgbGluZSBvY2N1cnMgZHVyaW5nIGEgd3JpdGUgb3BlcmF0aW9uIGluIHRoZSBFWFRJX1JUU1IgcmVnaXN0ZXIsIHRoZQorICAqICAgICAgIHBlbmRpbmcgYml0IGlzIG5vdCBzZXQuCisgICogICAgICAgUmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2UgdHJpZ2dlcnMgY2FuIGJlIHNldCBmb3IKKyAgKiAgICAgICB0aGUgc2FtZSBpbnRlcnJ1cHQgbGluZS4gSW4gdGhpcyBjYXNlLCBib3RoIGdlbmVyYXRlIGEgdHJpZ2dlcgorICAqICAgICAgIGNvbmRpdGlvbi4KKyAgKiBAcm10b2xsIFJUU1IgICAgICAgIFJUeCAgICAgICAgICAgTExfRVhUSV9EaXNhYmxlUmlzaW5nVHJpZ18wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMQorICAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9EaXNhYmxlUmlzaW5nVHJpZ18wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBDTEVBUl9CSVQoRVhUSS0+UlRTUiwgRXh0aUxpbmUpOworCit9CisKKyNpZiBkZWZpbmVkKEVYVElfMzJfNjNfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBFeHRpTGluZSBSaXNpbmcgRWRnZSBUcmlnZ2VyIGZvciBMaW5lcyBpbiByYW5nZSAzMiB0byA2MworICAqIEBub3RlIFRoZSBjb25maWd1cmFibGUgd2FrZXVwIGxpbmVzIGFyZSBlZGdlLXRyaWdnZXJlZC4gTm8gZ2xpdGNoIG11c3QgYmUKKyAgKiAgICAgICBnZW5lcmF0ZWQgb24gdGhlc2UgbGluZXMuIElmIGEgcmlzaW5nIGVkZ2Ugb24gYSBjb25maWd1cmFibGUgaW50ZXJydXB0CisgICogICAgICAgbGluZSBvY2N1cnMgZHVyaW5nIGEgd3JpdGUgb3BlcmF0aW9uIGluIHRoZSBFWFRJX1JUU1IgcmVnaXN0ZXIsIHRoZQorICAqICAgICAgIHBlbmRpbmcgYml0IGlzIG5vdCBzZXQuCisgICogICAgICAgUmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2UgdHJpZ2dlcnMgY2FuIGJlIHNldCBmb3IKKyAgKiAgICAgICB0aGUgc2FtZSBpbnRlcnJ1cHQgbGluZS4gSW4gdGhpcyBjYXNlLCBib3RoIGdlbmVyYXRlIGEgdHJpZ2dlcgorICAqICAgICAgIGNvbmRpdGlvbi4KKyAgKiBAcm10b2xsIFJUU1IyICAgICAgICBSVHggICAgICAgICAgIExMX0VYVElfRGlzYWJsZVJpc2luZ1RyaWdfMzJfNjMKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9EaXNhYmxlUmlzaW5nVHJpZ18zMl82Myh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgQ0xFQVJfQklUKEVYVEktPlJUU1IyLCBFeHRpTGluZSk7Cit9CisjZW5kaWYKKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiByaXNpbmcgZWRnZSB0cmlnZ2VyIGlzIGVuYWJsZWQgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAgKiBAcm10b2xsIFJUU1IgICAgICAgIFJUeCAgICAgICAgICAgTExfRVhUSV9Jc0VuYWJsZWRSaXNpbmdUcmlnXzBfMzEKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxCisgICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRVhUSV9Jc0VuYWJsZWRSaXNpbmdUcmlnXzBfMzEodWludDMyX3QgRXh0aUxpbmUpCit7CisgIHJldHVybiAoUkVBRF9CSVQoRVhUSS0+UlRTUiwgRXh0aUxpbmUpID09IChFeHRpTGluZSkpOworfQorCisjaWYgZGVmaW5lZChFWFRJXzMyXzYzX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHJpc2luZyBlZGdlIHRyaWdnZXIgaXMgZW5hYmxlZCBmb3IgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMKKyAgKiBAcm10b2xsIFJUU1IyICAgICAgICBSVHggICAgICAgICAgIExMX0VYVElfSXNFbmFibGVkUmlzaW5nVHJpZ18zMl82MworICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM4CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRVhUSV9Jc0VuYWJsZWRSaXNpbmdUcmlnXzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKQoreworICByZXR1cm4gKFJFQURfQklUKEVYVEktPlJUU1IyLCBFeHRpTGluZSkgPT0gKEV4dGlMaW5lKSk7Cit9CisjZW5kaWYKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBFWFRJX0xMX0VGX0ZhbGxpbmdfVHJpZ2dlcl9NYW5hZ2VtZW50IEZhbGxpbmdfVHJpZ2dlcl9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRXh0aUxpbmUgRmFsbGluZyBFZGdlIFRyaWdnZXIgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAgKiBAbm90ZSBUaGUgY29uZmlndXJhYmxlIHdha2V1cCBsaW5lcyBhcmUgZWRnZS10cmlnZ2VyZWQuIE5vIGdsaXRjaCBtdXN0IGJlCisgICogICAgICAgZ2VuZXJhdGVkIG9uIHRoZXNlIGxpbmVzLiBJZiBhIGZhbGxpbmcgZWRnZSBvbiBhIGNvbmZpZ3VyYWJsZSBpbnRlcnJ1cHQKKyAgKiAgICAgICBsaW5lIG9jY3VycyBkdXJpbmcgYSB3cml0ZSBvcGVyYXRpb24gaW4gdGhlIEVYVElfRlRTUiByZWdpc3RlciwgdGhlCisgICogICAgICAgcGVuZGluZyBiaXQgaXMgbm90IHNldC4KKyAgKiAgICAgICBSaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSB0cmlnZ2VycyBjYW4gYmUgc2V0IGZvcgorICAqICAgICAgIHRoZSBzYW1lIGludGVycnVwdCBsaW5lLiBJbiB0aGlzIGNhc2UsIGJvdGggZ2VuZXJhdGUgYSB0cmlnZ2VyCisgICogICAgICAgY29uZGl0aW9uLgorICAqIEBybXRvbGwgRlRTUiAgICAgICAgRlR4ICAgICAgICAgICBMTF9FWFRJX0VuYWJsZUZhbGxpbmdUcmlnXzBfMzEKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxCisgICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9FWFRJX0VuYWJsZUZhbGxpbmdUcmlnXzBfMzEodWludDMyX3QgRXh0aUxpbmUpCit7CisgIFNFVF9CSVQoRVhUSS0+RlRTUiwgRXh0aUxpbmUpOworfQorCisjaWYgZGVmaW5lZChFWFRJXzMyXzYzX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBFeHRpTGluZSBGYWxsaW5nIEVkZ2UgVHJpZ2dlciBmb3IgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMKKyAgKiBAbm90ZSBUaGUgY29uZmlndXJhYmxlIHdha2V1cCBsaW5lcyBhcmUgZWRnZS10cmlnZ2VyZWQuIE5vIGdsaXRjaCBtdXN0IGJlCisgICogICAgICAgZ2VuZXJhdGVkIG9uIHRoZXNlIGxpbmVzLiBJZiBhIEZhbGxpbmcgZWRnZSBvbiBhIGNvbmZpZ3VyYWJsZSBpbnRlcnJ1cHQKKyAgKiAgICAgICBsaW5lIG9jY3VycyBkdXJpbmcgYSB3cml0ZSBvcGVyYXRpb24gaW4gdGhlIEVYVElfRlRTUiByZWdpc3RlciwgdGhlCisgICogICAgICAgcGVuZGluZyBiaXQgaXMgbm90IHNldC4KKyAgKiAgICAgICBSaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSB0cmlnZ2VycyBjYW4gYmUgc2V0IGZvcgorICAqICAgICAgIHRoZSBzYW1lIGludGVycnVwdCBsaW5lLiBJbiB0aGlzIGNhc2UsIGJvdGggZ2VuZXJhdGUgYSB0cmlnZ2VyCisgICogICAgICAgY29uZGl0aW9uLgorICAqIEBybXRvbGwgRlRTUjIgICAgICAgIEZUeCAgICAgICAgICAgTExfRVhUSV9FbmFibGVGYWxsaW5nVHJpZ18zMl82MworICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM4CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9FWFRJX0VuYWJsZUZhbGxpbmdUcmlnXzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBTRVRfQklUKEVYVEktPkZUU1IyLCBFeHRpTGluZSk7Cit9CisjZW5kaWYKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEV4dGlMaW5lIEZhbGxpbmcgRWRnZSBUcmlnZ2VyIGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxCisgICogQG5vdGUgVGhlIGNvbmZpZ3VyYWJsZSB3YWtldXAgbGluZXMgYXJlIGVkZ2UtdHJpZ2dlcmVkLiBObyBnbGl0Y2ggbXVzdCBiZQorICAqICAgICAgIGdlbmVyYXRlZCBvbiB0aGVzZSBsaW5lcy4gSWYgYSBGYWxsaW5nIGVkZ2Ugb24gYSBjb25maWd1cmFibGUgaW50ZXJydXB0CisgICogICAgICAgbGluZSBvY2N1cnMgZHVyaW5nIGEgd3JpdGUgb3BlcmF0aW9uIGluIHRoZSBFWFRJX0ZUU1IgcmVnaXN0ZXIsIHRoZQorICAqICAgICAgIHBlbmRpbmcgYml0IGlzIG5vdCBzZXQuCisgICogICAgICAgUmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2UgdHJpZ2dlcnMgY2FuIGJlIHNldCBmb3IgdGhlIHNhbWUgaW50ZXJydXB0IGxpbmUuCisgICogICAgICAgSW4gdGhpcyBjYXNlLCBib3RoIGdlbmVyYXRlIGEgdHJpZ2dlciBjb25kaXRpb24uCisgICogQHJtdG9sbCBGVFNSICAgICAgICBGVHggICAgICAgICAgIExMX0VYVElfRGlzYWJsZUZhbGxpbmdUcmlnXzBfMzEKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxCisgICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9FWFRJX0Rpc2FibGVGYWxsaW5nVHJpZ18wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBDTEVBUl9CSVQoRVhUSS0+RlRTUiwgRXh0aUxpbmUpOworfQorCisjaWYgZGVmaW5lZChFWFRJXzMyXzYzX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRXh0aUxpbmUgRmFsbGluZyBFZGdlIFRyaWdnZXIgZm9yIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzCisgICogQG5vdGUgVGhlIGNvbmZpZ3VyYWJsZSB3YWtldXAgbGluZXMgYXJlIGVkZ2UtdHJpZ2dlcmVkLiBObyBnbGl0Y2ggbXVzdCBiZQorICAqICAgICAgIGdlbmVyYXRlZCBvbiB0aGVzZSBsaW5lcy4gSWYgYSBGYWxsaW5nIGVkZ2Ugb24gYSBjb25maWd1cmFibGUgaW50ZXJydXB0CisgICogICAgICAgbGluZSBvY2N1cnMgZHVyaW5nIGEgd3JpdGUgb3BlcmF0aW9uIGluIHRoZSBFWFRJX0ZUU1IgcmVnaXN0ZXIsIHRoZQorICAqICAgICAgIHBlbmRpbmcgYml0IGlzIG5vdCBzZXQuCisgICogICAgICAgUmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2UgdHJpZ2dlcnMgY2FuIGJlIHNldCBmb3IgdGhlIHNhbWUgaW50ZXJydXB0IGxpbmUuCisgICogICAgICAgSW4gdGhpcyBjYXNlLCBib3RoIGdlbmVyYXRlIGEgdHJpZ2dlciBjb25kaXRpb24uCisgICogQHJtdG9sbCBGVFNSMiAgICAgICAgRlR4ICAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVGYWxsaW5nVHJpZ18zMl82MworICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM4CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9FWFRJX0Rpc2FibGVGYWxsaW5nVHJpZ18zMl82Myh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgQ0xFQVJfQklUKEVYVEktPkZUU1IyLCBFeHRpTGluZSk7Cit9CisjZW5kaWYKKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBmYWxsaW5nIGVkZ2UgdHJpZ2dlciBpcyBlbmFibGVkIGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxCisgICogQHJtdG9sbCBGVFNSICAgICAgICBGVHggICAgICAgICAgIExMX0VYVElfSXNFbmFibGVkRmFsbGluZ1RyaWdfMF8zMQorICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzEKKyAgKiBAbm90ZSAgIFBsZWFzZSBjaGVjayBlYWNoIGRldmljZSBsaW5lIG1hcHBpbmcgZm9yIEVYVEkgTGluZSBhdmFpbGFiaWxpdHkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9FWFRJX0lzRW5hYmxlZEZhbGxpbmdUcmlnXzBfMzEodWludDMyX3QgRXh0aUxpbmUpCit7CisgIHJldHVybiAoUkVBRF9CSVQoRVhUSS0+RlRTUiwgRXh0aUxpbmUpID09IChFeHRpTGluZSkpOworfQorCisjaWYgZGVmaW5lZChFWFRJXzMyXzYzX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIGZhbGxpbmcgZWRnZSB0cmlnZ2VyIGlzIGVuYWJsZWQgZm9yIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzCisgICogQHJtdG9sbCBGVFNSMiAgICAgICAgRlR4ICAgICAgICAgICBMTF9FWFRJX0lzRW5hYmxlZEZhbGxpbmdUcmlnXzMyXzYzCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzgKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9FWFRJX0lzRW5hYmxlZEZhbGxpbmdUcmlnXzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKQoreworICByZXR1cm4gKFJFQURfQklUKEVYVEktPkZUU1IyLCBFeHRpTGluZSkgPT0gKEV4dGlMaW5lKSk7Cit9CisjZW5kaWYKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBFWFRJX0xMX0VGX1NvZnR3YXJlX0ludGVycnVwdF9NYW5hZ2VtZW50IFNvZnR3YXJlX0ludGVycnVwdF9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBhIHNvZnR3YXJlIEludGVycnVwdCBFdmVudCBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQorICAqIEBub3RlIElmIHRoZSBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBvbiB0aGlzIGxpbmUgaW4gdGhlIEVYVElfSU1SLCB3cml0aW5nIGEgMSB0bworICAqICAgICAgIHRoaXMgYml0IHdoZW4gaXQgaXMgYXQgJzAnIHNldHMgdGhlIGNvcnJlc3BvbmRpbmcgcGVuZGluZyBiaXQgaW4gRVhUSV9QUgorICAqICAgICAgIHJlc3VsdGluZyBpbiBhbiBpbnRlcnJ1cHQgcmVxdWVzdCBnZW5lcmF0aW9uLgorICAqICAgICAgIFRoaXMgYml0IGlzIGNsZWFyZWQgYnkgY2xlYXJpbmcgdGhlIGNvcnJlc3BvbmRpbmcgYml0IGluIHRoZSBFWFRJX1BSCisgICogICAgICAgcmVnaXN0ZXIgKGJ5IHdyaXRpbmcgYSAxIGludG8gdGhlIGJpdCkKKyAgKiBAcm10b2xsIFNXSUVSICAgICAgIFNXSXggICAgICAgICAgTExfRVhUSV9HZW5lcmF0ZVNXSV8wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMQorICAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9HZW5lcmF0ZVNXSV8wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBTRVRfQklUKEVYVEktPlNXSUVSLCBFeHRpTGluZSk7Cit9CisKKyNpZiBkZWZpbmVkKEVYVElfMzJfNjNfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgR2VuZXJhdGUgYSBzb2Z0d2FyZSBJbnRlcnJ1cHQgRXZlbnQgZm9yIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzCisgICogQG5vdGUgSWYgdGhlIGludGVycnVwdCBpcyBlbmFibGVkIG9uIHRoaXMgbGluZSBpbnRoZSBFWFRJX0lNUjIsIHdyaXRpbmcgYSAxIHRvCisgICogICAgICAgdGhpcyBiaXQgd2hlbiBpdCBpcyBhdCAnMCcgc2V0cyB0aGUgY29ycmVzcG9uZGluZyBwZW5kaW5nIGJpdCBpbiBFWFRJX1BSMgorICAqICAgICAgIHJlc3VsdGluZyBpbiBhbiBpbnRlcnJ1cHQgcmVxdWVzdCBnZW5lcmF0aW9uLgorICAqICAgICAgIFRoaXMgYml0IGlzIGNsZWFyZWQgYnkgY2xlYXJpbmcgdGhlIGNvcnJlc3BvbmRpbmcgYml0IGluIHRoZSBFWFRJX1BSMgorICAqICAgICAgIHJlZ2lzdGVyIChieSB3cml0aW5nIGEgMSBpbnRvIHRoZSBiaXQpCisgICogQHJtdG9sbCBTV0lFUjIgICAgICAgU1dJeCAgICAgICAgICBMTF9FWFRJX0dlbmVyYXRlU1dJXzMyXzYzCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfR2VuZXJhdGVTV0lfMzJfNjModWludDMyX3QgRXh0aUxpbmUpCit7CisgIFNFVF9CSVQoRVhUSS0+U1dJRVIyLCBFeHRpTGluZSk7Cit9CisjZW5kaWYKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBFWFRJX0xMX0VGX0ZsYWdfTWFuYWdlbWVudCBGbGFnX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBFeHRMaW5lIEZsYWcgaXMgc2V0IG9yIG5vdCBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQorICAqIEBub3RlIFRoaXMgYml0IGlzIHNldCB3aGVuIHRoZSBzZWxlY3RlZCBlZGdlIGV2ZW50IGFycml2ZXMgb24gdGhlIGludGVycnVwdAorICAqICAgICAgIGxpbmUuIFRoaXMgYml0IGlzIGNsZWFyZWQgYnkgd3JpdGluZyBhIDEgdG8gdGhlIGJpdC4KKyAgKiBAcm10b2xsIFBSICAgICAgICAgIFBJRnggICAgICAgICAgIExMX0VYVElfSXNBY3RpdmVGbGFnXzBfMzEKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxCisgICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRVhUSV9Jc0FjdGl2ZUZsYWdfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChFWFRJLT5QUiwgRXh0aUxpbmUpID09IChFeHRpTGluZSkpOworfQorCisjaWYgZGVmaW5lZChFWFRJXzMyXzYzX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBFeHRMaW5lIEZsYWcgaXMgc2V0IG9yIG5vdCBmb3IgIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzCisgICogQG5vdGUgVGhpcyBiaXQgaXMgc2V0IHdoZW4gdGhlIHNlbGVjdGVkIGVkZ2UgZXZlbnQgYXJyaXZlcyBvbiB0aGUgaW50ZXJydXB0CisgICogICAgICAgbGluZS4gVGhpcyBiaXQgaXMgY2xlYXJlZCBieSB3cml0aW5nIGEgMSB0byB0aGUgYml0LgorICAqIEBybXRvbGwgUFIyICAgICAgICAgIFBJRnggICAgICAgICAgIExMX0VYVElfSXNBY3RpdmVGbGFnXzMyXzYzCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzgKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9FWFRJX0lzQWN0aXZlRmxhZ18zMl82Myh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChFWFRJLT5QUjIsIEV4dGlMaW5lKSA9PSAoRXh0aUxpbmUpKTsKK30KKyNlbmRpZgorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgRXh0TGluZSBDb21iaW5hdGlvbiBGbGFnIGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxCisgICogQG5vdGUgVGhpcyBiaXQgaXMgc2V0IHdoZW4gdGhlIHNlbGVjdGVkIGVkZ2UgZXZlbnQgYXJyaXZlcyBvbiB0aGUgaW50ZXJydXB0CisgICogICAgICAgbGluZS4gVGhpcyBiaXQgaXMgY2xlYXJlZCBieSB3cml0aW5nIGEgMSB0byB0aGUgYml0LgorICAqIEBybXRvbGwgUFIgICAgICAgICAgUElGeCAgICAgICAgICAgTExfRVhUSV9SZWFkRmxhZ18wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMQorICAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQorICAqIEByZXR2YWwgQG5vdGUgVGhpcyBiaXQgaXMgc2V0IHdoZW4gdGhlIHNlbGVjdGVkIGVkZ2UgZXZlbnQgYXJyaXZlcyBvbiB0aGUgaW50ZXJydXB0CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRVhUSV9SZWFkRmxhZ18wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChFWFRJLT5QUiwgRXh0aUxpbmUpKTsKK30KKworI2lmIGRlZmluZWQoRVhUSV8zMl82M19TVVBQT1JUKQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgRXh0TGluZSBDb21iaW5hdGlvbiBGbGFnIGZvciAgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMKKyAgKiBAbm90ZSBUaGlzIGJpdCBpcyBzZXQgd2hlbiB0aGUgc2VsZWN0ZWQgZWRnZSBldmVudCBhcnJpdmVzIG9uIHRoZSBpbnRlcnJ1cHQKKyAgKiAgICAgICBsaW5lLiBUaGlzIGJpdCBpcyBjbGVhcmVkIGJ5IHdyaXRpbmcgYSAxIHRvIHRoZSBiaXQuCisgICogQHJtdG9sbCBQUjIgICAgICAgICAgUElGeCAgICAgICAgICAgTExfRVhUSV9SZWFkRmxhZ18zMl82MworICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM4CisgICogQHJldHZhbCBAbm90ZSBUaGlzIGJpdCBpcyBzZXQgd2hlbiB0aGUgc2VsZWN0ZWQgZWRnZSBldmVudCBhcnJpdmVzIG9uIHRoZSBpbnRlcnJ1cHQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9FWFRJX1JlYWRGbGFnXzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChFWFRJLT5QUjIsIEV4dGlMaW5lKSk7Cit9CisjZW5kaWYKKworLyoqCisgICogQGJyaWVmICBDbGVhciBFeHRMaW5lIEZsYWdzICBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQorICAqIEBub3RlIFRoaXMgYml0IGlzIHNldCB3aGVuIHRoZSBzZWxlY3RlZCBlZGdlIGV2ZW50IGFycml2ZXMgb24gdGhlIGludGVycnVwdAorICAqICAgICAgIGxpbmUuIFRoaXMgYml0IGlzIGNsZWFyZWQgYnkgd3JpdGluZyBhIDEgdG8gdGhlIGJpdC4KKyAgKiBAcm10b2xsIFBSICAgICAgICAgIFBJRnggICAgICAgICAgIExMX0VYVElfQ2xlYXJGbGFnXzBfMzEKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxCisgICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9FWFRJX0NsZWFyRmxhZ18wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBXUklURV9SRUcoRVhUSS0+UFIsIEV4dGlMaW5lKTsKK30KKworI2lmIGRlZmluZWQoRVhUSV8zMl82M19TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBDbGVhciBFeHRMaW5lIEZsYWdzIGZvciAgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMKKyAgKiBAbm90ZSBUaGlzIGJpdCBpcyBzZXQgd2hlbiB0aGUgc2VsZWN0ZWQgZWRnZSBldmVudCBhcnJpdmVzIG9uIHRoZSBpbnRlcnJ1cHQKKyAgKiAgICAgICBsaW5lLiBUaGlzIGJpdCBpcyBjbGVhcmVkIGJ5IHdyaXRpbmcgYSAxIHRvIHRoZSBiaXQuCisgICogQHJtdG9sbCBQUjIgICAgICAgICAgUElGeCAgICAgICAgICAgTExfRVhUSV9DbGVhckZsYWdfMzJfNjMKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9DbGVhckZsYWdfMzJfNjModWludDMyX3QgRXh0aUxpbmUpCit7CisgIFdSSVRFX1JFRyhFWFRJLT5QUjIsIEV4dGlMaW5lKTsKK30KKyNlbmRpZgorCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIEVYVElfTExfRUZfSW5pdCBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKwordWludDMyX3QgTExfRVhUSV9Jbml0KExMX0VYVElfSW5pdFR5cGVEZWYgKkVYVElfSW5pdFN0cnVjdCk7Cit1aW50MzJfdCBMTF9FWFRJX0RlSW5pdCh2b2lkKTsKK3ZvaWQgTExfRVhUSV9TdHJ1Y3RJbml0KExMX0VYVElfSW5pdFR5cGVEZWYgKkVYVElfSW5pdFN0cnVjdCk7CisKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEVYVEkgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJGM3h4X0xMX0VYVElfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjN4eF9sbF9mbWMuaCBiL0luYy9zdG0zMmYzeHhfbGxfZm1jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdlNDVkNQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmYzeHhfbGxfZm1jLmgKQEAgLTAsMCArMSwxMDgyIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2xsX2ZtYy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBGTUMgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0xMX0ZNQ19ICisjZGVmaW5lIF9fU1RNMzJGM3h4X0xMX0ZNQ19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChGTUNfQkFOSzEpCisKKy8qKiBAYWRkdG9ncm91cCBGTUNfTEwKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgRk1DX0xMX1ByaXZhdGVfTWFjcm9zCisgICogQHsKKyAgKi8KKworI2RlZmluZSBJU19GTUNfTk9SU1JBTV9CQU5LKF9fQkFOS19fKSAoKChfX0JBTktfXykgPT0gRk1DX05PUlNSQU1fQkFOSzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQkFOS19fKSA9PSBGTUNfTk9SU1JBTV9CQU5LMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQU5LX18pID09IEZNQ19OT1JTUkFNX0JBTkszKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBTktfXykgPT0gRk1DX05PUlNSQU1fQkFOSzQpKQorCisjZGVmaW5lIElTX0ZNQ19NVVgoX19NVVhfXykgKCgoX19NVVhfXykgPT0gRk1DX0RBVEFfQUREUkVTU19NVVhfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01VWF9fKSA9PSBGTUNfREFUQV9BRERSRVNTX01VWF9FTkFCTEUpKQorCisjZGVmaW5lIElTX0ZNQ19NRU1PUlkoX19NRU1PUllfXykgKCgoX19NRU1PUllfXykgPT0gRk1DX01FTU9SWV9UWVBFX1NSQU0pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NRU1PUllfXykgPT0gRk1DX01FTU9SWV9UWVBFX1BTUkFNKXx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NRU1PUllfXykgPT0gRk1DX01FTU9SWV9UWVBFX05PUikpCisKKyNkZWZpbmUgSVNfRk1DX05PUlNSQU1fTUVNT1JZX1dJRFRIKF9fV0lEVEhfXykgKCgoX19XSURUSF9fKSA9PSBGTUNfTk9SU1JBTV9NRU1fQlVTX1dJRFRIXzgpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1dJRFRIX18pID09IEZNQ19OT1JTUkFNX01FTV9CVVNfV0lEVEhfMTYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fV0lEVEhfXykgPT0gRk1DX05PUlNSQU1fTUVNX0JVU19XSURUSF8zMikpCisKKyNkZWZpbmUgSVNfRk1DX1dSSVRFX0JVUlNUKF9fQlVSU1RfXykgICAgICAgICAgKCgoX19CVVJTVF9fKSA9PSBGTUNfV1JJVEVfQlVSU1RfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JVUlNUX18pID09IEZNQ19XUklURV9CVVJTVF9FTkFCTEUpKQorCisjZGVmaW5lIElTX0ZNQ19DT05USU5PVVNfQ0xPQ0soX19DQ0xPQ0tfXykgICAgICgoKF9fQ0NMT0NLX18pID09IEZNQ19DT05USU5VT1VTX0NMT0NLX1NZTkNfT05MWSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NDTE9DS19fKSA9PSBGTUNfQ09OVElOVU9VU19DTE9DS19TWU5DX0FTWU5DKSkKKworI2RlZmluZSBJU19GTUNfQUNDRVNTX01PREUoX19NT0RFX18pICgoKF9fTU9ERV9fKSA9PSBGTUNfQUNDRVNTX01PREVfQSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gRk1DX0FDQ0VTU19NT0RFX0IpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IEZNQ19BQ0NFU1NfTU9ERV9DKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBGTUNfQUNDRVNTX01PREVfRCkpCisKKyNkZWZpbmUgSVNfRk1DX05BTkRfQkFOSyhfX0JBTktfXykgKCgoX19CQU5LX18pID09IEZNQ19OQU5EX0JBTksyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQU5LX18pID09IEZNQ19OQU5EX0JBTkszKSkKKworI2RlZmluZSBJU19GTUNfV0FJVF9GRUFUVVJFKF9fRkVBVFVSRV9fKSAoKChfX0ZFQVRVUkVfXykgPT0gRk1DX05BTkRfUENDX1dBSVRfRkVBVFVSRV9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19GRUFUVVJFX18pID09IEZNQ19OQU5EX1BDQ19XQUlUX0ZFQVRVUkVfRU5BQkxFKSkKKworI2RlZmluZSBJU19GTUNfTkFORF9NRU1PUllfV0lEVEgoX19XSURUSF9fKSAoKChfX1dJRFRIX18pID09IEZNQ19OQU5EX1BDQ19NRU1fQlVTX1dJRFRIXzgpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1dJRFRIX18pID09IEZNQ19OQU5EX1BDQ19NRU1fQlVTX1dJRFRIXzE2KSkKKworI2RlZmluZSBJU19GTUNfRUNDX1NUQVRFKF9fU1RBVEVfXykgKCgoX19TVEFURV9fKSA9PSBGTUNfTkFORF9FQ0NfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUQVRFX18pID09IEZNQ19OQU5EX0VDQ19FTkFCTEUpKQorCisjZGVmaW5lIElTX0ZNQ19FQ0NQQUdFX1NJWkUoX19TSVpFX18pICgoKF9fU0laRV9fKSA9PSBGTUNfTkFORF9FQ0NfUEFHRV9TSVpFXzI1NkJZVEUpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TSVpFX18pID09IEZNQ19OQU5EX0VDQ19QQUdFX1NJWkVfNTEyQllURSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NJWkVfXykgPT0gRk1DX05BTkRfRUNDX1BBR0VfU0laRV8xMDI0QllURSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0laRV9fKSA9PSBGTUNfTkFORF9FQ0NfUEFHRV9TSVpFXzIwNDhCWVRFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TSVpFX18pID09IEZNQ19OQU5EX0VDQ19QQUdFX1NJWkVfNDA5NkJZVEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NJWkVfXykgPT0gRk1DX05BTkRfRUNDX1BBR0VfU0laRV84MTkyQllURSkpCisKKy8qKiBAZGVmZ3JvdXAgRk1DX1RDTFJfU2V0dXBfVGltZSBGTUNfVENMUl9TZXR1cF9UaW1lCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfRk1DX1RDTFJfVElNRShfX1RJTUVfXykgKChfX1RJTUVfXykgPD0gMjU1KQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTUNfVEFSX1NldHVwX1RpbWUgRk1DX1RBUl9TZXR1cF9UaW1lCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfRk1DX1RBUl9USU1FKF9fVElNRV9fKSAoKF9fVElNRV9fKSA8PSAyNTUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZNQ19TZXR1cF9UaW1lIEZNQ19TZXR1cF9UaW1lCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfRk1DX1NFVFVQX1RJTUUoX19USU1FX18pICgoX19USU1FX18pIDw9IDI1NSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRk1DX1dhaXRfU2V0dXBfVGltZSBGTUNfV2FpdF9TZXR1cF9UaW1lCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfRk1DX1dBSVRfVElNRShfX1RJTUVfXykgKChfX1RJTUVfXykgPD0gMjU1KQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTUNfSG9sZF9TZXR1cF9UaW1lIEZNQ19Ib2xkX1NldHVwX1RpbWUKKyAgKiBAeworICAqLworI2RlZmluZSBJU19GTUNfSE9MRF9USU1FKF9fVElNRV9fKSAoKF9fVElNRV9fKSA8PSAyNTUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZNQ19IaVpfU2V0dXBfVGltZSBGTUNfSGlaX1NldHVwX1RpbWUKKyAgKiBAeworICAqLworI2RlZmluZSBJU19GTUNfSElaX1RJTUUoX19USU1FX18pICgoX19USU1FX18pIDw9IDI1NSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRk1DX05PUlNSQU1fRGV2aWNlX0luc3RhbmNlIEZNQyBOT1IvU1JBTSBEZXZpY2UgSW5zdGFuY2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX0ZNQ19OT1JTUkFNX0RFVklDRShfX0lOU1RBTkNFX18pICgoX19JTlNUQU5DRV9fKSA9PSBGTUNfTk9SU1JBTV9ERVZJQ0UpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRk1DX05PUlNSQU1fRVhURU5ERURfRGV2aWNlX0luc3RhbmNlIEZNQyBOT1IvU1JBTSBFWFRFTkRFRCBEZXZpY2UgSW5zdGFuY2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX0ZNQ19OT1JTUkFNX0VYVEVOREVEX0RFVklDRShfX0lOU1RBTkNFX18pICgoX19JTlNUQU5DRV9fKSA9PSBGTUNfTk9SU1JBTV9FWFRFTkRFRF9ERVZJQ0UpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRk1DX05BTkRfRGV2aWNlX0luc3RhbmNlIEZNQyBOQU5EIERldmljZSBJbnN0YW5jZQorICAqIEB7CisgICovCisjZGVmaW5lIElTX0ZNQ19OQU5EX0RFVklDRShfX0lOU1RBTkNFX18pICgoX19JTlNUQU5DRV9fKSA9PSBGTUNfTkFORF9ERVZJQ0UpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZNQ19QQ0NBUkRfRGV2aWNlX0luc3RhbmNlIEZNQyBQQ0NBUkQgRGV2aWNlIEluc3RhbmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfRk1DX1BDQ0FSRF9ERVZJQ0UoX19JTlNUQU5DRV9fKSAoKF9fSU5TVEFOQ0VfXykgPT0gRk1DX1BDQ0FSRF9ERVZJQ0UpCisKKy8qKgorICAqIEB9CisgICovCisjZGVmaW5lIElTX0ZNQ19CVVJTVE1PREUoX19TVEFURV9fKSAoKChfX1NUQVRFX18pID09IEZNQ19CVVJTVF9BQ0NFU1NfTU9ERV9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TVEFURV9fKSA9PSBGTUNfQlVSU1RfQUNDRVNTX01PREVfRU5BQkxFKSkKKworI2RlZmluZSBJU19GTUNfV0FJVF9QT0xBUklUWShfX1BPTEFSSVRZX18pICgoKF9fUE9MQVJJVFlfXykgPT0gRk1DX1dBSVRfU0lHTkFMX1BPTEFSSVRZX0xPVykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IEZNQ19XQUlUX1NJR05BTF9QT0xBUklUWV9ISUdIKSkKKworI2RlZmluZSBJU19GTUNfV1JBUF9NT0RFKF9fTU9ERV9fKSAoKChfX01PREVfXykgPT0gRk1DX1dSQVBfTU9ERV9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gRk1DX1dSQVBfTU9ERV9FTkFCTEUpKQorCisjZGVmaW5lIElTX0ZNQ19XQUlUX1NJR05BTF9BQ1RJVkUoX19BQ1RJVkVfXykgKCgoX19BQ1RJVkVfXykgPT0gRk1DX1dBSVRfVElNSU5HX0JFRk9SRV9XUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0FDVElWRV9fKSA9PSBGTUNfV0FJVF9USU1JTkdfRFVSSU5HX1dTKSkKKworI2RlZmluZSBJU19GTUNfV1JJVEVfT1BFUkFUSU9OKF9fT1BFUkFUSU9OX18pICgoKF9fT1BFUkFUSU9OX18pID09IEZNQ19XUklURV9PUEVSQVRJT05fRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX09QRVJBVElPTl9fKSA9PSBGTUNfV1JJVEVfT1BFUkFUSU9OX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfRk1DX1dBSVRFX1NJR05BTChfX1NJR05BTF9fKSAoKChfX1NJR05BTF9fKSA9PSBGTUNfV0FJVF9TSUdOQUxfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NJR05BTF9fKSA9PSBGTUNfV0FJVF9TSUdOQUxfRU5BQkxFKSkKKworI2RlZmluZSBJU19GTUNfRVhURU5ERURfTU9ERShfX01PREVfXykgKCgoX19NT0RFX18pID09IEZNQ19FWFRFTkRFRF9NT0RFX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gRk1DX0VYVEVOREVEX01PREVfRU5BQkxFKSkKKworI2RlZmluZSBJU19GTUNfQVNZTldBSVQoX19TVEFURV9fKSAoKChfX1NUQVRFX18pID09IEZNQ19BU1lOQ0hST05PVVNfV0FJVF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUQVRFX18pID09IEZNQ19BU1lOQ0hST05PVVNfV0FJVF9FTkFCTEUpKQorCisjZGVmaW5lIElTX0ZNQ19DTEtfRElWKF9fRElWX18pICgoKF9fRElWX18pID4gMSkgJiYgKChfX0RJVl9fKSA8PSAxNikpCisKKy8qKiBAZGVmZ3JvdXAgRk1DX0RhdGFfTGF0ZW5jeSBGTUMgRGF0YSBMYXRlbmN5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfRk1DX0RBVEFfTEFURU5DWShfX0xBVEVOQ1lfXykgKCgoX19MQVRFTkNZX18pID4gMSkgJiYgKChfX0xBVEVOQ1lfXykgPD0gMTcpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTUNfQWRkcmVzc19TZXR1cF9UaW1lIEZNQyBBZGRyZXNzIFNldHVwIFRpbWUKKyAgKiBAeworICAqLworI2RlZmluZSBJU19GTUNfQUREUkVTU19TRVRVUF9USU1FKF9fVElNRV9fKSAoKF9fVElNRV9fKSA8PSAxNSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRk1DX0FkZHJlc3NfSG9sZF9UaW1lIEZNQyBBZGRyZXNzIEhvbGQgVGltZQorICAqIEB7CisgICovCisjZGVmaW5lIElTX0ZNQ19BRERSRVNTX0hPTERfVElNRShfX1RJTUVfXykgKCgoX19USU1FX18pID4gMCkgJiYgKChfX1RJTUVfXykgPD0gMTUpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTUNfRGF0YV9TZXR1cF9UaW1lIEZNQyBEYXRhIFNldHVwIFRpbWUKKyAgKiBAeworICAqLworI2RlZmluZSBJU19GTUNfREFUQVNFVFVQX1RJTUUoX19USU1FX18pICgoKF9fVElNRV9fKSA+IDApICYmICgoX19USU1FX18pIDw9IDI1NSkpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZNQ19CdXNfVHVybl9hcm91bmRfRHVyYXRpb24gRk1DIEJ1cyBUdXJuIGFyb3VuZCBEdXJhdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIElTX0ZNQ19UVVJOQVJPVU5EX1RJTUUoX19USU1FX18pICgoX19USU1FX18pIDw9IDE1KQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBGTUNfTk9SU1JBTV9FeHBvcnRlZF90eXBlZGVmIEZNQyBMb3cgTGF5ZXIgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisjZGVmaW5lIEZNQ19OT1JTUkFNX1R5cGVEZWYgICAgICAgICAgICBGTUNfQmFuazFfVHlwZURlZgorI2RlZmluZSBGTUNfTk9SU1JBTV9FWFRFTkRFRF9UeXBlRGVmICAgRk1DX0JhbmsxRV9UeXBlRGVmCisjZGVmaW5lIEZNQ19OQU5EX1R5cGVEZWYgICAgICAgICAgICAgICBGTUNfQmFuazJfM19UeXBlRGVmCisjZGVmaW5lIEZNQ19QQ0NBUkRfVHlwZURlZiAgICAgICAgICAgICBGTUNfQmFuazRfVHlwZURlZgorCisjZGVmaW5lIEZNQ19OT1JTUkFNX0RFVklDRSAgICAgICAgICAgICBGTUNfQmFuazEKKyNkZWZpbmUgRk1DX05PUlNSQU1fRVhURU5ERURfREVWSUNFICAgIEZNQ19CYW5rMUUKKyNkZWZpbmUgRk1DX05BTkRfREVWSUNFICAgICAgICAgICAgICAgIEZNQ19CYW5rMl8zCisjZGVmaW5lIEZNQ19QQ0NBUkRfREVWSUNFICAgICAgICAgICAgICBGTUNfQmFuazQKKworLyoqCisgICogQGJyaWVmICBGTUNfTk9SU1JBTSBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBOU0Jhbms7ICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgTk9SU1JBTSBtZW1vcnkgZGV2aWNlIHRoYXQgd2lsbCBiZSB1c2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRk1DX05PUlNSQU1fQmFuayAgICAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgRGF0YUFkZHJlc3NNdXg7ICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgYWRkcmVzcyBhbmQgZGF0YSB2YWx1ZXMgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGV4ZWQgb24gdGhlIGRhdGEgYnVzIG9yIG5vdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZNQ19EYXRhX0FkZHJlc3NfQnVzX011bHRpcGxleGluZyAgICAqLworCisgIHVpbnQzMl90IE1lbW9yeVR5cGU7ICAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSB0eXBlIG9mIGV4dGVybmFsIG1lbW9yeSBhdHRhY2hlZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZXNwb25kaW5nIG1lbW9yeSBkZXZpY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGTUNfTWVtb3J5X1R5cGUgICAgICAgICAgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBNZW1vcnlEYXRhV2lkdGg7ICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZXh0ZXJuYWwgbWVtb3J5IGRldmljZSB3aWR0aC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZNQ19OT1JTUkFNX0RhdGFfV2lkdGggICAgICAgICAgICAgICAqLworCisgIHVpbnQzMl90IEJ1cnN0QWNjZXNzTW9kZTsgICAgICAgICAgICAgIC8qITwgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgYnVyc3QgYWNjZXNzIG1vZGUgZm9yIEZsYXNoIG1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBvbmx5IHdpdGggc3luY2hyb25vdXMgYnVyc3QgRmxhc2ggbWVtb3JpZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGTUNfQnVyc3RfQWNjZXNzX01vZGUgICAgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBXYWl0U2lnbmFsUG9sYXJpdHk7ICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgd2FpdCBzaWduYWwgcG9sYXJpdHksIHZhbGlkIG9ubHkgd2hlbiBhY2Nlc3NpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgRmxhc2ggbWVtb3J5IGluIGJ1cnN0IG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGTUNfV2FpdF9TaWduYWxfUG9sYXJpdHkgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBXcmFwTW9kZTsgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFdyYXBwZWQgYnVyc3QgYWNjZXNzIG1vZGUgZm9yIEZsYXNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LCB2YWxpZCBvbmx5IHdoZW4gYWNjZXNzaW5nIEZsYXNoIG1lbW9yaWVzIGluIGJ1cnN0IG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGTUNfV3JhcF9Nb2RlICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBXYWl0U2lnbmFsQWN0aXZlOyAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyBpZiB0aGUgd2FpdCBzaWduYWwgaXMgYXNzZXJ0ZWQgYnkgdGhlIG1lbW9yeSBvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9jayBjeWNsZSBiZWZvcmUgdGhlIHdhaXQgc3RhdGUgb3IgZHVyaW5nIHRoZSB3YWl0IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIG9ubHkgd2hlbiBhY2Nlc3NpbmcgbWVtb3JpZXMgaW4gYnVyc3QgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZNQ19XYWl0X1RpbWluZyAgICAgICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQzMl90IFdyaXRlT3BlcmF0aW9uOyAgICAgICAgICAgICAgIC8qITwgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgd3JpdGUgb3BlcmF0aW9uIGluIHRoZSBzZWxlY3RlZCBkZXZpY2UgYnkgdGhlIEZNQy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZNQ19Xcml0ZV9PcGVyYXRpb24gICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQzMl90IFdhaXRTaWduYWw7ICAgICAgICAgICAgICAgICAgIC8qITwgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgd2FpdCBzdGF0ZSBpbnNlcnRpb24gdmlhIHdhaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWwsIHZhbGlkIGZvciBGbGFzaCBtZW1vcnkgYWNjZXNzIGluIGJ1cnN0IG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGTUNfV2FpdF9TaWduYWwgICAgICAgICAgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBFeHRlbmRlZE1vZGU7ICAgICAgICAgICAgICAgICAvKiE8IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGV4dGVuZGVkIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGTUNfRXh0ZW5kZWRfTW9kZSAgICAgICAgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBBc3luY2hyb25vdXNXYWl0OyAgICAgICAgICAgICAvKiE8IEVuYWJsZXMgb3IgZGlzYWJsZXMgd2FpdCBzaWduYWwgZHVyaW5nIGFzeW5jaHJvbm91cyB0cmFuc2ZlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgb25seSB3aXRoIGFzeW5jaHJvbm91cyBGbGFzaCBtZW1vcmllcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZNQ19Bc3luY2hyb25vdXNXYWl0ICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQzMl90IFdyaXRlQnVyc3Q7ICAgICAgICAgICAgICAgICAgIC8qITwgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgd3JpdGUgYnVyc3Qgb3BlcmF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRk1DX1dyaXRlX0J1cnN0ICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgQ29udGludW91c0Nsb2NrOyAgICAgICAgICAgICAgLyohPCBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBGTUMgY2xvY2sgb3V0cHV0IHRvIGV4dGVybmFsIG1lbW9yeSBkZXZpY2VzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIG9ubHkgZW5hYmxlZCB0aHJvdWdoIHRoZSBGTUNfQkNSMSByZWdpc3RlciwgYW5kIGRvbid0IGNhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdWdoIEZNQ19CQ1IyLi40IHJlZ2lzdGVycy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZNQ19Db250aW5vdXNfQ2xvY2sgICAgICAgICAgICAgICAgICAqLworCit9Rk1DX05PUlNSQU1fSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgRk1DX05PUlNSQU0gVGltaW5nIHBhcmFtZXRlcnMgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IEFkZHJlc3NTZXR1cFRpbWU7ICAgICAgICAgICAgIC8qITwgRGVmaW5lcyB0aGUgbnVtYmVyIG9mIEhDTEsgY3ljbGVzIHRvIGNvbmZpZ3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkdXJhdGlvbiBvZiB0aGUgYWRkcmVzcyBzZXR1cCB0aW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDE1LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgcGFyYW1ldGVyIGlzIG5vdCB1c2VkIHdpdGggc3luY2hyb25vdXMgTk9SIEZsYXNoIG1lbW9yaWVzLiAgICAgICovCisKKyAgdWludDMyX3QgQWRkcmVzc0hvbGRUaW1lOyAgICAgICAgICAgICAgLyohPCBEZWZpbmVzIHRoZSBudW1iZXIgb2YgSENMSyBjeWNsZXMgdG8gY29uZmlndXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGR1cmF0aW9uIG9mIHRoZSBhZGRyZXNzIGhvbGQgdGltZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhID0gMSBhbmQgTWF4X0RhdGEgPSAxNS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIHBhcmFtZXRlciBpcyBub3QgdXNlZCB3aXRoIHN5bmNocm9ub3VzIE5PUiBGbGFzaCBtZW1vcmllcy4gICAgICAqLworCisgIHVpbnQzMl90IERhdGFTZXR1cFRpbWU7ICAgICAgICAgICAgICAgIC8qITwgRGVmaW5lcyB0aGUgbnVtYmVyIG9mIEhDTEsgY3ljbGVzIHRvIGNvbmZpZ3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkdXJhdGlvbiBvZiB0aGUgZGF0YSBzZXR1cCB0aW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIGJldHdlZW4gTWluX0RhdGEgPSAxIGFuZCBNYXhfRGF0YSA9IDI1NS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIGZvciBTUkFNcywgUk9NcyBhbmQgYXN5bmNocm9ub3VzIG11bHRpcGxleGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9SIEZsYXNoIG1lbW9yaWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBCdXNUdXJuQXJvdW5kRHVyYXRpb247ICAgICAgICAvKiE8IERlZmluZXMgdGhlIG51bWJlciBvZiBIQ0xLIGN5Y2xlcyB0byBjb25maWd1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZHVyYXRpb24gb2YgdGhlIGJ1cyB0dXJuYXJvdW5kLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDE1LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgcGFyYW1ldGVyIGlzIG9ubHkgdXNlZCBmb3IgbXVsdGlwbGV4ZWQgTk9SIEZsYXNoIG1lbW9yaWVzLiAgICAgICovCisKKyAgdWludDMyX3QgQ0xLRGl2aXNpb247ICAgICAgICAgICAgICAgICAgLyohPCBEZWZpbmVzIHRoZSBwZXJpb2Qgb2YgQ0xLIGNsb2NrIG91dHB1dCBzaWduYWwsIGV4cHJlc3NlZCBpbiBudW1iZXIgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQ0xLIGN5Y2xlcy4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YSA9IDIgYW5kIE1heF9EYXRhID0gMTYuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHVzZWQgZm9yIGFzeW5jaHJvbm91cyBOT1IgRmxhc2gsIFNSQU0gb3IgUk9NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBEYXRhTGF0ZW5jeTsgICAgICAgICAgICAgICAgICAvKiE8IERlZmluZXMgdGhlIG51bWJlciBvZiBtZW1vcnkgY2xvY2sgY3ljbGVzIHRvIGlzc3VlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIG1lbW9yeSBiZWZvcmUgZ2V0dGluZyB0aGUgZmlyc3QgZGF0YS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcGFyYW1ldGVyIHZhbHVlIGRlcGVuZHMgb24gdGhlIG1lbW9yeSB0eXBlIGFzIHNob3duIGJlbG93OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gSXQgbXVzdCBiZSBzZXQgdG8gMCBpbiBjYXNlIG9mIGEgQ1JBTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gSXQgaXMgZG9uJ3QgY2FyZSBpbiBhc3luY2hyb25vdXMgTk9SLCBTUkFNIG9yIFJPTSBhY2Nlc3NlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gSXQgbWF5IGFzc3VtZSBhIHZhbHVlIGJldHdlZW4gTWluX0RhdGEgPSAyIGFuZCBNYXhfRGF0YSA9IDE3IGluIE5PUiBGbGFzaCBtZW1vcmllcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBzeW5jaHJvbm91cyBidXJzdCBtb2RlIGVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgQWNjZXNzTW9kZTsgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGFzeW5jaHJvbm91cyBhY2Nlc3MgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZNQ19BY2Nlc3NfTW9kZSAgICAgICAgICAgICAgICAgICAgICAqLworCit9Rk1DX05PUlNSQU1fVGltaW5nVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBGTUNfTkFORCBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBOYW5kQmFuazsgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgTkFORCBtZW1vcnkgZGV2aWNlIHRoYXQgd2lsbCBiZSB1c2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRk1DX05BTkRfQmFuayAgICAgICAgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBXYWl0ZmVhdHVyZTsgICAgICAgICAgICAvKiE8IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFdhaXQgZmVhdHVyZSBmb3IgdGhlIE5BTkQgTWVtb3J5IGRldmljZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgRk1DX1dhaXRfZmVhdHVyZSAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgTWVtb3J5RGF0YVdpZHRoOyAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGV4dGVybmFsIG1lbW9yeSBkZXZpY2Ugd2lkdGguCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBvZiBAcmVmIEZNQ19OQU5EX0RhdGFfV2lkdGggICAgICAgICAgICAqLworCisgIHVpbnQzMl90IEVjY0NvbXB1dGF0aW9uOyAgICAgICAgIC8qITwgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgRUNDIGNvbXB1dGF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgb2YgQHJlZiBGTUNfRUNDICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBFQ0NQYWdlU2l6ZTsgICAgICAgICAgICAvKiE8IERlZmluZXMgdGhlIHBhZ2Ugc2l6ZSBmb3IgdGhlIGV4dGVuZGVkIEVDQy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgRk1DX0VDQ19QYWdlX1NpemUgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgVENMUlNldHVwVGltZTsgICAgICAgICAgLyohPCBEZWZpbmVzIHRoZSBudW1iZXIgb2YgSENMSyBjeWNsZXMgdG8gY29uZmlndXJlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5IGJldHdlZW4gQ0xFIGxvdyBhbmQgUkUgbG93LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDI1NSAgKi8KKworICB1aW50MzJfdCBUQVJTZXR1cFRpbWU7ICAgICAgICAgICAvKiE8IERlZmluZXMgdGhlIG51bWJlciBvZiBIQ0xLIGN5Y2xlcyB0byBjb25maWd1cmUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXkgYmV0d2VlbiBBTEUgbG93IGFuZCBSRSBsb3cuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDI1NSAqLworCit9Rk1DX05BTkRfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgRk1DX05BTkRfUENDIFRpbWluZyBwYXJhbWV0ZXJzIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBTZXR1cFRpbWU7ICAgICAgICAgICAgLyohPCBEZWZpbmVzIHRoZSBudW1iZXIgb2YgSENMSyBjeWNsZXMgdG8gc2V0dXAgYWRkcmVzcyBiZWZvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbW1hbmQgYXNzZXJ0aW9uIGZvciBOQU5ELUZsYXNoIHJlYWQgb3Igd3JpdGUgYWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGNvbW1vbi9BdHRyaWJ1dGUgb3IgSS9PIG1lbW9yeSBzcGFjZSAoZGVwZW5kaW5nIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtZW1vcnkgc3BhY2UgdGltaW5nIHRvIGJlIGNvbmZpZ3VyZWQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAyNTUgICAgKi8KKworICB1aW50MzJfdCBXYWl0U2V0dXBUaW1lOyAgICAgICAgLyohPCBEZWZpbmVzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBIQ0xLIGN5Y2xlcyB0byBhc3NlcnQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgZm9yIE5BTkQtRmxhc2ggcmVhZCBvciB3cml0ZSBhY2Nlc3MgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uL0F0dHJpYnV0ZSBvciBJL08gbWVtb3J5IHNwYWNlIChkZXBlbmRpbmcgb24gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSBzcGFjZSB0aW1pbmcgdG8gYmUgY29uZmlndXJlZCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAyNTUgICAqLworCisgIHVpbnQzMl90IEhvbGRTZXR1cFRpbWU7ICAgICAgICAvKiE8IERlZmluZXMgdGhlIG51bWJlciBvZiBIQ0xLIGNsb2NrIGN5Y2xlcyB0byBob2xkIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBkYXRhIGZvciB3cml0ZSBhY2Nlc3MpIGFmdGVyIHRoZSBjb21tYW5kIGRlLWFzc2VydGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgTkFORC1GbGFzaCByZWFkIG9yIHdyaXRlIGFjY2VzcyB0byBjb21tb24vQXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIEkvTyBtZW1vcnkgc3BhY2UgKGRlcGVuZGluZyBvbiB0aGUgbWVtb3J5IHNwYWNlIHRpbWluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBjb25maWd1cmVkKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDI1NSAgICovCisKKyAgdWludDMyX3QgSGlaU2V0dXBUaW1lOyAgICAgICAgIC8qITwgRGVmaW5lcyB0aGUgbnVtYmVyIG9mIEhDTEsgY2xvY2sgY3ljbGVzIGR1cmluZyB3aGljaCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBidXMgaXMga2VwdCBpbiBIaVogYWZ0ZXIgdGhlIHN0YXJ0IG9mIGEgTkFORC1GbGFzaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZSBhY2Nlc3MgdG8gY29tbW9uL0F0dHJpYnV0ZSBvciBJL08gbWVtb3J5IHNwYWNlIChkZXBlbmRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIG1lbW9yeSBzcGFjZSB0aW1pbmcgdG8gYmUgY29uZmlndXJlZCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAyNTUgICAqLworCit9Rk1DX05BTkRfUENDX1RpbWluZ1R5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgRk1DX05BTkQgQ29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgV2FpdGZlYXR1cmU7ICAgICAgICAgICAgLyohPCBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBXYWl0IGZlYXR1cmUgZm9yIHRoZSBQQ0NBUkQgTWVtb3J5IGRldmljZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgRk1DX1dhaXRfZmVhdHVyZSAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgVENMUlNldHVwVGltZTsgICAgICAgICAgLyohPCBEZWZpbmVzIHRoZSBudW1iZXIgb2YgSENMSyBjeWNsZXMgdG8gY29uZmlndXJlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5IGJldHdlZW4gQ0xFIGxvdyBhbmQgUkUgbG93LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDI1NSAgKi8KKworICB1aW50MzJfdCBUQVJTZXR1cFRpbWU7ICAgICAgICAgICAvKiE8IERlZmluZXMgdGhlIG51bWJlciBvZiBIQ0xLIGN5Y2xlcyB0byBjb25maWd1cmUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXkgYmV0d2VlbiBBTEUgbG93IGFuZCBSRSBsb3cuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDI1NSAqLworCit9Rk1DX1BDQ0FSRF9Jbml0VHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBGTUNfRXhwb3J0ZWRfQ29uc3RhbnRzIEZNQyBMb3cgTGF5ZXIgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBGTUNfTk9SU1JBTV9FeHBvcnRlZF9jb25zdGFudHMgRk1DIE5PUi9TUkFNIEV4cG9ydGVkIGNvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRk1DX05PUlNSQU1fQmFuayBGTUMgTk9SL1NSQU0gQmFuaworICAqIEB7CisgICovCisjZGVmaW5lIEZNQ19OT1JTUkFNX0JBTksxICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApCisjZGVmaW5lIEZNQ19OT1JTUkFNX0JBTksyICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDIpCisjZGVmaW5lIEZNQ19OT1JTUkFNX0JBTkszICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDQpCisjZGVmaW5lIEZNQ19OT1JTUkFNX0JBTks0ICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDYpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRk1DX0RhdGFfQWRkcmVzc19CdXNfTXVsdGlwbGV4aW5nIEZNQyBEYXRhIEFkZHJlc3MgQnVzIE11bHRpcGxleGluZworICAqIEB7CisgICovCisKKyNkZWZpbmUgRk1DX0RBVEFfQUREUkVTU19NVVhfRElTQUJMRSAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkKKyNkZWZpbmUgRk1DX0RBVEFfQUREUkVTU19NVVhfRU5BQkxFICAgICAgICAgICAgICgodWludDMyX3QpRk1DX0JDUnhfTVVYRU4pCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRk1DX01lbW9yeV9UeXBlIEZNQyBNZW1vcnkgVHlwZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgRk1DX01FTU9SWV9UWVBFX1NSQU0gICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkKKyNkZWZpbmUgRk1DX01FTU9SWV9UWVBFX1BTUkFNICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpRk1DX0JDUnhfTVRZUF8wKQorI2RlZmluZSBGTUNfTUVNT1JZX1RZUEVfTk9SICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClGTUNfQkNSeF9NVFlQXzEpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRk1DX05PUlNSQU1fRGF0YV9XaWR0aCBGTUMgTk9SL1NSQU0gRGF0YSBXaWR0aAorICAqIEB7CisgICovCisKKyNkZWZpbmUgRk1DX05PUlNSQU1fTUVNX0JVU19XSURUSF84ICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkKKyNkZWZpbmUgRk1DX05PUlNSQU1fTUVNX0JVU19XSURUSF8xNiAgICAgICAgICAgICgodWludDMyX3QpRk1DX0JDUnhfTVdJRF8wKQorI2RlZmluZSBGTUNfTk9SU1JBTV9NRU1fQlVTX1dJRFRIXzMyICAgICAgICAgICAgKCh1aW50MzJfdClGTUNfQkNSeF9NV0lEXzEpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRk1DX05PUlNSQU1fRmxhc2hfQWNjZXNzIEZNQyBOT1IvU1JBTSBGbGFzaCBBY2Nlc3MKKyAgKiBAeworICAqLworCisjZGVmaW5lIEZNQ19OT1JTUkFNX0ZMQVNIX0FDQ0VTU19FTkFCTEUgICAgICAgICAoKHVpbnQzMl90KUZNQ19CQ1J4X0ZBQ0NFTikKKyNkZWZpbmUgRk1DX05PUlNSQU1fRkxBU0hfQUNDRVNTX0RJU0FCTEUgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRk1DX0J1cnN0X0FjY2Vzc19Nb2RlIEZNQyBCdXJzdCBBY2Nlc3MgTW9kZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgRk1DX0JVUlNUX0FDQ0VTU19NT0RFX0RJU0FCTEUgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkKKyNkZWZpbmUgRk1DX0JVUlNUX0FDQ0VTU19NT0RFX0VOQUJMRSAgICAgICAgICAgICgodWludDMyX3QpRk1DX0JDUnhfQlVSU1RFTikKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIEZNQ19XYWl0X1NpZ25hbF9Qb2xhcml0eSBGTUMgV2FpdCBTaWduYWwgUG9sYXJpdHkKKyAgKiBAeworICAqLworCisjZGVmaW5lIEZNQ19XQUlUX1NJR05BTF9QT0xBUklUWV9MT1cgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApCisjZGVmaW5lIEZNQ19XQUlUX1NJR05BTF9QT0xBUklUWV9ISUdIICAgICAgICAgICAoKHVpbnQzMl90KUZNQ19CQ1J4X1dBSVRQT0wpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRk1DX1dyYXBfTW9kZSBGTUMgV3JhcCBNb2RlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBGTUNfV1JBUF9NT0RFX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwKQorI2RlZmluZSBGTUNfV1JBUF9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClGTUNfQkNSeF9XUkFQTU9EKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZNQ19XYWl0X1RpbWluZyBGTUMgV2FpdCBUaW1pbmcKKyAgKiBAeworICAqLworCisjZGVmaW5lIEZNQ19XQUlUX1RJTUlOR19CRUZPUkVfV1MgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApCisjZGVmaW5lIEZNQ19XQUlUX1RJTUlOR19EVVJJTkdfV1MgICAgICAgICAgICAgICAoKHVpbnQzMl90KUZNQ19CQ1J4X1dBSVRDRkcpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRk1DX1dyaXRlX09wZXJhdGlvbiBGTUMgV3JpdGUgT3BlcmF0aW9uCisgICogQHsKKyAgKi8KKworI2RlZmluZSBGTUNfV1JJVEVfT1BFUkFUSU9OX0RJU0FCTEUgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwKQorI2RlZmluZSBGTUNfV1JJVEVfT1BFUkFUSU9OX0VOQUJMRSAgICAgICAgICAgICAgKCh1aW50MzJfdClGTUNfQkNSeF9XUkVOKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZNQ19XYWl0X1NpZ25hbCBGTUMgV2FpdCBTaWduYWwKKyAgKiBAeworICAqLworCisjZGVmaW5lIEZNQ19XQUlUX1NJR05BTF9ESVNBQkxFICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApCisjZGVmaW5lIEZNQ19XQUlUX1NJR05BTF9FTkFCTEUgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUZNQ19CQ1J4X1dBSVRFTikKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTUNfRXh0ZW5kZWRfTW9kZSBGTUMgRXh0ZW5kZWQgTW9kZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgRk1DX0VYVEVOREVEX01PREVfRElTQUJMRSAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkKKyNkZWZpbmUgRk1DX0VYVEVOREVEX01PREVfRU5BQkxFICAgICAgICAgICAgICAgICgodWludDMyX3QpRk1DX0JDUnhfRVhUTU9EKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZNQ19Bc3luY2hyb25vdXNXYWl0IEZNQyBBc3luY2hyb25vdXMgV2FpdAorICAqIEB7CisgICovCisKKyNkZWZpbmUgRk1DX0FTWU5DSFJPTk9VU19XQUlUX0RJU0FCTEUgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkKKyNkZWZpbmUgRk1DX0FTWU5DSFJPTk9VU19XQUlUX0VOQUJMRSAgICAgICAgICAgICgodWludDMyX3QpRk1DX0JDUnhfQVNZTkNXQUlUKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZNQ19Xcml0ZV9CdXJzdCBGTUMgV3JpdGUgQnVyc3QKKyAgKiBAeworICAqLworCisjZGVmaW5lIEZNQ19XUklURV9CVVJTVF9ESVNBQkxFICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApCisjZGVmaW5lIEZNQ19XUklURV9CVVJTVF9FTkFCTEUgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUZNQ19CQ1J4X0NCVVJTVFJXKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZNQ19Db250aW5vdXNfQ2xvY2sgRk1DIENvbnRpbm91cyBDbG9jaworICAqIEB7CisgICovCisjZGVmaW5lIEZNQ19DT05USU5VT1VTX0NMT0NLX1NZTkNfT05MWSAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApCisjZGVmaW5lIEZNQ19DT05USU5VT1VTX0NMT0NLX1NZTkNfQVNZTkMgICAgICAgICAoKHVpbnQzMl90KUZNQ19CQ1IxX0NDTEtFTikKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRk1DX0FjY2Vzc19Nb2RlIEZNQyBBY2Nlc3MgTW9kZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgRk1DX0FDQ0VTU19NT0RFX0EgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApCisjZGVmaW5lIEZNQ19BQ0NFU1NfTU9ERV9CICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClGTUNfQlRSeF9BQ0NNT0RfMCkKKyNkZWZpbmUgRk1DX0FDQ0VTU19NT0RFX0MgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUZNQ19CVFJ4X0FDQ01PRF8xKQorI2RlZmluZSBGTUNfQUNDRVNTX01PREVfRCAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpKEZNQ19CVFJ4X0FDQ01PRF8wIHwgRk1DX0JUUnhfQUNDTU9EXzEpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZNQ19OQU5EX0NvbnRyb2xsZXIgRk1DIE5BTkQgYW5kIFBDQ0FSRCBDb250cm9sbGVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBGTUNfTkFORF9CYW5rIEZNQyBOQU5EIEJhbmsKKyAgKiBAeworICAqLworI2RlZmluZSBGTUNfTkFORF9CQU5LMiAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDEwKQorI2RlZmluZSBGTUNfTkFORF9CQU5LMyAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMTAwKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZNQ19XYWl0X2ZlYXR1cmUgRk1DIFdhaXQgZmVhdHVyZQorICAqIEB7CisgICovCisjZGVmaW5lIEZNQ19OQU5EX1BDQ19XQUlUX0ZFQVRVUkVfRElTQUJMRSAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwKQorI2RlZmluZSBGTUNfTkFORF9QQ0NfV0FJVF9GRUFUVVJFX0VOQUJMRSAgICAgICAgICAgICgodWludDMyX3QpRk1DX1BDUnhfUFdBSVRFTikKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTUNfUENSX01lbW9yeV9UeXBlIEZNQyBQQ1IgTWVtb3J5IFR5cGUKKyAgKiBAeworICAqLworI2RlZmluZSBGTUNfUENSX01FTU9SWV9UWVBFX1BDQ0FSRCAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwKQorI2RlZmluZSBGTUNfUENSX01FTU9SWV9UWVBFX05BTkQgICAgICAgICAgKCh1aW50MzJfdClGTUNfUENSeF9QVFlQKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTUNfTkFORF9EYXRhX1dpZHRoIEZNQyBOQU5EIERhdGEgV2lkdGgKKyAgKiBAeworICAqLworI2RlZmluZSBGTUNfTkFORF9QQ0NfTUVNX0JVU19XSURUSF84ICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkKKyNkZWZpbmUgRk1DX05BTkRfUENDX01FTV9CVVNfV0lEVEhfMTYgICAgICAgICAgICAgICAoKHVpbnQzMl90KUZNQ19QQ1J4X1BXSURfMCkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTUNfRUNDIEZNQyBOQU5EIEVDQworICAqIEB7CisgICovCisjZGVmaW5lIEZNQ19OQU5EX0VDQ19ESVNBQkxFICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApCisjZGVmaW5lIEZNQ19OQU5EX0VDQ19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUZNQ19QQ1J4X0VDQ0VOKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZNQ19FQ0NfUGFnZV9TaXplIEZNQyBFQ0MgUGFnZSBTaXplCisgICogQHsKKyAgKi8KKyNkZWZpbmUgRk1DX05BTkRfRUNDX1BBR0VfU0laRV8yNTZCWVRFICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkKKyNkZWZpbmUgRk1DX05BTkRfRUNDX1BBR0VfU0laRV81MTJCWVRFICAgICAgICAgICgodWludDMyX3QpRk1DX1BDUnhfRUNDUFNfMCkKKyNkZWZpbmUgRk1DX05BTkRfRUNDX1BBR0VfU0laRV8xMDI0QllURSAgICAgICAgICgodWludDMyX3QpRk1DX1BDUnhfRUNDUFNfMSkKKyNkZWZpbmUgRk1DX05BTkRfRUNDX1BBR0VfU0laRV8yMDQ4QllURSAgICAgICAgICgodWludDMyX3QpRk1DX1BDUnhfRUNDUFNfMHxGTUNfUENSeF9FQ0NQU18xKQorI2RlZmluZSBGTUNfTkFORF9FQ0NfUEFHRV9TSVpFXzQwOTZCWVRFICAgICAgICAgKCh1aW50MzJfdClGTUNfUENSeF9FQ0NQU18yKQorI2RlZmluZSBGTUNfTkFORF9FQ0NfUEFHRV9TSVpFXzgxOTJCWVRFICAgICAgICAgKCh1aW50MzJfdClGTUNfUENSeF9FQ0NQU18wfEZNQ19QQ1J4X0VDQ1BTXzIpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRk1DX0ludGVycnVwdF9kZWZpbml0aW9uIEZNQyBJbnRlcnJ1cHQgZGVmaW5pdGlvbgorICAqIEBicmllZiBGTUMgSW50ZXJydXB0IGRlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBGTUNfSVRfUklTSU5HX0VER0UgICAgICAgICAgICAgICAgKCh1aW50MzJfdClGTUNfU1J4X0lSRU4pCisjZGVmaW5lIEZNQ19JVF9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUZNQ19TUnhfSUxFTikKKyNkZWZpbmUgRk1DX0lUX0ZBTExJTkdfRURHRSAgICAgICAgICAgICAgICgodWludDMyX3QpRk1DX1NSeF9JRkVOKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZNQ19GbGFnX2RlZmluaXRpb24gRk1DIEZsYWcgZGVmaW5pdGlvbgorICAqIEBicmllZiBGTUMgRmxhZyBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgRk1DX0ZMQUdfUklTSU5HX0VER0UgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpRk1DX1NSeF9JUlMpCisjZGVmaW5lIEZNQ19GTEFHX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUZNQ19TUnhfSUxTKQorI2RlZmluZSBGTUNfRkxBR19GQUxMSU5HX0VER0UgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClGTUNfU1J4X0lGUykKKyNkZWZpbmUgRk1DX0ZMQUdfRkVNUFQgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpRk1DX1NSeF9GRU1QVCkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBGTUNfRXhwb3J0ZWRfTWFjcm9zIEZNQyBMb3cgTGF5ZXIgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBGTUNfTk9SX01hY3JvcyBGTUMgTk9SL1NSQU0gRXhwb3J0ZWQgTWFjcm9zCisgKiAgQGJyaWVmIG1hY3JvcyB0byBoYW5kbGUgTk9SIGRldmljZSBlbmFibGUvZGlzYWJsZSBhbmQgcmVhZC93cml0ZSBvcGVyYXRpb25zCisgKiAgQHsKKyAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgTk9SU1JBTSBkZXZpY2UgYWNjZXNzLgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIEZNQ19OT1JTUkFNIEluc3RhbmNlCisgICogQHBhcmFtICBfX0JBTktfXyBGTUNfTk9SU1JBTSBCYW5rCisgICogQHJldHZhbCBub25lCisgICovCisjZGVmaW5lIF9fRk1DX05PUlNSQU1fRU5BQkxFKF9fSU5TVEFOQ0VfXywgX19CQU5LX18pICBTRVRfQklUKChfX0lOU1RBTkNFX18pLT5CVENSWyhfX0JBTktfXyldLCBGTUNfQkNSeF9NQktFTikKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBOT1JTUkFNIGRldmljZSBhY2Nlc3MuCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gRk1DX05PUlNSQU0gSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fQkFOS19fIEZNQ19OT1JTUkFNIEJhbmsKKyAgKiBAcmV0dmFsIG5vbmUKKyAgKi8KKyNkZWZpbmUgX19GTUNfTk9SU1JBTV9ESVNBQkxFKF9fSU5TVEFOQ0VfXywgX19CQU5LX18pIENMRUFSX0JJVCgoX19JTlNUQU5DRV9fKS0+QlRDUlsoX19CQU5LX18pXSwgRk1DX0JDUnhfTUJLRU4pCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRk1DX05BTkRfTWFjcm9zIEZNQyBOQU5EIE1hY3JvcworICogIEBicmllZiBtYWNyb3MgdG8gaGFuZGxlIE5BTkQgZGV2aWNlIGVuYWJsZS9kaXNhYmxlCisgKiAgQHsKKyAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgTkFORCBkZXZpY2UgYWNjZXNzLgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIEZNQ19OQU5EIEluc3RhbmNlCisgICogQHBhcmFtICBfX0JBTktfXyBGTUNfTkFORCBCYW5rCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fRk1DX05BTkRfRU5BQkxFKF9fSU5TVEFOQ0VfXywgX19CQU5LX18pICAoKChfX0JBTktfXykgPT0gRk1DX05BTkRfQkFOSzIpPyBTRVRfQklUKChfX0lOU1RBTkNFX18pLT5QQ1IyLCBGTUNfUENSeF9QQktFTik6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKChfX0lOU1RBTkNFX18pLT5QQ1IzLCBGTUNfUENSeF9QQktFTikpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgTkFORCBkZXZpY2UgYWNjZXNzLgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIEZNQ19OQU5EIEluc3RhbmNlCisgICogQHBhcmFtICBfX0JBTktfXyBGTUNfTkFORCBCYW5rCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fRk1DX05BTkRfRElTQUJMRShfX0lOU1RBTkNFX18sIF9fQkFOS19fKSAoKChfX0JBTktfXykgPT0gRk1DX05BTkRfQkFOSzIpPyBDTEVBUl9CSVQoKF9fSU5TVEFOQ0VfXyktPlBDUjIsIEZNQ19QQ1J4X1BCS0VOKTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xFQVJfQklUKChfX0lOU1RBTkNFX18pLT5QQ1IzLCBGTUNfUENSeF9QQktFTikpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRk1DX1BDQ0FSRF9NYWNyb3MgRk1DIFBDQ0FSRCBNYWNyb3MKKyAqICBAYnJpZWYgbWFjcm9zIHRvIGhhbmRsZSBQQ0NBUkQgcmVhZC93cml0ZSBvcGVyYXRpb25zCisgKiAgQHsKKyAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgUENDQVJEIGRldmljZSBhY2Nlc3MuCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gRk1DX1BDQ0FSRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0ZNQ19QQ0NBUkRfRU5BQkxFKF9fSU5TVEFOQ0VfXykgIFNFVF9CSVQoKF9fSU5TVEFOQ0VfXyktPlBDUjQsIEZNQ19QQ1J4X1BCS0VOKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFBDQ0FSRCBkZXZpY2UgYWNjZXNzLgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIEZNQ19QQ0NBUkQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19GTUNfUENDQVJEX0RJU0FCTEUoX19JTlNUQU5DRV9fKSBDTEVBUl9CSVQoKF9fSU5TVEFOQ0VfXyktPlBDUjQsIEZNQ19QQ1J4X1BCS0VOKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTUNfSW50ZXJydXB0IEZNQyBJbnRlcnJ1cHQKKyAqICBAYnJpZWYgbWFjcm9zIHRvIGhhbmRsZSBGTUMgaW50ZXJydXB0cworICogQHsKKyAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgTkFORCBkZXZpY2UgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fICBGTUNfTkFORCBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19CQU5LX18gICAgICBGTUNfTkFORCBCYW5rCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIEZNQ19OQU5EIGludGVycnVwdAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgRk1DX0lUX1JJU0lOR19FREdFIEludGVycnVwdCByaXNpbmcgZWRnZS4KKyAgKiAgICAgICAgICAgIEBhcmcgRk1DX0lUX0xFVkVMIEludGVycnVwdCBsZXZlbC4KKyAgKiAgICAgICAgICAgIEBhcmcgRk1DX0lUX0ZBTExJTkdfRURHRSBJbnRlcnJ1cHQgZmFsbGluZyBlZGdlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0ZNQ19OQU5EX0VOQUJMRV9JVChfX0lOU1RBTkNFX18sIF9fQkFOS19fLCBfX0lOVEVSUlVQVF9fKSAgKCgoX19CQU5LX18pID09IEZNQ19OQU5EX0JBTksyKT8gU0VUX0JJVCgoX19JTlNUQU5DRV9fKS0+U1IyLCAoX19JTlRFUlJVUFRfXykpOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoKF9fSU5TVEFOQ0VfXyktPlNSMywgKF9fSU5URVJSVVBUX18pKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBOQU5EIGRldmljZSBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gIEZNQ19OQU5EIEluc3RhbmNlCisgICogQHBhcmFtICBfX0JBTktfXyAgICAgIEZNQ19OQU5EIEJhbmsKKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gRk1DX05BTkQgaW50ZXJydXB0CisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBGTUNfSVRfUklTSU5HX0VER0UgSW50ZXJydXB0IHJpc2luZyBlZGdlLgorICAqICAgICAgICAgICAgQGFyZyBGTUNfSVRfTEVWRUwgSW50ZXJydXB0IGxldmVsLgorICAqICAgICAgICAgICAgQGFyZyBGTUNfSVRfRkFMTElOR19FREdFIEludGVycnVwdCBmYWxsaW5nIGVkZ2UuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fRk1DX05BTkRfRElTQUJMRV9JVChfX0lOU1RBTkNFX18sIF9fQkFOS19fLCBfX0lOVEVSUlVQVF9fKSAgKCgoX19CQU5LX18pID09IEZNQ19OQU5EX0JBTksyKT8gQ0xFQVJfQklUKChfX0lOU1RBTkNFX18pLT5TUjIsIChfX0lOVEVSUlVQVF9fKSk6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMRUFSX0JJVCgoX19JTlNUQU5DRV9fKS0+U1IzLCAoX19JTlRFUlJVUFRfXykpKQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBmbGFnIHN0YXR1cyBvZiB0aGUgTkFORCBkZXZpY2UuCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gRk1DX05BTkQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fQkFOS19fICAgICBGTUNfTkFORCBCYW5rCisgICogQHBhcmFtICBfX0ZMQUdfXyBGTUNfTkFORCBmbGFnCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBGTUNfRkxBR19SSVNJTkdfRURHRSBJbnRlcnJ1cHQgcmlzaW5nIGVkZ2UgZmxhZy4KKyAgKiAgICAgICAgICAgIEBhcmcgRk1DX0ZMQUdfTEVWRUwgSW50ZXJydXB0IGxldmVsIGVkZ2UgZmxhZy4KKyAgKiAgICAgICAgICAgIEBhcmcgRk1DX0ZMQUdfRkFMTElOR19FREdFIEludGVycnVwdCBmYWxsaW5nIGVkZ2UgZmxhZy4KKyAgKiAgICAgICAgICAgIEBhcmcgRk1DX0ZMQUdfRkVNUFQgRklGTyBlbXB0eSBmbGFnLgorICAqIEByZXR2YWwgVGhlIHN0YXRlIG9mIEZMQUcgKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fRk1DX05BTkRfR0VUX0ZMQUcoX19JTlNUQU5DRV9fLCBfX0JBTktfXywgX19GTEFHX18pICAoKChfX0JBTktfXykgPT0gRk1DX05BTkRfQkFOSzIpPyAoKChfX0lOU1RBTkNFX18pLT5TUjIgJihfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0lOU1RBTkNFX18pLT5TUjMgJihfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpKQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIGZsYWcgc3RhdHVzIG9mIHRoZSBOQU5EIGRldmljZS4KKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBGTUNfTkFORCBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19CQU5LX18gICAgIEZNQ19OQU5EIEJhbmsKKyAgKiBAcGFyYW0gIF9fRkxBR19fIEZNQ19OQU5EIGZsYWcKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEZNQ19GTEFHX1JJU0lOR19FREdFIEludGVycnVwdCByaXNpbmcgZWRnZSBmbGFnLgorICAqICAgICAgICAgICAgQGFyZyBGTUNfRkxBR19MRVZFTCBJbnRlcnJ1cHQgbGV2ZWwgZWRnZSBmbGFnLgorICAqICAgICAgICAgICAgQGFyZyBGTUNfRkxBR19GQUxMSU5HX0VER0UgSW50ZXJydXB0IGZhbGxpbmcgZWRnZSBmbGFnLgorICAqICAgICAgICAgICAgQGFyZyBGTUNfRkxBR19GRU1QVCBGSUZPIGVtcHR5IGZsYWcuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fRk1DX05BTkRfQ0xFQVJfRkxBRyhfX0lOU1RBTkNFX18sIF9fQkFOS19fLCBfX0ZMQUdfXykgICgoKF9fQkFOS19fKSA9PSBGTUNfTkFORF9CQU5LMik/IENMRUFSX0JJVCgoX19JTlNUQU5DRV9fKS0+U1IyLCAoX19GTEFHX18pKTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMRUFSX0JJVCgoX19JTlNUQU5DRV9fKS0+U1IzLCAoX19GTEFHX18pKSkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFBDQ0FSRCBkZXZpY2UgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIEZNQ19QQ0NBUkQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gRk1DX1BDQ0FSRCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEZNQ19JVF9SSVNJTkdfRURHRSBJbnRlcnJ1cHQgcmlzaW5nIGVkZ2UuCisgICogICAgICAgICAgICBAYXJnIEZNQ19JVF9MRVZFTCBJbnRlcnJ1cHQgbGV2ZWwuCisgICogICAgICAgICAgICBAYXJnIEZNQ19JVF9GQUxMSU5HX0VER0UgSW50ZXJydXB0IGZhbGxpbmcgZWRnZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19GTUNfUENDQVJEX0VOQUJMRV9JVChfX0lOU1RBTkNFX18sIF9fSU5URVJSVVBUX18pICBTRVRfQklUKChfX0lOU1RBTkNFX18pLT5TUjQsIChfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBQQ0NBUkQgZGV2aWNlIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBGTUNfUENDQVJEIEluc3RhbmNlCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIEZNQ19QQ0NBUkQgaW50ZXJydXB0CisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBGTUNfSVRfUklTSU5HX0VER0UgSW50ZXJydXB0IHJpc2luZyBlZGdlLgorICAqICAgICAgICAgICAgQGFyZyBGTUNfSVRfTEVWRUwgSW50ZXJydXB0IGxldmVsLgorICAqICAgICAgICAgICAgQGFyZyBGTUNfSVRfRkFMTElOR19FREdFIEludGVycnVwdCBmYWxsaW5nIGVkZ2UuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fRk1DX1BDQ0FSRF9ESVNBQkxFX0lUKF9fSU5TVEFOQ0VfXywgX19JTlRFUlJVUFRfXykgIENMRUFSX0JJVCgoX19JTlNUQU5DRV9fKS0+U1I0LCAoX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiAgR2V0IGZsYWcgc3RhdHVzIG9mIHRoZSBQQ0NBUkQgZGV2aWNlLgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIEZNQ19QQ0NBUkQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fRkxBR19fIEZNQ19QQ0NBUkQgZmxhZworICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgIEZNQ19GTEFHX1JJU0lOR19FREdFIEludGVycnVwdCByaXNpbmcgZWRnZSBmbGFnLgorICAqICAgICAgICAgICAgQGFyZyAgRk1DX0ZMQUdfTEVWRUwgSW50ZXJydXB0IGxldmVsIGVkZ2UgZmxhZy4KKyAgKiAgICAgICAgICAgIEBhcmcgIEZNQ19GTEFHX0ZBTExJTkdfRURHRSBJbnRlcnJ1cHQgZmFsbGluZyBlZGdlIGZsYWcuCisgICogICAgICAgICAgICBAYXJnICBGTUNfRkxBR19GRU1QVCBGSUZPIGVtcHR5IGZsYWcuCisgICogQHJldHZhbCBUaGUgc3RhdGUgb2YgRkxBRyAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgX19GTUNfUENDQVJEX0dFVF9GTEFHKF9fSU5TVEFOQ0VfXywgX19GTEFHX18pICAoKChfX0lOU1RBTkNFX18pLT5TUjQgJihfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgZmxhZyBzdGF0dXMgb2YgdGhlIFBDQ0FSRCBkZXZpY2UuCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gRk1DX1BDQ0FSRCBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19GTEFHX18gRk1DX1BDQ0FSRCBmbGFnCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyAgRk1DX0ZMQUdfUklTSU5HX0VER0UgSW50ZXJydXB0IHJpc2luZyBlZGdlIGZsYWcuCisgICogICAgICAgICAgICBAYXJnICBGTUNfRkxBR19MRVZFTCBJbnRlcnJ1cHQgbGV2ZWwgZWRnZSBmbGFnLgorICAqICAgICAgICAgICAgQGFyZyAgRk1DX0ZMQUdfRkFMTElOR19FREdFIEludGVycnVwdCBmYWxsaW5nIGVkZ2UgZmxhZy4KKyAgKiAgICAgICAgICAgIEBhcmcgIEZNQ19GTEFHX0ZFTVBUIEZJRk8gZW1wdHkgZmxhZy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19GTUNfUENDQVJEX0NMRUFSX0ZMQUcoX19JTlNUQU5DRV9fLCBfX0ZMQUdfXykgIENMRUFSX0JJVCgoX19JTlNUQU5DRV9fKS0+U1I0LCAoX19GTEFHX18pKQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAYWRkdG9ncm91cCBGTUNfTExfRXhwb3J0ZWRfRnVuY3Rpb25zCisgKiAgQHsKKyAqLworCisvKiogQGFkZHRvZ3JvdXAgRk1DX05PUlNSQU0KKyAqICBAeworICovCisKKy8qKiBAYWRkdG9ncm91cCBGTUNfTk9SU1JBTV9Hcm91cDEKKyAqICBAeworICovCisKKy8qIEZNQ19OT1JTUkFNIENvbnRyb2xsZXIgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEluaXRpYWxpemF0aW9uL2RlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAqLworSEFMX1N0YXR1c1R5cGVEZWYgIEZNQ19OT1JTUkFNX0luaXQoRk1DX05PUlNSQU1fVHlwZURlZiAqRGV2aWNlLCBGTUNfTk9SU1JBTV9Jbml0VHlwZURlZiAqSW5pdCk7CitIQUxfU3RhdHVzVHlwZURlZiAgRk1DX05PUlNSQU1fVGltaW5nX0luaXQoRk1DX05PUlNSQU1fVHlwZURlZiAqRGV2aWNlLCBGTUNfTk9SU1JBTV9UaW1pbmdUeXBlRGVmICpUaW1pbmcsIHVpbnQzMl90IEJhbmspOworSEFMX1N0YXR1c1R5cGVEZWYgIEZNQ19OT1JTUkFNX0V4dGVuZGVkX1RpbWluZ19Jbml0KEZNQ19OT1JTUkFNX0VYVEVOREVEX1R5cGVEZWYgKkRldmljZSwgRk1DX05PUlNSQU1fVGltaW5nVHlwZURlZiAqVGltaW5nLCB1aW50MzJfdCBCYW5rLCB1aW50MzJfdCBFeHRlbmRlZE1vZGUpOworSEFMX1N0YXR1c1R5cGVEZWYgIEZNQ19OT1JTUkFNX0RlSW5pdChGTUNfTk9SU1JBTV9UeXBlRGVmICpEZXZpY2UsIEZNQ19OT1JTUkFNX0VYVEVOREVEX1R5cGVEZWYgKkV4RGV2aWNlLCB1aW50MzJfdCBCYW5rKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEZNQ19OT1JTUkFNX0dyb3VwMgorICogIEB7CisgKi8KKworLyogRk1DX05PUlNSQU0gQ29udHJvbCBmdW5jdGlvbnMgKi8KK0hBTF9TdGF0dXNUeXBlRGVmICBGTUNfTk9SU1JBTV9Xcml0ZU9wZXJhdGlvbl9FbmFibGUoRk1DX05PUlNSQU1fVHlwZURlZiAqRGV2aWNlLCB1aW50MzJfdCBCYW5rKTsKK0hBTF9TdGF0dXNUeXBlRGVmICBGTUNfTk9SU1JBTV9Xcml0ZU9wZXJhdGlvbl9EaXNhYmxlKEZNQ19OT1JTUkFNX1R5cGVEZWYgKkRldmljZSwgdWludDMyX3QgQmFuayk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBGTUNfTkFORAorICogIEB7CisgKi8KKworLyogRk1DX05BTkQgQ29udHJvbGxlciBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEluaXRpYWxpemF0aW9uL2RlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAqLworLyoqIEBhZGR0b2dyb3VwIEZNQ19OQU5EX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAqICBAeworICovCisKK0hBTF9TdGF0dXNUeXBlRGVmICBGTUNfTkFORF9Jbml0KEZNQ19OQU5EX1R5cGVEZWYgKkRldmljZSwgRk1DX05BTkRfSW5pdFR5cGVEZWYgKkluaXQpOworSEFMX1N0YXR1c1R5cGVEZWYgIEZNQ19OQU5EX0NvbW1vblNwYWNlX1RpbWluZ19Jbml0KEZNQ19OQU5EX1R5cGVEZWYgKkRldmljZSwgRk1DX05BTkRfUENDX1RpbWluZ1R5cGVEZWYgKlRpbWluZywgdWludDMyX3QgQmFuayk7CitIQUxfU3RhdHVzVHlwZURlZiAgRk1DX05BTkRfQXR0cmlidXRlU3BhY2VfVGltaW5nX0luaXQoRk1DX05BTkRfVHlwZURlZiAqRGV2aWNlLCBGTUNfTkFORF9QQ0NfVGltaW5nVHlwZURlZiAqVGltaW5nLCB1aW50MzJfdCBCYW5rKTsKK0hBTF9TdGF0dXNUeXBlRGVmICBGTUNfTkFORF9EZUluaXQoRk1DX05BTkRfVHlwZURlZiAqRGV2aWNlLCB1aW50MzJfdCBCYW5rKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRk1DX05BTkQgQ29udHJvbCBmdW5jdGlvbnMgKi8KKy8qKiBAYWRkdG9ncm91cCBGTUNfTkFORF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgKiAgQHsKKyAqLworCitIQUxfU3RhdHVzVHlwZURlZiAgRk1DX05BTkRfRUNDX0VuYWJsZShGTUNfTkFORF9UeXBlRGVmICpEZXZpY2UsIHVpbnQzMl90IEJhbmspOworSEFMX1N0YXR1c1R5cGVEZWYgIEZNQ19OQU5EX0VDQ19EaXNhYmxlKEZNQ19OQU5EX1R5cGVEZWYgKkRldmljZSwgdWludDMyX3QgQmFuayk7CitIQUxfU3RhdHVzVHlwZURlZiAgRk1DX05BTkRfR2V0RUNDKEZNQ19OQU5EX1R5cGVEZWYgKkRldmljZSwgdWludDMyX3QgKkVDQ3ZhbCwgdWludDMyX3QgQmFuaywgdWludDMyX3QgVGltZW91dCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBGTUNfUENDQVJECisgKiAgQHsKKyAqLworCisvKiBGTUNfUENDQVJEIENvbnRyb2xsZXIgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICovCisvKiogQGFkZHRvZ3JvdXAgRk1DX1BDQ0FSRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgKiAgQHsKKyAqLworCitIQUxfU3RhdHVzVHlwZURlZiAgRk1DX1BDQ0FSRF9Jbml0KEZNQ19QQ0NBUkRfVHlwZURlZiAqRGV2aWNlLCBGTUNfUENDQVJEX0luaXRUeXBlRGVmICpJbml0KTsKK0hBTF9TdGF0dXNUeXBlRGVmICBGTUNfUENDQVJEX0NvbW1vblNwYWNlX1RpbWluZ19Jbml0KEZNQ19QQ0NBUkRfVHlwZURlZiAqRGV2aWNlLCBGTUNfTkFORF9QQ0NfVGltaW5nVHlwZURlZiAqVGltaW5nKTsKK0hBTF9TdGF0dXNUeXBlRGVmICBGTUNfUENDQVJEX0F0dHJpYnV0ZVNwYWNlX1RpbWluZ19Jbml0KEZNQ19QQ0NBUkRfVHlwZURlZiAqRGV2aWNlLCBGTUNfTkFORF9QQ0NfVGltaW5nVHlwZURlZiAqVGltaW5nKTsKK0hBTF9TdGF0dXNUeXBlRGVmICBGTUNfUENDQVJEX0lPU3BhY2VfVGltaW5nX0luaXQoRk1DX1BDQ0FSRF9UeXBlRGVmICpEZXZpY2UsIEZNQ19OQU5EX1BDQ19UaW1pbmdUeXBlRGVmICpUaW1pbmcpOyAKK0hBTF9TdGF0dXNUeXBlRGVmICBGTUNfUENDQVJEX0RlSW5pdChGTUNfUENDQVJEX1R5cGVEZWYgKkRldmljZSk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBGTUNfQkFOSzEgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJGM3h4X0xMX0ZNQ19IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCisKZGlmZiAtLWdpdCBhL0luYy9zdG0zMmYzeHhfbGxfZ3Bpby5oIGIvSW5jL3N0bTMyZjN4eF9sbF9ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU3ZWRjYwotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmYzeHhfbGxfZ3Bpby5oCkBAIC0wLDAgKzEsOTk1IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2xsX2dwaW8uaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgR1BJTyBMTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyRjN4eF9MTF9HUElPX0gKKyNkZWZpbmUgX19TVE0zMkYzeHhfTExfR1BJT19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoR1BJT0EpIHx8IGRlZmluZWQgKEdQSU9CKSB8fCBkZWZpbmVkIChHUElPQykgfHwgZGVmaW5lZCAoR1BJT0QpIHx8IGRlZmluZWQgKEdQSU9FKSB8fCBkZWZpbmVkIChHUElPRikgfHwgZGVmaW5lZCAoR1BJT0cpIHx8IGRlZmluZWQgKEdQSU9IKQorCisvKiogQGRlZmdyb3VwIEdQSU9fTEwgR1BJTworICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIEdQSU9fTExfUHJpdmF0ZV9NYWNyb3MgR1BJTyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLypVU0VfRlVMTF9MTF9EUklWRVIqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBHUElPX0xMX0VTX0lOSVQgR1BJTyBFeHBvcnRlZCBJbml0IHN0cnVjdHVyZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgTEwgR1BJTyBJbml0IFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQaW47ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBHUElPIHBpbnMgdG8gYmUgY29uZmlndXJlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgb2YgQHJlZiBHUElPX0xMX0VDX1BJTiAqLworCisgIHVpbnQzMl90IE1vZGU7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG9wZXJhdGluZyBtb2RlIGZvciB0aGUgc2VsZWN0ZWQgcGlucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgR1BJT19MTF9FQ19NT0RFLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPIEhXIGNvbmZpZ3VyYXRpb24gY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0dQSU9fU2V0UGluTW9kZSgpLiovCisKKyAgdWludDMyX3QgU3BlZWQ7ICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgc3BlZWQgZm9yIHRoZSBzZWxlY3RlZCBwaW5zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBHUElPX0xMX0VDX1NQRUVELgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPIEhXIGNvbmZpZ3VyYXRpb24gY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0dQSU9fU2V0UGluU3BlZWQoKS4qLworCisgIHVpbnQzMl90IE91dHB1dFR5cGU7ICAgLyohPCBTcGVjaWZpZXMgdGhlIG9wZXJhdGluZyBvdXRwdXQgdHlwZSBmb3IgdGhlIHNlbGVjdGVkIHBpbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEdQSU9fTExfRUNfT1VUUFVULgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPIEhXIGNvbmZpZ3VyYXRpb24gY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0dQSU9fU2V0UGluT3V0cHV0VHlwZSgpLiovCisKKyAgdWludDMyX3QgUHVsbDsgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgb3BlcmF0aW5nIFB1bGwtdXAvUHVsbCBkb3duIGZvciB0aGUgc2VsZWN0ZWQgcGlucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgR1BJT19MTF9FQ19QVUxMLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPIEhXIGNvbmZpZ3VyYXRpb24gY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0dQSU9fU2V0UGluUHVsbCgpLiovCisKKyAgdWludDMyX3QgQWx0ZXJuYXRlOyAgICAvKiE8IFNwZWNpZmllcyB0aGUgUGVyaXBoZXJhbCB0byBiZSBjb25uZWN0ZWQgdG8gdGhlIHNlbGVjdGVkIHBpbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEdQSU9fTExfRUNfQUYuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU8gSFcgY29uZmlndXJhdGlvbiBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfR1BJT19TZXRBRlBpbl8wXzcoKSBhbmQgTExfR1BJT19TZXRBRlBpbl84XzE1KCkuKi8KK30gTExfR1BJT19Jbml0VHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FeHBvcnRlZF9Db25zdGFudHMgR1BJTyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEdQSU9fTExfRUNfUElOIFBJTgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0dQSU9fUElOXzAgICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTXzAgLyohPCBTZWxlY3QgcGluIDAgKi8KKyNkZWZpbmUgTExfR1BJT19QSU5fMSAgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlNfMSAvKiE8IFNlbGVjdCBwaW4gMSAqLworI2RlZmluZSBMTF9HUElPX1BJTl8yICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQlNSUl9CU18yIC8qITwgU2VsZWN0IHBpbiAyICovCisjZGVmaW5lIExMX0dQSU9fUElOXzMgICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTXzMgLyohPCBTZWxlY3QgcGluIDMgKi8KKyNkZWZpbmUgTExfR1BJT19QSU5fNCAgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlNfNCAvKiE8IFNlbGVjdCBwaW4gNCAqLworI2RlZmluZSBMTF9HUElPX1BJTl81ICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQlNSUl9CU181IC8qITwgU2VsZWN0IHBpbiA1ICovCisjZGVmaW5lIExMX0dQSU9fUElOXzYgICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTXzYgLyohPCBTZWxlY3QgcGluIDYgKi8KKyNkZWZpbmUgTExfR1BJT19QSU5fNyAgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlNfNyAvKiE8IFNlbGVjdCBwaW4gNyAqLworI2RlZmluZSBMTF9HUElPX1BJTl84ICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQlNSUl9CU184IC8qITwgU2VsZWN0IHBpbiA4ICovCisjZGVmaW5lIExMX0dQSU9fUElOXzkgICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTXzkgLyohPCBTZWxlY3QgcGluIDkgKi8KKyNkZWZpbmUgTExfR1BJT19QSU5fMTAgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlNfMTAgLyohPCBTZWxlY3QgcGluIDEwICovCisjZGVmaW5lIExMX0dQSU9fUElOXzExICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTXzExIC8qITwgU2VsZWN0IHBpbiAxMSAqLworI2RlZmluZSBMTF9HUElPX1BJTl8xMiAgICAgICAgICAgICAgICAgICAgIEdQSU9fQlNSUl9CU18xMiAvKiE8IFNlbGVjdCBwaW4gMTIgKi8KKyNkZWZpbmUgTExfR1BJT19QSU5fMTMgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlNfMTMgLyohPCBTZWxlY3QgcGluIDEzICovCisjZGVmaW5lIExMX0dQSU9fUElOXzE0ICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTXzE0IC8qITwgU2VsZWN0IHBpbiAxNCAqLworI2RlZmluZSBMTF9HUElPX1BJTl8xNSAgICAgICAgICAgICAgICAgICAgIEdQSU9fQlNSUl9CU18xNSAvKiE8IFNlbGVjdCBwaW4gMTUgKi8KKyNkZWZpbmUgTExfR1BJT19QSU5fQUxMICAgICAgICAgICAgICAgICAgICAoR1BJT19CU1JSX0JTXzAgfCBHUElPX0JTUlJfQlNfMSAgfCBHUElPX0JTUlJfQlNfMiAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTXzMgIHwgR1BJT19CU1JSX0JTXzQgIHwgR1BJT19CU1JSX0JTXzUgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQlNSUl9CU182ICB8IEdQSU9fQlNSUl9CU183ICB8IEdQSU9fQlNSUl9CU184ICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlNfOSAgfCBHUElPX0JTUlJfQlNfMTAgfCBHUElPX0JTUlJfQlNfMTEgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTXzEyIHwgR1BJT19CU1JSX0JTXzEzIHwgR1BJT19CU1JSX0JTXzE0IHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQlNSUl9CU18xNSkgLyohPCBTZWxlY3QgYWxsIHBpbnMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FQ19NT0RFIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9HUElPX01PREVfSU5QVVQgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgLyohPCBTZWxlY3QgaW5wdXQgbW9kZSAqLworI2RlZmluZSBMTF9HUElPX01PREVfT1VUUFVUICAgICAgICAgICAgICAgIEdQSU9fTU9ERVJfTU9ERVIwXzAgIC8qITwgU2VsZWN0IG91dHB1dCBtb2RlICovCisjZGVmaW5lIExMX0dQSU9fTU9ERV9BTFRFUk5BVEUgICAgICAgICAgICAgR1BJT19NT0RFUl9NT0RFUjBfMSAgLyohPCBTZWxlY3QgYWx0ZXJuYXRlIGZ1bmN0aW9uIG1vZGUgKi8KKyNkZWZpbmUgTExfR1BJT19NT0RFX0FOQUxPRyAgICAgICAgICAgICAgICBHUElPX01PREVSX01PREVSMCAgICAvKiE8IFNlbGVjdCBhbmFsb2cgbW9kZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBHUElPX0xMX0VDX09VVFBVVCBPdXRwdXQgVHlwZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0dQSU9fT1VUUFVUX1BVU0hQVUxMICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAvKiE8IFNlbGVjdCBwdXNoLXB1bGwgYXMgb3V0cHV0IHR5cGUgKi8KKyNkZWZpbmUgTExfR1BJT19PVVRQVVRfT1BFTkRSQUlOICAgICAgICAgICBHUElPX09UWVBFUl9PVF8wIC8qITwgU2VsZWN0IG9wZW4tZHJhaW4gYXMgb3V0cHV0IHR5cGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FQ19TUEVFRCBPdXRwdXQgU3BlZWQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9HUElPX1NQRUVEX0ZSRVFfTE9XICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgLyohPCBTZWxlY3QgSS9PIGxvdyBvdXRwdXQgc3BlZWQgICAgKi8KKyNkZWZpbmUgTExfR1BJT19TUEVFRF9GUkVRX01FRElVTSAgICAgICAgICBHUElPX09TUEVFREVSX09TUEVFRFIwXzAgLyohPCBTZWxlY3QgSS9PIG1lZGl1bSBvdXRwdXQgc3BlZWQgKi8KKyNkZWZpbmUgTExfR1BJT19TUEVFRF9GUkVRX0hJR0ggICAgICAgICAgICBHUElPX09TUEVFREVSX09TUEVFRFIwICAgLyohPCBTZWxlY3QgSS9PIGhpZ2ggb3V0cHV0IHNwZWVkICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FQ19QVUxMIFB1bGwgVXAgUHVsbCBEb3duCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfR1BJT19QVUxMX05PICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpIC8qITwgU2VsZWN0IEkvTyBubyBwdWxsICovCisjZGVmaW5lIExMX0dQSU9fUFVMTF9VUCAgICAgICAgICAgICAgICAgICAgR1BJT19QVVBEUl9QVVBEUjBfMCAvKiE8IFNlbGVjdCBJL08gcHVsbCB1cCAqLworI2RlZmluZSBMTF9HUElPX1BVTExfRE9XTiAgICAgICAgICAgICAgICAgIEdQSU9fUFVQRFJfUFVQRFIwXzEgLyohPCBTZWxlY3QgSS9PIHB1bGwgZG93biAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBHUElPX0xMX0VDX0FGIEFsdGVybmF0ZSBGdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0dQSU9fQUZfMCAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMFUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiAwICovCisjZGVmaW5lIExMX0dQSU9fQUZfMSAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMVUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiAxICovCisjZGVmaW5lIExMX0dQSU9fQUZfMiAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMlUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiAyICovCisjZGVmaW5lIExMX0dQSU9fQUZfMyAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwM1UpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiAzICovCisjZGVmaW5lIExMX0dQSU9fQUZfNCAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwNFUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiA0ICovCisjZGVmaW5lIExMX0dQSU9fQUZfNSAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwNVUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiA1ICovCisjZGVmaW5lIExMX0dQSU9fQUZfNiAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwNlUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiA2ICovCisjZGVmaW5lIExMX0dQSU9fQUZfNyAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwN1UpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiA3ICovCisjZGVmaW5lIExMX0dQSU9fQUZfOCAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwOFUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiA4ICovCisjZGVmaW5lIExMX0dQSU9fQUZfOSAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwOVUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiA5ICovCisjZGVmaW5lIExMX0dQSU9fQUZfMTAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwQVUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiAxMCAqLworI2RlZmluZSBMTF9HUElPX0FGXzExICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMEJVKSAvKiE8IFNlbGVjdCBhbHRlcm5hdGUgZnVuY3Rpb24gMTEgKi8KKyNkZWZpbmUgTExfR1BJT19BRl8xMiAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDBDVSkgLyohPCBTZWxlY3QgYWx0ZXJuYXRlIGZ1bmN0aW9uIDEyICovCisjZGVmaW5lIExMX0dQSU9fQUZfMTMgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwRFUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiAxMyAqLworI2RlZmluZSBMTF9HUElPX0FGXzE0ICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMEVVKSAvKiE8IFNlbGVjdCBhbHRlcm5hdGUgZnVuY3Rpb24gMTQgKi8KKyNkZWZpbmUgTExfR1BJT19BRl8xNSAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDBGVSkgLyohPCBTZWxlY3QgYWx0ZXJuYXRlIGZ1bmN0aW9uIDE1ICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBHUElPX0xMX0V4cG9ydGVkX01hY3JvcyBHUElPIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIEdQSU8gcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBHUElPIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9HUElPX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gR1BJTyByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIEdQSU8gSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfR1BJT19SZWFkUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXykgUkVBRF9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FeHBvcnRlZF9GdW5jdGlvbnMgR1BJTyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEdQSU9fTExfRUZfUG9ydF9Db25maWd1cmF0aW9uIFBvcnQgQ29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIGdwaW8gbW9kZSBmb3IgYSBkZWRpY2F0ZWQgcGluIG9uIGRlZGljYXRlZCBwb3J0LgorICAqIEBub3RlICAgSS9PIG1vZGUgY2FuIGJlIElucHV0IG1vZGUsIEdlbmVyYWwgcHVycG9zZSBvdXRwdXQsIEFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlIG9yIEFuYWxvZy4KKyAgKiBAbm90ZSAgIFdhcm5pbmc6IG9ubHkgb25lIHBpbiBjYW4gYmUgcGFzc2VkIGFzIHBhcmFtZXRlci4KKyAgKiBAcm10b2xsIE1PREVSICAgICAgICBNT0RFeSAgICAgICAgIExMX0dQSU9fU2V0UGluTW9kZQorICAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgICogQHBhcmFtICBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgICogQHBhcmFtICBNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19NT0RFX0lOUFVUCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19NT0RFX09VVFBVVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fTU9ERV9BTFRFUk5BVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX01PREVfQU5BTE9HCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9HUElPX1NldFBpbk1vZGUoR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluLCB1aW50MzJfdCBNb2RlKQoreworICBNT0RJRllfUkVHKEdQSU94LT5NT0RFUiwgKEdQSU9fTU9ERVJfTU9ERVIwIDw8IChQT1NJVElPTl9WQUwoUGluKSAqIDJVKSksIChNb2RlIDw8IChQT1NJVElPTl9WQUwoUGluKSAqIDJVKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBncGlvIG1vZGUgZm9yIGEgZGVkaWNhdGVkIHBpbiBvbiBkZWRpY2F0ZWQgcG9ydC4KKyAgKiBAbm90ZSAgIEkvTyBtb2RlIGNhbiBiZSBJbnB1dCBtb2RlLCBHZW5lcmFsIHB1cnBvc2Ugb3V0cHV0LCBBbHRlcm5hdGUgZnVuY3Rpb24gbW9kZSBvciBBbmFsb2cuCisgICogQG5vdGUgICBXYXJuaW5nOiBvbmx5IG9uZSBwaW4gY2FuIGJlIHBhc3NlZCBhcyBwYXJhbWV0ZXIuCisgICogQHJtdG9sbCBNT0RFUiAgICAgICAgTU9ERXkgICAgICAgICBMTF9HUElPX0dldFBpbk1vZGUKKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEBwYXJhbSAgUGluIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX01PREVfSU5QVVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX01PREVfT1VUUFVUCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19NT0RFX0FMVEVSTkFURQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fTU9ERV9BTkFMT0cKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9HUElPX0dldFBpbk1vZGUoR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChHUElPeC0+TU9ERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHUElPX01PREVSX01PREVSMCA8PCAoUE9TSVRJT05fVkFMKFBpbikgKiAyVSkpKSA+PiAoUE9TSVRJT05fVkFMKFBpbikgKiAyVSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBncGlvIG91dHB1dCB0eXBlIGZvciBzZXZlcmFsIHBpbnMgb24gZGVkaWNhdGVkIHBvcnQuCisgICogQG5vdGUgICBPdXRwdXQgdHlwZSBhcyB0byBiZSBzZXQgd2hlbiBncGlvIHBpbiBpcyBpbiBvdXRwdXQgb3IKKyAgKiAgICAgICAgIGFsdGVybmF0ZSBtb2Rlcy4gUG9zc2libGUgdHlwZSBhcmUgUHVzaC1wdWxsIG9yIE9wZW4tZHJhaW4uCisgICogQHJtdG9sbCBPVFlQRVIgICAgICAgT1R5ICAgICAgICAgICBMTF9HUElPX1NldFBpbk91dHB1dFR5cGUKKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEBwYXJhbSAgUGluTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fQUxMCisgICogQHBhcmFtICBPdXRwdXRUeXBlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19PVVRQVVRfUFVTSFBVTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX09VVFBVVF9PUEVORFJBSU4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0dQSU9fU2V0UGluT3V0cHV0VHlwZShHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW5NYXNrLCB1aW50MzJfdCBPdXRwdXRUeXBlKQoreworICBNT0RJRllfUkVHKEdQSU94LT5PVFlQRVIsIFBpbk1hc2ssIChQaW5NYXNrICogT3V0cHV0VHlwZSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBncGlvIG91dHB1dCB0eXBlIGZvciBzZXZlcmFsIHBpbnMgb24gZGVkaWNhdGVkIHBvcnQuCisgICogQG5vdGUgICBPdXRwdXQgdHlwZSBhcyB0byBiZSBzZXQgd2hlbiBncGlvIHBpbiBpcyBpbiBvdXRwdXQgb3IKKyAgKiAgICAgICAgIGFsdGVybmF0ZSBtb2Rlcy4gUG9zc2libGUgdHlwZSBhcmUgUHVzaC1wdWxsIG9yIE9wZW4tZHJhaW4uCisgICogQG5vdGUgICBXYXJuaW5nOiBvbmx5IG9uZSBwaW4gY2FuIGJlIHBhc3NlZCBhcyBwYXJhbWV0ZXIuCisgICogQHJtdG9sbCBPVFlQRVIgICAgICAgT1R5ICAgICAgICAgICBMTF9HUElPX0dldFBpbk91dHB1dFR5cGUKKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEBwYXJhbSAgUGluIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOX0FMTAorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX09VVFBVVF9QVVNIUFVMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fT1VUUFVUX09QRU5EUkFJTgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dQSU9fR2V0UGluT3V0cHV0VHlwZShHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW4pCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEdQSU94LT5PVFlQRVIsIFBpbikgPj4gUE9TSVRJT05fVkFMKFBpbikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBncGlvIHNwZWVkIGZvciBhIGRlZGljYXRlZCBwaW4gb24gZGVkaWNhdGVkIHBvcnQuCisgICogQG5vdGUgICBJL08gc3BlZWQgY2FuIGJlIExvdywgTWVkaXVtLCBGYXN0IG9yIEhpZ2ggc3BlZWQuCisgICogQG5vdGUgICBXYXJuaW5nOiBvbmx5IG9uZSBwaW4gY2FuIGJlIHBhc3NlZCBhcyBwYXJhbWV0ZXIuCisgICogQG5vdGUgICBSZWZlciB0byBkYXRhc2hlZXQgZm9yIGZyZXF1ZW5jeSBzcGVjaWZpY2F0aW9ucyBhbmQgdGhlIHBvd2VyCisgICogICAgICAgICBzdXBwbHkgYW5kIGxvYWQgY29uZGl0aW9ucyBmb3IgZWFjaCBzcGVlZC4KKyAgKiBAcm10b2xsIE9TUEVFRFIgICAgICBPU1BFRUR5ICAgICAgIExMX0dQSU9fU2V0UGluU3BlZWQKKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEBwYXJhbSAgUGluIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQorICAqIEBwYXJhbSAgU3BlZWQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1NQRUVEX0ZSRVFfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19TUEVFRF9GUkVRX01FRElVTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fU1BFRURfRlJFUV9ISUdICisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9HUElPX1NldFBpblNwZWVkKEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBpbiwgdWludDMyX3QgIFNwZWVkKQoreworICBNT0RJRllfUkVHKEdQSU94LT5PU1BFRURSLCAoR1BJT19PU1BFRURFUl9PU1BFRURSMCA8PCAoUE9TSVRJT05fVkFMKFBpbikgKiAyVSkpLAorICAgICAgICAgICAgIChTcGVlZCA8PCAoUE9TSVRJT05fVkFMKFBpbikgKiAyVSkpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gZ3BpbyBzcGVlZCBmb3IgYSBkZWRpY2F0ZWQgcGluIG9uIGRlZGljYXRlZCBwb3J0LgorICAqIEBub3RlICAgSS9PIHNwZWVkIGNhbiBiZSBMb3csIE1lZGl1bSwgRmFzdCBvciBIaWdoIHNwZWVkLgorICAqIEBub3RlICAgV2FybmluZzogb25seSBvbmUgcGluIGNhbiBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyLgorICAqIEBub3RlICAgUmVmZXIgdG8gZGF0YXNoZWV0IGZvciBmcmVxdWVuY3kgc3BlY2lmaWNhdGlvbnMgYW5kIHRoZSBwb3dlcgorICAqICAgICAgICAgc3VwcGx5IGFuZCBsb2FkIGNvbmRpdGlvbnMgZm9yIGVhY2ggc3BlZWQuCisgICogQHJtdG9sbCBPU1BFRURSICAgICAgT1NQRUVEeSAgICAgICBMTF9HUElPX0dldFBpblNwZWVkCisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19TUEVFRF9GUkVRX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fU1BFRURfRlJFUV9NRURJVU0KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1NQRUVEX0ZSRVFfSElHSAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dQSU9fR2V0UGluU3BlZWQoR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChHUElPeC0+T1NQRUVEUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdQSU9fT1NQRUVERVJfT1NQRUVEUjAgPDwgKFBPU0lUSU9OX1ZBTChQaW4pICogMlUpKSkgPj4gKFBPU0lUSU9OX1ZBTChQaW4pICogMlUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgZ3BpbyBwdWxsLXVwIG9yIHB1bGwtZG93biBmb3IgYSBkZWRpY2F0ZWQgcGluIG9uIGEgZGVkaWNhdGVkIHBvcnQuCisgICogQG5vdGUgICBXYXJuaW5nOiBvbmx5IG9uZSBwaW4gY2FuIGJlIHBhc3NlZCBhcyBwYXJhbWV0ZXIuCisgICogQHJtdG9sbCBQVVBEUiAgICAgICAgUFVQRHkgICAgICAgICBMTF9HUElPX1NldFBpblB1bGwKKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEBwYXJhbSAgUGluIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQorICAqIEBwYXJhbSAgUHVsbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUFVMTF9OTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUFVMTF9VUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUFVMTF9ET1dOCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9HUElPX1NldFBpblB1bGwoR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluLCB1aW50MzJfdCBQdWxsKQoreworICBNT0RJRllfUkVHKEdQSU94LT5QVVBEUiwgKEdQSU9fUFVQRFJfUFVQRFIwIDw8IChQT1NJVElPTl9WQUwoUGluKSAqIDJVKSksIChQdWxsIDw8IChQT1NJVElPTl9WQUwoUGluKSAqIDJVKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBncGlvIHB1bGwtdXAgb3IgcHVsbC1kb3duIGZvciBhIGRlZGljYXRlZCBwaW4gb24gYSBkZWRpY2F0ZWQgcG9ydAorICAqIEBub3RlICAgV2FybmluZzogb25seSBvbmUgcGluIGNhbiBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyLgorICAqIEBybXRvbGwgUFVQRFIgICAgICAgIFBVUER5ICAgICAgICAgTExfR1BJT19HZXRQaW5QdWxsCisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QVUxMX05PCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QVUxMX1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QVUxMX0RPV04KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9HUElPX0dldFBpblB1bGwoR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChHUElPeC0+UFVQRFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHUElPX1BVUERSX1BVUERSMCA8PCAoUE9TSVRJT05fVkFMKFBpbikgKiAyVSkpKSA+PiAoUE9TSVRJT05fVkFMKFBpbikgKiAyVSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBncGlvIGFsdGVybmF0ZSBmdW5jdGlvbiBvZiBhIGRlZGljYXRlZCBwaW4gZnJvbSAwIHRvIDcgZm9yIGEgZGVkaWNhdGVkIHBvcnQuCisgICogQG5vdGUgICBQb3NzaWJsZSB2YWx1ZXMgYXJlIGZyb20gQUYwIHRvIEFGMTUgZGVwZW5kaW5nIG9uIHRhcmdldC4KKyAgKiBAbm90ZSAgIFdhcm5pbmc6IG9ubHkgb25lIHBpbiBjYW4gYmUgcGFzc2VkIGFzIHBhcmFtZXRlci4KKyAgKiBAcm10b2xsIEFGUkwgICAgICAgICBBRlNFTHkgICAgICAgIExMX0dQSU9fU2V0QUZQaW5fMF83CisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83CisgICogQHBhcmFtICBBbHRlcm5hdGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0dQSU9fU2V0QUZQaW5fMF83KEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBpbiwgdWludDMyX3QgQWx0ZXJuYXRlKQoreworICBNT0RJRllfUkVHKEdQSU94LT5BRlJbMF0sIChHUElPX0FGUkxfQUZSTDAgPDwgKFBPU0lUSU9OX1ZBTChQaW4pICogNFUpKSwKKyAgICAgICAgICAgICAoQWx0ZXJuYXRlIDw8IChQT1NJVElPTl9WQUwoUGluKSAqIDRVKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBncGlvIGFsdGVybmF0ZSBmdW5jdGlvbiBvZiBhIGRlZGljYXRlZCBwaW4gZnJvbSAwIHRvIDcgZm9yIGEgZGVkaWNhdGVkIHBvcnQuCisgICogQHJtdG9sbCBBRlJMICAgICAgICAgQUZTRUx5ICAgICAgICBMTF9HUElPX0dldEFGUGluXzBfNworICAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgICogQHBhcmFtICBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNworICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9HUElPX0dldEFGUGluXzBfNyhHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW4pCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEdQSU94LT5BRlJbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHUElPX0FGUkxfQUZSTDAgPDwgKFBPU0lUSU9OX1ZBTChQaW4pICogNFUpKSkgPj4gKFBPU0lUSU9OX1ZBTChQaW4pICogNFUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgZ3BpbyBhbHRlcm5hdGUgZnVuY3Rpb24gb2YgYSBkZWRpY2F0ZWQgcGluIGZyb20gOCB0byAxNSBmb3IgYSBkZWRpY2F0ZWQgcG9ydC4KKyAgKiBAbm90ZSAgIFBvc3NpYmxlIHZhbHVlcyBhcmUgZnJvbSBBRjAgdG8gQUYxNSBkZXBlbmRpbmcgb24gdGFyZ2V0LgorICAqIEBub3RlICAgV2FybmluZzogb25seSBvbmUgcGluIGNhbiBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyLgorICAqIEBybXRvbGwgQUZSSCAgICAgICAgIEFGU0VMeSAgICAgICAgTExfR1BJT19TZXRBRlBpbl84XzE1CisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgICogQHBhcmFtICBBbHRlcm5hdGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0dQSU9fU2V0QUZQaW5fOF8xNShHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW4sIHVpbnQzMl90IEFsdGVybmF0ZSkKK3sKKyAgTU9ESUZZX1JFRyhHUElPeC0+QUZSWzFdLCAoR1BJT19BRlJIX0FGUkgwIDw8IChQT1NJVElPTl9WQUwoUGluID4+IDhVKSAqIDRVKSksCisgICAgICAgICAgICAgKEFsdGVybmF0ZSA8PCAoUE9TSVRJT05fVkFMKFBpbiA+PiA4VSkgKiA0VSkpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gZ3BpbyBhbHRlcm5hdGUgZnVuY3Rpb24gb2YgYSBkZWRpY2F0ZWQgcGluIGZyb20gOCB0byAxNSBmb3IgYSBkZWRpY2F0ZWQgcG9ydC4KKyAgKiBAbm90ZSAgIFBvc3NpYmxlIHZhbHVlcyBhcmUgZnJvbSBBRjAgdG8gQUYxNSBkZXBlbmRpbmcgb24gdGFyZ2V0LgorICAqIEBybXRvbGwgQUZSSCAgICAgICAgIEFGU0VMeSAgICAgICAgTExfR1BJT19HZXRBRlBpbl84XzE1CisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xNQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dQSU9fR2V0QUZQaW5fOF8xNShHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW4pCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEdQSU94LT5BRlJbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHUElPX0FGUkhfQUZSSDAgPDwgKFBPU0lUSU9OX1ZBTChQaW4gPj4gOFUpICogNFUpKSkgPj4gKFBPU0lUSU9OX1ZBTChQaW4gPj4gOFUpICogNFUpKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIExvY2sgY29uZmlndXJhdGlvbiBvZiBzZXZlcmFsIHBpbnMgZm9yIGEgZGVkaWNhdGVkIHBvcnQuCisgICogQG5vdGUgICBXaGVuIHRoZSBsb2NrIHNlcXVlbmNlIGhhcyBiZWVuIGFwcGxpZWQgb24gYSBwb3J0IGJpdCwgdGhlCisgICogICAgICAgICB2YWx1ZSBvZiB0aGlzIHBvcnQgYml0IGNhbiBubyBsb25nZXIgYmUgbW9kaWZpZWQgdW50aWwgdGhlCisgICogICAgICAgICBuZXh0IHJlc2V0LgorICAqIEBub3RlICAgRWFjaCBsb2NrIGJpdCBmcmVlemVzIGEgc3BlY2lmaWMgY29uZmlndXJhdGlvbiByZWdpc3RlcgorICAqICAgICAgICAgKGNvbnRyb2wgYW5kIGFsdGVybmF0ZSBmdW5jdGlvbiByZWdpc3RlcnMpLgorICAqIEBybXRvbGwgTENLUiAgICAgICAgIExDS0sgICAgICAgICAgTExfR1BJT19Mb2NrUGluCisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbk1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOX0FMTAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfR1BJT19Mb2NrUGluKEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBpbk1hc2spCit7CisgIF9fSU8gdWludDMyX3QgdGVtcDsKKyAgV1JJVEVfUkVHKEdQSU94LT5MQ0tSLCBHUElPX0xDS1JfTENLSyB8IFBpbk1hc2spOworICBXUklURV9SRUcoR1BJT3gtPkxDS1IsIFBpbk1hc2spOworICBXUklURV9SRUcoR1BJT3gtPkxDS1IsIEdQSU9fTENLUl9MQ0tLIHwgUGluTWFzayk7CisgIHRlbXAgPSBSRUFEX1JFRyhHUElPeC0+TENLUik7CisgICh2b2lkKSB0ZW1wOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiAxIGlmIGFsbCBwaW5zIHBhc3NlZCBhcyBwYXJhbWV0ZXIsIG9mIGEgZGVkaWNhdGVkIHBvcnQsIGFyZSBsb2NrZWQuIGVsc2UgUmV0dXJuIDAuCisgICogQHJtdG9sbCBMQ0tSICAgICAgICAgTENLeSAgICAgICAgICBMTF9HUElPX0lzUGluTG9ja2VkCisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbk1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOX0FMTAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dQSU9fSXNQaW5Mb2NrZWQoR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluTWFzaykKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChHUElPeC0+TENLUiwgUGluTWFzaykgPT0gKFBpbk1hc2spKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gMSBpZiBvbmUgb2YgdGhlIHBpbiBvZiBhIGRlZGljYXRlZCBwb3J0IGlzIGxvY2tlZC4gZWxzZSByZXR1cm4gMC4KKyAgKiBAcm10b2xsIExDS1IgICAgICAgICBMQ0tLICAgICAgICAgIExMX0dQSU9fSXNBbnlQaW5Mb2NrZWQKKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dQSU9fSXNBbnlQaW5Mb2NrZWQoR1BJT19UeXBlRGVmICpHUElPeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChHUElPeC0+TENLUiwgR1BJT19MQ0tSX0xDS0spID09IChHUElPX0xDS1JfTENLSykpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEdQSU9fTExfRUZfRGF0YV9BY2Nlc3MgRGF0YSBBY2Nlc3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBmdWxsIGlucHV0IGRhdGEgcmVnaXN0ZXIgdmFsdWUgZm9yIGEgZGVkaWNhdGVkIHBvcnQuCisgICogQHJtdG9sbCBJRFIgICAgICAgICAgSUR5ICAgICAgICAgICBMTF9HUElPX1JlYWRJbnB1dFBvcnQKKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEByZXR2YWwgSW5wdXQgZGF0YSByZWdpc3RlciB2YWx1ZSBvZiBwb3J0CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR1BJT19SZWFkSW5wdXRQb3J0KEdQSU9fVHlwZURlZiAqR1BJT3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKEdQSU94LT5JRFIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gaWYgaW5wdXQgZGF0YSBsZXZlbCBmb3Igc2V2ZXJhbCBwaW5zIG9mIGRlZGljYXRlZCBwb3J0IGlzIGhpZ2ggb3IgbG93LgorICAqIEBybXRvbGwgSURSICAgICAgICAgIElEeSAgICAgICAgICAgTExfR1BJT19Jc0lucHV0UGluU2V0CisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbk1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOX0FMTAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dQSU9fSXNJbnB1dFBpblNldChHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW5NYXNrKQoreworICByZXR1cm4gKFJFQURfQklUKEdQSU94LT5JRFIsIFBpbk1hc2spID09IChQaW5NYXNrKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgb3V0cHV0IGRhdGEgcmVnaXN0ZXIgZm9yIHRoZSBwb3J0LgorICAqIEBybXRvbGwgT0RSICAgICAgICAgIE9EeSAgICAgICAgICAgTExfR1BJT19Xcml0ZU91dHB1dFBvcnQKKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEBwYXJhbSAgUG9ydFZhbHVlIExldmVsIHZhbHVlIGZvciBlYWNoIHBpbiBvZiB0aGUgcG9ydAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfR1BJT19Xcml0ZU91dHB1dFBvcnQoR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUG9ydFZhbHVlKQoreworICBXUklURV9SRUcoR1BJT3gtPk9EUiwgUG9ydFZhbHVlKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gZnVsbCBvdXRwdXQgZGF0YSByZWdpc3RlciB2YWx1ZSBmb3IgYSBkZWRpY2F0ZWQgcG9ydC4KKyAgKiBAcm10b2xsIE9EUiAgICAgICAgICBPRHkgICAgICAgICAgIExMX0dQSU9fUmVhZE91dHB1dFBvcnQKKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEByZXR2YWwgT3V0cHV0IGRhdGEgcmVnaXN0ZXIgdmFsdWUgb2YgcG9ydAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dQSU9fUmVhZE91dHB1dFBvcnQoR1BJT19UeXBlRGVmICpHUElPeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoR1BJT3gtPk9EUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBpZiBpbnB1dCBkYXRhIGxldmVsIGZvciBzZXZlcmFsIHBpbnMgb2YgZGVkaWNhdGVkIHBvcnQgaXMgaGlnaCBvciBsb3cuCisgICogQHJtdG9sbCBPRFIgICAgICAgICAgT0R5ICAgICAgICAgICBMTF9HUElPX0lzT3V0cHV0UGluU2V0CisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbk1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOX0FMTAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dQSU9fSXNPdXRwdXRQaW5TZXQoR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluTWFzaykKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChHUElPeC0+T0RSLCBQaW5NYXNrKSA9PSAoUGluTWFzaykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBzZXZlcmFsIHBpbnMgdG8gaGlnaCBsZXZlbCBvbiBkZWRpY2F0ZWQgZ3BpbyBwb3J0LgorICAqIEBybXRvbGwgQlNSUiAgICAgICAgIEJTeSAgICAgICAgICAgTExfR1BJT19TZXRPdXRwdXRQaW4KKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEBwYXJhbSAgUGluTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fQUxMCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9HUElPX1NldE91dHB1dFBpbihHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW5NYXNrKQoreworICBXUklURV9SRUcoR1BJT3gtPkJTUlIsIFBpbk1hc2spOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBzZXZlcmFsIHBpbnMgdG8gbG93IGxldmVsIG9uIGRlZGljYXRlZCBncGlvIHBvcnQuCisgICogQHJtdG9sbCBCUlIgICAgICAgICAgQlJ5ICAgICAgICAgICBMTF9HUElPX1Jlc2V0T3V0cHV0UGluCisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbk1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOX0FMTAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfR1BJT19SZXNldE91dHB1dFBpbihHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW5NYXNrKQoreworICBXUklURV9SRUcoR1BJT3gtPkJSUiwgUGluTWFzayk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVG9nZ2xlIGRhdGEgdmFsdWUgZm9yIHNldmVyYWwgcGluIG9mIGRlZGljYXRlZCBwb3J0LgorICAqIEBybXRvbGwgT0RSICAgICAgICAgIE9EeSAgICAgICAgICAgTExfR1BJT19Ub2dnbGVQaW4KKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEBwYXJhbSAgUGluTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fQUxMCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9HUElPX1RvZ2dsZVBpbihHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW5NYXNrKQoreworICBXUklURV9SRUcoR1BJT3gtPk9EUiwgUkVBRF9SRUcoR1BJT3gtPk9EUikgXiBQaW5NYXNrKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBHUElPX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKK0Vycm9yU3RhdHVzIExMX0dQSU9fRGVJbml0KEdQSU9fVHlwZURlZiAqR1BJT3gpOworRXJyb3JTdGF0dXMgTExfR1BJT19Jbml0KEdQSU9fVHlwZURlZiAqR1BJT3gsIExMX0dQSU9fSW5pdFR5cGVEZWYgKkdQSU9fSW5pdFN0cnVjdCk7Cit2b2lkICAgICAgICBMTF9HUElPX1N0cnVjdEluaXQoTExfR1BJT19Jbml0VHlwZURlZiAqR1BJT19Jbml0U3RydWN0KTsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIGRlZmluZWQgKEdQSU9BKSB8fCBkZWZpbmVkIChHUElPQikgfHwgZGVmaW5lZCAoR1BJT0MpIHx8IGRlZmluZWQgKEdQSU9EKSB8fCBkZWZpbmVkIChHUElPRSkgfHwgZGVmaW5lZCAoR1BJT0YpIHx8IGRlZmluZWQgKEdQSU9HKSB8fCBkZWZpbmVkIChHUElPSCkgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyRjN4eF9MTF9HUElPX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmYzeHhfbGxfaHJ0aW0uaCBiL0luYy9zdG0zMmYzeHhfbGxfaHJ0aW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTNhOTBjCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjN4eF9sbF9ocnRpbS5oCkBAIC0wLDAgKzEsMTA1NDIgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfbGxfaHJ0aW0uaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgSFJUSU0gTEwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkYzeHhfTExfSFJUSU1fSAorI2RlZmluZSBfX1NUTTMyRjN4eF9MTF9IUlRJTV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoSFJUSU0xKQorCisvKiogQGRlZmdyb3VwIEhSVElNX0xMIEhSVElNCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEhSVElNX0xMX1ByaXZhdGVfVmFyaWFibGVzIEhSVElNIFByaXZhdGUgVmFyaWFibGVzCisgICogQHsKKyAgKi8KK3N0YXRpYyBjb25zdCB1aW50MTZfdCBSRUdfT0ZGU0VUX1RBQl9USU1FUltdID0KK3sKKyAgMHgwMFUsICAgLyogMDogTUFTVEVSICAqLworICAweDgwVSwgICAvKiAxOiBUSU1FUiBBICovCisgIDB4MTAwVSwgIC8qIDI6IFRJTUVSIEIgICovCisgIDB4MTgwVSwgIC8qIDM6IFRJTUVSIEMgKi8KKyAgMHgyMDBVLCAgLyogNDogVElNRVIgRCAgKi8KKyAgMHgyODBVLCAgLyogNTogVElNRVIgRSAqLworfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgUkVHX09GRlNFVF9UQUJfQURDeFJbXSA9Cit7CisgIDB4MDBVLCAgIC8qIDA6IEhSVElNX0FEQzFSICovCisgIDB4MDRVLCAgIC8qIDE6IEhSVElNX0FEQzJSICovCisgIDB4MDhVLCAgIC8qIDI6IEhSVElNX0FEQzNSICovCisgIDB4MENVLCAgIC8qIDM6IEhSVElNX0FEQzRSICovCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgUkVHX09GRlNFVF9UQUJfU0VUeFJbXSA9Cit7CisgIDB4MDBVLCAgIC8qIDA6IFRBMSAgKi8KKyAgMHgwOFUsICAgLyogMTogVEEyICovCisgIDB4ODBVLCAgIC8qIDI6IFRCMSAgKi8KKyAgMHg4OFUsICAgLyogMzogVEIyICovCisgIDB4MTAwVSwgIC8qIDQ6IFRDMSAgKi8KKyAgMHgxMDhVLCAgLyogNTogVEMyICovCisgIDB4MTgwVSwgIC8qIDY6IFREMSAgKi8KKyAgMHgxODhVLCAgLyogNzogVEQyICovCisgIDB4MjAwVSwgIC8qIDg6IFRFMSAgKi8KKyAgMHgyMDhVICAgLyogOTogVEUyICovCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgUkVHX09GRlNFVF9UQUJfT1VUeFJbXSA9Cit7CisgIDB4MDBVLCAgIC8qIDA6IFRBMSAgKi8KKyAgMHgwMFUsICAgLyogMTogVEEyICovCisgIDB4ODBVLCAgIC8qIDI6IFRCMSAgKi8KKyAgMHg4MFUsICAgLyogMzogVEIyICovCisgIDB4MTAwVSwgIC8qIDQ6IFRDMSAgKi8KKyAgMHgxMDBVLCAgLyogNTogVEMyICovCisgIDB4MTgwVSwgIC8qIDY6IFREMSAgKi8KKyAgMHgxODBVLCAgLyogNzogVEQyICovCisgIDB4MjAwVSwgIC8qIDg6IFRFMSAgKi8KKyAgMHgyMDBVICAgLyogOTogVEUyICovCit9OworCisKK3N0YXRpYyBjb25zdCB1aW50OF90IFJFR19PRkZTRVRfVEFCX09VVF9MRVZFTFtdID0KK3sKKyAgMHgwNFUsICAgLyogMDogTExfSFJUSU1fT1VUX0xFVkVMX0lOQUNUSVZFICAqLworICAweDAwVSAgICAvKiAxOiBMTF9IUlRJTV9PVVRfTEVWRUxfQUNUSVZFICAqLworfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgUkVHX09GRlNFVF9UQUJfRUVDUltdID0KK3sKKyAgMHgwMFUsIC8qIExMX0hSVElNX0VWRU5UXzEgKi8KKyAgMHgwMFUsIC8qIExMX0hSVElNX0VWRU5UXzIgKi8KKyAgMHgwMFUsIC8qIExMX0hSVElNX0VWRU5UXzMgKi8KKyAgMHgwMFUsIC8qIExMX0hSVElNX0VWRU5UXzQgKi8KKyAgMHgwMFUsIC8qIExMX0hSVElNX0VWRU5UXzUgKi8KKyAgMHgwNFUsIC8qIExMX0hSVElNX0VWRU5UXzYgKi8KKyAgMHgwNFUsIC8qIExMX0hSVElNX0VWRU5UXzcgKi8KKyAgMHgwNFUsIC8qIExMX0hSVElNX0VWRU5UXzggKi8KKyAgMHgwNFUsIC8qIExMX0hSVElNX0VWRU5UXzkgKi8KKyAgMHgwNFUgIC8qIExMX0hSVElNX0VWRU5UXzEwICovCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBSRUdfT0ZGU0VUX1RBQl9GTFRJTlJbXSA9Cit7CisgIDB4MDBVLCAvKiBMTF9IUlRJTV9GQVVMVF8xICovCisgIDB4MDBVLCAvKiBMTF9IUlRJTV9GQVVMVF8yICovCisgIDB4MDBVLCAvKiBMTF9IUlRJTV9GQVVMVF8zICovCisgIDB4MDBVLCAvKiBMTF9IUlRJTV9GQVVMVF80ICovCisgIDB4MDRVICAvKiBMTF9IUlRJTV9GQVVMVF81ICovCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgUkVHX01BU0tfVEFCX1VQREFURVRSSUdbXSA9Cit7CisgIDB4MjAwMDAwMDBVLCAgLyogMDogTUFTVEVSICAqLworICAweDAxRkUwMDAwVSwgIC8qIDE6IFRJTUVSIEEgKi8KKyAgMHgwMUZFMDAwMFUsICAvKiAyOiBUSU1FUiBCICovCisgIDB4MDFGRTAwMDBVLCAgLyogMzogVElNRVIgQyAqLworICAweDAxRkUwMDAwVSwgIC8qIDQ6IFRJTUVSIEQgKi8KKyAgMHgwMUZFMDAwMFUsICAvKiA1OiBUSU1FUiBFICovCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBSRUdfU0hJRlRfVEFCX1VQREFURVRSSUdbXSA9Cit7CisgIDEyVSwgLyogMDogTUFTVEVSICAqLworICAwVSwgIC8qIDE6IFRJTUVSIEEgKi8KKyAgMFUsICAvKiAyOiBUSU1FUiBCICAqLworICAwVSwgIC8qIDM6IFRJTUVSIEMgKi8KKyAgMFUsICAvKiA0OiBUSU1FUiBEICAqLworICAwVSwgIC8qIDU6IFRJTUVSIEUgKi8KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IFJFR19TSElGVF9UQUJfRUV4U1JDW10gPQoreworICAwVSwgIC8qIExMX0hSVElNX0VWRU5UXzEgKi8KKyAgNlUsICAvKiBMTF9IUlRJTV9FVkVOVF8yICovCisgIDEyVSwgLyogTExfSFJUSU1fRVZFTlRfMyAqLworICAxOFUsIC8qIExMX0hSVElNX0VWRU5UXzQgKi8KKyAgMjRVLCAvKiBMTF9IUlRJTV9FVkVOVF81ICovCisgIDBVLCAgLyogTExfSFJUSU1fRVZFTlRfNiAqLworICA2VSwgIC8qIExMX0hSVElNX0VWRU5UXzcgKi8KKyAgMTJVLCAvKiBMTF9IUlRJTV9FVkVOVF84ICovCisgIDE4VSwgLyogTExfSFJUSU1fRVZFTlRfOSAqLworICAyNFUgIC8qIExMX0hSVElNX0VWRU5UXzEwICovCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgUkVHX01BU0tfVEFCX1VQREFURUdBVElOR1tdID0KK3sKKyAgSFJUSU1fTUNSX0JSU1RETUEsICAgLyogMDogTUFTVEVSICAqLworICBIUlRJTV9USU1DUl9VUERHQVQsICAvKiAxOiBUSU1FUiBBICovCisgIEhSVElNX1RJTUNSX1VQREdBVCwgIC8qIDI6IFRJTUVSIEIgICovCisgIEhSVElNX1RJTUNSX1VQREdBVCwgIC8qIDM6IFRJTUVSIEMgKi8KKyAgSFJUSU1fVElNQ1JfVVBER0FULCAgLyogNDogVElNRVIgRCAgKi8KKyAgSFJUSU1fVElNQ1JfVVBER0FULCAgLyogNTogVElNRVIgRSAqLworfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgUkVHX1NISUZUX1RBQl9VUERBVEVHQVRJTkdbXSA9Cit7CisgIDJVLCAvKiAwOiBNQVNURVIgICovCisgIDBVLCAvKiAxOiBUSU1FUiBBICovCisgIDBVLCAvKiAyOiBUSU1FUiBCICAqLworICAwVSwgLyogMzogVElNRVIgQyAqLworICAwVSwgLyogNDogVElNRVIgRCAgKi8KKyAgMFUsIC8qIDU6IFRJTUVSIEUgKi8KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IFJFR19TSElGVF9UQUJfT1VUeFJbXSA9Cit7CisgIDBVLCAgLyogMDogVEExICAqLworICAxNlUsIC8qIDE6IFRBMiAqLworICAwVSwgIC8qIDI6IFRCMSAgKi8KKyAgMTZVLCAvKiAzOiBUQjIgKi8KKyAgMFUsICAvKiA0OiBUQzEgICovCisgIDE2VSwgLyogNTogVEMyICovCisgIDBVLCAgLyogNjogVEQxICAqLworICAxNlUsIC8qIDc6IFREMiAqLworICAwVSwgIC8qIDg6IFRFMSAgKi8KKyAgMTZVICAvKiA5OiBURTIgKi8KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IFJFR19TSElGVF9UQUJfT3hTVEFUW10gPQoreworICAwVSwgIC8qIDA6IFRBMSAgKi8KKyAgMVUsICAvKiAxOiBUQTIgKi8KKyAgMFUsICAvKiAyOiBUQjEgICovCisgIDFVLCAgLyogMzogVEIyICovCisgIDBVLCAgLyogNDogVEMxICAqLworICAxVSwgIC8qIDU6IFRDMiAqLworICAwVSwgIC8qIDY6IFREMSAgKi8KKyAgMVUsICAvKiA3OiBURDIgKi8KKyAgMFUsICAvKiA4OiBURTEgICovCisgIDFVICAgLyogOTogVEUyICovCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBSRUdfU0hJRlRfVEFCX0ZMVHhFW10gPQoreworICAwVSwgIC8qIExMX0hSVElNX0ZBVUxUXzEgKi8KKyAgOFUsICAvKiBMTF9IUlRJTV9GQVVMVF8yICovCisgIDE2VSwgLyogTExfSFJUSU1fRkFVTFRfMyAqLworICAyNFUsIC8qIExMX0hSVElNX0ZBVUxUXzQgKi8KKyAgMFUgICAvKiBMTF9IUlRJTV9GQVVMVF81ICovCit9OworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEhSVElNX0xMX1ByaXZhdGVfQ29uc3RhbnRzIEhSVElNIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSFJUSU1fQ1IxX1VESVNfTUFTSyAgICgodWludDMyX3QpKEhSVElNX0NSMV9NVURJUyAgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX0NSMV9UQVVESVMgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX0NSMV9UQlVESVMgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX0NSMV9UQ1VESVMgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX0NSMV9URFVESVMgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX0NSMV9URVVESVMpKQorCisjZGVmaW5lIEhSVElNX0NSMl9TV1VQRF9NQVNLICAgKCh1aW50MzJfdCkoSFJUSU1fQ1IyX01TV1UgIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9DUjJfVEFTV1UgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX0NSMl9UQlNXVSB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fQ1IyX1RDU1dVIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9DUjJfVERTV1UgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX0NSMl9URVNXVSkpCisKKyNkZWZpbmUgSFJUSU1fQ1IyX1NXUlNUX01BU0sgICAoKHVpbnQzMl90KShIUlRJTV9DUjJfTVJTVCAgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX0NSMl9UQVJTVCB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fQ1IyX1RCUlNUIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9DUjJfVENSU1QgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX0NSMl9URFJTVCB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fQ1IyX1RFUlNUKSkKKworI2RlZmluZSBIUlRJTV9PRU5SX09FTl9NQVNLICAgKCh1aW50MzJfdCkoSFJUSU1fT0VOUl9UQTFPRU4gfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX09FTlJfVEEyT0VOIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9PRU5SX1RCMU9FTiB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fT0VOUl9UQjJPRU4gfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX09FTlJfVEMxT0VOIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9PRU5SX1RDMk9FTiB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fT0VOUl9URDFPRU4gfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX09FTlJfVEQyT0VOIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9PRU5SX1RFMU9FTiB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fT0VOUl9URTJPRU4pKQorCisjZGVmaW5lIEhSVElNX09FTlJfT0RJU19NQVNLICAoKHVpbnQzMl90KShIUlRJTV9PRElTUl9UQTFPRElTICB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fT0RJU1JfVEEyT0RJUyAgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX09ESVNSX1RCMU9ESVMgIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9PRElTUl9UQjJPRElTICB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fT0RJU1JfVEMxT0RJUyAgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX09ESVNSX1RDMk9ESVMgIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9PRElTUl9URDFPRElTICB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fT0RJU1JfVEQyT0RJUyAgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX09ESVNSX1RFMU9ESVMgIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9PRElTUl9URTJPRElTKSkKKworI2RlZmluZSBIUlRJTV9PVVRfQ09ORklHX01BU0sgICgodWludDMyX3QpKEhSVElNX09VVFJfUE9MMSAgIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fT1VUUl9JRExNMSAgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9PVVRSX0lETEVTMSB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX09VVFJfRkFVTFQxIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fT1VUUl9DSFAxICAgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9PVVRSX0RJREwxKSkKKworI2RlZmluZSBIUlRJTV9FRV9DT05GSUdfTUFTSyAgICgodWludDMyX3QpKEhSVElNX0VFQ1IxX0VFMVNSQyB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX0VFQ1IxX0VFMVBPTCB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX0VFQ1IxX0VFMVNOUyB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX0VFQ1IxX0VFMUZBU1QpKQorCisjZGVmaW5lIEhSVElNX0ZMVF9DT05GSUdfTUFTSyAgICgodWludDMyX3QpKEhSVElNX0ZMVElOUjFfRkxUMVAgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fRkxUSU5SMV9GTFQxU1JDKSkKKworI2RlZmluZSBIUlRJTV9CTV9DT05GSUdfTUFTSyAgICgodWludDMyX3QpKCBIUlRJTV9CTUNSX0JNUFJTQyB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9CTUNSX0JNQ0xLICB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9CTUNSX0JNT00pKQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBIUlRJTV9MTF9FU19JTklUIEhSVElNIEV4cG9ydGVkIEluaXQgc3RydWN0dXJlCisgICogQHsKKyAgKi8KKy8qIFRPIEJFIENPTVBMRVRFRCAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSFJUSU1fTExfRXhwb3J0ZWRfQ29uc3RhbnRzIEhSVElNIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRUNfR0VUX0ZMQUcgR2V0IEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0hSVElNX1JlYWRSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9IUlRJTV9JU1JfRkxUMSAgICAgICAgICAgICAgICAgIEhSVElNX0lTUl9GTFQxCisjZGVmaW5lIExMX0hSVElNX0lTUl9GTFQyICAgICAgICAgICAgICAgICAgSFJUSU1fSVNSX0ZMVDIKKyNkZWZpbmUgTExfSFJUSU1fSVNSX0ZMVDMgICAgICAgICAgICAgICAgICBIUlRJTV9JU1JfRkxUMworI2RlZmluZSBMTF9IUlRJTV9JU1JfRkxUNCAgICAgICAgICAgICAgICAgIEhSVElNX0lTUl9GTFQ0CisjZGVmaW5lIExMX0hSVElNX0lTUl9GTFQ1ICAgICAgICAgICAgICAgICAgSFJUSU1fSVNSX0ZMVDUKKyNkZWZpbmUgTExfSFJUSU1fSVNSX1NZU0ZMVCAgICAgICAgICAgICAgICBIUlRJTV9JU1JfU1lTRkxUCisjZGVmaW5lIExMX0hSVElNX0lTUl9ETExSRFkgICAgICAgICAgICAgICAgSFJUSU1fSVNSX0RMTFJEWQorI2RlZmluZSBMTF9IUlRJTV9JU1JfQk1QRVIgICAgICAgICAgICAgICAgIEhSVElNX0lTUl9CTVBFUgorCisjZGVmaW5lIExMX0hSVElNX01JU1JfTUNNUDEgICAgICAgICAgICAgICAgSFJUSU1fTUlTUl9NQ01QMQorI2RlZmluZSBMTF9IUlRJTV9NSVNSX01DTVAyICAgICAgICAgICAgICAgIEhSVElNX01JU1JfTUNNUDIKKyNkZWZpbmUgTExfSFJUSU1fTUlTUl9NQ01QMyAgICAgICAgICAgICAgICBIUlRJTV9NSVNSX01DTVAzCisjZGVmaW5lIExMX0hSVElNX01JU1JfTUNNUDQgICAgICAgICAgICAgICAgSFJUSU1fTUlTUl9NQ01QNAorI2RlZmluZSBMTF9IUlRJTV9NSVNSX01SRVAgICAgICAgICAgICAgICAgIEhSVElNX01JU1JfTVJFUAorI2RlZmluZSBMTF9IUlRJTV9NSVNSX1NZTkMgICAgICAgICAgICAgICAgIEhSVElNX01JU1JfU1lOQworI2RlZmluZSBMTF9IUlRJTV9NSVNSX01VUEQgICAgICAgICAgICAgICAgIEhSVElNX01JU1JfTVVQRAorCisjZGVmaW5lIExMX0hSVElNX1RJTUlTUl9DTVAxICAgICAgICAgICAgICAgSFJUSU1fVElNSVNSX0NNUDEKKyNkZWZpbmUgTExfSFJUSU1fVElNSVNSX0NNUDIgICAgICAgICAgICAgICBIUlRJTV9USU1JU1JfQ01QMgorI2RlZmluZSBMTF9IUlRJTV9USU1JU1JfQ01QMyAgICAgICAgICAgICAgIEhSVElNX1RJTUlTUl9DTVAzCisjZGVmaW5lIExMX0hSVElNX1RJTUlTUl9DTVA0ICAgICAgICAgICAgICAgSFJUSU1fVElNSVNSX0NNUDQKKyNkZWZpbmUgTExfSFJUSU1fVElNSVNSX1JFUCAgICAgICAgICAgICAgICBIUlRJTV9USU1JU1JfUkVQCisjZGVmaW5lIExMX0hSVElNX1RJTUlTUl9VUEQgICAgICAgICAgICAgICAgSFJUSU1fVElNSVNSX1VQRAorI2RlZmluZSBMTF9IUlRJTV9USU1JU1JfQ1BUMSAgICAgICAgICAgICAgIEhSVElNX1RJTUlTUl9DUFQxCisjZGVmaW5lIExMX0hSVElNX1RJTUlTUl9DUFQyICAgICAgICAgICAgICAgSFJUSU1fVElNSVNSX0NQVDIKKyNkZWZpbmUgTExfSFJUSU1fVElNSVNSX1NFVDEgICAgICAgICAgICAgICBIUlRJTV9USU1JU1JfU0VUMQorI2RlZmluZSBMTF9IUlRJTV9USU1JU1JfUlNUMSAgICAgICAgICAgICAgIEhSVElNX1RJTUlTUl9SU1QxCisjZGVmaW5lIExMX0hSVElNX1RJTUlTUl9TRVQyICAgICAgICAgICAgICAgSFJUSU1fVElNSVNSX1NFVDIKKyNkZWZpbmUgTExfSFJUSU1fVElNSVNSX1JTVDIgICAgICAgICAgICAgICBIUlRJTV9USU1JU1JfUlNUMgorI2RlZmluZSBMTF9IUlRJTV9USU1JU1JfUlNUICAgICAgICAgICAgICAgIEhSVElNX1RJTUlTUl9SU1QKKyNkZWZpbmUgTExfSFJUSU1fVElNSVNSX0RMWVBSVCAgICAgICAgICAgICBIUlRJTV9USU1JU1JfRExZUFJUCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0VDX0lUIElUIERlZmluZXMKKyAgKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0hSVElNX1JlYWRSZWcgYW5kIExMX0hSVElNX1dyaXRlUmVnIGZ1bmN0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIExMX0hSVElNX0lFUl9GTFQxSUUgICAgICAgICAgICAgICAgSFJUSU1fSUVSX0ZMVDFJRQorI2RlZmluZSBMTF9IUlRJTV9JRVJfRkxUMklFICAgICAgICAgICAgICAgIEhSVElNX0lFUl9GTFQySUUKKyNkZWZpbmUgTExfSFJUSU1fSUVSX0ZMVDNJRSAgICAgICAgICAgICAgICBIUlRJTV9JRVJfRkxUM0lFCisjZGVmaW5lIExMX0hSVElNX0lFUl9GTFQ0SUUgICAgICAgICAgICAgICAgSFJUSU1fSUVSX0ZMVDRJRQorI2RlZmluZSBMTF9IUlRJTV9JRVJfRkxUNUlFICAgICAgICAgICAgICAgIEhSVElNX0lFUl9GTFQ1SUUKKyNkZWZpbmUgTExfSFJUSU1fSUVSX1NZU0ZMVElFICAgICAgICAgICAgICBIUlRJTV9JRVJfU1lTRkxUSUUKKyNkZWZpbmUgTExfSFJUSU1fSUVSX0RMTFJEWUlFICAgICAgICAgICAgICBIUlRJTV9JRVJfRExMUkRZSUUKKyNkZWZpbmUgTExfSFJUSU1fSUVSX0JNUEVSSUUgICAgICAgICAgICAgICBIUlRJTV9JRVJfQk1QRVJJRQorCisjZGVmaW5lIExMX0hSVElNX01ESUVSX01DTVAxSUUgICAgICAgICAgICAgSFJUSU1fTURJRVJfTUNNUDFJRQorI2RlZmluZSBMTF9IUlRJTV9NRElFUl9NQ01QMklFICAgICAgICAgICAgIEhSVElNX01ESUVSX01DTVAySUUKKyNkZWZpbmUgTExfSFJUSU1fTURJRVJfTUNNUDNJRSAgICAgICAgICAgICBIUlRJTV9NRElFUl9NQ01QM0lFCisjZGVmaW5lIExMX0hSVElNX01ESUVSX01DTVA0SUUgICAgICAgICAgICAgSFJUSU1fTURJRVJfTUNNUDRJRQorI2RlZmluZSBMTF9IUlRJTV9NRElFUl9NUkVQSUUgICAgICAgICAgICAgIEhSVElNX01ESUVSX01SRVBJRQorI2RlZmluZSBMTF9IUlRJTV9NRElFUl9TWU5DSUUgICAgICAgICAgICAgIEhSVElNX01ESUVSX1NZTkNJRQorI2RlZmluZSBMTF9IUlRJTV9NRElFUl9NVVBESUUgICAgICAgICAgICAgIEhSVElNX01ESUVSX01VUERJRQorCisKKyNkZWZpbmUgTExfSFJUSU1fVElNRElFUl9DTVAxSUUgICAgICAgICAgICBIUlRJTV9USU1ESUVSX0NNUDFJRQorI2RlZmluZSBMTF9IUlRJTV9USU1ESUVSX0NNUDJJRSAgICAgICAgICAgIEhSVElNX1RJTURJRVJfQ01QMklFCisjZGVmaW5lIExMX0hSVElNX1RJTURJRVJfQ01QM0lFICAgICAgICAgICAgSFJUSU1fVElNRElFUl9DTVAzSUUKKyNkZWZpbmUgTExfSFJUSU1fVElNRElFUl9DTVA0SUUgICAgICAgICAgICBIUlRJTV9USU1ESUVSX0NNUDRJRQorI2RlZmluZSBMTF9IUlRJTV9USU1ESUVSX1JFUElFICAgICAgICAgICAgIEhSVElNX1RJTURJRVJfUkVQSUUKKyNkZWZpbmUgTExfSFJUSU1fVElNRElFUl9VUERJRSAgICAgICAgICAgICBIUlRJTV9USU1ESUVSX1VQRElFCisjZGVmaW5lIExMX0hSVElNX1RJTURJRVJfQ1BUMUlFICAgICAgICAgICAgSFJUSU1fVElNRElFUl9DUFQxSUUKKyNkZWZpbmUgTExfSFJUSU1fVElNRElFUl9DUFQySUUgICAgICAgICAgICBIUlRJTV9USU1ESUVSX0NQVDJJRQorI2RlZmluZSBMTF9IUlRJTV9USU1ESUVSX1NFVDFJRSAgICAgICAgICAgIEhSVElNX1RJTURJRVJfU0VUMUlFCisjZGVmaW5lIExMX0hSVElNX1RJTURJRVJfUlNUMUlFICAgICAgICAgICAgSFJUSU1fVElNRElFUl9SU1QxSUUKKyNkZWZpbmUgTExfSFJUSU1fVElNRElFUl9TRVQySUUgICAgICAgICAgICBIUlRJTV9USU1ESUVSX1NFVDJJRQorI2RlZmluZSBMTF9IUlRJTV9USU1ESUVSX1JTVDJJRSAgICAgICAgICAgIEhSVElNX1RJTURJRVJfUlNUMklFCisjZGVmaW5lIExMX0hSVElNX1RJTURJRVJfUlNUSUUgICAgICAgICAgICAgSFJUSU1fVElNRElFUl9SU1RJRQorI2RlZmluZSBMTF9IUlRJTV9USU1ESUVSX0RMWVBSVElFICAgICAgICAgIEhSVElNX1RJTURJRVJfRExZUFJUSUUKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRUNfU1lOQ0lOX1NSQyAgU1lOQ0hST05JWkFUSU9OIElOUFVUIFNPVVJDRQorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyBkZWZpbmluZyB0aGUgc3luY2hyb25pemF0aW9uIGlucHV0IHNvdXJjZS4KKyAgKi8KKyNkZWZpbmUgTExfSFJUSU1fU1lOQ0lOX1NSQ19OT05FICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgLyohPCBIUlRJTSBpcyBub3Qgc3luY2hyb25pemVkIGFuZCBydW5zIGluIHN0YW5kYWxvbmUgbW9kZSAqLworI2RlZmluZSBMTF9IUlRJTV9TWU5DSU5fU1JDX1RJTV9FVkVOVCAgICAgICAoSFJUSU1fTUNSX1NZTkNfSU5fMSkgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBIUlRJTSBpcyBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgb24tY2hpcCB0aW1lciAqLworI2RlZmluZSBMTF9IUlRJTV9TWU5DSU5fU1JDX0VYVEVSTkFMX0VWRU5UICAoSFJUSU1fTUNSX1NZTkNfSU5fMSB8IEhSVElNX01DUl9TWU5DX0lOXzApICAvKiE8IEEgcG9zaXRpdmUgcHVsc2Ugb24gU1lOQ0lOIGlucHV0IHRyaWdnZXJzIHRoZSBIUlRJTSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9FQ19TWU5DT1VUX1NSQyAgU1lOQ0hST05JWkFUSU9OIE9VVFBVVCBTT1VSQ0UKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgdGhlIHNvdXJjZSBhbmQgZXZlbnQgdG8gYmUgc2VudCBvbiB0aGUgc3luY2hyb25pemF0aW9uIG91dHB1dC4KKyAgKi8KKyNkZWZpbmUgTExfSFJUSU1fU1lOQ09VVF9TUkNfTUFTVEVSX1NUQVJUICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQSBwdWxzZSBpcyBzZW50IG9uIHRoZSBTWU5DT1VUIG91dHB1dCB1cG9uIG1hc3RlciB0aW1lciBzdGFydCBldmVudCAqLworI2RlZmluZSBMTF9IUlRJTV9TWU5DT1VUX1NSQ19NQVNURVJfQ01QMSAgIChIUlRJTV9NQ1JfU1lOQ19TUkNfMCkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBIHB1bHNlIGlzIHNlbnQgb24gdGhlIFNZTkNPVVQgb3V0cHV0IHVwb24gbWFzdGVyIHRpbWVyIGNvbXBhcmUgMSBldmVudCovCisjZGVmaW5lIExMX0hSVElNX1NZTkNPVVRfU1JDX1RJTUFfU1RBUlQgICAgKEhSVElNX01DUl9TWU5DX1NSQ18xKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEEgcHVsc2UgaXMgc2VudCBvbiB0aGUgU1lOQ09VVCBvdXRwdXQgdXBvbiB0aW1lciBBIHN0YXJ0IG9yIHJlc2V0IGV2ZW50cyAqLworI2RlZmluZSBMTF9IUlRJTV9TWU5DT1VUX1NSQ19USU1BX0NNUDEgICAgIChIUlRJTV9NQ1JfU1lOQ19TUkNfMSB8IEhSVElNX01DUl9TWU5DX1NSQ18wKSAgLyohPCBBIHB1bHNlIGlzIHNlbnQgb24gdGhlIFNZTkNPVVQgb3V0cHV0IHVwb24gdGltZXIgQSBjb21wYXJlIDEgZXZlbnQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRUNfU1lOQ09VVF9QT0xBUklUWSAgU1lOQ0hST05JWkFUSU9OIE9VVFBVVCBQT0xBUklUWQorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB0aGUgcm91dGluZyBhbmQgY29uZGl0aW9uaW5nIG9mIHRoZSBzeW5jaHJvbml6YXRpb24gb3V0cHV0IGV2ZW50LgorICAqLworI2RlZmluZSBMTF9IUlRJTV9TWU5DT1VUX0RJU0FCTEVEICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBvdXRwdXQgZXZlbnQgaXMgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTExfSFJUSU1fU1lOQ09VVF9QT1NJVElWRV9QVUxTRSAoSFJUSU1fTUNSX1NZTkNfT1VUXzEpICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTQ09VVCBwaW4gaGFzIGEgbG93IGlkbGUgbGV2ZWwgYW5kIGlzc3VlcyBhIHBvc2l0aXZlIHB1bHNlIG9mIDE2IGZIUlRJTSBjbG9jayBjeWNsZXMgbGVuZ3RoIGZvciB0aGUgc3luY2hyb25pemF0aW9uICovCisjZGVmaW5lIExMX0hSVElNX1NZTkNPVVRfTkVHQVRJVkVfUFVMU0UgKEhSVElNX01DUl9TWU5DX09VVF8xIHwgSFJUSU1fTUNSX1NZTkNfT1VUXzApIC8qITwgU0NPVVQgcGluIGhhcyBhIGhpZ2ggaWRsZSBsZXZlbCBhbmQgaXNzdWVzIGEgbmVnYXRpdmUgcHVsc2Ugb2YgMTYgZkhSVElNIGNsb2NrIGN5Y2xlcyBsZW5ndGggZm9yIHRoZSBzeW5jaHJvbml6YXRpb24gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRUNfVElNRVIgIFRJTUVSIElECisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGlkZW50aWZ5aW5nIGEgdGltaW5nIHVuaXQuCisgICovCisjZGVmaW5lIExMX0hSVElNX1RJTUVSX01BU1RFUiAgICAgICAgICAgICAgSFJUSU1fTUNSX01DRU4gICAvKiE8IE1hc3RlciB0aW1lciBpZGVudGlmaWVyICovCisjZGVmaW5lIExMX0hSVElNX1RJTUVSX0EgICAgICAgICAgICAgICAgICAgSFJUSU1fTUNSX1RBQ0VOICAvKiE8IFRpbWVyIEEgaWRlbnRpZmllciAqLworI2RlZmluZSBMTF9IUlRJTV9USU1FUl9CICAgICAgICAgICAgICAgICAgIEhSVElNX01DUl9UQkNFTiAgLyohPCBUaW1lciBCIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgTExfSFJUSU1fVElNRVJfQyAgICAgICAgICAgICAgICAgICBIUlRJTV9NQ1JfVENDRU4gIC8qITwgVGltZXIgQyBpZGVudGlmaWVyICovCisjZGVmaW5lIExMX0hSVElNX1RJTUVSX0QgICAgICAgICAgICAgICAgICAgSFJUSU1fTUNSX1REQ0VOICAvKiE8IFRpbWVyIEQgaWRlbnRpZmllciAqLworI2RlZmluZSBMTF9IUlRJTV9USU1FUl9FICAgICAgICAgICAgICAgICAgIEhSVElNX01DUl9URUNFTiAgLyohPCBUaW1lciBFIGlkZW50aWZpZXIgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRUNfT1VUUFVUICBPVVRQVVQgSUQKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgaWRlbnRpZnlpbmcgYW4gSFJUSU0gb3V0cHV0LgorICAqLworI2RlZmluZSBMTF9IUlRJTV9PVVRQVVRfVEExICAgICAgICAgICAgICAgIEhSVElNX09FTlJfVEExT0VOICAvKiE8IFRpbWVyIEEgLSBPdXRwdXQgMSBpZGVudGlmaWVyICovCisjZGVmaW5lIExMX0hSVElNX09VVFBVVF9UQTIgICAgICAgICAgICAgICAgSFJUSU1fT0VOUl9UQTJPRU4gIC8qITwgVGltZXIgQSAtIE91dHB1dCAyIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgTExfSFJUSU1fT1VUUFVUX1RCMSAgICAgICAgICAgICAgICBIUlRJTV9PRU5SX1RCMU9FTiAgLyohPCBUaW1lciBCIC0gT3V0cHV0IDEgaWRlbnRpZmllciAqLworI2RlZmluZSBMTF9IUlRJTV9PVVRQVVRfVEIyICAgICAgICAgICAgICAgIEhSVElNX09FTlJfVEIyT0VOICAvKiE8IFRpbWVyIEIgLSBPdXRwdXQgMiBpZGVudGlmaWVyICovCisjZGVmaW5lIExMX0hSVElNX09VVFBVVF9UQzEgICAgICAgICAgICAgICAgSFJUSU1fT0VOUl9UQzFPRU4gIC8qITwgVGltZXIgQyAtIE91dHB1dCAxIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgTExfSFJUSU1fT1VUUFVUX1RDMiAgICAgICAgICAgICAgICBIUlRJTV9PRU5SX1RDMk9FTiAgLyohPCBUaW1lciBDIC0gT3V0cHV0IDIgaWRlbnRpZmllciAqLworI2RlZmluZSBMTF9IUlRJTV9PVVRQVVRfVEQxICAgICAgICAgICAgICAgIEhSVElNX09FTlJfVEQxT0VOICAvKiE8IFRpbWVyIEQgLSBPdXRwdXQgMSBpZGVudGlmaWVyICovCisjZGVmaW5lIExMX0hSVElNX09VVFBVVF9URDIgICAgICAgICAgICAgICAgSFJUSU1fT0VOUl9URDJPRU4gIC8qITwgVGltZXIgRCAtIE91dHB1dCAyIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgTExfSFJUSU1fT1VUUFVUX1RFMSAgICAgICAgICAgICAgICBIUlRJTV9PRU5SX1RFMU9FTiAgLyohPCBUaW1lciBFIC0gT3V0cHV0IDEgaWRlbnRpZmllciAqLworI2RlZmluZSBMTF9IUlRJTV9PVVRQVVRfVEUyICAgICAgICAgICAgICAgIEhSVElNX09FTlJfVEUyT0VOICAvKiE8IFRpbWVyIEUgLSBPdXRwdXQgMiBpZGVudGlmaWVyICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0VDX0NPTVBBUkVVTklUICBDT01QQVJFIFVOSVQgSUQKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgaWRlbnRpZnlpbmcgYSBjb21wYXJlIHVuaXQuCisgICovCisjZGVmaW5lIExMX0hSVElNX0NPTVBBUkVVTklUXzIgICAgICAgICAgICAgSFJUSU1fVElNQ1JfREVMQ01QMiAgLyohPCBDb21wYXJlIHVuaXQgMiBpZGVudGlmaWVyICovCisjZGVmaW5lIExMX0hSVElNX0NPTVBBUkVVTklUXzQgICAgICAgICAgICAgSFJUSU1fVElNQ1JfREVMQ01QNCAgLyohPCBDb21wYXJlIHVuaXQgNCBpZGVudGlmaWVyICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0VDX0NBUFRVUkVVTklUICBDQVBUVVJFIFVOSVQgSUQKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgaWRlbnRpZnlpbmcgYSBjYXB0dXJlIHVuaXQuCisgICovCisjZGVmaW5lIExMX0hSVElNX0NBUFRVUkVVTklUXzEgICAgICAgICAgICAgMCAgLyohPCBDYXB0dXJlIHVuaXQgMSBpZGVudGlmaWVyICovCisjZGVmaW5lIExMX0hSVElNX0NBUFRVUkVVTklUXzIgICAgICAgICAgICAgMSAgLyohPCBDYXB0dXJlIHVuaXQgMiBpZGVudGlmaWVyICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0VDX0ZBVUxUICBGQVVMVCBJRAorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBpZGVudGlmeWluZyBhIGZhdWx0IGNoYW5uZWwuCisgICovCisjZGVmaW5lIExMX0hSVElNX0ZBVUxUXzEgICAgICBIUlRJTV9GTFRSX0ZMVDFFTiAgICAgLyohPCBGYXVsdCBjaGFubmVsIDEgaWRlbnRpZmllciAqLworI2RlZmluZSBMTF9IUlRJTV9GQVVMVF8yICAgICAgSFJUSU1fRkxUUl9GTFQyRU4gICAgIC8qITwgRmF1bHQgY2hhbm5lbCAyIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgTExfSFJUSU1fRkFVTFRfMyAgICAgIEhSVElNX0ZMVFJfRkxUM0VOICAgICAvKiE8IEZhdWx0IGNoYW5uZWwgMyBpZGVudGlmaWVyICovCisjZGVmaW5lIExMX0hSVElNX0ZBVUxUXzQgICAgICBIUlRJTV9GTFRSX0ZMVDRFTiAgICAgLyohPCBGYXVsdCBjaGFubmVsIDQgaWRlbnRpZmllciAqLworI2RlZmluZSBMTF9IUlRJTV9GQVVMVF81ICAgICAgSFJUSU1fRkxUUl9GTFQ1RU4gICAgIC8qITwgRmF1bHQgY2hhbm5lbCA1IGlkZW50aWZpZXIgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRUNfRVZFTlQgIEVYVEVSTkFMIEVWRU5UIElECisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGlkZW50aWZ5aW5nIGFuIGV4dGVybmFsIGV2ZW50IGNoYW5uZWwuCisgICovCisjZGVmaW5lIExMX0hSVElNX0VWRU5UXzEgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMVUpICAgICAvKiE8IEV4dGVybmFsIGV2ZW50IGNoYW5uZWwgMSBpZGVudGlmaWVyICovCisjZGVmaW5lIExMX0hSVElNX0VWRU5UXzIgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMlUpICAgICAvKiE8IEV4dGVybmFsIGV2ZW50IGNoYW5uZWwgMiBpZGVudGlmaWVyICovCisjZGVmaW5lIExMX0hSVElNX0VWRU5UXzMgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNFUpICAgICAvKiE8IEV4dGVybmFsIGV2ZW50IGNoYW5uZWwgMyBpZGVudGlmaWVyICovCisjZGVmaW5lIExMX0hSVElNX0VWRU5UXzQgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwOFUpICAgICAvKiE8IEV4dGVybmFsIGV2ZW50IGNoYW5uZWwgNCBpZGVudGlmaWVyICovCisjZGVmaW5lIExMX0hSVElNX0VWRU5UXzUgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAxMFUpICAgICAvKiE8IEV4dGVybmFsIGV2ZW50IGNoYW5uZWwgNSBpZGVudGlmaWVyICovCisjZGVmaW5lIExMX0hSVElNX0VWRU5UXzYgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAyMFUpICAgICAvKiE8IEV4dGVybmFsIGV2ZW50IGNoYW5uZWwgNiBpZGVudGlmaWVyICovCisjZGVmaW5lIExMX0hSVElNX0VWRU5UXzcgICAgICAgICgodWludDMyX3QpMHgwMDAwMDA0MFUpICAgICAvKiE8IEV4dGVybmFsIGV2ZW50IGNoYW5uZWwgNyBpZGVudGlmaWVyICovCisjZGVmaW5lIExMX0hSVElNX0VWRU5UXzggICAgICAgICgodWludDMyX3QpMHgwMDAwMDA4MFUpICAgICAvKiE8IEV4dGVybmFsIGV2ZW50IGNoYW5uZWwgOCBpZGVudGlmaWVyICovCisjZGVmaW5lIExMX0hSVElNX0VWRU5UXzkgICAgICAgICgodWludDMyX3QpMHgwMDAwMDEwMFUpICAgICAvKiE8IEV4dGVybmFsIGV2ZW50IGNoYW5uZWwgOSBpZGVudGlmaWVyICovCisjZGVmaW5lIExMX0hSVElNX0VWRU5UXzEwICAgICAgICgodWludDMyX3QpMHgwMDAwMDIwMFUpICAgICAvKiE8IEV4dGVybmFsIGV2ZW50IGNoYW5uZWwgMTAgaWRlbnRpZmllciAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9FQ19PVVRQVVRTVEFURSAgT1VUUFVUIFNUQVRFCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRoZSBzdGF0ZSBvZiBhbiBIUlRJTSBvdXRwdXQuCisgICovCisjZGVmaW5lIExMX0hSVElNX09VVFBVVFNUQVRFX0lETEUgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxVSkgLyohPCBNYWluIG9wZXJhdGluZyBtb2RlLCB3aGVyZSB0aGUgb3V0cHV0IGNhbiB0YWtlIHRoZSBhY3RpdmUgb3IgaW5hY3RpdmUgbGV2ZWwgYXMgcHJvZ3JhbW1lZCBpbiB0aGUgY3Jvc3NiYXIgdW5pdCAqLworI2RlZmluZSBMTF9IUlRJTV9PVVRQVVRTVEFURV9SVU4gICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMlUpIC8qITwgRGVmYXVsdCBvcGVyYXRpbmcgc3RhdGUgKGUuZy4gYWZ0ZXIgYW4gSFJUSU0gcmVzZXQsIHdoZW4gdGhlIG91dHB1dHMgYXJlIGRpc2FibGVkIGJ5IHNvZnR3YXJlIG9yIGR1cmluZyBhIGJ1cnN0IG1vZGUgb3BlcmF0aW9uKSAqLworI2RlZmluZSBMTF9IUlRJTV9PVVRQVVRTVEFURV9GQVVMVCAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwM1UpIC8qITwgU2FmZXR5IHN0YXRlLCBlbnRlcmVkIGluIGNhc2Ugb2YgYSBzaHV0LWRvd24gcmVxdWVzdCBvbiBGQVVMVHggaW5wdXRzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0VDX0FEQ1RSSUcgIEFEQyBUUklHR0VSCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGlkZW50aWZ5aW5nIGFuIEFEQyB0cmlnZ2VyLgorICAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHXzEgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpIC8qITwgQURDIHRyaWdnZXIgMSBpZGVudGlmaWVyICovCisjZGVmaW5lIExMX0hSVElNX0FEQ1RSSUdfMiAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxVSkgIC8qITwgQURDIHRyaWdnZXIgMiBpZGVudGlmaWVyICovCisjZGVmaW5lIExMX0hSVElNX0FEQ1RSSUdfMyAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAyVSkgIC8qITwgQURDIHRyaWdnZXIgMyBpZGVudGlmaWVyICovCisjZGVmaW5lIExMX0hSVElNX0FEQ1RSSUdfNCAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAzVSkgIC8qITwgQURDIHRyaWdnZXIgNCBpZGVudGlmaWVyICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0VDX0FEQ1RSSUdfVVBEQVRFIEFEQyBUUklHR0VSIFVQREFURQorICAqIEB7CisgICogQGJyaWVmIGNvbnN0YW50cyBkZWZpbmluZyB0aGUgc291cmNlIHRyaWdnZXJpbmcgdGhlIHVwZGF0ZSBvZiB0aGUgSFJUSU1fQURDeFIgcmVnaXN0ZXIgKHRyYW5zZmVyIGZyb20gcHJlbG9hZCB0byBhY3RpdmUgcmVnaXN0ZXIpLgorICAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1VQREFURV9NQVNURVIgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEhSVElNX0FEQ3hSIHJlZ2lzdGVyIHVwZGF0ZSBpcyB0cmlnZ2VyZWQgYnkgdGhlIE1hc3RlciB0aW1lciAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1VQREFURV9USU1FUl9BIChIUlRJTV9DUjFfQURDMVVTUkNfMCkgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEhSVElNX0FEQ3hSIHJlZ2lzdGVyIHVwZGF0ZSBpcyB0cmlnZ2VyZWQgYnkgdGhlIFRpbWVyIEEgKi8KKyNkZWZpbmUgTExfSFJUSU1fQURDVFJJR19VUERBVEVfVElNRVJfQiAoSFJUSU1fQ1IxX0FEQzFVU1JDXzEpICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBIUlRJTV9BREN4UiByZWdpc3RlciB1cGRhdGUgaXMgdHJpZ2dlcmVkIGJ5IHRoZSBUaW1lciBCICovCisjZGVmaW5lIExMX0hSVElNX0FEQ1RSSUdfVVBEQVRFX1RJTUVSX0MgKEhSVElNX0NSMV9BREMxVVNSQ18xIHwgSFJUSU1fQ1IxX0FEQzFVU1JDXzApIC8qITwgSFJUSU1fQURDeFIgcmVnaXN0ZXIgdXBkYXRlIGlzIHRyaWdnZXJlZCBieSB0aGUgVGltZXIgQyAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1VQREFURV9USU1FUl9EIChIUlRJTV9DUjFfQURDMVVTUkNfMikgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEhSVElNX0FEQ3hSIHJlZ2lzdGVyIHVwZGF0ZSBpcyB0cmlnZ2VyZWQgYnkgdGhlIFRpbWVyIEQgKi8KKyNkZWZpbmUgTExfSFJUSU1fQURDVFJJR19VUERBVEVfVElNRVJfRSAoSFJUSU1fQ1IxX0FEQzFVU1JDXzIgfCBIUlRJTV9DUjFfQURDMVVTUkNfMCkgLyohPCBIUlRJTV9BREN4UiByZWdpc3RlciB1cGRhdGUgaXMgdHJpZ2dlcmVkIGJ5IHRoZSBUaW1lciBFICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0VDX0FEQ1RSSUdfU1JDMTMgIEFEQyBUUklHR0VSIDEvMyBTT1VSQ0UKKyAgKiBAeworICAqIEBicmllZiBjb25zdGFudHMgZGVmaW5pbmcgdGhlIGV2ZW50cyB0cmlnZ2VyaW5nIEFEQyBjb252ZXJzaW9uIGZvciBBREMgVHJpZ2dlcnMgMSBhbmQgMy4KKyAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQURDVFJJR19TUkMxM19OT05FICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgLyohPCBObyBBREMgdHJpZ2dlciBldmVudCAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzEzX01DTVAxICAgICAgICAgIEhSVElNX0FEQzFSX0FEMU1DMSAgICAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIG1hc3RlciBjb21wYXJlIDEgKi8KKyNkZWZpbmUgTExfSFJUSU1fQURDVFJJR19TUkMxM19NQ01QMiAgICAgICAgICBIUlRJTV9BREMxUl9BRDFNQzIgICAgICAgLyohPCBBREMgVHJpZ2dlciBvbiBtYXN0ZXIgY29tcGFyZSAyICovCisjZGVmaW5lIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfTUNNUDMgICAgICAgICAgSFJUSU1fQURDMVJfQUQxTUMzICAgICAgIC8qITwgQURDIFRyaWdnZXIgb24gbWFzdGVyIGNvbXBhcmUgMyAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzEzX01DTVA0ICAgICAgICAgIEhSVElNX0FEQzFSX0FEMU1DNCAgICAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIG1hc3RlciBjb21wYXJlIDQgKi8KKyNkZWZpbmUgTExfSFJUSU1fQURDVFJJR19TUkMxM19NUEVSICAgICAgICAgICBIUlRJTV9BREMxUl9BRDFNUEVSICAgICAgLyohPCBBREMgVHJpZ2dlciBvbiBtYXN0ZXIgcGVyaW9kICovCisjZGVmaW5lIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfRUVWMSAgICAgICAgICAgSFJUSU1fQURDMVJfQUQxRUVWMSAgICAgIC8qITwgQURDIFRyaWdnZXIgb24gZXh0ZXJuYWwgZXZlbnQgMSAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzEzX0VFVjIgICAgICAgICAgIEhSVElNX0FEQzFSX0FEMUVFVjIgICAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIGV4dGVybmFsIGV2ZW50IDIgKi8KKyNkZWZpbmUgTExfSFJUSU1fQURDVFJJR19TUkMxM19FRVYzICAgICAgICAgICBIUlRJTV9BREMxUl9BRDFFRVYzICAgICAgLyohPCBBREMgVHJpZ2dlciBvbiBleHRlcm5hbCBldmVudCAzICovCisjZGVmaW5lIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfRUVWNCAgICAgICAgICAgSFJUSU1fQURDMVJfQUQxRUVWNCAgICAgIC8qITwgQURDIFRyaWdnZXIgb24gZXh0ZXJuYWwgZXZlbnQgNCAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzEzX0VFVjUgICAgICAgICAgIEhSVElNX0FEQzFSX0FEMUVFVjUgICAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIGV4dGVybmFsIGV2ZW50IDUgKi8KKyNkZWZpbmUgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1BQ01QMiAgICAgICBIUlRJTV9BREMxUl9BRDFUQUMyICAgICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBBIGNvbXBhcmUgMiAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzEzX1RJTUFDTVAzICAgICAgIEhSVElNX0FEQzFSX0FEMVRBQzMgICAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEEgY29tcGFyZSAzICovCisjZGVmaW5lIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfVElNQUNNUDQgICAgICAgSFJUSU1fQURDMVJfQUQxVEFDNCAgICAgIC8qITwgQURDIFRyaWdnZXIgb24gVGltZXIgQSBjb21wYXJlIDQgKi8KKyNkZWZpbmUgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1BUEVSICAgICAgICBIUlRJTV9BREMxUl9BRDFUQVBFUiAgICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBBIHBlcmlvZCAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzEzX1RJTUFSU1QgICAgICAgIEhSVElNX0FEQzFSX0FEMVRBUlNUICAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEEgcmVzZXQgKi8KKyNkZWZpbmUgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1CQ01QMiAgICAgICBIUlRJTV9BREMxUl9BRDFUQkMyICAgICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBCIGNvbXBhcmUgMiAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzEzX1RJTUJDTVAzICAgICAgIEhSVElNX0FEQzFSX0FEMVRCQzMgICAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEIgY29tcGFyZSAzICovCisjZGVmaW5lIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfVElNQkNNUDQgICAgICAgSFJUSU1fQURDMVJfQUQxVEJDNCAgICAgIC8qITwgQURDIFRyaWdnZXIgb24gVGltZXIgQiBjb21wYXJlIDQgKi8KKyNkZWZpbmUgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1CUEVSICAgICAgICBIUlRJTV9BREMxUl9BRDFUQlBFUiAgICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBCIHBlcmlvZCAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzEzX1RJTUJSU1QgICAgICAgIEhSVElNX0FEQzFSX0FEMVRCUlNUICAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEIgcmVzZXQgKi8KKyNkZWZpbmUgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1DQ01QMiAgICAgICBIUlRJTV9BREMxUl9BRDFUQ0MyICAgICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBDIGNvbXBhcmUgMiAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzEzX1RJTUNDTVAzICAgICAgIEhSVElNX0FEQzFSX0FEMVRDQzMgICAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEMgY29tcGFyZSAzICovCisjZGVmaW5lIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfVElNQ0NNUDQgICAgICAgSFJUSU1fQURDMVJfQUQxVENDNCAgICAgIC8qITwgQURDIFRyaWdnZXIgb24gVGltZXIgQyBjb21wYXJlIDQgKi8KKyNkZWZpbmUgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1DUEVSICAgICAgICBIUlRJTV9BREMxUl9BRDFUQ1BFUiAgICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBDIHBlcmlvZCAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzEzX1RJTURDTVAyICAgICAgIEhSVElNX0FEQzFSX0FEMVREQzIgICAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEQgY29tcGFyZSAyICovCisjZGVmaW5lIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfVElNRENNUDMgICAgICAgSFJUSU1fQURDMVJfQUQxVERDMyAgICAgIC8qITwgQURDIFRyaWdnZXIgb24gVGltZXIgRCBjb21wYXJlIDMgKi8KKyNkZWZpbmUgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1EQ01QNCAgICAgICBIUlRJTV9BREMxUl9BRDFUREM0ICAgICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBEIGNvbXBhcmUgNCAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzEzX1RJTURQRVIgICAgICAgIEhSVElNX0FEQzFSX0FEMVREUEVSICAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEQgcGVyaW9kICovCisjZGVmaW5lIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfVElNRUNNUDIgICAgICAgSFJUSU1fQURDMVJfQUQxVEVDMiAgICAgIC8qITwgQURDIFRyaWdnZXIgb24gVGltZXIgRSBjb21wYXJlIDIgKi8KKyNkZWZpbmUgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1FQ01QMyAgICAgICBIUlRJTV9BREMxUl9BRDFURUMzICAgICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBFIGNvbXBhcmUgMyAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzEzX1RJTUVDTVA0ICAgICAgIEhSVElNX0FEQzFSX0FEMVRFQzQgICAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEUgY29tcGFyZSA0ICovCisjZGVmaW5lIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfVElNRVBFUiAgICAgICAgSFJUSU1fQURDMVJfQUQxVEVQRVIgICAgIC8qITwgQURDIFRyaWdnZXIgb24gVGltZXIgRSBwZXJpb2QgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRUNfQURDVFJJR19TUkMyNCAgQURDIFRSSUdHRVIgMi80IFNPVVJDRQorICAqIEB7CisgICogQGJyaWVmIGNvbnN0YW50cyBkZWZpbmluZyB0aGUgZXZlbnRzIHRyaWdnZXJpbmcgQURDIGNvbnZlcnNpb24gZm9yIEFEQyBUcmlnZ2VycyAyIGFuZCA0LgorICAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzI0X05PTkUgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpLyohPCBObyBBREMgdHJpZ2dlciBldmVudCAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzI0X01DTVAxICAgICAgICAgIEhSVElNX0FEQzJSX0FEMk1DMSAgICAgLyohPCBBREMgVHJpZ2dlciBvbiBtYXN0ZXIgY29tcGFyZSAxICovCisjZGVmaW5lIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfTUNNUDIgICAgICAgICAgSFJUSU1fQURDMlJfQUQyTUMyICAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIG1hc3RlciBjb21wYXJlIDIgKi8KKyNkZWZpbmUgTExfSFJUSU1fQURDVFJJR19TUkMyNF9NQ01QMyAgICAgICAgICBIUlRJTV9BREMyUl9BRDJNQzMgICAgIC8qITwgQURDIFRyaWdnZXIgb24gbWFzdGVyIGNvbXBhcmUgMyAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzI0X01DTVA0ICAgICAgICAgIEhSVElNX0FEQzJSX0FEMk1DNCAgICAgLyohPCBBREMgVHJpZ2dlciBvbiBtYXN0ZXIgY29tcGFyZSA0ICovCisjZGVmaW5lIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfTVBFUiAgICAgICAgICAgSFJUSU1fQURDMlJfQUQyTVBFUiAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIG1hc3RlciBwZXJpb2QgKi8KKyNkZWZpbmUgTExfSFJUSU1fQURDVFJJR19TUkMyNF9FRVY2ICAgICAgICAgICBIUlRJTV9BREMyUl9BRDJFRVY2ICAgIC8qITwgQURDIFRyaWdnZXIgb24gZXh0ZXJuYWwgZXZlbnQgNiAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzI0X0VFVjcgICAgICAgICAgIEhSVElNX0FEQzJSX0FEMkVFVjcgICAgLyohPCBBREMgVHJpZ2dlciBvbiBleHRlcm5hbCBldmVudCA3ICovCisjZGVmaW5lIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfRUVWOCAgICAgICAgICAgSFJUSU1fQURDMlJfQUQyRUVWOCAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIGV4dGVybmFsIGV2ZW50IDggKi8KKyNkZWZpbmUgTExfSFJUSU1fQURDVFJJR19TUkMyNF9FRVY5ICAgICAgICAgICBIUlRJTV9BREMyUl9BRDJFRVY5ICAgIC8qITwgQURDIFRyaWdnZXIgb24gZXh0ZXJuYWwgZXZlbnQgOSAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzI0X0VFVjEwICAgICAgICAgIEhSVElNX0FEQzJSX0FEMkVFVjEwICAgLyohPCBBREMgVHJpZ2dlciBvbiBleHRlcm5hbCBldmVudCAxMCAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzI0X1RJTUFDTVAyICAgICAgIEhSVElNX0FEQzJSX0FEMlRBQzIgICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBBIGNvbXBhcmUgMiAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzI0X1RJTUFDTVAzICAgICAgIEhSVElNX0FEQzJSX0FEMlRBQzMgICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBBIGNvbXBhcmUgMyAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzI0X1RJTUFDTVA0ICAgICAgIEhSVElNX0FEQzJSX0FEMlRBQzQgICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBBIGNvbXBhcmUgNCAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzI0X1RJTUFQRVIgICAgICAgIEhSVElNX0FEQzJSX0FEMlRBUEVSICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBBIHBlcmlvZCAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzI0X1RJTUJDTVAyICAgICAgIEhSVElNX0FEQzJSX0FEMlRCQzIgICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBCIGNvbXBhcmUgMiAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzI0X1RJTUJDTVAzICAgICAgIEhSVElNX0FEQzJSX0FEMlRCQzMgICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBCIGNvbXBhcmUgMyAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzI0X1RJTUJDTVA0ICAgICAgIEhSVElNX0FEQzJSX0FEMlRCQzQgICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBCIGNvbXBhcmUgNCAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzI0X1RJTUJQRVIgICAgICAgIEhSVElNX0FEQzJSX0FEMlRCUEVSICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBCIHBlcmlvZCAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzI0X1RJTUNDTVAyICAgICAgIEhSVElNX0FEQzJSX0FEMlRDQzIgICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBDIGNvbXBhcmUgMiAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzI0X1RJTUNDTVAzICAgICAgIEhSVElNX0FEQzJSX0FEMlRDQzMgICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBDIGNvbXBhcmUgMyAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzI0X1RJTUNDTVA0ICAgICAgIEhSVElNX0FEQzJSX0FEMlRDQzQgICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBDIGNvbXBhcmUgNCAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzI0X1RJTUNQRVIgICAgICAgIEhSVElNX0FEQzJSX0FEMlRDUEVSICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBDIHBlcmlvZCAqLworI2RlZmluZSBMTF9IUlRJTV9BRENUUklHX1NSQzI0X1RJTUNSU1QgICAgICAgIEhSVElNX0FEQzJSX0FEMlRDUlNUICAgLyohPCBBREMgVHJpZ2dlciBvbiBUaW1lciBDIHJlc2V0ICovCisjZGVmaW5lIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfVElNRENNUDIgICAgICAgSFJUSU1fQURDMlJfQUQyVERDMiAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEQgY29tcGFyZSAyICovCisjZGVmaW5lIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfVElNRENNUDMgICAgICAgSFJUSU1fQURDMlJfQUQyVERDMyAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEQgY29tcGFyZSAzICovCisjZGVmaW5lIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfVElNRENNUDQgICAgICAgSFJUSU1fQURDMlJfQUQyVERDNCAgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEQgY29tcGFyZSA0ICovCisjZGVmaW5lIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfVElNRFBFUiAgICAgICAgSFJUSU1fQURDMlJfQUQyVERQRVIgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEQgcGVyaW9kICovCisjZGVmaW5lIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfVElNRFJTVCAgICAgICAgSFJUSU1fQURDMlJfQUQyVERSU1QgICAvKiE8IEFEQyBUcmlnZ2VyIG9uIFRpbWVyIEQgcmVzZXQgKi8KKyNkZWZpbmUgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1FQ01QMiAgICAgICBIUlRJTV9BREMyUl9BRDJURUMyICAgIC8qITwgQURDIFRyaWdnZXIgb24gVGltZXIgRSBjb21wYXJlIDIgKi8KKyNkZWZpbmUgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1FQ01QMyAgICAgICBIUlRJTV9BREMyUl9BRDJURUMzICAgIC8qITwgQURDIFRyaWdnZXIgb24gVGltZXIgRSBjb21wYXJlIDMgKi8KKyNkZWZpbmUgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1FQ01QNCAgICAgICBIUlRJTV9BREMyUl9BRDJURUM0ICAgIC8qITwgQURDIFRyaWdnZXIgb24gVGltZXIgRSBjb21wYXJlIDQgKi8KKyNkZWZpbmUgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1FUlNUICAgICAgICBIUlRJTV9BREMyUl9BRDJURVJTVCAgIC8qITwgQURDIFRyaWdnZXIgb24gVGltZXIgRSByZXNldCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9FQ19ETExDQUxJQlJBVElPTl9NT0RFICBETEwgQ0FMSUJSQVRJT04gTU9ERQorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB0aGUgRExMIGNhbGlicmF0aW9uIG1vZGUuCisgICovCisjZGVmaW5lIExMX0hSVElNX0RMTENBTElCUkFUSU9OX01PREVfU0lOR0xFU0hPVCAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpLyohPENhbGlicmF0aW9uIGlzIHBlcmZvbWVkIG9ubHkgb25jZSAqLworI2RlZmluZSBMTF9IUlRJTV9ETExDQUxJQlJBVElPTl9NT0RFX0NPTlRJTlVPVVMgICBIUlRJTV9ETExDUl9DQUxFTiAgICAgIC8qITxDYWxpYnJhdGlvbiBpcyBwZXJmb3JtZWQgcGVyaW9kaWNhbGx5ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0VDX0NBTElCUkFUSU9OUkFURSAgRExMIENBTElCUkFUSU9OIFJBVEUKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgdGhlIERMTCBjYWxpYnJhdGlvbiBwZXJpb2RzIChpbiBtaWNybyBzZWNvbmRzKS4KKyAgKi8KKyNkZWZpbmUgTExfSFJUSU1fRExMQ0FMSUJSQVRJT05fUkFURV83MzAwICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBlcmlvZGljIERMTCBjYWxpYnJhdGlvbjogVCA9IDEwNDg1NzYgKiB0SFJUSU0gKDcuMyBtcykgKi8KKyNkZWZpbmUgTExfSFJUSU1fRExMQ0FMSUJSQVRJT05fUkFURV85MTAgICAgICAgKEhSVElNX0RMTENSX0NBTFJURV8wKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBlcmlvZGljIERMTCBjYWxpYnJhdGlvbjogVCA9IDEzMTA3MiAqIHRIUlRJTSAoOTEwIG1zKSAqLworI2RlZmluZSBMTF9IUlRJTV9ETExDQUxJQlJBVElPTl9SQVRFXzExNCAgICAgICAoSFJUSU1fRExMQ1JfQ0FMUlRFXzEpICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUGVyaW9kaWMgRExMIGNhbGlicmF0aW9uOiBUID0gMTYzODQgKiB0SFJUSU0gKDExNCBtcykgKi8KKyNkZWZpbmUgTExfSFJUSU1fRExMQ0FMSUJSQVRJT05fUkFURV8xNCAgICAgICAgKEhSVElNX0RMTENSX0NBTFJURV8xIHwgSFJUSU1fRExMQ1JfQ0FMUlRFXzApICAvKiE8IFBlcmlvZGljIERMTCBjYWxpYnJhdGlvbjogVCA9IDIwNDggKiB0SFJUSU0gKDE0IG1zKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9FQ19QUkVTQ0FMRVJSQVRJTyAgUFJFU0NBTEVSIFJBVElPCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRpbWVyIGhpZ2gtcmVzb2x1dGlvbiBjbG9jayBwcmVzY2FsZXIgcmF0aW8uCisgICovCisjZGVmaW5lIExMX0hSVElNX1BSRVNDQUxFUlJBVElPX01VTDMyICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBmSFJDSzogZkhSVElNIHggMzIgPSA0LjYwOCBHSHogLSBSZXNvbHV0aW9uOiAyMTcgcHMgLSBNaW4gUFdNIGZyZXF1ZW5jeTogNzAuMyBrSHogKGZIUlRJTT0xNDRNSHopICAgICAgKi8KKyNkZWZpbmUgTExfSFJUSU1fUFJFU0NBTEVSUkFUSU9fTVVMMTYgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDFVKSAgLyohPCBmSFJDSzogZkhSVElNIHggMTYgPSAyLjMwNCBHSHogLSBSZXNvbHV0aW9uOiA0MzQgcHMgLSBNaW4gUFdNIGZyZXF1ZW5jeTogMzUuMSBLSHogKGZIUlRJTT0xNDRNSHopICAgICAgKi8KKyNkZWZpbmUgTExfSFJUSU1fUFJFU0NBTEVSUkFUSU9fTVVMOCAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDJVKSAgLyohPCBmSFJDSzogZkhSVElNIHggOCA9IDEuMTUyIEdIeiAtIFJlc29sdXRpb246IDg2OCBwcyAtIE1pbiBQV00gZnJlcXVlbmN5OiAxNy42IGtIeiAoZkhSVElNPTE0NE1IeikgICAgICAqLworI2RlZmluZSBMTF9IUlRJTV9QUkVTQ0FMRVJSQVRJT19NVUw0ICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwM1UpICAvKiE8IGZIUkNLOiBmSFJUSU0geCA0ID0gNTc2IE1IeiAtIFJlc29sdXRpb246IDEuNzMgbnMgLSBNaW4gUFdNIGZyZXF1ZW5jeTogOC44IGtIeiAoZkhSVElNPTE0NE1IeikgICAgICAqLworI2RlZmluZSBMTF9IUlRJTV9QUkVTQ0FMRVJSQVRJT19NVUwyICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNFUpICAvKiE8IGZIUkNLOiBmSFJUSU0geCAyID0gMjg4IE1IeiAtIFJlc29sdXRpb246IDMuNDcgbnMgLSBNaW4gUFdNIGZyZXF1ZW5jeTogNC40IGtIeiAoZkhSVElNPTE0NE1IeikgICAgICAqLworI2RlZmluZSBMTF9IUlRJTV9QUkVTQ0FMRVJSQVRJT19ESVYxICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNVUpICAvKiE8IGZIUkNLOiBmSFJUSU0gPSAxNDQgTUh6IC0gUmVzb2x1dGlvbjogNi45NSBucyAtIE1pbiBQV00gZnJlcXVlbmN5OiAyLjIga0h6IChmSFJUSU09MTQ0TUh6KSAgICAgICovCisjZGVmaW5lIExMX0hSVElNX1BSRVNDQUxFUlJBVElPX0RJVjIgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA2VSkgIC8qITwgZkhSQ0s6IGZIUlRJTSAvIDIgPSA3MiBNSHogLSBSZXNvbHV0aW9uOiAxMy44OCBucy0gTWluIFBXTSBmcmVxdWVuY3k6IDEuMSBrSHogKGZIUlRJTT0xNDRNSHopICAgICAgKi8KKyNkZWZpbmUgTExfSFJUSU1fUFJFU0NBTEVSUkFUSU9fRElWNCAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDdVKSAgLyohPCBmSFJDSzogZkhSVElNIC8gNCA9IDM2IE1IeiAtIFJlc29sdXRpb246IDI3LjcgbnMtIE1pbiBQV00gZnJlcXVlbmN5OiA1NTBIeiAoZkhSVElNPTE0NE1IeikgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9FQ19NT0RFICBDT1VOVEVSIE1PREUKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgdGltZXIgY291bnRlciBvcGVyYXRpbmcgbW9kZS4KKyAgKi8KKyNkZWZpbmUgTExfSFJUSU1fTU9ERV9DT05USU5VT1VTICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDhVKSAgLyohPCBUaGUgdGltZXIgb3BlcmF0ZXMgaW4gY29udGludW91cyAoZnJlZS1ydW5uaW5nKSBtb2RlICovCisjZGVmaW5lIExMX0hSVElNX01PREVfU0lOR0xFU0hPVCAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBUaGUgdGltZXIgb3BlcmF0ZXMgaW4gbm9uIHJldHJpZ2dlcmFibGUgc2luZ2xlLXNob3QgbW9kZSAqLworI2RlZmluZSBMTF9IUlRJTV9NT0RFX1JFVFJJR0dFUkFCTEUgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAxMFUpICAvKiE8IFRoZSB0aW1lciBvcGVyYXRlcyBpbiByZXRyaWdnZXJhYmxlIHNpbmdsZS1zaG90IG1vZGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRUNfREFDVFJJRyAgREFDIFRSSUdHRVIKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgb24gd2hpY2ggb3V0cHV0IHRoZSBEQUMgc3luY2hyb25pemF0aW9uIGV2ZW50IGlzIHNlbnQuCisgICovCisjZGVmaW5lIExMX0hSVElNX0RBQ1RSSUdfTk9ORSAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAvKiE8IE5vIERBQyBzeW5jaHJvbml6YXRpb24gZXZlbnQgZ2VuZXJhdGVkICovCisjZGVmaW5lIExMX0hSVElNX0RBQ1RSSUdfREFDVFJJR09VVF8xICAgKEhSVElNX01DUl9EQUNTWU5DXzApICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERBQyBzeW5jaHJvbml6YXRpb24gZXZlbnQgZ2VuZXJhdGVkIG9uIERBQ1RyaWdPdXQxIG91dHB1dCB1cG9uIHRpbWVyIHVwZGF0ZSAqLworI2RlZmluZSBMTF9IUlRJTV9EQUNUUklHX0RBQ1RSSUdPVVRfMiAgIChIUlRJTV9NQ1JfREFDU1lOQ18xKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEQUMgc3luY2hyb25pemF0aW9uIGV2ZW50IGdlbmVyYXRlZCBvbiBEQUNUcmlnT3V0MiBvdXRwdXQgdXBvbiB0aW1lciB1cGRhdGUgKi8KKyNkZWZpbmUgTExfSFJUSU1fREFDVFJJR19EQUNUUklHT1VUXzMgICAoSFJUSU1fTUNSX0RBQ1NZTkNfMSB8IEhSVElNX01DUl9EQUNTWU5DXzApIC8qITwgREFDIHN5bmNocm9uaXphdGlvbiBldmVudCBnZW5lcmF0ZWQgb24gREFDVHJpZ091dDMgb3V0cHV0IHVwb24gdGltZXIgdXBkYXRlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0VDX1VQREFURVRSSUcgIFVQREFURSBUUklHR0VSCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHdoZXRoZXIgdGhlIHJlZ2lzdGVycyB1cGRhdGUgaXMgZG9uZSBzeW5jaHJvbm91c2x5IHdpdGggYW55IG90aGVyIHRpbWVyIG9yIG1hc3RlciB1cGRhdGUuCisgICovCisjZGVmaW5lIExMX0hSVElNX1VQREFURVRSSUdfTk9ORSAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkvKiE8IFJlZ2lzdGVyIHVwZGF0ZSBpcyBkaXNhYmxlZCAqLworI2RlZmluZSBMTF9IUlRJTV9VUERBVEVUUklHX01BU1RFUiAgICAgIEhSVElNX1RJTUNSX01TVFUgICAgICAgLyohPCBSZWdpc3RlciB1cGRhdGUgaXMgdHJpZ2dlcmVkIGJ5IHRoZSBtYXN0ZXIgdGltZXIgdXBkYXRlICovCisjZGVmaW5lIExMX0hSVElNX1VQREFURVRSSUdfVElNRVJfQSAgICAgSFJUSU1fVElNQ1JfVEFVICAgICAgICAvKiE8IFJlZ2lzdGVyIHVwZGF0ZSBpcyB0cmlnZ2VyZWQgYnkgdGhlIHRpbWVyIEEgdXBkYXRlICovCisjZGVmaW5lIExMX0hSVElNX1VQREFURVRSSUdfVElNRVJfQiAgICAgSFJUSU1fVElNQ1JfVEJVICAgICAgICAvKiE8IFJlZ2lzdGVyIHVwZGF0ZSBpcyB0cmlnZ2VyZWQgYnkgdGhlIHRpbWVyIEIgdXBkYXRlICovCisjZGVmaW5lIExMX0hSVElNX1VQREFURVRSSUdfVElNRVJfQyAgICAgSFJUSU1fVElNQ1JfVENVICAgICAgICAvKiE8IFJlZ2lzdGVyIHVwZGF0ZSBpcyB0cmlnZ2VyZWQgYnkgdGhlIHRpbWVyIEMgdXBkYXRlKi8KKyNkZWZpbmUgTExfSFJUSU1fVVBEQVRFVFJJR19USU1FUl9EICAgICBIUlRJTV9USU1DUl9URFUgICAgICAgIC8qITwgUmVnaXN0ZXIgdXBkYXRlIGlzIHRyaWdnZXJlZCBieSB0aGUgdGltZXIgRCB1cGRhdGUgKi8KKyNkZWZpbmUgTExfSFJUSU1fVVBEQVRFVFJJR19USU1FUl9FICAgICBIUlRJTV9USU1DUl9URVUgICAgICAgIC8qITwgUmVnaXN0ZXIgdXBkYXRlIGlzIHRyaWdnZXJlZCBieSB0aGUgdGltZXIgRSB1cGRhdGUgKi8KKyNkZWZpbmUgTExfSFJUSU1fVVBEQVRFVFJJR19SRVBFVElUSU9OICBIUlRJTV9USU1DUl9UUkVQVSAgICAgIC8qITwgUmVnaXN0ZXIgdXBkYXRlIGlzIHRyaWdnZXJlZCB3aGVuIHRoZSBjb3VudGVyIHJvbGxzIG92ZXIgYW5kIEhSVElNX1JFUHggPSAwKi8KKyNkZWZpbmUgTExfSFJUSU1fVVBEQVRFVFJJR19SRVNFVCAgICAgICBIUlRJTV9USU1DUl9UUlNUVSAgICAgIC8qITwgUmVnaXN0ZXIgdXBkYXRlIGlzIHRyaWdnZXJlZCBieSBjb3VudGVyIHJlc2V0IG9yIHJvbGwtb3ZlciB0byAwIGFmdGVyIHJlYWNoaW5nIHRoZSBwZXJpb2QgdmFsdWUgaW4gY29udGludW91cyBtb2RlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0VDX1VQREFURUdBVElORyAgVVBEQVRFIEdBVElORworICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyBob3cgdGhlIHVwZGF0ZSBvY2N1cnMgcmVsYXRpdmVseSB0byB0aGUgYnVyc3QgRE1BIHRyYW5zYWN0aW9uIGFuZCB0aGUgZXh0ZXJuYWwgdXBkYXRlIHJlcXVlc3Qgb24gdXBkYXRlIGVuYWJsZSBpbnB1dHMgMSB0byAzLgorICAqLworI2RlZmluZSBMTF9IUlRJTV9VUERBVEVHQVRJTkdfSU5ERVBFTkRFTlQgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVwZGF0ZSBkb25lIGluZGVwZW5kZW50bHkgZnJvbSB0aGUgRE1BIGJ1cnN0IHRyYW5zZmVyIGNvbXBsZXRpb24gKi8KKyNkZWZpbmUgTExfSFJUSU1fVVBEQVRFR0FUSU5HX0RNQUJVUlNUICAgICAgICAoSFJUSU1fVElNQ1JfVVBER0FUXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVcGRhdGUgZG9uZSB3aGVuIHRoZSBETUEgYnVyc3QgdHJhbnNmZXIgaXMgY29tcGxldGVkICovCisjZGVmaW5lIExMX0hSVElNX1VQREFURUdBVElOR19ETUFCVVJTVF9VUERBVEUgKEhSVElNX1RJTUNSX1VQREdBVF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVXBkYXRlIGRvbmUgb24gdGltZXIgcm9sbC1vdmVyIGZvbGxvd2luZyBhIERNQSBidXJzdCB0cmFuc2ZlciBjb21wbGV0aW9uKi8KKyNkZWZpbmUgTExfSFJUSU1fVVBEQVRFR0FUSU5HX1VQREVOMSAgICAgICAgICAoSFJUSU1fVElNQ1JfVVBER0FUXzEgfCBIUlRJTV9USU1DUl9VUERHQVRfMCkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTbGF2ZSB0aW1lciBvbmx5IC0gVXBkYXRlIGRvbmUgb24gYSByaXNpbmcgZWRnZSBvZiBIUlRJTSB1cGRhdGUgZW5hYmxlIGlucHV0IDEgKi8KKyNkZWZpbmUgTExfSFJUSU1fVVBEQVRFR0FUSU5HX1VQREVOMiAgICAgICAgICAoSFJUSU1fVElNQ1JfVVBER0FUXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTbGF2ZSB0aW1lciBvbmx5IC0gVXBkYXRlIGRvbmUgb24gYSByaXNpbmcgZWRnZSBvZiBIUlRJTSB1cGRhdGUgZW5hYmxlIGlucHV0IDIgKi8KKyNkZWZpbmUgTExfSFJUSU1fVVBEQVRFR0FUSU5HX1VQREVOMyAgICAgICAgICAoSFJUSU1fVElNQ1JfVVBER0FUXzIgfCBIUlRJTV9USU1DUl9VUERHQVRfMCkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTbGF2ZSB0aW1lciBvbmx5IC0gVXBkYXRlIGRvbmUgb24gYSByaXNpbmcgZWRnZSBvZiBIUlRJTSB1cGRhdGUgZW5hYmxlIGlucHV0IDMgKi8KKyNkZWZpbmUgTExfSFJUSU1fVVBEQVRFR0FUSU5HX1VQREVOMV9VUERBVEUgICAoSFJUSU1fVElNQ1JfVVBER0FUXzIgfCBIUlRJTV9USU1DUl9VUERHQVRfMSkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTbGF2ZSB0aW1lciBvbmx5IC0gIFVwZGF0ZSBkb25lIG9uIHRoZSB1cGRhdGUgZXZlbnQgZm9sbG93aW5nIGEgcmlzaW5nIGVkZ2Ugb2YgSFJUSU0gdXBkYXRlIGVuYWJsZSBpbnB1dCAxICovCisjZGVmaW5lIExMX0hSVElNX1VQREFURUdBVElOR19VUERFTjJfVVBEQVRFICAgKEhSVElNX1RJTUNSX1VQREdBVF8yIHwgSFJUSU1fVElNQ1JfVVBER0FUXzEgfCBIUlRJTV9USU1DUl9VUERHQVRfMCkgIC8qITwgU2xhdmUgdGltZXIgb25seSAtIFVwZGF0ZSBkb25lIG9uIHRoZSB1cGRhdGUgZXZlbnQgZm9sbG93aW5nIGEgcmlzaW5nIGVkZ2Ugb2YgSFJUSU0gdXBkYXRlIGVuYWJsZSBpbnB1dCAyICovCisjZGVmaW5lIExMX0hSVElNX1VQREFURUdBVElOR19VUERFTjNfVVBEQVRFICAgKEhSVElNX1RJTUNSX1VQREdBVF8zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU2xhdmUgdGltZXIgb25seSAtIFVwZGF0ZSBkb25lIG9uIHRoZSB1cGRhdGUgZXZlbnQgZm9sbG93aW5nIGEgcmlzaW5nIGVkZ2Ugb2YgSFJUSU0gdXBkYXRlIGVuYWJsZSBpbnB1dCAzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0VDX0NPTVBBUkVNT0RFICBDT01QQVJFIE1PREUKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgd2hldGhlciB0aGUgY29tcGFyZSByZWdpc3RlciBpcyBiZWhhdmluZyBpbiByZWd1bGFyIG1vZGUgKGNvbXBhcmUgbWF0Y2ggaXNzdWVkIGFzIHNvb24gYXMgY291bnRlciBlcXVhbCBjb21wYXJlKSBvciBpbiBhdXRvLWRlbGF5ZWQgbW9kZS4KKyAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ09NUEFSRU1PREVfUkVHVUxBUiAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHN0YW5kYXJkIGNvbXBhcmUgbW9kZSAqLworI2RlZmluZSBMTF9IUlRJTV9DT01QQVJFTU9ERV9ERUxBWV9OT1RJTUVPVVQgIChIUlRJTV9USU1DUl9ERUxDTVAyXzApICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyZSBldmVudCBnZW5lcmF0ZWQgb25seSBpZiBhIGNhcHR1cmUgaGFzIG9jY3VycmVkICovCisjZGVmaW5lIExMX0hSVElNX0NPTVBBUkVNT0RFX0RFTEFZX0NNUDEgICAgICAgKEhSVElNX1RJTUNSX0RFTENNUDJfMSkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJlIGV2ZW50IGdlbmVyYXRlZCBpZiBhIGNhcHR1cmUgaGFzIG9jY3VycmVkIG9yIGFmdGVyIGEgQ29tcGFyZSAxIG1hdGNoICh0aW1lb3V0IGlmIGNhcHR1cmUgZXZlbnQgaXMgbWlzc2luZykgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ09NUEFSRU1PREVfREVMQVlfQ01QMyAgICAgICAoSFJUSU1fVElNQ1JfREVMQ01QMl8xIHwgSFJUSU1fVElNQ1JfREVMQ01QMl8wKSAvKiE8IENvbXBhcmUgZXZlbnQgZ2VuZXJhdGVkIGlmIGEgY2FwdHVyZSBoYXMgb2NjdXJyZWQgb3IgYWZ0ZXIgYSBDb21wYXJlIDMgbWF0Y2ggKHRpbWVvdXQgaWYgY2FwdHVyZSBldmVudCBpcyBtaXNzaW5nKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9FQ19SRVNFVFRSSUcgIFJFU0VUIFRSSUdHRVIKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgdGhlIGV2ZW50cyB0aGF0IGNhbiBiZSBzZWxlY3RlZCB0byB0cmlnZ2VyIHRoZSByZXNldCBvZiB0aGUgdGltZXIgY291bnRlci4KKyAgKi8KKyNkZWZpbmUgTExfSFJUSU1fUkVTRVRUUklHX05PTkUgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpLyohPCBObyBjb3VudGVyIHJlc2V0IHRyaWdnZXIgKi8KKyNkZWZpbmUgTExfSFJUSU1fUkVTRVRUUklHX1VQREFURSAgICAgIEhSVElNX1JTVFJfVVBEQVRFICAgICAgLyohPCBUaGUgdGltZXIgY291bnRlciBpcyByZXNldCB1cG9uIHVwZGF0ZSBldmVudCAqLworI2RlZmluZSBMTF9IUlRJTV9SRVNFVFRSSUdfQ01QMiAgICAgICAgSFJUSU1fUlNUUl9DTVAyICAgICAgICAvKiE8IFRoZSB0aW1lciBjb3VudGVyIGlzIHJlc2V0IHVwb24gVGltZXIgQ29tcGFyZSAyIGV2ZW50ICovCisjZGVmaW5lIExMX0hSVElNX1JFU0VUVFJJR19DTVA0ICAgICAgICBIUlRJTV9SU1RSX0NNUDQgICAgICAgIC8qITwgVGhlIHRpbWVyIGNvdW50ZXIgaXMgcmVzZXQgdXBvbiBUaW1lciBDb21wYXJlIDQgZXZlbnQgKi8KKyNkZWZpbmUgTExfSFJUSU1fUkVTRVRUUklHX01BU1RFUl9QRVIgIEhSVElNX1JTVFJfTVNUUEVSICAgICAgLyohPCBUaGUgdGltZXIgY291bnRlciBpcyByZXNldCB1cG9uIG1hc3RlciB0aW1lciBwZXJpb2QgZXZlbnQgKi8KKyNkZWZpbmUgTExfSFJUSU1fUkVTRVRUUklHX01BU1RFUl9DTVAxIEhSVElNX1JTVFJfTVNUQ01QMSAgICAgLyohPCBUaGUgdGltZXIgY291bnRlciBpcyByZXNldCB1cG9uIG1hc3RlciB0aW1lciBDb21wYXJlIDEgZXZlbnQgKi8KKyNkZWZpbmUgTExfSFJUSU1fUkVTRVRUUklHX01BU1RFUl9DTVAyIEhSVElNX1JTVFJfTVNUQ01QMiAgICAgLyohPCBUaGUgdGltZXIgY291bnRlciBpcyByZXNldCB1cG9uIG1hc3RlciB0aW1lciBDb21wYXJlIDIgZXZlbnQgKi8KKyNkZWZpbmUgTExfSFJUSU1fUkVTRVRUUklHX01BU1RFUl9DTVAzIEhSVElNX1JTVFJfTVNUQ01QMyAgICAgLyohPCBUaGUgdGltZXIgY291bnRlciBpcyByZXNldCB1cG9uIG1hc3RlciB0aW1lciBDb21wYXJlIDMgZXZlbnQgKi8KKyNkZWZpbmUgTExfSFJUSU1fUkVTRVRUUklHX01BU1RFUl9DTVA0IEhSVElNX1JTVFJfTVNUQ01QNCAgICAgLyohPCBUaGUgdGltZXIgY291bnRlciBpcyByZXNldCB1cG9uIG1hc3RlciB0aW1lciBDb21wYXJlIDQgZXZlbnQgKi8KKyNkZWZpbmUgTExfSFJUSU1fUkVTRVRUUklHX0VFVl8xICAgICAgIEhSVElNX1JTVFJfRVhURVZOVDEgICAgLyohPCBUaGUgdGltZXIgY291bnRlciBpcyByZXNldCB1cG9uIGV4dGVybmFsIGV2ZW50IDEgKi8KKyNkZWZpbmUgTExfSFJUSU1fUkVTRVRUUklHX0VFVl8yICAgICAgIEhSVElNX1JTVFJfRVhURVZOVDIgICAgLyohPCBUaGUgdGltZXIgY291bnRlciBpcyByZXNldCB1cG9uIGV4dGVybmFsIGV2ZW50IDIgKi8KKyNkZWZpbmUgTExfSFJUSU1fUkVTRVRUUklHX0VFVl8zICAgICAgIEhSVElNX1JTVFJfRVhURVZOVDMgICAgLyohPCBUaGUgdGltZXIgY291bnRlciBpcyByZXNldCB1cG9uIGV4dGVybmFsIGV2ZW50IDMgKi8KKyNkZWZpbmUgTExfSFJUSU1fUkVTRVRUUklHX0VFVl80ICAgICAgIEhSVElNX1JTVFJfRVhURVZOVDQgICAgLyohPCBUaGUgdGltZXIgY291bnRlciBpcyByZXNldCB1cG9uIGV4dGVybmFsIGV2ZW50IDQgKi8KKyNkZWZpbmUgTExfSFJUSU1fUkVTRVRUUklHX0VFVl81ICAgICAgIEhSVElNX1JTVFJfRVhURVZOVDUgICAgLyohPCBUaGUgdGltZXIgY291bnRlciBpcyByZXNldCB1cG9uIGV4dGVybmFsIGV2ZW50IDUgKi8KKyNkZWZpbmUgTExfSFJUSU1fUkVTRVRUUklHX0VFVl82ICAgICAgIEhSVElNX1JTVFJfRVhURVZOVDYgICAgLyohPCBUaGUgdGltZXIgY291bnRlciBpcyByZXNldCB1cG9uIGV4dGVybmFsIGV2ZW50IDYgKi8KKyNkZWZpbmUgTExfSFJUSU1fUkVTRVRUUklHX0VFVl83ICAgICAgIEhSVElNX1JTVFJfRVhURVZOVDcgICAgLyohPCBUaGUgdGltZXIgY291bnRlciBpcyByZXNldCB1cG9uIGV4dGVybmFsIGV2ZW50IDcgKi8KKyNkZWZpbmUgTExfSFJUSU1fUkVTRVRUUklHX0VFVl84ICAgICAgIEhSVElNX1JTVFJfRVhURVZOVDggICAgLyohPCBUaGUgdGltZXIgY291bnRlciBpcyByZXNldCB1cG9uIGV4dGVybmFsIGV2ZW50IDggKi8KKyNkZWZpbmUgTExfSFJUSU1fUkVTRVRUUklHX0VFVl85ICAgICAgIEhSVElNX1JTVFJfRVhURVZOVDkgICAgLyohPCBUaGUgdGltZXIgY291bnRlciBpcyByZXNldCB1cG9uIGV4dGVybmFsIGV2ZW50IDkgKi8KKyNkZWZpbmUgTExfSFJUSU1fUkVTRVRUUklHX0VFVl8xMCAgICAgIEhSVElNX1JTVFJfRVhURVZOVDEwICAgLyohPCBUaGUgdGltZXIgY291bnRlciBpcyByZXNldCB1cG9uIGV4dGVybmFsIGV2ZW50IDEwICovCisjZGVmaW5lIExMX0hSVElNX1JFU0VUVFJJR19PVEhFUjFfQ01QMSBIUlRJTV9SU1RSX1RJTUJDTVAxICAgIC8qITwgVGhlIHRpbWVyIGNvdW50ZXIgaXMgcmVzZXQgdXBvbiBvdGhlciB0aW1lciBDb21wYXJlIDEgZXZlbnQgKi8KKyNkZWZpbmUgTExfSFJUSU1fUkVTRVRUUklHX09USEVSMV9DTVAyIEhSVElNX1JTVFJfVElNQkNNUDIgICAgLyohPCBUaGUgdGltZXIgY291bnRlciBpcyByZXNldCB1cG9uIG90aGVyIHRpbWVyIENvbXBhcmUgMiBldmVudCAqLworI2RlZmluZSBMTF9IUlRJTV9SRVNFVFRSSUdfT1RIRVIxX0NNUDQgSFJUSU1fUlNUUl9USU1CQ01QNCAgICAvKiE8IFRoZSB0aW1lciBjb3VudGVyIGlzIHJlc2V0IHVwb24gb3RoZXIgdGltZXIgQ29tcGFyZSA0IGV2ZW50ICovCisjZGVmaW5lIExMX0hSVElNX1JFU0VUVFJJR19PVEhFUjJfQ01QMSBIUlRJTV9SU1RSX1RJTUNDTVAxICAgIC8qITwgVGhlIHRpbWVyIGNvdW50ZXIgaXMgcmVzZXQgdXBvbiBvdGhlciB0aW1lciBDb21wYXJlIDEgZXZlbnQgKi8KKyNkZWZpbmUgTExfSFJUSU1fUkVTRVRUUklHX09USEVSMl9DTVAyIEhSVElNX1JTVFJfVElNQ0NNUDIgICAgLyohPCBUaGUgdGltZXIgY291bnRlciBpcyByZXNldCB1cG9uIG90aGVyIHRpbWVyIENvbXBhcmUgMiBldmVudCAqLworI2RlZmluZSBMTF9IUlRJTV9SRVNFVFRSSUdfT1RIRVIyX0NNUDQgSFJUSU1fUlNUUl9USU1DQ01QNCAgICAvKiE8IFRoZSB0aW1lciBjb3VudGVyIGlzIHJlc2V0IHVwb24gb3RoZXIgdGltZXIgQ29tcGFyZSA0IGV2ZW50ICovCisjZGVmaW5lIExMX0hSVElNX1JFU0VUVFJJR19PVEhFUjNfQ01QMSBIUlRJTV9SU1RSX1RJTURDTVAxICAgIC8qITwgVGhlIHRpbWVyIGNvdW50ZXIgaXMgcmVzZXQgdXBvbiBvdGhlciB0aW1lciBDb21wYXJlIDEgZXZlbnQgKi8KKyNkZWZpbmUgTExfSFJUSU1fUkVTRVRUUklHX09USEVSM19DTVAyIEhSVElNX1JTVFJfVElNRENNUDIgICAgLyohPCBUaGUgdGltZXIgY291bnRlciBpcyByZXNldCB1cG9uIG90aGVyIHRpbWVyIENvbXBhcmUgMiBldmVudCAqLworI2RlZmluZSBMTF9IUlRJTV9SRVNFVFRSSUdfT1RIRVIzX0NNUDQgSFJUSU1fUlNUUl9USU1EQ01QNCAgICAvKiE8IFRoZSB0aW1lciBjb3VudGVyIGlzIHJlc2V0IHVwb24gb3RoZXIgdGltZXIgQ29tcGFyZSA0IGV2ZW50ICovCisjZGVmaW5lIExMX0hSVElNX1JFU0VUVFJJR19PVEhFUjRfQ01QMSBIUlRJTV9SU1RSX1RJTUVDTVAxICAgIC8qITwgVGhlIHRpbWVyIGNvdW50ZXIgaXMgcmVzZXQgdXBvbiBvdGhlciB0aW1lciBDb21wYXJlIDEgZXZlbnQgKi8KKyNkZWZpbmUgTExfSFJUSU1fUkVTRVRUUklHX09USEVSNF9DTVAyIEhSVElNX1JTVFJfVElNRUNNUDIgICAgLyohPCBUaGUgdGltZXIgY291bnRlciBpcyByZXNldCB1cG9uIG90aGVyIHRpbWVyIENvbXBhcmUgMiBldmVudCAqLworI2RlZmluZSBMTF9IUlRJTV9SRVNFVFRSSUdfT1RIRVI0X0NNUDQgSFJUSU1fUlNUUl9USU1FQ01QNCAgICAvKiE8IFRoZSB0aW1lciBjb3VudGVyIGlzIHJlc2V0IHVwb24gb3RoZXIgdGltZXIgQ29tcGFyZSA0IGV2ZW50ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0VDX0NBUFRVUkVUUklHICBDQVBUVVJFIFRSSUdHRVIKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgdGhlIGV2ZW50cyB0aGF0IGNhbiBiZSBzZWxlY3RlZCB0byB0cmlnZ2VyIHRoZSBjYXB0dXJlIG9mIHRoZSB0aW1pbmcgdW5pdCBjb3VudGVyLgorICAqLworI2RlZmluZSBMTF9IUlRJTV9DQVBUVVJFVFJJR19OT05FICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkvKiE8IENhcHR1cmUgdHJpZ2dlciBpcyBkaXNhYmxlZCAqLworI2RlZmluZSBMTF9IUlRJTV9DQVBUVVJFVFJJR19VUERBVEUgICAgICAgSFJUSU1fQ1BUMUNSX1VQRENQVCAgICAvKiE8IFRoZSB1cGRhdGUgZXZlbnQgdHJpZ2dlcnMgdGhlIENhcHR1cmUgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0FQVFVSRVRSSUdfRUVWXzEgICAgICAgIEhSVElNX0NQVDFDUl9FWEVWMUNQVCAgLyohPCBUaGUgRXh0ZXJuYWwgZXZlbnQgMSB0cmlnZ2VycyB0aGUgQ2FwdHVyZSAqLworI2RlZmluZSBMTF9IUlRJTV9DQVBUVVJFVFJJR19FRVZfMiAgICAgICAgSFJUSU1fQ1BUMUNSX0VYRVYyQ1BUICAvKiE8IFRoZSBFeHRlcm5hbCBldmVudCAyIHRyaWdnZXJzIHRoZSBDYXB0dXJlICovCisjZGVmaW5lIExMX0hSVElNX0NBUFRVUkVUUklHX0VFVl8zICAgICAgICBIUlRJTV9DUFQxQ1JfRVhFVjNDUFQgIC8qITwgVGhlIEV4dGVybmFsIGV2ZW50IDMgdHJpZ2dlcnMgdGhlIENhcHR1cmUgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0FQVFVSRVRSSUdfRUVWXzQgICAgICAgIEhSVElNX0NQVDFDUl9FWEVWNENQVCAgLyohPCBUaGUgRXh0ZXJuYWwgZXZlbnQgNCB0cmlnZ2VycyB0aGUgQ2FwdHVyZSAqLworI2RlZmluZSBMTF9IUlRJTV9DQVBUVVJFVFJJR19FRVZfNSAgICAgICAgSFJUSU1fQ1BUMUNSX0VYRVY1Q1BUICAvKiE8IFRoZSBFeHRlcm5hbCBldmVudCA1IHRyaWdnZXJzIHRoZSBDYXB0dXJlICovCisjZGVmaW5lIExMX0hSVElNX0NBUFRVUkVUUklHX0VFVl82ICAgICAgICBIUlRJTV9DUFQxQ1JfRVhFVjZDUFQgIC8qITwgVGhlIEV4dGVybmFsIGV2ZW50IDYgdHJpZ2dlcnMgdGhlIENhcHR1cmUgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0FQVFVSRVRSSUdfRUVWXzcgICAgICAgIEhSVElNX0NQVDFDUl9FWEVWN0NQVCAgLyohPCBUaGUgRXh0ZXJuYWwgZXZlbnQgNyB0cmlnZ2VycyB0aGUgQ2FwdHVyZSAqLworI2RlZmluZSBMTF9IUlRJTV9DQVBUVVJFVFJJR19FRVZfOCAgICAgICAgSFJUSU1fQ1BUMUNSX0VYRVY4Q1BUICAvKiE8IFRoZSBFeHRlcm5hbCBldmVudCA4IHRyaWdnZXJzIHRoZSBDYXB0dXJlICovCisjZGVmaW5lIExMX0hSVElNX0NBUFRVUkVUUklHX0VFVl85ICAgICAgICBIUlRJTV9DUFQxQ1JfRVhFVjlDUFQgIC8qITwgVGhlIEV4dGVybmFsIGV2ZW50IDkgdHJpZ2dlcnMgdGhlIENhcHR1cmUgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0FQVFVSRVRSSUdfRUVWXzEwICAgICAgIEhSVElNX0NQVDFDUl9FWEVWMTBDUFQgLyohPCBUaGUgRXh0ZXJuYWwgZXZlbnQgMTAgdHJpZ2dlcnMgdGhlIENhcHR1cmUgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0FQVFVSRVRSSUdfVEExX1NFVCAgICAgIEhSVElNX0NQVDFDUl9UQTFTRVQgICAgLyohPCBDYXB0dXJlIGlzIHRyaWdnZXJlZCBieSBUQTEgb3V0cHV0IGluYWN0aXZlIHRvIGFjdGl2ZSB0cmFuc2l0aW9uICovCisjZGVmaW5lIExMX0hSVElNX0NBUFRVUkVUUklHX1RBMV9SRVNFVCAgICBIUlRJTV9DUFQxQ1JfVEExUlNUICAgIC8qITwgQ2FwdHVyZSBpcyB0cmlnZ2VyZWQgYnkgVEExIG91dHB1dCBhY3RpdmUgdG8gaW5hY3RpdmUgdHJhbnNpdGlvbiAqLworI2RlZmluZSBMTF9IUlRJTV9DQVBUVVJFVFJJR19USU1BX0NNUDEgICAgSFJUSU1fQ1BUMUNSX1RJTUFDTVAxICAvKiE8IFRpbWVyIEEgQ29tcGFyZSAxIHRyaWdnZXJzIENhcHR1cmUgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0FQVFVSRVRSSUdfVElNQV9DTVAyICAgIEhSVElNX0NQVDFDUl9USU1BQ01QMiAgLyohPCBUaW1lciBBIENvbXBhcmUgMiB0cmlnZ2VycyBDYXB0dXJlICovCisjZGVmaW5lIExMX0hSVElNX0NBUFRVUkVUUklHX1RCMV9TRVQgICAgICBIUlRJTV9DUFQxQ1JfVEIxU0VUICAgIC8qITwgQ2FwdHVyZSBpcyB0cmlnZ2VyZWQgYnkgVEIxIG91dHB1dCBpbmFjdGl2ZSB0byBhY3RpdmUgdHJhbnNpdGlvbiAqLworI2RlZmluZSBMTF9IUlRJTV9DQVBUVVJFVFJJR19UQjFfUkVTRVQgICAgSFJUSU1fQ1BUMUNSX1RCMVJTVCAgICAvKiE8IENhcHR1cmUgaXMgdHJpZ2dlcmVkIGJ5IFRCMSBvdXRwdXQgYWN0aXZlIHRvIGluYWN0aXZlIHRyYW5zaXRpb24gKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0FQVFVSRVRSSUdfVElNQl9DTVAxICAgIEhSVElNX0NQVDFDUl9USU1CQ01QMSAgLyohPCBUaW1lciBCIENvbXBhcmUgMSB0cmlnZ2VycyBDYXB0dXJlICovCisjZGVmaW5lIExMX0hSVElNX0NBUFRVUkVUUklHX1RJTUJfQ01QMiAgICBIUlRJTV9DUFQxQ1JfVElNQkNNUDIgIC8qITwgVGltZXIgQiBDb21wYXJlIDIgdHJpZ2dlcnMgQ2FwdHVyZSAqLworI2RlZmluZSBMTF9IUlRJTV9DQVBUVVJFVFJJR19UQzFfU0VUICAgICAgSFJUSU1fQ1BUMUNSX1RDMVNFVCAgICAvKiE8IENhcHR1cmUgaXMgdHJpZ2dlcmVkIGJ5IFRDMSBvdXRwdXQgaW5hY3RpdmUgdG8gYWN0aXZlIHRyYW5zaXRpb24gKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0FQVFVSRVRSSUdfVEMxX1JFU0VUICAgIEhSVElNX0NQVDFDUl9UQzFSU1QgICAgLyohPCBDYXB0dXJlIGlzIHRyaWdnZXJlZCBieSBUQzEgb3V0cHV0IGFjdGl2ZSB0byBpbmFjdGl2ZSB0cmFuc2l0aW9uICovCisjZGVmaW5lIExMX0hSVElNX0NBUFRVUkVUUklHX1RJTUNfQ01QMSAgICBIUlRJTV9DUFQxQ1JfVElNQ0NNUDEgIC8qITwgVGltZXIgQyBDb21wYXJlIDEgdHJpZ2dlcnMgQ2FwdHVyZSAqLworI2RlZmluZSBMTF9IUlRJTV9DQVBUVVJFVFJJR19USU1DX0NNUDIgICAgSFJUSU1fQ1BUMUNSX1RJTUNDTVAyICAvKiE8IFRpbWVyIEMgQ29tcGFyZSAyIHRyaWdnZXJzIENhcHR1cmUgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0FQVFVSRVRSSUdfVEQxX1NFVCAgICAgIEhSVElNX0NQVDFDUl9URDFTRVQgICAgLyohPCBDYXB0dXJlIGlzIHRyaWdnZXJlZCBieSBURDEgb3V0cHV0IGluYWN0aXZlIHRvIGFjdGl2ZSB0cmFuc2l0aW9uICovCisjZGVmaW5lIExMX0hSVElNX0NBUFRVUkVUUklHX1REMV9SRVNFVCAgICBIUlRJTV9DUFQxQ1JfVEQxUlNUICAgIC8qITwgQ2FwdHVyZSBpcyB0cmlnZ2VyZWQgYnkgVEQxIG91dHB1dCBhY3RpdmUgdG8gaW5hY3RpdmUgdHJhbnNpdGlvbiAqLworI2RlZmluZSBMTF9IUlRJTV9DQVBUVVJFVFJJR19USU1EX0NNUDEgICAgSFJUSU1fQ1BUMUNSX1RJTURDTVAxICAvKiE8IFRpbWVyIEQgQ29tcGFyZSAxIHRyaWdnZXJzIENhcHR1cmUgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0FQVFVSRVRSSUdfVElNRF9DTVAyICAgIEhSVElNX0NQVDFDUl9USU1EQ01QMiAgLyohPCBUaW1lciBEIENvbXBhcmUgMiB0cmlnZ2VycyBDYXB0dXJlICovCisjZGVmaW5lIExMX0hSVElNX0NBUFRVUkVUUklHX1RFMV9TRVQgICAgICBIUlRJTV9DUFQxQ1JfVEUxU0VUICAgIC8qITwgQ2FwdHVyZSBpcyB0cmlnZ2VyZWQgYnkgVEUxIG91dHB1dCBpbmFjdGl2ZSB0byBhY3RpdmUgdHJhbnNpdGlvbiAqLworI2RlZmluZSBMTF9IUlRJTV9DQVBUVVJFVFJJR19URTFfUkVTRVQgICAgSFJUSU1fQ1BUMUNSX1RFMVJTVCAgICAvKiE8IENhcHR1cmUgaXMgdHJpZ2dlcmVkIGJ5IFRFMSBvdXRwdXQgYWN0aXZlIHRvIGluYWN0aXZlIHRyYW5zaXRpb24gKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0FQVFVSRVRSSUdfVElNRV9DTVAxICAgIEhSVElNX0NQVDFDUl9USU1FQ01QMSAgLyohPCBUaW1lciBFIENvbXBhcmUgMSB0cmlnZ2VycyBDYXB0dXJlICovCisjZGVmaW5lIExMX0hSVElNX0NBUFRVUkVUUklHX1RJTUVfQ01QMiAgICBIUlRJTV9DUFQxQ1JfVElNRUNNUDIgIC8qITwgVGltZXIgRSBDb21wYXJlIDIgdHJpZ2dlcnMgQ2FwdHVyZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9FQ19ETFlQUlQgIERFTEFZRUQgUFJPVEVDVElPTiAoRExZUFJUKSBNT0RFCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIGFsbCBwb3NzaWJsZSBkZWxheWVkIHByb3RlY3Rpb24gbW9kZXMgZm9yIGEgdGltZXIgKGFsc28gZGVmaW5lIHRoZSBzb3VyY2UgYW5kIG91dHB1dHMgb24gd2hpY2ggdGhlIGRlbGF5ZWQgcHJvdGVjdGlvbiBzY2hlbWVzIGFyZSBhcHBsaWVkKS4KKyAgKi8KKyNkZWZpbmUgTExfSFJUSU1fRExZUFJUX0RFTEFZT1VUMV9FRVY2ICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaW1lcnMgQSwgQiwgQzogT3V0cHV0IDEgZGVsYXllZCBJZGxlIG9uIGV4dGVybmFsIEV2ZW50IDYgKi8KKyNkZWZpbmUgTExfSFJUSU1fRExZUFJUX0RFTEFZT1VUMl9FRVY2ICAoSFJUSU1fT1VUUl9ETFlQUlRfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWVycyBBLCBCLCBDOiBPdXRwdXQgMiBkZWxheWVkIElkbGUgb24gZXh0ZXJuYWwgRXZlbnQgNiAqLworI2RlZmluZSBMTF9IUlRJTV9ETFlQUlRfREVMQVlCT1RIX0VFVjYgIChIUlRJTV9PVVRSX0RMWVBSVF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGltZXJzIEEsIEIsIEM6IE91dHB1dCAxIGFuZCBvdXRwdXQgMiBkZWxheWVkIElkbGUgb24gZXh0ZXJuYWwgRXZlbnQgNiAqLworI2RlZmluZSBMTF9IUlRJTV9ETFlQUlRfQkFMQU5DRURfRUVWNiAgIChIUlRJTV9PVVRSX0RMWVBSVF8xIHwgSFJUSU1fT1VUUl9ETFlQUlRfMCkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGltZXJzIEEsIEIsIEM6IEJhbGFuY2VkIElkbGUgb24gZXh0ZXJuYWwgRXZlbnQgNiAqLworI2RlZmluZSBMTF9IUlRJTV9ETFlQUlRfREVMQVlPVVQxX0VFVjcgIChIUlRJTV9PVVRSX0RMWVBSVF8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGltZXJzIEEsIEIsIEM6IE91dHB1dCAxIGRlbGF5ZWQgSWRsZSBvbiBleHRlcm5hbCBFdmVudCA3ICovCisjZGVmaW5lIExMX0hSVElNX0RMWVBSVF9ERUxBWU9VVDJfRUVWNyAgKEhSVElNX09VVFJfRExZUFJUXzIgfCBIUlRJTV9PVVRSX0RMWVBSVF8wKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaW1lcnMgQSwgQiwgQzogT3V0cHV0IDIgZGVsYXllZCBJZGxlIG9uIGV4dGVybmFsIEV2ZW50IDcgKi8KKyNkZWZpbmUgTExfSFJUSU1fRExZUFJUX0RFTEFZQk9USF9FRVY3ICAoSFJUSU1fT1VUUl9ETFlQUlRfMiB8IEhSVElNX09VVFJfRExZUFJUXzEpICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWVycyBBLCBCLCBDOiBPdXRwdXQgMSBhbmQgb3V0cHV0MiBkZWxheWVkIElkbGUgb24gZXh0ZXJuYWwgRXZlbnQgNyAqLworI2RlZmluZSBMTF9IUlRJTV9ETFlQUlRfQkFMQU5DRURfRUVWNyAgIChIUlRJTV9PVVRSX0RMWVBSVF8yIHwgSFJUSU1fT1VUUl9ETFlQUlRfMSB8IEhSVElNX09VVFJfRExZUFJUXzApIC8qITwgVGltZXJzIEEsIEIsIEM6IEJhbGFuY2VkIElkbGUgb24gZXh0ZXJuYWwgRXZlbnQgNyAqLworCisjZGVmaW5lIExMX0hSVElNX0RMWVBSVF9ERUxBWU9VVDFfRUVWOCAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWVycyBELCBFOiBPdXRwdXQgMSBkZWxheWVkIElkbGUgb24gZXh0ZXJuYWwgRXZlbnQgOCAqLworI2RlZmluZSBMTF9IUlRJTV9ETFlQUlRfREVMQVlPVVQyX0VFVjggIChIUlRJTV9PVVRSX0RMWVBSVF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaW1lcnMgRCwgRTogT3V0cHV0IDIgZGVsYXllZCBJZGxlIG9uIGV4dGVybmFsIEV2ZW50IDggKi8KKyNkZWZpbmUgTExfSFJUSU1fRExZUFJUX0RFTEFZQk9USF9FRVY4ICAoSFJUSU1fT1VUUl9ETFlQUlRfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGltZXJzIEQsIEU6IE91dHB1dCAxIGFuZCBvdXRwdXQgMiBkZWxheWVkIElkbGUgb24gZXh0ZXJuYWwgRXZlbnQgOCAqLworI2RlZmluZSBMTF9IUlRJTV9ETFlQUlRfQkFMQU5DRURfRUVWOCAgIChIUlRJTV9PVVRSX0RMWVBSVF8xIHwgSFJUSU1fT1VUUl9ETFlQUlRfMCkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaW1lcnMgRCwgRTogQmFsYW5jZWQgSWRsZSBvbiBleHRlcm5hbCBFdmVudCA4ICovCisjZGVmaW5lIExMX0hSVElNX0RMWVBSVF9ERUxBWU9VVDFfRUVWOSAgKEhSVElNX09VVFJfRExZUFJUXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWVycyBELCBFOiBPdXRwdXQgMSBkZWxheWVkIElkbGUgb24gZXh0ZXJuYWwgRXZlbnQgOSAqLworI2RlZmluZSBMTF9IUlRJTV9ETFlQUlRfREVMQVlPVVQyX0VFVjkgIChIUlRJTV9PVVRSX0RMWVBSVF8yIHwgSFJUSU1fT1VUUl9ETFlQUlRfMCkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaW1lcnMgRCwgRTogT3V0cHV0IDIgZGVsYXllZCBJZGxlIG9uIGV4dGVybmFsIEV2ZW50IDkgKi8KKyNkZWZpbmUgTExfSFJUSU1fRExZUFJUX0RFTEFZQk9USF9FRVY5ICAoSFJUSU1fT1VUUl9ETFlQUlRfMiB8IEhSVElNX09VVFJfRExZUFJUXzEpICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGltZXJzIEQsIEU6IE91dHB1dCAxIGFuZCBvdXRwdXQyIGRlbGF5ZWQgSWRsZSBvbiBleHRlcm5hbCBFdmVudCA5ICovCisjZGVmaW5lIExMX0hSVElNX0RMWVBSVF9CQUxBTkNFRF9FRVY5ICAgKEhSVElNX09VVFJfRExZUFJUXzIgfCBIUlRJTV9PVVRSX0RMWVBSVF8xIHwgSFJUSU1fT1VUUl9ETFlQUlRfMCkgICAvKiE8IFRpbWVycyBELCBFOiBCYWxhbmNlZCBJZGxlIG9uIGV4dGVybmFsIEV2ZW50IDkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRUNfQlVSU1RNT0RFICBCVVJTVCBNT0RFCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIGhvdyB0aGUgdGltZXIgYmVoYXZlcyBkdXJpbmcgYSBidXJzdCBtb2RlIG9wZXJhdGlvbi4KKyAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQlVSU1RNT0RFX01BSU5UQUlOQ0xPQ0sgKHVpbnQzMl90KTB4MDAwMDAwIC8qITwgVGltZXIgY291bnRlciBjbG9jayBpcyBtYWludGFpbmVkIGFuZCB0aGUgdGltZXIgb3BlcmF0ZXMgbm9ybWFsbHkgKi8KKyNkZWZpbmUgTExfSFJUSU1fQlVSU1RNT0RFX1JFU0VUQ09VTlRFUiAgKEhSVElNX0JNQ1JfTVRCTSkgIC8qITwgVGltZXIgY291bnRlciBjbG9jayBpcyBzdG9wcGVkIGFuZCB0aGUgY291bnRlciBpcyByZXNldCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9FQ19CVVJTVERNQSAgQlVSU1QgRE1BCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRoZSByZWdpc3RlcnMgdGhhdCBjYW4gYmUgd3JpdHRlbiBkdXJpbmcgYSBidXJzdCBETUEgb3BlcmF0aW9uLgorICAqLworI2RlZmluZSBMTF9IUlRJTV9CVVJTVERNQV9OT05FICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgLyohPCBObyByZWdpc3RlciBpcyB1cGRhdGVkIGJ5IEJ1cnN0IERNQSBhY2Nlc3NlcyAqLworCisjZGVmaW5lIExMX0hSVElNX0JVUlNURE1BX01DUiAgICAoSFJUSU1fQkRNVVBSX01DUikgICAgICAgICAgLyohPCBNQ1IgIHJlZ2lzdGVyIGlzIHVwZGF0ZWQgYnkgQnVyc3QgRE1BIGFjY2Vzc2VzICovCisjZGVmaW5lIExMX0hSVElNX0JVUlNURE1BX01JQ1IgICAoSFJUSU1fQkRNVVBSX01JQ1IpICAgICAgICAgLyohPCBNSUNSIHJlZ2lzdGVyIGlzIHVwZGF0ZWQgYnkgQnVyc3QgRE1BIGFjY2Vzc2VzICovCisjZGVmaW5lIExMX0hSVElNX0JVUlNURE1BX01ESUVSICAoSFJUSU1fQkRNVVBSX01ESUVSKSAgICAgICAgLyohPCBNRElFUiByZWdpc3RlciBpcyB1cGRhdGVkIGJ5IEJ1cnN0IERNQSBhY2Nlc3NlcyAqLworI2RlZmluZSBMTF9IUlRJTV9CVVJTVERNQV9NQ05UICAgKEhSVElNX0JETVVQUl9NQ05UKSAgICAgICAgIC8qITwgTUNOVFIgcmVnaXN0ZXIgaXMgdXBkYXRlZCBieSBCdXJzdCBETUEgYWNjZXNzZXMgKi8KKyNkZWZpbmUgTExfSFJUSU1fQlVSU1RETUFfTVBFUiAgIChIUlRJTV9CRE1VUFJfTVBFUikgICAgICAgICAvKiE8IE1QRVIgcmVnaXN0ZXIgaXMgdXBkYXRlZCBieSBCdXJzdCBETUEgYWNjZXNzZXMgKi8KKyNkZWZpbmUgTExfSFJUSU1fQlVSU1RETUFfTVJFUCAgIChIUlRJTV9CRE1VUFJfTVJFUCkgICAgICAgICAvKiE8IE1SRVBSIHJlZ2lzdGVyIGlzIHVwZGF0ZWQgYnkgQnVyc3QgRE1BIGFjY2Vzc2VzICovCisjZGVmaW5lIExMX0hSVElNX0JVUlNURE1BX01DTVAxICAoSFJUSU1fQkRNVVBSX01DTVAxKSAgICAgICAgLyohPCBNQ01QMVIgcmVnaXN0ZXIgaXMgdXBkYXRlZCBieSBCdXJzdCBETUEgYWNjZXNzZXMgKi8KKyNkZWZpbmUgTExfSFJUSU1fQlVSU1RETUFfTUNNUDIgIChIUlRJTV9CRE1VUFJfTUNNUDIpICAgICAgICAvKiE8IE1DTVAyUiByZWdpc3RlciBpcyB1cGRhdGVkIGJ5IEJ1cnN0IERNQSBhY2Nlc3NlcyAqLworI2RlZmluZSBMTF9IUlRJTV9CVVJTVERNQV9NQ01QMyAgKEhSVElNX0JETVVQUl9NQ01QMykgICAgICAgIC8qITwgTUNNUDNSIHJlZ2lzdGVyIGlzIHVwZGF0ZWQgYnkgQnVyc3QgRE1BIGFjY2Vzc2VzICovCisjZGVmaW5lIExMX0hSVElNX0JVUlNURE1BX01DTVA0ICAoSFJUSU1fQkRNVVBSX01DTVA0KSAgICAgICAgLyohPCBNQ01QNFIgcmVnaXN0ZXIgaXMgdXBkYXRlZCBieSBCdXJzdCBETUEgYWNjZXNzZXMgKi8KKworI2RlZmluZSBMTF9IUlRJTV9CVVJTVERNQV9USU1NQ1IgICAoSFJUSU1fQkRUVVBSX1RJTUNSKSAgICAgIC8qITwgVElNeENSIHJlZ2lzdGVyIGlzIHVwZGF0ZWQgYnkgQnVyc3QgRE1BIGFjY2Vzc2VzICovCisjZGVmaW5lIExMX0hSVElNX0JVUlNURE1BX1RJTUlDUiAgIChIUlRJTV9CRFRVUFJfVElNSUNSKSAgICAgLyohPCBUSU14SUNSIHJlZ2lzdGVyIGlzIHVwZGF0ZWQgYnkgQnVyc3QgRE1BIGFjY2Vzc2VzICovCisjZGVmaW5lIExMX0hSVElNX0JVUlNURE1BX1RJTURJRVIgIChIUlRJTV9CRFRVUFJfVElNRElFUikgICAgLyohPCBUSU14RElFUiByZWdpc3RlciBpcyB1cGRhdGVkIGJ5IEJ1cnN0IERNQSBhY2Nlc3NlcyAqLworI2RlZmluZSBMTF9IUlRJTV9CVVJTVERNQV9USU1DTlQgICAoSFJUSU1fQkRUVVBSX1RJTUNOVCkgICAgIC8qITwgQ05UeENSIHJlZ2lzdGVyIGlzIHVwZGF0ZWQgYnkgQnVyc3QgRE1BIGFjY2Vzc2VzICovCisjZGVmaW5lIExMX0hSVElNX0JVUlNURE1BX1RJTVBFUiAgIChIUlRJTV9CRFRVUFJfVElNUEVSKSAgICAgLyohPCBQRVJ4UiByZWdpc3RlciBpcyB1cGRhdGVkIGJ5IEJ1cnN0IERNQSBhY2Nlc3NlcyAqLworI2RlZmluZSBMTF9IUlRJTV9CVVJTVERNQV9USU1SRVAgICAoSFJUSU1fQkRUVVBSX1RJTVJFUCkgICAgIC8qITwgUkVQeFIgcmVnaXN0ZXIgaXMgdXBkYXRlZCBieSBCdXJzdCBETUEgYWNjZXNzZXMgKi8KKyNkZWZpbmUgTExfSFJUSU1fQlVSU1RETUFfVElNQ01QMSAgKEhSVElNX0JEVFVQUl9USU1DTVAxKSAgICAvKiE8IENNUDF4UiByZWdpc3RlciBpcyB1cGRhdGVkIGJ5IEJ1cnN0IERNQSBhY2Nlc3NlcyAqLworI2RlZmluZSBMTF9IUlRJTV9CVVJTVERNQV9USU1DTVAyICAoSFJUSU1fQkRUVVBSX1RJTUNNUDIpICAgIC8qITwgQ01QMnhSIHJlZ2lzdGVyIGlzIHVwZGF0ZWQgYnkgQnVyc3QgRE1BIGFjY2Vzc2VzICovCisjZGVmaW5lIExMX0hSVElNX0JVUlNURE1BX1RJTUNNUDMgIChIUlRJTV9CRFRVUFJfVElNQ01QMykgICAgLyohPCBDTVAzeFIgcmVnaXN0ZXIgaXMgdXBkYXRlZCBieSBCdXJzdCBETUEgYWNjZXNzZXMgKi8KKyNkZWZpbmUgTExfSFJUSU1fQlVSU1RETUFfVElNQ01QNCAgKEhSVElNX0JEVFVQUl9USU1DTVA0KSAgICAvKiE8IENNUDR4UiByZWdpc3RlciBpcyB1cGRhdGVkIGJ5IEJ1cnN0IERNQSBhY2Nlc3NlcyAqLworI2RlZmluZSBMTF9IUlRJTV9CVVJTVERNQV9USU1EVFIgICAoSFJUSU1fQkRUVVBSX1RJTURUUikgICAgIC8qITwgRFR4UiByZWdpc3RlciBpcyB1cGRhdGVkIGJ5IEJ1cnN0IERNQSBhY2Nlc3NlcyAqLworI2RlZmluZSBMTF9IUlRJTV9CVVJTVERNQV9USU1TRVQxUiAoSFJUSU1fQkRUVVBSX1RJTVNFVDFSKSAgIC8qITwgU0VUMVIgcmVnaXN0ZXIgaXMgdXBkYXRlZCBieSBCdXJzdCBETUEgYWNjZXNzZXMgKi8KKyNkZWZpbmUgTExfSFJUSU1fQlVSU1RETUFfVElNUlNUMVIgKEhSVElNX0JEVFVQUl9USU1SU1QxUikgICAvKiE8IFJTVDFSIHJlZ2lzdGVyIGlzIHVwZGF0ZWQgYnkgQnVyc3QgRE1BIGFjY2Vzc2VzICovCisjZGVmaW5lIExMX0hSVElNX0JVUlNURE1BX1RJTVNFVDJSIChIUlRJTV9CRFRVUFJfVElNU0VUMlIpICAgLyohPCBTRVQyUiByZWdpc3RlciBpcyB1cGRhdGVkIGJ5IEJ1cnN0IERNQSBhY2Nlc3NlcyAqLworI2RlZmluZSBMTF9IUlRJTV9CVVJTVERNQV9USU1SU1QyUiAoSFJUSU1fQkRUVVBSX1RJTVJTVDJSKSAgIC8qITwgUlNUMVIgcmVnaXN0ZXIgaXMgdXBkYXRlZCBieSBCdXJzdCBETUEgYWNjZXNzZXMgKi8KKyNkZWZpbmUgTExfSFJUSU1fQlVSU1RETUFfVElNRUVGUjEgKEhSVElNX0JEVFVQUl9USU1FRUZSMSkgICAvKiE8IEVFRnhSMSByZWdpc3RlciBpcyB1cGRhdGVkIGJ5IEJ1cnN0IERNQSBhY2Nlc3NlcyAqLworI2RlZmluZSBMTF9IUlRJTV9CVVJTVERNQV9USU1FRUZSMiAoSFJUSU1fQkRUVVBSX1RJTUVFRlIyKSAgIC8qITwgRUVGeFIyIHJlZ2lzdGVyIGlzIHVwZGF0ZWQgYnkgQnVyc3QgRE1BIGFjY2Vzc2VzICovCisjZGVmaW5lIExMX0hSVElNX0JVUlNURE1BX1RJTVJTVFIgIChIUlRJTV9CRFRVUFJfVElNUlNUUikgICAgLyohPCBSU1R4UiByZWdpc3RlciBpcyB1cGRhdGVkIGJ5IEJ1cnN0IERNQSBhY2Nlc3NlcyAqLworI2RlZmluZSBMTF9IUlRJTV9CVVJTVERNQV9USU1DSFBSICAoSFJUSU1fQkRUVVBSX1RJTUNIUFIpICAgIC8qITwgQ0hQeFIgcmVnaXN0ZXIgaXMgdXBkYXRlZCBieSBCdXJzdCBETUEgYWNjZXNzZXMgKi8KKyNkZWZpbmUgTExfSFJUSU1fQlVSU1RETUFfVElNT1VUUiAgKEhSVElNX0JEVFVQUl9USU1PVVRSKSAgICAvKiE8IE9VVHhSIHJlZ2lzdGVyIGlzIHVwZGF0ZWQgYnkgQnVyc3QgRE1BIGFjY2Vzc2VzICovCisjZGVmaW5lIExMX0hSVElNX0JVUlNURE1BX1RJTUZMVFIgIChIUlRJTV9CRFRVUFJfVElNRkxUUikgICAgLyohPCBGTFR4UiByZWdpc3RlciBpcyB1cGRhdGVkIGJ5IEJ1cnN0IERNQSBhY2Nlc3NlcyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9FQ19DUFBTVEFUICBDVVJSRU5UIFBVU0gtUFVMTCBTVEFUVVMKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgb24gd2hpY2ggb3V0cHV0IHRoZSBzaWduYWwgaXMgY3VycmVudGx5IGFwcGxpZWQgaW4gcHVzaC1wdWxsIG1vZGUuCisgICovCisjZGVmaW5lIExMX0hSVElNX0NQUFNUQVRfT1VUUFVUMSAgICgodWludDMyX3QpIDB4MDAwMDAwMDBVKSAvKiE8IFNpZ25hbCBhcHBsaWVkIG9uIG91dHB1dCAxIGFuZCBvdXRwdXQgMiBmb3JjZWQgaW5hY3RpdmUgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ1BQU1RBVF9PVVRQVVQyICAgKEhSVElNX1RJTUlTUl9DUFBTVEFUKSAgLyohPCBTaWduYWwgYXBwbGllZCBvbiBvdXRwdXQgMiBhbmQgb3V0cHV0IDEgZm9yY2VkIGluYWN0aXZlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0VDX0lQUFNUQVQgIElETEUgUFVTSC1QVUxMIFNUQVRVUworICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyBvbiB3aGljaCBvdXRwdXQgdGhlIHNpZ25hbCB3YXMgYXBwbGllZCwgaW4gcHVzaC1wdWxsIG1vZGUgYmFsYW5jZWQgZmF1bHQgbW9kZSBvciBkZWxheWVkIGlkbGUgbW9kZSwgd2hlbiB0aGUgcHJvdGVjdGlvbiB3YXMgdHJpZ2dlcmVkLgorICAqLworI2RlZmluZSBMTF9IUlRJTV9JUFBTVEFUX09VVFBVVDEgICAoKHVpbnQzMl90KSAweDAwMDAwMDAwVSkgICAgLyohPCBQcm90ZWN0aW9uIG9jY3VycmVkIHdoZW4gdGhlIG91dHB1dCAxIHdhcyBhY3RpdmUgYW5kIG91dHB1dCAyIGZvcmNlZCBpbmFjdGl2ZSAqLworI2RlZmluZSBMTF9IUlRJTV9JUFBTVEFUX09VVFBVVDIgICAoSFJUSU1fVElNSVNSX0lQUFNUQVQpICAgICAvKiE8IFByb3RlY3Rpb24gb2NjdXJyZWQgd2hlbiB0aGUgb3V0cHV0IDIgd2FzIGFjdGl2ZSBhbmQgb3V0cHV0IDEgZm9yY2VkIGluYWN0aXZlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0VDX1RJTV9FRUZMVFIgVElNRVIgRVhURVJOQUwgRVZFTlQgRklMVEVSCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRoZSBldmVudCBmaWx0ZXJpbmcgYXBwbGllZCB0byBleHRlcm5hbCBldmVudHMgYnkgYSB0aW1lci4KKyAgKi8KKyNkZWZpbmUgTExfSFJUSU1fRUVGTFRSX05PTkUgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgTExfSFJUSU1fRUVGTFRSX0JMQU5LSU5HQ01QMSAgICAgKEhSVElNX0VFRlIxX0VFMUZMVFJfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEJsYW5raW5nIGZyb20gY291bnRlciByZXNldC9yb2xsLW92ZXIgdG8gQ29tcGFyZSAxICovCisjZGVmaW5lIExMX0hSVElNX0VFRkxUUl9CTEFOS0lOR0NNUDIgICAgIChIUlRJTV9FRUZSMV9FRTFGTFRSXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCbGFua2luZyBmcm9tIGNvdW50ZXIgcmVzZXQvcm9sbC1vdmVyIHRvIENvbXBhcmUgMiAqLworI2RlZmluZSBMTF9IUlRJTV9FRUZMVFJfQkxBTktJTkdDTVAzICAgICAoSFJUSU1fRUVGUjFfRUUxRkxUUl8xIHwgSFJUSU1fRUVGUjFfRUUxRkxUUl8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQmxhbmtpbmcgZnJvbSBjb3VudGVyIHJlc2V0L3JvbGwtb3ZlciB0byBDb21wYXJlIDMgKi8KKyNkZWZpbmUgTExfSFJUSU1fRUVGTFRSX0JMQU5LSU5HQ01QNCAgICAgKEhSVElNX0VFRlIxX0VFMUZMVFJfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEJsYW5raW5nIGZyb20gY291bnRlciByZXNldC9yb2xsLW92ZXIgdG8gQ29tcGFyZSA0ICovCisjZGVmaW5lIExMX0hSVElNX0VFRkxUUl9CTEFOS0lOR0ZMVFIxICAgIChIUlRJTV9FRUZSMV9FRTFGTFRSXzIgfCBIUlRJTV9FRUZSMV9FRTFGTFRSXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCbGFua2luZyBmcm9tIGFub3RoZXIgdGltaW5nIHVuaXQ6IFRJTUZMVFIxIHNvdXJjZSAqLworI2RlZmluZSBMTF9IUlRJTV9FRUZMVFJfQkxBTktJTkdGTFRSMiAgICAoSFJUSU1fRUVGUjFfRUUxRkxUUl8yIHwgSFJUSU1fRUVGUjFfRUUxRkxUUl8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQmxhbmtpbmcgZnJvbSBhbm90aGVyIHRpbWluZyB1bml0OiBUSU1GTFRSMiBzb3VyY2UgKi8KKyNkZWZpbmUgTExfSFJUSU1fRUVGTFRSX0JMQU5LSU5HRkxUUjMgICAgKEhSVElNX0VFRlIxX0VFMUZMVFJfMiB8IEhSVElNX0VFRlIxX0VFMUZMVFJfMSB8IEhSVElNX0VFRlIxX0VFMUZMVFJfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEJsYW5raW5nIGZyb20gYW5vdGhlciB0aW1pbmcgdW5pdDogVElNRkxUUjMgc291cmNlICovCisjZGVmaW5lIExMX0hSVElNX0VFRkxUUl9CTEFOS0lOR0ZMVFI0ICAgIChIUlRJTV9FRUZSMV9FRTFGTFRSXzMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCbGFua2luZyBmcm9tIGFub3RoZXIgdGltaW5nIHVuaXQ6IFRJTUZMVFI0IHNvdXJjZSAqLworI2RlZmluZSBMTF9IUlRJTV9FRUZMVFJfQkxBTktJTkdGTFRSNSAgICAoSFJUSU1fRUVGUjFfRUUxRkxUUl8zIHwgSFJUSU1fRUVGUjFfRUUxRkxUUl8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQmxhbmtpbmcgZnJvbSBhbm90aGVyIHRpbWluZyB1bml0OiBUSU1GTFRSNSBzb3VyY2UgKi8KKyNkZWZpbmUgTExfSFJUSU1fRUVGTFRSX0JMQU5LSU5HRkxUUjYgICAgKEhSVElNX0VFRlIxX0VFMUZMVFJfMyB8IEhSVElNX0VFRlIxX0VFMUZMVFJfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEJsYW5raW5nIGZyb20gYW5vdGhlciB0aW1pbmcgdW5pdDogVElNRkxUUjYgc291cmNlICovCisjZGVmaW5lIExMX0hSVElNX0VFRkxUUl9CTEFOS0lOR0ZMVFI3ICAgIChIUlRJTV9FRUZSMV9FRTFGTFRSXzMgfCBIUlRJTV9FRUZSMV9FRTFGTFRSXzEgfCBIUlRJTV9FRUZSMV9FRTFGTFRSXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCbGFua2luZyBmcm9tIGFub3RoZXIgdGltaW5nIHVuaXQ6IFRJTUZMVFI3IHNvdXJjZSAqLworI2RlZmluZSBMTF9IUlRJTV9FRUZMVFJfQkxBTktJTkdGTFRSOCAgICAoSFJUSU1fRUVGUjFfRUUxRkxUUl8zIHwgSFJUSU1fRUVGUjFfRUUxRkxUUl8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQmxhbmtpbmcgZnJvbSBhbm90aGVyIHRpbWluZyB1bml0OiBUSU1GTFRSOCBzb3VyY2UgKi8KKyNkZWZpbmUgTExfSFJUSU1fRUVGTFRSX1dJTkRPV0lOR0NNUDIgICAgKEhSVElNX0VFRlIxX0VFMUZMVFJfMyB8IEhSVElNX0VFRlIxX0VFMUZMVFJfMiB8IEhSVElNX0VFRlIxX0VFMUZMVFJfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFdpbmRvd2luZyBmcm9tIGNvdW50ZXIgcmVzZXQvcm9sbC1vdmVyIHRvIENvbXBhcmUgMiAqLworI2RlZmluZSBMTF9IUlRJTV9FRUZMVFJfV0lORE9XSU5HQ01QMyAgICAoSFJUSU1fRUVGUjFfRUUxRkxUUl8zIHwgSFJUSU1fRUVGUjFfRUUxRkxUUl8yIHwgSFJUSU1fRUVGUjFfRUUxRkxUUl8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV2luZG93aW5nIGZyb20gY291bnRlciByZXNldC9yb2xsLW92ZXIgdG8gQ29tcGFyZSAzICovCisjZGVmaW5lIExMX0hSVElNX0VFRkxUUl9XSU5ET1dJTkdUSU0gICAgIChIUlRJTV9FRUZSMV9FRTFGTFRSXzMgfCBIUlRJTV9FRUZSMV9FRTFGTFRSXzIgfCBIUlRJTV9FRUZSMV9FRTFGTFRSXzEgfCBIUlRJTV9FRUZSMV9FRTFGTFRSXzMgfCBIUlRJTV9FRUZSMV9FRTFGTFRSXzIgfCBIUlRJTV9FRUZSMV9FRTFGTFRSXzApICAvKiE8IFdpbmRvd2luZyBmcm9tIGFub3RoZXIgdGltaW5nIHVuaXQ6IFRJTVdJTiBzb3VyY2UgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRUNfVElNX0xBVENIU1RBVFVTIFRJTUVSIEVYVEVSTkFMIEVWRU5UIExBVENIIFNUQVRVUworICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB3aGV0aGVyIG9yIG5vdCB0aGUgZXh0ZXJuYWwgZXZlbnQgaXMgbWVtb3JpemVkIChsYXRjaGVkKSBhbmQgZ2VuZXJhdGVkIGFzIHNvb24gYXMgdGhlIGJsYW5raW5nIHBlcmlvZCBpcyBjb21wbGV0ZWQgb3IgdGhlIHdpbmRvdyBlbmRzLgorICAqLworI2RlZmluZSBMTF9IUlRJTV9FRUxBVENIX0RJU0FCTEVEICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpIC8qITwgRXZlbnQgaXMgaWdub3JlZCBpZiBpdCBoYXBwZW5zIGR1cmluZyBhIGJsYW5rLCBvciBwYXNzZWQgdGhyb3VnaCBkdXJpbmcgYSB3aW5kb3cgKi8KKyNkZWZpbmUgTExfSFJUSU1fRUVMQVRDSF9FTkFCTEVEICAgICBIUlRJTV9FRUZSMV9FRTFMVENIICAgICAvKiE8IEV2ZW50IGlzIGxhdGNoZWQgYW5kIGRlbGF5ZWQgdGlsbCB0aGUgZW5kIG9mIHRoZSBibGFua2luZyBvciB3aW5kb3dpbmcgcGVyaW9kICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0VDX0RUX1BSRVNDQUxFUiBERUFEVElNRSBQUkVTQ0FMRVIKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgZGl2aXNpb24gcmF0aW8gYmV0d2VlbiB0aGUgdGltZXIgY2xvY2sgZnJlcXVlbmN5IChmSFJUSU0pIGFuZCB0aGUgZGVhZHRpbWUgZ2VuZXJhdG9yIGNsb2NrIChmRFRHKS4KKyAgKi8KKyNkZWZpbmUgTExfSFJUSU1fRFRfUFJFU0NBTEVSX01VTDggICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZkRURyA9IGZIUlRJTSAqIDggKi8KKyNkZWZpbmUgTExfSFJUSU1fRFRfUFJFU0NBTEVSX01VTDQgICAgKEhSVElNX0RUUl9EVFBSU0NfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZkRURyA9IGZIUlRJTSAqIDQgKi8KKyNkZWZpbmUgTExfSFJUSU1fRFRfUFJFU0NBTEVSX01VTDIgICAgKEhSVElNX0RUUl9EVFBSU0NfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZkRURyA9IGZIUlRJTSAqIDIgKi8KKyNkZWZpbmUgTExfSFJUSU1fRFRfUFJFU0NBTEVSX0RJVjEgICAgKEhSVElNX0RUUl9EVFBSU0NfMSB8IEhSVElNX0RUUl9EVFBSU0NfMCkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZkRURyA9IGZIUlRJTSAqLworI2RlZmluZSBMTF9IUlRJTV9EVF9QUkVTQ0FMRVJfRElWMiAgICAoSFJUSU1fRFRSX0RUUFJTQ18yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmRFRHID0gZkhSVElNIC8gMiAqLworI2RlZmluZSBMTF9IUlRJTV9EVF9QUkVTQ0FMRVJfRElWNCAgICAoSFJUSU1fRFRSX0RUUFJTQ18yIHwgSFJUSU1fRFRSX0RUUFJTQ18wKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmRFRHID0gZkhSVElNIC8gNCAqLworI2RlZmluZSBMTF9IUlRJTV9EVF9QUkVTQ0FMRVJfRElWOCAgICAoSFJUSU1fRFRSX0RUUFJTQ18yIHwgSFJUSU1fRFRSX0RUUFJTQ18xKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmRFRHID0gZkhSVElNIC8gOCAqLworI2RlZmluZSBMTF9IUlRJTV9EVF9QUkVTQ0FMRVJfRElWMTYgICAoSFJUSU1fRFRSX0RUUFJTQ18yIHwgSFJUSU1fRFRSX0RUUFJTQ18xIHwgSFJUSU1fRFRSX0RUUFJTQ18wKSAgLyohPCBmRFRHID0gZkhSVElNIC8gMTYgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRUNfRFRfUklTSU5HX1NJR04gREVBRFRJTUUgUklTSU5HIFNJR04KKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgd2hldGhlciB0aGUgZGVhZHRpbWUgaXMgcG9zaXRpdmUgb3IgbmVnYXRpdmUgKG92ZXJsYXBwaW5nIHNpZ25hbCkgb24gcmlzaW5nIGVkZ2UuCisgICovCisjZGVmaW5lIExMX0hSVElNX0RUX1JJU0lOR19QT1NJVElWRSAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IFBvc2l0aXZlIGRlYWR0aW1lIG9uIHJpc2luZyBlZGdlICovCisjZGVmaW5lIExMX0hSVElNX0RUX1JJU0lOR19ORUdBVElWRSAgICAoSFJUSU1fRFRSX1NEVFIpICAgICAgICAvKiE8IE5lZ2F0aXZlIGRlYWR0aW1lIG9uIHJpc2luZyBlZGdlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0VDX0RUX0ZBTExJTkdfU0lHTiBERUFEVElNRSBGQUxMSU5HIFNJR04KKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgd2hldGhlciB0aGUgZGVhZHRpbWUgaXMgcG9zaXRpdmUgb3IgbmVnYXRpdmUgKG92ZXJsYXBwaW5nIHNpZ25hbCkgb24gZmFsbGluZyBlZGdlLgorICAqLworI2RlZmluZSBMTF9IUlRJTV9EVF9GQUxMSU5HX1BPU0lUSVZFICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpIC8qITwgUG9zaXRpdmUgZGVhZHRpbWUgb24gZmFsbGluZyBlZGdlICovCisjZGVmaW5lIExMX0hSVElNX0RUX0ZBTExJTkdfTkVHQVRJVkUgICAgKEhSVElNX0RUUl9TRFRGKSAgICAgICAgLyohPCBOZWdhdGl2ZSBkZWFkdGltZSBvbiBmYWxsaW5nIGVkZ2UgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRUNfQ0hQX1BSRVNDQUxFUiBDSE9QUEVSIE1PREUgUFJFU0NBTEVSCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGdlbmVyYXRlZCBoaWdoIGZyZXF1ZW5jeSBjYXJyaWVyIChmQ0hQRlJRKS4KKyAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0hQX1BSRVNDQUxFUl9ESVYxNiAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZDSFBGUlEgPSBmSFJUSU0gLyAxNiAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0hQX1BSRVNDQUxFUl9ESVYzMiAgKEhSVElNX0NIUFJfQ0FSRlJRXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZDSFBGUlEgPSBmSFJUSU0gLyAzMiAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0hQX1BSRVNDQUxFUl9ESVY0OCAgKEhSVElNX0NIUFJfQ0FSRlJRXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZDSFBGUlEgPSBmSFJUSU0gLyA0OCAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0hQX1BSRVNDQUxFUl9ESVY2NCAgKEhSVElNX0NIUFJfQ0FSRlJRXzEgfCBIUlRJTV9DSFBSX0NBUkZSUV8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZDSFBGUlEgPSBmSFJUSU0gLyA2NCAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0hQX1BSRVNDQUxFUl9ESVY4MCAgKEhSVElNX0NIUFJfQ0FSRlJRXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZDSFBGUlEgPSBmSFJUSU0gLyA4MCAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0hQX1BSRVNDQUxFUl9ESVY5NiAgKEhSVElNX0NIUFJfQ0FSRlJRXzIgfCBIUlRJTV9DSFBSX0NBUkZSUV8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZDSFBGUlEgPSBmSFJUSU0gLyA5NiAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0hQX1BSRVNDQUxFUl9ESVYxMTIgKEhSVElNX0NIUFJfQ0FSRlJRXzIgfCBIUlRJTV9DSFBSX0NBUkZSUV8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZDSFBGUlEgPSBmSFJUSU0gLyAxMTIgICovCisjZGVmaW5lIExMX0hSVElNX0NIUF9QUkVTQ0FMRVJfRElWMTI4IChIUlRJTV9DSFBSX0NBUkZSUV8yIHwgSFJUSU1fQ0hQUl9DQVJGUlFfMSB8IEhSVElNX0NIUFJfQ0FSRlJRXzApICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmQ0hQRlJRID0gZkhSVElNIC8gMTI4ICAqLworI2RlZmluZSBMTF9IUlRJTV9DSFBfUFJFU0NBTEVSX0RJVjE0NCAoSFJUSU1fQ0hQUl9DQVJGUlFfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZkNIUEZSUSA9IGZIUlRJTSAvIDE0NCAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0hQX1BSRVNDQUxFUl9ESVYxNjAgKEhSVElNX0NIUFJfQ0FSRlJRXzMgfCBIUlRJTV9DSFBSX0NBUkZSUV8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZDSFBGUlEgPSBmSFJUSU0gLyAxNjAgICovCisjZGVmaW5lIExMX0hSVElNX0NIUF9QUkVTQ0FMRVJfRElWMTc2IChIUlRJTV9DSFBSX0NBUkZSUV8zIHwgSFJUSU1fQ0hQUl9DQVJGUlFfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmQ0hQRlJRID0gZkhSVElNIC8gMTc2ICAqLworI2RlZmluZSBMTF9IUlRJTV9DSFBfUFJFU0NBTEVSX0RJVjE5MiAoSFJUSU1fQ0hQUl9DQVJGUlFfMyB8IEhSVElNX0NIUFJfQ0FSRlJRXzEgfCBIUlRJTV9DSFBSX0NBUkZSUV8wKSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZkNIUEZSUSA9IGZIUlRJTSAvIDE5MiAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0hQX1BSRVNDQUxFUl9ESVYyMDggKEhSVElNX0NIUFJfQ0FSRlJRXzMgfCBIUlRJTV9DSFBSX0NBUkZSUV8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZDSFBGUlEgPSBmSFJUSU0gLyAyMDggICovCisjZGVmaW5lIExMX0hSVElNX0NIUF9QUkVTQ0FMRVJfRElWMjI0IChIUlRJTV9DSFBSX0NBUkZSUV8zIHwgSFJUSU1fQ0hQUl9DQVJGUlFfMiB8IEhSVElNX0NIUFJfQ0FSRlJRXzApICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmQ0hQRlJRID0gZkhSVElNIC8gMjI0ICAqLworI2RlZmluZSBMTF9IUlRJTV9DSFBfUFJFU0NBTEVSX0RJVjI0MCAoSFJUSU1fQ0hQUl9DQVJGUlFfMyB8IEhSVElNX0NIUFJfQ0FSRlJRXzIgfCBIUlRJTV9DSFBSX0NBUkZSUV8xKSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZkNIUEZSUSA9IGZIUlRJTSAvIDI0MCAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0hQX1BSRVNDQUxFUl9ESVYyNTYgKEhSVElNX0NIUFJfQ0FSRlJRXzMgfCBIUlRJTV9DSFBSX0NBUkZSUV8yIHwgSFJUSU1fQ0hQUl9DQVJGUlFfMSB8IEhSVElNX0NIUFJfQ0FSRlJRXzApICAvKiE8IGZDSFBGUlEgPSBmSFJUSU0gLyAyNTYgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9FQ19DSFBfRFVUWUNZQ0xFIENIT1BQRVIgTU9ERSBEVVRZIENZQ0xFCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRoZSBkdXR5IGN5Y2xlIG9mIHRoZSBnZW5lcmF0ZWQgaGlnaCBmcmVxdWVuY3kgY2Fycmllci4gRHV0eSBjeWNsZSBjYW4gYmUgYWRqdXN0ZWQgYnkgMS84IHN0ZXAgKGZyb20gMC84IHVwIHRvIDcvOCkuCisgICovCisjZGVmaW5lIExMX0hSVElNX0NIUF9EVVRZQ1lDTEVfMCAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE9ubHkgMXN0IHB1bHNlIGlzIHByZXNlbnQgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0hQX0RVVFlDWUNMRV8xMjUgIChIUlRJTV9DSFBSX0NBUkRUWV8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRHV0eSBjeWNsZSBvZiB0aGUgY2FycmllciBzaWduYWwgaXMgMTIuNSAlICovCisjZGVmaW5lIExMX0hSVElNX0NIUF9EVVRZQ1lDTEVfMjUwICAoSFJUSU1fQ0hQUl9DQVJEVFlfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IER1dHkgY3ljbGUgb2YgdGhlIGNhcnJpZXIgc2lnbmFsIGlzIDI1ICUgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0hQX0RVVFlDWUNMRV8zNzUgIChIUlRJTV9DSFBSX0NBUkRUWV8xIHwgSFJUSU1fQ0hQUl9DQVJEVFlfMCkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRHV0eSBjeWNsZSBvZiB0aGUgY2FycmllciBzaWduYWwgaXMgMzcuNSAlICovCisjZGVmaW5lIExMX0hSVElNX0NIUF9EVVRZQ1lDTEVfNTAwICAoSFJUSU1fQ0hQUl9DQVJEVFlfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IER1dHkgY3ljbGUgb2YgdGhlIGNhcnJpZXIgc2lnbmFsIGlzIDUwICUgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0hQX0RVVFlDWUNMRV82MjUgIChIUlRJTV9DSFBSX0NBUkRUWV8yIHwgSFJUSU1fQ0hQUl9DQVJEVFlfMCkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRHV0eSBjeWNsZSBvZiB0aGUgY2FycmllciBzaWduYWwgaXMgNjIuNSAlICovCisjZGVmaW5lIExMX0hSVElNX0NIUF9EVVRZQ1lDTEVfNzUwICAoSFJUSU1fQ0hQUl9DQVJEVFlfMiB8IEhSVElNX0NIUFJfQ0FSRFRZXzEpICAgICAgICAgICAgICAgICAgICAgICAvKiE8IER1dHkgY3ljbGUgb2YgdGhlIGNhcnJpZXIgc2lnbmFsIGlzIDc1ICUgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0hQX0RVVFlDWUNMRV84NzUgIChIUlRJTV9DSFBSX0NBUkRUWV8yIHwgSFJUSU1fQ0hQUl9DQVJEVFlfMSB8IEhSVElNX0NIUFJfQ0FSRFRZXzApIC8qITwgRHV0eSBjeWNsZSBvZiB0aGUgY2FycmllciBzaWduYWwgaXMgODcuNSAlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0VDX0NIUF9QVUxTRVdJRFRIIENIT1BQRVIgTU9ERSBQVUxTRSBXSURUSAorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB0aGUgcHVsc2Ugd2lkdGggb2YgdGhlIGZpcnN0IHB1bHNlIG9mIHRoZSBnZW5lcmF0ZWQgaGlnaCBmcmVxdWVuY3kgY2Fycmllci4KKyAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0hQX1BVTFNFV0lEVEhfMTYgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCB0U1RQVyA9IHRIUlRJTSB4IDE2ICAqLworI2RlZmluZSBMTF9IUlRJTV9DSFBfUFVMU0VXSURUSF8zMiAgIChIUlRJTV9DSFBSX1NUUlBXXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHRTVFBXID0gdEhSVElNIHggMzIgICovCisjZGVmaW5lIExMX0hSVElNX0NIUF9QVUxTRVdJRFRIXzQ4ICAgKEhSVElNX0NIUFJfU1RSUFdfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgdFNUUFcgPSB0SFJUSU0geCA0OCAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0hQX1BVTFNFV0lEVEhfNjQgICAoSFJUSU1fQ0hQUl9TVFJQV18xIHwgSFJUSU1fQ0hQUl9TVFJQV18wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCB0U1RQVyA9IHRIUlRJTSB4IDY0ICAqLworI2RlZmluZSBMTF9IUlRJTV9DSFBfUFVMU0VXSURUSF84MCAgIChIUlRJTV9DSFBSX1NUUlBXXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHRTVFBXID0gdEhSVElNIHggODAgICovCisjZGVmaW5lIExMX0hSVElNX0NIUF9QVUxTRVdJRFRIXzk2ICAgKEhSVElNX0NIUFJfU1RSUFdfMiB8IEhSVElNX0NIUFJfU1RSUFdfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgdFNUUFcgPSB0SFJUSU0geCA5NiAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0hQX1BVTFNFV0lEVEhfMTEyICAoSFJUSU1fQ0hQUl9TVFJQV18yIHwgSFJUSU1fQ0hQUl9TVFJQV18xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCB0U1RQVyA9IHRIUlRJTSB4IDExMiAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0hQX1BVTFNFV0lEVEhfMTI4ICAoSFJUSU1fQ0hQUl9TVFJQV18yIHwgSFJUSU1fQ0hQUl9TVFJQV18xIHwgSFJUSU1fQ0hQUl9TVFJQV18wKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCB0U1RQVyA9IHRIUlRJTSB4IDEyOCAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0hQX1BVTFNFV0lEVEhfMTQ0ICAoSFJUSU1fQ0hQUl9TVFJQV18zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCB0U1RQVyA9IHRIUlRJTSB4IDE0NCAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0hQX1BVTFNFV0lEVEhfMTYwICAoSFJUSU1fQ0hQUl9TVFJQV18zIHwgSFJUSU1fQ0hQUl9TVFJQV18wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCB0U1RQVyA9IHRIUlRJTSB4IDE2MCAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0hQX1BVTFNFV0lEVEhfMTc2ICAoSFJUSU1fQ0hQUl9TVFJQV18zIHwgSFJUSU1fQ0hQUl9TVFJQV18xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCB0U1RQVyA9IHRIUlRJTSB4IDE3NiAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0hQX1BVTFNFV0lEVEhfMTkyICAoSFJUSU1fQ0hQUl9TVFJQV18zIHwgSFJUSU1fQ0hQUl9TVFJQV18xIHwgSFJUSU1fQ0hQUl9TVFJQV18wKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCB0U1RQVyA9IHRIUlRJTSB4IDE5MiAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0hQX1BVTFNFV0lEVEhfMjA4ICAoSFJUSU1fQ0hQUl9TVFJQV18zIHwgSFJUSU1fQ0hQUl9TVFJQV18yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCB0U1RQVyA9IHRIUlRJTSB4IDIwOCAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0hQX1BVTFNFV0lEVEhfMjI0ICAoSFJUSU1fQ0hQUl9TVFJQV18zIHwgSFJUSU1fQ0hQUl9TVFJQV18yIHwgSFJUSU1fQ0hQUl9TVFJQV18wKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCB0U1RQVyA9IHRIUlRJTSB4IDIyNCAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0hQX1BVTFNFV0lEVEhfMjQwICAoSFJUSU1fQ0hQUl9TVFJQV18zIHwgSFJUSU1fQ0hQUl9TVFJQV18yIHwgSFJUSU1fQ0hQUl9TVFJQV18xKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCB0U1RQVyA9IHRIUlRJTSB4IDI0MCAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ0hQX1BVTFNFV0lEVEhfMjU2ICAoSFJUSU1fQ0hQUl9TVFJQV18zIHwgSFJUSU1fQ0hQUl9TVFJQV18yIHwgSFJUSU1fQ0hQUl9TVFJQV18xIHwgSFJUSU1fQ0hQUl9TVFJQV18wKSAgLyohPCB0U1RQVyA9IHRIUlRJTSB4IDI1NiAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRUNfQ1JPU1NCQVJfSU5QVVQgQ1JPU1NCQVIgSU5QVVQKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgdGhlIGV2ZW50cyB0aGF0IGNhbiBiZSBzZWxlY3RlZCB0byBjb25maWd1cmUgdGhlIHNldC9yZXNldCBjcm9zc2JhciBvZiBhIHRpbWVyIG91dHB1dC4KKyAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQ1JPU1NCQVJfTk9ORSAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IFJlc2V0IHRoZSBvdXRwdXQgc2V0IGNyb3NzYmFyICovCisjZGVmaW5lIExMX0hSVElNX0NST1NTQkFSX1JFU1lOQyAgICAgKEhSVElNX1NFVDFSX1JFU1lOQykgICAgLyohPCBUaW1lciByZXNldCBldmVudCBjb21pbmcgc29sZWx5IGZyb20gc29mdHdhcmUgb3IgU1lOQyBpbnB1dCBmb3JjZXMgYW4gb3V0cHV0IGxldmVsIHRyYW5zaXNpb24gKi8KKyNkZWZpbmUgTExfSFJUSU1fQ1JPU1NCQVJfVElNUEVSICAgICAoSFJUSU1fU0VUMVJfUEVSKSAgICAgICAvKiE8IFRpbWVyIHBlcmlvZCBldmVudCBmb3JjZXMgYW4gb3V0cHV0IGxldmVsIHRyYW5zaXNpb24gKi8KKyNkZWZpbmUgTExfSFJUSU1fQ1JPU1NCQVJfVElNQ01QMSAgICAoSFJUSU1fU0VUMVJfQ01QMSkgICAgICAvKiE8IFRpbWVyIGNvbXBhcmUgMSBldmVudCBmb3JjZXMgYW4gb3V0cHV0IGxldmVsIHRyYW5zaXNpb24gKi8KKyNkZWZpbmUgTExfSFJUSU1fQ1JPU1NCQVJfVElNQ01QMiAgICAoSFJUSU1fU0VUMVJfQ01QMikgICAgICAvKiE8IFRpbWVyIGNvbXBhcmUgMiBldmVudCBmb3JjZXMgYW4gb3V0cHV0IGxldmVsIHRyYW5zaXNpb24gKi8KKyNkZWZpbmUgTExfSFJUSU1fQ1JPU1NCQVJfVElNQ01QMyAgICAoSFJUSU1fU0VUMVJfQ01QMykgICAgICAvKiE8IFRpbWVyIGNvbXBhcmUgMyBldmVudCBmb3JjZXMgYW4gb3V0cHV0IGxldmVsIHRyYW5zaXNpb24gKi8KKyNkZWZpbmUgTExfSFJUSU1fQ1JPU1NCQVJfVElNQ01QNCAgICAoSFJUSU1fU0VUMVJfQ01QNCkgICAgICAvKiE8IFRpbWVyIGNvbXBhcmUgNCBldmVudCBmb3JjZXMgYW4gb3V0cHV0IGxldmVsIHRyYW5zaXNpb24gKi8KKyNkZWZpbmUgTExfSFJUSU1fQ1JPU1NCQVJfTUFTVEVSUEVSICAoSFJUSU1fU0VUMVJfTVNUUEVSKSAgICAvKiE8IFRoZSBtYXN0ZXIgdGltZXIgcGVyaW9kIGV2ZW50IGZvcmNlcyBhbiBvdXRwdXQgbGV2ZWwgdHJhbnNpc2lvbiAqLworI2RlZmluZSBMTF9IUlRJTV9DUk9TU0JBUl9NQVNURVJDTVAxIChIUlRJTV9TRVQxUl9NU1RDTVAxKSAgIC8qITwgTWFzdGVyIFRpbWVyIGNvbXBhcmUgMSBldmVudCBmb3JjZXMgYW4gb3V0cHV0IGxldmVsIHRyYW5zaXNpb24gKi8KKyNkZWZpbmUgTExfSFJUSU1fQ1JPU1NCQVJfTUFTVEVSQ01QMiAoSFJUSU1fU0VUMVJfTVNUQ01QMikgICAvKiE8IE1hc3RlciBUaW1lciBjb21wYXJlIDIgZXZlbnQgZm9yY2VzIGFuIG91dHB1dCBsZXZlbCB0cmFuc2lzaW9uICovCisjZGVmaW5lIExMX0hSVElNX0NST1NTQkFSX01BU1RFUkNNUDMgKEhSVElNX1NFVDFSX01TVENNUDMpICAgLyohPCBNYXN0ZXIgVGltZXIgY29tcGFyZSAzIGV2ZW50IGZvcmNlcyBhbiBvdXRwdXQgbGV2ZWwgdHJhbnNpc2lvbiAqLworI2RlZmluZSBMTF9IUlRJTV9DUk9TU0JBUl9NQVNURVJDTVA0IChIUlRJTV9TRVQxUl9NU1RDTVA0KSAgIC8qITwgTWFzdGVyIFRpbWVyIGNvbXBhcmUgNCBldmVudCBmb3JjZXMgYW4gb3V0cHV0IGxldmVsIHRyYW5zaXNpb24gKi8KKyNkZWZpbmUgTExfSFJUSU1fQ1JPU1NCQVJfVElNRVZfMSAgICAoSFJUSU1fU0VUMVJfVElNRVZOVDEpICAvKiE8IFRpbWVyIGV2ZW50IDEgZm9yY2VzIGFuIG91dHB1dCBsZXZlbCB0cmFuc2lzaW9uICovCisjZGVmaW5lIExMX0hSVElNX0NST1NTQkFSX1RJTUVWXzIgICAgKEhSVElNX1NFVDFSX1RJTUVWTlQyKSAgLyohPCBUaW1lciBldmVudCAyIGZvcmNlcyBhbiBvdXRwdXQgbGV2ZWwgdHJhbnNpc2lvbiAqLworI2RlZmluZSBMTF9IUlRJTV9DUk9TU0JBUl9USU1FVl8zICAgIChIUlRJTV9TRVQxUl9USU1FVk5UMykgIC8qITwgVGltZXIgZXZlbnQgMyBmb3JjZXMgYW4gb3V0cHV0IGxldmVsIHRyYW5zaXNpb24gKi8KKyNkZWZpbmUgTExfSFJUSU1fQ1JPU1NCQVJfVElNRVZfNCAgICAoSFJUSU1fU0VUMVJfVElNRVZOVDQpICAvKiE8IFRpbWVyIGV2ZW50IDQgZm9yY2VzIGFuIG91dHB1dCBsZXZlbCB0cmFuc2lzaW9uICovCisjZGVmaW5lIExMX0hSVElNX0NST1NTQkFSX1RJTUVWXzUgICAgKEhSVElNX1NFVDFSX1RJTUVWTlQ1KSAgLyohPCBUaW1lciBldmVudCA1IGZvcmNlcyBhbiBvdXRwdXQgbGV2ZWwgdHJhbnNpc2lvbiAqLworI2RlZmluZSBMTF9IUlRJTV9DUk9TU0JBUl9USU1FVl82ICAgIChIUlRJTV9TRVQxUl9USU1FVk5UNikgIC8qITwgVGltZXIgZXZlbnQgNiBmb3JjZXMgYW4gb3V0cHV0IGxldmVsIHRyYW5zaXNpb24gKi8KKyNkZWZpbmUgTExfSFJUSU1fQ1JPU1NCQVJfVElNRVZfNyAgICAoSFJUSU1fU0VUMVJfVElNRVZOVDcpICAvKiE8IFRpbWVyIGV2ZW50IDcgZm9yY2VzIGFuIG91dHB1dCBsZXZlbCB0cmFuc2lzaW9uICovCisjZGVmaW5lIExMX0hSVElNX0NST1NTQkFSX1RJTUVWXzggICAgKEhSVElNX1NFVDFSX1RJTUVWTlQ4KSAgLyohPCBUaW1lciBldmVudCA4IGZvcmNlcyBhbiBvdXRwdXQgbGV2ZWwgdHJhbnNpc2lvbiAqLworI2RlZmluZSBMTF9IUlRJTV9DUk9TU0JBUl9USU1FVl85ICAgIChIUlRJTV9TRVQxUl9USU1FVk5UOSkgIC8qITwgVGltZXIgZXZlbnQgOSBmb3JjZXMgYW4gb3V0cHV0IGxldmVsIHRyYW5zaXNpb24gKi8KKyNkZWZpbmUgTExfSFJUSU1fQ1JPU1NCQVJfRUVWXzEgICAgICAoSFJUSU1fU0VUMVJfRVhUVk5UMSkgICAvKiE8IEV4dGVybmFsIGV2ZW50IDEgZm9yY2VzIGFuIG91dHB1dCBsZXZlbCB0cmFuc2lzaW9uICovCisjZGVmaW5lIExMX0hSVElNX0NST1NTQkFSX0VFVl8yICAgICAgKEhSVElNX1NFVDFSX0VYVFZOVDIpICAgLyohPCBFeHRlcm5hbCBldmVudCAyIGZvcmNlcyBhbiBvdXRwdXQgbGV2ZWwgdHJhbnNpc2lvbiAqLworI2RlZmluZSBMTF9IUlRJTV9DUk9TU0JBUl9FRVZfMyAgICAgIChIUlRJTV9TRVQxUl9FWFRWTlQzKSAgIC8qITwgRXh0ZXJuYWwgZXZlbnQgMyBmb3JjZXMgYW4gb3V0cHV0IGxldmVsIHRyYW5zaXNpb24gKi8KKyNkZWZpbmUgTExfSFJUSU1fQ1JPU1NCQVJfRUVWXzQgICAgICAoSFJUSU1fU0VUMVJfRVhUVk5UNCkgICAvKiE8IEV4dGVybmFsIGV2ZW50IDQgZm9yY2VzIGFuIG91dHB1dCBsZXZlbCB0cmFuc2lzaW9uICovCisjZGVmaW5lIExMX0hSVElNX0NST1NTQkFSX0VFVl81ICAgICAgKEhSVElNX1NFVDFSX0VYVFZOVDUpICAgLyohPCBFeHRlcm5hbCBldmVudCA1IGZvcmNlcyBhbiBvdXRwdXQgbGV2ZWwgdHJhbnNpc2lvbiAqLworI2RlZmluZSBMTF9IUlRJTV9DUk9TU0JBUl9FRVZfNiAgICAgIChIUlRJTV9TRVQxUl9FWFRWTlQ2KSAgIC8qITwgRXh0ZXJuYWwgZXZlbnQgNiBmb3JjZXMgYW4gb3V0cHV0IGxldmVsIHRyYW5zaXNpb24gKi8KKyNkZWZpbmUgTExfSFJUSU1fQ1JPU1NCQVJfRUVWXzcgICAgICAoSFJUSU1fU0VUMVJfRVhUVk5UNykgICAvKiE8IEV4dGVybmFsIGV2ZW50IDcgZm9yY2VzIGFuIG91dHB1dCBsZXZlbCB0cmFuc2lzaW9uICovCisjZGVmaW5lIExMX0hSVElNX0NST1NTQkFSX0VFVl84ICAgICAgKEhSVElNX1NFVDFSX0VYVFZOVDgpICAgLyohPCBFeHRlcm5hbCBldmVudCA4IGZvcmNlcyBhbiBvdXRwdXQgbGV2ZWwgdHJhbnNpc2lvbiAqLworI2RlZmluZSBMTF9IUlRJTV9DUk9TU0JBUl9FRVZfOSAgICAgIChIUlRJTV9TRVQxUl9FWFRWTlQ5KSAgIC8qITwgRXh0ZXJuYWwgZXZlbnQgOSBmb3JjZXMgYW4gb3V0cHV0IGxldmVsIHRyYW5zaXNpb24gKi8KKyNkZWZpbmUgTExfSFJUSU1fQ1JPU1NCQVJfRUVWXzEwICAgICAoSFJUSU1fU0VUMVJfRVhUVk5UMTApICAvKiE8IEV4dGVybmFsIGV2ZW50IDEwIGZvcmNlcyBhbiBvdXRwdXQgbGV2ZWwgdHJhbnNpc2lvbiAqLworI2RlZmluZSBMTF9IUlRJTV9DUk9TU0JBUl9VUERBVEUgICAgIChIUlRJTV9TRVQxUl9VUERBVEUpICAgIC8qITwgVGltZXIgcmVnaXN0ZXIgdXBkYXRlIGV2ZW50IGZvcmNlcyBhbiBvdXRwdXQgbGV2ZWwgdHJhbnNpc2lvbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9FQ19PVVRfUE9MQVJJVFkgT1VQVVRfUE9MQVJJVFkKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgdGhlIHBvbGFyaXR5IG9mIGEgdGltZXIgb3V0cHV0LgorICAqLworI2RlZmluZSBMTF9IUlRJTV9PVVRfUE9TSVRJVkVfUE9MQVJJVFkgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBPdXRwdXQgaXMgYWNpdHZlIEhJR0ggKi8KKyNkZWZpbmUgTExfSFJUSU1fT1VUX05FR0FUSVZFX1BPTEFSSVRZICAgICAoSFJUSU1fT1VUUl9QT0wxKSAgICAgICAvKiE8IE91dHB1dCBpcyBhY3RpdmUgTE9XICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0VDX09VVF9JRExFTU9ERSBPVVRQVVQgSURMRSBNT0RFCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHdoZXRoZXIgb3Igbm90IHRoZSB0aW1lciBvdXRwdXQgdHJhbnNpdGlvbiB0byBpdHMgSURMRSBzdGF0ZSB3aGVuIGJ1cnN0IG1vZGUgaXMgZW50ZXJlZC4KKyAgKi8KKyNkZWZpbmUgTExfSFJUSU1fT1VUX05PX0lETEUgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkvKiE8IFRoZSBvdXRwdXQgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSBidXJzdCBtb2RlIG9wZXJhdGlvbiAqLworI2RlZmluZSBMTF9IUlRJTV9PVVRfSURMRV9XSEVOX0JVUlNUICAgICAoSFJUSU1fT1VUUl9JRExNMSkgICAgIC8qITwgVGhlIG91dHB1dCBpcyBpbiBpZGxlIHN0YXRlIHdoZW4gcmVxdWVzdGVkIGJ5IHRoZSBidXJzdCBtb2RlIGNvbnRyb2xsZXIgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0VDX09VVF9JRExFTEVWRUwgT1VUUFVUIElETEUgTEVWRUwKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgdGhlIG91dHB1dCBsZXZlbCB3aGVuIG91dHB1dCBpcyBpbiBJRExFIHN0YXRlCisgICovCisjZGVmaW5lIExMX0hSVElNX09VVF9JRExFTEVWRUxfSU5BQ1RJVkUgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKS8qITwgT3V0cHV0IGF0IGluYWN0aXZlIGxldmVsIHdoZW4gaW4gSURMRSBzdGF0ZSAqLworI2RlZmluZSBMTF9IUlRJTV9PVVRfSURMRUxFVkVMX0FDVElWRSAgICAgKEhSVElNX09VVFJfSURMRVMxKSAgIC8qITwgT3V0cHV0IGF0IGFjdGl2ZSBsZXZlbCB3aGVuIGluIElETEUgc3RhdGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRUNfT1VUX0ZBVUxUU1RBVEUgT1VUUFVUIEZBVUxUIFNUQVRFCisgKiBAeworICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB0aGUgb3V0cHV0IGxldmVsIHdoZW4gb3V0cHV0IGlzIGluIEZBVUxUIHN0YXRlLgorICovCisjZGVmaW5lIExMX0hSVElNX09VVF9GQVVMVFNUQVRFX05PX0FDVElPTiAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBvdXRwdXQgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSBmYXVsdCBpbnB1dCAqLworI2RlZmluZSBMTF9IUlRJTV9PVVRfRkFVTFRTVEFURV9BQ1RJVkUgICAgKEhSVElNX09VVFJfRkFVTFQxXzApICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPdXRwdXQgYXQgYWN0aXZlIGxldmVsIHdoZW4gaW4gRkFVTFQgc3RhdGUgKi8KKyNkZWZpbmUgTExfSFJUSU1fT1VUX0ZBVUxUU1RBVEVfSU5BQ1RJVkUgIChIUlRJTV9PVVRSX0ZBVUxUMV8xKSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT3V0cHV0IGF0IGluYWN0aXZlIGxldmVsIHdoZW4gaW4gRkFVTFQgc3RhdGUgKi8KKyNkZWZpbmUgTExfSFJUSU1fT1VUX0ZBVUxUU1RBVEVfSElHSFogICAgIChIUlRJTV9PVVRSX0ZBVUxUMV8xIHwgSFJUSU1fT1VUUl9GQVVMVDFfMCkgIC8qITwgT3V0cHV0IGlzIHRyaS1zdGF0ZWQgd2hlbiBpbiBGQVVMVCBzdGF0ZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9FQ19PVVRfQ0hPUFBFUk1PREUgT1VUUFVUIENIT1BQRVIgTU9ERQorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB3aGV0aGVyIG9yIG5vdCBjaG9wcGVyIG1vZGUgaXMgZW5hYmxlZCBmb3IgYSB0aW1lciBvdXRwdXQuCisgICovCisjZGVmaW5lIExMX0hSVElNX09VVF9DSE9QUEVSTU9ERV9ESVNBQkxFRCAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpIC8qITwgT3V0cHV0IHNpZ25hbCBpcyBub3QgYWx0ZXJlZCAgKi8KKyNkZWZpbmUgTExfSFJUSU1fT1VUX0NIT1BQRVJNT0RFX0VOQUJMRUQgICAgKEhSVElNX09VVFJfQ0hQMSkgICAgICAgLyohPCBPdXRwdXQgc2lnbmFsIGlzIGNob3BwZWQgYnkgYSBjYXJyaWVyIHNpZ25hbCAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRUNfT1VUX0JNX0VOVFJZTU9ERSBPVVRQVVQgQlVSU1QgTU9ERSBFTlRSWSBNT0RFCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRoZSBpZGxlIHN0YXRlIGVudHJ5IG1vZGUgZHVyaW5nIGEgYnVyc3QgbW9kZSBvcGVyYXRpb24uIEl0IGlzIHBvc3NpYmxlIHRvIGRlbGF5IHRoZSBidXJzdCBtb2RlIGVudHJ5IGFuZCBmb3JjZSB0aGUgb3V0cHV0IHRvIGFuIGluYWN0aXZlIHN0YXRlCitkdXJpbmcgYSBwcm9ncmFtbWFibGUgcGVyaW9kIGJlZm9yZSB0aGUgb3V0cHV0IHRha2VzIGl0cyBpZGxlIHN0YXRlLgorICAqLworI2RlZmluZSBMTF9IUlRJTV9PVVRfQk1fRU5UUllNT0RFX1JFR1VMQVIgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKS8qITwgVGhlIHByb2dyYW1tZWQgSWRsZSBzdGF0ZSBpcyBhcHBsaWVkIGltbWVkaWF0ZWx5IHRvIHRoZSBPdXRwdXQgKi8KKyNkZWZpbmUgTExfSFJUSU1fT1VUX0JNX0VOVFJZTU9ERV9ERUxBWUVEICAgKEhSVElNX09VVFJfRElETDEpICAgICAvKiE8IERlYWR0aW1lIGlzIGluc2VydGVkIG9uIG91dHB1dCBiZWZvcmUgZW50ZXJpbmcgdGhlIGlkbGUgbW9kZSAqLworLyoqCisgICogQH0KKyAgKi8KKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRUNfT1VUX0xFVkVMIE9VVFBVVCBMRVZFTAorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB0aGUgbGV2ZWwgb2YgYSB0aW1lciBvdXRwdXQuCisgICovCisjZGVmaW5lIExMX0hSVElNX09VVF9MRVZFTF9JTkFDVElWRSAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpLyohPCBDb3JyZXNwb25kcyB0byBhIGxvZ2ljIGxldmVsIDAgZm9yIGEgcG9zaXRpdmUgcG9sYXJpdHkgKEhpZ2gpIGFuZCB0byBhIGxvZ2ljIGxldmVsIDEgZm9yIGEgbmVnYXRpdmUgcG9sYXJpdHkgKExvdykgKi8KKyNkZWZpbmUgTExfSFJUSU1fT1VUX0xFVkVMX0FDVElWRSAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxKSAvKiE8IENvcnJlc3BvbmRzIHRvIGEgbG9naWMgbGV2ZWwgMSBmb3IgYSBwb3NpdGl2ZSBwb2xhcml0eSAoSGlnaCkgYW5kIHRvIGEgbG9naWMgbGV2ZWwgMCBmb3IgYSBuZWdhdGl2ZSBwb2xhcml0eSAoTG93KSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9FQ19FRV9TUkMgRVhURVJOQUwgRVZFTlQgU09VUkNFCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIGF2YWlsYWJsZSBzb3VyY2VzIGFzc29jaWF0ZWQgdG8gZXh0ZXJuYWwgZXZlbnRzLgorICAqLworI2RlZmluZSBMTF9IUlRJTV9FRV9TUkNfMSAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFeHRlcm5hbCBldmVudCBzb3VyY2UgMSAoRUV4U3JjMSkqLworI2RlZmluZSBMTF9IUlRJTV9FRV9TUkNfMiAgICAgICAgIChIUlRJTV9FRUNSMV9FRTFTUkNfMCkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFeHRlcm5hbCBldmVudCBzb3VyY2UgMiAoRUV4U3JjMikgKi8KKyNkZWZpbmUgTExfSFJUSU1fRUVfU1JDXzMgICAgICAgICAoSFJUSU1fRUVDUjFfRUUxU1JDXzEpICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRXh0ZXJuYWwgZXZlbnQgc291cmNlIDMgKEVFeFNyYzMpICovCisjZGVmaW5lIExMX0hSVElNX0VFX1NSQ180ICAgICAgICAgKEhSVElNX0VFQ1IxX0VFMVNSQ18xIHwgSFJUSU1fRUVDUjFfRUUxU1JDXzApICAvKiE8IEV4dGVybmFsIGV2ZW50IHNvdXJjZSA0IChFRXhTcmM0KSAqLworLyoqCisgICogQH0KKyAgKi8KKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRUNfRUVfUE9MQVJJVFkgRVhURVJOQUwgRVZFTlQgUE9MQVJJVFkKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgdGhlIHBvbGFyaXR5IG9mIGFuIGV4dGVybmFsIGV2ZW50LgorICAqLworI2RlZmluZSBMTF9IUlRJTV9FRV9QT0xBUklUWV9ISUdIICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpIC8qITwgRXh0ZXJuYWwgZXZlbnQgaXMgYWN0aXZlIGhpZ2ggKi8KKyNkZWZpbmUgTExfSFJUSU1fRUVfUE9MQVJJVFlfTE9XICAgICAoSFJUSU1fRUVDUjFfRUUxUE9MKSAgICAvKiE8IEV4dGVybmFsIGV2ZW50IGlzIGFjdGl2ZSBsb3cgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRUNfRUVfU0VOU0lUSVZJVFkgRVhURVJOQUwgRVZFTlQgU0VOU0lUSVZJVFkKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgdGhlIHNlbnNpdGl2aXR5IChsZXZlbC1zZW5zaXRpdmUgb3IgZWRnZS1zZW5zaXRpdmUpIG9mIGFuIGV4dGVybmFsIGV2ZW50LgorICAqLworI2RlZmluZSBMTF9IUlRJTV9FRV9TRU5TSVRJVklUWV9MRVZFTCAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRXh0ZXJuYWwgZXZlbnQgaXMgYWN0aXZlIG9uIGxldmVsICovCisjZGVmaW5lIExMX0hSVElNX0VFX1NFTlNJVElWSVRZX1JJU0lOR0VER0UgICAgIChIUlRJTV9FRUNSMV9FRTFTTlNfMCkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFeHRlcm5hbCBldmVudCBpcyBhY3RpdmUgb24gUmlzaW5nIGVkZ2UgKi8KKyNkZWZpbmUgTExfSFJUSU1fRUVfU0VOU0lUSVZJVFlfRkFMTElOR0VER0UgICAgKEhSVElNX0VFQ1IxX0VFMVNOU18xKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEV4dGVybmFsIGV2ZW50IGlzIGFjdGl2ZSBvbiBGYWxsaW5nIGVkZ2UgKi8KKyNkZWZpbmUgTExfSFJUSU1fRUVfU0VOU0lUSVZJVFlfQk9USEVER0VTICAgICAgKEhSVElNX0VFQ1IxX0VFMVNOU18xIHwgSFJUSU1fRUVDUjFfRUUxU05TXzApICAvKiE8IEV4dGVybmFsIGV2ZW50IGlzIGFjdGl2ZSBvbiBSaXNpbmcgYW5kIEZhbGxpbmcgZWRnZXMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRUNfRUVfRkFTVE1PREUgRVhURVJOQUwgRVZFTlQgRkFTVCBNT0RFCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHdoZXRoZXIgb3Igbm90IGFuIGV4dGVybmFsIGV2ZW50IGlzIHByb2dyYW1tZWQgaW4gZmFzdCBtb2RlLgorICAqLworI2RlZmluZSBMTF9IUlRJTV9FRV9GQVNUTU9ERV9ESVNBQkxFICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgIC8qITwgRXh0ZXJuYWwgRXZlbnQgaXMgcmUtc3luY2hyb25pemVkIGJ5IHRoZSBIUlRJTSBsb2dpYyBiZWZvcmUgYWN0aW5nIG9uIG91dHB1dHMgKi8KKyNkZWZpbmUgTExfSFJUSU1fRUVfRkFTVE1PREVfRU5BQkxFICAgICAgICAgIChIUlRJTV9FRUNSMV9FRTFGQVNUKSAgICAvKiE8IEV4dGVybmFsIEV2ZW50IGlzIGFjdGluZyBhc3luY2hyb25vdXNseSBvbiBvdXRwdXRzIChsb3cgbGF0ZW5jeSBtb2RlKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9FQ19FRV9GSUxURVIgRVhURVJOQUwgRVZFTlQgRElHSVRBTCBGSUxURVIKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgdGhlIGZyZXF1ZW5jeSB1c2VkIHRvIHNhbXBsZSBhbiBleHRlcm5hbCBldmVudCBpbnB1dCAoZlNBTVBMSU5HKSBhbmQgdGhlIGxlbmd0aCAoTikgb2YgdGhlIGRpZ2l0YWwgZmlsdGVyIGFwcGxpZWQuCisgICovCisjZGVmaW5lIExMX0hSVElNX0VFX0ZJTFRFUl9OT05FICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEZpbHRlciBkaXNhYmxlZCAqLworI2RlZmluZSBMTF9IUlRJTV9FRV9GSUxURVJfMSAgICAgICAgIChIUlRJTV9FRUNSM19FRTZGXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkcgPSBmSFJUSU0sIE49MiAqLworI2RlZmluZSBMTF9IUlRJTV9FRV9GSUxURVJfMiAgICAgICAgIChIUlRJTV9FRUNSM19FRTZGXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkcgPSBmSFJUSU0sIE49NCAqLworI2RlZmluZSBMTF9IUlRJTV9FRV9GSUxURVJfMyAgICAgICAgIChIUlRJTV9FRUNSM19FRTZGXzEgfCBIUlRJTV9FRUNSM19FRTZGXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkcgPSBmSFJUSU0sIE49OCAqLworI2RlZmluZSBMTF9IUlRJTV9FRV9GSUxURVJfNCAgICAgICAgIChIUlRJTV9FRUNSM19FRTZGXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkcgPSBmRUVWUy8yLCBOPTYgKi8KKyNkZWZpbmUgTExfSFJUSU1fRUVfRklMVEVSXzUgICAgICAgICAoSFJUSU1fRUVDUjNfRUU2Rl8yIHwgSFJUSU1fRUVDUjNfRUU2Rl8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HID0gZkVFVlMvMiwgTj04ICovCisjZGVmaW5lIExMX0hSVElNX0VFX0ZJTFRFUl82ICAgICAgICAgKEhSVElNX0VFQ1IzX0VFNkZfMiB8IEhSVElNX0VFQ1IzX0VFNkZfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORyA9IGZFRVZTLzQsIE49NiAqLworI2RlZmluZSBMTF9IUlRJTV9FRV9GSUxURVJfNyAgICAgICAgIChIUlRJTV9FRUNSM19FRTZGXzIgfCBIUlRJTV9FRUNSM19FRTZGXzEgfCBIUlRJTV9FRUNSM19FRTZGXzApICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkcgPSBmRUVWUy80LCBOPTggKi8KKyNkZWZpbmUgTExfSFJUSU1fRUVfRklMVEVSXzggICAgICAgICAoSFJUSU1fRUVDUjNfRUU2Rl8zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HID0gZkVFVlMvOCwgTj02ICovCisjZGVmaW5lIExMX0hSVElNX0VFX0ZJTFRFUl85ICAgICAgICAgKEhSVElNX0VFQ1IzX0VFNkZfMyB8IEhSVElNX0VFQ1IzX0VFNkZfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORyA9IGZFRVZTLzgsIE49OCAqLworI2RlZmluZSBMTF9IUlRJTV9FRV9GSUxURVJfMTAgICAgICAgIChIUlRJTV9FRUNSM19FRTZGXzMgfCBIUlRJTV9FRUNSM19FRTZGXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkcgPSBmRUVWUy8xNiwgTj01ICovCisjZGVmaW5lIExMX0hSVElNX0VFX0ZJTFRFUl8xMSAgICAgICAgKEhSVElNX0VFQ1IzX0VFNkZfMyB8IEhSVElNX0VFQ1IzX0VFNkZfMSB8IEhSVElNX0VFQ1IzX0VFNkZfMCkgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORyA9IGZFRVZTLzE2LCBOPTYgKi8KKyNkZWZpbmUgTExfSFJUSU1fRUVfRklMVEVSXzEyICAgICAgICAoSFJUSU1fRUVDUjNfRUU2Rl8zIHwgSFJUSU1fRUVDUjNfRUU2Rl8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HID0gZkVFVlMvMTYsIE49OCAqLworI2RlZmluZSBMTF9IUlRJTV9FRV9GSUxURVJfMTMgICAgICAgIChIUlRJTV9FRUNSM19FRTZGXzMgfCBIUlRJTV9FRUNSM19FRTZGXzIgIHwgSFJUSU1fRUVDUjNfRUU2Rl8wKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkcgPSBmRUVWUy8zMiwgTj01ICovCisjZGVmaW5lIExMX0hSVElNX0VFX0ZJTFRFUl8xNCAgICAgICAgKEhSVElNX0VFQ1IzX0VFNkZfMyB8IEhSVElNX0VFQ1IzX0VFNkZfMiAgfCBIUlRJTV9FRUNSM19FRTZGXzEpICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORyA9IGZFRVZTLzMyLCBOPTYgKi8KKyNkZWZpbmUgTExfSFJUSU1fRUVfRklMVEVSXzE1ICAgICAgICAoSFJUSU1fRUVDUjNfRUU2Rl8zIHwgSFJUSU1fRUVDUjNfRUU2Rl8yICB8IEhSVElNX0VFQ1IzX0VFNkZfMSB8IEhSVElNX0VFQ1IzX0VFNkZfMCkgIC8qITwgZlNBTVBMSU5HID0gZkVFVlMvMzIsIE49OCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9FQ19FRV9QUkVTQ0FMRVIgRVhURVJOQUwgRVZFTlQgUFJFU0NBTEVSCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIGRpdmlzaW9uIHJhdGlvIGJldHdlZW4gdGhlIHRpbWVyIGNsb2NrIGZyZXF1ZW5jeSAoZkhSVElNKSBhbmQgdGhlIGV4dGVybmFsIGV2ZW50IHNpZ25hbCBzYW1wbGluZyBjbG9jayAoZkVFVlMpIHVzZWQgYnkgdGhlIGRpZ2l0YWwgZmlsdGVycy4KKyAgKi8KKyNkZWZpbmUgTExfSFJUSU1fRUVfUFJFU0NBTEVSX0RJVjEgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAvKiE8IGZFRVZTID0gZkhSVElNICovCisjZGVmaW5lIExMX0hSVElNX0VFX1BSRVNDQUxFUl9ESVYyICAgIChIUlRJTV9FRUNSM19FRVZTRF8wKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmRUVWUyA9IGZIUlRJTSAvIDIgKi8KKyNkZWZpbmUgTExfSFJUSU1fRUVfUFJFU0NBTEVSX0RJVjQgICAgKEhSVElNX0VFQ1IzX0VFVlNEXzEpICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZFRVZTID0gZkhSVElNIC8gNCAqLworI2RlZmluZSBMTF9IUlRJTV9FRV9QUkVTQ0FMRVJfRElWOCAgICAoSFJUSU1fRUVDUjNfRUVWU0RfMSB8IEhSVElNX0VFQ1IzX0VFVlNEXzApIC8qITwgZkVFVlMgPSBmSFJUSU0gLyA4ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0VDX0ZMVF9TUkMgRkFVTFQgU09VUkNFCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHdoZXRoZXIgYSBmYXVsdHMgaXMgYmUgdHJpZ2dlcmVkIGJ5IGFueSBleHRlcm5hbCBvciBpbnRlcm5hbCBmYXVsdCBzb3VyY2UuCisgICovCisjZGVmaW5lIExMX0hSVElNX0ZMVF9TUkNfRElHSVRBTElOUFVUICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgLyohPCBGYXVsdCBpbnB1dCBpcyBGTFQgaW5wdXQgcGluICovCisjZGVmaW5lIExMX0hSVElNX0ZMVF9TUkNfSU5URVJOQUwgICAgICAgICAgKEhSVElNX0ZMVElOUjFfRkxUMVNSQykgICAgLyohPCBGYXVsdCBpbnB1dCBpcyBGTFRfSW50IHNpZ25hbCAoZS5nLiBpbnRlcm5hbCBjb21wYXJhdG9yKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9FQ19GTFRfUE9MQVJJVFkgRkFVTFQgUE9MQVJJVFkKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgdGhlIHBvbGFyaXR5IG9mIGEgZmF1bHQgZXZlbnQuCisgICovCisjZGVmaW5lIExMX0hSVElNX0ZMVF9QT0xBUklUWV9MT1cgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAvKiE8IEZhdWx0IGlucHV0IGlzIGFjdGl2ZSBsb3cgKi8KKyNkZWZpbmUgTExfSFJUSU1fRkxUX1BPTEFSSVRZX0hJR0ggICAgKEhSVElNX0ZMVElOUjFfRkxUMVApICAgIC8qITwgRmF1bHQgaW5wdXQgaXMgYWN0aXZlIGhpZ2ggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRUNfRkxUX0ZJTFRFUiBGQVVMVCBESUdJVEFMIEZJTFRFUgorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB0aGUgZnJlcXVlbmN5IHVzZWQgdG8gc2FtcGxlIHRoZSBmYXVsdCBpbnB1dCAoZlNBTVBMSU5HKSBhbmQgdGhlIGxlbmd0aCAoTikgb2YgdGhlIGRpZ2l0YWwgZmlsdGVyIGFwcGxpZWQuCisgICovCisjZGVmaW5lIExMX0hSVElNX0ZMVF9GSUxURVJfTk9ORSAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEZpbHRlciBkaXNhYmxlZCAqLworI2RlZmluZSBMTF9IUlRJTV9GTFRfRklMVEVSXzEgICAgICAgICAoSFJUSU1fRkxUSU5SMV9GTFQxRl8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9IGZIUlRJTSwgTj0yICovCisjZGVmaW5lIExMX0hSVElNX0ZMVF9GSUxURVJfMiAgICAgICAgIChIUlRJTV9GTFRJTlIxX0ZMVDFGXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz0gZkhSVElNLCBOPTQgKi8KKyNkZWZpbmUgTExfSFJUSU1fRkxUX0ZJTFRFUl8zICAgICAgICAgKEhSVElNX0ZMVElOUjFfRkxUMUZfMSB8IEhSVElNX0ZMVElOUjFfRkxUMUZfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPSBmSFJUSU0sIE49OCAqLworI2RlZmluZSBMTF9IUlRJTV9GTFRfRklMVEVSXzQgICAgICAgICAoSFJUSU1fRkxUSU5SMV9GTFQxRl8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9IGZGTFRTLzIsIE49NiAqLworI2RlZmluZSBMTF9IUlRJTV9GTFRfRklMVEVSXzUgICAgICAgICAoSFJUSU1fRkxUSU5SMV9GTFQxRl8yIHwgSFJUSU1fRkxUSU5SMV9GTFQxRl8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9IGZGTFRTLzIsIE49OCAqLworI2RlZmluZSBMTF9IUlRJTV9GTFRfRklMVEVSXzYgICAgICAgICAoSFJUSU1fRkxUSU5SMV9GTFQxRl8yIHwgSFJUSU1fRkxUSU5SMV9GTFQxRl8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9IGZGTFRTLzQsIE49NiAqLworI2RlZmluZSBMTF9IUlRJTV9GTFRfRklMVEVSXzcgICAgICAgICAoSFJUSU1fRkxUSU5SMV9GTFQxRl8yIHwgSFJUSU1fRkxUSU5SMV9GTFQxRl8xIHwgSFJUSU1fRkxUSU5SMV9GTFQxRl8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9IGZGTFRTLzQsIE49OCAqLworI2RlZmluZSBMTF9IUlRJTV9GTFRfRklMVEVSXzggICAgICAgICAoSFJUSU1fRkxUSU5SMV9GTFQxRl8zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9IGZGTFRTLzgsIE49NiAqLworI2RlZmluZSBMTF9IUlRJTV9GTFRfRklMVEVSXzkgICAgICAgICAoSFJUSU1fRkxUSU5SMV9GTFQxRl8zIHwgSFJUSU1fRkxUSU5SMV9GTFQxRl8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9IGZGTFRTLzgsIE49OCAqLworI2RlZmluZSBMTF9IUlRJTV9GTFRfRklMVEVSXzEwICAgICAgICAoSFJUSU1fRkxUSU5SMV9GTFQxRl8zIHwgSFJUSU1fRkxUSU5SMV9GTFQxRl8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9IGZGTFRTLzE2LCBOPTUgKi8KKyNkZWZpbmUgTExfSFJUSU1fRkxUX0ZJTFRFUl8xMSAgICAgICAgKEhSVElNX0ZMVElOUjFfRkxUMUZfMyB8IEhSVElNX0ZMVElOUjFfRkxUMUZfMSB8IEhSVElNX0ZMVElOUjFfRkxUMUZfMCkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPSBmRkxUUy8xNiwgTj02ICovCisjZGVmaW5lIExMX0hSVElNX0ZMVF9GSUxURVJfMTIgICAgICAgIChIUlRJTV9GTFRJTlIxX0ZMVDFGXzMgfCBIUlRJTV9GTFRJTlIxX0ZMVDFGXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz0gZkZMVFMvMTYsIE49OCAqLworI2RlZmluZSBMTF9IUlRJTV9GTFRfRklMVEVSXzEzICAgICAgICAoSFJUSU1fRkxUSU5SMV9GTFQxRl8zIHwgSFJUSU1fRkxUSU5SMV9GTFQxRl8yIHwgSFJUSU1fRkxUSU5SMV9GTFQxRl8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9IGZGTFRTLzMyLCBOPTUgKi8KKyNkZWZpbmUgTExfSFJUSU1fRkxUX0ZJTFRFUl8xNCAgICAgICAgKEhSVElNX0ZMVElOUjFfRkxUMUZfMyB8IEhSVElNX0ZMVElOUjFfRkxUMUZfMiB8IEhSVElNX0ZMVElOUjFfRkxUMUZfMSkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPSBmRkxUUy8zMiwgTj02ICovCisjZGVmaW5lIExMX0hSVElNX0ZMVF9GSUxURVJfMTUgICAgICAgIChIUlRJTV9GTFRJTlIxX0ZMVDFGXzMgfCBIUlRJTV9GTFRJTlIxX0ZMVDFGXzIgfCBIUlRJTV9GTFRJTlIxX0ZMVDFGXzEgfCBIUlRJTV9GTFRJTlIxX0ZMVDFGXzApICAvKiE8IGZTQU1QTElORz0gZkZMVFMvMzIsIE49OCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9FQ19GTFRfUFJFU0NBTEVSIEJVUlNUIEZBVUxUIFBSRVNDQUxFUgorICAqIEB7CisgICogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB0aGUgZGl2aXNpb24gcmF0aW8gYmV0d2VlbiB0aGUgdGltZXIgY2xvY2sgZnJlcXVlbmN5IChmSFJUSU0pIGFuZCB0aGUgZmF1bHQgc2lnbmFsIHNhbXBsaW5nIGNsb2NrIChmRkxUUykgdXNlZCAgYnkgdGhlIGRpZ2l0YWwgZmlsdGVycy4KKyAgKi8KKyNkZWZpbmUgTExfSFJUSU1fRkxUX1BSRVNDQUxFUl9ESVYxICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZkZMVFMgPSBmSFJUSU0gKi8KKyNkZWZpbmUgTExfSFJUSU1fRkxUX1BSRVNDQUxFUl9ESVYyICAgIChIUlRJTV9GTFRJTlIyX0ZMVFNEXzApICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZkZMVFMgPSBmSFJUSU0gLyAyICovCisjZGVmaW5lIExMX0hSVElNX0ZMVF9QUkVTQ0FMRVJfRElWNCAgICAoSFJUSU1fRkxUSU5SMl9GTFRTRF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZGTFRTID0gZkhSVElNIC8gNCAqLworI2RlZmluZSBMTF9IUlRJTV9GTFRfUFJFU0NBTEVSX0RJVjggICAgKEhSVElNX0ZMVElOUjJfRkxUU0RfMSB8IEhSVElNX0ZMVElOUjJfRkxUU0RfMCkgLyohPCBmRkxUUyA9IGZIUlRJTSAvIDggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRUNfQk1fTU9ERSBCVVJTVCBNT0RFIE9QRVJBVElORyBNT0RFCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIGlmIHRoZSBidXJzdCBtb2RlIGlzIGVudGVyZWQgb25jZSBvciBpZiBpdCBpcyBjb250aW51b3VzbHkgb3BlcmF0aW5nLgorICAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9NT0RFX1NJTkdMRVNIT1QgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBCdXJzdCBtb2RlIG9wZXJhdGVzIGluIHNpbmdsZSBzaG90IG1vZGUgKi8KKyNkZWZpbmUgTExfSFJUSU1fQk1fTU9ERV9DT05USU5PVVMgICAoSFJUSU1fQk1DUl9CTU9NKSAgICAgIC8qITwgQnVyc3QgbW9kZSBvcGVyYXRlcyBpbiBjb250aW51b3VzIG1vZGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRUNfQk1fQ0xLU1JDIEJVUlNUIE1PREUgQ0xPQ0sgU09VUkNFCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRoZSBjbG9jayBzb3VyY2UgZm9yIHRoZSBidXJzdCBtb2RlIGNvdW50ZXIuCisgICovCisjZGVmaW5lIExMX0hSVElNX0JNX0NMS1NSQ19NQVNURVIgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1hc3RlciB0aW1lciBjb3VudGVyIHJlc2V0L3JvbGwtb3ZlciBpcyB1c2VkIGFzIGNsb2NrIHNvdXJjZSBmb3IgdGhlIGJ1cnN0IG1vZGUgY291bnRlciAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9DTEtTUkNfVElNRVJfQSAgICAoSFJUSU1fQk1DUl9CTUNMS18wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaW1lciBBIGNvdW50ZXIgcmVzZXQvcm9sbC1vdmVyIGlzIHVzZWQgYXMgY2xvY2sgc291cmNlIGZvciB0aGUgYnVyc3QgbW9kZSBjb3VudGVyICovCisjZGVmaW5lIExMX0hSVElNX0JNX0NMS1NSQ19USU1FUl9CICAgIChIUlRJTV9CTUNSX0JNQ0xLXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWVyIEIgY291bnRlciByZXNldC9yb2xsLW92ZXIgaXMgdXNlZCBhcyBjbG9jayBzb3VyY2UgZm9yIHRoZSBidXJzdCBtb2RlIGNvdW50ZXIgKi8KKyNkZWZpbmUgTExfSFJUSU1fQk1fQ0xLU1JDX1RJTUVSX0MgICAgKEhSVElNX0JNQ1JfQk1DTEtfMSB8IEhSVElNX0JNQ1JfQk1DTEtfMCkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGltZXIgQyBjb3VudGVyIHJlc2V0L3JvbGwtb3ZlciBpcyB1c2VkIGFzIGNsb2NrIHNvdXJjZSBmb3IgdGhlIGJ1cnN0IG1vZGUgY291bnRlciAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9DTEtTUkNfVElNRVJfRCAgICAoSFJUSU1fQk1DUl9CTUNMS18yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaW1lciBEIGNvdW50ZXIgcmVzZXQvcm9sbC1vdmVyIGlzIHVzZWQgYXMgY2xvY2sgc291cmNlIGZvciB0aGUgYnVyc3QgbW9kZSBjb3VudGVyICovCisjZGVmaW5lIExMX0hSVElNX0JNX0NMS1NSQ19USU1FUl9FICAgIChIUlRJTV9CTUNSX0JNQ0xLXzIgfCBIUlRJTV9CTUNSX0JNQ0xLXzApICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWVyIEUgY291bnRlciByZXNldC9yb2xsLW92ZXIgaXMgdXNlZCBhcyBjbG9jayBzb3VyY2UgZm9yIHRoZSBidXJzdCBtb2RlIGNvdW50ZXIgKi8KKyNkZWZpbmUgTExfSFJUSU1fQk1fQ0xLU1JDX1RJTTE2X09DICAgKEhSVElNX0JNQ1JfQk1DTEtfMiB8IEhSVElNX0JNQ1JfQk1DTEtfMSkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT24tY2hpcCBFdmVudCAxIChCTUNsa1sxXSksIGFjdGluZyBhcyBhIGJ1cnN0IG1vZGUgY291bnRlciBjbG9jayAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9DTEtTUkNfVElNMTdfT0MgICAoSFJUSU1fQk1DUl9CTUNMS18yIHwgSFJUSU1fQk1DUl9CTUNMS18xIHwgSFJUSU1fQk1DUl9CTUNMS18wKSAgLyohPCBPbi1jaGlwIEV2ZW50IDIgKEJNQ2xrWzJdKSwgYWN0aW5nIGFzIGEgYnVyc3QgbW9kZSBjb3VudGVyIGNsb2NrICovCisjZGVmaW5lIExMX0hSVElNX0JNX0NMS1NSQ19USU03X1RSR08gIChIUlRJTV9CTUNSX0JNQ0xLXzMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE9uLWNoaXAgRXZlbnQgMyAoQk1DbGtbM10pLCBhY3RpbmcgYXMgYSBidXJzdCBtb2RlIGNvdW50ZXIgY2xvY2sgKi8KKyNkZWZpbmUgTExfSFJUSU1fQk1fQ0xLU1JDX0ZIUlRJTSAgICAgKEhSVElNX0JNQ1JfQk1DTEtfMyB8IEhSVElNX0JNQ1JfQk1DTEtfMSkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUHJlc2NhbGVkIGZIUlRJTSBjbG9jayBpcyB1c2VkIGFzIGNsb2NrIHNvdXJjZSBmb3IgdGhlIGJ1cnN0IG1vZGUgY291bnRlciAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9FQ19CTV9QUkVTQ0FMRVIgQlVSU1QgTU9ERSBQUkVTQ0FMRVIKKyAgKiBAeworICAqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgdGhlIHByZXNjYWxpbmcgcmF0aW8gb2YgdGhlIGZIUlRJTSBjbG9jayBmb3IgdGhlIGJ1cnN0IG1vZGUgY29udHJvbGxlciAoZkJSU1QpLgorICAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9QUkVTQ0FMRVJfRElWMSAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZkJSU1QgPSBmSFJUSU0gKi8KKyNkZWZpbmUgTExfSFJUSU1fQk1fUFJFU0NBTEVSX0RJVjIgICAgIChIUlRJTV9CTUNSX0JNUFJTQ18wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZCUlNUID0gZkhSVElNLzIgKi8KKyNkZWZpbmUgTExfSFJUSU1fQk1fUFJFU0NBTEVSX0RJVjQgICAgIChIUlRJTV9CTUNSX0JNUFJTQ18xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZCUlNUID0gZkhSVElNLzQgKi8KKyNkZWZpbmUgTExfSFJUSU1fQk1fUFJFU0NBTEVSX0RJVjggICAgIChIUlRJTV9CTUNSX0JNUFJTQ18xIHwgSFJUSU1fQk1DUl9CTVBSU0NfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZCUlNUID0gZkhSVElNLzggKi8KKyNkZWZpbmUgTExfSFJUSU1fQk1fUFJFU0NBTEVSX0RJVjE2ICAgIChIUlRJTV9CTUNSX0JNUFJTQ18yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZCUlNUID0gZkhSVElNLzE2ICovCisjZGVmaW5lIExMX0hSVElNX0JNX1BSRVNDQUxFUl9ESVYzMiAgICAoSFJUSU1fQk1DUl9CTVBSU0NfMiB8IEhSVElNX0JNQ1JfQk1QUlNDXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmQlJTVCA9IGZIUlRJTS8zMiAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9QUkVTQ0FMRVJfRElWNjQgICAgKEhSVElNX0JNQ1JfQk1QUlNDXzIgfCBIUlRJTV9CTUNSX0JNUFJTQ18xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZkJSU1QgPSBmSFJUSU0vNjQgKi8KKyNkZWZpbmUgTExfSFJUSU1fQk1fUFJFU0NBTEVSX0RJVjEyOCAgIChIUlRJTV9CTUNSX0JNUFJTQ18yIHwgSFJUSU1fQk1DUl9CTVBSU0NfMSB8IEhSVElNX0JNQ1JfQk1QUlNDXzApICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZCUlNUID0gZkhSVElNLzEyOCAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9QUkVTQ0FMRVJfRElWMjU2ICAgKEhSVElNX0JNQ1JfQk1QUlNDXzMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZkJSU1QgPSBmSFJUSU0vMjU2ICovCisjZGVmaW5lIExMX0hSVElNX0JNX1BSRVNDQUxFUl9ESVY1MTIgICAoSFJUSU1fQk1DUl9CTVBSU0NfMyB8IEhSVElNX0JNQ1JfQk1QUlNDXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmQlJTVCA9IGZIUlRJTS81MTIgKi8KKyNkZWZpbmUgTExfSFJUSU1fQk1fUFJFU0NBTEVSX0RJVjEwMjQgIChIUlRJTV9CTUNSX0JNUFJTQ18zIHwgSFJUSU1fQk1DUl9CTVBSU0NfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZCUlNUID0gZkhSVElNLzEwMjQgKi8KKyNkZWZpbmUgTExfSFJUSU1fQk1fUFJFU0NBTEVSX0RJVjIwNDggIChIUlRJTV9CTUNSX0JNUFJTQ18zIHwgSFJUSU1fQk1DUl9CTVBSU0NfMSB8IEhSVElNX0JNQ1JfQk1QUlNDXzApICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZCUlNUID0gZkhSVElNLzIwNDgqLworI2RlZmluZSBMTF9IUlRJTV9CTV9QUkVTQ0FMRVJfRElWNDA5NiAgKEhSVElNX0JNQ1JfQk1QUlNDXzMgfCBIUlRJTV9CTUNSX0JNUFJTQ18yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZkJSU1QgPSBmSFJUSU0vNDA5NiAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9QUkVTQ0FMRVJfRElWODE5MiAgKEhSVElNX0JNQ1JfQk1QUlNDXzMgfCBIUlRJTV9CTUNSX0JNUFJTQ18yIHwgSFJUSU1fQk1DUl9CTVBSU0NfMCkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZkJSU1QgPSBmSFJUSU0vODE5MiAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9QUkVTQ0FMRVJfRElWMTYzODQgKEhSVElNX0JNQ1JfQk1QUlNDXzMgfCBIUlRJTV9CTUNSX0JNUFJTQ18yIHwgSFJUSU1fQk1DUl9CTVBSU0NfMSkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZkJSU1QgPSBmSFJUSU0vMTYzODQgKi8KKyNkZWZpbmUgTExfSFJUSU1fQk1fUFJFU0NBTEVSX0RJVjMyNzY4IChIUlRJTV9CTUNSX0JNUFJTQ18zIHwgSFJUSU1fQk1DUl9CTVBSU0NfMiB8IEhSVElNX0JNQ1JfQk1QUlNDXzEgfCBIUlRJTV9CTUNSX0JNUFJTQ18wKSAvKiE8IGZCUlNUID0gZkhSVElNLzMyNzY4ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0VDX0JNX1RSSUcgSFJUSU0gQlVSU1QgTU9ERSBUUklHR0VSCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRoZSBldmVudHMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmlnIHRoZSBidXJzdCBtb2RlIG9wZXJhdGlvbi4KKyAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQk1fVFJJR19OT05FICAgICAgICAgICAgICAgKHVpbnQzMl90KTB4MDAwMDAwMDAgICAgLyohPCAgTm8gdHJpZ2dlciAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9UUklHX01BU1RFUl9SRVNFVCAgICAgICAoSFJUSU1fQk1UUkdSX01TVFJTVCkgICAvKiE8ICBNYXN0ZXIgdGltZXIgcmVzZXQgZXZlbnQgaXMgc3RhcnRpbmcgdGhlIGJ1cnN0IG1vZGUgb3BlcmF0aW9uICovCisjZGVmaW5lIExMX0hSVElNX0JNX1RSSUdfTUFTVEVSX1JFUEVUSVRJT04gIChIUlRJTV9CTVRSR1JfTVNUUkVQKSAgIC8qITwgIE1hc3RlciB0aW1lciByZXBldGl0aW9uIGV2ZW50IGlzIHN0YXJ0aW5nIHRoZSBidXJzdCBtb2RlIG9wZXJhdGlvbiAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9UUklHX01BU1RFUl9DTVAxICAgICAgICAoSFJUSU1fQk1UUkdSX01TVENNUDEpICAvKiE8ICBNYXN0ZXIgdGltZXIgY29tcGFyZSAxIGV2ZW50IGlzIHN0YXJ0aW5nIHRoZSBidXJzdCBtb2RlIG9wZXJhdGlvbiAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9UUklHX01BU1RFUl9DTVAyICAgICAgICAoSFJUSU1fQk1UUkdSX01TVENNUDIpICAvKiE8ICBNYXN0ZXIgdGltZXIgY29tcGFyZSAyIGV2ZW50IGlzIHN0YXJ0aW5nIHRoZSBidXJzdCBtb2RlIG9wZXJhdGlvbiAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9UUklHX01BU1RFUl9DTVAzICAgICAgICAoSFJUSU1fQk1UUkdSX01TVENNUDMpICAvKiE8ICBNYXN0ZXIgdGltZXIgY29tcGFyZSAzIGV2ZW50IGlzIHN0YXJ0aW5nIHRoZSBidXJzdCBtb2RlIG9wZXJhdGlvbiAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9UUklHX01BU1RFUl9DTVA0ICAgICAgICAoSFJUSU1fQk1UUkdSX01TVENNUDQpICAvKiE8ICBNYXN0ZXIgdGltZXIgY29tcGFyZSA0IGV2ZW50IGlzIHN0YXJ0aW5nIHRoZSBidXJzdCBtb2RlIG9wZXJhdGlvbiAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9UUklHX1RJTUFfUkVTRVQgICAgICAgICAoSFJUSU1fQk1UUkdSX1RBUlNUKSAgICAvKiE8IFRpbWVyIEEgcmVzZXQgZXZlbnQgaXMgc3RhcnRpbmcgdGhlIGJ1cnN0IG1vZGUgb3BlcmF0aW9uICovCisjZGVmaW5lIExMX0hSVElNX0JNX1RSSUdfVElNQV9SRVBFVElUSU9OICAgIChIUlRJTV9CTVRSR1JfVEFSRVApICAgIC8qITwgVGltZXIgQSByZXBldGl0aW9uIGV2ZW50IGlzIHN0YXJ0aW5nIHRoZSBidXJzdCBtb2RlIG9wZXJhdGlvbiAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9UUklHX1RJTUFfQ01QMSAgICAgICAgICAoSFJUSU1fQk1UUkdSX1RBQ01QMSkgICAvKiE8IFRpbWVyIEEgY29tcGFyZSAxIGV2ZW50IGlzIHN0YXJ0aW5nIHRoZSBidXJzdCBtb2RlIG9wZXJhdGlvbiAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9UUklHX1RJTUFfQ01QMiAgICAgICAgICAoSFJUSU1fQk1UUkdSX1RBQ01QMikgICAvKiE8IFRpbWVyIEEgY29tcGFyZSAyIGV2ZW50IGlzIHN0YXJ0aW5nIHRoZSBidXJzdCBtb2RlIG9wZXJhdGlvbiAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9UUklHX1RJTUJfUkVTRVQgICAgICAgICAoSFJUSU1fQk1UUkdSX1RCUlNUKSAgICAvKiE8IFRpbWVyIEIgcmVzZXQgZXZlbnQgaXMgc3RhcnRpbmcgdGhlIGJ1cnN0IG1vZGUgb3BlcmF0aW9uICovCisjZGVmaW5lIExMX0hSVElNX0JNX1RSSUdfVElNQl9SRVBFVElUSU9OICAgIChIUlRJTV9CTVRSR1JfVEJSRVApICAgIC8qITwgVGltZXIgQiByZXBldGl0aW9uIGV2ZW50IGlzIHN0YXJ0aW5nIHRoZSBidXJzdCBtb2RlIG9wZXJhdGlvbiAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9UUklHX1RJTUJfQ01QMSAgICAgICAgICAoSFJUSU1fQk1UUkdSX1RCQ01QMSkgICAvKiE8IFRpbWVyIEIgY29tcGFyZSAxIGV2ZW50IGlzIHN0YXJ0aW5nIHRoZSBidXJzdCBtb2RlIG9wZXJhdGlvbiAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9UUklHX1RJTUJfQ01QMiAgICAgICAgICAoSFJUSU1fQk1UUkdSX1RCQ01QMikgICAvKiE8IFRpbWVyIEIgY29tcGFyZSAyIGV2ZW50IGlzIHN0YXJ0aW5nIHRoZSBidXJzdCBtb2RlIG9wZXJhdGlvbiAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9UUklHX1RJTUNfUkVTRVQgICAgICAgICAoSFJUSU1fQk1UUkdSX1RDUlNUKSAgICAvKiE8IFRpbWVyIEMgcmVzZXRldmVudCBpcyBzdGFydGluZyB0aGUgYnVyc3QgbW9kZSBvcGVyYXRpb24gICovCisjZGVmaW5lIExMX0hSVElNX0JNX1RSSUdfVElNQ19SRVBFVElUSU9OICAgIChIUlRJTV9CTVRSR1JfVENSRVApICAgIC8qITwgVGltZXIgQyByZXBldGl0aW9uIGV2ZW50IGlzIHN0YXJ0aW5nIHRoZSBidXJzdCBtb2RlIG9wZXJhdGlvbiAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9UUklHX1RJTUNfQ01QMSAgICAgICAgICAoSFJUSU1fQk1UUkdSX1RDQ01QMSkgICAvKiE8IFRpbWVyIEMgY29tcGFyZSAxIGV2ZW50IGlzIHN0YXJ0aW5nIHRoZSBidXJzdCBtb2RlIG9wZXJhdGlvbiAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9UUklHX1RJTUNfQ01QMiAgICAgICAgICAoSFJUSU1fQk1UUkdSX1RDQ01QMikgICAvKiE8IFRpbWVyIEMgY29tcGFyZSAyIGV2ZW50IGlzIHN0YXJ0aW5nIHRoZSBidXJzdCBtb2RlIG9wZXJhdGlvbiAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9UUklHX1RJTURfUkVTRVQgICAgICAgICAoSFJUSU1fQk1UUkdSX1REUlNUKSAgICAvKiE8IFRpbWVyIEQgcmVzZXQgZXZlbnQgaXMgc3RhcnRpbmcgdGhlIGJ1cnN0IG1vZGUgb3BlcmF0aW9uICovCisjZGVmaW5lIExMX0hSVElNX0JNX1RSSUdfVElNRF9SRVBFVElUSU9OICAgIChIUlRJTV9CTVRSR1JfVERSRVApICAgIC8qITwgVGltZXIgRCByZXBldGl0aW9uIGV2ZW50IGlzIHN0YXJ0aW5nIHRoZSBidXJzdCBtb2RlIG9wZXJhdGlvbiAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9UUklHX1RJTURfQ01QMSAgICAgICAgICAoSFJUSU1fQk1UUkdSX1REQ01QMSkgICAvKiE8IFRpbWVyIEQgY29tcGFyZSAxIGV2ZW50IGlzIHN0YXJ0aW5nIHRoZSBidXJzdCBtb2RlIG9wZXJhdGlvbiAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9UUklHX1RJTURfQ01QMiAgICAgICAgICAoSFJUSU1fQk1UUkdSX1REQ01QMikgICAvKiE8IFRpbWVyIEQgY29tcGFyZSAyIGV2ZW50IGlzIHN0YXJ0aW5nIHRoZSBidXJzdCBtb2RlIG9wZXJhdGlvbiAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9UUklHX1RJTUVfUkVTRVQgICAgICAgICAoSFJUSU1fQk1UUkdSX1RFUlNUKSAgICAvKiE8IFRpbWVyIEUgcmVzZXQgZXZlbnQgaXMgc3RhcnRpbmcgdGhlIGJ1cnN0IG1vZGUgb3BlcmF0aW9uICovCisjZGVmaW5lIExMX0hSVElNX0JNX1RSSUdfVElNRV9SRVBFVElUSU9OICAgIChIUlRJTV9CTVRSR1JfVEVSRVApICAgIC8qITwgVGltZXIgRSByZXBldGl0aW9uIGV2ZW50IGlzIHN0YXJ0aW5nIHRoZSBidXJzdCBtb2RlIG9wZXJhdGlvbiAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9UUklHX1RJTUVfQ01QMSAgICAgICAgICAoSFJUSU1fQk1UUkdSX1RFQ01QMSkgICAvKiE8IFRpbWVyIEUgY29tcGFyZSAxIGV2ZW50IGlzIHN0YXJ0aW5nIHRoZSBidXJzdCBtb2RlIG9wZXJhdGlvbiAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9UUklHX1RJTUVfQ01QMiAgICAgICAgICAoSFJUSU1fQk1UUkdSX1RFQ01QMikgICAvKiE8IFRpbWVyIEUgY29tcGFyZSAyIGV2ZW50IGlzIHN0YXJ0aW5nIHRoZSBidXJzdCBtb2RlIG9wZXJhdGlvbiAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9UUklHX1RJTUFfRVZFTlQ3ICAgICAgICAoSFJUSU1fQk1UUkdSX1RBRUVWNykgICAvKiE8IFRpbWVyIEEgcGVyaW9kIGZvbGxvd2luZyBhbiBleHRlcm5hbCBldmVudCA3IChjb25kaXRpb25lZCBieSBUSU1BIGZpbHRlcnMpIGlzIHN0YXJ0aW5nIHRoZSBidXJzdAorbW9kZSBvcGVyYXRpb24gICovCisjZGVmaW5lIExMX0hSVElNX0JNX1RSSUdfVElNRF9FVkVOVDggICAgICAgIChIUlRJTV9CTVRSR1JfVERFRVY4KSAgIC8qITwgVGltZXIgRCBwZXJpb2QgZm9sbG93aW5nIGFuIGV4dGVybmFsIGV2ZW50IDggKGNvbmRpdGlvbmVkIGJ5IFRJTUQgZmlsdGVycykgaXMgc3RhcnRpbmcgdGhlIGJ1cnN0Cittb2RlIG9wZXJhdGlvbiAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQk1fVFJJR19FVkVOVF83ICAgICAgICAgICAgKEhSVElNX0JNVFJHUl9FRVY3KSAgICAgLyohPCBFeHRlcm5hbCBldmVudCA3IGNvbmRpdGlvbmVkIGJ5IFRJTUEgZmlsdGVycyBpcyBzdGFydGluZyB0aGUgYnVyc3QgbW9kZSBvcGVyYXRpb24gKi8KKyNkZWZpbmUgTExfSFJUSU1fQk1fVFJJR19FVkVOVF84ICAgICAgICAgICAgKEhSVElNX0JNVFJHUl9FRVY4KSAgICAgLyohPCBFeHRlcm5hbCBldmVudCA4IGNvbmRpdGlvbmVkIGJ5IFRJTUQgZmlsdGVycyBpcyBzdGFydGluZyB0aGUgYnVyc3QgbW9kZSBvcGVyYXRpb24gKi8KKyNkZWZpbmUgTExfSFJUSU1fQk1fVFJJR19FVkVOVF9PTkNISVAgICAgICAgKEhSVElNX0JNVFJHUl9PQ0hQRVYpICAgLyohPCBBIHJpc2luZyBlZGdlIG9uIGFuIG9uLWNoaXAgRXZlbnQgKGZvciBpbnN0YW5jZSBmcm9tIEdQIHRpbWVyIG9yIGNvbXBhcmF0b3IpIHRyaWdnZXJzIHRoZSBidXJzdCBtb2RlCitvcGVyYXRpb24gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRUNfQk1fU1RBVFVTIEhSVElNIEJVUlNUIE1PREUgU1RBVFVTCisgICogQHsKKyAgKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRoZSBvcGVyYXRpbmcgc3RhdGUgb2YgdGhlIGJ1cnN0IG1vZGUgY29udHJvbGxlci4KKyAgKi8KKyNkZWZpbmUgTExfSFJUSU1fQk1fU1RBVFVTX05PUk1BTCAgICAgICAgKCh1aW50MzJfdCkgMHgwMDAwMDAwMFUpIC8qITwgTm9ybWFsIG9wZXJhdGlvbiAqLworI2RlZmluZSBMTF9IUlRJTV9CTV9TVEFUVVNfQlVSU1RfT05HT0lORyAoSFJUSU1fQk1DUl9CTVNUQVQpICAgICAvKiE8IEJ1cnN0IG9wZXJhdGlvbiBvbi1nb2luZyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSFJUSU1fTExfRXhwb3J0ZWRfTWFjcm9zIEhSVElNIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fTExfRU1fV1JJVEVfUkVBRCBDb21tb24gV3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBIUlRJTSByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIEhSVElNIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9IUlRJTV9Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIEhSVElNIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gSFJUSU0gSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfSFJUSU1fUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fTExfRU1fRXhwb3J0ZWRfTWFjcm9zIEV4cG9ydGVkX01hY3JvcworICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEhFTFBFUiBtYWNybyByZXR1cm5pbmcgdGhlIG91dHB1dCBzdGF0ZSBmcm9tIG91dHB1dCBlbmFibGUvZGlzYWJsZSBzdGF0dXMKKyAgKiBAcGFyYW0gIF9fT1VUUFVUX1NUQVRVU19FTl9fIG91dHB1dCBlbmFibGUgc3RhdHVzCisgICogQHBhcmFtICBfX09VVFBVVF9TVEFUVVNfRElTX18gb3V0cHV0IERpc2FibGUgc3RhdHVzCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVFNUQVRFX0lETEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRTVEFURV9SVU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRTVEFURV9GQVVMVAorKi8KKyNkZWZpbmUgX19MTF9IUlRJTV9HRVRfT1VUUFVUX1NUQVRFKF9fT1VUUFVUX1NUQVRVU19FTl9fLCBfX09VVFBVVF9TVEFUVVNfRElTX18pXAorICAoKChfX09VVFBVVF9TVEFUVVNfRU5fXykgPT0gMSkgPyAgTExfSFJUSU1fT1VUUFVUU1RBVEVfUlVOIDpcCisgICAoKF9fT1VUUFVUX1NUQVRVU19ESVNfXykgPT0gMCkgPyBMTF9IUlRJTV9PVVRQVVRTVEFURV9JRExFIDogTExfSFJUSU1fT1VUUFVUU1RBVEVfRkFVTFQpCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEhSVElNX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBIUlRJTSBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworLyoqIEBkZWZncm91cCBIUlRJTV9FRl9IUlRJTV9Db250cm9sIEhSVElNX0NvbnRyb2wKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNlbGVjdCB0aGUgSFJUSU0gc3luY2hyb25pemF0aW9uIGlucHV0IHNvdXJjZS4KKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGNhbGxlZCB3aGVuICB0aGUgY29uY2VybmVkIHRpbWVyKHMpIGlzIChhcmUpIGVuYWJsZWQgLgorICAqIEBybXRvbGwgTUNSICAgICAgICAgIFNZTkNJTiAgICAgICAgTExfSFJUSU1fU2V0U3luY0luU3JjCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBTeW5jSW5TcmMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9TWU5DSU5fU1JDX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9TWU5DSU5fU1JDX1RJTV9FVkVOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1NZTkNJTl9TUkNfRVhURVJOQUxfRVZFTlQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX1NldFN5bmNJblNyYyhIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFN5bmNJblNyYykKK3sKKyAgTU9ESUZZX1JFRyhIUlRJTXgtPnNNYXN0ZXJSZWdzLk1DUiwgSFJUSU1fTUNSX1NZTkNfSU4sIFN5bmNJblNyYyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCBIUlRJTSBzeW5jaHJvbml6YXRpb24gaW5wdXQgc291cmNlLgorICAqIEBybXRvbGwgTUNSICAgICAgICAgIFNZTkNJTiAgICAgICAgTExfSFJUSU1fU2V0U3luY0luU3JjCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTeW5jSW5TcmMgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9TWU5DSU5fU1JDX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9TWU5DSU5fU1JDX1RJTV9FVkVOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1NZTkNJTl9TUkNfRVhURVJOQUxfRVZFTlQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9HZXRTeW5jSW5TcmMoSFJUSU1fVHlwZURlZiAqSFJUSU14KQoreworICByZXR1cm4gKFJFQURfQklUKEhSVElNeC0+c01hc3RlclJlZ3MuTUNSLCBIUlRJTV9NQ1JfU1lOQ19JTikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgSFJUSU0gc3luY2hyb25pemF0aW9uIG91dHB1dC4KKyAgKiBAcm10b2xsIE1DUiAgICAgICAgICBTWU5DU1JDICAgICAgTExfSFJUSU1fQ29uZmlnU3luY091dFxuCisgICogICAgICAgICBNQ1IgICAgICAgICAgU1lOQ09VVCAgICAgIExMX0hSVElNX0NvbmZpZ1N5bmNPdXQKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENvbmZpZyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1NZTkNPVVRfRElTQUJMRUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9TWU5DT1VUX1BPU0lUSVZFX1BVTFNFCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fU1lOQ09VVF9ORUdBVElWRV9QVUxTRQorICAqIEBwYXJhbSAgU3JjIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fU1lOQ09VVF9TUkNfTUFTVEVSX1NUQVJUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fU1lOQ09VVF9TUkNfTUFTVEVSX0NNUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9TWU5DT1VUX1NSQ19USU1BX1NUQVJUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fU1lOQ09VVF9TUkNfVElNQV9DTVAxCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9Db25maWdTeW5jT3V0KEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgQ29uZmlnLCB1aW50MzJfdCBTcmMpCit7CisgIE1PRElGWV9SRUcoSFJUSU14LT5zTWFzdGVyUmVncy5NQ1IsIChIUlRJTV9NQ1JfU1lOQ19PVVQgfCBIUlRJTV9NQ1JfU1lOQ19TUkMpLCAoQ29uZmlnIHwgU3JjKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSByb3V0aW5nIGFuZCBjb25kaXRpb25pbmcgb2YgdGhlIHN5bmNocm9uaXphdGlvbiBvdXRwdXQgZXZlbnQuCisgICogQHJtdG9sbCBNQ1IgICAgICAgICAgU1lOQ09VVCAgICAgIExMX0hSVElNX1NldFN5bmNPdXRDb25maWcKKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgb25seSB3aGVuIHRoZSBtYXN0ZXIgdGltZXIgaXMgZW5hYmxlZC4KKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFN5bmNPdXRDb25maWcgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9TWU5DT1VUX0RJU0FCTEVECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fU1lOQ09VVF9QT1NJVElWRV9QVUxTRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1NZTkNPVVRfTkVHQVRJVkVfUFVMU0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX1NldFN5bmNPdXRDb25maWcoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBTeW5jT3V0Q29uZmlnKQoreworICBNT0RJRllfUkVHKEhSVElNeC0+c01hc3RlclJlZ3MuTUNSLCBIUlRJTV9NQ1JfU1lOQ19PVVQsIFN5bmNPdXRDb25maWcpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgcm91dGluZyBhbmQgY29uZGl0aW9uaW5nIG9mIHRoZSBzeW5jaHJvbml6YXRpb24gb3V0cHV0IGV2ZW50LgorICAqIEBybXRvbGwgTUNSICAgICAgICAgIFNZTkNPVVQgICAgICBMTF9IUlRJTV9HZXRTeW5jT3V0Q29uZmlnCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTeW5jT3V0Q29uZmlnIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fU1lOQ09VVF9ESVNBQkxFRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1NZTkNPVVRfUE9TSVRJVkVfUFVMU0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9TWU5DT1VUX05FR0FUSVZFX1BVTFNFCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fR2V0U3luY091dENvbmZpZyhIUlRJTV9UeXBlRGVmICpIUlRJTXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoSFJUSU14LT5zTWFzdGVyUmVncy5NQ1IsIEhSVElNX01DUl9TWU5DX09VVCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgc291cmNlIGFuZCBldmVudCB0byBiZSBzZW50IG9uIHRoZSBIUlRJTSBzeW5jaHJvbml6YXRpb24gb3V0cHV0LgorICAqIEBybXRvbGwgTUNSICAgICAgICAgIFNZTkNTUkMgICAgICBMTF9IUlRJTV9TZXRTeW5jT3V0U3JjCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBTeW5jT3V0U3JjIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fU1lOQ09VVF9TUkNfTUFTVEVSX1NUQVJUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fU1lOQ09VVF9TUkNfTUFTVEVSX0NNUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9TWU5DT1VUX1NSQ19USU1BX1NUQVJUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fU1lOQ09VVF9TUkNfVElNQV9DTVAxCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9TZXRTeW5jT3V0U3JjKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgU3luY091dFNyYykKK3sKKyAgTU9ESUZZX1JFRyhIUlRJTXgtPnNNYXN0ZXJSZWdzLk1DUiwgSFJUSU1fTUNSX1NZTkNfU1JDLCBTeW5jT3V0U3JjKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsICBzb3VyY2UgYW5kIGV2ZW50IHNlbnQgb24gdGhlIEhSVElNIHN5bmNocm9uaXphdGlvbiBvdXRwdXQuCisgICogQHJtdG9sbCBNQ1IgICAgICAgICAgU1lOQ1NSQyAgICAgIExMX0hSVElNX0dldFN5bmNPdXRTcmMKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN5bmNPdXRTcmMgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9TWU5DT1VUX1NSQ19NQVNURVJfU1RBUlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9TWU5DT1VUX1NSQ19NQVNURVJfQ01QMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1NZTkNPVVRfU1JDX1RJTUFfU1RBUlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9TWU5DT1VUX1NSQ19USU1BX0NNUDEKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9HZXRTeW5jT3V0U3JjKEhSVElNX1R5cGVEZWYgKkhSVElNeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChIUlRJTXgtPnNNYXN0ZXJSZWdzLk1DUiwgSFJUSU1fTUNSX1NZTkNfU1JDKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSAodGVtcG9yYXJpbHkpIHVwZGF0ZSBldmVudCBnZW5lcmF0aW9uLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE1VRElTICAgICAgICAgTExfSFJUSU1fU3VzcGVuZFVwZGF0ZVxuCisgICogICAgICAgICBDUjEgICAgICAgICAgVEFVRElTICAgICAgICBMTF9IUlRJTV9TdXNwZW5kVXBkYXRlXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBUQlVESVMgICAgICAgIExMX0hSVElNX1N1c3BlbmRVcGRhdGVcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIFRDVURJUyAgICAgICAgTExfSFJUSU1fU3VzcGVuZFVwZGF0ZVxuCisgICogICAgICAgICBDUjEgICAgICAgICAgVERVRElTICAgICAgICBMTF9IUlRJTV9TdXNwZW5kVXBkYXRlXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBURVVESVMgICAgICAgIExMX0hSVElNX1N1c3BlbmRVcGRhdGUKKyAgKiBAbm90ZSBBbGxvdyB0byB0ZW1wb3JhcmlseSBkaXNhYmxlIHRoZSB0cmFuc2ZlciBmcm9tIHByZWxvYWQgdG8gYWN0aXZlCisgICogICAgICByZWdpc3RlcnMsIHdoYXRldmVyIHRoZSBzZWxlY3RlZCB1cGRhdGUgZXZlbnQuIFRoaXMgYWxsb3dzIHRvIG1vZGlmeQorICAqICAgICAgc2V2ZXJhbCByZWdpc3RlcnMgaW4gbXVsdGlwbGUgdGltZXJzLgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXJzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9TdXNwZW5kVXBkYXRlKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXJzKQoreworICBTRVRfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuQ1IxLCAoKFRpbWVycyA+PiBIUlRJTV9NQ1JfTUNFTl9Qb3MpICYgSFJUSU1fQ1IxX1VESVNfTUFTSykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB1cGRhdGUgZXZlbnQgZ2VuZXJhdGlvbi4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBNVURJUyAgICAgICAgIExMX0hSVElNX1Jlc3VtZVVwZGF0ZVxuCisgICogICAgICAgICBDUjEgICAgICAgICAgVEFVRElTICAgICAgICBMTF9IUlRJTV9SZXN1bWVVcGRhdGVcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIFRCVURJUyAgICAgICAgTExfSFJUSU1fUmVzdW1lVXBkYXRlXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBUQ1VESVMgICAgICAgIExMX0hSVElNX1Jlc3VtZVVwZGF0ZVxuCisgICogICAgICAgICBDUjEgICAgICAgICAgVERVRElTICAgICAgICBMTF9IUlRJTV9SZXN1bWVVcGRhdGVcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIFRFVURJUyAgICAgICAgTExfSFJUSU1fUmVzdW1lVXBkYXRlCisgICogQG5vdGUgVGhlIHJlZ3VsYXIgdXBkYXRlIGV2ZW50IHRha2VzIHBsYWNlLgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXJzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9SZXN1bWVVcGRhdGUoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcnMpCit7CisgIENMRUFSX0JJVChIUlRJTXgtPnNDb21tb25SZWdzLkNSMSwgKChUaW1lcnMgPj4gSFJUSU1fTUNSX01DRU5fUG9zKSAmIEhSVElNX0NSMV9VRElTX01BU0spKTsKK30KKworLyoqCisgICogQGJyaWVmICBGb3JjZSBhbiBpbW1lZGlhdGUgdHJhbnNmZXIgZnJvbSB0aGUgcHJlbG9hZCB0byB0aGUgYWN0aXZlIHJlZ2lzdGVyIC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBNU1dVICAgICAgICAgIExMX0hSVElNX0ZvcmNlVXBkYXRlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBUQVNXVSAgICAgICAgIExMX0hSVElNX0ZvcmNlVXBkYXRlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBUQlNXVSAgICAgICAgIExMX0hSVElNX0ZvcmNlVXBkYXRlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBUQ1NXVSAgICAgICAgIExMX0hSVElNX0ZvcmNlVXBkYXRlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBURFNXVSAgICAgICAgIExMX0hSVElNX0ZvcmNlVXBkYXRlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBURVNXVSAgICAgICAgIExMX0hSVElNX0ZvcmNlVXBkYXRlCisgICogQG5vdGUgQW55IHBlbmRpbmcgdXBkYXRlIHJlcXVlc3QgaXMgY2FuY2VsbGVkLgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXJzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9Gb3JjZVVwZGF0ZShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVycykKK3sKKyAgU0VUX0JJVChIUlRJTXgtPnNDb21tb25SZWdzLkNSMiwgKChUaW1lcnMgPj4gSFJUSU1fTUNSX01DRU5fUG9zKSAmIEhSVElNX0NSMl9TV1VQRF9NQVNLKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVzZXQgdGhlIEhSVElNIHRpbWVyKHMpIGNvdW50ZXIuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTVJTVCAgICAgICAgICBMTF9IUlRJTV9Db3VudGVyUmVzZXRcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIFRBUlNUICAgICAgICAgTExfSFJUSU1fQ291bnRlclJlc2V0XG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBUQlJTVCAgICAgICAgIExMX0hSVElNX0NvdW50ZXJSZXNldFxuCisgICogICAgICAgICBDUjIgICAgICAgICAgVENSU1QgICAgICAgICBMTF9IUlRJTV9Db3VudGVyUmVzZXRcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIFREUlNUICAgICAgICAgTExfSFJUSU1fQ291bnRlclJlc2V0XG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBURVJTVCAgICAgICAgIExMX0hSVElNX0NvdW50ZXJSZXNldAorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXJzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9Db3VudGVyUmVzZXQoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcnMpCit7CisgIFNFVF9CSVQoSFJUSU14LT5zQ29tbW9uUmVncy5DUjIsICgoKFRpbWVycyA+PiBIUlRJTV9NQ1JfTUNFTl9Qb3MpIDw8IEhSVElNX0NSMl9NUlNUX1BvcykgJiBIUlRJTV9DUjJfU1dSU1RfTUFTSykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgSFJUSU0gdGltZXIocykgb3V0cHV0KHMpIC4KKyAgKiBAcm10b2xsIE9FTlIgICAgICAgICBUQTFPRU4gICAgICAgIExMX0hSVElNX0VuYWJsZU91dHB1dFxuCisgICogICAgICAgICBPRU5SICAgICAgICAgVEEyT0VOICAgICAgICBMTF9IUlRJTV9FbmFibGVPdXRwdXRcbgorICAqICAgICAgICAgT0VOUiAgICAgICAgIFRCMU9FTiAgICAgICAgTExfSFJUSU1fRW5hYmxlT3V0cHV0XG4KKyAgKiAgICAgICAgIE9FTlIgICAgICAgICBUQjJPRU4gICAgICAgIExMX0hSVElNX0VuYWJsZU91dHB1dFxuCisgICogICAgICAgICBPRU5SICAgICAgICAgVEMxT0VOICAgICAgICBMTF9IUlRJTV9FbmFibGVPdXRwdXRcbgorICAqICAgICAgICAgT0VOUiAgICAgICAgIFRDMk9FTiAgICAgICAgTExfSFJUSU1fRW5hYmxlT3V0cHV0XG4KKyAgKiAgICAgICAgIE9FTlIgICAgICAgICBURDFPRU4gICAgICAgIExMX0hSVElNX0VuYWJsZU91dHB1dFxuCisgICogICAgICAgICBPRU5SICAgICAgICAgVEQyT0VOICAgICAgICBMTF9IUlRJTV9FbmFibGVPdXRwdXRcbgorICAqICAgICAgICAgT0VOUiAgICAgICAgIFRFMU9FTiAgICAgICAgTExfSFJUSU1fRW5hYmxlT3V0cHV0XG4KKyAgKiAgICAgICAgIE9FTlIgICAgICAgICBURTJPRU4gICAgICAgIExMX0hSVElNX0VuYWJsZU91dHB1dAorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgT3V0cHV0cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEExCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RBMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEQxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1REMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEUyCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9FbmFibGVPdXRwdXQoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBPdXRwdXRzKQoreworICBTRVRfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuT0VOUiwgKE91dHB1dHMgJiBIUlRJTV9PRU5SX09FTl9NQVNLKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgSFJUSU0gdGltZXIocykgb3V0cHV0KHMpIC4KKyAgKiBAcm10b2xsIE9FTlIgICAgICAgICBUQTFPRU4gICAgICAgIExMX0hSVElNX0Rpc2FibGVPdXRwdXRcbgorICAqICAgICAgICAgT0VOUiAgICAgICAgIFRBMk9FTiAgICAgICAgTExfSFJUSU1fRGlzYWJsZU91dHB1dFxuCisgICogICAgICAgICBPRU5SICAgICAgICAgVEIxT0VOICAgICAgICBMTF9IUlRJTV9EaXNhYmxlT3V0cHV0XG4KKyAgKiAgICAgICAgIE9FTlIgICAgICAgICBUQjJPRU4gICAgICAgIExMX0hSVElNX0Rpc2FibGVPdXRwdXRcbgorICAqICAgICAgICAgT0VOUiAgICAgICAgIFRDMU9FTiAgICAgICAgTExfSFJUSU1fRGlzYWJsZU91dHB1dFxuCisgICogICAgICAgICBPRU5SICAgICAgICAgVEMyT0VOICAgICAgICBMTF9IUlRJTV9EaXNhYmxlT3V0cHV0XG4KKyAgKiAgICAgICAgIE9FTlIgICAgICAgICBURDFPRU4gICAgICAgIExMX0hSVElNX0Rpc2FibGVPdXRwdXRcbgorICAqICAgICAgICAgT0VOUiAgICAgICAgIFREMk9FTiAgICAgICAgTExfSFJUSU1fRGlzYWJsZU91dHB1dFxuCisgICogICAgICAgICBPRU5SICAgICAgICAgVEUxT0VOICAgICAgICBMTF9IUlRJTV9EaXNhYmxlT3V0cHV0XG4KKyAgKiAgICAgICAgIE9FTlIgICAgICAgICBURTJPRU4gICAgICAgIExMX0hSVElNX0Rpc2FibGVPdXRwdXQKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIE91dHB1dHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RBMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RCMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1REMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEUxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RFMgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRGlzYWJsZU91dHB1dChIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IE91dHB1dHMpCit7CisgIFNFVF9CSVQoSFJUSU14LT5zQ29tbW9uUmVncy5PRElTUiwgKE91dHB1dHMgJiBIUlRJTV9PRU5SX09ESVNfTUFTSykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBIUlRJTSB0aW1lciBvdXRwdXQgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIE9FTlIgICAgICAgICBUQTFPRU4gICAgICAgIExMX0hSVElNX0lzRW5hYmxlZE91dHB1dFxuCisgICogICAgICAgICBPRU5SICAgICAgICAgVEEyT0VOICAgICAgICBMTF9IUlRJTV9Jc0VuYWJsZWRPdXRwdXRcbgorICAqICAgICAgICAgT0VOUiAgICAgICAgIFRCMU9FTiAgICAgICAgTExfSFJUSU1fSXNFbmFibGVkT3V0cHV0XG4KKyAgKiAgICAgICAgIE9FTlIgICAgICAgICBUQjJPRU4gICAgICAgIExMX0hSVElNX0lzRW5hYmxlZE91dHB1dFxuCisgICogICAgICAgICBPRU5SICAgICAgICAgVEMxT0VOICAgICAgICBMTF9IUlRJTV9Jc0VuYWJsZWRPdXRwdXRcbgorICAqICAgICAgICAgT0VOUiAgICAgICAgIFRDMk9FTiAgICAgICAgTExfSFJUSU1fSXNFbmFibGVkT3V0cHV0XG4KKyAgKiAgICAgICAgIE9FTlIgICAgICAgICBURDFPRU4gICAgICAgIExMX0hSVElNX0lzRW5hYmxlZE91dHB1dFxuCisgICogICAgICAgICBPRU5SICAgICAgICAgVEQyT0VOICAgICAgICBMTF9IUlRJTV9Jc0VuYWJsZWRPdXRwdXRcbgorICAqICAgICAgICAgT0VOUiAgICAgICAgIFRFMU9FTiAgICAgICAgTExfSFJUSU1fSXNFbmFibGVkT3V0cHV0XG4KKyAgKiAgICAgICAgIE9FTlIgICAgICAgICBURTJPRU4gICAgICAgIExMX0hSVElNX0lzRW5hYmxlZE91dHB1dAorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgT3V0cHV0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RBMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RCMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1REMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEUxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RFMgorICAqIEByZXR2YWwgU3RhdGUgb2YgVHh5T0VOIGJpdCBpbiBIUlRJTV9PRU5SIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0lzRW5hYmxlZE91dHB1dChIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IE91dHB1dCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChIUlRJTXgtPnNDb21tb25SZWdzLk9FTlIsIE91dHB1dCkgPT0gT3V0cHV0KTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgSFJUSU0gdGltZXIgb3V0cHV0IGlzIGRpc2FibGVkLgorICAqIEBybXRvbGwgT0RJU1IgICAgICAgIFRBMU9ESVMgICAgICAgIExMX0hSVElNX0lzRGlzYWJsZWRPdXRwdXRcbgorICAqICAgICAgICAgT0RJU1IgICAgICAgIFRBMk9ESVMgICAgICAgIExMX0hSVElNX0lzRGlzYWJsZWRPdXRwdXRcbgorICAqICAgICAgICAgT0RJU1IgICAgICAgIFRCMU9ESVMgICAgICAgIExMX0hSVElNX0lzRGlzYWJsZWRPdXRwdXRcbgorICAqICAgICAgICAgT0RJU1IgICAgICAgIFRCMk9ESVMgICAgICAgIExMX0hSVElNX0lzRGlzYWJsZWRPdXRwdXRcbgorICAqICAgICAgICAgT0RJU1IgICAgICAgIFRDMU9ESVMgICAgICAgIExMX0hSVElNX0lzRGlzYWJsZWRPdXRwdXRcbgorICAqICAgICAgICAgT0RJU1IgICAgICAgIFRDMk9ESVMgICAgICAgIExMX0hSVElNX0lzRGlzYWJsZWRPdXRwdXRcbgorICAqICAgICAgICAgT0RJU1IgICAgICAgIFREMU9ESVMgICAgICAgIExMX0hSVElNX0lzRGlzYWJsZWRPdXRwdXRcbgorICAqICAgICAgICAgT0RJU1IgICAgICAgIFREMk9ESVMgICAgICAgIExMX0hSVElNX0lzRGlzYWJsZWRPdXRwdXRcbgorICAqICAgICAgICAgT0RJU1IgICAgICAgIFRFMU9ESVMgICAgICAgIExMX0hSVElNX0lzRGlzYWJsZWRPdXRwdXRcbgorICAqICAgICAgICAgT0RJU1IgICAgICAgIFRFMk9ESVMgICAgICAgIExMX0hSVElNX0lzRGlzYWJsZWRPdXRwdXQKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIE91dHB1dCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RCMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RDMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEQyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RFMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URTIKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIFR4eU9EUyBiaXQgaW4gSFJUSU1fT0RTUiByZWdpc3RlciAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9Jc0Rpc2FibGVkT3V0cHV0KEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgT3V0cHV0KQoreworICByZXR1cm4gKFJFQURfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuT0RJU1IsIE91dHB1dCkgPT0gT3V0cHV0KTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgYW4gQURDIHRyaWdnZXIuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQURDMVVTUkMgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIEFEQzJVU1JDICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBBREMzVVNSQyAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBDUjEgICAgICAgICAgQURDNFVTUkMgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDMVIgICAgICAgIEFEQzFNQzQgICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxTVBFUiAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMxUiAgICAgICAgQURDMUVFVjEgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDMVIgICAgICAgIEFEQzFFRVYyICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxRUVWMyAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMxUiAgICAgICAgQURDMUVFVjQgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDMVIgICAgICAgIEFEQzFFRVY1ICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxVEFDMiAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMxUiAgICAgICAgQURDMVRBQzMgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDMVIgICAgICAgIEFEQzFUQUM0ICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxVEFQRVIgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMxUiAgICAgICAgQURDMVRBUlNUICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDMVIgICAgICAgIEFEQzFUQkMyICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxVEJDMyAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMxUiAgICAgICAgQURDMVRCQzQgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDMVIgICAgICAgIEFEQzFUQlBFUiAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxVEJSU1QgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMxUiAgICAgICAgQURDMVRDQzIgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDMVIgICAgICAgIEFEQzFUQ0MzICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxVENDNCAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMxUiAgICAgICAgQURDMVRDUEVSICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDMVIgICAgICAgIEFEQzFUREMyICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxVERDMyAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMxUiAgICAgICAgQURDMVREQzQgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDMVIgICAgICAgIEFEQzFURFBFUiAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxVEVDMiAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMxUiAgICAgICAgQURDMVRFQzMgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDMVIgICAgICAgIEFEQzFURUM0ICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxVEVQRVIgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMk1DMSAgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJNQzIgICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyTUMzICAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMk1DNCAgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJNUEVSICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyRUVWNiAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMkVFVjcgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJFRVY4ICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyRUVWOSAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMkVFVjEwICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJUQUMyICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyVEFDMyAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMlRBQzQgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJUQVBFUiAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyVEJDMiAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMlRCQzMgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJUQkM0ICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyVEJQRVIgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMlRDQzIgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJUQ0MzICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyVENDNCAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMlRDUEVSICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJUQ1JTVCAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyVERDMiAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMlREQzMgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJUREM0ICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyVERQRVIgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMlREUlNUICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJURUMyICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyVEVDMyAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMlRFQzQgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJURVJTVCAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzTUMxICAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM01DMiAgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNNQzMgICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzTUM0ICAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM01QRVIgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNFRVYxICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzRUVWMiAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM0VFVjMgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNFRVY0ICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzRUVWNSAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM1RBQzIgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNUQUMzICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzVEFDNCAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM1RBUEVSICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNUQVJTVCAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzVEJDMiAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM1RCQzMgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNUQkM0ICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzVEJQRVIgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM1RCUlNUICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNUQ0MyICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzVENDMyAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM1RDQzQgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNUQ1BFUiAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzVERDMiAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM1REQzMgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNUREM0ICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzVERQRVIgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM1RFQzIgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNURUMzICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzVEVDNCAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM1RFUEVSICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRNQzEgICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0TUMyICAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNE1DMyAgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRNQzQgICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0TVBFUiAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNEVFVjYgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRFRVY3ICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0RUVWOCAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNEVFVjkgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRFRVYxMCAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0VEFDMiAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNFRBQzMgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRUQUM0ICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0VEFQRVIgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNFRCQzIgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRUQkMzICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0VEJDNCAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNFRCUEVSICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRUQ0MyICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0VENDMyAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNFRDQzQgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRUQ1BFUiAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0VENSU1QgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNFREQzIgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRUREMzICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0VERDNCAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNFREUEVSICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRURFJTVCAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0VEVDMiAgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZ1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNFRFQzMgICAgICAgIExMX0hSVElNX0NvbmZpZ0FEQ1RyaWdcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRURUM0ICAgICAgICBMTF9IUlRJTV9Db25maWdBRENUcmlnXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0VEVSU1QgICAgICAgTExfSFJUSU1fQ29uZmlnQURDVHJpZworICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQURDVHJpZyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfNAorICAqIEBwYXJhbSAgVXBkYXRlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19VUERBVEVfTUFTVEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19VUERBVEVfVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfVVBEQVRFX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1VQREFURV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19VUERBVEVfVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfVVBEQVRFX1RJTUVSX0UKKyAgKiBAcGFyYW0gIFNyYyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKgorICAqICAgICAgICAgRm9yIEFEQyB0cmlnZ2VyIDEgYW5kIEFEQyB0cmlnZ2VyIDM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19NQ01QMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfTUNNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzEzX01DTVAzCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19NQ01QNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfTVBFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfVElNQUNNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzEzX1RJTUFDTVAzCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1BQ01QNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfVElNQVBFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfRUVWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfRUVWMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfRUVWMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfRUVWNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfRUVWNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfVElNQVJTVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfVElNQkNNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzEzX1RJTUJDTVAzCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1CQ01QNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfVElNQlBFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfVElNQlJTVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfVElNQ0NNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzEzX1RJTUNDTVAzCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1DQ01QNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfVElNQ1BFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfVElNRENNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzEzX1RJTURDTVAzCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1EQ01QNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfVElNRFBFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfVElNRUNNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzEzX1RJTUVDTVAzCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1FQ01QNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfVElNRVBFUgorICAqCisgICogICAgICAgICBGb3IgQURDIHRyaWdnZXIgMiBhbmQgQURDIHRyaWdnZXIgNDoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X01DTVAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9NQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfTUNNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X01DTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9NUEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9FRVY2CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9FRVY3CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9FRVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9FRVY5CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9FRVYxMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfVElNQUNNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X1RJTUFDTVAzCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1BQ01QNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfVElNQVBFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfVElNQkNNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X1RJTUJDTVAzCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1CQ01QNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfVElNQlBFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfVElNQ0NNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X1RJTUNDTVAzCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1DQ01QNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfVElNQ1BFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfVElNQ1JTVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfVElNRENNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X1RJTURDTVAzCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1EQ01QNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfVElNRFBFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfVElNRFJTVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfVElNRUNNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X1RJTUVDTVAzCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1FQ01QNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfVElNRVJTVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fQ29uZmlnQURDVHJpZyhIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IEFEQ1RyaWcsIHVpbnQzMl90IFVwZGF0ZSwgdWludDMyX3QgU3JjKQoreworICByZWdpc3RlciB1aW50MzJfdCBzaGlmdCA9IDMgKiBBRENUcmlnOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNDb21tb25SZWdzLkFEQzFSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfQURDeFJbQURDVHJpZ10pKTsKKyAgTU9ESUZZX1JFRyhIUlRJTXgtPnNDb21tb25SZWdzLkNSMSwgKEhSVElNX0NSMV9BREMxVVNSQyA8PCBzaGlmdCksIChVcGRhdGUgPDwgc2hpZnQpKTsKKyAgV1JJVEVfUkVHKCpwUmVnLCBTcmMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFzc29jaWF0ZSB0aGUgQURDeCB0cmlnZ2VyIHRvIGEgdGltZXIgdHJpZ2dlcmluZyB0aGUgdXBkYXRlIG9mIHRoZSBIUlRJTV9BREN4UiByZWdpc3Rlci4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBBREMxVVNSQyAgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdVcGRhdGVcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIEFEQzJVU1JDICAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1VwZGF0ZVxuCisgICogICAgICAgICBDUjEgICAgICAgICAgQURDM1VTUkMgICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnVXBkYXRlXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBBREM0VVNSQyAgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdVcGRhdGUKKyAgKiBAbm90ZSBXaGVuIHRoZSBwcmVsb2FkIGlzIGRpc2FibGVkIGluIHRoZSBzb3VyY2UgdGltZXIsIHRoZSBIUlRJTV9BREN4UgorICAqICAgICAgIHJlZ2lzdGVycyBhcmUgbm90IHByZWxvYWRlZCBlaXRoZXI6IGEgd3JpdGUgYWNjZXNzIHdpbGwgcmVzdWx0IGluIGFuCisgICogICAgICAgaW1tZWRpYXRlIHVwZGF0ZSBvZiB0aGUgdHJpZ2dlciBzb3VyY2UuCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBBRENUcmlnIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR18xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR18yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR18zCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR180CisgICogQHBhcmFtICBVcGRhdGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1VQREFURV9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1VQREFURV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19VUERBVEVfVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfVVBEQVRFX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1VQREFURV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19VUERBVEVfVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fU2V0QURDVHJpZ1VwZGF0ZShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IEFEQ1RyaWcsIHVpbnQzMl90IFVwZGF0ZSkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3Qgc2hpZnQgPSAzICogQURDVHJpZzsKKyAgTU9ESUZZX1JFRyhIUlRJTXgtPnNDb21tb25SZWdzLkNSMSwgKEhSVElNX0NSMV9BREMxVVNSQyA8PCBzaGlmdCksIChVcGRhdGUgPDwgc2hpZnQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHNvdXJjZSB0aW1lciB0cmlnZ2VyaW5nIHRoZSB1cGRhdGUgb2YgdGhlIEhSVElNX0FEQ3hSIHJlZ2lzdGVyLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEFEQzFVU1JDICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnVXBkYXRlXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBBREMyVVNSQyAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1VwZGF0ZVxuCisgICogICAgICAgICBDUjEgICAgICAgICAgQURDM1VTUkMgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdVcGRhdGVcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIEFEQzRVU1JDICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnVXBkYXRlCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBBRENUcmlnIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR18xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR18yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR18zCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR180CisgICogQHJldHZhbCBVcGRhdGUgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1VQREFURV9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1VQREFURV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19VUERBVEVfVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfVVBEQVRFX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1VQREFURV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19VUERBVEVfVElNRVJfRQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0dldEFEQ1RyaWdVcGRhdGUoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBBRENUcmlnKQoreworICByZWdpc3RlciB1aW50MzJfdCBzaGlmdCA9IDMgKiBBRENUcmlnOworICByZXR1cm4gKFJFQURfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuQ1IxLCAoSFJUSU1fQ1IxX0FEQzFVU1JDIDw8IHNoaWZ0KSkgPj4gc2hpZnQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNwZWNpZnkgd2hpY2ggZXZlbnRzICh0aW1lciBldmVudHMgYW5kL29yIGV4dGVybmFsIGV2ZW50cykgYXJlIHVzZWQgYXMgdHJpZ2dlcnMgZm9yIEFEQyBjb252ZXJzaW9uLgorICAqIEBybXRvbGwgQURDMVIgICAgICAgIEFEQzFNQzQgICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxTVBFUiAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMxUiAgICAgICAgQURDMUVFVjEgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMVIgICAgICAgIEFEQzFFRVYyICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxRUVWMyAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMxUiAgICAgICAgQURDMUVFVjQgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMVIgICAgICAgIEFEQzFFRVY1ICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxVEFDMiAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMxUiAgICAgICAgQURDMVRBQzMgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMVIgICAgICAgIEFEQzFUQUM0ICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxVEFQRVIgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMxUiAgICAgICAgQURDMVRBUlNUICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMVIgICAgICAgIEFEQzFUQkMyICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxVEJDMyAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMxUiAgICAgICAgQURDMVRCQzQgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMVIgICAgICAgIEFEQzFUQlBFUiAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxVEJSU1QgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMxUiAgICAgICAgQURDMVRDQzIgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMVIgICAgICAgIEFEQzFUQ0MzICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxVENDNCAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMxUiAgICAgICAgQURDMVRDUEVSICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMVIgICAgICAgIEFEQzFUREMyICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxVERDMyAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMxUiAgICAgICAgQURDMVREQzQgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMVIgICAgICAgIEFEQzFURFBFUiAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxVEVDMiAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMxUiAgICAgICAgQURDMVRFQzMgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMVIgICAgICAgIEFEQzFURUM0ICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxVEVQRVIgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMk1DMSAgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJNQzIgICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyTUMzICAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMk1DNCAgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJNUEVSICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyRUVWNiAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMkVFVjcgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJFRVY4ICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyRUVWOSAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMkVFVjEwICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJUQUMyICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyVEFDMyAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMlRBQzQgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJUQVBFUiAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyVEJDMiAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMlRCQzMgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJUQkM0ICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyVEJQRVIgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMlRDQzIgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJUQ0MzICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyVENDNCAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMlRDUEVSICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJUQ1JTVCAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyVERDMiAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMlREQzMgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJUREM0ICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyVERQRVIgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMlREUlNUICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJURUMyICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyVEVDMyAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMlRFQzQgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJURVJTVCAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzTUMxICAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM01DMiAgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNNQzMgICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzTUM0ICAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM01QRVIgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNFRVYxICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzRUVWMiAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM0VFVjMgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNFRVY0ICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzRUVWNSAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM1RBQzIgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNUQUMzICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzVEFDNCAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM1RBUEVSICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNUQVJTVCAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzVEJDMiAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM1RCQzMgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNUQkM0ICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzVEJQRVIgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM1RCUlNUICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNUQ0MyICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzVENDMyAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM1RDQzQgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNUQ1BFUiAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzVERDMiAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM1REQzMgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNUREM0ICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzVERQRVIgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM1RFQzIgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNURUMzICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzVEVDNCAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM1RFUEVSICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRNQzEgICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0TUMyICAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNE1DMyAgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRNQzQgICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0TVBFUiAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNEVFVjYgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRFRVY3ICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0RUVWOCAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNEVFVjkgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRFRVYxMCAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0VEFDMiAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNFRBQzMgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRUQUM0ICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0VEFQRVIgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNFRCQzIgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRUQkMzICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0VEJDNCAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNFRCUEVSICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRUQ0MyICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0VENDMyAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNFRDQzQgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRUQ1BFUiAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0VENSU1QgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNFREQzIgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRUREMzICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0VERDNCAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNFREUEVSICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRURFJTVCAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0VEVDMiAgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNFRFQzMgICAgICAgIExMX0hSVElNX1NldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRURUM0ICAgICAgICBMTF9IUlRJTV9TZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0VEVSU1QgICAgICAgTExfSFJUSU1fU2V0QURDVHJpZ1NyYworICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQURDVHJpZyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfNAorICAqIEBwYXJhbSAgU3JjIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqCisgICogICAgICAgICBGb3IgQURDIHRyaWdnZXIgMSBhbmQgQURDIHRyaWdnZXIgMzoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzEzX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzEzX01DTVAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19NQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfTUNNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzEzX01DTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19NUEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1BQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfVElNQUNNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzEzX1RJTUFDTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1BUEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19FRVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19FRVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19FRVYzCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19FRVY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19FRVY1CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1BUlNUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1CQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfVElNQkNNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzEzX1RJTUJDTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1CUEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1CUlNUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1DQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfVElNQ0NNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzEzX1RJTUNDTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1DUEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1EQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfVElNRENNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzEzX1RJTURDTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1EUEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1FQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfVElNRUNNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzEzX1RJTUVDTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1FUEVSCisgICoKKyAgKiAgICAgICAgIEZvciBBREMgdHJpZ2dlciAyIGFuZCBBREMgdHJpZ2dlciA0OgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfTUNNUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X01DTVAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9NQ01QMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfTUNNUDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X01QRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X0VFVjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X0VFVjcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X0VFVjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X0VFVjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X0VFVjEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1BQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfVElNQUNNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X1RJTUFDTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1BUEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1CQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfVElNQkNNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X1RJTUJDTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1CUEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1DQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfVElNQ0NNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X1RJTUNDTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1DUEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1DUlNUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1EQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfVElNRENNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X1RJTURDTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1EUEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1EUlNUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1FQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfVElNRUNNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X1RJTUVDTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1FUlNUCisqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fU2V0QURDVHJpZ1NyYyhIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IEFEQ1RyaWcsIHVpbnQzMl90IFNyYykKK3sKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zQ29tbW9uUmVncy5BREMxUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX0FEQ3hSW0FEQ1RyaWddKSk7CisgIFdSSVRFX1JFRygqcFJlZywgU3JjKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGljaCBldmVudHMgKHRpbWVyIGV2ZW50cyBhbmQvb3IgZXh0ZXJuYWwgZXZlbnRzKSBhcmUgY3VycmVudGx5IHVzZWQgYXMgdHJpZ2dlcnMgZm9yIEFEQyBjb252ZXJzaW9uLgorICAqIEBybXRvbGwgQURDMVIgICAgICAgIEFEQzFNQzQgICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxTVBFUiAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMxUiAgICAgICAgQURDMUVFVjEgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMVIgICAgICAgIEFEQzFFRVYyICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxRUVWMyAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMxUiAgICAgICAgQURDMUVFVjQgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMVIgICAgICAgIEFEQzFFRVY1ICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxVEFDMiAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMxUiAgICAgICAgQURDMVRBQzMgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMVIgICAgICAgIEFEQzFUQUM0ICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxVEFQRVIgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMxUiAgICAgICAgQURDMVRBUlNUICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMVIgICAgICAgIEFEQzFUQkMyICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxVEJDMyAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMxUiAgICAgICAgQURDMVRCQzQgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMVIgICAgICAgIEFEQzFUQlBFUiAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxVEJSU1QgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMxUiAgICAgICAgQURDMVRDQzIgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMVIgICAgICAgIEFEQzFUQ0MzICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxVENDNCAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMxUiAgICAgICAgQURDMVRDUEVSICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMVIgICAgICAgIEFEQzFUREMyICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxVERDMyAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMxUiAgICAgICAgQURDMVREQzQgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMVIgICAgICAgIEFEQzFURFBFUiAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxVEVDMiAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMxUiAgICAgICAgQURDMVRFQzMgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMVIgICAgICAgIEFEQzFURUM0ICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzFSICAgICAgICBBREMxVEVQRVIgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMk1DMSAgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJNQzIgICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyTUMzICAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMk1DNCAgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJNUEVSICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyRUVWNiAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMkVFVjcgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJFRVY4ICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyRUVWOSAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMkVFVjEwICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJUQUMyICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyVEFDMyAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMlRBQzQgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJUQVBFUiAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyVEJDMiAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMlRCQzMgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJUQkM0ICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyVEJQRVIgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMlRDQzIgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJUQ0MzICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyVENDNCAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMlRDUEVSICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJUQ1JTVCAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyVERDMiAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMlREQzMgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJUREM0ICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyVERQRVIgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMlREUlNUICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJURUMyICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzJSICAgICAgICBBREMyVEVDMyAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMyUiAgICAgICAgQURDMlRFQzQgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDMlIgICAgICAgIEFEQzJURVJTVCAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzTUMxICAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM01DMiAgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNNQzMgICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzTUM0ICAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM01QRVIgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNFRVYxICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzRUVWMiAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM0VFVjMgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNFRVY0ICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzRUVWNSAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM1RBQzIgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNUQUMzICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzVEFDNCAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM1RBUEVSICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNUQVJTVCAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzVEJDMiAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM1RCQzMgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNUQkM0ICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzVEJQRVIgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM1RCUlNUICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNUQ0MyICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzVENDMyAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM1RDQzQgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNUQ1BFUiAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzVERDMiAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM1REQzMgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNUREM0ICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzVERQRVIgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM1RFQzIgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDM1IgICAgICAgIEFEQzNURUMzICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzNSICAgICAgICBBREMzVEVDNCAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREMzUiAgICAgICAgQURDM1RFUEVSICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRNQzEgICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0TUMyICAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNE1DMyAgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRNQzQgICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0TVBFUiAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNEVFVjYgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRFRVY3ICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0RUVWOCAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNEVFVjkgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRFRVYxMCAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0VEFDMiAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNFRBQzMgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRUQUM0ICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0VEFQRVIgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNFRCQzIgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRUQkMzICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0VEJDNCAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNFRCUEVSICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRUQ0MyICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0VENDMyAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNFRDQzQgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRUQ1BFUiAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0VENSU1QgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNFREQzIgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRUREMzICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0VERDNCAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNFREUEVSICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRURFJTVCAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0VEVDMiAgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyY1xuCisgICogICAgICAgICBBREM0UiAgICAgICAgQURDNFRFQzMgICAgICAgIExMX0hSVElNX0dldEFEQ1RyaWdTcmNcbgorICAqICAgICAgICAgQURDNFIgICAgICAgIEFEQzRURUM0ICAgICAgICBMTF9IUlRJTV9HZXRBRENUcmlnU3JjXG4KKyAgKiAgICAgICAgIEFEQzRSICAgICAgICBBREM0VEVSU1QgICAgICAgTExfSFJUSU1fR2V0QURDVHJpZ1NyYworICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQURDVHJpZyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfNAorICAqIEByZXR2YWwgU3JjIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqCisgICogICAgICAgICBGb3IgQURDIHRyaWdnZXIgMSBhbmQgQURDIHRyaWdnZXIgMzoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzEzX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzEzX01DTVAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19NQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfTUNNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzEzX01DTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19NUEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1BQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfVElNQUNNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzEzX1RJTUFDTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1BUEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19FRVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19FRVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19FRVYzCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19FRVY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19FRVY1CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1BUlNUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1CQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfVElNQkNNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzEzX1RJTUJDTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1CUEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1CUlNUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1DQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfVElNQ0NNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzEzX1RJTUNDTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1DUEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1EQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfVElNRENNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzEzX1RJTURDTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1EUEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1FQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMTNfVElNRUNNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzEzX1RJTUVDTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMxM19USU1FUEVSCisgICoKKyAgKiAgICAgICAgIEZvciBBREMgdHJpZ2dlciAyIGFuZCBBREMgdHJpZ2dlciA0OgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfTUNNUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X01DTVAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9NQ01QMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfTUNNUDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X01QRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X0VFVjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X0VFVjcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X0VFVjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X0VFVjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X0VFVjEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1BQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfVElNQUNNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X1RJTUFDTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1BUEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1CQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfVElNQkNNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X1RJTUJDTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1CUEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1DQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfVElNQ0NNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X1RJTUNDTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1DUEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1DUlNUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1EQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfVElNRENNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X1RJTURDTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1EUEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1EUlNUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1FQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0FEQ1RSSUdfU1JDMjRfVElNRUNNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9BRENUUklHX1NSQzI0X1RJTUVDTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQURDVFJJR19TUkMyNF9USU1FUlNUCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fR2V0QURDVHJpZ1NyYyhIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IEFEQ1RyaWcpCit7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c0NvbW1vblJlZ3MuQURDMVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9BREN4UltBRENUcmlnXSkpOworICByZXR1cm4gKCpwUmVnKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIERMTCBjYWxpYnJhdGlvbiBtb2RlLgorICAqIEBybXRvbGwgRExMQ1IgICAgICAgIENBTEVOICAgICAgICAgTExfSFJUSU1fQ29uZmlnRExMQ2FsaWJyYXRpb25cbgorICAqICAgICAgICAgRExMQ1IgICAgICAgIENBTFJURSAgICAgICAgTExfSFJUSU1fQ29uZmlnRExMQ2FsaWJyYXRpb24KKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIE1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9ETExDQUxJQlJBVElPTl9NT0RFX1NJTkdMRVNIT1QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9ETExDQUxJQlJBVElPTl9NT0RFX0NPTlRJTlVPVVMKKyAgICogQHBhcmFtICBQZXJpb2QgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9ETExDQUxJQlJBVElPTl9SQVRFXzczMDAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9ETExDQUxJQlJBVElPTl9SQVRFXzkxMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0RMTENBTElCUkFUSU9OX1JBVEVfMTE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRExMQ0FMSUJSQVRJT05fUkFURV8xNAorICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9Db25maWdETExDYWxpYnJhdGlvbihIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IE1vZGUsIHVpbnQzMl90IFBlcmlvZCkKK3sKKyAgTU9ESUZZX1JFRyhIUlRJTXgtPnNDb21tb25SZWdzLkRMTENSLCAoSFJUSU1fRExMQ1JfQ0FMRU4gfCBIUlRJTV9ETExDUl9DQUxSVEUpLCAoTW9kZSB8IFBlcmlvZCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIExhdW5jaCBETEwgY2FsaWJyYXRpb24KKyAgKiBAcm10b2xsIERMTENSICAgICAgICBDQUwgICAgICAgICAgIExMX0hSVElNX1N0YXJ0RExMQ2FsaWJyYXRpb24KKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX1N0YXJ0RExMQ2FsaWJyYXRpb24oSFJUSU1fVHlwZURlZiAqSFJUSU14KQoreworICBTRVRfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuRExMQ1IsIEhSVElNX0RMTENSX0NBTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRUZfSFJUSU1fVGltZXJfQ29udHJvbCBIUlRJTV9UaW1lcl9Db250cm9sCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGltZXIocykgY291bnRlci4KKyAgKiBAcm10b2xsIE1ESUVSICAgICAgICBURUNFTiAgICAgICAgIExMX0hSVElNX1RJTV9Db3VudGVyRW5hYmxlXG4KKyAgKiAgICAgICAgIE1ESUVSICAgICAgICBURENFTiAgICAgICAgIExMX0hSVElNX1RJTV9Db3VudGVyRW5hYmxlXG4KKyAgKiAgICAgICAgIE1ESUVSICAgICAgICBUQ0NFTiAgICAgICAgIExMX0hSVElNX1RJTV9Db3VudGVyRW5hYmxlXG4KKyAgKiAgICAgICAgIE1ESUVSICAgICAgICBUQkNFTiAgICAgICAgIExMX0hSVElNX1RJTV9Db3VudGVyRW5hYmxlXG4KKyAgKiAgICAgICAgIE1ESUVSICAgICAgICBUQUNFTiAgICAgICAgIExMX0hSVElNX1RJTV9Db3VudGVyRW5hYmxlXG4KKyAgKiAgICAgICAgIE1ESUVSICAgICAgICBNQ0VOICAgICAgICAgIExMX0hSVElNX1RJTV9Db3VudGVyRW5hYmxlCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lcnMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfTUFTVEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX1RJTV9Db3VudGVyRW5hYmxlKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXJzKQoreworICBTRVRfQklUKEhSVElNeC0+c01hc3RlclJlZ3MuTUNSLCBUaW1lcnMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGltZXIocykgY291bnRlci4KKyAgKiBAcm10b2xsIE1ESUVSICAgICAgICBURUNFTiAgICAgICAgIExMX0hSVElNX1RJTV9Db3VudGVyRGlzYWJsZVxuCisgICogICAgICAgICBNRElFUiAgICAgICAgVERDRU4gICAgICAgICBMTF9IUlRJTV9USU1fQ291bnRlckRpc2FibGVcbgorICAqICAgICAgICAgTURJRVIgICAgICAgIFRDQ0VOICAgICAgICAgTExfSFJUSU1fVElNX0NvdW50ZXJEaXNhYmxlXG4KKyAgKiAgICAgICAgIE1ESUVSICAgICAgICBUQkNFTiAgICAgICAgIExMX0hSVElNX1RJTV9Db3VudGVyRGlzYWJsZVxuCisgICogICAgICAgICBNRElFUiAgICAgICAgVEFDRU4gICAgICAgICBMTF9IUlRJTV9USU1fQ291bnRlckRpc2FibGVcbgorICAqICAgICAgICAgTURJRVIgICAgICAgIE1DRU4gICAgICAgICAgTExfSFJUSU1fVElNX0NvdW50ZXJEaXNhYmxlCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lcnMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfTUFTVEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX1RJTV9Db3VudGVyRGlzYWJsZShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVycykKK3sKKyAgQ0xFQVJfQklUKEhSVElNeC0+c01hc3RlclJlZ3MuTUNSLCBUaW1lcnMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdGhlIHRpbWVyIGNvdW50ZXIgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIE1ESUVSICAgICAgICBURUNFTiAgICAgICAgIExMX0hSVElNX1RJTV9Jc0NvdW50ZXJFbmFibGVkXG4KKyAgKiAgICAgICAgIE1ESUVSICAgICAgICBURENFTiAgICAgICAgIExMX0hSVElNX1RJTV9Jc0NvdW50ZXJFbmFibGVkXG4KKyAgKiAgICAgICAgIE1ESUVSICAgICAgICBUQ0NFTiAgICAgICAgIExMX0hSVElNX1RJTV9Jc0NvdW50ZXJFbmFibGVkXG4KKyAgKiAgICAgICAgIE1ESUVSICAgICAgICBUQkNFTiAgICAgICAgIExMX0hSVElNX1RJTV9Jc0NvdW50ZXJFbmFibGVkXG4KKyAgKiAgICAgICAgIE1ESUVSICAgICAgICBUQUNFTiAgICAgICAgIExMX0hSVElNX1RJTV9Jc0NvdW50ZXJFbmFibGVkXG4KKyAgKiAgICAgICAgIE1ESUVSICAgICAgICBNQ0VOICAgICAgICAgIExMX0hSVElNX1RJTV9Jc0NvdW50ZXJFbmFibGVkCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBTdGF0ZSBvZiBNQ0VOIG9yIFR4Q0VOIGJpdCBIUlRJTV9NQ1IgcmVnaXN0ZXIgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fVElNX0lzQ291bnRlckVuYWJsZWQoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChIUlRJTXgtPnNNYXN0ZXJSZWdzLk1DUiwgVGltZXIpID09IChUaW1lcikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgdGltZXIgY2xvY2sgcHJlc2NhbGVyIHJhdGlvLgorICAqIEBybXRvbGwgTUNSICAgICAgICBDS1BTQyAgICAgICAgIExMX0hSVElNX1RJTV9TZXRQcmVzY2FsZXJcbgorICAqICAgICAgICAgVElNeENSICAgICBDS1BTQyAgICAgICAgIExMX0hSVElNX1RJTV9TZXRQcmVzY2FsZXIKKyAgKiBAbm90ZSBUaGUgY291bnRlciBjbG9jayBlcXVpdmFsZW50IGZyZXF1ZW5jeSAoQ0tfQ05UKSBpcyBlcXVhbCB0byBmSFJDSyAvIDJeQ0tQU0NbMjowXS4KKyAgKiBAbm90ZSBUaGUgcHJlc2NhbGluZyByYXRpbyBjYW5ub3QgYmUgbW9kaWZpZWQgb25jZSB0aGUgdGltZXIgY291bnRlciBpcyBlbmFibGVkLgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEBwYXJhbSAgUHJlc2NhbGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fUFJFU0NBTEVSUkFUSU9fTVVMMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9QUkVTQ0FMRVJSQVRJT19NVUwxNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1BSRVNDQUxFUlJBVElPX01VTDgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9QUkVTQ0FMRVJSQVRJT19NVUw0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fUFJFU0NBTEVSUkFUSU9fTVVMMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1BSRVNDQUxFUlJBVElPX0RJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9QUkVTQ0FMRVJSQVRJT19ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fUFJFU0NBTEVSUkFUSU9fRElWNAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fVElNX1NldFByZXNjYWxlcihIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyLCB1aW50MzJfdCBQcmVzY2FsZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NQ1IpICsgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBNT0RJRllfUkVHKCpwUmVnLCBIUlRJTV9NQ1JfQ0tfUFNDLCBQcmVzY2FsZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgdGltZXIgY2xvY2sgcHJlc2NhbGVyIHJhdGlvCisgICogQHJtdG9sbCBNQ1IgICAgICAgIENLUFNDICAgICAgICAgTExfSFJUSU1fVElNX0dldFByZXNjYWxlclxuCisgICogICAgICAgICBUSU14Q1IgICAgIENLUFNDICAgICAgICAgTExfSFJUSU1fVElNX0dldFByZXNjYWxlcgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgUHJlc2NhbGVyIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fUFJFU0NBTEVSUkFUSU9fTVVMMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9QUkVTQ0FMRVJSQVRJT19NVUwxNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1BSRVNDQUxFUlJBVElPX01VTDgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9QUkVTQ0FMRVJSQVRJT19NVUw0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fUFJFU0NBTEVSUkFUSU9fTVVMMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1BSRVNDQUxFUlJBVElPX0RJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9QUkVTQ0FMRVJSQVRJT19ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fUFJFU0NBTEVSUkFUSU9fRElWNAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX1RJTV9HZXRQcmVzY2FsZXIoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1DUikgKyBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsIEhSVElNX01DUl9DS19QU0MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGNvdW50ZXIgb3BlcmF0aW5nIG1vZGUgbW9kZSAoc2luZ2xlLXNob3QsIGNvbnRpbnVvdXMgb3IgcmUtdHJpZ2dlcmFibGUpLgorICAqIEBybXRvbGwgTUNSICAgICAgICBDT05UICAgICAgICAgTExfSFJUSU1fVElNX1NldENvdW50ZXJNb2RlXG4KKyAgKiAgICAgICAgIE1DUiAgICAgICAgUkVUUklHICAgICAgIExMX0hSVElNX1RJTV9TZXRDb3VudGVyTW9kZVxuCisgICogICAgICAgICBUSU14Q1IgICAgIENPTlQgICAgICAgICBMTF9IUlRJTV9USU1fU2V0Q291bnRlck1vZGVcbgorICAqICAgICAgICAgVElNeENSICAgICBSRVRSSUcgICAgICAgTExfSFJUSU1fVElNX1NldENvdW50ZXJNb2RlCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHBhcmFtICBNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fTU9ERV9DT05USU5VT1VTCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fTU9ERV9TSU5HTEVTSE9UCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fTU9ERV9SRVRSSUdHRVJBQkxFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9USU1fU2V0Q291bnRlck1vZGUoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lciwgdWludDMyX3QgTW9kZSkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1DUikgKyBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIE1PRElGWV9SRUcoKnBSZWcsIChIUlRJTV9USU1DUl9SRVRSSUcgfCBIUlRJTV9NQ1JfQ09OVCksIE1vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgY291bnRlciBvcGVyYXRpbmcgbW9kZSBtb2RlCisgICogQHJtdG9sbCBNQ1IgICAgICAgIENPTlQgICAgICAgICBMTF9IUlRJTV9USU1fR2V0Q291bnRlck1vZGVcbgorICAqICAgICAgICAgTUNSICAgICAgICBSRVRSSUcgICAgICAgTExfSFJUSU1fVElNX0dldENvdW50ZXJNb2RlXG4KKyAgKiAgICAgICAgIFRJTXhDUiAgICAgQ09OVCAgICAgICAgIExMX0hSVElNX1RJTV9HZXRDb3VudGVyTW9kZVxuCisgICogICAgICAgICBUSU14Q1IgICAgIFJFVFJJRyAgICAgICBMTF9IUlRJTV9USU1fR2V0Q291bnRlck1vZGUKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfTUFTVEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIE1vZGUgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9NT0RFX0NPTlRJTlVPVVMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9NT0RFX1NJTkdMRVNIT1QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9NT0RFX1JFVFJJR0dFUkFCTEUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9USU1fR2V0Q291bnRlck1vZGUoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1DUikgKyBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsIChIUlRJTV9NQ1JfUkVUUklHIHwgSFJUSU1fTUNSX0NPTlQpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBoYWxmIGR1dHktY3ljbGUgbW9kZS4KKyAgKiBAcm10b2xsIE1DUiAgICAgICAgSEFMRiAgICAgICAgIExMX0hSVElNX1RJTV9FbmFibGVIYWxmTW9kZVxuCisgICogICAgICAgICBUSU14Q1IgICAgIEhBTEYgICAgICAgICBMTF9IUlRJTV9USU1fRW5hYmxlSGFsZk1vZGUKKyAgKiBAbm90ZSBXaGVuIHRoZSBoYWxmIG1vZGUgaXMgZW5hYmxlZCwgSFJUSU1fTUNNUDFSIChvciBIUlRJTV9DTVAxeFIpCisgICogICAgICAgYWN0aXZlIHJlZ2lzdGVyIGlzIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCB3aXRoIEhSVElNX01QRVIvMgorICAqICAgICAgIChvciBIUlRJTV9QRVJ4Ui8yKSB2YWx1ZSB3aGVuIEhSVElNX01QRVIgKG9yIEhSVElNX1BFUnhSKSByZWdpc3RlciBpcyB3cml0dGVuLgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fVElNX0VuYWJsZUhhbGZNb2RlKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NQ1IpICsgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBTRVRfQklUKCpwUmVnLCBIUlRJTV9NQ1JfSEFMRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgaGFsZiBkdXR5LWN5Y2xlIG1vZGUuCisgICogQHJtdG9sbCBNQ1IgICAgICAgIEhBTEYgICAgICAgICBMTF9IUlRJTV9USU1fRGlzYWJsZUhhbGZNb2RlXG4KKyAgKiAgICAgICAgIFRJTXhDUiAgICAgSEFMRiAgICAgICAgIExMX0hSVElNX1RJTV9EaXNhYmxlSGFsZk1vZGUKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfTUFTVEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX1RJTV9EaXNhYmxlSGFsZk1vZGUoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1DUikgKyBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIENMRUFSX0JJVCgqcFJlZywgSFJUSU1fTUNSX0hBTEYpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgaGFsZiBkdXR5LWN5Y2xlIG1vZGUgaXMgZW5hYmxlZCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIE1DUiAgICAgICAgSEFMRiAgICAgICAgIExMX0hSVElNX1RJTV9Jc0VuYWJsZWRIYWxmTW9kZVxuCisgICogICAgICAgICBUSU14Q1IgICAgIEhBTEYgICAgICAgICBMTF9IUlRJTV9USU1fSXNFbmFibGVkSGFsZk1vZGUKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfTUFTVEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIEhBTEYgYml0IHRvIDEgaW4gSFJUSU1fTUNSIG9yIEhSVElNX1RJTXhDUiByZWdpc3RlciAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9USU1fSXNFbmFibGVkSGFsZk1vZGUoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1DUikgKyBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsIEhSVElNX01DUl9IQUxGKSA9PSBIUlRJTV9NQ1JfSEFMRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSB0aW1lciBzdGFydCB3aGVuIHJlY2VpdmluZyBhIHN5bmNocm9uaXphdGlvbiBpbnB1dCBldmVudC4KKyAgKiBAcm10b2xsIE1DUiAgICAgICAgU1lOQ1NUUlRNICAgICAgICBMTF9IUlRJTV9USU1fRW5hYmxlU3RhcnRPblN5bmNcbgorICAqICAgICAgICAgVElNeENSICAgICBTWU5TVFJUQSAgICAgICAgIExMX0hSVElNX1RJTV9FbmFibGVTdGFydE9uU3luYworICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fVElNX0VuYWJsZVN0YXJ0T25TeW5jKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NQ1IpICsgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBTRVRfQklUKCpwUmVnLCBIUlRJTV9NQ1JfU1lOQ1NUUlRNKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSB0aW1lciBzdGFydCB3aGVuIHJlY2VpdmluZyBhIHN5bmNocm9uaXphdGlvbiBpbnB1dCBldmVudC4KKyAgKiBAcm10b2xsIE1DUiAgICAgICAgU1lOQ1NUUlRNICAgICAgICBMTF9IUlRJTV9USU1fRGlzYWJsZVN0YXJ0T25TeW5jXG4KKyAgKiAgICAgICAgIFRJTXhDUiAgICAgU1lOU1RSVEEgICAgICAgICBMTF9IUlRJTV9USU1fRGlzYWJsZVN0YXJ0T25TeW5jCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9USU1fRGlzYWJsZVN0YXJ0T25TeW5jKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NQ1IpICsgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBDTEVBUl9CSVQoKnBSZWcsIEhSVElNX01DUl9TWU5DU1RSVE0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdGhlIHRpbWVyIHN0YXJ0IHdoZW4gcmVjZWl2aW5nIGEgc3luY2hyb25pemF0aW9uIGlucHV0IGV2ZW50LgorICAqIEBybXRvbGwgTUNSICAgICAgICBTWU5DU1RSVE0gICAgICAgIExMX0hSVElNX1RJTV9Jc0VuYWJsZWRTdGFydE9uU3luY1xuCisgICogICAgICAgICBUSU14Q1IgICAgIFNZTlNUUlRBICAgICAgICAgTExfSFJUSU1fVElNX0lzRW5hYmxlZFN0YXJ0T25TeW5jCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBTdGF0ZSBvZiBTWU5DU1RSVHggYml0IGluIEhSVElNX01DUiBvciBIUlRJTV9USU14Q1IgcmVnaXN0ZXIgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fVElNX0lzRW5hYmxlZFN0YXJ0T25TeW5jKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NQ1IpICsgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9NQ1JfU1lOQ1NUUlRNKSA9PSBIUlRJTV9NQ1JfU1lOQ1NUUlRNKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIHRpbWVyIHJlc2V0IHdoZW4gcmVjZWl2aW5nIGEgc3luY2hyb25pemF0aW9uIGlucHV0IGV2ZW50LgorICAqIEBybXRvbGwgTUNSICAgICAgICBTWU5DUlNUTSAgICAgICAgTExfSFJUSU1fVElNX0VuYWJsZVJlc2V0T25TeW5jXG4KKyAgKiAgICAgICAgIFRJTXhDUiAgICAgU1lOQ1JTVEEgICAgICAgIExMX0hSVElNX1RJTV9FbmFibGVSZXNldE9uU3luYworICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fVElNX0VuYWJsZVJlc2V0T25TeW5jKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NQ1IpICsgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBTRVRfQklUKCpwUmVnLCBIUlRJTV9NQ1JfU1lOQ1JTVE0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIHRpbWVyIHJlc2V0IHdoZW4gcmVjZWl2aW5nIGEgc3luY2hyb25pemF0aW9uIGlucHV0IGV2ZW50LgorICAqIEBybXRvbGwgTUNSICAgICAgICBTWU5DUlNUTSAgICAgICAgTExfSFJUSU1fVElNX0Rpc2FibGVSZXNldE9uU3luY1xuCisgICogICAgICAgICBUSU14Q1IgICAgIFNZTkNSU1RBICAgICAgICBMTF9IUlRJTV9USU1fRGlzYWJsZVJlc2V0T25TeW5jCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9USU1fRGlzYWJsZVJlc2V0T25TeW5jKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NQ1IpICsgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBDTEVBUl9CSVQoKnBSZWcsIEhSVElNX01DUl9TWU5DUlNUTSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciB0aGUgdGltZXIgcmVzZXQgd2hlbiByZWNlaXZpbmcgYSBzeW5jaHJvbml6YXRpb24gaW5wdXQgZXZlbnQuCisgICogQHJtdG9sbCBNQ1IgICAgICAgIFNZTkNSU1RNICAgICAgICBMTF9IUlRJTV9USU1fSXNFbmFibGVkUmVzZXRPblN5bmNcbgorICAqICAgICAgICAgVElNeENSICAgICBTWU5DUlNUQSAgICAgICAgTExfSFJUSU1fVElNX0lzRW5hYmxlZFJlc2V0T25TeW5jCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fVElNX0lzRW5hYmxlZFJlc2V0T25TeW5jKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NQ1IpICsgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9NQ1JfU1lOQ1JTVE0pID09IEhSVElNX01DUl9TWU5DUlNUTSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBIUlRJTSBvdXRwdXQgdGhlIERBQyBzeW5jaHJvbml6YXRpb24gZXZlbnQgaXMgZ2VuZXJhdGVkIG9uIChEQUN0cmlnT3V0eCkuCisgICogQHJtdG9sbCBNQ1IgICAgICAgIERBQ1NZTkMgICAgICAgIExMX0hSVElNX1RJTV9TZXREQUNUcmlnXG4KKyAgKiAgICAgICAgIFRJTXhDUiAgICAgREFDU1lOQyAgICAgICAgTExfSFJUSU1fVElNX1NldERBQ1RyaWcKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfTUFTVEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcGFyYW0gIERBQ1RyaWcgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9EQUNUUklHX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9EQUNUUklHX0RBQ1RSSUdPVVRfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0RBQ1RSSUdfREFDVFJJR09VVF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fREFDVFJJR19EQUNUUklHT1VUXzMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX1RJTV9TZXREQUNUcmlnKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIsIHVpbnQzMl90IERBQ1RyaWcpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NQ1IpICsgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBNT0RJRllfUkVHKCpwUmVnLCBIUlRJTV9NQ1JfREFDU1lOQywgREFDVHJpZyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBIUlRJTSBvdXRwdXQgdGhlIERBQyBzeW5jaHJvbml6YXRpb24gZXZlbnQgaXMgZ2VuZXJhdGVkIG9uIChEQUN0cmlnT3V0eCkuCisgICogQHJtdG9sbCBNQ1IgICAgICAgIERBQ1NZTkMgICAgICAgIExMX0hSVElNX1RJTV9HZXREQUNUcmlnXG4KKyAgKiAgICAgICAgIFRJTXhDUiAgICAgREFDU1lOQyAgICAgICAgTExfSFJUSU1fVElNX0dldERBQ1RyaWcKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfTUFTVEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIERBQ1RyaWcgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9EQUNUUklHX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9EQUNUUklHX0RBQ1RSSUdPVVRfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0RBQ1RSSUdfREFDVFJJR09VVF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fREFDVFJJR19EQUNUUklHT1VUXzMKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9USU1fR2V0REFDVHJpZyhIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTUNSKSArIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgSFJUSU1fTUNSX0RBQ1NZTkMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIHRpbWVyIHJlZ2lzdGVycyBwcmVsb2FkIG1lY2hhbmlzbS4KKyAgKiBAcm10b2xsIE1DUiAgICAgICAgUFJFRU4gICAgICAgIExMX0hSVElNX1RJTV9FbmFibGVQcmVsb2FkXG4KKyAgKiAgICAgICAgIFRJTXhDUiAgICAgUFJFRU4gICAgICAgIExMX0hSVElNX1RJTV9FbmFibGVQcmVsb2FkCisgICogQG5vdGUgV2hlbiB0aGUgcHJlbG9hZCBtb2RlIGlzIGVuYWJsZWQsIGFjY2Vzc2VkIHJlZ2lzdGVycyBhcmUgc2hhZG93IHJlZ2lzdGVycy4KKyAgKiAgICAgICBUaGVpciBjb250ZW50IGlzIHRyYW5zZmVycmVkIGludG8gdGhlIGFjdGl2ZSByZWdpc3RlciBhZnRlciBhbiB1cGRhdGUgcmVxdWVzdCwKKyAgKiAgICAgICBlaXRoZXIgc29mdHdhcmUgb3Igc3luY2hyb25pemVkIHdpdGggYW4gZXZlbnQuCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9USU1fRW5hYmxlUHJlbG9hZChIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTUNSKSArIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgU0VUX0JJVCgqcFJlZywgSFJUSU1fTUNSX1BSRUVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSB0aW1lciByZWdpc3RlcnMgcHJlbG9hZCBtZWNoYW5pc20uCisgICogQHJtdG9sbCBNQ1IgICAgICAgIFBSRUVOICAgICAgICBMTF9IUlRJTV9USU1fRGlzYWJsZVByZWxvYWRcbgorICAqICAgICAgICAgVElNeENSICAgICBQUkVFTiAgICAgICAgTExfSFJUSU1fVElNX0Rpc2FibGVQcmVsb2FkCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9USU1fRGlzYWJsZVByZWxvYWQoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1DUikgKyBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIENMRUFSX0JJVCgqcFJlZywgSFJUSU1fTUNSX1BSRUVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSB0aW1lciByZWdpc3RlcnMgcHJlbG9hZCBtZWNoYW5pc20gaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIE1DUiAgICAgICAgUFJFRU4gICAgICAgIExMX0hSVElNX1RJTV9Jc0VuYWJsZWRQcmVsb2FkXG4KKyAgKiAgICAgICAgIFRJTXhDUiAgICAgUFJFRU4gICAgICAgIExMX0hSVElNX1RJTV9Jc0VuYWJsZWRQcmVsb2FkCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBTdGF0ZSBvZiBQUkVFTiBiaXQgaW4gSFJUSU1fTUNSIG9yIEhSVElNX1RJTXhDUiByZWdpc3RlciAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9USU1fSXNFbmFibGVkUHJlbG9hZChIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTUNSKSArIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgSFJUSU1fTUNSX1BSRUVOKSA9PSBIUlRJTV9NQ1JfUFJFRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgdGltZXIgcmVnaXN0ZXIgdXBkYXRlIHRyaWdnZXIuCisgICogQHJtdG9sbCBNQ1IgICAgICAgICAgIE1SRVBVICAgICAgTExfSFJUSU1fVElNX1NldFVwZGF0ZVRyaWdcbgorICAqICAgICAgICAgVElNeENSICAgICAgICBUQVUgICAgICAgIExMX0hSVElNX1RJTV9TZXRVcGRhdGVUcmlnXG4KKyAgKiAgICAgICAgIFRJTXhDUiAgICAgICAgVEJVICAgICAgICBMTF9IUlRJTV9USU1fU2V0VXBkYXRlVHJpZ1xuCisgICogICAgICAgICBUSU14Q1IgICAgICAgIFRDVSAgICAgICAgTExfSFJUSU1fVElNX1NldFVwZGF0ZVRyaWdcbgorICAqICAgICAgICAgVElNeENSICAgICAgICBURFUgICAgICAgIExMX0hSVElNX1RJTV9TZXRVcGRhdGVUcmlnXG4KKyAgKiAgICAgICAgIFRJTXhDUiAgICAgICAgVEVVICAgICAgICBMTF9IUlRJTV9USU1fU2V0VXBkYXRlVHJpZ1xuCisgICogICAgICAgICBUSU14Q1IgICAgICAgIE1TVFUgICAgICAgTExfSFJUSU1fVElNX1NldFVwZGF0ZVRyaWcKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfTUFTVEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcGFyYW0gIFVwZGF0ZVRyaWcgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKgorICAqICAgICAgICAgRm9yIHRoZSBtYXN0ZXIgdGltZXIgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9VUERBVEVUUklHX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9VUERBVEVUUklHX1JFUEVUSVRJT04KKyAgKgorICAqICAgICAgICAgRm9yIHRpbWVyIEEuLkUgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1VQREFURVRSSUdfTk9ORQorICAqICAgICAgICAgb3IgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9VUERBVEVUUklHX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1VQREFURVRSSUdfVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1VQREFURVRSSUdfVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1VQREFURVRSSUdfVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1VQREFURVRSSUdfVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1VQREFURVRSSUdfVElNRVJfRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1VQREFURVRSSUdfUkVQRVRJVElPTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1VQREFURVRSSUdfUkVTRVQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX1RJTV9TZXRVcGRhdGVUcmlnKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIsIHVpbnQzMl90IFVwZGF0ZVRyaWcpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NQ1IpICsgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBNT0RJRllfUkVHKCpwUmVnLCBSRUdfTUFTS19UQUJfVVBEQVRFVFJJR1tpVGltZXJdLCBVcGRhdGVUcmlnIDw8IFJFR19TSElGVF9UQUJfVVBEQVRFVFJJR1tpVGltZXJdKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHRpbWVyIHJlZ2lzdGVyIHVwZGF0ZSB0cmlnZ2VyLgorICAqIEBybXRvbGwgTUNSICAgICAgICAgICBNUkVQVSAgICAgIExMX0hSVElNX1RJTV9HZXRVcGRhdGVUcmlnXG4KKyAgKiAgICAgICAgIFRJTXhDUiAgICAgICAgVEJVICAgICAgICBMTF9IUlRJTV9USU1fR2V0VXBkYXRlVHJpZ1xuCisgICogICAgICAgICBUSU14Q1IgICAgICAgIFRDVSAgICAgICAgTExfSFJUSU1fVElNX0dldFVwZGF0ZVRyaWdcbgorICAqICAgICAgICAgVElNeENSICAgICAgICBURFUgICAgICAgIExMX0hSVElNX1RJTV9HZXRVcGRhdGVUcmlnXG4KKyAgKiAgICAgICAgIFRJTXhDUiAgICAgICAgVEVVICAgICAgICBMTF9IUlRJTV9USU1fR2V0VXBkYXRlVHJpZ1xuCisgICogICAgICAgICBUSU14Q1IgICAgICAgIE1TVFUgICAgICAgTExfSFJUSU1fVElNX0dldFVwZGF0ZVRyaWcKKyAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgVXBkYXRlVHJpZyBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqCisgICogICAgICAgICBGb3IgdGhlIG1hc3RlciB0aW1lciB0aGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1VQREFURVRSSUdfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1VQREFURVRSSUdfUkVQRVRJVElPTgorICAqCisgICogICAgICAgICBGb3IgdGltZXIgQS4uRSB0aGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVVBEQVRFVFJJR19OT05FCisgICogICAgICAgICBvciBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1VQREFURVRSSUdfTUFTVEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVVBEQVRFVFJJR19USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVVBEQVRFVFJJR19USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVVBEQVRFVFJJR19USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVVBEQVRFVFJJR19USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVVBEQVRFVFJJR19USU1FUl9FCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVVBEQVRFVFJJR19SRVBFVElUSU9OCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVVBEQVRFVFJJR19SRVNFVAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX1RJTV9HZXRVcGRhdGVUcmlnKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NQ1IpICsgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBSRUdfTUFTS19UQUJfVVBEQVRFVFJJR1tpVGltZXJdKSA+PiAgUkVHX1NISUZUX1RBQl9VUERBVEVUUklHW2lUaW1lcl0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCAgdGhlIHRpbWVyIHJlZ2lzdGVycyB1cGRhdGUgY29uZGl0aW9uIChob3cgdGhlIHJlZ2lzdGVycyB1cGRhdGUgb2NjdXJzIHJlbGF0aXZlbHkgdG8gdGhlIGJ1cnN0IERNQSAgdHJhbnNhY3Rpb24gb3IgYW4gZXh0ZXJuYWwgdXBkYXRlIHJlcXVlc3QgcmVjZWl2ZWQgb24gb25lIG9mIHRoZSB1cGRhdGUgZW5hYmxlIGlucHV0cyAoVVBEX0VOWzM6MV0pKS4KKyAgKiBAcm10b2xsIE1DUiAgICAgICAgICAgQlJTVERNQSAgICAgIExMX0hSVElNX1RJTV9TZXRVcGRhdGVHYXRpbmdcbgorICAqICAgICAgICAgVElNeENSICAgICAgICBVUERHQVQgICAgICAgTExfSFJUSU1fVElNX1NldFVwZGF0ZUdhdGluZworICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEBwYXJhbSAgVXBkYXRlR2F0aW5nIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICoKKyAgKiAgICAgICAgIEZvciB0aGUgbWFzdGVyIHRpbWVyIHRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVVBEQVRFR0FUSU5HX0lOREVQRU5ERU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVVBEQVRFR0FUSU5HX0RNQUJVUlNUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVVBEQVRFR0FUSU5HX0RNQUJVUlNUX1VQREFURQorICAqCisgICogICAgICAgICBGb3IgdGhlIHRpbWVyIEEuLkUgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9VUERBVEVHQVRJTkdfSU5ERVBFTkRFTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9VUERBVEVHQVRJTkdfRE1BQlVSU1QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9VUERBVEVHQVRJTkdfRE1BQlVSU1RfVVBEQVRFCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVVBEQVRFR0FUSU5HX1VQREVOMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1VQREFURUdBVElOR19VUERFTjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9VUERBVEVHQVRJTkdfVVBERU4zCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVVBEQVRFR0FUSU5HX1VQREVOMV9VUERBVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9VUERBVEVHQVRJTkdfVVBERU4yX1VQREFURQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1VQREFURUdBVElOR19VUERFTjNfVVBEQVRFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9USU1fU2V0VXBkYXRlR2F0aW5nKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIsIHVpbnQzMl90IFVwZGF0ZUdhdGluZykKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1DUikgKyBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIE1PRElGWV9SRUcoKnBSZWcsIFJFR19NQVNLX1RBQl9VUERBVEVHQVRJTkdbaVRpbWVyXSwgKFVwZGF0ZUdhdGluZyA8PCBSRUdfU0hJRlRfVEFCX1VQREFURUdBVElOR1tpVGltZXJdKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0ICB0aGUgdGltZXIgcmVnaXN0ZXJzIHVwZGF0ZSBjb25kaXRpb24uCisgICogQHJtdG9sbCBNQ1IgICAgICAgICAgIEJSU1RETUEgICAgICBMTF9IUlRJTV9USU1fR2V0VXBkYXRlR2F0aW5nXG4KKyAgKiAgICAgICAgIFRJTXhDUiAgICAgICAgVVBER0FUICAgICAgIExMX0hSVElNX1RJTV9HZXRVcGRhdGVHYXRpbmcKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfTUFTVEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIFVwZGF0ZUdhdGluZyBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqCisgICogICAgICAgICBGb3IgdGhlIG1hc3RlciB0aW1lciB0aGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1VQREFURUdBVElOR19JTkRFUEVOREVOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1VQREFURUdBVElOR19ETUFCVVJTVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1VQREFURUdBVElOR19ETUFCVVJTVF9VUERBVEUKKyAgKgorICAqICAgICAgICAgRm9yIHRoZSB0aW1lciBBLi5FIHRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVVBEQVRFR0FUSU5HX0lOREVQRU5ERU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVVBEQVRFR0FUSU5HX0RNQUJVUlNUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVVBEQVRFR0FUSU5HX0RNQUJVUlNUX1VQREFURQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1VQREFURUdBVElOR19VUERFTjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9VUERBVEVHQVRJTkdfVVBERU4yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVVBEQVRFR0FUSU5HX1VQREVOMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1VQREFURUdBVElOR19VUERFTjFfVVBEQVRFCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVVBEQVRFR0FUSU5HX1VQREVOMl9VUERBVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9VUERBVEVHQVRJTkdfVVBERU4zX1VQREFURQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX1RJTV9HZXRVcGRhdGVHYXRpbmcoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1DUikgKyBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsIFJFR19NQVNLX1RBQl9VUERBVEVHQVRJTkdbaVRpbWVyXSkgPj4gIFJFR19TSElGVF9UQUJfVVBEQVRFR0FUSU5HW2lUaW1lcl0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgcHVzaC1wdWxsIG1vZGUuCisgICogQHJtdG9sbCBUSU14Q1IgICAgICAgIFBTSFBMTCAgICAgICBMTF9IUlRJTV9USU1fRW5hYmxlUHVzaFB1bGxNb2RlCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9USU1fRW5hYmxlUHVzaFB1bGxNb2RlKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX1RBQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c1RpbWVyeFJlZ3NbMF0uVElNeENSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBTRVRfQklUKCpwUmVnLCBIUlRJTV9USU1DUl9QU0hQTEwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIHB1c2gtcHVsbCBtb2RlLgorICAqIEBybXRvbGwgVElNeENSICAgICAgICBQU0hQTEwgICAgICAgTExfSFJUSU1fVElNX0Rpc2FibGVQdXNoUHVsbE1vZGUKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX1RJTV9EaXNhYmxlUHVzaFB1bGxNb2RlKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX1RBQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c1RpbWVyeFJlZ3NbMF0uVElNeENSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBDTEVBUl9CSVQoKnBSZWcsIEhSVElNX1RJTUNSX1BTSFBMTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciB0aGUgcHVzaC1wdWxsIG1vZGUgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIFRJTXhDUiAgICAgICAgUFNIUExMICAgICAgIExMX0hSVElNX1RJTV9Jc0VuYWJsZWRQdXNoUHVsbE1vZGVcbgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgU3RhdGUgb2YgUFNIUExMIGJpdCBpbiBIUlRJTV9USU14Q1IgcmVnaXN0ZXIgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fVElNX0lzRW5hYmxlZFB1c2hQdWxsTW9kZShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9UQUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNUaW1lcnhSZWdzWzBdLlRJTXhDUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgSFJUSU1fVElNQ1JfUFNIUExMKSA9PSBIUlRJTV9USU1DUl9QU0hQTEwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgZnVuY3Rpb25pbmcgbW9kZSBvZiB0aGUgY29tcGFyZSB1bml0IChDTVAyIG9yIENNUDQgY2FuIG9wZXJhdGUgaW4gc3RhbmRhcmQgbW9kZSBvciBpbiBhdXRvIGRlbGF5ZWQgbW9kZSkuCisgICogQHJtdG9sbCBUSU14Q1IgICAgICAgIERFTENNUDIgICAgICAgTExfSFJUSU1fVElNX1NldENvbXBhcmVNb2RlXG4KKyAgKiAgICAgICAgIFRJTXhDUiAgICAgICAgREVMQ01QNCAgICAgICBMTF9IUlRJTV9USU1fU2V0Q29tcGFyZU1vZGUKKyAgKiBAbm90ZSBJbiBhdXRvLWRlbGF5ZWQgbW9kZSAgdGhlIGNvbXBhcmUgbWF0Y2ggb2NjdXJzIGluZGVwZW5kZW50bHkgZnJvbSB0aGUgdGltZXIgY291bnRlciB2YWx1ZS4KKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcGFyYW0gIENvbXBhcmVVbml0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ09NUEFSRVVOSVRfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NPTVBBUkVVTklUXzQKKyAgKiBAcGFyYW0gIE1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DT01QQVJFTU9ERV9SRUdVTEFSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ09NUEFSRU1PREVfREVMQVlfTk9USU1FT1VUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ09NUEFSRU1PREVfREVMQVlfQ01QMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NPTVBBUkVNT0RFX0RFTEFZX0NNUDMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX1RJTV9TZXRDb21wYXJlTW9kZShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyLCB1aW50MzJfdCBDb21wYXJlVW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBNb2RlKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9UQUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNUaW1lcnhSZWdzWzBdLlRJTXhDUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgcmVnaXN0ZXIgdWludDMyX3Qgc2hpZnQgPSBQT1NJVElPTl9WQUwoQ29tcGFyZVVuaXQpIC0gUE9TSVRJT05fVkFMKExMX0hSVElNX0NPTVBBUkVVTklUXzIpOworICBNT0RJRllfUkVHKCogcFJlZywgKEhSVElNX1RJTUNSX0RFTENNUDIgPDwgc2hpZnQpLCAoTW9kZSA8PCBzaGlmdCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgZnVuY3Rpb25pbmcgbW9kZSBvZiB0aGUgY29tcGFyZSB1bml0LgorICAqIEBybXRvbGwgVElNeENSICAgICAgICBERUxDTVAyICAgICAgIExMX0hSVElNX1RJTV9HZXRDb21wYXJlTW9kZVxuCisgICogICAgICAgICBUSU14Q1IgICAgICAgIERFTENNUDQgICAgICAgTExfSFJUSU1fVElNX0dldENvbXBhcmVNb2RlCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHBhcmFtICBDb21wYXJlVW5pdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NPTVBBUkVVTklUXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DT01QQVJFVU5JVF80CisgICogQHJldHZhbCBNb2RlIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ09NUEFSRU1PREVfUkVHVUxBUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NPTVBBUkVNT0RFX0RFTEFZX05PVElNRU9VVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NPTVBBUkVNT0RFX0RFTEFZX0NNUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DT01QQVJFTU9ERV9ERUxBWV9DTVAzCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fVElNX0dldENvbXBhcmVNb2RlKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIsIHVpbnQzMl90IENvbXBhcmVVbml0KQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9UQUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNUaW1lcnhSZWdzWzBdLlRJTXhDUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgcmVnaXN0ZXIgdWludDMyX3Qgc2hpZnQgPSBQT1NJVElPTl9WQUwoQ29tcGFyZVVuaXQpIC0gUE9TSVRJT05fVkFMKExMX0hSVElNX0NPTVBBUkVVTklUXzIpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCAoSFJUSU1fVElNQ1JfREVMQ01QMiA8PCBzaGlmdCkpID4+ICBzaGlmdCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSB0aW1lciBjb3VudGVyIHZhbHVlLgorICAqIEBybXRvbGwgTUNOVFIgICAgICAgIE1DTlQgICAgICAgTExfSFJUSU1fVElNX1NldENvdW50ZXJcbgorICAqICAgICAgICAgQ05UeFIgICAgICAgIENOVHggICAgICAgTExfSFJUSU1fVElNX1NldENvdW50ZXIKKyAgKiBAbm90ZSAgVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgdGltZXIgaXMgc3RvcHBlZC4KKyAgKiBAbm90ZSAgRm9yIEhSIGNsb2NrIHByZXNjYWxpbmcgcmF0aW8gYmVsb3cgMzIgKENLUFNDWzI6MF0gPCA1KSwgdGhlIGxlYXN0CisgICogICAgICAgIHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIGNvdW50ZXIgYXJlIG5vdCBzaWduaWZpY2FudC4gVGhleSBjYW5ub3QgYmUKKyAgKiAgICAgICAgd3JpdHRlbiBhbmQgcmV0dXJuIDAgd2hlbiByZWFkLgorICAqIEBub3RlIFRoZSB0aW1lciBiZWhhdmlvciBpcyBub3QgZ3VhcmFudGVlZCBpZiB0aGUgY291bnRlciB2YWx1ZSBpcyBzZXQgYWJvdmUKKyAgKiAgICAgICB0aGUgcGVyaW9kLgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEBwYXJhbSAgQ291bnRlciBWYWx1ZSBiZXR3ZWVuIDAgYW5kIDB4RkZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fVElNX1NldENvdW50ZXIoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lciwgdWludDMyX3QgQ291bnRlcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1DTlRSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBNT0RJRllfUkVHKCogcFJlZywgSFJUSU1fTUNOVFJfTUNOVFIsIENvdW50ZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgdGltZXIgY291bnRlciB2YWx1ZS4KKyAgKiBAcm10b2xsIE1DTlRSICAgICAgICBNQ05UICAgICAgIExMX0hSVElNX1RJTV9HZXRDb3VudGVyXG4KKyAgKiAgICAgICAgIENOVHhSICAgICAgICBDTlR4ICAgICAgIExMX0hSVElNX1RJTV9HZXRDb3VudGVyCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBDb3VudGVyIFZhbHVlIGJldHdlZW4gMCBhbmQgMHhGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fVElNX0dldENvdW50ZXIoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1DTlRSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9NQ05UUl9NQ05UUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgdGltZXIgcGVyaW9kIHZhbHVlLgorICAqIEBybXRvbGwgTVBFUiAgICAgICAgTVBFUiAgICAgICBMTF9IUlRJTV9USU1fU2V0UGVyaW9kXG4KKyAgKiAgICAgICAgIFBFUnhSICAgICAgIFBFUnggICAgICAgTExfSFJUSU1fVElNX1NldFBlcmlvZAorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEBwYXJhbSAgUGVyaW9kIFZhbHVlIGJldHdlZW4gMCBhbmQgMHhGRkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9USU1fU2V0UGVyaW9kKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIsIHVpbnQzMl90IFBlcmlvZCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1QRVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIE1PRElGWV9SRUcoKiBwUmVnLCBIUlRJTV9NUEVSX01QRVIsIFBlcmlvZCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCB0aW1lciBwZXJpb2QgdmFsdWUuCisgICogQHJtdG9sbCBNUEVSICAgICAgICBNUEVSICAgICAgIExMX0hSVElNX1RJTV9HZXRQZXJpb2RcbgorICAqICAgICAgICAgUEVSeFIgICAgICAgUEVSeCAgICAgICBMTF9IUlRJTV9USU1fR2V0UGVyaW9kCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBQZXJpb2QgVmFsdWUgYmV0d2VlbiAwIGFuZCAweEZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9USU1fR2V0UGVyaW9kKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NUEVSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9NUEVSX01QRVIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHRpbWVyIHJlcGV0aXRpb24gcGVyaW9kIHZhbHVlLgorICAqIEBybXRvbGwgTVJFUCAgICAgICAgTVJFUCAgICAgICBMTF9IUlRJTV9USU1fU2V0UmVwZXRpdGlvblxuCisgICogICAgICAgICBSRVB4UiAgICAgICBSRVB4ICAgICAgIExMX0hSVElNX1RJTV9TZXRSZXBldGl0aW9uCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHBhcmFtICBSZXBldGl0aW9uIFZhbHVlIGJldHdlZW4gMCBhbmQgMHhGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fVElNX1NldFJlcGV0aXRpb24oSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lciwgdWludDMyX3QgUmVwZXRpdGlvbikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1SRVApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIE1PRElGWV9SRUcoKiBwUmVnLCBIUlRJTV9NUkVQX01SRVAsIFJlcGV0aXRpb24pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgdGltZXIgcmVwZXRpdGlvbiBwZXJpb2QgdmFsdWUuCisgICogQHJtdG9sbCBNUkVQICAgICAgICBNUkVQICAgICAgIExMX0hSVElNX1RJTV9HZXRSZXBldGl0aW9uXG4KKyAgKiAgICAgICAgIFJFUHhSICAgICAgIFJFUHggICAgICAgTExfSFJUSU1fVElNX0dldFJlcGV0aXRpb24KKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfTUFTVEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIFJlcGV0aXRpb24gVmFsdWUgYmV0d2VlbiAwIGFuZCAweEZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fVElNX0dldFJlcGV0aXRpb24oSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1SRVApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsIEhSVElNX01SRVBfTVJFUCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgY29tcGFyZSB2YWx1ZSBvZiB0aGUgY29tcGFyZSB1bml0IDEuCisgICogQHJtdG9sbCBNQ01QMVIgICAgICBNQ01QMSAgICAgICBMTF9IUlRJTV9USU1fU2V0Q29tcGFyZTFcbgorICAqICAgICAgICAgQ01QMXhSICAgICAgQ01QMXggICAgICAgTExfSFJUSU1fVElNX1NldENvbXBhcmUxCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHBhcmFtICBDb21wYXJlVmFsdWUgQ29tcGFyZSB2YWx1ZSBtdXN0IGJlIGFib3ZlIG9yIGVxdWFsIHRvIDMKKyAgKiAgICAgICAgIHBlcmlvZHMgb2YgdGhlIGZIUlRJTSBjbG9jaywgdGhhdCBpcyAweDYwIGlmIENLUFNDWzI6MF0gPSAwLAorICAqICAgICAgICAgMHgzMCBpZiBDS1BTQ1syOjBdID0gMSwgMHgxOCBpZiBDS1BTQ1syOjBdID0gMiwuLi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX1RJTV9TZXRDb21wYXJlMShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyLCB1aW50MzJfdCBDb21wYXJlVmFsdWUpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NQ01QMVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIE1PRElGWV9SRUcoKiBwUmVnLCBIUlRJTV9NQ01QMVJfTUNNUDFSLCBDb21wYXJlVmFsdWUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgY29tcGFyZSB2YWx1ZSBvZiB0aGUgY29tcGFyZSB1bml0IDEuCisgICogQHJtdG9sbCBNQ01QMVIgICAgICBNQ01QMSAgICAgICBMTF9IUlRJTV9USU1fR2V0Q29tcGFyZTFcbgorICAqICAgICAgICAgQ01QMXhSICAgICAgQ01QMXggICAgICAgTExfSFJUSU1fVElNX0dldENvbXBhcmUxCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBDb21wYXJlVmFsdWUgQ29tcGFyZSB2YWx1ZSBtdXN0IGJlIGFib3ZlIG9yIGVxdWFsIHRvIDMKKyAgKiAgICAgICAgIHBlcmlvZHMgb2YgdGhlIGZIUlRJTSBjbG9jaywgdGhhdCBpcyAweDYwIGlmIENLUFNDWzI6MF0gPSAwLAorICAqICAgICAgICAgMHgzMCBpZiBDS1BTQ1syOjBdID0gMSwgMHgxOCBpZiBDS1BTQ1syOjBdID0gMiwuLi4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9USU1fR2V0Q29tcGFyZTEoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1DTVAxUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgSFJUSU1fTUNNUDFSX01DTVAxUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgY29tcGFyZSB2YWx1ZSBvZiB0aGUgY29tcGFyZSB1bml0IDIuCisgICogQHJtdG9sbCBNQ01QMlIgICAgICBNQ01QMiAgICAgICBMTF9IUlRJTV9USU1fU2V0Q29tcGFyZTJcbgorICAqICAgICAgICAgQ01QMnhSICAgICAgQ01QMnggICAgICAgTExfSFJUSU1fVElNX1NldENvbXBhcmUyCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHBhcmFtICBDb21wYXJlVmFsdWUgQ29tcGFyZSB2YWx1ZSBtdXN0IGJlIGFib3ZlIG9yIGVxdWFsIHRvIDMKKyAgKiAgICAgICAgIHBlcmlvZHMgb2YgdGhlIGZIUlRJTSBjbG9jaywgdGhhdCBpcyAweDYwIGlmIENLUFNDWzI6MF0gPSAwLAorICAqICAgICAgICAgMHgzMCBpZiBDS1BTQ1syOjBdID0gMSwgMHgxOCBpZiBDS1BTQ1syOjBdID0gMiwuLi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX1RJTV9TZXRDb21wYXJlMihIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyLCB1aW50MzJfdCBDb21wYXJlVmFsdWUpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NQ01QMlIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIE1PRElGWV9SRUcoKiBwUmVnLCBIUlRJTV9NQ01QMVJfTUNNUDJSLCBDb21wYXJlVmFsdWUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgY29tcGFyZSB2YWx1ZSBvZiB0aGUgY29tcGFyZSB1bml0IDIuCisgICogQHJtdG9sbCBNQ01QMlIgICAgICBNQ01QMiAgICAgICBMTF9IUlRJTV9USU1fR2V0Q29tcGFyZTJcbgorICAqICAgICAgICAgQ01QMnhSICAgICAgQ01QMnggICAgICAgTExfSFJUSU1fVElNX0dldENvbXBhcmUyXG4KKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfTUFTVEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIENvbXBhcmVWYWx1ZSBDb21wYXJlIHZhbHVlIG11c3QgYmUgYWJvdmUgb3IgZXF1YWwgdG8gMworICAqICAgICAgICAgcGVyaW9kcyBvZiB0aGUgZkhSVElNIGNsb2NrLCB0aGF0IGlzIDB4NjAgaWYgQ0tQU0NbMjowXSA9IDAsCisgICogICAgICAgICAweDMwIGlmIENLUFNDWzI6MF0gPSAxLCAweDE4IGlmIENLUFNDWzI6MF0gPSAyLC4uLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX1RJTV9HZXRDb21wYXJlMihIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTUNNUDJSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9NQ01QMVJfTUNNUDJSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBjb21wYXJlIHZhbHVlIG9mIHRoZSBjb21wYXJlIHVuaXQgMy4KKyAgKiBAcm10b2xsIE1DTVAzUiAgICAgIE1DTVAzICAgICAgIExMX0hSVElNX1RJTV9TZXRDb21wYXJlM1xuCisgICogICAgICAgICBDTVAzeFIgICAgICBDTVAzeCAgICAgICBMTF9IUlRJTV9USU1fU2V0Q29tcGFyZTMKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfTUFTVEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcGFyYW0gIENvbXBhcmVWYWx1ZSBDb21wYXJlIHZhbHVlIG11c3QgYmUgYWJvdmUgb3IgZXF1YWwgdG8gMworICAqICAgICAgICAgcGVyaW9kcyBvZiB0aGUgZkhSVElNIGNsb2NrLCB0aGF0IGlzIDB4NjAgaWYgQ0tQU0NbMjowXSA9IDAsCisgICogICAgICAgICAweDMwIGlmIENLUFNDWzI6MF0gPSAxLCAweDE4IGlmIENLUFNDWzI6MF0gPSAyLC4uLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fVElNX1NldENvbXBhcmUzKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIsIHVpbnQzMl90IENvbXBhcmVWYWx1ZSkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1DTVAzUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgTU9ESUZZX1JFRygqIHBSZWcsIEhSVElNX01DTVAxUl9NQ01QM1IsIENvbXBhcmVWYWx1ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCBjb21wYXJlIHZhbHVlIG9mIHRoZSBjb21wYXJlIHVuaXQgMy4KKyAgKiBAcm10b2xsIE1DTVAzUiAgICAgIE1DTVAzICAgICAgIExMX0hSVElNX1RJTV9HZXRDb21wYXJlM1xuCisgICogICAgICAgICBDTVAzeFIgICAgICBDTVAzeCAgICAgICBMTF9IUlRJTV9USU1fR2V0Q29tcGFyZTMKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfTUFTVEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIENvbXBhcmVWYWx1ZSBDb21wYXJlIHZhbHVlIG11c3QgYmUgYWJvdmUgb3IgZXF1YWwgdG8gMworICAqICAgICAgICAgcGVyaW9kcyBvZiB0aGUgZkhSVElNIGNsb2NrLCB0aGF0IGlzIDB4NjAgaWYgQ0tQU0NbMjowXSA9IDAsCisgICogICAgICAgICAweDMwIGlmIENLUFNDWzI6MF0gPSAxLCAweDE4IGlmIENLUFNDWzI6MF0gPSAyLC4uLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX1RJTV9HZXRDb21wYXJlMyhIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTUNNUDNSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9NQ01QMVJfTUNNUDNSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBjb21wYXJlIHZhbHVlIG9mIHRoZSBjb21wYXJlIHVuaXQgNC4KKyAgKiBAcm10b2xsIE1DTVA0UiAgICAgIE1DTVA0ICAgICAgIExMX0hSVElNX1RJTV9TZXRDb21wYXJlNFxuCisgICogICAgICAgICBDTVA0eFIgICAgICBDTVA0eCAgICAgICBMTF9IUlRJTV9USU1fU2V0Q29tcGFyZTQKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfTUFTVEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcGFyYW0gIENvbXBhcmVWYWx1ZSBDb21wYXJlIHZhbHVlIG11c3QgYmUgYWJvdmUgb3IgZXF1YWwgdG8gMworICAqICAgICAgICAgcGVyaW9kcyBvZiB0aGUgZkhSVElNIGNsb2NrLCB0aGF0IGlzIDB4NjAgaWYgQ0tQU0NbMjowXSA9IDAsCisgICogICAgICAgICAweDMwIGlmIENLUFNDWzI6MF0gPSAxLCAweDE4IGlmIENLUFNDWzI6MF0gPSAyLC4uLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fVElNX1NldENvbXBhcmU0KEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIsIHVpbnQzMl90IENvbXBhcmVWYWx1ZSkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1DTVA0UikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgTU9ESUZZX1JFRygqIHBSZWcsIEhSVElNX01DTVAxUl9NQ01QNFIsIENvbXBhcmVWYWx1ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCBjb21wYXJlIHZhbHVlIG9mIHRoZSBjb21wYXJlIHVuaXQgNC4KKyAgKiBAcm10b2xsIE1DTVA0UiAgICAgIE1DTVA0ICAgICAgIExMX0hSVElNX1RJTV9HZXRDb21wYXJlNFxuCisgICogICAgICAgICBDTVA0eFIgICAgICBDTVA0eCAgICAgICBMTF9IUlRJTV9USU1fR2V0Q29tcGFyZTQKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfTUFTVEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIENvbXBhcmVWYWx1ZSBDb21wYXJlIHZhbHVlIG11c3QgYmUgYWJvdmUgb3IgZXF1YWwgdG8gMworICAqICAgICAgICAgcGVyaW9kcyBvZiB0aGUgZkhSVElNIGNsb2NrLCB0aGF0IGlzIDB4NjAgaWYgQ0tQU0NbMjowXSA9IDAsCisgICogICAgICAgICAweDMwIGlmIENLUFNDWzI6MF0gPSAxLCAweDE4IGlmIENLUFNDWzI6MF0gPSAyLC4uLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX1RJTV9HZXRDb21wYXJlNChIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTUNNUDRSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9NQ01QMVJfTUNNUDRSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSByZXNldCB0cmlnZ2VyIG9mIGEgdGltZXIgY291bnRlci4KKyAgKiBAcm10b2xsIFJTVHhSICAgICAgVVBEVCAgICAgICAgICAgTExfSFJUSU1fVElNX1NldFJlc2V0VHJpZ1xuCisgICogICAgICAgICBSU1R4UiAgICAgIENNUDIgICAgICAgICAgIExMX0hSVElNX1RJTV9TZXRSZXNldFRyaWdcbgorICAqICAgICAgICAgUlNUeFIgICAgICBDTVA0ICAgICAgICAgICBMTF9IUlRJTV9USU1fU2V0UmVzZXRUcmlnXG4KKyAgKiAgICAgICAgIFJTVHhSICAgICAgTVNUUEVSICAgICAgICAgTExfSFJUSU1fVElNX1NldFJlc2V0VHJpZ1xuCisgICogICAgICAgICBSU1R4UiAgICAgIE1TVENNUDEgICAgICAgIExMX0hSVElNX1RJTV9TZXRSZXNldFRyaWdcbgorICAqICAgICAgICAgUlNUeFIgICAgICBNU1RDTVAyICAgICAgICBMTF9IUlRJTV9USU1fU2V0UmVzZXRUcmlnXG4KKyAgKiAgICAgICAgIFJTVHhSICAgICAgTVNUQ01QMyAgICAgICAgTExfSFJUSU1fVElNX1NldFJlc2V0VHJpZ1xuCisgICogICAgICAgICBSU1R4UiAgICAgIE1TVENNUDQgICAgICAgIExMX0hSVElNX1RJTV9TZXRSZXNldFRyaWdcbgorICAqICAgICAgICAgUlNUeFIgICAgICBFWFRFVk5UMSAgICAgICBMTF9IUlRJTV9USU1fU2V0UmVzZXRUcmlnXG4KKyAgKiAgICAgICAgIFJTVHhSICAgICAgRVhURVZOVDIgICAgICAgTExfSFJUSU1fVElNX1NldFJlc2V0VHJpZ1xuCisgICogICAgICAgICBSU1R4UiAgICAgIEVYVEVWTlQzICAgICAgIExMX0hSVElNX1RJTV9TZXRSZXNldFRyaWdcbgorICAqICAgICAgICAgUlNUeFIgICAgICBFWFRFVk5UNCAgICAgICBMTF9IUlRJTV9USU1fU2V0UmVzZXRUcmlnXG4KKyAgKiAgICAgICAgIFJTVHhSICAgICAgRVhURVZOVDUgICAgICAgTExfSFJUSU1fVElNX1NldFJlc2V0VHJpZ1xuCisgICogICAgICAgICBSU1R4UiAgICAgIEVYVEVWTlQ2ICAgICAgIExMX0hSVElNX1RJTV9TZXRSZXNldFRyaWdcbgorICAqICAgICAgICAgUlNUeFIgICAgICBFWFRFVk5UNyAgICAgICBMTF9IUlRJTV9USU1fU2V0UmVzZXRUcmlnXG4KKyAgKiAgICAgICAgIFJTVHhSICAgICAgRVhURVZOVDggICAgICAgTExfSFJUSU1fVElNX1NldFJlc2V0VHJpZ1xuCisgICogICAgICAgICBSU1R4UiAgICAgIEVYVEVWTlQ5ICAgICAgIExMX0hSVElNX1RJTV9TZXRSZXNldFRyaWdcbgorICAqICAgICAgICAgUlNUeFIgICAgICBFWFRFVk5UMTAgICAgICBMTF9IUlRJTV9USU1fU2V0UmVzZXRUcmlnXG4KKyAgKiAgICAgICAgIFJTVHhSICAgICAgVElNQkNNUDEgICAgICAgTExfSFJUSU1fVElNX1NldFJlc2V0VHJpZ1xuCisgICogICAgICAgICBSU1R4UiAgICAgIFRJTUJDTVAyICAgICAgIExMX0hSVElNX1RJTV9TZXRSZXNldFRyaWdcbgorICAqICAgICAgICAgUlNUeFIgICAgICBUSU1CQ01QNCAgICAgICBMTF9IUlRJTV9USU1fU2V0UmVzZXRUcmlnXG4KKyAgKiAgICAgICAgIFJTVHhSICAgICAgVElNQ0NNUDEgICAgICAgTExfSFJUSU1fVElNX1NldFJlc2V0VHJpZ1xuCisgICogICAgICAgICBSU1R4UiAgICAgIFRJTUNDTVAyICAgICAgIExMX0hSVElNX1RJTV9TZXRSZXNldFRyaWdcbgorICAqICAgICAgICAgUlNUeFIgICAgICBUSU1DQ01QNCAgICAgICBMTF9IUlRJTV9USU1fU2V0UmVzZXRUcmlnXG4KKyAgKiAgICAgICAgIFJTVHhSICAgICAgVElNRENNUDEgICAgICAgTExfSFJUSU1fVElNX1NldFJlc2V0VHJpZ1xuCisgICogICAgICAgICBSU1R4UiAgICAgIFRJTURDTVAyICAgICAgIExMX0hSVElNX1RJTV9TZXRSZXNldFRyaWdcbgorICAqICAgICAgICAgUlNUeFIgICAgICBUSU1EQ01QNCAgICAgICBMTF9IUlRJTV9USU1fU2V0UmVzZXRUcmlnXG4KKyAgKiAgICAgICAgIFJTVHhSICAgICAgVElNRUNNUDEgICAgICAgTExfSFJUSU1fVElNX1NldFJlc2V0VHJpZ1xuCisgICogICAgICAgICBSU1R4UiAgICAgIFRJTUVDTVAyICAgICAgIExMX0hSVElNX1RJTV9TZXRSZXNldFRyaWdcbgorICAqICAgICAgICAgUlNUeFIgICAgICBUSU1FQ01QNCAgICAgICBMTF9IUlRJTV9USU1fU2V0UmVzZXRUcmlnCisgICogQG5vdGUgVGhlIHJlc2V0IG9mIHRoZSB0aW1lciBjb3VudGVyIGNhbiBiZSB0cmlnZ2VyZWQgYnkgdXAgdG8gMzAgZXZlbnRzCisgICogICAgICAgdGhhdCBjYW4gYmUgc2VsZWN0ZWQgYW1vbmcgdGhlIGZvbGxvd2luZyBzb3VyY2VzOgorICAqICAgICAgICAgQGFyZyBUaGUgdGltaW5nIHVuaXQ6IENvbXBhcmUgMiwgQ29tcGFyZSA0IGFuZCBVcGRhdGUgKDMgZXZlbnRzKS4KKyAgKiAgICAgICAgIEBhcmcgVGhlIG1hc3RlciB0aW1lcjogUmVzZXQgYW5kIENvbXBhcmUgMS4uNCAoNSBldmVudHMpLgorICAqICAgICAgICAgQGFyZyBUaGUgZXh0ZXJuYWwgZXZlbnRzIEVYVEVWTlQxLi4xMCAoMTAgZXZlbnRzKS4KKyAgKiAgICAgICAgIEBhcmcgQWxsIG90aGVyIHRpbWluZyB1bml0cyAoZS5nLiBUaW1lciBCLi5FIGZvciB0aW1lciBBKTogQ29tcGFyZSAxLCAyIGFuZCA0ICgxMiBldmVudHMpLgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEBwYXJhbSAgUmVzZXRUcmlnIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1JFU0VUVFJJR19OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fUkVTRVRUUklHX1VQREFURQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1JFU0VUVFJJR19DTVAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fUkVTRVRUUklHX0NNUDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfTUFTVEVSX1BFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1JFU0VUVFJJR19NQVNURVJfQ01QMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1JFU0VUVFJJR19NQVNURVJfQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1JFU0VUVFJJR19NQVNURVJfQ01QMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1JFU0VUVFJJR19NQVNURVJfQ01QNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1JFU0VUVFJJR19FRVZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1JFU0VUVFJJR19FRVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1JFU0VUVFJJR19FRVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1JFU0VUVFJJR19FRVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1JFU0VUVFJJR19FRVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1JFU0VUVFJJR19FRVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1JFU0VUVFJJR19FRVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1JFU0VUVFJJR19FRVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1JFU0VUVFJJR19FRVZfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1JFU0VUVFJJR19FRVZfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfT1RIRVIxX0NNUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfT1RIRVIxX0NNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfT1RIRVIxX0NNUDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfT1RIRVIyX0NNUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfT1RIRVIyX0NNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfT1RIRVIyX0NNUDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfT1RIRVIzX0NNUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfT1RIRVIzX0NNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfT1RIRVIzX0NNUDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfT1RIRVI0X0NNUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfT1RIRVI0X0NNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfT1RIRVI0X0NNUDQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX1RJTV9TZXRSZXNldFRyaWcoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lciwgdWludDMyX3QgUmVzZXRUcmlnKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9UQUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNUaW1lcnhSZWdzWzBdLlJTVHhSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBXUklURV9SRUcoKnBSZWcsIFJlc2V0VHJpZyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCByZXNldCB0cmlnZ2VyIG9mIGEgdGltZXIgY291bnRlci4KKyAgKiBAcm10b2xsIFJTVHhSICAgICAgVVBEVCAgICAgICAgICAgTExfSFJUSU1fVElNX0dldFJlc2V0VHJpZ1xuCisgICogICAgICAgICBSU1R4UiAgICAgIENNUDIgICAgICAgICAgIExMX0hSVElNX1RJTV9HZXRSZXNldFRyaWdcbgorICAqICAgICAgICAgUlNUeFIgICAgICBDTVA0ICAgICAgICAgICBMTF9IUlRJTV9USU1fR2V0UmVzZXRUcmlnXG4KKyAgKiAgICAgICAgIFJTVHhSICAgICAgTVNUUEVSICAgICAgICAgTExfSFJUSU1fVElNX0dldFJlc2V0VHJpZ1xuCisgICogICAgICAgICBSU1R4UiAgICAgIE1TVENNUDEgICAgICAgIExMX0hSVElNX1RJTV9HZXRSZXNldFRyaWdcbgorICAqICAgICAgICAgUlNUeFIgICAgICBNU1RDTVAyICAgICAgICBMTF9IUlRJTV9USU1fR2V0UmVzZXRUcmlnXG4KKyAgKiAgICAgICAgIFJTVHhSICAgICAgTVNUQ01QMyAgICAgICAgTExfSFJUSU1fVElNX0dldFJlc2V0VHJpZ1xuCisgICogICAgICAgICBSU1R4UiAgICAgIE1TVENNUDQgICAgICAgIExMX0hSVElNX1RJTV9HZXRSZXNldFRyaWdcbgorICAqICAgICAgICAgUlNUeFIgICAgICBFWFRFVk5UMSAgICAgICBMTF9IUlRJTV9USU1fR2V0UmVzZXRUcmlnXG4KKyAgKiAgICAgICAgIFJTVHhSICAgICAgRVhURVZOVDIgICAgICAgTExfSFJUSU1fVElNX0dldFJlc2V0VHJpZ1xuCisgICogICAgICAgICBSU1R4UiAgICAgIEVYVEVWTlQzICAgICAgIExMX0hSVElNX1RJTV9HZXRSZXNldFRyaWdcbgorICAqICAgICAgICAgUlNUeFIgICAgICBFWFRFVk5UNCAgICAgICBMTF9IUlRJTV9USU1fR2V0UmVzZXRUcmlnXG4KKyAgKiAgICAgICAgIFJTVHhSICAgICAgRVhURVZOVDUgICAgICAgTExfSFJUSU1fVElNX0dldFJlc2V0VHJpZ1xuCisgICogICAgICAgICBSU1R4UiAgICAgIEVYVEVWTlQ2ICAgICAgIExMX0hSVElNX1RJTV9HZXRSZXNldFRyaWdcbgorICAqICAgICAgICAgUlNUeFIgICAgICBFWFRFVk5UNyAgICAgICBMTF9IUlRJTV9USU1fR2V0UmVzZXRUcmlnXG4KKyAgKiAgICAgICAgIFJTVHhSICAgICAgRVhURVZOVDggICAgICAgTExfSFJUSU1fVElNX0dldFJlc2V0VHJpZ1xuCisgICogICAgICAgICBSU1R4UiAgICAgIEVYVEVWTlQ5ICAgICAgIExMX0hSVElNX1RJTV9HZXRSZXNldFRyaWdcbgorICAqICAgICAgICAgUlNUeFIgICAgICBFWFRFVk5UMTAgICAgICBMTF9IUlRJTV9USU1fR2V0UmVzZXRUcmlnXG4KKyAgKiAgICAgICAgIFJTVHhSICAgICAgVElNQkNNUDEgICAgICAgTExfSFJUSU1fVElNX0dldFJlc2V0VHJpZ1xuCisgICogICAgICAgICBSU1R4UiAgICAgIFRJTUJDTVAyICAgICAgIExMX0hSVElNX1RJTV9HZXRSZXNldFRyaWdcbgorICAqICAgICAgICAgUlNUeFIgICAgICBUSU1CQ01QNCAgICAgICBMTF9IUlRJTV9USU1fR2V0UmVzZXRUcmlnXG4KKyAgKiAgICAgICAgIFJTVHhSICAgICAgVElNQ0NNUDEgICAgICAgTExfSFJUSU1fVElNX0dldFJlc2V0VHJpZ1xuCisgICogICAgICAgICBSU1R4UiAgICAgIFRJTUNDTVAyICAgICAgIExMX0hSVElNX1RJTV9HZXRSZXNldFRyaWdcbgorICAqICAgICAgICAgUlNUeFIgICAgICBUSU1DQ01QNCAgICAgICBMTF9IUlRJTV9USU1fR2V0UmVzZXRUcmlnXG4KKyAgKiAgICAgICAgIFJTVHhSICAgICAgVElNRENNUDEgICAgICAgTExfSFJUSU1fVElNX0dldFJlc2V0VHJpZ1xuCisgICogICAgICAgICBSU1R4UiAgICAgIFRJTURDTVAyICAgICAgIExMX0hSVElNX1RJTV9HZXRSZXNldFRyaWdcbgorICAqICAgICAgICAgUlNUeFIgICAgICBUSU1EQ01QNCAgICAgICBMTF9IUlRJTV9USU1fR2V0UmVzZXRUcmlnXG4KKyAgKiAgICAgICAgIFJTVHhSICAgICAgVElNRUNNUDEgICAgICAgTExfSFJUSU1fVElNX0dldFJlc2V0VHJpZ1xuCisgICogICAgICAgICBSU1R4UiAgICAgIFRJTUVDTVAyICAgICAgIExMX0hSVElNX1RJTV9HZXRSZXNldFRyaWdcbgorICAqICAgICAgICAgUlNUeFIgICAgICBUSU1FQ01QNCAgICAgICBMTF9IUlRJTV9USU1fR2V0UmVzZXRUcmlnCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBSZXNldFRyaWcgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1JFU0VUVFJJR19VUERBVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1JFU0VUVFJJR19DTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fUkVTRVRUUklHX01BU1RFUl9QRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfTUFTVEVSX0NNUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfTUFTVEVSX0NNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfTUFTVEVSX0NNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfTUFTVEVSX0NNUDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfRUVWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfRUVWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfRUVWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfRUVWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfRUVWXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfRUVWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfRUVWXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfRUVWXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfRUVWXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9SRVNFVFRSSUdfRUVWXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fUkVTRVRUUklHX09USEVSMV9DTVAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fUkVTRVRUUklHX09USEVSMV9DTVAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fUkVTRVRUUklHX09USEVSMV9DTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fUkVTRVRUUklHX09USEVSMl9DTVAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fUkVTRVRUUklHX09USEVSMl9DTVAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fUkVTRVRUUklHX09USEVSMl9DTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fUkVTRVRUUklHX09USEVSM19DTVAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fUkVTRVRUUklHX09USEVSM19DTVAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fUkVTRVRUUklHX09USEVSM19DTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fUkVTRVRUUklHX09USEVSNF9DTVAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fUkVTRVRUUklHX09USEVSNF9DTVAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fUkVTRVRUUklHX09USEVSNF9DTVA0CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fVElNX0dldFJlc2V0VHJpZyhIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9UQUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNUaW1lcnhSZWdzWzBdLlJTVHhSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfUkVHKCpwUmVnKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNhcHR1cmVkIHZhbHVlIGZvciBjYXB0dXJlIHVuaXQgMS4KKyAgKiBAcm10b2xsIENQVDF4UiAgICAgIENQVDF4ICAgICAgICAgICBMTF9IUlRJTV9USU1fR2V0Q2FwdHVyZTEKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIENhcHR1cmVkIHZhbHVlCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fVElNX0dldENhcHR1cmUxKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX1RBQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c1RpbWVyeFJlZ3NbMF0uQ1BUMXhSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfUkVHKCpwUmVnKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNhcHR1cmVkIHZhbHVlIGZvciBjYXB0dXJlIHVuaXQgMi4KKyAgKiBAcm10b2xsIENQVDJ4UiAgICAgIENQVDJ4ICAgICAgICAgICBMTF9IUlRJTV9USU1fR2V0Q2FwdHVyZTIKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIENhcHR1cmVkIHZhbHVlCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fVElNX0dldENhcHR1cmUyKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX1RBQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c1RpbWVyeFJlZ3NbMF0uQ1BUMnhSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfUkVHKCpwUmVnKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSB0cmlnZ2VyIG9mIGEgY2FwdHVyZSB1bml0IGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgQ1BUMXhDUiAgICAgIFNXQ1BUICAgICAgICAgICAgTExfSFJUSU1fVElNX1NldENhcHR1cmVUcmlnXG4KKyAgKiAgICAgICAgIENQVDF4Q1IgICAgICBVUERDUFQgICAgICAgICAgIExMX0hSVElNX1RJTV9TZXRDYXB0dXJlVHJpZ1xuCisgICogICAgICAgICBDUFQxeENSICAgICAgRVhFVjFDUFQgICAgICAgICBMTF9IUlRJTV9USU1fU2V0Q2FwdHVyZVRyaWdcbgorICAqICAgICAgICAgQ1BUMXhDUiAgICAgIEVYRVYyQ1BUICAgICAgICAgTExfSFJUSU1fVElNX1NldENhcHR1cmVUcmlnXG4KKyAgKiAgICAgICAgIENQVDF4Q1IgICAgICBFWEVWM0NQVCAgICAgICAgIExMX0hSVElNX1RJTV9TZXRDYXB0dXJlVHJpZ1xuCisgICogICAgICAgICBDUFQxeENSICAgICAgRVhFVjRDUFQgICAgICAgICBMTF9IUlRJTV9USU1fU2V0Q2FwdHVyZVRyaWdcbgorICAqICAgICAgICAgQ1BUMXhDUiAgICAgIEVYRVY1Q1BUICAgICAgICAgTExfSFJUSU1fVElNX1NldENhcHR1cmVUcmlnXG4KKyAgKiAgICAgICAgIENQVDF4Q1IgICAgICBFWEVWNkNQVCAgICAgICAgIExMX0hSVElNX1RJTV9TZXRDYXB0dXJlVHJpZ1xuCisgICogICAgICAgICBDUFQxeENSICAgICAgRVhFVjdDUFQgICAgICAgICBMTF9IUlRJTV9USU1fU2V0Q2FwdHVyZVRyaWdcbgorICAqICAgICAgICAgQ1BUMXhDUiAgICAgIEVYRVY4Q1BUICAgICAgICAgTExfSFJUSU1fVElNX1NldENhcHR1cmVUcmlnXG4KKyAgKiAgICAgICAgIENQVDF4Q1IgICAgICBFWEVWOUNQVCAgICAgICAgIExMX0hSVElNX1RJTV9TZXRDYXB0dXJlVHJpZ1xuCisgICogICAgICAgICBDUFQxeENSICAgICAgRVhFVjEwQ1BUICAgICAgICBMTF9IUlRJTV9USU1fU2V0Q2FwdHVyZVRyaWdcbgorICAqICAgICAgICAgQ1BUMXhDUiAgICAgIFRBMVNFVCAgICAgICAgICAgTExfSFJUSU1fVElNX1NldENhcHR1cmVUcmlnXG4KKyAgKiAgICAgICAgIENQVDF4Q1IgICAgICBUQTFSU1QgICAgICAgICAgIExMX0hSVElNX1RJTV9TZXRDYXB0dXJlVHJpZ1xuCisgICogICAgICAgICBDUFQxeENSICAgICAgVEFDTVAxICAgICAgICAgICBMTF9IUlRJTV9USU1fU2V0Q2FwdHVyZVRyaWdcbgorICAqICAgICAgICAgQ1BUMXhDUiAgICAgIFRBQ01QMiAgICAgICAgICAgTExfSFJUSU1fVElNX1NldENhcHR1cmVUcmlnXG4KKyAgKiAgICAgICAgIENQVDF4Q1IgICAgICBUQjFTRVQgICAgICAgICAgIExMX0hSVElNX1RJTV9TZXRDYXB0dXJlVHJpZ1xuCisgICogICAgICAgICBDUFQxeENSICAgICAgVEIxUlNUICAgICAgICAgICBMTF9IUlRJTV9USU1fU2V0Q2FwdHVyZVRyaWdcbgorICAqICAgICAgICAgQ1BUMXhDUiAgICAgIFRCQ01QMSAgICAgICAgICAgTExfSFJUSU1fVElNX1NldENhcHR1cmVUcmlnXG4KKyAgKiAgICAgICAgIENQVDF4Q1IgICAgICBUQkNNUDIgICAgICAgICAgIExMX0hSVElNX1RJTV9TZXRDYXB0dXJlVHJpZ1xuCisgICogICAgICAgICBDUFQxeENSICAgICAgVEMxU0VUICAgICAgICAgICBMTF9IUlRJTV9USU1fU2V0Q2FwdHVyZVRyaWdcbgorICAqICAgICAgICAgQ1BUMXhDUiAgICAgIFRDMVJTVCAgICAgICAgICAgTExfSFJUSU1fVElNX1NldENhcHR1cmVUcmlnXG4KKyAgKiAgICAgICAgIENQVDF4Q1IgICAgICBUQ0NNUDEgICAgICAgICAgIExMX0hSVElNX1RJTV9TZXRDYXB0dXJlVHJpZ1xuCisgICogICAgICAgICBDUFQxeENSICAgICAgVENDTVAyICAgICAgICAgICBMTF9IUlRJTV9USU1fU2V0Q2FwdHVyZVRyaWdcbgorICAqICAgICAgICAgQ1BUMXhDUiAgICAgIFREMVNFVCAgICAgICAgICAgTExfSFJUSU1fVElNX1NldENhcHR1cmVUcmlnXG4KKyAgKiAgICAgICAgIENQVDF4Q1IgICAgICBURDFSU1QgICAgICAgICAgIExMX0hSVElNX1RJTV9TZXRDYXB0dXJlVHJpZ1xuCisgICogICAgICAgICBDUFQxeENSICAgICAgVERDTVAxICAgICAgICAgICBMTF9IUlRJTV9USU1fU2V0Q2FwdHVyZVRyaWdcbgorICAqICAgICAgICAgQ1BUMXhDUiAgICAgIFREQ01QMiAgICAgICAgICAgTExfSFJUSU1fVElNX1NldENhcHR1cmVUcmlnXG4KKyAgKiAgICAgICAgIENQVDF4Q1IgICAgICBURTFTRVQgICAgICAgICAgIExMX0hSVElNX1RJTV9TZXRDYXB0dXJlVHJpZ1xuCisgICogICAgICAgICBDUFQxeENSICAgICAgVEUxUlNUICAgICAgICAgICBMTF9IUlRJTV9USU1fU2V0Q2FwdHVyZVRyaWdcbgorICAqICAgICAgICAgQ1BUMXhDUiAgICAgIFRFQ01QMSAgICAgICAgICAgTExfSFJUSU1fVElNX1NldENhcHR1cmVUcmlnXG4KKyAgKiAgICAgICAgIENQVDF4Q1IgICAgICBURUNNUDIgICAgICAgICAgIExMX0hSVElNX1RJTV9TZXRDYXB0dXJlVHJpZworICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEBwYXJhbSAgQ2FwdHVyZVVuaXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DQVBUVVJFVU5JVF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0FQVFVSRVVOSVRfMgorICAqIEBwYXJhbSAgQ2FwdHVyZVRyaWcgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0FQVFVSRVRSSUdfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NBUFRVUkVUUklHX1VQREFURQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NBUFRVUkVUUklHX0VFVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0FQVFVSRVRSSUdfRUVWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DQVBUVVJFVFJJR19FRVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NBUFRVUkVUUklHX0VFVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0FQVFVSRVRSSUdfRUVWXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DQVBUVVJFVFJJR19FRVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NBUFRVUkVUUklHX0VFVl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0FQVFVSRVRSSUdfRUVWXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DQVBUVVJFVFJJR19FRVZfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NBUFRVUkVUUklHX0VFVl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NBUFRVUkVUUklHX1RBMV9TRVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DQVBUVVJFVFJJR19UQTFfUkVTRVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DQVBUVVJFVFJJR19USU1BX0NNUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DQVBUVVJFVFJJR19USU1BX0NNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DQVBUVVJFVFJJR19UQjFfU0VUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0FQVFVSRVRSSUdfVEIxX1JFU0VUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0FQVFVSRVRSSUdfVElNQl9DTVAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0FQVFVSRVRSSUdfVElNQl9DTVAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0FQVFVSRVRSSUdfVEMxX1NFVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NBUFRVUkVUUklHX1RDMV9SRVNFVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NBUFRVUkVUUklHX1RJTUNfQ01QMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NBUFRVUkVUUklHX1RJTUNfQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NBUFRVUkVUUklHX1REMV9TRVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DQVBUVVJFVFJJR19URDFfUkVTRVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DQVBUVVJFVFJJR19USU1EX0NNUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DQVBUVVJFVFJJR19USU1EX0NNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DQVBUVVJFVFJJR19URTFfU0VUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0FQVFVSRVRSSUdfVEUxX1JFU0VUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0FQVFVSRVRSSUdfVElNRV9DTVAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0FQVFVSRVRSSUdfVElNRV9DTVAyCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9USU1fU2V0Q2FwdHVyZVRyaWcoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lciwgdWludDMyX3QgQ2FwdHVyZVVuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2FwdHVyZVRyaWcpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX1RBQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c1RpbWVyeFJlZ3NbMF0uQ1BUMXhDUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0gKyBDYXB0dXJlVW5pdCAqIDQpKTsKKyAgV1JJVEVfUkVHKCpwUmVnLCBDYXB0dXJlVHJpZyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCB0cmlnZ2VyIG9mIGEgY2FwdHVyZSB1bml0IGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgQ1BUMXhDUiAgICAgIFNXQ1BUICAgICAgICAgICAgTExfSFJUSU1fVElNX0dldENhcHR1cmVUcmlnXG4KKyAgKiAgICAgICAgIENQVDF4Q1IgICAgICBVUERDUFQgICAgICAgICAgIExMX0hSVElNX1RJTV9HZXRDYXB0dXJlVHJpZ1xuCisgICogICAgICAgICBDUFQxeENSICAgICAgRVhFVjFDUFQgICAgICAgICBMTF9IUlRJTV9USU1fR2V0Q2FwdHVyZVRyaWdcbgorICAqICAgICAgICAgQ1BUMXhDUiAgICAgIEVYRVYyQ1BUICAgICAgICAgTExfSFJUSU1fVElNX0dldENhcHR1cmVUcmlnXG4KKyAgKiAgICAgICAgIENQVDF4Q1IgICAgICBFWEVWM0NQVCAgICAgICAgIExMX0hSVElNX1RJTV9HZXRDYXB0dXJlVHJpZ1xuCisgICogICAgICAgICBDUFQxeENSICAgICAgRVhFVjRDUFQgICAgICAgICBMTF9IUlRJTV9USU1fR2V0Q2FwdHVyZVRyaWdcbgorICAqICAgICAgICAgQ1BUMXhDUiAgICAgIEVYRVY1Q1BUICAgICAgICAgTExfSFJUSU1fVElNX0dldENhcHR1cmVUcmlnXG4KKyAgKiAgICAgICAgIENQVDF4Q1IgICAgICBFWEVWNkNQVCAgICAgICAgIExMX0hSVElNX1RJTV9HZXRDYXB0dXJlVHJpZ1xuCisgICogICAgICAgICBDUFQxeENSICAgICAgRVhFVjdDUFQgICAgICAgICBMTF9IUlRJTV9USU1fR2V0Q2FwdHVyZVRyaWdcbgorICAqICAgICAgICAgQ1BUMXhDUiAgICAgIEVYRVY4Q1BUICAgICAgICAgTExfSFJUSU1fVElNX0dldENhcHR1cmVUcmlnXG4KKyAgKiAgICAgICAgIENQVDF4Q1IgICAgICBFWEVWOUNQVCAgICAgICAgIExMX0hSVElNX1RJTV9HZXRDYXB0dXJlVHJpZ1xuCisgICogICAgICAgICBDUFQxeENSICAgICAgRVhFVjEwQ1BUICAgICAgICBMTF9IUlRJTV9USU1fR2V0Q2FwdHVyZVRyaWdcbgorICAqICAgICAgICAgQ1BUMXhDUiAgICAgIFRBMVNFVCAgICAgICAgICAgTExfSFJUSU1fVElNX0dldENhcHR1cmVUcmlnXG4KKyAgKiAgICAgICAgIENQVDF4Q1IgICAgICBUQTFSU1QgICAgICAgICAgIExMX0hSVElNX1RJTV9HZXRDYXB0dXJlVHJpZ1xuCisgICogICAgICAgICBDUFQxeENSICAgICAgVEFDTVAxICAgICAgICAgICBMTF9IUlRJTV9USU1fR2V0Q2FwdHVyZVRyaWdcbgorICAqICAgICAgICAgQ1BUMXhDUiAgICAgIFRBQ01QMiAgICAgICAgICAgTExfSFJUSU1fVElNX0dldENhcHR1cmVUcmlnXG4KKyAgKiAgICAgICAgIENQVDF4Q1IgICAgICBUQjFTRVQgICAgICAgICAgIExMX0hSVElNX1RJTV9HZXRDYXB0dXJlVHJpZ1xuCisgICogICAgICAgICBDUFQxeENSICAgICAgVEIxUlNUICAgICAgICAgICBMTF9IUlRJTV9USU1fR2V0Q2FwdHVyZVRyaWdcbgorICAqICAgICAgICAgQ1BUMXhDUiAgICAgIFRCQ01QMSAgICAgICAgICAgTExfSFJUSU1fVElNX0dldENhcHR1cmVUcmlnXG4KKyAgKiAgICAgICAgIENQVDF4Q1IgICAgICBUQkNNUDIgICAgICAgICAgIExMX0hSVElNX1RJTV9HZXRDYXB0dXJlVHJpZ1xuCisgICogICAgICAgICBDUFQxeENSICAgICAgVEMxU0VUICAgICAgICAgICBMTF9IUlRJTV9USU1fR2V0Q2FwdHVyZVRyaWdcbgorICAqICAgICAgICAgQ1BUMXhDUiAgICAgIFRDMVJTVCAgICAgICAgICAgTExfSFJUSU1fVElNX0dldENhcHR1cmVUcmlnXG4KKyAgKiAgICAgICAgIENQVDF4Q1IgICAgICBUQ0NNUDEgICAgICAgICAgIExMX0hSVElNX1RJTV9HZXRDYXB0dXJlVHJpZ1xuCisgICogICAgICAgICBDUFQxeENSICAgICAgVENDTVAyICAgICAgICAgICBMTF9IUlRJTV9USU1fR2V0Q2FwdHVyZVRyaWdcbgorICAqICAgICAgICAgQ1BUMXhDUiAgICAgIFREMVNFVCAgICAgICAgICAgTExfSFJUSU1fVElNX0dldENhcHR1cmVUcmlnXG4KKyAgKiAgICAgICAgIENQVDF4Q1IgICAgICBURDFSU1QgICAgICAgICAgIExMX0hSVElNX1RJTV9HZXRDYXB0dXJlVHJpZ1xuCisgICogICAgICAgICBDUFQxeENSICAgICAgVERDTVAxICAgICAgICAgICBMTF9IUlRJTV9USU1fR2V0Q2FwdHVyZVRyaWdcbgorICAqICAgICAgICAgQ1BUMXhDUiAgICAgIFREQ01QMiAgICAgICAgICAgTExfSFJUSU1fVElNX0dldENhcHR1cmVUcmlnXG4KKyAgKiAgICAgICAgIENQVDF4Q1IgICAgICBURTFTRVQgICAgICAgICAgIExMX0hSVElNX1RJTV9HZXRDYXB0dXJlVHJpZ1xuCisgICogICAgICAgICBDUFQxeENSICAgICAgVEUxUlNUICAgICAgICAgICBMTF9IUlRJTV9USU1fR2V0Q2FwdHVyZVRyaWdcbgorICAqICAgICAgICAgQ1BUMXhDUiAgICAgIFRFQ01QMSAgICAgICAgICAgTExfSFJUSU1fVElNX0dldENhcHR1cmVUcmlnXG4KKyAgKiAgICAgICAgIENQVDF4Q1IgICAgICBURUNNUDIgICAgICAgICAgIExMX0hSVElNX1RJTV9HZXRDYXB0dXJlVHJpZworICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEBwYXJhbSAgQ2FwdHVyZVVuaXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DQVBUVVJFVU5JVF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0FQVFVSRVVOSVRfMgorICAqIEByZXR2YWwgQ2FwdHVyZVRyaWcgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0FQVFVSRVRSSUdfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NBUFRVUkVUUklHX1VQREFURQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NBUFRVUkVUUklHX0VFVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0FQVFVSRVRSSUdfRUVWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DQVBUVVJFVFJJR19FRVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NBUFRVUkVUUklHX0VFVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0FQVFVSRVRSSUdfRUVWXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DQVBUVVJFVFJJR19FRVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NBUFRVUkVUUklHX0VFVl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0FQVFVSRVRSSUdfRUVWXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DQVBUVVJFVFJJR19FRVZfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NBUFRVUkVUUklHX0VFVl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NBUFRVUkVUUklHX1RBMV9TRVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DQVBUVVJFVFJJR19UQTFfUkVTRVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DQVBUVVJFVFJJR19USU1BX0NNUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DQVBUVVJFVFJJR19USU1BX0NNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DQVBUVVJFVFJJR19UQjFfU0VUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0FQVFVSRVRSSUdfVEIxX1JFU0VUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0FQVFVSRVRSSUdfVElNQl9DTVAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0FQVFVSRVRSSUdfVElNQl9DTVAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0FQVFVSRVRSSUdfVEMxX1NFVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NBUFRVUkVUUklHX1RDMV9SRVNFVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NBUFRVUkVUUklHX1RJTUNfQ01QMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NBUFRVUkVUUklHX1RJTUNfQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NBUFRVUkVUUklHX1REMV9TRVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DQVBUVVJFVFJJR19URDFfUkVTRVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DQVBUVVJFVFJJR19USU1EX0NNUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DQVBUVVJFVFJJR19USU1EX0NNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DQVBUVVJFVFJJR19URTFfU0VUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0FQVFVSRVRSSUdfVEUxX1JFU0VUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0FQVFVSRVRSSUdfVElNRV9DTVAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0FQVFVSRVRSSUdfVElNRV9DTVAyCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fVElNX0dldENhcHR1cmVUcmlnKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIsIHVpbnQzMl90IENhcHR1cmVVbml0KQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9UQUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNUaW1lcnhSZWdzWzBdLkNQVDF4Q1IpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdICsgQ2FwdHVyZVVuaXQgKiA0KSk7CisgIHJldHVybiAoUkVBRF9SRUcoKnBSZWcpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgZGVhZHRpbWUgaW5zZXJ0aW9uIGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgT1VUeFIgICAgICBEVEVOICAgICAgICAgICBMTF9IUlRJTV9USU1fRW5hYmxlRGVhZFRpbWUKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX1RJTV9FbmFibGVEZWFkVGltZShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9UQUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNUaW1lcnhSZWdzWzBdLk9VVHhSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBTRVRfQklUKCpwUmVnLCBIUlRJTV9PVVRSX0RURU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgZGVhZHRpbWUgaW5zZXJ0aW9uIGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgT1VUeFIgICAgICBEVEVOICAgICAgICAgICBMTF9IUlRJTV9USU1fRGlzYWJsZURlYWRUaW1lCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9USU1fRGlzYWJsZURlYWRUaW1lKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX1RBQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c1RpbWVyeFJlZ3NbMF0uT1VUeFIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIENMRUFSX0JJVCgqcFJlZywgSFJUSU1fT1VUUl9EVEVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIGRlYWR0aW1lIGluc2VydGlvbiBpcyBlbmFibGVkIGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgT1VUeFIgICAgICBEVEVOICAgICAgICAgICBMTF9IUlRJTV9USU1fSXNFbmFibGVkRGVhZFRpbWUKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIERURU4gYml0IGluIEhSVElNX09VVHhSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX1RJTV9Jc0VuYWJsZWREZWFkVGltZShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9UQUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNUaW1lcnhSZWdzWzBdLk9VVHhSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9PVVRSX0RURU4pID09IEhSVElNX09VVFJfRFRFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBkZWxheWVkIHByb3RlY3Rpb24gKERMWVBSVCkgbW9kZS4KKyAgKiBAcm10b2xsIE9VVHhSICAgICAgRExZUFJURU4gICAgICAgTExfSFJUSU1fVElNX1NldERMWVBSVE1vZGVcbgorICAqICAgICAgICAgT1VUeFIgICAgICBETFlQUlQgICAgICAgICBMTF9IUlRJTV9USU1fU2V0RExZUFJUTW9kZQorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBwcmlvciBlbmFibGluZyB0aGUgZGVsYXllZCBwcm90ZWN0aW9uCisgICogQG5vdGUgICBCYWxhbmNlZCBJZGxlIG1vZGUgaXMgb25seSBhdmFpbGFibGUgaW4gcHVzaC1wdWxsIG1vZGUKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcGFyYW0gIERMWVBSVE1vZGUgRGVsYXllZCBwcm90ZWN0aW9uIChETFlQUlQpIG1vZGUKKyAgKgorICAqICAgICAgICAgRm9yIHRpbWVycyBBLCBCIGFuZCBDIHRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWxsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0RMWVBSVF9ERUxBWU9VVDFfRUVWNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0RMWVBSVF9ERUxBWU9VVDJfRUVWNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0RMWVBSVF9ERUxBWUJPVEhfRUVWNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0RMWVBSVF9CQUxBTkNFRF9FRVY2CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRExZUFJUX0RFTEFZT1VUMV9FRVY3CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRExZUFJUX0RFTEFZT1VUMl9FRVY3CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRExZUFJUX0RFTEFZQk9USF9FRVY3CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRExZUFJUX0JBTEFOQ0VEX0VFVjcKKyAgKgorICAqICAgICAgICAgRm9yIHRpbWVycyBEIGFuZCBFIHRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWxsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0RMWVBSVF9ERUxBWU9VVDFfRUVWOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0RMWVBSVF9ERUxBWU9VVDJfRUVWOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0RMWVBSVF9ERUxBWUJPVEhfRUVWOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0RMWVBSVF9CQUxBTkNFRF9FRVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRExZUFJUX0RFTEFZT1VUMV9FRVY5CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRExZUFJUX0RFTEFZT1VUMl9FRVY5CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRExZUFJUX0RFTEFZQk9USF9FRVY5CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRExZUFJUX0JBTEFOQ0VEX0VFVjkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX1RJTV9TZXRETFlQUlRNb2RlKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIsIHVpbnQzMl90IERMWVBSVE1vZGUpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX1RBQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c1RpbWVyeFJlZ3NbMF0uT1VUeFIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIE1PRElGWV9SRUcoKnBSZWcsIEhSVElNX09VVFJfRExZUFJULCBETFlQUlRNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGRlbGF5ZWQgcHJvdGVjdGlvbiAoRExZUFJUKSBtb2RlLgorICAqIEBybXRvbGwgT1VUeFIgICAgICBETFlQUlRFTiAgICAgICBMTF9IUlRJTV9USU1fR2V0RExZUFJUTW9kZVxuCisgICogICAgICAgICBPVVR4UiAgICAgIERMWVBSVCAgICAgICAgIExMX0hSVElNX1RJTV9HZXRETFlQUlRNb2RlCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBETFlQUlRNb2RlIERlbGF5ZWQgcHJvdGVjdGlvbiAoRExZUFJUKSBtb2RlCisgICoKKyAgKiAgICAgICAgIEZvciB0aW1lcnMgQSwgQiBhbmQgQyB0aGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9ETFlQUlRfREVMQVlPVVQxX0VFVjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9ETFlQUlRfREVMQVlPVVQyX0VFVjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9ETFlQUlRfREVMQVlCT1RIX0VFVjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9ETFlQUlRfQkFMQU5DRURfRUVWNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0RMWVBSVF9ERUxBWU9VVDFfRUVWNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0RMWVBSVF9ERUxBWU9VVDJfRUVWNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0RMWVBSVF9ERUxBWUJPVEhfRUVWNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0RMWVBSVF9CQUxBTkNFRF9FRVY3CisgICoKKyAgKiAgICAgICAgIEZvciB0aW1lcnMgRCBhbmQgRSB0aGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9ETFlQUlRfREVMQVlPVVQxX0VFVjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9ETFlQUlRfREVMQVlPVVQyX0VFVjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9ETFlQUlRfREVMQVlCT1RIX0VFVjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9ETFlQUlRfQkFMQU5DRURfRUVWOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0RMWVBSVF9ERUxBWU9VVDFfRUVWOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0RMWVBSVF9ERUxBWU9VVDJfRUVWOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0RMWVBSVF9ERUxBWUJPVEhfRUVWOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0RMWVBSVF9CQUxBTkNFRF9FRVY5CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fVElNX0dldERMWVBSVE1vZGUoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfVEFDRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zVGltZXJ4UmVnc1swXS5PVVR4UikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgSFJUSU1fT1VUUl9ETFlQUlQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgZGVsYXllZCBwcm90ZWN0aW9uIChETFlQUlQpIGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgT1VUeFIgICAgICBETFlQUlRFTiAgICAgICBMTF9IUlRJTV9USU1fRW5hYmxlRExZUFJUCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGNhbGxlZCBvbmNlIHRoZSBjb25jZXJuZWQgdGltZXIgaXMgZW5hYmxlZAorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fVElNX0VuYWJsZURMWVBSVChIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9UQUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNUaW1lcnhSZWdzWzBdLk9VVHhSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBTRVRfQklUKCpwUmVnLCBIUlRJTV9PVVRSX0RMWVBSVEVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGRlbGF5ZWQgcHJvdGVjdGlvbiAoRExZUFJUKSBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIE9VVHhSICAgICAgRExZUFJURU4gICAgICAgTExfSFJUSU1fVElNX0Rpc2FibGVETFlQUlQKKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgY2FsbGVkIG9uY2UgdGhlIGNvbmNlcm5lZCB0aW1lciBpcyBlbmFibGVkCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9USU1fRGlzYWJsZURMWVBSVChIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9UQUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNUaW1lcnhSZWdzWzBdLk9VVHhSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBDTEVBUl9CSVQoKnBSZWcsIEhSVElNX09VVFJfRExZUFJURU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgZGVsYXllZCBwcm90ZWN0aW9uIChETFlQUlQpIGlzIGVuYWJsZWQgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBPVVR4UiAgICAgIERMWVBSVEVOICAgICAgIExMX0hSVElNX1RJTV9Jc0VuYWJsZWRETFlQUlQKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIERMWVBSVEVOIGJpdCBpbiBIUlRJTV9PVVR4UiByZWdpc3RlciAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9USU1fSXNFbmFibGVkRExZUFJUKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX1RBQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c1RpbWVyeFJlZ3NbMF0uT1VUeFIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsIEhSVElNX09VVFJfRExZUFJURU4pID09IEhSVElNX09VVFJfRExZUFJURU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgZmF1bHQgY2hhbm5lbChzKSBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIEZMVHhSICAgICAgRkxUMUVOICAgICAgIExMX0hSVElNX1RJTV9FbmFibGVGYXVsdFxuCisgICogICAgICAgICBGTFR4UiAgICAgIEZMVDJFTiAgICAgICBMTF9IUlRJTV9USU1fRW5hYmxlRmF1bHRcbgorICAqICAgICAgICAgRkxUeFIgICAgICBGTFQzRU4gICAgICAgTExfSFJUSU1fVElNX0VuYWJsZUZhdWx0XG4KKyAgKiAgICAgICAgIEZMVHhSICAgICAgRkxUNEVOICAgICAgIExMX0hSVElNX1RJTV9FbmFibGVGYXVsdFxuCisgICogICAgICAgICBGTFR4UiAgICAgIEZMVDVFTiAgICAgICBMTF9IUlRJTV9USU1fRW5hYmxlRmF1bHQKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcGFyYW0gIEZhdWx0cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GQVVMVF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkFVTFRfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZBVUxUXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GQVVMVF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkFVTFRfNQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fVElNX0VuYWJsZUZhdWx0KEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIsIHVpbnQzMl90IEZhdWx0cykKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfVEFDRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zVGltZXJ4UmVnc1swXS5GTFR4UikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgU0VUX0JJVCgqcFJlZywgRmF1bHRzKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBmYXVsdCBjaGFubmVsKHMpIGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgRkxUeFIgICAgICBGTFQxRU4gICAgICAgTExfSFJUSU1fVElNX0Rpc2FibGVGYXVsdFxuCisgICogICAgICAgICBGTFR4UiAgICAgIEZMVDJFTiAgICAgICBMTF9IUlRJTV9USU1fRGlzYWJsZUZhdWx0XG4KKyAgKiAgICAgICAgIEZMVHhSICAgICAgRkxUM0VOICAgICAgIExMX0hSVElNX1RJTV9EaXNhYmxlRmF1bHRcbgorICAqICAgICAgICAgRkxUeFIgICAgICBGTFQ0RU4gICAgICAgTExfSFJUSU1fVElNX0Rpc2FibGVGYXVsdFxuCisgICogICAgICAgICBGTFR4UiAgICAgIEZMVDVFTiAgICAgICBMTF9IUlRJTV9USU1fRGlzYWJsZUZhdWx0CisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHBhcmFtICBGYXVsdHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkFVTFRfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZBVUxUXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GQVVMVF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkFVTFRfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZBVUxUXzUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX1RJTV9EaXNhYmxlRmF1bHQoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lciwgdWludDMyX3QgRmF1bHRzKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9UQUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNUaW1lcnhSZWdzWzBdLkZMVHhSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBDTEVBUl9CSVQoKnBSZWcsIEZhdWx0cyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciB0aGUgZmF1bHQgY2hhbm5lbCBpcyBlbmFibGVkIGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgRkxUeFIgICAgICBGTFQxRU4gICAgICAgTExfSFJUSU1fVElNX0lzRW5hYmxlZEZhdWx0XG4KKyAgKiAgICAgICAgIEZMVHhSICAgICAgRkxUMkVOICAgICAgIExMX0hSVElNX1RJTV9Jc0VuYWJsZWRGYXVsdFxuCisgICogICAgICAgICBGTFR4UiAgICAgIEZMVDNFTiAgICAgICBMTF9IUlRJTV9USU1fSXNFbmFibGVkRmF1bHRcbgorICAqICAgICAgICAgRkxUeFIgICAgICBGTFQ0RU4gICAgICAgTExfSFJUSU1fVElNX0lzRW5hYmxlZEZhdWx0XG4KKyAgKiAgICAgICAgIEZMVHhSICAgICAgRkxUNUVOICAgICAgIExMX0hSVElNX1RJTV9Jc0VuYWJsZWRGYXVsdAorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEBwYXJhbSAgRmF1bHQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GQVVMVF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkFVTFRfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZBVUxUXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GQVVMVF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkFVTFRfNQorICAqIEByZXR2YWwgU3RhdGUgb2YgRkxUeEVOIGJpdCBpbiBIUlRJTV9GTFR4UiByZWdpc3RlciAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9USU1fSXNFbmFibGVkRmF1bHQoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lciwgdWludDMyX3QgRmF1bHQpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX1RBQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c1RpbWVyeFJlZ3NbMF0uRkxUeFIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsIEZhdWx0KSA9PSAoRmF1bHQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBMb2NrIHRoZSBmYXVsdCBjb25kaXRpb25pbmcgc2V0LXVwIGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgRkxUeFIgICAgICBGTFRMQ0sgICAgICAgTExfSFJUSU1fVElNX0xvY2tGYXVsdAorICAqIEBub3RlIFRpbWVyIGZhdWx0LXJlbGF0ZWQgc2V0LXVwIGlzIGZyb3plbiB1bnRpbCB0aGUgbmV4dCBIUlRJTSBvciBzeXN0ZW0gcmVzZXQKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX1RJTV9Mb2NrRmF1bHQoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfVEFDRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zVGltZXJ4UmVnc1swXS5GTFR4UikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgU0VUX0JJVCgqcFJlZywgSFJUSU1fRkxUUl9GTFRMQ0spOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlZmluZSBob3cgdGhlIHRpbWVyIGJlaGF2ZXMgZHVyaW5nIGEgYnVyc3QgbW9kZSBvcGVyYXRpb24uCisgICogQHJtdG9sbCBCTUNSICAgICAgTVRCTSAgICAgICBMTF9IUlRJTV9USU1fU2V0QnVyc3RNb2RlT3B0aW9uXG4KKyAgKiAgICAgICAgIEJNQ1IgICAgICBUQUJNICAgICAgIExMX0hSVElNX1RJTV9TZXRCdXJzdE1vZGVPcHRpb25cbgorICAqICAgICAgICAgQk1DUiAgICAgIFRCQk0gICAgICAgTExfSFJUSU1fVElNX1NldEJ1cnN0TW9kZU9wdGlvblxuCisgICogICAgICAgICBCTUNSICAgICAgVENCTSAgICAgICBMTF9IUlRJTV9USU1fU2V0QnVyc3RNb2RlT3B0aW9uXG4KKyAgKiAgICAgICAgIEJNQ1IgICAgICBUREJNICAgICAgIExMX0hSVElNX1RJTV9TZXRCdXJzdE1vZGVPcHRpb25cbgorICAqICAgICAgICAgQk1DUiAgICAgIFRFQk0gICAgICAgTExfSFJUSU1fVElNX1NldEJ1cnN0TW9kZU9wdGlvbgorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgY2FsbGVkIHdoZW4gdGhlIGJ1cnN0IG1vZGUgaXMgZW5hYmxlZAorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEBwYXJhbSAgQnVydHNNb2RlT3B0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQlVSU1RNT0RFX01BSU5UQUlOQ0xPQ0sKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CVVJTVE1PREVfUkVTRVRDT1VOVEVSCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9USU1fU2V0QnVyc3RNb2RlT3B0aW9uKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIsIHVpbnQzMl90IEJ1cnRzTW9kZU9wdGlvbikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICBNT0RJRllfUkVHKEhSVElNeC0+c0NvbW1vblJlZ3MuQk1DUiwgVGltZXIsIEJ1cnRzTW9kZU9wdGlvbiA8PCBpVGltZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHJpZXZlIGhvdyB0aGUgdGltZXIgYmVoYXZlcyBkdXJpbmcgYSBidXJzdCBtb2RlIG9wZXJhdGlvbi4KKyAgKiBAcm10b2xsIEJNQ1IgICAgICBNQ1IgICAgICAgIExMX0hSVElNX1RJTV9HZXRCdXJzdE1vZGVPcHRpb25cbgorICAqICAgICAgICAgQk1DUiAgICAgIFRBQk0gICAgICAgTExfSFJUSU1fVElNX0dldEJ1cnN0TW9kZU9wdGlvblxuCisgICogICAgICAgICBCTUNSICAgICAgVEJCTSAgICAgICBMTF9IUlRJTV9USU1fR2V0QnVyc3RNb2RlT3B0aW9uXG4KKyAgKiAgICAgICAgIEJNQ1IgICAgICBUQ0JNICAgICAgIExMX0hSVElNX1RJTV9HZXRCdXJzdE1vZGVPcHRpb25cbgorICAqICAgICAgICAgQk1DUiAgICAgIFREQk0gICAgICAgTExfSFJUSU1fVElNX0dldEJ1cnN0TW9kZU9wdGlvblxuCisgICogICAgICAgICBCTUNSICAgICAgVEVCTSAgICAgICBMTF9IUlRJTV9USU1fR2V0QnVyc3RNb2RlT3B0aW9uCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBCdXJ0c01vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CVVJTVE1PREVfTUFJTlRBSU5DTE9DSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JVUlNUTU9ERV9SRVNFVENPVU5URVIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9USU1fR2V0QnVyc3RNb2RlT3B0aW9uKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmV0dXJuIChSRUFEX0JJVChIUlRJTXgtPnNDb21tb25SZWdzLkJNQ1IsIFRpbWVyKSA+PiBpVGltZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFByb2dyYW0gd2hpY2ggcmVnaXN0ZXJzIGFyZSB0byBiZSB3cml0dGVuIGJ5IEJ1cnN0IERNQSB0cmFuc2ZlcnMuCisgICogQHJtdG9sbCBCRE1VUERSICAgICAgTVRCTSAgICAgICAgTExfSFJUSU1fVElNX0NvbmZpZ0J1cnN0RE1BXG4KKyAgKiAgICAgICAgIEJETVVQRFIgICAgICBNSUNSICAgICAgICBMTF9IUlRJTV9USU1fQ29uZmlnQnVyc3RETUFcbgorICAqICAgICAgICAgQkRNVVBEUiAgICAgIE1ESUVSICAgICAgIExMX0hSVElNX1RJTV9Db25maWdCdXJzdERNQVxuCisgICogICAgICAgICBCRE1VUERSICAgICAgTUNOVCAgICAgICAgTExfSFJUSU1fVElNX0NvbmZpZ0J1cnN0RE1BXG4KKyAgKiAgICAgICAgIEJETVVQRFIgICAgICBNUEVSICAgICAgICBMTF9IUlRJTV9USU1fQ29uZmlnQnVyc3RETUFcbgorICAqICAgICAgICAgQkRNVVBEUiAgICAgIE1SRVAgICAgICAgIExMX0hSVElNX1RJTV9Db25maWdCdXJzdERNQVxuCisgICogICAgICAgICBCRE1VUERSICAgICAgTUNNUDEgICAgICAgTExfSFJUSU1fVElNX0NvbmZpZ0J1cnN0RE1BXG4KKyAgKiAgICAgICAgIEJETVVQRFIgICAgICBNQ01QMiAgICAgICBMTF9IUlRJTV9USU1fQ29uZmlnQnVyc3RETUFcbgorICAqICAgICAgICAgQkRNVVBEUiAgICAgIE1DTVAzICAgICAgIExMX0hSVElNX1RJTV9Db25maWdCdXJzdERNQVxuCisgICogICAgICAgICBCRE1VUERSICAgICAgTUNNUDQgICAgICAgTExfSFJUSU1fVElNX0NvbmZpZ0J1cnN0RE1BXG4KKyAgKiAgICAgICAgIEJEVHhVUERSICAgICBUSU14Q1IgICAgICBMTF9IUlRJTV9USU1fQ29uZmlnQnVyc3RETUFcbgorICAqICAgICAgICAgQkRUeFVQRFIgICAgIFRJTXhJQ1IgICAgIExMX0hSVElNX1RJTV9Db25maWdCdXJzdERNQVxuCisgICogICAgICAgICBCRFR4VVBEUiAgICAgVElNeERJRVIgICAgTExfSFJUSU1fVElNX0NvbmZpZ0J1cnN0RE1BXG4KKyAgKiAgICAgICAgIEJEVHhVUERSICAgICBUSU14Q05UICAgICBMTF9IUlRJTV9USU1fQ29uZmlnQnVyc3RETUFcbgorICAqICAgICAgICAgQkRUeFVQRFIgICAgIFRJTXhQRVIgICAgIExMX0hSVElNX1RJTV9Db25maWdCdXJzdERNQVxuCisgICogICAgICAgICBCRFR4VVBEUiAgICAgVElNeFJFUCAgICAgTExfSFJUSU1fVElNX0NvbmZpZ0J1cnN0RE1BXG4KKyAgKiAgICAgICAgIEJEVHhVUERSICAgICBUSU14Q01QMSAgICBMTF9IUlRJTV9USU1fQ29uZmlnQnVyc3RETUFcbgorICAqICAgICAgICAgQkRUeFVQRFIgICAgIFRJTXhDTVAyICAgIExMX0hSVElNX1RJTV9Db25maWdCdXJzdERNQVxuCisgICogICAgICAgICBCRFR4VVBEUiAgICAgVElNeENNUDMgICAgTExfSFJUSU1fVElNX0NvbmZpZ0J1cnN0RE1BXG4KKyAgKiAgICAgICAgIEJEVHhVUERSICAgICBUSU14Q01QNCAgICBMTF9IUlRJTV9USU1fQ29uZmlnQnVyc3RETUFcbgorICAqICAgICAgICAgQkRUeFVQRFIgICAgIFRJTXhEVFIgICAgIExMX0hSVElNX1RJTV9Db25maWdCdXJzdERNQVxuCisgICogICAgICAgICBCRFR4VVBEUiAgICAgVElNeFNFVDFSICAgTExfSFJUSU1fVElNX0NvbmZpZ0J1cnN0RE1BXG4KKyAgKiAgICAgICAgIEJEVHhVUERSICAgICBUSU14UlNUMVIgICBMTF9IUlRJTV9USU1fQ29uZmlnQnVyc3RETUFcbgorICAqICAgICAgICAgQkRUeFVQRFIgICAgIFRJTXhTRVQyUiAgIExMX0hSVElNX1RJTV9Db25maWdCdXJzdERNQVxuCisgICogICAgICAgICBCRFR4VVBEUiAgICAgVElNeFJTVDJSICAgTExfSFJUSU1fVElNX0NvbmZpZ0J1cnN0RE1BXG4KKyAgKiAgICAgICAgIEJEVHhVUERSICAgICBUSUFFRUZSMSAgICBMTF9IUlRJTV9USU1fQ29uZmlnQnVyc3RETUFcbgorICAqICAgICAgICAgQkRUeFVQRFIgICAgIFRJTXhFRUZSMiAgIExMX0hSVElNX1RJTV9Db25maWdCdXJzdERNQVxuCisgICogICAgICAgICBCRFR4VVBEUiAgICAgVElNeFJTVFIgICAgTExfSFJUSU1fVElNX0NvbmZpZ0J1cnN0RE1BXG4KKyAgKiAgICAgICAgIEJEVHhVUERSICAgICBUSU14T1VUUiAgICBMTF9IUlRJTV9USU1fQ29uZmlnQnVyc3RETUFcbgorICAqICAgICAgICAgQkRUeFVQRFIgICAgIFRJTXhMVENIICAgIExMX0hSVElNX1RJTV9Db25maWdCdXJzdERNQQorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEBwYXJhbSAgUmVnaXN0ZXJzIFJlZ2lzdGVycyB0byBiZSB1cGRhdGVkIGJ5IHRoZSBETUEgcmVxdWVzdAorICAqCisgICogICAgICAgICBGb3IgTWFzdGVyIHRpbWVyIHRoaXMgcGFyYW1ldGVyIGNhbiBiZSBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CVVJTVERNQV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQlVSU1RETUFfTUNSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQlVSU1RETUFfTUlDUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JVUlNURE1BX01ESUVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQlVSU1RETUFfTUNOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JVUlNURE1BX01QRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CVVJTVERNQV9NUkVQCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQlVSU1RETUFfTUNNUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CVVJTVERNQV9NQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JVUlNURE1BX01DTVAzCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQlVSU1RETUFfTUNNUDQKKyAgKgorICAqICAgICAgICAgRm9yIFRpbWVycyBBLi5FIHRoaXMgcGFyYW1ldGVyIGNhbiBiZSBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CVVJTVERNQV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQlVSU1RETUFfVElNTUNSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQlVSU1RETUFfVElNSUNSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQlVSU1RETUFfVElNRElFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JVUlNURE1BX1RJTUNOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JVUlNURE1BX1RJTVBFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JVUlNURE1BX1RJTVJFUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JVUlNURE1BX1RJTUNNUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CVVJTVERNQV9USU1DTVAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQlVSU1RETUFfVElNQ01QMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JVUlNURE1BX1RJTUNNUDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CVVJTVERNQV9USU1EVFIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CVVJTVERNQV9USU1TRVQxUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JVUlNURE1BX1RJTVJTVDFSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQlVSU1RETUFfVElNU0VUMlIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CVVJTVERNQV9USU1SU1QyUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JVUlNURE1BX1RJTUVFRlIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQlVSU1RETUFfVElNRUVGUjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CVVJTVERNQV9USU1SU1RSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQlVSU1RETUFfVElNQ0hQUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JVUlNURE1BX1RJTU9VVFIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CVVJTVERNQV9USU1GTFRSCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9USU1fQ29uZmlnQnVyc3RETUEoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lciwgdWludDMyX3QgUmVnaXN0ZXJzKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c0NvbW1vblJlZ3MuQkRNVVBSKSArIDQgKiBpVGltZXIpKTsKKyAgV1JJVEVfUkVHKCpwUmVnLCBSZWdpc3RlcnMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIG9uIHdoaWNoIG91dHB1dCB0aGUgc2lnbmFsIGlzIGN1cnJlbnRseSBhcHBsaWVkLgorICAqIEBybXRvbGwgVElNeElTUiAgICAgIENQUFNUQVQgICAgICAgIExMX0hSVElNX1RJTV9HZXRDdXJyZW50UHVzaFB1bGxTdGF0dXMKKyAgKiBAbm90ZSBPbmx5IHNpZ25pZmljYW50IHdoZW4gdGhlIHRpbWVyIG9wZXJhdGVzIGluIHB1c2gtcHVsbCBtb2RlLgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgQ1BQU1RBVCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NQUFNUQVRfT1VUUFVUMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NQUFNUQVRfT1VUUFVUMgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX1RJTV9HZXRDdXJyZW50UHVzaFB1bGxTdGF0dXMoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1JU1IpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsIEhSVElNX1RJTUlTUl9DUFBTVEFUKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgb24gd2hpY2ggb3V0cHV0IHRoZSBzaWduYWwgd2FzIGFwcGxpZWQsIGluIHB1c2gtcHVsbCBtb2RlLCBiYWxhbmNlZCBmYXVsdCBtb2RlIG9yIGRlbGF5ZWQgaWRsZSBtb2RlLCB3aGVuIHRoZSBwcm90ZWN0aW9uIHdhcyB0cmlnZ2VyZWQuCisgICogQHJtdG9sbCBUSU14SVNSICAgICAgSVBQU1RBVCAgICAgICAgTExfSFJUSU1fVElNX0dldElkbGVQdXNoUHVsbFN0YXR1cworICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgSVBQU1RBVCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0lQUFNUQVRfT1VUUFVUMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0lQUFNUQVRfT1VUUFVUMgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX1RJTV9HZXRJZGxlUHVzaFB1bGxTdGF0dXMoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1JU1IpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsIEhSVElNX1RJTUlTUl9JUFBTVEFUKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBldmVudCBmaWx0ZXIgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBFRUZ4UjEgICAgICBFRTFMVENIICAgICAgICBMTF9IUlRJTV9USU1fU2V0RXZlbnRGaWx0ZXJcbgorICAqICAgICAgICAgRUVGeFIxICAgICAgRUUyTFRDSCAgICAgICAgTExfSFJUSU1fVElNX1NldEV2ZW50RmlsdGVyXG4KKyAgKiAgICAgICAgIEVFRnhSMSAgICAgIEVFM0xUQ0ggICAgICAgIExMX0hSVElNX1RJTV9TZXRFdmVudEZpbHRlclxuCisgICogICAgICAgICBFRUZ4UjEgICAgICBFRTRMVENIICAgICAgICBMTF9IUlRJTV9USU1fU2V0RXZlbnRGaWx0ZXJcbgorICAqICAgICAgICAgRUVGeFIxICAgICAgRUU1TFRDSCAgICAgICAgTExfSFJUSU1fVElNX1NldEV2ZW50RmlsdGVyXG4KKyAgKiAgICAgICAgIEVFRnhSMiAgICAgIEVFNkxUQ0ggICAgICAgIExMX0hSVElNX1RJTV9TZXRFdmVudEZpbHRlclxuCisgICogICAgICAgICBFRUZ4UjIgICAgICBFRTdMVENIICAgICAgICBMTF9IUlRJTV9USU1fU2V0RXZlbnRGaWx0ZXJcbgorICAqICAgICAgICAgRUVGeFIyICAgICAgRUU4TFRDSCAgICAgICAgTExfSFJUSU1fVElNX1NldEV2ZW50RmlsdGVyXG4KKyAgKiAgICAgICAgIEVFRnhSMiAgICAgIEVFOUxUQ0ggICAgICAgIExMX0hSVElNX1RJTV9TZXRFdmVudEZpbHRlclxuCisgICogICAgICAgICBFRUZ4UjIgICAgICBFRTEwTFRDSCAgICAgICBMTF9IUlRJTV9USU1fU2V0RXZlbnRGaWx0ZXIKKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGNhbGxlZCB3aGVuIHRoZSB0aW1lciBjb3VudGVyIGlzIGVuYWJsZWQuCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHBhcmFtICBFdmVudCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzEwCisgICogQHBhcmFtICBGaWx0ZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRUZMVFJfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFRkxUUl9CTEFOS0lOR0NNUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRUZMVFJfQkxBTktJTkdDTVAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRUVGTFRSX0JMQU5LSU5HQ01QMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFRkxUUl9CTEFOS0lOR0NNUDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRUZMVFJfQkxBTktJTkdGTFRSMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFRkxUUl9CTEFOS0lOR0ZMVFIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRUVGTFRSX0JMQU5LSU5HRkxUUjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRUZMVFJfQkxBTktJTkdGTFRSNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFRkxUUl9CTEFOS0lOR0ZMVFI1CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRUVGTFRSX0JMQU5LSU5HRkxUUjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRUZMVFJfQkxBTktJTkdGTFRSNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFRkxUUl9CTEFOS0lOR0ZMVFI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRUVGTFRSX1dJTkRPV0lOR0NNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRUZMVFJfV0lORE9XSU5HQ01QMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFRkxUUl9XSU5ET1dJTkdUSU0KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX1RJTV9TZXRFdmVudEZpbHRlcihIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyLCB1aW50MzJfdCBFdmVudCwgdWludDMyX3QgRmlsdGVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIFBPU0lUSU9OX1ZBTChMTF9IUlRJTV9USU1FUl9BKSk7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlFdmVudCA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoRXZlbnQpIC0gUE9TSVRJT05fVkFMKExMX0hSVElNX0VWRU5UXzEpKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zVGltZXJ4UmVnc1swXS5FRUZ4UjEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdICsgUkVHX09GRlNFVF9UQUJfRUVDUltpRXZlbnRdKSk7CisgIE1PRElGWV9SRUcoKnBSZWcsIChIUlRJTV9FRUZSMV9FRTFGTFRSIDw8IFJFR19TSElGVF9UQUJfRUV4U1JDW2lFdmVudF0pLCAoRmlsdGVyIDw8IFJFR19TSElGVF9UQUJfRUV4U1JDW2lFdmVudF0pKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIGV2ZW50IGZpbHRlciBzZXR0aW5ncyBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIEVFRnhSMSAgICAgIEVFMUZMVFIgICAgICAgIExMX0hSVElNX1RJTV9HZXRFdmVudEZpbHRlclxuCisgICogICAgICAgICBFRUZ4UjEgICAgICBFRTJGTFRSICAgICAgICBMTF9IUlRJTV9USU1fR2V0RXZlbnRGaWx0ZXJcbgorICAqICAgICAgICAgRUVGeFIxICAgICAgRUUzRkxUUiAgICAgICAgTExfSFJUSU1fVElNX0dldEV2ZW50RmlsdGVyXG4KKyAgKiAgICAgICAgIEVFRnhSMSAgICAgIEVFNEZMVFIgICAgICAgIExMX0hSVElNX1RJTV9HZXRFdmVudEZpbHRlclxuCisgICogICAgICAgICBFRUZ4UjEgICAgICBFRTVGTFRSICAgICAgICBMTF9IUlRJTV9USU1fR2V0RXZlbnRGaWx0ZXJcbgorICAqICAgICAgICAgRUVGeFIyICAgICAgRUU2RkxUUiAgICAgICAgTExfSFJUSU1fVElNX0dldEV2ZW50RmlsdGVyXG4KKyAgKiAgICAgICAgIEVFRnhSMiAgICAgIEVFN0ZMVFIgICAgICAgIExMX0hSVElNX1RJTV9HZXRFdmVudEZpbHRlclxuCisgICogICAgICAgICBFRUZ4UjIgICAgICBFRThGTFRSICAgICAgICBMTF9IUlRJTV9USU1fR2V0RXZlbnRGaWx0ZXJcbgorICAqICAgICAgICAgRUVGeFIyICAgICAgRUU5RkxUUiAgICAgICAgTExfSFJUSU1fVElNX0dldEV2ZW50RmlsdGVyXG4KKyAgKiAgICAgICAgIEVFRnhSMiAgICAgIEVFMTBGTFRSICAgICAgIExMX0hSVElNX1RJTV9HZXRFdmVudEZpbHRlcgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEBwYXJhbSAgRXZlbnQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF8xMAorICAqIEByZXR2YWwgRmlsdGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRUVGTFRSX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRUZMVFJfQkxBTktJTkdDTVAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRUVGTFRSX0JMQU5LSU5HQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFRkxUUl9CTEFOS0lOR0NNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRUZMVFJfQkxBTktJTkdDTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRUVGTFRSX0JMQU5LSU5HRkxUUjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRUZMVFJfQkxBTktJTkdGTFRSMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFRkxUUl9CTEFOS0lOR0ZMVFIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRUVGTFRSX0JMQU5LSU5HRkxUUjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRUZMVFJfQkxBTktJTkdGTFRSNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFRkxUUl9CTEFOS0lOR0ZMVFI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRUVGTFRSX0JMQU5LSU5HRkxUUjcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRUZMVFJfQkxBTktJTkdGTFRSOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFRkxUUl9XSU5ET1dJTkdDTVAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRUVGTFRSX1dJTkRPV0lOR0NNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRUZMVFJfV0lORE9XSU5HVElNCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fVElNX0dldEV2ZW50RmlsdGVyKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIsIHVpbnQzMl90IEV2ZW50KQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIFBPU0lUSU9OX1ZBTChMTF9IUlRJTV9USU1FUl9BKSk7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlFdmVudCA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoRXZlbnQpIC0gUE9TSVRJT05fVkFMKExMX0hSVElNX0VWRU5UXzEpKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zVGltZXJ4UmVnc1swXS5FRUZ4UjEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdICsgUkVHX09GRlNFVF9UQUJfRUVDUltpRXZlbnRdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsIEhSVElNX0VFRlIxX0VFMUZMVFIgPDwgUkVHX1NISUZUX1RBQl9FRXhTUkNbaUV2ZW50XSkgPj4gIFJFR19TSElGVF9UQUJfRUV4U1JDW2lFdmVudF0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIGV2ZW50IGxhdGNoIG1lY2hhbmlzbSBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIEVFRnhSMSAgICAgIEVFMUxUQ0ggICAgICAgIExMX0hSVElNX1RJTV9TZXRFdmVudExhdGNoU3RhdHVzXG4KKyAgKiAgICAgICAgIEVFRnhSMSAgICAgIEVFMkxUQ0ggICAgICAgIExMX0hSVElNX1RJTV9TZXRFdmVudExhdGNoU3RhdHVzXG4KKyAgKiAgICAgICAgIEVFRnhSMSAgICAgIEVFM0xUQ0ggICAgICAgIExMX0hSVElNX1RJTV9TZXRFdmVudExhdGNoU3RhdHVzXG4KKyAgKiAgICAgICAgIEVFRnhSMSAgICAgIEVFNExUQ0ggICAgICAgIExMX0hSVElNX1RJTV9TZXRFdmVudExhdGNoU3RhdHVzXG4KKyAgKiAgICAgICAgIEVFRnhSMSAgICAgIEVFNUxUQ0ggICAgICAgIExMX0hSVElNX1RJTV9TZXRFdmVudExhdGNoU3RhdHVzXG4KKyAgKiAgICAgICAgIEVFRnhSMiAgICAgIEVFNkxUQ0ggICAgICAgIExMX0hSVElNX1RJTV9TZXRFdmVudExhdGNoU3RhdHVzXG4KKyAgKiAgICAgICAgIEVFRnhSMiAgICAgIEVFN0xUQ0ggICAgICAgIExMX0hSVElNX1RJTV9TZXRFdmVudExhdGNoU3RhdHVzXG4KKyAgKiAgICAgICAgIEVFRnhSMiAgICAgIEVFOExUQ0ggICAgICAgIExMX0hSVElNX1RJTV9TZXRFdmVudExhdGNoU3RhdHVzXG4KKyAgKiAgICAgICAgIEVFRnhSMiAgICAgIEVFOUxUQ0ggICAgICAgIExMX0hSVElNX1RJTV9TZXRFdmVudExhdGNoU3RhdHVzXG4KKyAgKiAgICAgICAgIEVFRnhSMiAgICAgIEVFMTBMVENIICAgICAgIExMX0hSVElNX1RJTV9TZXRFdmVudExhdGNoU3RhdHVzCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgdGltZXIgY291bnRlciBpcyBlbmFibGVkLgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEBwYXJhbSAgRXZlbnQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF8xMAorICAqIEBwYXJhbSAgTGF0Y2hTdGF0dXMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRUxBVENIX0RJU0FCTEVECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRUVMQVRDSF9FTkFCTEVECisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9USU1fU2V0RXZlbnRMYXRjaFN0YXR1cyhIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyLCB1aW50MzJfdCBFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IExhdGNoU3RhdHVzKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIFBPU0lUSU9OX1ZBTChMTF9IUlRJTV9USU1FUl9BKSk7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlFdmVudCA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoRXZlbnQpIC0gUE9TSVRJT05fVkFMKExMX0hSVElNX0VWRU5UXzEpKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zVGltZXJ4UmVnc1swXS5FRUZ4UjEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdICsgUkVHX09GRlNFVF9UQUJfRUVDUltpRXZlbnRdKSk7CisgIE1PRElGWV9SRUcoKnBSZWcsIChIUlRJTV9FRUZSMV9FRTFMVENIIDw8IFJFR19TSElGVF9UQUJfRUV4U1JDW2lFdmVudF0pLCAoTGF0Y2hTdGF0dXMgPDwgUkVHX1NISUZUX1RBQl9FRXhTUkNbaUV2ZW50XSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgZXZlbnQgbGF0Y2ggc3RhdHVzIGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgRUVGeFIxICAgICAgRUUxTFRDSCAgICAgICAgTExfSFJUSU1fVElNX0dldEV2ZW50TGF0Y2hTdGF0dXNcbgorICAqICAgICAgICAgRUVGeFIxICAgICAgRUUyTFRDSCAgICAgICAgTExfSFJUSU1fVElNX0dldEV2ZW50TGF0Y2hTdGF0dXNcbgorICAqICAgICAgICAgRUVGeFIxICAgICAgRUUzTFRDSCAgICAgICAgTExfSFJUSU1fVElNX0dldEV2ZW50TGF0Y2hTdGF0dXNcbgorICAqICAgICAgICAgRUVGeFIxICAgICAgRUU0TFRDSCAgICAgICAgTExfSFJUSU1fVElNX0dldEV2ZW50TGF0Y2hTdGF0dXNcbgorICAqICAgICAgICAgRUVGeFIxICAgICAgRUU1TFRDSCAgICAgICAgTExfSFJUSU1fVElNX0dldEV2ZW50TGF0Y2hTdGF0dXNcbgorICAqICAgICAgICAgRUVGeFIyICAgICAgRUU2TFRDSCAgICAgICAgTExfSFJUSU1fVElNX0dldEV2ZW50TGF0Y2hTdGF0dXNcbgorICAqICAgICAgICAgRUVGeFIyICAgICAgRUU3TFRDSCAgICAgICAgTExfSFJUSU1fVElNX0dldEV2ZW50TGF0Y2hTdGF0dXNcbgorICAqICAgICAgICAgRUVGeFIyICAgICAgRUU4TFRDSCAgICAgICAgTExfSFJUSU1fVElNX0dldEV2ZW50TGF0Y2hTdGF0dXNcbgorICAqICAgICAgICAgRUVGeFIyICAgICAgRUU5TFRDSCAgICAgICAgTExfSFJUSU1fVElNX0dldEV2ZW50TGF0Y2hTdGF0dXNcbgorICAqICAgICAgICAgRUVGeFIyICAgICAgRUUxMExUQ0ggICAgICAgTExfSFJUSU1fVElNX0dldEV2ZW50TGF0Y2hTdGF0dXMKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcGFyYW0gIEV2ZW50IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfMTAKKyAgKiBAcmV0dmFsIExhdGNoU3RhdHVzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRUVMQVRDSF9ESVNBQkxFRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFTEFUQ0hfRU5BQkxFRAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX1RJTV9HZXRFdmVudExhdGNoU3RhdHVzKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIsIHVpbnQzMl90IEV2ZW50KQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIFBPU0lUSU9OX1ZBTChMTF9IUlRJTV9USU1FUl9BKSk7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlFdmVudCA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoRXZlbnQpIC0gUE9TSVRJT05fVkFMKExMX0hSVElNX0VWRU5UXzEpKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zVGltZXJ4UmVnc1swXS5FRUZ4UjEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdICsgUkVHX09GRlNFVF9UQUJfRUVDUltpRXZlbnRdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsIEhSVElNX0VFRlIxX0VFMUxUQ0ggPDwgUkVHX1NISUZUX1RBQl9FRXhTUkNbaUV2ZW50XSkgPj4gIFJFR19TSElGVF9UQUJfRUV4U1JDW2lFdmVudF0pOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0VGX0RlYWRfVGltZV9Db25maWd1cmF0aW9uIERlYWRfVGltZV9Db25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIGRlYWQgdGltZSBpbnNlcnRpb24gZmVhdHVyZSBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIERUeFIgICAgICBEVFBSU0MgICAgIExMX0hSVElNX0RUX0NvbmZpZ1xuCisgICogICAgICAgICBEVHhSICAgICAgU0RURiAgICAgICBMTF9IUlRJTV9EVF9Db25maWdcbgorICAqICAgICAgICAgRFR4UiAgICAgIFNEUlQgICAgICAgTExfSFJUSU1fRFRfQ29uZmlnCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHBhcmFtICBDb25maWd1cmF0aW9uIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBjb21iaW5hdGlvbiBvZiBhbGwgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRFRfUFJFU0NBTEVSX01VTDggb3IgLi4uIG9yIEByZWYgTExfSFJUSU1fRFRfUFJFU0NBTEVSX0RJVjE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRFRfUklTSU5HX1BPU0lUSVZFIG9yIEByZWYgTExfSFJUSU1fRFRfUklTSU5HX05FR0FUSVZFCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRFRfRkFMTElOR19QT1NJVElWRSBvciBAcmVmIExMX0hSVElNX0RUX0ZBTExJTkdfTkVHQVRJVkUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0RUX0NvbmZpZyhIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyLCB1aW50MzJfdCBDb25maWd1cmF0aW9uKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9UQUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNUaW1lcnhSZWdzWzBdLkRUeFIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIE1PRElGWV9SRUcoKnBSZWcsIEhSVElNX0RUUl9TRFRGIHwgSFJUSU1fRFRSX0RUUFJTQyB8IEhSVElNX0RUUl9TRFRSLCBDb25maWd1cmF0aW9uKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGRlYWR0aW1lIHByZXNjYWxlciB2YWx1ZS4KKyAgKiBAcm10b2xsIERUeFIgICAgICBEVFBSU0MgICAgIExMX0hSVElNX0RUX1NldFByZXNjYWxlcgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEBwYXJhbSAgUHJlc2NhbGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRFRfUFJFU0NBTEVSX01VTDgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9EVF9QUkVTQ0FMRVJfTVVMNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0RUX1BSRVNDQUxFUl9NVUwyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRFRfUFJFU0NBTEVSX0RJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9EVF9QUkVTQ0FMRVJfRElWMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0RUX1BSRVNDQUxFUl9ESVY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRFRfUFJFU0NBTEVSX0RJVjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9EVF9QUkVTQ0FMRVJfRElWMTYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0RUX1NldFByZXNjYWxlcihIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyLCB1aW50MzJfdCBQcmVzY2FsZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX1RBQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c1RpbWVyeFJlZ3NbMF0uRFR4UikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgTU9ESUZZX1JFRygqcFJlZywgSFJUSU1fRFRSX0RUUFJTQywgUHJlc2NhbGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIGRlYWR0aW1lIHByZXNjYWxlciB2YWx1ZS4KKyAgKiBAcm10b2xsIERUeFIgICAgICBEVFBSU0MgICAgIExMX0hSVElNX0RUX0dldFByZXNjYWxlcgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgUHJlc2NhbGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRFRfUFJFU0NBTEVSX01VTDgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9EVF9QUkVTQ0FMRVJfTVVMNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0RUX1BSRVNDQUxFUl9NVUwyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRFRfUFJFU0NBTEVSX0RJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9EVF9QUkVTQ0FMRVJfRElWMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0RUX1BSRVNDQUxFUl9ESVY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRFRfUFJFU0NBTEVSX0RJVjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9EVF9QUkVTQ0FMRVJfRElWMTYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9EVF9HZXRQcmVzY2FsZXIoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfVEFDRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zVGltZXJ4UmVnc1swXS5EVHhSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9EVFJfRFRQUlNDKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBkZWFkdGltZSByaXNpbmcgdmFsdWUuCisgICogQHJtdG9sbCBEVHhSICAgICAgRFRSICAgICAgIExMX0hSVElNX0RUX1NldFJpc2luZ1ZhbHVlCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHBhcmFtICBSaXNpbmdWYWx1ZSBWYWx1ZSBiZXR3ZWVuIDAgYW5kIDB4MUZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9EVF9TZXRSaXNpbmdWYWx1ZShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyLCB1aW50MzJfdCBSaXNpbmdWYWx1ZSkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfVEFDRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zVGltZXJ4UmVnc1swXS5EVHhSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBNT0RJRllfUkVHKCpwUmVnLCBIUlRJTV9EVFJfRFRSLCBSaXNpbmdWYWx1ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCBkZWFkdGltZSByaXNpbmcgdmFsdWUuCisgICogQHJtdG9sbCBEVHhSICAgICAgRFRSICAgICAgIExMX0hSVElNX0RUX0dldFJpc2luZ1ZhbHVlCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgKiBAcmV0dmFsIFJpc2luZ1ZhbHVlIFZhbHVlIGJldHdlZW4gMCBhbmQgMHgxRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9EVF9HZXRSaXNpbmdWYWx1ZShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9UQUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNUaW1lcnhSZWdzWzBdLkRUeFIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsIEhSVElNX0RUUl9EVFIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGRlYWR0aW1lIHNpZ24gb24gcmlzaW5nIGVkZ2UuCisgICogQHJtdG9sbCBEVHhSICAgICAgU0RUUiAgICAgICBMTF9IUlRJTV9EVF9TZXRSaXNpbmdTaWduCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHBhcmFtICBSaXNpbmdTaWduIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRFRfUklTSU5HX1BPU0lUSVZFCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRFRfUklTSU5HX05FR0FUSVZFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9EVF9TZXRSaXNpbmdTaWduKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIsIHVpbnQzMl90IFJpc2luZ1NpZ24pCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX1RBQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c1RpbWVyeFJlZ3NbMF0uRFR4UikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgTU9ESUZZX1JFRygqcFJlZywgSFJUSU1fRFRSX1NEVFIsIFJpc2luZ1NpZ24pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgZGVhZHRpbWUgc2lnbiBvbiByaXNpbmcgZWRnZS4KKyAgKiBAcm10b2xsIERUeFIgICAgICBTRFRSICAgICAgIExMX0hSVElNX0RUX0dldFJpc2luZ1NpZ24KKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIFJpc2luZ1NpZ24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9EVF9SSVNJTkdfUE9TSVRJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9EVF9SSVNJTkdfTkVHQVRJVkUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9EVF9HZXRSaXNpbmdTaWduKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX1RBQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c1RpbWVyeFJlZ3NbMF0uRFR4UikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgSFJUSU1fRFRSX1NEVFIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGRlYWRpbWUgZmFsbGluZyB2YWx1ZS4KKyAgKiBAcm10b2xsIERUeFIgICAgICBEVEYgICAgICAgTExfSFJUSU1fRFRfU2V0RmFsbGluZ1ZhbHVlCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHBhcmFtICBGYWxsaW5nVmFsdWUgVmFsdWUgYmV0d2VlbiAwIGFuZCAweDFGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRFRfU2V0RmFsbGluZ1ZhbHVlKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIsIHVpbnQzMl90IEZhbGxpbmdWYWx1ZSkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfVEFDRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zVGltZXJ4UmVnc1swXS5EVHhSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBNT0RJRllfUkVHKCpwUmVnLCBIUlRJTV9EVFJfRFRGLCBGYWxsaW5nVmFsdWUgPDwgSFJUSU1fRFRSX0RURl9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgZGVhZHRpbWUgZmFsbGluZyB2YWx1ZQorICAqIEBybXRvbGwgRFR4UiAgICAgIERURiAgICAgICBMTF9IUlRJTV9EVF9HZXRGYWxsaW5nVmFsdWUKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAqIEByZXR2YWwgRmFsbGluZ1ZhbHVlIFZhbHVlIGJldHdlZW4gMCBhbmQgMHgxRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9EVF9HZXRGYWxsaW5nVmFsdWUoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfVEFDRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zVGltZXJ4UmVnc1swXS5EVHhSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKChSRUFEX0JJVCgqcFJlZywgSFJUSU1fRFRSX0RURikpID4+IEhSVElNX0RUUl9EVEZfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGRlYWR0aW1lIHNpZ24gb24gZmFsbGluZyBlZGdlLgorICAqIEBybXRvbGwgRFR4UiAgICAgIFNEVEYgICAgICAgTExfSFJUSU1fRFRfU2V0RmFsbGluZ1NpZ24KKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcGFyYW0gIEZhbGxpbmdTaWduIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRFRfRkFMTElOR19QT1NJVElWRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0RUX0ZBTExJTkdfTkVHQVRJVkUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0RUX1NldEZhbGxpbmdTaWduKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIsIHVpbnQzMl90IEZhbGxpbmdTaWduKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9UQUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNUaW1lcnhSZWdzWzBdLkRUeFIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIE1PRElGWV9SRUcoKnBSZWcsIEhSVElNX0RUUl9TRFRGLCBGYWxsaW5nU2lnbik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCBkZWFkdGltZSBzaWduIG9uIGZhbGxpbmcgZWRnZS4KKyAgKiBAcm10b2xsIERUeFIgICAgICBTRFRGICAgICAgIExMX0hSVElNX0RUX0dldEZhbGxpbmdTaWduCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBGYWxsaW5nU2lnbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0RUX0ZBTExJTkdfUE9TSVRJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9EVF9GQUxMSU5HX05FR0FUSVZFCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fRFRfR2V0RmFsbGluZ1NpZ24oSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfVEFDRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zVGltZXJ4UmVnc1swXS5EVHhSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9EVFJfU0RURikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIExvY2sgdGhlIGRlYWR0aW1lIHZhbHVlIGFuZCBzaWduIG9uIHJpc2luZyBlZGdlLgorICAqIEBybXRvbGwgRFR4UiAgICAgIERUUkxLICAgICAgIExMX0hSVElNX0RUX0xvY2tSaXNpbmcKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0RUX0xvY2tSaXNpbmcoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfVEFDRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zVGltZXJ4UmVnc1swXS5EVHhSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBTRVRfQklUKCpwUmVnLCBIUlRJTV9EVFJfRFRSTEspOworfQorCisvKioKKyAgKiBAYnJpZWYgIExvY2sgdGhlIGRlYWR0aW1lIHNpZ24gb24gcmlzaW5nIGVkZ2UuCisgICogQHJtdG9sbCBEVHhSICAgICAgRFRSU0xLICAgICAgIExMX0hSVElNX0RUX0xvY2tSaXNpbmdTaWduCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9EVF9Mb2NrUmlzaW5nU2lnbihIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9UQUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNUaW1lcnhSZWdzWzBdLkRUeFIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIFNFVF9CSVQoKnBSZWcsIEhSVElNX0RUUl9EVFJTTEspOworfQorCisvKioKKyAgKiBAYnJpZWYgIExvY2sgdGhlIGRlYWR0aW1lIHZhbHVlIGFuZCBzaWduIG9uIGZhbGxpbmcgZWRnZS4KKyAgKiBAcm10b2xsIERUeFIgICAgICBEVEZMSyAgICAgICBMTF9IUlRJTV9EVF9Mb2NrRmFsbGluZworICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRFRfTG9ja0ZhbGxpbmcoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfVEFDRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zVGltZXJ4UmVnc1swXS5EVHhSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBTRVRfQklUKCpwUmVnLCBIUlRJTV9EVFJfRFRGTEspOworfQorCisvKioKKyAgKiBAYnJpZWYgIExvY2sgdGhlIGRlYWR0aW1lIHNpZ24gb24gZmFsbGluZyBlZGdlLgorICAqIEBybXRvbGwgRFR4UiAgICAgIERURlNMSyAgICAgICBMTF9IUlRJTV9EVF9Mb2NrRmFsbGluZ1NpZ24KKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0RUX0xvY2tGYWxsaW5nU2lnbihIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9UQUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNUaW1lcnhSZWdzWzBdLkRUeFIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIFNFVF9CSVQoKnBSZWcsIEhSVElNX0RUUl9EVEZTTEspOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0VGX0Nob3BwZXJfTW9kZV9Db25maWd1cmF0aW9uIENob3BwZXJfTW9kZV9Db25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIGNob3BwZXIgc3RhZ2UgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBDSFB4UiAgICAgIENBUkZSUSAgICAgICBMTF9IUlRJTV9DSFBfQ29uZmlnXG4KKyAgKiAgICAgICAgIENIUHhSICAgICAgQ0FSRFRZICAgICAgIExMX0hSVElNX0NIUF9Db25maWdcbgorICAqICAgICAgICAgQ0hQeFIgICAgICBTVFJUUFcgICAgICAgTExfSFJUSU1fQ0hQX0NvbmZpZworICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgY2FsbGVkIGlmIHRoZSBjaG9wcGVyIG1vZGUgaXMgYWxyZWFkeQorICAqICAgICAgIGVuYWJsZWQgZm9yIG9uZSBvZiB0aGUgdGltZXIgb3V0cHV0cy4KKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcGFyYW0gIENvbmZpZ3VyYXRpb24gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIGNvbWJpbmF0aW9uIG9mIGFsbCB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfUFJFU0NBTEVSX0RJVjE2IG9yIC4uLiBvciBAcmVmIExMX0hSVElNX0NIUF9QUkVTQ0FMRVJfRElWMjU2CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0hQX0RVVFlDWUNMRV8wIG9yIC4uLiBvciBAcmVmIExMX0hSVElNX0NIUF9EVVRZQ1lDTEVfODc1CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0hQX1BVTFNFV0lEVEhfMTYgb3IgLi4uIG9yIEByZWYgTExfSFJUSU1fQ0hQX1BVTFNFV0lEVEhfMjU2CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9DSFBfQ29uZmlnKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIsIHVpbnQzMl90IENvbmZpZ3VyYXRpb24pCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX1RBQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c1RpbWVyeFJlZ3NbMF0uQ0hQeFIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIE1PRElGWV9SRUcoKnBSZWcsIEhSVElNX0NIUFJfU1RSUFcgfCBIUlRJTV9DSFBSX0NBUkRUWSB8IEhSVElNX0NIUFJfQ0FSRlJRLCBDb25maWd1cmF0aW9uKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgcHJlc2NhbGVyIGRldGVybWluaW5nIHRoZSBjYXJyaWVyIGZyZXF1ZW5jeSB0byBiZSBhZGRlZCBvbiB0b3AKKyAgKiAgICAgICAgIG9mIHRoZSB0aW1lciBvdXRwdXQgc2lnbmFscyB3aGVuIGNob3BwZXIgbW9kZSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgQ0hQeFIgICAgICBDQVJGUlEgICAgICAgTExfSFJUSU1fQ0hQX1NldFByZXNjYWxlcgorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgY2FsbGVkIGlmIHRoZSBjaG9wcGVyIG1vZGUgaXMgYWxyZWFkeQorICAqICAgICAgIGVuYWJsZWQgZm9yIG9uZSBvZiB0aGUgdGltZXIgb3V0cHV0cy4KKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcGFyYW0gIFByZXNjYWxlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9QUkVTQ0FMRVJfRElWMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfUFJFU0NBTEVSX0RJVjMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0hQX1BSRVNDQUxFUl9ESVY0OAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9QUkVTQ0FMRVJfRElWNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfUFJFU0NBTEVSX0RJVjgwCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0hQX1BSRVNDQUxFUl9ESVY5NgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9QUkVTQ0FMRVJfRElWMTEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0hQX1BSRVNDQUxFUl9ESVYxMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfUFJFU0NBTEVSX0RJVjE0NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9QUkVTQ0FMRVJfRElWMTYwCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0hQX1BSRVNDQUxFUl9ESVYxNzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfUFJFU0NBTEVSX0RJVjE5MgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9QUkVTQ0FMRVJfRElWMjA4CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0hQX1BSRVNDQUxFUl9ESVYyMjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfUFJFU0NBTEVSX0RJVjI0MAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9QUkVTQ0FMRVJfRElWMjU2CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9DSFBfU2V0UHJlc2NhbGVyKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIsIHVpbnQzMl90IFByZXNjYWxlcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfVEFDRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zVGltZXJ4UmVnc1swXS5DSFB4UikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgTU9ESUZZX1JFRygqcFJlZywgSFJUSU1fQ0hQUl9DQVJGUlEsIFByZXNjYWxlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCBjaG9wcGVyIHN0YWdlIHByZXNjYWxlciB2YWx1ZS4KKyAgKiBAcm10b2xsIENIUHhSICAgICAgQ0FSRlJRICAgICAgIExMX0hSVElNX0NIUF9HZXRQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIFByZXNjYWxlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9QUkVTQ0FMRVJfRElWMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfUFJFU0NBTEVSX0RJVjMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0hQX1BSRVNDQUxFUl9ESVY0OAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9QUkVTQ0FMRVJfRElWNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfUFJFU0NBTEVSX0RJVjgwCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0hQX1BSRVNDQUxFUl9ESVY5NgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9QUkVTQ0FMRVJfRElWMTEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0hQX1BSRVNDQUxFUl9ESVYxMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfUFJFU0NBTEVSX0RJVjE0NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9QUkVTQ0FMRVJfRElWMTYwCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0hQX1BSRVNDQUxFUl9ESVYxNzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfUFJFU0NBTEVSX0RJVjE5MgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9QUkVTQ0FMRVJfRElWMjA4CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0hQX1BSRVNDQUxFUl9ESVYyMjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfUFJFU0NBTEVSX0RJVjI0MAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9QUkVTQ0FMRVJfRElWMjU2CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fQ0hQX0dldFByZXNjYWxlcihIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9UQUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNUaW1lcnhSZWdzWzBdLkNIUHhSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9DSFBSX0NBUkZSUSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgY2hvcHBlciBkdXR5IGN5Y2xlLgorICAqIEBybXRvbGwgQ0hQeFIgICAgICBDQVJEVFkgICAgICAgTExfSFJUSU1fQ0hQX1NldER1dHlDeWNsZQorICAqIEBub3RlIER1dHkgY3ljbGUgY2FuIGJlIGFkanVzdGVkIGJ5IDEvOCBzdGVwIChmcm9tIDAvOCB1cCB0byA3LzgpCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBjYWxsZWQgaWYgdGhlIGNob3BwZXIgbW9kZSBpcyBhbHJlYWR5CisgICogICAgICAgZW5hYmxlZCBmb3Igb25lIG9mIHRoZSB0aW1lciBvdXRwdXRzLgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEBwYXJhbSAgRHV0eUN5Y2xlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0hQX0RVVFlDWUNMRV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0hQX0RVVFlDWUNMRV8xMjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfRFVUWUNZQ0xFXzI1MAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9EVVRZQ1lDTEVfMzc1CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0hQX0RVVFlDWUNMRV81MDAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfRFVUWUNZQ0xFXzYyNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9EVVRZQ1lDTEVfNzUwCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0hQX0RVVFlDWUNMRV84NzUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0NIUF9TZXREdXR5Q3ljbGUoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lciwgdWludDMyX3QgRHV0eUN5Y2xlKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9UQUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNUaW1lcnhSZWdzWzBdLkNIUHhSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBNT0RJRllfUkVHKCpwUmVnLCBIUlRJTV9DSFBSX0NBUkRUWSwgRHV0eUN5Y2xlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIGNob3BwZXIgZHV0eSBjeWNsZS4KKyAgKiBAcm10b2xsIENIUHhSICAgICAgQ0FSRFRZICAgICAgIExMX0hSVElNX0NIUF9HZXREdXR5Q3ljbGUKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIER1dHlDeWNsZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9EVVRZQ1lDTEVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9EVVRZQ1lDTEVfMTI1CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0hQX0RVVFlDWUNMRV8yNTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfRFVUWUNZQ0xFXzM3NQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9EVVRZQ1lDTEVfNTAwCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0hQX0RVVFlDWUNMRV82MjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfRFVUWUNZQ0xFXzc1MAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9EVVRZQ1lDTEVfODc1CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fQ0hQX0dldER1dHlDeWNsZShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9UQUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNUaW1lcnhSZWdzWzBdLkNIUHhSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9DSFBSX0NBUkRUWSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgc3RhcnQgcHVsc2Ugd2lkdGguCisgICogQHJtdG9sbCBDSFB4UiAgICAgIFNUUlBXICAgICAgIExMX0hSVElNX0NIUF9TZXRQdWxzZVdpZHRoCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBjYWxsZWQgaWYgdGhlIGNob3BwZXIgbW9kZSBpcyBhbHJlYWR5CisgICogICAgICAgZW5hYmxlZCBmb3Igb25lIG9mIHRoZSB0aW1lciBvdXRwdXRzLgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEBwYXJhbSAgUHVsc2VXaWR0aCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9QVUxTRVdJRFRIXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0hQX1BVTFNFV0lEVEhfMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfUFVMU0VXSURUSF80OAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9QVUxTRVdJRFRIXzY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0hQX1BVTFNFV0lEVEhfODAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfUFVMU0VXSURUSF85NgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9QVUxTRVdJRFRIXzExMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9QVUxTRVdJRFRIXzEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9QVUxTRVdJRFRIXzE0NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9QVUxTRVdJRFRIXzE2MAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9QVUxTRVdJRFRIXzE3NgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9QVUxTRVdJRFRIXzE5MgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9QVUxTRVdJRFRIXzIwOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9QVUxTRVdJRFRIXzIyNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9QVUxTRVdJRFRIXzI0MAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9QVUxTRVdJRFRIXzI1NgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fQ0hQX1NldFB1bHNlV2lkdGgoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lciwgdWludDMyX3QgUHVsc2VXaWR0aCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfVEFDRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zVGltZXJ4UmVnc1swXS5DSFB4UikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgTU9ESUZZX1JFRygqcFJlZywgSFJUSU1fQ0hQUl9TVFJQVywgUHVsc2VXaWR0aCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCBzdGFydCBwdWxzZSB3aWR0aC4KKyAgKiBAcm10b2xsIENIUHhSICAgICAgU1RSUFcgICAgICAgTExfSFJUSU1fQ0hQX0dldFB1bHNlV2lkdGgKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIFB1bHNlV2lkdGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfUFVMU0VXSURUSF8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9QVUxTRVdJRFRIXzMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0hQX1BVTFNFV0lEVEhfNDgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfUFVMU0VXSURUSF82NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NIUF9QVUxTRVdJRFRIXzgwCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ0hQX1BVTFNFV0lEVEhfOTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfUFVMU0VXSURUSF8xMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfUFVMU0VXSURUSF8xMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfUFVMU0VXSURUSF8xNDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfUFVMU0VXSURUSF8xNjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfUFVMU0VXSURUSF8xNzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfUFVMU0VXSURUSF8xOTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfUFVMU0VXSURUSF8yMDgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfUFVMU0VXSURUSF8yMjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfUFVMU0VXSURUSF8yNDAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DSFBfUFVMU0VXSURUSF8yNTYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9DSFBfR2V0UHVsc2VXaWR0aChIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9UQUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNUaW1lcnhSZWdzWzBdLkNIUHhSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9DSFBSX1NUUlBXKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRUZfT3V0cHV0X01hbmFnZW1lbnQgT3V0cHV0X01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgdGltZXIgb3V0cHV0IHNldCBzb3VyY2UuCisgICogQHJtdG9sbCBTRVR4MVIgICAgICBTU1QgICAgICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBSRVNZTkMgICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBQRVIgICAgICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBDTVAxICAgICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBDTVAyICAgICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBDTVAzICAgICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBDTVA0ICAgICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBNU1RQRVIgICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBNU1RDTVAxICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBNU1RDTVAyICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBNU1RDTVAzICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBNU1RDTVA0ICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBUSU1FVk5UMSAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBUSU1FVk5UMiAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBUSU1FVk5UMyAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBUSU1FVk5UNCAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBUSU1FVk5UNSAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBUSU1FVk5UNiAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBUSU1FVk5UNyAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBUSU1FVk5UOCAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBUSU1FVk5UOSAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBFWEVWTlQxICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBFWEVWTlQyICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBFWEVWTlQzICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBFWEVWTlQ0ICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBFWEVWTlQ1ICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBFWEVWTlQ2ICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBFWEVWTlQ3ICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBFWEVWTlQ4ICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBFWEVWTlQ5ICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBFWEVWTlQxMCAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBVUERBVEUgICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBTU1QgICAgICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBSRVNZTkMgICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBQRVIgICAgICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBDTVAxICAgICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBDTVAyICAgICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBDTVAzICAgICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBDTVA0ICAgICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBNU1RQRVIgICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBNU1RDTVAxICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBNU1RDTVAyICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBNU1RDTVAzICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBNU1RDTVA0ICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBUSU1FVk5UMSAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBUSU1FVk5UMiAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBUSU1FVk5UMyAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBUSU1FVk5UNCAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBUSU1FVk5UNSAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBUSU1FVk5UNiAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBUSU1FVk5UNyAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBUSU1FVk5UOCAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBUSU1FVk5UOSAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBFWEVWTlQxICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBFWEVWTlQyICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBFWEVWTlQzICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBFWEVWTlQ0ICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBFWEVWTlQ1ICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBFWEVWTlQ2ICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBFWEVWTlQ3ICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBFWEVWTlQ4ICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBFWEVWTlQ5ICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBFWEVWTlQxMCAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyY1xuCisgICogICAgICAgICBTRVR4MVIgICAgICBVUERBVEUgICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFNldFNyYworICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgT3V0cHV0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RBMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RCMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1REMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEUxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RFMgorICAqIEBwYXJhbSBTZXRTcmMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX1JFU1lOQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX1RJTVBFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX1RJTUNNUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9USU1DTVAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfVElNQ01QMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX1RJTUNNUDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9NQVNURVJQRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9NQVNURVJDTVAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfTUFTVEVSQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX01BU1RFUkNNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9NQVNURVJDTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfVElNRVZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX1RJTUVWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9USU1FVl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfVElNRVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX1RJTUVWXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9USU1FVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfVElNRVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX1RJTUVWXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9USU1FVl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfRUVWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9FRVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX0VFVl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfRUVWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9FRVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX0VFVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfRUVWXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9FRVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX0VFVl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfRUVWXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfVVBEQVRFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9PVVRfU2V0T3V0cHV0U2V0U3JjKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgT3V0cHV0LCB1aW50MzJfdCBTZXRTcmMpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlPdXRwdXQgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKE91dHB1dCkgLSBQT1NJVElPTl9WQUwoTExfSFJUSU1fT1VUUFVUX1RBMSkpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNUaW1lcnhSZWdzWzBdLlNFVHgxUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1NFVHhSW2lPdXRwdXRdKSk7CisgIFdSSVRFX1JFRygqcFJlZywgU2V0U3JjKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHRpbWVyIG91dHB1dCBzZXQgc291cmNlLgorICAqIEBybXRvbGwgU0VUeDFSICAgICAgU1NUICAgICAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgUkVTWU5DICAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgUEVSICAgICAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgQ01QMSAgICAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgQ01QMiAgICAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgQ01QMyAgICAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgQ01QNCAgICAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgTVNUUEVSICAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgTVNUQ01QMSAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgTVNUQ01QMiAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgTVNUQ01QMyAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgTVNUQ01QNCAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgVElNRVZOVDEgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgVElNRVZOVDIgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgVElNRVZOVDMgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgVElNRVZOVDQgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgVElNRVZOVDUgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgVElNRVZOVDYgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgVElNRVZOVDcgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgVElNRVZOVDggICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgVElNRVZOVDkgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgRVhFVk5UMSAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgRVhFVk5UMiAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgRVhFVk5UMyAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgRVhFVk5UNCAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgRVhFVk5UNSAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgRVhFVk5UNiAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgRVhFVk5UNyAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgRVhFVk5UOCAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgRVhFVk5UOSAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgRVhFVk5UMTAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgVVBEQVRFICAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgU1NUICAgICAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgUkVTWU5DICAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgUEVSICAgICAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgQ01QMSAgICAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgQ01QMiAgICAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgQ01QMyAgICAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgQ01QNCAgICAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgTVNUUEVSICAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgTVNUQ01QMSAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgTVNUQ01QMiAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgTVNUQ01QMyAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgTVNUQ01QNCAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgVElNRVZOVDEgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgVElNRVZOVDIgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgVElNRVZOVDMgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgVElNRVZOVDQgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgVElNRVZOVDUgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgVElNRVZOVDYgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgVElNRVZOVDcgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgVElNRVZOVDggICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgVElNRVZOVDkgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgRVhFVk5UMSAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgRVhFVk5UMiAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgRVhFVk5UMyAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgRVhFVk5UNCAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgRVhFVk5UNSAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgRVhFVk5UNiAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgRVhFVk5UNyAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgRVhFVk5UOCAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgRVhFVk5UOSAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgRVhFVk5UMTAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmNcbgorICAqICAgICAgICAgU0VUeDFSICAgICAgVVBEQVRFICAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRTZXRTcmMKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIE91dHB1dCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RCMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RDMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEQyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RFMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URTIKKyAgKiBAcmV0dmFsIFNldFNyYyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfUkVTWU5DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfVElNUEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfVElNQ01QMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX1RJTUNNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9USU1DTVAzCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfVElNQ01QNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX01BU1RFUlBFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX01BU1RFUkNNUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9NQVNURVJDTVAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfTUFTVEVSQ01QMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX01BU1RFUkNNUDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9USU1FVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfVElNRVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX1RJTUVWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9USU1FVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfVElNRVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX1RJTUVWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9USU1FVl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfVElNRVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX1RJTUVWXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9FRVZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX0VFVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfRUVWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9FRVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX0VFVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfRUVWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9FRVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX0VFVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfRUVWXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9FRVZfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9VUERBVEUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9PVVRfR2V0T3V0cHV0U2V0U3JjKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgT3V0cHV0KQoreworICByZWdpc3RlciB1aW50MzJfdCBpT3V0cHV0ID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChPdXRwdXQpIC0gUE9TSVRJT05fVkFMKExMX0hSVElNX09VVFBVVF9UQTEpKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zVGltZXJ4UmVnc1swXS5TRVR4MVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9TRVR4UltpT3V0cHV0XSkpOworICByZXR1cm4gKHVpbnQzMl90KSBSRUFEX1JFRygqcFJlZyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSB0aW1lciBvdXRwdXQgcmVzZXQgc291cmNlLgorICAqIEBybXRvbGwgUlNUeDFSICAgICAgUlNUICAgICAgICAgIExMX0hSVElNX09VVF9TZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBSRVNZTkMgICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIFBFUiAgICAgICAgICBMTF9IUlRJTV9PVVRfU2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgQ01QMSAgICAgICAgIExMX0hSVElNX09VVF9TZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBDTVAyICAgICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIENNUDMgICAgICAgICBMTF9IUlRJTV9PVVRfU2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgQ01QNCAgICAgICAgIExMX0hSVElNX09VVF9TZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBNU1RQRVIgICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIE1TVENNUDEgICAgICBMTF9IUlRJTV9PVVRfU2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgTVNUQ01QMiAgICAgIExMX0hSVElNX09VVF9TZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBNU1RDTVAzICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIE1TVENNUDQgICAgICBMTF9IUlRJTV9PVVRfU2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgVElNRVZOVDEgICAgIExMX0hSVElNX09VVF9TZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBUSU1FVk5UMiAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIFRJTUVWTlQzICAgICBMTF9IUlRJTV9PVVRfU2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgVElNRVZOVDQgICAgIExMX0hSVElNX09VVF9TZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBUSU1FVk5UNSAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIFRJTUVWTlQ2ICAgICBMTF9IUlRJTV9PVVRfU2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgVElNRVZOVDcgICAgIExMX0hSVElNX09VVF9TZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBUSU1FVk5UOCAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIFRJTUVWTlQ5ICAgICBMTF9IUlRJTV9PVVRfU2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgRVhFVk5UMSAgICAgIExMX0hSVElNX09VVF9TZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBFWEVWTlQyICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIEVYRVZOVDMgICAgICBMTF9IUlRJTV9PVVRfU2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgRVhFVk5UNCAgICAgIExMX0hSVElNX09VVF9TZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBFWEVWTlQ1ICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIEVYRVZOVDYgICAgICBMTF9IUlRJTV9PVVRfU2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgRVhFVk5UNyAgICAgIExMX0hSVElNX09VVF9TZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBFWEVWTlQ4ICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIEVYRVZOVDkgICAgICBMTF9IUlRJTV9PVVRfU2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgRVhFVk5UMTAgICAgIExMX0hSVElNX09VVF9TZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBVUERBVEUgICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIFJTVCAgICAgICAgICBMTF9IUlRJTV9PVVRfU2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgUkVTWU5DICAgICAgIExMX0hSVElNX09VVF9TZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBQRVIgICAgICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIENNUDEgICAgICAgICBMTF9IUlRJTV9PVVRfU2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgQ01QMiAgICAgICAgIExMX0hSVElNX09VVF9TZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBDTVAzICAgICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIENNUDQgICAgICAgICBMTF9IUlRJTV9PVVRfU2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgTVNUUEVSICAgICAgIExMX0hSVElNX09VVF9TZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBNU1RDTVAxICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIE1TVENNUDIgICAgICBMTF9IUlRJTV9PVVRfU2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgTVNUQ01QMyAgICAgIExMX0hSVElNX09VVF9TZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBNU1RDTVA0ICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIFRJTUVWTlQxICAgICBMTF9IUlRJTV9PVVRfU2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgVElNRVZOVDIgICAgIExMX0hSVElNX09VVF9TZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBUSU1FVk5UMyAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIFRJTUVWTlQ0ICAgICBMTF9IUlRJTV9PVVRfU2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgVElNRVZOVDUgICAgIExMX0hSVElNX09VVF9TZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBUSU1FVk5UNiAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIFRJTUVWTlQ3ICAgICBMTF9IUlRJTV9PVVRfU2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgVElNRVZOVDggICAgIExMX0hSVElNX09VVF9TZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBUSU1FVk5UOSAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIEVYRVZOVDEgICAgICBMTF9IUlRJTV9PVVRfU2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgRVhFVk5UMiAgICAgIExMX0hSVElNX09VVF9TZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBFWEVWTlQzICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIEVYRVZOVDQgICAgICBMTF9IUlRJTV9PVVRfU2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgRVhFVk5UNSAgICAgIExMX0hSVElNX09VVF9TZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBFWEVWTlQ2ICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIEVYRVZOVDcgICAgICBMTF9IUlRJTV9PVVRfU2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgRVhFVk5UOCAgICAgIExMX0hSVElNX09VVF9TZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBFWEVWTlQ5ICAgICAgTExfSFJUSU1fT1VUX1NldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIEVYRVZOVDEwICAgICBMTF9IUlRJTV9PVVRfU2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgVVBEQVRFICAgICAgIExMX0hSVElNX09VVF9TZXRPdXRwdXRSZXNldFNyYworICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgT3V0cHV0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RBMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RCMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1REMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEUxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RFMgorICAqIEBwYXJhbSBSZXNldFNyYyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfUkVTWU5DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfVElNUEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfVElNQ01QMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX1RJTUNNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9USU1DTVAzCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfVElNQ01QNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX01BU1RFUlBFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX01BU1RFUkNNUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9NQVNURVJDTVAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfTUFTVEVSQ01QMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX01BU1RFUkNNUDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9USU1FVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfVElNRVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX1RJTUVWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9USU1FVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfVElNRVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX1RJTUVWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9USU1FVl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfVElNRVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX1RJTUVWXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9FRVZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX0VFVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfRUVWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9FRVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX0VFVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfRUVWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9FRVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX0VFVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfRUVWXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9FRVZfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9VUERBVEUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX09VVF9TZXRPdXRwdXRSZXNldFNyYyhIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IE91dHB1dCwgdWludDMyX3QgUmVzZXRTcmMpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlPdXRwdXQgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKE91dHB1dCkgLSBQT1NJVElPTl9WQUwoTExfSFJUSU1fT1VUUFVUX1RBMSkpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNUaW1lcnhSZWdzWzBdLlJTVHgxUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1NFVHhSW2lPdXRwdXRdKSk7CisgIFdSSVRFX1JFRygqcFJlZywgUmVzZXRTcmMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgdGltZXIgb3V0cHV0IHNldCBzb3VyY2UuCisgICogQHJtdG9sbCBSU1R4MVIgICAgICBSU1QgICAgICAgICAgTExfSFJUSU1fT1VUX0dldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIFJFU1lOQyAgICAgICBMTF9IUlRJTV9PVVRfR2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgUEVSICAgICAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBDTVAxICAgICAgICAgTExfSFJUSU1fT1VUX0dldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIENNUDIgICAgICAgICBMTF9IUlRJTV9PVVRfR2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgQ01QMyAgICAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBDTVA0ICAgICAgICAgTExfSFJUSU1fT1VUX0dldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIE1TVFBFUiAgICAgICBMTF9IUlRJTV9PVVRfR2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgTVNUQ01QMSAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBNU1RDTVAyICAgICAgTExfSFJUSU1fT1VUX0dldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIE1TVENNUDMgICAgICBMTF9IUlRJTV9PVVRfR2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgTVNUQ01QNCAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBUSU1FVk5UMSAgICAgTExfSFJUSU1fT1VUX0dldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIFRJTUVWTlQyICAgICBMTF9IUlRJTV9PVVRfR2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgVElNRVZOVDMgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBUSU1FVk5UNCAgICAgTExfSFJUSU1fT1VUX0dldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIFRJTUVWTlQ1ICAgICBMTF9IUlRJTV9PVVRfR2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgVElNRVZOVDYgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBUSU1FVk5UNyAgICAgTExfSFJUSU1fT1VUX0dldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIFRJTUVWTlQ4ICAgICBMTF9IUlRJTV9PVVRfR2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgVElNRVZOVDkgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBFWEVWTlQxICAgICAgTExfSFJUSU1fT1VUX0dldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIEVYRVZOVDIgICAgICBMTF9IUlRJTV9PVVRfR2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgRVhFVk5UMyAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBFWEVWTlQ0ICAgICAgTExfSFJUSU1fT1VUX0dldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIEVYRVZOVDUgICAgICBMTF9IUlRJTV9PVVRfR2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgRVhFVk5UNiAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBFWEVWTlQ3ICAgICAgTExfSFJUSU1fT1VUX0dldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIEVYRVZOVDggICAgICBMTF9IUlRJTV9PVVRfR2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgRVhFVk5UOSAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBFWEVWTlQxMCAgICAgTExfSFJUSU1fT1VUX0dldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIFVQREFURSAgICAgICBMTF9IUlRJTV9PVVRfR2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgUlNUICAgICAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBSRVNZTkMgICAgICAgTExfSFJUSU1fT1VUX0dldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIFBFUiAgICAgICAgICBMTF9IUlRJTV9PVVRfR2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgQ01QMSAgICAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBDTVAyICAgICAgICAgTExfSFJUSU1fT1VUX0dldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIENNUDMgICAgICAgICBMTF9IUlRJTV9PVVRfR2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgQ01QNCAgICAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBNU1RQRVIgICAgICAgTExfSFJUSU1fT1VUX0dldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIE1TVENNUDEgICAgICBMTF9IUlRJTV9PVVRfR2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgTVNUQ01QMiAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBNU1RDTVAzICAgICAgTExfSFJUSU1fT1VUX0dldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIE1TVENNUDQgICAgICBMTF9IUlRJTV9PVVRfR2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgVElNRVZOVDEgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBUSU1FVk5UMiAgICAgTExfSFJUSU1fT1VUX0dldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIFRJTUVWTlQzICAgICBMTF9IUlRJTV9PVVRfR2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgVElNRVZOVDQgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBUSU1FVk5UNSAgICAgTExfSFJUSU1fT1VUX0dldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIFRJTUVWTlQ2ICAgICBMTF9IUlRJTV9PVVRfR2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgVElNRVZOVDcgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBUSU1FVk5UOCAgICAgTExfSFJUSU1fT1VUX0dldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIFRJTUVWTlQ5ICAgICBMTF9IUlRJTV9PVVRfR2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgRVhFVk5UMSAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBFWEVWTlQyICAgICAgTExfSFJUSU1fT1VUX0dldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIEVYRVZOVDMgICAgICBMTF9IUlRJTV9PVVRfR2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgRVhFVk5UNCAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBFWEVWTlQ1ICAgICAgTExfSFJUSU1fT1VUX0dldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIEVYRVZOVDYgICAgICBMTF9IUlRJTV9PVVRfR2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgRVhFVk5UNyAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBFWEVWTlQ4ICAgICAgTExfSFJUSU1fT1VUX0dldE91dHB1dFJlc2V0U3JjXG4KKyAgKiAgICAgICAgIFJTVHgxUiAgICAgIEVYRVZOVDkgICAgICBMTF9IUlRJTV9PVVRfR2V0T3V0cHV0UmVzZXRTcmNcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgRVhFVk5UMTAgICAgIExMX0hSVElNX09VVF9HZXRPdXRwdXRSZXNldFNyY1xuCisgICogICAgICAgICBSU1R4MVIgICAgICBVUERBVEUgICAgICAgTExfSFJUSU1fT1VUX0dldE91dHB1dFJlc2V0U3JjCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBPdXRwdXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEExCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RBMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEQxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1REMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEUyCisgICogQHJldHZhbCBSZXNldFNyYyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfUkVTWU5DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfVElNUEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfVElNQ01QMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX1RJTUNNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9USU1DTVAzCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfVElNQ01QNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX01BU1RFUlBFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX01BU1RFUkNNUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9NQVNURVJDTVAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfTUFTVEVSQ01QMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX01BU1RFUkNNUDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9USU1FVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfVElNRVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX1RJTUVWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9USU1FVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfVElNRVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX1RJTUVWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9USU1FVl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfVElNRVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX1RJTUVWXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9FRVZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX0VFVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfRUVWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9FRVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX0VFVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfRUVWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9FRVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0NST1NTQkFSX0VFVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQ1JPU1NCQVJfRUVWXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9FRVZfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9DUk9TU0JBUl9VUERBVEUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9PVVRfR2V0T3V0cHV0UmVzZXRTcmMoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBPdXRwdXQpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlPdXRwdXQgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKE91dHB1dCkgLSBQT1NJVElPTl9WQUwoTExfSFJUSU1fT1VUUFVUX1RBMSkpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNUaW1lcnhSZWdzWzBdLlJTVHgxUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1NFVHhSW2lPdXRwdXRdKSk7CisgIHJldHVybiAodWludDMyX3QpIFJFQURfUkVHKCpwUmVnKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgYSB0aW1lciBvdXRwdXQuCisgICogQHJtdG9sbCBPVVR4UiAgICAgIFBPTDEgICAgICAgICAgTExfSFJUSU1fT1VUX0NvbmZpZ1xuCisgICogICAgICAgICBPVVR4UiAgICAgIElETEVNMSAgICAgICAgTExfSFJUSU1fT1VUX0NvbmZpZ1xuCisgICogICAgICAgICBPVVR4UiAgICAgIElETEVTMSAgICAgICAgTExfSFJUSU1fT1VUX0NvbmZpZ1xuCisgICogICAgICAgICBPVVR4UiAgICAgIEZBVUxUMSAgICAgICAgTExfSFJUSU1fT1VUX0NvbmZpZ1xuCisgICogICAgICAgICBPVVR4UiAgICAgIENIUDEgICAgICAgICAgTExfSFJUSU1fT1VUX0NvbmZpZ1xuCisgICogICAgICAgICBPVVR4UiAgICAgIERJREwxICAgICAgICAgTExfSFJUSU1fT1VUX0NvbmZpZ1xuCisgICogICAgICAgICBPVVR4UiAgICAgIFBPTDIgICAgICAgICAgTExfSFJUSU1fT1VUX0NvbmZpZ1xuCisgICogICAgICAgICBPVVR4UiAgICAgIElETEVNMiAgICAgICAgTExfSFJUSU1fT1VUX0NvbmZpZ1xuCisgICogICAgICAgICBPVVR4UiAgICAgIElETEVTMiAgICAgICAgTExfSFJUSU1fT1VUX0NvbmZpZ1xuCisgICogICAgICAgICBPVVR4UiAgICAgIEZBVUxUMiAgICAgICAgTExfSFJUSU1fT1VUX0NvbmZpZ1xuCisgICogICAgICAgICBPVVR4UiAgICAgIENIUDIgICAgICAgICAgTExfSFJUSU1fT1VUX0NvbmZpZ1xuCisgICogICAgICAgICBPVVR4UiAgICAgIERJREwyICAgICAgICAgTExfSFJUSU1fT1VUX0NvbmZpZworICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgT3V0cHV0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RBMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RCMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1REMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEUxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RFMgorICAqIEBwYXJhbSAgQ29uZmlndXJhdGlvbiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgY29tYmluYXRpb24gb2YgYWxsIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVF9QT1NJVElWRV9QT0xBUklUWSBvciBAcmVmIExMX0hSVElNX09VVF9ORUdBVElWRV9QT0xBUklUWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVF9OT19JRExFIG9yIEByZWYgTExfSFJUSU1fT1VUX0lETEVfV0hFTl9CVVJTVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVF9JRExFTEVWRUxfSU5BQ1RJVkUgb3IgQHJlZiBMTF9IUlRJTV9PVVRfSURMRUxFVkVMX0FDVElWRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVF9GQVVMVFNUQVRFX05PX0FDVElPTiBvciBAcmVmIExMX0hSVElNX09VVF9GQVVMVFNUQVRFX0FDVElWRSBvciBAcmVmIExMX0hSVElNX09VVF9GQVVMVFNUQVRFX0lOQUNUSVZFIG9yIEByZWYgTExfSFJUSU1fT1VUX0ZBVUxUU1RBVEVfSElHSFoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRfQ0hPUFBFUk1PREVfRElTQUJMRUQgb3IgQHJlZiBMTF9IUlRJTV9PVVRfQ0hPUFBFUk1PREVfRU5BQkxFRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVF9CTV9FTlRSWU1PREVfUkVHVUxBUiBvciBAcmVmIExMX0hSVElNX09VVF9CTV9FTlRSWU1PREVfREVMQVlFRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fT1VUX0NvbmZpZyhIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IE91dHB1dCwgdWludDMyX3QgQ29uZmlndXJhdGlvbikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaU91dHB1dCA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoT3V0cHV0KSAtIFBPU0lUSU9OX1ZBTChMTF9IUlRJTV9PVVRQVVRfVEExKSk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c1RpbWVyeFJlZ3NbMF0uT1VUeFIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9PVVR4UltpT3V0cHV0XSkpOworICBNT0RJRllfUkVHKCpwUmVnLCAoSFJUSU1fT1VUX0NPTkZJR19NQVNLIDw8IFJFR19TSElGVF9UQUJfT1VUeFJbaU91dHB1dF0pLAorICAgICAgICAgICAgIChDb25maWd1cmF0aW9uIDw8IFJFR19TSElGVF9UQUJfT1VUeFJbaU91dHB1dF0pKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHBvbGFyaXR5IG9mIGEgdGltZXIgb3V0cHV0LgorICAqIEBybXRvbGwgT1VUeFIgICAgICBQT0wxICAgICAgICAgIExMX0hSVElNX09VVF9TZXRQb2xhcml0eVxuCisgICogICAgICAgICBPVVR4UiAgICAgIFBPTDIgICAgICAgICAgTExfSFJUSU1fT1VUX1NldFBvbGFyaXR5CisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBPdXRwdXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEExCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RBMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEQxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1REMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEUyCisgICogQHBhcmFtICBQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVF9QT1NJVElWRV9QT0xBUklUWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVF9ORUdBVElWRV9QT0xBUklUWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fT1VUX1NldFBvbGFyaXR5KEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgT3V0cHV0LCB1aW50MzJfdCBQb2xhcml0eSkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaU91dHB1dCA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoT3V0cHV0KSAtIFBPU0lUSU9OX1ZBTChMTF9IUlRJTV9PVVRQVVRfVEExKSk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c1RpbWVyeFJlZ3NbMF0uT1VUeFIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9PVVR4UltpT3V0cHV0XSkpOworICBNT0RJRllfUkVHKCpwUmVnLCAoSFJUSU1fT1VUUl9QT0wxIDw8IFJFR19TSElGVF9UQUJfT1VUeFJbaU91dHB1dF0pLCAoUG9sYXJpdHkgPDwgUkVHX1NISUZUX1RBQl9PVVR4UltpT3V0cHV0XSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgcG9sYXJpdHkgb2YgdGhlIHRpbWVyIG91dHB1dC4KKyAgKiBAcm10b2xsIE9VVHhSICAgICAgUE9MMSAgICAgICAgICBMTF9IUlRJTV9PVVRfR2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgT1VUeFIgICAgICBQT0wyICAgICAgICAgIExMX0hSVElNX09VVF9HZXRQb2xhcml0eQorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgT3V0cHV0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RBMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RCMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1REMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEUxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RFMgorICAqIEByZXR2YWwgUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRfUE9TSVRJVkVfUE9MQVJJVFkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRfTkVHQVRJVkVfUE9MQVJJVFkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9PVVRfR2V0UG9sYXJpdHkoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBPdXRwdXQpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlPdXRwdXQgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKE91dHB1dCkgLSBQT1NJVElPTl9WQUwoTExfSFJUSU1fT1VUUFVUX1RBMSkpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNUaW1lcnhSZWdzWzBdLk9VVHhSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfT1VUeFJbaU91dHB1dF0pKTsKKyAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgKEhSVElNX09VVFJfUE9MMSA8PCBSRUdfU0hJRlRfVEFCX09VVHhSW2lPdXRwdXRdKSkgPj4gUkVHX1NISUZUX1RBQl9PVVR4UltpT3V0cHV0XSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBvdXRwdXQgSURMRSBtb2RlLgorICAqIEBybXRvbGwgT1VUeFIgICAgICBJRExFTTEgICAgICAgICAgTExfSFJUSU1fT1VUX1NldElkbGVNb2RlXG4KKyAgKiAgICAgICAgIE9VVHhSICAgICAgSURMRU0yICAgICAgICAgIExMX0hSVElNX09VVF9TZXRJZGxlTW9kZQorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgY2FsbGVkIHdoZW4gdGhlIGJ1cnN0IG1vZGUgaXMgYWN0aXZlCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBPdXRwdXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEExCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RBMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEQxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1REMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEUyCisgICogQHBhcmFtICBJZGxlTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVF9OT19JRExFCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUX0lETEVfV0hFTl9CVVJTVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fT1VUX1NldElkbGVNb2RlKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgT3V0cHV0LCB1aW50MzJfdCBJZGxlTW9kZSkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaU91dHB1dCA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoT3V0cHV0KSAtIFBPU0lUSU9OX1ZBTChMTF9IUlRJTV9PVVRQVVRfVEExKSk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c1RpbWVyeFJlZ3NbMF0uT1VUeFIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9PVVR4UltpT3V0cHV0XSkpOworICBNT0RJRllfUkVHKCpwUmVnLCAoSFJUSU1fT1VUUl9JRExNMSA8PCBSRUdfU0hJRlRfVEFCX09VVHhSW2lPdXRwdXRdKSwgKElkbGVNb2RlIDw8IFJFR19TSElGVF9UQUJfT1VUeFJbaU91dHB1dF0pKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIG91dHB1dCBJRExFIG1vZGUuCisgICogQHJtdG9sbCBPVVR4UiAgICAgIElETEVNMSAgICAgICAgICBMTF9IUlRJTV9PVVRfR2V0SWRsZU1vZGVcbgorICAqICAgICAgICAgT1VUeFIgICAgICBJRExFTTIgICAgICAgICAgTExfSFJUSU1fT1VUX0dldElkbGVNb2RlCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBPdXRwdXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEExCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RBMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEQxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1REMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEUyCisgICogQHJldHZhbCBJZGxlTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVF9OT19JRExFCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUX0lETEVfV0hFTl9CVVJTVAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX09VVF9HZXRJZGxlTW9kZShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IE91dHB1dCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaU91dHB1dCA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoT3V0cHV0KSAtIFBPU0lUSU9OX1ZBTChMTF9IUlRJTV9PVVRQVVRfVEExKSk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c1RpbWVyeFJlZ3NbMF0uT1VUeFIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9PVVR4UltpT3V0cHV0XSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCAoSFJUSU1fT1VUUl9JRExNMSA8PCBSRUdfU0hJRlRfVEFCX09VVHhSW2lPdXRwdXRdKSkgPj4gUkVHX1NISUZUX1RBQl9PVVR4UltpT3V0cHV0XSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBvdXRwdXQgSURMRSBsZXZlbC4KKyAgKiBAcm10b2xsIE9VVHhSICAgICAgSURMRVMxICAgICAgICAgIExMX0hSVElNX09VVF9TZXRJZGxlTGV2ZWxcbgorICAqICAgICAgICAgT1VUeFIgICAgICBJRExFUzIgICAgICAgICAgTExfSFJUSU1fT1VUX1NldElkbGVMZXZlbAorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgcHJpb3IgZW5hYmxpbmcgdGhlIHRpbWVyLgorICAqIEBub3RlIElkbGUgbGV2ZWwgaXNuJ3QgcmVsZXZhbnQgd2hlbiB0aGUgb3V0cHV0IGlkbGUgbW9kZSBpcyBzZXQgdG8gTExfSFJUSU1fT1VUX05PX0lETEUuCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBPdXRwdXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEExCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RBMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEQxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1REMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEUyCisgICogQHBhcmFtICBJZGxlTGV2ZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRfSURMRUxFVkVMX0lOQUNUSVZFCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUX0lETEVMRVZFTF9BQ1RJVkUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX09VVF9TZXRJZGxlTGV2ZWwoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBPdXRwdXQsIHVpbnQzMl90IElkbGVMZXZlbCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaU91dHB1dCA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoT3V0cHV0KSAtIFBPU0lUSU9OX1ZBTChMTF9IUlRJTV9PVVRQVVRfVEExKSk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c1RpbWVyeFJlZ3NbMF0uT1VUeFIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9PVVR4UltpT3V0cHV0XSkpOworICBNT0RJRllfUkVHKCpwUmVnLCAoSFJUSU1fT1VUUl9JRExFUzEgPDwgUkVHX1NISUZUX1RBQl9PVVR4UltpT3V0cHV0XSksIChJZGxlTGV2ZWwgPDwgUkVHX1NISUZUX1RBQl9PVVR4UltpT3V0cHV0XSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgb3V0cHV0IElETEUgbGV2ZWwuCisgICogQHJtdG9sbCBPVVR4UiAgICAgIElETEVTMSAgICAgICAgICBMTF9IUlRJTV9PVVRfR2V0SWRsZUxldmVsXG4KKyAgKiAgICAgICAgIE9VVHhSICAgICAgSURMRVMyICAgICAgICAgIExMX0hSVElNX09VVF9HZXRJZGxlTGV2ZWwKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIE91dHB1dCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RCMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RDMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEQyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RFMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URTIKKyAgKiBAcmV0dmFsIElkbGVMZXZlbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVF9JRExFTEVWRUxfSU5BQ1RJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRfSURMRUxFVkVMX0FDVElWRQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX09VVF9HZXRJZGxlTGV2ZWwoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBPdXRwdXQpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlPdXRwdXQgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKE91dHB1dCkgLSBQT1NJVElPTl9WQUwoTExfSFJUSU1fT1VUUFVUX1RBMSkpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNUaW1lcnhSZWdzWzBdLk9VVHhSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfT1VUeFJbaU91dHB1dF0pKTsKKyAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgKEhSVElNX09VVFJfSURMRVMxIDw8IFJFR19TSElGVF9UQUJfT1VUeFJbaU91dHB1dF0pKSA+PiBSRUdfU0hJRlRfVEFCX09VVHhSW2lPdXRwdXRdKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIG91dHB1dCBGQVVMVCBzdGF0ZS4KKyAgKiBAcm10b2xsIE9VVHhSICAgICAgRkFVTFQxICAgICAgICAgIExMX0hSVElNX09VVF9TZXRGYXVsdFN0YXRlXG4KKyAgKiAgICAgICAgIE9VVHhSICAgICAgRkFVTFQyICAgICAgICAgIExMX0hSVElNX09VVF9TZXRGYXVsdFN0YXRlCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBjYWxsZWQgd2hlbiB0aGUgdGltZXIgaXMgZW5hYmxlZCBhbmQgYSBmYXVsdAorICAqICAgICAgIGNoYW5uZWwgaXMgZW5hYmxlZCBhdCB0aW1lciBsZXZlbC4KKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIE91dHB1dCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RCMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RDMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEQyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RFMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URTIKKyAgKiBAcGFyYW0gIEZhdWx0U3RhdGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRfRkFVTFRTVEFURV9OT19BQ1RJT04KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRfRkFVTFRTVEFURV9BQ1RJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRfRkFVTFRTVEFURV9JTkFDVElWRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVF9GQVVMVFNUQVRFX0hJR0haCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9PVVRfU2V0RmF1bHRTdGF0ZShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IE91dHB1dCwgdWludDMyX3QgRmF1bHRTdGF0ZSkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaU91dHB1dCA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoT3V0cHV0KSAtIFBPU0lUSU9OX1ZBTChMTF9IUlRJTV9PVVRQVVRfVEExKSk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c1RpbWVyeFJlZ3NbMF0uT1VUeFIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9PVVR4UltpT3V0cHV0XSkpOworICBNT0RJRllfUkVHKCpwUmVnLCAoSFJUSU1fT1VUUl9GQVVMVDEgPDwgUkVHX1NISUZUX1RBQl9PVVR4UltpT3V0cHV0XSksIChGYXVsdFN0YXRlIDw8IFJFR19TSElGVF9UQUJfT1VUeFJbaU91dHB1dF0pKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIEZBVUxUIHN0YXRlLgorICAqIEBybXRvbGwgT1VUeFIgICAgICBGQVVMVDEgICAgICAgICAgTExfSFJUSU1fT1VUX0dldEZhdWx0U3RhdGVcbgorICAqICAgICAgICAgT1VUeFIgICAgICBGQVVMVDIgICAgICAgICAgTExfSFJUSU1fT1VUX0dldEZhdWx0U3RhdGUKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIE91dHB1dCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RCMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RDMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEQyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RFMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URTIKKyAgKiBAcmV0dmFsIEZhdWx0U3RhdGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRfRkFVTFRTVEFURV9OT19BQ1RJT04KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRfRkFVTFRTVEFURV9BQ1RJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRfRkFVTFRTVEFURV9JTkFDVElWRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVF9GQVVMVFNUQVRFX0hJR0haCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fT1VUX0dldEZhdWx0U3RhdGUoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBPdXRwdXQpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlPdXRwdXQgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKE91dHB1dCkgLSBQT1NJVElPTl9WQUwoTExfSFJUSU1fT1VUUFVUX1RBMSkpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNUaW1lcnhSZWdzWzBdLk9VVHhSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfT1VUeFJbaU91dHB1dF0pKTsKKyAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgKEhSVElNX09VVFJfRkFVTFQxIDw8IFJFR19TSElGVF9UQUJfT1VUeFJbaU91dHB1dF0pKSA+PiBSRUdfU0hJRlRfVEFCX09VVHhSW2lPdXRwdXRdKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIG91dHB1dCBjaG9wcGVyIG1vZGUuCisgICogQHJtdG9sbCBPVVR4UiAgICAgIENIUDEgICAgICAgICAgTExfSFJUSU1fT1VUX1NldENob3BwZXJNb2RlXG4KKyAgKiAgICAgICAgIE9VVHhSICAgICAgQ0hQMiAgICAgICAgICBMTF9IUlRJTV9PVVRfU2V0Q2hvcHBlck1vZGUKKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGNhbGxlZCB3aGVuIHRoZSB0aW1lciBpcyBlbmFibGVkLgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgT3V0cHV0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RBMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RCMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1REMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEUxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RFMgorICAqIEBwYXJhbSAgQ2hvcHBlck1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRfQ0hPUFBFUk1PREVfRElTQUJMRUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRfQ0hPUFBFUk1PREVfRU5BQkxFRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fT1VUX1NldENob3BwZXJNb2RlKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgT3V0cHV0LCB1aW50MzJfdCBDaG9wcGVyTW9kZSkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaU91dHB1dCA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoT3V0cHV0KSAtIFBPU0lUSU9OX1ZBTChMTF9IUlRJTV9PVVRQVVRfVEExKSk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c1RpbWVyeFJlZ3NbMF0uT1VUeFIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9PVVR4UltpT3V0cHV0XSkpOworICBNT0RJRllfUkVHKCpwUmVnLCAoSFJUSU1fT1VUUl9DSFAxIDw8IFJFR19TSElGVF9UQUJfT1VUeFJbaU91dHB1dF0pLCAoQ2hvcHBlck1vZGUgPDwgUkVHX1NISUZUX1RBQl9PVVR4UltpT3V0cHV0XSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgb3V0cHV0IGNob3BwZXIgbW9kZQorICAqIEBybXRvbGwgT1VUeFIgICAgICBDSFAxICAgICAgICAgIExMX0hSVElNX09VVF9HZXRDaG9wcGVyTW9kZVxuCisgICogICAgICAgICBPVVR4UiAgICAgIENIUDIgICAgICAgICAgTExfSFJUSU1fT1VUX0dldENob3BwZXJNb2RlCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBPdXRwdXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEExCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RBMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEQxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1REMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEUyCisgICogQHJldHZhbCBDaG9wcGVyTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVF9DSE9QUEVSTU9ERV9ESVNBQkxFRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVF9DSE9QUEVSTU9ERV9FTkFCTEVECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fT1VUX0dldENob3BwZXJNb2RlKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgT3V0cHV0KQoreworICByZWdpc3RlciB1aW50MzJfdCBpT3V0cHV0ID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChPdXRwdXQpIC0gUE9TSVRJT05fVkFMKExMX0hSVElNX09VVFBVVF9UQTEpKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zVGltZXJ4UmVnc1swXS5PVVR4UikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX09VVHhSW2lPdXRwdXRdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsIChIUlRJTV9PVVRSX0NIUDEgPDwgUkVHX1NISUZUX1RBQl9PVVR4UltpT3V0cHV0XSkpID4+IFJFR19TSElGVF9UQUJfT1VUeFJbaU91dHB1dF0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgb3V0cHV0IGJ1cnN0IG1vZGUgZW50cnkgbW9kZS4KKyAgKiBAcm10b2xsIE9VVHhSICAgICAgRElETDEgICAgICAgICAgTExfSFJUSU1fT1VUX1NldEJNRW50cnlNb2RlXG4KKyAgKiAgICAgICAgIE9VVHhSICAgICAgRElETDIgICAgICAgICAgTExfSFJUSU1fT1VUX1NldEJNRW50cnlNb2RlCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBjYWxsZWQgd2hlbiB0aGUgdGltZXIgaXMgZW5hYmxlZC4KKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIE91dHB1dCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RCMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RDMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEQyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RFMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URTIKKyAgKiBAcGFyYW0gIEJNRW50cnlNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUX0JNX0VOVFJZTU9ERV9SRUdVTEFSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUX0JNX0VOVFJZTU9ERV9ERUxBWUVECisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9PVVRfU2V0Qk1FbnRyeU1vZGUoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBPdXRwdXQsIHVpbnQzMl90IEJNRW50cnlNb2RlKQoreworICByZWdpc3RlciB1aW50MzJfdCBpT3V0cHV0ID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChPdXRwdXQpIC0gUE9TSVRJT05fVkFMKExMX0hSVElNX09VVFBVVF9UQTEpKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zVGltZXJ4UmVnc1swXS5PVVR4UikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX09VVHhSW2lPdXRwdXRdKSk7CisgIE1PRElGWV9SRUcoKnBSZWcsIChIUlRJTV9PVVRSX0RJREwxIDw8IFJFR19TSElGVF9UQUJfT1VUeFJbaU91dHB1dF0pLCAoQk1FbnRyeU1vZGUgPDwgUkVHX1NISUZUX1RBQl9PVVR4UltpT3V0cHV0XSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgb3V0cHV0IGJ1cnN0IG1vZGUgZW50cnkgbW9kZS4KKyAgKiBAcm10b2xsIE9VVHhSICAgICAgRElETDEgICAgICAgICAgTExfSFJUSU1fT1VUX0dldEJNRW50cnlNb2RlXG4KKyAgKiAgICAgICAgIE9VVHhSICAgICAgRElETDIgICAgICAgICAgTExfSFJUSU1fT1VUX0dldEJNRW50cnlNb2RlCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBPdXRwdXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEExCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RBMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEQxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1REMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEUyCisgICogQHJldHZhbCBCTUVudHJ5TW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVF9CTV9FTlRSWU1PREVfUkVHVUxBUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVF9CTV9FTlRSWU1PREVfREVMQVlFRAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX09VVF9HZXRCTUVudHJ5TW9kZShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IE91dHB1dCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaU91dHB1dCA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoT3V0cHV0KSAtIFBPU0lUSU9OX1ZBTChMTF9IUlRJTV9PVVRQVVRfVEExKSk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c1RpbWVyeFJlZ3NbMF0uT1VUeFIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9PVVR4UltpT3V0cHV0XSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCAoSFJUSU1fT1VUUl9ESURMMSA8PCBSRUdfU0hJRlRfVEFCX09VVHhSW2lPdXRwdXRdKSkgPj4gUkVHX1NISUZUX1RBQl9PVVR4UltpT3V0cHV0XSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBsZXZlbCAoYWN0aXZlIG9yIGluYWN0aXZlKSBvZiB0aGUgZGVzaWduYXRlZCBvdXRwdXQgd2hlbiB0aGUKKyAgKiAgICAgICAgIGRlbGF5ZWQgcHJvdGVjdGlvbiB3YXMgdHJpZ2dlcmVkLgorICAqIEBybXRvbGwgVElNeElTUiAgICAgIE8xU1JTUiAgICAgICAgICBMTF9IUlRJTV9PVVRfR2V0RExZUFJUT3V0U3RhdHVzXG4KKyAgKiAgICAgICAgIFRJTXhJU1IgICAgICBPMlNSU1IgICAgICAgICAgTExfSFJUSU1fT1VUX0dldERMWVBSVE91dFN0YXR1cworICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgT3V0cHV0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RBMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RCMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1REMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEUxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RFMgorICAqIEByZXR2YWwgT3V0cHV0TGV2ZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRfTEVWRUxfSU5BQ1RJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRfTEVWRUxfQUNUSVZFCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fT1VUX0dldERMWVBSVE91dFN0YXR1cyhIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IE91dHB1dCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaU91dHB1dCA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoT3V0cHV0KSAtIFBPU0lUSU9OX1ZBTChMTF9IUlRJTV9PVVRQVVRfVEExKSk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c1RpbWVyeFJlZ3NbMF0uVElNeElTUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX09VVHhSW2lPdXRwdXRdKSk7CisgIHJldHVybiAoKFJFQURfQklUKCpwUmVnLCAoSFJUSU1fVElNSVNSX08xU1RBVCA8PCBSRUdfU0hJRlRfVEFCX094U1RBVFtpT3V0cHV0XSkpID4+IFJFR19TSElGVF9UQUJfT3hTVEFUW2lPdXRwdXRdKSA+PgorICAgICAgICAgIEhSVElNX1RJTUlTUl9PMVNUQVRfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBGb3JjZSB0aGUgdGltZXIgb3V0cHV0IHRvIGl0cyBhY3RpdmUgb3IgaW5hY3RpdmUgbGV2ZWwuCisgICogQHJtdG9sbCBTRVR4MVIgICAgICBTU1QgICAgICAgICAgTExfSFJUSU1fT1VUX0ZvcmNlTGV2ZWxcbgorICAqICAgICAgICAgUlNUeDFSICAgICAgU1JUICAgICAgICAgIExMX0hSVElNX09VVF9Gb3JjZUxldmVsXG4KKyAgKiAgICAgICAgIFNFVHgyUiAgICAgIFNTVCAgICAgICAgICBMTF9IUlRJTV9PVVRfRm9yY2VMZXZlbFxuCisgICogICAgICAgICBSU1R4MlIgICAgICBTUlQgICAgICAgICAgTExfSFJUSU1fT1VUX0ZvcmNlTGV2ZWwKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIE91dHB1dCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RCMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RDMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEQyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RFMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URTIKKyAgKiBAcGFyYW0gIE91dHB1dExldmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUX0xFVkVMX0lOQUNUSVZFCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUX0xFVkVMX0FDVElWRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fT1VUX0ZvcmNlTGV2ZWwoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBPdXRwdXQsIHVpbnQzMl90IE91dHB1dExldmVsKQoreworICByZWdpc3RlciB1aW50MzJfdCBpT3V0cHV0ID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChPdXRwdXQpIC0gUE9TSVRJT05fVkFMKExMX0hSVElNX09VVFBVVF9UQTEpKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zVGltZXJ4UmVnc1swXS5TRVR4MVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9TRVR4UltpT3V0cHV0XSArIFJFR19PRkZTRVRfVEFCX09VVF9MRVZFTFtPdXRwdXRMZXZlbF0pKTsKKyAgU0VUX0JJVCgqcFJlZywgSFJUSU1fU0VUMVJfU1NUKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIG91dHB1dCBsZXZlbCwgYmVmb3JlIHRoZSBvdXRwdXQgc3RhZ2UgKGNob3BwZXIsIHBvbGFyaXR5KS4KKyAgKiBAcm10b2xsIFRJTXhJU1IgICAgIE8xQ1BZICAgICAgICAgIExMX0hSVElNX09VVF9HZXRMZXZlbFxuCisgICogICAgICAgICBUSU14SVNSICAgICBPMkNQWSAgICAgICAgICBMTF9IUlRJTV9PVVRfR2V0TGV2ZWwKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIE91dHB1dCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RCMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9UQjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RDMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9PVVRQVVRfVEQyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUUFVUX1RFMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX09VVFBVVF9URTIKKyAgKiBAcmV0dmFsIE91dHB1dExldmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUX0xFVkVMX0lOQUNUSVZFCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fT1VUX0xFVkVMX0FDVElWRQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX09VVF9HZXRMZXZlbChIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IE91dHB1dCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaU91dHB1dCA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoT3V0cHV0KSAtIFBPU0lUSU9OX1ZBTChMTF9IUlRJTV9PVVRQVVRfVEExKSk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c1RpbWVyeFJlZ3NbMF0uVElNeElTUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX09VVHhSW2lPdXRwdXRdKSk7CisgIHJldHVybiAoKFJFQURfQklUKCpwUmVnLCAoSFJUSU1fVElNSVNSX08xQ1BZIDw8IFJFR19TSElGVF9UQUJfT3hTVEFUW2lPdXRwdXRdKSkgPj4gUkVHX1NISUZUX1RBQl9PeFNUQVRbaU91dHB1dF0pID4+CisgICAgICAgICAgSFJUSU1fVElNSVNSX08xQ1BZX1Bvcyk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRUZfRXh0ZXJuYWxfRXZlbnRfbWFuYWdlbWVudCBFeHRlcm5hbF9FdmVudF9tYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgZXh0ZXJuYWwgZXZlbnQgY29uZGl0aW9uaW5nLgorICAqIEBybXRvbGwgRUVDUjEgICAgIEVFMVNSQyAgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFMVBPTCAgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFMVNOUyAgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFMUZBU1QgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFMlNSQyAgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFMlBPTCAgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFMlNOUyAgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFMkZBU1QgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFM1NSQyAgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFM1BPTCAgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFM1NOUyAgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFM0ZBU1QgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFNFNSQyAgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFNFBPTCAgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFNFNOUyAgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFNEZBU1QgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFNVNSQyAgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFNVBPTCAgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFNVNOUyAgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFNUZBU1QgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFNlNSQyAgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFNlBPTCAgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFNlNOUyAgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFNkZBU1QgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFN1NSQyAgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFN1BPTCAgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFN1NOUyAgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFN0ZBU1QgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFOFNSQyAgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFOFBPTCAgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFOFNOUyAgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFOEZBU1QgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFOVNSQyAgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFOVBPTCAgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFOVNOUyAgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFOUZBU1QgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFMTBTUkMgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFMTBQT0wgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFMTBTTlMgICAgICAgICBMTF9IUlRJTV9FRV9Db25maWdcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFMTBGQVNUICAgICAgICBMTF9IUlRJTV9FRV9Db25maWcKKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGNhbGxlZCB3aGVuIHRoZSB0aW1lciBjb3VudGVyIGlzIGVuYWJsZWQuCisgICogQG5vdGUgRXZlbnQgc291cmNlIChFRXhTcmMxLi5FRXhTUkM0KSBtYXBwaW5nIGRlcGVuZHMgb24gY29uZmlndXJlZCBldmVudCBjaGFubmVsLgorICAqIEBub3RlIEZhc3QgbW9kZSBpcyBhdmFpbGFibGUgb25seSBmb3IgTExfSFJUSU1fRVZFTlRfMS4uNS4KKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEV2ZW50IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfMTAKKyAgKiBAcGFyYW0gIENvbmZpZ3VyYXRpb24gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIGNvbWJpbmF0aW9uIG9mIGFsbCB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9TUkNfMSBvciBAcmVmIExMX0hSVElNX0VFX1NSQ18yIG9yIEByZWYgTExfSFJUSU1fRUVfU1JDXzMgb3IgQHJlZiBMTF9IUlRJTV9FRV9TUkNfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFX1BPTEFSSVRZX0hJR0ggb3IgQHJlZiBMTF9IUlRJTV9FRV9QT0xBUklUWV9MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9TRU5TSVRJVklUWV9MRVZFTCBvciBAcmVmIExMX0hSVElNX0VFX1NFTlNJVElWSVRZX1JJU0lOR0VER0Ugb3IgQHJlZiBMTF9IUlRJTV9FRV9TRU5TSVRJVklUWV9GQUxMSU5HRURHRSBvciBAcmVmIExMX0hSVElNX0VFX1NFTlNJVElWSVRZX0JPVEhFREdFUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFX0ZBU1RNT0RFX0RJU0FCTEUgb3IgQHJlZiBMTF9IUlRJTV9FRV9GQVNUTU9ERV9FTkFCTEUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0VFX0NvbmZpZyhIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IEV2ZW50LCB1aW50MzJfdCBDb25maWd1cmF0aW9uKQoreworICByZWdpc3RlciB1aW50MzJfdCBpRXZlbnQgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKEV2ZW50KSAtIFBPU0lUSU9OX1ZBTChMTF9IUlRJTV9FVkVOVF8xKSk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c0NvbW1vblJlZ3MuRUVDUjEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9FRUNSW2lFdmVudF0pKTsKKyAgTU9ESUZZX1JFRygqcFJlZywgKEhSVElNX0VFX0NPTkZJR19NQVNLIDw8IFJFR19TSElGVF9UQUJfRUV4U1JDW2lFdmVudF0pLAorICAgICAgICAgICAgIChDb25maWd1cmF0aW9uIDw8IFJFR19TSElGVF9UQUJfRUV4U1JDW2lFdmVudF0pKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGV4dGVybmFsIGV2ZW50IHNvdXJjZS4KKyAgKiBAcm10b2xsIEVFQ1IxICAgICBFRTFTUkMgICAgICAgICAgTExfSFJUSU1fRUVfU2V0U3JjXG4KKyAgKiAgICAgICAgIEVFQ1IxICAgICBFRTJTUkMgICAgICAgICAgTExfSFJUSU1fRUVfU2V0U3JjXG4KKyAgKiAgICAgICAgIEVFQ1IxICAgICBFRTNTUkMgICAgICAgICAgTExfSFJUSU1fRUVfU2V0U3JjXG4KKyAgKiAgICAgICAgIEVFQ1IxICAgICBFRTRTUkMgICAgICAgICAgTExfSFJUSU1fRUVfU2V0U3JjXG4KKyAgKiAgICAgICAgIEVFQ1IxICAgICBFRTVTUkMgICAgICAgICAgTExfSFJUSU1fRUVfU2V0U3JjXG4KKyAgKiAgICAgICAgIEVFQ1IyICAgICBFRTZTUkMgICAgICAgICAgTExfSFJUSU1fRUVfU2V0U3JjXG4KKyAgKiAgICAgICAgIEVFQ1IyICAgICBFRTdTUkMgICAgICAgICAgTExfSFJUSU1fRUVfU2V0U3JjXG4KKyAgKiAgICAgICAgIEVFQ1IyICAgICBFRThTUkMgICAgICAgICAgTExfSFJUSU1fRUVfU2V0U3JjXG4KKyAgKiAgICAgICAgIEVFQ1IyICAgICBFRTlTUkMgICAgICAgICAgTExfSFJUSU1fRUVfU2V0U3JjXG4KKyAgKiAgICAgICAgIEVFQ1IyICAgICBFRTEwU1JDICAgICAgICAgTExfSFJUSU1fRUVfU2V0U3JjCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBFdmVudCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzEwCisgICogQHBhcmFtICBTcmMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9TUkNfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFX1NSQ18yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRUVfU1JDXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9TUkNfNAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRUVfU2V0U3JjKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgRXZlbnQsIHVpbnQzMl90IFNyYykKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaUV2ZW50ID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChFdmVudCkgLSBQT1NJVElPTl9WQUwoTExfSFJUSU1fRVZFTlRfMSkpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNDb21tb25SZWdzLkVFQ1IxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfRUVDUltpRXZlbnRdKSk7CisgIE1PRElGWV9SRUcoKnBSZWcsIChIUlRJTV9FRUNSMV9FRTFTUkMgPDwgUkVHX1NISUZUX1RBQl9FRXhTUkNbaUV2ZW50XSksIChTcmMgPDwgUkVHX1NISUZUX1RBQl9FRXhTUkNbaUV2ZW50XSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgZXh0ZXJuYWwgZXZlbnQgc291cmNlLgorICAqIEBybXRvbGwgRUVDUjEgICAgIEVFMVNSQyAgICAgICAgICBMTF9IUlRJTV9FRV9HZXRTcmNcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFMlNSQyAgICAgICAgICBMTF9IUlRJTV9FRV9HZXRTcmNcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFM1NSQyAgICAgICAgICBMTF9IUlRJTV9FRV9HZXRTcmNcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFNFNSQyAgICAgICAgICBMTF9IUlRJTV9FRV9HZXRTcmNcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFNVNSQyAgICAgICAgICBMTF9IUlRJTV9FRV9HZXRTcmNcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFNlNSQyAgICAgICAgICBMTF9IUlRJTV9FRV9HZXRTcmNcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFN1NSQyAgICAgICAgICBMTF9IUlRJTV9FRV9HZXRTcmNcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFOFNSQyAgICAgICAgICBMTF9IUlRJTV9FRV9HZXRTcmNcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFOVNSQyAgICAgICAgICBMTF9IUlRJTV9FRV9HZXRTcmNcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFMTBTUkMgICAgICAgICBMTF9IUlRJTV9FRV9HZXRTcmMKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEV2ZW50IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfMTAKKyAgKiBAcmV0dmFsIEV2ZW50U3JjIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRUVfU1JDXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9TUkNfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFX1NSQ18zCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRUVfU1JDXzQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9FRV9HZXRTcmMoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBFdmVudCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaUV2ZW50ID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChFdmVudCkgLSBQT1NJVElPTl9WQUwoTExfSFJUSU1fRVZFTlRfMSkpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNDb21tb25SZWdzLkVFQ1IxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfRUVDUltpRXZlbnRdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsIEhSVElNX0VFQ1IxX0VFMVNSQyA8PCBSRUdfU0hJRlRfVEFCX0VFeFNSQ1tpRXZlbnRdKSA+PiAgUkVHX1NISUZUX1RBQl9FRXhTUkNbaUV2ZW50XSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBwb2xhcml0eSBvZiBhbiBleHRlcm5hbCBldmVudC4KKyAgKiBAcm10b2xsIEVFQ1IxICAgICBFRTFQT0wgICAgICAgICAgTExfSFJUSU1fRUVfU2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFMlBPTCAgICAgICAgICBMTF9IUlRJTV9FRV9TZXRQb2xhcml0eVxuCisgICogICAgICAgICBFRUNSMSAgICAgRUUzUE9MICAgICAgICAgIExMX0hSVElNX0VFX1NldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIEVFQ1IxICAgICBFRTRQT0wgICAgICAgICAgTExfSFJUSU1fRUVfU2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFNVBPTCAgICAgICAgICBMTF9IUlRJTV9FRV9TZXRQb2xhcml0eVxuCisgICogICAgICAgICBFRUNSMiAgICAgRUU2UE9MICAgICAgICAgIExMX0hSVElNX0VFX1NldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIEVFQ1IyICAgICBFRTdQT0wgICAgICAgICAgTExfSFJUSU1fRUVfU2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFOFBPTCAgICAgICAgICBMTF9IUlRJTV9FRV9TZXRQb2xhcml0eVxuCisgICogICAgICAgICBFRUNSMiAgICAgRUU5UE9MICAgICAgICAgIExMX0hSVElNX0VFX1NldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIEVFQ1IyICAgICBFRTEwUE9MICAgICAgICAgTExfSFJUSU1fRUVfU2V0UG9sYXJpdHkKKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGNhbGxlZCB3aGVuIHRoZSB0aW1lciBjb3VudGVyIGlzIGVuYWJsZWQuCisgICogQG5vdGUgRXZlbnQgcG9sYXJpdHkgaXMgb25seSBzaWduaWZpY2FudCB3aGVuIGV2ZW50IGRldGVjdGlvbiBpcyBsZXZlbC1zZW5zaXRpdmUuCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBFdmVudCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzEwCisgICogQHBhcmFtICBQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFX1BPTEFSSVRZX0hJR0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9QT0xBUklUWV9MT1cKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0VFX1NldFBvbGFyaXR5KEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgRXZlbnQsIHVpbnQzMl90IFBvbGFyaXR5KQoreworICByZWdpc3RlciB1aW50MzJfdCBpRXZlbnQgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKEV2ZW50KSAtIFBPU0lUSU9OX1ZBTChMTF9IUlRJTV9FVkVOVF8xKSk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c0NvbW1vblJlZ3MuRUVDUjEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9FRUNSW2lFdmVudF0pKTsKKyAgTU9ESUZZX1JFRygqcFJlZywgKEhSVElNX0VFQ1IxX0VFMVBPTCA8PCBSRUdfU0hJRlRfVEFCX0VFeFNSQ1tpRXZlbnRdKSwgKFBvbGFyaXR5IDw8IFJFR19TSElGVF9UQUJfRUV4U1JDW2lFdmVudF0pKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIHBvbGFyaXR5IHNldHRpbmcgb2YgYW4gZXh0ZXJuYWwgZXZlbnQuCisgICogQHJtdG9sbCBFRUNSMSAgICAgRUUxUE9MICAgICAgICAgIExMX0hSVElNX0VFX0dldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIEVFQ1IxICAgICBFRTJQT0wgICAgICAgICAgTExfSFJUSU1fRUVfR2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFM1BPTCAgICAgICAgICBMTF9IUlRJTV9FRV9HZXRQb2xhcml0eVxuCisgICogICAgICAgICBFRUNSMSAgICAgRUU0UE9MICAgICAgICAgIExMX0hSVElNX0VFX0dldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIEVFQ1IxICAgICBFRTVQT0wgICAgICAgICAgTExfSFJUSU1fRUVfR2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFNlBPTCAgICAgICAgICBMTF9IUlRJTV9FRV9HZXRQb2xhcml0eVxuCisgICogICAgICAgICBFRUNSMiAgICAgRUU3UE9MICAgICAgICAgIExMX0hSVElNX0VFX0dldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIEVFQ1IyICAgICBFRThQT0wgICAgICAgICAgTExfSFJUSU1fRUVfR2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFOVBPTCAgICAgICAgICBMTF9IUlRJTV9FRV9HZXRQb2xhcml0eVxuCisgICogICAgICAgICBFRUNSMiAgICAgRUUxMFBPTCAgICAgICAgIExMX0hSVElNX0VFX0dldFBvbGFyaXR5CisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBFdmVudCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzEwCisgICogQHJldHZhbCBQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFX1BPTEFSSVRZX0hJR0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9QT0xBUklUWV9MT1cKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9FRV9HZXRQb2xhcml0eShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IEV2ZW50KQoreworICByZWdpc3RlciB1aW50MzJfdCBpRXZlbnQgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKEV2ZW50KSAtIFBPU0lUSU9OX1ZBTChMTF9IUlRJTV9FVkVOVF8xKSk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c0NvbW1vblJlZ3MuRUVDUjEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9FRUNSW2lFdmVudF0pKTsKKyAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgSFJUSU1fRUVDUjFfRUUxUE9MIDw8IFJFR19TSElGVF9UQUJfRUV4U1JDW2lFdmVudF0pID4+ICBSRUdfU0hJRlRfVEFCX0VFeFNSQ1tpRXZlbnRdKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHNlbnNpdGl2aXR5IG9mIGFuIGV4dGVybmFsIGV2ZW50LgorICAqIEBybXRvbGwgRUVDUjEgICAgIEVFMVNOUyAgICAgICAgICBMTF9IUlRJTV9FRV9TZXRTZW5zaXRpdml0eVxuCisgICogICAgICAgICBFRUNSMSAgICAgRUUyU05TICAgICAgICAgIExMX0hSVElNX0VFX1NldFNlbnNpdGl2aXR5XG4KKyAgKiAgICAgICAgIEVFQ1IxICAgICBFRTNTTlMgICAgICAgICAgTExfSFJUSU1fRUVfU2V0U2Vuc2l0aXZpdHlcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFNFNOUyAgICAgICAgICBMTF9IUlRJTV9FRV9TZXRTZW5zaXRpdml0eVxuCisgICogICAgICAgICBFRUNSMSAgICAgRUU1U05TICAgICAgICAgIExMX0hSVElNX0VFX1NldFNlbnNpdGl2aXR5XG4KKyAgKiAgICAgICAgIEVFQ1IyICAgICBFRTZTTlMgICAgICAgICAgTExfSFJUSU1fRUVfU2V0U2Vuc2l0aXZpdHlcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFN1NOUyAgICAgICAgICBMTF9IUlRJTV9FRV9TZXRTZW5zaXRpdml0eVxuCisgICogICAgICAgICBFRUNSMiAgICAgRUU4U05TICAgICAgICAgIExMX0hSVElNX0VFX1NldFNlbnNpdGl2aXR5XG4KKyAgKiAgICAgICAgIEVFQ1IyICAgICBFRTlTTlMgICAgICAgICAgTExfSFJUSU1fRUVfU2V0U2Vuc2l0aXZpdHlcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFMTBTTlMgICAgICAgICBMTF9IUlRJTV9FRV9TZXRTZW5zaXRpdml0eQorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgRXZlbnQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF8xMAorICAqIEBwYXJhbSAgU2Vuc2l0aXZpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9TRU5TSVRJVklUWV9MRVZFTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFX1NFTlNJVElWSVRZX1JJU0lOR0VER0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9TRU5TSVRJVklUWV9GQUxMSU5HRURHRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFX1NFTlNJVElWSVRZX0JPVEhFREdFUworICAqIEByZXR2YWwgTm9uZQorICAqLworCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9FRV9TZXRTZW5zaXRpdml0eShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IEV2ZW50LCB1aW50MzJfdCBTZW5zaXRpdml0eSkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaUV2ZW50ID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChFdmVudCkgLSBQT1NJVElPTl9WQUwoTExfSFJUSU1fRVZFTlRfMSkpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNDb21tb25SZWdzLkVFQ1IxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfRUVDUltpRXZlbnRdKSk7CisgIE1PRElGWV9SRUcoKnBSZWcsIChIUlRJTV9FRUNSMV9FRTFTTlMgPDwgUkVHX1NISUZUX1RBQl9FRXhTUkNbaUV2ZW50XSksIChTZW5zaXRpdml0eSA8PCBSRUdfU0hJRlRfVEFCX0VFeFNSQ1tpRXZlbnRdKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCBzZW5zaXRpdml0eSBzZXR0aW5nIG9mIGFuIGV4dGVybmFsIGV2ZW50LgorICAqIEBybXRvbGwgRUVDUjEgICAgIEVFMVNOUyAgICAgICAgICBMTF9IUlRJTV9FRV9HZXRTZW5zaXRpdml0eVxuCisgICogICAgICAgICBFRUNSMSAgICAgRUUyU05TICAgICAgICAgIExMX0hSVElNX0VFX0dldFNlbnNpdGl2aXR5XG4KKyAgKiAgICAgICAgIEVFQ1IxICAgICBFRTNTTlMgICAgICAgICAgTExfSFJUSU1fRUVfR2V0U2Vuc2l0aXZpdHlcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFNFNOUyAgICAgICAgICBMTF9IUlRJTV9FRV9HZXRTZW5zaXRpdml0eVxuCisgICogICAgICAgICBFRUNSMSAgICAgRUU1U05TICAgICAgICAgIExMX0hSVElNX0VFX0dldFNlbnNpdGl2aXR5XG4KKyAgKiAgICAgICAgIEVFQ1IyICAgICBFRTZTTlMgICAgICAgICAgTExfSFJUSU1fRUVfR2V0U2Vuc2l0aXZpdHlcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFN1NOUyAgICAgICAgICBMTF9IUlRJTV9FRV9HZXRTZW5zaXRpdml0eVxuCisgICogICAgICAgICBFRUNSMiAgICAgRUU4U05TICAgICAgICAgIExMX0hSVElNX0VFX0dldFNlbnNpdGl2aXR5XG4KKyAgKiAgICAgICAgIEVFQ1IyICAgICBFRTlTTlMgICAgICAgICAgTExfSFJUSU1fRUVfR2V0U2Vuc2l0aXZpdHlcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFMTBTTlMgICAgICAgICBMTF9IUlRJTV9FRV9HZXRTZW5zaXRpdml0eQorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgRXZlbnQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF8xMAorICAqIEByZXR2YWwgUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9TRU5TSVRJVklUWV9MRVZFTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFX1NFTlNJVElWSVRZX1JJU0lOR0VER0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9TRU5TSVRJVklUWV9GQUxMSU5HRURHRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFX1NFTlNJVElWSVRZX0JPVEhFREdFUworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0VFX0dldFNlbnNpdGl2aXR5KEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgRXZlbnQpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlFdmVudCA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoRXZlbnQpIC0gUE9TSVRJT05fVkFMKExMX0hSVElNX0VWRU5UXzEpKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zQ29tbW9uUmVncy5FRUNSMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX0VFQ1JbaUV2ZW50XSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9FRUNSMV9FRTFTTlMgPDwgUkVHX1NISUZUX1RBQl9FRXhTUkNbaUV2ZW50XSkgPj4gIFJFR19TSElGVF9UQUJfRUV4U1JDW2lFdmVudF0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgZmFzdCBtb2RlIG9mIGFuIGV4dGVybmFsIGV2ZW50LgorICAqIEBybXRvbGwgRUVDUjEgICAgIEVFMUZBU1QgICAgICAgICBMTF9IUlRJTV9FRV9TZXRGYXN0TW9kZVxuCisgICogICAgICAgICBFRUNSMSAgICAgRUUyRkFTVCAgICAgICAgIExMX0hSVElNX0VFX1NldEZhc3RNb2RlXG4KKyAgKiAgICAgICAgIEVFQ1IxICAgICBFRTNGQVNUICAgICAgICAgTExfSFJUSU1fRUVfU2V0RmFzdE1vZGVcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFNEZBU1QgICAgICAgICBMTF9IUlRJTV9FRV9TZXRGYXN0TW9kZVxuCisgICogICAgICAgICBFRUNSMSAgICAgRUU1RkFTVCAgICAgICAgIExMX0hSVElNX0VFX1NldEZhc3RNb2RlXG4KKyAgKiAgICAgICAgIEVFQ1IyICAgICBFRTZGQVNUICAgICAgICAgTExfSFJUSU1fRUVfU2V0RmFzdE1vZGVcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFN0ZBU1QgICAgICAgICBMTF9IUlRJTV9FRV9TZXRGYXN0TW9kZVxuCisgICogICAgICAgICBFRUNSMiAgICAgRUU4RkFTVCAgICAgICAgIExMX0hSVElNX0VFX1NldEZhc3RNb2RlXG4KKyAgKiAgICAgICAgIEVFQ1IyICAgICBFRTlGQVNUICAgICAgICAgTExfSFJUSU1fRUVfU2V0RmFzdE1vZGVcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFMTBGQVNUICAgICAgICBMTF9IUlRJTV9FRV9TZXRGYXN0TW9kZQorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgY2FsbGVkIHdoZW4gdGhlIHRpbWVyIGNvdW50ZXIgaXMgZW5hYmxlZC4KKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEV2ZW50IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzUKKyAgKiBAcGFyYW0gIEZhc3RNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRUVfRkFTVE1PREVfRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFX0ZBU1RNT0RFX0VOQUJMRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRUVfU2V0RmFzdE1vZGUoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBFdmVudCwgdWludDMyX3QgRmFzdE1vZGUpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlFdmVudCA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoRXZlbnQpIC0gUE9TSVRJT05fVkFMKExMX0hSVElNX0VWRU5UXzEpKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zQ29tbW9uUmVncy5FRUNSMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX0VFQ1JbaUV2ZW50XSkpOworICBNT0RJRllfUkVHKCpwUmVnLCAoSFJUSU1fRUVDUjFfRUUxRkFTVCA8PCBSRUdfU0hJRlRfVEFCX0VFeFNSQ1tpRXZlbnRdKSwgKEZhc3RNb2RlIDw8IFJFR19TSElGVF9UQUJfRUV4U1JDW2lFdmVudF0pKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIGZhc3QgbW9kZSBzZXR0aW5nIG9mIGFuIGV4dGVybmFsIGV2ZW50LgorICAqIEBybXRvbGwgRUVDUjEgICAgIEVFMUZBU1QgICAgICAgICBMTF9IUlRJTV9FRV9HZXRGYXN0TW9kZVxuCisgICogICAgICAgICBFRUNSMSAgICAgRUUyRkFTVCAgICAgICAgIExMX0hSVElNX0VFX0dldEZhc3RNb2RlXG4KKyAgKiAgICAgICAgIEVFQ1IxICAgICBFRTNGQVNUICAgICAgICAgTExfSFJUSU1fRUVfR2V0RmFzdE1vZGVcbgorICAqICAgICAgICAgRUVDUjEgICAgIEVFNEZBU1QgICAgICAgICBMTF9IUlRJTV9FRV9HZXRGYXN0TW9kZVxuCisgICogICAgICAgICBFRUNSMSAgICAgRUU1RkFTVCAgICAgICAgIExMX0hSVElNX0VFX0dldEZhc3RNb2RlXG4KKyAgKiAgICAgICAgIEVFQ1IyICAgICBFRTZGQVNUICAgICAgICAgTExfSFJUSU1fRUVfR2V0RmFzdE1vZGVcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFN0ZBU1QgICAgICAgICBMTF9IUlRJTV9FRV9HZXRGYXN0TW9kZVxuCisgICogICAgICAgICBFRUNSMiAgICAgRUU4RkFTVCAgICAgICAgIExMX0hSVElNX0VFX0dldEZhc3RNb2RlXG4KKyAgKiAgICAgICAgIEVFQ1IyICAgICBFRTlGQVNUICAgICAgICAgTExfSFJUSU1fRUVfR2V0RmFzdE1vZGVcbgorICAqICAgICAgICAgRUVDUjIgICAgIEVFMTBGQVNUICAgICAgICBMTF9IUlRJTV9FRV9HZXRGYXN0TW9kZQorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgRXZlbnQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfNQorICAqIEByZXR2YWwgRmFzdE1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9GQVNUTU9ERV9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRUVfRkFTVE1PREVfRU5BQkxFCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fRUVfR2V0RmFzdE1vZGUoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBFdmVudCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaUV2ZW50ID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChFdmVudCkgLSBQT1NJVElPTl9WQUwoTExfSFJUSU1fRVZFTlRfMSkpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNDb21tb25SZWdzLkVFQ1IxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfRUVDUltpRXZlbnRdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsIEhSVElNX0VFQ1IxX0VFMUZBU1QgPDwgUkVHX1NISUZUX1RBQl9FRXhTUkNbaUV2ZW50XSkgPj4gIFJFR19TSElGVF9UQUJfRUV4U1JDW2lFdmVudF0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgZGlnaXRhbCBub2lzZSBmaWx0ZXIgb2YgYSBleHRlcm5hbCBldmVudC4KKyAgKiBAcm10b2xsIEVFQ1IzICAgICBFRTZGICAgICAgICAgTExfSFJUSU1fRUVfU2V0RmlsdGVyXG4KKyAgKiAgICAgICAgIEVFQ1IzICAgICBFRTdGICAgICAgICAgTExfSFJUSU1fRUVfU2V0RmlsdGVyXG4KKyAgKiAgICAgICAgIEVFQ1IzICAgICBFRThGICAgICAgICAgTExfSFJUSU1fRUVfU2V0RmlsdGVyXG4KKyAgKiAgICAgICAgIEVFQ1IzICAgICBFRTlGICAgICAgICAgTExfSFJUSU1fRUVfU2V0RmlsdGVyXG4KKyAgKiAgICAgICAgIEVFQ1IzICAgICBFRTEwRiAgICAgICAgTExfSFJUSU1fRUVfU2V0RmlsdGVyCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBFdmVudCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF8xMAorICAqIEBwYXJhbSAgRmlsdGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRUVfRklMVEVSX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9GSUxURVJfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFX0ZJTFRFUl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRUVfRklMVEVSXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9GSUxURVJfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFX0ZJTFRFUl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRUVfRklMVEVSXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9GSUxURVJfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFX0ZJTFRFUl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRUVfRklMVEVSXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9GSUxURVJfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9GSUxURVJfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9GSUxURVJfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9GSUxURVJfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9GSUxURVJfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9GSUxURVJfMTUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0VFX1NldEZpbHRlcihIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IEV2ZW50LCB1aW50MzJfdCBGaWx0ZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlFdmVudCA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoRXZlbnQpIC0gUE9TSVRJT05fVkFMKExMX0hSVElNX0VWRU5UXzEpKTsKKyAgTU9ESUZZX1JFRyhIUlRJTXgtPnNDb21tb25SZWdzLkVFQ1IzLCAoSFJUSU1fRUVDUjNfRUU2RiA8PCBSRUdfU0hJRlRfVEFCX0VFeFNSQ1tpRXZlbnRdKSwKKyAgICAgICAgICAgICAoRmlsdGVyIDw8IFJFR19TSElGVF9UQUJfRUV4U1JDW2lFdmVudF0pKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIGRpZ2l0YWwgbm9pc2UgZmlsdGVyIHNldHRpbmcgb2YgYSBleHRlcm5hbCBldmVudC4KKyAgKiBAcm10b2xsIEVFQ1IzICAgICBFRTZGICAgICAgICAgTExfSFJUSU1fRUVfR2V0RmlsdGVyXG4KKyAgKiAgICAgICAgIEVFQ1IzICAgICBFRTdGICAgICAgICAgTExfSFJUSU1fRUVfR2V0RmlsdGVyXG4KKyAgKiAgICAgICAgIEVFQ1IzICAgICBFRThGICAgICAgICAgTExfSFJUSU1fRUVfR2V0RmlsdGVyXG4KKyAgKiAgICAgICAgIEVFQ1IzICAgICBFRTlGICAgICAgICAgTExfSFJUSU1fRUVfR2V0RmlsdGVyXG4KKyAgKiAgICAgICAgIEVFQ1IzICAgICBFRTEwRiAgICAgICAgTExfSFJUSU1fRUVfR2V0RmlsdGVyCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBFdmVudCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRVZFTlRfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VWRU5UXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FVkVOVF8xMAorICAqIEByZXR2YWwgRmlsdGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRUVfRklMVEVSX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9GSUxURVJfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFX0ZJTFRFUl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRUVfRklMVEVSXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9GSUxURVJfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFX0ZJTFRFUl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRUVfRklMVEVSXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9GSUxURVJfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFX0ZJTFRFUl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRUVfRklMVEVSXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9GSUxURVJfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9GSUxURVJfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9GSUxURVJfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9GSUxURVJfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9GSUxURVJfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9GSUxURVJfMTUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9FRV9HZXRGaWx0ZXIoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBFdmVudCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaUV2ZW50ID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChFdmVudCkgLSBQT1NJVElPTl9WQUwoTExfSFJUSU1fRVZFTlRfNikpOworICByZXR1cm4gKFJFQURfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuRUVDUjMsCisgICAgICAgICAgICAgICAgICAgKEhSVElNX0VFQ1IzX0VFNkYgPDwgUkVHX1NISUZUX1RBQl9FRXhTUkNbaUV2ZW50XSkpID4+ICBSRUdfU0hJRlRfVEFCX0VFeFNSQ1tpRXZlbnRdKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGV4dGVybmFsIGV2ZW50IHByZXNjYWxlci4KKyAgKiBAcm10b2xsIEVFQ1IzICAgICBFRVZTRCAgICAgICAgTExfSFJUSU1fRUVfU2V0UHJlc2NhbGVyCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBQcmVzY2FsZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9QUkVTQ0FMRVJfRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFX1BSRVNDQUxFUl9ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRUVfUFJFU0NBTEVSX0RJVjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9QUkVTQ0FMRVJfRElWOAorICAqIEByZXR2YWwgTm9uZQorICAqLworCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9FRV9TZXRQcmVzY2FsZXIoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBQcmVzY2FsZXIpCit7CisgIE1PRElGWV9SRUcoSFJUSU14LT5zQ29tbW9uUmVncy5FRUNSMywgSFJUSU1fRUVDUjNfRUVWU0QsIFByZXNjYWxlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCBleHRlcm5hbCBldmVudCBwcmVzY2FsZXIgc2V0dGluZy4KKyAgKiBAcm10b2xsIEVFQ1IzICAgICBFRVZTRCAgICAgICAgTExfSFJUSU1fRUVfR2V0UHJlc2NhbGVyCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBQcmVzY2FsZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9QUkVTQ0FMRVJfRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0VFX1BSRVNDQUxFUl9ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRUVfUFJFU0NBTEVSX0RJVjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9FRV9QUkVTQ0FMRVJfRElWOAorICAqLworCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fRUVfR2V0UHJlc2NhbGVyKEhSVElNX1R5cGVEZWYgKkhSVElNeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChIUlRJTXgtPnNDb21tb25SZWdzLkVFQ1IzLCBIUlRJTV9FRUNSM19FRVZTRCkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0VGX0ZhdWx0X21hbmFnZW1lbnQgRmF1bHRfbWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIGZhdWx0IHNpZ25hbCBjb25kaXRpb25pbmcuCisgICogQHJtdG9sbCBGTFRJTlIxICAgICBGTFQxUCAgICAgICAgTExfSFJUSU1fRkxUX0NvbmZpZ1xuCisgICogICAgICAgICBGTFRJTlIxICAgICBGTFQxU1JDICAgICAgTExfSFJUSU1fRkxUX0NvbmZpZ1xuCisgICogICAgICAgICBGTFRJTlIxICAgICBGTFQyUCAgICAgICAgTExfSFJUSU1fRkxUX0NvbmZpZ1xuCisgICogICAgICAgICBGTFRJTlIxICAgICBGTFQyU1JDICAgICAgTExfSFJUSU1fRkxUX0NvbmZpZ1xuCisgICogICAgICAgICBGTFRJTlIxICAgICBGTFQzUCAgICAgICAgTExfSFJUSU1fRkxUX0NvbmZpZ1xuCisgICogICAgICAgICBGTFRJTlIxICAgICBGTFQzU1JDICAgICAgTExfSFJUSU1fRkxUX0NvbmZpZ1xuCisgICogICAgICAgICBGTFRJTlIxICAgICBGTFQ0UCAgICAgICAgTExfSFJUSU1fRkxUX0NvbmZpZ1xuCisgICogICAgICAgICBGTFRJTlIxICAgICBGTFQ0U1JDICAgICAgTExfSFJUSU1fRkxUX0NvbmZpZ1xuCisgICogICAgICAgICBGTFRJTlIyICAgICBGTFQ1UCAgICAgICAgTExfSFJUSU1fRkxUX0NvbmZpZ1xuCisgICogICAgICAgICBGTFRJTlIyICAgICBGTFQ1U1JDICAgICAgTExfSFJUSU1fRkxUX0NvbmZpZworICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgY2FsbGVkIHdoZW4gdGhlIGZhdWx0IGNoYW5uZWwgaXMgZW5hYmxlZC4KKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEZhdWx0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkFVTFRfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZBVUxUXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GQVVMVF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkFVTFRfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZBVUxUXzUKKyAgKiBAcGFyYW0gIENvbmZpZ3VyYXRpb24gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIGNvbWJpbmF0aW9uIG9mIGFsbCB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GTFRfU1JDX0RJR0lUQUxJTlBVVCBvciBAcmVmIExMX0hSVElNX0ZMVF9TUkNfSU5URVJOQUwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GTFRfUE9MQVJJVFlfTE9XIG9yIEByZWYgTExfSFJUSU1fRkxUX1BPTEFSSVRZX0hJR0gKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0ZMVF9Db25maWcoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBGYXVsdCwgdWludDMyX3QgQ29uZmlndXJhdGlvbikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaUZhdWx0ID0gKHVpbnQ4X3QpUE9TSVRJT05fVkFMKEZhdWx0KTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zQ29tbW9uUmVncy5GTFRJTlIxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfRkxUSU5SW2lGYXVsdF0pKTsKKyAgTU9ESUZZX1JFRygqcFJlZywgKEhSVElNX0ZMVF9DT05GSUdfTUFTSyA8PCBSRUdfU0hJRlRfVEFCX0ZMVHhFW2lGYXVsdF0pLAorICAgICAgICAgICAgIChDb25maWd1cmF0aW9uIDw8IFJFR19TSElGVF9UQUJfRkxUeEVbaUZhdWx0XSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgc291cmNlIG9mIGEgZmF1bHQgc2lnbmFsLgorICAqIEBybXRvbGwgRkxUSU5SMSAgICAgRkxUMVNSQyAgICAgIExMX0hSVElNX0ZMVF9TZXRTcmNcbgorICAqICAgICAgICAgRkxUSU5SMSAgICAgRkxUMlNSQyAgICAgIExMX0hSVElNX0ZMVF9TZXRTcmNcbgorICAqICAgICAgICAgRkxUSU5SMSAgICAgRkxUM1NSQyAgICAgIExMX0hSVElNX0ZMVF9TZXRTcmNcbgorICAqICAgICAgICAgRkxUSU5SMSAgICAgRkxUNFNSQyAgICAgIExMX0hSVElNX0ZMVF9TZXRTcmNcbgorICAqICAgICAgICAgRkxUSU5SMiAgICAgRkxUNVNSQyAgICAgIExMX0hSVElNX0ZMVF9TZXRTcmMKKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGNhbGxlZCB3aGVuIHRoZSBmYXVsdCBjaGFubmVsIGlzIGVuYWJsZWQuCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBGYXVsdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZBVUxUXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GQVVMVF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkFVTFRfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZBVUxUXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GQVVMVF81CisgICogQHBhcmFtICBTcmMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GTFRfU1JDX0RJR0lUQUxJTlBVVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZMVF9TUkNfSU5URVJOQUwKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0ZMVF9TZXRTcmMoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBGYXVsdCwgdWludDMyX3QgU3JjKQoreworICByZWdpc3RlciB1aW50MzJfdCBpRmF1bHQgPSAodWludDhfdClQT1NJVElPTl9WQUwoRmF1bHQpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNDb21tb25SZWdzLkZMVElOUjEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9GTFRJTlJbaUZhdWx0XSkpOworICBNT0RJRllfUkVHKCpwUmVnLCAoSFJUSU1fRkxUSU5SMV9GTFQxU1JDIDw8IFJFR19TSElGVF9UQUJfRkxUeEVbaUZhdWx0XSksIChTcmMgPDwgUkVHX1NISUZUX1RBQl9GTFR4RVtpRmF1bHRdKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCBzb3VyY2Ugb2YgYSBmYXVsdCBzaWduYWwuCisgICogQHJtdG9sbCBGTFRJTlIxICAgICBGTFQxU1JDICAgICAgTExfSFJUSU1fRkxUX0dldFNyY1xuCisgICogICAgICAgICBGTFRJTlIxICAgICBGTFQyU1JDICAgICAgTExfSFJUSU1fRkxUX0dldFNyY1xuCisgICogICAgICAgICBGTFRJTlIxICAgICBGTFQzU1JDICAgICAgTExfSFJUSU1fRkxUX0dldFNyY1xuCisgICogICAgICAgICBGTFRJTlIxICAgICBGTFQ0U1JDICAgICAgTExfSFJUSU1fRkxUX0dldFNyY1xuCisgICogICAgICAgICBGTFRJTlIyICAgICBGTFQ1U1JDICAgICAgTExfSFJUSU1fRkxUX0dldFNyYworICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgRmF1bHQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GQVVMVF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkFVTFRfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZBVUxUXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GQVVMVF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkFVTFRfNQorICAqIEByZXR2YWwgU3JjIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkxUX1NSQ19ESUdJVEFMSU5QVVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GTFRfU1JDX0lOVEVSTkFMCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fRkxUX0dldFNyYyhIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IEZhdWx0KQoreworICByZWdpc3RlciB1aW50MzJfdCBpRmF1bHQgPSAodWludDhfdClQT1NJVElPTl9WQUwoRmF1bHQpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNDb21tb25SZWdzLkZMVElOUjEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9GTFRJTlJbaUZhdWx0XSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCAoSFJUSU1fRkxUSU5SMV9GTFQxU1JDIDw8IFJFR19TSElGVF9UQUJfRkxUeEVbaUZhdWx0XSkpID4+ICBSRUdfU0hJRlRfVEFCX0ZMVHhFW2lGYXVsdF0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgcG9sYXJpdHkgb2YgYSBmYXVsdCBzaWduYWwuCisgICogQHJtdG9sbCBGTFRJTlIxICAgICBGTFQxUCAgICAgICAgTExfSFJUSU1fRkxUX1NldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIEZMVElOUjEgICAgIEZMVDJQICAgICAgICBMTF9IUlRJTV9GTFRfU2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgRkxUSU5SMSAgICAgRkxUM1AgICAgICAgIExMX0hSVElNX0ZMVF9TZXRQb2xhcml0eVxuCisgICogICAgICAgICBGTFRJTlIxICAgICBGTFQ0UCAgICAgICAgTExfSFJUSU1fRkxUX1NldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIEZMVElOUjIgICAgIEZMVDVQICAgICAgICBMTF9IUlRJTV9GTFRfU2V0UG9sYXJpdHkKKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGNhbGxlZCB3aGVuIHRoZSBmYXVsdCBjaGFubmVsIGlzIGVuYWJsZWQuCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBGYXVsdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZBVUxUXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GQVVMVF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkFVTFRfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZBVUxUXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GQVVMVF81CisgICogQHBhcmFtICBQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZMVF9QT0xBUklUWV9MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GTFRfUE9MQVJJVFlfSElHSAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRkxUX1NldFBvbGFyaXR5KEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgRmF1bHQsIHVpbnQzMl90IFBvbGFyaXR5KQoreworICByZWdpc3RlciB1aW50MzJfdCBpRmF1bHQgPSAodWludDhfdClQT1NJVElPTl9WQUwoRmF1bHQpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNDb21tb25SZWdzLkZMVElOUjEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9GTFRJTlJbaUZhdWx0XSkpOworICBNT0RJRllfUkVHKCpwUmVnLCAoSFJUSU1fRkxUSU5SMV9GTFQxUCA8PCBSRUdfU0hJRlRfVEFCX0ZMVHhFW2lGYXVsdF0pLCAoUG9sYXJpdHkgPDwgUkVHX1NISUZUX1RBQl9GTFR4RVtpRmF1bHRdKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCBwb2xhcml0eSBvZiBhIGZhdWx0IHNpZ25hbC4KKyAgKiBAcm10b2xsIEZMVElOUjEgICAgIEZMVDFQICAgICAgICBMTF9IUlRJTV9GTFRfR2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgRkxUSU5SMSAgICAgRkxUMlAgICAgICAgIExMX0hSVElNX0ZMVF9HZXRQb2xhcml0eVxuCisgICogICAgICAgICBGTFRJTlIxICAgICBGTFQzUCAgICAgICAgTExfSFJUSU1fRkxUX0dldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIEZMVElOUjEgICAgIEZMVDRQICAgICAgICBMTF9IUlRJTV9GTFRfR2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgRkxUSU5SMiAgICAgRkxUNVAgICAgICAgIExMX0hSVElNX0ZMVF9HZXRQb2xhcml0eQorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgRmF1bHQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GQVVMVF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkFVTFRfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZBVUxUXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GQVVMVF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkFVTFRfNQorICAqIEByZXR2YWwgUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GTFRfUE9MQVJJVFlfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkxUX1BPTEFSSVRZX0hJR0gKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9GTFRfR2V0UG9sYXJpdHkoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBGYXVsdCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaUZhdWx0ID0gKHVpbnQ4X3QpUE9TSVRJT05fVkFMKEZhdWx0KTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zQ29tbW9uUmVncy5GTFRJTlIxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfRkxUSU5SW2lGYXVsdF0pKTsKKyAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgKEhSVElNX0ZMVElOUjFfRkxUMVAgPDwgUkVHX1NISUZUX1RBQl9GTFR4RVtpRmF1bHRdKSkgPj4gIFJFR19TSElGVF9UQUJfRkxUeEVbaUZhdWx0XSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBkaWdpdGFsIG5vaXNlIGZpbHRlciBvZiBhIGZhdWx0IHNpZ25hbC4KKyAgKiBAcm10b2xsIEZMVElOUjEgICAgIEZMVDFGICAgICAgTExfSFJUSU1fRkxUX1NldEZpbHRlclxuCisgICogICAgICAgICBGTFRJTlIxICAgICBGTFQyRiAgICAgIExMX0hSVElNX0ZMVF9TZXRGaWx0ZXJcbgorICAqICAgICAgICAgRkxUSU5SMSAgICAgRkxUM0YgICAgICBMTF9IUlRJTV9GTFRfU2V0RmlsdGVyXG4KKyAgKiAgICAgICAgIEZMVElOUjEgICAgIEZMVDRGICAgICAgTExfSFJUSU1fRkxUX1NldEZpbHRlclxuCisgICogICAgICAgICBGTFRJTlIyICAgICBGTFQ1RiAgICAgIExMX0hSVElNX0ZMVF9TZXRGaWx0ZXIKKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGNhbGxlZCB3aGVuIHRoZSBmYXVsdCBjaGFubmVsIGlzIGVuYWJsZWQuCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBGYXVsdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZBVUxUXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GQVVMVF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkFVTFRfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZBVUxUXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GQVVMVF81CisgICogQHBhcmFtICBGaWx0ZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GTFRfRklMVEVSX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GTFRfRklMVEVSXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GTFRfRklMVEVSXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GTFRfRklMVEVSXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GTFRfRklMVEVSXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GTFRfRklMVEVSXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GTFRfRklMVEVSXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GTFRfRklMVEVSXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GTFRfRklMVEVSXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GTFRfRklMVEVSXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GTFRfRklMVEVSXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkxUX0ZJTFRFUl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZMVF9GSUxURVJfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GTFRfRklMVEVSXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkxUX0ZJTFRFUl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZMVF9GSUxURVJfMTUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0ZMVF9TZXRGaWx0ZXIoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBGYXVsdCwgdWludDMyX3QgRmlsdGVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpRmF1bHQgPSAodWludDhfdClQT1NJVElPTl9WQUwoRmF1bHQpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNDb21tb25SZWdzLkZMVElOUjEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9GTFRJTlJbaUZhdWx0XSkpOworICBNT0RJRllfUkVHKCpwUmVnLCAoSFJUSU1fRkxUSU5SMV9GTFQxRiA8PCBSRUdfU0hJRlRfVEFCX0ZMVHhFW2lGYXVsdF0pLCAoRmlsdGVyIDw8IFJFR19TSElGVF9UQUJfRkxUeEVbaUZhdWx0XSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgZGlnaXRhbCBub2lzZSBmaWx0ZXIgc2V0dGluZyBvZiBhIGZhdWx0IHNpZ25hbC4KKyAgKiBAcm10b2xsIEZMVElOUjEgICAgIEZMVDFGICAgICAgTExfSFJUSU1fRkxUX0dldEZpbHRlclxuCisgICogICAgICAgICBGTFRJTlIxICAgICBGTFQyRiAgICAgIExMX0hSVElNX0ZMVF9HZXRGaWx0ZXJcbgorICAqICAgICAgICAgRkxUSU5SMSAgICAgRkxUM0YgICAgICBMTF9IUlRJTV9GTFRfR2V0RmlsdGVyXG4KKyAgKiAgICAgICAgIEZMVElOUjEgICAgIEZMVDRGICAgICAgTExfSFJUSU1fRkxUX0dldEZpbHRlclxuCisgICogICAgICAgICBGTFRJTlIyICAgICBGTFQ1RiAgICAgIExMX0hSVElNX0ZMVF9HZXRGaWx0ZXIKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEZhdWx0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkFVTFRfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZBVUxUXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GQVVMVF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkFVTFRfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZBVUxUXzUKKyAgKiBAcmV0dmFsIEZpbHRlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZMVF9GSUxURVJfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZMVF9GSUxURVJfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZMVF9GSUxURVJfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZMVF9GSUxURVJfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZMVF9GSUxURVJfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZMVF9GSUxURVJfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZMVF9GSUxURVJfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZMVF9GSUxURVJfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZMVF9GSUxURVJfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZMVF9GSUxURVJfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZMVF9GSUxURVJfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GTFRfRklMVEVSXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkxUX0ZJTFRFUl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZMVF9GSUxURVJfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GTFRfRklMVEVSXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkxUX0ZJTFRFUl8xNQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0ZMVF9HZXRGaWx0ZXIoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBGYXVsdCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaUZhdWx0ID0gKHVpbnQ4X3QpUE9TSVRJT05fVkFMKEZhdWx0KTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zQ29tbW9uUmVncy5GTFRJTlIxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfRkxUSU5SW2lGYXVsdF0pKTsKKyAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgKEhSVElNX0ZMVElOUjFfRkxUMUYgPDwgUkVHX1NISUZUX1RBQl9GTFR4RVtpRmF1bHRdKSkgPj4gIFJFR19TSElGVF9UQUJfRkxUeEVbaUZhdWx0XSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBmYXVsdCBjaXJjdWl0cnkgcHJlc2NhbGVyLgorICAqIEBybXRvbGwgRkxUSU5SMiAgICAgRkxUU0QgICAgICBMTF9IUlRJTV9GTFRfU2V0UHJlc2NhbGVyCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBQcmVzY2FsZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GTFRfUFJFU0NBTEVSX0RJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GTFRfUFJFU0NBTEVSX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GTFRfUFJFU0NBTEVSX0RJVjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GTFRfUFJFU0NBTEVSX0RJVjgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0ZMVF9TZXRQcmVzY2FsZXIoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBQcmVzY2FsZXIpCit7CisgIE1PRElGWV9SRUcoSFJUSU14LT5zQ29tbW9uUmVncy5GTFRJTlIyLCBIUlRJTV9GTFRJTlIyX0ZMVFNELCBQcmVzY2FsZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgZmF1bHQgY2lyY3VpdHJ5IHByZXNjYWxlciBzZXR0aW5nLgorICAqIEBybXRvbGwgRkxUSU5SMiAgICAgRkxUU0QgICAgICBMTF9IUlRJTV9GTFRfR2V0UHJlc2NhbGVyCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBQcmVzY2FsZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GTFRfUFJFU0NBTEVSX0RJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GTFRfUFJFU0NBTEVSX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GTFRfUFJFU0NBTEVSX0RJVjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GTFRfUFJFU0NBTEVSX0RJVjgKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9GTFRfR2V0UHJlc2NhbGVyKEhSVElNX1R5cGVEZWYgKkhSVElNeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChIUlRJTXgtPnNDb21tb25SZWdzLkZMVElOUjIsIEhSVElNX0ZMVElOUjJfRkxUU0QpKTsKKworfQorCisvKioKKyAgKiBAYnJpZWYgIExvY2sgdGhlIGZhdWx0IHNpZ25hbCBjb25kaXRpb25pbmcgc2V0dGluZ3MuCisgICogQHJtdG9sbCBGTFRJTlIxICAgICBGTFQxTENLICAgICAgTExfSFJUSU1fRkxUX0xvY2tcbgorICAqICAgICAgICAgRkxUSU5SMSAgICAgRkxUMkxDSyAgICAgIExMX0hSVElNX0ZMVF9Mb2NrXG4KKyAgKiAgICAgICAgIEZMVElOUjEgICAgIEZMVDNMQ0sgICAgICBMTF9IUlRJTV9GTFRfTG9ja1xuCisgICogICAgICAgICBGTFRJTlIxICAgICBGTFQ0TENLICAgICAgTExfSFJUSU1fRkxUX0xvY2tcbgorICAqICAgICAgICAgRkxUSU5SMiAgICAgRkxUNUxDSyAgICAgIExMX0hSVElNX0ZMVF9Mb2NrCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBGYXVsdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZBVUxUXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GQVVMVF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkFVTFRfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZBVUxUXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GQVVMVF81CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9GTFRfTG9jayhIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IEZhdWx0KQoreworICByZWdpc3RlciB1aW50MzJfdCBpRmF1bHQgPSAodWludDhfdClQT1NJVElPTl9WQUwoRmF1bHQpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNDb21tb25SZWdzLkZMVElOUjEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9GTFRJTlJbaUZhdWx0XSkpOworICBTRVRfQklUKCpwUmVnLCAoSFJUSU1fRkxUSU5SMV9GTFQxTENLIDw8IFJFR19TSElGVF9UQUJfRkxUeEVbaUZhdWx0XSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgZmF1bHQgY2lyY3VpdHJ5IGZvciB0aGUgZGVzaWduYXRlZCBmYXVsdCBpbnB1dC4KKyAgKiBAcm10b2xsIEZMVElOUjEgICAgIEZMVDFFICAgICAgTExfSFJUSU1fRkxUX0VuYWJsZVxuCisgICogICAgICAgICBGTFRJTlIxICAgICBGTFQyRSAgICAgIExMX0hSVElNX0ZMVF9FbmFibGVcbgorICAqICAgICAgICAgRkxUSU5SMSAgICAgRkxUM0UgICAgICBMTF9IUlRJTV9GTFRfRW5hYmxlXG4KKyAgKiAgICAgICAgIEZMVElOUjEgICAgIEZMVDRFICAgICAgTExfSFJUSU1fRkxUX0VuYWJsZVxuCisgICogICAgICAgICBGTFRJTlIyICAgICBGTFQ1RSAgICAgIExMX0hSVElNX0ZMVF9FbmFibGUKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEZhdWx0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkFVTFRfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZBVUxUXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GQVVMVF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkFVTFRfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZBVUxUXzUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0ZMVF9FbmFibGUoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBGYXVsdCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaUZhdWx0ID0gKHVpbnQ4X3QpUE9TSVRJT05fVkFMKEZhdWx0KTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zQ29tbW9uUmVncy5GTFRJTlIxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfRkxUSU5SW2lGYXVsdF0pKTsKKyAgU0VUX0JJVCgqcFJlZywgKEhSVElNX0ZMVElOUjFfRkxUMUUgPDwgUkVHX1NISUZUX1RBQl9GTFR4RVtpRmF1bHRdKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgZmF1bHQgY2lyY3VpdHJ5IGZvciBmb3IgdGhlIGRlc2lnbmF0ZWQgZmF1bHQgaW5wdXQuCisgICogQHJtdG9sbCBGTFRJTlIxICAgICBGTFQxRSAgICAgIExMX0hSVElNX0ZMVF9EaXNhYmxlXG4KKyAgKiAgICAgICAgIEZMVElOUjEgICAgIEZMVDJFICAgICAgTExfSFJUSU1fRkxUX0Rpc2FibGVcbgorICAqICAgICAgICAgRkxUSU5SMSAgICAgRkxUM0UgICAgICBMTF9IUlRJTV9GTFRfRGlzYWJsZVxuCisgICogICAgICAgICBGTFRJTlIxICAgICBGTFQ0RSAgICAgIExMX0hSVElNX0ZMVF9EaXNhYmxlXG4KKyAgKiAgICAgICAgIEZMVElOUjIgICAgIEZMVDVFICAgICAgTExfSFJUSU1fRkxUX0Rpc2FibGUKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEZhdWx0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkFVTFRfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZBVUxUXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GQVVMVF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkFVTFRfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZBVUxUXzUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0ZMVF9EaXNhYmxlKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgRmF1bHQpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlGYXVsdCA9ICh1aW50OF90KVBPU0lUSU9OX1ZBTChGYXVsdCk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c0NvbW1vblJlZ3MuRkxUSU5SMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX0ZMVElOUltpRmF1bHRdKSk7CisgIENMRUFSX0JJVCgqcFJlZywgKEhSVElNX0ZMVElOUjFfRkxUMUUgPDwgUkVHX1NISUZUX1RBQl9GTFR4RVtpRmF1bHRdKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciB0aGUgZmF1bHQgY2lyY3VpdHJ5IGlzIGVuYWJsZWQgZm9yIGEgZ2l2ZW4gZmF1bHQgaW5wdXQuCisgICogQHJtdG9sbCBGTFRJTlIxICAgICBGTFQxRSAgICAgIExMX0hSVElNX0ZMVF9Jc0VuYWJsZWRcbgorICAqICAgICAgICAgRkxUSU5SMSAgICAgRkxUMkUgICAgICBMTF9IUlRJTV9GTFRfSXNFbmFibGVkXG4KKyAgKiAgICAgICAgIEZMVElOUjEgICAgIEZMVDNFICAgICAgTExfSFJUSU1fRkxUX0lzRW5hYmxlZFxuCisgICogICAgICAgICBGTFRJTlIxICAgICBGTFQ0RSAgICAgIExMX0hSVElNX0ZMVF9Jc0VuYWJsZWRcbgorICAqICAgICAgICAgRkxUSU5SMiAgICAgRkxUNUUgICAgICBMTF9IUlRJTV9GTFRfSXNFbmFibGVkCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgRmF1bHQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GQVVMVF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkFVTFRfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0ZBVUxUXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9GQVVMVF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fRkFVTFRfNQorICAqIEByZXR2YWwgU3RhdGUgb2YgRkxUeEVOIGJpdCBpbiBIUlRJTV9GTFRJTlJ4IHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0ZMVF9Jc0VuYWJsZWQoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBGYXVsdCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaUZhdWx0ID0gKHVpbnQ4X3QpUE9TSVRJT05fVkFMKEZhdWx0KTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zQ29tbW9uUmVncy5GTFRJTlIxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfRkxUSU5SW2lGYXVsdF0pKTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoKnBSZWcsIChIUlRJTV9GTFRJTlIxX0ZMVDFFIDw8IFJFR19TSElGVF9UQUJfRkxUeEVbaUZhdWx0XSkpID4+IFJFR19TSElGVF9UQUJfRkxUeEVbaUZhdWx0XSkgPT0KKyAgICAgICAgICAoSFJUSU1fSUVSX0ZMVDEpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9FRl9CdXJzdF9Nb2RlX21hbmFnZW1lbnQgQnVyc3RfTW9kZV9tYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIGJ1cnN0IG1vZGUgY29udHJvbGxlci4KKyAgKiBAcm10b2xsIEJNQ1IgICAgIEJNT00gICAgICAgIExMX0hSVElNX0JNX0NvbmZpZ1xuCisgICogICAgICAgICBCTUNSICAgICBCTUNMSyAgICAgICBMTF9IUlRJTV9CTV9Db25maWdcbgorICAqICAgICAgICAgQk1DUiAgICAgQk1QUlNDICAgICAgTExfSFJUSU1fQk1fQ29uZmlnCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDb25maWd1cmF0aW9uIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBjb21iaW5hdGlvbiBvZiBhbGwgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fTU9ERV9TSU5HTEVTSE9UIG9yIEByZWYgTExfSFJUSU1fQk1fTU9ERV9DT05USU5PVVMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9DTEtTUkNfTUFTVEVSIG9yIC4uLiBvciBAcmVmIExMX0hSVElNX0JNX0NMS1NSQ19GSFJUSU0KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9QUkVTQ0FMRVJfRElWMSBvciAuLi4gQHJlZiBMTF9IUlRJTV9CTV9QUkVTQ0FMRVJfRElWMzI3NjgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0JNX0NvbmZpZyhIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IENvbmZpZ3VyYXRpb24pCit7CisgIE1PRElGWV9SRUcoSFJUSU14LT5zQ29tbW9uUmVncy5CTUNSLCBIUlRJTV9CTV9DT05GSUdfTUFTSywgQ29uZmlndXJhdGlvbik7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBidXJzdCBtb2RlIGNvbnRyb2xsZXIgb3BlcmF0aW5nIG1vZGUuCisgICogQHJtdG9sbCBCTUNSICAgICBCTU9NICAgICAgICBMTF9IUlRJTV9CTV9TZXRNb2RlCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fTU9ERV9TSU5HTEVTSE9UCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fTU9ERV9DT05USU5PVVMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0JNX1NldE1vZGUoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBNb2RlKQoreworICBNT0RJRllfUkVHKEhSVElNeC0+c0NvbW1vblJlZ3MuQk1DUiwgSFJUSU1fQk1DUl9CTU9NLCBNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIGJ1cnN0IG1vZGUgY29udHJvbGxlciBvcGVyYXRpbmcgbW9kZS4KKyAgKiBAcm10b2xsIEJNQ1IgICAgIEJNT00gICAgICAgIExMX0hSVElNX0JNX0dldE1vZGUKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9NT0RFX1NJTkdMRVNIT1QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9NT0RFX0NPTlRJTk9VUworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0JNX0dldE1vZGUoSFJUSU1fVHlwZURlZiAqSFJUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KVJFQURfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuQk1DUiwgSFJUSU1fQk1DUl9CTU9NKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGJ1cnN0IG1vZGUgY29udHJvbGxlciBjbG9jayBzb3VyY2UuCisgICogQHJtdG9sbCBCTUNSICAgICBCTUNMSyAgICAgICBMTF9IUlRJTV9CTV9TZXRDbG9ja1NyYworICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2xvY2tTcmMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9DTEtTUkNfTUFTVEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fQ0xLU1JDX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9DTEtTUkNfVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX0NMS1NSQ19USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fQ0xLU1JDX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9DTEtTUkNfVElNRVJfRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX0NMS1NSQ19USU0xNl9PQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX0NMS1NSQ19USU0xN19PQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX0NMS1NSQ19USU03X1RSR08KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9DTEtTUkNfRkhSVElNCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9CTV9TZXRDbG9ja1NyYyhIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IENsb2NrU3JjKQoreworICBNT0RJRllfUkVHKEhSVElNeC0+c0NvbW1vblJlZ3MuQk1DUiwgSFJUSU1fQk1DUl9CTUNMSywgQ2xvY2tTcmMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgYnVyc3QgbW9kZSBjb250cm9sbGVyIGNsb2NrIHNvdXJjZS4KKyAgKiBAcm10b2xsIEJNQ1IgICAgIEJNQ0xLICAgICAgIExMX0hSVElNX0JNX0dldENsb2NrU3JjCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBDbG9ja1NyYyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX0NMS1NSQ19NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9DTEtTUkNfVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX0NMS1NSQ19USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fQ0xLU1JDX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9DTEtTUkNfVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX0NMS1NSQ19USU1FUl9FCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fQ0xLU1JDX1RJTTE2X09DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fQ0xLU1JDX1RJTTE3X09DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fQ0xLU1JDX1RJTTdfVFJHTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX0NMS1NSQ19GSFJUSU0KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9CTV9HZXRDbG9ja1NyYyhIUlRJTV9UeXBlRGVmICpIUlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpUkVBRF9CSVQoSFJUSU14LT5zQ29tbW9uUmVncy5CTUNSLCBIUlRJTV9CTUNSX0JNQ0xLKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGJ1cnN0IG1vZGUgY29udHJvbGxlciBwcmVzY2FsZXIuCisgICogQHJtdG9sbCBCTUNSICAgICBCTVBSU0MgICAgICBMTF9IUlRJTV9CTV9TZXRQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFByZXNjYWxlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1BSRVNDQUxFUl9ESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fUFJFU0NBTEVSX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9QUkVTQ0FMRVJfRElWNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1BSRVNDQUxFUl9ESVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fUFJFU0NBTEVSX0RJVjE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fUFJFU0NBTEVSX0RJVjMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fUFJFU0NBTEVSX0RJVjY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fUFJFU0NBTEVSX0RJVjEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1BSRVNDQUxFUl9ESVYyNTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9QUkVTQ0FMRVJfRElWNTEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fUFJFU0NBTEVSX0RJVjEwMjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9QUkVTQ0FMRVJfRElWMjA0OAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1BSRVNDQUxFUl9ESVY0MDk2CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fUFJFU0NBTEVSX0RJVjgxOTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9QUkVTQ0FMRVJfRElWMTYzODQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9QUkVTQ0FMRVJfRElWMzI3NjgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0JNX1NldFByZXNjYWxlcihIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFByZXNjYWxlcikKK3sKKyAgTU9ESUZZX1JFRyhIUlRJTXgtPnNDb21tb25SZWdzLkJNQ1IsIEhSVElNX0JNQ1JfQk1QUlNDLCBQcmVzY2FsZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgYnVyc3QgbW9kZSBjb250cm9sbGVyIHByZXNjYWxlciBzZXR0aW5nLgorICAqIEBybXRvbGwgQk1DUiAgICAgQk1QUlNDICAgICAgTExfSFJUSU1fQk1fR2V0UHJlc2NhbGVyCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBQcmVzY2FsZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9QUkVTQ0FMRVJfRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1BSRVNDQUxFUl9ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fUFJFU0NBTEVSX0RJVjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9QUkVTQ0FMRVJfRElWOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1BSRVNDQUxFUl9ESVYxNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1BSRVNDQUxFUl9ESVYzMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1BSRVNDQUxFUl9ESVY2NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1BSRVNDQUxFUl9ESVYxMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9QUkVTQ0FMRVJfRElWMjU2CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fUFJFU0NBTEVSX0RJVjUxMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1BSRVNDQUxFUl9ESVYxMDI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fUFJFU0NBTEVSX0RJVjIwNDgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9QUkVTQ0FMRVJfRElWNDA5NgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1BSRVNDQUxFUl9ESVY4MTkyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fUFJFU0NBTEVSX0RJVjE2Mzg0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fUFJFU0NBTEVSX0RJVjMyNzY4CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fQk1fR2V0UHJlc2NhbGVyKEhSVElNX1R5cGVEZWYgKkhSVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdClSRUFEX0JJVChIUlRJTXgtPnNDb21tb25SZWdzLkJNQ1IsIEhSVElNX0JNQ1JfQk1QUlNDKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgYnVyc3QgbW9kZSBjb21wYXJlIGFuZCBwZXJpb2QgcmVnaXN0ZXJzIHByZWxvYWQuCisgICogQHJtdG9sbCBCTUNSICAgICBCTVBSRU4gICAgICBMTF9IUlRJTV9CTV9FbmFibGVQcmVsb2FkCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9CTV9FbmFibGVQcmVsb2FkKEhSVElNX1R5cGVEZWYgKkhSVElNeCkKK3sKKyAgU0VUX0JJVChIUlRJTXgtPnNDb21tb25SZWdzLkJNQ1IsIEhSVElNX0JNQ1JfQk1QUkVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGJ1cnN0IG1vZGUgY29tcGFyZSBhbmQgcGVyaW9kIHJlZ2lzdGVycyBwcmVsb2FkLgorICAqIEBybXRvbGwgQk1DUiAgICAgQk1QUkVOICAgICAgTExfSFJUSU1fQk1fRGlzYWJsZVByZWxvYWQKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0JNX0Rpc2FibGVQcmVsb2FkKEhSVElNX1R5cGVEZWYgKkhSVElNeCkKK3sKKyAgQ0xFQVJfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuQk1DUiwgSFJUSU1fQk1DUl9CTVBSRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgYnVyc3QgbW9kZSBjb21wYXJlIGFuZCBwZXJpb2QgcmVnaXN0ZXJzIGFyZSBwcmVsb2FkZWQuCisgICogQHJtdG9sbCBCTUNSICAgICBCTVBSRU4gICAgICBMTF9IUlRJTV9CTV9Jc0VuYWJsZWRQcmVsb2FkCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBCTVBSRU4gYml0IGluIEhSVElNX0JNQ1IgcmVnaXN0ZXIgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fQk1fSXNFbmFibGVkUHJlbG9hZChIUlRJTV9UeXBlRGVmICpIUlRJTXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoSFJUSU14LT5zQ29tbW9uUmVncy5CTUNSLCBIUlRJTV9CTUNSX0JNUFJFTikgPT0gSFJUSU1fQk1DUl9CTVBSRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgYnVyc3QgbW9kZSBjb250cm9sbGVyIHRyaWdnZXIKKyAgKiBAcm10b2xsIEJNVFJHUiAgICAgU1cgICAgICAgICAgIExMX0hSVElNX0JNX1NldFRyaWdcbgorICAqICAgICAgICAgQk1UUkdSICAgICBNU1RSU1QgICAgICAgTExfSFJUSU1fQk1fU2V0VHJpZ1xuCisgICogICAgICAgICBCTVRSR1IgICAgIE1TVFJFUCAgICAgICBMTF9IUlRJTV9CTV9TZXRUcmlnXG4KKyAgKiAgICAgICAgIEJNVFJHUiAgICAgTVNUQ01QMSAgICAgIExMX0hSVElNX0JNX1NldFRyaWdcbgorICAqICAgICAgICAgQk1UUkdSICAgICBNU1RDTVAyICAgICAgTExfSFJUSU1fQk1fU2V0VHJpZ1xuCisgICogICAgICAgICBCTVRSR1IgICAgIE1TVENNUDMgICAgICBMTF9IUlRJTV9CTV9TZXRUcmlnXG4KKyAgKiAgICAgICAgIEJNVFJHUiAgICAgTVNUQ01QNCAgICAgIExMX0hSVElNX0JNX1NldFRyaWdcbgorICAqICAgICAgICAgQk1UUkdSICAgICBUQVJTVCAgICAgICAgTExfSFJUSU1fQk1fU2V0VHJpZ1xuCisgICogICAgICAgICBCTVRSR1IgICAgIFRBUkVQICAgICAgICBMTF9IUlRJTV9CTV9TZXRUcmlnXG4KKyAgKiAgICAgICAgIEJNVFJHUiAgICAgVEFDTVAxICAgICAgIExMX0hSVElNX0JNX1NldFRyaWdcbgorICAqICAgICAgICAgQk1UUkdSICAgICBUQUNNUDIgICAgICAgTExfSFJUSU1fQk1fU2V0VHJpZ1xuCisgICogICAgICAgICBCTVRSR1IgICAgIFRCUlNUICAgICAgICBMTF9IUlRJTV9CTV9TZXRUcmlnXG4KKyAgKiAgICAgICAgIEJNVFJHUiAgICAgVEJSRVAgICAgICAgIExMX0hSVElNX0JNX1NldFRyaWdcbgorICAqICAgICAgICAgQk1UUkdSICAgICBUQkNNUDEgICAgICAgTExfSFJUSU1fQk1fU2V0VHJpZ1xuCisgICogICAgICAgICBCTVRSR1IgICAgIFRCQ01QMiAgICAgICBMTF9IUlRJTV9CTV9TZXRUcmlnXG4KKyAgKiAgICAgICAgIEJNVFJHUiAgICAgVENSU1QgICAgICAgIExMX0hSVElNX0JNX1NldFRyaWdcbgorICAqICAgICAgICAgQk1UUkdSICAgICBUQ1JFUCAgICAgICAgTExfSFJUSU1fQk1fU2V0VHJpZ1xuCisgICogICAgICAgICBCTVRSR1IgICAgIFRDQ01QMSAgICAgICBMTF9IUlRJTV9CTV9TZXRUcmlnXG4KKyAgKiAgICAgICAgIEJNVFJHUiAgICAgVENDTVAyICAgICAgIExMX0hSVElNX0JNX1NldFRyaWdcbgorICAqICAgICAgICAgQk1UUkdSICAgICBURFJTVCAgICAgICAgTExfSFJUSU1fQk1fU2V0VHJpZ1xuCisgICogICAgICAgICBCTVRSR1IgICAgIFREUkVQICAgICAgICBMTF9IUlRJTV9CTV9TZXRUcmlnXG4KKyAgKiAgICAgICAgIEJNVFJHUiAgICAgVERDTVAxICAgICAgIExMX0hSVElNX0JNX1NldFRyaWdcbgorICAqICAgICAgICAgQk1UUkdSICAgICBURENNUDIgICAgICAgTExfSFJUSU1fQk1fU2V0VHJpZ1xuCisgICogICAgICAgICBCTVRSR1IgICAgIFRFUlNUICAgICAgICBMTF9IUlRJTV9CTV9TZXRUcmlnXG4KKyAgKiAgICAgICAgIEJNVFJHUiAgICAgVEVSRVAgICAgICAgIExMX0hSVElNX0JNX1NldFRyaWdcbgorICAqICAgICAgICAgQk1UUkdSICAgICBURUNNUDEgICAgICAgTExfSFJUSU1fQk1fU2V0VHJpZ1xuCisgICogICAgICAgICBCTVRSR1IgICAgIFRFQ01QMiAgICAgICBMTF9IUlRJTV9CTV9TZXRUcmlnXG4KKyAgKiAgICAgICAgIEJNVFJHUiAgICAgVEFFRVY3ICAgICAgIExMX0hSVElNX0JNX1NldFRyaWdcbgorICAqICAgICAgICAgQk1UUkdSICAgICBUQUVFVjggICAgICAgTExfSFJUSU1fQk1fU2V0VHJpZ1xuCisgICogICAgICAgICBCTVRSR1IgICAgIEVFVjcgICAgICAgICBMTF9IUlRJTV9CTV9TZXRUcmlnXG4KKyAgKiAgICAgICAgIEJNVFJHUiAgICAgRUVWOCAgICAgICAgIExMX0hSVElNX0JNX1NldFRyaWdcbgorICAqICAgICAgICAgQk1UUkdSICAgICBPQ0hJUEVWICAgICAgTExfSFJUSU1fQk1fU2V0VHJpZworICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVHJpZyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9UUklHX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9UUklHX01BU1RFUl9SRVNFVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1RSSUdfTUFTVEVSX1JFUEVUSVRJT04KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9UUklHX01BU1RFUl9DTVAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fVFJJR19NQVNURVJfQ01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1RSSUdfTUFTVEVSX0NNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9UUklHX01BU1RFUl9DTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fVFJJR19USU1BX1JFU0VUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fVFJJR19USU1BX1JFUEVUSVRJT04KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9UUklHX1RJTUFfQ01QMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1RSSUdfVElNQV9DTVAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fVFJJR19USU1CX1JFU0VUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fVFJJR19USU1CX1JFUEVUSVRJT04KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9UUklHX1RJTUJfQ01QMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1RSSUdfVElNQl9DTVAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fVFJJR19USU1DX1JFU0VUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fVFJJR19USU1DX1JFUEVUSVRJT04KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9UUklHX1RJTUNfQ01QMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1RSSUdfVElNQ19DTVAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fVFJJR19USU1EX1JFU0VUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fVFJJR19USU1EX1JFUEVUSVRJT04KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9UUklHX1RJTURfQ01QMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1RSSUdfVElNRF9DTVAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fVFJJR19USU1FX1JFU0VUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fVFJJR19USU1FX1JFUEVUSVRJT04KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9UUklHX1RJTUVfQ01QMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1RSSUdfVElNRV9DTVAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fVFJJR19USU1BX0VWRU5UNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1RSSUdfVElNRF9FVkVOVDgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9UUklHX0VWRU5UXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9UUklHX0VWRU5UXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9UUklHX0VWRU5UX09OQ0hJUAorICAgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9CTV9TZXRUcmlnKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVHJpZykKK3sKKyAgV1JJVEVfUkVHKEhSVElNeC0+c0NvbW1vblJlZ3MuQk1UUkdSLCBUcmlnKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIGJ1cnN0IG1vZGUgY29udHJvbGxlciB0cmlnZ2VyLgorICAqIEBybXRvbGwgQk1UUkdSICAgICBTVyAgICAgICAgICAgTExfSFJUSU1fQk1fR2V0VHJpZ1xuCisgICogICAgICAgICBCTVRSR1IgICAgIE1TVFJTVCAgICAgICBMTF9IUlRJTV9CTV9HZXRUcmlnXG4KKyAgKiAgICAgICAgIEJNVFJHUiAgICAgTVNUUkVQICAgICAgIExMX0hSVElNX0JNX0dldFRyaWdcbgorICAqICAgICAgICAgQk1UUkdSICAgICBNU1RDTVAxICAgICAgTExfSFJUSU1fQk1fR2V0VHJpZ1xuCisgICogICAgICAgICBCTVRSR1IgICAgIE1TVENNUDIgICAgICBMTF9IUlRJTV9CTV9HZXRUcmlnXG4KKyAgKiAgICAgICAgIEJNVFJHUiAgICAgTVNUQ01QMyAgICAgIExMX0hSVElNX0JNX0dldFRyaWdcbgorICAqICAgICAgICAgQk1UUkdSICAgICBNU1RDTVA0ICAgICAgTExfSFJUSU1fQk1fR2V0VHJpZ1xuCisgICogICAgICAgICBCTVRSR1IgICAgIFRBUlNUICAgICAgICBMTF9IUlRJTV9CTV9HZXRUcmlnXG4KKyAgKiAgICAgICAgIEJNVFJHUiAgICAgVEFSRVAgICAgICAgIExMX0hSVElNX0JNX0dldFRyaWdcbgorICAqICAgICAgICAgQk1UUkdSICAgICBUQUNNUDEgICAgICAgTExfSFJUSU1fQk1fR2V0VHJpZ1xuCisgICogICAgICAgICBCTVRSR1IgICAgIFRBQ01QMiAgICAgICBMTF9IUlRJTV9CTV9HZXRUcmlnXG4KKyAgKiAgICAgICAgIEJNVFJHUiAgICAgVEJSU1QgICAgICAgIExMX0hSVElNX0JNX0dldFRyaWdcbgorICAqICAgICAgICAgQk1UUkdSICAgICBUQlJFUCAgICAgICAgTExfSFJUSU1fQk1fR2V0VHJpZ1xuCisgICogICAgICAgICBCTVRSR1IgICAgIFRCQ01QMSAgICAgICBMTF9IUlRJTV9CTV9HZXRUcmlnXG4KKyAgKiAgICAgICAgIEJNVFJHUiAgICAgVEJDTVAyICAgICAgIExMX0hSVElNX0JNX0dldFRyaWdcbgorICAqICAgICAgICAgQk1UUkdSICAgICBUQ1JTVCAgICAgICAgTExfSFJUSU1fQk1fR2V0VHJpZ1xuCisgICogICAgICAgICBCTVRSR1IgICAgIFRDUkVQICAgICAgICBMTF9IUlRJTV9CTV9HZXRUcmlnXG4KKyAgKiAgICAgICAgIEJNVFJHUiAgICAgVENDTVAxICAgICAgIExMX0hSVElNX0JNX0dldFRyaWdcbgorICAqICAgICAgICAgQk1UUkdSICAgICBUQ0NNUDIgICAgICAgTExfSFJUSU1fQk1fR2V0VHJpZ1xuCisgICogICAgICAgICBCTVRSR1IgICAgIFREUlNUICAgICAgICBMTF9IUlRJTV9CTV9HZXRUcmlnXG4KKyAgKiAgICAgICAgIEJNVFJHUiAgICAgVERSRVAgICAgICAgIExMX0hSVElNX0JNX0dldFRyaWdcbgorICAqICAgICAgICAgQk1UUkdSICAgICBURENNUDEgICAgICAgTExfSFJUSU1fQk1fR2V0VHJpZ1xuCisgICogICAgICAgICBCTVRSR1IgICAgIFREQ01QMiAgICAgICBMTF9IUlRJTV9CTV9HZXRUcmlnXG4KKyAgKiAgICAgICAgIEJNVFJHUiAgICAgVEVSU1QgICAgICAgIExMX0hSVElNX0JNX0dldFRyaWdcbgorICAqICAgICAgICAgQk1UUkdSICAgICBURVJFUCAgICAgICAgTExfSFJUSU1fQk1fR2V0VHJpZ1xuCisgICogICAgICAgICBCTVRSR1IgICAgIFRFQ01QMSAgICAgICBMTF9IUlRJTV9CTV9HZXRUcmlnXG4KKyAgKiAgICAgICAgIEJNVFJHUiAgICAgVEVDTVAyICAgICAgIExMX0hSVElNX0JNX0dldFRyaWdcbgorICAqICAgICAgICAgQk1UUkdSICAgICBUQUVFVjcgICAgICAgTExfSFJUSU1fQk1fR2V0VHJpZ1xuCisgICogICAgICAgICBCTVRSR1IgICAgIFRBRUVWOCAgICAgICBMTF9IUlRJTV9CTV9HZXRUcmlnXG4KKyAgKiAgICAgICAgIEJNVFJHUiAgICAgRUVWNyAgICAgICAgIExMX0hSVElNX0JNX0dldFRyaWdcbgorICAqICAgICAgICAgQk1UUkdSICAgICBFRVY4ICAgICAgICAgTExfSFJUSU1fQk1fR2V0VHJpZ1xuCisgICogICAgICAgICBCTVRSR1IgICAgIE9DSElQRVYgICAgICBMTF9IUlRJTV9CTV9HZXRUcmlnCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBUcmlnIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1RSSUdfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1RSSUdfTUFTVEVSX1JFU0VUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fVFJJR19NQVNURVJfUkVQRVRJVElPTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1RSSUdfTUFTVEVSX0NNUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9UUklHX01BU1RFUl9DTVAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fVFJJR19NQVNURVJfQ01QMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1RSSUdfTUFTVEVSX0NNUDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9UUklHX1RJTUFfUkVTRVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9UUklHX1RJTUFfUkVQRVRJVElPTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1RSSUdfVElNQV9DTVAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fVFJJR19USU1BX0NNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9UUklHX1RJTUJfUkVTRVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9UUklHX1RJTUJfUkVQRVRJVElPTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1RSSUdfVElNQl9DTVAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fVFJJR19USU1CX0NNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9UUklHX1RJTUNfUkVTRVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9UUklHX1RJTUNfUkVQRVRJVElPTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1RSSUdfVElNQ19DTVAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fVFJJR19USU1DX0NNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9UUklHX1RJTURfUkVTRVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9UUklHX1RJTURfUkVQRVRJVElPTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1RSSUdfVElNRF9DTVAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fVFJJR19USU1EX0NNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9UUklHX1RJTUVfUkVTRVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9UUklHX1RJTUVfUkVQRVRJVElPTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1RSSUdfVElNRV9DTVAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fVFJJR19USU1FX0NNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9CTV9UUklHX1RJTUFfRVZFTlQ3CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fVFJJR19USU1EX0VWRU5UOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1RSSUdfRVZFTlRfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1RSSUdfRVZFTlRfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1RSSUdfRVZFTlRfT05DSElQCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fQk1fR2V0VHJpZyhIUlRJTV9UeXBlRGVmICpIUlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpUkVBRF9SRUcoSFJUSU14LT5zQ29tbW9uUmVncy5CTVRSR1IpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgYnVyc3QgbW9kZSBjb250cm9sbGVyIGNvbXBhcmUgdmFsdWUuCisgICogQHJtdG9sbCBCTUNNUFIgICAgIEJNQ01QICAgICAgTExfSFJUSU1fQk1fU2V0Q29tcGFyZQorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ29tcGFyZVZhbHVlIENvbXBhcmUgdmFsdWUgbXVzdCBiZSBhYm92ZSBvciBlcXVhbCB0byAzCisgICogICAgICAgICBwZXJpb2RzIG9mIHRoZSBmSFJUSU0gY2xvY2ssIHRoYXQgaXMgMHg2MCBpZiBDS1BTQ1syOjBdID0gMCwKKyAgKiAgICAgICAgIDB4MzAgaWYgQ0tQU0NbMjowXSA9IDEsIDB4MTggaWYgQ0tQU0NbMjowXSA9IDIsLi4uCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9CTV9TZXRDb21wYXJlKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgQ29tcGFyZVZhbHVlKQoreworICBXUklURV9SRUcoSFJUSU14LT5zQ29tbW9uUmVncy5CTUNNUFIsIENvbXBhcmVWYWx1ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCBidXJzdCBtb2RlIGNvbnRyb2xsZXIgY29tcGFyZSB2YWx1ZS4KKyAgKiBAcm10b2xsIEJNQ01QUiAgICAgQk1DTVAgICAgICBMTF9IUlRJTV9CTV9HZXRDb21wYXJlCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBDb21wYXJlVmFsdWUgQ29tcGFyZSB2YWx1ZSBtdXN0IGJlIGFib3ZlIG9yIGVxdWFsIHRvIDMKKyAgKiAgICAgICAgIHBlcmlvZHMgb2YgdGhlIGZIUlRJTSBjbG9jaywgdGhhdCBpcyAweDYwIGlmIENLUFNDWzI6MF0gPSAwLAorICAqICAgICAgICAgMHgzMCBpZiBDS1BTQ1syOjBdID0gMSwgMHgxOCBpZiBDS1BTQ1syOjBdID0gMiwuLi4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9CTV9HZXRDb21wYXJlKEhSVElNX1R5cGVEZWYgKkhSVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdClSRUFEX1JFRyhIUlRJTXgtPnNDb21tb25SZWdzLkJNQ01QUik7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBidXJzdCBtb2RlIGNvbnRyb2xsZXIgcGVyaW9kLgorICAqIEBybXRvbGwgQk1QRVIgICAgIEJNUEVSICAgICAgTExfSFJUSU1fQk1fU2V0UGVyaW9kCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBQZXJpb2QgVGhlIHBlcmlvZCB2YWx1ZSBtdXN0IGJlIGFib3ZlIG9yIGVxdWFsIHRvIDMgcGVyaW9kcyBvZiB0aGUgZkhSVElNIGNsb2NrLAorICAqICAgICAgICAgdGhhdCBpcyAweDYwIGlmIENLUFNDWzI6MF0gPSAwLCAweDMwIGlmIENLUFNDWzI6MF0gPSAxLCAweDE4IGlmIENLUFNDWzI6MF0gPSAyLC4uLgorICAqICAgICAgICAgVGhlIG1heGltdW0gdmFsdWUgaXMgMHgwMDAwIEZGREYuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9CTV9TZXRQZXJpb2QoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBQZXJpb2QpCit7CisgIFdSSVRFX1JFRyhIUlRJTXgtPnNDb21tb25SZWdzLkJNUEVSLCBQZXJpb2QpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgYnVyc3QgbW9kZSBjb250cm9sbGVyIHBlcmlvZC4KKyAgKiBAcm10b2xsIEJNUEVSICAgICBCTVBFUiAgICAgIExMX0hSVElNX0JNX0dldFBlcmlvZAorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgVGhlIHBlcmlvZCB2YWx1ZSBtdXN0IGJlIGFib3ZlIG9yIGVxdWFsIHRvIDMgcGVyaW9kcyBvZiB0aGUgZkhSVElNIGNsb2NrLAorICAqICAgICAgICAgdGhhdCBpcyAweDYwIGlmIENLUFNDWzI6MF0gPSAwLCAweDMwIGlmIENLUFNDWzI6MF0gPSAxLCAweDE4IGlmIENLUFNDWzI6MF0gPSAyLC4uLgorICAqICAgICAgICAgVGhlIG1heGltdW0gdmFsdWUgaXMgMHgwMDAwIEZGREYuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fQk1fR2V0UGVyaW9kKEhSVElNX1R5cGVEZWYgKkhSVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdClSRUFEX1JFRyhIUlRJTXgtPnNDb21tb25SZWdzLkJNUEVSKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIGJ1cnN0IG1vZGUgY29udHJvbGxlcgorICAqIEBybXRvbGwgQk1DUiAgICAgQk1FICAgICAgTExfSFJUSU1fQk1fRW5hYmxlCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9CTV9FbmFibGUoSFJUSU1fVHlwZURlZiAqSFJUSU14KQoreworICBTRVRfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuQk1DUiwgSFJUSU1fQk1DUl9CTUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIGJ1cnN0IG1vZGUgY29udHJvbGxlcgorICAqIEBybXRvbGwgQk1DUiAgICAgQk1FICAgICAgTExfSFJUSU1fQk1fRGlzYWJsZQorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fQk1fRGlzYWJsZShIUlRJTV9UeXBlRGVmICpIUlRJTXgpCit7CisgIENMRUFSX0JJVChIUlRJTXgtPnNDb21tb25SZWdzLkJNQ1IsIEhSVElNX0JNQ1JfQk1FKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBidXJzdCBtb2RlIGNvbnRyb2xsZXIgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIEJNQ1IgICAgIEJNRSAgICAgIExMX0hSVElNX0JNX0lzRW5hYmxlZAorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgQk1FIGJpdCBpbiBIUlRJTV9CTUNSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0JNX0lzRW5hYmxlZChIUlRJTV9UeXBlRGVmICpIUlRJTXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoSFJUSU14LT5zQ29tbW9uUmVncy5CTUNSLCBIUlRJTV9CTUNSX0JNRSkgPT0gSFJUSU1fQk1DUl9CTUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRyaWdnZXIgdGhlIGJ1cnN0IG9wZXJhdGlvbiAoc29mdHdhcmUgdHJpZ2dlcikKKyAgKiBAcm10b2xsIEJNVFJHUiAgICAgU1cgICAgICAgICAgIExMX0hSVElNX0JNX1N0YXJ0CisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9CTV9TdGFydChIUlRJTV9UeXBlRGVmICpIUlRJTXgpCit7CisgIFNFVF9CSVQoSFJUSU14LT5zQ29tbW9uUmVncy5CTVRSR1IsIEhSVElNX0JNVFJHUl9TVyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcCB0aGUgYnVyc3QgbW9kZSBvcGVyYXRpb24uCisgICogQHJtdG9sbCBCTUNSICAgICBCTVNUQVQgICAgICAgICAgIExMX0hSVElNX0JNX1N0b3AKKyAgKiBAbm90ZSBDYXVzZXMgYSBidXJzdCBtb2RlIGVhcmx5IHRlcm1pbmF0aW9uLgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fQk1fU3RvcChIUlRJTV9UeXBlRGVmICpIUlRJTXgpCit7CisgIENMRUFSX0JJVChIUlRJTXgtPnNDb21tb25SZWdzLkJNQ1IsIEhSVElNX0JNQ1JfQk1TVEFUKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIGJ1cnN0IG1vZGUgc3RhdHVzCisgICogQHJtdG9sbCBCTUNSICAgICBCTVNUQVQgICAgICAgICAgIExMX0hSVElNX0JNX0dldFN0YXR1cworICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdHVzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fQk1fU1RBVFVTX05PUk1BTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX0JNX1NUQVRVU19CVVJTVF9PTkdPSU5HCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fQk1fR2V0U3RhdHVzKEhSVElNX1R5cGVEZWYgKkhSVElNeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChIUlRJTXgtPnNDb21tb25SZWdzLkJNQ1IsIEhSVElNX0JNQ1JfQk1TVEFUKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRUZfRkxBR19NYW5hZ2VtZW50IEZMQUdfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIEZhdWx0IDEgaW50ZXJydXB0IGZsYWcuCisgICogQHJtdG9sbCBJQ1IgICAgIEZMVDFDICAgICAgICAgICBMTF9IUlRJTV9DbGVhckZsYWdfRkxUMQorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fQ2xlYXJGbGFnX0ZMVDEoSFJUSU1fVHlwZURlZiAqSFJUSU14KQoreworICBTRVRfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuSUNSLCBIUlRJTV9JQ1JfRkxUMUMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgRmF1bHQgMSBpbnRlcnJ1cHQgb2NjdXJyZWQuCisgICogQHJtdG9sbCBJQ1IgICAgIEZMVDEgICAgICAgICAgIExMX0hSVElNX0lzQWN0aXZlRmxhZ19GTFQxCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBGTFQxIGJpdCBpbiBIUlRJTV9JU1IgcmVnaXN0ZXIgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fSXNBY3RpdmVGbGFnX0ZMVDEoSFJUSU1fVHlwZURlZiAqSFJUSU14KQoreworICByZXR1cm4gKFJFQURfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuSVNSLCBIUlRJTV9JU1JfRkxUMSkgPT0gKEhSVElNX0lTUl9GTFQxKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIEZhdWx0IDIgaW50ZXJydXB0IGZsYWcuCisgICogQHJtdG9sbCBJQ1IgICAgIEZMVDJDICAgICAgICAgICBMTF9IUlRJTV9DbGVhckZsYWdfRkxUMgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fQ2xlYXJGbGFnX0ZMVDIoSFJUSU1fVHlwZURlZiAqSFJUSU14KQoreworICBTRVRfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuSUNSLCBIUlRJTV9JQ1JfRkxUMkMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgRmF1bHQgMiBpbnRlcnJ1cHQgb2NjdXJyZWQuCisgICogQHJtdG9sbCBJQ1IgICAgIEZMVDIgICAgICAgICAgIExMX0hSVElNX0lzQWN0aXZlRmxhZ19GTFQyCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBGTFQyIGJpdCBpbiBIUlRJTV9JU1IgcmVnaXN0ZXIgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fSXNBY3RpdmVGbGFnX0ZMVDIoSFJUSU1fVHlwZURlZiAqSFJUSU14KQoreworICByZXR1cm4gKFJFQURfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuSVNSLCBIUlRJTV9JU1JfRkxUMikgPT0gKEhSVElNX0lTUl9GTFQyKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIEZhdWx0IDMgaW50ZXJydXB0IGZsYWcuCisgICogQHJtdG9sbCBJQ1IgICAgIEZMVDNDICAgICAgICAgICBMTF9IUlRJTV9DbGVhckZsYWdfRkxUMworICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fQ2xlYXJGbGFnX0ZMVDMoSFJUSU1fVHlwZURlZiAqSFJUSU14KQoreworICBTRVRfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuSUNSLCBIUlRJTV9JQ1JfRkxUM0MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgRmF1bHQgMyBpbnRlcnJ1cHQgb2NjdXJyZWQuCisgICogQHJtdG9sbCBJQ1IgICAgIEZMVDMgICAgICAgICAgIExMX0hSVElNX0lzQWN0aXZlRmxhZ19GTFQzCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBGTFQzIGJpdCBpbiBIUlRJTV9JU1IgcmVnaXN0ZXIgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fSXNBY3RpdmVGbGFnX0ZMVDMoSFJUSU1fVHlwZURlZiAqSFJUSU14KQoreworICByZXR1cm4gKFJFQURfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuSVNSLCBIUlRJTV9JU1JfRkxUMykgPT0gKEhSVElNX0lTUl9GTFQzKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIEZhdWx0IDQgaW50ZXJydXB0IGZsYWcuCisgICogQHJtdG9sbCBJQ1IgICAgIEZMVDRDICAgICAgICAgICBMTF9IUlRJTV9DbGVhckZsYWdfRkxUNAorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fQ2xlYXJGbGFnX0ZMVDQoSFJUSU1fVHlwZURlZiAqSFJUSU14KQoreworICBTRVRfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuSUNSLCBIUlRJTV9JQ1JfRkxUNEMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgRmF1bHQgNCBpbnRlcnJ1cHQgb2NjdXJyZWQuCisgICogQHJtdG9sbCBJQ1IgICAgIEZMVDQgICAgICAgICAgIExMX0hSVElNX0lzQWN0aXZlRmxhZ19GTFQ0CisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBGTFQ0IGJpdCBpbiBIUlRJTV9JU1IgcmVnaXN0ZXIgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fSXNBY3RpdmVGbGFnX0ZMVDQoSFJUSU1fVHlwZURlZiAqSFJUSU14KQoreworICByZXR1cm4gKFJFQURfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuSVNSLCBIUlRJTV9JU1JfRkxUNCkgPT0gKEhSVElNX0lTUl9GTFQ0KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIEZhdWx0IDUgaW50ZXJydXB0IGZsYWcuCisgICogQHJtdG9sbCBJQ1IgICAgIEZMVDVDICAgICAgICAgICBMTF9IUlRJTV9DbGVhckZsYWdfRkxUNQorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fQ2xlYXJGbGFnX0ZMVDUoSFJUSU1fVHlwZURlZiAqSFJUSU14KQoreworICBTRVRfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuSUNSLCBIUlRJTV9JQ1JfRkxUNUMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgRmF1bHQgNSBpbnRlcnJ1cHQgb2NjdXJyZWQuCisgICogQHJtdG9sbCBJQ1IgICAgIEZMVDUgICAgICAgICAgIExMX0hSVElNX0lzQWN0aXZlRmxhZ19GTFQ1CisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBGTFQ1IGJpdCBpbiBIUlRJTV9JU1IgcmVnaXN0ZXIgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fSXNBY3RpdmVGbGFnX0ZMVDUoSFJUSU1fVHlwZURlZiAqSFJUSU14KQoreworICByZXR1cm4gKFJFQURfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuSVNSLCBIUlRJTV9JU1JfRkxUNSkgPT0gKEhSVElNX0lTUl9GTFQ1KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIFN5c3RlbSBGYXVsdCBpbnRlcnJ1cHQgZmxhZy4KKyAgKiBAcm10b2xsIElDUiAgICAgU1lTRkxUQyAgICAgICAgICAgTExfSFJUSU1fQ2xlYXJGbGFnX1NZU0ZMVAorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fQ2xlYXJGbGFnX1NZU0ZMVChIUlRJTV9UeXBlRGVmICpIUlRJTXgpCit7CisgIFNFVF9CSVQoSFJUSU14LT5zQ29tbW9uUmVncy5JQ1IsIEhSVElNX0lDUl9TWVNGTFRDKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIFN5c3RlbSBGYXVsdCBpbnRlcnJ1cHQgb2NjdXJyZWQuCisgICogQHJtdG9sbCBJU1IgICAgIFNZU0ZMVCAgICAgICAgICAgTExfSFJUSU1fSXNBY3RpdmVGbGFnX1NZU0ZMVAorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgU1lTRkxUIGJpdCBpbiBIUlRJTV9JU1IgcmVnaXN0ZXIgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fSXNBY3RpdmVGbGFnX1NZU0ZMVChIUlRJTV9UeXBlRGVmICpIUlRJTXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoSFJUSU14LT5zQ29tbW9uUmVncy5JU1IsIEhSVElNX0lTUl9TWVNGTFQpID09IChIUlRJTV9JU1JfU1lTRkxUKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIERMTCByZWFkeSBpbnRlcnJ1cHQgZmxhZy4KKyAgKiBAcm10b2xsIElDUiAgICAgRExMUkRZQyAgICAgICAgICAgTExfSFJUSU1fQ2xlYXJGbGFnX0RMTFJEWQorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fQ2xlYXJGbGFnX0RMTFJEWShIUlRJTV9UeXBlRGVmICpIUlRJTXgpCit7CisgIFNFVF9CSVQoSFJUSU14LT5zQ29tbW9uUmVncy5JQ1IsIEhSVElNX0lDUl9ETExSRFlDKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIERMTCByZWFkeSAgaW50ZXJydXB0IG9jY3VycmVkLgorICAqIEBybXRvbGwgSVNSICAgICBETExSRFkgICAgICAgICAgIExMX0hSVElNX0lzQWN0aXZlRmxhZ19ETExSRFkKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIERMTFJEWSBiaXQgaW4gSFJUSU1fSVNSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0lzQWN0aXZlRmxhZ19ETExSRFkoSFJUSU1fVHlwZURlZiAqSFJUSU14KQoreworICByZXR1cm4gKFJFQURfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuSVNSLCBIUlRJTV9JU1JfRExMUkRZKSA9PSAoSFJUSU1fSVNSX0RMTFJEWSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBCdXJzdCBNb2RlIHBlcmlvZCBpbnRlcnJ1cHQgZmxhZy4KKyAgKiBAcm10b2xsIElDUiAgICAgQk1QRVJDICAgICAgICAgICBMTF9IUlRJTV9DbGVhckZsYWdfQk1QRVIKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0NsZWFyRmxhZ19CTVBFUihIUlRJTV9UeXBlRGVmICpIUlRJTXgpCit7CisgIFNFVF9CSVQoSFJUSU14LT5zQ29tbW9uUmVncy5JQ1IsIEhSVElNX0lDUl9CTVBFUkMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgQnVyc3QgTW9kZSBwZXJpb2QgaW50ZXJydXB0IG9jY3VycmVkLgorICAqIEBybXRvbGwgSVNSICAgICBCTVBFUiAgICAgICAgICAgTExfSFJUSU1fSXNBY3RpdmVGbGFnX0JNUEVSCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBCTVBFUiBiaXQgaW4gSFJUSU1fSVNSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0lzQWN0aXZlRmxhZ19CTVBFUihIUlRJTV9UeXBlRGVmICpIUlRJTXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoSFJUSU14LT5zQ29tbW9uUmVncy5JU1IsIEhSVElNX0lTUl9CTVBFUikgPT0gKEhSVElNX0lTUl9CTVBFUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBTeW5jaHJvbml6YXRpb24gSW5wdXQgaW50ZXJydXB0IGZsYWcuCisgICogQHJtdG9sbCBNSUNSICAgICBTWU5DQyAgICAgICAgICAgTExfSFJUSU1fQ2xlYXJGbGFnX1NZTkMKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0NsZWFyRmxhZ19TWU5DKEhSVElNX1R5cGVEZWYgKkhSVElNeCkKK3sKKyAgU0VUX0JJVChIUlRJTXgtPnNNYXN0ZXJSZWdzLk1JQ1IsIEhSVElNX01JQ1JfU1lOQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciB0aGUgU3luY2hyb25pemF0aW9uIElucHV0IGludGVycnVwdCBvY2N1cnJlZC4KKyAgKiBAcm10b2xsIE1JU1IgICAgIFNZTkMgICAgICAgICAgIExMX0hSVElNX0lzQWN0aXZlRmxhZ19TWU5DCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBTWU5DIGJpdCBpbiBIUlRJTV9NSVNSIHJlZ2lzdGVyICAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9Jc0FjdGl2ZUZsYWdfU1lOQyhIUlRJTV9UeXBlRGVmICpIUlRJTXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoSFJUSU14LT5zTWFzdGVyUmVncy5NSVNSLCBIUlRJTV9NSVNSX1NZTkMpID09IChIUlRJTV9NSVNSX1NZTkMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgdXBkYXRlIGludGVycnVwdCBmbGFnIGZvciBhIGdpdmVuIHRpbWVyIChpbmNsdWRpbmcgdGhlIG1hc3RlciB0aW1lcikgLgorICAqIEBybXRvbGwgTUlDUiAgICAgICAgTVVQREMgICAgICAgICAgTExfSFJUSU1fQ2xlYXJGbGFnX1VQREFURVxuCisgICogICAgICAgICBUSU14SUNSICAgICBVUERDICAgICAgICAgICBMTF9IUlRJTV9DbGVhckZsYWdfVVBEQVRFCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9DbGVhckZsYWdfVVBEQVRFKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NSUNSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBTRVRfQklUKCpwUmVnLCBIUlRJTV9NSUNSX01VUEQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdGhlIHVwZGF0ZSBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIGZvciBhIGdpdmVuIHRpbWVyIChpbmNsdWRpbmcgdGhlIG1hc3RlciB0aW1lcikgLgorICAqIEBybXRvbGwgTUlTUiAgICAgICAgTVVQRCAgICAgICAgICBMTF9IUlRJTV9Jc0FjdGl2ZUZsYWdfVVBEQVRFXG4KKyAgKiAgICAgICAgIFRJTXhJU1IgICAgIFVQRCAgICAgICAgICAgTExfSFJUSU1fSXNBY3RpdmVGbGFnX1VQREFURQorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgU3RhdGUgb2YgTVVQRC9VUEQgYml0IGluIEhSVElNX01JU1IvSFJUSU1fVElNeElTUiByZWdpc3RlciAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9Jc0FjdGl2ZUZsYWdfVVBEQVRFKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NSVNSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9NSVNSX01VUEQpID09IChIUlRJTV9NSVNSX01VUEQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgcmVwZXRpdGlvbiBpbnRlcnJ1cHQgZmxhZyBmb3IgYSBnaXZlbiB0aW1lciAoaW5jbHVkaW5nIHRoZSBtYXN0ZXIgdGltZXIpIC4KKyAgKiBAcm10b2xsIE1JQ1IgICAgICAgIE1SRVBDICAgICAgICAgIExMX0hSVElNX0NsZWFyRmxhZ19SRVBcbgorICAqICAgICAgICAgVElNeElDUiAgICAgUkVQQyAgICAgICAgICAgTExfSFJUSU1fQ2xlYXJGbGFnX1JFUAorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fQ2xlYXJGbGFnX1JFUChIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTUlDUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgU0VUX0JJVCgqcFJlZywgSFJUSU1fTUlDUl9NUkVQKTsKKworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdGhlIHJlcGV0aXRpb24gIGludGVycnVwdCBoYXMgb2NjdXJyZWQgZm9yIGEgZ2l2ZW4gdGltZXIgKGluY2x1ZGluZyB0aGUgbWFzdGVyIHRpbWVyKSAuCisgICogQHJtdG9sbCBNSVNSICAgICAgICBNUkVQICAgICAgICAgIExMX0hSVElNX0lzQWN0aXZlRmxhZ19SRVBcbgorICAqICAgICAgICAgVElNeElTUiAgICAgUkVQICAgICAgICAgICBMTF9IUlRJTV9Jc0FjdGl2ZUZsYWdfUkVQCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBTdGF0ZSBvZiBNUkVQL1JFUCBiaXQgaW4gSFJUSU1fTUlTUi9IUlRJTV9USU14SVNSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0lzQWN0aXZlRmxhZ19SRVAoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1JU1IpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsIEhSVElNX01JU1JfTVJFUCkgPT0gKEhSVElNX01JU1JfTVJFUCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBjb21wYXJlIDEgbWF0Y2ggaW50ZXJydXB0IGZvciBhIGdpdmVuIHRpbWVyIChpbmNsdWRpbmcgdGhlIG1hc3RlciB0aW1lcikuCisgICogQHJtdG9sbCBNSUNSICAgICAgICBNQ01QMUMgICAgICAgICAgTExfSFJUSU1fQ2xlYXJGbGFnX0NNUDFcbgorICAqICAgICAgICAgVElNeElDUiAgICAgQ01QMUMgICAgICAgICAgIExMX0hSVElNX0NsZWFyRmxhZ19DTVAxCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9DbGVhckZsYWdfQ01QMShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTUlDUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgU0VUX0JJVCgqcFJlZywgSFJUSU1fTUlDUl9NQ01QMSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciB0aGUgY29tcGFyZSBtYXRjaCAxICBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIGZvciBhIGdpdmVuIHRpbWVyIChpbmNsdWRpbmcgdGhlIG1hc3RlciB0aW1lcikgLgorICAqIEBybXRvbGwgTUlTUiAgICAgICAgTUNNUDEgICAgICAgICAgTExfSFJUSU1fSXNBY3RpdmVGbGFnX0NNUDFcbgorICAqICAgICAgICAgVElNeElTUiAgICAgQ01QMSAgICAgICAgICAgTExfSFJUSU1fSXNBY3RpdmVGbGFnX0NNUDEKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfTUFTVEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIE1DTVAxL0NNUDEgYml0IGluIEhSVElNX01JU1IvSFJUSU1fVElNeElTUiByZWdpc3RlciAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9Jc0FjdGl2ZUZsYWdfQ01QMShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTUlTUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgSFJUSU1fTUlTUl9NQ01QMSkgPT0gKEhSVElNX01JU1JfTUNNUDEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgY29tcGFyZSAyIG1hdGNoIGludGVycnVwdCBmb3IgYSBnaXZlbiB0aW1lciAoaW5jbHVkaW5nIHRoZSBtYXN0ZXIgdGltZXIpLgorICAqIEBybXRvbGwgTUlDUiAgICAgICAgTUNNUDJDICAgICAgICAgIExMX0hSVElNX0NsZWFyRmxhZ19DTVAyXG4KKyAgKiAgICAgICAgIFRJTXhJQ1IgICAgIENNUDJDICAgICAgICAgICBMTF9IUlRJTV9DbGVhckZsYWdfQ01QMgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fQ2xlYXJGbGFnX0NNUDIoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1JQ1IpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIFNFVF9CSVQoKnBSZWcsIEhSVElNX01JQ1JfTUNNUDIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdGhlIGNvbXBhcmUgbWF0Y2ggMiAgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBmb3IgYSBnaXZlbiB0aW1lciAoaW5jbHVkaW5nIHRoZSBtYXN0ZXIgdGltZXIpIC4KKyAgKiBAcm10b2xsIE1JU1IgICAgICAgIE1DTVAyICAgICAgICAgIExMX0hSVElNX0lzQWN0aXZlRmxhZ19DTVAyXG4KKyAgKiAgICAgICAgIFRJTXhJU1IgICAgIENNUDIgICAgICAgICAgIExMX0hSVElNX0lzQWN0aXZlRmxhZ19DTVAyCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBTdGF0ZSBvZiBNQ01QMi9DTVAyIGJpdCBpbiBIUlRJTV9NSVNSL0hSVElNX1RJTXhJU1IgcmVnaXN0ZXIgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fSXNBY3RpdmVGbGFnX0NNUDIoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1JU1IpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsIEhSVElNX01JU1JfTUNNUDIpID09IChIUlRJTV9NSVNSX01DTVAyKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIGNvbXBhcmUgMyBtYXRjaCBpbnRlcnJ1cHQgZm9yIGEgZ2l2ZW4gdGltZXIgKGluY2x1ZGluZyB0aGUgbWFzdGVyIHRpbWVyKS4KKyAgKiBAcm10b2xsIE1JQ1IgICAgICAgIE1DTVAzQyAgICAgICAgICBMTF9IUlRJTV9DbGVhckZsYWdfQ01QM1xuCisgICogICAgICAgICBUSU14SUNSICAgICBDTVAzQyAgICAgICAgICAgTExfSFJUSU1fQ2xlYXJGbGFnX0NNUDMKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfTUFTVEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0NsZWFyRmxhZ19DTVAzKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NSUNSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBTRVRfQklUKCpwUmVnLCBIUlRJTV9NSUNSX01DTVAzKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBjb21wYXJlIG1hdGNoIDMgIGludGVycnVwdCBoYXMgb2NjdXJyZWQgZm9yIGEgZ2l2ZW4gdGltZXIgKGluY2x1ZGluZyB0aGUgbWFzdGVyIHRpbWVyKSAuCisgICogQHJtdG9sbCBNSVNSICAgICAgICBNQ01QMyAgICAgICAgICBMTF9IUlRJTV9Jc0FjdGl2ZUZsYWdfQ01QM1xuCisgICogICAgICAgICBUSU14SVNSICAgICBDTVAzICAgICAgICAgICBMTF9IUlRJTV9Jc0FjdGl2ZUZsYWdfQ01QMworICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgU3RhdGUgb2YgTUNNUDMvQ01QMyBiaXQgaW4gSFJUSU1fTUlTUi9IUlRJTV9USU14SVNSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0lzQWN0aXZlRmxhZ19DTVAzKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NSVNSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9NSVNSX01DTVAzKSA9PSAoSFJUSU1fTUlTUl9NQ01QMykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBjb21wYXJlIDQgbWF0Y2ggaW50ZXJydXB0IGZvciBhIGdpdmVuIHRpbWVyIChpbmNsdWRpbmcgdGhlIG1hc3RlciB0aW1lcikuCisgICogQHJtdG9sbCBNSUNSICAgICAgICBNQ01QNEMgICAgICAgICAgTExfSFJUSU1fQ2xlYXJGbGFnX0NNUDRcbgorICAqICAgICAgICAgVElNeElDUiAgICAgQ01QNEMgICAgICAgICAgIExMX0hSVElNX0NsZWFyRmxhZ19DTVA0CisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9DbGVhckZsYWdfQ01QNChIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTUlDUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgU0VUX0JJVCgqcFJlZywgSFJUSU1fTUlDUl9NQ01QNCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciB0aGUgY29tcGFyZSBtYXRjaCA0ICBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIGZvciBhIGdpdmVuIHRpbWVyIChpbmNsdWRpbmcgdGhlIG1hc3RlciB0aW1lcikgLgorICAqIEBybXRvbGwgTUlTUiAgICAgICAgTUNNUDQgICAgICAgICAgTExfSFJUSU1fSXNBY3RpdmVGbGFnX0NNUDRcbgorICAqICAgICAgICAgVElNeElTUiAgICAgQ01QNCAgICAgICAgICAgTExfSFJUSU1fSXNBY3RpdmVGbGFnX0NNUDQKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfTUFTVEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIE1DTVA0L0NNUDQgYml0IGluIEhSVElNX01JU1IvSFJUSU1fVElNeElTUiByZWdpc3RlciAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9Jc0FjdGl2ZUZsYWdfQ01QNChIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTUlTUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgSFJUSU1fTUlTUl9NQ01QNCkgPT0gKEhSVElNX01JU1JfTUNNUDQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgY2FwdHVyZSAxIGludGVycnVwdCBmbGFnIGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgVElNeElDUiAgICAgQ1BUMUMgICAgICAgICAgIExMX0hSVElNX0NsZWFyRmxhZ19DUFQxCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9DbGVhckZsYWdfQ1BUMShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTUlDUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgU0VUX0JJVCgqcFJlZywgSFJUSU1fVElNSUNSX0NQVDFDKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBjYXB0dXJlIDEgaW50ZXJydXB0IG9jY3VycmVkIGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgVElNeElTUiAgICAgQ1BUMSAgICAgICAgICAgTExfSFJUSU1fSXNBY3RpdmVGbGFnX0NQVDEKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIENQVDEgYml0IGluIEhSVElNX1RJTXhJU1IgcmVnaXN0ZXIgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fSXNBY3RpdmVGbGFnX0NQVDEoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1JU1IpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsIEhSVElNX1RJTUlTUl9DUFQxKSA9PSAoSFJUSU1fVElNSVNSX0NQVDEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgY2FwdHVyZSAyIGludGVycnVwdCBmbGFnIGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgVElNeElDUiAgICAgQ1BUMkMgICAgICAgICAgIExMX0hSVElNX0NsZWFyRmxhZ19DUFQyCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9DbGVhckZsYWdfQ1BUMihIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTUlDUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgU0VUX0JJVCgqcFJlZywgSFJUSU1fVElNSUNSX0NQVDJDKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBjYXB0dXJlIDIgaW50ZXJydXB0IG9jY3VycmVkIGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgVElNeElTUiAgICAgQ1BUMiAgICAgICAgICAgTExfSFJUSU1fSXNBY3RpdmVGbGFnX0NQVDIKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIENQVDIgYml0IGluIEhSVElNX1RJTXhJU1IgcmVnaXN0ZXIgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fSXNBY3RpdmVGbGFnX0NQVDIoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1JU1IpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsIEhSVElNX1RJTUlTUl9DUFQyKSA9PSAoSFJUSU1fVElNSVNSX0NQVDIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgb3V0cHV0IDEgc2V0IGludGVycnVwdCBmbGFnIGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgVElNeElDUiAgICAgU0VUMUMgICAgICAgICAgIExMX0hSVElNX0NsZWFyRmxhZ19TRVQxCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9DbGVhckZsYWdfU0VUMShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTUlDUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgU0VUX0JJVCgqcFJlZywgSFJUSU1fVElNSUNSX1NFVDFDKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBvdXRwdXQgMSBzZXQgaW50ZXJydXB0IG9jY3VycmVkIGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgVElNeElTUiAgICAgU0VUMSAgICAgICAgICAgTExfSFJUSU1fSXNBY3RpdmVGbGFnX1NFVDEKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIFNFVHgxIGJpdCBpbiBIUlRJTV9USU14SVNSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0lzQWN0aXZlRmxhZ19TRVQxKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NSVNSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9USU1JU1JfU0VUMSkgPT0gKEhSVElNX1RJTUlTUl9TRVQxKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIG91dHB1dCAxIHJlc2V0IGludGVycnVwdCBmbGFnIGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgVElNeElDUiAgICAgUlNUMUMgICAgICAgICAgIExMX0hSVElNX0NsZWFyRmxhZ19SU1QxCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9DbGVhckZsYWdfUlNUMShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTUlDUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgU0VUX0JJVCgqcFJlZywgSFJUSU1fVElNSUNSX1JTVDFDKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBvdXRwdXQgMSByZXNldCBpbnRlcnJ1cHQgb2NjdXJyZWQgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBUSU14SVNSICAgICBSU1QxICAgICAgICAgICBMTF9IUlRJTV9Jc0FjdGl2ZUZsYWdfUlNUMQorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgU3RhdGUgb2YgUlNUeDEgYml0IGluIEhSVElNX1RJTXhJU1IgcmVnaXN0ZXIgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fSXNBY3RpdmVGbGFnX1JTVDEoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1JU1IpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsIEhSVElNX1RJTUlTUl9SU1QxKSA9PSAoSFJUSU1fVElNSVNSX1JTVDEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgb3V0cHV0IDIgc2V0IGludGVycnVwdCBmbGFnIGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgVElNeElDUiAgICAgU0VUMkMgICAgICAgICAgIExMX0hSVElNX0NsZWFyRmxhZ19TRVQyCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9DbGVhckZsYWdfU0VUMihIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTUlDUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgU0VUX0JJVCgqcFJlZywgSFJUSU1fVElNSUNSX1NFVDJDKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBvdXRwdXQgMiBzZXQgaW50ZXJydXB0IG9jY3VycmVkIGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgVElNeElTUiAgICAgU0VUMiAgICAgICAgICAgTExfSFJUSU1fSXNBY3RpdmVGbGFnX1NFVDIKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIFNFVHgyIGJpdCBpbiBIUlRJTV9USU14SVNSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0lzQWN0aXZlRmxhZ19TRVQyKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NSVNSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9USU1JU1JfU0VUMikgPT0gKEhSVElNX1RJTUlTUl9TRVQyKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIG91dHB1dCAycmVzZXQgaW50ZXJydXB0IGZsYWcgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBUSU14SUNSICAgICBSU1QyQyAgICAgICAgICAgTExfSFJUSU1fQ2xlYXJGbGFnX1JTVDIKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0NsZWFyRmxhZ19SU1QyKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NSUNSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBTRVRfQklUKCpwUmVnLCBIUlRJTV9USU1JQ1JfUlNUMkMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdGhlIG91dHB1dCAyIHJlc2V0IGludGVycnVwdCBvY2N1cnJlZCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIFRJTXhJU1IgICAgIFJTVDIgICAgICAgICAgIExMX0hSVElNX0lzQWN0aXZlRmxhZ19SU1QyCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBTdGF0ZSBvZiBSU1R4MiBiaXQgaW4gSFJUSU1fVElNeElTUiByZWdpc3RlciAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9Jc0FjdGl2ZUZsYWdfUlNUMihIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTUlTUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgSFJUSU1fVElNSVNSX1JTVDIpID09IChIUlRJTV9USU1JU1JfUlNUMikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSByZXNldCBhbmQvb3Igcm9sbC1vdmVyIGludGVycnVwdCBmbGFnIGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgVElNeElDUiAgICAgUlNUQyAgICAgICAgICAgTExfSFJUSU1fQ2xlYXJGbGFnX1JTVAorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fQ2xlYXJGbGFnX1JTVChIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTUlDUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgU0VUX0JJVCgqcFJlZywgSFJUSU1fVElNSUNSX1JTVEMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdGhlICByZXNldCBhbmQvb3Igcm9sbC1vdmVyIGludGVycnVwdCBvY2N1cnJlZCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIFRJTXhJU1IgICAgIFJTVCAgICAgICAgICAgTExfSFJUSU1fSXNBY3RpdmVGbGFnX1JTVAorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgU3RhdGUgb2YgUlNUIGJpdCBpbiBIUlRJTV9USU14SVNSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0lzQWN0aXZlRmxhZ19SU1QoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1JU1IpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsIEhSVElNX1RJTUlTUl9SU1QpID09IChIUlRJTV9USU1JU1JfUlNUKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIGRlbGF5ZWQgcHJvdGVjdGlvbiBpbnRlcnJ1cHQgZmxhZyBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIFRJTXhJQ1IgICAgIERMWVBSVEMgICAgICAgICAgIExMX0hSVElNX0NsZWFyRmxhZ19ETFlQUlQKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0NsZWFyRmxhZ19ETFlQUlQoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1JQ1IpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIFNFVF9CSVQoKnBSZWcsIEhSVElNX1RJTUlDUl9ETFlQUlQxQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciB0aGUgIGRlbGF5ZWQgcHJvdGVjdGlvbiBpbnRlcnJ1cHQgb2NjdXJyZWQgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBUSU14SVNSICAgICBETFlQUlQgICAgICAgICAgIExMX0hSVElNX0lzQWN0aXZlRmxhZ19ETFlQUlQKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIERMWVBSVCBiaXQgaW4gSFJUSU1fVElNeElTUiByZWdpc3RlciAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9Jc0FjdGl2ZUZsYWdfRExZUFJUKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NSVNSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9USU1JU1JfRExZUFJUKSA9PSAoSFJUSU1fVElNSVNSX0RMWVBSVCkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0VGX0lUX01hbmFnZW1lbnQgSVRfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBmYXVsdCAxIGludGVycnVwdC4KKyAgKiBAcm10b2xsIElFUiAgICAgRkxUMUlFICAgICAgICAgICBMTF9IUlRJTV9FbmFibGVJVF9GTFQxCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9FbmFibGVJVF9GTFQxKEhSVElNX1R5cGVEZWYgKkhSVElNeCkKK3sKKyAgU0VUX0JJVChIUlRJTXgtPnNDb21tb25SZWdzLklFUiwgSFJUSU1fSUVSX0ZMVDEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIGZhdWx0IDEgaW50ZXJydXB0LgorICAqIEBybXRvbGwgSUVSICAgICBGTFQxSUUgICAgICAgICAgIExMX0hSVElNX0Rpc2FibGVJVF9GTFQxCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9EaXNhYmxlSVRfRkxUMShIUlRJTV9UeXBlRGVmICpIUlRJTXgpCit7CisgIENMRUFSX0JJVChIUlRJTXgtPnNDb21tb25SZWdzLklFUiwgSFJUSU1fSUVSX0ZMVDEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdGhlIGZhdWx0IDEgaW50ZXJydXB0IGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBJRVIgICAgIEZMVDFJRSAgICAgICAgICAgTExfSFJUSU1fSXNFbmFibGVkSVRfRkxUMQorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgRkxUMUlFIGJpdCBpbiBIUlRJTV9JRVIgcmVnaXN0ZXIgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fSXNFbmFibGVkSVRfRkxUMShIUlRJTV9UeXBlRGVmICpIUlRJTXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoSFJUSU14LT5zQ29tbW9uUmVncy5JRVIsIEhSVElNX0lFUl9GTFQxKSA9PSAoSFJUSU1fSUVSX0ZMVDEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIGZhdWx0IDIgaW50ZXJydXB0LgorICAqIEBybXRvbGwgSUVSICAgICBGTFQySUUgICAgICAgICAgIExMX0hSVElNX0VuYWJsZUlUX0ZMVDIKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0VuYWJsZUlUX0ZMVDIoSFJUSU1fVHlwZURlZiAqSFJUSU14KQoreworICBTRVRfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuSUVSLCBIUlRJTV9JRVJfRkxUMik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgZmF1bHQgMiBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBJRVIgICAgIEZMVDJJRSAgICAgICAgICAgTExfSFJUSU1fRGlzYWJsZUlUX0ZMVDIKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0Rpc2FibGVJVF9GTFQyKEhSVElNX1R5cGVEZWYgKkhSVElNeCkKK3sKKyAgQ0xFQVJfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuSUVSLCBIUlRJTV9JRVJfRkxUMik7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciB0aGUgZmF1bHQgMiBpbnRlcnJ1cHQgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIElFUiAgICAgRkxUMklFICAgICAgICAgICBMTF9IUlRJTV9Jc0VuYWJsZWRJVF9GTFQyCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBGTFQySUUgYml0IGluIEhSVElNX0lFUiByZWdpc3RlciAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9Jc0VuYWJsZWRJVF9GTFQyKEhSVElNX1R5cGVEZWYgKkhSVElNeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChIUlRJTXgtPnNDb21tb25SZWdzLklFUiwgSFJUSU1fSUVSX0ZMVDIpID09IChIUlRJTV9JRVJfRkxUMikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgZmF1bHQgMyBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBJRVIgICAgIEZMVDNJRSAgICAgICAgICAgTExfSFJUSU1fRW5hYmxlSVRfRkxUMworICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRW5hYmxlSVRfRkxUMyhIUlRJTV9UeXBlRGVmICpIUlRJTXgpCit7CisgIFNFVF9CSVQoSFJUSU14LT5zQ29tbW9uUmVncy5JRVIsIEhSVElNX0lFUl9GTFQzKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBmYXVsdCAzIGludGVycnVwdC4KKyAgKiBAcm10b2xsIElFUiAgICAgRkxUM0lFICAgICAgICAgICBMTF9IUlRJTV9EaXNhYmxlSVRfRkxUMworICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRGlzYWJsZUlUX0ZMVDMoSFJUSU1fVHlwZURlZiAqSFJUSU14KQoreworICBDTEVBUl9CSVQoSFJUSU14LT5zQ29tbW9uUmVncy5JRVIsIEhSVElNX0lFUl9GTFQzKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBmYXVsdCAzIGludGVycnVwdCBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgSUVSICAgICBGTFQzSUUgICAgICAgICAgIExMX0hSVElNX0lzRW5hYmxlZElUX0ZMVDMKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIEZMVDNJRSBiaXQgaW4gSFJUSU1fSUVSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0lzRW5hYmxlZElUX0ZMVDMoSFJUSU1fVHlwZURlZiAqSFJUSU14KQoreworICByZXR1cm4gKFJFQURfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuSUVSLCBIUlRJTV9JRVJfRkxUMykgPT0gKEhSVElNX0lFUl9GTFQzKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBmYXVsdCA0IGludGVycnVwdC4KKyAgKiBAcm10b2xsIElFUiAgICAgRkxUNElFICAgICAgICAgICBMTF9IUlRJTV9FbmFibGVJVF9GTFQ0CisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9FbmFibGVJVF9GTFQ0KEhSVElNX1R5cGVEZWYgKkhSVElNeCkKK3sKKyAgU0VUX0JJVChIUlRJTXgtPnNDb21tb25SZWdzLklFUiwgSFJUSU1fSUVSX0ZMVDQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIGZhdWx0IDQgaW50ZXJydXB0LgorICAqIEBybXRvbGwgSUVSICAgICBGTFQ0SUUgICAgICAgICAgIExMX0hSVElNX0Rpc2FibGVJVF9GTFQ0CisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9EaXNhYmxlSVRfRkxUNChIUlRJTV9UeXBlRGVmICpIUlRJTXgpCit7CisgIENMRUFSX0JJVChIUlRJTXgtPnNDb21tb25SZWdzLklFUiwgSFJUSU1fSUVSX0ZMVDQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdGhlIGZhdWx0IDQgaW50ZXJydXB0IGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBJRVIgICAgIEZMVDRJRSAgICAgICAgICAgTExfSFJUSU1fSXNFbmFibGVkSVRfRkxUNAorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgRkxUNElFIGJpdCBpbiBIUlRJTV9JRVIgcmVnaXN0ZXIgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fSXNFbmFibGVkSVRfRkxUNChIUlRJTV9UeXBlRGVmICpIUlRJTXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoSFJUSU14LT5zQ29tbW9uUmVncy5JRVIsIEhSVElNX0lFUl9GTFQ0KSA9PSAoSFJUSU1fSUVSX0ZMVDQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIGZhdWx0IDUgaW50ZXJydXB0LgorICAqIEBybXRvbGwgSUVSICAgICBGTFQ1SUUgICAgICAgICAgIExMX0hSVElNX0VuYWJsZUlUX0ZMVDUKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0VuYWJsZUlUX0ZMVDUoSFJUSU1fVHlwZURlZiAqSFJUSU14KQoreworICBTRVRfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuSUVSLCBIUlRJTV9JRVJfRkxUNSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgZmF1bHQgNSBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBJRVIgICAgIEZMVDVJRSAgICAgICAgICAgTExfSFJUSU1fRGlzYWJsZUlUX0ZMVDUKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0Rpc2FibGVJVF9GTFQ1KEhSVElNX1R5cGVEZWYgKkhSVElNeCkKK3sKKyAgQ0xFQVJfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuSUVSLCBIUlRJTV9JRVJfRkxUNSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciB0aGUgZmF1bHQgNSBpbnRlcnJ1cHQgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIElFUiAgICAgRkxUNUlFICAgICAgICAgICBMTF9IUlRJTV9Jc0VuYWJsZWRJVF9GTFQ1CisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBGTFQ1SUUgYml0IGluIEhSVElNX0lFUiByZWdpc3RlciAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9Jc0VuYWJsZWRJVF9GTFQ1KEhSVElNX1R5cGVEZWYgKkhSVElNeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChIUlRJTXgtPnNDb21tb25SZWdzLklFUiwgSFJUSU1fSUVSX0ZMVDUpID09IChIUlRJTV9JRVJfRkxUNSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3lzdGVtIGZhdWx0IGludGVycnVwdC4KKyAgKiBAcm10b2xsIElFUiAgICAgU1lTRkxUSUUgICAgICAgICAgIExMX0hSVElNX0VuYWJsZUlUX1NZU0ZMVAorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRW5hYmxlSVRfU1lTRkxUKEhSVElNX1R5cGVEZWYgKkhSVElNeCkKK3sKKyAgU0VUX0JJVChIUlRJTXgtPnNDb21tb25SZWdzLklFUiwgSFJUSU1fSUVSX1NZU0ZMVCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgc3lzdGVtIGZhdWx0IGludGVycnVwdC4KKyAgKiBAcm10b2xsIElFUiAgICAgU1lTRkxUSUUgICAgICAgICAgIExMX0hSVElNX0Rpc2FibGVJVF9TWVNGTFQKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0Rpc2FibGVJVF9TWVNGTFQoSFJUSU1fVHlwZURlZiAqSFJUSU14KQoreworICBDTEVBUl9CSVQoSFJUSU14LT5zQ29tbW9uUmVncy5JRVIsIEhSVElNX0lFUl9TWVNGTFQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdGhlIHN5c3RlbSBmYXVsdCBpbnRlcnJ1cHQgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIElFUiAgICAgU1lTRkxUSUUgICAgICAgICAgIExMX0hSVElNX0lzRW5hYmxlZElUX1NZU0ZMVAorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgU1lTRkxUSUUgYml0IGluIEhSVElNX0lFUiByZWdpc3RlciAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9Jc0VuYWJsZWRJVF9TWVNGTFQoSFJUSU1fVHlwZURlZiAqSFJUSU14KQoreworICByZXR1cm4gKFJFQURfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuSUVSLCBIUlRJTV9JRVJfU1lTRkxUKSA9PSAoSFJUSU1fSUVSX1NZU0ZMVCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgRExMIHJlYWR5IGludGVycnVwdC4KKyAgKiBAcm10b2xsIElFUiAgICAgRExMUkRZSUUgICAgICAgICAgIExMX0hSVElNX0VuYWJsZUlUX0RMTFJEWQorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRW5hYmxlSVRfRExMUkRZKEhSVElNX1R5cGVEZWYgKkhSVElNeCkKK3sKKyAgU0VUX0JJVChIUlRJTXgtPnNDb21tb25SZWdzLklFUiwgSFJUSU1fSUVSX0RMTFJEWSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgRExMIHJlYWR5IGludGVycnVwdC4KKyAgKiBAcm10b2xsIElFUiAgICAgRExMUkRZSUUgICAgICAgICAgIExMX0hSVElNX0Rpc2FibGVJVF9ETExSRFkKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0Rpc2FibGVJVF9ETExSRFkoSFJUSU1fVHlwZURlZiAqSFJUSU14KQoreworICBDTEVBUl9CSVQoSFJUSU14LT5zQ29tbW9uUmVncy5JRVIsIEhSVElNX0lFUl9ETExSRFkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdGhlIERMTCByZWFkeSBpbnRlcnJ1cHQgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIElFUiAgICAgRExMUkRZSUUgICAgICAgICAgIExMX0hSVElNX0lzRW5hYmxlZElUX0RMTFJEWQorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgRExMUkRZSUUgYml0IGluIEhSVElNX0lFUiByZWdpc3RlciAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9Jc0VuYWJsZWRJVF9ETExSRFkoSFJUSU1fVHlwZURlZiAqSFJUSU14KQoreworICByZXR1cm4gKFJFQURfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuSUVSLCBIUlRJTV9JRVJfRExMUkRZKSA9PSAoSFJUSU1fSUVSX0RMTFJEWSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgYnVyc3QgbW9kZSBwZXJpb2QgaW50ZXJydXB0LgorICAqIEBybXRvbGwgSUVSICAgICBCTVBFUklFICAgICAgICAgICBMTF9IUlRJTV9FbmFibGVJVF9CTVBFUgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRW5hYmxlSVRfQk1QRVIoSFJUSU1fVHlwZURlZiAqSFJUSU14KQoreworICBTRVRfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuSUVSLCBIUlRJTV9JRVJfQk1QRVIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIGJ1cnN0IG1vZGUgcGVyaW9kIGludGVycnVwdC4KKyAgKiBAcm10b2xsIElFUiAgICAgQk1QRVJJRSAgICAgICAgICAgTExfSFJUSU1fRGlzYWJsZUlUX0JNUEVSCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9EaXNhYmxlSVRfQk1QRVIoSFJUSU1fVHlwZURlZiAqSFJUSU14KQoreworICBDTEVBUl9CSVQoSFJUSU14LT5zQ29tbW9uUmVncy5JRVIsIEhSVElNX0lFUl9CTVBFUik7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciB0aGUgYnVyc3QgbW9kZSBwZXJpb2QgaW50ZXJydXB0IGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBJRVIgICAgIEJNUEVSSUUgICAgICAgICAgIExMX0hSVElNX0lzRW5hYmxlZElUX0JNUEVSCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBCTVBFUklFIGJpdCBpbiBIUlRJTV9JRVIgcmVnaXN0ZXIgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fSXNFbmFibGVkSVRfQk1QRVIoSFJUSU1fVHlwZURlZiAqSFJUSU14KQoreworICByZXR1cm4gKFJFQURfQklUKEhSVElNeC0+c0NvbW1vblJlZ3MuSUVSLCBIUlRJTV9JRVJfQk1QRVIpID09IChIUlRJTV9JRVJfQk1QRVIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIHN5bmNocm9uaXphdGlvbiBpbnB1dCBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBNRElFUiAgICAgU1lOQ0lFICAgICAgICAgICBMTF9IUlRJTV9FbmFibGVJVF9TWU5DCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9FbmFibGVJVF9TWU5DKEhSVElNX1R5cGVEZWYgKkhSVElNeCkKK3sKKyAgU0VUX0JJVChIUlRJTXgtPnNNYXN0ZXJSZWdzLk1ESUVSLCBIUlRJTV9NRElFUl9TWU5DSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIHN5bmNocm9uaXphdGlvbiBpbnB1dCBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBNRElFUiAgICAgU1lOQ0lFICAgICAgICAgICBMTF9IUlRJTV9EaXNhYmxlSVRfU1lOQworICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRGlzYWJsZUlUX1NZTkMoSFJUSU1fVHlwZURlZiAqSFJUSU14KQoreworICBDTEVBUl9CSVQoSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUiwgSFJUSU1fTURJRVJfU1lOQ0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBzeW5jaHJvbml6YXRpb24gaW5wdXQgaW50ZXJydXB0IGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBNRElFUiAgICAgU1lOQ0lFICAgICAgICAgICBMTF9IUlRJTV9Jc0VuYWJsZWRJVF9TWU5DCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBTWU5DSUUgYml0IGluIEhSVElNX01ESUVSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0lzRW5hYmxlZElUX1NZTkMoSFJUSU1fVHlwZURlZiAqSFJUSU14KQoreworICByZXR1cm4gKFJFQURfQklUKEhSVElNeC0+c01hc3RlclJlZ3MuTURJRVIsIEhSVElNX01ESUVSX1NZTkNJRSkgPT0gKEhSVElNX01ESUVSX1NZTkNJRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgdXBkYXRlIGludGVycnVwdCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIE1ESUVSICAgICAgICBNVVBESUUgICAgICAgICAgIExMX0hSVElNX0VuYWJsZUlUX1VQREFURVxuCisgICogICAgICAgICBUSU14RElFUiAgICAgVVBESUUgICAgICAgICAgICBMTF9IUlRJTV9FbmFibGVJVF9VUERBVEUKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfTUFTVEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0VuYWJsZUlUX1VQREFURShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTURJRVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIFNFVF9CSVQoKnBSZWcsIEhSVElNX01ESUVSX01VUERJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgdXBkYXRlIGludGVycnVwdCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIE1ESUVSICAgICAgICBNVVBESUUgICAgICAgICAgIExMX0hSVElNX0Rpc2FibGVJVF9VUERBVEVcbgorICAqICAgICAgICAgVElNeERJRVIgICAgIFVQRElFICAgICAgICAgICAgTExfSFJUSU1fRGlzYWJsZUlUX1VQREFURQorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRGlzYWJsZUlUX1VQREFURShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTURJRVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIENMRUFSX0JJVCgqcFJlZywgSFJUSU1fTURJRVJfTVVQRElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSB1cGRhdGUgaW50ZXJydXB0IGlzIGVuYWJsZWQgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBNRElFUiAgICAgICAgTVVQRElFICAgICAgICAgICBMTF9IUlRJTV9Jc0VuYWJsZWRJVF9VUERBVEVcbgorICAqICAgICAgICAgVElNeERJRVIgICAgIFVQRElFICAgICAgICAgICAgTExfSFJUSU1fSXNFbmFibGVkSVRfVVBEQVRFCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBTdGF0ZSBvZiBNVVBESUUvVVBESUUgYml0IGluIEhSVElNX01ESUVSL0hSVElNX1RJTXhESUVSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0lzRW5hYmxlZElUX1VQREFURShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTURJRVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsIEhSVElNX01ESUVSX01VUERJRSkgPT0gKEhSVElNX01ESUVSX01VUERJRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgcmVwZXRpdGlvbiBpbnRlcnJ1cHQgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBNRElFUiAgICAgICAgTVJFUElFICAgICAgICAgICBMTF9IUlRJTV9FbmFibGVJVF9SRVBcbgorICAqICAgICAgICAgVElNeERJRVIgICAgIFJFUElFICAgICAgICAgICAgTExfSFJUSU1fRW5hYmxlSVRfUkVQCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9FbmFibGVJVF9SRVAoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1ESUVSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBTRVRfQklUKCpwUmVnLCBIUlRJTV9NRElFUl9NUkVQSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIHJlcGV0aXRpb24gaW50ZXJydXB0IGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgTURJRVIgICAgICAgIE1SRVBJRSAgICAgICAgICAgTExfSFJUSU1fRGlzYWJsZUlUX1JFUFxuCisgICogICAgICAgICBUSU14RElFUiAgICAgUkVQSUUgICAgICAgICAgICBMTF9IUlRJTV9EaXNhYmxlSVRfUkVQCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9EaXNhYmxlSVRfUkVQKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgQ0xFQVJfQklUKCpwUmVnLCBIUlRJTV9NRElFUl9NUkVQSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdGhlIHJlcGV0aXRpb24gaW50ZXJydXB0IGlzIGVuYWJsZWQgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBNRElFUiAgICAgICAgTVJFUElFICAgICAgICAgICBMTF9IUlRJTV9Jc0VuYWJsZWRJVF9SRVBcbgorICAqICAgICAgICAgVElNeERJRVIgICAgIFJFUElFICAgICAgICAgICAgTExfSFJUSU1fSXNFbmFibGVkSVRfUkVQCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBTdGF0ZSBvZiBNUkVQSUUvUkVQSUUgYml0IGluIEhSVElNX01ESUVSL0hSVElNX1RJTXhESUVSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0lzRW5hYmxlZElUX1JFUChIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTURJRVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsIEhSVElNX01ESUVSX01SRVBJRSkgPT0gKEhSVElNX01ESUVSX01SRVBJRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgY29tcGFyZSAxIGludGVycnVwdCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIE1ESUVSICAgICAgICBNQ01QMUlFICAgICAgICAgICBMTF9IUlRJTV9FbmFibGVJVF9DTVAxXG4KKyAgKiAgICAgICAgIFRJTXhESUVSICAgICBDTVAxSUUgICAgICAgICAgICBMTF9IUlRJTV9FbmFibGVJVF9DTVAxCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9FbmFibGVJVF9DTVAxKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgU0VUX0JJVCgqcFJlZywgSFJUSU1fTURJRVJfTUNNUDFJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgY29tcGFyZSAxIGludGVycnVwdCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIE1ESUVSICAgICAgICBNQ01QMUlFICAgICAgICAgICBMTF9IUlRJTV9EaXNhYmxlSVRfQ01QMVxuCisgICogICAgICAgICBUSU14RElFUiAgICAgQ01QMUlFICAgICAgICAgICAgTExfSFJUSU1fRGlzYWJsZUlUX0NNUDEKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfTUFTVEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0Rpc2FibGVJVF9DTVAxKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgQ0xFQVJfQklUKCpwUmVnLCBIUlRJTV9NRElFUl9NQ01QMUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBjb21wYXJlIDEgaW50ZXJydXB0IGlzIGVuYWJsZWQgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBNRElFUiAgICAgICAgTUNNUDFJRSAgICAgICAgICAgTExfSFJUSU1fSXNFbmFibGVkSVRfQ01QMVxuCisgICogICAgICAgICBUSU14RElFUiAgICAgQ01QMUlFICAgICAgICAgICAgTExfSFJUSU1fSXNFbmFibGVkSVRfQ01QMQorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgU3RhdGUgb2YgTUNNUDFJRS9DTVAxSUUgYml0IGluIEhSVElNX01ESUVSL0hSVElNX1RJTXhESUVSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0lzRW5hYmxlZElUX0NNUDEoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1ESUVSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9NRElFUl9NQ01QMUlFKSA9PSAoSFJUSU1fTURJRVJfTUNNUDFJRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgY29tcGFyZSAyIGludGVycnVwdCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIE1ESUVSICAgICAgICBNQ01QMklFICAgICAgICAgICBMTF9IUlRJTV9FbmFibGVJVF9DTVAyXG4KKyAgKiAgICAgICAgIFRJTXhESUVSICAgICBDTVAySUUgICAgICAgICAgICBMTF9IUlRJTV9FbmFibGVJVF9DTVAyCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9FbmFibGVJVF9DTVAyKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgU0VUX0JJVCgqcFJlZywgSFJUSU1fTURJRVJfTUNNUDJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgY29tcGFyZSAyIGludGVycnVwdCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIE1ESUVSICAgICAgICBNQ01QMklFICAgICAgICAgICBMTF9IUlRJTV9EaXNhYmxlSVRfQ01QMlxuCisgICogICAgICAgICBUSU14RElFUiAgICAgQ01QMklFICAgICAgICAgICAgTExfSFJUSU1fRGlzYWJsZUlUX0NNUDIKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfTUFTVEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0Rpc2FibGVJVF9DTVAyKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgQ0xFQVJfQklUKCpwUmVnLCBIUlRJTV9NRElFUl9NQ01QMklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBjb21wYXJlIDIgaW50ZXJydXB0IGlzIGVuYWJsZWQgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBNRElFUiAgICAgICAgTUNNUDJJRSAgICAgICAgICAgTExfSFJUSU1fSXNFbmFibGVkSVRfQ01QMlxuCisgICogICAgICAgICBUSU14RElFUiAgICAgQ01QMklFICAgICAgICAgICAgTExfSFJUSU1fSXNFbmFibGVkSVRfQ01QMgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgU3RhdGUgb2YgTUNNUDJJRS9DTVAySUUgYml0IGluIEhSVElNX01ESUVSL0hSVElNX1RJTXhESUVSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0lzRW5hYmxlZElUX0NNUDIoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1ESUVSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9NRElFUl9NQ01QMklFKSA9PSAoSFJUSU1fTURJRVJfTUNNUDJJRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgY29tcGFyZSAzIGludGVycnVwdCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIE1ESUVSICAgICAgICBNQ01QM0lFICAgICAgICAgICBMTF9IUlRJTV9FbmFibGVJVF9DTVAzXG4KKyAgKiAgICAgICAgIFRJTXhESUVSICAgICBDTVAzSUUgICAgICAgICAgICBMTF9IUlRJTV9FbmFibGVJVF9DTVAzCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9FbmFibGVJVF9DTVAzKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgU0VUX0JJVCgqcFJlZywgSFJUSU1fTURJRVJfTUNNUDNJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgY29tcGFyZSAzIGludGVycnVwdCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIE1ESUVSICAgICAgICBNQ01QM0lFICAgICAgICAgICBMTF9IUlRJTV9EaXNhYmxlSVRfQ01QM1xuCisgICogICAgICAgICBUSU14RElFUiAgICAgQ01QM0lFICAgICAgICAgICAgTExfSFJUSU1fRGlzYWJsZUlUX0NNUDMKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfTUFTVEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0Rpc2FibGVJVF9DTVAzKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgQ0xFQVJfQklUKCpwUmVnLCBIUlRJTV9NRElFUl9NQ01QM0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBjb21wYXJlIDMgaW50ZXJydXB0IGlzIGVuYWJsZWQgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBNRElFUiAgICAgICAgTUNNUDNJRSAgICAgICAgICAgTExfSFJUSU1fSXNFbmFibGVkSVRfQ01QM1xuCisgICogICAgICAgICBUSU14RElFUiAgICAgQ01QM0lFICAgICAgICAgICAgTExfSFJUSU1fSXNFbmFibGVkSVRfQ01QMworICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgU3RhdGUgb2YgTUNNUDNJRS9DTVAzSUUgYml0IGluIEhSVElNX01ESUVSL0hSVElNX1RJTXhESUVSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0lzRW5hYmxlZElUX0NNUDMoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1ESUVSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9NRElFUl9NQ01QM0lFKSA9PSAoSFJUSU1fTURJRVJfTUNNUDNJRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgY29tcGFyZSA0IGludGVycnVwdCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIE1ESUVSICAgICAgICBNQ01QNElFICAgICAgICAgICBMTF9IUlRJTV9FbmFibGVJVF9DTVA0XG4KKyAgKiAgICAgICAgIFRJTXhESUVSICAgICBDTVA0SUUgICAgICAgICAgICBMTF9IUlRJTV9FbmFibGVJVF9DTVA0CisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9FbmFibGVJVF9DTVA0KEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgU0VUX0JJVCgqcFJlZywgSFJUSU1fTURJRVJfTUNNUDRJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgY29tcGFyZSA0IGludGVycnVwdCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIE1ESUVSICAgICAgICBNQ01QNElFICAgICAgICAgICBMTF9IUlRJTV9EaXNhYmxlSVRfQ01QNFxuCisgICogICAgICAgICBUSU14RElFUiAgICAgQ01QNElFICAgICAgICAgICAgTExfSFJUSU1fRGlzYWJsZUlUX0NNUDQKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfTUFTVEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0Rpc2FibGVJVF9DTVA0KEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgQ0xFQVJfQklUKCpwUmVnLCBIUlRJTV9NRElFUl9NQ01QNElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBjb21wYXJlIDQgaW50ZXJydXB0IGlzIGVuYWJsZWQgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBNRElFUiAgICAgICAgTUNNUDRJRSAgICAgICAgICAgTExfSFJUSU1fSXNFbmFibGVkSVRfQ01QNFxuCisgICogICAgICAgICBUSU14RElFUiAgICAgQ01QNElFICAgICAgICAgICAgTExfSFJUSU1fSXNFbmFibGVkSVRfQ01QNAorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgU3RhdGUgb2YgTUNNUDRJRS9DTVA0SUUgYml0IGluIEhSVElNX01ESUVSL0hSVElNX1RJTXhESUVSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0lzRW5hYmxlZElUX0NNUDQoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1ESUVSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9NRElFUl9NQ01QNElFKSA9PSAoSFJUSU1fTURJRVJfTUNNUDRJRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgY2FwdHVyZSAxIGludGVycnVwdCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIFRJTXhESUVSICAgICBDUFQxSUUgICAgICAgICAgICBMTF9IUlRJTV9FbmFibGVJVF9DUFQxCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9FbmFibGVJVF9DUFQxKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgU0VUX0JJVCgqcFJlZywgSFJUSU1fVElNRElFUl9DUFQxSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgY2FwdHVyZSAxIGludGVycnVwdCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIFRJTXhESUVSICAgICBDUFQxSUUgICAgICAgICAgICBMTF9IUlRJTV9EaXNhYmxlSVRfQ1BUMQorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRGlzYWJsZUlUX0NQVDEoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1ESUVSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBDTEVBUl9CSVQoKnBSZWcsIEhSVElNX1RJTURJRVJfQ1BUMUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBjYXB0dXJlIDEgaW50ZXJydXB0IGlzIGVuYWJsZWQgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBUSU14RElFUiAgICAgQ1BUMUlFICAgICAgICAgICAgTExfSFJUSU1fSXNFbmFibGVkSVRfQ1BUMQorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgU3RhdGUgb2YgQ1BUMUlFIGJpdCBpbiBIUlRJTV9USU14RElFUiByZWdpc3RlciAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9Jc0VuYWJsZWRJVF9DUFQxKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgSFJUSU1fVElNRElFUl9DUFQxSUUpID09IChIUlRJTV9USU1ESUVSX0NQVDFJRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgY2FwdHVyZSAyIGludGVycnVwdCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIFRJTXhESUVSICAgICBDUFQySUUgICAgICAgICAgICBMTF9IUlRJTV9FbmFibGVJVF9DUFQyCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9FbmFibGVJVF9DUFQyKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgU0VUX0JJVCgqcFJlZywgSFJUSU1fVElNRElFUl9DUFQySUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgY2FwdHVyZSAyIGludGVycnVwdCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIFRJTXhESUVSICAgICBDUFQySUUgICAgICAgICAgICBMTF9IUlRJTV9EaXNhYmxlSVRfQ1BUMgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRGlzYWJsZUlUX0NQVDIoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1ESUVSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBDTEVBUl9CSVQoKnBSZWcsIEhSVElNX1RJTURJRVJfQ1BUMklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBjYXB0dXJlIDIgaW50ZXJydXB0IGlzIGVuYWJsZWQgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBUSU14RElFUiAgICAgQ1BUMklFICAgICAgICAgICAgTExfSFJUSU1fSXNFbmFibGVkSVRfQ1BUMgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgU3RhdGUgb2YgQ1BUMklFIGJpdCBpbiBIUlRJTV9USU14RElFUiByZWdpc3RlciAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9Jc0VuYWJsZWRJVF9DUFQyKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgSFJUSU1fVElNRElFUl9DUFQySUUpID09IChIUlRJTV9USU1ESUVSX0NQVDJJRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgb3V0cHV0IDEgc2V0IGludGVycnVwdCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIFRJTXhESUVSICAgICBTRVQxSUUgICAgICAgICAgICBMTF9IUlRJTV9FbmFibGVJVF9TRVQxCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9FbmFibGVJVF9TRVQxKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgU0VUX0JJVCgqcFJlZywgSFJUSU1fVElNRElFUl9TRVQxSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIG91dHB1dCAxIHNldCBpbnRlcnJ1cHQgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBUSU14RElFUiAgICAgU0VUMUlFICAgICAgICAgICAgTExfSFJUSU1fRGlzYWJsZUlUX1NFVDEKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0Rpc2FibGVJVF9TRVQxKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgQ0xFQVJfQklUKCpwUmVnLCBIUlRJTV9USU1ESUVSX1NFVDFJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciB0aGUgb3V0cHV0IDEgc2V0IGludGVycnVwdCBpcyBlbmFibGVkIGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgVElNeERJRVIgICAgIFNFVDFJRSAgICAgICAgICAgIExMX0hSVElNX0lzRW5hYmxlZElUX1NFVDEKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIFNFVDF4SUUgYml0IGluIEhSVElNX1RJTXhESUVSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0lzRW5hYmxlZElUX1NFVDEoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1ESUVSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9USU1ESUVSX1NFVDFJRSkgPT0gKEhSVElNX1RJTURJRVJfU0VUMUlFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBvdXRwdXQgMSByZXNldCBpbnRlcnJ1cHQgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBUSU14RElFUiAgICAgUlNUMUlFICAgICAgICAgICAgTExfSFJUSU1fRW5hYmxlSVRfUlNUMQorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRW5hYmxlSVRfUlNUMShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTURJRVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIFNFVF9CSVQoKnBSZWcsIEhSVElNX1RJTURJRVJfUlNUMUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBvdXRwdXQgMSByZXNldCBpbnRlcnJ1cHQgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBUSU14RElFUiAgICAgUlNUMUlFICAgICAgICAgICAgTExfSFJUSU1fRGlzYWJsZUlUX1JTVDEKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0Rpc2FibGVJVF9SU1QxKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgQ0xFQVJfQklUKCpwUmVnLCBIUlRJTV9USU1ESUVSX1JTVDFJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciB0aGUgb3V0cHV0IDEgcmVzZXQgaW50ZXJydXB0IGlzIGVuYWJsZWQgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBUSU14RElFUiAgICAgUlNUMUlFICAgICAgICAgICAgTExfSFJUSU1fSXNFbmFibGVkSVRfUlNUMQorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgU3RhdGUgb2YgUlNUMXhJRSBiaXQgaW4gSFJUSU1fVElNeERJRVIgcmVnaXN0ZXIgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fSXNFbmFibGVkSVRfUlNUMShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTURJRVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsIEhSVElNX1RJTURJRVJfUlNUMUlFKSA9PSAoSFJUSU1fVElNRElFUl9SU1QxSUUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIG91dHB1dCAyIHNldCBpbnRlcnJ1cHQgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBUSU14RElFUiAgICAgU0VUMklFICAgICAgICAgICAgTExfSFJUSU1fRW5hYmxlSVRfU0VUMgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRW5hYmxlSVRfU0VUMihIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTURJRVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIFNFVF9CSVQoKnBSZWcsIEhSVElNX1RJTURJRVJfU0VUMklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBvdXRwdXQgMiBzZXQgaW50ZXJydXB0IGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgVElNeERJRVIgICAgIFNFVDJJRSAgICAgICAgICAgIExMX0hSVElNX0Rpc2FibGVJVF9TRVQyCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9EaXNhYmxlSVRfU0VUMihIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTURJRVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIENMRUFSX0JJVCgqcFJlZywgSFJUSU1fVElNRElFUl9TRVQySUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdGhlIG91dHB1dCAyIHNldCBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIFRJTXhESUVSICAgICBTRVQySUUgICAgICAgICAgICBMTF9IUlRJTV9Jc0VuYWJsZWRJVF9TRVQyCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBTdGF0ZSBvZiBTRVQyeElFIGJpdCBpbiBIUlRJTV9USU14RElFUiByZWdpc3RlciAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9Jc0VuYWJsZWRJVF9TRVQyKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgSFJUSU1fVElNRElFUl9TRVQySUUpID09IChIUlRJTV9USU1ESUVSX1NFVDJJRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgb3V0cHV0IDIgcmVzZXQgaW50ZXJydXB0IGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgVElNeERJRVIgICAgIFJTVDJJRSAgICAgICAgICAgIExMX0hSVElNX0VuYWJsZUlUX1JTVDIKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0VuYWJsZUlUX1JTVDIoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1ESUVSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBTRVRfQklUKCpwUmVnLCBIUlRJTV9USU1ESUVSX1JTVDJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgb3V0cHV0IDIgcmVzZXQgaW50ZXJydXB0IGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgVElNeERJRVIgICAgIFJTVDJJRSAgICAgICAgICAgIExMX0hSVElNX0Rpc2FibGVJVF9SU1QyCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9EaXNhYmxlSVRfUlNUMihIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTURJRVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIENMRUFSX0JJVCgqcFJlZywgSFJUSU1fVElNRElFUl9SU1QySUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdGhlIG91dHB1dCAyIHJlc2V0IExMX0hSVElNX0lzRW5hYmxlZElUX1JTVDIgaXMgZW5hYmxlZCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIFRJTXhESUVSICAgICBSU1QySUUgICAgICAgICAgICBMTF9IUlRJTV9EaXNhYmxlSVRfUlNUMgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgU3RhdGUgb2YgUlNUMnhJRSBiaXQgaW4gSFJUSU1fVElNeERJRVIgcmVnaXN0ZXIgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fSXNFbmFibGVkSVRfUlNUMihIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTURJRVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsIEhSVElNX1RJTURJRVJfUlNUMklFKSA9PSAoSFJUSU1fVElNRElFUl9SU1QySUUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIHJlc2V0L3JvbGwtb3ZlciBpbnRlcnJ1cHQgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBUSU14RElFUiAgICAgUlNUSUUgICAgICAgICAgICBMTF9IUlRJTV9FbmFibGVJVF9SU1QKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0VuYWJsZUlUX1JTVChIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTURJRVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIFNFVF9CSVQoKnBSZWcsIEhSVElNX1RJTURJRVJfUlNUSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIHJlc2V0L3JvbGwtb3ZlciBpbnRlcnJ1cHQgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBUSU14RElFUiAgICAgUlNUSUUgICAgICAgICAgICBMTF9IUlRJTV9EaXNhYmxlSVRfUlNUCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9EaXNhYmxlSVRfUlNUKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgQ0xFQVJfQklUKCpwUmVnLCBIUlRJTV9USU1ESUVSX1JTVElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSByZXNldC9yb2xsLW92ZXIgaW50ZXJydXB0IGlzIGVuYWJsZWQgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBUSU14RElFUiAgICAgUlNUSUUgICAgICAgICAgICBMTF9IUlRJTV9Jc0VuYWJsZWRJVF9SU1QKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIFJTVElFIGJpdCBpbiBIUlRJTV9USU14RElFUiByZWdpc3RlciAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9Jc0VuYWJsZWRJVF9SU1QoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1ESUVSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9USU1ESUVSX1JTVElFKSA9PSAoSFJUSU1fVElNRElFUl9SU1RJRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgZGVsYXllZCBwcm90ZWN0aW9uIGludGVycnVwdCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIFRJTXhESUVSICAgICBETFlQUlRJRSAgICAgICAgICAgIExMX0hSVElNX0VuYWJsZUlUX0RMWVBSVAorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRW5hYmxlSVRfRExZUFJUKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgU0VUX0JJVCgqcFJlZywgSFJUSU1fVElNRElFUl9ETFlQUlRJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgZGVsYXllZCBwcm90ZWN0aW9uIGludGVycnVwdCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIFRJTXhESUVSICAgICBETFlQUlRJRSAgICAgICAgICAgIExMX0hSVElNX0Rpc2FibGVJVF9ETFlQUlQKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0Rpc2FibGVJVF9ETFlQUlQoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1ESUVSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBDTEVBUl9CSVQoKnBSZWcsIEhSVElNX1RJTURJRVJfRExZUFJUSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdGhlIGRlbGF5ZWQgcHJvdGVjdGlvbiBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIFRJTXhESUVSICAgICBETFlQUlRJRSAgICAgICAgICAgIExMX0hSVElNX0lzRW5hYmxlZElUX0RMWVBSVAorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgU3RhdGUgb2YgRExZUFJUSUUgYml0IGluIEhSVElNX1RJTXhESUVSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0lzRW5hYmxlZElUX0RMWVBSVChIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTURJRVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsIEhSVElNX1RJTURJRVJfRExZUFJUSUUpID09IChIUlRJTV9USU1ESUVSX0RMWVBSVElFKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRUZfRE1BX01hbmFnZW1lbnQgRE1BX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3luY2hyb25pemF0aW9uIGlucHV0IERNQSByZXF1ZXN0LgorICAqIEBybXRvbGwgTURJRVIgICAgIFNZTkNERSAgICAgICAgICAgIExMX0hSVElNX0VuYWJsZURNQVJlcV9TWU5DCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9FbmFibGVETUFSZXFfU1lOQyhIUlRJTV9UeXBlRGVmICpIUlRJTXgpCit7CisgIFNFVF9CSVQoSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUiwgSFJUSU1fTURJRVJfU1lOQ0RFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBzeW5jaHJvbml6YXRpb24gaW5wdXQgRE1BIHJlcXVlc3QKKyAgKiBAcm10b2xsIE1ESUVSICAgICBTWU5DREUgICAgICAgICAgICBMTF9IUlRJTV9EaXNhYmxlRE1BUmVxX1NZTkMKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0Rpc2FibGVETUFSZXFfU1lOQyhIUlRJTV9UeXBlRGVmICpIUlRJTXgpCit7CisgIENMRUFSX0JJVChIUlRJTXgtPnNNYXN0ZXJSZWdzLk1ESUVSLCBIUlRJTV9NRElFUl9TWU5DREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdGhlIHN5bmNocm9uaXphdGlvbiBpbnB1dCBETUEgcmVxdWVzdCBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgTURJRVIgICAgIFNZTkNERSAgICAgICAgICAgIExMX0hSVElNX0lzRW5hYmxlZERNQVJlcV9TWU5DCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBTWU5DREUgYml0IGluIEhSVElNX01ESUVSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0lzRW5hYmxlZERNQVJlcV9TWU5DKEhSVElNX1R5cGVEZWYgKkhSVElNeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChIUlRJTXgtPnNNYXN0ZXJSZWdzLk1ESUVSLCBIUlRJTV9NRElFUl9TWU5DREUpID09IChIUlRJTV9NRElFUl9TWU5DREUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIHVwZGF0ZSBETUEgcmVxdWVzdCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIE1ESUVSICAgICAgICBNVVBEREUgICAgICAgICAgICBMTF9IUlRJTV9FbmFibGVETUFSZXFfVVBEQVRFXG4KKyAgKiAgICAgICAgIFRJTXhESUVSICAgICBVUERERSAgICAgICAgICAgICBMTF9IUlRJTV9FbmFibGVETUFSZXFfVVBEQVRFCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9FbmFibGVETUFSZXFfVVBEQVRFKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgU0VUX0JJVCgqcFJlZywgSFJUSU1fTURJRVJfTVVQRERFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSB1cGRhdGUgRE1BIHJlcXVlc3QgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBNRElFUiAgICAgICAgTVVQRERFICAgICAgICAgICAgTExfSFJUSU1fRGlzYWJsZURNQVJlcV9VUERBVEVcbgorICAqICAgICAgICAgVElNeERJRVIgICAgIFVQRERFICAgICAgICAgICAgIExMX0hSVElNX0Rpc2FibGVETUFSZXFfVVBEQVRFCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9EaXNhYmxlRE1BUmVxX1VQREFURShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTURJRVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIENMRUFSX0JJVCgqcFJlZywgSFJUSU1fTURJRVJfTVVQRERFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSB1cGRhdGUgRE1BIHJlcXVlc3QgaXMgZW5hYmxlZCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIE1ESUVSICAgICAgICBNVVBEREUgICAgICAgICAgICBMTF9IUlRJTV9Jc0VuYWJsZWRETUFSZXFfVVBEQVRFXG4KKyAgKiAgICAgICAgIFRJTXhESUVSICAgICBVUERERSAgICAgICAgICAgICBMTF9IUlRJTV9Jc0VuYWJsZWRETUFSZXFfVVBEQVRFCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBTdGF0ZSBvZiBNVVBEREUvVVBEREUgYml0IGluIEhSVElNX01ESUVSL0hSVElNX1RJTXhESUVSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0lzRW5hYmxlZERNQVJlcV9VUERBVEUoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1ESUVSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9NRElFUl9NVVBEREUpID09IChIUlRJTV9NRElFUl9NVVBEREUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIHJlcGV0aXRpb24gRE1BIHJlcXVlc3QgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBNRElFUiAgICAgICAgTVJFUERFICAgICAgICAgICAgTExfSFJUSU1fRW5hYmxlRE1BUmVxX1JFUFxuCisgICogICAgICAgICBUSU14RElFUiAgICAgUkVQREUgICAgICAgICAgICAgTExfSFJUSU1fRW5hYmxlRE1BUmVxX1JFUAorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRW5hYmxlRE1BUmVxX1JFUChIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTURJRVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIFNFVF9CSVQoKnBSZWcsIEhSVElNX01ESUVSX01SRVBERSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgcmVwZXRpdGlvbiBETUEgcmVxdWVzdCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIE1ESUVSICAgICAgICBNUkVQREUgICAgICAgICAgICBMTF9IUlRJTV9EaXNhYmxlRE1BUmVxX1JFUFxuCisgICogICAgICAgICBUSU14RElFUiAgICAgUkVQREUgICAgICAgICAgICAgTExfSFJUSU1fRGlzYWJsZURNQVJlcV9SRVAKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfTUFTVEVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0Rpc2FibGVETUFSZXFfUkVQKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgQ0xFQVJfQklUKCpwUmVnLCBIUlRJTV9NRElFUl9NUkVQREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdGhlIHJlcGV0aXRpb24gRE1BIHJlcXVlc3QgaXMgZW5hYmxlZCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIE1ESUVSICAgICAgICBNUkVQREUgICAgICAgICAgICBMTF9IUlRJTV9Jc0VuYWJsZWRETUFSZXFfUkVQXG4KKyAgKiAgICAgICAgIFRJTXhESUVSICAgICBSRVBERSAgICAgICAgICAgICBMTF9IUlRJTV9Jc0VuYWJsZWRETUFSZXFfUkVQCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBTdGF0ZSBvZiBNUkVQREUvUkVQREUgYml0IGluIEhSVElNX01ESUVSL0hSVElNX1RJTXhESUVSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0lzRW5hYmxlZERNQVJlcV9SRVAoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1ESUVSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9NRElFUl9NUkVQREUpID09IChIUlRJTV9NRElFUl9NUkVQREUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIGNvbXBhcmUgMSBETUEgcmVxdWVzdCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIE1ESUVSICAgICAgICBNQ01QMURFICAgICAgICAgICAgTExfSFJUSU1fRW5hYmxlRE1BUmVxX0NNUDFcbgorICAqICAgICAgICAgVElNeERJRVIgICAgIENNUDFERSAgICAgICAgICAgICBMTF9IUlRJTV9FbmFibGVETUFSZXFfQ01QMQorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRW5hYmxlRE1BUmVxX0NNUDEoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1ESUVSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBTRVRfQklUKCpwUmVnLCBIUlRJTV9NRElFUl9NQ01QMURFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBjb21wYXJlIDEgRE1BIHJlcXVlc3QgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBNRElFUiAgICAgICAgTUNNUDFERSAgICAgICAgICAgIExMX0hSVElNX0Rpc2FibGVETUFSZXFfQ01QMVxuCisgICogICAgICAgICBUSU14RElFUiAgICAgQ01QMURFICAgICAgICAgICAgIExMX0hSVElNX0Rpc2FibGVETUFSZXFfQ01QMQorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRGlzYWJsZURNQVJlcV9DTVAxKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgQ0xFQVJfQklUKCpwUmVnLCBIUlRJTV9NRElFUl9NQ01QMURFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBjb21wYXJlIDEgRE1BIHJlcXVlc3QgaXMgZW5hYmxlZCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIE1ESUVSICAgICAgICBNQ01QMURFICAgICAgICAgICAgTExfSFJUSU1fSXNFbmFibGVkRE1BUmVxX0NNUDFcbgorICAqICAgICAgICAgVElNeERJRVIgICAgIENNUDFERSAgICAgICAgICAgICBMTF9IUlRJTV9Jc0VuYWJsZWRETUFSZXFfQ01QMQorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgU3RhdGUgb2YgTUNNUDFERS9DTVAxREUgYml0IGluIEhSVElNX01ESUVSL0hSVElNX1RJTXhESUVSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0lzRW5hYmxlZERNQVJlcV9DTVAxKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgSFJUSU1fTURJRVJfTUNNUDFERSkgPT0gKEhSVElNX01ESUVSX01DTVAxREUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIGNvbXBhcmUgMiBETUEgcmVxdWVzdCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIE1ESUVSICAgICAgICBNQ01QMkRFICAgICAgICAgICAgTExfSFJUSU1fRW5hYmxlRE1BUmVxX0NNUDJcbgorICAqICAgICAgICAgVElNeERJRVIgICAgIENNUDJERSAgICAgICAgICAgICBMTF9IUlRJTV9FbmFibGVETUFSZXFfQ01QMgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRW5hYmxlRE1BUmVxX0NNUDIoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1ESUVSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBTRVRfQklUKCpwUmVnLCBIUlRJTV9NRElFUl9NQ01QMkRFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBjb21wYXJlIDIgRE1BIHJlcXVlc3QgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBNRElFUiAgICAgICAgTUNNUDJERSAgICAgICAgICAgIExMX0hSVElNX0Rpc2FibGVETUFSZXFfQ01QMlxuCisgICogICAgICAgICBUSU14RElFUiAgICAgQ01QMkRFICAgICAgICAgICAgIExMX0hSVElNX0Rpc2FibGVETUFSZXFfQ01QMgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRGlzYWJsZURNQVJlcV9DTVAyKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgQ0xFQVJfQklUKCpwUmVnLCBIUlRJTV9NRElFUl9NQ01QMkRFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBjb21wYXJlIDIgRE1BIHJlcXVlc3QgaXMgZW5hYmxlZCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIE1ESUVSICAgICAgICBNQ01QMkRFICAgICAgICAgICAgTExfSFJUSU1fSXNFbmFibGVkRE1BUmVxX0NNUDJcbgorICAqICAgICAgICAgVElNeERJRVIgICAgIENNUDJERSAgICAgICAgICAgICBMTF9IUlRJTV9Jc0VuYWJsZWRETUFSZXFfQ01QMgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgU3RhdGUgb2YgTUNNUDJERS9DTVAyREUgYml0IGluIEhSVElNX01ESUVSL0hSVElNX1RJTXhESUVSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0lzRW5hYmxlZERNQVJlcV9DTVAyKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgSFJUSU1fTURJRVJfTUNNUDJERSkgPT0gKEhSVElNX01ESUVSX01DTVAyREUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIGNvbXBhcmUgMyBETUEgcmVxdWVzdCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIE1ESUVSICAgICAgICBNQ01QM0RFICAgICAgICAgICAgTExfSFJUSU1fRW5hYmxlRE1BUmVxX0NNUDNcbgorICAqICAgICAgICAgVElNeERJRVIgICAgIENNUDNERSAgICAgICAgICAgICBMTF9IUlRJTV9FbmFibGVETUFSZXFfQ01QMworICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRW5hYmxlRE1BUmVxX0NNUDMoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1ESUVSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBTRVRfQklUKCpwUmVnLCBIUlRJTV9NRElFUl9NQ01QM0RFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBjb21wYXJlIDMgRE1BIHJlcXVlc3QgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBNRElFUiAgICAgICAgTUNNUDNERSAgICAgICAgICAgIExMX0hSVElNX0Rpc2FibGVETUFSZXFfQ01QM1xuCisgICogICAgICAgICBUSU14RElFUiAgICAgQ01QM0RFICAgICAgICAgICAgIExMX0hSVElNX0Rpc2FibGVETUFSZXFfQ01QMworICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRGlzYWJsZURNQVJlcV9DTVAzKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgQ0xFQVJfQklUKCpwUmVnLCBIUlRJTV9NRElFUl9NQ01QM0RFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBjb21wYXJlIDMgRE1BIHJlcXVlc3QgaXMgZW5hYmxlZCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIE1ESUVSICAgICAgICBNQ01QM0RFICAgICAgICAgICAgTExfSFJUSU1fSXNFbmFibGVkRE1BUmVxX0NNUDNcbgorICAqICAgICAgICAgVElNeERJRVIgICAgIENNUDNERSAgICAgICAgICAgICBMTF9IUlRJTV9Jc0VuYWJsZWRETUFSZXFfQ01QMworICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgU3RhdGUgb2YgTUNNUDNERS9DTVAzREUgYml0IGluIEhSVElNX01ESUVSL0hSVElNX1RJTXhESUVSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0lzRW5hYmxlZERNQVJlcV9DTVAzKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgSFJUSU1fTURJRVJfTUNNUDNERSkgPT0gKEhSVElNX01ESUVSX01DTVAzREUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIGNvbXBhcmUgNCBETUEgcmVxdWVzdCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIE1ESUVSICAgICAgICBNQ01QNERFICAgICAgICAgICAgTExfSFJUSU1fRW5hYmxlRE1BUmVxX0NNUDRcbgorICAqICAgICAgICAgVElNeERJRVIgICAgIENNUDRERSAgICAgICAgICAgICBMTF9IUlRJTV9FbmFibGVETUFSZXFfQ01QNAorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRW5hYmxlRE1BUmVxX0NNUDQoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1ESUVSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBTRVRfQklUKCpwUmVnLCBIUlRJTV9NRElFUl9NQ01QNERFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBjb21wYXJlIDQgRE1BIHJlcXVlc3QgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBNRElFUiAgICAgICAgTUNNUDRERSAgICAgICAgICAgIExMX0hSVElNX0Rpc2FibGVETUFSZXFfQ01QNFxuCisgICogICAgICAgICBUSU14RElFUiAgICAgQ01QNERFICAgICAgICAgICAgIExMX0hSVElNX0Rpc2FibGVETUFSZXFfQ01QNAorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRGlzYWJsZURNQVJlcV9DTVA0KEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgQ0xFQVJfQklUKCpwUmVnLCBIUlRJTV9NRElFUl9NQ01QNERFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBjb21wYXJlIDQgRE1BIHJlcXVlc3QgaXMgZW5hYmxlZCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIE1ESUVSICAgICAgICBNQ01QNERFICAgICAgICAgICAgTExfSFJUSU1fSXNFbmFibGVkRE1BUmVxX0NNUDRcbgorICAqICAgICAgICAgVElNeERJRVIgICAgIENNUDRERSAgICAgICAgICAgICBMTF9IUlRJTV9Jc0VuYWJsZWRETUFSZXFfQ01QNAorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgU3RhdGUgb2YgTUNNUDRERS9DTVA0REUgYml0IGluIEhSVElNX01ESUVSL0hSVElNX1RJTXhESUVSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0lzRW5hYmxlZERNQVJlcV9DTVA0KEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgSFJUSU1fTURJRVJfTUNNUDRERSkgPT0gKEhSVElNX01ESUVSX01DTVA0REUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIGNhcHR1cmUgMSBETUEgcmVxdWVzdCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIFRJTXhESUVSICAgICBDUFQxREUgICAgICAgICAgICAgTExfSFJUSU1fRW5hYmxlRE1BUmVxX0NQVDEKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0VuYWJsZURNQVJlcV9DUFQxKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgU0VUX0JJVCgqcFJlZywgSFJUSU1fVElNRElFUl9DUFQxREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIGNhcHR1cmUgMSBETUEgcmVxdWVzdCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIFRJTXhESUVSICAgICBDUFQxREUgICAgICAgICAgICAgTExfSFJUSU1fRGlzYWJsZURNQVJlcV9DUFQxCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9EaXNhYmxlRE1BUmVxX0NQVDEoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1ESUVSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBDTEVBUl9CSVQoKnBSZWcsIEhSVElNX1RJTURJRVJfQ1BUMURFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBjYXB0dXJlIDEgRE1BIHJlcXVlc3QgaXMgZW5hYmxlZCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIFRJTXhESUVSICAgICBDUFQxREUgICAgICAgICAgICAgTExfSFJUSU1fSXNFbmFibGVkRE1BUmVxX0NQVDEKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIENQVDFERSBiaXQgaW4gSFJUSU1fVElNeERJRVIgcmVnaXN0ZXIgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fSXNFbmFibGVkRE1BUmVxX0NQVDEoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1ESUVSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9USU1ESUVSX0NQVDFERSkgPT0gKEhSVElNX1RJTURJRVJfQ1BUMURFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBjYXB0dXJlIDIgRE1BIHJlcXVlc3QgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBUSU14RElFUiAgICAgQ1BUMkRFICAgICAgICAgICAgIExMX0hSVElNX0VuYWJsZURNQVJlcV9DUFQyCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9FbmFibGVETUFSZXFfQ1BUMihIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTURJRVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIFNFVF9CSVQoKnBSZWcsIEhSVElNX1RJTURJRVJfQ1BUMkRFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBjYXB0dXJlIDIgRE1BIHJlcXVlc3QgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBUSU14RElFUiAgICAgQ1BUMkRFICAgICAgICAgICAgIExMX0hSVElNX0Rpc2FibGVETUFSZXFfQ1BUMgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRGlzYWJsZURNQVJlcV9DUFQyKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgQ0xFQVJfQklUKCpwUmVnLCBIUlRJTV9USU1ESUVSX0NQVDJERSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciB0aGUgY2FwdHVyZSAyIERNQSByZXF1ZXN0IGlzIGVuYWJsZWQgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBUSU14RElFUiAgICAgQ1BUMkRFICAgICAgICAgICAgIExMX0hSVElNX0lzRW5hYmxlZERNQVJlcV9DUFQyCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBTdGF0ZSBvZiBDUFQyREUgYml0IGluIEhSVElNX1RJTXhESUVSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0lzRW5hYmxlZERNQVJlcV9DUFQyKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgSFJUSU1fVElNRElFUl9DUFQyREUpID09IChIUlRJTV9USU1ESUVSX0NQVDJERSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgb3V0cHV0IDEgc2V0ICBETUEgcmVxdWVzdCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIFRJTXhESUVSICAgICBTRVQxREUgICAgICAgICAgICAgTExfSFJUSU1fRW5hYmxlRE1BUmVxX1NFVDEKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0VuYWJsZURNQVJlcV9TRVQxKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgU0VUX0JJVCgqcFJlZywgSFJUSU1fVElNRElFUl9TRVQxREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIG91dHB1dCAxIHNldCAgRE1BIHJlcXVlc3QgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBUSU14RElFUiAgICAgU0VUMURFICAgICAgICAgICAgIExMX0hSVElNX0Rpc2FibGVETUFSZXFfU0VUMQorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRGlzYWJsZURNQVJlcV9TRVQxKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgQ0xFQVJfQklUKCpwUmVnLCBIUlRJTV9USU1ESUVSX1NFVDFERSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciB0aGUgb3V0cHV0IDEgc2V0ICBETUEgcmVxdWVzdCBpcyBlbmFibGVkIGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgVElNeERJRVIgICAgIFNFVDFERSAgICAgICAgICAgICBMTF9IUlRJTV9Jc0VuYWJsZWRETUFSZXFfU0VUMQorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgU3RhdGUgb2YgU0VUMXhERSBiaXQgaW4gSFJUSU1fVElNeERJRVIgcmVnaXN0ZXIgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fSXNFbmFibGVkRE1BUmVxX1NFVDEoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1ESUVSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9USU1ESUVSX1NFVDFERSkgPT0gKEhSVElNX1RJTURJRVJfU0VUMURFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBvdXRwdXQgMSByZXNldCAgRE1BIHJlcXVlc3QgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBUSU14RElFUiAgICAgUlNUMURFICAgICAgICAgICAgIExMX0hSVElNX0VuYWJsZURNQVJlcV9SU1QxCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9FbmFibGVETUFSZXFfUlNUMShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTURJRVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIFNFVF9CSVQoKnBSZWcsIEhSVElNX1RJTURJRVJfUlNUMURFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBvdXRwdXQgMSByZXNldCAgRE1BIHJlcXVlc3QgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBUSU14RElFUiAgICAgUlNUMURFICAgICAgICAgICAgIExMX0hSVElNX0Rpc2FibGVETUFSZXFfUlNUMQorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRGlzYWJsZURNQVJlcV9SU1QxKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgQ0xFQVJfQklUKCpwUmVnLCBIUlRJTV9USU1ESUVSX1JTVDFERSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciB0aGUgb3V0cHV0IDEgcmVzZXQgaW50ZXJydXB0IGlzIGVuYWJsZWQgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBUSU14RElFUiAgICAgUlNUMURFICAgICAgICAgICAgIExMX0hSVElNX0lzRW5hYmxlZERNQVJlcV9SU1QxCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBTdGF0ZSBvZiBSU1QxeERFIGJpdCBpbiBIUlRJTV9USU14RElFUiByZWdpc3RlciAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9Jc0VuYWJsZWRETUFSZXFfUlNUMShIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTURJRVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsIEhSVElNX1RJTURJRVJfUlNUMURFKSA9PSAoSFJUSU1fVElNRElFUl9SU1QxREUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIG91dHB1dCAyIHNldCAgRE1BIHJlcXVlc3QgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBUSU14RElFUiAgICAgU0VUMkRFICAgICAgICAgICAgIExMX0hSVElNX0VuYWJsZURNQVJlcV9TRVQyCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9FbmFibGVETUFSZXFfU0VUMihIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTURJRVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIFNFVF9CSVQoKnBSZWcsIEhSVElNX1RJTURJRVJfU0VUMkRFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBvdXRwdXQgMiBzZXQgIERNQSByZXF1ZXN0IGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgVElNeERJRVIgICAgIFNFVDJERSAgICAgICAgICAgICBMTF9IUlRJTV9EaXNhYmxlRE1BUmVxX1NFVDIKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0Rpc2FibGVETUFSZXFfU0VUMihIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTURJRVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIENMRUFSX0JJVCgqcFJlZywgSFJUSU1fVElNRElFUl9TRVQyREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdGhlIG91dHB1dCAyIHNldCAgRE1BIHJlcXVlc3QgaXMgZW5hYmxlZCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIFRJTXhESUVSICAgICBTRVQyREUgICAgICAgICAgICAgTExfSFJUSU1fSXNFbmFibGVkRE1BUmVxX1NFVDIKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIFNFVDJ4REUgYml0IGluIEhSVElNX1RJTXhESUVSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0lzRW5hYmxlZERNQVJlcV9TRVQyKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgSFJUSU1fVElNRElFUl9TRVQyREUpID09IChIUlRJTV9USU1ESUVSX1NFVDJERSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgb3V0cHV0IDIgcmVzZXQgIERNQSByZXF1ZXN0IGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgVElNeERJRVIgICAgIFJTVDJERSAgICAgICAgICAgICBMTF9IUlRJTV9FbmFibGVETUFSZXFfUlNUMgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRW5hYmxlRE1BUmVxX1JTVDIoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1ESUVSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBTRVRfQklUKCpwUmVnLCBIUlRJTV9USU1ESUVSX1JTVDJERSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgb3V0cHV0IDIgcmVzZXQgIERNQSByZXF1ZXN0IGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgVElNeERJRVIgICAgIFJTVDJERSAgICAgICAgICAgICBMTF9IUlRJTV9EaXNhYmxlRE1BUmVxX1JTVDIKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hSVElNX0Rpc2FibGVETUFSZXFfUlNUMihIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTURJRVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIENMRUFSX0JJVCgqcFJlZywgSFJUSU1fVElNRElFUl9SU1QyREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdGhlIG91dHB1dCAyIHJlc2V0ICBETUEgcmVxdWVzdCBpcyBlbmFibGVkIGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgVElNeERJRVIgICAgIFJTVDJERSAgICAgICAgICAgICBMTF9IUlRJTV9Jc0VuYWJsZWRETUFSZXFfUlNUMgorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgU3RhdGUgb2YgUlNUMnhERSBiaXQgaW4gSFJUSU1fVElNeERJRVIgcmVnaXN0ZXIgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFJUSU1fSXNFbmFibGVkRE1BUmVxX1JTVDIoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1ESUVSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9USU1ESUVSX1JTVDJERSkgPT0gKEhSVElNX1RJTURJRVJfUlNUMkRFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSByZXNldC9yb2xsLW92ZXIgRE1BIHJlcXVlc3QgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBUSU14RElFUiAgICAgUlNUREUgICAgICAgICAgICAgTExfSFJUSU1fRW5hYmxlRE1BUmVxX1JTVAorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRW5hYmxlRE1BUmVxX1JTVChIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTURJRVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIFNFVF9CSVQoKnBSZWcsIEhSVElNX1RJTURJRVJfUlNUREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIHJlc2V0L3JvbGwtb3ZlciBETUEgcmVxdWVzdCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIFRJTXhESUVSICAgICBSU1RERSAgICAgICAgICAgICBMTF9IUlRJTV9EaXNhYmxlRE1BUmVxX1JTVAorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFJUSU1fRGlzYWJsZURNQVJlcV9SU1QoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1ESUVSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICBDTEVBUl9CSVQoKnBSZWcsIEhSVElNX1RJTURJRVJfUlNUREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdGhlIHJlc2V0L3JvbGwtb3ZlciBETUEgcmVxdWVzdCBpcyBlbmFibGVkIGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgVElNeERJRVIgICAgIFJTVERFICAgICAgICAgICAgIExMX0hSVElNX0lzRW5hYmxlZERNQVJlcV9SU1QKKyAgKiBAcGFyYW0gIEhSVElNeCBIaWdoIFJlc29sdXRpb24gVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIFJTVERFIGJpdCBpbiBIUlRJTV9USU14RElFUiByZWdpc3RlciAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IUlRJTV9Jc0VuYWJsZWRETUFSZXFfUlNUKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgSFJUSU1fVElNRElFUl9SU1RERSkgPT0gKEhSVElNX1RJTURJRVJfUlNUREUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIGRlbGF5ZWQgcHJvdGVjdGlvbiBETUEgcmVxdWVzdCBmb3IgYSBnaXZlbiB0aW1lci4KKyAgKiBAcm10b2xsIFRJTXhESUVSICAgICBETFlQUlRERSAgICAgICAgICAgICBMTF9IUlRJTV9FbmFibGVETUFSZXFfRExZUFJUCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9FbmFibGVETUFSZXFfRExZUFJUKEhSVElNX1R5cGVEZWYgKkhSVElNeCwgdWludDMyX3QgVGltZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlUaW1lciA9ICh1aW50OF90KShQT1NJVElPTl9WQUwoVGltZXIpIC0gSFJUSU1fTUNSX01DRU5fUG9zKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmSFJUSU14LT5zTWFzdGVyUmVncy5NRElFUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19PRkZTRVRfVEFCX1RJTUVSW2lUaW1lcl0pKTsKKyAgU0VUX0JJVCgqcFJlZywgSFJUSU1fVElNRElFUl9ETFlQUlRERSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgZGVsYXllZCBwcm90ZWN0aW9uIERNQSByZXF1ZXN0IGZvciBhIGdpdmVuIHRpbWVyLgorICAqIEBybXRvbGwgVElNeERJRVIgICAgIERMWVBSVERFICAgICAgICAgICAgIExMX0hSVElNX0Rpc2FibGVETUFSZXFfRExZUFJUCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IUlRJTV9EaXNhYmxlRE1BUmVxX0RMWVBSVChIUlRJTV9UeXBlRGVmICpIUlRJTXgsIHVpbnQzMl90IFRpbWVyKQoreworICByZWdpc3RlciB1aW50MzJfdCBpVGltZXIgPSAodWludDhfdCkoUE9TSVRJT05fVkFMKFRpbWVyKSAtIEhSVElNX01DUl9NQ0VOX1Bvcyk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJkhSVElNeC0+c01hc3RlclJlZ3MuTURJRVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT0ZGU0VUX1RBQl9USU1FUltpVGltZXJdKSk7CisgIENMRUFSX0JJVCgqcFJlZywgSFJUSU1fVElNRElFUl9ETFlQUlRERSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciB0aGUgZGVsYXllZCBwcm90ZWN0aW9uIERNQSByZXF1ZXN0IGlzIGVuYWJsZWQgZm9yIGEgZ2l2ZW4gdGltZXIuCisgICogQHJtdG9sbCBUSU14RElFUiAgICAgRExZUFJUREUgICAgICAgICAgICAgTExfSFJUSU1fSXNFbmFibGVkRE1BUmVxX0RMWVBSVAorICAqIEBwYXJhbSAgSFJUSU14IEhpZ2ggUmVzb2x1dGlvbiBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hSVElNX1RJTUVSX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IUlRJTV9USU1FUl9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSFJUSU1fVElNRVJfRQorICAqIEByZXR2YWwgU3RhdGUgb2YgRExZUFJUREUgYml0IGluIEhSVElNX1RJTXhESUVSIHJlZ2lzdGVyICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hSVElNX0lzRW5hYmxlZERNQVJlcV9ETFlQUlQoSFJUSU1fVHlwZURlZiAqSFJUSU14LCB1aW50MzJfdCBUaW1lcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgaVRpbWVyID0gKHVpbnQ4X3QpKFBPU0lUSU9OX1ZBTChUaW1lcikgLSBIUlRJTV9NQ1JfTUNFTl9Qb3MpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZIUlRJTXgtPnNNYXN0ZXJSZWdzLk1ESUVSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX09GRlNFVF9UQUJfVElNRVJbaVRpbWVyXSkpOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBIUlRJTV9USU1ESUVSX0RMWVBSVERFKSA9PSAoSFJUSU1fVElNRElFUl9ETFlQUlRERSkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIEhSVElNX0xMX0VGX0luaXQgSW5pdGlhbGlzYXRpb24gYW5kIGRlaW5pdGlhbGlzYXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0hSVElNX0RlSW5pdChIUlRJTV9UeXBlRGVmKiBIUlRJTXgpOworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhSVElNMSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkYzeHhfTExfSFJUSU1fSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjN4eF9sbF9pMmMuaCBiL0luYy9zdG0zMmYzeHhfbGxfaTJjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE5YjEyYgotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmYzeHhfbGxfaTJjLmgKQEAgLTAsMCArMSwyMjQ0IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2xsX2kyYy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBJMkMgTEwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkYzeHhfTExfSTJDX0gKKyNkZWZpbmUgX19TVE0zMkYzeHhfTExfSTJDX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkIChJMkMxKSB8fCBkZWZpbmVkIChJMkMyKSB8fCBkZWZpbmVkIChJMkMzKQorCisvKiogQGRlZmdyb3VwIEkyQ19MTCBJMkMKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX1ByaXZhdGVfQ29uc3RhbnRzIEkyQyBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBJMkNfTExfUHJpdmF0ZV9NYWNyb3MgSTJDIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLypVU0VfRlVMTF9MTF9EUklWRVIqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBJMkNfTExfRVNfSU5JVCBJMkMgRXhwb3J0ZWQgSW5pdCBzdHJ1Y3R1cmUKKyAgKiBAeworICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgUGVyaXBoZXJhbE1vZGU7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHBlcmlwaGVyYWwgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyQ19MTF9FQ19QRVJJUEhFUkFMX01PREUKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfSTJDX1NldE1vZGUoKS4gKi8KKworICB1aW50MzJfdCBUaW1pbmc7ICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgU0RBIHNldHVwLCBob2xkIHRpbWUgYW5kIHRoZSBTQ0wgaGlnaCwgbG93IHBlcmlvZCB2YWx1ZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBzZXQgYnkgcmVmZXJyaW5nIHRvIHRoZSBTVE0zMkN1YmVNWCBUb29sIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0kyQ19DT05WRVJUX1RJTUlOR1MoKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9JMkNfU2V0VGltaW5nKCkuICovCisKKyAgdWludDMyX3QgQW5hbG9nRmlsdGVyOyAgICAgICAgLyohPCBFbmFibGVzIG9yIGRpc2FibGVzIGFuYWxvZyBub2lzZSBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMkNfTExfRUNfQU5BTE9HRklMVEVSX1NFTEVDVElPTgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb25zIEByZWYgTExfSTJDX0VuYWJsZUFuYWxvZ0ZpbHRlcigpIG9yIExMX0kyQ19EaXNhYmxlQW5hbG9nRmlsdGVyKCkuICovCisKKyAgdWludDMyX3QgRGlnaXRhbEZpbHRlcjsgICAgICAgLyohPCBDb25maWd1cmVzIHRoZSBkaWdpdGFsIG5vaXNlIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHgwRgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9JMkNfU2V0RGlnaXRhbEZpbHRlcigpLiAqLworCisgIHVpbnQzMl90IE93bkFkZHJlc3MxOyAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBkZXZpY2Ugb3duIGFkZHJlc3MgMS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHgzRkYKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfSTJDX1NldE93bkFkZHJlc3MxKCkuICovCisKKyAgdWludDMyX3QgVHlwZUFja25vd2xlZGdlOyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIEFDS25vd2xlZGdlIG9yIE5vbiBBQ0tub3dsZWRnZSBjb25kaXRpb24gYWZ0ZXIgdGhlIGFkZHJlc3MgcmVjZWl2ZSBtYXRjaCBjb2RlIG9yIG5leHQgcmVjZWl2ZWQgYnl0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyQ19MTF9FQ19JMkNfQUNLTk9XTEVER0UKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfSTJDX0Fja25vd2xlZGdlTmV4dERhdGEoKS4gKi8KKworICB1aW50MzJfdCBPd25BZGRyU2l6ZTsgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZGV2aWNlIG93biBhZGRyZXNzIDEgc2l6ZSAoNy1iaXQgb3IgMTAtYml0KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyQ19MTF9FQ19PV05BRERSRVNTMQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9JMkNfU2V0T3duQWRkcmVzczEoKS4gKi8KK30gTExfSTJDX0luaXRUeXBlRGVmOworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FeHBvcnRlZF9Db25zdGFudHMgSTJDIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VDX0NMRUFSX0ZMQUcgQ2xlYXIgRmxhZ3MgRGVmaW5lcworICAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfSTJDX1dyaXRlUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJDX0lDUl9BRERSQ0YgICAgICAgICAgICAgICAgICAgSTJDX0lDUl9BRERSQ0YgICAgICAgICAgLyohPCBBZGRyZXNzIE1hdGNoZWQgZmxhZyAgICovCisjZGVmaW5lIExMX0kyQ19JQ1JfTkFDS0NGICAgICAgICAgICAgICAgICAgIEkyQ19JQ1JfTkFDS0NGICAgICAgICAgIC8qITwgTm90IEFja25vd2xlZGdlIGZsYWcgICAqLworI2RlZmluZSBMTF9JMkNfSUNSX1NUT1BDRiAgICAgICAgICAgICAgICAgICBJMkNfSUNSX1NUT1BDRiAgICAgICAgICAvKiE8IFN0b3AgZGV0ZWN0aW9uIGZsYWcgICAgKi8KKyNkZWZpbmUgTExfSTJDX0lDUl9CRVJSQ0YgICAgICAgICAgICAgICAgICAgSTJDX0lDUl9CRVJSQ0YgICAgICAgICAgLyohPCBCdXMgZXJyb3IgZmxhZyAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19JQ1JfQVJMT0NGICAgICAgICAgICAgICAgICAgIEkyQ19JQ1JfQVJMT0NGICAgICAgICAgIC8qITwgQXJiaXRyYXRpb24gTG9zdCBmbGFnICAqLworI2RlZmluZSBMTF9JMkNfSUNSX09WUkNGICAgICAgICAgICAgICAgICAgICBJMkNfSUNSX09WUkNGICAgICAgICAgICAvKiE8IE92ZXJydW4vVW5kZXJydW4gZmxhZyAgKi8KKyNkZWZpbmUgTExfSTJDX0lDUl9QRUNDRiAgICAgICAgICAgICAgICAgICAgSTJDX0lDUl9QRUNDRiAgICAgICAgICAgLyohPCBQRUMgZXJyb3IgZmxhZyAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19JQ1JfVElNT1VUQ0YgICAgICAgICAgICAgICAgIEkyQ19JQ1JfVElNT1VUQ0YgICAgICAgIC8qITwgVGltZW91dCBkZXRlY3Rpb24gZmxhZyAqLworI2RlZmluZSBMTF9JMkNfSUNSX0FMRVJUQ0YgICAgICAgICAgICAgICAgICBJMkNfSUNSX0FMRVJUQ0YgICAgICAgICAvKiE8IEFsZXJ0IGZsYWcgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VDX0dFVF9GTEFHIEdldCBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9JMkNfUmVhZFJlZyBmdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0kyQ19JU1JfVFhFICAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfVFhFICAgICAgICAgICAgIC8qITwgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0lTUl9UWElTICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9UWElTICAgICAgICAgICAgLyohPCBUcmFuc21pdCBpbnRlcnJ1cHQgc3RhdHVzICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfSVNSX1JYTkUgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX1JYTkUgICAgICAgICAgICAvKiE8IFJlY2VpdmUgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgICAgICovCisjZGVmaW5lIExMX0kyQ19JU1JfQUREUiAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfQUREUiAgICAgICAgICAgIC8qITwgQWRkcmVzcyBtYXRjaGVkIChzbGF2ZSBtb2RlKSAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0lTUl9OQUNLRiAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9OQUNLRiAgICAgICAgICAgLyohPCBOb3QgQWNrbm93bGVkZ2UgcmVjZWl2ZWQgZmxhZyAgICAgICAqLworI2RlZmluZSBMTF9JMkNfSVNSX1NUT1BGICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX1NUT1BGICAgICAgICAgICAvKiE8IFN0b3AgZGV0ZWN0aW9uIGZsYWcgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19JU1JfVEMgICAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfVEMgICAgICAgICAgICAgIC8qITwgVHJhbnNmZXIgQ29tcGxldGUgKG1hc3RlciBtb2RlKSAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0lTUl9UQ1IgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9UQ1IgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBDb21wbGV0ZSBSZWxvYWQgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfSVNSX0JFUlIgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX0JFUlIgICAgICAgICAgICAvKiE8IEJ1cyBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19JU1JfQVJMTyAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfQVJMTyAgICAgICAgICAgIC8qITwgQXJiaXRyYXRpb24gbG9zdCAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0lTUl9PVlIgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9PVlIgICAgICAgICAgICAgLyohPCBPdmVycnVuL1VuZGVycnVuIChzbGF2ZSBtb2RlKSAgICAgICAqLworI2RlZmluZSBMTF9JMkNfSVNSX1BFQ0VSUiAgICAgICAgICAgICAgICAgICBJMkNfSVNSX1BFQ0VSUiAgICAgICAgICAvKiE8IFBFQyBFcnJvciBpbiByZWNlcHRpb24gKFNNQnVzIG1vZGUpICovCisjZGVmaW5lIExMX0kyQ19JU1JfVElNRU9VVCAgICAgICAgICAgICAgICAgIEkyQ19JU1JfVElNRU9VVCAgICAgICAgIC8qITwgVGltZW91dCBkZXRlY3Rpb24gZmxhZyAoU01CdXMgbW9kZSkgKi8KKyNkZWZpbmUgTExfSTJDX0lTUl9BTEVSVCAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9BTEVSVCAgICAgICAgICAgLyohPCBTTUJ1cyBhbGVydCAoU01CdXMgbW9kZSkgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfSVNSX0JVU1kgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX0JVU1kgICAgICAgICAgICAvKiE8IEJ1cyBidXN5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FQ19JVCBJVCBEZWZpbmVzCisgICogQGJyaWVmICAgIElUIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9JMkNfUmVhZFJlZyBhbmQgIExMX0kyQ19Xcml0ZVJlZyBmdW5jdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMkNfQ1IxX1RYSUUgICAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX1RYSUUgICAgICAgICAgICAvKiE8IFRYIEludGVycnVwdCBlbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0NSMV9SWElFICAgICAgICAgICAgICAgICAgICAgSTJDX0NSMV9SWElFICAgICAgICAgICAgLyohPCBSWCBJbnRlcnJ1cHQgZW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19DUjFfQUREUklFICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfQUREUklFICAgICAgICAgIC8qITwgQWRkcmVzcyBtYXRjaCBJbnRlcnJ1cHQgZW5hYmxlIChzbGF2ZSBvbmx5KSAqLworI2RlZmluZSBMTF9JMkNfQ1IxX05BQ0tJRSAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX05BQ0tJRSAgICAgICAgICAvKiE8IE5vdCBhY2tub3dsZWRnZSByZWNlaXZlZCBJbnRlcnJ1cHQgZW5hYmxlICAgKi8KKyNkZWZpbmUgTExfSTJDX0NSMV9TVE9QSUUgICAgICAgICAgICAgICAgICAgSTJDX0NSMV9TVE9QSUUgICAgICAgICAgLyohPCBTVE9QIGRldGVjdGlvbiBJbnRlcnJ1cHQgZW5hYmxlICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19DUjFfVENJRSAgICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfVENJRSAgICAgICAgICAgIC8qITwgVHJhbnNmZXIgQ29tcGxldGUgaW50ZXJydXB0IGVuYWJsZSAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfQ1IxX0VSUklFICAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX0VSUklFICAgICAgICAgICAvKiE8IEVycm9yIGludGVycnVwdHMgZW5hYmxlICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VDX1BFUklQSEVSQUxfTU9ERSBQZXJpcGhlcmFsIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMkNfTU9ERV9JMkMgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAvKiE8IEkyQyBNYXN0ZXIgb3IgU2xhdmUgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19NT0RFX1NNQlVTX0hPU1QgICAgICAgICAgICAgSTJDX0NSMV9TTUJIRU4gICAgICAgICAgIC8qITwgU01CdXMgSG9zdCBhZGRyZXNzIGFja25vd2xlZGdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX01PREVfU01CVVNfREVWSUNFICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgLyohPCBTTUJ1cyBEZXZpY2UgZGVmYXVsdCBtb2RlIChEZWZhdWx0IGFkZHJlc3Mgbm90IGFja25vd2xlZGdlKSAqLworI2RlZmluZSBMTF9JMkNfTU9ERV9TTUJVU19ERVZJQ0VfQVJQICAgICAgIEkyQ19DUjFfU01CREVOICAgICAgICAgICAvKiE8IFNNQnVzIERldmljZSBEZWZhdWx0IGFkZHJlc3MgYWNrbm93bGVkZ2UgICAgICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FQ19BTkFMT0dGSUxURVJfU0VMRUNUSU9OIEFuYWxvZyBGaWx0ZXIgU2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJDX0FOQUxPR0ZJTFRFUl9FTkFCTEUgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBBbmFsb2cgZmlsdGVyIGlzIGVuYWJsZWQuICAqLworI2RlZmluZSBMTF9JMkNfQU5BTE9HRklMVEVSX0RJU0FCTEUgICAgICAgICBJMkNfQ1IxX0FORk9GRiAgICAgICAgICAvKiE8IEFuYWxvZyBmaWx0ZXIgaXMgZGlzYWJsZWQuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FQ19BRERSRVNTSU5HX01PREUgTWFzdGVyIEFkZHJlc3NpbmcgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0kyQ19BRERSRVNTSU5HX01PREVfN0JJVCAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAvKiE8IE1hc3RlciBvcGVyYXRlcyBpbiA3LWJpdCBhZGRyZXNzaW5nIG1vZGUuICovCisjZGVmaW5lIExMX0kyQ19BRERSRVNTSU5HX01PREVfMTBCSVQgICAgICAgIEkyQ19DUjJfQUREMTAgICAgICAgICAgICAvKiE8IE1hc3RlciBvcGVyYXRlcyBpbiAxMC1iaXQgYWRkcmVzc2luZyBtb2RlLiovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FQ19PV05BRERSRVNTMSBPd24gQWRkcmVzcyAxIExlbmd0aAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0kyQ19PV05BRERSRVNTMV83QklUICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgT3duIGFkZHJlc3MgMSBpcyBhIDctYml0IGFkZHJlc3MuICovCisjZGVmaW5lIExMX0kyQ19PV05BRERSRVNTMV8xMEJJVCAgICAgICAgICAgIEkyQ19PQVIxX09BMU1PREUgICAgICAgIC8qITwgT3duIGFkZHJlc3MgMSBpcyBhIDEwLWJpdCBhZGRyZXNzLiovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FQ19PV05BRERSRVNTMiBPd24gQWRkcmVzcyAyIE1hc2tzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJDX09XTkFERFJFU1MyX05PTUFTSyAgICAgICAgICAgSTJDX09BUjJfT0EyTk9NQVNLICAgICAgLyohPCBPd24gQWRkcmVzczIgTm8gbWFzay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19PV05BRERSRVNTMl9NQVNLMDEgICAgICAgICAgIEkyQ19PQVIyX09BMk1BU0swMSAgICAgIC8qITwgT25seSBBZGRyZXNzMiBiaXRzWzc6Ml0gYXJlIGNvbXBhcmVkLiAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfT1dOQUREUkVTUzJfTUFTSzAyICAgICAgICAgICBJMkNfT0FSMl9PQTJNQVNLMDIgICAgICAvKiE8IE9ubHkgQWRkcmVzczIgYml0c1s3OjNdIGFyZSBjb21wYXJlZC4gICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX09XTkFERFJFU1MyX01BU0swMyAgICAgICAgICAgSTJDX09BUjJfT0EyTUFTSzAzICAgICAgLyohPCBPbmx5IEFkZHJlc3MyIGJpdHNbNzo0XSBhcmUgY29tcGFyZWQuICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19PV05BRERSRVNTMl9NQVNLMDQgICAgICAgICAgIEkyQ19PQVIyX09BMk1BU0swNCAgICAgIC8qITwgT25seSBBZGRyZXNzMiBiaXRzWzc6NV0gYXJlIGNvbXBhcmVkLiAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfT1dOQUREUkVTUzJfTUFTSzA1ICAgICAgICAgICBJMkNfT0FSMl9PQTJNQVNLMDUgICAgICAvKiE8IE9ubHkgQWRkcmVzczIgYml0c1s3OjZdIGFyZSBjb21wYXJlZC4gICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX09XTkFERFJFU1MyX01BU0swNiAgICAgICAgICAgSTJDX09BUjJfT0EyTUFTSzA2ICAgICAgLyohPCBPbmx5IEFkZHJlc3MyIGJpdHNbN10gYXJlIGNvbXBhcmVkLiAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19PV05BRERSRVNTMl9NQVNLMDcgICAgICAgICAgIEkyQ19PQVIyX09BMk1BU0swNyAgICAgIC8qITwgTm8gY29tcGFyaXNvbiBpcyBkb25lLiBBbGwgQWRkcmVzczIgYXJlIGFja25vd2xlZGdlZC4qLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUNfSTJDX0FDS05PV0xFREdFIEFja25vd2xlZGdlIEdlbmVyYXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMkNfQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgLyohPCBBQ0sgaXMgc2VudCBhZnRlciBjdXJyZW50IHJlY2VpdmVkIGJ5dGUuICovCisjZGVmaW5lIExMX0kyQ19OQUNLICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19DUjJfTkFDSyAgICAgICAgICAgICAvKiE8IE5BQ0sgaXMgc2VudCBhZnRlciBjdXJyZW50IHJlY2VpdmVkIGJ5dGUuKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VDX0FERFJTTEFWRSBTbGF2ZSBBZGRyZXNzIExlbmd0aAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0kyQ19BRERSU0xBVkVfN0JJVCAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAvKiE8IFNsYXZlIEFkZHJlc3MgaW4gNy1iaXQuICovCisjZGVmaW5lIExMX0kyQ19BRERSU0xBVkVfMTBCSVQgICAgICAgICAgICAgIEkyQ19DUjJfQUREMTAgICAgICAgICAgICAvKiE8IFNsYXZlIEFkZHJlc3MgaW4gMTAtYml0LiovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FQ19SRVFVRVNUIFRyYW5zZmVyIFJlcXVlc3QgRGlyZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJDX1JFUVVFU1RfV1JJVEUgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgIC8qITwgTWFzdGVyIHJlcXVlc3QgYSB3cml0ZSB0cmFuc2Zlci4gKi8KKyNkZWZpbmUgTExfSTJDX1JFUVVFU1RfUkVBRCAgICAgICAgICAgICAgICAgSTJDX0NSMl9SRF9XUk4gICAgICAgICAgIC8qITwgTWFzdGVyIHJlcXVlc3QgYSByZWFkIHRyYW5zZmVyLiAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VDX01PREUgVHJhbnNmZXIgRW5kIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMkNfTU9ERV9SRUxPQUQgICAgICAgICAgICAgICAgICBJMkNfQ1IyX1JFTE9BRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFbmFibGUgSTJDIFJlbG9hZCBtb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX01PREVfQVVUT0VORCAgICAgICAgICAgICAgICAgSTJDX0NSMl9BVVRPRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRW5hYmxlIEkyQyBBdXRvbWF0aWMgZW5kIG1vZGUgd2l0aCBubyBIVyBQRUMgY29tcGFyaXNvbi4gICovCisjZGVmaW5lIExMX0kyQ19NT0RFX1NPRlRFTkQgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuYWJsZSBJMkMgU29mdHdhcmUgZW5kIG1vZGUgd2l0aCBubyBIVyBQRUMgY29tcGFyaXNvbi4gICAqLworI2RlZmluZSBMTF9JMkNfTU9ERV9TTUJVU19SRUxPQUQgICAgICAgICAgICBMTF9JMkNfTU9ERV9SRUxPQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFbmFibGUgU01CVVMgQXV0b21hdGljIGVuZCBtb2RlIHdpdGggSFcgUEVDIGNvbXBhcmlzb24uICAgKi8KKyNkZWZpbmUgTExfSTJDX01PREVfU01CVVNfQVVUT0VORF9OT19QRUMgICAgTExfSTJDX01PREVfQVVUT0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRW5hYmxlIFNNQlVTIEF1dG9tYXRpYyBlbmQgbW9kZSB3aXRoIEhXIFBFQyBjb21wYXJpc29uLiAgICovCisjZGVmaW5lIExMX0kyQ19NT0RFX1NNQlVTX1NPRlRFTkRfTk9fUEVDICAgIExMX0kyQ19NT0RFX1NPRlRFTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuYWJsZSBTTUJVUyBTb2Z0d2FyZSBlbmQgbW9kZSB3aXRoIEhXIFBFQyBjb21wYXJpc29uLiAgICAqLworI2RlZmluZSBMTF9JMkNfTU9ERV9TTUJVU19BVVRPRU5EX1dJVEhfUEVDICAodWludDMyX3QpKExMX0kyQ19NT0RFX0FVVE9FTkQgfCBJMkNfQ1IyX1BFQ0JZVEUpICAgLyohPCBFbmFibGUgU01CVVMgQXV0b21hdGljIGVuZCBtb2RlIHdpdGggSFcgUEVDIGNvbXBhcmlzb24uICAgKi8KKyNkZWZpbmUgTExfSTJDX01PREVfU01CVVNfU09GVEVORF9XSVRIX1BFQyAgKHVpbnQzMl90KShMTF9JMkNfTU9ERV9TT0ZURU5EIHwgSTJDX0NSMl9QRUNCWVRFKSAgIC8qITwgRW5hYmxlIFNNQlVTIFNvZnR3YXJlIGVuZCBtb2RlIHdpdGggSFcgUEVDIGNvbXBhcmlzb24uICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FQ19HRU5FUkFURSBTdGFydCBBbmQgU3RvcCBHZW5lcmF0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJDX0dFTkVSQVRFX05PU1RBUlRTVE9QICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEb24ndCBHZW5lcmF0ZSBTdG9wIGFuZCBTdGFydCBjb25kaXRpb24uICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19HRU5FUkFURV9TVE9QICAgICAgICAgICAgICAgICh1aW50MzJfdCkoMHg4MDAwMDAwMFUgfCBJMkNfQ1IyX1NUT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgR2VuZXJhdGUgU3RvcCBjb25kaXRpb24gKFNpemUgc2hvdWxkIGJlIHNldCB0byAwKS4gICAgICAqLworI2RlZmluZSBMTF9JMkNfR0VORVJBVEVfU1RBUlRfUkVBRCAgICAgICAgICAodWludDMyX3QpKDB4ODAwMDAwMDBVIHwgSTJDX0NSMl9TVEFSVCB8IEkyQ19DUjJfUkRfV1JOKSAgICAgICAgICAgICAgICAgICAvKiE8IEdlbmVyYXRlIFN0YXJ0IGZvciByZWFkIHJlcXVlc3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0dFTkVSQVRFX1NUQVJUX1dSSVRFICAgICAgICAgKHVpbnQzMl90KSgweDgwMDAwMDAwVSB8IEkyQ19DUjJfU1RBUlQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBHZW5lcmF0ZSBTdGFydCBmb3Igd3JpdGUgcmVxdWVzdC4gICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19HRU5FUkFURV9SRVNUQVJUXzdCSVRfUkVBRCAgICh1aW50MzJfdCkoMHg4MDAwMDAwMFUgfCBJMkNfQ1IyX1NUQVJUIHwgSTJDX0NSMl9SRF9XUk4pICAgICAgICAgICAgICAgICAgIC8qITwgR2VuZXJhdGUgUmVzdGFydCBmb3IgcmVhZCByZXF1ZXN0LCBzbGF2ZSA3Qml0IGFkZHJlc3MuICAqLworI2RlZmluZSBMTF9JMkNfR0VORVJBVEVfUkVTVEFSVF83QklUX1dSSVRFICAodWludDMyX3QpKDB4ODAwMDAwMDBVIHwgSTJDX0NSMl9TVEFSVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEdlbmVyYXRlIFJlc3RhcnQgZm9yIHdyaXRlIHJlcXVlc3QsIHNsYXZlIDdCaXQgYWRkcmVzcy4gKi8KKyNkZWZpbmUgTExfSTJDX0dFTkVSQVRFX1JFU1RBUlRfMTBCSVRfUkVBRCAgKHVpbnQzMl90KSgweDgwMDAwMDAwVSB8IEkyQ19DUjJfU1RBUlQgfCBJMkNfQ1IyX1JEX1dSTiB8IEkyQ19DUjJfSEVBRDEwUikgLyohPCBHZW5lcmF0ZSBSZXN0YXJ0IGZvciByZWFkIHJlcXVlc3QsIHNsYXZlIDEwQml0IGFkZHJlc3MuICovCisjZGVmaW5lIExMX0kyQ19HRU5FUkFURV9SRVNUQVJUXzEwQklUX1dSSVRFICh1aW50MzJfdCkoMHg4MDAwMDAwMFUgfCBJMkNfQ1IyX1NUQVJUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgR2VuZXJhdGUgUmVzdGFydCBmb3Igd3JpdGUgcmVxdWVzdCwgc2xhdmUgMTBCaXQgYWRkcmVzcy4qLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUNfRElSRUNUSU9OIFJlYWQgV3JpdGUgRGlyZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJDX0RJUkVDVElPTl9XUklURSAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgIC8qITwgV3JpdGUgdHJhbnNmZXIgcmVxdWVzdCBieSBtYXN0ZXIsIHNsYXZlIGVudGVycyByZWNlaXZlciBtb2RlLiAgKi8KKyNkZWZpbmUgTExfSTJDX0RJUkVDVElPTl9SRUFEICAgICAgICAgICAgICAgSTJDX0lTUl9ESVIgICAgICAgICAgICAgIC8qITwgUmVhZCB0cmFuc2ZlciByZXF1ZXN0IGJ5IG1hc3Rlciwgc2xhdmUgZW50ZXJzIHRyYW5zbWl0dGVyIG1vZGUuKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VDX0RNQV9SRUdfREFUQSBETUEgUmVnaXN0ZXIgRGF0YQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0kyQ19ETUFfUkVHX0RBVEFfVFJBTlNNSVQgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAvKiE8IEdldCBhZGRyZXNzIG9mIGRhdGEgcmVnaXN0ZXIgdXNlZCBmb3IgdHJhbnNtaXNzaW9uICovCisjZGVmaW5lIExMX0kyQ19ETUFfUkVHX0RBVEFfUkVDRUlWRSAgICAgICAgIDB4MDAwMDAwMDFVICAgICAgICAgICAgICAvKiE8IEdldCBhZGRyZXNzIG9mIGRhdGEgcmVnaXN0ZXIgdXNlZCBmb3IgcmVjZXB0aW9uICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FQ19TTUJVU19USU1FT1VUQV9NT0RFIFNNQnVzIFRpbWVvdXRBIE1vZGUgU0NMIFNEQSBUaW1lb3V0CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJDX1NNQlVTX1RJTUVPVVRBX01PREVfU0NMX0xPVyAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgIC8qITwgVGltZW91dEEgaXMgdXNlZCB0byBkZXRlY3QgU0NMIGxvdyBsZXZlbCB0aW1lb3V0LiAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX1NNQlVTX1RJTUVPVVRBX01PREVfU0RBX1NDTF9ISUdIIEkyQ19USU1FT1VUUl9USURMRSAgIC8qITwgVGltZW91dEEgaXMgdXNlZCB0byBkZXRlY3QgYm90aCBTQ0wgYW5kIFNEQSBoaWdoIGxldmVsIHRpbWVvdXQuKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VDX1NNQlVTX1RJTUVPVVRfU0VMRUNUSU9OIFNNQnVzIFRpbWVvdXQgU2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJDX1NNQlVTX1RJTUVPVVRBICAgICAgICAgICAgICAgSTJDX1RJTUVPVVRSX1RJTU9VVEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWVvdXRBIGVuYWJsZSBiaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19TTUJVU19USU1FT1VUQiAgICAgICAgICAgICAgIEkyQ19USU1FT1VUUl9URVhURU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaW1lb3V0QiAoZXh0ZW5kZWQgY2xvY2spIGVuYWJsZSBiaXQgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfU01CVVNfQUxMX1RJTUVPVVQgICAgICAgICAgICAodWludDMyX3QpKEkyQ19USU1FT1VUUl9USU1PVVRFTiB8IEkyQ19USU1FT1VUUl9URVhURU4pIC8qITwgVGltZW91dEEgYW5kIFRpbWVvdXRCIChleHRlbmRlZCBjbG9jaykgZW5hYmxlIGJpdHMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FeHBvcnRlZF9NYWNyb3MgSTJDIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gSTJDIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gSTJDIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9JMkNfV3JpdGVSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fLCBfX1ZBTFVFX18pIFdSSVRFX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18sIChfX1ZBTFVFX18pKQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBJMkMgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBJMkMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfSTJDX1JlYWRSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fKSBSRUFEX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18pCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FTV9DT05WRVJUX1RJTUlOR1MgQ29udmVydCBTREEgU0NMIHRpbWluZ3MKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFNEQSBzZXR1cCwgaG9sZCB0aW1lIGFuZCB0aGUgU0NMIGhpZ2gsIGxvdyBwZXJpb2QuCisgICogQHBhcmFtICBfX1BSRVNDQUxFUl9fIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuICBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weEYuCisgICogQHBhcmFtICBfX0RBVEFfU0VUVVBfVElNRV9fIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4Ri4gKHRzY2xkZWwgPSAoU0NMREVMKzEpeHRwcmVzYykKKyAgKiBAcGFyYW0gIF9fREFUQV9IT0xEX1RJTUVfXyBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weEYuICh0c2RhZGVsID0gU0RBREVMeHRwcmVzYykKKyAgKiBAcGFyYW0gIF9fQ0xPQ0tfSElHSF9QRVJJT0RfXyBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weEZGLiAodHNjbGggPSAoU0NMSCsxKXh0cHJlc2MpCisgICogQHBhcmFtICBfX0NMT0NLX0xPV19QRVJJT0RfXyBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAgTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGRi4gKHRzY2xsID0gKFNDTEwrMSl4dHByZXNjKQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weEZGRkZGRkZGCisgICovCisjZGVmaW5lIF9fTExfSTJDX0NPTlZFUlRfVElNSU5HUyhfX1BSRVNDQUxFUl9fLCBfX0RBVEFfU0VUVVBfVElNRV9fLCBfX0RBVEFfSE9MRF9USU1FX18sIF9fQ0xPQ0tfSElHSF9QRVJJT0RfXywgX19DTE9DS19MT1dfUEVSSU9EX18pICAgXAorICAgICAgICAoKCgodWludDMyX3QpKF9fUFJFU0NBTEVSX18pICAgICAgICAgPDwgSTJDX1RJTUlOR1JfUFJFU0NfUG9zKSAgJiBJMkNfVElNSU5HUl9QUkVTQykgICB8IFwKKyAgICAgICAgICgoKHVpbnQzMl90KShfX0RBVEFfU0VUVVBfVElNRV9fKSAgIDw8IEkyQ19USU1JTkdSX1NDTERFTF9Qb3MpICYgSTJDX1RJTUlOR1JfU0NMREVMKSAgfCBcCisgICAgICAgICAoKCh1aW50MzJfdCkoX19EQVRBX0hPTERfVElNRV9fKSAgICA8PCBJMkNfVElNSU5HUl9TREFERUxfUG9zKSAmIEkyQ19USU1JTkdSX1NEQURFTCkgIHwgXAorICAgICAgICAgKCgodWludDMyX3QpKF9fQ0xPQ0tfSElHSF9QRVJJT0RfXykgPDwgSTJDX1RJTUlOR1JfU0NMSF9Qb3MpICAgJiBJMkNfVElNSU5HUl9TQ0xIKSAgICB8IFwKKyAgICAgICAgICgoKHVpbnQzMl90KShfX0NMT0NLX0xPV19QRVJJT0RfXykgIDw8IEkyQ19USU1JTkdSX1NDTExfUG9zKSAgICYgSTJDX1RJTUlOR1JfU0NMTCkpCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJMkNfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIEkyQyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FRl9Db25maWd1cmF0aW9uIENvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBJMkMgcGVyaXBoZXJhbCAoUEUgPSAxKS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBQRSAgICAgICAgICAgIExMX0kyQ19FbmFibGUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZShJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfUEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgSTJDIHBlcmlwaGVyYWwgKFBFID0gMCkuCisgICogQG5vdGUgICBXaGVuIFBFID0gMCwgdGhlIEkyQyBTQ0wgYW5kIFNEQSBsaW5lcyBhcmUgcmVsZWFzZWQuCisgICogICAgICAgICBJbnRlcm5hbCBzdGF0ZSBtYWNoaW5lcyBhbmQgc3RhdHVzIGJpdHMgYXJlIHB1dCBiYWNrIHRvIHRoZWlyIHJlc2V0IHZhbHVlLgorICAqICAgICAgICAgV2hlbiBjbGVhcmVkLCBQRSBtdXN0IGJlIGtlcHQgbG93IGZvciBhdCBsZWFzdCAzIEFQQiBjbG9jayBjeWNsZXMuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUEUgICAgICAgICAgICBMTF9JMkNfRGlzYWJsZQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZShJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgQ0xFQVJfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9QRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIEkyQyBwZXJpcGhlcmFsIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUEUgICAgICAgICAgICBMTF9JMkNfSXNFbmFibGVkCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNFbmFibGVkKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKFJFQURfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9QRSkgPT0gKEkyQ19DUjFfUEUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgTm9pc2UgRmlsdGVycyAoQW5hbG9nIGFuZCBEaWdpdGFsKS4KKyAgKiBAbm90ZSAgIElmIHRoZSBhbmFsb2cgZmlsdGVyIGlzIGFsc28gZW5hYmxlZCwgdGhlIGRpZ2l0YWwgZmlsdGVyIGlzIGFkZGVkIHRvIGFuYWxvZyBmaWx0ZXIuCisgICogICAgICAgICBUaGUgZmlsdGVycyBjYW4gb25seSBiZSBwcm9ncmFtbWVkIHdoZW4gdGhlIEkyQyBpcyBkaXNhYmxlZCAoUEUgPSAwKS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBBTkZPRkYgICAgICAgIExMX0kyQ19Db25maWdGaWx0ZXJzXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBETkYgICAgICAgICAgIExMX0kyQ19Db25maWdGaWx0ZXJzCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIEFuYWxvZ0ZpbHRlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19BTkFMT0dGSUxURVJfRU5BQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX0FOQUxPR0ZJTFRFUl9ESVNBQkxFCisgICogQHBhcmFtICBEaWdpdGFsRmlsdGVyIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgKERpZ2l0YWwgZmlsdGVyIGRpc2FibGVkKSBhbmQgTWF4X0RhdGE9MHgwRiAoRGlnaXRhbCBmaWx0ZXIgZW5hYmxlZCBhbmQgZmlsdGVyaW5nIGNhcGFiaWxpdHkgdXAgdG8gMTUqdGkyY2NsaykuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgZGlnaXRhbCBub2lzZSBmaWx0ZXIgb24gU0RBIGFuZCBTQ0wgaW5wdXQuCisgICogICAgICAgICBUaGUgZGlnaXRhbCBmaWx0ZXIgd2lsbCBmaWx0ZXIgc3Bpa2VzIHdpdGggYSBsZW5ndGggb2YgdXAgdG8gRE5GWzM6MF0qdGkyY2Nsay4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19Db25maWdGaWx0ZXJzKEkyQ19UeXBlRGVmICpJMkN4LCB1aW50MzJfdCBBbmFsb2dGaWx0ZXIsIHVpbnQzMl90IERpZ2l0YWxGaWx0ZXIpCit7CisgIE1PRElGWV9SRUcoSTJDeC0+Q1IxLCBJMkNfQ1IxX0FORk9GRiB8IEkyQ19DUjFfRE5GLCBBbmFsb2dGaWx0ZXIgfCAoRGlnaXRhbEZpbHRlciA8PCBJMkNfQ1IxX0RORl9Qb3MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgRGlnaXRhbCBOb2lzZSBGaWx0ZXIuCisgICogQG5vdGUgICBJZiB0aGUgYW5hbG9nIGZpbHRlciBpcyBhbHNvIGVuYWJsZWQsIHRoZSBkaWdpdGFsIGZpbHRlciBpcyBhZGRlZCB0byBhbmFsb2cgZmlsdGVyLgorICAqICAgICAgICAgVGhpcyBmaWx0ZXIgY2FuIG9ubHkgYmUgcHJvZ3JhbW1lZCB3aGVuIHRoZSBJMkMgaXMgZGlzYWJsZWQgKFBFID0gMCkuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgRE5GICAgICAgICAgICBMTF9JMkNfU2V0RGlnaXRhbEZpbHRlcgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBEaWdpdGFsRmlsdGVyIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgKERpZ2l0YWwgZmlsdGVyIGRpc2FibGVkKSBhbmQgTWF4X0RhdGE9MHgwRiAoRGlnaXRhbCBmaWx0ZXIgZW5hYmxlZCBhbmQgZmlsdGVyaW5nIGNhcGFiaWxpdHkgdXAgdG8gMTUqdGkyY2NsaykuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgZGlnaXRhbCBub2lzZSBmaWx0ZXIgb24gU0RBIGFuZCBTQ0wgaW5wdXQuCisgICogICAgICAgICBUaGUgZGlnaXRhbCBmaWx0ZXIgd2lsbCBmaWx0ZXIgc3Bpa2VzIHdpdGggYSBsZW5ndGggb2YgdXAgdG8gRE5GWzM6MF0qdGkyY2Nsay4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19TZXREaWdpdGFsRmlsdGVyKEkyQ19UeXBlRGVmICpJMkN4LCB1aW50MzJfdCBEaWdpdGFsRmlsdGVyKQoreworICBNT0RJRllfUkVHKEkyQ3gtPkNSMSwgSTJDX0NSMV9ETkYsIERpZ2l0YWxGaWx0ZXIgPDwgSTJDX0NSMV9ETkZfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGN1cnJlbnQgRGlnaXRhbCBOb2lzZSBGaWx0ZXIgY29uZmlndXJhdGlvbi4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBETkYgICAgICAgICAgIExMX0kyQ19HZXREaWdpdGFsRmlsdGVyCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwIGFuZCBNYXhfRGF0YT0weEYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfR2V0RGlnaXRhbEZpbHRlcihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX0RORikgPj4gSTJDX0NSMV9ETkZfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQW5hbG9nIE5vaXNlIEZpbHRlci4KKyAgKiBAbm90ZSAgIFRoaXMgZmlsdGVyIGNhbiBvbmx5IGJlIHByb2dyYW1tZWQgd2hlbiB0aGUgSTJDIGlzIGRpc2FibGVkIChQRSA9IDApLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEFORk9GRiAgICAgICAgTExfSTJDX0VuYWJsZUFuYWxvZ0ZpbHRlcgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlQW5hbG9nRmlsdGVyKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX0FORk9GRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBbmFsb2cgTm9pc2UgRmlsdGVyLgorICAqIEBub3RlICAgVGhpcyBmaWx0ZXIgY2FuIG9ubHkgYmUgcHJvZ3JhbW1lZCB3aGVuIHRoZSBJMkMgaXMgZGlzYWJsZWQgKFBFID0gMCkuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQU5GT0ZGICAgICAgICBMTF9JMkNfRGlzYWJsZUFuYWxvZ0ZpbHRlcgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZUFuYWxvZ0ZpbHRlcihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfQU5GT0ZGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBBbmFsb2cgTm9pc2UgRmlsdGVyIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQU5GT0ZGICAgICAgICBMTF9JMkNfSXNFbmFibGVkQW5hbG9nRmlsdGVyCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNFbmFibGVkQW5hbG9nRmlsdGVyKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKFJFQURfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9BTkZPRkYpICE9IChJMkNfQ1IxX0FORk9GRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBETUEgdHJhbnNtaXNzaW9uIHJlcXVlc3RzLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRYRE1BRU4gICAgICAgTExfSTJDX0VuYWJsZURNQVJlcV9UWAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlRE1BUmVxX1RYKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9UWERNQUVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIERNQSB0cmFuc21pc3Npb24gcmVxdWVzdHMuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVFhETUFFTiAgICAgICBMTF9JMkNfRGlzYWJsZURNQVJlcV9UWAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZURNQVJlcV9UWChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgQ0xFQVJfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9UWERNQUVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBETUEgdHJhbnNtaXNzaW9uIHJlcXVlc3RzIGFyZSBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRYRE1BRU4gICAgICAgTExfSTJDX0lzRW5hYmxlZERNQVJlcV9UWAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzRW5hYmxlZERNQVJlcV9UWChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfVFhETUFFTikgPT0gKEkyQ19DUjFfVFhETUFFTikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBETUEgcmVjZXB0aW9uIHJlcXVlc3RzLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJYRE1BRU4gICAgICAgTExfSTJDX0VuYWJsZURNQVJlcV9SWAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlRE1BUmVxX1JYKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9SWERNQUVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIERNQSByZWNlcHRpb24gcmVxdWVzdHMuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUlhETUFFTiAgICAgICBMTF9JMkNfRGlzYWJsZURNQVJlcV9SWAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZURNQVJlcV9SWChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgQ0xFQVJfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9SWERNQUVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBETUEgcmVjZXB0aW9uIHJlcXVlc3RzIGFyZSBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJYRE1BRU4gICAgICAgTExfSTJDX0lzRW5hYmxlZERNQVJlcV9SWAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzRW5hYmxlZERNQVJlcV9SWChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfUlhETUFFTikgPT0gKEkyQ19DUjFfUlhETUFFTikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgZGF0YSByZWdpc3RlciBhZGRyZXNzIHVzZWQgZm9yIERNQSB0cmFuc2ZlcgorICAqIEBybXRvbGwgVFhEUiAgICAgICAgIFRYREFUQSAgICAgICAgTExfSTJDX0RNQV9HZXRSZWdBZGRyXG4KKyAgKiAgICAgICAgIFJYRFIgICAgICAgICBSWERBVEEgICAgICAgIExMX0kyQ19ETUFfR2V0UmVnQWRkcgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIERpcmVjdGlvbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19ETUFfUkVHX0RBVEFfVFJBTlNNSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfRE1BX1JFR19EQVRBX1JFQ0VJVkUKKyAgKiBAcmV0dmFsIEFkZHJlc3Mgb2YgZGF0YSByZWdpc3RlcgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19ETUFfR2V0UmVnQWRkcihJMkNfVHlwZURlZiAqSTJDeCwgdWludDMyX3QgRGlyZWN0aW9uKQoreworICByZWdpc3RlciB1aW50MzJfdCBkYXRhX3JlZ19hZGRyID0gMFU7CisKKyAgaWYgKERpcmVjdGlvbiA9PSBMTF9JMkNfRE1BX1JFR19EQVRBX1RSQU5TTUlUKQorICB7CisgICAgLyogcmV0dXJuIGFkZHJlc3Mgb2YgVFhEUiByZWdpc3RlciAqLworICAgIGRhdGFfcmVnX2FkZHIgPSAodWludDMyX3QpICYgKEkyQ3gtPlRYRFIpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIHJldHVybiBhZGRyZXNzIG9mIFJYRFIgcmVnaXN0ZXIgKi8KKyAgICBkYXRhX3JlZ19hZGRyID0gKHVpbnQzMl90KSAmIChJMkN4LT5SWERSKTsKKyAgfQorCisgIHJldHVybiBkYXRhX3JlZ19hZGRyOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBDbG9jayBzdHJldGNoaW5nLgorICAqIEBub3RlICAgVGhpcyBiaXQgY2FuIG9ubHkgYmUgcHJvZ3JhbW1lZCB3aGVuIHRoZSBJMkMgaXMgZGlzYWJsZWQgKFBFID0gMCkuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTk9TVFJFVENIICAgICBMTF9JMkNfRW5hYmxlQ2xvY2tTdHJldGNoaW5nCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19FbmFibGVDbG9ja1N0cmV0Y2hpbmcoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIENMRUFSX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfTk9TVFJFVENIKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIENsb2NrIHN0cmV0Y2hpbmcuCisgICogQG5vdGUgICBUaGlzIGJpdCBjYW4gb25seSBiZSBwcm9ncmFtbWVkIHdoZW4gdGhlIEkyQyBpcyBkaXNhYmxlZCAoUEUgPSAwKS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBOT1NUUkVUQ0ggICAgIExMX0kyQ19EaXNhYmxlQ2xvY2tTdHJldGNoaW5nCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19EaXNhYmxlQ2xvY2tTdHJldGNoaW5nKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9OT1NUUkVUQ0gpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIENsb2NrIHN0cmV0Y2hpbmcgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBOT1NUUkVUQ0ggICAgIExMX0kyQ19Jc0VuYWJsZWRDbG9ja1N0cmV0Y2hpbmcKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRDbG9ja1N0cmV0Y2hpbmcoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX05PU1RSRVRDSCkgIT0gKEkyQ19DUjFfTk9TVFJFVENIKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGhhcmR3YXJlIGJ5dGUgY29udHJvbCBpbiBzbGF2ZSBtb2RlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFNCQyAgICAgICAgICAgTExfSTJDX0VuYWJsZVNsYXZlQnl0ZUNvbnRyb2wKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZVNsYXZlQnl0ZUNvbnRyb2woSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1NCQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBoYXJkd2FyZSBieXRlIGNvbnRyb2wgaW4gc2xhdmUgbW9kZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBTQkMgICAgICAgICAgIExMX0kyQ19EaXNhYmxlU2xhdmVCeXRlQ29udHJvbAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZVNsYXZlQnl0ZUNvbnRyb2woSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIENMRUFSX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfU0JDKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBoYXJkd2FyZSBieXRlIGNvbnRyb2wgaW4gc2xhdmUgbW9kZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFNCQyAgICAgICAgICAgTExfSTJDX0lzRW5hYmxlZFNsYXZlQnl0ZUNvbnRyb2wKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRTbGF2ZUJ5dGVDb250cm9sKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKFJFQURfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9TQkMpID09IChJMkNfQ1IxX1NCQykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBXYWtldXAgZnJvbSBTVE9QLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19JMkNfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBXYWtlVXBGcm9tU3RvcCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFRoaXMgYml0IGNhbiBvbmx5IGJlIHByb2dyYW1tZWQgd2hlbiBEaWdpdGFsIEZpbHRlciBpcyBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBXVVBFTiAgICAgICAgIExMX0kyQ19FbmFibGVXYWtlVXBGcm9tU3RvcAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlV2FrZVVwRnJvbVN0b3AoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1dVUEVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFdha2V1cCBmcm9tIFNUT1AuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX0kyQ19XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFdha2VVcEZyb21TdG9wIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFdVUEVOICAgICAgICAgTExfSTJDX0Rpc2FibGVXYWtlVXBGcm9tU3RvcAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZVdha2VVcEZyb21TdG9wKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1dVUEVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBXYWtldXAgZnJvbSBTVE9QIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX0kyQ19XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFdha2VVcEZyb21TdG9wIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFdVUEVOICAgICAgICAgTExfSTJDX0lzRW5hYmxlZFdha2VVcEZyb21TdG9wCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNFbmFibGVkV2FrZVVwRnJvbVN0b3AoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1dVUEVOKSA9PSAoSTJDX0NSMV9XVVBFTikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBHZW5lcmFsIENhbGwuCisgICogQG5vdGUgICBXaGVuIGVuYWJsZWQgdGhlIEFkZHJlc3MgMHgwMCBpcyBBQ0tlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBHQ0VOICAgICAgICAgIExMX0kyQ19FbmFibGVHZW5lcmFsQ2FsbAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlR2VuZXJhbENhbGwoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX0dDRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgR2VuZXJhbCBDYWxsLgorICAqIEBub3RlICAgV2hlbiBkaXNhYmxlZCB0aGUgQWRkcmVzcyAweDAwIGlzIE5BQ0tlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBHQ0VOICAgICAgICAgIExMX0kyQ19EaXNhYmxlR2VuZXJhbENhbGwKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0Rpc2FibGVHZW5lcmFsQ2FsbChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgQ0xFQVJfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9HQ0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBHZW5lcmFsIENhbGwgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBHQ0VOICAgICAgICAgIExMX0kyQ19Jc0VuYWJsZWRHZW5lcmFsQ2FsbAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzRW5hYmxlZEdlbmVyYWxDYWxsKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKFJFQURfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9HQ0VOKSA9PSAoSTJDX0NSMV9HQ0VOKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBNYXN0ZXIgdG8gb3BlcmF0ZSBpbiA3LWJpdCBvciAxMC1iaXQgYWRkcmVzc2luZyBtb2RlLgorICAqIEBub3RlICAgQ2hhbmdpbmcgdGhpcyBiaXQgaXMgbm90IGFsbG93ZWQsIHdoZW4gdGhlIFNUQVJUIGJpdCBpcyBzZXQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQUREMTAgICAgICAgICBMTF9JMkNfU2V0TWFzdGVyQWRkcmVzc2luZ01vZGUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgQWRkcmVzc2luZ01vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfQUREUkVTU0lOR19NT0RFXzdCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfQUREUkVTU0lOR19NT0RFXzEwQklUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfU2V0TWFzdGVyQWRkcmVzc2luZ01vZGUoSTJDX1R5cGVEZWYgKkkyQ3gsIHVpbnQzMl90IEFkZHJlc3NpbmdNb2RlKQoreworICBNT0RJRllfUkVHKEkyQ3gtPkNSMiwgSTJDX0NSMl9BREQxMCwgQWRkcmVzc2luZ01vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgTWFzdGVyIGFkZHJlc3NpbmcgbW9kZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBBREQxMCAgICAgICAgIExMX0kyQ19HZXRNYXN0ZXJBZGRyZXNzaW5nTW9kZQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19BRERSRVNTSU5HX01PREVfN0JJVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19BRERSRVNTSU5HX01PREVfMTBCSVQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfR2V0TWFzdGVyQWRkcmVzc2luZ01vZGUoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEkyQ3gtPkNSMiwgSTJDX0NSMl9BREQxMCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgT3duIEFkZHJlc3MxLgorICAqIEBybXRvbGwgT0FSMSAgICAgICAgIE9BMSAgICAgICAgICAgTExfSTJDX1NldE93bkFkZHJlc3MxXG4KKyAgKiAgICAgICAgIE9BUjEgICAgICAgICBPQTFNT0RFICAgICAgIExMX0kyQ19TZXRPd25BZGRyZXNzMQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBPd25BZGRyZXNzMSBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weDNGRi4KKyAgKiBAcGFyYW0gIE93bkFkZHJTaXplIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX09XTkFERFJFU1MxXzdCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfT1dOQUREUkVTUzFfMTBCSVQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19TZXRPd25BZGRyZXNzMShJMkNfVHlwZURlZiAqSTJDeCwgdWludDMyX3QgT3duQWRkcmVzczEsIHVpbnQzMl90IE93bkFkZHJTaXplKQoreworICBNT0RJRllfUkVHKEkyQ3gtPk9BUjEsIEkyQ19PQVIxX09BMSB8IEkyQ19PQVIxX09BMU1PREUsIE93bkFkZHJlc3MxIHwgT3duQWRkclNpemUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBhY2tub3dsZWRnZSBvbiBPd24gQWRkcmVzczEgbWF0Y2ggYWRkcmVzcy4KKyAgKiBAcm10b2xsIE9BUjEgICAgICAgICBPQTFFTiAgICAgICAgIExMX0kyQ19FbmFibGVPd25BZGRyZXNzMQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlT3duQWRkcmVzczEoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+T0FSMSwgSTJDX09BUjFfT0ExRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgYWNrbm93bGVkZ2Ugb24gT3duIEFkZHJlc3MxIG1hdGNoIGFkZHJlc3MuCisgICogQHJtdG9sbCBPQVIxICAgICAgICAgT0ExRU4gICAgICAgICBMTF9JMkNfRGlzYWJsZU93bkFkZHJlc3MxCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19EaXNhYmxlT3duQWRkcmVzczEoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIENMRUFSX0JJVChJMkN4LT5PQVIxLCBJMkNfT0FSMV9PQTFFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgT3duIEFkZHJlc3MxIGFja25vd2xlZGdlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBPQVIxICAgICAgICAgT0ExRU4gICAgICAgICBMTF9JMkNfSXNFbmFibGVkT3duQWRkcmVzczEKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRPd25BZGRyZXNzMShJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChJMkN4LT5PQVIxLCBJMkNfT0FSMV9PQTFFTikgPT0gKEkyQ19PQVIxX09BMUVOKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSA3Yml0cyBPd24gQWRkcmVzczIuCisgICogQG5vdGUgICBUaGlzIGFjdGlvbiBoYXMgbm8gZWZmZWN0IGlmIG93biBhZGRyZXNzMiBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgT0FSMiAgICAgICAgIE9BMiAgICAgICAgICAgTExfSTJDX1NldE93bkFkZHJlc3MyXG4KKyAgKiAgICAgICAgIE9BUjIgICAgICAgICBPQTJNU0sgICAgICAgIExMX0kyQ19TZXRPd25BZGRyZXNzMgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBPd25BZGRyZXNzMiBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4N0YuCisgICogQHBhcmFtICBPd25BZGRyTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19PV05BRERSRVNTMl9OT01BU0sKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfT1dOQUREUkVTUzJfTUFTSzAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX09XTkFERFJFU1MyX01BU0swMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19PV05BRERSRVNTMl9NQVNLMDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfT1dOQUREUkVTUzJfTUFTSzA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX09XTkFERFJFU1MyX01BU0swNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19PV05BRERSRVNTMl9NQVNLMDYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfT1dOQUREUkVTUzJfTUFTSzA3CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfU2V0T3duQWRkcmVzczIoSTJDX1R5cGVEZWYgKkkyQ3gsIHVpbnQzMl90IE93bkFkZHJlc3MyLCB1aW50MzJfdCBPd25BZGRyTWFzaykKK3sKKyAgTU9ESUZZX1JFRyhJMkN4LT5PQVIyLCBJMkNfT0FSMl9PQTIgfCBJMkNfT0FSMl9PQTJNU0ssIE93bkFkZHJlc3MyIHwgT3duQWRkck1hc2spOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBhY2tub3dsZWRnZSBvbiBPd24gQWRkcmVzczIgbWF0Y2ggYWRkcmVzcy4KKyAgKiBAcm10b2xsIE9BUjIgICAgICAgICBPQTJFTiAgICAgICAgIExMX0kyQ19FbmFibGVPd25BZGRyZXNzMgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlT3duQWRkcmVzczIoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+T0FSMiwgSTJDX09BUjJfT0EyRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgIGFja25vd2xlZGdlIG9uIE93biBBZGRyZXNzMiBtYXRjaCBhZGRyZXNzLgorICAqIEBybXRvbGwgT0FSMiAgICAgICAgIE9BMkVOICAgICAgICAgTExfSTJDX0Rpc2FibGVPd25BZGRyZXNzMgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZU93bkFkZHJlc3MyKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+T0FSMiwgSTJDX09BUjJfT0EyRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIE93biBBZGRyZXNzMSBhY2tub3dsZWRnZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgT0FSMiAgICAgICAgIE9BMkVOICAgICAgICAgTExfSTJDX0lzRW5hYmxlZE93bkFkZHJlc3MyCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNFbmFibGVkT3duQWRkcmVzczIoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoSTJDeC0+T0FSMiwgSTJDX09BUjJfT0EyRU4pID09IChJMkNfT0FSMl9PQTJFTikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgU0RBIHNldHVwLCBob2xkIHRpbWUgYW5kIHRoZSBTQ0wgaGlnaCwgbG93IHBlcmlvZC4KKyAgKiBAbm90ZSAgIFRoaXMgYml0IGNhbiBvbmx5IGJlIHByb2dyYW1tZWQgd2hlbiB0aGUgSTJDIGlzIGRpc2FibGVkIChQRSA9IDApLgorICAqIEBybXRvbGwgVElNSU5HUiAgICAgIFRJTUlOR1IgICAgICAgTExfSTJDX1NldFRpbWluZworICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBUaW1pbmcgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGRkZGRkZGRi4KKyAgKiBAbm90ZSAgIFRoaXMgcGFyYW1ldGVyIGlzIGNvbXB1dGVkIHdpdGggdGhlIFNUTTMyQ3ViZU1YIFRvb2wuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfU2V0VGltaW5nKEkyQ19UeXBlRGVmICpJMkN4LCB1aW50MzJfdCBUaW1pbmcpCit7CisgIFdSSVRFX1JFRyhJMkN4LT5USU1JTkdSLCBUaW1pbmcpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgVGltaW5nIFByZXNjYWxlciBzZXR0aW5nLgorICAqIEBybXRvbGwgVElNSU5HUiAgICAgIFBSRVNDICAgICAgICAgTExfSTJDX0dldFRpbWluZ1ByZXNjYWxlcgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MCBhbmQgTWF4X0RhdGE9MHhGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0dldFRpbWluZ1ByZXNjYWxlcihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoSTJDeC0+VElNSU5HUiwgSTJDX1RJTUlOR1JfUFJFU0MpID4+IEkyQ19USU1JTkdSX1BSRVNDX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBTQ0wgbG93IHBlcmlvZCBzZXR0aW5nLgorICAqIEBybXRvbGwgVElNSU5HUiAgICAgIFNDTEwgICAgICAgICAgTExfSTJDX0dldENsb2NrTG93UGVyaW9kCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19HZXRDbG9ja0xvd1BlcmlvZChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoSTJDeC0+VElNSU5HUiwgSTJDX1RJTUlOR1JfU0NMTCkgPj4gSTJDX1RJTUlOR1JfU0NMTF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgU0NMIGhpZ2ggcGVyaW9kIHNldHRpbmcuCisgICogQHJtdG9sbCBUSU1JTkdSICAgICAgU0NMSCAgICAgICAgICBMTF9JMkNfR2V0Q2xvY2tIaWdoUGVyaW9kCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19HZXRDbG9ja0hpZ2hQZXJpb2QoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEkyQ3gtPlRJTUlOR1IsIEkyQ19USU1JTkdSX1NDTEgpID4+IEkyQ19USU1JTkdSX1NDTEhfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIFNEQSBob2xkIHRpbWUuCisgICogQHJtdG9sbCBUSU1JTkdSICAgICAgU0RBREVMICAgICAgICBMTF9JMkNfR2V0RGF0YUhvbGRUaW1lCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwIGFuZCBNYXhfRGF0YT0weEYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfR2V0RGF0YUhvbGRUaW1lKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChJMkN4LT5USU1JTkdSLCBJMkNfVElNSU5HUl9TREFERUwpID4+IEkyQ19USU1JTkdSX1NEQURFTF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgU0RBIHNldHVwIHRpbWUuCisgICogQHJtdG9sbCBUSU1JTkdSICAgICAgU0NMREVMICAgICAgICBMTF9JMkNfR2V0RGF0YVNldHVwVGltZQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MCBhbmQgTWF4X0RhdGE9MHhGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0dldERhdGFTZXR1cFRpbWUoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEkyQ3gtPlRJTUlOR1IsIEkyQ19USU1JTkdSX1NDTERFTCkgPj4gSTJDX1RJTUlOR1JfU0NMREVMX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHBlcmlwaGVyYWwgbW9kZS4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBTTUJIRU4gICAgICAgIExMX0kyQ19TZXRNb2RlXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBTTUJERU4gICAgICAgIExMX0kyQ19TZXRNb2RlCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIFBlcmlwaGVyYWxNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX01PREVfSTJDCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX01PREVfU01CVVNfSE9TVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19NT0RFX1NNQlVTX0RFVklDRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19NT0RFX1NNQlVTX0RFVklDRV9BUlAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19TZXRNb2RlKEkyQ19UeXBlRGVmICpJMkN4LCB1aW50MzJfdCBQZXJpcGhlcmFsTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhJMkN4LT5DUjEsIEkyQ19DUjFfU01CSEVOIHwgSTJDX0NSMV9TTUJERU4sIFBlcmlwaGVyYWxNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgcGVyaXBoZXJhbCBtb2RlLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19BTExfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFNNQkhFTiAgICAgICAgTExfSTJDX0dldE1vZGVcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIFNNQkRFTiAgICAgICAgTExfSTJDX0dldE1vZGUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfTU9ERV9JMkMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfTU9ERV9TTUJVU19IT1NUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX01PREVfU01CVVNfREVWSUNFCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX01PREVfU01CVVNfREVWSUNFX0FSUAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19HZXRNb2RlKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfU01CSEVOIHwgSTJDX0NSMV9TTUJERU4pKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgU01CdXMgYWxlcnQgKEhvc3Qgb3IgRGV2aWNlIG1vZGUpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQG5vdGUgICBTTUJ1cyBEZXZpY2UgbW9kZToKKyAgKiAgICAgICAgIC0gU01CdXMgQWxlcnQgcGluIGlzIGRyaXZlZCBsb3cgYW5kCisgICogICAgICAgICAgIEFsZXJ0IFJlc3BvbnNlIEFkZHJlc3MgSGVhZGVyIGFja25vd2xlZGdlIGlzIGVuYWJsZWQuCisgICogICAgICAgICBTTUJ1cyBIb3N0IG1vZGU6CisgICogICAgICAgICAtIFNNQnVzIEFsZXJ0IHBpbiBtYW5hZ2VtZW50IGlzIHN1cHBvcnRlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBBTEVSVEVOICAgICAgIExMX0kyQ19FbmFibGVTTUJ1c0FsZXJ0CisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19FbmFibGVTTUJ1c0FsZXJ0KEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9BTEVSVEVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFNNQnVzIGFsZXJ0IChIb3N0IG9yIERldmljZSBtb2RlKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19BTExfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBub3RlICAgU01CdXMgRGV2aWNlIG1vZGU6CisgICogICAgICAgICAtIFNNQnVzIEFsZXJ0IHBpbiBpcyBub3QgZHJpdmVkIChjYW4gYmUgdXNlZCBhcyBhIHN0YW5kYXJkIEdQSU8pIGFuZAorICAqICAgICAgICAgICBBbGVydCBSZXNwb25zZSBBZGRyZXNzIEhlYWRlciBhY2tub3dsZWRnZSBpcyBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFNNQnVzIEhvc3QgbW9kZToKKyAgKiAgICAgICAgIC0gU01CdXMgQWxlcnQgcGluIG1hbmFnZW1lbnQgaXMgbm90IHN1cHBvcnRlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBBTEVSVEVOICAgICAgIExMX0kyQ19EaXNhYmxlU01CdXNBbGVydAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZVNNQnVzQWxlcnQoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIENMRUFSX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfQUxFUlRFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgU01CdXMgYWxlcnQgKEhvc3Qgb3IgRGV2aWNlIG1vZGUpIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQUxFUlRFTiAgICAgICBMTF9JMkNfSXNFbmFibGVkU01CdXNBbGVydAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzRW5hYmxlZFNNQnVzQWxlcnQoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX0FMRVJURU4pID09IChJMkNfQ1IxX0FMRVJURU4pKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgU01CdXMgUGFja2V0IEVycm9yIENhbGN1bGF0aW9uIChQRUMpLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19BTExfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBFQ0VOICAgICAgICAgTExfSTJDX0VuYWJsZVNNQnVzUEVDCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19FbmFibGVTTUJ1c1BFQyhJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfUEVDRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgU01CdXMgUGFja2V0IEVycm9yIENhbGN1bGF0aW9uIChQRUMpLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19BTExfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBFQ0VOICAgICAgICAgTExfSTJDX0Rpc2FibGVTTUJ1c1BFQworICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZVNNQnVzUEVDKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1BFQ0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBTTUJ1cyBQYWNrZXQgRXJyb3IgQ2FsY3VsYXRpb24gKFBFQykgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBQRUNFTiAgICAgICAgIExMX0kyQ19Jc0VuYWJsZWRTTUJ1c1BFQworICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzRW5hYmxlZFNNQnVzUEVDKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKFJFQURfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9QRUNFTikgPT0gKEkyQ19DUjFfUEVDRU4pKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFNNQnVzIENsb2NrIFRpbWVvdXQuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQG5vdGUgICBUaGlzIGNvbmZpZ3VyYXRpb24gY2FuIG9ubHkgYmUgcHJvZ3JhbW1lZCB3aGVuIGFzc29jaWF0ZWQgVGltZW91dCBpcyBkaXNhYmxlZCAoVGltZW91dEEgYW5kL29yVGltZW91dEIpLgorICAqIEBybXRvbGwgVElNRU9VVFIgICAgIFRJTUVPVVRBICAgICAgTExfSTJDX0NvbmZpZ1NNQnVzVGltZW91dFxuCisgICogICAgICAgICBUSU1FT1VUUiAgICAgVElETEUgICAgICAgICBMTF9JMkNfQ29uZmlnU01CdXNUaW1lb3V0XG4KKyAgKiAgICAgICAgIFRJTUVPVVRSICAgICBUSU1FT1VUQiAgICAgIExMX0kyQ19Db25maWdTTUJ1c1RpbWVvdXQKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgVGltZW91dEEgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4RkZGLgorICAqIEBwYXJhbSAgVGltZW91dEFNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX1NNQlVTX1RJTUVPVVRBX01PREVfU0NMX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19TTUJVU19USU1FT1VUQV9NT0RFX1NEQV9TQ0xfSElHSAorICAqIEBwYXJhbSAgVGltZW91dEIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19Db25maWdTTUJ1c1RpbWVvdXQoSTJDX1R5cGVEZWYgKkkyQ3gsIHVpbnQzMl90IFRpbWVvdXRBLCB1aW50MzJfdCBUaW1lb3V0QU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXRCKQoreworICBNT0RJRllfUkVHKEkyQ3gtPlRJTUVPVVRSLCBJMkNfVElNRU9VVFJfVElNRU9VVEEgfCBJMkNfVElNRU9VVFJfVElETEUgfCBJMkNfVElNRU9VVFJfVElNRU9VVEIsCisgICAgICAgICAgICAgVGltZW91dEEgfCBUaW1lb3V0QU1vZGUgfCAoVGltZW91dEIgPDwgSTJDX1RJTUVPVVRSX1RJTUVPVVRCX1BvcykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgU01CdXMgQ2xvY2sgVGltZW91dEEgKFNDTCBsb3cgdGltZW91dCBvciBTQ0wgYW5kIFNEQSBoaWdoIHRpbWVvdXQgZGVwZW5kcyBvbiBUaW1lb3V0QSBtb2RlKS4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFRoZXNlIGJpdHMgY2FuIG9ubHkgYmUgcHJvZ3JhbW1lZCB3aGVuIFRpbWVvdXRBIGlzIGRpc2FibGVkLgorICAqIEBybXRvbGwgVElNRU9VVFIgICAgIFRJTUVPVVRBICAgICAgTExfSTJDX1NldFNNQnVzVGltZW91dEEKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgVGltZW91dEEgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4RkZGLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX1NldFNNQnVzVGltZW91dEEoSTJDX1R5cGVEZWYgKkkyQ3gsIHVpbnQzMl90IFRpbWVvdXRBKQoreworICBXUklURV9SRUcoSTJDeC0+VElNRU9VVFIsIFRpbWVvdXRBKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIFNNQnVzIENsb2NrIFRpbWVvdXRBIHNldHRpbmcuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQHJtdG9sbCBUSU1FT1VUUiAgICAgVElNRU9VVEEgICAgICBMTF9JMkNfR2V0U01CdXNUaW1lb3V0QQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4RkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0dldFNNQnVzVGltZW91dEEoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEkyQ3gtPlRJTUVPVVRSLCBJMkNfVElNRU9VVFJfVElNRU9VVEEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFNNQnVzIENsb2NrIFRpbWVvdXRBIG1vZGUuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQG5vdGUgICBUaGlzIGJpdCBjYW4gb25seSBiZSBwcm9ncmFtbWVkIHdoZW4gVGltZW91dEEgaXMgZGlzYWJsZWQuCisgICogQHJtdG9sbCBUSU1FT1VUUiAgICAgVElETEUgICAgICAgICBMTF9JMkNfU2V0U01CdXNUaW1lb3V0QU1vZGUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgVGltZW91dEFNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX1NNQlVTX1RJTUVPVVRBX01PREVfU0NMX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19TTUJVU19USU1FT1VUQV9NT0RFX1NEQV9TQ0xfSElHSAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX1NldFNNQnVzVGltZW91dEFNb2RlKEkyQ19UeXBlRGVmICpJMkN4LCB1aW50MzJfdCBUaW1lb3V0QU1vZGUpCit7CisgIFdSSVRFX1JFRyhJMkN4LT5USU1FT1VUUiwgVGltZW91dEFNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIFNNQnVzIENsb2NrIFRpbWVvdXRBIG1vZGUuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQHJtdG9sbCBUSU1FT1VUUiAgICAgVElETEUgICAgICAgICBMTF9JMkNfR2V0U01CdXNUaW1lb3V0QU1vZGUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfU01CVVNfVElNRU9VVEFfTU9ERV9TQ0xfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX1NNQlVTX1RJTUVPVVRBX01PREVfU0RBX1NDTF9ISUdICisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0dldFNNQnVzVGltZW91dEFNb2RlKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChJMkN4LT5USU1FT1VUUiwgSTJDX1RJTUVPVVRSX1RJRExFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBTTUJ1cyBFeHRlbmRlZCBDdW11bGF0aXZlIENsb2NrIFRpbWVvdXRCIChNYXN0ZXIgb3IgU2xhdmUgbW9kZSkuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQG5vdGUgICBUaGVzZSBiaXRzIGNhbiBvbmx5IGJlIHByb2dyYW1tZWQgd2hlbiBUaW1lb3V0QiBpcyBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIFRJTUVPVVRSICAgICBUSU1FT1VUQiAgICAgIExMX0kyQ19TZXRTTUJ1c1RpbWVvdXRCCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIFRpbWVvdXRCIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuICBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weEZGRi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19TZXRTTUJ1c1RpbWVvdXRCKEkyQ19UeXBlRGVmICpJMkN4LCB1aW50MzJfdCBUaW1lb3V0QikKK3sKKyAgV1JJVEVfUkVHKEkyQ3gtPlRJTUVPVVRSLCBUaW1lb3V0QiA8PCBJMkNfVElNRU9VVFJfVElNRU9VVEJfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIFNNQnVzIEV4dGVudGVkIEN1bXVsYXRpdmUgQ2xvY2sgVGltZW91dEIgc2V0dGluZy4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIFRJTUVPVVRSICAgICBUSU1FT1VUQiAgICAgIExMX0kyQ19HZXRTTUJ1c1RpbWVvdXRCCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfR2V0U01CdXNUaW1lb3V0QihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoSTJDeC0+VElNRU9VVFIsIEkyQ19USU1FT1VUUl9USU1FT1VUQikgPj4gSTJDX1RJTUVPVVRSX1RJTUVPVVRCX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBTTUJ1cyBDbG9jayBUaW1lb3V0LgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19BTExfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgVElNRU9VVFIgICAgIFRJTU9VVEVOICAgICAgTExfSTJDX0VuYWJsZVNNQnVzVGltZW91dFxuCisgICogICAgICAgICBUSU1FT1VUUiAgICAgVEVYVEVOICAgICAgICBMTF9JMkNfRW5hYmxlU01CdXNUaW1lb3V0CisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIENsb2NrVGltZW91dCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19TTUJVU19USU1FT1VUQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19TTUJVU19USU1FT1VUQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19TTUJVU19BTExfVElNRU9VVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZVNNQnVzVGltZW91dChJMkNfVHlwZURlZiAqSTJDeCwgdWludDMyX3QgQ2xvY2tUaW1lb3V0KQoreworICBTRVRfQklUKEkyQ3gtPlRJTUVPVVRSLCBDbG9ja1RpbWVvdXQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFNNQnVzIENsb2NrIFRpbWVvdXQuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQHJtdG9sbCBUSU1FT1VUUiAgICAgVElNT1VURU4gICAgICBMTF9JMkNfRGlzYWJsZVNNQnVzVGltZW91dFxuCisgICogICAgICAgICBUSU1FT1VUUiAgICAgVEVYVEVOICAgICAgICBMTF9JMkNfRGlzYWJsZVNNQnVzVGltZW91dAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBDbG9ja1RpbWVvdXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfU01CVVNfVElNRU9VVEEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfU01CVVNfVElNRU9VVEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfU01CVVNfQUxMX1RJTUVPVVQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19EaXNhYmxlU01CdXNUaW1lb3V0KEkyQ19UeXBlRGVmICpJMkN4LCB1aW50MzJfdCBDbG9ja1RpbWVvdXQpCit7CisgIENMRUFSX0JJVChJMkN4LT5USU1FT1VUUiwgQ2xvY2tUaW1lb3V0KTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgU01CdXMgQ2xvY2sgVGltZW91dCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19BTExfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgVElNRU9VVFIgICAgIFRJTU9VVEVOICAgICAgTExfSTJDX0lzRW5hYmxlZFNNQnVzVGltZW91dFxuCisgICogICAgICAgICBUSU1FT1VUUiAgICAgVEVYVEVOICAgICAgICBMTF9JMkNfSXNFbmFibGVkU01CdXNUaW1lb3V0CisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIENsb2NrVGltZW91dCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19TTUJVU19USU1FT1VUQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19TTUJVU19USU1FT1VUQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19TTUJVU19BTExfVElNRU9VVAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRTTUJ1c1RpbWVvdXQoSTJDX1R5cGVEZWYgKkkyQ3gsIHVpbnQzMl90IENsb2NrVGltZW91dCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChJMkN4LT5USU1FT1VUUiwgKEkyQ19USU1FT1VUUl9USU1PVVRFTiB8IEkyQ19USU1FT1VUUl9URVhURU4pKSA9PSAoQ2xvY2tUaW1lb3V0KSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VGX0lUX01hbmFnZW1lbnQgSVRfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFRYSVMgaW50ZXJydXB0LgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRYSUUgICAgICAgICAgTExfSTJDX0VuYWJsZUlUX1RYCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19FbmFibGVJVF9UWChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfVFhJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBUWElTIGludGVycnVwdC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBUWElFICAgICAgICAgIExMX0kyQ19EaXNhYmxlSVRfVFgKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0Rpc2FibGVJVF9UWChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgQ0xFQVJfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9UWElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVFhJUyBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBUWElFICAgICAgICAgIExMX0kyQ19Jc0VuYWJsZWRJVF9UWAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzRW5hYmxlZElUX1RYKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKFJFQURfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9UWElFKSA9PSAoSTJDX0NSMV9UWElFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFJYTkUgaW50ZXJydXB0LgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJYSUUgICAgICAgICAgTExfSTJDX0VuYWJsZUlUX1JYCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19FbmFibGVJVF9SWChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfUlhJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSWE5FIGludGVycnVwdC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSWElFICAgICAgICAgIExMX0kyQ19EaXNhYmxlSVRfUlgKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0Rpc2FibGVJVF9SWChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgQ0xFQVJfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9SWElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgUlhORSBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSWElFICAgICAgICAgIExMX0kyQ19Jc0VuYWJsZWRJVF9SWAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzRW5hYmxlZElUX1JYKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKFJFQURfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9SWElFKSA9PSAoSTJDX0NSMV9SWElFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEFkZHJlc3MgbWF0Y2ggaW50ZXJydXB0IChzbGF2ZSBtb2RlIG9ubHkpLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEFERFJJRSAgICAgICAgTExfSTJDX0VuYWJsZUlUX0FERFIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZUlUX0FERFIoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX0FERFJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBZGRyZXNzIG1hdGNoIGludGVycnVwdCAoc2xhdmUgbW9kZSBvbmx5KS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBBRERSSUUgICAgICAgIExMX0kyQ19EaXNhYmxlSVRfQUREUgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZUlUX0FERFIoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIENMRUFSX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfQUREUklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBBZGRyZXNzIG1hdGNoIGludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEFERFJJRSAgICAgICAgTExfSTJDX0lzRW5hYmxlZElUX0FERFIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRJVF9BRERSKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKFJFQURfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9BRERSSUUpID09IChJMkNfQ1IxX0FERFJJRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBOb3QgYWNrbm93bGVkZ2UgcmVjZWl2ZWQgaW50ZXJydXB0LgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE5BQ0tJRSAgICAgICAgTExfSTJDX0VuYWJsZUlUX05BQ0sKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZUlUX05BQ0soSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX05BQ0tJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBOb3QgYWNrbm93bGVkZ2UgcmVjZWl2ZWQgaW50ZXJydXB0LgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE5BQ0tJRSAgICAgICAgTExfSTJDX0Rpc2FibGVJVF9OQUNLCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19EaXNhYmxlSVRfTkFDSyhJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgQ0xFQVJfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9OQUNLSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIE5vdCBhY2tub3dsZWRnZSByZWNlaXZlZCBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBOQUNLSUUgICAgICAgIExMX0kyQ19Jc0VuYWJsZWRJVF9OQUNLCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNFbmFibGVkSVRfTkFDSyhJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfTkFDS0lFKSA9PSAoSTJDX0NSMV9OQUNLSUUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgU1RPUCBkZXRlY3Rpb24gaW50ZXJydXB0LgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFNUT1BJRSAgICAgICAgTExfSTJDX0VuYWJsZUlUX1NUT1AKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZUlUX1NUT1AoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1NUT1BJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBTVE9QIGRldGVjdGlvbiBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgU1RPUElFICAgICAgICBMTF9JMkNfRGlzYWJsZUlUX1NUT1AKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0Rpc2FibGVJVF9TVE9QKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1NUT1BJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgU1RPUCBkZXRlY3Rpb24gaW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgU1RPUElFICAgICAgICBMTF9JMkNfSXNFbmFibGVkSVRfU1RPUAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzRW5hYmxlZElUX1NUT1AoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1NUT1BJRSkgPT0gKEkyQ19DUjFfU1RPUElFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFRyYW5zZmVyIENvbXBsZXRlIGludGVycnVwdC4KKyAgKiBAbm90ZSAgIEFueSBvZiB0aGVzZSBldmVudHMgd2lsbCBnZW5lcmF0ZSBpbnRlcnJ1cHQgOgorICAqICAgICAgICAgVHJhbnNmZXIgQ29tcGxldGUgKFRDKQorICAqICAgICAgICAgVHJhbnNmZXIgQ29tcGxldGUgUmVsb2FkIChUQ1IpCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVENJRSAgICAgICAgICBMTF9JMkNfRW5hYmxlSVRfVEMKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZUlUX1RDKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9UQ0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFRyYW5zZmVyIENvbXBsZXRlIGludGVycnVwdC4KKyAgKiBAbm90ZSAgIEFueSBvZiB0aGVzZSBldmVudHMgd2lsbCBnZW5lcmF0ZSBpbnRlcnJ1cHQgOgorICAqICAgICAgICAgVHJhbnNmZXIgQ29tcGxldGUgKFRDKQorICAqICAgICAgICAgVHJhbnNmZXIgQ29tcGxldGUgUmVsb2FkIChUQ1IpCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVENJRSAgICAgICAgICBMTF9JMkNfRGlzYWJsZUlUX1RDCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19EaXNhYmxlSVRfVEMoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIENMRUFSX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfVENJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgVHJhbnNmZXIgQ29tcGxldGUgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVENJRSAgICAgICAgICBMTF9JMkNfSXNFbmFibGVkSVRfVEMKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRJVF9UQyhJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfVENJRSkgPT0gKEkyQ19DUjFfVENJRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBFcnJvciBpbnRlcnJ1cHRzLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19BTExfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBub3RlICAgQW55IG9mIHRoZXNlIGVycm9ycyB3aWxsIGdlbmVyYXRlIGludGVycnVwdCA6CisgICogICAgICAgICBBcmJpdHJhdGlvbiBMb3NzIChBUkxPKQorICAqICAgICAgICAgQnVzIEVycm9yIGRldGVjdGlvbiAoQkVSUikKKyAgKiAgICAgICAgIE92ZXJydW4vVW5kZXJydW4gKE9WUikKKyAgKiAgICAgICAgIFNNQnVzIFRpbWVvdXQgZGV0ZWN0aW9uIChUSU1FT1VUKQorICAqICAgICAgICAgU01CdXMgUEVDIGVycm9yIGRldGVjdGlvbiAoUEVDRVJSKQorICAqICAgICAgICAgU01CdXMgQWxlcnQgcGluIGV2ZW50IGRldGVjdGlvbiAoQUxFUlQpCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgRVJSSUUgICAgICAgICBMTF9JMkNfRW5hYmxlSVRfRVJSCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19FbmFibGVJVF9FUlIoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX0VSUklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEVycm9yIGludGVycnVwdHMuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQG5vdGUgICBBbnkgb2YgdGhlc2UgZXJyb3JzIHdpbGwgZ2VuZXJhdGUgaW50ZXJydXB0IDoKKyAgKiAgICAgICAgIEFyYml0cmF0aW9uIExvc3MgKEFSTE8pCisgICogICAgICAgICBCdXMgRXJyb3IgZGV0ZWN0aW9uIChCRVJSKQorICAqICAgICAgICAgT3ZlcnJ1bi9VbmRlcnJ1biAoT1ZSKQorICAqICAgICAgICAgU01CdXMgVGltZW91dCBkZXRlY3Rpb24gKFRJTUVPVVQpCisgICogICAgICAgICBTTUJ1cyBQRUMgZXJyb3IgZGV0ZWN0aW9uIChQRUNFUlIpCisgICogICAgICAgICBTTUJ1cyBBbGVydCBwaW4gZXZlbnQgZGV0ZWN0aW9uIChBTEVSVCkKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBFUlJJRSAgICAgICAgIExMX0kyQ19EaXNhYmxlSVRfRVJSCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19EaXNhYmxlSVRfRVJSKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX0VSUklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBFcnJvciBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEVSUklFICAgICAgICAgTExfSTJDX0lzRW5hYmxlZElUX0VSUgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzRW5hYmxlZElUX0VSUihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfRVJSSUUpID09IChJMkNfQ1IxX0VSUklFKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VGX0ZMQUdfbWFuYWdlbWVudCBGTEFHX21hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHRoZSBzdGF0dXMgb2YgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBmbGFnLgorICAqIEBub3RlICAgUkVTRVQ6IFdoZW4gbmV4dCBkYXRhIGlzIHdyaXR0ZW4gaW4gVHJhbnNtaXQgZGF0YSByZWdpc3Rlci4KKyAgKiAgICAgICAgIFNFVDogV2hlbiBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGlzIGVtcHR5LgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRYRSAgICAgICAgICAgTExfSTJDX0lzQWN0aXZlRmxhZ19UWEUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0FjdGl2ZUZsYWdfVFhFKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKFJFQURfQklUKEkyQ3gtPklTUiwgSTJDX0lTUl9UWEUpID09IChJMkNfSVNSX1RYRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHRoZSBzdGF0dXMgb2YgVHJhbnNtaXQgaW50ZXJydXB0IGZsYWcuCisgICogQG5vdGUgICBSRVNFVDogV2hlbiBuZXh0IGRhdGEgaXMgd3JpdHRlbiBpbiBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyLgorICAqICAgICAgICAgU0VUOiBXaGVuIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgaXMgZW1wdHkuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVFhJUyAgICAgICAgICBMTF9JMkNfSXNBY3RpdmVGbGFnX1RYSVMKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0FjdGl2ZUZsYWdfVFhJUyhJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChJMkN4LT5JU1IsIEkyQ19JU1JfVFhJUykgPT0gKEkyQ19JU1JfVFhJUykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHRoZSBzdGF0dXMgb2YgUmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBmbGFnLgorICAqIEBub3RlICAgUkVTRVQ6IFdoZW4gUmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIGlzIHJlYWQuCisgICogICAgICAgICBTRVQ6IFdoZW4gdGhlIHJlY2VpdmVkIGRhdGEgaXMgY29waWVkIGluIFJlY2VpdmUgZGF0YSByZWdpc3Rlci4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBSWE5FICAgICAgICAgIExMX0kyQ19Jc0FjdGl2ZUZsYWdfUlhORQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzQWN0aXZlRmxhZ19SWE5FKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKFJFQURfQklUKEkyQ3gtPklTUiwgSTJDX0lTUl9SWE5FKSA9PSAoSTJDX0lTUl9SWE5FKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgdGhlIHN0YXR1cyBvZiBBZGRyZXNzIG1hdGNoZWQgZmxhZyAoc2xhdmUgbW9kZSkuCisgICogQG5vdGUgICBSRVNFVDogQ2xlYXIgZGVmYXVsdCB2YWx1ZS4KKyAgKiAgICAgICAgIFNFVDogV2hlbiB0aGUgcmVjZWl2ZWQgc2xhdmUgYWRkcmVzcyBtYXRjaGVkIHdpdGggb25lIG9mIHRoZSBlbmFibGVkIHNsYXZlIGFkZHJlc3MuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQUREUiAgICAgICAgICBMTF9JMkNfSXNBY3RpdmVGbGFnX0FERFIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0FjdGl2ZUZsYWdfQUREUihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChJMkN4LT5JU1IsIEkyQ19JU1JfQUREUikgPT0gKEkyQ19JU1JfQUREUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHRoZSBzdGF0dXMgb2YgTm90IEFja25vd2xlZGdlIHJlY2VpdmVkIGZsYWcuCisgICogQG5vdGUgICBSRVNFVDogQ2xlYXIgZGVmYXVsdCB2YWx1ZS4KKyAgKiAgICAgICAgIFNFVDogV2hlbiBhIE5BQ0sgaXMgcmVjZWl2ZWQgYWZ0ZXIgYSBieXRlIHRyYW5zbWlzc2lvbi4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBOQUNLRiAgICAgICAgIExMX0kyQ19Jc0FjdGl2ZUZsYWdfTkFDSworICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzQWN0aXZlRmxhZ19OQUNLKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKFJFQURfQklUKEkyQ3gtPklTUiwgSTJDX0lTUl9OQUNLRikgPT0gKEkyQ19JU1JfTkFDS0YpKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIFN0b3AgZGV0ZWN0aW9uIGZsYWcuCisgICogQG5vdGUgICBSRVNFVDogQ2xlYXIgZGVmYXVsdCB2YWx1ZS4KKyAgKiAgICAgICAgIFNFVDogV2hlbiBhIFN0b3AgY29uZGl0aW9uIGlzIGRldGVjdGVkLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFNUT1BGICAgICAgICAgTExfSTJDX0lzQWN0aXZlRmxhZ19TVE9QCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNBY3RpdmVGbGFnX1NUT1AoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoSTJDeC0+SVNSLCBJMkNfSVNSX1NUT1BGKSA9PSAoSTJDX0lTUl9TVE9QRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHRoZSBzdGF0dXMgb2YgVHJhbnNmZXIgY29tcGxldGUgZmxhZyAobWFzdGVyIG1vZGUpLgorICAqIEBub3RlICAgUkVTRVQ6IENsZWFyIGRlZmF1bHQgdmFsdWUuCisgICogICAgICAgICBTRVQ6IFdoZW4gUkVMT0FEPTAsIEFVVE9FTkQ9MCBhbmQgTkJZVEVTIGRhdGUgaGF2ZSBiZWVuIHRyYW5zZmVycmVkLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRDICAgICAgICAgICAgTExfSTJDX0lzQWN0aXZlRmxhZ19UQworICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzQWN0aXZlRmxhZ19UQyhJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChJMkN4LT5JU1IsIEkyQ19JU1JfVEMpID09IChJMkNfSVNSX1RDKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgdGhlIHN0YXR1cyBvZiBUcmFuc2ZlciBjb21wbGV0ZSBmbGFnIChtYXN0ZXIgbW9kZSkuCisgICogQG5vdGUgICBSRVNFVDogQ2xlYXIgZGVmYXVsdCB2YWx1ZS4KKyAgKiAgICAgICAgIFNFVDogV2hlbiBSRUxPQUQ9MSBhbmQgTkJZVEVTIGRhdGUgaGF2ZSBiZWVuIHRyYW5zZmVycmVkLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRDUiAgICAgICAgICAgTExfSTJDX0lzQWN0aXZlRmxhZ19UQ1IKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0FjdGl2ZUZsYWdfVENSKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKFJFQURfQklUKEkyQ3gtPklTUiwgSTJDX0lTUl9UQ1IpID09IChJMkNfSVNSX1RDUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHRoZSBzdGF0dXMgb2YgQnVzIGVycm9yIGZsYWcuCisgICogQG5vdGUgICBSRVNFVDogQ2xlYXIgZGVmYXVsdCB2YWx1ZS4KKyAgKiAgICAgICAgIFNFVDogV2hlbiBhIG1pc3BsYWNlZCBTdGFydCBvciBTdG9wIGNvbmRpdGlvbiBpcyBkZXRlY3RlZC4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBCRVJSICAgICAgICAgIExMX0kyQ19Jc0FjdGl2ZUZsYWdfQkVSUgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzQWN0aXZlRmxhZ19CRVJSKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKFJFQURfQklUKEkyQ3gtPklTUiwgSTJDX0lTUl9CRVJSKSA9PSAoSTJDX0lTUl9CRVJSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgdGhlIHN0YXR1cyBvZiBBcmJpdHJhdGlvbiBsb3N0IGZsYWcuCisgICogQG5vdGUgICBSRVNFVDogQ2xlYXIgZGVmYXVsdCB2YWx1ZS4KKyAgKiAgICAgICAgIFNFVDogV2hlbiBhcmJpdHJhdGlvbiBsb3N0LgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEFSTE8gICAgICAgICAgTExfSTJDX0lzQWN0aXZlRmxhZ19BUkxPCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNBY3RpdmVGbGFnX0FSTE8oSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoSTJDeC0+SVNSLCBJMkNfSVNSX0FSTE8pID09IChJMkNfSVNSX0FSTE8pKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIE92ZXJydW4vVW5kZXJydW4gZmxhZyAoc2xhdmUgbW9kZSkuCisgICogQG5vdGUgICBSRVNFVDogQ2xlYXIgZGVmYXVsdCB2YWx1ZS4KKyAgKiAgICAgICAgIFNFVDogV2hlbiBhbiBvdmVycnVuL3VuZGVycnVuIGVycm9yIG9jY3VycyAoQ2xvY2sgU3RyZXRjaGluZyBEaXNhYmxlZCkuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgT1ZSICAgICAgICAgICBMTF9JMkNfSXNBY3RpdmVGbGFnX09WUgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzQWN0aXZlRmxhZ19PVlIoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoSTJDeC0+SVNSLCBJMkNfSVNSX09WUikgPT0gKEkyQ19JU1JfT1ZSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgdGhlIHN0YXR1cyBvZiBTTUJ1cyBQRUMgZXJyb3IgZmxhZyBpbiByZWNlcHRpb24uCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQG5vdGUgICBSRVNFVDogQ2xlYXIgZGVmYXVsdCB2YWx1ZS4KKyAgKiAgICAgICAgIFNFVDogV2hlbiB0aGUgcmVjZWl2ZWQgUEVDIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIFBFQyByZWdpc3RlciBjb250ZW50LgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFBFQ0VSUiAgICAgICAgTExfSTJDX0lzQWN0aXZlU01CdXNGbGFnX1BFQ0VSUgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzQWN0aXZlU01CdXNGbGFnX1BFQ0VSUihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChJMkN4LT5JU1IsIEkyQ19JU1JfUEVDRVJSKSA9PSAoSTJDX0lTUl9QRUNFUlIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIFNNQnVzIFRpbWVvdXQgZGV0ZWN0aW9uIGZsYWcuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQG5vdGUgICBSRVNFVDogQ2xlYXIgZGVmYXVsdCB2YWx1ZS4KKyAgKiAgICAgICAgIFNFVDogV2hlbiBhIHRpbWVvdXQgb3IgZXh0ZW5kZWQgY2xvY2sgdGltZW91dCBvY2N1cnMuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVElNRU9VVCAgICAgICBMTF9JMkNfSXNBY3RpdmVTTUJ1c0ZsYWdfVElNRU9VVAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzQWN0aXZlU01CdXNGbGFnX1RJTUVPVVQoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoSTJDeC0+SVNSLCBJMkNfSVNSX1RJTUVPVVQpID09IChJMkNfSVNSX1RJTUVPVVQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIFNNQnVzIGFsZXJ0IGZsYWcuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQG5vdGUgICBSRVNFVDogQ2xlYXIgZGVmYXVsdCB2YWx1ZS4KKyAgKiAgICAgICAgIFNFVDogV2hlbiBTTUJ1cyBob3N0IGNvbmZpZ3VyYXRpb24sIFNNQnVzIGFsZXJ0IGVuYWJsZWQgYW5kCisgICogICAgICAgICAgICAgIGEgZmFsbGluZyBlZGdlIGV2ZW50IG9jY3VycyBvbiBTTUJBIHBpbi4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBBTEVSVCAgICAgICAgIExMX0kyQ19Jc0FjdGl2ZVNNQnVzRmxhZ19BTEVSVAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzQWN0aXZlU01CdXNGbGFnX0FMRVJUKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKFJFQURfQklUKEkyQ3gtPklTUiwgSTJDX0lTUl9BTEVSVCkgPT0gKEkyQ19JU1JfQUxFUlQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIEJ1cyBCdXN5IGZsYWcuCisgICogQG5vdGUgICBSRVNFVDogQ2xlYXIgZGVmYXVsdCB2YWx1ZS4KKyAgKiAgICAgICAgIFNFVDogV2hlbiBhIFN0YXJ0IGNvbmRpdGlvbiBpcyBkZXRlY3RlZC4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBCVVNZICAgICAgICAgIExMX0kyQ19Jc0FjdGl2ZUZsYWdfQlVTWQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzQWN0aXZlRmxhZ19CVVNZKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKFJFQURfQklUKEkyQ3gtPklTUiwgSTJDX0lTUl9CVVNZKSA9PSAoSTJDX0lTUl9CVVNZKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQWRkcmVzcyBNYXRjaGVkIGZsYWcuCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgQUREUkNGICAgICAgICBMTF9JMkNfQ2xlYXJGbGFnX0FERFIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0NsZWFyRmxhZ19BRERSKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPklDUiwgSTJDX0lDUl9BRERSQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIE5vdCBBY2tub3dsZWRnZSBmbGFnLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIE5BQ0tDRiAgICAgICAgTExfSTJDX0NsZWFyRmxhZ19OQUNLCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19DbGVhckZsYWdfTkFDSyhJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5JQ1IsIEkyQ19JQ1JfTkFDS0NGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBTdG9wIGRldGVjdGlvbiBmbGFnLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIFNUT1BDRiAgICAgICAgTExfSTJDX0NsZWFyRmxhZ19TVE9QCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19DbGVhckZsYWdfU1RPUChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5JQ1IsIEkyQ19JQ1JfU1RPUENGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGZsYWcgKFRYRSkuCisgICogQG5vdGUgICBUaGlzIGJpdCBjYW4gYmUgY2xlYXIgYnkgc29mdHdhcmUgaW4gb3JkZXIgdG8gZmx1c2ggdGhlIHRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgKFRYRFIpLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRYRSAgICAgICAgICAgTExfSTJDX0NsZWFyRmxhZ19UWEUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0NsZWFyRmxhZ19UWEUoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFdSSVRFX1JFRyhJMkN4LT5JU1IsIEkyQ19JU1JfVFhFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBCdXMgZXJyb3IgZmxhZy4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBCRVJSQ0YgICAgICAgIExMX0kyQ19DbGVhckZsYWdfQkVSUgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfQ2xlYXJGbGFnX0JFUlIoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+SUNSLCBJMkNfSUNSX0JFUlJDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQXJiaXRyYXRpb24gbG9zdCBmbGFnLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIEFSTE9DRiAgICAgICAgTExfSTJDX0NsZWFyRmxhZ19BUkxPCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19DbGVhckZsYWdfQVJMTyhJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5JQ1IsIEkyQ19JQ1JfQVJMT0NGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBPdmVycnVuL1VuZGVycnVuIGZsYWcuCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgT1ZSQ0YgICAgICAgICBMTF9JMkNfQ2xlYXJGbGFnX09WUgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfQ2xlYXJGbGFnX09WUihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5JQ1IsIEkyQ19JQ1JfT1ZSQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFNNQnVzIFBFQyBlcnJvciBmbGFnLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19BTExfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIFBFQ0NGICAgICAgICAgTExfSTJDX0NsZWFyU01CdXNGbGFnX1BFQ0VSUgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfQ2xlYXJTTUJ1c0ZsYWdfUEVDRVJSKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPklDUiwgSTJDX0lDUl9QRUNDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU01CdXMgVGltZW91dCBkZXRlY3Rpb24gZmxhZy4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBUSU1PVVRDRiAgICAgIExMX0kyQ19DbGVhclNNQnVzRmxhZ19USU1FT1VUCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19DbGVhclNNQnVzRmxhZ19USU1FT1VUKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPklDUiwgSTJDX0lDUl9USU1PVVRDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU01CdXMgQWxlcnQgZmxhZy4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBBTEVSVENGICAgICAgIExMX0kyQ19DbGVhclNNQnVzRmxhZ19BTEVSVAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfQ2xlYXJTTUJ1c0ZsYWdfQUxFUlQoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+SUNSLCBJMkNfSUNSX0FMRVJUQ0YpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FRl9EYXRhX01hbmFnZW1lbnQgRGF0YV9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgYXV0b21hdGljIFNUT1AgY29uZGl0aW9uIGdlbmVyYXRpb24gKG1hc3RlciBtb2RlKS4KKyAgKiBAbm90ZSAgIEF1dG9tYXRpYyBlbmQgbW9kZSA6IGEgU1RPUCBjb25kaXRpb24gaXMgYXV0b21hdGljYWxseSBzZW50IHdoZW4gTkJZVEVTIGRhdGEgYXJlIHRyYW5zZmVycmVkLgorICAqICAgICAgICAgVGhpcyBiaXQgaGFzIG5vIGVmZmVjdCBpbiBzbGF2ZSBtb2RlIG9yIHdoZW4gUkVMT0FEIGJpdCBpcyBzZXQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQVVUT0VORCAgICAgICBMTF9JMkNfRW5hYmxlQXV0b0VuZE1vZGUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZUF1dG9FbmRNb2RlKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPkNSMiwgSTJDX0NSMl9BVVRPRU5EKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGF1dG9tYXRpYyBTVE9QIGNvbmRpdGlvbiBnZW5lcmF0aW9uIChtYXN0ZXIgbW9kZSkuCisgICogQG5vdGUgICBTb2Z0d2FyZSBlbmQgbW9kZSA6IFRDIGZsYWcgaXMgc2V0IHdoZW4gTkJZVEVTIGRhdGEgYXJlIHRyYW5zZmVycmUsIHN0cmV0Y2hpbmcgU0NMIGxvdy4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBBVVRPRU5EICAgICAgIExMX0kyQ19EaXNhYmxlQXV0b0VuZE1vZGUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0Rpc2FibGVBdXRvRW5kTW9kZShJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgQ0xFQVJfQklUKEkyQ3gtPkNSMiwgSTJDX0NSMl9BVVRPRU5EKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBhdXRvbWF0aWMgU1RPUCBjb25kaXRpb24gaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBBVVRPRU5EICAgICAgIExMX0kyQ19Jc0VuYWJsZWRBdXRvRW5kTW9kZQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzRW5hYmxlZEF1dG9FbmRNb2RlKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKFJFQURfQklUKEkyQ3gtPkNSMiwgSTJDX0NSMl9BVVRPRU5EKSA9PSAoSTJDX0NSMl9BVVRPRU5EKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHJlbG9hZCBtb2RlIChtYXN0ZXIgbW9kZSkuCisgICogQG5vdGUgICBUaGUgdHJhbnNmZXIgaXMgbm90IGNvbXBsZXRlZCBhZnRlciB0aGUgTkJZVEVTIGRhdGEgdHJhbnNmZXIsIE5CWVRFUyB3aWxsIGJlIHJlbG9hZGVkIHdoZW4gVENSIGZsYWcgaXMgc2V0LgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJFTE9BRCAgICAgICBMTF9JMkNfRW5hYmxlUmVsb2FkTW9kZQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlUmVsb2FkTW9kZShJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5DUjIsIEkyQ19DUjJfUkVMT0FEKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHJlbG9hZCBtb2RlIChtYXN0ZXIgbW9kZSkuCisgICogQG5vdGUgICBUaGUgdHJhbnNmZXIgaXMgY29tcGxldGVkIGFmdGVyIHRoZSBOQllURVMgZGF0YSB0cmFuc2ZlcihTVE9QIG9yIFJFU1RBUlQgd2lsbCBmb2xsb3cpLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJFTE9BRCAgICAgICBMTF9JMkNfRGlzYWJsZVJlbG9hZE1vZGUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0Rpc2FibGVSZWxvYWRNb2RlKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+Q1IyLCBJMkNfQ1IyX1JFTE9BRCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgcmVsb2FkIG1vZGUgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBSRUxPQUQgICAgICAgTExfSTJDX0lzRW5hYmxlZFJlbG9hZE1vZGUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRSZWxvYWRNb2RlKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKFJFQURfQklUKEkyQ3gtPkNSMiwgSTJDX0NSMl9SRUxPQUQpID09IChJMkNfQ1IyX1JFTE9BRCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZvciB0cmFuc2Zlci4KKyAgKiBAbm90ZSAgIENoYW5naW5nIHRoZXNlIGJpdHMgd2hlbiBTVEFSVCBiaXQgaXMgc2V0IGlzIG5vdCBhbGxvd2VkLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIE5CWVRFUyAgICAgICAgICAgTExfSTJDX1NldFRyYW5zZmVyU2l6ZQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBUcmFuc2ZlclNpemUgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19TZXRUcmFuc2ZlclNpemUoSTJDX1R5cGVEZWYgKkkyQ3gsIHVpbnQzMl90IFRyYW5zZmVyU2l6ZSkKK3sKKyAgTU9ESUZZX1JFRyhJMkN4LT5DUjIsIEkyQ19DUjJfTkJZVEVTLCBUcmFuc2ZlclNpemUgPDwgSTJDX0NSMl9OQllURVNfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIG51bWJlciBvZiBieXRlcyBjb25maWd1cmVkIGZvciB0cmFuc2Zlci4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBOQllURVMgICAgICAgICAgIExMX0kyQ19HZXRUcmFuc2ZlclNpemUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfR2V0VHJhbnNmZXJTaXplKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChJMkN4LT5DUjIsIEkyQ19DUjJfTkJZVEVTKSA+PiBJMkNfQ1IyX05CWVRFU19Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFByZXBhcmUgdGhlIGdlbmVyYXRpb24gb2YgYSBBQ0tub3dsZWRnZSBvciBOb24gQUNLbm93bGVkZ2UgY29uZGl0aW9uIGFmdGVyIHRoZSBhZGRyZXNzIHJlY2VpdmUgbWF0Y2ggY29kZSBvciBuZXh0IHJlY2VpdmVkIGJ5dGUuCisgICogQG5vdGUgICBVc2FnZSBpbiBTbGF2ZSBtb2RlIG9ubHkuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTkFDSyAgICAgICAgICBMTF9JMkNfQWNrbm93bGVkZ2VOZXh0RGF0YQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBUeXBlQWNrbm93bGVkZ2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfQUNLCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX05BQ0sKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19BY2tub3dsZWRnZU5leHREYXRhKEkyQ19UeXBlRGVmICpJMkN4LCB1aW50MzJfdCBUeXBlQWNrbm93bGVkZ2UpCit7CisgIE1PRElGWV9SRUcoSTJDeC0+Q1IyLCBJMkNfQ1IyX05BQ0ssIFR5cGVBY2tub3dsZWRnZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2VuZXJhdGUgYSBTVEFSVCBvciBSRVNUQVJUIGNvbmRpdGlvbgorICAqIEBub3RlICAgVGhlIFNUQVJUIGJpdCBjYW4gYmUgc2V0IGV2ZW4gaWYgYnVzIGlzIEJVU1kgb3IgSTJDIGlzIGluIHNsYXZlIG1vZGUuCisgICogICAgICAgICBUaGlzIGFjdGlvbiBoYXMgbm8gZWZmZWN0IHdoZW4gUkVMT0FEIGlzIHNldC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBTVEFSVCAgICAgICAgICAgTExfSTJDX0dlbmVyYXRlU3RhcnRDb25kaXRpb24KKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0dlbmVyYXRlU3RhcnRDb25kaXRpb24oSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IyLCBJMkNfQ1IyX1NUQVJUKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBhIFNUT1AgY29uZGl0aW9uIGFmdGVyIHRoZSBjdXJyZW50IGJ5dGUgdHJhbnNmZXIgKG1hc3RlciBtb2RlKS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBTVE9QICAgICAgICAgIExMX0kyQ19HZW5lcmF0ZVN0b3BDb25kaXRpb24KKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0dlbmVyYXRlU3RvcENvbmRpdGlvbihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5DUjIsIEkyQ19DUjJfU1RPUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGF1dG9tYXRpYyBSRVNUQVJUIFJlYWQgcmVxdWVzdCBjb25kaXRpb24gZm9yIDEwYml0IGFkZHJlc3MgaGVhZGVyIChtYXN0ZXIgbW9kZSkuCisgICogQG5vdGUgICBUaGUgbWFzdGVyIHNlbmRzIHRoZSBjb21wbGV0ZSAxMGJpdCBzbGF2ZSBhZGRyZXNzIHJlYWQgc2VxdWVuY2UgOgorICAqICAgICAgICAgU3RhcnQgKyAyIGJ5dGVzIDEwYml0IGFkZHJlc3MgaW4gV3JpdGUgZGlyZWN0aW9uICsgUmVzdGFydCArIGZpcnN0IDcgYml0cyBvZiAxMGJpdCBhZGRyZXNzIGluIFJlYWQgZGlyZWN0aW9uLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEhFQUQxMFIgICAgICAgTExfSTJDX0VuYWJsZUF1dG8xMEJpdFJlYWQKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZUF1dG8xMEJpdFJlYWQoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIENMRUFSX0JJVChJMkN4LT5DUjIsIEkyQ19DUjJfSEVBRDEwUik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBhdXRvbWF0aWMgUkVTVEFSVCBSZWFkIHJlcXVlc3QgY29uZGl0aW9uIGZvciAxMGJpdCBhZGRyZXNzIGhlYWRlciAobWFzdGVyIG1vZGUpLgorICAqIEBub3RlICAgVGhlIG1hc3RlciBvbmx5IHNlbmRzIHRoZSBmaXJzdCA3IGJpdHMgb2YgMTBiaXQgYWRkcmVzcyBpbiBSZWFkIGRpcmVjdGlvbi4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBIRUFEMTBSICAgICAgIExMX0kyQ19EaXNhYmxlQXV0bzEwQml0UmVhZAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZUF1dG8xMEJpdFJlYWQoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IyLCBJMkNfQ1IyX0hFQUQxMFIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIGF1dG9tYXRpYyBSRVNUQVJUIFJlYWQgcmVxdWVzdCBjb25kaXRpb24gZm9yIDEwYml0IGFkZHJlc3MgaGVhZGVyIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgSEVBRDEwUiAgICAgICBMTF9JMkNfSXNFbmFibGVkQXV0bzEwQml0UmVhZAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzRW5hYmxlZEF1dG8xMEJpdFJlYWQoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoSTJDeC0+Q1IyLCBJMkNfQ1IyX0hFQUQxMFIpICE9IChJMkNfQ1IyX0hFQUQxMFIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIHRyYW5zZmVyIGRpcmVjdGlvbiAobWFzdGVyIG1vZGUpLgorICAqIEBub3RlICAgQ2hhbmdpbmcgdGhlc2UgYml0cyB3aGVuIFNUQVJUIGJpdCBpcyBzZXQgaXMgbm90IGFsbG93ZWQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUkRfV1JOICAgICAgICAgICBMTF9JMkNfU2V0VHJhbnNmZXJSZXF1ZXN0CisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIFRyYW5zZmVyUmVxdWVzdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19SRVFVRVNUX1dSSVRFCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX1JFUVVFU1RfUkVBRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX1NldFRyYW5zZmVyUmVxdWVzdChJMkNfVHlwZURlZiAqSTJDeCwgdWludDMyX3QgVHJhbnNmZXJSZXF1ZXN0KQoreworICBNT0RJRllfUkVHKEkyQ3gtPkNSMiwgSTJDX0NSMl9SRF9XUk4sIFRyYW5zZmVyUmVxdWVzdCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSB0cmFuc2ZlciBkaXJlY3Rpb24gcmVxdWVzdGVkIChtYXN0ZXIgbW9kZSkuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUkRfV1JOICAgICAgICAgICBMTF9JMkNfR2V0VHJhbnNmZXJSZXF1ZXN0CisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX1JFUVVFU1RfV1JJVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfUkVRVUVTVF9SRUFECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0dldFRyYW5zZmVyUmVxdWVzdChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoSTJDeC0+Q1IyLCBJMkNfQ1IyX1JEX1dSTikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgc2xhdmUgYWRkcmVzcyBmb3IgdHJhbnNmZXIgKG1hc3RlciBtb2RlKS4KKyAgKiBAbm90ZSAgIENoYW5naW5nIHRoZXNlIGJpdHMgd2hlbiBTVEFSVCBiaXQgaXMgc2V0IGlzIG5vdCBhbGxvd2VkLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNBREQgICAgICAgICAgIExMX0kyQ19TZXRTbGF2ZUFkZHIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgU2xhdmVBZGRyIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4M0YuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfU2V0U2xhdmVBZGRyKEkyQ19UeXBlRGVmICpJMkN4LCB1aW50MzJfdCBTbGF2ZUFkZHIpCit7CisgIE1PRElGWV9SRUcoSTJDeC0+Q1IyLCBJMkNfQ1IyX1NBREQsIFNsYXZlQWRkcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBzbGF2ZSBhZGRyZXNzIHByb2dyYW1tZWQgZm9yIHRyYW5zZmVyLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNBREQgICAgICAgICAgIExMX0kyQ19HZXRTbGF2ZUFkZHIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAgYW5kIE1heF9EYXRhPTB4M0YKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfR2V0U2xhdmVBZGRyKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChJMkN4LT5DUjIsIEkyQ19DUjJfU0FERCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZXMgSTJDeCBjb21tdW5pY2F0aW9uIHdoZW4gc3RhcnRpbmcgdHJhbnNmZXIgb3IgZHVyaW5nIHRyYW5zZmVyIChUQyBvciBUQ1IgZmxhZyBhcmUgc2V0KS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBTQUREICAgICAgICAgIExMX0kyQ19IYW5kbGVUcmFuc2ZlclxuCisgICogICAgICAgICBDUjIgICAgICAgICAgQUREMTAgICAgICAgICBMTF9JMkNfSGFuZGxlVHJhbnNmZXJcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIFJEX1dSTiAgICAgICAgTExfSTJDX0hhbmRsZVRyYW5zZmVyXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBTVEFSVCAgICAgICAgIExMX0kyQ19IYW5kbGVUcmFuc2ZlclxuCisgICogICAgICAgICBDUjIgICAgICAgICAgU1RPUCAgICAgICAgICBMTF9JMkNfSGFuZGxlVHJhbnNmZXJcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIFJFTE9BRCAgICAgICAgTExfSTJDX0hhbmRsZVRyYW5zZmVyXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBOQllURVMgICAgICAgIExMX0kyQ19IYW5kbGVUcmFuc2ZlclxuCisgICogICAgICAgICBDUjIgICAgICAgICAgQVVUT0VORCAgICAgICBMTF9JMkNfSGFuZGxlVHJhbnNmZXJcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIEhFQUQxMFIgICAgICAgTExfSTJDX0hhbmRsZVRyYW5zZmVyCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIFNsYXZlQWRkciBTcGVjaWZpZXMgdGhlIHNsYXZlIGFkZHJlc3MgdG8gYmUgcHJvZ3JhbW1lZC4KKyAgKiBAcGFyYW0gIFNsYXZlQWRkclNpemUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfQUREUlNMQVZFXzdCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfQUREUlNMQVZFXzEwQklUCisgICogQHBhcmFtICBUcmFuc2ZlclNpemUgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcHJvZ3JhbW1lZC4KKyAgKiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MjU1LgorICAqIEBwYXJhbSAgRW5kTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19NT0RFX1JFTE9BRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19NT0RFX0FVVE9FTkQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfTU9ERV9TT0ZURU5ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX01PREVfU01CVVNfUkVMT0FECisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX01PREVfU01CVVNfQVVUT0VORF9OT19QRUMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfTU9ERV9TTUJVU19TT0ZURU5EX05PX1BFQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19NT0RFX1NNQlVTX0FVVE9FTkRfV0lUSF9QRUMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfTU9ERV9TTUJVU19TT0ZURU5EX1dJVEhfUEVDCisgICogQHBhcmFtICBSZXF1ZXN0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX0dFTkVSQVRFX05PU1RBUlRTVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX0dFTkVSQVRFX1NUT1AKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfR0VORVJBVEVfU1RBUlRfUkVBRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19HRU5FUkFURV9TVEFSVF9XUklURQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19HRU5FUkFURV9SRVNUQVJUXzdCSVRfUkVBRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19HRU5FUkFURV9SRVNUQVJUXzdCSVRfV1JJVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfR0VORVJBVEVfUkVTVEFSVF8xMEJJVF9SRUFECisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX0dFTkVSQVRFX1JFU1RBUlRfMTBCSVRfV1JJVEUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19IYW5kbGVUcmFuc2ZlcihJMkNfVHlwZURlZiAqSTJDeCwgdWludDMyX3QgU2xhdmVBZGRyLCB1aW50MzJfdCBTbGF2ZUFkZHJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRyYW5zZmVyU2l6ZSwgdWludDMyX3QgRW5kTW9kZSwgdWludDMyX3QgUmVxdWVzdCkKK3sKKyAgTU9ESUZZX1JFRyhJMkN4LT5DUjIsIEkyQ19DUjJfU0FERCB8IEkyQ19DUjJfQUREMTAgfCAoSTJDX0NSMl9SRF9XUk4gJiAodWludDMyX3QpKFJlcXVlc3QgPj4gKDMxVSAtIEkyQ19DUjJfUkRfV1JOX1BvcykpKSB8IEkyQ19DUjJfU1RBUlQgfCBJMkNfQ1IyX1NUT1AgfCBJMkNfQ1IyX1JFTE9BRCB8CisgICAgICAgICAgICAgSTJDX0NSMl9OQllURVMgfCBJMkNfQ1IyX0FVVE9FTkQgfCBJMkNfQ1IyX0hFQUQxMFIsCisgICAgICAgICAgICAgU2xhdmVBZGRyIHwgU2xhdmVBZGRyU2l6ZSB8IFRyYW5zZmVyU2l6ZSA8PCBJMkNfQ1IyX05CWVRFU19Qb3MgfCBFbmRNb2RlIHwgUmVxdWVzdCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgdGhlIHZhbHVlIG9mIHRyYW5zZmVyIGRpcmVjdGlvbiAoc2xhdmUgbW9kZSkuCisgICogQG5vdGUgICBSRVNFVDogV3JpdGUgdHJhbnNmZXIsIFNsYXZlIGVudGVycyBpbiByZWNlaXZlciBtb2RlLgorICAqICAgICAgICAgU0VUOiBSZWFkIHRyYW5zZmVyLCBTbGF2ZSBlbnRlcnMgaW4gdHJhbnNtaXR0ZXIgbW9kZS4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBESVIgICAgICAgICAgIExMX0kyQ19HZXRUcmFuc2ZlckRpcmVjdGlvbgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19ESVJFQ1RJT05fV1JJVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfRElSRUNUSU9OX1JFQUQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfR2V0VHJhbnNmZXJEaXJlY3Rpb24oSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEkyQ3gtPklTUiwgSTJDX0lTUl9ESVIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIHNsYXZlIG1hdGNoZWQgYWRkcmVzcy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBBRERDT0RFICAgICAgIExMX0kyQ19HZXRBZGRyZXNzTWF0Y2hDb2RlCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgzRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19HZXRBZGRyZXNzTWF0Y2hDb2RlKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChJMkN4LT5JU1IsIEkyQ19JU1JfQUREQ09ERSkgPj4gSTJDX0lTUl9BRERDT0RFX1BvcyA8PCAxKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgaW50ZXJuYWwgY29tcGFyaXNvbiBvZiB0aGUgU01CdXMgUGFja2V0IEVycm9yIGJ5dGUgKHRyYW5zbWlzc2lvbiBvciByZWNlcHRpb24gbW9kZSkuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQG5vdGUgICBUaGlzIGZlYXR1cmUgaXMgY2xlYXJlZCBieSBoYXJkd2FyZSB3aGVuIHRoZSBQRUMgYnl0ZSBpcyB0cmFuc2ZlcnJlZCwgb3Igd2hlbiBhIFNUT1AgY29uZGl0aW9uIG9yIGFuIEFkZHJlc3MgTWF0Y2hlZCBpcyByZWNlaXZlZC4KKyAgKiAgICAgICAgIFRoaXMgYml0IGhhcyBubyBlZmZlY3Qgd2hlbiBSRUxPQUQgYml0IGlzIHNldC4KKyAgKiAgICAgICAgIFRoaXMgYml0IGhhcyBubyBlZmZlY3QgaW4gZGV2aWNlIG1vZGUgd2hlbiBTQkMgYml0IGlzIG5vdCBzZXQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUEVDQllURSAgICAgICBMTF9JMkNfRW5hYmxlU01CdXNQRUNDb21wYXJlCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19FbmFibGVTTUJ1c1BFQ0NvbXBhcmUoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IyLCBJMkNfQ1IyX1BFQ0JZVEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBTTUJ1cyBQYWNrZXQgRXJyb3IgYnl0ZSBpbnRlcm5hbCBjb21wYXJpc29uIGlzIHJlcXVlc3RlZCBvciBub3QuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUEVDQllURSAgICAgICBMTF9JMkNfSXNFbmFibGVkU01CdXNQRUNDb21wYXJlCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNFbmFibGVkU01CdXNQRUNDb21wYXJlKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKFJFQURfQklUKEkyQ3gtPkNSMiwgSTJDX0NSMl9QRUNCWVRFKSA9PSAoSTJDX0NSMl9QRUNCWVRFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBTTUJ1cyBQYWNrZXQgRXJyb3IgYnl0ZSBjYWxjdWxhdGVkLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19BTExfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgUEVDUiAgICAgICAgIFBFQyAgICAgICAgICAgTExfSTJDX0dldFNNQnVzUEVDCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfR2V0U01CdXNQRUMoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEkyQ3gtPlBFQ1IsIEkyQ19QRUNSX1BFQykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyLgorICAqIEBybXRvbGwgUlhEUiAgICAgICAgIFJYREFUQSAgICAgICAgTExfSTJDX1JlY2VpdmVEYXRhOAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50OF90IExMX0kyQ19SZWNlaXZlRGF0YTgoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAodWludDhfdCkoUkVBRF9CSVQoSTJDeC0+UlhEUiwgSTJDX1JYRFJfUlhEQVRBKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgaW4gVHJhbnNtaXQgRGF0YSBSZWdpc3RlciAuCisgICogQHJtdG9sbCBUWERSICAgICAgICAgVFhEQVRBICAgICAgICBMTF9JMkNfVHJhbnNtaXREYXRhOAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBEYXRhIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX1RyYW5zbWl0RGF0YTgoSTJDX1R5cGVEZWYgKkkyQ3gsIHVpbnQ4X3QgRGF0YSkKK3sKKyAgV1JJVEVfUkVHKEkyQ3gtPlRYRFIsIERhdGEpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FRl9Jbml0IEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCit1aW50MzJfdCBMTF9JMkNfSW5pdChJMkNfVHlwZURlZiAqSTJDeCwgTExfSTJDX0luaXRUeXBlRGVmICpJMkNfSW5pdFN0cnVjdCk7Cit1aW50MzJfdCBMTF9JMkNfRGVJbml0KEkyQ19UeXBlRGVmICpJMkN4KTsKK3ZvaWQgTExfSTJDX1N0cnVjdEluaXQoTExfSTJDX0luaXRUeXBlRGVmICpJMkNfSW5pdFN0cnVjdCk7CisKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEkyQzEgfHwgSTJDMiB8fCBJMkMzICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyRjN4eF9MTF9JMkNfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjN4eF9sbF9pd2RnLmggYi9JbmMvc3RtMzJmM3h4X2xsX2l3ZGcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWJjYzlkCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjN4eF9sbF9pd2RnLmgKQEAgLTAsMCArMSwzNjEgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfbGxfaXdkZy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBJV0RHIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0xMX0lXREdfSAorI2RlZmluZSBfX1NUTTMyRjN4eF9MTF9JV0RHX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKElXREcpCisKKy8qKiBAZGVmZ3JvdXAgSVdER19MTCBJV0RHCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElXREdfTExfUHJpdmF0ZV9Db25zdGFudHMgSVdERyBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisKKyNkZWZpbmUgTExfSVdER19LRVlfUkVMT0FEICAgICAgICAgICAgICAgICAweDAwMDBBQUFBVSAgICAgICAgICAgICAgIC8qITwgSVdERyBSZWxvYWQgQ291bnRlciBFbmFibGUgICAqLworI2RlZmluZSBMTF9JV0RHX0tFWV9FTkFCTEUgICAgICAgICAgICAgICAgIDB4MDAwMENDQ0NVICAgICAgICAgICAgICAgLyohPCBJV0RHIFBlcmlwaGVyYWwgRW5hYmxlICAgICAgICovCisjZGVmaW5lIExMX0lXREdfS0VZX1dSX0FDQ0VTU19FTkFCTEUgICAgICAgMHgwMDAwNTU1NVUgICAgICAgICAgICAgICAvKiE8IElXREcgS1IgV3JpdGUgQWNjZXNzIEVuYWJsZSAgKi8KKyNkZWZpbmUgTExfSVdER19LRVlfV1JfQUNDRVNTX0RJU0FCTEUgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgIC8qITwgSVdERyBLUiBXcml0ZSBBY2Nlc3MgRGlzYWJsZSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSVdER19MTF9FeHBvcnRlZF9Db25zdGFudHMgSVdERyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIElXREdfTExfRUNfR0VUX0ZMQUcgR2V0IEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0lXREdfUmVhZFJlZyBmdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0lXREdfU1JfUFZVICAgICAgICAgICAgICAgICAgICAgSVdER19TUl9QVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFdhdGNoZG9nIHByZXNjYWxlciB2YWx1ZSB1cGRhdGUgKi8KKyNkZWZpbmUgTExfSVdER19TUl9SVlUgICAgICAgICAgICAgICAgICAgICBJV0RHX1NSX1JWVSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV2F0Y2hkb2cgY291bnRlciByZWxvYWQgdmFsdWUgdXBkYXRlICovCisjZGVmaW5lIExMX0lXREdfU1JfV1ZVICAgICAgICAgICAgICAgICAgICAgSVdER19TUl9XVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFdhdGNoZG9nIGNvdW50ZXIgd2luZG93IHZhbHVlIHVwZGF0ZSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElXREdfTExfRUNfUFJFU0NBTEVSICBQcmVzY2FsZXIgRGl2aWRlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0lXREdfUFJFU0NBTEVSXzQgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERpdmlkZXIgYnkgNCAgICovCisjZGVmaW5lIExMX0lXREdfUFJFU0NBTEVSXzggICAgICAgICAgICAgICAgKElXREdfUFJfUFJfMCkgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERpdmlkZXIgYnkgOCAgICovCisjZGVmaW5lIExMX0lXREdfUFJFU0NBTEVSXzE2ICAgICAgICAgICAgICAgKElXREdfUFJfUFJfMSkgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERpdmlkZXIgYnkgMTYgICovCisjZGVmaW5lIExMX0lXREdfUFJFU0NBTEVSXzMyICAgICAgICAgICAgICAgKElXREdfUFJfUFJfMSB8IElXREdfUFJfUFJfMCkgICAgICAgICAvKiE8IERpdmlkZXIgYnkgMzIgICovCisjZGVmaW5lIExMX0lXREdfUFJFU0NBTEVSXzY0ICAgICAgICAgICAgICAgKElXREdfUFJfUFJfMikgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERpdmlkZXIgYnkgNjQgICovCisjZGVmaW5lIExMX0lXREdfUFJFU0NBTEVSXzEyOCAgICAgICAgICAgICAgKElXREdfUFJfUFJfMiB8IElXREdfUFJfUFJfMCkgICAgICAgICAvKiE8IERpdmlkZXIgYnkgMTI4ICovCisjZGVmaW5lIExMX0lXREdfUFJFU0NBTEVSXzI1NiAgICAgICAgICAgICAgKElXREdfUFJfUFJfMiB8IElXREdfUFJfUFJfMSkgICAgICAgICAvKiE8IERpdmlkZXIgYnkgMjU2ICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJV0RHX0xMX0V4cG9ydGVkX01hY3JvcyBJV0RHIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVdER19MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIElXREcgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBJV0RHIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9JV0RHX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gSVdERyByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIElXREcgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfSVdER19SZWFkUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXykgUkVBRF9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJV0RHX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBJV0RHIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiogQGRlZmdyb3VwIElXREdfTExfRUZfQ29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgSW5kZXBlbmRlbnQgV2F0Y2hkb2cKKyAgKiBAbm90ZSAgIEV4Y2VwdCBpZiB0aGUgaGFyZHdhcmUgd2F0Y2hkb2cgb3B0aW9uIGlzIHNlbGVjdGVkCisgICogQHJtdG9sbCBLUiAgICAgICAgICAgS0VZICAgICAgICAgICBMTF9JV0RHX0VuYWJsZQorICAqIEBwYXJhbSAgSVdER3ggSVdERyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSVdER19FbmFibGUoSVdER19UeXBlRGVmICpJV0RHeCkKK3sKKyAgV1JJVEVfUkVHKElXREctPktSLCBMTF9JV0RHX0tFWV9FTkFCTEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlbG9hZHMgSVdERyBjb3VudGVyIHdpdGggdmFsdWUgZGVmaW5lZCBpbiB0aGUgcmVsb2FkIHJlZ2lzdGVyCisgICogQHJtdG9sbCBLUiAgICAgICAgICAgS0VZICAgICAgICAgICBMTF9JV0RHX1JlbG9hZENvdW50ZXIKKyAgKiBAcGFyYW0gIElXREd4IElXREcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0lXREdfUmVsb2FkQ291bnRlcihJV0RHX1R5cGVEZWYgKklXREd4KQoreworICBXUklURV9SRUcoSVdERy0+S1IsIExMX0lXREdfS0VZX1JFTE9BRCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHdyaXRlIGFjY2VzcyB0byBJV0RHX1BSLCBJV0RHX1JMUiBhbmQgSVdER19XSU5SIHJlZ2lzdGVycworICAqIEBybXRvbGwgS1IgICAgICAgICAgIEtFWSAgICAgICAgICAgTExfSVdER19FbmFibGVXcml0ZUFjY2VzcworICAqIEBwYXJhbSAgSVdER3ggSVdERyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSVdER19FbmFibGVXcml0ZUFjY2VzcyhJV0RHX1R5cGVEZWYgKklXREd4KQoreworICBXUklURV9SRUcoSVdERy0+S1IsIExMX0lXREdfS0VZX1dSX0FDQ0VTU19FTkFCTEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgd3JpdGUgYWNjZXNzIHRvIElXREdfUFIsIElXREdfUkxSIGFuZCBJV0RHX1dJTlIgcmVnaXN0ZXJzCisgICogQHJtdG9sbCBLUiAgICAgICAgICAgS0VZICAgICAgICAgICBMTF9JV0RHX0Rpc2FibGVXcml0ZUFjY2VzcworICAqIEBwYXJhbSAgSVdER3ggSVdERyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSVdER19EaXNhYmxlV3JpdGVBY2Nlc3MoSVdER19UeXBlRGVmICpJV0RHeCkKK3sKKyAgV1JJVEVfUkVHKElXREctPktSLCBMTF9JV0RHX0tFWV9XUl9BQ0NFU1NfRElTQUJMRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VsZWN0IHRoZSBwcmVzY2FsZXIgb2YgdGhlIElXREcKKyAgKiBAcm10b2xsIFBSICAgICAgICAgICBQUiAgICAgICAgICAgIExMX0lXREdfU2V0UHJlc2NhbGVyCisgICogQHBhcmFtICBJV0RHeCBJV0RHIEluc3RhbmNlCisgICogQHBhcmFtICBQcmVzY2FsZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JV0RHX1BSRVNDQUxFUl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVdER19QUkVTQ0FMRVJfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lXREdfUFJFU0NBTEVSXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVdER19QUkVTQ0FMRVJfMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JV0RHX1BSRVNDQUxFUl82NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lXREdfUFJFU0NBTEVSXzEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lXREdfUFJFU0NBTEVSXzI1NgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSVdER19TZXRQcmVzY2FsZXIoSVdER19UeXBlRGVmICpJV0RHeCwgdWludDMyX3QgUHJlc2NhbGVyKQoreworICBXUklURV9SRUcoSVdER3gtPlBSLCBJV0RHX1BSX1BSICYgUHJlc2NhbGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHNlbGVjdGVkIHByZXNjYWxlciBvZiB0aGUgSVdERworICAqIEBybXRvbGwgUFIgICAgICAgICAgIFBSICAgICAgICAgICAgTExfSVdER19HZXRQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIElXREd4IElXREcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVdER19QUkVTQ0FMRVJfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lXREdfUFJFU0NBTEVSXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JV0RHX1BSRVNDQUxFUl8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lXREdfUFJFU0NBTEVSXzMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSVdER19QUkVTQ0FMRVJfNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JV0RHX1BSRVNDQUxFUl8xMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JV0RHX1BSRVNDQUxFUl8yNTYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JV0RHX0dldFByZXNjYWxlcihJV0RHX1R5cGVEZWYgKklXREd4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhJV0RHeC0+UFIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTcGVjaWZ5IHRoZSBJV0RHIGRvd24tY291bnRlciByZWxvYWQgdmFsdWUKKyAgKiBAcm10b2xsIFJMUiAgICAgICAgICBSTCAgICAgICAgICAgIExMX0lXREdfU2V0UmVsb2FkQ291bnRlcgorICAqIEBwYXJhbSAgSVdER3ggSVdERyBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ291bnRlciBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4MEZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSVdER19TZXRSZWxvYWRDb3VudGVyKElXREdfVHlwZURlZiAqSVdER3gsIHVpbnQzMl90IENvdW50ZXIpCit7CisgIFdSSVRFX1JFRyhJV0RHeC0+UkxSLCBJV0RHX1JMUl9STCAmIENvdW50ZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgc3BlY2lmaWVkIElXREcgZG93bi1jb3VudGVyIHJlbG9hZCB2YWx1ZQorICAqIEBybXRvbGwgUkxSICAgICAgICAgIFJMICAgICAgICAgICAgTExfSVdER19HZXRSZWxvYWRDb3VudGVyCisgICogQHBhcmFtICBJV0RHeCBJV0RHIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4MEZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0lXREdfR2V0UmVsb2FkQ291bnRlcihJV0RHX1R5cGVEZWYgKklXREd4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhJV0RHeC0+UkxSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3BlY2lmeSBoaWdoIGxpbWl0IG9mIHRoZSB3aW5kb3cgdmFsdWUgdG8gYmUgY29tcGFyZWQgdG8gdGhlIGRvd24tY291bnRlci4KKyAgKiBAcm10b2xsIFdJTlIgICAgICAgICBXSU4gICAgICAgICAgIExMX0lXREdfU2V0V2luZG93CisgICogQHBhcmFtICBJV0RHeCBJV0RHIEluc3RhbmNlCisgICogQHBhcmFtICBXaW5kb3cgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weDBGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0lXREdfU2V0V2luZG93KElXREdfVHlwZURlZiAqSVdER3gsIHVpbnQzMl90IFdpbmRvdykKK3sKKyAgV1JJVEVfUkVHKElXREd4LT5XSU5SLCBJV0RHX1dJTlJfV0lOICYgV2luZG93KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGhpZ2ggbGltaXQgb2YgdGhlIHdpbmRvdyB2YWx1ZSBzcGVjaWZpZWQuCisgICogQHJtdG9sbCBXSU5SICAgICAgICAgV0lOICAgICAgICAgICBMTF9JV0RHX0dldFdpbmRvdworICAqIEBwYXJhbSAgSVdER3ggSVdERyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weDBGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JV0RHX0dldFdpbmRvdyhJV0RHX1R5cGVEZWYgKklXREd4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhJV0RHeC0+V0lOUikpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElXREdfTExfRUZfRkxBR19NYW5hZ2VtZW50IEZMQUdfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgZmxhZyBQcmVzY2FsZXIgVmFsdWUgVXBkYXRlIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBQVlUgICAgICAgICAgIExMX0lXREdfSXNBY3RpdmVGbGFnX1BWVQorICAqIEBwYXJhbSAgSVdER3ggSVdERyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0lXREdfSXNBY3RpdmVGbGFnX1BWVShJV0RHX1R5cGVEZWYgKklXREd4KQoreworICByZXR1cm4gKFJFQURfQklUKElXREd4LT5TUiwgSVdER19TUl9QVlUpID09IChJV0RHX1NSX1BWVSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIGZsYWcgUmVsb2FkIFZhbHVlIFVwZGF0ZSBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBTUiAgICAgICAgICAgUlZVICAgICAgICAgICBMTF9JV0RHX0lzQWN0aXZlRmxhZ19SVlUKKyAgKiBAcGFyYW0gIElXREd4IElXREcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JV0RHX0lzQWN0aXZlRmxhZ19SVlUoSVdER19UeXBlRGVmICpJV0RHeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChJV0RHeC0+U1IsIElXREdfU1JfUlZVKSA9PSAoSVdER19TUl9SVlUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBmbGFnIFdpbmRvdyBWYWx1ZSBVcGRhdGUgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgU1IgICAgICAgICAgIFdWVSAgICAgICAgICAgTExfSVdER19Jc0FjdGl2ZUZsYWdfV1ZVCisgICogQHBhcmFtICBJV0RHeCBJV0RHIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSVdER19Jc0FjdGl2ZUZsYWdfV1ZVKElXREdfVHlwZURlZiAqSVdER3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoSVdER3gtPlNSLCBJV0RHX1NSX1dWVSkgPT0gKElXREdfU1JfV1ZVKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgYWxsIGZsYWdzIFByZXNjYWxlciwgUmVsb2FkICYgV2luZG93IFZhbHVlIFVwZGF0ZSBhcmUgcmVzZXQgb3Igbm90CisgICogQHJtdG9sbCBTUiAgICAgICAgICAgUFZVICAgICAgICAgICBMTF9JV0RHX0lzUmVhZHlcbgorICAqICAgICAgICAgU1IgICAgICAgICAgIFdWVSAgICAgICAgICAgTExfSVdER19Jc1JlYWR5XG4KKyAgKiAgICAgICAgIFNSICAgICAgICAgICBSVlUgICAgICAgICAgIExMX0lXREdfSXNSZWFkeQorICAqIEBwYXJhbSAgSVdER3ggSVdERyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0cyAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JV0RHX0lzUmVhZHkoSVdER19UeXBlRGVmICpJV0RHeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChJV0RHeC0+U1IsIElXREdfU1JfUFZVIHwgSVdER19TUl9SVlUgfCBJV0RHX1NSX1dWVSkgPT0gMFUpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBJV0RHKSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkYzeHhfTExfSVdER19IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2xsX29wYW1wLmggYi9JbmMvc3RtMzJmM3h4X2xsX29wYW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IyMDE0MQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmYzeHhfbGxfb3BhbXAuaApAQCAtMCwwICsxLDkwMyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9sbF9vcGFtcC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBPUEFNUCBMTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyRjN4eF9MTF9PUEFNUF9ICisjZGVmaW5lIF9fU1RNMzJGM3h4X0xMX09QQU1QX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkIChPUEFNUDEpIHx8IGRlZmluZWQgKE9QQU1QMikgfHwgZGVmaW5lZCAoT1BBTVAzKSB8fCBkZWZpbmVkIChPUEFNUDQpCisKKy8qKiBAZGVmZ3JvdXAgT1BBTVBfTEwgT1BBTVAKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgT1BBTVBfTExfUHJpdmF0ZV9Db25zdGFudHMgT1BBTVAgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiBJbnRlcm5hbCBtYXNrIGZvciBPUEFNUCB0cmltbWluZyBvZiB0cmFuc2lzdG9ycyBkaWZmZXJlbnRpYWwgcGFpciBOTU9TICAgICAqLworLyogb3IgUE1PUy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRvIHNlbGVjdCBpbnRvIGxpdGVyYWwgTExfT1BBTVBfVFJJTU1JTkdfeCB0aGUgcmVsZXZhbnQgYml0cyBmb3I6ICAgICAgICAgICovCisvKiAtIE9QQU1QIHRyaW1taW5nIHNlbGVjdGlvbiBvZiB0cmFuc2lzdG9ycyBkaWZmZXJlbnRpYWwgcGFpciAgICAgICAgICAgICAgICAqLworLyogLSBPUEFNUCB0cmltbWluZyB2YWx1ZXMgb2YgdHJhbnNpc3RvcnMgZGlmZmVyZW50aWFsIHBhaXIgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT1BBTVBfVFJJTU1JTkdfU0VMRUNUX01BU0sgICAgICAgICAgKE9QQU1QX0NTUl9DQUxTRUwpCisjZGVmaW5lIE9QQU1QX1RSSU1NSU5HX1ZBTFVFX01BU0sgICAgICAgICAgIChPUEFNUF9DU1JfVFJJTU9GRlNFVE4gfCBPUEFNUF9DU1JfVFJJTU9GRlNFVFApCisKKy8qKgorICAqIEB9CisgICovCisKKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgT1BBTVBfTExfUHJpdmF0ZV9NYWNyb3MgT1BBTVAgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERyaXZlciBtYWNybyByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlOiBzZXQgYSBwb2ludGVyIHRvCisgICogICAgICAgICBhIHJlZ2lzdGVyIGZyb20gYSByZWdpc3RlciBiYXNpcyBmcm9tIHdoaWNoIGFuIG9mZnNldAorICAqICAgICAgICAgaXMgYXBwbGllZC4KKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgYmFzaXMgZnJvbSB3aGljaCB0aGUgb2Zmc2V0IGlzIGFwcGxpZWQuCisgICogQHBhcmFtICBfX1JFR19PRkZTRVRfXyBPZmZzZXQgdG8gYmUgYXBwbGllZCAodW5pdDogbnVtYmVyIG9mIHJlZ2lzdGVycykuCisgICogQHJldHZhbCBSZWdpc3RlciBhZGRyZXNzCisqLworI2RlZmluZSBfX09QQU1QX1BUUl9SRUdfT0ZGU0VUKF9fUkVHX18sIF9fUkVHX09GRlNFVF9fKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAoKHVpbnQzMl90ICopKCh1aW50MzJfdCkgKCh1aW50MzJfdCkoJihfX1JFR19fKSkgKyAoKF9fUkVHX09GRlNFVF9fKSA8PCAyVSkpKSkKKworCisKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBPUEFNUF9MTF9FU19JTklUIE9QQU1QIEV4cG9ydGVkIEluaXQgc3RydWN0dXJlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBvZiBzb21lIGZlYXR1cmVzIG9mIE9QQU1QIGluc3RhbmNlLgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgRnVuY3Rpb25hbE1vZGU7ICAgICAgICAgICAgICAvKiE8IFNldCBPUEFNUCBmdW5jdGlvbmFsIG1vZGUgYnkgc2V0dGluZyBpbnRlcm5hbCBjb25uZWN0aW9uczogT1BBTVAgb3BlcmF0aW9uIGluIHN0YW5kYWxvbmUsIGZvbGxvd2VyLCAuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgT1BBTVBfTExfRUNfRlVOQ1RJT05BTF9NT0RFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBJZiBPUEFNUCBpcyBjb25maWd1cmVkIGluIG1vZGUgUEdBLCB0aGUgZ2FpbiBjYW4gYmUgY29uZmlndXJlZCB1c2luZyBmdW5jdGlvbiBAcmVmIExMX09QQU1QX1NldFBHQUdhaW4oKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9PUEFNUF9TZXRGdW5jdGlvbmFsTW9kZSgpLiAqLworCisgIHVpbnQzMl90IElucHV0Tm9uSW52ZXJ0aW5nOyAgICAgICAgICAgLyohPCBTZXQgT1BBTVAgaW5wdXQgbm9uLWludmVydGluZyBjb25uZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBPUEFNUF9MTF9FQ19JTlBVVF9OT05JTlZFUlRJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9PUEFNUF9TZXRJbnB1dE5vbkludmVydGluZygpLiAqLworCisgIHVpbnQzMl90IElucHV0SW52ZXJ0aW5nOyAgICAgICAgICAgICAgLyohPCBTZXQgT1BBTVAgaW52ZXJ0aW5nIGlucHV0IGNvbm5lY3Rpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIE9QQU1QX0xMX0VDX0lOUFVUX0lOVkVSVElORworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgT1BBTVAgaW52ZXJ0aW5nIGlucHV0IGlzIHVzZWQgd2l0aCBPUEFNUCBpbiBtb2RlIHN0YW5kYWxvbmUgb3IgUEdBIHdpdGggZXh0ZXJuYWwgY2FwYWNpdG9ycyBmb3IgZmlsdGVyaW5nIGNpcmN1aXQuIE90aGVyd2lzZSAoT1BBTVAgaW4gbW9kZSBmb2xsb3dlciksIE9QQU1QIGludmVydGluZyBpbnB1dCBpcyBub3QgdXNlZCAobm90IGNvbm5lY3RlZCB0byBHUElPIHBpbiksIHRoaXMgcGFyYW1ldGVyIGlzIGRpc2NhcmRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9PUEFNUF9TZXRJbnB1dEludmVydGluZygpLiAqLworCit9IExMX09QQU1QX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBPUEFNUF9MTF9FeHBvcnRlZF9Db25zdGFudHMgT1BBTVAgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBPUEFNUF9MTF9FQ19NT0RFIE9QQU1QIG1vZGUgY2FsaWJyYXRpb24gb3IgZnVuY3Rpb25hbC4KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9PUEFNUF9NT0RFX0ZVTkNUSU9OQUwgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgLyohPCBPUEFNUCBmdW5jdGlvbmFsIG1vZGUgKi8KKyNkZWZpbmUgTExfT1BBTVBfTU9ERV9DQUxJQlJBVElPTiAgICAgICAoT1BBTVBfQ1NSX0NBTE9OKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT1BBTVAgY2FsaWJyYXRpb24gbW9kZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBPUEFNUF9MTF9FQ19GVU5DVElPTkFMX01PREUgT1BBTVAgZnVuY3Rpb25hbCBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfT1BBTVBfTU9ERV9TVEFOREFMT05FICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgIC8qITwgT1BBTVAgZnVuY3Rpb25hbCBtb2RlLCBPUEFNUCBvcGVyYXRpb24gaW4gc3RhbmRhbG9uZSAqLworI2RlZmluZSBMTF9PUEFNUF9NT0RFX0ZPTExPV0VSICAgICAgICAgIChPUEFNUF9DU1JfVk1TRUxfMSB8IE9QQU1QX0NTUl9WTVNFTF8wKSAgICAgLyohPCBPUEFNUCBmdW5jdGlvbmFsIG1vZGUsIE9QQU1QIG9wZXJhdGlvbiBpbiBmb2xsb3dlciAqLworI2RlZmluZSBMTF9PUEFNUF9NT0RFX1BHQSAgICAgICAgICAgICAgIChPUEFNUF9DU1JfVk1TRUxfMSkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPUEFNUCBmdW5jdGlvbmFsIG1vZGUsIE9QQU1QIG9wZXJhdGlvbiBpbiBQR0EgKi8KKyNkZWZpbmUgTExfT1BBTVBfTU9ERV9QR0FfRVhUX0ZJTFRfSU8wICAoT1BBTVBfQ1NSX1BHR0FJTl8zICAgICAgICAgICAgICAgICAgICAgIHwgT1BBTVBfQ1NSX1ZNU0VMXzEpIC8qITwgT1BBTVAgZnVuY3Rpb25hbCBtb2RlLCBPUEFNUCBvcGVyYXRpb24gaW4gUEdBIHdpdGggZXh0ZXJuYWwgZmlsdGVyaW5nIG9uIE9QQU1QIGlucHV0IElPMC4gKi8KKyNkZWZpbmUgTExfT1BBTVBfTU9ERV9QR0FfRVhUX0ZJTFRfSU8xICAoT1BBTVBfQ1NSX1BHR0FJTl8zIHwgT1BBTVBfQ1NSX1BHR0FJTl8yIHwgT1BBTVBfQ1NSX1ZNU0VMXzEpIC8qITwgT1BBTVAgZnVuY3Rpb25hbCBtb2RlLCBPUEFNUCBvcGVyYXRpb24gaW4gUEdBIHdpdGggZXh0ZXJuYWwgZmlsdGVyaW5nIG9uIE9QQU1QIGlucHV0IElPMS4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgT1BBTVBfTExfRUNfTU9ERV9QR0FfR0FJTiBPUEFNUCBQR0EgZ2FpbiAocmVsZXZhbnQgd2hlbiBPUEFNUCBpcyBpbiBmdW5jdGlvbmFsIG1vZGUgUEdBKQorICAqIEB7CisgICovCisjZGVmaW5lIExMX09QQU1QX1BHQV9HQUlOXzIgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgIC8qITwgT1BBTVAgUEdBIGdhaW4gMiAqLworI2RlZmluZSBMTF9PUEFNUF9QR0FfR0FJTl80ICAgICAgICAgICAgIChPUEFNUF9DU1JfUEdHQUlOXzApICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE9QQU1QIFBHQSBnYWluIDQgKi8KKyNkZWZpbmUgTExfT1BBTVBfUEdBX0dBSU5fOCAgICAgICAgICAgICAoT1BBTVBfQ1NSX1BHR0FJTl8xKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPUEFNUCBQR0EgZ2FpbiA4ICovCisjZGVmaW5lIExMX09QQU1QX1BHQV9HQUlOXzE2ICAgICAgICAgICAgKE9QQU1QX0NTUl9QR0dBSU5fMSB8IE9QQU1QX0NTUl9QR0dBSU5fMCApIC8qITwgT1BBTVAgUEdBIGdhaW4gMTYgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgT1BBTVBfTExfRUNfSU5QVVRfTk9OSU5WRVJUSU5HIE9QQU1QIGlucHV0IG5vbi1pbnZlcnRpbmcKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9PUEFNUF9JTlBVVF9OT05JTlZFUlRfSU8wICAgICAgKE9QQU1QX0NTUl9WUFNFTCkgICAgICAgLyohPCBPUEFNUCBub24gaW52ZXJ0aW5nIGlucHV0IGNvbm5lY3RlZCB0byBHUElPIHBpbiAocGluIFBBMSBmb3IgT1BBTVAxLCBwaW4gUEE3ICBmb3IgT1BBTVAyLCBwaW4gUEIwICBmb3IgT1BBTVAzLCBwaW4gUEIxMyBmb3IgT1BBTVA0KSAqLworI2RlZmluZSBMTF9PUEFNUF9JTlBVVF9OT05JTlZFUlRfSU8xICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwKSAgLyohPCBPUEFNUCBub24gaW52ZXJ0aW5nIGlucHV0IGNvbm5lY3RlZCB0byBHUElPIHBpbiAocGluIFBBNyBmb3IgT1BBTVAxLCBwaW4gUEQxNCBmb3IgT1BBTVAyLCBwaW4gUEIxMyBmb3IgT1BBTVAzLCBwaW4gUEQxMSBmb3IgT1BBTVA0KSAqLworI2RlZmluZSBMTF9PUEFNUF9JTlBVVF9OT05JTlZFUlRfSU8yICAgICAgKE9QQU1QX0NTUl9WUFNFTF8xKSAgICAgLyohPCBPUEFNUCBub24gaW52ZXJ0aW5nIGlucHV0IGNvbm5lY3RlZCB0byBHUElPIHBpbiAocGluIFBBMyBmb3IgT1BBTVAxLCBwaW4gUEIwICBmb3IgT1BBTVAyLCBwaW4gUEExICBmb3IgT1BBTVAzLCBwaW4gUEIxMSBmb3IgT1BBTVA0KSAqLworI2RlZmluZSBMTF9PUEFNUF9JTlBVVF9OT05JTlZFUlRfSU8zICAgICAgKE9QQU1QX0NTUl9WUFNFTF8wKSAgICAgLyohPCBPUEFNUCBub24gaW52ZXJ0aW5nIGlucHV0IGNvbm5lY3RlZCB0byBHUElPIHBpbiAocGluIFBBNSBmb3IgT1BBTVAxLCBwaW4gUEIxNCBmb3IgT1BBTVAyLCBwaW4gUEE1ICBmb3IgT1BBTVAzLCBwaW4gUEE0ICBmb3IgT1BBTVA0KSAqLworI2RlZmluZSBMTF9PUEFNUF9JTlBVVF9OT05JTlZfREFDMV9DSDEgICAgKExMX09QQU1QX0lOUFVUX05PTklOVkVSVF9JTzMpIC8qITwgT1BBTVAgbm9uIGludmVydGluZyBpbnB1dCBjb25uZWN0ZWQgdG8gREFDMSBjaGFubmVsMSBvdXRwdXQgKHNwZWNpZmljIHRvIE9QQU1QIGluc3RhbmNlczogT1BBTVA0KSAqLworI2RlZmluZSBMTF9PUEFNUF9JTlBVVF9OT05JTlZfREFDMV9DSDIgICAgKExMX09QQU1QX0lOUFVUX05PTklOVkVSVF9JTzMpIC8qITwgT1BBTVAgbm9uIGludmVydGluZyBpbnB1dCBjb25uZWN0ZWQgdG8gREFDMSBjaGFubmVsMiBvdXRwdXQgKHNwZWNpZmljIHRvIE9QQU1QIGluc3RhbmNlczogT1BBTVAxLCBPUEFNUDMpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIE9QQU1QX0xMX0VDX0lOUFVUX0lOVkVSVElORyBPUEFNUCBpbnB1dCBpbnZlcnRpbmcKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9PUEFNUF9JTlBVVF9JTlZFUlRfSU8wICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IE9QQU1QIGludmVydGluZyBpbnB1dCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4gKHBpbiBQQzUgZm9yIE9QQU1QMSwgcGluIFBDNSBmb3IgT1BBTVAyLCBwaW4gUEIxMCAgZm9yIE9QQU1QMywgcGluIFBCMTAgZm9yIE9QQU1QNCkuIE5vdGU6IE9QQU1QIGludmVydGluZyBpbnB1dCBpcyB1c2VkIHdpdGggT1BBTVAgaW4gbW9kZSBzdGFuZGFsb25lIG9yIFBHQSB3aXRoIGV4dGVybmFsIGNhcGFjaXRvcnMgZm9yIGZpbHRlcmluZyBjaXJjdWl0LiBPdGhlcndpc2UgKE9QQU1QIGluIG1vZGUgZm9sbG93ZXIpLCBPUEFNUCBpbnZlcnRpbmcgaW5wdXQgaXMgbm90IHVzZWQgKG5vdCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pLiAqLworI2RlZmluZSBMTF9PUEFNUF9JTlBVVF9JTlZFUlRfSU8xICAgICAgICAoT1BBTVBfQ1NSX1ZNU0VMXzApICAgICAvKiE8IE9QQU1QIGludmVydGluZyBpbnB1dCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4gKHBpbiBQQTMgZm9yIE9QQU1QMSwgcGluIFBBNSBmb3IgT1BBTVAyLCBwaW4gUEIyICAgZm9yIE9QQU1QMywgcGluIFBEOCAgZm9yIE9QQU1QNCkuIE5vdGU6IE9QQU1QIGludmVydGluZyBpbnB1dCBpcyB1c2VkIHdpdGggT1BBTVAgaW4gbW9kZSBzdGFuZGFsb25lIG9yIFBHQSB3aXRoIGV4dGVybmFsIGNhcGFjaXRvcnMgZm9yIGZpbHRlcmluZyBjaXJjdWl0LiBPdGhlcndpc2UgKE9QQU1QIGluIG1vZGUgZm9sbG93ZXIpLCBPUEFNUCBpbnZlcnRpbmcgaW5wdXQgaXMgbm90IHVzZWQgKG5vdCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pLiAqLworI2RlZmluZSBMTF9PUEFNUF9JTlBVVF9JTlZFUlRfQ09OTkVDVF9OTyAoT1BBTVBfQ1NSX1ZNU0VMXzEpICAgICAvKiE8IE9QQU1QIGludmVydGluZyBpbnB1dCBub3QgZXh0ZXJuYWxseSBjb25uZWN0ZWQgKGludGVuZGVkIGZvciBPUEFNUCBpbiBtb2RlIGZvbGxvd2VyIG9yIFBHQSB3aXRob3V0IGV4dGVybmFsIGNhcGFjaXRvcnMgZm9yIGZpbHRlcmluZykuIE5vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWUsIHRoaXMgbGl0ZXJhbCBpbmNsdWRlIGNhc2VzIG9mIHZhbHVlIDB4MTEgZm9yIG1vZGUgZm9sbG93ZXIgYW5kIHZhbHVlIDB4MTAgZm9yIG1vZGUgUEdBLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBPUEFNUF9MTF9FQ19JTlBVVF9OT05JTlZFUlRJTkdfU0VDT05EQVJZIE9QQU1QIGlucHV0IG5vbi1pbnZlcnRpbmcgc2Vjb25kYXJ5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfT1BBTVBfSU5QVVRfTk9OSU5WRVJUX0lPMF9TRUMgICAoTExfT1BBTVBfSU5QVVRfTk9OSU5WRVJUX0lPMCAgIDw8IChPUEFNUF9DU1JfVlBTU0VMX1BvcyAtIE9QQU1QX0NTUl9WUFNFTF9Qb3MpKSAvKiE8IE9QQU1QIG5vbiBpbnZlcnRpbmcgaW5wdXQgc2Vjb25kYXJ5IGNvbm5lY3RlZCB0byBHUElPIHBpbiAocGluIFBBMSBmb3IgT1BBTVAxLCBwaW4gUEE3ICBmb3IgT1BBTVAyLCBwaW4gUEIwICBmb3IgT1BBTVAzLCBwaW4gUEIxMyBmb3IgT1BBTVA0KSAqLworI2RlZmluZSBMTF9PUEFNUF9JTlBVVF9OT05JTlZFUlRfSU8xX1NFQyAgIChMTF9PUEFNUF9JTlBVVF9OT05JTlZFUlRfSU8xICAgPDwgKE9QQU1QX0NTUl9WUFNTRUxfUG9zIC0gT1BBTVBfQ1NSX1ZQU0VMX1BvcykpIC8qITwgT1BBTVAgbm9uIGludmVydGluZyBpbnB1dCBzZWNvbmRhcnkgY29ubmVjdGVkIHRvIEdQSU8gcGluIChwaW4gUEE3IGZvciBPUEFNUDEsIHBpbiBQRDE0IGZvciBPUEFNUDIsIHBpbiBQQjEzIGZvciBPUEFNUDMsIHBpbiBQRDExIGZvciBPUEFNUDQpICovCisjZGVmaW5lIExMX09QQU1QX0lOUFVUX05PTklOVkVSVF9JTzJfU0VDICAgKExMX09QQU1QX0lOUFVUX05PTklOVkVSVF9JTzIgICA8PCAoT1BBTVBfQ1NSX1ZQU1NFTF9Qb3MgLSBPUEFNUF9DU1JfVlBTRUxfUG9zKSkgLyohPCBPUEFNUCBub24gaW52ZXJ0aW5nIGlucHV0IHNlY29uZGFyeSBjb25uZWN0ZWQgdG8gR1BJTyBwaW4gKHBpbiBQQTMgZm9yIE9QQU1QMSwgcGluIFBCMCAgZm9yIE9QQU1QMiwgcGluIFBBMSAgZm9yIE9QQU1QMywgcGluIFBCMTEgZm9yIE9QQU1QNCkgKi8KKyNkZWZpbmUgTExfT1BBTVBfSU5QVVRfTk9OSU5WRVJUX0lPM19TRUMgICAoTExfT1BBTVBfSU5QVVRfTk9OSU5WRVJUX0lPMyAgIDw8IChPUEFNUF9DU1JfVlBTU0VMX1BvcyAtIE9QQU1QX0NTUl9WUFNFTF9Qb3MpKSAvKiE8IE9QQU1QIG5vbiBpbnZlcnRpbmcgaW5wdXQgc2Vjb25kYXJ5IGNvbm5lY3RlZCB0byBHUElPIHBpbiAocGluIFBBNSBmb3IgT1BBTVAxLCBwaW4gUEQxNCBmb3IgT1BBTVAyLCBwaW4gUEE1ICBmb3IgT1BBTVAzLCBwaW4gUEE0ICBmb3IgT1BBTVA0KSAqLworI2RlZmluZSBMTF9PUEFNUF9JTlBVVF9OT05JTlZfREFDMV9DSDFfU0VDIChMTF9PUEFNUF9JTlBVVF9OT05JTlZfREFDMV9DSDEgPDwgKE9QQU1QX0NTUl9WUFNTRUxfUG9zIC0gT1BBTVBfQ1NSX1ZQU0VMX1BvcykpIC8qITwgT1BBTVAgbm9uIGludmVydGluZyBpbnB1dCBzZWNvbmRhcnkgY29ubmVjdGVkIHRvIERBQzEgY2hhbm5lbDEgb3V0cHV0IChzcGVjaWZpYyB0byBPUEFNUCBpbnN0YW5jZXM6IE9QQU1QNCkgKi8KKyNkZWZpbmUgTExfT1BBTVBfSU5QVVRfTk9OSU5WX0RBQzFfQ0gyX1NFQyAoTExfT1BBTVBfSU5QVVRfTk9OSU5WX0RBQzFfQ0gyIDw8IChPUEFNUF9DU1JfVlBTU0VMX1BvcyAtIE9QQU1QX0NTUl9WUFNFTF9Qb3MpKSAvKiE8IE9QQU1QIG5vbiBpbnZlcnRpbmcgaW5wdXQgc2Vjb25kYXJ5IGNvbm5lY3RlZCB0byBEQUMxIGNoYW5uZWwyIG91dHB1dCAoc3BlY2lmaWMgdG8gT1BBTVAgaW5zdGFuY2VzOiBPUEFNUDEsIE9QQU1QMykgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIE9QQU1QX0xMX0VDX0lOUFVUX0lOVkVSVElOR19TRUNPTkRBUlkgT1BBTVAgaW5wdXQgaW52ZXJ0aW5nIHNlY29uZGFyeQorICAqIEB7CisgICovCisjZGVmaW5lIExMX09QQU1QX0lOUFVUX0lOVkVSVF9JTzBfU0VDICAgIChMTF9PUEFNUF9JTlBVVF9JTlZFUlRfSU8wIDw8IChPUEFNUF9DU1JfVk1TU0VMX1BvcyAtIE9QQU1QX0NTUl9WTVNFTF9Qb3MpKSAvKiE8IE9QQU1QIGludmVydGluZyBpbnB1dCBzZWNvbmRhcnkgY29ubmVjdGVkIHRvIEdQSU8gcGluIChwaW4gUEM1IGZvciBPUEFNUDEsIHBpbiBQQzUgZm9yIE9QQU1QMiwgcGluIFBCMTAgIGZvciBPUEFNUDMsIHBpbiBQQjEwIGZvciBPUEFNUDQpLiBOb3RlOiBPUEFNUCBpbnZlcnRpbmcgaW5wdXQgaXMgdXNlZCB3aXRoIE9QQU1QIGluIG1vZGUgc3RhbmRhbG9uZSBvciBQR0Egd2l0aCBleHRlcm5hbCBjYXBhY2l0b3JzIGZvciBmaWx0ZXJpbmcgY2lyY3VpdC4gT3RoZXJ3aXNlIChPUEFNUCBpbiBtb2RlIGZvbGxvd2VyKSwgT1BBTVAgaW52ZXJ0aW5nIGlucHV0IGlzIG5vdCB1c2VkIChub3QgY29ubmVjdGVkIHRvIEdQSU8gcGluKS4gKi8KKyNkZWZpbmUgTExfT1BBTVBfSU5QVVRfSU5WRVJUX0lPMV9TRUMgICAgKExMX09QQU1QX0lOUFVUX0lOVkVSVF9JTzEgPDwgKE9QQU1QX0NTUl9WTVNTRUxfUG9zIC0gT1BBTVBfQ1NSX1ZNU0VMX1BvcykpIC8qITwgT1BBTVAgaW52ZXJ0aW5nIGlucHV0IHNlY29uZGFyeSBjb25uZWN0ZWQgdG8gR1BJTyBwaW4gKHBpbiBQQTMgZm9yIE9QQU1QMSwgcGluIFBBNSBmb3IgT1BBTVAyLCBwaW4gUEIyICAgZm9yIE9QQU1QMywgcGluIFBEOCAgZm9yIE9QQU1QNCkuIE5vdGU6IE9QQU1QIGludmVydGluZyBpbnB1dCBpcyB1c2VkIHdpdGggT1BBTVAgaW4gbW9kZSBzdGFuZGFsb25lIG9yIFBHQSB3aXRoIGV4dGVybmFsIGNhcGFjaXRvcnMgZm9yIGZpbHRlcmluZyBjaXJjdWl0LiBPdGhlcndpc2UgKE9QQU1QIGluIG1vZGUgZm9sbG93ZXIpLCBPUEFNUCBpbnZlcnRpbmcgaW5wdXQgaXMgbm90IHVzZWQgKG5vdCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBPUEFNUF9MTF9FQ19JTlBVVF9NVVhfTU9ERSBPUEFNUCBpbnB1dHMgbXVsdGlwbGV4ZXIgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX09QQU1QX0lOUFVUX01VWF9ESVNBQkxFICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAvKiE8IE9QQU1QIGlucHV0cyBtdWx0aXBsZXhlciBtb2RlIGRvc2FibGVkLiAqLworI2RlZmluZSBMTF9PUEFNUF9JTlBVVF9NVVhfVElNMV9DSDYgICAgKE9QQU1QX0NTUl9UQ01FTikgICAgICAgIC8qITwgT1BBTVAgaW5wdXRzIG11bHRpcGxleGVyIG1vZGUgZW5hYmxlZCwgY29udHJvbGxlZCBieSBUSU0xIENDNi4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgT1BBTVBfTExfRUNfVlJFRl9PVVRQVVQgT1BBTVAgaW50ZXJuYWwgcmVmZXJlbmNlIHZvbHRhZ2UgcGF0aCBzdGF0ZSB0byBvdXRwdXQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9PUEFNUF9WUkVGX09VVFBVVF9ESVNBQkxFICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAvKiE8IE9QQU1QIGludGVybmFsIHJlZmVyZW5jZSB2b2x0YWdlIHBhdGggdG8gb3V0cHV0IGlzIGRpc2FibGVkLiAqLworI2RlZmluZSBMTF9PUEFNUF9WUkVGX09VVFBVVF9FTkFCTEUgICAgIChPUEFNUF9DU1JfVFNUUkVGKSAgICAgICAvKiE8IE9QQU1QIGludGVybmFsIHJlZmVyZW5jZSB2b2x0YWdlIHBhdGggdG8gb3V0cHV0IGlzIGVuYWJsZWQuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIE9QQU1QX0xMX0VDX1RSSU1NSU5HX01PREUgT1BBTVAgdHJpbW1pbmcgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX09QQU1QX1RSSU1NSU5HX0ZBQ1RPUlkgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBPUEFNUCB0cmltbWluZyBmYWN0b3JzIHNldCB0byBmYWN0b3J5IHZhbHVlcyAqLworI2RlZmluZSBMTF9PUEFNUF9UUklNTUlOR19VU0VSICAgICAgICAgIChPUEFNUF9DU1JfVVNFUlRSSU0pICAgIC8qITwgT1BBTVAgdHJpbW1pbmcgZmFjdG9ycyBzZXQgdG8gdXNlciB2YWx1ZXMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgT1BBTVBfTExfRUNfVFJJTU1JTkdfVFJBTlNJU1RPUlNfRElGRl9QQUlSIE9QQU1QIHRyaW1taW5nIG9mIHRyYW5zaXN0b3JzIGRpZmZlcmVudGlhbCBwYWlyIE5NT1Mgb3IgUE1PUworICAqIEB7CisgICovCisjZGVmaW5lIExMX09QQU1QX1RSSU1NSU5HX05NT1NfVlJFRl85MFBDX1ZEREEgIChPUEFNUF9DU1JfVFJJTU9GRlNFVE4gfCBPUEFNUF9DU1JfQ0FMU0VMXzEgfCBPUEFNUF9DU1JfQ0FMU0VMXzApIC8qITwgT1BBTVAgdHJpbW1pbmcgb2YgdHJhbnNpc3RvcnMgZGlmZmVyZW50aWFsIHBhaXIgTk1PUyAoaW50ZXJuYWwgcmVmZXJlbmNlIHZvbHRhZ2Ugc2V0IHRvIDAuOSpWZGRhKS4gRGVmYXVsdCBwYXJhbWV0ZXJzIHRvIGJlIHVzZWQgZm9yIGNhbGlicmF0aW9uIHVzaW5nIHR3byB0cmltbWluZyBzdGVwcyAob25lIHdpdGggZWFjaCB0cmFuc2lzdG9ycyBkaWZmZXJlbnRpYWwgcGFpciBOTU9TIGFuZCBQTU9TKS4gKi8KKyNkZWZpbmUgTExfT1BBTVBfVFJJTU1JTkdfTk1PU19WUkVGXzUwUENfVkREQSAgKE9QQU1QX0NTUl9UUklNT0ZGU0VUTiB8IE9QQU1QX0NTUl9DQUxTRUxfMSAgICAgICAgICAgICAgICAgICAgICkgLyohPCBPUEFNUCB0cmltbWluZyBvZiB0cmFuc2lzdG9ycyBkaWZmZXJlbnRpYWwgcGFpciBOTU9TIChpbnRlcm5hbCByZWZlcmVuY2Ugdm9sdGFnZSBzZXQgdG8gMC41KlZkZGEpLiAqLworI2RlZmluZSBMTF9PUEFNUF9UUklNTUlOR19QTU9TX1ZSRUZfMTBQQ19WRERBICAoT1BBTVBfQ1NSX1RSSU1PRkZTRVRQICAgICAgICAgICAgICAgICAgICAgIHwgT1BBTVBfQ1NSX0NBTFNFTF8wKSAvKiE8IE9QQU1QIHRyaW1taW5nIG9mIHRyYW5zaXN0b3JzIGRpZmZlcmVudGlhbCBwYWlyIFBNT1MgKGludGVybmFsIHJlZmVyZW5jZSB2b2x0YWdlIHNldCB0byAwLjEqVmRkYSkuIERlZmF1bHQgcGFyYW1ldGVycyB0byBiZSB1c2VkIGZvciBjYWxpYnJhdGlvbiB1c2luZyB0d28gdHJpbW1pbmcgc3RlcHMgKG9uZSB3aXRoIGVhY2ggdHJhbnNpc3RvcnMgZGlmZmVyZW50aWFsIHBhaXIgTk1PUyBhbmQgUE1PUykuICovCisjZGVmaW5lIExMX09QQU1QX1RSSU1NSU5HX1BNT1NfVlJFRl8zXzNQQ19WRERBIChPUEFNUF9DU1JfVFJJTU9GRlNFVFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgT1BBTVAgdHJpbW1pbmcgb2YgdHJhbnNpc3RvcnMgZGlmZmVyZW50aWFsIHBhaXIgUE1PUyAoaW50ZXJuYWwgcmVmZXJlbmNlIHZvbHRhZ2Ugc2V0IHRvIDAuMzMqVmRkYSkuICovCisjZGVmaW5lIExMX09QQU1QX1RSSU1NSU5HX05NT1MgICAgICAgICAgKExMX09QQU1QX1RSSU1NSU5HX05NT1NfVlJFRl85MFBDX1ZEREEpIC8qITwgT1BBTVAgdHJpbW1pbmcgb2YgdHJhbnNpc3RvcnMgZGlmZmVyZW50aWFsIHBhaXIgTk1PUyAoaW50ZXJuYWwgcmVmZXJlbmNlIHZvbHRhZ2Ugc2V0IHRvIDAuOSpWZGRhKS4gRGVmYXVsdCBwYXJhbWV0ZXJzIHRvIGJlIHVzZWQgZm9yIGNhbGlicmF0aW9uIHVzaW5nIHR3byB0cmltbWluZyBzdGVwcyAob25lIHdpdGggZWFjaCB0cmFuc2lzdG9ycyBkaWZmZXJlbnRpYWwgcGFpciBOTU9TIGFuZCBQTU9TKS4gKi8KKyNkZWZpbmUgTExfT1BBTVBfVFJJTU1JTkdfUE1PUyAgICAgICAgICAoTExfT1BBTVBfVFJJTU1JTkdfUE1PU19WUkVGXzEwUENfVkREQSkgLyohPCBPUEFNUCB0cmltbWluZyBvZiB0cmFuc2lzdG9ycyBkaWZmZXJlbnRpYWwgcGFpciBQTU9TIChpbnRlcm5hbCByZWZlcmVuY2Ugdm9sdGFnZSBzZXQgdG8gMC4xKlZkZGEpLiBEZWZhdWx0IHBhcmFtZXRlcnMgdG8gYmUgdXNlZCBmb3IgY2FsaWJyYXRpb24gdXNpbmcgdHdvIHRyaW1taW5nIHN0ZXBzIChvbmUgd2l0aCBlYWNoIHRyYW5zaXN0b3JzIGRpZmZlcmVudGlhbCBwYWlyIE5NT1MgYW5kIFBNT1MpLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBPUEFNUF9MTF9FQ19IV19ERUxBWVMgIERlZmluaXRpb25zIG9mIE9QQU1QIGhhcmR3YXJlIGNvbnN0cmFpbnRzIGRlbGF5cworICAqIEBub3RlICAgT25seSBPUEFNUCBJUCBIVyBkZWxheXMgYXJlIGRlZmluZWQgaW4gT1BBTVAgTEwgZHJpdmVyIGRyaXZlciwKKyAgKiAgICAgICAgIG5vdCB0aW1lb3V0IHZhbHVlcy4KKyAgKiAgICAgICAgIEZvciBkZXRhaWxzIG9uIGRlbGF5cyB2YWx1ZXMsIHJlZmVyIHRvIGRlc2NyaXB0aW9ucyBpbiBzb3VyY2UgY29kZQorICAqICAgICAgICAgYWJvdmUgZWFjaCBsaXRlcmFsIGRlZmluaXRpb24uCisgICogQHsKKyAgKi8KKworLyogRGVsYXkgZm9yIE9QQU1QIHN0YXJ0dXAgdGltZSAodHJhbnNpdGlvbiBmcm9tIHN0YXRlIGRpc2FibGUgdG8gZW5hYmxlKS4gICAgKi8KKy8qIE5vdGU6IE9QQU1QIHN0YXJ0dXAgdGltZSBkZXBlbmRzIG9uIGJvYXJkIGFwcGxpY2F0aW9uIGVudmlyb25tZW50OiAgICAgICAgICovCisvKiAgICAgICBpbXBlZGFuY2UgY29ubmVjdGVkIHRvIE9QQU1QIG91dHB1dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgVGhlIGRlbGF5IGJlbG93IGlzIHNwZWNpZmllZCB1bmRlciBjb25kaXRpb25zOiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAtIE9QQU1QIGluIGZ1bmN0aW9uYWwgbW9kZSBmb2xsb3dlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgLSBsb2FkIGltcGVkYW5jZSBvZiA0a09obSAobWluKSwgNTBwRiAobWF4KSAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTGl0ZXJhbCBzZXQgdG8gbWF4aW11bSB2YWx1ZSAocmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgICAgICAgICAgICAgICAgICAgKi8KKy8qIHBhcmFtZXRlciAidFdBS0VVUCIpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBVbml0OiB1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9PUEFNUF9ERUxBWV9TVEFSVFVQX1VTICAgICAgICAgKCh1aW50MzJfdCkgIDVVKSAgLyohPCBEZWxheSBmb3IgT1BBTVAgc3RhcnR1cCB0aW1lICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIE9QQU1QX0xMX0V4cG9ydGVkX01hY3JvcyBPUEFNUCBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworLyoqIEBkZWZncm91cCBPUEFNUF9MTF9FTV9XUklURV9SRUFEIENvbW1vbiB3cml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgbWFjcm8KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIE9QQU1QIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gT1BBTVAgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIExMX09QQU1QX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gT1BBTVAgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBPUEFNUCBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICAqLworI2RlZmluZSBMTF9PUEFNUF9SZWFkUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXykgUkVBRF9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgT1BBTVBfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIE9QQU1QIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgT1BBTVBfTExfRUZfQ09ORklHVVJBVElPTl9PUEFNUF9JTlNUQU5DRSBDb25maWd1cmF0aW9uIG9mIE9QQU1QIGhpZXJhcmNoaWNhbCBzY29wZTogT1BBTVAgaW5zdGFuY2UKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBPUEFNUCBtb2RlIGNhbGlicmF0aW9uIG9yIGZ1bmN0aW9uYWwuCisgICogQG5vdGUgICBPUEFNUCBtb2RlIGNvcnJlc3BvbmRzIHRvIGZ1bmN0aW9uYWwgb3IgY2FsaWJyYXRpb24gbW9kZToKKyAgKiAgICAgICAgICAtIGZ1bmN0aW9uYWwgbW9kZTogT1BBTVAgb3BlcmF0aW9uIGluIHN0YW5kYWxvbmUsIGZvbGxvd2VyLCAuLi4KKyAgKiAgICAgICAgICAgIFNldCBmdW5jdGlvbmFsIG1vZGUgdXNpbmcgZnVuY3Rpb24KKyAgKiAgICAgICAgICAgIEByZWYgTExfT1BBTVBfU2V0RnVuY3Rpb25hbE1vZGUoKS4KKyAgKiAgICAgICAgICAtIGNhbGlicmF0aW9uIG1vZGU6IG9mZnNldCBjYWxpYnJhdGlvbiBvZiB0aGUgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIHRyYW5zaXN0b3JzIGRpZmZlcmVudGlhbCBwYWlyIE5NT1Mgb3IgUE1PUy4KKyAgKiBAcm10b2xsIENTUiAgICAgIENBTE9OICAgICAgICAgIExMX09QQU1QX1NldE1vZGUKKyAgKiBAcGFyYW0gIE9QQU1QeCBPUEFNUCBpbnN0YW5jZQorICAqIEBwYXJhbSAgTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX01PREVfRlVOQ1RJT05BTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX01PREVfQ0FMSUJSQVRJT04KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX09QQU1QX1NldE1vZGUoT1BBTVBfVHlwZURlZiAqT1BBTVB4LCB1aW50MzJfdCBNb2RlKQoreworICBNT0RJRllfUkVHKE9QQU1QeC0+Q1NSLCBPUEFNUF9DU1JfQ0FMT04sIE1vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBPUEFNUCBtb2RlIGNhbGlicmF0aW9uIG9yIGZ1bmN0aW9uYWwuCisgICogQG5vdGUgICBPUEFNUCBtb2RlIGNvcnJlc3BvbmRzIHRvIGZ1bmN0aW9uYWwgb3IgY2FsaWJyYXRpb24gbW9kZToKKyAgKiAgICAgICAgICAtIGZ1bmN0aW9uYWwgbW9kZTogT1BBTVAgb3BlcmF0aW9uIGluIHN0YW5kYWxvbmUsIGZvbGxvd2VyLCAuLi4KKyAgKiAgICAgICAgICAgIFNldCBmdW5jdGlvbmFsIG1vZGUgdXNpbmcgZnVuY3Rpb24KKyAgKiAgICAgICAgICAgIEByZWYgTExfT1BBTVBfU2V0RnVuY3Rpb25hbE1vZGUoKS4KKyAgKiAgICAgICAgICAtIGNhbGlicmF0aW9uIG1vZGU6IG9mZnNldCBjYWxpYnJhdGlvbiBvZiB0aGUgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIHRyYW5zaXN0b3JzIGRpZmZlcmVudGlhbCBwYWlyIE5NT1Mgb3IgUE1PUy4KKyAgKiBAcm10b2xsIENTUiAgICAgIENBTE9OICAgICAgICAgIExMX09QQU1QX0dldE1vZGUKKyAgKiBAcGFyYW0gIE9QQU1QeCBPUEFNUCBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9PUEFNUF9NT0RFX0ZVTkNUSU9OQUwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9PUEFNUF9NT0RFX0NBTElCUkFUSU9OCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfT1BBTVBfR2V0TW9kZShPUEFNUF9UeXBlRGVmICpPUEFNUHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKE9QQU1QeC0+Q1NSLCBPUEFNUF9DU1JfQ0FMT04pKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgT1BBTVAgZnVuY3Rpb25hbCBtb2RlIGJ5IHNldHRpbmcgaW50ZXJuYWwgY29ubmVjdGlvbnMuCisgICogICAgICAgICBPUEFNUCBvcGVyYXRpb24gaW4gc3RhbmRhbG9uZSwgZm9sbG93ZXIsIC4uLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiByZXNldCBiaXQgb2YgY2FsaWJyYXRpb24gbW9kZSB0byBlbnN1cmUKKyAgKiAgICAgICAgIHRvIGJlIGluIGZ1bmN0aW9uYWwgbW9kZSwgaW4gb3JkZXIgdG8gaGF2ZSBPUEFNUCBwYXJhbWV0ZXJzCisgICogICAgICAgICAoaW5wdXRzIHNlbGVjdGlvbiwgLi4uKSBzZXQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBPUEFNUCBtb2RlCisgICogICAgICAgICB0byBiZSBlZmZlY3RpdmUuCisgICogQHJtdG9sbCBDU1IgICAgICBWTVNFTCAgICAgICAgICBMTF9PUEFNUF9TZXRGdW5jdGlvbmFsTW9kZQorICAqIEBwYXJhbSAgT1BBTVB4IE9QQU1QIGluc3RhbmNlCisgICogQHBhcmFtICBGdW5jdGlvbmFsTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX01PREVfU1RBTkRBTE9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX01PREVfRk9MTE9XRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9PUEFNUF9NT0RFX1BHQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX01PREVfUEdBX0VYVF9GSUxUX0lPMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX01PREVfUEdBX0VYVF9GSUxUX0lPMQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfT1BBTVBfU2V0RnVuY3Rpb25hbE1vZGUoT1BBTVBfVHlwZURlZiAqT1BBTVB4LCB1aW50MzJfdCBGdW5jdGlvbmFsTW9kZSkKK3sKKyAgLyogTm90ZTogQml0IE9QQU1QX0NTUl9DQUxPTiByZXNldCB0byBlbnN1cmUgdG8gYmUgaW4gZnVuY3Rpb25hbCBtb2RlICovCisgIE1PRElGWV9SRUcoT1BBTVB4LT5DU1IsIE9QQU1QX0NTUl9QR0dBSU5fMyB8IE9QQU1QX0NTUl9QR0dBSU5fMiB8IE9QQU1QX0NTUl9WTVNFTCB8IE9QQU1QX0NTUl9DQUxPTiwgRnVuY3Rpb25hbE1vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBPUEFNUCBmdW5jdGlvbmFsIG1vZGUgZnJvbSBzZXR0aW5nIG9mIGludGVybmFsIGNvbm5lY3Rpb25zLgorICAqICAgICAgICAgT1BBTVAgb3BlcmF0aW9uIGluIHN0YW5kYWxvbmUsIGZvbGxvd2VyLCAuLi4KKyAgKiBAcm10b2xsIENTUiAgICAgIFZNU0VMICAgICAgICAgIExMX09QQU1QX0dldEZ1bmN0aW9uYWxNb2RlCisgICogQHBhcmFtICBPUEFNUHggT1BBTVAgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfT1BBTVBfTU9ERV9TVEFOREFMT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfT1BBTVBfTU9ERV9GT0xMT1dFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX01PREVfUEdBCisgICogICAgICAgICBAYXJnIEByZWYgTExfT1BBTVBfTU9ERV9QR0FfRVhUX0ZJTFRfSU8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfT1BBTVBfTU9ERV9QR0FfRVhUX0ZJTFRfSU8xCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfT1BBTVBfR2V0RnVuY3Rpb25hbE1vZGUoT1BBTVBfVHlwZURlZiAqT1BBTVB4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChPUEFNUHgtPkNTUiwgT1BBTVBfQ1NSX1BHR0FJTl8zIHwgT1BBTVBfQ1NSX1BHR0FJTl8yIHwgT1BBTVBfQ1NSX1ZNU0VMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IE9QQU1QIFBHQSBnYWluLgorICAqIEBub3RlICAgUHJlbGltaW5hcmlseSwgT1BBTVAgbXVzdCBiZSBzZXQgaW4gbW9kZSBQR0EKKyAgKiAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEByZWYgTExfT1BBTVBfU2V0RnVuY3Rpb25hbE1vZGUoKS4KKyAgKiBAcm10b2xsIENTUiAgICAgIFBHR0FJTiAgICAgICAgIExMX09QQU1QX1NldFBHQUdhaW4KKyAgKiBAcGFyYW0gIE9QQU1QeCBPUEFNUCBpbnN0YW5jZQorICAqIEBwYXJhbSAgUEdBR2FpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX1BHQV9HQUlOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9PUEFNUF9QR0FfR0FJTl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfT1BBTVBfUEdBX0dBSU5fOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX1BHQV9HQUlOXzE2CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9PUEFNUF9TZXRQR0FHYWluKE9QQU1QX1R5cGVEZWYgKk9QQU1QeCwgdWludDMyX3QgUEdBR2FpbikKK3sKKyAgTU9ESUZZX1JFRyhPUEFNUHgtPkNTUiwgT1BBTVBfQ1NSX1BHR0FJTl8xIHwgT1BBTVBfQ1NSX1BHR0FJTl8wLCBQR0FHYWluKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgT1BBTVAgUEdBIGdhaW4uCisgICogQG5vdGUgICBQcmVsaW1pbmFyaWx5LCBPUEFNUCBtdXN0IGJlIHNldCBpbiBtb2RlIFBHQQorICAqICAgICAgICAgdXNpbmcgZnVuY3Rpb24gQHJlZiBMTF9PUEFNUF9TZXRGdW5jdGlvbmFsTW9kZSgpLgorICAqIEBybXRvbGwgQ1NSICAgICAgUEdHQUlOICAgICAgICAgTExfT1BBTVBfR2V0UEdBR2FpbgorICAqIEBwYXJhbSAgT1BBTVB4IE9QQU1QIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX1BHQV9HQUlOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9PUEFNUF9QR0FfR0FJTl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfT1BBTVBfUEdBX0dBSU5fOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX1BHQV9HQUlOXzE2CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfT1BBTVBfR2V0UEdBR2FpbihPUEFNUF9UeXBlRGVmICpPUEFNUHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKE9QQU1QeC0+Q1NSLCBPUEFNUF9DU1JfUEdHQUlOXzEgfCBPUEFNUF9DU1JfUEdHQUlOXzApKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBPUEFNUF9MTF9FRl9DT05GSUdVUkFUSU9OX0lOUFVUUyBDb25maWd1cmF0aW9uIG9mIE9QQU1QIGlucHV0cworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IE9QQU1QIG5vbi1pbnZlcnRpbmcgaW5wdXQgY29ubmVjdGlvbi4KKyAgKiBAcm10b2xsIENTUiAgICAgIFZQU0VMICAgICAgICAgIExMX09QQU1QX1NldElucHV0Tm9uSW52ZXJ0aW5nCisgICogQHBhcmFtICBPUEFNUHggT1BBTVAgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIElucHV0Tm9uSW52ZXJ0aW5nIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfT1BBTVBfSU5QVVRfTk9OSU5WRVJUX0lPMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX0lOUFVUX05PTklOVkVSVF9JTzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9PUEFNUF9JTlBVVF9OT05JTlZFUlRfSU8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfT1BBTVBfSU5QVVRfTk9OSU5WRVJUX0lPMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX0lOUFVUX05PTklOVl9EQUMxX0NIMSAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9PUEFNUF9JTlBVVF9OT05JTlZfREFDMV9DSDIgKDIpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gT1BBTVAgaW5zdGFuY2VzOiBPUEFNUDQuXG4KKyAgKiAgICAgICAgICgyKSBQYXJhbWV0ZXIgc3BlY2lmaWMgdG8gT1BBTVAgaW5zdGFuY2VzOiBPUEFNUDEsIE9QQU1QMy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX09QQU1QX1NldElucHV0Tm9uSW52ZXJ0aW5nKE9QQU1QX1R5cGVEZWYgKk9QQU1QeCwgdWludDMyX3QgSW5wdXROb25JbnZlcnRpbmcpCit7CisgIE1PRElGWV9SRUcoT1BBTVB4LT5DU1IsIE9QQU1QX0NTUl9WUFNFTCwgSW5wdXROb25JbnZlcnRpbmcpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBPUEFNUCBub24taW52ZXJ0aW5nIGlucHV0IGNvbm5lY3Rpb24uCisgICogQHJtdG9sbCBDU1IgICAgICBWUFNFTCAgICAgICAgICBMTF9PUEFNUF9HZXRJbnB1dE5vbkludmVydGluZworICAqIEBwYXJhbSAgT1BBTVB4IE9QQU1QIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX0lOUFVUX05PTklOVkVSVF9JTzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9PUEFNUF9JTlBVVF9OT05JTlZFUlRfSU8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfT1BBTVBfSU5QVVRfTk9OSU5WRVJUX0lPMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX0lOUFVUX05PTklOVkVSVF9JTzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9PUEFNUF9JTlBVVF9OT05JTlZfREFDMV9DSDEgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfT1BBTVBfSU5QVVRfTk9OSU5WX0RBQzFfQ0gyICgyKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgUGFyYW1ldGVyIHNwZWNpZmljIHRvIE9QQU1QIGluc3RhbmNlczogT1BBTVA0LlxuCisgICogICAgICAgICAoMikgUGFyYW1ldGVyIHNwZWNpZmljIHRvIE9QQU1QIGluc3RhbmNlczogT1BBTVAxLCBPUEFNUDMuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfT1BBTVBfR2V0SW5wdXROb25JbnZlcnRpbmcoT1BBTVBfVHlwZURlZiAqT1BBTVB4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChPUEFNUHgtPkNTUiwgT1BBTVBfQ1NSX1ZQU0VMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IE9QQU1QIGludmVydGluZyBpbnB1dCBjb25uZWN0aW9uLgorICAqIEBub3RlICAgT1BBTVAgaW52ZXJ0aW5nIGlucHV0IGlzIHVzZWQgd2l0aCBPUEFNUCBpbiBtb2RlIHN0YW5kYWxvbmUKKyAgKiAgICAgICAgIG9yIFBHQSB3aXRoIGV4dGVybmFsIGNhcGFjaXRvcnMgZm9yIGZpbHRlcmluZyBjaXJjdWl0LgorICAqICAgICAgICAgT3RoZXJ3aXNlIChPUEFNUCBpbiBtb2RlIGZvbGxvd2VyKSwgT1BBTVAgaW52ZXJ0aW5nIGlucHV0CisgICogICAgICAgICBpcyBub3QgdXNlZCAobm90IGNvbm5lY3RlZCB0byBHUElPIHBpbikuCisgICogQHJtdG9sbCBDU1IgICAgICBWTVNFTCAgICAgICAgICBMTF9PUEFNUF9TZXRJbnB1dEludmVydGluZworICAqIEBwYXJhbSAgT1BBTVB4IE9QQU1QIGluc3RhbmNlCisgICogQHBhcmFtICBJbnB1dEludmVydGluZyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX0lOUFVUX0lOVkVSVF9JTzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9PUEFNUF9JTlBVVF9JTlZFUlRfSU8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfT1BBTVBfSU5QVVRfSU5WRVJUX0NPTk5FQ1RfTk8KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX09QQU1QX1NldElucHV0SW52ZXJ0aW5nKE9QQU1QX1R5cGVEZWYgKk9QQU1QeCwgdWludDMyX3QgSW5wdXRJbnZlcnRpbmcpCit7CisgIC8qIE1hbmFnZSBjYXNlcyBvZiBPUEFNUCBpbnZlcnRpbmcgaW5wdXQgbm90IGNvbm5lY3RlZCAoMHgxMCBhbmQgMHgxMSkgICAgICAqLworICAvKiB0byBub3QgbW9kaWZ5IE9QQU1QIG1vZGUgZm9sbG93ZXIgb3IgUEdBLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQml0IE9QQU1QX0NTUl9WTVNFTF8xIGlzIHNldCBieSBPUEFNUCBtb2RlIChmb2xsb3dlciwgUEdBKS4gKi8KKyAgTU9ESUZZX1JFRyhPUEFNUHgtPkNTUiwgKH4oSW5wdXRJbnZlcnRpbmcgPj4gMSkpICYgT1BBTVBfQ1NSX1ZNU0VMXzAsIElucHV0SW52ZXJ0aW5nKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgT1BBTVAgaW52ZXJ0aW5nIGlucHV0IGNvbm5lY3Rpb24uCisgICogQHJtdG9sbCBDU1IgICAgICBWTVNFTCAgICAgICAgICBMTF9PUEFNUF9HZXRJbnB1dEludmVydGluZworICAqIEBwYXJhbSAgT1BBTVB4IE9QQU1QIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX0lOUFVUX0lOVkVSVF9JTzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9PUEFNUF9JTlBVVF9JTlZFUlRfSU8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfT1BBTVBfSU5QVVRfSU5WRVJUX0NPTk5FQ1RfTk8KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9PUEFNUF9HZXRJbnB1dEludmVydGluZyhPUEFNUF9UeXBlRGVmICpPUEFNUHgpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGlucHV0X2ludmVydGluZyA9IFJFQURfQklUKE9QQU1QeC0+Q1NSLCBPUEFNUF9DU1JfVk1TRUwpOworICAKKyAgLyogTWFuYWdlIGNhc2VzIDB4MTAgYW5kIDB4MTEgdG8gcmV0dXJuIHRoZSBzYW1lIHZhbHVlOiBPUEFNUCBpbnZlcnRpbmcgICAgICovCisgIC8qIGlucHV0IG5vdCBjb25uZWN0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICByZXR1cm4gKGlucHV0X2ludmVydGluZyAmIH4oKGlucHV0X2ludmVydGluZyA+PiAxKSAmIE9QQU1QX0NTUl9WTVNFTF8wKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IE9QQU1QIG5vbi1pbnZlcnRpbmcgaW5wdXQgc2Vjb25kYXJ5IGNvbm5lY3Rpb24uCisgICogQHJtdG9sbCBDU1IgICAgICBWUFNTRUwgICAgICAgICBMTF9PUEFNUF9TZXRJbnB1dE5vbkludmVydGluZ1NlY29uZGFyeQorICAqIEBwYXJhbSAgT1BBTVB4IE9QQU1QIGluc3RhbmNlCisgICogQHBhcmFtICBJbnB1dE5vbkludmVydGluZyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX0lOUFVUX05PTklOVkVSVF9JTzBfU0VDCisgICogICAgICAgICBAYXJnIEByZWYgTExfT1BBTVBfSU5QVVRfTk9OSU5WRVJUX0lPMV9TRUMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9PUEFNUF9JTlBVVF9OT05JTlZFUlRfSU8yX1NFQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX0lOUFVUX05PTklOVkVSVF9JTzNfU0VDCisgICogICAgICAgICBAYXJnIEByZWYgTExfT1BBTVBfSU5QVVRfTk9OSU5WX0RBQzFfQ0gxX1NFQyAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9PUEFNUF9JTlBVVF9OT05JTlZfREFDMV9DSDJfU0VDICgyKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgUGFyYW1ldGVyIHNwZWNpZmljIHRvIE9QQU1QIGluc3RhbmNlczogT1BBTVA0LlxuCisgICogICAgICAgICAoMikgUGFyYW1ldGVyIHNwZWNpZmljIHRvIE9QQU1QIGluc3RhbmNlczogT1BBTVAxLCBPUEFNUDMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9PUEFNUF9TZXRJbnB1dE5vbkludmVydGluZ1NlY29uZGFyeShPUEFNUF9UeXBlRGVmICpPUEFNUHgsIHVpbnQzMl90IElucHV0Tm9uSW52ZXJ0aW5nKQoreworICBNT0RJRllfUkVHKE9QQU1QeC0+Q1NSLCBPUEFNUF9DU1JfVlBTU0VMLCBJbnB1dE5vbkludmVydGluZyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IE9QQU1QIG5vbi1pbnZlcnRpbmcgaW5wdXQgc2Vjb25kYXJ5IGNvbm5lY3Rpb24uCisgICogQHJtdG9sbCBDU1IgICAgICBWUFNTRUwgICAgICAgICBMTF9PUEFNUF9HZXRJbnB1dE5vbkludmVydGluZ1NlY29uZGFyeQorICAqIEBwYXJhbSAgT1BBTVB4IE9QQU1QIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX0lOUFVUX05PTklOVkVSVF9JTzBfU0VDCisgICogICAgICAgICBAYXJnIEByZWYgTExfT1BBTVBfSU5QVVRfTk9OSU5WRVJUX0lPMV9TRUMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9PUEFNUF9JTlBVVF9OT05JTlZFUlRfSU8yX1NFQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX0lOUFVUX05PTklOVkVSVF9JTzNfU0VDCisgICogICAgICAgICBAYXJnIEByZWYgTExfT1BBTVBfSU5QVVRfTk9OSU5WX0RBQzFfQ0gxX1NFQyAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9PUEFNUF9JTlBVVF9OT05JTlZfREFDMV9DSDJfU0VDICgyKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgUGFyYW1ldGVyIHNwZWNpZmljIHRvIE9QQU1QIGluc3RhbmNlczogT1BBTVA0LlxuCisgICogICAgICAgICAoMikgUGFyYW1ldGVyIHNwZWNpZmljIHRvIE9QQU1QIGluc3RhbmNlczogT1BBTVAxLCBPUEFNUDMuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfT1BBTVBfR2V0SW5wdXROb25JbnZlcnRpbmdTZWNvbmRhcnkoT1BBTVBfVHlwZURlZiAqT1BBTVB4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChPUEFNUHgtPkNTUiwgT1BBTVBfQ1NSX1ZQU1NFTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBPUEFNUCBpbnZlcnRpbmcgaW5wdXQgc2Vjb25kYXJ5IGNvbm5lY3Rpb24uCisgICogQG5vdGUgICBPUEFNUCBpbnZlcnRpbmcgaW5wdXQgaXMgdXNlZCB3aXRoIE9QQU1QIGluIG1vZGUgc3RhbmRhbG9uZQorICAqICAgICAgICAgb3IgUEdBIHdpdGggZXh0ZXJuYWwgY2FwYWNpdG9ycyBmb3IgZmlsdGVyaW5nIGNpcmN1aXQuCisgICogICAgICAgICBPdGhlcndpc2UgKE9QQU1QIGluIG1vZGUgZm9sbG93ZXIpLCBPUEFNUCBpbnZlcnRpbmcgaW5wdXQKKyAgKiAgICAgICAgIGlzIG5vdCB1c2VkIChub3QgY29ubmVjdGVkIHRvIEdQSU8gcGluKS4KKyAgKiBAcm10b2xsIENTUiAgICAgIFZNU1NFTCAgICAgICAgIExMX09QQU1QX1NldElucHV0SW52ZXJ0aW5nU2Vjb25kYXJ5CisgICogQHBhcmFtICBPUEFNUHggT1BBTVAgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIElucHV0SW52ZXJ0aW5nIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfT1BBTVBfSU5QVVRfSU5WRVJUX0lPMF9TRUMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9PUEFNUF9JTlBVVF9JTlZFUlRfSU8xX1NFQworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfT1BBTVBfU2V0SW5wdXRJbnZlcnRpbmdTZWNvbmRhcnkgKE9QQU1QX1R5cGVEZWYgKk9QQU1QeCwgdWludDMyX3QgSW5wdXRJbnZlcnRpbmcpCit7CisgIE1PRElGWV9SRUcoT1BBTVB4LT5DU1IsIE9QQU1QX0NTUl9WTVNTRUwsIElucHV0SW52ZXJ0aW5nKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgT1BBTVAgaW52ZXJ0aW5nIGlucHV0IHNlY29uZGFyeSBjb25uZWN0aW9uLgorICAqIEBybXRvbGwgQ1NSICAgICAgVk1TU0VMICAgICAgICAgTExfT1BBTVBfR2V0SW5wdXRJbnZlcnRpbmdTZWNvbmRhcnkKKyAgKiBAcGFyYW0gIE9QQU1QeCBPUEFNUCBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9PUEFNUF9JTlBVVF9JTlZFUlRfSU8wX1NFQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX0lOUFVUX0lOVkVSVF9JTzFfU0VDCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfT1BBTVBfR2V0SW5wdXRJbnZlcnRpbmdTZWNvbmRhcnkoT1BBTVBfVHlwZURlZiAqT1BBTVB4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChPUEFNUHgtPkNTUiwgT1BBTVBfQ1NSX1ZNU1NFTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBPUEFNUCBpbnB1dHMgbXVsdGlwbGV4ZXIgbW9kZS4KKyAgKiBAcm10b2xsIENTUiAgICAgIFRDTUVOICAgICAgICAgIExMX09QQU1QX1NldElucHV0c011eE1vZGUKKyAgKiBAcGFyYW0gIE9QQU1QeCBPUEFNUCBpbnN0YW5jZQorICAqIEBwYXJhbSAgSW5wdXRzTXV4TW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX0lOUFVUX01VWF9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfT1BBTVBfSU5QVVRfTVVYX1RJTTFfQ0g2CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9PUEFNUF9TZXRJbnB1dHNNdXhNb2RlKE9QQU1QX1R5cGVEZWYgKk9QQU1QeCwgdWludDMyX3QgSW5wdXRzTXV4TW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhPUEFNUHgtPkNTUiwgT1BBTVBfQ1NSX1RDTUVOLCBJbnB1dHNNdXhNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgT1BBTVAgaW5wdXRzIG11bHRpcGxleGVyIG1vZGUuCisgICogQHJtdG9sbCBDU1IgICAgICBUQ01FTiAgICAgICAgICBMTF9PUEFNUF9HZXRJbnB1dHNNdXhNb2RlCisgICogQHBhcmFtICBPUEFNUHggT1BBTVAgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfT1BBTVBfSU5QVVRfTVVYX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9PUEFNUF9JTlBVVF9NVVhfVElNMV9DSDYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9PUEFNUF9HZXRJbnB1dHNNdXhNb2RlKE9QQU1QX1R5cGVEZWYgKk9QQU1QeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoT1BBTVB4LT5DU1IsIE9QQU1QX0NTUl9UQ01FTikpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIE9QQU1QX0xMX0VGX09QQU1QX1RSSU1NSU5HIENvbmZpZ3VyYXRpb24gYW5kIG9wZXJhdGlvbiBvZiBPUEFNUCB0cmltbWluZworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IE9QQU1QIHRyaW1taW5nIG1vZGUuCisgICogQHJtdG9sbCBDU1IgICAgICBVU0VSVFJJTSAgICAgICBMTF9PUEFNUF9TZXRUcmltbWluZ01vZGUKKyAgKiBAcGFyYW0gIE9QQU1QeCBPUEFNUCBpbnN0YW5jZQorICAqIEBwYXJhbSAgVHJpbW1pbmdNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfT1BBTVBfVFJJTU1JTkdfRkFDVE9SWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX1RSSU1NSU5HX1VTRVIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX09QQU1QX1NldFRyaW1taW5nTW9kZShPUEFNUF9UeXBlRGVmICpPUEFNUHgsIHVpbnQzMl90IFRyaW1taW5nTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhPUEFNUHgtPkNTUiwgT1BBTVBfQ1NSX1VTRVJUUklNLCBUcmltbWluZ01vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBPUEFNUCB0cmltbWluZyBtb2RlLgorICAqIEBybXRvbGwgQ1NSICAgICAgVVNFUlRSSU0gICAgICAgTExfT1BBTVBfR2V0VHJpbW1pbmdNb2RlCisgICogQHBhcmFtICBPUEFNUHggT1BBTVAgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfT1BBTVBfVFJJTU1JTkdfRkFDVE9SWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX1RSSU1NSU5HX1VTRVIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9PUEFNUF9HZXRUcmltbWluZ01vZGUoT1BBTVBfVHlwZURlZiAqT1BBTVB4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChPUEFNUHgtPkNTUiwgT1BBTVBfQ1NSX1VTRVJUUklNKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IE9QQU1QIG9mZnNldCB0byBjYWxpYnJhdGUgdGhlIHNlbGVjdGVkIHRyYW5zaXN0b3JzCisgICogICAgICAgICBkaWZmZXJlbnRpYWwgcGFpciBOTU9TIG9yIFBNT1MuCisgICogQG5vdGUgICBQcmVsaW1pbmFyaWx5LCBPUEFNUCBtdXN0IGJlIHNldCBpbiBtb2RlIGNhbGlicmF0aW9uCisgICogICAgICAgICB1c2luZyBmdW5jdGlvbiBAcmVmIExMX09QQU1QX1NldE1vZGUoKS4KKyAgKiBAcm10b2xsIENTUiAgICAgIENBTFNFTCAgICAgICAgIExMX09QQU1QX1NldENhbGlicmF0aW9uU2VsZWN0aW9uCisgICogQHBhcmFtICBPUEFNUHggT1BBTVAgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRyYW5zaXN0b3JzRGlmZlBhaXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9PUEFNUF9UUklNTUlOR19OTU9TICAgICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfT1BBTVBfVFJJTU1JTkdfUE1PUyAgICAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX1RSSU1NSU5HX05NT1NfVlJFRl81MFBDX1ZEREEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9PUEFNUF9UUklNTUlOR19QTU9TX1ZSRUZfM18zUENfVkREQQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgRGVmYXVsdCBwYXJhbWV0ZXJzIHRvIGJlIHVzZWQgZm9yIGNhbGlicmF0aW9uIAorICAqICAgICAgICAgICAgIHVzaW5nIHR3byB0cmltbWluZyBzdGVwcyAob25lIHdpdGggZWFjaCB0cmFuc2lzdG9ycyBkaWZmZXJlbnRpYWwKKyAgKiAgICAgICAgICAgICBwYWlyIE5NT1MgYW5kIFBNT1MpCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9PUEFNUF9TZXRDYWxpYnJhdGlvblNlbGVjdGlvbihPUEFNUF9UeXBlRGVmICpPUEFNUHgsIHVpbnQzMl90IFRyYW5zaXN0b3JzRGlmZlBhaXIpCit7CisgIC8qIFBhcmFtZXRlciB1c2VkIHdpdGggbWFzayAiT1BBTVBfVFJJTU1JTkdfU0VMRUNUX01BU0siIGJlY2F1c2UgICAgICAgICAgICAqLworICAvKiBjb250YWluaW5nIG90aGVyIGJpdHMgcmVzZXJ2ZWQgZm9yIG90aGVyIHB1cnBvc2UuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTU9ESUZZX1JFRyhPUEFNUHgtPkNTUiwgT1BBTVBfQ1NSX0NBTFNFTCwgKFRyYW5zaXN0b3JzRGlmZlBhaXIgJiBPUEFNUF9UUklNTUlOR19TRUxFQ1RfTUFTSykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBPUEFNUCBvZmZzZXQgdG8gY2FsaWJyYXRlIHRoZSBzZWxlY3RlZCB0cmFuc2lzdG9ycworICAqICAgICAgICAgZGlmZmVyZW50aWFsIHBhaXIgTk1PUyBvciBQTU9TLgorICAqIEBub3RlICAgUHJlbGltaW5hcmlseSwgT1BBTVAgbXVzdCBiZSBzZXQgaW4gbW9kZSBjYWxpYnJhdGlvbgorICAqICAgICAgICAgdXNpbmcgZnVuY3Rpb24gQHJlZiBMTF9PUEFNUF9TZXRNb2RlKCkuCisgICogQHJtdG9sbCBDU1IgICAgICBDQUxTRUwgICAgICAgICBMTF9PUEFNUF9HZXRDYWxpYnJhdGlvblNlbGVjdGlvbgorICAqIEBwYXJhbSAgT1BBTVB4IE9QQU1QIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX1RSSU1NSU5HX05NT1MgICAgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9PUEFNUF9UUklNTUlOR19QTU9TICAgICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfT1BBTVBfVFJJTU1JTkdfTk1PU19WUkVGXzUwUENfVkREQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX1RSSU1NSU5HX1BNT1NfVlJFRl8zXzNQQ19WRERBCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBEZWZhdWx0IHBhcmFtZXRlcnMgdG8gYmUgdXNlZCBmb3IgY2FsaWJyYXRpb24gCisgICogICAgICAgICAgICAgdXNpbmcgdHdvIHRyaW1taW5nIHN0ZXBzIChvbmUgd2l0aCBlYWNoIHRyYW5zaXN0b3JzIGRpZmZlcmVudGlhbAorICAqICAgICAgICAgICAgIHBhaXIgTk1PUyBhbmQgUE1PUykKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9PUEFNUF9HZXRDYWxpYnJhdGlvblNlbGVjdGlvbihPUEFNUF9UeXBlRGVmICpPUEFNUHgpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IENhbGlicmF0aW9uU2VsZWN0aW9uID0gKHVpbnQzMl90KShSRUFEX0JJVChPUEFNUHgtPkNTUiwgT1BBTVBfQ1NSX0NBTFNFTCkpOworICAKKyAgcmV0dXJuIChDYWxpYnJhdGlvblNlbGVjdGlvbiB8CisgICAgICAgICAgKChPUEFNUF9DU1JfVFJJTU9GRlNFVE4pIDw8IChQT1NJVElPTl9WQUwoT1BBTVBfQ1NSX1RSSU1PRkZTRVRQKSAqIChDYWxpYnJhdGlvblNlbGVjdGlvbiAmJiBPUEFNUF9DU1JfQ0FMU0VMKSkpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgT1BBTVAgY2FsaWJyYXRpb24gaW50ZXJuYWwgcmVmZXJlbmNlIHZvbHRhZ2UgdG8gb3V0cHV0LgorICAqIEBybXRvbGwgQ1NSICAgICAgVFNUUkVGICAgICAgICAgTExfT1BBTVBfU2V0Q2FsaWJyYXRpb25WcmVmT3V0cHV0CisgICogQHBhcmFtICBPUEFNUHggT1BBTVAgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENhbGlicmF0aW9uVnJlZk91dHB1dCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX1ZSRUZfT1VUUFVUX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9PUEFNUF9WUkVGX09VVFBVVF9FTkFCTEUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX09QQU1QX1NldENhbGlicmF0aW9uVnJlZk91dHB1dChPUEFNUF9UeXBlRGVmICpPUEFNUHgsIHVpbnQzMl90IENhbGlicmF0aW9uVnJlZk91dHB1dCkKK3sKKyAgTU9ESUZZX1JFRyhPUEFNUHgtPkNTUiwgT1BBTVBfQ1NSX1RTVFJFRiwgQ2FsaWJyYXRpb25WcmVmT3V0cHV0KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgT1BBTVAgY2FsaWJyYXRpb24gaW50ZXJuYWwgcmVmZXJlbmNlIHZvbHRhZ2UgdG8gb3V0cHV0LgorICAqIEBybXRvbGwgQ1NSICAgICAgVFNUUkVGICAgICAgICAgTExfT1BBTVBfR2V0Q2FsaWJyYXRpb25WcmVmT3V0cHV0CisgICogQHBhcmFtICBPUEFNUHggT1BBTVAgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfT1BBTVBfVlJFRl9PVVRQVVRfRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX1ZSRUZfT1VUUFVUX0VOQUJMRQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX09QQU1QX0dldENhbGlicmF0aW9uVnJlZk91dHB1dChPUEFNUF9UeXBlRGVmICpPUEFNUHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKE9QQU1QeC0+Q1NSLCBPUEFNUF9DU1JfVFNUUkVGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IE9QQU1QIGNhbGlicmF0aW9uIHJlc3VsdCBvZiB0b2dnbGluZyBvdXRwdXQuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9ucyByZXR1cm5zOgorICAqICAgICAgICAgMCBpZiBPUEFNUCBjYWxpYnJhdGlvbiBvdXRwdXQgaXMgcmVzZXQKKyAgKiAgICAgICAgIDEgaWYgT1BBTVAgY2FsaWJyYXRpb24gb3V0cHV0IGlzIHNldAorICAqIEBybXRvbGwgQ1NSICAgICAgT1VUQ0FMICAgICAgICAgTExfT1BBTVBfSXNDYWxpYnJhdGlvbk91dHB1dFNldAorICAqIEBwYXJhbSAgT1BBTVB4IE9QQU1QIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfT1BBTVBfSXNDYWxpYnJhdGlvbk91dHB1dFNldChPUEFNUF9UeXBlRGVmICpPUEFNUHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoT1BBTVB4LT5DU1IsIE9QQU1QX0NTUl9PVVRDQUwpID09IE9QQU1QX0NTUl9PVVRDQUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBPUEFNUCB0cmltbWluZyBmYWN0b3IgZm9yIHRoZSBzZWxlY3RlZCB0cmFuc2lzdG9ycworICAqICAgICAgICAgZGlmZmVyZW50aWFsIHBhaXIgTk1PUyBvciBQTU9TLCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZWxlY3RlZAorICAqICAgICAgICAgcG93ZXIgbW9kZS4KKyAgKiBAcm10b2xsIENTUiAgICAgIFRSSU1PRkZTRVROICAgIExMX09QQU1QX1NldFRyaW1taW5nVmFsdWVcbgorICAqICAgICAgICAgQ1NSICAgICAgVFJJTU9GRlNFVFAgICAgTExfT1BBTVBfU2V0VHJpbW1pbmdWYWx1ZQorICAqIEBwYXJhbSAgT1BBTVB4IE9QQU1QIGluc3RhbmNlCisgICogQHBhcmFtICBUcmFuc2lzdG9yc0RpZmZQYWlyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfT1BBTVBfVFJJTU1JTkdfTk1PUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX1RSSU1NSU5HX1BNT1MKKyAgKiBAcGFyYW0gIFRyaW1taW5nVmFsdWUgMHgwMC4uLjB4MUYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX09QQU1QX1NldFRyaW1taW5nVmFsdWUoT1BBTVBfVHlwZURlZiogT1BBTVB4LCB1aW50MzJfdCBUcmFuc2lzdG9yc0RpZmZQYWlyLCB1aW50MzJfdCBUcmltbWluZ1ZhbHVlKQoreworICBNT0RJRllfUkVHKE9QQU1QeC0+Q1NSLAorICAgICAgICAgICAgIChUcmFuc2lzdG9yc0RpZmZQYWlyICYgT1BBTVBfVFJJTU1JTkdfVkFMVUVfTUFTSyksCisgICAgICAgICAgICAgVHJpbW1pbmdWYWx1ZSA8PCAoUE9TSVRJT05fVkFMKFRyYW5zaXN0b3JzRGlmZlBhaXIgJiBPUEFNUF9UUklNTUlOR19WQUxVRV9NQVNLKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBPUEFNUCB0cmltbWluZyBmYWN0b3IgZm9yIHRoZSBzZWxlY3RlZCB0cmFuc2lzdG9ycworICAqICAgICAgICAgZGlmZmVyZW50aWFsIHBhaXIgTk1PUyBvciBQTU9TLCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZWxlY3RlZAorICAqICAgICAgICAgcG93ZXIgbW9kZS4KKyAgKiBAcm10b2xsIENTUiAgICAgIFRSSU1PRkZTRVROICAgIExMX09QQU1QX0dldFRyaW1taW5nVmFsdWVcbgorICAqICAgICAgICAgQ1NSICAgICAgVFJJTU9GRlNFVFAgICAgTExfT1BBTVBfR2V0VHJpbW1pbmdWYWx1ZQorICAqIEBwYXJhbSAgT1BBTVB4IE9QQU1QIGluc3RhbmNlCisgICogQHBhcmFtICBUcmFuc2lzdG9yc0RpZmZQYWlyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfT1BBTVBfVFJJTU1JTkdfTk1PUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX09QQU1QX1RSSU1NSU5HX1BNT1MKKyAgKiBAcmV0dmFsIDB4MC4uLjB4MUYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9PUEFNUF9HZXRUcmltbWluZ1ZhbHVlKE9QQU1QX1R5cGVEZWYqIE9QQU1QeCwgdWludDMyX3QgVHJhbnNpc3RvcnNEaWZmUGFpcikKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoT1BBTVB4LT5DU1IsIChUcmFuc2lzdG9yc0RpZmZQYWlyICYgT1BBTVBfVFJJTU1JTkdfVkFMVUVfTUFTSykpCisgICAgICAgICAgICAgICAgICAgID4+IChQT1NJVElPTl9WQUwoVHJhbnNpc3RvcnNEaWZmUGFpciAmIE9QQU1QX1RSSU1NSU5HX1ZBTFVFX01BU0spKQorICAgICAgICAgICAgICAgICAgICk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgT1BBTVBfTExfRUZfT1BFUkFUSU9OIE9wZXJhdGlvbiBvbiBPUEFNUCBpbnN0YW5jZQorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBPUEFNUCBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIEFmdGVyIGVuYWJsZSBmcm9tIG9mZiBzdGF0ZSwgT1BBTVAgcmVxdWlyZXMgYSBkZWxheQorICAqICAgICAgICAgdG8gZnVsbGZpbGwgd2FrZSB1cCB0aW1lIHNwZWNpZmljYXRpb24uCisgICogICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCBwYXJhbWV0ZXIgInRXQUtFVVAiLgorICAqIEBybXRvbGwgQ1NSICAgICAgT1BBTVBYRU4gICAgICAgTExfT1BBTVBfRW5hYmxlCisgICogQHBhcmFtICBPUEFNUHggT1BBTVAgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX09QQU1QX0VuYWJsZShPUEFNUF9UeXBlRGVmICpPUEFNUHgpCit7CisgIFNFVF9CSVQoT1BBTVB4LT5DU1IsIE9QQU1QX0NTUl9PUEFNUHhFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBPUEFNUCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENTUiAgICAgIE9QQU1QWEVOICAgICAgIExMX09QQU1QX0Rpc2FibGUKKyAgKiBAcGFyYW0gIE9QQU1QeCBPUEFNUCBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfT1BBTVBfRGlzYWJsZShPUEFNUF9UeXBlRGVmICpPUEFNUHgpCit7CisgIENMRUFSX0JJVChPUEFNUHgtPkNTUiwgT1BBTVBfQ1NSX09QQU1QeEVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgT1BBTVAgaW5zdGFuY2UgZW5hYmxlIHN0YXRlCisgICogICAgICAgICAoMDogT1BBTVAgaXMgZGlzYWJsZWQsIDE6IE9QQU1QIGlzIGVuYWJsZWQpCisgICogQHJtdG9sbCBDU1IgICAgICBPUEFNUFhFTiAgICAgICBMTF9PUEFNUF9Jc0VuYWJsZWQKKyAgKiBAcGFyYW0gIE9QQU1QeCBPUEFNUCBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX09QQU1QX0lzRW5hYmxlZChPUEFNUF9UeXBlRGVmICpPUEFNUHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoT1BBTVB4LT5DU1IsIE9QQU1QX0NTUl9PUEFNUHhFTikgPT0gKE9QQU1QX0NTUl9PUEFNUHhFTikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIExvY2sgT1BBTVAgaW5zdGFuY2UuCisgICogQG5vdGUgICBPbmNlIGxvY2tlZCwgT1BBTVAgY29uZmlndXJhdGlvbiBjYW4gYmUgYWNjZXNzZWQgaW4gcmVhZC1vbmx5LgorICAqIEBub3RlICAgVGhlIG9ubHkgd2F5IHRvIHVubG9jayB0aGUgT1BBTVAgaXMgYSBkZXZpY2UgaGFyZHdhcmUgcmVzZXQuCisgICogQHJtdG9sbCBDU1IgICAgICBMT0NLICAgICAgICAgICBMTF9PUEFNUF9Mb2NrCisgICogQHBhcmFtICBPUEFNUHggT1BBTVAgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX09QQU1QX0xvY2soT1BBTVBfVHlwZURlZiAqT1BBTVB4KQoreworICBTRVRfQklUKE9QQU1QeC0+Q1NSLCBPUEFNUF9DU1JfTE9DSyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IE9QQU1QIGxvY2sgc3RhdGUKKyAgKiAgICAgICAgICgwOiBPUEFNUCBpcyB1bmxvY2tlZCwgMTogT1BBTVAgaXMgbG9ja2VkKS4KKyAgKiBAbm90ZSAgIE9uY2UgbG9ja2VkLCBPUEFNUCBjb25maWd1cmF0aW9uIGNhbiBiZSBhY2Nlc3NlZCBpbiByZWFkLW9ubHkuCisgICogQG5vdGUgICBUaGUgb25seSB3YXkgdG8gdW5sb2NrIHRoZSBPUEFNUCBpcyBhIGRldmljZSBoYXJkd2FyZSByZXNldC4KKyAgKiBAcm10b2xsIENTUiAgICAgIExPQ0sgICAgICAgICAgIExMX09QQU1QX0lzTG9ja2VkCisgICogQHBhcmFtICBPUEFNUHggT1BBTVAgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9PUEFNUF9Jc0xvY2tlZChPUEFNUF9UeXBlRGVmICpPUEFNUHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoT1BBTVB4LT5DU1IsIE9QQU1QX0NTUl9MT0NLKSA9PSAoT1BBTVBfQ1NSX0xPQ0spKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBPUEFNUF9MTF9FRl9Jbml0IEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCitFcnJvclN0YXR1cyBMTF9PUEFNUF9EZUluaXQoT1BBTVBfVHlwZURlZiAqT1BBTVB4KTsKK0Vycm9yU3RhdHVzIExMX09QQU1QX0luaXQoT1BBTVBfVHlwZURlZiAqT1BBTVB4LCBMTF9PUEFNUF9Jbml0VHlwZURlZiAqT1BBTVBfSW5pdFN0cnVjdCk7Cit2b2lkICAgICAgICBMTF9PUEFNUF9TdHJ1Y3RJbml0KExMX09QQU1QX0luaXRUeXBlRGVmICpPUEFNUF9Jbml0U3RydWN0KTsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIE9QQU1QMSB8fCBPUEFNUDIgfHwgT1BBTVAzIHx8IE9QQU1QNCAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkYzeHhfTExfT1BBTVBfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjN4eF9sbF9wd3IuaCBiL0luYy9zdG0zMmYzeHhfbGxfcHdyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA2MzI0YQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmYzeHhfbGxfcHdyLmgKQEAgLTAsMCArMSw1NzAgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfbGxfcHdyLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFBXUiBMTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyRjN4eF9MTF9QV1JfSAorI2RlZmluZSBfX1NUTTMyRjN4eF9MTF9QV1JfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoUFdSKQorCisvKiogQGRlZmdyb3VwIFBXUl9MTCBQV1IKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FeHBvcnRlZF9Db25zdGFudHMgUFdSIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VDX0NMRUFSX0ZMQUcgQ2xlYXIgRmxhZ3MgRGVmaW5lcworICAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfUFdSX1dyaXRlUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUFdSX0NSX0NTQkYgICAgICAgICAgICAgICAgICAgICBQV1JfQ1JfQ1NCRiAgICAgICAgICAgIC8qITwgQ2xlYXIgc3RhbmRieSBmbGFnICovCisjZGVmaW5lIExMX1BXUl9DUl9DV1VGICAgICAgICAgICAgICAgICAgICAgUFdSX0NSX0NXVUYgICAgICAgICAgICAvKiE8IENsZWFyIHdha2V1cCBmbGFnICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FQ19HRVRfRkxBRyBHZXQgRmxhZ3MgRGVmaW5lcworICAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfUFdSX1JlYWRSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9QV1JfQ1NSX1dVRiAgICAgICAgICAgICAgICAgICAgIFBXUl9DU1JfV1VGICAgICAgICAgICAgLyohPCBXYWtldXAgZmxhZyAqLworI2RlZmluZSBMTF9QV1JfQ1NSX1NCRiAgICAgICAgICAgICAgICAgICAgIFBXUl9DU1JfU0JGICAgICAgICAgICAgLyohPCBTdGFuZGJ5IGZsYWcgKi8KKyNpZiBkZWZpbmVkKFBXUl9QVkRfU1VQUE9SVCkKKyNkZWZpbmUgTExfUFdSX0NTUl9QVkRPICAgICAgICAgICAgICAgICAgICBQV1JfQ1NSX1BWRE8gICAgICAgICAgIC8qITwgUG93ZXIgdm9sdGFnZSBkZXRlY3RvciBvdXRwdXQgZmxhZyAqLworI2VuZGlmIC8qIFBXUl9QVkRfU1VQUE9SVCAqLworI2lmIGRlZmluZWQoUFdSX0NTUl9WUkVGSU5UUkRZRikKKyNkZWZpbmUgTExfUFdSX0NTUl9WUkVGSU5UUkRZRiAgICAgICAgICAgICBQV1JfQ1NSX1ZSRUZJTlRSRFlGICAgIC8qITwgVlJFRklOVCByZWFkeSBmbGFnICovCisjZW5kaWYgLyogUFdSX0NTUl9WUkVGSU5UUkRZRiAqLworI2RlZmluZSBMTF9QV1JfQ1NSX0VXVVAxICAgICAgICAgICAgICAgICAgIFBXUl9DU1JfRVdVUDEgICAgICAgICAgLyohPCBFbmFibGUgV0tVUCBwaW4gMSAqLworI2RlZmluZSBMTF9QV1JfQ1NSX0VXVVAyICAgICAgICAgICAgICAgICAgIFBXUl9DU1JfRVdVUDIgICAgICAgICAgLyohPCBFbmFibGUgV0tVUCBwaW4gMiAqLworI2lmIGRlZmluZWQoUFdSX0NTUl9FV1VQMykKKyNkZWZpbmUgTExfUFdSX0NTUl9FV1VQMyAgICAgICAgICAgICAgICAgICBQV1JfQ1NSX0VXVVAzICAgICAgICAgIC8qITwgRW5hYmxlIFdLVVAgcGluIDMgKi8KKyNlbmRpZiAvKiBQV1JfQ1NSX0VXVVAzICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VDX01PREVfUFdSIE1vZGUgUG93ZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9QV1JfTU9ERV9TVE9QX01BSU5SRUdVICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAvKiE8IEVudGVyIFN0b3AgbW9kZSB3aGVuIHRoZSBDUFUgZW50ZXJzIGRlZXBzbGVlcCAqLworI2RlZmluZSBMTF9QV1JfTU9ERV9TVE9QX0xQUkVHVSAgICAgICAgICAgICAgIChQV1JfQ1JfTFBEUykgICAgICAgICAgICAgICAgICAvKiE8IEVudGVyIFN0b3AgbW9kZSAod2l0aCBsb3cgcG93ZXIgUmVndWxhdG9yIE9OKSB3aGVuIHRoZSBDUFUgZW50ZXJzIGRlZXBzbGVlcCAqLworI2RlZmluZSBMTF9QV1JfTU9ERV9TVEFOREJZICAgICAgICAgICAgICAgICAgIChQV1JfQ1JfUEREUykgICAgICAgICAgICAgICAgICAvKiE8IEVudGVyIFN0YW5kYnkgbW9kZSB3aGVuIHRoZSBDUFUgZW50ZXJzIGRlZXBzbGVlcCAqLworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoUFdSX0NSX0xQRFMpCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FQ19SRUdVX01PREVfRFNfTU9ERSAgUmVndWxhdG9yIE1vZGUgSW4gRGVlcCBTbGVlcCBNb2RlCisgKiBAeworICovCisjZGVmaW5lIExMX1BXUl9SRUdVX0RTTU9ERV9NQUlOICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBWb2x0YWdlIFJlZ3VsYXRvciBpbiBtYWluIG1vZGUgZHVyaW5nIGRlZXBzbGVlcCBtb2RlICovCisjZGVmaW5lIExMX1BXUl9SRUdVX0RTTU9ERV9MT1dfUE9XRVIgICAoUFdSX0NSX0xQRFMpICAgICAgICAgLyohPCBWb2x0YWdlIFJlZ3VsYXRvciBpbiBsb3ctcG93ZXIgbW9kZSBkdXJpbmcgZGVlcHNsZWVwIG1vZGUgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogUFdSX0NSX0xQRFMgKi8KKworI2lmIGRlZmluZWQoUFdSX1BWRF9TVVBQT1JUKQorLyoqIEBkZWZncm91cCBQV1JfTExfRUNfUFZETEVWRUwgUG93ZXIgVm9sdGFnZSBEZXRlY3RvciBMZXZlbAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1BXUl9QVkRMRVZFTF8wICAgICAgICAgICAgICAgICAgKFBXUl9DUl9QTFNfTEVWMCkgICAgICAvKiE8IFZvbHRhZ2UgdGhyZXNob2xkIGRldGVjdGVkIGJ5IFBWRCAyLjIgViAqLworI2RlZmluZSBMTF9QV1JfUFZETEVWRUxfMSAgICAgICAgICAgICAgICAgIChQV1JfQ1JfUExTX0xFVjEpICAgICAgLyohPCBWb2x0YWdlIHRocmVzaG9sZCBkZXRlY3RlZCBieSBQVkQgMi4zIFYgKi8KKyNkZWZpbmUgTExfUFdSX1BWRExFVkVMXzIgICAgICAgICAgICAgICAgICAoUFdSX0NSX1BMU19MRVYyKSAgICAgIC8qITwgVm9sdGFnZSB0aHJlc2hvbGQgZGV0ZWN0ZWQgYnkgUFZEIDIuNCBWICovCisjZGVmaW5lIExMX1BXUl9QVkRMRVZFTF8zICAgICAgICAgICAgICAgICAgKFBXUl9DUl9QTFNfTEVWMykgICAgICAvKiE8IFZvbHRhZ2UgdGhyZXNob2xkIGRldGVjdGVkIGJ5IFBWRCAyLjUgViAqLworI2RlZmluZSBMTF9QV1JfUFZETEVWRUxfNCAgICAgICAgICAgICAgICAgIChQV1JfQ1JfUExTX0xFVjQpICAgICAgLyohPCBWb2x0YWdlIHRocmVzaG9sZCBkZXRlY3RlZCBieSBQVkQgMi42IFYgKi8KKyNkZWZpbmUgTExfUFdSX1BWRExFVkVMXzUgICAgICAgICAgICAgICAgICAoUFdSX0NSX1BMU19MRVY1KSAgICAgIC8qITwgVm9sdGFnZSB0aHJlc2hvbGQgZGV0ZWN0ZWQgYnkgUFZEIDIuNyBWICovCisjZGVmaW5lIExMX1BXUl9QVkRMRVZFTF82ICAgICAgICAgICAgICAgICAgKFBXUl9DUl9QTFNfTEVWNikgICAgICAvKiE8IFZvbHRhZ2UgdGhyZXNob2xkIGRldGVjdGVkIGJ5IFBWRCAyLjggViAqLworI2RlZmluZSBMTF9QV1JfUFZETEVWRUxfNyAgICAgICAgICAgICAgICAgIChQV1JfQ1JfUExTX0xFVjcpICAgICAgLyohPCBWb2x0YWdlIHRocmVzaG9sZCBkZXRlY3RlZCBieSBQVkQgMi45IFYgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogUFdSX1BWRF9TVVBQT1JUICovCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FQ19XQUtFVVBfUElOICBXYWtldXAgUGlucworICAqIEB7CisgICovCisjZGVmaW5lIExMX1BXUl9XQUtFVVBfUElOMSAgICAgICAgICAgICAgICAgKFBXUl9DU1JfRVdVUDEpICAgICAgICAvKiE8IFdLVVAgcGluIDEgOiBQQTAgKi8KKyNkZWZpbmUgTExfUFdSX1dBS0VVUF9QSU4yICAgICAgICAgICAgICAgICAoUFdSX0NTUl9FV1VQMikgICAgICAgIC8qITwgV0tVUCBwaW4gMiA6IFBDMTMgKi8KKyNpZiBkZWZpbmVkKFBXUl9DU1JfRVdVUDMpCisjZGVmaW5lIExMX1BXUl9XQUtFVVBfUElOMyAgICAgICAgICAgICAgICAgKFBXUl9DU1JfRVdVUDMpICAgICAgICAvKiE8IFdLVVAgcGluIDMgOiBQRTYgb3IgUEEyIGFjY29yZGluZyB0byBkZXZpY2UgKi8KKyNlbmRpZiAvKiBQV1JfQ1NSX0VXVVAzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FQ19TREFEQ19BTkFMT0dfWCBTREFEQyBBbmFsb2d4CisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFNEQURDMSkKKyNkZWZpbmUgTExfUFdSX1NEQURDX0FOQUxPRzEgICAgICAgICAgICAgIChQV1JfQ1JfRU5TRDEpICAgLyohPCBFbmFibGUgU0RBREMxICovCisjZW5kaWYgLyogU0RBREMxICovCisjaWYgZGVmaW5lZChTREFEQzIpCisjZGVmaW5lIExMX1BXUl9TREFEQ19BTkFMT0cyICAgICAgICAgICAgICAoUFdSX0NSX0VOU0QyKSAgIC8qITwgRW5hYmxlIFNEQURDMiAqLworI2VuZGlmIC8qIFNEQURDMiAqLworI2lmIGRlZmluZWQoU0RBREMzKQorI2RlZmluZSBMTF9QV1JfU0RBRENfQU5BTE9HMyAgICAgICAgICAgICAgKFBXUl9DUl9FTlNEMykgICAvKiE8IEVuYWJsZSBTREFEQzMgKi8KKyNlbmRpZiAvKiBTREFEQzMgKi8KKy8qKgorICAqIEB9CisgICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FeHBvcnRlZF9NYWNyb3MgUFdSIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIHdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gUFdSIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9QV1JfV3JpdGVSZWcoX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoUFdSLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gUFdSIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX1BXUl9SZWFkUmVnKF9fUkVHX18pIFJFQURfUkVHKFBXUi0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgUFdSIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VGX0NvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgdGhlIFNEQURDIHBlcmlwaGVyYWwgZnVuY3Rpb25hbGl0eQorICAqIEBybXRvbGwgQ1IgICBFTlNEMSAgICAgICBMTF9QV1JfRW5hYmxlU0RBRENcbgorICAqICAgICAgICAgQ1IgICBFTlNEMiAgICAgICBMTF9QV1JfRW5hYmxlU0RBRENcbgorICAqICAgICAgICAgQ1IgICBFTlNEMyAgICAgICBMTF9QV1JfRW5hYmxlU0RBREMKKyAgKiBAcGFyYW0gIEFuYWxvZ3ggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1NEQURDX0FOQUxPRzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfU0RBRENfQU5BTE9HMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9TREFEQ19BTkFMT0czCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlU0RBREModWludDMyX3QgQW5hbG9neCkKK3sKKyAgU0VUX0JJVChQV1ItPkNSLCBBbmFsb2d4KTsgCit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZXMgdGhlIFNEQURDIHBlcmlwaGVyYWwgZnVuY3Rpb25hbGl0eQorICAqIEBybXRvbGwgQ1IgICBFTlNEMSAgICAgICBMTF9QV1JfRW5hYmxlU0RBRENcbgorICAqICAgICAgICAgQ1IgICBFTlNEMiAgICAgICBMTF9QV1JfRW5hYmxlU0RBRENcbgorICAqICAgICAgICAgQ1IgICBFTlNEMyAgICAgICBMTF9QV1JfRW5hYmxlU0RBREMKKyAgKiBAcGFyYW0gIEFuYWxvZ3ggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1NEQURDX0FOQUxPRzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfU0RBRENfQU5BTE9HMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9TREFEQ19BTkFMT0czCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRGlzYWJsZVNEQURDKHVpbnQzMl90IEFuYWxvZ3gpCit7CisgIENMRUFSX0JJVChQV1ItPkNSLCBBbmFsb2d4KTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBTREFEQ3ggaGFzIGJlZW4gZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIENSICAgRU5TRDEgICAgICAgTExfUFdSX0lzRW5hYmxlZFNEQURDXG4KKyAgKiAgICAgICAgIENSICAgRU5TRDIgICAgICAgTExfUFdSX0lzRW5hYmxlZFNEQURDXG4KKyAgKiAgICAgICAgIENSICAgRU5TRDMgICAgICAgTExfUFdSX0lzRW5hYmxlZFNEQURDCisgICogQHBhcmFtICBBbmFsb2d4IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9TREFEQ19BTkFMT0cxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1NEQURDX0FOQUxPRzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfU0RBRENfQU5BTE9HMworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRTREFEQyh1aW50MzJfdCBBbmFsb2d4KQoreworICByZXR1cm4gKFJFQURfQklUKFBXUi0+Q1IsIEFuYWxvZ3gpID09IChBbmFsb2d4KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGFjY2VzcyB0byB0aGUgYmFja3VwIGRvbWFpbgorICAqIEBybXRvbGwgQ1IgICAgREJQICAgICAgIExMX1BXUl9FbmFibGVCa1VwQWNjZXNzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlQmtVcEFjY2Vzcyh2b2lkKQoreworICBTRVRfQklUKFBXUi0+Q1IsIFBXUl9DUl9EQlApOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgYWNjZXNzIHRvIHRoZSBiYWNrdXAgZG9tYWluCisgICogQHJtdG9sbCBDUiAgICBEQlAgICAgICAgTExfUFdSX0Rpc2FibGVCa1VwQWNjZXNzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRGlzYWJsZUJrVXBBY2Nlc3Modm9pZCkKK3sKKyAgQ0xFQVJfQklUKFBXUi0+Q1IsIFBXUl9DUl9EQlApOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBiYWNrdXAgZG9tYWluIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSICAgIERCUCAgICAgICBMTF9QV1JfSXNFbmFibGVkQmtVcEFjY2VzcworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRCa1VwQWNjZXNzKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoUFdSLT5DUiwgUFdSX0NSX0RCUCkgPT0gKFBXUl9DUl9EQlApKTsKK30KKworI2lmIGRlZmluZWQoUFdSX0NSX0xQRFMpCisvKioKKyAgKiBAYnJpZWYgIFNldCB2b2x0YWdlIFJlZ3VsYXRvciBtb2RlIGR1cmluZyBkZWVwIHNsZWVwIG1vZGUKKyAgKiBAcm10b2xsIENSICAgIExQRFMgICAgICAgICBMTF9QV1JfU2V0UmVndWxNb2RlRFMKKyAgKiBAcGFyYW0gIFJlZ3VsTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9SRUdVX0RTTU9ERV9NQUlOCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1JFR1VfRFNNT0RFX0xPV19QT1dFUgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX1NldFJlZ3VsTW9kZURTKHVpbnQzMl90IFJlZ3VsTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhQV1ItPkNSLCBQV1JfQ1JfTFBEUywgUmVndWxNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdm9sdGFnZSBSZWd1bGF0b3IgbW9kZSBkdXJpbmcgZGVlcCBzbGVlcCBtb2RlCisgICogQHJtdG9sbCBDUiAgICBMUERTICAgICAgICAgTExfUFdSX0dldFJlZ3VsTW9kZURTCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9SRUdVX0RTTU9ERV9NQUlOCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1JFR1VfRFNNT0RFX0xPV19QT1dFUgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9HZXRSZWd1bE1vZGVEUyh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChQV1ItPkNSLCBQV1JfQ1JfTFBEUykpOworfQorI2VuZGlmIC8qIFBXUl9DUl9MUERTICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IFBvd2VyIERvd24gbW9kZSB3aGVuIENQVSBlbnRlcnMgZGVlcHNsZWVwCisgICogQHJtdG9sbCBDUiAgICBQRERTICAgICAgICAgTExfUFdSX1NldFBvd2VyTW9kZVxuCisgICogQHJtdG9sbCBDUiAgICBMUERTICAgICAgICAgTExfUFdSX1NldFBvd2VyTW9kZQorICAqIEBwYXJhbSAgUERNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX01PREVfU1RPUF9NQUlOUkVHVQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9NT0RFX1NUT1BfTFBSRUdVCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX01PREVfU1RBTkRCWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX1NldFBvd2VyTW9kZSh1aW50MzJfdCBQRE1vZGUpCit7CisgIE1PRElGWV9SRUcoUFdSLT5DUiwgKFBXUl9DUl9QRERTfCBQV1JfQ1JfTFBEUyksIFBETW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFBvd2VyIERvd24gbW9kZSB3aGVuIENQVSBlbnRlcnMgZGVlcHNsZWVwCisgICogQHJtdG9sbCBDUiAgICBQRERTICAgICAgICAgTExfUFdSX0dldFBvd2VyTW9kZVxuCisgICogQHJtdG9sbCBDUiAgICBMUERTICAgICAgICAgTExfUFdSX0dldFBvd2VyTW9kZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfTU9ERV9TVE9QX01BSU5SRUdVCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX01PREVfU1RPUF9MUFJFR1UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfTU9ERV9TVEFOREJZCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0dldFBvd2VyTW9kZSh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChQV1ItPkNSLCAoUFdSX0NSX1BERFN8IFBXUl9DUl9MUERTKSkpOworfQorCisjaWYgZGVmaW5lZChQV1JfUFZEX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgdm9sdGFnZSB0aHJlc2hvbGQgZGV0ZWN0ZWQgYnkgdGhlIFBvd2VyIFZvbHRhZ2UgRGV0ZWN0b3IKKyAgKiBAcm10b2xsIENSICAgIFBMUyAgICAgICBMTF9QV1JfU2V0UFZETGV2ZWwKKyAgKiBAcGFyYW0gIFBWRExldmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExFVkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETEVWRUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVkRMRVZFTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExFVkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETEVWRUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVkRMRVZFTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExFVkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETEVWRUxfNworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX1NldFBWRExldmVsKHVpbnQzMl90IFBWRExldmVsKQoreworICBNT0RJRllfUkVHKFBXUi0+Q1IsIFBXUl9DUl9QTFMsIFBWRExldmVsKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHZvbHRhZ2UgdGhyZXNob2xkIGRldGVjdGlvbgorICAqIEBybXRvbGwgQ1IgICAgUExTICAgICAgIExMX1BXUl9HZXRQVkRMZXZlbAorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETEVWRUxfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVkRMRVZFTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExFVkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETEVWRUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVkRMRVZFTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExFVkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETEVWRUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVkRMRVZFTF83CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0dldFBWRExldmVsKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFBXUi0+Q1IsIFBXUl9DUl9QTFMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUG93ZXIgVm9sdGFnZSBEZXRlY3RvcgorICAqIEBybXRvbGwgQ1IgICAgUFZERSAgICAgICBMTF9QV1JfRW5hYmxlUFZECisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlUFZEKHZvaWQpCit7CisgIFNFVF9CSVQoUFdSLT5DUiwgUFdSX0NSX1BWREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUG93ZXIgVm9sdGFnZSBEZXRlY3RvcgorICAqIEBybXRvbGwgQ1IgICAgUFZERSAgICAgICBMTF9QV1JfRGlzYWJsZVBWRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0Rpc2FibGVQVkQodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFBXUi0+Q1IsIFBXUl9DUl9QVkRFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBQb3dlciBWb2x0YWdlIERldGVjdG9yIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSICAgIFBWREUgICAgICAgTExfUFdSX0lzRW5hYmxlZFBWRAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRQVkQodm9pZCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChQV1ItPkNSLCBQV1JfQ1JfUFZERSkgPT0gKFBXUl9DUl9QVkRFKSk7Cit9CisjZW5kaWYgLyogUFdSX1BWRF9TVVBQT1JUICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBXYWtlVXAgUElOeCBmdW5jdGlvbmFsaXR5CisgICogQHJtdG9sbCBDU1IgICBFV1VQMSAgICAgICBMTF9QV1JfRW5hYmxlV2FrZVVwUGluXG4KKyAgKiBAcm10b2xsIENTUiAgIEVXVVAyICAgICAgIExMX1BXUl9FbmFibGVXYWtlVXBQaW5cbgorICAqIEBybXRvbGwgQ1NSICAgRVdVUDMgICAgICAgTExfUFdSX0VuYWJsZVdha2VVcFBpbgorICAqIEBwYXJhbSAgV2FrZVVwUGluIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU4xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU4yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU4zICgqKQorICAqCisgICogICAgICAgICAoKikgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0VuYWJsZVdha2VVcFBpbih1aW50MzJfdCBXYWtlVXBQaW4pCit7CisgIFNFVF9CSVQoUFdSLT5DU1IsIFdha2VVcFBpbik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgV2FrZVVwIFBJTnggZnVuY3Rpb25hbGl0eQorICAqIEBybXRvbGwgQ1NSICAgRVdVUDEgICAgICAgTExfUFdSX0Rpc2FibGVXYWtlVXBQaW5cbgorICAqIEBybXRvbGwgQ1NSICAgRVdVUDIgICAgICAgTExfUFdSX0Rpc2FibGVXYWtlVXBQaW5cbgorICAqIEBybXRvbGwgQ1NSICAgRVdVUDMgICAgICAgTExfUFdSX0Rpc2FibGVXYWtlVXBQaW4KKyAgKiBAcGFyYW0gIFdha2VVcFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElOMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElOMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElOMyAoKikKKyAgKgorICAqICAgICAgICAgKCopIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9EaXNhYmxlV2FrZVVwUGluKHVpbnQzMl90IFdha2VVcFBpbikKK3sKKyAgQ0xFQVJfQklUKFBXUi0+Q1NSLCBXYWtlVXBQaW4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBXYWtlVXAgUElOeCBmdW5jdGlvbmFsaXR5IGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENTUiAgIEVXVVAxICAgICAgIExMX1BXUl9Jc0VuYWJsZWRXYWtlVXBQaW5cbgorICAqIEBybXRvbGwgQ1NSICAgRVdVUDIgICAgICAgTExfUFdSX0lzRW5hYmxlZFdha2VVcFBpblxuCisgICogQHJtdG9sbCBDU1IgICBFV1VQMyAgICAgICBMTF9QV1JfSXNFbmFibGVkV2FrZVVwUGluCisgICogQHBhcmFtICBXYWtlVXBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjMgKCopCisgICoKKyAgKiAgICAgICAgICgqKSBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzRW5hYmxlZFdha2VVcFBpbih1aW50MzJfdCBXYWtlVXBQaW4pCit7CisgIHJldHVybiAoUkVBRF9CSVQoUFdSLT5DU1IsIFdha2VVcFBpbikgPT0gKFdha2VVcFBpbikpOworfQorCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VGX0ZMQUdfTWFuYWdlbWVudCBGTEFHX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEdldCBXYWtlLXVwIEZsYWcKKyAgKiBAcm10b2xsIENTUiAgIFdVRiAgICAgICBMTF9QV1JfSXNBY3RpdmVGbGFnX1dVCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzQWN0aXZlRmxhZ19XVSh2b2lkKQoreworICByZXR1cm4gKFJFQURfQklUKFBXUi0+Q1NSLCBQV1JfQ1NSX1dVRikgPT0gKFBXUl9DU1JfV1VGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFN0YW5kYnkgRmxhZworICAqIEBybXRvbGwgQ1NSICAgU0JGICAgICAgIExMX1BXUl9Jc0FjdGl2ZUZsYWdfU0IKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNBY3RpdmVGbGFnX1NCKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoUFdSLT5DU1IsIFBXUl9DU1JfU0JGKSA9PSAoUFdSX0NTUl9TQkYpKTsKK30KKworI2lmIGRlZmluZWQoUFdSX1BWRF9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIFZERCB2b2x0YWdlIGlzIGJlbG93IHRoZSBzZWxlY3RlZCBQVkQgdGhyZXNob2xkCisgICogQHJtdG9sbCBDU1IgICBQVkRPICAgICAgIExMX1BXUl9Jc0FjdGl2ZUZsYWdfUFZETworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfUFZETyh2b2lkKQoreworICByZXR1cm4gKFJFQURfQklUKFBXUi0+Q1NSLCBQV1JfQ1NSX1BWRE8pID09IChQV1JfQ1NSX1BWRE8pKTsKK30KKyNlbmRpZiAvKiBQV1JfUFZEX1NVUFBPUlQgKi8KKworI2lmIGRlZmluZWQoUFdSX0NTUl9WUkVGSU5UUkRZRikKKy8qKgorICAqIEBicmllZiAgR2V0IEludGVybmFsIFJlZmVyZW5jZSBWcmVmSW50IEZsYWcKKyAgKiBAcm10b2xsIENTUiAgIFZSRUZJTlRSRFlGICAgICAgIExMX1BXUl9Jc0FjdGl2ZUZsYWdfVlJFRklOVFJEWQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfVlJFRklOVFJEWSh2b2lkKQoreworICByZXR1cm4gKFJFQURfQklUKFBXUi0+Q1NSLCBQV1JfQ1NSX1ZSRUZJTlRSRFlGKSA9PSAoUFdSX0NTUl9WUkVGSU5UUkRZRikpOworfQorI2VuZGlmIC8qIFBXUl9DU1JfVlJFRklOVFJEWUYgKi8KKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU3RhbmRieSBGbGFnCisgICogQHJtdG9sbCBDUiAgIENTQkYgICAgICAgTExfUFdSX0NsZWFyRmxhZ19TQgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0NsZWFyRmxhZ19TQih2b2lkKQoreworICBTRVRfQklUKFBXUi0+Q1IsIFBXUl9DUl9DU0JGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBXYWtlLXVwIEZsYWdzCisgICogQHJtdG9sbCBDUiAgIENXVUYgICAgICAgTExfUFdSX0NsZWFyRmxhZ19XVQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0NsZWFyRmxhZ19XVSh2b2lkKQoreworICBTRVRfQklUKFBXUi0+Q1IsIFBXUl9DUl9DV1VGKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBQV1JfTExfRUZfSW5pdCBEZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbgorICAqIEB7CisgICovCitFcnJvclN0YXR1cyBMTF9QV1JfRGVJbml0KHZvaWQpOworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIGRlZmluZWQoUFdSKSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkYzeHhfTExfUFdSX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmYzeHhfbGxfcmNjLmggYi9JbmMvc3RtMzJmM3h4X2xsX3JjYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ODQzOTcKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2xsX3JjYy5oCkBAIC0wLDAgKzEsMjgzNCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9sbF9yY2MuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgUkNDIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0xMX1JDQ19ICisjZGVmaW5lIF9fU1RNMzJGM3h4X0xMX1JDQ19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChSQ0MpCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMIFJDQworICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX1ByaXZhdGVfQ29uc3RhbnRzIFJDQyBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisvKiBEZWZpbmVzIHVzZWQgZm9yIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIHJlZ2lzdGVyIGFuZCBwZXJmb3JtIG9mZnNldHMqLworI2RlZmluZSBSQ0NfUE9TSVRJT05fSFBSRSAgICAgICAodWludDMyX3QpUE9TSVRJT05fVkFMKFJDQ19DRkdSX0hQUkUpICAgICAvKiE8IGZpZWxkIHBvc2l0aW9uIGluIHJlZ2lzdGVyIFJDQ19DRkdSICovCisjZGVmaW5lIFJDQ19QT1NJVElPTl9QUFJFMSAgICAgICh1aW50MzJfdClQT1NJVElPTl9WQUwoUkNDX0NGR1JfUFBSRTEpICAgIC8qITwgZmllbGQgcG9zaXRpb24gaW4gcmVnaXN0ZXIgUkNDX0NGR1IgKi8KKyNkZWZpbmUgUkNDX1BPU0lUSU9OX1BQUkUyICAgICAgKHVpbnQzMl90KVBPU0lUSU9OX1ZBTChSQ0NfQ0ZHUl9QUFJFMikgICAgLyohPCBmaWVsZCBwb3NpdGlvbiBpbiByZWdpc3RlciBSQ0NfQ0ZHUiAqLworI2RlZmluZSBSQ0NfUE9TSVRJT05fSFNJQ0FMICAgICAodWludDMyX3QpUE9TSVRJT05fVkFMKFJDQ19DUl9IU0lDQUwpICAgICAvKiE8IGZpZWxkIHBvc2l0aW9uIGluIHJlZ2lzdGVyIFJDQ19DUiAqLworI2RlZmluZSBSQ0NfUE9TSVRJT05fSFNJVFJJTSAgICAodWludDMyX3QpUE9TSVRJT05fVkFMKFJDQ19DUl9IU0lUUklNKSAgICAvKiE8IGZpZWxkIHBvc2l0aW9uIGluIHJlZ2lzdGVyIFJDQ19DUiAqLworI2RlZmluZSBSQ0NfUE9TSVRJT05fUExMTVVMICAgICAodWludDMyX3QpUE9TSVRJT05fVkFMKFJDQ19DRkdSX1BMTE1VTCkgICAvKiE8IGZpZWxkIHBvc2l0aW9uIGluIHJlZ2lzdGVyIFJDQ19DRkdSICovCisjZGVmaW5lIFJDQ19QT1NJVElPTl9VU0FSVDFTVyAgICh1aW50MzJfdCkwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZmllbGQgcG9zaXRpb24gaW4gcmVnaXN0ZXIgUkNDX0NGR1IzICovCisjZGVmaW5lIFJDQ19QT1NJVElPTl9VU0FSVDJTVyAgICh1aW50MzJfdCkxNlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZmllbGQgcG9zaXRpb24gaW4gcmVnaXN0ZXIgUkNDX0NGR1IzICovCisjZGVmaW5lIFJDQ19QT1NJVElPTl9VU0FSVDNTVyAgICh1aW50MzJfdCkxOFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZmllbGQgcG9zaXRpb24gaW4gcmVnaXN0ZXIgUkNDX0NGR1IzICovCisjZGVmaW5lIFJDQ19QT1NJVElPTl9USU0xU1cgICAgICh1aW50MzJfdCk4VSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZmllbGQgcG9zaXRpb24gaW4gcmVnaXN0ZXIgUkNDX0NGR1IzICovCisjZGVmaW5lIFJDQ19QT1NJVElPTl9USU04U1cgICAgICh1aW50MzJfdCk5VSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZmllbGQgcG9zaXRpb24gaW4gcmVnaXN0ZXIgUkNDX0NGR1IzICovCisjZGVmaW5lIFJDQ19QT1NJVElPTl9USU0xNVNXICAgICh1aW50MzJfdCkxMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZmllbGQgcG9zaXRpb24gaW4gcmVnaXN0ZXIgUkNDX0NGR1IzICovCisjZGVmaW5lIFJDQ19QT1NJVElPTl9USU0xNlNXICAgICh1aW50MzJfdCkxMVUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZmllbGQgcG9zaXRpb24gaW4gcmVnaXN0ZXIgUkNDX0NGR1IzICovCisjZGVmaW5lIFJDQ19QT1NJVElPTl9USU0xN1NXICAgICh1aW50MzJfdCkxM1UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZmllbGQgcG9zaXRpb24gaW4gcmVnaXN0ZXIgUkNDX0NGR1IzICovCisjZGVmaW5lIFJDQ19QT1NJVElPTl9USU0yMFNXICAgICh1aW50MzJfdCkxNVUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZmllbGQgcG9zaXRpb24gaW4gcmVnaXN0ZXIgUkNDX0NGR1IzICovCisjZGVmaW5lIFJDQ19QT1NJVElPTl9USU0yU1cgICAgICh1aW50MzJfdCkyNFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZmllbGQgcG9zaXRpb24gaW4gcmVnaXN0ZXIgUkNDX0NGR1IzICovCisjZGVmaW5lIFJDQ19QT1NJVElPTl9USU0zNFNXICAgICh1aW50MzJfdCkyNVUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZmllbGQgcG9zaXRpb24gaW4gcmVnaXN0ZXIgUkNDX0NGR1IzICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIFJDQ19MTF9Qcml2YXRlX01hY3JvcyBSQ0MgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBSQ0NfTExfRXhwb3J0ZWRfVHlwZXMgUkNDIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBMTF9FU19DTE9DS19GUkVRIENsb2NrcyBGcmVxdWVuY3kgU3RydWN0dXJlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSQ0MgQ2xvY2tzIEZyZXF1ZW5jeSBTdHJ1Y3R1cmUKKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFNZU0NMS19GcmVxdWVuY3k7ICAgICAgICAvKiE8IFNZU0NMSyBjbG9jayBmcmVxdWVuY3kgKi8KKyAgdWludDMyX3QgSENMS19GcmVxdWVuY3k7ICAgICAgICAgIC8qITwgSENMSyBjbG9jayBmcmVxdWVuY3kgKi8KKyAgdWludDMyX3QgUENMSzFfRnJlcXVlbmN5OyAgICAgICAgIC8qITwgUENMSzEgY2xvY2sgZnJlcXVlbmN5ICovCisgIHVpbnQzMl90IFBDTEsyX0ZyZXF1ZW5jeTsgICAgICAgICAvKiE8IFBDTEsyIGNsb2NrIGZyZXF1ZW5jeSAqLworfSBMTF9SQ0NfQ2xvY2tzVHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBSQ0MgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfT1NDX1ZBTFVFUyBPc2NpbGxhdG9yIFZhbHVlcyBhZGFwdGF0aW9uCisgICogQGJyaWVmICAgIERlZmluZXMgdXNlZCB0byBhZGFwdCB2YWx1ZXMgb2YgZGlmZmVyZW50IG9zY2lsbGF0b3JzCisgICogQG5vdGUgICAgIFRoZXNlIHZhbHVlcyBjb3VsZCBiZSBtb2RpZmllZCBpbiB0aGUgdXNlciBlbnZpcm9ubWVudCBhY2NvcmRpbmcgdG8KKyAgKiAgICAgICAgICAgSFcgc2V0LXVwLgorICAqIEB7CisgICovCisjaWYgIWRlZmluZWQgIChIU0VfVkFMVUUpCisjZGVmaW5lIEhTRV9WQUxVRSAgICA4MDAwMDAwVSAgLyohPCBWYWx1ZSBvZiB0aGUgSFNFIG9zY2lsbGF0b3IgaW4gSHogKi8KKyNlbmRpZiAvKiBIU0VfVkFMVUUgKi8KKworI2lmICFkZWZpbmVkICAoSFNJX1ZBTFVFKQorI2RlZmluZSBIU0lfVkFMVUUgICAgODAwMDAwMFUgIC8qITwgVmFsdWUgb2YgdGhlIEhTSSBvc2NpbGxhdG9yIGluIEh6ICovCisjZW5kaWYgLyogSFNJX1ZBTFVFICovCisKKyNpZiAhZGVmaW5lZCAgKExTRV9WQUxVRSkKKyNkZWZpbmUgTFNFX1ZBTFVFICAgIDMyNzY4VSAgICAvKiE8IFZhbHVlIG9mIHRoZSBMU0Ugb3NjaWxsYXRvciBpbiBIeiAqLworI2VuZGlmIC8qIExTRV9WQUxVRSAqLworCisjaWYgIWRlZmluZWQgIChMU0lfVkFMVUUpCisjZGVmaW5lIExTSV9WQUxVRSAgICA0MDAwMFUgICAgLyohPCBWYWx1ZSBvZiB0aGUgTFNJIG9zY2lsbGF0b3IgaW4gSHogKi8KKyNlbmRpZiAvKiBMU0lfVkFMVUUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0NMRUFSX0ZMQUcgQ2xlYXIgRmxhZ3MgRGVmaW5lcworICAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfUkNDX1dyaXRlUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX0NJUl9MU0lSRFlDICAgICAgICAgICAgICAgIFJDQ19DSVJfTFNJUkRZQyAgICAgLyohPCBMU0kgUmVhZHkgSW50ZXJydXB0IENsZWFyICovCisjZGVmaW5lIExMX1JDQ19DSVJfTFNFUkRZQyAgICAgICAgICAgICAgICBSQ0NfQ0lSX0xTRVJEWUMgICAgIC8qITwgTFNFIFJlYWR5IEludGVycnVwdCBDbGVhciAqLworI2RlZmluZSBMTF9SQ0NfQ0lSX0hTSVJEWUMgICAgICAgICAgICAgICAgUkNDX0NJUl9IU0lSRFlDICAgICAvKiE8IEhTSSBSZWFkeSBJbnRlcnJ1cHQgQ2xlYXIgKi8KKyNkZWZpbmUgTExfUkNDX0NJUl9IU0VSRFlDICAgICAgICAgICAgICAgIFJDQ19DSVJfSFNFUkRZQyAgICAgLyohPCBIU0UgUmVhZHkgSW50ZXJydXB0IENsZWFyICovCisjZGVmaW5lIExMX1JDQ19DSVJfUExMUkRZQyAgICAgICAgICAgICAgICBSQ0NfQ0lSX1BMTFJEWUMgICAgIC8qITwgUExMIFJlYWR5IEludGVycnVwdCBDbGVhciAqLworI2RlZmluZSBMTF9SQ0NfQ0lSX0NTU0MgICAgICAgICAgICAgICAgICAgUkNDX0NJUl9DU1NDICAgICAgICAvKiE8IENsb2NrIFNlY3VyaXR5IFN5c3RlbSBJbnRlcnJ1cHQgQ2xlYXIgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0dFVF9GTEFHIEdldCBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9SQ0NfUmVhZFJlZyBmdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19DSVJfTFNJUkRZRiAgICAgICAgICAgICAgICBSQ0NfQ0lSX0xTSVJEWUYgICAgIC8qITwgTFNJIFJlYWR5IEludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1JDQ19DSVJfTFNFUkRZRiAgICAgICAgICAgICAgICBSQ0NfQ0lSX0xTRVJEWUYgICAgIC8qITwgTFNFIFJlYWR5IEludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1JDQ19DSVJfSFNJUkRZRiAgICAgICAgICAgICAgICBSQ0NfQ0lSX0hTSVJEWUYgICAgIC8qITwgSFNJIFJlYWR5IEludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1JDQ19DSVJfSFNFUkRZRiAgICAgICAgICAgICAgICBSQ0NfQ0lSX0hTRVJEWUYgICAgIC8qITwgSFNFIFJlYWR5IEludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1JDQ19DRkdSX01DT0YgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9NQ09GICAgICAvKiE8IE1DTyBmbGFnICovCisjZGVmaW5lIExMX1JDQ19DSVJfUExMUkRZRiAgICAgICAgICAgICAgICBSQ0NfQ0lSX1BMTFJEWUYgICAgIC8qITwgUExMIFJlYWR5IEludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1JDQ19DSVJfQ1NTRiAgICAgICAgICAgICAgICAgICBSQ0NfQ0lSX0NTU0YgICAgICAgLyohPCBDbG9jayBTZWN1cml0eSBTeXN0ZW0gSW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfUkNDX0NTUl9PQkxSU1RGICAgICAgICAgICAgICAgIFJDQ19DU1JfT0JMUlNURiAgICAgICAgIC8qITwgT0JMIHJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgTExfUkNDX0NTUl9QSU5SU1RGICAgICAgICAgICAgICAgIFJDQ19DU1JfUElOUlNURiAgICAgICAgIC8qITwgUElOIHJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgTExfUkNDX0NTUl9QT1JSU1RGICAgICAgICAgICAgICAgIFJDQ19DU1JfUE9SUlNURiAgICAgICAgIC8qITwgUE9SL1BEUiByZXNldCBmbGFnICovCisjZGVmaW5lIExMX1JDQ19DU1JfU0ZUUlNURiAgICAgICAgICAgICAgICBSQ0NfQ1NSX1NGVFJTVEYgICAgICAgICAvKiE8IFNvZnR3YXJlIFJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgTExfUkNDX0NTUl9JV0RHUlNURiAgICAgICAgICAgICAgIFJDQ19DU1JfSVdER1JTVEYgICAgICAgIC8qITwgSW5kZXBlbmRlbnQgV2F0Y2hkb2cgcmVzZXQgZmxhZyAqLworI2RlZmluZSBMTF9SQ0NfQ1NSX1dXREdSU1RGICAgICAgICAgICAgICAgUkNDX0NTUl9XV0RHUlNURiAgICAgICAgLyohPCBXaW5kb3cgd2F0Y2hkb2cgcmVzZXQgZmxhZyAqLworI2RlZmluZSBMTF9SQ0NfQ1NSX0xQV1JSU1RGICAgICAgICAgICAgICAgUkNDX0NTUl9MUFdSUlNURiAgICAgICAgLyohPCBMb3ctUG93ZXIgcmVzZXQgZmxhZyAqLworI2lmIGRlZmluZWQoUkNDX0NTUl9WMThQV1JSU1RGKQorI2RlZmluZSBMTF9SQ0NfQ1NSX1YxOFBXUlJTVEYgICAgICAgICAgICAgUkNDX0NTUl9WMThQV1JSU1RGICAgICAgLyohPCBSZXNldCBmbGFnIG9mIHRoZSAxLjggViBkb21haW4uICovCisjZW5kaWYgLyogUkNDX0NTUl9WMThQV1JSU1RGICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19JVCBJVCBEZWZpbmVzCisgICogQGJyaWVmICAgIElUIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9SQ0NfUmVhZFJlZyBhbmQgIExMX1JDQ19Xcml0ZVJlZyBmdW5jdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfQ0lSX0xTSVJEWUlFICAgICAgICAgICAgICAgUkNDX0NJUl9MU0lSRFlJRSAgICAgIC8qITwgTFNJIFJlYWR5IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgTExfUkNDX0NJUl9MU0VSRFlJRSAgICAgICAgICAgICAgIFJDQ19DSVJfTFNFUkRZSUUgICAgICAvKiE8IExTRSBSZWFkeSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIExMX1JDQ19DSVJfSFNJUkRZSUUgICAgICAgICAgICAgICBSQ0NfQ0lSX0hTSVJEWUlFICAgICAgLyohPCBIU0kgUmVhZHkgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBMTF9SQ0NfQ0lSX0hTRVJEWUlFICAgICAgICAgICAgICAgUkNDX0NJUl9IU0VSRFlJRSAgICAgIC8qITwgSFNFIFJlYWR5IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgTExfUkNDX0NJUl9QTExSRFlJRSAgICAgICAgICAgICAgIFJDQ19DSVJfUExMUkRZSUUgICAgICAvKiE8IFBMTCBSZWFkeSBJbnRlcnJ1cHQgRW5hYmxlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19MU0VEUklWRSAgTFNFIG9zY2lsbGF0b3IgZHJpdmUgY2FwYWJpbGl0eQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19MU0VEUklWRV9MT1cgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBYdGFsIG1vZGUgbG93ZXIgZHJpdmluZyBjYXBhYmlsaXR5ICovCisjZGVmaW5lIExMX1JDQ19MU0VEUklWRV9NRURJVU1MT1cgICAgICAgICAgUkNDX0JEQ1JfTFNFRFJWXzEgLyohPCBYdGFsIG1vZGUgbWVkaXVtIGxvdyBkcml2aW5nIGNhcGFiaWxpdHkgKi8KKyNkZWZpbmUgTExfUkNDX0xTRURSSVZFX01FRElVTUhJR0ggICAgICAgICBSQ0NfQkRDUl9MU0VEUlZfMCAvKiE8IFh0YWwgbW9kZSBtZWRpdW0gaGlnaCBkcml2aW5nIGNhcGFiaWxpdHkgKi8KKyNkZWZpbmUgTExfUkNDX0xTRURSSVZFX0hJR0ggICAgICAgICAgICAgICBSQ0NfQkRDUl9MU0VEUlYgICAvKiE8IFh0YWwgbW9kZSBoaWdoZXIgZHJpdmluZyBjYXBhYmlsaXR5ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19TWVNfQ0xLU09VUkNFICBTeXN0ZW0gY2xvY2sgc3dpdGNoCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX1NZU19DTEtTT1VSQ0VfSFNJICAgICAgICAgICBSQ0NfQ0ZHUl9TV19IU0kgICAgLyohPCBIU0kgc2VsZWN0aW9uIGFzIHN5c3RlbSBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9IU0UgICAgICAgICAgIFJDQ19DRkdSX1NXX0hTRSAgICAvKiE8IEhTRSBzZWxlY3Rpb24gYXMgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19TWVNfQ0xLU09VUkNFX1BMTCAgICAgICAgICAgUkNDX0NGR1JfU1dfUExMICAgIC8qITwgUExMIHNlbGVjdGlvbiBhcyBzeXN0ZW0gY2xvY2sgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1NZU19DTEtTT1VSQ0VfU1RBVFVTICBTeXN0ZW0gY2xvY2sgc3dpdGNoIHN0YXR1cworICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19TWVNfQ0xLU09VUkNFX1NUQVRVU19IU0kgICAgUkNDX0NGR1JfU1dTX0hTSSAgIC8qITwgSFNJIHVzZWQgYXMgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19TWVNfQ0xLU09VUkNFX1NUQVRVU19IU0UgICAgUkNDX0NGR1JfU1dTX0hTRSAgIC8qITwgSFNFIHVzZWQgYXMgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19TWVNfQ0xLU09VUkNFX1NUQVRVU19QTEwgICAgUkNDX0NGR1JfU1dTX1BMTCAgIC8qITwgUExMIHVzZWQgYXMgc3lzdGVtIGNsb2NrICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19TWVNDTEtfRElWICBBSEIgcHJlc2NhbGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX1NZU0NMS19ESVZfMSAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9IUFJFX0RJVjEgICAvKiE8IFNZU0NMSyBub3QgZGl2aWRlZCAqLworI2RlZmluZSBMTF9SQ0NfU1lTQ0xLX0RJVl8yICAgICAgICAgICAgICAgIFJDQ19DRkdSX0hQUkVfRElWMiAgIC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgMiAqLworI2RlZmluZSBMTF9SQ0NfU1lTQ0xLX0RJVl80ICAgICAgICAgICAgICAgIFJDQ19DRkdSX0hQUkVfRElWNCAgIC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgNCAqLworI2RlZmluZSBMTF9SQ0NfU1lTQ0xLX0RJVl84ICAgICAgICAgICAgICAgIFJDQ19DRkdSX0hQUkVfRElWOCAgIC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgOCAqLworI2RlZmluZSBMTF9SQ0NfU1lTQ0xLX0RJVl8xNiAgICAgICAgICAgICAgIFJDQ19DRkdSX0hQUkVfRElWMTYgIC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgMTYgKi8KKyNkZWZpbmUgTExfUkNDX1NZU0NMS19ESVZfNjQgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9IUFJFX0RJVjY0ICAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDY0ICovCisjZGVmaW5lIExMX1JDQ19TWVNDTEtfRElWXzEyOCAgICAgICAgICAgICAgUkNDX0NGR1JfSFBSRV9ESVYxMjggLyohPCBTWVNDTEsgZGl2aWRlZCBieSAxMjggKi8KKyNkZWZpbmUgTExfUkNDX1NZU0NMS19ESVZfMjU2ICAgICAgICAgICAgICBSQ0NfQ0ZHUl9IUFJFX0RJVjI1NiAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDI1NiAqLworI2RlZmluZSBMTF9SQ0NfU1lTQ0xLX0RJVl81MTIgICAgICAgICAgICAgIFJDQ19DRkdSX0hQUkVfRElWNTEyIC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgNTEyICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19BUEIxX0RJViAgQVBCIGxvdy1zcGVlZCBwcmVzY2FsZXIgKEFQQjEpCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX0FQQjFfRElWXzEgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9QUFJFMV9ESVYxICAvKiE8IEhDTEsgbm90IGRpdmlkZWQgKi8KKyNkZWZpbmUgTExfUkNDX0FQQjFfRElWXzIgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9QUFJFMV9ESVYyICAvKiE8IEhDTEsgZGl2aWRlZCBieSAyICovCisjZGVmaW5lIExMX1JDQ19BUEIxX0RJVl80ICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUFBSRTFfRElWNCAgLyohPCBIQ0xLIGRpdmlkZWQgYnkgNCAqLworI2RlZmluZSBMTF9SQ0NfQVBCMV9ESVZfOCAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BQUkUxX0RJVjggIC8qITwgSENMSyBkaXZpZGVkIGJ5IDggKi8KKyNkZWZpbmUgTExfUkNDX0FQQjFfRElWXzE2ICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9QUFJFMV9ESVYxNiAvKiE8IEhDTEsgZGl2aWRlZCBieSAxNiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfQVBCMl9ESVYgIEFQQiBoaWdoLXNwZWVkIHByZXNjYWxlciAoQVBCMikKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfQVBCMl9ESVZfMSAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BQUkUyX0RJVjEgIC8qITwgSENMSyBub3QgZGl2aWRlZCAqLworI2RlZmluZSBMTF9SQ0NfQVBCMl9ESVZfMiAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BQUkUyX0RJVjIgIC8qITwgSENMSyBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgTExfUkNDX0FQQjJfRElWXzQgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9QUFJFMl9ESVY0ICAvKiE8IEhDTEsgZGl2aWRlZCBieSA0ICovCisjZGVmaW5lIExMX1JDQ19BUEIyX0RJVl84ICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUFBSRTJfRElWOCAgLyohPCBIQ0xLIGRpdmlkZWQgYnkgOCAqLworI2RlZmluZSBMTF9SQ0NfQVBCMl9ESVZfMTYgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BQUkUyX0RJVjE2IC8qITwgSENMSyBkaXZpZGVkIGJ5IDE2ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19NQ08xU09VUkNFICBNQ08xIFNPVVJDRSBzZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfTUNPMVNPVVJDRV9OT0NMT0NLICAgICAgICAgIFJDQ19DRkdSX01DT1NFTF9OT0NMT0NLICAgICAgLyohPCBNQ08gb3V0cHV0IGRpc2FibGVkLCBubyBjbG9jayBvbiBNQ08gKi8KKyNkZWZpbmUgTExfUkNDX01DTzFTT1VSQ0VfU1lTQ0xLICAgICAgICAgICBSQ0NfQ0ZHUl9NQ09TRUxfU1lTQ0xLICAgICAgIC8qITwgU1lTQ0xLIHNlbGVjdGlvbiBhcyBNQ08gc291cmNlICovCisjZGVmaW5lIExMX1JDQ19NQ08xU09VUkNFX0hTSSAgICAgICAgICAgICAgUkNDX0NGR1JfTUNPU0VMX0hTSSAgICAgICAgICAvKiE8IEhTSSBzZWxlY3Rpb24gYXMgTUNPIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfTUNPMVNPVVJDRV9IU0UgICAgICAgICAgICAgIFJDQ19DRkdSX01DT1NFTF9IU0UgICAgICAgICAgLyohPCBIU0Ugc2VsZWN0aW9uIGFzIE1DTyBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX01DTzFTT1VSQ0VfTFNJICAgICAgICAgICAgICBSQ0NfQ0ZHUl9NQ09TRUxfTFNJICAgICAgICAgIC8qITwgTFNJIHNlbGVjdGlvbiBhcyBNQ08gc291cmNlICovCisjZGVmaW5lIExMX1JDQ19NQ08xU09VUkNFX0xTRSAgICAgICAgICAgICAgUkNDX0NGR1JfTUNPU0VMX0xTRSAgICAgICAgICAvKiE8IExTRSBzZWxlY3Rpb24gYXMgTUNPIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfTUNPMVNPVVJDRV9QTExDTEtfRElWXzIgICAgIFJDQ19DRkdSX01DT1NFTF9QTExfRElWMiAgICAgLyohPCBQTEwgY2xvY2sgZGl2aWRlZCBieSAyKi8KKyNpZiBkZWZpbmVkKFJDQ19DRkdSX1BMTE5PRElWKQorI2RlZmluZSBMTF9SQ0NfTUNPMVNPVVJDRV9QTExDTEsgICAgICAgICAgIChSQ0NfQ0ZHUl9NQ09TRUxfUExMX0RJVjIgfCBSQ0NfQ0ZHUl9QTExOT0RJVikgLyohPCBQTEwgY2xvY2sgc2VsZWN0ZWQqLworI2VuZGlmIC8qIFJDQ19DRkdSX1BMTE5PRElWICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19NQ08xX0RJViAgTUNPMSBwcmVzY2FsZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfTUNPMV9ESVZfMSAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpLyohPCBNQ08gQ2xvY2sgZGl2aWRlZCBieSAxICovCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUl9NQ09QUkUpCisjZGVmaW5lIExMX1JDQ19NQ08xX0RJVl8yICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfTUNPUFJFX0RJVjIgICAvKiE8IE1DTyBDbG9jayBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgTExfUkNDX01DTzFfRElWXzQgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9NQ09QUkVfRElWNCAgIC8qITwgTUNPIENsb2NrIGRpdmlkZWQgYnkgNCAqLworI2RlZmluZSBMTF9SQ0NfTUNPMV9ESVZfOCAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX01DT1BSRV9ESVY4ICAgLyohPCBNQ08gQ2xvY2sgZGl2aWRlZCBieSA4ICovCisjZGVmaW5lIExMX1JDQ19NQ08xX0RJVl8xNiAgICAgICAgICAgICAgICAgUkNDX0NGR1JfTUNPUFJFX0RJVjE2ICAvKiE8IE1DTyBDbG9jayBkaXZpZGVkIGJ5IDE2ICovCisjZGVmaW5lIExMX1JDQ19NQ08xX0RJVl8zMiAgICAgICAgICAgICAgICAgUkNDX0NGR1JfTUNPUFJFX0RJVjMyICAvKiE8IE1DTyBDbG9jayBkaXZpZGVkIGJ5IDMyICovCisjZGVmaW5lIExMX1JDQ19NQ08xX0RJVl82NCAgICAgICAgICAgICAgICAgUkNDX0NGR1JfTUNPUFJFX0RJVjY0ICAvKiE8IE1DTyBDbG9jayBkaXZpZGVkIGJ5IDY0ICovCisjZGVmaW5lIExMX1JDQ19NQ08xX0RJVl8xMjggICAgICAgICAgICAgICAgUkNDX0NGR1JfTUNPUFJFX0RJVjEyOCAvKiE8IE1DTyBDbG9jayBkaXZpZGVkIGJ5IDEyOCAqLworI2VuZGlmIC8qIFJDQ19DRkdSX01DT1BSRSAqLworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfUEVSSVBIX0ZSRVFVRU5DWSBQZXJpcGhlcmFsIGNsb2NrIGZyZXF1ZW5jeQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05PICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAvKiE8IE5vIGNsb2NrIGVuYWJsZWQgZm9yIHRoZSBwZXJpcGhlcmFsICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTkEgICAgICAgICAweEZGRkZGRkZGVSAgICAgIC8qITwgRnJlcXVlbmN5IGNhbm5vdCBiZSBwcm92aWRlZCBhcyBleHRlcm5hbCBjbG9jayAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfVVNBUlQxX0NMS1NPVVJDRSBQZXJpcGhlcmFsIFVTQVJUIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24KKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoUkNDX0NGR1IzX1VTQVJUMVNXX1BDTEsxKQorI2RlZmluZSBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9QQ0xLMSAgICAodWludDMyX3QpKChSQ0NfUE9TSVRJT05fVVNBUlQxU1cgPDwgMjRVKSB8IFJDQ19DRkdSM19VU0FSVDFTV19QQ0xLMSkgIC8qITwgUENMSzEgY2xvY2sgdXNlZCBhcyBVU0FSVDEgY2xvY2sgc291cmNlICovCisjZWxzZQorI2RlZmluZSBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9QQ0xLMiAgICAodWludDMyX3QpKChSQ0NfUE9TSVRJT05fVVNBUlQxU1cgPDwgMjRVKSB8IFJDQ19DRkdSM19VU0FSVDFTV19QQ0xLMikgIC8qITwgUENMSzIgY2xvY2sgdXNlZCBhcyBVU0FSVDEgY2xvY2sgc291cmNlICovCisjZW5kaWYgLypSQ0NfQ0ZHUjNfVVNBUlQxU1dfUENMSzEqLworI2RlZmluZSBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9TWVNDTEsgICAodWludDMyX3QpKChSQ0NfUE9TSVRJT05fVVNBUlQxU1cgPDwgMjRVKSB8IFJDQ19DRkdSM19VU0FSVDFTV19TWVNDTEspIC8qITwgU3lzdGVtIGNsb2NrIHNlbGVjdGVkIGFzIFVTQVJUMSBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfTFNFICAgICAgKHVpbnQzMl90KSgoUkNDX1BPU0lUSU9OX1VTQVJUMVNXIDw8IDI0VSkgfCBSQ0NfQ0ZHUjNfVVNBUlQxU1dfTFNFKSAgICAvKiE8IExTRSBvc2NpbGxhdG9yIGNsb2NrIHVzZWQgYXMgVVNBUlQxIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9IU0kgICAgICAodWludDMyX3QpKChSQ0NfUE9TSVRJT05fVVNBUlQxU1cgPDwgMjRVKSB8IFJDQ19DRkdSM19VU0FSVDFTV19IU0kpICAgIC8qITwgSFNJIG9zY2lsbGF0b3IgY2xvY2sgdXNlZCBhcyBVU0FSVDEgY2xvY2sgc291cmNlICovCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfVVNBUlQyU1cpCisjZGVmaW5lIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFX1BDTEsxICAgICh1aW50MzJfdCkoKFJDQ19QT1NJVElPTl9VU0FSVDJTVyA8PCAyNFUpIHwgUkNDX0NGR1IzX1VTQVJUMlNXX1BDTEspICAgLyohPCBQQ0xLMSBjbG9jayB1c2VkIGFzIFVTQVJUMiBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX1VTQVJUMl9DTEtTT1VSQ0VfU1lTQ0xLICAgKHVpbnQzMl90KSgoUkNDX1BPU0lUSU9OX1VTQVJUMlNXIDw8IDI0VSkgfCBSQ0NfQ0ZHUjNfVVNBUlQyU1dfU1lTQ0xLKSAvKiE8IFN5c3RlbSBjbG9jayBzZWxlY3RlZCBhcyBVU0FSVDIgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFX0xTRSAgICAgICh1aW50MzJfdCkoKFJDQ19QT1NJVElPTl9VU0FSVDJTVyA8PCAyNFUpIHwgUkNDX0NGR1IzX1VTQVJUMlNXX0xTRSkgICAgLyohPCBMU0Ugb3NjaWxsYXRvciBjbG9jayB1c2VkIGFzIFVTQVJUMiBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX1VTQVJUMl9DTEtTT1VSQ0VfSFNJICAgICAgKHVpbnQzMl90KSgoUkNDX1BPU0lUSU9OX1VTQVJUMlNXIDw8IDI0VSkgfCBSQ0NfQ0ZHUjNfVVNBUlQyU1dfSFNJKSAgICAvKiE8IEhTSSBvc2NpbGxhdG9yIGNsb2NrIHVzZWQgYXMgVVNBUlQyIGNsb2NrIHNvdXJjZSAqLworI2VuZGlmIC8qIFJDQ19DRkdSM19VU0FSVDJTVyAqLworI2lmIGRlZmluZWQoUkNDX0NGR1IzX1VTQVJUM1NXKQorI2RlZmluZSBMTF9SQ0NfVVNBUlQzX0NMS1NPVVJDRV9QQ0xLMSAgICAodWludDMyX3QpKChSQ0NfUE9TSVRJT05fVVNBUlQzU1cgPDwgMjRVKSB8IFJDQ19DRkdSM19VU0FSVDNTV19QQ0xLKSAgIC8qITwgUENMSzEgY2xvY2sgdXNlZCBhcyBVU0FSVDMgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19VU0FSVDNfQ0xLU09VUkNFX1NZU0NMSyAgICh1aW50MzJfdCkoKFJDQ19QT1NJVElPTl9VU0FSVDNTVyA8PCAyNFUpIHwgUkNDX0NGR1IzX1VTQVJUM1NXX1NZU0NMSykgLyohPCBTeXN0ZW0gY2xvY2sgc2VsZWN0ZWQgYXMgVVNBUlQzIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfVVNBUlQzX0NMS1NPVVJDRV9MU0UgICAgICAodWludDMyX3QpKChSQ0NfUE9TSVRJT05fVVNBUlQzU1cgPDwgMjRVKSB8IFJDQ19DRkdSM19VU0FSVDNTV19MU0UpICAgIC8qITwgTFNFIG9zY2lsbGF0b3IgY2xvY2sgdXNlZCBhcyBVU0FSVDMgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19VU0FSVDNfQ0xLU09VUkNFX0hTSSAgICAgICh1aW50MzJfdCkoKFJDQ19QT1NJVElPTl9VU0FSVDNTVyA8PCAyNFUpIHwgUkNDX0NGR1IzX1VTQVJUM1NXX0hTSSkgICAgLyohPCBIU0kgb3NjaWxsYXRvciBjbG9jayB1c2VkIGFzIFVTQVJUMyBjbG9jayBzb3VyY2UgKi8KKyNlbmRpZiAvKiBSQ0NfQ0ZHUjNfVVNBUlQzU1cgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFJDQ19DRkdSM19VQVJUNFNXKSB8fCBkZWZpbmVkKFJDQ19DRkdSM19VQVJUNVNXKQorLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfVUFSVDRfQ0xLU09VUkNFIFBlcmlwaGVyYWwgVUFSVCBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX1VBUlQ0X0NMS1NPVVJDRV9QQ0xLMSAgICAgKHVpbnQzMl90KSgoUkNDX0NGR1IzX1VBUlQ0U1cgPj4gOFUpIHwgUkNDX0NGR1IzX1VBUlQ0U1dfUENMSykgICAvKiE8IFBDTEsxIGNsb2NrIHVzZWQgYXMgVUFSVDQgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19VQVJUNF9DTEtTT1VSQ0VfU1lTQ0xLICAgICh1aW50MzJfdCkoKFJDQ19DRkdSM19VQVJUNFNXID4+IDhVKSB8IFJDQ19DRkdSM19VQVJUNFNXX1NZU0NMSykgLyohPCBTeXN0ZW0gY2xvY2sgc2VsZWN0ZWQgYXMgVUFSVDQgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19VQVJUNF9DTEtTT1VSQ0VfTFNFICAgICAgICh1aW50MzJfdCkoKFJDQ19DRkdSM19VQVJUNFNXID4+IDhVKSB8IFJDQ19DRkdSM19VQVJUNFNXX0xTRSkgICAgLyohPCBMU0Ugb3NjaWxsYXRvciBjbG9jayB1c2VkIGFzIFVBUlQ0IGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfVUFSVDRfQ0xLU09VUkNFX0hTSSAgICAgICAodWludDMyX3QpKChSQ0NfQ0ZHUjNfVUFSVDRTVyA+PiA4VSkgfCBSQ0NfQ0ZHUjNfVUFSVDRTV19IU0kpICAgIC8qITwgSFNJIG9zY2lsbGF0b3IgY2xvY2sgdXNlZCBhcyBVQVJUNCBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX1VBUlQ1X0NMS1NPVVJDRV9QQ0xLMSAgICAgKHVpbnQzMl90KSgoUkNDX0NGR1IzX1VBUlQ1U1cgPj4gOFUpIHwgUkNDX0NGR1IzX1VBUlQ1U1dfUENMSykgICAvKiE8IFBDTEsxIGNsb2NrIHVzZWQgYXMgVUFSVDUgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19VQVJUNV9DTEtTT1VSQ0VfU1lTQ0xLICAgICh1aW50MzJfdCkoKFJDQ19DRkdSM19VQVJUNVNXID4+IDhVKSB8IFJDQ19DRkdSM19VQVJUNVNXX1NZU0NMSykgLyohPCBTeXN0ZW0gY2xvY2sgc2VsZWN0ZWQgYXMgVUFSVDUgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19VQVJUNV9DTEtTT1VSQ0VfTFNFICAgICAgICh1aW50MzJfdCkoKFJDQ19DRkdSM19VQVJUNVNXID4+IDhVKSB8IFJDQ19DRkdSM19VQVJUNVNXX0xTRSkgICAgLyohPCBMU0Ugb3NjaWxsYXRvciBjbG9jayB1c2VkIGFzIFVBUlQ1IGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfVUFSVDVfQ0xLU09VUkNFX0hTSSAgICAgICAodWludDMyX3QpKChSQ0NfQ0ZHUjNfVUFSVDVTVyA+PiA4VSkgfCBSQ0NfQ0ZHUjNfVUFSVDVTV19IU0kpICAgIC8qITwgSFNJIG9zY2lsbGF0b3IgY2xvY2sgdXNlZCBhcyBVQVJUNSBjbG9jayBzb3VyY2UgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBSQ0NfQ0ZHUjNfVUFSVDRTVyB8fCBSQ0NfQ0ZHUjNfVUFSVDVTVyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19JMkMxX0NMS1NPVVJDRSBQZXJpcGhlcmFsIEkyQyBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX0kyQzFfQ0xLU09VUkNFX0hTSSAgICAgICAgKHVpbnQzMl90KSgoUkNDX0NGR1IzX0kyQzFTVyA8PCAyNFUpIHwgUkNDX0NGR1IzX0kyQzFTV19IU0kpICAgIC8qITwgSFNJIG9zY2lsbGF0b3IgY2xvY2sgdXNlZCBhcyBJMkMxIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0VfU1lTQ0xLICAgICAodWludDMyX3QpKChSQ0NfQ0ZHUjNfSTJDMVNXIDw8IDI0VSkgfCBSQ0NfQ0ZHUjNfSTJDMVNXX1NZU0NMSykgLyohPCBTeXN0ZW0gY2xvY2sgc2VsZWN0ZWQgYXMgSTJDMSBjbG9jayBzb3VyY2UgKi8KKyNpZiBkZWZpbmVkKFJDQ19DRkdSM19JMkMyU1cpCisjZGVmaW5lIExMX1JDQ19JMkMyX0NMS1NPVVJDRV9IU0kgICAgICAgICh1aW50MzJfdCkoKFJDQ19DRkdSM19JMkMyU1cgPDwgMjRVKSB8IFJDQ19DRkdSM19JMkMyU1dfSFNJKSAgICAvKiE8IEhTSSBvc2NpbGxhdG9yIGNsb2NrIHVzZWQgYXMgSTJDMiBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX0kyQzJfQ0xLU09VUkNFX1NZU0NMSyAgICAgKHVpbnQzMl90KSgoUkNDX0NGR1IzX0kyQzJTVyA8PCAyNFUpIHwgUkNDX0NGR1IzX0kyQzJTV19TWVNDTEspIC8qITwgU3lzdGVtIGNsb2NrIHNlbGVjdGVkIGFzIEkyQzIgY2xvY2sgc291cmNlICovCisjZW5kaWYgLypSQ0NfQ0ZHUjNfSTJDMlNXKi8KKyNpZiBkZWZpbmVkKFJDQ19DRkdSM19JMkMzU1cpCisjZGVmaW5lIExMX1JDQ19JMkMzX0NMS1NPVVJDRV9IU0kgICAgICAgICh1aW50MzJfdCkoKFJDQ19DRkdSM19JMkMzU1cgPDwgMjRVKSB8IFJDQ19DRkdSM19JMkMzU1dfSFNJKSAgICAvKiE8IEhTSSBvc2NpbGxhdG9yIGNsb2NrIHVzZWQgYXMgSTJDMyBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX0kyQzNfQ0xLU09VUkNFX1NZU0NMSyAgICAgKHVpbnQzMl90KSgoUkNDX0NGR1IzX0kyQzNTVyA8PCAyNFUpIHwgUkNDX0NGR1IzX0kyQzNTV19TWVNDTEspIC8qITwgU3lzdGVtIGNsb2NrIHNlbGVjdGVkIGFzIEkyQzMgY2xvY2sgc291cmNlICovCisjZW5kaWYgLypSQ0NfQ0ZHUjNfSTJDM1NXKi8KKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFJDQ19DRkdSX0kyU1NSQykKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0kyU19DTEtTT1VSQ0UgUGVyaXBoZXJhbCBJMlMgY2xvY2sgc291cmNlIHNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19JMlNfQ0xLU09VUkNFX1NZU0NMSyAgICAgIFJDQ19DRkdSX0kyU1NSQ19TWVNDTEsgLyohPCBTeXN0ZW0gY2xvY2sgc2VsZWN0ZWQgYXMgSTJTIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfSTJTX0NMS1NPVVJDRV9QSU4gICAgICAgICBSQ0NfQ0ZHUl9JMlNTUkNfRVhUICAgIC8qITwgRXh0ZXJuYWwgY2xvY2sgc2VsZWN0ZWQgYXMgSTJTIGNsb2NrIHNvdXJjZSAqLworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFJDQ19DRkdSX0kyU1NSQyAqLworCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfVElNU1cpCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19USU0xX0NMS1NPVVJDRSBQZXJpcGhlcmFsIFRJTSBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX1RJTTFfQ0xLU09VUkNFX1BDTEsyICAgICAgKHVpbnQzMl90KSgoKFJDQ19QT1NJVElPTl9USU0xU1cgLSBSQ0NfUE9TSVRJT05fVElNMVNXKSA8PCAyN1UpIHwgUkNDX0NGR1IzX1RJTTFTV19QQ0xLMikgICAvKiE8IFBDTEsyIHVzZWQgYXMgVElNMSBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX1RJTTFfQ0xLU09VUkNFX1BMTCAgICAgICAgKHVpbnQzMl90KSgoKFJDQ19QT1NJVElPTl9USU0xU1cgLSBSQ0NfUE9TSVRJT05fVElNMVNXKSA8PCAyN1UpIHwgUkNDX0NGR1IzX1RJTTFTV19QTEwpICAgICAvKiE8IFBMTCBjbG9jayB1c2VkIGFzIFRJTTEgY2xvY2sgc291cmNlICovCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfVElNOFNXKQorI2RlZmluZSBMTF9SQ0NfVElNOF9DTEtTT1VSQ0VfUENMSzIgICAgICAodWludDMyX3QpKCgoUkNDX1BPU0lUSU9OX1RJTThTVyAtIFJDQ19QT1NJVElPTl9USU0xU1cpIDw8IDI3VSkgfCBSQ0NfQ0ZHUjNfVElNOFNXX1BDTEsyKSAgIC8qITwgUENMSzIgdXNlZCBhcyBUSU04IGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfVElNOF9DTEtTT1VSQ0VfUExMICAgICAgICAodWludDMyX3QpKCgoUkNDX1BPU0lUSU9OX1RJTThTVyAtIFJDQ19QT1NJVElPTl9USU0xU1cpIDw8IDI3VSkgfCBSQ0NfQ0ZHUjNfVElNOFNXX1BMTCkgICAgIC8qITwgUExMIGNsb2NrIHVzZWQgYXMgVElNOCBjbG9jayBzb3VyY2UgKi8KKyNlbmRpZiAvKlJDQ19DRkdSM19USU04U1cqLworI2lmIGRlZmluZWQoUkNDX0NGR1IzX1RJTTE1U1cpCisjZGVmaW5lIExMX1JDQ19USU0xNV9DTEtTT1VSQ0VfUENMSzIgICAgICh1aW50MzJfdCkoKChSQ0NfUE9TSVRJT05fVElNMTVTVyAtIFJDQ19QT1NJVElPTl9USU0xU1cpIDw8IDI3VSkgfCBSQ0NfQ0ZHUjNfVElNMTVTV19QQ0xLMikgLyohPCBQQ0xLMiB1c2VkIGFzIFRJTTE1IGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfVElNMTVfQ0xLU09VUkNFX1BMTCAgICAgICAodWludDMyX3QpKCgoUkNDX1BPU0lUSU9OX1RJTTE1U1cgLSBSQ0NfUE9TSVRJT05fVElNMVNXKSA8PCAyN1UpIHwgUkNDX0NGR1IzX1RJTTE1U1dfUExMKSAgIC8qITwgUExMIGNsb2NrIHVzZWQgYXMgVElNMTUgY2xvY2sgc291cmNlICovCisjZW5kaWYgLypSQ0NfQ0ZHUjNfVElNMTVTVyovCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfVElNMTZTVykKKyNkZWZpbmUgTExfUkNDX1RJTTE2X0NMS1NPVVJDRV9QQ0xLMiAgICAgKHVpbnQzMl90KSgoKFJDQ19QT1NJVElPTl9USU0xNlNXIC0gUkNDX1BPU0lUSU9OX1RJTTFTVykgPDwgMjdVKSB8IFJDQ19DRkdSM19USU0xNlNXX1BDTEsyKSAvKiE8IFBDTEsyIHVzZWQgYXMgVElNMTYgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19USU0xNl9DTEtTT1VSQ0VfUExMICAgICAgICh1aW50MzJfdCkoKChSQ0NfUE9TSVRJT05fVElNMTZTVyAtIFJDQ19QT1NJVElPTl9USU0xU1cpIDw8IDI3VSkgfCBSQ0NfQ0ZHUjNfVElNMTZTV19QTEwpICAgLyohPCBQTEwgY2xvY2sgdXNlZCBhcyBUSU0xNiBjbG9jayBzb3VyY2UgKi8KKyNlbmRpZiAvKlJDQ19DRkdSM19USU0xNlNXKi8KKyNpZiBkZWZpbmVkKFJDQ19DRkdSM19USU0xN1NXKQorI2RlZmluZSBMTF9SQ0NfVElNMTdfQ0xLU09VUkNFX1BDTEsyICAgICAodWludDMyX3QpKCgoUkNDX1BPU0lUSU9OX1RJTTE3U1cgLSBSQ0NfUE9TSVRJT05fVElNMVNXKSA8PCAyN1UpIHwgUkNDX0NGR1IzX1RJTTE3U1dfUENMSzIpIC8qITwgUENMSzIgdXNlZCBhcyBUSU0xNyBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX1RJTTE3X0NMS1NPVVJDRV9QTEwgICAgICAgKHVpbnQzMl90KSgoKFJDQ19QT1NJVElPTl9USU0xN1NXIC0gUkNDX1BPU0lUSU9OX1RJTTFTVykgPDwgMjdVKSB8IFJDQ19DRkdSM19USU0xN1NXX1BMTCkgICAvKiE8IFBMTCBjbG9jayB1c2VkIGFzIFRJTTE3IGNsb2NrIHNvdXJjZSAqLworI2VuZGlmIC8qUkNDX0NGR1IzX1RJTTE3U1cqLworI2lmIGRlZmluZWQoUkNDX0NGR1IzX1RJTTIwU1cpCisjZGVmaW5lIExMX1JDQ19USU0yMF9DTEtTT1VSQ0VfUENMSzIgICAgICh1aW50MzJfdCkoKChSQ0NfUE9TSVRJT05fVElNMjBTVyAtIFJDQ19QT1NJVElPTl9USU0xU1cpIDw8IDI3VSkgfCBSQ0NfQ0ZHUjNfVElNMjBTV19QQ0xLMikgLyohPCBQQ0xLMiB1c2VkIGFzIFRJTTIwIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfVElNMjBfQ0xLU09VUkNFX1BMTCAgICAgICAodWludDMyX3QpKCgoUkNDX1BPU0lUSU9OX1RJTTIwU1cgLSBSQ0NfUE9TSVRJT05fVElNMVNXKSA8PCAyN1UpIHwgUkNDX0NGR1IzX1RJTTIwU1dfUExMKSAgIC8qITwgUExMIGNsb2NrIHVzZWQgYXMgVElNMjAgY2xvY2sgc291cmNlICovCisjZW5kaWYgLypSQ0NfQ0ZHUjNfVElNMjBTVyovCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfVElNMlNXKQorI2RlZmluZSBMTF9SQ0NfVElNMl9DTEtTT1VSQ0VfUENMSzEgICAgICAodWludDMyX3QpKCgoUkNDX1BPU0lUSU9OX1RJTTJTVyAtIFJDQ19QT1NJVElPTl9USU0xU1cpIDw8IDI3VSkgfCBSQ0NfQ0ZHUjNfVElNMlNXX1BDTEsxKSAgIC8qITwgUENMSzEgdXNlZCBhcyBUSU0yIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfVElNMl9DTEtTT1VSQ0VfUExMICAgICAgICAodWludDMyX3QpKCgoUkNDX1BPU0lUSU9OX1RJTTJTVyAtIFJDQ19QT1NJVElPTl9USU0xU1cpIDw8IDI3VSkgfCBSQ0NfQ0ZHUjNfVElNMlNXX1BMTCkgICAgIC8qITwgUExMIGNsb2NrIHVzZWQgYXMgVElNMiBjbG9jayBzb3VyY2UgKi8KKyNlbmRpZiAvKlJDQ19DRkdSM19USU0yU1cqLworI2lmIGRlZmluZWQoUkNDX0NGR1IzX1RJTTM0U1cpCisjZGVmaW5lIExMX1JDQ19USU0zNF9DTEtTT1VSQ0VfUENMSzEgICAgICh1aW50MzJfdCkoKChSQ0NfUE9TSVRJT05fVElNMzRTVyAtIFJDQ19QT1NJVElPTl9USU0xU1cpIDw8IDI3VSkgfCBSQ0NfQ0ZHUjNfVElNMzRTV19QQ0xLMSkgLyohPCBQQ0xLMSB1c2VkIGFzIFRJTTMvNCBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX1RJTTM0X0NMS1NPVVJDRV9QTEwgICAgICAgKHVpbnQzMl90KSgoKFJDQ19QT1NJVElPTl9USU0zNFNXIC0gUkNDX1BPU0lUSU9OX1RJTTFTVykgPDwgMjdVKSB8IFJDQ19DRkdSM19USU0zNFNXX1BMTCkgICAvKiE8IFBMTCBjbG9jayB1c2VkIGFzIFRJTTMvNCBjbG9jayBzb3VyY2UgKi8KKyNlbmRpZiAvKlJDQ19DRkdSM19USU0zNFNXKi8KKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBSQ0NfQ0ZHUjNfVElNU1cgKi8KKworI2lmIGRlZmluZWQoSFJUSU0xKQorLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfSFJUSU0xX0NMS1NPVVJDRSBQZXJpcGhlcmFsIEhSVElNMSBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX0hSVElNMV9DTEtTT1VSQ0VfUENMSzIgICAgUkNDX0NGR1IzX0hSVElNMVNXX1BDTEsyIC8qITwgUENMSzIgdXNlZCBhcyAgSFJUSU0xIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfSFJUSU0xX0NMS1NPVVJDRV9QTEwgICAgICBSQ0NfQ0ZHUjNfSFJUSU0xU1dfUExMICAgLyohPCBQTEwgY2xvY2sgdXNlZCBhcyAgSFJUSU0xIGNsb2NrIHNvdXJjZSAqLworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhSVElNMSAqLworCisjaWYgZGVmaW5lZChDRUMpCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19DRUNfQ0xLU09VUkNFIFBlcmlwaGVyYWwgQ0VDIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfQ0VDX0NMS1NPVVJDRV9IU0lfRElWMjQ0ICBSQ0NfQ0ZHUjNfQ0VDU1dfSFNJX0RJVjI0NCAvKiE8IEhTSSBjbG9jayBkaXZpZGVkIGJ5IDI0NCBzZWxlY3RlZCBhcyBIRE1JIENFQyBlbnRyeSBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX0NFQ19DTEtTT1VSQ0VfTFNFICAgICAgICAgUkNDX0NGR1IzX0NFQ1NXX0xTRSAgICAgICAgLyohPCBMU0UgY2xvY2sgc2VsZWN0ZWQgYXMgSERNSSBDRUMgZW50cnkgY2xvY2sgc291cmNlICovCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogQ0VDICovCisKKyNpZiBkZWZpbmVkKFVTQikKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1VTQl9DTEtTT1VSQ0UgUGVyaXBoZXJhbCBVU0IgY2xvY2sgc291cmNlIHNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19VU0JfQ0xLU09VUkNFX1BMTCAgICAgICAgIFJDQ19DRkdSX1VTQlBSRV9ESVYxICAgIC8qITwgVVNCIHByZXNjYWxlciBpcyBQTEwgY2xvY2sgZGl2aWRlZCBieSAxICovCisjZGVmaW5lIExMX1JDQ19VU0JfQ0xLU09VUkNFX1BMTF9ESVZfMV81IFJDQ19DRkdSX1VTQlBSRV9ESVYxXzUgIC8qITwgVVNCIHByZXNjYWxlciBpcyBQTEwgY2xvY2sgZGl2aWRlZCBieSAxLjUgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0IgKi8KKworI2lmIGRlZmluZWQoUkNDX0NGR1JfQURDUFJFKQorLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfQURDX0NMS1NPVVJDRSBQZXJpcGhlcmFsIEFEQyBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX0FEQ19DTEtTUkNfUENMSzJfRElWXzIgICAgUkNDX0NGR1JfQURDUFJFX0RJVjIgICAgICAvKiE8IEFEQyBwcmVzY2FsZXIgUENMSyBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgTExfUkNDX0FEQ19DTEtTUkNfUENMSzJfRElWXzQgICAgUkNDX0NGR1JfQURDUFJFX0RJVjQgICAgICAvKiE8IEFEQyBwcmVzY2FsZXIgUENMSyBkaXZpZGVkIGJ5IDQgKi8KKyNkZWZpbmUgTExfUkNDX0FEQ19DTEtTUkNfUENMSzJfRElWXzYgICAgUkNDX0NGR1JfQURDUFJFX0RJVjYgICAgICAvKiE8IEFEQyBwcmVzY2FsZXIgUENMSyBkaXZpZGVkIGJ5IDYgKi8KKyNkZWZpbmUgTExfUkNDX0FEQ19DTEtTUkNfUENMSzJfRElWXzggICAgUkNDX0NGR1JfQURDUFJFX0RJVjggICAgICAvKiE8IEFEQyBwcmVzY2FsZXIgUENMSyBkaXZpZGVkIGJ5IDggKi8KKy8qKgorICAqIEB9CisgICovCisKKyNlbGlmIGRlZmluZWQoUkNDX0NGR1IyX0FEQzFQUkVTKQorLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfQURDMV9DTEtTT1VSQ0UgUGVyaXBoZXJhbCBBREMgY2xvY2sgc291cmNlIHNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19BREMxX0NMS1NSQ19IQ0xLICAgICAgICAgIFJDQ19DRkdSMl9BREMxUFJFU19OTyAgICAgLyohPCBBREMxIGNsb2NrIGRpc2FibGVkLCBBREMxIGNhbiB1c2UgQUhCIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19BREMxX0NMS1NSQ19QTExfRElWXzEgICAgIFJDQ19DRkdSMl9BREMxUFJFU19ESVYxICAgLyohPCBBREMxIFBMTCBjbG9jayBkaXZpZGVkIGJ5IDEgKi8KKyNkZWZpbmUgTExfUkNDX0FEQzFfQ0xLU1JDX1BMTF9ESVZfMiAgICAgUkNDX0NGR1IyX0FEQzFQUkVTX0RJVjIgICAvKiE8IEFEQzEgUExMIGNsb2NrIGRpdmlkZWQgYnkgMiAqLworI2RlZmluZSBMTF9SQ0NfQURDMV9DTEtTUkNfUExMX0RJVl80ICAgICBSQ0NfQ0ZHUjJfQURDMVBSRVNfRElWNCAgIC8qITwgQURDMSBQTEwgY2xvY2sgZGl2aWRlZCBieSA0ICovCisjZGVmaW5lIExMX1JDQ19BREMxX0NMS1NSQ19QTExfRElWXzYgICAgIFJDQ19DRkdSMl9BREMxUFJFU19ESVY2ICAgLyohPCBBREMxIFBMTCBjbG9jayBkaXZpZGVkIGJ5IDYgKi8KKyNkZWZpbmUgTExfUkNDX0FEQzFfQ0xLU1JDX1BMTF9ESVZfOCAgICAgUkNDX0NGR1IyX0FEQzFQUkVTX0RJVjggICAvKiE8IEFEQzEgUExMIGNsb2NrIGRpdmlkZWQgYnkgOCAqLworI2RlZmluZSBMTF9SQ0NfQURDMV9DTEtTUkNfUExMX0RJVl8xMCAgICBSQ0NfQ0ZHUjJfQURDMVBSRVNfRElWMTAgIC8qITwgQURDMSBQTEwgY2xvY2sgZGl2aWRlZCBieSAxMCAqLworI2RlZmluZSBMTF9SQ0NfQURDMV9DTEtTUkNfUExMX0RJVl8xMiAgICBSQ0NfQ0ZHUjJfQURDMVBSRVNfRElWMTIgIC8qITwgQURDMSBQTEwgY2xvY2sgZGl2aWRlZCBieSAxMiAqLworI2RlZmluZSBMTF9SQ0NfQURDMV9DTEtTUkNfUExMX0RJVl8xNiAgICBSQ0NfQ0ZHUjJfQURDMVBSRVNfRElWMTYgIC8qITwgQURDMSBQTEwgY2xvY2sgZGl2aWRlZCBieSAxNiAqLworI2RlZmluZSBMTF9SQ0NfQURDMV9DTEtTUkNfUExMX0RJVl8zMiAgICBSQ0NfQ0ZHUjJfQURDMVBSRVNfRElWMzIgIC8qITwgQURDMSBQTEwgY2xvY2sgZGl2aWRlZCBieSAzMiAqLworI2RlZmluZSBMTF9SQ0NfQURDMV9DTEtTUkNfUExMX0RJVl82NCAgICBSQ0NfQ0ZHUjJfQURDMVBSRVNfRElWNjQgIC8qITwgQURDMSBQTEwgY2xvY2sgZGl2aWRlZCBieSA2NCAqLworI2RlZmluZSBMTF9SQ0NfQURDMV9DTEtTUkNfUExMX0RJVl8xMjggICBSQ0NfQ0ZHUjJfQURDMVBSRVNfRElWMTI4IC8qITwgQURDMSBQTEwgY2xvY2sgZGl2aWRlZCBieSAxMjggKi8KKyNkZWZpbmUgTExfUkNDX0FEQzFfQ0xLU1JDX1BMTF9ESVZfMjU2ICAgUkNDX0NGR1IyX0FEQzFQUkVTX0RJVjI1NiAvKiE8IEFEQzEgUExMIGNsb2NrIGRpdmlkZWQgYnkgMjU2ICovCisvKioKKyAgKiBAfQorICAqLworCisjZWxpZiBkZWZpbmVkKFJDQ19DRkdSMl9BRENQUkUxMikgfHwgZGVmaW5lZChSQ0NfQ0ZHUjJfQURDUFJFMzQpCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjJfQURDUFJFMTIpICYmIGRlZmluZWQoUkNDX0NGR1IyX0FEQ1BSRTM0KQorLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfQURDMTJfQ0xLU09VUkNFIFBlcmlwaGVyYWwgQURDMTIgY2xvY2sgc291cmNlIHNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19BREMxMl9DTEtTUkNfSENMSyAgICAgICAgICh1aW50MzJfdCkoKFJDQ19DRkdSMl9BRENQUkUxMiA8PCAxNlUpIHwgUkNDX0NGR1IyX0FEQ1BSRTEyX05PKSAgICAgLyohPCBBREMxMiBjbG9jayBkaXNhYmxlZCwgQURDMTIgY2FuIHVzZSBBSEIgY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX0FEQzEyX0NMS1NSQ19QTExfRElWXzEgICAgKHVpbnQzMl90KSgoUkNDX0NGR1IyX0FEQ1BSRTEyIDw8IDE2VSkgfCBSQ0NfQ0ZHUjJfQURDUFJFMTJfRElWMSkgICAvKiE8IEFEQzEyIFBMTCBjbG9jayBkaXZpZGVkIGJ5IDEgKi8KKyNkZWZpbmUgTExfUkNDX0FEQzEyX0NMS1NSQ19QTExfRElWXzIgICAgKHVpbnQzMl90KSgoUkNDX0NGR1IyX0FEQ1BSRTEyIDw8IDE2VSkgfCBSQ0NfQ0ZHUjJfQURDUFJFMTJfRElWMikgICAvKiE8IEFEQzEyIFBMTCBjbG9jayBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgTExfUkNDX0FEQzEyX0NMS1NSQ19QTExfRElWXzQgICAgKHVpbnQzMl90KSgoUkNDX0NGR1IyX0FEQ1BSRTEyIDw8IDE2VSkgfCBSQ0NfQ0ZHUjJfQURDUFJFMTJfRElWNCkgICAvKiE8IEFEQzEyIFBMTCBjbG9jayBkaXZpZGVkIGJ5IDQgKi8KKyNkZWZpbmUgTExfUkNDX0FEQzEyX0NMS1NSQ19QTExfRElWXzYgICAgKHVpbnQzMl90KSgoUkNDX0NGR1IyX0FEQ1BSRTEyIDw8IDE2VSkgfCBSQ0NfQ0ZHUjJfQURDUFJFMTJfRElWNikgICAvKiE8IEFEQzEyIFBMTCBjbG9jayBkaXZpZGVkIGJ5IDYgKi8KKyNkZWZpbmUgTExfUkNDX0FEQzEyX0NMS1NSQ19QTExfRElWXzggICAgKHVpbnQzMl90KSgoUkNDX0NGR1IyX0FEQ1BSRTEyIDw8IDE2VSkgfCBSQ0NfQ0ZHUjJfQURDUFJFMTJfRElWOCkgICAvKiE8IEFEQzEyIFBMTCBjbG9jayBkaXZpZGVkIGJ5IDggKi8KKyNkZWZpbmUgTExfUkNDX0FEQzEyX0NMS1NSQ19QTExfRElWXzEwICAgKHVpbnQzMl90KSgoUkNDX0NGR1IyX0FEQ1BSRTEyIDw8IDE2VSkgfCBSQ0NfQ0ZHUjJfQURDUFJFMTJfRElWMTApICAvKiE8IEFEQzEyIFBMTCBjbG9jayBkaXZpZGVkIGJ5IDEwICovCisjZGVmaW5lIExMX1JDQ19BREMxMl9DTEtTUkNfUExMX0RJVl8xMiAgICh1aW50MzJfdCkoKFJDQ19DRkdSMl9BRENQUkUxMiA8PCAxNlUpIHwgUkNDX0NGR1IyX0FEQ1BSRTEyX0RJVjEyKSAgLyohPCBBREMxMiBQTEwgY2xvY2sgZGl2aWRlZCBieSAxMiAqLworI2RlZmluZSBMTF9SQ0NfQURDMTJfQ0xLU1JDX1BMTF9ESVZfMTYgICAodWludDMyX3QpKChSQ0NfQ0ZHUjJfQURDUFJFMTIgPDwgMTZVKSB8IFJDQ19DRkdSMl9BRENQUkUxMl9ESVYxNikgIC8qITwgQURDMTIgUExMIGNsb2NrIGRpdmlkZWQgYnkgMTYgKi8KKyNkZWZpbmUgTExfUkNDX0FEQzEyX0NMS1NSQ19QTExfRElWXzMyICAgKHVpbnQzMl90KSgoUkNDX0NGR1IyX0FEQ1BSRTEyIDw8IDE2VSkgfCBSQ0NfQ0ZHUjJfQURDUFJFMTJfRElWMzIpICAvKiE8IEFEQzEyIFBMTCBjbG9jayBkaXZpZGVkIGJ5IDMyICovCisjZGVmaW5lIExMX1JDQ19BREMxMl9DTEtTUkNfUExMX0RJVl82NCAgICh1aW50MzJfdCkoKFJDQ19DRkdSMl9BRENQUkUxMiA8PCAxNlUpIHwgUkNDX0NGR1IyX0FEQ1BSRTEyX0RJVjY0KSAgLyohPCBBREMxMiBQTEwgY2xvY2sgZGl2aWRlZCBieSA2NCAqLworI2RlZmluZSBMTF9SQ0NfQURDMTJfQ0xLU1JDX1BMTF9ESVZfMTI4ICAodWludDMyX3QpKChSQ0NfQ0ZHUjJfQURDUFJFMTIgPDwgMTZVKSB8IFJDQ19DRkdSMl9BRENQUkUxMl9ESVYxMjgpIC8qITwgQURDMTIgUExMIGNsb2NrIGRpdmlkZWQgYnkgMTI4ICovCisjZGVmaW5lIExMX1JDQ19BREMxMl9DTEtTUkNfUExMX0RJVl8yNTYgICh1aW50MzJfdCkoKFJDQ19DRkdSMl9BRENQUkUxMiA8PCAxNlUpIHwgUkNDX0NGR1IyX0FEQ1BSRTEyX0RJVjI1NikgLyohPCBBREMxMiBQTEwgY2xvY2sgZGl2aWRlZCBieSAyNTYgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0FEQzM0X0NMS1NPVVJDRSBQZXJpcGhlcmFsIEFEQzM0IGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfQURDMzRfQ0xLU1JDX0hDTEsgICAgICAgICAodWludDMyX3QpKChSQ0NfQ0ZHUjJfQURDUFJFMzQgPDwgMTZVKSB8IFJDQ19DRkdSMl9BRENQUkUzNF9OTykgICAgIC8qITwgQURDMzQgY2xvY2sgZGlzYWJsZWQsIEFEQzM0IGNhbiB1c2UgQUhCIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19BREMzNF9DTEtTUkNfUExMX0RJVl8xICAgICh1aW50MzJfdCkoKFJDQ19DRkdSMl9BRENQUkUzNCA8PCAxNlUpIHwgUkNDX0NGR1IyX0FEQ1BSRTM0X0RJVjEpICAgLyohPCBBREMzNCBQTEwgY2xvY2sgZGl2aWRlZCBieSAxICovCisjZGVmaW5lIExMX1JDQ19BREMzNF9DTEtTUkNfUExMX0RJVl8yICAgICh1aW50MzJfdCkoKFJDQ19DRkdSMl9BRENQUkUzNCA8PCAxNlUpIHwgUkNDX0NGR1IyX0FEQ1BSRTM0X0RJVjIpICAgLyohPCBBREMzNCBQTEwgY2xvY2sgZGl2aWRlZCBieSAyICovCisjZGVmaW5lIExMX1JDQ19BREMzNF9DTEtTUkNfUExMX0RJVl80ICAgICh1aW50MzJfdCkoKFJDQ19DRkdSMl9BRENQUkUzNCA8PCAxNlUpIHwgUkNDX0NGR1IyX0FEQ1BSRTM0X0RJVjQpICAgLyohPCBBREMzNCBQTEwgY2xvY2sgZGl2aWRlZCBieSA0ICovCisjZGVmaW5lIExMX1JDQ19BREMzNF9DTEtTUkNfUExMX0RJVl82ICAgICh1aW50MzJfdCkoKFJDQ19DRkdSMl9BRENQUkUzNCA8PCAxNlUpIHwgUkNDX0NGR1IyX0FEQ1BSRTM0X0RJVjYpICAgLyohPCBBREMzNCBQTEwgY2xvY2sgZGl2aWRlZCBieSA2ICovCisjZGVmaW5lIExMX1JDQ19BREMzNF9DTEtTUkNfUExMX0RJVl84ICAgICh1aW50MzJfdCkoKFJDQ19DRkdSMl9BRENQUkUzNCA8PCAxNlUpIHwgUkNDX0NGR1IyX0FEQ1BSRTM0X0RJVjgpICAgLyohPCBBREMzNCBQTEwgY2xvY2sgZGl2aWRlZCBieSA4ICovCisjZGVmaW5lIExMX1JDQ19BREMzNF9DTEtTUkNfUExMX0RJVl8xMCAgICh1aW50MzJfdCkoKFJDQ19DRkdSMl9BRENQUkUzNCA8PCAxNlUpIHwgUkNDX0NGR1IyX0FEQ1BSRTM0X0RJVjEwKSAgLyohPCBBREMzNCBQTEwgY2xvY2sgZGl2aWRlZCBieSAxMCAqLworI2RlZmluZSBMTF9SQ0NfQURDMzRfQ0xLU1JDX1BMTF9ESVZfMTIgICAodWludDMyX3QpKChSQ0NfQ0ZHUjJfQURDUFJFMzQgPDwgMTZVKSB8IFJDQ19DRkdSMl9BRENQUkUzNF9ESVYxMikgIC8qITwgQURDMzQgUExMIGNsb2NrIGRpdmlkZWQgYnkgMTIgKi8KKyNkZWZpbmUgTExfUkNDX0FEQzM0X0NMS1NSQ19QTExfRElWXzE2ICAgKHVpbnQzMl90KSgoUkNDX0NGR1IyX0FEQ1BSRTM0IDw8IDE2VSkgfCBSQ0NfQ0ZHUjJfQURDUFJFMzRfRElWMTYpICAvKiE8IEFEQzM0IFBMTCBjbG9jayBkaXZpZGVkIGJ5IDE2ICovCisjZGVmaW5lIExMX1JDQ19BREMzNF9DTEtTUkNfUExMX0RJVl8zMiAgICh1aW50MzJfdCkoKFJDQ19DRkdSMl9BRENQUkUzNCA8PCAxNlUpIHwgUkNDX0NGR1IyX0FEQ1BSRTM0X0RJVjMyKSAgLyohPCBBREMzNCBQTEwgY2xvY2sgZGl2aWRlZCBieSAzMiAqLworI2RlZmluZSBMTF9SQ0NfQURDMzRfQ0xLU1JDX1BMTF9ESVZfNjQgICAodWludDMyX3QpKChSQ0NfQ0ZHUjJfQURDUFJFMzQgPDwgMTZVKSB8IFJDQ19DRkdSMl9BRENQUkUzNF9ESVY2NCkgIC8qITwgQURDMzQgUExMIGNsb2NrIGRpdmlkZWQgYnkgNjQgKi8KKyNkZWZpbmUgTExfUkNDX0FEQzM0X0NMS1NSQ19QTExfRElWXzEyOCAgKHVpbnQzMl90KSgoUkNDX0NGR1IyX0FEQ1BSRTM0IDw8IDE2VSkgfCBSQ0NfQ0ZHUjJfQURDUFJFMzRfRElWMTI4KSAvKiE8IEFEQzM0IFBMTCBjbG9jayBkaXZpZGVkIGJ5IDEyOCAqLworI2RlZmluZSBMTF9SQ0NfQURDMzRfQ0xLU1JDX1BMTF9ESVZfMjU2ICAodWludDMyX3QpKChSQ0NfQ0ZHUjJfQURDUFJFMzQgPDwgMTZVKSB8IFJDQ19DRkdSMl9BRENQUkUzNF9ESVYyNTYpIC8qITwgQURDMzQgUExMIGNsb2NrIGRpdmlkZWQgYnkgMjU2ICovCisvKioKKyAgKiBAfQorICAqLworCisjZWxzZQorLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfQURDMTJfQ0xLU09VUkNFIFBlcmlwaGVyYWwgQURDIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfQURDMTJfQ0xLU1JDX0hDTEsgICAgICAgICBSQ0NfQ0ZHUjJfQURDUFJFMTJfTk8gICAgIC8qITwgQURDMTIgY2xvY2sgZGlzYWJsZWQsIEFEQzEyIGNhbiB1c2UgQUhCIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19BREMxMl9DTEtTUkNfUExMX0RJVl8xICAgIFJDQ19DRkdSMl9BRENQUkUxMl9ESVYxICAgLyohPCBBREMxMiBQTEwgY2xvY2sgZGl2aWRlZCBieSAxICovCisjZGVmaW5lIExMX1JDQ19BREMxMl9DTEtTUkNfUExMX0RJVl8yICAgIFJDQ19DRkdSMl9BRENQUkUxMl9ESVYyICAgLyohPCBBREMxMiBQTEwgY2xvY2sgZGl2aWRlZCBieSAyICovCisjZGVmaW5lIExMX1JDQ19BREMxMl9DTEtTUkNfUExMX0RJVl80ICAgIFJDQ19DRkdSMl9BRENQUkUxMl9ESVY0ICAgLyohPCBBREMxMiBQTEwgY2xvY2sgZGl2aWRlZCBieSA0ICovCisjZGVmaW5lIExMX1JDQ19BREMxMl9DTEtTUkNfUExMX0RJVl82ICAgIFJDQ19DRkdSMl9BRENQUkUxMl9ESVY2ICAgLyohPCBBREMxMiBQTEwgY2xvY2sgZGl2aWRlZCBieSA2ICovCisjZGVmaW5lIExMX1JDQ19BREMxMl9DTEtTUkNfUExMX0RJVl84ICAgIFJDQ19DRkdSMl9BRENQUkUxMl9ESVY4ICAgLyohPCBBREMxMiBQTEwgY2xvY2sgZGl2aWRlZCBieSA4ICovCisjZGVmaW5lIExMX1JDQ19BREMxMl9DTEtTUkNfUExMX0RJVl8xMCAgIFJDQ19DRkdSMl9BRENQUkUxMl9ESVYxMCAgLyohPCBBREMxMiBQTEwgY2xvY2sgZGl2aWRlZCBieSAxMCAqLworI2RlZmluZSBMTF9SQ0NfQURDMTJfQ0xLU1JDX1BMTF9ESVZfMTIgICBSQ0NfQ0ZHUjJfQURDUFJFMTJfRElWMTIgIC8qITwgQURDMTIgUExMIGNsb2NrIGRpdmlkZWQgYnkgMTIgKi8KKyNkZWZpbmUgTExfUkNDX0FEQzEyX0NMS1NSQ19QTExfRElWXzE2ICAgUkNDX0NGR1IyX0FEQ1BSRTEyX0RJVjE2ICAvKiE8IEFEQzEyIFBMTCBjbG9jayBkaXZpZGVkIGJ5IDE2ICovCisjZGVmaW5lIExMX1JDQ19BREMxMl9DTEtTUkNfUExMX0RJVl8zMiAgIFJDQ19DRkdSMl9BRENQUkUxMl9ESVYzMiAgLyohPCBBREMxMiBQTEwgY2xvY2sgZGl2aWRlZCBieSAzMiAqLworI2RlZmluZSBMTF9SQ0NfQURDMTJfQ0xLU1JDX1BMTF9ESVZfNjQgICBSQ0NfQ0ZHUjJfQURDUFJFMTJfRElWNjQgIC8qITwgQURDMTIgUExMIGNsb2NrIGRpdmlkZWQgYnkgNjQgKi8KKyNkZWZpbmUgTExfUkNDX0FEQzEyX0NMS1NSQ19QTExfRElWXzEyOCAgUkNDX0NGR1IyX0FEQ1BSRTEyX0RJVjEyOCAvKiE8IEFEQzEyIFBMTCBjbG9jayBkaXZpZGVkIGJ5IDEyOCAqLworI2RlZmluZSBMTF9SQ0NfQURDMTJfQ0xLU1JDX1BMTF9ESVZfMjU2ICBSQ0NfQ0ZHUjJfQURDUFJFMTJfRElWMjU2IC8qITwgQURDMTIgUExMIGNsb2NrIGRpdmlkZWQgYnkgMjU2ICovCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogUkNDX0NGR1IyX0FEQ1BSRTEyICYmIFJDQ19DRkdSMl9BRENQUkUzNCAqLworCisjZW5kaWYgLyogUkNDX0NGR1JfQURDUFJFICovCisKKyNpZiBkZWZpbmVkKFJDQ19DRkdSX1NEUFJFKQorLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfU0RBRENfQ0xLU09VUkNFX1NZU0NMSyBQZXJpcGhlcmFsIFNEQURDIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfMSAgICBSQ0NfQ0ZHUl9TRFBSRV9ESVYxICAgLyohPCBTREFEQyBDTEsgbm90IGRpdmlkZWQgKi8KKyNkZWZpbmUgTExfUkNDX1NEQURDX0NMS1NSQ19TWVNfRElWXzIgICAgUkNDX0NGR1JfU0RQUkVfRElWMiAgIC8qITwgU0RBREMgQ0xLIGRpdmlkZWQgYnkgMiAqLworI2RlZmluZSBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfNCAgICBSQ0NfQ0ZHUl9TRFBSRV9ESVY0ICAgLyohPCBTREFEQyBDTEsgZGl2aWRlZCBieSA0ICovCisjZGVmaW5lIExMX1JDQ19TREFEQ19DTEtTUkNfU1lTX0RJVl82ICAgIFJDQ19DRkdSX1NEUFJFX0RJVjYgICAvKiE8IFNEQURDIENMSyBkaXZpZGVkIGJ5IDYgKi8KKyNkZWZpbmUgTExfUkNDX1NEQURDX0NMS1NSQ19TWVNfRElWXzggICAgUkNDX0NGR1JfU0RQUkVfRElWOCAgIC8qITwgU0RBREMgQ0xLIGRpdmlkZWQgYnkgOCAqLworI2RlZmluZSBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfMTAgICBSQ0NfQ0ZHUl9TRFBSRV9ESVYxMCAgLyohPCBTREFEQyBDTEsgZGl2aWRlZCBieSAxMCAqLworI2RlZmluZSBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfMTIgICBSQ0NfQ0ZHUl9TRFBSRV9ESVYxMiAgLyohPCBTREFEQyBDTEsgZGl2aWRlZCBieSAxMiAqLworI2RlZmluZSBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfMTQgICBSQ0NfQ0ZHUl9TRFBSRV9ESVYxNCAgLyohPCBTREFEQyBDTEsgZGl2aWRlZCBieSAxNCAqLworI2RlZmluZSBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfMTYgICBSQ0NfQ0ZHUl9TRFBSRV9ESVYxNiAgLyohPCBTREFEQyBDTEsgZGl2aWRlZCBieSAxNiAqLworI2RlZmluZSBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfMjAgICBSQ0NfQ0ZHUl9TRFBSRV9ESVYyMCAgLyohPCBTREFEQyBDTEsgZGl2aWRlZCBieSAyMCAqLworI2RlZmluZSBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfMjQgICBSQ0NfQ0ZHUl9TRFBSRV9ESVYyNCAgLyohPCBTREFEQyBDTEsgZGl2aWRlZCBieSAyNCAqLworI2RlZmluZSBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfMjggICBSQ0NfQ0ZHUl9TRFBSRV9ESVYyOCAgLyohPCBTREFEQyBDTEsgZGl2aWRlZCBieSAyOCAqLworI2RlZmluZSBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfMzIgICBSQ0NfQ0ZHUl9TRFBSRV9ESVYzMiAgLyohPCBTREFEQyBDTEsgZGl2aWRlZCBieSAzMiAqLworI2RlZmluZSBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfMzYgICBSQ0NfQ0ZHUl9TRFBSRV9ESVYzNiAgLyohPCBTREFEQyBDTEsgZGl2aWRlZCBieSAzNiAqLworI2RlZmluZSBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfNDAgICBSQ0NfQ0ZHUl9TRFBSRV9ESVY0MCAgLyohPCBTREFEQyBDTEsgZGl2aWRlZCBieSA0MCAqLworI2RlZmluZSBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfNDQgICBSQ0NfQ0ZHUl9TRFBSRV9ESVY0NCAgLyohPCBTREFEQyBDTEsgZGl2aWRlZCBieSA0NCAqLworI2RlZmluZSBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfNDggICBSQ0NfQ0ZHUl9TRFBSRV9ESVY0OCAgLyohPCBTREFEQyBDTEsgZGl2aWRlZCBieSA0OCAqLworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFJDQ19DRkdSX1NEUFJFICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1VTQVJUIFBlcmlwaGVyYWwgVVNBUlQgZ2V0IGNsb2NrIHNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFICAgICAgICAgIFJDQ19QT1NJVElPTl9VU0FSVDFTVyAvKiE8IFVTQVJUMSBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfVVNBUlQyU1cpCisjZGVmaW5lIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFICAgICAgICAgIFJDQ19QT1NJVElPTl9VU0FSVDJTVyAvKiE8IFVTQVJUMiBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovCisjZW5kaWYgLyogUkNDX0NGR1IzX1VTQVJUMlNXICovCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfVVNBUlQzU1cpCisjZGVmaW5lIExMX1JDQ19VU0FSVDNfQ0xLU09VUkNFICAgICAgICAgIFJDQ19QT1NJVElPTl9VU0FSVDNTVyAvKiE8IFVTQVJUMyBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovCisjZW5kaWYgLyogUkNDX0NGR1IzX1VTQVJUM1NXICovCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfVUFSVDRTVykgfHwgZGVmaW5lZChSQ0NfQ0ZHUjNfVUFSVDVTVykKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1VBUlQgUGVyaXBoZXJhbCBVQVJUIGdldCBjbG9jayBzb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfVUFSVDRfQ0xLU09VUkNFICAgICAgICAgICBSQ0NfQ0ZHUjNfVUFSVDRTVyAvKiE8IFVBUlQ0IENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgTExfUkNDX1VBUlQ1X0NMS1NPVVJDRSAgICAgICAgICAgUkNDX0NGR1IzX1VBUlQ1U1cgLyohPCBVQVJUNSBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogUkNDX0NGR1IzX1VBUlQ0U1cgfHwgUkNDX0NGR1IzX1VBUlQ1U1cgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfSTJDIFBlcmlwaGVyYWwgSTJDIGdldCBjbG9jayBzb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0UgICAgICAgICAgICBSQ0NfQ0ZHUjNfSTJDMVNXIC8qITwgSTJDMSBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfSTJDMlNXKQorI2RlZmluZSBMTF9SQ0NfSTJDMl9DTEtTT1VSQ0UgICAgICAgICAgICBSQ0NfQ0ZHUjNfSTJDMlNXIC8qITwgSTJDMiBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovCisjZW5kaWYgLypSQ0NfQ0ZHUjNfSTJDMlNXKi8KKyNpZiBkZWZpbmVkKFJDQ19DRkdSM19JMkMzU1cpCisjZGVmaW5lIExMX1JDQ19JMkMzX0NMS1NPVVJDRSAgICAgICAgICAgIFJDQ19DRkdSM19JMkMzU1cgLyohPCBJMkMzIENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8KKyNlbmRpZiAvKlJDQ19DRkdSM19JMkMzU1cqLworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoUkNDX0NGR1JfSTJTU1JDKQorLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfSTJTIFBlcmlwaGVyYWwgSTJTIGdldCBjbG9jayBzb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfSTJTX0NMS1NPVVJDRSAgICAgICAgICAgICBSQ0NfQ0ZHUl9JMlNTUkMgICAgICAgLyohPCBJMlMgQ2xvY2sgc291cmNlIHNlbGVjdGlvbiAqLworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFJDQ19DRkdSX0kyU1NSQyAqLworCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfVElNU1cpCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19USU0gVElNeCBQZXJpcGhlcmFsIFRJTSBnZXQgY2xvY2sgc291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX1RJTTFfQ0xLU09VUkNFICAgICAgICAgICAgKFJDQ19QT1NJVElPTl9USU0xU1cgLSBSQ0NfUE9TSVRJT05fVElNMVNXKSAgLyohPCBUSU0xIENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8KKyNpZiBkZWZpbmVkKFJDQ19DRkdSM19USU0yU1cpCisjZGVmaW5lIExMX1JDQ19USU0yX0NMS1NPVVJDRSAgICAgICAgICAgIChSQ0NfUE9TSVRJT05fVElNMlNXIC0gUkNDX1BPU0lUSU9OX1RJTTFTVykgIC8qITwgVElNMiBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovCisjZW5kaWYgLypSQ0NfQ0ZHUjNfVElNMlNXKi8KKyNpZiBkZWZpbmVkKFJDQ19DRkdSM19USU04U1cpCisjZGVmaW5lIExMX1JDQ19USU04X0NMS1NPVVJDRSAgICAgICAgICAgIChSQ0NfUE9TSVRJT05fVElNOFNXIC0gUkNDX1BPU0lUSU9OX1RJTTFTVykgIC8qITwgVElNOCBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovCisjZW5kaWYgLypSQ0NfQ0ZHUjNfVElNOFNXKi8KKyNpZiBkZWZpbmVkKFJDQ19DRkdSM19USU0xNVNXKQorI2RlZmluZSBMTF9SQ0NfVElNMTVfQ0xLU09VUkNFICAgICAgICAgICAoUkNDX1BPU0lUSU9OX1RJTTE1U1cgLSBSQ0NfUE9TSVRJT05fVElNMVNXKSAvKiE8IFRJTTE1IENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8KKyNlbmRpZiAvKlJDQ19DRkdSM19USU0xNVNXKi8KKyNpZiBkZWZpbmVkKFJDQ19DRkdSM19USU0xNlNXKQorI2RlZmluZSBMTF9SQ0NfVElNMTZfQ0xLU09VUkNFICAgICAgICAgICAoUkNDX1BPU0lUSU9OX1RJTTE2U1cgLSBSQ0NfUE9TSVRJT05fVElNMVNXKSAvKiE8IFRJTTE2IENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8KKyNlbmRpZiAvKlJDQ19DRkdSM19USU0xNlNXKi8KKyNpZiBkZWZpbmVkKFJDQ19DRkdSM19USU0xN1NXKQorI2RlZmluZSBMTF9SQ0NfVElNMTdfQ0xLU09VUkNFICAgICAgICAgICAoUkNDX1BPU0lUSU9OX1RJTTE3U1cgLSBSQ0NfUE9TSVRJT05fVElNMVNXKSAvKiE8IFRJTTE3IENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8KKyNlbmRpZiAvKlJDQ19DRkdSM19USU0xN1NXKi8KKyNpZiBkZWZpbmVkKFJDQ19DRkdSM19USU0yMFNXKQorI2RlZmluZSBMTF9SQ0NfVElNMjBfQ0xLU09VUkNFICAgICAgICAgICAoUkNDX1BPU0lUSU9OX1RJTTIwU1cgLSBSQ0NfUE9TSVRJT05fVElNMVNXKSAvKiE8IFRJTTIwIENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8KKyNlbmRpZiAvKlJDQ19DRkdSM19USU0yMFNXKi8KKyNpZiBkZWZpbmVkKFJDQ19DRkdSM19USU0zNFNXKQorI2RlZmluZSBMTF9SQ0NfVElNMzRfQ0xLU09VUkNFICAgICAgICAgICAoUkNDX1BPU0lUSU9OX1RJTTM0U1cgLSBSQ0NfUE9TSVRJT05fVElNMVNXKSAvKiE8IFRJTTMvNCBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovCisjZW5kaWYgLypSQ0NfQ0ZHUjNfVElNMzRTVyovCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogUkNDX0NGR1IzX1RJTVNXICovCisKKyNpZiBkZWZpbmVkKEhSVElNMSkKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0hSVElNMSBQZXJpcGhlcmFsIEhSVElNMSBnZXQgY2xvY2sgc291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX0hSVElNMV9DTEtTT1VSQ0UgICAgICAgICAgUkNDX0NGR1IzX0hSVElNMVNXIC8qITwgSFJUSU0xIENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8KKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIUlRJTTEgKi8KKworI2lmIGRlZmluZWQoQ0VDKQorLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfQ0VDIFBlcmlwaGVyYWwgQ0VDIGdldCBjbG9jayBzb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfQ0VDX0NMS1NPVVJDRSAgICAgICAgICAgICBSQ0NfQ0ZHUjNfQ0VDU1cgLyohPCBDRUMgQ2xvY2sgc291cmNlIHNlbGVjdGlvbiAqLworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIENFQyAqLworCisjaWYgZGVmaW5lZChVU0IpCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19VU0IgUGVyaXBoZXJhbCBVU0IgZ2V0IGNsb2NrIHNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19VU0JfQ0xLU09VUkNFICAgICAgICAgICAgIFJDQ19DRkdSX1VTQlBSRSAvKiE8IFVTQiBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogVVNCICovCisKKyNpZiBkZWZpbmVkKFJDQ19DRkdSX0FEQ1BSRSkKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0FEQyBQZXJpcGhlcmFsIEFEQyBnZXQgY2xvY2sgc291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX0FEQ19DTEtTT1VSQ0UgICAgICAgICAgICAgUkNDX0NGR1JfQURDUFJFIC8qITwgQURDIENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8KKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBSQ0NfQ0ZHUl9BRENQUkUgKi8KKworI2lmIGRlZmluZWQoUkNDX0NGR1IyX0FEQzFQUkVTKSB8fCBkZWZpbmVkKFJDQ19DRkdSMl9BRENQUkUxMikgfHwgZGVmaW5lZChSQ0NfQ0ZHUjJfQURDUFJFMzQpCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19BRENYWCBQZXJpcGhlcmFsIEFEQyBnZXQgY2xvY2sgc291cmNlCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFJDQ19DRkdSMl9BREMxUFJFUykKKyNkZWZpbmUgTExfUkNDX0FEQzFfQ0xLU09VUkNFICAgICAgICAgICAgUkNDX0NGR1IyX0FEQzFQUkVTIC8qITwgQURDMSBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovCisjZWxzZQorI2RlZmluZSBMTF9SQ0NfQURDMTJfQ0xLU09VUkNFICAgICAgICAgICBSQ0NfQ0ZHUjJfQURDUFJFMTIgLyohPCBBREMxMiBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjJfQURDUFJFMzQpCisjZGVmaW5lIExMX1JDQ19BREMzNF9DTEtTT1VSQ0UgICAgICAgICAgIFJDQ19DRkdSMl9BRENQUkUzNCAvKiE8IEFEQzM0IENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8KKyNlbmRpZiAvKlJDQ19DRkdSMl9BRENQUkUzNCovCisjZW5kaWYgLypSQ0NfQ0ZHUjJfQURDMVBSRVMqLworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFJDQ19DRkdSMl9BREMxUFJFUyB8fCBSQ0NfQ0ZHUjJfQURDUFJFMTIgfHwgUkNDX0NGR1IyX0FEQ1BSRTM0ICovCisKKyNpZiBkZWZpbmVkKFJDQ19DRkdSX1NEUFJFKQorLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfU0RBREMgUGVyaXBoZXJhbCBTREFEQyBnZXQgY2xvY2sgc291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX1NEQURDX0NMS1NPVVJDRSAgICAgICAgICAgUkNDX0NGR1JfU0RQUkUgIC8qITwgU0RBREMgQ2xvY2sgc291cmNlIHNlbGVjdGlvbiAqLworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFJDQ19DRkdSX1NEUFJFICovCisKKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfUlRDX0NMS1NPVVJDRSAgUlRDIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfUlRDX0NMS1NPVVJDRV9OT05FICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgIC8qITwgTm8gY2xvY2sgdXNlZCBhcyBSVEMgY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX1JUQ19DTEtTT1VSQ0VfTFNFICAgICAgICAgICBSQ0NfQkRDUl9SVENTRUxfMCAgICAgICAvKiE8IExTRSBvc2NpbGxhdG9yIGNsb2NrIHVzZWQgYXMgUlRDIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19SVENfQ0xLU09VUkNFX0xTSSAgICAgICAgICAgUkNDX0JEQ1JfUlRDU0VMXzEgICAgICAgLyohPCBMU0kgb3NjaWxsYXRvciBjbG9jayB1c2VkIGFzIFJUQyBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfUlRDX0NMS1NPVVJDRV9IU0VfRElWMzIgICAgIFJDQ19CRENSX1JUQ1NFTCAgICAgICAgIC8qITwgSFNFIG9zY2lsbGF0b3IgY2xvY2sgZGl2aWRlZCBieSAzMiB1c2VkIGFzIFJUQyBjbG9jayAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfUExMX01VTCBQTEwgTXVsdGlwbGljYXRvciBmYWN0b3IKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfUExMX01VTF8yICAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BMTE1VTDIgIC8qITwgUExMIGlucHV0IGNsb2NrKjIgKi8KKyNkZWZpbmUgTExfUkNDX1BMTF9NVUxfMyAgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9QTExNVUwzICAvKiE8IFBMTCBpbnB1dCBjbG9jayozICovCisjZGVmaW5lIExMX1JDQ19QTExfTVVMXzQgICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUExMTVVMNCAgLyohPCBQTEwgaW5wdXQgY2xvY2sqNCAqLworI2RlZmluZSBMTF9SQ0NfUExMX01VTF81ICAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BMTE1VTDUgIC8qITwgUExMIGlucHV0IGNsb2NrKjUgKi8KKyNkZWZpbmUgTExfUkNDX1BMTF9NVUxfNiAgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9QTExNVUw2ICAvKiE8IFBMTCBpbnB1dCBjbG9jayo2ICovCisjZGVmaW5lIExMX1JDQ19QTExfTVVMXzcgICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUExMTVVMNyAgLyohPCBQTEwgaW5wdXQgY2xvY2sqNyAqLworI2RlZmluZSBMTF9SQ0NfUExMX01VTF84ICAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BMTE1VTDggIC8qITwgUExMIGlucHV0IGNsb2NrKjggKi8KKyNkZWZpbmUgTExfUkNDX1BMTF9NVUxfOSAgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9QTExNVUw5ICAvKiE8IFBMTCBpbnB1dCBjbG9jayo5ICovCisjZGVmaW5lIExMX1JDQ19QTExfTVVMXzEwICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUExMTVVMMTAgIC8qITwgUExMIGlucHV0IGNsb2NrKjEwICovCisjZGVmaW5lIExMX1JDQ19QTExfTVVMXzExICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUExMTVVMMTEgIC8qITwgUExMIGlucHV0IGNsb2NrKjExICovCisjZGVmaW5lIExMX1JDQ19QTExfTVVMXzEyICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUExMTVVMMTIgIC8qITwgUExMIGlucHV0IGNsb2NrKjEyICovCisjZGVmaW5lIExMX1JDQ19QTExfTVVMXzEzICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUExMTVVMMTMgIC8qITwgUExMIGlucHV0IGNsb2NrKjEzICovCisjZGVmaW5lIExMX1JDQ19QTExfTVVMXzE0ICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUExMTVVMMTQgIC8qITwgUExMIGlucHV0IGNsb2NrKjE0ICovCisjZGVmaW5lIExMX1JDQ19QTExfTVVMXzE1ICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUExMTVVMMTUgIC8qITwgUExMIGlucHV0IGNsb2NrKjE1ICovCisjZGVmaW5lIExMX1JDQ19QTExfTVVMXzE2ICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUExMTVVMMTYgIC8qITwgUExMIGlucHV0IGNsb2NrKjE2ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19QTExTT1VSQ0UgUExMIFNPVVJDRQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19QTExTT1VSQ0VfSFNFICAgICAgICAgICAgICAgUkNDX0NGR1JfUExMU1JDX0hTRV9QUkVESVYgICAgICAgICAgICAgICAgICAgIC8qITwgSFNFL1BSRURJViBjbG9jayBzZWxlY3RlZCBhcyBQTEwgZW50cnkgY2xvY2sgc291cmNlICovCisjaWYgZGVmaW5lZChSQ0NfUExMU1JDX1BSRURJVjFfU1VQUE9SVCkKKyNkZWZpbmUgTExfUkNDX1BMTFNPVVJDRV9IU0kgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9QTExTUkNfSFNJX1BSRURJViAgICAgICAgICAgICAgICAgICAgLyohPCBIU0kvUFJFRElWIGNsb2NrIHNlbGVjdGVkIGFzIFBMTCBlbnRyeSBjbG9jayBzb3VyY2UgKi8KKyNlbHNlCisjZGVmaW5lIExMX1JDQ19QTExTT1VSQ0VfSFNJX0RJVl8yICAgICAgICAgUkNDX0NGR1JfUExMU1JDX0hTSV9ESVYyICAgICAgICAgICAgICAgICAgICAgIC8qITwgSFNJIGNsb2NrIGRpdmlkZWQgYnkgMiBzZWxlY3RlZCBhcyBQTEwgZW50cnkgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19QTExTT1VSQ0VfSFNFX0RJVl8xICAgICAgICAgKFJDQ19DRkdSX1BMTFNSQ19IU0VfUFJFRElWIHwgUkNDX0NGR1IyX1BSRURJVl9ESVYxKSAgICAvKiE8IEhTRSBjbG9jayBzZWxlY3RlZCBhcyBQTEwgZW50cnkgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19QTExTT1VSQ0VfSFNFX0RJVl8yICAgICAgICAgKFJDQ19DRkdSX1BMTFNSQ19IU0VfUFJFRElWIHwgUkNDX0NGR1IyX1BSRURJVl9ESVYyKSAgICAvKiE8IEhTRS8yIGNsb2NrIHNlbGVjdGVkIGFzIFBMTCBlbnRyeSBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFNPVVJDRV9IU0VfRElWXzMgICAgICAgICAoUkNDX0NGR1JfUExMU1JDX0hTRV9QUkVESVYgfCBSQ0NfQ0ZHUjJfUFJFRElWX0RJVjMpICAgIC8qITwgSFNFLzMgY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGVudHJ5IGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfUExMU09VUkNFX0hTRV9ESVZfNCAgICAgICAgIChSQ0NfQ0ZHUl9QTExTUkNfSFNFX1BSRURJViB8IFJDQ19DRkdSMl9QUkVESVZfRElWNCkgICAgLyohPCBIU0UvNCBjbG9jayBzZWxlY3RlZCBhcyBQTEwgZW50cnkgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19QTExTT1VSQ0VfSFNFX0RJVl81ICAgICAgICAgKFJDQ19DRkdSX1BMTFNSQ19IU0VfUFJFRElWIHwgUkNDX0NGR1IyX1BSRURJVl9ESVY1KSAgICAvKiE8IEhTRS81IGNsb2NrIHNlbGVjdGVkIGFzIFBMTCBlbnRyeSBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFNPVVJDRV9IU0VfRElWXzYgICAgICAgICAoUkNDX0NGR1JfUExMU1JDX0hTRV9QUkVESVYgfCBSQ0NfQ0ZHUjJfUFJFRElWX0RJVjYpICAgIC8qITwgSFNFLzYgY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGVudHJ5IGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfUExMU09VUkNFX0hTRV9ESVZfNyAgICAgICAgIChSQ0NfQ0ZHUl9QTExTUkNfSFNFX1BSRURJViB8IFJDQ19DRkdSMl9QUkVESVZfRElWNykgICAgLyohPCBIU0UvNyBjbG9jayBzZWxlY3RlZCBhcyBQTEwgZW50cnkgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19QTExTT1VSQ0VfSFNFX0RJVl84ICAgICAgICAgKFJDQ19DRkdSX1BMTFNSQ19IU0VfUFJFRElWIHwgUkNDX0NGR1IyX1BSRURJVl9ESVY4KSAgICAvKiE8IEhTRS84IGNsb2NrIHNlbGVjdGVkIGFzIFBMTCBlbnRyeSBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFNPVVJDRV9IU0VfRElWXzkgICAgICAgICAoUkNDX0NGR1JfUExMU1JDX0hTRV9QUkVESVYgfCBSQ0NfQ0ZHUjJfUFJFRElWX0RJVjkpICAgIC8qITwgSFNFLzkgY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGVudHJ5IGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfUExMU09VUkNFX0hTRV9ESVZfMTAgICAgICAgIChSQ0NfQ0ZHUl9QTExTUkNfSFNFX1BSRURJViB8IFJDQ19DRkdSMl9QUkVESVZfRElWMTApICAgLyohPCBIU0UvMTAgY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGVudHJ5IGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfUExMU09VUkNFX0hTRV9ESVZfMTEgICAgICAgIChSQ0NfQ0ZHUl9QTExTUkNfSFNFX1BSRURJViB8IFJDQ19DRkdSMl9QUkVESVZfRElWMTEpICAgLyohPCBIU0UvMTEgY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGVudHJ5IGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfUExMU09VUkNFX0hTRV9ESVZfMTIgICAgICAgIChSQ0NfQ0ZHUl9QTExTUkNfSFNFX1BSRURJViB8IFJDQ19DRkdSMl9QUkVESVZfRElWMTIpICAgLyohPCBIU0UvMTIgY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGVudHJ5IGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfUExMU09VUkNFX0hTRV9ESVZfMTMgICAgICAgIChSQ0NfQ0ZHUl9QTExTUkNfSFNFX1BSRURJViB8IFJDQ19DRkdSMl9QUkVESVZfRElWMTMpICAgLyohPCBIU0UvMTMgY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGVudHJ5IGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfUExMU09VUkNFX0hTRV9ESVZfMTQgICAgICAgIChSQ0NfQ0ZHUl9QTExTUkNfSFNFX1BSRURJViB8IFJDQ19DRkdSMl9QUkVESVZfRElWMTQpICAgLyohPCBIU0UvMTQgY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGVudHJ5IGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfUExMU09VUkNFX0hTRV9ESVZfMTUgICAgICAgIChSQ0NfQ0ZHUl9QTExTUkNfSFNFX1BSRURJViB8IFJDQ19DRkdSMl9QUkVESVZfRElWMTUpICAgLyohPCBIU0UvMTUgY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGVudHJ5IGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfUExMU09VUkNFX0hTRV9ESVZfMTYgICAgICAgIChSQ0NfQ0ZHUl9QTExTUkNfSFNFX1BSRURJViB8IFJDQ19DRkdSMl9QUkVESVZfRElWMTYpICAgLyohPCBIU0UvMTYgY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGVudHJ5IGNsb2NrIHNvdXJjZSAqLworI2VuZGlmIC8qIFJDQ19QTExTUkNfUFJFRElWMV9TVVBQT1JUICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19QUkVESVZfRElWIFBSRURJViBEaXZpc2lvbiBmYWN0b3IKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfUFJFRElWX0RJVl8xICAgICAgICAgICAgICAgIFJDQ19DRkdSMl9QUkVESVZfRElWMSAgIC8qITwgUFJFRElWIGlucHV0IGNsb2NrIG5vdCBkaXZpZGVkICovCisjZGVmaW5lIExMX1JDQ19QUkVESVZfRElWXzIgICAgICAgICAgICAgICAgUkNDX0NGR1IyX1BSRURJVl9ESVYyICAgLyohPCBQUkVESVYgaW5wdXQgY2xvY2sgZGl2aWRlZCBieSAyICovCisjZGVmaW5lIExMX1JDQ19QUkVESVZfRElWXzMgICAgICAgICAgICAgICAgUkNDX0NGR1IyX1BSRURJVl9ESVYzICAgLyohPCBQUkVESVYgaW5wdXQgY2xvY2sgZGl2aWRlZCBieSAzICovCisjZGVmaW5lIExMX1JDQ19QUkVESVZfRElWXzQgICAgICAgICAgICAgICAgUkNDX0NGR1IyX1BSRURJVl9ESVY0ICAgLyohPCBQUkVESVYgaW5wdXQgY2xvY2sgZGl2aWRlZCBieSA0ICovCisjZGVmaW5lIExMX1JDQ19QUkVESVZfRElWXzUgICAgICAgICAgICAgICAgUkNDX0NGR1IyX1BSRURJVl9ESVY1ICAgLyohPCBQUkVESVYgaW5wdXQgY2xvY2sgZGl2aWRlZCBieSA1ICovCisjZGVmaW5lIExMX1JDQ19QUkVESVZfRElWXzYgICAgICAgICAgICAgICAgUkNDX0NGR1IyX1BSRURJVl9ESVY2ICAgLyohPCBQUkVESVYgaW5wdXQgY2xvY2sgZGl2aWRlZCBieSA2ICovCisjZGVmaW5lIExMX1JDQ19QUkVESVZfRElWXzcgICAgICAgICAgICAgICAgUkNDX0NGR1IyX1BSRURJVl9ESVY3ICAgLyohPCBQUkVESVYgaW5wdXQgY2xvY2sgZGl2aWRlZCBieSA3ICovCisjZGVmaW5lIExMX1JDQ19QUkVESVZfRElWXzggICAgICAgICAgICAgICAgUkNDX0NGR1IyX1BSRURJVl9ESVY4ICAgLyohPCBQUkVESVYgaW5wdXQgY2xvY2sgZGl2aWRlZCBieSA4ICovCisjZGVmaW5lIExMX1JDQ19QUkVESVZfRElWXzkgICAgICAgICAgICAgICAgUkNDX0NGR1IyX1BSRURJVl9ESVY5ICAgLyohPCBQUkVESVYgaW5wdXQgY2xvY2sgZGl2aWRlZCBieSA5ICovCisjZGVmaW5lIExMX1JDQ19QUkVESVZfRElWXzEwICAgICAgICAgICAgICAgUkNDX0NGR1IyX1BSRURJVl9ESVYxMCAgLyohPCBQUkVESVYgaW5wdXQgY2xvY2sgZGl2aWRlZCBieSAxMCAqLworI2RlZmluZSBMTF9SQ0NfUFJFRElWX0RJVl8xMSAgICAgICAgICAgICAgIFJDQ19DRkdSMl9QUkVESVZfRElWMTEgIC8qITwgUFJFRElWIGlucHV0IGNsb2NrIGRpdmlkZWQgYnkgMTEgKi8KKyNkZWZpbmUgTExfUkNDX1BSRURJVl9ESVZfMTIgICAgICAgICAgICAgICBSQ0NfQ0ZHUjJfUFJFRElWX0RJVjEyICAvKiE8IFBSRURJViBpbnB1dCBjbG9jayBkaXZpZGVkIGJ5IDEyICovCisjZGVmaW5lIExMX1JDQ19QUkVESVZfRElWXzEzICAgICAgICAgICAgICAgUkNDX0NGR1IyX1BSRURJVl9ESVYxMyAgLyohPCBQUkVESVYgaW5wdXQgY2xvY2sgZGl2aWRlZCBieSAxMyAqLworI2RlZmluZSBMTF9SQ0NfUFJFRElWX0RJVl8xNCAgICAgICAgICAgICAgIFJDQ19DRkdSMl9QUkVESVZfRElWMTQgIC8qITwgUFJFRElWIGlucHV0IGNsb2NrIGRpdmlkZWQgYnkgMTQgKi8KKyNkZWZpbmUgTExfUkNDX1BSRURJVl9ESVZfMTUgICAgICAgICAgICAgICBSQ0NfQ0ZHUjJfUFJFRElWX0RJVjE1ICAvKiE8IFBSRURJViBpbnB1dCBjbG9jayBkaXZpZGVkIGJ5IDE1ICovCisjZGVmaW5lIExMX1JDQ19QUkVESVZfRElWXzE2ICAgICAgICAgICAgICAgUkNDX0NGR1IyX1BSRURJVl9ESVYxNiAgLyohPCBQUkVESVYgaW5wdXQgY2xvY2sgZGl2aWRlZCBieSAxNiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0V4cG9ydGVkX01hY3JvcyBSQ0MgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRU1fV1JJVEVfUkVBRCBDb21tb24gV3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBSQ0MgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIExMX1JDQ19Xcml0ZVJlZyhfX1JFR19fLCBfX1ZBTFVFX18pIFdSSVRFX1JFRyhSQ0MtPl9fUkVHX18sIChfX1ZBTFVFX18pKQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBSQ0MgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfUkNDX1JlYWRSZWcoX19SRUdfXykgUkVBRF9SRUcoUkNDLT5fX1JFR19fKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRU1fQ0FMQ19GUkVRIENhbGN1bGF0ZSBmcmVxdWVuY2llcworICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKFJDQ19QTExTUkNfUFJFRElWMV9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2FsY3VsYXRlIHRoZSBQTExDTEsgZnJlcXVlbmN5CisgICogQG5vdGUgZXg6IEByZWYgX19MTF9SQ0NfQ0FMQ19QTExDTEtfRlJFUSAoSFNFX1ZBTFVFLCBAcmVmIExMX1JDQ19QTExfR2V0TXVsdGlwbGljYXRvcigpCisgICogICAgICAgICAgICAgLCBAcmVmIExMX1JDQ19QTExfR2V0UHJlZGl2KCkpOworICAqIEBwYXJhbSAgX19JTlBVVEZSRVFfXyBQTEwgSW5wdXQgZnJlcXVlbmN5IChiYXNlZCBvbiBIU0UvSFNJKQorICAqIEBwYXJhbSAgX19QTExNVUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfMTYKKyAgKiBAcGFyYW0gIF9fUExMUFJFRElWX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUFJFRElWX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BSRURJVl9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QUkVESVZfRElWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUFJFRElWX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BSRURJVl9ESVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QUkVESVZfRElWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUFJFRElWX0RJVl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BSRURJVl9ESVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QUkVESVZfRElWXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUFJFRElWX0RJVl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QUkVESVZfRElWXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BSRURJVl9ESVZfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUFJFRElWX0RJVl8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QUkVESVZfRElWXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BSRURJVl9ESVZfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUFJFRElWX0RJVl8xNgorICAqIEByZXR2YWwgUExMIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICovCisjZGVmaW5lIF9fTExfUkNDX0NBTENfUExMQ0xLX0ZSRVEoX19JTlBVVEZSRVFfXywgX19QTExNVUxfXywgX19QTExQUkVESVZfXykgXAorICAgICAgICAgICgoKF9fSU5QVVRGUkVRX18pIC8gKCgoKF9fUExMUFJFRElWX18pICYgUkNDX0NGR1IyX1BSRURJVikgKyAxVSkpKSAqICgoKChfX1BMTE1VTF9fKSAmIFJDQ19DRkdSX1BMTE1VTCkgPj4gUkNDX1BPU0lUSU9OX1BMTE1VTCkgKyAyVSkpCisKKyNlbHNlCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIFBMTENMSyBmcmVxdWVuY3kKKyAgKiBAbm90ZSBleDogQHJlZiBfX0xMX1JDQ19DQUxDX1BMTENMS19GUkVRIChIU0VfVkFMVUUgLyAoQHJlZiBMTF9SQ0NfUExMX0dldFByZWRpdiAoKSArIDEpLCBAcmVmIExMX1JDQ19QTExfR2V0TXVsdGlwbGljYXRvcigpKTsKKyAgKiBAcGFyYW0gIF9fSU5QVVRGUkVRX18gUExMIElucHV0IGZyZXF1ZW5jeSAoYmFzZWQgb24gSFNFIGRpdiBQcmVkaXYgLyBIU0kgZGl2IDIpCisgICogQHBhcmFtICBfX1BMTE1VTF9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF8xNgorICAqIEByZXR2YWwgUExMIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICovCisjZGVmaW5lIF9fTExfUkNDX0NBTENfUExMQ0xLX0ZSRVEoX19JTlBVVEZSRVFfXywgX19QTExNVUxfXykgXAorICAgICAgICAgICgoX19JTlBVVEZSRVFfXykgKiAoKCgoX19QTExNVUxfXykgJiBSQ0NfQ0ZHUl9QTExNVUwpID4+IFJDQ19QT1NJVElPTl9QTExNVUwpICsgMlUpKQorI2VuZGlmIC8qIFJDQ19QTExTUkNfUFJFRElWMV9TVVBQT1JUICovCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIEhDTEsgZnJlcXVlbmN5CisgICogQG5vdGU6IF9fQUhCUFJFU0NBTEVSX18gYmUgcmV0cmlldmVkIGJ5IEByZWYgTExfUkNDX0dldEFIQlByZXNjYWxlcgorICAqICAgICAgICBleDogX19MTF9SQ0NfQ0FMQ19IQ0xLX0ZSRVEoTExfUkNDX0dldEFIQlByZXNjYWxlcigpKQorICAqIEBwYXJhbSAgX19TWVNDTEtGUkVRX18gU1lTQ0xLIGZyZXF1ZW5jeSAoYmFzZWQgb24gSFNFL0hTSS9QTExDTEspCisgICogQHBhcmFtICBfX0FIQlBSRVNDQUxFUl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8xMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8yNTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl81MTIKKyAgKiBAcmV0dmFsIEhDTEsgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKi8KKyNkZWZpbmUgX19MTF9SQ0NfQ0FMQ19IQ0xLX0ZSRVEoX19TWVNDTEtGUkVRX18sIF9fQUhCUFJFU0NBTEVSX18pICgoX19TWVNDTEtGUkVRX18pID4+IEFIQlByZXNjVGFibGVbKChfX0FIQlBSRVNDQUxFUl9fKSAmIFJDQ19DRkdSX0hQUkUpID4+ICBSQ0NfQ0ZHUl9IUFJFX1Bvc10pCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNhbGN1bGF0ZSB0aGUgUENMSzEgZnJlcXVlbmN5IChBQlAxKQorICAqIEBub3RlOiBfX0FQQjFQUkVTQ0FMRVJfXyBiZSByZXRyaWV2ZWQgYnkgQHJlZiBMTF9SQ0NfR2V0QVBCMVByZXNjYWxlcgorICAqICAgICAgICBleDogX19MTF9SQ0NfQ0FMQ19QQ0xLMV9GUkVRKExMX1JDQ19HZXRBUEIxUHJlc2NhbGVyKCkpCisgICogQHBhcmFtICBfX0hDTEtGUkVRX18gSENMSyBmcmVxdWVuY3kKKyAgKiBAcGFyYW0gIF9fQVBCMVBSRVNDQUxFUl9fOiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMV9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzE2CisgICogQHJldHZhbCBQQ0xLMSBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqLworI2RlZmluZSBfX0xMX1JDQ19DQUxDX1BDTEsxX0ZSRVEoX19IQ0xLRlJFUV9fLCBfX0FQQjFQUkVTQ0FMRVJfXykgKChfX0hDTEtGUkVRX18pID4+IEFQQlByZXNjVGFibGVbKF9fQVBCMVBSRVNDQUxFUl9fKSA+PiAgUkNDX0NGR1JfUFBSRTFfUG9zXSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2FsY3VsYXRlIHRoZSBQQ0xLMiBmcmVxdWVuY3kgKEFCUDIpCisgICogQG5vdGU6IF9fQVBCMlBSRVNDQUxFUl9fIGJlIHJldHJpZXZlZCBieSBAcmVmIExMX1JDQ19HZXRBUEIyUHJlc2NhbGVyCisgICogICAgICAgIGV4OiBfX0xMX1JDQ19DQUxDX1BDTEsyX0ZSRVEoTExfUkNDX0dldEFQQjJQcmVzY2FsZXIoKSkKKyAgKiBAcGFyYW0gIF9fSENMS0ZSRVFfXyBIQ0xLIGZyZXF1ZW5jeQorICAqIEBwYXJhbSAgX19BUEIyUFJFU0NBTEVSX186IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjJfRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMl9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIyX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjJfRElWXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMl9ESVZfMTYKKyAgKiBAcmV0dmFsIFBDTEsyIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICovCisjZGVmaW5lIF9fTExfUkNDX0NBTENfUENMSzJfRlJFUShfX0hDTEtGUkVRX18sIF9fQVBCMlBSRVNDQUxFUl9fKSAoKF9fSENMS0ZSRVFfXykgPj4gQVBCUHJlc2NUYWJsZVsoX19BUEIyUFJFU0NBTEVSX18pID4+ICBSQ0NfQ0ZHUl9QUFJFMl9Qb3NdKQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSQ0NfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIFJDQyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9IU0UgSFNFCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIENsb2NrIFNlY3VyaXR5IFN5c3RlbS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBDU1NPTiAgICAgICAgIExMX1JDQ19IU0VfRW5hYmxlQ1NTCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNFX0VuYWJsZUNTUyh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q1IsIFJDQ19DUl9DU1NPTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtLgorICAqIEBub3RlIENhbm5vdCBiZSBkaXNhYmxlZCBpbiBIU0UgaXMgcmVhZHkgKG9ubHkgYnkgaGFyZHdhcmUpCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQ1NTT04gICAgICAgICBMTF9SQ0NfSFNFX0Rpc2FibGVDU1MKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19IU0VfRGlzYWJsZUNTUyh2b2lkKQoreworICBDTEVBUl9CSVQoUkNDLT5DUiwgUkNDX0NSX0NTU09OKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgSFNFIGV4dGVybmFsIG9zY2lsbGF0b3IgKEhTRSBCeXBhc3MpCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgSFNFQllQICAgICAgICBMTF9SQ0NfSFNFX0VuYWJsZUJ5cGFzcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0hTRV9FbmFibGVCeXBhc3Modm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNFQllQKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEhTRSBleHRlcm5hbCBvc2NpbGxhdG9yIChIU0UgQnlwYXNzKQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEhTRUJZUCAgICAgICAgTExfUkNDX0hTRV9EaXNhYmxlQnlwYXNzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNFX0Rpc2FibGVCeXBhc3Modm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0VCWVApOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBIU0UgY3J5c3RhbCBvc2NpbGxhdG9yIChIU0UgT04pCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgSFNFT04gICAgICAgICBMTF9SQ0NfSFNFX0VuYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0hTRV9FbmFibGUodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNFT04pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgSFNFIGNyeXN0YWwgb3NjaWxsYXRvciAoSFNFIE9OKQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEhTRU9OICAgICAgICAgTExfUkNDX0hTRV9EaXNhYmxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNFX0Rpc2FibGUodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0VPTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgSFNFIG9zY2lsbGF0b3IgUmVhZHkKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBIU0VSRFkgICAgICAgIExMX1JDQ19IU0VfSXNSZWFkeQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19IU0VfSXNSZWFkeSh2b2lkKQoreworICByZXR1cm4gKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0VSRFkpID09IChSQ0NfQ1JfSFNFUkRZKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX0hTSSBIU0kKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBIU0kgb3NjaWxsYXRvcgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEhTSU9OICAgICAgICAgTExfUkNDX0hTSV9FbmFibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19IU0lfRW5hYmxlKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSU9OKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEhTSSBvc2NpbGxhdG9yCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgSFNJT04gICAgICAgICBMTF9SQ0NfSFNJX0Rpc2FibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19IU0lfRGlzYWJsZSh2b2lkKQoreworICBDTEVBUl9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSU9OKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBIU0kgY2xvY2sgaXMgcmVhZHkKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBIU0lSRFkgICAgICAgIExMX1JDQ19IU0lfSXNSZWFkeQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19IU0lfSXNSZWFkeSh2b2lkKQoreworICByZXR1cm4gKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lSRFkpID09IChSQ0NfQ1JfSFNJUkRZKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEhTSSBDYWxpYnJhdGlvbiB2YWx1ZQorICAqIEBub3RlIFdoZW4gSFNJVFJJTSBpcyB3cml0dGVuLCBIU0lDQUwgaXMgdXBkYXRlZCB3aXRoIHRoZSBzdW0gb2YKKyAgKiAgICAgICBIU0lUUklNIGFuZCB0aGUgZmFjdG9yeSB0cmltIHZhbHVlCisgICogQHJtdG9sbCBDUiAgICAgICAgSFNJQ0FMICAgICAgICBMTF9SQ0NfSFNJX0dldENhbGlicmF0aW9uCisgICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweEZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0hTSV9HZXRDYWxpYnJhdGlvbih2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJQ0FMKSA+PiBSQ0NfQ1JfSFNJQ0FMX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEhTSSBDYWxpYnJhdGlvbiB0cmltbWluZworICAqIEBub3RlIHVzZXItcHJvZ3JhbW1hYmxlIHRyaW1taW5nIHZhbHVlIHRoYXQgaXMgYWRkZWQgdG8gdGhlIEhTSUNBTAorICAqIEBub3RlIERlZmF1bHQgdmFsdWUgaXMgMTYsIHdoaWNoLCB3aGVuIGFkZGVkIHRvIHRoZSBIU0lDQUwgdmFsdWUsCisgICogICAgICAgc2hvdWxkIHRyaW0gdGhlIEhTSSB0byAxNiBNSHogKy8tIDEgJQorICAqIEBybXRvbGwgQ1IgICAgICAgIEhTSVRSSU0gICAgICAgTExfUkNDX0hTSV9TZXRDYWxpYlRyaW1taW5nCisgICogQHBhcmFtICBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweDFGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNJX1NldENhbGliVHJpbW1pbmcodWludDMyX3QgVmFsdWUpCit7CisgIE1PRElGWV9SRUcoUkNDLT5DUiwgUkNDX0NSX0hTSVRSSU0sIFZhbHVlIDw8IFJDQ19DUl9IU0lUUklNX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEhTSSBDYWxpYnJhdGlvbiB0cmltbWluZworICAqIEBybXRvbGwgQ1IgICAgICAgIEhTSVRSSU0gICAgICAgTExfUkNDX0hTSV9HZXRDYWxpYlRyaW1taW5nCisgICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweDFGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0hTSV9HZXRDYWxpYlRyaW1taW5nKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lUUklNKSA+PiBSQ0NfQ1JfSFNJVFJJTV9Qb3MpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9MU0UgTFNFCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgIExvdyBTcGVlZCBFeHRlcm5hbCAoTFNFKSBjcnlzdGFsLgorICAqIEBybXRvbGwgQkRDUiAgICAgICAgIExTRU9OICAgICAgICAgTExfUkNDX0xTRV9FbmFibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19MU0VfRW5hYmxlKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VPTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSAgTG93IFNwZWVkIEV4dGVybmFsIChMU0UpIGNyeXN0YWwuCisgICogQHJtdG9sbCBCRENSICAgICAgICAgTFNFT04gICAgICAgICBMTF9SQ0NfTFNFX0Rpc2FibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19MU0VfRGlzYWJsZSh2b2lkKQoreworICBDTEVBUl9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VPTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGV4dGVybmFsIGNsb2NrIHNvdXJjZSAoTFNFIGJ5cGFzcykuCisgICogQHJtdG9sbCBCRENSICAgICAgICAgTFNFQllQICAgICAgICBMTF9SQ0NfTFNFX0VuYWJsZUJ5cGFzcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0xTRV9FbmFibGVCeXBhc3Modm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRUJZUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBleHRlcm5hbCBjbG9jayBzb3VyY2UgKExTRSBieXBhc3MpLgorICAqIEBybXRvbGwgQkRDUiAgICAgICAgIExTRUJZUCAgICAgICAgTExfUkNDX0xTRV9EaXNhYmxlQnlwYXNzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfTFNFX0Rpc2FibGVCeXBhc3Modm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFQllQKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgTFNFIG9zY2lsbGF0b3IgZHJpdmUgY2FwYWJpbGl0eQorICAqIEBub3RlIFRoZSBvc2NpbGxhdG9yIGlzIGluIFh0YWwgbW9kZSB3aGVuIGl0IGlzIG5vdCBpbiBieXBhc3MgbW9kZS4KKyAgKiBAcm10b2xsIEJEQ1IgICAgICAgICBMU0VEUlYgICAgICAgIExMX1JDQ19MU0VfU2V0RHJpdmVDYXBhYmlsaXR5CisgICogQHBhcmFtICBMU0VEcml2ZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MU0VEUklWRV9MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFNFRFJJVkVfTUVESVVNTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xTRURSSVZFX01FRElVTUhJR0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFNFRFJJVkVfSElHSAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0xTRV9TZXREcml2ZUNhcGFiaWxpdHkodWludDMyX3QgTFNFRHJpdmUpCit7CisgIE1PRElGWV9SRUcoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VEUlYsIExTRURyaXZlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgTFNFIG9zY2lsbGF0b3IgZHJpdmUgY2FwYWJpbGl0eQorICAqIEBybXRvbGwgQkRDUiAgICAgICAgIExTRURSViAgICAgICAgTExfUkNDX0xTRV9HZXREcml2ZUNhcGFiaWxpdHkKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xTRURSSVZFX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MU0VEUklWRV9NRURJVU1MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFNFRFJJVkVfTUVESVVNSElHSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MU0VEUklWRV9ISUdICisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0xTRV9HZXREcml2ZUNhcGFiaWxpdHkodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VEUlYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBMU0Ugb3NjaWxsYXRvciBSZWFkeQorICAqIEBybXRvbGwgQkRDUiAgICAgICAgIExTRVJEWSAgICAgICAgTExfUkNDX0xTRV9Jc1JlYWR5CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0xTRV9Jc1JlYWR5KHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VSRFkpID09IChSQ0NfQkRDUl9MU0VSRFkpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUZfTFNJIExTSQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIExTSSBPc2NpbGxhdG9yCisgICogQHJtdG9sbCBDU1IgICAgICAgICAgTFNJT04gICAgICAgICBMTF9SQ0NfTFNJX0VuYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0xTSV9FbmFibGUodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9MU0lPTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBMU0kgT3NjaWxsYXRvcgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgIExTSU9OICAgICAgICAgTExfUkNDX0xTSV9EaXNhYmxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfTFNJX0Rpc2FibGUodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0xTSU9OKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBMU0kgaXMgUmVhZHkKKyAgKiBAcm10b2xsIENTUiAgICAgICAgICBMU0lSRFkgICAgICAgIExMX1JDQ19MU0lfSXNSZWFkeQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19MU0lfSXNSZWFkeSh2b2lkKQoreworICByZXR1cm4gKFJFQURfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0xTSVJEWSkgPT0gKFJDQ19DU1JfTFNJUkRZKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX1N5c3RlbSBTeXN0ZW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgc3lzdGVtIGNsb2NrIHNvdXJjZQorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFNXICAgICAgICAgICAgTExfUkNDX1NldFN5c0Nsa1NvdXJjZQorICAqIEBwYXJhbSAgU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU19DTEtTT1VSQ0VfSFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU19DTEtTT1VSQ0VfSFNFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU19DTEtTT1VSQ0VfUExMCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0U3lzQ2xrU291cmNlKHVpbnQzMl90IFNvdXJjZSkKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX1NXLCBTb3VyY2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgc3lzdGVtIGNsb2NrIHNvdXJjZQorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFNXUyAgICAgICAgICAgTExfUkNDX0dldFN5c0Nsa1NvdXJjZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9TVEFUVVNfSFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU19DTEtTT1VSQ0VfU1RBVFVTX0hTRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNfQ0xLU09VUkNFX1NUQVRVU19QTEwKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0U3lzQ2xrU291cmNlKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfU1dTKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFIQiBwcmVzY2FsZXIKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBIUFJFICAgICAgICAgIExMX1JDQ19TZXRBSEJQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFByZXNjYWxlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMTI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMjU2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfNTEyCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0QUhCUHJlc2NhbGVyKHVpbnQzMl90IFByZXNjYWxlcikKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX0hQUkUsIFByZXNjYWxlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFQQjEgcHJlc2NhbGVyCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgUFBSRTEgICAgICAgICBMTF9SQ0NfU2V0QVBCMVByZXNjYWxlcgorICAqIEBwYXJhbSAgUHJlc2NhbGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMV9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMV9ESVZfMTYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRBUEIxUHJlc2NhbGVyKHVpbnQzMl90IFByZXNjYWxlcikKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX1BQUkUxLCBQcmVzY2FsZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBUEIyIHByZXNjYWxlcgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFBQUkUyICAgICAgICAgTExfUkNDX1NldEFQQjJQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFByZXNjYWxlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIyX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjJfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMl9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIyX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjJfRElWXzE2CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0QVBCMlByZXNjYWxlcih1aW50MzJfdCBQcmVzY2FsZXIpCit7CisgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9QUFJFMiwgUHJlc2NhbGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQUhCIHByZXNjYWxlcgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIEhQUkUgICAgICAgICAgTExfUkNDX0dldEFIQlByZXNjYWxlcgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl82NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzI1NgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzUxMgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRBSEJQcmVzY2FsZXIodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9IUFJFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFQQjEgcHJlc2NhbGVyCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgUFBSRTEgICAgICAgICBMTF9SQ0NfR2V0QVBCMVByZXNjYWxlcgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMV9ESVZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMV9ESVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl8xNgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRBUEIxUHJlc2NhbGVyKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfUFBSRTEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQVBCMiBwcmVzY2FsZXIKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBQUFJFMiAgICAgICAgIExMX1JDQ19HZXRBUEIyUHJlc2NhbGVyCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIyX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjJfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMl9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIyX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjJfRElWXzE2CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldEFQQjJQcmVzY2FsZXIodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9QUFJFMikpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9NQ08gTUNPCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgTUNPeAorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIE1DTyAgICAgICAgICAgTExfUkNDX0NvbmZpZ01DT1xuCisgICogICAgICAgICBDRkdSICAgICAgICAgTUNPUFJFICAgICAgICBMTF9SQ0NfQ29uZmlnTUNPXG4KKyAgKiAgICAgICAgIENGR1IgICAgICAgICBQTExOT0RJViAgICAgIExMX1JDQ19Db25maWdNQ08KKyAgKiBAcGFyYW0gIE1DT3hTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTUNPMVNPVVJDRV9OT0NMT0NLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFTT1VSQ0VfU1lTQ0xLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFTT1VSQ0VfSFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFTT1VSQ0VfSFNFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFTT1VSQ0VfTFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFTT1VSQ0VfTFNFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFTT1VSQ0VfUExMQ0xLICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NQ08xU09VUkNFX1BMTENMS19ESVZfMgorICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMKKyAgKiBAcGFyYW0gIE1DT3hQcmVzY2FsZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTUNPMV9ESVZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NQ08xX0RJVl8yICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NQ08xX0RJVl80ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NQ08xX0RJVl84ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NQ08xX0RJVl8xNiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTUNPMV9ESVZfMzIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFfRElWXzY0ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NQ08xX0RJVl8xMjggKCopCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0NvbmZpZ01DTyh1aW50MzJfdCBNQ094U291cmNlLCB1aW50MzJfdCBNQ094UHJlc2NhbGVyKQoreworI2lmIGRlZmluZWQoUkNDX0NGR1JfTUNPUFJFKQorI2lmIGRlZmluZWQoUkNDX0NGR1JfUExMTk9ESVYpCisgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9NQ09TRUwgfCBSQ0NfQ0ZHUl9NQ09QUkUgfCBSQ0NfQ0ZHUl9QTExOT0RJViwgTUNPeFNvdXJjZSB8IE1DT3hQcmVzY2FsZXIpOworI2Vsc2UKKyAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX01DT1NFTCB8IFJDQ19DRkdSX01DT1BSRSwgTUNPeFNvdXJjZSB8IE1DT3hQcmVzY2FsZXIpOworI2VuZGlmIC8qIFJDQ19DRkdSX1BMTE5PRElWICovCisjZWxzZQorICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfTUNPU0VMLCBNQ094U291cmNlKTsKKyNlbmRpZiAvKiBSQ0NfQ0ZHUl9NQ09QUkUgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUZfUGVyaXBoZXJhbF9DbG9ja19Tb3VyY2UgUGVyaXBoZXJhbCBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBVU0FSVHggY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBDRkdSMyAgICAgICAgVVNBUlQxU1cgICAgICBMTF9SQ0NfU2V0VVNBUlRDbG9ja1NvdXJjZVxuCisgICogICAgICAgICBDRkdSMyAgICAgICAgVVNBUlQyU1cgICAgICBMTF9SQ0NfU2V0VVNBUlRDbG9ja1NvdXJjZVxuCisgICogICAgICAgICBDRkdSMyAgICAgICAgVVNBUlQzU1cgICAgICBMTF9SQ0NfU2V0VVNBUlRDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgVVNBUlR4U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfUENMSzEgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfUENMSzIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfU1lTQ0xLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfTFNFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfSFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMl9DTEtTT1VSQ0VfUENMSzEgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMl9DTEtTT1VSQ0VfU1lTQ0xLICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFX0xTRSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRV9IU0kgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUM19DTEtTT1VSQ0VfUENMSzEgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUM19DTEtTT1VSQ0VfU1lTQ0xLICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDNfQ0xLU09VUkNFX0xTRSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQzX0NMS1NPVVJDRV9IU0kgKCopCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRVU0FSVENsb2NrU291cmNlKHVpbnQzMl90IFVTQVJUeFNvdXJjZSkKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IzLCAoUkNDX0NGR1IzX1VTQVJUMVNXIDw8ICgoVVNBUlR4U291cmNlICAmIDB4RkYwMDAwMDBVKSA+PiAyNFUpKSwgKFVTQVJUeFNvdXJjZSAmIDB4MDBGRkZGRkZVKSk7Cit9CisKKyNpZiBkZWZpbmVkKFJDQ19DRkdSM19VQVJUNFNXKSB8fCBkZWZpbmVkKFJDQ19DRkdSM19VQVJUNVNXKQorLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgVUFSVHggY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBDRkdSMyAgICAgICAgVUFSVDRTVyAgICAgICBMTF9SQ0NfU2V0VUFSVENsb2NrU291cmNlXG4KKyAgKiAgICAgICAgIENGR1IzICAgICAgICBVQVJUNVNXICAgICAgIExMX1JDQ19TZXRVQVJUQ2xvY2tTb3VyY2UKKyAgKiBAcGFyYW0gIFVBUlR4U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VBUlQ0X0NMS1NPVVJDRV9QQ0xLMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VQVJUNF9DTEtTT1VSQ0VfU1lTQ0xLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VBUlQ0X0NMS1NPVVJDRV9MU0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVUFSVDRfQ0xLU09VUkNFX0hTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VQVJUNV9DTEtTT1VSQ0VfUENMSzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVUFSVDVfQ0xLU09VUkNFX1NZU0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VQVJUNV9DTEtTT1VSQ0VfTFNFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VBUlQ1X0NMS1NPVVJDRV9IU0kKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRVQVJUQ2xvY2tTb3VyY2UodWludDMyX3QgVUFSVHhTb3VyY2UpCit7CisgIE1PRElGWV9SRUcoUkNDLT5DRkdSMywgKChVQVJUeFNvdXJjZSAgJiAweDAwMDBGRkZGVSkgPDwgOFUpLCAoVUFSVHhTb3VyY2UgJiAoUkNDX0NGR1IzX1VBUlQ0U1cgfCBSQ0NfQ0ZHUjNfVUFSVDVTVykpKTsKK30KKyNlbmRpZiAvKiBSQ0NfQ0ZHUjNfVUFSVDRTVyB8fCBSQ0NfQ0ZHUjNfVUFSVDVTVyAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBJMkN4IGNsb2NrIHNvdXJjZQorICAqIEBybXRvbGwgQ0ZHUjMgICAgICAgIEkyQzFTVyAgICAgICAgTExfUkNDX1NldEkyQ0Nsb2NrU291cmNlXG4KKyAgKiAgICAgICAgIENGR1IzICAgICAgICBJMkMyU1cgICAgICAgIExMX1JDQ19TZXRJMkNDbG9ja1NvdXJjZVxuCisgICogICAgICAgICBDRkdSMyAgICAgICAgSTJDM1NXICAgICAgICBMTF9SQ0NfU2V0STJDQ2xvY2tTb3VyY2UKKyAgKiBAcGFyYW0gIEkyQ3hTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0VfSFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzFfQ0xLU09VUkNFX1NZU0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMyX0NMS1NPVVJDRV9IU0kgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzJfQ0xLU09VUkNFX1NZU0NMSyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDM19DTEtTT1VSQ0VfSFNJICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMzX0NMS1NPVVJDRV9TWVNDTEsgKCopCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRJMkNDbG9ja1NvdXJjZSh1aW50MzJfdCBJMkN4U291cmNlKQoreworICBNT0RJRllfUkVHKFJDQy0+Q0ZHUjMsICgoSTJDeFNvdXJjZSAgJiAweEZGMDAwMDAwVSkgPj4gMjRVKSwgKEkyQ3hTb3VyY2UgJiAweDAwRkZGRkZGVSkpOworfQorCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUl9JMlNTUkMpCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBJMlN4IGNsb2NrIHNvdXJjZQorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIEkyU1NSQyAgICAgICAgTExfUkNDX1NldEkyU0Nsb2NrU291cmNlCisgICogQHBhcmFtICBJMlN4U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyU19DTEtTT1VSQ0VfU1lTQ0xLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyU19DTEtTT1VSQ0VfUElOCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0STJTQ2xvY2tTb3VyY2UodWludDMyX3QgSTJTeFNvdXJjZSkKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX0kyU1NSQywgSTJTeFNvdXJjZSk7Cit9CisjZW5kaWYgLyogUkNDX0NGR1JfSTJTU1JDICovCisKKyNpZiBkZWZpbmVkKFJDQ19DRkdSM19USU1TVykKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIFRJTXggY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBDRkdSMyAgICAgICAgVElNMVNXICAgICAgICBMTF9SQ0NfU2V0VElNQ2xvY2tTb3VyY2VcbgorICAqICAgICAgICAgQ0ZHUjMgICAgICAgIFRJTThTVyAgICAgICAgTExfUkNDX1NldFRJTUNsb2NrU291cmNlXG4KKyAgKiAgICAgICAgIENGR1IzICAgICAgICBUSU0xNVNXICAgICAgIExMX1JDQ19TZXRUSU1DbG9ja1NvdXJjZVxuCisgICogICAgICAgICBDRkdSMyAgICAgICAgVElNMTZTVyAgICAgICBMTF9SQ0NfU2V0VElNQ2xvY2tTb3VyY2VcbgorICAqICAgICAgICAgQ0ZHUjMgICAgICAgIFRJTTE3U1cgICAgICAgTExfUkNDX1NldFRJTUNsb2NrU291cmNlXG4KKyAgKiAgICAgICAgIENGR1IzICAgICAgICBUSU0yMFNXICAgICAgIExMX1JDQ19TZXRUSU1DbG9ja1NvdXJjZVxuCisgICogICAgICAgICBDRkdSMyAgICAgICAgVElNMlNXICAgICAgICBMTF9SQ0NfU2V0VElNQ2xvY2tTb3VyY2VcbgorICAqICAgICAgICAgQ0ZHUjMgICAgICAgIFRJTTM0U1cgICAgICAgTExfUkNDX1NldFRJTUNsb2NrU291cmNlCisgICogQHBhcmFtICBUSU14U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1RJTTFfQ0xLU09VUkNFX1BDTEsyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1RJTTFfQ0xLU09VUkNFX1BMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19USU04X0NMS1NPVVJDRV9QQ0xLMiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVElNOF9DTEtTT1VSQ0VfUExMICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19USU0xNV9DTEtTT1VSQ0VfUENMSzIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1RJTTE1X0NMS1NPVVJDRV9QTEwgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1RJTTE2X0NMS1NPVVJDRV9QQ0xLMiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVElNMTZfQ0xLU09VUkNFX1BMTCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVElNMTdfQ0xLU09VUkNFX1BDTEsyICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19USU0xN19DTEtTT1VSQ0VfUExMICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19USU0yMF9DTEtTT1VSQ0VfUENMSzIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1RJTTIwX0NMS1NPVVJDRV9QTEwgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1RJTTJfQ0xLU09VUkNFX1BDTEsxICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19USU0yX0NMS1NPVVJDRV9QTEwgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1RJTTM0X0NMS1NPVVJDRV9QQ0xLMSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVElNMzRfQ0xLU09VUkNFX1BMTCAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldFRJTUNsb2NrU291cmNlKHVpbnQzMl90IFRJTXhTb3VyY2UpCit7CisgIE1PRElGWV9SRUcoUkNDLT5DRkdSMywgKFJDQ19DRkdSM19USU0xU1cgPDwgKFRJTXhTb3VyY2UgPj4gMjdVKSksIChUSU14U291cmNlICYgMHgwM0ZGRkZGRlUpKTsKK30KKyNlbmRpZiAvKiBSQ0NfQ0ZHUjNfVElNU1cgKi8KKworI2lmIGRlZmluZWQoSFJUSU0xKQorLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgSFJUSU14IGNsb2NrIHNvdXJjZQorICAqIEBybXRvbGwgQ0ZHUjMgICAgICAgIEhSVElNU1cgICAgICAgTExfUkNDX1NldEhSVElNQ2xvY2tTb3VyY2UKKyAgKiBAcGFyYW0gIEhSVElNeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19IUlRJTTFfQ0xLU09VUkNFX1BDTEsyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0hSVElNMV9DTEtTT1VSQ0VfUExMCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0SFJUSU1DbG9ja1NvdXJjZSh1aW50MzJfdCBIUlRJTXhTb3VyY2UpCit7CisgIE1PRElGWV9SRUcoUkNDLT5DRkdSMywgUkNDX0NGR1IzX0hSVElNU1csIEhSVElNeFNvdXJjZSk7Cit9CisjZW5kaWYgLyogSFJUSU0xICovCisKKyNpZiBkZWZpbmVkKENFQykKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIENFQyBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENGR1IzICAgICAgICBDRUNTVyAgICAgICAgIExMX1JDQ19TZXRDRUNDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgQ0VDeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19DRUNfQ0xLU09VUkNFX0hTSV9ESVYyNDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQ0VDX0NMS1NPVVJDRV9MU0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRDRUNDbG9ja1NvdXJjZSh1aW50MzJfdCBDRUN4U291cmNlKQoreworICBNT0RJRllfUkVHKFJDQy0+Q0ZHUjMsIFJDQ19DRkdSM19DRUNTVywgQ0VDeFNvdXJjZSk7Cit9CisjZW5kaWYgLyogQ0VDICovCisKKyNpZiBkZWZpbmVkKFVTQikKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIFVTQiBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBVU0JQUkUgICAgICAgIExMX1JDQ19TZXRVU0JDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgVVNCeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0JfQ0xLU09VUkNFX1BMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0JfQ0xLU09VUkNFX1BMTF9ESVZfMV81CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0VVNCQ2xvY2tTb3VyY2UodWludDMyX3QgVVNCeFNvdXJjZSkKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX1VTQlBSRSwgVVNCeFNvdXJjZSk7Cit9CisjZW5kaWYgLyogVVNCICovCisKKyNpZiBkZWZpbmVkKFJDQ19DRkdSX0FEQ1BSRSkKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIEFEQyBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBBRENQUkUgICAgICAgIExMX1JDQ19TZXRBRENDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgQURDeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BRENfQ0xLU1JDX1BDTEsyX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQ19DTEtTUkNfUENMSzJfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDX0NMS1NSQ19QQ0xLMl9ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BRENfQ0xLU1JDX1BDTEsyX0RJVl84CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0QURDQ2xvY2tTb3VyY2UodWludDMyX3QgQURDeFNvdXJjZSkKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX0FEQ1BSRSwgQURDeFNvdXJjZSk7Cit9CisKKyNlbGlmIGRlZmluZWQoUkNDX0NGR1IyX0FEQzFQUkVTKQorLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgQURDIGNsb2NrIHNvdXJjZQorICAqIEBybXRvbGwgQ0ZHUjIgICAgICAgIEFEQzFQUkVTICAgICAgTExfUkNDX1NldEFEQ0Nsb2NrU291cmNlCisgICogQHBhcmFtICBBREN4U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzFfQ0xLU1JDX0hDTEsKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMV9DTEtTUkNfUExMX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzFfQ0xLU1JDX1BMTF9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMxX0NMS1NSQ19QTExfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMV9DTEtTUkNfUExMX0RJVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzFfQ0xLU1JDX1BMTF9ESVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMxX0NMS1NSQ19QTExfRElWXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzFfQ0xLU1JDX1BMTF9ESVZfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMV9DTEtTUkNfUExMX0RJVl8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMxX0NMS1NSQ19QTExfRElWXzMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzFfQ0xLU1JDX1BMTF9ESVZfNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMV9DTEtTUkNfUExMX0RJVl8xMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMV9DTEtTUkNfUExMX0RJVl8yNTYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRBRENDbG9ja1NvdXJjZSh1aW50MzJfdCBBREN4U291cmNlKQoreworICBNT0RJRllfUkVHKFJDQy0+Q0ZHUjIsIFJDQ19DRkdSMl9BREMxUFJFUywgQURDeFNvdXJjZSk7Cit9CisKKyNlbGlmIGRlZmluZWQoUkNDX0NGR1IyX0FEQ1BSRTEyKSB8fCBkZWZpbmVkKFJDQ19DRkdSMl9BRENQUkUzNCkKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIEFEQyBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENGR1IyICAgICAgICBBRENQUkUxMiAgICAgIExMX1JDQ19TZXRBRENDbG9ja1NvdXJjZVxuCisgICogICAgICAgICBDRkdSMiAgICAgICAgQURDUFJFMzQgICAgICBMTF9SQ0NfU2V0QURDQ2xvY2tTb3VyY2UKKyAgKiBAcGFyYW0gIEFEQ3hTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMTJfQ0xLU1JDX0hDTEsKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMTJfQ0xLU1JDX1BMTF9ESVZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMxMl9DTEtTUkNfUExMX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzEyX0NMS1NSQ19QTExfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMTJfQ0xLU1JDX1BMTF9ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMxMl9DTEtTUkNfUExMX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzEyX0NMS1NSQ19QTExfRElWXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzEyX0NMS1NSQ19QTExfRElWXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzEyX0NMS1NSQ19QTExfRElWXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzEyX0NMS1NSQ19QTExfRElWXzMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzEyX0NMS1NSQ19QTExfRElWXzY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzEyX0NMS1NSQ19QTExfRElWXzEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMxMl9DTEtTUkNfUExMX0RJVl8yNTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMzRfQ0xLU1JDX0hDTEsgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzM0X0NMS1NSQ19QTExfRElWXzEgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzM0X0NMS1NSQ19QTExfRElWXzIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzM0X0NMS1NSQ19QTExfRElWXzQgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzM0X0NMS1NSQ19QTExfRElWXzYgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzM0X0NMS1NSQ19QTExfRElWXzggKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzM0X0NMS1NSQ19QTExfRElWXzEwICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMzNF9DTEtTUkNfUExMX0RJVl8xMiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMzRfQ0xLU1JDX1BMTF9ESVZfMTYgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzM0X0NMS1NSQ19QTExfRElWXzMyICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMzNF9DTEtTUkNfUExMX0RJVl82NCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMzRfQ0xLU1JDX1BMTF9ESVZfMTI4ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMzNF9DTEtTUkNfUExMX0RJVl8yNTYgKCopCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRBRENDbG9ja1NvdXJjZSh1aW50MzJfdCBBREN4U291cmNlKQoreworI2lmIGRlZmluZWQoUkNDX0NGR1IyX0FEQ1BSRTM0KQorICBNT0RJRllfUkVHKFJDQy0+Q0ZHUjIsIChBREN4U291cmNlID4+IDE2VSksIChBREN4U291cmNlICYgMHgwMDAwRkZGRlUpKTsKKyNlbHNlCisgIE1PRElGWV9SRUcoUkNDLT5DRkdSMiwgUkNDX0NGR1IyX0FEQ1BSRTEyLCBBREN4U291cmNlKTsKKyNlbmRpZiAvKiBSQ0NfQ0ZHUjJfQURDUFJFMzQgKi8KK30KKyNlbmRpZiAvKiBSQ0NfQ0ZHUl9BRENQUkUgKi8KKworI2lmIGRlZmluZWQoUkNDX0NGR1JfU0RQUkUpCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBTREFEQ3ggY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgU0RQUkUgICAgICBMTF9SQ0NfU2V0U0RBRENDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgU0RBREN4U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NEQURDX0NMS1NSQ19TWVNfRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TREFEQ19DTEtTUkNfU1lTX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NEQURDX0NMS1NSQ19TWVNfRElWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TREFEQ19DTEtTUkNfU1lTX0RJVl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TREFEQ19DTEtTUkNfU1lTX0RJVl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TREFEQ19DTEtTUkNfU1lTX0RJVl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TREFEQ19DTEtTUkNfU1lTX0RJVl8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TREFEQ19DTEtTUkNfU1lTX0RJVl8yMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TREFEQ19DTEtTUkNfU1lTX0RJVl8yNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TREFEQ19DTEtTUkNfU1lTX0RJVl8yOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TREFEQ19DTEtTUkNfU1lTX0RJVl8zMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TREFEQ19DTEtTUkNfU1lTX0RJVl8zNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TREFEQ19DTEtTUkNfU1lTX0RJVl80MAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TREFEQ19DTEtTUkNfU1lTX0RJVl80NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TREFEQ19DTEtTUkNfU1lTX0RJVl80OAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldFNEQURDQ2xvY2tTb3VyY2UodWludDMyX3QgU0RBREN4U291cmNlKQoreworICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfU0RQUkUsIFNEQURDeFNvdXJjZSk7Cit9CisjZW5kaWYgLyogUkNDX0NGR1JfU0RQUkUgKi8KKworLyoqCisgICogQGJyaWVmICBHZXQgVVNBUlR4IGNsb2NrIHNvdXJjZQorICAqIEBybXRvbGwgQ0ZHUjMgICAgICAgIFVTQVJUMVNXICAgICAgTExfUkNDX0dldFVTQVJUQ2xvY2tTb3VyY2VcbgorICAqICAgICAgICAgQ0ZHUjMgICAgICAgIFVTQVJUMlNXICAgICAgTExfUkNDX0dldFVTQVJUQ2xvY2tTb3VyY2VcbgorICAqICAgICAgICAgQ0ZHUjMgICAgICAgIFVTQVJUM1NXICAgICAgTExfUkNDX0dldFVTQVJUQ2xvY2tTb3VyY2UKKyAgKiBAcGFyYW0gIFVTQVJUeCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMl9DTEtTT1VSQ0UgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUM19DTEtTT1VSQ0UgKCopCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfUENMSzEgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfUENMSzIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfU1lTQ0xLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfTFNFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfSFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMl9DTEtTT1VSQ0VfUENMSzEgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMl9DTEtTT1VSQ0VfU1lTQ0xLICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFX0xTRSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRV9IU0kgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUM19DTEtTT1VSQ0VfUENMSzEgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUM19DTEtTT1VSQ0VfU1lTQ0xLICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDNfQ0xLU09VUkNFX0xTRSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQzX0NMS1NPVVJDRV9IU0kgKCopCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0VVNBUlRDbG9ja1NvdXJjZSh1aW50MzJfdCBVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUjMsIChSQ0NfQ0ZHUjNfVVNBUlQxU1cgPDwgVVNBUlR4KSkgfCAoVVNBUlR4IDw8IDI0VSkpOworfQorCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfVUFSVDRTVykgfHwgZGVmaW5lZChSQ0NfQ0ZHUjNfVUFSVDVTVykKKy8qKgorICAqIEBicmllZiAgR2V0IFVBUlR4IGNsb2NrIHNvdXJjZQorICAqIEBybXRvbGwgQ0ZHUjMgICAgICAgIFVBUlQ0U1cgICAgICAgTExfUkNDX0dldFVBUlRDbG9ja1NvdXJjZVxuCisgICogICAgICAgICBDRkdSMyAgICAgICAgVUFSVDVTVyAgICAgICBMTF9SQ0NfR2V0VUFSVENsb2NrU291cmNlCisgICogQHBhcmFtICBVQVJUeCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VQVJUNF9DTEtTT1VSQ0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVUFSVDVfQ0xLU09VUkNFCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VQVJUNF9DTEtTT1VSQ0VfUENMSzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVUFSVDRfQ0xLU09VUkNFX1NZU0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VQVJUNF9DTEtTT1VSQ0VfTFNFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VBUlQ0X0NMS1NPVVJDRV9IU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVUFSVDVfQ0xLU09VUkNFX1BDTEsxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VBUlQ1X0NMS1NPVVJDRV9TWVNDTEsKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVUFSVDVfQ0xLU09VUkNFX0xTRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VQVJUNV9DTEtTT1VSQ0VfSFNJCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldFVBUlRDbG9ja1NvdXJjZSh1aW50MzJfdCBVQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DRkdSMywgVUFSVHgpIHwgKFVBUlR4ID4+IDhVKSk7Cit9CisjZW5kaWYgLyogUkNDX0NGR1IzX1VBUlQ0U1cgfHwgUkNDX0NGR1IzX1VBUlQ1U1cgKi8KKworLyoqCisgICogQGJyaWVmICBHZXQgSTJDeCBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENGR1IzICAgICAgICBJMkMxU1cgICAgICAgIExMX1JDQ19HZXRJMkNDbG9ja1NvdXJjZVxuCisgICogICAgICAgICBDRkdSMyAgICAgICAgSTJDMlNXICAgICAgICBMTF9SQ0NfR2V0STJDQ2xvY2tTb3VyY2VcbgorICAqICAgICAgICAgQ0ZHUjMgICAgICAgIEkyQzNTVyAgICAgICAgTExfUkNDX0dldEkyQ0Nsb2NrU291cmNlCisgICogQHBhcmFtICBJMkN4IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzFfQ0xLU09VUkNFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzJfQ0xLU09VUkNFICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMzX0NMS1NPVVJDRSAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0VfSFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzFfQ0xLU09VUkNFX1NZU0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMyX0NMS1NPVVJDRV9IU0kgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzJfQ0xLU09VUkNFX1NZU0NMSyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDM19DTEtTT1VSQ0VfSFNJICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMzX0NMS1NPVVJDRV9TWVNDTEsgKCopCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0STJDQ2xvY2tTb3VyY2UodWludDMyX3QgSTJDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DRkdSMywgSTJDeCkgfCAoSTJDeCA8PCAyNFUpKTsKK30KKworI2lmIGRlZmluZWQoUkNDX0NGR1JfSTJTU1JDKQorLyoqCisgICogQGJyaWVmICBHZXQgSTJTeCBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBJMlNTUkMgICAgICAgIExMX1JDQ19HZXRJMlNDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgSTJTeCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMlNfQ0xLU09VUkNFCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMlNfQ0xLU09VUkNFX1NZU0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMlNfQ0xLU09VUkNFX1BJTgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRJMlNDbG9ja1NvdXJjZSh1aW50MzJfdCBJMlN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNGR1IsIEkyU3gpKTsKK30KKyNlbmRpZiAvKiBSQ0NfQ0ZHUl9JMlNTUkMgKi8KKworI2lmIGRlZmluZWQoUkNDX0NGR1IzX1RJTVNXKQorLyoqCisgICogQGJyaWVmICBHZXQgVElNeCBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENGR1IzICAgICAgICBUSU0xU1cgICAgICAgIExMX1JDQ19HZXRUSU1DbG9ja1NvdXJjZVxuCisgICogICAgICAgICBDRkdSMyAgICAgICAgVElNOFNXICAgICAgICBMTF9SQ0NfR2V0VElNQ2xvY2tTb3VyY2VcbgorICAqICAgICAgICAgQ0ZHUjMgICAgICAgIFRJTTE1U1cgICAgICAgTExfUkNDX0dldFRJTUNsb2NrU291cmNlXG4KKyAgKiAgICAgICAgIENGR1IzICAgICAgICBUSU0xNlNXICAgICAgIExMX1JDQ19HZXRUSU1DbG9ja1NvdXJjZVxuCisgICogICAgICAgICBDRkdSMyAgICAgICAgVElNMTdTVyAgICAgICBMTF9SQ0NfR2V0VElNQ2xvY2tTb3VyY2VcbgorICAqICAgICAgICAgQ0ZHUjMgICAgICAgIFRJTTIwU1cgICAgICAgTExfUkNDX0dldFRJTUNsb2NrU291cmNlXG4KKyAgKiAgICAgICAgIENGR1IzICAgICAgICBUSU0yU1cgICAgICAgIExMX1JDQ19HZXRUSU1DbG9ja1NvdXJjZVxuCisgICogICAgICAgICBDRkdSMyAgICAgICAgVElNMzRTVyAgICAgICBMTF9SQ0NfR2V0VElNQ2xvY2tTb3VyY2UKKyAgKiBAcGFyYW0gIFRJTXggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVElNMV9DTEtTT1VSQ0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVElNMl9DTEtTT1VSQ0UgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1RJTThfQ0xLU09VUkNFICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19USU0xNV9DTEtTT1VSQ0UgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1RJTTE2X0NMS1NPVVJDRSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVElNMTdfQ0xLU09VUkNFICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19USU0yMF9DTEtTT1VSQ0UgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1RJTTM0X0NMS1NPVVJDRSAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVElNMV9DTEtTT1VSQ0VfUENMSzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVElNMV9DTEtTT1VSQ0VfUExMCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1RJTThfQ0xLU09VUkNFX1BDTEsyICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19USU04X0NMS1NPVVJDRV9QTEwgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1RJTTE1X0NMS1NPVVJDRV9QQ0xLMiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVElNMTVfQ0xLU09VUkNFX1BMTCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVElNMTZfQ0xLU09VUkNFX1BDTEsyICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19USU0xNl9DTEtTT1VSQ0VfUExMICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19USU0xN19DTEtTT1VSQ0VfUENMSzIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1RJTTE3X0NMS1NPVVJDRV9QTEwgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1RJTTIwX0NMS1NPVVJDRV9QQ0xLMiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVElNMjBfQ0xLU09VUkNFX1BMTCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVElNMl9DTEtTT1VSQ0VfUENMSzEgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1RJTTJfQ0xLU09VUkNFX1BMTCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVElNMzRfQ0xLU09VUkNFX1BDTEsxICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19USU0zNF9DTEtTT1VSQ0VfUExMICgqKQorICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldFRJTUNsb2NrU291cmNlKHVpbnQzMl90IFRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUjMsIChSQ0NfQ0ZHUjNfVElNMVNXIDw8IFRJTXgpKSB8IChUSU14IDw8IDI3VSkpOworfQorI2VuZGlmIC8qIFJDQ19DRkdSM19USU1TVyAqLworCisjaWYgZGVmaW5lZChIUlRJTTEpCisvKioKKyAgKiBAYnJpZWYgIEdldCBIUlRJTXggY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBDRkdSMyAgICAgICAgSFJUSU1TVyAgICAgICBMTF9SQ0NfR2V0SFJUSU1DbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgSFJUSU14IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0hSVElNMV9DTEtTT1VSQ0UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0hSVElNMV9DTEtTT1VSQ0VfUENMSzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSFJUSU0xX0NMS1NPVVJDRV9QTEwKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0SFJUSU1DbG9ja1NvdXJjZSh1aW50MzJfdCBIUlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUjMsIEhSVElNeCkpOworfQorI2VuZGlmIC8qIEhSVElNMSAqLworCisjaWYgZGVmaW5lZChDRUMpCisvKioKKyAgKiBAYnJpZWYgIEdldCBDRUMgY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBDRkdSMyAgICAgICAgQ0VDU1cgICAgICAgICBMTF9SQ0NfR2V0Q0VDQ2xvY2tTb3VyY2UKKyAgKiBAcGFyYW0gIENFQ3ggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQ0VDX0NMS1NPVVJDRQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQ0VDX0NMS1NPVVJDRV9IU0lfRElWMjQ0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0NFQ19DTEtTT1VSQ0VfTFNFCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldENFQ0Nsb2NrU291cmNlKHVpbnQzMl90IENFQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUjMsIENFQ3gpKTsKK30KKyNlbmRpZiAvKiBDRUMgKi8KKworI2lmIGRlZmluZWQoVVNCKQorLyoqCisgICogQGJyaWVmICBHZXQgVVNCeCBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBVU0JQUkUgICAgICAgIExMX1JDQ19HZXRVU0JDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgVVNCeCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0JfQ0xLU09VUkNFCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0JfQ0xLU09VUkNFX1BMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0JfQ0xLU09VUkNFX1BMTF9ESVZfMV81CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldFVTQkNsb2NrU291cmNlKHVpbnQzMl90IFVTQngpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUiwgVVNCeCkpOworfQorI2VuZGlmIC8qIFVTQiAqLworCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUl9BRENQUkUpCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREN4IGNsb2NrIHNvdXJjZQorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIEFEQ1BSRSAgICAgICAgTExfUkNDX0dldEFEQ0Nsb2NrU291cmNlCisgICogQHBhcmFtICBBREN4IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQ19DTEtTT1VSQ0UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQ19DTEtTUkNfUENMSzJfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDX0NMS1NSQ19QQ0xLMl9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BRENfQ0xLU1JDX1BDTEsyX0RJVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQ19DTEtTUkNfUENMSzJfRElWXzgKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0QURDQ2xvY2tTb3VyY2UodWludDMyX3QgQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DRkdSLCBBREN4KSk7Cit9CisKKyNlbGlmIGRlZmluZWQoUkNDX0NGR1IyX0FEQzFQUkVTKQorLyoqCisgICogQGJyaWVmICBHZXQgQURDeCBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENGR1IyICAgICAgICBBREMxUFJFUyAgICAgIExMX1JDQ19HZXRBRENDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgQURDeCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMxX0NMS1NPVVJDRQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMV9DTEtTUkNfSENMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMxX0NMS1NSQ19QTExfRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMV9DTEtTUkNfUExMX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzFfQ0xLU1JDX1BMTF9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMxX0NMS1NSQ19QTExfRElWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMV9DTEtTUkNfUExMX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzFfQ0xLU1JDX1BMTF9ESVZfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMV9DTEtTUkNfUExMX0RJVl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMxX0NMS1NSQ19QTExfRElWXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzFfQ0xLU1JDX1BMTF9ESVZfMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMV9DTEtTUkNfUExMX0RJVl82NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMxX0NMS1NSQ19QTExfRElWXzEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMxX0NMS1NSQ19QTExfRElWXzI1NgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRBRENDbG9ja1NvdXJjZSh1aW50MzJfdCBBREN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNGR1IyLCBBREN4KSk7Cit9CisKKyNlbGlmIGRlZmluZWQoUkNDX0NGR1IyX0FEQ1BSRTEyKSB8fCBkZWZpbmVkKFJDQ19DRkdSMl9BRENQUkUzNCkKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQ3ggY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBDRkdSMiAgICAgICAgQURDUFJFMTIgICAgICBMTF9SQ0NfR2V0QURDQ2xvY2tTb3VyY2VcbgorICAqICAgICAgICAgQ0ZHUjIgICAgICAgIEFEQ1BSRTM0ICAgICAgTExfUkNDX0dldEFEQ0Nsb2NrU291cmNlCisgICogQHBhcmFtICBBREN4IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzEyX0NMS1NPVVJDRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMzNF9DTEtTT1VSQ0UgKCopCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzEyX0NMS1NSQ19IQ0xLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzEyX0NMS1NSQ19QTExfRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMTJfQ0xLU1JDX1BMTF9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMxMl9DTEtTUkNfUExMX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzEyX0NMS1NSQ19QTExfRElWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMTJfQ0xLU1JDX1BMTF9ESVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMxMl9DTEtTUkNfUExMX0RJVl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMxMl9DTEtTUkNfUExMX0RJVl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMxMl9DTEtTUkNfUExMX0RJVl8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMxMl9DTEtTUkNfUExMX0RJVl8zMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMxMl9DTEtTUkNfUExMX0RJVl82NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMxMl9DTEtTUkNfUExMX0RJVl8xMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMTJfQ0xLU1JDX1BMTF9ESVZfMjU2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzM0X0NMS1NSQ19IQ0xLICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMzNF9DTEtTUkNfUExMX0RJVl8xICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMzNF9DTEtTUkNfUExMX0RJVl8yICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMzNF9DTEtTUkNfUExMX0RJVl80ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMzNF9DTEtTUkNfUExMX0RJVl82ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMzNF9DTEtTUkNfUExMX0RJVl84ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMzNF9DTEtTUkNfUExMX0RJVl8xMCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMzRfQ0xLU1JDX1BMTF9ESVZfMTIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzM0X0NMS1NSQ19QTExfRElWXzE2ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMzNF9DTEtTUkNfUExMX0RJVl8zMiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMzRfQ0xLU1JDX1BMTF9ESVZfNjQgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzM0X0NMS1NSQ19QTExfRElWXzEyOCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMzRfQ0xLU1JDX1BMTF9ESVZfMjU2ICgqKQorICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldEFEQ0Nsb2NrU291cmNlKHVpbnQzMl90IEFEQ3gpCit7CisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjJfQURDUFJFMzQpCisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUjIsIEFEQ3gpIHwgKEFEQ3ggPDwgMTZVKSk7CisjZWxzZQorICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNGR1IyLCBBREN4KSk7CisjZW5kaWYgLypSQ0NfQ0ZHUjJfQURDUFJFMzQqLworfQorI2VuZGlmIC8qIFJDQ19DRkdSX0FEQ1BSRSAqLworCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUl9TRFBSRSkKKy8qKgorICAqIEBicmllZiAgR2V0IFNEQURDeCBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBTRFBSRSAgICAgIExMX1JDQ19HZXRTREFEQ0Nsb2NrU291cmNlCisgICogQHBhcmFtICBTREFEQ3ggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU0RBRENfQ0xLU09VUkNFCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TREFEQ19DTEtTUkNfU1lTX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NEQURDX0NMS1NSQ19TWVNfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TREFEQ19DTEtTUkNfU1lTX0RJVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NEQURDX0NMS1NSQ19TWVNfRElWXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfMjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfMjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfMzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfNDAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfNDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU0RBRENfQ0xLU1JDX1NZU19ESVZfNDgKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0U0RBRENDbG9ja1NvdXJjZSh1aW50MzJfdCBTREFEQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUiwgU0RBREN4KSk7Cit9CisjZW5kaWYgLyogUkNDX0NGR1JfU0RQUkUgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUZfUlRDIFJUQworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IFJUQyBDbG9jayBTb3VyY2UKKyAgKiBAbm90ZSBPbmNlIHRoZSBSVEMgY2xvY2sgc291cmNlIGhhcyBiZWVuIHNlbGVjdGVkLCBpdCBjYW5ub3QgYmUgY2hhbmdlZCBhbnkgbW9yZSB1bmxlc3MKKyAgKiAgICAgICB0aGUgQmFja3VwIGRvbWFpbiBpcyByZXNldC4gVGhlIEJEUlNUIGJpdCBjYW4gYmUgdXNlZCB0byByZXNldCB0aGVtLgorICAqIEBybXRvbGwgQkRDUiAgICAgICAgIFJUQ1NFTCAgICAgICAgTExfUkNDX1NldFJUQ0Nsb2NrU291cmNlCisgICogQHBhcmFtICBTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUlRDX0NMS1NPVVJDRV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JUQ19DTEtTT1VSQ0VfTFNFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JUQ19DTEtTT1VSQ0VfTFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JUQ19DTEtTT1VSQ0VfSFNFX0RJVjMyCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0UlRDQ2xvY2tTb3VyY2UodWludDMyX3QgU291cmNlKQoreworICBNT0RJRllfUkVHKFJDQy0+QkRDUiwgUkNDX0JEQ1JfUlRDU0VMLCBTb3VyY2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBSVEMgQ2xvY2sgU291cmNlCisgICogQHJtdG9sbCBCRENSICAgICAgICAgUlRDU0VMICAgICAgICBMTF9SQ0NfR2V0UlRDQ2xvY2tTb3VyY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JUQ19DTEtTT1VSQ0VfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19SVENfQ0xLU09VUkNFX0xTRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19SVENfQ0xLU09VUkNFX0xTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19SVENfQ0xLU09VUkNFX0hTRV9ESVYzMgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRSVENDbG9ja1NvdXJjZSh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX1JUQ1NFTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSVEMKKyAgKiBAcm10b2xsIEJEQ1IgICAgICAgICBSVENFTiAgICAgICAgIExMX1JDQ19FbmFibGVSVEMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19FbmFibGVSVEModm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX1JUQ0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFJUQworICAqIEBybXRvbGwgQkRDUiAgICAgICAgIFJUQ0VOICAgICAgICAgTExfUkNDX0Rpc2FibGVSVEMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19EaXNhYmxlUlRDKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX1JUQ0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSVEMgaGFzIGJlZW4gZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIEJEQ1IgICAgICAgICBSVENFTiAgICAgICAgIExMX1JDQ19Jc0VuYWJsZWRSVEMKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNFbmFibGVkUlRDKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9SVENFTikgPT0gKFJDQ19CRENSX1JUQ0VOKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRm9yY2UgdGhlIEJhY2t1cCBkb21haW4gcmVzZXQKKyAgKiBAcm10b2xsIEJEQ1IgICAgICAgICBCRFJTVCAgICAgICAgIExMX1JDQ19Gb3JjZUJhY2t1cERvbWFpblJlc2V0CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRm9yY2VCYWNrdXBEb21haW5SZXNldCh2b2lkKQoreworICBTRVRfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfQkRSU1QpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlbGVhc2UgdGhlIEJhY2t1cCBkb21haW4gcmVzZXQKKyAgKiBAcm10b2xsIEJEQ1IgICAgICAgICBCRFJTVCAgICAgICAgIExMX1JDQ19SZWxlYXNlQmFja3VwRG9tYWluUmVzZXQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19SZWxlYXNlQmFja3VwRG9tYWluUmVzZXQodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfQkRSU1QpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9QTEwgUExMCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUExMCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgUExMT04gICAgICAgICBMTF9SQ0NfUExMX0VuYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1BMTF9FbmFibGUodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfUExMT04pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUExMCisgICogQG5vdGUgQ2Fubm90IGJlIGRpc2FibGVkIGlmIHRoZSBQTEwgY2xvY2sgaXMgdXNlZCBhcyB0aGUgc3lzdGVtIGNsb2NrCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgUExMT04gICAgICAgICBMTF9SQ0NfUExMX0Rpc2FibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExfRGlzYWJsZSh2b2lkKQoreworICBDTEVBUl9CSVQoUkNDLT5DUiwgUkNDX0NSX1BMTE9OKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBQTEwgUmVhZHkKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBQTExSRFkgICAgICAgIExMX1JDQ19QTExfSXNSZWFkeQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19QTExfSXNSZWFkeSh2b2lkKQoreworICByZXR1cm4gKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9QTExSRFkpID09IChSQ0NfQ1JfUExMUkRZKSk7Cit9CisKKyNpZiBkZWZpbmVkKFJDQ19QTExTUkNfUFJFRElWMV9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgUExMIHVzZWQgZm9yIFNZU0NMSyBEb21haW4KKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBQTExTUkMgICAgICAgIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1NZU1xuCisgICogICAgICAgICBDRkdSICAgICAgICAgUExMTVVMICAgICAgICBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl9TWVNcbgorICAqICAgICAgICAgQ0ZHUjIgICAgICAgIFBSRURJViAgICAgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fU1lTCisgICogQHBhcmFtICBTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX0hTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNFCisgICogQHBhcmFtICBQTExNdWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzE2CisgICogQHBhcmFtICBQTExEaXYgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUFJFRElWX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BSRURJVl9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QUkVESVZfRElWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUFJFRElWX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BSRURJVl9ESVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QUkVESVZfRElWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUFJFRElWX0RJVl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BSRURJVl9ESVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QUkVESVZfRElWXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUFJFRElWX0RJVl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QUkVESVZfRElWXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BSRURJVl9ESVZfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUFJFRElWX0RJVl8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QUkVESVZfRElWXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BSRURJVl9ESVZfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUFJFRElWX0RJVl8xNgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1BMTF9Db25maWdEb21haW5fU1lTKHVpbnQzMl90IFNvdXJjZSwgdWludDMyX3QgUExMTXVsLCB1aW50MzJfdCBQTExEaXYpCit7CisgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9QTExTUkMgfCBSQ0NfQ0ZHUl9QTExNVUwsIFNvdXJjZSB8IFBMTE11bCk7CisgIE1PRElGWV9SRUcoUkNDLT5DRkdSMiwgUkNDX0NGR1IyX1BSRURJViwgUExMRGl2KTsKK30KKworI2Vsc2UKKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgUExMIHVzZWQgZm9yIFNZU0NMSyBEb21haW4KKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBQTExTUkMgICAgICAgIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1NZU1xuCisgICogICAgICAgICBDRkdSICAgICAgICAgUExMTVVMICAgICAgICBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl9TWVNcbgorICAqICAgICAgICAgQ0ZHUjIgICAgICAgIFBSRURJViAgICAgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fU1lTCisgICogQHBhcmFtICBTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX0hTSV9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNFX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9IU0VfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX0hTRV9ESVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNFX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9IU0VfRElWXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX0hTRV9ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNFX0RJVl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9IU0VfRElWXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX0hTRV9ESVZfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNFX0RJVl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNFX0RJVl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNFX0RJVl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNFX0RJVl8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNFX0RJVl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNFX0RJVl8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNFX0RJVl8xNgorICAqIEBwYXJhbSAgUExMTXVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF8xNgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1BMTF9Db25maWdEb21haW5fU1lTKHVpbnQzMl90IFNvdXJjZSwgdWludDMyX3QgUExMTXVsKQoreworICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfUExMU1JDIHwgUkNDX0NGR1JfUExMTVVMLCAoU291cmNlICYgUkNDX0NGR1JfUExMU1JDKSB8IFBMTE11bCk7CisgIE1PRElGWV9SRUcoUkNDLT5DRkdSMiwgUkNDX0NGR1IyX1BSRURJViwgKFNvdXJjZSAmIFJDQ19DRkdSMl9QUkVESVYpKTsKK30KKyNlbmRpZiAvKiBSQ0NfUExMU1JDX1BSRURJVjFfU1VQUE9SVCAqLworCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgb3NjaWxsYXRvciB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UuCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgUExMU1JDICAgICAgICBMTF9SQ0NfUExMX0dldE1haW5Tb3VyY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9IU0kgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9IU0lfRElWXzIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9IU0UKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX1BMTF9HZXRNYWluU291cmNlKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfUExMU1JDKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFBMTCBtdWx0aXBsaWNhdGlvbiBGYWN0b3IKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBQTExNVUwgICAgICAgIExMX1JDQ19QTExfR2V0TXVsdGlwbGljYXRvcgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzE2CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX1BMTF9HZXRNdWx0aXBsaWNhdG9yKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfUExMTVVMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFBSRURJViBkaXZpc2lvbiBmYWN0b3IgZm9yIHRoZSBtYWluIFBMTAorICAqIEBub3RlIFRoZXkgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIHRoZSBQTEwgaXMgZGlzYWJsZWQKKyAgKiBAcm10b2xsIENGR1IyICAgICAgICBQUkVESVYgICAgICAgIExMX1JDQ19QTExfR2V0UHJlZGl2CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QUkVESVZfRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUFJFRElWX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BSRURJVl9ESVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QUkVESVZfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUFJFRElWX0RJVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BSRURJVl9ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QUkVESVZfRElWXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUFJFRElWX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BSRURJVl9ESVZfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QUkVESVZfRElWXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BSRURJVl9ESVZfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUFJFRElWX0RJVl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QUkVESVZfRElWXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BSRURJVl9ESVZfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUFJFRElWX0RJVl8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QUkVESVZfRElWXzE2CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX1BMTF9HZXRQcmVkaXYodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DRkdSMiwgUkNDX0NGR1IyX1BSRURJVikpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9GTEFHX01hbmFnZW1lbnQgRkxBRyBNYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDbGVhciBMU0kgcmVhZHkgaW50ZXJydXB0IGZsYWcKKyAgKiBAcm10b2xsIENJUiAgICAgICAgIExTSVJEWUMgICAgICAgTExfUkNDX0NsZWFyRmxhZ19MU0lSRFkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19DbGVhckZsYWdfTFNJUkRZKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DSVIsIFJDQ19DSVJfTFNJUkRZQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgTFNFIHJlYWR5IGludGVycnVwdCBmbGFnCisgICogQHJtdG9sbCBDSVIgICAgICAgICBMU0VSRFlDICAgICAgIExMX1JDQ19DbGVhckZsYWdfTFNFUkRZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfQ2xlYXJGbGFnX0xTRVJEWSh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q0lSLCBSQ0NfQ0lSX0xTRVJEWUMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIEhTSSByZWFkeSBpbnRlcnJ1cHQgZmxhZworICAqIEBybXRvbGwgQ0lSICAgICAgICAgSFNJUkRZQyAgICAgICBMTF9SQ0NfQ2xlYXJGbGFnX0hTSVJEWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0NsZWFyRmxhZ19IU0lSRFkodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNJUiwgUkNDX0NJUl9IU0lSRFlDKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBIU0UgcmVhZHkgaW50ZXJydXB0IGZsYWcKKyAgKiBAcm10b2xsIENJUiAgICAgICAgIEhTRVJEWUMgICAgICAgTExfUkNDX0NsZWFyRmxhZ19IU0VSRFkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19DbGVhckZsYWdfSFNFUkRZKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DSVIsIFJDQ19DSVJfSFNFUkRZQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgUExMIHJlYWR5IGludGVycnVwdCBmbGFnCisgICogQHJtdG9sbCBDSVIgICAgICAgICBQTExSRFlDICAgICAgIExMX1JDQ19DbGVhckZsYWdfUExMUkRZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfQ2xlYXJGbGFnX1BMTFJEWSh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q0lSLCBSQ0NfQ0lSX1BMTFJEWUMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENsb2NrIHNlY3VyaXR5IHN5c3RlbSBpbnRlcnJ1cHQgZmxhZworICAqIEBybXRvbGwgQ0lSICAgICAgICAgQ1NTQyAgICAgICAgICBMTF9SQ0NfQ2xlYXJGbGFnX0hTRUNTUworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0NsZWFyRmxhZ19IU0VDU1Modm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNJUiwgUkNDX0NJUl9DU1NDKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBMU0kgcmVhZHkgaW50ZXJydXB0IG9jY3VycmVkIG9yIG5vdAorICAqIEBybXRvbGwgQ0lSICAgICAgICAgTFNJUkRZRiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX0xTSVJEWQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfTFNJUkRZKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoUkNDLT5DSVIsIFJDQ19DSVJfTFNJUkRZRikgPT0gKFJDQ19DSVJfTFNJUkRZRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIExTRSByZWFkeSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90CisgICogQHJtdG9sbCBDSVIgICAgICAgICBMU0VSRFlGICAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfTFNFUkRZCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19MU0VSRFkodm9pZCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChSQ0MtPkNJUiwgUkNDX0NJUl9MU0VSRFlGKSA9PSAoUkNDX0NJUl9MU0VSRFlGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgSFNJIHJlYWR5IGludGVycnVwdCBvY2N1cnJlZCBvciBub3QKKyAgKiBAcm10b2xsIENJUiAgICAgICAgIEhTSVJEWUYgICAgICAgTExfUkNDX0lzQWN0aXZlRmxhZ19IU0lSRFkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX0hTSVJEWSh2b2lkKQoreworICByZXR1cm4gKFJFQURfQklUKFJDQy0+Q0lSLCBSQ0NfQ0lSX0hTSVJEWUYpID09IChSQ0NfQ0lSX0hTSVJEWUYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBIU0UgcmVhZHkgaW50ZXJydXB0IG9jY3VycmVkIG9yIG5vdAorICAqIEBybXRvbGwgQ0lSICAgICAgICAgSFNFUkRZRiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX0hTRVJEWQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfSFNFUkRZKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoUkNDLT5DSVIsIFJDQ19DSVJfSFNFUkRZRikgPT0gKFJDQ19DSVJfSFNFUkRZRikpOworfQorCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUl9NQ09GKQorLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBzd2l0Y2ggdG8gbmV3IE1DTyBzb3VyY2UgaXMgZWZmZWN0aXZlIG9yIG5vdAorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIE1DT0YgICAgICAgICAgTExfUkNDX0lzQWN0aXZlRmxhZ19NQ08xCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19NQ08xKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9NQ09GKSA9PSAoUkNDX0NGR1JfTUNPRikpOworfQorI2VuZGlmIC8qIFJDQ19DRkdSX01DT0YgKi8KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBQTEwgcmVhZHkgaW50ZXJydXB0IG9jY3VycmVkIG9yIG5vdAorICAqIEBybXRvbGwgQ0lSICAgICAgICAgUExMUkRZRiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX1BMTFJEWQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfUExMUkRZKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoUkNDLT5DSVIsIFJDQ19DSVJfUExMUkRZRikgPT0gKFJDQ19DSVJfUExMUkRZRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIENsb2NrIHNlY3VyaXR5IHN5c3RlbSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90CisgICogQHJtdG9sbCBDSVIgICAgICAgICBDU1NGICAgICAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfSFNFQ1NTCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19IU0VDU1Modm9pZCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChSQ0MtPkNJUiwgUkNDX0NJUl9DU1NGKSA9PSAoUkNDX0NJUl9DU1NGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUkNDIGZsYWcgSW5kZXBlbmRlbnQgV2F0Y2hkb2cgcmVzZXQgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcm10b2xsIENTUiAgICAgICAgICBJV0RHUlNURiAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfSVdER1JTVAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfSVdER1JTVCh2b2lkKQoreworICByZXR1cm4gKFJFQURfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0lXREdSU1RGKSA9PSAoUkNDX0NTUl9JV0RHUlNURikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFJDQyBmbGFnIExvdyBQb3dlciByZXNldCBpcyBzZXQgb3Igbm90LgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgIExQV1JSU1RGICAgICAgTExfUkNDX0lzQWN0aXZlRmxhZ19MUFdSUlNUCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19MUFdSUlNUKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfTFBXUlJTVEYpID09IChSQ0NfQ1NSX0xQV1JSU1RGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUkNDIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcm10b2xsIENTUiAgICAgICAgICBPQkxSU1RGICAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfT0JMUlNUCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19PQkxSU1Qodm9pZCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9PQkxSU1RGKSA9PSAoUkNDX0NTUl9PQkxSU1RGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUkNDIGZsYWcgUGluIHJlc2V0IGlzIHNldCBvciBub3QuCisgICogQHJtdG9sbCBDU1IgICAgICAgICAgUElOUlNURiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX1BJTlJTVAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfUElOUlNUKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfUElOUlNURikgPT0gKFJDQ19DU1JfUElOUlNURikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFJDQyBmbGFnIFBPUi9QRFIgcmVzZXQgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcm10b2xsIENTUiAgICAgICAgICBQT1JSU1RGICAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfUE9SUlNUCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19QT1JSU1Qodm9pZCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9QT1JSU1RGKSA9PSAoUkNDX0NTUl9QT1JSU1RGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUkNDIGZsYWcgU29mdHdhcmUgcmVzZXQgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcm10b2xsIENTUiAgICAgICAgICBTRlRSU1RGICAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfU0ZUUlNUCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19TRlRSU1Qodm9pZCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9TRlRSU1RGKSA9PSAoUkNDX0NTUl9TRlRSU1RGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUkNDIGZsYWcgV2luZG93IFdhdGNoZG9nIHJlc2V0IGlzIHNldCBvciBub3QuCisgICogQHJtdG9sbCBDU1IgICAgICAgICAgV1dER1JTVEYgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX1dXREdSU1QKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX1dXREdSU1Qodm9pZCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9XV0RHUlNURikgPT0gKFJDQ19DU1JfV1dER1JTVEYpKTsKK30KKworI2lmIGRlZmluZWQoUkNDX0NTUl9WMThQV1JSU1RGKQorLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSQ0MgUmVzZXQgZmxhZyBvZiB0aGUgMS44IFYgZG9tYWluIGlzIHNldCBvciBub3QuCisgICogQHJtdG9sbCBDU1IgICAgICAgICAgVjE4UFdSUlNURiAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX1YxOFBXUlJTVAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfVjE4UFdSUlNUKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfVjE4UFdSUlNURikgPT0gKFJDQ19DU1JfVjE4UFdSUlNURikpOworfQorI2VuZGlmIC8qIFJDQ19DU1JfVjE4UFdSUlNURiAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBSTVZGIGJpdCB0byBjbGVhciB0aGUgcmVzZXQgZmxhZ3MuCisgICogQHJtdG9sbCBDU1IgICAgICAgICAgUk1WRiAgICAgICAgICBMTF9SQ0NfQ2xlYXJSZXNldEZsYWdzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfQ2xlYXJSZXNldEZsYWdzKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfUk1WRik7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX0lUX01hbmFnZW1lbnQgSVQgTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIExTSSByZWFkeSBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENJUiAgICAgICAgIExTSVJEWUlFICAgICAgTExfUkNDX0VuYWJsZUlUX0xTSVJEWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0VuYWJsZUlUX0xTSVJEWSh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q0lSLCBSQ0NfQ0lSX0xTSVJEWUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgTFNFIHJlYWR5IGludGVycnVwdAorICAqIEBybXRvbGwgQ0lSICAgICAgICAgTFNFUkRZSUUgICAgICBMTF9SQ0NfRW5hYmxlSVRfTFNFUkRZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRW5hYmxlSVRfTFNFUkRZKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DSVIsIFJDQ19DSVJfTFNFUkRZSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBIU0kgcmVhZHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDSVIgICAgICAgICBIU0lSRFlJRSAgICAgIExMX1JDQ19FbmFibGVJVF9IU0lSRFkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19FbmFibGVJVF9IU0lSRFkodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNJUiwgUkNDX0NJUl9IU0lSRFlJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEhTRSByZWFkeSBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENJUiAgICAgICAgIEhTRVJEWUlFICAgICAgTExfUkNDX0VuYWJsZUlUX0hTRVJEWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0VuYWJsZUlUX0hTRVJEWSh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q0lSLCBSQ0NfQ0lSX0hTRVJEWUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUExMIHJlYWR5IGludGVycnVwdAorICAqIEBybXRvbGwgQ0lSICAgICAgICAgUExMUkRZSUUgICAgICBMTF9SQ0NfRW5hYmxlSVRfUExMUkRZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRW5hYmxlSVRfUExMUkRZKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DSVIsIFJDQ19DSVJfUExMUkRZSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgTFNJIHJlYWR5IGludGVycnVwdAorICAqIEBybXRvbGwgQ0lSICAgICAgICAgTFNJUkRZSUUgICAgICBMTF9SQ0NfRGlzYWJsZUlUX0xTSVJEWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0Rpc2FibGVJVF9MU0lSRFkodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q0lSLCBSQ0NfQ0lSX0xTSVJEWUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIExTRSByZWFkeSBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENJUiAgICAgICAgIExTRVJEWUlFICAgICAgTExfUkNDX0Rpc2FibGVJVF9MU0VSRFkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19EaXNhYmxlSVRfTFNFUkRZKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPkNJUiwgUkNDX0NJUl9MU0VSRFlJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBIU0kgcmVhZHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDSVIgICAgICAgICBIU0lSRFlJRSAgICAgIExMX1JDQ19EaXNhYmxlSVRfSFNJUkRZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRGlzYWJsZUlUX0hTSVJEWSh2b2lkKQoreworICBDTEVBUl9CSVQoUkNDLT5DSVIsIFJDQ19DSVJfSFNJUkRZSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgSFNFIHJlYWR5IGludGVycnVwdAorICAqIEBybXRvbGwgQ0lSICAgICAgICAgSFNFUkRZSUUgICAgICBMTF9SQ0NfRGlzYWJsZUlUX0hTRVJEWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0Rpc2FibGVJVF9IU0VSRFkodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q0lSLCBSQ0NfQ0lSX0hTRVJEWUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFBMTCByZWFkeSBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENJUiAgICAgICAgIFBMTFJEWUlFICAgICAgTExfUkNDX0Rpc2FibGVJVF9QTExSRFkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19EaXNhYmxlSVRfUExMUkRZKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPkNJUiwgUkNDX0NJUl9QTExSRFlJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2tzIGlmIExTSSByZWFkeSBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDSVIgICAgICAgICBMU0lSRFlJRSAgICAgIExMX1JDQ19Jc0VuYWJsZWRJVF9MU0lSRFkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNFbmFibGVkSVRfTFNJUkRZKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoUkNDLT5DSVIsIFJDQ19DSVJfTFNJUkRZSUUpID09IChSQ0NfQ0lSX0xTSVJEWUlFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2tzIGlmIExTRSByZWFkeSBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDSVIgICAgICAgICBMU0VSRFlJRSAgICAgIExMX1JDQ19Jc0VuYWJsZWRJVF9MU0VSRFkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNFbmFibGVkSVRfTFNFUkRZKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoUkNDLT5DSVIsIFJDQ19DSVJfTFNFUkRZSUUpID09IChSQ0NfQ0lSX0xTRVJEWUlFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2tzIGlmIEhTSSByZWFkeSBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDSVIgICAgICAgICBIU0lSRFlJRSAgICAgIExMX1JDQ19Jc0VuYWJsZWRJVF9IU0lSRFkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNFbmFibGVkSVRfSFNJUkRZKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoUkNDLT5DSVIsIFJDQ19DSVJfSFNJUkRZSUUpID09IChSQ0NfQ0lSX0hTSVJEWUlFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2tzIGlmIEhTRSByZWFkeSBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDSVIgICAgICAgICBIU0VSRFlJRSAgICAgIExMX1JDQ19Jc0VuYWJsZWRJVF9IU0VSRFkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNFbmFibGVkSVRfSFNFUkRZKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoUkNDLT5DSVIsIFJDQ19DSVJfSFNFUkRZSUUpID09IChSQ0NfQ0lSX0hTRVJEWUlFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2tzIGlmIFBMTCByZWFkeSBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDSVIgICAgICAgICBQTExSRFlJRSAgICAgIExMX1JDQ19Jc0VuYWJsZWRJVF9QTExSRFkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNFbmFibGVkSVRfUExMUkRZKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoUkNDLT5DSVIsIFJDQ19DSVJfUExMUkRZSUUpID09IChSQ0NfQ0lSX1BMTFJEWUlFKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX0luaXQgRGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KKyAgKiBAeworICAqLworRXJyb3JTdGF0dXMgTExfUkNDX0RlSW5pdCh2b2lkKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX0dldF9GcmVxIEdldCBzeXN0ZW0gYW5kIHBlcmlwaGVyYWxzIGNsb2NrcyBmcmVxdWVuY3kgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3ZvaWQgICAgICAgIExMX1JDQ19HZXRTeXN0ZW1DbG9ja3NGcmVxKExMX1JDQ19DbG9ja3NUeXBlRGVmICpSQ0NfQ2xvY2tzKTsKK3VpbnQzMl90ICAgIExMX1JDQ19HZXRVU0FSVENsb2NrRnJlcSh1aW50MzJfdCBVU0FSVHhTb3VyY2UpOworI2lmIGRlZmluZWQoVUFSVDQpIHx8IGRlZmluZWQoVUFSVDUpCit1aW50MzJfdCAgICBMTF9SQ0NfR2V0VUFSVENsb2NrRnJlcSh1aW50MzJfdCBVQVJUeFNvdXJjZSk7CisjZW5kaWYgLyogVUFSVDQgfHwgVUFSVDUgKi8KK3VpbnQzMl90ICAgIExMX1JDQ19HZXRJMkNDbG9ja0ZyZXEodWludDMyX3QgSTJDeFNvdXJjZSk7CisjaWYgZGVmaW5lZChSQ0NfQ0ZHUl9JMlNTUkMpCit1aW50MzJfdCAgICBMTF9SQ0NfR2V0STJTQ2xvY2tGcmVxKHVpbnQzMl90IEkyU3hTb3VyY2UpOworI2VuZGlmIC8qIFJDQ19DRkdSX0kyU1NSQyAqLworI2lmIGRlZmluZWQoVVNCX09UR19GUykgfHwgZGVmaW5lZChVU0IpCit1aW50MzJfdCAgICBMTF9SQ0NfR2V0VVNCQ2xvY2tGcmVxKHVpbnQzMl90IFVTQnhTb3VyY2UpOworI2VuZGlmIC8qIFVTQl9PVEdfRlMgfHwgVVNCICovCisjaWYgKGRlZmluZWQoUkNDX0NGR1JfQURDUFJFKSB8fCBkZWZpbmVkKFJDQ19DRkdSMl9BREMxUFJFUykgfHwgZGVmaW5lZChSQ0NfQ0ZHUjJfQURDUFJFMTIpIHx8IGRlZmluZWQoUkNDX0NGR1IyX0FEQ1BSRTM0KSkKK3VpbnQzMl90ICAgIExMX1JDQ19HZXRBRENDbG9ja0ZyZXEodWludDMyX3QgQURDeFNvdXJjZSk7CisjZW5kaWYgLypSQ0NfQ0ZHUl9BRENQUkUgfHwgUkNDX0NGR1IyX0FEQzFQUkVTIHx8IFJDQ19DRkdSMl9BRENQUkUxMiB8fCBSQ0NfQ0ZHUjJfQURDUFJFMzQgKi8KKyNpZiBkZWZpbmVkKFJDQ19DRkdSX1NEUFJFKQordWludDMyX3QgICAgTExfUkNDX0dldFNEQURDQ2xvY2tGcmVxKHVpbnQzMl90IFNEQURDeFNvdXJjZSk7CisjZW5kaWYgLypSQ0NfQ0ZHUl9TRFBSRSAqLworI2lmIGRlZmluZWQoQ0VDKQordWludDMyX3QgICAgTExfUkNDX0dldENFQ0Nsb2NrRnJlcSh1aW50MzJfdCBDRUN4U291cmNlKTsKKyNlbmRpZiAvKiBDRUMgKi8KKyNpZiBkZWZpbmVkKFJDQ19DRkdSM19USU1TVykKK3VpbnQzMl90ICAgIExMX1JDQ19HZXRUSU1DbG9ja0ZyZXEodWludDMyX3QgVElNeFNvdXJjZSk7CisjZW5kaWYgLypSQ0NfQ0ZHUjNfVElNU1cqLwordWludDMyX3QgICAgTExfUkNDX0dldEhSVElNQ2xvY2tGcmVxKHVpbnQzMl90IEhSVElNeFNvdXJjZSk7CisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogUkNDICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyRjN4eF9MTF9SQ0NfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjN4eF9sbF9ydGMuaCBiL0luYy9zdG0zMmYzeHhfbGxfcnRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFhNDQzNQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmYzeHhfbGxfcnRjLmgKQEAgLTAsMCArMSwzNzUyIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2xsX3J0Yy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBSVEMgTEwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkYzeHhfTExfUlRDX0gKKyNkZWZpbmUgX19TVE0zMkYzeHhfTExfUlRDX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKFJUQykKKworLyoqIEBkZWZncm91cCBSVENfTEwgUlRDCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSVENfTExfUHJpdmF0ZV9Db25zdGFudHMgUlRDIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKy8qIE1hc2tzIERlZmluaXRpb24gKi8KKyNkZWZpbmUgUlRDX0lOSVRfTUFTSyAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRlUKKyNkZWZpbmUgUlRDX1JTRl9NQVNLICAgICAgICAgICAgICAgICAgMHhGRkZGRkY1RlUKKworLyogV3JpdGUgcHJvdGVjdGlvbiBkZWZpbmVzICovCisjZGVmaW5lIFJUQ19XUklURV9QUk9URUNUSU9OX0RJU0FCTEUgICgodWludDhfdCkweEZGVSkKKyNkZWZpbmUgUlRDX1dSSVRFX1BST1RFQ1RJT05fRU5BQkxFXzEgKCh1aW50OF90KTB4Q0FVKQorI2RlZmluZSBSVENfV1JJVEVfUFJPVEVDVElPTl9FTkFCTEVfMiAoKHVpbnQ4X3QpMHg1M1UpCisKKy8qIERlZmluZXMgdXNlZCB0byBjb21iaW5lIGRhdGUgJiB0aW1lICovCisjZGVmaW5lIFJUQ19PRkZTRVRfV0VFS0RBWSAgICAgICAgICAgIDI0VQorI2RlZmluZSBSVENfT0ZGU0VUX0RBWSAgICAgICAgICAgICAgICAxNlUKKyNkZWZpbmUgUlRDX09GRlNFVF9NT05USCAgICAgICAgICAgICAgOFUKKyNkZWZpbmUgUlRDX09GRlNFVF9IT1VSICAgICAgICAgICAgICAgMTZVCisjZGVmaW5lIFJUQ19PRkZTRVRfTUlOVVRFICAgICAgICAgICAgIDhVCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIFJUQ19MTF9Qcml2YXRlX01hY3JvcyBSVEMgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FU19JTklUIFJUQyBFeHBvcnRlZCBJbml0IHN0cnVjdHVyZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUlRDIEluaXQgc3RydWN0dXJlcyBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBIb3VyRm9ybWF0OyAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgSG91cnMgRm9ybWF0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENfTExfRUNfSE9VUkZPUk1BVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9SVENfU2V0SG91ckZvcm1hdCgpLiAqLworCisgIHVpbnQzMl90IEFzeW5jaFByZXNjYWxlcjsgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBBc3luY2hyb25vdXMgUHJlZGl2aWRlciB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHg3RgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9SVENfU2V0QXN5bmNoUHJlc2NhbGVyKCkuICovCisKKyAgdWludDMyX3QgU3luY2hQcmVzY2FsZXI7ICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIFN5bmNocm9ub3VzIFByZWRpdmlkZXIgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9IDB4N0ZGRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9SVENfU2V0U3luY2hQcmVzY2FsZXIoKS4gKi8KK30gTExfUlRDX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFJUQyBUaW1lIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBUaW1lRm9ybWF0OyAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIEFNL1BNIFRpbWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENfTExfRUNfVElNRV9GT1JNQVQKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfUlRDX1RJTUVfU2V0Rm9ybWF0KCkuICovCisKKyAgdWludDhfdCBIb3VyczsgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBUaW1lIEhvdXJzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMTIgaWYgdGhlIEByZWYgTExfUlRDX1RJTUVfRk9STUFUX1BNIGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMjMgaWYgdGhlIEByZWYgTExfUlRDX1RJTUVfRk9STUFUX0FNX09SXzI0IGlzIHNlbGVjdGVkLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9SVENfVElNRV9TZXRIb3VyKCkuICovCisKKyAgdWludDhfdCBNaW51dGVzOyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBUaW1lIE1pbnV0ZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSA1OQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9SVENfVElNRV9TZXRNaW51dGUoKS4gKi8KKworICB1aW50OF90IFNlY29uZHM7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIFRpbWUgU2Vjb25kcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDU5CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1JUQ19USU1FX1NldFNlY29uZCgpLiAqLworfSBMTF9SVENfVGltZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgUlRDIERhdGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQ4X3QgV2Vla0RheTsgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgRGF0ZSBXZWVrRGF5LgorICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDX0xMX0VDX1dFRUtEQVkKKworICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfUlRDX0RBVEVfU2V0V2Vla0RheSgpLiAqLworCisgIHVpbnQ4X3QgTW9udGg7ICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgRGF0ZSBNb250aC4KKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19MTF9FQ19NT05USAorCisgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9SVENfREFURV9TZXRNb250aCgpLiAqLworCisgIHVpbnQ4X3QgRGF5OyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgRGF0ZSBEYXkuCisgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMSBhbmQgTWF4X0RhdGEgPSAzMQorCisgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9SVENfREFURV9TZXREYXkoKS4gKi8KKworICB1aW50OF90IFllYXI7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIERhdGUgWWVhci4KKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDk5CisKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1JUQ19EQVRFX1NldFllYXIoKS4gKi8KK30gTExfUlRDX0RhdGVUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFJUQyBBbGFybSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgTExfUlRDX1RpbWVUeXBlRGVmIEFsYXJtVGltZTsgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgQWxhcm0gVGltZSBtZW1iZXJzLiAqLworCisgIHVpbnQzMl90IEFsYXJtTWFzazsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIEFsYXJtIE1hc2tzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19MTF9FQ19BTE1BX01BU0sgZm9yIEFMQVJNIEEgb3IgQHJlZiBSVENfTExfRUNfQUxNQl9NQVNLIGZvciBBTEFSTSBCLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfUlRDX0FMTUFfU2V0TWFzaygpIGZvciBBTEFSTSBBIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBAcmVmIExMX1JUQ19BTE1CX1NldE1hc2soKSBmb3IgQUxBUk0gQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBBbGFybURhdGVXZWVrRGF5U2VsOyAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBBbGFybSBpcyBvbiBkYXkgb3IgV2Vla0RheS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENfTExfRUNfQUxNQV9XRUVLREFZX1NFTEVDVElPTiBmb3IgQUxBUk0gQSBvciBAcmVmIFJUQ19MTF9FQ19BTE1CX1dFRUtEQVlfU0VMRUNUSU9OIGZvciBBTEFSTSBCCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9SVENfQUxNQV9FbmFibGVXZWVrZGF5KCkgb3IgQHJlZiBMTF9SVENfQUxNQV9EaXNhYmxlV2Vla2RheSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBBTEFSTSBBIG9yIEByZWYgTExfUlRDX0FMTUJfRW5hYmxlV2Vla2RheSgpIG9yIEByZWYgTExfUlRDX0FMTUJfRGlzYWJsZVdlZWtkYXkoKSBmb3IgQUxBUk0gQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICB1aW50OF90IEFsYXJtRGF0ZVdlZWtEYXk7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBBbGFybSBEYXkvV2Vla0RheS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgQWxhcm1EYXRlV2Vla0RheVNlbCBzZXQgdG8gZGF5LCB0aGlzIHBhcmFtZXRlciAgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMSBhbmQgTWF4X0RhdGEgPSAzMS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1JUQ19BTE1BX1NldERheSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBBTEFSTSBBIG9yIEByZWYgTExfUlRDX0FMTUJfU2V0RGF5KCkgZm9yIEFMQVJNIEIuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgQWxhcm1EYXRlV2Vla0RheVNlbCBzZXQgdG8gV2Vla2RheSwgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENfTExfRUNfV0VFS0RBWS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1JUQ19BTE1BX1NldFdlZWtEYXkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgQUxBUk0gQSBvciBAcmVmIExMX1JUQ19BTE1CX1NldFdlZWtEYXkoKSBmb3IgQUxBUk0gQi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9IExMX1JUQ19BbGFybVR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FeHBvcnRlZF9Db25zdGFudHMgUlRDIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX0ZPUk1BVCBGT1JNQVQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfRk9STUFUX0JJTiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAwVSAvKiE8IEJpbmFyeSBkYXRhIGZvcm1hdCAqLworI2RlZmluZSBMTF9SVENfRk9STUFUX0JDRCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAxVSAvKiE8IEJDRCBkYXRhIGZvcm1hdCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfQUxNQV9XRUVLREFZX1NFTEVDVElPTiBSVEMgQWxhcm0gQSBEYXRlIFdlZWtEYXkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfQUxNQV9EQVRFV0VFS0RBWVNFTF9EQVRFICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgQWxhcm0gQSBEYXRlIGlzIHNlbGVjdGVkICovCisjZGVmaW5lIExMX1JUQ19BTE1BX0RBVEVXRUVLREFZU0VMX1dFRUtEQVkgUlRDX0FMUk1BUl9XRFNFTCAgICAgICAgLyohPCBBbGFybSBBIFdlZWtEYXkgaXMgc2VsZWN0ZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX0FMTUJfV0VFS0RBWV9TRUxFQ1RJT04gUlRDIEFsYXJtIEIgRGF0ZSBXZWVrRGF5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX0FMTUJfREFURVdFRUtEQVlTRUxfREFURSAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IEFsYXJtIEIgRGF0ZSBpcyBzZWxlY3RlZCAqLworI2RlZmluZSBMTF9SVENfQUxNQl9EQVRFV0VFS0RBWVNFTF9XRUVLREFZIFJUQ19BTFJNQlJfV0RTRUwgICAgICAgIC8qITwgQWxhcm0gQiBXZWVrRGF5IGlzIHNlbGVjdGVkICovCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX0dFVF9GTEFHIEdldCBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9SVENfUmVhZFJlZyBmdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19JU1JfUkVDQUxQRiAgICAgICAgICAgICAgICAgUlRDX0lTUl9SRUNBTFBGCisjZGVmaW5lIExMX1JUQ19JU1JfVEFNUDNGICAgICAgICAgICAgICAgICAgUlRDX0lTUl9UQU1QM0YKKyNkZWZpbmUgTExfUlRDX0lTUl9UQU1QMkYgICAgICAgICAgICAgICAgICBSVENfSVNSX1RBTVAyRgorI2RlZmluZSBMTF9SVENfSVNSX1RBTVAxRiAgICAgICAgICAgICAgICAgIFJUQ19JU1JfVEFNUDFGCisjZGVmaW5lIExMX1JUQ19JU1JfVFNPVkYgICAgICAgICAgICAgICAgICAgUlRDX0lTUl9UU09WRgorI2RlZmluZSBMTF9SVENfSVNSX1RTRiAgICAgICAgICAgICAgICAgICAgIFJUQ19JU1JfVFNGCisjZGVmaW5lIExMX1JUQ19JU1JfV1VURiAgICAgICAgICAgICAgICAgICAgUlRDX0lTUl9XVVRGCisjZGVmaW5lIExMX1JUQ19JU1JfQUxSQkYgICAgICAgICAgICAgICAgICAgUlRDX0lTUl9BTFJCRgorI2RlZmluZSBMTF9SVENfSVNSX0FMUkFGICAgICAgICAgICAgICAgICAgIFJUQ19JU1JfQUxSQUYKKyNkZWZpbmUgTExfUlRDX0lTUl9JTklURiAgICAgICAgICAgICAgICAgICBSVENfSVNSX0lOSVRGCisjZGVmaW5lIExMX1JUQ19JU1JfUlNGICAgICAgICAgICAgICAgICAgICAgUlRDX0lTUl9SU0YKKyNkZWZpbmUgTExfUlRDX0lTUl9JTklUUyAgICAgICAgICAgICAgICAgICBSVENfSVNSX0lOSVRTCisjZGVmaW5lIExMX1JUQ19JU1JfU0hQRiAgICAgICAgICAgICAgICAgICAgUlRDX0lTUl9TSFBGCisjZGVmaW5lIExMX1JUQ19JU1JfV1VUV0YgICAgICAgICAgICAgICAgICAgUlRDX0lTUl9XVVRXRgorI2RlZmluZSBMTF9SVENfSVNSX0FMUkJXRiAgICAgICAgICAgICAgICAgIFJUQ19JU1JfQUxSQldGCisjZGVmaW5lIExMX1JUQ19JU1JfQUxSQVdGICAgICAgICAgICAgICAgICAgUlRDX0lTUl9BTFJBV0YKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX0lUIElUIERlZmluZXMKKyAgKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1JUQ19SZWFkUmVnIGFuZCAgTExfUlRDX1dyaXRlUmVnIGZ1bmN0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19DUl9UU0lFICAgICAgICAgICAgICAgICAgICAgUlRDX0NSX1RTSUUKKyNkZWZpbmUgTExfUlRDX0NSX1dVVElFICAgICAgICAgICAgICAgICAgICBSVENfQ1JfV1VUSUUKKyNkZWZpbmUgTExfUlRDX0NSX0FMUkJJRSAgICAgICAgICAgICAgICAgICBSVENfQ1JfQUxSQklFCisjZGVmaW5lIExMX1JUQ19DUl9BTFJBSUUgICAgICAgICAgICAgICAgICAgUlRDX0NSX0FMUkFJRQorI2RlZmluZSBMTF9SVENfVEFGQ1JfVEFNUElFICAgICAgICAgICAgICAgUlRDX1RBRkNSX1RBTVBJRQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfV0VFS0RBWSAgV0VFSyBEQVkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfV0VFS0RBWV9NT05EQVkgICAgICAgICAgICAgICgodWludDhfdCkweDAxVSkgLyohPCBNb25kYXkgICAgKi8KKyNkZWZpbmUgTExfUlRDX1dFRUtEQVlfVFVFU0RBWSAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpIC8qITwgVHVlc2RheSAgICovCisjZGVmaW5lIExMX1JUQ19XRUVLREFZX1dFRE5FU0RBWSAgICAgICAgICAgKCh1aW50OF90KTB4MDNVKSAvKiE8IFdlZG5lc2RheSAqLworI2RlZmluZSBMTF9SVENfV0VFS0RBWV9USFVSU0RBWSAgICAgICAgICAgICgodWludDhfdCkweDA0VSkgLyohPCBUaHJ1c2RheSAgKi8KKyNkZWZpbmUgTExfUlRDX1dFRUtEQVlfRlJJREFZICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpIC8qITwgRnJpZGF5ICAgICovCisjZGVmaW5lIExMX1JUQ19XRUVLREFZX1NBVFVSREFZICAgICAgICAgICAgKCh1aW50OF90KTB4MDZVKSAvKiE8IFNhdHVyZGF5ICAqLworI2RlZmluZSBMTF9SVENfV0VFS0RBWV9TVU5EQVkgICAgICAgICAgICAgICgodWludDhfdCkweDA3VSkgLyohPCBTdW5kYXkgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX01PTlRIICBNT05USAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19NT05USF9KQU5VQVJZICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyohPCBKYW51YXJ5ICAgKi8KKyNkZWZpbmUgTExfUlRDX01PTlRIX0ZFQlJVQVJZICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiE8IEZlYnJ1YXJ5ICAqLworI2RlZmluZSBMTF9SVENfTU9OVEhfTUFSQ0ggICAgICAgICAgICAgICAgICgodWludDhfdCkweDAzVSkgIC8qITwgTWFyY2ggICAgICovCisjZGVmaW5lIExMX1JUQ19NT05USF9BUFJJTCAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyohPCBBcHJpbCAgICAgKi8KKyNkZWZpbmUgTExfUlRDX01PTlRIX01BWSAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiE8IE1heSAgICAgICAqLworI2RlZmluZSBMTF9SVENfTU9OVEhfSlVORSAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qITwgSnVuZSAgICAgICovCisjZGVmaW5lIExMX1JUQ19NT05USF9KVUxZICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDdVKSAgLyohPCBKdWx5ICAgICAgKi8KKyNkZWZpbmUgTExfUlRDX01PTlRIX0FVR1VTVCAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwOFUpICAvKiE8IEF1Z3VzdCAgICAqLworI2RlZmluZSBMTF9SVENfTU9OVEhfU0VQVEVNQkVSICAgICAgICAgICAgICgodWludDhfdCkweDA5VSkgIC8qITwgU2VwdGVtYmVyICovCisjZGVmaW5lIExMX1JUQ19NT05USF9PQ1RPQkVSICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MTBVKSAgLyohPCBPY3RvYmVyICAgKi8KKyNkZWZpbmUgTExfUlRDX01PTlRIX05PVkVNQkVSICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgxMVUpICAvKiE8IE5vdmVtYmVyICAqLworI2RlZmluZSBMTF9SVENfTU9OVEhfREVDRU1CRVIgICAgICAgICAgICAgICgodWludDhfdCkweDEyVSkgIC8qITwgRGVjZW1iZXIgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19IT1VSRk9STUFUICBIT1VSIEZPUk1BVAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19IT1VSRk9STUFUXzI0SE9VUiAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgMjQgaG91ci9kYXkgZm9ybWF0ICovCisjZGVmaW5lIExMX1JUQ19IT1VSRk9STUFUX0FNUE0gICAgICAgICAgICAgUlRDX0NSX0ZNVCAgICAgICAgICAgIC8qITwgQU0vUE0gaG91ciBmb3JtYXQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX0FMQVJNT1VUICBBTEFSTSBPVVRQVVQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfQUxBUk1PVVRfRElTQUJMRSAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgT3V0cHV0IGRpc2FibGVkICovCisjZGVmaW5lIExMX1JUQ19BTEFSTU9VVF9BTE1BICAgICAgICAgICAgICAgUlRDX0NSX09TRUxfMCAgICAgICAgICAgLyohPCBBbGFybSBBIG91dHB1dCBlbmFibGVkICovCisjZGVmaW5lIExMX1JUQ19BTEFSTU9VVF9BTE1CICAgICAgICAgICAgICAgUlRDX0NSX09TRUxfMSAgICAgICAgICAgLyohPCBBbGFybSBCIG91dHB1dCBlbmFibGVkICovCisjZGVmaW5lIExMX1JUQ19BTEFSTU9VVF9XQUtFVVAgICAgICAgICAgICAgUlRDX0NSX09TRUwgICAgICAgICAgICAgLyohPCBXYWtldXAgb3V0cHV0IGVuYWJsZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX0FMQVJNX09VVFBVVFRZUEUgIEFMQVJNIE9VVFBVVCBUWVBFCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX0FMQVJNX09VVFBVVFRZUEVfT1BFTkRSQUlOICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSVENfQUxBUk0sIHdoZW4gbWFwcGVkIG9uIFBDMTMsIGlzIG9wZW4tZHJhaW4gb3V0cHV0ICovCisjZGVmaW5lIExMX1JUQ19BTEFSTV9PVVRQVVRUWVBFX1BVU0hQVUxMICAgUlRDX1RBRkNSX0FMQVJNT1VUVFlQRSAvKiE8IFJUQ19BTEFSTSwgd2hlbiBtYXBwZWQgb24gUEMxMywgaXMgcHVzaC1wdWxsIG91dHB1dCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfUElOIFBJTgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19QSU5fUEMxMyAgICAgICAgICAgICAgICAgICAgUlRDX1RBRkNSX1BDMTNNT0RFICAgIC8qITwgUEMxMyBpcyBmb3JjZWQgdG8gcHVzaC1wdWxsIG91dHB1dCBpZiBhbGwgUlRDIGFsdGVybmF0ZSBmdW5jdGlvbnMgYXJlIGRpc2FibGVkICovCisjZGVmaW5lIExMX1JUQ19QSU5fUEMxNCAgICAgICAgICAgICAgICAgICAgUlRDX1RBRkNSX1BDMTRNT0RFICAgIC8qITwgUEMxNCBpcyBmb3JjZWQgdG8gcHVzaC1wdWxsIG91dHB1dCBpZiBMU0UgaXMgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTExfUlRDX1BJTl9QQzE1ICAgICAgICAgICAgICAgICAgICBSVENfVEFGQ1JfUEMxNU1PREUgICAgLyohPCBQQzE1IGlzIGZvcmNlZCB0byBwdXNoLXB1bGwgb3V0cHV0IGlmIExTRSBpcyBkaXNhYmxlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfT1VUUFVUUE9MQVJJVFlfUElOICBPVVRQVVQgUE9MQVJJVFkgUElOCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX09VVFBVVFBPTEFSSVRZX1BJTl9ISUdIICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBQaW4gaXMgaGlnaCB3aGVuIEFMUkFGL0FMUkJGL1dVVEYgaXMgYXNzZXJ0ZWQgKGRlcGVuZGluZyBvbiBPU0VMKSovCisjZGVmaW5lIExMX1JUQ19PVVRQVVRQT0xBUklUWV9QSU5fTE9XICAgICAgUlRDX0NSX1BPTCAgICAgICAgICAgIC8qITwgUGluIGlzIGxvdyB3aGVuIEFMUkFGL0FMUkJGL1dVVEYgaXMgYXNzZXJ0ZWQgKGRlcGVuZGluZyBvbiBPU0VMKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfVElNRV9GT1JNQVQgVElNRSBGT1JNQVQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfVElNRV9GT1JNQVRfQU1fT1JfMjQgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IEFNIG9yIDI0LWhvdXIgZm9ybWF0ICovCisjZGVmaW5lIExMX1JUQ19USU1FX0ZPUk1BVF9QTSAgICAgICAgICAgICAgUlRDX1RSX1BNICAgICAgICAgICAgIC8qITwgUE0gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX1NISUZUX1NFQ09ORCAgU0hJRlQgU0VDT05ECisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX1NISUZUX1NFQ09ORF9ERUxBWSAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyogRGVsYXkgKHNlY29uZHMpID0gU1VCRlMgLyAoUFJFRElWX1MgKyAxKSAqLworI2RlZmluZSBMTF9SVENfU0hJRlRfU0VDT05EX0FEVkFOQ0UgICAgICAgIFJUQ19TSElGVFJfQUREMVMgICAgICAvKiBBZHZhbmNlIChzZWNvbmRzKSA9ICgxIC0gKFNVQkZTIC8gKFBSRURJVl9TICsgMSkpKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfQUxNQV9NQVNLICBBTEFSTUEgTUFTSworICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19BTE1BX01BU0tfTk9ORSAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBObyBtYXNrcyBhcHBsaWVkIG9uIEFsYXJtIEEqLworI2RlZmluZSBMTF9SVENfQUxNQV9NQVNLX0RBVEVXRUVLREFZICAgICAgIFJUQ19BTFJNQVJfTVNLNCAgICAgICAgIC8qITwgRGF0ZS9kYXkgZG8gbm90IGNhcmUgaW4gQWxhcm0gQSBjb21wYXJpc29uICovCisjZGVmaW5lIExMX1JUQ19BTE1BX01BU0tfSE9VUlMgICAgICAgICAgICAgUlRDX0FMUk1BUl9NU0szICAgICAgICAgLyohPCBIb3VycyBkbyBub3QgY2FyZSBpbiBBbGFybSBBIGNvbXBhcmlzb24gKi8KKyNkZWZpbmUgTExfUlRDX0FMTUFfTUFTS19NSU5VVEVTICAgICAgICAgICBSVENfQUxSTUFSX01TSzIgICAgICAgICAvKiE8IE1pbnV0ZXMgZG8gbm90IGNhcmUgaW4gQWxhcm0gQSBjb21wYXJpc29uICovCisjZGVmaW5lIExMX1JUQ19BTE1BX01BU0tfU0VDT05EUyAgICAgICAgICAgUlRDX0FMUk1BUl9NU0sxICAgICAgICAgLyohPCBTZWNvbmRzIGRvIG5vdCBjYXJlIGluIEFsYXJtIEEgY29tcGFyaXNvbiAqLworI2RlZmluZSBMTF9SVENfQUxNQV9NQVNLX0FMTCAgICAgICAgICAgICAgIChSVENfQUxSTUFSX01TSzQgfCBSVENfQUxSTUFSX01TSzMgfCBSVENfQUxSTUFSX01TSzIgfCBSVENfQUxSTUFSX01TSzEpIC8qITwgTWFza3MgYWxsICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19BTE1BX1RJTUVfRk9STUFUICBBTEFSTUEgVElNRSBGT1JNQVQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfQUxNQV9USU1FX0ZPUk1BVF9BTSAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IEFNIG9yIDI0LWhvdXIgZm9ybWF0ICovCisjZGVmaW5lIExMX1JUQ19BTE1BX1RJTUVfRk9STUFUX1BNICAgICAgICAgUlRDX0FMUk1BUl9QTSAgICAgICAgIC8qITwgUE0gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX0FMTUJfTUFTSyAgQUxBUk1CIE1BU0sKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfQUxNQl9NQVNLX05PTkUgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgTm8gbWFza3MgYXBwbGllZCBvbiBBbGFybSBCKi8KKyNkZWZpbmUgTExfUlRDX0FMTUJfTUFTS19EQVRFV0VFS0RBWSAgICAgICBSVENfQUxSTUJSX01TSzQgICAgICAgICAvKiE8IERhdGUvZGF5IGRvIG5vdCBjYXJlIGluIEFsYXJtIEIgY29tcGFyaXNvbiAqLworI2RlZmluZSBMTF9SVENfQUxNQl9NQVNLX0hPVVJTICAgICAgICAgICAgIFJUQ19BTFJNQlJfTVNLMyAgICAgICAgIC8qITwgSG91cnMgZG8gbm90IGNhcmUgaW4gQWxhcm0gQiBjb21wYXJpc29uICovCisjZGVmaW5lIExMX1JUQ19BTE1CX01BU0tfTUlOVVRFUyAgICAgICAgICAgUlRDX0FMUk1CUl9NU0syICAgICAgICAgLyohPCBNaW51dGVzIGRvIG5vdCBjYXJlIGluIEFsYXJtIEIgY29tcGFyaXNvbiAqLworI2RlZmluZSBMTF9SVENfQUxNQl9NQVNLX1NFQ09ORFMgICAgICAgICAgIFJUQ19BTFJNQlJfTVNLMSAgICAgICAgIC8qITwgU2Vjb25kcyBkbyBub3QgY2FyZSBpbiBBbGFybSBCIGNvbXBhcmlzb24gKi8KKyNkZWZpbmUgTExfUlRDX0FMTUJfTUFTS19BTEwgICAgICAgICAgICAgICAoUlRDX0FMUk1CUl9NU0s0IHwgUlRDX0FMUk1CUl9NU0szIHwgUlRDX0FMUk1CUl9NU0syIHwgUlRDX0FMUk1CUl9NU0sxKSAvKiE8IE1hc2tzIGFsbCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfQUxNQl9USU1FX0ZPUk1BVCAgQUxBUk1CIFRJTUUgRk9STUFUCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX0FMTUJfVElNRV9GT1JNQVRfQU0gICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBBTSBvciAyNC1ob3VyIGZvcm1hdCAqLworI2RlZmluZSBMTF9SVENfQUxNQl9USU1FX0ZPUk1BVF9QTSAgICAgICAgIFJUQ19BTFJNQlJfUE0gICAgICAgICAvKiE8IFBNICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19USU1FU1RBTVBfRURHRSAgVElNRVNUQU1QIEVER0UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfVElNRVNUQU1QX0VER0VfUklTSU5HICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IFJUQ19UUyBpbnB1dCByaXNpbmcgZWRnZSBnZW5lcmF0ZXMgYSB0aW1lLXN0YW1wIGV2ZW50ICovCisjZGVmaW5lIExMX1JUQ19USU1FU1RBTVBfRURHRV9GQUxMSU5HICAgICAgUlRDX0NSX1RTRURHRSAgICAgICAgIC8qITwgUlRDX1RTIGlucHV0IGZhbGxpbmcgZWRnZSBnZW5lcmF0ZXMgYSB0aW1lLXN0YW1wIGV2ZW4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX1RTX1RJTUVfRk9STUFUICBUSU1FU1RBTVAgVElNRSBGT1JNQVQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfVFNfVElNRV9GT1JNQVRfQU0gICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IEFNIG9yIDI0LWhvdXIgZm9ybWF0ICovCisjZGVmaW5lIExMX1JUQ19UU19USU1FX0ZPUk1BVF9QTSAgICAgICAgICAgUlRDX1RTVFJfUE0gICAgICAgICAgIC8qITwgUE0gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX1RBTVBFUiAgVEFNUEVSCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfMSAgICAgICAgICAgICAgICAgICAgUlRDX1RBRkNSX1RBTVAxRSAvKiE8IFJUQ19UQU1QMSBpbnB1dCBkZXRlY3Rpb24gKi8KKyNlbmRpZiAvKiBSVENfVEFNUEVSMV9TVVBQT1JUICovCisjaWYgZGVmaW5lZChSVENfVEFNUEVSMl9TVVBQT1JUKQorI2RlZmluZSBMTF9SVENfVEFNUEVSXzIgICAgICAgICAgICAgICAgICAgIFJUQ19UQUZDUl9UQU1QMkUgLyohPCBSVENfVEFNUDIgaW5wdXQgZGV0ZWN0aW9uICovCisjZW5kaWYgLyogUlRDX1RBTVBFUjJfU1VQUE9SVCAqLworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKKyNkZWZpbmUgTExfUlRDX1RBTVBFUl8zICAgICAgICAgICAgICAgICAgICBSVENfVEFGQ1JfVEFNUDNFIC8qITwgUlRDX1RBTVAzIGlucHV0IGRldGVjdGlvbiAqLworI2VuZGlmIC8qIFJUQ19UQU1QRVIzX1NVUFBPUlQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX1RBTVBFUl9NQVNLICBUQU1QRVIgTUFTSworICAqIEB7CisgICovCisjaWYgZGVmaW5lZChSVENfVEFNUEVSMV9TVVBQT1JUKQorI2RlZmluZSBMTF9SVENfVEFNUEVSX01BU0tfVEFNUEVSMSAgICAgICAgIFJUQ19UQUZDUl9UQU1QMU1GIC8qITwgVGFtcGVyIDEgZXZlbnQgZ2VuZXJhdGVzIGEgdHJpZ2dlciBldmVudC4gVEFNUDFGIGlzIG1hc2tlZCBhbmQgaW50ZXJuYWxseSBjbGVhcmVkIGJ5IGhhcmR3YXJlLlRoZSBiYWNrdXAgcmVnaXN0ZXJzIGFyZSBub3QgZXJhc2VkICovCisjZW5kaWYgLyogUlRDX1RBTVBFUjFfU1VQUE9SVCAqLworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjJfU1VQUE9SVCkKKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9NQVNLX1RBTVBFUjIgICAgICAgICBSVENfVEFGQ1JfVEFNUDJNRiAvKiE8IFRhbXBlciAyIGV2ZW50IGdlbmVyYXRlcyBhIHRyaWdnZXIgZXZlbnQuIFRBTVAyRiBpcyBtYXNrZWQgYW5kIGludGVybmFsbHkgY2xlYXJlZCBieSBoYXJkd2FyZS4gVGhlIGJhY2t1cCByZWdpc3RlcnMgYXJlIG5vdCBlcmFzZWQuICovCisjZW5kaWYgLyogUlRDX1RBTVBFUjJfU1VQUE9SVCAqLworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9NQVNLX1RBTVBFUjMgICAgICAgICBSVENfVEFGQ1JfVEFNUDNNRiAvKiE8IFRhbXBlciAzIGV2ZW50IGdlbmVyYXRlcyBhIHRyaWdnZXIgZXZlbnQuIFRBTVAzRiBpcyBtYXNrZWQgYW5kIGludGVybmFsbHkgY2xlYXJlZCBieSBoYXJkd2FyZS4gVGhlIGJhY2t1cCByZWdpc3RlcnMgYXJlIG5vdCBlcmFzZWQgKi8KKyNlbmRpZiAvKiBSVENfVEFNUEVSM19TVVBQT1JUICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19UQU1QRVJfTk9FUkFTRSAgVEFNUEVSIE5PIEVSQVNFCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfTk9FUkFTRV9UQU1QRVIxICAgICAgUlRDX1RBRkNSX1RBTVAxTk9FUkFTRSAvKiE8IFRhbXBlciAxIGV2ZW50IGRvZXMgbm90IGVyYXNlIHRoZSBiYWNrdXAgcmVnaXN0ZXJzLiAqLworI2VuZGlmIC8qIFJUQ19UQU1QRVIxX1NVUFBPUlQgKi8KKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIyX1NVUFBPUlQpCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfTk9FUkFTRV9UQU1QRVIyICAgICAgUlRDX1RBRkNSX1RBTVAyTk9FUkFTRSAvKiE8IFRhbXBlciAyIGV2ZW50IGRvZXMgbm90IGVyYXNlIHRoZSBiYWNrdXAgcmVnaXN0ZXJzLiAqLworI2VuZGlmIC8qIFJUQ19UQU1QRVIyX1NVUFBPUlQgKi8KKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfTk9FUkFTRV9UQU1QRVIzICAgICAgUlRDX1RBRkNSX1RBTVAzTk9FUkFTRSAvKiE8IFRhbXBlciAzIGV2ZW50IGRvZXMgbm90IGVyYXNlIHRoZSBiYWNrdXAgcmVnaXN0ZXJzLiAqLworI2VuZGlmIC8qIFJUQ19UQU1QRVIzX1NVUFBPUlQgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFJUQ19UQUZDUl9UQU1QUFJDSCkKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX1RBTVBFUl9EVVJBVElPTiAgVEFNUEVSIERVUkFUSU9OCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9EVVJBVElPTl8xUlRDQ0xLICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUYW1wZXIgcGlucyBhcmUgcHJlLWNoYXJnZWQgYmVmb3JlIHNhbXBsaW5nIGR1cmluZyAxIFJUQ0NMSyBjeWNsZSAgKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9EVVJBVElPTl8yUlRDQ0xLICAgICBSVENfVEFGQ1JfVEFNUFBSQ0hfMCAgLyohPCBUYW1wZXIgcGlucyBhcmUgcHJlLWNoYXJnZWQgYmVmb3JlIHNhbXBsaW5nIGR1cmluZyAyIFJUQ0NMSyBjeWNsZXMgKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9EVVJBVElPTl80UlRDQ0xLICAgICBSVENfVEFGQ1JfVEFNUFBSQ0hfMSAgLyohPCBUYW1wZXIgcGlucyBhcmUgcHJlLWNoYXJnZWQgYmVmb3JlIHNhbXBsaW5nIGR1cmluZyA0IFJUQ0NMSyBjeWNsZXMgKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9EVVJBVElPTl84UlRDQ0xLICAgICBSVENfVEFGQ1JfVEFNUFBSQ0ggICAgLyohPCBUYW1wZXIgcGlucyBhcmUgcHJlLWNoYXJnZWQgYmVmb3JlIHNhbXBsaW5nIGR1cmluZyA4IFJUQ0NMSyBjeWNsZXMgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogUlRDX1RBRkNSX1RBTVBQUkNIICovCisKKyNpZiBkZWZpbmVkKFJUQ19UQUZDUl9UQU1QRkxUKQorLyoqIEBkZWZncm91cCBSVENfTExfRUNfVEFNUEVSX0ZJTFRFUiAgVEFNUEVSIEZJTFRFUgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfRklMVEVSX0RJU0FCTEUgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRhbXBlciBmaWx0ZXIgaXMgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9GSUxURVJfMlNBTVBMRSAgICAgICBSVENfVEFGQ1JfVEFNUEZMVF8wICAgIC8qITwgVGFtcGVyIGlzIGFjdGl2YXRlZCBhZnRlciAyIGNvbnNlY3V0aXZlIHNhbXBsZXMgYXQgdGhlIGFjdGl2ZSBsZXZlbCAqLworI2RlZmluZSBMTF9SVENfVEFNUEVSX0ZJTFRFUl80U0FNUExFICAgICAgIFJUQ19UQUZDUl9UQU1QRkxUXzEgICAgLyohPCBUYW1wZXIgaXMgYWN0aXZhdGVkIGFmdGVyIDQgY29uc2VjdXRpdmUgc2FtcGxlcyBhdCB0aGUgYWN0aXZlIGxldmVsICovCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfRklMVEVSXzhTQU1QTEUgICAgICAgUlRDX1RBRkNSX1RBTVBGTFQgICAgICAvKiE8IFRhbXBlciBpcyBhY3RpdmF0ZWQgYWZ0ZXIgOCBjb25zZWN1dGl2ZSBzYW1wbGVzIGF0IHRoZSBhY3RpdmUgbGV2ZWwuICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFJUQ19UQUZDUl9UQU1QRkxUICovCisKKyNpZiBkZWZpbmVkKFJUQ19UQUZDUl9UQU1QRlJFUSkKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX1RBTVBFUl9TQU1QTEZSRVFESVYgIFRBTVBFUiBTQU1QTElORyBGUkVRVUVOQ1kgRElWSURFUgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzMyNzY4ICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVhY2ggb2YgdGhlIHRhbXBlciBpbnB1dHMgYXJlIHNhbXBsZWQgd2l0aCBhIGZyZXF1ZW5jeSA9ICBSVENDTEsgLyAzMjc2OCAqLworI2RlZmluZSBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl8xNjM4NCAgIFJUQ19UQUZDUl9UQU1QRlJFUV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFYWNoIG9mIHRoZSB0YW1wZXIgaW5wdXRzIGFyZSBzYW1wbGVkIHdpdGggYSBmcmVxdWVuY3kgPSAgUlRDQ0xLIC8gMTYzODQgKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9TQU1QTEZSRVFESVZfODE5MiAgICBSVENfVEFGQ1JfVEFNUEZSRVFfMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRWFjaCBvZiB0aGUgdGFtcGVyIGlucHV0cyBhcmUgc2FtcGxlZCB3aXRoIGEgZnJlcXVlbmN5ID0gIFJUQ0NMSyAvIDgxOTIgKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9TQU1QTEZSRVFESVZfNDA5NiAgICAoUlRDX1RBRkNSX1RBTVBGUkVRXzEgfCBSVENfVEFGQ1JfVEFNUEZSRVFfMCkgLyohPCBFYWNoIG9mIHRoZSB0YW1wZXIgaW5wdXRzIGFyZSBzYW1wbGVkIHdpdGggYSBmcmVxdWVuY3kgPSAgUlRDQ0xLIC8gNDA5NiAqLworI2RlZmluZSBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl8yMDQ4ICAgIFJUQ19UQUZDUl9UQU1QRlJFUV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFYWNoIG9mIHRoZSB0YW1wZXIgaW5wdXRzIGFyZSBzYW1wbGVkIHdpdGggYSBmcmVxdWVuY3kgPSAgUlRDQ0xLIC8gMjA0OCAqLworI2RlZmluZSBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl8xMDI0ICAgIChSVENfVEFGQ1JfVEFNUEZSRVFfMiB8IFJUQ19UQUZDUl9UQU1QRlJFUV8wKSAvKiE8IEVhY2ggb2YgdGhlIHRhbXBlciBpbnB1dHMgYXJlIHNhbXBsZWQgd2l0aCBhIGZyZXF1ZW5jeSA9ICBSVENDTEsgLyAxMDI0ICovCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzUxMiAgICAgKFJUQ19UQUZDUl9UQU1QRlJFUV8yIHwgUlRDX1RBRkNSX1RBTVBGUkVRXzEpIC8qITwgRWFjaCBvZiB0aGUgdGFtcGVyIGlucHV0cyBhcmUgc2FtcGxlZCB3aXRoIGEgZnJlcXVlbmN5ID0gIFJUQ0NMSyAvIDUxMiAqLworI2RlZmluZSBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl8yNTYgICAgIFJUQ19UQUZDUl9UQU1QRlJFUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFYWNoIG9mIHRoZSB0YW1wZXIgaW5wdXRzIGFyZSBzYW1wbGVkIHdpdGggYSBmcmVxdWVuY3kgPSAgUlRDQ0xLIC8gMjU2ICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFJUQ19UQUZDUl9UQU1QRlJFUSAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19UQU1QRVJfQUNUSVZFTEVWRUwgIFRBTVBFUiBBQ1RJVkUgTEVWRUwKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjFfU1VQUE9SVCkKKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9BQ1RJVkVMRVZFTF9UQU1QMSAgICBSVENfVEFGQ1JfVEFNUDFUUkcgLyohPCBSVENfVEFNUDEgaW5wdXQgZmFsbGluZyBlZGdlIChpZiBUQU1QRkxUID0gMDApIG9yIHN0YXlpbmcgaGlnaCAoaWYgVEFNUEZMVCAhPSAwMCkgdHJpZ2dlcnMgYSB0YW1wZXIgZGV0ZWN0aW9uIGV2ZW50Ki8KKyNlbmRpZiAvKiBSVENfVEFNUEVSMV9TVVBQT1JUICovCisjaWYgZGVmaW5lZChSVENfVEFNUEVSMl9TVVBQT1JUKQorI2RlZmluZSBMTF9SVENfVEFNUEVSX0FDVElWRUxFVkVMX1RBTVAyICAgIFJUQ19UQUZDUl9UQU1QMlRSRyAvKiE8IFJUQ19UQU1QMiBpbnB1dCBmYWxsaW5nIGVkZ2UgKGlmIFRBTVBGTFQgPSAwMCkgb3Igc3RheWluZyBoaWdoIChpZiBUQU1QRkxUICE9IDAwKSB0cmlnZ2VycyBhIHRhbXBlciBkZXRlY3Rpb24gZXZlbnQqLworI2VuZGlmIC8qIFJUQ19UQU1QRVIyX1NVUFBPUlQgKi8KKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfQUNUSVZFTEVWRUxfVEFNUDMgICAgUlRDX1RBRkNSX1RBTVAzVFJHIC8qITwgUlRDX1RBTVAzIGlucHV0IGZhbGxpbmcgZWRnZSAoaWYgVEFNUEZMVCA9IDAwKSBvciBzdGF5aW5nIGhpZ2ggKGlmIFRBTVBGTFQgIT0gMDApIHRyaWdnZXJzIGEgdGFtcGVyIGRldGVjdGlvbiBldmVudCovCisjZW5kaWYgLyogUlRDX1RBTVBFUjNfU1VQUE9SVCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfV0FLRVVQQ0xPQ0tfRElWICBXQUtFVVAgQ0xPQ0sgRElWCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX1dBS0VVUENMT0NLX0RJVl8xNiAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUlRDLzE2IGNsb2NrIGlzIHNlbGVjdGVkICovCisjZGVmaW5lIExMX1JUQ19XQUtFVVBDTE9DS19ESVZfOCAgICAgICAgICAgKFJUQ19DUl9XVUNLU0VMXzApICAgICAgICAgICAgICAgICAgICAvKiE8IFJUQy84IGNsb2NrIGlzIHNlbGVjdGVkICovCisjZGVmaW5lIExMX1JUQ19XQUtFVVBDTE9DS19ESVZfNCAgICAgICAgICAgKFJUQ19DUl9XVUNLU0VMXzEpICAgICAgICAgICAgICAgICAgICAvKiE8IFJUQy80IGNsb2NrIGlzIHNlbGVjdGVkICovCisjZGVmaW5lIExMX1JUQ19XQUtFVVBDTE9DS19ESVZfMiAgICAgICAgICAgKFJUQ19DUl9XVUNLU0VMXzEgfCBSVENfQ1JfV1VDS1NFTF8wKSAvKiE8IFJUQy8yIGNsb2NrIGlzIHNlbGVjdGVkICovCisjZGVmaW5lIExMX1JUQ19XQUtFVVBDTE9DS19DS1NQUkUgICAgICAgICAgKFJUQ19DUl9XVUNLU0VMXzIpICAgICAgICAgICAgICAgICAgICAvKiE8IGNrX3NwcmUgKHVzdWFsbHkgMSBIeikgY2xvY2sgaXMgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgTExfUlRDX1dBS0VVUENMT0NLX0NLU1BSRV9XVVQgICAgICAoUlRDX0NSX1dVQ0tTRUxfMiB8IFJUQ19DUl9XVUNLU0VMXzEpIC8qITwgY2tfc3ByZSAodXN1YWxseSAxIEh6KSBjbG9jayBpcyBzZWxlY3RlZCBhbmQgMmV4cDE2IGlzIGFkZGVkIHRvIHRoZSBXVVQgY291bnRlciB2YWx1ZSovCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChSVENfQkFDS1VQX1NVUFBPUlQpCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19CS1AgIEJBQ0tVUAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19CS1BfRFIwICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgTExfUlRDX0JLUF9EUjEgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVQorI2RlZmluZSBMTF9SVENfQktQX0RSMiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVCisjZGVmaW5lIExMX1JUQ19CS1BfRFIzICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwM1UKKyNkZWZpbmUgTExfUlRDX0JLUF9EUjQgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VQorI2lmIFJUQ19CS1BfTlVNQkVSID4gNQorI2RlZmluZSBMTF9SVENfQktQX0RSNSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDVVCisjZGVmaW5lIExMX1JUQ19CS1BfRFI2ICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNlUKKyNkZWZpbmUgTExfUlRDX0JLUF9EUjcgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3VQorI2RlZmluZSBMTF9SVENfQktQX0RSOCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDhVCisjZGVmaW5lIExMX1JUQ19CS1BfRFI5ICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOVUKKyNkZWZpbmUgTExfUlRDX0JLUF9EUjEwICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBBVQorI2RlZmluZSBMTF9SVENfQktQX0RSMTEgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEJVCisjZGVmaW5lIExMX1JUQ19CS1BfRFIxMiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwQ1UKKyNkZWZpbmUgTExfUlRDX0JLUF9EUjEzICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBEVQorI2RlZmluZSBMTF9SVENfQktQX0RSMTQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEVVCisjZGVmaW5lIExMX1JUQ19CS1BfRFIxNSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwRlUKKyNlbmRpZiAvKiBSVENfQktQX05VTUJFUiA+IDUgKi8KKworI2lmIFJUQ19CS1BfTlVNQkVSID4gMTYKKyNkZWZpbmUgTExfUlRDX0JLUF9EUjE2ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwVQorI2RlZmluZSBMTF9SVENfQktQX0RSMTcgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTFVCisjZGVmaW5lIExMX1JUQ19CS1BfRFIxOCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMlUKKyNkZWZpbmUgTExfUlRDX0JLUF9EUjE5ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEzVQorI2VuZGlmIC8qIFJUQ19CS1BfTlVNQkVSID4gMTYgKi8KKworI2lmIFJUQ19CS1BfTlVNQkVSID4gMjAKKyNkZWZpbmUgTExfUlRDX0JLUF9EUjIwICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDE0VQorI2RlZmluZSBMTF9SVENfQktQX0RSMjEgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTVVCisjZGVmaW5lIExMX1JUQ19CS1BfRFIyMiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxNlUKKyNkZWZpbmUgTExfUlRDX0JLUF9EUjIzICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDE3VQorI2RlZmluZSBMTF9SVENfQktQX0RSMjQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMThVCisjZGVmaW5lIExMX1JUQ19CS1BfRFIyNSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxOVUKKyNkZWZpbmUgTExfUlRDX0JLUF9EUjI2ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFBVQorI2RlZmluZSBMTF9SVENfQktQX0RSMjcgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUJVCisjZGVmaW5lIExMX1JUQ19CS1BfRFIyOCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxQ1UKKyNkZWZpbmUgTExfUlRDX0JLUF9EUjI5ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFEVQorI2RlZmluZSBMTF9SVENfQktQX0RSMzAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUVVCisjZGVmaW5lIExMX1JUQ19CS1BfRFIzMSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxRlUKKyNlbmRpZiAvKiBSVENfQktQX05VTUJFUiA+IDIwICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFJUQ19CQUNLVVBfU1VQUE9SVCAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19DQUxJQl9PVVRQVVQgIENhbGlicmF0aW9uIG91dHB1dAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19DQUxJQl9PVVRQVVRfTk9ORSAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgIC8qITwgQ2FsaWJyYXRpb24gb3V0cHV0IGRpc2FibGVkICovCisjZGVmaW5lIExMX1JUQ19DQUxJQl9PVVRQVVRfMUhaICAgICAgICAgICAgKFJUQ19DUl9DT0UgfCBSVENfQ1JfQ09TRUwpIC8qITwgQ2FsaWJyYXRpb24gb3V0cHV0IGlzIDEgSHogKi8KKyNkZWZpbmUgTExfUlRDX0NBTElCX09VVFBVVF81MTJIWiAgICAgICAgICAoUlRDX0NSX0NPRSkgICAgICAgICAgICAgICAgLyohPCBDYWxpYnJhdGlvbiBvdXRwdXQgaXMgNTEyIEh6ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19DQUxJQl9JTlNFUlRQVUxTRSAgQ2FsaWJyYXRpb24gcHVsc2UgaW5zZXJ0aW9uIAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19DQUxJQl9JTlNFUlRQVUxTRV9OT05FICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgTm8gUlRDQ0xLIHB1bHNlcyBhcmUgYWRkZWQgKi8KKyNkZWZpbmUgTExfUlRDX0NBTElCX0lOU0VSVFBVTFNFX1NFVCAgICAgICBSVENfQ0FMUl9DQUxQICAgICAgICAgLyohPCBPbmUgUlRDQ0xLIHB1bHNlIGlzIGVmZmVjdGl2ZWx5IGluc2VydGVkIGV2ZXJ5IDJleHAxMSBwdWxzZXMgKGZyZXF1ZW5jeSBpbmNyZWFzZWQgYnkgNDg4LjUgcHBtKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfQ0FMSUJfUEVSSU9EICBDYWxpYnJhdGlvbiBwZXJpb2QKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfQ0FMSUJfUEVSSU9EXzMyU0VDICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IFVzZSBhIDMyLXNlY29uZCBjYWxpYnJhdGlvbiBjeWNsZSBwZXJpb2QgKi8KKyNkZWZpbmUgTExfUlRDX0NBTElCX1BFUklPRF8xNlNFQyAgICAgICAgICBSVENfQ0FMUl9DQUxXMTYgICAgICAgLyohPCBVc2UgYSAxNi1zZWNvbmQgY2FsaWJyYXRpb24gY3ljbGUgcGVyaW9kICovCisjZGVmaW5lIExMX1JUQ19DQUxJQl9QRVJJT0RfOFNFQyAgICAgICAgICAgUlRDX0NBTFJfQ0FMVzggICAgICAgIC8qITwgVXNlIGEgOC1zZWNvbmQgY2FsaWJyYXRpb24gY3ljbGUgcGVyaW9kICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSVENfTExfRXhwb3J0ZWRfTWFjcm9zIFJUQyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIFJUQyByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuCisgICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgTExfUlRDX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gUlRDIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX1JUQ19SZWFkUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXykgUkVBRF9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRU1fQ29udmVydCBDb252ZXJ0IGhlbHBlciBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjb252ZXJ0IGEgdmFsdWUgZnJvbSAyIGRpZ2l0IGRlY2ltYWwgZm9ybWF0IHRvIEJDRCBmb3JtYXQKKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBCeXRlIHRvIGJlIGNvbnZlcnRlZAorICAqIEByZXR2YWwgQ29udmVydGVkIGJ5dGUKKyAgKi8KKyNkZWZpbmUgX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEKF9fVkFMVUVfXykgKHVpbnQ4X3QpKCgoKF9fVkFMVUVfXykgLyAxMFUpIDw8IDRVKSB8ICgoX19WQUxVRV9fKSAlIDEwVSkpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNvbnZlcnQgYSB2YWx1ZSBmcm9tIEJDRCBmb3JtYXQgdG8gMiBkaWdpdCBkZWNpbWFsIGZvcm1hdAorICAqIEBwYXJhbSAgX19WQUxVRV9fIEJDRCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAgKiBAcmV0dmFsIENvbnZlcnRlZCBieXRlCisgICovCisjZGVmaW5lIF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihfX1ZBTFVFX18pICh1aW50OF90KSgoKHVpbnQ4X3QpKChfX1ZBTFVFX18pICYgKHVpbnQ4X3QpMHhGMFUpID4+ICh1aW50OF90KTB4NFUpICogMTBVICsgKChfX1ZBTFVFX18pICYgKHVpbnQ4X3QpMHgwRlUpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FTV9EYXRlIERhdGUgaGVscGVyIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIHJldHJpZXZlIHdlZWtkYXkuCisgICogQHBhcmFtICBfX1JUQ19EQVRFX18gRGF0ZSByZXR1cm5lZCBieSBAcmVmICBMTF9SVENfREFURV9HZXQgZnVuY3Rpb24uCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX01PTkRBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1RVRVNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9XRURORVNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9USFVSU0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX0ZSSURBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1NBVFVSREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfU1VOREFZCisgICovCisjZGVmaW5lIF9fTExfUlRDX0dFVF9XRUVLREFZKF9fUlRDX0RBVEVfXykgKCgoX19SVENfREFURV9fKSA+PiBSVENfT0ZGU0VUX1dFRUtEQVkpICYgMHgwMDAwMDBGRlUpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIHJldHJpZXZlIFllYXIgaW4gQkNEIGZvcm1hdAorICAqIEBwYXJhbSAgX19SVENfREFURV9fIFZhbHVlIHJldHVybmVkIGJ5IEByZWYgIExMX1JUQ19EQVRFX0dldAorICAqIEByZXR2YWwgWWVhciBpbiBCQ0QgZm9ybWF0ICgweDAwIC4gLiAuIDB4OTkpCisgICovCisjZGVmaW5lIF9fTExfUlRDX0dFVF9ZRUFSKF9fUlRDX0RBVEVfXykgKChfX1JUQ19EQVRFX18pICYgMHgwMDAwMDBGRlUpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIHJldHJpZXZlIE1vbnRoIGluIEJDRCBmb3JtYXQKKyAgKiBAcGFyYW0gIF9fUlRDX0RBVEVfXyBWYWx1ZSByZXR1cm5lZCBieSBAcmVmICBMTF9SVENfREFURV9HZXQKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0pBTlVBUlkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfRkVCUlVBUlkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfTUFSQ0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfQVBSSUwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfTUFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0pVTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfSlVMWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9BVUdVU1QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfU0VQVEVNQkVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX09DVE9CRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfTk9WRU1CRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfREVDRU1CRVIKKyAgKi8KKyNkZWZpbmUgX19MTF9SVENfR0VUX01PTlRIKF9fUlRDX0RBVEVfXykgKCgoX19SVENfREFURV9fKSA+PlJUQ19PRkZTRVRfTU9OVEgpICYgMHgwMDAwMDBGRlUpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIHJldHJpZXZlIERheSBpbiBCQ0QgZm9ybWF0CisgICogQHBhcmFtICBfX1JUQ19EQVRFX18gVmFsdWUgcmV0dXJuZWQgYnkgQHJlZiAgTExfUlRDX0RBVEVfR2V0CisgICogQHJldHZhbCBEYXkgaW4gQkNEIGZvcm1hdCAoMHgwMSAuIC4gLiAweDMxKQorICAqLworI2RlZmluZSBfX0xMX1JUQ19HRVRfREFZKF9fUlRDX0RBVEVfXykgKCgoX19SVENfREFURV9fKSA+PlJUQ19PRkZTRVRfREFZKSAmIDB4MDAwMDAwRkZVKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FTV9UaW1lIFRpbWUgaGVscGVyIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIHJldHJpZXZlIGhvdXIgaW4gQkNEIGZvcm1hdAorICAqIEBwYXJhbSAgX19SVENfVElNRV9fIFJUQyB0aW1lIHJldHVybmVkIGJ5IEByZWYgTExfUlRDX1RJTUVfR2V0IGZ1bmN0aW9uCisgICogQHJldHZhbCBIb3VycyBpbiBCQ0QgZm9ybWF0ICgweDAxLiAuIC4weDEyIG9yIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgyMykKKyAgKi8KKyNkZWZpbmUgX19MTF9SVENfR0VUX0hPVVIoX19SVENfVElNRV9fKSAoKChfX1JUQ19USU1FX18pID4+IFJUQ19PRkZTRVRfSE9VUikgJiAweDAwMDAwMEZGVSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gcmV0cmlldmUgbWludXRlIGluIEJDRCBmb3JtYXQKKyAgKiBAcGFyYW0gIF9fUlRDX1RJTUVfXyBSVEMgdGltZSByZXR1cm5lZCBieSBAcmVmIExMX1JUQ19USU1FX0dldCBmdW5jdGlvbgorICAqIEByZXR2YWwgTWludXRlcyBpbiBCQ0QgZm9ybWF0ICgweDAwLiAuIC4weDU5KQorICAqLworI2RlZmluZSBfX0xMX1JUQ19HRVRfTUlOVVRFKF9fUlRDX1RJTUVfXykgKCgoX19SVENfVElNRV9fKSA+PiBSVENfT0ZGU0VUX01JTlVURSkgJiAweDAwMDAwMEZGVSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gcmV0cmlldmUgc2Vjb25kIGluIEJDRCBmb3JtYXQKKyAgKiBAcGFyYW0gIF9fUlRDX1RJTUVfXyBSVEMgdGltZSByZXR1cm5lZCBieSBAcmVmIExMX1JUQ19USU1FX0dldCBmdW5jdGlvbgorICAqIEByZXR2YWwgU2Vjb25kcyBpbiAgZm9ybWF0ICgweDAwLiAuIC4weDU5KQorICAqLworI2RlZmluZSBfX0xMX1JUQ19HRVRfU0VDT05EKF9fUlRDX1RJTUVfXykgKChfX1JUQ19USU1FX18pICYgMHgwMDAwMDBGRlUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FeHBvcnRlZF9GdW5jdGlvbnMgUlRDIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VGX0NvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IEhvdXJzIGZvcm1hdCAoMjQgaG91ci9kYXkgb3IgQU0vUE0gaG91ciBmb3JtYXQpCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBub3RlICAgSXQgY2FuIGJlIHdyaXR0ZW4gaW4gaW5pdGlhbGl6YXRpb24gbW9kZSBvbmx5IChAcmVmIExMX1JUQ19FbmFibGVJbml0TW9kZSBmdW5jdGlvbikKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBGTVQgICAgICAgICAgIExMX1JUQ19TZXRIb3VyRm9ybWF0CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgSG91ckZvcm1hdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19IT1VSRk9STUFUXzI0SE9VUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19IT1VSRk9STUFUX0FNUE0KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19TZXRIb3VyRm9ybWF0KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBIb3VyRm9ybWF0KQoreworICBNT0RJRllfUkVHKFJUQ3gtPkNSLCBSVENfQ1JfRk1ULCBIb3VyRm9ybWF0KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgSG91cnMgZm9ybWF0ICgyNCBob3VyL2RheSBvciBBTS9QTSBob3VyIGZvcm1hdCkKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBGTVQgICAgICAgICAgIExMX1JUQ19HZXRIb3VyRm9ybWF0CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfSE9VUkZPUk1BVF8yNEhPVVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfSE9VUkZPUk1BVF9BTVBNCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0dldEhvdXJGb3JtYXQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPkNSLCBSVENfQ1JfRk1UKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VsZWN0IHRoZSBmbGFnIHRvIGJlIHJvdXRlZCB0byBSVENfQUxBUk0gb3V0cHV0CisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIE9TRUwgICAgICAgICAgTExfUlRDX1NldEFsYXJtT3V0RXZlbnQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBBbGFybU91dHB1dCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTEFSTU9VVF9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMQVJNT1VUX0FMTUEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxBUk1PVVRfQUxNQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTEFSTU9VVF9XQUtFVVAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19TZXRBbGFybU91dEV2ZW50KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBBbGFybU91dHB1dCkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5DUiwgUlRDX0NSX09TRUwsIEFsYXJtT3V0cHV0KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGZsYWcgdG8gYmUgcm91dGVkIHRvIFJUQ19BTEFSTSBvdXRwdXQKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBPU0VMICAgICAgICAgIExMX1JUQ19HZXRBbGFybU91dEV2ZW50CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxBUk1PVVRfRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTEFSTU9VVF9BTE1BCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMQVJNT1VUX0FMTUIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxBUk1PVVRfV0FLRVVQCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0dldEFsYXJtT3V0RXZlbnQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPkNSLCBSVENfQ1JfT1NFTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBSVENfQUxBUk0gb3V0cHV0IHR5cGUgKEFMQVJNIGluIHB1c2gtcHVsbCBvciBvcGVuLWRyYWluIG91dHB1dCkKKyAgKiBAbm90ZSAgIFVzZWQgb25seSB3aGVuIFJUQ19BTEFSTSBpcyBtYXBwZWQgb24gUEMxMworICAqIEBub3RlICAgSWYgYWxsIFJUQyBhbHRlcm5hdGUgZnVuY3Rpb25zIGFyZSBkaXNhYmxlZCBhbmQgUEMxM01PREUgPSAxLCBQQzEzVkFMVUUgY29uZmlndXJlcyB0aGUKKyAgKiAgICAgICAgIFBDMTMgb3V0cHV0IGRhdGEKKyAgKiBAcm10b2xsIFRBRkNSICAgICAgICBBTEFSTU9VVFRZUEUgIExMX1JUQ19TZXRBbGFybU91dHB1dFR5cGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBPdXRwdXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxBUk1fT1VUUFVUVFlQRV9PUEVORFJBSU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxBUk1fT1VUUFVUVFlQRV9QVVNIUFVMTAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1NldEFsYXJtT3V0cHV0VHlwZShSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgT3V0cHV0KQoreworICBNT0RJRllfUkVHKFJUQ3gtPlRBRkNSLCBSVENfVEFGQ1JfQUxBUk1PVVRUWVBFLCBPdXRwdXQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBSVENfQUxBUk0gb3V0cHV0IHR5cGUgKEFMQVJNIGluIHB1c2gtcHVsbCBvciBvcGVuLWRyYWluIG91dHB1dCkKKyAgKiBAbm90ZSAgIHVzZWQgb25seSB3aGVuIFJUQ19BTEFSTSBpcyBtYXBwZWQgb24gUEMxMworICAqIEBub3RlICAgSWYgYWxsIFJUQyBhbHRlcm5hdGUgZnVuY3Rpb25zIGFyZSBkaXNhYmxlZCBhbmQgUEMxM01PREUgPSAxLCBQQzEzVkFMVUUgY29uZmlndXJlcyB0aGUKKyAgKiAgICAgICAgIFBDMTMgb3V0cHV0IGRhdGEKKyAgKiBAcm10b2xsIFRBRkNSICAgICAgICBBTEFSTU9VVFRZUEUgIExMX1JUQ19HZXRBbGFybU91dHB1dFR5cGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTEFSTV9PVVRQVVRUWVBFX09QRU5EUkFJTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTEFSTV9PVVRQVVRUWVBFX1BVU0hQVUxMCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0dldEFsYXJtT3V0cHV0VHlwZShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+VEFGQ1IsIFJUQ19UQUZDUl9BTEFSTU9VVFRZUEUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgcHVzaC1wdWxsIG91dHB1dCBvbiBQQzEzLCBQQzE0IGFuZC9vciBQQzE1CisgICogQG5vdGUgICBQQzEzIGZvcmNlZCB0byBwdXNoLXB1bGwgb3V0cHV0IGlmIGFsbCBSVEMgYWx0ZXJuYXRlIGZ1bmN0aW9ucyBhcmUgZGlzYWJsZWQKKyAgKiBAbm90ZSAgIFBDMTQgYW5kIFBDMTUgZm9yY2VkIHRvIHB1c2gtcHVsbCBvdXRwdXQgaWYgTFNFIGlzIGRpc2FibGVkCisgICogQHJtdG9sbCBUQUZDUiAgICAgICAgUEMxM01PREUgIExMX1JUQ19FbmFibGVQdXNoUHVsbE1vZGVcbgorICAqIEBybXRvbGwgVEFGQ1IgICAgICAgIFBDMTRNT0RFICBMTF9SVENfRW5hYmxlUHVzaFB1bGxNb2RlXG4KKyAgKiBAcm10b2xsIFRBRkNSICAgICAgICBQQzE1TU9ERSAgTExfUlRDX0VuYWJsZVB1c2hQdWxsTW9kZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBpbk1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1BJTl9QQzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1BJTl9QQzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1BJTl9QQzE1CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRW5hYmxlUHVzaFB1bGxNb2RlKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBQaW5NYXNrKQoreworICBTRVRfQklUKFJUQ3gtPlRBRkNSLCBQaW5NYXNrKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHB1c2gtcHVsbCBvdXRwdXQgb24gUEMxMywgUEMxNCBhbmQvb3IgUEMxNQorICAqIEBub3RlICAgUEMxMywgUEMxNCBhbmQvb3IgUEMxNSBhcmUgY29udHJvbGxlZCBieSB0aGUgR1BJTyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KKyAgKiAgICAgICAgIENvbnNlcXVlbnRseSBQQzEzLCBQQzE0IGFuZC9vciBQQzE1IGFyZSBmbG9hdGluZyBpbiBTdGFuZGJ5IG1vZGUuCisgICogQHJtdG9sbCBUQUZDUiAgICAgICAgUEMxM01PREUgICAgICBMTF9SVENfRGlzYWJsZVB1c2hQdWxsTW9kZVxuCisgICogICAgICAgICBUQUZDUiAgICAgICAgUEMxNE1PREUgICAgICBMTF9SVENfRGlzYWJsZVB1c2hQdWxsTW9kZVxuCisgICogICAgICAgICBUQUZDUiAgICAgICAgUEMxNU1PREUgICAgICBMTF9SVENfRGlzYWJsZVB1c2hQdWxsTW9kZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBpbk1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1BJTl9QQzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1BJTl9QQzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1BJTl9QQzE1CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRGlzYWJsZVB1c2hQdWxsTW9kZShSVENfVHlwZURlZiogUlRDeCwgdWludDMyX3QgUGluTWFzaykKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPlRBRkNSLCBQaW5NYXNrKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgUEMxNCBhbmQvb3IgUEMxNSB0byBoaWdoIGxldmVsLgorICAqIEBub3RlICAgT3V0cHV0IGRhdGEgY29uZmlndXJhdGlvbiBpcyBwb3NzaWJsZSBpZiB0aGUgTFNFIGlzIGRpc2FibGVkIGFuZCBQdXNoUHVsbCBvdXRwdXQgaXMgZW5hYmxlZCAodGhyb3VnaCBAcmVmIExMX1JUQ19FbmFibGVQdXNoUHVsbE1vZGUpIAorICAqIEBybXRvbGwgVEFGQ1IgICAgICAgIFBDMTRWQUxVRSAgICAgTExfUlRDX1NldE91dHB1dFBpblxuCisgICogICAgICAgICBUQUZDUiAgICAgICAgUEMxNVZBTFVFICAgICBMTF9SVENfU2V0T3V0cHV0UGluCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgUGluTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfUElOX1BDMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfUElOX1BDMTUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19TZXRPdXRwdXRQaW4oUlRDX1R5cGVEZWYqIFJUQ3gsIHVpbnQzMl90IFBpbk1hc2spCit7CisgIFNFVF9CSVQoUlRDeC0+VEFGQ1IsIChQaW5NYXNrID4+IDEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgUEMxNCBhbmQvb3IgUEMxNSB0byBsb3cgbGV2ZWwuCisgICogQG5vdGUgICBPdXRwdXQgZGF0YSBjb25maWd1cmF0aW9uIGlzIHBvc3NpYmxlIGlmIHRoZSBMU0UgaXMgZGlzYWJsZWQgYW5kIFB1c2hQdWxsIG91dHB1dCBpcyBlbmFibGVkICh0aHJvdWdoIEByZWYgTExfUlRDX0VuYWJsZVB1c2hQdWxsTW9kZSkgCisgICogQHJtdG9sbCBUQUZDUiAgICAgICAgUEMxNFZBTFVFICAgICBMTF9SVENfUmVzZXRPdXRwdXRQaW5cbgorICAqICAgICAgICAgVEFGQ1IgICAgICAgIFBDMTVWQUxVRSAgICAgTExfUlRDX1Jlc2V0T3V0cHV0UGluCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgUGluTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfUElOX1BDMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfUElOX1BDMTUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19SZXNldE91dHB1dFBpbihSVENfVHlwZURlZiogUlRDeCwgdWludDMyX3QgUGluTWFzaykKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPlRBRkNSLCAoUGluTWFzayA+PiAxKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGluaXRpYWxpemF0aW9uIG1vZGUKKyAgKiBAbm90ZSAgIEluaXRpYWxpemF0aW9uIG1vZGUgaXMgdXNlZCB0byBwcm9ncmFtIHRpbWUgYW5kIGRhdGUgcmVnaXN0ZXIgKFJUQ19UUiBhbmQgUlRDX0RSKQorICAqICAgICAgICAgYW5kIHByZXNjYWxlciByZWdpc3RlciAoUlRDX1BSRVIpLgorICAqICAgICAgICAgQ291bnRlcnMgYXJlIHN0b3BwZWQgYW5kIHN0YXJ0IGNvdW50aW5nIGZyb20gdGhlIG5ldyB2YWx1ZSB3aGVuIElOSVQgaXMgcmVzZXQuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgSU5JVCAgICAgICAgICBMTF9SVENfRW5hYmxlSW5pdE1vZGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRW5hYmxlSW5pdE1vZGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICBXUklURV9SRUcoUlRDeC0+SVNSLCBSVENfSU5JVF9NQVNLKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGluaXRpYWxpemF0aW9uIG1vZGUgKEZyZWUgcnVubmluZyBtb2RlKQorICAqIEBybXRvbGwgSVNSICAgICAgICAgIElOSVQgICAgICAgICAgTExfUlRDX0Rpc2FibGVJbml0TW9kZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EaXNhYmxlSW5pdE1vZGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIC8qIEV4aXQgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICBXUklURV9SRUcoUlRDeC0+SVNSLCAodWludDMyX3QpflJUQ19JU1JfSU5JVCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IE91dHB1dCBwb2xhcml0eSAocGluIGlzIGxvdyB3aGVuIEFMUkFGL0FMUkJGL1dVVEYgaXMgYXNzZXJ0ZWQpCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFBPTCAgICAgICAgICAgTExfUlRDX1NldE91dHB1dFBvbGFyaXR5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfT1VUUFVUUE9MQVJJVFlfUElOX0hJR0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfT1VUUFVUUE9MQVJJVFlfUElOX0xPVworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1NldE91dHB1dFBvbGFyaXR5KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBQb2xhcml0eSkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5DUiwgUlRDX0NSX1BPTCwgUG9sYXJpdHkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBPdXRwdXQgcG9sYXJpdHkKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBQT0wgICAgICAgICAgIExMX1JUQ19HZXRPdXRwdXRQb2xhcml0eQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX09VVFBVVFBPTEFSSVRZX1BJTl9ISUdICisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX09VVFBVVFBPTEFSSVRZX1BJTl9MT1cKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfR2V0T3V0cHV0UG9sYXJpdHkoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPkNSLCBSVENfQ1JfUE9MKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEJ5cGFzcyB0aGUgc2hhZG93IHJlZ2lzdGVycworICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBCWVBTSEFEICAgICAgIExMX1JUQ19FbmFibGVTaGFkb3dSZWdCeXBhc3MKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRW5hYmxlU2hhZG93UmVnQnlwYXNzKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBTRVRfQklUKFJUQ3gtPkNSLCBSVENfQ1JfQllQU0hBRCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBCeXBhc3MgdGhlIHNoYWRvdyByZWdpc3RlcnMKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBCWVBTSEFEICAgICAgIExMX1JUQ19EaXNhYmxlU2hhZG93UmVnQnlwYXNzCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0Rpc2FibGVTaGFkb3dSZWdCeXBhc3MoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIENMRUFSX0JJVChSVEN4LT5DUiwgUlRDX0NSX0JZUFNIQUQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFNoYWRvdyByZWdpc3RlcnMgYnlwYXNzIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEJZUFNIQUQgICAgICAgTExfUlRDX0lzU2hhZG93UmVnQnlwYXNzRW5hYmxlZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNTaGFkb3dSZWdCeXBhc3NFbmFibGVkKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKFJFQURfQklUKFJUQ3gtPkNSLCBSVENfQ1JfQllQU0hBRCkgPT0gKFJUQ19DUl9CWVBTSEFEKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFJUQ19SRUZJTiByZWZlcmVuY2UgY2xvY2sgZGV0ZWN0aW9uICg1MCBvciA2MCBIeikKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQG5vdGUgICBJdCBjYW4gYmUgd3JpdHRlbiBpbiBpbml0aWFsaXphdGlvbiBtb2RlIG9ubHkgKEByZWYgTExfUlRDX0VuYWJsZUluaXRNb2RlIGZ1bmN0aW9uKQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFJFRkNLT04gICAgICAgTExfUlRDX0VuYWJsZVJlZkNsb2NrCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0VuYWJsZVJlZkNsb2NrKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBTRVRfQklUKFJUQ3gtPkNSLCBSVENfQ1JfUkVGQ0tPTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSVENfUkVGSU4gcmVmZXJlbmNlIGNsb2NrIGRldGVjdGlvbiAoNTAgb3IgNjAgSHopCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBub3RlICAgSXQgY2FuIGJlIHdyaXR0ZW4gaW4gaW5pdGlhbGl6YXRpb24gbW9kZSBvbmx5IChAcmVmIExMX1JUQ19FbmFibGVJbml0TW9kZSBmdW5jdGlvbikKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBSRUZDS09OICAgICAgIExMX1JUQ19EaXNhYmxlUmVmQ2xvY2sKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRGlzYWJsZVJlZkNsb2NrKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBDTEVBUl9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9SRUZDS09OKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQXN5bmNocm9ub3VzIHByZXNjYWxlciBmYWN0b3IKKyAgKiBAcm10b2xsIFBSRVIgICAgICAgICBQUkVESVZfQSAgICAgIExMX1JUQ19TZXRBc3luY2hQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBBc3luY2hQcmVzY2FsZXIgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHg3RgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1NldEFzeW5jaFByZXNjYWxlcihSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgQXN5bmNoUHJlc2NhbGVyKQoreworICBNT0RJRllfUkVHKFJUQ3gtPlBSRVIsIFJUQ19QUkVSX1BSRURJVl9BLCBBc3luY2hQcmVzY2FsZXIgPDwgUlRDX1BSRVJfUFJFRElWX0FfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgU3luY2hyb25vdXMgcHJlc2NhbGVyIGZhY3RvcgorICAqIEBybXRvbGwgUFJFUiAgICAgICAgIFBSRURJVl9TICAgICAgTExfUlRDX1NldFN5bmNoUHJlc2NhbGVyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgU3luY2hQcmVzY2FsZXIgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHg3RkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfU2V0U3luY2hQcmVzY2FsZXIoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFN5bmNoUHJlc2NhbGVyKQoreworICBNT0RJRllfUkVHKFJUQ3gtPlBSRVIsIFJUQ19QUkVSX1BSRURJVl9TLCBTeW5jaFByZXNjYWxlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFzeW5jaHJvbm91cyBwcmVzY2FsZXIgZmFjdG9yCisgICogQHJtdG9sbCBQUkVSICAgICAgICAgUFJFRElWX0EgICAgICBMTF9SVENfR2V0QXN5bmNoUHJlc2NhbGVyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHg3RgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19HZXRBc3luY2hQcmVzY2FsZXIoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlBSRVIsIFJUQ19QUkVSX1BSRURJVl9BKSA+PiBSVENfUFJFUl9QUkVESVZfQV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBTeW5jaHJvbm91cyBwcmVzY2FsZXIgZmFjdG9yCisgICogQHJtdG9sbCBQUkVSICAgICAgICAgUFJFRElWX1MgICAgICBMTF9SVENfR2V0U3luY2hQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweDdGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfR2V0U3luY2hQcmVzY2FsZXIoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlBSRVIsIFJUQ19QUkVSX1BSRURJVl9TKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzLgorICAqIEBybXRvbGwgV1BSICAgICAgICAgIEtFWSAgICAgICAgICAgTExfUlRDX0VuYWJsZVdyaXRlUHJvdGVjdGlvbgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19FbmFibGVXcml0ZVByb3RlY3Rpb24oUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFdSSVRFX1JFRyhSVEN4LT5XUFIsIFJUQ19XUklURV9QUk9URUNUSU9OX0RJU0FCTEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMuCisgICogQHJtdG9sbCBXUFIgICAgICAgICAgS0VZICAgICAgICAgICBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBXUklURV9SRUcoUlRDeC0+V1BSLCBSVENfV1JJVEVfUFJPVEVDVElPTl9FTkFCTEVfMSk7CisgIFdSSVRFX1JFRyhSVEN4LT5XUFIsIFJUQ19XUklURV9QUk9URUNUSU9OX0VOQUJMRV8yKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUZfVGltZSBUaW1lCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgdGltZSBmb3JtYXQgKEFNLzI0LWhvdXIgb3IgUE0gbm90YXRpb24pCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBub3RlICAgSXQgY2FuIGJlIHdyaXR0ZW4gaW4gaW5pdGlhbGl6YXRpb24gbW9kZSBvbmx5IChAcmVmIExMX1JUQ19FbmFibGVJbml0TW9kZSBmdW5jdGlvbikKKyAgKiBAcm10b2xsIFRSICAgICAgICAgICBQTSAgICAgICAgICAgIExMX1JUQ19USU1FX1NldEZvcm1hdAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVGb3JtYXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVElNRV9GT1JNQVRfQU1fT1JfMjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVElNRV9GT1JNQVRfUE0KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19USU1FX1NldEZvcm1hdChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgVGltZUZvcm1hdCkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5UUiwgUlRDX1RSX1BNLCBUaW1lRm9ybWF0KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGltZSBmb3JtYXQgKEFNIG9yIFBNIG5vdGF0aW9uKQorICAqIEBub3RlIGlmIHNoYWRvdyBtb2RlIGlzIGRpc2FibGVkIChCWVBTSEFEPTApLCBuZWVkIHRvIGNoZWNrIGlmIFJTRiBmbGFnIGlzIHNldAorICAqICAgICAgIGJlZm9yZSByZWFkaW5nIHRoaXMgYml0CisgICogQG5vdGUgUmVhZCBlaXRoZXIgUlRDX1NTUiBvciBSVENfVFIgbG9ja3MgdGhlIHZhbHVlcyBpbiB0aGUgaGlnaGVyLW9yZGVyIGNhbGVuZGFyCisgICogICAgICAgc2hhZG93IHJlZ2lzdGVycyB1bnRpbCBSVENfRFIgaXMgcmVhZCAoTExfUlRDX1JlYWRSZWcoUlRDLCBEUikpLgorICAqIEBybXRvbGwgVFIgICAgICAgICAgIFBNICAgICAgICAgICAgTExfUlRDX1RJTUVfR2V0Rm9ybWF0CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVElNRV9GT1JNQVRfQU1fT1JfMjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVElNRV9GT1JNQVRfUE0KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfVElNRV9HZXRGb3JtYXQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlRSLCBSVENfVFJfUE0pKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgSG91cnMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAbm90ZSAgIEl0IGNhbiBiZSB3cml0dGVuIGluIGluaXRpYWxpemF0aW9uIG1vZGUgb25seSAoQHJlZiBMTF9SVENfRW5hYmxlSW5pdE1vZGUgZnVuY3Rpb24pCisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRCBpcyBhdmFpbGFibGUgdG8gY29udmVydCBob3VyIGZyb20gYmluYXJ5IHRvIEJDRCBmb3JtYXQKKyAgKiBAcm10b2xsIFRSICAgICAgICAgICBIVCAgICAgICAgICAgIExMX1JUQ19USU1FX1NldEhvdXJcbgorICAqICAgICAgICAgVFIgICAgICAgICAgIEhVICAgICAgICAgICAgTExfUlRDX1RJTUVfU2V0SG91cgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEhvdXJzIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgxMiBvciBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MjMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19USU1FX1NldEhvdXIoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IEhvdXJzKQoreworICBNT0RJRllfUkVHKFJUQ3gtPlRSLCAoUlRDX1RSX0hUIHwgUlRDX1RSX0hVKSwKKyAgICAgICAgICAgICAoKChIb3VycyAmIDB4RjBVKSA8PCAoUlRDX1RSX0hUX1BvcyAtIDRVKSkgfCAoKEhvdXJzICYgMHgwRlUpIDw8IFJUQ19UUl9IVV9Qb3MpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEhvdXJzIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBpZiBzaGFkb3cgbW9kZSBpcyBkaXNhYmxlZCAoQllQU0hBRD0wKSwgbmVlZCB0byBjaGVjayBpZiBSU0YgZmxhZyBpcyBzZXQKKyAgKiAgICAgICBiZWZvcmUgcmVhZGluZyB0aGlzIGJpdAorICAqIEBub3RlIFJlYWQgZWl0aGVyIFJUQ19TU1Igb3IgUlRDX1RSIGxvY2tzIHRoZSB2YWx1ZXMgaW4gdGhlIGhpZ2hlci1vcmRlciBjYWxlbmRhcgorICAqICAgICAgIHNoYWRvdyByZWdpc3RlcnMgdW50aWwgUlRDX0RSIGlzIHJlYWQgKExMX1JUQ19SZWFkUmVnKFJUQywgRFIpKS4KKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IGhvdXIgZnJvbSBCQ0QgdG8KKyAgKiAgICAgICBCaW5hcnkgZm9ybWF0CisgICogQHJtdG9sbCBUUiAgICAgICAgICAgSFQgICAgICAgICAgICBMTF9SVENfVElNRV9HZXRIb3VyXG4KKyAgKiAgICAgICAgIFRSICAgICAgICAgICBIVSAgICAgICAgICAgIExMX1JUQ19USU1FX0dldEhvdXIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDEgYW5kIE1heF9EYXRhPTB4MTIgb3IgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDIzCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX1RJTUVfR2V0SG91cihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoKFJFQURfQklUKFJUQ3gtPlRSLCAoUlRDX1RSX0hUIHwgUlRDX1RSX0hVKSkpID4+IFJUQ19UUl9IVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBNaW51dGVzIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQG5vdGUgICBJdCBjYW4gYmUgd3JpdHRlbiBpbiBpbml0aWFsaXphdGlvbiBtb2RlIG9ubHkgKEByZWYgTExfUlRDX0VuYWJsZUluaXRNb2RlIGZ1bmN0aW9uKQorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QgaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgTWludXRlcyBmcm9tIGJpbmFyeSB0byBCQ0QgZm9ybWF0CisgICogQHJtdG9sbCBUUiAgICAgICAgICAgTU5UICAgICAgICAgICBMTF9SVENfVElNRV9TZXRNaW51dGVcbgorICAqICAgICAgICAgVFIgICAgICAgICAgIE1OVSAgICAgICAgICAgTExfUlRDX1RJTUVfU2V0TWludXRlCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgTWludXRlcyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19USU1FX1NldE1pbnV0ZShSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgTWludXRlcykKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5UUiwgKFJUQ19UUl9NTlQgfCBSVENfVFJfTU5VKSwKKyAgICAgICAgICAgICAoKChNaW51dGVzICYgMHhGMFUpIDw8IChSVENfVFJfTU5UX1BvcyAtIDRVKSkgfCAoKE1pbnV0ZXMgJiAweDBGVSkgPDwgUlRDX1RSX01OVV9Qb3MpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IE1pbnV0ZXMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGlmIHNoYWRvdyBtb2RlIGlzIGRpc2FibGVkIChCWVBTSEFEPTApLCBuZWVkIHRvIGNoZWNrIGlmIFJTRiBmbGFnIGlzIHNldAorICAqICAgICAgIGJlZm9yZSByZWFkaW5nIHRoaXMgYml0CisgICogQG5vdGUgUmVhZCBlaXRoZXIgUlRDX1NTUiBvciBSVENfVFIgbG9ja3MgdGhlIHZhbHVlcyBpbiB0aGUgaGlnaGVyLW9yZGVyIGNhbGVuZGFyCisgICogICAgICAgc2hhZG93IHJlZ2lzdGVycyB1bnRpbCBSVENfRFIgaXMgcmVhZCAoTExfUlRDX1JlYWRSZWcoUlRDLCBEUikpLgorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgbWludXRlIGZyb20gQkNECisgICogICAgICAgdG8gQmluYXJ5IGZvcm1hdAorICAqIEBybXRvbGwgVFIgICAgICAgICAgIE1OVCAgICAgICAgICAgTExfUlRDX1RJTUVfR2V0TWludXRlXG4KKyAgKiAgICAgICAgIFRSICAgICAgICAgICBNTlUgICAgICAgICAgIExMX1JUQ19USU1FX0dldE1pbnV0ZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg1OQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19USU1FX0dldE1pbnV0ZShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+VFIsIChSVENfVFJfTU5UIHwgUlRDX1RSX01OVSkpPj4gUlRDX1RSX01OVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBTZWNvbmRzIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQG5vdGUgICBJdCBjYW4gYmUgd3JpdHRlbiBpbiBpbml0aWFsaXphdGlvbiBtb2RlIG9ubHkgKEByZWYgTExfUlRDX0VuYWJsZUluaXRNb2RlIGZ1bmN0aW9uKQorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QgaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgU2Vjb25kcyBmcm9tIGJpbmFyeSB0byBCQ0QgZm9ybWF0CisgICogQHJtdG9sbCBUUiAgICAgICAgICAgU1QgICAgICAgICAgICBMTF9SVENfVElNRV9TZXRTZWNvbmRcbgorICAqICAgICAgICAgVFIgICAgICAgICAgIFNVICAgICAgICAgICAgTExfUlRDX1RJTUVfU2V0U2Vjb25kCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgU2Vjb25kcyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19USU1FX1NldFNlY29uZChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgU2Vjb25kcykKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5UUiwgKFJUQ19UUl9TVCB8IFJUQ19UUl9TVSksCisgICAgICAgICAgICAgKCgoU2Vjb25kcyAmIDB4RjBVKSA8PCAoUlRDX1RSX1NUX1BvcyAtIDRVKSkgfCAoKFNlY29uZHMgJiAweDBGVSkgPDwgUlRDX1RSX1NVX1BvcykpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgU2Vjb25kcyBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaWYgc2hhZG93IG1vZGUgaXMgZGlzYWJsZWQgKEJZUFNIQUQ9MCksIG5lZWQgdG8gY2hlY2sgaWYgUlNGIGZsYWcgaXMgc2V0CisgICogICAgICAgYmVmb3JlIHJlYWRpbmcgdGhpcyBiaXQKKyAgKiBAbm90ZSBSZWFkIGVpdGhlciBSVENfU1NSIG9yIFJUQ19UUiBsb2NrcyB0aGUgdmFsdWVzIGluIHRoZSBoaWdoZXItb3JkZXIgY2FsZW5kYXIKKyAgKiAgICAgICBzaGFkb3cgcmVnaXN0ZXJzIHVudGlsIFJUQ19EUiBpcyByZWFkIChMTF9SVENfUmVhZFJlZyhSVEMsIERSKSkuCisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTiBpcyBhdmFpbGFibGUgdG8gY29udmVydCBTZWNvbmRzIGZyb20gQkNECisgICogICAgICAgdG8gQmluYXJ5IGZvcm1hdAorICAqIEBybXRvbGwgVFIgICAgICAgICAgIFNUICAgICAgICAgICAgTExfUlRDX1RJTUVfR2V0U2Vjb25kXG4KKyAgKiAgICAgICAgIFRSICAgICAgICAgICBTVSAgICAgICAgICAgIExMX1JUQ19USU1FX0dldFNlY29uZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg1OQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19USU1FX0dldFNlY29uZChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+VFIsIChSVENfVFJfU1QgfCBSVENfVFJfU1UpKSA+PiBSVENfVFJfU1VfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGltZSAoaG91ciwgbWludXRlIGFuZCBzZWNvbmQpIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQG5vdGUgICBJdCBjYW4gYmUgd3JpdHRlbiBpbiBpbml0aWFsaXphdGlvbiBtb2RlIG9ubHkgKEByZWYgTExfUlRDX0VuYWJsZUluaXRNb2RlIGZ1bmN0aW9uKQorICAqIEBub3RlIFRpbWVGb3JtYXQgYW5kIEhvdXJzIHNob3VsZCBmb2xsb3cgdGhlIHNhbWUgZm9ybWF0CisgICogQHJtdG9sbCBUUiAgICAgICAgICAgUE0gICAgICAgICAgICBMTF9SVENfVElNRV9Db25maWdcbgorICAqICAgICAgICAgVFIgICAgICAgICAgIEhUICAgICAgICAgICAgTExfUlRDX1RJTUVfQ29uZmlnXG4KKyAgKiAgICAgICAgIFRSICAgICAgICAgICBIVSAgICAgICAgICAgIExMX1JUQ19USU1FX0NvbmZpZ1xuCisgICogICAgICAgICBUUiAgICAgICAgICAgTU5UICAgICAgICAgICBMTF9SVENfVElNRV9Db25maWdcbgorICAqICAgICAgICAgVFIgICAgICAgICAgIE1OVSAgICAgICAgICAgTExfUlRDX1RJTUVfQ29uZmlnXG4KKyAgKiAgICAgICAgIFRSICAgICAgICAgICBTVCAgICAgICAgICAgIExMX1JUQ19USU1FX0NvbmZpZ1xuCisgICogICAgICAgICBUUiAgICAgICAgICAgU1UgICAgICAgICAgICBMTF9SVENfVElNRV9Db25maWcKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBGb3JtYXQxMl8yNCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19USU1FX0ZPUk1BVF9BTV9PUl8yNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19USU1FX0ZPUk1BVF9QTQorICAqIEBwYXJhbSAgSG91cnMgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAxIGFuZCBNYXhfRGF0YT0weDEyIG9yIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgyMworICAqIEBwYXJhbSAgTWludXRlcyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKiBAcGFyYW0gIFNlY29uZHMgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDU5CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVElNRV9Db25maWcoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IEZvcm1hdDEyXzI0LCB1aW50MzJfdCBIb3VycywgdWludDMyX3QgTWludXRlcywgdWludDMyX3QgU2Vjb25kcykKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdGVtcCA9IDBVOworCisgIHRlbXAgPSBGb3JtYXQxMl8yNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgXAorICAgICAgICAgKCgoSG91cnMgJiAweEYwVSkgPDwgKFJUQ19UUl9IVF9Qb3MgLSA0VSkpIHwgKChIb3VycyAmIDB4MEZVKSA8PCBSVENfVFJfSFVfUG9zKSkgICAgIHwgXAorICAgICAgICAgKCgoTWludXRlcyAmIDB4RjBVKSA8PCAoUlRDX1RSX01OVF9Qb3MgLSA0VSkpIHwgKChNaW51dGVzICYgMHgwRlUpIDw8IFJUQ19UUl9NTlVfUG9zKSkgfCBcCisgICAgICAgICAoKChTZWNvbmRzICYgMHhGMFUpIDw8IChSVENfVFJfU1RfUG9zIC0gNFUpKSB8ICgoU2Vjb25kcyAmIDB4MEZVKSA8PCBSVENfVFJfU1VfUG9zKSk7CisgIE1PRElGWV9SRUcoUlRDeC0+VFIsIChSVENfVFJfUE0gfCBSVENfVFJfSFQgfCBSVENfVFJfSFUgfCBSVENfVFJfTU5UIHwgUlRDX1RSX01OVSB8IFJUQ19UUl9TVCB8IFJUQ19UUl9TVSksIHRlbXApOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aW1lIChob3VyLCBtaW51dGUgYW5kIHNlY29uZCkgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGlmIHNoYWRvdyBtb2RlIGlzIGRpc2FibGVkIChCWVBTSEFEPTApLCBuZWVkIHRvIGNoZWNrIGlmIFJTRiBmbGFnIGlzIHNldAorICAqICAgICAgIGJlZm9yZSByZWFkaW5nIHRoaXMgYml0CisgICogQG5vdGUgUmVhZCBlaXRoZXIgUlRDX1NTUiBvciBSVENfVFIgbG9ja3MgdGhlIHZhbHVlcyBpbiB0aGUgaGlnaGVyLW9yZGVyIGNhbGVuZGFyCisgICogICAgICAgc2hhZG93IHJlZ2lzdGVycyB1bnRpbCBSVENfRFIgaXMgcmVhZCAoTExfUlRDX1JlYWRSZWcoUlRDLCBEUikpLgorICAqIEBub3RlIGhlbHBlciBtYWNyb3MgX19MTF9SVENfR0VUX0hPVVIsIF9fTExfUlRDX0dFVF9NSU5VVEUgYW5kIF9fTExfUlRDX0dFVF9TRUNPTkQKKyAgKiAgICAgICBhcmUgYXZhaWxhYmxlIHRvIGdldCBpbmRlcGVuZGVudGx5IGVhY2ggcGFyYW1ldGVyLgorICAqIEBybXRvbGwgVFIgICAgICAgICAgIEhUICAgICAgICAgICAgTExfUlRDX1RJTUVfR2V0XG4KKyAgKiAgICAgICAgIFRSICAgICAgICAgICBIVSAgICAgICAgICAgIExMX1JUQ19USU1FX0dldFxuCisgICogICAgICAgICBUUiAgICAgICAgICAgTU5UICAgICAgICAgICBMTF9SVENfVElNRV9HZXRcbgorICAqICAgICAgICAgVFIgICAgICAgICAgIE1OVSAgICAgICAgICAgTExfUlRDX1RJTUVfR2V0XG4KKyAgKiAgICAgICAgIFRSICAgICAgICAgICBTVCAgICAgICAgICAgIExMX1JUQ19USU1FX0dldFxuCisgICogICAgICAgICBUUiAgICAgICAgICAgU1UgICAgICAgICAgICBMTF9SVENfVElNRV9HZXQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBDb21iaW5hdGlvbiBvZiBob3VycywgbWludXRlcyBhbmQgc2Vjb25kcyAoRm9ybWF0OiAweDAwSEhNTVNTKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfVElNRV9HZXQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IHRlbXAgPSAwVTsKKyAgCisgIHRlbXAgPSBSRUFEX0JJVChSVEN4LT5UUiwgKFJUQ19UUl9IVCB8IFJUQ19UUl9IVSB8IFJUQ19UUl9NTlQgfCBSVENfVFJfTU5VIHwgUlRDX1RSX1NUIHwgUlRDX1RSX1NVKSk7CisgIHJldHVybiAodWludDMyX3QpKCgoKCgodGVtcCAmIFJUQ19UUl9IVCkgPj4gUlRDX1RSX0hUX1BvcykgPDwgNFUpIHwgKCh0ZW1wICYgUlRDX1RSX0hVKSA+PiBSVENfVFJfSFVfUG9zKSkgPDwgUlRDX09GRlNFVF9IT1VSKSB8ICBcCisgICAgICAgICAgICAgICAgICAgICgoKCgodGVtcCAmIFJUQ19UUl9NTlQpID4+IFJUQ19UUl9NTlRfUG9zKSA8PCA0VSkgfCAoKHRlbXAgJiBSVENfVFJfTU5VKSA+PiBSVENfVFJfTU5VX1BvcykpIDw8IFJUQ19PRkZTRVRfTUlOVVRFKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgKCgoKHRlbXAgJiBSVENfVFJfU1QpID4+IFJUQ19UUl9TVF9Qb3MpIDw8IDRVKSB8ICgodGVtcCAmIFJUQ19UUl9TVSkgPj4gUlRDX1RSX1NVX1BvcykpKTsKK30KKworLyoqCisgICogQGJyaWVmICBNZW1vcml6ZSB3aGV0aGVyIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjaGFuZ2UgaGFzIGJlZW4gcGVyZm9ybWVkCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEJLUCAgICAgICAgICAgTExfUlRDX1RJTUVfRW5hYmxlRGF5TGlnaHRTdG9yZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19USU1FX0VuYWJsZURheUxpZ2h0U3RvcmUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9CS1ApOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgbWVtb3JpemF0aW9uIHdoZXRoZXIgdGhlIGRheWxpZ2h0IHNhdmluZyB0aW1lIGNoYW5nZSBoYXMgYmVlbiBwZXJmb3JtZWQuCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEJLUCAgICAgICAgICAgTExfUlRDX1RJTUVfRGlzYWJsZURheUxpZ2h0U3RvcmUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVElNRV9EaXNhYmxlRGF5TGlnaHRTdG9yZShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPkNSLCBSVENfQ1JfQktQKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSVEMgRGF5IExpZ2h0IFNhdmluZyBzdG9yZWQgb3BlcmF0aW9uIGhhcyBiZWVuIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQktQICAgICAgICAgICBMTF9SVENfVElNRV9Jc0RheUxpZ2h0U3RvcmVFbmFibGVkCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19USU1FX0lzRGF5TGlnaHRTdG9yZUVuYWJsZWQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9CS1ApID09IChSVENfQ1JfQktQKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3VidHJhY3QgMSBob3VyICh3aW50ZXIgdGltZSBjaGFuZ2UpCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFNVQjFIICAgICAgICAgTExfUlRDX1RJTUVfRGVjSG91cgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19USU1FX0RlY0hvdXIoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9TVUIxSCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWRkIDEgaG91ciAoc3VtbWVyIHRpbWUgY2hhbmdlKQorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBBREQxSCAgICAgICAgIExMX1JUQ19USU1FX0luY0hvdXIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVElNRV9JbmNIb3VyKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBTRVRfQklUKFJUQ3gtPkNSLCBSVENfQ1JfQUREMUgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBTdWIgc2Vjb25kIHZhbHVlIGluIHRoZSBzeW5jaHJvbm91cyBwcmVzY2FsZXIgY291bnRlci4KKyAgKiBAbm90ZSAgWW91IGNhbiB1c2UgYm90aCBTdWJTZWNvbmRzIHZhbHVlIGFuZCBTZWNvbmRGcmFjdGlvbiAoUFJFRElWX1MgdGhyb3VnaAorICAqICAgICAgICBMTF9SVENfR2V0U3luY2hQcmVzY2FsZXIgZnVuY3Rpb24pIHRlcm1zIHJldHVybmVkIHRvIGNvbnZlcnQgQ2FsZW5kYXIKKyAgKiAgICAgICAgU3ViU2Vjb25kcyB2YWx1ZSBpbiBzZWNvbmQgZnJhY3Rpb24gcmF0aW8gd2l0aCB0aW1lIHVuaXQgZm9sbG93aW5nCisgICogICAgICAgIGdlbmVyaWMgZm9ybXVsYToKKyAgKiAgICAgICAgICA9PT4gU2Vjb25kcyBmcmFjdGlvbiByYXRpbyAqIHRpbWVfdW5pdD0gWyhTZWNvbmRGcmFjdGlvbi1TdWJTZWNvbmRzKS8oU2Vjb25kRnJhY3Rpb24rMSldICogdGltZV91bml0CisgICogICAgICAgIFRoaXMgY29udmVyc2lvbiBjYW4gYmUgcGVyZm9ybWVkIG9ubHkgaWYgbm8gc2hpZnQgb3BlcmF0aW9uIGlzIHBlbmRpbmcKKyAgKiAgICAgICAgKGllLiBTSEZQPTApIHdoZW4gUFJFRElWX1MgPj0gU1MuCisgICogQHJtdG9sbCBTU1IgICAgICAgICAgU1MgICAgICAgICAgICBMTF9SVENfVElNRV9HZXRTdWJTZWNvbmQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdWIgc2Vjb25kIHZhbHVlIChudW1iZXIgYmV0d2VlbiAwIGFuZCA2NTUzNSkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfVElNRV9HZXRTdWJTZWNvbmQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlNTUiwgUlRDX1NTUl9TUykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN5bmNocm9uaXplIHRvIGEgcmVtb3RlIGNsb2NrIHdpdGggYSBoaWdoIGRlZ3JlZSBvZiBwcmVjaXNpb24uCisgICogQG5vdGUgICBUaGlzIG9wZXJhdGlvbiBlZmZlY3RpdmVseSBzdWJ0cmFjdHMgZnJvbSAoZGVsYXlzKSBvciBhZHZhbmNlIHRoZSBjbG9jayBvZiBhIGZyYWN0aW9uIG9mIGEgc2Vjb25kLgorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAbm90ZSAgIFdoZW4gUkVGQ0tPTiBpcyBzZXQsIGZpcm13YXJlIG11c3Qgbm90IHdyaXRlIHRvIFNoaWZ0IGNvbnRyb2wgcmVnaXN0ZXIuCisgICogQHJtdG9sbCBTSElGVFIgICAgICAgQUREMVMgICAgICAgICBMTF9SVENfVElNRV9TeW5jaHJvbml6ZVxuCisgICogICAgICAgICBTSElGVFIgICAgICAgU1VCRlMgICAgICAgICBMTF9SVENfVElNRV9TeW5jaHJvbml6ZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFNoaWZ0U2Vjb25kIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1NISUZUX1NFQ09ORF9ERUxBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19TSElGVF9TRUNPTkRfQURWQU5DRQorICAqIEBwYXJhbSAgRnJhY3Rpb24gTnVtYmVyIG9mIFNlY29uZHMgRnJhY3Rpb25zIChhbnkgdmFsdWUgZnJvbSAwIHRvIDB4N0ZGRikKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19USU1FX1N5bmNocm9uaXplKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBTaGlmdFNlY29uZCwgdWludDMyX3QgRnJhY3Rpb24pCit7CisgIFdSSVRFX1JFRyhSVEN4LT5TSElGVFIsIFNoaWZ0U2Vjb25kIHwgRnJhY3Rpb24pOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FRl9EYXRlIERhdGUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBZZWFyIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IFllYXIgZnJvbSBiaW5hcnkgdG8gQkNEIGZvcm1hdAorICAqIEBybXRvbGwgRFIgICAgICAgICAgIFlUICAgICAgICAgICAgTExfUlRDX0RBVEVfU2V0WWVhclxuCisgICogICAgICAgICBEUiAgICAgICAgICAgWVUgICAgICAgICAgICBMTF9SVENfREFURV9TZXRZZWFyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgWWVhciBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4OTkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EQVRFX1NldFllYXIoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFllYXIpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+RFIsIChSVENfRFJfWVQgfCBSVENfRFJfWVUpLAorICAgICAgICAgICAgICgoKFllYXIgJiAweEYwVSkgPDwgKFJUQ19EUl9ZVF9Qb3MgLSA0VSkpIHwgKChZZWFyICYgMHgwRlUpIDw8IFJUQ19EUl9ZVV9Qb3MpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFllYXIgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGlmIHNoYWRvdyBtb2RlIGlzIGRpc2FibGVkIChCWVBTSEFEPTApLCBuZWVkIHRvIGNoZWNrIGlmIFJTRiBmbGFnIGlzIHNldAorICAqICAgICAgIGJlZm9yZSByZWFkaW5nIHRoaXMgYml0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTiBpcyBhdmFpbGFibGUgdG8gY29udmVydCBZZWFyIGZyb20gQkNEIHRvIEJpbmFyeSBmb3JtYXQKKyAgKiBAcm10b2xsIERSICAgICAgICAgICBZVCAgICAgICAgICAgIExMX1JUQ19EQVRFX0dldFllYXJcbgorICAqICAgICAgICAgRFIgICAgICAgICAgIFlVICAgICAgICAgICAgTExfUlRDX0RBVEVfR2V0WWVhcgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg5OQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19EQVRFX0dldFllYXIoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKChSRUFEX0JJVChSVEN4LT5EUiwgKFJUQ19EUl9ZVCB8IFJUQ19EUl9ZVSkpKSA+PiBSVENfRFJfWVVfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgV2VlayBkYXkKKyAgKiBAcm10b2xsIERSICAgICAgICAgICBXRFUgICAgICAgICAgIExMX1JUQ19EQVRFX1NldFdlZWtEYXkKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBXZWVrRGF5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfTU9OREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfVFVFU0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1dFRE5FU0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1RIVVJTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfRlJJREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfU0FUVVJEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9TVU5EQVkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EQVRFX1NldFdlZWtEYXkoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFdlZWtEYXkpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+RFIsIFJUQ19EUl9XRFUsIFdlZWtEYXkgPDwgUlRDX0RSX1dEVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBXZWVrIGRheQorICAqIEBub3RlIGlmIHNoYWRvdyBtb2RlIGlzIGRpc2FibGVkIChCWVBTSEFEPTApLCBuZWVkIHRvIGNoZWNrIGlmIFJTRiBmbGFnIGlzIHNldAorICAqICAgICAgIGJlZm9yZSByZWFkaW5nIHRoaXMgYml0CisgICogQHJtdG9sbCBEUiAgICAgICAgICAgV0RVICAgICAgICAgICBMTF9SVENfREFURV9HZXRXZWVrRGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9NT05EQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9UVUVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfV0VETkVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfVEhVUlNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9GUklEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9TQVRVUkRBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1NVTkRBWQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19EQVRFX0dldFdlZWtEYXkoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPkRSLCBSVENfRFJfV0RVKSA+PiBSVENfRFJfV0RVX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IE1vbnRoIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IE1vbnRoIGZyb20gYmluYXJ5IHRvIEJDRCBmb3JtYXQKKyAgKiBAcm10b2xsIERSICAgICAgICAgICBNVCAgICAgICAgICAgIExMX1JUQ19EQVRFX1NldE1vbnRoXG4KKyAgKiAgICAgICAgIERSICAgICAgICAgICBNVSAgICAgICAgICAgIExMX1JUQ19EQVRFX1NldE1vbnRoCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgTW9udGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfSkFOVUFSWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9GRUJSVUFSWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9NQVJDSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9BUFJJTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9NQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfSlVORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9KVUxZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0FVR1VTVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9TRVBURU1CRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfT0NUT0JFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9OT1ZFTUJFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9ERUNFTUJFUgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0RBVEVfU2V0TW9udGgoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IE1vbnRoKQoreworICBNT0RJRllfUkVHKFJUQ3gtPkRSLCAoUlRDX0RSX01UIHwgUlRDX0RSX01VKSwKKyAgICAgICAgICAgICAoKChNb250aCAmIDB4RjBVKSA8PCAoUlRDX0RSX01UX1BvcyAtIDRVKSkgfCAoKE1vbnRoICYgMHgwRlUpIDw8IFJUQ19EUl9NVV9Qb3MpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IE1vbnRoIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBpZiBzaGFkb3cgbW9kZSBpcyBkaXNhYmxlZCAoQllQU0hBRD0wKSwgbmVlZCB0byBjaGVjayBpZiBSU0YgZmxhZyBpcyBzZXQKKyAgKiAgICAgICBiZWZvcmUgcmVhZGluZyB0aGlzIGJpdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgTW9udGggZnJvbSBCQ0QgdG8gQmluYXJ5IGZvcm1hdAorICAqIEBybXRvbGwgRFIgICAgICAgICAgIE1UICAgICAgICAgICAgTExfUlRDX0RBVEVfR2V0TW9udGhcbgorICAqICAgICAgICAgRFIgICAgICAgICAgIE1VICAgICAgICAgICAgTExfUlRDX0RBVEVfR2V0TW9udGgKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9KQU5VQVJZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0ZFQlJVQVJZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX01BUkNICisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0FQUklMCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX01BWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9KVU5FCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0pVTFkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfQVVHVVNUCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX1NFUFRFTUJFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9PQ1RPQkVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX05PVkVNQkVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0RFQ0VNQkVSCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0RBVEVfR2V0TW9udGgoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKChSRUFEX0JJVChSVEN4LT5EUiwgKFJUQ19EUl9NVCB8IFJUQ19EUl9NVSkpKT4+IFJUQ19EUl9NVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBEYXkgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QgaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgRGF5IGZyb20gYmluYXJ5IHRvIEJDRCBmb3JtYXQKKyAgKiBAcm10b2xsIERSICAgICAgICAgICBEVCAgICAgICAgICAgIExMX1JUQ19EQVRFX1NldERheVxuCisgICogICAgICAgICBEUiAgICAgICAgICAgRFUgICAgICAgICAgICBMTF9SVENfREFURV9TZXREYXkKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBEYXkgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAxIGFuZCBNYXhfRGF0YT0weDMxCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfREFURV9TZXREYXkoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IERheSkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5EUiwgKFJUQ19EUl9EVCB8IFJUQ19EUl9EVSksCisgICAgICAgICAgICAgKCgoRGF5ICYgMHhGMFUpIDw8IChSVENfRFJfRFRfUG9zIC0gNFUpKSB8ICgoRGF5ICYgMHgwRlUpIDw8IFJUQ19EUl9EVV9Qb3MpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IERheSBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaWYgc2hhZG93IG1vZGUgaXMgZGlzYWJsZWQgKEJZUFNIQUQ9MCksIG5lZWQgdG8gY2hlY2sgaWYgUlNGIGZsYWcgaXMgc2V0CisgICogICAgICAgYmVmb3JlIHJlYWRpbmcgdGhpcyBiaXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IERheSBmcm9tIEJDRCB0byBCaW5hcnkgZm9ybWF0CisgICogQHJtdG9sbCBEUiAgICAgICAgICAgRFQgICAgICAgICAgICBMTF9SVENfREFURV9HZXREYXlcbgorICAqICAgICAgICAgRFIgICAgICAgICAgIERVICAgICAgICAgICAgTExfUlRDX0RBVEVfR2V0RGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAxIGFuZCBNYXhfRGF0YT0weDMxCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0RBVEVfR2V0RGF5KFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KSgoUkVBRF9CSVQoUlRDeC0+RFIsIChSVENfRFJfRFQgfCBSVENfRFJfRFUpKSkgPj4gUlRDX0RSX0RVX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGRhdGUgKFdlZWtEYXksIERheSwgTW9udGggYW5kIFllYXIpIGluIEJDRCBmb3JtYXQKKyAgKiBAcm10b2xsIERSICAgICAgICAgICBXRFUgICAgICAgICAgIExMX1JUQ19EQVRFX0NvbmZpZ1xuCisgICogICAgICAgICBEUiAgICAgICAgICAgTVQgICAgICAgICAgICBMTF9SVENfREFURV9Db25maWdcbgorICAqICAgICAgICAgRFIgICAgICAgICAgIE1VICAgICAgICAgICAgTExfUlRDX0RBVEVfQ29uZmlnXG4KKyAgKiAgICAgICAgIERSICAgICAgICAgICBEVCAgICAgICAgICAgIExMX1JUQ19EQVRFX0NvbmZpZ1xuCisgICogICAgICAgICBEUiAgICAgICAgICAgRFUgICAgICAgICAgICBMTF9SVENfREFURV9Db25maWdcbgorICAqICAgICAgICAgRFIgICAgICAgICAgIFlUICAgICAgICAgICAgTExfUlRDX0RBVEVfQ29uZmlnXG4KKyAgKiAgICAgICAgIERSICAgICAgICAgICBZVSAgICAgICAgICAgIExMX1JUQ19EQVRFX0NvbmZpZworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFdlZWtEYXkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9NT05EQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9UVUVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfV0VETkVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfVEhVUlNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9GUklEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9TQVRVUkRBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1NVTkRBWQorICAqIEBwYXJhbSAgRGF5IFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgzMQorICAqIEBwYXJhbSAgTW9udGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfSkFOVUFSWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9GRUJSVUFSWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9NQVJDSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9BUFJJTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9NQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfSlVORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9KVUxZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0FVR1VTVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9TRVBURU1CRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfT0NUT0JFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9OT1ZFTUJFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9ERUNFTUJFUgorICAqIEBwYXJhbSAgWWVhciBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4OTkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EQVRFX0NvbmZpZyhSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgV2Vla0RheSwgdWludDMyX3QgRGF5LCB1aW50MzJfdCBNb250aCwgdWludDMyX3QgWWVhcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdGVtcCA9IDBVOworCisgIHRlbXAgPSAoV2Vla0RheSA8PCBSVENfRFJfV0RVX1BvcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgXAorICAgICAgICAgKCgoWWVhciAmIDB4RjBVKSA8PCAoUlRDX0RSX1lUX1BvcyAtIDRVKSkgfCAoKFllYXIgJiAweDBGVSkgPDwgUlRDX0RSX1lVX1BvcykpICAgfCBcCisgICAgICAgICAoKChNb250aCAmIDB4RjBVKSA8PCAoUlRDX0RSX01UX1BvcyAtIDRVKSkgfCAoKE1vbnRoICYgMHgwRlUpIDw8IFJUQ19EUl9NVV9Qb3MpKSB8IFwKKyAgICAgICAgICgoKERheSAmIDB4RjBVKSA8PCAoUlRDX0RSX0RUX1BvcyAtIDRVKSkgfCAoKERheSAmIDB4MEZVKSA8PCBSVENfRFJfRFVfUG9zKSk7CisKKyAgTU9ESUZZX1JFRyhSVEN4LT5EUiwgKFJUQ19EUl9XRFUgfCBSVENfRFJfTVQgfCBSVENfRFJfTVUgfCBSVENfRFJfRFQgfCBSVENfRFJfRFUgfCBSVENfRFJfWVQgfCBSVENfRFJfWVUpLCB0ZW1wKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZGF0ZSAoV2Vla0RheSwgRGF5LCBNb250aCBhbmQgWWVhcikgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGlmIHNoYWRvdyBtb2RlIGlzIGRpc2FibGVkIChCWVBTSEFEPTApLCBuZWVkIHRvIGNoZWNrIGlmIFJTRiBmbGFnIGlzIHNldAorICAqICAgICAgIGJlZm9yZSByZWFkaW5nIHRoaXMgYml0CisgICogQG5vdGUgaGVscGVyIG1hY3JvcyBfX0xMX1JUQ19HRVRfV0VFS0RBWSwgX19MTF9SVENfR0VUX1lFQVIsIF9fTExfUlRDX0dFVF9NT05USCwKKyAgKiBhbmQgX19MTF9SVENfR0VUX0RBWSBhcmUgYXZhaWxhYmxlIHRvIGdldCBpbmRlcGVuZGVudGx5IGVhY2ggcGFyYW1ldGVyLgorICAqIEBybXRvbGwgRFIgICAgICAgICAgIFdEVSAgICAgICAgICAgTExfUlRDX0RBVEVfR2V0XG4KKyAgKiAgICAgICAgIERSICAgICAgICAgICBNVCAgICAgICAgICAgIExMX1JUQ19EQVRFX0dldFxuCisgICogICAgICAgICBEUiAgICAgICAgICAgTVUgICAgICAgICAgICBMTF9SVENfREFURV9HZXRcbgorICAqICAgICAgICAgRFIgICAgICAgICAgIERUICAgICAgICAgICAgTExfUlRDX0RBVEVfR2V0XG4KKyAgKiAgICAgICAgIERSICAgICAgICAgICBEVSAgICAgICAgICAgIExMX1JUQ19EQVRFX0dldFxuCisgICogICAgICAgICBEUiAgICAgICAgICAgWVQgICAgICAgICAgICBMTF9SVENfREFURV9HZXRcbgorICAqICAgICAgICAgRFIgICAgICAgICAgIFlVICAgICAgICAgICAgTExfUlRDX0RBVEVfR2V0CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgQ29tYmluYXRpb24gb2YgV2Vla0RheSwgRGF5LCBNb250aCBhbmQgWWVhciAoRm9ybWF0OiAweFdXRERNTVlZKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfREFURV9HZXQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IHRlbXAgPSAwVTsKKyAgCisgIHRlbXAgPSBSRUFEX0JJVChSVEN4LT5EUiwgKFJUQ19EUl9XRFUgfCBSVENfRFJfTVQgfCBSVENfRFJfTVUgfCBSVENfRFJfRFQgfCBSVENfRFJfRFUgfCBSVENfRFJfWVQgfCBSVENfRFJfWVUpKTsKKyAgcmV0dXJuICh1aW50MzJfdCkoKCgodGVtcCAmIFJUQ19EUl9XRFUpID4+IFJUQ19EUl9XRFVfUG9zKSA8PCBSVENfT0ZGU0VUX1dFRUtEQVkpIHwgXAorICAgICAgICAgICAgICAgICAgICAoKCgoKHRlbXAgJiBSVENfRFJfRFQpID4+IFJUQ19EUl9EVF9Qb3MpIDw8IDRVKSB8ICgodGVtcCAmIFJUQ19EUl9EVSkgPj4gUlRDX0RSX0RVX1BvcykpIDw8IFJUQ19PRkZTRVRfREFZKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgKCgoKCh0ZW1wICYgUlRDX0RSX01UKSA+PiBSVENfRFJfTVRfUG9zKSA8PCA0VSkgfCAoKHRlbXAgJiBSVENfRFJfTVUpID4+IFJUQ19EUl9NVV9Qb3MpKSA8PCBSVENfT0ZGU0VUX01PTlRIKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgKCgoKHRlbXAgJiBSVENfRFJfWVQpID4+IFJUQ19EUl9ZVF9Qb3MpIDw8IDRVKSB8ICgodGVtcCAmIFJUQ19EUl9ZVSkgPj4gUlRDX0RSX1lVX1BvcykpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUZfQUxBUk1BIEFMQVJNQQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEFsYXJtIEEKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQUxSQUUgICAgICAgICBMTF9SVENfQUxNQV9FbmFibGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQV9FbmFibGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9BTFJBRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBbGFybSBBCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEFMUkFFICAgICAgICAgTExfUlRDX0FMTUFfRGlzYWJsZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1BX0Rpc2FibGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIENMRUFSX0JJVChSVEN4LT5DUiwgUlRDX0NSX0FMUkFFKTsKK30KKworLyoqCisgICogQGJyaWVmICBTcGVjaWZ5IHRoZSBBbGFybSBBIG1hc2tzLgorICAqIEBybXRvbGwgQUxSTUFSICAgICAgIE1TSzQgICAgICAgICAgTExfUlRDX0FMTUFfU2V0TWFza1xuCisgICogICAgICAgICBBTFJNQVIgICAgICAgTVNLMyAgICAgICAgICBMTF9SVENfQUxNQV9TZXRNYXNrXG4KKyAgKiAgICAgICAgIEFMUk1BUiAgICAgICBNU0syICAgICAgICAgIExMX1JUQ19BTE1BX1NldE1hc2tcbgorICAqICAgICAgICAgQUxSTUFSICAgICAgIE1TSzEgICAgICAgICAgTExfUlRDX0FMTUFfU2V0TWFzaworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIE1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUFfTUFTS19OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUFfTUFTS19EQVRFV0VFS0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1BX01BU0tfSE9VUlMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQV9NQVNLX01JTlVURVMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQV9NQVNLX1NFQ09ORFMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQV9NQVNLX0FMTAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUFfU2V0TWFzayhSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgTWFzaykKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQVIsIFJUQ19BTFJNQVJfTVNLNCB8IFJUQ19BTFJNQVJfTVNLMyB8IFJUQ19BTFJNQVJfTVNLMiB8IFJUQ19BTFJNQVJfTVNLMSwgTWFzayk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBBbGFybSBBIG1hc2tzLgorICAqIEBybXRvbGwgQUxSTUFSICAgICAgIE1TSzQgICAgICAgICAgTExfUlRDX0FMTUFfR2V0TWFza1xuCisgICogICAgICAgICBBTFJNQVIgICAgICAgTVNLMyAgICAgICAgICBMTF9SVENfQUxNQV9HZXRNYXNrXG4KKyAgKiAgICAgICAgIEFMUk1BUiAgICAgICBNU0syICAgICAgICAgIExMX1JUQ19BTE1BX0dldE1hc2tcbgorICAqICAgICAgICAgQUxSTUFSICAgICAgIE1TSzEgICAgICAgICAgTExfUlRDX0FMTUFfR2V0TWFzaworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQV9NQVNLX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQV9NQVNLX0RBVEVXRUVLREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUFfTUFTS19IT1VSUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1BX01BU0tfTUlOVVRFUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1BX01BU0tfU0VDT05EUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1BX01BU0tfQUxMCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0FMTUFfR2V0TWFzayhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+QUxSTUFSLCBSVENfQUxSTUFSX01TSzQgfCBSVENfQUxSTUFSX01TSzMgfCBSVENfQUxSTUFSX01TSzIgfCBSVENfQUxSTUFSX01TSzEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQWxhcm1BIFdlZWsgZGF5IHNlbGVjdGlvbiAoRFVbMzowXSByZXByZXNlbnRzIHRoZSB3ZWVrIGRheS4gRFRbMTowXSBpcyBkbyBub3QgY2FyZSkKKyAgKiBAcm10b2xsIEFMUk1BUiAgICAgICBXRFNFTCAgICAgICAgIExMX1JUQ19BTE1BX0VuYWJsZVdlZWtkYXkKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQV9FbmFibGVXZWVrZGF5KFJUQ19UeXBlRGVmICpSVEN4KQoreworICBTRVRfQklUKFJUQ3gtPkFMUk1BUiwgUlRDX0FMUk1BUl9XRFNFTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBbGFybUEgV2VlayBkYXkgc2VsZWN0aW9uIChEVVszOjBdIHJlcHJlc2VudHMgdGhlIGRhdGUgKQorICAqIEBybXRvbGwgQUxSTUFSICAgICAgIFdEU0VMICAgICAgICAgTExfUlRDX0FMTUFfRGlzYWJsZVdlZWtkYXkKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQV9EaXNhYmxlV2Vla2RheShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPkFMUk1BUiwgUlRDX0FMUk1BUl9XRFNFTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFMQVJNIEEgRGF5IGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IERheSBmcm9tIGJpbmFyeSB0byBCQ0QgZm9ybWF0CisgICogQHJtdG9sbCBBTFJNQVIgICAgICAgRFQgICAgICAgICAgICBMTF9SVENfQUxNQV9TZXREYXlcbgorICAqICAgICAgICAgQUxSTUFSICAgICAgIERVICAgICAgICAgICAgTExfUlRDX0FMTUFfU2V0RGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgRGF5IFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgzMQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUFfU2V0RGF5KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBEYXkpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+QUxSTUFSLCAoUlRDX0FMUk1BUl9EVCB8IFJUQ19BTFJNQVJfRFUpLAorICAgICAgICAgICAgICgoKERheSAmIDB4RjBVKSA8PCAoUlRDX0FMUk1BUl9EVF9Qb3MgLSA0VSkpIHwgKChEYXkgJiAweDBGVSkgPDwgUlRDX0FMUk1BUl9EVV9Qb3MpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFMQVJNIEEgRGF5IGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IERheSBmcm9tIEJDRCB0byBCaW5hcnkgZm9ybWF0CisgICogQHJtdG9sbCBBTFJNQVIgICAgICAgRFQgICAgICAgICAgICBMTF9SVENfQUxNQV9HZXREYXlcbgorICAqICAgICAgICAgQUxSTUFSICAgICAgIERVICAgICAgICAgICAgTExfUlRDX0FMTUFfR2V0RGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAxIGFuZCBNYXhfRGF0YT0weDMxCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0FMTUFfR2V0RGF5KFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KSgoUkVBRF9CSVQoUlRDeC0+QUxSTUFSLCAoUlRDX0FMUk1BUl9EVCB8IFJUQ19BTFJNQVJfRFUpKSkgPj4gUlRDX0FMUk1BUl9EVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBTEFSTSBBIFdlZWtkYXkKKyAgKiBAcm10b2xsIEFMUk1BUiAgICAgICBEVSAgICAgICAgICAgIExMX1JUQ19BTE1BX1NldFdlZWtEYXkKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBXZWVrRGF5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfTU9OREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfVFVFU0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1dFRE5FU0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1RIVVJTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfRlJJREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfU0FUVVJEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9TVU5EQVkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1BX1NldFdlZWtEYXkoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFdlZWtEYXkpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+QUxSTUFSLCBSVENfQUxSTUFSX0RVLCBXZWVrRGF5IDw8IFJUQ19BTFJNQVJfRFVfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQUxBUk0gQSBXZWVrZGF5CisgICogQHJtdG9sbCBBTFJNQVIgICAgICAgRFUgICAgICAgICAgICBMTF9SVENfQUxNQV9HZXRXZWVrRGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9NT05EQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9UVUVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfV0VETkVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfVEhVUlNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9GUklEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9TQVRVUkRBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1NVTkRBWQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19BTE1BX0dldFdlZWtEYXkoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPkFMUk1BUiwgUlRDX0FMUk1BUl9EVSkgPj4gUlRDX0FMUk1BUl9EVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBbGFybSBBIHRpbWUgZm9ybWF0IChBTS8yNC1ob3VyIG9yIFBNIG5vdGF0aW9uKQorICAqIEBybXRvbGwgQUxSTUFSICAgICAgIFBNICAgICAgICAgICAgTExfUlRDX0FMTUFfU2V0VGltZUZvcm1hdAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVGb3JtYXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQV9USU1FX0ZPUk1BVF9BTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1BX1RJTUVfRk9STUFUX1BNCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQV9TZXRUaW1lRm9ybWF0KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBUaW1lRm9ybWF0KQoreworICBNT0RJRllfUkVHKFJUQ3gtPkFMUk1BUiwgUlRDX0FMUk1BUl9QTSwgVGltZUZvcm1hdCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFsYXJtIEEgdGltZSBmb3JtYXQgKEFNIG9yIFBNIG5vdGF0aW9uKQorICAqIEBybXRvbGwgQUxSTUFSICAgICAgIFBNICAgICAgICAgICAgTExfUlRDX0FMTUFfR2V0VGltZUZvcm1hdAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUFfVElNRV9GT1JNQVRfQU0KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQV9USU1FX0ZPUk1BVF9QTQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19BTE1BX0dldFRpbWVGb3JtYXQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPkFMUk1BUiwgUlRDX0FMUk1BUl9QTSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBTEFSTSBBIEhvdXJzIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IEhvdXJzIGZyb20gYmluYXJ5IHRvIEJDRCBmb3JtYXQKKyAgKiBAcm10b2xsIEFMUk1BUiAgICAgICBIVCAgICAgICAgICAgIExMX1JUQ19BTE1BX1NldEhvdXJcbgorICAqICAgICAgICAgQUxSTUFSICAgICAgIEhVICAgICAgICAgICAgTExfUlRDX0FMTUFfU2V0SG91cgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEhvdXJzIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgxMiBvciBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MjMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1BX1NldEhvdXIoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IEhvdXJzKQoreworICBNT0RJRllfUkVHKFJUQ3gtPkFMUk1BUiwgKFJUQ19BTFJNQVJfSFQgfCBSVENfQUxSTUFSX0hVKSwKKyAgICAgICAgICAgICAoKChIb3VycyAmIDB4RjBVKSA8PCAoUlRDX0FMUk1BUl9IVF9Qb3MgLSA0VSkpIHwgKChIb3VycyAmIDB4MEZVKSA8PCBSVENfQUxSTUFSX0hVX1BvcykpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQUxBUk0gQSBIb3VycyBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTiBpcyBhdmFpbGFibGUgdG8gY29udmVydCBIb3VycyBmcm9tIEJDRCB0byBCaW5hcnkgZm9ybWF0CisgICogQHJtdG9sbCBBTFJNQVIgICAgICAgSFQgICAgICAgICAgICBMTF9SVENfQUxNQV9HZXRIb3VyXG4KKyAgKiAgICAgICAgIEFMUk1BUiAgICAgICBIVSAgICAgICAgICAgIExMX1JUQ19BTE1BX0dldEhvdXIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDEgYW5kIE1heF9EYXRhPTB4MTIgb3IgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDIzCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0FMTUFfR2V0SG91cihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoKCBSRUFEX0JJVChSVEN4LT5BTFJNQVIsIChSVENfQUxSTUFSX0hUIHwgUlRDX0FMUk1BUl9IVSkpKSA+PiBSVENfQUxSTUFSX0hVX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFMQVJNIEEgTWludXRlcyBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRCBpcyBhdmFpbGFibGUgdG8gY29udmVydCBNaW51dGVzIGZyb20gYmluYXJ5IHRvIEJDRCBmb3JtYXQKKyAgKiBAcm10b2xsIEFMUk1BUiAgICAgICBNTlQgICAgICAgICAgIExMX1JUQ19BTE1BX1NldE1pbnV0ZVxuCisgICogICAgICAgICBBTFJNQVIgICAgICAgTU5VICAgICAgICAgICBMTF9SVENfQUxNQV9TZXRNaW51dGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBNaW51dGVzIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg1OQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUFfU2V0TWludXRlKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBNaW51dGVzKQoreworICBNT0RJRllfUkVHKFJUQ3gtPkFMUk1BUiwgKFJUQ19BTFJNQVJfTU5UIHwgUlRDX0FMUk1BUl9NTlUpLAorICAgICAgICAgICAgICgoKE1pbnV0ZXMgJiAweEYwVSkgPDwgKFJUQ19BTFJNQVJfTU5UX1BvcyAtIDRVKSkgfCAoKE1pbnV0ZXMgJiAweDBGVSkgPDwgUlRDX0FMUk1BUl9NTlVfUG9zKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBTEFSTSBBIE1pbnV0ZXMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgTWludXRlcyBmcm9tIEJDRCB0byBCaW5hcnkgZm9ybWF0CisgICogQHJtdG9sbCBBTFJNQVIgICAgICAgTU5UICAgICAgICAgICBMTF9SVENfQUxNQV9HZXRNaW51dGVcbgorICAqICAgICAgICAgQUxSTUFSICAgICAgIE1OVSAgICAgICAgICAgTExfUlRDX0FMTUFfR2V0TWludXRlCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDU5CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0FMTUFfR2V0TWludXRlKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KSgoUkVBRF9CSVQoUlRDeC0+QUxSTUFSLCAoUlRDX0FMUk1BUl9NTlQgfCBSVENfQUxSTUFSX01OVSkpKSA+PiBSVENfQUxSTUFSX01OVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBTEFSTSBBIFNlY29uZHMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QgaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgU2Vjb25kcyBmcm9tIGJpbmFyeSB0byBCQ0QgZm9ybWF0CisgICogQHJtdG9sbCBBTFJNQVIgICAgICAgU1QgICAgICAgICAgICBMTF9SVENfQUxNQV9TZXRTZWNvbmRcbgorICAqICAgICAgICAgQUxSTUFSICAgICAgIFNVICAgICAgICAgICAgTExfUlRDX0FMTUFfU2V0U2Vjb25kCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgU2Vjb25kcyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1BX1NldFNlY29uZChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgU2Vjb25kcykKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQVIsIChSVENfQUxSTUFSX1NUIHwgUlRDX0FMUk1BUl9TVSksCisgICAgICAgICAgICAgKCgoU2Vjb25kcyAmIDB4RjBVKSA8PCAoUlRDX0FMUk1BUl9TVF9Qb3MgLSA0VSkpIHwgKChTZWNvbmRzICYgMHgwRlUpIDw8IFJUQ19BTFJNQVJfU1VfUG9zKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBTEFSTSBBIFNlY29uZHMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgU2Vjb25kcyBmcm9tIEJDRCB0byBCaW5hcnkgZm9ybWF0CisgICogQHJtdG9sbCBBTFJNQVIgICAgICAgU1QgICAgICAgICAgICBMTF9SVENfQUxNQV9HZXRTZWNvbmRcbgorICAqICAgICAgICAgQUxSTUFSICAgICAgIFNVICAgICAgICAgICAgTExfUlRDX0FMTUFfR2V0U2Vjb25kCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDU5CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0FMTUFfR2V0U2Vjb25kKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KSgoUkVBRF9CSVQoUlRDeC0+QUxSTUFSLCAoUlRDX0FMUk1BUl9TVCB8IFJUQ19BTFJNQVJfU1UpKSkgPj4gUlRDX0FMUk1BUl9TVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBbGFybSBBIFRpbWUgKGhvdXIsIG1pbnV0ZSBhbmQgc2Vjb25kKSBpbiBCQ0QgZm9ybWF0CisgICogQHJtdG9sbCBBTFJNQVIgICAgICAgUE0gICAgICAgICAgICBMTF9SVENfQUxNQV9Db25maWdUaW1lXG4KKyAgKiAgICAgICAgIEFMUk1BUiAgICAgICBIVCAgICAgICAgICAgIExMX1JUQ19BTE1BX0NvbmZpZ1RpbWVcbgorICAqICAgICAgICAgQUxSTUFSICAgICAgIEhVICAgICAgICAgICAgTExfUlRDX0FMTUFfQ29uZmlnVGltZVxuCisgICogICAgICAgICBBTFJNQVIgICAgICAgTU5UICAgICAgICAgICBMTF9SVENfQUxNQV9Db25maWdUaW1lXG4KKyAgKiAgICAgICAgIEFMUk1BUiAgICAgICBNTlUgICAgICAgICAgIExMX1JUQ19BTE1BX0NvbmZpZ1RpbWVcbgorICAqICAgICAgICAgQUxSTUFSICAgICAgIFNUICAgICAgICAgICAgTExfUlRDX0FMTUFfQ29uZmlnVGltZVxuCisgICogICAgICAgICBBTFJNQVIgICAgICAgU1UgICAgICAgICAgICBMTF9SVENfQUxNQV9Db25maWdUaW1lCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgRm9ybWF0MTJfMjQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQV9USU1FX0ZPUk1BVF9BTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1BX1RJTUVfRk9STUFUX1BNCisgICogQHBhcmFtICBIb3VycyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDEgYW5kIE1heF9EYXRhPTB4MTIgb3IgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDIzCisgICogQHBhcmFtICBNaW51dGVzIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg1OQorICAqIEBwYXJhbSAgU2Vjb25kcyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1BX0NvbmZpZ1RpbWUoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IEZvcm1hdDEyXzI0LCB1aW50MzJfdCBIb3VycywgdWludDMyX3QgTWludXRlcywgdWludDMyX3QgU2Vjb25kcykKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdGVtcCA9IDBVOworCisgIHRlbXAgPSBGb3JtYXQxMl8yNCB8ICgoKEhvdXJzICYgMHhGMFUpIDw8IChSVENfQUxSTUFSX0hUX1BvcyAtIDRVKSkgfCAoKEhvdXJzICYgMHgwRlUpIDw8IFJUQ19BTFJNQVJfSFVfUG9zKSkgICAgfCBcCisgICAgICAgICAoKChNaW51dGVzICYgMHhGMFUpIDw8IChSVENfQUxSTUFSX01OVF9Qb3MgLSA0VSkpIHwgKChNaW51dGVzICYgMHgwRlUpIDw8IFJUQ19BTFJNQVJfTU5VX1BvcykpIHwgXAorICAgICAgICAgKCgoU2Vjb25kcyAmIDB4RjBVKSA8PCAoUlRDX0FMUk1BUl9TVF9Qb3MgLSA0VSkpIHwgKChTZWNvbmRzICYgMHgwRlUpIDw8IFJUQ19BTFJNQVJfU1VfUG9zKSk7CisKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQVIsIFJUQ19BTFJNQVJfUE0gfCBSVENfQUxSTUFSX0hUIHwgUlRDX0FMUk1BUl9IVSB8IFJUQ19BTFJNQVJfTU5UIHwgUlRDX0FMUk1BUl9NTlUgfCBSVENfQUxSTUFSX1NUIHwgUlRDX0FMUk1BUl9TVSwgdGVtcCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFsYXJtIEIgVGltZSAoaG91ciwgbWludXRlIGFuZCBzZWNvbmQpIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm9zIF9fTExfUlRDX0dFVF9IT1VSLCBfX0xMX1JUQ19HRVRfTUlOVVRFIGFuZCBfX0xMX1JUQ19HRVRfU0VDT05ECisgICogYXJlIGF2YWlsYWJsZSB0byBnZXQgaW5kZXBlbmRlbnRseSBlYWNoIHBhcmFtZXRlci4KKyAgKiBAcm10b2xsIEFMUk1BUiAgICAgICBIVCAgICAgICAgICAgIExMX1JUQ19BTE1BX0dldFRpbWVcbgorICAqICAgICAgICAgQUxSTUFSICAgICAgIEhVICAgICAgICAgICAgTExfUlRDX0FMTUFfR2V0VGltZVxuCisgICogICAgICAgICBBTFJNQVIgICAgICAgTU5UICAgICAgICAgICBMTF9SVENfQUxNQV9HZXRUaW1lXG4KKyAgKiAgICAgICAgIEFMUk1BUiAgICAgICBNTlUgICAgICAgICAgIExMX1JUQ19BTE1BX0dldFRpbWVcbgorICAqICAgICAgICAgQUxSTUFSICAgICAgIFNUICAgICAgICAgICAgTExfUlRDX0FMTUFfR2V0VGltZVxuCisgICogICAgICAgICBBTFJNQVIgICAgICAgU1UgICAgICAgICAgICBMTF9SVENfQUxNQV9HZXRUaW1lCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgQ29tYmluYXRpb24gb2YgaG91cnMsIG1pbnV0ZXMgYW5kIHNlY29uZHMuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0FMTUFfR2V0VGltZShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoKExMX1JUQ19BTE1BX0dldEhvdXIoUlRDeCkgPDwgUlRDX09GRlNFVF9IT1VSKSB8IChMTF9SVENfQUxNQV9HZXRNaW51dGUoUlRDeCkgPDwgUlRDX09GRlNFVF9NSU5VVEUpIHwgTExfUlRDX0FMTUFfR2V0U2Vjb25kKFJUQ3gpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQWxhcm0gQSBNYXNrIHRoZSBtb3N0LXNpZ25pZmljYW50IGJpdHMgc3RhcnRpbmcgYXQgdGhpcyBiaXQKKyAgKiBAbm90ZSBUaGlzIHJlZ2lzdGVyIGNhbiBiZSB3cml0dGVuIG9ubHkgd2hlbiBBTFJBRSBpcyByZXNldCBpbiBSVENfQ1IgcmVnaXN0ZXIsCisgICogICAgICAgb3IgaW4gaW5pdGlhbGl6YXRpb24gbW9kZS4KKyAgKiBAcm10b2xsIEFMUk1BU1NSICAgICBNQVNLU1MgICAgICAgIExMX1JUQ19BTE1BX1NldFN1YlNlY29uZE1hc2sKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBNYXNrIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQV9TZXRTdWJTZWNvbmRNYXNrKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBNYXNrKQoreworICBNT0RJRllfUkVHKFJUQ3gtPkFMUk1BU1NSLCBSVENfQUxSTUFTU1JfTUFTS1NTLCBNYXNrIDw8IFJUQ19BTFJNQVNTUl9NQVNLU1NfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQWxhcm0gQSBNYXNrIHRoZSBtb3N0LXNpZ25pZmljYW50IGJpdHMgc3RhcnRpbmcgYXQgdGhpcyBiaXQKKyAgKiBAcm10b2xsIEFMUk1BU1NSICAgICBNQVNLU1MgICAgICAgIExMX1JUQ19BTE1BX0dldFN1YlNlY29uZE1hc2sKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19BTE1BX0dldFN1YlNlY29uZE1hc2soUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPkFMUk1BU1NSLCBSVENfQUxSTUFTU1JfTUFTS1NTKSA+PiBSVENfQUxSTUFTU1JfTUFTS1NTX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFsYXJtIEEgU3ViIHNlY29uZHMgdmFsdWUKKyAgKiBAcm10b2xsIEFMUk1BU1NSICAgICBTUyAgICAgICAgICAgIExMX1JUQ19BTE1BX1NldFN1YlNlY29uZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFN1YnNlY29uZCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4N0ZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUFfU2V0U3ViU2Vjb25kKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBTdWJzZWNvbmQpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+QUxSTUFTU1IsIFJUQ19BTFJNQVNTUl9TUywgU3Vic2Vjb25kKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQWxhcm0gQSBTdWIgc2Vjb25kcyB2YWx1ZQorICAqIEBybXRvbGwgQUxSTUFTU1IgICAgIFNTICAgICAgICAgICAgTExfUlRDX0FMTUFfR2V0U3ViU2Vjb25kCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDdGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQV9HZXRTdWJTZWNvbmQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPkFMUk1BU1NSLCBSVENfQUxSTUFTU1JfU1MpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUZfQUxBUk1CIEFMQVJNQgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEFsYXJtIEIKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQUxSQkUgICAgICAgICBMTF9SVENfQUxNQl9FbmFibGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQl9FbmFibGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9BTFJCRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBbGFybSBCCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEFMUkJFICAgICAgICAgTExfUlRDX0FMTUJfRGlzYWJsZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1CX0Rpc2FibGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIENMRUFSX0JJVChSVEN4LT5DUiwgUlRDX0NSX0FMUkJFKTsKK30KKworLyoqCisgICogQGJyaWVmICBTcGVjaWZ5IHRoZSBBbGFybSBCIG1hc2tzLgorICAqIEBybXRvbGwgQUxSTUJSICAgICAgIE1TSzQgICAgICAgICAgTExfUlRDX0FMTUJfU2V0TWFza1xuCisgICogICAgICAgICBBTFJNQlIgICAgICAgTVNLMyAgICAgICAgICBMTF9SVENfQUxNQl9TZXRNYXNrXG4KKyAgKiAgICAgICAgIEFMUk1CUiAgICAgICBNU0syICAgICAgICAgIExMX1JUQ19BTE1CX1NldE1hc2tcbgorICAqICAgICAgICAgQUxSTUJSICAgICAgIE1TSzEgICAgICAgICAgTExfUlRDX0FMTUJfU2V0TWFzaworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIE1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUJfTUFTS19OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUJfTUFTS19EQVRFV0VFS0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1CX01BU0tfSE9VUlMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQl9NQVNLX01JTlVURVMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQl9NQVNLX1NFQ09ORFMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQl9NQVNLX0FMTAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUJfU2V0TWFzayhSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgTWFzaykKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQlIsIFJUQ19BTFJNQlJfTVNLNCB8IFJUQ19BTFJNQlJfTVNLMyB8IFJUQ19BTFJNQlJfTVNLMiB8IFJUQ19BTFJNQlJfTVNLMSwgTWFzayk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBBbGFybSBCIG1hc2tzLgorICAqIEBybXRvbGwgQUxSTUJSICAgICAgIE1TSzQgICAgICAgICAgTExfUlRDX0FMTUJfR2V0TWFza1xuCisgICogICAgICAgICBBTFJNQlIgICAgICAgTVNLMyAgICAgICAgICBMTF9SVENfQUxNQl9HZXRNYXNrXG4KKyAgKiAgICAgICAgIEFMUk1CUiAgICAgICBNU0syICAgICAgICAgIExMX1JUQ19BTE1CX0dldE1hc2tcbgorICAqICAgICAgICAgQUxSTUJSICAgICAgIE1TSzEgICAgICAgICAgTExfUlRDX0FMTUJfR2V0TWFzaworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQl9NQVNLX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQl9NQVNLX0RBVEVXRUVLREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUJfTUFTS19IT1VSUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1CX01BU0tfTUlOVVRFUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1CX01BU0tfU0VDT05EUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1CX01BU0tfQUxMCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0FMTUJfR2V0TWFzayhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+QUxSTUJSLCBSVENfQUxSTUJSX01TSzQgfCBSVENfQUxSTUJSX01TSzMgfCBSVENfQUxSTUJSX01TSzIgfCBSVENfQUxSTUJSX01TSzEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQWxhcm1CIFdlZWsgZGF5IHNlbGVjdGlvbiAoRFVbMzowXSByZXByZXNlbnRzIHRoZSB3ZWVrIGRheS4gRFRbMTowXSBpcyBkbyBub3QgY2FyZSkKKyAgKiBAcm10b2xsIEFMUk1CUiAgICAgICBXRFNFTCAgICAgICAgIExMX1JUQ19BTE1CX0VuYWJsZVdlZWtkYXkKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQl9FbmFibGVXZWVrZGF5KFJUQ19UeXBlRGVmICpSVEN4KQoreworICBTRVRfQklUKFJUQ3gtPkFMUk1CUiwgUlRDX0FMUk1CUl9XRFNFTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBbGFybUIgV2VlayBkYXkgc2VsZWN0aW9uIChEVVszOjBdIHJlcHJlc2VudHMgdGhlIGRhdGUgKQorICAqIEBybXRvbGwgQUxSTUJSICAgICAgIFdEU0VMICAgICAgICAgTExfUlRDX0FMTUJfRGlzYWJsZVdlZWtkYXkKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQl9EaXNhYmxlV2Vla2RheShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPkFMUk1CUiwgUlRDX0FMUk1CUl9XRFNFTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFMQVJNIEIgRGF5IGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IERheSBmcm9tIGJpbmFyeSB0byBCQ0QgZm9ybWF0CisgICogQHJtdG9sbCBBTFJNQlIgICAgICAgRFQgICAgICAgICAgICBMTF9SVENfQUxNQl9TZXREYXlcbgorICAqICAgICAgICAgQUxSTUJSICAgICAgIERVICAgICAgICAgICAgTExfUlRDX0FMTUJfU2V0RGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgRGF5IFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgzMQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUJfU2V0RGF5KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBEYXkpCit7CisgIE1PRElGWV9SRUcoUlRDLT5BTFJNQlIsIChSVENfQUxSTUJSX0RUIHwgUlRDX0FMUk1CUl9EVSksCisgICAgICAgICAgICAgKCgoRGF5ICYgMHhGMFUpIDw8IChSVENfQUxSTUJSX0RUX1BvcyAtIDRVKSkgfCAoKERheSAmIDB4MEZVKSA8PCBSVENfQUxSTUJSX0RVX1BvcykpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQUxBUk0gQiBEYXkgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgRGF5IGZyb20gQkNEIHRvIEJpbmFyeSBmb3JtYXQKKyAgKiBAcm10b2xsIEFMUk1CUiAgICAgICBEVCAgICAgICAgICAgIExMX1JUQ19BTE1CX0dldERheVxuCisgICogICAgICAgICBBTFJNQlIgICAgICAgRFUgICAgICAgICAgICBMTF9SVENfQUxNQl9HZXREYXkKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDEgYW5kIE1heF9EYXRhPTB4MzEKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQl9HZXREYXkoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKCggUkVBRF9CSVQoUlRDeC0+QUxSTUJSLCAoUlRDX0FMUk1CUl9EVCB8IFJUQ19BTFJNQlJfRFUpKSkgPj4gUlRDX0FMUk1CUl9EVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBTEFSTSBCIFdlZWtkYXkKKyAgKiBAcm10b2xsIEFMUk1CUiAgICAgICBEVSAgICAgICAgICAgIExMX1JUQ19BTE1CX1NldFdlZWtEYXkKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBXZWVrRGF5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfTU9OREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfVFVFU0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1dFRE5FU0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1RIVVJTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfRlJJREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfU0FUVVJEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9TVU5EQVkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1CX1NldFdlZWtEYXkoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFdlZWtEYXkpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+QUxSTUJSLCBSVENfQUxSTUJSX0RVLCBXZWVrRGF5IDw8IFJUQ19BTFJNQlJfRFVfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQUxBUk0gQiBXZWVrZGF5CisgICogQHJtdG9sbCBBTFJNQlIgICAgICAgRFUgICAgICAgICAgICBMTF9SVENfQUxNQl9HZXRXZWVrRGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9NT05EQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9UVUVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfV0VETkVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfVEhVUlNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9GUklEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9TQVRVUkRBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1NVTkRBWQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19BTE1CX0dldFdlZWtEYXkoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPkFMUk1CUiwgUlRDX0FMUk1CUl9EVSkgPj4gUlRDX0FMUk1CUl9EVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBTEFSTSBCIHRpbWUgZm9ybWF0IChBTS8yNC1ob3VyIG9yIFBNIG5vdGF0aW9uKQorICAqIEBybXRvbGwgQUxSTUJSICAgICAgIFBNICAgICAgICAgICAgTExfUlRDX0FMTUJfU2V0VGltZUZvcm1hdAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVGb3JtYXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQl9USU1FX0ZPUk1BVF9BTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1CX1RJTUVfRk9STUFUX1BNCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQl9TZXRUaW1lRm9ybWF0KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBUaW1lRm9ybWF0KQoreworICBNT0RJRllfUkVHKFJUQ3gtPkFMUk1CUiwgUlRDX0FMUk1CUl9QTSwgVGltZUZvcm1hdCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFMQVJNIEIgdGltZSBmb3JtYXQgKEFNIG9yIFBNIG5vdGF0aW9uKQorICAqIEBybXRvbGwgQUxSTUJSICAgICAgIFBNICAgICAgICAgICAgTExfUlRDX0FMTUJfR2V0VGltZUZvcm1hdAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUJfVElNRV9GT1JNQVRfQU0KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQl9USU1FX0ZPUk1BVF9QTQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19BTE1CX0dldFRpbWVGb3JtYXQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPkFMUk1CUiwgUlRDX0FMUk1CUl9QTSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBTEFSTSBCIEhvdXJzIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IEhvdXJzIGZyb20gYmluYXJ5IHRvIEJDRCBmb3JtYXQKKyAgKiBAcm10b2xsIEFMUk1CUiAgICAgICBIVCAgICAgICAgICAgIExMX1JUQ19BTE1CX1NldEhvdXJcbgorICAqICAgICAgICAgQUxSTUJSICAgICAgIEhVICAgICAgICAgICAgTExfUlRDX0FMTUJfU2V0SG91cgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEhvdXJzIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgxMiBvciBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MjMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1CX1NldEhvdXIoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IEhvdXJzKQoreworICBNT0RJRllfUkVHKFJUQ3gtPkFMUk1CUiwgKFJUQ19BTFJNQlJfSFQgfCBSVENfQUxSTUJSX0hVKSwKKyAgICAgICAgICAgICAoKChIb3VycyAmIDB4RjBVKSA8PCAoUlRDX0FMUk1CUl9IVF9Qb3MgLSA0VSkpIHwgKChIb3VycyAmIDB4MEZVKSA8PCBSVENfQUxSTUJSX0hVX1BvcykpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQUxBUk0gQiBIb3VycyBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTiBpcyBhdmFpbGFibGUgdG8gY29udmVydCBIb3VycyBmcm9tIEJDRCB0byBCaW5hcnkgZm9ybWF0CisgICogQHJtdG9sbCBBTFJNQlIgICAgICAgSFQgICAgICAgICAgICBMTF9SVENfQUxNQl9HZXRIb3VyXG4KKyAgKiAgICAgICAgIEFMUk1CUiAgICAgICBIVSAgICAgICAgICAgIExMX1JUQ19BTE1CX0dldEhvdXIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDEgYW5kIE1heF9EYXRhPTB4MTIgb3IgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDIzCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0FMTUJfR2V0SG91cihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoKFJFQURfQklUKFJUQ3gtPkFMUk1CUiwgKFJUQ19BTFJNQlJfSFQgfCBSVENfQUxSTUJSX0hVKSkpID4+IFJUQ19BTFJNQlJfSFVfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQUxBUk0gQiBNaW51dGVzIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IE1pbnV0ZXMgZnJvbSBiaW5hcnkgdG8gQkNEIGZvcm1hdAorICAqIEBybXRvbGwgQUxSTUJSICAgICAgIE1OVCAgICAgICAgICAgTExfUlRDX0FMTUJfU2V0TWludXRlXG4KKyAgKiAgICAgICAgIEFMUk1CUiAgICAgICBNTlUgICAgICAgICAgIExMX1JUQ19BTE1CX1NldE1pbnV0ZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIE1pbnV0ZXMgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDU5CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQl9TZXRNaW51dGUoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IE1pbnV0ZXMpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+QUxSTUJSLCAoUlRDX0FMUk1CUl9NTlQgfCBSVENfQUxSTUJSX01OVSksCisgICAgICAgICAgICAgKCgoTWludXRlcyAmIDB4RjBVKSA8PCAoUlRDX0FMUk1CUl9NTlRfUG9zIC0gNFUpKSB8ICgoTWludXRlcyAmIDB4MEZVKSA8PCBSVENfQUxSTUJSX01OVV9Qb3MpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFMQVJNIEIgTWludXRlcyBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTiBpcyBhdmFpbGFibGUgdG8gY29udmVydCBNaW51dGVzIGZyb20gQkNEIHRvIEJpbmFyeSBmb3JtYXQKKyAgKiBAcm10b2xsIEFMUk1CUiAgICAgICBNTlQgICAgICAgICAgIExMX1JUQ19BTE1CX0dldE1pbnV0ZVxuCisgICogICAgICAgICBBTFJNQlIgICAgICAgTU5VICAgICAgICAgICBMTF9SVENfQUxNQl9HZXRNaW51dGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQl9HZXRNaW51dGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CityZXR1cm4gKHVpbnQzMl90KSgoUkVBRF9CSVQoUlRDeC0+QUxSTUJSLCAoUlRDX0FMUk1CUl9NTlQgfCBSVENfQUxSTUJSX01OVSkpKSA+PiBSVENfQUxSTUJSX01OVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBTEFSTSBCIFNlY29uZHMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QgaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgU2Vjb25kcyBmcm9tIGJpbmFyeSB0byBCQ0QgZm9ybWF0CisgICogQHJtdG9sbCBBTFJNQlIgICAgICAgU1QgICAgICAgICAgICBMTF9SVENfQUxNQl9TZXRTZWNvbmRcbgorICAqICAgICAgICAgQUxSTUJSICAgICAgIFNVICAgICAgICAgICAgTExfUlRDX0FMTUJfU2V0U2Vjb25kCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgU2Vjb25kcyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1CX1NldFNlY29uZChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgU2Vjb25kcykKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQlIsIChSVENfQUxSTUJSX1NUIHwgUlRDX0FMUk1CUl9TVSksCisgICAgICAgICAgICAgKCgoU2Vjb25kcyAmIDB4RjBVKSA8PCAoUlRDX0FMUk1CUl9TVF9Qb3MgLSA0VSkpIHwgKChTZWNvbmRzICYgMHgwRlUpIDw8IFJUQ19BTFJNQlJfU1VfUG9zKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBTEFSTSBCIFNlY29uZHMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgU2Vjb25kcyBmcm9tIEJDRCB0byBCaW5hcnkgZm9ybWF0CisgICogQHJtdG9sbCBBTFJNQlIgICAgICAgU1QgICAgICAgICAgICBMTF9SVENfQUxNQl9HZXRTZWNvbmRcbgorICAqICAgICAgICAgQUxSTUJSICAgICAgIFNVICAgICAgICAgICAgTExfUlRDX0FMTUJfR2V0U2Vjb25kCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDU5CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0FMTUJfR2V0U2Vjb25kKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KSgoUkVBRF9CSVQoUlRDeC0+QUxSTUJSLCAoUlRDX0FMUk1CUl9TVCB8IFJUQ19BTFJNQlJfU1UpKSkgPj4gUlRDX0FMUk1CUl9TVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBbGFybSBCIFRpbWUgKGhvdXIsIG1pbnV0ZSBhbmQgc2Vjb25kKSBpbiBCQ0QgZm9ybWF0CisgICogQHJtdG9sbCBBTFJNQlIgICAgICAgUE0gICAgICAgICAgICBMTF9SVENfQUxNQl9Db25maWdUaW1lXG4KKyAgKiAgICAgICAgIEFMUk1CUiAgICAgICBIVCAgICAgICAgICAgIExMX1JUQ19BTE1CX0NvbmZpZ1RpbWVcbgorICAqICAgICAgICAgQUxSTUJSICAgICAgIEhVICAgICAgICAgICAgTExfUlRDX0FMTUJfQ29uZmlnVGltZVxuCisgICogICAgICAgICBBTFJNQlIgICAgICAgTU5UICAgICAgICAgICBMTF9SVENfQUxNQl9Db25maWdUaW1lXG4KKyAgKiAgICAgICAgIEFMUk1CUiAgICAgICBNTlUgICAgICAgICAgIExMX1JUQ19BTE1CX0NvbmZpZ1RpbWVcbgorICAqICAgICAgICAgQUxSTUJSICAgICAgIFNUICAgICAgICAgICAgTExfUlRDX0FMTUJfQ29uZmlnVGltZVxuCisgICogICAgICAgICBBTFJNQlIgICAgICAgU1UgICAgICAgICAgICBMTF9SVENfQUxNQl9Db25maWdUaW1lCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgRm9ybWF0MTJfMjQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQl9USU1FX0ZPUk1BVF9BTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1CX1RJTUVfRk9STUFUX1BNCisgICogQHBhcmFtICBIb3VycyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDEgYW5kIE1heF9EYXRhPTB4MTIgb3IgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDIzCisgICogQHBhcmFtICBNaW51dGVzIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg1OQorICAqIEBwYXJhbSAgU2Vjb25kcyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1CX0NvbmZpZ1RpbWUoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IEZvcm1hdDEyXzI0LCB1aW50MzJfdCBIb3VycywgdWludDMyX3QgTWludXRlcywgdWludDMyX3QgU2Vjb25kcykKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdGVtcCA9IDBVOworCisgIHRlbXAgPSBGb3JtYXQxMl8yNCB8ICgoKEhvdXJzICYgMHhGMFUpIDw8IChSVENfQUxSTUJSX0hUX1BvcyAtIDRVKSkgfCAoKEhvdXJzICYgMHgwRlUpIDw8IFJUQ19BTFJNQlJfSFVfUG9zKSkgICAgfCBcCisgICAgICAgICAoKChNaW51dGVzICYgMHhGMFUpIDw8IChSVENfQUxSTUJSX01OVF9Qb3MgLSA0VSkpIHwgKChNaW51dGVzICYgMHgwRlUpIDw8IFJUQ19BTFJNQlJfTU5VX1BvcykpIHwgXAorICAgICAgICAgKCgoU2Vjb25kcyAmIDB4RjBVKSA8PCAoUlRDX0FMUk1CUl9TVF9Qb3MgLSA0VSkpIHwgKChTZWNvbmRzICYgMHgwRlUpIDw8IFJUQ19BTFJNQlJfU1VfUG9zKSk7CisKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQlIsIFJUQ19BTFJNQlJfUE18IFJUQ19BTFJNQlJfSFQgfCBSVENfQUxSTUJSX0hVIHwgUlRDX0FMUk1CUl9NTlQgfCBSVENfQUxSTUJSX01OVSB8IFJUQ19BTFJNQlJfU1QgfCBSVENfQUxSTUJSX1NVLCB0ZW1wKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQWxhcm0gQiBUaW1lIChob3VyLCBtaW51dGUgYW5kIHNlY29uZCkgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNyb3MgX19MTF9SVENfR0VUX0hPVVIsIF9fTExfUlRDX0dFVF9NSU5VVEUgYW5kIF9fTExfUlRDX0dFVF9TRUNPTkQKKyAgKiBhcmUgYXZhaWxhYmxlIHRvIGdldCBpbmRlcGVuZGVudGx5IGVhY2ggcGFyYW1ldGVyLgorICAqIEBybXRvbGwgQUxSTUJSICAgICAgIEhUICAgICAgICAgICAgTExfUlRDX0FMTUJfR2V0VGltZVxuCisgICogICAgICAgICBBTFJNQlIgICAgICAgSFUgICAgICAgICAgICBMTF9SVENfQUxNQl9HZXRUaW1lXG4KKyAgKiAgICAgICAgIEFMUk1CUiAgICAgICBNTlQgICAgICAgICAgIExMX1JUQ19BTE1CX0dldFRpbWVcbgorICAqICAgICAgICAgQUxSTUJSICAgICAgIE1OVSAgICAgICAgICAgTExfUlRDX0FMTUJfR2V0VGltZVxuCisgICogICAgICAgICBBTFJNQlIgICAgICAgU1QgICAgICAgICAgICBMTF9SVENfQUxNQl9HZXRUaW1lXG4KKyAgKiAgICAgICAgIEFMUk1CUiAgICAgICBTVSAgICAgICAgICAgIExMX1JUQ19BTE1CX0dldFRpbWUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBDb21iaW5hdGlvbiBvZiBob3VycywgbWludXRlcyBhbmQgc2Vjb25kcy4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQl9HZXRUaW1lKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KSgoTExfUlRDX0FMTUJfR2V0SG91cihSVEN4KSA8PCBSVENfT0ZGU0VUX0hPVVIpIHwgKExMX1JUQ19BTE1CX0dldE1pbnV0ZShSVEN4KSA8PCBSVENfT0ZGU0VUX01JTlVURSkgfCBMTF9SVENfQUxNQl9HZXRTZWNvbmQoUlRDeCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBbGFybSBCIE1hc2sgdGhlIG1vc3Qtc2lnbmlmaWNhbnQgYml0cyBzdGFydGluZyBhdCB0aGlzIGJpdAorICAqIEBub3RlIFRoaXMgcmVnaXN0ZXIgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIEFMUkJFIGlzIHJlc2V0IGluIFJUQ19DUiByZWdpc3RlciwKKyAgKiAgICAgICBvciBpbiBpbml0aWFsaXphdGlvbiBtb2RlLgorICAqIEBybXRvbGwgQUxSTUJTU1IgICAgIE1BU0tTUyAgICAgICAgTExfUlRDX0FMTUJfU2V0U3ViU2Vjb25kTWFzaworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIE1hc2sgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1CX1NldFN1YlNlY29uZE1hc2soUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IE1hc2spCit7CisgIE1PRElGWV9SRUcoUlRDeC0+QUxSTUJTU1IsIFJUQ19BTFJNQlNTUl9NQVNLU1MsIE1hc2sgPDwgUlRDX0FMUk1CU1NSX01BU0tTU19Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBbGFybSBCIE1hc2sgdGhlIG1vc3Qtc2lnbmlmaWNhbnQgYml0cyBzdGFydGluZyBhdCB0aGlzIGJpdAorICAqIEBybXRvbGwgQUxSTUJTU1IgICAgIE1BU0tTUyAgICAgICAgTExfUlRDX0FMTUJfR2V0U3ViU2Vjb25kTWFzaworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0FMTUJfR2V0U3ViU2Vjb25kTWFzayhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+QUxSTUJTU1IsIFJUQ19BTFJNQlNTUl9NQVNLU1MpICA+PiBSVENfQUxSTUJTU1JfTUFTS1NTX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFsYXJtIEIgU3ViIHNlY29uZHMgdmFsdWUKKyAgKiBAcm10b2xsIEFMUk1CU1NSICAgICBTUyAgICAgICAgICAgIExMX1JUQ19BTE1CX1NldFN1YlNlY29uZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFN1YnNlY29uZCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4N0ZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUJfU2V0U3ViU2Vjb25kKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBTdWJzZWNvbmQpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+QUxSTUJTU1IsIFJUQ19BTFJNQlNTUl9TUywgU3Vic2Vjb25kKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQWxhcm0gQiBTdWIgc2Vjb25kcyB2YWx1ZQorICAqIEBybXRvbGwgQUxSTUJTU1IgICAgIFNTICAgICAgICAgICAgTExfUlRDX0FMTUJfR2V0U3ViU2Vjb25kCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDdGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQl9HZXRTdWJTZWNvbmQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPkFMUk1CU1NSLCBSVENfQUxSTUJTU1JfU1MpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUZfVGltZXN0YW1wIFRpbWVzdGFtcAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFRpbWVzdGFtcAorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBUU0UgICAgICAgICAgIExMX1JUQ19UU19FbmFibGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVFNfRW5hYmxlKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBTRVRfQklUKFJUQ3gtPkNSLCBSVENfQ1JfVFNFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFRpbWVzdGFtcAorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBUU0UgICAgICAgICAgIExMX1JUQ19UU19EaXNhYmxlCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RTX0Rpc2FibGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIENMRUFSX0JJVChSVEN4LT5DUiwgUlRDX0NSX1RTRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFRpbWUtc3RhbXAgZXZlbnQgYWN0aXZlIGVkZ2UKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQG5vdGUgVFNFIG11c3QgYmUgcmVzZXQgd2hlbiBUU0VER0UgaXMgY2hhbmdlZCB0byBhdm9pZCB1bndhbnRlZCBUU0Ygc2V0dGluZworICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFRTRURHRSAgICAgICAgTExfUlRDX1RTX1NldEFjdGl2ZUVkZ2UKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBFZGdlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RJTUVTVEFNUF9FREdFX1JJU0lORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19USU1FU1RBTVBfRURHRV9GQUxMSU5HCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVFNfU2V0QWN0aXZlRWRnZShSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgRWRnZSkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5DUiwgUlRDX0NSX1RTRURHRSwgRWRnZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFRpbWUtc3RhbXAgZXZlbnQgYWN0aXZlIGVkZ2UKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgVFNFREdFICAgICAgICBMTF9SVENfVFNfR2V0QWN0aXZlRWRnZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RJTUVTVEFNUF9FREdFX1JJU0lORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19USU1FU1RBTVBfRURHRV9GQUxMSU5HCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX1RTX0dldEFjdGl2ZUVkZ2UoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPkNSLCBSVENfQ1JfVFNFREdFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFRpbWVzdGFtcCBBTS9QTSBub3RhdGlvbiAoQU0gb3IgMjQtaG91ciBmb3JtYXQpCisgICogQHJtdG9sbCBUU1RSICAgICAgICAgUE0gICAgICAgICAgICBMTF9SVENfVFNfR2V0VGltZUZvcm1hdAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RTX1RJTUVfRk9STUFUX0FNCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RTX1RJTUVfRk9STUFUX1BNCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX1RTX0dldFRpbWVGb3JtYXQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlRTVFIsIFJUQ19UU1RSX1BNKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFRpbWVzdGFtcCBIb3VycyBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTiBpcyBhdmFpbGFibGUgdG8gY29udmVydCBIb3VycyBmcm9tIEJDRCB0byBCaW5hcnkgZm9ybWF0CisgICogQHJtdG9sbCBUU1RSICAgICAgICAgSFQgICAgICAgICAgICBMTF9SVENfVFNfR2V0SG91clxuCisgICogICAgICAgICBUU1RSICAgICAgICAgSFUgICAgICAgICAgICBMTF9SVENfVFNfR2V0SG91cgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgxMiBvciBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MjMKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfVFNfR2V0SG91cihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+VFNUUiwgUlRDX1RTVFJfSFQgfCBSVENfVFNUUl9IVSkgPj4gUlRDX1RTVFJfSFVfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgVGltZXN0YW1wIE1pbnV0ZXMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgTWludXRlcyBmcm9tIEJDRCB0byBCaW5hcnkgZm9ybWF0CisgICogQHJtdG9sbCBUU1RSICAgICAgICAgTU5UICAgICAgICAgICBMTF9SVENfVFNfR2V0TWludXRlXG4KKyAgKiAgICAgICAgIFRTVFIgICAgICAgICBNTlUgICAgICAgICAgIExMX1JUQ19UU19HZXRNaW51dGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfVFNfR2V0TWludXRlKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5UU1RSLCBSVENfVFNUUl9NTlQgfCBSVENfVFNUUl9NTlUpID4+IFJUQ19UU1RSX01OVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBUaW1lc3RhbXAgU2Vjb25kcyBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTiBpcyBhdmFpbGFibGUgdG8gY29udmVydCBTZWNvbmRzIGZyb20gQkNEIHRvIEJpbmFyeSBmb3JtYXQKKyAgKiBAcm10b2xsIFRTVFIgICAgICAgICBTVCAgICAgICAgICAgIExMX1JUQ19UU19HZXRTZWNvbmRcbgorICAqICAgICAgICAgVFNUUiAgICAgICAgIFNVICAgICAgICAgICAgTExfUlRDX1RTX0dldFNlY29uZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg1OQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19UU19HZXRTZWNvbmQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlRTVFIsIFJUQ19UU1RSX1NUIHwgUlRDX1RTVFJfU1UpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgVGltZXN0YW1wIHRpbWUgKGhvdXIsIG1pbnV0ZSBhbmQgc2Vjb25kKSBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvcyBfX0xMX1JUQ19HRVRfSE9VUiwgX19MTF9SVENfR0VUX01JTlVURSBhbmQgX19MTF9SVENfR0VUX1NFQ09ORAorICAqIGFyZSBhdmFpbGFibGUgdG8gZ2V0IGluZGVwZW5kZW50bHkgZWFjaCBwYXJhbWV0ZXIuCisgICogQHJtdG9sbCBUU1RSICAgICAgICAgSFQgICAgICAgICAgICBMTF9SVENfVFNfR2V0VGltZVxuCisgICogICAgICAgICBUU1RSICAgICAgICAgSFUgICAgICAgICAgICBMTF9SVENfVFNfR2V0VGltZVxuCisgICogICAgICAgICBUU1RSICAgICAgICAgTU5UICAgICAgICAgICBMTF9SVENfVFNfR2V0VGltZVxuCisgICogICAgICAgICBUU1RSICAgICAgICAgTU5VICAgICAgICAgICBMTF9SVENfVFNfR2V0VGltZVxuCisgICogICAgICAgICBUU1RSICAgICAgICAgU1QgICAgICAgICAgICBMTF9SVENfVFNfR2V0VGltZVxuCisgICogICAgICAgICBUU1RSICAgICAgICAgU1UgICAgICAgICAgICBMTF9SVENfVFNfR2V0VGltZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIENvbWJpbmF0aW9uIG9mIGhvdXJzLCBtaW51dGVzIGFuZCBzZWNvbmRzLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19UU19HZXRUaW1lKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5UU1RSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfVFNUUl9IVCB8IFJUQ19UU1RSX0hVIHwgUlRDX1RTVFJfTU5UIHwgUlRDX1RTVFJfTU5VIHwgUlRDX1RTVFJfU1QgfCBSVENfVFNUUl9TVSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBUaW1lc3RhbXAgV2VlayBkYXkKKyAgKiBAcm10b2xsIFRTRFIgICAgICAgICBXRFUgICAgICAgICAgIExMX1JUQ19UU19HZXRXZWVrRGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9NT05EQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9UVUVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfV0VETkVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfVEhVUlNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9GUklEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9TQVRVUkRBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1NVTkRBWQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19UU19HZXRXZWVrRGF5KFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5UU0RSLCBSVENfVFNEUl9XRFUpID4+IFJUQ19UU0RSX1dEVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBUaW1lc3RhbXAgTW9udGggaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgTW9udGggZnJvbSBCQ0QgdG8gQmluYXJ5IGZvcm1hdAorICAqIEBybXRvbGwgVFNEUiAgICAgICAgIE1UICAgICAgICAgICAgTExfUlRDX1RTX0dldE1vbnRoXG4KKyAgKiAgICAgICAgIFRTRFIgICAgICAgICBNVSAgICAgICAgICAgIExMX1JUQ19UU19HZXRNb250aAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0pBTlVBUlkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfRkVCUlVBUlkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfTUFSQ0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfQVBSSUwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfTUFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0pVTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfSlVMWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9BVUdVU1QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfU0VQVEVNQkVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX09DVE9CRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfTk9WRU1CRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfREVDRU1CRVIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfVFNfR2V0TW9udGgoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlRTRFIsIFJUQ19UU0RSX01UIHwgUlRDX1RTRFJfTVUpID4+IFJUQ19UU0RSX01VX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFRpbWVzdGFtcCBEYXkgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgRGF5IGZyb20gQkNEIHRvIEJpbmFyeSBmb3JtYXQKKyAgKiBAcm10b2xsIFRTRFIgICAgICAgICBEVCAgICAgICAgICAgIExMX1JUQ19UU19HZXREYXlcbgorICAqICAgICAgICAgVFNEUiAgICAgICAgIERVICAgICAgICAgICAgTExfUlRDX1RTX0dldERheQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgzMQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19UU19HZXREYXkoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlRTRFIsIFJUQ19UU0RSX0RUIHwgUlRDX1RTRFJfRFUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgVGltZXN0YW1wIGRhdGUgKFdlZWtEYXksIERheSBhbmQgTW9udGgpIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm9zIF9fTExfUlRDX0dFVF9XRUVLREFZLCBfX0xMX1JUQ19HRVRfTU9OVEgsCisgICogYW5kIF9fTExfUlRDX0dFVF9EQVkgYXJlIGF2YWlsYWJsZSB0byBnZXQgaW5kZXBlbmRlbnRseSBlYWNoIHBhcmFtZXRlci4KKyAgKiBAcm10b2xsIFRTRFIgICAgICAgICBXRFUgICAgICAgICAgIExMX1JUQ19UU19HZXREYXRlXG4KKyAgKiAgICAgICAgIFRTRFIgICAgICAgICBNVCAgICAgICAgICAgIExMX1JUQ19UU19HZXREYXRlXG4KKyAgKiAgICAgICAgIFRTRFIgICAgICAgICBNVSAgICAgICAgICAgIExMX1JUQ19UU19HZXREYXRlXG4KKyAgKiAgICAgICAgIFRTRFIgICAgICAgICBEVCAgICAgICAgICAgIExMX1JUQ19UU19HZXREYXRlXG4KKyAgKiAgICAgICAgIFRTRFIgICAgICAgICBEVSAgICAgICAgICAgIExMX1JUQ19UU19HZXREYXRlCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgQ29tYmluYXRpb24gb2YgV2Vla2RheSwgRGF5IGFuZCBNb250aAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19UU19HZXREYXRlKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5UU0RSLCBSVENfVFNEUl9XRFUgfCBSVENfVFNEUl9NVCB8IFJUQ19UU0RSX01VIHwgUlRDX1RTRFJfRFQgfCBSVENfVFNEUl9EVSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aW1lLXN0YW1wIHN1YiBzZWNvbmQgdmFsdWUKKyAgKiBAcm10b2xsIFRTU1NSICAgICAgICBTUyAgICAgICAgICAgIExMX1JUQ19UU19HZXRTdWJTZWNvbmQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19UU19HZXRTdWJTZWNvbmQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlRTU1NSLCBSVENfVFNTU1JfU1MpKTsKK30KKworI2lmIGRlZmluZWQoUlRDX1RBRkNSX1RBTVBUUykKKy8qKgorICAqIEBicmllZiAgQWN0aXZhdGUgdGltZXN0YW1wIG9uIHRhbXBlciBkZXRlY3Rpb24gZXZlbnQKKyAgKiBAcm10b2xsIFRBRkNSICAgICAgIFRBTVBUUyAgICAgICAgTExfUlRDX1RTX0VuYWJsZU9uVGFtcGVyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RTX0VuYWJsZU9uVGFtcGVyKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBTRVRfQklUKFJUQ3gtPlRBRkNSLCBSVENfVEFGQ1JfVEFNUFRTKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRpbWVzdGFtcCBvbiB0YW1wZXIgZGV0ZWN0aW9uIGV2ZW50CisgICogQHJtdG9sbCBUQUZDUiAgICAgICBUQU1QVFMgICAgICAgIExMX1JUQ19UU19EaXNhYmxlT25UYW1wZXIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVFNfRGlzYWJsZU9uVGFtcGVyKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBDTEVBUl9CSVQoUlRDeC0+VEFGQ1IsIFJUQ19UQUZDUl9UQU1QVFMpOworfQorI2VuZGlmIC8qIFJUQ19UQUZDUl9UQU1QVFMgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUZfVGFtcGVyIFRhbXBlcgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFJUQ19UQU1QeCBpbnB1dCBkZXRlY3Rpb24KKyAgKiBAcm10b2xsIFRBRkNSICAgICAgIFRBTVAxRSAgICAgICAgTExfUlRDX1RBTVBFUl9FbmFibGVcbgorICAqICAgICAgICAgVEFGQ1IgICAgICAgVEFNUDJFICAgICAgICBMTF9SVENfVEFNUEVSX0VuYWJsZVxuCisgICogICAgICAgICBUQUZDUiAgICAgICBUQU1QM0UgICAgICAgIExMX1JUQ19UQU1QRVJfRW5hYmxlCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgVGFtcGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfMSAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSXzIgCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl8zICgqKQorICAqICAgICAgICAgCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVEFNUEVSX0VuYWJsZShSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgVGFtcGVyKQoreworICBTRVRfQklUKFJUQ3gtPlRBRkNSLCBUYW1wZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFJUQ19UQU1QeCBpbnB1dCBkZXRlY3Rpb24KKyAgKiBAcm10b2xsIFRBRkNSICAgICAgIFRBTVAxRSAgICAgICAgTExfUlRDX1RBTVBFUl9EaXNhYmxlXG4KKyAgKiAgICAgICAgIFRBRkNSICAgICAgIFRBTVAyRSAgICAgICAgTExfUlRDX1RBTVBFUl9EaXNhYmxlXG4KKyAgKiAgICAgICAgIFRBRkNSICAgICAgIFRBTVAzRSAgICAgICAgTExfUlRDX1RBTVBFUl9EaXNhYmxlCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgVGFtcGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfMSAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSXzIgCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl8zICgqKQorICAqICAgICAgICAgCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVEFNUEVSX0Rpc2FibGUoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFRhbXBlcikKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPlRBRkNSLCBUYW1wZXIpOworfQorCisjaWYgZGVmaW5lZChSVENfVEFGQ1JfVEFNUFBVRElTKQorLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFJUQ19UQU1QeCBwdWxsLXVwIGRpc2FibGUgKERpc2FibGUgcHJlY2hhcmdlIG9mIFJUQ19UQU1QeCBwaW5zKQorICAqIEBybXRvbGwgVEFGQ1IgICAgICAgVEFNUFBVRElTICAgICBMTF9SVENfVEFNUEVSX0Rpc2FibGVQdWxsVXAKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVEFNUEVSX0Rpc2FibGVQdWxsVXAoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+VEFGQ1IsIFJUQ19UQUZDUl9UQU1QUFVESVMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSVENfVEFNUHggcHVsbC11cCBkaXNhYmxlICggUHJlY2hhcmdlIFJUQ19UQU1QeCBwaW5zIGJlZm9yZSBzYW1wbGluZykKKyAgKiBAcm10b2xsIFRBRkNSICAgICAgIFRBTVBQVURJUyAgICAgTExfUlRDX1RBTVBFUl9FbmFibGVQdWxsVXAKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVEFNUEVSX0VuYWJsZVB1bGxVcChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPlRBRkNSLCBSVENfVEFGQ1JfVEFNUFBVRElTKTsKK30KKyNlbmRpZiAvKiBSVENfVEFGQ1JfVEFNUFBVRElTICovCisKKyNpZiBkZWZpbmVkKFJUQ19UQUZDUl9UQU1QUFJDSCkKKy8qKgorICAqIEBicmllZiAgU2V0IFJUQ19UQU1QeCBwcmVjaGFyZ2UgZHVyYXRpb24KKyAgKiBAcm10b2xsIFRBRkNSICAgICAgIFRBTVBQUkNIICAgICAgTExfUlRDX1RBTVBFUl9TZXRQcmVjaGFyZ2UKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBEdXJhdGlvbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRFVSQVRJT05fMVJUQ0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRFVSQVRJT05fMlJUQ0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRFVSQVRJT05fNFJUQ0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRFVSQVRJT05fOFJUQ0NMSworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RBTVBFUl9TZXRQcmVjaGFyZ2UoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IER1cmF0aW9uKQoreworICBNT0RJRllfUkVHKFJUQ3gtPlRBRkNSLCBSVENfVEFGQ1JfVEFNUFBSQ0gsIER1cmF0aW9uKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgUlRDX1RBTVB4IHByZWNoYXJnZSBkdXJhdGlvbgorICAqIEBybXRvbGwgVEFGQ1IgICAgICAgVEFNUFBSQ0ggICAgICBMTF9SVENfVEFNUEVSX0dldFByZWNoYXJnZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9EVVJBVElPTl8xUlRDQ0xLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9EVVJBVElPTl8yUlRDQ0xLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9EVVJBVElPTl80UlRDQ0xLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9EVVJBVElPTl84UlRDQ0xLCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX1RBTVBFUl9HZXRQcmVjaGFyZ2UoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlRBRkNSLCBSVENfVEFGQ1JfVEFNUFBSQ0gpKTsKK30KKyNlbmRpZiAvKiBSVENfVEFGQ1JfVEFNUFBSQ0ggKi8KKworI2lmIGRlZmluZWQoUlRDX1RBRkNSX1RBTVBGTFQpCisvKioKKyAgKiBAYnJpZWYgIFNldCBSVENfVEFNUHggZmlsdGVyIGNvdW50CisgICogQHJtdG9sbCBUQUZDUiAgICAgICBUQU1QRkxUICAgICAgIExMX1JUQ19UQU1QRVJfU2V0RmlsdGVyQ291bnQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBGaWx0ZXJDb3VudCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRklMVEVSX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX0ZJTFRFUl8yU0FNUExFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9GSUxURVJfNFNBTVBMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRklMVEVSXzhTQU1QTEUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19UQU1QRVJfU2V0RmlsdGVyQ291bnQoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IEZpbHRlckNvdW50KQoreworICBNT0RJRllfUkVHKFJUQ3gtPlRBRkNSLCBSVENfVEFGQ1JfVEFNUEZMVCwgRmlsdGVyQ291bnQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBSVENfVEFNUHggZmlsdGVyIGNvdW50CisgICogQHJtdG9sbCBUQUZDUiAgICAgICBUQU1QRkxUICAgICAgIExMX1JUQ19UQU1QRVJfR2V0RmlsdGVyQ291bnQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRklMVEVSX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX0ZJTFRFUl8yU0FNUExFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9GSUxURVJfNFNBTVBMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRklMVEVSXzhTQU1QTEUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfVEFNUEVSX0dldEZpbHRlckNvdW50KFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5UQUZDUiwgUlRDX1RBRkNSX1RBTVBGTFQpKTsKK30KKyNlbmRpZiAvKiBSVENfVEFGQ1JfVEFNUEZMVCAqLworCisjaWYgZGVmaW5lZChSVENfVEFGQ1JfVEFNUEZSRVEpCisvKioKKyAgKiBAYnJpZWYgIFNldCBUYW1wZXIgc2FtcGxpbmcgZnJlcXVlbmN5CisgICogQHJtdG9sbCBUQUZDUiAgICAgICBUQU1QRlJFUSAgICAgIExMX1JUQ19UQU1QRVJfU2V0U2FtcGxpbmdGcmVxCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgU2FtcGxpbmdGcmVxIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9TQU1QTEZSRVFESVZfMzI3NjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl8xNjM4NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzgxOTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl80MDk2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9TQU1QTEZSRVFESVZfMjA0OAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzEwMjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl81MTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl8yNTYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19UQU1QRVJfU2V0U2FtcGxpbmdGcmVxKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBTYW1wbGluZ0ZyZXEpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+VEFGQ1IsIFJUQ19UQUZDUl9UQU1QRlJFUSwgU2FtcGxpbmdGcmVxKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgVGFtcGVyIHNhbXBsaW5nIGZyZXF1ZW5jeQorICAqIEBybXRvbGwgVEFGQ1IgICAgICAgVEFNUEZSRVEgICAgICBMTF9SVENfVEFNUEVSX0dldFNhbXBsaW5nRnJlcQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9TQU1QTEZSRVFESVZfMzI3NjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl8xNjM4NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzgxOTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl80MDk2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9TQU1QTEZSRVFESVZfMjA0OAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzEwMjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl81MTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl8yNTYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfVEFNUEVSX0dldFNhbXBsaW5nRnJlcShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+VEFGQ1IsIFJUQ19UQUZDUl9UQU1QRlJFUSkpOworfQorI2VuZGlmIC8qIFJUQ19UQUZDUl9UQU1QRlJFUSAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBY3RpdmUgbGV2ZWwgZm9yIFRhbXBlciBpbnB1dAorICAqIEBybXRvbGwgVEFGQ1IgICAgICAgVEFNUDFUUkcgICAgICBMTF9SVENfVEFNUEVSX0VuYWJsZUFjdGl2ZUxldmVsXG4KKyAgKiAgICAgICAgIFRBRkNSICAgICAgIFRBTVAyVFJHICAgICAgTExfUlRDX1RBTVBFUl9FbmFibGVBY3RpdmVMZXZlbFxuCisgICogICAgICAgICBUQUZDUiAgICAgICBUQU1QM1RSRyAgICAgIExMX1JUQ19UQU1QRVJfRW5hYmxlQWN0aXZlTGV2ZWwKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBUYW1wZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9BQ1RJVkVMRVZFTF9UQU1QMSAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX0FDVElWRUxFVkVMX1RBTVAyIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfQUNUSVZFTEVWRUxfVEFNUDMgKCopCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19UQU1QRVJfRW5hYmxlQWN0aXZlTGV2ZWwoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFRhbXBlcikKK3sKKyAgU0VUX0JJVChSVEN4LT5UQUZDUiwgVGFtcGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEFjdGl2ZSBsZXZlbCBmb3IgVGFtcGVyIGlucHV0CisgICogQHJtdG9sbCBUQUZDUiAgICAgICBUQU1QMVRSRyAgICAgIExMX1JUQ19UQU1QRVJfRGlzYWJsZUFjdGl2ZUxldmVsXG4KKyAgKiAgICAgICAgIFRBRkNSICAgICAgIFRBTVAyVFJHICAgICAgTExfUlRDX1RBTVBFUl9EaXNhYmxlQWN0aXZlTGV2ZWxcbgorICAqICAgICAgICAgVEFGQ1IgICAgICAgVEFNUDNUUkcgICAgICBMTF9SVENfVEFNUEVSX0Rpc2FibGVBY3RpdmVMZXZlbAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRhbXBlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX0FDVElWRUxFVkVMX1RBTVAxIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfQUNUSVZFTEVWRUxfVEFNUDIgCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9BQ1RJVkVMRVZFTF9UQU1QMyAoKikKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RBTVBFUl9EaXNhYmxlQWN0aXZlTGV2ZWwoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFRhbXBlcikKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPlRBRkNSLCBUYW1wZXIpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChSVENfV0FLRVVQX1NVUFBPUlQpCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FRl9XYWtldXAgV2FrZXVwCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgV2FrZXVwIHRpbWVyCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFdVVEUgICAgICAgICAgTExfUlRDX1dBS0VVUF9FbmFibGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfV0FLRVVQX0VuYWJsZShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5DUiwgUlRDX0NSX1dVVEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgV2FrZXVwIHRpbWVyCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFdVVEUgICAgICAgICAgTExfUlRDX1dBS0VVUF9EaXNhYmxlCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1dBS0VVUF9EaXNhYmxlKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBDTEVBUl9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9XVVRFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBXYWtldXAgdGltZXIgaXMgZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBXVVRFICAgICAgICAgIExMX1JUQ19XQUtFVVBfSXNFbmFibGVkCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19XQUtFVVBfSXNFbmFibGVkKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKFJFQURfQklUKFJUQ3gtPkNSLCBSVENfQ1JfV1VURSkgPT0gKFJUQ19DUl9XVVRFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VsZWN0IFdha2V1cCBjbG9jaworICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAbm90ZSBCaXQgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIFJUQ19DUiBXVVRFIGJpdCA9IDAgYW5kIFJUQ19JU1IgV1VUV0YgYml0ID0gMQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFdVQ0tTRUwgICAgICAgTExfUlRDX1dBS0VVUF9TZXRDbG9jaworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFdha2V1cENsb2NrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dBS0VVUENMT0NLX0RJVl8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XQUtFVVBDTE9DS19ESVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XQUtFVVBDTE9DS19ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XQUtFVVBDTE9DS19ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XQUtFVVBDTE9DS19DS1NQUkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0FLRVVQQ0xPQ0tfQ0tTUFJFX1dVVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1dBS0VVUF9TZXRDbG9jayhSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgV2FrZXVwQ2xvY2spCit7CisgIE1PRElGWV9SRUcoUlRDeC0+Q1IsIFJUQ19DUl9XVUNLU0VMLCBXYWtldXBDbG9jayk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFdha2V1cCBjbG9jaworICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFdVQ0tTRUwgICAgICAgTExfUlRDX1dBS0VVUF9HZXRDbG9jaworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dBS0VVUENMT0NLX0RJVl8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XQUtFVVBDTE9DS19ESVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XQUtFVVBDTE9DS19ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XQUtFVVBDTE9DS19ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XQUtFVVBDTE9DS19DS1NQUkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0FLRVVQQ0xPQ0tfQ0tTUFJFX1dVVAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19XQUtFVVBfR2V0Q2xvY2soUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPkNSLCBSVENfQ1JfV1VDS1NFTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBXYWtldXAgYXV0by1yZWxvYWQgdmFsdWUKKyAgKiBAbm90ZSBCaXQgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIFdVVFdGIGlzIHNldCB0byAxIGluIFJUQ19JU1IKKyAgKiBAcm10b2xsIFdVVFIgICAgICAgICBXVVQgICAgICAgICAgIExMX1JUQ19XQUtFVVBfU2V0QXV0b1JlbG9hZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFZhbHVlIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfV0FLRVVQX1NldEF1dG9SZWxvYWQoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFZhbHVlKQoreworICBNT0RJRllfUkVHKFJUQ3gtPldVVFIsIFJUQ19XVVRSX1dVVCwgVmFsdWUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBXYWtldXAgYXV0by1yZWxvYWQgdmFsdWUKKyAgKiBAcm10b2xsIFdVVFIgICAgICAgICBXVVQgICAgICAgICAgIExMX1JUQ19XQUtFVVBfR2V0QXV0b1JlbG9hZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX1dBS0VVUF9HZXRBdXRvUmVsb2FkKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5XVVRSLCBSVENfV1VUUl9XVVQpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBSVENfV0FLRVVQX1NVUFBPUlQgKi8KKworI2lmIGRlZmluZWQoUlRDX0JBQ0tVUF9TVVBQT1JUKQorLyoqIEBkZWZncm91cCBSVENfTExfRUZfQmFja3VwX1JlZ2lzdGVycyBCYWNrdXBfUmVnaXN0ZXJzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXcml0ZXMgYSBkYXRhIGluIGEgc3BlY2lmaWVkIFJUQyBCYWNrdXAgZGF0YSByZWdpc3Rlci4KKyAgKiBAcm10b2xsIEJLUHhSICAgICAgICBCS1AgICAgICAgICAgIExMX1JUQ19CQUtfU2V0UmVnaXN0ZXIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBCYWNrdXBSZWdpc3RlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSNSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSNiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSNyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSOCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSOSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSMTAgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjExICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIxMiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSMTMgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjE0ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIxNSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSMTYgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjE3ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIxOCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSMTkgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjIwICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIyMSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSMjIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjIzICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIyNCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSMjUgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjI2ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIyNyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSMjggKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjI5ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIzMCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSMzEgKCopCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAgKiBAcGFyYW0gIERhdGEgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGRkZGRkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQkFLX1NldFJlZ2lzdGVyKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBCYWNrdXBSZWdpc3RlciwgdWludDMyX3QgRGF0YSkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdG1wID0gMFU7CisKKyAgdG1wID0gKHVpbnQzMl90KSgmKFJUQ3gtPkJLUDBSKSk7CisgIHRtcCArPSAoQmFja3VwUmVnaXN0ZXIgKiA0VSk7CisKKyAgLyogV3JpdGUgdGhlIHNwZWNpZmllZCByZWdpc3RlciAqLworICAqKF9fSU8gdWludDMyX3QgKil0bXAgPSAodWludDMyX3QpRGF0YTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWFkcyBkYXRhIGZyb20gdGhlIHNwZWNpZmllZCBSVEMgQmFja3VwIGRhdGEgUmVnaXN0ZXIuCisgICogQHJtdG9sbCBCS1B4UiAgICAgICAgQktQICAgICAgICAgICBMTF9SVENfQkFLX0dldFJlZ2lzdGVyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgQmFja3VwUmVnaXN0ZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjUgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjYgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjcgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjggKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjkgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjEwICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIxMSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSMTIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjEzICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIxNCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSMTUgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjE2ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIxNyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSMTggKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjE5ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIyMCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSMjEgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjIyICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIyMyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSMjQgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjI1ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIyNiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSMjcgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjI4ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIyOSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSMzAgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjMxICgqKQorICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkZGRkZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQkFLX0dldFJlZ2lzdGVyKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBCYWNrdXBSZWdpc3RlcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdG1wID0gMFU7CisKKyAgdG1wID0gKHVpbnQzMl90KSgmKFJUQ3gtPkJLUDBSKSk7CisgIHRtcCArPSAoQmFja3VwUmVnaXN0ZXIgKiA0VSk7CisKKyAgLyogUmVhZCB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyICovCisgIHJldHVybiAoKihfX0lPIHVpbnQzMl90ICopdG1wKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBSVENfQkFDS1VQX1NVUFBPUlQgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUZfQ2FsaWJyYXRpb24gQ2FsaWJyYXRpb24KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBDYWxpYnJhdGlvbiBvdXRwdXQgZnJlcXVlbmN5ICgxIEh6IG9yIDUxMiBIeikKKyAgKiBAbm90ZSBCaXRzIGFyZSB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQ09FICAgICAgICAgICBMTF9SVENfQ0FMX1NldE91dHB1dEZyZXFcbgorICAqICAgICAgICAgQ1IgICAgICAgICAgIENPU0VMICAgICAgICAgTExfUlRDX0NBTF9TZXRPdXRwdXRGcmVxCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgRnJlcXVlbmN5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0NBTElCX09VVFBVVF9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0NBTElCX09VVFBVVF8xSFoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQ0FMSUJfT1VUUFVUXzUxMkhaCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQ0FMX1NldE91dHB1dEZyZXEoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IEZyZXF1ZW5jeSkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5DUiwgUlRDX0NSX0NPRSB8IFJUQ19DUl9DT1NFTCwgRnJlcXVlbmN5KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2FsaWJyYXRpb24gb3V0cHV0IGZyZXF1ZW5jeSAoMSBIeiBvciA1MTIgSHopCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQ09FICAgICAgICAgICBMTF9SVENfQ0FMX0dldE91dHB1dEZyZXFcbgorICAqICAgICAgICAgQ1IgICAgICAgICAgIENPU0VMICAgICAgICAgTExfUlRDX0NBTF9HZXRPdXRwdXRGcmVxCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQ0FMSUJfT1VUUFVUX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQ0FMSUJfT1VUUFVUXzFIWgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19DQUxJQl9PVVRQVVRfNTEySFoKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQ0FMX0dldE91dHB1dEZyZXEoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPkNSLCBSVENfQ1JfQ09FIHwgUlRDX0NSX0NPU0VMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5zZXJ0IG9yIG5vdCBPbmUgUlRDQ0xLIHB1bHNlIGV2ZXJ5IDJleHAxMSBwdWxzZXMgKGZyZXF1ZW5jeSBpbmNyZWFzZWQgYnkgNDg4LjUgcHBtKQorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAbm90ZSBCaXQgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIFJFQ0FMUEYgaXMgc2V0IHRvIDAgaW4gUlRDX0lTUgorICAqIEBybXRvbGwgQ0FMUiAgICAgICAgIENBTFAgICAgICAgICAgTExfUlRDX0NBTF9TZXRQdWxzZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFB1bHNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0NBTElCX0lOU0VSVFBVTFNFX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQ0FMSUJfSU5TRVJUUFVMU0VfU0VUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQ0FMX1NldFB1bHNlKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBQdWxzZSkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5DQUxSLCBSVENfQ0FMUl9DQUxQLCBQdWxzZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgb25lIFJUQ0NMSyBoYXMgYmVlbiBpbnNlcnRlZCBvciBub3QgZXZlcnkgMmV4cDExIHB1bHNlcyAoZnJlcXVlbmN5IGluY3JlYXNlZCBieSA0ODguNSBwcG0pCisgICogQHJtdG9sbCBDQUxSICAgICAgICAgQ0FMUCAgICAgICAgICBMTF9SVENfQ0FMX0lzUHVsc2VJbnNlcnRlZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQ0FMX0lzUHVsc2VJbnNlcnRlZChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChSVEN4LT5DQUxSLCBSVENfQ0FMUl9DQUxQKSA9PSAoUlRDX0NBTFJfQ0FMUCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgY2FsaWJyYXRpb24gY3ljbGUgcGVyaW9kCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBub3RlICAgQml0IGNhbiBiZSB3cml0dGVuIG9ubHkgd2hlbiBSRUNBTFBGIGlzIHNldCB0byAwIGluIFJUQ19JU1IKKyAgKiBAcm10b2xsIENBTFIgICAgICAgICBDQUxXOCAgICAgICAgIExMX1JUQ19DQUxfU2V0UGVyaW9kXG4KKyAgKiAgICAgICAgIENBTFIgICAgICAgICBDQUxXMTYgICAgICAgIExMX1JUQ19DQUxfU2V0UGVyaW9kCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgUGVyaW9kIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0NBTElCX1BFUklPRF8zMlNFQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19DQUxJQl9QRVJJT0RfMTZTRUMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQ0FMSUJfUEVSSU9EXzhTRUMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19DQUxfU2V0UGVyaW9kKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBQZXJpb2QpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+Q0FMUiwgUlRDX0NBTFJfQ0FMVzggfCBSVENfQ0FMUl9DQUxXMTYsIFBlcmlvZCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBjYWxpYnJhdGlvbiBjeWNsZSBwZXJpb2QKKyAgKiBAcm10b2xsIENBTFIgICAgICAgICBDQUxXOCAgICAgICAgIExMX1JUQ19DQUxfR2V0UGVyaW9kXG4KKyAgKiAgICAgICAgIENBTFIgICAgICAgICBDQUxXMTYgICAgICAgIExMX1JUQ19DQUxfR2V0UGVyaW9kCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQ0FMSUJfUEVSSU9EXzMyU0VDCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0NBTElCX1BFUklPRF8xNlNFQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19DQUxJQl9QRVJJT0RfOFNFQworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19DQUxfR2V0UGVyaW9kKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5DQUxSLCBSVENfQ0FMUl9DQUxXOCB8IFJUQ19DQUxSX0NBTFcxNikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBDYWxpYnJhdGlvbiBtaW51cworICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAbm90ZSAgIEJpdCBjYW4gYmUgd3JpdHRlbiBvbmx5IHdoZW4gUkVDQUxQRiBpcyBzZXQgdG8gMCBpbiBSVENfSVNSCisgICogQHJtdG9sbCBDQUxSICAgICAgICAgQ0FMTSAgICAgICAgICBMTF9SVENfQ0FMX1NldE1pbnVzCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2FsaWJNaW51cyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MUZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQ0FMX1NldE1pbnVzKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBDYWxpYk1pbnVzKQoreworICBNT0RJRllfUkVHKFJUQ3gtPkNBTFIsIFJUQ19DQUxSX0NBTE0sIENhbGliTWludXMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDYWxpYnJhdGlvbiBtaW51cworICAqIEBybXRvbGwgQ0FMUiAgICAgICAgIENBTE0gICAgICAgICAgTExfUlRDX0NBTF9HZXRNaW51cworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9IDB4MUZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0NBTF9HZXRNaW51cyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+Q0FMUiwgUlRDX0NBTFJfQ0FMTSkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FRl9GTEFHX01hbmFnZW1lbnQgRkxBR19NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBHZXQgUmVjYWxpYnJhdGlvbiBwZW5kaW5nIEZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBSRUNBTFBGICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfUkVDQUxQCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0FjdGl2ZUZsYWdfUkVDQUxQKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKFJFQURfQklUKFJUQ3gtPklTUiwgUlRDX0lTUl9SRUNBTFBGKSA9PSAoUlRDX0lTUl9SRUNBTFBGKSk7Cit9CisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIEdldCBSVENfVEFNUDMgZGV0ZWN0aW9uIGZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUQU1QM0YgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfVEFNUDMKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19UQU1QMyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChSVEN4LT5JU1IsIFJUQ19JU1JfVEFNUDNGKSA9PSAoUlRDX0lTUl9UQU1QM0YpKTsKK30KKyNlbmRpZiAvKiBSVENfVEFNUEVSM19TVVBQT1JUICovCisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIyX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIEdldCBSVENfVEFNUDIgZGV0ZWN0aW9uIGZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUQU1QMkYgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfVEFNUDIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19UQU1QMihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChSVEN4LT5JU1IsIFJUQ19JU1JfVEFNUDJGKSA9PSAoUlRDX0lTUl9UQU1QMkYpKTsKK30KKyNlbmRpZiAvKiBSVENfVEFNUEVSMl9TVVBQT1JUICovCisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIEdldCBSVENfVEFNUDEgZGV0ZWN0aW9uIGZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUQU1QMUYgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfVEFNUDEKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19UQU1QMShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChSVEN4LT5JU1IsIFJUQ19JU1JfVEFNUDFGKSA9PSAoUlRDX0lTUl9UQU1QMUYpKTsKK30KKyNlbmRpZiAvKiBSVENfVEFNUEVSMV9TVVBQT1JUICovCisKKy8qKgorICAqIEBicmllZiAgR2V0IFRpbWUtc3RhbXAgb3ZlcmZsb3cgZmxhZworICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRTT1ZGICAgICAgICAgTExfUlRDX0lzQWN0aXZlRmxhZ19UU09WCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0FjdGl2ZUZsYWdfVFNPVihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChSVEN4LT5JU1IsIFJUQ19JU1JfVFNPVkYpID09IChSVENfSVNSX1RTT1ZGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFRpbWUtc3RhbXAgZmxhZworICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRTRiAgICAgICAgICAgTExfUlRDX0lzQWN0aXZlRmxhZ19UUworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNBY3RpdmVGbGFnX1RTKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKFJFQURfQklUKFJUQ3gtPklTUiwgUlRDX0lTUl9UU0YpID09IChSVENfSVNSX1RTRikpOworfQorCisjaWYgZGVmaW5lZChSVENfV0FLRVVQX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIEdldCBXYWtldXAgdGltZXIgZmxhZworICAqIEBybXRvbGwgSVNSICAgICAgICAgIFdVVEYgICAgICAgICAgTExfUlRDX0lzQWN0aXZlRmxhZ19XVVQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19XVVQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoUlRDeC0+SVNSLCBSVENfSVNSX1dVVEYpID09IChSVENfSVNSX1dVVEYpKTsKK30KKyNlbmRpZiAvKiBSVENfV0FLRVVQX1NVUFBPUlQgKi8KKworLyoqCisgICogQGJyaWVmICBHZXQgQWxhcm0gQiBmbGFnCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQUxSQkYgICAgICAgICBMTF9SVENfSXNBY3RpdmVGbGFnX0FMUkIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19BTFJCKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKFJFQURfQklUKFJUQ3gtPklTUiwgUlRDX0lTUl9BTFJCRikgPT0gKFJUQ19JU1JfQUxSQkYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQWxhcm0gQSBmbGFnCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQUxSQUYgICAgICAgICBMTF9SVENfSXNBY3RpdmVGbGFnX0FMUkEKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19BTFJBKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKFJFQURfQklUKFJUQ3gtPklTUiwgUlRDX0lTUl9BTFJBRikgPT0gKFJUQ19JU1JfQUxSQUYpKTsKK30KKworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgUlRDX1RBTVAzIGRldGVjdGlvbiBmbGFnCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVEFNUDNGICAgICAgICBMTF9SVENfQ2xlYXJGbGFnX1RBTVAzCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0NsZWFyRmxhZ19UQU1QMyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgV1JJVEVfUkVHKFJUQ3gtPklTUiwgKH4oKFJUQ19JU1JfVEFNUDNGIHwgUlRDX0lTUl9JTklUKSAmIDB4MDAwMEZGRkZVKSB8IChSVEN4LT5JU1IgJiBSVENfSVNSX0lOSVQpKSk7Cit9CisjZW5kaWYgLyogUlRDX1RBTVBFUjNfU1VQUE9SVCAqLworCisjaWYgZGVmaW5lZChSVENfVEFNUEVSMl9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBDbGVhciBSVENfVEFNUDIgZGV0ZWN0aW9uIGZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUQU1QMkYgICAgICAgIExMX1JUQ19DbGVhckZsYWdfVEFNUDIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQ2xlYXJGbGFnX1RBTVAyKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBXUklURV9SRUcoUlRDeC0+SVNSLCAofigoUlRDX0lTUl9UQU1QMkYgfCBSVENfSVNSX0lOSVQpICYgMHgwMDAwRkZGRlUpIHwgKFJUQ3gtPklTUiAmIFJUQ19JU1JfSU5JVCkpKTsKK30KKyNlbmRpZiAvKiBSVENfVEFNUEVSMl9TVVBQT1JUICovCisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFJUQ19UQU1QMSBkZXRlY3Rpb24gZmxhZworICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRBTVAxRiAgICAgICAgTExfUlRDX0NsZWFyRmxhZ19UQU1QMQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19DbGVhckZsYWdfVEFNUDEoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFdSSVRFX1JFRyhSVEN4LT5JU1IsICh+KChSVENfSVNSX1RBTVAxRiB8IFJUQ19JU1JfSU5JVCkgJiAweDAwMDBGRkZGVSkgfCAoUlRDeC0+SVNSICYgUlRDX0lTUl9JTklUKSkpOworfQorI2VuZGlmIC8qIFJUQ19UQU1QRVIxX1NVUFBPUlQgKi8KKworLyoqCisgICogQGJyaWVmICBDbGVhciBUaW1lLXN0YW1wIG92ZXJmbG93IGZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUU09WRiAgICAgICAgIExMX1JUQ19DbGVhckZsYWdfVFNPVgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19DbGVhckZsYWdfVFNPVihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgV1JJVEVfUkVHKFJUQ3gtPklTUiwgKH4oKFJUQ19JU1JfVFNPVkYgfCBSVENfSVNSX0lOSVQpICYgMHgwMDAwRkZGRlUpIHwgKFJUQ3gtPklTUiAmIFJUQ19JU1JfSU5JVCkpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBUaW1lLXN0YW1wIGZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUU0YgICAgICAgICAgIExMX1JUQ19DbGVhckZsYWdfVFMKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQ2xlYXJGbGFnX1RTKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBXUklURV9SRUcoUlRDeC0+SVNSLCAofigoUlRDX0lTUl9UU0YgfCBSVENfSVNSX0lOSVQpICYgMHgwMDAwRkZGRlUpIHwgKFJUQ3gtPklTUiAmIFJUQ19JU1JfSU5JVCkpKTsKK30KKworI2lmIGRlZmluZWQoUlRDX1dBS0VVUF9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBDbGVhciBXYWtldXAgdGltZXIgZmxhZworICAqIEBybXRvbGwgSVNSICAgICAgICAgIFdVVEYgICAgICAgICAgTExfUlRDX0NsZWFyRmxhZ19XVVQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQ2xlYXJGbGFnX1dVVChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgV1JJVEVfUkVHKFJUQ3gtPklTUiwgKH4oKFJUQ19JU1JfV1VURiB8IFJUQ19JU1JfSU5JVCkgJiAweDAwMDBGRkZGVSkgfCAoUlRDeC0+SVNSICYgUlRDX0lTUl9JTklUKSkpOworfQorI2VuZGlmIC8qIFJUQ19XQUtFVVBfU1VQUE9SVCAqLworCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIEFsYXJtIEIgZmxhZworICAqIEBybXRvbGwgSVNSICAgICAgICAgIEFMUkJGICAgICAgICAgTExfUlRDX0NsZWFyRmxhZ19BTFJCCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0NsZWFyRmxhZ19BTFJCKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBXUklURV9SRUcoUlRDeC0+SVNSLCAofigoUlRDX0lTUl9BTFJCRiB8IFJUQ19JU1JfSU5JVCkgJiAweDAwMDBGRkZGVSkgfCAoUlRDeC0+SVNSICYgUlRDX0lTUl9JTklUKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIEFsYXJtIEEgZmxhZworICAqIEBybXRvbGwgSVNSICAgICAgICAgIEFMUkFGICAgICAgICAgTExfUlRDX0NsZWFyRmxhZ19BTFJBCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0NsZWFyRmxhZ19BTFJBKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBXUklURV9SRUcoUlRDeC0+SVNSLCAofigoUlRDX0lTUl9BTFJBRiB8IFJUQ19JU1JfSU5JVCkgJiAweDAwMDBGRkZGVSkgfCAoUlRDeC0+SVNSICYgUlRDX0lTUl9JTklUKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBJbml0aWFsaXphdGlvbiBmbGFnCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgSU5JVEYgICAgICAgICBMTF9SVENfSXNBY3RpdmVGbGFnX0lOSVQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19JTklUKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKFJFQURfQklUKFJUQ3gtPklTUiwgUlRDX0lTUl9JTklURikgPT0gKFJUQ19JU1JfSU5JVEYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgUmVnaXN0ZXJzIHN5bmNocm9uaXphdGlvbiBmbGFnCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgUlNGICAgICAgICAgICBMTF9SVENfSXNBY3RpdmVGbGFnX1JTCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0FjdGl2ZUZsYWdfUlMoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoUlRDeC0+SVNSLCBSVENfSVNSX1JTRikgPT0gKFJUQ19JU1JfUlNGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgUmVnaXN0ZXJzIHN5bmNocm9uaXphdGlvbiBmbGFnCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgUlNGICAgICAgICAgICBMTF9SVENfQ2xlYXJGbGFnX1JTCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0NsZWFyRmxhZ19SUyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgV1JJVEVfUkVHKFJUQ3gtPklTUiwgKH4oKFJUQ19JU1JfUlNGIHwgUlRDX0lTUl9JTklUKSAmIDB4MDAwMEZGRkZVKSB8IChSVEN4LT5JU1IgJiBSVENfSVNSX0lOSVQpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEluaXRpYWxpemF0aW9uIHN0YXR1cyBmbGFnCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgSU5JVFMgICAgICAgICBMTF9SVENfSXNBY3RpdmVGbGFnX0lOSVRTCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0FjdGl2ZUZsYWdfSU5JVFMoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoUlRDeC0+SVNSLCBSVENfSVNSX0lOSVRTKSA9PSAoUlRDX0lTUl9JTklUUykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBTaGlmdCBvcGVyYXRpb24gcGVuZGluZyBmbGFnCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgU0hQRiAgICAgICAgICBMTF9SVENfSXNBY3RpdmVGbGFnX1NIUAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNBY3RpdmVGbGFnX1NIUChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChSVEN4LT5JU1IsIFJUQ19JU1JfU0hQRikgPT0gKFJUQ19JU1JfU0hQRikpOworfQorCisjaWYgZGVmaW5lZChSVENfV0FLRVVQX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIEdldCBXYWtldXAgdGltZXIgd3JpdGUgZmxhZworICAqIEBybXRvbGwgSVNSICAgICAgICAgIFdVVFdGICAgICAgICAgTExfUlRDX0lzQWN0aXZlRmxhZ19XVVRXCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0FjdGl2ZUZsYWdfV1VUVyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChSVEN4LT5JU1IsIFJUQ19JU1JfV1VUV0YpID09IChSVENfSVNSX1dVVFdGKSk7Cit9CisjZW5kaWYgLyogUlRDX1dBS0VVUF9TVVBQT1JUICovCisKKy8qKgorICAqIEBicmllZiAgR2V0IEFsYXJtIEIgd3JpdGUgZmxhZworICAqIEBybXRvbGwgSVNSICAgICAgICAgIEFMUkJXRiAgICAgICAgTExfUlRDX0lzQWN0aXZlRmxhZ19BTFJCVworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNBY3RpdmVGbGFnX0FMUkJXKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKFJFQURfQklUKFJUQ3gtPklTUiwgUlRDX0lTUl9BTFJCV0YpID09IChSVENfSVNSX0FMUkJXRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBbGFybSBBIHdyaXRlIGZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBBTFJBV0YgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfQUxSQVcKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19BTFJBVyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChSVEN4LT5JU1IsIFJUQ19JU1JfQUxSQVdGKSA9PSAoUlRDX0lTUl9BTFJBV0YpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUZfSVRfTWFuYWdlbWVudCBJVF9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgVGltZS1zdGFtcCBpbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgVFNJRSAgICAgICAgICBMTF9SVENfRW5hYmxlSVRfVFMKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRW5hYmxlSVRfVFMoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9UU0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFRpbWUtc3RhbXAgaW50ZXJydXB0CisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFRTSUUgICAgICAgICAgTExfUlRDX0Rpc2FibGVJVF9UUworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EaXNhYmxlSVRfVFMoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIENMRUFSX0JJVChSVEN4LT5DUiwgUlRDX0NSX1RTSUUpOworfQorCisjaWYgZGVmaW5lZChSVENfV0FLRVVQX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBXYWtldXAgdGltZXIgaW50ZXJydXB0CisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFdVVElFICAgICAgICAgTExfUlRDX0VuYWJsZUlUX1dVVAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19FbmFibGVJVF9XVVQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9XVVRJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBXYWtldXAgdGltZXIgaW50ZXJydXB0CisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFdVVElFICAgICAgICAgTExfUlRDX0Rpc2FibGVJVF9XVVQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRGlzYWJsZUlUX1dVVChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPkNSLCBSVENfQ1JfV1VUSUUpOworfQorI2VuZGlmIC8qIFJUQ19XQUtFVVBfU1VQUE9SVCAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBbGFybSBCIGludGVycnVwdAorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBBTFJCSUUgICAgICAgIExMX1JUQ19FbmFibGVJVF9BTFJCCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0VuYWJsZUlUX0FMUkIoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9BTFJCSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQWxhcm0gQiBpbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQUxSQklFICAgICAgICBMTF9SVENfRGlzYWJsZUlUX0FMUkIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRGlzYWJsZUlUX0FMUkIoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIENMRUFSX0JJVChSVEN4LT5DUiwgUlRDX0NSX0FMUkJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEFsYXJtIEEgaW50ZXJydXB0CisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEFMUkFJRSAgICAgICAgTExfUlRDX0VuYWJsZUlUX0FMUkEKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRW5hYmxlSVRfQUxSQShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5DUiwgUlRDX0NSX0FMUkFJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBbGFybSBBIGludGVycnVwdAorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBBTFJBSUUgICAgICAgIExMX1JUQ19EaXNhYmxlSVRfQUxSQQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EaXNhYmxlSVRfQUxSQShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPkNSLCBSVENfQ1JfQUxSQUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgYWxsIFRhbXBlciBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIFRBRkNSICAgICAgIFRBTVBJRSAgICAgICAgTExfUlRDX0VuYWJsZUlUX1RBTVAKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRW5hYmxlSVRfVEFNUChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5UQUZDUiwgUlRDX1RBRkNSX1RBTVBJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBhbGwgVGFtcGVyIEludGVycnVwdAorICAqIEBybXRvbGwgVEFGQ1IgICAgICAgVEFNUElFICAgICAgICBMTF9SVENfRGlzYWJsZUlUX1RBTVAKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRGlzYWJsZUlUX1RBTVAoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIENMRUFSX0JJVChSVEN4LT5UQUZDUiwgUlRDX1RBRkNSX1RBTVBJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgIFRpbWUtc3RhbXAgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBDUiAgICAgICAgICAgVFNJRSAgICAgICAgICBMTF9SVENfSXNFbmFibGVkSVRfVFMKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzRW5hYmxlZElUX1RTKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKFJFQURfQklUKFJUQ3gtPkNSLCBSVENfQ1JfVFNJRSkgPT0gKFJUQ19DUl9UU0lFKSk7Cit9CisKKyNpZiBkZWZpbmVkKFJUQ19XQUtFVVBfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgIFdha2V1cCB0aW1lciBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBXVVRJRSAgICAgICAgIExMX1JUQ19Jc0VuYWJsZWRJVF9XVVQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzRW5hYmxlZElUX1dVVChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChSVEN4LT5DUiwgUlRDX0NSX1dVVElFKSA9PSAoUlRDX0NSX1dVVElFKSk7Cit9CisjZW5kaWYgLyogUlRDX1dBS0VVUF9TVVBQT1JUICovCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgIEFsYXJtIEIgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQUxSQklFICAgICAgICBMTF9SVENfSXNFbmFibGVkSVRfQUxSQgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNFbmFibGVkSVRfQUxSQihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChSVEN4LT5DUiwgUlRDX0NSX0FMUkJJRSkgPT0gKFJUQ19DUl9BTFJCSUUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiAgQWxhcm0gQSBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBBTFJBSUUgICAgICAgIExMX1JUQ19Jc0VuYWJsZWRJVF9BTFJBCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0VuYWJsZWRJVF9BTFJBKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKFJFQURfQklUKFJUQ3gtPkNSLCBSVENfQ1JfQUxSQUlFKSA9PSAoUlRDX0NSX0FMUkFJRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIGFsbCB0aGUgVEFNUEVSIGludGVycnVwdHMgYXJlIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBUQUZDUiAgICAgICBUQU1QSUUgICAgICAgIExMX1JUQ19Jc0VuYWJsZWRJVF9UQU1QCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0VuYWJsZWRJVF9UQU1QKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKFJFQURfQklUKFJUQ3gtPlRBRkNSLAorICAgICAgICAgICAgICAgICAgIFJUQ19UQUZDUl9UQU1QSUUpID09IChSVENfVEFGQ1JfVEFNUElFKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKK0Vycm9yU3RhdHVzIExMX1JUQ19EZUluaXQoUlRDX1R5cGVEZWYgKlJUQ3gpOworRXJyb3JTdGF0dXMgTExfUlRDX0luaXQoUlRDX1R5cGVEZWYgKlJUQ3gsIExMX1JUQ19Jbml0VHlwZURlZiAqUlRDX0luaXRTdHJ1Y3QpOwordm9pZCAgICAgICAgTExfUlRDX1N0cnVjdEluaXQoTExfUlRDX0luaXRUeXBlRGVmICpSVENfSW5pdFN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9SVENfVElNRV9Jbml0KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBSVENfRm9ybWF0LCBMTF9SVENfVGltZVR5cGVEZWYgKlJUQ19UaW1lU3RydWN0KTsKK3ZvaWQgICAgICAgIExMX1JUQ19USU1FX1N0cnVjdEluaXQoTExfUlRDX1RpbWVUeXBlRGVmICpSVENfVGltZVN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9SVENfREFURV9Jbml0KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBSVENfRm9ybWF0LCBMTF9SVENfRGF0ZVR5cGVEZWYgKlJUQ19EYXRlU3RydWN0KTsKK3ZvaWQgICAgICAgIExMX1JUQ19EQVRFX1N0cnVjdEluaXQoTExfUlRDX0RhdGVUeXBlRGVmICpSVENfRGF0ZVN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9SVENfQUxNQV9Jbml0KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBSVENfRm9ybWF0LCBMTF9SVENfQWxhcm1UeXBlRGVmICpSVENfQWxhcm1TdHJ1Y3QpOworRXJyb3JTdGF0dXMgTExfUlRDX0FMTUJfSW5pdChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgUlRDX0Zvcm1hdCwgTExfUlRDX0FsYXJtVHlwZURlZiAqUlRDX0FsYXJtU3RydWN0KTsKK3ZvaWQgICAgICAgIExMX1JUQ19BTE1BX1N0cnVjdEluaXQoTExfUlRDX0FsYXJtVHlwZURlZiAqUlRDX0FsYXJtU3RydWN0KTsKK3ZvaWQgICAgICAgIExMX1JUQ19BTE1CX1N0cnVjdEluaXQoTExfUlRDX0FsYXJtVHlwZURlZiAqUlRDX0FsYXJtU3RydWN0KTsKK0Vycm9yU3RhdHVzIExMX1JUQ19FbnRlckluaXRNb2RlKFJUQ19UeXBlRGVmICpSVEN4KTsKK0Vycm9yU3RhdHVzIExMX1JUQ19FeGl0SW5pdE1vZGUoUlRDX1R5cGVEZWYgKlJUQ3gpOworRXJyb3JTdGF0dXMgTExfUlRDX1dhaXRGb3JTeW5jaHJvKFJUQ19UeXBlRGVmICpSVEN4KTsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIGRlZmluZWQoUlRDKSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkYzeHhfTExfUlRDX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmYzeHhfbGxfc3BpLmggYi9JbmMvc3RtMzJmM3h4X2xsX3NwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MmFjZWUKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2xsX3NwaS5oCkBAIC0wLDAgKzEsMjI3MSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9sbF9zcGkuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgU1BJIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0xMX1NQSV9ICisjZGVmaW5lIF9fU1RNMzJGM3h4X0xMX1NQSV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoU1BJMSkgfHwgZGVmaW5lZCAoU1BJMikgfHwgZGVmaW5lZCAoU1BJMykgfHwgZGVmaW5lZCAoU1BJNCkKKworLyoqIEBkZWZncm91cCBTUElfTEwgU1BJCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBTUElfTExfRVNfSU5JVCBTUEkgRXhwb3J0ZWQgSW5pdCBzdHJ1Y3R1cmUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNQSSBJbml0IHN0cnVjdHVyZXMgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgVHJhbnNmZXJEaXJlY3Rpb247ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBTUEkgdW5pZGlyZWN0aW9uYWwgb3IgYmlkaXJlY3Rpb25hbCBkYXRhIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0xMX0VDX1RSQU5TRkVSX01PREUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9TUElfU2V0VHJhbnNmZXJEaXJlY3Rpb24oKS4qLworCisgIHVpbnQzMl90IE1vZGU7ICAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgU1BJIG1vZGUgKE1hc3Rlci9TbGF2ZSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0xMX0VDX01PREUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9TUElfU2V0TW9kZSgpLiovCisKKyAgdWludDMyX3QgRGF0YVdpZHRoOyAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBTUEkgZGF0YSB3aWR0aC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfTExfRUNfREFUQVdJRFRILgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfU1BJX1NldERhdGFXaWR0aCgpLiovCisKKyAgdWludDMyX3QgQ2xvY2tQb2xhcml0eTsgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzZXJpYWwgY2xvY2sgc3RlYWR5IHN0YXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9MTF9FQ19QT0xBUklUWS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1NQSV9TZXRDbG9ja1BvbGFyaXR5KCkuKi8KKworICB1aW50MzJfdCBDbG9ja1BoYXNlOyAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGNsb2NrIGFjdGl2ZSBlZGdlIGZvciB0aGUgYml0IGNhcHR1cmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0xMX0VDX1BIQVNFLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfU1BJX1NldENsb2NrUGhhc2UoKS4qLworCisgIHVpbnQzMl90IE5TUzsgICAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBOU1Mgc2lnbmFsIGlzIG1hbmFnZWQgYnkgaGFyZHdhcmUgKE5TUyBwaW4pIG9yIGJ5IHNvZnR3YXJlIHVzaW5nIHRoZSBTU0kgYml0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9MTF9FQ19OU1NfTU9ERS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1NQSV9TZXROU1NNb2RlKCkuKi8KKworICB1aW50MzJfdCBCYXVkUmF0ZTsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIEJhdWRSYXRlIHByZXNjYWxlciB2YWx1ZSB3aGljaCB3aWxsIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBTQ0sgY2xvY2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0xMX0VDX0JBVURSQVRFUFJFU0NBTEVSLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGUgY29tbXVuaWNhdGlvbiBjbG9jayBpcyBkZXJpdmVkIGZyb20gdGhlIG1hc3RlciBjbG9jay4gVGhlIHNsYXZlIGNsb2NrIGRvZXMgbm90IG5lZWQgdG8gYmUgc2V0LgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfU1BJX1NldEJhdWRSYXRlUHJlc2NhbGVyKCkuKi8KKworICB1aW50MzJfdCBCaXRPcmRlcjsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciBkYXRhIHRyYW5zZmVycyBzdGFydCBmcm9tIE1TQiBvciBMU0IgYml0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9MTF9FQ19CSVRfT1JERVIuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9TUElfU2V0VHJhbnNmZXJCaXRPcmRlcigpLiovCisKKyAgdWludDMyX3QgQ1JDQ2FsY3VsYXRpb247ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIGlmIHRoZSBDUkMgY2FsY3VsYXRpb24gaXMgZW5hYmxlZCBvciBub3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0xMX0VDX0NSQ19DQUxDVUxBVElPTi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbnMgQHJlZiBMTF9TUElfRW5hYmxlQ1JDKCkgYW5kIEByZWYgTExfU1BJX0Rpc2FibGVDUkMoKS4qLworCisgIHVpbnQzMl90IENSQ1BvbHk7ICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcG9seW5vbWlhbCB1c2VkIGZvciB0aGUgQ1JDIGNhbGN1bGF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1NQSV9TZXRDUkNQb2x5bm9taWFsKCkuKi8KKworfSBMTF9TUElfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FeHBvcnRlZF9Db25zdGFudHMgU1BJIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX0dFVF9GTEFHIEdldCBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9TUElfUmVhZFJlZyBmdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1NQSV9TUl9SWE5FICAgICAgICAgICAgICAgICAgICAgU1BJX1NSX1JYTkUgICAgICAgICAgICAgICAvKiE8IFJ4IGJ1ZmZlciBub3QgZW1wdHkgZmxhZyAgICAgICAgICovCisjZGVmaW5lIExMX1NQSV9TUl9UWEUgICAgICAgICAgICAgICAgICAgICAgU1BJX1NSX1RYRSAgICAgICAgICAgICAgICAvKiE8IFR4IGJ1ZmZlciBlbXB0eSBmbGFnICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1NQSV9TUl9CU1kgICAgICAgICAgICAgICAgICAgICAgU1BJX1NSX0JTWSAgICAgICAgICAgICAgICAvKiE8IEJ1c3kgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1NQSV9TUl9DUkNFUlIgICAgICAgICAgICAgICAgICAgU1BJX1NSX0NSQ0VSUiAgICAgICAgICAgICAvKiE8IENSQyBlcnJvciBmbGFnICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1NQSV9TUl9NT0RGICAgICAgICAgICAgICAgICAgICAgU1BJX1NSX01PREYgICAgICAgICAgICAgICAvKiE8IE1vZGUgZmF1bHQgZmxhZyAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1NQSV9TUl9PVlIgICAgICAgICAgICAgICAgICAgICAgU1BJX1NSX09WUiAgICAgICAgICAgICAgICAvKiE8IE92ZXJydW4gZmxhZyAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1NQSV9TUl9GUkUgICAgICAgICAgICAgICAgICAgICAgU1BJX1NSX0ZSRSAgICAgICAgICAgICAgICAvKiE8IFRJIG1vZGUgZnJhbWUgZm9ybWF0IGVycm9yIGZsYWcgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19JVCBJVCBEZWZpbmVzCisgICogQGJyaWVmICAgIElUIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9TUElfUmVhZFJlZyBhbmQgIExMX1NQSV9Xcml0ZVJlZyBmdW5jdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TUElfQ1IyX1JYTkVJRSAgICAgICAgICAgICAgICAgIFNQSV9DUjJfUlhORUlFICAgICAgICAgICAgLyohPCBSeCBidWZmZXIgbm90IGVtcHR5IGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfU1BJX0NSMl9UWEVJRSAgICAgICAgICAgICAgICAgICBTUElfQ1IyX1RYRUlFICAgICAgICAgICAgIC8qITwgVHggYnVmZmVyIGVtcHR5IGludGVycnVwdCBlbmFibGUgICAgICovCisjZGVmaW5lIExMX1NQSV9DUjJfRVJSSUUgICAgICAgICAgICAgICAgICAgU1BJX0NSMl9FUlJJRSAgICAgICAgICAgICAvKiE8IEVycm9yIGludGVycnVwdCBlbmFibGUgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfTU9ERSBPcGVyYXRpb24gTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1NQSV9NT0RFX01BU1RFUiAgICAgICAgICAgICAgICAgKFNQSV9DUjFfTVNUUiB8IFNQSV9DUjFfU1NJKSAgICAvKiE8IE1hc3RlciBjb25maWd1cmF0aW9uICAqLworI2RlZmluZSBMTF9TUElfTU9ERV9TTEFWRSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgLyohPCBTbGF2ZSBjb25maWd1cmF0aW9uICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX1BST1RPQ09MIFNlcmlhbCBQcm90b2NvbAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1NQSV9QUk9UT0NPTF9NT1RPUk9MQSAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAvKiE8IE1vdG9yb2xhIG1vZGUuIFVzZWQgYXMgZGVmYXVsdCB2YWx1ZSAqLworI2RlZmluZSBMTF9TUElfUFJPVE9DT0xfVEkgICAgICAgICAgICAgICAgIChTUElfQ1IyX0ZSRikgICAgICAgICAgICAgLyohPCBUSSBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX1BIQVNFIENsb2NrIFBoYXNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfU1BJX1BIQVNFXzFFREdFICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgIC8qITwgRmlyc3QgY2xvY2sgdHJhbnNpdGlvbiBpcyB0aGUgZmlyc3QgZGF0YSBjYXB0dXJlIGVkZ2UgICovCisjZGVmaW5lIExMX1NQSV9QSEFTRV8yRURHRSAgICAgICAgICAgICAgICAgKFNQSV9DUjFfQ1BIQSkgICAgICAgICAgICAvKiE8IFNlY29uZCBjbG9jayB0cmFuc2l0aW9uIGlzIHRoZSBmaXJzdCBkYXRhIGNhcHR1cmUgZWRnZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfUE9MQVJJVFkgQ2xvY2sgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TUElfUE9MQVJJVFlfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgLyohPCBDbG9jayB0byAwIHdoZW4gaWRsZSAqLworI2RlZmluZSBMTF9TUElfUE9MQVJJVFlfSElHSCAgICAgICAgICAgICAgIChTUElfQ1IxX0NQT0wpICAgICAgICAgICAgLyohPCBDbG9jayB0byAxIHdoZW4gaWRsZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfQkFVRFJBVEVQUkVTQ0FMRVIgQmF1ZCBSYXRlIFByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVYyICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEJhdWRSYXRlIGNvbnRyb2wgZXF1YWwgdG8gZlBDTEsvMiAgICovCisjZGVmaW5lIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVY0ICAgICAgKFNQSV9DUjFfQlJfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEJhdWRSYXRlIGNvbnRyb2wgZXF1YWwgdG8gZlBDTEsvNCAgICovCisjZGVmaW5lIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVY4ICAgICAgKFNQSV9DUjFfQlJfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEJhdWRSYXRlIGNvbnRyb2wgZXF1YWwgdG8gZlBDTEsvOCAgICovCisjZGVmaW5lIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVYxNiAgICAgKFNQSV9DUjFfQlJfMSB8IFNQSV9DUjFfQlJfMCkgICAgICAgICAgICAgICAgICAvKiE8IEJhdWRSYXRlIGNvbnRyb2wgZXF1YWwgdG8gZlBDTEsvMTYgICovCisjZGVmaW5lIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVYzMiAgICAgKFNQSV9DUjFfQlJfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEJhdWRSYXRlIGNvbnRyb2wgZXF1YWwgdG8gZlBDTEsvMzIgICovCisjZGVmaW5lIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVY2NCAgICAgKFNQSV9DUjFfQlJfMiB8IFNQSV9DUjFfQlJfMCkgICAgICAgICAgICAgICAgICAvKiE8IEJhdWRSYXRlIGNvbnRyb2wgZXF1YWwgdG8gZlBDTEsvNjQgICovCisjZGVmaW5lIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVYxMjggICAgKFNQSV9DUjFfQlJfMiB8IFNQSV9DUjFfQlJfMSkgICAgICAgICAgICAgICAgICAvKiE8IEJhdWRSYXRlIGNvbnRyb2wgZXF1YWwgdG8gZlBDTEsvMTI4ICovCisjZGVmaW5lIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVYyNTYgICAgKFNQSV9DUjFfQlJfMiB8IFNQSV9DUjFfQlJfMSB8IFNQSV9DUjFfQlJfMCkgICAvKiE8IEJhdWRSYXRlIGNvbnRyb2wgZXF1YWwgdG8gZlBDTEsvMjU2ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19CSVRfT1JERVIgVHJhbnNtaXNzaW9uIEJpdCBPcmRlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1NQSV9MU0JfRklSU1QgICAgICAgICAgICAgICAgICAgKFNQSV9DUjFfTFNCRklSU1QpICAgICAgICAvKiE8IERhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aCB0aGUgTFNCIGZpcnN0ICovCisjZGVmaW5lIExMX1NQSV9NU0JfRklSU1QgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAvKiE8IERhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aCB0aGUgTVNCIGZpcnN0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19UUkFOU0ZFUl9NT0RFIFRyYW5zZmVyIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TUElfRlVMTF9EVVBMRVggICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEZ1bGwtRHVwbGV4IG1vZGUuIFJ4IGFuZCBUeCB0cmFuc2ZlciBvbiAyIGxpbmVzICovCisjZGVmaW5lIExMX1NQSV9TSU1QTEVYX1JYICAgICAgICAgICAgICAgICAgKFNQSV9DUjFfUlhPTkxZKSAgICAgICAgICAgICAgICAgICAgIC8qITwgU2ltcGxleCBSeCBtb2RlLiAgUnggdHJhbnNmZXIgb25seSBvbiAxIGxpbmUgICAgKi8KKyNkZWZpbmUgTExfU1BJX0hBTEZfRFVQTEVYX1JYICAgICAgICAgICAgICAoU1BJX0NSMV9CSURJTU9ERSkgICAgICAgICAgICAgICAgICAgLyohPCBIYWxmLUR1cGxleCBSeCBtb2RlLiBSeCB0cmFuc2ZlciBvbiAxIGxpbmUgICAgICAqLworI2RlZmluZSBMTF9TUElfSEFMRl9EVVBMRVhfVFggICAgICAgICAgICAgIChTUElfQ1IxX0JJRElNT0RFIHwgU1BJX0NSMV9CSURJT0UpICAvKiE8IEhhbGYtRHVwbGV4IFR4IG1vZGUuIFR4IHRyYW5zZmVyIG9uIDEgbGluZSAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19OU1NfTU9ERSBTbGF2ZSBTZWxlY3QgUGluIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TUElfTlNTX1NPRlQgICAgICAgICAgICAgICAgICAgIChTUElfQ1IxX1NTTSkgICAgICAgICAgICAgICAgICAgICAvKiE8IE5TUyBtYW5hZ2VkIGludGVybmFsbHkuIE5TUyBwaW4gbm90IHVzZWQgYW5kIGZyZWUgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1NQSV9OU1NfSEFSRF9JTlBVVCAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTlNTIHBpbiB1c2VkIGluIElucHV0LiBPbmx5IHVzZWQgaW4gTWFzdGVyIG1vZGUgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfU1BJX05TU19IQVJEX09VVFBVVCAgICAgICAgICAgICAoKCh1aW50MzJfdClTUElfQ1IyX1NTT0UgPDwgMTZVKSkgLyohPCBOU1MgcGluIHVzZWQgaW4gT3V0cHV0LiBPbmx5IHVzZWQgaW4gU2xhdmUgbW9kZSBhcyBjaGlwIHNlbGVjdCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfREFUQVdJRFRIIERhdGF3aWR0aAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1NQSV9EQVRBV0lEVEhfNEJJVCAgICAgICAgICAgICAgKFNQSV9DUjJfRFNfMCB8IFNQSV9DUjJfRFNfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEYXRhIGxlbmd0aCBmb3IgU1BJIHRyYW5zZmVyOiAgNCBiaXRzICovCisjZGVmaW5lIExMX1NQSV9EQVRBV0lEVEhfNUJJVCAgICAgICAgICAgICAgKFNQSV9DUjJfRFNfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEYXRhIGxlbmd0aCBmb3IgU1BJIHRyYW5zZmVyOiAgNSBiaXRzICovCisjZGVmaW5lIExMX1NQSV9EQVRBV0lEVEhfNkJJVCAgICAgICAgICAgICAgKFNQSV9DUjJfRFNfMiB8IFNQSV9DUjJfRFNfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEYXRhIGxlbmd0aCBmb3IgU1BJIHRyYW5zZmVyOiAgNiBiaXRzICovCisjZGVmaW5lIExMX1NQSV9EQVRBV0lEVEhfN0JJVCAgICAgICAgICAgICAgKFNQSV9DUjJfRFNfMiB8IFNQSV9DUjJfRFNfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEYXRhIGxlbmd0aCBmb3IgU1BJIHRyYW5zZmVyOiAgNyBiaXRzICovCisjZGVmaW5lIExMX1NQSV9EQVRBV0lEVEhfOEJJVCAgICAgICAgICAgICAgKFNQSV9DUjJfRFNfMiB8IFNQSV9DUjJfRFNfMSB8IFNQSV9DUjJfRFNfMCkgICAgICAgICAgICAgICAgLyohPCBEYXRhIGxlbmd0aCBmb3IgU1BJIHRyYW5zZmVyOiAgOCBiaXRzICovCisjZGVmaW5lIExMX1NQSV9EQVRBV0lEVEhfOUJJVCAgICAgICAgICAgICAgKFNQSV9DUjJfRFNfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEYXRhIGxlbmd0aCBmb3IgU1BJIHRyYW5zZmVyOiAgOSBiaXRzICovCisjZGVmaW5lIExMX1NQSV9EQVRBV0lEVEhfMTBCSVQgICAgICAgICAgICAgKFNQSV9DUjJfRFNfMyB8IFNQSV9DUjJfRFNfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEYXRhIGxlbmd0aCBmb3IgU1BJIHRyYW5zZmVyOiAxMCBiaXRzICovCisjZGVmaW5lIExMX1NQSV9EQVRBV0lEVEhfMTFCSVQgICAgICAgICAgICAgKFNQSV9DUjJfRFNfMyB8IFNQSV9DUjJfRFNfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEYXRhIGxlbmd0aCBmb3IgU1BJIHRyYW5zZmVyOiAxMSBiaXRzICovCisjZGVmaW5lIExMX1NQSV9EQVRBV0lEVEhfMTJCSVQgICAgICAgICAgICAgKFNQSV9DUjJfRFNfMyB8IFNQSV9DUjJfRFNfMSB8IFNQSV9DUjJfRFNfMCkgICAgICAgICAgICAgICAgLyohPCBEYXRhIGxlbmd0aCBmb3IgU1BJIHRyYW5zZmVyOiAxMiBiaXRzICovCisjZGVmaW5lIExMX1NQSV9EQVRBV0lEVEhfMTNCSVQgICAgICAgICAgICAgKFNQSV9DUjJfRFNfMyB8IFNQSV9DUjJfRFNfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEYXRhIGxlbmd0aCBmb3IgU1BJIHRyYW5zZmVyOiAxMyBiaXRzICovCisjZGVmaW5lIExMX1NQSV9EQVRBV0lEVEhfMTRCSVQgICAgICAgICAgICAgKFNQSV9DUjJfRFNfMyB8IFNQSV9DUjJfRFNfMiB8IFNQSV9DUjJfRFNfMCkgICAgICAgICAgICAgICAgLyohPCBEYXRhIGxlbmd0aCBmb3IgU1BJIHRyYW5zZmVyOiAxNCBiaXRzICovCisjZGVmaW5lIExMX1NQSV9EQVRBV0lEVEhfMTVCSVQgICAgICAgICAgICAgKFNQSV9DUjJfRFNfMyB8IFNQSV9DUjJfRFNfMiB8IFNQSV9DUjJfRFNfMSkgICAgICAgICAgICAgICAgLyohPCBEYXRhIGxlbmd0aCBmb3IgU1BJIHRyYW5zZmVyOiAxNSBiaXRzICovCisjZGVmaW5lIExMX1NQSV9EQVRBV0lEVEhfMTZCSVQgICAgICAgICAgICAgKFNQSV9DUjJfRFNfMyB8IFNQSV9DUjJfRFNfMiB8IFNQSV9DUjJfRFNfMSB8IFNQSV9DUjJfRFNfMCkgLyohPCBEYXRhIGxlbmd0aCBmb3IgU1BJIHRyYW5zZmVyOiAxNiBiaXRzICovCisvKioKKyAgKiBAfQorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19DUkNfQ0FMQ1VMQVRJT04gQ1JDIENhbGN1bGF0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfU1BJX0NSQ0NBTENVTEFUSU9OX0RJU0FCTEUgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgIC8qITwgQ1JDIGNhbGN1bGF0aW9uIGRpc2FibGVkICovCisjZGVmaW5lIExMX1NQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUgICAgICAgKFNQSV9DUjFfQ1JDRU4pICAgICAgICAgICAvKiE8IENSQyBjYWxjdWxhdGlvbiBlbmFibGVkICAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfQ1JDX0xFTkdUSCBDUkMgTGVuZ3RoCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfU1BJX0NSQ184QklUICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgIC8qITwgIDgtYml0IENSQyBsZW5ndGggKi8KKyNkZWZpbmUgTExfU1BJX0NSQ18xNkJJVCAgICAgICAgICAgICAgICAgICAoU1BJX0NSMV9DUkNMKSAgICAgICAgICAgIC8qITwgMTYtYml0IENSQyBsZW5ndGggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX1JYX0ZJRk9fVEggUlggRklGTyBUaHJlc2hvbGQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TUElfUlhfRklGT19USF9IQUxGICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgLyohPCBSWE5FIGV2ZW50IGlzIGdlbmVyYXRlZCBpZiBGSUZPIGxldmVsIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVlbCB0byAxLzIgKDE2LWJpdCkgKi8KKyNkZWZpbmUgTExfU1BJX1JYX0ZJRk9fVEhfUVVBUlRFUiAgICAgICAgICAoU1BJX0NSMl9GUlhUSCkgICAgICAgICAgIC8qITwgUlhORSBldmVudCBpcyBnZW5lcmF0ZWQgaWYgRklGTyBsZXZlbCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1ZWwgdG8gMS80ICg4LWJpdCkgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19SWF9GSUZPIFJYIEZJRk8gTGV2ZWwKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TUElfUlhfRklGT19FTVBUWSAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEZJRk8gcmVjZXB0aW9uIGVtcHR5ICovCisjZGVmaW5lIExMX1NQSV9SWF9GSUZPX1FVQVJURVJfRlVMTCAgICAgICAgKFNQSV9TUl9GUkxWTF8wKSAgICAgICAgICAgICAgICAgIC8qITwgRklGTyByZWNlcHRpb24gMS80ICAgKi8KKyNkZWZpbmUgTExfU1BJX1JYX0ZJRk9fSEFMRl9GVUxMICAgICAgICAgICAoU1BJX1NSX0ZSTFZMXzEpICAgICAgICAgICAgICAgICAgLyohPCBGSUZPIHJlY2VwdGlvbiAxLzIgICAqLworI2RlZmluZSBMTF9TUElfUlhfRklGT19GVUxMICAgICAgICAgICAgICAgIChTUElfU1JfRlJMVkxfMSB8IFNQSV9TUl9GUkxWTF8wKSAvKiE8IEZJRk8gcmVjZXB0aW9uIGZ1bGwgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19UWF9GSUZPIFRYIEZJRk8gTGV2ZWwKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TUElfVFhfRklGT19FTVBUWSAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEZJRk8gdHJhbnNtaXNzaW9uIGVtcHR5ICovCisjZGVmaW5lIExMX1NQSV9UWF9GSUZPX1FVQVJURVJfRlVMTCAgICAgICAgKFNQSV9TUl9GVExWTF8wKSAgICAgICAgICAgICAgICAgIC8qITwgRklGTyB0cmFuc21pc3Npb24gMS80ICAgKi8KKyNkZWZpbmUgTExfU1BJX1RYX0ZJRk9fSEFMRl9GVUxMICAgICAgICAgICAoU1BJX1NSX0ZUTFZMXzEpICAgICAgICAgICAgICAgICAgLyohPCBGSUZPIHRyYW5zbWlzc2lvbiAxLzIgICAqLworI2RlZmluZSBMTF9TUElfVFhfRklGT19GVUxMICAgICAgICAgICAgICAgIChTUElfU1JfRlRMVkxfMSB8IFNQSV9TUl9GVExWTF8wKSAvKiE8IEZJRk8gdHJhbnNtaXNzaW9uIGZ1bGwgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19ETUFfUEFSSVRZIERNQSBQYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TUElfRE1BX1BBUklUWV9FVkVOICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgLyohPCBTZWxlY3QgRE1BIHBhcml0eSBFdmVuICovCisjZGVmaW5lIExMX1NQSV9ETUFfUEFSSVRZX09ERCAgICAgICAgICAgICAgMHgwMDAwMDAwMVUgICAvKiE8IFNlbGVjdCBETUEgcGFyaXR5IE9kZCAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0V4cG9ydGVkX01hY3JvcyBTUEkgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRU1fV1JJVEVfUkVBRCBDb21tb24gV3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBTUEkgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIExMX1NQSV9Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIFNQSSByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIFNQSSBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICAqLworI2RlZmluZSBMTF9TUElfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgU1BJIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VGX0NvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFNQSSBwZXJpcGhlcmFsCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgU1BFICAgICAgICAgICBMTF9TUElfRW5hYmxlCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0VuYWJsZShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgU0VUX0JJVChTUEl4LT5DUjEsIFNQSV9DUjFfU1BFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFNQSSBwZXJpcGhlcmFsCisgICogQG5vdGUgICBXaGVuIGRpc2FibGluZyB0aGUgU1BJLCBmb2xsb3cgdGhlIHByb2NlZHVyZSBkZXNjcmliZWQgaW4gdGhlIFJlZmVyZW5jZSBNYW51YWwuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgU1BFICAgICAgICAgICBMTF9TUElfRGlzYWJsZQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9EaXNhYmxlKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBDTEVBUl9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX1NQRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgU1BJIHBlcmlwaGVyYWwgaXMgZW5hYmxlZAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFNQRSAgICAgICAgICAgTExfU1BJX0lzRW5hYmxlZAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNFbmFibGVkKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKFJFQURfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9TUEUpID09IChTUElfQ1IxX1NQRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBTUEkgb3BlcmF0aW9uIG1vZGUgdG8gTWFzdGVyIG9yIFNsYXZlCisgICogQG5vdGUgICBUaGlzIGJpdCBzaG91bGQgbm90IGJlIGNoYW5nZWQgd2hlbiBjb21tdW5pY2F0aW9uIGlzIG9uZ29pbmcuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTVNUUiAgICAgICAgICBMTF9TUElfU2V0TW9kZVxuCisgICogICAgICAgICBDUjEgICAgICAgICAgU1NJICAgICAgICAgICBMTF9TUElfU2V0TW9kZQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIE1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfTU9ERV9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfTU9ERV9TTEFWRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1NldE1vZGUoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IE1vZGUpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IxLCBTUElfQ1IxX01TVFIgfCBTUElfQ1IxX1NTSSwgTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFNQSSBvcGVyYXRpb24gbW9kZSAoTWFzdGVyIG9yIFNsYXZlKQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE1TVFIgICAgICAgICAgTExfU1BJX0dldE1vZGVcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIFNTSSAgICAgICAgICAgTExfU1BJX0dldE1vZGUKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9NT0RFX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9NT0RFX1NMQVZFCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldE1vZGUoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9NU1RSIHwgU1BJX0NSMV9TU0kpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgc2VyaWFsIHByb3RvY29sIHVzZWQKKyAgKiBAbm90ZSAgIFRoaXMgYml0IHNob3VsZCBiZSB3cml0dGVuIG9ubHkgd2hlbiBTUEkgaXMgZGlzYWJsZWQgKFNQRSA9IDApIGZvciBjb3JyZWN0IG9wZXJhdGlvbi4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBGUkYgICAgICAgICAgIExMX1NQSV9TZXRTdGFuZGFyZAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFN0YW5kYXJkIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BST1RPQ09MX01PVE9ST0xBCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BST1RPQ09MX1RJCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfU2V0U3RhbmRhcmQoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IFN0YW5kYXJkKQoreworICBNT0RJRllfUkVHKFNQSXgtPkNSMiwgU1BJX0NSMl9GUkYsIFN0YW5kYXJkKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgc2VyaWFsIHByb3RvY29sIHVzZWQKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBGUkYgICAgICAgICAgIExMX1NQSV9HZXRTdGFuZGFyZAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BST1RPQ09MX01PVE9ST0xBCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BST1RPQ09MX1RJCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldFN0YW5kYXJkKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfRlJGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGNsb2NrIHBoYXNlCisgICogQG5vdGUgICBUaGlzIGJpdCBzaG91bGQgbm90IGJlIGNoYW5nZWQgd2hlbiBjb21tdW5pY2F0aW9uIGlzIG9uZ29pbmcuCisgICogICAgICAgICBUaGlzIGJpdCBpcyBub3QgdXNlZCBpbiBTUEkgVEkgbW9kZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDUEhBICAgICAgICAgIExMX1NQSV9TZXRDbG9ja1BoYXNlCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2xvY2tQaGFzZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9QSEFTRV8xRURHRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9QSEFTRV8yRURHRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1NldENsb2NrUGhhc2UoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IENsb2NrUGhhc2UpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IxLCBTUElfQ1IxX0NQSEEsIENsb2NrUGhhc2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjbG9jayBwaGFzZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIENQSEEgICAgICAgICAgTExfU1BJX0dldENsb2NrUGhhc2UKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9QSEFTRV8xRURHRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9QSEFTRV8yRURHRQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9HZXRDbG9ja1BoYXNlKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5DUjEsIFNQSV9DUjFfQ1BIQSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBjbG9jayBwb2xhcml0eQorICAqIEBub3RlICAgVGhpcyBiaXQgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIHdoZW4gY29tbXVuaWNhdGlvbiBpcyBvbmdvaW5nLgorICAqICAgICAgICAgVGhpcyBiaXQgaXMgbm90IHVzZWQgaW4gU1BJIFRJIG1vZGUuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQ1BPTCAgICAgICAgICBMTF9TUElfU2V0Q2xvY2tQb2xhcml0eQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENsb2NrUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUE9MQVJJVFlfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BPTEFSSVRZX0hJR0gKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRDbG9ja1BvbGFyaXR5KFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBDbG9ja1BvbGFyaXR5KQoreworICBNT0RJRllfUkVHKFNQSXgtPkNSMSwgU1BJX0NSMV9DUE9MLCBDbG9ja1BvbGFyaXR5KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY2xvY2sgcG9sYXJpdHkKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDUE9MICAgICAgICAgIExMX1NQSV9HZXRDbG9ja1BvbGFyaXR5CisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUE9MQVJJVFlfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BPTEFSSVRZX0hJR0gKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0Q2xvY2tQb2xhcml0eShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX0NQT0wpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgYmF1ZCByYXRlIHByZXNjYWxlcgorICAqIEBub3RlICAgVGhlc2UgYml0cyBzaG91bGQgbm90IGJlIGNoYW5nZWQgd2hlbiBjb21tdW5pY2F0aW9uIGlzIG9uZ29pbmcuIFNQSSBCYXVkUmF0ZSA9IGZQQ0xLL1ByZXNjYWxlci4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBCUiAgICAgICAgICAgIExMX1NQSV9TZXRCYXVkUmF0ZVByZXNjYWxlcgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEJhdWRSYXRlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVYyNTYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRCYXVkUmF0ZVByZXNjYWxlcihTUElfVHlwZURlZiAqU1BJeCwgdWludDMyX3QgQmF1ZFJhdGUpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IxLCBTUElfQ1IxX0JSLCBCYXVkUmF0ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGJhdWQgcmF0ZSBwcmVzY2FsZXIKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBCUiAgICAgICAgICAgIExMX1NQSV9HZXRCYXVkUmF0ZVByZXNjYWxlcgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVYyNTYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0QmF1ZFJhdGVQcmVzY2FsZXIoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9CUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0cmFuc2ZlciBiaXQgb3JkZXIKKyAgKiBAbm90ZSAgIFRoaXMgYml0IHNob3VsZCBub3QgYmUgY2hhbmdlZCB3aGVuIGNvbW11bmljYXRpb24gaXMgb25nb2luZy4gVGhpcyBiaXQgaXMgbm90IHVzZWQgaW4gU1BJIFRJIG1vZGUuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTFNCRklSU1QgICAgICBMTF9TUElfU2V0VHJhbnNmZXJCaXRPcmRlcgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEJpdE9yZGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0xTQl9GSVJTVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9NU0JfRklSU1QKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRUcmFuc2ZlckJpdE9yZGVyKFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBCaXRPcmRlcikKK3sKKyAgTU9ESUZZX1JFRyhTUEl4LT5DUjEsIFNQSV9DUjFfTFNCRklSU1QsIEJpdE9yZGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdHJhbnNmZXIgYml0IG9yZGVyCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTFNCRklSU1QgICAgICBMTF9TUElfR2V0VHJhbnNmZXJCaXRPcmRlcgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0xTQl9GSVJTVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9NU0JfRklSU1QKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0VHJhbnNmZXJCaXRPcmRlcihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX0xTQkZJUlNUKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRyYW5zZmVyIGRpcmVjdGlvbiBtb2RlCisgICogQG5vdGUgICBGb3IgSGFsZi1EdXBsZXggbW9kZSwgUnggRGlyZWN0aW9uIGlzIHNldCBieSBkZWZhdWx0LgorICAqICAgICAgICAgSW4gbWFzdGVyIG1vZGUsIHRoZSBNT1NJIHBpbiBpcyB1c2VkIGFuZCBpbiBzbGF2ZSBtb2RlLCB0aGUgTUlTTyBwaW4gaXMgdXNlZCBmb3IgSGFsZi1EdXBsZXguCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUlhPTkxZICAgICAgICBMTF9TUElfU2V0VHJhbnNmZXJEaXJlY3Rpb25cbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIEJJRElNT0RFICAgICAgTExfU1BJX1NldFRyYW5zZmVyRGlyZWN0aW9uXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBCSURJT0UgICAgICAgIExMX1NQSV9TZXRUcmFuc2ZlckRpcmVjdGlvbgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRyYW5zZmVyRGlyZWN0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0ZVTExfRFVQTEVYCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1NJTVBMRVhfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfSEFMRl9EVVBMRVhfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfSEFMRl9EVVBMRVhfVFgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRUcmFuc2ZlckRpcmVjdGlvbihTUElfVHlwZURlZiAqU1BJeCwgdWludDMyX3QgVHJhbnNmZXJEaXJlY3Rpb24pCit7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IxLCBTUElfQ1IxX1JYT05MWSB8IFNQSV9DUjFfQklESU1PREUgfCBTUElfQ1IxX0JJRElPRSwgVHJhbnNmZXJEaXJlY3Rpb24pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0cmFuc2ZlciBkaXJlY3Rpb24gbW9kZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJYT05MWSAgICAgICAgTExfU1BJX0dldFRyYW5zZmVyRGlyZWN0aW9uXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBCSURJTU9ERSAgICAgIExMX1NQSV9HZXRUcmFuc2ZlckRpcmVjdGlvblxuCisgICogICAgICAgICBDUjEgICAgICAgICAgQklESU9FICAgICAgICBMTF9TUElfR2V0VHJhbnNmZXJEaXJlY3Rpb24KKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9GVUxMX0RVUExFWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9TSU1QTEVYX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0hBTEZfRFVQTEVYX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0hBTEZfRFVQTEVYX1RYCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldFRyYW5zZmVyRGlyZWN0aW9uKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5DUjEsIFNQSV9DUjFfUlhPTkxZIHwgU1BJX0NSMV9CSURJTU9ERSB8IFNQSV9DUjFfQklESU9FKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGZyYW1lIGRhdGEgd2lkdGgKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBEUyAgICAgICAgICAgIExMX1NQSV9TZXREYXRhV2lkdGgKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHBhcmFtICBEYXRhV2lkdGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzRCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzVCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzZCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzdCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzhCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzlCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzEwQklUCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF8xMUJJVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9EQVRBV0lEVEhfMTJCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzEzQklUCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF8xNEJJVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9EQVRBV0lEVEhfMTVCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzE2QklUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfU2V0RGF0YVdpZHRoKFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBEYXRhV2lkdGgpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IyLCBTUElfQ1IyX0RTLCBEYXRhV2lkdGgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBmcmFtZSBkYXRhIHdpZHRoCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgRFMgICAgICAgICAgICBMTF9TUElfR2V0RGF0YVdpZHRoCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzRCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzVCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzZCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzdCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzhCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzlCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzEwQklUCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF8xMUJJVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9EQVRBV0lEVEhfMTJCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzEzQklUCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF8xNEJJVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9EQVRBV0lEVEhfMTVCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzE2QklUCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldERhdGFXaWR0aChTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX0RTKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRocmVzaG9sZCBvZiBSWEZJRk8gdGhhdCB0cmlnZ2VycyBhbiBSWE5FIGV2ZW50CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgRlJYVEggICAgICAgICBMTF9TUElfU2V0UnhGSUZPVGhyZXNob2xkCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEBwYXJhbSAgVGhyZXNob2xkIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1JYX0ZJRk9fVEhfSEFMRgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9SWF9GSUZPX1RIX1FVQVJURVIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRSeEZJRk9UaHJlc2hvbGQoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IFRocmVzaG9sZCkKK3sKKyAgTU9ESUZZX1JFRyhTUEl4LT5DUjIsIFNQSV9DUjJfRlJYVEgsIFRocmVzaG9sZCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRocmVzaG9sZCBvZiBSWEZJRk8gdGhhdCB0cmlnZ2VycyBhbiBSWE5FIGV2ZW50CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgRlJYVEggICAgICAgICBMTF9TUElfR2V0UnhGSUZPVGhyZXNob2xkCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUlhfRklGT19USF9IQUxGCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1JYX0ZJRk9fVEhfUVVBUlRFUgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9HZXRSeEZJRk9UaHJlc2hvbGQoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9GUlhUSCkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FRl9DUkNfTWFuYWdlbWVudCBDUkMgTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIENSQworICAqIEBub3RlICAgVGhpcyBiaXQgc2hvdWxkIGJlIHdyaXR0ZW4gb25seSB3aGVuIFNQSSBpcyBkaXNhYmxlZCAoU1BFID0gMCkgZm9yIGNvcnJlY3Qgb3BlcmF0aW9uLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIENSQ0VOICAgICAgICAgTExfU1BJX0VuYWJsZUNSQworICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9FbmFibGVDUkMoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIFNFVF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX0NSQ0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIENSQworICAqIEBub3RlICAgVGhpcyBiaXQgc2hvdWxkIGJlIHdyaXR0ZW4gb25seSB3aGVuIFNQSSBpcyBkaXNhYmxlZCAoU1BFID0gMCkgZm9yIGNvcnJlY3Qgb3BlcmF0aW9uLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIENSQ0VOICAgICAgICAgTExfU1BJX0Rpc2FibGVDUkMKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRGlzYWJsZUNSQyhTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgQ0xFQVJfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9DUkNFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgQ1JDIGlzIGVuYWJsZWQKKyAgKiBAbm90ZSAgIFRoaXMgYml0IHNob3VsZCBiZSB3cml0dGVuIG9ubHkgd2hlbiBTUEkgaXMgZGlzYWJsZWQgKFNQRSA9IDApIGZvciBjb3JyZWN0IG9wZXJhdGlvbi4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDUkNFTiAgICAgICAgIExMX1NQSV9Jc0VuYWJsZWRDUkMKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0lzRW5hYmxlZENSQyhTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChTUEl4LT5DUjEsIFNQSV9DUjFfQ1JDRU4pID09IChTUElfQ1IxX0NSQ0VOKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IENSQyBMZW5ndGgKKyAgKiBAbm90ZSAgIFRoaXMgYml0IHNob3VsZCBiZSB3cml0dGVuIG9ubHkgd2hlbiBTUEkgaXMgZGlzYWJsZWQgKFNQRSA9IDApIGZvciBjb3JyZWN0IG9wZXJhdGlvbi4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDUkNMICAgICAgICAgIExMX1NQSV9TZXRDUkNXaWR0aAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENSQ0xlbmd0aCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9DUkNfOEJJVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9DUkNfMTZCSVQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRDUkNXaWR0aChTUElfVHlwZURlZiAqU1BJeCwgdWludDMyX3QgQ1JDTGVuZ3RoKQoreworICBNT0RJRllfUkVHKFNQSXgtPkNSMSwgU1BJX0NSMV9DUkNMLCBDUkNMZW5ndGgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDUkMgTGVuZ3RoCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQ1JDTCAgICAgICAgICBMTF9TUElfR2V0Q1JDV2lkdGgKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9DUkNfOEJJVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9DUkNfMTZCSVQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0Q1JDV2lkdGgoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9DUkNMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IENSQ05leHQgdG8gdHJhbnNmZXIgQ1JDIG9uIHRoZSBsaW5lCisgICogQG5vdGUgICBUaGlzIGJpdCBoYXMgdG8gYmUgd3JpdHRlbiBhcyBzb29uIGFzIHRoZSBsYXN0IGRhdGEgaXMgd3JpdHRlbiBpbiB0aGUgU1BJeF9EUiByZWdpc3Rlci4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDUkNORVhUICAgICAgIExMX1NQSV9TZXRDUkNOZXh0CisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1NldENSQ05leHQoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIFNFVF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX0NSQ05FWFQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBwb2x5bm9taWFsIGZvciBDUkMgY2FsY3VsYXRpb24KKyAgKiBAcm10b2xsIENSQ1BSICAgICAgICBDUkNQT0xZICAgICAgIExMX1NQSV9TZXRDUkNQb2x5bm9taWFsCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ1JDUG9seSBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1NldENSQ1BvbHlub21pYWwoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IENSQ1BvbHkpCit7CisgIFdSSVRFX1JFRyhTUEl4LT5DUkNQUiwgKHVpbnQxNl90KUNSQ1BvbHkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBwb2x5bm9taWFsIGZvciBDUkMgY2FsY3VsYXRpb24KKyAgKiBAcm10b2xsIENSQ1BSICAgICAgICBDUkNQT0xZICAgICAgIExMX1NQSV9HZXRDUkNQb2x5bm9taWFsCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgaXMgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHhGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldENSQ1BvbHlub21pYWwoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFNQSXgtPkNSQ1BSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFJ4IENSQworICAqIEBybXRvbGwgUlhDUkNSICAgICAgIFJYQ1JDICAgICAgICAgTExfU1BJX0dldFJ4Q1JDCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgaXMgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHhGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldFJ4Q1JDKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhTUEl4LT5SWENSQ1IpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgVHggQ1JDCisgICogQHJtdG9sbCBUWENSQ1IgICAgICAgVFhDUkMgICAgICAgICBMTF9TUElfR2V0VHhDUkMKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBpcyBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweEZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0VHhDUkMoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFNQSXgtPlRYQ1JDUikpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FRl9OU1NfTWFuYWdlbWVudCBTbGF2ZSBTZWxlY3QgUGluIE1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBOU1MgbW9kZQorICAqIEBub3RlICAgTExfU1BJX05TU19TT0ZUIE1vZGUgaXMgbm90IHVzZWQgaW4gU1BJIFRJIG1vZGUuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgU1NNICAgICAgICAgICBMTF9TUElfU2V0TlNTTW9kZVxuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgU1NPRSAgICAgICAgICBMTF9TUElfU2V0TlNTTW9kZQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIE5TUyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9OU1NfU09GVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9OU1NfSEFSRF9JTlBVVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9OU1NfSEFSRF9PVVRQVVQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXROU1NNb2RlKFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBOU1MpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IxLCBTUElfQ1IxX1NTTSwgIE5TUyk7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IyLCBTUElfQ1IyX1NTT0UsICgodWludDMyX3QpKE5TUyA+PiAxNlUpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IE5TUyBtb2RlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgU1NNICAgICAgICAgICBMTF9TUElfR2V0TlNTTW9kZVxuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgU1NPRSAgICAgICAgICBMTF9TUElfR2V0TlNTTW9kZQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX05TU19TT0ZUCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX05TU19IQVJEX0lOUFVUCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX05TU19IQVJEX09VVFBVVAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9HZXROU1NNb2RlKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZWdpc3RlciB1aW50MzJfdCBTc20gID0gKFJFQURfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9TU00pKTsKKyAgcmVnaXN0ZXIgdWludDMyX3QgU3NvZSA9IChSRUFEX0JJVChTUEl4LT5DUjIsICBTUElfQ1IyX1NTT0UpIDw8IDE2VSk7CisgIHJldHVybiAoU3NtIHwgU3NvZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIE5TUyBwdWxzZSBtYW5hZ2VtZW50CisgICogQG5vdGUgICBUaGlzIGJpdCBzaG91bGQgbm90IGJlIGNoYW5nZWQgd2hlbiBjb21tdW5pY2F0aW9uIGlzIG9uZ29pbmcuIFRoaXMgYml0IGlzIG5vdCB1c2VkIGluIFNQSSBUSSBtb2RlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIE5TU1AgICAgICAgICAgTExfU1BJX0VuYWJsZU5TU1B1bHNlTWd0CisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0VuYWJsZU5TU1B1bHNlTWd0KFNQSV9UeXBlRGVmICpTUEl4KQoreworICBTRVRfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9OU1NQKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIE5TUyBwdWxzZSBtYW5hZ2VtZW50CisgICogQG5vdGUgICBUaGlzIGJpdCBzaG91bGQgbm90IGJlIGNoYW5nZWQgd2hlbiBjb21tdW5pY2F0aW9uIGlzIG9uZ29pbmcuIFRoaXMgYml0IGlzIG5vdCB1c2VkIGluIFNQSSBUSSBtb2RlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIE5TU1AgICAgICAgICAgTExfU1BJX0Rpc2FibGVOU1NQdWxzZU1ndAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9EaXNhYmxlTlNTUHVsc2VNZ3QoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIENMRUFSX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfTlNTUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgTlNTIHB1bHNlIGlzIGVuYWJsZWQKKyAgKiBAbm90ZSAgIFRoaXMgYml0IHNob3VsZCBub3QgYmUgY2hhbmdlZCB3aGVuIGNvbW11bmljYXRpb24gaXMgb25nb2luZy4gVGhpcyBiaXQgaXMgbm90IHVzZWQgaW4gU1BJIFRJIG1vZGUuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTlNTUCAgICAgICAgICBMTF9TUElfSXNFbmFibGVkTlNTUHVsc2UKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0lzRW5hYmxlZE5TU1B1bHNlKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKFJFQURfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9OU1NQKSA9PSAoU1BJX0NSMl9OU1NQKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VGX0ZMQUdfTWFuYWdlbWVudCBGTEFHIE1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFJ4IGJ1ZmZlciBpcyBub3QgZW1wdHkKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBSWE5FICAgICAgICAgIExMX1NQSV9Jc0FjdGl2ZUZsYWdfUlhORQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNBY3RpdmVGbGFnX1JYTkUoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoU1BJeC0+U1IsIFNQSV9TUl9SWE5FKSA9PSAoU1BJX1NSX1JYTkUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUeCBidWZmZXIgaXMgZW1wdHkKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBUWEUgICAgICAgICAgIExMX1NQSV9Jc0FjdGl2ZUZsYWdfVFhFCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0FjdGl2ZUZsYWdfVFhFKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKFJFQURfQklUKFNQSXgtPlNSLCBTUElfU1JfVFhFKSA9PSAoU1BJX1NSX1RYRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDUkMgZXJyb3IgZmxhZworICAqIEBybXRvbGwgU1IgICAgICAgICAgIENSQ0VSUiAgICAgICAgTExfU1BJX0lzQWN0aXZlRmxhZ19DUkNFUlIKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0lzQWN0aXZlRmxhZ19DUkNFUlIoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoU1BJeC0+U1IsIFNQSV9TUl9DUkNFUlIpID09IChTUElfU1JfQ1JDRVJSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IG1vZGUgZmF1bHQgZXJyb3IgZmxhZworICAqIEBybXRvbGwgU1IgICAgICAgICAgIE1PREYgICAgICAgICAgTExfU1BJX0lzQWN0aXZlRmxhZ19NT0RGCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0FjdGl2ZUZsYWdfTU9ERihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChTUEl4LT5TUiwgU1BJX1NSX01PREYpID09IChTUElfU1JfTU9ERikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBvdmVycnVuIGVycm9yIGZsYWcKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBPVlIgICAgICAgICAgIExMX1NQSV9Jc0FjdGl2ZUZsYWdfT1ZSCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0FjdGl2ZUZsYWdfT1ZSKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKFJFQURfQklUKFNQSXgtPlNSLCBTUElfU1JfT1ZSKSA9PSAoU1BJX1NSX09WUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBidXN5IGZsYWcKKyAgKiBAbm90ZSAgIFRoZSBCU1kgZmxhZyBpcyBjbGVhcmVkIHVuZGVyIGFueSBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICAqIC1XaGVuIHRoZSBTUEkgaXMgY29ycmVjdGx5IGRpc2FibGVkCisgICogLVdoZW4gYSBmYXVsdCBpcyBkZXRlY3RlZCBpbiBNYXN0ZXIgbW9kZSAoTU9ERiBiaXQgc2V0IHRvIDEpCisgICogLUluIE1hc3RlciBtb2RlLCB3aGVuIGl0IGZpbmlzaGVzIGEgZGF0YSB0cmFuc21pc3Npb24gYW5kIG5vIG5ldyBkYXRhIGlzIHJlYWR5IHRvIGJlCisgICogc2VudAorICAqIC1JbiBTbGF2ZSBtb2RlLCB3aGVuIHRoZSBCU1kgZmxhZyBpcyBzZXQgdG8gJzAnIGZvciBhdCBsZWFzdCBvbmUgU1BJIGNsb2NrIGN5Y2xlIGJldHdlZW4KKyAgKiBlYWNoIGRhdGEgdHJhbnNmZXIuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQlNZICAgICAgICAgICBMTF9TUElfSXNBY3RpdmVGbGFnX0JTWQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNBY3RpdmVGbGFnX0JTWShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChTUEl4LT5TUiwgU1BJX1NSX0JTWSkgPT0gKFNQSV9TUl9CU1kpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZnJhbWUgZm9ybWF0IGVycm9yIGZsYWcKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBGUkUgICAgICAgICAgIExMX1NQSV9Jc0FjdGl2ZUZsYWdfRlJFCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0FjdGl2ZUZsYWdfRlJFKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKFJFQURfQklUKFNQSXgtPlNSLCBTUElfU1JfRlJFKSA9PSAoU1BJX1NSX0ZSRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBGSUZPIHJlY2VwdGlvbiBMZXZlbAorICAqIEBybXRvbGwgU1IgICAgICAgICAgIEZSTFZMICAgICAgICAgTExfU1BJX0dldFJ4RklGT0xldmVsCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUlhfRklGT19FTVBUWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9SWF9GSUZPX1FVQVJURVJfRlVMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9SWF9GSUZPX0hBTEZfRlVMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9SWF9GSUZPX0ZVTEwKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0UnhGSUZPTGV2ZWwoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPlNSLCBTUElfU1JfRlJMVkwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgRklGTyBUcmFuc21pc3Npb24gTGV2ZWwKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBGVExWTCAgICAgICAgIExMX1NQSV9HZXRUeEZJRk9MZXZlbAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1RYX0ZJRk9fRU1QVFkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfVFhfRklGT19RVUFSVEVSX0ZVTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfVFhfRklGT19IQUxGX0ZVTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfVFhfRklGT19GVUxMCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldFR4RklGT0xldmVsKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5TUiwgU1BJX1NSX0ZUTFZMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ1JDIGVycm9yIGZsYWcKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDUkNFUlIgICAgICAgIExMX1NQSV9DbGVhckZsYWdfQ1JDRVJSCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0NsZWFyRmxhZ19DUkNFUlIoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIENMRUFSX0JJVChTUEl4LT5TUiwgU1BJX1NSX0NSQ0VSUik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgbW9kZSBmYXVsdCBlcnJvciBmbGFnCisgICogQG5vdGUgICBDbGVhcmluZyB0aGlzIGZsYWcgaXMgZG9uZSBieSBhIHJlYWQgYWNjZXNzIHRvIHRoZSBTUEl4X1NSCisgICogICAgICAgICByZWdpc3RlciBmb2xsb3dlZCBieSBhIHdyaXRlIGFjY2VzcyB0byB0aGUgU1BJeF9DUjEgcmVnaXN0ZXIKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBNT0RGICAgICAgICAgIExMX1NQSV9DbGVhckZsYWdfTU9ERgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9DbGVhckZsYWdfTU9ERihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgX19JTyB1aW50MzJfdCB0bXByZWc7CisgIHRtcHJlZyA9IFNQSXgtPlNSOworICAodm9pZCkgdG1wcmVnOworICB0bXByZWcgPSBDTEVBUl9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX1NQRSk7CisgICh2b2lkKSB0bXByZWc7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgb3ZlcnJ1biBlcnJvciBmbGFnCisgICogQG5vdGUgICBDbGVhcmluZyB0aGlzIGZsYWcgaXMgZG9uZSBieSBhIHJlYWQgYWNjZXNzIHRvIHRoZSBTUEl4X0RSCisgICogICAgICAgICByZWdpc3RlciBmb2xsb3dlZCBieSBhIHJlYWQgYWNjZXNzIHRvIHRoZSBTUEl4X1NSIHJlZ2lzdGVyCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgT1ZSICAgICAgICAgICBMTF9TUElfQ2xlYXJGbGFnX09WUgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9DbGVhckZsYWdfT1ZSKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKyAgdG1wcmVnID0gU1BJeC0+RFI7CisgICh2b2lkKSB0bXByZWc7CisgIHRtcHJlZyA9IFNQSXgtPlNSOworICAodm9pZCkgdG1wcmVnOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIGZyYW1lIGZvcm1hdCBlcnJvciBmbGFnCisgICogQG5vdGUgICBDbGVhcmluZyB0aGlzIGZsYWcgaXMgZG9uZSBieSByZWFkaW5nIFNQSXhfU1IgcmVnaXN0ZXIKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBGUkUgICAgICAgICAgIExMX1NQSV9DbGVhckZsYWdfRlJFCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0NsZWFyRmxhZ19GUkUoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICB0bXByZWcgPSBTUEl4LT5TUjsKKyAgKHZvaWQpIHRtcHJlZzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUZfSVRfTWFuYWdlbWVudCBJbnRlcnJ1cHQgTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGVycm9yIGludGVycnVwdAorICAqIEBub3RlICAgVGhpcyBiaXQgY29udHJvbHMgdGhlIGdlbmVyYXRpb24gb2YgYW4gaW50ZXJydXB0IHdoZW4gYW4gZXJyb3IgY29uZGl0aW9uIG9jY3VycyAoQ1JDRVJSLCBPVlIsIE1PREYgaW4gU1BJIG1vZGUsIEZSRSBhdCBUSSBtb2RlKS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBFUlJJRSAgICAgICAgIExMX1NQSV9FbmFibGVJVF9FUlIKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRW5hYmxlSVRfRVJSKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBTRVRfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9FUlJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFJ4IGJ1ZmZlciBub3QgZW1wdHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhORUlFICAgICAgICBMTF9TUElfRW5hYmxlSVRfUlhORQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9FbmFibGVJVF9SWE5FKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBTRVRfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9SWE5FSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhFSUUgICAgICAgICBMTF9TUElfRW5hYmxlSVRfVFhFCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0VuYWJsZUlUX1RYRShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgU0VUX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfVFhFSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgZXJyb3IgaW50ZXJydXB0CisgICogQG5vdGUgICBUaGlzIGJpdCBjb250cm9scyB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBpbnRlcnJ1cHQgd2hlbiBhbiBlcnJvciBjb25kaXRpb24gb2NjdXJzIChDUkNFUlIsIE9WUiwgTU9ERiBpbiBTUEkgbW9kZSwgRlJFIGF0IFRJIG1vZGUpLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEVSUklFICAgICAgICAgTExfU1BJX0Rpc2FibGVJVF9FUlIKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRGlzYWJsZUlUX0VSUihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgQ0xFQVJfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9FUlJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSeCBidWZmZXIgbm90IGVtcHR5IGludGVycnVwdAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYTkVJRSAgICAgICAgTExfU1BJX0Rpc2FibGVJVF9SWE5FCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0Rpc2FibGVJVF9SWE5FKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBDTEVBUl9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX1JYTkVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhFSUUgICAgICAgICBMTF9TUElfRGlzYWJsZUlUX1RYRQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9EaXNhYmxlSVRfVFhFKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBDTEVBUl9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX1RYRUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBlcnJvciBpbnRlcnJ1cHQgaXMgZW5hYmxlZAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEVSUklFICAgICAgICAgTExfU1BJX0lzRW5hYmxlZElUX0VSUgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNFbmFibGVkSVRfRVJSKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKFJFQURfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9FUlJJRSkgPT0gKFNQSV9DUjJfRVJSSUUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSeCBidWZmZXIgbm90IGVtcHR5IGludGVycnVwdCBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhORUlFICAgICAgICBMTF9TUElfSXNFbmFibGVkSVRfUlhORQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNFbmFibGVkSVRfUlhORShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfUlhORUlFKSA9PSAoU1BJX0NSMl9SWE5FSUUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhFSUUgICAgICAgICBMTF9TUElfSXNFbmFibGVkSVRfVFhFCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0VuYWJsZWRJVF9UWEUoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX1RYRUlFKSA9PSAoU1BJX0NSMl9UWEVJRSkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FRl9ETUFfTWFuYWdlbWVudCBETUEgTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERNQSBSeAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYRE1BRU4gICAgICAgTExfU1BJX0VuYWJsZURNQVJlcV9SWAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9FbmFibGVETUFSZXFfUlgoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIFNFVF9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX1JYRE1BRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRE1BIFJ4CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhETUFFTiAgICAgICBMTF9TUElfRGlzYWJsZURNQVJlcV9SWAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9EaXNhYmxlRE1BUmVxX1JYKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBDTEVBUl9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX1JYRE1BRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIERNQSBSeCBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhETUFFTiAgICAgICBMTF9TUElfSXNFbmFibGVkRE1BUmVxX1JYCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0VuYWJsZWRETUFSZXFfUlgoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX1JYRE1BRU4pID09IChTUElfQ1IyX1JYRE1BRU4pKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRE1BIFR4CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhETUFFTiAgICAgICBMTF9TUElfRW5hYmxlRE1BUmVxX1RYCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0VuYWJsZURNQVJlcV9UWChTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgU0VUX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfVFhETUFFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBETUEgVHgKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBUWERNQUVOICAgICAgIExMX1NQSV9EaXNhYmxlRE1BUmVxX1RYCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0Rpc2FibGVETUFSZXFfVFgoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIENMRUFSX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfVFhETUFFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgRE1BIFR4IGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBUWERNQUVOICAgICAgIExMX1NQSV9Jc0VuYWJsZWRETUFSZXFfVFgKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0lzRW5hYmxlZERNQVJlcV9UWChTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfVFhETUFFTikgPT0gKFNQSV9DUjJfVFhETUFFTikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBwYXJpdHkgb2YgIExhc3QgRE1BIHJlY2VwdGlvbgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIExETUFSWCAgICAgICAgTExfU1BJX1NldERNQVBhcml0eV9SWAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9ETUFfUEFSSVRZX09ERAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9ETUFfUEFSSVRZX0VWRU4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRETUFQYXJpdHlfUlgoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IFBhcml0eSkKK3sKKyAgTU9ESUZZX1JFRyhTUEl4LT5DUjIsIFNQSV9DUjJfTERNQVJYLCAoUGFyaXR5IDw8IFNQSV9DUjJfTERNQVJYX1BvcykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBwYXJpdHkgY29uZmlndXJhdGlvbiBmb3IgIExhc3QgRE1BIHJlY2VwdGlvbgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIExETUFSWCAgICAgICAgTExfU1BJX0dldERNQVBhcml0eV9SWAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RNQV9QQVJJVFlfT0RECisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RNQV9QQVJJVFlfRVZFTgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9HZXRETUFQYXJpdHlfUlgoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9MRE1BUlgpID4+IFNQSV9DUjJfTERNQVJYX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHBhcml0eSBvZiAgTGFzdCBETUEgdHJhbnNtaXNzaW9uCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTERNQVRYICAgICAgICBMTF9TUElfU2V0RE1BUGFyaXR5X1RYCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEBwYXJhbSAgUGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RNQV9QQVJJVFlfT0RECisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RNQV9QQVJJVFlfRVZFTgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1NldERNQVBhcml0eV9UWChTUElfVHlwZURlZiAqU1BJeCwgdWludDMyX3QgUGFyaXR5KQoreworICBNT0RJRllfUkVHKFNQSXgtPkNSMiwgU1BJX0NSMl9MRE1BVFgsIChQYXJpdHkgPDwgU1BJX0NSMl9MRE1BVFhfUG9zKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHBhcml0eSBjb25maWd1cmF0aW9uIGZvciBMYXN0IERNQSB0cmFuc21pc3Npb24KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMRE1BVFggICAgICAgIExMX1NQSV9HZXRETUFQYXJpdHlfVFgKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9ETUFfUEFSSVRZX09ERAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9ETUFfUEFSSVRZX0VWRU4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0RE1BUGFyaXR5X1RYKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfTERNQVRYKSA+PiBTUElfQ1IyX0xETUFUWF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgZGF0YSByZWdpc3RlciBhZGRyZXNzIHVzZWQgZm9yIERNQSB0cmFuc2ZlcgorICAqIEBybXRvbGwgRFIgICAgICAgICAgIERSICAgICAgICAgICAgTExfU1BJX0RNQV9HZXRSZWdBZGRyCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgQWRkcmVzcyBvZiBkYXRhIHJlZ2lzdGVyCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0RNQV9HZXRSZWdBZGRyKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKHVpbnQzMl90KSAmIChTUEl4LT5EUik7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VGX0RBVEFfTWFuYWdlbWVudCBEQVRBIE1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgOC1CaXRzIGluIHRoZSBkYXRhIHJlZ2lzdGVyCisgICogQHJtdG9sbCBEUiAgICAgICAgICAgRFIgICAgICAgICAgICBMTF9TUElfUmVjZWl2ZURhdGE4CisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgUnhEYXRhIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQ4X3QgTExfU1BJX1JlY2VpdmVEYXRhOChTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50OF90KShSRUFEX1JFRyhTUEl4LT5EUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgMTYtQml0cyBpbiB0aGUgZGF0YSByZWdpc3RlcgorICAqIEBybXRvbGwgRFIgICAgICAgICAgIERSICAgICAgICAgICAgTExfU1BJX1JlY2VpdmVEYXRhMTYKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSeERhdGEgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MTZfdCBMTF9TUElfUmVjZWl2ZURhdGExNihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MTZfdCkoUkVBRF9SRUcoU1BJeC0+RFIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBXcml0ZSA4LUJpdHMgaW4gdGhlIGRhdGEgcmVnaXN0ZXIKKyAgKiBAcm10b2xsIERSICAgICAgICAgICBEUiAgICAgICAgICAgIExMX1NQSV9UcmFuc21pdERhdGE4CisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEBwYXJhbSAgVHhEYXRhIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1RyYW5zbWl0RGF0YTgoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQ4X3QgVHhEYXRhKQoreworI2lmIGRlZmluZWQgKF9fR05VQ19fKQorICBfX0lPIHVpbnQ4X3QgKnNwaWRyID0gKChfX0lPIHVpbnQ4X3QgKikmU1BJeC0+RFIpOworICAqc3BpZHIgPSBUeERhdGE7CisjZWxzZQorICAqKChfX0lPIHVpbnQ4X3QgKikmU1BJeC0+RFIpID0gVHhEYXRhOworI2VuZGlmCit9CisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgMTYtQml0cyBpbiB0aGUgZGF0YSByZWdpc3RlcgorICAqIEBybXRvbGwgRFIgICAgICAgICAgIERSICAgICAgICAgICAgTExfU1BJX1RyYW5zbWl0RGF0YTE2CisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEBwYXJhbSAgVHhEYXRhIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfVHJhbnNtaXREYXRhMTYoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQxNl90IFR4RGF0YSkKK3sKKyNpZiBkZWZpbmVkIChfX0dOVUNfXykKKyAgX19JTyB1aW50MTZfdCAqc3BpZHIgPSAoKF9fSU8gdWludDE2X3QgKikmU1BJeC0+RFIpOworICAqc3BpZHIgPSBUeERhdGE7CisjZWxzZQorICAqKChfX0lPIHVpbnQxNl90ICopJlNQSXgtPkRSKSA9IFR4RGF0YTsKKyNlbmRpZgorfQorCisvKioKKyAgKiBAfQorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBTUElfTExfRUZfSW5pdCBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworRXJyb3JTdGF0dXMgTExfU1BJX0RlSW5pdChTUElfVHlwZURlZiAqU1BJeCk7CitFcnJvclN0YXR1cyBMTF9TUElfSW5pdChTUElfVHlwZURlZiAqU1BJeCwgTExfU1BJX0luaXRUeXBlRGVmICpTUElfSW5pdFN0cnVjdCk7Cit2b2lkICAgICAgICBMTF9TUElfU3RydWN0SW5pdChMTF9TUElfSW5pdFR5cGVEZWYgKlNQSV9Jbml0U3RydWN0KTsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFNQSV9JMlNfU1VQUE9SVCkKKy8qKiBAZGVmZ3JvdXAgSTJTX0xMIEkyUworICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VTX0lOSVQgSTJTIEV4cG9ydGVkIEluaXQgc3RydWN0dXJlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJMlMgSW5pdCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBNb2RlOyAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIEkyUyBvcGVyYXRpbmcgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMlNfTExfRUNfTU9ERQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfSTJTX1NldFRyYW5zZmVyTW9kZSgpLiovCisKKyAgdWludDMyX3QgU3RhbmRhcmQ7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzdGFuZGFyZCB1c2VkIGZvciB0aGUgSTJTIGNvbW11bmljYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJTX0xMX0VDX1NUQU5EQVJECisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9JMlNfU2V0U3RhbmRhcmQoKS4qLworCisKKyAgdWludDMyX3QgRGF0YUZvcm1hdDsgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBkYXRhIGZvcm1hdCBmb3IgdGhlIEkyUyBjb21tdW5pY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyU19MTF9FQ19EQVRBX0ZPUk1BVAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfSTJTX1NldERhdGFGb3JtYXQoKS4qLworCisKKyAgdWludDMyX3QgTUNMS091dHB1dDsgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIEkyUyBNQ0xLIG91dHB1dCBpcyBlbmFibGVkIG9yIG5vdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMlNfTExfRUNfTUNMS19PVVRQVVQKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbnMgQHJlZiBMTF9JMlNfRW5hYmxlTWFzdGVyQ2xvY2soKSBvciBAcmVmIExMX0kyU19EaXNhYmxlTWFzdGVyQ2xvY2suKi8KKworCisgIHVpbnQzMl90IEF1ZGlvRnJlcTsgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZnJlcXVlbmN5IHNlbGVjdGVkIGZvciB0aGUgSTJTIGNvbW11bmljYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJTX0xMX0VDX0FVRElPX0ZSRVEKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpbyBGcmVxdWVuY3kgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgUmVmZXJlbmNlIG1hbnVhbCBmb3JtdWxhcyB0byBjYWxjdWxhdGUgUHJlc2NhbGVyIExpbmVhciwgUGFyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB1bml0YXJ5IGZ1bmN0aW9ucyBAcmVmIExMX0kyU19TZXRQcmVzY2FsZXJMaW5lYXIoKSBhbmQgQHJlZiBMTF9JMlNfU2V0UHJlc2NhbGVyUGFyaXR5KCkgdG8gc2V0IGl0LiovCisKKworICB1aW50MzJfdCBDbG9ja1BvbGFyaXR5OyAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGlkbGUgc3RhdGUgb2YgdGhlIEkyUyBjbG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMlNfTExfRUNfUE9MQVJJVFkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0kyU19TZXRDbG9ja1BvbGFyaXR5KCkuKi8KKworfSBMTF9JMlNfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLypVU0VfRlVMTF9MTF9EUklWRVIqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJMlNfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIEkyUyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEkyU19MTF9FQ19HRVRfRkxBRyBHZXQgRmxhZ3MgRGVmaW5lcworICAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfSTJTX1JlYWRSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMlNfU1JfUlhORSAgICAgICAgICAgICAgICAgICAgIExMX1NQSV9TUl9SWE5FICAgICAgICAgICAgLyohPCBSeCBidWZmZXIgbm90IGVtcHR5IGZsYWcgICAgICAgICAqLworI2RlZmluZSBMTF9JMlNfU1JfVFhFICAgICAgICAgICAgICAgICAgICAgIExMX1NQSV9TUl9UWEUgICAgICAgICAgICAgLyohPCBUeCBidWZmZXIgZW1wdHkgZmxhZyAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMlNfU1JfQlNZICAgICAgICAgICAgICAgICAgICAgIExMX1NQSV9TUl9CU1kgICAgICAgICAgICAgLyohPCBCdXN5IGZsYWcgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMlNfU1JfVURSICAgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9VRFIgICAgICAgICAgICAgICAgLyohPCBVbmRlcnJ1biBmbGFnICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMlNfU1JfT1ZSICAgICAgICAgICAgICAgICAgICAgIExMX1NQSV9TUl9PVlIgICAgICAgICAgICAgLyohPCBPdmVycnVuIGZsYWcgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMlNfU1JfRlJFICAgICAgICAgICAgICAgICAgICAgIExMX1NQSV9TUl9GUkUgICAgICAgICAgICAgLyohPCBUSSBtb2RlIGZyYW1lIGZvcm1hdCBlcnJvciBmbGFnICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfSVQgSVQgRGVmaW5lcworICAqIEBicmllZiAgICBJVCBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfU1BJX1JlYWRSZWcgYW5kICBMTF9TUElfV3JpdGVSZWcgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJTX0NSMl9SWE5FSUUgICAgICAgICAgICAgICAgICBMTF9TUElfQ1IyX1JYTkVJRSAgICAgICAgIC8qITwgUnggYnVmZmVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX0kyU19DUjJfVFhFSUUgICAgICAgICAgICAgICAgICAgTExfU1BJX0NSMl9UWEVJRSAgICAgICAgICAvKiE8IFR4IGJ1ZmZlciBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlICAgICAqLworI2RlZmluZSBMTF9JMlNfQ1IyX0VSUklFICAgICAgICAgICAgICAgICAgIExMX1NQSV9DUjJfRVJSSUUgICAgICAgICAgLyohPCBFcnJvciBpbnRlcnJ1cHQgZW5hYmxlICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VDX0RBVEFfRk9STUFUIERhdGEgZm9ybWF0CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJTX0RBVEFGT1JNQVRfMTZCICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEYXRhIGxlbmd0aCAxNiBiaXRzLCBDaGFubmVsIGxlbmdodCAxNmJpdCAqLworI2RlZmluZSBMTF9JMlNfREFUQUZPUk1BVF8xNkJfRVhURU5ERUQgICAgIChTUElfSTJTQ0ZHUl9DSExFTikgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERhdGEgbGVuZ3RoIDE2IGJpdHMsIENoYW5uZWwgbGVuZ2h0IDMyYml0ICovCisjZGVmaW5lIExMX0kyU19EQVRBRk9STUFUXzI0QiAgICAgICAgICAgICAgKFNQSV9JMlNDRkdSX0NITEVOIHwgU1BJX0kyU0NGR1JfREFUTEVOXzApICAgIC8qITwgRGF0YSBsZW5ndGggMjQgYml0cywgQ2hhbm5lbCBsZW5naHQgMzJiaXQgKi8KKyNkZWZpbmUgTExfSTJTX0RBVEFGT1JNQVRfMzJCICAgICAgICAgICAgICAoU1BJX0kyU0NGR1JfQ0hMRU4gfCBTUElfSTJTQ0ZHUl9EQVRMRU5fMSkgICAgLyohPCBEYXRhIGxlbmd0aCAxNiBiaXRzLCBDaGFubmVsIGxlbmdodCAzMmJpdCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfTExfRUNfUE9MQVJJVFkgQ2xvY2sgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMlNfUE9MQVJJVFlfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgLyohPCBDbG9jayBzdGVhZHkgc3RhdGUgaXMgbG93IGxldmVsICAqLworI2RlZmluZSBMTF9JMlNfUE9MQVJJVFlfSElHSCAgICAgICAgICAgICAgIChTUElfSTJTQ0ZHUl9DS1BPTCkgICAgICAgLyohPCBDbG9jayBzdGVhZHkgc3RhdGUgaXMgaGlnaCBsZXZlbCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfTExfRUNfU1RBTkRBUkQgSTJzIFN0YW5kYXJkCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJTX1NUQU5EQVJEX1BISUxJUFMgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSTJTIHN0YW5kYXJkIHBoaWxpcHMgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX1NUQU5EQVJEX01TQiAgICAgICAgICAgICAgICAoU1BJX0kyU0NGR1JfSTJTU1REXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTVNCIGp1c3RpZmllZCBzdGFuZGFyZCAobGVmdCBqdXN0aWZpZWQpICAgKi8KKyNkZWZpbmUgTExfSTJTX1NUQU5EQVJEX0xTQiAgICAgICAgICAgICAgICAoU1BJX0kyU0NGR1JfSTJTU1REXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTFNCIGp1c3RpZmllZCBzdGFuZGFyZCAocmlnaHQganVzdGlmaWVkKSAgKi8KKyNkZWZpbmUgTExfSTJTX1NUQU5EQVJEX1BDTV9TSE9SVCAgICAgICAgICAoU1BJX0kyU0NGR1JfSTJTU1REXzAgfCBTUElfSTJTQ0ZHUl9JMlNTVERfMSkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUENNIHN0YW5kYXJkLCBzaG9ydCBmcmFtZSBzeW5jaHJvbml6YXRpb24gKi8KKyNkZWZpbmUgTExfSTJTX1NUQU5EQVJEX1BDTV9MT05HICAgICAgICAgICAoU1BJX0kyU0NGR1JfSTJTU1REXzAgfCBTUElfSTJTQ0ZHUl9JMlNTVERfMSB8IFNQSV9JMlNDRkdSX1BDTVNZTkMpIC8qITwgUENNIHN0YW5kYXJkLCBsb25nIGZyYW1lIHN5bmNocm9uaXphdGlvbiAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VDX01PREUgT3BlcmF0aW9uIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMlNfTU9ERV9TTEFWRV9UWCAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNsYXZlIFR4IGNvbmZpZ3VyYXRpb24gICovCisjZGVmaW5lIExMX0kyU19NT0RFX1NMQVZFX1JYICAgICAgICAgICAgICAgKFNQSV9JMlNDRkdSX0kyU0NGR18wKSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU2xhdmUgUnggY29uZmlndXJhdGlvbiAgKi8KKyNkZWZpbmUgTExfSTJTX01PREVfTUFTVEVSX1RYICAgICAgICAgICAgICAoU1BJX0kyU0NGR1JfSTJTQ0ZHXzEpICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYXN0ZXIgVHggY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBMTF9JMlNfTU9ERV9NQVNURVJfUlggICAgICAgICAgICAgIChTUElfSTJTQ0ZHUl9JMlNDRkdfMCB8IFNQSV9JMlNDRkdSX0kyU0NGR18xKSAvKiE8IE1hc3RlciBSeCBjb25maWd1cmF0aW9uICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyU19MTF9FQ19QUkVTQ0FMRVJfRkFDVE9SIFByZXNjYWxlciBGYWN0b3IKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMlNfUFJFU0NBTEVSX1BBUklUWV9FVkVOICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgLyohPCBPZGQgZmFjdG9yOiBSZWFsIGRpdmlkZXIgdmFsdWUgaXMgPSAgSTJTRElWICogMiAgICAqLworI2RlZmluZSBMTF9JMlNfUFJFU0NBTEVSX1BBUklUWV9PREQgICAgICAgIChTUElfSTJTUFJfT0REID4+IDhVKSAgICAgLyohPCBPZGQgZmFjdG9yOiBSZWFsIGRpdmlkZXIgdmFsdWUgaXMgPSAoSTJTRElWICogMikrMSAqLworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiogQGRlZmdyb3VwIEkyU19MTF9FQ19NQ0xLX09VVFBVVCBNQ0xLIE91dHB1dAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0kyU19NQ0xLX09VVFBVVF9ESVNBQkxFICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAvKiE8IE1hc3RlciBjbG9jayBvdXRwdXQgaXMgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTExfSTJTX01DTEtfT1VUUFVUX0VOQUJMRSAgICAgICAgICAoU1BJX0kyU1BSX01DS09FKSAgICAgICAgIC8qITwgTWFzdGVyIGNsb2NrIG91dHB1dCBpcyBlbmFibGVkICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfTExfRUNfQVVESU9fRlJFUSBBdWRpbyBGcmVxdWVuY3kKKyAgKiBAeworICAqLworCisjZGVmaW5lIExMX0kyU19BVURJT0ZSRVFfMTkySyAgICAgICAgICAgICAgMTkyMDAwVSAgICAgICAvKiE8IEF1ZGlvIEZyZXF1ZW5jeSBjb25maWd1cmF0aW9uIDE5MjAwMCBIeiAgICAgICAqLworI2RlZmluZSBMTF9JMlNfQVVESU9GUkVRXzk2SyAgICAgICAgICAgICAgIDk2MDAwVSAgICAgICAgLyohPCBBdWRpbyBGcmVxdWVuY3kgY29uZmlndXJhdGlvbiAgOTYwMDAgSHogICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX0FVRElPRlJFUV80OEsgICAgICAgICAgICAgICA0ODAwMFUgICAgICAgIC8qITwgQXVkaW8gRnJlcXVlbmN5IGNvbmZpZ3VyYXRpb24gIDQ4MDAwIEh6ICAgICAgICovCisjZGVmaW5lIExMX0kyU19BVURJT0ZSRVFfNDRLICAgICAgICAgICAgICAgNDQxMDBVICAgICAgICAvKiE8IEF1ZGlvIEZyZXF1ZW5jeSBjb25maWd1cmF0aW9uICA0NDEwMCBIeiAgICAgICAqLworI2RlZmluZSBMTF9JMlNfQVVESU9GUkVRXzMySyAgICAgICAgICAgICAgIDMyMDAwVSAgICAgICAgLyohPCBBdWRpbyBGcmVxdWVuY3kgY29uZmlndXJhdGlvbiAgMzIwMDAgSHogICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX0FVRElPRlJFUV8yMksgICAgICAgICAgICAgICAyMjA1MFUgICAgICAgIC8qITwgQXVkaW8gRnJlcXVlbmN5IGNvbmZpZ3VyYXRpb24gIDIyMDUwIEh6ICAgICAgICovCisjZGVmaW5lIExMX0kyU19BVURJT0ZSRVFfMTZLICAgICAgICAgICAgICAgMTYwMDBVICAgICAgICAvKiE8IEF1ZGlvIEZyZXF1ZW5jeSBjb25maWd1cmF0aW9uICAxNjAwMCBIeiAgICAgICAqLworI2RlZmluZSBMTF9JMlNfQVVESU9GUkVRXzExSyAgICAgICAgICAgICAgIDExMDI1VSAgICAgICAgLyohPCBBdWRpbyBGcmVxdWVuY3kgY29uZmlndXJhdGlvbiAgMTEwMjUgSHogICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX0FVRElPRlJFUV84SyAgICAgICAgICAgICAgICA4MDAwVSAgICAgICAgIC8qITwgQXVkaW8gRnJlcXVlbmN5IGNvbmZpZ3VyYXRpb24gICA4MDAwIEh6ICAgICAgICovCisjZGVmaW5lIExMX0kyU19BVURJT0ZSRVFfREVGQVVMVCAgICAgICAgICAgMlUgICAgICAgICAgICAvKiE8IEF1ZGlvIEZyZXEgbm90IHNwZWNpZmllZC4gUmVnaXN0ZXIgSTJTRElWID0gMiAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0V4cG9ydGVkX01hY3JvcyBJMlMgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfTExfRU1fV1JJVEVfUkVBRCBDb21tb24gV3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBJMlMgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBJMlMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIExMX0kyU19Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIEkyUyByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIEkyUyBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICAqLworI2RlZmluZSBMTF9JMlNfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBJMlNfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIEkyUyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEkyU19MTF9FRl9Db25maWd1cmF0aW9uIENvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNlbGVjdCBJMlMgbW9kZSBhbmQgRW5hYmxlIEkyUyBwZXJpcGhlcmFsCisgICogQHJtdG9sbCBJMlNDRkdSICAgICAgSTJTTU9EICAgICAgICBMTF9JMlNfRW5hYmxlXG4KKyAgKiAgICAgICAgIEkyU0NGR1IgICAgICBJMlNFICAgICAgICAgIExMX0kyU19FbmFibGUKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfRW5hYmxlKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBTRVRfQklUKFNQSXgtPkkyU0NGR1IsIFNQSV9JMlNDRkdSX0kyU01PRCB8IFNQSV9JMlNDRkdSX0kyU0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgSTJTIHBlcmlwaGVyYWwKKyAgKiBAcm10b2xsIEkyU0NGR1IgICAgICBJMlNFICAgICAgICAgIExMX0kyU19EaXNhYmxlCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0Rpc2FibGUoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIENMRUFSX0JJVChTUEl4LT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9JMlNNT0QgfCBTUElfSTJTQ0ZHUl9JMlNFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBJMlMgcGVyaXBoZXJhbCBpcyBlbmFibGVkCisgICogQHJtdG9sbCBJMlNDRkdSICAgICAgSTJTRSAgICAgICAgICBMTF9JMlNfSXNFbmFibGVkCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyU19Jc0VuYWJsZWQoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoU1BJeC0+STJTQ0ZHUiwgU1BJX0kyU0NGR1JfSTJTRSkgPT0gKFNQSV9JMlNDRkdSX0kyU0UpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgSTJTIGRhdGEgZnJhbWUgbGVuZ3RoCisgICogQHJtdG9sbCBJMlNDRkdSICAgICAgREFUTEVOICAgICAgICBMTF9JMlNfU2V0RGF0YUZvcm1hdFxuCisgICogICAgICAgICBJMlNDRkdSICAgICAgQ0hMRU4gICAgICAgICBMTF9JMlNfU2V0RGF0YUZvcm1hdAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIERhdGFGb3JtYXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfREFUQUZPUk1BVF8xNkIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfREFUQUZPUk1BVF8xNkJfRVhURU5ERUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfREFUQUZPUk1BVF8yNEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfREFUQUZPUk1BVF8zMkIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19TZXREYXRhRm9ybWF0KFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBEYXRhRm9ybWF0KQoreworICBNT0RJRllfUkVHKFNQSXgtPkkyU0NGR1IsIFNQSV9JMlNDRkdSX0RBVExFTiB8IFNQSV9JMlNDRkdSX0NITEVOLCBEYXRhRm9ybWF0KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgSTJTIGRhdGEgZnJhbWUgbGVuZ3RoCisgICogQHJtdG9sbCBJMlNDRkdSICAgICAgREFUTEVOICAgICAgICBMTF9JMlNfR2V0RGF0YUZvcm1hdFxuCisgICogICAgICAgICBJMlNDRkdSICAgICAgQ0hMRU4gICAgICAgICBMTF9JMlNfR2V0RGF0YUZvcm1hdAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX0RBVEFGT1JNQVRfMTZCCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX0RBVEFGT1JNQVRfMTZCX0VYVEVOREVECisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX0RBVEFGT1JNQVRfMjRCCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX0RBVEFGT1JNQVRfMzJCCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0dldERhdGFGb3JtYXQoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkkyU0NGR1IsIFNQSV9JMlNDRkdSX0RBVExFTiB8IFNQSV9JMlNDRkdSX0NITEVOKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEkyUyBjbG9jayBwb2xhcml0eQorICAqIEBybXRvbGwgSTJTQ0ZHUiAgICAgIENLUE9MICAgICAgICAgTExfSTJTX1NldENsb2NrUG9sYXJpdHkKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHBhcmFtICBDbG9ja1BvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1BPTEFSSVRZX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19QT0xBUklUWV9ISUdICisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfU2V0Q2xvY2tQb2xhcml0eShTUElfVHlwZURlZiAqU1BJeCwgdWludDMyX3QgQ2xvY2tQb2xhcml0eSkKK3sKKyAgU0VUX0JJVChTUEl4LT5JMlNDRkdSLCBDbG9ja1BvbGFyaXR5KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgSTJTIGNsb2NrIHBvbGFyaXR5CisgICogQHJtdG9sbCBJMlNDRkdSICAgICAgQ0tQT0wgICAgICAgICBMTF9JMlNfR2V0Q2xvY2tQb2xhcml0eQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1BPTEFSSVRZX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19QT0xBUklUWV9ISUdICisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0dldENsb2NrUG9sYXJpdHkoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkkyU0NGR1IsIFNQSV9JMlNDRkdSX0NLUE9MKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEkyUyBzdGFuZGFyZCBwcm90b2NvbAorICAqIEBybXRvbGwgSTJTQ0ZHUiAgICAgIEkyU1NURCAgICAgICAgTExfSTJTX1NldFN0YW5kYXJkXG4KKyAgKiAgICAgICAgIEkyU0NGR1IgICAgICBQQ01TWU5DICAgICAgIExMX0kyU19TZXRTdGFuZGFyZAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFN0YW5kYXJkIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1NUQU5EQVJEX1BISUxJUFMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfU1RBTkRBUkRfTVNCCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1NUQU5EQVJEX0xTQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19TVEFOREFSRF9QQ01fU0hPUlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfU1RBTkRBUkRfUENNX0xPTkcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19TZXRTdGFuZGFyZChTUElfVHlwZURlZiAqU1BJeCwgdWludDMyX3QgU3RhbmRhcmQpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+STJTQ0ZHUiwgU1BJX0kyU0NGR1JfSTJTU1REIHwgU1BJX0kyU0NGR1JfUENNU1lOQywgU3RhbmRhcmQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBJMlMgc3RhbmRhcmQgcHJvdG9jb2wKKyAgKiBAcm10b2xsIEkyU0NGR1IgICAgICBJMlNTVEQgICAgICAgIExMX0kyU19HZXRTdGFuZGFyZFxuCisgICogICAgICAgICBJMlNDRkdSICAgICAgUENNU1lOQyAgICAgICBMTF9JMlNfR2V0U3RhbmRhcmQKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19TVEFOREFSRF9QSElMSVBTCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1NUQU5EQVJEX01TQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19TVEFOREFSRF9MU0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfU1RBTkRBUkRfUENNX1NIT1JUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1NUQU5EQVJEX1BDTV9MT05HCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0dldFN0YW5kYXJkKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9JMlNTVEQgfCBTUElfSTJTQ0ZHUl9QQ01TWU5DKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEkyUyB0cmFuc2ZlciBtb2RlCisgICogQHJtdG9sbCBJMlNDRkdSICAgICAgSTJTQ0ZHICAgICAgICBMTF9JMlNfU2V0VHJhbnNmZXJNb2RlCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEBwYXJhbSAgTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19NT0RFX1NMQVZFX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX01PREVfU0xBVkVfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfTU9ERV9NQVNURVJfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfTU9ERV9NQVNURVJfUlgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19TZXRUcmFuc2Zlck1vZGUoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IE1vZGUpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+STJTQ0ZHUiwgU1BJX0kyU0NGR1JfSTJTQ0ZHLCBNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgSTJTIHRyYW5zZmVyIG1vZGUKKyAgKiBAcm10b2xsIEkyU0NGR1IgICAgICBJMlNDRkcgICAgICAgIExMX0kyU19HZXRUcmFuc2Zlck1vZGUKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19NT0RFX1NMQVZFX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX01PREVfU0xBVkVfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfTU9ERV9NQVNURVJfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfTU9ERV9NQVNURVJfUlgKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfR2V0VHJhbnNmZXJNb2RlKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9JMlNDRkcpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgSTJTIGxpbmVhciBwcmVzY2FsZXIKKyAgKiBAcm10b2xsIEkyU1BSICAgICAgICBJMlNESVYgICAgICAgIExMX0kyU19TZXRQcmVzY2FsZXJMaW5lYXIKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHBhcmFtICBQcmVzY2FsZXJMaW5lYXIgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAyIGFuZCBNYXhfRGF0YT0weEZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfU2V0UHJlc2NhbGVyTGluZWFyKFNQSV9UeXBlRGVmICpTUEl4LCB1aW50OF90IFByZXNjYWxlckxpbmVhcikKK3sKKyAgTU9ESUZZX1JFRyhTUEl4LT5JMlNQUiwgU1BJX0kyU1BSX0kyU0RJViwgUHJlc2NhbGVyTGluZWFyKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgSTJTIGxpbmVhciBwcmVzY2FsZXIKKyAgKiBAcm10b2xsIEkyU1BSICAgICAgICBJMlNESVYgICAgICAgIExMX0kyU19HZXRQcmVzY2FsZXJMaW5lYXIKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBQcmVzY2FsZXJMaW5lYXIgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAyIGFuZCBNYXhfRGF0YT0weEZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0dldFByZXNjYWxlckxpbmVhcihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+STJTUFIsIFNQSV9JMlNQUl9JMlNESVYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgSTJTIHBhcml0eSBwcmVzY2FsZXIKKyAgKiBAcm10b2xsIEkyU1BSICAgICAgICBPREQgICAgICAgICAgIExMX0kyU19TZXRQcmVzY2FsZXJQYXJpdHkKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHBhcmFtICBQcmVzY2FsZXJQYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfUFJFU0NBTEVSX1BBUklUWV9FVkVOCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1BSRVNDQUxFUl9QQVJJVFlfT0RECisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfU2V0UHJlc2NhbGVyUGFyaXR5KFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBQcmVzY2FsZXJQYXJpdHkpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+STJTUFIsIFNQSV9JMlNQUl9PREQsIFByZXNjYWxlclBhcml0eSA8PCA4VSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEkyUyBwYXJpdHkgcHJlc2NhbGVyCisgICogQHJtdG9sbCBJMlNQUiAgICAgICAgT0REICAgICAgICAgICBMTF9JMlNfR2V0UHJlc2NhbGVyUGFyaXR5CisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfUFJFU0NBTEVSX1BBUklUWV9FVkVOCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1BSRVNDQUxFUl9QQVJJVFlfT0RECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0dldFByZXNjYWxlclBhcml0eShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+STJTUFIsIFNQSV9JMlNQUl9PREQpID4+IDhVKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIG1hc3RlciBjbG9jayBvdXB1dCAoUGluIE1DSykKKyAgKiBAcm10b2xsIEkyU1BSICAgICAgICBNQ0tPRSAgICAgICAgIExMX0kyU19FbmFibGVNYXN0ZXJDbG9jaworICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19FbmFibGVNYXN0ZXJDbG9jayhTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgU0VUX0JJVChTUEl4LT5JMlNQUiwgU1BJX0kyU1BSX01DS09FKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBtYXN0ZXIgY2xvY2sgb3VwdXQgKFBpbiBNQ0spCisgICogQHJtdG9sbCBJMlNQUiAgICAgICAgTUNLT0UgICAgICAgICBMTF9JMlNfRGlzYWJsZU1hc3RlckNsb2NrCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0Rpc2FibGVNYXN0ZXJDbG9jayhTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgQ0xFQVJfQklUKFNQSXgtPkkyU1BSLCBTUElfSTJTUFJfTUNLT0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBtYXN0ZXIgY2xvY2sgb3VwdXQgKFBpbiBNQ0spIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIEkyU1BSICAgICAgICBNQ0tPRSAgICAgICAgIExMX0kyU19Jc0VuYWJsZWRNYXN0ZXJDbG9jaworICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfSXNFbmFibGVkTWFzdGVyQ2xvY2soU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoU1BJeC0+STJTUFIsIFNQSV9JMlNQUl9NQ0tPRSkgPT0gKFNQSV9JMlNQUl9NQ0tPRSkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyU19MTF9FRl9GTEFHIEZMQUcgTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUnggYnVmZmVyIGlzIG5vdCBlbXB0eQorICAqIEBybXRvbGwgU1IgICAgICAgICAgIFJYTkUgICAgICAgICAgTExfSTJTX0lzQWN0aXZlRmxhZ19SWE5FCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyU19Jc0FjdGl2ZUZsYWdfUlhORShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuIExMX1NQSV9Jc0FjdGl2ZUZsYWdfUlhORShTUEl4KTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUeCBidWZmZXIgaXMgZW1wdHkKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBUWEUgICAgICAgICAgIExMX0kyU19Jc0FjdGl2ZUZsYWdfVFhFCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyU19Jc0FjdGl2ZUZsYWdfVFhFKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gTExfU1BJX0lzQWN0aXZlRmxhZ19UWEUoU1BJeCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGJ1c3kgZmxhZworICAqIEBybXRvbGwgU1IgICAgICAgICAgIEJTWSAgICAgICAgICAgTExfSTJTX0lzQWN0aXZlRmxhZ19CU1kKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0lzQWN0aXZlRmxhZ19CU1koU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiBMTF9TUElfSXNBY3RpdmVGbGFnX0JTWShTUEl4KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgb3ZlcnJ1biBlcnJvciBmbGFnCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgT1ZSICAgICAgICAgICBMTF9JMlNfSXNBY3RpdmVGbGFnX09WUgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfSXNBY3RpdmVGbGFnX09WUihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuIExMX1NQSV9Jc0FjdGl2ZUZsYWdfT1ZSKFNQSXgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB1bmRlcnJ1biBlcnJvciBmbGFnCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgVURSICAgICAgICAgICBMTF9JMlNfSXNBY3RpdmVGbGFnX1VEUgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfSXNBY3RpdmVGbGFnX1VEUihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChTUEl4LT5TUiwgU1BJX1NSX1VEUikgPT0gKFNQSV9TUl9VRFIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZnJhbWUgZm9ybWF0IGVycm9yIGZsYWcKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBGUkUgICAgICAgICAgIExMX0kyU19Jc0FjdGl2ZUZsYWdfRlJFCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyU19Jc0FjdGl2ZUZsYWdfRlJFKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gTExfU1BJX0lzQWN0aXZlRmxhZ19GUkUoU1BJeCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNoYW5uZWwgc2lkZSBmbGFnLgorICAqIEBub3RlICAgMDogQ2hhbm5lbCBMZWZ0IGhhcyB0byBiZSB0cmFuc21pdHRlZCBvciBoYXMgYmVlbiByZWNlaXZlZFxuCisgICogICAgICAgICAxOiBDaGFubmVsIFJpZ2h0IGhhcyB0byBiZSB0cmFuc21pdHRlZCBvciBoYXMgYmVlbiByZWNlaXZlZFxuCisgICogICAgICAgICBJdCBoYXMgbm8gc2lnbmlmaWNhbmNlIGluIFBDTSBtb2RlLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENIU0lERSAgICAgICAgTExfSTJTX0lzQWN0aXZlRmxhZ19DSFNJREUKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0lzQWN0aXZlRmxhZ19DSFNJREUoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoU1BJeC0+U1IsIFNQSV9TUl9DSFNJREUpID09IChTUElfU1JfQ0hTSURFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgb3ZlcnJ1biBlcnJvciBmbGFnCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgT1ZSICAgICAgICAgICBMTF9JMlNfQ2xlYXJGbGFnX09WUgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19DbGVhckZsYWdfT1ZSKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBMTF9TUElfQ2xlYXJGbGFnX09WUihTUEl4KTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB1bmRlcnJ1biBlcnJvciBmbGFnCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgVURSICAgICAgICAgICBMTF9JMlNfQ2xlYXJGbGFnX1VEUgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19DbGVhckZsYWdfVURSKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKyAgdG1wcmVnID0gU1BJeC0+U1I7CisgICh2b2lkKXRtcHJlZzsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBmcmFtZSBmb3JtYXQgZXJyb3IgZmxhZworICAqIEBybXRvbGwgU1IgICAgICAgICAgIEZSRSAgICAgICAgICAgTExfSTJTX0NsZWFyRmxhZ19GUkUKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfQ2xlYXJGbGFnX0ZSRShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgTExfU1BJX0NsZWFyRmxhZ19GUkUoU1BJeCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VGX0lUIEludGVycnVwdCBNYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgZXJyb3IgSVQKKyAgKiBAbm90ZSAgIFRoaXMgYml0IGNvbnRyb2xzIHRoZSBnZW5lcmF0aW9uIG9mIGFuIGludGVycnVwdCB3aGVuIGFuIGVycm9yIGNvbmRpdGlvbiBvY2N1cnMgKE9WUiwgVURSIGFuZCBGUkUgaW4gSTJTIG1vZGUpLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEVSUklFICAgICAgICAgTExfSTJTX0VuYWJsZUlUX0VSUgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19FbmFibGVJVF9FUlIoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIExMX1NQSV9FbmFibGVJVF9FUlIoU1BJeCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFJ4IGJ1ZmZlciBub3QgZW1wdHkgSVQKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBSWE5FSUUgICAgICAgIExMX0kyU19FbmFibGVJVF9SWE5FCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0VuYWJsZUlUX1JYTkUoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIExMX1NQSV9FbmFibGVJVF9SWE5FKFNQSXgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBUeCBidWZmZXIgZW1wdHkgSVQKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBUWEVJRSAgICAgICAgIExMX0kyU19FbmFibGVJVF9UWEUKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfRW5hYmxlSVRfVFhFKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBMTF9TUElfRW5hYmxlSVRfVFhFKFNQSXgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgZXJyb3IgSVQKKyAgKiBAbm90ZSAgIFRoaXMgYml0IGNvbnRyb2xzIHRoZSBnZW5lcmF0aW9uIG9mIGFuIGludGVycnVwdCB3aGVuIGFuIGVycm9yIGNvbmRpdGlvbiBvY2N1cnMgKE9WUiwgVURSIGFuZCBGUkUgaW4gSTJTIG1vZGUpLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEVSUklFICAgICAgICAgTExfSTJTX0Rpc2FibGVJVF9FUlIKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfRGlzYWJsZUlUX0VSUihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgTExfU1BJX0Rpc2FibGVJVF9FUlIoU1BJeCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSeCBidWZmZXIgbm90IGVtcHR5IElUCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhORUlFICAgICAgICBMTF9JMlNfRGlzYWJsZUlUX1JYTkUKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfRGlzYWJsZUlUX1JYTkUoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIExMX1NQSV9EaXNhYmxlSVRfUlhORShTUEl4KTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFR4IGJ1ZmZlciBlbXB0eSBJVAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRYRUlFICAgICAgICAgTExfSTJTX0Rpc2FibGVJVF9UWEUKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfRGlzYWJsZUlUX1RYRShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgTExfU1BJX0Rpc2FibGVJVF9UWEUoU1BJeCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgRVJSIElUIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBFUlJJRSAgICAgICAgIExMX0kyU19Jc0VuYWJsZWRJVF9FUlIKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0lzRW5hYmxlZElUX0VSUihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuIExMX1NQSV9Jc0VuYWJsZWRJVF9FUlIoU1BJeCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUlhORSBJVCBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhORUlFICAgICAgICBMTF9JMlNfSXNFbmFibGVkSVRfUlhORQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfSXNFbmFibGVkSVRfUlhORShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuIExMX1NQSV9Jc0VuYWJsZWRJVF9SWE5FKFNQSXgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFRYRSBJVCBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhFSUUgICAgICAgICBMTF9JMlNfSXNFbmFibGVkSVRfVFhFCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyU19Jc0VuYWJsZWRJVF9UWEUoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiBMTF9TUElfSXNFbmFibGVkSVRfVFhFKFNQSXgpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyU19MTF9FRl9ETUEgRE1BIE1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBETUEgUngKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBSWERNQUVOICAgICAgIExMX0kyU19FbmFibGVETUFSZXFfUlgKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfRW5hYmxlRE1BUmVxX1JYKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBMTF9TUElfRW5hYmxlRE1BUmVxX1JYKFNQSXgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRE1BIFJ4CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhETUFFTiAgICAgICBMTF9JMlNfRGlzYWJsZURNQVJlcV9SWAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19EaXNhYmxlRE1BUmVxX1JYKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBMTF9TUElfRGlzYWJsZURNQVJlcV9SWChTUEl4KTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBETUEgUnggaXMgZW5hYmxlZAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYRE1BRU4gICAgICAgTExfSTJTX0lzRW5hYmxlZERNQVJlcV9SWAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfSXNFbmFibGVkRE1BUmVxX1JYKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gTExfU1BJX0lzRW5hYmxlZERNQVJlcV9SWChTUEl4KTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRE1BIFR4CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhETUFFTiAgICAgICBMTF9JMlNfRW5hYmxlRE1BUmVxX1RYCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0VuYWJsZURNQVJlcV9UWChTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgTExfU1BJX0VuYWJsZURNQVJlcV9UWChTUEl4KTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIERNQSBUeAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRYRE1BRU4gICAgICAgTExfSTJTX0Rpc2FibGVETUFSZXFfVFgKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfRGlzYWJsZURNQVJlcV9UWChTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgTExfU1BJX0Rpc2FibGVETUFSZXFfVFgoU1BJeCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgRE1BIFR4IGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBUWERNQUVOICAgICAgIExMX0kyU19Jc0VuYWJsZWRETUFSZXFfVFgKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0lzRW5hYmxlZERNQVJlcV9UWChTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuIExMX1NQSV9Jc0VuYWJsZWRETUFSZXFfVFgoU1BJeCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VGX0RBVEEgREFUQSBNYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZWFkIDE2LUJpdHMgaW4gZGF0YSByZWdpc3RlcgorICAqIEBybXRvbGwgRFIgICAgICAgICAgIERSICAgICAgICAgICAgTExfSTJTX1JlY2VpdmVEYXRhMTYKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSeERhdGEgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMDAgYW5kIE1heF9EYXRhPTB4RkZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQxNl90IExMX0kyU19SZWNlaXZlRGF0YTE2KFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gTExfU1BJX1JlY2VpdmVEYXRhMTYoU1BJeCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgMTYtQml0cyBpbiBkYXRhIHJlZ2lzdGVyCisgICogQHJtdG9sbCBEUiAgICAgICAgICAgRFIgICAgICAgICAgICBMTF9JMlNfVHJhbnNtaXREYXRhMTYKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHBhcmFtICBUeERhdGEgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMDAgYW5kIE1heF9EYXRhPTB4RkZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX1RyYW5zbWl0RGF0YTE2KFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MTZfdCBUeERhdGEpCit7CisgIExMX1NQSV9UcmFuc21pdERhdGExNihTUEl4LCBUeERhdGEpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIEkyU19MTF9FRl9Jbml0IEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCitFcnJvclN0YXR1cyBMTF9JMlNfRGVJbml0KFNQSV9UeXBlRGVmICpTUEl4KTsKK0Vycm9yU3RhdHVzIExMX0kyU19Jbml0KFNQSV9UeXBlRGVmICpTUEl4LCBMTF9JMlNfSW5pdFR5cGVEZWYgKkkyU19Jbml0U3RydWN0KTsKK3ZvaWQgICAgICAgIExMX0kyU19TdHJ1Y3RJbml0KExMX0kyU19Jbml0VHlwZURlZiAqSTJTX0luaXRTdHJ1Y3QpOwordm9pZCAgICAgICAgTExfSTJTX0NvbmZpZ1ByZXNjYWxlcihTUElfVHlwZURlZiAqU1BJeCwgdWludDMyX3QgUHJlc2NhbGVyTGluZWFyLCB1aW50MzJfdCBQcmVzY2FsZXJQYXJpdHkpOworI2lmIGRlZmluZWQgKFNQSV9JMlNfRlVMTERVUExFWF9TVVBQT1JUKQorRXJyb3JTdGF0dXMgTExfSTJTX0luaXRGdWxsRHVwbGV4KFNQSV9UeXBlRGVmICpJMlN4ZXh0LCBMTF9JMlNfSW5pdFR5cGVEZWYgKkkyU19Jbml0U3RydWN0KTsKKyNlbmRpZiAvKiBTUElfSTJTX0ZVTExEVVBMRVhfU1VQUE9SVCAqLworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFNQSV9JMlNfU1VQUE9SVCAqLworCisjZW5kaWYgLyogZGVmaW5lZCAoU1BJMSkgfHwgZGVmaW5lZCAoU1BJMikgfHwgZGVmaW5lZCAoU1BJMykgfHwgZGVmaW5lZCAoU1BJNCkgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJGM3h4X0xMX1NQSV9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2xsX3N5c3RlbS5oIGIvSW5jL3N0bTMyZjN4eF9sbF9zeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWFkM2QzCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjN4eF9sbF9zeXN0ZW0uaApAQCAtMCwwICsxLDE3NDAgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfbGxfc3lzdGVtLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFNZU1RFTSBMTCBtb2R1bGUuCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoZSBMTCBTWVNURU0gZHJpdmVyIGNvbnRhaW5zIGEgc2V0IG9mIGdlbmVyaWMgQVBJcyB0aGF0IGNhbiBiZQorICAgIHVzZWQgYnkgdXNlcjoKKyAgICAgICgrKSBTb21lIG9mIHRoZSBGTEFTSCBmZWF0dXJlcyBuZWVkIHRvIGJlIGhhbmRsZWQgaW4gdGhlIFNZU1RFTSBmaWxlLgorICAgICAgKCspIEFjY2VzcyB0byBEQkdDTVUgcmVnaXN0ZXJzCisgICAgICAoKykgQWNjZXNzIHRvIFNZU0NGRyByZWdpc3RlcnMKKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0xMX1NZU1RFTV9ICisjZGVmaW5lIF9fU1RNMzJGM3h4X0xMX1NZU1RFTV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoRkxBU0gpIHx8IGRlZmluZWQgKFNZU0NGRykgfHwgZGVmaW5lZCAoREJHTUNVKQorCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTCBTWVNURU0KKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX1ByaXZhdGVfQ29uc3RhbnRzIFNZU1RFTSBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qIE9mZnNldCB1c2VkIHRvIGFjY2VzcyB0byBTWVNDRkdfQ0ZHUjEgYW5kIFNZU0NGR19DRkdSMyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU1lTQ0ZHX09GRlNFVF9DRkdSMSAgICAweDAwMDAwMDAwVQorI2RlZmluZSBTWVNDRkdfT0ZGU0VUX0NGR1IzICAgIDB4MDAwMDAwNTBVCisKKy8qIE1hc2sgdXNlZCBmb3IgVElNIGJyZWFrcyBmdW5jdGlvbnMgKi8KKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSMl9QVkRfTE9DSykgJiYgZGVmaW5lZChTWVNDRkdfQ0ZHUjJfU1JBTV9QQVJJVFlfTE9DSykKKyNkZWZpbmUgU1lTQ0ZHX01BU0tfVElNX0JSRUFLIChTWVNDRkdfQ0ZHUjJfTE9DS1VQX0xPQ0sgfCBTWVNDRkdfQ0ZHUjJfU1JBTV9QQVJJVFlfTE9DSyB8IFNZU0NGR19DRkdSMl9QVkRfTE9DSykKKyNlbGlmIGRlZmluZWQoU1lTQ0ZHX0NGR1IyX1BWRF9MT0NLKSAmJiAhZGVmaW5lZChTWVNDRkdfQ0ZHUjJfU1JBTV9QQVJJVFlfTE9DSykKKyNkZWZpbmUgU1lTQ0ZHX01BU0tfVElNX0JSRUFLIChTWVNDRkdfQ0ZHUjJfTE9DS1VQX0xPQ0sgfCBTWVNDRkdfQ0ZHUjJfUFZEX0xPQ0spCisjZWxpZiAhZGVmaW5lZChTWVNDRkdfQ0ZHUjJfUFZEX0xPQ0spICYmIGRlZmluZWQoU1lTQ0ZHX0NGR1IyX1NSQU1fUEFSSVRZX0xPQ0spCisjZGVmaW5lIFNZU0NGR19NQVNLX1RJTV9CUkVBSyAoU1lTQ0ZHX0NGR1IyX0xPQ0tVUF9MT0NLIHwgU1lTQ0ZHX0NGR1IyX1NSQU1fUEFSSVRZX0xPQ0spCisjZWxzZQorI2RlZmluZSBTWVNDRkdfTUFTS19USU1fQlJFQUsgKFNZU0NGR19DRkdSMl9MT0NLVVBfTE9DSykKKyNlbmRpZiAvKiBTWVNDRkdfQ0ZHUjJfUFZEX0xPQ0sgJiYgU1lTQ0ZHX0NGR1IyX1NSQU1fUEFSSVRZX0xPQ0sgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FeHBvcnRlZF9Db25zdGFudHMgU1lTVEVNIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VDX1JFTUFQIFNZU0NGRyBSRU1BUAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1NZU0NGR19SRU1BUF9GTEFTSCAgICAgICAgICAgICAgKHVpbnQzMl90KTB4MDAwMDAwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1haW4gRmxhc2ggbWVtb3J5IG1hcHBlZCBhdCAweDAwMDAwMDAwICovCisjZGVmaW5lIExMX1NZU0NGR19SRU1BUF9TWVNURU1GTEFTSCAgICAgICAgU1lTQ0ZHX0NGR1IxX01FTV9NT0RFXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN5c3RlbSBGbGFzaCBtZW1vcnkgbWFwcGVkIGF0IDB4MDAwMDAwMDAgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX1JFTUFQX1NSQU0gICAgICAgICAgICAgICAoU1lTQ0ZHX0NGR1IxX01FTV9NT0RFXzEgfCBTWVNDRkdfQ0ZHUjFfTUVNX01PREVfMCkgLyogRW1iZWRkZWQgU1JBTSBtYXBwZWQgYXQgMHgwMDAwMDAwMCAqLworI2lmIGRlZmluZWQoRk1DX0JBTksxKQorI2RlZmluZSBMTF9TWVNDRkdfUkVNQVBfRk1DICAgICAgICAgICAgICAgIFNZU0NGR19DRkdSMV9NRU1fTU9ERV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjwhIEZNQyBCYW5rIChPbmx5IHRoZSBmaXJzdCB0d28gYmFua3MpICovCisjZW5kaWYgLyogRk1DX0JBTksxICovCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfQ0ZHUjNfU1BJMV9SWF9ETUFfUk1QKQorLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUNfU1BJMV9ETUFfUk1QX1JYIFNZU0NGRyBTUEkxIFJYL1RYIERNQTEgcmVxdWVzdCBSRU1BUAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1NZU0NGR19TUEkxUlhfUk1QX0RNQTFfQ0gyICAgIChTWVNDRkdfQ0ZHUjNfU1BJMV9SWF9ETUFfUk1QIDw8IDE2VSB8ICh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgLyohPCBTUEkxX1JYIG1hcHBlZCBvbiBETUExIENIMiAqLworI2RlZmluZSBMTF9TWVNDRkdfU1BJMVJYX1JNUF9ETUExX0NINCAgICAoU1lTQ0ZHX0NGR1IzX1NQSTFfUlhfRE1BX1JNUCA8PCAxNlUgfCBTWVNDRkdfQ0ZHUjNfU1BJMV9SWF9ETUFfUk1QXzApIC8qITwgU1BJMV9SWCBtYXBwZWQgb24gRE1BMSBDSDQgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX1NQSTFSWF9STVBfRE1BMV9DSDYgICAgKFNZU0NGR19DRkdSM19TUEkxX1JYX0RNQV9STVAgPDwgMTZVIHwgU1lTQ0ZHX0NGR1IzX1NQSTFfUlhfRE1BX1JNUF8xKSAvKiE8IFNQSTFfUlggbWFwcGVkIG9uIERNQTEgQ0g2ICovCisjZGVmaW5lIExMX1NZU0NGR19TUEkxVFhfUk1QX0RNQTFfQ0gzICAgIChTWVNDRkdfQ0ZHUjNfU1BJMV9UWF9ETUFfUk1QIDw8IDE2VSB8ICh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgLyohPCBTUEkxX1RYIG1hcHBlZCBvbiBETUExIENIMyAqLworI2RlZmluZSBMTF9TWVNDRkdfU1BJMVRYX1JNUF9ETUExX0NINSAgICAoU1lTQ0ZHX0NGR1IzX1NQSTFfVFhfRE1BX1JNUCA8PCAxNlUgfCBTWVNDRkdfQ0ZHUjNfU1BJMV9UWF9ETUFfUk1QXzApIC8qITwgU1BJMV9UWCBtYXBwZWQgb24gRE1BMSBDSDUgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX1NQSTFUWF9STVBfRE1BMV9DSDcgICAgKFNZU0NGR19DRkdSM19TUEkxX1RYX0RNQV9STVAgPDwgMTZVIHwgU1lTQ0ZHX0NGR1IzX1NQSTFfVFhfRE1BX1JNUF8xKSAvKiE8IFNQSTFfVFggbWFwcGVkIG9uIERNQTEgQ0g3ICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFNZU0NGR19DRkdSM19TUEkxX1JYX0RNQV9STVAgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IzX0kyQzFfUlhfRE1BX1JNUCkKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VDX0kyQzFfRE1BX1JNUF9SWCBTWVNDRkcgSTJDMSBSWC9UWCBETUExIHJlcXVlc3QgUkVNQVAKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TWVNDRkdfSTJDMVJYX1JNUF9ETUExX0NINyAgICAoU1lTQ0ZHX0NGR1IzX0kyQzFfUlhfRE1BX1JNUCA8PCAxNlUgfCAodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgIC8qITwgSTJDMV9SWCBtYXBwZWQgb24gRE1BMSBDSDcgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0kyQzFSWF9STVBfRE1BMV9DSDMgICAgKFNZU0NGR19DRkdSM19JMkMxX1JYX0RNQV9STVAgPDwgMTZVIHwgU1lTQ0ZHX0NGR1IzX0kyQzFfUlhfRE1BX1JNUF8wKSAvKiE8IEkyQzFfUlggbWFwcGVkIG9uIERNQTEgQ0gzICovCisjZGVmaW5lIExMX1NZU0NGR19JMkMxUlhfUk1QX0RNQTFfQ0g1ICAgIChTWVNDRkdfQ0ZHUjNfSTJDMV9SWF9ETUFfUk1QIDw8IDE2VSB8IFNZU0NGR19DRkdSM19JMkMxX1JYX0RNQV9STVBfMSkgLyohPCBJMkMxX1JYIG1hcHBlZCBvbiBETUExIENINSAqLworI2RlZmluZSBMTF9TWVNDRkdfSTJDMVRYX1JNUF9ETUExX0NINiAgICAoU1lTQ0ZHX0NGR1IzX0kyQzFfVFhfRE1BX1JNUCA8PCAxNlUgfCAodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgIC8qITwgSTJDMV9UWCBtYXBwZWQgb24gRE1BMSBDSDYgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0kyQzFUWF9STVBfRE1BMV9DSDIgICAgKFNZU0NGR19DRkdSM19JMkMxX1RYX0RNQV9STVAgPDwgMTZVIHwgU1lTQ0ZHX0NGR1IzX0kyQzFfVFhfRE1BX1JNUF8wKSAvKiE8IEkyQzFfVFggbWFwcGVkIG9uIERNQTEgQ0gyICovCisjZGVmaW5lIExMX1NZU0NGR19JMkMxVFhfUk1QX0RNQTFfQ0g0ICAgIChTWVNDRkdfQ0ZHUjNfSTJDMV9UWF9ETUFfUk1QIDw8IDE2VSB8IFNZU0NGR19DRkdSM19JMkMxX1RYX0RNQV9STVBfMSkgLyohPCBJMkMxX1RYIG1hcHBlZCBvbiBETUExIENINCAqLworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFNZU0NGR19DRkdSM19JMkMxX1JYX0RNQV9STVAgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IxX0FEQzI0X0RNQV9STVApIHx8IGRlZmluZWQoU1lTQ0ZHX0NGR1IzX0FEQzJfRE1BX1JNUCkKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VDX0FEQzI0X0RNQV9SRU1BUCBTWVNDRkcgQURDIERNQSByZXF1ZXN0IFJFTUFQCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkIChTWVNDRkdfQ0ZHUjFfQURDMjRfRE1BX1JNUCkgCisjZGVmaW5lIExMX1NZU0NGR19BREMyNF9STVBfRE1BMl9DSDEyICAgIChTWVNDRkdfT0ZGU0VUX0NGR1IxIDw8IDI0VSB8IFNZU0NGR19DRkdSMV9BREMyNF9ETUFfUk1QIDw8IDhVIHwgKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgLyohPCBBREMyNCBETUEgcmVxdWVzdHMgbWFwcGVkIG9uIERNQTIgY2hhbm5lbHMgMSBhbmQgMiAqLworI2RlZmluZSBMTF9TWVNDRkdfQURDMjRfUk1QX0RNQTJfQ0gzNCAgICAoU1lTQ0ZHX09GRlNFVF9DRkdSMSA8PCAyNFUgfCBTWVNDRkdfQ0ZHUjFfQURDMjRfRE1BX1JNUCA8PCA4VSB8IFNZU0NGR19DRkdSMV9BREMyNF9ETUFfUk1QKSAgIC8qITwgQURDMjQgRE1BIHJlcXVlc3RzIG1hcHBlZCBvbiBETUEyIGNoYW5uZWxzIDMgYW5kIDQgKi8KKyNlbmRpZiAvKlNZU0NGR19DRkdSMV9BREMyNF9ETUFfUk1QKi8KKyNpZiBkZWZpbmVkIChTWVNDRkdfQ0ZHUjNfQURDMl9ETUFfUk1QKSAKKyNkZWZpbmUgTExfU1lTQ0ZHX0FEQzJfUk1QX0RNQTFfQ0gyICAgICAgKFNZU0NGR19PRkZTRVRfQ0ZHUjMgPDwgMjRVIHwgU1lTQ0ZHX0NGR1IzX0FEQzJfRE1BX1JNUF8wIDw8IDhVIHwgKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAvKiE8IEFEQzIgbWFwcGVkIG9uIERNQTEgY2hhbm5lbCAyICovCisjZGVmaW5lIExMX1NZU0NGR19BREMyX1JNUF9ETUExX0NINCAgICAgIChTWVNDRkdfT0ZGU0VUX0NGR1IzIDw8IDI0VSB8IFNZU0NGR19DRkdSM19BREMyX0RNQV9STVBfMCA8PCA4VSB8IFNZU0NGR19DRkdSM19BREMyX0RNQV9STVBfMCkgLyohPCBBREMyIG1hcHBlZCBvbiBETUExIGNoYW5uZWwgNCAqLworI2RlZmluZSBMTF9TWVNDRkdfQURDMl9STVBfRE1BMiAgICAgICAgICAoU1lTQ0ZHX09GRlNFVF9DRkdSMyA8PCAyNFUgfCBTWVNDRkdfQ0ZHUjNfQURDMl9ETUFfUk1QXzEgPDwgOFUgfCAodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgIC8qITwgQURDMiBtYXBwZWQgb24gRE1BMiAqLworI2RlZmluZSBMTF9TWVNDRkdfQURDMl9STVBfRE1BMSAgICAgICAgICAoU1lTQ0ZHX09GRlNFVF9DRkdSMyA8PCAyNFUgfCBTWVNDRkdfQ0ZHUjNfQURDMl9ETUFfUk1QXzEgPDwgOFUgfCBTWVNDRkdfQ0ZHUjNfQURDMl9ETUFfUk1QXzEpIC8qITwgQURDMiBtYXBwZWQgb24gRE1BMSAqLworI2VuZGlmIC8qU1lTQ0ZHX0NGR1IzX0FEQzJfRE1BX1JNUCovCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogU1lTQ0ZHX0NGR1IxX0FEQzI0X0RNQV9STVAgfHwgU1lTQ0ZHX0NGR1IzX0FEQzJfRE1BX1JNUCAqLworCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19EQUMxX0RNQTJfUkVNQVAgU1lTQ0ZHIERBQzEvMiBETUExLzIgcmVxdWVzdCBSRU1BUAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1NZU0NGR19EQUMxX0NIMV9STVBfRE1BMl9DSDMgICAgICgoU1lTQ0ZHX0NGR1IxX1RJTTZEQUMxQ2gxX0RNQV9STVAgPDwgOFUpIHwgKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgLyohPCBEQUNfQ0gxIERNQSByZXF1ZXN0cyBtYXBwZWQgb24gRE1BMiBjaGFubmVsIDMgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0RBQzFfQ0gxX1JNUF9ETUExX0NIMyAgICAgKChTWVNDRkdfQ0ZHUjFfVElNNkRBQzFDaDFfRE1BX1JNUCA8PCA4VSkgfCBTWVNDRkdfQ0ZHUjFfVElNNkRBQzFDaDFfRE1BX1JNUCkgICAvKiE8IERBQ19DSDEgRE1BIHJlcXVlc3RzIG1hcHBlZCBvbiBETUExIGNoYW5uZWwgMyAqLworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IxX1RJTTdEQUMxQ2gyX0RNQV9STVApCisjZGVmaW5lIExMX1NZU0NGR19EQUMxX09VVDJfUk1QX0RNQTJfQ0g0ICAgICgoU1lTQ0ZHX0NGR1IxX1RJTTdEQUMxQ2gyX0RNQV9STVAgPDwgOFUpIHwgKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgLyohPCBEQUMxX09VVDIgRE1BIHJlcXVlc3RzIG1hcHBlZCBvbiBETUEyIGNoYW5uZWwgNCAqLworI2RlZmluZSBMTF9TWVNDRkdfREFDMV9PVVQyX1JNUF9ETUExX0NINCAgICAoKFNZU0NGR19DRkdSMV9USU03REFDMUNoMl9ETUFfUk1QIDw8IDhVKSB8IFNZU0NGR19DRkdSMV9USU03REFDMUNoMl9ETUFfUk1QKSAgIC8qITwgREFDMV9PVVQyIERNQSByZXF1ZXN0cyBtYXBwZWQgb24gRE1BMSBjaGFubmVsIDQgKi8KKyNlbmRpZiAvKlNZU0NGR19DRkdSMV9USU03REFDMUNoMl9ETUFfUk1QKi8KKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSMV9USU0xOERBQzJDaDFfRE1BX1JNUCkKKyNkZWZpbmUgTExfU1lTQ0ZHX0RBQzJfT1VUMV9STVBfRE1BMl9DSDUgICAgKChTWVNDRkdfQ0ZHUjFfVElNMThEQUMyQ2gxX0RNQV9STVAgPDwgOFUpIHwgKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAvKiE8IERBQzJfT1VUMSBETUEgcmVxdWVzdHMgbWFwcGVkIG9uIERNQTIgY2hhbm5lbCA1ICovCisjZGVmaW5lIExMX1NZU0NGR19EQUMyX09VVDFfUk1QX0RNQTFfQ0g1ICAgICgoU1lTQ0ZHX0NGR1IxX1RJTTE4REFDMkNoMV9ETUFfUk1QIDw8IDhVKSB8IFNZU0NGR19DRkdSMV9USU0xOERBQzJDaDFfRE1BX1JNUCkgLyohPCBEQUMyX09VVDEgRE1BIHJlcXVlc3RzIG1hcHBlZCBvbiBETUExIGNoYW5uZWwgNSAqLworI2VuZGlmIC8qU1lTQ0ZHX0NGR1IxX1RJTTE4REFDMkNoMV9ETUFfUk1QKi8KKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSMV9EQUMyQ2gxX0RNQV9STVApCisjZGVmaW5lIExMX1NZU0NGR19EQUMyX0NIMV9STVBfTk8gICAgICAgICAgICgoU1lTQ0ZHX0NGR1IxX0RBQzJDaDFfRE1BX1JNUCA8PCA4VSkgfCAodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgLyohPCBObyByZW1hcCAqLworI2RlZmluZSBMTF9TWVNDRkdfREFDMl9DSDFfUk1QX0RNQTFfQ0g1ICAgICAoKFNZU0NGR19DRkdSMV9EQUMyQ2gxX0RNQV9STVAgPDwgOFUpIHwgU1lTQ0ZHX0NGR1IxX0RBQzJDaDFfRE1BX1JNUCkgICAgICAgICAgIC8qITwgREFDMl9DSDEgRE1BIHJlcXVlc3RzIG1hcHBlZCBvbiBETUExIGNoYW5uZWwgNSAqLworI2VuZGlmIC8qU1lTQ0ZHX0NGR1IxX0RBQzJDaDFfRE1BX1JNUCovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19USU0xNl9ETUExX1JFTUFQIFNZU0NGRyBUSU0gRE1BIHJlcXVlc3QgUkVNQVAKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TWVNDRkdfVElNMTZfUk1QX0RNQTFfQ0gzICAgICAgICAoKFNZU0NGR19DRkdSMV9USU0xNl9ETUFfUk1QIDw8IDhVKSB8ICh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTE2X0NIMSBhbmQgVElNMTZfVVAgRE1BIHJlcXVlc3RzIG1hcHBlZCBvbiBETUExIGNoYW5uZWwgMyAqLworI2RlZmluZSBMTF9TWVNDRkdfVElNMTZfUk1QX0RNQTFfQ0g2ICAgICAgICAoKFNZU0NGR19DRkdSMV9USU0xNl9ETUFfUk1QIDw8IDhVKSB8IFNZU0NGR19DRkdSMV9USU0xNl9ETUFfUk1QKSAgICAgICAgICAgICAgICAvKiE8IFRJTTE2X0NIMSBhbmQgVElNMTZfVVAgRE1BIHJlcXVlc3RzIG1hcHBlZCBvbiBETUExIGNoYW5uZWwgNiAqLworI2RlZmluZSBMTF9TWVNDRkdfVElNMTdfUk1QX0RNQTFfQ0gxICAgICAgICAoKFNZU0NGR19DRkdSMV9USU0xN19ETUFfUk1QIDw8IDhVKSB8ICh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTE3X0NIMSBhbmQgVElNMTdfVVAgRE1BIHJlcXVlc3RzIG1hcHBlZCBvbiBETUExIGNoYW5uZWwgMSAqLworI2RlZmluZSBMTF9TWVNDRkdfVElNMTdfUk1QX0RNQTFfQ0g3ICAgICAgICAoKFNZU0NGR19DRkdSMV9USU0xN19ETUFfUk1QIDw8IDhVKSB8IFNZU0NGR19DRkdSMV9USU0xN19ETUFfUk1QKSAgICAgICAgICAgICAgICAvKiE8IFRJTTE3X0NIMSBhbmQgVElNMTdfVVAgRE1BIHJlcXVlc3RzIG1hcHBlZCBvbiBETUExIGNoYW5uZWwgNyAqLworI2RlZmluZSBMTF9TWVNDRkdfVElNNl9STVBfRE1BMl9DSDMgICAgICAgICAoKFNZU0NGR19DRkdSMV9USU02REFDMUNoMV9ETUFfUk1QIDw8IDhVKSB8ICh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAvKiE8IFRJTTYgRE1BIHJlcXVlc3RzIG1hcHBlZCBvbiBETUEyIGNoYW5uZWwgMyAqLworI2RlZmluZSBMTF9TWVNDRkdfVElNNl9STVBfRE1BMV9DSDMgICAgICAgICAoKFNZU0NGR19DRkdSMV9USU02REFDMUNoMV9ETUFfUk1QIDw8IDhVKSB8IFNZU0NGR19DRkdSMV9USU02REFDMUNoMV9ETUFfUk1QKSAgICAvKiE8IFRJTTYgRE1BIHJlcXVlc3RzIG1hcHBlZCBvbiBETUExIGNoYW5uZWwgMyAqLworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IxX1RJTTdEQUMxQ2gyX0RNQV9STVApCisjZGVmaW5lIExMX1NZU0NGR19USU03X1JNUF9ETUEyX0NINCAgICAgICAgICgoU1lTQ0ZHX0NGR1IxX1RJTTdEQUMxQ2gyX0RNQV9STVAgPDwgOFUpIHwgKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgIC8qITwgVElNNyBETUEgcmVxdWVzdHMgbWFwcGVkIG9uIERNQTIgY2hhbm5lbCA0ICovCisjZGVmaW5lIExMX1NZU0NGR19USU03X1JNUF9ETUExX0NINCAgICAgICAgICgoU1lTQ0ZHX0NGR1IxX1RJTTdEQUMxQ2gyX0RNQV9STVAgPDwgOFUpIHwgU1lTQ0ZHX0NGR1IxX1RJTTdEQUMxQ2gyX0RNQV9STVApICAgIC8qITwgVElNNyBETUEgcmVxdWVzdHMgbWFwcGVkIG9uIERNQTEgY2hhbm5lbCA0ICovCisjZW5kaWYgLypTWVNDRkdfQ0ZHUjFfVElNN0RBQzFDaDJfRE1BX1JNUCovCisjaWYgZGVmaW5lZChTWVNDRkdfQ0ZHUjFfVElNMThEQUMyQ2gxX0RNQV9STVApCisjZGVmaW5lIExMX1NZU0NGR19USU0xOF9STVBfRE1BMl9DSDUgICAgICAgICgoU1lTQ0ZHX0NGR1IxX1RJTTE4REFDMkNoMV9ETUFfUk1QIDw8IDhVKSB8ICh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgIC8qITwgVElNMTggRE1BIHJlcXVlc3RzIG1hcHBlZCBvbiBETUEyIGNoYW5uZWwgNSAqLworI2RlZmluZSBMTF9TWVNDRkdfVElNMThfUk1QX0RNQTFfQ0g1ICAgICAgICAoKFNZU0NGR19DRkdSMV9USU0xOERBQzJDaDFfRE1BX1JNUCA8PCA4VSkgfCBTWVNDRkdfQ0ZHUjFfVElNMThEQUMyQ2gxX0RNQV9STVApICAvKiE8IFRJTTE4IERNQSByZXF1ZXN0cyBtYXBwZWQgb24gRE1BMSBjaGFubmVsIDUgKi8KKyNlbmRpZiAvKlNZU0NGR19DRkdSMV9USU0xOERBQzJDaDFfRE1BX1JNUCovCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfQ0ZHUjFfVElNMV9JVFIzX1JNUCkgfHwgZGVmaW5lZChTWVNDRkdfQ0ZHUjFfRU5DT0RFUl9NT0RFKQorLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUNfVElNMV9JVFIzX1JNUF9USU00IFNZU0NGRyBUSU0gUkVNQVAKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IxX1RJTTFfSVRSM19STVApCisjZGVmaW5lIExMX1NZU0NGR19USU0xX0lUUjNfUk1QX1RJTTRfVFJHTyAgICAgICgoU1lTQ0ZHX0NGR1IxX1RJTTFfSVRSM19STVAgPDwgOFUpIHwgKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgLyohPCBUSU0xX0lUUjMgPSBUSU00X1RSR08gKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX1RJTTFfSVRSM19STVBfVElNMTdfT0MgICAgICAgKChTWVNDRkdfQ0ZHUjFfVElNMV9JVFIzX1JNUCA8PCA4VSkgfCBTWVNDRkdfQ0ZHUjFfVElNMV9JVFIzX1JNUCkgICAgICAgICAvKiE8IFRJTTFfSVRSMyA9IFRJTTE3X09DICovCisjZW5kaWYgLyogU1lTQ0ZHX0NGR1IxX1RJTTFfSVRSM19STVAgKi8KKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSMV9FTkNPREVSX01PREUpCisjZGVmaW5lIExMX1NZU0NGR19USU0xNV9FTkNPREVNT0RFX05PUkVESVJFQ1RJT04gKChTWVNDRkdfQ0ZHUjFfRU5DT0RFUl9NT0RFIDw8IDhVKSB8ICh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAvKiE8IE5vIHJlZGlyZWN0aW9uICovCisjZGVmaW5lIExMX1NZU0NGR19USU0xNV9FTkNPREVNT0RFX1RJTTIgICAgICAgICAgKChTWVNDRkdfQ0ZHUjFfRU5DT0RFUl9NT0RFXzAgPDwgOFUpIHwgU1lTQ0ZHX0NGR1IxX0VOQ09ERVJfTU9ERV8wKSAgICAgICAvKiE8IFRJTTIgSUMxIGFuZCBUSU0yIElDMiBhcmUgY29ubmVjdGVkIHRvIFRJTTE1IElDMSBhbmQgVElNMTUgSUMyIHJlc3BlY3RpdmVseSAqLworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IxX0VOQ09ERVJfTU9ERV9USU0zKQorI2RlZmluZSBMTF9TWVNDRkdfVElNMTVfRU5DT0RFTU9ERV9USU0zICAgICAgICAgICgoU1lTQ0ZHX0NGR1IxX0VOQ09ERVJfTU9ERV9USU0zIDw8IDhVKSB8IFNZU0NGR19DRkdSMV9FTkNPREVSX01PREVfVElNMykgLyohPCBUSU0zIElDMSBhbmQgVElNMyBJQzIgYXJlIGNvbm5lY3RlZCB0byBUSU0xNSBJQzEgYW5kIFRJTTE1IElDMiByZXNwZWN0aXZlbHkgKi8KKyNlbmRpZiAvKiBTWVNDRkdfQ0ZHUjFfRU5DT0RFUl9NT0RFX1RJTTMgKi8KKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSMV9FTkNPREVSX01PREVfVElNNCkKKyNkZWZpbmUgTExfU1lTQ0ZHX1RJTTE1X0VOQ09ERU1PREVfVElNNCAgICAgICAgICAoKFNZU0NGR19DRkdSMV9FTkNPREVSX01PREVfVElNNCA8PCA4VSkgfCBTWVNDRkdfQ0ZHUjFfRU5DT0RFUl9NT0RFX1RJTTQpIC8qITwgVElNNCBJQzEgYW5kIFRJTTQgSUMyIGFyZSBjb25uZWN0ZWQgdG8gVElNMTUgSUMxIGFuZCBUSU0xNSBJQzIgcmVzcGVjdGl2ZWx5ICovCisjZW5kaWYgLyogU1lTQ0ZHX0NGR1IxX0VOQ09ERVJfTU9ERV9USU00ICovCisjZW5kaWYgLyogU1lTQ0ZHX0NGR1IxX0VOQ09ERVJfTU9ERSAqLworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFNZU0NGR19DRkdSMV9USU0xX0lUUjNfUk1QIHx8IFNZU0NGR19DRkdSMV9FTkNPREVSX01PREUgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1I0X0FEQzEyX0VYVDJfUk1QKQorLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUNfQURDMTJfRVhUMl9STVBfVElNMSBTWVNDRkcgQURDIFRyaWdnZXIgUkVNQVAKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TWVNDRkdfQURDMTJfRVhUMl9STVBfVElNMV9DQzMgICAgICAoKFNZU0NGR19DRkdSNF9BREMxMl9FWFQyX1JNUCA8PCAxNlUpIHwgKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgLyohPCBJbnB1dCB0cmlnZ2VyIG9mIEFEQzEyIHJlZ3VsYXIgY2hhbm5lbCBFWFQyOlRyaWdnZXIgc291cmNlIGlzIFRJTTFfQ0MzICovCisjZGVmaW5lIExMX1NZU0NGR19BREMxMl9FWFQyX1JNUF9USU0yMF9UUkdPICAgICgoU1lTQ0ZHX0NGR1I0X0FEQzEyX0VYVDJfUk1QIDw8IDE2VSkgfCBTWVNDRkdfQ0ZHUjRfQURDMTJfRVhUMl9STVApICAgICAvKiE8IElucHV0IHRyaWdnZXIgb2YgQURDMTIgcmVndWxhciBjaGFubmVsIEVYVDI6VHJpZ2dlciBzb3VyY2UgaXMgVElNMjBfVFJHTyAqLworI2RlZmluZSBMTF9TWVNDRkdfQURDMTJfRVhUM19STVBfVElNMl9DQzIgICAgICAoKFNZU0NGR19DRkdSNF9BREMxMl9FWFQzX1JNUCA8PCAxNlUpIHwgKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgLyohPCBJbnB1dCB0cmlnZ2VyIG9mIEFEQzEyIHJlZ3VsYXIgY2hhbm5lbCBFWFQzOlRyaWdnZXIgc291cmNlIGlzIFRJTTJfQ0MyICovCisjZGVmaW5lIExMX1NZU0NGR19BREMxMl9FWFQzX1JNUF9USU0yMF9UUkdPMiAgICgoU1lTQ0ZHX0NGR1I0X0FEQzEyX0VYVDNfUk1QIDw8IDE2VSkgfCBTWVNDRkdfQ0ZHUjRfQURDMTJfRVhUM19STVApICAgICAvKiE8IElucHV0IHRyaWdnZXIgb2YgQURDMTIgcmVndWxhciBjaGFubmVsIEVYVDM6VHJpZ2dlciBzb3VyY2UgaXMgVElNMjBfVFJHTzIgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0FEQzEyX0VYVDVfUk1QX1RJTTRfQ0M0ICAgICAgKChTWVNDRkdfQ0ZHUjRfQURDMTJfRVhUNV9STVAgPDwgMTZVKSB8ICh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgIC8qITwgSW5wdXQgdHJpZ2dlciBvZiBBREMxMiByZWd1bGFyIGNoYW5uZWwgRVhUNTpUcmlnZ2VyIHNvdXJjZSBpcyBUSU00X0NDNCAqLworI2RlZmluZSBMTF9TWVNDRkdfQURDMTJfRVhUNV9STVBfVElNMjBfQ0MxICAgICAoKFNZU0NGR19DRkdSNF9BREMxMl9FWFQ1X1JNUCA8PCAxNlUpIHwgU1lTQ0ZHX0NGR1I0X0FEQzEyX0VYVDVfUk1QKSAgICAgLyohPCBJbnB1dCB0cmlnZ2VyIG9mIEFEQzEyIHJlZ3VsYXIgY2hhbm5lbCBFWFQ1OlRyaWdnZXIgc291cmNlIGlzIFRJTTIwX0NDMSAqLworI2RlZmluZSBMTF9TWVNDRkdfQURDMTJfRVhUMTNfUk1QX1RJTTZfVFJHTyAgICAoKFNZU0NGR19DRkdSNF9BREMxMl9FWFQxM19STVAgPDwgMTZVKSB8ICh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgLyohPCBJbnB1dCB0cmlnZ2VyIG9mIEFEQzEyIHJlZ3VsYXIgY2hhbm5lbCBFWFQxMzpUcmlnZ2VyIHNvdXJjZSBpcyBUSU02X1RSR08gKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0FEQzEyX0VYVDEzX1JNUF9USU0yMF9DQzIgICAgKChTWVNDRkdfQ0ZHUjRfQURDMTJfRVhUMTNfUk1QIDw8IDE2VSkgfCBTWVNDRkdfQ0ZHUjRfQURDMTJfRVhUMTNfUk1QKSAgIC8qITwgSW5wdXQgdHJpZ2dlciBvZiBBREMxMiByZWd1bGFyIGNoYW5uZWwgRVhUMTM6VHJpZ2dlciBzb3VyY2UgaXMgVElNMjBfQ0MyICovCisjZGVmaW5lIExMX1NZU0NGR19BREMxMl9FWFQxNV9STVBfVElNM19DQzQgICAgICgoU1lTQ0ZHX0NGR1I0X0FEQzEyX0VYVDE1X1JNUCA8PCAxNlUpIHwgKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAvKiE8IElucHV0IHRyaWdnZXIgb2YgQURDMTIgcmVndWxhciBjaGFubmVsIEVYVDE1OlRyaWdnZXIgc291cmNlIGlzIFRJTTNfQ0M0ICovCisjZGVmaW5lIExMX1NZU0NGR19BREMxMl9FWFQxNV9STVBfVElNMjBfQ0MzICAgICgoU1lTQ0ZHX0NGR1I0X0FEQzEyX0VYVDE1X1JNUCA8PCAxNlUpIHwgU1lTQ0ZHX0NGR1I0X0FEQzEyX0VYVDE1X1JNUCkgICAvKiE8IElucHV0IHRyaWdnZXIgb2YgQURDMTIgcmVndWxhciBjaGFubmVsIEVYVDE1OlRyaWdnZXIgc291cmNlIGlzIFRJTTIwX0NDMyAqLworI2RlZmluZSBMTF9TWVNDRkdfQURDMTJfSkVYVDNfUk1QX1RJTTJfQ0MxICAgICAoKFNZU0NGR19DRkdSNF9BREMxMl9KRVhUM19STVAgPDwgMTZVKSB8ICh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgLyohPCBJbnB1dCB0cmlnZ2VyIG9mIEFEQzEyIHJlZ3VsYXIgY2hhbm5lbCBKRVhUMzpUcmlnZ2VyIHNvdXJjZSBpcyBUSU0yX0NDMSAqLworI2RlZmluZSBMTF9TWVNDRkdfQURDMTJfSkVYVDNfUk1QX1RJTTIwX1RSR08gICAoKFNZU0NGR19DRkdSNF9BREMxMl9KRVhUM19STVAgPDwgMTZVKSB8IFNZU0NGR19DRkdSNF9BREMxMl9KRVhUM19STVApICAgLyohPCBJbnB1dCB0cmlnZ2VyIG9mIEFEQzEyIHJlZ3VsYXIgY2hhbm5lbCBKRVhUMzpUcmlnZ2VyIHNvdXJjZSBpcyBUSU0yMF9UUkdPICovCisjZGVmaW5lIExMX1NZU0NGR19BREMxMl9KRVhUNl9STVBfRVhUSV9MSU5FXzE1ICgoU1lTQ0ZHX0NGR1I0X0FEQzEyX0pFWFQ2X1JNUCA8PCAxNlUpIHwgKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAvKiE8IElucHV0IHRyaWdnZXIgb2YgQURDMTIgcmVndWxhciBjaGFubmVsIEpFWFQ2OlRyaWdnZXIgc291cmNlIGlzIEVYVElfTElORV8xNSAqLworI2RlZmluZSBMTF9TWVNDRkdfQURDMTJfSkVYVDZfUk1QX1RJTTIwX1RSR08yICAoKFNZU0NGR19DRkdSNF9BREMxMl9KRVhUNl9STVAgPDwgMTZVKSB8IFNZU0NGR19DRkdSNF9BREMxMl9KRVhUNl9STVApICAgLyohPCBJbnB1dCB0cmlnZ2VyIG9mIEFEQzEyIHJlZ3VsYXIgY2hhbm5lbCBKRVhUNjpUcmlnZ2VyIHNvdXJjZSBpcyBUSU0yMF9UUkdPMiAqLworI2RlZmluZSBMTF9TWVNDRkdfQURDMTJfSkVYVDEzX1JNUF9USU0zX0NDMSAgICAoKFNZU0NGR19DRkdSNF9BREMxMl9KRVhUMTNfUk1QIDw8IDE2VSkgfCAodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgLyohPCBJbnB1dCB0cmlnZ2VyIG9mIEFEQzEyIHJlZ3VsYXIgY2hhbm5lbCBKRVhUMTM6VHJpZ2dlciBzb3VyY2UgaXMgVElNM19DQzEgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0FEQzEyX0pFWFQxM19STVBfVElNMjBfQ0M0ICAgKChTWVNDRkdfQ0ZHUjRfQURDMTJfSkVYVDEzX1JNUCA8PCAxNlUpIHwgU1lTQ0ZHX0NGR1I0X0FEQzEyX0pFWFQxM19STVApIC8qITwgSW5wdXQgdHJpZ2dlciBvZiBBREMxMiByZWd1bGFyIGNoYW5uZWwgSkVYVDEzOlRyaWdnZXIgc291cmNlIGlzIFRJTTIwX0NDNCAqLworI2RlZmluZSBMTF9TWVNDRkdfQURDMzRfRVhUNV9STVBfRVhUSV9MSU5FXzIgICAoKFNZU0NGR19DRkdSNF9BREMzNF9FWFQ1X1JNUCA8PCAxNlUpIHwgKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgLyohPCBJbnB1dCB0cmlnZ2VyIG9mIEFEQzM0IHJlZ3VsYXIgY2hhbm5lbCBFWFQ1OlRyaWdnZXIgc291cmNlIGlzIEVYVElfTElORV8yICovCisjZGVmaW5lIExMX1NZU0NGR19BREMzNF9FWFQ1X1JNUF9USU0yMF9UUkdPICAgICgoU1lTQ0ZHX0NGR1I0X0FEQzM0X0VYVDVfUk1QIDw8IDE2VSkgfCBTWVNDRkdfQ0ZHUjRfQURDMzRfRVhUNV9STVApICAgICAvKiE8IElucHV0IHRyaWdnZXIgb2YgQURDMzQgcmVndWxhciBjaGFubmVsIEVYVDU6VHJpZ2dlciBzb3VyY2UgaXMgVElNMjBfVFJHTyAqLworI2RlZmluZSBMTF9TWVNDRkdfQURDMzRfRVhUNl9STVBfVElNNF9DQzEgICAgICAoKFNZU0NGR19DRkdSNF9BREMzNF9FWFQ2X1JNUCA8PCAxNlUpIHwgKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgLyohPCBJbnB1dCB0cmlnZ2VyIG9mIEFEQzM0IHJlZ3VsYXIgY2hhbm5lbCBFWFQ2OlRyaWdnZXIgc291cmNlIGlzIFRJTTRfQ0MxICovCisjZGVmaW5lIExMX1NZU0NGR19BREMzNF9FWFQ2X1JNUF9USU0yMF9UUkdPMiAgICgoU1lTQ0ZHX0NGR1I0X0FEQzM0X0VYVDZfUk1QIDw8IDE2VSkgfCBTWVNDRkdfQ0ZHUjRfQURDMzRfRVhUNl9STVApICAgICAvKiE8IElucHV0IHRyaWdnZXIgb2YgQURDMzQgcmVndWxhciBjaGFubmVsIEVYVDY6VHJpZ2dlciBzb3VyY2UgaXMgVElNMjBfVFJHTzIgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0FEQzM0X0VYVDE1X1JNUF9USU0yX0NDMSAgICAgKChTWVNDRkdfQ0ZHUjRfQURDMzRfRVhUMTVfUk1QIDw8IDE2VSkgfCAodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgIC8qITwgSW5wdXQgdHJpZ2dlciBvZiBBREMzNCByZWd1bGFyIGNoYW5uZWwgRVhUMTU6VHJpZ2dlciBzb3VyY2UgaXMgIFRJTTJfQ0MxICovCisjZGVmaW5lIExMX1NZU0NGR19BREMzNF9FWFQxNV9STVBfVElNMjBfQ0MxICAgICgoU1lTQ0ZHX0NGR1I0X0FEQzM0X0VYVDE1X1JNUCA8PCAxNlUpIHwgU1lTQ0ZHX0NGR1I0X0FEQzM0X0VYVDE1X1JNUCkgICAvKiE8IElucHV0IHRyaWdnZXIgb2YgQURDMzQgcmVndWxhciBjaGFubmVsIEVYVDE1OlRyaWdnZXIgc291cmNlIGlzIFRJTTIwX0NDMSAqLworI2RlZmluZSBMTF9TWVNDRkdfQURDMzRfSkVYVDVfUk1QX1RJTTRfQ0MzICAgICAoKFNZU0NGR19DRkdSNF9BREMzNF9KRVhUNV9STVAgPDwgMTZVKSB8ICh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgLyohPCBJbnB1dCB0cmlnZ2VyIG9mIEFEQzM0IHJlZ3VsYXIgY2hhbm5lbCBKRVhUNTpUcmlnZ2VyIHNvdXJjZSBpcyBUSU00X0NDMyAqLworI2RlZmluZSBMTF9TWVNDRkdfQURDMzRfSkVYVDVfUk1QX1RJTTIwX1RSR08gICAoKFNZU0NGR19DRkdSNF9BREMzNF9KRVhUNV9STVAgPDwgMTZVKSB8IFNZU0NGR19DRkdSNF9BREMzNF9KRVhUNV9STVApICAgLyohPCBJbnB1dCB0cmlnZ2VyIG9mIEFEQzM0IHJlZ3VsYXIgY2hhbm5lbCBKRVhUNTpUcmlnZ2VyIHNvdXJjZSBpcyBUSU0yMF9UUkdPICovCisjZGVmaW5lIExMX1NZU0NGR19BREMzNF9KRVhUMTFfUk1QX1RJTTFfQ0MzICAgICgoU1lTQ0ZHX0NGR1I0X0FEQzM0X0pFWFQxMV9STVAgPDwgMTZVKSB8ICh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAvKiE8IElucHV0IHRyaWdnZXIgb2YgQURDMzQgcmVndWxhciBjaGFubmVsIEpFWFQxMTpUcmlnZ2VyIHNvdXJjZSBpcyBUSU0xX0NDMyAqLworI2RlZmluZSBMTF9TWVNDRkdfQURDMzRfSkVYVDExX1JNUF9USU0yMF9UUkdPMiAoKFNZU0NGR19DRkdSNF9BREMzNF9KRVhUMTFfUk1QIDw8IDE2VSkgfCBTWVNDRkdfQ0ZHUjRfQURDMzRfSkVYVDExX1JNUCkgLyohPCBJbnB1dCB0cmlnZ2VyIG9mIEFEQzM0IHJlZ3VsYXIgY2hhbm5lbCBKRVhUMTE6VHJpZ2dlciBzb3VyY2UgaXMgVElNMjBfVFJHTzIgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0FEQzM0X0pFWFQxNF9STVBfVElNN19UUkdPICAgKChTWVNDRkdfQ0ZHUjRfQURDMzRfSkVYVDE0X1JNUCA8PCAxNlUpIHwgKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgIC8qITwgSW5wdXQgdHJpZ2dlciBvZiBBREMzNCByZWd1bGFyIGNoYW5uZWwgSkVYVDE0OlRyaWdnZXIgc291cmNlIGlzIFRJTTdfVFJHTyAqLworI2RlZmluZSBMTF9TWVNDRkdfQURDMzRfSkVYVDE0X1JNUF9USU0yMF9DQzIgICAoKFNZU0NGR19DRkdSNF9BREMzNF9KRVhUMTRfUk1QIDw8IDE2VSkgfCBTWVNDRkdfQ0ZHUjRfQURDMzRfSkVYVDE0X1JNUCkgLyohPCBJbnB1dCB0cmlnZ2VyIG9mIEFEQzM0IHJlZ3VsYXIgY2hhbm5lbCBKRVhUMTQ6VHJpZ2dlciBzb3VyY2UgaXMgVElNMjBfQ0MyICovCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogU1lTQ0ZHX0NGR1I0X0FEQzEyX0VYVDJfUk1QICovCisKKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSMV9EQUMxX1RSSUcxX1JNUCkgfHwgZGVmaW5lZChTWVNDRkdfQ0ZHUjNfVFJJR0dFUl9STVApCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19EQUMxX1RSSUcxX1JFTUFQIFNZU0NGRyBEQUMxIFRyaWdnZXIgUkVNQVAKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IxX0RBQzFfVFJJRzFfUk1QKQorI2RlZmluZSBMTF9TWVNDRkdfREFDMV9UUklHMV9STVBfVElNOF9UUkdPICAgICAgICAgKFNZU0NGR19PRkZTRVRfQ0ZHUjEgPDwgMjRVIHwgU1lTQ0ZHX0NGR1IxX0RBQzFfVFJJRzFfUk1QIDw8IDQgfCAodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgIC8qITwgTm8gcmVtYXA6IERBQyB0cmlnZ2VyIFRSSUcxIGlzIFRJTThfVFJHTyAqLworI2RlZmluZSBMTF9TWVNDRkdfREFDMV9UUklHMV9STVBfVElNM19UUkdPICAgICAgICAgKFNZU0NGR19PRkZTRVRfQ0ZHUjEgPDwgMjRVIHwgU1lTQ0ZHX0NGR1IxX0RBQzFfVFJJRzFfUk1QIDw8IDQgfCBTWVNDRkdfQ0ZHUjFfREFDMV9UUklHMV9STVApIC8qITwgREFDIHRyaWdnZXIgaXMgVElNM19UUkdPICovCisjZW5kaWYgLyogU1lTQ0ZHX0NGR1IxX0RBQzFfVFJJRzFfUk1QICovCisjaWYgZGVmaW5lZChTWVNDRkdfQ0ZHUjNfREFDMV9UUkczX1JNUCkKKyNkZWZpbmUgTExfU1lTQ0ZHX0RBQzFfVFJJRzNfUk1QX1RJTTE1X1RSR08gICAgICAgIChTWVNDRkdfT0ZGU0VUX0NGR1IzIDw8IDI0VSB8IFNZU0NGR19DRkdSM19EQUMxX1RSRzNfUk1QIDw8IDQgfCAodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAvKiE8IERBQyB0cmlnZ2VyIGlzIFRJTTE1X1RSR08gKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0RBQzFfVFJJRzNfUk1QX0hSVElNMV9EQUMxX1RSSUcxIChTWVNDRkdfT0ZGU0VUX0NGR1IzIDw8IDI0VSB8IFNZU0NGR19DRkdSM19EQUMxX1RSRzNfUk1QIDw8IDQgfCBTWVNDRkdfQ0ZHUjNfREFDMV9UUkczX1JNUCkgICAvKiE8IERBQyB0cmlnZ2VyIGlzIEhSVElNMV9EQUMxX1RSSUcxICovCisjZW5kaWYgLyogU1lTQ0ZHX0NGR1IzX0RBQzFfVFJHM19STVAgKi8KKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSM19EQUMxX1RSRzVfUk1QKQorI2RlZmluZSBMTF9TWVNDRkdfREFDMV9UUklHNV9STVBfTk8gICAgICAgICAgICAgICAgKFNZU0NGR19PRkZTRVRfQ0ZHUjMgPDwgMjRVIHwgU1lTQ0ZHX0NGR1IzX0RBQzFfVFJHNV9STVAgPDwgNCB8ICh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgIC8qITwgIE5vIHJlbWFwICAqLworI2RlZmluZSBMTF9TWVNDRkdfREFDMV9UUklHNV9STVBfSFJUSU0xX0RBQzFfVFJJRzIgKFNZU0NGR19PRkZTRVRfQ0ZHUjMgPDwgMjRVIHwgU1lTQ0ZHX0NGR1IzX0RBQzFfVFJHNV9STVAgPDwgNCB8IFNZU0NGR19DRkdSM19EQUMxX1RSRzVfUk1QKSAgIC8qITwgREFDIHRyaWdnZXIgaXMgSFJUSU0xX0RBQzFfVFJJRzIgKi8KKyNlbmRpZiAvKiBTWVNDRkdfQ0ZHUjNfREFDMV9UUkc1X1JNUCAqLworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFNZU0NGR19DRkdSMV9EQUMxX1RSSUcxX1JNUCB8fCBTWVNDRkdfQ0ZHUjNfVFJJR0dFUl9STVAgKi8KKworLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUNfSTJDX0ZBU1RNT0RFUExVUyBTWVNDRkcgSTJDIEZBU1RNT0RFUExVUworICAqIEB7CisgICovCisjZGVmaW5lIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX1BCNiAgICAgU1lTQ0ZHX0NGR1IxX0kyQ19QQjZfRk1QICAvKiE8IEkyQyBQQjYgRmFzdCBtb2RlIHBsdXMgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfUEI3ICAgICBTWVNDRkdfQ0ZHUjFfSTJDX1BCN19GTVAgIC8qITwgSTJDIFBCNyBGYXN0IG1vZGUgcGx1cyAqLworI2RlZmluZSBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjggICAgIFNZU0NGR19DRkdSMV9JMkNfUEI4X0ZNUCAgLyohPCBJMkMgUEI4IEZhc3QgbW9kZSBwbHVzICovCisjZGVmaW5lIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX1BCOSAgICAgU1lTQ0ZHX0NGR1IxX0kyQ19QQjlfRk1QICAvKiE8IEkyQyBQQjkgRmFzdCBtb2RlIHBsdXMgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfSTJDMSAgICBTWVNDRkdfQ0ZHUjFfSTJDMV9GTVAgICAgIC8qITwgSTJDMSBGYXN0IG1vZGUgcGx1cyAgICAqLworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IxX0kyQzJfRk1QKQorI2RlZmluZSBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19JMkMyICAgIFNZU0NGR19DRkdSMV9JMkMyX0ZNUCAgICAgLyohPCBJMkMyIEZhc3QgbW9kZSBwbHVzICAgICovCisjZW5kaWYgLypTWVNDRkdfQ0ZHUjFfSTJDMl9GTVAqLworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IxX0kyQzNfRk1QKQorI2RlZmluZSBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19JMkMzICAgIFNZU0NGR19DRkdSMV9JMkMzX0ZNUCAgICAgLyohPCBJMkMzIEZhc3QgbW9kZSBwbHVzICAgICovCisjZW5kaWYgLypTWVNDRkdfQ0ZHUjFfSTJDM19GTVAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUNfRVhUSV9QT1JUIFNZU0NGRyBFWFRJIFBPUlQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9QT1JUQSAgICAgICAgICAgICAgICh1aW50MzJfdCkwVSAvKiE8IEVYVEkgUE9SVCBBICAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9QT1JUQiAgICAgICAgICAgICAgICh1aW50MzJfdCkxVSAvKiE8IEVYVEkgUE9SVCBCICAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9QT1JUQyAgICAgICAgICAgICAgICh1aW50MzJfdCkyVSAvKiE8IEVYVEkgUE9SVCBDICAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9QT1JURCAgICAgICAgICAgICAgICh1aW50MzJfdCkzVSAvKiE8IEVYVEkgUE9SVCBEICAqLworI2lmIGRlZmluZWQoR1BJT0UpCisjZGVmaW5lIExMX1NZU0NGR19FWFRJX1BPUlRFICAgICAgICAgICAgICAgKHVpbnQzMl90KTRVIC8qITwgRVhUSSBQT1JUIEUgICovCisjZW5kaWYgLyogR1BJT0UgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfUE9SVEYgICAgICAgICAgICAgICAodWludDMyX3QpNVUgLyohPCBFWFRJIFBPUlQgRiAgKi8KKyNpZiBkZWZpbmVkKEdQSU9HKQorI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9QT1JURyAgICAgICAgICAgICAgICh1aW50MzJfdCk2VSAvKiE8IEVYVEkgUE9SVCBHICAqLworI2VuZGlmIC8qIEdQSU9HICovCisjaWYgZGVmaW5lZChHUElPSCkKKyNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfUE9SVEggICAgICAgICAgICAgICAodWludDMyX3QpN1UgLyohPCBFWFRJIFBPUlQgSCAgKi8KKyNlbmRpZiAvKiBHUElPSCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUNfRVhUSV9MSU5FIFNZU0NGRyBFWFRJIExJTkUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FMCAgICAgICAgICAgICAgICh1aW50MzJfdCkoMHgwMDBGVSA8PCAxNlUgfCAwVSkgIC8qIEVYVElfUE9TSVRJT05fMCAgfCBFWFRJQ1JbMF0gKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfTElORTEgICAgICAgICAgICAgICAodWludDMyX3QpKDB4MDBGMFUgPDwgMTZVIHwgMFUpICAvKiBFWFRJX1BPU0lUSU9OXzQgIHwgRVhUSUNSWzBdICovCisjZGVmaW5lIExMX1NZU0NGR19FWFRJX0xJTkUyICAgICAgICAgICAgICAgKHVpbnQzMl90KSgweDBGMDBVIDw8IDE2VSB8IDBVKSAgLyogRVhUSV9QT1NJVElPTl84ICB8IEVYVElDUlswXSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FMyAgICAgICAgICAgICAgICh1aW50MzJfdCkoMHhGMDAwVSA8PCAxNlUgfCAwVSkgIC8qIEVYVElfUE9TSVRJT05fMTIgfCBFWFRJQ1JbMF0gKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfTElORTQgICAgICAgICAgICAgICAodWludDMyX3QpKDB4MDAwRlUgPDwgMTZVIHwgMVUpICAvKiBFWFRJX1BPU0lUSU9OXzAgIHwgRVhUSUNSWzFdICovCisjZGVmaW5lIExMX1NZU0NGR19FWFRJX0xJTkU1ICAgICAgICAgICAgICAgKHVpbnQzMl90KSgweDAwRjBVIDw8IDE2VSB8IDFVKSAgLyogRVhUSV9QT1NJVElPTl80ICB8IEVYVElDUlsxXSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FNiAgICAgICAgICAgICAgICh1aW50MzJfdCkoMHgwRjAwVSA8PCAxNlUgfCAxVSkgIC8qIEVYVElfUE9TSVRJT05fOCAgfCBFWFRJQ1JbMV0gKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfTElORTcgICAgICAgICAgICAgICAodWludDMyX3QpKDB4RjAwMFUgPDwgMTZVIHwgMVUpICAvKiBFWFRJX1BPU0lUSU9OXzEyIHwgRVhUSUNSWzFdICovCisjZGVmaW5lIExMX1NZU0NGR19FWFRJX0xJTkU4ICAgICAgICAgICAgICAgKHVpbnQzMl90KSgweDAwMEZVIDw8IDE2VSB8IDJVKSAgLyogRVhUSV9QT1NJVElPTl8wICB8IEVYVElDUlsyXSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FOSAgICAgICAgICAgICAgICh1aW50MzJfdCkoMHgwMEYwVSA8PCAxNlUgfCAyVSkgIC8qIEVYVElfUE9TSVRJT05fNCAgfCBFWFRJQ1JbMl0gKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfTElORTEwICAgICAgICAgICAgICAodWludDMyX3QpKDB4MEYwMFUgPDwgMTZVIHwgMlUpICAvKiBFWFRJX1BPU0lUSU9OXzggIHwgRVhUSUNSWzJdICovCisjZGVmaW5lIExMX1NZU0NGR19FWFRJX0xJTkUxMSAgICAgICAgICAgICAgKHVpbnQzMl90KSgweEYwMDBVIDw8IDE2VSB8IDJVKSAgLyogRVhUSV9QT1NJVElPTl8xMiB8IEVYVElDUlsyXSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FMTIgICAgICAgICAgICAgICh1aW50MzJfdCkoMHgwMDBGVSA8PCAxNlUgfCAzVSkgIC8qIEVYVElfUE9TSVRJT05fMCAgfCBFWFRJQ1JbM10gKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfTElORTEzICAgICAgICAgICAgICAodWludDMyX3QpKDB4MDBGMFUgPDwgMTZVIHwgM1UpICAvKiBFWFRJX1BPU0lUSU9OXzQgIHwgRVhUSUNSWzNdICovCisjZGVmaW5lIExMX1NZU0NGR19FWFRJX0xJTkUxNCAgICAgICAgICAgICAgKHVpbnQzMl90KSgweDBGMDBVIDw8IDE2VSB8IDNVKSAgLyogRVhUSV9QT1NJVElPTl84ICB8IEVYVElDUlszXSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FMTUgICAgICAgICAgICAgICh1aW50MzJfdCkoMHhGMDAwVSA8PCAxNlUgfCAzVSkgIC8qIEVYVElfUE9TSVRJT05fMTIgfCBFWFRJQ1JbM10gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VDX1RJTUJSRUFLIFNZU0NGRyBUSU1FUiBCUkVBSworICAqIEB7CisgICovCisjaWYgZGVmaW5lZChTWVNDRkdfQ0ZHUjJfUFZEX0xPQ0spCisjZGVmaW5lIExMX1NZU0NGR19USU1CUkVBS19QVkQgICAgICAgICAgICAgU1lTQ0ZHX0NGR1IyX1BWRF9MT0NLICAgICAgICAgICAvKiE8IEVuYWJsZXMgYW5kIGxvY2tzIHRoZSBQVkQgY29ubmVjdGlvbiB3aXRoIFRJTXggQnJlYWsgSW5wdXQgYW5kIGFsc28gdGhlIFBWREUgYW5kIFBMUyBiaXRzIG9mIHRoZSBQb3dlciBDb250cm9sIEludGVyZmFjZSAqLworI2VuZGlmIC8qU1lTQ0ZHX0NGR1IyX1BWRF9MT0NLKi8KKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSMl9TUkFNX1BBUklUWV9MT0NLKQorI2RlZmluZSBMTF9TWVNDRkdfVElNQlJFQUtfU1JBTV9QQVJJVFkgICAgIFNZU0NGR19DRkdSMl9TUkFNX1BBUklUWV9MT0NLICAgLyohPCBFbmFibGVzIGFuZCBsb2NrcyB0aGUgU1JBTV9QQVJJVFkgZXJyb3Igc2lnbmFsIHdpdGggQnJlYWsgSW5wdXQgb2YgVElNeCAqLworI2VuZGlmIC8qIFNZU0NGR19DRkdSMl9TUkFNX1BBUklUWV9MT0NLICovCisjZGVmaW5lIExMX1NZU0NGR19USU1CUkVBS19MT0NLVVAgICAgICAgICAgU1lTQ0ZHX0NGR1IyX0xPQ0tVUF9MT0NLICAgICAgICAvKiE8IEVuYWJsZXMgYW5kIGxvY2tzIHRoZSBMT0NLVVAgKEhhcmRmYXVsdCkgb3V0cHV0IG9mIENvcnRleE0wIHdpdGggQnJlYWsgSW5wdXQgb2YgVElNeCAqLworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX1JDUl9QQUdFMCkKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VDX0NDTVNSQU1XUlAgU1lTQ0ZHIENDTSBTUkFNIFdSUAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UwICAgICAgICAgU1lTQ0ZHX1JDUl9QQUdFMCAgLyohPCBJQ09ERSBTUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAwICAqLworI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMSAgICAgICAgIFNZU0NGR19SQ1JfUEFHRTEgIC8qITwgSUNPREUgU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMSAgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTIgICAgICAgICBTWVNDRkdfUkNSX1BBR0UyICAvKiE8IElDT0RFIFNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDIgICovCisjZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UzICAgICAgICAgU1lTQ0ZHX1JDUl9QQUdFMyAgLyohPCBJQ09ERSBTUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAzICAqLworI2lmIGRlZmluZWQoU1lTQ0ZHX1JDUl9QQUdFNCkKKyNkZWZpbmUgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTQgICAgICAgICBTWVNDRkdfUkNSX1BBR0U0ICAvKiE8IElDT0RFIFNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDQgICovCisjZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0U1ICAgICAgICAgU1lTQ0ZHX1JDUl9QQUdFNSAgLyohPCBJQ09ERSBTUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSA1ICAqLworI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFNiAgICAgICAgIFNZU0NGR19SQ1JfUEFHRTYgIC8qITwgSUNPREUgU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgNiAgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTcgICAgICAgICBTWVNDRkdfUkNSX1BBR0U3ICAvKiE8IElDT0RFIFNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDcgICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKFNZU0NGR19SQ1JfUEFHRTgpCisjZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0U4ICAgICAgICAgU1lTQ0ZHX1JDUl9QQUdFOCAgLyohPCBJQ09ERSBTUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSA4ICAqLworI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFOSAgICAgICAgIFNZU0NGR19SQ1JfUEFHRTkgIC8qITwgSUNPREUgU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgOSAgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTEwICAgICAgICBTWVNDRkdfUkNSX1BBR0UxMCAvKiE8IElDT0RFIFNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDEwICovCisjZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UxMSAgICAgICAgU1lTQ0ZHX1JDUl9QQUdFMTEgLyohPCBJQ09ERSBTUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxMSAqLworI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMTIgICAgICAgIFNZU0NGR19SQ1JfUEFHRTEyIC8qITwgSUNPREUgU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMTIgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTEzICAgICAgICBTWVNDRkdfUkNSX1BBR0UxMyAvKiE8IElDT0RFIFNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDEzICovCisjZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UxNCAgICAgICAgU1lTQ0ZHX1JDUl9QQUdFMTQgLyohPCBJQ09ERSBTUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxNCAqLworI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMTUgICAgICAgIFNZU0NGR19SQ1JfUEFHRTE1IC8qITwgSUNPREUgU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMTUgKi8KKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFNZU0NGR19SQ1JfUEFHRTAgKi8KKworLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUNfVFJBQ0UgREJHTUNVIFRSQUNFIFBpbiBBc3NpZ25tZW50CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfREJHTUNVX1RSQUNFX05PTkUgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRSQUNFIHBpbnMgbm90IGFzc2lnbmVkIChkZWZhdWx0IHN0YXRlKSAqLworI2RlZmluZSBMTF9EQkdNQ1VfVFJBQ0VfQVNZTkNIICAgICAgICAgICAgIERCR01DVV9DUl9UUkFDRV9JT0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVFJBQ0UgcGluIGFzc2lnbm1lbnQgZm9yIEFzeW5jaHJvbm91cyBNb2RlICovCisjZGVmaW5lIExMX0RCR01DVV9UUkFDRV9TWU5DSF9TSVpFMSAgICAgICAgKERCR01DVV9DUl9UUkFDRV9JT0VOIHwgREJHTUNVX0NSX1RSQUNFX01PREVfMCkgLyohPCBUUkFDRSBwaW4gYXNzaWdubWVudCBmb3IgU3luY2hyb25vdXMgTW9kZSB3aXRoIGEgVFJBQ0VEQVRBIHNpemUgb2YgMSAqLworI2RlZmluZSBMTF9EQkdNQ1VfVFJBQ0VfU1lOQ0hfU0laRTIgICAgICAgIChEQkdNQ1VfQ1JfVFJBQ0VfSU9FTiB8IERCR01DVV9DUl9UUkFDRV9NT0RFXzEpIC8qITwgVFJBQ0UgcGluIGFzc2lnbm1lbnQgZm9yIFN5bmNocm9ub3VzIE1vZGUgd2l0aCBhIFRSQUNFREFUQSBzaXplIG9mIDIgKi8KKyNkZWZpbmUgTExfREJHTUNVX1RSQUNFX1NZTkNIX1NJWkU0ICAgICAgICAoREJHTUNVX0NSX1RSQUNFX0lPRU4gfCBEQkdNQ1VfQ1JfVFJBQ0VfTU9ERSkgICAvKiE8IFRSQUNFIHBpbiBhc3NpZ25tZW50IGZvciBTeW5jaHJvbm91cyBNb2RlIHdpdGggYSBUUkFDRURBVEEgc2l6ZSBvZiA0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19BUEIxX0dSUDFfU1RPUF9JUCBEQkdNQ1UgQVBCMSBHUlAxIFNUT1AgSVAKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTJfU1RPUCAgICAgIERCR01DVV9BUEIxX0ZaX0RCR19USU0yX1NUT1AgICAgICAgICAgLyohPCBUSU0yIGNvdW50ZXIgc3RvcHBlZCB3aGVuIGNvcmUgaXMgaGFsdGVkICovCisjaWYgZGVmaW5lZChEQkdNQ1VfQVBCMV9GWl9EQkdfVElNM19TVE9QKQorI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTNfU1RPUCAgICAgIERCR01DVV9BUEIxX0ZaX0RCR19USU0zX1NUT1AgICAgICAgICAgLyohPCBUSU0zIGNvdW50ZXIgc3RvcHBlZCB3aGVuIGNvcmUgaXMgaGFsdGVkICovCisjZW5kaWYgLypEQkdNQ1VfQVBCMV9GWl9EQkdfVElNM19TVE9QKi8KKyNpZiBkZWZpbmVkKERCR01DVV9BUEIxX0ZaX0RCR19USU00X1NUT1ApCisjZGVmaW5lIExMX0RCR01DVV9BUEIxX0dSUDFfVElNNF9TVE9QICAgICAgREJHTUNVX0FQQjFfRlpfREJHX1RJTTRfU1RPUCAgICAgICAgICAvKiE8IFRJTTQgY291bnRlciBzdG9wcGVkIHdoZW4gY29yZSBpcyBoYWx0ZWQgKi8KKyNlbmRpZiAvKkRCR01DVV9BUEIxX0ZaX0RCR19USU00X1NUT1AqLworI2lmIGRlZmluZWQoREJHTUNVX0FQQjFfRlpfREJHX1RJTTVfU1RPUCkKKyNkZWZpbmUgTExfREJHTUNVX0FQQjFfR1JQMV9USU01X1NUT1AgICAgICBEQkdNQ1VfQVBCMV9GWl9EQkdfVElNNV9TVE9QICAgICAgICAgIC8qITwgVElNNSBjb3VudGVyIHN0b3BwZWQgd2hlbiBjb3JlIGlzIGhhbHRlZCAqLworI2VuZGlmIC8qREJHTUNVX0FQQjFfRlpfREJHX1RJTTVfU1RPUCovCisjZGVmaW5lIExMX0RCR01DVV9BUEIxX0dSUDFfVElNNl9TVE9QICAgICAgREJHTUNVX0FQQjFfRlpfREJHX1RJTTZfU1RPUCAgICAgICAgICAvKiE8IFRJTTYgY291bnRlciBzdG9wcGVkIHdoZW4gY29yZSBpcyBoYWx0ZWQgKi8KKyNpZiBkZWZpbmVkKERCR01DVV9BUEIxX0ZaX0RCR19USU03X1NUT1ApCisjZGVmaW5lIExMX0RCR01DVV9BUEIxX0dSUDFfVElNN19TVE9QICAgICAgREJHTUNVX0FQQjFfRlpfREJHX1RJTTdfU1RPUCAgICAgICAgICAvKiE8IFRJTTcgY291bnRlciBzdG9wcGVkIHdoZW4gY29yZSBpcyBoYWx0ZWQgKi8KKyNlbmRpZiAvKkRCR01DVV9BUEIxX0ZaX0RCR19USU03X1NUT1AqLworI2lmIGRlZmluZWQoREJHTUNVX0FQQjFfRlpfREJHX1RJTTEyX1NUT1ApCisjZGVmaW5lIExMX0RCR01DVV9BUEIxX0dSUDFfVElNMTJfU1RPUCAgICAgREJHTUNVX0FQQjFfRlpfREJHX1RJTTEyX1NUT1AgICAgICAgICAvKiE8IFRJTTEyIGNvdW50ZXIgc3RvcHBlZCB3aGVuIGNvcmUgaXMgaGFsdGVkICovCisjZW5kaWYgLypEQkdNQ1VfQVBCMV9GWl9EQkdfVElNMTJfU1RPUCovCisjaWYgZGVmaW5lZChEQkdNQ1VfQVBCMV9GWl9EQkdfVElNMTNfU1RPUCkKKyNkZWZpbmUgTExfREJHTUNVX0FQQjFfR1JQMV9USU0xM19TVE9QICAgICBEQkdNQ1VfQVBCMV9GWl9EQkdfVElNMTNfU1RPUCAgICAgICAgIC8qITwgVElNMTMgY291bnRlciBzdG9wcGVkIHdoZW4gY29yZSBpcyBoYWx0ZWQgKi8KKyNlbmRpZiAvKkRCR01DVV9BUEIxX0ZaX0RCR19USU0xM19TVE9QKi8KKyNpZiBkZWZpbmVkKERCR01DVV9BUEIxX0ZaX0RCR19USU0xNF9TVE9QKQorI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTE0X1NUT1AgICAgIERCR01DVV9BUEIxX0ZaX0RCR19USU0xNF9TVE9QICAgICAgICAgLyohPCBUSU0xNCBjb3VudGVyIHN0b3BwZWQgd2hlbiBjb3JlIGlzIGhhbHRlZCAqLworI2VuZGlmIC8qREJHTUNVX0FQQjFfRlpfREJHX1RJTTE0X1NUT1AqLworI2lmIGRlZmluZWQoREJHTUNVX0FQQjFfRlpfREJHX1RJTTE4X1NUT1ApCisjZGVmaW5lIExMX0RCR01DVV9BUEIxX0dSUDFfVElNMThfU1RPUCAgICAgREJHTUNVX0FQQjFfRlpfREJHX1RJTTE4X1NUT1AgICAgICAgICAvKiE8IFRJTTE4IGNvdW50ZXIgc3RvcHBlZCB3aGVuIGNvcmUgaXMgaGFsdGVkICovCisjZW5kaWYgLypEQkdNQ1VfQVBCMV9GWl9EQkdfVElNMThfU1RPUCovCisjZGVmaW5lIExMX0RCR01DVV9BUEIxX0dSUDFfUlRDX1NUT1AgICAgICAgREJHTUNVX0FQQjFfRlpfREJHX1JUQ19TVE9QICAgICAgICAgICAvKiE8IFJUQyBjb3VudGVyIHN0b3BwZWQgd2hlbiBjb3JlIGlzIGhhbHRlZCAqLworI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX1dXREdfU1RPUCAgICAgIERCR01DVV9BUEIxX0ZaX0RCR19XV0RHX1NUT1AgICAgICAgICAgLyohPCBEZWJ1ZyBXaW5kb3cgV2F0Y2hkb2cgc3RvcHBlZCB3aGVuIENvcmUgaXMgaGFsdGVkICovCisjZGVmaW5lIExMX0RCR01DVV9BUEIxX0dSUDFfSVdER19TVE9QICAgICAgREJHTUNVX0FQQjFfRlpfREJHX0lXREdfU1RPUCAgICAgICAgICAvKiE8IERlYnVnIEluZGVwZW5kZW50IFdhdGNoZG9nIHN0b3BwZWQgd2hlbiBDb3JlIGlzIGhhbHRlZCAqLworI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX0kyQzFfU1RPUCAgICAgIERCR01DVV9BUEIxX0ZaX0RCR19JMkMxX1NNQlVTX1RJTUVPVVQgLyohPCBJMkMxIFNNQlVTIHRpbWVvdXQgbW9kZSBzdG9wcGVkIHdoZW4gQ29yZSBpcyBoYWx0ZWQgKi8KKyNpZiBkZWZpbmVkKERCR01DVV9BUEIxX0ZaX0RCR19JMkMyX1NNQlVTX1RJTUVPVVQpCisjZGVmaW5lIExMX0RCR01DVV9BUEIxX0dSUDFfSTJDMl9TVE9QICAgICAgREJHTUNVX0FQQjFfRlpfREJHX0kyQzJfU01CVVNfVElNRU9VVCAvKiE8IEkyQzIgU01CVVMgdGltZW91dCBtb2RlIHN0b3BwZWQgd2hlbiBDb3JlIGlzIGhhbHRlZCAqLworI2VuZGlmIC8qREJHTUNVX0FQQjFfRlpfREJHX0kyQzJfU01CVVNfVElNRU9VVCovCisjaWYgZGVmaW5lZChEQkdNQ1VfQVBCMV9GWl9EQkdfSTJDM19TTUJVU19USU1FT1VUKQorI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX0kyQzNfU1RPUCAgICAgIERCR01DVV9BUEIxX0ZaX0RCR19JMkMzX1NNQlVTX1RJTUVPVVQgLyohPCBJMkMzIFNNQlVTIHRpbWVvdXQgbW9kZSBzdG9wcGVkIHdoZW4gQ29yZSBpcyBoYWx0ZWQgKi8KKyNlbmRpZiAvKkRCR01DVV9BUEIxX0ZaX0RCR19JMkMzX1NNQlVTX1RJTUVPVVQqLworI2lmIGRlZmluZWQoREJHTUNVX0FQQjFfRlpfREJHX0NBTl9TVE9QKQorI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX0NBTl9TVE9QICAgICAgIERCR01DVV9BUEIxX0ZaX0RCR19DQU5fU1RPUCAgICAgICAgICAgIC8qITwgQ0FOIGRlYnVnIHN0b3BwZWQgd2hlbiBDb3JlIGlzIGhhbHRlZCAgKi8KKyNlbmRpZiAvKkRCR01DVV9BUEIxX0ZaX0RCR19DQU5fU1RPUCovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19BUEIyX0dSUDFfU1RPUF9JUCBEQkdNQ1UgQVBCMiBHUlAxIFNUT1AgSVAKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoREJHTUNVX0FQQjJfRlpfREJHX1RJTTFfU1RPUCkKKyNkZWZpbmUgTExfREJHTUNVX0FQQjJfR1JQMV9USU0xX1NUT1AgICAgICBEQkdNQ1VfQVBCMl9GWl9EQkdfVElNMV9TVE9QICAgLyohPCBUSU0xIGNvdW50ZXIgc3RvcHBlZCB3aGVuIGNvcmUgaXMgaGFsdGVkICovCisjZW5kaWYgLypEQkdNQ1VfQVBCMl9GWl9EQkdfVElNMV9TVE9QKi8KKyNpZiBkZWZpbmVkKERCR01DVV9BUEIyX0ZaX0RCR19USU04X1NUT1ApCisjZGVmaW5lIExMX0RCR01DVV9BUEIyX0dSUDFfVElNOF9TVE9QICAgICAgREJHTUNVX0FQQjJfRlpfREJHX1RJTThfU1RPUCAgIC8qITwgVElNOCBjb3VudGVyIHN0b3BwZWQgd2hlbiBjb3JlIGlzIGhhbHRlZCAqLworI2VuZGlmIC8qREJHTUNVX0FQQjJfRlpfREJHX1RJTThfU1RPUCovCisjZGVmaW5lIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMTVfU1RPUCAgICAgREJHTUNVX0FQQjJfRlpfREJHX1RJTTE1X1NUT1AgIC8qITwgVElNMTUgY291bnRlciBzdG9wcGVkIHdoZW4gY29yZSBpcyBoYWx0ZWQgKi8KKyNkZWZpbmUgTExfREJHTUNVX0FQQjJfR1JQMV9USU0xNl9TVE9QICAgICBEQkdNQ1VfQVBCMl9GWl9EQkdfVElNMTZfU1RPUCAgLyohPCBUSU0xNiBjb3VudGVyIHN0b3BwZWQgd2hlbiBjb3JlIGlzIGhhbHRlZCAqLworI2RlZmluZSBMTF9EQkdNQ1VfQVBCMl9HUlAxX1RJTTE3X1NUT1AgICAgIERCR01DVV9BUEIyX0ZaX0RCR19USU0xN19TVE9QICAvKiE8IFRJTTE3IGNvdW50ZXIgc3RvcHBlZCB3aGVuIGNvcmUgaXMgaGFsdGVkICovCisjaWYgZGVmaW5lZChEQkdNQ1VfQVBCMl9GWl9EQkdfVElNMTlfU1RPUCkKKyNkZWZpbmUgTExfREJHTUNVX0FQQjJfR1JQMV9USU0xOV9TVE9QICAgICBEQkdNQ1VfQVBCMl9GWl9EQkdfVElNMTlfU1RPUCAgLyohPCBUSU0xOSBjb3VudGVyIHN0b3BwZWQgd2hlbiBjb3JlIGlzIGhhbHRlZCAqLworI2VuZGlmIC8qREJHTUNVX0FQQjJfRlpfREJHX1RJTTE5X1NUT1AqLworI2lmIGRlZmluZWQoREJHTUNVX0FQQjJfRlpfREJHX1RJTTIwX1NUT1ApCisjZGVmaW5lIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMjBfU1RPUCAgICAgREJHTUNVX0FQQjJfRlpfREJHX1RJTTIwX1NUT1AgIC8qITwgVElNMjAgY291bnRlciBzdG9wcGVkIHdoZW4gY29yZSBpcyBoYWx0ZWQgKi8KKyNlbmRpZiAvKkRCR01DVV9BUEIyX0ZaX0RCR19USU0yMF9TVE9QKi8KKyNpZiBkZWZpbmVkKERCR01DVV9BUEIyX0ZaX0RCR19IUlRJTTFfU1RPUCkKKyNkZWZpbmUgTExfREJHTUNVX0FQQjJfR1JQMV9IUlRJTTFfU1RPUCAgICBEQkdNQ1VfQVBCMl9GWl9EQkdfSFJUSU0xX1NUT1AgLyohPCBIUlRJTTEgY291bnRlciBzdG9wcGVkIHdoZW4gY29yZSBpcyBoYWx0ZWQgKi8KKyNlbmRpZiAvKkRCR01DVV9BUEIyX0ZaX0RCR19IUlRJTTFfU1RPUCovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19MQVRFTkNZIEZMQVNIIExBVEVOQ1kKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9GTEFTSF9MQVRFTkNZXzAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgRkxBU0ggWmVybyBMYXRlbmN5IGN5Y2xlICovCisjZGVmaW5lIExMX0ZMQVNIX0xBVEVOQ1lfMSAgICAgICAgICAgICAgICAgRkxBU0hfQUNSX0xBVEVOQ1lfMCAgICAgLyohPCBGTEFTSCBPbmUgTGF0ZW5jeSBjeWNsZSAqLworI2RlZmluZSBMTF9GTEFTSF9MQVRFTkNZXzIgICAgICAgICAgICAgICAgIEZMQVNIX0FDUl9MQVRFTkNZXzEgICAgIC8qITwgRkxBU0ggVHdvIExhdGVuY3kgY3ljbGVzICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTWVNURU1fTExfRXhwb3J0ZWRfRnVuY3Rpb25zIFNZU1RFTSBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FRl9TWVNDRkcgU1lTQ0ZHCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgbWVtb3J5IG1hcHBpbmcgYXQgYWRkcmVzcyAweDAwMDAwMDAwCisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgTUVNX01PREUgICAgICBMTF9TWVNDRkdfU2V0UmVtYXBNZW1vcnkKKyAgKiBAcGFyYW0gIE1lbW9yeSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19SRU1BUF9GTEFTSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19SRU1BUF9TWVNURU1GTEFTSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19SRU1BUF9TUkFNCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1JFTUFQX0ZNQyAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX1NldFJlbWFwTWVtb3J5KHVpbnQzMl90IE1lbW9yeSkKK3sKKyAgTU9ESUZZX1JFRyhTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfTUVNX01PREUsIE1lbW9yeSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IG1lbW9yeSBtYXBwaW5nIGF0IGFkZHJlc3MgMHgwMDAwMDAwMAorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIE1FTV9NT0RFICAgICAgTExfU1lTQ0ZHX0dldFJlbWFwTWVtb3J5CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19SRU1BUF9GTEFTSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19SRU1BUF9TWVNURU1GTEFTSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19SRU1BUF9TUkFNCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1JFTUFQX0ZNQyAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19HZXRSZW1hcE1lbW9yeSh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfTUVNX01PREUpKTsKK30KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IzX1NQSTFfUlhfRE1BX1JNUCkKKy8qKgorICAqIEBicmllZiAgU2V0IERNQSByZXF1ZXN0IHJlbWFwcGluZyBiaXRzIGZvciBTUEkKKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMyBTUEkxX1JYX0RNQV9STVAgIExMX1NZU0NGR19TZXRSZW1hcERNQV9TUElcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IzIFNQSTFfVFhfRE1BX1JNUCAgTExfU1lTQ0ZHX1NldFJlbWFwRE1BX1NQSQorICAqIEBwYXJhbSAgUmVtYXAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfU1BJMVJYX1JNUF9ETUExX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19TUEkxUlhfUk1QX0RNQTFfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NQSTFSWF9STVBfRE1BMV9DSDYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfU1BJMVRYX1JNUF9ETUExX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19TUEkxVFhfUk1QX0RNQTFfQ0g1CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NQSTFUWF9STVBfRE1BMV9DSDcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19TZXRSZW1hcERNQV9TUEkodWludDMyX3QgUmVtYXApCit7CisgIE1PRElGWV9SRUcoU1lTQ0ZHLT5DRkdSMywgKFJlbWFwID4+IDE2VSksIChSZW1hcCAmIDB4MDAwMEZGRkYpKTsKK30KKyNlbmRpZiAvKiBTWVNDRkdfQ0ZHUjNfU1BJMV9SWF9ETUFfUk1QICovCisKKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSM19JMkMxX1JYX0RNQV9STVApCisvKioKKyAgKiBAYnJpZWYgIFNldCBETUEgcmVxdWVzdCByZW1hcHBpbmcgYml0cyBmb3IgSTJDCisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjMgSTJDMV9SWF9ETUFfUk1QICBMTF9TWVNDRkdfU2V0UmVtYXBETUFfSTJDXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMyBJMkMxX1RYX0RNQV9STVAgIExMX1NZU0NGR19TZXRSZW1hcERNQV9JMkMKKyAgKiBAcGFyYW0gIFJlbWFwIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0kyQzFSWF9STVBfRE1BMV9DSDcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDMVJYX1JNUF9ETUExX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JMkMxUlhfUk1QX0RNQTFfQ0g1CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0kyQzFUWF9STVBfRE1BMV9DSDYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDMVRYX1JNUF9ETUExX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JMkMxVFhfUk1QX0RNQTFfQ0g0CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfU2V0UmVtYXBETUFfSTJDKHVpbnQzMl90IFJlbWFwKQoreworICBNT0RJRllfUkVHKFNZU0NGRy0+Q0ZHUjMsIChSZW1hcCA+PiAxNlUpLCAoUmVtYXAgJiAweDAwMDBGRkZGKSk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0NGR1IzX0kyQzFfUlhfRE1BX1JNUCAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfQ0ZHUjFfQURDMjRfRE1BX1JNUCkgfHwgZGVmaW5lZChTWVNDRkdfQ0ZHUjNfQURDMl9ETUFfUk1QKQorLyoqCisgICogQGJyaWVmICBTZXQgRE1BIHJlcXVlc3QgcmVtYXBwaW5nIGJpdHMgZm9yIEFEQworICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEFEQzI0X0RNQV9STVAgIExMX1NZU0NGR19TZXRSZW1hcERNQV9BRENcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IzIEFEQzJfRE1BX1JNUCAgIExMX1NZU0NGR19TZXRSZW1hcERNQV9BREMKKyAgKiBAcGFyYW0gIFJlbWFwIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0FEQzI0X1JNUF9ETUEyX0NIMTIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0FEQzI0X1JNUF9ETUEyX0NIMzQgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0FEQzJfUk1QX0RNQTFfQ0gyICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19BREMyX1JNUF9ETUExX0NINCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQURDMl9STVBfRE1BMiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQURDMl9STVBfRE1BMSAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX1NldFJlbWFwRE1BX0FEQyh1aW50MzJfdCBSZW1hcCkKK3sKKyAgX19JTyB1aW50MzJfdCAqcmVnID0gKF9fSU8gdWludDMyX3QgKikodWludDMyX3QpKFNZU0NGR19CQVNFICsgKFJlbWFwID4+IDI0VSkpOyAKKyAgTU9ESUZZX1JFRygqcmVnLCAoUmVtYXAgJiAweDAwRkYwMDAwVSkgPj4gOFUsIChSZW1hcCAmIDB4MDAwMEZGRkZVKSk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0NGR1IxX0FEQzI0X0RNQV9STVAgfHwgU1lTQ0ZHX0NGR1IzX0FEQzJfRE1BX1JNUCAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBETUEgcmVxdWVzdCByZW1hcHBpbmcgYml0cyBmb3IgREFDCisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgVElNNkRBQzFDaDFfRE1BX1JNUCAgTExfU1lTQ0ZHX1NldFJlbWFwRE1BX0RBQ1xuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjEgREFDMkNoMV9ETUFfUk1QICAgICAgTExfU1lTQ0ZHX1NldFJlbWFwRE1BX0RBQworICAqIEBwYXJhbSAgUmVtYXAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfREFDMV9DSDFfUk1QX0RNQTJfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0RBQzFfQ0gxX1JNUF9ETUExX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19EQUMxX09VVDJfUk1QX0RNQTJfQ0g0ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19EQUMxX09VVDJfUk1QX0RNQTFfQ0g0ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19EQUMyX09VVDFfUk1QX0RNQTJfQ0g1ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19EQUMyX09VVDFfUk1QX0RNQTFfQ0g1ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19EQUMyX0NIMV9STVBfTk8gKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0RBQzJfQ0gxX1JNUF9ETUExX0NINSAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX1NldFJlbWFwRE1BX0RBQyh1aW50MzJfdCBSZW1hcCkKK3sKKyAgTU9ESUZZX1JFRyhTWVNDRkctPkNGR1IxLCAoUmVtYXAgJiAweDAwRkYwMDAwVSkgPj4gOFUsIChSZW1hcCAmIDB4MDAwMEZGMDBVKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IERNQSByZXF1ZXN0IHJlbWFwcGluZyBiaXRzIGZvciBUSU0KKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMSBUSU0xNl9ETUFfUk1QICAgICAgICBMTF9TWVNDRkdfU2V0UmVtYXBETUFfVElNXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMSBUSU0xN19ETUFfUk1QICAgICAgICBMTF9TWVNDRkdfU2V0UmVtYXBETUFfVElNXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMSBUSU02REFDMUNoMV9ETUFfUk1QICBMTF9TWVNDRkdfU2V0UmVtYXBETUFfVElNXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMSBUSU03REFDMUNoMl9ETUFfUk1QICBMTF9TWVNDRkdfU2V0UmVtYXBETUFfVElNXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMSBUSU0xOERBQzJDaDFfRE1BX1JNUCBMTF9TWVNDRkdfU2V0UmVtYXBETUFfVElNCisgICogQHBhcmFtICBSZW1hcCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfVElNMTZfUk1QX0RNQTFfQ0gzIG9yIEByZWYgTExfU1lTQ0ZHX1RJTTE2X1JNUF9ETUExX0NINgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19USU0xN19STVBfRE1BMV9DSDEgb3IgQHJlZiBMTF9TWVNDRkdfVElNMTdfUk1QX0RNQTFfQ0g3CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1RJTTZfUk1QX0RNQTJfQ0gzIG9yIEByZWYgTExfU1lTQ0ZHX1RJTTZfUk1QX0RNQTFfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1RJTTdfUk1QX0RNQTJfQ0g0IG9yIEByZWYgTExfU1lTQ0ZHX1RJTTdfUk1QX0RNQTFfQ0g0ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19USU0xOF9STVBfRE1BMl9DSDUgb3IgQHJlZiBMTF9TWVNDRkdfVElNMThfUk1QX0RNQTFfQ0g1ICgqKQorICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfU2V0UmVtYXBETUFfVElNKHVpbnQzMl90IFJlbWFwKQoreworICBNT0RJRllfUkVHKFNZU0NGRy0+Q0ZHUjEsIChSZW1hcCAmIDB4MDBGRjAwMDBVKSA+PiA4VSwgKFJlbWFwICYgMHgwMDAwRkYwMFUpKTsKK30KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IxX1RJTTFfSVRSM19STVApIHx8IGRlZmluZWQoU1lTQ0ZHX0NGR1IxX0VOQ09ERVJfTU9ERSkKKy8qKgorICAqIEBicmllZiAgU2V0IFRpbWVyIGlucHV0IHJlbWFwCisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgVElNMV9JVFIzX1JNUCAgTExfU1lTQ0ZHX1NldFJlbWFwSW5wdXRfVElNXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMSBFTkNPREVSX01PREUgICBMTF9TWVNDRkdfU2V0UmVtYXBJbnB1dF9USU0KKyAgKiBAcGFyYW0gIFJlbWFwIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1RJTTFfSVRSM19STVBfVElNNF9UUkdPICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19USU0xX0lUUjNfUk1QX1RJTTE3X09DICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19USU0xNV9FTkNPREVNT0RFX05PUkVESVJFQ1RJT04gKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1RJTTE1X0VOQ09ERU1PREVfVElNMiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfVElNMTVfRU5DT0RFTU9ERV9USU0zICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19USU0xNV9FTkNPREVNT0RFX1RJTTQgKCopCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19TZXRSZW1hcElucHV0X1RJTSh1aW50MzJfdCBSZW1hcCkKK3sKKyAgIE1PRElGWV9SRUcoU1lTQ0ZHLT5DRkdSMSwgKFJlbWFwICYgMHhGRjAwRkYwMFUpID4+IDhVLCAoUmVtYXAgJiAweDAwRkYwMEZGVSkpOworfQorI2VuZGlmIC8qIFNZU0NGR19DRkdSMV9USU0xX0lUUjNfUk1QIHx8IFNZU0NGR19DRkdSMV9FTkNPREVSX01PREUgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1I0X0FEQzEyX0VYVDJfUk1QKQorLyoqCisgICogQGJyaWVmICBTZXQgQURDIFRyaWdnZXIgcmVtYXAKKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSNCBBREMxMl9FWFQyX1JNUCAgICBMTF9TWVNDRkdfU2V0UmVtYXBUcmlnZ2VyX0FEQ1xuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjQgQURDMTJfRVhUM19STVAgICAgTExfU1lTQ0ZHX1NldFJlbWFwVHJpZ2dlcl9BRENcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1I0IEFEQzEyX0VYVDVfUk1QICAgIExMX1NZU0NGR19TZXRSZW1hcFRyaWdnZXJfQURDXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSNCBBREMxMl9FWFQxM19STVAgICBMTF9TWVNDRkdfU2V0UmVtYXBUcmlnZ2VyX0FEQ1xuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjQgQURDMTJfRVhUMTVfUk1QICAgTExfU1lTQ0ZHX1NldFJlbWFwVHJpZ2dlcl9BRENcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1I0IEFEQzEyX0pFWFQzX1JNUCAgIExMX1NZU0NGR19TZXRSZW1hcFRyaWdnZXJfQURDXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSNCBBREMxMl9KRVhUNl9STVAgICBMTF9TWVNDRkdfU2V0UmVtYXBUcmlnZ2VyX0FEQ1xuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjQgQURDMTJfSkVYVDEzX1JNUCAgTExfU1lTQ0ZHX1NldFJlbWFwVHJpZ2dlcl9BRENcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1I0IEFEQzM0X0VYVDVfUk1QICAgIExMX1NZU0NGR19TZXRSZW1hcFRyaWdnZXJfQURDXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSNCBBREMzNF9FWFQ2X1JNUCAgICBMTF9TWVNDRkdfU2V0UmVtYXBUcmlnZ2VyX0FEQ1xuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjQgQURDMzRfRVhUMTVfUk1QICAgTExfU1lTQ0ZHX1NldFJlbWFwVHJpZ2dlcl9BRENcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1I0IEFEQzM0X0pFWFQ1X1JNUCAgIExMX1NZU0NGR19TZXRSZW1hcFRyaWdnZXJfQURDXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSNCBBREMzNF9KRVhUMTFfUk1QICBMTF9TWVNDRkdfU2V0UmVtYXBUcmlnZ2VyX0FEQ1xuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjQgQURDMzRfSkVYVDE0X1JNUCAgTExfU1lTQ0ZHX1NldFJlbWFwVHJpZ2dlcl9BREMKKyAgKiBAcGFyYW0gIFJlbWFwIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0FEQzEyX0VYVDJfUk1QX1RJTTFfQ0MzCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0FEQzEyX0VYVDJfUk1QX1RJTTIwX1RSR08KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQURDMTJfRVhUM19STVBfVElNMl9DQzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQURDMTJfRVhUM19STVBfVElNMjBfVFJHTzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQURDMTJfRVhUNV9STVBfVElNNF9DQzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQURDMTJfRVhUNV9STVBfVElNMjBfQ0MxCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0FEQzEyX0VYVDEzX1JNUF9USU02X1RSR08KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQURDMTJfRVhUMTNfUk1QX1RJTTIwX0NDMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19BREMxMl9FWFQxNV9STVBfVElNM19DQzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQURDMTJfRVhUMTVfUk1QX1RJTTIwX0NDMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19BREMxMl9KRVhUM19STVBfVElNMl9DQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQURDMTJfSkVYVDNfUk1QX1RJTTIwX1RSR08KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQURDMTJfSkVYVDZfUk1QX0VYVElfTElORV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19BREMxMl9KRVhUNl9STVBfVElNMjBfVFJHTzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQURDMTJfSkVYVDEzX1JNUF9USU0zX0NDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19BREMxMl9KRVhUMTNfUk1QX1RJTTIwX0NDNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19BREMzNF9FWFQ1X1JNUF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19BREMzNF9FWFQ1X1JNUF9USU0yMF9UUkdPCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0FEQzM0X0VYVDZfUk1QX1RJTTRfQ0MxCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0FEQzM0X0VYVDZfUk1QX1RJTTIwX1RSR08yCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0FEQzM0X0VYVDE1X1JNUF9USU0yX0NDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19BREMzNF9FWFQxNV9STVBfVElNMjBfQ0MxCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0FEQzM0X0pFWFQ1X1JNUF9USU00X0NDMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19BREMzNF9KRVhUNV9STVBfVElNMjBfVFJHTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19BREMzNF9KRVhUMTFfUk1QX1RJTTFfQ0MzCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0FEQzM0X0pFWFQxMV9STVBfVElNMjBfVFJHTzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQURDMzRfSkVYVDE0X1JNUF9USU03X1RSR08KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQURDMzRfSkVYVDE0X1JNUF9USU0yMF9DQzIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19TZXRSZW1hcFRyaWdnZXJfQURDKHVpbnQzMl90IFJlbWFwKQoreworICBNT0RJRllfUkVHKFNZU0NGRy0+Q0ZHUjQsIChSZW1hcCAmIDB4RkZGRjAwMDBVKSA+PiAxNlUsIChSZW1hcCAmIDB4MDAwMEZGRkZVKSk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0NGR1I0X0FEQzEyX0VYVDJfUk1QICovCisKKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSMV9EQUMxX1RSSUcxX1JNUCkgfHwgZGVmaW5lZChTWVNDRkdfQ0ZHUjNfVFJJR0dFUl9STVApCisvKioKKyAgKiBAYnJpZWYgIFNldCBEQUMgVHJpZ2dlciByZW1hcAorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIERBQzFfVFJJRzFfUk1QICBMTF9TWVNDRkdfU2V0UmVtYXBUcmlnZ2VyX0RBQ1xuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjMgREFDMV9UUkczX1JNUCAgIExMX1NZU0NGR19TZXRSZW1hcFRyaWdnZXJfREFDXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMyBEQUMxX1RSRzVfUk1QICAgTExfU1lTQ0ZHX1NldFJlbWFwVHJpZ2dlcl9EQUMKKyAgKiBAcGFyYW0gIFJlbWFwIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0RBQzFfVFJJRzFfUk1QX1RJTThfVFJHTyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfREFDMV9UUklHMV9STVBfVElNM19UUkdPICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19EQUMxX1RSSUczX1JNUF9USU0xNV9UUkdPICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19EQUMxX1RSSUczX1JNUF9IUlRJTTFfREFDMV9UUklHMSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfREFDMV9UUklHNV9STVBfTk8gKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0RBQzFfVFJJRzVfUk1QX0hSVElNMV9EQUMxX1RSSUcyICgqKQorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX1NldFJlbWFwVHJpZ2dlcl9EQUModWludDMyX3QgUmVtYXApCit7CisgIF9fSU8gdWludDMyX3QgKnJlZyA9IChfX0lPIHVpbnQzMl90ICopKHVpbnQzMl90KShTWVNDRkdfQkFTRSArIChSZW1hcCA+PiAyNFUpKTsgCisgIE1PRElGWV9SRUcoKnJlZywgKFJlbWFwICYgMHgwMEYwMEYwMFUpID4+IDRVLCAoUmVtYXAgJiAweDAwMEYwMEYwVSkpOworfQorI2VuZGlmIC8qIFNZU0NGR19DRkdSMV9EQUMxX1RSSUcxX1JNUCB8fCBTWVNDRkdfQ0ZHUjNfVFJJR0dFUl9STVAgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IxX1VTQl9JVF9STVApCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBVU0IgaW50ZXJydXB0IHJlbWFwCisgICogQG5vdGUgIFJlbWFwIHRoZSBVU0IgaW50ZXJydXB0cyAoVVNCX0hQLCBVU0JfTFAgYW5kIFVTQl9XS1VQKSBvbiBpbnRlcnJ1cHQgbGluZXMgNzQsIDc1IGFuZCA3NgorICAqIHJlc3BlY3RpdmVseQorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIFVTQl9JVF9STVAgICAgTExfU1lTQ0ZHX0VuYWJsZVJlbWFwSVRfVVNCCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfRW5hYmxlUmVtYXBJVF9VU0Iodm9pZCkKK3sKKyAgU0VUX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfVVNCX0lUX1JNUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBVU0IgaW50ZXJydXB0IHJlbWFwCisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgVVNCX0lUX1JNUCAgICBMTF9TWVNDRkdfRGlzYWJsZVJlbWFwSVRfVVNCCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfRGlzYWJsZVJlbWFwSVRfVVNCKHZvaWQpCit7CisgIENMRUFSX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfVVNCX0lUX1JNUCk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0NGR1IxX1VTQl9JVF9STVAgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IxX1ZCQVQpCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBWQkFUIG1vbml0b3JpbmcgKHRvIGVuYWJsZSB0aGUgcG93ZXIgc3dpdGNoIHRvIGRlbGl2ZXIgVkJBVCB2b2x0YWdlIG9uIEFEQyBjaGFubmVsIDE4IGlucHV0KQorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIFZCQVQgICAgICAgICAgTExfU1lTQ0ZHX0VuYWJsZVZCQVRNb25pdG9yaW5nCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfRW5hYmxlVkJBVE1vbml0b3Jpbmcodm9pZCkKK3sKKyAgU0VUX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfVkJBVCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBWQkFUIG1vbml0b3JpbmcKKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMSBWQkFUICAgICAgICAgIExMX1NZU0NGR19EaXNhYmxlVkJBVE1vbml0b3JpbmcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19EaXNhYmxlVkJBVE1vbml0b3Jpbmcodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9WQkFUKTsKK30KKyNlbmRpZiAvKiBTWVNDRkdfQ0ZHUjFfVkJBVCAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgSTJDIGZhc3QgbW9kZSBwbHVzIGRyaXZpbmcgY2FwYWJpbGl0eS4KKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMSBJMkNfUEI2X0ZNUCAgIExMX1NZU0NGR19FbmFibGVGYXN0TW9kZVBsdXNcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IxIEkyQ19QQjdfRk1QICAgTExfU1lTQ0ZHX0VuYWJsZUZhc3RNb2RlUGx1c1xuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjEgSTJDX1BCOF9GTVAgICBMTF9TWVNDRkdfRW5hYmxlRmFzdE1vZGVQbHVzXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMSBJMkNfUEI5X0ZNUCAgIExMX1NZU0NGR19FbmFibGVGYXN0TW9kZVBsdXNcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IxIEkyQzFfRk1QICAgICAgTExfU1lTQ0ZHX0VuYWJsZUZhc3RNb2RlUGx1c1xuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjEgSTJDMl9GTVAgICAgICBMTF9TWVNDRkdfRW5hYmxlRmFzdE1vZGVQbHVzXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMSBJMkMzX0ZNUCAgICAgIExMX1NZU0NGR19FbmFibGVGYXN0TW9kZVBsdXMKKyAgKiBAcGFyYW0gIENvbmZpZ0Zhc3RNb2RlUGx1cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19JMkMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfSTJDMiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19JMkMzICgqKQorICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfRW5hYmxlRmFzdE1vZGVQbHVzKHVpbnQzMl90IENvbmZpZ0Zhc3RNb2RlUGx1cykKK3sKKyAgU0VUX0JJVChTWVNDRkctPkNGR1IxLCBDb25maWdGYXN0TW9kZVBsdXMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIEkyQyBmYXN0IG1vZGUgcGx1cyBkcml2aW5nIGNhcGFiaWxpdHkuCisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgSTJDX1BCNl9GTVAgICBMTF9TWVNDRkdfRGlzYWJsZUZhc3RNb2RlUGx1c1xuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjEgSTJDX1BCN19GTVAgICBMTF9TWVNDRkdfRGlzYWJsZUZhc3RNb2RlUGx1c1xuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjEgSTJDX1BCOF9GTVAgICBMTF9TWVNDRkdfRGlzYWJsZUZhc3RNb2RlUGx1c1xuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjEgSTJDX1BCOV9GTVAgICBMTF9TWVNDRkdfRGlzYWJsZUZhc3RNb2RlUGx1c1xuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjEgSTJDMV9GTVAgICAgICBMTF9TWVNDRkdfRGlzYWJsZUZhc3RNb2RlUGx1c1xuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjEgSTJDMl9GTVAgICAgICBMTF9TWVNDRkdfRGlzYWJsZUZhc3RNb2RlUGx1c1xuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjEgSTJDM19GTVAgICAgICBMTF9TWVNDRkdfRGlzYWJsZUZhc3RNb2RlUGx1cworICAqIEBwYXJhbSAgQ29uZmlnRmFzdE1vZGVQbHVzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX1BCNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX1BCNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX1BCOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX1BCOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX0kyQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19JMkMyICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX0kyQzMgKCopCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19EaXNhYmxlRmFzdE1vZGVQbHVzKHVpbnQzMl90IENvbmZpZ0Zhc3RNb2RlUGx1cykKK3sKKyAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjEsIENvbmZpZ0Zhc3RNb2RlUGx1cyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEZsb2F0aW5nIFBvaW50IFVuaXQgSW52YWxpZCBvcGVyYXRpb24gSW50ZXJydXB0CisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgRlBVX0lFXzAgICAgICBMTF9TWVNDRkdfRW5hYmxlSVRfRlBVX0lPQworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0VuYWJsZUlUX0ZQVV9JT0Modm9pZCkKK3sKKyAgU0VUX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzApOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBGbG9hdGluZyBQb2ludCBVbml0IERpdmlkZS1ieS16ZXJvIEludGVycnVwdAorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEZQVV9JRV8xICAgICAgTExfU1lTQ0ZHX0VuYWJsZUlUX0ZQVV9EWkMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19FbmFibGVJVF9GUFVfRFpDKHZvaWQpCit7CisgIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8xKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRmxvYXRpbmcgUG9pbnQgVW5pdCBVbmRlcmZsb3cgSW50ZXJydXB0CisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgRlBVX0lFXzIgICAgICBMTF9TWVNDRkdfRW5hYmxlSVRfRlBVX1VGQworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0VuYWJsZUlUX0ZQVV9VRkModm9pZCkKK3sKKyAgU0VUX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBGbG9hdGluZyBQb2ludCBVbml0IE92ZXJmbG93IEludGVycnVwdAorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEZQVV9JRV8zICAgICAgTExfU1lTQ0ZHX0VuYWJsZUlUX0ZQVV9PRkMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19FbmFibGVJVF9GUFVfT0ZDKHZvaWQpCit7CisgIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8zKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRmxvYXRpbmcgUG9pbnQgVW5pdCBJbnB1dCBkZW5vcm1hbCBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMSBGUFVfSUVfNCAgICAgIExMX1NZU0NGR19FbmFibGVJVF9GUFVfSURDCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfRW5hYmxlSVRfRlBVX0lEQyh2b2lkKQoreworICBTRVRfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9GUFVfSUVfNCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEZsb2F0aW5nIFBvaW50IFVuaXQgSW5leGFjdCBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMSBGUFVfSUVfNSAgICAgIExMX1NZU0NGR19FbmFibGVJVF9GUFVfSVhDCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfRW5hYmxlSVRfRlBVX0lYQyh2b2lkKQoreworICBTRVRfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9GUFVfSUVfNSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBGbG9hdGluZyBQb2ludCBVbml0IEludmFsaWQgb3BlcmF0aW9uIEludGVycnVwdAorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEZQVV9JRV8wICAgICAgTExfU1lTQ0ZHX0Rpc2FibGVJVF9GUFVfSU9DCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfRGlzYWJsZUlUX0ZQVV9JT0Modm9pZCkKK3sKKyAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9GUFVfSUVfMCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBGbG9hdGluZyBQb2ludCBVbml0IERpdmlkZS1ieS16ZXJvIEludGVycnVwdAorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEZQVV9JRV8xICAgICAgTExfU1lTQ0ZHX0Rpc2FibGVJVF9GUFVfRFpDCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfRGlzYWJsZUlUX0ZQVV9EWkModm9pZCkKK3sKKyAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9GUFVfSUVfMSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBGbG9hdGluZyBQb2ludCBVbml0IFVuZGVyZmxvdyBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMSBGUFVfSUVfMiAgICAgIExMX1NZU0NGR19EaXNhYmxlSVRfRlBVX1VGQworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0Rpc2FibGVJVF9GUFVfVUZDKHZvaWQpCit7CisgIENMRUFSX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRmxvYXRpbmcgUG9pbnQgVW5pdCBPdmVyZmxvdyBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMSBGUFVfSUVfMyAgICAgIExMX1NZU0NGR19EaXNhYmxlSVRfRlBVX09GQworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0Rpc2FibGVJVF9GUFVfT0ZDKHZvaWQpCit7CisgIENMRUFSX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRmxvYXRpbmcgUG9pbnQgVW5pdCBJbnB1dCBkZW5vcm1hbCBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMSBGUFVfSUVfNCAgICAgIExMX1NZU0NGR19EaXNhYmxlSVRfRlBVX0lEQworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0Rpc2FibGVJVF9GUFVfSURDKHZvaWQpCit7CisgIENMRUFSX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRmxvYXRpbmcgUG9pbnQgVW5pdCBJbmV4YWN0IEludGVycnVwdAorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEZQVV9JRV81ICAgICAgTExfU1lTQ0ZHX0Rpc2FibGVJVF9GUFVfSVhDCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfRGlzYWJsZUlUX0ZQVV9JWEModm9pZCkKK3sKKyAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9GUFVfSUVfNSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgRmxvYXRpbmcgUG9pbnQgVW5pdCBJbnZhbGlkIG9wZXJhdGlvbiBJbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgRlBVX0lFXzAgICAgICBMTF9TWVNDRkdfSXNFbmFibGVkSVRfRlBVX0lPQworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0VuYWJsZWRJVF9GUFVfSU9DKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8wKSA9PSAoU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8wKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgRmxvYXRpbmcgUG9pbnQgVW5pdCBEaXZpZGUtYnktemVybyBJbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgRlBVX0lFXzEgICAgICBMTF9TWVNDRkdfSXNFbmFibGVkSVRfRlBVX0RaQworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0VuYWJsZWRJVF9GUFVfRFpDKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8xKSA9PSAoU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8xKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgRmxvYXRpbmcgUG9pbnQgVW5pdCBVbmRlcmZsb3cgSW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEZQVV9JRV8yICAgICAgTExfU1lTQ0ZHX0lzRW5hYmxlZElUX0ZQVV9VRkMKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNFbmFibGVkSVRfRlBVX1VGQyh2b2lkKQoreworICByZXR1cm4gKFJFQURfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9GUFVfSUVfMikgPT0gKFNZU0NGR19DRkdSMV9GUFVfSUVfMikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEZsb2F0aW5nIFBvaW50IFVuaXQgT3ZlcmZsb3cgSW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEZQVV9JRV8zICAgICAgTExfU1lTQ0ZHX0lzRW5hYmxlZElUX0ZQVV9PRkMKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNFbmFibGVkSVRfRlBVX09GQyh2b2lkKQoreworICByZXR1cm4gKFJFQURfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9GUFVfSUVfMykgPT0gKFNZU0NGR19DRkdSMV9GUFVfSUVfMykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEZsb2F0aW5nIFBvaW50IFVuaXQgSW5wdXQgZGVub3JtYWwgSW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEZQVV9JRV80ICAgICAgTExfU1lTQ0ZHX0lzRW5hYmxlZElUX0ZQVV9JREMKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNFbmFibGVkSVRfRlBVX0lEQyh2b2lkKQoreworICByZXR1cm4gKFJFQURfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9GUFVfSUVfNCkgPT0gKFNZU0NGR19DRkdSMV9GUFVfSUVfNCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEZsb2F0aW5nIFBvaW50IFVuaXQgSW5leGFjdCBJbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgRlBVX0lFXzUgICAgICBMTF9TWVNDRkdfSXNFbmFibGVkSVRfRlBVX0lYQworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0VuYWJsZWRJVF9GUFVfSVhDKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV81KSA9PSAoU1lTQ0ZHX0NGR1IxX0ZQVV9JRV81KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHNvdXJjZSBpbnB1dCBmb3IgdGhlIEVYVEkgZXh0ZXJuYWwgaW50ZXJydXB0LgorICAqIEBybXRvbGwgU1lTQ0ZHX0VYVElDUjEgRVhUSTAgICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMSBFWFRJMSAgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IxIEVYVEkyICAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjEgRVhUSTMgICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMSBFWFRJNCAgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IxIEVYVEk1ICAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjEgRVhUSTYgICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMSBFWFRJNyAgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IxIEVYVEk4ICAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjEgRVhUSTkgICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMSBFWFRJMTAgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IxIEVYVEkxMSAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjEgRVhUSTEyICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMSBFWFRJMTMgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IxIEVYVEkxNCAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjEgRVhUSTE1ICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMiBFWFRJMCAgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IyIEVYVEkxICAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjIgRVhUSTIgICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMiBFWFRJMyAgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IyIEVYVEk0ICAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjIgRVhUSTUgICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMiBFWFRJNiAgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IyIEVYVEk3ICAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjIgRVhUSTggICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMiBFWFRJOSAgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IyIEVYVEkxMCAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjIgRVhUSTExICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMiBFWFRJMTIgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IyIEVYVEkxMyAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjIgRVhUSTE0ICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMiBFWFRJMTUgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IzIEVYVEkwICAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjMgRVhUSTEgICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMyBFWFRJMiAgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IzIEVYVEkzICAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjMgRVhUSTQgICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMyBFWFRJNSAgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IzIEVYVEk2ICAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjMgRVhUSTcgICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMyBFWFRJOCAgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IzIEVYVEk5ICAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjMgRVhUSTEwICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMyBFWFRJMTEgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IzIEVYVEkxMiAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjMgRVhUSTEzICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMyBFWFRJMTQgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IzIEVYVEkxNSAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjQgRVhUSTAgICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSNCBFWFRJMSAgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1I0IEVYVEkyICAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjQgRVhUSTMgICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSNCBFWFRJNCAgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1I0IEVYVEk1ICAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjQgRVhUSTYgICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSNCBFWFRJNyAgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1I0IEVYVEk4ICAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjQgRVhUSTkgICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSNCBFWFRJMTAgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1I0IEVYVEkxMSAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjQgRVhUSTEyICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSNCBFWFRJMTMgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1I0IEVYVEkxNCAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjQgRVhUSTE1ICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZQorICAqIEBwYXJhbSAgUG9ydCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX1BPUlRBCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfUE9SVEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9QT1JUQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX1BPUlRECisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfUE9SVEUgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfUE9SVEYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9QT1JURyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9QT1JUSCAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEBwYXJhbSAgTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUwCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUzCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkU2CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkU5CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTExCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTE1CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZSh1aW50MzJfdCBQb3J0LCB1aW50MzJfdCBMaW5lKQoreworICBNT0RJRllfUkVHKFNZU0NGRy0+RVhUSUNSW0xpbmUgJiAweEZGXSwgKExpbmUgPj4gMTZVKSwgUG9ydCA8PCBQT1NJVElPTl9WQUwoKExpbmUgPj4gMTZVKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgY29uZmlndXJlZCBkZWZpbmVkIGZvciBzcGVjaWZpYyBFWFRJIExpbmUKKyAgKiBAcm10b2xsIFNZU0NGR19FWFRJQ1IxIEVYVEkwICAgICAgICAgTExfU1lTQ0ZHX0dldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjEgRVhUSTEgICAgICAgICBMTF9TWVNDRkdfR2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMSBFWFRJMiAgICAgICAgIExMX1NZU0NGR19HZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IxIEVYVEkzICAgICAgICAgTExfU1lTQ0ZHX0dldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjEgRVhUSTQgICAgICAgICBMTF9TWVNDRkdfR2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMSBFWFRJNSAgICAgICAgIExMX1NZU0NGR19HZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IxIEVYVEk2ICAgICAgICAgTExfU1lTQ0ZHX0dldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjEgRVhUSTcgICAgICAgICBMTF9TWVNDRkdfR2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMSBFWFRJOCAgICAgICAgIExMX1NZU0NGR19HZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IxIEVYVEk5ICAgICAgICAgTExfU1lTQ0ZHX0dldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjEgRVhUSTEwICAgICAgICBMTF9TWVNDRkdfR2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMSBFWFRJMTEgICAgICAgIExMX1NZU0NGR19HZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IxIEVYVEkxMiAgICAgICAgTExfU1lTQ0ZHX0dldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjEgRVhUSTEzICAgICAgICBMTF9TWVNDRkdfR2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMSBFWFRJMTQgICAgICAgIExMX1NZU0NGR19HZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IxIEVYVEkxNSAgICAgICAgTExfU1lTQ0ZHX0dldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjIgRVhUSTAgICAgICAgICBMTF9TWVNDRkdfR2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMiBFWFRJMSAgICAgICAgIExMX1NZU0NGR19HZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IyIEVYVEkyICAgICAgICAgTExfU1lTQ0ZHX0dldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjIgRVhUSTMgICAgICAgICBMTF9TWVNDRkdfR2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMiBFWFRJNCAgICAgICAgIExMX1NZU0NGR19HZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IyIEVYVEk1ICAgICAgICAgTExfU1lTQ0ZHX0dldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjIgRVhUSTYgICAgICAgICBMTF9TWVNDRkdfR2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMiBFWFRJNyAgICAgICAgIExMX1NZU0NGR19HZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IyIEVYVEk4ICAgICAgICAgTExfU1lTQ0ZHX0dldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjIgRVhUSTkgICAgICAgICBMTF9TWVNDRkdfR2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMiBFWFRJMTAgICAgICAgIExMX1NZU0NGR19HZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IyIEVYVEkxMSAgICAgICAgTExfU1lTQ0ZHX0dldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjIgRVhUSTEyICAgICAgICBMTF9TWVNDRkdfR2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMiBFWFRJMTMgICAgICAgIExMX1NZU0NGR19HZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IyIEVYVEkxNCAgICAgICAgTExfU1lTQ0ZHX0dldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjIgRVhUSTE1ICAgICAgICBMTF9TWVNDRkdfR2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMyBFWFRJMCAgICAgICAgIExMX1NZU0NGR19HZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IzIEVYVEkxICAgICAgICAgTExfU1lTQ0ZHX0dldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjMgRVhUSTIgICAgICAgICBMTF9TWVNDRkdfR2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMyBFWFRJMyAgICAgICAgIExMX1NZU0NGR19HZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IzIEVYVEk0ICAgICAgICAgTExfU1lTQ0ZHX0dldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjMgRVhUSTUgICAgICAgICBMTF9TWVNDRkdfR2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMyBFWFRJNiAgICAgICAgIExMX1NZU0NGR19HZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IzIEVYVEk3ICAgICAgICAgTExfU1lTQ0ZHX0dldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjMgRVhUSTggICAgICAgICBMTF9TWVNDRkdfR2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMyBFWFRJOSAgICAgICAgIExMX1NZU0NGR19HZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IzIEVYVEkxMCAgICAgICAgTExfU1lTQ0ZHX0dldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjMgRVhUSTExICAgICAgICBMTF9TWVNDRkdfR2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMyBFWFRJMTIgICAgICAgIExMX1NZU0NGR19HZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IzIEVYVEkxMyAgICAgICAgTExfU1lTQ0ZHX0dldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjMgRVhUSTE0ICAgICAgICBMTF9TWVNDRkdfR2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMyBFWFRJMTUgICAgICAgIExMX1NZU0NGR19HZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1I0IEVYVEkwICAgICAgICAgTExfU1lTQ0ZHX0dldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjQgRVhUSTEgICAgICAgICBMTF9TWVNDRkdfR2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSNCBFWFRJMiAgICAgICAgIExMX1NZU0NGR19HZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1I0IEVYVEkzICAgICAgICAgTExfU1lTQ0ZHX0dldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjQgRVhUSTQgICAgICAgICBMTF9TWVNDRkdfR2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSNCBFWFRJNSAgICAgICAgIExMX1NZU0NGR19HZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1I0IEVYVEk2ICAgICAgICAgTExfU1lTQ0ZHX0dldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjQgRVhUSTcgICAgICAgICBMTF9TWVNDRkdfR2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSNCBFWFRJOCAgICAgICAgIExMX1NZU0NGR19HZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1I0IEVYVEk5ICAgICAgICAgTExfU1lTQ0ZHX0dldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjQgRVhUSTEwICAgICAgICBMTF9TWVNDRkdfR2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSNCBFWFRJMTEgICAgICAgIExMX1NZU0NGR19HZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1I0IEVYVEkxMiAgICAgICAgTExfU1lTQ0ZHX0dldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjQgRVhUSTEzICAgICAgICBMTF9TWVNDRkdfR2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSNCBFWFRJMTQgICAgICAgIExMX1NZU0NGR19HZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1I0IEVYVEkxNSAgICAgICAgTExfU1lTQ0ZHX0dldEVYVElTb3VyY2UKKyAgKiBAcGFyYW0gIExpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkU0CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkU3CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxNQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9QT1JUQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX1BPUlRCCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfUE9SVEMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9QT1JURAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX1BPUlRFICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX1BPUlRGCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfUE9SVEcgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfUE9SVEggKCopCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfR2V0RVhUSVNvdXJjZSh1aW50MzJfdCBMaW5lKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTWVNDRkctPkVYVElDUltMaW5lICYgMHhGRl0sIChMaW5lID4+IDE2VSkpID4+IFBPU0lUSU9OX1ZBTChMaW5lID4+IDE2VSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBjb25uZWN0aW9ucyB0byBUSU14IEJyZWFrIGlucHV0cworICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IyIExPQ0tVUF9MT0NLICAgICAgIExMX1NZU0NGR19TZXRUSU1CcmVha0lucHV0c1xuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjIgU1JBTV9QQVJJVFlfTE9DSyAgTExfU1lTQ0ZHX1NldFRJTUJyZWFrSW5wdXRzXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMiBQVkRfTE9DSyAgICAgICAgICBMTF9TWVNDRkdfU2V0VElNQnJlYWtJbnB1dHMKKyAgKiBAcGFyYW0gIEJyZWFrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19USU1CUkVBS19QVkQgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1RJTUJSRUFLX1NSQU1fUEFSSVRZICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19USU1CUkVBS19MT0NLVVAKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX1NldFRJTUJyZWFrSW5wdXRzKHVpbnQzMl90IEJyZWFrKQoreworICBNT0RJRllfUkVHKFNZU0NGRy0+Q0ZHUjIsIFNZU0NGR19NQVNLX1RJTV9CUkVBSywgQnJlYWspOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjb25uZWN0aW9ucyB0byBUSU14IEJyZWFrIGlucHV0cworICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IyIExPQ0tVUF9MT0NLICAgICAgIExMX1NZU0NGR19HZXRUSU1CcmVha0lucHV0c1xuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjIgU1JBTV9QQVJJVFlfTE9DSyAgTExfU1lTQ0ZHX0dldFRJTUJyZWFrSW5wdXRzXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMiBQVkRfTE9DSyAgICAgICAgICBMTF9TWVNDRkdfR2V0VElNQnJlYWtJbnB1dHMKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfVElNQlJFQUtfUFZEICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19USU1CUkVBS19TUkFNX1BBUklUWSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfVElNQlJFQUtfTE9DS1VQCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfR2V0VElNQnJlYWtJbnB1dHModm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1lTQ0ZHLT5DRkdSMiwgU1lTQ0ZHX01BU0tfVElNX0JSRUFLKSk7Cit9CisKKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSMl9CWVBfQUREUl9QQVIpCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUkFNIFBhcml0eSBDaGVjayBEaXNhYmxlCisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjIgQllQX0FERFJfUEFSICBMTF9TWVNDRkdfRGlzYWJsZVNSQU1QYXJpdHlDaGVjaworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0Rpc2FibGVTUkFNUGFyaXR5Q2hlY2sodm9pZCkKK3sKKyAgU0VUX0JJVChTWVNDRkctPkNGR1IyLCBTWVNDRkdfQ0ZHUjJfQllQX0FERFJfUEFSKTsKK30KKyNlbmRpZiAvKiBTWVNDRkdfQ0ZHUjJfQllQX0FERFJfUEFSICovCisKKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSMl9TUkFNX1BFKQorLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBTUkFNIHBhcml0eSBlcnJvciBkZXRlY3RlZAorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IyIFNSQU1fUEUgICAgICAgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19TUAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfU1Aodm9pZCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChTWVNDRkctPkNGR1IyLCBTWVNDRkdfQ0ZHUjJfU1JBTV9QRSkgPT0gKFNZU0NGR19DRkdSMl9TUkFNX1BFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU1JBTSBwYXJpdHkgZXJyb3IgZmxhZworICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IyIFNSQU1fUEUgICAgICAgTExfU1lTQ0ZHX0NsZWFyRmxhZ19TUAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0NsZWFyRmxhZ19TUCh2b2lkKQoreworICBTRVRfQklUKFNZU0NGRy0+Q0ZHUjIsIFNZU0NGR19DRkdSMl9TUkFNX1BFKTsKK30KKyNlbmRpZiAvKiBTWVNDRkdfQ0ZHUjJfU1JBTV9QRSAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfUkNSX1BBR0UwKQorLyoqCisgICogQGJyaWVmICBFbmFibGUgQ0NNIFNSQU0gcGFnZSB3cml0ZSBwcm90ZWN0aW9uCisgICogQG5vdGUgICBXcml0ZSBwcm90ZWN0aW9uIGlzIGNsZWFyZWQgb25seSBieSBhIHN5c3RlbSByZXNldAorICAqIEBybXRvbGwgU1lTQ0ZHX1JDUiAgIFBBR0UwICAgICAgICAgTExfU1lTQ0ZHX0VuYWJsZUNDTV9TUkFNUGFnZVdSUFxuCisgICogICAgICAgICBTWVNDRkdfUkNSICAgUEFHRTEgICAgICAgICBMTF9TWVNDRkdfRW5hYmxlQ0NNX1NSQU1QYWdlV1JQXG4KKyAgKiAgICAgICAgIFNZU0NGR19SQ1IgICBQQUdFMiAgICAgICAgIExMX1NZU0NGR19FbmFibGVDQ01fU1JBTVBhZ2VXUlBcbgorICAqICAgICAgICAgU1lTQ0ZHX1JDUiAgIFBBR0UzICAgICAgICAgTExfU1lTQ0ZHX0VuYWJsZUNDTV9TUkFNUGFnZVdSUFxuCisgICogICAgICAgICBTWVNDRkdfUkNSICAgUEFHRTQgICAgICAgICBMTF9TWVNDRkdfRW5hYmxlQ0NNX1NSQU1QYWdlV1JQXG4KKyAgKiAgICAgICAgIFNZU0NGR19SQ1IgICBQQUdFNSAgICAgICAgIExMX1NZU0NGR19FbmFibGVDQ01fU1JBTVBhZ2VXUlBcbgorICAqICAgICAgICAgU1lTQ0ZHX1JDUiAgIFBBR0U2ICAgICAgICAgTExfU1lTQ0ZHX0VuYWJsZUNDTV9TUkFNUGFnZVdSUFxuCisgICogICAgICAgICBTWVNDRkdfUkNSICAgUEFHRTcgICAgICAgICBMTF9TWVNDRkdfRW5hYmxlQ0NNX1NSQU1QYWdlV1JQXG4KKyAgKiAgICAgICAgIFNZU0NGR19SQ1IgICBQQUdFOCAgICAgICAgIExMX1NZU0NGR19FbmFibGVDQ01fU1JBTVBhZ2VXUlBcbgorICAqICAgICAgICAgU1lTQ0ZHX1JDUiAgIFBBR0U5ICAgICAgICAgTExfU1lTQ0ZHX0VuYWJsZUNDTV9TUkFNUGFnZVdSUFxuCisgICogICAgICAgICBTWVNDRkdfUkNSICAgUEFHRTEwICAgICAgICBMTF9TWVNDRkdfRW5hYmxlQ0NNX1NSQU1QYWdlV1JQXG4KKyAgKiAgICAgICAgIFNZU0NGR19SQ1IgICBQQUdFMTEgICAgICAgIExMX1NZU0NGR19FbmFibGVDQ01fU1JBTVBhZ2VXUlBcbgorICAqICAgICAgICAgU1lTQ0ZHX1JDUiAgIFBBR0UxMiAgICAgICAgTExfU1lTQ0ZHX0VuYWJsZUNDTV9TUkFNUGFnZVdSUFxuCisgICogICAgICAgICBTWVNDRkdfUkNSICAgUEFHRTEzICAgICAgICBMTF9TWVNDRkdfRW5hYmxlQ0NNX1NSQU1QYWdlV1JQXG4KKyAgKiAgICAgICAgIFNZU0NGR19SQ1IgICBQQUdFMTQgICAgICAgIExMX1NZU0NGR19FbmFibGVDQ01fU1JBTVBhZ2VXUlBcbgorICAqICAgICAgICAgU1lTQ0ZHX1JDUiAgIFBBR0UxNSAgICAgICAgTExfU1lTQ0ZHX0VuYWJsZUNDTV9TUkFNUGFnZVdSUAorICAqIEBwYXJhbSAgUGFnZVdSUCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UxCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0U0ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0U1ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0U2ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0U3ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0U4ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0U5ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UxMCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMTEgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTEyICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UxMyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMTQgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTE1ICgqKQorICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfRW5hYmxlQ0NNX1NSQU1QYWdlV1JQKHVpbnQzMl90IFBhZ2VXUlApCit7CisgIFNFVF9CSVQoU1lTQ0ZHLT5SQ1IsIFBhZ2VXUlApOworfQorI2VuZGlmIC8qIFNZU0NGR19SQ1JfUEFHRTAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUZfREJHTUNVIERCR01DVQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBkZXZpY2UgaWRlbnRpZmllcgorICAqIEBub3RlIEZvciBTVE0zMkYzMDN4QywgU1RNMzJGMzU4eHggYW5kIFNUTTMyRjMwMnhDIGRldmljZXMsIHRoZSBkZXZpY2UgSUQgaXMgMHg0MjIKKyAgKiBAbm90ZSBGb3IgU1RNMzJGMzczeHggYW5kIFNUTTMyRjM3OHh4IGRldmljZXMsIHRoZSBkZXZpY2UgSUQgaXMgMHg0MzIKKyAgKiBAbm90ZSBGb3IgU1RNMzJGMzAzeDgsIFNUTTMyRjMzNHh4IGFuZCBTVE0zMkYzMjh4eCBkZXZpY2VzLCB0aGUgZGV2aWNlIElEIGlzIDB4NDM4LgorICAqIEBub3RlIEZvciBTVE0zMkYzMDJ4OCwgU1RNMzJGMzAxeDggYW5kIFNUTTMyRjMxOHh4IGRldmljZXMsIHRoZSBkZXZpY2UgSUQgaXMgMHg0MzkKKyAgKiBAbm90ZSBGb3IgU1RNMzJGMzAzeEUsIFNUTTMyRjM5OHh4IGFuZCBTVE0zMkYzMDJ4RSBkZXZpY2VzLCB0aGUgZGV2aWNlIElEIGlzIDB4NDQ2CisgICogQHJtdG9sbCBEQkdNQ1VfSURDT0RFIERFVl9JRCAgICAgICAgTExfREJHTUNVX0dldERldmljZUlECisgICogQHJldHZhbCBWYWx1ZXMgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RCR01DVV9HZXREZXZpY2VJRCh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChEQkdNQ1UtPklEQ09ERSwgREJHTUNVX0lEQ09ERV9ERVZfSUQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIGRldmljZSByZXZpc2lvbiBpZGVudGlmaWVyCisgICogQG5vdGUgVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIHJldmlzaW9uIG9mIHRoZSBkZXZpY2UuCisgICogQHJtdG9sbCBEQkdNQ1VfSURDT0RFIFJFVl9JRCAgICAgICAgTExfREJHTUNVX0dldFJldmlzaW9uSUQKKyAgKiBAcmV0dmFsIFZhbHVlcyBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RCR01DVV9HZXRSZXZpc2lvbklEKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKERCR01DVS0+SURDT0RFLCBEQkdNQ1VfSURDT0RFX1JFVl9JRCkgPj4gREJHTUNVX0lEQ09ERV9SRVZfSURfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIERlYnVnIE1vZHVsZSBkdXJpbmcgU0xFRVAgbW9kZQorICAqIEBybXRvbGwgREJHTUNVX0NSICAgIERCR19TTEVFUCAgICAgTExfREJHTUNVX0VuYWJsZURCR1NsZWVwTW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREJHTUNVX0VuYWJsZURCR1NsZWVwTW9kZSh2b2lkKQoreworICBTRVRfQklUKERCR01DVS0+Q1IsIERCR01DVV9DUl9EQkdfU0xFRVApOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIERlYnVnIE1vZHVsZSBkdXJpbmcgU0xFRVAgbW9kZQorICAqIEBybXRvbGwgREJHTUNVX0NSICAgIERCR19TTEVFUCAgICAgTExfREJHTUNVX0Rpc2FibGVEQkdTbGVlcE1vZGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RCR01DVV9EaXNhYmxlREJHU2xlZXBNb2RlKHZvaWQpCit7CisgIENMRUFSX0JJVChEQkdNQ1UtPkNSLCBEQkdNQ1VfQ1JfREJHX1NMRUVQKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIERlYnVnIE1vZHVsZSBkdXJpbmcgU1RPUCBtb2RlCisgICogQHJtdG9sbCBEQkdNQ1VfQ1IgICAgREJHX1NUT1AgICAgICBMTF9EQkdNQ1VfRW5hYmxlREJHU3RvcE1vZGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RCR01DVV9FbmFibGVEQkdTdG9wTW9kZSh2b2lkKQoreworICBTRVRfQklUKERCR01DVS0+Q1IsIERCR01DVV9DUl9EQkdfU1RPUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgRGVidWcgTW9kdWxlIGR1cmluZyBTVE9QIG1vZGUKKyAgKiBAcm10b2xsIERCR01DVV9DUiAgICBEQkdfU1RPUCAgICAgIExMX0RCR01DVV9EaXNhYmxlREJHU3RvcE1vZGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RCR01DVV9EaXNhYmxlREJHU3RvcE1vZGUodm9pZCkKK3sKKyAgQ0xFQVJfQklUKERCR01DVS0+Q1IsIERCR01DVV9DUl9EQkdfU1RPUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBEZWJ1ZyBNb2R1bGUgZHVyaW5nIFNUQU5EQlkgbW9kZQorICAqIEBybXRvbGwgREJHTUNVX0NSICAgIERCR19TVEFOREJZICAgTExfREJHTUNVX0VuYWJsZURCR1N0YW5kYnlNb2RlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQkdNQ1VfRW5hYmxlREJHU3RhbmRieU1vZGUodm9pZCkKK3sKKyAgU0VUX0JJVChEQkdNQ1UtPkNSLCBEQkdNQ1VfQ1JfREJHX1NUQU5EQlkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIERlYnVnIE1vZHVsZSBkdXJpbmcgU1RBTkRCWSBtb2RlCisgICogQHJtdG9sbCBEQkdNQ1VfQ1IgICAgREJHX1NUQU5EQlkgICBMTF9EQkdNQ1VfRGlzYWJsZURCR1N0YW5kYnlNb2RlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQkdNQ1VfRGlzYWJsZURCR1N0YW5kYnlNb2RlKHZvaWQpCit7CisgIENMRUFSX0JJVChEQkdNQ1UtPkNSLCBEQkdNQ1VfQ1JfREJHX1NUQU5EQlkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBUcmFjZSBwaW4gYXNzaWdubWVudCBjb250cm9sCisgICogQHJtdG9sbCBEQkdNQ1VfQ1IgICAgVFJBQ0VfSU9FTiAgICBMTF9EQkdNQ1VfU2V0VHJhY2VQaW5Bc3NpZ25tZW50XG4KKyAgKiAgICAgICAgIERCR01DVV9DUiAgICBUUkFDRV9NT0RFICAgIExMX0RCR01DVV9TZXRUcmFjZVBpbkFzc2lnbm1lbnQKKyAgKiBAcGFyYW0gIFBpbkFzc2lnbm1lbnQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfVFJBQ0VfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9UUkFDRV9BU1lOQ0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfVFJBQ0VfU1lOQ0hfU0laRTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfVFJBQ0VfU1lOQ0hfU0laRTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfVFJBQ0VfU1lOQ0hfU0laRTQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RCR01DVV9TZXRUcmFjZVBpbkFzc2lnbm1lbnQodWludDMyX3QgUGluQXNzaWdubWVudCkKK3sKKyAgTU9ESUZZX1JFRyhEQkdNQ1UtPkNSLCBEQkdNQ1VfQ1JfVFJBQ0VfSU9FTiB8IERCR01DVV9DUl9UUkFDRV9NT0RFLCBQaW5Bc3NpZ25tZW50KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgVHJhY2UgcGluIGFzc2lnbm1lbnQgY29udHJvbAorICAqIEBybXRvbGwgREJHTUNVX0NSICAgIFRSQUNFX0lPRU4gICAgTExfREJHTUNVX0dldFRyYWNlUGluQXNzaWdubWVudFxuCisgICogICAgICAgICBEQkdNQ1VfQ1IgICAgVFJBQ0VfTU9ERSAgICBMTF9EQkdNQ1VfR2V0VHJhY2VQaW5Bc3NpZ25tZW50CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9UUkFDRV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX1RSQUNFX0FTWU5DSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9UUkFDRV9TWU5DSF9TSVpFMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9UUkFDRV9TWU5DSF9TSVpFMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9UUkFDRV9TWU5DSF9TSVpFNAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RCR01DVV9HZXRUcmFjZVBpbkFzc2lnbm1lbnQodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoREJHTUNVLT5DUiwgREJHTUNVX0NSX1RSQUNFX0lPRU4gfCBEQkdNQ1VfQ1JfVFJBQ0VfTU9ERSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEZyZWV6ZSBBUEIxIHBlcmlwaGVyYWxzIChncm91cDEgcGVyaXBoZXJhbHMpCisgICogQHJtdG9sbCBBUEIxX0ZaICAgICAgREJHX1RJTTJfU1RPUCAgICAgICAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMV9GWiAgICAgIERCR19USU0zX1NUT1AgICAgICAgICAgIExMX0RCR01DVV9BUEIxX0dSUDFfRnJlZXplUGVyaXBoXG4KKyAgKiAgICAgICAgIEFQQjFfRlogICAgICBEQkdfVElNNF9TVE9QICAgICAgICAgICBMTF9EQkdNQ1VfQVBCMV9HUlAxX0ZyZWV6ZVBlcmlwaFxuCisgICogICAgICAgICBBUEIxX0ZaICAgICAgREJHX1RJTTVfU1RPUCAgICAgICAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMV9GWiAgICAgIERCR19USU02X1NUT1AgICAgICAgICAgIExMX0RCR01DVV9BUEIxX0dSUDFfRnJlZXplUGVyaXBoXG4KKyAgKiAgICAgICAgIEFQQjFfRlogICAgICBEQkdfVElNN19TVE9QICAgICAgICAgICBMTF9EQkdNQ1VfQVBCMV9HUlAxX0ZyZWV6ZVBlcmlwaFxuCisgICogICAgICAgICBBUEIxX0ZaICAgICAgREJHX1RJTTEyX1NUT1AgICAgICAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMV9GWiAgICAgIERCR19USU0xM19TVE9QICAgICAgICAgIExMX0RCR01DVV9BUEIxX0dSUDFfRnJlZXplUGVyaXBoXG4KKyAgKiAgICAgICAgIEFQQjFfRlogICAgICBEQkdfVElNMTRfU1RPUCAgICAgICAgICBMTF9EQkdNQ1VfQVBCMV9HUlAxX0ZyZWV6ZVBlcmlwaFxuCisgICogICAgICAgICBBUEIxX0ZaICAgICAgREJHX1RJTTE4X1NUT1AgICAgICAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMV9GWiAgICAgIERCR19SVENfU1RPUCAgICAgICAgICAgIExMX0RCR01DVV9BUEIxX0dSUDFfRnJlZXplUGVyaXBoXG4KKyAgKiAgICAgICAgIEFQQjFfRlogICAgICBEQkdfV1dER19TVE9QICAgICAgICAgICBMTF9EQkdNQ1VfQVBCMV9HUlAxX0ZyZWV6ZVBlcmlwaFxuCisgICogICAgICAgICBBUEIxX0ZaICAgICAgREJHX0lXREdfU1RPUCAgICAgICAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMV9GWiAgICAgIERCR19JMkMxX1NNQlVTX1RJTUVPVVQgIExMX0RCR01DVV9BUEIxX0dSUDFfRnJlZXplUGVyaXBoXG4KKyAgKiAgICAgICAgIEFQQjFfRlogICAgICBEQkdfSTJDMl9TTUJVU19USU1FT1VUICBMTF9EQkdNQ1VfQVBCMV9HUlAxX0ZyZWV6ZVBlcmlwaFxuCisgICogICAgICAgICBBUEIxX0ZaICAgICAgREJHX0kyQzNfU01CVVNfVElNRU9VVCAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMV9GWiAgICAgIERCR19DQU5fU1RPUCAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGgKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9USU0yX1NUT1AKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTNfU1RPUCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTRfU1RPUCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTVfU1RPUCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTZfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfVElNN19TVE9QICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfVElNMTJfU1RPUCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTEzX1NUT1AgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9USU0xNF9TVE9QICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfVElNMThfU1RPUCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1JUQ19TVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9XV0RHX1NUT1AKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX0lXREdfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfSTJDMV9TVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9JMkMyX1NUT1AgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9JMkMzX1NUT1AgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9DQU5fU1RPUCAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGgodWludDMyX3QgUGVyaXBocykKK3sKKyAgU0VUX0JJVChEQkdNQ1UtPkFQQjFGWiwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5mcmVlemUgQVBCMSBwZXJpcGhlcmFscyAoZ3JvdXAxIHBlcmlwaGVyYWxzKQorICAqIEBybXRvbGwgQVBCMV9GWiAgICAgIERCR19USU0yX1NUT1AgICAgICAgICAgIExMX0RCR01DVV9BUEIxX0dSUDFfVW5GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMV9GWiAgICAgIERCR19USU0zX1NUT1AgICAgICAgICAgIExMX0RCR01DVV9BUEIxX0dSUDFfVW5GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMV9GWiAgICAgIERCR19USU00X1NUT1AgICAgICAgICAgIExMX0RCR01DVV9BUEIxX0dSUDFfVW5GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMV9GWiAgICAgIERCR19USU01X1NUT1AgICAgICAgICAgIExMX0RCR01DVV9BUEIxX0dSUDFfVW5GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMV9GWiAgICAgIERCR19USU02X1NUT1AgICAgICAgICAgIExMX0RCR01DVV9BUEIxX0dSUDFfVW5GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMV9GWiAgICAgIERCR19USU03X1NUT1AgICAgICAgICAgIExMX0RCR01DVV9BUEIxX0dSUDFfVW5GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMV9GWiAgICAgIERCR19USU0xMl9TVE9QICAgICAgICAgIExMX0RCR01DVV9BUEIxX0dSUDFfVW5GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMV9GWiAgICAgIERCR19USU0xM19TVE9QICAgICAgICAgIExMX0RCR01DVV9BUEIxX0dSUDFfVW5GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMV9GWiAgICAgIERCR19USU0xNF9TVE9QICAgICAgICAgIExMX0RCR01DVV9BUEIxX0dSUDFfVW5GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMV9GWiAgICAgIERCR19USU0xOF9TVE9QICAgICAgICAgIExMX0RCR01DVV9BUEIxX0dSUDFfVW5GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMV9GWiAgICAgIERCR19SVENfU1RPUCAgICAgICAgICAgIExMX0RCR01DVV9BUEIxX0dSUDFfVW5GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMV9GWiAgICAgIERCR19XV0RHX1NUT1AgICAgICAgICAgIExMX0RCR01DVV9BUEIxX0dSUDFfVW5GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMV9GWiAgICAgIERCR19JV0RHX1NUT1AgICAgICAgICAgIExMX0RCR01DVV9BUEIxX0dSUDFfVW5GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMV9GWiAgICAgIERCR19JMkMxX1NNQlVTX1RJTUVPVVQgIExMX0RCR01DVV9BUEIxX0dSUDFfVW5GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMV9GWiAgICAgIERCR19JMkMyX1NNQlVTX1RJTUVPVVQgIExMX0RCR01DVV9BUEIxX0dSUDFfVW5GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMV9GWiAgICAgIERCR19JMkMzX1NNQlVTX1RJTUVPVVQgIExMX0RCR01DVV9BUEIxX0dSUDFfVW5GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMV9GWiAgICAgIERCR19DQU5fU1RPUCAgTExfREJHTUNVX0FQQjFfR1JQMV9VbkZyZWV6ZVBlcmlwaAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTJfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfVElNM19TVE9QICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfVElNNF9TVE9QICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfVElNNV9TVE9QICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfVElNNl9TVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9USU03X1NUT1AgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9USU0xMl9TVE9QICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfVElNMTNfU1RPUCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTE0X1NUT1AgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9USU0xOF9TVE9QICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfUlRDX1NUT1AKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1dXREdfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfSVdER19TVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9JMkMxX1NUT1AKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX0kyQzJfU1RPUCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX0kyQzNfU1RPUCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX0NBTl9TVE9QICgqKQorICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQkdNQ1VfQVBCMV9HUlAxX1VuRnJlZXplUGVyaXBoKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIENMRUFSX0JJVChEQkdNQ1UtPkFQQjFGWiwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRnJlZXplIEFQQjIgcGVyaXBoZXJhbHMKKyAgKiBAcm10b2xsIEFQQjJfRlogICAgICBEQkdfVElNMV9TVE9QICAgIExMX0RCR01DVV9BUEIyX0dSUDFfRnJlZXplUGVyaXBoXG4KKyAgKiAgICAgICAgIEFQQjJfRlogICAgICBEQkdfVElNOF9TVE9QICAgIExMX0RCR01DVV9BUEIyX0dSUDFfRnJlZXplUGVyaXBoXG4KKyAgKiAgICAgICAgIEFQQjJfRlogICAgICBEQkdfVElNMTVfU1RPUCAgIExMX0RCR01DVV9BUEIyX0dSUDFfRnJlZXplUGVyaXBoXG4KKyAgKiAgICAgICAgIEFQQjJfRlogICAgICBEQkdfVElNMTZfU1RPUCAgIExMX0RCR01DVV9BUEIyX0dSUDFfRnJlZXplUGVyaXBoXG4KKyAgKiAgICAgICAgIEFQQjJfRlogICAgICBEQkdfVElNMTdfU1RPUCAgIExMX0RCR01DVV9BUEIyX0dSUDFfRnJlZXplUGVyaXBoXG4KKyAgKiAgICAgICAgIEFQQjJfRlogICAgICBEQkdfVElNMTlfU1RPUCAgIExMX0RCR01DVV9BUEIyX0dSUDFfRnJlZXplUGVyaXBoXG4KKyAgKiAgICAgICAgIEFQQjJfRlogICAgICBEQkdfVElNMjBfU1RPUCAgIExMX0RCR01DVV9BUEIyX0dSUDFfRnJlZXplUGVyaXBoXG4KKyAgKiAgICAgICAgIEFQQjJfRlogICAgICBEQkdfSFJUSU0xX1NUT1AgIExMX0RCR01DVV9BUEIyX0dSUDFfRnJlZXplUGVyaXBoCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMV9TVE9QICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIyX0dSUDFfVElNOF9TVE9QICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMTVfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMTZfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMTdfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMTlfU1RPUCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMl9HUlAxX1RJTTIwX1NUT1AgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjJfR1JQMV9IUlRJTTFfU1RPUCAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREJHTUNVX0FQQjJfR1JQMV9GcmVlemVQZXJpcGgodWludDMyX3QgUGVyaXBocykKK3sKKyAgU0VUX0JJVChEQkdNQ1UtPkFQQjJGWiwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5mcmVlemUgQVBCMiBwZXJpcGhlcmFscworICAqIEBybXRvbGwgQVBCMl9GWiAgICAgIERCR19USU0xX1NUT1AgICAgTExfREJHTUNVX0FQQjJfR1JQMV9VbkZyZWV6ZVBlcmlwaFxuCisgICogICAgICAgICBBUEIyX0ZaICAgICAgREJHX1RJTThfU1RPUCAgICBMTF9EQkdNQ1VfQVBCMl9HUlAxX1VuRnJlZXplUGVyaXBoXG4KKyAgKiAgICAgICAgIEFQQjJfRlogICAgICBEQkdfVElNMTVfU1RPUCAgIExMX0RCR01DVV9BUEIyX0dSUDFfVW5GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMl9GWiAgICAgIERCR19USU0xNl9TVE9QICAgTExfREJHTUNVX0FQQjJfR1JQMV9VbkZyZWV6ZVBlcmlwaFxuCisgICogICAgICAgICBBUEIyX0ZaICAgICAgREJHX1RJTTE3X1NUT1AgICBMTF9EQkdNQ1VfQVBCMl9HUlAxX1VuRnJlZXplUGVyaXBoXG4KKyAgKiAgICAgICAgIEFQQjJfRlogICAgICBEQkdfVElNMTlfU1RPUCAgIExMX0RCR01DVV9BUEIyX0dSUDFfVW5GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMl9GWiAgICAgIERCR19USU0yMF9TVE9QICAgTExfREJHTUNVX0FQQjJfR1JQMV9VbkZyZWV6ZVBlcmlwaFxuCisgICogICAgICAgICBBUEIyX0ZaICAgICAgREJHX0hSVElNMV9TVE9QICBMTF9EQkdNQ1VfQVBCMl9HUlAxX1VuRnJlZXplUGVyaXBoCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMV9TVE9QICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIyX0dSUDFfVElNOF9TVE9QICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMTVfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMTZfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMTdfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMTlfU1RPUCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMl9HUlAxX1RJTTIwX1NUT1AgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjJfR1JQMV9IUlRJTTFfU1RPUCAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREJHTUNVX0FQQjJfR1JQMV9VbkZyZWV6ZVBlcmlwaCh1aW50MzJfdCBQZXJpcGhzKQoreworICBDTEVBUl9CSVQoREJHTUNVLT5BUEIyRlosIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FRl9GTEFTSCBGTEFTSAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IEZMQVNIIExhdGVuY3kKKyAgKiBAcm10b2xsIEZMQVNIX0FDUiAgICBMQVRFTkNZICAgICAgIExMX0ZMQVNIX1NldExhdGVuY3kKKyAgKiBAcGFyYW0gIExhdGVuY3kgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTEFTSF9MQVRFTkNZXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTEFTSF9MQVRFTkNZXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTEFTSF9MQVRFTkNZXzIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZMQVNIX1NldExhdGVuY3kodWludDMyX3QgTGF0ZW5jeSkKK3sKKyAgTU9ESUZZX1JFRyhGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfTEFURU5DWSwgTGF0ZW5jeSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEZMQVNIIExhdGVuY3kKKyAgKiBAcm10b2xsIEZMQVNIX0FDUiAgICBMQVRFTkNZICAgICAgIExMX0ZMQVNIX0dldExhdGVuY3kKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRkxBU0hfTEFURU5DWV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRkxBU0hfTEFURU5DWV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRkxBU0hfTEFURU5DWV8yCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRkxBU0hfR2V0TGF0ZW5jeSh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfTEFURU5DWSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBQcmVmZXRjaAorICAqIEBybXRvbGwgRkxBU0hfQUNSICAgIFBSRlRCRSAgICAgICAgIExMX0ZMQVNIX0VuYWJsZVByZWZldGNoCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTEFTSF9FbmFibGVQcmVmZXRjaCh2b2lkKQoreworICBTRVRfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9QUkZUQkUgKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFByZWZldGNoCisgICogQHJtdG9sbCBGTEFTSF9BQ1IgICAgUFJGVEJFICAgICAgICAgTExfRkxBU0hfRGlzYWJsZVByZWZldGNoCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTEFTSF9EaXNhYmxlUHJlZmV0Y2godm9pZCkKK3sKKyAgQ0xFQVJfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9QUkZUQkUgKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBQcmVmZXRjaCBidWZmZXIgaXMgZW5hYmxlZAorICAqIEBybXRvbGwgRkxBU0hfQUNSICAgIFBSRlRCUyAgICAgICAgTExfRkxBU0hfSXNQcmVmZXRjaEVuYWJsZWQKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9GTEFTSF9Jc1ByZWZldGNoRW5hYmxlZCh2b2lkKQoreworICByZXR1cm4gKFJFQURfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9QUkZUQlMpID09IChGTEFTSF9BQ1JfUFJGVEJTKSk7Cit9CisKKyNpZiBkZWZpbmVkKEZMQVNIX0FDUl9ITEZDWUEpCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBGbGFzaCBIYWxmIEN5Y2xlIEFjY2VzcworICAqIEBybXRvbGwgRkxBU0hfQUNSICAgIEhMRkNZQSAgICAgICAgTExfRkxBU0hfRW5hYmxlSGFsZkN5Y2xlQWNjZXNzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTEFTSF9FbmFibGVIYWxmQ3ljbGVBY2Nlc3Modm9pZCkKK3sKKyAgU0VUX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfSExGQ1lBKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEZsYXNoIEhhbGYgQ3ljbGUgQWNjZXNzCisgICogQHJtdG9sbCBGTEFTSF9BQ1IgICAgSExGQ1lBICAgICAgICBMTF9GTEFTSF9EaXNhYmxlSGFsZkN5Y2xlQWNjZXNzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTEFTSF9EaXNhYmxlSGFsZkN5Y2xlQWNjZXNzKHZvaWQpCit7CisgIENMRUFSX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfSExGQ1lBKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiAgRmxhc2ggSGFsZiBDeWNsZSBBY2Nlc3MgaXMgZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIEZMQVNIX0FDUiAgICBITEZDWUEgICAgICAgIExMX0ZMQVNIX0lzSGFsZkN5Y2xlQWNjZXNzRW5hYmxlZAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZMQVNIX0lzSGFsZkN5Y2xlQWNjZXNzRW5hYmxlZCh2b2lkKQoreworICByZXR1cm4gKFJFQURfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9ITEZDWUEpID09IChGTEFTSF9BQ1JfSExGQ1lBKSk7Cit9CisjZW5kaWYgLyogRkxBU0hfQUNSX0hMRkNZQSAqLworCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIGRlZmluZWQgKEZMQVNIKSB8fCBkZWZpbmVkIChTWVNDRkcpIHx8IGRlZmluZWQgKERCR01DVSkgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJGM3h4X0xMX1NZU1RFTV9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2xsX3RpbS5oIGIvSW5jL3N0bTMyZjN4eF9sbF90aW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjQxOTgzCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjN4eF9sbF90aW0uaApAQCAtMCwwICsxLDQ5NjQgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfbGxfdGltLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFRJTSBMTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyRjN4eF9MTF9USU1fSAorI2RlZmluZSBfX1NUTTMyRjN4eF9MTF9USU1fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKFRJTTEpIHx8IGRlZmluZWQgKFRJTTIpIHx8IGRlZmluZWQgKFRJTTMpIHx8IGRlZmluZWQgKFRJTTQpIHx8IGRlZmluZWQgKFRJTTUpIHx8IGRlZmluZWQgKFRJTTYpIHx8IGRlZmluZWQgKFRJTTcpIHx8IGRlZmluZWQgKFRJTTgpIHx8IGRlZmluZWQgKFRJTTEyKSB8fCBkZWZpbmVkIChUSU0xMykgfHwgZGVmaW5lZCAoVElNMTQpIHx8IGRlZmluZWQgKFRJTTE1KSB8fCBkZWZpbmVkIChUSU0xNikgfHwgZGVmaW5lZCAoVElNMTcpIHx8IGRlZmluZWQgKFRJTTE4KSB8fCBkZWZpbmVkIChUSU0xOSkgfHwgZGVmaW5lZCAoVElNMjApCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMIFRJTQorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1fTExfUHJpdmF0ZV9WYXJpYWJsZXMgVElNIFByaXZhdGUgVmFyaWFibGVzCisgICogQHsKKyAgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IE9GRlNFVF9UQUJfQ0NNUnhbXSA9Cit7CisgIDB4MDBVLCAgIC8qIDA6IFRJTXhfQ0gxICAqLworICAweDAwVSwgICAvKiAxOiBUSU14X0NIMU4gKi8KKyAgMHgwMFUsICAgLyogMjogVElNeF9DSDIgICovCisgIDB4MDBVLCAgIC8qIDM6IFRJTXhfQ0gyTiAqLworICAweDA0VSwgICAvKiA0OiBUSU14X0NIMyAgKi8KKyAgMHgwNFUsICAgLyogNTogVElNeF9DSDNOICovCisgIDB4MDRVLCAgIC8qIDY6IFRJTXhfQ0g0ICAqLworICAweDNDVSwgICAvKiA3OiBUSU14X0NINSAgKi8KKyAgMHgzQ1UgICAgLyogODogVElNeF9DSDYgICovCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBTSElGVF9UQUJfT0N4eFtdID0KK3sKKyAgMFUsICAgICAgICAgICAgLyogMDogT0MxTSwgT0MxRkUsIE9DMVBFICovCisgIDBVLCAgICAgICAgICAgIC8qIDE6IC0gTkEgKi8KKyAgOFUsICAgICAgICAgICAgLyogMjogT0MyTSwgT0MyRkUsIE9DMlBFICovCisgIDBVLCAgICAgICAgICAgIC8qIDM6IC0gTkEgKi8KKyAgMFUsICAgICAgICAgICAgLyogNDogT0MzTSwgT0MzRkUsIE9DM1BFICovCisgIDBVLCAgICAgICAgICAgIC8qIDU6IC0gTkEgKi8KKyAgOFUsICAgICAgICAgICAgLyogNjogT0M0TSwgT0M0RkUsIE9DNFBFICovCisgIDBVLCAgICAgICAgICAgIC8qIDc6IE9DNU0sIE9DNUZFLCBPQzVQRSAqLworICA4VSAgICAgICAgICAgICAvKiA4OiBPQzZNLCBPQzZGRSwgT0M2UEUgKi8KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IFNISUZUX1RBQl9JQ3h4W10gPQoreworICAwVSwgICAgICAgICAgICAvKiAwOiBDQzFTLCBJQzFQU0MsIElDMUYgKi8KKyAgMFUsICAgICAgICAgICAgLyogMTogLSBOQSAqLworICA4VSwgICAgICAgICAgICAvKiAyOiBDQzJTLCBJQzJQU0MsIElDMkYgKi8KKyAgMFUsICAgICAgICAgICAgLyogMzogLSBOQSAqLworICAwVSwgICAgICAgICAgICAvKiA0OiBDQzNTLCBJQzNQU0MsIElDM0YgKi8KKyAgMFUsICAgICAgICAgICAgLyogNTogLSBOQSAqLworICA4VSwgICAgICAgICAgICAvKiA2OiBDQzRTLCBJQzRQU0MsIElDNEYgKi8KKyAgMFUsICAgICAgICAgICAgLyogNzogLSBOQSAqLworICAwVSAgICAgICAgICAgICAvKiA4OiAtIE5BICovCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBTSElGVF9UQUJfQ0N4UFtdID0KK3sKKyAgMFUsICAgICAgICAgICAgLyogMDogQ0MxUCAqLworICAyVSwgICAgICAgICAgICAvKiAxOiBDQzFOUCAqLworICA0VSwgICAgICAgICAgICAvKiAyOiBDQzJQICovCisgIDZVLCAgICAgICAgICAgIC8qIDM6IENDMk5QICovCisgIDhVLCAgICAgICAgICAgIC8qIDQ6IENDM1AgKi8KKyAgMTBVLCAgICAgICAgICAgLyogNTogQ0MzTlAgKi8KKyAgMTJVLCAgICAgICAgICAgLyogNjogQ0M0UCAqLworICAxNlUsICAgICAgICAgICAvKiA3OiBDQzVQICovCisgIDIwVSAgICAgICAgICAgIC8qIDg6IENDNlAgKi8KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IFNISUZUX1RBQl9PSVN4W10gPQoreworICAwVSwgICAgICAgICAgICAvKiAwOiBPSVMxICovCisgIDFVLCAgICAgICAgICAgIC8qIDE6IE9JUzFOICovCisgIDJVLCAgICAgICAgICAgIC8qIDI6IE9JUzIgKi8KKyAgM1UsICAgICAgICAgICAgLyogMzogT0lTMk4gKi8KKyAgNFUsICAgICAgICAgICAgLyogNDogT0lTMyAqLworICA1VSwgICAgICAgICAgICAvKiA1OiBPSVMzTiAqLworICA2VSwgICAgICAgICAgICAvKiA2OiBPSVM0ICovCisgIDhVLCAgICAgICAgICAgIC8qIDc6IE9JUzUgKi8KKyAgMTBVICAgICAgICAgICAgLyogODogT0lTNiAqLworfTsKKy8qKgorICAqIEB9CisgICovCisKKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNX0xMX1ByaXZhdGVfQ29uc3RhbnRzIFRJTSBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisKKworI2RlZmluZSBUSU14X09SX1JNUF9TSElGVCAxNlUKKyNkZWZpbmUgVElNeF9PUl9STVBfTUFTSyAgMHgwMDAwRkZGRlUKKyNpZiBkZWZpbmVkKFRJTTEpCisjZGVmaW5lIFRJTTFfT1JfUk1QX01BU0sgICAoVElNMV9PUl9FVFJfUk1QIDw8IFRJTXhfT1JfUk1QX1NISUZUKQorI2VuZGlmIC8qIFRJTTEgKi8KKyNpZiBkZWZpbmVkIChUSU04KQorI2RlZmluZSBUSU04X09SX1JNUF9NQVNLICAgKFRJTThfT1JfRVRSX1JNUCA8PCBUSU14X09SX1JNUF9TSElGVCkKKyNlbmRpZiAvKiBUSU04ICovCisjaWYgZGVmaW5lZChUSU0xNCkKKyNkZWZpbmUgVElNMTRfT1JfUk1QX01BU0sgIChUSU0xNF9PUl9USTFfUk1QIDw8IFRJTXhfT1JfUk1QX1NISUZUKQorI2VuZGlmIC8qIFRJTTE0ICovCisjaWYgZGVmaW5lZChUSU0xNikKKyNkZWZpbmUgVElNMTZfT1JfUk1QX01BU0sgIChUSU0xNl9PUl9USTFfUk1QIDw8IFRJTXhfT1JfUk1QX1NISUZUKQorI2VuZGlmIC8qIFRJTTE2ICovCisjaWYgZGVmaW5lZChUSU0yMCkKKyNkZWZpbmUgVElNMjBfT1JfUk1QX01BU0sgIChUSU0yMF9PUl9FVFJfUk1QIDw8IFRJTXhfT1JfUk1QX1NISUZUKQorI2VuZGlmIC8qIFRJTTIwICovCisKKy8qIE1hc2sgdXNlZCB0byBzZXQgdGhlIFRER1t4OjBdIG9mIHRoZSBEVEcgYml0cyBvZiB0aGUgVElNeF9CRFRSIHJlZ2lzdGVyICovCisjZGVmaW5lIERUX0RFTEFZXzEgKCh1aW50OF90KTB4N0ZVKQorI2RlZmluZSBEVF9ERUxBWV8yICgodWludDhfdCkweDNGVSkKKyNkZWZpbmUgRFRfREVMQVlfMyAoKHVpbnQ4X3QpMHgxRlUpCisjZGVmaW5lIERUX0RFTEFZXzQgKCh1aW50OF90KTB4MUZVKQorCisvKiBNYXNrIHVzZWQgdG8gc2V0IHRoZSBEVEdbNzo1XSBiaXRzIG9mIHRoZSBEVEcgYml0cyBvZiB0aGUgVElNeF9CRFRSIHJlZ2lzdGVyICovCisjZGVmaW5lIERUX1JBTkdFXzEgKCh1aW50OF90KTB4MDBVKQorI2RlZmluZSBEVF9SQU5HRV8yICgodWludDhfdCkweDgwVSkKKyNkZWZpbmUgRFRfUkFOR0VfMyAoKHVpbnQ4X3QpMHhDMFUpCisjZGVmaW5lIERUX1JBTkdFXzQgKCh1aW50OF90KTB4RTBVKQorCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFRJTV9MTF9Qcml2YXRlX01hY3JvcyBUSU0gUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworLyoqIEBicmllZiAgQ29udmVydCBjaGFubmVsIGlkIGludG8gY2hhbm5lbCBpbmRleC4KKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMk4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDNOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgICogQG5vdGUgICBDSDUgYW5kIENINiBjaGFubmVscyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgYWxsIEYzIGRldmljZXMKKyAgKiBAcmV0dmFsIG5vbmUKKyAgKi8KKyNpZiBkZWZpbmVkKFRJTV9DQ1I1X0NDUjUpCisjZGVmaW5lIFRJTV9HRVRfQ0hBTk5FTF9JTkRFWCggX19DSEFOTkVMX18pIFwKKygoKF9fQ0hBTk5FTF9fKSA9PSBMTF9USU1fQ0hBTk5FTF9DSDEpID8gMFUgOlwKKygoX19DSEFOTkVMX18pID09IExMX1RJTV9DSEFOTkVMX0NIMU4pID8gMVUgOlwKKygoX19DSEFOTkVMX18pID09IExMX1RJTV9DSEFOTkVMX0NIMikgPyAyVSA6XAorKChfX0NIQU5ORUxfXykgPT0gTExfVElNX0NIQU5ORUxfQ0gyTikgPyAzVSA6XAorKChfX0NIQU5ORUxfXykgPT0gTExfVElNX0NIQU5ORUxfQ0gzKSA/IDRVIDpcCisoKF9fQ0hBTk5FTF9fKSA9PSBMTF9USU1fQ0hBTk5FTF9DSDNOKSA/IDVVIDpcCisoKF9fQ0hBTk5FTF9fKSA9PSBMTF9USU1fQ0hBTk5FTF9DSDQpID8gNlUgOlwKKygoX19DSEFOTkVMX18pID09IExMX1RJTV9DSEFOTkVMX0NINSkgPyA3VSA6IDhVKQorI2Vsc2UKKyNkZWZpbmUgVElNX0dFVF9DSEFOTkVMX0lOREVYKCBfX0NIQU5ORUxfXykgXAorKCgoX19DSEFOTkVMX18pID09IExMX1RJTV9DSEFOTkVMX0NIMSkgPyAwVSA6XAorKChfX0NIQU5ORUxfXykgPT0gTExfVElNX0NIQU5ORUxfQ0gxTikgPyAxVSA6XAorKChfX0NIQU5ORUxfXykgPT0gTExfVElNX0NIQU5ORUxfQ0gyKSA/IDJVIDpcCisoKF9fQ0hBTk5FTF9fKSA9PSBMTF9USU1fQ0hBTk5FTF9DSDJOKSA/IDNVIDpcCisoKF9fQ0hBTk5FTF9fKSA9PSBMTF9USU1fQ0hBTk5FTF9DSDMpID8gNFUgOlwKKygoX19DSEFOTkVMX18pID09IExMX1RJTV9DSEFOTkVMX0NIM04pID8gNVUgOiA2VSkKKyNlbmRpZgorCisvKiogQGJyaWVmICBDYWxjdWxhdGUgdGhlIGRlYWR0aW1lIHNhbXBsaW5nIHBlcmlvZChpbiBwcykuCisgICogQHBhcmFtICBfX1RJTUNMS19fIHRpbWVyIGlucHV0IGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopLgorICAqIEBwYXJhbSAgX19DS0RfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NMT0NLRElWSVNJT05fRElWNAorICAqIEByZXR2YWwgbm9uZQorICAqLworI2RlZmluZSBUSU1fQ0FMQ19EVFMoX19USU1DTEtfXywgX19DS0RfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX0NLRF9fKSA9PSBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVYxKSA/ICgodWludDY0X3QpMTAwMDAwMDAwMDAwMFUvKF9fVElNQ0xLX18pKSAgICAgICAgIDogXAorICAgICAoKF9fQ0tEX18pID09IExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjIpID8gKCh1aW50NjRfdCkxMDAwMDAwMDAwMDAwVS8oKF9fVElNQ0xLX18pID4+IDFVKSkgOiBcCisgICAgICgodWludDY0X3QpMTAwMDAwMDAwMDAwMFUvKChfX1RJTUNMS19fKSA+PiAyVSkpKQorLyoqCisgICogQH0KKyAgKi8KKworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBUSU1fTExfRVNfSU5JVCBUSU0gRXhwb3J0ZWQgSW5pdCBzdHJ1Y3R1cmUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFRJTSBUaW1lIEJhc2UgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQxNl90IFByZXNjYWxlcjsgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcHJlc2NhbGVyIHZhbHVlIHVzZWQgdG8gZGl2aWRlIHRoZSBUSU0gY2xvY2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwMCBhbmQgTWF4X0RhdGE9MHhGRkZGLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX1NldFByZXNjYWxlcigpLiovCisKKyAgdWludDMyX3QgQ291bnRlck1vZGU7ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjb3VudGVyIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0NPVU5URVJNT0RFLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX1NldENvdW50ZXJNb2RlKCkuKi8KKworICB1aW50MzJfdCBBdXRvcmVsb2FkOyAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGF1dG8gcmVsb2FkIHZhbHVlIHRvIGJlIGxvYWRlZCBpbnRvIHRoZSBhY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0by1SZWxvYWQgUmVnaXN0ZXIgYXQgdGhlIG5leHQgdXBkYXRlIGV2ZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGE9MHgwMDAwIGFuZCBNYXhfRGF0YT0weEZGRkYuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWUgdGltZXIgaW5zdGFuY2VzIG1heSBzdXBwb3J0IDMyIGJpdHMgY291bnRlcnMuIEluIHRoYXQgY2FzZSB0aGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkZGRkZGLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX1NldEF1dG9SZWxvYWQoKS4qLworCisgIHVpbnQzMl90IENsb2NrRGl2aXNpb247ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgY2xvY2sgZGl2aXNpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0NMT0NLRElWSVNJT04uCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fU2V0Q2xvY2tEaXZpc2lvbigpLiovCisKKyAgdWludDhfdCBSZXBldGl0aW9uQ291bnRlcjsgIC8qITwgU3BlY2lmaWVzIHRoZSByZXBldGl0aW9uIGNvdW50ZXIgdmFsdWUuIEVhY2ggdGltZSB0aGUgUkNSIGRvd25jb3VudGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWNoZXMgemVybywgYW4gdXBkYXRlIGV2ZW50IGlzIGdlbmVyYXRlZCBhbmQgY291bnRpbmcgcmVzdGFydHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgUkNSIHZhbHVlIChOKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtZWFucyBpbiBQV00gbW9kZSB0aGF0IChOKzEpIGNvcnJlc3BvbmRzIHRvOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRoZSBudW1iZXIgb2YgUFdNIHBlcmlvZHMgaW4gZWRnZS1hbGlnbmVkIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSB0aGUgbnVtYmVyIG9mIGhhbGYgUFdNIHBlcmlvZCBpbiBjZW50ZXItYWxpZ25lZCBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAweDAwIGFuZCAweEZGLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX1NldFJlcGV0aXRpb25Db3VudGVyKCkuKi8KK30gTExfVElNX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFRJTSBPdXRwdXQgQ29tcGFyZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uLgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgT0NNb2RlOyAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG91dHB1dCBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX09DTU9ERS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX09DX1NldE1vZGUoKS4qLworCisgIHVpbnQzMl90IE9DU3RhdGU7ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgc3RhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfT0NTVEFURS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9ucyBAcmVmIExMX1RJTV9DQ19FbmFibGVDaGFubmVsKCkgb3IgQHJlZiBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWwoKS4qLworCisgIHVpbnQzMl90IE9DTlN0YXRlOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBUSU0gY29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZSBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19PQ1NUQVRFLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb25zIEByZWYgTExfVElNX0NDX0VuYWJsZUNoYW5uZWwoKSBvciBAcmVmIExMX1RJTV9DQ19EaXNhYmxlQ2hhbm5lbCgpLiovCisKKyAgdWludDMyX3QgQ29tcGFyZVZhbHVlOyAgLyohPCBTcGVjaWZpZXMgdGhlIENvbXBhcmUgdmFsdWUgdG8gYmUgbG9hZGVkIGludG8gdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3Rlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YT0weDAwMDAgYW5kIE1heF9EYXRhPTB4RkZGRi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIExMX1RJTV9PQ19TZXRDb21wYXJlQ0h4ICh4PTEuLjYpLiovCisKKyAgdWludDMyX3QgT0NQb2xhcml0eTsgICAgLyohPCBTcGVjaWZpZXMgdGhlIG91dHB1dCBwb2xhcml0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19PQ1BPTEFSSVRZLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fT0NfU2V0UG9sYXJpdHkoKS4qLworCisgIHVpbnQzMl90IE9DTlBvbGFyaXR5OyAgIC8qITwgU3BlY2lmaWVzIHRoZSBjb21wbGVtZW50YXJ5IG91dHB1dCBwb2xhcml0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19PQ1BPTEFSSVRZLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fT0NfU2V0UG9sYXJpdHkoKS4qLworCisKKyAgdWludDMyX3QgT0NJZGxlU3RhdGU7ICAgLyohPCBTcGVjaWZpZXMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBwaW4gc3RhdGUgZHVyaW5nIElkbGUgc3RhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfT0NJRExFU1RBVEUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9PQ19TZXRJZGxlU3RhdGUoKS4qLworCisgIHVpbnQzMl90IE9DTklkbGVTdGF0ZTsgIC8qITwgU3BlY2lmaWVzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgcGluIHN0YXRlIGR1cmluZyBJZGxlIHN0YXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX09DSURMRVNUQVRFLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fT0NfU2V0SWRsZVN0YXRlKCkuKi8KK30gTExfVElNX09DX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFRJTSBJbnB1dCBDYXB0dXJlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGRlZmluaXRpb24uCisgICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisKKyAgdWludDMyX3QgSUNQb2xhcml0eTsgICAgLyohPCBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBlZGdlIG9mIHRoZSBpbnB1dCBzaWduYWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfSUNfUE9MQVJJVFkuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9JQ19TZXRQb2xhcml0eSgpLiovCisKKyAgdWludDMyX3QgSUNBY3RpdmVJbnB1dDsgLyohPCBTcGVjaWZpZXMgdGhlIGlucHV0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0FDVElWRUlOUFVULgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fSUNfU2V0QWN0aXZlSW5wdXQoKS4qLworCisgIHVpbnQzMl90IElDUHJlc2NhbGVyOyAgIC8qITwgU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIFByZXNjYWxlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19JQ1BTQy4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX0lDX1NldFByZXNjYWxlcigpLiovCisKKyAgdWludDMyX3QgSUNGaWx0ZXI7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGlucHV0IGNhcHR1cmUgZmlsdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0lDX0ZJTFRFUi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX0lDX1NldEZpbHRlcigpLiovCit9IExMX1RJTV9JQ19Jbml0VHlwZURlZjsKKworCisvKioKKyAgKiBAYnJpZWYgIFRJTSBFbmNvZGVyIGludGVyZmFjZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uLgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgRW5jb2Rlck1vZGU7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZW5jb2RlciByZXNvbHV0aW9uICh4MiBvciB4NCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19FTkNPREVSTU9ERS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fU2V0RW5jb2Rlck1vZGUoKS4qLworCisgIHVpbnQzMl90IElDMVBvbGFyaXR5OyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBlZGdlIG9mIFRJMSBpbnB1dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0lDX1BPTEFSSVRZLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9JQ19TZXRQb2xhcml0eSgpLiovCisKKyAgdWludDMyX3QgSUMxQWN0aXZlSW5wdXQ7ICAvKiE8IFNwZWNpZmllcyB0aGUgVEkxIGlucHV0IHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfQUNUSVZFSU5QVVQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX0lDX1NldEFjdGl2ZUlucHV0KCkuKi8KKworICB1aW50MzJfdCBJQzFQcmVzY2FsZXI7ICAgIC8qITwgU3BlY2lmaWVzIHRoZSBUSTEgaW5wdXQgcHJlc2NhbGVyIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfSUNQU0MuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX0lDX1NldFByZXNjYWxlcigpLiovCisKKyAgdWludDMyX3QgSUMxRmlsdGVyOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVEkxIGlucHV0IGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0lDX0ZJTFRFUi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fSUNfU2V0RmlsdGVyKCkuKi8KKworICB1aW50MzJfdCBJQzJQb2xhcml0eTsgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgYWN0aXZlIGVkZ2Ugb2YgVEkyIGlucHV0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfSUNfUE9MQVJJVFkuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX0lDX1NldFBvbGFyaXR5KCkuKi8KKworICB1aW50MzJfdCBJQzJBY3RpdmVJbnB1dDsgIC8qITwgU3BlY2lmaWVzIHRoZSBUSTIgaW5wdXQgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19BQ1RJVkVJTlBVVC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fSUNfU2V0QWN0aXZlSW5wdXQoKS4qLworCisgIHVpbnQzMl90IElDMlByZXNjYWxlcjsgICAgLyohPCBTcGVjaWZpZXMgdGhlIFRJMiBpbnB1dCBwcmVzY2FsZXIgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19JQ1BTQy4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fSUNfU2V0UHJlc2NhbGVyKCkuKi8KKworICB1aW50MzJfdCBJQzJGaWx0ZXI7ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBUSTIgaW5wdXQgZmlsdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfSUNfRklMVEVSLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9JQ19TZXRGaWx0ZXIoKS4qLworCit9IExMX1RJTV9FTkNPREVSX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFRJTSBIYWxsIHNlbnNvciBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisKKyAgdWludDMyX3QgSUMxUG9sYXJpdHk7ICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgYWN0aXZlIGVkZ2Ugb2YgVEkxIGlucHV0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfSUNfUE9MQVJJVFkuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX0lDX1NldFBvbGFyaXR5KCkuKi8KKworICB1aW50MzJfdCBJQzFQcmVzY2FsZXI7ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBUSTEgaW5wdXQgcHJlc2NhbGVyIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlc2NhbGVyIG11c3QgYmUgc2V0IHRvIGdldCBhIG1heGltdW0gY291bnRlciBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIGludGVydmFsIGJldHdlZW4gMiBjb25zZWN1dGl2ZSBjaGFuZ2VzIG9uIHRoZSBIYWxsIGlucHV0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0lDUFNDLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9JQ19TZXRQcmVzY2FsZXIoKS4qLworCisgIHVpbnQzMl90IElDMUZpbHRlcjsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFRJMSBpbnB1dCBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19JQ19GSUxURVIuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX0lDX1NldEZpbHRlcigpLiovCisKKyAgdWludDMyX3QgQ29tbXV0YXRpb25EZWxheTsgICAvKiE8IFNwZWNpZmllcyB0aGUgY29tcGFyZSB2YWx1ZSB0byBiZSBsb2FkZWQgaW50byB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBwb3NpdGl2ZSBwdWxzZSAoVFJHTyBldmVudCkgaXMgZ2VuZXJhdGVkIHdpdGggYSBwcm9ncmFtbWFibGUgZGVsYXkgZXZlcnkgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBjaGFuZ2Ugb2NjdXJzIG9uIHRoZSBIYWxsIGlucHV0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fT0NfU2V0Q29tcGFyZUNIMigpLiovCit9IExMX1RJTV9IQUxMU0VOU09SX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEJEVFIgKEJyZWFrIGFuZCBEZWFkIFRpbWUpIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBPU1NSU3RhdGU7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIE9mZi1TdGF0ZSBzZWxlY3Rpb24gdXNlZCBpbiBSdW4gbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfT1NTUgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX1NldE9mZlN0YXRlcygpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBiaXQtZmllbGQgY2Fubm90IGJlIG1vZGlmaWVkIGFzIGxvbmcgYXMgTE9DSyBsZXZlbCAyIGhhcyBiZWVuIHByb2dyYW1tZWQuICovCisKKyAgdWludDMyX3QgT1NTSVN0YXRlOyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBPZmYtU3RhdGUgdXNlZCBpbiBJZGxlIHN0YXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19PU1NJCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fU2V0T2ZmU3RhdGVzKCkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIGJpdC1maWVsZCBjYW5ub3QgYmUgbW9kaWZpZWQgYXMgbG9uZyBhcyBMT0NLIGxldmVsIDIgaGFzIGJlZW4gcHJvZ3JhbW1lZC4gKi8KKworICB1aW50MzJfdCBMb2NrTGV2ZWw7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIExPQ0sgbGV2ZWwgcGFyYW1ldGVycy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfTE9DS0xFVkVMCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhlIExPQ0sgYml0cyBjYW4gYmUgd3JpdHRlbiBvbmx5IG9uY2UgYWZ0ZXIgdGhlIHJlc2V0LiBPbmNlIHRoZSBUSU14X0JEVFIgcmVnaXN0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzIGJlZW4gd3JpdHRlbiwgdGhlaXIgY29udGVudCBpcyBmcm96ZW4gdW50aWwgdGhlIG5leHQgcmVzZXQuKi8KKworICB1aW50OF90IERlYWRUaW1lOyAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGRlbGF5IHRpbWUgYmV0d2VlbiB0aGUgc3dpdGNoaW5nLW9mZiBhbmQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaGluZy1vbiBvZiB0aGUgb3V0cHV0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9IDB4RkYuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fT0NfU2V0RGVhZFRpbWUoKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgYml0LWZpZWxkIGNhbiBub3QgYmUgbW9kaWZpZWQgYXMgbG9uZyBhcyBMT0NLIGxldmVsIDEsIDIgb3IgMyBoYXMgYmVlbiBwcm9ncmFtbWVkLiAqLworCisgIHVpbnQxNl90IEJyZWFrU3RhdGU7ICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBUSU0gQnJlYWsgaW5wdXQgaXMgZW5hYmxlZCBvciBub3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0JSRUFLX0VOQUJMRQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9ucyBAcmVmIExMX1RJTV9FbmFibGVCUksoKSBvciBAcmVmIExMX1RJTV9EaXNhYmxlQlJLKCkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIGJpdC1maWVsZCBjYW4gbm90IGJlIG1vZGlmaWVkIGFzIGxvbmcgYXMgTE9DSyBsZXZlbCAxIGhhcyBiZWVuIHByb2dyYW1tZWQuICovCisKKyAgdWludDMyX3QgQnJlYWtQb2xhcml0eTsgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBUSU0gQnJlYWsgSW5wdXQgcGluIHBvbGFyaXR5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19CUkVBS19QT0xBUklUWQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX0NvbmZpZ0JSSygpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBiaXQtZmllbGQgY2FuIG5vdCBiZSBtb2RpZmllZCBhcyBsb25nIGFzIExPQ0sgbGV2ZWwgMSBoYXMgYmVlbiBwcm9ncmFtbWVkLiAqLworCisjaWYgZGVmaW5lZChUSU1fQkRUUl9CS0YpCisgIHVpbnQzMl90IEJyZWFrRmlsdGVyOyAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVElNIEJyZWFrIEZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfQlJFQUtfRklMVEVSCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fQ29uZmlnQlJLKCkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIGJpdC1maWVsZCBjYW4gbm90IGJlIG1vZGlmaWVkIGFzIGxvbmcgYXMgTE9DSyBsZXZlbCAxIGhhcyBiZWVuIHByb2dyYW1tZWQuICovCisKKyNlbmRpZiAvKiBUSU1fQkRUUl9CS0YgKi8KKyNpZiBkZWZpbmVkKFRJTV9CRFRSX0JLMkUpCisgIHVpbnQzMl90IEJyZWFrMlN0YXRlOyAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBUSU0gQnJlYWsyIGlucHV0IGlzIGVuYWJsZWQgb3Igbm90LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19CUkVBSzJfRU5BQkxFCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb25zIEByZWYgTExfVElNX0VuYWJsZUJSSzIoKSBvciBAcmVmIExMX1RJTV9EaXNhYmxlQlJLMigpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBiaXQtZmllbGQgY2FuIG5vdCBiZSBtb2RpZmllZCBhcyBsb25nIGFzIExPQ0sgbGV2ZWwgMSBoYXMgYmVlbiBwcm9ncmFtbWVkLiAqLworCisgIHVpbnQzMl90IEJyZWFrMlBvbGFyaXR5OyAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFRJTSBCcmVhazIgSW5wdXQgcGluIHBvbGFyaXR5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19CUkVBSzJfUE9MQVJJVFkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9Db25maWdCUksyKCkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIGJpdC1maWVsZCBjYW4gbm90IGJlIG1vZGlmaWVkIGFzIGxvbmcgYXMgTE9DSyBsZXZlbCAxIGhhcyBiZWVuIHByb2dyYW1tZWQuICovCisKKyAgdWludDMyX3QgQnJlYWsyRmlsdGVyOyAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVElNIEJyZWFrMiBGaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0JSRUFLMl9GSUxURVIKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9Db25maWdCUksyKCkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIGJpdC1maWVsZCBjYW4gbm90IGJlIG1vZGlmaWVkIGFzIGxvbmcgYXMgTE9DSyBsZXZlbCAxIGhhcyBiZWVuIHByb2dyYW1tZWQuICovCisKKyNlbmRpZiAvKiBUSU1fQkRUUl9CSzJFICovCisgIHVpbnQzMl90IEF1dG9tYXRpY091dHB1dDsgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBUSU0gQXV0b21hdGljIE91dHB1dCBmZWF0dXJlIGlzIGVuYWJsZWQgb3Igbm90LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19BVVRPTUFUSUNPVVRQVVRfRU5BQkxFCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb25zIEByZWYgTExfVElNX0VuYWJsZUF1dG9tYXRpY091dHB1dCgpIG9yIEByZWYgTExfVElNX0Rpc2FibGVBdXRvbWF0aWNPdXRwdXQoKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgYml0LWZpZWxkIGNhbiBub3QgYmUgbW9kaWZpZWQgYXMgbG9uZyBhcyBMT0NLIGxldmVsIDEgaGFzIGJlZW4gcHJvZ3JhbW1lZC4gKi8KK30gTExfVElNX0JEVFJfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FeHBvcnRlZF9Db25zdGFudHMgVElNIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0dFVF9GTEFHIEdldCBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9USU1fUmVhZFJlZyBmdW5jdGlvbi4KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fU1JfVUlGICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fU1JfVUlGICAgICAgICAgICAvKiE8IFVwZGF0ZSBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBMTF9USU1fU1JfQ0MxSUYgICAgICAgICAgICAgICAgICAgICAgICBUSU1fU1JfQ0MxSUYgICAgICAgICAvKiE8IENhcHR1cmUvY29tcGFyZSAxIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1RJTV9TUl9DQzJJRiAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9DQzJJRiAgICAgICAgIC8qITwgQ2FwdHVyZS9jb21wYXJlIDIgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfVElNX1NSX0NDM0lGICAgICAgICAgICAgICAgICAgICAgICAgVElNX1NSX0NDM0lGICAgICAgICAgLyohPCBDYXB0dXJlL2NvbXBhcmUgMyBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBMTF9USU1fU1JfQ0M0SUYgICAgICAgICAgICAgICAgICAgICAgICBUSU1fU1JfQ0M0SUYgICAgICAgICAvKiE8IENhcHR1cmUvY29tcGFyZSA0IGludGVycnVwdCBmbGFnICovCisjaWYgZGVmaW5lZChUSU1fQ0NNUjFfT0MxTV8zKQorI2RlZmluZSBMTF9USU1fU1JfQ0M1SUYgICAgICAgICAgICAgICAgICAgICAgICBUSU1fU1JfQ0M1SUYgICAgICAgICAvKiE8IENhcHR1cmUvY29tcGFyZSA1IGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1RJTV9TUl9DQzZJRiAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9DQzZJRiAgICAgICAgIC8qITwgQ2FwdHVyZS9jb21wYXJlIDYgaW50ZXJydXB0IGZsYWcgKi8KKyNlbmRpZiAvKiBUSU1fQ0NNUjFfT0MxTV8zICovCisjZGVmaW5lIExMX1RJTV9TUl9DT01JRiAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9DT01JRiAgICAgICAgIC8qITwgQ09NIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1RJTV9TUl9USUYgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9USUYgICAgICAgICAgIC8qITwgVHJpZ2dlciBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBMTF9USU1fU1JfQklGICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fU1JfQklGICAgICAgICAgICAvKiE8IEJyZWFrIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1RJTV9TUl9CMklGICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9CMklGICAgICAgICAgIC8qITwgU2Vjb25kIGJyZWFrIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1RJTV9TUl9DQzFPRiAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9DQzFPRiAgICAgICAgIC8qITwgQ2FwdHVyZS9Db21wYXJlIDEgb3ZlcmNhcHR1cmUgZmxhZyAqLworI2RlZmluZSBMTF9USU1fU1JfQ0MyT0YgICAgICAgICAgICAgICAgICAgICAgICBUSU1fU1JfQ0MyT0YgICAgICAgICAvKiE8IENhcHR1cmUvQ29tcGFyZSAyIG92ZXJjYXB0dXJlIGZsYWcgKi8KKyNkZWZpbmUgTExfVElNX1NSX0NDM09GICAgICAgICAgICAgICAgICAgICAgICAgVElNX1NSX0NDM09GICAgICAgICAgLyohPCBDYXB0dXJlL0NvbXBhcmUgMyBvdmVyY2FwdHVyZSBmbGFnICovCisjZGVmaW5lIExMX1RJTV9TUl9DQzRPRiAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9DQzRPRiAgICAgICAgIC8qITwgQ2FwdHVyZS9Db21wYXJlIDQgb3ZlcmNhcHR1cmUgZmxhZyAqLworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQlJFQUtfRU5BQkxFIEJyZWFrIEVuYWJsZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19ESVNBQkxFICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBCcmVhayBmdW5jdGlvbiBkaXNhYmxlZCAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfRU5BQkxFICAgICAgICAgICAgIFRJTV9CRFRSX0JLRSAgICAgICAgICAgIC8qITwgQnJlYWsgZnVuY3Rpb24gZW5hYmxlZCAqLworLyoqCisgICogQH0KKyAgKi8KKyNpZiBkZWZpbmVkKFRJTV9CRFRSX0JLMkUpCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0JSRUFLMl9FTkFCTEUgQnJlYWsyIEVuYWJsZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfRElTQUJMRSAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAvKiE8IEJyZWFrMiBmdW5jdGlvbiBkaXNhYmxlZCAqLworI2RlZmluZSBMTF9USU1fQlJFQUsyX0VOQUJMRSAgICAgICAgICAgICBUSU1fQkRUUl9CSzJFICAgICAgICAgICAgLyohPCBCcmVhazIgZnVuY3Rpb24gZW5hYmxlZCAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBUSU1fQkRUUl9CSzJFICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0FVVE9NQVRJQ09VVFBVVF9FTkFCTEUgQXV0b21hdGljIG91dHB1dCBlbmFibGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fQVVUT01BVElDT1VUUFVUX0RJU0FCTEUgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IE1PRSBjYW4gYmUgc2V0IG9ubHkgYnkgc29mdHdhcmUgKi8KKyNkZWZpbmUgTExfVElNX0FVVE9NQVRJQ09VVFBVVF9FTkFCTEUgICAgICAgICAgVElNX0JEVFJfQU9FICAgICAgICAgICAgLyohPCBNT0UgY2FuIGJlIHNldCBieSBzb2Z0d2FyZSBvciBhdXRvbWF0aWNhbGx5IGF0IHRoZSBuZXh0IHVwZGF0ZSBldmVudCAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfSVQgSVQgRGVmaW5lcworICAqIEBicmllZiAgICBJVCBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfVElNX1JlYWRSZWcgYW5kICBMTF9USU1fV3JpdGVSZWcgZnVuY3Rpb25zLgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9ESUVSX1VJRSAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9ESUVSX1VJRSAgICAgICAgIC8qITwgVXBkYXRlIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVElNX0RJRVJfQ0MxSUUgICAgICAgICAgICAgICAgICAgICAgVElNX0RJRVJfQ0MxSUUgICAgICAgLyohPCBDYXB0dXJlL2NvbXBhcmUgMSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1RJTV9ESUVSX0NDMklFICAgICAgICAgICAgICAgICAgICAgIFRJTV9ESUVSX0NDMklFICAgICAgIC8qITwgQ2FwdHVyZS9jb21wYXJlIDIgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9USU1fRElFUl9DQzNJRSAgICAgICAgICAgICAgICAgICAgICBUSU1fRElFUl9DQzNJRSAgICAgICAvKiE8IENhcHR1cmUvY29tcGFyZSAzIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVElNX0RJRVJfQ0M0SUUgICAgICAgICAgICAgICAgICAgICAgVElNX0RJRVJfQ0M0SUUgICAgICAgLyohPCBDYXB0dXJlL2NvbXBhcmUgNCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1RJTV9ESUVSX0NPTUlFICAgICAgICAgICAgICAgICAgICAgIFRJTV9ESUVSX0NPTUlFICAgICAgIC8qITwgQ09NIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVElNX0RJRVJfVElFICAgICAgICAgICAgICAgICAgICAgICAgVElNX0RJRVJfVElFICAgICAgICAgLyohPCBUcmlnZ2VyIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVElNX0RJRVJfQklFICAgICAgICAgICAgICAgICAgICAgICAgVElNX0RJRVJfQklFICAgICAgICAgLyohPCBCcmVhayBpbnRlcnJ1cHQgZW5hYmxlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19VUERBVEVTT1VSQ0UgVXBkYXRlIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9VUERBVEVTT1VSQ0VfUkVHVUxBUiAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgIC8qITwgQ291bnRlciBvdmVyZmxvdy91bmRlcmZsb3csIFNldHRpbmcgdGhlIFVHIGJpdCBvciBVcGRhdGUgZ2VuZXJhdGlvbiB0aHJvdWdoIHRoZSBzbGF2ZSBtb2RlIGNvbnRyb2xsZXIgZ2VuZXJhdGVzIGFuIHVwZGF0ZSByZXF1ZXN0ICovCisjZGVmaW5lIExMX1RJTV9VUERBVEVTT1VSQ0VfQ09VTlRFUiAgICAgICAgICAgIFRJTV9DUjFfVVJTICAgICAgICAgIC8qITwgT25seSBjb3VudGVyIG92ZXJmbG93L3VuZGVyZmxvdyBnZW5lcmF0ZXMgYW4gdXBkYXRlIHJlcXVlc3QgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX09ORVBVTFNFTU9ERSBPbmUgUHVsc2UgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9PTkVQVUxTRU1PREVfU0lOR0xFICAgICAgICAgICAgIFRJTV9DUjFfT1BNICAgICAgICAgIC8qITwgQ291bnRlciBpcyBub3Qgc3RvcHBlZCBhdCB1cGRhdGUgZXZlbnQgKi8KKyNkZWZpbmUgTExfVElNX09ORVBVTFNFTU9ERV9SRVBFVElUSVZFICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgLyohPCBDb3VudGVyIHN0b3BzIGNvdW50aW5nIGF0IHRoZSBuZXh0IHVwZGF0ZSBldmVudCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQ09VTlRFUk1PREUgQ291bnRlciBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0NPVU5URVJNT0RFX1VQICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgLyohPENvdW50ZXIgdXNlZCBhcyB1cGNvdW50ZXIgKi8KKyNkZWZpbmUgTExfVElNX0NPVU5URVJNT0RFX0RPV04gICAgICAgICAgICAgICAgVElNX0NSMV9ESVIgICAgICAgICAgLyohPCBDb3VudGVyIHVzZWQgYXMgZG93bmNvdW50ZXIgKi8KKyNkZWZpbmUgTExfVElNX0NPVU5URVJNT0RFX0NFTlRFUl9VUCAgICAgICAgICAgVElNX0NSMV9DTVNfMCAgICAgICAgLyohPCBUaGUgY291bnRlciBjb3VudHMgdXAgYW5kIGRvd24gYWx0ZXJuYXRpdmVseS4gT3V0cHV0IGNvbXBhcmUgaW50ZXJydXB0IGZsYWdzIG9mIG91dHB1dCBjaGFubmVscyAgYXJlIHNldCBvbmx5IHdoZW4gdGhlIGNvdW50ZXIgaXMgY291bnRpbmcgZG93bi4gKi8KKyNkZWZpbmUgTExfVElNX0NPVU5URVJNT0RFX0NFTlRFUl9ET1dOICAgICAgICAgVElNX0NSMV9DTVNfMSAgICAgICAgLyohPFRoZSBjb3VudGVyIGNvdW50cyB1cCBhbmQgZG93biBhbHRlcm5hdGl2ZWx5LiBPdXRwdXQgY29tcGFyZSBpbnRlcnJ1cHQgZmxhZ3Mgb2Ygb3V0cHV0IGNoYW5uZWxzICBhcmUgc2V0IG9ubHkgd2hlbiB0aGUgY291bnRlciBpcyBjb3VudGluZyB1cCAqLworI2RlZmluZSBMTF9USU1fQ09VTlRFUk1PREVfQ0VOVEVSX1VQX0RPV04gICAgICBUSU1fQ1IxX0NNUyAgICAgICAgICAvKiE8IFRoZSBjb3VudGVyIGNvdW50cyB1cCBhbmQgZG93biBhbHRlcm5hdGl2ZWx5LiBPdXRwdXQgY29tcGFyZSBpbnRlcnJ1cHQgZmxhZ3Mgb2Ygb3V0cHV0IGNoYW5uZWxzICBhcmUgc2V0IG9ubHkgd2hlbiB0aGUgY291bnRlciBpcyBjb3VudGluZyB1cCBvciBkb3duLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQ0xPQ0tESVZJU0lPTiBDbG9jayBEaXZpc2lvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjEgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgIC8qITwgdERUUz10Q0tfSU5UICovCisjZGVmaW5lIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjIgICAgICAgICAgICAgIFRJTV9DUjFfQ0tEXzAgICAgICAgIC8qITwgdERUUz0yKnRDS19JTlQgKi8KKyNkZWZpbmUgTExfVElNX0NMT0NLRElWSVNJT05fRElWNCAgICAgICAgICAgICAgVElNX0NSMV9DS0RfMSAgICAgICAgLyohPCB0RFRTPTQqdENLX0lOVCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQ09VTlRFUkRJUkVDVElPTiBDb3VudGVyIERpcmVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9DT1VOVEVSRElSRUNUSU9OX1VQICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgIC8qITwgVGltZXIgY291bnRlciBjb3VudHMgdXAgKi8KKyNkZWZpbmUgTExfVElNX0NPVU5URVJESVJFQ1RJT05fRE9XTiAgICAgICAgICAgVElNX0NSMV9ESVIgICAgICAgICAgLyohPCBUaW1lciBjb3VudGVyIGNvdW50cyBkb3duICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19DQ1VQREFURVNPVVJDRSBDYXB0dXJlIENvbXBhcmUgIFVwZGF0ZSBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fQ0NVUERBVEVTT1VSQ0VfQ09NR19PTkxZICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAvKiE8IENhcHR1cmUvY29tcGFyZSBjb250cm9sIGJpdHMgYXJlIHVwZGF0ZWQgYnkgc2V0dGluZyB0aGUgQ09NRyBiaXQgb25seSAqLworI2RlZmluZSBMTF9USU1fQ0NVUERBVEVTT1VSQ0VfQ09NR19BTkRfVFJHSSAgICBUSU1fQ1IyX0NDVVMgICAgICAgICAvKiE8IENhcHR1cmUvY29tcGFyZSBjb250cm9sIGJpdHMgYXJlIHVwZGF0ZWQgYnkgc2V0dGluZyB0aGUgQ09NRyBiaXQgb3Igd2hlbiBhIHJpc2luZyBlZGdlIG9jY3VycyBvbiB0cmlnZ2VyIGlucHV0IChUUkdJKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQ0NETUFSRVFVRVNUIENhcHR1cmUgQ29tcGFyZSBETUEgUmVxdWVzdAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9DQ0RNQVJFUVVFU1RfQ0MgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgIC8qITwgQ0N4IERNQSByZXF1ZXN0IHNlbnQgd2hlbiBDQ3ggZXZlbnQgb2NjdXJzICovCisjZGVmaW5lIExMX1RJTV9DQ0RNQVJFUVVFU1RfVVBEQVRFICAgICAgICAgICAgIFRJTV9DUjJfQ0NEUyAgICAgICAgIC8qITwgQ0N4IERNQSByZXF1ZXN0cyBzZW50IHdoZW4gdXBkYXRlIGV2ZW50IG9jY3VycyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfTE9DS0xFVkVMIExvY2sgTGV2ZWwKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fTE9DS0xFVkVMX09GRiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAvKiE8IExPQ0sgT0ZGIC0gTm8gYml0IGlzIHdyaXRlIHByb3RlY3RlZCAqLworI2RlZmluZSBMTF9USU1fTE9DS0xFVkVMXzEgICAgICAgICAgICAgICAgICAgICBUSU1fQkRUUl9MT0NLXzAgICAgICAvKiE8IExPQ0sgTGV2ZWwgMSAqLworI2RlZmluZSBMTF9USU1fTE9DS0xFVkVMXzIgICAgICAgICAgICAgICAgICAgICBUSU1fQkRUUl9MT0NLXzEgICAgICAvKiE8IExPQ0sgTGV2ZWwgMiAqLworI2RlZmluZSBMTF9USU1fTE9DS0xFVkVMXzMgICAgICAgICAgICAgICAgICAgICBUSU1fQkRUUl9MT0NLICAgICAgICAvKiE8IExPQ0sgTGV2ZWwgMyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQ0hBTk5FTCBDaGFubmVsCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFRJTV9DQ01SMV9PQzFNXzMpCisjZGVmaW5lIExMX1RJTV9DSEFOTkVMX0NIMSAgICAgICAgICAgICAgICAgICAgIFRJTV9DQ0VSX0NDMUUgICAgIC8qITwgVGltZXIgaW5wdXQvb3V0cHV0IGNoYW5uZWwgMSAqLworI2RlZmluZSBMTF9USU1fQ0hBTk5FTF9DSDFOICAgICAgICAgICAgICAgICAgICBUSU1fQ0NFUl9DQzFORSAgICAvKiE8IFRpbWVyIGNvbXBsZW1lbnRhcnkgb3V0cHV0IGNoYW5uZWwgMSAqLworI2RlZmluZSBMTF9USU1fQ0hBTk5FTF9DSDIgICAgICAgICAgICAgICAgICAgICBUSU1fQ0NFUl9DQzJFICAgICAvKiE8IFRpbWVyIGlucHV0L291dHB1dCBjaGFubmVsIDIgKi8KKyNkZWZpbmUgTExfVElNX0NIQU5ORUxfQ0gyTiAgICAgICAgICAgICAgICAgICAgVElNX0NDRVJfQ0MyTkUgICAgLyohPCBUaW1lciBjb21wbGVtZW50YXJ5IG91dHB1dCBjaGFubmVsIDIgKi8KKyNkZWZpbmUgTExfVElNX0NIQU5ORUxfQ0gzICAgICAgICAgICAgICAgICAgICAgVElNX0NDRVJfQ0MzRSAgICAgLyohPCBUaW1lciBpbnB1dC9vdXRwdXQgY2hhbm5lbCAzICovCisjZGVmaW5lIExMX1RJTV9DSEFOTkVMX0NIM04gICAgICAgICAgICAgICAgICAgIFRJTV9DQ0VSX0NDM05FICAgIC8qITwgVGltZXIgY29tcGxlbWVudGFyeSBvdXRwdXQgY2hhbm5lbCAzICovCisjZGVmaW5lIExMX1RJTV9DSEFOTkVMX0NINCAgICAgICAgICAgICAgICAgICAgIFRJTV9DQ0VSX0NDNEUgICAgIC8qITwgVGltZXIgaW5wdXQvb3V0cHV0IGNoYW5uZWwgNCAqLworI2RlZmluZSBMTF9USU1fQ0hBTk5FTF9DSDUgICAgICAgICAgICAgICAgICAgICBUSU1fQ0NFUl9DQzVFICAgICAvKiE8IFRpbWVyIG91dHB1dCBjaGFubmVsIDUgKi8KKyNkZWZpbmUgTExfVElNX0NIQU5ORUxfQ0g2ICAgICAgICAgICAgICAgICAgICAgVElNX0NDRVJfQ0M2RSAgICAgLyohPCBUaW1lciBvdXRwdXQgY2hhbm5lbCA2ICovCisjZWxzZQorI2RlZmluZSBMTF9USU1fQ0hBTk5FTF9DSDEgICAgICAgICAgICAgICAgICAgICBUSU1fQ0NFUl9DQzFFICAgICAvKiE8IFRpbWVyIGlucHV0L291dHB1dCBjaGFubmVsIDEgKi8KKyNkZWZpbmUgTExfVElNX0NIQU5ORUxfQ0gxTiAgICAgICAgICAgICAgICAgICAgVElNX0NDRVJfQ0MxTkUgICAgLyohPCBUaW1lciBjb21wbGVtZW50YXJ5IG91dHB1dCBjaGFubmVsIDEgKi8KKyNkZWZpbmUgTExfVElNX0NIQU5ORUxfQ0gyICAgICAgICAgICAgICAgICAgICAgVElNX0NDRVJfQ0MyRSAgICAgLyohPCBUaW1lciBpbnB1dC9vdXRwdXQgY2hhbm5lbCAyICovCisjZGVmaW5lIExMX1RJTV9DSEFOTkVMX0NIMk4gICAgICAgICAgICAgICAgICAgIFRJTV9DQ0VSX0NDMk5FICAgIC8qITwgVGltZXIgY29tcGxlbWVudGFyeSBvdXRwdXQgY2hhbm5lbCAyICovCisjZGVmaW5lIExMX1RJTV9DSEFOTkVMX0NIMyAgICAgICAgICAgICAgICAgICAgIFRJTV9DQ0VSX0NDM0UgICAgIC8qITwgVGltZXIgaW5wdXQvb3V0cHV0IGNoYW5uZWwgMyAqLworI2RlZmluZSBMTF9USU1fQ0hBTk5FTF9DSDNOICAgICAgICAgICAgICAgICAgICBUSU1fQ0NFUl9DQzNORSAgICAvKiE8IFRpbWVyIGNvbXBsZW1lbnRhcnkgb3V0cHV0IGNoYW5uZWwgMyAqLworI2RlZmluZSBMTF9USU1fQ0hBTk5FTF9DSDQgICAgICAgICAgICAgICAgICAgICBUSU1fQ0NFUl9DQzRFICAgICAvKiE8IFRpbWVyIGlucHV0L291dHB1dCBjaGFubmVsIDQgKi8KKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBUSU1fTExfRUNfT0NTVEFURSBPdXRwdXQgQ29uZmlndXJhdGlvbiBTdGF0ZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9PQ1NUQVRFX0RJU0FCTEUgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgT0N4IGlzIG5vdCBhY3RpdmUgKi8KKyNkZWZpbmUgTExfVElNX09DU1RBVEVfRU5BQkxFICAgICAgICAgICAgICAgICAgVElNX0NDRVJfQ0MxRSAgICAgICAgICAgLyohPCBPQ3ggc2lnbmFsIGlzIG91dHB1dCBvbiB0aGUgY29ycmVzcG9uZGluZyBvdXRwdXQgcGluICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19PQ01PREUgT3V0cHV0IENvbmZpZ3VyYXRpb24gTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9PQ01PREVfRlJPWkVOICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITxUaGUgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBvdXRwdXQgY29tcGFyZSByZWdpc3RlciBUSU14X0NDUnkgYW5kIHRoZSBjb3VudGVyIFRJTXhfQ05UIGhhcyBubyBlZmZlY3Qgb24gdGhlIG91dHB1dCBjaGFubmVsIGxldmVsICovCisjZGVmaW5lIExMX1RJTV9PQ01PREVfQUNUSVZFICAgICAgICAgICAgICAgICAgIFRJTV9DQ01SMV9PQzFNXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITxPQ3lSRUYgaXMgZm9yY2VkIGhpZ2ggb24gY29tcGFyZSBtYXRjaCovCisjZGVmaW5lIExMX1RJTV9PQ01PREVfSU5BQ1RJVkUgICAgICAgICAgICAgICAgIFRJTV9DQ01SMV9PQzFNXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITxPQ3lSRUYgaXMgZm9yY2VkIGxvdyBvbiBjb21wYXJlIG1hdGNoKi8KKyNkZWZpbmUgTExfVElNX09DTU9ERV9UT0dHTEUgICAgICAgICAgICAgICAgICAgKFRJTV9DQ01SMV9PQzFNXzEgfCBUSU1fQ0NNUjFfT0MxTV8wKSAgICAgICAgICAgICAgICAgICAgLyohPE9DeVJFRiB0b2dnbGVzIG9uIGNvbXBhcmUgbWF0Y2gqLworI2RlZmluZSBMTF9USU1fT0NNT0RFX0ZPUkNFRF9JTkFDVElWRSAgICAgICAgICBUSU1fQ0NNUjFfT0MxTV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPE9DeVJFRiBpcyBmb3JjZWQgbG93Ki8KKyNkZWZpbmUgTExfVElNX09DTU9ERV9GT1JDRURfQUNUSVZFICAgICAgICAgICAgKFRJTV9DQ01SMV9PQzFNXzIgfCBUSU1fQ0NNUjFfT0MxTV8wKSAgICAgICAgICAgICAgICAgICAgLyohPE9DeVJFRiBpcyBmb3JjZWQgaGlnaCovCisjZGVmaW5lIExMX1RJTV9PQ01PREVfUFdNMSAgICAgICAgICAgICAgICAgICAgIChUSU1fQ0NNUjFfT0MxTV8yIHwgVElNX0NDTVIxX09DMU1fMSkgICAgICAgICAgICAgICAgICAgIC8qITxJbiB1cGNvdW50aW5nLCBjaGFubmVsIHkgaXMgYWN0aXZlIGFzIGxvbmcgYXMgVElNeF9DTlQ8VElNeF9DQ1J5IGVsc2UgaW5hY3RpdmUuICBJbiBkb3duY291bnRpbmcsIGNoYW5uZWwgeSBpcyBpbmFjdGl2ZSBhcyBsb25nIGFzIFRJTXhfQ05UPlRJTXhfQ0NSeSBlbHNlIGFjdGl2ZS4qLworI2RlZmluZSBMTF9USU1fT0NNT0RFX1BXTTIgICAgICAgICAgICAgICAgICAgICAoVElNX0NDTVIxX09DMU1fMiB8IFRJTV9DQ01SMV9PQzFNXzEgfCBUSU1fQ0NNUjFfT0MxTV8wKSAvKiE8SW4gdXBjb3VudGluZywgY2hhbm5lbCB5IGlzIGluYWN0aXZlIGFzIGxvbmcgYXMgVElNeF9DTlQ8VElNeF9DQ1J5IGVsc2UgYWN0aXZlLiAgSW4gZG93bmNvdW50aW5nLCBjaGFubmVsIHkgaXMgYWN0aXZlIGFzIGxvbmcgYXMgVElNeF9DTlQ+VElNeF9DQ1J5IGVsc2UgaW5hY3RpdmUqLworI2lmIGRlZmluZWQoVElNX0NDTVIxX09DMU1fMykKKyNkZWZpbmUgTExfVElNX09DTU9ERV9SRVRSSUdfT1BNMSAgICAgICAgICAgICAgVElNX0NDTVIxX09DMU1fMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPFJldHJpZ2VycmFibGUgT1BNIG1vZGUgMSovCisjZGVmaW5lIExMX1RJTV9PQ01PREVfUkVUUklHX09QTTIgICAgICAgICAgICAgIChUSU1fQ0NNUjFfT0MxTV8zIHwgVElNX0NDTVIxX09DMU1fMCkgICAgICAgICAgICAgICAgICAgIC8qITxSZXRyaWdlcnJhYmxlIE9QTSBtb2RlIDIqLworI2VuZGlmCisjaWYgZGVmaW5lZChUSU1fQ0NNUjFfT0MxTV8zKQorI2RlZmluZSBMTF9USU1fT0NNT0RFX0NPTUJJTkVEX1BXTTEgICAgICAgICAgICAoVElNX0NDTVIxX09DMU1fMyB8IFRJTV9DQ01SMV9PQzFNXzIpICAgICAgICAgICAgICAgICAgICAvKiE8Q29tYmluZWQgUFdNIG1vZGUgMSovCisjZGVmaW5lIExMX1RJTV9PQ01PREVfQ09NQklORURfUFdNMiAgICAgICAgICAgIChUSU1fQ0NNUjFfT0MxTV8zIHwgVElNX0NDTVIxX09DMU1fMCB8IFRJTV9DQ01SMV9PQzFNXzIpIC8qITxDb21iaW5lZCBQV00gbW9kZSAyKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoVElNX0NDTVIxX09DMU1fMykKKyNkZWZpbmUgTExfVElNX09DTU9ERV9BU1NZTUVUUklDX1BXTTEgICAgICAgICAgKFRJTV9DQ01SMV9PQzFNXzMgfCBUSU1fQ0NNUjFfT0MxTV8xIHwgVElNX0NDTVIxX09DMU1fMikgLyohPEFzeW1tZXRyaWMgUFdNIG1vZGUgMSovCisjZGVmaW5lIExMX1RJTV9PQ01PREVfQVNTWU1FVFJJQ19QV00yICAgICAgICAgIChUSU1fQ0NNUjFfT0MxTV8zIHwgVElNX0NDTVIxX09DMU0pICAgICAgICAgICAgICAgICAgICAgIC8qITxBc3ltbWV0cmljIFBXTSBtb2RlIDIqLworI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19PQ1BPTEFSSVRZIE91dHB1dCBDb25maWd1cmF0aW9uIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX09DUE9MQVJJVFlfSElHSCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgIC8qITwgT0N4YWN0aXZlIGhpZ2gqLworI2RlZmluZSBMTF9USU1fT0NQT0xBUklUWV9MT1cgICAgICAgICAgICAgICAgICBUSU1fQ0NFUl9DQzFQICAgICAgICAgICAgICAgLyohPCBPQ3hhY3RpdmUgbG93Ki8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX09DSURMRVNUQVRFIE91dHB1dCBDb25maWd1cmF0aW9uIElkbGUgU3RhdGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fT0NJRExFU1RBVEVfTE9XICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8T0N4PTAgKGFmdGVyIGEgZGVhZC10aW1lIGlmIE9DIGlzIGltcGxlbWVudGVkKSB3aGVuIE1PRT0wKi8KKyNkZWZpbmUgTExfVElNX09DSURMRVNUQVRFX0hJR0ggICAgICAgICAgICAgICAgVElNX0NSMl9PSVMxICAgICAgICAgICAgLyohPE9DeD0xIChhZnRlciBhIGRlYWQtdGltZSBpZiBPQyBpcyBpbXBsZW1lbnRlZCkgd2hlbiBNT0U9MCovCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChUSU1fQ0NSNV9DQ1I1KQorLyoqIEBkZWZncm91cCBUSU1fTExfRUNfR1JPVVBDSDUgR1JPVVBDSDUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fR1JPVVBDSDVfTk9ORSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBObyBlZmZlY3Qgb2YgT0M1UkVGIG9uIE9DMVJFRkMsIE9DMlJFRkMgYW5kIE9DM1JFRkMgKi8KKyNkZWZpbmUgTExfVElNX0dST1VQQ0g1X09DMVJFRkMgICAgICAgICAgICAgICAgVElNX0NDUjVfR0M1QzEgICAgICAgIC8qITwgT0MxUkVGQyBpcyB0aGUgbG9naWNhbCBBTkQgb2YgT0MxUkVGQyBhbmQgT0M1UkVGICovCisjZGVmaW5lIExMX1RJTV9HUk9VUENINV9PQzJSRUZDICAgICAgICAgICAgICAgIFRJTV9DQ1I1X0dDNUMyICAgICAgICAvKiE8IE9DMlJFRkMgaXMgdGhlIGxvZ2ljYWwgQU5EIG9mIE9DMlJFRkMgYW5kIE9DNVJFRiAqLworI2RlZmluZSBMTF9USU1fR1JPVVBDSDVfT0MzUkVGQyAgICAgICAgICAgICAgICBUSU1fQ0NSNV9HQzVDMyAgICAgICAgLyohPCBPQzNSRUZDIGlzIHRoZSBsb2dpY2FsIEFORCBvZiBPQzNSRUZDIGFuZCBPQzVSRUYgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVElNX0NDUjVfQ0NSNSAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19BQ1RJVkVJTlBVVCBBY3RpdmUgSW5wdXQgU2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0FDVElWRUlOUFVUX0RJUkVDVFRJICAgICAgICAgICAgKFRJTV9DQ01SMV9DQzFTXzAgPDwgMTZVKSAvKiE8IElDeCBpcyBtYXBwZWQgb24gVEl4ICovCisjZGVmaW5lIExMX1RJTV9BQ1RJVkVJTlBVVF9JTkRJUkVDVFRJICAgICAgICAgIChUSU1fQ0NNUjFfQ0MxU18xIDw8IDE2VSkgLyohPCBJQ3ggaXMgbWFwcGVkIG9uIFRJeSAqLworI2RlZmluZSBMTF9USU1fQUNUSVZFSU5QVVRfVFJDICAgICAgICAgICAgICAgICAoVElNX0NDTVIxX0NDMVMgPDwgMTZVKSAgIC8qITwgSUN4IGlzIG1hcHBlZCBvbiBUUkMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0lDUFNDIElucHV0IENvbmZpZ3VyYXRpb24gUHJlc2NhbGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0lDUFNDX0RJVjEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE5vIHByZXNjYWxlciwgY2FwdHVyZSBpcyBkb25lIGVhY2ggdGltZSBhbiBlZGdlIGlzIGRldGVjdGVkIG9uIHRoZSBjYXB0dXJlIGlucHV0ICovCisjZGVmaW5lIExMX1RJTV9JQ1BTQ19ESVYyICAgICAgICAgICAgICAgICAgICAgIChUSU1fQ0NNUjFfSUMxUFNDXzAgPDwgMTZVKSAgICAvKiE8IENhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDIgZXZlbnRzICovCisjZGVmaW5lIExMX1RJTV9JQ1BTQ19ESVY0ICAgICAgICAgICAgICAgICAgICAgIChUSU1fQ0NNUjFfSUMxUFNDXzEgPDwgMTZVKSAgICAvKiE8IENhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDQgZXZlbnRzICovCisjZGVmaW5lIExMX1RJTV9JQ1BTQ19ESVY4ICAgICAgICAgICAgICAgICAgICAgIChUSU1fQ0NNUjFfSUMxUFNDIDw8IDE2VSkgICAgICAvKiE8IENhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDggZXZlbnRzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19JQ19GSUxURVIgSW5wdXQgQ29uZmlndXJhdGlvbiBGaWx0ZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVYxICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBObyBmaWx0ZXIsIHNhbXBsaW5nIGlzIGRvbmUgYXQgZkRUUyAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVYxX04yICAgICAgICAgICAgICAoVElNX0NDTVIxX0lDMUZfMCA8PCAxNlUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9ZkNLX0lOVCwgTj0yICovCisjZGVmaW5lIExMX1RJTV9JQ19GSUxURVJfRkRJVjFfTjQgICAgICAgICAgICAgIChUSU1fQ0NNUjFfSUMxRl8xIDw8IDE2VSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mQ0tfSU5ULCBOPTQgKi8KKyNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWMV9OOCAgICAgICAgICAgICAgKChUSU1fQ0NNUjFfSUMxRl8xIHwgVElNX0NDTVIxX0lDMUZfMCkgPDwgMTZVKSAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZDS19JTlQsIE49OCAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVYyX042ICAgICAgICAgICAgICAoVElNX0NDTVIxX0lDMUZfMiA8PCAxNlUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9ZkRUUy8yLCBOPTYgKi8KKyNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWMl9OOCAgICAgICAgICAgICAgKChUSU1fQ0NNUjFfSUMxRl8yIHwgVElNX0NDTVIxX0lDMUZfMCkgPDwgMTZVKSAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMiwgTj04ICovCisjZGVmaW5lIExMX1RJTV9JQ19GSUxURVJfRkRJVjRfTjYgICAgICAgICAgICAgICgoVElNX0NDTVIxX0lDMUZfMiB8IFRJTV9DQ01SMV9JQzFGXzEpIDw8IDE2VSkgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mRFRTLzQsIE49NiAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVY0X044ICAgICAgICAgICAgICAoKFRJTV9DQ01SMV9JQzFGXzIgfCBUSU1fQ0NNUjFfSUMxRl8xIHwgVElNX0NDTVIxX0lDMUZfMCkgPDwgMTZVKSAgLyohPCBmU0FNUExJTkc9ZkRUUy80LCBOPTggKi8KKyNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWOF9ONiAgICAgICAgICAgICAgKFRJTV9DQ01SMV9JQzFGXzMgPDwgMTZVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZEVFMvOCwgTj02ICovCisjZGVmaW5lIExMX1RJTV9JQ19GSUxURVJfRkRJVjhfTjggICAgICAgICAgICAgICgoVElNX0NDTVIxX0lDMUZfMyB8IFRJTV9DQ01SMV9JQzFGXzApIDw8IDE2VSkgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mRFRTLzgsIE49OCAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVYxNl9ONSAgICAgICAgICAgICAoKFRJTV9DQ01SMV9JQzFGXzMgfCBUSU1fQ0NNUjFfSUMxRl8xKSA8PCAxNlUpICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9ZkRUUy8xNiwgTj01ICovCisjZGVmaW5lIExMX1RJTV9JQ19GSUxURVJfRkRJVjE2X042ICAgICAgICAgICAgICgoVElNX0NDTVIxX0lDMUZfMyB8IFRJTV9DQ01SMV9JQzFGXzEgfCBUSU1fQ0NNUjFfSUMxRl8wKSA8PCAxNlUpICAvKiE8IGZTQU1QTElORz1mRFRTLzE2LCBOPTYgKi8KKyNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWMTZfTjggICAgICAgICAgICAgKChUSU1fQ0NNUjFfSUMxRl8zIHwgVElNX0NDTVIxX0lDMUZfMikgPDwgMTZVKSAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMTYsIE49OCAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVYzMl9ONSAgICAgICAgICAgICAoKFRJTV9DQ01SMV9JQzFGXzMgfCBUSU1fQ0NNUjFfSUMxRl8yIHwgVElNX0NDTVIxX0lDMUZfMCkgPDwgMTZVKSAgLyohPCBmU0FNUExJTkc9ZkRUUy8zMiwgTj01ICovCisjZGVmaW5lIExMX1RJTV9JQ19GSUxURVJfRkRJVjMyX042ICAgICAgICAgICAgICgoVElNX0NDTVIxX0lDMUZfMyB8IFRJTV9DQ01SMV9JQzFGXzIgfCBUSU1fQ0NNUjFfSUMxRl8xKSA8PCAxNlUpICAvKiE8IGZTQU1QTElORz1mRFRTLzMyLCBOPTYgKi8KKyNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWMzJfTjggICAgICAgICAgICAgKFRJTV9DQ01SMV9JQzFGIDw8IDE2VSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMzIsIE49OCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfSUNfUE9MQVJJVFkgSW5wdXQgQ29uZmlndXJhdGlvbiBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9JQ19QT0xBUklUWV9SSVNJTkcgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIGNpcmN1aXQgaXMgc2Vuc2l0aXZlIHRvIFRJeEZQMSByaXNpbmcgZWRnZSwgVEl4RlAxIGlzIG5vdCBpbnZlcnRlZCAqLworI2RlZmluZSBMTF9USU1fSUNfUE9MQVJJVFlfRkFMTElORyAgICAgICAgICAgICBUSU1fQ0NFUl9DQzFQICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBjaXJjdWl0IGlzIHNlbnNpdGl2ZSB0byBUSXhGUDEgZmFsbGluZyBlZGdlLCBUSXhGUDEgaXMgaW52ZXJ0ZWQgKi8KKyNkZWZpbmUgTExfVElNX0lDX1BPTEFSSVRZX0JPVEhFREdFICAgICAgICAgICAgKFRJTV9DQ0VSX0NDMVAgfCBUSU1fQ0NFUl9DQzFOUCkgLyohPCBUaGUgY2lyY3VpdCBpcyBzZW5zaXRpdmUgdG8gYm90aCBUSXhGUDEgcmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2VzLCBUSXhGUDEgaXMgbm90IGludmVydGVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19DTE9DS1NPVVJDRSBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIHRpbWVyIGlzIGNsb2NrZWQgYnkgdGhlIGludGVybmFsIGNsb2NrIHByb3ZpZGVkIGZyb20gdGhlIFJDQyAqLworI2RlZmluZSBMTF9USU1fQ0xPQ0tTT1VSQ0VfRVhUX01PREUxICAgICAgICAgICAoVElNX1NNQ1JfU01TXzIgfCBUSU1fU01DUl9TTVNfMSB8IFRJTV9TTUNSX1NNU18wKSAgIC8qITwgQ291bnRlciBjb3VudHMgYXQgZWFjaCByaXNpbmcgb3IgZmFsbGluZyBlZGdlIG9uIGEgc2VsZWN0ZWQgaW5wdSB0Ki8KKyNkZWZpbmUgTExfVElNX0NMT0NLU09VUkNFX0VYVF9NT0RFMiAgICAgICAgICAgVElNX1NNQ1JfRUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvdW50ZXIgY291bnRzIGF0IGVhY2ggcmlzaW5nIG9yIGZhbGxpbmcgZWRnZSBvbiB0aGUgZXh0ZXJuYWwgdHJpZ2dlciBpbnB1dCBFVFIgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0VOQ09ERVJNT0RFIEVuY29kZXIgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9FTkNPREVSTU9ERV9YMl9USTEgICAgICAgICAgICAgIFRJTV9TTUNSX1NNU18wICAgICAgICAgICAgICAgICAgICAvKiE8IEVuY29kZXIgbW9kZSAxIC0gQ291bnRlciBjb3VudHMgdXAvZG93biBvbiBUSTJGUDIgZWRnZSBkZXBlbmRpbmcgb24gVEkxRlAxIGxldmVsICovCisjZGVmaW5lIExMX1RJTV9FTkNPREVSTU9ERV9YMl9USTIgICAgICAgICAgICAgIFRJTV9TTUNSX1NNU18xICAgICAgICAgICAgICAgICAgICAvKiE8IEVuY29kZXIgbW9kZSAyIC0gQ291bnRlciBjb3VudHMgdXAvZG93biBvbiBUSTFGUDEgZWRnZSBkZXBlbmRpbmcgb24gVEkyRlAyIGxldmVsICovCisjZGVmaW5lIExMX1RJTV9FTkNPREVSTU9ERV9YNF9USTEyICAgICAgICAgICAgIChUSU1fU01DUl9TTVNfMSB8IFRJTV9TTUNSX1NNU18wKSAvKiE8IEVuY29kZXIgbW9kZSAzIC0gQ291bnRlciBjb3VudHMgdXAvZG93biBvbiBib3RoIFRJMUZQMSBhbmQgVEkyRlAyIGVkZ2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGluZyBvbiB0aGUgbGV2ZWwgb2YgdGhlIG90aGVyIGlucHV0IGwgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RSR08gVHJpZ2dlciBPdXRwdXQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fVFJHT19SRVNFVCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVHIGJpdCBmcm9tIHRoZSBUSU14X0VHUiByZWdpc3RlciBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0ICovCisjZGVmaW5lIExMX1RJTV9UUkdPX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIFRJTV9DUjJfTU1TXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ291bnRlciBFbmFibGUgc2lnbmFsIChDTlRfRU4pIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKi8KKyNkZWZpbmUgTExfVElNX1RSR09fVVBEQVRFICAgICAgICAgICAgICAgICAgICAgVElNX0NSMl9NTVNfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVcGRhdGUgZXZlbnQgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAqLworI2RlZmluZSBMTF9USU1fVFJHT19DQzFJRiAgICAgICAgICAgICAgICAgICAgICAoVElNX0NSMl9NTVNfMSB8IFRJTV9DUjJfTU1TXzApICAgICAgICAgICAgICAgICAvKiE8IENDMSBjYXB0dXJlIG9yIGEgY29tcGFyZSBtYXRjaCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0ICovCisjZGVmaW5lIExMX1RJTV9UUkdPX09DMVJFRiAgICAgICAgICAgICAgICAgICAgIFRJTV9DUjJfTU1TXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT0MxUkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0ICovCisjZGVmaW5lIExMX1RJTV9UUkdPX09DMlJFRiAgICAgICAgICAgICAgICAgICAgIChUSU1fQ1IyX01NU18yIHwgVElNX0NSMl9NTVNfMCkgICAgICAgICAgICAgICAgIC8qITwgT0MyUkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0ICovCisjZGVmaW5lIExMX1RJTV9UUkdPX09DM1JFRiAgICAgICAgICAgICAgICAgICAgIChUSU1fQ1IyX01NU18yIHwgVElNX0NSMl9NTVNfMSkgICAgICAgICAgICAgICAgIC8qITwgT0MzUkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0ICovCisjZGVmaW5lIExMX1RJTV9UUkdPX09DNFJFRiAgICAgICAgICAgICAgICAgICAgIChUSU1fQ1IyX01NU18yIHwgVElNX0NSMl9NTVNfMSB8IFRJTV9DUjJfTU1TXzApIC8qITwgT0M0UkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0ICovCisvKioKKyAgKiBAfQorICAqLworCisjaWYgICBkZWZpbmVkKFRJTV9DUjJfTU1TMikKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RSR08yIFRyaWdnZXIgT3V0cHV0IDIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fVFJHTzJfUkVTRVQgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVUcgYml0IGZyb20gdGhlIFRJTXhfRUdSIHJlZ2lzdGVyIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgMiAqLworI2RlZmluZSBMTF9USU1fVFJHTzJfRU5BQkxFICAgICAgICAgICAgICAgICAgICBUSU1fQ1IyX01NUzJfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ291bnRlciBFbmFibGUgc2lnbmFsIChDTlRfRU4pIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgMiAqLworI2RlZmluZSBMTF9USU1fVFJHTzJfVVBEQVRFICAgICAgICAgICAgICAgICAgICBUSU1fQ1IyX01NUzJfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVXBkYXRlIGV2ZW50IGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgMiAqLworI2RlZmluZSBMTF9USU1fVFJHTzJfQ0MxRiAgICAgICAgICAgICAgICAgICAgICAoVElNX0NSMl9NTVMyXzEgfCBUSU1fQ1IyX01NUzJfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ0MxIGNhcHR1cmUgb3IgYSBjb21wYXJlIG1hdGNoIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgMiAqLworI2RlZmluZSBMTF9USU1fVFJHTzJfT0MxICAgICAgICAgICAgICAgICAgICAgICBUSU1fQ1IyX01NUzJfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT0MxUkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IDIgKi8KKyNkZWZpbmUgTExfVElNX1RSR08yX09DMiAgICAgICAgICAgICAgICAgICAgICAgKFRJTV9DUjJfTU1TMl8yIHwgVElNX0NSMl9NTVMyXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE9DMlJFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAyICovCisjZGVmaW5lIExMX1RJTV9UUkdPMl9PQzMgICAgICAgICAgICAgICAgICAgICAgIChUSU1fQ1IyX01NUzJfMiB8IFRJTV9DUjJfTU1TMl8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPQzNSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgMiAqLworI2RlZmluZSBMTF9USU1fVFJHTzJfT0M0ICAgICAgICAgICAgICAgICAgICAgICAoVElNX0NSMl9NTVMyXzIgfCBUSU1fQ1IyX01NUzJfMSB8IFRJTV9DUjJfTU1TMl8wKSAgICAgICAgICAgICAgICAgIC8qITwgT0M0UkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IDIgKi8KKyNkZWZpbmUgTExfVElNX1RSR08yX09DNSAgICAgICAgICAgICAgICAgICAgICAgVElNX0NSMl9NTVMyXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE9DNVJFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAyICovCisjZGVmaW5lIExMX1RJTV9UUkdPMl9PQzYgICAgICAgICAgICAgICAgICAgICAgIChUSU1fQ1IyX01NUzJfMyB8IFRJTV9DUjJfTU1TMl8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPQzZSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgMiAqLworI2RlZmluZSBMTF9USU1fVFJHTzJfT0M0X1JJU0lOR0ZBTExJTkcgICAgICAgICAoVElNX0NSMl9NTVMyXzMgfCBUSU1fQ1IyX01NUzJfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT0M0UkVGIHJpc2luZyBvciBmYWxsaW5nIGVkZ2VzIGFyZSB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IDIgKi8KKyNkZWZpbmUgTExfVElNX1RSR08yX09DNl9SSVNJTkdGQUxMSU5HICAgICAgICAgKFRJTV9DUjJfTU1TMl8zIHwgVElNX0NSMl9NTVMyXzEgfCBUSU1fQ1IyX01NUzJfMCkgICAgICAgICAgICAgICAgICAvKiE8IE9DNlJFRiByaXNpbmcgb3IgZmFsbGluZyBlZGdlcyBhcmUgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAyICovCisjZGVmaW5lIExMX1RJTV9UUkdPMl9PQzRfUklTSU5HX09DNl9SSVNJTkcgICAgIChUSU1fQ1IyX01NUzJfMyB8IFRJTV9DUjJfTU1TMl8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPQzRSRUYgb3IgT0M2UkVGIHJpc2luZyBlZGdlcyBhcmUgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAyICovCisjZGVmaW5lIExMX1RJTV9UUkdPMl9PQzRfUklTSU5HX09DNl9GQUxMSU5HICAgIChUSU1fQ1IyX01NUzJfMyB8IFRJTV9DUjJfTU1TMl8yIHwgVElNX0NSMl9NTVMyXzApICAgICAgICAgICAgICAgICAgLyohPCBPQzRSRUYgcmlzaW5nIG9yIE9DNlJFRiBmYWxsaW5nIGVkZ2VzIGFyZSB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IDIgKi8KKyNkZWZpbmUgTExfVElNX1RSR08yX09DNV9SSVNJTkdfT0M2X1JJU0lORyAgICAgKFRJTV9DUjJfTU1TMl8zIHwgVElNX0NSMl9NTVMyXzIgfFRJTV9DUjJfTU1TMl8xKSAgICAgICAgICAgICAgICAgICAvKiE8IE9DNVJFRiBvciBPQzZSRUYgcmlzaW5nIGVkZ2VzIGFyZSB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IDIgKi8KKyNkZWZpbmUgTExfVElNX1RSR08yX09DNV9SSVNJTkdfT0M2X0ZBTExJTkcgICAgKFRJTV9DUjJfTU1TMl8zIHwgVElNX0NSMl9NTVMyXzIgfCBUSU1fQ1IyX01NUzJfMSB8IFRJTV9DUjJfTU1TMl8wKSAvKiE8IE9DNVJFRiByaXNpbmcgb3IgT0M2UkVGIGZhbGxpbmcgZWRnZXMgYXJlIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgMiAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBUSU1fQ1IyX01NUzIgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfU0xBVkVNT0RFIFNsYXZlIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fU0xBVkVNT0RFX0RJU0FCTEVEICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNsYXZlIG1vZGUgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTExfVElNX1NMQVZFTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgVElNX1NNQ1JfU01TXzIgICAgICAgICAgICAgICAgICAgICAgLyohPCBSZXNldCBNb2RlIC0gUmlzaW5nIGVkZ2Ugb2YgdGhlIHNlbGVjdGVkIHRyaWdnZXIgaW5wdXQgKFRSR0kpIHJlaW5pdGlhbGl6ZXMgdGhlIGNvdW50ZXIgKi8KKyNkZWZpbmUgTExfVElNX1NMQVZFTU9ERV9HQVRFRCAgICAgICAgICAgICAgICAgKFRJTV9TTUNSX1NNU18yIHwgVElNX1NNQ1JfU01TXzApICAgLyohPCBHYXRlZCBNb2RlIC0gVGhlIGNvdW50ZXIgY2xvY2sgaXMgZW5hYmxlZCB3aGVuIHRoZSB0cmlnZ2VyIGlucHV0IChUUkdJKSBpcyBoaWdoICovCisjZGVmaW5lIExMX1RJTV9TTEFWRU1PREVfVFJJR0dFUiAgICAgICAgICAgICAgIChUSU1fU01DUl9TTVNfMiB8IFRJTV9TTUNSX1NNU18xKSAgIC8qITwgVHJpZ2dlciBNb2RlIC0gVGhlIGNvdW50ZXIgc3RhcnRzIGF0IGEgcmlzaW5nIGVkZ2Ugb2YgdGhlIHRyaWdnZXIgVFJHSSAqLworI2lmICBkZWZpbmVkIChUSU1fU01DUl9TTVNfMykKKyNkZWZpbmUgTExfVElNX1NMQVZFTU9ERV9DT01CSU5FRF9SRVNFVFRSSUdHRVIgVElNX1NNQ1JfU01TXzMgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21iaW5lZCByZXNldCArIHRyaWdnZXIgbW9kZSAtIFJpc2luZyBlZGdlIG9mIHRoZSBzZWxlY3RlZCB0cmlnZ2VyIGlucHV0IChUUkdJKSAgcmVpbml0aWFsaXplcyB0aGUgY291bnRlciwgZ2VuZXJhdGVzIGFuIHVwZGF0ZSBvZiB0aGUgcmVnaXN0ZXJzIGFuZCBzdGFydHMgdGhlIGNvdW50ZXIgKi8KKyNlbmRpZiAvKiBUSU1fU01DUl9TTVNfMyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVFMgVHJpZ2dlciBTZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fVFNfSVRSMCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnRlcm5hbCBUcmlnZ2VyIDAgKElUUjApIGlzIHVzZWQgYXMgdHJpZ2dlciBpbnB1dCAqLworI2RlZmluZSBMTF9USU1fVFNfSVRSMSAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fU01DUl9UU18wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnRlcm5hbCBUcmlnZ2VyIDEgKElUUjEpIGlzIHVzZWQgYXMgdHJpZ2dlciBpbnB1dCAqLworI2RlZmluZSBMTF9USU1fVFNfSVRSMiAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fU01DUl9UU18xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnRlcm5hbCBUcmlnZ2VyIDIgKElUUjIpIGlzIHVzZWQgYXMgdHJpZ2dlciBpbnB1dCAqLworI2RlZmluZSBMTF9USU1fVFNfSVRSMyAgICAgICAgICAgICAgICAgICAgICAgICAoVElNX1NNQ1JfVFNfMCB8IFRJTV9TTUNSX1RTXzEpICAgICAgICAgICAgICAgICAgLyohPCBJbnRlcm5hbCBUcmlnZ2VyIDMgKElUUjMpIGlzIHVzZWQgYXMgdHJpZ2dlciBpbnB1dCAqLworI2RlZmluZSBMTF9USU1fVFNfVEkxRl9FRCAgICAgICAgICAgICAgICAgICAgICBUSU1fU01DUl9UU18yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSTEgRWRnZSBEZXRlY3RvciAoVEkxRl9FRCkgaXMgdXNlZCBhcyB0cmlnZ2VyIGlucHV0ICovCisjZGVmaW5lIExMX1RJTV9UU19USTFGUDEgICAgICAgICAgICAgICAgICAgICAgIChUSU1fU01DUl9UU18yIHwgVElNX1NNQ1JfVFNfMCkgICAgICAgICAgICAgICAgICAvKiE8IEZpbHRlcmVkIFRpbWVyIElucHV0IDEgKFRJMUZQMSkgaXMgdXNlZCBhcyB0cmlnZ2VyIGlucHV0ICovCisjZGVmaW5lIExMX1RJTV9UU19USTJGUDIgICAgICAgICAgICAgICAgICAgICAgIChUSU1fU01DUl9UU18yIHwgVElNX1NNQ1JfVFNfMSkgICAgICAgICAgICAgICAgICAvKiE8IEZpbHRlcmVkIFRpbWVyIElucHV0IDIgKFRJMTJQMikgaXMgdXNlZCBhcyB0cmlnZ2VyIGlucHV0ICovCisjZGVmaW5lIExMX1RJTV9UU19FVFJGICAgICAgICAgICAgICAgICAgICAgICAgIChUSU1fU01DUl9UU18yIHwgVElNX1NNQ1JfVFNfMSB8IFRJTV9TTUNSX1RTXzApICAvKiE8IEZpbHRlcmVkIGV4dGVybmFsIFRyaWdnZXIgKEVUUkYpIGlzIHVzZWQgYXMgdHJpZ2dlciBpbnB1dCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfRVRSX1BPTEFSSVRZIEV4dGVybmFsIFRyaWdnZXIgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fRVRSX1BPTEFSSVRZX05PTklOVkVSVEVEICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IEVUUiBpcyBub24taW52ZXJ0ZWQsIGFjdGl2ZSBhdCBoaWdoIGxldmVsIG9yIHJpc2luZyBlZGdlICovCisjZGVmaW5lIExMX1RJTV9FVFJfUE9MQVJJVFlfSU5WRVJURUQgICAgICAgICAgIFRJTV9TTUNSX0VUUCAgICAgICAgICAgIC8qITwgRVRSIGlzIGludmVydGVkLCBhY3RpdmUgYXQgbG93IGxldmVsIG9yIGZhbGxpbmcgZWRnZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfRVRSX1BSRVNDQUxFUiBFeHRlcm5hbCBUcmlnZ2VyIFByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9FVFJfUFJFU0NBTEVSX0RJVjEgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgRVRSIHByZXNjYWxlciBPRkYgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9QUkVTQ0FMRVJfRElWMiAgICAgICAgICAgICAgVElNX1NNQ1JfRVRQU18wICAgICAgICAgLyohPCBFVFIgZnJlcXVlbmN5IGlzIGRpdmlkZWQgYnkgMiAqLworI2RlZmluZSBMTF9USU1fRVRSX1BSRVNDQUxFUl9ESVY0ICAgICAgICAgICAgICBUSU1fU01DUl9FVFBTXzEgICAgICAgICAvKiE8IEVUUiBmcmVxdWVuY3kgaXMgZGl2aWRlZCBieSA0ICovCisjZGVmaW5lIExMX1RJTV9FVFJfUFJFU0NBTEVSX0RJVjggICAgICAgICAgICAgIFRJTV9TTUNSX0VUUFMgICAgICAgICAgIC8qITwgRVRSIGZyZXF1ZW5jeSBpcyBkaXZpZGVkIGJ5IDggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0VUUl9GSUxURVIgRXh0ZXJuYWwgVHJpZ2dlciBGaWx0ZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMSAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTm8gZmlsdGVyLCBzYW1wbGluZyBpcyBkb25lIGF0IGZEVFMgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjFfTjIgICAgICAgICAgICAgVElNX1NNQ1JfRVRGXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mQ0tfSU5ULCBOPTIgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjFfTjQgICAgICAgICAgICAgVElNX1NNQ1JfRVRGXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mQ0tfSU5ULCBOPTQgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjFfTjggICAgICAgICAgICAgKFRJTV9TTUNSX0VURl8xIHwgVElNX1NNQ1JfRVRGXzApICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mQ0tfSU5ULCBOPTggKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjJfTjYgICAgICAgICAgICAgVElNX1NNQ1JfRVRGXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mRFRTLzIsIE49NiAqLworI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMl9OOCAgICAgICAgICAgICAoVElNX1NNQ1JfRVRGXzIgfCBUSU1fU01DUl9FVEZfMCkgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMiwgTj04ICovCisjZGVmaW5lIExMX1RJTV9FVFJfRklMVEVSX0ZESVY0X042ICAgICAgICAgICAgIChUSU1fU01DUl9FVEZfMiB8IFRJTV9TTUNSX0VURl8xKSAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9ZkRUUy80LCBOPTYgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjRfTjggICAgICAgICAgICAgKFRJTV9TTUNSX0VURl8yIHwgVElNX1NNQ1JfRVRGXzEgfCBUSU1fU01DUl9FVEZfMCkgICAvKiE8IGZTQU1QTElORz1mRFRTLzQsIE49OCAqLworI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWOF9ONiAgICAgICAgICAgICBUSU1fU01DUl9FVEZfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZEVFMvOCwgTj04ICovCisjZGVmaW5lIExMX1RJTV9FVFJfRklMVEVSX0ZESVY4X044ICAgICAgICAgICAgIChUSU1fU01DUl9FVEZfMyB8IFRJTV9TTUNSX0VURl8wKSAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9ZkRUUy8xNiwgTj01ICovCisjZGVmaW5lIExMX1RJTV9FVFJfRklMVEVSX0ZESVYxNl9ONSAgICAgICAgICAgIChUSU1fU01DUl9FVEZfMyB8IFRJTV9TTUNSX0VURl8xKSAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9ZkRUUy8xNiwgTj02ICovCisjZGVmaW5lIExMX1RJTV9FVFJfRklMVEVSX0ZESVYxNl9ONiAgICAgICAgICAgIChUSU1fU01DUl9FVEZfMyB8IFRJTV9TTUNSX0VURl8xIHwgVElNX1NNQ1JfRVRGXzApICAgLyohPCBmU0FNUExJTkc9ZkRUUy8xNiwgTj04ICovCisjZGVmaW5lIExMX1RJTV9FVFJfRklMVEVSX0ZESVYxNl9OOCAgICAgICAgICAgIChUSU1fU01DUl9FVEZfMyB8IFRJTV9TTUNSX0VURl8yKSAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9ZkRUUy8xNiwgTj01ICovCisjZGVmaW5lIExMX1RJTV9FVFJfRklMVEVSX0ZESVYzMl9ONSAgICAgICAgICAgIChUSU1fU01DUl9FVEZfMyB8IFRJTV9TTUNSX0VURl8yIHwgVElNX1NNQ1JfRVRGXzApICAgLyohPCBmU0FNUExJTkc9ZkRUUy8zMiwgTj01ICovCisjZGVmaW5lIExMX1RJTV9FVFJfRklMVEVSX0ZESVYzMl9ONiAgICAgICAgICAgIChUSU1fU01DUl9FVEZfMyB8IFRJTV9TTUNSX0VURl8yIHwgVElNX1NNQ1JfRVRGXzEpICAgLyohPCBmU0FNUExJTkc9ZkRUUy8zMiwgTj02ICovCisjZGVmaW5lIExMX1RJTV9FVFJfRklMVEVSX0ZESVYzMl9OOCAgICAgICAgICAgIFRJTV9TTUNSX0VURiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9ZkRUUy8zMiwgTj04ICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0JSRUFLX1BPTEFSSVRZIGJyZWFrIHBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLX1BPTEFSSVRZX0xPVyAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAvKiE8IEJyZWFrIGlucHV0IEJSSyBpcyBhY3RpdmUgbG93ICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19QT0xBUklUWV9ISUdIICAgICAgICAgICAgIFRJTV9CRFRSX0JLUCAgICAgICAgICAgICAgLyohPCBCcmVhayBpbnB1dCBCUksgaXMgYWN0aXZlIGhpZ2ggKi8KKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFRJTV9CRFRSX0JLRikKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0JSRUFLX0ZJTFRFUiBicmVhayBmaWx0ZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgIC8qITwgTm8gZmlsdGVyLCBCUksgYWN0cyBhc3luY2hyb25vdXNseSAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxX04yICAgICAgICAgICAweDAwMDEwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZDS19JTlQsIE49MiAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxX040ICAgICAgICAgICAweDAwMDIwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZDS19JTlQsIE49NCAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxX044ICAgICAgICAgICAweDAwMDMwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZDS19JTlQsIE49OCAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYyX042ICAgICAgICAgICAweDAwMDQwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMiwgTj02ICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjJfTjggICAgICAgICAgIDB4MDAwNTAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkRUUy8yLCBOPTggKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWNF9ONiAgICAgICAgICAgMHgwMDA2MDAwMFUgICAvKiE8IGZTQU1QTElORz1mRFRTLzQsIE49NiAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVY0X044ICAgICAgICAgICAweDAwMDcwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvNCwgTj04ICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjhfTjYgICAgICAgICAgIDB4MDAwODAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkRUUy84LCBOPTYgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWOF9OOCAgICAgICAgICAgMHgwMDA5MDAwMFUgICAvKiE8IGZTQU1QTElORz1mRFRTLzgsIE49OCAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxNl9ONSAgICAgICAgICAweDAwMEEwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMTYsIE49NSAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxNl9ONiAgICAgICAgICAweDAwMEIwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMTYsIE49NiAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxNl9OOCAgICAgICAgICAweDAwMEMwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMTYsIE49OCAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYzMl9ONSAgICAgICAgICAweDAwMEQwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMzIsIE49NSAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYzMl9ONiAgICAgICAgICAweDAwMEUwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMzIsIE49NiAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYzMl9OOCAgICAgICAgICAweDAwMEYwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMzIsIE49OCAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBUSU1fQkRUUl9CS0YgKi8KKworI2lmIGRlZmluZWQoVElNX0JEVFJfQksyUCkKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0JSRUFLMl9QT0xBUklUWSBCUkVBSzIgUE9MQVJJVFkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fQlJFQUsyX1BPTEFSSVRZX0xPVyAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IEJyZWFrIGlucHV0IEJSSzIgaXMgYWN0aXZlIGxvdyAqLworI2RlZmluZSBMTF9USU1fQlJFQUsyX1BPTEFSSVRZX0hJR0ggICAgICAgICAgICBUSU1fQkRUUl9CSzJQICAgICAgICAgICAvKiE8IEJyZWFrIGlucHV0IEJSSzIgaXMgYWN0aXZlIGhpZ2ggKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVElNX0JEVFJfQksyUCAqLworCisjaWYgZGVmaW5lZChUSU1fQkRUUl9CSzJGKQorLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQlJFQUsyX0ZJTFRFUiBCUkVBSzIgRklMVEVSCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjEgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAvKiE8IE5vIGZpbHRlciwgQlJLIGFjdHMgYXN5bmNocm9ub3VzbHkgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjFfTjIgICAgICAgICAgMHgwMDEwMDAwMFUgICAvKiE8IGZTQU1QTElORz1mQ0tfSU5ULCBOPTIgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjFfTjQgICAgICAgICAgMHgwMDIwMDAwMFUgICAvKiE8IGZTQU1QTElORz1mQ0tfSU5ULCBOPTQgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjFfTjggICAgICAgICAgMHgwMDMwMDAwMFUgICAvKiE8IGZTQU1QTElORz1mQ0tfSU5ULCBOPTggKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjJfTjYgICAgICAgICAgMHgwMDQwMDAwMFUgICAvKiE8IGZTQU1QTElORz1mRFRTLzIsIE49NiAqLworI2RlZmluZSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMl9OOCAgICAgICAgICAweDAwNTAwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMiwgTj04ICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVY0X042ICAgICAgICAgIDB4MDA2MDAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkRUUy80LCBOPTYgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjRfTjggICAgICAgICAgMHgwMDcwMDAwMFUgICAvKiE8IGZTQU1QTElORz1mRFRTLzQsIE49OCAqLworI2RlZmluZSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWOF9ONiAgICAgICAgICAweDAwODAwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvOCwgTj02ICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVY4X044ICAgICAgICAgIDB4MDA5MDAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkRUUy84LCBOPTggKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjE2X041ICAgICAgICAgMHgwMEEwMDAwMFUgICAvKiE8IGZTQU1QTElORz1mRFRTLzE2LCBOPTUgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjE2X042ICAgICAgICAgMHgwMEIwMDAwMFUgICAvKiE8IGZTQU1QTElORz1mRFRTLzE2LCBOPTYgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjE2X044ICAgICAgICAgMHgwMEMwMDAwMFUgICAvKiE8IGZTQU1QTElORz1mRFRTLzE2LCBOPTggKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjMyX041ICAgICAgICAgMHgwMEQwMDAwMFUgICAvKiE8IGZTQU1QTElORz1mRFRTLzMyLCBOPTUgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjMyX042ICAgICAgICAgMHgwMEUwMDAwMFUgICAvKiE8IGZTQU1QTElORz1mRFRTLzMyLCBOPTYgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjMyX044ICAgICAgICAgMHgwMEYwMDAwMFUgICAvKiE8IGZTQU1QTElORz1mRFRTLzMyLCBOPTggKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVElNX0JEVFJfQksyRiAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19PU1NJIE9TU0kKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fT1NTSV9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IFdoZW4gaW5hY3RpdmUsIE9DeC9PQ3hOIG91dHB1dHMgYXJlIGRpc2FibGVkICovCisjZGVmaW5lIExMX1RJTV9PU1NJX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIFRJTV9CRFRSX09TU0kgICAgICAgICAgIC8qITwgV2hlbiBpbmFjdGl2ZSwgT3hDL09DeE4gb3V0cHV0cyBhcmUgZmlyc3QgZm9yY2VkIHdpdGggdGhlaXIgaW5hY3RpdmUgbGV2ZWwgdGhlbiBmb3JjZWQgdG8gdGhlaXIgaWRsZSBsZXZlbCBhZnRlciB0aGUgZGVhZHRpbWUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX09TU1IgT1NTUgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9PU1NSX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgV2hlbiBpbmFjdGl2ZSwgT0N4L09DeE4gb3V0cHV0cyBhcmUgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTExfVElNX09TU1JfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgVElNX0JEVFJfT1NTUiAgICAgICAgICAgLyohPCBXaGVuIGluYWN0aXZlLCBPQy9PQ04gb3V0cHV0cyBhcmUgZW5hYmxlZCB3aXRoIHRoZWlyIGluYWN0aXZlIGxldmVsIGFzIHNvb24gYXMgQ0N4RT0xIG9yIENDeE5FPTEgKi8KKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfRE1BQlVSU1RfQkFTRUFERFIgRE1BIEJ1cnN0IEJhc2UgQWRkcmVzcworICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DUjEgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0NSMSByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DUjIgICAgICAgICAgIFRJTV9EQ1JfREJBXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0NSMiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9TTUNSICAgICAgICAgIFRJTV9EQ1JfREJBXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU14X1NNQ1IgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfRElFUiAgICAgICAgICAoVElNX0RDUl9EQkFfMSB8ICBUSU1fRENSX0RCQV8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9ESUVSIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX1NSICAgICAgICAgICAgVElNX0RDUl9EQkFfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTXhfU1IgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfRUdSICAgICAgICAgICAoVElNX0RDUl9EQkFfMiB8IFRJTV9EQ1JfREJBXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9FR1IgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NNUjEgICAgICAgICAoVElNX0RDUl9EQkFfMiB8IFRJTV9EQ1JfREJBXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9DQ01SMSByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ01SMiAgICAgICAgIChUSU1fRENSX0RCQV8yIHwgVElNX0RDUl9EQkFfMSB8IFRJTV9EQ1JfREJBXzApICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0NDTVIyIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDRVIgICAgICAgICAgVElNX0RDUl9EQkFfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTXhfQ0NFUiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DTlQgICAgICAgICAgIChUSU1fRENSX0RCQV8zIHwgVElNX0RDUl9EQkFfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0NOVCByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9QU0MgICAgICAgICAgIChUSU1fRENSX0RCQV8zIHwgVElNX0RDUl9EQkFfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU14X1BTQyByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9BUlIgICAgICAgICAgIChUSU1fRENSX0RCQV8zIHwgVElNX0RDUl9EQkFfMSB8IFRJTV9EQ1JfREJBXzApICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0FSUiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9SQ1IgICAgICAgICAgIChUSU1fRENSX0RCQV8zIHwgVElNX0RDUl9EQkFfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU14X1JDUiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ1IxICAgICAgICAgIChUSU1fRENSX0RCQV8zIHwgVElNX0RDUl9EQkFfMiB8IFRJTV9EQ1JfREJBXzApICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0NDUjEgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NSMiAgICAgICAgICAoVElNX0RDUl9EQkFfMyB8IFRJTV9EQ1JfREJBXzIgfCBUSU1fRENSX0RCQV8xKSAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9DQ1IyIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDUjMgICAgICAgICAgKFRJTV9EQ1JfREJBXzMgfCBUSU1fRENSX0RCQV8yIHwgVElNX0RDUl9EQkFfMSB8IFRJTV9EQ1JfREJBXzApICAvKiE8IFRJTXhfQ0NSMyByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ1I0ICAgICAgICAgIFRJTV9EQ1JfREJBXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0NDUjQgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQkRUUiAgICAgICAgICAoVElNX0RDUl9EQkFfNCB8IFRJTV9EQ1JfREJBXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9CRFRSIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDTVIzICAgICAgICAgKFRJTV9EQ1JfREJBXzQgfCBUSU1fRENSX0RCQV8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTXhfQ0NNUjMgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2lmIGRlZmluZWQoVElNX0NDUjZfQ0NSNikKKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDUjUgICAgICAgICAgKFRJTV9EQ1JfREJBXzQgfCBUSU1fRENSX0RCQV8xIHwgVElNX0RDUl9EQkFfMCkgICAgICAgICAgICAgICAgICAvKiE8IFRJTXhfQ0NSNSByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ1I2ICAgICAgICAgIChUSU1fRENSX0RCQV80IHwgVElNX0RDUl9EQkFfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0NDUjYgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2VuZGlmIC8qIFRJTV9DQ1I2X0NDUjYgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX09SICAgICAgICAgICAgKFRJTV9EQ1JfREJBXzQgfCBUSU1fRENSX0RCQV8yIHwgVElNX0RDUl9EQkFfMCkgICAgICAgICAgICAgICAgICAvKiE8IFRJTXhfT1IgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfRE1BQlVSU1RfTEVOR1RIIERNQSBCdXJzdCBMZW5ndGgKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzFUUkFOU0ZFUiAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDEgcmVnaXN0ZXIgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzJUUkFOU0ZFUlMgICAgICBUSU1fRENSX0RCTF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDIgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8zVFJBTlNGRVJTICAgICAgVElNX0RDUl9EQkxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAzIHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfNFRSQU5TRkVSUyAgICAgIChUSU1fRENSX0RCTF8xIHwgIFRJTV9EQ1JfREJMXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gNCByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzVUUkFOU0ZFUlMgICAgICBUSU1fRENSX0RCTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDUgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF82VFJBTlNGRVJTICAgICAgKFRJTV9EQ1JfREJMXzIgfCBUSU1fRENSX0RCTF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byA2IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfN1RSQU5TRkVSUyAgICAgIChUSU1fRENSX0RCTF8yIHwgVElNX0RDUl9EQkxfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gNyByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzhUUkFOU0ZFUlMgICAgICAoVElNX0RDUl9EQkxfMiB8IFRJTV9EQ1JfREJMXzEgfCBUSU1fRENSX0RCTF8wKSAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDEgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF85VFJBTlNGRVJTICAgICAgVElNX0RDUl9EQkxfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byA5IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTBUUkFOU0ZFUlMgICAgIChUSU1fRENSX0RCTF8zIHwgVElNX0RDUl9EQkxfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMTAgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xMVRSQU5TRkVSUyAgICAgKFRJTV9EQ1JfREJMXzMgfCBUSU1fRENSX0RCTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAxMSByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzEyVFJBTlNGRVJTICAgICAoVElNX0RDUl9EQkxfMyB8IFRJTV9EQ1JfREJMXzEgfCBUSU1fRENSX0RCTF8wKSAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDEyIHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTNUUkFOU0ZFUlMgICAgIChUSU1fRENSX0RCTF8zIHwgVElNX0RDUl9EQkxfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMTMgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xNFRSQU5TRkVSUyAgICAgKFRJTV9EQ1JfREJMXzMgfCBUSU1fRENSX0RCTF8yIHwgVElNX0RDUl9EQkxfMCkgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAxNCByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE1VFJBTlNGRVJTICAgICAoVElNX0RDUl9EQkxfMyB8IFRJTV9EQ1JfREJMXzIgfCBUSU1fRENSX0RCTF8xKSAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDE1IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTZUUkFOU0ZFUlMgICAgIChUSU1fRENSX0RCTF8zIHwgVElNX0RDUl9EQkxfMiB8IFRJTV9EQ1JfREJMXzEgfCBUSU1fRENSX0RCTF8wKSAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMTYgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xN1RSQU5TRkVSUyAgICAgVElNX0RDUl9EQkxfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAxNyByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE4VFJBTlNGRVJTICAgICAoVElNX0RDUl9EQkxfNCB8ICBUSU1fRENSX0RCTF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDE4IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgYnVyc3QgYmFzZSBhZGRyZXNzICovCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChUSU0xKQorLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVElNMV9FVFJfQURDMV9STVAgIFRJTTEgRXh0ZXJuYWwgVHJpZ2dlciBBREMxIFJlbWFwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX1RJTTFfRVRSX0FEQzFfUk1QX05DICAgVElNMV9PUl9STVBfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0xX0VUUiBpcyBub3QgY29ubmVjdGVkIHRvIEFEQzEgYW5hbG9nIHdhdGNoZG9nIHggKi8KKyNkZWZpbmUgTExfVElNX1RJTTFfRVRSX0FEQzFfUk1QX0FXRDEgKFRJTTFfT1JfRVRSX1JNUF8wIHwgVElNMV9PUl9STVBfTUFTSykgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0xX0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDMSBhbmFsb2cgd2F0Y2hkb2cgMSAqLworI2RlZmluZSBMTF9USU1fVElNMV9FVFJfQURDMV9STVBfQVdEMiAoVElNMV9PUl9FVFJfUk1QXzEgfCBUSU0xX09SX1JNUF9NQVNLKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREMxIGFuYWxvZyB3YXRjaGRvZyAyICovCisjZGVmaW5lIExMX1RJTV9USU0xX0VUUl9BREMxX1JNUF9BV0QzIChUSU0xX09SX0VUUl9STVBfMCB8IFRJTTFfT1JfRVRSX1JNUF8xfCBUSU0xX09SX1JNUF9NQVNLKSAgIC8qITwgVElNMV9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzEgYW5hbG9nIHdhdGNoZG9nIDMgKi8KKy8qKgorICAqIEB9CisgICovCisjaWYgZGVmaW5lZChBREM0KQorLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVElNMV9FVFJfQURDNF9STVAgIFRJTTEgRXh0ZXJuYWwgVHJpZ2dlciBBREM0IFJlbWFwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX1RJTTFfRVRSX0FEQzRfUk1QX05DICAgVElNMV9PUl9STVBfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMV9FVFIgaXMgbm90IGNvbm5lY3RlZCB0byBBREM0IGFuYWxvZyB3YXRjaGRvZyAgeCovCisjZGVmaW5lIExMX1RJTV9USU0xX0VUUl9BREM0X1JNUF9BV0QxIChUSU0xX09SX0VUUl9STVBfMiB8IFRJTTFfT1JfUk1QX01BU0spICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREM0IGFuYWxvZyB3YXRjaGRvZyAxICovCisjZGVmaW5lIExMX1RJTV9USU0xX0VUUl9BREM0X1JNUF9BV0QyIChUSU0xX09SX0VUUl9STVBfMyB8IFRJTTFfT1JfUk1QX01BU0spICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREM0IGFuYWxvZyB3YXRjaGRvZyAyICovCisjZGVmaW5lIExMX1RJTV9USU0xX0VUUl9BREM0X1JNUF9BV0QzIChUSU0xX09SX0VUUl9STVBfMyB8IFRJTTFfT1JfRVRSX1JNUF8yIHwgVElNMV9PUl9STVBfTUFTSykgICAvKiE8IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREM0IGFuYWxvZyB3YXRjaGRvZyAzICovCisvKioKKyAgKiBAfQorICAqLworI2Vsc2UKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTFfRVRSX0FEQzJfUk1QICBUSU0xIEV4dGVybmFsIFRyaWdnZXIgQURDMyBSZW1hcAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9USU0xX0VUUl9BREMyX1JNUF9OQyAgIFRJTTFfT1JfUk1QX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTFfRVRSIGlzIG5vdCBjb25uZWN0ZWQgdG8gQURDMiBhbmFsb2cgd2F0Y2hkb2cgIHgqLworI2RlZmluZSBMTF9USU1fVElNMV9FVFJfQURDMl9STVBfQVdEMSAoVElNMV9PUl9FVFJfUk1QXzIgfCBUSU0xX09SX1JNUF9NQVNLKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0xX0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDMiBhbmFsb2cgd2F0Y2hkb2cgMSAqLworI2RlZmluZSBMTF9USU1fVElNMV9FVFJfQURDMl9STVBfQVdEMiAoVElNMV9PUl9FVFJfUk1QXzMgfCBUSU0xX09SX1JNUF9NQVNLKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0xX0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDMiBhbmFsb2cgd2F0Y2hkb2cgMiAqLworI2RlZmluZSBMTF9USU1fVElNMV9FVFJfQURDMl9STVBfQVdEMyAoVElNMV9PUl9FVFJfUk1QXzMgfCBUSU0xX09SX0VUUl9STVBfMiB8IFRJTTFfT1JfUk1QX01BU0spICAgLyohPCBUSU0xX0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDMiBhbmFsb2cgd2F0Y2hkb2cgMyAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBBREM0ICovCisjZW5kaWYgLyogVElNMSAqLworI2lmIGRlZmluZWQoVElNOCkKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTThfRVRSX0FEQzJfUk1QICBUSU04IEV4dGVybmFsIFRyaWdnZXIgQURDMiBSZW1hcAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9USU04X0VUUl9BREMyX1JNUF9OQyAgIFRJTThfT1JfUk1QX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTThfRVRSIGlzIG5vdCBjb25uZWN0ZWQgdG8gQURDMiBhbmFsb2cgd2F0Y2hkb2cgeCAqLworI2RlZmluZSBMTF9USU1fVElNOF9FVFJfQURDMl9STVBfQVdEMSAoVElNOF9PUl9FVFJfUk1QXzAgfCBUSU04X09SX1JNUF9NQVNLKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU04X0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDMiBhbmFsb2cgd2F0Y2hkb2cgKi8KKyNkZWZpbmUgTExfVElNX1RJTThfRVRSX0FEQzJfUk1QX0FXRDIgKFRJTThfT1JfRVRSX1JNUF8xIHwgVElNOF9PUl9STVBfTUFTSykgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNOF9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzIgYW5hbG9nIHdhdGNoZG9nIDIgKi8KKyNkZWZpbmUgTExfVElNX1RJTThfRVRSX0FEQzJfUk1QX0FXRDMgKFRJTThfT1JfRVRSX1JNUF8wIHwgVElNOF9PUl9FVFJfUk1QXzEgfCBUSU04X09SX1JNUF9NQVNLKSAgIC8qITwgVElNOF9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzIgYW5hbG9nIHdhdGNoZG9nIDMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTThfRVRSX0FEQzNfUk1QICBUSU04IEV4dGVybmFsIFRyaWdnZXIgQURDMyBSZW1hcAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9USU04X0VUUl9BREMzX1JNUF9OQyAgIFRJTThfT1JfUk1QX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTThfRVRSIGlzIG5vdCBjb25uZWN0ZWQgdG8gQURDMyBhbmFsb2cgd2F0Y2hkb2cgeCAqLworI2RlZmluZSBMTF9USU1fVElNOF9FVFJfQURDM19STVBfQVdEMSAoVElNOF9PUl9FVFJfUk1QXzIgfCBUSU04X09SX1JNUF9NQVNLKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU04X0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDMyBhbmFsb2cgd2F0Y2hkb2cgMSAqLworI2RlZmluZSBMTF9USU1fVElNOF9FVFJfQURDM19STVBfQVdEMiAoVElNOF9PUl9FVFJfUk1QXzMgfCBUSU04X09SX1JNUF9NQVNLKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU04X0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDMyBhbmFsb2cgd2F0Y2hkb2cgMiAqLworI2RlZmluZSBMTF9USU1fVElNOF9FVFJfQURDM19STVBfQVdEMyAoVElNOF9PUl9FVFJfUk1QXzIgfCBUSU04X09SX0VUUl9STVBfMyB8IFRJTThfT1JfUk1QX01BU0spICAgLyohPCBUSU04X0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDMyBhbmFsb2cgd2F0Y2hkb2cgMyAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBUSU04ICovCisjaWYgZGVmaW5lZChUSU0xNikKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTE2X1RJMV9STVAgIFRJTTE2IEV4dGVybmFsIElucHV0IENoMSBSZW1hcAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9USU0xNl9USTFfUk1QX0dQSU8gICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTE2IGlucHV0IGNhcHR1cmUgMSBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLworI2RlZmluZSBMTF9USU1fVElNMTZfVEkxX1JNUF9SVEMgICAgIChUSU0xNl9PUl9USTFfUk1QXzAgfCBUSU0xNl9PUl9STVBfTUFTSykgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0xNiBpbnB1dCBjYXB0dXJlIDEgaXMgY29ubmVjdGVkIHRvIFJUQyB3YWtldXAgaW50ZXJydXB0ICovCisjZGVmaW5lIExMX1RJTV9USU0xNl9USTFfUk1QX0hTRV8zMiAgKFRJTTE2X09SX1RJMV9STVBfMSB8IFRJTTE2X09SX1JNUF9NQVNLKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTE2IGlucHV0IGNhcHR1cmUgMSBpcyBjb25uZWN0ZWQgdG8gSFNFLzMyIGNsb2NrICovCisjZGVmaW5lIExMX1RJTV9USU0xNl9USTFfUk1QX01DTyAgICAgKFRJTTE2X09SX1RJMV9STVBfMSB8IFRJTTE2X09SX1RJMV9STVBfMCB8IFRJTTE2X09SX1JNUF9NQVNLKSAvKiE8IFRJTTE2IGlucHV0IGNhcHR1cmUgMSBpcyBjb25uZWN0ZWQgdG8gTUNPICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFRJTTE2ICovCisjaWYgZGVmaW5lZChUSU0yMCkKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTIwX0VUUl9BREMzX1JNUCAgVElNMjAgRXh0ZXJuYWwgVHJpZ2dlciBBREMzIFJlbWFwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX1RJTTIwX0VUUl9BREMzX1JNUF9OQyAgIFRJTTIwX09SX1JNUF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTIwX0VUUiBpcyBub3QgY29ubmVjdGVkIHRvIEFEQzMgYW5hbG9nIHdhdGNoZG9nIHggKi8KKyNkZWZpbmUgTExfVElNX1RJTTIwX0VUUl9BREMzX1JNUF9BV0QxIChUSU0yMF9PUl9FVFJfUk1QXzAgfCBUSU0yMF9PUl9STVBfTUFTSykgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTIwX0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDMyBhbmFsb2cgd2F0Y2hkb2cgKi8KKyNkZWZpbmUgTExfVElNX1RJTTIwX0VUUl9BREMzX1JNUF9BV0QyIChUSU0yMF9PUl9FVFJfUk1QXzEgfCBUSU0yMF9PUl9STVBfTUFTSykgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTIwX0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDMyBhbmFsb2cgd2F0Y2hkb2cgMiAqLworI2RlZmluZSBMTF9USU1fVElNMjBfRVRSX0FEQzNfUk1QX0FXRDMgKFRJTTIwX09SX0VUUl9STVBfMCB8IFRJTTIwX09SX0VUUl9STVBfMSB8IFRJTTIwX09SX1JNUF9NQVNLKSAgIC8qITwgVElNMjBfRVRSIGlzIGNvbm5lY3RlZCB0byBBREMzIGFuYWxvZyB3YXRjaGRvZyAzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU0yMF9FVFJfQURDNF9STVAgIFRJTTIwIEV4dGVybmFsIFRyaWdnZXIgQURDNCBSZW1hcAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9USU0yMF9FVFJfQURDNF9STVBfTkMgICBUSU0yMF9PUl9STVBfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0yMF9FVFIgaXMgbm90IGNvbm5lY3RlZCB0byBBREM0IGFuYWxvZyB3YXRjaGRvZyB4ICovCisjZGVmaW5lIExMX1RJTV9USU0yMF9FVFJfQURDNF9STVBfQVdEMSAoVElNMjBfT1JfRVRSX1JNUF8yIHwgVElNMjBfT1JfUk1QX01BU0spICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0yMF9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzQgYW5hbG9nIHdhdGNoZG9nIDEgKi8KKyNkZWZpbmUgTExfVElNX1RJTTIwX0VUUl9BREM0X1JNUF9BV0QyIChUSU0yMF9PUl9FVFJfUk1QXzMgfCBUSU0yMF9PUl9STVBfTUFTSykgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTIwX0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDNCBhbmFsb2cgd2F0Y2hkb2cgMiAqLworI2RlZmluZSBMTF9USU1fVElNMjBfRVRSX0FEQzRfUk1QX0FXRDMgKFRJTTIwX09SX0VUUl9STVBfMiB8IFRJTTIwX09SX0VUUl9STVBfMyB8IFRJTTIwX09SX1JNUF9NQVNLKSAgIC8qITwgVElNMjBfRVRSIGlzIGNvbm5lY3RlZCB0byBBREM0IGFuYWxvZyB3YXRjaGRvZyAzICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFRJTTIwICovCisjaWYgZGVmaW5lZChUSU0xNCkKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTE0X1RJMV9STVAgIFRJTTE0IFRpbWVyIElucHV0MSBSZW1hcAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9USU0xNF9USTFfUk1QX0dQSU8gICAgVElNMTRfT1JfUk1QX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMTRfVEkxIGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjZGVmaW5lIExMX1RJTV9USU0xNF9USTFfUk1QX1JUQ19DTEsgKFRJTTE0X09SX1RJMV9STVBfMCB8IFRJTTE0X09SX1JNUF9NQVNLKSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMTRfVEkxIGlzIGNvbm5lY3RlZCB0byBSVEMgQ2xvY2sgKi8KKyNkZWZpbmUgTExfVElNX1RJTTE0X1RJMV9STVBfSFNFICAgICAoVElNMTRfT1JfVEkxX1JNUF8xIHwgVElNMTRfT1JfUk1QX01BU0spICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0xNF9USTEgaXMgY29ubmVjdGVkIHRvIEhTRS8zMiAqLworI2RlZmluZSBMTF9USU1fVElNMTRfVEkxX1JNUF9NQ08gICAgIChUSU0xNF9PUl9USTFfUk1QXzAgfCBUSU0xNF9PUl9USTFfUk1QXzEgfCBUSU0xNF9PUl9STVBfTUFTSykgICAvKiE8IFRJTTE0X1RJMSBpcyBjb25uZWN0ZWQgdG8gTUNPICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFRJTTE0ICovCisKKyNpZiBkZWZpbmVkKFRJTV9TTUNSX09DQ1MpCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19PQ1JFRl9DTFJfSU5UIE9DUkVGIGNsZWFyIGlucHV0IHNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9PQ1JFRl9DTFJfSU5UX09DUkVGX0NMUiAgICAgMHgwMDAwMDAwMFUgICAgICAgICAvKiE8IE9DUkVGX0NMUl9JTlQgaXMgY29ubmVjdGVkIHRvIHRoZSBPQ1JFRl9DTFIgaW5wdXQgKi8KKyNkZWZpbmUgTExfVElNX09DUkVGX0NMUl9JTlRfRVRSICAgICAgICAgICBUSU1fU01DUl9PQ0NTICAgICAgIC8qITwgT0NSRUZfQ0xSX0lOVCBpcyBjb25uZWN0ZWQgdG8gRVRSRiAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBUSU1fU01DUl9PQ0NTKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0V4cG9ydGVkX01hY3JvcyBUSU0gRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRU1fV1JJVEVfUkVBRCBDb21tb24gV3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3JvcworICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gVElNIHJlZ2lzdGVyLgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIFRJTSBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuCisgICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgTExfVElNX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gVElNIHJlZ2lzdGVyLgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIFRJTSBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICAqLworI2RlZmluZSBMTF9USU1fUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VNX0V4cG9ydGVkX01hY3JvcyBFeHBvcnRlZF9NYWNyb3MKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBIRUxQRVIgbWFjcm8gcmV0cmlldmluZyB0aGUgVUlGQ1BZIGZsYWcgZnJvbSB0aGUgY291bnRlciB2YWx1ZS4KKyAgKiBAbm90ZSBleDogQHJlZiBfX0xMX1RJTV9HRVRGTEFHX1VJRkNQWSAoQHJlZiBMTF9USU1fR2V0Q291bnRlciAoKSk7CisgICogQG5vdGUgIFJlbGV2YW50IG9ubHkgaWYgVUlGIGZsYWcgcmVtYXBwaW5nIGhhcyBiZWVuIGVuYWJsZWQgIChVSUYgc3RhdHVzIGJpdCBpcyBjb3BpZWQKKyAgKiAgICAgICAgdG8gVElNeF9DTlQgcmVnaXN0ZXIgYml0IDMxKQorICAqIEBwYXJhbSAgX19DTlRfXyBDb3VudGVyIHZhbHVlCisgICogQHJldHZhbCBVSUYgc3RhdHVzIGJpdAorICAqLworI2RlZmluZSBfX0xMX1RJTV9HRVRGTEFHX1VJRkNQWShfX0NOVF9fKSAgXAorICAgKFJFQURfQklUKChfX0NOVF9fKSwgVElNX0NOVF9VSUZDUFkpID4+IFRJTV9DTlRfVUlGQ1BZX1BvcykKKworLyoqCisgICogQGJyaWVmICBIRUxQRVIgbWFjcm8gY2FsY3VsYXRpbmcgRFRHWzA6N10gaW4gdGhlIFRJTXhfQkRUUiByZWdpc3RlciB0byBhY2hpZXZlIHRoZSByZXF1ZXN0ZWQgZGVhZCB0aW1lIGR1cmF0aW9uLgorICAqIEBub3RlIGV4OiBAcmVmIF9fTExfVElNX0NBTENfREVBRFRJTUUgKDgwMDAwMDAwLCBAcmVmIExMX1RJTV9HZXRDbG9ja0RpdmlzaW9uICgpLCAxMjApOworICAqIEBwYXJhbSAgX19USU1DTEtfXyB0aW1lciBpbnB1dCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqIEBwYXJhbSAgX19DS0RfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NMT0NLRElWSVNJT05fRElWNAorICAqIEBwYXJhbSAgX19EVF9fIGRlYWR0aW1lIGR1cmF0aW9uIChpbiBucykKKyAgKiBAcmV0dmFsIERUR1swOjddCisgICovCisjZGVmaW5lIF9fTExfVElNX0NBTENfREVBRFRJTUUoX19USU1DTEtfXywgX19DS0RfXywgX19EVF9fKSAgXAorICAgICggKCgodWludDY0X3QpKChfX0RUX18pKjEwMDBVKSkgPCAoKERUX0RFTEFZXzErMVUpICogVElNX0NBTENfRFRTKChfX1RJTUNMS19fKSwgKF9fQ0tEX18pKSkpICAgICAgICAgICA/ICh1aW50OF90KSgoKHVpbnQ2NF90KSgoX19EVF9fKSoxMDAwVSkgLyBUSU1fQ0FMQ19EVFMoKF9fVElNQ0xLX18pLCAoX19DS0RfXykpKSAgJiBEVF9ERUxBWV8xKSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoKCh1aW50NjRfdCkoKF9fRFRfXykqMTAwMFUpKSA8ICg2NFUgKyAoRFRfREVMQVlfMisxVSkpICogMlUgKiBUSU1fQ0FMQ19EVFMoKF9fVElNQ0xLX18pLCAoX19DS0RfXykpKSAgPyAodWludDhfdCkoRFRfUkFOR0VfMiB8ICgodWludDhfdCkoKHVpbnQ4X3QpKCgoKHVpbnQ2NF90KSgoX19EVF9fKSoxMDAwVSkpLyBUSU1fQ0FMQ19EVFMoKF9fVElNQ0xLX18pLCAoX19DS0RfXykpKSA+PiAxVSkgLSAodWludDhfdCkgNjRVKSAmIERUX0RFTEFZXzIpKSA6XAorICAgICAgKCgodWludDY0X3QpKChfX0RUX18pKjEwMDBVKSkgPCAoMzJVICsgKERUX0RFTEFZXzMrMVUpKSAqIDhVICogVElNX0NBTENfRFRTKChfX1RJTUNMS19fKSwgKF9fQ0tEX18pKSkgID8gKHVpbnQ4X3QpKERUX1JBTkdFXzMgfCAoKHVpbnQ4X3QpKCh1aW50OF90KSgoKCgodWludDY0X3QpKF9fRFRfXykqMTAwMFUpKS8gVElNX0NBTENfRFRTKChfX1RJTUNMS19fKSwgKF9fQ0tEX18pKSkgPj4gM1UpIC0gKHVpbnQ4X3QpIDMyVSkgJiBEVF9ERUxBWV8zKSkgOlwKKyAgICAgICgoKHVpbnQ2NF90KSgoX19EVF9fKSoxMDAwVSkpIDwgKDMyVSArIChEVF9ERUxBWV80KzFVKSkgKiAxNlUgKiBUSU1fQ0FMQ19EVFMoKF9fVElNQ0xLX18pLCAoX19DS0RfXykpKSA/ICh1aW50OF90KShEVF9SQU5HRV80IHwgKCh1aW50OF90KSgodWludDhfdCkoKCgoKHVpbnQ2NF90KShfX0RUX18pKjEwMDBVKSkvIFRJTV9DQUxDX0RUUygoX19USU1DTEtfXyksIChfX0NLRF9fKSkpID4+IDRVKSAtICh1aW50OF90KSAzMlUpICYgRFRfREVMQVlfNCkpIDpcCisgICAgICAgMFUpCisKKy8qKgorICAqIEBicmllZiAgSEVMUEVSIG1hY3JvIGNhbGN1bGF0aW5nIHRoZSBwcmVzY2FsZXIgdmFsdWUgdG8gYWNoaWV2ZSB0aGUgcmVxdWlyZWQgY291bnRlciBjbG9jayBmcmVxdWVuY3kuCisgICogQG5vdGUgZXg6IEByZWYgX19MTF9USU1fQ0FMQ19QU0MgKDgwMDAwMDAwLCAxMDAwMDAwKTsKKyAgKiBAcGFyYW0gIF9fVElNQ0xLX18gdGltZXIgaW5wdXQgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKiBAcGFyYW0gIF9fQ05UQ0xLX18gY291bnRlciBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqIEByZXR2YWwgUHJlc2NhbGVyIHZhbHVlICAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkKKyAgKi8KKyNkZWZpbmUgX19MTF9USU1fQ0FMQ19QU0MoX19USU1DTEtfXywgX19DTlRDTEtfXykgICBcCisgICAoKF9fVElNQ0xLX18pID49IChfX0NOVENMS19fKSkgPyAodWludDMyX3QpKChfX1RJTUNMS19fKS8oX19DTlRDTEtfXykgLSAxVSkgOiAwVQorCisvKioKKyAgKiBAYnJpZWYgIEhFTFBFUiBtYWNybyBjYWxjdWxhdGluZyB0aGUgYXV0by1yZWxvYWQgdmFsdWUgdG8gYWNoaWV2ZSB0aGUgcmVxdWlyZWQgb3V0cHV0IHNpZ25hbCBmcmVxdWVuY3kuCisgICogQG5vdGUgZXg6IEByZWYgX19MTF9USU1fQ0FMQ19BUlIgKDEwMDAwMDAsIEByZWYgTExfVElNX0dldFByZXNjYWxlciAoKSwgMTAwMDApOworICAqIEBwYXJhbSAgX19USU1DTEtfXyB0aW1lciBpbnB1dCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqIEBwYXJhbSAgX19QU0NfXyBwcmVzY2FsZXIKKyAgKiBAcGFyYW0gIF9fRlJFUV9fIG91dHB1dCBzaWduYWwgZnJlcXVlbmN5IChpbiBIeikKKyAgKiBAcmV0dmFsICBBdXRvLXJlbG9hZCB2YWx1ZSAgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpCisgICovCisjZGVmaW5lIF9fTExfVElNX0NBTENfQVJSKF9fVElNQ0xLX18sIF9fUFNDX18sIF9fRlJFUV9fKSBcCisgICAgICgoKF9fVElNQ0xLX18pLygoX19QU0NfXykgKyAxVSkpID49IChfX0ZSRVFfXykpID8gKChfX1RJTUNMS19fKS8oKF9fRlJFUV9fKSAqICgoX19QU0NfXykgKyAxVSkpIC0gMVUpIDogMFUKKworLyoqCisgICogQGJyaWVmICBIRUxQRVIgbWFjcm8gY2FsY3VsYXRpbmcgdGhlIGNvbXBhcmUgdmFsdWUgcmVxdWlyZWQgdG8gYWNoaWV2ZSB0aGUgcmVxdWlyZWQgdGltZXIgb3V0cHV0IGNvbXBhcmUgYWN0aXZlL2luYWN0aXZlIGRlbGF5LgorICAqIEBub3RlIGV4OiBAcmVmIF9fTExfVElNX0NBTENfREVMQVkgKDEwMDAwMDAsIEByZWYgTExfVElNX0dldFByZXNjYWxlciAoKSwgMTApOworICAqIEBwYXJhbSAgX19USU1DTEtfXyB0aW1lciBpbnB1dCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqIEBwYXJhbSAgX19QU0NfXyBwcmVzY2FsZXIKKyAgKiBAcGFyYW0gIF9fREVMQVlfXyB0aW1lciBvdXRwdXQgY29tcGFyZSBhY3RpdmUvaW5hY3RpdmUgZGVsYXkgKGluIHVzKQorICAqIEByZXR2YWwgQ29tcGFyZSB2YWx1ZSAgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpCisgICovCisjZGVmaW5lIF9fTExfVElNX0NBTENfREVMQVkoX19USU1DTEtfXywgX19QU0NfXywgX19ERUxBWV9fKSAgXAorKCh1aW50MzJfdCkoKCh1aW50NjRfdCkoX19USU1DTEtfXykgKiAodWludDY0X3QpKF9fREVMQVlfXykpIFwKKyAgICAgICAgICAvICgodWludDY0X3QpMTAwMDAwMFUgKiAodWludDY0X3QpKChfX1BTQ19fKSArIDFVKSkpKQorCisvKioKKyAgKiBAYnJpZWYgIEhFTFBFUiBtYWNybyBjYWxjdWxhdGluZyB0aGUgYXV0by1yZWxvYWQgdmFsdWUgdG8gYWNoaWV2ZSB0aGUgcmVxdWlyZWQgcHVsc2UgZHVyYXRpb24gKHdoZW4gdGhlIHRpbWVyIG9wZXJhdGVzIGluIG9uZSBwdWxzZSBtb2RlKS4KKyAgKiBAbm90ZSBleDogQHJlZiBfX0xMX1RJTV9DQUxDX1BVTFNFICgxMDAwMDAwLCBAcmVmIExMX1RJTV9HZXRQcmVzY2FsZXIgKCksIDEwLCAyMCk7CisgICogQHBhcmFtICBfX1RJTUNMS19fIHRpbWVyIGlucHV0IGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICogQHBhcmFtICBfX1BTQ19fIHByZXNjYWxlcgorICAqIEBwYXJhbSAgX19ERUxBWV9fIHRpbWVyIG91dHB1dCBjb21wYXJlIGFjdGl2ZS9pbmFjdGl2ZSBkZWxheSAoaW4gdXMpCisgICogQHBhcmFtICBfX1BVTFNFX18gcHVsc2UgZHVyYXRpb24gKGluIHVzKQorICAqIEByZXR2YWwgQXV0by1yZWxvYWQgdmFsdWUgIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICAqLworI2RlZmluZSBfX0xMX1RJTV9DQUxDX1BVTFNFKF9fVElNQ0xLX18sIF9fUFNDX18sIF9fREVMQVlfXywgX19QVUxTRV9fKSAgXAorICgodWludDMyX3QpKF9fTExfVElNX0NBTENfREVMQVkoKF9fVElNQ0xLX18pLCAoX19QU0NfXyksIChfX1BVTFNFX18pKSBcCisgICAgICAgICAgICsgX19MTF9USU1fQ0FMQ19ERUxBWSgoX19USU1DTEtfXyksIChfX1BTQ19fKSwgKF9fREVMQVlfXykpKSkKKworLyoqCisgICogQGJyaWVmICBIRUxQRVIgbWFjcm8gcmV0cmlldmluZyB0aGUgcmF0aW8gb2YgdGhlIGlucHV0IGNhcHR1cmUgcHJlc2NhbGVyCisgICogQG5vdGUgZXg6IEByZWYgX19MTF9USU1fR0VUX0lDUFNDX1JBVElPIChAcmVmIExMX1RJTV9JQ19HZXRQcmVzY2FsZXIgKCkpOworICAqIEBwYXJhbSAgX19JQ1BTQ19fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDUFNDX0RJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNQU0NfRElWMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ1BTQ19ESVY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDUFNDX0RJVjgKKyAgKiBAcmV0dmFsIElucHV0IGNhcHR1cmUgcHJlc2NhbGVyIHJhdGlvICgxLCAyLCA0IG9yIDgpCisgICovCisjZGVmaW5lIF9fTExfVElNX0dFVF9JQ1BTQ19SQVRJTyhfX0lDUFNDX18pICBcCisgICAoKHVpbnQzMl90KSgweDAxVSA8PCAoKChfX0lDUFNDX18pID4+IDE2VSkgPj4gVElNX0NDTVIxX0lDMVBTQ19Qb3MpKSkKKworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgVElNIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX1RpbWVfQmFzZSBUaW1lIEJhc2UgY29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aW1lciBjb3VudGVyLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIENFTiAgICAgICAgICAgTExfVElNX0VuYWJsZUNvdW50ZXIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVDb3VudGVyKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9DRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGltZXIgY291bnRlci4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDRU4gICAgICAgICAgIExMX1RJTV9EaXNhYmxlQ291bnRlcgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVDb3VudGVyKFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX0NFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRpbWVyIGNvdW50ZXIgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDRU4gICAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRDb3VudGVyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZENvdW50ZXIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX0NFTikgPT0gKFRJTV9DUjFfQ0VOKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHVwZGF0ZSBldmVudCBnZW5lcmF0aW9uLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVESVMgICAgICAgICAgTExfVElNX0VuYWJsZVVwZGF0ZUV2ZW50CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlVXBkYXRlRXZlbnQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5DUjEsIFRJTV9DUjFfVURJUyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB1cGRhdGUgZXZlbnQgZ2VuZXJhdGlvbi4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBVRElTICAgICAgICAgIExMX1RJTV9EaXNhYmxlVXBkYXRlRXZlbnQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlVXBkYXRlRXZlbnQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX1VESVMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHVwZGF0ZSBldmVudCBnZW5lcmF0aW9uIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVURJUyAgICAgICAgICBMTF9USU1fSXNFbmFibGVkVXBkYXRlRXZlbnQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIEludmVydGVkIHN0YXRlIG9mIGJpdCAoMCBvciAxKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkVXBkYXRlRXZlbnQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX1VESVMpID09IFJFU0VUKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdXBkYXRlIGV2ZW50IHNvdXJjZQorICAqIEBub3RlIFVwZGF0ZSBldmVudCBzb3VyY2Ugc2V0IHRvIExMX1RJTV9VUERBVEVTT1VSQ0VfUkVHVUxBUjogYW55IG9mIHRoZSBmb2xsb3dpbmcgZXZlbnRzCisgICogICAgICAgZ2VuZXJhdGUgYW4gdXBkYXRlIGludGVycnVwdCBvciBETUEgcmVxdWVzdCBpZiBlbmFibGVkOgorICAqICAgICAgICAtIENvdW50ZXIgb3ZlcmZsb3cvdW5kZXJmbG93CisgICogICAgICAgIC0gU2V0dGluZyB0aGUgVUcgYml0CisgICogICAgICAgIC0gVXBkYXRlIGdlbmVyYXRpb24gdGhyb3VnaCB0aGUgc2xhdmUgbW9kZSBjb250cm9sbGVyCisgICogQG5vdGUgVXBkYXRlIGV2ZW50IHNvdXJjZSBzZXQgdG8gTExfVElNX1VQREFURVNPVVJDRV9DT1VOVEVSOiBvbmx5IGNvdW50ZXIKKyAgKiAgICAgICBvdmVyZmxvdy91bmRlcmZsb3cgZ2VuZXJhdGVzIGFuIHVwZGF0ZSBpbnRlcnJ1cHQgb3IgRE1BIHJlcXVlc3QgaWYgZW5hYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBVUlMgICAgICAgICAgIExMX1RJTV9TZXRVcGRhdGVTb3VyY2UKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFVwZGF0ZVNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9VUERBVEVTT1VSQ0VfUkVHVUxBUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9VUERBVEVTT1VSQ0VfQ09VTlRFUgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldFVwZGF0ZVNvdXJjZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVXBkYXRlU291cmNlKQoreworICBNT0RJRllfUkVHKFRJTXgtPkNSMSwgVElNX0NSMV9VUlMsIFVwZGF0ZVNvdXJjZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCBldmVudCB1cGRhdGUgc291cmNlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVVJTICAgICAgICAgICBMTF9USU1fR2V0VXBkYXRlU291cmNlCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9VUERBVEVTT1VSQ0VfUkVHVUxBUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9VUERBVEVTT1VSQ0VfQ09VTlRFUgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9HZXRVcGRhdGVTb3VyY2UoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9VUlMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgb25lIHB1bHNlIG1vZGUgKG9uZSBzaG90IHYucy4gcmVwZXRpdGl2ZSkuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgT1BNICAgICAgICAgICBMTF9USU1fU2V0T25lUHVsc2VNb2RlCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBPbmVQdWxzZU1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT05FUFVMU0VNT0RFX1NJTkdMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PTkVQVUxTRU1PREVfUkVQRVRJVElWRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldE9uZVB1bHNlTW9kZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgT25lUHVsc2VNb2RlKQoreworICBNT0RJRllfUkVHKFRJTXgtPkNSMSwgVElNX0NSMV9PUE0sIE9uZVB1bHNlTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCBvbmUgcHVsc2UgbW9kZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBPUE0gICAgICAgICAgIExMX1RJTV9HZXRPbmVQdWxzZU1vZGUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09ORVBVTFNFTU9ERV9TSU5HTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT05FUFVMU0VNT0RFX1JFUEVUSVRJVkUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fR2V0T25lUHVsc2VNb2RlKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChUSU14LT5DUjEsIFRJTV9DUjFfT1BNKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSB0aW1lciBjb3VudGVyIGNvdW50aW5nIG1vZGUuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1RJTV9DT1VOVEVSX01PREVfU0VMRUNUX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvCisgICogICAgICAgICBjaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgY291bnRlciBtb2RlIHNlbGVjdGlvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZAorICAqICAgICAgICAgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFN3aXRjaGluZyBmcm9tIENlbnRlciBBbGlnbmVkIGNvdW50ZXIgbW9kZSB0byBFZGdlIGNvdW50ZXIgbW9kZSAob3IgcmV2ZXJzZSkKKyAgKiAgICAgICAgIHJlcXVpcmVzIGEgdGltZXIgcmVzZXQgdG8gYXZvaWQgdW5leHBlY3RlZCBkaXJlY3Rpb24gCisgICogICAgICAgICBkdWUgdG8gRElSIGJpdCByZWFkb25seSBpbiBjZW50ZXIgYWxpZ25lZCBtb2RlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIERJUiAgICAgICAgICAgTExfVElNX1NldENvdW50ZXJNb2RlXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBDTVMgICAgICAgICAgIExMX1RJTV9TZXRDb3VudGVyTW9kZQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ291bnRlck1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUk1PREVfVVAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUk1PREVfRE9XTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DT1VOVEVSTU9ERV9DRU5URVJfVVAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUk1PREVfQ0VOVEVSX0RPV04KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUk1PREVfQ0VOVEVSX1VQX0RPV04KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRDb3VudGVyTW9kZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ291bnRlck1vZGUpCit7CisgIE1PRElGWV9SRUcoVElNeC0+Q1IxLCBUSU1fQ1IxX0RJUiB8IFRJTV9DUjFfQ01TLCBDb3VudGVyTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCBjb3VudGVyIG1vZGUuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ09VTlRFUl9NT0RFX1NFTEVDVF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0bworICAqICAgICAgIGNoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBjb3VudGVyIG1vZGUgc2VsZWN0aW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkCisgICogICAgICAgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBESVIgICAgICAgICAgIExMX1RJTV9HZXRDb3VudGVyTW9kZVxuCisgICogICAgICAgICBDUjEgICAgICAgICAgQ01TICAgICAgICAgICBMTF9USU1fR2V0Q291bnRlck1vZGUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NPVU5URVJNT0RFX1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NPVU5URVJNT0RFX0RPV04KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUk1PREVfQ0VOVEVSX1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NPVU5URVJNT0RFX0NFTlRFUl9ET1dOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NPVU5URVJNT0RFX0NFTlRFUl9VUF9ET1dOCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0dldENvdW50ZXJNb2RlKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChUSU14LT5DUjEsIFRJTV9DUjFfRElSIHwgVElNX0NSMV9DTVMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgYXV0by1yZWxvYWQgKEFSUikgcHJlbG9hZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBBUlBFICAgICAgICAgIExMX1RJTV9FbmFibGVBUlJQcmVsb2FkCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlQVJSUHJlbG9hZChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5DUjEsIFRJTV9DUjFfQVJQRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBhdXRvLXJlbG9hZCAoQVJSKSBwcmVsb2FkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEFSUEUgICAgICAgICAgTExfVElNX0Rpc2FibGVBUlJQcmVsb2FkCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUFSUlByZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5DUjEsIFRJTV9DUjFfQVJQRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgYXV0by1yZWxvYWQgKEFSUikgcHJlbG9hZCBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEFSUEUgICAgICAgICAgTExfVElNX0lzRW5hYmxlZEFSUlByZWxvYWQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkQVJSUHJlbG9hZChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChUSU14LT5DUjEsIFRJTV9DUjFfQVJQRSkgPT0gKFRJTV9DUjFfQVJQRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgZGl2aXNpb24gcmF0aW8gYmV0d2VlbiB0aGUgdGltZXIgY2xvY2sgIGFuZCB0aGUgc2FtcGxpbmcgY2xvY2sgdXNlZCBieSB0aGUgZGVhZC10aW1lIGdlbmVyYXRvcnMgKHdoZW4gc3VwcG9ydGVkKSBhbmQgdGhlIGRpZ2l0YWwgZmlsdGVycy4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DTE9DS19ESVZJU0lPTl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqICAgICAgIHdoZXRoZXIgb3Igbm90IHRoZSBjbG9jayBkaXZpc2lvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgdGltZXIKKyAgKiAgICAgICBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDS0QgICAgICAgICAgIExMX1RJTV9TZXRDbG9ja0RpdmlzaW9uCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDbG9ja0RpdmlzaW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NMT0NLRElWSVNJT05fRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVY0CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0Q2xvY2tEaXZpc2lvbihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2xvY2tEaXZpc2lvbikKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5DUjEsIFRJTV9DUjFfQ0tELCBDbG9ja0RpdmlzaW9uKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGFjdHVhbCBkaXZpc2lvbiByYXRpbyBiZXR3ZWVuIHRoZSB0aW1lciBjbG9jayAgYW5kIHRoZSBzYW1wbGluZyBjbG9jayB1c2VkIGJ5IHRoZSBkZWFkLXRpbWUgZ2VuZXJhdG9ycyAod2hlbiBzdXBwb3J0ZWQpIGFuZCB0aGUgZGlnaXRhbCBmaWx0ZXJzLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NMT0NLX0RJVklTSU9OX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgdGhlIGNsb2NrIGRpdmlzaW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSB0aW1lcgorICAqICAgICAgIGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIENLRCAgICAgICAgICAgTExfVElNX0dldENsb2NrRGl2aXNpb24KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NMT0NLRElWSVNJT05fRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVY0CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0dldENsb2NrRGl2aXNpb24oVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9DS0QpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGNvdW50ZXIgdmFsdWUuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgorICAqIEBybXRvbGwgQ05UICAgICAgICAgIENOVCAgICAgICAgICAgTExfVElNX1NldENvdW50ZXIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENvdW50ZXIgQ291bnRlciB2YWx1ZSAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weEZGRkYgb3IgMHhGRkZGRkZGRikKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRDb3VudGVyKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDb3VudGVyKQoreworICBXUklURV9SRUcoVElNeC0+Q05ULCBDb3VudGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGNvdW50ZXIgdmFsdWUuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgorICAqIEBybXRvbGwgQ05UICAgICAgICAgIENOVCAgICAgICAgICAgTExfVElNX0dldENvdW50ZXIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIENvdW50ZXIgdmFsdWUgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGRkZGIG9yIDB4RkZGRkZGRkYpCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0dldENvdW50ZXIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFRJTXgtPkNOVCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgY3VycmVudCBkaXJlY3Rpb24gb2YgdGhlIGNvdW50ZXIKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBESVIgICAgICAgICAgIExMX1RJTV9HZXREaXJlY3Rpb24KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NPVU5URVJESVJFQ1RJT05fVVAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUkRJUkVDVElPTl9ET1dOCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0dldERpcmVjdGlvbihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX0RJUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgcHJlc2NhbGVyIHZhbHVlLgorICAqIEBub3RlIFRoZSBjb3VudGVyIGNsb2NrIGZyZXF1ZW5jeSBDS19DTlQgaXMgZXF1YWwgdG8gZkNLX1BTQyAvIChQU0NbMTU6MF0gKyAxKS4KKyAgKiBAbm90ZSBUaGUgcHJlc2NhbGVyIGNhbiBiZSBjaGFuZ2VkIG9uIHRoZSBmbHkgYXMgdGhpcyBjb250cm9sIHJlZ2lzdGVyIGlzIGJ1ZmZlcmVkLiBUaGUgbmV3CisgICogICAgICAgcHJlc2NhbGVyIHJhdGlvIGlzIHRha2VuIGludG8gYWNjb3VudCBhdCB0aGUgbmV4dCB1cGRhdGUgZXZlbnQuCisgICogQG5vdGUgSGVscGVyIG1hY3JvIEByZWYgX19MTF9USU1fQ0FMQ19QU0MgY2FuIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBQcmVzY2FsZXIgcGFyYW1ldGVyCisgICogQHJtdG9sbCBQU0MgICAgICAgICAgUFNDICAgICAgICAgICBMTF9USU1fU2V0UHJlc2NhbGVyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBQcmVzY2FsZXIgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldFByZXNjYWxlcihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgUHJlc2NhbGVyKQoreworICBXUklURV9SRUcoVElNeC0+UFNDLCBQcmVzY2FsZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgcHJlc2NhbGVyIHZhbHVlLgorICAqIEBybXRvbGwgUFNDICAgICAgICAgIFBTQyAgICAgICAgICAgTExfVElNX0dldFByZXNjYWxlcgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgIFByZXNjYWxlciB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0dldFByZXNjYWxlcihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+UFNDKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBhdXRvLXJlbG9hZCB2YWx1ZS4KKyAgKiBAbm90ZSBUaGUgY291bnRlciBpcyBibG9ja2VkIHdoaWxlIHRoZSBhdXRvLXJlbG9hZCB2YWx1ZSBpcyBudWxsLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KKyAgKiBAbm90ZSBIZWxwZXIgbWFjcm8gQHJlZiBfX0xMX1RJTV9DQUxDX0FSUiBjYW4gYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIEF1dG9SZWxvYWQgcGFyYW1ldGVyCisgICogQHJtdG9sbCBBUlIgICAgICAgICAgQVJSICAgICAgICAgICBMTF9USU1fU2V0QXV0b1JlbG9hZAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQXV0b1JlbG9hZCBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0QXV0b1JlbG9hZChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQXV0b1JlbG9hZCkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPkFSUiwgQXV0b1JlbG9hZCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBhdXRvLXJlbG9hZCB2YWx1ZS4KKyAgKiBAcm10b2xsIEFSUiAgICAgICAgICBBUlIgICAgICAgICAgIExMX1RJTV9HZXRBdXRvUmVsb2FkCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgQXV0by1yZWxvYWQgdmFsdWUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fR2V0QXV0b1JlbG9hZChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+QVJSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSByZXBldGl0aW9uIGNvdW50ZXIgdmFsdWUuCisgICogQG5vdGUgRm9yIGFkdmFuY2VkIHRpbWVyIGluc3RhbmNlcyBSZXBldGl0aW9uQ291bnRlciBjYW4gYmUgdXAgdG8gNjU1MzUgZXhjZXB0IGZvciBTVE0zMkYzNzN4QyBhbmQgU1RNMzJGMzc4eHggZGV2aWNlcy4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9SRVBFVElUSU9OX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgcmVwZXRpdGlvbiBjb3VudGVyLgorICAqIEBybXRvbGwgUkNSICAgICAgICAgIFJFUCAgICAgICAgICAgTExfVElNX1NldFJlcGV0aXRpb25Db3VudGVyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBSZXBldGl0aW9uQ291bnRlciBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTI1NQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldFJlcGV0aXRpb25Db3VudGVyKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBSZXBldGl0aW9uQ291bnRlcikKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPlJDUiwgUmVwZXRpdGlvbkNvdW50ZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgcmVwZXRpdGlvbiBjb3VudGVyIHZhbHVlLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX1JFUEVUSVRJT05fQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgYSByZXBldGl0aW9uIGNvdW50ZXIuCisgICogQHJtdG9sbCBSQ1IgICAgICAgICAgUkVQICAgICAgICAgICBMTF9USU1fR2V0UmVwZXRpdGlvbkNvdW50ZXIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJlcGV0aXRpb24gY291bnRlciB2YWx1ZQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9HZXRSZXBldGl0aW9uQ291bnRlcihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+UkNSKSk7Cit9CisKKyNpZiBkZWZpbmVkKFRJTV9DUjFfVUlGUkVNQVApCisvKioKKyAgKiBAYnJpZWYgIEZvcmNlIGEgY29udGludW91cyBjb3B5IG9mIHRoZSB1cGRhdGUgaW50ZXJydXB0IGZsYWcgKFVJRikgaW50byB0aGUgdGltZXIgY291bnRlciByZWdpc3RlciAoYml0IDMxKS4KKyAgKiBAbm90ZSBUaGlzIGFsbG93cyBib3RoIHRoZSBjb3VudGVyIHZhbHVlIGFuZCBhIHBvdGVudGlhbCByb2xsLW92ZXIgY29uZGl0aW9uIHNpZ25hbGxlZCBieSB0aGUgVUlGQ1BZIGZsYWcgdG8gYmUgcmVhZCBpbiBhbiBhdG9taWMgd2F5LgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVJRlJFTUFQICAgICAgTExfVElNX0VuYWJsZVVJRlJlbWFwCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlVUlGUmVtYXAoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX1VJRlJFTUFQKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHVwZGF0ZSBpbnRlcnJ1cHQgZmxhZyAoVUlGKSByZW1hcHBpbmcuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVUlGUkVNQVAgICAgICBMTF9USU1fRGlzYWJsZVVJRlJlbWFwCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZVVJRlJlbWFwKFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX1VJRlJFTUFQKTsKK30KKworI2VuZGlmIC8qIFRJTV9DUjFfVUlGUkVNQVAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX0NhcHR1cmVfQ29tcGFyZSBDYXB0dXJlIENvbXBhcmUgY29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSAgdGhlIGNhcHR1cmUvY29tcGFyZSBjb250cm9sIGJpdHMgKENDeEUsIENDeE5FIGFuZCBPQ3hNKSBwcmVsb2FkLgorICAqIEBub3RlIENDeEUsIENDeE5FIGFuZCBPQ3hNIGJpdHMgYXJlIHByZWxvYWRlZCwgYWZ0ZXIgaGF2aW5nIGJlZW4gd3JpdHRlbiwKKyAgKiAgICAgICB0aGV5IGFyZSB1cGRhdGVkIG9ubHkgd2hlbiBhIGNvbW11dGF0aW9uIGV2ZW50IChDT00pIG9jY3Vycy4KKyAgKiBAbm90ZSBPbmx5IG9uIGNoYW5uZWxzIHRoYXQgaGF2ZSBhIGNvbXBsZW1lbnRhcnkgb3V0cHV0LgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NPTU1VVEFUSU9OX0VWRU5UX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBpcyBhYmxlIHRvIGdlbmVyYXRlIGEgY29tbXV0YXRpb24gZXZlbnQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQ0NQQyAgICAgICAgICBMTF9USU1fQ0NfRW5hYmxlUHJlbG9hZAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NDX0VuYWJsZVByZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+Q1IyLCBUSU1fQ1IyX0NDUEMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgIHRoZSBjYXB0dXJlL2NvbXBhcmUgY29udHJvbCBiaXRzIChDQ3hFLCBDQ3hORSBhbmQgT0N4TSkgcHJlbG9hZC4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DT01NVVRBVElPTl9FVkVOVF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgaXMgYWJsZSB0byBnZW5lcmF0ZSBhIGNvbW11dGF0aW9uIGV2ZW50LgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIENDUEMgICAgICAgICAgTExfVElNX0NDX0Rpc2FibGVQcmVsb2FkCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ0NfRGlzYWJsZVByZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5DUjIsIFRJTV9DUjJfQ0NQQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSB1cGRhdGVkIHNvdXJjZSBvZiB0aGUgY2FwdHVyZS9jb21wYXJlIGNvbnRyb2wgYml0cyAoQ0N4RSwgQ0N4TkUgYW5kIE9DeE0pLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NPTU1VVEFUSU9OX0VWRU5UX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBpcyBhYmxlIHRvIGdlbmVyYXRlIGEgY29tbXV0YXRpb24gZXZlbnQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQ0NVUyAgICAgICAgICBMTF9USU1fQ0NfU2V0VXBkYXRlCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDQ1VwZGF0ZVNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DQ1VQREFURVNPVVJDRV9DT01HX09OTFkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0NVUERBVEVTT1VSQ0VfQ09NR19BTkRfVFJHSQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NDX1NldFVwZGF0ZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ0NVcGRhdGVTb3VyY2UpCit7CisgIE1PRElGWV9SRUcoVElNeC0+Q1IyLCBUSU1fQ1IyX0NDVVMsIENDVXBkYXRlU291cmNlKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHRyaWdnZXIgb2YgdGhlIGNhcHR1cmUvY29tcGFyZSBETUEgcmVxdWVzdC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBDQ0RTICAgICAgICAgIExMX1RJTV9DQ19TZXRETUFSZXFUcmlnZ2VyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBETUFSZXFUcmlnZ2VyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NDRE1BUkVRVUVTVF9DQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DQ0RNQVJFUVVFU1RfVVBEQVRFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ0NfU2V0RE1BUmVxVHJpZ2dlcihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgRE1BUmVxVHJpZ2dlcikKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5DUjIsIFRJTV9DUjJfQ0NEUywgRE1BUmVxVHJpZ2dlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCB0cmlnZ2VyIG9mIHRoZSBjYXB0dXJlL2NvbXBhcmUgRE1BIHJlcXVlc3QuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQ0NEUyAgICAgICAgICBMTF9USU1fQ0NfR2V0RE1BUmVxVHJpZ2dlcgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0NETUFSRVFVRVNUX0NDCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NDRE1BUkVRVUVTVF9VUERBVEUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fQ0NfR2V0RE1BUmVxVHJpZ2dlcihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVElNeC0+Q1IyLCBUSU1fQ1IyX0NDRFMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGxvY2sgbGV2ZWwgdG8gZnJlZXplIHRoZQorICAqICAgICAgICAgY29uZmlndXJhdGlvbiBvZiBzZXZlcmFsIGNhcHR1cmUvY29tcGFyZSBwYXJhbWV0ZXJzLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgdGhlIGxvY2sgbWVjaGFuaXNtIGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLgorICAqIEBybXRvbGwgQkRUUiAgICAgICAgIExPQ0sgICAgICAgICAgTExfVElNX0NDX1NldExvY2tMZXZlbAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgTG9ja0xldmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0xPQ0tMRVZFTF9PRkYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fTE9DS0xFVkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fTE9DS0xFVkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fTE9DS0xFVkVMXzMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DQ19TZXRMb2NrTGV2ZWwoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IExvY2tMZXZlbCkKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5CRFRSLCBUSU1fQkRUUl9MT0NLLCBMb2NrTGV2ZWwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBjYXB0dXJlL2NvbXBhcmUgY2hhbm5lbHMuCisgICogQHJtdG9sbCBDQ0VSICAgICAgICAgQ0MxRSAgICAgICAgICBMTF9USU1fQ0NfRW5hYmxlQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MxTkUgICAgICAgICBMTF9USU1fQ0NfRW5hYmxlQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyRSAgICAgICAgICBMTF9USU1fQ0NfRW5hYmxlQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyTkUgICAgICAgICBMTF9USU1fQ0NfRW5hYmxlQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzRSAgICAgICAgICBMTF9USU1fQ0NfRW5hYmxlQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzTkUgICAgICAgICBMTF9USU1fQ0NfRW5hYmxlQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M0RSAgICAgICAgICBMTF9USU1fQ0NfRW5hYmxlQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M1RSAgICAgICAgICBMTF9USU1fQ0NfRW5hYmxlQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M2RSAgICAgICAgICBMTF9USU1fQ0NfRW5hYmxlQ2hhbm5lbAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMk4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDNOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgICogQG5vdGUgICBDSDUgYW5kIENINiBjaGFubmVscyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgYWxsIEYzIGRldmljZXMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DQ19FbmFibGVDaGFubmVsKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVscykKK3sKKyAgU0VUX0JJVChUSU14LT5DQ0VSLCBDaGFubmVscyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBjYXB0dXJlL2NvbXBhcmUgY2hhbm5lbHMuCisgICogQHJtdG9sbCBDQ0VSICAgICAgICAgQ0MxRSAgICAgICAgICBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWxcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMU5FICAgICAgICAgTExfVElNX0NDX0Rpc2FibGVDaGFubmVsXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzJFICAgICAgICAgIExMX1RJTV9DQ19EaXNhYmxlQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyTkUgICAgICAgICBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWxcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM0UgICAgICAgICAgTExfVElNX0NDX0Rpc2FibGVDaGFubmVsXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzNORSAgICAgICAgIExMX1RJTV9DQ19EaXNhYmxlQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M0RSAgICAgICAgICBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWxcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNUUgICAgICAgICAgTExfVElNX0NDX0Rpc2FibGVDaGFubmVsXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzZFICAgICAgICAgIExMX1RJTV9DQ19EaXNhYmxlQ2hhbm5lbAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMk4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDNOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgICogQG5vdGUgICBDSDUgYW5kIENINiBjaGFubmVscyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgYWxsIEYzIGRldmljZXMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DQ19EaXNhYmxlQ2hhbm5lbChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbHMpCit7CisgIENMRUFSX0JJVChUSU14LT5DQ0VSLCBDaGFubmVscyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBjaGFubmVsKHMpIGlzKGFyZSkgZW5hYmxlZC4KKyAgKiBAcm10b2xsIENDRVIgICAgICAgICBDQzFFICAgICAgICAgIExMX1RJTV9DQ19Jc0VuYWJsZWRDaGFubmVsXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzFORSAgICAgICAgIExMX1RJTV9DQ19Jc0VuYWJsZWRDaGFubmVsXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzJFICAgICAgICAgIExMX1RJTV9DQ19Jc0VuYWJsZWRDaGFubmVsXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzJORSAgICAgICAgIExMX1RJTV9DQ19Jc0VuYWJsZWRDaGFubmVsXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzNFICAgICAgICAgIExMX1RJTV9DQ19Jc0VuYWJsZWRDaGFubmVsXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzNORSAgICAgICAgIExMX1RJTV9DQ19Jc0VuYWJsZWRDaGFubmVsXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzRFICAgICAgICAgIExMX1RJTV9DQ19Jc0VuYWJsZWRDaGFubmVsXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzVFICAgICAgICAgIExMX1RJTV9DQ19Jc0VuYWJsZWRDaGFubmVsXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzZFICAgICAgICAgIExMX1RJTV9DQ19Jc0VuYWJsZWRDaGFubmVsCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVscyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDFOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIM04KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYKKyAgKiBAbm90ZSAgIENINSBhbmQgQ0g2IGNoYW5uZWxzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBhbGwgRjMgZGV2aWNlcworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9DQ19Jc0VuYWJsZWRDaGFubmVsKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVscykKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChUSU14LT5DQ0VSLCBDaGFubmVscykgPT0gKENoYW5uZWxzKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX091dHB1dF9DaGFubmVsIE91dHB1dCBjaGFubmVsIGNvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgYW4gb3V0cHV0IGNoYW5uZWwuCisgICogQHJtdG9sbCBDQ01SMSAgICAgICAgQ0MxUyAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBDQzJTICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIENDM1MgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgQ0M0UyAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4KKyAgKiBAaWYgU1RNMzJGMzM0eDgKKyAgKiAgICAgICAgIENDTVIzICAgICAgICBDQzVTICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbgorICAqICAgICAgICAgQ0NNUjMgICAgICAgIENDNlMgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuCisgICogQGVsc2VpZiBTVE0zMkYzMDN4QworICAqICAgICAgICAgQ0NNUjMgICAgICAgIENDNVMgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuCisgICogICAgICAgICBDQ01SMyAgICAgICAgQ0M2UyAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4KKyAgKiBAZWxzZWlmIFNUTTMyRjMwMng4CisgICogICAgICAgICBDQ01SMyAgICAgICAgQ0M1UyAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBDQzZTICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbgorICAqIEBlbmRpZgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMVAgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyUCAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzNQICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNFAgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M1UCAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzZQICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIE9JUzEgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuCisgICogICAgICAgICBDUjIgICAgICAgICAgT0lTMiAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBPSVMzICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIE9JUzQgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuCisgICogICAgICAgICBDUjIgICAgICAgICAgT0lTNSAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBPSVM2ICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYKKyAgKiBAcGFyYW0gIENvbmZpZ3VyYXRpb24gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIGNvbWJpbmF0aW9uIG9mIGFsbCB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NQT0xBUklUWV9ISUdIIG9yIEByZWYgTExfVElNX09DUE9MQVJJVFlfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DSURMRVNUQVRFX0xPVyBvciBAcmVmIExMX1RJTV9PQ0lETEVTVEFURV9ISUdICisgICogQG5vdGUgICBDSDMgQ0g0IENINSBhbmQgQ0g2IGNoYW5uZWxzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBhbGwgRjMgZGV2aWNlcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX0NvbmZpZ091dHB1dChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgQ29uZmlndXJhdGlvbikKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgQ0xFQVJfQklUKCpwUmVnLCAoVElNX0NDTVIxX0NDMVMgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdKSk7CisgIE1PRElGWV9SRUcoVElNeC0+Q0NFUiwgKFRJTV9DQ0VSX0NDMVAgPDwgU0hJRlRfVEFCX0NDeFBbaUNoYW5uZWxdKSwKKyAgICAgICAgICAgICAoQ29uZmlndXJhdGlvbiAmIFRJTV9DQ0VSX0NDMVApIDw8IFNISUZUX1RBQl9DQ3hQW2lDaGFubmVsXSk7CisgIE1PRElGWV9SRUcoVElNeC0+Q1IyLCAoVElNX0NSMl9PSVMxIDw8IFNISUZUX1RBQl9PSVN4W2lDaGFubmVsXSksCisgICAgICAgICAgICAgKENvbmZpZ3VyYXRpb24gJiBUSU1fQ1IyX09JUzEpIDw8IFNISUZUX1RBQl9PSVN4W2lDaGFubmVsXSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVmaW5lIHRoZSBiZWhhdmlvciBvZiB0aGUgb3V0cHV0IHJlZmVyZW5jZSBzaWduYWwgT0N4UkVGIGZyb20gd2hpY2gKKyAgKiAgICAgICAgIE9DeCBhbmQgT0N4TiAod2hlbiByZWxldmFudCkgYXJlIGRlcml2ZWQuCisgICogQHJtdG9sbCBDQ01SMSAgICAgICAgT0MxTSAgICAgICAgICBMTF9USU1fT0NfU2V0TW9kZVxuCisgICogICAgICAgICBDQ01SMSAgICAgICAgT0MyTSAgICAgICAgICBMTF9USU1fT0NfU2V0TW9kZVxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0MzTSAgICAgICAgICBMTF9USU1fT0NfU2V0TW9kZVxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0M0TSAgICAgICAgICBMTF9USU1fT0NfU2V0TW9kZVxuCisgICogQGlmIFNUTTMyRjMzNHg4CisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M1TSAgICAgICAgICBMTF9USU1fT0NfU2V0TW9kZVxuCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M2TSAgICAgICAgICBMTF9USU1fT0NfU2V0TW9kZQorICAqIEBlbHNlaWYgU1RNMzJGMzAzeEMKKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzVNICAgICAgICAgIExMX1RJTV9PQ19TZXRNb2RlXG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzZNICAgICAgICAgIExMX1RJTV9PQ19TZXRNb2RlCisgICogQGVsc2VpZiBTVE0zMkYzMDJ4OAorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNU0gICAgICAgICAgTExfVElNX09DX1NldE1vZGVcbgorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNk0gICAgICAgICAgTExfVElNX09DX1NldE1vZGUKKyAgKiBAZW5kaWYKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYKKyAgKiBAcGFyYW0gIE1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0ZST1pFTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfQUNUSVZFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9JTkFDVElWRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfVE9HR0xFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9GT1JDRURfSU5BQ1RJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0ZPUkNFRF9BQ1RJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX1BXTTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX1BXTTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX1JFVFJJR19PUE0xCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9SRVRSSUdfT1BNMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfQ09NQklORURfUFdNMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfQ09NQklORURfUFdNMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfQVNTWU1FVFJJQ19QV00xCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9BU1NZTUVUUklDX1BXTTIKKyAgKiBAbm90ZSAgVGhlIGZvbGxvd2luZyBPQyBtb2RlcyBhcmUgbm90IGF2YWlsYWJsZSBvbiBhbGwgRjMgZGV2aWNlcyA6CisgICogICAgICAgIC0gIExMX1RJTV9PQ01PREVfUkVUUklHX09QTTEKKyAgKiAgICAgICAgLSAgTExfVElNX09DTU9ERV9SRVRSSUdfT1BNMgorICAqICAgICAgICAtICBMTF9USU1fT0NNT0RFX0NPTUJJTkVEX1BXTTEKKyAgKiAgICAgICAgLSAgTExfVElNX09DTU9ERV9DT01CSU5FRF9QV00yCisgICogICAgICAgIC0gIExMX1RJTV9PQ01PREVfQVNTWU1FVFJJQ19QV00xCisgICogICAgICAgIC0gIExMX1RJTV9PQ01PREVfQVNTWU1FVFJJQ19QV00yCisgICogQG5vdGUgIENINSBhbmQgQ0g2IGNoYW5uZWxzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBhbGwgRjMgZGV2aWNlcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX1NldE1vZGUoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IE1vZGUpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIE1PRElGWV9SRUcoKnBSZWcsICgoVElNX0NDTVIxX09DMU0gIHwgVElNX0NDTVIxX0NDMVMpIDw8IFNISUZUX1RBQl9PQ3h4W2lDaGFubmVsXSksICBNb2RlIDw8IFNISUZUX1RBQl9PQ3h4W2lDaGFubmVsXSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBvdXRwdXQgY29tcGFyZSBtb2RlIG9mIGFuIG91dHB1dCBjaGFubmVsLgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIE9DMU0gICAgICAgICAgTExfVElNX09DX0dldE1vZGVcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIE9DMk0gICAgICAgICAgTExfVElNX09DX0dldE1vZGVcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DM00gICAgICAgICAgTExfVElNX09DX0dldE1vZGVcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DNE0gICAgICAgICAgTExfVElNX09DX0dldE1vZGVcbgorICAqIEBpZiBTVE0zMkYzMzR4OAorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNU0gICAgICAgICAgTExfVElNX09DX0dldE1vZGVcbgorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNk0gICAgICAgICAgTExfVElNX09DX0dldE1vZGUKKyAgKiBAZWxzZWlmIFNUTTMyRjMwM3hDCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M1TSAgICAgICAgICBMTF9USU1fT0NfR2V0TW9kZVxuCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M2TSAgICAgICAgICBMTF9USU1fT0NfR2V0TW9kZQorICAqIEBlbHNlaWYgU1RNMzJGMzAyeDgKKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzVNICAgICAgICAgIExMX1RJTV9PQ19HZXRNb2RlXG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzZNICAgICAgICAgIExMX1RJTV9PQ19HZXRNb2RlCisgICogQGVuZGlmCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgICogQG5vdGUgIFRoZSBmb2xsb3dpbmcgT0MgbW9kZXMgYXJlIG5vdCBhdmFpbGFibGUgb24gYWxsIEYzIGRldmljZXMgOgorICAqICAgICAgICAtICBMTF9USU1fT0NNT0RFX1JFVFJJR19PUE0xCisgICogICAgICAgIC0gIExMX1RJTV9PQ01PREVfUkVUUklHX09QTTIKKyAgKiAgICAgICAgLSAgTExfVElNX09DTU9ERV9DT01CSU5FRF9QV00xCisgICogICAgICAgIC0gIExMX1RJTV9PQ01PREVfQ09NQklORURfUFdNMgorICAqICAgICAgICAtICBMTF9USU1fT0NNT0RFX0FTU1lNRVRSSUNfUFdNMQorICAqICAgICAgICAtICBMTF9USU1fT0NNT0RFX0FTU1lNRVRSSUNfUFdNMgorICAqIEBub3RlICBDSDUgYW5kIENINiBjaGFubmVscyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgYWxsIEYzIGRldmljZXMKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9GUk9aRU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0FDVElWRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfSU5BQ1RJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX1RPR0dMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfRk9SQ0VEX0lOQUNUSVZFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9GT1JDRURfQUNUSVZFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9QV00xCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9QV00yCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9SRVRSSUdfT1BNMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfUkVUUklHX09QTTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0NPTUJJTkVEX1BXTTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0NPTUJJTkVEX1BXTTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0FTU1lNRVRSSUNfUFdNMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfQVNTWU1FVFJJQ19QV00yCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldE1vZGUoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsICgoVElNX0NDTVIxX09DMU0gIHwgVElNX0NDTVIxX0NDMVMpIDw8IFNISUZUX1RBQl9PQ3h4W2lDaGFubmVsXSkpID4+IFNISUZUX1RBQl9PQ3h4W2lDaGFubmVsXSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBwb2xhcml0eSBvZiBhbiBvdXRwdXQgY2hhbm5lbC4KKyAgKiBAcm10b2xsIENDRVIgICAgICAgICBDQzFQICAgICAgICAgIExMX1RJTV9PQ19TZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MxTlAgICAgICAgICBMTF9USU1fT0NfU2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMlAgICAgICAgICAgTExfVElNX09DX1NldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzJOUCAgICAgICAgIExMX1RJTV9PQ19TZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzUCAgICAgICAgICBMTF9USU1fT0NfU2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM05QICAgICAgICAgTExfVElNX09DX1NldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzRQICAgICAgICAgIExMX1RJTV9PQ19TZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M1UCAgICAgICAgICBMTF9USU1fT0NfU2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNlAgICAgICAgICAgTExfVElNX09DX1NldFBvbGFyaXR5CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMk4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDNOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgICogQHBhcmFtICBQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ1BPTEFSSVRZX0hJR0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NQT0xBUklUWV9MT1cKKyAgKiBAbm90ZSAgIENINSBhbmQgQ0g2IGNoYW5uZWxzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBhbGwgRjMgZGV2aWNlcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX1NldFBvbGFyaXR5KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBQb2xhcml0eSkKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgTU9ESUZZX1JFRyhUSU14LT5DQ0VSLCAoVElNX0NDRVJfQ0MxUCA8PCBTSElGVF9UQUJfQ0N4UFtpQ2hhbm5lbF0pLCAgUG9sYXJpdHkgPDwgU0hJRlRfVEFCX0NDeFBbaUNoYW5uZWxdKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHBvbGFyaXR5IG9mIGFuIG91dHB1dCBjaGFubmVsLgorICAqIEBybXRvbGwgQ0NFUiAgICAgICAgIENDMVAgICAgICAgICAgTExfVElNX09DX0dldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzFOUCAgICAgICAgIExMX1RJTV9PQ19HZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyUCAgICAgICAgICBMTF9USU1fT0NfR2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMk5QICAgICAgICAgTExfVElNX09DX0dldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzNQICAgICAgICAgIExMX1RJTV9PQ19HZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzTlAgICAgICAgICBMTF9USU1fT0NfR2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNFAgICAgICAgICAgTExfVElNX09DX0dldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzVQICAgICAgICAgIExMX1RJTV9PQ19HZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M2UCAgICAgICAgICBMTF9USU1fT0NfR2V0UG9sYXJpdHkKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDFOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIM04KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYKKyAgKiBAbm90ZSAgIENINSBhbmQgQ0g2IGNoYW5uZWxzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBhbGwgRjMgZGV2aWNlcworICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NQT0xBUklUWV9ISUdICisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DUE9MQVJJVFlfTE9XCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldFBvbGFyaXR5KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICByZXR1cm4gKFJFQURfQklUKFRJTXgtPkNDRVIsIChUSU1fQ0NFUl9DQzFQIDw8IFNISUZUX1RBQl9DQ3hQW2lDaGFubmVsXSkpID4+IFNISUZUX1RBQl9DQ3hQW2lDaGFubmVsXSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBJRExFIHN0YXRlIG9mIGFuIG91dHB1dCBjaGFubmVsCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBpcyBzaWduaWZpY2FudCBvbmx5IGZvciB0aGUgdGltZXIgaW5zdGFuY2VzCisgICogICAgICAgc3VwcG9ydGluZyB0aGUgYnJlYWsgZmVhdHVyZS4gTWFjcm8gQHJlZiBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkKKyAgKiAgICAgICBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzCisgICogICAgICAgYSBicmVhayBpbnB1dC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgIE9JUzEgICAgICAgICAgTExfVElNX09DX1NldElkbGVTdGF0ZVxuCisgICogICAgICAgICBDUjIgICAgICAgICBPSVMyTiAgICAgICAgIExMX1RJTV9PQ19TZXRJZGxlU3RhdGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgT0lTMiAgICAgICAgICBMTF9USU1fT0NfU2V0SWRsZVN0YXRlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgIE9JUzJOICAgICAgICAgTExfVElNX09DX1NldElkbGVTdGF0ZVxuCisgICogICAgICAgICBDUjIgICAgICAgICBPSVMzICAgICAgICAgIExMX1RJTV9PQ19TZXRJZGxlU3RhdGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgT0lTM04gICAgICAgICBMTF9USU1fT0NfU2V0SWRsZVN0YXRlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgIE9JUzQgICAgICAgICAgTExfVElNX09DX1NldElkbGVTdGF0ZVxuCisgICogICAgICAgICBDUjIgICAgICAgICBPSVM1ICAgICAgICAgIExMX1RJTV9PQ19TZXRJZGxlU3RhdGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgT0lTNiAgICAgICAgICBMTF9USU1fT0NfU2V0SWRsZVN0YXRlCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMk4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDNOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgICogQHBhcmFtICBJZGxlU3RhdGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NJRExFU1RBVEVfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DSURMRVNUQVRFX0hJR0gKKyAgKiBAbm90ZSAgIENINSBhbmQgQ0g2IGNoYW5uZWxzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBhbGwgRjMgZGV2aWNlcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX1NldElkbGVTdGF0ZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgSWRsZVN0YXRlKQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICBNT0RJRllfUkVHKFRJTXgtPkNSMiwgKFRJTV9DUjJfT0lTMSA8PCBTSElGVF9UQUJfT0lTeFtpQ2hhbm5lbF0pLCAgSWRsZVN0YXRlIDw8IFNISUZUX1RBQl9PSVN4W2lDaGFubmVsXSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBJRExFIHN0YXRlIG9mIGFuIG91dHB1dCBjaGFubmVsCisgICogQHJtdG9sbCBDUjIgICAgICAgICBPSVMxICAgICAgICAgIExMX1RJTV9PQ19HZXRJZGxlU3RhdGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgT0lTMk4gICAgICAgICBMTF9USU1fT0NfR2V0SWRsZVN0YXRlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgIE9JUzIgICAgICAgICAgTExfVElNX09DX0dldElkbGVTdGF0ZVxuCisgICogICAgICAgICBDUjIgICAgICAgICBPSVMyTiAgICAgICAgIExMX1RJTV9PQ19HZXRJZGxlU3RhdGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgT0lTMyAgICAgICAgICBMTF9USU1fT0NfR2V0SWRsZVN0YXRlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgIE9JUzNOICAgICAgICAgTExfVElNX09DX0dldElkbGVTdGF0ZVxuCisgICogICAgICAgICBDUjIgICAgICAgICBPSVM0ICAgICAgICAgIExMX1RJTV9PQ19HZXRJZGxlU3RhdGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgT0lTNSAgICAgICAgICBMTF9USU1fT0NfR2V0SWRsZVN0YXRlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgIE9JUzYgICAgICAgICAgTExfVElNX09DX0dldElkbGVTdGF0ZQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDJOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINgorICAqIEBub3RlICAgQ0g1IGFuZCBDSDYgY2hhbm5lbHMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIGFsbCBGMyBkZXZpY2VzCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ0lETEVTVEFURV9MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NJRExFU1RBVEVfSElHSAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9PQ19HZXRJZGxlU3RhdGUoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJldHVybiAoUkVBRF9CSVQoVElNeC0+Q1IyLCAoVElNX0NSMl9PSVMxIDw8IFNISUZUX1RBQl9PSVN4W2lDaGFubmVsXSkpID4+IFNISUZUX1RBQl9PSVN4W2lDaGFubmVsXSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGZhc3QgbW9kZSBmb3IgdGhlIG91dHB1dCBjaGFubmVsLgorICAqIEBub3RlIEFjdHMgb25seSBpZiB0aGUgY2hhbm5lbCBpcyBjb25maWd1cmVkIGluIFBXTTEgb3IgUFdNMiBtb2RlLgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIE9DMUZFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVGYXN0XG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBPQzJGRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlRmFzdFxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0MzRkUgICAgICAgICAgTExfVElNX09DX0VuYWJsZUZhc3RcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DNEZFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVGYXN0XG4KKyAgKiBAaWYgU1RNMzJGMzM0eDgKKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzVGRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlRmFzdFxuCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M2RkUgICAgICAgICAgTExfVElNX09DX0VuYWJsZUZhc3QKKyAgKiBAZWxzZWlmIFNUTTMyRjMwM3hDCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M1RkUgICAgICAgICAgTExfVElNX09DX0VuYWJsZUZhc3RcbgorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNkZFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVGYXN0CisgICogQGVsc2VpZiBTVE0zMkYzMDJ4OAorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNUZFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVGYXN0XG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzZGRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlRmFzdAorICAqIEBlbmRpZgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINgorICAqIEBub3RlICAgT0M1RkUgYW5kIE9DNkZFIGFyZSBub3QgYXZhaWxhYmxlIGZvciBhbGwgRjMgZGV2aWNlcworICAqIEBub3RlICAgQ0g1IGFuZCBDSDYgY2hhbm5lbHMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIGFsbCBGMyBkZXZpY2VzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfRW5hYmxlRmFzdChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgU0VUX0JJVCgqcFJlZywgKFRJTV9DQ01SMV9PQzFGRSA8PCBTSElGVF9UQUJfT0N4eFtpQ2hhbm5lbF0pKTsKKworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgZmFzdCBtb2RlIGZvciB0aGUgb3V0cHV0IGNoYW5uZWwuCisgICogQHJtdG9sbCBDQ01SMSAgICAgICAgT0MxRkUgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVGYXN0XG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBPQzJGRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZUZhc3RcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DM0ZFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlRmFzdFxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0M0RkUgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVGYXN0XG4KKyAgKiBAaWYgU1RNMzJGMzM0eDgKKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzVGRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZUZhc3RcbgorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNkZFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlRmFzdAorICAqIEBlbHNlaWYgU1RNMzJGMzAzeEMKKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzVGRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZUZhc3RcbgorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNkZFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlRmFzdAorICAqIEBlbHNlaWYgU1RNMzJGMzAyeDgKKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzVGRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZUZhc3RcbgorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNkZFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlRmFzdAorICAqIEBlbmRpZgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINgorICAqIEBub3RlICAgT0M1RkUgYW5kIE9DNkZFIGFyZSBub3QgYXZhaWxhYmxlIGZvciBhbGwgRjMgZGV2aWNlcworICAqIEBub3RlICAgQ0g1IGFuZCBDSDYgY2hhbm5lbHMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIGFsbCBGMyBkZXZpY2VzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfRGlzYWJsZUZhc3QoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIENMRUFSX0JJVCgqcFJlZywgKFRJTV9DQ01SMV9PQzFGRSA8PCBTSElGVF9UQUJfT0N4eFtpQ2hhbm5lbF0pKTsKKworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIGZhc3QgbW9kZSBpcyBlbmFibGVkIGZvciB0aGUgb3V0cHV0IGNoYW5uZWwuCisgICogQHJtdG9sbCBDQ01SMSAgICAgICAgT0MxRkUgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZEZhc3RcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIE9DMkZFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRGYXN0XG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBPQzNGRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkRmFzdFxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0M0RkUgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZEZhc3RcbgorICAqIEBpZiBTVE0zMkYzMzR4OAorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNUZFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRGYXN0XG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzZGRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkRmFzdAorICAqIEBlbHNlaWYgU1RNMzJGMzAzeEMKKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzVGRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkRmFzdFxuCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M2RkUgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZEZhc3QKKyAgKiBAZWxzZWlmIFNUTTMyRjMwMng4CisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M1RkUgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVGYXN0XG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzZGRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZUZhc3QKKyAgKiBAZW5kaWYKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYKKyAgKiBAbm90ZSAgIE9DNUZFIGFuZCBPQzZGRSBhcmUgbm90IGF2YWlsYWJsZSBmb3IgYWxsIEYzIGRldmljZXMKKyAgKiBAbm90ZSAgIENINSBhbmQgQ0g2IGNoYW5uZWxzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBhbGwgRjMgZGV2aWNlcworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9PQ19Jc0VuYWJsZWRGYXN0KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOworICByZWdpc3RlciB1aW50MzJfdCBiaXRmaWVsZCA9IFRJTV9DQ01SMV9PQzFGRSA8PCBTSElGVF9UQUJfT0N4eFtpQ2hhbm5lbF07CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsIGJpdGZpZWxkKSA9PSBiaXRmaWVsZCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGNvbXBhcmUgcmVnaXN0ZXIgKFRJTXhfQ0NSeCkgcHJlbG9hZCBmb3IgdGhlIG91dHB1dCBjaGFubmVsLgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIE9DMVBFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVQcmVsb2FkXG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBPQzJQRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlUHJlbG9hZFxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0MzUEUgICAgICAgICAgTExfVElNX09DX0VuYWJsZVByZWxvYWRcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DNFBFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVQcmVsb2FkXG4KKyAgKiBAaWYgU1RNMzJGMzM0eDgKKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzVQRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlUHJlbG9hZFxuCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M2UEUgICAgICAgICAgTExfVElNX09DX0VuYWJsZVByZWxvYWQKKyAgKiBAZWxzZWlmIFNUTTMyRjMwM3hDCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M1UEUgICAgICAgICAgTExfVElNX09DX0VuYWJsZVByZWxvYWRcbgorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNlBFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVQcmVsb2FkCisgICogQGVsc2VpZiBTVE0zMkYzMDJ4OAorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNVBFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVQcmVsb2FkXG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzZQRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlUHJlbG9hZAorICAqIEBlbmRpZgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINgorICAqIEBub3RlICAgT0M1UEUgYW5kIE9DNlBFIGFyZSBub3QgYXZhaWxhYmxlIGZvciBhbGwgRjMgZGV2aWNlcworICAqIEBub3RlICAgQ0g1IGFuZCBDSDYgY2hhbm5lbHMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIGFsbCBGMyBkZXZpY2VzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfRW5hYmxlUHJlbG9hZChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgU0VUX0JJVCgqcFJlZywgKFRJTV9DQ01SMV9PQzFQRSA8PCBTSElGVF9UQUJfT0N4eFtpQ2hhbm5lbF0pKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGNvbXBhcmUgcmVnaXN0ZXIgKFRJTXhfQ0NSeCkgcHJlbG9hZCBmb3IgdGhlIG91dHB1dCBjaGFubmVsLgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIE9DMVBFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlUHJlbG9hZFxuCisgICogICAgICAgICBDQ01SMSAgICAgICAgT0MyUEUgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVQcmVsb2FkXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBPQzNQRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZVByZWxvYWRcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DNFBFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlUHJlbG9hZFxuCisgICogQGlmIFNUTTMyRjMzNHg4CisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M1UEUgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVQcmVsb2FkXG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzZQRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZVByZWxvYWQKKyAgKiBAZWxzZWlmIFNUTTMyRjMwM3hDCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M1UEUgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVQcmVsb2FkXG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzZQRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZVByZWxvYWQKKyAgKiBAZWxzZWlmIFNUTTMyRjMwMng4CisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M1UEUgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVQcmVsb2FkXG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzZQRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZVByZWxvYWQKKyAgKiBAZW5kaWYKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYKKyAgKiBAbm90ZSAgIE9DNVBFIGFuZCBPQzZQRSBhcmUgbm90IGF2YWlsYWJsZSBmb3IgYWxsIEYzIGRldmljZXMKKyAgKiBAbm90ZSAgIENINSBhbmQgQ0g2IGNoYW5uZWxzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBhbGwgRjMgZGV2aWNlcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX0Rpc2FibGVQcmVsb2FkKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOworICBDTEVBUl9CSVQoKnBSZWcsIChUSU1fQ0NNUjFfT0MxUEUgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgY29tcGFyZSByZWdpc3RlciAoVElNeF9DQ1J4KSBwcmVsb2FkIGlzIGVuYWJsZWQgZm9yIHRoZSBvdXRwdXQgY2hhbm5lbC4KKyAgKiBAcm10b2xsIENDTVIxICAgICAgICBPQzFQRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkUHJlbG9hZFxuCisgICogICAgICAgICBDQ01SMSAgICAgICAgT0MyUEUgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZFByZWxvYWRcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DM1BFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRQcmVsb2FkXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBPQzRQRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkUHJlbG9hZFxuCisgICogQGlmICAgU1RNMzJGMzM0eDgKKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzVQRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkUHJlbG9hZFxuCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M2UEUgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZFByZWxvYWQKKyAgKiBAZWxzZWlmIFNUTTMyRjMwM3hDCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M1UEUgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZFByZWxvYWRcbgorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNlBFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRQcmVsb2FkCisgICogQGVsc2VpZiBTVE0zMkYzMDJ4OAorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNVBFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRQcmVsb2FkXG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzZQRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkUHJlbG9hZAorICAqIEBlbmRpZgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINgorICAqIEBub3RlICAgT0M1UEUgYW5kIE9DNlBFIGFyZSBub3QgYXZhaWxhYmxlIGZvciBhbGwgRjMgZGV2aWNlcworICAqIEBub3RlICAgQ0g1IGFuZCBDSDYgY2hhbm5lbHMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIGFsbCBGMyBkZXZpY2VzCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0lzRW5hYmxlZFByZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGJpdGZpZWxkID0gVElNX0NDTVIxX09DMVBFIDw8IFNISUZUX1RBQl9PQ3h4W2lDaGFubmVsXTsKKyAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgYml0ZmllbGQpID09IGJpdGZpZWxkKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgY2xlYXJpbmcgdGhlIG91dHB1dCBjaGFubmVsIG9uIGFuIGV4dGVybmFsIGV2ZW50LgorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgdXNlZCBpbiBPdXRwdXQgY29tcGFyZSBhbmQgUFdNIG1vZGVzLiBJdCBkb2VzIG5vdCB3b3JrIGluIEZvcmNlZCBtb2RlLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX09DWFJFRl9DTEVBUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyCisgICogICAgICAgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgY2FuIGNsZWFyIHRoZSBPQ3hSRUYgc2lnbmFsIG9uIGFuIGV4dGVybmFsIGV2ZW50LgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIE9DMUNFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVDbGVhclxuCisgICogICAgICAgICBDQ01SMSAgICAgICAgT0MyQ0UgICAgICAgICAgTExfVElNX09DX0VuYWJsZUNsZWFyXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBPQzNDRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlQ2xlYXJcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DNENFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVDbGVhclxuCisgICogQGlmIFNUTTMyRjMzNHg4CisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M1Q0UgICAgICAgICAgTExfVElNX09DX0VuYWJsZUNsZWFyXG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzZDRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlQ2xlYXIKKyAgKiBAZWxzZWlmIFNUTTMyRjMwM3hDCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M1Q0UgICAgICAgICAgTExfVElNX09DX0VuYWJsZUNsZWFyXG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzZDRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlQ2xlYXIKKyAgKiBAZWxzZWlmIFNUTTMyRjMwMng4CisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M1Q0UgICAgICAgICAgTExfVElNX09DX0VuYWJsZUNsZWFyXG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzZDRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlQ2xlYXIKKyAgKiBAZW5kaWYKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYKKyAgKiBAbm90ZSAgIE9DNUNFIGFuZCBPQzZDRSBhcmUgbm90IGF2YWlsYWJsZSBmb3IgYWxsIEYzIGRldmljZXMKKyAgKiBAbm90ZSAgIENINSBhbmQgQ0g2IGNoYW5uZWxzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBhbGwgRjMgZGV2aWNlcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX0VuYWJsZUNsZWFyKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOworICBTRVRfQklUKCpwUmVnLCAoVElNX0NDTVIxX09DMUNFIDw8IFNISUZUX1RBQl9PQ3h4W2lDaGFubmVsXSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgY2xlYXJpbmcgdGhlIG91dHB1dCBjaGFubmVsIG9uIGFuIGV4dGVybmFsIGV2ZW50LgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX09DWFJFRl9DTEVBUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyCisgICogICAgICAgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgY2FuIGNsZWFyIHRoZSBPQ3hSRUYgc2lnbmFsIG9uIGFuIGV4dGVybmFsIGV2ZW50LgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIE9DMUNFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlQ2xlYXJcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIE9DMkNFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlQ2xlYXJcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DM0NFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlQ2xlYXJcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DNENFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlQ2xlYXJcbgorICAqIEBpZiBTVE0zMkYzMzR4OAorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNUNFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlQ2xlYXJcbgorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNkNFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlQ2xlYXIKKyAgKiBAZWxzZWlmIFNUTTMyRjMwM3hDCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M1Q0UgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVDbGVhclxuCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M2Q0UgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVDbGVhcgorICAqIEBlbHNlaWYgU1RNMzJGMzAyeDgKKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzVDRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZUNsZWFyXG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzZDRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZUNsZWFyCisgICogQGVuZGlmCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgICogQG5vdGUgICBPQzVDRSBhbmQgT0M2Q0UgYXJlIG5vdCBhdmFpbGFibGUgZm9yIGFsbCBGMyBkZXZpY2VzCisgICogQG5vdGUgICBDSDUgYW5kIENINiBjaGFubmVscyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgYWxsIEYzIGRldmljZXMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19EaXNhYmxlQ2xlYXIoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIENMRUFSX0JJVCgqcFJlZywgKFRJTV9DQ01SMV9PQzFDRSA8PCBTSElGVF9UQUJfT0N4eFtpQ2hhbm5lbF0pKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgY2xlYXJpbmcgdGhlIG91dHB1dCBjaGFubmVsIG9uIGFuIGV4dGVybmFsIGV2ZW50IGlzIGVuYWJsZWQgZm9yIHRoZSBvdXRwdXQgY2hhbm5lbC4KKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgY2xlYXJpbmcgdGhlIG91dHB1dCBjaGFubmVsIG9uIGFuIGV4dGVybmFsIGV2ZW50LgorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgdXNlZCBpbiBPdXRwdXQgY29tcGFyZSBhbmQgUFdNIG1vZGVzLiBJdCBkb2VzIG5vdCB3b3JrIGluIEZvcmNlZCBtb2RlLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX09DWFJFRl9DTEVBUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyCisgICogICAgICAgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgY2FuIGNsZWFyIHRoZSBPQ3hSRUYgc2lnbmFsIG9uIGFuIGV4dGVybmFsIGV2ZW50LgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIE9DMUNFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRDbGVhclxuCisgICogICAgICAgICBDQ01SMSAgICAgICAgT0MyQ0UgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZENsZWFyXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBPQzNDRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkQ2xlYXJcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DNENFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRDbGVhclxuCisgICogQGlmIFNUTTMyRjMzNHg4CisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M1Q0UgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZENsZWFyXG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzZDRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkQ2xlYXIKKyAgKiBAZWxzZWlmIFNUTTMyRjMwM3hDCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M1Q0UgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZENsZWFyXG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzZDRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkQ2xlYXIKKyAgKiBAZWxzZWlmIFNUTTMyRjMwMng4CisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M1Q0UgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZENsZWFyXG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzZDRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkQ2xlYXIKKyAgKiBAZW5kaWYKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYKKyAgKiBAbm90ZSAgIE9DNUNFIGFuZCBPQzZDRSBhcmUgbm90IGF2YWlsYWJsZSBmb3IgYWxsIEYzIGRldmljZXMKKyAgKiBAbm90ZSAgIENINSBhbmQgQ0g2IGNoYW5uZWxzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBhbGwgRjMgZGV2aWNlcworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9PQ19Jc0VuYWJsZWRDbGVhcihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgcmVnaXN0ZXIgdWludDMyX3QgYml0ZmllbGQgPSBUSU1fQ0NNUjFfT0MxQ0UgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdOworICByZXR1cm4gKFJFQURfQklUKCpwUmVnLCBiaXRmaWVsZCkgPT0gYml0ZmllbGQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgZGVhZC10aW1lIGRlbGF5IChkZWxheSBpbnNlcnRlZCBiZXR3ZWVuIHRoZSByaXNpbmcgZWRnZSBvZiB0aGUgT0N4UkVGIHNpZ25hbCBhbmQgdGhlIHJpc2luZyBlZGdlIGlmIHRoZSBPY3ggYW5kIE9DeE4gc2lnbmFscykuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBkZWFkLXRpbWUgaW5zZXJ0aW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgICogQG5vdGUgSGVscGVyIG1hY3JvIEByZWYgX19MTF9USU1fQ0FMQ19ERUFEVElNRSBjYW4gYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIERlYWRUaW1lIHBhcmFtZXRlcgorICAqIEBybXRvbGwgQkRUUiAgICAgICAgIERURyAgICAgICAgICAgTExfVElNX09DX1NldERlYWRUaW1lCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBEZWFkVGltZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTI1NQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX1NldERlYWRUaW1lKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBEZWFkVGltZSkKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5CRFRSLCBUSU1fQkRUUl9EVEcsIERlYWRUaW1lKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgY29tcGFyZSB2YWx1ZSBmb3Igb3V0cHV0IGNoYW5uZWwgMSAoVElNeF9DQ1IxKS4KKyAgKiBAbm90ZSBJbiAzMi1iaXQgdGltZXIgaW1wbGVtZW50YXRpb25zIGNvbXBhcmUgdmFsdWUgY2FuIGJlIGJldHdlZW4gMHgwMDAwMDAwMCBhbmQgMHhGRkZGRkZGRi4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgYSAzMiBiaXRzIGNvdW50ZXIuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0MxX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgb3V0cHV0IGNoYW5uZWwgMSBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENDUjEgICAgICAgICBDQ1IxICAgICAgICAgIExMX1RJTV9PQ19TZXRDb21wYXJlQ0gxCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDb21wYXJlVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX1NldENvbXBhcmVDSDEoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENvbXBhcmVWYWx1ZSkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPkNDUjEsIENvbXBhcmVWYWx1ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGNvbXBhcmUgdmFsdWUgZm9yIG91dHB1dCBjaGFubmVsIDIgKFRJTXhfQ0NSMikuCisgICogQG5vdGUgSW4gMzItYml0IHRpbWVyIGltcGxlbWVudGF0aW9ucyBjb21wYXJlIHZhbHVlIGNhbiBiZSBiZXR3ZWVuIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NDMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIG91dHB1dCBjaGFubmVsIDIgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgICogQHJtdG9sbCBDQ1IyICAgICAgICAgQ0NSMiAgICAgICAgICBMTF9USU1fT0NfU2V0Q29tcGFyZUNIMgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ29tcGFyZVZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19TZXRDb21wYXJlQ0gyKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDb21wYXJlVmFsdWUpCit7CisgIFdSSVRFX1JFRyhUSU14LT5DQ1IyLCBDb21wYXJlVmFsdWUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBjb21wYXJlIHZhbHVlIGZvciBvdXRwdXQgY2hhbm5lbCAzIChUSU14X0NDUjMpLgorICAqIEBub3RlIEluIDMyLWJpdCB0aW1lciBpbXBsZW1lbnRhdGlvbnMgY29tcGFyZSB2YWx1ZSBjYW4gYmUgYmV0d2VlbiAweDAwMDAwMDAwIGFuZCAweEZGRkZGRkZGLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DQzNfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBvdXRwdXQgY2hhbm5lbCBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENDUjMgICAgICAgICBDQ1IzICAgICAgICAgIExMX1RJTV9PQ19TZXRDb21wYXJlQ0gzCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDb21wYXJlVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX1NldENvbXBhcmVDSDMoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENvbXBhcmVWYWx1ZSkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPkNDUjMsIENvbXBhcmVWYWx1ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGNvbXBhcmUgdmFsdWUgZm9yIG91dHB1dCBjaGFubmVsIDQgKFRJTXhfQ0NSNCkuCisgICogQG5vdGUgSW4gMzItYml0IHRpbWVyIGltcGxlbWVudGF0aW9ucyBjb21wYXJlIHZhbHVlIGNhbiBiZSBiZXR3ZWVuIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NDNF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIG91dHB1dCBjaGFubmVsIDQgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgICogQHJtdG9sbCBDQ1I0ICAgICAgICAgQ0NSNCAgICAgICAgICBMTF9USU1fT0NfU2V0Q29tcGFyZUNINAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ29tcGFyZVZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19TZXRDb21wYXJlQ0g0KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDb21wYXJlVmFsdWUpCit7CisgIFdSSVRFX1JFRyhUSU14LT5DQ1I0LCBDb21wYXJlVmFsdWUpOworfQorCisjaWYgZGVmaW5lZChUSU1fQ0NSNV9DQ1I1KQorLyoqCisgICogQGJyaWVmICBTZXQgY29tcGFyZSB2YWx1ZSBmb3Igb3V0cHV0IGNoYW5uZWwgNSAoVElNeF9DQ1I1KS4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DQzVfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBvdXRwdXQgY2hhbm5lbCA1IGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLgorICAqIEBpZiBTVE0zMkYzMzR4OAorICAqIEBybXRvbGwgQ0NSNSAgICAgICAgIENDUjUgICAgICAgICAgTExfVElNX09DX1NldENvbXBhcmVDSDUKKyAgKiBAZWxzZWlmIFNUTTMyRjMwM3hDCisgICogQHJtdG9sbCBDQ1I1ICAgICAgICAgQ0NSNSAgICAgICAgICBMTF9USU1fT0NfU2V0Q29tcGFyZUNINQorICAqIEBlbHNlaWYgU1RNMzJGMzAyeDgKKyAgKiBAcm10b2xsIENDUjUgICAgICAgICBDQ1I1ICAgICAgICAgIExMX1RJTV9PQ19TZXRDb21wYXJlQ0g1CisgICogQGVuZGlmCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDb21wYXJlVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNQorICAqIEBub3RlICAgQ0g1IGNoYW5uZWwgaXMgbm90IGF2YWlsYWJsZSBmb3IgYWxsIEYzIGRldmljZXMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19TZXRDb21wYXJlQ0g1KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDb21wYXJlVmFsdWUpCit7CisgIFdSSVRFX1JFRyhUSU14LT5DQ1I1LCBDb21wYXJlVmFsdWUpOworfQorCisjZW5kaWYgLyogVElNX0NDUjVfQ0NSNSAqLworI2lmIGRlZmluZWQoVElNX0NDUjZfQ0NSNikKKy8qKgorICAqIEBicmllZiAgU2V0IGNvbXBhcmUgdmFsdWUgZm9yIG91dHB1dCBjaGFubmVsIDYgKFRJTXhfQ0NSNikuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0M2X0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgb3V0cHV0IGNoYW5uZWwgNiBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAaWYgU1RNMzJGMzQ0eDgKKyAgKiBAcm10b2xsIENDUjYgICAgICAgICBDQ1I2ICAgICAgICAgIExMX1RJTV9PQ19TZXRDb21wYXJlQ0g2CisgICogQGVsc2VpZiBTVE0zMkYzMDN4QworICAqICAgICAgICAgQ0NSNiAgICAgICAgIENDUjYgICAgICAgICAgTExfVElNX09DX1NldENvbXBhcmVDSDYKKyAgKiBAZWxzZWlmIFNUTTMyRjMwMng4CisgICogICAgICAgICBDQ1I2ICAgICAgICAgQ0NSNiAgICAgICAgICBMTF9USU1fT0NfU2V0Q29tcGFyZUNINgorICAqIEBlbmRpZgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ29tcGFyZVZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUKKyAgKiBAbm90ZSAgIENINiBjaGFubmVsIGlzIG5vdCBhdmFpbGFibGUgZm9yIGFsbCBGMyBkZXZpY2VzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfU2V0Q29tcGFyZUNINihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ29tcGFyZVZhbHVlKQoreworICBXUklURV9SRUcoVElNeC0+Q0NSNiwgQ29tcGFyZVZhbHVlKTsKK30KKworI2VuZGlmIC8qIFRJTV9DQ1I2X0NDUjYgKi8KKy8qKgorICAqIEBicmllZiAgR2V0IGNvbXBhcmUgdmFsdWUgKFRJTXhfQ0NSMSkgc2V0IGZvciAgb3V0cHV0IGNoYW5uZWwgMS4KKyAgKiBAbm90ZSBJbiAzMi1iaXQgdGltZXIgaW1wbGVtZW50YXRpb25zIHJldHVybmVkIGNvbXBhcmUgdmFsdWUgY2FuIGJlIGJldHdlZW4gMHgwMDAwMDAwMCBhbmQgMHhGRkZGRkZGRi4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgYSAzMiBiaXRzIGNvdW50ZXIuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0MxX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgb3V0cHV0IGNoYW5uZWwgMSBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENDUjEgICAgICAgICBDQ1IxICAgICAgICAgIExMX1RJTV9PQ19HZXRDb21wYXJlQ0gxCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBDb21wYXJlVmFsdWUgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldENvbXBhcmVDSDEoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFRJTXgtPkNDUjEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY29tcGFyZSB2YWx1ZSAoVElNeF9DQ1IyKSBzZXQgZm9yICBvdXRwdXQgY2hhbm5lbCAyLgorICAqIEBub3RlIEluIDMyLWJpdCB0aW1lciBpbXBsZW1lbnRhdGlvbnMgcmV0dXJuZWQgY29tcGFyZSB2YWx1ZSBjYW4gYmUgYmV0d2VlbiAweDAwMDAwMDAwIGFuZCAweEZGRkZGRkZGLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DQzJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBvdXRwdXQgY2hhbm5lbCAyIGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLgorICAqIEBybXRvbGwgQ0NSMiAgICAgICAgIENDUjIgICAgICAgICAgTExfVElNX09DX0dldENvbXBhcmVDSDIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIENvbXBhcmVWYWx1ZSAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fT0NfR2V0Q29tcGFyZUNIMihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+Q0NSMikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjb21wYXJlIHZhbHVlIChUSU14X0NDUjMpIHNldCBmb3IgIG91dHB1dCBjaGFubmVsIDMuCisgICogQG5vdGUgSW4gMzItYml0IHRpbWVyIGltcGxlbWVudGF0aW9ucyByZXR1cm5lZCBjb21wYXJlIHZhbHVlIGNhbiBiZSBiZXR3ZWVuIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NDM19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIG91dHB1dCBjaGFubmVsIDMgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgICogQHJtdG9sbCBDQ1IzICAgICAgICAgQ0NSMyAgICAgICAgICBMTF9USU1fT0NfR2V0Q29tcGFyZUNIMworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgQ29tcGFyZVZhbHVlIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9PQ19HZXRDb21wYXJlQ0gzKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhUSU14LT5DQ1IzKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNvbXBhcmUgdmFsdWUgKFRJTXhfQ0NSNCkgc2V0IGZvciAgb3V0cHV0IGNoYW5uZWwgNC4KKyAgKiBAbm90ZSBJbiAzMi1iaXQgdGltZXIgaW1wbGVtZW50YXRpb25zIHJldHVybmVkIGNvbXBhcmUgdmFsdWUgY2FuIGJlIGJldHdlZW4gMHgwMDAwMDAwMCBhbmQgMHhGRkZGRkZGRi4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgYSAzMiBiaXRzIGNvdW50ZXIuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0M0X0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgb3V0cHV0IGNoYW5uZWwgNCBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENDUjQgICAgICAgICBDQ1I0ICAgICAgICAgIExMX1RJTV9PQ19HZXRDb21wYXJlQ0g0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBDb21wYXJlVmFsdWUgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldENvbXBhcmVDSDQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFRJTXgtPkNDUjQpKTsKK30KKworI2lmIGRlZmluZWQoVElNX0NDUjVfQ0NSNSkKKy8qKgorICAqIEBicmllZiAgR2V0IGNvbXBhcmUgdmFsdWUgKFRJTXhfQ0NSNSkgc2V0IGZvciAgb3V0cHV0IGNoYW5uZWwgNS4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DQzVfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBvdXRwdXQgY2hhbm5lbCA1IGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLgorICAqIEBpZiBTVE0zMkYzMzR4OAorICAqIEBybXRvbGwgQ0NSNSAgICAgICAgIENDUjUgICAgICAgICAgTExfVElNX09DX0dldENvbXBhcmVDSDUKKyAgKiBAZWxzZWlmIFNUTTMyRjMwM3hDCisgICogICAgICAgICBDQ1I1ICAgICAgICAgQ0NSNSAgICAgICAgICBMTF9USU1fT0NfR2V0Q29tcGFyZUNINQorICAqIEBlbHNlaWYgU1RNMzJGMzAyeDgKKyAgKiAgICAgICAgIENDUjUgICAgICAgICBDQ1I1ICAgICAgICAgIExMX1RJTV9PQ19HZXRDb21wYXJlQ0g1CisgICogQGVuZGlmCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQG5vdGUgICBDSDUgY2hhbm5lbCBpcyBub3QgYXZhaWxhYmxlIGZvciBhbGwgRjMgZGV2aWNlcworICAqIEByZXR2YWwgQ29tcGFyZVZhbHVlIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9PQ19HZXRDb21wYXJlQ0g1KFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhUSU14LT5DQ1I1KSk7Cit9CisKKyNlbmRpZiAvKiBUSU1fQ0NSNV9DQ1I1ICovCisjaWYgZGVmaW5lZChUSU1fQ0NSNl9DQ1I2KQorLyoqCisgICogQGJyaWVmICBHZXQgY29tcGFyZSB2YWx1ZSAoVElNeF9DQ1I2KSBzZXQgZm9yICBvdXRwdXQgY2hhbm5lbCA2LgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NDNl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIG91dHB1dCBjaGFubmVsIDYgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgICogQGlmIFNUTTMyRjMzNHg4CisgICogQHJtdG9sbCBDQ1I2ICAgICAgICAgQ0NSNiAgICAgICAgICBMTF9USU1fT0NfR2V0Q29tcGFyZUNINgorICAqIEBlbHNlaWYgU1RNMzJGMzAzeEMKKyAgKiAgICAgICAgIENDUjYgICAgICAgICBDQ1I2ICAgICAgICAgIExMX1RJTV9PQ19HZXRDb21wYXJlQ0g2CisgICogQGVsc2VpZiBTVE0zMkYzMDJ4OAorICAqICAgICAgICAgQ0NSNiAgICAgICAgIENDUjYgICAgICAgICAgTExfVElNX09DX0dldENvbXBhcmVDSDYKKyAgKiBAZW5kaWYKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAbm90ZSAgIENINiBjaGFubmVsIGlzIG5vdCBhdmFpbGFibGUgZm9yIGFsbCBGMyBkZXZpY2VzCisgICogQHJldHZhbCBDb21wYXJlVmFsdWUgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldENvbXBhcmVDSDYoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFRJTXgtPkNDUjYpKTsKK30KKworI2VuZGlmIC8qIFRJTV9DQ1I2X0NDUjYgKi8KKyNpZiBkZWZpbmVkKFRJTV9DQ1I1X0NDUjUpCisvKioKKyAgKiBAYnJpZWYgIFNlbGVjdCBvbiB3aGljaCByZWZlcmVuY2Ugc2lnbmFsIHRoZSBPQzVSRUYgaXMgY29tYmluZWQgdG8uCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ09NQklORUQzUEhBU0VQV01fSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIHRoZSBjb21iaW5lZCAzLXBoYXNlIFBXTSBtb2RlLgorICAqIEBpZiBTVE0zMkYzMzR4OAorICAqIEBybXRvbGwgQ0NSNSAgICAgICAgIEdDNUMzICAgICAgICAgIExMX1RJTV9TZXRDSDVDb21iaW5lZENoYW5uZWxzXG4KKyAgKiAgICAgICAgIENDUjUgICAgICAgICBHQzVDMiAgICAgICAgICBMTF9USU1fU2V0Q0g1Q29tYmluZWRDaGFubmVsc1xuCisgICogICAgICAgICBDQ1I1ICAgICAgICAgR0M1QzEgICAgICAgICAgTExfVElNX1NldENINUNvbWJpbmVkQ2hhbm5lbHMKKyAgKiBAZWxzZWlmIFNUTTMyRjMwM3hDCisgICogICAgICAgICBDQ1I1ICAgICAgICAgR0M1QzMgICAgICAgICAgTExfVElNX1NldENINUNvbWJpbmVkQ2hhbm5lbHNcbgorICAqICAgICAgICAgQ0NSNSAgICAgICAgIEdDNUMyICAgICAgICAgIExMX1RJTV9TZXRDSDVDb21iaW5lZENoYW5uZWxzXG4KKyAgKiAgICAgICAgIENDUjUgICAgICAgICBHQzVDMSAgICAgICAgICBMTF9USU1fU2V0Q0g1Q29tYmluZWRDaGFubmVscworICAqIEBlbHNlaWYgU1RNMzJGMzAyeDgKKyAgKiAgICAgICAgIENDUjUgICAgICAgICBHQzVDMyAgICAgICAgICBMTF9USU1fU2V0Q0g1Q29tYmluZWRDaGFubmVsc1xuCisgICogICAgICAgICBDQ1I1ICAgICAgICAgR0M1QzIgICAgICAgICAgTExfVElNX1NldENINUNvbWJpbmVkQ2hhbm5lbHNcbgorICAqICAgICAgICAgQ0NSNSAgICAgICAgIEdDNUMxICAgICAgICAgIExMX1RJTV9TZXRDSDVDb21iaW5lZENoYW5uZWxzCisgICogQGVuZGlmCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBHcm91cENINSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9HUk9VUENINV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0dST1VQQ0g1X09DMVJFRkMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fR1JPVVBDSDVfT0MyUkVGQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9HUk9VUENINV9PQzNSRUZDCisgICogQG5vdGUgICBDSDUgY2hhbm5lbCBpcyBub3QgYXZhaWxhYmxlIGZvciBhbGwgRjMgZGV2aWNlcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldENINUNvbWJpbmVkQ2hhbm5lbHMoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IEdyb3VwQ0g1KQoreworICBNT0RJRllfUkVHKFRJTXgtPkNDUjUsIFRJTV9DQ1I1X0NDUjUsIEdyb3VwQ0g1KTsKK30KKworI2VuZGlmIC8qIFRJTV9DQ1I1X0NDUjUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX0lucHV0X0NoYW5uZWwgSW5wdXQgY2hhbm5lbCBjb25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIGlucHV0IGNoYW5uZWwuCisgICogQHJtdG9sbCBDQ01SMSAgICAgICAgQ0MxUyAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBJQzFQU0MgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIElDMUYgICAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgICogICAgICAgICBDQ01SMSAgICAgICAgQ0MyUyAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBJQzJQU0MgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIElDMkYgICAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgICogICAgICAgICBDQ01SMiAgICAgICAgQ0MzUyAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBJQzNQU0MgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIElDM0YgICAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgICogICAgICAgICBDQ01SMiAgICAgICAgQ0M0UyAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBJQzRQU0MgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIElDNEYgICAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MxUCAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzFOUCAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMlAgICAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyTlAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzNQICAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM05QICAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M0UCAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzROUCAgICAgICAgIExMX1RJTV9JQ19Db25maWcKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiBAcGFyYW0gIENvbmZpZ3VyYXRpb24gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIGNvbWJpbmF0aW9uIG9mIGFsbCB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQUNUSVZFSU5QVVRfRElSRUNUVEkgb3IgQHJlZiBMTF9USU1fQUNUSVZFSU5QVVRfSU5ESVJFQ1RUSSBvciBAcmVmIExMX1RJTV9BQ1RJVkVJTlBVVF9UUkMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNQU0NfRElWMSBvciAuLi4gb3IgQHJlZiBMTF9USU1fSUNQU0NfRElWOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjEgb3IgLi4uIG9yIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMzJfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfUE9MQVJJVFlfUklTSU5HIG9yIEByZWYgTExfVElNX0lDX1BPTEFSSVRZX0ZBTExJTkcgb3IgQHJlZiBMTF9USU1fSUNfUE9MQVJJVFlfQk9USEVER0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9JQ19Db25maWcoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IENvbmZpZ3VyYXRpb24pCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIE1PRElGWV9SRUcoKnBSZWcsICgoVElNX0NDTVIxX0lDMUYgfCBUSU1fQ0NNUjFfSUMxUFNDIHwgVElNX0NDTVIxX0NDMVMpIDw8IFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSksCisgICAgICAgICAgICAgKChDb25maWd1cmF0aW9uID4+IDE2VSkgJiAoVElNX0NDTVIxX0lDMUYgfCBUSU1fQ0NNUjFfSUMxUFNDIHwgVElNX0NDTVIxX0NDMVMpKSAgPDwgU0hJRlRfVEFCX0lDeHhbaUNoYW5uZWxdKTsKKyAgTU9ESUZZX1JFRyhUSU14LT5DQ0VSLCAoKFRJTV9DQ0VSX0NDMU5QIHwgVElNX0NDRVJfQ0MxUCkgPDwgU0hJRlRfVEFCX0NDeFBbaUNoYW5uZWxdKSwKKyAgICAgICAgICAgICAoQ29uZmlndXJhdGlvbiAmIChUSU1fQ0NFUl9DQzFOUCB8IFRJTV9DQ0VSX0NDMVApKSA8PCBTSElGVF9UQUJfQ0N4UFtpQ2hhbm5lbF0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgYWN0aXZlIGlucHV0LgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIENDMVMgICAgICAgICAgTExfVElNX0lDX1NldEFjdGl2ZUlucHV0XG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBDQzJTICAgICAgICAgIExMX1RJTV9JQ19TZXRBY3RpdmVJbnB1dFxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgQ0MzUyAgICAgICAgICBMTF9USU1fSUNfU2V0QWN0aXZlSW5wdXRcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIENDNFMgICAgICAgICAgTExfVElNX0lDX1NldEFjdGl2ZUlucHV0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogQHBhcmFtICBJQ0FjdGl2ZUlucHV0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0FDVElWRUlOUFVUX0RJUkVDVFRJCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0FDVElWRUlOUFVUX0lORElSRUNUVEkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQUNUSVZFSU5QVVRfVFJDCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fSUNfU2V0QWN0aXZlSW5wdXQoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IElDQWN0aXZlSW5wdXQpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIE1PRElGWV9SRUcoKnBSZWcsICgoVElNX0NDTVIxX0NDMVMpIDw8IFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSksIChJQ0FjdGl2ZUlucHV0ID4+IDE2VSkgPDwgU0hJRlRfVEFCX0lDeHhbaUNoYW5uZWxdKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGN1cnJlbnQgYWN0aXZlIGlucHV0LgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIENDMVMgICAgICAgICAgTExfVElNX0lDX0dldEFjdGl2ZUlucHV0XG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBDQzJTICAgICAgICAgIExMX1RJTV9JQ19HZXRBY3RpdmVJbnB1dFxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgQ0MzUyAgICAgICAgICBMTF9USU1fSUNfR2V0QWN0aXZlSW5wdXRcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIENDNFMgICAgICAgICAgTExfVElNX0lDX0dldEFjdGl2ZUlucHV0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9BQ1RJVkVJTlBVVF9ESVJFQ1RUSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9BQ1RJVkVJTlBVVF9JTkRJUkVDVFRJCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0FDVElWRUlOUFVUX1RSQworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9JQ19HZXRBY3RpdmVJbnB1dChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoKnBSZWcsICgoVElNX0NDTVIxX0NDMVMpIDw8IFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSkpID4+IFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSkgPDwgMTZVKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHByZXNjYWxlciBvZiBpbnB1dCBjaGFubmVsLgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIElDMVBTQyAgICAgICAgTExfVElNX0lDX1NldFByZXNjYWxlclxuCisgICogICAgICAgICBDQ01SMSAgICAgICAgSUMyUFNDICAgICAgICBMTF9USU1fSUNfU2V0UHJlc2NhbGVyXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBJQzNQU0MgICAgICAgIExMX1RJTV9JQ19TZXRQcmVzY2FsZXJcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIElDNFBTQyAgICAgICAgTExfVElNX0lDX1NldFByZXNjYWxlcgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqIEBwYXJhbSAgSUNQcmVzY2FsZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNQU0NfRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ1BTQ19ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDUFNDX0RJVjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNQU0NfRElWOAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0lDX1NldFByZXNjYWxlcihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgSUNQcmVzY2FsZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIE1PRElGWV9SRUcoKnBSZWcsICgoVElNX0NDTVIxX0lDMVBTQykgPDwgU0hJRlRfVEFCX0lDeHhbaUNoYW5uZWxdKSwgKElDUHJlc2NhbGVyID4+IDE2VSkgPDwgU0hJRlRfVEFCX0lDeHhbaUNoYW5uZWxdKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGN1cnJlbnQgcHJlc2NhbGVyIHZhbHVlIGFjdGluZyBvbiBhbiAgaW5wdXQgY2hhbm5lbC4KKyAgKiBAcm10b2xsIENDTVIxICAgICAgICBJQzFQU0MgICAgICAgIExMX1RJTV9JQ19HZXRQcmVzY2FsZXJcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIElDMlBTQyAgICAgICAgTExfVElNX0lDX0dldFByZXNjYWxlclxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgSUMzUFNDICAgICAgICBMTF9USU1fSUNfR2V0UHJlc2NhbGVyXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBJQzRQU0MgICAgICAgIExMX1RJTV9JQ19HZXRQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDUFNDX0RJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNQU0NfRElWMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ1BTQ19ESVY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDUFNDX0RJVjgKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSUNfR2V0UHJlc2NhbGVyKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOworICByZXR1cm4gKChSRUFEX0JJVCgqcFJlZywgKChUSU1fQ0NNUjFfSUMxUFNDKSA8PCBTSElGVF9UQUJfSUN4eFtpQ2hhbm5lbF0pKSA+PiBTSElGVF9UQUJfSUN4eFtpQ2hhbm5lbF0pIDw8IDE2VSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBpbnB1dCBmaWx0ZXIgZHVyYXRpb24uCisgICogQHJtdG9sbCBDQ01SMSAgICAgICAgSUMxRiAgICAgICAgICBMTF9USU1fSUNfU2V0RmlsdGVyXG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBJQzJGICAgICAgICAgIExMX1RJTV9JQ19TZXRGaWx0ZXJcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIElDM0YgICAgICAgICAgTExfVElNX0lDX1NldEZpbHRlclxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgSUM0RiAgICAgICAgICBMTF9USU1fSUNfU2V0RmlsdGVyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogQHBhcmFtICBJQ0ZpbHRlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYxX04yCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMV9ONAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjFfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYyX042CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMl9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjRfTjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVY0X044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWOF9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjhfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYxNl9ONQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjE2X042CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMTZfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYzMl9ONQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjMyX042CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMzJfTjgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9JQ19TZXRGaWx0ZXIoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IElDRmlsdGVyKQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOworICBNT0RJRllfUkVHKCpwUmVnLCAoKFRJTV9DQ01SMV9JQzFGKSA8PCBTSElGVF9UQUJfSUN4eFtpQ2hhbm5lbF0pLCAoSUNGaWx0ZXIgPj4gMTZVKSA8PCBTSElGVF9UQUJfSUN4eFtpQ2hhbm5lbF0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgaW5wdXQgZmlsdGVyIGR1cmF0aW9uLgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIElDMUYgICAgICAgICAgTExfVElNX0lDX0dldEZpbHRlclxuCisgICogICAgICAgICBDQ01SMSAgICAgICAgSUMyRiAgICAgICAgICBMTF9USU1fSUNfR2V0RmlsdGVyXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBJQzNGICAgICAgICAgIExMX1RJTV9JQ19HZXRGaWx0ZXJcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIElDNEYgICAgICAgICAgTExfVElNX0lDX0dldEZpbHRlcgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMV9OMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjFfTjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYxX044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMl9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjJfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVY0X042CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWNF9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjhfTjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVY4X044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMTZfTjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYxNl9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjE2X044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMzJfTjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYzMl9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjMyX044CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lDX0dldEZpbHRlcihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoKnBSZWcsICgoVElNX0NDTVIxX0lDMUYpIDw8IFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSkpID4+IFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSkgPDwgMTZVKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGlucHV0IGNoYW5uZWwgcG9sYXJpdHkuCisgICogQHJtdG9sbCBDQ0VSICAgICAgICAgQ0MxUCAgICAgICAgICBMTF9USU1fSUNfU2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMU5QICAgICAgICAgTExfVElNX0lDX1NldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzJQICAgICAgICAgIExMX1RJTV9JQ19TZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyTlAgICAgICAgICBMTF9USU1fSUNfU2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM1AgICAgICAgICAgTExfVElNX0lDX1NldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzNOUCAgICAgICAgIExMX1RJTV9JQ19TZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M0UCAgICAgICAgICBMTF9USU1fSUNfU2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNE5QICAgICAgICAgTExfVElNX0lDX1NldFBvbGFyaXR5CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogQHBhcmFtICBJQ1BvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX1BPTEFSSVRZX1JJU0lORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19QT0xBUklUWV9GQUxMSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX1BPTEFSSVRZX0JPVEhFREdFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fSUNfU2V0UG9sYXJpdHkoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IElDUG9sYXJpdHkpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIE1PRElGWV9SRUcoVElNeC0+Q0NFUiwgKChUSU1fQ0NFUl9DQzFOUCB8IFRJTV9DQ0VSX0NDMVApIDw8IFNISUZUX1RBQl9DQ3hQW2lDaGFubmVsXSksCisgICAgICAgICAgICAgSUNQb2xhcml0eSA8PCBTSElGVF9UQUJfQ0N4UFtpQ2hhbm5lbF0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgY3VycmVudCBpbnB1dCBjaGFubmVsIHBvbGFyaXR5LgorICAqIEBybXRvbGwgQ0NFUiAgICAgICAgIENDMVAgICAgICAgICAgTExfVElNX0lDX0dldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzFOUCAgICAgICAgIExMX1RJTV9JQ19HZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyUCAgICAgICAgICBMTF9USU1fSUNfR2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMk5QICAgICAgICAgTExfVElNX0lDX0dldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzNQICAgICAgICAgIExMX1RJTV9JQ19HZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzTlAgICAgICAgICBMTF9USU1fSUNfR2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNFAgICAgICAgICAgTExfVElNX0lDX0dldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzROUCAgICAgICAgIExMX1RJTV9JQ19HZXRQb2xhcml0eQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfUE9MQVJJVFlfUklTSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX1BPTEFSSVRZX0ZBTExJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfUE9MQVJJVFlfQk9USEVER0UKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSUNfR2V0UG9sYXJpdHkoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJldHVybiAoUkVBRF9CSVQoVElNeC0+Q0NFUiwgKChUSU1fQ0NFUl9DQzFOUCB8IFRJTV9DQ0VSX0NDMVApIDw8IFNISUZUX1RBQl9DQ3hQW2lDaGFubmVsXSkpID4+CisgICAgICAgICAgU0hJRlRfVEFCX0NDeFBbaUNoYW5uZWxdKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25uZWN0IHRoZSBUSU14X0NIMSwgQ0gyIGFuZCBDSDMgcGlucyAgdG8gdGhlIFRJMSBpbnB1dCAoWE9SIGNvbWJpbmF0aW9uKS4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9YT1JfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGFuIFhPUiBpbnB1dC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBUSTFTICAgICAgICAgIExMX1RJTV9JQ19FbmFibGVYT1JDb21iaW5hdGlvbgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0lDX0VuYWJsZVhPUkNvbWJpbmF0aW9uKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkNSMiwgVElNX0NSMl9USTFTKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNjb25uZWN0IHRoZSBUSU14X0NIMSwgQ0gyIGFuZCBDSDMgcGlucyAgZnJvbSB0aGUgVEkxIGlucHV0LgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX1hPUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYW4gWE9SIGlucHV0LgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRJMVMgICAgICAgICAgTExfVElNX0lDX0Rpc2FibGVYT1JDb21iaW5hdGlvbgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0lDX0Rpc2FibGVYT1JDb21iaW5hdGlvbihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkNSMiwgVElNX0NSMl9USTFTKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgVElNeF9DSDEsIENIMiBhbmQgQ0gzIHBpbnMgYXJlIGNvbm5lY3RlY3RlZCB0byB0aGUgVEkxIGlucHV0LgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX1hPUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYW4gWE9SIGlucHV0LgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRJMVMgICAgICAgICAgTExfVElNX0lDX0lzRW5hYmxlZFhPUkNvbWJpbmF0aW9uCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lDX0lzRW5hYmxlZFhPUkNvbWJpbmF0aW9uKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKFJFQURfQklUKFRJTXgtPkNSMiwgVElNX0NSMl9USTFTKSA9PSAoVElNX0NSMl9USTFTKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNhcHR1cmVkIHZhbHVlIGZvciBpbnB1dCBjaGFubmVsIDEuCisgICogQG5vdGUgSW4gMzItYml0IHRpbWVyIGltcGxlbWVudGF0aW9ucyByZXR1cm5lZCBjYXB0dXJlZCB2YWx1ZSBjYW4gYmUgYmV0d2VlbiAweDAwMDAwMDAwIGFuZCAweEZGRkZGRkZGLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DQzFfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBpbnB1dCBjaGFubmVsIDEgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgICogQHJtdG9sbCBDQ1IxICAgICAgICAgQ0NSMSAgICAgICAgICBMTF9USU1fSUNfR2V0Q2FwdHVyZUNIMQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgQ2FwdHVyZWRWYWx1ZSAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSUNfR2V0Q2FwdHVyZUNIMShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+Q0NSMSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjYXB0dXJlZCB2YWx1ZSBmb3IgaW5wdXQgY2hhbm5lbCAyLgorICAqIEBub3RlIEluIDMyLWJpdCB0aW1lciBpbXBsZW1lbnRhdGlvbnMgcmV0dXJuZWQgY2FwdHVyZWQgdmFsdWUgY2FuIGJlIGJldHdlZW4gMHgwMDAwMDAwMCBhbmQgMHhGRkZGRkZGRi4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgYSAzMiBiaXRzIGNvdW50ZXIuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0MyX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgaW5wdXQgY2hhbm5lbCAyIGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLgorICAqIEBybXRvbGwgQ0NSMiAgICAgICAgIENDUjIgICAgICAgICAgTExfVElNX0lDX0dldENhcHR1cmVDSDIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIENhcHR1cmVkVmFsdWUgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lDX0dldENhcHR1cmVDSDIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFRJTXgtPkNDUjIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY2FwdHVyZWQgdmFsdWUgZm9yIGlucHV0IGNoYW5uZWwgMy4KKyAgKiBAbm90ZSBJbiAzMi1iaXQgdGltZXIgaW1wbGVtZW50YXRpb25zIHJldHVybmVkIGNhcHR1cmVkIHZhbHVlIGNhbiBiZSBiZXR3ZWVuIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NDM19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGlucHV0IGNoYW5uZWwgMyBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENDUjMgICAgICAgICBDQ1IzICAgICAgICAgIExMX1RJTV9JQ19HZXRDYXB0dXJlQ0gzCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBDYXB0dXJlZFZhbHVlIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9JQ19HZXRDYXB0dXJlQ0gzKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhUSU14LT5DQ1IzKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNhcHR1cmVkIHZhbHVlIGZvciBpbnB1dCBjaGFubmVsIDQuCisgICogQG5vdGUgSW4gMzItYml0IHRpbWVyIGltcGxlbWVudGF0aW9ucyByZXR1cm5lZCBjYXB0dXJlZCB2YWx1ZSBjYW4gYmUgYmV0d2VlbiAweDAwMDAwMDAwIGFuZCAweEZGRkZGRkZGLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DQzRfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBpbnB1dCBjaGFubmVsIDQgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgICogQHJtdG9sbCBDQ1I0ICAgICAgICAgQ0NSNCAgICAgICAgICBMTF9USU1fSUNfR2V0Q2FwdHVyZUNINAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgQ2FwdHVyZWRWYWx1ZSAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSUNfR2V0Q2FwdHVyZUNINChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+Q0NSNCkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9DbG9ja19TZWxlY3Rpb24gQ291bnRlciBjbG9jayBzZWxlY3Rpb24KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBFbmFibGUgZXh0ZXJuYWwgY2xvY2sgbW9kZSAyLgorICAqIEBub3RlIFdoZW4gZXh0ZXJuYWwgY2xvY2sgbW9kZSAyIGlzIGVuYWJsZWQgdGhlIGNvdW50ZXIgaXMgY2xvY2tlZCBieSBhbnkgYWN0aXZlIGVkZ2Ugb24gdGhlIEVUUkYgc2lnbmFsLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NMT0NLU09VUkNFX0VUUk1PREUyX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBleHRlcm5hbCBjbG9jayBtb2RlMi4KKyAgKiBAcm10b2xsIFNNQ1IgICAgICAgICBFQ0UgICAgICAgICAgIExMX1RJTV9FbmFibGVFeHRlcm5hbENsb2NrCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlRXh0ZXJuYWxDbG9jayhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5TTUNSLCBUSU1fU01DUl9FQ0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgZXh0ZXJuYWwgY2xvY2sgbW9kZSAyLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NMT0NLU09VUkNFX0VUUk1PREUyX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBleHRlcm5hbCBjbG9jayBtb2RlMi4KKyAgKiBAcm10b2xsIFNNQ1IgICAgICAgICBFQ0UgICAgICAgICAgIExMX1RJTV9EaXNhYmxlRXh0ZXJuYWxDbG9jaworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVFeHRlcm5hbENsb2NrKFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+U01DUiwgVElNX1NNQ1JfRUNFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIGV4dGVybmFsIGNsb2NrIG1vZGUgMiBpcyBlbmFibGVkLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NMT0NLU09VUkNFX0VUUk1PREUyX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBleHRlcm5hbCBjbG9jayBtb2RlMi4KKyAgKiBAcm10b2xsIFNNQ1IgICAgICAgICBFQ0UgICAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRFeHRlcm5hbENsb2NrCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZEV4dGVybmFsQ2xvY2soVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVElNeC0+U01DUiwgVElNX1NNQ1JfRUNFKSA9PSAoVElNX1NNQ1JfRUNFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBjbG9jayBzb3VyY2Ugb2YgdGhlIGNvdW50ZXIgY2xvY2suCisgICogQG5vdGUgd2hlbiBzZWxlY3RlZCBjbG9jayBzb3VyY2UgaXMgZXh0ZXJuYWwgY2xvY2sgbW9kZSAxLCB0aGUgdGltZXIgaW5wdXQKKyAgKiAgICAgICB0aGUgZXh0ZXJuYWwgY2xvY2sgaXMgYXBwbGllZCBpcyBzZWxlY3RlZCBieSBjYWxsaW5nIHRoZSBAcmVmIExMX1RJTV9TZXRUcmlnZ2VySW5wdXQoKQorICAqICAgICAgIGZ1bmN0aW9uLiBUaGlzIHRpbWVyIGlucHV0IG11c3QgYmUgY29uZmlndXJlZCBieSBjYWxsaW5nCisgICogICAgICAgdGhlIEByZWYgTExfVElNX0lDX0NvbmZpZygpIGZ1bmN0aW9uLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NMT0NLU09VUkNFX0VUUk1PREUxX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBleHRlcm5hbCBjbG9jayBtb2RlMS4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgZXh0ZXJuYWwgY2xvY2sgbW9kZTIuCisgICogQHJtdG9sbCBTTUNSICAgICAgICAgU01TICAgICAgICAgICBMTF9USU1fU2V0Q2xvY2tTb3VyY2VcbgorICAqICAgICAgICAgU01DUiAgICAgICAgIEVDRSAgICAgICAgICAgTExfVElNX1NldENsb2NrU291cmNlCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDbG9ja1NvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS1NPVVJDRV9FWFRfTU9ERTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0xPQ0tTT1VSQ0VfRVhUX01PREUyCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0Q2xvY2tTb3VyY2UoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENsb2NrU291cmNlKQoreworICBNT0RJRllfUkVHKFRJTXgtPlNNQ1IsIFRJTV9TTUNSX1NNUyB8IFRJTV9TTUNSX0VDRSwgQ2xvY2tTb3VyY2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgZW5jb2RlciBpbnRlcmZhY2UgbW9kZS4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9FTkNPREVSX0lOVEVSRkFDRV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgdGhlIGVuY29kZXIgbW9kZS4KKyAgKiBAcm10b2xsIFNNQ1IgICAgICAgICBTTVMgICAgICAgICAgIExMX1RJTV9TZXRFbmNvZGVyTW9kZQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgRW5jb2Rlck1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRU5DT0RFUk1PREVfWDJfVEkxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VOQ09ERVJNT0RFX1gyX1RJMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FTkNPREVSTU9ERV9YNF9USTEyCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0RW5jb2Rlck1vZGUoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IEVuY29kZXJNb2RlKQoreworICBNT0RJRllfUkVHKFRJTXgtPlNNQ1IsIFRJTV9TTUNSX1NNUywgRW5jb2Rlck1vZGUpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9UaW1lcl9TeW5jaHJvbml6YXRpb24gVGltZXIgc3luY2hyb25pc2F0aW9uIGNvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHRyaWdnZXIgb3V0cHV0IChUUkdPKSB1c2VkIGZvciB0aW1lciBzeW5jaHJvbml6YXRpb24gLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX01BU1RFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgY2FuIG9wZXJhdGUgYXMgYSBtYXN0ZXIgdGltZXIuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTU1TICAgICAgICAgICBMTF9USU1fU2V0VHJpZ2dlck91dHB1dAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZXJTeW5jaHJvbml6YXRpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHT19SRVNFVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPX0VOQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPX1VQREFURQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPX0NDMUlGCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR09fT0MxUkVGCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR09fT0MyUkVGCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR09fT0MzUkVGCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR09fT0M0UkVGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0VHJpZ2dlck91dHB1dChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVGltZXJTeW5jaHJvbml6YXRpb24pCit7CisgIE1PRElGWV9SRUcoVElNeC0+Q1IyLCBUSU1fQ1IyX01NUywgVGltZXJTeW5jaHJvbml6YXRpb24pOworfQorCisjaWYgICBkZWZpbmVkKFRJTV9DUjJfTU1TMikKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSB0cmlnZ2VyIG91dHB1dCAyIChUUkdPMikgdXNlZCBmb3IgQURDIHN5bmNocm9uaXphdGlvbiAuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fVFJHTzJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIGNhbiBiZSB1c2VkIGZvciBBREMgc3luY2hyb25pemF0aW9uLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIE1NUzIgICAgICAgICAgTExfVElNX1NldFRyaWdnZXJPdXRwdXQyCisgICogQHBhcmFtICBUSU14IFRpbWVyIEluc3RhbmNlCisgICogQHBhcmFtICBBRENTeW5jaHJvbml6YXRpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHTzJfUkVTRVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHTzJfRU5BQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX1VQREFURQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPMl9DQzFGCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPMl9PQzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHTzJfT0MzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPMl9PQzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHTzJfT0M2CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DNF9SSVNJTkdGQUxMSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DNl9SSVNJTkdGQUxMSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DNF9SSVNJTkdfT0M2X1JJU0lORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPMl9PQzRfUklTSU5HX09DNl9GQUxMSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DNV9SSVNJTkdfT0M2X1JJU0lORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPMl9PQzVfUklTSU5HX09DNl9GQUxMSU5HCisgICogQG5vdGUgICBPQzUgYW5kIE9DNiBhcmUgbm90IGF2YWlsYWJsZSBmb3IgYWxsIEYzIGRldmljZXMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRUcmlnZ2VyT3V0cHV0MihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQURDU3luY2hyb25pemF0aW9uKQoreworICBNT0RJRllfUkVHKFRJTXgtPkNSMiwgVElNX0NSMl9NTVMyLCBBRENTeW5jaHJvbml6YXRpb24pOworfQorCisjZW5kaWYgLyogVElNX0NSMl9NTVMyICovCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgc3luY2hyb25pemF0aW9uIG1vZGUgb2YgYSBzbGF2ZSB0aW1lci4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9TTEFWRV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgY2FuIG9wZXJhdGUgYXMgYSBzbGF2ZSB0aW1lci4KKyAgKiBAcm10b2xsIFNNQ1IgICAgICAgICBTTVMgICAgICAgICAgIExMX1RJTV9TZXRTbGF2ZU1vZGUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFNsYXZlTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9TTEFWRU1PREVfRElTQUJMRUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fU0xBVkVNT0RFX1JFU0VUCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1NMQVZFTU9ERV9HQVRFRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9TTEFWRU1PREVfVFJJR0dFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9TTEFWRU1PREVfQ09NQklORURfUkVTRVRUUklHR0VSCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0U2xhdmVNb2RlKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBTbGF2ZU1vZGUpCit7CisgIE1PRElGWV9SRUcoVElNeC0+U01DUiwgVElNX1NNQ1JfU01TLCBTbGF2ZU1vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgc2VsZWN0cyB0aGUgdHJpZ2dlciBpbnB1dCB0byBiZSB1c2VkIHRvIHN5bmNocm9uaXplIHRoZSBjb3VudGVyLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX1NMQVZFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBjYW4gb3BlcmF0ZSBhcyBhIHNsYXZlIHRpbWVyLgorICAqIEBybXRvbGwgU01DUiAgICAgICAgIFRTICAgICAgICAgICAgTExfVElNX1NldFRyaWdnZXJJbnB1dAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVHJpZ2dlcklucHV0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RTX0lUUjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFNfSVRSMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UU19JVFIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RTX0lUUjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFNfVEkxRl9FRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UU19USTFGUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFNfVEkyRlAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RTX0VUUkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRUcmlnZ2VySW5wdXQoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRyaWdnZXJJbnB1dCkKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5TTUNSLCBUSU1fU01DUl9UUywgVHJpZ2dlcklucHV0KTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIE1hc3Rlci9TbGF2ZSBtb2RlLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX1NMQVZFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBjYW4gb3BlcmF0ZSBhcyBhIHNsYXZlIHRpbWVyLgorICAqIEBybXRvbGwgU01DUiAgICAgICAgIE1TTSAgICAgICAgICAgTExfVElNX0VuYWJsZU1hc3RlclNsYXZlTW9kZQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZU1hc3RlclNsYXZlTW9kZShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5TTUNSLCBUSU1fU01DUl9NU00pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIE1hc3Rlci9TbGF2ZSBtb2RlLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX1NMQVZFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBjYW4gb3BlcmF0ZSBhcyBhIHNsYXZlIHRpbWVyLgorICAqIEBybXRvbGwgU01DUiAgICAgICAgIE1TTSAgICAgICAgICAgTExfVElNX0Rpc2FibGVNYXN0ZXJTbGF2ZU1vZGUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlTWFzdGVyU2xhdmVNb2RlKFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+U01DUiwgVElNX1NNQ1JfTVNNKTsKK30KKworLyoqCisgICogQGJyaWVmIEluZGljYXRlcyB3aGV0aGVyIHRoZSBNYXN0ZXIvU2xhdmUgbW9kZSBpcyBlbmFibGVkLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX1NMQVZFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogYSB0aW1lciBpbnN0YW5jZSBjYW4gb3BlcmF0ZSBhcyBhIHNsYXZlIHRpbWVyLgorICAqIEBybXRvbGwgU01DUiAgICAgICAgIE1TTSAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZE1hc3RlclNsYXZlTW9kZQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRNYXN0ZXJTbGF2ZU1vZGUoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVElNeC0+U01DUiwgVElNX1NNQ1JfTVNNKSA9PSAoVElNX1NNQ1JfTVNNKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBleHRlcm5hbCB0cmlnZ2VyIChFVFIpIGlucHV0LgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0VUUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYW4gZXh0ZXJuYWwgdHJpZ2dlciBpbnB1dC4KKyAgKiBAcm10b2xsIFNNQ1IgICAgICAgICBFVFAgICAgICAgICAgIExMX1RJTV9Db25maWdFVFJcbgorICAqICAgICAgICAgU01DUiAgICAgICAgIEVUUFMgICAgICAgICAgTExfVElNX0NvbmZpZ0VUUlxuCisgICogICAgICAgICBTTUNSICAgICAgICAgRVRGICAgICAgICAgICBMTF9USU1fQ29uZmlnRVRSCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBFVFJQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfUE9MQVJJVFlfTk9OSU5WRVJURUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX1BPTEFSSVRZX0lOVkVSVEVECisgICogQHBhcmFtICBFVFJQcmVzY2FsZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX1BSRVNDQUxFUl9ESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9QUkVTQ0FMRVJfRElWMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfUFJFU0NBTEVSX0RJVjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX1BSRVNDQUxFUl9ESVY4CisgICogQHBhcmFtICBFVFJGaWx0ZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVYxX04yCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9GSUxURVJfRkRJVjFfTjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMV9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVYyX042CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9GSUxURVJfRkRJVjJfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWNF9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVY0X044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9GSUxURVJfRkRJVjhfTjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWOF9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVYxNl9ONQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVYxNl9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVYxNl9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVYzMl9ONQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVYzMl9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVYzMl9OOAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NvbmZpZ0VUUihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgRVRSUG9sYXJpdHksIHVpbnQzMl90IEVUUlByZXNjYWxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRVRSRmlsdGVyKQoreworICBNT0RJRllfUkVHKFRJTXgtPlNNQ1IsIFRJTV9TTUNSX0VUUCB8IFRJTV9TTUNSX0VUUFMgfCBUSU1fU01DUl9FVEYsIEVUUlBvbGFyaXR5IHwgRVRSUHJlc2NhbGVyIHwgRVRSRmlsdGVyKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUZfQnJlYWtfRnVuY3Rpb24gQnJlYWsgZnVuY3Rpb24gY29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgYnJlYWsgZnVuY3Rpb24uCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGEgYnJlYWsgaW5wdXQuCisgICogQHJtdG9sbCBCRFRSICAgICAgICAgQktFICAgICAgICAgICBMTF9USU1fRW5hYmxlQlJLCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlQlJLKFRJTV9UeXBlRGVmICpUSU14KQoreworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgCisKKyAgU0VUX0JJVChUSU14LT5CRFRSLCBUSU1fQkRUUl9CS0UpOworCisgIC8qIE5vdGU6IEFueSB3cml0ZSBvcGVyYXRpb24gdG8gdGhpcyBiaXQgdGFrZXMgYSBkZWxheSBvZiAxIEFQQiBjbG9jayBjeWNsZSB0byBiZWNvbWUgZWZmZWN0aXZlLiAqLworICB0bXByZWcgPSBSRUFEX1JFRyhUSU14LT5CRFRSKTsKKyAgKHZvaWQpKHRtcHJlZyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgYnJlYWsgZnVuY3Rpb24uCisgICogQHJtdG9sbCBCRFRSICAgICAgICAgQktFICAgICAgICAgICBMTF9USU1fRGlzYWJsZUJSSworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIGJyZWFrIGlucHV0LgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVCUksoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworCisgIENMRUFSX0JJVChUSU14LT5CRFRSLCBUSU1fQkRUUl9CS0UpOworCisgIC8qIE5vdGU6IEFueSB3cml0ZSBvcGVyYXRpb24gdG8gdGhpcyBiaXQgdGFrZXMgYSBkZWxheSBvZiAxIEFQQiBjbG9jayBjeWNsZSB0byBiZWNvbWUgZWZmZWN0aXZlLiAqLworICB0bXByZWcgPSBSRUFEX1JFRyhUSU14LT5CRFRSKTsKKyAgKHZvaWQpKHRtcHJlZyk7Cit9CisKKyNpZiBkZWZpbmVkKFRJTV9CRFRSX0JLRikKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBicmVhayBpbnB1dC4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBicmVhayBpbnB1dC4KKyAgKiBAcm10b2xsIEJEVFIgICAgICAgICBCS1AgICAgICAgICAgIExMX1RJTV9Db25maWdCUktcbgorICAqICAgICAgICAgQkRUUiAgICAgICAgIEJLRiAgICAgICAgICAgTExfVElNX0NvbmZpZ0JSSworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQnJlYWtQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19QT0xBUklUWV9MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfUE9MQVJJVFlfSElHSAorICAqIEBwYXJhbSAgQnJlYWtGaWx0ZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMV9OMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjFfTjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxX044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMl9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjJfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVY0X042CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWNF9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjhfTjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVY4X044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMTZfTjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxNl9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjE2X044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMzJfTjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYzMl9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjMyX044CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ29uZmlnQlJLKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBCcmVha1BvbGFyaXR5LCB1aW50MzJfdCBCcmVha0ZpbHRlcikKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5CRFRSLCBUSU1fQkRUUl9CS1AgfCBUSU1fQkRUUl9CS0YsIEJyZWFrUG9sYXJpdHkgfCBCcmVha0ZpbHRlcik7Cit9CisKKyNlbHNlCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgYnJlYWsgaW5wdXQuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGEgYnJlYWsgaW5wdXQuCisgICogQHJtdG9sbCBCRFRSICAgICAgICAgQktQICAgICAgICAgICBMTF9USU1fQ29uZmlnQlJLCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBCcmVha1BvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX1BPTEFSSVRZX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19QT0xBUklUWV9ISUdICisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ29uZmlnQlJLKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBCcmVha1BvbGFyaXR5KQoreworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKworICBNT0RJRllfUkVHKFRJTXgtPkJEVFIsIFRJTV9CRFRSX0JLUCwgQnJlYWtQb2xhcml0eSk7CisKKyAgLyogTm90ZTogQW55IHdyaXRlIG9wZXJhdGlvbiB0byB0aGlzIGJpdCB0YWtlcyBhIGRlbGF5IG9mIDEgQVBCIGNsb2NrIGN5Y2xlIHRvIGJlY29tZSBlZmZlY3RpdmUuICovCisgIHRtcHJlZyA9IFJFQURfUkVHKFRJTXgtPkJEVFIpOworICAodm9pZCkodG1wcmVnKTsKK30KKworI2VuZGlmIC8qIFRJTV9CRFRSX0JLRiAqLworI2lmIGRlZmluZWQoVElNX0JEVFJfQksyRSkKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBicmVhayAyIGZ1bmN0aW9uLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JLSU4yX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIHNlY29uZCBicmVhayBpbnB1dC4KKyAgKiBAcm10b2xsIEJEVFIgICAgICAgICBCSzJFICAgICAgICAgIExMX1RJTV9FbmFibGVCUksyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlQlJLMihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5CRFRSLCBUSU1fQkRUUl9CSzJFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBicmVhayAgMiBmdW5jdGlvbi4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9CS0lOMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBzZWNvbmQgYnJlYWsgaW5wdXQuCisgICogQHJtdG9sbCBCRFRSICAgICAgICAgQksyRSAgICAgICAgICBMTF9USU1fRGlzYWJsZUJSSzIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlQlJLMihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkJEVFIsIFRJTV9CRFRSX0JLMkUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgYnJlYWsgMiBpbnB1dC4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9CS0lOMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBzZWNvbmQgYnJlYWsgaW5wdXQuCisgICogQHJtdG9sbCBCRFRSICAgICAgICAgQksyUCAgICAgICAgICBMTF9USU1fQ29uZmlnQlJLMlxuCisgICogICAgICAgICBCRFRSICAgICAgICAgQksyRiAgICAgICAgICBMTF9USU1fQ29uZmlnQlJLMgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQnJlYWsyUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX1BPTEFSSVRZX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfUE9MQVJJVFlfSElHSAorICAqIEBwYXJhbSAgQnJlYWsyRmlsdGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMV9OMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxX040CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjFfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMl9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYyX044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjRfTjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWNF9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVY4X042CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjhfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMTZfTjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMTZfTjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMTZfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMzJfTjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMzJfTjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMzJfTjgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9Db25maWdCUksyKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBCcmVhazJQb2xhcml0eSwgdWludDMyX3QgQnJlYWsyRmlsdGVyKQoreworICBNT0RJRllfUkVHKFRJTXgtPkJEVFIsIFRJTV9CRFRSX0JLMlAgfCBUSU1fQkRUUl9CSzJGLCBCcmVhazJQb2xhcml0eSB8IEJyZWFrMkZpbHRlcik7Cit9CisKKyNlbmRpZiAvKiBUSU1fQkRUUl9CSzJFICovCisvKioKKyAgKiBAYnJpZWYgIFNlbGVjdCB0aGUgb3V0cHV0cyBvZmYgc3RhdGUgKGVuYWJsZWQgdi5zLiBkaXNhYmxlZCkgaW4gSWRsZSBhbmQgUnVuIG1vZGVzLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIGJyZWFrIGlucHV0LgorICAqIEBybXRvbGwgQkRUUiAgICAgICAgIE9TU0kgICAgICAgICAgTExfVElNX1NldE9mZlN0YXRlc1xuCisgICogICAgICAgICBCRFRSICAgICAgICAgT1NTUiAgICAgICAgICBMTF9USU1fU2V0T2ZmU3RhdGVzCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBPZmZTdGF0ZUlkbGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT1NTSV9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09TU0lfRU5BQkxFCisgICogQHBhcmFtICBPZmZTdGF0ZVJ1biBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PU1NSX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT1NTUl9FTkFCTEUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRPZmZTdGF0ZXMoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IE9mZlN0YXRlSWRsZSwgdWludDMyX3QgT2ZmU3RhdGVSdW4pCit7CisgIE1PRElGWV9SRUcoVElNeC0+QkRUUiwgVElNX0JEVFJfT1NTSSB8IFRJTV9CRFRSX09TU1IsIE9mZlN0YXRlSWRsZSB8IE9mZlN0YXRlUnVuKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgYXV0b21hdGljIG91dHB1dCAoTU9FIGNhbiBiZSBzZXQgYnkgc29mdHdhcmUgb3IgYXV0b21hdGljYWxseSB3aGVuIGEgYnJlYWsgaW5wdXQgaXMgYWN0aXZlKS4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBicmVhayBpbnB1dC4KKyAgKiBAcm10b2xsIEJEVFIgICAgICAgICBBT0UgICAgICAgICAgIExMX1RJTV9FbmFibGVBdXRvbWF0aWNPdXRwdXQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVBdXRvbWF0aWNPdXRwdXQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+QkRUUiwgVElNX0JEVFJfQU9FKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGF1dG9tYXRpYyBvdXRwdXQgKE1PRSBjYW4gYmUgc2V0IG9ubHkgYnkgc29mdHdhcmUpLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIGJyZWFrIGlucHV0LgorICAqIEBybXRvbGwgQkRUUiAgICAgICAgIEFPRSAgICAgICAgICAgTExfVElNX0Rpc2FibGVBdXRvbWF0aWNPdXRwdXQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlQXV0b21hdGljT3V0cHV0KFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+QkRUUiwgVElNX0JEVFJfQU9FKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIGF1dG9tYXRpYyBvdXRwdXQgaXMgZW5hYmxlZC4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBicmVhayBpbnB1dC4KKyAgKiBAcm10b2xsIEJEVFIgICAgICAgICBBT0UgICAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRBdXRvbWF0aWNPdXRwdXQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkQXV0b21hdGljT3V0cHV0KFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKFJFQURfQklUKFRJTXgtPkJEVFIsIFRJTV9CRFRSX0FPRSkgPT0gKFRJTV9CRFRSX0FPRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgb3V0cHV0cyAoc2V0IHRoZSBNT0UgYml0IGluIFRJTXhfQkRUUiByZWdpc3RlcikuCisgICogQG5vdGUgVGhlIE1PRSBiaXQgaW4gVElNeF9CRFRSIHJlZ2lzdGVyIGFsbG93cyB0byBlbmFibGUgL2Rpc2FibGUgdGhlIG91dHB1dHMgYnkKKyAgKiAgICAgICBzb2Z0d2FyZSBhbmQgaXMgcmVzZXQgaW4gY2FzZSBvZiBicmVhayBvciBicmVhazIgZXZlbnQKKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBicmVhayBpbnB1dC4KKyAgKiBAcm10b2xsIEJEVFIgICAgICAgICBNT0UgICAgICAgICAgIExMX1RJTV9FbmFibGVBbGxPdXRwdXRzCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlQWxsT3V0cHV0cyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5CRFRSLCBUSU1fQkRUUl9NT0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIG91dHB1dHMgKHJlc2V0IHRoZSBNT0UgYml0IGluIFRJTXhfQkRUUiByZWdpc3RlcikuCisgICogQG5vdGUgVGhlIE1PRSBiaXQgaW4gVElNeF9CRFRSIHJlZ2lzdGVyIGFsbG93cyB0byBlbmFibGUgL2Rpc2FibGUgdGhlIG91dHB1dHMgYnkKKyAgKiAgICAgICBzb2Z0d2FyZSBhbmQgaXMgcmVzZXQgaW4gY2FzZSBvZiBicmVhayBvciBicmVhazIgZXZlbnQuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGEgYnJlYWsgaW5wdXQuCisgICogQHJtdG9sbCBCRFRSICAgICAgICAgTU9FICAgICAgICAgICBMTF9USU1fRGlzYWJsZUFsbE91dHB1dHMKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlQWxsT3V0cHV0cyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkJEVFIsIFRJTV9CRFRSX01PRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgb3V0cHV0cyBhcmUgZW5hYmxlZC4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBicmVhayBpbnB1dC4KKyAgKiBAcm10b2xsIEJEVFIgICAgICAgICBNT0UgICAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRBbGxPdXRwdXRzCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZEFsbE91dHB1dHMoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVElNeC0+QkRUUiwgVElNX0JEVFJfTU9FKSA9PSAoVElNX0JEVFJfTU9FKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX0RNQV9CdXJzdF9Nb2RlIERNQSBidXJzdCBtb2RlIGNvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIHRoZSB0aW1lciBETUEgYnVyc3QgZmVhdHVyZS4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9ETUFCVVJTVF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgICogICAgICAgbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgdGhlIERNQSBidXJzdCBtb2RlLgorICAqIEBybXRvbGwgRENSICAgICAgICAgIERCTCAgICAgICAgICAgTExfVElNX0NvbmZpZ0RNQUJ1cnN0XG4KKyAgKiAgICAgICAgIERDUiAgICAgICAgICBEQkEgICAgICAgICAgIExMX1RJTV9Db25maWdETUFCdXJzdAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgRE1BQnVyc3RCYXNlQWRkcmVzcyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DUjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ1IyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX1NNQ1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfRElFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9TUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9FR1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NNUjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NNUjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfUFNDCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0FSUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9SQ1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NSMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ1IyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDUjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NSNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9CRFRSCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDTVIzICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ1I1ICAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NSNiAgKCopCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfT1IKKyAgKiBAcGFyYW0gIERNQUJ1cnN0TGVuZ3RoIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xVFJBTlNGRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzJUUkFOU0ZFUlMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzNUUkFOU0ZFUlMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzRUUkFOU0ZFUlMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzVUUkFOU0ZFUlMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzZUUkFOU0ZFUlMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzdUUkFOU0ZFUlMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzhUUkFOU0ZFUlMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzlUUkFOU0ZFUlMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzEwVFJBTlNGRVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xMVRSQU5TRkVSUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTJUUkFOU0ZFUlMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzEzVFJBTlNGRVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xNFRSQU5TRkVSUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTVUUkFOU0ZFUlMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE2VFJBTlNGRVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xN1RSQU5TRkVSUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMThUUkFOU0ZFUlMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9Db25maWdETUFCdXJzdChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgRE1BQnVyc3RCYXNlQWRkcmVzcywgdWludDMyX3QgRE1BQnVyc3RMZW5ndGgpCit7CisgIE1PRElGWV9SRUcoVElNeC0+RENSLCBUSU1fRENSX0RCTCB8IFRJTV9EQ1JfREJBLCBETUFCdXJzdEJhc2VBZGRyZXNzIHwgRE1BQnVyc3RMZW5ndGgpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9UaW1lcl9JbnB1dHNfUmVtYXBwaW5nIFRpbWVyIGlucHV0IHJlbWFwcGluZworICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIFJlbWFwIFRJTSBpbnB1dHMgKGlucHV0IGNoYW5uZWwsIGludGVybmFsL2V4dGVybmFsIHRyaWdnZXJzKS4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9SRU1BUF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgc29tZSB0aW1lciBpbnB1dHMgY2FuIGJlIHJlbWFwcGVkLgorICAqIEBpZiBTVE0zMkYzMzR4OAorICAqIEBybXRvbGwgVElNMV9PUiAgICAgRVRSX1JNUCAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgICogICAgICAgICBUSU0xNl9PUiAgICBUSTFfUk1QICAgICAgTExfVElNX1NldFJlbWFwXG4KKyAgKiBAZWxzZWlmIFNUTTMyRjMwMng4CisgICogQHJtdG9sbCBUSU0xX09SICAgICBFVFJfUk1QICAgICAgTExfVElNX1NldFJlbWFwXG4KKyAgKiAgICAgICAgIFRJTTE2X09SICAgIFRJMV9STVAgICAgICBMTF9USU1fU2V0UmVtYXBcbgorICAqIEBlbHNlaWYgU1RNMzJGMzAzeEMKKyAgKiBAcm10b2xsIFRJTTFfT1IgICAgIEVUUl9STVAgICAgICBMTF9USU1fU2V0UmVtYXBcbgorICAqICAgICAgICAgVElNOF9PUiAgICAgRVRSX1JNUCAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgICogICAgICAgICBUSU0yMF9PUiAgICBFVFJfUk1QICAgICAgTExfVElNX1NldFJlbWFwXG4KKyAgKiBAZWxzZWlmIFNUTTMyRjM3M3hDCisgICogQHJtdG9sbCAgVElNMTRfT1IgICAgVEkxX1JNUCAgICAgIExMX1RJTV9TZXRSZW1hcAorICAqIEBlbmRpZgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgUmVtYXAgUmVtYXAgcGFyYW1zIGRlcGVuZHMgb24gdGhlIFRJTXguIERlc2NyaXB0aW9uIGF2YWlsYWJsZSBvbmx5CisgICogICAgICAgICBpbiBDSE0gdmVyc2lvbiBvZiB0aGUgVXNlciBNYW51YWwgKG5vdCBpbiAucGRmKS4KKyAgKiAgICAgICAgIE90aGVyd2lzZSBzZWUgUmVmZXJlbmNlIE1hbnVhbCBkZXNjcmlwdGlvbiBvZiBPUiByZWdpc3RlcnMuCisgICoKKyAgKiAgICAgICAgIEJlbG93IGRlc2NyaXB0aW9uIHN1bW1hcml6ZXMgIlRpbWVyIEluc3RhbmNlIiBhbmQgIlJlbWFwIiBwYXJhbSBjb21iaW5hdGlvbnM6CisgICoKKyAgKiAgICAgICAgIFRJTTE6IGFueSBjb21iaW5hdGlvbiBvZiBFVFJfUk1QIHdoZXJlICAgICAgKCoqKQorICAqCisgICogICAgICAgICAgICAuIC4gRVRSX1JNUCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTFfRVRSX0FEQzFfUk1QX05DCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTFfRVRSX0FEQzFfUk1QX0FXRDEgICAoKikKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMV9FVFJfQURDMV9STVBfQVdEMiAgICgqKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xX0VUUl9BREMxX1JNUF9BV0QzICAgKCopCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTFfRVRSX0FEQzJfUk1QX05DICAgICAoKikKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMV9FVFJfQURDMl9STVBfQVdEMSAgICgqKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xX0VUUl9BREMyX1JNUF9BV0QyICAgKCopCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTFfRVRSX0FEQzJfUk1QX0FXRDMgICAoKikKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMV9FVFJfQURDM19STVBfTkMgICAgICgqKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xX0VUUl9BREMzX1JNUF9BV0QxICAgKCopCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTFfRVRSX0FEQzNfUk1QX0FXRDIgICAoKikKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMV9FVFJfQURDM19STVBfQVdEMyAgICgqKQorICAqCisgICogICAgICAgICBUSU04OiBhbnkgY29tYmluYXRpb24gb2YgRVRSX1JNUCB3aGVyZSAgICAgICAoKiopCisgICoKKyAgKiAgICAgICAgICAgIC4gLiBFVFJfUk1QIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNOF9FVFJfQURDMl9STVBfTkMgICAgICAoKikKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNOF9FVFJfQURDMl9STVBfQVdEMSAgICAoKikKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNOF9FVFJfQURDMl9STVBfQVdEMiAgICAoKikKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNOF9FVFJfQURDMl9STVBfQVdEMyAgICAoKikKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNOF9FVFJfQURDM19STVBfTkMgICAgICAoKikKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNOF9FVFJfQURDM19STVBfQVdEMSAgICAoKikKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNOF9FVFJfQURDM19STVBfQVdEMiAgICAoKikKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNOF9FVFJfQURDM19STVBfQVdEMyAgICAoKikKKyAgKgorICAqICAgICAgICAgVElNMTQ6IGFueSBjb21iaW5hdGlvbiBvZiBUSTFfUk1QIHdoZXJlICAgICAgICgqKikKKyAgKgorICAqICAgICAgICAgICAgLiAuIFRJMV9STVAgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcworICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xNF9USTFfUk1QX0dQSU8gICAgICAgKCopCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE0X1RJMV9STVBfUlRDX0NMSyAgICAoKikKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTRfVEkxX1JNUF9IU0UgICAgICAgICgqKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xNF9USTFfUk1QX01DTyAgICAgICAgKCopCisgICoKKyAgKiAgICAgICAgIFRJTTE2OiBhbnkgY29tYmluYXRpb24gb2YgVEkxX1JNUCB3aGVyZSAgICAgICAoKiopCisgICoKKyAgKiAgICAgICAgICAgIC4gLiBUSTFfUk1QIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTZfVEkxX1JNUF9HUElPICAgICAgICgqKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xNl9USTFfUk1QX0xTSSAgICAgICAgKCopCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE2X1RJMV9STVBfTFNFICAgICAgICAoKikKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTZfVEkxX1JNUF9SVEMgICAgICAgICgqKQorICAqCisgICogICAgICAgICBUSU0yMDogYW55IGNvbWJpbmF0aW9uIG9mIEVUUl9STVAgd2hlcmUgICAgICAgKCoqKQorICAqCisgICogICAgICAgICAgICAuIC4gRVRSX1JNUCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIwX0VUUl9BREMzX1JNUF9OQyAgICAgICgqKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yMF9FVFJfQURDM19STVBfQVdEMSAgICAoKikKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMjBfRVRSX0FEQzNfUk1QX0FXRDIgICAgKCopCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIwX0VUUl9BREMzX1JNUF9BV0QzICAgICgqKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yMF9FVFJfQURDNF9STVBfTkMgICAgICAoKikKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMjBfRVRSX0FEQzRfUk1QX0FXRDEgICAgKCopCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIwX0VUUl9BREM0X1JNUF9BV0QyICAgICgqKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yMF9FVFJfQURDNF9STVBfQVdEMyAgICAoKikKKyAgKgorICAqICAgICAgICAgKCopICBWYWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4gXG4KKyAgKiAgICAgICAgICgqKikgUmVnaXN0ZXIgbm90IGF2YWlsYWJsZSBpbiBhbGwgZGV2aWNlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRSZW1hcChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgUmVtYXApCit7CisgIE1PRElGWV9SRUcoVElNeC0+T1IsIChSZW1hcCA+PiBUSU14X09SX1JNUF9TSElGVCksIChSZW1hcCAmIFRJTXhfT1JfUk1QX01BU0spKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoVElNX1NNQ1JfT0NDUykKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX09DUkVGX0NsZWFyIE9DUkVGX0NsZWFyX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIE9DUkVGIGNsZWFyIGlucHV0IHNvdXJjZQorICAqIEBub3RlIFRoZSBPQ3hSRUYgc2lnbmFsIG9mIGEgZ2l2ZW4gY2hhbm5lbCBjYW4gYmUgY2xlYXJlZCB3aGVuIGEgaGlnaCBsZXZlbCBpcyBhcHBsaWVkIG9uIHRoZSBPQ1JFRl9DTFJfSU5QVVQKKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIHVzZWQgaW4gT3V0cHV0IGNvbXBhcmUgYW5kIFBXTSBtb2Rlcy4KKyAgKiBAcm10b2xsIFNNQ1IgICAgICAgICAgT0NDUyAgICAgICAgICAgICAgICBMTF9USU1fU2V0T0NSZWZDbGVhcklucHV0U291cmNlCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBPQ1JlZkNsZWFySW5wdXRTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NSRUZfQ0xSX0lOVF9PQ1JFRl9DTFIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NSRUZfQ0xSX0lOVF9FVFIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRPQ1JlZkNsZWFySW5wdXRTb3VyY2UoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IE9DUmVmQ2xlYXJJbnB1dFNvdXJjZSkKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5TTUNSLCBUSU1fU01DUl9PQ0NTLCBPQ1JlZkNsZWFySW5wdXRTb3VyY2UpOworfQorLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBUSU1fU01DUl9PQ0NTICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX0ZMQUdfTWFuYWdlbWVudCBGTEFHLU1hbmFnZW1lbnQKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgdXBkYXRlIGludGVycnVwdCBmbGFnIChVSUYpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIFVJRiAgICAgICAgICAgTExfVElNX0NsZWFyRmxhZ19VUERBVEUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DbGVhckZsYWdfVVBEQVRFKFRJTV9UeXBlRGVmICpUSU14KQoreworICBXUklURV9SRUcoVElNeC0+U1IsIH4oVElNX1NSX1VJRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdXBkYXRlIGludGVycnVwdCBmbGFnIChVSUYpIGlzIHNldCAodXBkYXRlIGludGVycnVwdCBpcyBwZW5kaW5nKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBVSUYgICAgICAgICAgIExMX1RJTV9Jc0FjdGl2ZUZsYWdfVVBEQVRFCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19VUERBVEUoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVElNeC0+U1IsIFRJTV9TUl9VSUYpID09IChUSU1fU1JfVUlGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCBmbGFnIChDQzFGKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzFJRiAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQ0MxCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX0NDMShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9DQzFJRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0IGZsYWcgKENDMUYpIGlzIHNldCAoQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENDMUlGICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19DQzEKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX0NDMShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX0NDMUlGKSA9PSAoVElNX1NSX0NDMUlGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCBmbGFnIChDQzJGKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzJJRiAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQ0MyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX0NDMihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9DQzJJRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0IGZsYWcgKENDMkYpIGlzIHNldCAoQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENDMklGICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19DQzIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX0NDMihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX0NDMklGKSA9PSAoVElNX1NSX0NDMklGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCBmbGFnIChDQzNGKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzNJRiAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQ0MzCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX0NDMyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9DQzNJRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0IGZsYWcgKENDM0YpIGlzIHNldCAoQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENDM0lGICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19DQzMKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX0NDMyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX0NDM0lGKSA9PSAoVElNX1NSX0NDM0lGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCBmbGFnIChDQzRGKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzRJRiAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQ0M0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX0NDNChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9DQzRJRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0IGZsYWcgKENDNEYpIGlzIHNldCAoQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENDNElGICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19DQzQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX0NDNChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX0NDNElGKSA9PSAoVElNX1NSX0NDNElGKSk7Cit9CisKKyNpZiAgIGRlZmluZWQgKFRJTV9TUl9DQzVJRikKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIENhcHR1cmUvQ29tcGFyZSA1IGludGVycnVwdCBmbGFnIChDQzVGKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzVJRiAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQ0M1CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX0NDNShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9DQzVJRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgQ2FwdHVyZS9Db21wYXJlIDUgaW50ZXJydXB0IGZsYWcgKENDNUYpIGlzIHNldCAoQ2FwdHVyZS9Db21wYXJlIDUgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENDNUlGICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19DQzUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX0NDNShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX0NDNUlGKSA9PSAoVElNX1NSX0NDNUlGKSk7Cit9CisKKyNlbmRpZiAvKiBUSU1fU1JfQ0M1SUYgKi8KKyNpZiAgIGRlZmluZWQgKFRJTV9TUl9DQzZJRikKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIENhcHR1cmUvQ29tcGFyZSA2IGludGVycnVwdCBmbGFnIChDQzZGKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzZJRiAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQ0M2CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX0NDNihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9DQzZJRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgQ2FwdHVyZS9Db21wYXJlIDYgaW50ZXJydXB0IGZsYWcgKENDNkYpIGlzIHNldCAoQ2FwdHVyZS9Db21wYXJlIDYgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENDNklGICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19DQzYKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX0NDNihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX0NDNklGKSA9PSAoVElNX1NSX0NDNklGKSk7Cit9CisKKyNlbmRpZiAvKiBUSU1fU1JfQ0M2SUYgKi8KKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIGNvbW11dGF0aW9uIGludGVycnVwdCBmbGFnIChDT01JRikuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ09NSUYgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX0NPTQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19DT00oVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfQ09NSUYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIGNvbW11dGF0aW9uIGludGVycnVwdCBmbGFnIChDT01JRikgaXMgc2V0IChjb21tdXRhdGlvbiBpbnRlcnJ1cHQgaXMgcGVuZGluZykuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ09NSUYgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX0NPTQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ09NKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQ09NSUYpID09IChUSU1fU1JfQ09NSUYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgdHJpZ2dlciBpbnRlcnJ1cHQgZmxhZyAoVElGKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBUSUYgICAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfVFJJRworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19UUklHKFRJTV9UeXBlRGVmICpUSU14KQoreworICBXUklURV9SRUcoVElNeC0+U1IsIH4oVElNX1NSX1RJRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdHJpZ2dlciBpbnRlcnJ1cHQgZmxhZyAoVElGKSBpcyBzZXQgKHRyaWdnZXIgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIFRJRiAgICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19UUklHCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19UUklHKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfVElGKSA9PSAoVElNX1NSX1RJRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBicmVhayBpbnRlcnJ1cHQgZmxhZyAoQklGKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBCSUYgICAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQlJLCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX0JSSyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9CSUYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIGJyZWFrIGludGVycnVwdCBmbGFnIChCSUYpIGlzIHNldCAoYnJlYWsgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIEJJRiAgICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19CUksKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX0JSSyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX0JJRikgPT0gKFRJTV9TUl9CSUYpKTsKK30KKworI2lmIGRlZmluZWQoVElNX1NSX0IySUYpCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBicmVhayAyIGludGVycnVwdCBmbGFnIChCMklGKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBCMklGICAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQlJLMgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19CUksyKFRJTV9UeXBlRGVmICpUSU14KQoreworICBXUklURV9SRUcoVElNeC0+U1IsIH4oVElNX1NSX0IySUYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIGJyZWFrIDIgaW50ZXJydXB0IGZsYWcgKEIySUYpIGlzIHNldCAoYnJlYWsgMiBpbnRlcnJ1cHQgaXMgcGVuZGluZykuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQjJJRiAgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX0JSSzIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX0JSSzIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVElNeC0+U1IsIFRJTV9TUl9CMklGKSA9PSAoVElNX1NSX0IySUYpKTsKK30KKworI2VuZGlmIC8qIFRJTV9TUl9CMklGICovCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBDYXB0dXJlL0NvbXBhcmUgMSBvdmVyLWNhcHR1cmUgaW50ZXJydXB0IGZsYWcgKENDMU9GKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzFPRiAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQ0MxT1ZSCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX0NDMU9WUihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9DQzFPRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgQ2FwdHVyZS9Db21wYXJlIDEgb3Zlci1jYXB0dXJlIGludGVycnVwdCBmbGFnIChDQzFPRikgaXMgc2V0IChDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgaXMgcGVuZGluZykuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0MxT0YgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX0NDMU9WUgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0MxT1ZSKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQ0MxT0YpID09IChUSU1fU1JfQ0MxT0YpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgQ2FwdHVyZS9Db21wYXJlIDIgb3Zlci1jYXB0dXJlIGludGVycnVwdCBmbGFnIChDQzJPRikuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0MyT0YgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX0NDMk9WUgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19DQzJPVlIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfQ0MyT0YpKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIENhcHR1cmUvQ29tcGFyZSAyIG92ZXItY2FwdHVyZSBpbnRlcnJ1cHQgZmxhZyAoQ0MyT0YpIGlzIHNldCAoQ2FwdHVyZS9Db21wYXJlIDIgb3Zlci1jYXB0dXJlIGludGVycnVwdCBpcyBwZW5kaW5nKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzJPRiAgICAgICAgIExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0MyT1ZSCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19DQzJPVlIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVElNeC0+U1IsIFRJTV9TUl9DQzJPRikgPT0gKFRJTV9TUl9DQzJPRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBDYXB0dXJlL0NvbXBhcmUgMyBvdmVyLWNhcHR1cmUgaW50ZXJydXB0IGZsYWcgKENDM09GKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzNPRiAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQ0MzT1ZSCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX0NDM09WUihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9DQzNPRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgQ2FwdHVyZS9Db21wYXJlIDMgb3Zlci1jYXB0dXJlIGludGVycnVwdCBmbGFnIChDQzNPRikgaXMgc2V0IChDYXB0dXJlL0NvbXBhcmUgMyBvdmVyLWNhcHR1cmUgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENDM09GICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19DQzNPVlIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX0NDM09WUihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX0NDM09GKSA9PSAoVElNX1NSX0NDM09GKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIENhcHR1cmUvQ29tcGFyZSA0IG92ZXItY2FwdHVyZSBpbnRlcnJ1cHQgZmxhZyAoQ0M0T0YpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENDNE9GICAgICAgICAgTExfVElNX0NsZWFyRmxhZ19DQzRPVlIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DbGVhckZsYWdfQ0M0T1ZSKFRJTV9UeXBlRGVmICpUSU14KQoreworICBXUklURV9SRUcoVElNeC0+U1IsIH4oVElNX1NSX0NDNE9GKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBDYXB0dXJlL0NvbXBhcmUgNCBvdmVyLWNhcHR1cmUgaW50ZXJydXB0IGZsYWcgKENDNE9GKSBpcyBzZXQgKENhcHR1cmUvQ29tcGFyZSA0IG92ZXItY2FwdHVyZSBpbnRlcnJ1cHQgaXMgcGVuZGluZykuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0M0T0YgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX0NDNE9WUgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0M0T1ZSKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQ0M0T0YpID09IChUSU1fU1JfQ0M0T0YpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUZfSVRfTWFuYWdlbWVudCBJVC1NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHVwZGF0ZSBpbnRlcnJ1cHQgKFVJRSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgVUlFICAgICAgICAgICBMTF9USU1fRW5hYmxlSVRfVVBEQVRFCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlSVRfVVBEQVRFKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX1VJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB1cGRhdGUgaW50ZXJydXB0IChVSUUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIFVJRSAgICAgICAgICAgTExfVElNX0Rpc2FibGVJVF9VUERBVEUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlSVRfVVBEQVRFKFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdXBkYXRlIGludGVycnVwdCAoVUlFKSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIFVJRSAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZElUX1VQREFURQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRJVF9VUERBVEUoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVUlFKSA9PSAoVElNX0RJRVJfVUlFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGNhcHR1cmUvY29tcGFyZSAxIGludGVycnVwdCAoQ0MxSUUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDMUlFICAgICAgICAgTExfVElNX0VuYWJsZUlUX0NDMQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUlUX0NDMShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzFJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBjYXB0dXJlL2NvbXBhcmUgMSAgaW50ZXJydXB0IChDQzFJRSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MxSUUgICAgICAgICBMTF9USU1fRGlzYWJsZUlUX0NDMQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVJVF9DQzEoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzFJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhcHR1cmUvY29tcGFyZSAxIGludGVycnVwdCAoQ0MxSUUpIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MxSUUgICAgICAgICBMTF9USU1fSXNFbmFibGVkSVRfQ0MxCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZElUX0NDMShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzFJRSkgPT0gKFRJTV9ESUVSX0NDMUlFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGNhcHR1cmUvY29tcGFyZSAyIGludGVycnVwdCAoQ0MySUUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDMklFICAgICAgICAgTExfVElNX0VuYWJsZUlUX0NDMgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUlUX0NDMihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBjYXB0dXJlL2NvbXBhcmUgMiAgaW50ZXJydXB0IChDQzJJRSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MySUUgICAgICAgICBMTF9USU1fRGlzYWJsZUlUX0NDMgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVJVF9DQzIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhcHR1cmUvY29tcGFyZSAyIGludGVycnVwdCAoQ0MySUUpIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MySUUgICAgICAgICBMTF9USU1fSXNFbmFibGVkSVRfQ0MyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZElUX0NDMihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzJJRSkgPT0gKFRJTV9ESUVSX0NDMklFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGNhcHR1cmUvY29tcGFyZSAzIGludGVycnVwdCAoQ0MzSUUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDM0lFICAgICAgICAgTExfVElNX0VuYWJsZUlUX0NDMworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUlUX0NDMyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzNJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBjYXB0dXJlL2NvbXBhcmUgMyAgaW50ZXJydXB0IChDQzNJRSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MzSUUgICAgICAgICBMTF9USU1fRGlzYWJsZUlUX0NDMworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVJVF9DQzMoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzNJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhcHR1cmUvY29tcGFyZSAzIGludGVycnVwdCAoQ0MzSUUpIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MzSUUgICAgICAgICBMTF9USU1fSXNFbmFibGVkSVRfQ0MzCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZElUX0NDMyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzNJRSkgPT0gKFRJTV9ESUVSX0NDM0lFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGNhcHR1cmUvY29tcGFyZSA0IGludGVycnVwdCAoQ0M0SUUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDNElFICAgICAgICAgTExfVElNX0VuYWJsZUlUX0NDNAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUlUX0NDNChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzRJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBjYXB0dXJlL2NvbXBhcmUgNCAgaW50ZXJydXB0IChDQzRJRSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0M0SUUgICAgICAgICBMTF9USU1fRGlzYWJsZUlUX0NDNAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVJVF9DQzQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzRJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhcHR1cmUvY29tcGFyZSA0IGludGVycnVwdCAoQ0M0SUUpIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0M0SUUgICAgICAgICBMTF9USU1fSXNFbmFibGVkSVRfQ0M0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZElUX0NDNChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzRJRSkgPT0gKFRJTV9ESUVSX0NDNElFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGNvbW11dGF0aW9uIGludGVycnVwdCAoQ09NSUUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENPTUlFICAgICAgICAgTExfVElNX0VuYWJsZUlUX0NPTQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUlUX0NPTShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DT01JRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBjb21tdXRhdGlvbiBpbnRlcnJ1cHQgKENPTUlFKS4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDT01JRSAgICAgICAgIExMX1RJTV9EaXNhYmxlSVRfQ09NCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUlUX0NPTShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NPTUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29tbXV0YXRpb24gaW50ZXJydXB0IChDT01JRSkgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDT01JRSAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRJVF9DT00KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkSVRfQ09NKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NPTUlFKSA9PSAoVElNX0RJRVJfQ09NSUUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdHJpZ2dlciBpbnRlcnJ1cHQgKFRJRSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgVElFICAgICAgICAgICBMTF9USU1fRW5hYmxlSVRfVFJJRworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUlUX1RSSUcoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRyaWdnZXIgaW50ZXJydXB0IChUSUUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIFRJRSAgICAgICAgICAgTExfVElNX0Rpc2FibGVJVF9UUklHCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUlUX1RSSUcoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9USUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0cmlnZ2VyIGludGVycnVwdCAoVElFKSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIFRJRSAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZElUX1RSSUcKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkSVRfVFJJRyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9USUUpID09IChUSU1fRElFUl9USUUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgYnJlYWsgaW50ZXJydXB0IChCSUUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIEJJRSAgICAgICAgICAgTExfVElNX0VuYWJsZUlUX0JSSworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUlUX0JSSyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9CSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgYnJlYWsgaW50ZXJydXB0IChCSUUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIEJJRSAgICAgICAgICAgTExfVElNX0Rpc2FibGVJVF9CUksKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlSVRfQlJLKFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYnJlYWsgaW50ZXJydXB0IChCSUUpIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQklFICAgICAgICAgICBMTF9USU1fSXNFbmFibGVkSVRfQlJLCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZElUX0JSSyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9CSUUpID09IChUSU1fRElFUl9CSUUpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUZfRE1BX01hbmFnZW1lbnQgRE1BLU1hbmFnZW1lbnQKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBFbmFibGUgdXBkYXRlIERNQSByZXF1ZXN0IChVREUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIFVERSAgICAgICAgICAgTExfVElNX0VuYWJsZURNQVJlcV9VUERBVEUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVETUFSZXFfVVBEQVRFKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX1VERSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB1cGRhdGUgRE1BIHJlcXVlc3QgKFVERSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgVURFICAgICAgICAgICBMTF9USU1fRGlzYWJsZURNQVJlcV9VUERBVEUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlRE1BUmVxX1VQREFURShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX1VERSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHVwZGF0ZSBETUEgcmVxdWVzdCAgKFVERSkgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBVREUgICAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRETUFSZXFfVVBEQVRFCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZERNQVJlcV9VUERBVEUoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVURFKSA9PSAoVElNX0RJRVJfVURFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGNhcHR1cmUvY29tcGFyZSAxIERNQSByZXF1ZXN0IChDQzFERSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MxREUgICAgICAgICBMTF9USU1fRW5hYmxlRE1BUmVxX0NDMQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZURNQVJlcV9DQzEoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MxREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgY2FwdHVyZS9jb21wYXJlIDEgIERNQSByZXF1ZXN0IChDQzFERSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MxREUgICAgICAgICBMTF9USU1fRGlzYWJsZURNQVJlcV9DQzEKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlRE1BUmVxX0NDMShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDMURFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY2FwdHVyZS9jb21wYXJlIDEgRE1BIHJlcXVlc3QgKENDMURFKSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDMURFICAgICAgICAgTExfVElNX0lzRW5hYmxlZERNQVJlcV9DQzEKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkRE1BUmVxX0NDMShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzFERSkgPT0gKFRJTV9ESUVSX0NDMURFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGNhcHR1cmUvY29tcGFyZSAyIERNQSByZXF1ZXN0IChDQzJERSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MyREUgICAgICAgICBMTF9USU1fRW5hYmxlRE1BUmVxX0NDMgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZURNQVJlcV9DQzIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MyREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgY2FwdHVyZS9jb21wYXJlIDIgIERNQSByZXF1ZXN0IChDQzJERSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MyREUgICAgICAgICBMTF9USU1fRGlzYWJsZURNQVJlcV9DQzIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlRE1BUmVxX0NDMihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDMkRFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY2FwdHVyZS9jb21wYXJlIDIgRE1BIHJlcXVlc3QgKENDMkRFKSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDMkRFICAgICAgICAgTExfVElNX0lzRW5hYmxlZERNQVJlcV9DQzIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkRE1BUmVxX0NDMihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzJERSkgPT0gKFRJTV9ESUVSX0NDMkRFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGNhcHR1cmUvY29tcGFyZSAzIERNQSByZXF1ZXN0IChDQzNERSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MzREUgICAgICAgICBMTF9USU1fRW5hYmxlRE1BUmVxX0NDMworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZURNQVJlcV9DQzMoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MzREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgY2FwdHVyZS9jb21wYXJlIDMgIERNQSByZXF1ZXN0IChDQzNERSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MzREUgICAgICAgICBMTF9USU1fRGlzYWJsZURNQVJlcV9DQzMKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlRE1BUmVxX0NDMyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDM0RFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY2FwdHVyZS9jb21wYXJlIDMgRE1BIHJlcXVlc3QgKENDM0RFKSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDM0RFICAgICAgICAgTExfVElNX0lzRW5hYmxlZERNQVJlcV9DQzMKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkRE1BUmVxX0NDMyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzNERSkgPT0gKFRJTV9ESUVSX0NDM0RFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGNhcHR1cmUvY29tcGFyZSA0IERNQSByZXF1ZXN0IChDQzRERSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0M0REUgICAgICAgICBMTF9USU1fRW5hYmxlRE1BUmVxX0NDNAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZURNQVJlcV9DQzQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0M0REUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgY2FwdHVyZS9jb21wYXJlIDQgIERNQSByZXF1ZXN0IChDQzRERSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0M0REUgICAgICAgICBMTF9USU1fRGlzYWJsZURNQVJlcV9DQzQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlRE1BUmVxX0NDNChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDNERFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY2FwdHVyZS9jb21wYXJlIDQgRE1BIHJlcXVlc3QgKENDNERFKSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDNERFICAgICAgICAgTExfVElNX0lzRW5hYmxlZERNQVJlcV9DQzQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkRE1BUmVxX0NDNChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzRERSkgPT0gKFRJTV9ESUVSX0NDNERFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGNvbW11dGF0aW9uIERNQSByZXF1ZXN0IChDT01ERSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ09NREUgICAgICAgICBMTF9USU1fRW5hYmxlRE1BUmVxX0NPTQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZURNQVJlcV9DT00oVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ09NREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgY29tbXV0YXRpb24gRE1BIHJlcXVlc3QgKENPTURFKS4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDT01ERSAgICAgICAgIExMX1RJTV9EaXNhYmxlRE1BUmVxX0NPTQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVETUFSZXFfQ09NKFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ09NREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb21tdXRhdGlvbiBETUEgcmVxdWVzdCAoQ09NREUpIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ09NREUgICAgICAgICBMTF9USU1fSXNFbmFibGVkRE1BUmVxX0NPTQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRETUFSZXFfQ09NKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NPTURFKSA9PSAoVElNX0RJRVJfQ09NREUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdHJpZ2dlciBpbnRlcnJ1cHQgKFRERSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgVERFICAgICAgICAgICBMTF9USU1fRW5hYmxlRE1BUmVxX1RSSUcKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVETUFSZXFfVFJJRyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9UREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdHJpZ2dlciBpbnRlcnJ1cHQgKFRERSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgVERFICAgICAgICAgICBMTF9USU1fRGlzYWJsZURNQVJlcV9UUklHCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZURNQVJlcV9UUklHKFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVERFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdHJpZ2dlciBpbnRlcnJ1cHQgKFRERSkgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBUREUgICAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRETUFSZXFfVFJJRworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRETUFSZXFfVFJJRyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9UREUpID09IChUSU1fRElFUl9UREUpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUZfRVZFTlRfTWFuYWdlbWVudCBFVkVOVC1NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgR2VuZXJhdGUgYW4gdXBkYXRlIGV2ZW50LgorICAqIEBybXRvbGwgRUdSICAgICAgICAgIFVHICAgICAgICAgICAgTExfVElNX0dlbmVyYXRlRXZlbnRfVVBEQVRFCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fR2VuZXJhdGVFdmVudF9VUERBVEUoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RUdSLCBUSU1fRUdSX1VHKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBDYXB0dXJlL0NvbXBhcmUgMSBldmVudC4KKyAgKiBAcm10b2xsIEVHUiAgICAgICAgICBDQzFHICAgICAgICAgIExMX1RJTV9HZW5lcmF0ZUV2ZW50X0NDMQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0dlbmVyYXRlRXZlbnRfQ0MxKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkVHUiwgVElNX0VHUl9DQzFHKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBDYXB0dXJlL0NvbXBhcmUgMiBldmVudC4KKyAgKiBAcm10b2xsIEVHUiAgICAgICAgICBDQzJHICAgICAgICAgIExMX1RJTV9HZW5lcmF0ZUV2ZW50X0NDMgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0dlbmVyYXRlRXZlbnRfQ0MyKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkVHUiwgVElNX0VHUl9DQzJHKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBDYXB0dXJlL0NvbXBhcmUgMyBldmVudC4KKyAgKiBAcm10b2xsIEVHUiAgICAgICAgICBDQzNHICAgICAgICAgIExMX1RJTV9HZW5lcmF0ZUV2ZW50X0NDMworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0dlbmVyYXRlRXZlbnRfQ0MzKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkVHUiwgVElNX0VHUl9DQzNHKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBDYXB0dXJlL0NvbXBhcmUgNCBldmVudC4KKyAgKiBAcm10b2xsIEVHUiAgICAgICAgICBDQzRHICAgICAgICAgIExMX1RJTV9HZW5lcmF0ZUV2ZW50X0NDNAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0dlbmVyYXRlRXZlbnRfQ0M0KFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkVHUiwgVElNX0VHUl9DQzRHKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBjb21tdXRhdGlvbiBldmVudC4KKyAgKiBAcm10b2xsIEVHUiAgICAgICAgICBDT01HICAgICAgICAgIExMX1RJTV9HZW5lcmF0ZUV2ZW50X0NPTQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0dlbmVyYXRlRXZlbnRfQ09NKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkVHUiwgVElNX0VHUl9DT01HKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSB0cmlnZ2VyIGV2ZW50LgorICAqIEBybXRvbGwgRUdSICAgICAgICAgIFRHICAgICAgICAgICAgTExfVElNX0dlbmVyYXRlRXZlbnRfVFJJRworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0dlbmVyYXRlRXZlbnRfVFJJRyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5FR1IsIFRJTV9FR1JfVEcpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlIGJyZWFrIGV2ZW50LgorICAqIEBybXRvbGwgRUdSICAgICAgICAgIEJHICAgICAgICAgICAgTExfVElNX0dlbmVyYXRlRXZlbnRfQlJLCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fR2VuZXJhdGVFdmVudF9CUksoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RUdSLCBUSU1fRUdSX0JHKTsKK30KKworI2lmIGRlZmluZWQoVElNX0VHUl9CMkcpCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlIGJyZWFrIDIgZXZlbnQuCisgICogQHJtdG9sbCBFR1IgICAgICAgICAgQjJHICAgICAgICAgICBMTF9USU1fR2VuZXJhdGVFdmVudF9CUksyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fR2VuZXJhdGVFdmVudF9CUksyKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkVHUiwgVElNX0VHUl9CMkcpOworfQorCisjZW5kaWYgLyogVElNX0VHUl9CMkcgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX0luaXQgSW5pdGlhbGlzYXRpb24gYW5kIGRlaW5pdGlhbGlzYXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworRXJyb3JTdGF0dXMgTExfVElNX0RlSW5pdChUSU1fVHlwZURlZiAqVElNeCk7Cit2b2lkIExMX1RJTV9TdHJ1Y3RJbml0KExMX1RJTV9Jbml0VHlwZURlZiAqVElNX0luaXRTdHJ1Y3QpOworRXJyb3JTdGF0dXMgTExfVElNX0luaXQoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9Jbml0VHlwZURlZiAqVElNX0luaXRTdHJ1Y3QpOwordm9pZCBMTF9USU1fT0NfU3RydWN0SW5pdChMTF9USU1fT0NfSW5pdFR5cGVEZWYgKlRJTV9PQ19Jbml0U3RydWN0KTsKK0Vycm9yU3RhdHVzIExMX1RJTV9PQ19Jbml0KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsLCBMTF9USU1fT0NfSW5pdFR5cGVEZWYgKlRJTV9PQ19Jbml0U3RydWN0KTsKK3ZvaWQgTExfVElNX0lDX1N0cnVjdEluaXQoTExfVElNX0lDX0luaXRUeXBlRGVmICpUSU1fSUNJbml0U3RydWN0KTsKK0Vycm9yU3RhdHVzIExMX1RJTV9JQ19Jbml0KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsLCBMTF9USU1fSUNfSW5pdFR5cGVEZWYgKlRJTV9JQ19Jbml0U3RydWN0KTsKK3ZvaWQgTExfVElNX0VOQ09ERVJfU3RydWN0SW5pdChMTF9USU1fRU5DT0RFUl9Jbml0VHlwZURlZiAqVElNX0VuY29kZXJJbml0U3RydWN0KTsKK0Vycm9yU3RhdHVzIExMX1RJTV9FTkNPREVSX0luaXQoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9FTkNPREVSX0luaXRUeXBlRGVmICpUSU1fRW5jb2RlckluaXRTdHJ1Y3QpOwordm9pZCBMTF9USU1fSEFMTFNFTlNPUl9TdHJ1Y3RJbml0KExMX1RJTV9IQUxMU0VOU09SX0luaXRUeXBlRGVmICpUSU1fSGFsbFNlbnNvckluaXRTdHJ1Y3QpOworRXJyb3JTdGF0dXMgTExfVElNX0hBTExTRU5TT1JfSW5pdChUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX0hBTExTRU5TT1JfSW5pdFR5cGVEZWYgKlRJTV9IYWxsU2Vuc29ySW5pdFN0cnVjdCk7Cit2b2lkIExMX1RJTV9CRFRSX1N0cnVjdEluaXQoTExfVElNX0JEVFJfSW5pdFR5cGVEZWYgKlRJTV9CRFRSSW5pdFN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9USU1fQkRUUl9Jbml0KFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fQkRUUl9Jbml0VHlwZURlZiAqVElNX0JEVFJJbml0U3RydWN0KTsKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBUSU0xIHx8IFRJTTIgfHwgVElNMyB8fCBUSU00IHx8IFRJTTUgfHwgVElNNiB8fCBUSU03IHx8IFRJTTggfHwgVElNMTIgfHwgVElNMTMgfHwgVElNMTQgfHwgVElNMTUgfHwgVElNMTYgfHwgVElNMTcgfHwgVElNMTggfHwgVElNMTkgfHwgVElNMjAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJGM3h4X0xMX1RJTV9IICovCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjN4eF9sbF91c2FydC5oIGIvSW5jL3N0bTMyZjN4eF9sbF91c2FydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ODZhMjMKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2xsX3VzYXJ0LmgKQEAgLTAsMCArMSwzNjQ1IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2xsX3VzYXJ0LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFVTQVJUIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJGM3h4X0xMX1VTQVJUX0gKKyNkZWZpbmUgX19TVE0zMkYzeHhfTExfVVNBUlRfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKFVTQVJUMSkgfHwgZGVmaW5lZCAoVVNBUlQyKSB8fCBkZWZpbmVkIChVU0FSVDMpIHx8IGRlZmluZWQgKFVBUlQ0KSB8fCBkZWZpbmVkIChVQVJUNSkKKworLyoqIEBkZWZncm91cCBVU0FSVF9MTCBVU0FSVAorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9Qcml2YXRlX0NvbnN0YW50cyBVU0FSVCBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBVU0FSVF9MTF9Qcml2YXRlX01hY3JvcyBVU0FSVCBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRVNfSU5JVCBVU0FSVCBFeHBvcnRlZCBJbml0IHN0cnVjdHVyZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgTEwgVVNBUlQgSW5pdCBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQmF1ZFJhdGU7ICAgICAgICAgICAgICAgICAgLyohPCBUaGlzIGZpZWxkIGRlZmluZXMgZXhwZWN0ZWQgVXNhcnQgY29tbXVuaWNhdGlvbiBiYXVkIHJhdGUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1VTQVJUX1NldEJhdWRSYXRlKCkuKi8KKworICB1aW50MzJfdCBEYXRhV2lkdGg7ICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRhdGEgYml0cyB0cmFuc21pdHRlZCBvciByZWNlaXZlZCBpbiBhIGZyYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfTExfRUNfREFUQVdJRFRILgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9VU0FSVF9TZXREYXRhV2lkdGgoKS4qLworCisgIHVpbnQzMl90IFN0b3BCaXRzOyAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc3RvcCBiaXRzIHRyYW5zbWl0dGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfTExfRUNfU1RPUEJJVFMuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1VTQVJUX1NldFN0b3BCaXRzTGVuZ3RoKCkuKi8KKworICB1aW50MzJfdCBQYXJpdHk7ICAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcGFyaXR5IG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9MTF9FQ19QQVJJVFkuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1VTQVJUX1NldFBhcml0eSgpLiovCisKKyAgdWludDMyX3QgVHJhbnNmZXJEaXJlY3Rpb247ICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgUmVjZWl2ZSBhbmQvb3IgVHJhbnNtaXQgbW9kZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfTExfRUNfRElSRUNUSU9OLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9VU0FSVF9TZXRUcmFuc2ZlckRpcmVjdGlvbigpLiovCisKKyAgdWludDMyX3QgSGFyZHdhcmVGbG93Q29udHJvbDsgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgaGFyZHdhcmUgZmxvdyBjb250cm9sIG1vZGUgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVTQVJUX0xMX0VDX0hXQ09OVFJPTC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVVNBUlRfU2V0SFdGbG93Q3RybCgpLiovCisKKyAgdWludDMyX3QgT3ZlclNhbXBsaW5nOyAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciBVU0FSVCBvdmVyc2FtcGxpbmcgbW9kZSBpcyAxNiBvciA4LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfTExfRUNfT1ZFUlNBTVBMSU5HLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9VU0FSVF9TZXRPdmVyU2FtcGxpbmcoKS4qLworCit9IExMX1VTQVJUX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgTEwgVVNBUlQgQ2xvY2sgSW5pdCBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQ2xvY2tPdXRwdXQ7ICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgVVNBUlQgY2xvY2sgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVTQVJUX0xMX0VDX0NMT0NLLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlQgSFcgY29uZmlndXJhdGlvbiBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVVNBUlRfRW5hYmxlU0NMS091dHB1dCgpIG9yIEByZWYgTExfVVNBUlRfRGlzYWJsZVNDTEtPdXRwdXQoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgbW9yZSBkZXRhaWxzLCByZWZlciB0byBkZXNjcmlwdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLiAqLworCisgIHVpbnQzMl90IENsb2NrUG9sYXJpdHk7ICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzdGVhZHkgc3RhdGUgb2YgdGhlIHNlcmlhbCBjbG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVTQVJUX0xMX0VDX1BPTEFSSVRZLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlQgSFcgY29uZmlndXJhdGlvbiBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9ucyBAcmVmIExMX1VTQVJUX1NldENsb2NrUG9sYXJpdHkoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgbW9yZSBkZXRhaWxzLCByZWZlciB0byBkZXNjcmlwdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLiAqLworCisgIHVpbnQzMl90IENsb2NrUGhhc2U7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjbG9jayB0cmFuc2l0aW9uIG9uIHdoaWNoIHRoZSBiaXQgY2FwdHVyZSBpcyBtYWRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfTExfRUNfUEhBU0UuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVCBIVyBjb25maWd1cmF0aW9uIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb25zIEByZWYgTExfVVNBUlRfU2V0Q2xvY2tQaGFzZSgpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBtb3JlIGRldGFpbHMsIHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHRoaXMgZnVuY3Rpb24uICovCisKKyAgdWludDMyX3QgTGFzdEJpdENsb2NrUHVsc2U7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgY2xvY2sgcHVsc2UgY29ycmVzcG9uZGluZyB0byB0aGUgbGFzdCB0cmFuc21pdHRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgYml0IChNU0IpIGhhcyB0byBiZSBvdXRwdXQgb24gdGhlIFNDTEsgcGluIGluIHN5bmNocm9ub3VzIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9MTF9FQ19MQVNUQ0xLUFVMU0UuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVCBIVyBjb25maWd1cmF0aW9uIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb25zIEByZWYgTExfVVNBUlRfU2V0TGFzdENsa1B1bHNlT3V0cHV0KCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIG1vcmUgZGV0YWlscywgcmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgdGhpcyBmdW5jdGlvbi4gKi8KKworfSBMTF9VU0FSVF9DbG9ja0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FeHBvcnRlZF9Db25zdGFudHMgVVNBUlQgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19DTEVBUl9GTEFHIENsZWFyIEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1VTQVJUX1dyaXRlUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVNBUlRfSUNSX1BFQ0YgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9QRUNGICAgICAgICAgICAgICAgIC8qITwgUGFyaXR5IGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSUNSX0ZFQ0YgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9GRUNGICAgICAgICAgICAgICAgIC8qITwgRnJhbWluZyBlcnJvciBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lDUl9OQ0YgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfTkNGICAgICAgICAgICAgICAgICAvKiE8IE5vaXNlIGRldGVjdGVkIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSUNSX09SRUNGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9PUkVDRiAgICAgICAgICAgICAgIC8qITwgT3ZlcnJ1biBlcnJvciBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lDUl9JRExFQ0YgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfSURMRUNGICAgICAgICAgICAgICAvKiE8IElkbGUgbGluZSBkZXRlY3RlZCBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lDUl9UQ0NGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfVENDRiAgICAgICAgICAgICAgICAvKiE8IFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lDUl9MQkRDRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfTEJEQ0YgICAgICAgICAgICAgICAvKiE8IExJTiBicmVhayBkZXRlY3Rpb24gZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JQ1JfQ1RTQ0YgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX0NUU0NGICAgICAgICAgICAgICAgLyohPCBDVFMgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JQ1JfUlRPQ0YgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX1JUT0NGICAgICAgICAgICAgICAgLyohPCBSZWNlaXZlciB0aW1lb3V0IGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSUNSX0VPQkNGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9FT0JDRiAgICAgICAgICAgICAgIC8qITwgRW5kIG9mIGJsb2NrIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSUNSX0NNQ0YgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9DTUNGICAgICAgICAgICAgICAgIC8qITwgQ2hhcmFjdGVyIG1hdGNoIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSUNSX1dVQ0YgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9XVUNGICAgICAgICAgICAgICAgIC8qITwgV2FrZXVwIGZyb20gU3RvcCBtb2RlIGZsYWcgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfR0VUX0ZMQUcgR2V0IEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1VTQVJUX1JlYWRSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfUEUgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1BFICAgICAgICAgICAgICAgICAgLyohPCBQYXJpdHkgZXJyb3IgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfRkUgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0ZFICAgICAgICAgICAgICAgICAgLyohPCBGcmFtaW5nIGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX05FICAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9ORSAgICAgICAgICAgICAgICAgIC8qITwgTm9pc2UgZGV0ZWN0ZWQgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfT1JFICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX09SRSAgICAgICAgICAgICAgICAgLyohPCBPdmVycnVuIGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX0lETEUgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9JRExFICAgICAgICAgICAgICAgIC8qITwgSWRsZSBsaW5lIGRldGVjdGVkIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX1JYTkUgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9SWE5FICAgICAgICAgICAgICAgIC8qITwgUmVhZCBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9UQyAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVEMgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9UWEUgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVFhFICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfTEJERiAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0xCREYgICAgICAgICAgICAgICAgLyohPCBMSU4gYnJlYWsgZGV0ZWN0aW9uIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX0NUU0lGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9DVFNJRiAgICAgICAgICAgICAgIC8qITwgQ1RTIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9DVFMgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfQ1RTICAgICAgICAgICAgICAgICAvKiE8IENUUyBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9SVE9GICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUlRPRiAgICAgICAgICAgICAgICAvKiE8IFJlY2VpdmVyIHRpbWVvdXQgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfRU9CRiAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0VPQkYgICAgICAgICAgICAgICAgLyohPCBFbmQgb2YgYmxvY2sgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfQUJSRSAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0FCUkUgICAgICAgICAgICAgICAgLyohPCBBdXRvIGJhdWQgcmF0ZSBlcnJvciBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9BQlJGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfQUJSRiAgICAgICAgICAgICAgICAvKiE8IEF1dG8gYmF1ZCByYXRlIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX0JVU1kgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9CVVNZICAgICAgICAgICAgICAgIC8qITwgQnVzeSBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9DTUYgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfQ01GICAgICAgICAgICAgICAgICAvKiE8IENoYXJhY3RlciBtYXRjaCBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9TQktGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfU0JLRiAgICAgICAgICAgICAgICAvKiE8IFNlbmQgYnJlYWsgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfUldVICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1JXVSAgICAgICAgICAgICAgICAgLyohPCBSZWNlaXZlciB3YWtldXAgZnJvbSBNdXRlIG1vZGUgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfV1VGICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1dVRiAgICAgICAgICAgICAgICAgLyohPCBXYWtldXAgZnJvbSBTdG9wIG1vZGUgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfVEVBQ0sgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RFQUNLICAgICAgICAgICAgICAgLyohPCBUcmFuc21pdCBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfUkVBQ0sgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1JFQUNLICAgICAgICAgICAgICAgLyohPCBSZWNlaXZlIGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0lUIElUIERlZmluZXMKKyAgKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1VTQVJUX1JlYWRSZWcgYW5kICBMTF9VU0FSVF9Xcml0ZVJlZyBmdW5jdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9DUjFfSURMRUlFICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX0lETEVJRSAgICAgICAgICAgICAgLyohPCBJRExFIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVVNBUlRfQ1IxX1JYTkVJRSAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9SWE5FSUUgICAgICAgICAgICAgIC8qITwgUmVhZCBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSMV9UQ0lFICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfVENJRSAgICAgICAgICAgICAgICAvKiE8IFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSMV9UWEVJRSAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfVFhFSUUgICAgICAgICAgICAgICAvKiE8IFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9VU0FSVF9DUjFfUEVJRSAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1BFSUUgICAgICAgICAgICAgICAgLyohPCBQYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgTExfVVNBUlRfQ1IxX0NNSUUgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9DTUlFICAgICAgICAgICAgICAgIC8qITwgQ2hhcmFjdGVyIG1hdGNoIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVVNBUlRfQ1IxX1JUT0lFICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9SVE9JRSAgICAgICAgICAgICAgIC8qITwgUmVjZWl2ZXIgdGltZW91dCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSMV9FT0JJRSAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfRU9CSUUgICAgICAgICAgICAgICAvKiE8IEVuZCBvZiBCbG9jayBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSMl9MQkRJRSAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjJfTEJESUUgICAgICAgICAgICAgICAvKiE8IExJTiBicmVhayBkZXRlY3Rpb24gaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9VU0FSVF9DUjNfRUlFICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IzX0VJRSAgICAgICAgICAgICAgICAgLyohPCBFcnJvciBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSM19DVFNJRSAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfQ1RTSUUgICAgICAgICAgICAgICAvKiE8IENUUyBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSM19XVUZJRSAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfV1VGSUUgICAgICAgICAgICAgICAvKiE8IFdha2V1cCBmcm9tIFN0b3AgbW9kZSBpbnRlcnJ1cHQgZW5hYmxlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0RJUkVDVElPTiBDb21tdW5pY2F0aW9uIERpcmVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0RJUkVDVElPTl9OT05FICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNtaXR0ZXIgYW5kIFJlY2VpdmVyIGFyZSBkaXNhYmxlZCAqLworI2RlZmluZSBMTF9VU0FSVF9ESVJFQ1RJT05fUlggICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1JFICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zbWl0dGVyIGlzIGRpc2FibGVkIGFuZCBSZWNlaXZlciBpcyBlbmFibGVkICovCisjZGVmaW5lIExMX1VTQVJUX0RJUkVDVElPTl9UWCAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfVEUgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNtaXR0ZXIgaXMgZW5hYmxlZCBhbmQgUmVjZWl2ZXIgaXMgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTExfVVNBUlRfRElSRUNUSU9OX1RYX1JYICAgICAgICAgICAgICAgIChVU0FSVF9DUjFfVEUgfFVTQVJUX0NSMV9SRSkgICAgICAgLyohPCBUcmFuc21pdHRlciBhbmQgUmVjZWl2ZXIgYXJlIGVuYWJsZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfUEFSSVRZIFBhcml0eSBDb250cm9sCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVNBUlRfUEFSSVRZX05PTkUgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBhcml0eSBjb250cm9sIGRpc2FibGVkICovCisjZGVmaW5lIExMX1VTQVJUX1BBUklUWV9FVkVOICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfUENFICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQYXJpdHkgY29udHJvbCBlbmFibGVkIGFuZCBFdmVuIFBhcml0eSBpcyBzZWxlY3RlZCAqLworI2RlZmluZSBMTF9VU0FSVF9QQVJJVFlfT0REICAgICAgICAgICAgICAgICAgICAgKFVTQVJUX0NSMV9QQ0UgfCBVU0FSVF9DUjFfUFMpICAgICAgIC8qITwgUGFyaXR5IGNvbnRyb2wgZW5hYmxlZCBhbmQgT2RkIFBhcml0eSBpcyBzZWxlY3RlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19XQUtFVVAgV2FrZXVwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVNBUlRfV0FLRVVQX0lETEVMSU5FICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8ICBVU0FSVCB3YWtlIHVwIGZyb20gTXV0ZSBtb2RlIG9uIElkbGUgTGluZSAqLworI2RlZmluZSBMTF9VU0FSVF9XQUtFVVBfQUREUkVTU01BUksgICAgICAgICAgICAgVVNBUlRfQ1IxX1dBS0UgICAgICAgIC8qITwgIFVTQVJUIHdha2UgdXAgZnJvbSBNdXRlIG1vZGUgb24gQWRkcmVzcyBNYXJrICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0RBVEFXSURUSCBEYXRhd2lkdGgKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoVVNBUlRfN0JJVFNfU1VQUE9SVCkKKyNkZWZpbmUgTExfVVNBUlRfREFUQVdJRFRIXzdCICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9NMSAgICAgICAgICAgIC8qITwgNyBiaXRzIHdvcmQgbGVuZ3RoIDogU3RhcnQgYml0LCA3IGRhdGEgYml0cywgbiBzdG9wIGJpdHMgKi8KKyNkZWZpbmUgTExfVVNBUlRfREFUQVdJRFRIXzhCICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgOCBiaXRzIHdvcmQgbGVuZ3RoIDogU3RhcnQgYml0LCA4IGRhdGEgYml0cywgbiBzdG9wIGJpdHMgKi8KKyNkZWZpbmUgTExfVVNBUlRfREFUQVdJRFRIXzlCICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9NMCAgICAgICAgICAgIC8qITwgOSBiaXRzIHdvcmQgbGVuZ3RoIDogU3RhcnQgYml0LCA5IGRhdGEgYml0cywgbiBzdG9wIGJpdHMgKi8KKyNlbHNlCisjZGVmaW5lIExMX1VTQVJUX0RBVEFXSURUSF84QiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IDggYml0cyB3b3JkIGxlbmd0aCA6IFN0YXJ0IGJpdCwgOCBkYXRhIGJpdHMsIG4gc3RvcCBiaXRzICovCisjZGVmaW5lIExMX1VTQVJUX0RBVEFXSURUSF85QiAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfTSAgICAgICAgICAgICAvKiE8IDkgYml0cyB3b3JkIGxlbmd0aCA6IFN0YXJ0IGJpdCwgOSBkYXRhIGJpdHMsIG4gc3RvcCBiaXRzICovCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfT1ZFUlNBTVBMSU5HIE92ZXJzYW1wbGluZworICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX09WRVJTQU1QTElOR18xNiAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgIC8qITwgT3ZlcnNhbXBsaW5nIGJ5IDE2ICovCisjZGVmaW5lIExMX1VTQVJUX09WRVJTQU1QTElOR184ICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfT1ZFUjggICAgICAgIC8qITwgT3ZlcnNhbXBsaW5nIGJ5IDggKi8KKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfQ0xPQ0sgQ2xvY2sgU2lnbmFsCisgICogQHsKKyAgKi8KKworI2RlZmluZSBMTF9VU0FSVF9DTE9DS19ESVNBQkxFICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAvKiE8IENsb2NrIHNpZ25hbCBub3QgcHJvdmlkZWQgKi8KKyNkZWZpbmUgTExfVVNBUlRfQ0xPQ0tfRU5BQkxFICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMl9DTEtFTiAgICAgICAgLyohPCBDbG9jayBzaWduYWwgcHJvdmlkZWQgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLypVU0VfRlVMTF9MTF9EUklWRVIqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0xBU1RDTEtQVUxTRSBMYXN0IENsb2NrIFB1bHNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVNBUlRfTEFTVENMS1BVTFNFX05PX09VVFBVVCAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IFRoZSBjbG9jayBwdWxzZSBvZiB0aGUgbGFzdCBkYXRhIGJpdCBpcyBub3Qgb3V0cHV0IHRvIHRoZSBTQ0xLIHBpbiAqLworI2RlZmluZSBMTF9VU0FSVF9MQVNUQ0xLUFVMU0VfT1VUUFVUICAgICAgICAgICAgVVNBUlRfQ1IyX0xCQ0wgICAgICAgIC8qITwgVGhlIGNsb2NrIHB1bHNlIG9mIHRoZSBsYXN0IGRhdGEgYml0IGlzIG91dHB1dCB0byB0aGUgU0NMSyBwaW4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfUEhBU0UgQ2xvY2sgUGhhc2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9QSEFTRV8xRURHRSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgVGhlIGZpcnN0IGNsb2NrIHRyYW5zaXRpb24gaXMgdGhlIGZpcnN0IGRhdGEgY2FwdHVyZSBlZGdlICovCisjZGVmaW5lIExMX1VTQVJUX1BIQVNFXzJFREdFICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjJfQ1BIQSAgICAgICAgLyohPCBUaGUgc2Vjb25kIGNsb2NrIHRyYW5zaXRpb24gaXMgdGhlIGZpcnN0IGRhdGEgY2FwdHVyZSBlZGdlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX1BPTEFSSVRZIENsb2NrIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVNBUlRfUE9MQVJJVFlfTE9XICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IFN0ZWFkeSBsb3cgdmFsdWUgb24gU0NMSyBwaW4gb3V0c2lkZSB0cmFuc21pc3Npb24gd2luZG93Ki8KKyNkZWZpbmUgTExfVVNBUlRfUE9MQVJJVFlfSElHSCAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMl9DUE9MICAgICAgICAvKiE8IFN0ZWFkeSBoaWdoIHZhbHVlIG9uIFNDTEsgcGluIG91dHNpZGUgdHJhbnNtaXNzaW9uIHdpbmRvdyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19TVE9QQklUUyBTdG9wIEJpdHMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9TVE9QQklUU18wXzUgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IyX1NUT1BfMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgMC41IHN0b3AgYml0ICovCisjZGVmaW5lIExMX1VTQVJUX1NUT1BCSVRTXzEgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAxIHN0b3AgYml0ICovCisjZGVmaW5lIExMX1VTQVJUX1NUT1BCSVRTXzFfNSAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IyX1NUT1BfMCB8IFVTQVJUX0NSMl9TVE9QXzEpICAgICAgLyohPCAxLjUgc3RvcCBiaXRzICovCisjZGVmaW5lIExMX1VTQVJUX1NUT1BCSVRTXzIgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjJfU1RPUF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAyIHN0b3AgYml0cyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19UWFJYIFRYIFJYIFBpbnMgU3dhcAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX1RYUlhfU1RBTkRBUkQgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBUWC9SWCBwaW5zIGFyZSB1c2VkIGFzIGRlZmluZWQgaW4gc3RhbmRhcmQgcGlub3V0ICovCisjZGVmaW5lIExMX1VTQVJUX1RYUlhfU1dBUFBFRCAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IyX1NXQVApICAgICAgLyohPCBUWCBhbmQgUlggcGlucyBmdW5jdGlvbnMgYXJlIHN3YXBwZWQuICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX1JYUElOX0xFVkVMIFJYIFBpbiBBY3RpdmUgTGV2ZWwgSW52ZXJzaW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVNBUlRfUlhQSU5fTEVWRUxfU1RBTkRBUkQgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IFJYIHBpbiBzaWduYWwgd29ya3MgdXNpbmcgdGhlIHN0YW5kYXJkIGxvZ2ljIGxldmVscyAqLworI2RlZmluZSBMTF9VU0FSVF9SWFBJTl9MRVZFTF9JTlZFUlRFRCAgICAgICAgICAgKFVTQVJUX0NSMl9SWElOVikgICAgIC8qITwgUlggcGluIHNpZ25hbCB2YWx1ZXMgYXJlIGludmVydGVkLiAgICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX1RYUElOX0xFVkVMIFRYIFBpbiBBY3RpdmUgTGV2ZWwgSW52ZXJzaW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVNBUlRfVFhQSU5fTEVWRUxfU1RBTkRBUkQgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IFRYIHBpbiBzaWduYWwgd29ya3MgdXNpbmcgdGhlIHN0YW5kYXJkIGxvZ2ljIGxldmVscyAqLworI2RlZmluZSBMTF9VU0FSVF9UWFBJTl9MRVZFTF9JTlZFUlRFRCAgICAgICAgICAgKFVTQVJUX0NSMl9UWElOVikgICAgIC8qITwgVFggcGluIHNpZ25hbCB2YWx1ZXMgYXJlIGludmVydGVkLiAgICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0JJTkFSWV9MT0dJQyBCaW5hcnkgRGF0YSBJbnZlcnNpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9CSU5BUllfTE9HSUNfUE9TSVRJVkUgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgTG9naWNhbCBkYXRhIGZyb20gdGhlIGRhdGEgcmVnaXN0ZXIgYXJlIHNlbmQvcmVjZWl2ZWQgaW4gcG9zaXRpdmUvZGlyZWN0IGxvZ2ljLiAoMT1ILCAwPUwpICovCisjZGVmaW5lIExMX1VTQVJUX0JJTkFSWV9MT0dJQ19ORUdBVElWRSAgICAgICAgICBVU0FSVF9DUjJfREFUQUlOViAgICAgLyohPCBMb2dpY2FsIGRhdGEgZnJvbSB0aGUgZGF0YSByZWdpc3RlciBhcmUgc2VuZC9yZWNlaXZlZCBpbiBuZWdhdGl2ZS9pbnZlcnNlIGxvZ2ljLiAoMT1MLCAwPUgpLiBUaGUgcGFyaXR5IGJpdCBpcyBhbHNvIGludmVydGVkLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19CSVRPUkRFUiBCaXQgT3JkZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9CSVRPUkRFUl9MU0JGSVJTVCAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgZGF0YSBpcyB0cmFuc21pdHRlZC9yZWNlaXZlZCB3aXRoIGRhdGEgYml0IDAgZmlyc3QsIGZvbGxvd2luZyB0aGUgc3RhcnQgYml0ICovCisjZGVmaW5lIExMX1VTQVJUX0JJVE9SREVSX01TQkZJUlNUICAgICAgICAgICAgICBVU0FSVF9DUjJfTVNCRklSU1QgICAgLyohPCBkYXRhIGlzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggdGhlIE1TQiBmaXJzdCwgZm9sbG93aW5nIHRoZSBzdGFydCBiaXQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfQVVUT0JBVURfREVURUNUX09OIEF1dG9iYXVkIERldGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0FVVE9CQVVEX0RFVEVDVF9PTl9TVEFSVEJJVCAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWVhc3VyZW1lbnQgb2YgdGhlIHN0YXJ0IGJpdCBpcyB1c2VkIHRvIGRldGVjdCB0aGUgYmF1ZCByYXRlICovCisjZGVmaW5lIExMX1VTQVJUX0FVVE9CQVVEX0RFVEVDVF9PTl9GQUxMSU5HRURHRSBVU0FSVF9DUjJfQUJSTU9ERV8wICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRmFsbGluZyBlZGdlIHRvIGZhbGxpbmcgZWRnZSBtZWFzdXJlbWVudC4gUmVjZWl2ZWQgZnJhbWUgbXVzdCBzdGFydCB3aXRoIGEgc2luZ2xlIGJpdCA9IDEgLT4gRnJhbWUgPSBTdGFydDEweHh4eHh4ICovCisjZGVmaW5lIExMX1VTQVJUX0FVVE9CQVVEX0RFVEVDVF9PTl83Rl9GUkFNRSAgICBVU0FSVF9DUjJfQUJSTU9ERV8xICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgMHg3RiBmcmFtZSBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OXzU1X0ZSQU1FICAgIChVU0FSVF9DUjJfQUJSTU9ERV8xIHwgVVNBUlRfQ1IyX0FCUk1PREVfMCkgLyohPCAweDU1IGZyYW1lIGRldGVjdGlvbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19BRERSRVNTX0RFVEVDVCBBZGRyZXNzIExlbmd0aCBEZXRlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9BRERSRVNTX0RFVEVDVF80QiAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgNC1iaXQgYWRkcmVzcyBkZXRlY3Rpb24gbWV0aG9kIHNlbGVjdGVkICovCisjZGVmaW5lIExMX1VTQVJUX0FERFJFU1NfREVURUNUXzdCICAgICAgICAgICAgICBVU0FSVF9DUjJfQURETTcgICAgICAgLyohPCA3LWJpdCBhZGRyZXNzIGRldGVjdGlvbiAoaW4gOC1iaXQgZGF0YSBtb2RlKSBtZXRob2Qgc2VsZWN0ZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfSFdDT05UUk9MIEhhcmR3YXJlIENvbnRyb2wKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9IV0NPTlRST0xfTk9ORSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ1RTIGFuZCBSVFMgaGFyZHdhcmUgZmxvdyBjb250cm9sIGRpc2FibGVkICovCisjZGVmaW5lIExMX1VTQVJUX0hXQ09OVFJPTF9SVFMgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfUlRTRSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSVFMgb3V0cHV0IGVuYWJsZWQsIGRhdGEgaXMgb25seSByZXF1ZXN0ZWQgd2hlbiB0aGVyZSBpcyBzcGFjZSBpbiB0aGUgcmVjZWl2ZSBidWZmZXIgKi8KKyNkZWZpbmUgTExfVVNBUlRfSFdDT05UUk9MX0NUUyAgICAgICAgICAgICAgICAgIFVTQVJUX0NSM19DVFNFICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENUUyBtb2RlIGVuYWJsZWQsIGRhdGEgaXMgb25seSB0cmFuc21pdHRlZCB3aGVuIHRoZSBuQ1RTIGlucHV0IGlzIGFzc2VydGVkICh0aWVkIHRvIDApICovCisjZGVmaW5lIExMX1VTQVJUX0hXQ09OVFJPTF9SVFNfQ1RTICAgICAgICAgICAgICAoVVNBUlRfQ1IzX1JUU0UgfCBVU0FSVF9DUjNfQ1RTRSkgICAgLyohPCBDVFMgYW5kIFJUUyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgZW5hYmxlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19XQUtFVVBfT04gV2FrZXVwIEFjdGl2YXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9XQUtFVVBfT05fQUREUkVTUyAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV2FrZSB1cCBhY3RpdmUgb24gYWRkcmVzcyBtYXRjaCAqLworI2RlZmluZSBMTF9VU0FSVF9XQUtFVVBfT05fU1RBUlRCSVQgICAgICAgICAgICAgVVNBUlRfQ1IzX1dVU18xICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV2FrZSB1cCBhY3RpdmUgb24gU3RhcnQgYml0IGRldGVjdGlvbiAqLworI2RlZmluZSBMTF9VU0FSVF9XQUtFVVBfT05fUlhORSAgICAgICAgICAgICAgICAgKFVTQVJUX0NSM19XVVNfMCB8IFVTQVJUX0NSM19XVVNfMSkgICAgIC8qITwgV2FrZSB1cCBhY3RpdmUgb24gUlhORSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19JUkRBX1BPV0VSIElyREEgUG93ZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9JUkRBX1BPV0VSX05PUk1BTCAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgSXJEQSBub3JtYWwgcG93ZXIgbW9kZSAqLworI2RlZmluZSBMTF9VU0FSVF9JUkRBX1BPV0VSX0xPVyAgICAgICAgICAgICAgICAgVVNBUlRfQ1IzX0lSTFAgICAgICAgIC8qITwgSXJEQSBsb3cgcG93ZXIgbW9kZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19MSU5CUkVBS19ERVRFQ1QgTElOIEJyZWFrIERldGVjdGlvbiBMZW5ndGgKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9MSU5CUkVBS19ERVRFQ1RfMTBCICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgMTAtYml0IGJyZWFrIGRldGVjdGlvbiBtZXRob2Qgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgTExfVVNBUlRfTElOQlJFQUtfREVURUNUXzExQiAgICAgICAgICAgIFVTQVJUX0NSMl9MQkRMICAgICAgICAvKiE8IDExLWJpdCBicmVhayBkZXRlY3Rpb24gbWV0aG9kIHNlbGVjdGVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0RFX1BPTEFSSVRZIERyaXZlciBFbmFibGUgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9ERV9QT0xBUklUWV9ISUdIICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgREUgc2lnbmFsIGlzIGFjdGl2ZSBoaWdoICovCisjZGVmaW5lIExMX1VTQVJUX0RFX1BPTEFSSVRZX0xPVyAgICAgICAgICAgICAgICBVU0FSVF9DUjNfREVQICAgICAgICAgLyohPCBERSBzaWduYWwgaXMgYWN0aXZlIGxvdyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19ETUFfUkVHX0RBVEEgRE1BIFJlZ2lzdGVyIERhdGEKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9ETUFfUkVHX0RBVEFfVFJBTlNNSVQgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgLyohPCBHZXQgYWRkcmVzcyBvZiBkYXRhIHJlZ2lzdGVyIHVzZWQgZm9yIHRyYW5zbWlzc2lvbiAqLworI2RlZmluZSBMTF9VU0FSVF9ETUFfUkVHX0RBVEFfUkVDRUlWRSAgICAgICAgICAgMHgwMDAwMDAwMVUgICAgICAgICAgLyohPCBHZXQgYWRkcmVzcyBvZiBkYXRhIHJlZ2lzdGVyIHVzZWQgZm9yIHJlY2VwdGlvbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRXhwb3J0ZWRfTWFjcm9zIFVTQVJUIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRU1fV1JJVEVfUkVBRCBDb21tb24gV3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBVU0FSVCByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9VU0FSVF9Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIFVTQVJUIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfVVNBUlRfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRU1fRXhwb3J0ZWRfTWFjcm9zX0hlbHBlciBFeHBvcnRlZF9NYWNyb3NfSGVscGVyCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDb21wdXRlIFVTQVJURElWIHZhbHVlIGFjY29yZGluZyB0byBQZXJpcGhlcmFsIENsb2NrIGFuZAorICAqICAgICAgICAgZXhwZWN0ZWQgQmF1ZCBSYXRlIGluIDggYml0cyBzYW1wbGluZyBtb2RlICgzMiBiaXRzIHZhbHVlIG9mIFVTQVJURElWIGlzIHJldHVybmVkKQorICAqIEBwYXJhbSAgX19QRVJJUEhDTEtfXyBQZXJpcGhlcmFsIENsb2NrIGZyZXF1ZW5jeSB1c2VkIGZvciBVU0FSVCBpbnN0YW5jZQorICAqIEBwYXJhbSAgX19CQVVEUkFURV9fIEJhdWQgcmF0ZSB2YWx1ZSB0byBhY2hpZXZlCisgICogQHJldHZhbCBVU0FSVERJViB2YWx1ZSB0byBiZSB1c2VkIGZvciBCUlIgcmVnaXN0ZXIgZmlsbGluZyBpbiBPdmVyU2FtcGxpbmdfOCBjYXNlCisgICovCisjZGVmaW5lIF9fTExfVVNBUlRfRElWX1NBTVBMSU5HOChfX1BFUklQSENMS19fLCBfX0JBVURSQVRFX18pICgoKChfX1BFUklQSENMS19fKSoyKSArICgoX19CQVVEUkFURV9fKS8yKSkvKF9fQkFVRFJBVEVfXykpCisKKy8qKgorICAqIEBicmllZiAgQ29tcHV0ZSBVU0FSVERJViB2YWx1ZSBhY2NvcmRpbmcgdG8gUGVyaXBoZXJhbCBDbG9jayBhbmQKKyAgKiAgICAgICAgIGV4cGVjdGVkIEJhdWQgUmF0ZSBpbiAxNiBiaXRzIHNhbXBsaW5nIG1vZGUgKDMyIGJpdHMgdmFsdWUgb2YgVVNBUlRESVYgaXMgcmV0dXJuZWQpCisgICogQHBhcmFtICBfX1BFUklQSENMS19fIFBlcmlwaGVyYWwgQ2xvY2sgZnJlcXVlbmN5IHVzZWQgZm9yIFVTQVJUIGluc3RhbmNlCisgICogQHBhcmFtICBfX0JBVURSQVRFX18gQmF1ZCByYXRlIHZhbHVlIHRvIGFjaGlldmUKKyAgKiBAcmV0dmFsIFVTQVJURElWIHZhbHVlIHRvIGJlIHVzZWQgZm9yIEJSUiByZWdpc3RlciBmaWxsaW5nIGluIE92ZXJTYW1wbGluZ18xNiBjYXNlCisgICovCisjZGVmaW5lIF9fTExfVVNBUlRfRElWX1NBTVBMSU5HMTYoX19QRVJJUEhDTEtfXywgX19CQVVEUkFURV9fKSAoKChfX1BFUklQSENMS19fKSArICgoX19CQVVEUkFURV9fKS8yKSkvKF9fQkFVRFJBVEVfXykpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIFVTQVJUIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUZfQ29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgVVNBUlQgRW5hYmxlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVUUgICAgICAgICAgICBMTF9VU0FSVF9FbmFibGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1VFKTsKK30KKworLyoqCisgICogQGJyaWVmICBVU0FSVCBEaXNhYmxlIChhbGwgVVNBUlQgcHJlc2NhbGVycyBhbmQgb3V0cHV0cyBhcmUgZGlzYWJsZWQpCisgICogQG5vdGUgICBXaGVuIFVTQVJUIGlzIGRpc2FibGVkLCBVU0FSVCBwcmVzY2FsZXJzIGFuZCBvdXRwdXRzIGFyZSBzdG9wcGVkIGltbWVkaWF0ZWx5LAorICAqICAgICAgICAgYW5kIGN1cnJlbnQgb3BlcmF0aW9ucyBhcmUgZGlzY2FyZGVkLiBUaGUgY29uZmlndXJhdGlvbiBvZiB0aGUgVVNBUlQgaXMga2VwdCwgYnV0IGFsbCB0aGUgc3RhdHVzCisgICogICAgICAgICBmbGFncywgaW4gdGhlIFVTQVJUeF9JU1IgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBVRSAgICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1VFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBVU0FSVCBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVUUgICAgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9VRSkgPT0gKFVTQVJUX0NSMV9VRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQVJUIGVuYWJsZWQgaW4gU1RPUCBNb2RlLgorICAqIEBub3RlICAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGVuYWJsZWQsIFVTQVJUIGlzIGFibGUgdG8gd2FrZSB1cCB0aGUgTUNVIGZyb20gU3RvcCBtb2RlLCBwcm92aWRlZCB0aGF0CisgICogICAgICAgICBVU0FSVCBjbG9jayBzZWxlY3Rpb24gaXMgSFNJIG9yIExTRSBpbiBSQ0MuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFdha2UtdXAgZnJvbSBTdG9wIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBVRVNNICAgICAgICAgIExMX1VTQVJUX0VuYWJsZUluU3RvcE1vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSW5TdG9wTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9VRVNNKTsKK30KKworLyoqCisgICogQGJyaWVmICBVU0FSVCBkaXNhYmxlZCBpbiBTVE9QIE1vZGUuCisgICogQG5vdGUgICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgZGlzYWJsZWQsIFVTQVJUIGlzIG5vdCBhYmxlIHRvIHdha2UgdXAgdGhlIE1DVSBmcm9tIFN0b3AgbW9kZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBXYWtlLXVwIGZyb20gU3RvcCBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVUVTTSAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSW5TdG9wTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSW5TdG9wTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1VFU00pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIFVTQVJUIGlzIGVuYWJsZWQgaW4gU1RPUCBNb2RlIChhYmxlIHRvIHdha2UgdXAgTUNVIGZyb20gU3RvcCBtb2RlIG9yIG5vdCkKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgV2FrZS11cCBmcm9tIFN0b3AgbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVFU00gICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSW5TdG9wTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSW5TdG9wTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9VRVNNKSA9PSAoVVNBUlRfQ1IxX1VFU00pKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlciBFbmFibGUgKFJlY2VpdmVyIGlzIGVuYWJsZWQgYW5kIGJlZ2lucyBzZWFyY2hpbmcgZm9yIGEgc3RhcnQgYml0KQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJFICAgICAgICAgICAgTExfVVNBUlRfRW5hYmxlRGlyZWN0aW9uUngKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlRGlyZWN0aW9uUngoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUkUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmVyIERpc2FibGUKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSRSAgICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVEaXJlY3Rpb25SeAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlRGlyZWN0aW9uUngoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXR0ZXIgRW5hYmxlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVEUgICAgICAgICAgICBMTF9VU0FSVF9FbmFibGVEaXJlY3Rpb25UeAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVEaXJlY3Rpb25UeChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9URSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXR0ZXIgRGlzYWJsZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRFICAgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZURpcmVjdGlvblR4CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVEaXJlY3Rpb25UeChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1RFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgc2ltdWx0YW5lb3VzbHkgZW5hYmxlZC9kaXNhYmxlZCBzdGF0ZXMKKyAgKiAgICAgICAgIG9mIFRyYW5zbWl0dGVyIGFuZCBSZWNlaXZlcgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJFICAgICAgICAgICAgTExfVVNBUlRfU2V0VHJhbnNmZXJEaXJlY3Rpb25cbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIFRFICAgICAgICAgICAgTExfVVNBUlRfU2V0VHJhbnNmZXJEaXJlY3Rpb24KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVHJhbnNmZXJEaXJlY3Rpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ESVJFQ1RJT05fTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RJUkVDVElPTl9SWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RJUkVDVElPTl9UWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RJUkVDVElPTl9UWF9SWAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0VHJhbnNmZXJEaXJlY3Rpb24oVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBUcmFuc2ZlckRpcmVjdGlvbikKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1JFIHwgVVNBUlRfQ1IxX1RFLCBUcmFuc2ZlckRpcmVjdGlvbik7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGVuYWJsZWQvZGlzYWJsZWQgc3RhdGVzIG9mIFRyYW5zbWl0dGVyIGFuZCBSZWNlaXZlcgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJFICAgICAgICAgICAgTExfVVNBUlRfR2V0VHJhbnNmZXJEaXJlY3Rpb25cbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIFRFICAgICAgICAgICAgTExfVVNBUlRfR2V0VHJhbnNmZXJEaXJlY3Rpb24KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ESVJFQ1RJT05fTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RJUkVDVElPTl9SWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RJUkVDVElPTl9UWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RJUkVDVElPTl9UWF9SWAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFRyYW5zZmVyRGlyZWN0aW9uKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SRSB8IFVTQVJUX0NSMV9URSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBQYXJpdHkgKGVuYWJsZWQvZGlzYWJsZWQgYW5kIHBhcml0eSBtb2RlIGlmIGVuYWJsZWQpLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzZWxlY3RzIGlmIGhhcmR3YXJlIHBhcml0eSBjb250cm9sIChnZW5lcmF0aW9uIGFuZCBkZXRlY3Rpb24pIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogICAgICAgICBXaGVuIHRoZSBwYXJpdHkgY29udHJvbCBpcyBlbmFibGVkIChPZGQgb3IgRXZlbiksIGNvbXB1dGVkIHBhcml0eSBiaXQgaXMgaW5zZXJ0ZWQgYXQgdGhlIE1TQiBwb3NpdGlvbgorICAqICAgICAgICAgKDl0aCBvciA4dGggYml0IGRlcGVuZGluZyBvbiBkYXRhIHdpZHRoKSBhbmQgcGFyaXR5IGlzIGNoZWNrZWQgb24gdGhlIHJlY2VpdmVkIGRhdGEuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUFMgICAgICAgICAgICBMTF9VU0FSVF9TZXRQYXJpdHlcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIFBDRSAgICAgICAgICAgTExfVVNBUlRfU2V0UGFyaXR5CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BBUklUWV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUEFSSVRZX0VWRU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QQVJJVFlfT0RECisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRQYXJpdHkoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBQYXJpdHkpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9QUyB8IFVTQVJUX0NSMV9QQ0UsIFBhcml0eSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFBhcml0eSBjb25maWd1cmF0aW9uIChlbmFibGVkL2Rpc2FibGVkIGFuZCBwYXJpdHkgbW9kZSBpZiBlbmFibGVkKQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBTICAgICAgICAgICAgTExfVVNBUlRfR2V0UGFyaXR5XG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBQQ0UgICAgICAgICAgIExMX1VTQVJUX0dldFBhcml0eQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BBUklUWV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUEFSSVRZX0VWRU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QQVJJVFlfT0RECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0UGFyaXR5KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9QUyB8IFVTQVJUX0NSMV9QQ0UpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgUmVjZWl2ZXIgV2FrZSBVcCBtZXRob2QgZnJvbSBNdXRlIG1vZGUuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgV0FLRSAgICAgICAgICBMTF9VU0FSVF9TZXRXYWtlVXBNZXRob2QKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgTWV0aG9kIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfV0FLRVVQX0lETEVMSU5FCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfV0FLRVVQX0FERFJFU1NNQVJLCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRXYWtlVXBNZXRob2QoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBNZXRob2QpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9XQUtFLCBNZXRob2QpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBSZWNlaXZlciBXYWtlIFVwIG1ldGhvZCBmcm9tIE11dGUgbW9kZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFdBS0UgICAgICAgICAgTExfVVNBUlRfR2V0V2FrZVVwTWV0aG9kCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfV0FLRVVQX0lETEVMSU5FCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfV0FLRVVQX0FERFJFU1NNQVJLCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0V2FrZVVwTWV0aG9kKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9XQUtFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFdvcmQgbGVuZ3RoIChpLmUuIG5iIG9mIGRhdGEgYml0cywgZXhjbHVkaW5nIHN0YXJ0IGFuZCBzdG9wIGJpdHMpCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTTAgICAgICAgICAgICBMTF9VU0FSVF9TZXREYXRhV2lkdGhcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIE0xICAgICAgICAgICAgTExfVVNBUlRfU2V0RGF0YVdpZHRoCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIERhdGFXaWR0aCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RBVEFXSURUSF83QiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfOUIKKyAgKgorICAqICAgICAgICAgKCopIFZhbHVlcyBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXREYXRhV2lkdGgoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBEYXRhV2lkdGgpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9NLCBEYXRhV2lkdGgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBXb3JkIGxlbmd0aCAoaS5lLiBuYiBvZiBkYXRhIGJpdHMsIGV4Y2x1ZGluZyBzdGFydCBhbmQgc3RvcCBiaXRzKQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE0wICAgICAgICAgICAgTExfVVNBUlRfR2V0RGF0YVdpZHRoXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBNMSAgICAgICAgICAgIExMX1VTQVJUX0dldERhdGFXaWR0aAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RBVEFXSURUSF83QiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfOUIKKyAgKgorICAqICAgICAgICAgKCopIFZhbHVlcyBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0RGF0YVdpZHRoKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9NKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWxsb3cgc3dpdGNoIGJldHdlZW4gTXV0ZSBNb2RlIGFuZCBBY3RpdmUgbW9kZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE1NRSAgICAgICAgICAgTExfVVNBUlRfRW5hYmxlTXV0ZU1vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlTXV0ZU1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfTU1FKTsKK30KKworLyoqCisgICogQGJyaWVmICBQcmV2ZW50IE11dGUgTW9kZSB1c2UuIFNldCBSZWNlaXZlciBpbiBhY3RpdmUgbW9kZSBwZXJtYW5lbnRseS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBNTUUgICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVNdXRlTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlTXV0ZU1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9NTUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIHN3aXRjaCBiZXR3ZWVuIE11dGUgTW9kZSBhbmQgQWN0aXZlIG1vZGUgaXMgYWxsb3dlZAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE1NRSAgICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkTXV0ZU1vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZE11dGVNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX01NRSkgPT0gKFVTQVJUX0NSMV9NTUUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgT3ZlcnNhbXBsaW5nIHRvIDgtYml0IG9yIDE2LWJpdCBtb2RlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgT1ZFUjggICAgICAgICBMTF9VU0FSVF9TZXRPdmVyU2FtcGxpbmcKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgT3ZlclNhbXBsaW5nIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldE92ZXJTYW1wbGluZyhVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IE92ZXJTYW1wbGluZykKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX09WRVI4LCBPdmVyU2FtcGxpbmcpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBPdmVyc2FtcGxpbmcgbW9kZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE9WRVI4ICAgICAgICAgTExfVVNBUlRfR2V0T3ZlclNhbXBsaW5nCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzgKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRPdmVyU2FtcGxpbmcoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX09WRVI4KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIGlmIENsb2NrIHB1bHNlIG9mIHRoZSBsYXN0IGRhdGEgYml0IGlzIG91dHB1dCB0byB0aGUgU0NMSyBwaW4gb3Igbm90CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VTQVJUX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFN5bmNocm9ub3VzIG1vZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTEJDTCAgICAgICAgICBMTF9VU0FSVF9TZXRMYXN0Q2xrUHVsc2VPdXRwdXQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgTGFzdEJpdENsb2NrUHVsc2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9MQVNUQ0xLUFVMU0VfTk9fT1VUUFVUCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfTEFTVENMS1BVTFNFX09VVFBVVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0TGFzdENsa1B1bHNlT3V0cHV0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgTGFzdEJpdENsb2NrUHVsc2UpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9MQkNMLCBMYXN0Qml0Q2xvY2tQdWxzZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0cmlldmUgQ2xvY2sgcHVsc2Ugb2YgdGhlIGxhc3QgZGF0YSBiaXQgb3V0cHV0IGNvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgIChMYXN0IGJpdCBDbG9jayBwdWxzZSBvdXRwdXQgdG8gdGhlIFNDTEsgcGluIG9yIG5vdCkKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVVNBUlRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU3luY2hyb25vdXMgbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMQkNMICAgICAgICAgIExMX1VTQVJUX0dldExhc3RDbGtQdWxzZU91dHB1dAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0xBU1RDTEtQVUxTRV9OT19PVVRQVVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9MQVNUQ0xLUFVMU0VfT1VUUFVUCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0TGFzdENsa1B1bHNlT3V0cHV0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9MQkNMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VsZWN0IHRoZSBwaGFzZSBvZiB0aGUgY2xvY2sgb3V0cHV0IG9uIHRoZSBTQ0xLIHBpbiBpbiBzeW5jaHJvbm91cyBtb2RlCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VTQVJUX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFN5bmNocm9ub3VzIG1vZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQ1BIQSAgICAgICAgICBMTF9VU0FSVF9TZXRDbG9ja1BoYXNlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENsb2NrUGhhc2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QSEFTRV8xRURHRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BIQVNFXzJFREdFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRDbG9ja1BoYXNlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgQ2xvY2tQaGFzZSkKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0NQSEEsIENsb2NrUGhhc2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBwaGFzZSBvZiB0aGUgY2xvY2sgb3V0cHV0IG9uIHRoZSBTQ0xLIHBpbiBpbiBzeW5jaHJvbm91cyBtb2RlCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VTQVJUX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFN5bmNocm9ub3VzIG1vZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQ1BIQSAgICAgICAgICBMTF9VU0FSVF9HZXRDbG9ja1BoYXNlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUEhBU0VfMUVER0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QSEFTRV8yRURHRQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldENsb2NrUGhhc2UoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0NQSEEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZWxlY3QgdGhlIHBvbGFyaXR5IG9mIHRoZSBjbG9jayBvdXRwdXQgb24gdGhlIFNDTEsgcGluIGluIHN5bmNocm9ub3VzIG1vZGUKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVVNBUlRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU3luY2hyb25vdXMgbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBDUE9MICAgICAgICAgIExMX1VTQVJUX1NldENsb2NrUG9sYXJpdHkKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2xvY2tQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BPTEFSSVRZX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BPTEFSSVRZX0hJR0gKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldENsb2NrUG9sYXJpdHkoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBDbG9ja1BvbGFyaXR5KQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQ1BPTCwgQ2xvY2tQb2xhcml0eSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHBvbGFyaXR5IG9mIHRoZSBjbG9jayBvdXRwdXQgb24gdGhlIFNDTEsgcGluIGluIHN5bmNocm9ub3VzIG1vZGUKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVVNBUlRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU3luY2hyb25vdXMgbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBDUE9MICAgICAgICAgIExMX1VTQVJUX0dldENsb2NrUG9sYXJpdHkKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QT0xBUklUWV9MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QT0xBUklUWV9ISUdICisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0Q2xvY2tQb2xhcml0eShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQ1BPTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBDbG9jayBzaWduYWwgZm9ybWF0IChQaGFzZSBQb2xhcml0eSBhbmQgY2hvaWNlIGFib3V0IG91dHB1dCBvZiBsYXN0IGJpdCBjbG9jayBwdWxzZSkKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVVNBUlRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU3luY2hyb25vdXMgbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIENhbGwgb2YgdGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGZvbGxvd2luZyBmdW5jdGlvbiBjYWxsIHNlcXVlbmNlIDoKKyAgKiAgICAgICAgIC0gQ2xvY2sgUGhhc2UgY29uZmlndXJhdGlvbiB1c2luZyBAcmVmIExMX1VTQVJUX1NldENsb2NrUGhhc2UoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDbG9jayBQb2xhcml0eSBjb25maWd1cmF0aW9uIHVzaW5nIEByZWYgTExfVVNBUlRfU2V0Q2xvY2tQb2xhcml0eSgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIE91dHB1dCBvZiBMYXN0IGJpdCBDbG9jayBwdWxzZSBjb25maWd1cmF0aW9uIHVzaW5nIEByZWYgTExfVVNBUlRfU2V0TGFzdENsa1B1bHNlT3V0cHV0KCkgZnVuY3Rpb24KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBDUEhBICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0Nsb2NrXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBDUE9MICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0Nsb2NrXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBMQkNMICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0Nsb2NrCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBoYXNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUEhBU0VfMUVER0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QSEFTRV8yRURHRQorICAqIEBwYXJhbSAgUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QT0xBUklUWV9MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QT0xBUklUWV9ISUdICisgICogQHBhcmFtICBMQkNQT3V0cHV0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfTEFTVENMS1BVTFNFX05PX09VVFBVVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0xBU1RDTEtQVUxTRV9PVVRQVVQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NvbmZpZ0Nsb2NrKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgUGhhc2UsIHVpbnQzMl90IFBvbGFyaXR5LCB1aW50MzJfdCBMQkNQT3V0cHV0KQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQ1BIQSB8IFVTQVJUX0NSMl9DUE9MIHwgVVNBUlRfQ1IyX0xCQ0wsIFBoYXNlIHwgUG9sYXJpdHkgfCBMQkNQT3V0cHV0KTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQ2xvY2sgb3V0cHV0IG9uIFNDTEsgcGluCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VTQVJUX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFN5bmNocm9ub3VzIG1vZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQ0xLRU4gICAgICAgICBMTF9VU0FSVF9FbmFibGVTQ0xLT3V0cHV0CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZVNDTEtPdXRwdXQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQ0xLRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQ2xvY2sgb3V0cHV0IG9uIFNDTEsgcGluCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VTQVJUX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFN5bmNocm9ub3VzIG1vZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQ0xLRU4gICAgICAgICBMTF9VU0FSVF9EaXNhYmxlU0NMS091dHB1dAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlU0NMS091dHB1dChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0NMS0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBDbG9jayBvdXRwdXQgb24gU0NMSyBwaW4gaXMgZW5hYmxlZAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTeW5jaHJvbm91cyBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIENMS0VOICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkU0NMS091dHB1dAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkU0NMS091dHB1dChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9DTEtFTikgPT0gKFVTQVJUX0NSMl9DTEtFTikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgbGVuZ3RoIG9mIHRoZSBzdG9wIGJpdHMKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBTVE9QICAgICAgICAgIExMX1VTQVJUX1NldFN0b3BCaXRzTGVuZ3RoCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFN0b3BCaXRzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfU1RPUEJJVFNfMF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfU1RPUEJJVFNfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1NUT1BCSVRTXzFfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1NUT1BCSVRTXzIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFN0b3BCaXRzTGVuZ3RoKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgU3RvcEJpdHMpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9TVE9QLCBTdG9wQml0cyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0cmlldmUgdGhlIGxlbmd0aCBvZiB0aGUgc3RvcCBiaXRzCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgU1RPUCAgICAgICAgICBMTF9VU0FSVF9HZXRTdG9wQml0c0xlbmd0aAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1NUT1BCSVRTXzBfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1NUT1BCSVRTXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18xXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18yCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0U3RvcEJpdHNMZW5ndGgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1NUT1ApKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgQ2hhcmFjdGVyIGZyYW1lIGZvcm1hdCAoRGF0YXdpZHRoLCBQYXJpdHkgY29udHJvbCwgU3RvcCBCaXRzKQorICAqIEBub3RlICAgQ2FsbCBvZiB0aGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZm9sbG93aW5nIGZ1bmN0aW9uIGNhbGwgc2VxdWVuY2UgOgorICAqICAgICAgICAgLSBEYXRhIFdpZHRoIGNvbmZpZ3VyYXRpb24gdXNpbmcgQHJlZiBMTF9VU0FSVF9TZXREYXRhV2lkdGgoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBQYXJpdHkgQ29udHJvbCBhbmQgbW9kZSBjb25maWd1cmF0aW9uIHVzaW5nIEByZWYgTExfVVNBUlRfU2V0UGFyaXR5KCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gU3RvcCBiaXRzIGNvbmZpZ3VyYXRpb24gdXNpbmcgQHJlZiBMTF9VU0FSVF9TZXRTdG9wQml0c0xlbmd0aCgpIGZ1bmN0aW9uCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUFMgICAgICAgICAgICBMTF9VU0FSVF9Db25maWdDaGFyYWN0ZXJcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIFBDRSAgICAgICAgICAgTExfVVNBUlRfQ29uZmlnQ2hhcmFjdGVyXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBNMCAgICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0NoYXJhY3RlclxuCisgICogICAgICAgICBDUjEgICAgICAgICAgTTEgICAgICAgICAgICBMTF9VU0FSVF9Db25maWdDaGFyYWN0ZXJcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIFNUT1AgICAgICAgICAgTExfVVNBUlRfQ29uZmlnQ2hhcmFjdGVyCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIERhdGFXaWR0aCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RBVEFXSURUSF83QiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfOUIKKyAgKiBAcGFyYW0gIFBhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BBUklUWV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUEFSSVRZX0VWRU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QQVJJVFlfT0RECisgICogQHBhcmFtICBTdG9wQml0cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1NUT1BCSVRTXzBfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1NUT1BCSVRTXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18xXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18yCisgICoKKyAgKiAgICAgICAgICgqKSBWYWx1ZXMgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnQ2hhcmFjdGVyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgRGF0YVdpZHRoLCB1aW50MzJfdCBQYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU3RvcEJpdHMpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9QUyB8IFVTQVJUX0NSMV9QQ0UgfCBVU0FSVF9DUjFfTSwgUGFyaXR5IHwgRGF0YVdpZHRoKTsKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1NUT1AsIFN0b3BCaXRzKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgVFgvUlggcGlucyBzd2FwcGluZyBzZXR0aW5nLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNXQVAgICAgICAgICAgTExfVVNBUlRfU2V0VFhSWFN3YXAKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgU3dhcENvbmZpZyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1RYUlhfU1RBTkRBUkQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9UWFJYX1NXQVBQRUQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFRYUlhTd2FwKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgU3dhcENvbmZpZykKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1NXQVAsIFN3YXBDb25maWcpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHJpZXZlIFRYL1JYIHBpbnMgc3dhcHBpbmcgY29uZmlndXJhdGlvbi4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBTV0FQICAgICAgICAgIExMX1VTQVJUX0dldFRYUlhTd2FwCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfVFhSWF9TVEFOREFSRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1RYUlhfU1dBUFBFRAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFRYUlhTd2FwKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9TV0FQKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIFJYIHBpbiBhY3RpdmUgbGV2ZWwgbG9naWMKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBSWElOViAgICAgICAgIExMX1VTQVJUX1NldFJYUGluTGV2ZWwKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUGluSW52TWV0aG9kIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUlhQSU5fTEVWRUxfU1RBTkRBUkQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9SWFBJTl9MRVZFTF9JTlZFUlRFRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0UlhQaW5MZXZlbChVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IFBpbkludk1ldGhvZCkKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1JYSU5WLCBQaW5JbnZNZXRob2QpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHJpZXZlIFJYIHBpbiBhY3RpdmUgbGV2ZWwgbG9naWMgY29uZmlndXJhdGlvbgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYSU5WICAgICAgICAgTExfVVNBUlRfR2V0UlhQaW5MZXZlbAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1JYUElOX0xFVkVMX1NUQU5EQVJECisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUlhQSU5fTEVWRUxfSU5WRVJURUQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRSWFBpbkxldmVsKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9SWElOVikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBUWCBwaW4gYWN0aXZlIGxldmVsIGxvZ2ljCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhJTlYgICAgICAgICBMTF9VU0FSVF9TZXRUWFBpbkxldmVsCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBpbkludk1ldGhvZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1RYUElOX0xFVkVMX1NUQU5EQVJECisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfVFhQSU5fTEVWRUxfSU5WRVJURUQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFRYUGluTGV2ZWwoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBQaW5JbnZNZXRob2QpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9UWElOViwgUGluSW52TWV0aG9kKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXRyaWV2ZSBUWCBwaW4gYWN0aXZlIGxldmVsIGxvZ2ljIGNvbmZpZ3VyYXRpb24KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBUWElOViAgICAgICAgIExMX1VTQVJUX0dldFRYUGluTGV2ZWwKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9UWFBJTl9MRVZFTF9TVEFOREFSRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1RYUElOX0xFVkVMX0lOVkVSVEVECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0VFhQaW5MZXZlbChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfVFhJTlYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgQmluYXJ5IGRhdGEgbG9naWMuCisgICogQG5vdGUgICBBbGxvdyB0byBkZWZpbmUgaG93IExvZ2ljYWwgZGF0YSBmcm9tIHRoZSBkYXRhIHJlZ2lzdGVyIGFyZSBzZW5kL3JlY2VpdmVkIDoKKyAgKiAgICAgICAgIGVpdGhlciBpbiBwb3NpdGl2ZS9kaXJlY3QgbG9naWMgKDE9SCwgMD1MKSBvciBpbiBuZWdhdGl2ZS9pbnZlcnNlIGxvZ2ljICgxPUwsIDA9SCkKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBEQVRBSU5WICAgICAgIExMX1VTQVJUX1NldEJpbmFyeURhdGFMb2dpYworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBEYXRhTG9naWMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9CSU5BUllfTE9HSUNfUE9TSVRJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9CSU5BUllfTE9HSUNfTkVHQVRJVkUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldEJpbmFyeURhdGFMb2dpYyhVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IERhdGFMb2dpYykKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0RBVEFJTlYsIERhdGFMb2dpYyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0cmlldmUgQmluYXJ5IGRhdGEgY29uZmlndXJhdGlvbgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIERBVEFJTlYgICAgICAgTExfVVNBUlRfR2V0QmluYXJ5RGF0YUxvZ2ljCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQklOQVJZX0xPR0lDX1BPU0lUSVZFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQklOQVJZX0xPR0lDX05FR0FUSVZFCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0QmluYXJ5RGF0YUxvZ2ljKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9EQVRBSU5WKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRyYW5zZmVyIGJpdCBvcmRlciAoZWl0aGVyIExlc3Mgb3IgTW9zdCBTaWduaWZpY2FudCBCaXQgRmlyc3QpCisgICogQG5vdGUgICBNU0IgRmlyc3QgbWVhbnMgZGF0YSBpcyB0cmFuc21pdHRlZC9yZWNlaXZlZCB3aXRoIHRoZSBNU0IgZmlyc3QsIGZvbGxvd2luZyB0aGUgc3RhcnQgYml0LgorICAqICAgICAgICAgTFNCIEZpcnN0IG1lYW5zIGRhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aCBkYXRhIGJpdCAwIGZpcnN0LCBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBNU0JGSVJTVCAgICAgIExMX1VTQVJUX1NldFRyYW5zZmVyQml0T3JkZXIKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQml0T3JkZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9CSVRPUkRFUl9MU0JGSVJTVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0JJVE9SREVSX01TQkZJUlNUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRUcmFuc2ZlckJpdE9yZGVyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgQml0T3JkZXIpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9NU0JGSVJTVCwgQml0T3JkZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0cmFuc2ZlciBiaXQgb3JkZXIgKGVpdGhlciBMZXNzIG9yIE1vc3QgU2lnbmlmaWNhbnQgQml0IEZpcnN0KQorICAqIEBub3RlICAgTVNCIEZpcnN0IG1lYW5zIGRhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aCB0aGUgTVNCIGZpcnN0LCBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdC4KKyAgKiAgICAgICAgIExTQiBGaXJzdCBtZWFucyBkYXRhIGlzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggZGF0YSBiaXQgMCBmaXJzdCwgZm9sbG93aW5nIHRoZSBzdGFydCBiaXQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTVNCRklSU1QgICAgICBMTF9VU0FSVF9HZXRUcmFuc2ZlckJpdE9yZGVyCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQklUT1JERVJfTFNCRklSU1QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9CSVRPUkRFUl9NU0JGSVJTVAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFRyYW5zZmVyQml0T3JkZXIoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX01TQkZJUlNUKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEF1dG8gQmF1ZC1SYXRlIERldGVjdGlvbgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9BVVRPQkFVRFJBVEVfREVURUNUSU9OX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEF1dG8gQmF1ZCBSYXRlIGRldGVjdGlvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEFCUkVOICAgICAgICAgTExfVVNBUlRfRW5hYmxlQXV0b0JhdWRSYXRlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUF1dG9CYXVkUmF0ZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9BQlJFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBdXRvIEJhdWQtUmF0ZSBEZXRlY3Rpb24KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVVNBUlRfQVVUT0JBVURSQVRFX0RFVEVDVElPTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBBdXRvIEJhdWQgUmF0ZSBkZXRlY3Rpb24gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBBQlJFTiAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVBdXRvQmF1ZFJhdGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUF1dG9CYXVkUmF0ZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0FCUkVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBBdXRvIEJhdWQtUmF0ZSBEZXRlY3Rpb24gbWVjaGFuaXNtIGlzIGVuYWJsZWQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVVNBUlRfQVVUT0JBVURSQVRFX0RFVEVDVElPTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBBdXRvIEJhdWQgUmF0ZSBkZXRlY3Rpb24gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBBQlJFTiAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZEF1dG9CYXVkCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRBdXRvQmF1ZChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9BQlJFTikgPT0gKFVTQVJUX0NSMl9BQlJFTikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBdXRvIEJhdWQtUmF0ZSBtb2RlIGJpdHMKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVVNBUlRfQVVUT0JBVURSQVRFX0RFVEVDVElPTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBBdXRvIEJhdWQgUmF0ZSBkZXRlY3Rpb24gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBBQlJNT0RFICAgICAgIExMX1VTQVJUX1NldEF1dG9CYXVkUmF0ZU1vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQXV0b0JhdWRSYXRlTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0FVVE9CQVVEX0RFVEVDVF9PTl9TVEFSVEJJVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0FVVE9CQVVEX0RFVEVDVF9PTl9GQUxMSU5HRURHRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0FVVE9CQVVEX0RFVEVDVF9PTl83Rl9GUkFNRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0FVVE9CQVVEX0RFVEVDVF9PTl81NV9GUkFNRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0QXV0b0JhdWRSYXRlTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IEF1dG9CYXVkUmF0ZU1vZGUpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9BQlJNT0RFLCBBdXRvQmF1ZFJhdGVNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gQXV0byBCYXVkLVJhdGUgbW9kZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9BVVRPQkFVRFJBVEVfREVURUNUSU9OX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEF1dG8gQmF1ZCBSYXRlIGRldGVjdGlvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEFCUk1PREUgICAgICAgTExfVVNBUlRfR2V0QXV0b0JhdWRSYXRlTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0FVVE9CQVVEX0RFVEVDVF9PTl9TVEFSVEJJVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0FVVE9CQVVEX0RFVEVDVF9PTl9GQUxMSU5HRURHRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0FVVE9CQVVEX0RFVEVDVF9PTl83Rl9GUkFNRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0FVVE9CQVVEX0RFVEVDVF9PTl81NV9GUkFNRQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldEF1dG9CYXVkUmF0ZU1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0FCUk1PREUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUmVjZWl2ZXIgVGltZW91dAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJUT0VOICAgICAgICAgTExfVVNBUlRfRW5hYmxlUnhUaW1lb3V0CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZVJ4VGltZW91dChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9SVE9FTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSZWNlaXZlciBUaW1lb3V0CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUlRPRU4gICAgICAgICBMTF9VU0FSVF9EaXNhYmxlUnhUaW1lb3V0CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVSeFRpbWVvdXQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9SVE9FTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgUmVjZWl2ZXIgVGltZW91dCBmZWF0dXJlIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBSVE9FTiAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZFJ4VGltZW91dAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkUnhUaW1lb3V0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1JUT0VOKSA9PSAoVVNBUlRfQ1IyX1JUT0VOKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFkZHJlc3Mgb2YgdGhlIFVTQVJUIG5vZGUuCisgICogQG5vdGUgICBUaGlzIGlzIHVzZWQgaW4gbXVsdGlwcm9jZXNzb3IgY29tbXVuaWNhdGlvbiBkdXJpbmcgTXV0ZSBtb2RlIG9yIFN0b3AgbW9kZSwKKyAgKiAgICAgICAgIGZvciB3YWtlIHVwIHdpdGggYWRkcmVzcyBtYXJrIGRldGVjdGlvbi4KKyAgKiBAbm90ZSAgIDRiaXRzIGFkZHJlc3Mgbm9kZSBpcyB1c2VkIHdoZW4gNC1iaXQgQWRkcmVzcyBEZXRlY3Rpb24gaXMgc2VsZWN0ZWQgaW4gQURETTcuCisgICogICAgICAgICAoYjctYjQgc2hvdWxkIGJlIHNldCB0byAwKQorICAqICAgICAgICAgOGJpdHMgYWRkcmVzcyBub2RlIGlzIHVzZWQgd2hlbiA3LWJpdCBBZGRyZXNzIERldGVjdGlvbiBpcyBzZWxlY3RlZCBpbiBBRERNNy4KKyAgKiAgICAgICAgIChUaGlzIGlzIHVzZWQgaW4gbXVsdGlwcm9jZXNzb3IgY29tbXVuaWNhdGlvbiBkdXJpbmcgTXV0ZSBtb2RlIG9yIFN0b3AgbW9kZSwKKyAgKiAgICAgICAgIGZvciB3YWtlIHVwIHdpdGggNy1iaXQgYWRkcmVzcyBtYXJrIGRldGVjdGlvbi4KKyAgKiAgICAgICAgIFRoZSBNU0Igb2YgdGhlIGNoYXJhY3RlciBzZW50IGJ5IHRoZSB0cmFuc21pdHRlciBzaG91bGQgYmUgZXF1YWwgdG8gMS4KKyAgKiAgICAgICAgIEl0IG1heSBhbHNvIGJlIHVzZWQgZm9yIGNoYXJhY3RlciBkZXRlY3Rpb24gZHVyaW5nIG5vcm1hbCByZWNlcHRpb24sCisgICogICAgICAgICBNdXRlIG1vZGUgaW5hY3RpdmUgKGZvciBleGFtcGxlLCBlbmQgb2YgYmxvY2sgZGV0ZWN0aW9uIGluIE1vZEJ1cyBwcm90b2NvbCkuCisgICogICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB3aG9sZSByZWNlaXZlZCBjaGFyYWN0ZXIgKDgtYml0KSBpcyBjb21wYXJlZCB0byB0aGUgQUREWzc6MF0KKyAgKiAgICAgICAgIHZhbHVlIGFuZCBDTUYgZmxhZyBpcyBzZXQgb24gbWF0Y2gpCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQUREICAgICAgICAgICBMTF9VU0FSVF9Db25maWdOb2RlQWRkcmVzc1xuCisgICogICAgICAgICBDUjIgICAgICAgICAgQURETTcgICAgICAgICBMTF9VU0FSVF9Db25maWdOb2RlQWRkcmVzcworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBBZGRyZXNzTGVuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQUREUkVTU19ERVRFQ1RfNEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9BRERSRVNTX0RFVEVDVF83QgorICAqIEBwYXJhbSAgTm9kZUFkZHJlc3MgNCBvciA3IGJpdCBBZGRyZXNzIG9mIHRoZSBVU0FSVCBub2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnTm9kZUFkZHJlc3MoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBBZGRyZXNzTGVuLCB1aW50MzJfdCBOb2RlQWRkcmVzcykKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0FERCB8IFVTQVJUX0NSMl9BRERNNywKKyAgICAgICAgICAgICAodWludDMyX3QpKEFkZHJlc3NMZW4gfCAoTm9kZUFkZHJlc3MgPDwgVVNBUlRfQ1IyX0FERF9Qb3MpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIDggYml0IEFkZHJlc3Mgb2YgdGhlIFVTQVJUIG5vZGUgYXMgc2V0IGluIEFERCBmaWVsZCBvZiBDUjIuCisgICogQG5vdGUgICBJZiA0LWJpdCBBZGRyZXNzIERldGVjdGlvbiBpcyBzZWxlY3RlZCBpbiBBRERNNywKKyAgKiAgICAgICAgIG9ubHkgNGJpdHMgKGIzLWIwKSBvZiByZXR1cm5lZCB2YWx1ZSBhcmUgcmVsZXZhbnQgKGIzMS1iNCBhcmUgbm90IHJlbGV2YW50KQorICAqICAgICAgICAgSWYgNy1iaXQgQWRkcmVzcyBEZXRlY3Rpb24gaXMgc2VsZWN0ZWQgaW4gQURETTcsCisgICogICAgICAgICBvbmx5IDhiaXRzIChiNy1iMCkgb2YgcmV0dXJuZWQgdmFsdWUgYXJlIHJlbGV2YW50IChiMzEtYjggYXJlIG5vdCByZWxldmFudCkKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBBREQgICAgICAgICAgIExMX1VTQVJUX0dldE5vZGVBZGRyZXNzCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFkZHJlc3Mgb2YgdGhlIFVTQVJUIG5vZGUgKFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MjU1KQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldE5vZGVBZGRyZXNzKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9BREQpID4+IFVTQVJUX0NSMl9BRERfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gTGVuZ3RoIG9mIE5vZGUgQWRkcmVzcyB1c2VkIGluIEFkZHJlc3MgRGV0ZWN0aW9uIG1vZGUgKDctYml0IG9yIDQtYml0KQorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEFERE03ICAgICAgICAgTExfVVNBUlRfR2V0Tm9kZUFkZHJlc3NMZW4KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9BRERSRVNTX0RFVEVDVF80QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0FERFJFU1NfREVURUNUXzdCCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0Tm9kZUFkZHJlc3NMZW4oVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0FERE03KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFJUUyBIVyBGbG93IENvbnRyb2wKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9IV0ZMT1dfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSGFyZHdhcmUgRmxvdyBjb250cm9sIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgUlRTRSAgICAgICAgICBMTF9VU0FSVF9FbmFibGVSVFNIV0Zsb3dDdHJsCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZVJUU0hXRmxvd0N0cmwoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfUlRTRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSVFMgSFcgRmxvdyBDb250cm9sCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfSFdGTE9XX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEhhcmR3YXJlIEZsb3cgY29udHJvbCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJUU0UgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZVJUU0hXRmxvd0N0cmwKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZVJUU0hXRmxvd0N0cmwoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19SVFNFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQ1RTIEhXIEZsb3cgQ29udHJvbAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBDVFNFICAgICAgICAgIExMX1VTQVJUX0VuYWJsZUNUU0hXRmxvd0N0cmwKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlQ1RTSFdGbG93Q3RybChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19DVFNFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIENUUyBIVyBGbG93IENvbnRyb2wKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9IV0ZMT1dfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSGFyZHdhcmUgRmxvdyBjb250cm9sIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgQ1RTRSAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlQ1RTSFdGbG93Q3RybAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlQ1RTSFdGbG93Q3RybChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0NUU0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBIVyBGbG93IENvbnRyb2wgbW9kZSAoYm90aCBDVFMgYW5kIFJUUykKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9IV0ZMT1dfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSGFyZHdhcmUgRmxvdyBjb250cm9sIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgUlRTRSAgICAgICAgICBMTF9VU0FSVF9TZXRIV0Zsb3dDdHJsXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBDVFNFICAgICAgICAgIExMX1VTQVJUX1NldEhXRmxvd0N0cmwKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgSGFyZHdhcmVGbG93Q29udHJvbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0hXQ09OVFJPTF9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfSFdDT05UUk9MX1JUUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0hXQ09OVFJPTF9DVFMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9IV0NPTlRST0xfUlRTX0NUUworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0SFdGbG93Q3RybChVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IEhhcmR3YXJlRmxvd0NvbnRyb2wpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19SVFNFIHwgVVNBUlRfQ1IzX0NUU0UsIEhhcmR3YXJlRmxvd0NvbnRyb2wpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBIVyBGbG93IENvbnRyb2wgY29uZmlndXJhdGlvbiAoYm90aCBDVFMgYW5kIFJUUykKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9IV0ZMT1dfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSGFyZHdhcmUgRmxvdyBjb250cm9sIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgUlRTRSAgICAgICAgICBMTF9VU0FSVF9HZXRIV0Zsb3dDdHJsXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBDVFNFICAgICAgICAgIExMX1VTQVJUX0dldEhXRmxvd0N0cmwKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9IV0NPTlRST0xfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0hXQ09OVFJPTF9SVFMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9IV0NPTlRST0xfQ1RTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfSFdDT05UUk9MX1JUU19DVFMKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRIV0Zsb3dDdHJsKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19SVFNFIHwgVVNBUlRfQ1IzX0NUU0UpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgT25lIGJpdCBzYW1wbGluZyBtZXRob2QKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBPTkVCSVQgICAgICAgIExMX1VTQVJUX0VuYWJsZU9uZUJpdFNhbXAKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlT25lQml0U2FtcChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19PTkVCSVQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgT25lIGJpdCBzYW1wbGluZyBtZXRob2QKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBPTkVCSVQgICAgICAgIExMX1VTQVJUX0Rpc2FibGVPbmVCaXRTYW1wCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVPbmVCaXRTYW1wKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfT05FQklUKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBPbmUgYml0IHNhbXBsaW5nIG1ldGhvZCBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgT05FQklUICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRPbmVCaXRTYW1wCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRPbmVCaXRTYW1wKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX09ORUJJVCkgPT0gKFVTQVJUX0NSM19PTkVCSVQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgT3ZlcnJ1biBkZXRlY3Rpb24KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBPVlJESVMgICAgICAgIExMX1VTQVJUX0VuYWJsZU92ZXJydW5EZXRlY3QKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlT3ZlcnJ1bkRldGVjdChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX09WUkRJUyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBPdmVycnVuIGRldGVjdGlvbgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIE9WUkRJUyAgICAgICAgTExfVVNBUlRfRGlzYWJsZU92ZXJydW5EZXRlY3QKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZU92ZXJydW5EZXRlY3QoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfT1ZSRElTKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBPdmVycnVuIGRldGVjdGlvbiBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgT1ZSRElTICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRPdmVycnVuRGV0ZWN0CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRPdmVycnVuRGV0ZWN0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX09WUkRJUykgIT0gVVNBUlRfQ1IzX09WUkRJUyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VsZWN0IGV2ZW50IHR5cGUgZm9yIFdha2UgVVAgSW50ZXJydXB0IEZsYWcgKFdVU1sxOjBdIGJpdHMpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFdha2UtdXAgZnJvbSBTdG9wIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBXVVMgICAgICAgICAgIExMX1VTQVJUX1NldFdLVVBUeXBlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFR5cGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9XQUtFVVBfT05fQUREUkVTUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1dBS0VVUF9PTl9TVEFSVEJJVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1dBS0VVUF9PTl9SWE5FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRXS1VQVHlwZShVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IFR5cGUpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19XVVMsIFR5cGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBldmVudCB0eXBlIGZvciBXYWtlIFVQIEludGVycnVwdCBGbGFnIChXVVNbMTowXSBiaXRzKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBXYWtlLXVwIGZyb20gU3RvcCBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgV1VTICAgICAgICAgICBMTF9VU0FSVF9HZXRXS1VQVHlwZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1dBS0VVUF9PTl9BRERSRVNTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfV0FLRVVQX09OX1NUQVJUQklUCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfV0FLRVVQX09OX1JYTkUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRXS1VQVHlwZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfV1VTKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIFVTQVJUIEJSUiByZWdpc3RlciBmb3IgYWNoaWV2aW5nIGV4cGVjdGVkIEJhdWQgUmF0ZSB2YWx1ZS4KKyAgKiBAbm90ZSAgIENvbXB1dGUgYW5kIHNldCBVU0FSVERJViB2YWx1ZSBpbiBCUlIgUmVnaXN0ZXIgKGZ1bGwgQlJSIGNvbnRlbnQpCisgICogICAgICAgICBhY2NvcmRpbmcgdG8gdXNlZCBQZXJpcGhlcmFsIENsb2NrLCBPdmVyc2FtcGxpbmcgbW9kZSwgYW5kIGV4cGVjdGVkIEJhdWQgUmF0ZSB2YWx1ZXMKKyAgKiBAbm90ZSAgIFBlcmlwaGVyYWwgY2xvY2sgYW5kIEJhdWQgcmF0ZSB2YWx1ZXMgcHJvdmlkZWQgYXMgZnVuY3Rpb24gcGFyYW1ldGVycyBzaG91bGQgYmUgdmFsaWQKKyAgKiAgICAgICAgIChCYXVkIHJhdGUgdmFsdWUgIT0gMCkKKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2Ygb3ZlcnNhbXBsaW5nIGJ5IDE2IGFuZCA4LCBCUlIgY29udGVudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxNmQuCisgICogQHJtdG9sbCBCUlIgICAgICAgICAgQlJSICAgICAgICAgICBMTF9VU0FSVF9TZXRCYXVkUmF0ZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBQZXJpcGhDbGsgUGVyaXBoZXJhbCBDbG9jaworICAqIEBwYXJhbSAgT3ZlclNhbXBsaW5nIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzgKKyAgKiBAcGFyYW0gIEJhdWRSYXRlIEJhdWQgUmF0ZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0QmF1ZFJhdGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBQZXJpcGhDbGssIHVpbnQzMl90IE92ZXJTYW1wbGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJhdWRSYXRlKQoreworICByZWdpc3RlciB1aW50MzJfdCB1c2FydGRpdiA9IDB4MFU7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGJycnRlbXAgPSAweDBVOworCisgIGlmIChPdmVyU2FtcGxpbmcgPT0gTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzgpCisgIHsKKyAgICB1c2FydGRpdiA9ICh1aW50MTZfdCkoX19MTF9VU0FSVF9ESVZfU0FNUExJTkc4KFBlcmlwaENsaywgQmF1ZFJhdGUpKTsKKyAgICBicnJ0ZW1wID0gdXNhcnRkaXYgJiAweEZGRjBVOworICAgIGJycnRlbXAgfD0gKHVpbnQxNl90KSgodXNhcnRkaXYgJiAodWludDE2X3QpMHgwMDBGVSkgPj4gMVUpOworICAgIFVTQVJUeC0+QlJSID0gYnJydGVtcDsKKyAgfQorICBlbHNlCisgIHsKKyAgICBVU0FSVHgtPkJSUiA9ICh1aW50MTZfdCkoX19MTF9VU0FSVF9ESVZfU0FNUExJTkcxNihQZXJpcGhDbGssIEJhdWRSYXRlKSk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gY3VycmVudCBCYXVkIFJhdGUgdmFsdWUsIGFjY29yZGluZyB0byBVU0FSVERJViBwcmVzZW50IGluIEJSUiByZWdpc3RlcgorICAqICAgICAgICAgKGZ1bGwgQlJSIGNvbnRlbnQpLCBhbmQgdG8gdXNlZCBQZXJpcGhlcmFsIENsb2NrIGFuZCBPdmVyc2FtcGxpbmcgbW9kZSB2YWx1ZXMKKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2Ygbm9uLWluaXRpYWxpemVkIG9yIGludmFsaWQgdmFsdWUgc3RvcmVkIGluIEJSUiByZWdpc3RlciwgdmFsdWUgMCB3aWxsIGJlIHJldHVybmVkLgorICAqIEBub3RlICAgSW4gY2FzZSBvZiBvdmVyc2FtcGxpbmcgYnkgMTYgYW5kIDgsIEJSUiBjb250ZW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDE2ZC4KKyAgKiBAcm10b2xsIEJSUiAgICAgICAgICBCUlIgICAgICAgICAgIExMX1VTQVJUX0dldEJhdWRSYXRlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBlcmlwaENsayBQZXJpcGhlcmFsIENsb2NrCisgICogQHBhcmFtICBPdmVyU2FtcGxpbmcgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9PVkVSU0FNUExJTkdfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9PVkVSU0FNUExJTkdfOAorICAqIEByZXR2YWwgQmF1ZCBSYXRlCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0QmF1ZFJhdGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBQZXJpcGhDbGssIHVpbnQzMl90IE92ZXJTYW1wbGluZykKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdXNhcnRkaXYgPSAweDBVOworICByZWdpc3RlciB1aW50MzJfdCBicnJyZXN1bHQgPSAweDBVOworCisgIHVzYXJ0ZGl2ID0gVVNBUlR4LT5CUlI7CisKKyAgaWYgKE92ZXJTYW1wbGluZyA9PSBMTF9VU0FSVF9PVkVSU0FNUExJTkdfOCkKKyAgeworICAgIGlmICgodXNhcnRkaXYgJiAweEZGRjdVKSAhPSAwVSkKKyAgICB7CisgICAgICB1c2FydGRpdiA9ICh1aW50MTZfdCkoKHVzYXJ0ZGl2ICYgMHhGRkYwVSkgfCAoKHVzYXJ0ZGl2ICYgMHgwMDA3VSkgPDwgMVUpKSA7CisgICAgICBicnJyZXN1bHQgPSAoUGVyaXBoQ2xrICogMlUpIC8gdXNhcnRkaXY7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIGlmICgodXNhcnRkaXYgJiAweEZGRkZVKSAhPSAwVSkKKyAgICB7CisgICAgICBicnJyZXN1bHQgPSBQZXJpcGhDbGsgLyB1c2FydGRpdjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIChicnJyZXN1bHQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBSZWNlaXZlciBUaW1lIE91dCBWYWx1ZSAoZXhwcmVzc2VkIGluIG5iIG9mIGJpdHMgZHVyYXRpb24pCisgICogQHJtdG9sbCBSVE9SICAgICAgICAgUlRPICAgICAgICAgICBMTF9VU0FSVF9TZXRSeFRpbWVvdXQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZW91dCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MDBGRkZGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFJ4VGltZW91dChVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5SVE9SLCBVU0FSVF9SVE9SX1JUTywgVGltZW91dCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFJlY2VpdmVyIFRpbWUgT3V0IFZhbHVlIChleHByZXNzZWQgaW4gbmIgb2YgYml0cyBkdXJhdGlvbikKKyAgKiBAcm10b2xsIFJUT1IgICAgICAgICBSVE8gICAgICAgICAgIExMX1VTQVJUX0dldFJ4VGltZW91dAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MDBGRkZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRSeFRpbWVvdXQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPlJUT1IsIFVTQVJUX1JUT1JfUlRPKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEJsb2NrIExlbmd0aCB2YWx1ZSBpbiByZWNlcHRpb24KKyAgKiBAcm10b2xsIFJUT1IgICAgICAgICBCTEVOICAgICAgICAgIExMX1VTQVJUX1NldEJsb2NrTGVuZ3RoCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEJsb2NrTGVuZ3RoIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0QmxvY2tMZW5ndGgoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBCbG9ja0xlbmd0aCkKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPlJUT1IsIFVTQVJUX1JUT1JfQkxFTiwgQmxvY2tMZW5ndGggPDwgVVNBUlRfUlRPUl9CTEVOX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEJsb2NrIExlbmd0aCB2YWx1ZSBpbiByZWNlcHRpb24KKyAgKiBAcm10b2xsIFJUT1IgICAgICAgICBCTEVOICAgICAgICAgIExMX1VTQVJUX0dldEJsb2NrTGVuZ3RoCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldEJsb2NrTGVuZ3RoKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5SVE9SLCBVU0FSVF9SVE9SX0JMRU4pID4+IFVTQVJUX1JUT1JfQkxFTl9Qb3MpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VGX0NvbmZpZ3VyYXRpb25fSVJEQSBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyByZWxhdGVkIHRvIElyZGEgZmVhdHVyZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIElyREEgbW9kZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19JUkRBX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIElyREEgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBJUkVOICAgICAgICAgIExMX1VTQVJUX0VuYWJsZUlyZGEKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSXJkYShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19JUkVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIElyREEgbW9kZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19JUkRBX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIElyREEgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBJUkVOICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJcmRhCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJcmRhKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfSVJFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgSXJEQSBtb2RlIGlzIGVuYWJsZWQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfSVJEQV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBJckRBIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgSVJFTiAgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJcmRhCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJcmRhKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0lSRU4pID09IChVU0FSVF9DUjNfSVJFTikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBJckRBIFBvd2VyIE1vZGUgKE5vcm1hbCBvciBMb3cgUG93ZXIpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX0lSREFfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSXJEQSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIElSTFAgICAgICAgICAgTExfVVNBUlRfU2V0SXJkYVBvd2VyTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBQb3dlck1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9JUkRBX1BPV0VSX05PUk1BTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0lSREFfUE9XRVJfTE9XCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRJcmRhUG93ZXJNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgUG93ZXJNb2RlKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfSVJMUCwgUG93ZXJNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXRyaWV2ZSBJckRBIFBvd2VyIE1vZGUgY29uZmlndXJhdGlvbiAoTm9ybWFsIG9yIExvdyBQb3dlcikKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfSVJEQV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBJckRBIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgSVJMUCAgICAgICAgICBMTF9VU0FSVF9HZXRJcmRhUG93ZXJNb2RlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfSVJEQV9QT1dFUl9OT1JNQUwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QSEFTRV8yRURHRQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldElyZGFQb3dlck1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0lSTFApKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgSXJkYSBwcmVzY2FsZXIgdmFsdWUsIHVzZWQgZm9yIGRpdmlkaW5nIHRoZSBVU0FSVCBjbG9jayBzb3VyY2UKKyAgKiAgICAgICAgIHRvIGFjaGlldmUgdGhlIElyZGEgTG93IFBvd2VyIGZyZXF1ZW5jeSAoOCBiaXRzIHZhbHVlKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19JUkRBX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIElyREEgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIEdUUFIgICAgICAgICBQU0MgICAgICAgICAgIExMX1VTQVJUX1NldElyZGFQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUHJlc2NhbGVyVmFsdWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRJcmRhUHJlc2NhbGVyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgUHJlc2NhbGVyVmFsdWUpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5HVFBSLCBVU0FSVF9HVFBSX1BTQywgUHJlc2NhbGVyVmFsdWUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBJcmRhIHByZXNjYWxlciB2YWx1ZSwgdXNlZCBmb3IgZGl2aWRpbmcgdGhlIFVTQVJUIGNsb2NrIHNvdXJjZQorICAqICAgICAgICAgdG8gYWNoaWV2ZSB0aGUgSXJkYSBMb3cgUG93ZXIgZnJlcXVlbmN5ICg4IGJpdHMgdmFsdWUpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX0lSREFfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSXJEQSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgR1RQUiAgICAgICAgIFBTQyAgICAgICAgICAgTExfVVNBUlRfR2V0SXJkYVByZXNjYWxlcgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBJcmRhIHByZXNjYWxlciB2YWx1ZSAoVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGKQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldElyZGFQcmVzY2FsZXIoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkdUUFIsIFVTQVJUX0dUUFJfUFNDKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUZfQ29uZmlndXJhdGlvbl9TbWFydGNhcmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgcmVsYXRlZCB0byBTbWFydGNhcmQgZmVhdHVyZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFNtYXJ0Y2FyZCBOQUNLIHRyYW5zbWlzc2lvbgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgTkFDSyAgICAgICAgICBMTF9VU0FSVF9FbmFibGVTbWFydGNhcmROQUNLCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZVNtYXJ0Y2FyZE5BQ0soVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfTkFDSyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBTbWFydGNhcmQgTkFDSyB0cmFuc21pc3Npb24KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIE5BQ0sgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZVNtYXJ0Y2FyZE5BQ0sKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZVNtYXJ0Y2FyZE5BQ0soVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19OQUNLKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBTbWFydGNhcmQgTkFDSyB0cmFuc21pc3Npb24gaXMgZW5hYmxlZAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgTkFDSyAgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRTbWFydGNhcmROQUNLCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRTbWFydGNhcmROQUNLKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX05BQ0spID09IChVU0FSVF9DUjNfTkFDSykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBTbWFydGNhcmQgbW9kZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgU0NFTiAgICAgICAgICBMTF9VU0FSVF9FbmFibGVTbWFydGNhcmQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlU21hcnRjYXJkKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1NDRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgU21hcnRjYXJkIG1vZGUKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFNDRU4gICAgICAgICAgTExfVVNBUlRfRGlzYWJsZVNtYXJ0Y2FyZAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlU21hcnRjYXJkKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfU0NFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgU21hcnRjYXJkIG1vZGUgaXMgZW5hYmxlZAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgU0NFTiAgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRTbWFydGNhcmQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZFNtYXJ0Y2FyZChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19TQ0VOKSA9PSAoVVNBUlRfQ1IzX1NDRU4pKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgU21hcnRjYXJkIEF1dG8tUmV0cnkgQ291bnQgdmFsdWUgKFNDQVJDTlRbMjowXSBiaXRzKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQG5vdGUgICBUaGlzIGJpdC1maWVsZCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiByZXRyaWVzIGluIHRyYW5zbWl0IGFuZCByZWNlaXZlLCBpbiBTbWFydGNhcmQgbW9kZS4KKyAgKiAgICAgICAgIEluIHRyYW5zbWlzc2lvbiBtb2RlLCBpdCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBhdXRvbWF0aWMgcmV0cmFuc21pc3Npb24gcmV0cmllcywgYmVmb3JlCisgICogICAgICAgICBnZW5lcmF0aW5nIGEgdHJhbnNtaXNzaW9uIGVycm9yIChGRSBiaXQgc2V0KS4KKyAgKiAgICAgICAgIEluIHJlY2VwdGlvbiBtb2RlLCBpdCBzcGVjaWZpZXMgdGhlIG51bWJlciBvciBlcnJvbmVvdXMgcmVjZXB0aW9uIHRyaWFscywgYmVmb3JlIGdlbmVyYXRpbmcgYQorICAqICAgICAgICAgcmVjZXB0aW9uIGVycm9yIChSWE5FIGFuZCBQRSBiaXRzIHNldCkKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBTQ0FSQ05UICAgICAgIExMX1VTQVJUX1NldFNtYXJ0Y2FyZEF1dG9SZXRyeUNvdW50CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEF1dG9SZXRyeUNvdW50IFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0U21hcnRjYXJkQXV0b1JldHJ5Q291bnQoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBBdXRvUmV0cnlDb3VudCkKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1NDQVJDTlQsIEF1dG9SZXRyeUNvdW50IDw8IFVTQVJUX0NSM19TQ0FSQ05UX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFNtYXJ0Y2FyZCBBdXRvLVJldHJ5IENvdW50IHZhbHVlIChTQ0FSQ05UWzI6MF0gYml0cykKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFNDQVJDTlQgICAgICAgTExfVVNBUlRfR2V0U21hcnRjYXJkQXV0b1JldHJ5Q291bnQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU21hcnRjYXJkIEF1dG8tUmV0cnkgQ291bnQgdmFsdWUgKFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NykKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRTbWFydGNhcmRBdXRvUmV0cnlDb3VudChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfU0NBUkNOVCkgPj4gVVNBUlRfQ1IzX1NDQVJDTlRfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgU21hcnRjYXJkIHByZXNjYWxlciB2YWx1ZSwgdXNlZCBmb3IgZGl2aWRpbmcgdGhlIFVTQVJUIGNsb2NrCisgICogICAgICAgICBzb3VyY2UgdG8gcHJvdmlkZSB0aGUgU01BUlRDQVJEIENsb2NrICg1IGJpdHMgdmFsdWUpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIEdUUFIgICAgICAgICBQU0MgICAgICAgICAgIExMX1VTQVJUX1NldFNtYXJ0Y2FyZFByZXNjYWxlcgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBQcmVzY2FsZXJWYWx1ZSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTMxCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRTbWFydGNhcmRQcmVzY2FsZXIoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBQcmVzY2FsZXJWYWx1ZSkKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkdUUFIsIFVTQVJUX0dUUFJfUFNDLCBQcmVzY2FsZXJWYWx1ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFNtYXJ0Y2FyZCBwcmVzY2FsZXIgdmFsdWUsIHVzZWQgZm9yIGRpdmlkaW5nIHRoZSBVU0FSVCBjbG9jaworICAqICAgICAgICAgc291cmNlIHRvIHByb3ZpZGUgdGhlIFNNQVJUQ0FSRCBDbG9jayAoNSBiaXRzIHZhbHVlKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBHVFBSICAgICAgICAgUFNDICAgICAgICAgICBMTF9VU0FSVF9HZXRTbWFydGNhcmRQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU21hcnRjYXJkIHByZXNjYWxlciB2YWx1ZSAoVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0zMSkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRTbWFydGNhcmRQcmVzY2FsZXIoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkdUUFIsIFVTQVJUX0dUUFJfUFNDKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFNtYXJ0Y2FyZCBHdWFyZCB0aW1lIHZhbHVlLCBleHByZXNzZWQgaW4gbmIgb2YgYmF1ZCBjbG9ja3MgcGVyaW9kcworICAqICAgICAgICAgKEdUWzc6MF0gYml0cyA6IEd1YXJkIHRpbWUgdmFsdWUpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIEdUUFIgICAgICAgICBHVCAgICAgICAgICAgIExMX1VTQVJUX1NldFNtYXJ0Y2FyZEd1YXJkVGltZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBHdWFyZFRpbWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRTbWFydGNhcmRHdWFyZFRpbWUoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBHdWFyZFRpbWUpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5HVFBSLCBVU0FSVF9HVFBSX0dULCBHdWFyZFRpbWUgPDwgVVNBUlRfR1RQUl9HVF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBTbWFydGNhcmQgR3VhcmQgdGltZSB2YWx1ZSwgZXhwcmVzc2VkIGluIG5iIG9mIGJhdWQgY2xvY2tzIHBlcmlvZHMKKyAgKiAgICAgICAgIChHVFs3OjBdIGJpdHMgOiBHdWFyZCB0aW1lIHZhbHVlKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBHVFBSICAgICAgICAgR1QgICAgICAgICAgICBMTF9VU0FSVF9HZXRTbWFydGNhcmRHdWFyZFRpbWUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU21hcnRjYXJkIEd1YXJkIHRpbWUgdmFsdWUgKFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRikKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRTbWFydGNhcmRHdWFyZFRpbWUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkdUUFIsIFVTQVJUX0dUUFJfR1QpID4+IFVTQVJUX0dUUFJfR1RfUG9zKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9Db25maWd1cmF0aW9uX0hhbGZEdXBsZXggQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgcmVsYXRlZCB0byBIYWxmIER1cGxleCBmZWF0dXJlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgU2luZ2xlIFdpcmUgSGFsZi1EdXBsZXggbW9kZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0hBTEZEVVBMRVhfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSGFsZi1EdXBsZXggbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX1VTQVJUX0VuYWJsZUhhbGZEdXBsZXgKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSGFsZkR1cGxleChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19IRFNFTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBTaW5nbGUgV2lyZSBIYWxmLUR1cGxleCBtb2RlCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfSEFMRkRVUExFWF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBIYWxmLUR1cGxleCBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEhEU0VMICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUhhbGZEdXBsZXgKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUhhbGZEdXBsZXgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19IRFNFTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgU2luZ2xlIFdpcmUgSGFsZi1EdXBsZXggbW9kZSBpcyBlbmFibGVkCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfSEFMRkRVUExFWF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBIYWxmLUR1cGxleCBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEhEU0VMICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSGFsZkR1cGxleAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSGFsZkR1cGxleChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19IRFNFTCkgPT0gKFVTQVJUX0NSM19IRFNFTCkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VGX0NvbmZpZ3VyYXRpb25fTElOIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIHJlbGF0ZWQgdG8gTElOIGZlYXR1cmUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBMSU4gQnJlYWsgRGV0ZWN0aW9uIExlbmd0aAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0xJTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBMSU4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMQkRMICAgICAgICAgIExMX1VTQVJUX1NldExJTkJya0RldGVjdGlvbkxlbgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBMSU5CRExlbmd0aCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0xJTkJSRUFLX0RFVEVDVF8xMEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9MSU5CUkVBS19ERVRFQ1RfMTFCCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRMSU5CcmtEZXRlY3Rpb25MZW4oVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBMSU5CRExlbmd0aCkKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0xCREwsIExJTkJETGVuZ3RoKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gTElOIEJyZWFrIERldGVjdGlvbiBMZW5ndGgKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9MSU5fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgTElOIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTEJETCAgICAgICAgICBMTF9VU0FSVF9HZXRMSU5CcmtEZXRlY3Rpb25MZW4KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9MSU5CUkVBS19ERVRFQ1RfMTBCCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfTElOQlJFQUtfREVURUNUXzExQgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldExJTkJya0RldGVjdGlvbkxlbihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTEJETCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBMSU4gbW9kZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0xJTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBMSU4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMSU5FTiAgICAgICAgIExMX1VTQVJUX0VuYWJsZUxJTgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVMSU4oVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTElORU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgTElOIG1vZGUKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9MSU5fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgTElOIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTElORU4gICAgICAgICBMTF9VU0FSVF9EaXNhYmxlTElOCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVMSU4oVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9MSU5FTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgTElOIG1vZGUgaXMgZW5hYmxlZAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0xJTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBMSU4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMSU5FTiAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZExJTgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkTElOKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0xJTkVOKSA9PSAoVVNBUlRfQ1IyX0xJTkVOKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUZfQ29uZmlndXJhdGlvbl9ERSBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyByZWxhdGVkIHRvIERyaXZlciBFbmFibGUgZmVhdHVyZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IERFRFQgKERyaXZlciBFbmFibGUgRGUtQXNzZXJ0aW9uIFRpbWUpLCBUaW1lIHZhbHVlIGV4cHJlc3NlZCBvbiA1IGJpdHMgKFs0OjBdIGJpdHMpLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0RSSVZFUl9FTkFCTEVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRHJpdmVyIEVuYWJsZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIERFRFQgICAgICAgICAgTExfVVNBUlRfU2V0REVEZWFzc2VydGlvblRpbWUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTMxCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRERURlYXNzZXJ0aW9uVGltZShVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IFRpbWUpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9ERURULCBUaW1lIDw8IFVTQVJUX0NSMV9ERURUX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIERFRFQgKERyaXZlciBFbmFibGUgRGUtQXNzZXJ0aW9uIFRpbWUpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRFJJVkVSX0VOQUJMRV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBEcml2ZXIgRW5hYmxlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgREVEVCAgICAgICAgICBMTF9VU0FSVF9HZXRERURlYXNzZXJ0aW9uVGltZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBUaW1lIHZhbHVlIGV4cHJlc3NlZCBvbiA1IGJpdHMgKFs0OjBdIGJpdHMpIDogVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0zMQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldERFRGVhc3NlcnRpb25UaW1lKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9ERURUKSA+PiBVU0FSVF9DUjFfREVEVF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBERUFUIChEcml2ZXIgRW5hYmxlIEFzc2VydGlvbiBUaW1lKSwgVGltZSB2YWx1ZSBleHByZXNzZWQgb24gNSBiaXRzIChbNDowXSBiaXRzKS4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9EUklWRVJfRU5BQkxFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIERyaXZlciBFbmFibGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBERUFUICAgICAgICAgIExMX1VTQVJUX1NldERFQXNzZXJ0aW9uVGltZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBUaW1lIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MzEKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldERFQXNzZXJ0aW9uVGltZShVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IFRpbWUpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9ERUFULCBUaW1lIDw8IFVTQVJUX0NSMV9ERUFUX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIERFQVQgKERyaXZlciBFbmFibGUgQXNzZXJ0aW9uIFRpbWUpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRFJJVkVSX0VOQUJMRV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBEcml2ZXIgRW5hYmxlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgREVBVCAgICAgICAgICBMTF9VU0FSVF9HZXRERUFzc2VydGlvblRpbWUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgVGltZSB2YWx1ZSBleHByZXNzZWQgb24gNSBiaXRzIChbNDowXSBiaXRzKSA6IFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MzEKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRERUFzc2VydGlvblRpbWUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX0RFQVQpID4+IFVTQVJUX0NSMV9ERUFUX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERyaXZlciBFbmFibGUgKERFKSBNb2RlCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRFJJVkVSX0VOQUJMRV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBEcml2ZXIgRW5hYmxlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgREVNICAgICAgICAgICBMTF9VU0FSVF9FbmFibGVERU1vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlREVNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0RFTSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBEcml2ZXIgRW5hYmxlIChERSkgTW9kZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0RSSVZFUl9FTkFCTEVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRHJpdmVyIEVuYWJsZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIERFTSAgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZURFTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlREVNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfREVNKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBEcml2ZXIgRW5hYmxlIChERSkgTW9kZSBpcyBlbmFibGVkCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRFJJVkVSX0VOQUJMRV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBEcml2ZXIgRW5hYmxlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgREVNICAgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRERU1vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZERFTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ERU0pID09IChVU0FSVF9DUjNfREVNKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VsZWN0IERyaXZlciBFbmFibGUgUG9sYXJpdHkKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9EUklWRVJfRU5BQkxFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIERyaXZlciBFbmFibGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBERVAgICAgICAgICAgIExMX1VTQVJUX1NldERFU2lnbmFsUG9sYXJpdHkKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ERV9QT0xBUklUWV9ISUdICisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfREVfUE9MQVJJVFlfTE9XCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRERVNpZ25hbFBvbGFyaXR5KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgUG9sYXJpdHkpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ERVAsIFBvbGFyaXR5KTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gRHJpdmVyIEVuYWJsZSBQb2xhcml0eQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0RSSVZFUl9FTkFCTEVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRHJpdmVyIEVuYWJsZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIERFUCAgICAgICAgICAgTExfVVNBUlRfR2V0REVTaWduYWxQb2xhcml0eQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RFX1BPTEFSSVRZX0hJR0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ERV9QT0xBUklUWV9MT1cKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRERVNpZ25hbFBvbGFyaXR5KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ERVApKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9BZHZhbmNlZENvbmZpZ3VyYXRpb24gQWR2YW5jZWQgQ29uZmlndXJhdGlvbnMgc2VydmljZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFBlcmZvcm0gYmFzaWMgY29uZmlndXJhdGlvbiBvZiBVU0FSVCBmb3IgZW5hYmxpbmcgdXNlIGluIEFzeW5jaHJvbm91cyBNb2RlIChVQVJUKQorICAqIEBub3RlICAgSW4gVUFSVCBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CisgICogICAgICAgICAgIC0gTElORU4gYml0IGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgICogICAgICAgICAgIC0gQ0xLRU4gYml0IGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgICogICAgICAgICAgIC0gU0NFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBJUkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIEhEU0VMIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLgorICAqIEBub3RlICAgQ2FsbCBvZiB0aGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZm9sbG93aW5nIGZ1bmN0aW9uIGNhbGwgc2VxdWVuY2UgOgorICAqICAgICAgICAgLSBDbGVhciBMSU5FTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlTElOKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgQ0xLRU4gaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZVNDTEtPdXRwdXQoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDbGVhciBTQ0VOIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVTbWFydGNhcmQoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDbGVhciBJUkVOIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVJcmRhKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgSERTRUwgaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUhhbGZEdXBsZXgoKSBmdW5jdGlvbgorICAqIEBub3RlICAgT3RoZXIgcmVtYWluaW5nIGNvbmZpZ3VyYXRpb25zIGl0ZW1zIHJlbGF0ZWQgdG8gQXN5bmNocm9ub3VzIE1vZGUKKyAgKiAgICAgICAgIChhcyBCYXVkIFJhdGUsIFdvcmQgbGVuZ3RoLCBQYXJpdHksIC4uLikgc2hvdWxkIGJlIHNldCB1c2luZworICAqICAgICAgICAgZGVkaWNhdGVkIGZ1bmN0aW9ucworICAqIEBybXRvbGwgQ1IyICAgICAgICAgIExJTkVOICAgICAgICAgTExfVVNBUlRfQ29uZmlnQXN5bmNNb2RlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBDTEtFTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0FzeW5jTW9kZVxuCisgICogICAgICAgICBDUjMgICAgICAgICAgU0NFTiAgICAgICAgICBMTF9VU0FSVF9Db25maWdBc3luY01vZGVcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIElSRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnQXN5bmNNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0FzeW5jTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9Db25maWdBc3luY01vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICAvKiBJbiBBc3luY2hyb25vdXMgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAtIExJTkVOLCBDTEtFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgIC0gU0NFTiwgSVJFTiBhbmQgSERTRUwgYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLiovCisgIENMRUFSX0JJVChVU0FSVHgtPkNSMiwgKFVTQVJUX0NSMl9MSU5FTiB8IFVTQVJUX0NSMl9DTEtFTikpOworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIChVU0FSVF9DUjNfU0NFTiB8IFVTQVJUX0NSM19JUkVOIHwgVVNBUlRfQ1IzX0hEU0VMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUGVyZm9ybSBiYXNpYyBjb25maWd1cmF0aW9uIG9mIFVTQVJUIGZvciBlbmFibGluZyB1c2UgaW4gU3luY2hyb25vdXMgTW9kZQorICAqIEBub3RlICAgSW4gU3luY2hyb25vdXMgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAqICAgICAgICAgICAtIExJTkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIFNDRU4gYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIsCisgICogICAgICAgICAgIC0gSVJFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBIRFNFTCBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4KKyAgKiAgICAgICAgIFRoaXMgZnVuY3Rpb24gYWxzbyBzZXRzIHRoZSBVU0FSVCBpbiBTeW5jaHJvbm91cyBtb2RlLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTeW5jaHJvbm91cyBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBub3RlICAgQ2FsbCBvZiB0aGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZm9sbG93aW5nIGZ1bmN0aW9uIGNhbGwgc2VxdWVuY2UgOgorICAqICAgICAgICAgLSBDbGVhciBMSU5FTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlTElOKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgSVJFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlSXJkYSgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIFNDRU4gaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZVNtYXJ0Y2FyZCgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIEhEU0VMIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVIYWxmRHVwbGV4KCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gU2V0IENMS0VOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0VuYWJsZVNDTEtPdXRwdXQoKSBmdW5jdGlvbgorICAqIEBub3RlICAgT3RoZXIgcmVtYWluaW5nIGNvbmZpZ3VyYXRpb25zIGl0ZW1zIHJlbGF0ZWQgdG8gU3luY2hyb25vdXMgTW9kZQorICAqICAgICAgICAgKGFzIEJhdWQgUmF0ZSwgV29yZCBsZW5ndGgsIFBhcml0eSwgQ2xvY2sgUG9sYXJpdHksIC4uLikgc2hvdWxkIGJlIHNldCB1c2luZworICAqICAgICAgICAgZGVkaWNhdGVkIGZ1bmN0aW9ucworICAqIEBybXRvbGwgQ1IyICAgICAgICAgIExJTkVOICAgICAgICAgTExfVVNBUlRfQ29uZmlnU3luY01vZGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIENMS0VOICAgICAgICAgTExfVVNBUlRfQ29uZmlnU3luY01vZGVcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIFNDRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnU3luY01vZGVcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIElSRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnU3luY01vZGVcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIEhEU0VMICAgICAgICAgTExfVVNBUlRfQ29uZmlnU3luY01vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnU3luY01vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICAvKiBJbiBTeW5jaHJvbm91cyBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CisgIC0gTElORU4gYml0IGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgIC0gU0NFTiwgSVJFTiBhbmQgSERTRUwgYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLiovCisgIENMRUFSX0JJVChVU0FSVHgtPkNSMiwgKFVTQVJUX0NSMl9MSU5FTikpOworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIChVU0FSVF9DUjNfU0NFTiB8IFVTQVJUX0NSM19JUkVOIHwgVVNBUlRfQ1IzX0hEU0VMKSk7CisgIC8qIHNldCB0aGUgVUFSVC9VU0FSVCBpbiBTeW5jaHJvbm91cyBtb2RlICovCisgIFNFVF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9DTEtFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgUGVyZm9ybSBiYXNpYyBjb25maWd1cmF0aW9uIG9mIFVTQVJUIGZvciBlbmFibGluZyB1c2UgaW4gTElOIE1vZGUKKyAgKiBAbm90ZSAgIEluIExJTiBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CisgICogICAgICAgICAgIC0gU1RPUCBhbmQgQ0xLRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIFNDRU4gYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIsCisgICogICAgICAgICAgIC0gSVJFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBIRFNFTCBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4KKyAgKiAgICAgICAgIFRoaXMgZnVuY3Rpb24gYWxzbyBzZXQgdGhlIFVBUlQvVVNBUlQgaW4gTElOIG1vZGUuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfTElOX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIExJTiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBub3RlICAgQ2FsbCBvZiB0aGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZm9sbG93aW5nIGZ1bmN0aW9uIGNhbGwgc2VxdWVuY2UgOgorICAqICAgICAgICAgLSBDbGVhciBDTEtFTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlU0NMS091dHB1dCgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIFNUT1AgaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfU2V0U3RvcEJpdHNMZW5ndGgoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDbGVhciBTQ0VOIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVTbWFydGNhcmQoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDbGVhciBJUkVOIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVJcmRhKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgSERTRUwgaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUhhbGZEdXBsZXgoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBTZXQgTElORU4gaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfRW5hYmxlTElOKCkgZnVuY3Rpb24KKyAgKiBAbm90ZSAgIE90aGVyIHJlbWFpbmluZyBjb25maWd1cmF0aW9ucyBpdGVtcyByZWxhdGVkIHRvIExJTiBNb2RlCisgICogICAgICAgICAoYXMgQmF1ZCBSYXRlLCBXb3JkIGxlbmd0aCwgTElOIEJyZWFrIERldGVjdGlvbiBMZW5ndGgsIC4uLikgc2hvdWxkIGJlIHNldCB1c2luZworICAqICAgICAgICAgZGVkaWNhdGVkIGZ1bmN0aW9ucworICAqIEBybXRvbGwgQ1IyICAgICAgICAgIENMS0VOICAgICAgICAgTExfVVNBUlRfQ29uZmlnTElOTW9kZVxuCisgICogICAgICAgICBDUjIgICAgICAgICAgU1RPUCAgICAgICAgICBMTF9VU0FSVF9Db25maWdMSU5Nb2RlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBMSU5FTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0xJTk1vZGVcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIElSRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnTElOTW9kZVxuCisgICogICAgICAgICBDUjMgICAgICAgICAgU0NFTiAgICAgICAgICBMTF9VU0FSVF9Db25maWdMSU5Nb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0xJTk1vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnTElOTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIC8qIEluIExJTiBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CisgIC0gU1RPUCBhbmQgQ0xLRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAtIElSRU4sIFNDRU4gYW5kIEhEU0VMIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4qLworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjIsIChVU0FSVF9DUjJfQ0xLRU4gfCBVU0FSVF9DUjJfU1RPUCkpOworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIChVU0FSVF9DUjNfSVJFTiB8IFVTQVJUX0NSM19TQ0VOIHwgVVNBUlRfQ1IzX0hEU0VMKSk7CisgIC8qIFNldCB0aGUgVUFSVC9VU0FSVCBpbiBMSU4gbW9kZSAqLworICBTRVRfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTElORU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFBlcmZvcm0gYmFzaWMgY29uZmlndXJhdGlvbiBvZiBVU0FSVCBmb3IgZW5hYmxpbmcgdXNlIGluIEhhbGYgRHVwbGV4IE1vZGUKKyAgKiBAbm90ZSAgIEluIEhhbGYgRHVwbGV4IG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgKiAgICAgICAgICAgLSBMSU5FTiBiaXQgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBDTEtFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBTQ0VOIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIElSRU4gYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIsCisgICogICAgICAgICBUaGlzIGZ1bmN0aW9uIGFsc28gc2V0cyB0aGUgVUFSVC9VU0FSVCBpbiBIYWxmIER1cGxleCBtb2RlLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0hBTEZEVVBMRVhfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSGFsZi1EdXBsZXggbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIENhbGwgb2YgdGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGZvbGxvd2luZyBmdW5jdGlvbiBjYWxsIHNlcXVlbmNlIDoKKyAgKiAgICAgICAgIC0gQ2xlYXIgTElORU4gaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUxJTigpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIENMS0VOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVTQ0xLT3V0cHV0KCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgU0NFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlU21hcnRjYXJkKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgSVJFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlSXJkYSgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIFNldCBIRFNFTCBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9FbmFibGVIYWxmRHVwbGV4KCkgZnVuY3Rpb24KKyAgKiBAbm90ZSAgIE90aGVyIHJlbWFpbmluZyBjb25maWd1cmF0aW9ucyBpdGVtcyByZWxhdGVkIHRvIEhhbGYgRHVwbGV4IE1vZGUKKyAgKiAgICAgICAgIChhcyBCYXVkIFJhdGUsIFdvcmQgbGVuZ3RoLCBQYXJpdHksIC4uLikgc2hvdWxkIGJlIHNldCB1c2luZworICAqICAgICAgICAgZGVkaWNhdGVkIGZ1bmN0aW9ucworICAqIEBybXRvbGwgQ1IyICAgICAgICAgIExJTkVOICAgICAgICAgTExfVVNBUlRfQ29uZmlnSGFsZkR1cGxleE1vZGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIENMS0VOICAgICAgICAgTExfVVNBUlRfQ29uZmlnSGFsZkR1cGxleE1vZGVcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIEhEU0VMICAgICAgICAgTExfVVNBUlRfQ29uZmlnSGFsZkR1cGxleE1vZGVcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIFNDRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnSGFsZkR1cGxleE1vZGVcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIElSRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnSGFsZkR1cGxleE1vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnSGFsZkR1cGxleE1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICAvKiBJbiBIYWxmIER1cGxleCBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CisgIC0gTElORU4gYW5kIENMS0VOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgLSBTQ0VOIGFuZCBJUkVOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4qLworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjIsIChVU0FSVF9DUjJfTElORU4gfCBVU0FSVF9DUjJfQ0xLRU4pKTsKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCAoVVNBUlRfQ1IzX1NDRU4gfCBVU0FSVF9DUjNfSVJFTikpOworICAvKiBzZXQgdGhlIFVBUlQvVVNBUlQgaW4gSGFsZiBEdXBsZXggbW9kZSAqLworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfSERTRUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFBlcmZvcm0gYmFzaWMgY29uZmlndXJhdGlvbiBvZiBVU0FSVCBmb3IgZW5hYmxpbmcgdXNlIGluIFNtYXJ0Y2FyZCBNb2RlCisgICogQG5vdGUgICBJbiBTbWFydGNhcmQgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAqICAgICAgICAgICAtIExJTkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIElSRU4gYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIsCisgICogICAgICAgICAgIC0gSERTRUwgYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuCisgICogICAgICAgICBUaGlzIGZ1bmN0aW9uIGFsc28gY29uZmlndXJlcyBTdG9wIGJpdHMgdG8gMS41IGJpdHMgYW5kCisgICogICAgICAgICBzZXRzIHRoZSBVU0FSVCBpbiBTbWFydGNhcmQgbW9kZSAoU0NFTiBiaXQpLgorICAqICAgICAgICAgQ2xvY2sgT3V0cHV0IGlzIGFsc28gZW5hYmxlZCAoQ0xLRU4pLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQG5vdGUgICBDYWxsIG9mIHRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBmb2xsb3dpbmcgZnVuY3Rpb24gY2FsbCBzZXF1ZW5jZSA6CisgICogICAgICAgICAtIENsZWFyIExJTkVOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVMSU4oKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDbGVhciBJUkVOIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVJcmRhKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgSERTRUwgaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUhhbGZEdXBsZXgoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDb25maWd1cmUgU1RPUCBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9TZXRTdG9wQml0c0xlbmd0aCgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIFNldCBDTEtFTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9FbmFibGVTQ0xLT3V0cHV0KCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gU2V0IFNDRU4gaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRW5hYmxlU21hcnRjYXJkKCkgZnVuY3Rpb24KKyAgKiBAbm90ZSAgIE90aGVyIHJlbWFpbmluZyBjb25maWd1cmF0aW9ucyBpdGVtcyByZWxhdGVkIHRvIFNtYXJ0Y2FyZCBNb2RlCisgICogICAgICAgICAoYXMgQmF1ZCBSYXRlLCBXb3JkIGxlbmd0aCwgUGFyaXR5LCAuLi4pIHNob3VsZCBiZSBzZXQgdXNpbmcKKyAgKiAgICAgICAgIGRlZGljYXRlZCBmdW5jdGlvbnMKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMSU5FTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ1NtYXJ0Y2FyZE1vZGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIFNUT1AgICAgICAgICAgTExfVVNBUlRfQ29uZmlnU21hcnRjYXJkTW9kZVxuCisgICogICAgICAgICBDUjIgICAgICAgICAgQ0xLRU4gICAgICAgICBMTF9VU0FSVF9Db25maWdTbWFydGNhcmRNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX1VTQVJUX0NvbmZpZ1NtYXJ0Y2FyZE1vZGVcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIFNDRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnU21hcnRjYXJkTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9Db25maWdTbWFydGNhcmRNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgLyogSW4gU21hcnRjYXJkIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgLSBMSU5FTiBiaXQgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgLSBJUkVOIGFuZCBIRFNFTCBiaXRzIGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuKi8KKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCAoVVNBUlRfQ1IyX0xJTkVOKSk7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgKFVTQVJUX0NSM19JUkVOIHwgVVNBUlRfQ1IzX0hEU0VMKSk7CisgIC8qIENvbmZpZ3VyZSBTdG9wIGJpdHMgdG8gMS41IGJpdHMgKi8KKyAgLyogU3luY2hyb25vdXMgbW9kZSBpcyBhY3RpdmF0ZWQgYnkgZGVmYXVsdCAqLworICBTRVRfQklUKFVTQVJUeC0+Q1IyLCAoVVNBUlRfQ1IyX1NUT1BfMCB8IFVTQVJUX0NSMl9TVE9QXzEgfCBVU0FSVF9DUjJfQ0xLRU4pKTsKKyAgLyogc2V0IHRoZSBVQVJUL1VTQVJUIGluIFNtYXJ0Y2FyZCBtb2RlICovCisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19TQ0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBQZXJmb3JtIGJhc2ljIGNvbmZpZ3VyYXRpb24gb2YgVVNBUlQgZm9yIGVuYWJsaW5nIHVzZSBpbiBJcmRhIE1vZGUKKyAgKiBAbm90ZSAgIEluIElSREEgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAqICAgICAgICAgICAtIExJTkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIFNUT1AgYW5kIENMS0VOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBTQ0VOIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIEhEU0VMIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLgorICAqICAgICAgICAgVGhpcyBmdW5jdGlvbiBhbHNvIHNldHMgdGhlIFVBUlQvVVNBUlQgaW4gSVJEQSBtb2RlIChJUkVOIGJpdCkuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX0lSREFfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSXJEQSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBub3RlICAgQ2FsbCBvZiB0aGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZm9sbG93aW5nIGZ1bmN0aW9uIGNhbGwgc2VxdWVuY2UgOgorICAqICAgICAgICAgLSBDbGVhciBMSU5FTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlTElOKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgQ0xLRU4gaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZVNDTEtPdXRwdXQoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDbGVhciBTQ0VOIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVTbWFydGNhcmQoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDbGVhciBIRFNFTCBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlSGFsZkR1cGxleCgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENvbmZpZ3VyZSBTVE9QIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX1NldFN0b3BCaXRzTGVuZ3RoKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gU2V0IElSRU4gaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRW5hYmxlSXJkYSgpIGZ1bmN0aW9uCisgICogQG5vdGUgICBPdGhlciByZW1haW5pbmcgY29uZmlndXJhdGlvbnMgaXRlbXMgcmVsYXRlZCB0byBJcmRhIE1vZGUKKyAgKiAgICAgICAgIChhcyBCYXVkIFJhdGUsIFdvcmQgbGVuZ3RoLCBQb3dlciBtb2RlLCAuLi4pIHNob3VsZCBiZSBzZXQgdXNpbmcKKyAgKiAgICAgICAgIGRlZGljYXRlZCBmdW5jdGlvbnMKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMSU5FTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0lyZGFNb2RlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBDTEtFTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0lyZGFNb2RlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBTVE9QICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0lyZGFNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBTQ0VOICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0lyZGFNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0lyZGFNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBJUkVOICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0lyZGFNb2RlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NvbmZpZ0lyZGFNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgLyogSW4gSVJEQSBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CisgIC0gTElORU4sIFNUT1AgYW5kIENMS0VOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgLSBTQ0VOIGFuZCBIRFNFTCBiaXRzIGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuKi8KKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCAoVVNBUlRfQ1IyX0xJTkVOIHwgVVNBUlRfQ1IyX0NMS0VOIHwgVVNBUlRfQ1IyX1NUT1ApKTsKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCAoVVNBUlRfQ1IzX1NDRU4gfCBVU0FSVF9DUjNfSERTRUwpKTsKKyAgLyogc2V0IHRoZSBVQVJUL1VTQVJUIGluIElSREEgbW9kZSAqLworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfSVJFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgUGVyZm9ybSBiYXNpYyBjb25maWd1cmF0aW9uIG9mIFVTQVJUIGZvciBlbmFibGluZyB1c2UgaW4gTXVsdGkgcHJvY2Vzc29yIE1vZGUKKyAgKiAgICAgICAgIChzZXZlcmFsIFVTQVJUcyBjb25uZWN0ZWQgaW4gYSBuZXR3b3JrLCBvbmUgb2YgdGhlIFVTQVJUcyBjYW4gYmUgdGhlIG1hc3RlciwKKyAgKiAgICAgICAgIGl0cyBUWCBvdXRwdXQgY29ubmVjdGVkIHRvIHRoZSBSWCBpbnB1dHMgb2YgdGhlIG90aGVyIHNsYXZlcyBVU0FSVHMpLgorICAqIEBub3RlICAgSW4gTXVsdGlQcm9jZXNzb3IgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAqICAgICAgICAgICAtIExJTkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIENMS0VOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIFNDRU4gYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIsCisgICogICAgICAgICAgIC0gSVJFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBIRFNFTCBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4KKyAgKiBAbm90ZSAgIENhbGwgb2YgdGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGZvbGxvd2luZyBmdW5jdGlvbiBjYWxsIHNlcXVlbmNlIDoKKyAgKiAgICAgICAgIC0gQ2xlYXIgTElORU4gaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUxJTigpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIENMS0VOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVTQ0xLT3V0cHV0KCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgU0NFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlU21hcnRjYXJkKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgSVJFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlSXJkYSgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIEhEU0VMIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVIYWxmRHVwbGV4KCkgZnVuY3Rpb24KKyAgKiBAbm90ZSAgIE90aGVyIHJlbWFpbmluZyBjb25maWd1cmF0aW9ucyBpdGVtcyByZWxhdGVkIHRvIE11bHRpIHByb2Nlc3NvciBNb2RlCisgICogICAgICAgICAoYXMgQmF1ZCBSYXRlLCBXYWtlIFVwIE1ldGhvZCwgTm9kZSBhZGRyZXNzLCAuLi4pIHNob3VsZCBiZSBzZXQgdXNpbmcKKyAgKiAgICAgICAgIGRlZGljYXRlZCBmdW5jdGlvbnMKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMSU5FTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ011bHRpUHJvY2Vzc01vZGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIENMS0VOICAgICAgICAgTExfVVNBUlRfQ29uZmlnTXVsdGlQcm9jZXNzTW9kZVxuCisgICogICAgICAgICBDUjMgICAgICAgICAgU0NFTiAgICAgICAgICBMTF9VU0FSVF9Db25maWdNdWx0aVByb2Nlc3NNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX1VTQVJUX0NvbmZpZ011bHRpUHJvY2Vzc01vZGVcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIElSRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnTXVsdGlQcm9jZXNzTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9Db25maWdNdWx0aVByb2Nlc3NNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgLyogSW4gTXVsdGkgUHJvY2Vzc29yIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgLSBMSU5FTiBhbmQgQ0xLRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAtIElSRU4sIFNDRU4gYW5kIEhEU0VMIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4qLworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjIsIChVU0FSVF9DUjJfTElORU4gfCBVU0FSVF9DUjJfQ0xLRU4pKTsKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCAoVVNBUlRfQ1IzX1NDRU4gfCBVU0FSVF9DUjNfSERTRUwgfCBVU0FSVF9DUjNfSVJFTikpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VGX0ZMQUdfTWFuYWdlbWVudCBGTEFHX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBQYXJpdHkgRXJyb3IgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgUEUgICAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfUEUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19QRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9QRSkgPT0gKFVTQVJUX0lTUl9QRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBGcmFtaW5nIEVycm9yIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEZFICAgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0ZFCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfRkUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfRkUpID09IChVU0FSVF9JU1JfRkUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgTm9pc2UgZXJyb3IgZGV0ZWN0ZWQgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgTkYgICAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfTkUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19ORShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9ORSkgPT0gKFVTQVJUX0lTUl9ORSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBPdmVyUnVuIEVycm9yIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIE9SRSAgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX09SRQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX09SRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9PUkUpID09IChVU0FSVF9JU1JfT1JFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIElETEUgbGluZSBkZXRlY3RlZCBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBJRExFICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19JRExFCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfSURMRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9JRExFKSA9PSAoVVNBUlRfSVNSX0lETEUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgUmVhZCBEYXRhIFJlZ2lzdGVyIE5vdCBFbXB0eSBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBSWE5FICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19SWE5FCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfUlhORShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9SWE5FKSA9PSAoVVNBUlRfSVNSX1JYTkUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRDICAgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1RDCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfVEMoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfVEMpID09IChVU0FSVF9JU1JfVEMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBFbXB0eSBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUWEUgICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19UWEUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19UWEUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfVFhFKSA9PSAoVVNBUlRfSVNSX1RYRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBMSU4gQnJlYWsgRGV0ZWN0aW9uIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0xJTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBMSU4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBMQkRGICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19MQkQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19MQkQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfTEJERikgPT0gKFVTQVJUX0lTUl9MQkRGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIENUUyBpbnRlcnJ1cHQgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfSFdGTE9XX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEhhcmR3YXJlIEZsb3cgY29udHJvbCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIENUU0lGICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX25DVFMKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19uQ1RTKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX0NUU0lGKSA9PSAoVVNBUlRfSVNSX0NUU0lGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIENUUyBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9IV0ZMT1dfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSGFyZHdhcmUgRmxvdyBjb250cm9sIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQ1RTICAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfQ1RTCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfQ1RTKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX0NUUykgPT0gKFVTQVJUX0lTUl9DVFMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgUmVjZWl2ZXIgVGltZSBPdXQgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgUlRPRiAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfUlRPCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfUlRPKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX1JUT0YpID09IChVU0FSVF9JU1JfUlRPRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBFbmQgT2YgQmxvY2sgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBFT0JGICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19FT0IKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19FT0IoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfRU9CRikgPT0gKFVTQVJUX0lTUl9FT0JGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIEF1dG8tQmF1ZCBSYXRlIEVycm9yIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9BVVRPQkFVRFJBVEVfREVURUNUSU9OX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEF1dG8gQmF1ZCBSYXRlIGRldGVjdGlvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEFCUkUgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0FCUkUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19BQlJFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX0FCUkUpID09IChVU0FSVF9JU1JfQUJSRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBBdXRvLUJhdWQgUmF0ZSBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVVNBUlRfQVVUT0JBVURSQVRFX0RFVEVDVElPTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBBdXRvIEJhdWQgUmF0ZSBkZXRlY3Rpb24gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBBQlJGICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19BQlIKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19BQlIoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfQUJSRikgPT0gKFVTQVJUX0lTUl9BQlJGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIEJ1c3kgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQlVTWSAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfQlVTWQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0JVU1koVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfQlVTWSkgPT0gKFVTQVJUX0lTUl9CVVNZKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIENoYXJhY3RlciBNYXRjaCBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBDTUYgICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19DTQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0NNKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX0NNRikgPT0gKFVTQVJUX0lTUl9DTUYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgU2VuZCBCcmVhayBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBTQktGICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19TQksKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19TQksoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfU0JLRikgPT0gKFVTQVJUX0lTUl9TQktGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFJlY2VpdmUgV2FrZSBVcCBmcm9tIG11dGUgbW9kZSBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBSV1UgICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19SV1UKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19SV1UoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfUldVKSA9PSAoVVNBUlRfSVNSX1JXVSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBXYWtlIFVwIGZyb20gc3RvcCBtb2RlIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBXYWtlLXVwIGZyb20gU3RvcCBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgV1VGICAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfV0tVUAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1dLVVAoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfV1VGKSA9PSAoVVNBUlRfSVNSX1dVRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBUcmFuc21pdCBFbmFibGUgQWNrbm93bGVkZ2UgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVEVBQ0sgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfVEVBQ0sKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19URUFDSyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9URUFDSykgPT0gKFVTQVJUX0lTUl9URUFDSykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBSZWNlaXZlIEVuYWJsZSBBY2tub3dsZWRnZSBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBSRUFDSyAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19SRUFDSworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1JFQUNLKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX1JFQUNLKSA9PSAoVVNBUlRfSVNSX1JFQUNLKSk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBDbGVhciBQYXJpdHkgRXJyb3IgRmxhZworICAqIEBybXRvbGwgSUNSICAgICAgICAgIFBFQ0YgICAgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX1BFCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NsZWFyRmxhZ19QRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX1BFQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIEZyYW1pbmcgRXJyb3IgRmxhZworICAqIEBybXRvbGwgSUNSICAgICAgICAgIEZFQ0YgICAgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX0ZFCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NsZWFyRmxhZ19GRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX0ZFQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIE5vaXNlIGRldGVjdGVkIEZsYWcKKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBOQ0YgICAgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19ORQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfTkUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBXUklURV9SRUcoVVNBUlR4LT5JQ1IsIFVTQVJUX0lDUl9OQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIE92ZXJSdW4gRXJyb3IgRmxhZworICAqIEBybXRvbGwgSUNSICAgICAgICAgIE9SRUNGICAgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX09SRQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfT1JFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfT1JFQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIElETEUgbGluZSBkZXRlY3RlZCBGbGFnCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgSURMRUNGICAgICAgICBMTF9VU0FSVF9DbGVhckZsYWdfSURMRQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfSURMRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX0lETEVDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEZsYWcKKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBUQ0NGICAgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19UQworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfVEMoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBXUklURV9SRUcoVVNBUlR4LT5JQ1IsIFVTQVJUX0lDUl9UQ0NGKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIExJTiBCcmVhayBEZXRlY3Rpb24gRmxhZworICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0xJTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBMSU4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBMQkRDRiAgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19MQkQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ2xlYXJGbGFnX0xCRChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX0xCRENGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDVFMgSW50ZXJydXB0IEZsYWcKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9IV0ZMT1dfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSGFyZHdhcmUgRmxvdyBjb250cm9sIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgQ1RTQ0YgICAgICAgICBMTF9VU0FSVF9DbGVhckZsYWdfbkNUUworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfbkNUUyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX0NUU0NGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBSZWNlaXZlciBUaW1lIE91dCBGbGFnCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgUlRPQ0YgICAgICAgICBMTF9VU0FSVF9DbGVhckZsYWdfUlRPCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NsZWFyRmxhZ19SVE8oVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBXUklURV9SRUcoVVNBUlR4LT5JQ1IsIFVTQVJUX0lDUl9SVE9DRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgRW5kIE9mIEJsb2NrIEZsYWcKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIEVPQkNGICAgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX0VPQgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfRU9CKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfRU9CQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYXJhY3RlciBNYXRjaCBGbGFnCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgQ01DRiAgICAgICAgICBMTF9VU0FSVF9DbGVhckZsYWdfQ00KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ2xlYXJGbGFnX0NNKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfQ01DRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgV2FrZSBVcCBmcm9tIHN0b3AgbW9kZSBGbGFnCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFdha2UtdXAgZnJvbSBTdG9wIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBXVUNGICAgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19XS1VQCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NsZWFyRmxhZ19XS1VQKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfV1VDRik7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUZfSVRfTWFuYWdlbWVudCBJVF9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgSURMRSBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBJRExFSUUgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX0lETEUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfSURMRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9JRExFSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSWCBOb3QgRW1wdHkgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUlhORUlFICAgICAgICBMTF9VU0FSVF9FbmFibGVJVF9SWE5FCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX1JYTkUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUlhORUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRDSUUgICAgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfVEMKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfVEMoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVENJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFRYIEVtcHR5IEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRYRUlFICAgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfVFhFCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX1RYRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9UWEVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBQRUlFICAgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX1BFCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX1BFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBDaGFyYWN0ZXIgTWF0Y2ggSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQ01JRSAgICAgICAgICBMTF9VU0FSVF9FbmFibGVJVF9DTQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9DTShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9DTUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUmVjZWl2ZXIgVGltZW91dCBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSVE9JRSAgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX1JUTworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9SVE8oVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUlRPSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBFbmQgT2YgQmxvY2sgSW50ZXJydXB0CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBFT0JJRSAgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX0VPQgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9FT0IoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfRU9CSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBMSU4gQnJlYWsgRGV0ZWN0aW9uIEludGVycnVwdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0xJTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBMSU4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMQkRJRSAgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX0xCRAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9MQkQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTEJESUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBFcnJvciBJbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIFdoZW4gc2V0LCBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlIEJpdCBpcyBlbmFibGluZyBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBpbiBjYXNlIG9mIGEgZnJhbWluZworICAqICAgICAgICAgZXJyb3IsIG92ZXJydW4gZXJyb3Igb3Igbm9pc2UgZmxhZyAoRkU9MSBvciBPUkU9MSBvciBORj0xIGluIHRoZSBVU0FSVHhfSVNSIHJlZ2lzdGVyKS4KKyAgKiAgICAgICAgICAgMDogSW50ZXJydXB0IGlzIGluaGliaXRlZAorICAqICAgICAgICAgICAxOiBBbiBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIHdoZW4gRkU9MSBvciBPUkU9MSBvciBORj0xIGluIHRoZSBVU0FSVHhfSVNSIHJlZ2lzdGVyLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEVJRSAgICAgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfRVJST1IKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfRVJST1IoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQ1RTIEludGVycnVwdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBDVFNJRSAgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX0NUUworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9DVFMoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfQ1RTSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBXYWtlIFVwIGZyb20gU3RvcCBNb2RlIEludGVycnVwdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBXYWtlLXVwIGZyb20gU3RvcCBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgV1VGSUUgICAgICAgICBMTF9VU0FSVF9FbmFibGVJVF9XS1VQCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX1dLVVAoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfV1VGSUUpOworfQorCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBJRExFIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIElETEVJRSAgICAgICAgTExfVVNBUlRfRGlzYWJsZUlUX0lETEUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX0lETEUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9JRExFSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUlggTm90IEVtcHR5IEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJYTkVJRSAgICAgICAgTExfVVNBUlRfRGlzYWJsZUlUX1JYTkUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX1JYTkUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SWE5FSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRDSUUgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUlUX1RDCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJVF9UQyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1RDSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVFggRW1wdHkgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVFhFSUUgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfVFhFCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJVF9UWEUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9UWEVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBQYXJpdHkgRXJyb3IgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUEVJRSAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfUEUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX1BFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBDaGFyYWN0ZXIgTWF0Y2ggSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQ01JRSAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfQ00KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX0NNKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfQ01JRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSZWNlaXZlciBUaW1lb3V0IEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJUT0lFICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUlUX1JUTworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfUlRPKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUlRPSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRW5kIE9mIEJsb2NrIEludGVycnVwdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgRU9CSUUgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfRU9CCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJVF9FT0IoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9FT0JJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBMSU4gQnJlYWsgRGV0ZWN0aW9uIEludGVycnVwdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0xJTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBMSU4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMQkRJRSAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJVF9MQkQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX0xCRChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0xCRElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEVycm9yIEludGVycnVwdAorICAqIEBub3RlICAgV2hlbiBzZXQsIEVycm9yIEludGVycnVwdCBFbmFibGUgQml0IGlzIGVuYWJsaW5nIGludGVycnVwdCBnZW5lcmF0aW9uIGluIGNhc2Ugb2YgYSBmcmFtaW5nCisgICogICAgICAgICBlcnJvciwgb3ZlcnJ1biBlcnJvciBvciBub2lzZSBmbGFnIChGRT0xIG9yIE9SRT0xIG9yIE5GPTEgaW4gdGhlIFVTQVJUeF9JU1IgcmVnaXN0ZXIpLgorICAqICAgICAgICAgICAwOiBJbnRlcnJ1cHQgaXMgaW5oaWJpdGVkCisgICogICAgICAgICAgIDE6IEFuIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgd2hlbiBGRT0xIG9yIE9SRT0xIG9yIE5GPTEgaW4gdGhlIFVTQVJUeF9JU1IgcmVnaXN0ZXIuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRUlFICAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfRVJST1IKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX0VSUk9SKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIENUUyBJbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9IV0ZMT1dfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSGFyZHdhcmUgRmxvdyBjb250cm9sIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgQ1RTSUUgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfQ1RTCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJVF9DVFMoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19DVFNJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBXYWtlIFVwIGZyb20gU3RvcCBNb2RlIEludGVycnVwdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBXYWtlLXVwIGZyb20gU3RvcCBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgV1VGSUUgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfV0tVUAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfV0tVUChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1dVRklFKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBJRExFIEludGVycnVwdCAgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgSURMRUlFICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9JRExFCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9JRExFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX0lETEVJRSkgPT0gKFVTQVJUX0NSMV9JRExFSUUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgUlggTm90IEVtcHR5IEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJYTkVJRSAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSVRfUlhORQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSVRfUlhORShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SWE5FSUUpID09IChVU0FSVF9DUjFfUlhORUlFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBUQ0lFICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX1RDCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9UQyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9UQ0lFKSA9PSAoVVNBUlRfQ1IxX1RDSUUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgVFggRW1wdHkgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVFhFSUUgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9UWEUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZElUX1RYRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9UWEVJRSkgPT0gKFVTQVJUX0NSMV9UWEVJRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBQYXJpdHkgRXJyb3IgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUEVJRSAgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9QRQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSVRfUEUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUEVJRSkgPT0gKFVTQVJUX0NSMV9QRUlFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIENoYXJhY3RlciBNYXRjaCBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDTUlFICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX0NNCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9DTShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9DTUlFKSA9PSAoVVNBUlRfQ1IxX0NNSUUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgUmVjZWl2ZXIgVGltZW91dCBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSVE9JRSAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX1JUTworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSVRfUlRPKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1JUT0lFKSA9PSAoVVNBUlRfQ1IxX1JUT0lFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIEVuZCBPZiBCbG9jayBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEVPQklFICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSVRfRU9CCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9FT0IoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfRU9CSUUpID09IChVU0FSVF9DUjFfRU9CSUUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgTElOIEJyZWFrIERldGVjdGlvbiBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9MSU5fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgTElOIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTEJESUUgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9MQkQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZElUX0xCRChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9MQkRJRSkgPT0gKFVTQVJUX0NSMl9MQkRJRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBFcnJvciBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBFSUUgICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX0VSUk9SCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9FUlJPUihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19FSUUpID09IChVU0FSVF9DUjNfRUlFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIENUUyBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9IV0ZMT1dfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSGFyZHdhcmUgRmxvdyBjb250cm9sIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgQ1RTSUUgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9DVFMKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZElUX0NUUyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19DVFNJRSkgPT0gKFVTQVJUX0NSM19DVFNJRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBXYWtlIFVwIGZyb20gU3RvcCBNb2RlIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBXYWtlLXVwIGZyb20gU3RvcCBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgV1VGSUUgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9XS1VQCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9XS1VQKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1dVRklFKSA9PSAoVVNBUlRfQ1IzX1dVRklFKSk7Cit9CisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9ETUFfTWFuYWdlbWVudCBETUFfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERNQSBNb2RlIGZvciByZWNlcHRpb24KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBETUFSICAgICAgICAgIExMX1VTQVJUX0VuYWJsZURNQVJlcV9SWAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVETUFSZXFfUlgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBETUEgTW9kZSBmb3IgcmVjZXB0aW9uCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRE1BUiAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlRE1BUmVxX1JYCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVETUFSZXFfUlgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBETUEgTW9kZSBpcyBlbmFibGVkIGZvciByZWNlcHRpb24KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBETUFSICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZERNQVJlcV9SWAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkRE1BUmVxX1JYKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0RNQVIpID09IChVU0FSVF9DUjNfRE1BUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBETUEgTW9kZSBmb3IgdHJhbnNtaXNzaW9uCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRE1BVCAgICAgICAgICBMTF9VU0FSVF9FbmFibGVETUFSZXFfVFgKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlRE1BUmVxX1RYKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRE1BIE1vZGUgZm9yIHRyYW5zbWlzc2lvbgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIERNQVQgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZURNQVJlcV9UWAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlRE1BUmVxX1RYKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgRE1BIE1vZGUgaXMgZW5hYmxlZCBmb3IgdHJhbnNtaXNzaW9uCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRE1BVCAgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRETUFSZXFfVFgKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZERNQVJlcV9UWChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ETUFUKSA9PSAoVVNBUlRfQ1IzX0RNQVQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRE1BIERpc2FibGluZyBvbiBSZWNlcHRpb24gRXJyb3IKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBERFJFICAgICAgICAgIExMX1VTQVJUX0VuYWJsZURNQURlYWN0T25SeEVycgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVETUFEZWFjdE9uUnhFcnIoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRERSRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBETUEgRGlzYWJsaW5nIG9uIFJlY2VwdGlvbiBFcnJvcgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEREUkUgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZURNQURlYWN0T25SeEVycgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlRE1BRGVhY3RPblJ4RXJyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRERSRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgRE1BIERpc2FibGluZyBvbiBSZWNlcHRpb24gRXJyb3IgaXMgZGlzYWJsZWQKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBERFJFICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZERNQURlYWN0T25SeEVycgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkRE1BRGVhY3RPblJ4RXJyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0REUkUpID09IChVU0FSVF9DUjNfRERSRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgZGF0YSByZWdpc3RlciBhZGRyZXNzIHVzZWQgZm9yIERNQSB0cmFuc2ZlcgorICAqIEBybXRvbGwgUkRSICAgICAgICAgIFJEUiAgICAgICAgICAgTExfVVNBUlRfRE1BX0dldFJlZ0FkZHJcbgorICAqIEBybXRvbGwgVERSICAgICAgICAgIFREUiAgICAgICAgICAgTExfVVNBUlRfRE1BX0dldFJlZ0FkZHIKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgRGlyZWN0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRE1BX1JFR19EQVRBX1RSQU5TTUlUCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRE1BX1JFR19EQVRBX1JFQ0VJVkUKKyAgKiBAcmV0dmFsIEFkZHJlc3Mgb2YgZGF0YSByZWdpc3RlcgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0RNQV9HZXRSZWdBZGRyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgRGlyZWN0aW9uKQoreworICByZWdpc3RlciB1aW50MzJfdCBkYXRhX3JlZ19hZGRyID0gMFU7CisKKyAgaWYgKERpcmVjdGlvbiA9PSBMTF9VU0FSVF9ETUFfUkVHX0RBVEFfVFJBTlNNSVQpCisgIHsKKyAgICAvKiByZXR1cm4gYWRkcmVzcyBvZiBURFIgcmVnaXN0ZXIgKi8KKyAgICBkYXRhX3JlZ19hZGRyID0gKHVpbnQzMl90KSAmKFVTQVJUeC0+VERSKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiByZXR1cm4gYWRkcmVzcyBvZiBSRFIgcmVnaXN0ZXIgKi8KKyAgICBkYXRhX3JlZ19hZGRyID0gKHVpbnQzMl90KSAmKFVTQVJUeC0+UkRSKTsKKyAgfQorCisgIHJldHVybiBkYXRhX3JlZ19hZGRyOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VGX0RhdGFfTWFuYWdlbWVudCBEYXRhX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgUmVjZWl2ZXIgRGF0YSByZWdpc3RlciAoUmVjZWl2ZSBEYXRhIHZhbHVlLCA4IGJpdHMpCisgICogQHJtdG9sbCBSRFIgICAgICAgICAgUkRSICAgICAgICAgICBMTF9VU0FSVF9SZWNlaXZlRGF0YTgKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDhfdCBMTF9VU0FSVF9SZWNlaXZlRGF0YTgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQ4X3QpKFJFQURfQklUKFVTQVJUeC0+UkRSLCBVU0FSVF9SRFJfUkRSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVhZCBSZWNlaXZlciBEYXRhIHJlZ2lzdGVyIChSZWNlaXZlIERhdGEgdmFsdWUsIDkgYml0cykKKyAgKiBAcm10b2xsIFJEUiAgICAgICAgICBSRFIgICAgICAgICAgIExMX1VTQVJUX1JlY2VpdmVEYXRhOQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MUZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDE2X3QgTExfVVNBUlRfUmVjZWl2ZURhdGE5KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MTZfdCkoUkVBRF9CSVQoVVNBUlR4LT5SRFIsIFVTQVJUX1JEUl9SRFIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBpbiBUcmFuc21pdHRlciBEYXRhIFJlZ2lzdGVyIChUcmFuc21pdCBEYXRhIHZhbHVlLCA4IGJpdHMpCisgICogQHJtdG9sbCBURFIgICAgICAgICAgVERSICAgICAgICAgICBMTF9VU0FSVF9UcmFuc21pdERhdGE4CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfVHJhbnNtaXREYXRhOChVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQ4X3QgVmFsdWUpCit7CisgIFVTQVJUeC0+VERSID0gVmFsdWU7Cit9CisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgaW4gVHJhbnNtaXR0ZXIgRGF0YSBSZWdpc3RlciAoVHJhbnNtaXQgRGF0YSB2YWx1ZSwgOSBiaXRzKQorICAqIEBybXRvbGwgVERSICAgICAgICAgIFREUiAgICAgICAgICAgTExfVVNBUlRfVHJhbnNtaXREYXRhOQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MUZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9UcmFuc21pdERhdGE5KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDE2X3QgVmFsdWUpCit7CisgIFVTQVJUeC0+VERSID0gVmFsdWUgJiAweDFGRlU7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUZfRXhlY3V0aW9uIEV4ZWN1dGlvbgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmVxdWVzdCBhbiBBdXRvbWF0aWMgQmF1ZCBSYXRlIG1lYXN1cmVtZW50IG9uIG5leHQgcmVjZWl2ZWQgZGF0YSBmcmFtZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9BVVRPQkFVRFJBVEVfREVURUNUSU9OX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEF1dG8gQmF1ZCBSYXRlIGRldGVjdGlvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgUlFSICAgICAgICAgIEFCUlJRICAgICAgICAgTExfVVNBUlRfUmVxdWVzdEF1dG9CYXVkUmF0ZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9SZXF1ZXN0QXV0b0JhdWRSYXRlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPlJRUiwgVVNBUlRfUlFSX0FCUlJRKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXF1ZXN0IEJyZWFrIHNlbmRpbmcKKyAgKiBAcm10b2xsIFJRUiAgICAgICAgICBTQktSUSAgICAgICAgIExMX1VTQVJUX1JlcXVlc3RCcmVha1NlbmRpbmcKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfUmVxdWVzdEJyZWFrU2VuZGluZyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5SUVIsIFVTQVJUX1JRUl9TQktSUSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUHV0IFVTQVJUIGluIG11dGUgbW9kZSBhbmQgc2V0IHRoZSBSV1UgZmxhZworICAqIEBybXRvbGwgUlFSICAgICAgICAgIE1NUlEgICAgICAgICAgTExfVVNBUlRfUmVxdWVzdEVudGVyTXV0ZU1vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfUmVxdWVzdEVudGVyTXV0ZU1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+UlFSLCBVU0FSVF9SUVJfTU1SUSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVxdWVzdCBhIFJlY2VpdmUgRGF0YSBmbHVzaAorICAqIEBybXRvbGwgUlFSICAgICAgICAgIFJYRlJRICAgICAgICAgTExfVVNBUlRfUmVxdWVzdFJ4RGF0YUZsdXNoCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1JlcXVlc3RSeERhdGFGbHVzaChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5SUVIsIFVTQVJUX1JRUl9SWEZSUSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVxdWVzdCBhIFRyYW5zbWl0IGRhdGEgZmx1c2gKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgUlFSICAgICAgICAgIFRYRlJRICAgICAgICAgTExfVVNBUlRfUmVxdWVzdFR4RGF0YUZsdXNoCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1JlcXVlc3RUeERhdGFGbHVzaChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5SUVIsIFVTQVJUX1JRUl9UWEZSUSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUZfSW5pdCBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1VTQVJUX0RlSW5pdChVU0FSVF9UeXBlRGVmICpVU0FSVHgpOworRXJyb3JTdGF0dXMgTExfVVNBUlRfSW5pdChVU0FSVF9UeXBlRGVmICpVU0FSVHgsIExMX1VTQVJUX0luaXRUeXBlRGVmICpVU0FSVF9Jbml0U3RydWN0KTsKK3ZvaWQgICAgICAgIExMX1VTQVJUX1N0cnVjdEluaXQoTExfVVNBUlRfSW5pdFR5cGVEZWYgKlVTQVJUX0luaXRTdHJ1Y3QpOworRXJyb3JTdGF0dXMgTExfVVNBUlRfQ2xvY2tJbml0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgTExfVVNBUlRfQ2xvY2tJbml0VHlwZURlZiAqVVNBUlRfQ2xvY2tJbml0U3RydWN0KTsKK3ZvaWQgICAgICAgIExMX1VTQVJUX0Nsb2NrU3RydWN0SW5pdChMTF9VU0FSVF9DbG9ja0luaXRUeXBlRGVmICpVU0FSVF9DbG9ja0luaXRTdHJ1Y3QpOworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTQVJUMSB8fCBVU0FSVDJ8fCBVU0FSVDMgfHwgVUFSVDQgfHwgVUFSVDUgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJGM3h4X0xMX1VTQVJUX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmYzeHhfbGxfdXRpbHMuaCBiL0luYy9zdG0zMmYzeHhfbGxfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDE1ZjY1Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjN4eF9sbF91dGlscy5oCkBAIC0wLDAgKzEsMjk1IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2xsX3V0aWxzLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFVUSUxTIExMIG1vZHVsZS4KKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhlIExMIFVUSUxTIGRyaXZlciBjb250YWlucyBhIHNldCBvZiBnZW5lcmljIEFQSXMgdGhhdCBjYW4gYmUKKyAgICB1c2VkIGJ5IHVzZXI6CisgICAgICAoKykgRGV2aWNlIGVsZWN0cm9uaWMgc2lnbmF0dXJlCisgICAgICAoKykgVGltaW5nIGZ1bmN0aW9ucworICAgICAgKCspIFBMTCBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucworCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkYzeHhfTExfVVRJTFNfSAorI2RlZmluZSBfX1NUTTMyRjN4eF9MTF9VVElMU19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFVUSUxTX0xMIFVUSUxTCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVUSUxTX0xMX1ByaXZhdGVfQ29uc3RhbnRzIFVUSUxTIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyogTWF4IGRlbGF5IGNhbiBiZSB1c2VkIGluIExMX21EZWxheSAqLworI2RlZmluZSBMTF9NQVhfREVMQVkgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGVQorCisvKioKKyAqIEBicmllZiBVbmlxdWUgZGV2aWNlIElEIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcworICovCisjZGVmaW5lIFVJRF9CQVNFX0FERFJFU1MgICAgICAgICAgICAgIFVJRF9CQVNFCisKKy8qKgorICogQGJyaWVmIEZsYXNoIHNpemUgZGF0YSByZWdpc3RlciBiYXNlIGFkZHJlc3MKKyAqLworI2RlZmluZSBGTEFTSFNJWkVfQkFTRV9BRERSRVNTICAgICAgICBGTEFTSFNJWkVfQkFTRQorCisvKioKKyAqIEBicmllZiBQYWNrYWdlIGRhdGEgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzCisgKi8KKyNkZWZpbmUgUEFDS0FHRV9CQVNFX0FERFJFU1MgICAgICAgICAgUEFDS0FHRV9CQVNFCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVUSUxTX0xMX1ByaXZhdGVfTWFjcm9zIFVUSUxTIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKy8qKgorICAqIEB9CisgICovCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVVElMU19MTF9FU19JTklUIFVUSUxTIEV4cG9ydGVkIHN0cnVjdHVyZXMKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBVVElMUyBQTEwgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFBMTE11bDsgICAvKiE8IE11bHRpcGxpY2F0aW9uIGZhY3RvciBmb3IgUExMIFZDTyBpbnB1dCBjbG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfTExfRUNfUExMX01VTAorCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfUkNDX1BMTF9Db25maWdEb21haW5fU1lTKCkuICovCisKKyNpZiBkZWZpbmVkKFJDQ19QTExTUkNfUFJFRElWMV9TVVBQT1JUKQorICB1aW50MzJfdCBQTExEaXY7ICAgLyohPCBEaXZpc2lvbiBmYWN0b3IgZm9yIFBMTCBWQ08gb3V0cHV0IGNsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19MTF9FQ19QUkVESVZfRElWIAorICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl9TWVMoKS4gKi8KKyNlbHNlCisgIHVpbnQzMl90IFByZWRpdjsgICAvKiE8IERpdmlzaW9uIGZhY3RvciBmb3IgSFNFIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfTExfRUNfUFJFRElWX0RJViAKKyAgCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfUkNDX1BMTF9Db25maWdEb21haW5fU1lTKCkuICovCisjZW5kaWYgLyogUkNDX1BMTFNSQ19QUkVESVYxX1NVUFBPUlQgKi8KK30gTExfVVRJTFNfUExMSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgVVRJTFMgU3lzdGVtLCBBSEIgYW5kIEFQQiBidXNlcyBjbG9jayBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBBSEJDTEtEaXZpZGVyOyAgICAgICAgIC8qITwgVGhlIEFIQiBjbG9jayAoSENMSykgZGl2aWRlci4gVGhpcyBjbG9jayBpcyBkZXJpdmVkIGZyb20gdGhlIHN5c3RlbSBjbG9jayAoU1lTQ0xLKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0xMX0VDX1NZU0NMS19ESVYKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfUkNDX1NldEFIQlByZXNjYWxlcigpLiAqLworCisgIHVpbnQzMl90IEFQQjFDTEtEaXZpZGVyOyAgICAgICAgLyohPCBUaGUgQVBCMSBjbG9jayAoUENMSzEpIGRpdmlkZXIuIFRoaXMgY2xvY2sgaXMgZGVyaXZlZCBmcm9tIHRoZSBBSEIgY2xvY2sgKEhDTEspLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfTExfRUNfQVBCMV9ESVYKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfUkNDX1NldEFQQjFQcmVzY2FsZXIoKS4gKi8KKworICB1aW50MzJfdCBBUEIyQ0xLRGl2aWRlcjsgICAgICAgIC8qITwgVGhlIEFQQjIgY2xvY2sgKFBDTEsyKSBkaXZpZGVyLiBUaGlzIGNsb2NrIGlzIGRlcml2ZWQgZnJvbSB0aGUgQUhCIGNsb2NrIChIQ0xLKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0xMX0VDX0FQQjJfRElWCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1JDQ19TZXRBUEIyUHJlc2NhbGVyKCkuICovCisKK30gTExfVVRJTFNfQ2xrSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVUSUxTX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBVVElMUyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFVUSUxTX0VDX0hTRV9CWVBBU1MgSFNFIEJ5cGFzcyBhY3RpdmF0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVRJTFNfSFNFQllQQVNTX09GRiAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgLyohPCBIU0UgQnlwYXNzIGlzIG5vdCBlbmFibGVkICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1VUSUxTX0hTRUJZUEFTU19PTiAgICAgICAgIDB4MDAwMDAwMDFVICAgICAgIC8qITwgSFNFIEJ5cGFzcyBpcyBlbmFibGVkICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVVRJTFNfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIFVUSUxTIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVRJTFNfRUZfREVWSUNFX0VMRUNUUk9OSUNfU0lHTkFUVVJFIERFVklDRSBFTEVDVFJPTklDIFNJR05BVFVSRQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgR2V0IFdvcmQwIG9mIHRoZSB1bmlxdWUgZGV2aWNlIGlkZW50aWZpZXIgKFVJRCBiYXNlZCBvbiA5NiBiaXRzKQorICAqIEByZXR2YWwgVUlEWzMxOjBdOiBYIGFuZCBZIGNvb3JkaW5hdGVzIG9uIHRoZSB3YWZlciBleHByZXNzZWQgaW4gQkNEIGZvcm1hdAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dldFVJRF9Xb3JkMCh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRygqKCh1aW50MzJfdCAqKVVJRF9CQVNFX0FERFJFU1MpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFdvcmQxIG9mIHRoZSB1bmlxdWUgZGV2aWNlIGlkZW50aWZpZXIgKFVJRCBiYXNlZCBvbiA5NiBiaXRzKQorICAqIEByZXR2YWwgVUlEWzYzOjMyXTogV2FmZXIgbnVtYmVyIChVSURbMzk6MzJdKSAmIExPVF9OVU1bMjM6MF0gKFVJRFs2Mzo0MF0pCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR2V0VUlEX1dvcmQxKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKCooKHVpbnQzMl90ICopKFVJRF9CQVNFX0FERFJFU1MgKyA0VSkpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFdvcmQyIG9mIHRoZSB1bmlxdWUgZGV2aWNlIGlkZW50aWZpZXIgKFVJRCBiYXNlZCBvbiA5NiBiaXRzKQorICAqIEByZXR2YWwgVUlEWzk1OjY0XTogTG90IG51bWJlciAoQVNDSUkgZW5jb2RlZCkgLSBMT1RfTlVNWzU1OjI0XQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dldFVJRF9Xb3JkMih2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRygqKCh1aW50MzJfdCAqKShVSURfQkFTRV9BRERSRVNTICsgOFUpKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBGbGFzaCBtZW1vcnkgc2l6ZQorICAqIEBub3RlICAgVGhpcyBiaXRmaWVsZCBpbmRpY2F0ZXMgdGhlIHNpemUgb2YgdGhlIGRldmljZSBGbGFzaCBtZW1vcnkgZXhwcmVzc2VkIGluCisgICogICAgICAgICBLYnl0ZXMuIEFzIGFuIGV4YW1wbGUsIDB4MDQwIGNvcnJlc3BvbmRzIHRvIDY0IEtieXRlcy4KKyAgKiBAcmV0dmFsIEZMQVNIX1NJWkVbMTU6MF06IEZsYXNoIG1lbW9yeSBzaXplCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR2V0Rmxhc2hTaXplKHZvaWQpCit7CisgIHJldHVybiAodWludDE2X3QpKFJFQURfUkVHKCooKHVpbnQzMl90ICopRkxBU0hTSVpFX0JBU0VfQUREUkVTUykpKTsKK30KKworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVUSUxTX0xMX0VGX0RFTEFZIERFTEFZCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIENvcnRleC1NIFN5c1RpY2sgc291cmNlIG9mIHRoZSB0aW1lIGJhc2UuCisgICogQHBhcmFtICBIQ0xLRnJlcXVlbmN5IEhDTEsgZnJlcXVlbmN5IGluIEh6IChjYW4gYmUgY2FsY3VsYXRlZCB0aGFua3MgdG8gUkNDIGhlbHBlciBtYWNybykKKyAgKiBAbm90ZSAgIFdoZW4gYSBSVE9TIGlzIHVzZWQsIGl0IGlzIHJlY29tbWVuZGVkIHRvIGF2b2lkIGNoYW5naW5nIHRoZSBTeXNUaWNrIAorICAqICAgICAgICAgY29uZmlndXJhdGlvbiBieSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sIGZvciBhIGRlbGF5IHVzZSByYXRoZXIgb3NEZWxheSBSVE9TIHNlcnZpY2UuCisgICogQHBhcmFtICBUaWNrcyBOdW1iZXIgb2YgdGlja3MKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0luaXRUaWNrKHVpbnQzMl90IEhDTEtGcmVxdWVuY3ksIHVpbnQzMl90IFRpY2tzKQoreworICAvKiBDb25maWd1cmUgdGhlIFN5c1RpY2sgdG8gaGF2ZSBpbnRlcnJ1cHQgaW4gMW1zIHRpbWUgYmFzZSAqLworICBTeXNUaWNrLT5MT0FEICA9ICh1aW50MzJfdCkoKEhDTEtGcmVxdWVuY3kgLyBUaWNrcykgLSAxVUwpOyAgLyogc2V0IHJlbG9hZCByZWdpc3RlciAqLworICBTeXNUaWNrLT5WQUwgICA9IDBVTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb2FkIHRoZSBTeXNUaWNrIENvdW50ZXIgVmFsdWUgKi8KKyAgU3lzVGljay0+Q1RSTCAgPSBTeXNUaWNrX0NUUkxfQ0xLU09VUkNFX01zayB8CisgICAgICAgICAgICAgICAgICAgU3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAgIC8qIEVuYWJsZSB0aGUgU3lzdGljayBUaW1lciAqLworfQorCit2b2lkICAgICAgICBMTF9Jbml0MW1zVGljayh1aW50MzJfdCBIQ0xLRnJlcXVlbmN5KTsKK3ZvaWQgICAgICAgIExMX21EZWxheSh1aW50MzJfdCBEZWxheSk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVRJTFNfRUZfU1lTVEVNIFNZU1RFTQorICAqIEB7CisgICovCisKK3ZvaWQgICAgICAgIExMX1NldFN5c3RlbUNvcmVDbG9jayh1aW50MzJfdCBIQ0xLRnJlcXVlbmN5KTsKK0Vycm9yU3RhdHVzIExMX1BMTF9Db25maWdTeXN0ZW1DbG9ja19IU0koTExfVVRJTFNfUExMSW5pdFR5cGVEZWYgKlVUSUxTX1BMTEluaXRTdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX1VUSUxTX0Nsa0luaXRUeXBlRGVmICpVVElMU19DbGtJbml0U3RydWN0KTsKK0Vycm9yU3RhdHVzIExMX1BMTF9Db25maWdTeXN0ZW1DbG9ja19IU0UodWludDMyX3QgSFNFRnJlcXVlbmN5LCB1aW50MzJfdCBIU0VCeXBhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX1VUSUxTX1BMTEluaXRUeXBlRGVmICpVVElMU19QTExJbml0U3RydWN0LCBMTF9VVElMU19DbGtJbml0VHlwZURlZiAqVVRJTFNfQ2xrSW5pdFN0cnVjdCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyRjN4eF9MTF9VVElMU19IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmM3h4X2xsX3d3ZGcuaCBiL0luYy9zdG0zMmYzeHhfbGxfd3dkZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNTJmZDEKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJmM3h4X2xsX3d3ZGcuaApAQCAtMCwwICsxLDM0MCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9sbF93d2RnLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFdXREcgTEwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkYzeHhfTExfV1dER19ICisjZGVmaW5lIF9fU1RNMzJGM3h4X0xMX1dXREdfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKFdXREcpCisKKy8qKiBAZGVmZ3JvdXAgV1dER19MTCBXV0RHCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBXV0RHX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBXV0RHIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKworLyoqIEBkZWZncm91cCBXV0RHX0xMX0VDX0lUIElUIERlZmluZXMKKyAgKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1dXREdfUmVhZFJlZyBhbmQgIExMX1dXREdfV3JpdGVSZWcgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfV1dER19DRlJfRVdJICAgICAgICAgICAgICAgICAgICBXV0RHX0NGUl9FV0kKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgV1dER19MTF9FQ19QUkVTQ0FMRVIgIFBSRVNDQUxFUgorKiBAeworKi8KKyNkZWZpbmUgTExfV1dER19QUkVTQ0FMRVJfMSAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV1dERyBjb3VudGVyIGNsb2NrID0gKFBDTEsxLzQwOTYpLzEgKi8KKyNkZWZpbmUgTExfV1dER19QUkVTQ0FMRVJfMiAgICAgICAgICAgICAgICBXV0RHX0NGUl9XREdUQl8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV1dERyBjb3VudGVyIGNsb2NrID0gKFBDTEsxLzQwOTYpLzIgKi8KKyNkZWZpbmUgTExfV1dER19QUkVTQ0FMRVJfNCAgICAgICAgICAgICAgICBXV0RHX0NGUl9XREdUQl8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV1dERyBjb3VudGVyIGNsb2NrID0gKFBDTEsxLzQwOTYpLzQgKi8KKyNkZWZpbmUgTExfV1dER19QUkVTQ0FMRVJfOCAgICAgICAgICAgICAgICAoV1dER19DRlJfV0RHVEJfMCB8IFdXREdfQ0ZSX1dER1RCXzEpICAgICAgICAgICAgICAgICAgIC8qITwgV1dERyBjb3VudGVyIGNsb2NrID0gKFBDTEsxLzQwOTYpLzggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFdXREdfTExfRXhwb3J0ZWRfTWFjcm9zIFdXREcgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKy8qKiBAZGVmZ3JvdXAgV1dER19MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgbWFjcm9zCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBXV0RHIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gV1dERyBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuCisgICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgTExfV1dER19Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIFdXREcgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBXV0RHIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX1dXREdfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgV1dER19MTF9FeHBvcnRlZF9GdW5jdGlvbnMgV1dERyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFdXREdfTExfRUZfQ29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFdpbmRvdyBXYXRjaGRvZy4gVGhlIHdhdGNoZG9nIGlzIGFsd2F5cyBkaXNhYmxlZCBhZnRlciBhIHJlc2V0LgorICAqIEBub3RlICAgSXQgaXMgZW5hYmxlZCBieSBzZXR0aW5nIHRoZSBXREdBIGJpdCBpbiB0aGUgV1dER19DUiByZWdpc3RlciwKKyAgKiAgICAgICAgIHRoZW4gaXQgY2Fubm90IGJlIGRpc2FibGVkIGFnYWluIGV4Y2VwdCBieSBhIHJlc2V0LgorICAqICAgICAgICAgVGhpcyBiaXQgaXMgc2V0IGJ5IHNvZnR3YXJlIGFuZCBvbmx5IGNsZWFyZWQgYnkgaGFyZHdhcmUgYWZ0ZXIgYSByZXNldC4KKyAgKiAgICAgICAgIFdoZW4gV0RHQSA9IDEsIHRoZSB3YXRjaGRvZyBjYW4gZ2VuZXJhdGUgYSByZXNldC4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBXREdBICAgICAgICAgIExMX1dXREdfRW5hYmxlCisgICogQHBhcmFtICBXV0RHeCBXV0RHIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9XV0RHX0VuYWJsZShXV0RHX1R5cGVEZWYgKldXREd4KQoreworICBTRVRfQklUKFdXREd4LT5DUiwgV1dER19DUl9XREdBKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVja3MgaWYgV2luZG93IFdhdGNoZG9nIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBXREdBICAgICAgICAgIExMX1dXREdfSXNFbmFibGVkCisgICogQHBhcmFtICBXV0RHeCBXV0RHIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfV1dER19Jc0VuYWJsZWQoV1dER19UeXBlRGVmICpXV0RHeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChXV0RHeC0+Q1IsIFdXREdfQ1JfV0RHQSkgPT0gKFdXREdfQ1JfV0RHQSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgV2F0Y2hkb2cgY291bnRlciB2YWx1ZSB0byBwcm92aWRlZCB2YWx1ZSAoNy1iaXRzIFRbNjowXSkKKyAgKiBAbm90ZSAgIFdoZW4gd3JpdGluZyB0byB0aGUgV1dER19DUiByZWdpc3RlciwgYWx3YXlzIHdyaXRlIDEgaW4gdGhlIE1TQiBiNiB0byBhdm9pZCBnZW5lcmF0aW5nIGFuIGltbWVkaWF0ZSByZXNldAorICAqICAgICAgICAgVGhpcyBjb3VudGVyIGlzIGRlY3JlbWVudGVkIGV2ZXJ5ICg0MDk2IHggMmV4cFdER1RCKSBQQ0xLIGN5Y2xlcworICAqICAgICAgICAgQSByZXNldCBpcyBwcm9kdWNlZCB3aGVuIGl0IHJvbGxzIG92ZXIgZnJvbSAweDQwIHRvIDB4M0YgKGJpdCBUNiBiZWNvbWVzIGNsZWFyZWQpCisgICogICAgICAgICBTZXR0aW5nIHRoZSBjb3VudGVyIGxvd2VyIHRoZW4gMHg0MCBjYXVzZXMgYW4gaW1tZWRpYXRlIHJlc2V0IChpZiBXV0RHIGVuYWJsZWQpCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgVCAgICAgICAgICAgICBMTF9XV0RHX1NldENvdW50ZXIKKyAgKiBAcGFyYW0gIFdXREd4IFdXREcgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENvdW50ZXIgMC4uMHg3RiAoNyBiaXQgY291bnRlciB2YWx1ZSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1dXREdfU2V0Q291bnRlcihXV0RHX1R5cGVEZWYgKldXREd4LCB1aW50MzJfdCBDb3VudGVyKQoreworICBNT0RJRllfUkVHKFdXREd4LT5DUiwgV1dER19DUl9ULCBDb3VudGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gY3VycmVudCBXYXRjaGRvZyBDb3VudGVyIFZhbHVlICg3IGJpdHMgY291bnRlciB2YWx1ZSkKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBUICAgICAgICAgICAgIExMX1dXREdfR2V0Q291bnRlcgorICAqIEBwYXJhbSAgV1dER3ggV1dERyBJbnN0YW5jZQorICAqIEByZXR2YWwgNyBiaXQgV2F0Y2hkb2cgQ291bnRlciB2YWx1ZQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1dXREdfR2V0Q291bnRlcihXV0RHX1R5cGVEZWYgKldXREd4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChXV0RHeC0+Q1IsIFdXREdfQ1JfVCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgdGltZSBiYXNlIG9mIHRoZSBwcmVzY2FsZXIgKFdER1RCKS4KKyAgKiBAbm90ZSAgIFByZXNjYWxlciBpcyB1c2VkIHRvIGFwcGx5IHJhdGlvIG9uIFBDTEsgY2xvY2ssIHNvIHRoYXQgV2F0Y2hkb2cgY291bnRlcgorICAqICAgICAgICAgaXMgZGVjcmVtZW50ZWQgZXZlcnkgKDQwOTYgeCAyZXhwV0RHVEIpIFBDTEsgY3ljbGVzCisgICogQHJtdG9sbCBDRlIgICAgICAgICAgV0RHVEIgICAgICAgICBMTF9XV0RHX1NldFByZXNjYWxlcgorICAqIEBwYXJhbSAgV1dER3ggV1dERyBJbnN0YW5jZQorICAqIEBwYXJhbSAgUHJlc2NhbGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfV1dER19QUkVTQ0FMRVJfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1dXREdfUFJFU0NBTEVSXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9XV0RHX1BSRVNDQUxFUl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfV1dER19QUkVTQ0FMRVJfOAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfV1dER19TZXRQcmVzY2FsZXIoV1dER19UeXBlRGVmICpXV0RHeCwgdWludDMyX3QgUHJlc2NhbGVyKQoreworICBNT0RJRllfUkVHKFdXREd4LT5DRlIsIFdXREdfQ0ZSX1dER1RCLCBQcmVzY2FsZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBjdXJyZW50IFdhdGNoZG9nIFByZXNjYWxlciBWYWx1ZQorICAqIEBybXRvbGwgQ0ZSICAgICAgICAgIFdER1RCICAgICAgICAgTExfV1dER19HZXRQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFdXREd4IFdXREcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfV1dER19QUkVTQ0FMRVJfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1dXREdfUFJFU0NBTEVSXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9XV0RHX1BSRVNDQUxFUl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfV1dER19QUkVTQ0FMRVJfOAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1dXREdfR2V0UHJlc2NhbGVyKFdXREdfVHlwZURlZiAqV1dER3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFdXREd4LT5DRlIsIFdXREdfQ0ZSX1dER1RCKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBXYXRjaGRvZyBXaW5kb3cgdmFsdWUgdG8gYmUgY29tcGFyZWQgdG8gdGhlIGRvd25jb3VudGVyICg3LWJpdHMgV1s2OjBdKS4KKyAgKiBAbm90ZSAgIFRoaXMgd2luZG93IHZhbHVlIGRlZmluZXMgd2hlbiB3cml0ZSBpbiB0aGUgV1dER19DUiByZWdpc3RlcgorICAqICAgICAgICAgdG8gcHJvZ3JhbSBXYXRjaGRvZyBjb3VudGVyIGlzIGFsbG93ZWQuCisgICogICAgICAgICBXYXRjaGRvZyBjb3VudGVyIHZhbHVlIHVwZGF0ZSBtdXN0IG9jY3VyIG9ubHkgd2hlbiB0aGUgY291bnRlciB2YWx1ZQorICAqICAgICAgICAgaXMgbG93ZXIgdGhhbiB0aGUgV2F0Y2hkb2cgd2luZG93IHJlZ2lzdGVyIHZhbHVlLgorICAqICAgICAgICAgT3RoZXJ3aXNlLCBhIE1DVSByZXNldCBpcyBnZW5lcmF0ZWQgaWYgdGhlIDctYml0IFdhdGNoZG9nIGNvdW50ZXIgdmFsdWUKKyAgKiAgICAgICAgIChpbiB0aGUgY29udHJvbCByZWdpc3RlcikgaXMgcmVmcmVzaGVkIGJlZm9yZSB0aGUgZG93bmNvdW50ZXIgaGFzIHJlYWNoZWQKKyAgKiAgICAgICAgIHRoZSB3YXRjaGRvZyB3aW5kb3cgcmVnaXN0ZXIgdmFsdWUuCisgICogICAgICAgICBQaHlzaWNhbGx5IGlzIHBvc3NpYmxlIHRvIHNldCB0aGUgV2luZG93IGxvd2VyIHRoZW4gMHg0MCBidXQgaXQgaXMgbm90IHJlY29tbWVuZGVkLgorICAqICAgICAgICAgVG8gZ2VuZXJhdGUgYW4gaW1tZWRpYXRlIHJlc2V0LCBpdCBpcyBwb3NzaWJsZSB0byBzZXQgdGhlIENvdW50ZXIgbG93ZXIgdGhhbiAweDQwLgorICAqIEBybXRvbGwgQ0ZSICAgICAgICAgIFcgICAgICAgICAgICAgTExfV1dER19TZXRXaW5kb3cKKyAgKiBAcGFyYW0gIFdXREd4IFdXREcgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFdpbmRvdyAweDAwLi4weDdGICg3IGJpdCBXaW5kb3cgdmFsdWUpCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9XV0RHX1NldFdpbmRvdyhXV0RHX1R5cGVEZWYgKldXREd4LCB1aW50MzJfdCBXaW5kb3cpCit7CisgIE1PRElGWV9SRUcoV1dER3gtPkNGUiwgV1dER19DRlJfVywgV2luZG93KTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gY3VycmVudCBXYXRjaGRvZyBXaW5kb3cgVmFsdWUgKDcgYml0cyB2YWx1ZSkKKyAgKiBAcm10b2xsIENGUiAgICAgICAgICBXICAgICAgICAgICAgIExMX1dXREdfR2V0V2luZG93CisgICogQHBhcmFtICBXV0RHeCBXV0RHIEluc3RhbmNlCisgICogQHJldHZhbCA3IGJpdCBXYXRjaGRvZyBXaW5kb3cgdmFsdWUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9XV0RHX0dldFdpbmRvdyhXV0RHX1R5cGVEZWYgKldXREd4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChXV0RHeC0+Q0ZSLCBXV0RHX0NGUl9XKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgV1dER19MTF9FRl9GTEFHX01hbmFnZW1lbnQgRkxBR19NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIGlmIHRoZSBXV0RHIEVhcmx5IFdha2V1cCBJbnRlcnJ1cHQgRmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBub3RlICAgVGhpcyBiaXQgaXMgc2V0IGJ5IGhhcmR3YXJlIHdoZW4gdGhlIGNvdW50ZXIgaGFzIHJlYWNoZWQgdGhlIHZhbHVlIDB4NDAuCisgICogICAgICAgICBJdCBtdXN0IGJlIGNsZWFyZWQgYnkgc29mdHdhcmUgYnkgd3JpdGluZyAwLgorICAqICAgICAgICAgQSB3cml0ZSBvZiAxIGhhcyBubyBlZmZlY3QuIFRoaXMgYml0IGlzIGFsc28gc2V0IGlmIHRoZSBpbnRlcnJ1cHQgaXMgbm90IGVuYWJsZWQuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgRVdJRiAgICAgICAgICBMTF9XV0RHX0lzQWN0aXZlRmxhZ19FV0tVUAorICAqIEBwYXJhbSAgV1dER3ggV1dERyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1dXREdfSXNBY3RpdmVGbGFnX0VXS1VQKFdXREdfVHlwZURlZiAqV1dER3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoV1dER3gtPlNSLCBXV0RHX1NSX0VXSUYpID09IChXV0RHX1NSX0VXSUYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBXV0RHIEVhcmx5IFdha2V1cCBJbnRlcnJ1cHQgRmxhZyAoRVdJRikKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBFV0lGICAgICAgICAgIExMX1dXREdfQ2xlYXJGbGFnX0VXS1VQCisgICogQHBhcmFtICBXV0RHeCBXV0RHIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9XV0RHX0NsZWFyRmxhZ19FV0tVUChXV0RHX1R5cGVEZWYgKldXREd4KQoreworICBXUklURV9SRUcoV1dER3gtPlNSLCB+V1dER19TUl9FV0lGKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBXV0RHX0xMX0VGX0lUX01hbmFnZW1lbnQgSVRfTWFuYWdlbWVudAorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgRWFybHkgV2FrZXVwIEludGVycnVwdC4KKyAgKiBAbm90ZSAgIFdoZW4gc2V0LCBhbiBpbnRlcnJ1cHQgb2NjdXJzIHdoZW5ldmVyIHRoZSBjb3VudGVyIHJlYWNoZXMgdmFsdWUgMHg0MC4KKyAgKiAgICAgICAgIFRoaXMgaW50ZXJydXB0IGlzIG9ubHkgY2xlYXJlZCBieSBoYXJkd2FyZSBhZnRlciBhIHJlc2V0CisgICogQHJtdG9sbCBDRlIgICAgICAgICAgRVdJICAgICAgICAgICBMTF9XV0RHX0VuYWJsZUlUX0VXS1VQCisgICogQHBhcmFtICBXV0RHeCBXV0RHIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9XV0RHX0VuYWJsZUlUX0VXS1VQKFdXREdfVHlwZURlZiAqV1dER3gpCit7CisgIFNFVF9CSVQoV1dER3gtPkNGUiwgV1dER19DRlJfRVdJKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBFYXJseSBXYWtldXAgSW50ZXJydXB0IGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENGUiAgICAgICAgICBFV0kgICAgICAgICAgIExMX1dXREdfSXNFbmFibGVkSVRfRVdLVVAKKyAgKiBAcGFyYW0gIFdXREd4IFdXREcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9XV0RHX0lzRW5hYmxlZElUX0VXS1VQKFdXREdfVHlwZURlZiAqV1dER3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoV1dER3gtPkNGUiwgV1dER19DRlJfRVdJKSA9PSAoV1dER19DRlJfRVdJKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBXV0RHICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyRjN4eF9MTF9XV0RHX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0xpY2Vuc2UubWQgYi9MaWNlbnNlLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NWMxZGIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWNlbnNlLm1kCkBAIC0wLDAgKzEsMyBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTcgU1RNaWNyb2VsZWN0cm9uaWNzCisKK1RoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUTWljcm9lbGVjdHJvbmljcyB1bmRlciB0aGUgKipCU0QgMy1DbGF1c2UqKiBsaWNlbnNlLiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhpcyBsaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgW2hlcmVdKGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlKS4KZGlmZiAtLWdpdCBhL1JFQURNRS5tZCBiL1JFQURNRS5tZAppbmRleCA5YTZkMWVlLi5mNTdiMjE4IDEwMDY0NAotLS0gYS9SRUFETUUubWQKKysrIGIvUkVBRE1FLm1kCkBAIC0xLDIgKzEsNDUgQEAKLSMgc3RtMzJmM3h4X2hhbF9kcml2ZXIKLVByb3ZpZGVzIHRoZSBTVE0zMkN1YmUgTUNVIENvbXBvbmVudCAiaGFsX2RyaXZlciIgb2YgdGhlIFNUTTMyRjMgc2VyaWVzLgorIyBTVE0zMkN1YmVGMyBIQUwgRHJpdmVyIE1DVSBDb21wb25lbnQKKworIyMgT3ZlcnZpZXcKKworKipTVE0zMkN1YmUqKiBpcyBhbiBTVE1pY3JvZWxlY3Ryb25pY3Mgb3JpZ2luYWwgaW5pdGlhdGl2ZSB0byBlYXNlIHRoZSBkZXZlbG9wZXJzIGxpZmUgYnkgcmVkdWNpbmcgZWZmb3J0cywgdGltZSBhbmQgY29zdC4KKworKipTVE0zMkN1YmUqKiBjb3ZlcnMgdGhlIG92ZXJhbGwgU1RNMzIgcHJvZHVjdHMgcG9ydGZvbGlvLiBJdCBpbmNsdWRlcyBhIGNvbXByZWhlbnNpdmUgZW1iZWRkZWQgc29mdHdhcmUgcGxhdGZvcm0sIGRlbGl2ZXJlZCBmb3IgZWFjaCBTVE0zMiBzZXJpZXMuCisgICAqIFRoZSBDTVNJUyBtb2R1bGVzIChjb3JlIGFuZCBkZXZpY2UpIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEFSTSh0bSkgY29yZSBpbXBsZW1lbnRlZCBpbiB0aGlzIFNUTTMyIHByb2R1Y3QKKyAgICogVGhlIFNUTTMyIEhBTC1MTCBkcml2ZXJzIDogYW4gYWJzdHJhY3Rpb24gZHJpdmVycyBsYXllciwgdGhlIEFQSSBlbnN1cmluZyBtYXhpbWl6ZWQgcG9ydGFiaWxpdHkgYWNyb3NzIHRoZSBTVE0zMiBwb3J0Zm9saW8KKyAgICogVGhlIEJTUCBEcml2ZXJzIG9mIGVhY2ggZXZhbHVhdGlvbiBvciBkZW1vbnN0cmF0aW9uIGJvYXJkIHByb3ZpZGVkIGJ5IHRoaXMgU1RNMzIgc2VyaWVzCisgICAqIEEgY29uc2lzdGVudCBzZXQgb2YgbWlkZGxld2FyZXMgY29tcG9uZW50cyBzdWNoIGFzIFJUT1MsIFVTQiwgRmF0RlMsIEdyYXBoaWNzLCBTVE0zMl9Ub3VjaFNlbnNpbmdfTGlicmFyeSAuLi4KKyAgICogQSBmdWxsIHNldCBvZiBzb2Z0d2FyZSBwcm9qZWN0cyAoYmFzaWMgZXhhbXBsZXMsIGFwcGxpY2F0aW9ucyBvciBkZW1vbnN0cmF0aW9ucykgZm9yIGVhY2ggYm9hcmQgcHJvdmlkZWQgYnkgdGhpcyBTVE0zMiBzZXJpZXMKKworVHdvIG1vZGVscyBvZiBwdWJsaWNhdGlvbiBhcmUgcHJvcG9zZWQgZm9yIHRoZSBTVE0zMkN1YmUgZW1iZWRkZWQgc29mdHdhcmU6CisgICAqIFRoZSBtb25vbGl0aGljICoqTUNVIFBhY2thZ2UqKiA6IGFsbCBTVE0zMkN1YmUgc29mdHdhcmUgbW9kdWxlcyBvZiBvbmUgU1RNMzIgc2VyaWVzIGFyZSBwcmVzZW50IChEcml2ZXJzLCBNaWRkbGV3YXJlcywgUHJvamVjdHMsIFV0aWxpdGllcykgaW4gdGhlIHJlcG8gKHVzdWFsIG5hbWUgKipTVE0zMkN1YmV4eCoqLCB4eCBjb3JyZXNwb25kaW5nIHRvIHRoZSBTVE0zMiBzZXJpZXMpCisgICAqIFRoZSAqKk1DVSBjb21wb25lbnQqKiA6IHByb2dyZXNzaXZlbHkgZnJvbSBOb3ZlbWJlciAyMDE5LCBlYWNoIFNUTTMyQ3ViZSBzb2Z0d2FyZSBtb2R1bGUgYmVpbmcgcGFydCBvZiB0aGUgU1RNMzJDdWJlIE1DVSBQYWNrYWdlLCB3aWxsIGJlIGRlbGl2ZXJlZCBhcyBhbiBpbmRpdmlkdWFsIHJlcG8sIGFsbG93aW5nIHRoZSB1c2VyIHRvIHNlbGVjdCBhbmQgZ2V0IG9ubHkgdGhlIHJlcXVpcmVkIHNvZnR3YXJlIGZ1bmN0aW9ucy4KKworIyMgRGVzY3JpcHRpb24KKworVGhpcyAqKnN0bTMyZjN4eF9oYWxfZHJpdmVyKiogTUNVIGNvbXBvbmVudCByZXBvIGlzIG9uZSBlbGVtZW50IG9mIHRoZSBTVE0zMkN1YmVGMyBNQ1UgZW1iZWRkZWQgc29mdHdhcmUgcGFja2FnZSwgcHJvdmlkaW5nIHRoZSAqKkhBTC1MTCBEcml2ZXJzKiogcGFydC4KKworIyMgTGljZW5zZQorCitDb3B5cmlnaHQgKGMpIDIwMTcgU1RNaWNyb2VsZWN0cm9uaWNzLgorCitUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVE1pY3JvZWxlY3Ryb25pY3MgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UuIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgW2hlcmVdKGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlKS4KKworIyMgQ29tcGF0aWJpbGl0eSBpbmZvcm1hdGlvbgorCitJbiB0aGlzIHRhYmxlLCB5b3UgY2FuIGZpbmQgdGhlIHN1Y2Nlc3NpdmUgdmVyc2lvbnMgb2YgdGhpcyBIQUwtTEwgRHJpdmVyIGNvbXBvbmVudCwgaW4gbGluZSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb25zIG9mIHRoZSBmdWxsIE1DVSBwYWNrYWdlOgorCitJdCBpcyAqKmNydWNpYWwqKiB0aGF0IHlvdSB1c2UgYSBjb25zaXN0ZW50IHNldCBvZiB2ZXJzaW9ucyBmb3IgdGhlIENNU0lTIENvcmUgLSBDTVNJUyBEZXZpY2UgLSBIQUwsIGFzIG1lbnRpb25lZCBpbiB0aGlzIHRhYmxlLgorCitIQUwgRHJpdmVyIEYzIHwgQ01TSVMgRGV2aWNlIEYzIHwgQ01TSVMgQ29yZSB8IFdhcyBkZWxpdmVyZWQgaW4gdGhlIGZ1bGwgTUNVIHBhY2thZ2UKKy0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGFnIHYxLjUuMiB8IFRhZyB2Mi4zLjMgfCBUYWcgdjQuNV9jbTQgfCBUYWcgdjEuMTAuMCAoYW5kIGZvbGxvd2luZywgaWYgYW55LCB0aWxsIG5leHQgbmV3IHRhZykKKworVGhlIGZ1bGwgKipTVE0zMkN1YmVGMyoqIE1DVSBwYWNrYWdlIGlzIGF2YWlsYWJsZSBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL1NUTWljcm9lbGVjdHJvbmljcy9TVE0zMkN1YmVGMykuCisKKyMjIFRyb3VibGVzaG9vdGluZworCitJZiB5b3UgaGF2ZSBhbnkgaXNzdWUgd2l0aCB0aGUgKipTb2Z0d2FyZSBjb250ZW50Kiogb2YgdGhpcyByZXBvLCB5b3UgY2FuIFtmaWxlIGFuIGlzc3VlIG9uIEdpdGh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL1NUTWljcm9lbGVjdHJvbmljcy9zdG0zMmYzeHhfaGFsX2RyaXZlci9pc3N1ZXMvbmV3KS4KKworRm9yIGFueSBvdGhlciBxdWVzdGlvbiByZWxhdGVkIHRvIHRoZSBwcm9kdWN0LCB0aGUgdG9vbHMsIHRoZSBlbnZpcm9ubWVudCwgeW91IGNhbiBzdWJtaXQgYSB0b3BpYyBvbiB0aGUgW1NUIENvbW11bml0eS9TVE0zMiBNQ1VzIGZvcnVtXShodHRwczovL2NvbW11bml0eS5zdC5jb20vcy9ncm91cC8wRjkwWDAwMDAwMEFYc0FTQVcvc3RtMzItbWN1cykuCmRpZmYgLS1naXQgYS9SZWxlYXNlX05vdGVzLmh0bWwgYi9SZWxlYXNlX05vdGVzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEwNGY1ZQotLS0gL2Rldi9udWxsCisrKyBiL1JlbGVhc2VfTm90ZXMuaHRtbApAQCAtMCwwICsxLDExMzMgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgorPGh0bWwgeG1sbnM6dj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIgeG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIgeG1sbnM6bT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2UvMjAwNC8xMi9vbW1sIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+PGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgorPGxpbmsgcmVsPSJGaWxlLUxpc3QiIGhyZWY9IlJlbGVhc2VfTm90ZXNfZm9yX1NUTTMyRjQ1eF9TdGRQZXJpcGhfRHJpdmVyX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Cis8bGluayByZWw9IkVkaXQtVGltZS1EYXRhIiBocmVmPSJSZWxlYXNlX05vdGVzX2Zvcl9TVE0zMkY0NXhfU3RkUGVyaXBoX0RyaXZlcl9maWxlcy9lZGl0ZGF0YS5tc28iPjwhLS1baWYgIW1zb10+IDxzdHlsZT4gdlw6KiB7YmVoYXZpb3I6dXJsKCNkZWZhdWx0I1ZNTCk7fSBvXDoqIHtiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKTt9IHdcOioge2JlaGF2aW9yOnVybCgjZGVmYXVsdCNWTUwpO30gLnNoYXBlIHtiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKTt9IDwvc3R5bGU+IDwhW2VuZGlmXS0tPgorCisKKworPHRpdGxlPlJlbGVhc2UgTm90ZXMgZm9yIFNUTTMyRjN4eCBIQUwgRHJpdmVyczwvdGl0bGU+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+IDxvOkRvY3VtZW50UHJvcGVydGllcz4gPG86QXV0aG9yPlNUTWljcm9lbGVjdHJvbmljczwvbzpBdXRob3I+IDxvOkxhc3RBdXRob3I+UmFvdWYgSG9zbmk8L286TGFzdEF1dGhvcj4gPG86UmV2aXNpb24+Mzk8L286UmV2aXNpb24+IDxvOlRvdGFsVGltZT4xMzc8L286VG90YWxUaW1lPiA8bzpDcmVhdGVkPjIwMDktMDItMjdUMTk6MjY6MDBaPC9vOkNyZWF0ZWQ+IDxvOkxhc3RTYXZlZD4yMDEwLTEwLTE1VDExOjA3OjAwWjwvbzpMYXN0U2F2ZWQ+IDxvOlBhZ2VzPjM8L286UGFnZXM+IDxvOldvcmRzPjk3MzwvbzpXb3Jkcz4gPG86Q2hhcmFjdGVycz41NTQ4PC9vOkNoYXJhY3RlcnM+IDxvOkNvbXBhbnk+U1RNaWNyb2VsZWN0cm9uaWNzPC9vOkNvbXBhbnk+IDxvOkxpbmVzPjQ2PC9vOkxpbmVzPiA8bzpQYXJhZ3JhcGhzPjEzPC9vOlBhcmFncmFwaHM+IDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjY1MDg8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+IDxvOlZlcnNpb24+MTIuMDA8L286VmVyc2lvbj4gPC9vOkRvY3VtZW50UHJvcGVydGllcz4gPC94bWw+PCFbZW5kaWZdLS0+PGxpbmsgcmVsPSJ0aGVtZURhdGEiIGhyZWY9IlJlbGVhc2VfTm90ZXNfZm9yX1NUTTMyRjQ1eF9TdGRQZXJpcGhfRHJpdmVyX2ZpbGVzL3RoZW1lZGF0YS50aG14Ij4KKzxsaW5rIHJlbD0iY29sb3JTY2hlbWVNYXBwaW5nIiBocmVmPSJSZWxlYXNlX05vdGVzX2Zvcl9TVE0zMkY0NXhfU3RkUGVyaXBoX0RyaXZlcl9maWxlcy9jb2xvcnNjaGVtZW1hcHBpbmcueG1sIj48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4gPHc6V29yZERvY3VtZW50PiA8dzpab29tPjExMDwvdzpab29tPiA8dzpUcmFja01vdmVzPmZhbHNlPC93OlRyYWNrTW92ZXM+IDx3OlRyYWNrRm9ybWF0dGluZy8+IDx3OlZhbGlkYXRlQWdhaW5zdFNjaGVtYXMvPiA8dzpTYXZlSWZYTUxJbnZhbGlkPmZhbHNlPC93OlNhdmVJZlhNTEludmFsaWQ+IDx3Oklnbm9yZU1peGVkQ29udGVudD5mYWxzZTwvdzpJZ25vcmVNaXhlZENvbnRlbnQ+IDx3OkFsd2F5c1Nob3dQbGFjZWhvbGRlclRleHQ+ZmFsc2U8L3c6QWx3YXlzU2hvd1BsYWNlaG9sZGVyVGV4dD4gPHc6RG9Ob3RQcm9tb3RlUUYvPiA8dzpMaWRUaGVtZU90aGVyPkVOLVVTPC93OkxpZFRoZW1lT3RoZXI+IDx3OkxpZFRoZW1lQXNpYW4+WC1OT05FPC93OkxpZFRoZW1lQXNpYW4+IDx3OkxpZFRoZW1lQ29tcGxleFNjcmlwdD5YLU5PTkU8L3c6TGlkVGhlbWVDb21wbGV4U2NyaXB0PiA8dzpDb21wYXRpYmlsaXR5PiA8dzpCcmVha1dyYXBwZWRUYWJsZXMvPiA8dzpTbmFwVG9HcmlkSW5DZWxsLz4gPHc6V3JhcFRleHRXaXRoUHVuY3QvPiA8dzpVc2VBc2lhbkJyZWFrUnVsZXMvPiA8dzpEb250R3Jvd0F1dG9maXQvPiA8dzpTcGxpdFBnQnJlYWtBbmRQYXJhTWFyay8+IDx3OkRvbnRWZXJ0QWxpZ25DZWxsV2l0aFNwLz4gPHc6RG9udEJyZWFrQ29uc3RyYWluZWRGb3JjZWRUYWJsZXMvPiA8dzpEb250VmVydEFsaWduSW5UeGJ4Lz4gPHc6V29yZDExS2VybmluZ1BhaXJzLz4gPHc6Q2FjaGVkQ29sQmFsYW5jZS8+IDwvdzpDb21wYXRpYmlsaXR5PiA8dzpCcm93c2VyTGV2ZWw+TWljcm9zb2Z0SW50ZXJuZXRFeHBsb3JlcjQ8L3c6QnJvd3NlckxldmVsPiA8bTptYXRoUHI+IDxtOm1hdGhGb250IG06dmFsPSJDYW1icmlhIE1hdGgiLz4gPG06YnJrQmluIG06dmFsPSJiZWZvcmUiLz4gPG06YnJrQmluU3ViIG06dmFsPSImIzQ1Oy0iLz4gPG06c21hbGxGcmFjIG06dmFsPSJvZmYiLz4gPG06ZGlzcERlZi8+IDxtOmxNYXJnaW4gbTp2YWw9IjAiLz4gPG06ck1hcmdpbiBtOnZhbD0iMCIvPiA8bTpkZWZKYyBtOnZhbD0iY2VudGVyR3JvdXAiLz4gPG06d3JhcEluZGVudCBtOnZhbD0iMTQ0MCIvPiA8bTppbnRMaW0gbTp2YWw9InN1YlN1cCIvPiA8bTpuYXJ5TGltIG06dmFsPSJ1bmRPdnIiLz4gPC9tOm1hdGhQcj48L3c6V29yZERvY3VtZW50PiA8L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4gPHc6TGF0ZW50U3R5bGVzIERlZkxvY2tlZFN0YXRlPSJmYWxzZSIgRGVmVW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBEZWZTZW1pSGlkZGVuPSJmYWxzZSIgRGVmUUZvcm1hdD0iZmFsc2UiIExhdGVudFN0eWxlQ291bnQ9IjI2NyI+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBRRm9ybWF0PSJ0cnVlIiBOYW1lPSJOb3JtYWwiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFFGb3JtYXQ9InRydWUiIE5hbWU9ImhlYWRpbmcgMSIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUUZvcm1hdD0idHJ1ZSIgTmFtZT0iaGVhZGluZyAyIi8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBRRm9ybWF0PSJ0cnVlIiBOYW1lPSJoZWFkaW5nIDMiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFNlbWlIaWRkZW49InRydWUiIFVuaGlkZVdoZW5Vc2VkPSJ0cnVlIiBRRm9ybWF0PSJ0cnVlIiBOYW1lPSJoZWFkaW5nIDQiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFNlbWlIaWRkZW49InRydWUiIFVuaGlkZVdoZW5Vc2VkPSJ0cnVlIiBRRm9ybWF0PSJ0cnVlIiBOYW1lPSJoZWFkaW5nIDUiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFNlbWlIaWRkZW49InRydWUiIFVuaGlkZVdoZW5Vc2VkPSJ0cnVlIiBRRm9ybWF0PSJ0cnVlIiBOYW1lPSJoZWFkaW5nIDYiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFNlbWlIaWRkZW49InRydWUiIFVuaGlkZVdoZW5Vc2VkPSJ0cnVlIiBRRm9ybWF0PSJ0cnVlIiBOYW1lPSJoZWFkaW5nIDciLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFNlbWlIaWRkZW49InRydWUiIFVuaGlkZVdoZW5Vc2VkPSJ0cnVlIiBRRm9ybWF0PSJ0cnVlIiBOYW1lPSJoZWFkaW5nIDgiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFNlbWlIaWRkZW49InRydWUiIFVuaGlkZVdoZW5Vc2VkPSJ0cnVlIiBRRm9ybWF0PSJ0cnVlIiBOYW1lPSJoZWFkaW5nIDkiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFNlbWlIaWRkZW49InRydWUiIFVuaGlkZVdoZW5Vc2VkPSJ0cnVlIiBRRm9ybWF0PSJ0cnVlIiBOYW1lPSJjYXB0aW9uIi8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBRRm9ybWF0PSJ0cnVlIiBOYW1lPSJUaXRsZSIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjEiIE5hbWU9IkRlZmF1bHQgUGFyYWdyYXBoIEZvbnQiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFFGb3JtYXQ9InRydWUiIE5hbWU9IlN1YnRpdGxlIi8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBRRm9ybWF0PSJ0cnVlIiBOYW1lPSJTdHJvbmciLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFFGb3JtYXQ9InRydWUiIE5hbWU9IkVtcGhhc2lzIi8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iOTkiIE5hbWU9Ik5vIExpc3QiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI5OSIgU2VtaUhpZGRlbj0idHJ1ZSIgTmFtZT0iUGxhY2Vob2xkZXIgVGV4dCIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjEiIFFGb3JtYXQ9InRydWUiIE5hbWU9Ik5vIFNwYWNpbmciLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2MCIgTmFtZT0iTGlnaHQgU2hhZGluZyIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjYxIiBOYW1lPSJMaWdodCBMaXN0Ii8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjIiIE5hbWU9IkxpZ2h0IEdyaWQiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2MyIgTmFtZT0iTWVkaXVtIFNoYWRpbmcgMSIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjY0IiBOYW1lPSJNZWRpdW0gU2hhZGluZyAyIi8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjUiIE5hbWU9Ik1lZGl1bSBMaXN0IDEiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2NiIgTmFtZT0iTWVkaXVtIExpc3QgMiIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjY3IiBOYW1lPSJNZWRpdW0gR3JpZCAxIi8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjgiIE5hbWU9Ik1lZGl1bSBHcmlkIDIiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2OSIgTmFtZT0iTWVkaXVtIEdyaWQgMyIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjcwIiBOYW1lPSJEYXJrIExpc3QiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI3MSIgTmFtZT0iQ29sb3JmdWwgU2hhZGluZyIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjcyIiBOYW1lPSJDb2xvcmZ1bCBMaXN0Ii8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNzMiIE5hbWU9IkNvbG9yZnVsIEdyaWQiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2MCIgTmFtZT0iTGlnaHQgU2hhZGluZyBBY2NlbnQgMSIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjYxIiBOYW1lPSJMaWdodCBMaXN0IEFjY2VudCAxIi8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjIiIE5hbWU9IkxpZ2h0IEdyaWQgQWNjZW50IDEiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2MyIgTmFtZT0iTWVkaXVtIFNoYWRpbmcgMSBBY2NlbnQgMSIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjY0IiBOYW1lPSJNZWRpdW0gU2hhZGluZyAyIEFjY2VudCAxIi8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjUiIE5hbWU9Ik1lZGl1bSBMaXN0IDEgQWNjZW50IDEiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI5OSIgU2VtaUhpZGRlbj0idHJ1ZSIgTmFtZT0iUmV2aXNpb24iLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSIzNCIgUUZvcm1hdD0idHJ1ZSIgTmFtZT0iTGlzdCBQYXJhZ3JhcGgiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSIyOSIgUUZvcm1hdD0idHJ1ZSIgTmFtZT0iUXVvdGUiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSIzMCIgUUZvcm1hdD0idHJ1ZSIgTmFtZT0iSW50ZW5zZSBRdW90ZSIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjY2IiBOYW1lPSJNZWRpdW0gTGlzdCAyIEFjY2VudCAxIi8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjciIE5hbWU9Ik1lZGl1bSBHcmlkIDEgQWNjZW50IDEiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2OCIgTmFtZT0iTWVkaXVtIEdyaWQgMiBBY2NlbnQgMSIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjY5IiBOYW1lPSJNZWRpdW0gR3JpZCAzIEFjY2VudCAxIi8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNzAiIE5hbWU9IkRhcmsgTGlzdCBBY2NlbnQgMSIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjcxIiBOYW1lPSJDb2xvcmZ1bCBTaGFkaW5nIEFjY2VudCAxIi8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNzIiIE5hbWU9IkNvbG9yZnVsIExpc3QgQWNjZW50IDEiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI3MyIgTmFtZT0iQ29sb3JmdWwgR3JpZCBBY2NlbnQgMSIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjYwIiBOYW1lPSJMaWdodCBTaGFkaW5nIEFjY2VudCAyIi8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjEiIE5hbWU9IkxpZ2h0IExpc3QgQWNjZW50IDIiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2MiIgTmFtZT0iTGlnaHQgR3JpZCBBY2NlbnQgMiIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjYzIiBOYW1lPSJNZWRpdW0gU2hhZGluZyAxIEFjY2VudCAyIi8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjQiIE5hbWU9Ik1lZGl1bSBTaGFkaW5nIDIgQWNjZW50IDIiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2NSIgTmFtZT0iTWVkaXVtIExpc3QgMSBBY2NlbnQgMiIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjY2IiBOYW1lPSJNZWRpdW0gTGlzdCAyIEFjY2VudCAyIi8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjciIE5hbWU9Ik1lZGl1bSBHcmlkIDEgQWNjZW50IDIiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2OCIgTmFtZT0iTWVkaXVtIEdyaWQgMiBBY2NlbnQgMiIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjY5IiBOYW1lPSJNZWRpdW0gR3JpZCAzIEFjY2VudCAyIi8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNzAiIE5hbWU9IkRhcmsgTGlzdCBBY2NlbnQgMiIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjcxIiBOYW1lPSJDb2xvcmZ1bCBTaGFkaW5nIEFjY2VudCAyIi8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNzIiIE5hbWU9IkNvbG9yZnVsIExpc3QgQWNjZW50IDIiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI3MyIgTmFtZT0iQ29sb3JmdWwgR3JpZCBBY2NlbnQgMiIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjYwIiBOYW1lPSJMaWdodCBTaGFkaW5nIEFjY2VudCAzIi8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjEiIE5hbWU9IkxpZ2h0IExpc3QgQWNjZW50IDMiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2MiIgTmFtZT0iTGlnaHQgR3JpZCBBY2NlbnQgMyIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjYzIiBOYW1lPSJNZWRpdW0gU2hhZGluZyAxIEFjY2VudCAzIi8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjQiIE5hbWU9Ik1lZGl1bSBTaGFkaW5nIDIgQWNjZW50IDMiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2NSIgTmFtZT0iTWVkaXVtIExpc3QgMSBBY2NlbnQgMyIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjY2IiBOYW1lPSJNZWRpdW0gTGlzdCAyIEFjY2VudCAzIi8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjciIE5hbWU9Ik1lZGl1bSBHcmlkIDEgQWNjZW50IDMiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2OCIgTmFtZT0iTWVkaXVtIEdyaWQgMiBBY2NlbnQgMyIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjY5IiBOYW1lPSJNZWRpdW0gR3JpZCAzIEFjY2VudCAzIi8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNzAiIE5hbWU9IkRhcmsgTGlzdCBBY2NlbnQgMyIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjcxIiBOYW1lPSJDb2xvcmZ1bCBTaGFkaW5nIEFjY2VudCAzIi8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNzIiIE5hbWU9IkNvbG9yZnVsIExpc3QgQWNjZW50IDMiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI3MyIgTmFtZT0iQ29sb3JmdWwgR3JpZCBBY2NlbnQgMyIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjYwIiBOYW1lPSJMaWdodCBTaGFkaW5nIEFjY2VudCA0Ii8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjEiIE5hbWU9IkxpZ2h0IExpc3QgQWNjZW50IDQiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2MiIgTmFtZT0iTGlnaHQgR3JpZCBBY2NlbnQgNCIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjYzIiBOYW1lPSJNZWRpdW0gU2hhZGluZyAxIEFjY2VudCA0Ii8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjQiIE5hbWU9Ik1lZGl1bSBTaGFkaW5nIDIgQWNjZW50IDQiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2NSIgTmFtZT0iTWVkaXVtIExpc3QgMSBBY2NlbnQgNCIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjY2IiBOYW1lPSJNZWRpdW0gTGlzdCAyIEFjY2VudCA0Ii8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjciIE5hbWU9Ik1lZGl1bSBHcmlkIDEgQWNjZW50IDQiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2OCIgTmFtZT0iTWVkaXVtIEdyaWQgMiBBY2NlbnQgNCIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjY5IiBOYW1lPSJNZWRpdW0gR3JpZCAzIEFjY2VudCA0Ii8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNzAiIE5hbWU9IkRhcmsgTGlzdCBBY2NlbnQgNCIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjcxIiBOYW1lPSJDb2xvcmZ1bCBTaGFkaW5nIEFjY2VudCA0Ii8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNzIiIE5hbWU9IkNvbG9yZnVsIExpc3QgQWNjZW50IDQiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI3MyIgTmFtZT0iQ29sb3JmdWwgR3JpZCBBY2NlbnQgNCIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjYwIiBOYW1lPSJMaWdodCBTaGFkaW5nIEFjY2VudCA1Ii8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjEiIE5hbWU9IkxpZ2h0IExpc3QgQWNjZW50IDUiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2MiIgTmFtZT0iTGlnaHQgR3JpZCBBY2NlbnQgNSIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjYzIiBOYW1lPSJNZWRpdW0gU2hhZGluZyAxIEFjY2VudCA1Ii8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjQiIE5hbWU9Ik1lZGl1bSBTaGFkaW5nIDIgQWNjZW50IDUiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2NSIgTmFtZT0iTWVkaXVtIExpc3QgMSBBY2NlbnQgNSIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjY2IiBOYW1lPSJNZWRpdW0gTGlzdCAyIEFjY2VudCA1Ii8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjciIE5hbWU9Ik1lZGl1bSBHcmlkIDEgQWNjZW50IDUiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2OCIgTmFtZT0iTWVkaXVtIEdyaWQgMiBBY2NlbnQgNSIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjY5IiBOYW1lPSJNZWRpdW0gR3JpZCAzIEFjY2VudCA1Ii8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNzAiIE5hbWU9IkRhcmsgTGlzdCBBY2NlbnQgNSIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjcxIiBOYW1lPSJDb2xvcmZ1bCBTaGFkaW5nIEFjY2VudCA1Ii8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNzIiIE5hbWU9IkNvbG9yZnVsIExpc3QgQWNjZW50IDUiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI3MyIgTmFtZT0iQ29sb3JmdWwgR3JpZCBBY2NlbnQgNSIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjYwIiBOYW1lPSJMaWdodCBTaGFkaW5nIEFjY2VudCA2Ii8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjEiIE5hbWU9IkxpZ2h0IExpc3QgQWNjZW50IDYiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2MiIgTmFtZT0iTGlnaHQgR3JpZCBBY2NlbnQgNiIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjYzIiBOYW1lPSJNZWRpdW0gU2hhZGluZyAxIEFjY2VudCA2Ii8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjQiIE5hbWU9Ik1lZGl1bSBTaGFkaW5nIDIgQWNjZW50IDYiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2NSIgTmFtZT0iTWVkaXVtIExpc3QgMSBBY2NlbnQgNiIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjY2IiBOYW1lPSJNZWRpdW0gTGlzdCAyIEFjY2VudCA2Ii8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjciIE5hbWU9Ik1lZGl1bSBHcmlkIDEgQWNjZW50IDYiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2OCIgTmFtZT0iTWVkaXVtIEdyaWQgMiBBY2NlbnQgNiIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjY5IiBOYW1lPSJNZWRpdW0gR3JpZCAzIEFjY2VudCA2Ii8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNzAiIE5hbWU9IkRhcmsgTGlzdCBBY2NlbnQgNiIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjcxIiBOYW1lPSJDb2xvcmZ1bCBTaGFkaW5nIEFjY2VudCA2Ii8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNzIiIE5hbWU9IkNvbG9yZnVsIExpc3QgQWNjZW50IDYiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI3MyIgTmFtZT0iQ29sb3JmdWwgR3JpZCBBY2NlbnQgNiIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjE5IiBRRm9ybWF0PSJ0cnVlIiBOYW1lPSJTdWJ0bGUgRW1waGFzaXMiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSIyMSIgUUZvcm1hdD0idHJ1ZSIgTmFtZT0iSW50ZW5zZSBFbXBoYXNpcyIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjMxIiBRRm9ybWF0PSJ0cnVlIiBOYW1lPSJTdWJ0bGUgUmVmZXJlbmNlIi8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iMzIiIFFGb3JtYXQ9InRydWUiIE5hbWU9IkludGVuc2UgUmVmZXJlbmNlIi8+IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iMzMiIFFGb3JtYXQ9InRydWUiIE5hbWU9IkJvb2sgVGl0bGUiLz4gPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSIzNyIgU2VtaUhpZGRlbj0idHJ1ZSIgVW5oaWRlV2hlblVzZWQ9InRydWUiIE5hbWU9IkJpYmxpb2dyYXBoeSIvPiA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjM5IiBTZW1pSGlkZGVuPSJ0cnVlIiBVbmhpZGVXaGVuVXNlZD0idHJ1ZSIgUUZvcm1hdD0idHJ1ZSIgTmFtZT0iVE9DIEhlYWRpbmciLz4gPC93OkxhdGVudFN0eWxlcz4gPC94bWw+PCFbZW5kaWZdLS0+CisKKzxzdHlsZT4KKzwhLS0KKy8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KK0Bmb250LWZhY2UKK3tmb250LWZhbWlseToiQ2FtYnJpYSBNYXRoIjsKK3Bhbm9zZS0xOjIgNCA1IDMgNSA0IDYgMyAyIDQ7Cittc28tZm9udC1jaGFyc2V0OjE7Cittc28tZ2VuZXJpYy1mb250LWZhbWlseTpyb21hbjsKK21zby1mb250LWZvcm1hdDpvdGhlcjsKK21zby1mb250LXBpdGNoOnZhcmlhYmxlOworbXNvLWZvbnQtc2lnbmF0dXJlOjAgMCAwIDAgMCAwO30KK0Bmb250LWZhY2UKK3tmb250LWZhbWlseTpDYWxpYnJpOworcGFub3NlLTE6MiAxNSA1IDIgMiAyIDQgMyAyIDQ7Cittc28tZm9udC1jaGFyc2V0OjA7Cittc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKK21zby1mb250LXBpdGNoOnZhcmlhYmxlOworbXNvLWZvbnQtc2lnbmF0dXJlOi0xNjEwNjExOTg1IDEwNzM3NTAxMzkgMCAwIDE1OSAwO30KK0Bmb250LWZhY2UKK3tmb250LWZhbWlseTpUYWhvbWE7CitwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKK21zby1mb250LWNoYXJzZXQ6MDsKK21zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOworbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Cittc28tZm9udC1zaWduYXR1cmU6MTYyNzQwMDgzOSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9CitAZm9udC1mYWNlCit7Zm9udC1mYW1pbHk6VmVyZGFuYTsKK3Bhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OworbXNvLWZvbnQtY2hhcnNldDowOworbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Cittc28tZm9udC1waXRjaDp2YXJpYWJsZTsKK21zby1mb250LXNpZ25hdHVyZTo1MzY4NzE1NTkgMCAwIDAgNDE1IDA7fQorLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KK3AuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKK3ttc28tc3R5bGUtdW5oaWRlOm5vOworbXNvLXN0eWxlLXFmb3JtYXQ6eWVzOworbXNvLXN0eWxlLXBhcmVudDoiIjsKK21hcmdpbjowaW47CittYXJnaW4tYm90dG9tOi4wMDAxcHQ7Cittc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Citmb250LXNpemU6MTIuMHB0OworZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjsKK21zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK2gxCit7bXNvLXN0eWxlLXVuaGlkZTpubzsKK21zby1zdHlsZS1xZm9ybWF0OnllczsKK21zby1zdHlsZS1saW5rOiJIZWFkaW5nIDEgQ2hhciI7Cittc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKK21hcmdpbi1yaWdodDowaW47Cittc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKK21hcmdpbi1sZWZ0OjBpbjsKK21zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKK21zby1vdXRsaW5lLWxldmVsOjE7Citmb250LXNpemU6MjQuMHB0OworZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjsKK21zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworbXNvLWZhcmVhc3QtdGhlbWUtZm9udDptaW5vci1mYXJlYXN0OworZm9udC13ZWlnaHQ6Ym9sZDt9CitoMgore21zby1zdHlsZS11bmhpZGU6bm87Cittc28tc3R5bGUtcWZvcm1hdDp5ZXM7Cittc28tc3R5bGUtbGluazoiSGVhZGluZyAyIENoYXIiOworbXNvLXN0eWxlLW5leHQ6Tm9ybWFsOworbWFyZ2luLXRvcDoxMi4wcHQ7CittYXJnaW4tcmlnaHQ6MGluOworbWFyZ2luLWJvdHRvbTozLjBwdDsKK21hcmdpbi1sZWZ0OjBpbjsKK21zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKK3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQ7Cittc28tb3V0bGluZS1sZXZlbDoyOworZm9udC1zaXplOjE0LjBwdDsKK2ZvbnQtZmFtaWx5OiJBcmlhbCIsInNhbnMtc2VyaWYiOworbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Cittc28tZmFyZWFzdC10aGVtZS1mb250Om1pbm9yLWZhcmVhc3Q7Citmb250LXdlaWdodDpib2xkOworZm9udC1zdHlsZTppdGFsaWM7fQoraDMKK3ttc28tc3R5bGUtdW5oaWRlOm5vOworbXNvLXN0eWxlLXFmb3JtYXQ6eWVzOworbXNvLXN0eWxlLWxpbms6IkhlYWRpbmcgMyBDaGFyIjsKK21zby1tYXJnaW4tdG9wLWFsdDphdXRvOworbWFyZ2luLXJpZ2h0OjBpbjsKK21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOworbWFyZ2luLWxlZnQ6MGluOworbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworbXNvLW91dGxpbmUtbGV2ZWw6MzsKK2ZvbnQtc2l6ZToxMy41cHQ7Citmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiOworbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Cittc28tZmFyZWFzdC10aGVtZS1mb250Om1pbm9yLWZhcmVhc3Q7Citmb250LXdlaWdodDpib2xkO30KK2E6bGluaywgc3Bhbi5Nc29IeXBlcmxpbmsKK3ttc28tc3R5bGUtdW5oaWRlOm5vOworY29sb3I6Ymx1ZTsKK3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Cit0ZXh0LXVuZGVybGluZTpzaW5nbGU7fQorYTp2aXNpdGVkLCBzcGFuLk1zb0h5cGVybGlua0ZvbGxvd2VkCit7bXNvLXN0eWxlLXVuaGlkZTpubzsKK2NvbG9yOmJsdWU7Cit0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOwordGV4dC11bmRlcmxpbmU6c2luZ2xlO30KK3AKK3ttc28tc3R5bGUtdW5oaWRlOm5vOworbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87CittYXJnaW4tcmlnaHQ6MGluOworbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87CittYXJnaW4tbGVmdDowaW47Cittc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Citmb250LXNpemU6MTIuMHB0OworZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjsKK21zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK3AuTXNvQWNldGF0ZSwgbGkuTXNvQWNldGF0ZSwgZGl2Lk1zb0FjZXRhdGUKK3ttc28tc3R5bGUtdW5oaWRlOm5vOworbXNvLXN0eWxlLWxpbms6IkJhbGxvb24gVGV4dCBDaGFyIjsKK21hcmdpbjowaW47CittYXJnaW4tYm90dG9tOi4wMDAxcHQ7Cittc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Citmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiVGFob21hIiwic2Fucy1zZXJpZiI7Cittc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitzcGFuLkhlYWRpbmcxQ2hhcgore21zby1zdHlsZS1uYW1lOiJIZWFkaW5nIDEgQ2hhciI7Cittc28tc3R5bGUtdW5oaWRlOm5vOworbXNvLXN0eWxlLWxvY2tlZDp5ZXM7Cittc28tc3R5bGUtbGluazoiSGVhZGluZyAxIjsKK21zby1hbnNpLWZvbnQtc2l6ZToxNC4wcHQ7Cittc28tYmlkaS1mb250LXNpemU6MTQuMHB0OworZm9udC1mYW1pbHk6IkNhbWJyaWEiLCJzZXJpZiI7Cittc28tYXNjaWktZm9udC1mYW1pbHk6Q2FtYnJpYTsKK21zby1hc2NpaS10aGVtZS1mb250Om1ham9yLWxhdGluOworbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Cittc28tZmFyZWFzdC10aGVtZS1mb250Om1ham9yLWZhcmVhc3Q7Cittc28taGFuc2ktZm9udC1mYW1pbHk6Q2FtYnJpYTsKK21zby1oYW5zaS10aGVtZS1mb250Om1ham9yLWxhdGluOworbXNvLWJpZGktZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Cittc28tYmlkaS10aGVtZS1mb250Om1ham9yLWJpZGk7Citjb2xvcjojMzY1RjkxOworbXNvLXRoZW1lY29sb3I6YWNjZW50MTsKK21zby10aGVtZXNoYWRlOjE5MTsKK2ZvbnQtd2VpZ2h0OmJvbGQ7fQorc3Bhbi5IZWFkaW5nMkNoYXIKK3ttc28tc3R5bGUtbmFtZToiSGVhZGluZyAyIENoYXIiOworbXNvLXN0eWxlLXVuaGlkZTpubzsKK21zby1zdHlsZS1sb2NrZWQ6eWVzOworbXNvLXN0eWxlLWxpbms6IkhlYWRpbmcgMiI7Cittc28tYW5zaS1mb250LXNpemU6MTMuMHB0OworbXNvLWJpZGktZm9udC1zaXplOjEzLjBwdDsKK2ZvbnQtZmFtaWx5OiJDYW1icmlhIiwic2VyaWYiOworbXNvLWFzY2lpLWZvbnQtZmFtaWx5OkNhbWJyaWE7Cittc28tYXNjaWktdGhlbWUtZm9udDptYWpvci1sYXRpbjsKK21zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworbXNvLWZhcmVhc3QtdGhlbWUtZm9udDptYWpvci1mYXJlYXN0OworbXNvLWhhbnNpLWZvbnQtZmFtaWx5OkNhbWJyaWE7Cittc28taGFuc2ktdGhlbWUtZm9udDptYWpvci1sYXRpbjsKK21zby1iaWRpLWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworbXNvLWJpZGktdGhlbWUtZm9udDptYWpvci1iaWRpOworY29sb3I6IzRGODFCRDsKK21zby10aGVtZWNvbG9yOmFjY2VudDE7Citmb250LXdlaWdodDpib2xkO30KK3NwYW4uSGVhZGluZzNDaGFyCit7bXNvLXN0eWxlLW5hbWU6IkhlYWRpbmcgMyBDaGFyIjsKK21zby1zdHlsZS11bmhpZGU6bm87Cittc28tc3R5bGUtbG9ja2VkOnllczsKK21zby1zdHlsZS1saW5rOiJIZWFkaW5nIDMiOworbXNvLWFuc2ktZm9udC1zaXplOjEyLjBwdDsKK21zby1iaWRpLWZvbnQtc2l6ZToxMi4wcHQ7Citmb250LWZhbWlseToiQ2FtYnJpYSIsInNlcmlmIjsKK21zby1hc2NpaS1mb250LWZhbWlseTpDYW1icmlhOworbXNvLWFzY2lpLXRoZW1lLWZvbnQ6bWFqb3ItbGF0aW47Cittc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKK21zby1mYXJlYXN0LXRoZW1lLWZvbnQ6bWFqb3ItZmFyZWFzdDsKK21zby1oYW5zaS1mb250LWZhbWlseTpDYW1icmlhOworbXNvLWhhbnNpLXRoZW1lLWZvbnQ6bWFqb3ItbGF0aW47Cittc28tYmlkaS1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKK21zby1iaWRpLXRoZW1lLWZvbnQ6bWFqb3ItYmlkaTsKK2NvbG9yOiM0RjgxQkQ7Cittc28tdGhlbWVjb2xvcjphY2NlbnQxOworZm9udC13ZWlnaHQ6Ym9sZDt9CitzcGFuLkJhbGxvb25UZXh0Q2hhcgore21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQgQ2hhciI7Cittc28tc3R5bGUtdW5oaWRlOm5vOworbXNvLXN0eWxlLWxvY2tlZDp5ZXM7Cittc28tc3R5bGUtbGluazoiQmFsbG9vbiBUZXh0IjsKK21zby1hbnNpLWZvbnQtc2l6ZTo4LjBwdDsKK21zby1iaWRpLWZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJUYWhvbWEiLCJzYW5zLXNlcmlmIjsKK21zby1hc2NpaS1mb250LWZhbWlseTpUYWhvbWE7Cittc28taGFuc2ktZm9udC1mYW1pbHk6VGFob21hOworbXNvLWJpZGktZm9udC1mYW1pbHk6VGFob21hO30KKy5Nc29DaHBEZWZhdWx0Cit7bXNvLXN0eWxlLXR5cGU6ZXhwb3J0LW9ubHk7Cittc28tZGVmYXVsdC1wcm9wczp5ZXM7Citmb250LXNpemU6MTAuMHB0OworbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsKK21zby1iaWRpLWZvbnQtc2l6ZToxMC4wcHQ7fQorQHBhZ2UgV29yZFNlY3Rpb24xCit7c2l6ZTo4LjVpbiAxMS4waW47CittYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKK21zby1oZWFkZXItbWFyZ2luOi41aW47Cittc28tZm9vdGVyLW1hcmdpbjouNWluOworbXNvLXBhcGVyLXNvdXJjZTowO30KK2Rpdi5Xb3JkU2VjdGlvbjEKK3twYWdlOldvcmRTZWN0aW9uMTt9CisvKiBMaXN0IERlZmluaXRpb25zICovCitAbGlzdCBsMAore21zby1saXN0LWlkOjYyMDY3MzU4OworbXNvLWxpc3QtdGVtcGxhdGUtaWRzOi0xNzQ5NDMwNjI7fQorQGxpc3QgbDA6bGV2ZWwxCit7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0OworbXNvLWxldmVsLXRleHQ6XEYwQjc7Cittc28tbGV2ZWwtdGFiLXN0b3A6LjVpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjsKK21zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7Citmb250LWZhbWlseTpTeW1ib2w7fQorQGxpc3QgbDA6bGV2ZWwyCit7bXNvLWxldmVsLXRhYi1zdG9wOjEuMGluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluO30KK0BsaXN0IGwwOmxldmVsMwore21zby1sZXZlbC10YWItc3RvcDoxLjVpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsMDpsZXZlbDQKK3ttc28tbGV2ZWwtdGFiLXN0b3A6Mi4waW47Cittc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Cit0ZXh0LWluZGVudDotLjI1aW47fQorQGxpc3QgbDA6bGV2ZWw1Cit7bXNvLWxldmVsLXRhYi1zdG9wOjIuNWluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluO30KK0BsaXN0IGwwOmxldmVsNgore21zby1sZXZlbC10YWItc3RvcDozLjBpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsMDpsZXZlbDcKK3ttc28tbGV2ZWwtdGFiLXN0b3A6My41aW47Cittc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Cit0ZXh0LWluZGVudDotLjI1aW47fQorQGxpc3QgbDA6bGV2ZWw4Cit7bXNvLWxldmVsLXRhYi1zdG9wOjQuMGluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluO30KK0BsaXN0IGwwOmxldmVsOQore21zby1sZXZlbC10YWItc3RvcDo0LjVpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsMQore21zby1saXN0LWlkOjEyODAxNTk0MjsKK21zby1saXN0LXRlbXBsYXRlLWlkczotOTA2ODEyMTQ7fQorQGxpc3QgbDE6bGV2ZWwxCit7bXNvLWxldmVsLXRhYi1zdG9wOi41aW47Cittc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Cit0ZXh0LWluZGVudDotLjI1aW47fQorQGxpc3QgbDE6bGV2ZWwyCit7bXNvLWxldmVsLXRhYi1zdG9wOjEuMGluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluO30KK0BsaXN0IGwxOmxldmVsMwore21zby1sZXZlbC10YWItc3RvcDoxLjVpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsMTpsZXZlbDQKK3ttc28tbGV2ZWwtdGFiLXN0b3A6Mi4waW47Cittc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Cit0ZXh0LWluZGVudDotLjI1aW47fQorQGxpc3QgbDE6bGV2ZWw1Cit7bXNvLWxldmVsLXRhYi1zdG9wOjIuNWluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluO30KK0BsaXN0IGwxOmxldmVsNgore21zby1sZXZlbC10YWItc3RvcDozLjBpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsMTpsZXZlbDcKK3ttc28tbGV2ZWwtdGFiLXN0b3A6My41aW47Cittc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Cit0ZXh0LWluZGVudDotLjI1aW47fQorQGxpc3QgbDE6bGV2ZWw4Cit7bXNvLWxldmVsLXRhYi1zdG9wOjQuMGluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluO30KK0BsaXN0IGwxOmxldmVsOQore21zby1sZXZlbC10YWItc3RvcDo0LjVpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsMgore21zby1saXN0LWlkOjIxNjU1NjAwMDsKK21zby1saXN0LXRlbXBsYXRlLWlkczo5MjU5MjQ0MTI7fQorQGxpc3QgbDI6bGV2ZWwxCit7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0OworbXNvLWxldmVsLXRleHQ6XEYwQjc7Cittc28tbGV2ZWwtdGFiLXN0b3A6LjVpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjsKK21zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7Citmb250LWZhbWlseTpTeW1ib2w7fQorQGxpc3QgbDI6bGV2ZWwyCit7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0OworbXNvLWxldmVsLXRleHQ6XEYwQjc7Cittc28tbGV2ZWwtdGFiLXN0b3A6MS4waW47Cittc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Cit0ZXh0LWluZGVudDotLjI1aW47Cittc28tYW5zaS1mb250LXNpemU6MTAuMHB0OworZm9udC1mYW1pbHk6U3ltYm9sO30KK0BsaXN0IGwyOmxldmVsMwore21zby1sZXZlbC10YWItc3RvcDoxLjVpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsMjpsZXZlbDQKK3ttc28tbGV2ZWwtdGFiLXN0b3A6Mi4waW47Cittc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Cit0ZXh0LWluZGVudDotLjI1aW47fQorQGxpc3QgbDI6bGV2ZWw1Cit7bXNvLWxldmVsLXRhYi1zdG9wOjIuNWluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluO30KK0BsaXN0IGwyOmxldmVsNgore21zby1sZXZlbC10YWItc3RvcDozLjBpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsMjpsZXZlbDcKK3ttc28tbGV2ZWwtdGFiLXN0b3A6My41aW47Cittc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Cit0ZXh0LWluZGVudDotLjI1aW47fQorQGxpc3QgbDI6bGV2ZWw4Cit7bXNvLWxldmVsLXRhYi1zdG9wOjQuMGluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluO30KK0BsaXN0IGwyOmxldmVsOQore21zby1sZXZlbC10YWItc3RvcDo0LjVpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsMwore21zby1saXN0LWlkOjU2MjQ0NjY5NDsKK21zby1saXN0LXRlbXBsYXRlLWlkczo5MTM4OTgzNjY7fQorQGxpc3QgbDM6bGV2ZWwxCit7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0OworbXNvLWxldmVsLXRleHQ6XEYwQjc7Cittc28tbGV2ZWwtdGFiLXN0b3A6LjVpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjsKK21zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7Citmb250LWZhbWlseTpTeW1ib2w7fQorQGxpc3QgbDM6bGV2ZWwyCit7bXNvLWxldmVsLXRhYi1zdG9wOjEuMGluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluO30KK0BsaXN0IGwzOmxldmVsMwore21zby1sZXZlbC10YWItc3RvcDoxLjVpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsMzpsZXZlbDQKK3ttc28tbGV2ZWwtdGFiLXN0b3A6Mi4waW47Cittc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Cit0ZXh0LWluZGVudDotLjI1aW47fQorQGxpc3QgbDM6bGV2ZWw1Cit7bXNvLWxldmVsLXRhYi1zdG9wOjIuNWluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluO30KK0BsaXN0IGwzOmxldmVsNgore21zby1sZXZlbC10YWItc3RvcDozLjBpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsMzpsZXZlbDcKK3ttc28tbGV2ZWwtdGFiLXN0b3A6My41aW47Cittc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Cit0ZXh0LWluZGVudDotLjI1aW47fQorQGxpc3QgbDM6bGV2ZWw4Cit7bXNvLWxldmVsLXRhYi1zdG9wOjQuMGluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluO30KK0BsaXN0IGwzOmxldmVsOQore21zby1sZXZlbC10YWItc3RvcDo0LjVpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsNAore21zby1saXN0LWlkOjc5NzgwMjEzMjsKK21zby1saXN0LXRlbXBsYXRlLWlkczotMTk3MTE5MTMzNjt9CitAbGlzdCBsNDpsZXZlbDEKK3ttc28tbGV2ZWwtdGFiLXN0b3A6LjVpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsNDpsZXZlbDIKK3ttc28tbGV2ZWwtdGFiLXN0b3A6MS4waW47Cittc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Cit0ZXh0LWluZGVudDotLjI1aW47fQorQGxpc3QgbDQ6bGV2ZWwzCit7bXNvLWxldmVsLXRhYi1zdG9wOjEuNWluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluO30KK0BsaXN0IGw0OmxldmVsNAore21zby1sZXZlbC10YWItc3RvcDoyLjBpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsNDpsZXZlbDUKK3ttc28tbGV2ZWwtdGFiLXN0b3A6Mi41aW47Cittc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Cit0ZXh0LWluZGVudDotLjI1aW47fQorQGxpc3QgbDQ6bGV2ZWw2Cit7bXNvLWxldmVsLXRhYi1zdG9wOjMuMGluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluO30KK0BsaXN0IGw0OmxldmVsNwore21zby1sZXZlbC10YWItc3RvcDozLjVpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsNDpsZXZlbDgKK3ttc28tbGV2ZWwtdGFiLXN0b3A6NC4waW47Cittc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Cit0ZXh0LWluZGVudDotLjI1aW47fQorQGxpc3QgbDQ6bGV2ZWw5Cit7bXNvLWxldmVsLXRhYi1zdG9wOjQuNWluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluO30KK0BsaXN0IGw1Cit7bXNvLWxpc3QtaWQ6OTA3MzA0MDY2OworbXNvLWxpc3QtdGVtcGxhdGUtaWRzOjE5Njk3ODE1MzI7fQorQGxpc3QgbDU6bGV2ZWwxCit7bXNvLWxldmVsLXRhYi1zdG9wOi41aW47Cittc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Cit0ZXh0LWluZGVudDotLjI1aW47fQorQGxpc3QgbDU6bGV2ZWwyCit7bXNvLWxldmVsLXRhYi1zdG9wOjEuMGluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluO30KK0BsaXN0IGw1OmxldmVsMwore21zby1sZXZlbC10YWItc3RvcDoxLjVpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsNTpsZXZlbDQKK3ttc28tbGV2ZWwtdGFiLXN0b3A6Mi4waW47Cittc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Cit0ZXh0LWluZGVudDotLjI1aW47fQorQGxpc3QgbDU6bGV2ZWw1Cit7bXNvLWxldmVsLXRhYi1zdG9wOjIuNWluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluO30KK0BsaXN0IGw1OmxldmVsNgore21zby1sZXZlbC10YWItc3RvcDozLjBpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsNTpsZXZlbDcKK3ttc28tbGV2ZWwtdGFiLXN0b3A6My41aW47Cittc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Cit0ZXh0LWluZGVudDotLjI1aW47fQorQGxpc3QgbDU6bGV2ZWw4Cit7bXNvLWxldmVsLXRhYi1zdG9wOjQuMGluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluO30KK0BsaXN0IGw1OmxldmVsOQore21zby1sZXZlbC10YWItc3RvcDo0LjVpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsNgore21zby1saXN0LWlkOjEwNTA2MTM2MTY7Cittc28tbGlzdC10ZW1wbGF0ZS1pZHM6LTEwMDk4ODY3NDg7fQorQGxpc3QgbDY6bGV2ZWwxCit7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0OworbXNvLWxldmVsLXRleHQ6XEYwQjc7Cittc28tbGV2ZWwtdGFiLXN0b3A6LjVpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjsKK21zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7Citmb250LWZhbWlseTpTeW1ib2w7fQorQGxpc3QgbDY6bGV2ZWwyCit7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0OworbXNvLWxldmVsLXRleHQ6XEYwQjc7Cittc28tbGV2ZWwtdGFiLXN0b3A6MS4waW47Cittc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Cit0ZXh0LWluZGVudDotLjI1aW47Cittc28tYW5zaS1mb250LXNpemU6MTAuMHB0OworZm9udC1mYW1pbHk6U3ltYm9sO30KK0BsaXN0IGw2OmxldmVsMwore21zby1sZXZlbC10YWItc3RvcDoxLjVpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsNjpsZXZlbDQKK3ttc28tbGV2ZWwtdGFiLXN0b3A6Mi4waW47Cittc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Cit0ZXh0LWluZGVudDotLjI1aW47fQorQGxpc3QgbDY6bGV2ZWw1Cit7bXNvLWxldmVsLXRhYi1zdG9wOjIuNWluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluO30KK0BsaXN0IGw2OmxldmVsNgore21zby1sZXZlbC10YWItc3RvcDozLjBpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsNjpsZXZlbDcKK3ttc28tbGV2ZWwtdGFiLXN0b3A6My41aW47Cittc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Cit0ZXh0LWluZGVudDotLjI1aW47fQorQGxpc3QgbDY6bGV2ZWw4Cit7bXNvLWxldmVsLXRhYi1zdG9wOjQuMGluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluO30KK0BsaXN0IGw2OmxldmVsOQore21zby1sZXZlbC10YWItc3RvcDo0LjVpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsNwore21zby1saXN0LWlkOjEyMzQ5NzAxOTM7Cittc28tbGlzdC10ZW1wbGF0ZS1pZHM6MjA1NTkwNDAwMjt9CitAbGlzdCBsNzpsZXZlbDEKK3ttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7Cittc28tbGV2ZWwtdGV4dDpcRjBCNzsKK21zby1sZXZlbC10YWItc3RvcDouNWluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluOworbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsKK2ZvbnQtZmFtaWx5OlN5bWJvbDt9CitAbGlzdCBsNzpsZXZlbDIKK3ttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7Cittc28tbGV2ZWwtdGV4dDpcRjBCNzsKK21zby1sZXZlbC10YWItc3RvcDoxLjBpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjsKK21zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7Citmb250LWZhbWlseTpTeW1ib2w7fQorQGxpc3QgbDc6bGV2ZWwzCit7bXNvLWxldmVsLXRhYi1zdG9wOjEuNWluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluO30KK0BsaXN0IGw3OmxldmVsNAore21zby1sZXZlbC10YWItc3RvcDoyLjBpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsNzpsZXZlbDUKK3ttc28tbGV2ZWwtdGFiLXN0b3A6Mi41aW47Cittc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Cit0ZXh0LWluZGVudDotLjI1aW47fQorQGxpc3QgbDc6bGV2ZWw2Cit7bXNvLWxldmVsLXRhYi1zdG9wOjMuMGluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluO30KK0BsaXN0IGw3OmxldmVsNwore21zby1sZXZlbC10YWItc3RvcDozLjVpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsNzpsZXZlbDgKK3ttc28tbGV2ZWwtdGFiLXN0b3A6NC4waW47Cittc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Cit0ZXh0LWluZGVudDotLjI1aW47fQorQGxpc3QgbDc6bGV2ZWw5Cit7bXNvLWxldmVsLXRhYi1zdG9wOjQuNWluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluO30KK0BsaXN0IGw4Cit7bXNvLWxpc3QtaWQ6MTg0NjA5MjI5MDsKK21zby1saXN0LXRlbXBsYXRlLWlkczotNzY4NTkwODQ2O30KK0BsaXN0IGw4OmxldmVsMQore21zby1sZXZlbC1zdGFydC1hdDoyOworbXNvLWxldmVsLXRhYi1zdG9wOi41aW47Cittc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Cit0ZXh0LWluZGVudDotLjI1aW47fQorQGxpc3QgbDg6bGV2ZWwyCit7bXNvLWxldmVsLXRhYi1zdG9wOjEuMGluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluO30KK0BsaXN0IGw4OmxldmVsMwore21zby1sZXZlbC10YWItc3RvcDoxLjVpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsODpsZXZlbDQKK3ttc28tbGV2ZWwtdGFiLXN0b3A6Mi4waW47Cittc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Cit0ZXh0LWluZGVudDotLjI1aW47fQorQGxpc3QgbDg6bGV2ZWw1Cit7bXNvLWxldmVsLXRhYi1zdG9wOjIuNWluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluO30KK0BsaXN0IGw4OmxldmVsNgore21zby1sZXZlbC10YWItc3RvcDozLjBpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsODpsZXZlbDcKK3ttc28tbGV2ZWwtdGFiLXN0b3A6My41aW47Cittc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Cit0ZXh0LWluZGVudDotLjI1aW47fQorQGxpc3QgbDg6bGV2ZWw4Cit7bXNvLWxldmVsLXRhYi1zdG9wOjQuMGluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluO30KK0BsaXN0IGw4OmxldmVsOQore21zby1sZXZlbC10YWItc3RvcDo0LjVpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsOQore21zby1saXN0LWlkOjE4OTQ2NTY1NjY7Cittc28tbGlzdC10ZW1wbGF0ZS1pZHM6MTE5OTk4MzgxMjt9CitAbGlzdCBsOTpsZXZlbDEKK3ttc28tbGV2ZWwtc3RhcnQtYXQ6MjsKK21zby1sZXZlbC10YWItc3RvcDouNWluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluO30KK0BsaXN0IGw5OmxldmVsMgore21zby1sZXZlbC10YWItc3RvcDoxLjBpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsOTpsZXZlbDMKK3ttc28tbGV2ZWwtdGFiLXN0b3A6MS41aW47Cittc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Cit0ZXh0LWluZGVudDotLjI1aW47fQorQGxpc3QgbDk6bGV2ZWw0Cit7bXNvLWxldmVsLXRhYi1zdG9wOjIuMGluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluO30KK0BsaXN0IGw5OmxldmVsNQore21zby1sZXZlbC10YWItc3RvcDoyLjVpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsOTpsZXZlbDYKK3ttc28tbGV2ZWwtdGFiLXN0b3A6My4waW47Cittc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Cit0ZXh0LWluZGVudDotLjI1aW47fQorQGxpc3QgbDk6bGV2ZWw3Cit7bXNvLWxldmVsLXRhYi1zdG9wOjMuNWluOworbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwordGV4dC1pbmRlbnQ6LS4yNWluO30KK0BsaXN0IGw5OmxldmVsOAore21zby1sZXZlbC10YWItc3RvcDo0LjBpbjsKK21zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKK3RleHQtaW5kZW50Oi0uMjVpbjt9CitAbGlzdCBsOTpsZXZlbDkKK3ttc28tbGV2ZWwtdGFiLXN0b3A6NC41aW47Cittc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Cit0ZXh0LWluZGVudDotLjI1aW47fQorb2wKK3ttYXJnaW4tYm90dG9tOjBpbjt9Cit1bAore21hcmdpbi1ib3R0b206MGluO30KKy0tPgorPC9zdHlsZT48IS0tW2lmIGd0ZSBtc28gMTBdPiA8c3R5bGU+IC8qIFN0eWxlIERlZmluaXRpb25zICovIHRhYmxlLk1zb05vcm1hbFRhYmxlIHttc28tc3R5bGUtbmFtZToiVGFibGUgTm9ybWFsIjsgbXNvLXRzdHlsZS1yb3diYW5kLXNpemU6MDsgbXNvLXRzdHlsZS1jb2xiYW5kLXNpemU6MDsgbXNvLXN0eWxlLW5vc2hvdzp5ZXM7IG1zby1zdHlsZS1wcmlvcml0eTo5OTsgbXNvLXN0eWxlLXFmb3JtYXQ6eWVzOyBtc28tc3R5bGUtcGFyZW50OiIiOyBtc28tcGFkZGluZy1hbHQ6MGluIDUuNHB0IDBpbiA1LjRwdDsgbXNvLXBhcmEtbWFyZ2luOjBpbjsgbXNvLXBhcmEtbWFyZ2luLWJvdHRvbTouMDAwMXB0OyBtc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47IGZvbnQtc2l6ZToxMC4wcHQ7IGZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fSA8L3N0eWxlPiA8IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4gPG86c2hhcGVkZWZhdWx0cyB2OmV4dD0iZWRpdCIgc3BpZG1heD0iNzE3MCIvPiA8L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4gPG86c2hhcGVsYXlvdXQgdjpleHQ9ImVkaXQiPiA8bzppZG1hcCB2OmV4dD0iZWRpdCIgZGF0YT0iMSIvPiA8L286c2hhcGVsYXlvdXQ+PC94bWw+PCFbZW5kaWZdLS0+Cis8bWV0YSBjb250ZW50PSJNQ0QgQXBwbGljYXRpb24gVGVhbSIgbmFtZT0iYXV0aG9yIj48L2hlYWQ+Cis8Ym9keSBzdHlsZT0iIiBsaW5rPSJibHVlIiB2bGluaz0iYmx1ZSI+Cis8ZGl2IGNsYXNzPSJXb3JkU2VjdGlvbjEiPgorPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtBcmlhbCZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPgorPGRpdiBhbGlnbj0iY2VudGVyIj4KKzx0YWJsZSBjbGFzcz0iTXNvTm9ybWFsVGFibGUiIHN0eWxlPSJ3aWR0aDogNjc1cHQ7IiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjkwMCI+Cis8dGJvZHk+Cis8dHIgc3R5bGU9IiI+Cis8dGQgc3R5bGU9InBhZGRpbmc6IDBpbjsiIHZhbGlnbj0idG9wIj4KKzx0YWJsZSBjbGFzcz0iTXNvTm9ybWFsVGFibGUiIHN0eWxlPSJ3aWR0aDogNjc1cHQ7IiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjkwMCI+Cis8dGJvZHk+Cis8dHIgc3R5bGU9IiI+Cis8dGQgc3R5bGU9InBhZGRpbmc6IDBpbiA1LjRwdDsiIHZhbGlnbj0idG9wIj4KKzxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDhwdDsgZm9udC1mYW1pbHk6ICZxdW90O0FyaWFsJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiBibHVlOyI+PGEgaHJlZj0iLi4vLi4vUmVsZWFzZV9Ob3Rlcy5odG1sIj5CYWNrIHRvIFJlbGVhc2UgcGFnZTwvYT48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsiPjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KKzwvdGQ+Cis8L3RyPgorPHRyIHN0eWxlPSIiPgorPHRkIHN0eWxlPSJwYWRkaW5nOiAxLjVwdDsiPgorPGgxIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwLjI1aW47IHRleHQtYWxpZ246IGNlbnRlcjsiIGFsaWduPSJjZW50ZXIiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDIwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiByZ2IoNTEsIDEwMiwgMjU1KTsiPlJlbGVhc2UKK05vdGVzIGZvciBTVE0zMkYzeHggSEFMIERyaXZlcnM8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMjBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxvOnA+PC9vOnA+PC9zcGFuPjwvaDE+Cis8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyIgYWxpZ249ImNlbnRlciI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O0FyaWFsJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiBibGFjazsiPkNvcHlyaWdodAorMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiBibGFjazsiPjx1MTpwPjwvdTE6cD48bzpwPjwvbzpwPjwvc3Bhbj48L3A+Cis8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyIgYWxpZ249ImNlbnRlciI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O0FyaWFsJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiBibGFjazsiPjxpbWcgaWQ9Il94MDAwMF9pMTAyNiIgc3JjPSJfaHRtcmVzYy9zdF9sb2dvLnBuZyIgYm9yZGVyPSIwIiBoZWlnaHQ9IjY1IiB3aWR0aD0iODYiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyI+PG86cD48L286cD48L3NwYW4+PC9wPgorPC90ZD4KKzwvdHI+Cis8L3Rib2R5PgorPC90YWJsZT4KKzxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7QXJpYWwmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgZGlzcGxheTogbm9uZTsiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4KKzx0YWJsZSBjbGFzcz0iTXNvTm9ybWFsVGFibGUiIHN0eWxlPSJ3aWR0aDogNjc1cHQ7IiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iOTAwIj4KKzx0Ym9keT4KKzx0ciBzdHlsZT0iIj4KKzx0ZCBzdHlsZT0icGFkZGluZzogMGluOyIgdmFsaWduPSJ0b3AiPgorPGgyIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IGluaXRpYWw7Ij48YSBuYW1lPSJIaXN0b3J5Ij48L2E+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IHdoaXRlOyI+VXBkYXRlIEhpc3Rvcnk8L3NwYW4+PC9oMj4KKzxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiBpbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMjAwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjUuMgorLyAxMi1KdW5lLTIwMTg8L3NwYW4+PC9oMz48YiBzdHlsZT0iIj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyI+PC9zcGFuPjwvdT48L2I+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogOHB0OyBmb250LWZhbWlseTogJnF1b3Q7QXJpYWwmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IGJsdWU7Ij48L3NwYW4+PHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGNtIDQuNXB0IDE4cHQ7IGNvbG9yOiBibGFjazsiPjxiIHN0eWxlPSIiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+TWFpbiBjaGFuZ2VzPC9zcGFuPjwvdT48L2I+PC9wPjx1bCBzdHlsZT0iY29sb3I6IGJsYWNrOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+TWFpbnRlbmFuY2UgcmVsZWFzZSB0byBmaXgga25vd24gZGVmZWN0cyBhbmQgCitlbmhhbmNlbWVudHMgaW1wbGVtZW50YXRpb248L3NwYW4+PC9zcGFuPjwvbGk+PC91bD48cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwY20gNC41cHQgMThwdDsgY29sb3I6IGJsYWNrOyI+PGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5HZW5lcmljIGRyaXZlcnMgY2hhbmdlczwvc3Bhbj48L3U+PC9iPjwvcD48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nOyBmb250LXNpemU6IG1lZGl1bTsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogc3RhcnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3b3JkLXNwYWNpbmc6IDBweDsgbWFyZ2luLXRvcDogMGNtOyBjb2xvcjogcmVkOyIgdHlwZT0ic3F1YXJlIj48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij5Tb21lIGdsb2JhbCB2YXJpYWJsZXMgb24gc3RtMzJ4eHhfaGFsLmMgdXBkYXRlZCB0byBiZSBkZWNsYXJlZCBhcyBleHRlcm48L3NwYW4+PC9saT48L3VsPjxiIHN0eWxlPSIiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+Jm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDs8L3NwYW4+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48L3NwYW4+PC91PjwvYj48YiBzdHlsZT0iIj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkhBTCBkcml2ZXJzIGNoYW5nZXM8L3NwYW4+PC91PjwvYj48dWwgc3R5bGU9ImNvbG9yOiBibGFjazsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPlRoZSBmb2xsb3dpbmcgY2hhbmdlcyBkb25lIG9uIHRoZSBIQUwgZHJpdmVycyByZXF1aXJlIGFuIHVwZGF0ZSBvbiB0aGUgYXBwbGljYXRpb24gY29kZSBiYXNlZCBvbiBvbGRlciBIQUwgdmVyc2lvbnM8L3NwYW4+PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlJld29yayBvZiBIQUwgQ0FOIGRyaXZlciAoY29tcGF0aWJpbGl0eSBicmVhaykmbmJzcDs8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5BCituZXcgSEFMIENBTiBkcml2ZXIgaGFzIGJlZW4gcmVkZXNpZ25lZCB3aXRoIG5ldyBBUElzLCB0byBieXBhc3MKK2xpbWl0YXRpb25zIG9uIENBTiBUeC9SeCBGSUZPIG1hbmFnZW1lbnQgcHJlc2VudCB3aXRoIHByZXZpb3VzIEhBTCBDQU4KK2RyaXZlciB2ZXJzaW9uLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5UaGUKK25ldyBIQUwgQ0FOIGRyaXZlciBpcyB0aGUgcmVjb21tZW5kZWQgdmVyc2lvbi4gSXQgaXMgbG9jYXRlZCBhcyB1c3VhbAoraW4gRHJpdmVycy9TVE0zMkYzeHhfSEFMX0RyaXZlci9TcmMgYW5kCitEcml2ZXJzL1NUTTMyRjN4eF9IQUxfRHJpdmVyL0luYyBmb2xkZXJzLiBJdCBjYW4gYmUgZW5hYmxlZCB0aHJvdWdoCitzd2l0Y2ggSEFMX0NBTl9NT0RVTEVfRU5BQkxFRCBpbiBzdG0zMmYzeHhfaGFsX2NvbmYuaDwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5UaGUKK2xlZ2FjeSBIQUwgQ0FOIGRyaXZlciBpcyBhbHNvIHByZXNlbnQgaW4gdGhlIHJlbGVhc2UgaW4KK0RyaXZlcnMvU1RNMzJGM3h4X0hBTF9Ecml2ZXIvU3JjL0xlZ2FjeSBhbmQKK0RyaXZlcnMvU1RNMzJGM3h4X0hBTF9Ecml2ZXIvSW5jL0xlZ2FjeSBmb2xkZXJzIGZvciBzb2Z0d2FyZQorY29tcGF0aWJpbGl0eSByZWFzb25zLiBJdHMgdXNhZ2UgaXMgbm90IHJlY29tbWVuZGVkIGFzCitkZXByZWNhdGVkLiZuYnNwO0l0IGNhbiBob3dldmVyIGJlIGVuYWJsZWQgdGhyb3VnaCBzd2l0Y2gKK0hBTF9DQU5fTEVHQUNZX01PRFVMRV9FTkFCTEVEIGluIHN0bTMyZjN4eF9oYWxfY29uZi5oPC9zcGFuPjwvbGk+PC91bD48L3VsPjwvdWw+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJzsgZm9udC1zaXplOiBtZWRpdW07IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IHN0YXJ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC1zcGFjaW5nOiAwcHg7IG1hcmdpbi10b3A6IDBjbTsgY29sb3I6IHJlZDsiIHR5cGU9InNxdWFyZSI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMJm5ic3A7PC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+QWRkIGRlZmluaXRvbiBvZiZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkhBTF9DQU5fTEVHQUNZX01PRFVMRV9FTkFCTEVEIHN3aXRoIGluIHN0bTMyZjN4eF9oYWxfY29uZl90ZW1wbGF0ZS5oPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgQ0FOPHNwYW4+Jm5ic3A7PC9zcGFuPjwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5GaWVsZHMgb2YgQ0FOX0luaXRUeXBlRGVmIHN0cnVjdHVyZSBhcmUgcmV3b3JrZWQ6PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+U0pXCit0byBTeW5jSnVtcFdpZHRoLCBCUzEgdG8gVGltZVNlZzEsIEJTMiB0byBUaW1lU2VnMiwgVFRDTSB0bworVGltZVRyaWdnZXJlZE1vZGUsIEFCT00gdG8gQXV0b0J1c09mZiwgQVdVTSB0byBBdXRvV2FrZVVwLCBOQVJUIHRvCitBdXRvUmV0cmFuc21pc3Npb24gKGludmVyc2VkKSwgUkZMTSB0byBSZWNlaXZlRmlmb0xvY2tlZCBhbmQgVFhGUCB0bworVHJhbnNtaXRGaWZvUHJpb3JpdHk8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5IQUxfQ0FOX0luaXQoKSBpcyBzcGxpdCBpbnRvIGJvdGggSEFMX0NBTl9Jbml0KCkgYW5kIEhBTF9DQU5fU3RhcnQoKSBBUEknczwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5IQUxfQ0FOX1RyYW5zbWl0KCkKK2lzIHJlcGxhY2VkIGJ5IEhBTF9DQU5fQWRkVHhNZXNzYWdlKCkgdG8gcGxhY2UgVHggUmVxdWVzdCwgdGhlbgorSEFMX0NBTl9HZXRUeE1haWxib3hlc0ZyZWVMZXZlbCgpIGZvciBwb2xsaW5nIHVudGlsIGNvbXBsZXRpb24uPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPkhBTF9DQU5fVHJhbnNtaXRfSVQoKSBpcyByZXBsYWNlZCBieSBIQUxfQ0FOX0FjdGl2YXRlTm90aWZpY2F0aW9uKCkgdG8gZW5hYmxlIHRyYW5zbWl0IElULCB0aGVuIEhBTF9DQU5fPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+QWRkVHhNZXNzYWdlPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+KCkgZm9yIHBsYWNlIFR4IHJlcXVlc3QuPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPkhBTF9DQU5fUmVjZWl2ZSgpIGlzIHJlcGxhY2VkIGJ5IEhBTF9DQU5fR2V0UnhGaWZvRmlsbExldmVsKCkgZm9yIHBvbGxpbmcgdW50aWwgcmVjZXB0aW9uLCB0aGVuIEhBTF9DQU5fR2V0UnhNZXNzYWdlKCk8c3Bhbj4mbmJzcDs8L3NwYW4+PGJyPnRvIGdldCBSeCBtZXNzYWdlLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5IQUxfQ0FOX1JlY2VpdmVfSVQoKSBpcyByZXBsYWNlZCBieSBIQUxfQ0FOXzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPkFjdGl2YXRlTm90aWZpY2F0aW9uPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+KCkmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj50byBlbmFibGUgcmVjZWl2ZSBJVCwgdGhlbiBIQUxfQ0FOPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+X0dldFJ4TWVzc2FnZSgpPGJyPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPmluIHRoZSByZWNlaXZlY2FsbGJhY2sgdG8gZ2V0IFJ4IG1lc3NhZ2U8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+SEFMX0NBTl9TbGVwcCgpIGlzIHJlbmFtZWQgYXMgSEFMX0NBTl9SZXF1ZXN0U2xlZXAoKTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5IQUxfQ0FOX1R4Q3BsdENhbGxiYWNrKCkgaXMgc3BsaXQgaW50byBIQUxfQ0FOX1R4TWFpbGJveDBDb21wbGV0ZUNhbGxiYWNrKCksPHNwYW4+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPkhBTF9DQU5fVHhNYWlsYm94MUNvbXBsZXRlQ2FsbGJhY2soKSBhbmQmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5IQUxfQ0FOX1R4TWFpbGJveDJDb21wbGV0ZUNhbGxiYWNrKCkuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPkhBTF9DQU5fUnhDcGx0Q2FsbGJhY2sgaXMgc3BsaXQgaW50byBIQUxfQ0FOX1J4RmlmbzBNc2dQZW5kaW5nQ2FsbGJhY2soKSBhbmQ8c3Bhbj4mbmJzcDs8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+SEFMX0NBTl9SeEZpZm8xTXNnUGVuZGluZ0NhbGxiYWNrKCkuPC9zcGFuPjwvbGk+PC91bD48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5Nb3JlIGNvbXBsZXRlICJIb3cgdG8gdXNlIHRoZSBuZXcgZHJpdmVyIiBpcyBkZXRhaWxlZCBpbiB0aGUgZHJpdmVyIGhlYWRlciBzZWN0aW9uIGl0c2VsZi48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgQ09NUDwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5GaXggd3JvbmcgY29uZmlndXJhdGlvbiBvZiBDb21wYXJhdG9yIDQgaW52ZXJ0aW5nIGlucHV0IGZvciBzdG0zMmYzMDF4OCBkZXZpY2U8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgRE1BIDwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPkFkZCBjbGVhbiBvZiBjYWxsYmFja3MgaW4gSEFMX0RNQV9EZUluaXQoKSBBUEk8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgSFJUSU08L3NwYW4+IHVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+QWRkIG1vcmUgZmxleGliaWxpdHkgb24gR2V0VGltZXJJZHhGcm9tRE1BSGFuZGxlKCkgc3RhdGljIGZ1bmN0aW9uPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFJDQzwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5VcGRhdGUgSEFMX1JDQ19DbG9ja0NvbmZpZygpIEFQSSB0bzo8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5jaGVjayBvbiBudWxsIHBvaW50ZXI8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+b3B0aW1pemUmbmJzcDtjb2RlIHNpemUgYnkgdXBkYXRpbmcgdGhlIGhhbmRsaW5nIG1ldGhvZCBvZiB0aGUgU1dTIGJpdHM8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+dXBkYXRlCit0byB1c2UmbmJzcDsgX19IQUxfRkxBU0hfR0VUX0xBVEVOQ1koKSBmbGFzaCBtYWNybyBpbnN0ZWFkIG9mIHVzaW5nCitkaXJlY3QgcmVnaXN0ZXIgYWNjZXNzIHRvJm5ic3A7TEFURU5DWSBiaXRzIGluIEZMQVNIIEFDUiByZWdpc3Rlci48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgY29sb3I6IGJsYWNrOyIgbGFuZz0iRU4tVVMiPlVwZGF0ZSBIQUxfUkNDX0RlSW5pdCgpIEFQSSB0bzwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBjb2xvcjogYmxhY2s7IiBsYW5nPSJFTi1VUyI+QmUgYWJsZSB0byByZXR1cm4gSEFMPC9zcGFuPjwvbGk+PC91bD48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgY29sb3I6IGJsYWNrOyIgbGFuZz0iRU4tVVMiPkFkZCBjaGVja3MgZm9yIEhTSSBhbmQgUExMIHJlYWR5IGJlZm9yZSBtb2RpZnlpbmcgUkNDIENGR1IgcmVnaXN0ZXJzPC9zcGFuPjwvbGk+PC91bD48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgY29sb3I6IGJsYWNrOyIgbGFuZz0iRU4tVVMiPkNsZWFyIGFsbCBpbnRlcnJ1cHQgZmFsZ3M8L3NwYW4+PC9saT48L3VsPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7Q291cmllciBOZXcmcXVvdDs7IGNvbG9yOiBibGFjazsiIGxhbmc9IkVOLVVTIj48c3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OzsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgZm9udC1zaXplOiA3cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IGZvbnQtc3RyZXRjaDogbm9ybWFsOyI+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgY29sb3I6IGJsYWNrOyIgbGFuZz0iRU4tVVMiPkluaXRpYWxpemUgc3lzdGljayBpbnRlcnJ1cHQgcGVyaW9kPC9zcGFuPjwvbGk+PC91bD48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgUlRDPC9zcGFuPiB1cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPkZpeCB3YXJuaW5nIHdpdGggc3RhdGljIGFuYWx5c2lzOiByZW1vdmUgdW51c2VkIHZhcmlhYmxlczwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFRJTTxzcGFuPiZuYnNwOzwvc3Bhbj48L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgSEFMX1RJTUV4X09DTl94eHh4KCkgYW5kIEhBTF9USU1FeF9QV01OX3h4eCgpIEFQSSBkZXNjcmlwdGlvbiZuYnNwO3RvIHJlbW92ZSBzdXBwb3J0IG9mIFRJTV9DSEFOTkVMXzQ8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5BZGQKK2Egbm90ZSBpbiBmdW5jdGlvbnMgaGVhZGVyJm5ic3A7dG8gcGVyZm9ybSB0aW1lciByZXNldCB3aGVuIHN3aXRjaGluZworZnJvbSBBbGlnbmVkIGNvdW50ZXIgbW9kZSB0byBFZGdlIGNvdW50ZXIgbW9kZSAob3IgcmV2ZXJzZSk8L3NwYW4+PC9saT48L3VsPjwvdWw+PGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48L3NwYW4+PC91PjwvYj48cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwY20gNC41cHQgMThwdDsgY29sb3I6IGJsYWNrOyI+PGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5MTCBEcml2ZXJzIGNoYW5nZXM8L3NwYW4+PC91PjwvYj48L3A+PHVsIHN0eWxlPSJtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkxMIFRJTTwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij48L3NwYW4+PC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5BZGQKK2Egbm90ZSBpbiBtYWNyb3MgaGVhZGVyJm5ic3A7dG8gcGVyZm9ybSB0aW1lciByZXNldCB3aGVuIHN3aXRjaGluZyBmcm9tCitBbGlnbmVkIGNvdW50ZXIgbW9kZSB0byBFZGdlIGNvdW50ZXIgbW9kZSAob3IgcmV2ZXJzZSk8L3NwYW4+PC9saT48L3VsPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkxMIFVUSUxTPC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGkgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5SZW1vdmUgdGhlPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij4gc2V0IG9mIFN5c1RpY2tfQ1RSTF9USUNLSU5UIGJpdCBpbiBTeXNUaWNrLSZndDtDVFJMIGZyb20gPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5MTF9Jbml0VGljaygpPC9zcGFuPjwvbGk+PC91bD48bGkgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5MTCBSQ0M8L3NwYW4+PC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgY29sb3I6IGJsYWNrOyIgbGFuZz0iRU4tVVMiPlVwZGF0ZSBMTF9SQ0NfRGVJbml0KCkgQVBJIHRvPC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGNvbG9yOiBibGFjazsiIGxhbmc9IkVOLVVTIj5CZSBhYmxlIHRvIHJldHVybiBMTCBzdGF0dXM8L3NwYW4+PC9saT48L3VsPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBjb2xvcjogYmxhY2s7IiBsYW5nPSJFTi1VUyI+QWRkIGNoZWNrcyBmb3IgSFNJIGFuZCBQTEwgcmVhZHkgYmVmb3JlIG1vZGlmeWluZyBSQ0MgQ0ZHUiByZWdpc3RlcnM8L3NwYW4+PC9saT48L3VsPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBjb2xvcjogYmxhY2s7IiBsYW5nPSJFTi1VUyI+Q2xlYXIgYWxsIGludGVycnVwdCBmYWxnczwvc3Bhbj48L2xpPjwvdWw+PC91bD48L3VsPjxiIHN0eWxlPSIiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PC9zcGFuPjwvdT48L2I+PGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IGluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAyMDBweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuNS4xCisvIDExLU1heS0yMDE4PC9zcGFuPjwvaDM+PGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPjwvc3Bhbj48L3U+PC9iPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDhwdDsgZm9udC1mYW1pbHk6ICZxdW90O0FyaWFsJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiBibHVlOyI+PC9zcGFuPjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBjbSA0LjVwdCAxOHB0OyBjb2xvcjogYmxhY2s7Ij48YiBzdHlsZT0iIj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPk1haW4gY2hhbmdlczwvc3Bhbj48L3U+PC9iPjwvcD48dWwgc3R5bGU9ImNvbG9yOiBibGFjazsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkdlbmVyYWwgdXBkYXRlcyB0byBmaXgga25vd24gZGVmZWN0cyBhbmQgZW5oYW5jZW1lbnRzIGltcGxlbWVudGF0aW9uPC9zcGFuPjwvbGk+PC91bD48cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwY20gNC41cHQgMThwdDsgY29sb3I6IGJsYWNrOyI+PGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5IQUwgRHJpdmVycyBjaGFuZ2VzPC9zcGFuPjwvdT48L2I+PC9wPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbic7IGZvbnQtc2l6ZTogbWVkaXVtOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBzdGFydDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtc3BhY2luZzogMHB4OyBtYXJnaW4tdG9wOiAwY207IGNvbG9yOiByZWQ7IiB0eXBlPSJzcXVhcmUiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCZuYnNwOzwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBIQUwgZHJpdmVyIHRvIGFsbG93IHVzZXIgdG8gY2hhbmdlIHN5c3RpY2sgcGVyaW9kIHRvIDFtcywgMTAgbXMgb3IgMTAwIG1zIDo8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkFkZCB0aGUgZm9sbG93aW5nIEFQSSdzIDombmJzcDsmbmJzcDs8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9HZXRUaWNrUHJpbygpOiBSZXR1cm5zIGEgdGljayBwcmlvcml0eS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5IQUxfU2V0VGlja0ZyZXEoKTogU2V0cyBuZXcgdGljayZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+ZnJlcXVlbmN5Ljwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9HZXRUaWNrRnJlcSgpOiBSZXR1cm5zIHRpY2sgZnJlcXVlbmN5Ljwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+QWRkIEhBTF9UaWNrRnJlcVR5cGVEZWYgZW51bWVyYXRpb24gZm9yIHRoZSBkaWZmZXJlbnQgVGljayBGcmVxdWVuY2llczogMTAgSHosIDEwMCBIeiBhbmQgMUtIeiAoZGVmYXVsdCkuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgVU5VU0VEKCkgbWFjcm8gaW1wbGVtZW50YXRpb24gdG8gYXZvaWQgR0NDIHdhcm5pbmc8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPlRoZSB3YXJuaW5nIGlzIGRldGVjdGVkIHdoZW4gdGhlIFVOVVNFRCgpIG1hY3JvIGlzIGNhbGxlZCBmcm9tIEMrKyBmaWxlPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgX193ZWFrIGFuZCBfX3BhY2tlZCBkZWZpbmVkIHZhbHVlcyBmb3ImbmJzcDtBUk0gY29tcGlsZXI8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgX19BTElHTl9CRUdJTiBhbmQgX19BTElHTl9FTkQgZGVmaW5lZCB2YWx1ZXMgZm9yJm5ic3A7QVJNIGNvbXBpbGVyPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+SEFMIEkyQzxzcGFuPiZuYnNwOzwvc3Bhbj48L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+VXBkYXRlIEludGVyZmFjZSBBUElzIGhlYWRlcnMgdG8gcmVtb3ZlIGNvbmZ1c2luZyBtZXNzYWdlIGFib3V0IGRldmljZSBhZGRyZXNzPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IiBsYW5nPSJFTi1VUyI+PG86cD48L286cD48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+VXBkYXRlPHNwYW4+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkkyQ19XYWl0T25SWE5FRmxhZ1VudGlsVGltZW91dCgpIHRvIHJlc29sdmUgYSByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIFNUT1BGIGFuZCBSWE5FIEZsYWdzPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IiBsYW5nPSJFTi1VUyI+PG86cD48L286cD48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+VXBkYXRlJm5ic3A7STJDX1RyYW5zZmVyQ29uZmlnKCkgdG8gZml4IHdyb25nIGJpdCBtYW5hZ2VtZW50PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+SEFMIFNNQlVTPHNwYW4+IDwvc3Bhbj48L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+VXBkYXRlIGNvbmRpdGlvbnMgb24gSEFMIFNNQlVTIHNsYXZlIHRyYW5zZmVyIEFQSXMgdG8gYXZvaWQgYmxvY2sgb24gcmVhZCBvciB3cml0ZSBvcGVyYXRpb25zPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgRkxBU0g8c3Bhbj4mbmJzcDs8L3NwYW4+PC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+SEFMX0ZMQVNIX1VubG9jaygpIHVwZGF0ZSB0byByZXR1cm4gc3RhdGUgZXJyb3Igd2hlbiB0aGUgRkxBU0ggaXMgYWxyZWFkeSB1bmxvY2tlZDwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFBDRDxzcGFuPiA8L3NwYW4+PC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUKK3JlZGVmaW5pdGlvbiBvZiByZWdpc3RlcnMgd2l0aCBhZGp1c3RlZCBhZGRyZXNzIGJ5IGFkZGluZyB2b2xhdGlsZQora2V5d29yZCB0byBhdm9pZCB1bmV4cGVjdGVkIGNoYW5nZSBvZiBNZW1vcnktbWFwcGVkIHBlcmlwaGVyYWwgcmVnaXN0ZXJzPC9zcGFuPjwvbGk+PC91bD48L3VsPjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBjbSA0LjVwdCAxOHB0OyBjb2xvcjogYmxhY2s7Ij48YiBzdHlsZT0iIj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkxMIERyaXZlcnMgY2hhbmdlczwvc3Bhbj48L3U+PC9iPjwvcD48dWwgc3R5bGU9Im1hcmdpbi10b3A6IDBjbTsiIHR5cGU9InNxdWFyZSI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+TEwgQURDPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBmb250LXNpemU6IDEycHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUKK3JlZGVmaW5pdGlvbiBvZiByZWdpc3RlcnMgd2l0aCBhZGp1c3RlZCBhZGRyZXNzIGJ5IGFkZGluZyB2b2xhdGlsZQora2V5d29yZCB0byBhdm9pZCB1bmV4cGVjdGVkIGNoYW5nZSBvZiBNZW1vcnktbWFwcGVkIHBlcmlwaGVyYWwgcmVnaXN0ZXJzPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5MTCBEQUM8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+PC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGkgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZQorcmVkZWZpbml0aW9uIG9mIHJlZ2lzdGVycyB3aXRoIGFkanVzdGVkIGFkZHJlc3MgYnkgYWRkaW5nIHZvbGF0aWxlCitrZXl3b3JkIHRvIGF2b2lkIHVuZXhwZWN0ZWQgY2hhbmdlIG9mIE1lbW9yeS1tYXBwZWQgcGVyaXBoZXJhbCByZWdpc3RlcnM8L3NwYW4+PC9saT48L3VsPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogYmxhY2s7IGZvbnQtd2VpZ2h0OiBib2xkOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkxMIEhSVElNPC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IDQwMDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgb3JwaGFuczogMjsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMjsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZQorcmVkZWZpbml0aW9uIG9mIHJlZ2lzdGVycyB3aXRoIGFkanVzdGVkIGFkZHJlc3MgYnkgYWRkaW5nIHZvbGF0aWxlCitrZXl3b3JkIHRvIGF2b2lkIHVuZXhwZWN0ZWQgY2hhbmdlIG9mIE1lbW9yeS1tYXBwZWQgcGVyaXBoZXJhbCByZWdpc3RlcnM8L3NwYW4+PC9saT48L3VsPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+TEwgSTJDPC9zcGFuPiZuYnNwOzwvc3Bhbj48L2xpPjx1bD48bGkgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBMTF9JMkNfSGFuZGxlVHJhbnNmZXIoKSB0byBmaXggd3JvbmcmbmJzcDtiaXQgbWFuYWdlbWVudDwvc3Bhbj48L2xpPjwvdWw+PGxpIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBmb250LXNpemU6IDEycHQ7IGNvbG9yOiBibGFjazsgZm9udC13ZWlnaHQ6IGJvbGQ7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+TEwgUkNDPC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IDQwMDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgb3JwaGFuczogMjsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMjsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij5GaXggd3JvbmcgZGVmaW5lZCB2YWx1ZSBvZiBMU0k8L3NwYW4+PC9saT48L3VsPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogYmxhY2s7IGZvbnQtd2VpZ2h0OiBib2xkOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkxMIFJUQzwvc3Bhbj48L2xpPjx1bD48bGkgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiA0MDA7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IG9ycGhhbnM6IDI7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDI7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+TEwgUlRDIG1hY3JvcyBvcHRpbWl6YXRpb246PC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IDQwMDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgb3JwaGFuczogMjsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMjsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij5MTF9SVENfVElNRV9HZXRIb3VyKCk8L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiA0MDA7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IG9ycGhhbnM6IDI7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDI7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+TExfUlRDX1RJTUVfR2V0TWludXRlKCk8L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiA0MDA7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IG9ycGhhbnM6IDI7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDI7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+TExfUlRDX1RJTUVfR2V0U2Vjb25kKCk8L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiA0MDA7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IG9ycGhhbnM6IDI7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDI7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+TExfUlRDX0RBVEVfR2V0WWVhcigpPC9zcGFuPjwvbGk+PGxpIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBmb250LXNpemU6IDEycHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogNDAwOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBvcnBoYW5zOiAyOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAyOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPkxMX1JUQ19EQVRFX0dldE1vbnRoKCk8L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiA0MDA7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IG9ycGhhbnM6IDI7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDI7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+TExfUlRDX0RBVEVfR2V0RGF5KCk8L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiA0MDA7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IG9ycGhhbnM6IDI7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDI7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+TExfUlRDX0FMTUFfR2V0RGF5KCk8L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiA0MDA7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IG9ycGhhbnM6IDI7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDI7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+TExfUlRDX0FMTUFfR2V0SG91cigpPC9zcGFuPjwvbGk+PGxpIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBmb250LXNpemU6IDEycHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogNDAwOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBvcnBoYW5zOiAyOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAyOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPkxMX1JUQ19BTE1BX0dldE1pbnV0ZSgpPC9zcGFuPjwvbGk+PC91bD48dWw+PGxpIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBmb250LXNpemU6IDEycHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogNDAwOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBvcnBoYW5zOiAyOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAyOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPkxMX1JUQ19BTE1BX0dldFNlY29uZCgpPC9zcGFuPjwvbGk+PGxpIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBmb250LXNpemU6IDEycHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogNDAwOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBvcnBoYW5zOiAyOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAyOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPkxMX1JUQ19BTE1CX0dldERheSgpPC9zcGFuPjwvbGk+PGxpIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBmb250LXNpemU6IDEycHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogNDAwOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBvcnBoYW5zOiAyOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAyOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPkxMX1JUQ19BTE1CX0dldEhvdXIoKTwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IDQwMDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgb3JwaGFuczogMjsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMjsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij5MTF9SVENfQUxNQl9HZXRNaW51dGUoKTwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IDQwMDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgb3JwaGFuczogMjsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMjsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij5MTF9SVENfQUxNQl9HZXRTZWNvbmQoKTwvc3Bhbj48L2xpPjwvdWw+PC91bD48bGkgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IGJsYWNrOyBmb250LXdlaWdodDogYm9sZDsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5MTCBTUEk8L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBmb250LXNpemU6IDEycHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogNDAwOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBvcnBoYW5zOiAyOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAyOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPlVwZGF0ZSBMTF9TUElfVHJhbnNtaXREYXRhOCgpIGFuZCBMTF9TUElfVHJhbnNtaXREYXRhMTYoKSB0byBmaXggY29tcGlsYXRpb24gaXNzdWVzIHdpdGggR0NDPC9zcGFuPjwvbGk+PC91bD48bGkgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IGJsYWNrOyBmb250LXdlaWdodDogYm9sZDsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5MTCBUSU08L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBmb250LXNpemU6IDEycHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogNDAwOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBvcnBoYW5zOiAyOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAyOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlCityZWRlZmluaXRpb24gb2YgcmVnaXN0ZXJzIHdpdGggYWRqdXN0ZWQgYWRkcmVzcyBieSBhZGRpbmcgdm9sYXRpbGUKK2tleXdvcmQgdG8gYXZvaWQgdW5leHBlY3RlZCBjaGFuZ2Ugb2YgTWVtb3J5LW1hcHBlZCBwZXJpcGhlcmFsIHJlZ2lzdGVyczwvc3Bhbj48L2xpPjwvdWw+PHVsPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkZpeCBiZWhhdmlvciBvZiBMTF9USU1fSXNFbmFibGVkVXBkYXRlRXZlbnQoKSZuYnNwOzwvc3Bhbj48L2xpPjwvdWw+PGxpIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBmb250LXNpemU6IDEycHQ7IGNvbG9yOiBibGFjazsgZm9udC13ZWlnaHQ6IGJvbGQ7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+TEwgVVRJTFM8L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBmb250LXNpemU6IDEycHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogNDAwOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBvcnBoYW5zOiAyOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAyOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIExMX0luaXRUaWNrKCkgdG8gc2V0IFN5c1RpY2tfQ1RSTF9USUNLSU5UIGJpdCBpbiBTeXNUaWNrLSZndDtDVFJMJm5ic3A7PC9zcGFuPjwvbGk+PC91bD48L3VsPjxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiBpbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMjAwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjUuMAorLyAyMy1KdW5lLTIwMTc8L3NwYW4+PC9oMz48YiBzdHlsZT0iIj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyI+PC9zcGFuPjwvdT48L2I+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogOHB0OyBmb250LWZhbWlseTogJnF1b3Q7QXJpYWwmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IGJsdWU7Ij48L3NwYW4+PHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGNtIDQuNXB0IDE4cHQ7IGNvbG9yOiBibGFjazsiPjxiIHN0eWxlPSIiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+TWFpbiBjaGFuZ2VzPC9zcGFuPjwvdT48L2I+PC9wPjx1bCBzdHlsZT0iY29sb3I6IGJsYWNrOyI+PGxpPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5NYWludGVuYW5jZSByZWxlYXNlIHRvIGZpeCBrbm93biBkZWZlY3RzIGFuZCAKK2VuaGFuY2VtZW50cyBpbXBsZW1lbnRhdGlvbjxzcGFuIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsiPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvbGk+PC91bD48cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwY20gNC41cHQgMThwdDsgY29sb3I6IGJsYWNrOyI+PGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48L3NwYW4+PC91PjwvYj48L3A+PHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGNtIDQuNXB0IDE4cHQ7IGNvbG9yOiBibGFjazsiPjxiIHN0eWxlPSIiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+R2VuZXJpYyBkcml2ZXJzIGNoYW5nZXM8L3NwYW4+PC91PjwvYj48L3A+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJzsgZm9udC1zaXplOiBtZWRpdW07IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IHN0YXJ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC1zcGFjaW5nOiAwcHg7IG1hcmdpbi10b3A6IDBjbTsgY29sb3I6IHJlZDsiIHR5cGU9InNxdWFyZSI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+TUlTUkEgQyAyMDA0IHJ1bGUgMTEuNCAoQSBjYXN0IHNob3VsZCBub3QgYmUgcGVyZm9ybWVkIGJldHdlZW4gYSBwb2ludGVyIHRvIG9iamVjdCB0eXBlIGFuZCBhIGRpZmZlcmVudCBwb2ludGVyIHRvIG9iamVjdCB0eXBlKS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij5NSVNSQSBDIDIwMDQgcnVsZSAxMi40IChUaGUgcmlnaHQtaGFuZCBvcGVyYW5kIG9mIGEgbG9naWNhbCZuYnNwOyBvciZuYnNwOyBJJm5ic3A7IEkmbmJzcDsgb3BlcmF0b3Igc2hhbGwgbm90IDxicj5jb250YWluIHNpZGUgZWZmZWN0cykuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+TUlTUkEgQyAyMDA0IHJ1bGUgMTcuNCAoQXJyYXkgaW5kZXhpbmcgc2hhbGwgYmUgdGhlIG9ubHkgYWxsb3dlZCBmb3JtIG9mIHBvaW50ZXIgYXJpdGhtZXRpYykuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5SZW1vdmUgdXNlbGVzc3MgY2FzdCAodWludDMyX3QgKSBjYXN0IGluIGNhc2Ugb2YmbmJzcDsnVScgc3VmZml4Ljwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+Rml4IENvZGUgU29uYXIgd2FybmluZ3MgKHVzZWxlc3MgYXNzaWdubWVudCwgY2FzdCBhbHRlcnMgdmFsdWUsIGVtcHR5IHdoaWxlIHN0YXRlbWVudCAuLi4pLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgZm9udC1zaXplOiAxMy4zM3B4OyBsaW5lLWhlaWdodDogbm9ybWFsOyBmb250LXNpemUtYWRqdXN0OiBub25lOyBmb250LXN0cmV0Y2g6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHRleHQtaW5kZW50OiAwcHg7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IHdvcmQtc3BhY2luZzogMHB4OyBmbG9hdDogbm9uZTsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7Ij5NaW5vciA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5pbXByb3ZlbWVudCBvZgorICAgICBEb3h5Z2VuIFRhZ3MgZm9yIENITSBVTSBnZW5lcmF0aW9uPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBmb250LXNpemU6IDEzLjMzcHg7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IGZvbnQtc2l6ZS1hZGp1c3Q6IG5vbmU7IGZvbnQtc3RyZXRjaDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgdGV4dC1pbmRlbnQ6IDBweDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgd29yZC1zcGFjaW5nOiAwcHg7IGZsb2F0OiBub25lOyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsiPi48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5SZXBsYWNlIFBPU0lUSU9OX1ZBTCh4eHgpIG1hY3JvIGJ5IGNvcnJlc3BvbmRpbmcgQ01TSVNfUG9zIGRlZmluaXRpb25zLjwvc3Bhbj48L2xpPjwvdWw+PHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGNtIDQuNXB0IDE4cHQ7IGNvbG9yOiByZWQ7Ij48L3A+PHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGNtIDQuNXB0IDE4cHQ7IGNvbG9yOiBibGFjazsiPjxiIHN0eWxlPSIiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+SEFMIERyaXZlcnMgY2hhbmdlczwvc3Bhbj48L3U+PC9iPjwvcD48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nOyBmb250LXNpemU6IG1lZGl1bTsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogc3RhcnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3b3JkLXNwYWNpbmc6IDBweDsgbWFyZ2luLXRvcDogMGNtOyBjb2xvcjogYmxhY2s7IiB0eXBlPSJzcXVhcmUiPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5UaGUgZm9sbG93aW5nIGNoYW5nZXMgZG9uZSBvbiB0aGUgSEFMIGRyaXZlcnMgcmVxdWlyZSBhbiB1cGRhdGUgb24gdGhlIGFwcGxpY2F0aW9uIGNvZGUgYmFzZWQgb24gSEFMIFYxLjQuMDwvc3Bhbj48L2xpPjwvdWw+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJzsgZm9udC1zaXplOiBtZWRpdW07IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IHN0YXJ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC1zcGFjaW5nOiAwcHg7IG1hcmdpbi10b3A6IDBjbTsgY29sb3I6IHJlZDsiIHR5cGU9InNxdWFyZSI+PHVsIHN0eWxlPSJjb2xvcjogYmxhY2s7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+PHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPkhBTCBOQU5EIDwvc3Bhbj5kcml2ZXI6PHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPk92ZXJhbGwgZHJpdmVyIHJld29yayB3aXRoIGNvbXBhdGliaWxpdHkgYnJlYWsgdmVyc3VzIHByZXZpb3VzIEhBTCB2ZXJzaW9uIChzZWUmbmJzcDtiZWxvdykuPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPjwvc3Bhbj48L3NwYW4+PGJyPjxicj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUw8L3NwYW4+PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJjb2xvcjogYmxhY2s7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGZvbnQtc2l6ZTogMTMuMzNweDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgZm9udC1zaXplLWFkanVzdDogbm9uZTsgZm9udC1zdHJldGNoOiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtdHJhbnNmb3JtOiBub25lOyB0ZXh0LWluZGVudDogMHB4OyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyB3b3JkLXNwYWNpbmc6IDBweDsgZmxvYXQ6IG5vbmU7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyI+Q29ycmVjdCBSVENfUFJFRElWIHZhbHVlcyAoZm9yJm5ic3A7TFNJIGNsb2NrKSBpbiBoYWxfdGltZWJhc2VfcnRjX2FsYW1fdGVtcGxhdGUuYyBhbmQgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBmb250LXNpemU6IDEzLjMzcHg7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IGZvbnQtc2l6ZS1hZGp1c3Q6IG5vbmU7IGZvbnQtc3RyZXRjaDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgdGV4dC1pbmRlbnQ6IDBweDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgd29yZC1zcGFjaW5nOiAwcHg7IGZsb2F0OiBub25lOyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsiPmhhbF90aW1lYmFzZV9ydGNfd2FrZXVwX3RlbXBsYXRlLmM8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGZvbnQtc2l6ZTogMTMuMzNweDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgZm9udC1zaXplLWFkanVzdDogbm9uZTsgZm9udC1zdHJldGNoOiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtdHJhbnNmb3JtOiBub25lOyB0ZXh0LWluZGVudDogMHB4OyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyB3b3JkLXNwYWNpbmc6IDBweDsgZmxvYXQ6IG5vbmU7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyI+QWRkIGRlZmluaXRpb24gb2YgVVNFX1NQSV9DUkMgaW4gaGFsX2NvbmZfdGVtcGxhdGUuaDwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGZvbnQtc2l6ZTogMTMuMzNweDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgZm9udC1zaXplLWFkanVzdDogbm9uZTsgZm9udC1zdHJldGNoOiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IGNvbG9yOiByZ2IoMCwgMCwgMCk7IHRleHQtdHJhbnNmb3JtOiBub25lOyB0ZXh0LWluZGVudDogMHB4OyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyB3b3JkLXNwYWNpbmc6IDBweDsgZmxvYXQ6IG5vbmU7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyI+TW9kaWZ5IEhBTF9EZWxheSgpIGZ1bmN0aW9uIHRvIGdhcmFudGVlJm5ic3A7bWluaW11bSBkZWxheS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5OZXcgQVBJIDombmJzcDtIQUxfR2V0VUlEd3goKSByZWFkIHRoZSB1bmlxdWUgZGV2aWNlIGlkZW50aWZpZXIgd29yZCB4Ljwvc3Bhbj48L2xpPjwvdWw+PC91bD48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nOyBmb250LXNpemU6IG1lZGl1bTsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogc3RhcnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3b3JkLXNwYWNpbmc6IDBweDsgbWFyZ2luLXRvcDogMGNtOyBjb2xvcjogcmVkOyIgdHlwZT0ic3F1YXJlIj48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgQURDPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBmb250LXNpemU6IDEycHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+UmVtb3ZlIHVudXNlZCBsaXR0ZXJhbCBBRENfRU9DX1NJTkdMRV9TRVFfQ09OVi48L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5Db3JyZWN0IG5hbWUgb2Ygb25lIEFEQyZuYnNwO2V4dGVybmFsIHRyaWdnZXIgb2YgcmVndWxhciBncm91cCA6IEFEQ19FWFRFUk5BTFRSSUdDT05WX1Q0X0NDNC48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCZuYnNwO0NBTjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij48L3NwYW4+PC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkFkZCB0cmFuc21pc3Npb24gYWJvcnQgd2hlbiB0aW1lb3V0IGlzIHJlYWNoZWQgaW4gSEFMX0NBTl9UcmFuc21pdCgpLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkFkZCBtYW5hZ21lbnQgb2YmbmJzcDtvdmVycnVuIGVycm9yLiZuYnNwOzwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPlN0b3JlIG1pc3NpbmcgRklGTyBudW1iZXIgaW4gcmVjZWl2ZWQgbWVzc2FnZS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBmb250LXNpemU6IDEycHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5FeHRlbmQgU0VUX0JJVCwgQ0xFQVJfQklUIG1hY3JvIHVzYWdlLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkFsbG93IHBvc3NpYmlsaXR5IHRvIHJlY2VpdmUgbWVzc2FnZXMgZnJvbSB0aGUgMiBSWCBGSUZPcyBpbiBwYXJhbGxlbCB2aWEgaW50ZXJydXB0Ljwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+Rml4Jm5ic3A7bWVzc2FnZSBsb3N0IGlzc3VlIHdpdGggc3BlY2lmaWMgc2VxdWVuY2Ugb2YgdHJhbnNtaXQgcmVxdWVzdHMuPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwmbmJzcDtDT01QPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+Q09NUF9XSU5ET1dNT0RFIGxpdHRlcmFscyBjbGVhbi11cCBhY2NvcmRpbmcgdG8gZmFtaWx5IGRpdmVyc2l0eS48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBOQU5EPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+T3ZlcmFsbCBkcml2ZXIgcmV3b3JrIGluIG9yZGVyJm5ic3A7dG8gc3VwcG9ydCBOQU5EIGZsYXNoIG1lbW9yaWVzIHdpdGggaGlnaGVyIGNhcGFjaXRpZXMuJm5ic3A7PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+QWRkIHN1cHBvcnQgb2YgMTYgYml0cyBhZHJlc3NpbmcgbW9kZTxicj48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBmb250LXNpemU6IDEycHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5BUEkgY2hhbmdlcyA6PC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkFkZCZuYnNwO0hBTF9OQU5EX0NvbmZpZ0RldmljZSgpIGZ1bmN0aW9uPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+U3BsaXQmbmJzcDtIQUxfTkFORF9SZWFkX1BhZ2UoKSwKK0hBTF9OQU5EX1dyaXRlX1BhZ2UoKSwgSEFMX05BTkRfUmVhZF9TcGFyZUFyZWEoKSwKK0hBTF9OQU5EX1dyaXRlX1NwYXJlQXJlYSgpIGluIF84YiBhbmQmbmJzcDsgXyAxNmIgZnVuY3Rpb25zIHRvIHNlbGVjdAordGhlIHByb3BlciBhZHJlc3NpbmcgbW9kZS48L3NwYW4+PC9saT48L3VsPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEhSVElNPC9zcGFuPjwvc3Bhbj48L2xpPjwvdWw+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJzsgZm9udC1zaXplOiBtZWRpdW07IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IHN0YXJ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC1zcGFjaW5nOiAwcHg7IG1hcmdpbi10b3A6IDBjbTsgY29sb3I6IHJlZDsiIHR5cGU9InNxdWFyZSI+PHVsPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPk1vZGlmeSBfX0hBTF9IUlRJTV9TRVRDTE9DS1BSRVNDQUxFUiBtYWNybyB0byBjbGVhciBDS1BTQyBhbmQgQ0tQU0N4IGJpdHMgYmVmb3JlIHNldHRpbmcgbmV3IHByZXNjYWxlciB2YWx1ZS48L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5Db3JyZWN0IEhSVElNX0VWRU5URkFTVE1PREVfRElTQUJMRSBhbmQgSFJUSU1fRVZFTlRGQVNUTU9ERV9FTkFCTEUgZGVmaW5lcy48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBJMkM8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjwvc3Bhbj48L2xpPjx1bD48bGkgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5FZGl0b3JpYWwgbW9kaWZpY2F0aW9uIDogYXN0eWxlIGNsZWFuLXVwPC9zcGFuPjwvbGk+PC91bD48bGkgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgU01CVVM8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+PC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTBwdDsiPk5ldyBBUEkgOiBEaWdpdGFsL0FuYWxvZyBmaWx0ZXIgY29uZmlndXJhdGlvbiB3aXRoIEhBTF9TTUJVU19Db25maWdBbmFsb2dGaWx0ZXIoKSBhbmQgSEFMX1NNQlVTX0NvbmZpZ0RpZ2l0YWxGaWx0ZXIoKS48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyBmb250LXdlaWdodDogYm9sZDsiIGxhbmc9IkVOLVVTIj5IQUwKKyAgICAgUENEJm5ic3A7PC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkZpeCBhbmQgSW1wcm92ZSBQQ0RfUmVhZFBNQSgpIEFQSSB0byBwcmV2ZW50IGNvcnJ1cHRpbmcgdXNlciBidWZmZXIuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+TWlub3IgY2hhbmdlcyBpbiBIQUxfUENEX0NMRUFSX0ZMQUcsIFBDRF9DTEVBUl9UWC9SWF9FUF9DVFIgbWFjcm9zPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+Ljwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkZpeCBVU0IgZGV2aWNlIHJlbW90ZSB3YWtldXAgaXNzdWUuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+VVNCIFBDRCBpbnRlcnJ1cHQgaGFuZGxlcjogcmVtb3ZlIHVzZWxlc3MgdXNiIGRldmljZSBpbnRlcnJ1cHRzIGVuYWJsZSwgYWxyZWFkeSBzZXQgZHVyaW5nIHRoZSBwY2QgaW5pdC48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5SZW1vdmUgbG9jay91bmxvY2sgZnJvbSBVU0IgcmVjZWl2ZSBhbmQgdHJhbnNtaXQgZW5kcG9pbnRzLjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFJUQzwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48L3NwYW4+PC9saT48dWwgc3R5bGU9ImNvbG9yOiBibGFjazsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5Db3JyZWN0IFJUQyBUaW1lIHJlZ2lzdGVyIGluaXRpYWxpemF0aW9uLjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBib2xkOyIgbGFuZz0iRU4tVVMiPkhBTCBTUEkgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJjb2xvcjogYmxhY2s7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+RW1wdHkgUlhGSUZPIGluIGNhc2Ugb2YgZW5kIG9mIE1BU1RFUiB0cmFuc21pc3Npb24mbmJzcDsyIGxpbmVzLjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBib2xkOyIgbGFuZz0iRU4tVVMiPkhBTCZuYnNwO0kyUyA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj48L3NwYW4+PC9saT48dWwgc3R5bGU9ImNvbG9yOiBibGFjazsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5GaXggZnVsbCBkdXBsZXggSTJTIHdpdGggY2lyY3VsYXIgRE1BIGlzc3VlcyA6PC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5Eb24ndCBzdG9wIERNQSBhdCBlbmQgb2YgdHJhbnNmZXJ0PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlNvbHZlIHN5bmNocm9uaXN6YXRpb24gaXNzdWVzIGJldHdlZW4gUlggYW5kIFRYLjxicj48L3NwYW4+PC9saT48L3VsPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBib2xkOyIgbGFuZz0iRU4tVVMiPkhBTCBUSU08L3NwYW4+PC9saT48dWwgc3R5bGU9ImNvbG9yOiBibGFjazsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IGJvbGQ7IiBsYW5nPSJFTi1VUyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+Rml4IHR5cG8gaW4gX19IQUxfVElNX1NFVF9QUkVTQ0FMRVIgbWFjcm8uPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkltcHJvdm1lbnQgb2YgVElNIERNQSBidXJzdCBtb2RlLiBBZGQgMiBuZXcgQVBJIDo8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkhBTF9USU1fRE1BQnVyc3RfTXVsdGlXcml0ZVN0YXJ0KCk8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+SEFMX1RJTV9ETUFCdXJzdF9NdWx0aVJlYWRTdGFydCgpPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+QWRkIEJSSzIgKEJyZWFrIGlucHV0IDIgZXZlbnQpIGludGVycnVwdCBoYW5kbGVyLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VcGRhdGUgSVJRIGhhbmRsZXIgdG8gdXNlIGNvcnJlY3QgZGVmaW5lcyAoVElNX0ZMQUdfeHh4eCBpbnN0ZWFkIG9mIFRJTV9JVF94eHh4KTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPiB0byBjbGVhciBmbGFnLjxicj48L3NwYW4+PC9saT48L3VsPjwvdWw+Cis8c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IHJlZDsiPjwvc3Bhbj48cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwY20gNC41cHQgMThwdDsgY29sb3I6IHJlZDsiPjxiIHN0eWxlPSIiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PC9zcGFuPjwvdT48L2I+PC9wPjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBjbSA0LjVwdCAxOHB0OyBjb2xvcjogYmxhY2s7Ij48YiBzdHlsZT0iIj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkxMIERyaXZlcnMgY2hhbmdlczwvc3Bhbj48L3U+PC9iPjwvcD48dWwgc3R5bGU9Im1hcmdpbi10b3A6IDBjbTsiIHR5cGU9InNxdWFyZSI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+TEwgQURDPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBmb250LXNpemU6IDEycHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+U2V0IFRFTVBTRU5TT1JfQ0FMMV9URU1QIHZhbHVlIHRvIDMwsEMgYXMgc3BlY2lmaWVkIGluIGRhdGFzaGVldC48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkxMJm5ic3A7RE1BPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBmb250LXNpemU6IDEycHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+UmVwbGFjZSBTRVRfQklUIG1hY3JvIGJ5IFdSSVRFX1JFRyBpbiBMTF9ETUFfQ2xlYXJGbGFnX3h4eCgpIGFzJm5ic3A7Jm5ic3A7RE1BIElGQ1IgcmVnaXN0ZXIgaXMgcmVhZCBvbmx5Ljwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkZvciBiZXR0ZXIgcGVyZm9ybWFuY2VzLCBDUEFSIGFuZCBDTUFSIHJlZ3NpdGVycyBhcmUgdXBkYXRlZCBieSBXUklURV9SRUcgbWFjcm8gaW5zdGVhZCBvZiBNT0RJRllfUkVHLjwvc3Bhbj48L2xpPjwvdWw+PC91bD48dWwgc3R5bGU9Im1hcmdpbi10b3A6IDBjbTsiIHR5cGU9InNxdWFyZSI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+TEwgSTJDPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTBwdDsiPjwvc3Bhbj48L2xpPjx1bCBzdHlsZT0iY29sb3I6IGJsYWNrOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTBwdDsiPk9BMUVOIGJpdCBvZiBPQVIxIHJlZ2lzdGVyIHNob3VsZCBiZSBzZXQgb25seSB3aGVuIG93biBhZGRyZXNzIGRpZmZlcmVudCBmcm9tIDAgKDAgcmVzZXJ2ZWQgZm9yIEdlbmVyYWwgQ2FsbCBhZGRyZXNzKS48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkxMIFJUQzwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48L3NwYW4+PC9saT48dWwgc3R5bGU9ImNvbG9yOiBibGFjazsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VcGRhdGUgTExfUlRDX0RBVEVfR2V0KCkgZnVuY3Rpb24gZm9yIGJldHRlciBwZXJmb3JtYW5jZXMuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5MTCBTUEk8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJjb2xvcjogcmVkOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+UmVtb3ZlIExMX1NQSV9TUl9VRFIgKGF2YWlsYWJsZSBvbmx5IGZvciBJMlMgZmVhdHVyZSkuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5MTF9USU08L3NwYW4+PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJjb2xvcjogcmVkOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+QWRkIEF1dG9tYXRpY091dHB1dCBmaWVsZCZuYnNwO2luaXRpYWxpemF0aW9uIGluIExMX1RJTV9CRFRSX1N0cnVjdEluaXQoKS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5GaXggdHlwbyBpbiBfX0hBTF9USU1fU0VUX1BSRVNDQUxFUiBtYWNyby48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5FbnN1cmUKK3dyaXRlIG9wZXJhdGlvbiBvZiBCS0UgYW5kIEJLUCBiaXRzIGlzIGVmZmVjdGl2ZSBieSBhZGRpbmcgZmFrZSByZWFkCitvcGVyYXRpb24gdG8gZ2FyYW50ZWUgMSBBUEIgY2xvY2sgY3ljbGUgYmVmb3JlIGZ1bmN0aW9uIGV4aXQuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+RXhjaGFuZ2UgYmVoYXZpb3IgYmV0d2VlbiZuYnNwO0xMX1RJTV9FbmFibGVVcGRhdGVFdmVudCgpIGFuZCBMTF9USU1fRGlzYWJsZVVwZGF0ZUV2ZW50KCkuPGJyPjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+TEwgVVRJTFM8L3NwYW4+PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJjb2xvcjogYmxhY2s7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+VXBkYXRlIGZ1bmN0aW9uIFVUSUxTX0VuYWJsZVBMTEFuZFN3aXRjaFN5c3RlbSgpIHRvIHVzZSBjdXJyZW50IEFIQiBwcmVzY2FsZXIgZm9yJm5ic3A7c3lzY2xrIGZyZXF1ZW5jeSBjYWxjdWxhdGlvbi48L3NwYW4+PC9saT48L3VsPjwvdWw+PGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IGluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAyMDBweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuNC4wCisvIDE2LURlY2VtYmVyLTIwMTY8L3NwYW4+PC9oMz48YiBzdHlsZT0iIj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyI+PC9zcGFuPjwvdT48L2I+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogOHB0OyBmb250LWZhbWlseTogJnF1b3Q7QXJpYWwmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IGJsdWU7Ij48L3NwYW4+PHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGNtIDQuNXB0IDE4cHQ7Ij48YiBzdHlsZT0iIj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyI+TWFpbiBjaGFuZ2VzPC9zcGFuPjwvdT48L2I+Cis8L3A+PHVsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+TWFpbnRlbmFuY2UgcmVsZWFzZSB0byBmaXgga25vd24gZGVmZWN0cyBhbmQgCitlbmhhbmNlbWVudHMgaW1wbGVtZW50YXRpb248L3NwYW4+PC9zcGFuPjwvbGk+PC91bD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiA4cHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtBcmlhbCZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogYmx1ZTsiPjwvc3Bhbj48cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwY20gNC41cHQgMThwdDsiPjxiIHN0eWxlPSIiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBjb2xvcjogYmxhY2s7Ij5IQUwgRHJpdmVycyBjaGFuZ2VzPC9zcGFuPjwvdT48L2I+PC9wPjx1bCBzdHlsZT0iY29sb3I6IGJsYWNrOyI+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IiBjbGFzcz0iTXNvTm9ybWFsIj4KKworPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPkVuaGFuY2UgSEFMIGRlbGF5IGFuZCB0aW1lIGJhc2UgaW1wbGVtZW50YXRpb248L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPjo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+QWRkCituZXcgdGVtcGxhdGVzCitzdG0zMmYweHhfaGFsX3RpbWViYXNlX3J0Y19hbGFybV90ZW1wbGF0ZS5jLCZuYnNwO3N0bTMyZjB4eF9oYWxfdGltZWJhc2VfcnRjX3dha2V1cF90ZW1wbGF0ZS5jCithbmQgc3RtMzJmMHh4X2hhbF90aW1lYmFzZV90aW1fdGVtcGxhdGUuYyB3aGljaCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZQordGhlIG5hdGl2ZQorSEFMIHRpbWUgYmFzZSBmdW5jdGlvbnMgKGRlZmluZWQgYXMgd2VhaykgdG8mbmJzcDt1c2UgZWl0aGVyIFJUQyBvcgorVGltZXIgYXMgdGltZQorYmFzZSB0aWNrIHNvdXJjZS4gRm9yIG1vcmUgZGV0YWlscyBhYm91dCB0aGUgdXNhZ2Ugb2YgdGhlc2UgZHJpdmVycywKK3BsZWFzZSByZWZlciB0byBIQUxcSEFMX1RpbWVCYXNlIGV4YW1wbGVzJm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGZsb2F0OiBub25lOyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7Ij5hbmQgRnJlZVJUT1MtYmFzZWQgYXBwbGljYXRpb25zPC9zcGFuPjwvbGk+PC91bD48L3VsPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbic7IGZvbnQtc2l6ZTogbWVkaXVtOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBzdGFydDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtc3BhY2luZzogMHB4OyBtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyBjb2xvcjogYmxhY2s7IGZvbnQtd2VpZ2h0OiBib2xkOyI+VGhlIGZvbGxvd2luZyBjaGFuZ2VzIGRvbmUgb24gdGhlIEhBTCBkcml2ZXJzIHJlcXVpcmUgYW4gdXBkYXRlIG9uIHRoZSBhcHBsaWNhdGlvbiBjb2RlIGJhc2VkIG9uIEhBTCBWMS4zLjA8L3NwYW4+PC9saT48L3VsPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbic7IGZvbnQtc2l6ZTogbWVkaXVtOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBzdGFydDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtc3BhY2luZzogMHB4OyBtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj48c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+SEFMIENFQyA8L3NwYW4+ZHJpdmVyOjxzcGFuIGNsYXNzPSJBcHBsZS1jb252ZXJ0ZWQtc3BhY2UiPiZuYnNwOzwvc3Bhbj4mbmJzcDtPdmVyYWxsIGRyaXZlciByZXdvcmsgd2l0aCBjb21wYXRpYmlsaXR5IGJyZWFrIHZlcnN1cyBwcmV2aW91cyBIQUwgdmVyc2lvbjwvc3Bhbj48YnI+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+UmVtb3ZlIEhBTCBDRUMgcG9sbGluZyBQcm9jZXNzIGZ1bmN0aW9uczogSEFMX0NFQ19UcmFuc21pdCgpIGFuZCBIQUxfQ0VDX1JlY2VpdmUoKTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5SZW1vdmUKK0hBTCBDRUMgcmVjZWl2ZSBpbnRlcnJ1cHQgcHJvY2VzcyBmdW5jdGlvbiZuYnNwO0hBTF9DRUNfUmVjZWl2ZV9JVCgpCithbmQgZW5hYmxlIHRoZSAicmVjZWl2ZSIgJm5ic3A7bW9kZSBkdXJpbmcgdGhlIEluaXQgcGhhc2U8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+UmVuYW1lJm5ic3A7SEFMX0NFQ19HZXRSZWNlaXZlZEZyYW1lU2l6ZSgpIGZ1bnRpb24gdG8mbmJzcDtIQUxfQ0VDX0dldExhc3RSZWNlaXZlZEZyYW1lU2l6ZSgpPGJyPjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5BZGQgbmV3IEhBTCBBUElzOiBIQUxfQ0VDX1NldERldmljZUFkZHJlc3MoKSBhbmQgSEFMX0NFQ19DaGFuZ2VSeEJ1ZmZlcigpPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPlJlbW92ZSB0aGUmbmJzcDs8c3Bhbj48L3NwYW4+J0luaXRpYXRvckFkZHJlc3MnCitmaWVsZCBmcm9tIHRoZSZuYnNwO0NFQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUmbmJzcDthbmQgbWFuYWdlCitpdCZuYnNwO2FzIGEgcGFyYW1ldGVyIGluIHRoZSBIQUxfQ0VDX1RyYW5zbWl0X0lUKCkgZnVuY3Rpb248L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyIgbGFuZz0iRU4tVVMiPjxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPkFkZCBuZXcgcGFyYW1ldGVyICdSeEZyYW1lU2l6ZScgaW4gSEFMX0NFQ19SeENwbHRDYWxsYmFjaygpIGZ1bmN0aW9uPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPk1vdmUgQ0VDIFJ4IGJ1ZmZlciBwb2ludGVyJm5ic3A7ZnJvbSBDRUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdG8gQ0VDX0luaXRUeXBlRGVmIHN0cnVjdHVyZTwvc3Bhbj48L2xpPjwvdWw+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5IQUwgVElNIGRyaXZlciA8L3NwYW4+OiBhZGQgb25lIGZpZWxkIChBdXRvUmVsb2FkUHJlbG9hZCkgaW4mbmJzcDtUSU1fQmFzZV9Jbml0VHlwZURlZiBzdHJ1Y3R1cmU8L3NwYW4+PGJyPjxicj48L2xpPjwvdWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgR2VuZXJpYzwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+VXBkYXRlIEhBTCBEcml2ZXIgY29tcGxpYW5jeSB3aXRoOjwvc3Bhbj48L2xpPjx1bCBzdHlsZT0iY29sb3I6IGJsYWNrOyI+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+TUlTUkEgQyAyMDA0IHJ1bGUgMTAuNiAoJ1UnIHN1ZmZpeCBhcHBsaWVkIHRvIGFsbCBjb25zdGFudHMgb2YgJ3Vuc2lnbmVkJyB0eXBlKTwvc3Bhbj48L2xpPjwvdWw+PC91bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PGI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUwgQ0VDPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPjwvc3Bhbj48L2xpPjx1bCBzdHlsZT0iY29sb3I6IGJsYWNrOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPk92ZXJhbGwgZHJpdmVyIHJld29yayB3aXRoJm5ic3A7YnJlYWsgb2YgY29tcGF0aWJpbGl0eSB3aXRoIEhBTCBWMS4zLjA8YnI+PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+UmVtb3ZlIHRoZSBIQUwgQ0VDIHBvbGxpbmcgUHJvY2VzczogSEFMX0NFQ19UcmFuc21pdCgpIGFuZCBIQUxfQ0VDX1JlY2VpdmUoKTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBmb250LXNpemU6IDEycHQ7IiBsYW5nPSJFTi1VUyI+PG86cD48L286cD48L3NwYW4+PC9saT48L3VsPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPlJlbW92ZSB0aGUgSEFMIENFQyByZWNlaXZlIGludGVycnVwdCBwcm9jZXNzIChIQUxfQ0VDX1JlY2VpdmVfSVQoKSkgYW5kIG1hbmFnZSB0aGUgIlJlY2VpdmUiIG1vZGUgZW5hYmxlIHdpdGhpbiB0aGUgSW5pdCBwaGFzZTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5SZW5hbWUgSEFMX0NFQ19HZXRSZWNlaXZlZEZyYW1lU2l6ZSgpIGZ1bmN0aW9uIHRvJm5ic3A7SEFMX0NFQ19HZXRMYXN0UmVjZWl2ZWRGcmFtZVNpemUoKSBmdW5jdGlvbjxicj48L3NwYW4+PC9saT48L3VsPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPkFkZCBuZXcgSEFMIEFQSXM6IEhBTF9DRUNfU2V0RGV2aWNlQWRkcmVzcygpIGFuZCBIQUxfQ0VDX0NoYW5nZVJ4QnVmZmVyKCk8L3NwYW4+PC9saT48L3VsPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPlJlbW92ZSB0aGUmbmJzcDs8c3Bhbj48L3NwYW4+J0luaXRpYXRvckFkZHJlc3MnCitmaWVsZCBmcm9tIHRoZSZuYnNwO0NFQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUmbmJzcDthbmQgbWFuYWdlCitpdCZuYnNwO2FzIGEgcGFyYW1ldGVyIGluIHRoZSBIQUxfQ0VDX1RyYW5zbWl0X0lUKCkgZnVuY3Rpb248L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj48L3NwYW4+PC9saT48L3VsPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPkFkZCBuZXcgcGFyYW1ldGVyICdSeEZyYW1lU2l6ZScgaW4gSEFMX0NFQ19SeENwbHRDYWxsYmFjaygpIGZ1bmN0aW9uPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsiIGxhbmc9IkVOLVVTIj48bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjwvdWw+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+TW92ZSBDRUMgUnggYnVmZmVyIHBvaW50ZXImbmJzcDtmcm9tIENFQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0byBDRUNfSW5pdFR5cGVEZWYgc3RydWN0dXJlPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+PG86cD48L286cD48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBkcml2ZXIgdG8gaW1wbGVtZW50IHRoZSBuZXcgQ0VDIHN0YXRlIG1hY2hpbmU6PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5BZGQgbmV3Jm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij4icnhTdGF0ZSI8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIGNsYXNzPSJBcHBsZS1jb252ZXJ0ZWQtc3BhY2UiPiZuYnNwOzwvc3Bhbj5maWVsZCBpbiBDRUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdG8gcHJvdmlkZSB0aGU8c3BhbiBjbGFzcz0iQXBwbGUtY29udmVydGVkLXNwYWNlIj4mbmJzcDs8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5DRUM8c3BhbiBjbGFzcz0iQXBwbGUtY29udmVydGVkLXNwYWNlIj4mbmJzcDs8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5zdGF0ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIFJ4IE9wZXJhdGlvbnM8L3NwYW4+PC9saT48L3VsPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+UmVuYW1lICJzdGF0ZSIgZmllbGQgaW4gQ0VDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRvICJnc3RhdGUiOiBDRUM8c3BhbiBjbGFzcz0iQXBwbGUtY29udmVydGVkLXNwYWNlIj4mbmJzcDs8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5zdGF0ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGdsb2JhbCBIYW5kbGUgbWFuYWdlbWVudCBhbmQgVHggT3BlcmF0aW9uczwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBDRUMgcHJvY2VzcyB0byBtYW5hZ2UgdGhlIG5ldyBDRUMgc3RhdGVzLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5VcGRhdGUgX19IQUxfQ0VDX1JFU0VUX0hBTkRMRV9TVEFURSgpIG1hY3JvIHRvIGhhbmRsZSB0aGUgbmV3IENFQyBzdGF0ZSBwYXJhbWV0ZXJzIChnU3RhdGUsIHJ4U3RhdGUpPC9zcGFuPjwvbGk+PC91bD48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCZuYnNwOzwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5VQVJUL1VTQVJUPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPi88L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5JUkRBL1NNQVJUQ0FSRDwvc3Bhbj48L3NwYW4+PC9saT48dWwgc3R5bGU9ImNvbG9yOiBibGFjazsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkZSIj5JUlEgSGFuZGxlciBnbG9iYWwgb3B0aW1pemF0aW9uJm5ic3A7PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRlIiPk5ldyZuYnNwO2Fib3J0Jm5ic3A7QVBJOiBIQUxfUFBQX0Fib3J0KCksIEhBTF9QUFBfQWJvcnRfSVQoKTxicj48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij5BZGQgZXJyb3IgbWFuYWdlbWVudCBpbiBjYXNlIG9mIERNQSB0cmFuc2ZlciB0aHJvdWdoCisgICAgICAgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij5IQUxfRE1BX0Fib3J0X0lUKCkgYW5kIERNQSA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPlhmZXJBYm9ydENhbGxiYWNrKCk8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJGUiI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJGUiI+UG9sbGluZyBtYW5hZ2VtZW50IHVwZGF0ZTo8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyI+VGhlIHVzZXIgVGltZW91dCB2YWx1ZSBtdXN0IGJlIGVzdGltYXRlZCBmb3IgdGhlIG92ZXJhbGwgcHJvY2VzcworZHVyYXRpb248L3NwYW4+PC9saT48L3VsPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+SEFMIFNQSTwvc3Bhbj48L2I+PGI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj48c3BhbiBjbGFzcz0iQXBwbGUtY29udmVydGVkLXNwYWNlIj48L3NwYW4+PC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyI+PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47IGNvbG9yOiBibGFjazsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPk92ZXJhbGwgZHJpdmVyIG9wdGltaXphdGlvbiB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIGluIHBvbGxpbmcvaW50ZXJydXB0IG1vZGUgdG8gcmVhY2ggbWF4aW11bSBwZXJpcGhlcmFsIGZyZXF1ZW5jeTwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPlBvbGxpbmcgbW9kZTo8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPlJlcGxhY2UgdGhlIHVzZSBvZiBTUElfV2FpdE9uRmxhZ1VuaXRUaW1lb3V0KCkgZnVuY3Rpb24gYnkgImlmIiBzdGF0ZW1lbnQgdG8gY2hlY2sgb24gUlhORS9UWEUgZmxhZ2Ugd2hpbGUgdHJhbnNmZXJyaW5nIGRhdGE8L3NwYW4+PC9saT48L3VsPjwvdWw+PC91bD48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsgY29sb3I6IGJsYWNrOyI+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij4mbmJzcDtJbnRlcnJ1cHQgbW9kZTo8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPk1pbmltaXplIGFjY2VzcyBvbiBTUEkgcmVnaXN0ZXJzPC9zcGFuPjwvbGk+PC91bD48L3VsPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+QWxsIG1vZGVzOjwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+QWRkIHRoZSBVU0VfU1BJX0NSQyBzd2l0Y2ggdG8gbWluaW1pemUgdGhlIG51bWJlciBvZiBzdGF0ZW1lbnRzIHdoZW4gQ1JDIGNhbGN1bGF0aW9uIGlzIGRpc2FibGVkPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlJm5ic3A7dGltZW91dCBtYW5hZ2VtZW50IHRvIGNoZWNrIG9uIGdsb2JhbCBwcm9jZXNzZXM8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgZXJyb3IgY29kZSBtYW5hZ2VtZW50IGluIGFsbCBwcm9jZXNzZXM8L3NwYW4+PC9saT48L3VsPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyI+Rml4IHJlZ3Jlc3Npb24gaW4gcG9sbGluZyBtb2RlOjxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij5BZGQgcHJlcGFyaW5nIGRhdGEgdG8gdHJhbnNtaXQgaW4gY2FzZSBvZiBzbGF2ZSBtb2RlIGluIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlKCkgYW5kJm5ic3A7SEFMX1NQSV9UcmFuc21pdCgpPG86cD48L286cD48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiPkZpeCByZWdyZXNzaW9uIGluIGludGVycnVwdCBtb2RlOjxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij5BZGQgYSB3YWl0IG9uIFRYRSBmbGFnIGluIFNQSV9DbG9zZVR4X0lTUigpIGFuZCBpbiBTUElfQ2xvc2VUeFJ4X0lTUigpPG86cD48L286cD48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij5BZGQgdG8gbWFuYWdlIHByb3Blcmx5IHRoZSZuYnNwO292ZXJydW4gZmxhZyBpbiBTUElfQ2xvc2VSeFR4X0lTUigpIGFuZCBTUElfQ2xvc2VSeF9JU1IoKTwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlByZXZlbnQmbmJzcDtkYXRhIHBhY2tpbmcgbW9kZQoraW4gcmVjZXB0aW9uIGZvciA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O0FyaWFsJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+U1RNMzJGMzAyeEMsIFNUTTMyRjMwM3hDLCBTVE0zMkYzNzN4QywgU1RNMzJGMzU4eHgsIFNUTTMyRjM3OHh4PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7QXJpYWwmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5BZGQgY2hlY2sgb2YgRE1BIGhhbmRsZSBkZWZpbml0aW9uIGJlZm9yZSBjYWxsaW5nIEhBTF9TUElfUmVjZWl2ZV9ETUEsIEhBTF9TUElfVHJhbnNtaXRfRE1BLCBIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZV9ETUE8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlVwZGF0ZWQgSEFMIERyaXZlciBjb21wbGlhbmN5IHdpdGggPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+TUlTUkEgQyAyMDA0IHJ1bGVzPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+Ojwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPk1JU1JBIEMgMjAwNCBydWxlIDE0LjMgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+KGEgbnVsbCBzdGF0ZW1lbnQgc2hhbGwgb25seSBvY2N1ciBvbiBhIGxpbmUgYnkgaXRzZWxmKS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPk1JU1JBIEMgMjAwNCBydWxlIDE0LjggPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+KHN0YXRlbWVudCBmb3JtaW5nIHRoZSBib2R5IG9mIGEgc3dpdGNoLCB3aGlsZSwgZG8ghSB3aGlsZSBvciBmb3Igc3RhdGVtZW50IHNoYWxsIGJlIGEgY29tcG91bmQgc3RhdGVtZW50KS48L3NwYW4+PC9saT48L3VsPjwvdWw+PC91bD48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+SEFMIERNQTwvc3Bhbj48L2I+PC9saT48dWwgc3R5bGU9ImNvbG9yOiBibGFjazsiPjxsaT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkdsb2JhbAorICAgICAgZHJpdmVyIGNvZGUgb3B0aW1pemF0aW9uIHRvIHJlZHVjZSBtZW1vcnkgZm9vdHByaW50Jm5ic3A7PC9zcGFuPjwvbGk+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+QWRkCisgICAgICBuZXcgQVBJcyBIQUxfRE1BX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbmQgSEFMX0RNQV9VblJlZ2lzdGVyQ2FsbGJhY2sgdG8KKyAgICAgIHJlZ2lzdGVyL3VucmVnaXN0ZXIgdGhlIGRpZmZlcmVudCBjYWxsYmFja3MgaWRlbnRpZmllZCBieSB0aGUgZW51bQorICAgICAgdHlwZWRlZiBIQUxfRE1BX0NhbGxiYWNrSURUeXBlRGVmPC9zcGFuPjwvbGk+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+QWRkCisgICAgICBuZXcgRXJyb3IgQ29kZSBIQUxfRE1BX0VSUk9SX05PVF9TVVBQT1JURUQ8L3NwYW4+PC9saT48bGk+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5SZW1vdmUKKyAgICAgIERNQSBIQUxfRE1BX1NUQVRFX1JFQURZX0hBTEYgJmFtcDsgSEFMX0RNQV9TVEFURV9FUlJPUiBzdGF0ZXMgaW4KKyAgICAgIEhBTF9ETUFfU3RhdGVUeXBlRGVmPC9zcGFuPjwvbGk+PC91bD48L3VsPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbic7IGZvbnQtc2l6ZTogbWVkaXVtOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBzdGFydDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtc3BhY2luZzogMHB4OyBtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBPHNwYW4gc3R5bGU9ImNvbG9yOiBibGFjazsiPkwgSTJDPC9zcGFuPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiByZ2IoNTEsIDEwMiwgMjU1KTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBmb250LXNpemU6IDEycHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+RGlzYWJsZSBJMkNfT0FSeF9FTiBiaXQmbmJzcDtiZWZvcmUgYW55IGNvbmZpZ3VyYXRpb24gaW4gT0FSMSBvciAyIGluIEhBTF9JMkNfSW5pdCgpPC9zcGFuPjwvbGk+PGxpIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBmb250LXNpemU6IDEycHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+TW92ZSBJMkNfTk9fT1BUSU9OX0ZSQU1FIGluIHByaXZhdGUgc2VjdGlvbjwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogcmdiKDUxLCAxMDIsIDI1NSk7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJjb2xvcjogYmxhY2s7Ij5VcGRhdGUmbmJzcDtJU19JMkNfRkFTVE1PREVQTFVTIG1hY3JvLiBBZGQgSTJDX0ZNUF9OT1RfU1VQUE9SVEVEIGRlZmluaXRpb248L3NwYW4+PGJyPjwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlVwZGF0ZSBIQUxfSTJDX01hc3Rlcl9TZXF1ZW50aWFsX1RyYW5zbWl0X0lUKCkgZnVuY3Rpb24gKHdyb25nIHN0YXRlIGNoZWNrKTwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkFkZCBJMkNfRklSU1RfQU5EX05FWFRfRlJBTUUgb3B0aW9uIGZvciBJMkMgU2VxdWVudGlhbCBUcmFuc2Zlcjwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPk9uIHNsYXZlLCByZXNldCZuYnNwO0xJU1RFTl9UWCBzdGF0ZSBpbiBjYXNlIG9mIGRpcmVjdGlvbiBjaGFuZ2U8L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsgZm9udC1zaXplOiAxMnB0OyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iY29sb3I6IGJsYWNrOyI+UmVtb3ZlIEdDQyB3YXJuaW5nczwvc3Bhbj48YnI+PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgVElNPC9zcGFuPjwvc3Bhbj48L2xpPjwvdWw+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47IGNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJzsgZm9udC1zaXplOiBtZWRpdW07IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IHN0YXJ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC1zcGFjaW5nOiAwcHg7IG1hcmdpbi10b3A6IDBjbTsiIHR5cGU9InNxdWFyZSI+PHVsPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkFQSSB1cGRhdGUgOiBhZGQgb25lIGZpZWxkIChBdXRvUmVsb2FkUHJlbG9hZCkgaW4mbmJzcDtUSU1fQmFzZV9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUmbmJzcDtpbiBvcmRlciB0byBzZXQgQVJQRQorYml0IGZyb20mbmJzcDtUSU14X0NSMSByZWdpc3Rlcjwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPk5ldworQVBJIDogYWRkJm5ic3A7MiBtYWNyb3MgKF9fSEFMX1RJTV9FTkFCTEVfT0N4UFJFTE9BRCgpIGFuZCZuYnNwOworX19IQUxfVElNX0RJU0FCTEVfT0N4UFJFTE9BRCgpKSBpbiBvcmRlciB0byBzZXQgT0N4UEUgYml0Citmcm9tJm5ic3A7VElNeF9DQ01SMSwmbmJzcDtUSU14X0NDTVIyIGFuZCBUSU14X0NDTVIzIHJlZ2lzdGVyczwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlVzZSBNT0RJRllfUkVHIG1hY3JvIHRvIGF2b2lkIHdyb25nIGluaXRpYWxpc2F0aW9uIGluIENvbmZpZ0JyZWFrRGVhZFRpbWUoKTwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkFkZCBUSU0xIEVUUiByZW1hcCBlbnVtcyBmb3IgU1RNMzJGMzM0eHggZGV2aWNlczwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkhBTF9USU1FeF9SZW1hcENvbmZpZygpIHByb3RvdHlwZSBjaGFuZ2VkIGZvciBTVE0zMkYzMzR4OCBkZXZpY2U8YnI+PC9zcGFuPjwvbGk+PGxpIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7IGZvbnQtc2l6ZTogMTJwdDsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBjb2xvcjogYmxhY2s7Ij5SZW1vdmUKK1RJTV9DUjJfT0lTMk4sIFRJTV9DUjJfT0lTMywgVElNX0NSMl9PSVMzTiwgVElNX0NSMl9PSVM0IG1hbmFnbWVudCZuYnNwO2ZvciBTVE0zMkYzNzN4QyBhbmQgU1RNMzJGMzc4eHggZGV2aWNlczwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyBmb250LXNpemU6IDEycHQ7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTBwdDsiPkFQSSB1cGRhdGUgOiBBZGQgX19IQUxfVElNX01PRV9ESVNBQkxFX1VOQ09ORElUSU9OQUxMWSgpIGZ1bmN0aW9uIHRvIGRpc2FibGUmbmJzcDtNT0UgYml0IHdpdGhvdXQgY29uZGl0aW9uPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgU01CVVM8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjwvc3Bhbj48L2xpPjx1bD48bGkgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5SZW1vdmUgdXNlbGVzcyBYZmVyU2l6ZSBmaWVsZCBpbml0aWFsaXNhdGlvbiBpbiZuYnNwOyBIQUxfU01CVVNfU2xhdmVfVHJhbnNtaXRfSVQoKTwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+QWRkCitzdXBwb3J0IG9mIFpvbmUgcmVhZC93cml0ZSBmZWF0dXJlIHRoYW5rcyB0byBuZXcgWGZlck9wdGlvbnMgcGFyYW1ldGVyCit2YWx1ZXMgU01CVVNfT1RIRVJfRlJBTUVfTk9fUEVDLCBTTUJVU19PVEhFUl9GUkFNRV9XSVRIX1BFQywKK1NNQlVTX09USEVSX0FORF9MQVNUX0ZSQU1FX05PX1BFQyBhbmQKK1NNQlVTX09USEVSX0FORF9MQVNUX0ZSQU1FX1dJVEhfUEVDPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IGJvbGQ7IiBsYW5nPSJFTi1VUyI+SEFMCisgICAgIFBDRCZuYnNwOzwvc3Bhbj48L2xpPjx1bCBzdHlsZT0iY29sb3I6IHJlZDsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+VXBkYXRlZCBIQUwgRHJpdmVyIGNvbXBsaWFuY3kgd2l0aCA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5NSVNSQSBDIDIwMDQgcnVsZXMgOiAoMTAuMywgMTA1KSA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj48L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5NSVNSQSBDIDIwMDQgcnVsZSAxMC4zIChpbGxlZ2FsIGV4cGxpY2l0IGNvbnZlcnNpb24gZnJvbSB1bmRlcmx5aW5nIE1JU1JBIHR5cGUgInVuc2lnbmVkIGludCIgdG8gInVpbnQzMl90ICoiKS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPk1JU1JBIEMgMjAwNCBydWxlIDEwLjUgKGJpdHdpc2Ugb3BlcmF0b3JzIH4gYW5kICZsdDsmbHQ7KS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPk1JU1JBIEMgMjAwNCBydWxlIDEyLjcgKGJpdHdpc2Ugb3BlcmF0aW9ucyBub3QgcGVyZm9ybWVkIG9uIHNpZ25lZCBpbnRlZ2VyIHR5cGVzKS48L3NwYW4+PC9saT48L3VsPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFBXUjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48L3NwYW4+PC9saT48dWwgc3R5bGU9ImNvbG9yOiBibGFjazsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5SZW5hbWUgUFdSX0NSIHJlZ2lzdGVyIGRlZmluZXMgdG8gYmUgYWxpZ25lZCB3aXRoJm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5TVE0zMkYzeHggUmVmZXJlbmNlIE1hbnVhbCA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij46IFNEQURDeEVOID09Jmd0OyZuYnNwO0VOU0R4PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgUkNDPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjwvc3Bhbj48L2xpPjx1bCBzdHlsZT0iY29sb3I6IGJsYWNrOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlJlbmFtZSBSQ0NfQ0ZHUiByZWdpc3RlciBkZWZpbmVzIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPnRvIGJlIGFsaWduZWQgd2l0aCZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+U1RNMzJGM3h4IFJlZmVyZW5jZSBNYW51YWwgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+OiBTREFEQ1BSRSA9PSZndDsmbmJzcDtTRFBSRTwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBib2xkOyIgbGFuZz0iRU4tVVMiPkhBTCBDT1JURVggPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJjb2xvcjogYmxhY2s7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+VXBkYXRlIEhBTF9NUFVfRGlzYWJsZSgpIHRvIGNsZWFyIHRoZSB3aG9sZSBjb250cm9sIHJlZ2lzdGVyLiBBbHNvIHJlbW92ZSZuYnNwO1NUQVRJQyBJTkxJTkUgYW5kIG1vdmUgZnVuY3Rpb24mbmJzcDt0byBjIGZpbGU8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyBmb250LXdlaWdodDogYm9sZDsiIGxhbmc9IkVOLVVTIj5IQUwgQ0FOIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPjwvc3Bhbj48L2xpPjx1bCBzdHlsZT0iY29sb3I6IGJsYWNrOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkFkZCBfX0hBTF9VTkxPQ0soKSBjYWxsIHdoZW4gYWxsIG1haWxib3hlcyBhcmUgYnVzeTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5BZGQgX19IQUxfQ0FOX0NBTkNFTF9UUkFOU01JVCgpIGNhbGwgdG8gYWJvcnQgdHJhbnNtaXNzaW9uIHdoZW4gdGltZW91dCBpcyByZWFjaGVkPGJyPjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBib2xkOyIgbGFuZz0iRU4tVVMiPkhBTCBBREMgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJjb2xvcjogYmxhY2s7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+QWRkIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDJfQ0MxIGFuZCBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX1QyX1RSR08gZGVmaW5pdGlvbnM8L3NwYW4+PC9saT48L3VsPjwvdWw+Cis8c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjwvc3Bhbj48cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwY20gNC41cHQgMThwdDsiPjxiIHN0eWxlPSIiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBjb2xvcjogYmxhY2s7Ij5MTCBEcml2ZXJzIGNoYW5nZXM8L3NwYW4+PC91PjwvYj48L3A+PHVsIHN0eWxlPSJtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkxMIENPTVA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJjb2xvcjogcmdiKDUxLCAxMDIsIDI1NSk7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5DcmVhdGlvbiBvZiBnZW5lcmljIGRlZmluZXMgZm9yIGRlZmluZXMgc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZXM8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5Nb2RpZnkgZGVmaW5pdGlvbiBvZiBMTF9DT01QX09VVFBVVF9USU00X0lDMl9DT01QNCwgTExfQ09NUF9PVVRQVVRfVElNNF9JQzNfQ09NUDUgYW5kIExMX0NPTVBfT1VUUFVUX1RJTTRfSUM0X0NPTVA2IGxpdGVyYWxzPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJjb2xvcjogYmxhY2s7Ij5SZW5hbWUKK0xMX0NPTVBfT1VUUFVUX1RJTTFfSUM0X0NPTVAyIGFuZCBMTF9DT01QX09VVFBVVF9USU0xX0lDNF9DT01QMV8yIGluCitMTF9DT01QX09VVFBVVF9USU0yX0lDNF9DT01QMiBhbmQgTExfQ09NUF9PVVRQVVRfVElNMl9JQzRfQ09NUDFfMjwvc3Bhbj48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImNvbG9yOiBibGFjazsiPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7IGNvbG9yOiBibGFjazsiPkNvcnJlY3QgQ09NUCBpbnB1dHMmbmJzcDtkZWZpbml0aW9uPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImNvbG9yOiBibGFjazsiPjwvc3Bhbj48YnI+PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5MTCBFWFRJPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjwvc3Bhbj48L2xpPjx1bCBzdHlsZT0iY29sb3I6IHJnYig1MSwgMTAyLCAyNTUpOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyI+TW92ZQorTExfRVhUSV9MSU5FXzE4LCBMTF9FWFRJX0xJTkVfMzMsIExMX0VYVElfTElORV8zNCwgTExfRVhUSV9MSU5FXzM1LAorTExfRVhUSV9MSU5FXzM2LCBMTF9FWFRJX0xJTkVfMzcsIExMX0VYVElfTElORV8zOCBhbmQgTExfRVhUSV9MSU5FXzM5CitkZWZpbmVzIHVuZGVyIGNvbXBpbGF0aW9uIHN3aXRjaCAoPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiBibGFjazsiPmF2YWlsYWJpbGl0eSBkZXBlbmRzIG9uIGRldmljZXMpPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5MTCBQV1I8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJjb2xvcjogYmxhY2s7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+UmVuYW1lIFBXUl9DUiByZWdpc3RlciBkZWZpbmVzIHRvIGJlIGFsaWduZWQgd2l0aCZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+U1RNMzJGM3h4IFJlZmVyZW5jZSBNYW51YWwgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+OiBTREFEQ3hFTiA9PSZndDsmbmJzcDtFTlNEeDwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+TEwgUkNDPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjwvc3Bhbj48L2xpPjx1bCBzdHlsZT0iY29sb3I6IGJsYWNrOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlJlbmFtZSBSQ0NfQ0ZHUiByZWdpc3RlciBkZWZpbmVzJm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+dG8gYmUgYWxpZ25lZCB3aXRoJm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5TVE0zMkYzeHggUmVmZXJlbmNlIE1hbnVhbDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPiA6IFNEQURDUFJFID09Jmd0OyZuYnNwO1NEUFJFPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5MTCBTWVNURU08L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJjb2xvcjogcmdiKDUxLCAxMDIsIDI1NSk7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5BZGQgTExfU1lTQ0ZHX0VuYWJsZUlUX0ZQVV94eHggZnVuY3Rpb25zPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJjb2xvcjogYmxhY2s7Ij5SZXBsYWNlCitMTF9TWVNDRkdfVElNMThfUk1QX0RNQTJfQ0g0IGFuZCBMTF9TWVNDRkdfVElNMThfUk1QX0RNQTFfQ0g0IGJ5CitMTF9TWVNDRkdfVElNMThfUk1QX0RNQTJfQ0g1IGFuZCBMTF9TWVNDRkdfVElNMThfUk1QX0RNQTFfQ0g1PC9zcGFuPjxicj48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkxMIEdQSU88L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJjb2xvcjogYmxhY2s7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+UmVtb3ZlIExMX0dQSU9fU1BFRURfRlJFUV9WRVJZX0hJR0ggKEdQSU9fU1BFRURfRlJFUV9WRVJZX0hJR0ggZG9lcyBub3QgZXhpc3QgZm9yIFNUTTMyRjN4eCBzZXJpZSk8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkxMX1RJTTwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+UmVuYW1lCitMTF9USU1fVElNMTZfVEkxX1JNUCBkZWZpbmVzIDogTExfVElNX1RJTTE2X1RJMV9STVBfR1BJTywKK0xMX1RJTV9USU0xNl9USTFfUk1QX1JUQywgTExfVElNX1RJTTE2X1RJMV9STVBfSFNFXzMyLAorTExfVElNX1RJTTE2X1RJMV9STVBfTUNPPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBjb2xvcjogYmxhY2s7Ij5SZW1vdmUKK1RJTV9DUjJfT0lTMk4sIFRJTV9DUjJfT0lTMywgVElNX0NSMl9PSVMzTiwgVElNX0NSMl9PSVM0IG1hbmFnbWVudCZuYnNwO2ZvciBTVE0zMkYzNzN4QyBhbmQgU1RNMzJGMzc4eHggZGV2aWNlczwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogcmdiKDUxLCAxMDIsIDI1NSk7Ij48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPk1vdmUKK0xMX1RJTV9PQ1JFRl9DTFJfSU5UX09DUkVGX0NMUiBhbmQgTExfVElNX09DUkVGX0NMUl9JTlRfRVRSCitkZWZpbmVzIHVuZGVyIGNvbXBpbGF0aW9uIHN3aXRjaCAoPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiBibGFjazsiPmF2YWlsYWJpbGl0eSBkZXBlbmRzIG9uIGRldmljZXMpPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+TmV3IEFQSXMgdG8gaW5zdXJlIEJEVFIgcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gaW4gYSBzaW5nbGUgd3JpdGUgb3BlcmF0aW9uJm5ic3A7PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJjb2xvcjogYmxhY2s7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+TExfVElNX0JEVFJfU3RydWN0SW5pdCgpPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTBwdDsiPkxMX1RJTV9CRFRSX0luaXQoKTwvc3Bhbj48L2xpPjwvdWw+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5MTCBVU0FSVDwvc3Bhbj48L3NwYW4+PC9saT48dWwgc3R5bGU9ImNvbG9yOiBibGFjazsiPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5SZXBsYWNlIFBPU0lUSU9OX1ZBTCh4eHgpIG1hY3JvIGJ5IGNvcnJlc3BvbmRpbmcgQ01TSVNfUG9zIGRlZmluaXRpb25zPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5MTCBIUlRJTTwvc3Bhbj48L3NwYW4+PC9saT48dWwgc3R5bGU9ImNvbG9yOiBibGFjazsiPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5SZXBsYWNlIFBPU0lUSU9OX1ZBTCh4eHgpIG1hY3JvIGJ5IGNvcnJlc3BvbmRpbmcgQ01TSVNfUG9zIGRlZmluaXRpb25zPC9zcGFuPjwvbGk+PGxpIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBmb250LXNpemU6IDEycHQ7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTBwdDsiPkFkZCBzaGlmdCBvcGVyYXRpb24gaW4gSFJUSU1fVElNX1NldENvbXBhcmVNb2RlKCk8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkxMX0kyQzwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+UmVwbGFjZSBQT1NJVElPTl9WQUwoeHh4KSBtYWNybyBieSBjb3JyZXNwb25kaW5nIENNU0lTX1BvcyBkZWZpbml0aW9uczwvc3Bhbj48L2xpPjwvdWw+PC91bD48YnI+PGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IGluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAyMDBweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuMy4wCisvIDAxLUp1bHktMjAxNjwvc3Bhbj48L2gzPgorPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGNtIDQuNXB0IDE4cHQ7Ij48YiBzdHlsZT0iIj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyI+TWFpbgorQ2hhbmdlczwvc3Bhbj48L3U+PC9iPjwvcD48dWwgc3R5bGU9Im1hcmdpbi10b3A6IDBjbTsgbGlzdC1zdHlsZS10eXBlOiBzcXVhcmU7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkZpcnN0IG9mZmljaWFsIHJlbGVhc2Ugc3VwcG9ydGluZyB0aGUgTG93IExldmVsIGRyaXZlcnMgZm9yIHRoZSBTVE0zMkYzeHggc2VyaWU6PC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkxvdyBMYXllciBkcml2ZXJzIEFQSXMgcHJvdmlkZSByZWdpc3RlciBsZXZlbCBwcm9ncmFtbWluZzo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+PC9zcGFuPjxicj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+dGhleSByZXF1aXJlIGRlZXAga25vd2xlZGdlIG9mIHBlcmlwaGVyYWxzIGRlc2NyaWJlZCBpbiBTVE0zMkYzeHggUmVmZXJlbmNlIE1hbnVhbC48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkxvdyBMYXllciBkcml2ZXJzIGFyZSBhdmFpbGFibGUgZm9yPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPiBBREMsIENPTVAsIENvcnRleCwgQ1JDLCZuYnNwO0RBQywgRE1BLCBFWFRJLCZuYnNwO0dQSU8sIEhSVElNLCBJMkMsIElXREcsIE9QQU1QLCBQV1IsPGJyPlJDQywmbmJzcDtSVEMsIFNQSSwmbmJzcDtUSU0sIFVTQVJUIGFuZCBXV0RHIHBlcmlwaGVyYWxzPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij4gYW5kIGFkZGl0aW9uYWwgTG93IExldmVsIEJ1cywgU3lzdGVtIGFuZCBVdGlsaXRpZXMgQVBJcy48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkxvdworTGF5ZXIgZHJpdmVycyBBUElzIGFyZSBpbXBsZW1lbnRlZCBhcyBzdGF0aWMgaW5saW5lIGZ1bmN0aW9uIGluIG5ldworSW5jL3N0bTMyZjN4eF9sbF9wcHAuaCBmaWxlcyBmb3IgUFBQIHBlcmlwaGVyYWxzLCB0aGVyZSBpcyBubworY29uZmlndXJhdGlvbiBmaWxlIGFuZCBlYWNoIHN0bTMyZjN4eF9sbF9wcHAuaCBmaWxlIG11c3QgYmUgaW5jbHVkZWQgaW4KK3VzZXIgY29kZS48L3NwYW4+PC9saT48L3VsPjwvdWw+PHVsIHN0eWxlPSJtYXJnaW4tdG9wOiAwY207IGxpc3Qtc3R5bGUtdHlwZTogc3F1YXJlOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5NYWludGVuYW5jZSByZWxlYXNlIHRvIGZpeCBrbm93biBkZWZlY3RzIGFuZCBlbmhhbmNlbWVudHMgaW1wbGVtZW50YXRpb24uPGJyPjwvc3Bhbj48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBnZW5lcmljPC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlVwZGF0ZWQuPC9zcGFuPjwvbGk+PC91bD48L3VsPjx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMGNtOyBsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkhBTCBBREM8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+VXBkYXRlZAorYXNzZXJ0X3BhcmFtIHdpdGhpbiBIQUxfQURDRXhfTXVsdGlNb2RlQ29uZmlnQ2hhbm5lbCgpIGZ1bmN0aW9uIHRvCithdm9pZCBpc3N1ZSBkdXJpbmcgQURDIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGZyb20gbXVsdGltb2RlIHRvCitpbmRlcGVuZGVudCBtb2RlLjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyBmb250LXdlaWdodDogYm9sZDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+SEFMIENSQzwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VcGRhdGVkIEhBTF9DUkNfRGVJbml0KCkgZnVuY3Rpb24gKHJlc3RvcmVkIElEUiBSZWdpc3RlciB0byBSZXNldCB2YWx1ZSkuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5IQUwgR1BJTzwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5VcGRhdGVkIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPmRlZmluaXRpb24gb2YgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+SVNfR1BJT19QSU4gcHJpdmF0ZSBtYWNybyZuYnNwO3RvIGNvdmVyIGZ1bGwgdTMyIGJpdHM8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj4uPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5IQUwgSFJUSU08L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+VXBkYXRlZCBIQUwgSFJUSU0gRHJpdmVyIGNvbXBsaWFuY3kgd2l0aCA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5NSVNSQSBDIDIwMDQgcnVsZXM8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj46PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+PC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPk1JU1JBIEMgMjAwNCBydWxlIDEyLjUgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+KG9wZXJhbmRzIG9mIGEgbG9naWNhbCAmYW1wOyZhbXA7IG9yIHx8IHNoYWxsIGJlIHByaW1hcnktZXhwcmVzc2lvbnMpLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPk1JU1JBIEMgMjAwNCBydWxlIDE1LjMgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+KGZpbmFsIGNsYXVzZSBvZiBhIHN3aXRjaCBzdGF0ZW1lbnQgc2hhbGwgYmUgdGhlIGRlZmF1bHQgY2xhdXNlKS48L3NwYW4+PC9saT48L3VsPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyBmb250LXdlaWdodDogYm9sZDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+SEFMIEkyQzwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5VcGRhdGVkIEkyQyBkcml2ZXIgZG9jdW1lbnRhdGlvbiBjb25jZXJuaW5nIEkyQyBhZGRyZXNzIG1hbmFnZW1lbnQ8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj4uPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5IQUwgSVdERzwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5OZXcgc2ltcGxpZmllZCBIQUwgSVdERyBkcml2ZXI6IHI8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgY29sb3I6IGJsYWNrOyI+ZW1vdmVkIEhBTF9JV0RHX1N0YXJ0KCksJm5ic3A7SEFMX0lXREdfTXNwSW5pdCgpIGFuZCZuYnNwO0hBTF9JV0RHX0dldFN0YXRlKCkmbmJzcDtBUElzLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlRoZSBBUEkgZnVuY3Rpb25zIGFyZTombmJzcDs8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkhBTF9JV0RHX0luaXQoKTombmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgY29sb3I6IGJsYWNrOyI+dGhpcyBmdW5jdGlvbiBpbnN1cmVzIHRoZSBjb25maWd1cmF0aW9uIGFuZCB0aGUgc3RhcnQgb2YgdGhlIElXREcgY291bnRlci48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5IQUxfSVdER19SZWZyZXNoKCk6Jm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGNvbG9yOiBibGFjazsiPnRoaXMgZnVuY3Rpb24gaW5zdXJlcyB0aGUgcmVsb2FkIG9mIHRoZSBJV0RHIGNvdW50ZXIuPC9zcGFuPjwvbGk+PC91bD48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkhBTCBQV1I8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWxpZ25lZCBQb3dlciBXYWtlLVVwIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPnBpbnM8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij4gPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+RVdVUHggZGVmaW5pdGlvbnMgb24gQ01TSVMgZGVmaW5pdGlvbnMuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5IQUwgUlRDPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlVwZGF0ZWQgSEFMX1JUQ0V4X1NldFdha2VVcFRpbWVyX0lUKCkgZnVuY3Rpb24gYnkgYWRkaW5nIGNsZWFyIG9mIFdha2UtVXAgZmxhZyBiZWZvcmUgZW5hYmxpbmcgdGhlIGludGVycnVwdC48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkhBTCBTTUJVUzwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5VcGRhdGVkIFNNQlVTIGRyaXZlciBkb2N1bWVudGF0aW9uIGNvbmNlcm5pbmcgU01CVVMgYWRkcmVzcyBtYW5hZ2VtZW50PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+Ljwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyBmb250LXdlaWdodDogYm9sZDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+SEFMIFNEQURDPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlVwZGF0ZWQgSEFMIFNEQURDIERyaXZlciBjb21wbGlhbmN5IHdpdGggPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+TUlTUkEgQyAyMDA0IHJ1bGVzPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+Ojwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5NSVNSQSBDIDIwMDQgcnVsZSAxMC4zIChpbGxlZ2FsIGV4cGxpY2l0IGNvbnZlcnNpb24gZnJvbSB0eXBlICJ1bnNpZ25lZCBpbnQiIHRvICJ1aW50MTZfdCAqKTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPi48L3NwYW4+PC9saT48L3VsPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyBmb250LXdlaWdodDogYm9sZDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+SEFMIFNQSTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5VcGRhdGVkJm5ic3A7X19TUElfSGFuZGxlVHlwZURlZiZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPmRlZmluaXRpb24gYnkgdXNpbmcgX19JTyB1aW50MTZfdCB0eXBlIGZvciBUeFhmZXJDb3VudCBhbmQgUnhYZmVyQ291bnQuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiB3aW5kb3d0ZXh0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VcGRhdGVkCitTUElfMmxpbmVzVHhJU1JfOEJJVCgpIGFuZCBTUElfMmxpbmVzVHhJU1JfMTZCSVQoKSBmdW5jdGlvbnM6IGFkZGVkCityZXR1cm4gc28gdGhhdCBTUElfMmxpbmVzVHhJU1JfOEJJVENSQygpIG9yIFNQSV8ybGluZXNUeElTUl8xNkJJVENSQygpCitmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZV9JVCgpPGJyPndoZW4gQ1JDIGlzIGFjdGl2YXRlZC48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5VcGRhdGVkIFNQSTwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj4gRHJpdmVyIGNvbXBsaWFuY3kgd2l0aDxzcGFuIGNsYXNzPSJBcHBsZS1jb252ZXJ0ZWQtc3BhY2UiPiZuYnNwOzwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+TUlTUkEgQyAyMDA0IHJ1bGUgNS4yIChpZGVudGlmaWVycyBpbiBhbiBpbm5lciBzY29wZSBzaGFsbCBub3Q8YnI+dXNlIHRoZSBzYW1lIG5hbWUgYXMgYW4gaWRlbnRpZmllciBpbiBhbiBvdXRlciBzY29wZSk8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj4uPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5IQUwgV1dERzwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5OZXcgc2ltcGxpZmllZCBIQUwgV1dERyBkcml2ZXI6IHJlbW92ZWQgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGNvbG9yOiBibGFjazsiPkhBTF9XV0RHX1N0YXJ0KCksJm5ic3A7SEFMX1dXREdfU3RhcnRfSVQoKSwmbmJzcDtIQUxfV1dER19Nc3BEZUluaXQoKSBhbmQmbmJzcDtIQUxfV1dER19HZXRTdGF0ZSgpIEFQSXMuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+VXBkYXRlZCA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgY29sb3I6IGJsYWNrOyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDExcHQ7IGZvbnQtZmFtaWx5OiBDYWxpYnJpLHNhbnMtc2VyaWY7IGNvbG9yOiBibGFjazsiPkhBTF9XV0RHX1JlZnJlc2g8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij4oKSBBUEkgdG8gcmVtb3ZlIGNvdW50ZXIgcGFyYW1ldGVyLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPk5ldyBmaWVsZCBFV0lNb2RlIGluIFdXREdfSW5pdFR5cGVEZWYgdG8gc3BlY2lmeSBuZWVkIGZvciBFYXJseSBXYWtldXAgSW50ZXJydXB0Ljwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlRoZQorQVBJIGZ1bmN0aW9ucyBhcmU6IEhBTF9XV0RHX0luaXQoKSwgSEFMX1dXREdfTXNwSW5pdCgpLAorSEFMX1dXREdfUmVmcmVzaCgpLCBIQUxfV1dER19JUlFIYW5kbGVyKCkgYW5kCitIQUxfV1dER19FYXJseVdha2V1cENhbGxiYWNrKCkuPC9zcGFuPjwvbGk+PC91bD48L3VsPjxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiBpbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMjAwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjIuMQorLyAyOS1BcHJpbC0yMDE2PC9zcGFuPjwvaDM+Cis8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwY20gNC41cHQgMThwdDsiPjxiIHN0eWxlPSIiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBjb2xvcjogYmxhY2s7Ij5NYWluCitDaGFuZ2VzPC9zcGFuPjwvdT48L2I+PC9wPjx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMGNtOyBsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+TWFpbnRlbmFuY2UgcmVsZWFzZSB0byBmaXgga25vd24gZGVmZWN0cyBhbmQgZW5oYW5jZW1lbnRzIGltcGxlbWVudGF0aW9uLjxicj48L3NwYW4+PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgZ2VuZXJpYzwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5VcGRhdGVkIEhBTCBEcml2ZXIgY29tcGxpYW5jeSB3aXRoIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPk1JU1JBIEMgMjAwNCBydWxlczwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPjo8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5NSVNSQSBDIDIwMDQgcnVsZSAxMC42ICgnVScgc3VmZml4IGFwcGxpZWQgdG8gYWxsIGNvbnN0YW50cyBvZiAndW5zaWduZWQnIHR5cGUpLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+TUlTUkEgQyAyMDA0IHJ1bGUgMTAuNSAoYml0d2lzZSBvcGVyYXRvcnMgfiBhbmQgJmx0OyZsdDspLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+TUlTUkEgQyAyMDA0IHJ1bGUgMTIuNiA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj4ob3BlcmFuZHMgb2YgbG9naWNhbCBvcGVyYXRvcnMgKCZhbXA7JmFtcDssIHx8IGFuZCAhKSBzaG91bGQgYmUgZWZmZWN0aXZlbHkgQm9vbGVhbikuPGJyPjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+TUlTUkEgQyAyMDA0IHJ1bGUgMTIuNyAoYml0d2lzZSBvcGVyYXRpb25zIG5vdCBwZXJmb3JtZWQgb24gc2lnbmVkIGludGVnZXIgdHlwZXMpLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+TUlTUkEgQyAyMDA0IHJ1bGUgMTQuMyA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj4oYSBudWxsIHN0YXRlbWVudCBzaGFsbCBvbmx5IG9jY3VyIG9uIGEgbGluZSBieSBpdHNlbGYpLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+TUlTUkEgQyAyMDA0IHJ1bGUgMTQuOCA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj4oc3RhdGVtZW50IGZvcm1pbmcgdGhlIGJvZHkgb2YgYSBzd2l0Y2gsIHdoaWxlLCBkbyCFIHdoaWxlIG9yIGZvciBzdGF0ZW1lbnQgc2hhbGwgYmUgYSBjb21wb3VuZCBzdGF0ZW1lbnQpLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+TUlTUkEgQyAyMDA0IHJ1bGUgMTUuMyA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj4oZmluYWwgY2xhdXNlIG9mIGEgc3dpdGNoIHN0YXRlbWVudCBzaGFsbCBiZSB0aGUgZGVmYXVsdCBjbGF1c2UpLjxicj48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPk1JU1JBIEMgMjAwNCBydWxlIDE2LjQgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+KGlkZW50aWZpZXJzIHVzZWQgaW4gdGhlIGRlY2xhcmF0aW9uIGFuZCBkZWZpbml0aW9uIG9mIGEgZnVuY3Rpb24gc2hhbGwgYmUgaWRlbnRpY2FsKS48YnI+PC9zcGFuPjwvbGk+PC91bD48L3VsPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlVwZGF0ZWQgSEFMIHdlYWsgZW1wdHkgY2FsbGJhY2tzIHRvIHByZXZlbnQgdW51c2VkIGFyZ3VtZW50IGNvbXBpbGF0aW9uIHdhcm5pbmdzLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+VXBkYXRlZCBzdG0zMmYzeHhfaGFsX2NvbmYuaCBmaWxlczo8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5TZXQgSFNFX1NUQVJUVVBfVElNRU9VVCB2YWx1ZSB0byAxMDBtcyBpbnN0ZWFkIG9mIDUwMDBtcy48L3NwYW4+PC9saT48L3VsPjwvdWw+PC91bD48dWwgc3R5bGU9Im1hcmdpbi10b3A6IDBjbTsgbGlzdC1zdHlsZS10eXBlOiBzcXVhcmU7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5IQUw8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+Q2hhbmdlZCB1d1RpY2sgdG8gZ2xvYmFsIHRvIGFsbG93IG92ZXJ3cml0ZSBvZiBIQUxfSW5jVGljaygpLjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyBmb250LXdlaWdodDogYm9sZDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+SEFMIENPTVA8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+QWRkZWQgZGVsYXkgaW4gQ09NUCBzdGFydHVwIHRpbWUgcmVxdWlyZWQgdG8gcmVhY2ggcHJvcGFnYXRpb24gZGVsYXkgc3BlY2lmaWNhdGlvbjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPi48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5BZGRlZCBtaXNzaW5nICZuYnNwO19fSEFMX1VOTE9DSywgX19IQUxfTE9DSyBpbiBIQUxfQ09NUF9TdGFydCgpLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPk1vZGlmaWVkIENPTVBfSU5WRVJUSU5HSU5QVVRfU0VMRUNUSU9OKCkgbWFjcm8gYXMgQ09NUCBpbnZlcnRpbmcgaW5wdXRzIHNlbGVjdGlvbiwgZGVwZW5kcyBvbiZuYnNwO0NPTVB4IGluc3RhbmNlLjxicj48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIERBQzwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VcGRhdGVkIERBQyBmdW5jdGlvbnMgYWZ0ZXIgREFDX0NSX0JPRkZ4L0RBQ19DUl9PVVRFTnggYml0IGRlZmluaXRpb24gdXBkYXRlcy48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkhBTCBETUE8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+QWRkZWQgX19IQUxfRE1BX0dFVF9DT1VOVEVSPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+KCkgbWFjcm8gcmV0dXJuaW5nIHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGRhdGEgdW5pdHMgaW4gdGhlIGN1cnJlbnQgRE1BIENoYW5uZWwgdHJhbnNmZXIuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+UHJvdmlkZWQKK25ldyBmdW5jdGlvbiBIQUxfRE1BX0Fib3J0X0lUKCkgdG8gYWJvcnQmbmJzcDtjdXJyZW50IERNQSB0cmFuc2ZlcgordW5kZXIgaW50ZXJydXB0IG1vZGUgd2l0aG91dCBwb2xsaW5nIGZvciBETUEgZW5hYmxlIGJpdC48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEdQSU88L3NwYW4+PC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWRkZWQgbWFjcm9zIHRvIG1hbmFnZSBGYXN0IE1vZGUgUGx1cyBvbiBHUElPcy48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEZNQzwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+UmVtb3ZlZCZuYnNwO3ByaXZhdGUgbWFjcm8gSVNfRk1DX1BBR0VTSVpFIG5vdCBzdXBwb3J0ZWQgYnkgU1RNMzJGM3h4IHNlcmllLjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgSTJDPC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkFsaWduZWQgSTJDIGRyaXZlciB3aXRoIG5ldyBzdGF0ZSBtYWNoaW5lIGRlZmluaXRpb24uPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5VcGRhdGVkIF9fSEFMX0kyQ19ESVNBQkxFX0lUIG1hY3JvLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlVzZWQgbWFjcm8gZGVmaW5pdGlvbiBmb3IgSTJDIGluc3RhbmNlcyBzdXBwb3J0aW5nIFdha2V1cCBmcm9tIFN0b3AgbW9kZTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPi48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5BZGRlZCBzdXBwb3J0IG9mIHJlcGVhdGVkIHN0YXJ0IGZlYXR1cmUgaW4gY2FzZSBvZiBtdWx0aW1hc3RlciBtb2RlIChhbGxvdyBtYXN0ZXIgdG8ga2VlcCBJMkMgY29tbXVuaWNhdGlvbiB3aXRoIHNsYXZlKS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VcGRhdGVkIFdhaXRPbkZsYWcgbWFuYWdlbWVudCAodGltZW91dCBtZWFzdXJlbWVudCBzaG91bGQgYmUgYWx3YXlzIGN1bXVsYXRpdmUpLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPk9wdGltaXplZCBIQUxfSTJDX1hYX0lSUUhhbmRsZXIoKSBmdW5jdGlvbnMgKHJlYWQgc3RhdHVzIHJlZ2lzdGVycyBvbmx5IG9uY2UpLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlJld29ya2VkIERNQSBlbmQgcHJvY2VzcyBhbmQgSTJDIGVycm9yIG1hbmFnZW1lbnQgZHVyaW5nIERNQSB0cmFuc2Zlci48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5Nb2RpZmllZCBIQUxfSTJDX01hc3Rlcl9UcmFuc21pdCB0byBoYW5kbGUgc2VuZGluZyBkYXRhIG9mIHNpemUgMC48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VcGRhdGVkCitETUEgQWJvcnQgbWFuYWdlbWVudDogdXNlZCBuZXcgSEFMX0RNQV9BYm9ydCgpIGZ1bmN0aW9uIGFuZCBjYWxsZWQKK0hBTF9JMkNfRXJyb3JDYWxsYmFjaygpIHdoZW4gZXJyb3JzIG9jY3VyIGR1cmluZyBETUEgdHJhbnNmZXIuPGJyPjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgSTJTPC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlJlbW92ZWQgc3VwcG9ydCBvZiBJMlMgZnVsbC1kdXBsZXggZmVhdHVyZSBvbiBTVE0zMkYzMDF4OCBkZXZpY2UuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBJUkRBPC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+UmV2aWV3ZWQgSVJEQSBzdGF0ZSBtYWNoaW5lIHRvIGF2b2lkIGNhc2VzIHdoZXJlIElSREEgc3RhdGUgaXMgb3ZlcndyaXR0ZW4gYnkgSVJEQSBJUlE8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij4uPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5Nb2RpZmllZCBFSUUgYml0IHNldHRpbmcgaW4gVHggYW5kIFJ4IHRyYW5zZmVycyAoSW50ZXJydXB0IG1vZGUpLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+TW9kaWZpZWQgSVJEQV9SZWNlaXZlX0lUKCkgdG8gZXhlY3V0ZSB0aGUgUlggZmx1c2ggcmVxdWVzdCBvbmx5IGluIGNhc2Ugbm8gZGF0YSBpcyByZWFkIGZyb20gUkRSLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGVkIElSREFfU2V0Q29uZmlnKCkgZnVuY3Rpb24gZm9sbG93aW5nIFVBUlQgQmF1ZHJhdGUgY2FsY3VsYXRpb24gdXBkYXRlLjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgRk1DPC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlVwZGF0ZWQgRk1DX05PUlNSQU1fSW5pdCgpIGZ1bmN0aW9uIChCdXJzdEFjY2Vzc01vZGUgZmllbGQgY29uZmlndXJhdGlvbikuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5BZGRlZCBGTUNfQkNSMV9DQ0xLRU4gaW4gdGhlIEJDUiByZWdpc3RlciBjbGVhciBtYXNrIHVzZWQgZm9yIEZNQ19OT1JTUkFNX0luaXQoKS48YnI+PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBPUEFNUDwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VcGRhdGVkIGRlZmluaXRpb25zIG9mJm5ic3A7T1BBTVAgTm9uIEludmVydGluZyBJbnB1dCBjb25zdGFudHMuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBSQ0M8L3NwYW4+PC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+UGVyZm9ybWVkIG9wdGltaXphdGlvbnMgZm9yIGludGVybmFsIG9zY2lsbGF0b3JzIGFuZCBQTEwgc3RhcnR1cCB0aW1lLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+UGVyZm9ybWVkIG9wdGltaXphdGlvbnMgZm9yIEhBTF9SQ0NfQ2xvY2tDb25maWcoKSwgSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZyBmdW5jdGlvbnMuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5Nb2RpZmllZCByZXNldCBvZiBCYWNrdXAgZG9tYWluIG9ubHkgaWYgdGhlIFJUQyBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uIGlzIG1vZGlmaWVkIGZyb20gcmVzZXQgdmFsdWUuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VcGRhdGVkIEhBTF9SQ0NfT3NjQ29uZmlnKCkgZnVuY3Rpb24gKFJlc2V0IEhTRU9OL0xTRU9OIGFuZCBIU0VCWVAvTFNFQllQIGJpdHMgYmVmb3JlIGNvbmZpZ3VyaW5nIHRoZSBIU0UvTFNFKS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkNvcnJlY3RlZCB1cGRhdGVzIG9mIFN5c3RlbUNvcmVDbG9jayB2YXJpYWJsZSB3aXRoaW4gdGhlIEhBTCBkcml2ZXJzLjxicj48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkNvcnJlY3RlZCBpbnZlcnRpb24gaW4gTFNFIGRyaXZlIGNhcGFiaWxpdHkgQml0IGRlZmluaXRpb24uPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5Nb2RpZmllZCBBSEJQcmVzY1RhYmxlIGFuZCBBUEJQcmVzY1RhYmxlIGluIEhBTC48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlJlbW92ZWQgUkNDX0NGR1JfUExMTk9ESVYgYml0IGRlZmluaXRpb24gZnJvbSBTVE0zMkYzNTh4eCwgU1RNMzJGMzAzeEMgYW5kIFNUTTMyRjMwMnhDIGRldmljZXMuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5SZW1vdmVkIFJDQ19DU1JfVlJFR1JTVEYgYml0IGRlZmluaXRpb24gaW4gUkNDX0NTUiByZWdpc3RlciBmb3IgU1RNMzJGMzAzeEMgYW5kIFNUTTMyRjMwM3hFIGRldmljZXMuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5SZW1vdmVkIFVTQVJUMiBhbmQgVVNBUlQzIGNsb2NrIHN3aXRjaCBpbiBSQ0NfQ0ZHUjMgcmVnaXN0ZXImbmJzcDtub3Qgc3VwcG9ydGVkIGJ5IFNUTTMyRjMwM3g4LCBTVE0zMkYzMzR4ODxicj5hbmQgU1RNMzJGMzI4eHggZGV2aWNlcyBhbmQgZm9yIFNUTTMyRjMwMXg4LCBTVE0zMkYzMDJ4OCBhbmQgU1RNMzJGMzE4eHggZGV2aWNlcy48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlJlbW92ZWQKK1JDQ19DU1JfVjE4UFdSUlNURiBiaXQgZGVmaW5pdGlvbiBpbiBSQ0NfQ1NSIHJlZ2lzdGVyIG5vdCBzdXBwb3J0ZWQgYnkKK1NUTTMyRjMxOHh4LCBTVE0zMkYzMjh4eCwgU1RNMzJGMzU4eHgsIFNUTTMyRjM3OHh4IGFuZCBTVE0zMkYzOTh4eAorZGV2aWNlcy48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlJlbW92ZWQgZmxhZyBSQ0NfRkxBR19STVYgd2hpY2ggaXMgd3JpdGUgb25seS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkFkZGVkIFJDQ19DRkdSX3h4eHhfQklUTlVNQkVSIGRlZmluaXRpb25zIGZvciBwb3J0YWJpbGl0eSBiZXR3ZWVuJm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+U1RNMzIgc2VyaWVzPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+Ljwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+VXBkYXRlZCBIQUxfUkNDX09zY0NvbmZpZygpIGZ1bmN0aW9uIHRvIGVuYWJsZSBQV1Igb25seSBpZiBuZWNlc3NhcnkgZm9yIExTRSBjb25maWd1cmF0aW9uLjxicj48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFJUQzwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+QWRkZWQgbWlzc2luZyBUYW1wZXIgZGVmaW5pdGlvbnMgKFJUQ19UQUZDUiByZWdpc3RlcikuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBTTUFSVENBUkQ8L3NwYW4+PC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5SZXZpZXdlZCBTTUFSVENBUkQgc3RhdGUgbWFjaGluZSB0byBhdm9pZCBjYXNlcyB3aGVyZSBTTUFSVENBUkQgc3RhdGUgaXMgb3ZlcndyaXR0ZW4gYnkgU01BUlRDQVJEIElSUTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPi48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+TW9kaWZpZWQgU01BUlRDQVJEX1JlY2VpdmVfSVQoKSB0byBleGVjdXRlIHRoZSBSWCBmbHVzaCByZXF1ZXN0IG9ubHkgaW4gY2FzZSBubyBkYXRhIGlzIHJlYWQgZnJvbSBSRFIuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5BZGRlZCBTTUFSVENBUkRfU1RPUEJJVFNfMF81IGRlZmluaXRpb24gdXNlZCBmb3Igc21hcnRjYXJkIG1vZGUuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZWQgU01BUlRDQVJEX1NldENvbmZpZygpIGZ1bmN0aW9uIGZvbGxvd2luZyBVQVJUIEJhdWRyYXRlIGNhbGN1bGF0aW9uIHVwZGF0ZS48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFNQSTwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZWQgSEFMX1NQSV9UcmFuc21pdFJlY2VpdmUoKSBmdW5jdGlvbiA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5pbiZuYnNwO3NsYXZlIG1vZGUgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij50byA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5yZWNlaXZlIGNvcnJlY3RseSB0aGUgQ1JDIHdoZW4gTlNTIHB1bHNlIGFjdGl2YXRlZC48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkFkZGVkIG1pc3NpbmcgX19JTyBpbiBTUElfSGFuZGxlVHlwZURlZiBkZWZpbml0aW9uLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+VXBkYXRlZCBJU19TUElfQ1JDX1BPTFlOT01JQUwgbWFjcm8gZGVmaW5pdGlvbiBhcyBwb2x5bm9taWFsIHZhbHVlIHNob3VsZCBiZSBvZGQgb25seS48YnI+PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBUSU08L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlVwZGF0ZWQgSEFMX1RJTV9Db25maWdPQ3JlZkNsZWFyKCkgZnVuY3Rpb24gdG8gbWFuYWdlIGNvcnJlY3RseSBUSU0gc3RhdGUgKEJVU1ksIFJFQURZKS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5Vc2VkIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPklTX1RJTV9IQUxMX0lOVEVSRkFDRV9JTlNUQU5DRSA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5tYWNybyBpbnN0ZWFkIG9mJm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+SVNfVElNX1hPUl9JTlNUQU5DRSA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5tYWNybyBpbjxicj5IQUxfVElNRXhfSGFsbFNlbnNvcl94eHgoKSBmdW5jdGlvbnMuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+VXBkYXRlZCBUSU1fU0xBVkVNT0RFIGNvbnN0YW50cyBkZWZpbml0aW9ucyB1c2luZyBDTVNJUyBiaXQgZGVmaW5pdGlvbnMuPGJyPjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgVFNDPC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlVwZGF0ZWQgSU8gZGVmYXVsdCBzdGF0ZSBtYW5hZ2VtZW50PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij4uPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBVQVJULVVTQVJUPC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlZCBVQVJUIEJhdWRyYXRlIGNhbGN1bGF0aW9uIChVQVJUX0RJVl9TQU1QTElORzgoKSBhbmQgVUFSVF9ESVZfU0FNUExJTkcxNigpIG1hY3JvcykuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZWQgVVNBUlRfU2V0Q29uZmlnKCkgZnVuY3Rpb24gZm9sbG93aW5nIFVBUlQgQmF1ZHJhdGUgY2FsY3VsYXRpb24gdXBkYXRlLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5SZXZpZXdlZCBVQVJUIHN0YXRlIG1hY2hpbmUgdG8gYXZvaWQgY2FzZXMgd2hlcmUgVUFSVCBzdGF0ZSBpcyBvdmVyd3JpdHRlbiBieSBVQVJUIElSUTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPi48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlJlbW92ZWQgVVNBUlQyIGFuZCBVU0FSVDMgY2xvY2sgc3dpdGNoLCBub3Qgc3VwcG9ydGVkIGJ5IFNUTTMyRjMwM3g4LCBTVE0zMkYzMzR4OCBhbmQgU1RNMzJGMzI4eHggZGV2aWNlczxicj5hbmQgZm9yIFNUTTMyRjMwMXg4LCBTVE0zMkYzMDJ4OCBhbmQgU1RNMzJGMzE4eHggZGV2aWNlcy48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPk1vZGlmaWVkIFVBUlRfUmVjZWl2ZV9JVCgpIHRvIGV4ZWN1dGUgdGhlIFJYIGZsdXNoIHJlcXVlc3Qgb25seSBpbiBjYXNlIG5vIGRhdGEgaXMgcmVhZCBmcm9tIFJEUi48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkNvcnJlY3RlZCBtYWNybyB1c2VkIGluIGFzc2VydF9wYXJhbSBvZiBIQUxfTElOX1NlbmRCcmVhaygpIGZ1bmN0aW9uLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+QWRkZWQmbmJzcDtVQVJUX1NUT1BCSVRTXzBfNS9VU0FSVF9TVE9QQklUU18wXzUgZGVmaW5pdGlvbnMgdXNlZCBmb3Igc3luY2hyb25vdXMgbW9kZS48YnI+PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTCZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+VVNCPC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+Q29ycmVjdGVkIGRvdWJsZSBidWZmZXIgaW1wbGVtZW50YXRpb24gaW4gUENEX1NFVF9FUF9EQlVGMV9DTlQoKSBtYWNyby48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFdXREc8L3NwYW4+PC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+QWxpZ25lZCBXV0RHIHJlZ2lzdGVycyBiaXRzIG5hbWluZyBiZXR3ZWVuIGFsbCBTVE0zMiBzZXJpZXMuPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+PC9zcGFuPjwvbGk+PC91bD48L3VsPjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBjbSA0LjVwdCAxOHB0OyI+PGI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij48L3NwYW4+PC9zcGFuPjwvYj48YiBzdHlsZT0iIj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyI+PG86cD48L286cD48L3NwYW4+PC91PjwvYj48L3A+CisKKyAgICAgICAgICAgIAorCisgICAgICAgICAgICA8aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDIwMHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS4yLjAKKy8gMTMtTm92ZW1iZXItMjAxNTxvOnA+PC9vOnA+PC9zcGFuPjwvaDM+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48L3NwYW4+PHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGNtIDQuNXB0IDE4cHQ7Ij48YiBzdHlsZT0iIj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyI+TWFpbgorQ2hhbmdlczwvc3Bhbj48L3U+PC9iPjwvcD4KKworCisKKzxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PC9zcGFuPjx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMGNtOyBsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+UGVyZm9ybWVkIEhBTCBBUEkgYWxpZ25tZW50IChtYWNyb3MvZnVuY3Rpb25zL2NvbnN0YW50cyByZW5hbWluZykuPGJyPjwvc3Bhbj48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBnZW5lcmljPC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlByb3ZpZGVkL3VwZGF0ZWQgVXNlciBNYW51YWwgQ0hNIGZpbGVzIGZvciBTVE0zMkYzMzR4OCwgU1RNMzJGMzczeEMsIFNUTTMyRjMwM3hDIGRldmljZXMuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5VcGRhdGVkIEhBTCBkcml2ZXJzIHRvIGVuc3VyZSBjb21wbGlhbmN5IHcvIEMrKy48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPk1hZGUgY29ycmVjdGlvbnMgZm9yIE1JU1JBIHJ1bGU6IGJpdHdpc2Ugb3BlcmF0b3JzIH4gYW5kICZsdDsmbHQ7IChNSVNSQSBDIDIwMDQgcnVsZSAxMC41KS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlVzZWQgQ01TSVMgbWFzayBkZWZpbml0aW9ucyBpbnN0ZWFkIG9mIGhhcmRjb2RlZCB2YWx1ZXMuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5SZW1vdmVkIGFsbCB0aGUgdW51c2VkIEZMQUcgYW5kIElUIGFzc2VydCBtYWNyb3MuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5Jbml0aWFsaXplZCBIYW5kbGUgbG9jayB0byBIQUxfVU5MT0NLRUQgaW4gSEFMX1BQUF9Jbml0KCkgd2hlbiBzdGF0ZSA9PSBIQUxfUFBQX1NUQVRFX1JFU0VULjxicj48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlVwZGF0ZWQgc3RtMzJmM3h4X2hhbF9tc3AuYyBmaWxlczo8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5SZW1vdmVkIHJlZmVyZW5jZSB0byBNaWNyb1hwbG9yZXIuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlVwZGF0ZWQgc3RtMzJmM3h4X2hhbF9jb25mLmggZmlsZXM6PC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWRkZWQgTFNFX1NUQVJUVVBfVElNRU9VVCBkZWZpbml0aW9uLjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5VcGRhdGVkIHN0bTMyZjN4eF9oYWxfZGVmLmggZmlsZTo8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5BZGRlZCBzb21lIGdlbmVyaWMgZGVmaW5lcyAoX19OT0lOTElORSkuPC9zcGFuPjwvbGk+PC91bD48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5SZW1vdmVkIE5VTEwgcmVkZWZpbml0aW9uLjxicj48YnI+PC9zcGFuPjwvbGk+PC91bD48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEFEQzwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5VcGRhdGVkIEhBTCBBREMgc3RhdGUgbWFjaGluZSB1cGRhdGVkLiBTdGF0ZXMgY2hhbmdlZCBmcm9tIGZpeGVkIGxpdGVyYWxzIHRvIGJpdGZpZWxkcy48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkFkZGVkCiszIG5ldyBIQUwgQURDIGZ1bmN0aW9uczogSEFMX0FEQ0V4X1JlZ3VsYXJTdG9wKCksCitIQUxfQURDRXhfUmVndWxhclN0b3BfSVQoKSwgSEFMX0FEQ0V4X1JlZ3VsYXJTdG9wX0RNQSgpLCZuYnNwO3RvCitwZXJmb3JtIGEgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBzdG9wPGJyPndoaWxlIEFEQyBncm91cCBpbmplY3RlZCBjYW4gcmVtYWluIHdpdGggY29udmVyc2lvbiBvbiBnb2luZy48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkFkZGVkIDIgbmV3IEhBTCBBREMgZnVuY3Rpb25zOiBIQUxfQURDRXhfTGV2ZWxPdXRPZldpbmRvdzJDYWxsYmFjaygpLCBIQUxfQURDRXhfTGV2ZWxPdXRPZldpbmRvdzNDYWxsYmFjaygpLjxicj5UaGUKKzMgYW5hbG9nIHdhdGNoZG9nIGhhcyBpdHMgb3duIGNhbGxiYWNrIGZ1bmN0aW9uIChBV0QxIGNhbGxiYWNrIGZ1bmN0aW9uCitpcyZuYnNwO3VuY2hhbmdlZCZuYnNwO3dpdGgmbmJzcDtIQUxfQURDX0xldmVsT3V0T2ZXaW5kb3dDYWxsYmFjaygpKS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlVwZGF0ZWQgQURDIG11bHRpbW9kZSAoZm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQyBpbnN0YW5jZXMpLjxicj5Ob3cKK3Rha2VzIGludG8gYWNjb3VudCBtaXhlZCBjb25maWd1cmF0aW9uOiBBREMgZ3JvdXAgcmVndWxhciBpbiBtdWx0aW1vZGUsCitBREMgZ3JvdXAgaW5qZWN0ZWQgaW4gaW5kZXBlbmRlbnQgbW9kZSAoYW5kIHRoZSBvcHBvc2l0ZSkuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5VcGRhdGVkIEFEQyBncm91cCBpbmplY3RlZCB1c2UgY2FzZSB3aGVuIHVzZWQgd2l0aCBmZWF0dXJlIGxvdyBwb3dlciAiYXV0by13YWl0Ijo8YnI+dXBkYXRlZCBmdW5jdGlvbiBIQUxfQURDRXhfSW5qZWN0ZWRHZXRWYWx1ZSgpIHdoaWNoIGRvbpJ0IGNsZWFyIGFueW1vcmUgQURDIGZsYWcgRU9TLDxicj5hbmQgY291bGQgY2F1c2Ugc29tZSBpc3N1ZXMgd2hlbiB1c2luZyBBREMgZ3JvdXAgaW5qZWN0ZWQgd2l0aCBoaWdoIHNhbXBsaW5nIHJhdGUuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBDQU48L3NwYW4+PC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWRkZWQgX19IQUxfVU5MT0NLKGhjYW4pIG1hY3JvLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+TW9kaWZpZWQgQ2FuVHhNc2dUeXBlRGVmL0NhblJ4TXNnVHlwZURlZiBzdHJ1Y3R1cmVzIERhdGEgZmllbGQuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5SZW1vdmVkIGFzc2VydF9wYXJhbShJU19DQU5fQkFOS05VTUJFUihzRmlsdGVyQ29uZmlnLSZndDtCYW5rTnVtYmVyKSkgZnJvbSBIQUxfQ0FOX0NvbmZpZ0ZpbHRlcigpLjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgQ0VDPC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkNoYW5nZWQgdGhlIEhBTF9DRUNfRXJyb3JUeXBlRGVmIHN0cnVjdHVyZSBieSBzZXBhcmF0ZSBkZWZpbmVzLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWRkZWQgQ0VDIEZsYWdzIERlZmluaXRpb25zKENFQ19GTEFHX1RYQUNLRSyFKS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkFkZCBDRUMgSW50ZXJydXB0cyBEZWZpbml0aW9ucyhDRUNfSVRfVFhBQ0tFLIUpLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+UmVuYW1lZCBDRUNfSVNSX1hYWCB0byBDRUNfRkxBR19YWFguPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5SZW5hbWVkIENFQ19JRVJfWFhYIHRvIENFQ19JVF9YWFguPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5BZGRlZCBtaXNzaW5nIGFzc2VydF9wYXJhbShJU19DRUNfQUxMX0lOU1RBTkNFKGhjZWMtJmd0O0luc3RhbmNlKSk7IGluIEluIEhBTF9DRUNfSW5pdCgpLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWRkZWQgZGV2aWNlcyB0aGF0IHN1cHBvcnRzIENFQyBpbiBkZXZpY2UuaCBmaWxlcy48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlVwZGF0ZWQgQ0VDIFJlYWR5IFRvIFJlY2VpdmUgU3RhdGUgaW4gQ0VDX1RyYW5zbWl0X0lUKCkuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5BZGRlZCBuZXcgQVBJIEhBTF9DRUNfR2V0UmVjZWl2ZWRGcmFtZVNpemUgdG8gZ2V0IHNpemUgb2YgdGhlIHJlY2VpdmVkIGZyYW1lLjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgQ09NUDwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5VcGRhdGVkIENPTVBFeF9PdXRwdXQgY29tbWVudCBkZXNjcmlwdGlvbiBhbmQgYWRkZWQgdGVzdCBvbiBpbnN0YW5jZXMuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5VcGRhdGVkIEhBTF9DT01QX0RlSW5pdCgpIHRvIGhhbmRsZSBMT0NLRUQgc3RhdGUuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5BZGRlZCBtaXNzaW5nIGRlZmluZXMgZm9yIENPTVAgd2luZG93IG1vZGUgKFN1bmZpc2gpLjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgQ09SVEVYPC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlJlbW92ZWQgX19IQUxfQ09SVEVYX1NZU1RJQ0tDTEtfQ09ORklHIG1hY3JvLCByZXBsYWNlZCBieSBIQUxfU1lTVElDS19DTEtTb3VyY2VDb25maWcoKSBmdW5jdGlvbi48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkFkZGVkIG5ldyBDT1JURVggTVBVIEFQSXM6IEhBTF9NUFVfQ29uZmlnUmVnaW9uKCksIEhBTF9NUFVfRGlzYWJsZSgpLEhBTF9NUFVfRW5hYmxlKCkuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5BZGRlZCBBUElzIHRvIG1hbmFnZSBzZXQvcmVzZXQgb2YgU0xFRVBPTkVYSVQgYW5kIFNFVk9OUEVORCBiaXRzIGluIFNDUiByZWdpc3Rlci48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkFkZGVkIGEgY2hlY2sgb24gbmVnYXRpdmUgcGFyYW1ldGVyIHZhbHVlcyBmb3IgSEFMX05WSUNfRGlzYWJsZUlSUSgpL0hBTF9OVklDX0VuYWJsZUlSUSgpIGZ1bmN0aW9ucy48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIENSQzwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5VcGRhdGVkIENSQyBBUElzIGNvbW1lbnRzLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+Rml4ZWQgTUlTUkEgQyAyMDA0IHdhcm5pbmdzIChleGNlcHQgMTE0LCAxMi40IGFuZCAxNC43KS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlVwZGF0ZWQgX19IQUxfQ1JDX1NFVF9JRFIgbWFjcm8uPGJyPjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgREFDPC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlVwZGF0ZSBIQUxfREFDRXhfTm9pc2VXYXZlR2VuZXJhdGUoKSBhbmQgSEFMX0RBQ0V4X1RyaWFuZ2xlV2F2ZUdlbmVyYXRlKCk8YnI+dG8gcmVzZXQgREFDIENSIHJlZ2lzdGVyIGJlZm9yZSBzZXR0aW5nIHRoZSBuZXcgREFDIGNvbmZpZy48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkFkZGVkIERBQ19PVVRQVVRTV0lUQ0hfRU5BQkxFIGNvbnN0YW50Ljxicj48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIERNQTwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5SZXZpZXdlZCBIQUxfRE1BX1BvbGxGb3JUcmFuc2ZlcigpLiBBZGRlZCBlcnJvciBjb2RlLjxicj48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEZMQVNIL0ZNQzwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5BZGRlZCBGTEFTSCBBUEkgSEFMX0ZMQVNIRXhfT0JHZXRVc2VyRGF0YSgpIHRvIGdldCB0aGUgdmFsdWUgc2F2ZWQgaW4gVXNlciBkYXRhIG9wdGlvbiBieXRlLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWxpZ25lZCBSZXR1cm4gdmFsdWUgb2YgSEFMX0ZMQVNIX0VuZE9mT3BlcmF0aW9uQ2FsbGJhY2sgZnVuY3Rpb24gKDB4RkZGRkZGRikgd2hlbiBwcm9jZXNzIGlzIGZpbmlzaGVkLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+VXBkYXRlZCBmdW5jdGlvbiBGTEFTSF9PQl9HZXRSRFAoKSByZXR1cm4gdmFsdWUgKEZsYWdTdGF0dXMgKFJFU0VULFNFVCkpLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+Q29ycmVjdGVkIHdheSB0byBzZXQgRmxhc2ggcmVhZCBwcm90ZWN0aW9uIGJ5IHBlcmZvcm1pbmcgYW4gYXV0b21hdGljIG9wdGlvbiBieXRlIGVyYXNlPGJyPmluIEZMQVNIX09CX1JEUF9MZXZlbENvbmZpZyBmdW5jdGlvbi48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlVwZGF0ZWQgRGlzYWJsZSBXUlAgdG8gYmUgY29tcGxpYW50IHdpdGggb3RoZXIgZmFtaWxpZXMuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5SZW1vdmVkIGRvdWJsZSBkZWZpbml0aW9uIG9mIElTX09CX1NEQUNEX1ZERF9NT05JVE9SLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWRkZWQgbWlzc2luZyBtYWNybyBfX0hBTF9GTEFTSF9HRVRfTEFURU5DWS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkNvcnJlY3RlZCBJU19PUFRJT05CWVRFKCkgbWFjcm8gaW4gdGhlIGNhc2UgYWxsIG9wdGlvbl9PQiBhcmUgc2VsZWN0ZWQuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5VcGRhdGVkIEhBTF9OT1JfR2V0U3RhdHVzKCkgKG1pc3NpbmcgZXhpdCBmcm9tIHdhaXRpbmcgbG9vcCB3aGVuIHRpbWVvdXQgb2NjdXJyZWQpLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+UmV2aWV3ZWQgX19BUlJBWV9BRERSRVNTIG1hY3JvIGFuZCBhZGFwdGVkIHRlc3RzIHRvIGRldGVjdCBiYWQgYmxvY2tzLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+VXBkYXRlZCBGTUNfTk9SU1JBTV9Jbml0KCkvRlNNQ19OT1JTUkFNX0luaXQoKSBpbiBvcmRlciB0byBub3QgbW9kaWZ5IHRoZSBkZWZhdWx0IHZhbHVlczxicj5mb3IgdGhlIHJlc2VydmVkIGJpdHMgaW4gdGhlIEJUQ1IgcmVnaXN0ZXIuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBHUElPPC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlVwZGF0ZWQgR1BJTyBPdXRwdXQgU3BlZWQgbGl0ZXJhbHMgbmFtaW5nIHRvIGVuc3VyZSBIQUwgZnVsbCBjb21wYXRpYmlsaXR5Ljwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWRkZWQgb25seSBvbmUgZGVmaW5lIEJTUlIgZm9yIEJTUlJIL0JTUlJMIHJlZ2lzdGVyLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+Rml4ZWQgaXNzdWUgdG8gZW5zdXJlIGludGVycnVwdCBtb2RlIGlzIHJlc2V0Ljwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+UmV3b3JrZWQgR1BJT19HRVRfU09VUkNFKCkgaW4gb3JkZXIgdG8gY2hlY2sgb25seSBleGlzdGluZyBHUElPIGJhbmsuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5BZGQgbmV3IG1hY3JvIElTX0dQSU9fQUZfSU5TVEFOQ0UgdG8gcHJvdGVjdCBHUElPIGJhbmtzIHdpdGhvdXQgYWx0ZXJuYXRlIGZ1bmN0aW9uIHJlZ2lzdGVyPGJyPmZyb20gYmVpbmcgaW5pdGlhbGl6ZWQgYXMgQUYuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBIUlRJTTwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5Db3JyZWN0ZWQgYml0IGRlZmluaXRpb24gZm9yIEhSVElNX01DTVB4UiByZWdpc3RlcnMuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5Db3JyZWN0ZWQgbmFtaW5nIGZvciBkZWxheWVkIHByb3RlY3Rpb24gcmVsYXRlZCBjb25zdGFudHMuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5BZGRlZCBtaXNzaW5nIGFzc2VydCBpbiBIQUxfSFJUSU1fQnVyc3RNb2RlQ29uZmlnKCkuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5BZGRlZCBtaXNzaW5nIG1hY3JvcyBfX0hBTF9GUkVFWkVfIEhSVElNMV9EQkdNQ1UoKSwgX19IQUxfVU5GUkVFWkVfIEhSVElNMV9EQkdNQ1UgKCk8YnI+dG8gc3RvcCB0aGUgSFJUSU0gd2hlbiB0aGUgY29yZSBpcyBoYWx0ZWQgKHRvIGNvbnRyb2wgdGhlIERCR01DVV9BUEIyX0ZaLkRCR19IUlRJTTFfU1RPUCBiaXRmaWVsZCkuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBJMkM8L3NwYW4+PC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+Q29ycmVjdGVkIHdyb25nIG1hbmFnZW1lbnQgb2YgQUYgYWZ0ZXIgTkFDSy48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlJlbmFtZWQgSTJDX0NSMV9ERk4gdG8gSTJDX0NSMV9ETkYuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5Db3JyZWN0ZWQgbWFuYWdlbWVudCBvZiBJMkMgc3RhdGUgaW4gdGhlIGZ1bmN0aW9uIEkyQ19NYXN0ZXJUcmFuc21pdF9JU1IoKS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlJlLWludHJvZHVjZWQgdGhlIE1BQ1JPcyB0byBtYW5hZ2UgdGhlIEZNKyBjYXBhcGJpbGl0eSBvbiBzb21lIEdQSU9zLjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgSTJTPC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkFkZGVkIERNQSBjaXJjdWxhciBtb2RlIHN1cHBvcnQgZm9yIHRoZSBjb21tdW5pY2F0aW9uIHBlcmlwaGVyYWxzLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+VXBkYXRlZCBJMlMgSEFMX0kyU19UcmFuc21pdCgpIEFQSSBvbiBidXN5IGZsYWcuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBJUkRBPC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkFkZGVkIERNQSBjaXJjdWxhciBtb2RlIHN1cHBvcnQgZm9yIHRoZSBjb21tdW5pY2F0aW9uIHBlcmlwaGVyYWxzLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+SW1wbGVtZW50ZWQgX19IQUxfVUFSVF9GTFVTSF9EUlJFR0lTVEVSIG1hY3JvLCByZXF1aXJlZCBieSB0aGUgSW4tQXBwbGljYXRpb24gUHJvZ3JhbW1pbmcgKElBUCk8YnI+dXNpbmcgdGhlIFVTQVJUIGFwcGxpY2F0aW9uLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+VXNlZCBuZXcgbWFjcm8gSVNfVUFSVF9ETUFfSU5TVEFOQ0UgaW4gYXNzZXJ0X3BhcmFtKCkgY2FsbHMgZm9yIElSREEgRE1BIHJlbGF0ZWQgcHJpbWl0aXZlcy48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkNoYW5nZWQgVUFSVCBUWC1JVCBpbXBsZW1lbnRhdGlvbiB0byByZW1vdmUgV2FpdE9uRmxhZyBpbiBJU1IuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5GaXhlZCBpc3N1ZSBpbiBJUkRBIERNQSBpbXBsZW1lbnRhdGlvbjogbWlzc2VkIGNsZWFyIG9mIHRoZSBUQyBiaXQgaW4gdGhlIFNSIHJlZ2lzdGVyLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+Q29ycmVjdGVkIGRlZmluaXRpb24gb2YgSVNfSVJEQV9SRVFVRVNUX1BBUkFNRVRFUiBtYWNyby48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPk1vZGlmaWVkIFRpbWUgT3V0IG1hbmFnZW1lbnQ6IHJlcG9ydCBzdGF0ZSBSRUFEWSBpbnN0ZWFkIG9mIFRJTUVPVVQuPGJyPlRpbWUtb3V0IGluZm9ybWF0aW9uIGlzIHJlcG9ydGVkIGJ5IGZ1bmN0aW9uIG91dHB1dCBwYXJhbWV0ZXIuPGJyPjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+Q29ycmVjdGVkIFBDTEsgc291cmNlIGZvciBVU0FSVDEuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBPUEFNUDwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5VcGRhdGVkIEhBTF9PUEFNUF9EZUluaXQoKSB0byBoYW5kbGUgTE9DS0VEIHN0YXRlLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWRkZWQgX19IQUxfVU5MT0NLIGluIEhBTF9PUEFNUF9EZUluaXQuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5SZW1vdmVkIEludmVydGluZ0lucHV0IEFTU0VSVCBpbiBIQUxfT1BBTVBfSW5pdCgpIGFzIGl0IGlzIG5vdCBuZWVkZWQgaW4gUEdBIG1vZGUuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5VcGRhdGVkIGRlZmluaXRpb24gb2YgT1BBTVBfQ1NSX1VQREFURV9QQVJBTUVURVJTX0lOSVRfTUFTSyBpbiBPUEFNUCBJbml0Ljxicj48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFBXUjwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5GaXhlZCBNSVNSQSBDIDIwMDQgd2FybmluZ3MsIHJlc29ydCB0byByZWZlcmVuY2UgU0VUX0JJVCwgQ0xFQVJfQklUIG1hY3Jvcy48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlVwZGF0ZWQgRGV2aWNlIGluZm9ybWF0aW9uIHdoZW4gbWlzc2luZywgc3lzdGVtYXRpY2FsbHkgYWRkZWQgVVNFX0ZVTExfQVNTRVJUIGNvbXBpbGF0aW9uIHN3aXRjaC48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkFkZGVkIGxvY2FsIHZhcmlhYmxlcyBhZGRpdGlvbiB0byBzdXBwcmVzcyB3YXJuaW5ncy48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlJlbW92ZWQgdXNlbGVzcyByZWd1bGF0b3IgcGFyYW1ldGVyIHNldHRpbmcgaW4gSEFMX1BXUl9FbnRlclNMRUVQTW9kZSgpLjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgUkNDPC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlJlbmFtZWQgUkNDX0NGR1IzX1VTQVJUMVNXX1BDTEsgdG8gUkNDX0NGR1IzX1VTQVJUMVNXX1BDTEt4IGFjY29yZGluZyB0byBkZXZpY2VzLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWRkZWQgbWlzc2luZyBmbGFnIGZvciBSQ0NfQ1NSX1ZSRUdSU1RGIGJpdC48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkFkZGVkIG1pc3NpbmcgZmxhZyBmb3IgUkNDX0NGR1JfTUNPRiBmZWF0dXJlLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWRkZWQgbWlzc2luZyBtYWNybyBfX0hBTF9SQ0NfTFNFRFJJVkVfQ09ORklHLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+UmVuYW1lZCBJU19SQ0NfUEVSSVBIQ0xLIHRvIElTX1JDQ19QRVJJUEhDTE9DSy48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlJlbmFtZWQgX19IQUxfUkNDX01DT19DT05GSUcgdG8gX19IQUxfUkNDX01DTzFfQ09ORklHLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+VXBkYXRlZCBSQ0MgQVBJcyB0byBhZGQgaW50ZXJmYWNlIEhBTF9SQ0NFeF9HZXRQZXJpcGhDTEtGcmVxLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+SW1wbGVtZW50ZWQgd29ya2Fyb3VuZCB0byBjb3ZlciBSQ0MgbGltaXRhdGlvbiByZWdhcmRpbmcgUGVyaXBoZXJhbCBlbmFibGUgZGVsYXkuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5Nb2RpZmllZCBIQUxfUkNDRXhfUGVyaXBoQ0xLQ29uZmlnIHRvIHJlc2V0IGJhY2t1cCBkb21haW4gb25seSBpZiBSVEMgY2xvY2sgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5SZXdvcmtlZCBfX0hBTF9SQ0NfTFNFX0NPTkZJRyBtYWNybyB0byBtYW5hZ2UgY29ycmVjdGx5IExTRV9CeXBhc3MuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5Gb2xsb3dlZCBzcGVjaWZpYyBwcm9jZWR1cmUgdG8gZW5hYmxlIEhTRS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlVwZGF0ZWQgSEFMX1JDQ19Pc2NDb25maWcoKSB0byBtb2RpZnkgY2hlY2sgb24gTFNFU3RhdGUuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5BZGRlZCBQTExfRElWMSBkZWZpbmUgbWlzc2luZyBmcm9tIHRoZSBSQ0NfTUNPX0Nsb2NrX1NvdXJjZSBkZWZncm91cC48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkFkZGVkIG5ldyBtYWNybyBfX0hBTF9SQ0NfSVNfUFdSX0NMT0NLX0VOQUJMRUQoKSB0byByZXBsYWNlIGNvbmRpdGlvbiBvbiBQZXJpcGhlcmFsIENsb2NrIGVuYWJsZSBzdGF0dXMuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5BZGRlZCBuZXcgbWFjcm8gX19IQUxfUkNDX1NZU0NMS19DT05GSUcoKSB0byBjb25maWd1cmUgdGhlIFNZU0NMSyBjbG9jayBzb3VyY2UuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5GaXhlZCZuYnNwO2lzc3VlIGluIEhBTF9SQ0NfT3NjQ29uZmlnIHdoZW4gUkNDX09zY0luaXRTdHJ1Y3QtJmd0O0hTRVN0YXRlID0gUkNDX0hTRV9CWVBBU1MuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBSVEMoQktQKTwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5VcGRhdGVkIGxpc3Qgb2YgYmFja3VwIHJlZ2lzdGVycyBkZWZpbml0aW9uLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+VXBkYXRlZCBCaXRzIG1hc2sgbGl0ZXJhbHMgdXNlZCBpbiBtYWNyb3MgZGVmaW5pdGlvbi48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlJlbmFtZWQgUlRDX09VVFBVVF9SRU1BUF9YWCBhbmQgUlRDX1RJTUVTVEFNUFBJTl9YWCBtYWNyb3MuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5VcGRhdGVkIGRlZmluaXRpb24gb2YgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9HRVRfRkxBRy48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkFsaWduZWQgZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBvZiBIQUxfUlRDX1hYSVJRSGFuZGxlcigpLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+Q2hlY2sgdGhlIGJlaGF2aW9yIG9mIGZsYWcgV1VUV0YgYW5kIGNvcnJlY3RlZCB1cGRhdGUgb2Ygd2FrZXVwIGNvdW50ZXIgcmVnaXN0ZXJzLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWRkZWQgc3Vic2Vjb25kIGZyYXRpb24gZm9ybXVsYSBpbiBIQUxfUlRDX0dldFRpbWUoKSBmdW5jdGlvbi48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFNEQURDPC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkFwcGxpZWQgUmVmZXJlbmNlVm9sdGFnZSBwYXJhbWV0ZXIgaW4gSEFMX1NEQURDX0luaXQoKSB3YXRoZXZlciBpbnN0YW5jZS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkFkZGVkIG5ldyBtYWNyb3MgX19IQUxfU0RBRENfRU5BQkxFX0lUKCksIF9fSEFMX1NEQURDX0dFVF9JVF9TT1VSQ0UoKSwgX19IQUxfU0RBRENfR0VUX0ZMQUcoKS48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFNNQVJUQ0FSRDwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5JbXBsZW1lbnRlZCBfX0hBTF9VQVJUX0ZMVVNIX0RSUkVHSVNURVIgbWFjcm8sIHJlcXVpcmVkIGJ5IHRoZSBJbi1BcHBsaWNhdGlvbiBQcm9ncmFtbWluZyAoSUFQKTxicj51c2luZyB0aGUgVVNBUlQgYXBwbGljYXRpb24uPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5DaGFuZ2VkIFVBUlQgVFgtSVQgaW1wbGVtZW50YXRpb24gdG8gcmVtb3ZlIFdhaXRPbkZsYWcgaW4gSVNSLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWRkZWQgbWlzc2luZyBJRExFIGZsYWcgbWFuYWdlbWVudC48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPk1vZGlmaWVkIFRpbWUgT3V0IG1hbmFnZW1lbnQ6IHJlcG9ydCBzdGF0ZSBSRUFEWSBpbnN0ZWFkIG9mIFRJTUVPVVQuPGJyPlRpbWUtb3V0IGluZm9ybWF0aW9uIGlzIHJlcG9ydGVkIGJ5IGZ1bmN0aW9uIG91dHB1dCBwYXJhbWV0ZXIuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5Db3JyZWN0ZWQgUENMSyBzb3VyY2UgZm9yIFVTQVJUMS48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFNQSTwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5JbXByb3ZlZCBTUEkgcGVyZm9ybWFuY2VzLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWRkZWQgRml0IEJpdCBmZWVkYmFjayAod2l0aCBCU1kgZmxhZyBjaGVjaykgZm9yIGFsbCB0aGUgcHJvY2Vzcy48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlVwZGF0ZWQgZnVuY3Rpb24gZGVzY3JpcHRpb25zLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+Rml4ZWQgaXNzdWUgb24gUnggMmxpbmUgd2l0aCBEYXRhU2l6ZThiaXQsIGV2ZW4gYnVmZmVyIHNpemUgYW5kIENSQyA4Yml0Ljwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWRkZWQgRE1BIGNpcmN1bGFyIG1vZGUgc3VwcG9ydCBmb3IgdGhlIGNvbW11bmljYXRpb24gcGVyaXBoZXJhbHMuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5SZW1vdmVkIERNQSBUeCBDYWxsYmFjayBpbiBjYXNlIG9mIFJ4T25seSBtb2RlIGZyb20gSEFMX1NQSV9UcmFuc21pdFJlY2VpdmVfRE1BKCkuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5BZGRlZCBIQUxfU1BJX0dldEVycm9yKCkuPGJyPjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgVElNPC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkNvcnJlY3RlZCBhc3NlcnQgY2hlY2tzIGluIEhBTF9USU1fQ29uZmlnQ2xvY2tTb3VyY2UoKSB3aGVuIHNldHRpbmcgaW50ZXJuYWwgY2xvY2sgc291cmNlLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+UmVtb3ZlZCB1c2VsZXNzIGFzc2VydCgpIGluIFRJTSBmdW5jdGlvbnMuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5VcGRhdGVkIGltcGxlbWVudGF0aW9uIG9mIF9fSEFMX1RJTV9TRVRfQ09NUEFSRSBtYWNyby48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlVwZGF0ZWQgUmVwZXRpdGlvbiBjb3VudGVyIGJpdHMgZGVmaW5pdGlvbi48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPk1vZGlmaWVkIEhBTF9USU1fQ29uZmlnT0NyZWZDbGVhcigpIHRvIGF2b2lkIHBvc3NpYmxlIG92ZXJ3cml0ZSBvZiBTTUNSIHJlZ2lzdGVyLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+UmVtb3ZlZCBhc3NlcnQgb24gdHJpZ2dlciBwb2xhcml0eSBpbiB0aGUgY2FzZSBUSU1fVFNfVEkxRl9FRC48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlJlbW92ZWQgSEFMX1RJTV9TbGF2ZUNvbmZpZ1N5bmNocm9uaXphdGlvbl9ETUEoKSBmcm9tIEhBTF9USU0gQVBJcy48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkFkZGVkIFRJTSBlZGdlIG1vZGlmaWNhdGlvbiBtYWNyb3M6IFRJTV9TRVRfQ0FQVFVSRVBPTEFSSVRZKCksIFRJTV9SRVNFVF9DQVBUVVJFUE9MQVJJVFkoKSwgX19IQUxfVElNX1NFVF9DQVBUVVJFUE9MQVJJVFkuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5BZGRlZCBVUlNfRU5BQkxFLCBVUlNfRElTQUJMRSBtYWNyb3MuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5DaGFuZ2VkIFRpbWUgT3V0IG1hbmFnZW1lbnQ6IHJlcG9ydCBzdGF0ZSBSRUFEWSBpbnN0ZWFkIG9mIFRJTUVPVVQuPGJyPlRpbWUtb3V0IGluZm9ybWF0aW9uIGlzIHJlcG9ydGVkIGJ5IGZ1bmN0aW9uIG91dHB1dCBwYXJhbWV0ZXIuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5BZGRlZCBuZXcgZnVuY3Rpb24gSEFMX1RJTV9TbGF2ZUNvbmZpZ1N5bmNocm9uaXphdGlvbl9JVCgpIHRvIGhhbmRsZSB0aGUgdHJpZ2dlciBpbnRlcnJ1cHQgYWN0aXZhdGlvbi48YnI+PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBUU0M8L3NwYW4+PC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+UmVjb3ZlcmVkIElTX1RTQ19TUyBhbmQgSVNfVFNDX1NTRCBtYWNybyBkZWZpbml0aW9ucy48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFVBUlQtVVNBUlQ8L3NwYW4+PC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWRkZWQgRE1BIGNpcmN1bGFyIG1vZGUgc3VwcG9ydCBmb3IgdGhlIGNvbW11bmljYXRpb24gcGVyaXBoZXJhbHMuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5Nb2RpZmllZCBUaW1lIE91dCBtYW5hZ2VtZW50OiByZXBvcnQgc3RhdGUgUkVBRFkgaW5zdGVhZCBvZiBUSU1FT1VULjxicj5UaW1lLW91dCBpbmZvcm1hdGlvbiBpcyByZXBvcnRlZCBieSBmdW5jdGlvbiBvdXRwdXQgcGFyYW1ldGVyLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+Q2hhbmdlZCBVQVJUX0RNQVRyYW5zbWl0Q3BsdCgpIGltcGxlbWVudGF0aW9uIHRvIHJlbW92ZSBXYWl0T25GbGFnIGluIElTUi48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkltcGxlbWVudGVkIF9fSEFMX1VBUlRfRkxVU0hfRFJSRUdJU1RFUiBtYWNybywgcmVxdWlyZWQgYnkgdGhlIEluLUFwcGxpY2F0aW9uIFByb2dyYW1taW5nIChJQVApPGJyPnVzaW5nIHRoZSBVU0FSVCBhcHBsaWNhdGlvbi48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkNvcnJlY3RlZCBiZWhhdmlvciBvZiBIQUxfVUFSVF9JUlFfSGFuZGxlcigpIChyZW1vdmVkIGVuYWJsaW5nL2Rpc2FibGluZyBvZiBFUlIgSVQgc291cmNlKS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkFkZGVkIElTX1VBUlRfRE1BX0lOU1RBTkNFIG1hY3JvIHRvIHNvcnQgVUFSVCBpbnN0YW5jZXMgc3VwcG9ydGluZyBETUEgY29tbXVuaWNhdGlvbi48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlVzZWQgbmV3IG1hY3JvIElTX1VBUlRfRE1BX0lOU1RBTkNFIGluIGFzc2VydF9wYXJhbSgpIGNhbGxzIGZvciBVQVJUIERNQSByZWxhdGVkIHByaW1pdGl2ZXMuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5DaGFuZ2VkIFVBUlQgVFgtSVQgaW1wbGVtZW50YXRpb24gdG8gcmVtb3ZlIFdhaXRPbkZsYWcgaW4gSVNSLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWRkZWQgTUFDUk8gdG8gVUFSVCBIQUwgdG8gY29udHJvbCBDVFMgYW5kIFJUUyBmcm9tIHRoZSBjdXN0b21lciBhcHBsaWNhdGlvbi48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlJlbmFtZWQgSEFMX1VBUlRfV2FrZXVwQ2FsbGJhY2soKSBpbiBIQUxfVUFSVEV4X1dha2V1cENhbGxiYWNrKCkuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5Db3JyZWN0ZWQgc2V0dGluZyBvZiBCUlIgcmVnaXN0ZXIgYml0WzM6MF0gd2hlbiBPVkVSOCBzYW1wbGluZyBtb2RlIGlzIHVzZWQuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5Db3JyZWN0ZWQgdmFsdWVzIHVzZWQgYXMgcGFyYW1ldGVyIG9mIF9fSEFMX1VTQVJUX0NMRUFSX0lUKCkgaW4gSEFMX1VTQVJUX0lSUUhhbmRsZXIoKS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlVwZGF0ZWQgSEFMX1VTQVJUX0luaXQoKSB0byByZWFjaCBtYXggZnJlcXVlbmNpZXMgKGVuYWJsZSBvdmVyc2FtcGxpbmcgYnkgOCkuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5GaXhlZCBpc3N1ZSBpbiBVQVJUIERNQSBpbXBsZW1lbnRhdGlvbjogbWlzc2VkIGNsZWFyIG9mIHRoZSBUQyBiaXQgaW4gdGhlIFNSIHJlZ2lzdGVyLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWRkZWQgdGVzdCBpbiBIQUxfTElOX0luaXQoKSBhcyBvbmx5IDgtYml0IGRhdGEgbGVuZ3RoIGlzIGF2YWlsYWJsZSB3aXRoIFVTQVJUIExpbiBtb2RlIERhdGEgbGVuZ3RoLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+VXBkYXRlZCBVU0FSVF9JVF9DTSBkZWZpbmVkIHZhbHVlLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+Q29ycmVjdGVkIFBDTEsgc291cmNlIGZvciBVU0FSVDEuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBVU0IvUENEPC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkNvcnJlY3RlZCBwcm9kdWN0cyBkZWZpbmUgc3VwcG9ydGluZyBVU0IgZmVhdHVyZS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlVwZGF0ZWQgY2FsbCB0byBEb3VibGUgQnVmZmVyaW5nIENvdW50ZXIgRnVuY3Rpb24uPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5VcGRhdGVkIEhBTCBQQ0QgY2xlYXIgZmxhZyBtYWNyb3MgY29uZmlndXJhdGlvbi48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkNvcnJlY3RlZCBpc3N1ZSBpbiBIQUxfUENEX0VQX1RyYW5zbWl0KCkgZnVuY3Rpb24sIHJlZ2FyZGluZyB0aGUgZG91YmxlLWJ1ZmZlcmluZyBtb2RlIGZvciBJTiBlbmRwb2ludHMuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBXV0RHPC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlVwZGF0ZWQgSVQgbWFjcm8gbWFuYWdlbWVudC48L3NwYW4+PC9saT48L3VsPjwvdWw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj48YnI+PC9zcGFuPjxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiBpbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMjAwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjEuMQorLyAxOS1KdW5lLTIwMTU8bzpwPjwvbzpwPjwvc3Bhbj48L2gzPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PC9zcGFuPjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBjbSA0LjVwdCAxOHB0OyI+PGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPk1haW4KK0NoYW5nZXM8L3NwYW4+PC91PjwvYj48L3A+CisKKworCis8c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjwvc3Bhbj48dWwgc3R5bGU9Im1hcmdpbi10b3A6IDBjbTsgbGlzdC1zdHlsZS10eXBlOiBzcXVhcmU7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5GaXhlZCBjb21waWxhdGlvbiB3YXJuaW5ncyByZXBvcnRlZCBieSZuYnNwO1RydWVTVFVESU8gYW5kJm5ic3A7U1c0U1RNMzIgdG9vbGNoYWlucy48L3NwYW4+PC9saT48L3VsPjxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiBpbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMjAwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjEuMAorLyAxMi1TZXB0LTIwMTQ8bzpwPjwvbzpwPjwvc3Bhbj48L2gzPjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBjbSA0LjVwdCAxOHB0OyI+PGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPk1haW4KK0NoYW5nZXM8L3NwYW4+PC91PjwvYj48L3A+CisKKworCis8dWwgc3R5bGU9Im1hcmdpbi10b3A6IDBjbTsgbGlzdC1zdHlsZS10eXBlOiBzcXVhcmU7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5GaXJzdCBvZmZpY2lhbAorcmVsZWFzZSBvZiBTVE0zMkYzeHggSEFMIGRyaXZlcnMgZm9yIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXdlaWdodDogYm9sZDsiPlNUTTMyRjMwM3hFLAorPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtd2VpZ2h0OiBib2xkOyI+U1RNMzJGMzAyeEU8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij4gPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5hbmQ8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij4gPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtd2VpZ2h0OiBib2xkOyI+U1RNMzJGMzk4eHgKKzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXdlaWdodDogYm9sZDsiPmRldmljZXMuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgZ2VuZXJpYzwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWRkIHN1cHBvcnQgb2YgbmV3CisgICAgIGRldmljZXMgPGI+U1RNMzJGMzAyeEU8L2I+IGFuZDxiPiBTVE0zMkYzOTh4eDwvYj4gaW4gU1RNMzJGM3h4IEhBTCBkcml2ZXJzPG86cD48L286cD48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IHdpbmRvd3RleHQ7IiBsYW5nPSJFTi1VUyI+PHNwYW4gc3R5bGU9IiI+PC9zcGFuPjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IHdpbmRvd3RleHQ7IiBsYW5nPSJFTi1VUyI+PHNwYW4gc3R5bGU9IiI+PC9zcGFuPjxiPkhBTCBBREM8L2I+PG86cD48L286cD48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj48L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5FbXB0eSB3ZWFrIGZ1bmN0aW9uCisgICAgIHJldHVybiBIQUxfRVJST1I8bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjwvdWw+PC91bD48dWwgc3R5bGU9Im1hcmdpbi10b3A6IDBjbTsgbGlzdC1zdHlsZS10eXBlOiBzcXVhcmU7Ij48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5NaXNyYSBlcnJvcgorICAgICBjb3JyZWN0aW9uczwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IHdpbmRvd3RleHQ7IiBsYW5nPSJFTi1VUyI+PGI+SEFMIENPUlRFWDwvYj48bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjwvdWw+CisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKzx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMGNtOyBsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsiPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPk1hY3JvIElTX1NZU1RJQ0tfQ0xLU09VUkNFCisgICAgIHJlbmFtZWQgSVNfU1lTVElDS19DTEtfU09VUkNFPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiB3aW5kb3d0ZXh0OyIgbGFuZz0iRU4tVVMiPjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IHdpbmRvd3RleHQ7IiBsYW5nPSJFTi1VUyI+PGI+SEFMIERBQzwvYj48bzpwPjwvbzpwPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkVtcHR5IHdlYWsgZnVuY3Rpb24KKyAgICAgcmV0dXJuIEhBTF9FUlJPUjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogd2luZG93dGV4dDsiIGxhbmc9IkVOLVVTIj48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiB3aW5kb3d0ZXh0OyIgbGFuZz0iRU4tVVMiPjxiPkhBTCBJV0RHPC9iPjxvOnA+PC9vOnA+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7SGVsdmV0aWNhJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+PC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+TWlub3IgdXBkYXRlcyAoSEFMIGNvZGluZyBydWxlcyk8L3NwYW4+PHNwYW4gY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtIZWx2ZXRpY2EmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiB3aW5kb3d0ZXh0OyIgbGFuZz0iRU4tVVMiPjxiPkhBTCBQQ0Q8L2I+PG86cD48L286cD48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj48L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5DaGFuZ2VkIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPklOL09VVAorICAgICBFbmRQb2ludCBwYXJhbWV0ZXIgYXJyYXkgc2l6ZSAoUENEIEhhbmRsZSBTdHJ1Y3R1cmUpPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+PG86cD48L286cD48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IHdpbmRvd3RleHQ7IiBsYW5nPSJFTi1VUyI+PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogd2luZG93dGV4dDsiIGxhbmc9IkVOLVVTIj48Yj5IQUwgUkNDPC9iPjxvOnA+PC9vOnA+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+PC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+UkNDX01DT1NPVVJDRV9QTExDTEtfRElWMQorICAgICBkZWZpbmUgYWRkZWQgdG8gUkNDX01DT19DbG9ja19Tb3VyY2UgZGVmZ3JvdXAgZm9yIHRoZSBmb2xsb3dpbmcgZGV2aWNlczogU1RNMzJGMzAyeEUsCisgICAgIFNUTTMyRjMwM3hFLCBTVE0zMkYzOTh4eCwgU1RNMzJGMzAzeDgsIFNUTTMyRjMyOHh4LCBTVE0zMkYzMDF4OCwgU1RNMzJGMzAyeDgKKyAgICAgYW5kIFNUTTMyRjMxOHh4PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+PG86cD48L286cD48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IHdpbmRvd3RleHQ7IiBsYW5nPSJFTi1VUyI+PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogd2luZG93dGV4dDsiIGxhbmc9IkVOLVVTIj48Yj5IQUwgU1BJPC9iPjxvOnA+PC9vOnA+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+PC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+UmVtb3ZlZCBIQUxfCisgICAgIHByZWZpeCBmcm9tIHN0YXRpYyBmdW5jdGlvbiBuYW1lczwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPjxvOnA+PC9vOnA+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiB3aW5kb3d0ZXh0OyIgbGFuZz0iRU4tVVMiPjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IHdpbmRvd3RleHQ7IiBsYW5nPSJFTi1VUyI+PGI+SEFMIFRJTTwvYj48bzpwPjwvbzpwPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkNoZWNrZWQKKyAgICAgRGVhZFRpbWUgdmFsdWUgaW4gZGVidWcgbW9kZTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWRkIG5ldyBtYWNyb3MgX19IQUxfVElNX1VSU19FTkFCTEUoKSBhbmQmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5fX0hBTF9USU1fVVJTX0RJU0FCTEUoKTwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IHdpbmRvd3RleHQ7IiBsYW5nPSJFTi1VUyI+PGI+SEFMIFdXREc8L2I+PG86cD48L286cD48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj48L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5NaW5vciB1cGRhdGVzIChIQUwgY29kaW5nCisgICAgIHJ1bGVzKTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWRkZWQgbWFjcm8gX19IQUxfV1dER19DTEVBUl9JVCgpPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5Vc2UgTU9ESUZZX1JFRygpIG1hY3JvIHRvIHNldCBQcmVzY2FsZXIsIFdpbmRvdyBhbmQgQ291bnRlciByZWdpc3RlcnMgd2l0aGluICZuYnNwO0hBTF9XV0RHX0luaXQoKTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O0hlbHZldGljYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPiZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPjxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PC91bD48L3VsPgorCisKKworCisKKworCisKKworPGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IGluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAyMDBweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuMS4wUkMyCisvIDI1LUF1Z3VzdC0yMDE0PG86cD48L286cD48L3NwYW4+PC9oMz48cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwY20gNC41cHQgMThwdDsiPjxiIHN0eWxlPSIiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBjb2xvcjogYmxhY2s7Ij5NYWluCitDaGFuZ2VzPC9zcGFuPjwvdT48L2I+PC9wPgorCisKKworCisKKworCisKKzx1bCBzdHlsZT0ibGlzdC1zdHlsZS10eXBlOiBzcXVhcmU7Ij48bGk+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBnZW5lcmljPC9zcGFuPiB1cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+R2VuZXJhbCBpbXByb3ZlbWVudCBvZgorICAgICBEb3h5Z2VuIFRhZ3MgZm9yIENITSBVTSBnZW5lcmF0aW9uPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssJnF1b3Q7c2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+PG86cD48L286cD48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5BZGQgc3VwcG9ydCBvZiBuZXcKKyAgICAgZGV2aWNlcyA8Yj5TVE0zMkYzMDN4RTwvYj4gaW4gU1RNMzJGM3h4IEhBTCBkcml2ZXI8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+PC9zcGFuPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+SEFMIDwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj51cGRhdGUmbmJzcDsoZm9yIDwvc3Bhbj48Yj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogYmxhY2s7IiBsYW5nPSJFTi1VUyI+U1RNMzJGMzAzeEU8L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+KTxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkFkZCBuZXcgZGVmaW5lcyBmb3IgQURDCisgICAgIHRyaWdnZXIgcmVtYXBwaW5nIChIQUxfUkVNQVBBRENUUklHR0VSX3gpPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssJnF1b3Q7c2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+PG86cD48L286cD48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5BZGQgbmV3IGRlZmluZXMgZm9yIENDTQorICAgICBSQU0gcGFnZSB3cml0ZSBwcm90ZWN0aW9uICh1cCB0byAxNiBwYWdlcyBjYW4gYmUgd3JpdGUgcHJvdGVjdGVkKTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LCZxdW90O3NlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPjxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWRkIG5ldyBtYWNybyBJU19IQUxfUkVNQVBBRENUUklHR0VSKCk8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OywmcXVvdDtzZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj48bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlVwZGF0ZWQgbWFjcm8gSVNfSEFMX1NZU0NGR19XUF9QQUdFCisgICAgICgpPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssJnF1b3Q7c2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+PG86cD48L286cD48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5BZGQgbmV3IG1hY3JvcyB0bworICAgICBmcmVlemUvdW5mcmVlemUgVElNMjAgaW4gZGVidWcgbW9kZTogX19IQUxfRlJFRVpFX1RJTTIwX0RCR01DVSgpIGFuZCBfX0hBTF9VTkZSRUVaRV9USU0yMF9EQkdNQ1UoKTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LCZxdW90O3NlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPjxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWRkIG5ldyBtYWNybyB0byByZW1hcAorICAgICB0aGUgRk1DIGJhbmtzIDEgYW5kIDIgYXQgMHgwMDAwMDAwMCA6IF9fSEFMX0ZNQ19CQU5LKCk8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OywmcXVvdDtzZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj48bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkFkZCBuZXcgbWFjcm9zIHRvCisgICAgIGVuYWJsZS9kaXNhYmxlIEFEQyB0cmlnZ2VyIHJlbWFwcGluZzogX19IQUxfUkVNQVBBRENUUklHR0VSX0VOQUJMRSgpIGFuZCBfX0hBTF9SRU1BUEFEQ1RSSUdHRVJfRElTQUJMRTwvc3Bhbj4oKTxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+PC9zcGFuPjwvYj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+SEFMIEFEQyA8L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+dXBkYXRlJm5ic3A7KGZvciA8L3NwYW4+PGI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IGJsYWNrOyIgbGFuZz0iRU4tVVMiPlNUTTMyRjMwM3hFPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPik8bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5BZGQgbmV3IGRlZmluZXMgZm9yIFRJTTIwCisgICAgIHJlbGF0ZWQgQURDIGV4dGVybmFsIHRyaWdnZXJzIGZvciByZWd1bGFyIGdyb3VwcyAoQURDX0VYVEVSTkFMVFJJR0NPTlZfVDIwX3gpPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssJnF1b3Q7c2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+PG86cD48L286cD48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5BZGQgbmV3IGRlZmluZXMgZm9yIFRJTTIwCisgICAgIHJlbGF0ZWQgQURDIGV4dGVybmFsIHRyaWdnZXJzIGZvciBpbmplY3RlZCBncm91cHMgKEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfVDIwX3gpPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssJnF1b3Q7c2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+PG86cD48L286cD48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5VcGRhdGVkIG1hY3JvIF9fSEFMX0FEQ19DRkdSX0VYVFNFTCgpIHRvIHRha2UgaW50byBhY2NvdW50IDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlRJTTIwIHJlbGF0ZWQgQURDCisgICAgIHRyaWdnZXJzIGZvciByZWd1bGFyIGNoYW5uZWxzPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+PG86cD48L286cD48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5VcGRhdGVkIG1hY3JvIF9fSEFMX0FEQ19KU1FSX0pFWFRTRUwoKSB0byB0YWtlIGludG8gYWNjb3VudCA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5USU0yMCByZWxhdGVkIEFEQworICAgICB0cmlnZ2VycyBmb3IgaW5qZWN0ZWQgY2hhbm5lbHM8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj48bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjwvdWw+PC91bD48dWwgc3R5bGU9Imxpc3Qtc3R5bGUtdHlwZTogc3F1YXJlOyI+PGxpPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+SEFMIENPTVAgPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5EZWZlY3QgY29ycmVjdGlvbjo8L3NwYW4+PC9saT48L3VsPjx1bD48dWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiB3aW5kb3d0ZXh0OyIgbGFuZz0iRU4tVVMiPk1pc3NpbmcgYXNzZXJ0IHBhcmFtIElTX0NPTVBfVFJJR0dFUk1PREU8L3NwYW4+PC9saT48L3VsPjwvdWw+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogd2luZG93dGV4dDsiIGxhbmc9IkVOLVVTIj5TVE0zMkYzMDN4RTo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj48L3NwYW4+PC9saT48L3VsPjx1bD48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWRkIG5ldyBkZWZpbmVzIGZvciBjb21wYXJhdG9yIG91dHB1dCByZWRpcmVjdGlvbjogQ09NUF9PVVRQVVRfVElNMjBCS0lOLAorICAgICBDT01QX09VVFBVVF9USU0yMEJLSU4yLCBDT01QX09VVFBVVF9USU0xQktJTjJfVElNOEJLSU4yX1RJTTIwQktJTjIgYW5kIENPTVBfT1VUUFVUX1RJTTIwT0NSRUZDTFI8bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjwvdWw+PC91bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj48c3BhbiBjbGFzcz0iTXNvTm9ybWFsIj48L3NwYW4+PC9zcGFuPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+SEFMIEZMQVNIIDwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj51cGRhdGUmbmJzcDsoZm9yIDwvc3Bhbj48Yj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogYmxhY2s7IiBsYW5nPSJFTi1VUyI+U1RNMzJGMzAzeEU8L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+KTxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PC91bD4KKworCisKKworCisKKzx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMGNtOyIgdHlwZT0iZGlzYyI+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBsaW5lLWhlaWdodDogMTE1JTsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IGJsYWNrOyIgbGFuZz0iRU4tVVMiPkFkZAorbmV3IGRlZmluZXMgZm9yIHdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZXMgMzIgdG8gNjEgYW5kIDYyLTI2MyAoT0JfV1JQX1BBR0VTeHhUT3l5KTwvc3Bhbj48L2xpPjwvdWw+PC91bD4KKworPHVsIHN0eWxlPSJsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsiPjxsaT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFN5bWJvbDsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iIiBsYW5nPSJFTi1VUyI+PHNwYW4gc3R5bGU9IiI+PC9zcGFuPjwvc3Bhbj48Yj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkhBTCBHUElPIDwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj51cGRhdGUmbmJzcDsoZm9yIDwvc3Bhbj48Yj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogYmxhY2s7IiBsYW5nPSJFTi1VUyI+U1RNMzJGMzAzeEU8L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+KTxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PC91bD4KKworPHVsIHN0eWxlPSJtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJkaXNjIj48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGxpbmUtaGVpZ2h0OiAxMTUlOyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogYmxhY2s7IiBsYW5nPSJFTi1VUyI+QWRkCituZXcgZGVmaW5lcyBmb3IgVElNMjAgYW5kIEZNQyByZWxhdGVkIEFGOiBHUElPX0FGMl9USU0yMCwgR1BJT19BRjNfVElNMjAsIEdQSU9fQUY2X1RJTTIwIGFuZAorR1BJT19BRjEyX0ZNQzwvc3Bhbj48L2xpPjwvdWw+PC91bD4KKworPHVsIHN0eWxlPSJsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsiPjxsaT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFN5bWJvbDsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iIiBsYW5nPSJFTi1VUyI+PHNwYW4gc3R5bGU9IiI+PC9zcGFuPjwvc3Bhbj48Yj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkhBTCBJUkRBIDwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj51cGRhdGU8bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjwvdWw+CisKKzx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMGNtOyIgdHlwZT0iZGlzYyI+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGxpbmUtaGVpZ2h0OiAxMTUlOyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogd2luZG93dGV4dDsiIGxhbmc9IkVOLVVTIj5UQyBlbmFibGVkIGFuZCBUWEUgZGlzYWJsZWQgYXQgdGhlIGVuZCBvZiBUWCBpbiBJVAorbW9kZTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPjxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PC91bD48L3VsPgorCis8dWwgc3R5bGU9Imxpc3Qtc3R5bGUtdHlwZTogc3F1YXJlOyI+PGxpPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogU3ltYm9sOyI+PC9zcGFuPjxzcGFuIHN0eWxlPSIiIGxhbmc9IkVOLVVTIj48c3BhbiBzdHlsZT0iIj48L3NwYW4+PC9zcGFuPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+SEFMIEhBTCBOQU5EPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPiZuYnNwOyg8L3NwYW4+PGI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IGJsYWNrOyIgbGFuZz0iRU4tVVMiPlNUTTMyRjMwM3hFIHNwZWNpZmljPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPik8bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjwvdWw+CisKKzx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMGNtOyIgdHlwZT0iZGlzYyI+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBsaW5lLWhlaWdodDogMTE1JTsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IGJsYWNrOyIgbGFuZz0iRU4tVVMiPkZNQzogZ2VuZXJpYworZmlybXdhcmUgdG8gZHJpdmUgTkFORCBtZW1vcmllcyBtb3VudGVkIGFzIGV4dGVybmFsIGRldmljZTwvc3Bhbj48L2xpPjwvdWw+PC91bD4KKworPHVsIHN0eWxlPSJsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsiPjxsaT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFN5bWJvbDsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iIiBsYW5nPSJFTi1VUyI+PHNwYW4gc3R5bGU9IiI+PC9zcGFuPjwvc3Bhbj48Yj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkhBTCBOT1I8L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+Jm5ic3A7KDwvc3Bhbj48Yj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogYmxhY2s7IiBsYW5nPSJFTi1VUyI+U1RNMzJGMzAzeEUgc3BlY2lmaWM8L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+KTxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PC91bD4KKworPHVsIHN0eWxlPSJtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJkaXNjIj48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGxpbmUtaGVpZ2h0OiAxMTUlOyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogYmxhY2s7IiBsYW5nPSJFTi1VUyI+Rk1DOiBnZW5lcmljCitmaXJtd2FyZSB0byBkcml2ZSBOT1IgbWVtb3JpZXMgbW91bnRlZCBhcyBleHRlcm5hbCBkZXZpY2U8L3NwYW4+PC9saT48L3VsPjwvdWw+CisKKzx1bCBzdHlsZT0ibGlzdC1zdHlsZS10eXBlOiBzcXVhcmU7Ij48bGk+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBTeW1ib2w7Ij48L3NwYW4+PHNwYW4gc3R5bGU9IiIgbGFuZz0iRU4tVVMiPjxzcGFuIHN0eWxlPSIiPjwvc3Bhbj48L3NwYW4+PGI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5IQUwgUENDQVJEPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPiZuYnNwOyg8L3NwYW4+PGI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IGJsYWNrOyIgbGFuZz0iRU4tVVMiPlNUTTMyRjMwM3hFIHNwZWNpZmljPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPik8bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjwvdWw+CisKKzx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMGNtOyIgdHlwZT0iZGlzYyI+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBsaW5lLWhlaWdodDogMTE1JTsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IGJsYWNrOyIgbGFuZz0iRU4tVVMiPkZNQzogZ2VuZXJpYworZmlybXdhcmUgdG8gZHJpdmUgUENDQVJEIG1lbW9yaWVzIG1vdW50ZWQgYXMgZXh0ZXJuYWwgZGV2aWNlPC9zcGFuPjwvbGk+PC91bD48L3VsPgorCis8dWwgc3R5bGU9Imxpc3Qtc3R5bGUtdHlwZTogc3F1YXJlOyI+PGxpPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogU3ltYm9sOyI+PC9zcGFuPjxzcGFuIHN0eWxlPSIiIGxhbmc9IkVOLVVTIj48c3BhbiBzdHlsZT0iIj48L3NwYW4+PC9zcGFuPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+SEFMIFBDRCA8L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+dXBkYXRlJm5ic3A7PG86cD48L286cD48L3NwYW4+PC9saT48L3VsPgorCis8dWwgc3R5bGU9Im1hcmdpbi10b3A6IDBjbTsiIHR5cGU9ImRpc2MiPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgbGluZS1oZWlnaHQ6IDExNSU7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiBibGFjazsiIGxhbmc9IkVOLVVTIj5BZGQKK25ldyBtYWNyb3MgX19IQUxfVVNCX0VYVElfR0VUX0ZMQUcoKSAsIF9fSEFMX1VTQl9FWFRJX0NMRUFSX0ZMQUcoKSwgX19IQUxfVVNCX0VYVElfU0VUX1JJU0lOR19FREdFX1RSSUdHRVIoKSwKK19fSEFMX1VTQl9FWFRJX1NFVF9GQUxMSU5HX0VER0VfVFJJR0dFUigpIGFuZCBfSEFMX1VTQl9FWFRJX1NFVF9GQUxMSU5HUklTSU5HX1RSSUdHRVIoKTwvc3Bhbj48L2xpPjwvdWw+PC91bD4KKworPHVsIHN0eWxlPSJsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsiPjxsaT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFN5bWJvbDsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iIiBsYW5nPSJFTi1VUyI+PHNwYW4gc3R5bGU9IiI+PC9zcGFuPjwvc3Bhbj48Yj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkhBTCBQV1IgPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPnVwZGF0ZSZuYnNwOzxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PC91bD4KKworPHVsIHN0eWxlPSJtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJkaXNjIj48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgbGluZS1oZWlnaHQ6IDExNSU7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiB3aW5kb3d0ZXh0OyIgbGFuZz0iRU4tVVMiPlBWRCBmZWF0dXJlIG5lZWQgZmFsbGluZy9yaXNpbmcgRXZlbnQgbW9kZXM8L3NwYW4+PC9saT48dWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiByZ2IoMTI3LCAxMjcsIDEyNyk7IiBsYW5nPSJFTi1VUyI+PHNwYW4gc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyI+UmVuYW1lIDxzcGFuIHN0eWxlPSIiPiZuYnNwOzwvc3Bhbj5kZWZpbmVzOiZuYnNwOzwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiByZ2IoMTI3LCAxMjcsIDEyNyk7IiBsYW5nPSJFTi1VUyI+PHNwYW4gc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyI+UFdSX01PREVfRVZUIHRvIFBXUl9QVkRfTU9ERV9OT1JNQUw8L3NwYW4+PC9zcGFuPjwvbGk+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiByZ2IoMTI3LCAxMjcsIDEyNyk7IiBsYW5nPSJFTi1VUyI+PHNwYW4gc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyI+UFdSX01PREVfSVRfUklTSU5HIHRvIFBXUl9QVkRfTU9ERV9JVF9SSVNJTkc8bzpwPjwvbzpwPjwvc3Bhbj48L3NwYW4+PC9saT48bGk+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IHJnYigxMjcsIDEyNywgMTI3KTsiIGxhbmc9IkVOLVVTIj48c3BhbiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7Ij5QV1JfTU9ERV9JVF9GQUxMSU5HIHRvIFBXUl9QVkRfTU9ERV9JVF9GQUxMSU5HPG86cD48L286cD48L3NwYW4+PC9zcGFuPjwvbGk+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiByZ2IoMTI3LCAxMjcsIDEyNyk7IiBsYW5nPSJFTi1VUyI+PHNwYW4gc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyI+UFdSX01PREVfSVRfUklTSU5HX0ZBTExJTkcgdG8gUFdSX1BWRF9NT0RFX0lUX1JJU0lOR19GQUxMSU5HPG86cD48L286cD48L3NwYW4+PC9zcGFuPjwvbGk+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiByZ2IoMTI3LCAxMjcsIDEyNyk7IiBsYW5nPSJFTi1VUyI+PHNwYW4gc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyI+UFdSX01PREVfSVRfUklTSU5HIHRvIFBXUl9QVkRfTU9ERV9JVF9SSVNJTkc8bzpwPjwvbzpwPjwvc3Bhbj48L3NwYW4+PC9saT48L3VsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogcmdiKDEyNywgMTI3LCAxMjcpOyIgbGFuZz0iRU4tVVMiPjxzcGFuIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsiPkFkZCBuZXcKKyAgICAgZGVmaW5lczogUFdSX1BWRF9NT0RFX0VWRU5UX1JJU0lORywgUFdSX1BWRF9NT0RFX0VWRU5UX0ZBTExJTkcgYW5kCisgICAgIFBXUl9QVkRfTU9ERV9FVkVOVF9SSVNJTkdfRkFMTElORzxvOnA+PC9vOnA+PC9zcGFuPjwvc3Bhbj48L2xpPjxsaT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogcmdiKDEyNywgMTI3LCAxMjcpOyIgbGFuZz0iRU4tVVMiPjxzcGFuIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsiPkNoYW5nZWQKKyAgICAgX19IQUxfUFZEX0VYVElfRU5BQkxFX0lUKCkgbWFjcm88c3BhbiBzdHlsZT0iIj4mbmJzcDsKKyAgICAgPC9zcGFuPmRlZmluaXRpb246IF9fRVhUSUxJTkVfXyBhcmd1bWVudCBubyBsb25nZXIgbmVlZGVkCisgICAgIChQV1JfRVhUSV9MSU5FX1BWRCBpcyB1c2VkIGltcGxpY2l0bHkpPG86cD48L286cD48L3NwYW4+PC9zcGFuPjwvbGk+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiByZ2IoMTI3LCAxMjcsIDEyNyk7IiBsYW5nPSJFTi1VUyI+PHNwYW4gc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyI+Q2hhbmdlZAorICAgICBfX0hBTF9QVkRfRVhUSV9ESVNBQkxFX0lUKCkgbWFjcm8gZGVmaW5pdGlvbjogX19FWFRJTElORV9fIGFyZ3VtZW50IG5vCisgICAgIGxvbmdlciBuZWVkZWQgKFBXUl9FWFRJX0xJTkVfUFZEIGlzIHVzZWQgaW1wbGljaXRseSk8bzpwPjwvbzpwPjwvc3Bhbj48L3NwYW4+PC9saT48bGk+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IHJnYigxMjcsIDEyNywgMTI3KTsiIGxhbmc9IkVOLVVTIj48c3BhbiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7Ij5DaGFuZ2VkCisgICAgIF9fSEFMX1BWRF9FWFRJX0dFVF9GTEFHICgpIG1hY3JvIGRlZmluaXRpb246IF9fRVhUSUxJTkVfXyBhcmd1bWVudCBubworICAgICBsb25nZXIgbmVlZGVkIChQV1JfRVhUSV9MSU5FX1BWRCBpcyB1c2VkIGltcGxpY2l0bHkpPG86cD48L286cD48L3NwYW4+PC9zcGFuPjwvbGk+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiByZ2IoMTI3LCAxMjcsIDEyNyk7IiBsYW5nPSJFTi1VUyI+PHNwYW4gc3R5bGU9ImNvbG9yOiB3aW5kb3d0ZXh0OyI+Q2hhbmdlZAorICAgICBfSEFMX1BWRF9FWFRJX0NMRUFSX0ZMQUcgKCkgbWFjcm8gZGVmaW5pdGlvbjogX19FWFRJTElORV9fIGFyZ3VtZW50IG5vCisgICAgIGxvbmdlciBuZWVkZWQgKFBXUl9FWFRJX0xJTkVfUFZEIGlzIHVzZWQgaW1wbGljaXRseSk8L3NwYW4+PC9zcGFuPjwvbGk+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGxpbmUtaGVpZ2h0OiAxMTUlOyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogd2luZG93dGV4dDsiIGxhbmc9IkVOLVVTIj5BZGQKK25ldyBtYWNyb3MgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9FVkVOVCgpLAorX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfRVZFTlQoKSw8c3BhbiBzdHlsZT0iIj4mbmJzcDsKKzwvc3Bhbj5fX0hBTF9QV1JfUFZEX0VYVElfQ0xFQVJfRUdERV9UUklHR0VSKCksCitfX0hBTF9QV1JfUFZEX0VYVElfU0VUX0ZBTExJTkdfRUdERV9UUklHR0VSKCkgYW5kCitfX0hBTF9QV1JfUFZEX0VYVElfU0VUX1JJU0lOR19FREdFX1RSSUdHRVIoKTwvc3Bhbj48L2xpPjwvdWw+PC91bD48L3VsPgorCisKKworCisKKzxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGxpbmUtaGVpZ2h0OiAxMTUlOyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogcmdiKDEyNywgMTI3LCAxMjcpOyIgbGFuZz0iRU4tVVMiPjwvc3Bhbj48dWwgc3R5bGU9Imxpc3Qtc3R5bGUtdHlwZTogc3F1YXJlOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+SEFMIFJDQyA8L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+dXBkYXRlJm5ic3A7KGZvciA8L3NwYW4+PGI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IGJsYWNrOyIgbGFuZz0iRU4tVVMiPlNUTTMyRjMwM3hFPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPik8bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5SQ0NfT2NzSW5pdFR5cGVEZWYgYW5kIFJDQ19QTExJbml0VHlwZURlZiBkZWZpbml0aW9ucyBhcmUgbm93IHByb2R1Y3QgZGVwZW5kZW50OiZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPjwvc3Bhbj48L2xpPjx1bCBzdHlsZT0iY29sb3I6IGJsYWNrOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPlNUTTMyRjMwM3hFOjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWRkZWQgUFJFRElWIGZpZWxkIHRvIFJDQ19QTExJbml0VHlwZURlZjogdXNlZCB0byBzZXQgdGhlCisgICAgIGRlc2lyZWQgcHJlLWRpdmlzaW9uIGZhY3RvciB3aGF0ZXZlciB0aGUgUExMIGNsb2NrIHNvdXJjZSBpcyAoSFNJIG9yIEhTRSk8L3NwYW4+PHNwYW4gY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7OyIgbGFuZz0iRU4tVVMiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPi48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+UmVtb3ZlZCBmaWVsZCBIU0VQcmVkaXZWYWx1ZSBmcm9tIFJDQ19Pc2NJbml0VHlwZURlZiAocmVwbGFjZWQgYnkgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+UFJFRElWIGZpZWxkIGluJm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+UkNDX1BMTEluaXRUeXBlRGVmKTwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPk90aGVyIEYzIHByb2R1Y3RzOiBubyBjaGFuZ2UgaW4mbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5SQ0NfT2NzSW5pdFR5cGVEZWYgYW5kIFJDQ19QTExJbml0VHlwZURlZiBkZWZpbml0aW9uczwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWRkIG5ldyBkZWZpbml0aW9uIG9mIFJDQ19QZXJpcGhDTEtJbml0VHlwZURlZjxzcGFuIHN0eWxlPSIiPiZuYnNwOyA8L3NwYW4+dG8gZml0IFNUTTMyRjMwM3hFIDxzcGFuIHN0eWxlPSIiPiZuYnNwOzwvc3Bhbj5jbG9jayBzZWxlY3Rpb24gY2FwYWJpbGl0aWVzIChlLmcgc2VsZWN0IFRJTTIwCisgICAgIGNsb2NrIHNvdXJjZSk8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5BZGQgbmV3IGRlZmluZXMgdG8gc2VsZWN0IHRoZSBwcmUtZGl2aXNpb24gZmFjdG9yJm5ic3A7KFJDQ19QUkVESVZfRElWeCk8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5BZGQgbmV3IGRlZmluZXMgdG8gc2V0IFRJTTIwIGNsb2NrIHNvdXJjZSAoUkNDX1BFUklQSENMS19USU0yMCwgUkNDX1RJTTIwQ0xLX0hDTEsgYW5kCisgICAgIFJDQ19USU0yMENMS19QTExDTEspPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWRkIG5ldyBkZWZuZXMgdG8gc2V0Jm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+VElNMyAmYW1wOyBUSU00PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+IGNsb2NrIHNvdXJjZSZuYnNwOyAoPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+UkNDX1BFUklQSENMS19USU0zNDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPiwgUkNDX1RJTTM0Q0xLX0hDTEssIFJDQ19USU0zNENMS19QQ0xLKTxicj48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5BZGQgRk1DIHJlbGF0ZWQgbWFjcm9zOiBfX0ZNQ19DTEtfRU5BQkxFKCksIF9fRk1DX0NMS19ESVNBQkxFKCksIF9fRk1DX0ZPUkNFX1JFU0VUKCkgYW5kIF9fRk1DX1JFTEVBU0VfUkVTRVQoKTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkFkZCBHUElPIHBvcnQgRyByZWxhdGVkIG1hY3JvczogX19HUElPR19DTEtfRU5BQkxFKCksIF9fR1BJT0dfQ0xLX0RJU0FCTEUoKSwKKyAgICAgX18gR1BJT0cgX0ZPUkNFX1JFU0VUKCkgYW5kIF9fR1BJT0cgX1JFTEVBU0VfUkVTRVQoKTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkFkZCBHUElPIHBvcnQgSCByZWxhdGVkIG1hY3JvczpfIF9fR1BJT0hfQ0xLX0VOQUJMRSgpLCBfX0dQSU9IX0NMS19ESVNBQkxFKCksCisgICAgIF9fRk1DXyBHUElPSCBfUkVTRVQoKSBhbmQgX19HUElPSCBfUkVMRUFTRV9SRVNFVCgpPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+QWRkIFNQSTQgcmVsYXRlZCBtYWNyb3M6IDxzcGFuIHN0eWxlPSIiPiZuYnNwOzwvc3Bhbj5fX1NQSTRfQ0xLX0VOQUJMRSgpLAorICAgICBfX1NQSTRfQ0xLX0RJU0FCTEUoKSwgX18gU1BJNF9GT1JDRV9SRVNFVCgpIGFuZCBfX1NQSTRfUkVMRUFTRV9SRVNFVCgpPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGxpbmUtaGVpZ2h0OiAxMTUlOyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogYmxhY2s7IiBsYW5nPSJFTi1VUyI+QWRkIFRJTTIwIHJlbGF0ZWQgbWFjcm9zOiBfX1RJTTIwX0NMS19FTkFCTEUoKSwgX19USU0yMF9DTEtfRElTQUJMRSgpLAorX18gVElNMjBfRk9SQ0VfUkVTRVQoKSBhbmQgX19USU0yMF9SRUxFQVNFX1JFU0VUKCksIF9fSEFMX1JDQ19USU0yMF9DT05GSUcoKSAsIF9fSEFMX1JDQ19HRVRfVElNMjBfU09VUkNFKCk8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgbGluZS1oZWlnaHQ6IDExNSU7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiBibGFjazsiIGxhbmc9IkVOLVVTIj5BZGQgbmV3IG1hY3JvIHRvIHNldC9nZXQgdGhlIGNsb2NrIHNvdXJjZSBvZiBUSU0zICZhbXA7IFRJTTQ6IF9fSEFMX1JDQ19USU0zNF9DT05GSUcoKSBhbmQgJm5ic3A7X19IQUxfUkNDX0dFVF9USU0zNF9TT1VSQ0UoKTxicj48L3NwYW4+PC9saT48L3VsPjwvdWw+PHVsIHN0eWxlPSJsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsiPjxsaT48Yj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkhBTCBTTUFSVENBUkQKKzwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGxpbmUtaGVpZ2h0OiAxMTUlOyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogd2luZG93dGV4dDsiIGxhbmc9IkVOLVVTIj5DaGFuZ2UmbmJzcDtTTUFSVENBUkRfQWR2RmVhdHVyZUNvbmZpZygpCitmcm9tIGV4cG9ydGVkIHRvIHN0YXRpYyBwcml2YXRlIGZ1bmN0aW9uPC9zcGFuPjwvbGk+PC91bD48dWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGNvbG9yOiB3aW5kb3d0ZXh0OyIgbGFuZz0iRU4tVVMiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBsaW5lLWhlaWdodDogMTE1JTsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IHdpbmRvd3RleHQ7IiBsYW5nPSJFTi1VUyI+VEMgZW5hYmxlZCBhbmQgVFhFIGRpc2FibGVkIGF0IHRoZSBlbmQgb2YgVFggaW4gSVQKK21vZGU8L3NwYW4+PC9saT48L3VsPjwvdWw+CisKKworCis8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwY20gNC41cHQgNTMuNHB0OyB0ZXh0LWluZGVudDogLTE4cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogU3ltYm9sOyBjb2xvcjogd2luZG93dGV4dDsiIGxhbmc9IkVOLVVTIj48c3BhbiBzdHlsZT0iIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OzsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgZm9udC1zaXplOiA3cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IGZvbnQtc2l6ZS1hZGp1c3Q6IG5vbmU7IGZvbnQtc3RyZXRjaDogbm9ybWFsOyI+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgY29sb3I6IHdpbmRvd3RleHQ7IiBsYW5nPSJFTi1VUyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGNvbG9yOiB3aW5kb3d0ZXh0OyIgbGFuZz0iRU4tVVMiPjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KKworPHVsIHN0eWxlPSJsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsiPjxsaT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFN5bWJvbDsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iIiBsYW5nPSJFTi1VUyI+PHNwYW4gc3R5bGU9IiI+PC9zcGFuPjwvc3Bhbj48Yj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkhBTCBTTUJVUyA8L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBsaW5lLWhlaWdodDogMTE1JTsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IHdpbmRvd3RleHQ7IiBsYW5nPSJFTi1VUyI+Rml4IHdyb25nIFN0YXRlIGFmdGVyIGEgUEVDIGZhaWxlZDwvc3Bhbj48L2xpPjxsaT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBsaW5lLWhlaWdodDogMTE1JTsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IHdpbmRvd3RleHQ7Ij5GaXggc2xhdmUgYWNrbm93bGVkZ2UgaXNzdWU8L3NwYW4+PC9saT48L3VsPjwvdWw+PHAgY2xhc3M9Ik1zb0xpc3RQYXJhZ3JhcGhDeFNwTGFzdCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGNtIDQuNXB0IDUzLjRwdDsgdGV4dC1pbmRlbnQ6IC0xOHB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgY29sb3I6IHdpbmRvd3RleHQ7Ij48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgY29sb3I6IHdpbmRvd3RleHQ7IiBsYW5nPSJFTi1VUyI+PG86cD48L286cD48L3NwYW4+PC9wPgorCis8dWwgc3R5bGU9Imxpc3Qtc3R5bGUtdHlwZTogc3F1YXJlOyI+PGxpPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogU3ltYm9sOyI+PC9zcGFuPjxzcGFuIHN0eWxlPSIiIGxhbmc9IkVOLVVTIj48c3BhbiBzdHlsZT0iIj48L3NwYW4+PC9zcGFuPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+SEFMIFNQSSA8L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBsaW5lLWhlaWdodDogMTE1JTsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IHdpbmRvd3RleHQ7IiBsYW5nPSJFTi1VUyI+Rml4IENvZGVTb25hciB3YXJuaW5nOiB1bnJlYWNoYWJsZSBDYWxsIGluCitTUElfQ2xvc2VSeFR4X0lTUigpPC9zcGFuPjwvbGk+PC91bD48L3VsPjxwIGNsYXNzPSJNc29MaXN0UGFyYWdyYXBoIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwY20gNC41cHQgODMuMTZwdDsgdGV4dC1pbmRlbnQ6IC0xOHB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFN5bWJvbDsgY29sb3I6IHdpbmRvd3RleHQ7IiBsYW5nPSJFTi1VUyI+PHNwYW4gc3R5bGU9IiI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDs7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGZvbnQtc2l6ZTogN3B0OyBsaW5lLWhlaWdodDogbm9ybWFsOyBmb250LXNpemUtYWRqdXN0OiBub25lOyBmb250LXN0cmV0Y2g6IG5vcm1hbDsiPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGNvbG9yOiB3aW5kb3d0ZXh0OyIgbGFuZz0iRU4tVVMiPjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KKworPHVsIHN0eWxlPSJsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsiPjxsaT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFN5bWJvbDsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iIiBsYW5nPSJFTi1VUyI+PHNwYW4gc3R5bGU9IiI+PC9zcGFuPjwvc3Bhbj48Yj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkhBTCBTUkFNPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPiZuYnNwOyg8L3NwYW4+PGI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IGJsYWNrOyIgbGFuZz0iRU4tVVMiPlNUTTMyRjMwM3hFIHNwZWNpZmljPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPik8L3NwYW4+PC9saT48dWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGxpbmUtaGVpZ2h0OiAxMTUlOyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogYmxhY2s7IiBsYW5nPSJFTi1VUyI+Rk1DOiBnZW5lcmljCitmaXJtd2FyZSB0byBkcml2ZSBTUkFNIG1lbW9yaWVzIG1vdW50ZWQgYXMgZXh0ZXJuYWwgZGV2aWNlPC9zcGFuPjwvbGk+PC91bD48L3VsPgorCisKKworPHVsIHN0eWxlPSJsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsiPjxsaT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFN5bWJvbDsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iIiBsYW5nPSJFTi1VUyI+PHNwYW4gc3R5bGU9IiI+PC9zcGFuPjwvc3Bhbj48Yj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkhBTCBUSU0gPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPnVwZGF0ZSZuYnNwOyhmb3IgPC9zcGFuPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiBibGFjazsiIGxhbmc9IkVOLVVTIj5TVE0zMkYzMDN4RTwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj4pPC9zcGFuPjwvbGk+PHVsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBsaW5lLWhlaWdodDogMTE1JTsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IGJsYWNrOyIgbGFuZz0iRU4tVVMiPkFkZAorZGVmaW5lcyB0byBzZXQgVElNMjAgb3B0aW9uIHJlZ2lzdGVyIChsaW5rIGZyb20gYW5hbG9nIHdhdGNoZG9nIGFuZCBUSU0yMCBFVFIpPC9zcGFuPjwvbGk+PC91bD48L3VsPjx1bCBzdHlsZT0ibGlzdC1zdHlsZS10eXBlOiBzcXVhcmU7Ij48bGk+PGI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5IQUwgVUFSVCA8L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBsaW5lLWhlaWdodDogMTE1JTsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IHdpbmRvd3RleHQ7IiBsYW5nPSJFTi1VUyI+VEMgZW5hYmxlZCBhbmQgVFhFIGRpc2FibGVkIGF0IHRoZSBlbmQgb2YgVFggaW4gSVQKK21vZGU8L3NwYW4+PC9saT48L3VsPjwvdWw+PHVsIHN0eWxlPSJsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsiPjxsaT48Yj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPkhBTCBVU0FSVCA8L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBsaW5lLWhlaWdodDogMTE1JTsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IHdpbmRvd3RleHQ7IiBsYW5nPSJFTi1VUyI+VEMgZW5hYmxlZCBhbmQgVFhFIGRpc2FibGVkIGF0IHRoZSBlbmQgb2YgVFggaW4gSVQKK21vZGU8L3NwYW4+PC9saT48L3VsPjwvdWw+PGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IGluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAyMDBweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuMC4xCisvIDE4LUp1bmUtMjAxNDxvOnA+PC9vOnA+PC9zcGFuPjwvaDM+PHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGNtIDQuNXB0IDE4cHQ7Ij48YiBzdHlsZT0iIj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyI+TWFpbgorQ2hhbmdlczwvc3Bhbj48L3U+PC9iPjwvcD4KKzx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMGNtOyBsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij4KKworCisKKworCisKKworPHAgY2xhc3M9Ik1zb0xpc3RQYXJhZ3JhcGgiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgZ2VuZXJpYzwvc3Bhbj4gdXBkYXRlPGJyPjwvc3Bhbj48L3A+PHVsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+Rml4IGZsYWcgY2xlYXIgcHJvY2VkdXJlOiB1c2UgYXRvbWljIHdyaXRlIG9wZXJhdGlvbiA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPiI9IiA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPmluc3RlYWQgb2YgcmVhZHktbW9kaWZ5LXdyaXRlIG9wZXJhdGlvbiAifD0iIG9yICImYW1wOz0iPC9zcGFuPjwvbGk+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5GaXgKK29uIFRpbWVvdXQgbWFuYWdlbWVudCwgVGltZW91dCB2YWx1ZSBzZXQgdG8gMCBwYXNzZWQgdG8gQVBJCithdXRvbWF0aWNhbGx5IGV4aXRzIHRoZSBmdW5jdGlvbiBhZnRlciBjaGVja2luZyB0aGUgZmxhZyB3aXRob3V0IGFueQord2FpdC48L3NwYW4+PC9saT48bGk+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkFkZAorbmV3IG1hY3JvIF9fSEFMX1JFU0VUX0hBTkRMRV9TVEFURSB0byByZXNldCBhIGdpdmVuIGhhbmRsZSBzdGF0ZS48L3NwYW4+PC9saT48L3VsPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPgorCisKKworCisKKworCis8cCBjbGFzcz0iTXNvTGlzdFBhcmFncmFwaCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBBREM8L3NwYW4+IHVwZGF0ZTxicj48L3NwYW4+PC9wPjwvbGk+PHVsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+UmVuYW1lIGRlZmluZXM6PC9zcGFuPjwvbGk+PHVsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+QURDX0VYVEVSTkFMVFJJR0NPTlZfRXh0X0lUMTEgdG8gQURDX0VYVEVSTkFMVFJJR0NPTlZfRVhUX0lUMTE8L3NwYW4+PC9saT48bGk+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkFEQ19FWFRFUk5BTFRSSUdDT05WX0V4dF9JVDEyIHRvIEFEQ19FWFRFUk5BTFRSSUdDT05WX0VYVF9JVDEyPC9zcGFuPjwvbGk+PC91bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkZpeCBkZWZpbmUgQURDX1NPRlRXQVJFX1NUQVJUPC9zcGFuPjwvbGk+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5VcGRhdGUgZXh0ZXJuYWwgdHJpZ2dlciBkZWZpbmVzIHRvIHJlbW92ZSBIUlRJTSB0cmlnZ2VycyBmb3IgU1RNMzJGMzI4eHggYW5kIFRJTTggdHJpZ2dlcnMgZm9yIFNUTTMyRjMwMnhDPC9zcGFuPjwvbGk+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5BZGQgQURDMV8yX0VYVEVSTkFMVFJJR19UNF9DQzQgZm9yIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+U1RNMzJGMzAzeDggYW5kJm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5TVE0zMkYzMjh4eDwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxwIGNsYXNzPSJNc29MaXN0UGFyYWdyYXBoIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIENFQzwvc3Bhbj4gdXBkYXRlPGJyPjwvc3Bhbj48L3A+PC9saT48dWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5Qcm9jZXNzIG5vIG1vcmUgbG9ja2VkIGR1cmluZyB0aGUgdHJhbnNtaXNzaW9uIGluIGludGVycnVwdCBtb2RlLjwvc3Bhbj4mbmJzcDs8L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxwIGNsYXNzPSJNc29MaXN0UGFyYWdyYXBoIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIENPTVA8L3NwYW4+IHVwZGF0ZTxicj48L3NwYW4+PC9wPjwvbGk+PHVsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+Rml4IG9uIDMyLWJpdCByZWdpc3RlciBDT01QIENTUiBhY2Nlc3NlcyBmb3IgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5TVE0zMkYzNzN4QyBhbmQgU1RNMzJGMzc4eHggZGV2aWNlcy48L3NwYW4+PC9saT48bGk+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+QWRkIG5ldyBkZWZpbmVzIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+Zm9yIFNUTTMyRjM3M3hDIGFuZCBTVE0zMkYzNzh4eCBjb21wYXJhdG9yczombmJzcDs8L3NwYW4+PC9saT48L3VsPjwvdWw+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEyMHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPkNPTVBfT1VUUFVUX1RJTTNJQzEsCitDT01QX09VVFBVVF9USU0zT0NSRUZDTFIsIENPTVBfT1VUUFVUX1RJTTJJQzQ8L3NwYW4+IGFuZAorPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPkNPTVBfT1VUUFVUX1RJTTJPQ1JFRkNMUiZuYnNwOzwvc3Bhbj48L3NwYW4+PGJyPjwvZGl2PjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiA4MHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPmluc3RlYWQgb2YgcHJldmlvdXMgZGVmaW5lcyZuYnNwOzwvc3Bhbj48YnI+PC9kaXY+PGRpdiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyBtYXJnaW4tbGVmdDogMTIwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+Q09NUF9PVVRQVVRfQ09NUDFfVElNM0lDMSwKK0NPTVBfT1VUUFVUX0NPTVAxX1RJTTNPQ1JFRkNMUiwgQ09NUF9PVVRQVVRfQ09NUDFfVElNMklDNCwmbmJzcDsKK0NPTVBfT1VUUFVUX0NPTVAxX1RJTTJPQ1JFRkNMUiwgPGJyPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+Q09NUF9PVVRQVVRfQ09NUDJfVElNM0lDMSwgQ09NUF9PVVRQVVRfQ09NUDJfVElNM09DUkVGQ0xSLCBDT01QX09VVFBVVF9DT01QMl9USU0ySUM0LCZuYnNwOyBDT01QX09VVFBVVF9DT01QMl9USU0yT0NSRUZDTFIuPC9zcGFuPjwvZGl2Pjx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMGNtOyBsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48cCBjbGFzcz0iTXNvTGlzdFBhcmFncmFwaCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBETUE8L3NwYW4+IHVwZGF0ZTxicj48L3NwYW4+PC9wPjwvbGk+PHVsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+Rml4IGluJm5ic3A7PHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPkhBTF9ETUFfUG9sbEZvclRyYW5zZmVyKCk8L3NwYW4+IHRvIHNldCBlcnJvciBjb2RlIDxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5IQUxfRE1BX0VSUk9SX1RFIDwvc3Bhbj5pbiBjYXNlIG9mIDxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5IQUxfRVJST1I8L3NwYW4+IHN0YXR1czwvc3Bhbj4mbmJzcDs8L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxwIGNsYXNzPSJNc29MaXN0UGFyYWdyYXBoIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEdQSU88L3NwYW4+IHVwZGF0ZTxicj48L3NwYW4+PC9wPjx1bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkZpeCA8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+R1BJT19BRjVfU1BJMTwvc3Bhbj4gZGVmaW5lIGluc3RlYWQgb2YgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5HUElPX0FGNV9TUEkxPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij4gZm9yIFNUTTMyRjMwM3g4IGRldmljZS48L3NwYW4+Jm5ic3A7PC9saT48L3VsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij48L3NwYW4+PC9zcGFuPjwvbGk+PC91bD48dWwgc3R5bGU9Im1hcmdpbi10b3A6IDBjbTsgbGlzdC1zdHlsZS10eXBlOiBzcXVhcmU7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+CisKKworCisKKworCisKKzxwIGNsYXNzPSJNc29MaXN0UGFyYWdyYXBoIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEhSVElNPC9zcGFuPiB1cGRhdGU8YnI+PC9zcGFuPjwvcD48L2xpPjx1bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkhSVElNIHBlcmlwaGVyYWwgbm90IGF2YWlsYWJsZSBmb3IgU1RNMzJGMzI4eHggZGV2aWNlLjwvc3Bhbj48L2xpPjxsaT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+Rml4IG1hY3JvcyZuYnNwO19fSEFMX0hSVElNX0NMRUFSX0ZMQUcsIF9fSEFMX0hSVElNX01BU1RFUl9DTEVBUl9GTEFHIGFuZCBfX0hBTF9IUlRJTV9USU1FUl9DTEVBUl9GTEFHPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+CisKKworCisKKworCisKKzxwIGNsYXNzPSJNc29MaXN0UGFyYWdyYXBoIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEkyQzwvc3Bhbj4gdXBkYXRlPGJyPjwvc3Bhbj48L3A+PC9saT48dWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5BZGQKK21hbmFnZW1lbnQgb2YgTkFDSyBldmVudCBpbiBNYXN0ZXIgdHJhbnNtaXR0ZXIgbW9kZSBhbmQgU2xhdmUKK3RyYW5zbWl0dGVyL3JlY2VpdmVyIG1vZGVzIChvbmx5IGluIHBvbGxpbmcgbW9kZSksIGluIHRoYXQgY2FzZSB0aGUKK2N1cnJlbnQgdHJhbnNmZXIgaXMgc3RvcHBlZC48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48cCBjbGFzcz0iTXNvTGlzdFBhcmFncmFwaCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBJUkRBPC9zcGFuPiB1cGRhdGU8YnI+PC9zcGFuPjwvcD48dWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5BZGQgbmV3IGVudW0gdHlwZWRlZiA8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+SVJEQV9DbG9ja1NvdXJjZVR5cGVEZWY8L3NwYW4+PC9zcGFuPjwvbGk+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5BZGQgbmV3IG1hY3JvIF9fSEFMX0lSREFfR0VUQ0xPQ0tTT1VSQ0U8L3NwYW4+PC9saT48bGk+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkNoYW5nZSBpbiA8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+SEFMX0lSREFfVHJhbnNtaXRfSVQoKTwvc3Bhbj4gdG8gZW5hYmxlIElSREFfSVRfVFhFIGluc3RlYWQgb2YgSVJEQV9JVF9UQy48L3NwYW4+PC9saT48bGk+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+UHJvY2VzcyBubyBtb3JlIGxvY2tlZCBkdXJpbmcgdGhlIHRyYW5zbWlzc2lvbiBpbiBpbnRlcnJ1cHQgbW9kZS48L3NwYW4+PC9saT48L3VsPjwvbGk+PC91bD48dWwgc3R5bGU9Im1hcmdpbi10b3A6IDBjbTsgbGlzdC1zdHlsZS10eXBlOiBzcXVhcmU7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+CisKKworCisKKworCisKKzxwIGNsYXNzPSJNc29MaXN0UGFyYWdyYXBoIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIE9QQU1QPC9zcGFuPiB1cGRhdGU8YnI+PC9zcGFuPjwvcD48L2xpPjx1bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPl9fU1lTQ0ZHX0NMS19FTkFCTEUoKSBpcyBub3cgaGFuZGxlZCBpbnRlcm5hbGx5IGluIEhBTF9PUEFNUF9Jbml0KCkgYW5kIG5vIG1vcmUgaW4gdXNlciBIQUxfT1BBTVBfTXNwSW5pdCgpLjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPgorICA8cCBjbGFzcz0iTXNvTGlzdFBhcmFncmFwaCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBQQ0QgPC9zcGFuPnVwZGF0ZTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PC9zcGFuPjwvcD4KKyAgICAgICAgICAgICAgPC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPgorICAgIDxwIGNsYXNzPSJNc29MaXN0UGFyYWdyYXBoIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+QWRkIG5ldyBtYWNybyA8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+X19IQUxfVVNCX0VYVElfR0VORVJBVEVfU1dJVDwvc3Bhbj48L3NwYW4+PC9wPgorICA8L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxwIGNsYXNzPSJNc29MaXN0UGFyYWdyYXBoIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFBXUjwvc3Bhbj4gdXBkYXRlPGJyPjwvc3Bhbj48L3A+PC9saT48dWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5GaXggaW4gPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPkhBTF9QV1JfRW50ZXJTVEFOREJZTW9kZSgpPC9zcGFuPiB0byBub3QgY2xlYXIgV2FrZXVwIGZsYWcgKFdVRiksIHdoaWNoIG5lZWQgdG8gYmUgY2xlYXJlZCBhdCBhcHBsaWNhdGlvbiBsZXZlbCBiZWZvcmUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHAgY2xhc3M9Ik1zb0xpc3RQYXJhZ3JhcGgiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgUkNDPC9zcGFuPiB1cGRhdGU8YnI+PC9zcGFuPjwvcD48L2xpPjx1bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkNoYW5nZSBmb3IgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5TVE0zMkYzMDN4OCwgU1RNMzJGMzM0eDggYW5kIFNUTTMyRjMyOHh4IGRldmljZXM6PC9zcGFuPjwvbGk+PHVsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5BZGQgbWlzc2luZyBtYWNybyBfX0RBQzJfRk9SQ0VfUkVTRVQ8L3NwYW4+PC9saT48L3VsPjx1bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPlJlbmFtZSA8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+UkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMjwvc3Bhbj4gaW50byA8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+UkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMTwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjwvc3Bhbj48L2xpPjwvdWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5SZW1vdmUgSFJUSU0xIHBlcmlwaGVyYWwgYW5kIGNsb2NraW5nIG1hY3JvcyBmb3IgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5TVE0zMkYzMjh4eCBkZXZpY2UuPC9zcGFuPjwvbGk+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5GaXggSFNJIENhbGlicmF0aW9uIGlzc3VlIHdoZW4gc2VsZWN0ZWQgYXMgU1lTQ0xLIDxicj48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij4KKworCisKKworCisKKworPHAgY2xhc3M9Ik1zb0xpc3RQYXJhZ3JhcGgiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgU01BUlRDQVJEPC9zcGFuPiB1cGRhdGU8YnI+PC9zcGFuPjwvcD48L2xpPjx1bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkNoYW5nZSBpbiA8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+SEFMX1NNQVJUQ0FSRF9UcmFuc21pdF9JVCgpPC9zcGFuPiB0byBlbmFibGUgU01BUlRDQVJEX0lUX1RYRSBpbnN0ZWFkIG9mIFNNQVJUQ0FSRF9JVF9UQy48L3NwYW4+PC9saT48bGk+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPlByb2Nlc3Mgbm8gbW9yZSBsb2NrZWQgZHVyaW5nIHRoZSB0cmFuc21pc3Npb24gaW4gaW50ZXJydXB0IG1vZGUuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHAgY2xhc3M9Ik1zb0xpc3RQYXJhZ3JhcGgiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgU01CVVM8L3NwYW4+IHVwZGF0ZTxicj48L3NwYW4+PC9wPjwvbGk+PHVsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+Rml4IFNsYXZlIGFja25vd2xlZGdlIGlzc3VlOiBTbGF2ZSBzaG91bGQgYWNrIGVhY2ggYml0IGFuZCBzbyBzdHJldGNoIHRoZSBsaW5lIHRpbGwgdGhlIGJpdCBpcyBub3QgYWNrPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHAgY2xhc3M9Ik1zb0xpc3RQYXJhZ3JhcGgiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgVElNPC9zcGFuPiB1cGRhdGU8YnI+PC9zcGFuPjwvcD48L2xpPjx1bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkZpeCBtYWNybyBfX0hBTF9USU1fUFJFU0NBTEVSPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHAgY2xhc3M9Ik1zb0xpc3RQYXJhZ3JhcGgiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgVFNDPC9zcGFuPiB1cGRhdGU8YnI+PC9zcGFuPjwvcD48L2xpPjx1bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkZpeCBkZWZpbmUmbmJzcDs8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+VFNDX0FDUV9NT0RFX1NZTkNIUk88L3NwYW4+PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+CisKKworCisKKworCisKKzxwIGNsYXNzPSJNc29MaXN0UGFyYWdyYXBoIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFVBUlQ8L3NwYW4+IHVwZGF0ZTxicj48L3NwYW4+PC9wPjwvbGk+PHVsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+Q2hhbmdlIGluIDxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5IQUxfTElOX0luaXQoKTwvc3Bhbj4gcGFyYW1ldGVyIEJyZWFrRGV0ZWN0TGVuZ3RoIHRvIHVpbnQzMl90PC9zcGFuPjwvbGk+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5DaGFuZ2UgaW4gPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPkhBTF9VQVJUX1RyYW5zbWl0X0lUKCk8L3NwYW4+IHRvIGVuYWJsZSBVQVJUX0lUX1RYRSBpbnN0ZWFkIG9mIFVBUlRfSVRfVEMuPC9zcGFuPjwvbGk+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPlByb2Nlc3Mgbm8gbW9yZSBsb2NrZWQgZHVyaW5nIHRoZSB0cmFuc21pc3Npb24gaW4gaW50ZXJydXB0IG1vZGUuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+CisKKworCisKKworCisKKzxwIGNsYXNzPSJNc29MaXN0UGFyYWdyYXBoIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFVTQVJUPC9zcGFuPiB1cGRhdGU8YnI+PC9zcGFuPjwvcD48L2xpPjx1bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkNoYW5nZSA8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+VVNBUlRfSW5pdFR5cGVEZWY8L3NwYW4+IGZpZWxkcyB0byB1aW50MzJfdCB0eXBlPC9zcGFuPjwvbGk+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5SZW5hbWUgX19VU0FSVF9FTkFCTEUgYW5kIF9fVVNBUlRfRElTQUJMRSBtYWNyb3MgdG8gcmVzcGVjdGl2ZWx5IDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+X19IQUxfVVNBUlRfRU5BQkxFIGFuZCBfX0hBTF9VU0FSVF9ESVNBQkxFPC9zcGFuPjwvbGk+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5DaGFuZ2UgaW4gPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPkhBTF9VU0FSVF9UcmFuc21pdF9JVCgpPC9zcGFuPiB0byBlbmFibGUgVVNBUlRfSVRfVFhFIGluc3RlYWQgb2YgVVNBUlRfSVRfVEMuPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48L3NwYW4+PC9saT48bGk+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPlByb2Nlc3Mgbm8gbW9yZSBsb2NrZWQgZHVyaW5nIHRoZSB0cmFuc21pc3Npb24gaW4gaW50ZXJydXB0IG1vZGUuPC9zcGFuPjwvbGk+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5DaGFuZ2UgaW4gPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPkhBTF9VU0FSVF9UcmFuc21pdFJlY2VpdmVfRE1BKCk8L3NwYW4+IHRvIG1hbmFnZSBETUEgaGFsZiB0cmFuc2ZlciBtb2RlPGJyPjwvc3Bhbj48L2xpPjwvdWw+PC91bD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXdlaWdodDogYm9sZDsiPiZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXdlaWdodDogYm9sZDsiPjwvc3Bhbj48aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDIwMHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS4wLjAKKy8gMDYtTWF5LTIwMTQ8bzpwPjwvbzpwPjwvc3Bhbj48L2gzPgorPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGNtIDQuNXB0IDE4cHQ7Ij48YiBzdHlsZT0iIj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyI+TWFpbgorQ2hhbmdlczwvc3Bhbj48L3U+PC9iPjwvcD4KKzx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMGNtOyIgdHlwZT0ic3F1YXJlIj48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5GaXJzdCBvZmZpY2lhbAorcmVsZWFzZSBvZiBTVE0zMkYzeHggSEFMIGRyaXZlcnMgZm9yIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXdlaWdodDogYm9sZDsiPlNUTTMyRjMwMXg2L3g4LAorPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtd2VpZ2h0OiBib2xkOyI+U1RNMzJGMzAyeDYveDgsJm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtd2VpZ2h0OiBib2xkOyI+U1RNMzJGMzAyeEIveEMsCis8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5TVE0zMkYzMDN4Ni94OCwmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5TVE0zMkYzNzN4Qi94QywKKzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXdlaWdodDogYm9sZDsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXdlaWdodDogYm9sZDsiPlNUTTMyRjMzNHg0L3g2L3g4PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtd2VpZ2h0OiBib2xkOyI+LCZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5TVE0zMkYzMTh4eCwgU1RNMzJGMzI4eHgsIFNUTTMyRjM1OHh4IGFuZCBTVE0zMkYzNzh4eAorPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ZGV2aWNlcy48L3NwYW4+PC9saT48L3VsPjxoMiBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiBpbml0aWFsOyI+PGEgbmFtZT0iTGljZW5zZSI+PC9hPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGNvbG9yOiB3aGl0ZTsiPkxpY2Vuc2U8bzpwPjwvbzpwPjwvc3Bhbj48L2gyPjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij48Zm9udCBzaXplPSItMSI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij4KK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorbWV0Ojwvc3Bhbj48YnI+CisgICAgICAgICAgICA8L2ZvbnQ+CisgICAgICAgICAgICA8b2w+PGxpPjxmb250IHNpemU9Ii0xIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPlJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48L3NwYW4+PC9mb250PjwvbGk+PGxpPjxmb250IHNpemU9Ii0xIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPlJlZGlzdHJpYnV0aW9ucworaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZgorY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPnRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjwvc3Bhbj48L2ZvbnQ+PC9saT48bGk+PGZvbnQgc2l6ZT0iLTEiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+TmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIDwvc3Bhbj48YnI+CisgICAgICAgICAgICAgICAgPC9mb250PgorICAgICAgICAgICAgICA8L2xpPjwvb2w+CisgICAgICAgICAgICA8Zm9udCBzaXplPSItMSI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLjwvc3Bhbj48YnI+CisgICAgICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjwvc3Bhbj48YnI+CisgICAgICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPlRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+UEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5QUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPk9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuPC9zcGFuPjwvZm9udD4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgPC9kaXY+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IGJsYWNrOyI+PC9zcGFuPgorPGRpdiBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyBtYXJnaW4tbGVmdDogNDBweDsiIGFsaWduPSJjZW50ZXIiPjxzcGFuIHN0eWxlPSJjb2xvcjogYmxhY2s7Ij4KKzxociBhbGlnbj0iY2VudGVyIiBzaXplPSIyIiB3aWR0aD0iMTAwJSI+PC9zcGFuPjwvZGl2PgorPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluIDQuNXB0IDAuNjYzNGluOyB0ZXh0LWFsaWduOiBjZW50ZXI7IiBhbGlnbj0iY2VudGVyIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogYmxhY2s7Ij5Gb3IKK2NvbXBsZXRlIGRvY3VtZW50YXRpb24gb24gPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5TVE0zMjxzcGFuIHN0eWxlPSJjb2xvcjogYmxhY2s7Ij4gTWljcm9jb250cm9sbGVycyB2aXNpdCA8L3NwYW4+PHU+PHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlOyI+PGEgaHJlZj0iaHR0cDovL3d3dy5zdC5jb20vaW50ZXJuZXQvbWN1L2ZhbWlseS8xNDEuanNwIiB0YXJnZXQ9Il9ibGFuayI+d3d3LnN0LmNvbS9TVE0zMjwvYT48L3NwYW4+PC91Pjwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IGJsYWNrOyI+PG86cD48L286cD48L3NwYW4+PC9wPgorPC90ZD4KKzwvdHI+Cis8L3Rib2R5PgorPC90YWJsZT4KKzxwIHN0eWxlPSJtYXJnaW4tbGVmdDogNDBweDsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7Ij48bzpwPjwvbzpwPjwvc3Bhbj48L3A+Cis8L3RkPgorPC90cj4KKzwvdGJvZHk+Cis8L3RhYmxlPgorPC9kaXY+Cis8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4KKzwvZGl2PgorPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9TcmMvTGVnYWN5L3N0bTMyZjN4eF9oYWxfY2FuLmMgYi9TcmMvTGVnYWN5L3N0bTMyZjN4eF9oYWxfY2FuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxOTJkNQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9MZWdhY3kvc3RtMzJmM3h4X2hhbF9jYW4uYwpAQCAtMCwwICsxLDE3MDAgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX2Nhbi5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBDQU4gSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZyAKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIENvbnRyb2xsZXIgQXJlYSBOZXR3b3JrIChDQU4pIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAKKyAgKiAgICAgICAgICAgKyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gICAgCisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gICAgICAgICAgICAKKyAgICAgICgjKSBFbmFibGUgdGhlIENBTiBjb250cm9sbGVyIGludGVyZmFjZSBjbG9jayB1c2luZyBfX0hBTF9SQ0NfQ0FOMV9DTEtfRU5BQkxFKCk7IAorICAgICAgIAorICAgICAgKCMpIENBTiBwaW5zIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgKCsrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgQ0FOIEdQSU9zIHVzaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246CisgICAgICAgICAgICAgX19IQUxfUkNDX0dQSU94X0NMS19FTkFCTEUoKTsgICAKKyAgICAgICAgKCsrKSBDb25uZWN0IGFuZCBjb25maWd1cmUgdGhlIGludm9sdmVkIENBTiBwaW5zIHRvIEFGOSB1c2luZyB0aGUgCisgICAgICAgICAgICAgIGZvbGxvd2luZyBmdW5jdGlvbiBIQUxfR1BJT19Jbml0KCk7IAorICAgICAgICAgICAgICAKKyAgICAgICgjKSBJbml0aWFsaXNlIGFuZCBjb25maWd1cmUgdGhlIENBTiB1c2luZyBIQUxfQ0FOX0luaXQoKSBmdW5jdGlvbi4gICAKKyAgICAgICAgICAgICAgICAgCisgICAgICAoIykgVHJhbnNtaXQgdGhlIGRlc2lyZWQgQ0FOIGZyYW1lIHVzaW5nIEhBTF9DQU5fVHJhbnNtaXQoKSBmdW5jdGlvbi4KKworICAgICAgKCMpIE9yIHRyYW5zbWl0IHRoZSBkZXNpcmVkIENBTiBmcmFtZSB1c2luZyBIQUxfQ0FOX1RyYW5zbWl0X0lUKCkgZnVuY3Rpb24uCisKKyAgICAgICgjKSBSZWNlaXZlIGEgQ0FOIGZyYW1lIHVzaW5nIEhBTF9DQU5fUmVjZWl2ZSgpIGZ1bmN0aW9uLgorCisgICAgICAoIykgT3IgcmVjZWl2ZSBhIENBTiBmcmFtZSB1c2luZyBIQUxfQ0FOX1JlY2VpdmVfSVQoKSBmdW5jdGlvbi4KKworICAgICAqKiogUG9sbGluZyBtb2RlIElPIG9wZXJhdGlvbiAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0gICAgCisgICAgICAgKCspIFN0YXJ0IHRoZSBDQU4gcGVyaXBoZXJhbCB0cmFuc21pc3Npb24gYW5kIHdhaXQgdGhlIGVuZCBvZiB0aGlzIG9wZXJhdGlvbiAKKyAgICAgICAgICAgdXNpbmcgSEFMX0NBTl9UcmFuc21pdCgpLCBhdCB0aGlzIHN0YWdlIHVzZXIgY2FuIHNwZWNpZnkgdGhlIHZhbHVlIG9mIHRpbWVvdXQKKyAgICAgICAgICAgYWNjb3JkaW5nIHRvIGhpcyBlbmQgYXBwbGljYXRpb24KKyAgICAgICAoKykgU3RhcnQgdGhlIENBTiBwZXJpcGhlcmFsIHJlY2VwdGlvbiBhbmQgd2FpdCB0aGUgZW5kIG9mIHRoaXMgb3BlcmF0aW9uIAorICAgICAgICAgICB1c2luZyBIQUxfQ0FOX1JlY2VpdmUoKSwgYXQgdGhpcyBzdGFnZSB1c2VyIGNhbiBzcGVjaWZ5IHRoZSB2YWx1ZSBvZiB0aW1lb3V0CisgICAgICAgICAgIGFjY29yZGluZyB0byBoaXMgZW5kIGFwcGxpY2F0aW9uIAorICAgICAgIAorICAgICAqKiogSW50ZXJydXB0IG1vZGUgSU8gb3BlcmF0aW9uICoqKiAgICAKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgWy4uXSAgICAKKyAgICAgICAoKykgU3RhcnQgdGhlIENBTiBwZXJpcGhlcmFsIHRyYW5zbWlzc2lvbiB1c2luZyBIQUxfQ0FOX1RyYW5zbWl0X0lUKCkKKyAgICAgICAoKykgU3RhcnQgdGhlIENBTiBwZXJpcGhlcmFsIHJlY2VwdGlvbiB1c2luZyBIQUxfQ0FOX1JlY2VpdmVfSVQoKSAgICAgICAgIAorICAgICAgICgrKSBVc2UgSEFMX0NBTl9JUlFIYW5kbGVyKCkgY2FsbGVkIHVuZGVyIHRoZSB1c2VkIENBTiBJbnRlcnJ1cHQgc3Vicm91dGluZQorICAgICAgICgrKSBBdCBDQU4gZW5kIG9mIHRyYW5zbWlzc2lvbiBIQUxfQ0FOX1R4Q3BsdENhbGxiYWNrKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuIAorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0NBTl9UeENwbHRDYWxsYmFjayAKKyAgICAgICAoKykgSW4gY2FzZSBvZiBDQU4gRXJyb3IsIEhBTF9DQU5fRXJyb3JDYWxsYmFjaygpIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbiAKKyAgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9DQU5fRXJyb3JDYWxsYmFjaworIAorICAgICAqKiogQ0FOIEhBTCBkcml2ZXIgbWFjcm9zIGxpc3QgKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKyAgICAgWy4uXQorICAgICAgIEJlbG93IHRoZSBsaXN0IG9mIG1vc3QgdXNlZCBtYWNyb3MgaW4gQ0FOIEhBTCBkcml2ZXIuCisgICAgICAgCisgICAgICAoKykgX19IQUxfQ0FOX0VOQUJMRV9JVDogRW5hYmxlIHRoZSBzcGVjaWZpZWQgQ0FOIGludGVycnVwdHMKKyAgICAgICgrKSBfX0hBTF9DQU5fRElTQUJMRV9JVDogRGlzYWJsZSB0aGUgc3BlY2lmaWVkIENBTiBpbnRlcnJ1cHRzCisgICAgICAoKykgX19IQUxfQ0FOX0dFVF9JVF9TT1VSQ0U6IENoZWNrIGlmIHRoZSBzcGVjaWZpZWQgQ0FOIGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBkaXNhYmxlZAorICAgICAgKCspIF9fSEFMX0NBTl9DTEVBUl9GTEFHOiBDbGVhciB0aGUgQ0FOJ3MgcGVuZGluZyBmbGFncworICAgICAgKCspIF9fSEFMX0NBTl9HRVRfRkxBRzogR2V0IHRoZSBzZWxlY3RlZCBDQU4ncyBmbGFnIHN0YXR1cworICAgICAgCisgICAgIFsuLl0gCisgICAgICAoQCkgWW91IGNhbiByZWZlciB0byB0aGUgQ0FOIEhBTCBkcml2ZXIgaGVhZGVyIGZpbGUgZm9yIG1vcmUgdXNlZnVsIG1hY3JvcyAKKyAgICAgICAgICAgICAgICAKKyAgQGVuZHZlcmJhdGltCisgICAgICAgICAgIAorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIAorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDQU4gQ0FOCisgICogQGJyaWVmIENBTiBkcml2ZXIgbW9kdWxlcworICAqIEB7CisgICovIAorICAKKyNpZmRlZiBIQUxfQ0FOX01PRFVMRV9FTkFCTEVEICAKKyAgCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4OCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisgIAorLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENBTl9Qcml2YXRlX0NvbnN0YW50cyBDQU4gUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworI2RlZmluZSBDQU5fVElNRU9VVF9WQUxVRSAxMFUKKy8qKgorICAqIEB9CisgICovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENBTl9Qcml2YXRlX0Z1bmN0aW9ucyBDQU4gUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENBTl9SZWNlaXZlX0lUKENBTl9IYW5kbGVUeXBlRGVmKiBoY2FuLCB1aW50OF90IEZJRk9OdW1iZXIpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENBTl9UcmFuc21pdF9JVChDQU5fSGFuZGxlVHlwZURlZiogaGNhbik7CisvKioKKyAgKiBAfQorICAqLworICAKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIENBTl9FeHBvcnRlZF9GdW5jdGlvbnMgQ0FOIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ0FOX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAKKyAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIAorICoKK0B2ZXJiYXRpbSAgICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlIENBTi4gCisgICAgICAoKykgRGUtaW5pdGlhbGl6ZSB0aGUgQ0FOLiAKKyAgICAgICAgIAorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKyAgCisvKioKKyAgKiBAYnJpZWYgSW5pdGlhbGl6ZXMgdGhlIENBTiBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIENBTl9Jbml0U3RydWN0LgorICAqIEBwYXJhbSAgaGNhbiBwb2ludGVyIHRvIGEgQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBDQU4uICAKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DQU5fSW5pdChDQU5fSGFuZGxlVHlwZURlZiogaGNhbikKK3sKKyAgdWludDMyX3Qgc3RhdHVzID0gQ0FOX0lOSVRTVEFUVVNfRkFJTEVEOyAgLyogRGVmYXVsdCBpbml0IHN0YXR1cyAqLworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKyAgCisgIC8qIENoZWNrIENBTiBoYW5kbGUgKi8KKyAgaWYoaGNhbiA9PSBOVUxMKQorICB7CisgICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0FMTF9JTlNUQU5DRShoY2FuLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShoY2FuLT5Jbml0LlRUQ00pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoaGNhbi0+SW5pdC5BQk9NKSk7CisgIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKGhjYW4tPkluaXQuQVdVTSkpOworICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShoY2FuLT5Jbml0Lk5BUlQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoaGNhbi0+SW5pdC5SRkxNKSk7CisgIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKGhjYW4tPkluaXQuVFhGUCkpOworICBhc3NlcnRfcGFyYW0oSVNfQ0FOX01PREUoaGNhbi0+SW5pdC5Nb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19DQU5fU0pXKGhjYW4tPkluaXQuU0pXKSk7CisgIGFzc2VydF9wYXJhbShJU19DQU5fQlMxKGhjYW4tPkluaXQuQlMxKSk7CisgIGFzc2VydF9wYXJhbShJU19DQU5fQlMyKGhjYW4tPkluaXQuQlMyKSk7CisgIGFzc2VydF9wYXJhbShJU19DQU5fUFJFU0NBTEVSKGhjYW4tPkluaXQuUHJlc2NhbGVyKSk7CisgIAorICBpZihoY2FuLT5TdGF0ZSA9PSBIQUxfQ0FOX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGhjYW4tPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgSEFMX0NBTl9Nc3BJbml0KGhjYW4pOworICB9CisgIAorICAvKiBJbml0aWFsaXplIHRoZSBDQU4gc3RhdGUqLworICBoY2FuLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfQlVTWTsKKyAgCisgIC8qIEV4aXQgZnJvbSBzbGVlcCBtb2RlICovCisgIENMRUFSX0JJVChoY2FuLT5JbnN0YW5jZS0+TUNSLCBDQU5fTUNSX1NMRUVQKTsKKworICAvKiBSZXF1ZXN0IGluaXRpYWxpc2F0aW9uICovCisgIFNFVF9CSVQoaGNhbi0+SW5zdGFuY2UtPk1DUiwgQ0FOX01DUl9JTlJRKTsKKworICAvKiBHZXQgdGljayAqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOyAgIAorICAKKyAgLyogV2FpdCB0aGUgYWNrbm93bGVkZ2UgKi8KKyAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoaGNhbi0+SW5zdGFuY2UtPk1TUiwgQ0FOX01TUl9JTkFLKSkKKyAgeworICAgIGlmKChIQUxfR2V0VGljaygpLXRpY2tzdGFydCkgPiBDQU5fVElNRU9VVF9WQUxVRSkKKyAgICB7CisgICAgICBoY2FuLT5TdGF0ZT0gSEFMX0NBTl9TVEFURV9USU1FT1VUOworICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhjYW4pOworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorCisgIC8qIENoZWNrIGFja25vd2xlZGdlICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoY2FuLT5JbnN0YW5jZS0+TVNSLCBDQU5fTVNSX0lOQUspKQorICB7CisgICAgLyogU2V0IHRoZSB0aW1lIHRyaWdnZXJlZCBjb21tdW5pY2F0aW9uIG1vZGUgKi8KKyAgICBpZiAoaGNhbi0+SW5pdC5UVENNID09IEVOQUJMRSkKKyAgICB7CisgICAgICBTRVRfQklUKGhjYW4tPkluc3RhbmNlLT5NQ1IsIENBTl9NQ1JfVFRDTSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBDTEVBUl9CSVQoaGNhbi0+SW5zdGFuY2UtPk1DUiwgQ0FOX01DUl9UVENNKTsKKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIGF1dG9tYXRpYyBidXMtb2ZmIG1hbmFnZW1lbnQgKi8KKyAgICBpZiAoaGNhbi0+SW5pdC5BQk9NID09IEVOQUJMRSkKKyAgICB7CisgICAgICBTRVRfQklUKGhjYW4tPkluc3RhbmNlLT5NQ1IsIENBTl9NQ1JfQUJPTSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBDTEVBUl9CSVQoaGNhbi0+SW5zdGFuY2UtPk1DUiwgQ0FOX01DUl9BQk9NKTsKKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIGF1dG9tYXRpYyB3YWtlLXVwIG1vZGUgKi8KKyAgICBpZiAoaGNhbi0+SW5pdC5BV1VNID09IEVOQUJMRSkKKyAgICB7CisgICAgICBTRVRfQklUKGhjYW4tPkluc3RhbmNlLT5NQ1IsIENBTl9NQ1JfQVdVTSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBDTEVBUl9CSVQoaGNhbi0+SW5zdGFuY2UtPk1DUiwgQ0FOX01DUl9BV1VNKTsKKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIG5vIGF1dG9tYXRpYyByZXRyYW5zbWlzc2lvbiAqLworICAgIGlmIChoY2FuLT5Jbml0Lk5BUlQgPT0gRU5BQkxFKQorICAgIHsKKyAgICAgIFNFVF9CSVQoaGNhbi0+SW5zdGFuY2UtPk1DUiwgQ0FOX01DUl9OQVJUKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIENMRUFSX0JJVChoY2FuLT5JbnN0YW5jZS0+TUNSLCBDQU5fTUNSX05BUlQpOworICAgIH0KKworICAgIC8qIFNldCB0aGUgcmVjZWl2ZSBGSUZPIGxvY2tlZCBtb2RlICovCisgICAgaWYgKGhjYW4tPkluaXQuUkZMTSA9PSBFTkFCTEUpCisgICAgeworICAgICAgU0VUX0JJVChoY2FuLT5JbnN0YW5jZS0+TUNSLCBDQU5fTUNSX1JGTE0pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgQ0xFQVJfQklUKGhjYW4tPkluc3RhbmNlLT5NQ1IsIENBTl9NQ1JfUkZMTSk7CisgICAgfQorCisgICAgLyogU2V0IHRoZSB0cmFuc21pdCBGSUZPIHByaW9yaXR5ICovCisgICAgaWYgKGhjYW4tPkluaXQuVFhGUCA9PSBFTkFCTEUpCisgICAgeworICAgICAgU0VUX0JJVChoY2FuLT5JbnN0YW5jZS0+TUNSLCBDQU5fTUNSX1RYRlApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgQ0xFQVJfQklUKGhjYW4tPkluc3RhbmNlLT5NQ1IsIENBTl9NQ1JfVFhGUCk7CisgICAgfQorCisgICAgLyogU2V0IHRoZSBiaXQgdGltaW5nIHJlZ2lzdGVyICovCisgICAgV1JJVEVfUkVHKGhjYW4tPkluc3RhbmNlLT5CVFIsICh1aW50MzJfdCkoaGNhbi0+SW5pdC5Nb2RlICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNhbi0+SW5pdC5TSlcgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNhbi0+SW5pdC5CUzEgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNhbi0+SW5pdC5CUzIgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhjYW4tPkluaXQuUHJlc2NhbGVyIC0gMVUpICkpOworCisgICAgLyogUmVxdWVzdCBsZWF2ZSBpbml0aWFsaXNhdGlvbiAqLworICAgIENMRUFSX0JJVChoY2FuLT5JbnN0YW5jZS0+TUNSLCBDQU5fTUNSX0lOUlEpOworCisgICAgLyogR2V0IHRpY2sgKi8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOyAgIAorICAgCisgICAgLyogV2FpdCB0aGUgYWNrbm93bGVkZ2UgKi8KKyAgICB3aGlsZShIQUxfSVNfQklUX1NFVChoY2FuLT5JbnN0YW5jZS0+TVNSLCBDQU5fTVNSX0lOQUspKQorICAgIHsKKyAgICAgIGlmKChIQUxfR2V0VGljaygpLXRpY2tzdGFydCkgPiBDQU5fVElNRU9VVF9WQUxVRSkKKyAgICAgIHsKKyAgICAgICAgIGhjYW4tPlN0YXRlPSBIQUxfQ0FOX1NUQVRFX1RJTUVPVVQ7CisKKyAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgX19IQUxfVU5MT0NLKGhjYW4pOworCisgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKworICAgIC8qIENoZWNrIGFja25vd2xlZGdlZCAqLworICAgIGlmKEhBTF9JU19CSVRfQ0xSKGhjYW4tPkluc3RhbmNlLT5NU1IsIENBTl9NU1JfSU5BSykpCisgICAgeworICAgICAgc3RhdHVzID0gQ0FOX0lOSVRTVEFUVVNfU1VDQ0VTUzsKKyAgICB9CisgIH0KKyAKKyAgaWYoc3RhdHVzID09IENBTl9JTklUU1RBVFVTX1NVQ0NFU1MpCisgIHsKKyAgICAvKiBTZXQgQ0FOIGVycm9yIGNvZGUgdG8gbm9uZSAqLworICAgIGhjYW4tPkVycm9yQ29kZSA9IEhBTF9DQU5fRVJST1JfTk9ORTsKKyAgICAKKyAgICAvKiBJbml0aWFsaXplIHRoZSBDQU4gc3RhdGUgKi8KKyAgICBoY2FuLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfUkVBRFk7CisgIAorICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIEluaXRpYWxpemUgdGhlIENBTiBzdGF0ZSAqLworICAgIGhjYW4tPlN0YXRlID0gSEFMX0NBTl9TVEFURV9FUlJPUjsKKworICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgQ0FOIHJlY2VwdGlvbiBmaWx0ZXIgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIENBTl9GaWx0ZXJJbml0U3RydWN0LgorICAqIEBwYXJhbSAgaGNhbiBwb2ludGVyIHRvIGEgQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIENBTi4KKyAgKiBAcGFyYW0gIHNGaWx0ZXJDb25maWcgcG9pbnRlciB0byBhIENBTl9GaWx0ZXJDb25mVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqICAgICAgICAgY29udGFpbnMgdGhlIGZpbHRlciBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgorICAqIEByZXR2YWwgTm9uZQorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NBTl9Db25maWdGaWx0ZXIoQ0FOX0hhbmRsZVR5cGVEZWYqIGhjYW4sIENBTl9GaWx0ZXJDb25mVHlwZURlZiogc0ZpbHRlckNvbmZpZykKK3sKKyAgdWludDMyX3QgZmlsdGVybmJyYml0cG9zID0gMFU7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0ZJTFRFUl9OVU1CRVIoc0ZpbHRlckNvbmZpZy0+RmlsdGVyTnVtYmVyKSk7CisgIGFzc2VydF9wYXJhbShJU19DQU5fRklMVEVSX01PREUoc0ZpbHRlckNvbmZpZy0+RmlsdGVyTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0ZJTFRFUl9TQ0FMRShzRmlsdGVyQ29uZmlnLT5GaWx0ZXJTY2FsZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0ZJTFRFUl9GSUZPKHNGaWx0ZXJDb25maWctPkZpbHRlckZJRk9Bc3NpZ25tZW50KSk7CisgIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKHNGaWx0ZXJDb25maWctPkZpbHRlckFjdGl2YXRpb24pKTsKKworICBmaWx0ZXJuYnJiaXRwb3MgPSAoMVUpIDw8IHNGaWx0ZXJDb25maWctPkZpbHRlck51bWJlcjsKKworICAvKiBJbml0aWFsaXNhdGlvbiBtb2RlIGZvciB0aGUgZmlsdGVyICovCisgIFNFVF9CSVQoaGNhbi0+SW5zdGFuY2UtPkZNUiwgQ0FOX0ZNUl9GSU5JVCk7CisKKyAgLyogRmlsdGVyIERlYWN0aXZhdGlvbiAqLworICBDTEVBUl9CSVQoaGNhbi0+SW5zdGFuY2UtPkZBMVIsIGZpbHRlcm5icmJpdHBvcyk7CisKKyAgLyogRmlsdGVyIFNjYWxlICovCisgIGlmIChzRmlsdGVyQ29uZmlnLT5GaWx0ZXJTY2FsZSA9PSBDQU5fRklMVEVSU0NBTEVfMTZCSVQpCisgIHsKKyAgICAvKiAxNi1iaXQgc2NhbGUgZm9yIHRoZSBmaWx0ZXIgKi8KKyAgICBDTEVBUl9CSVQoaGNhbi0+SW5zdGFuY2UtPkZTMVIsIGZpbHRlcm5icmJpdHBvcyk7CisKKyAgICAvKiBGaXJzdCAxNi1iaXQgaWRlbnRpZmllciBhbmQgRmlyc3QgMTYtYml0IG1hc2sgKi8KKyAgICAvKiBPciBGaXJzdCAxNi1iaXQgaWRlbnRpZmllciBhbmQgU2Vjb25kIDE2LWJpdCBpZGVudGlmaWVyICovCisgICAgaGNhbi0+SW5zdGFuY2UtPnNGaWx0ZXJSZWdpc3RlcltzRmlsdGVyQ29uZmlnLT5GaWx0ZXJOdW1iZXJdLkZSMSA9IAorICAgICAgICgoMHgwMDAwRkZGRlUgJiAodWludDMyX3Qpc0ZpbHRlckNvbmZpZy0+RmlsdGVyTWFza0lkTG93KSA8PCAxNlUpIHwKKyAgICAgICAgKDB4MDAwMEZGRkZVICYgKHVpbnQzMl90KXNGaWx0ZXJDb25maWctPkZpbHRlcklkTG93KTsKKworICAgIC8qIFNlY29uZCAxNi1iaXQgaWRlbnRpZmllciBhbmQgU2Vjb25kIDE2LWJpdCBtYXNrICovCisgICAgLyogT3IgVGhpcmQgMTYtYml0IGlkZW50aWZpZXIgYW5kIEZvdXJ0aCAxNi1iaXQgaWRlbnRpZmllciAqLworICAgIGhjYW4tPkluc3RhbmNlLT5zRmlsdGVyUmVnaXN0ZXJbc0ZpbHRlckNvbmZpZy0+RmlsdGVyTnVtYmVyXS5GUjIgPSAKKyAgICAgICAoKDB4MDAwMEZGRkZVICYgKHVpbnQzMl90KXNGaWx0ZXJDb25maWctPkZpbHRlck1hc2tJZEhpZ2gpIDw8IDE2VSkgfAorICAgICAgICAoMHgwMDAwRkZGRlUgJiAodWludDMyX3Qpc0ZpbHRlckNvbmZpZy0+RmlsdGVySWRIaWdoKTsKKyAgfQorCisgIGlmIChzRmlsdGVyQ29uZmlnLT5GaWx0ZXJTY2FsZSA9PSBDQU5fRklMVEVSU0NBTEVfMzJCSVQpCisgIHsKKyAgICAvKiAzMi1iaXQgc2NhbGUgZm9yIHRoZSBmaWx0ZXIgKi8KKyAgICBTRVRfQklUKGhjYW4tPkluc3RhbmNlLT5GUzFSLCBmaWx0ZXJuYnJiaXRwb3MpOworCisgICAgLyogMzItYml0IGlkZW50aWZpZXIgb3IgRmlyc3QgMzItYml0IGlkZW50aWZpZXIgKi8KKyAgICBoY2FuLT5JbnN0YW5jZS0+c0ZpbHRlclJlZ2lzdGVyW3NGaWx0ZXJDb25maWctPkZpbHRlck51bWJlcl0uRlIxID0gCisgICAgICAgKCgweDAwMDBGRkZGVSAmICh1aW50MzJfdClzRmlsdGVyQ29uZmlnLT5GaWx0ZXJJZEhpZ2gpIDw8IDE2VSkgfAorICAgICAgICAoMHgwMDAwRkZGRlUgJiAodWludDMyX3Qpc0ZpbHRlckNvbmZpZy0+RmlsdGVySWRMb3cpOworCisgICAgLyogMzItYml0IG1hc2sgb3IgU2Vjb25kIDMyLWJpdCBpZGVudGlmaWVyICovCisgICAgaGNhbi0+SW5zdGFuY2UtPnNGaWx0ZXJSZWdpc3RlcltzRmlsdGVyQ29uZmlnLT5GaWx0ZXJOdW1iZXJdLkZSMiA9IAorICAgICAgICgoMHgwMDAwRkZGRlUgJiAodWludDMyX3Qpc0ZpbHRlckNvbmZpZy0+RmlsdGVyTWFza0lkSGlnaCkgPDwgMTZVKSB8CisgICAgICAgICgweDAwMDBGRkZGVSAmICh1aW50MzJfdClzRmlsdGVyQ29uZmlnLT5GaWx0ZXJNYXNrSWRMb3cpOworICB9CisKKyAgLyogRmlsdGVyIE1vZGUgKi8KKyAgaWYgKHNGaWx0ZXJDb25maWctPkZpbHRlck1vZGUgPT0gQ0FOX0ZJTFRFUk1PREVfSURNQVNLKQorICB7CisgICAgLypJZC9NYXNrIG1vZGUgZm9yIHRoZSBmaWx0ZXIqLworICAgIENMRUFSX0JJVChoY2FuLT5JbnN0YW5jZS0+Rk0xUiwgZmlsdGVybmJyYml0cG9zKTsKKyAgfQorICBlbHNlIC8qIENBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVyTW9kZSA9PSBDQU5fRmlsdGVyTW9kZV9JZExpc3QgKi8KKyAgeworICAgIC8qSWRlbnRpZmllciBsaXN0IG1vZGUgZm9yIHRoZSBmaWx0ZXIqLworICAgIFNFVF9CSVQoaGNhbi0+SW5zdGFuY2UtPkZNMVIsIGZpbHRlcm5icmJpdHBvcyk7CisgIH0KKworICAvKiBGaWx0ZXIgRklGTyBhc3NpZ25tZW50ICovCisgIGlmIChzRmlsdGVyQ29uZmlnLT5GaWx0ZXJGSUZPQXNzaWdubWVudCA9PSBDQU5fRklMVEVSX0ZJRk8wKQorICB7CisgICAgLyogRklGTyAwIGFzc2lnbmF0aW9uIGZvciB0aGUgZmlsdGVyICovCisgICAgQ0xFQVJfQklUKGhjYW4tPkluc3RhbmNlLT5GRkExUiwgZmlsdGVybmJyYml0cG9zKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBGSUZPIDEgYXNzaWduYXRpb24gZm9yIHRoZSBmaWx0ZXIgKi8KKyAgICBTRVRfQklUKGhjYW4tPkluc3RhbmNlLT5GRkExUiwgZmlsdGVybmJyYml0cG9zKTsKKyAgfQorICAKKyAgLyogRmlsdGVyIGFjdGl2YXRpb24gKi8KKyAgaWYgKHNGaWx0ZXJDb25maWctPkZpbHRlckFjdGl2YXRpb24gPT0gRU5BQkxFKQorICB7CisgICAgU0VUX0JJVChoY2FuLT5JbnN0YW5jZS0+RkExUiwgZmlsdGVybmJyYml0cG9zKTsKKyAgfQorCisgIC8qIExlYXZlIHRoZSBpbml0aWFsaXNhdGlvbiBtb2RlIGZvciB0aGUgZmlsdGVyICovCisgIENMRUFSX0JJVChoY2FuLT5JbnN0YW5jZS0+Rk1SLCAoKHVpbnQzMl90KUNBTl9GTVJfRklOSVQpKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZWluaXRpYWxpemVzIHRoZSBDQU54IHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLiAKKyAgKiBAcGFyYW0gIGhjYW4gcG9pbnRlciB0byBhIENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBDQU4uICAKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DQU5fRGVJbml0KENBTl9IYW5kbGVUeXBlRGVmKiBoY2FuKQoreworICAvKiBDaGVjayBDQU4gaGFuZGxlICovCisgIGlmKGhjYW4gPT0gTlVMTCkKKyAgeworICAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0FMTF9JTlNUQU5DRShoY2FuLT5JbnN0YW5jZSkpOworICAKKyAgLyogQ2hhbmdlIENBTiBzdGF0ZSAqLworICBoY2FuLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfQlVTWTsKKyAgCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIEhBTF9DQU5fTXNwRGVJbml0KGhjYW4pOworICAKKyAgLyogQ2hhbmdlIENBTiBzdGF0ZSAqLworICBoY2FuLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfUkVTRVQ7CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoY2FuKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIENBTiBNU1AuCisgICogQHBhcmFtICBoY2FuIHBvaW50ZXIgdG8gYSBDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQ0FOLiAgCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQ0FOX01zcEluaXQoQ0FOX0hhbmRsZVR5cGVEZWYqIGhjYW4pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhjYW4pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfQ0FOX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gCit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplcyB0aGUgQ0FOIE1TUC4KKyAgKiBAcGFyYW0gIGhjYW4gcG9pbnRlciB0byBhIENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBDQU4uICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9DQU5fTXNwRGVJbml0KENBTl9IYW5kbGVUeXBlRGVmKiBoY2FuKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoY2FuKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0NBTl9Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ0FOX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSW5wdXQgYW5kIE91dHB1dCBvcGVyYXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgCisgKgorQHZlcmJhdGltICAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBUcmFuc21pdCBhIENBTiBmcmFtZSBtZXNzYWdlLgorICAgICAgKCspIFJlY2VpdmUgYSBDQU4gZnJhbWUgbWVzc2FnZS4KKyAgICAgICgrKSBFbnRlciBDQU4gcGVyaXBoZXJhbCBpbiBzbGVlcCBtb2RlLiAKKyAgICAgICgrKSBXYWtlIHVwIHRoZSBDQU4gcGVyaXBoZXJhbCBmcm9tIHNsZWVwIG1vZGUuCisgICAgICAgICAgICAgICAKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhdGVzIGFuZCB0cmFuc21pdHMgYSBDQU4gZnJhbWUgbWVzc2FnZS4KKyAgKiBAcGFyYW0gIGhjYW4gcG9pbnRlciB0byBhIENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBDQU4uICAKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DQU5fVHJhbnNtaXQoQ0FOX0hhbmRsZVR5cGVEZWYqIGhjYW4sIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQzMl90IHRyYW5zbWl0bWFpbGJveCA9IENBTl9UWFNUQVRVU19OT01BSUxCT1g7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19DQU5fSURUWVBFKGhjYW4tPnBUeE1zZy0+SURFKSk7CisgIGFzc2VydF9wYXJhbShJU19DQU5fUlRSKGhjYW4tPnBUeE1zZy0+UlRSKSk7CisgIGFzc2VydF9wYXJhbShJU19DQU5fRExDKGhjYW4tPnBUeE1zZy0+RExDKSk7CisKKyAgaWYoKChoY2FuLT5JbnN0YW5jZS0+VFNSJkNBTl9UU1JfVE1FMCkgPT0gQ0FOX1RTUl9UTUUwKSB8fCBcCisgICAgICgoaGNhbi0+SW5zdGFuY2UtPlRTUiZDQU5fVFNSX1RNRTEpID09IENBTl9UU1JfVE1FMSkgfHwgXAorICAgICAoKGhjYW4tPkluc3RhbmNlLT5UU1ImQ0FOX1RTUl9UTUUyKSA9PSBDQU5fVFNSX1RNRTIpKQorICB7CisgICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhjYW4pOworCisgICAgLyogQ2hhbmdlIENBTiBzdGF0ZSAqLworICAgIHN3aXRjaChoY2FuLT5TdGF0ZSkKKyAgICB7CisgICAgICBjYXNlKEhBTF9DQU5fU1RBVEVfQlVTWV9SWDApOgorICAgICAgICAgIGhjYW4tPlN0YXRlID0gSEFMX0NBTl9TVEFURV9CVVNZX1RYX1JYMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UoSEFMX0NBTl9TVEFURV9CVVNZX1JYMSk6CisgICAgICAgICAgaGNhbi0+U3RhdGUgPSBIQUxfQ0FOX1NUQVRFX0JVU1lfVFhfUlgxOworICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZShIQUxfQ0FOX1NUQVRFX0JVU1lfUlgwX1JYMSk6CisgICAgICAgICAgaGNhbi0+U3RhdGUgPSBIQUxfQ0FOX1NUQVRFX0JVU1lfVFhfUlgwX1JYMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6IC8qIEhBTF9DQU5fU1RBVEVfUkVBRFkgKi8KKyAgICAgICAgICBoY2FuLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfQlVTWV9UWDsKKyAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBTZWxlY3Qgb25lIGVtcHR5IHRyYW5zbWl0IG1haWxib3ggKi8KKyAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaGNhbi0+SW5zdGFuY2UtPlRTUiwgQ0FOX1RTUl9UTUUwKSkKKyAgICB7CisgICAgICB0cmFuc21pdG1haWxib3ggPSBDQU5fVFhNQUlMQk9YXzA7CisgICAgfQorICAgIGVsc2UgaWYgKEhBTF9JU19CSVRfU0VUKGhjYW4tPkluc3RhbmNlLT5UU1IsIENBTl9UU1JfVE1FMSkpCisgICAgeworICAgICAgdHJhbnNtaXRtYWlsYm94ID0gQ0FOX1RYTUFJTEJPWF8xOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgdHJhbnNtaXRtYWlsYm94ID0gQ0FOX1RYTUFJTEJPWF8yOworICAgIH0KKworICAgIC8qIFNldCB1cCB0aGUgSWQgKi8KKyAgICBoY2FuLT5JbnN0YW5jZS0+c1R4TWFpbEJveFt0cmFuc21pdG1haWxib3hdLlRJUiAmPSBDQU5fVEkwUl9UWFJROworICAgIGlmIChoY2FuLT5wVHhNc2ctPklERSA9PSBDQU5fSURfU1REKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19DQU5fU1RESUQoaGNhbi0+cFR4TXNnLT5TdGRJZCkpOyAgCisgICAgICBoY2FuLT5JbnN0YW5jZS0+c1R4TWFpbEJveFt0cmFuc21pdG1haWxib3hdLlRJUiB8PSAoKGhjYW4tPnBUeE1zZy0+U3RkSWQgPDwgQ0FOX1RJMFJfU1RJRF9Qb3MpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2FuLT5wVHhNc2ctPlJUUik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0VYVElEKGhjYW4tPnBUeE1zZy0+RXh0SWQpKTsKKyAgICAgIGhjYW4tPkluc3RhbmNlLT5zVHhNYWlsQm94W3RyYW5zbWl0bWFpbGJveF0uVElSIHw9ICgoaGNhbi0+cFR4TXNnLT5FeHRJZCA8PCBDQU5fVEkwUl9FWElEX1BvcykgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjYW4tPnBUeE1zZy0+SURFIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2FuLT5wVHhNc2ctPlJUUik7CisgICAgfQorICAgIAorICAgIC8qIFNldCB1cCB0aGUgRExDICovCisgICAgaGNhbi0+cFR4TXNnLT5ETEMgJj0gKHVpbnQ4X3QpMHgwMDAwMDAwRlU7CisgICAgaGNhbi0+SW5zdGFuY2UtPnNUeE1haWxCb3hbdHJhbnNtaXRtYWlsYm94XS5URFRSICY9IDB4RkZGRkZGRjBVOworICAgIGhjYW4tPkluc3RhbmNlLT5zVHhNYWlsQm94W3RyYW5zbWl0bWFpbGJveF0uVERUUiB8PSBoY2FuLT5wVHhNc2ctPkRMQzsKKworICAgIC8qIFNldCB1cCB0aGUgZGF0YSBmaWVsZCAqLworICAgIFdSSVRFX1JFRyhoY2FuLT5JbnN0YW5jZS0+c1R4TWFpbEJveFt0cmFuc21pdG1haWxib3hdLlRETFIsICgodWludDMyX3QpaGNhbi0+cFR4TXNnLT5EYXRhWzNdIDw8IENBTl9UREwwUl9EQVRBM19Qb3MpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KWhjYW4tPnBUeE1zZy0+RGF0YVsyXSA8PCBDQU5fVERMMFJfREFUQTJfUG9zKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCloY2FuLT5wVHhNc2ctPkRhdGFbMV0gPDwgQ0FOX1RETDBSX0RBVEExX1BvcykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpaGNhbi0+cFR4TXNnLT5EYXRhWzBdIDw8IENBTl9UREwwUl9EQVRBMF9Qb3MpKTsKKyAgICBXUklURV9SRUcoaGNhbi0+SW5zdGFuY2UtPnNUeE1haWxCb3hbdHJhbnNtaXRtYWlsYm94XS5UREhSLCAoKHVpbnQzMl90KWhjYW4tPnBUeE1zZy0+RGF0YVs3XSA8PCBDQU5fVERMMFJfREFUQTNfUG9zKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCloY2FuLT5wVHhNc2ctPkRhdGFbNl0gPDwgQ0FOX1RETDBSX0RBVEEyX1BvcykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpaGNhbi0+cFR4TXNnLT5EYXRhWzVdIDw8IENBTl9UREwwUl9EQVRBMV9Qb3MpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KWhjYW4tPnBUeE1zZy0+RGF0YVs0XSA8PCBDQU5fVERMMFJfREFUQTBfUG9zKSk7CisKKyAgICAvKiBSZXF1ZXN0IHRyYW5zbWlzc2lvbiAqLworICAgIFNFVF9CSVQoaGNhbi0+SW5zdGFuY2UtPnNUeE1haWxCb3hbdHJhbnNtaXRtYWlsYm94XS5USVIsIENBTl9USTBSX1RYUlEpOworICAKKyAgICAvKiBHZXQgdGljayAqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7ICAgCisgIAorICAgIC8qIENoZWNrIEVuZCBvZiB0cmFuc21pc3Npb24gZmxhZyAqLworICAgIHdoaWxlKCEoX19IQUxfQ0FOX1RSQU5TTUlUX1NUQVRVUyhoY2FuLCB0cmFuc21pdG1haWxib3gpKSkKKyAgICB7CisgICAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KKyAgICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICAgIHsKKyAgICAgICAgaWYoKFRpbWVvdXQgPT0gMFUpIHx8ICgoSEFMX0dldFRpY2soKS10aWNrc3RhcnQpID4gVGltZW91dCkpCisgICAgICAgIHsKKyAgICAgICAgICBoY2FuLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfVElNRU9VVDsKKworICAgICAgICAgIC8qIENhbmNlbCB0cmFuc21pc3Npb24gKi8KKyAgICAgICAgICBfX0hBTF9DQU5fQ0FOQ0VMX1RSQU5TTUlUKGhjYW4sIHRyYW5zbWl0bWFpbGJveCk7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhjYW4pOworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIENoYW5nZSBDQU4gc3RhdGUgKi8KKyAgICBzd2l0Y2goaGNhbi0+U3RhdGUpCisgICAgeworICAgICAgY2FzZShIQUxfQ0FOX1NUQVRFX0JVU1lfVFhfUlgwKToKKyAgICAgICAgICBoY2FuLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfQlVTWV9SWDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlKEhBTF9DQU5fU1RBVEVfQlVTWV9UWF9SWDEpOgorICAgICAgICAgIGhjYW4tPlN0YXRlID0gSEFMX0NBTl9TVEFURV9CVVNZX1JYMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UoSEFMX0NBTl9TVEFURV9CVVNZX1RYX1JYMF9SWDEpOgorICAgICAgICAgIGhjYW4tPlN0YXRlID0gSEFMX0NBTl9TVEFURV9CVVNZX1JYMF9SWDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiAvKiBIQUxfQ0FOX1NUQVRFX0JVU1lfVFggKi8KKyAgICAgICAgICBoY2FuLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfUkVBRFk7CisgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY2FuKTsKKyAgICAKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDaGFuZ2UgQ0FOIHN0YXRlICovCisgICAgaGNhbi0+U3RhdGUgPSBIQUxfQ0FOX1NUQVRFX0VSUk9SOyAKKworICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhdGVzIGFuZCB0cmFuc21pdHMgYSBDQU4gZnJhbWUgbWVzc2FnZS4KKyAgKiBAcGFyYW0gIGhjYW4gcG9pbnRlciB0byBhIENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBDQU4uICAKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DQU5fVHJhbnNtaXRfSVQoQ0FOX0hhbmRsZVR5cGVEZWYqIGhjYW4pCit7CisgIHVpbnQzMl90IHRyYW5zbWl0bWFpbGJveCA9IENBTl9UWFNUQVRVU19OT01BSUxCT1g7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0NBTl9JRFRZUEUoaGNhbi0+cFR4TXNnLT5JREUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0NBTl9SVFIoaGNhbi0+cFR4TXNnLT5SVFIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0NBTl9ETEMoaGNhbi0+cFR4TXNnLT5ETEMpKTsKKworICBpZigoKGhjYW4tPkluc3RhbmNlLT5UU1ImQ0FOX1RTUl9UTUUwKSA9PSBDQU5fVFNSX1RNRTApIHx8IFwKKyAgICAgKChoY2FuLT5JbnN0YW5jZS0+VFNSJkNBTl9UU1JfVE1FMSkgPT0gQ0FOX1RTUl9UTUUxKSB8fCBcCisgICAgICgoaGNhbi0+SW5zdGFuY2UtPlRTUiZDQU5fVFNSX1RNRTIpID09IENBTl9UU1JfVE1FMikpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGNhbik7CisgICAgCisgICAgLyogU2VsZWN0IG9uZSBlbXB0eSB0cmFuc21pdCBtYWlsYm94ICovCisgICAgaWYoSEFMX0lTX0JJVF9TRVQoaGNhbi0+SW5zdGFuY2UtPlRTUiwgQ0FOX1RTUl9UTUUwKSkKKyAgICB7CisgICAgICB0cmFuc21pdG1haWxib3ggPSBDQU5fVFhNQUlMQk9YXzA7CisgICAgfQorICAgIGVsc2UgaWYoSEFMX0lTX0JJVF9TRVQoaGNhbi0+SW5zdGFuY2UtPlRTUiwgQ0FOX1RTUl9UTUUxKSkKKyAgICB7CisgICAgICB0cmFuc21pdG1haWxib3ggPSBDQU5fVFhNQUlMQk9YXzE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB0cmFuc21pdG1haWxib3ggPSBDQU5fVFhNQUlMQk9YXzI7CisgICAgfQorCisgICAgLyogU2V0IHVwIHRoZSBJZCAqLworICAgIGhjYW4tPkluc3RhbmNlLT5zVHhNYWlsQm94W3RyYW5zbWl0bWFpbGJveF0uVElSICY9IENBTl9USTBSX1RYUlE7CisgICAgaWYoaGNhbi0+cFR4TXNnLT5JREUgPT0gQ0FOX0lEX1NURCkKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfQ0FOX1NURElEKGhjYW4tPnBUeE1zZy0+U3RkSWQpKTsKKyAgICAgIGhjYW4tPkluc3RhbmNlLT5zVHhNYWlsQm94W3RyYW5zbWl0bWFpbGJveF0uVElSIHw9ICgoaGNhbi0+cFR4TXNnLT5TdGRJZCA8PCBDQU5fVEkwUl9TVElEX1BvcykgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjYW4tPnBUeE1zZy0+UlRSKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19DQU5fRVhUSUQoaGNhbi0+cFR4TXNnLT5FeHRJZCkpOworICAgICAgaGNhbi0+SW5zdGFuY2UtPnNUeE1haWxCb3hbdHJhbnNtaXRtYWlsYm94XS5USVIgfD0gKChoY2FuLT5wVHhNc2ctPkV4dElkIDw8IENBTl9USTBSX0VYSURfUG9zKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNhbi0+cFR4TXNnLT5JREUgfCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjYW4tPnBUeE1zZy0+UlRSKTsKKyAgICB9CisKKyAgICAvKiBTZXQgdXAgdGhlIERMQyAqLworICAgIGhjYW4tPnBUeE1zZy0+RExDICY9ICh1aW50OF90KTB4MDAwMDAwMEZVOworICAgIGhjYW4tPkluc3RhbmNlLT5zVHhNYWlsQm94W3RyYW5zbWl0bWFpbGJveF0uVERUUiAmPSAweEZGRkZGRkYwVTsKKyAgICBoY2FuLT5JbnN0YW5jZS0+c1R4TWFpbEJveFt0cmFuc21pdG1haWxib3hdLlREVFIgfD0gaGNhbi0+cFR4TXNnLT5ETEM7CisKKyAgICAvKiBTZXQgdXAgdGhlIGRhdGEgZmllbGQgKi8KKyAgICBXUklURV9SRUcoaGNhbi0+SW5zdGFuY2UtPnNUeE1haWxCb3hbdHJhbnNtaXRtYWlsYm94XS5URExSLCAoKHVpbnQzMl90KWhjYW4tPnBUeE1zZy0+RGF0YVszXSA8PCBDQU5fVERMMFJfREFUQTNfUG9zKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCloY2FuLT5wVHhNc2ctPkRhdGFbMl0gPDwgQ0FOX1RETDBSX0RBVEEyX1BvcykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpaGNhbi0+cFR4TXNnLT5EYXRhWzFdIDw8IENBTl9UREwwUl9EQVRBMV9Qb3MpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KWhjYW4tPnBUeE1zZy0+RGF0YVswXSA8PCBDQU5fVERMMFJfREFUQTBfUG9zKSk7CisgICAgV1JJVEVfUkVHKGhjYW4tPkluc3RhbmNlLT5zVHhNYWlsQm94W3RyYW5zbWl0bWFpbGJveF0uVERIUiwgKCh1aW50MzJfdCloY2FuLT5wVHhNc2ctPkRhdGFbN10gPDwgQ0FOX1RETDBSX0RBVEEzX1BvcykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpaGNhbi0+cFR4TXNnLT5EYXRhWzZdIDw8IENBTl9UREwwUl9EQVRBMl9Qb3MpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KWhjYW4tPnBUeE1zZy0+RGF0YVs1XSA8PCBDQU5fVERMMFJfREFUQTFfUG9zKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCloY2FuLT5wVHhNc2ctPkRhdGFbNF0gPDwgQ0FOX1RETDBSX0RBVEEwX1BvcykpOworCisgICAgLyogQ2hhbmdlIENBTiBzdGF0ZSAqLworICAgIHN3aXRjaChoY2FuLT5TdGF0ZSkKKyAgICB7CisgICAgICBjYXNlKEhBTF9DQU5fU1RBVEVfQlVTWV9SWDApOgorICAgICAgICAgIGhjYW4tPlN0YXRlID0gSEFMX0NBTl9TVEFURV9CVVNZX1RYX1JYMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UoSEFMX0NBTl9TVEFURV9CVVNZX1JYMSk6CisgICAgICAgICAgaGNhbi0+U3RhdGUgPSBIQUxfQ0FOX1NUQVRFX0JVU1lfVFhfUlgxOworICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZShIQUxfQ0FOX1NUQVRFX0JVU1lfUlgwX1JYMSk6CisgICAgICAgICAgaGNhbi0+U3RhdGUgPSBIQUxfQ0FOX1NUQVRFX0JVU1lfVFhfUlgwX1JYMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6IC8qIEhBTF9DQU5fU1RBVEVfUkVBRFkgKi8KKyAgICAgICAgICBoY2FuLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfQlVTWV9UWDsKKyAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBTZXQgQ0FOIGVycm9yIGNvZGUgdG8gbm9uZSAqLworICAgIGhjYW4tPkVycm9yQ29kZSA9IEhBTF9DQU5fRVJST1JfTk9ORTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNhbik7CisKKyAgICAvKiBSZXF1ZXN0IHRyYW5zbWlzc2lvbiAqLworICAgIGhjYW4tPkluc3RhbmNlLT5zVHhNYWlsQm94W3RyYW5zbWl0bWFpbGJveF0uVElSIHw9IENBTl9USTBSX1RYUlE7CisKKyAgICAvKiBFbmFibGUgaW50ZXJydXB0czogKi8KKyAgICAvKiAgLSBFbmFibGUgRXJyb3Igd2FybmluZyBJbnRlcnJ1cHQgKi8KKyAgICAvKiAgLSBFbmFibGUgRXJyb3IgcGFzc2l2ZSBJbnRlcnJ1cHQgKi8KKyAgICAvKiAgLSBFbmFibGUgQnVzLW9mZiBJbnRlcnJ1cHQgKi8KKyAgICAvKiAgLSBFbmFibGUgTGFzdCBlcnJvciBjb2RlIEludGVycnVwdCAqLworICAgIC8qICAtIEVuYWJsZSBFcnJvciBJbnRlcnJ1cHQgKi8KKyAgICAvKiAgLSBFbmFibGUgVHJhbnNtaXQgbWFpbGJveCBlbXB0eSBJbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9DQU5fRU5BQkxFX0lUKGhjYW4sIENBTl9JVF9FV0cgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FOX0lUX0VQViB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU5fSVRfQk9GIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTl9JVF9MRUMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FOX0lUX0VSUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU5fSVRfVE1FICApOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIENoYW5nZSBDQU4gc3RhdGUgKi8KKyAgICBoY2FuLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfRVJST1I7CisKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlcyBhIGNvcnJlY3QgQ0FOIGZyYW1lLgorICAqIEBwYXJhbSAgaGNhbiBwb2ludGVyIHRvIGEgQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIENBTi4gIAorICAqIEBwYXJhbSAgRklGT051bWJlciAgICBGSUZPIG51bWJlci4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgICAgICAgVGltZW91dCBkdXJhdGlvbi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DQU5fUmVjZWl2ZShDQU5fSGFuZGxlVHlwZURlZiogaGNhbiwgdWludDhfdCBGSUZPTnVtYmVyLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKyAgQ2FuUnhNc2dUeXBlRGVmKiBwUnhNc2cgPSBOVUxMOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19DQU5fRklGTyhGSUZPTnVtYmVyKSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoY2FuKTsKKworICAvKiBDaGVjayBpZiBDQU4gc3RhdGUgaXMgbm90IGJ1c3kgZm9yIFJYIEZJRk8wICovCisgIGlmICgoRklGT051bWJlciA9PSBDQU5fRklGTzApICYmICgoaGNhbi0+U3RhdGUgPT0gSEFMX0NBTl9TVEFURV9CVVNZX1JYMCkgfHwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGNhbi0+U3RhdGUgPT0gSEFMX0NBTl9TVEFURV9CVVNZX1RYX1JYMCkgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGNhbi0+U3RhdGUgPT0gSEFMX0NBTl9TVEFURV9CVVNZX1JYMF9SWDEpIHx8ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGNhbi0+U3RhdGUgPT0gSEFMX0NBTl9TVEFURV9CVVNZX1RYX1JYMF9SWDEpKSkKKyAgeworICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNhbik7CisKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKworICAvKiBDaGVjayBpZiBDQU4gc3RhdGUgaXMgbm90IGJ1c3kgZm9yIFJYIEZJRk8xICovCisgIGlmICgoRklGT051bWJlciA9PSBDQU5fRklGTzEpICYmICgoaGNhbi0+U3RhdGUgPT0gSEFMX0NBTl9TVEFURV9CVVNZX1JYMSkgfHwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGNhbi0+U3RhdGUgPT0gSEFMX0NBTl9TVEFURV9CVVNZX1RYX1JYMSkgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGNhbi0+U3RhdGUgPT0gSEFMX0NBTl9TVEFURV9CVVNZX1JYMF9SWDEpIHx8ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGNhbi0+U3RhdGUgPT0gSEFMX0NBTl9TVEFURV9CVVNZX1RYX1JYMF9SWDEpKSkKKyAgeworICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNhbik7CisKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKworICAvKiBDaGFuZ2UgQ0FOIHN0YXRlICovCisgIGlmIChGSUZPTnVtYmVyID09IENBTl9GSUZPMCkKKyAgeworICAgIHN3aXRjaChoY2FuLT5TdGF0ZSkKKyAgICB7CisgICAgICBjYXNlKEhBTF9DQU5fU1RBVEVfQlVTWV9UWCk6CisgICAgICAgIGhjYW4tPlN0YXRlID0gSEFMX0NBTl9TVEFURV9CVVNZX1RYX1JYMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlKEhBTF9DQU5fU1RBVEVfQlVTWV9SWDEpOgorICAgICAgICBoY2FuLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfQlVTWV9SWDBfUlgxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UoSEFMX0NBTl9TVEFURV9CVVNZX1RYX1JYMSk6CisgICAgICAgIGhjYW4tPlN0YXRlID0gSEFMX0NBTl9TVEFURV9CVVNZX1RYX1JYMF9SWDE7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDogLyogSEFMX0NBTl9TVEFURV9SRUFEWSAqLworICAgICAgICBoY2FuLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfQlVTWV9SWDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIC8qIEZJRk9OdW1iZXIgPT0gQ0FOX0ZJRk8xICovCisgIHsKKyAgICBzd2l0Y2goaGNhbi0+U3RhdGUpCisgICAgeworICAgICAgY2FzZShIQUxfQ0FOX1NUQVRFX0JVU1lfVFgpOgorICAgICAgICBoY2FuLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfQlVTWV9UWF9SWDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZShIQUxfQ0FOX1NUQVRFX0JVU1lfUlgwKToKKyAgICAgICAgaGNhbi0+U3RhdGUgPSBIQUxfQ0FOX1NUQVRFX0JVU1lfUlgwX1JYMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlKEhBTF9DQU5fU1RBVEVfQlVTWV9UWF9SWDApOgorICAgICAgICBoY2FuLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfQlVTWV9UWF9SWDBfUlgxOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6IC8qIEhBTF9DQU5fU1RBVEVfUkVBRFkgKi8KKyAgICAgICAgaGNhbi0+U3RhdGUgPSBIQUxfQ0FOX1NUQVRFX0JVU1lfUlgxOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvKiBHZXQgdGljayAqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOyAgIAorICAKKyAgLyogQ2hlY2sgcGVuZGluZyBtZXNzYWdlICovCisgIHdoaWxlKF9fSEFMX0NBTl9NU0dfUEVORElORyhoY2FuLCBGSUZPTnVtYmVyKSA9PSAwVSkKKyAgeworICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLworICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZigoVGltZW91dCA9PSAwVSkgfHwgKChIQUxfR2V0VGljaygpLXRpY2tzdGFydCkgPiBUaW1lb3V0KSkKKyAgICAgIHsKKyAgICAgICAgaGNhbi0+U3RhdGUgPSBIQUxfQ0FOX1NUQVRFX1RJTUVPVVQ7CisKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGNhbik7CisKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFNldCBSeE1zZyBwb2ludGVyICovCisgIGlmKEZJRk9OdW1iZXIgPT0gQ0FOX0ZJRk8wKQorICB7CisgICAgcFJ4TXNnID0gaGNhbi0+cFJ4TXNnOworICB9CisgIGVsc2UgLyogRklGT051bWJlciA9PSBDQU5fRklGTzEgKi8KKyAgeworICAgIHBSeE1zZyA9IGhjYW4tPnBSeDFNc2c7CisgIH0KKworICAvKiBHZXQgdGhlIElkICovCisgIHBSeE1zZy0+SURFID0gQ0FOX1JJMFJfSURFICYgaGNhbi0+SW5zdGFuY2UtPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SSVI7CisgIGlmIChwUnhNc2ctPklERSA9PSBDQU5fSURfU1REKQorICB7CisgICAgcFJ4TXNnLT5TdGRJZCA9IChDQU5fUkkwUl9TVElEICYgaGNhbi0+SW5zdGFuY2UtPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SSVIpID4+IENBTl9USTBSX1NUSURfUG9zOworICB9CisgIGVsc2UKKyAgeworICAgIHBSeE1zZy0+RXh0SWQgPSAoMHhGRkZGRkZGOFUgJiBoY2FuLT5JbnN0YW5jZS0+c0ZJRk9NYWlsQm94W0ZJRk9OdW1iZXJdLlJJUikgPj4gQ0FOX1JJMFJfRVhJRF9Qb3M7CisgIH0KKyAgcFJ4TXNnLT5SVFIgPSAoQ0FOX1JJMFJfUlRSICYgaGNhbi0+SW5zdGFuY2UtPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SSVIpID4+IENBTl9SSTBSX1JUUl9Qb3M7CisgIC8qIEdldCB0aGUgRExDICovCisgIHBSeE1zZy0+RExDID0gKENBTl9SRFQwUl9ETEMgJiBoY2FuLT5JbnN0YW5jZS0+c0ZJRk9NYWlsQm94W0ZJRk9OdW1iZXJdLlJEVFIpID4+IENBTl9SRFQwUl9ETENfUG9zOworICAvKiBHZXQgdGhlIEZNSSAqLworICBwUnhNc2ctPkZNSSA9IChDQU5fUkRUMFJfRk1JICYgaGNhbi0+SW5zdGFuY2UtPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SRFRSKSA+PiBDQU5fUkRUMFJfRk1JX1BvczsKKyAgLyogR2V0IHRoZSBGSUZPTnVtYmVyICovCisgIHBSeE1zZy0+RklGT051bWJlciA9IEZJRk9OdW1iZXI7CisgIC8qIEdldCB0aGUgZGF0YSBmaWVsZCAqLworICBwUnhNc2ctPkRhdGFbMF0gPSAoQ0FOX1JETDBSX0RBVEEwICYgaGNhbi0+SW5zdGFuY2UtPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SRExSKSA+PiBDQU5fUkRMMFJfREFUQTBfUG9zOworICBwUnhNc2ctPkRhdGFbMV0gPSAoQ0FOX1JETDBSX0RBVEExICYgaGNhbi0+SW5zdGFuY2UtPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SRExSKSA+PiBDQU5fUkRMMFJfREFUQTFfUG9zOworICBwUnhNc2ctPkRhdGFbMl0gPSAoQ0FOX1JETDBSX0RBVEEyICYgaGNhbi0+SW5zdGFuY2UtPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SRExSKSA+PiBDQU5fUkRMMFJfREFUQTJfUG9zOworICBwUnhNc2ctPkRhdGFbM10gPSAoQ0FOX1JETDBSX0RBVEEzICYgaGNhbi0+SW5zdGFuY2UtPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SRExSKSA+PiBDQU5fUkRMMFJfREFUQTNfUG9zOworICBwUnhNc2ctPkRhdGFbNF0gPSAoQ0FOX1JESDBSX0RBVEE0ICYgaGNhbi0+SW5zdGFuY2UtPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SREhSKSA+PiBDQU5fUkRIMFJfREFUQTRfUG9zOworICBwUnhNc2ctPkRhdGFbNV0gPSAoQ0FOX1JESDBSX0RBVEE1ICYgaGNhbi0+SW5zdGFuY2UtPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SREhSKSA+PiBDQU5fUkRIMFJfREFUQTVfUG9zOworICBwUnhNc2ctPkRhdGFbNl0gPSAoQ0FOX1JESDBSX0RBVEE2ICYgaGNhbi0+SW5zdGFuY2UtPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SREhSKSA+PiBDQU5fUkRIMFJfREFUQTZfUG9zOworICBwUnhNc2ctPkRhdGFbN10gPSAoQ0FOX1JESDBSX0RBVEE3ICYgaGNhbi0+SW5zdGFuY2UtPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SREhSKSA+PiBDQU5fUkRIMFJfREFUQTdfUG9zOworICAKKyAgLyogUmVsZWFzZSB0aGUgRklGTyAqLworICBpZihGSUZPTnVtYmVyID09IENBTl9GSUZPMCkKKyAgeworICAgIC8qIFJlbGVhc2UgRklGTzAgKi8KKyAgICBfX0hBTF9DQU5fRklGT19SRUxFQVNFKGhjYW4sIENBTl9GSUZPMCk7CisgIH0KKyAgZWxzZSAvKiBGSUZPTnVtYmVyID09IENBTl9GSUZPMSAqLworICB7CisgICAgLyogUmVsZWFzZSBGSUZPMSAqLworICAgIF9fSEFMX0NBTl9GSUZPX1JFTEVBU0UoaGNhbiwgQ0FOX0ZJRk8xKTsKKyAgfQorCisgIC8qIENoYW5nZSBDQU4gc3RhdGUgKi8KKyAgaWYgKEZJRk9OdW1iZXIgPT0gQ0FOX0ZJRk8wKQorICB7CisgICAgc3dpdGNoKGhjYW4tPlN0YXRlKQorICAgIHsKKyAgICAgIGNhc2UoSEFMX0NBTl9TVEFURV9CVVNZX1RYX1JYMCk6CisgICAgICAgIGhjYW4tPlN0YXRlID0gSEFMX0NBTl9TVEFURV9CVVNZX1RYOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UoSEFMX0NBTl9TVEFURV9CVVNZX1JYMF9SWDEpOgorICAgICAgICBoY2FuLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfQlVTWV9SWDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZShIQUxfQ0FOX1NUQVRFX0JVU1lfVFhfUlgwX1JYMSk6CisgICAgICAgIGhjYW4tPlN0YXRlID0gSEFMX0NBTl9TVEFURV9CVVNZX1RYX1JYMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiAvKiBIQUxfQ0FOX1NUQVRFX0JVU1lfUlgwICovCisgICAgICAgIGhjYW4tPlN0YXRlID0gSEFMX0NBTl9TVEFURV9SRUFEWTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgLyogRklGT051bWJlciA9PSBDQU5fRklGTzEgKi8KKyAgeworICAgIHN3aXRjaChoY2FuLT5TdGF0ZSkKKyAgICB7CisgICAgICBjYXNlKEhBTF9DQU5fU1RBVEVfQlVTWV9UWF9SWDEpOgorICAgICAgICBoY2FuLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfQlVTWV9UWDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlKEhBTF9DQU5fU1RBVEVfQlVTWV9SWDBfUlgxKToKKyAgICAgICAgaGNhbi0+U3RhdGUgPSBIQUxfQ0FOX1NUQVRFX0JVU1lfUlgwOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UoSEFMX0NBTl9TVEFURV9CVVNZX1RYX1JYMF9SWDEpOgorICAgICAgICBoY2FuLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfQlVTWV9UWF9SWDA7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDogLyogSEFMX0NBTl9TVEFURV9CVVNZX1JYMSAqLworICAgICAgICBoY2FuLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfUkVBRFk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGNhbik7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmVzIGEgY29ycmVjdCBDQU4gZnJhbWUuCisgICogQHBhcmFtICBoY2FuIHBvaW50ZXIgdG8gYSBDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQ0FOLiAgCisgICogQHBhcmFtICBGSUZPTnVtYmVyICAgIEZJRk8gbnVtYmVyLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NBTl9SZWNlaXZlX0lUKENBTl9IYW5kbGVUeXBlRGVmKiBoY2FuLCB1aW50OF90IEZJRk9OdW1iZXIpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19DQU5fRklGTyhGSUZPTnVtYmVyKSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoY2FuKTsKKworICAvKiBDaGVjayBpZiBDQU4gc3RhdGUgaXMgbm90IGJ1c3kgZm9yIFJYIEZJRk8wICovCisgIGlmICgoRklGT051bWJlciA9PSBDQU5fRklGTzApICYmICgoaGNhbi0+U3RhdGUgPT0gSEFMX0NBTl9TVEFURV9CVVNZX1JYMCkgfHwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoY2FuLT5TdGF0ZSA9PSBIQUxfQ0FOX1NUQVRFX0JVU1lfVFhfUlgwKSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoY2FuLT5TdGF0ZSA9PSBIQUxfQ0FOX1NUQVRFX0JVU1lfUlgwX1JYMSkgfHwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoY2FuLT5TdGF0ZSA9PSBIQUxfQ0FOX1NUQVRFX0JVU1lfVFhfUlgwX1JYMSkpKQorICB7CisgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY2FuKTsKKworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorCisgIC8qIENoZWNrIGlmIENBTiBzdGF0ZSBpcyBub3QgYnVzeSBmb3IgUlggRklGTzEgKi8KKyAgaWYgKChGSUZPTnVtYmVyID09IENBTl9GSUZPMSkgJiYgKChoY2FuLT5TdGF0ZSA9PSBIQUxfQ0FOX1NUQVRFX0JVU1lfUlgxKSB8fCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhjYW4tPlN0YXRlID09IEhBTF9DQU5fU1RBVEVfQlVTWV9UWF9SWDEpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhjYW4tPlN0YXRlID09IEhBTF9DQU5fU1RBVEVfQlVTWV9SWDBfUlgxKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhjYW4tPlN0YXRlID09IEhBTF9DQU5fU1RBVEVfQlVTWV9UWF9SWDBfUlgxKSkpCisgIHsKKyAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhjYW4pOworCisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisKKyAgLyogQ2hhbmdlIENBTiBzdGF0ZSAqLworICBpZiAoRklGT051bWJlciA9PSBDQU5fRklGTzApCisgIHsKKyAgICBzd2l0Y2goaGNhbi0+U3RhdGUpCisgICAgeworICAgICAgY2FzZShIQUxfQ0FOX1NUQVRFX0JVU1lfVFgpOgorICAgICAgICBoY2FuLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfQlVTWV9UWF9SWDA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZShIQUxfQ0FOX1NUQVRFX0JVU1lfUlgxKToKKyAgICAgICAgaGNhbi0+U3RhdGUgPSBIQUxfQ0FOX1NUQVRFX0JVU1lfUlgwX1JYMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlKEhBTF9DQU5fU1RBVEVfQlVTWV9UWF9SWDEpOgorICAgICAgICBoY2FuLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfQlVTWV9UWF9SWDBfUlgxOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6IC8qIEhBTF9DQU5fU1RBVEVfUkVBRFkgKi8KKyAgICAgICAgaGNhbi0+U3RhdGUgPSBIQUxfQ0FOX1NUQVRFX0JVU1lfUlgwOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSAvKiBGSUZPTnVtYmVyID09IENBTl9GSUZPMSAqLworICB7CisgICAgc3dpdGNoKGhjYW4tPlN0YXRlKQorICAgIHsKKyAgICAgIGNhc2UoSEFMX0NBTl9TVEFURV9CVVNZX1RYKToKKyAgICAgICAgaGNhbi0+U3RhdGUgPSBIQUxfQ0FOX1NUQVRFX0JVU1lfVFhfUlgxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UoSEFMX0NBTl9TVEFURV9CVVNZX1JYMCk6CisgICAgICAgIGhjYW4tPlN0YXRlID0gSEFMX0NBTl9TVEFURV9CVVNZX1JYMF9SWDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZShIQUxfQ0FOX1NUQVRFX0JVU1lfVFhfUlgwKToKKyAgICAgICAgaGNhbi0+U3RhdGUgPSBIQUxfQ0FOX1NUQVRFX0JVU1lfVFhfUlgwX1JYMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiAvKiBIQUxfQ0FOX1NUQVRFX1JFQURZICovCisgICAgICAgIGhjYW4tPlN0YXRlID0gSEFMX0NBTl9TVEFURV9CVVNZX1JYMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLyogU2V0IENBTiBlcnJvciBjb2RlIHRvIG5vbmUgKi8KKyAgaGNhbi0+RXJyb3JDb2RlID0gSEFMX0NBTl9FUlJPUl9OT05FOworCisgIC8qIEVuYWJsZSBpbnRlcnJ1cHRzOiAqLworICAvKiAgLSBFbmFibGUgRXJyb3Igd2FybmluZyBJbnRlcnJ1cHQgKi8KKyAgLyogIC0gRW5hYmxlIEVycm9yIHBhc3NpdmUgSW50ZXJydXB0ICovCisgIC8qICAtIEVuYWJsZSBCdXMtb2ZmIEludGVycnVwdCAqLworICAvKiAgLSBFbmFibGUgTGFzdCBlcnJvciBjb2RlIEludGVycnVwdCAqLworICAvKiAgLSBFbmFibGUgRXJyb3IgSW50ZXJydXB0ICovCisgIF9fSEFMX0NBTl9FTkFCTEVfSVQoaGNhbiwgQ0FOX0lUX0VXRyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FOX0lUX0VQViB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FOX0lUX0JPRiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FOX0lUX0xFQyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FOX0lUX0VSUik7CisKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGNhbik7CisKKyAgaWYoRklGT051bWJlciA9PSBDQU5fRklGTzApCisgIHsKKyAgICAvKiBFbmFibGUgRklGTyAwIG92ZXJydW4gYW5kIG1lc3NhZ2UgcGVuZGluZyBJbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9DQU5fRU5BQkxFX0lUKGhjYW4sIENBTl9JVF9GT1YwIHwgQ0FOX0lUX0ZNUDApOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIEVuYWJsZSBGSUZPIDEgb3ZlcnJ1biBhbmQgbWVzc2FnZSBwZW5kaW5nIEludGVycnVwdCAqLworICAgIF9fSEFMX0NBTl9FTkFCTEVfSVQoaGNhbiwgQ0FOX0lUX0ZPVjEgfCBDQU5fSVRfRk1QMSk7CisgIH0KKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBFbnRlcnMgdGhlIFNsZWVwIChsb3cgcG93ZXIpIG1vZGUuCisgICogQHBhcmFtICBoY2FuIHBvaW50ZXIgdG8gYSBDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQ0FOLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cy4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DQU5fU2xlZXAoQ0FOX0hhbmRsZVR5cGVEZWYqIGhjYW4pCit7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDBVOworICAgCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGNhbik7CisgIAorICAvKiBDaGFuZ2UgQ0FOIHN0YXRlICovCisgIGhjYW4tPlN0YXRlID0gSEFMX0NBTl9TVEFURV9CVVNZOyAKKyAgICAKKyAgLyogUmVxdWVzdCBTbGVlcCBtb2RlICovCisgIE1PRElGWV9SRUcoaGNhbi0+SW5zdGFuY2UtPk1DUiwKKyAgICAgICAgICAgICBDQU5fTUNSX0lOUlEgICAgICAgLAorICAgICAgICAgICAgIENBTl9NQ1JfU0xFRVAgICAgICAgKTsKKyAgIAorICAvKiBTbGVlcCBtb2RlIHN0YXR1cyAqLworICBpZiAoSEFMX0lTX0JJVF9DTFIoaGNhbi0+SW5zdGFuY2UtPk1TUiwgQ0FOX01TUl9TTEFLKSB8fAorICAgICAgSEFMX0lTX0JJVF9TRVQoaGNhbi0+SW5zdGFuY2UtPk1TUiwgQ0FOX01TUl9JTkFLKSAgICkKKyAgeworICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNhbik7CisKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAKKyAgLyogR2V0IHRpY2sgKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsgICAKKyAgCisgIC8qIFdhaXQgdGhlIGFja25vd2xlZGdlICovCisgIHdoaWxlIChIQUxfSVNfQklUX0NMUihoY2FuLT5JbnN0YW5jZS0+TVNSLCBDQU5fTVNSX1NMQUspIHx8CisgICAgICAgICBIQUxfSVNfQklUX1NFVChoY2FuLT5JbnN0YW5jZS0+TVNSLCBDQU5fTVNSX0lOQUspICAgKQorICB7CisgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gQ0FOX1RJTUVPVVRfVkFMVUUpCisgICAgeworICAgICAgaGNhbi0+U3RhdGUgPSBIQUxfQ0FOX1NUQVRFX1RJTUVPVVQ7CisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGNhbik7CisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICB9CisgIAorICAvKiBDaGFuZ2UgQ0FOIHN0YXRlICovCisgIGhjYW4tPlN0YXRlID0gSEFMX0NBTl9TVEFURV9SRUFEWTsKKyAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhjYW4pOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFdha2VzIHVwIHRoZSBDQU4gcGVyaXBoZXJhbCBmcm9tIHNsZWVwIG1vZGUsIGFmdGVyIHRoYXQgdGhlIENBTiBwZXJpcGhlcmFsCisgICogICAgICAgICBpcyBpbiB0aGUgbm9ybWFsIG1vZGUuCisgICogQHBhcmFtICBoY2FuIHBvaW50ZXIgdG8gYSBDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQ0FOLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cy4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DQU5fV2FrZVVwKENBTl9IYW5kbGVUeXBlRGVmKiBoY2FuKQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKyAgICAKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoY2FuKTsKKyAgCisgIC8qIENoYW5nZSBDQU4gc3RhdGUgKi8KKyAgaGNhbi0+U3RhdGUgPSBIQUxfQ0FOX1NUQVRFX0JVU1k7ICAKKyAKKyAgLyogV2FrZSB1cCByZXF1ZXN0ICovCisgIENMRUFSX0JJVChoY2FuLT5JbnN0YW5jZS0+TUNSLCBDQU5fTUNSX1NMRUVQKTsKKyAgICAKKyAgLyogR2V0IHRpY2sgKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsgICAKKyAgCisgIC8qIFNsZWVwIG1vZGUgc3RhdHVzICovCisgIHdoaWxlKEhBTF9JU19CSVRfU0VUKGhjYW4tPkluc3RhbmNlLT5NU1IsIENBTl9NU1JfU0xBSykpCisgIHsKKyAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBDQU5fVElNRU9VVF9WQUxVRSkKKyAgICB7CisgICAgICBoY2FuLT5TdGF0ZT0gSEFMX0NBTl9TVEFURV9USU1FT1VUOworCisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGNhbik7CisKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKworICBpZihIQUxfSVNfQklUX1NFVChoY2FuLT5JbnN0YW5jZS0+TVNSLCBDQU5fTVNSX1NMQUspKQorICB7CisgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY2FuKTsKKworICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIAorICAvKiBDaGFuZ2UgQ0FOIHN0YXRlICovCisgIGhjYW4tPlN0YXRlID0gSEFMX0NBTl9TVEFURV9SRUFEWTsgCisgIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoY2FuKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGVzIENBTiBpbnRlcnJ1cHQgcmVxdWVzdCAgCisgICogQHBhcmFtICBoY2FuIHBvaW50ZXIgdG8gYSBDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQ0FOLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfQ0FOX0lSUUhhbmRsZXIoQ0FOX0hhbmRsZVR5cGVEZWYqIGhjYW4pCit7CisgIHVpbnQzMl90IGVycm9yY29kZSA9IEhBTF9DQU5fRVJST1JfTk9ORTsKKworICAvKiBDaGVjayBPdmVycnVuIGZsYWcgZm9yIEZJRk8wICovCisgIGlmKChfX0hBTF9DQU5fR0VUX0ZMQUcoaGNhbiwgQ0FOX0ZMQUdfRk9WMCkpICAgICYmCisgICAgIChfX0hBTF9DQU5fR0VUX0lUX1NPVVJDRShoY2FuLCBDQU5fSVRfRk9WMCkpKQorICB7CisgICAgLyogU2V0IENBTiBlcnJvciBjb2RlIHRvIEZPVjAgZXJyb3IgKi8KKyAgICBlcnJvcmNvZGUgfD0gSEFMX0NBTl9FUlJPUl9GT1YwOworCisgICAgLyogQ2xlYXIgRklGTzAgT3ZlcnJ1biBGbGFnICovCisgICAgX19IQUxfQ0FOX0NMRUFSX0ZMQUcoaGNhbiwgQ0FOX0ZMQUdfRk9WMCk7CisgIH0KKworICAvKiBDaGVjayBPdmVycnVuIGZsYWcgZm9yIEZJRk8xICovCisgIGlmKChfX0hBTF9DQU5fR0VUX0ZMQUcoaGNhbiwgQ0FOX0ZMQUdfRk9WMSkpICAgICYmCisgICAgIChfX0hBTF9DQU5fR0VUX0lUX1NPVVJDRShoY2FuLCBDQU5fSVRfRk9WMSkpKQorICB7CisgICAgLyogU2V0IENBTiBlcnJvciBjb2RlIHRvIEZPVjEgZXJyb3IgKi8KKyAgICBlcnJvcmNvZGUgfD0gSEFMX0NBTl9FUlJPUl9GT1YxOworCisgICAgLyogQ2xlYXIgRklGTzEgT3ZlcnJ1biBGbGFnICovCisgICAgX19IQUxfQ0FOX0NMRUFSX0ZMQUcoaGNhbiwgQ0FOX0ZMQUdfRk9WMSk7CisgIH0KKworICAvKiBDaGVjayBFbmQgb2YgdHJhbnNtaXNzaW9uIGZsYWcgKi8KKyAgaWYoX19IQUxfQ0FOX0dFVF9JVF9TT1VSQ0UoaGNhbiwgQ0FOX0lUX1RNRSkpCisgIHsKKyAgICAvKiBDaGVjayBUcmFuc21pdCByZXF1ZXN0IGNvbXBsZXRpb24gc3RhdHVzICovCisgICAgaWYoKF9fSEFMX0NBTl9UUkFOU01JVF9TVEFUVVMoaGNhbiwgQ0FOX1RYTUFJTEJPWF8wKSkgfHwKKyAgICAgICAoX19IQUxfQ0FOX1RSQU5TTUlUX1NUQVRVUyhoY2FuLCBDQU5fVFhNQUlMQk9YXzEpKSB8fAorICAgICAgIChfX0hBTF9DQU5fVFJBTlNNSVRfU1RBVFVTKGhjYW4sIENBTl9UWE1BSUxCT1hfMikpKQorICAgIHsKKyAgICAgIC8qIENoZWNrIFRyYW5zbWl0IHN1Y2Nlc3MgKi8KKyAgICAgIGlmKChfX0hBTF9DQU5fR0VUX0ZMQUcoaGNhbiwgQ0FOX0ZMQUdfVFhPSzApKSB8fAorICAgICAgICAgKF9fSEFMX0NBTl9HRVRfRkxBRyhoY2FuLCBDQU5fRkxBR19UWE9LMSkpIHx8CisgICAgICAgICAoX19IQUxfQ0FOX0dFVF9GTEFHKGhjYW4sIENBTl9GTEFHX1RYT0syKSkpCisgICAgICB7CisgICAgICAgIC8qIENhbGwgdHJhbnNtaXQgZnVuY3Rpb24gKi8KKyAgICAgICAgQ0FOX1RyYW5zbWl0X0lUKGhjYW4pOworICAgICAgfQorICAgICAgZWxzZSAvKiBUcmFuc21pdCBmYWlsdXJlICovCisgICAgICB7CisgICAgICAgIC8qIFNldCBDQU4gZXJyb3IgY29kZSB0byBUWEZBSUwgZXJyb3IgKi8KKyAgICAgICAgZXJyb3Jjb2RlIHw9IEhBTF9DQU5fRVJST1JfVFhGQUlMOworICAgICAgfQorCisgICAgICAvKiBDbGVhciB0cmFuc21pc3Npb24gc3RhdHVzIGZsYWdzIChSUUNQeCBhbmQgVFhPS3gpICovCisgICAgICBTRVRfQklUKGhjYW4tPkluc3RhbmNlLT5UU1IsIENBTl9UU1JfUlFDUDAgIHwgQ0FOX1RTUl9SUUNQMSAgfCBDQU5fVFNSX1JRQ1AyIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU5fRkxBR19UWE9LMCB8IENBTl9GTEFHX1RYT0sxIHwgQ0FOX0ZMQUdfVFhPSzIpOworICAgIH0KKyAgfQorICAKKyAgLyogQ2hlY2sgRW5kIG9mIHJlY2VwdGlvbiBmbGFnIGZvciBGSUZPMCAqLworICBpZigoX19IQUxfQ0FOX0dFVF9JVF9TT1VSQ0UoaGNhbiwgQ0FOX0lUX0ZNUDApKSAmJgorICAgICAoX19IQUxfQ0FOX01TR19QRU5ESU5HKGhjYW4sIENBTl9GSUZPMCkgIT0gMFUpKQorICB7CisgICAgLyogQ2FsbCByZWNlaXZlIGZ1bmN0aW9uICovCisgICAgQ0FOX1JlY2VpdmVfSVQoaGNhbiwgQ0FOX0ZJRk8wKTsKKyAgfQorICAKKyAgLyogQ2hlY2sgRW5kIG9mIHJlY2VwdGlvbiBmbGFnIGZvciBGSUZPMSAqLworICBpZigoX19IQUxfQ0FOX0dFVF9JVF9TT1VSQ0UoaGNhbiwgQ0FOX0lUX0ZNUDEpKSAmJgorICAgICAoX19IQUxfQ0FOX01TR19QRU5ESU5HKGhjYW4sIENBTl9GSUZPMSkgIT0gMFUpKQorICB7CisgICAgLyogQ2FsbCByZWNlaXZlIGZ1bmN0aW9uICovCisgICAgQ0FOX1JlY2VpdmVfSVQoaGNhbiwgQ0FOX0ZJRk8xKTsKKyAgfQorICAKKyAgLyogU2V0IGVycm9yIGNvZGUgaW4gaGFuZGxlICovCisgIGhjYW4tPkVycm9yQ29kZSB8PSBlcnJvcmNvZGU7CisKKyAgLyogQ2hlY2sgRXJyb3IgV2FybmluZyBGbGFnICovCisgIGlmKChfX0hBTF9DQU5fR0VUX0ZMQUcoaGNhbiwgQ0FOX0ZMQUdfRVdHKSkgICAgJiYKKyAgICAgKF9fSEFMX0NBTl9HRVRfSVRfU09VUkNFKGhjYW4sIENBTl9JVF9FV0cpKSAmJgorICAgICAoX19IQUxfQ0FOX0dFVF9JVF9TT1VSQ0UoaGNhbiwgQ0FOX0lUX0VSUikpKQorICB7CisgICAgLyogU2V0IENBTiBlcnJvciBjb2RlIHRvIEVXRyBlcnJvciAqLworICAgIGhjYW4tPkVycm9yQ29kZSB8PSBIQUxfQ0FOX0VSUk9SX0VXRzsKKyAgICAvKiBObyBuZWVkIGZvciBjbGVhciBvZiBFcnJvciBXYXJuaW5nIEZsYWcgYXMgcmVhZC1vbmx5ICovCisgIH0KKyAgCisgIC8qIENoZWNrIEVycm9yIFBhc3NpdmUgRmxhZyAqLworICBpZigoX19IQUxfQ0FOX0dFVF9GTEFHKGhjYW4sIENBTl9GTEFHX0VQVikpICAgICYmCisgICAgIChfX0hBTF9DQU5fR0VUX0lUX1NPVVJDRShoY2FuLCBDQU5fSVRfRVBWKSkgJiYKKyAgICAgKF9fSEFMX0NBTl9HRVRfSVRfU09VUkNFKGhjYW4sIENBTl9JVF9FUlIpKSkKKyAgeworICAgIC8qIFNldCBDQU4gZXJyb3IgY29kZSB0byBFUFYgZXJyb3IgKi8KKyAgICBoY2FuLT5FcnJvckNvZGUgfD0gSEFMX0NBTl9FUlJPUl9FUFY7CisgICAgLyogTm8gbmVlZCBmb3IgY2xlYXIgb2YgRXJyb3IgUGFzc2l2ZSBGbGFnIGFzIHJlYWQtb25seSAqLyAKKyAgfQorICAKKyAgLyogQ2hlY2sgQnVzLU9mZiBGbGFnICovCisgIGlmKChfX0hBTF9DQU5fR0VUX0ZMQUcoaGNhbiwgQ0FOX0ZMQUdfQk9GKSkgICAgJiYKKyAgICAgKF9fSEFMX0NBTl9HRVRfSVRfU09VUkNFKGhjYW4sIENBTl9JVF9CT0YpKSAmJgorICAgICAoX19IQUxfQ0FOX0dFVF9JVF9TT1VSQ0UoaGNhbiwgQ0FOX0lUX0VSUikpKQorICB7CisgICAgLyogU2V0IENBTiBlcnJvciBjb2RlIHRvIEJPRiBlcnJvciAqLworICAgIGhjYW4tPkVycm9yQ29kZSB8PSBIQUxfQ0FOX0VSUk9SX0JPRjsKKyAgICAvKiBObyBuZWVkIGZvciBjbGVhciBvZiBCdXMtT2ZmIEZsYWcgYXMgcmVhZC1vbmx5ICovCisgIH0KKyAgCisgIC8qIENoZWNrIExhc3QgZXJyb3IgY29kZSBGbGFnICovCisgIGlmKCghSEFMX0lTX0JJVF9DTFIoaGNhbi0+SW5zdGFuY2UtPkVTUiwgQ0FOX0VTUl9MRUMpKSAmJgorICAgICAoX19IQUxfQ0FOX0dFVF9JVF9TT1VSQ0UoaGNhbiwgQ0FOX0lUX0xFQykpICAgICAgICAgJiYKKyAgICAgKF9fSEFMX0NBTl9HRVRfSVRfU09VUkNFKGhjYW4sIENBTl9JVF9FUlIpKSkKKyAgeworICAgIHN3aXRjaChoY2FuLT5JbnN0YW5jZS0+RVNSICYgQ0FOX0VTUl9MRUMpCisgICAgeworICAgICAgY2FzZShDQU5fRVNSX0xFQ18wKToKKyAgICAgICAgICAvKiBTZXQgQ0FOIGVycm9yIGNvZGUgdG8gU1RGIGVycm9yICovCisgICAgICAgICAgaGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9DQU5fRVJST1JfU1RGOworICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZShDQU5fRVNSX0xFQ18xKToKKyAgICAgICAgICAvKiBTZXQgQ0FOIGVycm9yIGNvZGUgdG8gRk9SIGVycm9yICovCisgICAgICAgICAgaGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9DQU5fRVJST1JfRk9SOworICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZShDQU5fRVNSX0xFQ18xIHwgQ0FOX0VTUl9MRUNfMCk6CisgICAgICAgICAgLyogU2V0IENBTiBlcnJvciBjb2RlIHRvIEFDSyBlcnJvciAqLworICAgICAgICAgIGhjYW4tPkVycm9yQ29kZSB8PSBIQUxfQ0FOX0VSUk9SX0FDSzsKKyAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UoQ0FOX0VTUl9MRUNfMik6CisgICAgICAgICAgLyogU2V0IENBTiBlcnJvciBjb2RlIHRvIEJSIGVycm9yICovCisgICAgICAgICAgaGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9DQU5fRVJST1JfQlI7CisgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlKENBTl9FU1JfTEVDXzIgfCBDQU5fRVNSX0xFQ18wKToKKyAgICAgICAgICAvKiBTZXQgQ0FOIGVycm9yIGNvZGUgdG8gQkQgZXJyb3IgKi8KKyAgICAgICAgICBoY2FuLT5FcnJvckNvZGUgfD0gSEFMX0NBTl9FUlJPUl9CRDsKKyAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UoQ0FOX0VTUl9MRUNfMiB8IENBTl9FU1JfTEVDXzEpOgorICAgICAgICAgIC8qIFNldCBDQU4gZXJyb3IgY29kZSB0byBDUkMgZXJyb3IgKi8KKyAgICAgICAgICBoY2FuLT5FcnJvckNvZGUgfD0gSEFMX0NBTl9FUlJPUl9DUkM7CisgICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIENsZWFyIExhc3QgZXJyb3IgY29kZSBGbGFnICovIAorICAgIENMRUFSX0JJVChoY2FuLT5JbnN0YW5jZS0+RVNSLCBDQU5fRVNSX0xFQyk7CisgIH0KKworICAvKiBDYWxsIHRoZSBFcnJvciBjYWxsIEJhY2sgaW4gY2FzZSBvZiBFcnJvcnMgKi8KKyAgaWYoaGNhbi0+RXJyb3JDb2RlICE9IEhBTF9DQU5fRVJST1JfTk9ORSkKKyAgeworICAgIC8qIENsZWFyIEVSUkkgRmxhZyAqLyAKKyAgICBTRVRfQklUKGhjYW4tPkluc3RhbmNlLT5NU1IsIENBTl9NU1JfRVJSSSk7CisKKyAgICAvKiBTZXQgdGhlIENBTiBzdGF0ZSByZWFkeSB0byBiZSBhYmxlIHRvIHN0YXJ0IGFnYWluIHRoZSBwcm9jZXNzICovCisgICAgaGNhbi0+U3RhdGUgPSBIQUxfQ0FOX1NUQVRFX1JFQURZOworCisgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzOiAqLworICAgIC8qICAtIERpc2FibGUgRXJyb3Igd2FybmluZyBJbnRlcnJ1cHQgKi8KKyAgICAvKiAgLSBEaXNhYmxlIEVycm9yIHBhc3NpdmUgSW50ZXJydXB0ICovCisgICAgLyogIC0gRGlzYWJsZSBCdXMtb2ZmIEludGVycnVwdCAqLworICAgIC8qICAtIERpc2FibGUgTGFzdCBlcnJvciBjb2RlIEludGVycnVwdCAqLworICAgIC8qICAtIERpc2FibGUgRXJyb3IgSW50ZXJydXB0ICovCisgICAgLyogIC0gRGlzYWJsZSBGSUZPIDAgbWVzc2FnZSBwZW5kaW5nIEludGVycnVwdCAqLworICAgIC8qICAtIERpc2FibGUgRklGTyAwIE92ZXJydW4gSW50ZXJydXB0ICovCisgICAgLyogIC0gRGlzYWJsZSBGSUZPIDEgbWVzc2FnZSBwZW5kaW5nIEludGVycnVwdCAqLworICAgIC8qICAtIERpc2FibGUgRklGTyAxIE92ZXJydW4gSW50ZXJydXB0ICovCisgICAgLyogIC0gRGlzYWJsZSBUcmFuc21pdCBtYWlsYm94IGVtcHR5IEludGVycnVwdCAqLworICAgIF9fSEFMX0NBTl9ESVNBQkxFX0lUKGhjYW4sIENBTl9JVF9FV0cgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTl9JVF9FUFYgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTl9JVF9CT0YgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTl9JVF9MRUMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTl9JVF9FUlIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTl9JVF9GTVAwfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTl9JVF9GT1YwfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTl9JVF9GTVAxfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTl9JVF9GT1YxfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTl9JVF9UTUUgICk7CisKKyAgICAvKiBDYWxsIEVycm9yIGNhbGxiYWNrIGZ1bmN0aW9uICovCisgICAgSEFMX0NBTl9FcnJvckNhbGxiYWNrKGhjYW4pOworICB9ICAKK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pc3Npb24gIGNvbXBsZXRlIGNhbGxiYWNrIGluIG5vbiBibG9ja2luZyBtb2RlIAorICAqIEBwYXJhbSAgaGNhbiBwb2ludGVyIHRvIGEgQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIENBTi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9DQU5fVHhDcGx0Q2FsbGJhY2soQ0FOX0hhbmRsZVR5cGVEZWYqIGhjYW4pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhjYW4pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfQ0FOX1R4Q3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXNzaW9uICBjb21wbGV0ZSBjYWxsYmFjayBpbiBub24gYmxvY2tpbmcgbW9kZSAKKyAgKiBAcGFyYW0gIGhjYW4gcG9pbnRlciB0byBhIENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBDQU4uCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQ0FOX1J4Q3BsdENhbGxiYWNrKENBTl9IYW5kbGVUeXBlRGVmKiBoY2FuKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoY2FuKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0NBTl9SeENwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEVycm9yIENBTiBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhjYW4gcG9pbnRlciB0byBhIENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBDQU4uCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQ0FOX0Vycm9yQ2FsbGJhY2soQ0FOX0hhbmRsZVR5cGVEZWYgKmhjYW4pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhjYW4pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfQ0FOX0Vycm9yQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDQU5fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBDQU4gUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgCisgKgorQHZlcmJhdGltICAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIDoKKyAgICAgICgrKSBDaGVjayB0aGUgQ0FOIHN0YXRlLgorICAgICAgKCspIENoZWNrIENBTiBFcnJvcnMgZGV0ZWN0ZWQgZHVyaW5nIGludGVycnVwdCBwcm9jZXNzCisgICAgICAgICAKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgcmV0dXJuIHRoZSBDQU4gc3RhdGUKKyAgKiBAcGFyYW0gIGhjYW4gcG9pbnRlciB0byBhIENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBDQU4uCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9DQU5fU3RhdGVUeXBlRGVmIEhBTF9DQU5fR2V0U3RhdGUoQ0FOX0hhbmRsZVR5cGVEZWYqIGhjYW4pCit7CisgIC8qIFJldHVybiBDQU4gc3RhdGUgKi8KKyAgcmV0dXJuIGhjYW4tPlN0YXRlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgQ0FOIGVycm9yIGNvZGUKKyAgKiBAcGFyYW0gIGhjYW4gcG9pbnRlciB0byBhIENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBDQU4uCisgICogQHJldHZhbCBDQU4gRXJyb3IgQ29kZQorICAqLwordWludDMyX3QgSEFMX0NBTl9HZXRFcnJvcihDQU5fSGFuZGxlVHlwZURlZiAqaGNhbikKK3sKKyAgcmV0dXJuIGhjYW4tPkVycm9yQ29kZTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGFkZHRvZ3JvdXAgQ0FOX1ByaXZhdGVfRnVuY3Rpb25zIENBTiBQcml2YXRlIEZ1bmN0aW9ucworICogIEBicmllZiAgICBDQU4gRnJhbWUgbWVzc2FnZSBSeC9UeCBmdW5jdGlvbnMgCisgKgorICogQHsKKyAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYXRlcyBhbmQgdHJhbnNtaXRzIGEgQ0FOIGZyYW1lIG1lc3NhZ2UuCisgICogQHBhcmFtICBoY2FuIHBvaW50ZXIgdG8gYSBDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQ0FOLiAgCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ0FOX1RyYW5zbWl0X0lUKENBTl9IYW5kbGVUeXBlRGVmKiBoY2FuKQoreworICAvKiBEaXNhYmxlIFRyYW5zbWl0IG1haWxib3ggZW1wdHkgSW50ZXJydXB0ICovCisgIF9fSEFMX0NBTl9ESVNBQkxFX0lUKGhjYW4sIENBTl9JVF9UTUUpOworICAKKyAgaWYoaGNhbi0+U3RhdGUgPT0gSEFMX0NBTl9TVEFURV9CVVNZX1RYKQorICB7ICAgCisgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzOiAqLworICAgIC8qICAtIERpc2FibGUgRXJyb3Igd2FybmluZyBJbnRlcnJ1cHQgKi8KKyAgICAvKiAgLSBEaXNhYmxlIEVycm9yIHBhc3NpdmUgSW50ZXJydXB0ICovCisgICAgLyogIC0gRGlzYWJsZSBCdXMtb2ZmIEludGVycnVwdCAqLworICAgIC8qICAtIERpc2FibGUgTGFzdCBlcnJvciBjb2RlIEludGVycnVwdCAqLworICAgIC8qICAtIERpc2FibGUgRXJyb3IgSW50ZXJydXB0ICovCisgICAgX19IQUxfQ0FOX0RJU0FCTEVfSVQoaGNhbiwgQ0FOX0lUX0VXRyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FOX0lUX0VQViB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FOX0lUX0JPRiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FOX0lUX0xFQyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FOX0lUX0VSUiApOworICB9CisKKyAgLyogQ2hhbmdlIENBTiBzdGF0ZSAqLworICBzd2l0Y2goaGNhbi0+U3RhdGUpCisgIHsKKyAgICBjYXNlKEhBTF9DQU5fU1RBVEVfQlVTWV9UWF9SWDApOgorICAgICAgaGNhbi0+U3RhdGUgPSBIQUxfQ0FOX1NUQVRFX0JVU1lfUlgwOworICAgICAgYnJlYWs7CisgICAgY2FzZShIQUxfQ0FOX1NUQVRFX0JVU1lfVFhfUlgxKToKKyAgICAgIGhjYW4tPlN0YXRlID0gSEFMX0NBTl9TVEFURV9CVVNZX1JYMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UoSEFMX0NBTl9TVEFURV9CVVNZX1RYX1JYMF9SWDEpOgorICAgICAgaGNhbi0+U3RhdGUgPSBIQUxfQ0FOX1NUQVRFX0JVU1lfUlgwX1JYMTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IC8qIEhBTF9DQU5fU1RBVEVfQlVTWV9UWCAqLworICAgICAgaGNhbi0+U3RhdGUgPSBIQUxfQ0FOX1NUQVRFX1JFQURZOworICAgICAgYnJlYWs7CisgIH0KKworICAvKiBUcmFuc21pc3Npb24gY29tcGxldGUgY2FsbGJhY2sgKi8gCisgIEhBTF9DQU5fVHhDcGx0Q2FsbGJhY2soaGNhbik7CisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmVzIGEgY29ycmVjdCBDQU4gZnJhbWUuCisgICogQHBhcmFtICBoY2FuICAgICAgIFBvaW50ZXIgdG8gYSBDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQ0FOLiAgCisgICogQHBhcmFtICBGSUZPTnVtYmVyIFNwZWNpZnkgdGhlIEZJRk8gbnVtYmVyICAgIAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENBTl9SZWNlaXZlX0lUKENBTl9IYW5kbGVUeXBlRGVmKiBoY2FuLCB1aW50OF90IEZJRk9OdW1iZXIpCit7CisgIENhblJ4TXNnVHlwZURlZiogcFJ4TXNnID0gTlVMTDsKKworICAvKiBTZXQgUnhNc2cgcG9pbnRlciAqLworICBpZihGSUZPTnVtYmVyID09IENBTl9GSUZPMCkKKyAgeworICAgIHBSeE1zZyA9IGhjYW4tPnBSeE1zZzsKKyAgfQorICBlbHNlIC8qIEZJRk9OdW1iZXIgPT0gQ0FOX0ZJRk8xICovCisgIHsKKyAgICBwUnhNc2cgPSBoY2FuLT5wUngxTXNnOworICB9CisKKyAgLyogR2V0IHRoZSBJZCAqLworICBwUnhNc2ctPklERSA9IENBTl9SSTBSX0lERSAmIGhjYW4tPkluc3RhbmNlLT5zRklGT01haWxCb3hbRklGT051bWJlcl0uUklSOworICBpZiAocFJ4TXNnLT5JREUgPT0gQ0FOX0lEX1NURCkKKyAgeworICAgIHBSeE1zZy0+U3RkSWQgPSAoQ0FOX1JJMFJfU1RJRCAmIGhjYW4tPkluc3RhbmNlLT5zRklGT01haWxCb3hbRklGT051bWJlcl0uUklSKSA+PiBDQU5fVEkwUl9TVElEX1BvczsKKyAgfQorICBlbHNlCisgIHsKKyAgICBwUnhNc2ctPkV4dElkID0gKDB4RkZGRkZGRjhVICYgaGNhbi0+SW5zdGFuY2UtPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SSVIpID4+IENBTl9SSTBSX0VYSURfUG9zOworICB9CisgIHBSeE1zZy0+UlRSID0gKENBTl9SSTBSX1JUUiAmIGhjYW4tPkluc3RhbmNlLT5zRklGT01haWxCb3hbRklGT051bWJlcl0uUklSKSA+PiBDQU5fUkkwUl9SVFJfUG9zOworICAvKiBHZXQgdGhlIERMQyAqLworICBwUnhNc2ctPkRMQyA9IChDQU5fUkRUMFJfRExDICYgaGNhbi0+SW5zdGFuY2UtPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SRFRSKSA+PiBDQU5fUkRUMFJfRExDX1BvczsKKyAgLyogR2V0IHRoZSBGTUkgKi8KKyAgcFJ4TXNnLT5GTUkgPSAoQ0FOX1JEVDBSX0ZNSSAmIGhjYW4tPkluc3RhbmNlLT5zRklGT01haWxCb3hbRklGT051bWJlcl0uUkRUUikgPj4gQ0FOX1JEVDBSX0ZNSV9Qb3M7CisgIC8qIEdldCB0aGUgRklGT051bWJlciAqLworICBwUnhNc2ctPkZJRk9OdW1iZXIgPSBGSUZPTnVtYmVyOworICAvKiBHZXQgdGhlIGRhdGEgZmllbGQgKi8KKyAgcFJ4TXNnLT5EYXRhWzBdID0gKENBTl9SREwwUl9EQVRBMCAmIGhjYW4tPkluc3RhbmNlLT5zRklGT01haWxCb3hbRklGT051bWJlcl0uUkRMUikgPj4gQ0FOX1JETDBSX0RBVEEwX1BvczsKKyAgcFJ4TXNnLT5EYXRhWzFdID0gKENBTl9SREwwUl9EQVRBMSAmIGhjYW4tPkluc3RhbmNlLT5zRklGT01haWxCb3hbRklGT051bWJlcl0uUkRMUikgPj4gQ0FOX1JETDBSX0RBVEExX1BvczsKKyAgcFJ4TXNnLT5EYXRhWzJdID0gKENBTl9SREwwUl9EQVRBMiAmIGhjYW4tPkluc3RhbmNlLT5zRklGT01haWxCb3hbRklGT051bWJlcl0uUkRMUikgPj4gQ0FOX1JETDBSX0RBVEEyX1BvczsKKyAgcFJ4TXNnLT5EYXRhWzNdID0gKENBTl9SREwwUl9EQVRBMyAmIGhjYW4tPkluc3RhbmNlLT5zRklGT01haWxCb3hbRklGT051bWJlcl0uUkRMUikgPj4gQ0FOX1JETDBSX0RBVEEzX1BvczsKKyAgcFJ4TXNnLT5EYXRhWzRdID0gKENBTl9SREgwUl9EQVRBNCAmIGhjYW4tPkluc3RhbmNlLT5zRklGT01haWxCb3hbRklGT051bWJlcl0uUkRIUikgPj4gQ0FOX1JESDBSX0RBVEE0X1BvczsKKyAgcFJ4TXNnLT5EYXRhWzVdID0gKENBTl9SREgwUl9EQVRBNSAmIGhjYW4tPkluc3RhbmNlLT5zRklGT01haWxCb3hbRklGT051bWJlcl0uUkRIUikgPj4gQ0FOX1JESDBSX0RBVEE1X1BvczsKKyAgcFJ4TXNnLT5EYXRhWzZdID0gKENBTl9SREgwUl9EQVRBNiAmIGhjYW4tPkluc3RhbmNlLT5zRklGT01haWxCb3hbRklGT051bWJlcl0uUkRIUikgPj4gQ0FOX1JESDBSX0RBVEE2X1BvczsKKyAgcFJ4TXNnLT5EYXRhWzddID0gKENBTl9SREgwUl9EQVRBNyAmIGhjYW4tPkluc3RhbmNlLT5zRklGT01haWxCb3hbRklGT051bWJlcl0uUkRIUikgPj4gQ0FOX1JESDBSX0RBVEE3X1BvczsKKworICAvKiBSZWxlYXNlIHRoZSBGSUZPICovCisgIC8qIFJlbGVhc2UgRklGTzAgKi8KKyAgaWYgKEZJRk9OdW1iZXIgPT0gQ0FOX0ZJRk8wKQorICB7CisgICAgX19IQUxfQ0FOX0ZJRk9fUkVMRUFTRShoY2FuLCBDQU5fRklGTzApOworICAgIAorICAgIC8qIERpc2FibGUgRklGTyAwIG92ZXJydW4gYW5kIG1lc3NhZ2UgcGVuZGluZyBJbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9DQU5fRElTQUJMRV9JVChoY2FuLCBDQU5fSVRfRk9WMCB8IENBTl9JVF9GTVAwKTsKKyAgfQorICAvKiBSZWxlYXNlIEZJRk8xICovCisgIGVsc2UgLyogRklGT051bWJlciA9PSBDQU5fRklGTzEgKi8KKyAgeworICAgIF9fSEFMX0NBTl9GSUZPX1JFTEVBU0UoaGNhbiwgQ0FOX0ZJRk8xKTsKKyAgICAKKyAgICAvKiBEaXNhYmxlIEZJRk8gMSBvdmVycnVuIGFuZCBtZXNzYWdlIHBlbmRpbmcgSW50ZXJydXB0ICovCisgICAgX19IQUxfQ0FOX0RJU0FCTEVfSVQoaGNhbiwgQ0FOX0lUX0ZPVjEgfCBDQU5fSVRfRk1QMSk7CisgIH0KKyAgCisgIGlmKChoY2FuLT5TdGF0ZSA9PSBIQUxfQ0FOX1NUQVRFX0JVU1lfUlgwKSB8fCAoaGNhbi0+U3RhdGUgPT0gSEFMX0NBTl9TVEFURV9CVVNZX1JYMSkpCisgIHsgICAKKyAgICAvKiBEaXNhYmxlIGludGVycnVwdHM6ICovCisgICAgLyogIC0gRGlzYWJsZSBFcnJvciB3YXJuaW5nIEludGVycnVwdCAqLworICAgIC8qICAtIERpc2FibGUgRXJyb3IgcGFzc2l2ZSBJbnRlcnJ1cHQgKi8KKyAgICAvKiAgLSBEaXNhYmxlIEJ1cy1vZmYgSW50ZXJydXB0ICovCisgICAgLyogIC0gRGlzYWJsZSBMYXN0IGVycm9yIGNvZGUgSW50ZXJydXB0ICovCisgICAgLyogIC0gRGlzYWJsZSBFcnJvciBJbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9DQU5fRElTQUJMRV9JVChoY2FuLCBDQU5fSVRfRVdHIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU5fSVRfRVBWIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU5fSVRfQk9GIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU5fSVRfTEVDIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU5fSVRfRVJSICk7CisgIH0KKworICAvKiBDaGFuZ2UgQ0FOIHN0YXRlICovCisgIGlmIChGSUZPTnVtYmVyID09IENBTl9GSUZPMCkKKyAgeworICAgIHN3aXRjaChoY2FuLT5TdGF0ZSkKKyAgICB7CisgICAgICBjYXNlKEhBTF9DQU5fU1RBVEVfQlVTWV9UWF9SWDApOgorICAgICAgICBoY2FuLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfQlVTWV9UWDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlKEhBTF9DQU5fU1RBVEVfQlVTWV9SWDBfUlgxKToKKyAgICAgICAgaGNhbi0+U3RhdGUgPSBIQUxfQ0FOX1NUQVRFX0JVU1lfUlgxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UoSEFMX0NBTl9TVEFURV9CVVNZX1RYX1JYMF9SWDEpOgorICAgICAgICBoY2FuLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfQlVTWV9UWF9SWDE7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDogLyogSEFMX0NBTl9TVEFURV9CVVNZX1JYMCAqLworICAgICAgICBoY2FuLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfUkVBRFk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIC8qIEZJRk9OdW1iZXIgPT0gQ0FOX0ZJRk8xICovCisgIHsKKyAgICBzd2l0Y2goaGNhbi0+U3RhdGUpCisgICAgeworICAgICAgY2FzZShIQUxfQ0FOX1NUQVRFX0JVU1lfVFhfUlgxKToKKyAgICAgICAgaGNhbi0+U3RhdGUgPSBIQUxfQ0FOX1NUQVRFX0JVU1lfVFg7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZShIQUxfQ0FOX1NUQVRFX0JVU1lfUlgwX1JYMSk6CisgICAgICAgIGhjYW4tPlN0YXRlID0gSEFMX0NBTl9TVEFURV9CVVNZX1JYMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlKEhBTF9DQU5fU1RBVEVfQlVTWV9UWF9SWDBfUlgxKToKKyAgICAgICAgaGNhbi0+U3RhdGUgPSBIQUxfQ0FOX1NUQVRFX0JVU1lfVFhfUlgwOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6IC8qIEhBTF9DQU5fU1RBVEVfQlVTWV9SWDEgKi8KKyAgICAgICAgaGNhbi0+U3RhdGUgPSBIQUxfQ0FOX1NUQVRFX1JFQURZOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvKiBSZWNlaXZlIGNvbXBsZXRlIGNhbGxiYWNrICovIAorICBIQUxfQ0FOX1J4Q3BsdENhbGxiYWNrKGhjYW4pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAqLworICAgICAgIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICAgICAgICAgICAgICAgICAgICovCisKKyNlbmRpZiAvKiBIQUxfQ0FOX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjN4eF9oYWwuYyBiL1NyYy9zdG0zMmYzeHhfaGFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY2OTdkNwotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfaGFsLmMKQEAgLTAsMCArMSw1MzUgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgaXMgdGhlIGNvbW1vbiBwYXJ0IG9mIHRoZSBIQUwgaW5pdGlhbGl6YXRpb24KKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGUgY29tbW9uIEhBTCBkcml2ZXIgY29udGFpbnMgYSBzZXQgb2YgZ2VuZXJpYyBhbmQgY29tbW9uIEFQSXMgdGhhdCBjYW4gYmUKKyAgICB1c2VkIGJ5IHRoZSBQUFAgcGVyaXBoZXJhbCBkcml2ZXJzIGFuZCB0aGUgdXNlciB0byBzdGFydCB1c2luZyB0aGUgSEFMLgorICAgIFsuLl0KKyAgICBUaGUgSEFMIGNvbnRhaW5zIHR3byBBUElzIGNhdGVnb3JpZXM6CisgICAgICAgICAoKykgSEFMIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgICAgICAgICgrKSBIQUwgQ29udHJvbCBmdW5jdGlvbnMKKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMIEhBTAorICAqIEBicmllZiBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBIQUxfUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworLyoqCisgKiBAYnJpZWYgU1RNMzJGM3h4IEhBTCBEcml2ZXIgdmVyc2lvbiBudW1iZXIgVjEuNS4yCisgICAqLworI2RlZmluZSBfX1NUTTMyRjN4eF9IQUxfVkVSU0lPTl9NQUlOICAgKDB4MDFVKSAvKiE8IFszMToyNF0gbWFpbiB2ZXJzaW9uICovCisjZGVmaW5lIF9fU1RNMzJGM3h4X0hBTF9WRVJTSU9OX1NVQjEgICAoMHgwNVUpIC8qITwgWzIzOjE2XSBzdWIxIHZlcnNpb24gKi8KKyNkZWZpbmUgX19TVE0zMkYzeHhfSEFMX1ZFUlNJT05fU1VCMiAgICgweDAyVSkgLyohPCBbMTU6OF0gIHN1YjIgdmVyc2lvbiAqLworI2RlZmluZSBfX1NUTTMyRjN4eF9IQUxfVkVSU0lPTl9SQyAgICAgKDB4MDBVKSAvKiE8IFs3OjBdICByZWxlYXNlIGNhbmRpZGF0ZSAqLworI2RlZmluZSBfX1NUTTMyRjN4eF9IQUxfVkVSU0lPTiAgICAgICAgICgoX19TVE0zMkYzeHhfSEFMX1ZFUlNJT05fTUFJTiA8PCAyNFUpXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwoX19TVE0zMkYzeHhfSEFMX1ZFUlNJT05fU1VCMSA8PCAxNlUpXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwoX19TVE0zMkYzeHhfSEFMX1ZFUlNJT05fU1VCMiA8PCA4VSApXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwoX19TVE0zMkYzeHhfSEFMX1ZFUlNJT05fUkMpKQorCisjZGVmaW5lIElEQ09ERV9ERVZJRF9NQVNLICAgICgweDAwMDAwRkZGVSkKKy8qKgorICAqIEB9CisgICovCisgIAorLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEhBTF9FeHBvcnRlZF9WYXJpYWJsZXMgSEFMIEV4cG9ydGVkIFZhcmlhYmxlcworICAqIEB7CisgICovCitfX0lPIHVpbnQzMl90IHV3VGljazsKK3VpbnQzMl90IHV3VGlja1ByaW8gICA9ICgxVUwgPDwgX19OVklDX1BSSU9fQklUUyk7IC8qIEludmFsaWQgUFJJTyAqLworSEFMX1RpY2tGcmVxVHlwZURlZiB1d1RpY2tGcmVxID0gSEFMX1RJQ0tfRlJFUV9ERUZBVUxUOyAgLyogMUtIeiAqLworLyoqCisgICogQH0KKyAgKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBIQUxfRXhwb3J0ZWRfRnVuY3Rpb25zIEhBTCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBGdW5jdGlvbnMgCisgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBJbml0aWFsaXplcyB0aGUgRmxhc2ggaW50ZXJmYWNlLCB0aGUgTlZJQyBhbGxvY2F0aW9uIGFuZCBpbml0aWFsIGNsb2NrIAorICAgICAgICAgIGNvbmZpZ3VyYXRpb24uIEl0IGluaXRpYWxpemVzIHRoZSBzeXN0aWNrIGFsc28gd2hlbiB0aW1lb3V0IGlzIG5lZWRlZAorICAgICAgICAgIGFuZCB0aGUgYmFja3VwIGRvbWFpbiB3aGVuIGVuYWJsZWQuCisgICAgICAoKykgZGUtSW5pdGlhbGl6ZXMgY29tbW9uIHBhcnQgb2YgdGhlIEhBTC4KKyAgICAgICgrKSBDb25maWd1cmUgVGhlIHRpbWUgYmFzZSBzb3VyY2UgdG8gaGF2ZSAxbXMgdGltZSBiYXNlIHdpdGggYSBkZWRpY2F0ZWQgCisgICAgICAgICAgVGljayBpbnRlcnJ1cHQgcHJpb3JpdHkuIAorICAgICAgICAoKyspIFN5c1RpY2sgdGltZXIgaXMgdXNlZCBieSBkZWZhdWx0IGFzIHNvdXJjZSBvZiB0aW1lIGJhc2UsIGJ1dCB1c2VyIAorICAgICAgICAgICAgIGNhbiBldmVudHVhbGx5IGltcGxlbWVudCBoaXMgcHJvcGVyIHRpbWUgYmFzZSBzb3VyY2UgKGEgZ2VuZXJhbCBwdXJwb3NlIAorICAgICAgICAgICAgIHRpbWVyIGZvciBleGFtcGxlIG9yIG90aGVyIHRpbWUgc291cmNlKSwga2VlcGluZyBpbiBtaW5kIHRoYXQgVGltZSBiYXNlIAorICAgICAgICAgICAgIGR1cmF0aW9uIHNob3VsZCBiZSBrZXB0IDFtcyBzaW5jZSBQUFBfVElNRU9VVF9WQUxVRXMgYXJlIGRlZmluZWQgYW5kIAorICAgICAgICAgICAgIGhhbmRsZWQgaW4gbWlsbGlzZWNvbmRzIGJhc2lzLgorICAgICAgICAoKyspIFRpbWUgYmFzZSBjb25maWd1cmF0aW9uIGZ1bmN0aW9uIChIQUxfSW5pdFRpY2sgKCkpIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IAorICAgICAgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHByb2dyYW0gYWZ0ZXIgcmVzZXQgYnkgSEFMX0luaXQoKSBvciBhdCBhbnkgdGltZSAKKyAgICAgICAgICAgICB3aGVuIGNsb2NrIGlzIGNvbmZpZ3VyZWQsIGJ5IEhBTF9SQ0NfQ2xvY2tDb25maWcoKS4gCisgICAgICAgICgrKykgU291cmNlIG9mIHRpbWUgYmFzZSBpcyBjb25maWd1cmVkICB0byBnZW5lcmF0ZSBpbnRlcnJ1cHRzIGF0IHJlZ3VsYXIgCisgICAgICAgICAgICAgdGltZSBpbnRlcnZhbHMuIENhcmUgbXVzdCBiZSB0YWtlbiBpZiBIQUxfRGVsYXkoKSBpcyBjYWxsZWQgZnJvbSBhIAorICAgICAgICAgICAgIHBlcmlwaGVyYWwgSVNSIHByb2Nlc3MsIHRoZSBUaWNrIGludGVycnVwdCBsaW5lIG11c3QgaGF2ZSBoaWdoZXIgcHJpb3JpdHkgCisgICAgICAgICAgICAobnVtZXJpY2FsbHkgbG93ZXIpIHRoYW4gdGhlIHBlcmlwaGVyYWwgaW50ZXJydXB0LiBPdGhlcndpc2UgdGhlIGNhbGxlciAKKyAgICAgICAgICAgIElTUiBwcm9jZXNzIHdpbGwgYmUgYmxvY2tlZC4gCisgICAgICAgKCsrKSBmdW5jdGlvbnMgYWZmZWN0aW5nIHRpbWUgYmFzZSBjb25maWd1cmF0aW9ucyBhcmUgZGVjbGFyZWQgYXMgX19XZWFrICAKKyAgICAgICAgICAgICB0byBtYWtlICBvdmVycmlkZSBwb3NzaWJsZSAgaW4gY2FzZSBvZiBvdGhlciAgaW1wbGVtZW50YXRpb25zIGluIHVzZXIgZmlsZS4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIEZsYXNoIHByZWZldGNoLCAKKyAgKiAgICAgICAgIENvbmZpZ3VyZXMgdGltZSBiYXNlIHNvdXJjZSwgTlZJQyBhbmQgTG93IGxldmVsIGhhcmR3YXJlCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHByb2dyYW0gYWZ0ZXIgcmVzZXQgYW5kIGJlZm9yZSAKKyAgKiAgICAgICAgIHRoZSBjbG9jayBjb25maWd1cmF0aW9uCisgICogICAgICAgICAgICAgCisgICogQG5vdGUgICBUaGUgU3lzdGljayBjb25maWd1cmF0aW9uIGlzIGJhc2VkIG9uIEhTSSBjbG9jaywgYXMgSFNJIGlzIHRoZSBjbG9jaworICAqICAgICAgICAgdXNlZCBhZnRlciBhIHN5c3RlbSBSZXNldCBhbmQgdGhlIE5WSUMgY29uZmlndXJhdGlvbiBpcyBzZXQgdG8gUHJpb3JpdHkgZ3JvdXAgNCAKKyAgKiAgICAgICAgICAgIAorICAqIEBub3RlICAgVGhlIHRpbWUgYmFzZSBjb25maWd1cmF0aW9uIGlzIGJhc2VkIG9uIE1TSSBjbG9jayB3aGVuIGV4dGluZyBmcm9tIFJlc2V0LgorICAqICAgICAgICAgT25jZSBkb25lLCB0aW1lIGJhc2UgdGljayBzdGFydCBpbmNyZW1lbnRpbmcuCisgICogICAgICAgICBJbiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbixTeXN0aWNrIGlzIHVzZWQgYXMgc291cmNlIG9mIHRpbWUgYmFzZS4KKyAgKiAgICAgICBUaGUgdGljayB2YXJpYWJsZSBpcyBpbmNyZW1lbnRlZCBlYWNoIDFtcyBpbiBpdHMgSVNSLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0luaXQodm9pZCkKK3sKKyAgLyogQ29uZmlndXJlIEZsYXNoIHByZWZldGNoICovCisjaWYgKFBSRUZFVENIX0VOQUJMRSAhPSAwVSkKKyAgX19IQUxfRkxBU0hfUFJFRkVUQ0hfQlVGRkVSX0VOQUJMRSgpOworI2VuZGlmIC8qIFBSRUZFVENIX0VOQUJMRSAqLworCisgIC8qIFNldCBJbnRlcnJ1cHQgR3JvdXAgUHJpb3JpdHkgKi8KKyAgSEFMX05WSUNfU2V0UHJpb3JpdHlHcm91cGluZyhOVklDX1BSSU9SSVRZR1JPVVBfNCk7CisKKyAgLyogRW5hYmxlIHN5c3RpY2sgYW5kIGNvbmZpZ3VyZSAxbXMgdGljayAoZGVmYXVsdCBjbG9jayBhZnRlciBSZXNldCBpcyBIU0kpICovCisgIEhBTF9Jbml0VGljayhUSUNLX0lOVF9QUklPUklUWSk7CisKKyAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIEhBTF9Nc3BJbml0KCk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gZGUtSW5pdGlhbGl6ZXMgY29tbW9uIHBhcnQgb2YgdGhlIEhBTCBhbmQgc3RvcHMgdGhlIHN5c3RpY2suCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBpcyBvcHRpb25hbC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EZUluaXQodm9pZCkKK3sKKyAgLyogUmVzZXQgb2YgYWxsIHBlcmlwaGVyYWxzICovCisgIF9fSEFMX1JDQ19BUEIxX0ZPUkNFX1JFU0VUKCk7CisgIF9fSEFMX1JDQ19BUEIxX1JFTEVBU0VfUkVTRVQoKTsKKworICBfX0hBTF9SQ0NfQVBCMl9GT1JDRV9SRVNFVCgpOworICBfX0hBTF9SQ0NfQVBCMl9SRUxFQVNFX1JFU0VUKCk7CisKKyAgX19IQUxfUkNDX0FIQl9GT1JDRV9SRVNFVCgpOworICBfX0hBTF9SQ0NfQUhCX1JFTEVBU0VfUkVTRVQoKTsKKworICAvKiBEZS1Jbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgSEFMX01zcERlSW5pdCgpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBNU1AuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfTXNwSW5pdCh2b2lkKQoreworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIE1TUC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9Nc3BEZUluaXQodm9pZCkKK3sKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIHNvdXJjZSBvZiB0aGUgdGltZSBiYXNlLiAKKyAgKiAgICAgICAgIFRoZSB0aW1lIHNvdXJjZSBpcyBjb25maWd1cmVkICB0byBoYXZlIDFtcyB0aW1lIGJhc2Ugd2l0aCBhIGRlZGljYXRlZCAKKyAgKiAgICAgICAgIFRpY2sgaW50ZXJydXB0IHByaW9yaXR5LiAKKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkICBhdXRvbWF0aWNhbGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgcHJvZ3JhbSBhZnRlcgorICAqICAgICAgICAgcmVzZXQgYnkgSEFMX0luaXQoKSBvciBhdCBhbnkgdGltZSB3aGVuIGNsb2NrIGlzIHJlY29uZmlndXJlZCAgYnkgSEFMX1JDQ19DbG9ja0NvbmZpZygpLiAKKyAgKiBAbm90ZSAgIEluIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uICwgU3lzVGljayB0aW1lciBpcyB0aGUgc291cmNlIG9mIHRpbWUgYmFzZS4gCisgICogICAgICAgICBJdCBpcyB1c2VkIHRvIGdlbmVyYXRlIGludGVycnVwdHMgYXQgcmVndWxhciB0aW1lIGludGVydmFscy4gCisgICogICAgICAgICBDYXJlIG11c3QgYmUgdGFrZW4gaWYgSEFMX0RlbGF5KCkgaXMgY2FsbGVkIGZyb20gYSBwZXJpcGhlcmFsIElTUiBwcm9jZXNzLCAKKyAgKiAgICAgICAgIFRoZSBTeXNUaWNrIGludGVycnVwdCBtdXN0IGhhdmUgaGlnaGVyIHByaW9yaXR5IChudW1lcmljYWxseSBsb3dlcikgCisgICogICAgICAgICB0aGFuIHRoZSBwZXJpcGhlcmFsIGludGVycnVwdC4gT3RoZXJ3aXNlIHRoZSBjYWxsZXIgSVNSIHByb2Nlc3Mgd2lsbCBiZSBibG9ja2VkLgorICAqICAgICAgICAgVGhlIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGFzIF9fV2VhayAgdG8gYmUgb3ZlcndyaXR0ZW4gIGluIGNhc2Ugb2Ygb3RoZXIKKyAgKiAgICAgICAgIGltcGxlbWVudGF0aW9uICBpbiB1c2VyIGZpbGUuCisgICogQHBhcmFtIFRpY2tQcmlvcml0eSBUaWNrIGludGVycnVwdCBwcmlvcml0eS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK19fd2VhayBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSW5pdFRpY2sodWludDMyX3QgVGlja1ByaW9yaXR5KQoreworICAvKiBDb25maWd1cmUgdGhlIFN5c1RpY2sgdG8gaGF2ZSBpbnRlcnJ1cHQgaW4gMW1zIHRpbWUgYmFzaXMqLworICBpZiAoSEFMX1NZU1RJQ0tfQ29uZmlnKFN5c3RlbUNvcmVDbG9jayAvICgxMDAwVSAvIHV3VGlja0ZyZXEpKSA+IDBVKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENvbmZpZ3VyZSB0aGUgU3lzVGljayBJUlEgcHJpb3JpdHkgKi8KKyAgaWYgKFRpY2tQcmlvcml0eSA8ICgxVUwgPDwgX19OVklDX1BSSU9fQklUUykpCisgIHsKKyAgICBIQUxfTlZJQ19TZXRQcmlvcml0eShTeXNUaWNrX0lSUW4sIFRpY2tQcmlvcml0eSwgMFUpOworICAgIHV3VGlja1ByaW8gPSBUaWNrUHJpb3JpdHk7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIEhBTCBDb250cm9sIGZ1bmN0aW9ucyAKKyAqICBAYnJpZWYgICAgSEFMIENvbnRyb2wgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhBTCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIFByb3ZpZGUgYSB0aWNrIHZhbHVlIGluIG1pbGxpc2Vjb25kCisgICAgICAoKykgUHJvdmlkZSBhIGJsb2NraW5nIGRlbGF5IGluIG1pbGxpc2Vjb25kCisgICAgICAoKykgU3VzcGVuZCB0aGUgdGltZSBiYXNlIHNvdXJjZSBpbnRlcnJ1cHQKKyAgICAgICgrKSBSZXN1bWUgdGhlIHRpbWUgYmFzZSBzb3VyY2UgaW50ZXJydXB0CisgICAgICAoKykgR2V0IHRoZSBIQUwgQVBJIGRyaXZlciB2ZXJzaW9uCisgICAgICAoKykgR2V0IHRoZSBkZXZpY2UgaWRlbnRpZmllcgorICAgICAgKCspIEdldCB0aGUgZGV2aWNlIHJldmlzaW9uIGlkZW50aWZpZXIKKyAgICAgICgrKSBFbmFibGUvRGlzYWJsZSBEZWJ1ZyBtb2R1bGUgZHVyaW5nIFNsZWVwIG1vZGUKKyAgICAgICgrKSBFbmFibGUvRGlzYWJsZSBEZWJ1ZyBtb2R1bGUgZHVyaW5nIFNUT1AgbW9kZQorICAgICAgKCspIEVuYWJsZS9EaXNhYmxlIERlYnVnIG1vZHVsZSBkdXJpbmcgU1RBTkRCWSBtb2RlCisgICAgICAKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gaW5jcmVtZW50ICBhIGdsb2JhbCB2YXJpYWJsZSAidXdUaWNrIgorICAqICAgICAgICAgdXNlZCBhcyBhcHBsaWNhdGlvbiB0aW1lIGJhc2UuCisgICogQG5vdGUgSW4gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24sIHRoaXMgdmFyaWFibGUgaXMgaW5jcmVtZW50ZWQgZWFjaCAxbXMKKyAgKiAgICAgICAgIGluIFN5c1RpY2sgSVNSLgorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gaXMgZGVjbGFyZWQgYXMgX193ZWFrIHRvIGJlIG92ZXJ3cml0dGVuIGluIGNhc2Ugb2Ygb3RoZXIgCisgICogICAgICAgICBpbXBsZW1lbnRhdGlvbnMgIGluIHVzZXIgZmlsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JbmNUaWNrKHZvaWQpCit7CisgIHV3VGljayArPSB1d1RpY2tGcmVxOworfQorCisvKioKKyAgKiBAYnJpZWYgIFBvdmlkZXMgYSB0aWNrIHZhbHVlIGluIG1pbGxpc2Vjb25kLgorICAqIEBub3RlICAgVGhlIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGFzIF9fV2VhayAgdG8gYmUgb3ZlcndyaXR0ZW4gIGluIGNhc2Ugb2Ygb3RoZXIgCisgICogICAgICAgICBpbXBsZW1lbnRhdGlvbnMgIGluIHVzZXIgZmlsZS4KKyAgKiBAcmV0dmFsIHRpY2sgdmFsdWUKKyAgKi8KK19fd2VhayB1aW50MzJfdCBIQUxfR2V0VGljayh2b2lkKQoreworICByZXR1cm4gdXdUaWNrOyAgCit9CisKKy8qKgorICAqIEBicmllZiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSB0aWNrIHByaW9yaXR5LgorICAqIEByZXR2YWwgdGljayBwcmlvcml0eQorICAqLwordWludDMyX3QgSEFMX0dldFRpY2tQcmlvKHZvaWQpCit7CisgIHJldHVybiB1d1RpY2tQcmlvOworfQorCisvKioKKyAgKiBAYnJpZWYgU2V0IG5ldyB0aWNrIEZyZXEuCisgICogQHJldHZhbCBTdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TZXRUaWNrRnJlcShIQUxfVGlja0ZyZXFUeXBlRGVmIEZyZXEpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyAgPSBIQUxfT0s7CisgIGFzc2VydF9wYXJhbShJU19USUNLRlJFUShGcmVxKSk7CisKKyAgaWYgKHV3VGlja0ZyZXEgIT0gRnJlcSkKKyAgeworICAgIHV3VGlja0ZyZXEgPSBGcmVxOworCisgICAgLyogQXBwbHkgdGhlIG5ldyB0aWNrIEZyZXEgICovCisgICAgc3RhdHVzID0gSEFMX0luaXRUaWNrKHV3VGlja1ByaW8pOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmIFJldHVybiB0aWNrIGZyZXF1ZW5jeS4KKyAgKiBAcmV0dmFsIHRpY2sgcGVyaW9kIGluIEh6CisgICovCitIQUxfVGlja0ZyZXFUeXBlRGVmIEhBTF9HZXRUaWNrRnJlcSh2b2lkKQoreworICByZXR1cm4gdXdUaWNrRnJlcTsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGFjY3VyYXRlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMpIGJhc2VkIAorICAqICAgICAgICAgb24gdmFyaWFibGUgaW5jcmVtZW50ZWQuCisgICogQG5vdGUgICBJbiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAsIFN5c1RpY2sgdGltZXIgaXMgdGhlIHNvdXJjZSBvZiB0aW1lIGJhc2UuIAorICAqICAgICAgICAgSXQgaXMgdXNlZCB0byBnZW5lcmF0ZSBpbnRlcnJ1cHRzIGF0IHJlZ3VsYXIgdGltZSBpbnRlcnZhbHMgd2hlcmUgdXdUaWNrCisgICogICAgICAgICBpcyBpbmNyZW1lbnRlZC4KKyAgKiAgICAgICAgIFRoZSBmdW5jdGlvbiBpcyBkZWNsYXJlZCBhcyBfX1dlYWsgIHRvIGJlIG92ZXJ3cml0dGVuICBpbiBjYXNlIG9mIG90aGVyCisgICogICAgICAgICBpbXBsZW1lbnRhdGlvbnMgIGluIHVzZXIgZmlsZS4KKyAgKiBAcGFyYW0gIERlbGF5IHNwZWNpZmllcyB0aGUgZGVsYXkgdGltZSBsZW5ndGgsIGluIG1pbGxpc2Vjb25kcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9EZWxheSh1aW50MzJfdCBEZWxheSkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgdWludDMyX3Qgd2FpdCA9IERlbGF5OworICAKKyAgLyogQWRkIGZyZXEgdG8gZ3VhcmFudGVlIG1pbmltdW0gd2FpdCAqLworICBpZiAod2FpdCA8IEhBTF9NQVhfREVMQVkpCisgIHsKKyAgICB3YWl0ICs9ICh1aW50MzJfdCkodXdUaWNrRnJlcSk7CisgIH0KKyAgCisgIHdoaWxlKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA8IHdhaXQpCisgIHsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFN1c3BlbmQgVGljayBpbmNyZW1lbnQuCisgICogQG5vdGUgICBJbiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAsIFN5c1RpY2sgdGltZXIgaXMgdGhlIHNvdXJjZSBvZiB0aW1lIGJhc2UuIEl0IGlzICAKKyAgKiAgICAgICAgIHVzZWQgdG8gZ2VuZXJhdGUgaW50ZXJydXB0cyBhdCByZWd1bGFyIHRpbWUgaW50ZXJ2YWxzLiBPbmNlIEhBTF9TdXNwZW5kVGljaygpCisgICogICAgICAgICBpcyBjYWxsZWQsIHRoZSB0aGUgU3lzVGljayBpbnRlcnJ1cHQgd2lsbCBiZSBkaXNhYmxlZCBhbmQgc28gVGljayBpbmNyZW1lbnQgCisgICogICAgICAgICBpcyBzdXNwZW5kZWQuCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBpcyBkZWNsYXJlZCBhcyBfX3dlYWsgdG8gYmUgb3ZlcndyaXR0ZW4gaW4gY2FzZSBvZiBvdGhlcgorICAqICAgICAgICAgaW1wbGVtZW50YXRpb25zICBpbiB1c2VyIGZpbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU3VzcGVuZFRpY2sodm9pZCkKKworeworICAvKiBEaXNhYmxlIFN5c1RpY2sgSW50ZXJydXB0ICovCisgIFN5c1RpY2stPkNUUkwgJj0gflN5c1RpY2tfQ1RSTF9USUNLSU5UX01zazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorfQorCisvKioKKyAgKiBAYnJpZWYgIFJlc3VtZSBUaWNrIGluY3JlbWVudC4KKyAgKiBAbm90ZSAgIEluIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uICwgU3lzVGljayB0aW1lciBpcyB0aGUgc291cmNlIG9mIHRpbWUgYmFzZS4gSXQgaXMgIAorICAqICAgICAgICAgdXNlZCB0byBnZW5lcmF0ZSBpbnRlcnJ1cHRzIGF0IHJlZ3VsYXIgdGltZSBpbnRlcnZhbHMuIE9uY2UgSEFMX1Jlc3VtZVRpY2soKQorICAqICAgICAgICAgaXMgY2FsbGVkLCB0aGUgdGhlIFN5c1RpY2sgaW50ZXJydXB0IHdpbGwgYmUgZW5hYmxlZCBhbmQgc28gVGljayBpbmNyZW1lbnQgCisgICogICAgICAgICBpcyByZXN1bWVkLgorICAqICAgICAgICAgVGhlIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGFzIF9fV2VhayAgdG8gYmUgb3ZlcndyaXR0ZW4gIGluIGNhc2Ugb2Ygb3RoZXIKKyAgKiAgICAgICAgIGltcGxlbWVudGF0aW9ucyAgaW4gdXNlciBmaWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1Jlc3VtZVRpY2sodm9pZCkKK3sKKyAgLyogRW5hYmxlIFN5c1RpY2sgSW50ZXJydXB0ICovCisgIFN5c1RpY2stPkNUUkwgIHw9IFN5c1RpY2tfQ1RSTF9USUNLSU5UX01zazsKKyAgCit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBIQUwgcmV2aXNpb24KKyAgKiBAcmV0dmFsIHZlcnNpb24gMHhYWVpSICg4Yml0cyBmb3IgZWFjaCBkZWNpbWFsLCBSIGZvciBSQykKKyAgKi8KK3VpbnQzMl90IEhBTF9HZXRIYWxWZXJzaW9uKHZvaWQpCit7CisgcmV0dXJuIF9fU1RNMzJGM3h4X0hBTF9WRVJTSU9OOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgdGhlIGRldmljZSByZXZpc2lvbiBpZGVudGlmaWVyLgorICAqIEByZXR2YWwgRGV2aWNlIHJldmlzaW9uIGlkZW50aWZpZXIKKyAgKi8KK3VpbnQzMl90IEhBTF9HZXRSRVZJRCh2b2lkKQoreworICByZXR1cm4oKERCR01DVS0+SURDT0RFKSA+PiAxNlUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgdGhlIGRldmljZSBpZGVudGlmaWVyLgorICAqIEByZXR2YWwgRGV2aWNlIGlkZW50aWZpZXIKKyAgKi8KK3VpbnQzMl90IEhBTF9HZXRERVZJRCh2b2lkKQoreworICByZXR1cm4oKERCR01DVS0+SURDT0RFKSAmIElEQ09ERV9ERVZJRF9NQVNLKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm5zIGZpcnN0IHdvcmQgb2YgdGhlIHVuaXF1ZSBkZXZpY2UgaWRlbnRpZmllciAoVUlEIGJhc2VkIG9uIDk2IGJpdHMpCisgICogQHJldHZhbCBEZXZpY2UgaWRlbnRpZmllcgorICAqLwordWludDMyX3QgSEFMX0dldFVJRHcwKHZvaWQpCit7CisgICByZXR1cm4oUkVBRF9SRUcoKigodWludDMyX3QgKilVSURfQkFTRSkpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm5zIHNlY29uZCB3b3JkIG9mIHRoZSB1bmlxdWUgZGV2aWNlIGlkZW50aWZpZXIgKFVJRCBiYXNlZCBvbiA5NiBiaXRzKQorICAqIEByZXR2YWwgRGV2aWNlIGlkZW50aWZpZXIKKyAgKi8KK3VpbnQzMl90IEhBTF9HZXRVSUR3MSh2b2lkKQoreworICAgcmV0dXJuKFJFQURfUkVHKCooKHVpbnQzMl90ICopKFVJRF9CQVNFICsgNFUpKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgdGhpcmQgd29yZCBvZiB0aGUgdW5pcXVlIGRldmljZSBpZGVudGlmaWVyIChVSUQgYmFzZWQgb24gOTYgYml0cykKKyAgKiBAcmV0dmFsIERldmljZSBpZGVudGlmaWVyCisgICovCit1aW50MzJfdCBIQUxfR2V0VUlEdzIodm9pZCkKK3sKKyAgIHJldHVybihSRUFEX1JFRygqKCh1aW50MzJfdCAqKShVSURfQkFTRSArIDhVKSkpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIERlYnVnIE1vZHVsZSBkdXJpbmcgU0xFRVAgbW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfREJHTUNVX0VuYWJsZURCR1NsZWVwTW9kZSh2b2lkKQoreworICBTRVRfQklUKERCR01DVS0+Q1IsIERCR01DVV9DUl9EQkdfU0xFRVApOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIERlYnVnIE1vZHVsZSBkdXJpbmcgU0xFRVAgbW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfREJHTUNVX0Rpc2FibGVEQkdTbGVlcE1vZGUodm9pZCkKK3sKKyAgQ0xFQVJfQklUKERCR01DVS0+Q1IsIERCR01DVV9DUl9EQkdfU0xFRVApOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgRGVidWcgTW9kdWxlIGR1cmluZyBTVE9QIG1vZGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0RCR01DVV9FbmFibGVEQkdTdG9wTW9kZSh2b2lkKQoreworICBTRVRfQklUKERCR01DVS0+Q1IsIERCR01DVV9DUl9EQkdfU1RPUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgRGVidWcgTW9kdWxlIGR1cmluZyBTVE9QIG1vZGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0RCR01DVV9EaXNhYmxlREJHU3RvcE1vZGUodm9pZCkKK3sKKyAgQ0xFQVJfQklUKERCR01DVS0+Q1IsIERCR01DVV9DUl9EQkdfU1RPUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBEZWJ1ZyBNb2R1bGUgZHVyaW5nIFNUQU5EQlkgbW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfREJHTUNVX0VuYWJsZURCR1N0YW5kYnlNb2RlKHZvaWQpCit7CisgIFNFVF9CSVQoREJHTUNVLT5DUiwgREJHTUNVX0NSX0RCR19TVEFOREJZKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBEZWJ1ZyBNb2R1bGUgZHVyaW5nIFNUQU5EQlkgbW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfREJHTUNVX0Rpc2FibGVEQkdTdGFuZGJ5TW9kZSh2b2lkKQoreworICBDTEVBUl9CSVQoREJHTUNVLT5DUiwgREJHTUNVX0NSX0RCR19TVEFOREJZKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmYzeHhfaGFsX2FkYy5jIGIvU3JjL3N0bTMyZjN4eF9oYWxfYWRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRlNzMzZQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfaGFsX2FkYy5jCkBAIC0wLDAgKzEsOTYxIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2hhbF9hZGMuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZyAKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIEFuYWxvZyB0byBEaWdpdGFsIENvbnZlcnRvciAoQURDKQorICAqICAgICAgICAgIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICAgICsrIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIG9mIEFEQworICAqICAgICAgICAgICArIE9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgICArKyBTdGFydCwgc3RvcCwgZ2V0IHJlc3VsdCBvZiBjb252ZXJzaW9ucyBvZiByZWd1bGFyCisgICogICAgICAgICAgICAgICAgZ3JvdXAsIHVzaW5nIDMgcG9zc2libGUgbW9kZXM6IHBvbGxpbmcsIGludGVycnVwdGlvbiBvciBETUEuCisgICogICAgICAgICAgICsgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgICArKyBDaGFubmVscyBjb25maWd1cmF0aW9uIG9uIHJlZ3VsYXIgZ3JvdXAKKyAgKiAgICAgICAgICAgICArKyBDaGFubmVscyBjb25maWd1cmF0aW9uIG9uIGluamVjdGVkIGdyb3VwCisgICogICAgICAgICAgICAgKysgQW5hbG9nIFdhdGNoZG9nIGNvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBTdGF0ZSBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgICArKyBBREMgc3RhdGUgbWFjaGluZSBtYW5hZ2VtZW50CisgICogICAgICAgICAgICAgKysgSW50ZXJydXB0cyBhbmQgZmxhZ3MgbWFuYWdlbWVudAorICAqICAgICAgICAgIE90aGVyIGZ1bmN0aW9ucyAoZXh0ZW5kZWQgZnVuY3Rpb25zKSBhcmUgYXZhaWxhYmxlIGluIGZpbGUgCisgICogICAgICAgICAgInN0bTMyZjN4eF9oYWxfYWRjX2V4LmMiLgorICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIEFEQyBwZXJpcGhlcmFsIGZlYXR1cmVzICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dIAorICAoKykgMTItYml0LCAxMC1iaXQsIDgtYml0IG9yIDYtYml0IGNvbmZpZ3VyYWJsZSByZXNvbHV0aW9uIChhdmFpbGFibGUgb25seSBvbiAKKyAgICAgIFNUTTMyRjMweHhDIGRldmljZXMpLgorCisgICgrKSBJbnRlcnJ1cHQgZ2VuZXJhdGlvbiBhdCB0aGUgZW5kIG9mIHJlZ3VsYXIgY29udmVyc2lvbiwgZW5kIG9mIGluamVjdGVkCisgICAgICBjb252ZXJzaW9uLCBhbmQgaW4gY2FzZSBvZiBhbmFsb2cgd2F0Y2hkb2cgb3Igb3ZlcnJ1biBldmVudHMuCisgIAorICAoKykgU2luZ2xlIGFuZCBjb250aW51b3VzIGNvbnZlcnNpb24gbW9kZXMuCisgIAorICAoKykgU2NhbiBtb2RlIGZvciBjb252ZXJzaW9uIG9mIHNldmVyYWwgY2hhbm5lbHMgc2VxdWVudGlhbGx5LgorICAKKyAgKCspIERhdGEgYWxpZ25tZW50IHdpdGggaW4tYnVpbHQgZGF0YSBjb2hlcmVuY3kuCisgIAorICAoKykgUHJvZ3JhbW1hYmxlIHNhbXBsaW5nIHRpbWUgKGNoYW5uZWwgd2lzZSkKKyAgCisgICgrKSBBREMgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwIGFuZCBpbmplY3RlZCBncm91cC4KKworICAoKykgRXh0ZXJuYWwgdHJpZ2dlciAodGltZXIgb3IgRVhUSSkgd2l0aCBjb25maWd1cmFibGUgcG9sYXJpdHkKKyAgICAgIGZvciBib3RoIHJlZ3VsYXIgYW5kIGluamVjdGVkIGdyb3Vwcy4KKworICAoKykgRE1BIHJlcXVlc3QgZ2VuZXJhdGlvbiBmb3IgdHJhbnNmZXIgb2YgY29udmVyc2lvbnMgZGF0YSBvZiByZWd1bGFyIGdyb3VwLgorCisgICgrKSBNdWx0aW1vZGUgZHVhbCBtb2RlIChhdmFpbGFibGUgb24gZGV2aWNlcyB3aXRoIDIgQURDcyBvciBtb3JlKS4KKyAgCisgICgrKSBDb25maWd1cmFibGUgRE1BIGRhdGEgc3RvcmFnZSBpbiBNdWx0aW1vZGUgRHVhbCBtb2RlIChhdmFpbGFibGUgb24gZGV2aWNlcworICAgICAgd2l0aCAyIERDcyBvciBtb3JlKS4KKyAgCisgICgrKSBDb25maWd1cmFibGUgZGVsYXkgYmV0d2VlbiBjb252ZXJzaW9ucyBpbiBEdWFsIGludGVybGVhdmVkIG1vZGUgKGF2YWlsYWJsZSAKKyAgICAgIG9uIGRldmljZXMgd2l0aCAyIERDcyBvciBtb3JlKS4KKyAgCisgICgrKSBBREMgY2FsaWJyYXRpb24KKworICAoKykgQURDIGNoYW5uZWxzIHNlbGVjdGFibGUgc2luZ2xlL2RpZmZlcmVudGlhbCBpbnB1dCAoYXZhaWxhYmxlIG9ubHkgb24KKyAgICAgIFNUTTMyRjMweHhDIGRldmljZXMpCisKKyAgKCspIEFEQyBJbmplY3RlZCBzZXF1ZW5jZXImY2hhbm5lbHMgY29uZmlndXJhdGlvbiBjb250ZXh0IHF1ZXVlIChhdmFpbGFibGUgCisgICAgICBvbmx5IG9uIFNUTTMyRjMweHhDIGRldmljZXMpCisKKyAgKCspIEFEQyBvZmZzZXQgb24gaW5qZWN0ZWQgYW5kIHJlZ3VsYXIgZ3JvdXBzIChvZmZzZXQgb24gcmVndWxhciBncm91cCAKKyAgICAgIGF2YWlsYWJsZSBvbmx5IG9uIFNUTTMyRjMweHhDIGRldmljZXMpCisKKyAgKCspIEFEQyBzdXBwbHkgcmVxdWlyZW1lbnRzOiAyLjQgViB0byAzLjYgViBhdCBmdWxsIHNwZWVkIGFuZCBkb3duIHRvIDEuOCBWIGF0IAorICAgICAgc2xvd2VyIHNwZWVkLgorICAKKyAgKCspIEFEQyBpbnB1dCByYW5nZTogZnJvbSBWcmVmLSAoY29ubmVjdGVkIHRvIFZzc2EpIHRvIFZyZWYrIChjb25uZWN0ZWQgdG8gCisgICAgICBWZGRhIG9yIHRvIGFuIGV4dGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlKS4KKworCisgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKworICAgICAqKiogQ29uZmlndXJhdGlvbiBvZiB0b3AgbGV2ZWwgcGFyYW1ldGVycyByZWxhdGVkIHRvIEFEQyAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0KKworICAgICgjKSBFbmFibGUgdGhlIEFEQyBpbnRlcmZhY2UKKyAgICAgICgrKykgQXMgcHJlcmVxdWlzaXRlLCBBREMgY2xvY2sgbXVzdCBiZSBjb25maWd1cmVkIGF0IFJDQyB0b3AgbGV2ZWwuCisgICAgICAKKyAgICAgICAgKCsrKSBGb3IgU1RNMzJGMzB4L1NUTTMyRjMzeCBkZXZpY2VzOgorICAgICAgICAgICAgIFR3byBwb3NzaWJsZSBjbG9jayBzb3VyY2VzOiBzeW5jaHJvbm91cyBjbG9jayBkZXJpdmVkIGZyb20gQUhCIGNsb2NrIAorICAgICAgICAgICAgIG9yIGFzeW5jaHJvbm91cyBjbG9jayBkZXJpdmVkIGZyb20gQURDIGRlZGljYXRlZCBQTEwgNzJNSHouCisgICAgICAgICAgICAgIC0gU3luY2hyb25vdXMgY2xvY2sgaXMgbWFuZGF0b3J5IHNpbmNlIHVzZWQgYXMgQURDIGNvcmUgY2xvY2suCisgICAgICAgICAgICAgICAgU3luY2hyb25vdXMgY2xvY2sgY2FuIGJlIHVzZWQgb3B0aW9uYWxseSBhcyBBREMgY29udmVyc2lvbiBjbG9jaywgZGVwZW5kaW5nIG9uIEFEQyBpbml0IHN0cnVjdHVyZSBjbG9jayBzZXR0aW5nLgorICAgICAgICAgICAgICAgIFN5bmNocm9ub3VzIGNsb2NrIGlzIGNvbmZpZ3VyZWQgdXNpbmcgbWFjcm8gX19BREN4X0NMS19FTkFCTEUoKS4KKyAgICAgICAgICAgICAgLSBBc3luY2hyb25vdXMgY2FuIGJlIHVzZWQgb3B0aW9uYWxseSBhcyBBREMgY29udmVyc2lvbiBjbG9jaywgZGVwZW5kaW5nIG9uIEFEQyBpbml0IHN0cnVjdHVyZSBjbG9jayBzZXR0aW5nLgorICAgICAgICAgICAgICAgIEFzeW5jaHJvbm91cyBjbG9jayBpcyBjb25maWd1cmVkIHVzaW5nIGZ1bmN0aW9uIEhBTF9SQ0NFeF9QZXJpcGhDTEtDb25maWcoKS4KKyAgICAgICAgICAgICAoKysrKSBGb3IgZXhhbXBsZSwgaW4gY2FzZSBvZiBkZXZpY2Ugd2l0aCBhIHNpbmdsZSBBREM6CisgICAgICAgICAgICAgICAgICAgSW50byBIQUxfQURDX01zcEluaXQoKSAocmVjb21tZW5kZWQgY29kZSBsb2NhdGlvbikgb3Igd2l0aAorICAgICAgICAgICAgICAgICAgIG90aGVyIGRldmljZSBjbG9jayBwYXJhbWV0ZXJzIGNvbmZpZ3VyYXRpb246CisgICAgICAgICAgICAgICAoKysrKSBfX0hBTF9SQ0NfQURDMV9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hbmRhdG9yeSkKKyAgICAgICAgICAgICAgICgrKyspIFBlcmlwaENsa0luaXQuUGVyaXBoQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUEVSSVBIQ0xLX0FEQyAob3B0aW9uYWwsIGlmIEFEQyBjb252ZXJzaW9uIGZyb20gYXN5bmNocm9ub3VzIGNsb2NrKQorICAgICAgICAgICAgICAgKCsrKykgUGVyaXBoQ2xrSW5pdC5BZGMxQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfQURDMVBMTENMS19ESVYxIChvcHRpb25hbCwgaWYgQURDIGNvbnZlcnNpb24gZnJvbSBhc3luY2hyb25vdXMgY2xvY2spCisgICAgICAgICAgICAgICAoKysrKSBIQUxfUkNDRXhfUGVyaXBoQ0xLQ29uZmlnKCZSQ0NfUGVyaXBoQ2xrSW5pdFN0cnVjdHVyZSkgKG9wdGlvbmFsLCBpZiBBREMgY29udmVyc2lvbiBmcm9tIGFzeW5jaHJvbm91cyBjbG9jaykKKworICAgICAgICAgICAgICgrKyspIEZvciBleGFtcGxlLCBpbiBjYXNlIG9mIGRldmljZSB3aXRoIDQgQURDczoKKworICAgICAgICAgICAgICAgKCsrKykgaWYoKGhhZGMtPkluc3RhbmNlID09IEFEQzEpIHx8IChoYWRjLT5JbnN0YW5jZSA9PSBBREMyKSkgICAKKyAgICAgICAgICAgICAgICgrKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAoKysrKSAgIF9fSEFMX1JDQ19BREMxMl9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYW5kYXRvcnkpCisgICAgICAgICAgICAgICAoKysrKSAgIFBlcmlwaENsa0luaXQuUGVyaXBoQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUEVSSVBIQ0xLX0FEQyAgIChvcHRpb25hbCwgaWYgQURDIGNvbnZlcnNpb24gZnJvbSBhc3luY2hyb25vdXMgY2xvY2spCisgICAgICAgICAgICAgICAoKysrKSAgIFBlcmlwaENsa0luaXQuQWRjMTJDbG9ja1NlbGVjdGlvbiA9IFJDQ19BREMxMlBMTENMS19ESVYxIChvcHRpb25hbCwgaWYgQURDIGNvbnZlcnNpb24gZnJvbSBhc3luY2hyb25vdXMgY2xvY2spCisgICAgICAgICAgICAgICAoKysrKSAgIEhBTF9SQ0NFeF9QZXJpcGhDTEtDb25maWcoJlJDQ19QZXJpcGhDbGtJbml0U3RydWN0dXJlKSAgIChvcHRpb25hbCwgaWYgQURDIGNvbnZlcnNpb24gZnJvbSBhc3luY2hyb25vdXMgY2xvY2spCisgICAgICAgICAgICAgICAoKysrKSB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgKCsrKykgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICgrKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAoKysrKSAgIF9fSEFMX1JDQ19BREMzNF9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFuZGF0b3J5KQorICAgICAgICAgICAgICAgKCsrKykgICBQZXJpcGhDbGtJbml0LkFkYzM0Q2xvY2tTZWxlY3Rpb24gPSBSQ0NfQURDMzRQTExDTEtfRElWMTsgKG9wdGlvbmFsLCBpZiBBREMgY29udmVyc2lvbiBmcm9tIGFzeW5jaHJvbm91cyBjbG9jaykKKyAgICAgICAgICAgICAgICgrKyspICAgSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZygmUkNDX1BlcmlwaENsa0luaXRTdHJ1Y3R1cmUpOyAgIChvcHRpb25hbCwgaWYgQURDIGNvbnZlcnNpb24gZnJvbSBhc3luY2hyb25vdXMgY2xvY2spCisgICAgICAgICAgICAgICAoKysrKSB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgCisgICAgICAgICgrKykgRm9yIFNUTTMyRjM3eCBkZXZpY2VzOgorICAgICAgICAgICAgIE9uZSBjbG9jayBzZXR0aW5nIGlzIG1hbmRhdG9yeTogCisgICAgICAgICAgICAgQURDIGNsb2NrIChjb3JlIGFuZCBjb252ZXJzaW9uIGNsb2NrKSBmcm9tIEFQQjIgY2xvY2suCisgICAgICAgICAgICAgKCsrKykgRXhhbXBsZToKKyAgICAgICAgICAgICAgICAgICBJbnRvIEhBTF9BRENfTXNwSW5pdCgpIChyZWNvbW1lbmRlZCBjb2RlIGxvY2F0aW9uKSBvciB3aXRoCisgICAgICAgICAgICAgICAgICAgb3RoZXIgZGV2aWNlIGNsb2NrIHBhcmFtZXRlcnMgY29uZmlndXJhdGlvbjoKKyAgICAgICAgICAgICAgICgrKyspIFBlcmlwaENsa0luaXQuUGVyaXBoQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUEVSSVBIQ0xLX0FEQworICAgICAgICAgICAgICAgKCsrKykgUGVyaXBoQ2xrSW5pdC5BZGNDbG9ja1NlbGVjdGlvbiA9IFJDQ19BRENQTExDTEtfRElWMgorICAgICAgICAgICAgICAgKCsrKykgSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZygmUGVyaXBoQ2xrSW5pdCkKKworICAgICgjKSBBREMgcGlucyBjb25maWd1cmF0aW9uCisgICAgICAgICAoKyspIEVuYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBBREMgR1BJT3MKKyAgICAgICAgICAgICAgdXNpbmcgbWFjcm8gX19IQUxfUkNDX0dQSU94X0NMS19FTkFCTEUoKQorICAgICAgICAgKCsrKSBDb25maWd1cmUgdGhlc2UgQURDIHBpbnMgaW4gYW5hbG9nIG1vZGUKKyAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0dQSU9fSW5pdCgpCisKKyAgICAoIykgT3B0aW9uYWxseSwgaW4gY2FzZSBvZiB1c2FnZSBvZiBBREMgd2l0aCBpbnRlcnJ1cHRpb25zOgorICAgICAgICAgKCsrKSBDb25maWd1cmUgdGhlIE5WSUMgZm9yIEFEQworICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfTlZJQ19FbmFibGVJUlEoQURDeF9JUlFuKQorICAgICAgICAgKCsrKSBJbnNlcnQgdGhlIEFEQyBpbnRlcnJ1cHRpb24gaGFuZGxlciBmdW5jdGlvbiBIQUxfQURDX0lSUUhhbmRsZXIoKSAKKyAgICAgICAgICAgICAgaW50byB0aGUgZnVuY3Rpb24gb2YgY29ycmVzcG9uZGluZyBBREMgaW50ZXJydXB0aW9uIHZlY3RvciAKKyAgICAgICAgICAgICAgQURDeF9JUlFIYW5kbGVyKCkuCisKKyAgICAoIykgT3B0aW9uYWxseSwgaW4gY2FzZSBvZiB1c2FnZSBvZiBETUE6CisgICAgICAgICAoKyspIENvbmZpZ3VyZSB0aGUgRE1BIChETUEgY2hhbm5lbCwgbW9kZSBub3JtYWwgb3IgY2lyY3VsYXIsIC4uLikKKyAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0RNQV9Jbml0KCkuCisgICAgICAgICAoKyspIENvbmZpZ3VyZSB0aGUgTlZJQyBmb3IgRE1BCisgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9OVklDX0VuYWJsZUlSUShETUF4X0NoYW5uZWx4X0lSUW4pCisgICAgICAgICAoKyspIEluc2VydCB0aGUgQURDIGludGVycnVwdGlvbiBoYW5kbGVyIGZ1bmN0aW9uIEhBTF9BRENfSVJRSGFuZGxlcigpIAorICAgICAgICAgICAgICBpbnRvIHRoZSBmdW5jdGlvbiBvZiBjb3JyZXNwb25kaW5nIERNQSBpbnRlcnJ1cHRpb24gdmVjdG9yIAorICAgICAgICAgICAgICBETUF4X0NoYW5uZWx4X0lSUUhhbmRsZXIoKS4KKworICAgICAqKiogQ29uZmlndXJhdGlvbiBvZiBBREMsIGdyb3VwcyByZWd1bGFyL2luamVjdGVkLCBjaGFubmVscyBwYXJhbWV0ZXJzICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisKKyAgICAoIykgQ29uZmlndXJlIHRoZSBBREMgcGFyYW1ldGVycyAocmVzb2x1dGlvbiwgZGF0YSBhbGlnbm1lbnQsIC4uLikKKyAgICAgICAgYW5kIHJlZ3VsYXIgZ3JvdXAgcGFyYW1ldGVycyAoY29udmVyc2lvbiB0cmlnZ2VyLCBzZXF1ZW5jZXIsIC4uLikKKyAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19Jbml0KCkuCisKKyAgICAoIykgQ29uZmlndXJlIHRoZSBjaGFubmVscyBmb3IgcmVndWxhciBncm91cCBwYXJhbWV0ZXJzIChjaGFubmVsIG51bWJlciwgCisgICAgICAgIGNoYW5uZWwgcmFuayBpbnRvIHNlcXVlbmNlciwgLi4uLCBpbnRvIHJlZ3VsYXIgZ3JvdXApCisgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfQ29uZmlnQ2hhbm5lbCgpLgorCisgICAgKCMpIE9wdGlvbmFsbHksIGNvbmZpZ3VyZSB0aGUgaW5qZWN0ZWQgZ3JvdXAgcGFyYW1ldGVycyAoY29udmVyc2lvbiB0cmlnZ2VyLCAKKyAgICAgICAgc2VxdWVuY2VyLCAuLi4sIG9mIGluamVjdGVkIGdyb3VwKQorICAgICAgICBhbmQgdGhlIGNoYW5uZWxzIGZvciBpbmplY3RlZCBncm91cCBwYXJhbWV0ZXJzIChjaGFubmVsIG51bWJlciwgCisgICAgICAgIGNoYW5uZWwgcmFuayBpbnRvIHNlcXVlbmNlciwgLi4uLCBpbnRvIGluamVjdGVkIGdyb3VwKQorICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfQURDRXhfSW5qZWN0ZWRDb25maWdDaGFubmVsKCkuCisKKyAgICAoIykgT3B0aW9uYWxseSwgY29uZmlndXJlIHRoZSBhbmFsb2cgd2F0Y2hkb2cgcGFyYW1ldGVycyAoY2hhbm5lbHMKKyAgICAgICAgbW9uaXRvcmVkLCB0aHJlc2hvbGRzLCAuLi4pCisgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfQW5hbG9nV0RHQ29uZmlnKCkuCisKKyAgICAoIykgT3B0aW9uYWxseSwgZm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQyBpbnN0YW5jZXM6IGNvbmZpZ3VyZSB0aGUgCisgICAgICAgIG11bHRpbW9kZSBwYXJhbWV0ZXJzCisgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENFeF9NdWx0aU1vZGVDb25maWdDaGFubmVsKCkuCisKKyAgICAgKioqIEV4ZWN1dGlvbiBvZiBBREMgY29udmVyc2lvbnMgKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisKKyAgICAoIykgT3B0aW9uYWxseSwgcGVyZm9ybSBhbiBhdXRvbWF0aWMgQURDIGNhbGlicmF0aW9uIHRvIGltcHJvdmUgdGhlCisgICAgICAgIGNvbnZlcnNpb24gYWNjdXJhY3kKKyAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ0V4X0NhbGlicmF0aW9uX1N0YXJ0KCkuCisKKyAgICAoIykgQURDIGRyaXZlciBjYW4gYmUgdXNlZCBhbW9uZyB0aHJlZSBtb2RlczogcG9sbGluZywgaW50ZXJydXB0aW9uLAorICAgICAgICB0cmFuc2ZlciBieSBETUEuCisKKyAgICAgICAgKCsrKSBBREMgY29udmVyc2lvbiBieSBwb2xsaW5nOgorICAgICAgICAgICgrKyspIEFjdGl2YXRlIHRoZSBBREMgcGVyaXBoZXJhbCBhbmQgc3RhcnQgY29udmVyc2lvbnMKKyAgICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfQURDX1N0YXJ0KCkKKyAgICAgICAgICAoKysrKSBXYWl0IGZvciBBREMgY29udmVyc2lvbiBjb21wbGV0aW9uIAorICAgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfUG9sbEZvckNvbnZlcnNpb24oKQorICAgICAgICAgICAgICAgIChvciBmb3IgaW5qZWN0ZWQgZ3JvdXA6IEhBTF9BRENFeF9JbmplY3RlZFBvbGxGb3JDb252ZXJzaW9uKCkgKQorICAgICAgICAgICgrKyspIFJldHJpZXZlIGNvbnZlcnNpb24gcmVzdWx0cyAKKyAgICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfQURDX0dldFZhbHVlKCkKKyAgICAgICAgICAgICAgICAob3IgZm9yIGluamVjdGVkIGdyb3VwOiBIQUxfQURDRXhfSW5qZWN0ZWRHZXRWYWx1ZSgpICkKKyAgICAgICAgICAoKysrKSBTdG9wIGNvbnZlcnNpb24gYW5kIGRpc2FibGUgdGhlIEFEQyBwZXJpcGhlcmFsIAorICAgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfU3RvcCgpCisKKyAgICAgICAgKCsrKSBBREMgY29udmVyc2lvbiBieSBpbnRlcnJ1cHRpb246IAorICAgICAgICAgICgrKyspIEFjdGl2YXRlIHRoZSBBREMgcGVyaXBoZXJhbCBhbmQgc3RhcnQgY29udmVyc2lvbnMKKyAgICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfQURDX1N0YXJ0X0lUKCkKKyAgICAgICAgICAoKysrKSBXYWl0IGZvciBBREMgY29udmVyc2lvbiBjb21wbGV0aW9uIGJ5IGNhbGwgb2YgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICBIQUxfQURDX0NvbnZDcGx0Q2FsbGJhY2soKQorICAgICAgICAgICAgICAgICh0aGlzIGZ1bmN0aW9uIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdXNlciBwcm9ncmFtKQorICAgICAgICAgICAgICAgIChvciBmb3IgaW5qZWN0ZWQgZ3JvdXA6IEhBTF9BRENFeF9JbmplY3RlZENvbnZDcGx0Q2FsbGJhY2soKSApCisgICAgICAgICAgKCsrKykgUmV0cmlldmUgY29udmVyc2lvbiByZXN1bHRzIAorICAgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfR2V0VmFsdWUoKQorICAgICAgICAgICAgICAgIChvciBmb3IgaW5qZWN0ZWQgZ3JvdXA6IEhBTF9BRENFeF9JbmplY3RlZEdldFZhbHVlKCkgKQorICAgICAgICAgICgrKyspIFN0b3AgY29udmVyc2lvbiBhbmQgZGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgCisgICAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19TdG9wX0lUKCkKKworICAgICAgICAoKyspIEFEQyBjb252ZXJzaW9uIHdpdGggdHJhbnNmZXIgYnkgRE1BOgorICAgICAgICAgICgrKyspIEFjdGl2YXRlIHRoZSBBREMgcGVyaXBoZXJhbCBhbmQgc3RhcnQgY29udmVyc2lvbnMKKyAgICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfQURDX1N0YXJ0X0RNQSgpCisgICAgICAgICAgKCsrKykgV2FpdCBmb3IgQURDIGNvbnZlcnNpb24gY29tcGxldGlvbiBieSBjYWxsIG9mIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrKCkgb3IgSEFMX0FEQ19Db252SGFsZkNwbHRDYWxsYmFjaygpCisgICAgICAgICAgICAgICAgKHRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIGltcGxlbWVudGVkIGluIHVzZXIgcHJvZ3JhbSkKKyAgICAgICAgICAoKysrKSBDb252ZXJzaW9uIHJlc3VsdHMgYXJlIGF1dG9tYXRpY2FsbHkgdHJhbnNmZXJyZWQgYnkgRE1BIGludG8KKyAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiB2YXJpYWJsZSBhZGRyZXNzLgorICAgICAgICAgICgrKyspIFN0b3AgY29udmVyc2lvbiBhbmQgZGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgCisgICAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19TdG9wX0RNQSgpCisKKyAgICAgICAgKCsrKSBGb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDczogQURDIG11bHRpbW9kZSBjb252ZXJzaW9uIAorICAgICAgICAgICAgIHdpdGggdHJhbnNmZXIgYnkgRE1BOgorICAgICAgICAgICgrKyspIEFjdGl2YXRlIHRoZSBBREMgcGVyaXBoZXJhbCAoc2xhdmUpCisgICAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19TdGFydCgpCisgICAgICAgICAgICAgICAgKGNvbnZlcnNpb24gc3RhcnQgcGVuZGluZyBBREMgbWFzdGVyKQorICAgICAgICAgICgrKyspIEFjdGl2YXRlIHRoZSBBREMgcGVyaXBoZXJhbCAobWFzdGVyKSBhbmQgc3RhcnQgY29udmVyc2lvbnMKKyAgICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfQURDRXhfTXVsdGlNb2RlU3RhcnRfRE1BKCkKKyAgICAgICAgICAoKysrKSBXYWl0IGZvciBBREMgY29udmVyc2lvbiBjb21wbGV0aW9uIGJ5IGNhbGwgb2YgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICBIQUxfQURDX0NvbnZDcGx0Q2FsbGJhY2soKSBvciBIQUxfQURDX0NvbnZIYWxmQ3BsdENhbGxiYWNrKCkKKyAgICAgICAgICAgICAgICAodGhlc2UgZnVuY3Rpb25zIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdXNlciBwcm9ncmFtKQorICAgICAgICAgICgrKyspIENvbnZlcnNpb24gcmVzdWx0cyBhcmUgYXV0b21hdGljYWxseSB0cmFuc2ZlcnJlZCBieSBETUEgaW50bworICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uIHZhcmlhYmxlIGFkZHJlc3MuCisgICAgICAgICAgKCsrKykgU3RvcCBjb252ZXJzaW9uIGFuZCBkaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAobWFzdGVyKQorICAgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENFeF9NdWx0aU1vZGVTdG9wX0RNQSgpCisgICAgICAgICAgKCsrKykgU3RvcCBjb252ZXJzaW9uIGFuZCBkaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAoc2xhdmUpCisgICAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19TdG9wX0lUKCkKKworICAgICBbLi5dCisKKyAgICAoQCkgQ2FsbGJhY2sgZnVuY3Rpb25zIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdXNlciBwcm9ncmFtOgorICAgICAgKCtAKSBIQUxfQURDX0Vycm9yQ2FsbGJhY2soKQorICAgICAgKCtAKSBIQUxfQURDX0xldmVsT3V0T2ZXaW5kb3dDYWxsYmFjaygpIChjYWxsYmFjayBvZiBhbmFsb2cgd2F0Y2hkb2cpCisgICAgICAoK0ApIEhBTF9BRENfQ29udkNwbHRDYWxsYmFjaygpCisgICAgICAoK0ApIEhBTF9BRENfQ29udkhhbGZDcGx0Q2FsbGJhY2sKKyAgICAgICgrQCkgSEFMX0FEQ0V4X0luamVjdGVkQ29udkNwbHRDYWxsYmFjaygpCisgICAgICAoK0ApIEhBTF9BRENFeF9JbmplY3RlZFF1ZXVlT3ZlcmZsb3dDYWxsYmFjaygpIChmb3IgU1RNMzJGMzB4L1NUTTMyRjMzeCBkZXZpY2VzKQorCisgICAgICoqKiBEZWluaXRpYWxpemF0aW9uIG9mIEFEQyAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0KKworICAgICgjKSBEaXNhYmxlIHRoZSBBREMgaW50ZXJmYWNlCisgICAgICAoKyspIEFEQyBjbG9jayBjYW4gYmUgaGFyZCByZXNldCBhbmQgZGlzYWJsZWQgYXQgUkNDIHRvcCBsZXZlbC4KKyAgICAgICAgKCsrKSBIYXJkIHJlc2V0IG9mIEFEQyBwZXJpcGhlcmFscworICAgICAgICAgICAgIHVzaW5nIG1hY3JvIF9fQURDeF9GT1JDRV9SRVNFVCgpLCBfX0FEQ3hfUkVMRUFTRV9SRVNFVCgpLgorICAgICAgICAoKyspIEFEQyBjbG9jayBkaXNhYmxlCisgICAgICAgICAgICAgdXNpbmcgdGhlIGVxdWl2YWxlbnQgbWFjcm8vZnVuY3Rpb25zIGFzIGNvbmZpZ3VyYXRpb24gc3RlcC4KKworICAgICAgICAoKyspIEZvciBTVE0zMkYzMHgvU1RNMzJGMzN4IGRldmljZXM6CisgICAgICAgICAgIENhdXRpb246IEZvciBkZXZpY2VzIHdpdGggc2V2ZXJhbCBBRENzOgorICAgICAgICAgICBUaGVzZSBzZXR0aW5ncyBpbXBhY3QgYm90aCBBREMgb2YgY29tbW9uIGdyb3VwOiBBREMxJkFEQzIsIEFEQzMmQURDNAorICAgICAgICAgICBpZiBhdmFpbGFibGUgKEFEQzIsIEFEQzMsIEFEQzQgYXZhaWxhYmlsaXR5IGRlcGVuZHMgb24gU1RNMzIgcHJvZHVjdCkKKworICAgICAgICAgICAgICgrKyspIEZvciBleGFtcGxlLCBpbiBjYXNlIG9mIGRldmljZSB3aXRoIGEgc2luZ2xlIEFEQzoKKyAgICAgICAgICAgICAgICAgICBJbnRvIEhBTF9BRENfTXNwRGVJbml0KCkgKHJlY29tbWVuZGVkIGNvZGUgbG9jYXRpb24pIG9yIHdpdGgKKyAgICAgICAgICAgICAgICAgICBvdGhlciBkZXZpY2UgY2xvY2sgcGFyYW1ldGVycyBjb25maWd1cmF0aW9uOgorICAgICAgICAgICAgICAgKCsrKykgX19IQUxfUkNDX0FEQzFfRk9SQ0VfUkVTRVQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25hbCkKKyAgICAgICAgICAgICAgICgrKyspIF9fSEFMX1JDQ19BREMxX1JFTEVBU0VfUkVTRVQoKSAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uYWwpCisgICAgICAgICAgICAgICAoKysrKSBfX0hBTF9SQ0NfQURDMV9DTEtfRElTQUJMRSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hbmRhdG9yeSkKKyAgICAgICAgICAgICAgICgrKyspIFBlcmlwaENsa0luaXQuUGVyaXBoQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUEVSSVBIQ0xLX0FEQyAob3B0aW9uYWwsIGlmIGNvbmZpZ3VyZWQgYmVmb3JlKQorICAgICAgICAgICAgICAgKCsrKykgUGVyaXBoQ2xrSW5pdC5BZGMxQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfQURDMVBMTENMS19PRkYgIChvcHRpb25hbCwgaWYgY29uZmlndXJlZCBiZWZvcmUpCisgICAgICAgICAgICAgICAoKysrKSBIQUxfUkNDRXhfUGVyaXBoQ0xLQ29uZmlnKCZSQ0NfUGVyaXBoQ2xrSW5pdFN0cnVjdHVyZSkgKG9wdGlvbmFsLCBpZiBjb25maWd1cmVkIGJlZm9yZSkKKworICAgICAgICAgICAgICgrKyspIEZvciBleGFtcGxlLCBpbiBjYXNlIG9mIGRldmljZSB3aXRoIDQgQURDczoKKyAgICAgICAgICAgICAgICgrKyspIGlmKChoYWRjLT5JbnN0YW5jZSA9PSBBREMxKSB8fCAoaGFkYy0+SW5zdGFuY2UgPT0gQURDMikpICAgCisgICAgICAgICAgICAgICAoKysrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgKCsrKykgICBfX0hBTF9SQ0NfQURDMTJfRk9SQ0VfUkVTRVQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uYWwpCisgICAgICAgICAgICAgICAoKysrKSAgIF9fSEFMX1JDQ19BREMxMl9SRUxFQVNFX1JFU0VUKCkgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25hbCkKKyAgICAgICAgICAgICAgICgrKyspICAgX19IQUxfUkNDX0FEQzEyX0NMS19ESVNBQkxFKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hbmRhdG9yeSkKKyAgICAgICAgICAgICAgICgrKyspICAgUGVyaXBoQ2xrSW5pdC5QZXJpcGhDbG9ja1NlbGVjdGlvbiA9IFJDQ19QRVJJUEhDTEtfQURDICAgKG9wdGlvbmFsLCBpZiBjb25maWd1cmVkIGJlZm9yZSkKKyAgICAgICAgICAgICAgICgrKyspICAgUGVyaXBoQ2xrSW5pdC5BZGMxMkNsb2NrU2VsZWN0aW9uID0gUkNDX0FEQzEyUExMQ0xLX09GRiAgKG9wdGlvbmFsLCBpZiBjb25maWd1cmVkIGJlZm9yZSkKKyAgICAgICAgICAgICAgICgrKyspICAgSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZygmUkNDX1BlcmlwaENsa0luaXRTdHJ1Y3R1cmUpICAgKG9wdGlvbmFsLCBpZiBjb25maWd1cmVkIGJlZm9yZSkKKyAgICAgICAgICAgICAgICgrKyspIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAoKysrKSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgKCsrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICgrKyspICAgX19IQUxfUkNDX0FEQzMyX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvbmFsKQorICAgICAgICAgICAgICAgKCsrKykgICBfX0hBTF9SQ0NfQURDMzJfUkVMRUFTRV9SRVNFVCgpICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uYWwpCisgICAgICAgICAgICAgICAoKysrKSAgIF9fSEFMX1JDQ19BREMzNF9DTEtfRElTQUJMRSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYW5kYXRvcnkpCisgICAgICAgICAgICAgICAoKysrKSAgIFBlcmlwaENsa0luaXQuQWRjMzRDbG9ja1NlbGVjdGlvbiA9IFJDQ19BREMzNFBMTENMS19PRkYgIChvcHRpb25hbCwgaWYgY29uZmlndXJlZCBiZWZvcmUpCisgICAgICAgICAgICAgICAoKysrKSAgIEhBTF9SQ0NFeF9QZXJpcGhDTEtDb25maWcoJlJDQ19QZXJpcGhDbGtJbml0U3RydWN0dXJlKSAgIChvcHRpb25hbCwgaWYgY29uZmlndXJlZCBiZWZvcmUpCisgICAgICAgICAgICAgICAoKysrKSB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgCisgICAgICAgICgrKykgRm9yIFNUTTMyRjM3eCBkZXZpY2VzOgorICAgICAgICAgICAgICgrKyspIEV4YW1wbGU6CisgICAgICAgICAgICAgICAgICAgSW50byBIQUxfQURDX01zcERlSW5pdCgpIChyZWNvbW1lbmRlZCBjb2RlIGxvY2F0aW9uKSBvciB3aXRoCisgICAgICAgICAgICAgICAgICAgb3RoZXIgZGV2aWNlIGNsb2NrIHBhcmFtZXRlcnMgY29uZmlndXJhdGlvbjoKKyAgICAgICAgICAgICAgICgrKyspIFBlcmlwaENsa0luaXQuUGVyaXBoQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUEVSSVBIQ0xLX0FEQworICAgICAgICAgICAgICAgKCsrKykgUGVyaXBoQ2xrSW5pdC5BZGNDbG9ja1NlbGVjdGlvbiA9IFJDQ19BRENQTExDTEtfT0ZGCisgICAgICAgICAgICAgICAoKysrKSBIQUxfUkNDRXhfUGVyaXBoQ0xLQ29uZmlnKCZQZXJpcGhDbGtJbml0KQorCisgICAgKCMpIEFEQyBwaW5zIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICgrKykgRGlzYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBBREMgR1BJT3MKKyAgICAgICAgICAgICAgdXNpbmcgbWFjcm8gX19IQUxfUkNDX0dQSU94X0NMS19ESVNBQkxFKCkKKworICAgICgjKSBPcHRpb25hbGx5LCBpbiBjYXNlIG9mIHVzYWdlIG9mIEFEQyB3aXRoIGludGVycnVwdGlvbnM6CisgICAgICAgICAoKyspIERpc2FibGUgdGhlIE5WSUMgZm9yIEFEQworICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfTlZJQ19FbmFibGVJUlEoQURDeF9JUlFuKQorCisgICAgKCMpIE9wdGlvbmFsbHksIGluIGNhc2Ugb2YgdXNhZ2Ugb2YgRE1BOgorICAgICAgICAgKCsrKSBEZWluaXRpYWxpemUgdGhlIERNQQorICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfRE1BX0luaXQoKS4KKyAgICAgICAgICgrKykgRGlzYWJsZSB0aGUgTlZJQyBmb3IgRE1BCisgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9OVklDX0VuYWJsZUlSUShETUF4X0NoYW5uZWx4X0lSUW4pCisKKyAgICBbLi5dCisgIAorICAgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIAorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBBREMgQURDCisgICogQGJyaWVmIEFEQyBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfQURDX01PRFVMRV9FTkFCTEVECisgICAgCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0V4cG9ydGVkX0Z1bmN0aW9ucyBBREMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8gCisKKy8qKiBAZGVmZ3JvdXAgQURDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgCisgKgorQHZlcmJhdGltICAgIAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSB0aGUgQURDLiAKKyAgICAgICgrKSBEZS1pbml0aWFsaXplIHRoZSBBREMuIAorICAgICAgICAgCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBBREMgcGVyaXBoZXJhbCBhbmQgcmVndWxhciBncm91cCBhY2NvcmRpbmcgdG8gIAorICAqICAgICAgICAgcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4gc3RydWN0dXJlICJBRENfSW5pdFR5cGVEZWYiLgorICAqIEBub3RlICAgQXMgcHJlcmVxdWlzaXRlLCBBREMgY2xvY2sgbXVzdCBiZSBjb25maWd1cmVkIGF0IFJDQyB0b3AgbGV2ZWwKKyAgKiAgICAgICAgIGRlcGVuZGluZyBvbiBib3RoIHBvc3NpYmxlIGNsb2NrIHNvdXJjZXM6IFBMTCBjbG9jayBvciBBSEIgY2xvY2suCisgICogICAgICAgICBTZWUgY29tbWVudGVkIGV4YW1wbGUgY29kZSBiZWxvdyB0aGF0IGNhbiBiZSBjb3BpZWQgYW5kIHVuY29tbWVudGVkIAorICAqICAgICAgICAgaW50byBIQUxfQURDX01zcEluaXQoKS4KKyAgKiBAbm90ZSAgIFBvc3NpYmlsaXR5IHRvIHVwZGF0ZSBwYXJhbWV0ZXJzIG9uIHRoZSBmbHk6CisgICogICAgICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBBREMgTVNQIChIQUxfQURDX01zcEluaXQoKSkgb25seSB3aGVuCisgICogICAgICAgICBjb21pbmcgZnJvbSBBREMgc3RhdGUgcmVzZXQuIEZvbGxvd2luZyBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIGNhbgorICAqICAgICAgICAgYmUgdXNlZCB0byByZWNvbmZpZ3VyZSBzb21lIHBhcmFtZXRlcnMgb2YgQURDX0luaXRUeXBlRGVmICAKKyAgKiAgICAgICAgIHN0cnVjdHVyZSBvbiB0aGUgZmx5LCB3aXRob3V0IG1vZGlmeWluZyBNU1AgY29uZmlndXJhdGlvbi4gSWYgQURDICAKKyAgKiAgICAgICAgIE1TUCBoYXMgdG8gYmUgbW9kaWZpZWQgYWdhaW4sIEhBTF9BRENfRGVJbml0KCkgbXVzdCBiZSBjYWxsZWQKKyAgKiAgICAgICAgIGJlZm9yZSBIQUxfQURDX0luaXQoKS4KKyAgKiAgICAgICAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLgorICAqICAgICAgICAgRm9yIHBhcmFtZXRlcnMgY29uc3RyYWludHMsIHNlZSBjb21tZW50cyBvZiBzdHJ1Y3R1cmUgCisgICogICAgICAgICAiQURDX0luaXRUeXBlRGVmIi4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgQURDIHdpdGhpbiAyIHNjb3Blczogc2NvcGUgb2YgZW50aXJlIAorICAqICAgICAgICAgQURDIGFuZCBzY29wZSBvZiByZWd1bGFyIGdyb3VwLiBGb3IgcGFyYW1ldGVycyBkZXRhaWxzLCBzZWUgY29tbWVudHMgCisgICogICAgICAgICBvZiBzdHJ1Y3R1cmUgIkFEQ19Jbml0VHlwZURlZiIuCisgICogQG5vdGUgICBGb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDczogcGFyYW1ldGVycyByZWxhdGVkIHRvIGNvbW1vbiBBREMgCisgICogICAgICAgICByZWdpc3RlcnMgKEFEQyBjbG9jayBtb2RlKSBhcmUgc2V0IG9ubHkgaWYgYWxsIEFEQ3Mgc2hhcmluZyB0aGUKKyAgKiAgICAgICAgIHNhbWUgY29tbW9uIGdyb3VwIGFyZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCB0aGVzZSBjb21tb24gcGFyYW1ldGVycyBzZXR0aW5nIGFyZSAgCisgICogICAgICAgICBieXBhc3NlZCB3aXRob3V0IGVycm9yIHJlcG9ydGluZzogaXQgY2FuIGJlIHRoZSBpbnRlbmRlZCBiZWhhdmlvdXIgaW4KKyAgKiAgICAgICAgIGNhc2Ugb2YgdXBkYXRlIG9mIGEgcGFyYW1ldGVyIG9mIEFEQ19Jbml0VHlwZURlZiBvbiB0aGUgZmx5LAorICAqICAgICAgICAgd2l0aG91dCAgZGlzYWJsaW5nIHRoZSBvdGhlciBBRENzIHNoYXJpbmcgdGhlIHNhbWUgY29tbW9uIGdyb3VwLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitfX3dlYWsgSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19Jbml0KEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoYWRjKTsKKworICAvKiBOb3RlIDogVGhpcyBmdW5jdGlvbiBpcyBkZWZpbmVkIGludG8gdGhpcyBmaWxlIGZvciBsaWJyYXJ5IHJlZmVyZW5jZS4gKi8KKyAgLyogICAgICAgIEZ1bmN0aW9uIGNvbnRlbnQgaXMgbG9jYXRlZCBpbnRvIGZpbGUgc3RtMzJmM3h4X2hhbF9hZGNfZXguYyAgICovCisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfRVJST1I7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVpbml0aWFsaXplIHRoZSBBREMgcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldAorICAqICAgICAgICAgdmFsdWVzLCB3aXRoIGRlaW5pdGlhbGl6YXRpb24gb2YgdGhlIEFEQyBNU1AuCisgICogQG5vdGUgICBGb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDczogcmVzZXQgb2YgQURDIGNvbW1vbiByZWdpc3RlcnMgaXMgZG9uZSAKKyAgKiAgICAgICAgIG9ubHkgaWYgYWxsIEFEQ3Mgc2hhcmluZyB0aGUgc2FtZSBjb21tb24gZ3JvdXAgYXJlIGRpc2FibGVkLgorICAqICAgICAgICAgSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIHJlc2V0IG9mIHRoZXNlIGNvbW1vbiBwYXJhbWV0ZXJzIHJlc2V0IGlzICAKKyAgKiAgICAgICAgIGJ5cGFzc2VkIHdpdGhvdXQgZXJyb3IgcmVwb3J0aW5nOiBpdCBjYW4gYmUgdGhlIGludGVuZGVkIGJlaGF2aW91ciBpbgorICAqICAgICAgICAgY2FzZSBvZiByZXNldCBvZiBhIHNpbmdsZSBBREMgd2hpbGUgdGhlIG90aGVyIEFEQ3Mgc2hhcmluZyB0aGUgc2FtZSAKKyAgKiAgICAgICAgIGNvbW1vbiBncm91cCBpcyBzdGlsbCBydW5uaW5nLgorICAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQ3M6IEdsb2JhbCByZXNldCBvZiBhbGwgQURDcyBzaGFyaW5nIGEKKyAgKiAgICAgICAgIGNvbW1vbiBncm91cCBpcyBwb3NzaWJsZS4KKyAgKiAgICAgICAgIEFzIHRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gcmVzZXQgYSBzaW5nbGUgQURDLCB0byBub3QgaW1wYWN0IAorICAqICAgICAgICAgb3RoZXIgQURDcywgaW5zdHJ1Y3Rpb25zIGZvciBnbG9iYWwgcmVzZXQgb2YgbXVsdGlwbGUgQURDcyBoYXZlIGJlZW4KKyAgKiAgICAgICAgIGxldCBjb21tZW50ZWQgYmVsb3cuCisgICogICAgICAgICBJZiBuZWVkZWQsIHRoZSBleGFtcGxlIGNvZGUgY2FuIGJlIGNvcGllZCBhbmQgdW5jb21tZW50ZWQgaW50bworICAqICAgICAgICAgZnVuY3Rpb24gSEFMX0FEQ19Nc3BEZUluaXQoKS4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworX193ZWFrIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfRGVJbml0KEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoYWRjKTsKKworICAvKiBOb3RlIDogVGhpcyBmdW5jdGlvbiBpcyBkZWZpbmVkIGludG8gdGhpcyBmaWxlIGZvciBsaWJyYXJ5IHJlZmVyZW5jZS4gKi8KKyAgLyogICAgICAgIEZ1bmN0aW9uIGNvbnRlbnQgaXMgbG9jYXRlZCBpbnRvIGZpbGUgc3RtMzJmM3h4X2hhbF9hZGNfZXguYyAgICovCisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfRVJST1I7Cit9CisgICAgCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBBREMgTVNQLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQURDX01zcEluaXQoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhhZGMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIGZ1bmN0aW9uIEhBTF9BRENfTXNwSW5pdCBtdXN0IGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLyAKK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIHRoZSBBREMgTVNQLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQURDX01zcERlSW5pdChBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGFkYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4gV2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgZnVuY3Rpb24gSEFMX0FEQ19Nc3BEZUluaXQgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8gCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSW5wdXQgYW5kIE91dHB1dCBvcGVyYXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgCisgKgorQHZlcmJhdGltICAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIFN0YXJ0IGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cC4KKyAgICAgICgrKSBTdG9wIGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cC4KKyAgICAgICgrKSBQb2xsIGZvciBjb252ZXJzaW9uIGNvbXBsZXRlIG9uIHJlZ3VsYXIgZ3JvdXAuCisgICAgICAoKykgUG9sbCBmb3IgY29udmVyc2lvbiBldmVudC4KKyAgICAgICgrKSBHZXQgcmVzdWx0IG9mIHJlZ3VsYXIgY2hhbm5lbCBjb252ZXJzaW9uLgorICAgICAgKCspIFN0YXJ0IGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cCBhbmQgZW5hYmxlIGludGVycnVwdGlvbnMuCisgICAgICAoKykgU3RvcCBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAgYW5kIGRpc2FibGUgaW50ZXJydXB0aW9ucy4KKyAgICAgICgrKSBIYW5kbGUgQURDIGludGVycnVwdCByZXF1ZXN0CisgICAgICAoKykgU3RhcnQgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwIGFuZCBlbmFibGUgRE1BIHRyYW5zZmVyLgorICAgICAgKCspIFN0b3AgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwIGFuZCBkaXNhYmxlIEFEQyBETUEgdHJhbnNmZXIuCisgICAgICAgICAgICAgICAKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgQURDLCBzdGFydHMgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwLgorICAqICAgICAgICAgSW50ZXJydXB0aW9ucyBlbmFibGVkIGluIHRoaXMgZnVuY3Rpb246IE5vbmUuCisgICogQG5vdGU6ICBDYXNlIG9mIG11bHRpbW9kZSBlbmFibGVkIChmb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDcyk6IFRoaXMgCisgICogICAgICAgICBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBmb3IgQURDIHNsYXZlIGZpcnN0LCB0aGVuIEFEQyBtYXN0ZXIuIAorICAqICAgICAgICAgRm9yIEFEQyBzbGF2ZSwgQURDIGlzIGVuYWJsZWQgb25seSAoY29udmVyc2lvbiBpcyBub3Qgc3RhcnRlZCkuICAKKyAgKiAgICAgICAgIEZvciBBREMgbWFzdGVyLCBBREMgaXMgZW5hYmxlZCBhbmQgbXVsdGltb2RlIGNvbnZlcnNpb24gaXMgc3RhcnRlZC4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworX193ZWFrIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RhcnQoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhhZGMpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9FUlJPUjsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIEFEQyBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAgKGFuZCBpbmplY3RlZCBncm91cCBpbiAKKyAgKiAgICAgICAgIGNhc2Ugb2YgYXV0b19pbmplY3Rpb24gbW9kZSksIGRpc2FibGUgQURDIHBlcmlwaGVyYWwuCisgICogQG5vdGU6ICBBREMgcGVyaXBoZXJhbCBkaXNhYmxlIGlzIGZvcmNpbmcgc3RvcCBvZiBwb3RlbnRpYWwgCisgICogICAgICAgICBjb252ZXJzaW9uIG9uIGluamVjdGVkIGdyb3VwLiBJZiBpbmplY3RlZCBncm91cCBpcyB1bmRlciB1c2UsIGl0CisgICogICAgICAgICBzaG91bGQgYmUgcHJlbGltaW5hcmlseSBzdG9wcGVkIHVzaW5nIEhBTF9BRENFeF9JbmplY3RlZFN0b3AgZnVuY3Rpb24uCisgICogQG5vdGU6ICBDYXNlIG9mIG11bHRpbW9kZSBlbmFibGVkIChmb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDcyk6IFRoaXMgCisgICogICAgICAgICBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBmb3IgQURDIG1hc3RlciBmaXJzdCwgdGhlbiBBREMgc2xhdmUuCisgICogICAgICAgICBGb3IgQURDIG1hc3RlciwgY29udmVyc29uIGlzIHN0b3BwZWQgYW5kIEFEQyBpcyBkaXNhYmxlZC4gCisgICogICAgICAgICBGb3IgQURDIHNsYXZlLCBBREMgaXMgZGlzYWJsZWQgb25seSAoY29udmVyc2lvbiBzdG9wIG9mIEFEQyBtYXN0ZXIKKyAgKiAgICAgICAgIGhhcyBhbHJlYWR5IHN0b3BwZWQgY29udmVyc2lvbiBvZiBBREMgc2xhdmUpLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzLgorICAqLworX193ZWFrIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RvcChBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGFkYyk7CisKKyAgLyogTm90ZSA6IFRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCBpbnRvIHRoaXMgZmlsZSBmb3IgbGlicmFyeSByZWZlcmVuY2UuICovCisgIC8qICAgICAgICBGdW5jdGlvbiBjb250ZW50IGlzIGxvY2F0ZWQgaW50byBmaWxlIHN0bTMyZjN4eF9oYWxfYWRjX2V4LmMgICAqLworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX0VSUk9SOworfQorCisvKioKKyAgKiBAYnJpZWYgIFdhaXQgZm9yIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiB0byBiZSBjb21wbGV0ZWQuCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCB2YWx1ZSBpbiBtaWxsaXNlY29uZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK19fd2VhayBIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1BvbGxGb3JDb252ZXJzaW9uKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCBUaW1lb3V0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoYWRjKTsKKyAgVU5VU0VEKFRpbWVvdXQpOworCisgIC8qIE5vdGUgOiBUaGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQgaW50byB0aGlzIGZpbGUgZm9yIGxpYnJhcnkgcmVmZXJlbmNlLiAqLworICAvKiAgICAgICAgRnVuY3Rpb24gY29udGVudCBpcyBsb2NhdGVkIGludG8gZmlsZSBzdG0zMmYzeHhfaGFsX2FkY19leC5jICAgKi8KKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9FUlJPUjsKK30KKworLyoqCisgICogQGJyaWVmICBQb2xsIGZvciBjb252ZXJzaW9uIGV2ZW50LgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHBhcmFtICBFdmVudFR5cGUgdGhlIEFEQyBldmVudCB0eXBlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEFEQ19BV0RfRVZFTlQ6IEFEQyBBbmFsb2cgd2F0Y2hkb2cgMSBldmVudCAobWFpbiBhbmFsb2cgd2F0Y2hkb2csIHByZXNlbnQgb24gYWxsIFNUTTMyIGRldmljZXMpCisgICogICAgICAgICAgICBAYXJnIEFEQ19BV0QyX0VWRU5UOiBBREMgQW5hbG9nIHdhdGNoZG9nIDIgZXZlbnQgKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nLCBwcmVzZW50IG9ubHkgb24gU1RNMzJGMyBkZXZpY2VzKQorICAqICAgICAgICAgICAgQGFyZyBBRENfQVdEM19FVkVOVDogQURDIEFuYWxvZyB3YXRjaGRvZyAzIGV2ZW50IChhZGRpdGlvbmFsIGFuYWxvZyB3YXRjaGRvZywgcHJlc2VudCBvbmx5IG9uIFNUTTMyRjMgZGV2aWNlcykKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX09WUl9FVkVOVDogQURDIE92ZXJydW4gZXZlbnQKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0pRT1ZGX0VWRU5UOiBBREMgSW5qZWN0ZWQgY29udGV4dCBxdWV1ZSBvdmVyZmxvdyBldmVudAorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IHZhbHVlIGluIG1pbGxpc2Vjb25kLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworX193ZWFrIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfUG9sbEZvckV2ZW50KEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCBFdmVudFR5cGUsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhhZGMpOworICBVTlVTRUQoRXZlbnRUeXBlKTsKKyAgVU5VU0VEKFRpbWVvdXQpOworCisgIC8qIE5vdGUgOiBUaGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQgaW50byB0aGlzIGZpbGUgZm9yIGxpYnJhcnkgcmVmZXJlbmNlLiAqLworICAvKiAgICAgICAgRnVuY3Rpb24gY29udGVudCBpcyBsb2NhdGVkIGludG8gZmlsZSBzdG0zMmYzeHhfaGFsX2FkY19leC5jICAgKi8KKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9FUlJPUjsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGVzIEFEQywgc3RhcnRzIGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cCB3aXRoIGludGVycnVwdGlvbi4KKyAgKiAgICAgICAgIEludGVycnVwdGlvbnMgZW5hYmxlZCBpbiB0aGlzIGZ1bmN0aW9uOgorICAqICAgICAgICAgIC0gRU9DIChlbmQgb2YgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwKSBvciBFT1MgKGVuZCBvZiAKKyAgKiAgICAgICAgICAgIHNlcXVlbmNlIG9mIHJlZ3VsYXIgZ3JvdXApIGRlcGVuZGluZyBvbiBBREMgaW5pdGlhbGl6YXRpb24gCisgICogICAgICAgICAgICBwYXJhbWV0ZXIgIkVPQ1NlbGVjdGlvbiIgKGlmIGF2YWlsYWJsZSkKKyAgKiAgICAgICAgICAtIG92ZXJydW4gKGlmIGF2YWlsYWJsZSkKKyAgKiAgICAgICAgIEVhY2ggb2YgdGhlc2UgaW50ZXJydXB0aW9ucyBoYXMgaXRzIGRlZGljYXRlZCBjYWxsYmFjayBmdW5jdGlvbi4KKyAgKiBAbm90ZTogIENhc2Ugb2YgbXVsdGltb2RlIGVuYWJsZWQgKGZvciBkZXZpY2VzIHdpdGggc2V2ZXJhbCBBRENzKTogVGhpcyAKKyAgKiAgICAgICAgIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGZvciBBREMgc2xhdmUgZmlyc3QsIHRoZW4gQURDIG1hc3Rlci4gCisgICogICAgICAgICBGb3IgQURDIHNsYXZlLCBBREMgaXMgZW5hYmxlZCBvbmx5IChjb252ZXJzaW9uIGlzIG5vdCBzdGFydGVkKS4gIAorICAqICAgICAgICAgRm9yIEFEQyBtYXN0ZXIsIEFEQyBpcyBlbmFibGVkIGFuZCBtdWx0aW1vZGUgY29udmVyc2lvbiBpcyBzdGFydGVkLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitfX3dlYWsgSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19TdGFydF9JVChBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGFkYyk7CisKKyAgLyogTm90ZSA6IFRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCBpbnRvIHRoaXMgZmlsZSBmb3IgbGlicmFyeSByZWZlcmVuY2UuICovCisgIC8qICAgICAgICBGdW5jdGlvbiBjb250ZW50IGlzIGxvY2F0ZWQgaW50byBmaWxlIHN0bTMyZjN4eF9oYWxfYWRjX2V4LmMgICAqLworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX0VSUk9SOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgQURDIGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cCAoYW5kIGluamVjdGVkIGdyb3VwIGluIAorICAqICAgICAgICAgY2FzZSBvZiBhdXRvX2luamVjdGlvbiBtb2RlKSwgZGlzYWJsZSBpbnRlcnJ1cHRpb24gb2YgCisgICogICAgICAgICBlbmQtb2YtY29udmVyc2lvbiwgZGlzYWJsZSBBREMgcGVyaXBoZXJhbC4KKyAgKiBAbm90ZTogIEFEQyBwZXJpcGhlcmFsIGRpc2FibGUgaXMgZm9yY2luZyBzdG9wIG9mIHBvdGVudGlhbCAKKyAgKiAgICAgICAgIGNvbnZlcnNpb24gb24gaW5qZWN0ZWQgZ3JvdXAuIElmIGluamVjdGVkIGdyb3VwIGlzIHVuZGVyIHVzZSwgaXQKKyAgKiAgICAgICAgIHNob3VsZCBiZSBwcmVsaW1pbmFyaWx5IHN0b3BwZWQgdXNpbmcgSEFMX0FEQ0V4X0luamVjdGVkU3RvcCBmdW5jdGlvbi4KKyAgKiBAbm90ZTogIENhc2Ugb2YgbXVsdGltb2RlIGVuYWJsZWQgKGZvciBkZXZpY2VzIHdpdGggc2V2ZXJhbCBBRENzKTogVGhpcyAKKyAgKiAgICAgICAgIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGZvciBBREMgbWFzdGVyIGZpcnN0LCB0aGVuIEFEQyBzbGF2ZS4KKyAgKiAgICAgICAgIEZvciBBREMgbWFzdGVyLCBjb252ZXJzaW9uIGlzIHN0b3BwZWQgYW5kIEFEQyBpcyBkaXNhYmxlZC4gCisgICogICAgICAgICBGb3IgQURDIHNsYXZlLCBBREMgaXMgZGlzYWJsZWQgb25seSAoY29udmVyc2lvbiBzdG9wIG9mIEFEQyBtYXN0ZXIKKyAgKiAgICAgICAgIGhhcyBhbHJlYWR5IHN0b3BwZWQgY29udmVyc2lvbiBvZiBBREMgc2xhdmUpLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzLgorICAqLworX193ZWFrIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RvcF9JVChBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGFkYyk7CisKKyAgLyogTm90ZSA6IFRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCBpbnRvIHRoaXMgZmlsZSBmb3IgbGlicmFyeSByZWZlcmVuY2UuICovCisgIC8qICAgICAgICBGdW5jdGlvbiBjb250ZW50IGlzIGxvY2F0ZWQgaW50byBmaWxlIHN0bTMyZjN4eF9oYWxfYWRjX2V4LmMgICAqLworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX0VSUk9SOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgQURDLCBzdGFydHMgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwIGFuZCB0cmFuc2ZlcnMgcmVzdWx0CisgICogICAgICAgICB0aHJvdWdoIERNQS4KKyAgKiAgICAgICAgIEludGVycnVwdGlvbnMgZW5hYmxlZCBpbiB0aGlzIGZ1bmN0aW9uOgorICAqICAgICAgICAgIC0gRE1BIHRyYW5zZmVyIGNvbXBsZXRlCisgICogICAgICAgICAgLSBETUEgaGFsZiB0cmFuc2ZlcgorICAqICAgICAgICAgIC0gb3ZlcnJ1biAoaWYgYXZhaWxhYmxlKQorICAqICAgICAgICAgRWFjaCBvZiB0aGVzZSBpbnRlcnJ1cHRpb25zIGhhcyBpdHMgZGVkaWNhdGVkIGNhbGxiYWNrIGZ1bmN0aW9uLgorICAqIEBub3RlOiAgQ2FzZSBvZiBtdWx0aW1vZGUgZW5hYmxlZCAoZm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQ3MpOiBUaGlzIAorICAqICAgICAgICAgZnVuY3Rpb24gaXMgZm9yIHNpbmdsZS1BREMgbW9kZSBvbmx5LiBGb3IgbXVsdGltb2RlLCB1c2UgdGhlIAorICAqICAgICAgICAgZGVkaWNhdGVkIE11bHRpbW9kZVN0YXJ0IGZ1bmN0aW9uLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHBhcmFtICBwRGF0YSBUaGUgZGVzdGluYXRpb24gQnVmZmVyIGFkZHJlc3MuCisgICogQHBhcmFtICBMZW5ndGggVGhlIGxlbmd0aCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gQURDIHBlcmlwaGVyYWwgdG8gbWVtb3J5LgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RhcnRfRE1BKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCogcERhdGEsIHVpbnQzMl90IExlbmd0aCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGFkYyk7CisgIFVOVVNFRChwRGF0YSk7CisgIFVOVVNFRChMZW5ndGgpOworCisgIC8qIE5vdGUgOiBUaGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQgaW50byB0aGlzIGZpbGUgZm9yIGxpYnJhcnkgcmVmZXJlbmNlLiAqLworICAvKiAgICAgICAgRnVuY3Rpb24gY29udGVudCBpcyBsb2NhdGVkIGludG8gZmlsZSBzdG0zMmYzeHhfaGFsX2FkY19leC5jICAgKi8KKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9FUlJPUjsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIEFEQyBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAgKGFuZCBpbmplY3RlZCBncm91cCBpbiAKKyAgKiAgICAgICAgIGNhc2Ugb2YgYXV0b19pbmplY3Rpb24gbW9kZSksIGRpc2FibGUgQURDIERNQSB0cmFuc2ZlciwgZGlzYWJsZSAKKyAgKiAgICAgICAgIEFEQyBwZXJpcGhlcmFsLgorICAqIEBub3RlOiAgQURDIHBlcmlwaGVyYWwgZGlzYWJsZSBpcyBmb3JjaW5nIHN0b3Agb2YgcG90ZW50aWFsIAorICAqICAgICAgICAgY29udmVyc2lvbiBvbiBpbmplY3RlZCBncm91cC4gSWYgaW5qZWN0ZWQgZ3JvdXAgaXMgdW5kZXIgdXNlLCBpdAorICAqICAgICAgICAgc2hvdWxkIGJlIHByZWxpbWluYXJpbHkgc3RvcHBlZCB1c2luZyBIQUxfQURDRXhfSW5qZWN0ZWRTdG9wIGZ1bmN0aW9uLgorICAqIEBub3RlOiAgQ2FzZSBvZiBtdWx0aW1vZGUgZW5hYmxlZCAoZm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQ3MpOiBUaGlzIAorICAqICAgICAgICAgZnVuY3Rpb24gaXMgZm9yIHNpbmdsZS1BREMgbW9kZSBvbmx5LiBGb3IgbXVsdGltb2RlLCB1c2UgdGhlIAorICAqICAgICAgICAgZGVkaWNhdGVkIE11bHRpbW9kZVN0b3AgZnVuY3Rpb24uCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMuCisgICovCitfX3dlYWsgSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19TdG9wX0RNQShBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGFkYyk7CisKKyAgLyogTm90ZSA6IFRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCBpbnRvIHRoaXMgZmlsZSBmb3IgbGlicmFyeSByZWZlcmVuY2UuICovCisgIC8qICAgICAgICBGdW5jdGlvbiBjb250ZW50IGlzIGxvY2F0ZWQgaW50byBmaWxlIHN0bTMyZjN4eF9oYWxfYWRjX2V4LmMgICAqLworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX0VSUk9SOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgcmVndWxhciBncm91cCBjb252ZXJzaW9uIHJlc3VsdC4KKyAgKiBAbm90ZSAgIFJlYWRpbmcgRFIgcmVnaXN0ZXIgYXV0b21hdGljYWxseSBjbGVhcnMgRU9DIChlbmQgb2YgY29udmVyc2lvbiBvZgorICAqICAgICAgICAgcmVndWxhciBncm91cCkgZmxhZy4KKyAgKiAgICAgICAgIEFkZGl0aW9uYWxseSwgdGhpcyBmdW5jdGlvbnMgY2xlYXJzIEVPUyAoZW5kIG9mIHNlcXVlbmNlIG9mCisgICogICAgICAgICByZWd1bGFyIGdyb3VwKSBmbGFnLCBpbiBjYXNlIG9mIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlIGlzIHJlYWNoZWQuCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIENvbnZlcnRlZCB2YWx1ZQorICAqLworX193ZWFrIHVpbnQzMl90IEhBTF9BRENfR2V0VmFsdWUoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIC8qIE5vdGUgOiBUaGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQgaW50byB0aGlzIGZpbGUgZm9yIGxpYnJhcnkgcmVmZXJlbmNlLiAqLworICAvKiAgICAgICAgRnVuY3Rpb24gY29udGVudCBpcyBsb2NhdGVkIGludG8gZmlsZSBzdG0zMmYzeHhfaGFsX2FkY19leC5jICAgKi8KKyAgCisgIC8qIFJldHVybiBBREMgY29udmVydGVkIHZhbHVlICovIAorICByZXR1cm4gaGFkYy0+SW5zdGFuY2UtPkRSOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZXMgQURDIGludGVycnVwdCByZXF1ZXN0LiAgCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9BRENfSVJRSGFuZGxlcihBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGFkYyk7CisKKyAgLyogTm90ZSA6IFRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCBpbnRvIHRoaXMgZmlsZSBmb3IgbGlicmFyeSByZWZlcmVuY2UuICovCisgIC8qICAgICAgICBGdW5jdGlvbiBjb250ZW50IGlzIGxvY2F0ZWQgaW50byBmaWxlIHN0bTMyZjN4eF9oYWxfYWRjX2V4LmMgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sgaW4gbm9uIGJsb2NraW5nIG1vZGUgCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9BRENfQ29udkNwbHRDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGFkYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4gV2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgZnVuY3Rpb24gSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgQ29udmVyc2lvbiBETUEgaGFsZi10cmFuc2ZlciBjYWxsYmFjayBpbiBub24gYmxvY2tpbmcgbW9kZSAKKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0FEQ19Db252SGFsZkNwbHRDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGFkYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4gV2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgZnVuY3Rpb24gSEFMX0FEQ19Db252SGFsZkNwbHRDYWxsYmFjayBtdXN0IGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICovCit9CisKKy8qKgorICAqIEBicmllZiAgQW5hbG9nIHdhdGNoZG9nIGNhbGxiYWNrIGluIG5vbiBibG9ja2luZyBtb2RlLiAKKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0FEQ19MZXZlbE91dE9mV2luZG93Q2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhhZGMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIGZ1bmN0aW9uIEhBTF9BRENfTGV2ZWxPb3V0T2ZXaW5kb3dDYWxsYmFjayBtdXN0IGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICovCit9CisKKy8qKgorICAqIEBicmllZiAgQURDIGVycm9yIGNhbGxiYWNrIGluIG5vbiBibG9ja2luZyBtb2RlCisgICogICAgICAgIChBREMgY29udmVyc2lvbiB3aXRoIGludGVycnVwdGlvbiBvciB0cmFuc2ZlciBieSBETUEpCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9BRENfRXJyb3JDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiAqaGFkYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGFkYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4gV2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgZnVuY3Rpb24gSEFMX0FEQ19FcnJvckNhbGxiYWNrIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgCisgKgorQHZlcmJhdGltICAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIENvbmZpZ3VyZSBjaGFubmVscyBvbiByZWd1bGFyIGdyb3VwCisgICAgICAoKykgQ29uZmlndXJlIHRoZSBhbmFsb2cgd2F0Y2hkb2cKKyAgICAgIAorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIHRoZSB0aGUgc2VsZWN0ZWQgY2hhbm5lbCB0byBiZSBsaW5rZWQgdG8gdGhlIHJlZ3VsYXIKKyAgKiAgICAgICAgIGdyb3VwLgorICAqIEBub3RlICAgSW4gY2FzZSBvZiB1c2FnZSBvZiBpbnRlcm5hbCBtZWFzdXJlbWVudCBjaGFubmVsczoKKyAgKiAgICAgICAgIFZiYXQvVnJlZkludC9UZW1wU2Vuc29yLgorICAqICAgICAgICAgVGhlIHJlY29tbWVuZGVkIHNhbXBsaW5nIHRpbWUgaXMgYXQgbGVhc3Q6CisgICogICAgICAgICAgLSBGb3IgZGV2aWNlcyBTVE0zMkYzN3g6IDE3LjF1cyBmb3IgdGVtcGVyYXR1cmUgc2Vuc29yCisgICogICAgICAgICAgLSBGb3IgdGhlIG90aGVyIFNUTTMyRjMgZGV2aWNlczogMi4ydXMgZm9yIGVhY2ggb2YgY2hhbm5lbHMgCisgICogICAgICAgICAgICBWYmF0L1ZyZWZJbnQvVGVtcFNlbnNvci4KKyAgKiAgICAgICAgIFRoZXNlIGludGVybmFsIHBhdGhzIGNhbiBiZSBiZSBkaXNhYmxlZCB1c2luZyBmdW5jdGlvbiAKKyAgKiAgICAgICAgIEhBTF9BRENfRGVJbml0KCkuCisgICogQG5vdGUgICBQb3NzaWJpbGl0eSB0byB1cGRhdGUgcGFyYW1ldGVycyBvbiB0aGUgZmx5OgorICAqICAgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBjaGFubmVsIGludG8gcmVndWxhciBncm91cCwgZm9sbG93aW5nICAKKyAgKiAgICAgICAgIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVjb25maWd1cmUgc29tZSBwYXJhbWV0ZXJzIAorICAqICAgICAgICAgb2Ygc3RydWN0dXJlICJBRENfQ2hhbm5lbENvbmZUeXBlRGVmIiBvbiB0aGUgZmx5LCB3aXRob3V0IHJlc2V0aW5nIAorICAqICAgICAgICAgdGhlIEFEQy4KKyAgKiAgICAgICAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLgorICAqICAgICAgICAgRm9yIHBhcmFtZXRlcnMgY29uc3RyYWludHMsIHNlZSBjb21tZW50cyBvZiBzdHJ1Y3R1cmUgCisgICogICAgICAgICAiQURDX0NoYW5uZWxDb25mVHlwZURlZiIuCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gIHNDb25maWcgU3RydWN0dXJlIG9mIEFEQyBjaGFubmVsIGZvciByZWd1bGFyIGdyb3VwLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworX193ZWFrIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfQ29uZmlnQ2hhbm5lbChBRENfSGFuZGxlVHlwZURlZiogaGFkYywgQURDX0NoYW5uZWxDb25mVHlwZURlZiogc0NvbmZpZykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGFkYyk7CisgIFVOVVNFRChzQ29uZmlnKTsKKworICAvKiBOb3RlIDogVGhpcyBmdW5jdGlvbiBpcyBkZWZpbmVkIGludG8gdGhpcyBmaWxlIGZvciBsaWJyYXJ5IHJlZmVyZW5jZS4gKi8KKyAgLyogICAgICAgIEZ1bmN0aW9uIGNvbnRlbnQgaXMgbG9jYXRlZCBpbnRvIGZpbGUgc3RtMzJmM3h4X2hhbF9hZGNfZXguYyAgICovCisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfRVJST1I7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgYW5hbG9nIHdhdGNoZG9nLgorICAqIEBub3RlICAgUG9zc2liaWxpdHkgdG8gdXBkYXRlIHBhcmFtZXRlcnMgb24gdGhlIGZseToKKyAgKiAgICAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIHNlbGVjdGVkIGFuYWxvZyB3YXRjaGRvZywgZm9sbG93aW5nICAKKyAgKiAgICAgICAgIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVjb25maWd1cmUgc29tZSBwYXJhbWV0ZXJzIAorICAqICAgICAgICAgb2Ygc3RydWN0dXJlICJBRENfQW5hbG9nV0RHQ29uZlR5cGVEZWYiIG9uIHRoZSBmbHksIHdpdGhvdXQgcmVzZXRpbmcgCisgICogICAgICAgICB0aGUgQURDLgorICAqICAgICAgICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGUuCisgICogICAgICAgICBGb3IgcGFyYW1ldGVycyBjb25zdHJhaW50cywgc2VlIGNvbW1lbnRzIG9mIHN0cnVjdHVyZSAKKyAgKiAgICAgICAgICJBRENfQW5hbG9nV0RHQ29uZlR5cGVEZWYiLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHBhcmFtICBBbmFsb2dXREdDb25maWcgU3RydWN0dXJlIG9mIEFEQyBhbmFsb2cgd2F0Y2hkb2cgY29uZmlndXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworX193ZWFrIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfQW5hbG9nV0RHQ29uZmlnKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCBBRENfQW5hbG9nV0RHQ29uZlR5cGVEZWYqIEFuYWxvZ1dER0NvbmZpZykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGFkYyk7CisgIFVOVVNFRChBbmFsb2dXREdDb25maWcpOworCisgIC8qIE5vdGUgOiBUaGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQgaW50byB0aGlzIGZpbGUgZm9yIGxpYnJhcnkgcmVmZXJlbmNlLiAqLworICAvKiAgICAgICAgRnVuY3Rpb24gY29udGVudCBpcyBsb2NhdGVkIGludG8gZmlsZSBzdG0zMmYzeHhfaGFsX2FkY19leC5jICAgKi8KKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9FUlJPUjsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICogIEBicmllZiAgIEFEQyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAKKyAqCitAdmVyYmF0aW0gICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIHN0YXRlIGFuZCBlcnJvcnMgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGdldCBpbiBydW4tdGltZSB0aGUgc3RhdHVzIG9mIHRoZSAgCisgICAgcGVyaXBoZXJhbC4KKyAgICAgICgrKSBDaGVjayB0aGUgQURDIHN0YXRlCisgICAgICAoKykgQ2hlY2sgdGhlIEFEQyBlcnJvciBjb2RlCisgICAgICAgICAKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisgIAorLyoqCisgICogQGJyaWVmICByZXR1cm4gdGhlIEFEQyBzdGF0ZQorICAqIEBub3RlICAgQURDIHN0YXRlIG1hY2hpbmUgaXMgbWFuYWdlZCBieSBiaXRmaWVsZCwgc3RhdGUgbXVzdCBiZSBjb21wYXJlZAorICAqICAgICAgICAgd2l0aCBiaXQgYnkgYml0LgorICAqICAgICAgICAgRm9yIGV4YW1wbGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICogICAgICAgICAgICIgaWYgKEhBTF9JU19CSVRfU0VUKEhBTF9BRENfR2V0U3RhdGUoaGFkYzEpLCBIQUxfQURDX1NUQVRFX1JFR19CVVNZKSkgIgorICAqICAgICAgICAgICAiIGlmIChIQUxfSVNfQklUX1NFVChIQUxfQURDX0dldFN0YXRlKGhhZGMxKSwgSEFMX0FEQ19TVEFURV9BV0QxKSAgICApICIKKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCit1aW50MzJfdCBIQUxfQURDX0dldFN0YXRlKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAKKyAgLyogUmV0dXJuIEFEQyBzdGF0ZSAqLworICByZXR1cm4gaGFkYy0+U3RhdGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBBREMgZXJyb3IgY29kZQorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBBREMgRXJyb3IgQ29kZQorICAqLwordWludDMyX3QgSEFMX0FEQ19HZXRFcnJvcihBRENfSGFuZGxlVHlwZURlZiAqaGFkYykKK3sKKyAgcmV0dXJuIGhhZGMtPkVycm9yQ29kZTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKyAgICAgICAKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfQURDX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqCisgICogQH0KKyAgKi8gCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmM3h4X2hhbF9hZGNfZXguYyBiL1NyYy9zdG0zMmYzeHhfaGFsX2FkY19leC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkOTM1ODEKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJmM3h4X2hhbF9hZGNfZXguYwpAQCAtMCwwICsxLDc0NzQgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX2FkY19leC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nIAorICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgQW5hbG9nIHRvIERpZ2l0YWwgQ29udmVydG9yIChBREMpCisgICogICAgICAgICAgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBPcGVyYXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICAgKysgU3RhcnQsIHN0b3AsIGdldCByZXN1bHQgb2YgY29udmVyc2lvbnMgb2YgaW5qZWN0ZWQKKyAgKiAgICAgICAgICAgICAgICBncm91cCwgdXNpbmcgMiBwb3NzaWJsZSBtb2RlczogcG9sbGluZywgaW50ZXJydXB0aW9uLgorICAqICAgICAgICAgICAgICsrIE11bHRpbW9kZSBmZWF0dXJlIChhdmFpbGFibGUgb24gZGV2aWNlcyB3aXRoIDIgQURDcyBvciBtb3JlKQorICAqICAgICAgICAgICAgICsrIENhbGlicmF0aW9uIChBREMgYXV0b21hdGljIHNlbGYtY2FsaWJyYXRpb24pCisgICogICAgICAgICAgICsgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgICArKyBDaGFubmVscyBjb25maWd1cmF0aW9uIG9uIGluamVjdGVkIGdyb3VwCisgICogICAgICAgICAgT3RoZXIgZnVuY3Rpb25zIChnZW5lcmljIGZ1bmN0aW9ucykgYXJlIGF2YWlsYWJsZSBpbiBmaWxlIAorICAqICAgICAgICAgICJzdG0zMmYzeHhfaGFsX2FkYy5jIi4KKyAgKiAgICAgICAgIAorICBAdmVyYmF0aW0KKyAgWy4uXSAKKyAgKEApIFNlY3Rpb25zICJBREMgcGVyaXBoZXJhbCBmZWF0dXJlcyIgYW5kICJIb3cgdG8gdXNlIHRoaXMgZHJpdmVyIiBhcmUKKyAgICAgIGF2YWlsYWJsZSBpbiBmaWxlIG9mIGdlbmVyaWMgZnVuY3Rpb25zICJzdG0zMmYzeHhfaGFsX2FkYy5jIi4KKyAgWy4uXQorICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDRXggQURDRXgKKyAgKiBAYnJpZWYgQURDIEV4dGVuZGVkIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9BRENfTU9EVUxFX0VOQUJMRUQKKyAgICAKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBBRENFeF9Qcml2YXRlX0NvbnN0YW50cyBBRENFeCBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKyAgLyogRml4ZWQgdGltZW91dCB2YWx1ZXMgZm9yIEFEQyBjYWxpYnJhdGlvbiwgZW5hYmxlIHNldHRsaW5nIHRpbWUsIGRpc2FibGUgICovCisgIC8qIHNldHRsaW5nIHRpbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBWYWx1ZXMgZGVmaW5lZCB0byBiZSBoaWdoZXIgdGhhbiB3b3JzdCBjYXNlczogbG93IGNsb2NrIGZyZXF1ZW5jeSwgICAgICAgKi8KKyAgLyogbWF4aW11bSBwcmVzY2FsZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEV4IG9mIHByb2ZpbGUgbG93IGZyZXF1ZW5jeSA6IENsb2NrIHNvdXJjZSBhdCAwLjUgTUh6LCBBREMgY2xvY2sgICAgICAgICAqLworICAvKiBwcmVzY2FsZXIgMjU2IChkZXZpY2VzIFNUTTMyRjMweHgpLCBzYW1wbGluZyB0aW1lIDcuNSBBREMgY2xvY2sgY3ljbGVzLCAgKi8KKyAgLyogcmVzb2x1dGlvbiAxMiBiaXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFVuaXQ6IG1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAjZGVmaW5lIEFEQ19DQUxJQlJBVElPTl9USU1FT1VUICAgICAgICAgKCAxMFUpCisgICNkZWZpbmUgQURDX0VOQUJMRV9USU1FT1VUICAgICAgICAgICAgICAoICAyVSkKKyAgI2RlZmluZSBBRENfRElTQUJMRV9USU1FT1VUICAgICAgICAgICAgICggIDJVKQorICAjZGVmaW5lIEFEQ19TVE9QX0NPTlZFUlNJT05fVElNRU9VVCAgICAgKCAxMVUpCisKKyAgLyogVGltZW91dCB0byB3YWl0IGZvciBjdXJyZW50IGNvbnZlcnNpb24gb24gZ29pbmcgdG8gYmUgY29tcGxldGVkLiAgICAgICAgICovCisgIC8qIFRpbWVvdXQgZml4ZWQgdG8gd29yc3QgY2FzZSwgZm9yIDEgY2hhbm5lbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIC0gbWF4aW11bSBzYW1wbGluZyB0aW1lICg2MDEuNSBhZGNfY2xrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAtIEFEQyByZXNvbHV0aW9uIChUc2FyIDEyIGJpdHM9IDEyLjUgYWRjX2NsaykgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgLSBBREMgY2xvY2sgKGZyb20gUExMIHdpdGggcHJlc2NhbGVyIDI1NiAoZGV2aWNlcyBTVE0zMkYzMHh4KSkgICAgICAgICAqLworICAvKiBVbml0OiBjeWNsZXMgb2YgQ1BVIGNsb2NrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgI2RlZmluZSBBRENfQ09OVkVSU0lPTl9USU1FX01BWF9DUFVfQ1lDTEVTICggMTU2OTI4VSkKKyAgICAKKyAgLyogRGVsYXkgZm9yIEFEQyBzdGFiaWxpemF0aW9uIHRpbWUgKEFEQyB2b2x0YWdlIHJlZ3VsYXRvciBzdGFydC11cCB0aW1lKSAgICovCisgIC8qIE1heGltdW0gZGVsYXkgaXMgMTB1cyAocmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgcGFyYW0uIFRBRENWUkVHX1NUVVApLiAqLworICAvKiBVbml0OiB1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgI2RlZmluZSBBRENfU1RBQl9ERUxBWV9VUyAgICAgICAgICAgICAgICggMTBVKQorICAgIAorICAvKiBEZWxheSBmb3IgdGVtcGVyYXR1cmUgc2Vuc29yIHN0YWJpbGl6YXRpb24gdGltZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTWF4aW11bSBkZWxheSBpcyAxMHVzIChyZWZlciBkZXZpY2UgZGF0YXNoZWV0LCBwYXJhbWV0ZXIgdFNUQVJUKS4gICAgICAgICovCisgIC8qIFVuaXQ6IHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAjZGVmaW5lIEFEQ19URU1QU0VOU09SX0RFTEFZX1VTICAgICAgICAgKCAxMFUpCisgICAgCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisgIC8qIFRpbWVvdXQgdmFsdWVzIGZvciBBREMgZW5hYmxlIGFuZCBkaXNhYmxlIHNldHRsaW5nIHRpbWUuICAgICAgICAgICAgICAgICAqLworICAvKiBWYWx1ZXMgZGVmaW5lZCB0byBiZSBoaWdoZXIgdGhhbiB3b3JzdCBjYXNlczogbG93IGNsb2NrcyBmcmVxLCAgICAgICAgICAgKi8KKyAgLyogbWF4aW11bSBwcmVzY2FsZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEV4IG9mIHByb2ZpbGUgbG93IGZyZXF1ZW5jeSA6IENsb2NrIHNvdXJjZSBhdCAwLjEgTUh6LCBBREMgY2xvY2sgICAgICAgICAqLworICAvKiBwcmVzY2FsZXIgNFUsIHNhbXBsaW5nIHRpbWUgMTIuNSBBREMgY2xvY2sgY3ljbGVzLCByZXNvbHV0aW9uIDEyIGJpdHMuICAgICovCisgIC8qIFVuaXQ6IG1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAjZGVmaW5lIEFEQ19FTkFCTEVfVElNRU9VVCAgICAgICAgICAgICAgKCAyVSkKKyAgI2RlZmluZSBBRENfRElTQUJMRV9USU1FT1VUICAgICAgICAgICAgICggMlUpCisKKyAgLyogRGVsYXkgZm9yIEFEQyBjYWxpYnJhdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEhhcmR3YXJlIHByZXJlcXVpc2l0ZSBiZWZvcmUgc3RhcnRpbmcgYSBjYWxpYnJhdGlvbjogdGhlIEFEQyBtdXN0IGhhdmUgICAqLworICAvKiBiZWVuIGluIHBvd2VyLW9uIHN0YXRlIGZvciBhdCBsZWFzdCB0d28gQURDIGNsb2NrIGN5Y2xlcy4gICAgICAgICAgICAgICAgKi8KKyAgLyogVW5pdDogQURDIGNsb2NrIGN5Y2xlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICNkZWZpbmUgQURDX1BSRUNBTElCUkFUSU9OX0RFTEFZX0FEQ0NMT0NLQ1lDTEVTICAgICAgICggMlUpCisKKyAgLyogVGltZW91dCB2YWx1ZSBmb3IgQURDIGNhbGlicmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFZhbHVlIGRlZmluZWQgdG8gYmUgaGlnaGVyIHRoYW4gd29yc3QgY2FzZXM6IGxvdyBjbG9ja3MgZnJlcSwgICAgICAgICAgICAqLworICAvKiBtYXhpbXVtIHByZXNjYWxlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRXggb2YgcHJvZmlsZSBsb3cgZnJlcXVlbmN5IDogQ2xvY2sgc291cmNlIGF0IDAuMSBNSHosIEFEQyBjbG9jayAgICAgICAgICovCisgIC8qIHByZXNjYWxlciA0VSwgc2FtcGxpbmcgdGltZSAxMi41IEFEQyBjbG9jayBjeWNsZXMsIHJlc29sdXRpb24gMTIgYml0cy4gICAgKi8KKyAgLyogVW5pdDogbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICNkZWZpbmUgQURDX0NBTElCUkFUSU9OX1RJTUVPVVQgICAgICAgICAoIDEwVSkKKworICAvKiBEZWxheSBmb3IgQURDIHN0YWJpbGl6YXRpb24gdGltZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTWF4aW11bSBkZWxheSBpcyAxdXMgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQsIHBhcmFtZXRlciB0U1RBQikuICAgICAgICovCisgIC8qIFVuaXQ6IHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAjZGVmaW5lIEFEQ19TVEFCX0RFTEFZX1VTICAgICAgICAgICAgICAgKCAxVSkKKworICAvKiBEZWxheSBmb3IgdGVtcGVyYXR1cmUgc2Vuc29yIHN0YWJpbGl6YXRpb24gdGltZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTWF4aW11bSBkZWxheSBpcyAxMHVzIChyZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCBwYXJhbWV0ZXIgdFNUQVJUKS4gICAgICovCisgIC8qIFVuaXQ6IHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAjZGVmaW5lIEFEQ19URU1QU0VOU09SX0RFTEFZX1VTICAgICAgICAgKCAxMFUpCisKKyAgLyogTWF4aW11bSBudW1iZXIgb2YgQ1BVIGN5Y2xlcyBjb3JyZXNwb25kaW5nIHRvIDEgQURDIGN5Y2xlICAgICAgICAgICAgICAgICovCisgIC8qIFZhbHVlIGZpeGVkIHRvIHdvcnN0IGNhc2U6IGNsb2NrIHByZXNjYWxlcnMgc2xvd2luZyBkb3duIEFEQyBjbG9jayB0byAgICAqLworICAvKiBtaW5pbXVtIGZyZXF1ZW5jeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAtIEFIQiBwcmVzY2FsZXI6IDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgLSBBREMgcHJlc2NhbGVyOiA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBVbml0OiBjeWNsZXMgb2YgQ1BVIGNsb2NrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgI2RlZmluZSBBRENfQ1lDTEVfV09SU1RfQ0FTRV9DUFVfQ1lDTEVTICggMTI4VSkKKworICAvKiBBREMgY29udmVyc2lvbiBjeWNsZXMgKHVuaXQ6IEFEQyBjbG9jayBjeWNsZXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogKHNlbGVjdGVkIHNhbXBsaW5nIHRpbWUgKyBjb252ZXJzaW9uIHRpbWUgb2YgMTIuNSBBREMgY2xvY2sgY3ljbGVzLCB3aXRoICovCisgIC8qIHJlc29sdXRpb24gMTIgYml0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAjZGVmaW5lIEFEQ19DT05WRVJTSU9OQ0xPQ0tDWUNMRVNfU0FNUExFVElNRV8xQ1lDTEU1ICAgICggMTRVKQorICAjZGVmaW5lIEFEQ19DT05WRVJTSU9OQ0xPQ0tDWUNMRVNfU0FNUExFVElNRV83Q1lDTEVTNSAgICggMjBVKQorICAjZGVmaW5lIEFEQ19DT05WRVJTSU9OQ0xPQ0tDWUNMRVNfU0FNUExFVElNRV8xM0NZQ0xFUzUgICggMjZVKQorICAjZGVmaW5lIEFEQ19DT05WRVJTSU9OQ0xPQ0tDWUNMRVNfU0FNUExFVElNRV8yOENZQ0xFUzUgICggNDFVKQorICAjZGVmaW5lIEFEQ19DT05WRVJTSU9OQ0xPQ0tDWUNMRVNfU0FNUExFVElNRV80MUNZQ0xFUzUgICggNTRVKQorICAjZGVmaW5lIEFEQ19DT05WRVJTSU9OQ0xPQ0tDWUNMRVNfU0FNUExFVElNRV81NUNZQ0xFUzUgICggNjhVKQorICAjZGVmaW5lIEFEQ19DT05WRVJTSU9OQ0xPQ0tDWUNMRVNfU0FNUExFVElNRV83MUNZQ0xFUzUgICggODRVKQorICAjZGVmaW5lIEFEQ19DT05WRVJTSU9OQ0xPQ0tDWUNMRVNfU0FNUExFVElNRV8yMzlDWUNMRVM1ICgyNTJVKQorI2VuZGlmIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBBRENfRW5hYmxlKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBBRENfRGlzYWJsZShBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQURDX0NvbnZlcnNpb25TdG9wKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCBDb252ZXJzaW9uR3JvdXApOworI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEFEQ19FbmFibGUoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEFEQ19Db252ZXJzaW9uU3RvcF9EaXNhYmxlKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworCitzdGF0aWMgdm9pZCBBRENfRE1BQ29udkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgQURDX0RNQUhhbGZDb252Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBBRENfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEFEQ0V4X0V4cG9ydGVkX0Z1bmN0aW9ucyBBRENFeCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEFEQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgQURDRXggSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBBREMgRXh0ZW5kZWQgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbSAgICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlIEFEQy4gCisgICAgICAoKykgRGUtaW5pdGlhbGl6ZSB0aGUgQURDLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIEFEQyBwZXJpcGhlcmFsIGFuZCByZWd1bGFyIGdyb3VwIGFjY29yZGluZyB0byAgCisgICogICAgICAgICBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiBzdHJ1Y3R1cmUgIkFEQ19Jbml0VHlwZURlZiIuCisgICogQG5vdGUgICBBcyBwcmVyZXF1aXNpdGUsIEFEQyBjbG9jayBtdXN0IGJlIGNvbmZpZ3VyZWQgYXQgUkNDIHRvcCBsZXZlbAorICAqICAgICAgICAgZGVwZW5kaW5nIG9uIHBvc3NpYmxlIGNsb2NrIHNvdXJjZXM6IEFIQiBjbG9jayBvciBQTEwgY2xvY2suCisgICogICAgICAgICBTZWUgY29tbWVudGVkIGV4YW1wbGUgY29kZSBiZWxvdyB0aGF0IGNhbiBiZSBjb3BpZWQgYW5kIHVuY29tbWVudGVkIAorICAqICAgICAgICAgaW50byBIQUxfQURDX01zcEluaXQoKS4KKyAgKiBAbm90ZSAgIFBvc3NpYmlsaXR5IHRvIHVwZGF0ZSBwYXJhbWV0ZXJzIG9uIHRoZSBmbHk6CisgICogICAgICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBBREMgTVNQIChIQUxfQURDX01zcEluaXQoKSkgb25seSB3aGVuCisgICogICAgICAgICBjb21pbmcgZnJvbSBBREMgc3RhdGUgcmVzZXQuIEZvbGxvd2luZyBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIGNhbgorICAqICAgICAgICAgYmUgdXNlZCB0byByZWNvbmZpZ3VyZSBzb21lIHBhcmFtZXRlcnMgb2YgQURDX0luaXRUeXBlRGVmICAKKyAgKiAgICAgICAgIHN0cnVjdHVyZSBvbiB0aGUgZmx5LCB3aXRob3V0IG1vZGlmeWluZyBNU1AgY29uZmlndXJhdGlvbi4gSWYgQURDICAKKyAgKiAgICAgICAgIE1TUCBoYXMgdG8gYmUgbW9kaWZpZWQgYWdhaW4sIEhBTF9BRENfRGVJbml0KCkgbXVzdCBiZSBjYWxsZWQKKyAgKiAgICAgICAgIGJlZm9yZSBIQUxfQURDX0luaXQoKS4KKyAgKiAgICAgICAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgaXMgY29uZGl0aW9uZWQgYnkgQURDIHN0YXRlLgorICAqICAgICAgICAgRm9yIHBhcmFtZXRlcnMgY29uc3RyYWludHMsIHNlZSBjb21tZW50cyBvZiBzdHJ1Y3R1cmUgCisgICogICAgICAgICAiQURDX0luaXRUeXBlRGVmIi4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgQURDIHdpdGhpbiAyIHNjb3Blczogc2NvcGUgb2YgZW50aXJlIAorICAqICAgICAgICAgQURDIGFuZCBzY29wZSBvZiByZWd1bGFyIGdyb3VwLiBGb3IgcGFyYW1ldGVycyBkZXRhaWxzLCBzZWUgY29tbWVudHMgCisgICogICAgICAgICBvZiBzdHJ1Y3R1cmUgIkFEQ19Jbml0VHlwZURlZiIuCisgICogQG5vdGUgICBGb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDczogcGFyYW1ldGVycyByZWxhdGVkIHRvIGNvbW1vbiBBREMgCisgICogICAgICAgICByZWdpc3RlcnMgKEFEQyBjbG9jayBtb2RlKSBhcmUgc2V0IG9ubHkgaWYgYWxsIEFEQ3Mgc2hhcmluZyB0aGUKKyAgKiAgICAgICAgIHNhbWUgY29tbW9uIGdyb3VwIGFyZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCB0aGVzZSBjb21tb24gcGFyYW1ldGVycyBzZXR0aW5nIGFyZSAgCisgICogICAgICAgICBieXBhc3NlZCB3aXRob3V0IGVycm9yIHJlcG9ydGluZzogaXQgY2FuIGJlIHRoZSBpbnRlbmRlZCBiZWhhdmlvdXIgaW4KKyAgKiAgICAgICAgIGNhc2Ugb2YgdXBkYXRlIG9mIGEgcGFyYW1ldGVyIG9mIEFEQ19Jbml0VHlwZURlZiBvbiB0aGUgZmx5LAorICAqICAgICAgICAgd2l0aG91dCAgZGlzYWJsaW5nIHRoZSBvdGhlciBBRENzIHNoYXJpbmcgdGhlIHNhbWUgY29tbW9uIGdyb3VwLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX0luaXQoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOworICBBRENfQ29tbW9uX1R5cGVEZWYgKnRtcEFEQ19Db21tb247CisgIEFEQ19IYW5kbGVUeXBlRGVmIHRtcGhhZGNTaGFyaW5nU2FtZUNvbW1vblJlZ2lzdGVyOworICB1aW50MzJfdCB0bXBDRkdSID0gMFU7CisgIF9fSU8gdWludDMyX3Qgd2FpdF9sb29wX2luZGV4ID0gMFU7CisgIAorICAvKiBDaGVjayBBREMgaGFuZGxlICovCisgIGlmKGhhZGMgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfQ0xPQ0tQUkVTQ0FMRVIoaGFkYy0+SW5pdC5DbG9ja1ByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX1JFU09MVVRJT04oaGFkYy0+SW5pdC5SZXNvbHV0aW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfREFUQV9BTElHTihoYWRjLT5Jbml0LkRhdGFBbGlnbikpOyAKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19TQ0FOX01PREUoaGFkYy0+SW5pdC5TY2FuQ29udk1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoaGFkYy0+SW5pdC5Db250aW51b3VzQ29udk1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19FWFRUUklHX0VER0UoaGFkYy0+SW5pdC5FeHRlcm5hbFRyaWdDb252RWRnZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0VYVFRSSUcoaGFkYy0+SW5pdC5FeHRlcm5hbFRyaWdDb252KSk7CisgIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKGhhZGMtPkluaXQuRE1BQ29udGludW91c1JlcXVlc3RzKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfRU9DX1NFTEVDVElPTihoYWRjLT5Jbml0LkVPQ1NlbGVjdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX09WRVJSVU4oaGFkYy0+SW5pdC5PdmVycnVuKSk7CisgIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKGhhZGMtPkluaXQuTG93UG93ZXJBdXRvV2FpdCkpOworICAKKyAgaWYoaGFkYy0+SW5pdC5TY2FuQ29udk1vZGUgIT0gQURDX1NDQU5fRElTQUJMRSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19BRENfUkVHVUxBUl9OQl9DT05WKGhhZGMtPkluaXQuTmJyT2ZDb252ZXJzaW9uKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoaGFkYy0+SW5pdC5EaXNjb250aW51b3VzQ29udk1vZGUpKTsKKyAgICBpZihoYWRjLT5Jbml0LkRpc2NvbnRpbnVvdXNDb252TW9kZSAhPSBESVNBQkxFKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19BRENfUkVHVUxBUl9ESVNDT05UX05VTUJFUihoYWRjLT5Jbml0Lk5ick9mRGlzY0NvbnZlcnNpb24pKTsKKyAgICB9CisgIH0KKyAgICAKKyAgLyogQ29uZmlndXJhdGlvbiBvZiBBREMgY29yZSBwYXJhbWV0ZXJzIGFuZCBBREMgTVNQIHJlbGF0ZWQgcGFyYW1ldGVycyAqLworICBpZiAoSEFMX0lTX0JJVF9DTFIoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpKQorICB7CisgICAgLyogQXMgcHJlcmVxdWlzaXRlLCBpbnRvIEhBTF9BRENfTXNwSW5pdCgpLCBBREMgY2xvY2sgbXVzdCBiZSBjb25maWd1cmVkICAqLworICAgIC8qIGF0IFJDQyB0b3AgbGV2ZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBSZWZlciB0byBoZWFkZXIgb2YgdGhpcyBmaWxlIGZvciBtb3JlIGRldGFpbHMgb24gY2xvY2sgZW5hYmxpbmcgICAgICAgICovCisgICAgLyogcHJvY2VkdXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIAorICAgIC8qIEFjdGlvbnMgcGVyZm9ybWVkIG9ubHkgaWYgQURDIGlzIGNvbWluZyBmcm9tIHN0YXRlIHJlc2V0OiAgICAgICAgICAgICAgKi8KKyAgICAvKiAtIEluaXRpYWxpemF0aW9uIG9mIEFEQyBNU1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogLSBBREMgdm9sdGFnZSByZWd1bGF0b3IgZW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmIChoYWRjLT5TdGF0ZSA9PSBIQUxfQURDX1NUQVRFX1JFU0VUKQorICAgIHsKKyAgICAgIC8qIEluaXRpYWxpemUgQURDIGVycm9yIGNvZGUgKi8KKyAgICAgIEFEQ19DTEVBUl9FUlJPUkNPREUoaGFkYyk7CisgICAgICAKKyAgICAgIC8qIEluaXRpYWxpemUgSEFMIEFEQyBBUEkgaW50ZXJuYWwgdmFyaWFibGVzICovCisgICAgICBoYWRjLT5JbmplY3Rpb25Db25maWcuQ2hhbm5lbENvdW50ID0gMFU7CisgICAgICBoYWRjLT5JbmplY3Rpb25Db25maWcuQ29udGV4dFF1ZXVlID0gMFU7CisgICAgICAKKyAgICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICAgIGhhZGMtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisgICAgICAKKyAgICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICAgICAgSEFMX0FEQ19Nc3BJbml0KGhhZGMpOworICAgICAgCisgICAgICAvKiBFbmFibGUgdm9sdGFnZSByZWd1bGF0b3IgKGlmIGRpc2FibGVkIGF0IHRoaXMgc3RlcCkgKi8KKyAgICAgIGlmIChIQUxfSVNfQklUX0NMUihoYWRjLT5JbnN0YW5jZS0+Q1IsIEFEQ19DUl9BRFZSRUdFTl8wKSkKKyAgICAgIHsKKyAgICAgICAgLyogTm90ZTogVGhlIHNvZnR3YXJlIG11c3Qgd2FpdCBmb3IgdGhlIHN0YXJ0dXAgdGltZSBvZiB0aGUgQURDICAgICAgICovCisgICAgICAgIC8qICAgICAgIHZvbHRhZ2UgcmVndWxhdG9yIGJlZm9yZSBsYXVuY2hpbmcgYSBjYWxpYnJhdGlvbiBvciAgICAgICAgICAqLworICAgICAgICAvKiAgICAgICBlbmFibGluZyB0aGUgQURDLiBUaGlzIHRlbXBvcml6YXRpb24gbXVzdCBiZSBpbXBsZW1lbnRlZCBieSAgKi8gCisgICAgICAgIC8qICAgICAgIHNvZnR3YXJlIGFuZCBpcyBlcXVhbCB0byAxMCB1cyBpbiB0aGUgd29yc3QgY2FzZSAgICAgICAgICAgICAqLworICAgICAgICAvKiAgICAgICBwcm9jZXNzL3RlbXBlcmF0dXJlL3Bvd2VyIHN1cHBseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgCisgICAgICAgIC8qIERpc2FibGUgdGhlIEFEQyAoaWYgbm90IGFscmVhZHkgZGlzYWJsZWQpICovCisgICAgICAgIHRtcF9oYWxfc3RhdHVzID0gQURDX0Rpc2FibGUoaGFkYyk7CisgICAgICAgIAorICAgICAgICAvKiBDaGVjayBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8KKyAgICAgICAgLyogQ29uZmlndXJhdGlvbiBvZiBBREMgcGFyYW1ldGVycyBpZiBwcmV2aW91cyBwcmVsaW1pbmFyeSBhY3Rpb25zICAgICovIAorICAgICAgICAvKiBhcmUgY29ycmVjdGx5IGNvbXBsZXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgaWYgKEhBTF9JU19CSVRfQ0xSKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKSAmJgorICAgICAgICAgICAgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kgfCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfQlVTWV9JTlRFUk5BTCk7CisgICAgICAgICAgCisgICAgICAgICAgLyogU2V0IHRoZSBpbnRlcm1lZGlhdGUgc3RhdGUgYmVmb3JlIG1vdmluZyB0aGUgQURDIHZvbHRhZ2UgICAgICAgICAqLworICAgICAgICAgIC8qIHJlZ3VsYXRvciB0byBzdGF0ZSBlbmFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkNSLCAoQURDX0NSX0FEVlJFR0VOXzEgfCBBRENfQ1JfQURWUkVHRU5fMCkpOworICAgICAgICAgIC8qIFNldCBBRFZSRUdFTiBiaXRzIHRvIDB4MDFVICovCisgICAgICAgICAgU0VUX0JJVChoYWRjLT5JbnN0YW5jZS0+Q1IsIEFEQ19DUl9BRFZSRUdFTl8wKTsKKyAgICAgICAgICAKKyAgICAgICAgICAvKiBEZWxheSBmb3IgQURDIHN0YWJpbGl6YXRpb24gdGltZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgLyogQ29tcHV0ZSBudW1iZXIgb2YgQ1BVIGN5Y2xlcyB0byB3YWl0IGZvciAqLworICAgICAgICAgIHdhaXRfbG9vcF9pbmRleCA9IChBRENfU1RBQl9ERUxBWV9VUyAqIChTeXN0ZW1Db3JlQ2xvY2sgLyAxMDAwMDAwVSkpOworICAgICAgICAgIHdoaWxlKHdhaXRfbG9vcF9pbmRleCAhPSAwVSkKKyAgICAgICAgICB7CisgICAgICAgICAgICB3YWl0X2xvb3BfaW5kZXgtLTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogVmVyaWZpY2F0aW9uIHRoYXQgQURDIHZvbHRhZ2UgcmVndWxhdG9yIGlzIGNvcnJlY3RseSBlbmFibGVkLCB3aGV0aGVyICAqLworICAgIC8qIG9yIG5vdCBBREMgaXMgY29taW5nIGZyb20gc3RhdGUgcmVzZXQgKGlmIGFueSBwb3RlbnRpYWwgcHJvYmxlbSBvZiAgICAgKi8KKyAgICAvKiBjbG9ja2luZywgdm9sdGFnZSByZWd1bGF0b3Igd291bGQgbm90IGJlIGVuYWJsZWQpLiAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKEhBTF9JU19CSVRfQ0xSKGhhZGMtPkluc3RhbmNlLT5DUiwgQURDX0NSX0FEVlJFR0VOXzApIHx8CisgICAgICAgIEhBTF9JU19CSVRfU0VUKGhhZGMtPkluc3RhbmNlLT5DUiwgQURDX0NSX0FEVlJFR0VOXzEpICAgKQorICAgIHsKKyAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX0JVU1lfSU5URVJOQUwsCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgIAorICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIEFEQyBJUCBpbnRlcm5hbCBlcnJvciAqLworICAgICAgU0VUX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfSU5URVJOQUwpOworICAgICAgCisgICAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKworICAKKyAgLyogQ29uZmlndXJhdGlvbiBvZiBBREMgcGFyYW1ldGVycyBpZiBwcmV2aW91cyBwcmVsaW1pbmFyeSBhY3Rpb25zIGFyZSAgICAgICovIAorICAvKiBjb3JyZWN0bHkgY29tcGxldGVkIGFuZCBpZiB0aGVyZSBpcyBubyBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIHJlZ3VsYXIgICAgKi8KKyAgLyogZ3JvdXAgKEFEQyBtYXkgYWxyZWFkeSBiZSBlbmFibGVkIGF0IHRoaXMgcG9pbnQgaWYgSEFMX0FEQ19Jbml0KCkgaXMgICAgICovCisgIC8qIGNhbGxlZCB0byB1cGRhdGUgYSBwYXJhbWV0ZXIgb24gdGhlIGZseSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZiAoSEFMX0lTX0JJVF9DTFIoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpICYmCisgICAgICAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgIChBRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX1JFR1VMQVIoaGFkYykgPT0gUkVTRVQpICAgICAgICAgICkKKyAgeworICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19CVVNZLAorICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfQlVTWV9JTlRFUk5BTCk7CisgICAgCisgICAgLyogQ29uZmlndXJhdGlvbiBvZiBjb21tb24gQURDIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIAorICAgIC8qIFBvaW50ZXIgdG8gdGhlIGNvbW1vbiBjb250cm9sIHJlZ2lzdGVyIHRvIHdoaWNoIGlzIGJlbG9uZ2luZyBoYWRjICAgICAgKi8KKyAgICAvKiAoRGVwZW5kaW5nIG9uIFNUTTMyRjMgcHJvZHVjdCwgdGhlcmUgbWF5IGJlIHVwIHRvIDQgQURDIGFuZCAyIGNvbW1vbiAgICovCisgICAgLyogY29udHJvbCByZWdpc3RlcnMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHRtcEFEQ19Db21tb24gPSBBRENfQ09NTU9OX1JFR0lTVEVSKGhhZGMpOworICAgIAorICAgIC8qIFNldCBoYW5kbGUgb2YgdGhlIG90aGVyIEFEQyBzaGFyaW5nIHRoZSBzYW1lIGNvbW1vbiByZWdpc3RlciAgICAgICAgICAgKi8KKyAgICBBRENfQ09NTU9OX0FEQ19PVEhFUihoYWRjLCAmdG1waGFkY1NoYXJpbmdTYW1lQ29tbW9uUmVnaXN0ZXIpOworICAgIAorICAgIAorICAgIC8qIFBhcmFtZXRlcnMgdXBkYXRlIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHVwZGF0ZWQgb25seSB3aGVuIEFEQyBpcyBkaXNhYmxlZDogICAgICAgICAgICAgICovCisgICAgLyogIC0gTXVsdGltb2RlIGNsb2NrIGNvbmZpZ3VyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmICgoQURDX0lTX0VOQUJMRShoYWRjKSA9PSBSRVNFVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICgodG1waGFkY1NoYXJpbmdTYW1lQ29tbW9uUmVnaXN0ZXIuSW5zdGFuY2UgPT0gTlVMTCkgICAgICAgICB8fAorICAgICAgICAgKEFEQ19JU19FTkFCTEUoJnRtcGhhZGNTaGFyaW5nU2FtZUNvbW1vblJlZ2lzdGVyKSA9PSBSRVNFVCkgICApICAgKQorICAgIHsKKyAgICAgIC8qIFJlc2V0IGNvbmZpZ3VyYXRpb24gb2YgQURDIGNvbW1vbiByZWdpc3RlciBDQ1I6ICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAgIC0gQURDIGNsb2NrIG1vZGU6IENLTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogU29tZSBwYXJhbWV0ZXJzIG9mIHRoaXMgcmVnaXN0ZXIgYXJlIG5vdCByZXNldCwgc2luY2UgdGhleSBhcmUgc2V0ICAgKi8KKyAgICAgIC8qIGJ5IG90aGVyIGZ1bmN0aW9ucyBhbmQgbXVzdCBiZSBrZXB0IGluIGNhc2Ugb2YgdXNhZ2Ugb2YgdGhpcyAgICAgICAgICovCisgICAgICAvKiBmdW5jdGlvbiBvbiB0aGUgZmx5ICh1cGRhdGUgb2YgYSBwYXJhbWV0ZXIgb2YgQURDX0luaXRUeXBlRGVmICAgICAgICAqLworICAgICAgLyogd2l0aG91dCBuZWVkaW5nIHRvIHJlY29uZmlndXJlIGFsbCBvdGhlciBBREMgZ3JvdXBzL2NoYW5uZWxzICAgICAgICAgKi8KKyAgICAgIC8qIHBhcmFtZXRlcnMpOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAgIC0gbXVsdGltb2RlIHJlbGF0ZWQgcGFyYW1ldGVyczogTURNQSwgRE1BQ0ZHLCBERUxBWSwgTVVMVEkgKHNldCAgICAqLworICAgICAgLyogICAgIGludG8gSEFMX0FEQ0V4X011bHRpTW9kZUNvbmZpZ0NoYW5uZWwoKSApICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qICAgLSBpbnRlcm5hbCBtZWFzdXJlbWVudCBwYXRoczogVmJhdCwgdGVtcGVyYXR1cmUgc2Vuc29yLCBWcmVmICAgICAgICovCisgICAgICAvKiAgICAgKHNldCBpbnRvIEhBTF9BRENfQ29uZmlnQ2hhbm5lbCgpIG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogICAgIEhBTF9BRENFeF9JbmplY3RlZENvbmZpZ0NoYW5uZWwoKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgCisgICAgICBNT0RJRllfUkVHKHRtcEFEQ19Db21tb24tPkNDUiAgICAgICAsCisgICAgICAgICAgICAgICAgIEFEQ19DQ1JfQ0tNT0RFICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIGhhZGMtPkluaXQuQ2xvY2tQcmVzY2FsZXIgKTsKKyAgICB9CisgICAgICAKKyAgICAgIAorICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgQURDOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSByZXNvbHV0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gZGF0YSBhbGlnbm1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIGV4dGVybmFsIHRyaWdnZXIgdG8gc3RhcnQgY29udmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBleHRlcm5hbCB0cmlnZ2VyIHBvbGFyaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gY29udGludW91cyBjb252ZXJzaW9uIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIG92ZXJydW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBkaXNjb250aW51b3VzIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgU0VUX0JJVCh0bXBDRkdSLCBBRENfQ0ZHUl9DT05USU5VT1VTKGhhZGMtPkluaXQuQ29udGludW91c0NvbnZNb2RlKSB8CisgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9PVkVSUlVOKGhhZGMtPkluaXQuT3ZlcnJ1bikgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICBoYWRjLT5Jbml0LkRhdGFBbGlnbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICBoYWRjLT5Jbml0LlJlc29sdXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAvKiBFbmFibGUgZGlzY29udGludW91cyBtb2RlIG9ubHkgaWYgY29udGludW91cyBtb2RlIGlzIGRpc2FibGVkICovCisgICAgaWYgKGhhZGMtPkluaXQuRGlzY29udGludW91c0NvbnZNb2RlID09IEVOQUJMRSkKKyAgICB7CisgICAgICBpZiAoaGFkYy0+SW5pdC5Db250aW51b3VzQ29udk1vZGUgPT0gRElTQUJMRSkKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBBREMgcmVndWxhciBkaXNjb250aW51b3VzIG1vZGUgKi8KKyAgICAgICAgLyogU2V0IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgdG8gYmUgY29udmVydGVkIGluIGRpc2NvbnRpbnVvdXMgbW9kZSAqLworICAgICAgICBTRVRfQklUKHRtcENGR1IsIEFEQ19DRkdSX0RJU0NFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0RJU0NPTlRJTlVPVVNfTlVNKGhhZGMtPkluaXQuTmJyT2ZEaXNjQ29udmVyc2lvbikgICk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIEFEQyByZWd1bGFyIGdyb3VwIGRpc2NvbnRpbnVvdXMgd2FzIGludGVuZGVkIHRvIGJlIGVuYWJsZWQsICAgICAgICAqLworICAgICAgICAvKiBidXQgQURDIHJlZ3VsYXIgZ3JvdXAgbW9kZXMgY29udGludW91cyBhbmQgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgKi8KKyAgICAgICAgLyogY2Fubm90IGJlIGVuYWJsZWQgc2ltdWx0YW5lb3VzbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIAorICAgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfQlVTWV9JTlRFUk5BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOworICAgICAgICAKKyAgICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIEFEQyBJUCBpbnRlcm5hbCBlcnJvciAqLworICAgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIEVuYWJsZSBleHRlcm5hbCB0cmlnZ2VyIGlmIHRyaWdnZXIgc2VsZWN0aW9uIGlzIGRpZmZlcmVudCBvZiBzb2Z0d2FyZSAgKi8KKyAgICAvKiBzdGFydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogTm90ZTogVGhpcyBjb25maWd1cmF0aW9uIGtlZXBzIHRoZSBoYXJkd2FyZSBmZWF0dXJlIG9mIHBhcmFtZXRlciAgICAgICAqLworICAgIC8qICAgICAgIEV4dGVybmFsVHJpZ0NvbnZFZGdlICJ0cmlnZ2VyIGVkZ2Ugbm9uZSIgZXF1aXZhbGVudCB0byAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICBzb2Z0d2FyZSBzdGFydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKGhhZGMtPkluaXQuRXh0ZXJuYWxUcmlnQ29udiAhPSBBRENfU09GVFdBUkVfU1RBUlQpCisgICAgeworICAgICAgU0VUX0JJVCh0bXBDRkdSLCBBRENfQ0ZHUl9FWFRTRUxfU0VUKGhhZGMsIGhhZGMtPkluaXQuRXh0ZXJuYWxUcmlnQ29udikgfAorICAgICAgICAgICAgICAgICAgICAgICBoYWRjLT5Jbml0LkV4dGVybmFsVHJpZ0NvbnZFZGdlICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgfQorICAgIAorICAgIC8qIFBhcmFtZXRlcnMgdXBkYXRlIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHVwZGF0ZWQgd2hlbiBBREMgaXMgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0ICovCisgICAgLyogY29udmVyc2lvbiBvbiBnb2luZyBvbiByZWd1bGFyIGFuZCBpbmplY3RlZCBncm91cHM6ICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIERNQSBjb250aW51b3VzIHJlcXVlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBMb3dQb3dlckF1dG9XYWl0IGZlYXR1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKEFEQ19JU19DT05WRVJTSU9OX09OR09JTkdfUkVHVUxBUl9JTkpFQ1RFRChoYWRjKSA9PSBSRVNFVCkKKyAgICB7CisgICAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0FVVERMWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0RNQUNGRyAgKTsKKyAgICAgIAorICAgICAgU0VUX0JJVCh0bXBDRkdSLCBBRENfQ0ZHUl9BVVRPV0FJVChoYWRjLT5Jbml0Lkxvd1Bvd2VyQXV0b1dhaXQpICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfRE1BQ09OVFJFUShoYWRjLT5Jbml0LkRNQUNvbnRpbnVvdXNSZXF1ZXN0cykgKTsKKyAgICB9CisgICAgCisgICAgLyogVXBkYXRlIEFEQyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIHdpdGggcHJldmlvdXMgc2V0dGluZ3MgKi8KKyAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5DRkdSLAorICAgICAgICAgICAgICAgQURDX0NGR1JfRElTQ05VTSB8CisgICAgICAgICAgICAgICBBRENfQ0ZHUl9ESVNDRU4gIHwKKyAgICAgICAgICAgICAgIEFEQ19DRkdSX0NPTlQgICAgfAorICAgICAgICAgICAgICAgQURDX0NGR1JfT1ZSTU9EICB8CisgICAgICAgICAgICAgICBBRENfQ0ZHUl9FWFRTRUwgIHwKKyAgICAgICAgICAgICAgIEFEQ19DRkdSX0VYVEVOICAgfAorICAgICAgICAgICAgICAgQURDX0NGR1JfQUxJR04gICB8CisgICAgICAgICAgICAgICBBRENfQ0ZHUl9SRVMgICAgICAgICwKKyAgICAgICAgICAgICAgIHRtcENGR1IgICAgICAgICAgICAgICk7CisgICAgCisgICAgCisgICAgLyogQ29uZmlndXJhdGlvbiBvZiByZWd1bGFyIGdyb3VwIHNlcXVlbmNlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIC0gaWYgc2NhbiBtb2RlIGlzIGRpc2FibGVkLCByZWd1bGFyIGNoYW5uZWxzIHNlcXVlbmNlIGxlbmd0aCBpcyBzZXQgdG8gKi8KKyAgICAvKiAgIDB4MDA6IDEgY2hhbm5lbCBjb252ZXJ0ZWQgKGNoYW5uZWwgb24gcmVndWxhciByYW5rIDFVKSAgICAgICAgICAgICAgICAqLworICAgIC8qICAgUGFyYW1ldGVyICJOYnJPZkNvbnZlcnNpb24iIGlzIGRpc2NhcmRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgIE5vdGU6IFNjYW4gbW9kZSBpcyBub3QgcHJlc2VudCBieSBoYXJkd2FyZSBvbiB0aGlzIGRldmljZSwgYnV0ICAgICAgICovCisgICAgLyogICBlbXVsYXRlZCBieSBzb2Z0d2FyZSBmb3IgYWxpZ25tZW50IG92ZXIgYWxsIFNUTTMyIGRldmljZXMuICAgICAgICAgICAqLworICAgIC8qIC0gaWYgc2NhbiBtb2RlIGlzIGVuYWJsZWQsIHJlZ3VsYXIgY2hhbm5lbHMgc2VxdWVuY2UgbGVuZ3RoIGlzIHNldCB0byAgKi8KKyAgICAvKiAgIHBhcmFtZXRlciAiTmJyT2ZDb252ZXJzaW9uIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgCisgICAgaWYgKGhhZGMtPkluaXQuU2NhbkNvbnZNb2RlID09IEFEQ19TQ0FOX0VOQUJMRSkKKyAgICB7CisgICAgICAvKiBTZXQgbnVtYmVyIG9mIHJhbmtzIGluIHJlZ3VsYXIgZ3JvdXAgc2VxdWVuY2VyICovICAgICAKKyAgICAgIE1PRElGWV9SRUcoaGFkYy0+SW5zdGFuY2UtPlNRUjEgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIEFEQ19TUVIxX0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAoaGFkYy0+SW5pdC5OYnJPZkNvbnZlcnNpb24gLSAodWludDhfdCkxVSkgKTsgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5TUVIxLCBBRENfU1FSMV9MKTsKKyAgICB9CisgICAgCisgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIG5vbmUgKi8KKyAgICBBRENfQ0xFQVJfRVJST1JDT0RFKGhhZGMpOworICAgIAorICAgIC8qIFNldCB0aGUgQURDIHN0YXRlICovCisgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9CVVNZX0lOVEVSTkFMLAorICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfQlVTWV9JTlRFUk5BTCwKKyAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAKKyAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9FUlJPUjsgCisgIH0KKyAgCisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIEFEQyBwZXJpcGhlcmFsIGFuZCByZWd1bGFyIGdyb3VwIGFjY29yZGluZyB0byAgCisgICogICAgICAgICBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiBzdHJ1Y3R1cmUgIkFEQ19Jbml0VHlwZURlZiIuCisgICogQG5vdGUgICBBcyBwcmVyZXF1aXNpdGUsIEFEQyBjbG9jayBtdXN0IGJlIGNvbmZpZ3VyZWQgYXQgUkNDIHRvcCBsZXZlbAorICAqICAgICAgICAgKGNsb2NrIHNvdXJjZSBBUEIyKS4KKyAgKiAgICAgICAgIFNlZSBjb21tZW50ZWQgZXhhbXBsZSBjb2RlIGJlbG93IHRoYXQgY2FuIGJlIGNvcGllZCBhbmQgdW5jb21tZW50ZWQgCisgICogICAgICAgICBpbnRvIEhBTF9BRENfTXNwSW5pdCgpLgorICAqIEBub3RlICAgUG9zc2liaWxpdHkgdG8gdXBkYXRlIHBhcmFtZXRlcnMgb24gdGhlIGZseToKKyAgKiAgICAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIEFEQyBNU1AgKEhBTF9BRENfTXNwSW5pdCgpKSBvbmx5IHdoZW4KKyAgKiAgICAgICAgIGNvbWluZyBmcm9tIEFEQyBzdGF0ZSByZXNldC4gRm9sbG93aW5nIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gY2FuCisgICogICAgICAgICBiZSB1c2VkIHRvIHJlY29uZmlndXJlIHNvbWUgcGFyYW1ldGVycyBvZiBBRENfSW5pdFR5cGVEZWYgIAorICAqICAgICAgICAgc3RydWN0dXJlIG9uIHRoZSBmbHksIHdpdGhvdXQgbW9kaWZ5aW5nIE1TUCBjb25maWd1cmF0aW9uLiBJZiBBREMgIAorICAqICAgICAgICAgTVNQIGhhcyB0byBiZSBtb2RpZmllZCBhZ2FpbiwgSEFMX0FEQ19EZUluaXQoKSBtdXN0IGJlIGNhbGxlZAorICAqICAgICAgICAgYmVmb3JlIEhBTF9BRENfSW5pdCgpLgorICAqICAgICAgICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGUuCisgICogICAgICAgICBGb3IgcGFyYW1ldGVycyBjb25zdHJhaW50cywgc2VlIGNvbW1lbnRzIG9mIHN0cnVjdHVyZSAKKyAgKiAgICAgICAgICJBRENfSW5pdFR5cGVEZWYiLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSBBREMgd2l0aGluIDIgc2NvcGVzOiBzY29wZSBvZiBlbnRpcmUgCisgICogICAgICAgICBBREMgYW5kIHNjb3BlIG9mIHJlZ3VsYXIgZ3JvdXAuIEZvciBwYXJhbWV0ZXJzIGRldGFpbHMsIHNlZSBjb21tZW50cyAKKyAgKiAgICAgICAgIG9mIHN0cnVjdHVyZSAiQURDX0luaXRUeXBlRGVmIi4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19Jbml0KEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1cyA9IEhBTF9PSzsKKyAgdWludDMyX3QgdG1wX2NyMSA9IDBVOworICB1aW50MzJfdCB0bXBfY3IyID0gMFU7CisgIHVpbnQzMl90IHRtcF9zcXIxID0gMFU7CisgIAorICAvKiBDaGVjayBBREMgaGFuZGxlICovCisgIGlmKGhhZGMgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfREFUQV9BTElHTihoYWRjLT5Jbml0LkRhdGFBbGlnbikpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX1NDQU5fTU9ERShoYWRjLT5Jbml0LlNjYW5Db252TW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShoYWRjLT5Jbml0LkNvbnRpbnVvdXNDb252TW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0VYVFRSSUcoaGFkYy0+SW5pdC5FeHRlcm5hbFRyaWdDb252KSk7CisgIAorICBpZihoYWRjLT5Jbml0LlNjYW5Db252TW9kZSAhPSBBRENfU0NBTl9ESVNBQkxFKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0FEQ19SRUdVTEFSX05CX0NPTlYoaGFkYy0+SW5pdC5OYnJPZkNvbnZlcnNpb24pKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShoYWRjLT5Jbml0LkRpc2NvbnRpbnVvdXNDb252TW9kZSkpOworICAgIGlmKGhhZGMtPkluaXQuRGlzY29udGludW91c0NvbnZNb2RlICE9IERJU0FCTEUpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX0FEQ19SRUdVTEFSX0RJU0NPTlRfTlVNQkVSKGhhZGMtPkluaXQuTmJyT2ZEaXNjQ29udmVyc2lvbikpOworICAgIH0KKyAgfQorICAKKyAgLyogQXMgcHJlcmVxdWlzaXRlLCBpbnRvIEhBTF9BRENfTXNwSW5pdCgpLCBBREMgY2xvY2sgbXVzdCBiZSBjb25maWd1cmVkICAgICovCisgIC8qIGF0IFJDQyB0b3AgbGV2ZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBSZWZlciB0byBoZWFkZXIgb2YgdGhpcyBmaWxlIGZvciBtb3JlIGRldGFpbHMgb24gY2xvY2sgZW5hYmxpbmcgICAgICAgICAgKi8KKyAgLyogcHJvY2VkdXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgLyogQWN0aW9ucyBwZXJmb3JtZWQgb25seSBpZiBBREMgaXMgY29taW5nIGZyb20gc3RhdGUgcmVzZXQ6ICAgICAgICAgICAgICAgICovCisgIC8qIC0gSW5pdGlhbGl6YXRpb24gb2YgQURDIE1TUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZiAoaGFkYy0+U3RhdGUgPT0gSEFMX0FEQ19TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEluaXRpYWxpemUgQURDIGVycm9yIGNvZGUgKi8KKyAgICBBRENfQ0xFQVJfRVJST1JDT0RFKGhhZGMpOworICAgIAorICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBoYWRjLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworICAgIAorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICAgIEhBTF9BRENfTXNwSW5pdChoYWRjKTsKKyAgfQorICAKKyAgLyogU3RvcCBwb3RlbnRpYWwgY29udmVyc2lvbiBvbiBnb2luZywgb24gcmVndWxhciBhbmQgaW5qZWN0ZWQgZ3JvdXBzICovCisgIC8qIERpc2FibGUgQURDIHBlcmlwaGVyYWwgKi8KKyAgLyogTm90ZTogSW4gY2FzZSBvZiBBREMgYWxyZWFkeSBlbmFibGVkLCBwcmVjYXV0aW9uIHRvIG5vdCBsYXVuY2ggYW4gICAgICAgICovCisgIC8qICAgICAgIHVud2FudGVkIGNvbnZlcnNpb24gd2hpbGUgbW9kaWZ5aW5nIHJlZ2lzdGVyIENSMiBieSB3cml0aW5nIDEgdG8gICAqLworICAvKiAgICAgICBiaXQgQURPTi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdG1wX2hhbF9zdGF0dXMgPSBBRENfQ29udmVyc2lvblN0b3BfRGlzYWJsZShoYWRjKTsKKyAgCisgIAorICAvKiBDb25maWd1cmF0aW9uIG9mIEFEQyBwYXJhbWV0ZXJzIGlmIHByZXZpb3VzIHByZWxpbWluYXJ5IGFjdGlvbnMgYXJlICAgICAgKi8gCisgIC8qIGNvcnJlY3RseSBjb21wbGV0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZiAoSEFMX0lTX0JJVF9DTFIoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpICYmCisgICAgICAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgIHsKKyAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSB8IEhBTF9BRENfU1RBVEVfSU5KX0JVU1ksCisgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9CVVNZX0lOVEVSTkFMKTsKKyAgICAKKyAgICAvKiBTZXQgQURDIHBhcmFtZXRlcnMgKi8KKyAgICAKKyAgICAvKiBDb25maWd1cmF0aW9uIG9mIEFEQzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gZGF0YSBhbGlnbm1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIGV4dGVybmFsIHRyaWdnZXIgdG8gc3RhcnQgY29udmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBleHRlcm5hbCB0cmlnZ2VyIHBvbGFyaXR5IChhbHdheXMgc2V0IHRvIDFVLCBiZWNhdXNlIG5lZWRlZCBmb3IgYWxsICAqLworICAgIC8qICAgIHRyaWdnZXJzOiBleHRlcm5hbCB0cmlnZ2VyIG9mIFNXIHN0YXJ0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBjb250aW51b3VzIGNvbnZlcnNpb24gbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogTm90ZTogRXh0ZXJuYWwgdHJpZ2dlciBwb2xhcml0eSAoQURDX0NSMl9FWFRUUklHKSBpcyBzZXQgaW50byAgICAgICAgICAqLworICAgIC8qICAgICAgIEhBTF9BRENfU3RhcnRfeHh4IGZ1bmN0aW9ucyBiZWNhdXNlIGlmIHNldCBpbiB0aGlzIGZ1bmN0aW9uLCAgICAgKi8KKyAgICAvKiAgICAgICBhIGNvbnZlcnNpb24gb24gaW5qZWN0ZWQgZ3JvdXAgd291bGQgc3RhcnQgYSBjb252ZXJzaW9uIGFsc28gb24gICovCisgICAgLyogICAgICAgcmVndWxhciBncm91cCBhZnRlciBBREMgZW5hYmxpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHRtcF9jcjIgfD0gKGhhZGMtPkluaXQuRGF0YUFsaWduICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgaGFkYy0+SW5pdC5FeHRlcm5hbFRyaWdDb252ICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICBBRENfQ1IyX0NPTlRJTlVPVVMoaGFkYy0+SW5pdC5Db250aW51b3VzQ29udk1vZGUpICk7CisgICAgCisgICAgLyogQ29uZmlndXJhdGlvbiBvZiBBREM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIHNjYW4gbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBkaXNjb250aW51b3VzIG1vZGUgZGlzYWJsZS9lbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gZGlzY29udGludW91cyBtb2RlIG51bWJlciBvZiBjb252ZXJzaW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHRtcF9jcjEgfD0gKEFEQ19DUjFfU0NBTl9TRVQoaGFkYy0+SW5pdC5TY2FuQ29udk1vZGUpKTsKKworICAgIC8qIEVuYWJsZSBkaXNjb250aW51b3VzIG1vZGUgb25seSBpZiBjb250aW51b3VzIG1vZGUgaXMgZGlzYWJsZWQgKi8KKyAgICAvKiBOb3RlOiBJZiBwYXJhbWV0ZXIgIkluaXQuU2NhbkNvbnZNb2RlIiBpcyBzZXQgdG8gZGlzYWJsZSwgcGFyYW1ldGVyICAgICovCisgICAgLyogICAgICAgZGlzY29udGludW91cyBpcyBzZXQgYW55d2F5LCBidXQgd2lsbCBoYXZlIG5vIGVmZmVjdCBvbiBBREMgSFcuICAqLworICAgIGlmIChoYWRjLT5Jbml0LkRpc2NvbnRpbnVvdXNDb252TW9kZSA9PSBFTkFCTEUpCisgICAgeworICAgICAgaWYgKGhhZGMtPkluaXQuQ29udGludW91c0NvbnZNb2RlID09IERJU0FCTEUpCisgICAgICB7CisgICAgICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgQURDIHJlZ3VsYXIgZGlzY29udGludW91cyBtb2RlICovCisgICAgICAgIC8qIFNldCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHRvIGJlIGNvbnZlcnRlZCBpbiBkaXNjb250aW51b3VzIG1vZGUgKi8KKyAgICAgIHRtcF9jcjEgfD0gKEFEQ19DUjFfRElTQ0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgIEFEQ19DUjFfRElTQ09OVElOVU9VU19OVU0oaGFkYy0+SW5pdC5OYnJPZkRpc2NDb252ZXJzaW9uKSApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBBREMgcmVndWxhciBncm91cCBkaXNjb250aW51b3VzIHdhcyBpbnRlbmRlZCB0byBiZSBlbmFibGVkLCAgICAgICAgKi8KKyAgICAgICAgLyogYnV0IEFEQyByZWd1bGFyIGdyb3VwIG1vZGVzIGNvbnRpbnVvdXMgYW5kIHNlcXVlbmNlciBkaXNjb250aW51b3VzICovCisgICAgICAgIC8qIGNhbm5vdCBiZSBlbmFibGVkIHNpbXVsdGFuZW91c2x5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAKKyAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfQ09ORklHKTsKKyAgICAgICAgCisgICAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBBREMgSVAgaW50ZXJuYWwgZXJyb3IgKi8KKyAgICAgICAgU0VUX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfSU5URVJOQUwpOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiBVcGRhdGUgQURDIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgQ1IxIHdpdGggcHJldmlvdXMgc2V0dGluZ3MgKi8KKyAgICAgIE1PRElGWV9SRUcoaGFkYy0+SW5zdGFuY2UtPkNSMSwKKyAgICAgICAgICAgICAgICAgQURDX0NSMV9TQ0FOICAgIHwKKyAgICAgICAgICAgICAgICAgQURDX0NSMV9ESVNDRU4gIHwKKyAgICAgICAgICAgICAgICAgQURDX0NSMV9ESVNDTlVNICAgICwKKyAgICAgICAgICAgICAgICAgdG1wX2NyMSAgICAgICAgICAgICApOworICAgIAorICAgIC8qIFVwZGF0ZSBBREMgY29uZmlndXJhdGlvbiByZWdpc3RlciBDUjIgd2l0aCBwcmV2aW91cyBzZXR0aW5ncyAqLworICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+Q1IyLAorICAgICAgICAgICAgICAgICBBRENfQ1IyX0FMSUdOICAgfAorICAgICAgICAgICAgICAgICBBRENfQ1IyX0VYVFNFTCAgfAorICAgICAgICAgICAgICAgICBBRENfQ1IyX0VYVFRSSUcgfAorICAgICAgICAgICAgICAgICBBRENfQ1IyX0NPTlQgICAgICAgLAorICAgICAgICAgICAgICAgICB0bXBfY3IyICAgICAgICAgICAgICk7CisgICAgCisgICAgLyogQ29uZmlndXJhdGlvbiBvZiByZWd1bGFyIGdyb3VwIHNlcXVlbmNlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIC0gaWYgc2NhbiBtb2RlIGlzIGRpc2FibGVkLCByZWd1bGFyIGNoYW5uZWxzIHNlcXVlbmNlIGxlbmd0aCBpcyBzZXQgdG8gKi8KKyAgICAvKiAgIDB4MDA6IDEgY2hhbm5lbCBjb252ZXJ0ZWQgKGNoYW5uZWwgb24gcmVndWxhciByYW5rIDFVKSAgICAgICAgICAgICAgICAqLworICAgIC8qICAgUGFyYW1ldGVyICJOYnJPZkNvbnZlcnNpb24iIGlzIGRpc2NhcmRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgIE5vdGU6IFNjYW4gbW9kZSBpcyBwcmVzZW50IGJ5IGhhcmR3YXJlIG9uIHRoaXMgZGV2aWNlIGFuZCwgaWYgICAgICAgICovCisgICAgLyogICBkaXNhYmxlZCwgZGlzY2FyZHMgYXV0b21hdGljYWxseSBuYiBvZiBjb252ZXJzaW9ucy4gQW55d2F5LCBuYiBvZiAgICAqLworICAgIC8qICAgY29udmVyc2lvbnMgaXMgZm9yY2VkIHRvIDB4MDAgZm9yIGFsaWdubWVudCBvdmVyIGFsbCBTVE0zMiBkZXZpY2VzLiAgKi8KKyAgICAvKiAtIGlmIHNjYW4gbW9kZSBpcyBlbmFibGVkLCByZWd1bGFyIGNoYW5uZWxzIHNlcXVlbmNlIGxlbmd0aCBpcyBzZXQgdG8gICovCisgICAgLyogICBwYXJhbWV0ZXIgIk5ick9mQ29udmVyc2lvbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmIChBRENfQ1IxX1NDQU5fU0VUKGhhZGMtPkluaXQuU2NhbkNvbnZNb2RlKSA9PSBBRENfU0NBTl9FTkFCTEUpCisgICAgeworICAgICAgdG1wX3NxcjEgPSBBRENfU1FSMV9MX1NISUZUKGhhZGMtPkluaXQuTmJyT2ZDb252ZXJzaW9uKTsKKyAgICB9CisgICAgCisgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+U1FSMSwKKyAgICAgICAgICAgICAgIEFEQ19TUVIxX0wgICAgICAgICAgLAorICAgICAgICAgICAgICAgdG1wX3NxcjEgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAvKiBDaGVjayBiYWNrIHRoYXQgQURDIHJlZ2lzdGVycyBoYXZlIGVmZmVjdGl2ZWx5IGJlZW4gY29uZmlndXJlZCB0byAgICAgICovCisgICAgLyogZW5zdXJlIG9mIG5vIHBvdGVudGlhbCBwcm9ibGVtIG9mIEFEQyBjb3JlIElQIGNsb2NraW5nLiAgICAgICAgICAgICAgICAqLworICAgIC8qIENoZWNrIHRocm91Z2ggcmVnaXN0ZXIgQ1IyIChleGNsdWRpbmcgYml0cyBzZXQgaW4gb3RoZXIgZnVuY3Rpb25zOiAgICAgKi8KKyAgICAvKiBleGVjdXRpb24gY29udHJvbCBiaXRzIChBRE9OLCBKU1dTVEFSVCwgU1dTVEFSVCksIHJlZ3VsYXIgZ3JvdXAgYml0cyAgICovCisgICAgLyogKERNQSksIGluamVjdGVkIGdyb3VwIGJpdHMgKEpFWFRUUklHIGFuZCBKRVhUU0VMKSwgY2hhbm5lbCBpbnRlcm5hbCAgICAqLworICAgIC8qIG1lYXN1cmVtZW50IHBhdGggYml0IChUU1ZSRUZFKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoUkVBRF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNSMiwgfihBRENfQ1IyX0FET04gfCBBRENfQ1IyX0RNQSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NSMl9TV1NUQVJUIHwgQURDX0NSMl9KU1dTVEFSVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NSMl9KRVhUVFJJRyB8IEFEQ19DUjJfSkVYVFNFTCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NSMl9UU1ZSRUZFICAgICAgICAgICAgICAgICAgICAgKSkKKyAgICAgICAgID09IHRtcF9jcjIpCisgICAgeworICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIG5vbmUgKi8KKyAgICAgIEFEQ19DTEVBUl9FUlJPUkNPREUoaGFkYyk7CisgICAgICAKKyAgICAgIC8qIFNldCB0aGUgQURDIHN0YXRlICovCisgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfQlVTWV9JTlRFUk5BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfQlVTWV9JTlRFUk5BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpOworICAgICAgCisgICAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgdG8gQURDIElQIGludGVybmFsIGVycm9yICovCisgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7CisgICAgICAKKyAgICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0VSUk9SOworICAgIH0KKyAgCisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCk7CisgICAgICAgIAorICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKy8qKgorICAqIEBicmllZiAgRGVpbml0aWFsaXplIHRoZSBBREMgcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldAorICAqICAgICAgICAgdmFsdWVzLCB3aXRoIGRlaW5pdGlhbGl6YXRpb24gb2YgdGhlIEFEQyBNU1AuCisgICogQG5vdGUgICBGb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDczogcmVzZXQgb2YgQURDIGNvbW1vbiByZWdpc3RlcnMgaXMgZG9uZSAKKyAgKiAgICAgICAgIG9ubHkgaWYgYWxsIEFEQ3Mgc2hhcmluZyB0aGUgc2FtZSBjb21tb24gZ3JvdXAgYXJlIGRpc2FibGVkLgorICAqICAgICAgICAgSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIHJlc2V0IG9mIHRoZXNlIGNvbW1vbiBwYXJhbWV0ZXJzIHJlc2V0IGlzICAKKyAgKiAgICAgICAgIGJ5cGFzc2VkIHdpdGhvdXQgZXJyb3IgcmVwb3J0aW5nOiBpdCBjYW4gYmUgdGhlIGludGVuZGVkIGJlaGF2aW91ciBpbgorICAqICAgICAgICAgY2FzZSBvZiByZXNldCBvZiBhIHNpbmdsZSBBREMgd2hpbGUgdGhlIG90aGVyIEFEQ3Mgc2hhcmluZyB0aGUgc2FtZSAKKyAgKiAgICAgICAgIGNvbW1vbiBncm91cCBpcyBzdGlsbCBydW5uaW5nLgorICAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQ3M6IEdsb2JhbCByZXNldCBvZiBhbGwgQURDcyBzaGFyaW5nIGEKKyAgKiAgICAgICAgIGNvbW1vbiBncm91cCBpcyBwb3NzaWJsZS4KKyAgKiAgICAgICAgIEFzIHRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gcmVzZXQgYSBzaW5nbGUgQURDLCB0byBub3QgaW1wYWN0IAorICAqICAgICAgICAgb3RoZXIgQURDcywgaW5zdHJ1Y3Rpb25zIGZvciBnbG9iYWwgcmVzZXQgb2YgbXVsdGlwbGUgQURDcyBoYXZlIGJlZW4KKyAgKiAgICAgICAgIGxldCBjb21tZW50ZWQgYmVsb3cuCisgICogICAgICAgICBJZiBuZWVkZWQsIHRoZSBleGFtcGxlIGNvZGUgY2FuIGJlIGNvcGllZCBhbmQgdW5jb21tZW50ZWQgaW50bworICAqICAgICAgICAgZnVuY3Rpb24gSEFMX0FEQ19Nc3BEZUluaXQoKS4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19EZUluaXQoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOworICBBRENfQ29tbW9uX1R5cGVEZWYgKnRtcEFEQ19Db21tb247CisgIEFEQ19IYW5kbGVUeXBlRGVmIHRtcGhhZGNTaGFyaW5nU2FtZUNvbW1vblJlZ2lzdGVyOworICAKKyAgLyogQ2hlY2sgQURDIGhhbmRsZSAqLworICBpZihoYWRjID09IE5VTEwpCisgIHsKKyAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9CVVNZX0lOVEVSTkFMKTsKKyAgCisgIC8qIFN0b3AgcG90ZW50aWFsIGNvbnZlcnNpb24gb24gZ29pbmcsIG9uIHJlZ3VsYXIgYW5kIGluamVjdGVkIGdyb3VwcyAqLworICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19Db252ZXJzaW9uU3RvcChoYWRjLCBBRENfUkVHVUxBUl9JTkpFQ1RFRF9HUk9VUCk7CisgIAorICAvKiBEaXNhYmxlIEFEQyBwZXJpcGhlcmFsIGlmIGNvbnZlcnNpb25zIGFyZSBlZmZlY3RpdmVseSBzdG9wcGVkICovCisgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgIHsKKyAgICAvKiBGbHVzaCByZWdpc3RlciBKU1FSOiBxdWV1ZSBzZXF1ZW5jZXIgcmVzZXQgd2hlbiBpbmplY3RlZCBxdWV1ZSAgICAgICAgICovCisgICAgLyogc2VxdWVuY2VyIGlzIGVuYWJsZWQgYW5kIEFEQyBkaXNhYmxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIEVuYWJsZSBpbmplY3RlZCBxdWV1ZSBzZXF1ZW5jZXIgYWZ0ZXIgaW5qZWN0ZWQgY29udmVyc2lvbiBzdG9wICAgICAgICAgKi8KKyAgICBTRVRfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSLCBBRENfQ0ZHUl9KUU0pOworICAgIAorICAgIC8qIERpc2FibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovCisgICAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRGlzYWJsZShoYWRjKTsKKyAgICAKKyAgICAvKiBDaGVjayBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8KKyAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIENoYW5nZSBBREMgc3RhdGUgKi8KKyAgICAgIGhhZGMtPlN0YXRlID0gSEFMX0FEQ19TVEFURV9SRUFEWTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgICAgICAKKyAgICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0VSUk9SOworICAgIH0KKyAgfQorICAKKyAgCisgIC8qIENvbmZpZ3VyYXRpb24gb2YgQURDIHBhcmFtZXRlcnMgaWYgcHJldmlvdXMgcHJlbGltaW5hcnkgYWN0aW9ucyBhcmUgICAgICAqLyAKKyAgLyogY29ycmVjdGx5IGNvbXBsZXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgIHsKKyAgICAvKiA9PT09PT09PT09IFJlc2V0IEFEQyByZWdpc3RlcnMgPT09PT09PT09PSAqLworICAgIC8qIFJlc2V0IHJlZ2lzdGVyIElFUiAqLworICAgIF9fSEFMX0FEQ19ESVNBQkxFX0lUKGhhZGMsIChBRENfSVRfQVdEMyAgfCBBRENfSVRfQVdEMiB8IEFEQ19JVF9BV0QxIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0lUX0pRT1ZGIHwgQURDX0lUX09WUiAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSVRfSkVPUyAgfCBBRENfSVRfSkVPQyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19JVF9FT1MgICB8IEFEQ19JVF9FT0MgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0lUX0VPU01QIHwgQURDX0lUX1JEWSAgICAgICAgICAgICAgICAgKSApOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIElTUiAqLworICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIChBRENfRkxBR19BV0QzICB8IEFEQ19GTEFHX0FXRDIgfCBBRENfRkxBR19BV0QxIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0ZMQUdfSlFPVkYgfCBBRENfRkxBR19PVlIgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0ZMQUdfSkVPUyAgfCBBRENfRkxBR19KRU9DIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0ZMQUdfRU9TICAgfCBBRENfRkxBR19FT0MgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0ZMQUdfRU9TTVAgfCBBRENfRkxBR19SRFkgICAgICAgICAgICAgICAgICAgKSApOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIENSICovCisgICAgLyogQml0cyBBRENfQ1JfSkFEU1RQLCBBRENfQ1JfQURTVFAsIEFEQ19DUl9KQURTVEFSVCwgQURDX0NSX0FEU1RBUlQgYXJlICAqLworICAgIC8qIGluIGFjY2VzcyBtb2RlICJyZWFkLXNldCI6IG5vIGRpcmVjdCByZXNldCBhcHBsaWNhYmxlLiAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBSZXNldCBDYWxpYnJhdGlvbiBtb2RlIHRvIGRlZmF1bHQgc2V0dGluZyAoc2luZ2xlIGVuZGVkKTogICAgICAgICAgICAgICovCisgICAgLyogRGlzYWJsZSB2b2x0YWdlIHJlZ3VsYXRvcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIE5vdGU6IFZvbHRhZ2UgcmVndWxhdG9yIGRpc2FibGUgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlIGRpc2FibGVkOiAgKi8KKyAgICAvKiAgICAgICBhbHJlYWR5IGRvbmUgYWJvdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogTm90ZTogVm9sdGFnZSByZWd1bGF0b3IgZGlzYWJsZSBpcyBpbnRlbmRlZCBmb3IgcG93ZXIgc2F2aW5nLiAgICAgICAgICAqLworICAgIC8qIFNlcXVlbmNlIHRvIGRpc2FibGUgdm9sdGFnZSByZWd1bGF0b3I6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAxLiBTZXQgdGhlIGludGVybWVkaWF0ZSBzdGF0ZSBiZWZvcmUgbW92aW5nIHRoZSBBREMgdm9sdGFnZSByZWd1bGF0b3IgICovCisgICAgLyogICAgdG8gZGlzYWJsZSBzdGF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+Q1IsIEFEQ19DUl9BRFZSRUdFTl8xIHwgQURDX0NSX0FEVlJFR0VOXzAgfCBBRENfQ1JfQURDQUxESUYpOworICAgIC8qIDIuIFNldCBBRFZSRUdFTiBiaXRzIHRvIDB4MTBVICovCisgICAgU0VUX0JJVChoYWRjLT5JbnN0YW5jZS0+Q1IsIEFEQ19DUl9BRFZSRUdFTl8xKTsKKyAgICAgICAgCisgICAgLyogUmVzZXQgcmVnaXN0ZXIgQ0ZHUiAqLworICAgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+Q0ZHUiwgQURDX0NGR1JfQVdEMUNIICB8IEFEQ19DRkdSX0pBVVRPICAgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0FXRDFFTiAgfCBBRENfQ0ZHUl9BV0QxU0dMIHwgQURDX0NGR1JfSlFNICAgICB8ICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0pESVNDRU4gfCBBRENfQ0ZHUl9ESVNDTlVNIHwgQURDX0NGR1JfRElTQ0VOICB8IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfQVVURExZICB8IEFEQ19DRkdSX0NPTlQgICAgfCBBRENfQ0ZHUl9PVlJNT0QgIHwgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfRVhURU4gICB8IEFEQ19DRkdSX0VYVFNFTCAgfCBBRENfQ0ZHUl9BTElHTiAgIHwgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfUkVTICAgICB8IEFEQ19DRkdSX0RNQUNGRyAgfCBBRENfQ0ZHUl9ETUFFTiAgICApOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFNNUFIxICovCisgICAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5TTVBSMSwgQURDX1NNUFIxX1NNUDkgfCBBRENfU01QUjFfU01QOCB8IEFEQ19TTVBSMV9TTVA3IHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NNUFIxX1NNUDYgfCBBRENfU01QUjFfU01QNSB8IEFEQ19TTVBSMV9TTVA0IHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NNUFIxX1NNUDMgfCBBRENfU01QUjFfU01QMiB8IEFEQ19TTVBSMV9TTVAxICApOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFNNUFIyICovCisgICAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5TTVBSMiwgQURDX1NNUFIyX1NNUDE4IHwgQURDX1NNUFIyX1NNUDE3IHwgQURDX1NNUFIyX1NNUDE2IHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NNUFIyX1NNUDE1IHwgQURDX1NNUFIyX1NNUDE0IHwgQURDX1NNUFIyX1NNUDEzIHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NNUFIyX1NNUDEyIHwgQURDX1NNUFIyX1NNUDExIHwgQURDX1NNUFIyX1NNUDEwICApOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFRSMSAqLworICAgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+VFIxLCBBRENfVFIxX0hUMSB8IEFEQ19UUjFfTFQxKTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBUUjIgKi8KKyAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPlRSMiwgQURDX1RSMl9IVDIgfCBBRENfVFIyX0xUMik7CisgICAgCisgICAgLyogUmVzZXQgcmVnaXN0ZXIgVFIzICovCisgICAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5UUjMsIEFEQ19UUjNfSFQzIHwgQURDX1RSM19MVDMpOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFNRUjEgKi8KKyAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPlNRUjEsIEFEQ19TUVIxX1NRNCB8IEFEQ19TUVIxX1NRMyB8IEFEQ19TUVIxX1NRMiB8IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NRUjFfU1ExIHwgQURDX1NRUjFfTCk7CisgICAgCisgICAgLyogUmVzZXQgcmVnaXN0ZXIgU1FSMiAqLworICAgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+U1FSMiwgQURDX1NRUjJfU1E5IHwgQURDX1NRUjJfU1E4IHwgQURDX1NRUjJfU1E3IHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU1FSMl9TUTYgfCBBRENfU1FSMl9TUTUpOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFNRUjMgKi8KKyAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPlNRUjMsIEFEQ19TUVIzX1NRMTQgfCBBRENfU1FSM19TUTEzIHwgQURDX1NRUjNfU1ExMiB8IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NRUjNfU1ExMSB8IEFEQ19TUVIzX1NRMTApOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFNRUjQgKi8KKyAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPlNRUjQsIEFEQ19TUVI0X1NRMTYgfCBBRENfU1FSNF9TUTE1KTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBEUiAqLworICAgIC8qIGJpdHMgaW4gYWNjZXNzIG1vZGUgcmVhZCBvbmx5LCBubyBkaXJlY3QgcmVzZXQgYXBwbGljYWJsZSovCisgICAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBPRlIxICovCisgICAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5PRlIxLCBBRENfT0ZSMV9PRkZTRVQxX0VOIHwgQURDX09GUjFfT0ZGU0VUMV9DSCB8IEFEQ19PRlIxX09GRlNFVDEpOworICAgIC8qIFJlc2V0IHJlZ2lzdGVyIE9GUjIgKi8KKyAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPk9GUjIsIEFEQ19PRlIyX09GRlNFVDJfRU4gfCBBRENfT0ZSMl9PRkZTRVQyX0NIIHwgQURDX09GUjJfT0ZGU0VUMik7CisgICAgLyogUmVzZXQgcmVnaXN0ZXIgT0ZSMyAqLworICAgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+T0ZSMywgQURDX09GUjNfT0ZGU0VUM19FTiB8IEFEQ19PRlIzX09GRlNFVDNfQ0ggfCBBRENfT0ZSM19PRkZTRVQzKTsKKyAgICAvKiBSZXNldCByZWdpc3RlciBPRlI0ICovCisgICAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5PRlI0LCBBRENfT0ZSNF9PRkZTRVQ0X0VOIHwgQURDX09GUjRfT0ZGU0VUNF9DSCB8IEFEQ19PRlI0X09GRlNFVDQpOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVycyBKRFIxLCBKRFIyLCBKRFIzLCBKRFI0ICovCisgICAgLyogYml0cyBpbiBhY2Nlc3MgbW9kZSByZWFkIG9ubHksIG5vIGRpcmVjdCByZXNldCBhcHBsaWNhYmxlKi8KKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBBV0QyQ1IgKi8KKyAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkFXRDJDUiwgQURDX0FXRDJDUl9BV0QyQ0gpOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIEFXRDNDUiAqLworICAgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+QVdEM0NSLCBBRENfQVdEM0NSX0FXRDNDSCk7CisgICAgCisgICAgLyogUmVzZXQgcmVnaXN0ZXIgRElGU0VMICovCisgICAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5ESUZTRUwsIEFEQ19ESUZTRUxfRElGU0VMKTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBDQUxGQUNUICovCisgICAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5DQUxGQUNULCBBRENfQ0FMRkFDVF9DQUxGQUNUX0QgfCBBRENfQ0FMRkFDVF9DQUxGQUNUX1MpOworCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgLyogPT09PT09PT09PSBSZXNldCBjb21tb24gQURDIHJlZ2lzdGVycyA9PT09PT09PT09ICovCisgICAgCisgICAgLyogUG9pbnRlciB0byB0aGUgY29tbW9uIGNvbnRyb2wgcmVnaXN0ZXIgdG8gd2hpY2ggaXMgYmVsb25naW5nIGhhZGMgICAgICAqLworICAgIC8qIChEZXBlbmRpbmcgb24gU1RNMzJGMyBwcm9kdWN0LCB0aGVyZSBtYXkgYmUgdXAgdG8gNCBBREMgYW5kIDIgY29tbW9uICAgKi8KKyAgICAvKiBjb250cm9sIHJlZ2lzdGVycykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdG1wQURDX0NvbW1vbiA9IEFEQ19DT01NT05fUkVHSVNURVIoaGFkYyk7CisgICAgCisgICAgLyogU2V0IGhhbmRsZSBvZiB0aGUgb3RoZXIgQURDIHNoYXJpbmcgdGhlIHNhbWUgY29tbW9uIHJlZ2lzdGVyICAgICAgICAgICAqLworICAgIEFEQ19DT01NT05fQURDX09USEVSKGhhZGMsICZ0bXBoYWRjU2hhcmluZ1NhbWVDb21tb25SZWdpc3Rlcik7CisgICAgCisgICAgLyogU29mdHdhcmUgaXMgYWxsb3dlZCB0byBjaGFuZ2UgY29tbW9uIHBhcmFtZXRlcnMgb25seSB3aGVuIGFsbCBBRENzIG9mICAqLworICAgIC8qIHRoZSBjb21tb24gZ3JvdXAgYXJlIGRpc2FibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoKEFEQ19JU19FTkFCTEUoaGFkYykgPT0gUkVTRVQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICggKHRtcGhhZGNTaGFyaW5nU2FtZUNvbW1vblJlZ2lzdGVyLkluc3RhbmNlID09IE5VTEwpIHx8CisgICAgICAgICAgKEFEQ19JU19FTkFCTEUoJnRtcGhhZGNTaGFyaW5nU2FtZUNvbW1vblJlZ2lzdGVyKSA9PSBSRVNFVCkgKSAgICkKKyAgICB7CisgICAgICAvKiBSZXNldCBjb25maWd1cmF0aW9uIG9mIEFEQyBjb21tb24gcmVnaXN0ZXIgQ0NSOgorICAgICAgICAtIGNsb2NrIG1vZGU6IENLTU9ERQorICAgICAgICAtIG11bHRpbW9kZSByZWxhdGVkIHBhcmFtZXRlcnM6IE1ETUEsIERNQUNGRywgREVMQVksIE1VTFRJIChzZXQgaW50bworICAgICAgICAgIEhBTF9BRENFeF9NdWx0aU1vZGVDb25maWdDaGFubmVsKCkgKQorICAgICAgICAtIGludGVybmFsIG1lYXN1cmVtZW50IHBhdGhzOiBWYmF0LCB0ZW1wZXJhdHVyZSBzZW5zb3IsIFZyZWYgKHNldCBpbnRvCisgICAgICAgICAgSEFMX0FEQ19Db25maWdDaGFubmVsKCkgb3IgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpICkKKyAgICAgICovCisgICAgICBDTEVBUl9CSVQodG1wQURDX0NvbW1vbi0+Q0NSLCBBRENfQ0NSX0NLTU9ERSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0NSX1ZCQVRFTiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0NSX1RTRU4gICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0NSX1ZSRUZFTiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0NSX01ETUEgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0NSX0RNQUNGRyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0NSX0RFTEFZICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0NSX01VTFRJICAgKTsKKyAgICAgIAorICAgICAgLyogT3RoZXIgQURDIGNvbW1vbiByZWdpc3RlcnMgKENTUiwgQ0RSKSBhcmUgaW4gYWNjZXNzIG1vZGUgcmVhZCBvbmx5LAorICAgICAgICAgbm8gZGlyZWN0IHJlc2V0IGFwcGxpY2FibGUgKi8KKyAgICB9CisgICAgCisgICAgCisgICAgLyogPT09PT09PT09PSBIYXJkIHJlc2V0IGFuZCBjbG9jayBkaXNhYmxlIG9mIEFEQyBwZXJpcGhlcmFsID09PT09PT09PT0gKi8KKyAgICAvKiBJbnRvIEhBTF9BRENfTXNwRGVJbml0KCksIEFEQyBjbG9jayBjYW4gYmUgaGFyZCByZXNldCBhbmQgZGlzYWJsZWQgICAgICovCisgICAgLyogYXQgUkNDIHRvcCBsZXZlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIFJlZmVyIHRvIGhlYWRlciBvZiB0aGlzIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBvbiBjbG9jayBkaXNhYmxpbmcgICAgICAgKi8KKyAgICAvKiBwcm9jZWR1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgCisKKyAgICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICAgIEhBTF9BRENfTXNwRGVJbml0KGhhZGMpOworICAgIAorICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBub25lICovCisgICAgQURDX0NMRUFSX0VSUk9SQ09ERShoYWRjKTsKKyAgICAKKyAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgaGFkYy0+U3RhdGUgPSBIQUxfQURDX1NUQVRFX1JFU0VUOworICB9CisgIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisvKioKKyAgKiBAYnJpZWYgIERlaW5pdGlhbGl6ZSB0aGUgQURDIHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIGl0cyBkZWZhdWx0IHJlc2V0IHZhbHVlcy4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19EZUluaXQoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7IAorICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1cyA9IEhBTF9PSzsKKyAgCisgIC8qIENoZWNrIEFEQyBoYW5kbGUgKi8KKyAgaWYoaGFkYyA9PSBOVUxMKQorICB7CisgICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIAorICAvKiBTZXQgQURDIHN0YXRlICovCisgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfQlVTWV9JTlRFUk5BTCk7CisgIAorICAvKiBTdG9wIHBvdGVudGlhbCBjb252ZXJzaW9uIG9uIGdvaW5nLCBvbiByZWd1bGFyIGFuZCBpbmplY3RlZCBncm91cHMgKi8KKyAgLyogRGlzYWJsZSBBREMgcGVyaXBoZXJhbCAqLworICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19Db252ZXJzaW9uU3RvcF9EaXNhYmxlKGhhZGMpOworICAKKyAgCisgIC8qIENvbmZpZ3VyYXRpb24gb2YgQURDIHBhcmFtZXRlcnMgaWYgcHJldmlvdXMgcHJlbGltaW5hcnkgYWN0aW9ucyBhcmUgICAgICAqLyAKKyAgLyogY29ycmVjdGx5IGNvbXBsZXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgIHsKKyAgICAvKiA9PT09PT09PT09IFJlc2V0IEFEQyByZWdpc3RlcnMgPT09PT09PT09PSAqLworICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFNSICovCisgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgKEFEQ19GTEFHX0FXRCB8IEFEQ19GTEFHX0pFT0MgfCBBRENfRkxBR19FT0MgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfRkxBR19KU1RSVCB8IEFEQ19GTEFHX1NUUlQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBDUjEgKi8KKyAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkNSMSwgKEFEQ19DUjFfQVdERU4gICB8IEFEQ19DUjFfSkFXREVOIHwgQURDX0NSMV9ESVNDTlVNIHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ1IxX0pESVNDRU4gfCBBRENfQ1IxX0RJU0NFTiB8IEFEQ19DUjFfSkFVVE8gICB8IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NSMV9BV0RTR0wgIHwgQURDX0NSMV9TQ0FOICAgfCBBRENfQ1IxX0pFT0NJRSAgfCAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NSMV9BV0RJRSAgIHwgQURDX0NSMV9FT0NJRSAgfCBBRENfQ1IxX0FXRENIICAgICkpOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIENSMiAqLworICAgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+Q1IyLCAoQURDX0NSMl9UU1ZSRUZFIHwgQURDX0NSMl9TV1NUQVJUIHwgQURDX0NSMl9KU1dTVEFSVCB8IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NSMl9FWFRUUklHIHwgQURDX0NSMl9FWFRTRUwgIHwgQURDX0NSMl9KRVhUVFJJRyB8ICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DUjJfSkVYVFNFTCB8IEFEQ19DUjJfQUxJR04gICB8IEFEQ19DUjJfRE1BICAgICAgfCAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ1IyX1JTVENBTCAgfCBBRENfQ1IyX0NBTCAgICAgfCBBRENfQ1IyX0NPTlQgICAgIHwgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ1IyX0FET04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBTTVBSMSAqLworICAgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+U01QUjEsIChBRENfU01QUjFfU01QMTggfCBBRENfU01QUjFfU01QMTcgfCBBRENfU01QUjFfU01QMTUgfCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NNUFIxX1NNUDE1IHwgQURDX1NNUFIxX1NNUDE0IHwgQURDX1NNUFIxX1NNUDEzIHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19TTVBSMV9TTVAxMiB8IEFEQ19TTVBSMV9TTVAxMSB8IEFEQ19TTVBSMV9TTVAxMCAgKSk7CisgICAgCisgICAgLyogUmVzZXQgcmVnaXN0ZXIgU01QUjIgKi8KKyAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPlNNUFIyLCAoQURDX1NNUFIyX1NNUDkgfCBBRENfU01QUjJfU01QOCB8IEFEQ19TTVBSMl9TTVA3IHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19TTVBSMl9TTVA2IHwgQURDX1NNUFIyX1NNUDUgfCBBRENfU01QUjJfU01QNCB8IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU01QUjJfU01QMyB8IEFEQ19TTVBSMl9TTVAyIHwgQURDX1NNUFIyX1NNUDEgfCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NNUFIyX1NNUDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKTsKKworICAgIC8qIFJlc2V0IHJlZ2lzdGVyIEpPRlIxICovCisgICAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5KT0ZSMSwgQURDX0pPRlIxX0pPRkZTRVQxKTsKKyAgICAvKiBSZXNldCByZWdpc3RlciBKT0ZSMiAqLworICAgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+Sk9GUjIsIEFEQ19KT0ZSMl9KT0ZGU0VUMik7CisgICAgLyogUmVzZXQgcmVnaXN0ZXIgSk9GUjMgKi8KKyAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkpPRlIzLCBBRENfSk9GUjNfSk9GRlNFVDMpOworICAgIC8qIFJlc2V0IHJlZ2lzdGVyIEpPRlI0ICovCisgICAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5KT0ZSNCwgQURDX0pPRlI0X0pPRkZTRVQ0KTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBIVFIgKi8KKyAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkhUUiwgQURDX0hUUl9IVCk7CisgICAgLyogUmVzZXQgcmVnaXN0ZXIgTFRSICovCisgICAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5MVFIsIEFEQ19MVFJfTFQpOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFNRUjEgKi8KKyAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPlNRUjEsIEFEQ19TUVIxX0wgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NRUjFfU1ExNiB8IEFEQ19TUVIxX1NRMTUgfCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19TUVIxX1NRMTQgfCBBRENfU1FSMV9TUTEzICApOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFNRUjEgKi8KKyAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPlNRUjEsIEFEQ19TUVIxX0wgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NRUjFfU1ExNiB8IEFEQ19TUVIxX1NRMTUgfCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19TUVIxX1NRMTQgfCBBRENfU1FSMV9TUTEzICApOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFNRUjIgKi8KKyAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPlNRUjIsIEFEQ19TUVIyX1NRMTIgfCBBRENfU1FSMl9TUTExIHwgQURDX1NRUjJfU1ExMCB8IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NRUjJfU1E5ICB8IEFEQ19TUVIyX1NROCAgfCBBRENfU1FSMl9TUTcgICApOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFNRUjMgKi8KKyAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPlNRUjMsIEFEQ19TUVIzX1NRNiB8IEFEQ19TUVIzX1NRNSB8IEFEQ19TUVIzX1NRNCB8IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NRUjNfU1EzIHwgQURDX1NRUjNfU1EyIHwgQURDX1NRUjNfU1ExICApOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIEpTUVIgKi8KKyAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkpTUVIsIEFEQ19KU1FSX0pMIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19KU1FSX0pTUTQgfCBBRENfSlNRUl9KU1EzIHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSlNRUl9KU1EyIHwgQURDX0pTUVJfSlNRMSAgKTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBKU1FSICovCisgICAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5KU1FSLCBBRENfSlNRUl9KTCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSlNRUl9KU1E0IHwgQURDX0pTUVJfSlNRMyB8IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0pTUVJfSlNRMiB8IEFEQ19KU1FSX0pTUTEgICk7CisgICAgCisgICAgLyogUmVzZXQgcmVnaXN0ZXIgRFIgKi8KKyAgICAvKiBiaXRzIGluIGFjY2VzcyBtb2RlIHJlYWQgb25seSwgbm8gZGlyZWN0IHJlc2V0IGFwcGxpY2FibGUqLworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVycyBKRFIxLCBKRFIyLCBKRFIzLCBKRFI0ICovCisgICAgLyogYml0cyBpbiBhY2Nlc3MgbW9kZSByZWFkIG9ubHksIG5vIGRpcmVjdCByZXNldCBhcHBsaWNhYmxlKi8KKyAgICAKKyAgICAvKiBSZXNldCBWQkFUIG1lYXN1cmVtZW50IHBhdGgsIGluIGNhc2Ugb2YgZW5hYmxlZCBiZWZvcmUgYnkgc2VsZWN0aW5nICAgICovCisgICAgLyogY2hhbm5lbCBBRENfQ0hBTk5FTF9WQkFULiAqLworICAgIFNZU0NGRy0+Q0ZHUjEgJj0gfihTWVNDRkdfQ0ZHUjFfVkJBVCk7CisgICAgCisgICAgCisgICAgLyogPT09PT09PT09PSBIYXJkIHJlc2V0IEFEQyBwZXJpcGhlcmFsID09PT09PT09PT0gKi8KKyAgICAvKiBQZXJmb3JtcyBhIGdsb2JhbCByZXNldCBvZiB0aGUgZW50aXJlIEFEQyBwZXJpcGhlcmFsOiBBREMgc3RhdGUgaXMgICAgICovCisgICAgLyogZm9yY2VkIHRvIGEgc2ltaWxhciBzdGF0ZSBhZnRlciBkZXZpY2UgcG93ZXItb24uICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIElmIG5lZWRlZCwgY29weS1wYXN0ZSBhbmQgdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgcmVzZXQgY29kZSBpbnRvICAgICAgKi8KKyAgICAvKiBmdW5jdGlvbiAidm9pZCBIQUxfQURDX01zcEluaXQoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpIjogICAgICAgICAgICAgICovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICBfX0hBTF9SQ0NfQURDMV9GT1JDRV9SRVNFVCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgX19IQUxfUkNDX0FEQzFfUkVMRUFTRV9SRVNFVCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgCisgICAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgICBIQUxfQURDX01zcERlSW5pdChoYWRjKTsKKyAgICAKKyAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgdG8gbm9uZSAqLworICAgIEFEQ19DTEVBUl9FUlJPUkNPREUoaGFkYyk7CisgICAgCisgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgIGhhZGMtPlN0YXRlID0gSEFMX0FEQ19TVEFURV9SRVNFVDsKKyAgCisgIH0KKyAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhhZGMpOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisjZW5kaWYgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIEFEQ0V4IElucHV0IGFuZCBPdXRwdXQgb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBBREMgRXh0ZW5kZWQgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0gICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgU3RhcnQgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwLgorICAgICAgKCspIFN0b3AgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwLgorICAgICAgKCspIFBvbGwgZm9yIGNvbnZlcnNpb24gY29tcGxldGUgb24gcmVndWxhciBncm91cC4KKyAgICAgICgrKSBQb2xsIGZvciBjb252ZXJzaW9uIGV2ZW50LgorICAgICAgKCspIEdldCByZXN1bHQgb2YgcmVndWxhciBjaGFubmVsIGNvbnZlcnNpb24uCisgICAgICAoKykgU3RhcnQgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwIGFuZCBlbmFibGUgaW50ZXJydXB0aW9ucy4KKyAgICAgICgrKSBTdG9wIGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cCBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRpb25zLgorICAgICAgKCspIEhhbmRsZSBBREMgaW50ZXJydXB0IHJlcXVlc3QKKyAgICAgICgrKSBTdGFydCBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAgYW5kIGVuYWJsZSBETUEgdHJhbnNmZXIuCisgICAgICAoKykgU3RvcCBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAgYW5kIGRpc2FibGUgQURDIERNQSB0cmFuc2Zlci4KKworICAgICAgKCspIFN0YXJ0IGNvbnZlcnNpb24gb2YgaW5qZWN0ZWQgZ3JvdXAuCisgICAgICAoKykgU3RvcCBjb252ZXJzaW9uIG9mIGluamVjdGVkIGdyb3VwLgorICAgICAgKCspIFBvbGwgZm9yIGNvbnZlcnNpb24gY29tcGxldGUgb24gaW5qZWN0ZWQgZ3JvdXAuCisgICAgICAoKykgR2V0IHJlc3VsdCBvZiBpbmplY3RlZCBjaGFubmVsIGNvbnZlcnNpb24uCisgICAgICAoKykgU3RhcnQgY29udmVyc2lvbiBvZiBpbmplY3RlZCBncm91cCBhbmQgZW5hYmxlIGludGVycnVwdGlvbnMuCisgICAgICAoKykgU3RvcCBjb252ZXJzaW9uIG9mIGluamVjdGVkIGdyb3VwIGFuZCBkaXNhYmxlIGludGVycnVwdGlvbnMuCisKKyAgICAgICgrKSBTdGFydCBtdWx0aW1vZGUgYW5kIGVuYWJsZSBETUEgdHJhbnNmZXIuCisgICAgICAoKykgU3RvcCBtdWx0aW1vZGUgYW5kIGRpc2FibGUgQURDIERNQSB0cmFuc2Zlci4KKyAgICAgICgrKSBHZXQgcmVzdWx0IG9mIG11bHRpbW9kZSBjb252ZXJzaW9uLgorCisgICAgICAoKykgUGVyZm9ybSB0aGUgQURDIHNlbGYtY2FsaWJyYXRpb24gZm9yIHNpbmdsZSBvciBkaWZmZXJlbnRpYWwgZW5kaW5nLgorICAgICAgKCspIEdldCBjYWxpYnJhdGlvbiBmYWN0b3JzIGZvciBzaW5nbGUgb3IgZGlmZmVyZW50aWFsIGVuZGluZy4KKyAgICAgICgrKSBTZXQgY2FsaWJyYXRpb24gZmFjdG9ycyBmb3Igc2luZ2xlIG9yIGRpZmZlcmVudGlhbCBlbmRpbmcuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisgIAorI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgQURDLCBzdGFydHMgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwLgorICAqICAgICAgICAgSW50ZXJydXB0aW9ucyBlbmFibGVkIGluIHRoaXMgZnVuY3Rpb246IE5vbmUuCisgICogQG5vdGUgICBDYXNlIG9mIG11bHRpbW9kZSBlbmFibGVkIChmb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDcyk6CisgICogICAgICAgICBpZiBBREMgaXMgc2xhdmUsIEFEQyBpcyBlbmFibGVkIG9ubHkgKGNvbnZlcnNpb24gaXMgbm90IHN0YXJ0ZWQpLgorICAqICAgICAgICAgaWYgQURDIGlzIG1hc3RlciwgQURDIGlzIGVuYWJsZWQgYW5kIG11bHRpbW9kZSBjb252ZXJzaW9uIGlzIHN0YXJ0ZWQuCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RhcnQoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIFBlcmZvcm0gQURDIGVuYWJsZSBhbmQgY29udmVyc2lvbiBzdGFydCBpZiBubyBjb252ZXJzaW9uIGlzIG9uIGdvaW5nICovCisgIGlmIChBRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX1JFR1VMQVIoaGFkYykgPT0gUkVTRVQpCisgIHsKKyAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGFkYyk7CisgICAgCisgICAgLyogRW5hYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLworICAgIHRtcF9oYWxfc3RhdHVzID0gQURDX0VuYWJsZShoYWRjKTsKKyAgICAKKyAgICAvKiBTdGFydCBjb252ZXJzaW9uIGlmIEFEQyBpcyBlZmZlY3RpdmVseSBlbmFibGVkICovCisgICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBTZXQgQURDIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogLSBDbGVhciBzdGF0ZSBiaXRmaWVsZCByZWxhdGVkIHRvIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiByZXN1bHRzICAgKi8KKyAgICAgIC8qIC0gU2V0IHN0YXRlIGJpdGZpZWxkIHJlbGF0ZWQgdG8gcmVndWxhciBvcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICovCisgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkgfCBIQUxfQURDX1NUQVRFX1JFR19FT0MgfCBIQUxfQURDX1NUQVRFX1JFR19PVlIgfCBIQUxfQURDX1NUQVRFX1JFR19FT1NNUCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpOworICAgICAgCisgICAgICAvKiBTZXQgZ3JvdXAgaW5qZWN0ZWQgc3RhdGUgKGZyb20gYXV0by1pbmplY3Rpb24pIGFuZCBtdWx0aW1vZGUgc3RhdGUgICAqLworICAgICAgLyogZm9yIGFsbCBjYXNlcyBvZiBtdWx0aW1vZGU6IGluZGVwZW5kZW50IG1vZGUsIG11bHRpbW9kZSBBREMgbWFzdGVyICAgKi8KKyAgICAgIC8qIG9yIG11bHRpbW9kZSBBREMgc2xhdmUgKGZvciBkZXZpY2VzIHdpdGggc2V2ZXJhbCBBRENzKTogICAgICAgICAgICAgICovCisgICAgICBpZiAoQURDX05PTk1VTFRJTU9ERV9PUl9NVUxUSU1PREVNQVNURVIoaGFkYykpCisgICAgICB7CisgICAgICAgIC8qIFNldCBBREMgc3RhdGUgKEFEQyBpbmRlcGVuZGVudCBvciBtYXN0ZXIpICovCisgICAgICAgIENMRUFSX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9NVUxUSU1PREVfU0xBVkUpOworICAgICAgICAKKyAgICAgICAgLyogSWYgY29udmVyc2lvbnMgb24gZ3JvdXAgcmVndWxhciBhcmUgYWxzbyB0cmlnZ2VyaW5nIGdyb3VwIGluamVjdGVkLCovCisgICAgICAgIC8qIHVwZGF0ZSBBREMgc3RhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBpZiAoUkVBRF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0pBVVRPKSAhPSBSRVNFVCkKKyAgICAgICAgeworICAgICAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9FT0MsIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpOyAgCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogU2V0IEFEQyBzdGF0ZSAoQURDIHNsYXZlKSAqLworICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX01VTFRJTU9ERV9TTEFWRSk7CisgICAgICAgIAorICAgICAgICAvKiBJZiBjb252ZXJzaW9ucyBvbiBncm91cCByZWd1bGFyIGFyZSBhbHNvIHRyaWdnZXJpbmcgZ3JvdXAgaW5qZWN0ZWQsKi8KKyAgICAgICAgLyogdXBkYXRlIEFEQyBzdGF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIGlmIChBRENfTVVMVElNT0RFX0FVVE9fSU5KRUNURUQoaGFkYykpCisgICAgICAgIHsKKyAgICAgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfRU9DLCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgCisgICAgICAvKiBTdGF0ZSBtYWNoaW5lIHVwZGF0ZTogQ2hlY2sgaWYgYW4gaW5qZWN0ZWQgY29udmVyc2lvbiBpcyBvbmdvaW5nICovCisgICAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpKQorICAgICAgeworICAgICAgICAvKiBSZXNldCBBREMgZXJyb3IgY29kZSBmaWVsZHMgcmVsYXRlZCB0byBjb252ZXJzaW9ucyBvbiBncm91cCByZWd1bGFyKi8KKyAgICAgICAgQ0xFQVJfQklUKGhhZGMtPkVycm9yQ29kZSwgKEhBTF9BRENfRVJST1JfT1ZSIHwgSEFMX0FEQ19FUlJPUl9ETUEpKTsgICAgICAgICAKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogUmVzZXQgQURDIGFsbCBlcnJvciBjb2RlIGZpZWxkcyAqLworICAgICAgICBBRENfQ0xFQVJfRVJST1JDT0RFKGhhZGMpOworICAgICAgfQorICAgICAgCisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAvKiBVbmxvY2sgYmVmb3JlIHN0YXJ0aW5nIEFEQyBjb252ZXJzaW9uczogaW4gY2FzZSBvZiBwb3RlbnRpYWwgICAgICAgICAqLworICAgICAgLyogaW50ZXJydXB0aW9uLCB0byBsZXQgdGhlIHByb2Nlc3MgdG8gQURDIElSUSBIYW5kbGVyLiAgICAgICAgICAgICAgICAgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgICAgIAorICAgICAgLyogQ2xlYXIgcmVndWxhciBncm91cCBjb252ZXJzaW9uIGZsYWcgYW5kIG92ZXJydW4gZmxhZyAqLworICAgICAgLyogKFRvIGVuc3VyZSBvZiBubyB1bmtub3duIHN0YXRlIGZyb20gcG90ZW50aWFsIHByZXZpb3VzIEFEQyAgICAgICAgICAgKi8KKyAgICAgIC8qIG9wZXJhdGlvbnMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCAoQURDX0ZMQUdfRU9DIHwgQURDX0ZMQUdfRU9TIHwgQURDX0ZMQUdfT1ZSKSk7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiBJZiBzb2Z0d2FyZSBzdGFydCBoYXMgYmVlbiBzZWxlY3RlZCwgY29udmVyc2lvbiBzdGFydHMgaW1tZWRpYXRlbHkuICAqLworICAgICAgLyogSWYgZXh0ZXJuYWwgdHJpZ2dlciBoYXMgYmVlbiBzZWxlY3RlZCwgY29udmVyc2lvbiB3aWxsIHN0YXJ0IGF0IG5leHQgKi8KKyAgICAgIC8qIHRyaWdnZXIgZXZlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiBDYXNlIG9mIG11bHRpbW9kZSBlbmFibGVkIChmb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDcyk6ICAgICAgICAgICAqLworICAgICAgLyogIC0gaWYgQURDIGlzIHNsYXZlLCBBREMgaXMgZW5hYmxlZCBvbmx5IChjb252ZXJzaW9uIGlzIG5vdCBzdGFydGVkKS4gKi8KKyAgICAgIC8qICAtIGlmIEFEQyBpcyBtYXN0ZXIsIEFEQyBpcyBlbmFibGVkIGFuZCBjb252ZXJzaW9uIGlzIHN0YXJ0ZWQuICAgICAgICovCisgICAgICBpZiAoQURDX05PTk1VTFRJTU9ERV9SRUdfT1JfTVVMVElNT0RFTUFTVEVSKGhhZGMpKQorICAgICAgeworICAgICAgICBTRVRfQklUKGhhZGMtPkluc3RhbmNlLT5DUiwgQURDX0NSX0FEU1RBUlQpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9CVVNZOworICB9CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKy8qKgorICAqIEBicmllZiAgRW5hYmxlcyBBREMsIHN0YXJ0cyBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAuCisgICogICAgICAgICBJbnRlcnJ1cHRpb25zIGVuYWJsZWQgaW4gdGhpcyBmdW5jdGlvbjogTm9uZS4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19TdGFydChBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXMgPSBIQUxfT0s7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoYWRjKTsKKyAgIAorICAvKiBFbmFibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovCisgIHRtcF9oYWxfc3RhdHVzID0gQURDX0VuYWJsZShoYWRjKTsKKyAgCisgIC8qIFN0YXJ0IGNvbnZlcnNpb24gaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGVuYWJsZWQgKi8KKyAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykKKyAgeworICAgIC8qIFNldCBBREMgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAtIENsZWFyIHN0YXRlIGJpdGZpZWxkIHJlbGF0ZWQgdG8gcmVndWxhciBncm91cCBjb252ZXJzaW9uIHJlc3VsdHMgICAgICovCisgICAgLyogLSBTZXQgc3RhdGUgYml0ZmllbGQgcmVsYXRlZCB0byByZWd1bGFyIG9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAqLworICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkgfCBIQUxfQURDX1NUQVRFX1JFR19FT0MsCisgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSk7CisgICAgCisgICAgLyogU2V0IGdyb3VwIGluamVjdGVkIHN0YXRlIChmcm9tIGF1dG8taW5qZWN0aW9uKSAqLworICAgIC8qIElmIGNvbnZlcnNpb25zIG9uIGdyb3VwIHJlZ3VsYXIgYXJlIGFsc28gdHJpZ2dlcmluZyBncm91cCBpbmplY3RlZCwgICAgKi8KKyAgICAvKiB1cGRhdGUgQURDIHN0YXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKFJFQURfQklUKGhhZGMtPkluc3RhbmNlLT5DUjEsIEFEQ19DUjFfSkFVVE8pICE9IFJFU0VUKQorICAgIHsKKyAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9FT0MsIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpOyAgCisgICAgfQorICAgIAorICAgIC8qIFN0YXRlIG1hY2hpbmUgdXBkYXRlOiBDaGVjayBpZiBhbiBpbmplY3RlZCBjb252ZXJzaW9uIGlzIG9uZ29pbmcgKi8KKyAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpKQorICAgIHsKKyAgICAgIC8qIFJlc2V0IEFEQyBlcnJvciBjb2RlIGZpZWxkcyByZWxhdGVkIHRvIGNvbnZlcnNpb25zIG9uIGdyb3VwIHJlZ3VsYXIgKi8KKyAgICAgIENMRUFSX0JJVChoYWRjLT5FcnJvckNvZGUsIChIQUxfQURDX0VSUk9SX09WUiB8IEhBTF9BRENfRVJST1JfRE1BKSk7ICAgICAgICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBSZXNldCBBREMgYWxsIGVycm9yIGNvZGUgZmllbGRzICovCisgICAgICBBRENfQ0xFQVJfRVJST1JDT0RFKGhhZGMpOworICAgIH0KKyAgICAKKyAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgLyogVW5sb2NrIGJlZm9yZSBzdGFydGluZyBBREMgY29udmVyc2lvbnM6IGluIGNhc2Ugb2YgcG90ZW50aWFsICAgICAgICAgICAqLworICAgIC8qIGludGVycnVwdGlvbiwgdG8gbGV0IHRoZSBwcm9jZXNzIHRvIEFEQyBJUlEgSGFuZGxlci4gICAgICAgICAgICAgICAgICAgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgICAgCisgICAgLyogQ2xlYXIgcmVndWxhciBncm91cCBjb252ZXJzaW9uIGZsYWcgYW5kIG92ZXJydW4gZmxhZyAqLworICAgIC8qIChUbyBlbnN1cmUgb2Ygbm8gdW5rbm93biBzdGF0ZSBmcm9tIHBvdGVudGlhbCBwcmV2aW91cyBBREMgb3BlcmF0aW9ucykgKi8KKyAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19FT0MpOworICAgIAorICAgIC8qIEVuYWJsZSBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBJZiBzb2Z0d2FyZSBzdGFydCBoYXMgYmVlbiBzZWxlY3RlZCwgY29udmVyc2lvbiBzdGFydHMgaW1tZWRpYXRlbHkuICAgICovCisgICAgLyogSWYgZXh0ZXJuYWwgdHJpZ2dlciBoYXMgYmVlbiBzZWxlY3RlZCwgY29udmVyc2lvbiB3aWxsIHN0YXJ0IGF0IG5leHQgICAqLworICAgIC8qIHRyaWdnZXIgZXZlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBOb3RlOiBBbHRlcm5hdGUgdHJpZ2dlciBmb3Igc2luZ2xlIGNvbnZlcnNpb24gY291bGQgYmUgdG8gZm9yY2UgYW4gICAgICovCisgICAgLyogICAgICAgYWRkaXRpb25hbCBzZXQgb2YgYml0IEFET04gImhhZGMtPkluc3RhbmNlLT5DUjIgfD0gQURDX0NSMl9BRE9OOyIqLworICAgIGlmIChBRENfSVNfU09GVFdBUkVfU1RBUlRfUkVHVUxBUihoYWRjKSkKKyAgICB7CisgICAgICAvKiBTdGFydCBBREMgY29udmVyc2lvbiBvbiByZWd1bGFyIGdyb3VwIHdpdGggU1cgc3RhcnQgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNSMiwgKEFEQ19DUjJfU1dTVEFSVCB8IEFEQ19DUjJfRVhUVFJJRykpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogU3RhcnQgQURDIGNvbnZlcnNpb24gb24gcmVndWxhciBncm91cCB3aXRoIGV4dGVybmFsIHRyaWdnZXIgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNSMiwgQURDX0NSMl9FWFRUUklHKTsKKyAgICB9CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKy8qKgorICAqIEBicmllZiAgU3RvcCBBREMgY29udmVyc2lvbiBvZiBib3RoIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZCwKKyAgKiAgICAgICAgIGRpc2FibGUgQURDIHBlcmlwaGVyYWwuCisgICogQG5vdGUgICBBREMgcGVyaXBoZXJhbCBkaXNhYmxlIGlzIGZvcmNpbmcgaW50ZXJydXB0aW9uIG9mIHBvdGVudGlhbCAKKyAgKiAgICAgICAgIGNvbnZlcnNpb24gb24gaW5qZWN0ZWQgZ3JvdXAuIElmIGluamVjdGVkIGdyb3VwIGlzIHVuZGVyIHVzZSwKKyAgKiAgICAgICAgIGl0IHNob3VsZCBiZSBwcmVsaW1pbmFyaWx5IHN0b3BwZWQgdXNpbmcgZnVuY3Rpb24KKyAgKiAgICAgICAgIEByZWYgSEFMX0FEQ0V4X0luamVjdGVkU3RvcCgpLgorICAqICAgICAgICAgVG8gc3RvcCBBREMgY29udmVyc2lvbiBvbmx5IG9uIEFEQyBncm91cCByZWd1bGFyCisgICogICAgICAgICB3aGlsZSBsZXR0aW5nIEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9ucyBydW5uaW5nLAorICAqICAgICAgICAgdXNlIGZ1bmN0aW9uIEByZWYgSEFMX0FEQ0V4X1JlZ3VsYXJTdG9wKCkuCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMuCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1N0b3AoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGFkYyk7CisgIAorICAvKiAxLiBTdG9wIHBvdGVudGlhbCBjb252ZXJzaW9uIG9uIGdvaW5nLCBvbiByZWd1bGFyIGFuZCBpbmplY3RlZCBncm91cHMgKi8KKyAgdG1wX2hhbF9zdGF0dXMgPSBBRENfQ29udmVyc2lvblN0b3AoaGFkYywgQURDX1JFR1VMQVJfSU5KRUNURURfR1JPVVApOworICAKKyAgLyogRGlzYWJsZSBBREMgcGVyaXBoZXJhbCBpZiBjb252ZXJzaW9ucyBhcmUgZWZmZWN0aXZlbHkgc3RvcHBlZCAqLworICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgLyogMi4gRGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgKi8KKyAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19EaXNhYmxlKGhhZGMpOworICAgIAorICAgIC8qIENoZWNrIGlmIEFEQyBpcyBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLworICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19CVVNZIHwgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICAgIH0KKyAgfQorCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhhZGMpOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgQURDIGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cCAoYW5kIGluamVjdGVkIGNoYW5uZWxzIGluIAorICAqICAgICAgICAgY2FzZSBvZiBhdXRvX2luamVjdGlvbiBtb2RlKSwgZGlzYWJsZSBBREMgcGVyaXBoZXJhbC4KKyAgKiBAbm90ZSAgIEFEQyBwZXJpcGhlcmFsIGRpc2FibGUgaXMgZm9yY2luZyBpbnRlcnJ1cHRpb24gb2YgcG90ZW50aWFsIAorICAqICAgICAgICAgY29udmVyc2lvbiBvbiBpbmplY3RlZCBncm91cC4gSWYgaW5qZWN0ZWQgZ3JvdXAgaXMgdW5kZXIgdXNlLCBpdAorICAqICAgICAgICAgc2hvdWxkIGJlIHByZWxpbWluYXJpbHkgc3RvcHBlZCB1c2luZyBIQUxfQURDRXhfSW5qZWN0ZWRTdG9wIGZ1bmN0aW9uLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzLgorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19TdG9wKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1cyA9IEhBTF9PSzsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgICAgIAorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhhZGMpOworICAKKyAgLyogU3RvcCBwb3RlbnRpYWwgY29udmVyc2lvbiBvbiBnb2luZywgb24gcmVndWxhciBhbmQgaW5qZWN0ZWQgZ3JvdXBzICovCisgIC8qIERpc2FibGUgQURDIHBlcmlwaGVyYWwgKi8KKyAgdG1wX2hhbF9zdGF0dXMgPSBBRENfQ29udmVyc2lvblN0b3BfRGlzYWJsZShoYWRjKTsKKyAgCisgIC8qIENoZWNrIGlmIEFEQyBpcyBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLworICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kgfCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZLAorICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICB9CisgIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorI2VuZGlmIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorLyoqCisgICogQGJyaWVmICBXYWl0IGZvciByZWd1bGFyIGdyb3VwIGNvbnZlcnNpb24gdG8gYmUgY29tcGxldGVkLgorICAqIEBub3RlICAgQURDIGNvbnZlcnNpb24gZmxhZ3MgRU9TIChlbmQgb2Ygc2VxdWVuY2UpIGFuZCBFT0MgKGVuZCBvZgorICAqICAgICAgICAgY29udmVyc2lvbikgYXJlIGNsZWFyZWQgYnkgdGhpcyBmdW5jdGlvbiwgd2l0aCBhbiBleGNlcHRpb246CisgICogICAgICAgICBpZiBsb3cgcG93ZXIgZmVhdHVyZSAiTG93UG93ZXJBdXRvV2FpdCIgaXMgZW5hYmxlZCwgZmxhZ3MgYXJlIAorICAqICAgICAgICAgbm90IGNsZWFyZWQgdG8gbm90IGludGVyZmVyZSB3aXRoIHRoaXMgZmVhdHVyZSB1bnRpbCBkYXRhIHJlZ2lzdGVyCisgICogICAgICAgICBpcyByZWFkIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfR2V0VmFsdWUoKS4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIHVzZWQgaW4gYSBwYXJ0aWN1bGFyIHNldHVwOiBBREMgY29uZmlndXJlZCAKKyAgKiAgICAgICAgIGluIERNQSBtb2RlIGFuZCBwb2xsaW5nIGZvciBlbmQgb2YgZWFjaCBjb252ZXJzaW9uIChBREMgaW5pdAorICAqICAgICAgICAgcGFyYW1ldGVyICJFT0NTZWxlY3Rpb24iIHNldCB0byBBRENfRU9DX1NJTkdMRV9DT05WKS4KKyAgKiAgICAgICAgIEluIHRoaXMgY2FzZSwgRE1BIHJlc2V0cyB0aGUgZmxhZyBFT0MgYW5kIHBvbGxpbmcgY2Fubm90IGJlCisgICogICAgICAgICBwZXJmb3JtZWQgb24gZWFjaCBjb252ZXJzaW9uLiBOZXZlcnRoZWxlc3MsIHBvbGxpbmcgY2FuIHN0aWxsIAorICAqICAgICAgICAgYmUgcGVyZm9ybWVkIG9uIHRoZSBjb21wbGV0ZSBzZXF1ZW5jZSAoQURDIGluaXQKKyAgKiAgICAgICAgIHBhcmFtZXRlciAiRU9DU2VsZWN0aW9uIiBzZXQgdG8gQURDX0VPQ19TRVFfQ09OVikuCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCB2YWx1ZSBpbiBtaWxsaXNlY29uZC4KKyAgKiBAbm90ZSAgIERlcGVuZGluZyBvbiBpbml0IHBhcmFtZXRlciAiRU9DU2VsZWN0aW9uIiwgZmxhZ3MgRU9TIG9yIEVPQyBpcyAKKyAgKiAgICAgICAgIGNoZWNrZWQgYW5kIGNsZWFyZWQgZGVwZW5kaW5nIG9uIGF1dG9kZWxheSBzdGF0dXMgKGJpdCBBVVRETFkpLiAgICAgCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1BvbGxGb3JDb252ZXJzaW9uKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisgIHVpbnQzMl90IHRtcF9GbGFnX0VPQzsKKyAgQURDX0NvbW1vbl9UeXBlRGVmICp0bXBBRENfQ29tbW9uOworICB1aW50MzJfdCB0bXBfY2ZnciAgICAgPSAweDBVOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKworLyogSWYgZW5kIG9mIGNvbnZlcnNpb24gc2VsZWN0ZWQgdG8gZW5kIG9mIHNlcXVlbmNlICovCisgIGlmIChoYWRjLT5Jbml0LkVPQ1NlbGVjdGlvbiA9PSBBRENfRU9DX1NFUV9DT05WKQorICB7CisgICAgdG1wX0ZsYWdfRU9DID0gQURDX0ZMQUdfRU9TOworICB9CisgIC8qIElmIGVuZCBvZiBjb252ZXJzaW9uIHNlbGVjdGVkIHRvIGVuZCBvZiBlYWNoIGNvbnZlcnNpb24gKi8KKyAgZWxzZSAvKiBBRENfRU9DX1NJTkdMRV9DT05WICovCisgIHsKKyAgICAvKiBWZXJpZmljYXRpb24gdGhhdCBBREMgY29uZmlndXJhdGlvbiBpcyBjb21wbGlhbnQgd2l0aCBwb2xsaW5nIGZvciAgICAgICovCisgICAgLyogZWFjaCBjb252ZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIFBhcnRpY3VsYXIgY2FzZSBpcyBBREMgY29uZmlndXJlZCBpbiBETUEgbW9kZSBhbmQgQURDIHNlcXVlbmNlciB3aXRoICAgKi8KKyAgICAvKiBzZXZlcmFsIHJhbmtzIGFuZCBwb2xsaW5nIGZvciBlbmQgb2YgZWFjaCBjb252ZXJzaW9uLiAgICAgICAgICAgICAgICAgICovCisgICAgLyogRm9yIGNvZGUgc2ltcGxpY2l0eSBzYWtlLCB0aGlzIHBhcnRpY3VsYXIgY2FzZSBpcyBnZW5lcmFsaXplZCB0byAgICAgICAqLworICAgIC8qIEFEQyBjb25maWd1cmVkIGluIERNQSBtb2RlIGFuZCBhbmQgcG9sbGluZyBmb3IgZW5kIG9mIGVhY2ggY29udmVyc2lvbi4gKi8KKyAgICAKKyAgICAvKiBQb2ludGVyIHRvIHRoZSBjb21tb24gY29udHJvbCByZWdpc3RlciB0byB3aGljaCBpcyBiZWxvbmdpbmcgaGFkYyAgICAgICovCisgICAgLyogKERlcGVuZGluZyBvbiBTVE0zMkYzIHByb2R1Y3QsIHRoZXJlIG1heSBoYXZlIHVwIHRvIDQgQURDIGFuZCAyIGNvbW1vbiAqLworICAgIC8qIGNvbnRyb2wgcmVnaXN0ZXJzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB0bXBBRENfQ29tbW9uID0gQURDX0NPTU1PTl9SRUdJU1RFUihoYWRjKTsKKyAgICAKKyAgICAvKiBDaGVjayBETUEgY29uZmlndXJhdGlvbiwgZGVwZW5kaW5nIG9uIE11bHRpTW9kZSBzZXQgb3Igbm90ICovCisgICAgaWYgKFJFQURfQklUKHRtcEFEQ19Db21tb24tPkNDUiwgQURDX0NDUl9NVUxUSSkgPT0gQURDX01PREVfSU5ERVBFTkRFTlQpCisgICAgeworICAgICAgaWYgKEhBTF9JU19CSVRfU0VUKGhhZGMtPkluc3RhbmNlLT5DRkdSLCBBRENfQ0ZHUl9ETUFFTikpCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0NPTkZJRyk7CisgICAgICAgIAorICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBNdWx0aU1vZGUgaXMgZW5hYmxlZCwgQ29tbW9uIENvbnRyb2wgUmVnaXN0ZXIgTURNQSBiaXRzIG11c3QgYmUgY2hlY2tlZCAqLworICAgICAgaWYgKFJFQURfQklUKHRtcEFEQ19Db21tb24tPkNDUiwgQURDX0NDUl9NRE1BKSAhPSBSRVNFVCkKKyAgICAgIHsKKyAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfQ09ORklHKTsKKyAgICAgICAgCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgdG1wX0ZsYWdfRU9DID0gKEFEQ19GTEFHX0VPQyB8IEFEQ19GTEFHX0VPUyk7CisKKyAgfQorICAKKyAgLyogR2V0IHJlbGV2YW50IHJlZ2lzdGVyIENGR1IgaW4gQURDIGluc3RhbmNlIG9mIEFEQyBtYXN0ZXIgb3Igc2xhdmUgICAgICAqLworICAvKiBpbiBmdW5jdGlvbiBvZiBtdWx0aW1vZGUgc3RhdGUgKGZvciBkZXZpY2VzIHdpdGggbXVsdGltb2RlICAgICAgICAgICAgICovCisgIC8qIGF2YWlsYWJsZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYoQURDX05PTk1VTFRJTU9ERV9PUl9NVUxUSU1PREVNQVNURVIoaGFkYykpCisgIHsKKyAgICB0bXBfY2ZnciA9IFJFQURfUkVHKGhhZGMtPkluc3RhbmNlLT5DRkdSKTsgCisgIH0KKyAgZWxzZQorICB7CisgICAgdG1wX2NmZ3IgPSBSRUFEX1JFRyhBRENfTUFTVEVSX0lOU1RBTkNFKGhhZGMpLT5DRkdSKTsKKyAgfQorICAKKyAgLyogR2V0IHRpY2sgY291bnQgKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsgIAorICAKKyAgLyogV2FpdCB1bnRpbCBFbmQgb2YgQ29udmVyc2lvbiBvciBFbmQgb2YgU2VxdWVuY2UgZmxhZyBpcyByYWlzZWQgKi8KKyAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoaGFkYy0+SW5zdGFuY2UtPklTUiwgdG1wX0ZsYWdfRU9DKSkKKyAgeworICAgIC8qIENoZWNrIGlmIHRpbWVvdXQgaXMgZGlzYWJsZWQgKHNldCB0byBpbmZpbml0ZSB3YWl0KSAqLworICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZigoVGltZW91dCA9PSAwVSkgfHwgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpKQorICAgICAgeworICAgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gdGltZW91dCAqLworICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1RJTUVPVVQpOworICAgICAgICAKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisgIAorICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgKi8KKyAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfRU9DKTsKKyAgCisgIC8qIERldGVybWluZSB3aGV0aGVyIGFueSBmdXJ0aGVyIGNvbnZlcnNpb24gdXBjb21pbmcgb24gZ3JvdXAgcmVndWxhciAgICAgICAqLworICAvKiBieSBleHRlcm5hbCB0cmlnZ2VyLCBjb250aW51b3VzIG1vZGUgb3Igc2NhbiBzZXF1ZW5jZSBvbiBnb2luZy4gICAgICAgICAgKi8KKyAgaWYoQURDX0lTX1NPRlRXQVJFX1NUQVJUX1JFR1VMQVIoaGFkYykgICAgICAgICAgICYmIAorICAgICAoUkVBRF9CSVQgKHRtcF9jZmdyLCBBRENfQ0ZHUl9DT05UKSA9PSBSRVNFVCkgICApCisgIHsKKyAgICAvKiBJZiBFbmQgb2YgU2VxdWVuY2UgaXMgcmVhY2hlZCwgZGlzYWJsZSBpbnRlcnJ1cHRzICovCisgICAgaWYoIF9fSEFMX0FEQ19HRVRfRkxBRyhoYWRjLCBBRENfRkxBR19FT1MpICkKKyAgICB7CisgICAgICAvKiBBbGxvd2VkIHRvIG1vZGlmeSBiaXRzIEFEQ19JVF9FT0MvQURDX0lUX0VPUyBvbmx5IGlmIGJpdCAgICAgICAgICAgICAqLworICAgICAgLyogQURTVEFSVD09MCAobm8gY29udmVyc2lvbiBvbiBnb2luZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIGlmIChBRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX1JFR1VMQVIoaGFkYykgPT0gUkVTRVQpCisgICAgICB7ICAgICAgICAKKyAgICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpOyAgIAorICAgICAgICAKKyAgICAgICAgaWYgKEhBTF9JU19CSVRfQ0xSKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKSkKKyAgICAgICAgeworICAgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIENoYW5nZSBBREMgc3RhdGUgdG8gZXJyb3Igc3RhdGUgKi8KKyAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOworICAgICAgICAKKyAgICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIEFEQyBJUCBpbnRlcm5hbCBlcnJvciAqLworICAgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7CisgICAgICB9CisgICAgfQorICB9CisgIAorICAvKiBDbGVhciBlbmQgb2YgY29udmVyc2lvbiBmbGFnIG9mIHJlZ3VsYXIgZ3JvdXAgaWYgbG93IHBvd2VyIGZlYXR1cmUgICAgICAgKi8KKyAgLyogIkxvd1Bvd2VyQXV0b1dhaXQgIiBpcyBkaXNhYmxlZCwgdG8gbm90IGludGVyZmVyZSB3aXRoIHRoaXMgZmVhdHVyZSAgICAgICovCisgIC8qIHVudGlsIGRhdGEgcmVnaXN0ZXIgaXMgcmVhZCB1c2luZyBmdW5jdGlvbiBIQUxfQURDX0dldFZhbHVlKCkuICAgICAgICAgICAqLworICBpZiAoUkVBRF9CSVQgKHRtcF9jZmdyLCBBRENfQ0ZHUl9BVVRETFkpID09IFJFU0VUKQorICB7CisgICAgLyogQ2xlYXIgcmVndWxhciBncm91cCBjb252ZXJzaW9uIGZsYWcgKi8KKyAgICAvKiAoRU9DIG9yIEVPUyBkZXBlbmRpbmcgb24gSEFMIEFEQyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIpICovCisgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgdG1wX0ZsYWdfRU9DKTsKKyAgfQorICAKKyAgLyogUmV0dXJuIEFEQyBzdGF0ZSAqLworICByZXR1cm4gSEFMX09LOworfQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorLyoqCisgICogQGJyaWVmICBXYWl0IGZvciByZWd1bGFyIGdyb3VwIGNvbnZlcnNpb24gdG8gYmUgY29tcGxldGVkLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgdXNlZCBpbiBhIHBhcnRpY3VsYXIgc2V0dXA6IEFEQyBjb25maWd1cmVkIAorICAqICAgICAgICAgaW4gRE1BIG1vZGUuCisgICogICAgICAgICBJbiB0aGlzIGNhc2UsIERNQSByZXNldHMgdGhlIGZsYWcgRU9DIGFuZCBwb2xsaW5nIGNhbm5vdCBiZQorICAqICAgICAgICAgcGVyZm9ybWVkIG9uIGVhY2ggY29udmVyc2lvbi4KKyAgKiBAbm90ZSAgIE9uIFNUTTMyRjM3eCBkZXZpY2VzLCBsaW1pdGF0aW9uIGluIGNhc2Ugb2Ygc2VxdWVuY2VyIGVuYWJsZWQKKyAgKiAgICAgICAgIChzZXZlcmFsIHJhbmtzIHNlbGVjdGVkKTogcG9sbGluZyBjYW5ub3QgYmUgZG9uZSBvbiBlYWNoIAorICAqICAgICAgICAgY29udmVyc2lvbiBpbnNpZGUgdGhlIHNlcXVlbmNlLiBJbiB0aGlzIGNhc2UsIHBvbGxpbmcgaXMgcmVwbGFjZWQgYnkKKyAgKiAgICAgICAgIHdhaXQgZm9yIG1heGltdW0gY29udmVyc2lvbiB0aW1lLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgdmFsdWUgaW4gbWlsbGlzZWNvbmQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1BvbGxGb3JDb252ZXJzaW9uKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisgIAorICAvKiBWYXJpYWJsZXMgZm9yIHBvbGxpbmcgaW4gY2FzZSBvZiBzY2FuIG1vZGUgZW5hYmxlZCAqLworICB1aW50MzJfdCBDb252ZXJzaW9uX1RpbWVvdXRfQ1BVX2N5Y2xlc19tYXggPSAwVTsKKyAgdWludDMyX3QgQ29udmVyc2lvbl9UaW1lb3V0X0NQVV9jeWNsZXMgPSAwVTsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIAorICAvKiBWZXJpZmljYXRpb24gdGhhdCBBREMgY29uZmlndXJhdGlvbiBpcyBjb21wbGlhbnQgd2l0aCBwb2xsaW5nIGZvciAgICAgICAgKi8KKyAgLyogZWFjaCBjb252ZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFBhcnRpY3VsYXIgY2FzZSBpcyBBREMgY29uZmlndXJlZCBpbiBETUEgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaGFkYy0+SW5zdGFuY2UtPkNSMiwgQURDX0NSMl9ETUEpKQorICB7CisgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOworICAgIAorICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgICAgCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAKKyAgLyogR2V0IHRpY2sgY291bnQgKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgCisgIC8qIFBvbGxpbmcgZm9yIGVuZCBvZiBjb252ZXJzaW9uOiBkaWZmZXJlbnRpYXRpb24gaWYgc2luZ2xlL3NlcXVlbmNlICAgICAgICAqLworICAvKiBjb252ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIC0gSWYgc2luZ2xlIGNvbnZlcnNpb24gZm9yIHJlZ3VsYXIgZ3JvdXAgKFNjYW4gbW9kZSBkaXNhYmxlZCBvciBlbmFibGVkICovCisgIC8qICAgIHdpdGggTmJyT2ZDb252ZXJzaW9uID0xVSksIGZsYWcgRU9DIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSAgICAgICAgICAgKi8KKyAgLyogICAgY29udmVyc2lvbiBjb21wbGV0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIElmIHNlcXVlbmNlIGNvbnZlcnNpb24gZm9yIHJlZ3VsYXIgZ3JvdXAgKHNjYW4gbW9kZSBlbmFibGVkIGFuZCAgICAgICAqLworICAvKiAgICBOYnJPZkNvbnZlcnNpb24gPj0yVSksIGZsYWcgRU9DIGlzIHNldCBvbmx5IGF0IHRoZSBlbmQgb2YgdGhlICAgICAgICAgICovCisgIC8qICAgIHNlcXVlbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUbyBwb2xsIGZvciBlYWNoIGNvbnZlcnNpb24sIHRoZSBtYXhpbXVtIGNvbnZlcnNpb24gdGltZSBpcyBjb21wdXRlZCAgKi8KKyAgLyogICAgZnJvbSBBREMgY29udmVyc2lvbiB0aW1lIChzZWxlY3RlZCBzYW1wbGluZyB0aW1lICsgY29udmVyc2lvbiB0aW1lIG9mICovCisgIC8qICAgIDEyLjUgQURDIGNsb2NrIGN5Y2xlcykgYW5kIEFQQjIvQURDIGNsb2NrIHByZXNjYWxlcnMgKGRlcGVuZGluZyBvbiAgICAqLworICAvKiAgICBzZXR0aW5ncywgY29udmVyc2lvbiB0aW1lIHJhbmdlIGNhbiBiZSBmcm9tIDI4IHRvIDMyMjU2IENQVSBjeWNsZXMpLiAgKi8KKyAgLyogICAgQXMgZmxhZyBFT0MgaXMgbm90IHNldCBhZnRlciBlYWNoIGNvbnZlcnNpb24sIG5vIHRpbWVvdXQgc3RhdHVzIGNhbiAgICovCisgIC8qICAgIGJlIHNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZiAoSEFMX0lTX0JJVF9DTFIoaGFkYy0+SW5zdGFuY2UtPkNSMSwgQURDX0NSMV9TQ0FOKSAmJgorICAgICAgSEFMX0lTX0JJVF9DTFIoaGFkYy0+SW5zdGFuY2UtPlNRUjEsIEFEQ19TUVIxX0wpICAgICkKKyAgeworICAgIC8qIFdhaXQgdW50aWwgRW5kIG9mIENvbnZlcnNpb24gZmxhZyBpcyByYWlzZWQgKi8KKyAgICB3aGlsZShIQUxfSVNfQklUX0NMUihoYWRjLT5JbnN0YW5jZS0+U1IsIEFEQ19GTEFHX0VPQykpCisgICAgeworICAgICAgLyogQ2hlY2sgaWYgdGltZW91dCBpcyBkaXNhYmxlZCAoc2V0IHRvIGluZmluaXRlIHdhaXQpICovCisgICAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgICB7CisgICAgICAgIGlmKChUaW1lb3V0ID09IDBVKSB8fCAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gdGltZW91dCAqLworICAgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfVElNRU9VVCk7CisgICAgICAgICAgCisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgICAgICAgICAKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUmVwbGFjZSBwb2xsaW5nIGJ5IHdhaXQgZm9yIG1heGltdW0gY29udmVyc2lvbiB0aW1lICovCisgICAgLyogQ2FsY3VsYXRpb24gb2YgQ1BVIGN5Y2xlcyBjb3JyZXNwb25kaW5nIHRvIEFEQyBjb252ZXJzaW9uIGN5Y2xlcy4gICAgICAqLworICAgIC8qIFJldHJpZXZlIEFEQyBjbG9jayBwcmVzY2FsZXIgYW5kIEFEQyBtYXhpbXVtIGNvbnZlcnNpb24gY3ljbGVzIG9uIGFsbCAgKi8KKyAgICAvKiBjaGFubmVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgQ29udmVyc2lvbl9UaW1lb3V0X0NQVV9jeWNsZXNfbWF4ID0gQURDX0NMT0NLX1BSRVNDQUxFUl9SQU5HRSgpIDsKKyAgICBDb252ZXJzaW9uX1RpbWVvdXRfQ1BVX2N5Y2xlc19tYXggKj0gQURDX0NPTlZDWUNMRVNfTUFYX1JBTkdFKGhhZGMpOworICAgIAorICAgIC8qIFBvbGwgd2l0aCBtYXhpbXVtIGNvbnZlcnNpb24gdGltZSAqLworICAgIHdoaWxlKENvbnZlcnNpb25fVGltZW91dF9DUFVfY3ljbGVzIDwgQ29udmVyc2lvbl9UaW1lb3V0X0NQVV9jeWNsZXNfbWF4KQorICAgIHsKKyAgICAgIC8qIENoZWNrIGlmIHRpbWVvdXQgaXMgZGlzYWJsZWQgKHNldCB0byBpbmZpbml0ZSB3YWl0KSAqLworICAgICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgICAgeworICAgICAgICBpZigoVGltZW91dCA9PSAwVSkgfHwgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBUaW1lb3V0KSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byB0aW1lb3V0ICovCisgICAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9USU1FT1VUKTsKKyAgICAgICAgICAKKyAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgICAgICAgIAorICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgQ29udmVyc2lvbl9UaW1lb3V0X0NQVV9jeWNsZXMgKys7CisgICAgfQorICB9CisgIAorICAvKiBDbGVhciByZWd1bGFyIGdyb3VwIGNvbnZlcnNpb24gZmxhZyAqLworICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19TVFJUIHwgQURDX0ZMQUdfRU9DKTsKKyAgCisgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSAqLworICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1JFR19FT0MpOworICAKKyAgLyogRGV0ZXJtaW5lIHdoZXRoZXIgYW55IGZ1cnRoZXIgY29udmVyc2lvbiB1cGNvbWluZyBvbiBncm91cCByZWd1bGFyICAgICAgICovCisgIC8qIGJ5IGV4dGVybmFsIHRyaWdnZXIsIGNvbnRpbnVvdXMgbW9kZSBvciBzY2FuIHNlcXVlbmNlIG9uIGdvaW5nLiAgICAgICAgICAqLworICAvKiBOb3RlOiBPbiBTVE0zMkYzN3ggZGV2aWNlcywgaW4gY2FzZSBvZiBzZXF1ZW5jZXIgZW5hYmxlZCAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgKHNldmVyYWwgcmFua3Mgc2VsZWN0ZWQpLCBlbmQgb2YgY29udmVyc2lvbiBmbGFnIGlzIHJhaXNlZCAgICAgICAgICovCisgIC8qICAgICAgIGF0IHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZihBRENfSVNfU09GVFdBUkVfU1RBUlRfUkVHVUxBUihoYWRjKSAgICAgICAgJiYgCisgICAgIChoYWRjLT5Jbml0LkNvbnRpbnVvdXNDb252TW9kZSA9PSBESVNBQkxFKSAgICkKKyAgeyAgIAorICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpOyAgIAorCisgICAgaWYgKEhBTF9JU19CSVRfQ0xSKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKSkKKyAgICB7IAorICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUFEWSk7CisgICAgfQorICB9CisgIAorICAvKiBSZXR1cm4gQURDIHN0YXRlICovCisgIHJldHVybiBIQUxfT0s7Cit9CisjZW5kaWYgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisvKioKKyAgKiBAYnJpZWYgIFBvbGwgZm9yIGNvbnZlcnNpb24gZXZlbnQuCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gIEV2ZW50VHlwZSB0aGUgQURDIGV2ZW50IHR5cGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0FXRDFfRVZFTlQ6IEFEQyBBbmFsb2cgd2F0Y2hkb2cgMSBldmVudCAobWFpbiBhbmFsb2cgd2F0Y2hkb2csIHByZXNlbnQgb24gYWxsIFNUTTMyIGRldmljZXMpCisgICogICAgICAgICAgICBAYXJnIEFEQ19BV0QyX0VWRU5UOiBBREMgQW5hbG9nIHdhdGNoZG9nIDIgZXZlbnQgKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nLCBub3QgcHJlc2VudCBvbiBhbGwgU1RNMzIgZmFtaWxpZXMpCisgICogICAgICAgICAgICBAYXJnIEFEQ19BV0QzX0VWRU5UOiBBREMgQW5hbG9nIHdhdGNoZG9nIDMgZXZlbnQgKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nLCBub3QgcHJlc2VudCBvbiBhbGwgU1RNMzIgZmFtaWxpZXMpCisgICogICAgICAgICAgICBAYXJnIEFEQ19PVlJfRVZFTlQ6IEFEQyBPdmVycnVuIGV2ZW50CisgICogICAgICAgICAgICBAYXJnIEFEQ19KUU9WRl9FVkVOVDogQURDIEluamVjdGVkIGNvbnRleHQgcXVldWUgb3ZlcmZsb3cgZXZlbnQKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCB2YWx1ZSBpbiBtaWxsaXNlY29uZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfUG9sbEZvckV2ZW50KEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCBFdmVudFR5cGUsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsgCisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19FVkVOVF9UWVBFKEV2ZW50VHlwZSkpOworICAKKyAgLyogR2V0IHN0YXJ0IHRpY2sgY291bnQgKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsgIAorICAKKyAgLyogQ2hlY2sgc2VsZWN0ZWQgZXZlbnQgZmxhZyAqLworICB3aGlsZShfX0hBTF9BRENfR0VUX0ZMQUcoaGFkYywgRXZlbnRUeXBlKSA9PSBSRVNFVCkKKyAgeworICAgIC8qIENoZWNrIGlmIHRpbWVvdXQgaXMgZGlzYWJsZWQgKHNldCB0byBpbmZpbml0ZSB3YWl0KSAqLworICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZigoVGltZW91dCA9PSAwVSkgfHwgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBUaW1lb3V0KSkKKyAgICAgIHsKKyAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIHRpbWVvdXQgKi8KKyAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9USU1FT1VUKTsKKyAgICAgICAgCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIAorICBzd2l0Y2goRXZlbnRUeXBlKQorICB7CisgIC8qIEFuYWxvZyB3YXRjaGRvZyAobGV2ZWwgb3V0IG9mIHdpbmRvdykgZXZlbnQgKi8KKyAgLyogTm90ZTogSW4gY2FzZSBvZiBzZXZlcmFsIGFuYWxvZyB3YXRjaGRvZyBlbmFibGVkLCBpZiBuZWVkZWQgdG8ga25vdyAgICAgICovCisgIC8qIHdoaWNoIG9uZSB0cmlnZ2VyZWQgYW5kIG9uIHdoaWNoIEFEQ3gsIHRlc3QgQURDIHN0YXRlIG9mIGFuYWxvZyB3YXRjaGRvZyAqLworICAvKiBmbGFncyBIQUxfQURDX1NUQVRFX0FXRDEvMlUvMyB1c2luZyBmdW5jdGlvbiAiSEFMX0FEQ19HZXRTdGF0ZSgpIi4gICAgICAgICovCisgIC8qIEZvciBleGFtcGxlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIiBpZiAoSEFMX0lTX0JJVF9TRVQoSEFMX0FEQ19HZXRTdGF0ZShoYWRjMSksIEhBTF9BRENfU1RBVEVfQVdEMSkpICIgICAgKi8KKyAgLyogICIgaWYgKEhBTF9JU19CSVRfU0VUKEhBTF9BRENfR2V0U3RhdGUoaGFkYzEpLCBIQUxfQURDX1NUQVRFX0FXRDIpKSAiICAgICovCisgIC8qICAiIGlmIChIQUxfSVNfQklUX1NFVChIQUxfQURDX0dldFN0YXRlKGhhZGMxKSwgSEFMX0FEQ19TVEFURV9BV0QzKSkgIiAgICAqLworICAvKiBDaGVjayBhbmFsb2cgd2F0Y2hkb2cgMSBmbGFnICovCisgIGNhc2UgQURDX0FXRF9FVkVOVDoKKyAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9BV0QxKTsKKyAgICAgCisgICAgLyogQ2xlYXIgQURDIGFuYWxvZyB3YXRjaGRvZyBmbGFnICovCisgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfQVdEMSk7CisgICAgYnJlYWs7CisgIAorICAvKiBDaGVjayBhbmFsb2cgd2F0Y2hkb2cgMiBmbGFnICovCisgIGNhc2UgQURDX0FXRDJfRVZFTlQ6CisgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfQVdEMik7CisgICAgICAKKyAgICAvKiBDbGVhciBBREMgYW5hbG9nIHdhdGNoZG9nIGZsYWcgKi8KKyAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19BV0QyKTsKKyAgICBicmVhazsKKyAgCisgIC8qIENoZWNrIGFuYWxvZyB3YXRjaGRvZyAzIGZsYWcgKi8KKyAgY2FzZSBBRENfQVdEM19FVkVOVDoKKyAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9BV0QzKTsKKyAgICAgIAorICAgIC8qIENsZWFyIEFEQyBhbmFsb2cgd2F0Y2hkb2cgZmxhZyAqLworICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX0FXRDMpOworICAgIGJyZWFrOworICAKKyAgLyogSW5qZWN0ZWQgY29udGV4dCBxdWV1ZSBvdmVyZmxvdyBldmVudCAqLworICBjYXNlIEFEQ19KUU9WRl9FVkVOVDoKKyAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfSlFPVkYpOworICAgICAgCisgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIEluamVjdGVkIGNvbnRleHQgcXVldWUgb3ZlcmZsb3cgKi8KKyAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9KUU9WRik7CisgICAgCisgICAgLyogQ2xlYXIgQURDIEluamVjdGVkIGNvbnRleHQgcXVldWUgb3ZlcmZsb3cgZmxhZyAqLworICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX0pRT1ZGKTsKKyAgICBicmVhazsKKyAgICAgCisgIC8qIE92ZXJydW4gZXZlbnQgKi8KKyAgZGVmYXVsdDogLyogQ2FzZSBBRENfT1ZSX0VWRU5UICovCisgICAgLyogSWYgb3ZlcnJ1biBpcyBzZXQgdG8gb3ZlcndyaXRlIHByZXZpb3VzIGRhdGEsIG92ZXJydW4gZXZlbnQgaXMgbm90ICAgICAqLworICAgIC8qIGNvbnNpZGVyZWQgYXMgYW4gZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAoY2YgcmVmIG1hbnVhbCAiTWFuYWdpbmcgY29udmVyc2lvbnMgd2l0aG91dCB1c2luZyB0aGUgRE1BIGFuZCB3aXRob3V0ICovCisgICAgLyogb3ZlcnJ1biAiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmIChoYWRjLT5Jbml0Lk92ZXJydW4gPT0gQURDX09WUl9EQVRBX1BSRVNFUlZFRCkKKyAgICB7CisgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1JFR19PVlIpOworICAgICAgICAKKyAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBvdmVycnVuICovCisgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9PVlIpOworICAgIH0KKyAgICAKKyAgICAvKiBDbGVhciBBREMgT3ZlcnJ1biBmbGFnICovCisgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfT1ZSKTsKKyAgICBicmVhazsKKyAgfQorICAKKyAgLyogUmV0dXJuIEFEQyBzdGF0ZSAqLworICByZXR1cm4gSEFMX09LOworfQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorLyoqCisgICogQGJyaWVmICBQb2xsIGZvciBjb252ZXJzaW9uIGV2ZW50LgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHBhcmFtICBFdmVudFR5cGUgdGhlIEFEQyBldmVudCB0eXBlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEFEQ19BV0RfRVZFTlQ6IEFEQyBBbmFsb2cgd2F0Y2hkb2cgZXZlbnQuCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgdmFsdWUgaW4gbWlsbGlzZWNvbmQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1BvbGxGb3JFdmVudChBRENfSGFuZGxlVHlwZURlZiogaGFkYywgdWludDMyX3QgRXZlbnRUeXBlLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7IAorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfRVZFTlRfVFlQRShFdmVudFR5cGUpKTsKKyAgCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7ICAgCisgICAgICAKKyAgLyogQ2hlY2sgc2VsZWN0ZWQgZXZlbnQgZmxhZyAqLworICB3aGlsZShfX0hBTF9BRENfR0VUX0ZMQUcoaGFkYywgRXZlbnRUeXBlKSA9PSBSRVNFVCkKKyAgeworICAgIC8qIENoZWNrIGlmIHRpbWVvdXQgaXMgZGlzYWJsZWQgKHNldCB0byBpbmZpbml0ZSB3YWl0KSAqLworICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZigoVGltZW91dCA9PSAwVSkgfHwgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpKQorICAgICAgeworICAgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gdGltZW91dCAqLworICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1RJTUVPVVQpOworICAgICAgICAKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgLyogQW5hbG9nIHdhdGNoZG9nIChsZXZlbCBvdXQgb2Ygd2luZG93KSBldmVudCAqLworICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0FXRDEpOworICAgIAorICAvKiBDbGVhciBBREMgYW5hbG9nIHdhdGNoZG9nIGZsYWcgKi8KKyAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfQVdEKTsKKyAgCisgIC8qIFJldHVybiBBREMgc3RhdGUgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKy8qKgorICAqIEBicmllZiAgRW5hYmxlcyBBREMsIHN0YXJ0cyBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAgd2l0aCBpbnRlcnJ1cHRpb24uCisgICogICAgICAgICBJbnRlcnJ1cHRpb25zIGVuYWJsZWQgaW4gdGhpcyBmdW5jdGlvbjoKKyAgKiAgICAgICAgICAtIEVPQyAoZW5kIG9mIGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cCkgb3IgRU9TIChlbmQgb2YgCisgICogICAgICAgICAgICBzZXF1ZW5jZSBvZiByZWd1bGFyIGdyb3VwKSBkZXBlbmRpbmcgb24gQURDIGluaXRpYWxpemF0aW9uIAorICAqICAgICAgICAgICAgcGFyYW1ldGVyICJFT0NTZWxlY3Rpb24iCisgICogICAgICAgICAgLSBvdmVycnVuLCBkZXBlbmRpbmcgb24gQURDIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciAiT3ZlcnJ1biIKKyAgKiAgICAgICAgIEVhY2ggb2YgdGhlc2UgaW50ZXJydXB0aW9ucyBoYXMgaXRzIGRlZGljYXRlZCBjYWxsYmFjayBmdW5jdGlvbi4KKyAgKiBAbm90ZSAgIENhc2Ugb2YgbXVsdGltb2RlIGVuYWJsZWQgKGZvciBkZXZpY2VzIHdpdGggc2V2ZXJhbCBBRENzKTogVGhpcyAKKyAgKiAgICAgICAgIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGZvciBBREMgc2xhdmUgZmlyc3QsIHRoZW4gQURDIG1hc3Rlci4gCisgICogICAgICAgICBGb3IgQURDIHNsYXZlLCBBREMgaXMgZW5hYmxlZCBvbmx5IChjb252ZXJzaW9uIGlzIG5vdCBzdGFydGVkKS4gIAorICAqICAgICAgICAgRm9yIEFEQyBtYXN0ZXIsIEFEQyBpcyBlbmFibGVkIGFuZCBtdWx0aW1vZGUgY29udmVyc2lvbiBpcyBzdGFydGVkLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1N0YXJ0X0lUKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1cyA9IEhBTF9PSzsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIAorICAvKiBQZXJmb3JtIEFEQyBlbmFibGUgYW5kIGNvbnZlcnNpb24gc3RhcnQgaWYgbm8gY29udmVyc2lvbiBpcyBvbiBnb2luZyAqLworICBpZiAoQURDX0lTX0NPTlZFUlNJT05fT05HT0lOR19SRUdVTEFSKGhhZGMpID09IFJFU0VUKQorICB7CisgICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhhZGMpOworICAgIAorICAgIC8qIEVuYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgKi8KKyAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19FbmFibGUoaGFkYyk7CisgICAgCisgICAgLyogU3RhcnQgY29udmVyc2lvbiBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZW5hYmxlZCAqLworICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogU2V0IEFEQyBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qIC0gQ2xlYXIgc3RhdGUgYml0ZmllbGQgcmVsYXRlZCB0byByZWd1bGFyIGdyb3VwIGNvbnZlcnNpb24gcmVzdWx0cyAgICovCisgICAgICAvKiAtIFNldCBzdGF0ZSBiaXRmaWVsZCByZWxhdGVkIHRvIHJlZ3VsYXIgb3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICAqLworICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZIHwgSEFMX0FEQ19TVEFURV9SRUdfRU9DIHwgSEFMX0FEQ19TVEFURV9SRUdfT1ZSIHwgSEFMX0FEQ19TVEFURV9SRUdfRU9TTVAsCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19CVVNZKTsKKyAgICAgIAorICAgICAgLyogU2V0IGdyb3VwIGluamVjdGVkIHN0YXRlIChmcm9tIGF1dG8taW5qZWN0aW9uKSBhbmQgbXVsdGltb2RlIHN0YXRlICAgKi8KKyAgICAgIC8qIGZvciBhbGwgY2FzZXMgb2YgbXVsdGltb2RlOiBpbmRlcGVuZGVudCBtb2RlLCBtdWx0aW1vZGUgQURDIG1hc3RlciAgICovCisgICAgICAvKiBvciBtdWx0aW1vZGUgQURDIHNsYXZlIChmb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDcyk6ICAgICAgICAgICAgICAqLworICAgICAgaWYgKEFEQ19OT05NVUxUSU1PREVfT1JfTVVMVElNT0RFTUFTVEVSKGhhZGMpKQorICAgICAgeworICAgICAgICAvKiBTZXQgQURDIHN0YXRlIChBREMgaW5kZXBlbmRlbnQgb3IgbWFzdGVyKSAqLworICAgICAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfTVVMVElNT0RFX1NMQVZFKTsKKyAgICAgICAgCisgICAgICAgIC8qIElmIGNvbnZlcnNpb25zIG9uIGdyb3VwIHJlZ3VsYXIgYXJlIGFsc28gdHJpZ2dlcmluZyBncm91cCBpbmplY3RlZCwqLworICAgICAgICAvKiB1cGRhdGUgQURDIHN0YXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgaWYgKFJFQURfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSLCBBRENfQ0ZHUl9KQVVUTykgIT0gUkVTRVQpCisgICAgICAgIHsKKyAgICAgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfRU9DLCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKTsgIAorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFNldCBBREMgc3RhdGUgKEFEQyBzbGF2ZSkgKi8KKyAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9NVUxUSU1PREVfU0xBVkUpOworICAgICAgICAKKyAgICAgICAgLyogSWYgY29udmVyc2lvbnMgb24gZ3JvdXAgcmVndWxhciBhcmUgYWxzbyB0cmlnZ2VyaW5nIGdyb3VwIGluamVjdGVkLCovCisgICAgICAgIC8qIHVwZGF0ZSBBREMgc3RhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBpZiAoQURDX01VTFRJTU9ERV9BVVRPX0lOSkVDVEVEKGhhZGMpKQorICAgICAgICB7CisgICAgICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0VPQywgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIAorICAgICAgLyogU3RhdGUgbWFjaGluZSB1cGRhdGU6IENoZWNrIGlmIGFuIGluamVjdGVkIGNvbnZlcnNpb24gaXMgb25nb2luZyAqLworICAgICAgaWYgKEhBTF9JU19CSVRfU0VUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKSkKKyAgICAgIHsKKyAgICAgICAgLyogUmVzZXQgQURDIGVycm9yIGNvZGUgZmllbGRzIHJlbGF0ZWQgdG8gY29udmVyc2lvbnMgb24gZ3JvdXAgcmVndWxhciovCisgICAgICAgIENMRUFSX0JJVChoYWRjLT5FcnJvckNvZGUsIChIQUxfQURDX0VSUk9SX09WUiB8IEhBTF9BRENfRVJST1JfRE1BKSk7ICAgICAgICAgCisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFJlc2V0IEFEQyBhbGwgZXJyb3IgY29kZSBmaWVsZHMgKi8KKyAgICAgICAgQURDX0NMRUFSX0VSUk9SQ09ERShoYWRjKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgLyogVW5sb2NrIGJlZm9yZSBzdGFydGluZyBBREMgY29udmVyc2lvbnM6IGluIGNhc2Ugb2YgcG90ZW50aWFsICAgICAgICAgKi8KKyAgICAgIC8qIGludGVycnVwdGlvbiwgdG8gbGV0IHRoZSBwcm9jZXNzIHRvIEFEQyBJUlEgSGFuZGxlci4gICAgICAgICAgICAgICAgICovCisgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgICAgICAKKyAgICAgIC8qIENsZWFyIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiBmbGFnIGFuZCBvdmVycnVuIGZsYWcgKi8KKyAgICAgIC8qIChUbyBlbnN1cmUgb2Ygbm8gdW5rbm93biBzdGF0ZSBmcm9tIHBvdGVudGlhbCBwcmV2aW91cyBBREMgICAgICAgICAgICovCisgICAgICAvKiBvcGVyYXRpb25zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgKEFEQ19GTEFHX0VPQyB8IEFEQ19GTEFHX0VPUyB8IEFEQ19GTEFHX09WUikpOworICAgICAgCisgICAgICAvKiBFbmFibGUgQURDIGVuZCBvZiBjb252ZXJzaW9uIGludGVycnVwdCAqLworICAgICAgLyogRW5hYmxlIEFEQyBvdmVycnVuIGludGVycnVwdCAqLyAgCisgICAgICBzd2l0Y2goaGFkYy0+SW5pdC5FT0NTZWxlY3Rpb24pCisgICAgICB7CisgICAgICAgIGNhc2UgQURDX0VPQ19TRVFfQ09OVjogCisgICAgICAgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX0VPQyk7CisgICAgICAgICAgX19IQUxfQURDX0VOQUJMRV9JVChoYWRjLCAoQURDX0lUX0VPUykpOworICAgICAgICAgIGJyZWFrOworICAgICAgICAvKiBjYXNlIEFEQ19FT0NfU0lOR0xFX0NPTlYgKi8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBfX0hBTF9BRENfRU5BQkxFX0lUKGhhZGMsIChBRENfSVRfRU9DIHwgQURDX0lUX0VPUykpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvKiBJZiBvdmVycnVuIGlzIHNldCB0byBvdmVyd3JpdGUgcHJldmlvdXMgZGF0YSAoZGVmYXVsdCBzZXR0aW5nKSwgICAgICAqLworICAgICAgLyogb3ZlcnJ1biBpbnRlcnJ1cHQgaXMgbm90IGFjdGl2YXRlZCAob3ZlcnJ1biBldmVudCBpcyBub3QgY29uc2lkZXJlZCAgKi8KKyAgICAgIC8qIGFzIGFuIGVycm9yKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAoY2YgcmVmIG1hbnVhbCAiTWFuYWdpbmcgY29udmVyc2lvbnMgd2l0aG91dCB1c2luZyB0aGUgRE1BIGFuZCAgICAgICAqLworICAgICAgLyogd2l0aG91dCBvdmVycnVuICIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIGlmIChoYWRjLT5Jbml0Lk92ZXJydW4gPT0gQURDX09WUl9EQVRBX1BSRVNFUlZFRCkKKyAgICAgIHsKKyAgICAgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX09WUik7CisgICAgICB9CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiBJZiBzb2Z0d2FyZSBzdGFydCBoYXMgYmVlbiBzZWxlY3RlZCwgY29udmVyc2lvbiBzdGFydHMgaW1tZWRpYXRlbHkuICAqLworICAgICAgLyogSWYgZXh0ZXJuYWwgdHJpZ2dlciBoYXMgYmVlbiBzZWxlY3RlZCwgY29udmVyc2lvbiB3aWxsIHN0YXJ0IGF0IG5leHQgKi8KKyAgICAgIC8qIHRyaWdnZXIgZXZlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiBDYXNlIG9mIG11bHRpbW9kZSBlbmFibGVkIChmb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDcyk6ICAgICAgICAgICAqLworICAgICAgLyogIC0gaWYgQURDIGlzIHNsYXZlLCBBREMgaXMgZW5hYmxlZCBvbmx5IChjb252ZXJzaW9uIGlzIG5vdCBzdGFydGVkKS4gKi8KKyAgICAgIC8qICAtIGlmIEFEQyBpcyBtYXN0ZXIsIEFEQyBpcyBlbmFibGVkIGFuZCBjb252ZXJzaW9uIGlzIHN0YXJ0ZWQuICAgICAgICovCisgICAgICBpZiAoQURDX05PTk1VTFRJTU9ERV9SRUdfT1JfTVVMVElNT0RFTUFTVEVSKGhhZGMpKQorICAgICAgeworICAgICAgICBTRVRfQklUKGhhZGMtPkluc3RhbmNlLT5DUiwgQURDX0NSX0FEU1RBUlQpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9CVVNZOworICB9CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKy8qKgorICAqIEBicmllZiAgRW5hYmxlcyBBREMsIHN0YXJ0cyBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAgd2l0aCBpbnRlcnJ1cHRpb24uCisgICogICAgICAgICBJbnRlcnJ1cHRpb25zIGVuYWJsZWQgaW4gdGhpcyBmdW5jdGlvbjoKKyAgKiAgICAgICAgICAtIEVPQyAoZW5kIG9mIGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cCkKKyAgKiAgICAgICAgIEVhY2ggb2YgdGhlc2UgaW50ZXJydXB0aW9ucyBoYXMgaXRzIGRlZGljYXRlZCBjYWxsYmFjayBmdW5jdGlvbi4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19TdGFydF9JVChBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXMgPSBIQUxfT0s7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoYWRjKTsKKyAgICAKKyAgLyogRW5hYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLworICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19FbmFibGUoaGFkYyk7CisgIAorICAvKiBTdGFydCBjb252ZXJzaW9uIGlmIEFEQyBpcyBlZmZlY3RpdmVseSBlbmFibGVkICovCisgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgIHsKKyAgICAvKiBTZXQgQURDIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogLSBDbGVhciBzdGF0ZSBiaXRmaWVsZCByZWxhdGVkIHRvIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiByZXN1bHRzICAgICAqLworICAgIC8qIC0gU2V0IHN0YXRlIGJpdGZpZWxkIHJlbGF0ZWQgdG8gcmVndWxhciBvcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZIHwgSEFMX0FEQ19TVEFURV9SRUdfRU9DLAorICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpOworICAgIAorICAgIC8qIFNldCBncm91cCBpbmplY3RlZCBzdGF0ZSAoZnJvbSBhdXRvLWluamVjdGlvbikgKi8KKyAgICAvKiBJZiBjb252ZXJzaW9ucyBvbiBncm91cCByZWd1bGFyIGFyZSBhbHNvIHRyaWdnZXJpbmcgZ3JvdXAgaW5qZWN0ZWQsICAgICovCisgICAgLyogdXBkYXRlIEFEQyBzdGF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmIChSRUFEX0JJVChoYWRjLT5JbnN0YW5jZS0+Q1IxLCBBRENfQ1IxX0pBVVRPKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfRU9DLCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKTsgIAorICAgIH0KKyAgICAKKyAgICAvKiBTdGF0ZSBtYWNoaW5lIHVwZGF0ZTogQ2hlY2sgaWYgYW4gaW5qZWN0ZWQgY29udmVyc2lvbiBpcyBvbmdvaW5nICovCisgICAgaWYgKEhBTF9JU19CSVRfU0VUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKSkKKyAgICB7CisgICAgICAvKiBSZXNldCBBREMgZXJyb3IgY29kZSBmaWVsZHMgcmVsYXRlZCB0byBjb252ZXJzaW9ucyBvbiBncm91cCByZWd1bGFyICovCisgICAgICBDTEVBUl9CSVQoaGFkYy0+RXJyb3JDb2RlLCAoSEFMX0FEQ19FUlJPUl9PVlIgfCBIQUxfQURDX0VSUk9SX0RNQSkpOyAgICAgICAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogUmVzZXQgQURDIGFsbCBlcnJvciBjb2RlIGZpZWxkcyAqLworICAgICAgQURDX0NMRUFSX0VSUk9SQ09ERShoYWRjKTsKKyAgICB9CisgICAgCisgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgIC8qIFVubG9jayBiZWZvcmUgc3RhcnRpbmcgQURDIGNvbnZlcnNpb25zOiBpbiBjYXNlIG9mIHBvdGVudGlhbCAgICAgICAgICAgKi8KKyAgICAvKiBpbnRlcnJ1cHRpb24sIHRvIGxldCB0aGUgcHJvY2VzcyB0byBBREMgSVJRIEhhbmRsZXIuICAgICAgICAgICAgICAgICAgICovCisgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgIAorICAgIC8qIENsZWFyIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiBmbGFnIGFuZCBvdmVycnVuIGZsYWcgKi8KKyAgICAvKiAoVG8gZW5zdXJlIG9mIG5vIHVua25vd24gc3RhdGUgZnJvbSBwb3RlbnRpYWwgcHJldmlvdXMgQURDIG9wZXJhdGlvbnMpICovCisgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfRU9DKTsKKyAgICAKKyAgICAvKiBFbmFibGUgZW5kIG9mIGNvbnZlcnNpb24gaW50ZXJydXB0IGZvciByZWd1bGFyIGdyb3VwICovCisgICAgX19IQUxfQURDX0VOQUJMRV9JVChoYWRjLCBBRENfSVRfRU9DKTsKKyAgICAKKyAgICAvKiBFbmFibGUgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogSWYgc29mdHdhcmUgc3RhcnQgaGFzIGJlZW4gc2VsZWN0ZWQsIGNvbnZlcnNpb24gc3RhcnRzIGltbWVkaWF0ZWx5LiAgICAqLworICAgIC8qIElmIGV4dGVybmFsIHRyaWdnZXIgaGFzIGJlZW4gc2VsZWN0ZWQsIGNvbnZlcnNpb24gd2lsbCBzdGFydCBhdCBuZXh0ICAgKi8KKyAgICAvKiB0cmlnZ2VyIGV2ZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKEFEQ19JU19TT0ZUV0FSRV9TVEFSVF9SRUdVTEFSKGhhZGMpKQorICAgIHsKKyAgICAgIC8qIFN0YXJ0IEFEQyBjb252ZXJzaW9uIG9uIHJlZ3VsYXIgZ3JvdXAgd2l0aCBTVyBzdGFydCAqLworICAgICAgU0VUX0JJVChoYWRjLT5JbnN0YW5jZS0+Q1IyLCAoQURDX0NSMl9TV1NUQVJUIHwgQURDX0NSMl9FWFRUUklHKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBTdGFydCBBREMgY29udmVyc2lvbiBvbiByZWd1bGFyIGdyb3VwIHdpdGggZXh0ZXJuYWwgdHJpZ2dlciAqLworICAgICAgU0VUX0JJVChoYWRjLT5JbnN0YW5jZS0+Q1IyLCBBRENfQ1IyX0VYVFRSSUcpOworICAgIH0KKyAgfQorICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisjZW5kaWYgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgQURDIGNvbnZlcnNpb24gb2YgYm90aCBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQsCisgICogICAgICAgICBkaXNhYmxlIEFEQyBwZXJpcGhlcmFsLgorICAqICAgICAgICAgSW50ZXJydXB0aW9ucyBkaXNhYmxlZCBpbiB0aGlzIGZ1bmN0aW9uOgorICAqICAgICAgICAgIC0gRU9DIChlbmQgb2YgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwKSBhbmQgRU9TIChlbmQgb2YgCisgICogICAgICAgICAgICBzZXF1ZW5jZSBvZiByZWd1bGFyIGdyb3VwKQorICAqICAgICAgICAgIC0gb3ZlcnJ1bgorICAqIEBub3RlICAgQURDIHBlcmlwaGVyYWwgZGlzYWJsZSBpcyBmb3JjaW5nIGludGVycnVwdGlvbiBvZiBwb3RlbnRpYWwgCisgICogICAgICAgICBjb252ZXJzaW9uIG9uIGluamVjdGVkIGdyb3VwLiBJZiBpbmplY3RlZCBncm91cCBpcyB1bmRlciB1c2UsCisgICogICAgICAgICBpdCBzaG91bGQgYmUgcHJlbGltaW5hcmlseSBzdG9wcGVkIHVzaW5nIGZ1bmN0aW9uCisgICogICAgICAgICBAcmVmIEhBTF9BRENFeF9JbmplY3RlZFN0b3AoKS4KKyAgKiAgICAgICAgIFRvIHN0b3AgQURDIGNvbnZlcnNpb24gb25seSBvbiBBREMgZ3JvdXAgcmVndWxhcgorICAqICAgICAgICAgd2hpbGUgbGV0dGluZyBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbnMgcnVubmluZywKKyAgKiAgICAgICAgIHVzZSBmdW5jdGlvbiBAcmVmIEhBTF9BRENFeF9SZWd1bGFyU3RvcF9JVCgpLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzLgorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19TdG9wX0lUKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1cyA9IEhBTF9PSzsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIAorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhhZGMpOworICAKKyAgLyogMS4gU3RvcCBwb3RlbnRpYWwgY29udmVyc2lvbiBvbiBnb2luZywgb24gcmVndWxhciBhbmQgaW5qZWN0ZWQgZ3JvdXBzICovCisgIHRtcF9oYWxfc3RhdHVzID0gQURDX0NvbnZlcnNpb25TdG9wKGhhZGMsIEFEQ19SRUdVTEFSX0lOSkVDVEVEX0dST1VQKTsKKyAgCisgIC8qIERpc2FibGUgQURDIHBlcmlwaGVyYWwgaWYgY29udmVyc2lvbnMgYXJlIGVmZmVjdGl2ZWx5IHN0b3BwZWQgKi8KKyAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykKKyAgeworICAgIC8qIERpc2FibGUgQURDIGVuZCBvZiBjb252ZXJzaW9uIGludGVycnVwdCBmb3IgcmVndWxhciBncm91cCAqLworICAgIC8qIERpc2FibGUgQURDIG92ZXJydW4gaW50ZXJydXB0ICovCisgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgKEFEQ19JVF9FT0MgfCBBRENfSVRfRU9TIHwgQURDX0lUX09WUikpOworICAgIAorICAgIC8qIDIuIERpc2FibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovCisgICAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRGlzYWJsZShoYWRjKTsKKyAgICAKKyAgICAvKiBDaGVjayBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8KKyAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSB8IEhBTF9BRENfU1RBVEVfSU5KX0JVU1ksCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZKTsKKyAgICB9CisgIH0KKworICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorLyoqCisgICogQGJyaWVmICBTdG9wIEFEQyBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAgKGFuZCBpbmplY3RlZCBncm91cCBpbiAKKyAgKiAgICAgICAgIGNhc2Ugb2YgYXV0b19pbmplY3Rpb24gbW9kZSksIGRpc2FibGUgaW50ZXJydXRpb24gb2YgCisgICogICAgICAgICBlbmQtb2YtY29udmVyc2lvbiwgZGlzYWJsZSBBREMgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19TdG9wX0lUKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1cyA9IEhBTF9PSzsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgICAgIAorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhhZGMpOworICAKKyAgLyogU3RvcCBwb3RlbnRpYWwgY29udmVyc2lvbiBvbiBnb2luZywgb24gcmVndWxhciBhbmQgaW5qZWN0ZWQgZ3JvdXBzICovCisgIC8qIERpc2FibGUgQURDIHBlcmlwaGVyYWwgKi8KKyAgdG1wX2hhbF9zdGF0dXMgPSBBRENfQ29udmVyc2lvblN0b3BfRGlzYWJsZShoYWRjKTsKKyAgCisgIC8qIENoZWNrIGlmIEFEQyBpcyBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLworICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgLyogRGlzYWJsZSBBREMgZW5kIG9mIGNvbnZlcnNpb24gaW50ZXJydXB0IGZvciByZWd1bGFyIGdyb3VwICovCisgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX0VPQyk7CisgICAgCisgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kgfCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZLAorICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICB9CisgIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorI2VuZGlmIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorLyoqCisgICogQGJyaWVmICBFbmFibGVzIEFEQywgc3RhcnRzIGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cCBhbmQgdHJhbnNmZXJzIHJlc3VsdAorICAqICAgICAgICAgdGhyb3VnaCBETUEuCisgICogICAgICAgICBJbnRlcnJ1cHRpb25zIGVuYWJsZWQgaW4gdGhpcyBmdW5jdGlvbjoKKyAgKiAgICAgICAgICAtIERNQSB0cmFuc2ZlciBjb21wbGV0ZQorICAqICAgICAgICAgIC0gRE1BIGhhbGYgdHJhbnNmZXIKKyAgKiAgICAgICAgICAtIG92ZXJydW4KKyAgKiAgICAgICAgIEVhY2ggb2YgdGhlc2UgaW50ZXJydXB0aW9ucyBoYXMgaXRzIGRlZGljYXRlZCBjYWxsYmFjayBmdW5jdGlvbi4KKyAgKiBAbm90ZSAgIENhc2Ugb2YgbXVsdGltb2RlIGVuYWJsZWQgKGZvciBkZXZpY2VzIHdpdGggc2V2ZXJhbCBBRENzKTogVGhpcyAKKyAgKiAgICAgICAgIGZ1bmN0aW9uIGlzIGZvciBzaW5nbGUtQURDIG1vZGUgb25seS4gRm9yIG11bHRpbW9kZSwgdXNlIHRoZSAKKyAgKiAgICAgICAgIGRlZGljYXRlZCBNdWx0aW1vZGVTdGFydCBmdW5jdGlvbi4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEBwYXJhbSAgcERhdGEgVGhlIGRlc3RpbmF0aW9uIEJ1ZmZlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIEFEQyBwZXJpcGhlcmFsIHRvIG1lbW9yeS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RhcnRfRE1BKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCogcERhdGEsIHVpbnQzMl90IExlbmd0aCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXMgPSBIQUxfT0s7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAKKyAgLyogUGVyZm9ybSBBREMgZW5hYmxlIGFuZCBjb252ZXJzaW9uIHN0YXJ0IGlmIG5vIGNvbnZlcnNpb24gaXMgb24gZ29pbmcgKi8KKyAgaWYgKEFEQ19JU19DT05WRVJTSU9OX09OR09JTkdfUkVHVUxBUihoYWRjKSA9PSBSRVNFVCkKKyAgeworICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoYWRjKTsKKyAgICAKKyAgICAvKiBWZXJpZmljYXRpb24gaWYgbXVsdGltb2RlIGlzIGRpc2FibGVkIChmb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDKSAgICovCisgICAgLyogSWYgbXVsdGltb2RlIGlzIGVuYWJsZWQsIGRlZGljYXRlZCBmdW5jdGlvbiBtdWx0aW1vZGUgY29udmVyc2lvbiAgICAgICAqLworICAgIC8qIHN0YXJ0IERNQSBtdXN0IGJlIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZihBRENfQ09NTU9OX0NDUl9NVUxUSShoYWRjKSA9PSBSRVNFVCkKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovCisgICAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19FbmFibGUoaGFkYyk7CisgICAgICAKKyAgICAgIC8qIFN0YXJ0IGNvbnZlcnNpb24gaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGVuYWJsZWQgKi8KKyAgICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIFNldCBBREMgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiAtIENsZWFyIHN0YXRlIGJpdGZpZWxkIHJlbGF0ZWQgdG8gcmVndWxhciBncm91cCBjb252ZXJzaW9uIHJlc3VsdHMgKi8KKyAgICAgICAgLyogLSBTZXQgc3RhdGUgYml0ZmllbGQgcmVsYXRlZCB0byByZWd1bGFyIG9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICovCisgICAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZIHwgSEFMX0FEQ19TVEFURV9SRUdfRU9DIHwgSEFMX0FEQ19TVEFURV9SRUdfT1ZSIHwgSEFMX0FEQ19TVEFURV9SRUdfRU9TTVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpOworICAgICAgICAKKyAgICAgICAgLyogU2V0IGdyb3VwIGluamVjdGVkIHN0YXRlIChmcm9tIGF1dG8taW5qZWN0aW9uKSBhbmQgbXVsdGltb2RlIHN0YXRlICovCisgICAgICAgIC8qIGZvciBhbGwgY2FzZXMgb2YgbXVsdGltb2RlOiBpbmRlcGVuZGVudCBtb2RlLCBtdWx0aW1vZGUgQURDIG1hc3RlciAqLworICAgICAgICAvKiBvciBtdWx0aW1vZGUgQURDIHNsYXZlIChmb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDcyk6ICAgICAgICAgICAgKi8KKyAgICAgICAgaWYgKEFEQ19OT05NVUxUSU1PREVfT1JfTVVMVElNT0RFTUFTVEVSKGhhZGMpKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IEFEQyBzdGF0ZSAoQURDIGluZGVwZW5kZW50IG9yIG1hc3RlcikgKi8KKyAgICAgICAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfTVVMVElNT0RFX1NMQVZFKTsKKyAgICAgICAgICAKKyAgICAgICAgICAvKiBJZiBjb252ZXJzaW9ucyBvbiBncm91cCByZWd1bGFyIGFyZSBhbHNvIHRyaWdnZXJpbmcgZ3JvdXAgaW5qZWN0ZWQsKi8KKyAgICAgICAgICAvKiB1cGRhdGUgQURDIHN0YXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoUkVBRF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0pBVVRPKSAhPSBSRVNFVCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfRU9DLCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKTsgIAorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZXQgQURDIHN0YXRlIChBREMgc2xhdmUpICovCisgICAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9NVUxUSU1PREVfU0xBVkUpOworICAgICAgICAgIAorICAgICAgICAgIC8qIElmIGNvbnZlcnNpb25zIG9uIGdyb3VwIHJlZ3VsYXIgYXJlIGFsc28gdHJpZ2dlcmluZyBncm91cCBpbmplY3RlZCwqLworICAgICAgICAgIC8qIHVwZGF0ZSBBREMgc3RhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgIGlmIChBRENfTVVMVElNT0RFX0FVVE9fSU5KRUNURUQoaGFkYykpCisgICAgICAgICAgeworICAgICAgICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0VPQywgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBTdGF0ZSBtYWNoaW5lIHVwZGF0ZTogQ2hlY2sgaWYgYW4gaW5qZWN0ZWQgY29udmVyc2lvbiBpcyBvbmdvaW5nICovCisgICAgICAgIGlmIChIQUxfSVNfQklUX1NFVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBSZXNldCBBREMgZXJyb3IgY29kZSBmaWVsZHMgcmVsYXRlZCB0byBjb252ZXJzaW9ucyBvbiBncm91cCByZWd1bGFyKi8KKyAgICAgICAgICBDTEVBUl9CSVQoaGFkYy0+RXJyb3JDb2RlLCAoSEFMX0FEQ19FUlJPUl9PVlIgfCBIQUxfQURDX0VSUk9SX0RNQSkpOyAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIFJlc2V0IEFEQyBhbGwgZXJyb3IgY29kZSBmaWVsZHMgKi8KKyAgICAgICAgICBBRENfQ0xFQVJfRVJST1JDT0RFKGhhZGMpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgIC8qIFVubG9jayBiZWZvcmUgc3RhcnRpbmcgQURDIGNvbnZlcnNpb25zOiBpbiBjYXNlIG9mIHBvdGVudGlhbCAgICAgICAgICovCisgICAgICAgIC8qIGludGVycnVwdGlvbiwgdG8gbGV0IHRoZSBwcm9jZXNzIHRvIEFEQyBJUlEgSGFuZGxlci4gICAgICAgICAgICAgICAgICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAvKiBTZXQgdGhlIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgICBoYWRjLT5ETUFfSGFuZGxlLT5YZmVyQ3BsdENhbGxiYWNrID0gQURDX0RNQUNvbnZDcGx0OworCisgICAgICAgIC8qIFNldCB0aGUgRE1BIGhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgICAgaGFkYy0+RE1BX0hhbmRsZS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBBRENfRE1BSGFsZkNvbnZDcGx0OworICAgICAgICAKKyAgICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgaGFkYy0+RE1BX0hhbmRsZS0+WGZlckVycm9yQ2FsbGJhY2sgPSBBRENfRE1BRXJyb3I7CisKKyAgICAgICAgICAgICAgCisgICAgICAgIC8qIE1hbmFnZSBBREMgYW5kIERNQSBzdGFydDogQURDIG92ZXJydW4gaW50ZXJydXB0aW9uLCBETUEgc3RhcnQsIEFEQyAqLworICAgICAgICAvKiBzdGFydCAoaW4gY2FzZSBvZiBTVyBzdGFydCk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgCisgICAgICAgIC8qIENsZWFyIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiBmbGFnIGFuZCBvdmVycnVuIGZsYWcgKi8KKyAgICAgICAgLyogKFRvIGVuc3VyZSBvZiBubyB1bmtub3duIHN0YXRlIGZyb20gcG90ZW50aWFsIHByZXZpb3VzIEFEQyAgICAgICAgICovCisgICAgICAgIC8qIG9wZXJhdGlvbnMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCAoQURDX0ZMQUdfRU9DIHwgQURDX0ZMQUdfRU9TIHwgQURDX0ZMQUdfT1ZSKSk7CisgICAgICAgIAorICAgICAgICAvKiBFbmFibGUgQURDIG92ZXJydW4gaW50ZXJydXB0ICovCisgICAgICAgIF9fSEFMX0FEQ19FTkFCTEVfSVQoaGFkYywgQURDX0lUX09WUik7CisgICAgICAgIAorICAgICAgICAvKiBFbmFibGUgQURDIERNQSBtb2RlICovCisgICAgICAgIFNFVF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0RNQUVOKTsKKyAgICAgICAgCisgICAgICAgIC8qIFN0YXJ0IHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgICBIQUxfRE1BX1N0YXJ0X0lUKGhhZGMtPkRNQV9IYW5kbGUsICh1aW50MzJfdCkmaGFkYy0+SW5zdGFuY2UtPkRSLCAodWludDMyX3QpcERhdGEsIExlbmd0aCk7CisgICAgICAgICAgICAgICAgIAorICAgICAgICAvKiBFbmFibGUgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogSWYgc29mdHdhcmUgc3RhcnQgaGFzIGJlZW4gc2VsZWN0ZWQsIGNvbnZlcnNpb24gc3RhcnRzIGltbWVkaWF0ZWx5LiovCisgICAgICAgIC8qIElmIGV4dGVybmFsIHRyaWdnZXIgaGFzIGJlZW4gc2VsZWN0ZWQsIGNvbnZlcnNpb24gd2lsbCBzdGFydCBhdCAgICAqLworICAgICAgICAvKiBuZXh0IHRyaWdnZXIgZXZlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgU0VUX0JJVChoYWRjLT5JbnN0YW5jZS0+Q1IsIEFEQ19DUl9BRFNUQVJUKTsKKyAgICAgICAgCisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfQlVTWTsKKyAgfQorICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgQURDLCBzdGFydHMgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwIGFuZCB0cmFuc2ZlcnMgcmVzdWx0CisgICogICAgICAgICB0aHJvdWdoIERNQS4KKyAgKiAgICAgICAgIEludGVycnVwdGlvbnMgZW5hYmxlZCBpbiB0aGlzIGZ1bmN0aW9uOgorICAqICAgICAgICAgIC0gRE1BIHRyYW5zZmVyIGNvbXBsZXRlCisgICogICAgICAgICAgLSBETUEgaGFsZiB0cmFuc2ZlcgorICAqICAgICAgICAgRWFjaCBvZiB0aGVzZSBpbnRlcnJ1cHRpb25zIGhhcyBpdHMgZGVkaWNhdGVkIGNhbGxiYWNrIGZ1bmN0aW9uLgorICAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQ3M6IFRoaXMgZnVuY3Rpb24gaXMgZm9yIHNpbmdsZS1BREMgbW9kZSAKKyAgKiAgICAgICAgIG9ubHkuIEZvciBtdWx0aW1vZGUsIHVzZSB0aGUgZGVkaWNhdGVkIE11bHRpbW9kZVN0YXJ0IGZ1bmN0aW9uLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHBhcmFtICBwRGF0YSBUaGUgZGVzdGluYXRpb24gQnVmZmVyIGFkZHJlc3MuCisgICogQHBhcmFtICBMZW5ndGggVGhlIGxlbmd0aCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gQURDIHBlcmlwaGVyYWwgdG8gbWVtb3J5LgorICAqIEByZXR2YWwgTm9uZQorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19TdGFydF9ETUEoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMsIHVpbnQzMl90KiBwRGF0YSwgdWludDMyX3QgTGVuZ3RoKQoreworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1cyA9IEhBTF9PSzsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIAorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhhZGMpOworICAgIAorICAvKiBFbmFibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovCisgIHRtcF9oYWxfc3RhdHVzID0gQURDX0VuYWJsZShoYWRjKTsKKyAgCisgIC8qIFN0YXJ0IGNvbnZlcnNpb24gaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGVuYWJsZWQgKi8KKyAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykKKyAgeworICAgIC8qIFNldCBBREMgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAtIENsZWFyIHN0YXRlIGJpdGZpZWxkIHJlbGF0ZWQgdG8gcmVndWxhciBncm91cCBjb252ZXJzaW9uIHJlc3VsdHMgICAgICovCisgICAgLyogLSBTZXQgc3RhdGUgYml0ZmllbGQgcmVsYXRlZCB0byByZWd1bGFyIG9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAqLworICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkgfCBIQUxfQURDX1NUQVRFX1JFR19FT0MsCisgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSk7CisgICAgCisgICAgLyogU2V0IGdyb3VwIGluamVjdGVkIHN0YXRlIChmcm9tIGF1dG8taW5qZWN0aW9uKSAqLworICAgIC8qIElmIGNvbnZlcnNpb25zIG9uIGdyb3VwIHJlZ3VsYXIgYXJlIGFsc28gdHJpZ2dlcmluZyBncm91cCBpbmplY3RlZCwgICAgKi8KKyAgICAvKiB1cGRhdGUgQURDIHN0YXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKFJFQURfQklUKGhhZGMtPkluc3RhbmNlLT5DUjEsIEFEQ19DUjFfSkFVVE8pICE9IFJFU0VUKQorICAgIHsKKyAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9FT0MsIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpOyAgCisgICAgfQorICAgIAorICAgIC8qIFN0YXRlIG1hY2hpbmUgdXBkYXRlOiBDaGVjayBpZiBhbiBpbmplY3RlZCBjb252ZXJzaW9uIGlzIG9uZ29pbmcgKi8KKyAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpKQorICAgIHsKKyAgICAgIC8qIFJlc2V0IEFEQyBlcnJvciBjb2RlIGZpZWxkcyByZWxhdGVkIHRvIGNvbnZlcnNpb25zIG9uIGdyb3VwIHJlZ3VsYXIgKi8KKyAgICAgIENMRUFSX0JJVChoYWRjLT5FcnJvckNvZGUsIChIQUxfQURDX0VSUk9SX09WUiB8IEhBTF9BRENfRVJST1JfRE1BKSk7ICAgICAgICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBSZXNldCBBREMgYWxsIGVycm9yIGNvZGUgZmllbGRzICovCisgICAgICBBRENfQ0xFQVJfRVJST1JDT0RFKGhhZGMpOworICAgIH0KKyAgICAKKyAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgLyogVW5sb2NrIGJlZm9yZSBzdGFydGluZyBBREMgY29udmVyc2lvbnM6IGluIGNhc2Ugb2YgcG90ZW50aWFsICAgICAgICAgICAqLworICAgIC8qIGludGVycnVwdGlvbiwgdG8gbGV0IHRoZSBwcm9jZXNzIHRvIEFEQyBJUlEgSGFuZGxlci4gICAgICAgICAgICAgICAgICAgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgICAgCisgICAgLyogU2V0IHRoZSBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBoYWRjLT5ETUFfSGFuZGxlLT5YZmVyQ3BsdENhbGxiYWNrID0gQURDX0RNQUNvbnZDcGx0OworICAgICAgIAorICAgIC8qIFNldCB0aGUgRE1BIGhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBoYWRjLT5ETUFfSGFuZGxlLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IEFEQ19ETUFIYWxmQ29udkNwbHQ7CisgICAgCisgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICBoYWRjLT5ETUFfSGFuZGxlLT5YZmVyRXJyb3JDYWxsYmFjayA9IEFEQ19ETUFFcnJvcjsKKworICAgIAorICAgIC8qIE1hbmFnZSBBREMgYW5kIERNQSBzdGFydDogQURDIG92ZXJydW4gaW50ZXJydXB0aW9uLCBETUEgc3RhcnQsIEFEQyAgICAgKi8KKyAgICAvKiBzdGFydCAoaW4gY2FzZSBvZiBTVyBzdGFydCk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgCisgICAgLyogQ2xlYXIgcmVndWxhciBncm91cCBjb252ZXJzaW9uIGZsYWcgYW5kIG92ZXJydW4gZmxhZyAqLworICAgIC8qIChUbyBlbnN1cmUgb2Ygbm8gdW5rbm93biBzdGF0ZSBmcm9tIHBvdGVudGlhbCBwcmV2aW91cyBBREMgb3BlcmF0aW9ucykgKi8KKyAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19FT0MpOworICAgIAorICAgIC8qIEVuYWJsZSBBREMgRE1BIG1vZGUgKi8KKyAgICBoYWRjLT5JbnN0YW5jZS0+Q1IyIHw9IEFEQ19DUjJfRE1BOworICAgIAorICAgIC8qIFN0YXJ0IHRoZSBETUEgY2hhbm5lbCAqLworICAgIEhBTF9ETUFfU3RhcnRfSVQoaGFkYy0+RE1BX0hhbmRsZSwgKHVpbnQzMl90KSZoYWRjLT5JbnN0YW5jZS0+RFIsICh1aW50MzJfdClwRGF0YSwgTGVuZ3RoKTsKKworICAgIC8qIEVuYWJsZSBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBJZiBzb2Z0d2FyZSBzdGFydCBoYXMgYmVlbiBzZWxlY3RlZCwgY29udmVyc2lvbiBzdGFydHMgaW1tZWRpYXRlbHkuICAgICovCisgICAgLyogSWYgZXh0ZXJuYWwgdHJpZ2dlciBoYXMgYmVlbiBzZWxlY3RlZCwgY29udmVyc2lvbiB3aWxsIHN0YXJ0IGF0IG5leHQgICAqLworICAgIC8qIHRyaWdnZXIgZXZlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBOb3RlOiBBbHRlcm5hdGUgdHJpZ2dlciBmb3Igc2luZ2xlIGNvbnZlcnNpb24gY291bGQgYmUgdG8gZm9yY2UgYW4gICAgICovCisgICAgLyogICAgICAgYWRkaXRpb25hbCBzZXQgb2YgYml0IEFET04gImhhZGMtPkluc3RhbmNlLT5DUjIgfD0gQURDX0NSMl9BRE9OOyIqLworICAgIGlmIChBRENfSVNfU09GVFdBUkVfU1RBUlRfUkVHVUxBUihoYWRjKSkKKyAgICB7CisgICAgICAvKiBTdGFydCBBREMgY29udmVyc2lvbiBvbiByZWd1bGFyIGdyb3VwIHdpdGggU1cgc3RhcnQgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNSMiwgKEFEQ19DUjJfU1dTVEFSVCB8IEFEQ19DUjJfRVhUVFJJRykpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogU3RhcnQgQURDIGNvbnZlcnNpb24gb24gcmVndWxhciBncm91cCB3aXRoIGV4dGVybmFsIHRyaWdnZXIgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNSMiwgQURDX0NSMl9FWFRUUklHKTsKKyAgICB9CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKy8qKgorICAqIEBicmllZiAgU3RvcCBBREMgY29udmVyc2lvbiBvZiBib3RoIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZCwKKyAgKiAgICAgICAgIGRpc2FibGUgQURDIERNQSB0cmFuc2ZlciwgZGlzYWJsZSBBREMgcGVyaXBoZXJhbC4KKyAgKiAgICAgICAgIEludGVycnVwdGlvbnMgZGlzYWJsZWQgaW4gdGhpcyBmdW5jdGlvbjoKKyAgKiAgICAgICAgICAtIERNQSB0cmFuc2ZlciBjb21wbGV0ZQorICAqICAgICAgICAgIC0gRE1BIGhhbGYgdHJhbnNmZXIKKyAgKiAgICAgICAgICAtIG92ZXJydW4KKyAgKiBAbm90ZSAgIEFEQyBwZXJpcGhlcmFsIGRpc2FibGUgaXMgZm9yY2luZyBpbnRlcnJ1cHRpb24gb2YgcG90ZW50aWFsIAorICAqICAgICAgICAgY29udmVyc2lvbiBvbiBpbmplY3RlZCBncm91cC4gSWYgaW5qZWN0ZWQgZ3JvdXAgaXMgdW5kZXIgdXNlLAorICAqICAgICAgICAgaXQgc2hvdWxkIGJlIHByZWxpbWluYXJpbHkgc3RvcHBlZCB1c2luZyBmdW5jdGlvbgorICAqICAgICAgICAgQHJlZiBIQUxfQURDRXhfSW5qZWN0ZWRTdG9wKCkuCisgICogICAgICAgICBUbyBzdG9wIEFEQyBjb252ZXJzaW9uIG9ubHkgb24gQURDIGdyb3VwIHJlZ3VsYXIKKyAgKiAgICAgICAgIHdoaWxlIGxldHRpbmcgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb25zIHJ1bm5pbmcsCisgICogICAgICAgICB1c2UgZnVuY3Rpb24gQHJlZiBIQUxfQURDRXhfUmVndWxhclN0b3BfRE1BKCkuCisgICogQG5vdGUgICBDYXNlIG9mIG11bHRpbW9kZSBlbmFibGVkIChmb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDcyk6IFRoaXMgCisgICogICAgICAgICBmdW5jdGlvbiBpcyBmb3Igc2luZ2xlLUFEQyBtb2RlIG9ubHkuIEZvciBtdWx0aW1vZGUsIHVzZSB0aGUgCisgICogICAgICAgICBkZWRpY2F0ZWQgTXVsdGltb2RlU3RvcCBmdW5jdGlvbi4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cy4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RvcF9ETUEoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7ICAKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXMgPSBIQUxfT0s7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGFkYyk7CisgIAorICAvKiAxLiBTdG9wIHBvdGVudGlhbCBjb252ZXJzaW9uIG9uIGdvaW5nLCBvbiByZWd1bGFyIGFuZCBpbmplY3RlZCBncm91cHMgKi8KKyAgdG1wX2hhbF9zdGF0dXMgPSBBRENfQ29udmVyc2lvblN0b3AoaGFkYywgQURDX1JFR1VMQVJfSU5KRUNURURfR1JPVVApOworICAKKyAgLyogRGlzYWJsZSBBREMgcGVyaXBoZXJhbCBpZiBjb252ZXJzaW9ucyBhcmUgZWZmZWN0aXZlbHkgc3RvcHBlZCAqLworICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgLyogRGlzYWJsZSBBREMgRE1BIChBREMgRE1BIGNvbmZpZ3VyYXRpb24gQURDX0NGR1JfRE1BQ0ZHIGlzIGtlcHQpICovCisgICAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSLCBBRENfQ0ZHUl9ETUFFTik7CisgICAgCisgICAgLyogRGlzYWJsZSB0aGUgRE1BIGNoYW5uZWwgKGluIGNhc2Ugb2YgRE1BIGluIGNpcmN1bGFyIG1vZGUgb3Igc3RvcCB3aGlsZSAqLworICAgIC8qIHdoaWxlIERNQSB0cmFuc2ZlciBpcyBvbiBnb2luZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9ETUFfQWJvcnQoaGFkYy0+RE1BX0hhbmRsZSk7ICAgCisgICAgCisgICAgLyogQ2hlY2sgaWYgRE1BIGNoYW5uZWwgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8KKyAgICBpZiAodG1wX2hhbF9zdGF0dXMgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9ETUEpOyAgICAgCisgICAgfQorICAgIAorICAgIC8qIERpc2FibGUgQURDIG92ZXJydW4gaW50ZXJydXB0ICovCisgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX09WUik7CisgICAgCisgICAgLyogMi4gRGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgKi8KKyAgICAvKiBVcGRhdGUgInRtcF9oYWxfc3RhdHVzIiBvbmx5IGlmIERNQSBjaGFubmVsIGRpc2FibGluZyBwYXNzZWQsICAgICAgICAgICovCisgICAgLyogdG8gcmV0YWluIGEgcG90ZW50aWFsIGZhaWxpbmcgc3RhdHVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRGlzYWJsZShoYWRjKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIEFEQ19EaXNhYmxlKGhhZGMpOworICAgIH0KKyAgICAKKyAgICAvKiBDaGVjayBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8KKyAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSB8IEhBTF9BRENfU1RBVEVfSU5KX0JVU1ksCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZKTsKKyAgICB9CisgICAgCisgIH0KKworICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorLyoqCisgICogQGJyaWVmICBTdG9wIEFEQyBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAgKGFuZCBpbmplY3RlZCBncm91cCBpbiAKKyAgKiAgICAgICAgIGNhc2Ugb2YgYXV0b19pbmplY3Rpb24gbW9kZSksIGRpc2FibGUgQURDIERNQSB0cmFuc2ZlciwgZGlzYWJsZSAKKyAgKiAgICAgICAgIEFEQyBwZXJpcGhlcmFsLgorICAqIEBub3RlICAgQURDIHBlcmlwaGVyYWwgZGlzYWJsZSBpcyBmb3JjaW5nIGludGVycnVwdGlvbiBvZiBwb3RlbnRpYWwgCisgICogICAgICAgICBjb252ZXJzaW9uIG9uIGluamVjdGVkIGdyb3VwLiBJZiBpbmplY3RlZCBncm91cCBpcyB1bmRlciB1c2UsIGl0CisgICogICAgICAgICBzaG91bGQgYmUgcHJlbGltaW5hcmlseSBzdG9wcGVkIHVzaW5nIEhBTF9BRENFeF9JbmplY3RlZFN0b3AgZnVuY3Rpb24uCisgICogQG5vdGUgICBGb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDczogVGhpcyBmdW5jdGlvbiBpcyBmb3Igc2luZ2xlLUFEQyBtb2RlIAorICAqICAgICAgICAgb25seS4gRm9yIG11bHRpbW9kZSwgdXNlIHRoZSBkZWRpY2F0ZWQgTXVsdGltb2RlU3RvcCBmdW5jdGlvbi4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cy4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RvcF9ETUEoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgICAgCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGFkYyk7CisgIAorICAvKiBTdG9wIHBvdGVudGlhbCBjb252ZXJzaW9uIG9uIGdvaW5nLCBvbiByZWd1bGFyIGFuZCBpbmplY3RlZCBncm91cHMgKi8KKyAgLyogRGlzYWJsZSBBREMgcGVyaXBoZXJhbCAqLworICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19Db252ZXJzaW9uU3RvcF9EaXNhYmxlKGhhZGMpOworICAKKyAgLyogQ2hlY2sgaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovCisgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgIHsKKyAgICAvKiBEaXNhYmxlIEFEQyBETUEgbW9kZSAqLworICAgIGhhZGMtPkluc3RhbmNlLT5DUjIgJj0gfkFEQ19DUjJfRE1BOworCisgICAgLyogRGlzYWJsZSB0aGUgRE1BIGNoYW5uZWwgKGluIGNhc2Ugb2YgRE1BIGluIGNpcmN1bGFyIG1vZGUgb3Igc3RvcCB3aGlsZSAqLworICAgIC8qIHdoaWxlIERNQSB0cmFuc2ZlciBpcyBvbiBnb2luZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9ETUFfQWJvcnQoaGFkYy0+RE1BX0hhbmRsZSk7CisgICAgCisgICAgLyogQ2hlY2sgaWYgRE1BIGNoYW5uZWwgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8KKyAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSB8IEhBTF9BRENfU1RBVEVfSU5KX0JVU1ksCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9ETUEpOworICAgIH0KKyAgfQorICAgIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisjZW5kaWYgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgcmVndWxhciBncm91cCBjb252ZXJzaW9uIHJlc3VsdC4KKyAgKiBAbm90ZSAgIFJlYWRpbmcgcmVnaXN0ZXIgRFIgYXV0b21hdGljYWxseSBjbGVhcnMgQURDIGZsYWcgRU9DCisgICogICAgICAgICAoQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbikuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNsZWFyIEFEQyBmbGFnIEVPUyAKKyAgKiAgICAgICAgIChBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbikuCisgICogICAgICAgICBPY2N1cnJlbmNlIG9mIGZsYWcgRU9TIHJpc2luZzoKKyAgKiAgICAgICAgICAtIElmIHNlcXVlbmNlciBpcyBjb21wb3NlZCBvZiAxIHJhbmssIGZsYWcgRU9TIGlzIGVxdWl2YWxlbnQKKyAgKiAgICAgICAgICAgIHRvIGZsYWcgRU9DLgorICAqICAgICAgICAgIC0gSWYgc2VxdWVuY2VyIGlzIGNvbXBvc2VkIG9mIHNldmVyYWwgcmFua3MsIGR1cmluZyB0aGUgc2NhbgorICAqICAgICAgICAgICAgc2VxdWVuY2UgZmxhZyBFT0Mgb25seSBpcyByYWlzZWQsIGF0IHRoZSBlbmQgb2YgdGhlIHNjYW4gc2VxdWVuY2UKKyAgKiAgICAgICAgICAgIGJvdGggZmxhZ3MgRU9DIGFuZCBFT1MgYXJlIHJhaXNlZC4KKyAgKiAgICAgICAgIFRvIGNsZWFyIHRoaXMgZmxhZywgZWl0aGVyIHVzZSBmdW5jdGlvbjogCisgICogICAgICAgICBpbiBwcm9ncmFtbWluZyBtb2RlbCBJVDogQHJlZiBIQUxfQURDX0lSUUhhbmRsZXIoKSwgaW4gcHJvZ3JhbW1pbmcKKyAgKiAgICAgICAgIG1vZGVsIHBvbGxpbmc6IEByZWYgSEFMX0FEQ19Qb2xsRm9yQ29udmVyc2lvbigpIAorICAqICAgICAgICAgb3IgQHJlZiBfX0hBTF9BRENfQ0xFQVJfRkxBRygmaGFkYywgQURDX0ZMQUdfRU9TKS4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhCisgICovCit1aW50MzJfdCBIQUxfQURDX0dldFZhbHVlKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworCisgIC8qIE5vdGU6IEFEQyBmbGFnIEVPQyBpcyBub3QgY2xlYXJlZCBoZXJlIGJ5IHNvZnR3YXJlIGJlY2F1c2UgICAgICAgICAgICAgICAqLworICAvKiAgICAgICBhdXRvbWF0aWNhbGx5IGNsZWFyZWQgYnkgaGFyZHdhcmUgd2hlbiByZWFkaW5nIHJlZ2lzdGVyIERSLiAgICAgICAgKi8KKyAgCisgIC8qIFJldHVybiBBREMgY29udmVydGVkIHZhbHVlICovIAorICByZXR1cm4gaGFkYy0+SW5zdGFuY2UtPkRSOworfQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorLyoqCisgICogQGJyaWVmICBHZXQgQURDIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiByZXN1bHQuCisgICogQG5vdGUgICBSZWFkaW5nIHJlZ2lzdGVyIERSIGF1dG9tYXRpY2FsbHkgY2xlYXJzIEFEQyBmbGFnIEVPQworICAqICAgICAgICAgKEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24pLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjbGVhciBBREMgZmxhZyBFT1MgCisgICogICAgICAgICAoQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb24pLgorICAqICAgICAgICAgT2NjdXJyZW5jZSBvZiBmbGFnIEVPUyByaXNpbmc6CisgICogICAgICAgICAgLSBJZiBzZXF1ZW5jZXIgaXMgY29tcG9zZWQgb2YgMSByYW5rLCBmbGFnIEVPUyBpcyBlcXVpdmFsZW50CisgICogICAgICAgICAgICB0byBmbGFnIEVPQy4KKyAgKiAgICAgICAgICAtIElmIHNlcXVlbmNlciBpcyBjb21wb3NlZCBvZiBzZXZlcmFsIHJhbmtzLCBkdXJpbmcgdGhlIHNjYW4KKyAgKiAgICAgICAgICAgIHNlcXVlbmNlIGZsYWcgRU9DIG9ubHkgaXMgcmFpc2VkLCBhdCB0aGUgZW5kIG9mIHRoZSBzY2FuIHNlcXVlbmNlCisgICogICAgICAgICAgICBib3RoIGZsYWdzIEVPQyBhbmQgRU9TIGFyZSByYWlzZWQuCisgICogICAgICAgICBUbyBjbGVhciB0aGlzIGZsYWcsIGVpdGhlciB1c2UgZnVuY3Rpb246IAorICAqICAgICAgICAgaW4gcHJvZ3JhbW1pbmcgbW9kZWwgSVQ6IEByZWYgSEFMX0FEQ19JUlFIYW5kbGVyKCksIGluIHByb2dyYW1taW5nCisgICogICAgICAgICBtb2RlbCBwb2xsaW5nOiBAcmVmIEhBTF9BRENfUG9sbEZvckNvbnZlcnNpb24oKSAKKyAgKiAgICAgICAgIG9yIEByZWYgX19IQUxfQURDX0NMRUFSX0ZMQUcoJmhhZGMsIEFEQ19GTEFHX0VPUykuCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gZGF0YQorICAqLwordWludDMyX3QgSEFMX0FEQ19HZXRWYWx1ZShBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKworICAvKiBOb3RlOiBFT0MgZmxhZyBpcyBub3QgY2xlYXJlZCBoZXJlIGJ5IHNvZnR3YXJlIGJlY2F1c2UgYXV0b21hdGljYWxseSAgICAgKi8KKyAgLyogICAgICAgY2xlYXJlZCBieSBoYXJkd2FyZSB3aGVuIHJlYWRpbmcgcmVnaXN0ZXIgRFIuICAgICAgICAgICAgICAgICAgICAgICovCisgIAorICAvKiBSZXR1cm4gQURDIGNvbnZlcnRlZCB2YWx1ZSAqLyAKKyAgcmV0dXJuIGhhZGMtPkluc3RhbmNlLT5EUjsKK30KKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKy8qKgorICAqIEBicmllZiAgSGFuZGxlcyBBREMgaW50ZXJydXB0IHJlcXVlc3QuICAKKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfQURDX0lSUUhhbmRsZXIoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIHVpbnQzMl90IG92ZXJydW5fZXJyb3IgPSAwVTsgLyogZmxhZyBzZXQgaWYgb3ZlcnJ1biBvY2N1cnJlbmNlIGhhcyB0byBiZSBjb25zaWRlcmVkIGFzIGFuIGVycm9yICovCisgIEFEQ19Db21tb25fVHlwZURlZiAqdG1wQURDX0NvbW1vbjsKKyAgdWludDMyX3QgdG1wX2NmZ3IgICAgID0gMHgwVTsKKyAgdWludDMyX3QgdG1wX2NmZ3JfanFtID0gMHgwVTsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKGhhZGMtPkluaXQuQ29udGludW91c0NvbnZNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfRU9DX1NFTEVDVElPTihoYWRjLT5Jbml0LkVPQ1NlbGVjdGlvbikpOworICAKKyAgLyogPT09PT09PT09PSBDaGVjayBFbmQgb2YgQ29udmVyc2lvbiBmbGFnIGZvciByZWd1bGFyIGdyb3VwID09PT09PT09PT0gKi8KKyAgaWYoIChfX0hBTF9BRENfR0VUX0ZMQUcoaGFkYywgQURDX0ZMQUdfRU9DKSAmJiBfX0hBTF9BRENfR0VUX0lUX1NPVVJDRShoYWRjLCBBRENfSVRfRU9DKSkgfHwgCisgICAgICAoX19IQUxfQURDX0dFVF9GTEFHKGhhZGMsIEFEQ19GTEFHX0VPUykgJiYgX19IQUxfQURDX0dFVF9JVF9TT1VSQ0UoaGFkYywgQURDX0lUX0VPUykpICAgKQorICB7CisgICAgLyogVXBkYXRlIHN0YXRlIG1hY2hpbmUgb24gY29udmVyc2lvbiBzdGF0dXMgaWYgbm90IGluIGVycm9yIHN0YXRlICovCisgICAgaWYgKEhBTF9JU19CSVRfQ0xSKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKSkKKyAgICB7CisgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1JFR19FT0MpOyAKKyAgICB9CisgICAgCisgICAgLyogR2V0IHJlbGV2YW50IHJlZ2lzdGVyIENGR1IgaW4gQURDIGluc3RhbmNlIG9mIEFEQyBtYXN0ZXIgb3Igc2xhdmUgICAgKi8KKyAgICAvKiBpbiBmdW5jdGlvbiBvZiBtdWx0aW1vZGUgc3RhdGUgKGZvciBkZXZpY2VzIHdpdGggbXVsdGltb2RlICAgICAgICAgICAqLworICAgIC8qIGF2YWlsYWJsZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKEFEQ19OT05NVUxUSU1PREVfUkVHX09SX01VTFRJTU9ERU1BU1RFUihoYWRjKSkKKyAgICB7CisgICAgICB0bXBfY2ZnciA9IFJFQURfUkVHKGhhZGMtPkluc3RhbmNlLT5DRkdSKTsgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB0bXBfY2ZnciA9IFJFQURfUkVHKEFEQ19NQVNURVJfSU5TVEFOQ0UoaGFkYyktPkNGR1IpOworICAgIH0KKyAgICAKKyAgICAvKiBEaXNhYmxlIGludGVycnVwdGlvbiBpZiBubyBmdXJ0aGVyIGNvbnZlcnNpb24gdXBjb21pbmcgYnkgcmVndWxhciAgICAgICovCisgICAgLyogZXh0ZXJuYWwgdHJpZ2dlciBvciBieSBjb250aW51b3VzIG1vZGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIGFuZCBpZiBzY2FuIHNlcXVlbmNlIGlmIGNvbXBsZXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZihBRENfSVNfU09GVFdBUkVfU1RBUlRfUkVHVUxBUihoYWRjKSAgICAgICAgICYmIAorICAgICAgIChSRUFEX0JJVCh0bXBfY2ZnciwgQURDX0NGR1JfQ09OVCkgPT0gUkVTRVQpICApCisgICAgeworICAgICAgLyogSWYgRW5kIG9mIFNlcXVlbmNlIGlzIHJlYWNoZWQsIGRpc2FibGUgaW50ZXJydXB0cyAqLworICAgICAgaWYoIF9fSEFMX0FEQ19HRVRfRkxBRyhoYWRjLCBBRENfRkxBR19FT1MpICkKKyAgICAgIHsKKyAgICAgICAgLyogQWxsb3dlZCB0byBtb2RpZnkgYml0cyBBRENfSVRfRU9DL0FEQ19JVF9FT1Mgb25seSBpZiBiaXQgICAgICAgICAgICovCisgICAgICAgIC8qIEFEU1RBUlQ9PTAgKG5vIGNvbnZlcnNpb24gb24gZ29pbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBpZiAoQURDX0lTX0NPTlZFUlNJT05fT05HT0lOR19SRUdVTEFSKGhhZGMpID09IFJFU0VUKQorICAgICAgICB7CisgICAgICAgICAgLyogRGlzYWJsZSBBREMgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb24gaW50ZXJydXB0ICovCisgICAgICAgICAgLyogTm90ZTogT3ZlcnJ1biBpbnRlcnJ1cHQgd2FzIGVuYWJsZWQgd2l0aCBFT0MgaW50ZXJydXB0IGluICAgICAgICAqLworICAgICAgICAgIC8qIEhBTF9TdGFydF9JVCgpLCBidXQgaXMgbm90IGRpc2FibGVkIGhlcmUgYmVjYXVzZSBjYW4gYmUgdXNlZCAgICAgKi8KKyAgICAgICAgICAvKiBieSBvdmVycnVuIElSUSBwcm9jZXNzIGJlbG93LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX0VPQyB8IEFEQ19JVF9FT1MpOworICAgICAgICAgIAorICAgICAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICAgICAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpOyAgIAorICAgICAgICAgIAorICAgICAgICAgIGlmIChIQUxfSVNfQklUX0NMUihoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSkpCisgICAgICAgICAgeworICAgICAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUFEWSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpOworICAgICAgICAKKyAgICAgICAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgdG8gQURDIElQIGludGVybmFsIGVycm9yICovCisgICAgICAgICAgU0VUX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfSU5URVJOQUwpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIENvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAvKiBOb3RlOiBpbnRvIGNhbGxiYWNrLCB0byBkZXRlcm1pbmUgaWYgY29udmVyc2lvbiBoYXMgYmVlbiB0cmlnZ2VyZWQgICAgICovCisgICAgLyogICAgICAgZnJvbSBFT0Mgb3IgRU9TLCBwb3NzaWJpbGl0eSB0byB1c2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgICAiIGlmKCBfX0hBTF9BRENfR0VUX0ZMQUcoJmhhZGMsIEFEQ19GTEFHX0VPUykpICIgICAgICAgICAgICAgICAgKi8KKyAgICAgIEhBTF9BRENfQ29udkNwbHRDYWxsYmFjayhoYWRjKTsKKworICAgIAorICAgIC8qIENsZWFyIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiBmbGFnICovCisgICAgLyogTm90ZTogaW4gY2FzZSBvZiBvdmVycnVuIHNldCB0byBBRENfT1ZSX0RBVEFfUFJFU0VSVkVELCBlbmQgb2YgICAgICAgICAqLworICAgIC8qICAgICAgIGNvbnZlcnNpb24gZmxhZ3MgY2xlYXIgaW5kdWNlcyB0aGUgcmVsZWFzZSBvZiB0aGUgcHJlc2VydmVkICAgICAgKi8KKyAgICAvKiAgICAgICBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgVGhlcmVmb3JlLCBpZiB0aGUgcHJlc2VydmVkIGRhdGEgdmFsdWUgaXMgbmVlZGVkLCBpdCBtdXN0IGJlICAgICAqLworICAgIC8qICAgICAgIHJlYWQgcHJlbGltaW5hcmlseSBpbnRvIEhBTF9BRENfQ29udkNwbHRDYWxsYmFjaygpLiAgICAgICAgICAgICAgKi8KKyAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCAoQURDX0ZMQUdfRU9DIHwgQURDX0ZMQUdfRU9TKSApOworICB9CisgIAorICAKKyAgLyogPT09PT09PT09PSBDaGVjayBFbmQgb2YgQ29udmVyc2lvbiBmbGFnIGZvciBpbmplY3RlZCBncm91cCA9PT09PT09PT09ICovCisgIGlmKCAoX19IQUxfQURDX0dFVF9GTEFHKGhhZGMsIEFEQ19GTEFHX0pFT0MpICYmIF9fSEFMX0FEQ19HRVRfSVRfU09VUkNFKGhhZGMsIEFEQ19JVF9KRU9DKSkgfHwgICAKKyAgICAgIChfX0hBTF9BRENfR0VUX0ZMQUcoaGFkYywgQURDX0ZMQUdfSkVPUykgJiYgX19IQUxfQURDX0dFVF9JVF9TT1VSQ0UoaGFkYywgQURDX0lUX0pFT1MpKSAgICkKKyAgeworICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9FT0MpOworICAgICAgICAKKyAgICAvKiBHZXQgcmVsZXZhbnQgcmVnaXN0ZXIgQ0ZHUiBpbiBBREMgaW5zdGFuY2Ugb2YgQURDIG1hc3RlciBvciBzbGF2ZSAgICAgICovCisgICAgLyogaW4gZnVuY3Rpb24gb2YgbXVsdGltb2RlIHN0YXRlIChmb3IgZGV2aWNlcyB3aXRoIG11bHRpbW9kZSAgICAgICAgICAgICAqLworICAgIC8qIGF2YWlsYWJsZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoQURDX05PTk1VTFRJTU9ERV9SRUdfT1JfTVVMVElNT0RFTUFTVEVSKGhhZGMpKQorICAgIHsKKyAgICAgIHRtcF9jZmdyID0gUkVBRF9SRUcoaGFkYy0+SW5zdGFuY2UtPkNGR1IpOyAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHRtcF9jZmdyID0gUkVBRF9SRUcoQURDX01BU1RFUl9JTlNUQU5DRShoYWRjKS0+Q0ZHUik7CisgICAgfQorICAgIAorICAgIC8qIERpc2FibGUgaW50ZXJydXB0aW9uIGlmIG5vIGZ1cnRoZXIgY29udmVyc2lvbiB1cGNvbWluZyBieSBpbmplY3RlZCAgICAgKi8KKyAgICAvKiBleHRlcm5hbCB0cmlnZ2VyIG9yIGJ5IGF1dG9tYXRpYyBpbmplY3RlZCBjb252ZXJzaW9uIHdpdGggcmVndWxhciAgICAgICovCisgICAgLyogZ3JvdXAgaGF2aW5nIG5vIGZ1cnRoZXIgY29udmVyc2lvbiB1cGNvbWluZyAoc2FtZSBjb25kaXRpb25zIGFzICAgICAgICAqLworICAgIC8qIHJlZ3VsYXIgZ3JvdXAgaW50ZXJydXB0aW9uIGRpc2FibGluZyBhYm92ZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBhbmQgaWYgaW5qZWN0ZWQgc2NhbiBzZXF1ZW5jZSBpcyBjb21wbGV0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYoQURDX0lTX1NPRlRXQVJFX1NUQVJUX0lOSkVDVEVEKGhhZGMpICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgKChSRUFEX0JJVCAodG1wX2NmZ3IsIEFEQ19DRkdSX0pBVVRPKSA9PSBSRVNFVCkgICAgJiYKKyAgICAgICAgKEFEQ19JU19TT0ZUV0FSRV9TVEFSVF9SRUdVTEFSKGhhZGMpICAgICAgICAgICYmCisgICAgICAgIChSRUFEX0JJVCAodG1wX2NmZ3IsIEFEQ19DRkdSX0NPTlQpID09IFJFU0VUKSAgICkgICApICAgKQorICAgIHsKKyAgICAgIC8qIElmIEVuZCBvZiBTZXF1ZW5jZSBpcyByZWFjaGVkLCBkaXNhYmxlIGludGVycnVwdHMgKi8KKyAgICAgIGlmKCBfX0hBTF9BRENfR0VUX0ZMQUcoaGFkYywgQURDX0ZMQUdfSkVPUykpCisgICAgICB7CisgICAgICAgIAorICAgICAgICAvKiBHZXQgcmVsZXZhbnQgcmVnaXN0ZXIgQ0ZHUiBpbiBBREMgaW5zdGFuY2Ugb2YgQURDIG1hc3RlciBvciBzbGF2ZSAgKi8KKyAgICAgICAgLyogaW4gZnVuY3Rpb24gb2YgbXVsdGltb2RlIHN0YXRlIChmb3IgZGV2aWNlcyB3aXRoIG11bHRpbW9kZSAgICAgICAgICovCisgICAgICAgIC8qIGF2YWlsYWJsZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBpZiAoQURDX05PTk1VTFRJTU9ERV9JTkpfT1JfTVVMVElNT0RFTUFTVEVSKGhhZGMpKQorICAgICAgICB7CisgICAgICAgICAgdG1wX2NmZ3JfanFtID0gUkVBRF9SRUcoaGFkYy0+SW5zdGFuY2UtPkNGR1IpOyAKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB0bXBfY2Zncl9qcW0gPSBSRUFEX1JFRyhBRENfTUFTVEVSX0lOU1RBTkNFKGhhZGMpLT5DRkdSKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyogUGFydGljdWxhciBjYXNlIGlmIGluamVjdGVkIGNvbnRleHRzIHF1ZXVlIGlzIGVuYWJsZWQ6ICAgICAgICAgICAgICovCisgICAgICAgIC8qIHdoZW4gdGhlIGxhc3QgY29udGV4dCBoYXMgYmVlbiBmdWxseSBwcm9jZXNzZWQsIEpTUVIgaXMgcmVzZXQgICAgICAqLworICAgICAgICAvKiBieSB0aGUgaGFyZHdhcmUuIEV2ZW4gaWYgbm8gaW5qZWN0ZWQgY29udmVyc2lvbiBpcyBwbGFubmVkIHRvIGNvbWUgKi8KKyAgICAgICAgLyogKHF1ZXVlIGVtcHR5LCB0cmlnZ2VycyBhcmUgaWdub3JlZCksIGl0IGNhbiBzdGFydCBhZ2FpbiAgICAgICAgICAgICovCisgICAgICAgIC8qIGltbWVkaWF0ZWx5IGFmdGVyIHNldHRpbmcgYSBuZXcgY29udGV4dCAoSkFEU1RBUlQgaXMgc3RpbGwgc2V0KS4gICAqLworICAgICAgICAvKiBUaGVyZWZvcmUsIHN0YXRlIG9mIEhBTCBBREMgaW5qZWN0ZWQgZ3JvdXAgaXMga2VwdCB0byBidXN5LiAgICAgICAgKi8KKyAgICAgICAgaWYoUkVBRF9CSVQodG1wX2NmZ3JfanFtLCBBRENfQ0ZHUl9KUU0pID09IFJFU0VUKQorICAgICAgICB7CisgICAgICAgICAgLyogQWxsb3dlZCB0byBtb2RpZnkgYml0cyBBRENfSVRfSkVPQy9BRENfSVRfSkVPUyBvbmx5IGlmIGJpdCAgICAgICAqLworICAgICAgICAgIC8qIEpBRFNUQVJUPT0wIChubyBjb252ZXJzaW9uIG9uIGdvaW5nKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoQURDX0lTX0NPTlZFUlNJT05fT05HT0lOR19JTkpFQ1RFRChoYWRjKSA9PSBSRVNFVCkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBEaXNhYmxlIEFEQyBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbiBpbnRlcnJ1cHQgICovCisgICAgICAgICAgICBfX0hBTF9BRENfRElTQUJMRV9JVChoYWRjLCBBRENfSVRfSkVPQyB8IEFEQ19JVF9KRU9TKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgICAgICAgQ0xFQVJfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKTsKKworICAgICAgICAgICAgaWYgKEhBTF9JU19CSVRfQ0xSKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1JFR19CVVNZKSkKKyAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgICAgICAKKyAgICAgICAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBBREMgSVAgaW50ZXJuYWwgZXJyb3IgKi8KKyAgICAgICAgICAgIFNFVF9CSVQoaGFkYy0+RXJyb3JDb2RlLCBIQUxfQURDX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogQ29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIC8qIE5vdGU6IGludG8gY2FsbGJhY2ssIHRvIGRldGVybWluZSBpZiBjb252ZXJzaW9uIGhhcyBiZWVuIHRyaWdnZXJlZCAgICAgKi8KKyAgICAvKiAgICAgICBmcm9tIEpFT0Mgb3IgSkVPUywgcG9zc2liaWxpdHkgdG8gdXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgICIgaWYoIF9fSEFMX0FEQ19HRVRfRkxBRygmaGFkYywgQURDX0ZMQUdfSkVPUykpICIgICAgICAgICAgICAgICAqLworICAgIEhBTF9BRENFeF9JbmplY3RlZENvbnZDcGx0Q2FsbGJhY2soaGFkYyk7CisgICAgCisgICAgLyogQ2xlYXIgaW5qZWN0ZWQgZ3JvdXAgY29udmVyc2lvbiBmbGFnICovCisgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfSkVPQyB8IEFEQ19GTEFHX0pFT1MpOworICB9CisgIAorICAvKiA9PT09PT09PT09IENoZWNrIGFuYWxvZyB3YXRjaGRvZyAxIGZsYWcgPT09PT09PT09PSAqLworICBpZiAoX19IQUxfQURDX0dFVF9GTEFHKGhhZGMsIEFEQ19GTEFHX0FXRDEpICYmIF9fSEFMX0FEQ19HRVRfSVRfU09VUkNFKGhhZGMsIEFEQ19JVF9BV0QxKSkKKyAgeworICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0FXRDEpOworICAgIAorICAgIC8qIExldmVsIG91dCBvZiB3aW5kb3cgMSBjYWxsYmFjayAqLworICAgIEhBTF9BRENfTGV2ZWxPdXRPZldpbmRvd0NhbGxiYWNrKGhhZGMpOworICAgIC8qIENsZWFyIEFEQyBhbmFsb2cgd2F0Y2hkb2cgZmxhZyAqLyAKKyAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19BV0QxKTsKKyAgfQorICAKKyAgLyogPT09PT09PT09PSBDaGVjayBhbmFsb2cgd2F0Y2hkb2cgMiBmbGFnID09PT09PT09PT0gKi8KKyAgaWYgKF9fSEFMX0FEQ19HRVRfRkxBRyhoYWRjLCBBRENfRkxBR19BV0QyKSAmJiBfX0hBTF9BRENfR0VUX0lUX1NPVVJDRShoYWRjLCBBRENfSVRfQVdEMikpCisgIHsKKyAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9BV0QyKTsKKyAgICAKKyAgICAvKiBMZXZlbCBvdXQgb2Ygd2luZG93IDIgY2FsbGJhY2sgKi8KKyAgICBIQUxfQURDRXhfTGV2ZWxPdXRPZldpbmRvdzJDYWxsYmFjayhoYWRjKTsKKyAgICAvKiBDbGVhciBBREMgYW5hbG9nIHdhdGNoZG9nIGZsYWcgKi8gCisgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfQVdEMik7CisgIH0gCisgIAorICAvKiA9PT09PT09PT09IENoZWNrIGFuYWxvZyB3YXRjaGRvZyAzIGZsYWcgPT09PT09PT09PSAqLworICBpZiAoX19IQUxfQURDX0dFVF9GTEFHKGhhZGMsIEFEQ19GTEFHX0FXRDMpICYmIF9fSEFMX0FEQ19HRVRfSVRfU09VUkNFKGhhZGMsIEFEQ19JVF9BV0QzKSkgCisgIHsKKyAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9BV0QzKTsKKyAgICAKKyAgICAvKiBMZXZlbCBvdXQgb2Ygd2luZG93IDMgY2FsbGJhY2sgKi8KKyAgICBIQUxfQURDRXhfTGV2ZWxPdXRPZldpbmRvdzNDYWxsYmFjayhoYWRjKTsKKyAgICAvKiBDbGVhciBBREMgYW5hbG9nIHdhdGNoZG9nIGZsYWcgKi8gCisgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfQVdEMyk7CisgIH0KKyAgCisgIC8qID09PT09PT09PT0gQ2hlY2sgT3ZlcnJ1biBmbGFnID09PT09PT09PT0gKi8KKyAgaWYoX19IQUxfQURDX0dFVF9GTEFHKGhhZGMsIEFEQ19GTEFHX09WUikgJiYgX19IQUxfQURDX0dFVF9JVF9TT1VSQ0UoaGFkYywgQURDX0lUX09WUikpCisgIHsKKyAgICAvKiBJZiBvdmVycnVuIGlzIHNldCB0byBvdmVyd3JpdGUgcHJldmlvdXMgZGF0YSAoZGVmYXVsdCBzZXR0aW5nKSwgICAgICAgICovCisgICAgLyogb3ZlcnJ1biBldmVudCBpcyBub3QgY29uc2lkZXJlZCBhcyBhbiBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIChjZiByZWYgbWFudWFsICJNYW5hZ2luZyBjb252ZXJzaW9ucyB3aXRob3V0IHVzaW5nIHRoZSBETUEgYW5kICAgICAgICAgKi8KKyAgICAvKiB3aXRob3V0IG92ZXJydW4gIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogRXhjZXB0aW9uIGZvciB1c2FnZSB3aXRoIERNQSBvdmVycnVuIGV2ZW50IGFsd2F5cyBjb25zaWRlcmVkIGFzIGFuICAgICAqLworICAgIC8qIGVycm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoaGFkYy0+SW5pdC5PdmVycnVuID09IEFEQ19PVlJfREFUQV9QUkVTRVJWRUQpCisgICAgeworICAgICAgb3ZlcnJ1bl9lcnJvciA9IDFVOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogUG9pbnRlciB0byB0aGUgY29tbW9uIGNvbnRyb2wgcmVnaXN0ZXIgdG8gd2hpY2ggaXMgYmVsb25naW5nIGhhZGMgICAgKi8KKyAgICAgIC8qIChEZXBlbmRpbmcgb24gU1RNMzJGMyBwcm9kdWN0LCB0aGVyZSBtYXkgYmUgdXAgdG8gNCBBREMgYW5kIDIgY29tbW9uICovCisgICAgICAvKiBjb250cm9sIHJlZ2lzdGVycykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgdG1wQURDX0NvbW1vbiA9IEFEQ19DT01NT05fUkVHSVNURVIoaGFkYyk7CisgICAgICAKKyAgICAgIC8qIENoZWNrIERNQSBjb25maWd1cmF0aW9uLCBkZXBlbmRpbmcgb24gTXVsdGlNb2RlIHNldCBvciBub3QgKi8KKyAgICAgIGlmIChSRUFEX0JJVCh0bXBBRENfQ29tbW9uLT5DQ1IsIEFEQ19DQ1JfTVVMVEkpID09IEFEQ19NT0RFX0lOREVQRU5ERU5UKQorICAgICAgeworICAgICAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0RNQUVOKSkKKyAgICAgICAgeworICAgICAgICAgIG92ZXJydW5fZXJyb3IgPSAxVTsgIAorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIE11bHRpTW9kZSBpcyBlbmFibGVkLCBDb21tb24gQ29udHJvbCBSZWdpc3RlciBNRE1BIGJpdHMgbXVzdCBiZSBjaGVja2VkICovCisgICAgICAgIGlmIChSRUFEX0JJVCh0bXBBRENfQ29tbW9uLT5DQ1IsIEFEQ19DQ1JfTURNQSkgIT0gUkVTRVQpCisgICAgICAgIHsKKyAgICAgICAgICBvdmVycnVuX2Vycm9yID0gMVU7ICAKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAKKyAgICBpZiAob3ZlcnJ1bl9lcnJvciA9PSAxVSkKKyAgICB7CisgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX09WUik7CisgICAgCisgICAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgdG8gQURDIElQIGludGVybmFsIGVycm9yICovCisgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9PVlIpOworICAgICAgCisgICAgICAvKiBFcnJvciBjYWxsYmFjayAqLyAKKyAgICAgIEhBTF9BRENfRXJyb3JDYWxsYmFjayhoYWRjKTsKKyAgICB9CisgICAgCisgICAgLyogQ2xlYXIgdGhlIE92ZXJydW4gZmxhZyAqLworICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX09WUik7CisKKyAgfQorICAKKyAgCisgIC8qID09PT09PT09PT0gQ2hlY2sgSW5qZWN0ZWQgY29udGV4dCBxdWV1ZSBvdmVyZmxvdyBmbGFnID09PT09PT09PT0gKi8KKyAgaWYoX19IQUxfQURDX0dFVF9GTEFHKGhhZGMsIEFEQ19GTEFHX0pRT1ZGKSAmJiBfX0hBTF9BRENfR0VUX0lUX1NPVVJDRShoYWRjLCBBRENfSVRfSlFPVkYpKQorICB7CisgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0pRT1ZGKTsKKyAgICAKKyAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBBREMgSVAgaW50ZXJuYWwgZXJyb3IgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+RXJyb3JDb2RlLCBIQUxfQURDX0VSUk9SX0pRT1ZGKTsKKyAgICAKKyAgICAvKiBDbGVhciB0aGUgSW5qZWN0ZWQgY29udGV4dCBxdWV1ZSBvdmVyZmxvdyBmbGFnICovCisgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfSlFPVkYpOworICAgIAorICAgIC8qIEVycm9yIGNhbGxiYWNrICovIAorICAgIEhBTF9BRENFeF9JbmplY3RlZFF1ZXVlT3ZlcmZsb3dDYWxsYmFjayhoYWRjKTsKKyAgfQorICAKK30KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKy8qKgorICAqIEBicmllZiAgSGFuZGxlcyBBREMgaW50ZXJydXB0IHJlcXVlc3QgIAorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9BRENfSVJRSGFuZGxlcihBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoaGFkYy0+SW5pdC5Db250aW51b3VzQ29udk1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19SRUdVTEFSX05CX0NPTlYoaGFkYy0+SW5pdC5OYnJPZkNvbnZlcnNpb24pKTsKKyAgCisgIAorICAvKiA9PT09PT09PT09IENoZWNrIEVuZCBvZiBDb252ZXJzaW9uIGZsYWcgZm9yIHJlZ3VsYXIgZ3JvdXAgPT09PT09PT09PSAqLworICBpZihfX0hBTF9BRENfR0VUX0lUX1NPVVJDRShoYWRjLCBBRENfSVRfRU9DKSkKKyAgeworICAgIGlmKF9fSEFMX0FEQ19HRVRfRkxBRyhoYWRjLCBBRENfRkxBR19FT0MpICkKKyAgICB7CisgICAgICAvKiBVcGRhdGUgc3RhdGUgbWFjaGluZSBvbiBjb252ZXJzaW9uIHN0YXR1cyBpZiBub3QgaW4gZXJyb3Igc3RhdGUgKi8KKyAgICAgIGlmIChIQUxfSVNfQklUX0NMUihoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCkpCisgICAgICB7CisgICAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfRU9DKTsgCisgICAgICB9CisgICAgICAKKyAgICAgIC8qIERldGVybWluZSB3aGV0aGVyIGFueSBmdXJ0aGVyIGNvbnZlcnNpb24gdXBjb21pbmcgb24gZ3JvdXAgcmVndWxhciAgICovCisgICAgICAvKiBieSBleHRlcm5hbCB0cmlnZ2VyLCBjb250aW51b3VzIG1vZGUgb3Igc2NhbiBzZXF1ZW5jZSBvbiBnb2luZy4gICAgICAqLworICAgICAgLyogTm90ZTogT24gU1RNMzJGMzd4IGRldmljZXMsIGluIGNhc2Ugb2Ygc2VxdWVuY2VyIGVuYWJsZWQgICAgICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgIChzZXZlcmFsIHJhbmtzIHNlbGVjdGVkKSwgZW5kIG9mIGNvbnZlcnNpb24gZmxhZyBpcyByYWlzZWQgICAgICovCisgICAgICAvKiAgICAgICBhdCB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgaWYoQURDX0lTX1NPRlRXQVJFX1NUQVJUX1JFR1VMQVIoaGFkYykgICAgICAgJiYgCisgICAgICAgICAoaGFkYy0+SW5pdC5Db250aW51b3VzQ29udk1vZGUgPT0gRElTQUJMRSkgICkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSBBREMgZW5kIG9mIHNpbmdsZSBjb252ZXJzaW9uIGludGVycnVwdCAgKi8KKyAgICAgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX0VPQyk7CisgICAgICAgIAorICAgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICAgIENMRUFSX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSk7ICAgCisgICAgICAgIAorICAgICAgICBpZiAoSEFMX0lTX0JJVF9DTFIoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpKQorICAgICAgICB7CisgICAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUFEWSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogQ29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrKGhhZGMpOworICAgICAgCisgICAgICAvKiBDbGVhciByZWd1bGFyIGdyb3VwIGNvbnZlcnNpb24gZmxhZyAqLworICAgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfU1RSVCB8IEFEQ19GTEFHX0VPQyk7CisgICAgfQorICB9CisgIAorICAvKiA9PT09PT09PT09IENoZWNrIEVuZCBvZiBDb252ZXJzaW9uIGZsYWcgZm9yIGluamVjdGVkIGdyb3VwID09PT09PT09PT0gKi8KKyAgaWYoX19IQUxfQURDX0dFVF9JVF9TT1VSQ0UoaGFkYywgQURDX0lUX0pFT0MpKQorICB7CisgICAgaWYoX19IQUxfQURDX0dFVF9GTEFHKGhhZGMsIEFEQ19GTEFHX0pFT0MpKQorICAgIHsKKyAgICAgIC8qIFVwZGF0ZSBzdGF0ZSBtYWNoaW5lIG9uIGNvbnZlcnNpb24gc3RhdHVzIGlmIG5vdCBpbiBlcnJvciBzdGF0ZSAqLworICAgICAgaWYgKEhBTF9JU19CSVRfQ0xSKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKSkKKyAgICAgIHsKKyAgICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9FT0MpOworICAgICAgfQorCisgICAgICAvKiBEZXRlcm1pbmUgd2hldGhlciBhbnkgZnVydGhlciBjb252ZXJzaW9uIHVwY29taW5nIG9uIGdyb3VwIGluamVjdGVkICAqLworICAgICAgLyogYnkgZXh0ZXJuYWwgdHJpZ2dlciwgc2NhbiBzZXF1ZW5jZSBvbiBnb2luZyBvciBieSBhdXRvbWF0aWMgaW5qZWN0ZWQgKi8KKyAgICAgIC8qIGNvbnZlcnNpb24gZnJvbSBncm91cCByZWd1bGFyIChzYW1lIGNvbmRpdGlvbnMgYXMgZ3JvdXAgcmVndWxhciAgICAgICovCisgICAgICAvKiBpbnRlcnJ1cHRpb24gZGlzYWJsaW5nIGFib3ZlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogTm90ZTogT24gU1RNMzJGMzd4IGRldmljZXMsIGluIGNhc2Ugb2Ygc2VxdWVuY2VyIGVuYWJsZWQgICAgICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgIChzZXZlcmFsIHJhbmtzIHNlbGVjdGVkKSwgZW5kIG9mIGNvbnZlcnNpb24gZmxhZyBpcyByYWlzZWQgICAgICovCisgICAgICAvKiAgICAgICBhdCB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgaWYoQURDX0lTX1NPRlRXQVJFX1NUQVJUX0lOSkVDVEVEKGhhZGMpICAgICAgICAgICAgICAgICAgICAgfHwgCisgICAgICAgICAoSEFMX0lTX0JJVF9DTFIoaGFkYy0+SW5zdGFuY2UtPkNSMSwgQURDX0NSMV9KQVVUTykgJiYgICAgIAorICAgICAgICAgKEFEQ19JU19TT0ZUV0FSRV9TVEFSVF9SRUdVTEFSKGhhZGMpICAgICAgICYmCisgICAgICAgICAgKGhhZGMtPkluaXQuQ29udGludW91c0NvbnZNb2RlID09IERJU0FCTEUpICApICAgICAgICAgKSAgICkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSBBREMgZW5kIG9mIHNpbmdsZSBjb252ZXJzaW9uIGludGVycnVwdCAgKi8KKyAgICAgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX0pFT0MpOworICAgICAgICAKKyAgICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpOyAgIAorCisgICAgICAgIGlmIChIQUxfSVNfQklUX0NMUihoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSkpCisgICAgICAgIHsgCisgICAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUFEWSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogQ29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayAqLyAKKyAgICAgIEhBTF9BRENFeF9JbmplY3RlZENvbnZDcGx0Q2FsbGJhY2soaGFkYyk7CisgICAgICAKKyAgICAgIC8qIENsZWFyIGluamVjdGVkIGdyb3VwIGNvbnZlcnNpb24gZmxhZyAqLworICAgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgKEFEQ19GTEFHX0pTVFJUIHwgQURDX0ZMQUdfSkVPQykpOworICAgIH0KKyAgfQorICAgCisgIC8qID09PT09PT09PT0gQ2hlY2sgQW5hbG9nIHdhdGNoZG9nIGZsYWdzID09PT09PT09PT0gKi8KKyAgaWYoX19IQUxfQURDX0dFVF9JVF9TT1VSQ0UoaGFkYywgQURDX0lUX0FXRCkpCisgIHsKKyAgICBpZihfX0hBTF9BRENfR0VUX0ZMQUcoaGFkYywgQURDX0ZMQUdfQVdEKSkKKyAgICB7CisgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0FXRDEpOworICAgICAgCisgICAgICAvKiBMZXZlbCBvdXQgb2Ygd2luZG93IGNhbGxiYWNrICovIAorICAgICAgSEFMX0FEQ19MZXZlbE91dE9mV2luZG93Q2FsbGJhY2soaGFkYyk7CisgICAgICAKKyAgICAgIC8qIENsZWFyIHRoZSBBREMgYW5hbG9nIHdhdGNoZG9nIGZsYWcgKi8KKyAgICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX0FXRCk7CisgICAgfQorICB9CisgIAorfQorI2VuZGlmIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICovCisKKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisvKioKKyAgKiBAYnJpZWYgIFBlcmZvcm0gYW4gQURDIGF1dG9tYXRpYyBzZWxmLWNhbGlicmF0aW9uCisgICogICAgICAgICBDYWxpYnJhdGlvbiBwcmVyZXF1aXNpdGU6IEFEQyBtdXN0IGJlIGRpc2FibGVkIChleGVjdXRlIHRoaXMKKyAgKiAgICAgICAgIGZ1bmN0aW9uIGJlZm9yZSBIQUxfQURDX1N0YXJ0KCkgb3IgYWZ0ZXIgSEFMX0FEQ19TdG9wKCkgKS4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEBwYXJhbSAgU2luZ2xlRGlmZiBTZWxlY3Rpb24gb2Ygc2luZ2xlLWVuZGVkIG9yIGRpZmZlcmVudGlhbCBpbnB1dAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEFEQ19TSU5HTEVfRU5ERUQ6IENoYW5uZWwgaW4gbW9kZSBpbnB1dCBzaW5nbGUgZW5kZWQKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX0RJRkZFUkVOVElBTF9FTkRFRDogQ2hhbm5lbCBpbiBtb2RlIGlucHV0IGRpZmZlcmVudGlhbCBlbmRlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X0NhbGlicmF0aW9uX1N0YXJ0KEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCBTaW5nbGVEaWZmKQoreworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1cyA9IEhBTF9PSzsKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19TSU5HTEVfRElGRkVSRU5USUFMKFNpbmdsZURpZmYpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhhZGMpOworICAgCisgIC8qIENhbGlicmF0aW9uIHByZXJlcXVpc2l0ZTogQURDIG11c3QgYmUgZGlzYWJsZWQuICovCisgICAKKyAgLyogRGlzYWJsZSB0aGUgQURDIChpZiBub3QgYWxyZWFkeSBkaXNhYmxlZCkgKi8KKyAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRGlzYWJsZShoYWRjKTsKKyAgCisgIC8qIENoZWNrIGlmIEFEQyBpcyBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLworICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgLyogQ2hhbmdlIEFEQyBzdGF0ZSAqLworICAgIGhhZGMtPlN0YXRlID0gSEFMX0FEQ19TVEFURV9SRUFEWTsKKyAgICAKKyAgICAvKiBTZWxlY3QgY2FsaWJyYXRpb24gbW9kZSBzaW5nbGUgZW5kZWQgb3IgZGlmZmVyZW50aWFsIGVuZGVkICovCisgICAgaGFkYy0+SW5zdGFuY2UtPkNSICY9ICh+QURDX0NSX0FEQ0FMRElGKTsKKyAgICBpZiAoU2luZ2xlRGlmZiA9PSBBRENfRElGRkVSRU5USUFMX0VOREVEKQorICAgIHsKKyAgICAgIGhhZGMtPkluc3RhbmNlLT5DUiB8PSBBRENfQ1JfQURDQUxESUY7CisgICAgfQorCisgICAgLyogU3RhcnQgQURDIGNhbGlicmF0aW9uICovCisgICAgaGFkYy0+SW5zdGFuY2UtPkNSIHw9IEFEQ19DUl9BRENBTDsKKworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7ICAKKworICAgIC8qIFdhaXQgZm9yIGNhbGlicmF0aW9uIGNvbXBsZXRpb24gKi8KKyAgICB3aGlsZShIQUxfSVNfQklUX1NFVChoYWRjLT5JbnN0YW5jZS0+Q1IsIEFEQ19DUl9BRENBTCkpCisgICAgeworICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gQURDX0NBTElCUkFUSU9OX1RJTUVPVVQpCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9CVVNZX0lOVEVSTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgICAgCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfQlVTWV9JTlRFUk5BTCwKKyAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZKTsKKyAgfQorICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKy8qKgorICAqIEBicmllZiAgUGVyZm9ybSBhbiBBREMgYXV0b21hdGljIHNlbGYtY2FsaWJyYXRpb24KKyAgKiAgICAgICAgIENhbGlicmF0aW9uIHByZXJlcXVpc2l0ZTogQURDIG11c3QgYmUgZGlzYWJsZWQgKGV4ZWN1dGUgdGhpcworICAqICAgICAgICAgZnVuY3Rpb24gYmVmb3JlIEhBTF9BRENfU3RhcnQoKSBvciBhZnRlciBIQUxfQURDX1N0b3AoKSApLgorICAqICAgICAgICAgRHVyaW5nIGNhbGlicmF0aW9uIHByb2Nlc3MsIEFEQyBpcyBlbmFibGVkLiBBREMgaXMgbGV0IGVuYWJsZWQgYXQKKyAgKiAgICAgICAgIHRoZSBjb21wbGV0aW9uIG9mIHRoaXMgZnVuY3Rpb24uCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9DYWxpYnJhdGlvbl9TdGFydChBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXMgPSBIQUxfT0s7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgX19JTyB1aW50MzJfdCB3YWl0X2xvb3BfaW5kZXggPSAwVTsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoYWRjKTsKKyAgICAKKyAgLyogMS4gQ2FsaWJyYXRpb24gcHJlcmVxdWlzaXRlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIC0gQURDIG11c3QgYmUgZGlzYWJsZWQgZm9yIGF0IGxlYXN0IHR3byBBREMgY2xvY2sgY3ljbGVzIGluIGRpc2FibGUgICAqLworICAvKiAgICAgIG1vZGUgYmVmb3JlIEFEQyBlbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RvcCBwb3RlbnRpYWwgY29udmVyc2lvbiBvbiBnb2luZywgb24gcmVndWxhciBhbmQgaW5qZWN0ZWQgZ3JvdXBzICAgICAgICovCisgIC8qIERpc2FibGUgQURDIHBlcmlwaGVyYWwgKi8KKyAgdG1wX2hhbF9zdGF0dXMgPSBBRENfQ29udmVyc2lvblN0b3BfRGlzYWJsZShoYWRjKTsKKyAgCisgIC8qIENoZWNrIGlmIEFEQyBpcyBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLworICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kgfCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZLAorICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfQlVTWV9JTlRFUk5BTCk7CisgICAgCisgICAgLyogV2FpdCB0d28gQURDIGNsb2NrIGN5Y2xlcyAqLworICAgIHdoaWxlKHdhaXRfbG9vcF9pbmRleCA8IEFEQ19DWUNMRV9XT1JTVF9DQVNFX0NQVV9DWUNMRVMgKjJVKQorICAgIHsKKyAgICAgIHdhaXRfbG9vcF9pbmRleCsrOworICAgIH0KKyAgICAKKyAgICAvKiAyLiBFbmFibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovCisgICAgQURDX0VuYWJsZShoYWRjKTsKKyAgICAKKworICAgIC8qIDMuIFJlc2V0cyBBREMgY2FsaWJyYXRpb24gcmVnaXN0ZXJzICovICAKKyAgICBTRVRfQklUKGhhZGMtPkluc3RhbmNlLT5DUjIsIEFEQ19DUjJfUlNUQ0FMKTsKKyAgICAKKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOyAgCisKKyAgICAvKiBXYWl0IGZvciBjYWxpYnJhdGlvbiByZXNldCBjb21wbGV0aW9uICovCisgICAgd2hpbGUoSEFMX0lTX0JJVF9TRVQoaGFkYy0+SW5zdGFuY2UtPkNSMiwgQURDX0NSMl9SU1RDQUwpKQorICAgIHsKKyAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IEFEQ19DQUxJQlJBVElPTl9USU1FT1VUKQorICAgICAgeworICAgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfQlVTWV9JTlRFUk5BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCk7CisgICAgICAgIAorICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgIC8qIDQuIFN0YXJ0IEFEQyBjYWxpYnJhdGlvbiAqLworICAgIFNFVF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNSMiwgQURDX0NSMl9DQUwpOworCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsgIAorCisgICAgLyogV2FpdCBmb3IgY2FsaWJyYXRpb24gY29tcGxldGlvbiAqLworICAgIHdoaWxlKEhBTF9JU19CSVRfU0VUKGhhZGMtPkluc3RhbmNlLT5DUjIsIEFEQ19DUjJfQ0FMKSkKKyAgICB7CisgICAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBBRENfQ0FMSUJSQVRJT05fVElNRU9VVCkKKyAgICAgIHsKKyAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX0JVU1lfSU5URVJOQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpOworICAgICAgICAKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9CVVNZX0lOVEVSTkFMLAorICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICB9CisgIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisjZW5kaWYgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgY2FsaWJyYXRpb24gZmFjdG9yIGZyb20gYXV0b21hdGljIGNvbnZlcnNpb24gcmVzdWx0CisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gIFNpbmdsZURpZmYgU2VsZWN0aW9uIG9mIHNpbmdsZS1lbmRlZCBvciBkaWZmZXJlbnRpYWwgaW5wdXQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBBRENfU0lOR0xFX0VOREVEOiBDaGFubmVsIGluIG1vZGUgaW5wdXQgc2luZ2xlIGVuZGVkCisgICogICAgICAgICAgICBAYXJnIEFEQ19ESUZGRVJFTlRJQUxfRU5ERUQ6IENoYW5uZWwgaW4gbW9kZSBpbnB1dCBkaWZmZXJlbnRpYWwgZW5kZWQKKyAgKiBAcmV0dmFsIENvbnZlcnRlZCB2YWx1ZQorICAqLwordWludDMyX3QgSEFMX0FEQ0V4X0NhbGlicmF0aW9uX0dldFZhbHVlKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCBTaW5nbGVEaWZmKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX1NJTkdMRV9ESUZGRVJFTlRJQUwoU2luZ2xlRGlmZikpOyAKKyAgCisgIC8qIFJldHVybiB0aGUgc2VsZWN0ZWQgQURDIGNhbGlicmF0aW9uIHZhbHVlICovIAorICBpZiAoU2luZ2xlRGlmZiA9PSBBRENfRElGRkVSRU5USUFMX0VOREVEKQorICB7CisgICAgcmV0dXJuIEFEQ19DQUxGQUNUX0RJRkZfR0VUKGhhZGMtPkluc3RhbmNlLT5DQUxGQUNUKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gKChoYWRjLT5JbnN0YW5jZS0+Q0FMRkFDVCkgJiBBRENfQ0FMRkFDVF9DQUxGQUNUX1MpOworICB9Cit9CisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgY2FsaWJyYXRpb24gZmFjdG9yIHRvIG92ZXJ3cml0ZSBhdXRvbWF0aWMgY29udmVyc2lvbiByZXN1bHQuIEFEQyBtdXN0IGJlIGVuYWJsZWQgYW5kIG5vIGNvbnZlcnNpb24gb24gZ29pbmcuCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gIFNpbmdsZURpZmYgU2VsZWN0aW9uIG9mIHNpbmdsZS1lbmRlZCBvciBkaWZmZXJlbnRpYWwgaW5wdXQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBBRENfU0lOR0xFX0VOREVEOiBDaGFubmVsIGluIG1vZGUgaW5wdXQgc2luZ2xlIGVuZGVkCisgICogICAgICAgICAgICBAYXJnIEFEQ19ESUZGRVJFTlRJQUxfRU5ERUQ6IENoYW5uZWwgaW4gbW9kZSBpbnB1dCBkaWZmZXJlbnRpYWwgZW5kZWQKKyAgKiBAcGFyYW0gIENhbGlicmF0aW9uRmFjdG9yIENhbGlicmF0aW9uIGZhY3RvciAoY29kZWQgb24gNyBiaXRzIG1heGltdW0pCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9DYWxpYnJhdGlvbl9TZXRWYWx1ZShBRENfSGFuZGxlVHlwZURlZiogaGFkYywgdWludDMyX3QgU2luZ2xlRGlmZiwgdWludDMyX3QgQ2FsaWJyYXRpb25GYWN0b3IpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19TSU5HTEVfRElGRkVSRU5USUFMKFNpbmdsZURpZmYpKTsgCisgIGFzc2VydF9wYXJhbShJU19BRENfQ0FMRkFDVChDYWxpYnJhdGlvbkZhY3RvcikpOyAKKyAgCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGFkYyk7CisgIAorICAvKiBWZXJpZmljYXRpb24gb2YgaGFyZHdhcmUgY29uc3RyYWludHMgYmVmb3JlIG1vZGlmeWluZyB0aGUgY2FsaWJyYXRpb24gICAgKi8KKyAgLyogZmFjdG9ycyByZWdpc3RlcjogQURDIG11c3QgYmUgZW5hYmxlZCwgbm8gY29udmVyc2lvbiBvbiBnb2luZy4gICAgICAgICAgICovCisgIGlmICggKEFEQ19JU19FTkFCTEUoaGFkYykgIT0gUkVTRVQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAoQURDX0lTX0NPTlZFUlNJT05fT05HT0lOR19SRUdVTEFSX0lOSkVDVEVEKGhhZGMpID09IFJFU0VUKSAgICkKKyAgeworICAgIC8qIFNldCB0aGUgc2VsZWN0ZWQgQURDIGNhbGlicmF0aW9uIHZhbHVlICovIAorICAgIGlmIChTaW5nbGVEaWZmID09IEFEQ19ESUZGRVJFTlRJQUxfRU5ERUQpCisgICAgeworICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+Q0FMRkFDVCAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIEFEQ19DQUxGQUNUX0NBTEZBQ1RfRCAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgQURDX0NBTEZBQ1RfRElGRl9TRVQoQ2FsaWJyYXRpb25GYWN0b3IpICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5DQUxGQUNULAorICAgICAgICAgICAgICAgICBBRENfQ0FMRkFDVF9DQUxGQUNUX1MgICwKKyAgICAgICAgICAgICAgICAgQ2FsaWJyYXRpb25GYWN0b3IgICAgICAgKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOworICAgIAorICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBBREMgSVAgaW50ZXJuYWwgZXJyb3IgKi8KKyAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7CisgIH0KKyAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhhZGMpOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgQURDLCBzdGFydHMgY29udmVyc2lvbiBvZiBpbmplY3RlZCBncm91cC4KKyAgKiAgICAgICAgIEludGVycnVwdGlvbnMgZW5hYmxlZCBpbiB0aGlzIGZ1bmN0aW9uOiBOb25lLgorICAqIEBub3RlICAgQ2FzZSBvZiBtdWx0aW1vZGUgZW5hYmxlZCAoZm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQ3MpOiBUaGlzIAorICAqICAgICAgICAgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgZm9yIEFEQyBzbGF2ZSBmaXJzdCwgdGhlbiBBREMgbWFzdGVyLiAKKyAgKiAgICAgICAgIEZvciBBREMgc2xhdmUsIEFEQyBpcyBlbmFibGVkIG9ubHkgKGNvbnZlcnNpb24gaXMgbm90IHN0YXJ0ZWQpLiAgCisgICogICAgICAgICBGb3IgQURDIG1hc3RlciwgQURDIGlzIGVuYWJsZWQgYW5kIG11bHRpbW9kZSBjb252ZXJzaW9uIGlzIHN0YXJ0ZWQuCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9JbmplY3RlZFN0YXJ0KEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1cyA9IEhBTF9PSzsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIAorICAvKiBQZXJmb3JtIEFEQyBlbmFibGUgYW5kIGNvbnZlcnNpb24gc3RhcnQgaWYgbm8gY29udmVyc2lvbiBpcyBvbiBnb2luZyAqLworICBpZiAoQURDX0lTX0NPTlZFUlNJT05fT05HT0lOR19JTkpFQ1RFRChoYWRjKSA9PSBSRVNFVCkKKyAgeworICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoYWRjKTsKKyAgICAKKyAgICAvKiBFbmFibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovCisgICAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRW5hYmxlKGhhZGMpOworICAgIAorICAgICAgLyogU3RhcnQgY29udmVyc2lvbiBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZW5hYmxlZCAqLworICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogU2V0IEFEQyBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qIC0gQ2xlYXIgc3RhdGUgYml0ZmllbGQgcmVsYXRlZCB0byBpbmplY3RlZCBncm91cCBjb252ZXJzaW9uIHJlc3VsdHMgICovCisgICAgICAvKiAtIFNldCBzdGF0ZSBiaXRmaWVsZCByZWxhdGVkIHRvIGluamVjdGVkIG9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAqLworICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZIHwgSEFMX0FEQ19TVEFURV9JTkpfRU9DLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSk7CisgICAgICAKKyAgICAgIC8qIENhc2Ugb2YgaW5kZXBlbmRlbnQgbW9kZSBvciBtdWx0aW1vZGUoZm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQ3MpOiovCisgICAgICAvKiBTZXQgbXVsdGltb2RlIHN0YXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgaWYgKEFEQ19OT05NVUxUSU1PREVfT1JfTVVMVElNT0RFTUFTVEVSKGhhZGMpKQorICAgICAgeworICAgICAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfTVVMVElNT0RFX1NMQVZFKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9NVUxUSU1PREVfU0xBVkUpOworICAgICAgfQorICAgICAgCisgICAgICAvKiBDaGVjayBpZiBhIHJlZ3VsYXIgY29udmVyc2lvbiBpcyBvbmdvaW5nICovCisgICAgICAvKiBOb3RlOiBPbiB0aGlzIGRldmljZSwgdGhlcmUgaXMgbm8gQURDIGVycm9yIGNvZGUgZmllbGRzIHJlbGF0ZWQgdG8gICAqLworICAgICAgLyogICAgICAgY29udmVyc2lvbnMgb24gZ3JvdXAgaW5qZWN0ZWQgb25seS4gSW4gY2FzZSBvZiBjb252ZXJzaW9uIG9uICAgKi8KKyAgICAgIC8qICAgICAgIGdvaW5nIG9uIGdyb3VwIHJlZ3VsYXIsIG5vIGVycm9yIGNvZGUgaXMgcmVzZXQuICAgICAgICAgICAgICAgICovCisgICAgICBpZiAoSEFMX0lTX0JJVF9DTFIoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpKQorICAgICAgeworICAgICAgICAvKiBSZXNldCBBREMgYWxsIGVycm9yIGNvZGUgZmllbGRzICovCisgICAgICAgIEFEQ19DTEVBUl9FUlJPUkNPREUoaGFkYyk7CisgICAgICB9CisgICAgICAKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIC8qIFVubG9jayBiZWZvcmUgc3RhcnRpbmcgQURDIGNvbnZlcnNpb25zOiBpbiBjYXNlIG9mIHBvdGVudGlhbCAgICAgICAgICovCisgICAgICAvKiBpbnRlcnJ1cHRpb24sIHRvIGxldCB0aGUgcHJvY2VzcyB0byBBREMgSVJRIEhhbmRsZXIuICAgICAgICAgICAgICAgICAqLworICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgICAgCisgICAgICAvKiBDbGVhciBpbmplY3RlZCBncm91cCBjb252ZXJzaW9uIGZsYWcgKi8KKyAgICAgIC8qIChUbyBlbnN1cmUgb2Ygbm8gdW5rbm93biBzdGF0ZSBmcm9tIHBvdGVudGlhbCBwcmV2aW91cyBBREMgICAgICAgICAgICovCisgICAgICAvKiBvcGVyYXRpb25zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgKEFEQ19GTEFHX0pFT0MgfCBBRENfRkxBR19KRU9TKSk7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSBjb252ZXJzaW9uIG9mIGluamVjdGVkIGdyb3VwLCBpZiBhdXRvbWF0aWMgaW5qZWN0ZWQgICAgICAgICAgICovCisgICAgICAvKiBjb252ZXJzaW9uIGlzIGRpc2FibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogSWYgc29mdHdhcmUgc3RhcnQgaGFzIGJlZW4gc2VsZWN0ZWQsIGNvbnZlcnNpb24gc3RhcnRzIGltbWVkaWF0ZWx5LiAgKi8KKyAgICAgIC8qIElmIGV4dGVybmFsIHRyaWdnZXIgaGFzIGJlZW4gc2VsZWN0ZWQsIGNvbnZlcnNpb24gd2lsbCBzdGFydCBhdCBuZXh0ICovCisgICAgICAvKiB0cmlnZ2VyIGV2ZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogQ2FzZSBvZiBtdWx0aW1vZGUgZW5hYmxlZCAoZm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQ3MpOiAgICAgICAgICAgKi8KKyAgICAgIC8qICAtIGlmIEFEQyBpcyBzbGF2ZSwgQURDIGlzIGVuYWJsZWQgb25seSAoY29udmVyc2lvbiBpcyBub3Qgc3RhcnRlZCkuICovCisgICAgICAvKiAgLSBpZiBBREMgaXMgbWFzdGVyLCBBREMgaXMgZW5hYmxlZCBhbmQgY29udmVyc2lvbiBpcyBzdGFydGVkLiAgICAgICAqLworICAgICAgaWYgKEhBTF9JU19CSVRfQ0xSKGhhZGMtPkluc3RhbmNlLT5DRkdSLCBBRENfQ0ZHUl9KQVVUTykgJiYgCisgICAgICAgICAgQURDX05PTk1VTFRJTU9ERV9JTkpfT1JfTVVMVElNT0RFTUFTVEVSKGhhZGMpICAgICAgICAgICkKKyAgICAgIHsKKyAgICAgICAgU0VUX0JJVChoYWRjLT5JbnN0YW5jZS0+Q1IsIEFEQ19DUl9KQURTVEFSVCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0JVU1k7CisgIH0KKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorLyoqCisgICogQGJyaWVmICBFbmFibGVzIEFEQywgc3RhcnRzIGNvbnZlcnNpb24gb2YgaW5qZWN0ZWQgZ3JvdXAuCisgICogICAgICAgICBJbnRlcnJ1cHRpb25zIGVuYWJsZWQgaW4gdGhpcyBmdW5jdGlvbjogTm9uZS4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X0luamVjdGVkU3RhcnQoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGFkYyk7CisgICAgCisgIC8qIEVuYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgKi8KKyAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRW5hYmxlKGhhZGMpOworICAKKyAgLyogU3RhcnQgY29udmVyc2lvbiBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZW5hYmxlZCAqLworICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgLyogU2V0IEFEQyBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIC0gQ2xlYXIgc3RhdGUgYml0ZmllbGQgcmVsYXRlZCB0byBpbmplY3RlZCBncm91cCBjb252ZXJzaW9uIHJlc3VsdHMgICAgKi8KKyAgICAvKiAtIFNldCBzdGF0ZSBiaXRmaWVsZCByZWxhdGVkIHRvIGluamVjdGVkIG9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICovCisgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUFEWSB8IEhBTF9BRENfU1RBVEVfSU5KX0VPQywKKyAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKTsKKyAgICAKKyAgICAvKiBDaGVjayBpZiBhIHJlZ3VsYXIgY29udmVyc2lvbiBpcyBvbmdvaW5nICovCisgICAgLyogTm90ZTogT24gdGhpcyBkZXZpY2UsIHRoZXJlIGlzIG5vIEFEQyBlcnJvciBjb2RlIGZpZWxkcyByZWxhdGVkIHRvICAgICAqLworICAgIC8qICAgICAgIGNvbnZlcnNpb25zIG9uIGdyb3VwIGluamVjdGVkIG9ubHkuIEluIGNhc2Ugb2YgY29udmVyc2lvbiBvbiAgICAgKi8KKyAgICAvKiAgICAgICBnb2luZyBvbiBncm91cCByZWd1bGFyLCBubyBlcnJvciBjb2RlIGlzIHJlc2V0LiAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKEhBTF9JU19CSVRfQ0xSKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1JFR19CVVNZKSkKKyAgICB7CisgICAgICAvKiBSZXNldCBBREMgYWxsIGVycm9yIGNvZGUgZmllbGRzICovCisgICAgICBBRENfQ0xFQVJfRVJST1JDT0RFKGhhZGMpOworICAgIH0KKyAgICAKKyAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgLyogVW5sb2NrIGJlZm9yZSBzdGFydGluZyBBREMgY29udmVyc2lvbnM6IGluIGNhc2Ugb2YgcG90ZW50aWFsICAgICAgICAgICAqLworICAgIC8qIGludGVycnVwdGlvbiwgdG8gbGV0IHRoZSBwcm9jZXNzIHRvIEFEQyBJUlEgSGFuZGxlci4gICAgICAgICAgICAgICAgICAgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgICAgCisgICAgLyogQ2xlYXIgaW5qZWN0ZWQgZ3JvdXAgY29udmVyc2lvbiBmbGFnICovCisgICAgLyogKFRvIGVuc3VyZSBvZiBubyB1bmtub3duIHN0YXRlIGZyb20gcG90ZW50aWFsIHByZXZpb3VzIEFEQyBvcGVyYXRpb25zKSAqLworICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX0pFT0MpOworICAgIAorICAgIC8qIEVuYWJsZSBjb252ZXJzaW9uIG9mIGluamVjdGVkIGdyb3VwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBJZiBzb2Z0d2FyZSBzdGFydCBoYXMgYmVlbiBzZWxlY3RlZCwgY29udmVyc2lvbiBzdGFydHMgaW1tZWRpYXRlbHkuICAgICovCisgICAgLyogSWYgZXh0ZXJuYWwgdHJpZ2dlciBoYXMgYmVlbiBzZWxlY3RlZCwgY29udmVyc2lvbiB3aWxsIHN0YXJ0IGF0IG5leHQgICAqLworICAgIC8qIHRyaWdnZXIgZXZlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBJZiBleHRlcm5hbCB0cmlnZ2VyIGhhcyBiZWVuIHNlbGVjdGVkLCBjb252ZXJzaW9uIHdpbGwgc3RhcnQgYXQgbmV4dCAgICovCisgICAgLyogdHJpZ2dlciBldmVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIElmIGF1dG9tYXRpYyBpbmplY3RlZCBjb252ZXJzaW9uIGlzIGVuYWJsZWQsIGNvbnZlcnNpb24gd2lsbCBzdGFydCAgICAgKi8KKyAgICAvKiBhZnRlciBuZXh0IHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKEFEQ19JU19TT0ZUV0FSRV9TVEFSVF9JTkpFQ1RFRChoYWRjKSAgICAgICAgICAgICAgICYmIAorICAgICAgICBIQUxfSVNfQklUX0NMUihoYWRjLT5JbnN0YW5jZS0+Q1IxLCBBRENfQ1IxX0pBVVRPKSAgICkKKyAgICB7CisgICAgICAvKiBTdGFydCBBREMgY29udmVyc2lvbiBvbiBpbmplY3RlZCBncm91cCB3aXRoIFNXIHN0YXJ0ICovCisgICAgICBTRVRfQklUKGhhZGMtPkluc3RhbmNlLT5DUjIsIChBRENfQ1IyX0pTV1NUQVJUIHwgQURDX0NSMl9KRVhUVFJJRykpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogU3RhcnQgQURDIGNvbnZlcnNpb24gb24gaW5qZWN0ZWQgZ3JvdXAgd2l0aCBleHRlcm5hbCB0cmlnZ2VyICovCisgICAgICBTRVRfQklUKGhhZGMtPkluc3RhbmNlLT5DUjIsIEFEQ19DUjJfSkVYVFRSSUcpOworICAgIH0KKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorI2VuZGlmIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorLyoqCisgICogQGJyaWVmICBTdG9wIEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIChwb3RlbnRpYWwgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gQURDIGdyb3VwIHJlZ3VsYXIgaXMgbm90IGltcGFjdGVkKSwgZGlzYWJsZSBBREMgcGVyaXBoZXJhbAorICAqICAgICAgICAgaWYgbm8gY29udmVyc2lvbiBpcyBvbiBnb2luZyBvbiBncm91cCByZWd1bGFyLgorICAqIEBub3RlICAgVG8gc3RvcCBBREMgY29udmVyc2lvbiBvZiBib3RoIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZCBhbmQgdG8KKyAgKiAgICAgICAgIHRvIGRpc2FibGUgQURDIHBlcmlwaGVyYWwsIGluc3RlYWQgb2YgdXNpbmcgMiBmdW5jdGlvbnMKKyAgKiAgICAgICAgIEByZWYgSEFMX0FEQ0V4X1JlZ3VsYXJTdG9wKCkgYW5kIEByZWYgSEFMX0FEQ0V4X0luamVjdGVkU3RvcCgpLAorICAqICAgICAgICAgdXNlIGZ1bmN0aW9uIEByZWYgSEFMX0FEQ19TdG9wKCkuCisgICogQG5vdGUgICBJZiBpbmplY3RlZCBncm91cCBtb2RlIGF1dG8taW5qZWN0aW9uIGlzIGVuYWJsZWQsCisgICogICAgICAgICBmdW5jdGlvbiBIQUxfQURDX1N0b3AgbXVzdCBiZSB1c2VkLgorICAqIEBub3RlICAgQ2FzZSBvZiBtdWx0aW1vZGUgZW5hYmxlZCAoZm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQ3MpOiBUaGlzIAorICAqICAgICAgICAgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgZm9yIEFEQyBtYXN0ZXIgZmlyc3QsIHRoZW4gQURDIHNsYXZlLgorICAqICAgICAgICAgRm9yIEFEQyBtYXN0ZXIsIGNvbnZlcnNpb24gaXMgc3RvcHBlZCBhbmQgQURDIGlzIGRpc2FibGVkLiAKKyAgKiAgICAgICAgIEZvciBBREMgc2xhdmUsIEFEQyBpcyBkaXNhYmxlZCBvbmx5IChjb252ZXJzaW9uIHN0b3Agb2YgQURDIG1hc3RlcgorICAqICAgICAgICAgaGFzIGFscmVhZHkgc3RvcHBlZCBjb252ZXJzaW9uIG9mIEFEQyBzbGF2ZSkuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIGF1dG8taW5qZWN0aW9uIG1vZGUsIEhBTF9BRENfU3RvcCBtdXN0IGJlIHVzZWQuCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9JbmplY3RlZFN0b3AoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGFkYyk7CisgIAorICAvKiBTdG9wIHBvdGVudGlhbCBBREMgY29udmVyc2lvbiBvbiBnb2luZyBhbmQgZGlzYWJsZSBBREMgcGVyaXBoZXJhbCAgICAgICAgKi8KKyAgLyogY29uZGl0aW9uZWQgdG86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIC0gSW4gY2FzZSBvZiBhdXRvLWluamVjdGlvbiBtb2RlLCBIQUxfQURDX1N0b3AgbXVzdCBiZSB1c2VkLiAgICAgICAgICAgICAqLworICAvKiAtIEZvciBBREMgaW5qZWN0ZWQgZ3JvdXAgY29udmVyc2lvbiBzdG9wOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBPbiB0aGlzIFNUTTMyIGZhbWlseSwgY29udmVyc2lvbiBvbiB0aGUgb3RoZXIgZ3JvdXAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgKGdyb3VwIHJlZ3VsYXIpIGNhbiBjb250aW51ZSAoZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkICAgICAgICAgICAgICAqLworICAvKiAgIGNvbnZlcnNpb24gc3RvcCBjb21tYW5kcyBhcmUgaW5kZXBlbmRlbnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogLSBGb3IgQURDIGRpc2FibGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgTm8gY29udmVyc2lvbiBvbiB0aGUgb3RoZXIgZ3JvdXAgKGdyb3VwIHJlZ3VsYXIpIG11c3QgYmUgaW50ZW5kZWQgdG8gICAqLworICAvKiAgIGNvbnRpbnVlIChncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQgYXJlIGJvdGggaW1wYWN0ZWQgYnkgICAgICAgICAgICAgKi8KKyAgLyogICBBREMgZGlzYWJsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmKEhBTF9JU19CSVRfQ0xSKGhhZGMtPkluc3RhbmNlLT5DRkdSLCBBRENfQ0ZHUl9KQVVUTykpCisgIHsKKyAgICAvKiAxLiBTdG9wIHBvdGVudGlhbCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIGluamVjdGVkIGdyb3VwIG9ubHkuICovCisgICAgdG1wX2hhbF9zdGF0dXMgPSBBRENfQ29udmVyc2lvblN0b3AoaGFkYywgQURDX0lOSkVDVEVEX0dST1VQKTsKKyAgICAKKyAgICAvKiBEaXNhYmxlIEFEQyBwZXJpcGhlcmFsIGlmIGNvbnZlcnNpb24gb24gQURDIGdyb3VwIGluamVjdGVkIGlzICAgICAgICAgICovCisgICAgLyogZWZmZWN0aXZlbHkgc3RvcHBlZCBhbmQgaWYgbm8gY29udmVyc2lvbiBvbiB0aGUgb3RoZXIgZ3JvdXAgICAgICAgICAgICAqLworICAgIC8qIChBREMgZ3JvdXAgcmVndWxhcikgaXMgaW50ZW5kZWQgdG8gY29udGludWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICAgIHsgICAgICAKKyAgICAgIGlmKChBRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX1JFR1VMQVIoaGFkYykgPT0gUkVTRVQpICYmCisgICAgICAgICAoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSkgPT0gUkVTRVQpICAgICkKKyAgICAgIHsKKyAgICAgICAgLyogMi4gRGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgKi8KKyAgICAgICAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRGlzYWJsZShoYWRjKTsKKyAgICAgICAgCisgICAgICAgIC8qIENoZWNrIGlmIEFEQyBpcyBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLworICAgICAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kgfCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBDb252ZXJzaW9uIG9uIEFEQyBncm91cCBpbmplY3RlZCBncm91cCBpcyBzdG9wcGVkLCBidXQgQURDIGlzIG5vdCAgICAqLworICAgICAgLyogZGlzYWJsZWQgc2luY2UgY29udmVyc2lvbiBvbiBBREMgZ3JvdXAgcmVndWxhciBpcyBzdGlsbCBvbiBnb2luZy4gICAgKi8KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0NPTkZJRyk7CisgICAgICAKKyAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKy8qKgorICAqIEBicmllZiAgU3RvcCBjb252ZXJzaW9uIG9mIGluamVjdGVkIGNoYW5uZWxzLiBEaXNhYmxlIEFEQyBwZXJpcGhlcmFsIGlmCisgICogICAgICAgICBubyByZWd1bGFyIGNvbnZlcnNpb24gaXMgb24gZ29pbmcuCisgICogQG5vdGUgICBJZiBBREMgbXVzdCBiZSBkaXNhYmxlZCBhbmQgaWYgY29udmVyc2lvbiBpcyBvbiBnb2luZyBvbiAKKyAgKiAgICAgICAgIHJlZ3VsYXIgZ3JvdXAsIGZ1bmN0aW9uIEhBTF9BRENfU3RvcCBtdXN0IGJlIHVzZWQgdG8gc3RvcCBib3RoCisgICogICAgICAgICBpbmplY3RlZCBhbmQgcmVndWxhciBncm91cHMsIGFuZCBkaXNhYmxlIHRoZSBBREMuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIGF1dG8taW5qZWN0aW9uIG1vZGUsIEhBTF9BRENfU3RvcCBtdXN0IGJlIHVzZWQuCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9JbmplY3RlZFN0b3AoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhhZGMpOworICAgIAorICAvKiBTdG9wIHBvdGVudGlhbCBjb252ZXJzaW9uIGFuZCBkaXNhYmxlIEFEQyBwZXJpcGhlcmFsICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQ29uZGl0aW9uZWQgdG86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIC0gTm8gY29udmVyc2lvbiBvbiB0aGUgb3RoZXIgZ3JvdXAgKHJlZ3VsYXIgZ3JvdXApIGlzIGludGVuZGVkIHRvICAgICAgICAqLworICAvKiAgIGNvbnRpbnVlIChpbmplY3RlZCBhbmQgcmVndWxhciBncm91cHMgc3RvcCBjb252ZXJzaW9uIGFuZCBBREMgZGlzYWJsZSAgKi8KKyAgLyogICBhcmUgY29tbW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIC0gSW4gY2FzZSBvZiBhdXRvLWluamVjdGlvbiBtb2RlLCBIQUxfQURDX1N0b3AgbXVzdCBiZSB1c2VkLiAgICAgICAgICAgICAqLworICBpZigoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSkgPT0gUkVTRVQpICAmJgorICAgICBIQUxfSVNfQklUX0NMUihoYWRjLT5JbnN0YW5jZS0+Q1IxLCBBRENfQ1IxX0pBVVRPKSAgICkKKyAgeworICAgIC8qIFN0b3AgcG90ZW50aWFsIGNvbnZlcnNpb24gb24gZ29pbmcsIG9uIHJlZ3VsYXIgYW5kIGluamVjdGVkIGdyb3VwcyAqLworICAgIC8qIERpc2FibGUgQURDIHBlcmlwaGVyYWwgKi8KKyAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19Db252ZXJzaW9uU3RvcF9EaXNhYmxlKGhhZGMpOworICAgIAorICAgIC8qIENoZWNrIGlmIEFEQyBpcyBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLworICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19CVVNZIHwgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0NPTkZJRyk7CisgICAgICAKKyAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKy8qKgorICAqIEBicmllZiAgV2FpdCBmb3IgaW5qZWN0ZWQgZ3JvdXAgY29udmVyc2lvbiB0byBiZSBjb21wbGV0ZWQuCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCB2YWx1ZSBpbiBtaWxsaXNlY29uZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9JbmplY3RlZFBvbGxGb3JDb252ZXJzaW9uKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisgIHVpbnQzMl90IHRtcF9GbGFnX0VPQzsKKyAgdWludDMyX3QgdG1wX2NmZ3IgPSAweDAwMDAwMDAwVTsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisKKyAgLyogSWYgZW5kIG9mIGNvbnZlcnNpb24gc2VsZWN0ZWQgdG8gZW5kIG9mIHNlcXVlbmNlICovCisgIGlmIChoYWRjLT5Jbml0LkVPQ1NlbGVjdGlvbiA9PSBBRENfRU9DX1NFUV9DT05WKQorICB7CisgICAgdG1wX0ZsYWdfRU9DID0gQURDX0ZMQUdfSkVPUzsKKyAgfQorICAvKiBJZiBlbmQgb2YgY29udmVyc2lvbiBzZWxlY3RlZCB0byBlbmQgb2YgZWFjaCBjb252ZXJzaW9uICovCisgIGVsc2UgLyogQURDX0VPQ19TSU5HTEVfQ09OViAqLworICB7CisgICAgdG1wX0ZsYWdfRU9DID0gKEFEQ19GTEFHX0pFT0MgfCBBRENfRkxBR19KRU9TKTsKKyAgfQorICAKKyAgLyogR2V0IHJlbGV2YW50IHJlZ2lzdGVyIENGR1IgaW4gQURDIGluc3RhbmNlIG9mIEFEQyBtYXN0ZXIgb3Igc2xhdmUgICAgICAqLworICAvKiBpbiBmdW5jdGlvbiBvZiBtdWx0aW1vZGUgc3RhdGUgKGZvciBkZXZpY2VzIHdpdGggbXVsdGltb2RlICAgICAgICAgICAgICovCisgIC8qIGF2YWlsYWJsZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYgKEFEQ19OT05NVUxUSU1PREVfT1JfTVVMVElNT0RFTUFTVEVSKGhhZGMpKQorICB7CisgICAgdG1wX2NmZ3IgPSBSRUFEX1JFRyhoYWRjLT5JbnN0YW5jZS0+Q0ZHUik7IAorICB9CisgIGVsc2UKKyAgeworICAgIHRtcF9jZmdyID0gUkVBRF9SRUcoQURDX01BU1RFUl9JTlNUQU5DRShoYWRjKS0+Q0ZHUik7CisgIH0KKyAgCisgIC8qIEdldCB0aWNrIGNvdW50ICovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7ICAKKyAgICAgCisgIC8qIFdhaXQgdW50aWwgRW5kIG9mIENvbnZlcnNpb24gZmxhZyBpcyByYWlzZWQgKi8KKyAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoaGFkYy0+SW5zdGFuY2UtPklTUiwgdG1wX0ZsYWdfRU9DKSkKKyAgeworICAgIC8qIENoZWNrIGlmIHRpbWVvdXQgaXMgZGlzYWJsZWQgKHNldCB0byBpbmZpbml0ZSB3YWl0KSAqLworICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZigoVGltZW91dCA9PSAwVSkgfHwgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpKQorICAgICAgeworICAgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gdGltZW91dCAqLworICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1RJTUVPVVQpOworICAgICAgICAKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisgIAorICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgKi8KKyAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfRU9DKTsKKyAgCisgIC8qIERldGVybWluZSB3aGV0aGVyIGFueSBmdXJ0aGVyIGNvbnZlcnNpb24gdXBjb21pbmcgb24gZ3JvdXAgaW5qZWN0ZWQgICAgICAqLworICAvKiBieSBleHRlcm5hbCB0cmlnZ2VyIG9yIGJ5IGF1dG9tYXRpYyBpbmplY3RlZCBjb252ZXJzaW9uICAgICAgICAgICAgICAgICAgKi8KKyAgLyogZnJvbSBncm91cCByZWd1bGFyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmKEFEQ19JU19TT0ZUV0FSRV9TVEFSVF9JTkpFQ1RFRChoYWRjKSAgICAgICAgICAgICAgICAgICB8fAorICAgICAoKFJFQURfQklUICh0bXBfY2ZnciwgQURDX0NGR1JfSkFVVE8pID09IFJFU0VUKSAgICAmJgorICAgICAgKEFEQ19JU19TT0ZUV0FSRV9TVEFSVF9SRUdVTEFSKGhhZGMpICAgICAgICAgICYmCisgICAgICAoUkVBRF9CSVQgKHRtcF9jZmdyLCBBRENfQ0ZHUl9DT05UKSA9PSBSRVNFVCkgICApICAgKSAgICkKKyAgeworICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpOyAgIAorICAgIAorICAgIGlmIChIQUxfSVNfQklUX0NMUihoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSkpCisgICAgeworICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUFEWSk7CisgICAgfQorICB9CisgIAorICAvKiBDbGVhciBlbmQgb2YgY29udmVyc2lvbiBmbGFnIG9mIGluamVjdGVkIGdyb3VwIGlmIGxvdyBwb3dlciBmZWF0dXJlICAgICAgKi8KKyAgLyogIkF1dG8gV2FpdCIgaXMgZGlzYWJsZWQsIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCB0aGlzIGZlYXR1cmUgdW50aWwgZGF0YSAgICovCisgIC8qIHJlZ2lzdGVyIGlzIHJlYWQgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19HZXRWYWx1ZSgpLiAgICAgICAgICAgICAgICAgICAgICAqLworICBpZiAoUkVBRF9CSVQgKHRtcF9jZmdyLCBBRENfQ0ZHUl9BVVRETFkpID09IFJFU0VUKQorICB7CisgICAgLyogQ2xlYXIgaW5qZWN0ZWQgZ3JvdXAgY29udmVyc2lvbiBmbGFnICovCisgICAgLyogKEpFT0Mgb3IgSkVPUyBkZXBlbmRpbmcgb24gSEFMIEFEQyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIpICovCisgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgdG1wX0ZsYWdfRU9DKTsKKyAgfQorICAKKyAgLyogUmV0dXJuIEFEQyBzdGF0ZSAqLworICByZXR1cm4gSEFMX09LOworfQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorLyoqCisgICogQGJyaWVmICBXYWl0IGZvciBpbmplY3RlZCBncm91cCBjb252ZXJzaW9uIHRvIGJlIGNvbXBsZXRlZC4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IHZhbHVlIGluIG1pbGxpc2Vjb25kLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X0luamVjdGVkUG9sbEZvckNvbnZlcnNpb24oQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDBVOworICAKKyAgLyogVmFyaWFibGVzIGZvciBwb2xsaW5nIGluIGNhc2Ugb2Ygc2NhbiBtb2RlIGVuYWJsZWQgKi8KKyAgdWludDMyX3QgQ29udmVyc2lvbl9UaW1lb3V0X0NQVV9jeWNsZXNfbWF4ID0wVTsKKyAgdWludDMyX3QgQ29udmVyc2lvbl9UaW1lb3V0X0NQVV9jeWNsZXMgPTBVOworIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworCisgIC8qIEdldCB0aWNrIGNvdW50ICovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7ICAKKyAgICAgCisgIC8qIFBvbGxpbmcgZm9yIGVuZCBvZiBjb252ZXJzaW9uOiBkaWZmZXJlbnRpYXRpb24gaWYgc2luZ2xlL3NlcXVlbmNlICAgICAgICAqLworICAvKiBjb252ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRm9yIGluamVjdGVkIGdyb3VwLCBmbGFnIEpFT0MgaXMgc2V0IG9ubHkgYXQgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UsICAgICovCisgIC8qIG5vdCBmb3IgZWFjaCBjb252ZXJzaW9uIHdpdGhpbiB0aGUgc2VxdWVuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBJZiBzaW5nbGUgY29udmVyc2lvbiBmb3IgaW5qZWN0ZWQgZ3JvdXAgKHNjYW4gbW9kZSBkaXNhYmxlZCBvciAgICAgICAgKi8KKyAgLyogICAgSW5qZWN0ZWROYnJPZkNvbnZlcnNpb24gPT0xVSksIGZsYWcgSkVPQyBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgICAgICAqLworICAvKiAgICBjb252ZXJzaW9uIGNvbXBsZXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIC0gSWYgc2VxdWVuY2UgY29udmVyc2lvbiBmb3IgaW5qZWN0ZWQgZ3JvdXAgKHNjYW4gbW9kZSBlbmFibGVkIGFuZCAgICAgICovCisgIC8qICAgIEluamVjdGVkTmJyT2ZDb252ZXJzaW9uID49MlUpLCBmbGFnIEpFT0MgaXMgc2V0IG9ubHkgYXQgdGhlIGVuZCBvZiB0aGUgKi8KKyAgLyogICAgc2VxdWVuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRvIHBvbGwgZm9yIGVhY2ggY29udmVyc2lvbiwgdGhlIG1heGltdW0gY29udmVyc2lvbiB0aW1lIGlzIGNvbXB1dGVkICAqLworICAvKiAgICBmcm9tIEFEQyBjb252ZXJzaW9uIHRpbWUgKHNlbGVjdGVkIHNhbXBsaW5nIHRpbWUgKyBjb252ZXJzaW9uIHRpbWUgb2YgKi8KKyAgLyogICAgMTIuNSBBREMgY2xvY2sgY3ljbGVzKSBhbmQgQVBCMi9BREMgY2xvY2sgcHJlc2NhbGVycyAoZGVwZW5kaW5nIG9uICAgICovCisgIC8qICAgIHNldHRpbmdzLCBjb252ZXJzaW9uIHRpbWUgcmFuZ2UgY2FuIGJlIGZyb20gMjggdG8gMzIyNTYgQ1BVIGN5Y2xlcykuICAqLworICAvKiAgICBBcyBmbGFnIEpFT0MgaXMgbm90IHNldCBhZnRlciBlYWNoIGNvbnZlcnNpb24sIG5vIHRpbWVvdXQgc3RhdHVzIGNhbiAgKi8KKyAgLyogICAgYmUgc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmICgoaGFkYy0+SW5zdGFuY2UtPkpTUVIgJiBBRENfSlNRUl9KTCkgPT0gUkVTRVQpCisgIHsKKyAgICAvKiBXYWl0IHVudGlsIEVuZCBvZiBDb252ZXJzaW9uIGZsYWcgaXMgcmFpc2VkICovCisgICAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoaGFkYy0+SW5zdGFuY2UtPlNSLCBBRENfRkxBR19KRU9DKSkKKyAgICB7CisgICAgICAvKiBDaGVjayBpZiB0aW1lb3V0IGlzIGRpc2FibGVkIChzZXQgdG8gaW5maW5pdGUgd2FpdCkgKi8KKyAgICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICAgIHsKKyAgICAgICAgaWYoKFRpbWVvdXQgPT0gMFUpIHx8ICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byB0aW1lb3V0ICovCisgICAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9USU1FT1VUKTsKKyAgICAgICAgICAKKyAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgICAgICAgIAorICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBSZXBsYWNlIHBvbGxpbmcgYnkgd2FpdCBmb3IgbWF4aW11bSBjb252ZXJzaW9uIHRpbWUgKi8KKyAgICAvKiBDYWxjdWxhdGlvbiBvZiBDUFUgY3ljbGVzIGNvcnJlc3BvbmRpbmcgdG8gQURDIGNvbnZlcnNpb24gY3ljbGVzLiAgICAgICovCisgICAgLyogUmV0cmlldmUgQURDIGNsb2NrIHByZXNjYWxlciBhbmQgQURDIG1heGltdW0gY29udmVyc2lvbiBjeWNsZXMgb24gYWxsICAqLworICAgIC8qIGNoYW5uZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBDb252ZXJzaW9uX1RpbWVvdXRfQ1BVX2N5Y2xlc19tYXggPSBBRENfQ0xPQ0tfUFJFU0NBTEVSX1JBTkdFKCk7CisgICAgQ29udmVyc2lvbl9UaW1lb3V0X0NQVV9jeWNsZXNfbWF4ICo9IEFEQ19DT05WQ1lDTEVTX01BWF9SQU5HRShoYWRjKTsKKyAgICAKKyAgICAvKiBQb2xsIHdpdGggbWF4aW11bSBjb252ZXJzaW9uIHRpbWUgKi8KKyAgICB3aGlsZShDb252ZXJzaW9uX1RpbWVvdXRfQ1BVX2N5Y2xlcyA8IENvbnZlcnNpb25fVGltZW91dF9DUFVfY3ljbGVzX21heCkKKyAgICB7CisgICAgICAvKiBDaGVjayBpZiB0aW1lb3V0IGlzIGRpc2FibGVkIChzZXQgdG8gaW5maW5pdGUgd2FpdCkgKi8KKyAgICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICAgIHsKKyAgICAgICAgaWYoKFRpbWVvdXQgPT0gMFUpIHx8ICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byB0aW1lb3V0ICovCisgICAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9USU1FT1VUKTsKKyAgICAgICAgICAKKyAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgICAgICAgIAorICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgQ29udmVyc2lvbl9UaW1lb3V0X0NQVV9jeWNsZXMgKys7CisgICAgfQorICB9CisgIAorICAgICAgCisgIC8qIENsZWFyIGluamVjdGVkIGdyb3VwIGNvbnZlcnNpb24gZmxhZyAoYW5kIHJlZ3VsYXIgY29udmVyc2lvbiBmbGFnIHJhaXNlZCBzaW11bHRhbmVvdXNseSkgKi8KKyAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfSlNUUlQgfCBBRENfRkxBR19KRU9DIHwgQURDX0ZMQUdfRU9DKTsKKyAgCisgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSAqLworICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9FT0MpOworICAKKyAgLyogRGV0ZXJtaW5lIHdoZXRoZXIgYW55IGZ1cnRoZXIgY29udmVyc2lvbiB1cGNvbWluZyBvbiBncm91cCBpbmplY3RlZCAgICAgICovCisgIC8qIGJ5IGV4dGVybmFsIHRyaWdnZXIgb3IgYnkgYXV0b21hdGljIGluamVjdGVkIGNvbnZlcnNpb24gICAgICAgICAgICAgICAgICAqLworICAvKiBmcm9tIGdyb3VwIHJlZ3VsYXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYoQURDX0lTX1NPRlRXQVJFX1NUQVJUX0lOSkVDVEVEKGhhZGMpICAgICAgICAgICAgICAgICAgICAgfHwgCisgICAgIChIQUxfSVNfQklUX0NMUihoYWRjLT5JbnN0YW5jZS0+Q1IxLCBBRENfQ1IxX0pBVVRPKSAmJiAgICAgCisgICAgIChBRENfSVNfU09GVFdBUkVfU1RBUlRfUkVHVUxBUihoYWRjKSAgICAgICAgJiYKKyAgICAgIChoYWRjLT5Jbml0LkNvbnRpbnVvdXNDb252TW9kZSA9PSBESVNBQkxFKSAgICkgICAgICAgICkgICApCisgIHsKKyAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgQ0xFQVJfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKTsgICAKKyAgICAKKyAgICBpZiAoSEFMX0lTX0JJVF9DTFIoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpKQorICAgIHsKKyAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICAgIH0KKyAgfQorICAKKyAgLyogUmV0dXJuIEFEQyBzdGF0ZSAqLworICByZXR1cm4gSEFMX09LOworfQorI2VuZGlmIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorLyoqCisgICogQGJyaWVmICBFbmFibGVzIEFEQywgc3RhcnRzIGNvbnZlcnNpb24gb2YgaW5qZWN0ZWQgZ3JvdXAgd2l0aCBpbnRlcnJ1cHRpb24uCisgICogICAgICAgICBJbnRlcnJ1cHRpb25zIGVuYWJsZWQgaW4gdGhpcyBmdW5jdGlvbjoKKyAgKiAgICAgICAgICAtIEpFT0MgKGVuZCBvZiBjb252ZXJzaW9uIG9mIGluamVjdGVkIGdyb3VwKSBvciBKRU9TIChlbmQgb2YgCisgICogICAgICAgICAgICBzZXF1ZW5jZSBvZiBpbmplY3RlZCBncm91cCkgZGVwZW5kaW5nIG9uIEFEQyBpbml0aWFsaXphdGlvbiAKKyAgKiAgICAgICAgICAgIHBhcmFtZXRlciAiRU9DU2VsZWN0aW9uIgorICAqICAgICAgICAgRWFjaCBvZiB0aGVzZSBpbnRlcnJ1cHRpb25zIGhhcyBpdHMgZGVkaWNhdGVkIGNhbGxiYWNrIGZ1bmN0aW9uLgorICAqIEBub3RlICAgQ2FzZSBvZiBtdWx0aW1vZGUgZW5hYmxlZCAoZm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQ3MpOiBUaGlzIAorICAqICAgICAgICAgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgZm9yIEFEQyBzbGF2ZSBmaXJzdCwgdGhlbiBBREMgbWFzdGVyLiAKKyAgKiAgICAgICAgIEZvciBBREMgc2xhdmUsIEFEQyBpcyBlbmFibGVkIG9ubHkgKGNvbnZlcnNpb24gaXMgbm90IHN0YXJ0ZWQpLiAgCisgICogICAgICAgICBGb3IgQURDIG1hc3RlciwgQURDIGlzIGVuYWJsZWQgYW5kIG11bHRpbW9kZSBjb252ZXJzaW9uIGlzIHN0YXJ0ZWQuCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMuCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfSW5qZWN0ZWRTdGFydF9JVChBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXMgPSBIQUxfT0s7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworCisgIC8qIFBlcmZvcm0gQURDIGVuYWJsZSBhbmQgY29udmVyc2lvbiBzdGFydCBpZiBubyBjb252ZXJzaW9uIGlzIG9uIGdvaW5nICovCisgIGlmIChBRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX0lOSkVDVEVEKGhhZGMpID09IFJFU0VUKQorICB7CisgICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhhZGMpOworICAgIAorICAgIC8qIEVuYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgKi8KKyAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19FbmFibGUoaGFkYyk7CisgICAgCisgICAgLyogU3RhcnQgY29udmVyc2lvbiBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZW5hYmxlZCAqLworICAgICAgLyogU3RhcnQgY29udmVyc2lvbiBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZW5hYmxlZCAqLworICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogU2V0IEFEQyBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qIC0gQ2xlYXIgc3RhdGUgYml0ZmllbGQgcmVsYXRlZCB0byBpbmplY3RlZCBncm91cCBjb252ZXJzaW9uIHJlc3VsdHMgICovCisgICAgICAvKiAtIFNldCBzdGF0ZSBiaXRmaWVsZCByZWxhdGVkIHRvIGluamVjdGVkIG9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAqLworICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZIHwgSEFMX0FEQ19TVEFURV9JTkpfRU9DLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSk7CisgICAgICAKKyAgICAgIC8qIENhc2Ugb2YgaW5kZXBlbmRlbnQgbW9kZSBvciBtdWx0aW1vZGUoZm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQ3MpOiovCisgICAgICAvKiBTZXQgbXVsdGltb2RlIHN0YXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgaWYgKEFEQ19OT05NVUxUSU1PREVfT1JfTVVMVElNT0RFTUFTVEVSKGhhZGMpKQorICAgICAgeworICAgICAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfTVVMVElNT0RFX1NMQVZFKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9NVUxUSU1PREVfU0xBVkUpOworICAgICAgfQorICAgICAgCisgICAgICAvKiBDaGVjayBpZiBhIHJlZ3VsYXIgY29udmVyc2lvbiBpcyBvbmdvaW5nICovCisgICAgICAvKiBOb3RlOiBPbiB0aGlzIGRldmljZSwgdGhlcmUgaXMgbm8gQURDIGVycm9yIGNvZGUgZmllbGRzIHJlbGF0ZWQgdG8gICAqLworICAgICAgLyogICAgICAgY29udmVyc2lvbnMgb24gZ3JvdXAgaW5qZWN0ZWQgb25seS4gSW4gY2FzZSBvZiBjb252ZXJzaW9uIG9uICAgKi8KKyAgICAgIC8qICAgICAgIGdvaW5nIG9uIGdyb3VwIHJlZ3VsYXIsIG5vIGVycm9yIGNvZGUgaXMgcmVzZXQuICAgICAgICAgICAgICAgICovCisgICAgICBpZiAoSEFMX0lTX0JJVF9DTFIoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpKQorICAgICAgeworICAgICAgICAvKiBSZXNldCBBREMgYWxsIGVycm9yIGNvZGUgZmllbGRzICovCisgICAgICAgIEFEQ19DTEVBUl9FUlJPUkNPREUoaGFkYyk7CisgICAgICB9CisgICAgICAKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIC8qIFVubG9jayBiZWZvcmUgc3RhcnRpbmcgQURDIGNvbnZlcnNpb25zOiBpbiBjYXNlIG9mIHBvdGVudGlhbCAgICAgICAgICovCisgICAgICAvKiBpbnRlcnJ1cHRpb24sIHRvIGxldCB0aGUgcHJvY2VzcyB0byBBREMgSVJRIEhhbmRsZXIuICAgICAgICAgICAgICAgICAqLworICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgICAgCisgICAgICAvKiBDbGVhciBpbmplY3RlZCBncm91cCBjb252ZXJzaW9uIGZsYWcgKi8KKyAgICAgIC8qIChUbyBlbnN1cmUgb2Ygbm8gdW5rbm93biBzdGF0ZSBmcm9tIHBvdGVudGlhbCBwcmV2aW91cyBBREMgICAgICAgICAgICovCisgICAgICAvKiBvcGVyYXRpb25zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgKEFEQ19GTEFHX0pFT0MgfCBBRENfRkxBR19KRU9TKSk7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSBBREMgSW5qZWN0ZWQgY29udGV4dCBxdWV1ZSBvdmVyZmxvdyBpbnRlcnJ1cHQgaWYgdGhpcyBmZWF0dXJlICovCisgICAgICAvKiBpcyBlbmFibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgaWYgKChoYWRjLT5JbnN0YW5jZS0+Q0ZHUiAmIEFEQ19DRkdSX0pRTSkgIT0gUkVTRVQpCisgICAgICB7CisgICAgICAgIF9fSEFMX0FEQ19FTkFCTEVfSVQoaGFkYywgQURDX0ZMQUdfSlFPVkYpOworICAgICAgfQorICAgICAgCisgICAgICAvKiBFbmFibGUgQURDIGVuZCBvZiBjb252ZXJzaW9uIGludGVycnVwdCAqLworICAgICAgc3dpdGNoKGhhZGMtPkluaXQuRU9DU2VsZWN0aW9uKQorICAgICAgeworICAgICAgICBjYXNlIEFEQ19FT0NfU0VRX0NPTlY6IAorICAgICAgICAgIF9fSEFMX0FEQ19ESVNBQkxFX0lUKGhhZGMsIEFEQ19JVF9KRU9DKTsKKyAgICAgICAgICBfX0hBTF9BRENfRU5BQkxFX0lUKGhhZGMsIEFEQ19JVF9KRU9TKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgLyogY2FzZSBBRENfRU9DX1NJTkdMRV9DT05WICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgX19IQUxfQURDX0VOQUJMRV9JVChoYWRjLCBBRENfSVRfSkVPQyB8IEFEQ19JVF9KRU9TKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyogRW5hYmxlIGNvbnZlcnNpb24gb2YgaW5qZWN0ZWQgZ3JvdXAsIGlmIGF1dG9tYXRpYyBpbmplY3RlZCAgICAgICAgICAgKi8KKyAgICAgIC8qIGNvbnZlcnNpb24gaXMgZGlzYWJsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiBJZiBzb2Z0d2FyZSBzdGFydCBoYXMgYmVlbiBzZWxlY3RlZCwgY29udmVyc2lvbiBzdGFydHMgaW1tZWRpYXRlbHkuICAqLworICAgICAgLyogSWYgZXh0ZXJuYWwgdHJpZ2dlciBoYXMgYmVlbiBzZWxlY3RlZCwgY29udmVyc2lvbiB3aWxsIHN0YXJ0IGF0IG5leHQgKi8KKyAgICAgIC8qIHRyaWdnZXIgZXZlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiBDYXNlIG9mIG11bHRpbW9kZSBlbmFibGVkIChmb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDcyk6ICAgICAgICAgICAqLworICAgICAgLyogIC0gaWYgQURDIGlzIHNsYXZlLCBBREMgaXMgZW5hYmxlZCBvbmx5IChjb252ZXJzaW9uIGlzIG5vdCBzdGFydGVkKS4gKi8KKyAgICAgIC8qICAtIGlmIEFEQyBpcyBtYXN0ZXIsIEFEQyBpcyBlbmFibGVkIGFuZCBjb252ZXJzaW9uIGlzIHN0YXJ0ZWQuICAgICAgICovCisgICAgICBpZiAoSEFMX0lTX0JJVF9DTFIoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0pBVVRPKSAmJiAKKyAgICAgICAgICBBRENfTk9OTVVMVElNT0RFX0lOSl9PUl9NVUxUSU1PREVNQVNURVIoaGFkYykgICAgICAgICAgKQorICAgICAgeworICAgICAgICBTRVRfQklUKGhhZGMtPkluc3RhbmNlLT5DUiwgQURDX0NSX0pBRFNUQVJUKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfQlVTWTsKKyAgfQorICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgQURDLCBzdGFydHMgY29udmVyc2lvbiBvZiBpbmplY3RlZCBncm91cCB3aXRoIGludGVycnVwdGlvbi4KKyAgKiAgICAgICAgIEludGVycnVwdGlvbnMgZW5hYmxlZCBpbiB0aGlzIGZ1bmN0aW9uOgorICAqICAgICAgICAgIC0gSkVPQyAoZW5kIG9mIGNvbnZlcnNpb24gb2YgaW5qZWN0ZWQgZ3JvdXApCisgICogICAgICAgICBFYWNoIG9mIHRoZXNlIGludGVycnVwdGlvbnMgaGFzIGl0cyBkZWRpY2F0ZWQgY2FsbGJhY2sgZnVuY3Rpb24uCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMuCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfSW5qZWN0ZWRTdGFydF9JVChBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXMgPSBIQUxfT0s7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoYWRjKTsKKyAgICAKKyAgLyogRW5hYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLworICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19FbmFibGUoaGFkYyk7CisgIAorICAvKiBTdGFydCBjb252ZXJzaW9uIGlmIEFEQyBpcyBlZmZlY3RpdmVseSBlbmFibGVkICovCisgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgIHsKKyAgICAvKiBTZXQgQURDIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogLSBDbGVhciBzdGF0ZSBiaXRmaWVsZCByZWxhdGVkIHRvIGluamVjdGVkIGdyb3VwIGNvbnZlcnNpb24gcmVzdWx0cyAgICAqLworICAgIC8qIC0gU2V0IHN0YXRlIGJpdGZpZWxkIHJlbGF0ZWQgdG8gaW5qZWN0ZWQgb3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZIHwgSEFMX0FEQ19TVEFURV9JTkpfRU9DLAorICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpOworICAgIAorICAgIC8qIENoZWNrIGlmIGEgcmVndWxhciBjb252ZXJzaW9uIGlzIG9uZ29pbmcgKi8KKyAgICAvKiBOb3RlOiBPbiB0aGlzIGRldmljZSwgdGhlcmUgaXMgbm8gQURDIGVycm9yIGNvZGUgZmllbGRzIHJlbGF0ZWQgdG8gICAgICovCisgICAgLyogICAgICAgY29udmVyc2lvbnMgb24gZ3JvdXAgaW5qZWN0ZWQgb25seS4gSW4gY2FzZSBvZiBjb252ZXJzaW9uIG9uICAgICAqLworICAgIC8qICAgICAgIGdvaW5nIG9uIGdyb3VwIHJlZ3VsYXIsIG5vIGVycm9yIGNvZGUgaXMgcmVzZXQuICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoSEFMX0lTX0JJVF9DTFIoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpKQorICAgIHsKKyAgICAgIC8qIFJlc2V0IEFEQyBhbGwgZXJyb3IgY29kZSBmaWVsZHMgKi8KKyAgICAgIEFEQ19DTEVBUl9FUlJPUkNPREUoaGFkYyk7CisgICAgfQorICAgIAorICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAvKiBVbmxvY2sgYmVmb3JlIHN0YXJ0aW5nIEFEQyBjb252ZXJzaW9uczogaW4gY2FzZSBvZiBwb3RlbnRpYWwgICAgICAgICAgICovCisgICAgLyogaW50ZXJydXB0aW9uLCB0byBsZXQgdGhlIHByb2Nlc3MgdG8gQURDIElSUSBIYW5kbGVyLiAgICAgICAgICAgICAgICAgICAqLworICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgICAKKyAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgdG8gbm9uZSAqLworICAgIEFEQ19DTEVBUl9FUlJPUkNPREUoaGFkYyk7CisgICAgCisgICAgLyogQ2xlYXIgaW5qZWN0ZWQgZ3JvdXAgY29udmVyc2lvbiBmbGFnICovCisgICAgLyogKFRvIGVuc3VyZSBvZiBubyB1bmtub3duIHN0YXRlIGZyb20gcG90ZW50aWFsIHByZXZpb3VzIEFEQyBvcGVyYXRpb25zKSAqLworICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX0pFT0MpOworICAgIAorICAgIC8qIEVuYWJsZSBlbmQgb2YgY29udmVyc2lvbiBpbnRlcnJ1cHQgZm9yIGluamVjdGVkIGNoYW5uZWxzICovCisgICAgX19IQUxfQURDX0VOQUJMRV9JVChoYWRjLCBBRENfSVRfSkVPQyk7CisKKyAgICAvKiBFbmFibGUgY29udmVyc2lvbiBvZiBpbmplY3RlZCBncm91cC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogSWYgc29mdHdhcmUgc3RhcnQgaGFzIGJlZW4gc2VsZWN0ZWQsIGNvbnZlcnNpb24gc3RhcnRzIGltbWVkaWF0ZWx5LiAgICAqLworICAgIC8qIElmIGV4dGVybmFsIHRyaWdnZXIgaGFzIGJlZW4gc2VsZWN0ZWQsIGNvbnZlcnNpb24gd2lsbCBzdGFydCBhdCBuZXh0ICAgKi8KKyAgICAvKiB0cmlnZ2VyIGV2ZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogSWYgZXh0ZXJuYWwgdHJpZ2dlciBoYXMgYmVlbiBzZWxlY3RlZCwgY29udmVyc2lvbiB3aWxsIHN0YXJ0IGF0IG5leHQgICAqLworICAgIC8qIHRyaWdnZXIgZXZlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBJZiBhdXRvbWF0aWMgaW5qZWN0ZWQgY29udmVyc2lvbiBpcyBlbmFibGVkLCBjb252ZXJzaW9uIHdpbGwgc3RhcnQgICAgICovCisgICAgLyogYWZ0ZXIgbmV4dCByZWd1bGFyIGdyb3VwIGNvbnZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmIChBRENfSVNfU09GVFdBUkVfU1RBUlRfSU5KRUNURUQoaGFkYykgICAgICAgICAgICAgICYmIAorICAgICAgICBIQUxfSVNfQklUX0NMUihoYWRjLT5JbnN0YW5jZS0+Q1IxLCBBRENfQ1IxX0pBVVRPKSAgKQorICAgIHsKKyAgICAgIC8qIFN0YXJ0IEFEQyBjb252ZXJzaW9uIG9uIGluamVjdGVkIGdyb3VwIHdpdGggU1cgc3RhcnQgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNSMiwgKEFEQ19DUjJfSlNXU1RBUlQgfCBBRENfQ1IyX0pFWFRUUklHKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBTdGFydCBBREMgY29udmVyc2lvbiBvbiBpbmplY3RlZCBncm91cCB3aXRoIGV4dGVybmFsIHRyaWdnZXIgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNSMiwgQURDX0NSMl9KRVhUVFJJRyk7CisgICAgfQorICB9CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKy8qKgorICAqIEBicmllZiAgU3RvcCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiAocG90ZW50aWFsIGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIEFEQyBncm91cCByZWd1bGFyIGlzIG5vdCBpbXBhY3RlZCksIGRpc2FibGUgQURDIHBlcmlwaGVyYWwKKyAgKiAgICAgICAgIGlmIG5vIGNvbnZlcnNpb24gaXMgb24gZ29pbmcgb24gZ3JvdXAgcmVndWxhci4KKyAgKiAgICAgICAgIEludGVycnVwdGlvbnMgZGlzYWJsZWQgaW4gdGhpcyBmdW5jdGlvbjoKKyAgKiAgICAgICAgICAtIEpFT0MgKGVuZCBvZiBjb252ZXJzaW9uIG9mIGluamVjdGVkIGdyb3VwKSBhbmQgSkVPUyAoZW5kIG9mIAorICAqICAgICAgICAgICAgc2VxdWVuY2Ugb2YgaW5qZWN0ZWQgZ3JvdXApCisgICogQG5vdGUgICBUbyBzdG9wIEFEQyBjb252ZXJzaW9uIG9mIGJvdGggZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkIGFuZCB0bworICAqICAgICAgICAgdG8gZGlzYWJsZSBBREMgcGVyaXBoZXJhbCwgaW5zdGVhZCBvZiB1c2luZyAyIGZ1bmN0aW9ucworICAqICAgICAgICAgQHJlZiBIQUxfQURDRXhfUmVndWxhclN0b3AoKSBhbmQgQHJlZiBIQUxfQURDRXhfSW5qZWN0ZWRTdG9wKCksCisgICogICAgICAgICB1c2UgZnVuY3Rpb24gQHJlZiBIQUxfQURDX1N0b3AoKS4KKyAgKiBAbm90ZSAgIElmIGluamVjdGVkIGdyb3VwIG1vZGUgYXV0by1pbmplY3Rpb24gaXMgZW5hYmxlZCwKKyAgKiAgICAgICAgIGZ1bmN0aW9uIEhBTF9BRENfU3RvcCBtdXN0IGJlIHVzZWQuCisgICogQG5vdGUgICBDYXNlIG9mIG11bHRpbW9kZSBlbmFibGVkIChmb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDcyk6IFRoaXMgCisgICogICAgICAgICBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBmb3IgQURDIG1hc3RlciBmaXJzdCwgdGhlbiBBREMgc2xhdmUuCisgICogICAgICAgICBGb3IgQURDIG1hc3RlciwgY29udmVyc2lvbiBpcyBzdG9wcGVkIGFuZCBBREMgaXMgZGlzYWJsZWQuIAorICAqICAgICAgICAgRm9yIEFEQyBzbGF2ZSwgQURDIGlzIGRpc2FibGVkIG9ubHkgKGNvbnZlcnNpb24gc3RvcCBvZiBBREMgbWFzdGVyCisgICogICAgICAgICBoYXMgYWxyZWFkeSBzdG9wcGVkIGNvbnZlcnNpb24gb2YgQURDIHNsYXZlKS4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgYXV0by1pbmplY3Rpb24gbW9kZSwgSEFMX0FEQ19TdG9wIG11c3QgYmUgdXNlZC4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X0luamVjdGVkU3RvcF9JVChBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sgCisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGFkYyk7CisgIAorICAvKiBTdG9wIHBvdGVudGlhbCBBREMgY29udmVyc2lvbiBvbiBnb2luZyBhbmQgZGlzYWJsZSBBREMgcGVyaXBoZXJhbCAgICAgICAgKi8KKyAgLyogY29uZGl0aW9uZWQgdG86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIC0gSW4gY2FzZSBvZiBhdXRvLWluamVjdGlvbiBtb2RlLCBIQUxfQURDX1N0b3AgbXVzdCBiZSB1c2VkLiAgICAgICAgICAgICAqLworICAvKiAtIEZvciBBREMgaW5qZWN0ZWQgZ3JvdXAgY29udmVyc2lvbiBzdG9wOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBPbiB0aGlzIFNUTTMyIGZhbWlseSwgY29udmVyc2lvbiBvbiB0aGUgb3RoZXIgZ3JvdXAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgKGdyb3VwIHJlZ3VsYXIpIGNhbiBjb250aW51ZSAoZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkICAgICAgICAgICAgICAqLworICAvKiAgIGNvbnZlcnNpb24gc3RvcCBjb21tYW5kcyBhcmUgaW5kZXBlbmRlbnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogLSBGb3IgQURDIGRpc2FibGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgTm8gY29udmVyc2lvbiBvbiB0aGUgb3RoZXIgZ3JvdXAgKGdyb3VwIHJlZ3VsYXIpIG11c3QgYmUgaW50ZW5kZWQgdG8gICAqLworICAvKiAgIGNvbnRpbnVlIChncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQgYXJlIGJvdGggaW1wYWN0ZWQgYnkgICAgICAgICAgICAgKi8KKyAgLyogICBBREMgZGlzYWJsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmKEhBTF9JU19CSVRfQ0xSKGhhZGMtPkluc3RhbmNlLT5DRkdSLCBBRENfQ0ZHUl9KQVVUTykpCisgIHsKKyAgICAvKiAxLiBTdG9wIHBvdGVudGlhbCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIGluamVjdGVkIGdyb3VwIG9ubHkuICovCisgICAgdG1wX2hhbF9zdGF0dXMgPSBBRENfQ29udmVyc2lvblN0b3AoaGFkYywgQURDX0lOSkVDVEVEX0dST1VQKTsKKyAgICAKKyAgICAvKiBEaXNhYmxlIEFEQyBwZXJpcGhlcmFsIGlmIGNvbnZlcnNpb24gb24gQURDIGdyb3VwIGluamVjdGVkIGlzICAgICAgICAgICovCisgICAgLyogZWZmZWN0aXZlbHkgc3RvcHBlZCBhbmQgaWYgbm8gY29udmVyc2lvbiBvbiB0aGUgb3RoZXIgZ3JvdXAgICAgICAgICAgICAqLworICAgIC8qIChBREMgZ3JvdXAgcmVndWxhcikgaXMgaW50ZW5kZWQgdG8gY29udGludWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgQURDIGVuZCBvZiBjb252ZXJzaW9uIGludGVycnVwdCBmb3IgaW5qZWN0ZWQgY2hhbm5lbHMgKi8KKyAgICAgIF9fSEFMX0FEQ19ESVNBQkxFX0lUKGhhZGMsIChBRENfSVRfSkVPQyB8IEFEQ19JVF9KRU9TIHwgQURDX0lUX0pRT1ZGKSk7CisgICAgICAKKyAgICAgIGlmKChBRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX1JFR1VMQVIoaGFkYykgPT0gUkVTRVQpICYmCisgICAgICAgICAoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSkgPT0gUkVTRVQpICAgICkKKyAgICAgIHsKKyAgICAgICAgLyogMi4gRGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgKi8KKyAgICAgICAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRGlzYWJsZShoYWRjKTsKKyAgICAgICAgCisgICAgICAgIC8qIENoZWNrIGlmIEFEQyBpcyBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLworICAgICAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kgfCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBDb252ZXJzaW9uIG9uIEFEQyBncm91cCBpbmplY3RlZCBncm91cCBpcyBzdG9wcGVkLCBidXQgQURDIGlzIG5vdCAgICAqLworICAgICAgLyogZGlzYWJsZWQgc2luY2UgY29udmVyc2lvbiBvbiBBREMgZ3JvdXAgcmVndWxhciBpcyBzdGlsbCBvbiBnb2luZy4gICAgKi8KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0NPTkZJRyk7CisgICAgICAKKyAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKy8qKgorICAqIEBicmllZiAgU3RvcCBjb252ZXJzaW9uIG9mIGluamVjdGVkIGNoYW5uZWxzLCBkaXNhYmxlIGludGVycnVwdGlvbiBvZiAKKyAgKiAgICAgICAgIGVuZC1vZi1jb252ZXJzaW9uLiBEaXNhYmxlIEFEQyBwZXJpcGhlcmFsIGlmIG5vIHJlZ3VsYXIgY29udmVyc2lvbgorICAqICAgICAgICAgaXMgb24gZ29pbmcuCisgICogQG5vdGUgICBJZiBBREMgbXVzdCBiZSBkaXNhYmxlZCBhbmQgaWYgY29udmVyc2lvbiBpcyBvbiBnb2luZyBvbiAKKyAgKiAgICAgICAgIHJlZ3VsYXIgZ3JvdXAsIGZ1bmN0aW9uIEhBTF9BRENfU3RvcCBtdXN0IGJlIHVzZWQgdG8gc3RvcCBib3RoCisgICogICAgICAgICBpbmplY3RlZCBhbmQgcmVndWxhciBncm91cHMsIGFuZCBkaXNhYmxlIHRoZSBBREMuCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9JbmplY3RlZFN0b3BfSVQoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhhZGMpOworICAgIAorICAvKiBTdG9wIHBvdGVudGlhbCBjb252ZXJzaW9uIGFuZCBkaXNhYmxlIEFEQyBwZXJpcGhlcmFsICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQ29uZGl0aW9uZWQgdG86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIC0gTm8gY29udmVyc2lvbiBvbiB0aGUgb3RoZXIgZ3JvdXAgKHJlZ3VsYXIgZ3JvdXApIGlzIGludGVuZGVkIHRvICAgICAgICAqLworICAvKiAgIGNvbnRpbnVlIChpbmplY3RlZCBhbmQgcmVndWxhciBncm91cHMgc3RvcCBjb252ZXJzaW9uIGFuZCBBREMgZGlzYWJsZSAgKi8KKyAgLyogICBhcmUgY29tbW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIC0gSW4gY2FzZSBvZiBhdXRvLWluamVjdGlvbiBtb2RlLCBIQUxfQURDX1N0b3AgbXVzdCBiZSB1c2VkLiAgICAgICAgICAgICAqLyAKKyAgaWYoKChoYWRjLT5TdGF0ZSAmIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpID09IFJFU0VUKSAgJiYKKyAgICAgSEFMX0lTX0JJVF9DTFIoaGFkYy0+SW5zdGFuY2UtPkNSMSwgQURDX0NSMV9KQVVUTykgICApCisgIHsKKyAgICAvKiBTdG9wIHBvdGVudGlhbCBjb252ZXJzaW9uIG9uIGdvaW5nLCBvbiByZWd1bGFyIGFuZCBpbmplY3RlZCBncm91cHMgKi8KKyAgICAvKiBEaXNhYmxlIEFEQyBwZXJpcGhlcmFsICovCisgICAgdG1wX2hhbF9zdGF0dXMgPSBBRENfQ29udmVyc2lvblN0b3BfRGlzYWJsZShoYWRjKTsKKyAgICAKKyAgICAvKiBDaGVjayBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8KKyAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgQURDIGVuZCBvZiBjb252ZXJzaW9uIGludGVycnVwdCBmb3IgaW5qZWN0ZWQgY2hhbm5lbHMgKi8KKyAgICAgIF9fSEFMX0FEQ19ESVNBQkxFX0lUKGhhZGMsIEFEQ19JVF9KRU9DKTsKKyAgICAgIAorICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19CVVNZIHwgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0NPTkZJRyk7CisgICAgICAKKyAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KQorLyoqCisgICogQGJyaWVmICBXaXRoIEFEQyBjb25maWd1cmVkIGluIG11bHRpbW9kZSwgZm9yIEFEQyBtYXN0ZXI6CisgICogICAgICAgICBFbmFibGVzIEFEQywgc3RhcnRzIGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cCBhbmQgdHJhbnNmZXJzIHJlc3VsdAorICAqICAgICAgICAgdGhyb3VnaCBETUEuCisgICogICAgICAgICBNdWx0aW1vZGUgbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBjb25maWd1cmVkIHVzaW5nIAorICAqICAgICAgICAgSEFMX0FEQ0V4X011bHRpTW9kZUNvbmZpZ0NoYW5uZWwoKSBmdW5jdGlvbi4KKyAgKiAgICAgICAgIEludGVycnVwdGlvbnMgZW5hYmxlZCBpbiB0aGlzIGZ1bmN0aW9uOgorICAqICAgICAgICAgIC0gRE1BIHRyYW5zZmVyIGNvbXBsZXRlCisgICogICAgICAgICAgLSBETUEgaGFsZiB0cmFuc2ZlcgorICAqICAgICAgICAgIC0gb3ZlcnJ1bgorICAqICAgICAgICAgRWFjaCBvZiB0aGVzZSBpbnRlcnJ1cHRpb25zIGhhcyBpdHMgZGVkaWNhdGVkIGNhbGxiYWNrIGZ1bmN0aW9uLgorICAqIEBub3RlICAgQURDIHNsYXZlIG11c3QgYmUgcHJlbGltaW5hcmlseSBlbmFibGVkIHVzaW5nIHNpbmdsZS1tb2RlICAKKyAgKiAgICAgICAgIEhBTF9BRENfU3RhcnQoKSBmdW5jdGlvbi4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZSBvZiBBREMgbWFzdGVyIChoYW5kbGUgb2YgQURDIHNsYXZlIG11c3Qgbm90IGJlIHVzZWQpCisgICogQHBhcmFtICBwRGF0YSBUaGUgZGVzdGluYXRpb24gQnVmZmVyIGFkZHJlc3MuCisgICogQHBhcmFtICBMZW5ndGggVGhlIGxlbmd0aCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gQURDIHBlcmlwaGVyYWwgdG8gbWVtb3J5LgorICAqIEByZXR2YWwgTm9uZQorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X011bHRpTW9kZVN0YXJ0X0RNQShBRENfSGFuZGxlVHlwZURlZiogaGFkYywgdWludDMyX3QqIHBEYXRhLCB1aW50MzJfdCBMZW5ndGgpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOworICBBRENfSGFuZGxlVHlwZURlZiB0bXBoYWRjU2xhdmU7CisgIEFEQ19Db21tb25fVHlwZURlZiAqdG1wQURDX0NvbW1vbjsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfTVVMVElNT0RFX01BU1RFUl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShoYWRjLT5Jbml0LkNvbnRpbnVvdXNDb252TW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0VYVFRSSUdfRURHRShoYWRjLT5Jbml0LkV4dGVybmFsVHJpZ0NvbnZFZGdlKSk7CisgIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKGhhZGMtPkluaXQuRE1BQ29udGludW91c1JlcXVlc3RzKSk7CisgIAorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhhZGMpOworCisgIC8qIFBlcmZvcm0gQURDIGVuYWJsZSBhbmQgY29udmVyc2lvbiBzdGFydCBpZiBubyBjb252ZXJzaW9uIGlzIG9uIGdvaW5nICovCisgIC8qIChjaGVjayBvbiBBREMgbWFzdGVyIG9ubHkpICovCisgIGlmIChBRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX1JFR1VMQVIoaGFkYykgPT0gUkVTRVQpCisgIHsKKyAgICAvKiBTZXQgYSB0ZW1wb3JhcnkgaGFuZGxlIG9mIHRoZSBBREMgc2xhdmUgYXNzb2NpYXRlZCB0byB0aGUgQURDIG1hc3RlciAgICovCisgICAgLyogKERlcGVuZGluZyBvbiBTVE0zMkYzIHByb2R1Y3QsIHRoZXJlIG1heSBiZSB1cCB0byAyIEFEQyBzbGF2ZXMpICAgICAgICAqLworICAgIEFEQ19NVUxUSV9TTEFWRShoYWRjLCAmdG1waGFkY1NsYXZlKTsKKyAgICAKKyAgICBpZiAodG1waGFkY1NsYXZlLkluc3RhbmNlID09IE5VTEwpCisgICAgeworICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0NPTkZJRyk7CisgICAgICAKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgICAgIAorICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgICAgCisgICAgCisgICAgLyogRW5hYmxlIHRoZSBBREMgcGVyaXBoZXJhbHM6IG1hc3RlciBhbmQgc2xhdmUgKGluIGNhc2UgaWYgbm90IGFscmVhZHkgICAqLworICAgIC8qIGVuYWJsZWQgcHJldmlvdXNseSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19FbmFibGUoaGFkYyk7CisgICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykKKyAgICB7CisgICAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19FbmFibGUoJnRtcGhhZGNTbGF2ZSk7CisgICAgfQorICAgIAorICAgIC8qIFN0YXJ0IGNvbnZlcnNpb24gYWxsIEFEQ3Mgb2YgbXVsdGltb2RlIGFyZSBlZmZlY3RpdmVseSBlbmFibGVkICovCisgICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBTZXQgQURDIHN0YXRlIChBREMgbWFzdGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogLSBDbGVhciBzdGF0ZSBiaXRmaWVsZCByZWxhdGVkIHRvIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiByZXN1bHRzICAgKi8KKyAgICAgIC8qIC0gU2V0IHN0YXRlIGJpdGZpZWxkIHJlbGF0ZWQgdG8gcmVndWxhciBvcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICovCisgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkgfCBIQUxfQURDX1NUQVRFX1JFR19FT0MgfCBIQUxfQURDX1NUQVRFX1JFR19PVlIgfCBIQUxfQURDX1NUQVRFX1JFR19FT1NNUCB8IEhBTF9BRENfU1RBVEVfTVVMVElNT0RFX1NMQVZFLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSk7CisgICAgICAgIAorICAgICAgLyogSWYgY29udmVyc2lvbnMgb24gZ3JvdXAgcmVndWxhciBhcmUgYWxzbyB0cmlnZ2VyaW5nIGdyb3VwIGluamVjdGVkLCAgKi8KKyAgICAgIC8qIHVwZGF0ZSBBREMgc3RhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBpZiAoUkVBRF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0pBVVRPKSAhPSBSRVNFVCkKKyAgICAgIHsKKyAgICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0VPQywgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSk7ICAKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgLyogVW5sb2NrIGJlZm9yZSBzdGFydGluZyBBREMgY29udmVyc2lvbnM6IGluIGNhc2Ugb2YgcG90ZW50aWFsICAgICAgICAgKi8KKyAgICAgIC8qIGludGVycnVwdGlvbiwgdG8gbGV0IHRoZSBwcm9jZXNzIHRvIEFEQyBJUlEgSGFuZGxlci4gICAgICAgICAgICAgICAgICovCisgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgICAgICAKKyAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBub25lICovCisgICAgICBBRENfQ0xFQVJfRVJST1JDT0RFKGhhZGMpOworICAgICAgCisgICAgICAKKyAgICAgIC8qIFNldCB0aGUgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBoYWRjLT5ETUFfSGFuZGxlLT5YZmVyQ3BsdENhbGxiYWNrID0gQURDX0RNQUNvbnZDcGx0OworICAgICAgICAgCisgICAgICAvKiBTZXQgdGhlIERNQSBoYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBoYWRjLT5ETUFfSGFuZGxlLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IEFEQ19ETUFIYWxmQ29udkNwbHQ7CisgICAgICAKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBoYWRjLT5ETUFfSGFuZGxlLT5YZmVyRXJyb3JDYWxsYmFjayA9IEFEQ19ETUFFcnJvciA7CisgICAgICAKKyAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGNvbW1vbiBjb250cm9sIHJlZ2lzdGVyIHRvIHdoaWNoIGlzIGJlbG9uZ2luZyBoYWRjICAgICovCisgICAgICAvKiAoRGVwZW5kaW5nIG9uIFNUTTMyRjMgcHJvZHVjdCwgdGhlcmUgbWF5IGJlIHVwIHRvIDQgQURDIGFuZCAyIGNvbW1vbiAqLworICAgICAgLyogY29udHJvbCByZWdpc3RlcnMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIHRtcEFEQ19Db21tb24gPSBBRENfQ09NTU9OX1JFR0lTVEVSKGhhZGMpOworICAgICAgCisgICAgICAKKyAgICAgIC8qIE1hbmFnZSBBREMgYW5kIERNQSBzdGFydDogQURDIG92ZXJydW4gaW50ZXJydXB0aW9uLCBETUEgc3RhcnQsIEFEQyAgICovCisgICAgICAvKiBzdGFydCAoaW4gY2FzZSBvZiBTVyBzdGFydCk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAvKiBDbGVhciByZWd1bGFyIGdyb3VwIGNvbnZlcnNpb24gZmxhZyBhbmQgb3ZlcnJ1biBmbGFnICovCisgICAgICAvKiAoVG8gZW5zdXJlIG9mIG5vIHVua25vd24gc3RhdGUgZnJvbSBwb3RlbnRpYWwgcHJldmlvdXMgQURDIG9wZXJhdGlvbnMpICovCisgICAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCAoQURDX0ZMQUdfRU9DIHwgQURDX0ZMQUdfRU9TIHwgQURDX0ZMQUdfT1ZSKSk7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSBBREMgb3ZlcnJ1biBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX0FEQ19FTkFCTEVfSVQoaGFkYywgQURDX0lUX09WUik7CisKKyAgICAgIC8qIFN0YXJ0IHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgSEFMX0RNQV9TdGFydF9JVChoYWRjLT5ETUFfSGFuZGxlLCAodWludDMyX3QpJnRtcEFEQ19Db21tb24tPkNEUiwgKHVpbnQzMl90KXBEYXRhLCBMZW5ndGgpOworICAgICAgICAgIAorICAgICAgLyogRW5hYmxlIGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qIElmIHNvZnR3YXJlIHN0YXJ0IGhhcyBiZWVuIHNlbGVjdGVkLCBjb252ZXJzaW9uIHN0YXJ0cyBpbW1lZGlhdGVseS4gICovCisgICAgICAvKiBJZiBleHRlcm5hbCB0cmlnZ2VyIGhhcyBiZWVuIHNlbGVjdGVkLCBjb252ZXJzaW9uIHdpbGwgc3RhcnQgYXQgbmV4dCAqLworICAgICAgLyogdHJpZ2dlciBldmVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNSLCBBRENfQ1JfQURTVEFSVCk7CisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfQlVTWTsKKyAgfQorICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgV2l0aCBBREMgY29uZmlndXJlZCBpbiBtdWx0aW1vZGUsIGZvciBBREMgbWFzdGVyOgorICAqICAgICAgICAgU3RvcCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIChwb3RlbnRpYWwgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gQURDIGdyb3VwIGluamVjdGVkIGlzIG5vdCBpbXBhY3RlZCksCisgICogICAgICAgICBkaXNhYmxlIEFEQyBETUEgdHJhbnNmZXIsIGRpc2FibGUgQURDIHBlcmlwaGVyYWwKKyAgKiAgICAgICAgIGlmIG5vIGNvbnZlcnNpb24gaXMgb24gZ29pbmcgb24gZ3JvdXAgaW5qZWN0ZWQuCisgICogICAgICAgICBJbnRlcnJ1cHRpb25zIGRpc2FibGVkIGluIHRoaXMgZnVuY3Rpb246CisgICogICAgICAgICAgLSBETUEgdHJhbnNmZXIgY29tcGxldGUKKyAgKiAgICAgICAgICAtIERNQSBoYWxmIHRyYW5zZmVyCisgICogICAgICAgICAgLSBvdmVycnVuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIGF1dG8taW5qZWN0aW9uIG1vZGUsIHRoaXMgZnVuY3Rpb24gYWxzbyBzdG9wIGNvbnZlcnNpb24KKyAgKiAgICAgICAgIG9uIEFEQyBncm91cCBpbmplY3RlZC4KKyAgKiBAbm90ZSAgIE11bHRpbW9kZSBpcyBrZXB0IGVuYWJsZWQgYWZ0ZXIgdGhpcyBmdW5jdGlvbi4gVG8gZGlzYWJsZSBtdWx0aW1vZGUKKyAgKiAgICAgICAgIChzZXQgd2l0aCBIQUxfQURDRXhfTXVsdGlNb2RlQ29uZmlnQ2hhbm5lbCgpICksIEFEQyBtdXN0IGJlIAorICAqICAgICAgICAgcmVpbml0aWFsaXplZCB1c2luZyBIQUxfQURDX0luaXQoKSBvciBIQUxfQURDX1JlSW5pdCgpLgorICAqIEBub3RlICAgSW4gY2FzZSBvZiBETUEgY29uZmlndXJlZCBpbiBjaXJjdWxhciBtb2RlLCBmdW5jdGlvbiAKKyAgKiAgICAgICAgIEhBTF9BRENfU3RvcF9ETUEgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhpcyBmdW5jdGlvbiB3aXRoIGhhbmRsZSBvZgorICAqICAgICAgICAgQURDIHNsYXZlLCB0byBwcm9wZXJseSBkaXNhYmxlIHRoZSBETUEgY2hhbm5lbCBvZiBBREMgc2xhdmUuCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUgb2YgQURDIG1hc3RlciAoaGFuZGxlIG9mIEFEQyBzbGF2ZSBtdXN0IG5vdCBiZSB1c2VkKQorICAqIEByZXR2YWwgTm9uZQorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X011bHRpTW9kZVN0b3BfRE1BKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1cyA9IEhBTF9PSzsKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICBBRENfSGFuZGxlVHlwZURlZiB0bXBoYWRjU2xhdmU7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX01VTFRJTU9ERV9NQVNURVJfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGFkYyk7CisgIAorICAvKiAxLiBTdG9wIHBvdGVudGlhbCBtdWx0aW1vZGUgY29udmVyc2lvbiBvbiBnb2luZywgb24gcmVndWxhciBhbmQgICAgICAgICAgKi8KKyAgLyogICAgaW5qZWN0ZWQgZ3JvdXBzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHRtcF9oYWxfc3RhdHVzID0gQURDX0NvbnZlcnNpb25TdG9wKGhhZGMsIEFEQ19SRUdVTEFSX0lOSkVDVEVEX0dST1VQKTsKKworICAvKiBEaXNhYmxlIEFEQyBwZXJpcGhlcmFsIGlmIGNvbnZlcnNpb25zIGFyZSBlZmZlY3RpdmVseSBzdG9wcGVkICovCisgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgIHsKKyAgICAvKiBTZXQgYSB0ZW1wb3JhcnkgaGFuZGxlIG9mIHRoZSBBREMgc2xhdmUgYXNzb2NpYXRlZCB0byB0aGUgQURDIG1hc3RlciAgICovCisgICAgLyogKERlcGVuZGluZyBvbiBTVE0zMkYzIHByb2R1Y3QsIHRoZXJlIG1heSBiZSB1cCB0byAyIEFEQyBzbGF2ZXMpICAgICAgICAqLworICAgIEFEQ19NVUxUSV9TTEFWRShoYWRjLCAmdG1waGFkY1NsYXZlKTsKKyAgICAKKyAgICBpZiAodG1waGFkY1NsYXZlLkluc3RhbmNlID09IE5VTEwpCisgICAgeworICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIChBREMgbWFzdGVyKSB0byBlcnJvciAqLworICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9ETUEpOworICAgICAgCisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgICAgICAKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICAgIAorICAgIC8qIFByb2NlZHVyZSB0byBkaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbDogd2FpdCBmb3IgY29udmVyc2lvbnMgICAgICAgICAgKi8KKyAgICAvKiBlZmZlY3RpdmVseSBzdG9wcGVkIChBREMgbWFzdGVyIGFuZCBBREMgc2xhdmUpLCB0aGVuIGRpc2FibGUgQURDICAgICAgICovCisgICAgCisgICAgLyogMS4gV2FpdCB1bnRpbCBBRFNUUD0wIGZvciBBREMgbWFzdGVyIGFuZCBBREMgc2xhdmUgKi8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOyAgCisKKyAgICB3aGlsZShBRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX1JFR1VMQVIoaGFkYykgICAgICAgICAgfHwgCisgICAgICAgICAgQURDX0lTX0NPTlZFUlNJT05fT05HT0lOR19SRUdVTEFSKCZ0bXBoYWRjU2xhdmUpICAgKQorICAgIHsKKyAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IEFEQ19TVE9QX0NPTlZFUlNJT05fVElNRU9VVCkKKyAgICAgIHsKKyAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIChBREMgbWFzdGVyKSB0byBlcnJvciAqLworICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgICAgCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogRGlzYWJsZSB0aGUgRE1BIGNoYW5uZWwgKGluIGNhc2Ugb2YgRE1BIGluIGNpcmN1bGFyIG1vZGUgb3Igc3RvcCB3aGlsZSAqLworICAgIC8qIHdoaWxlIERNQSB0cmFuc2ZlciBpcyBvbiBnb2luZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBOb3RlOiBJbiBjYXNlIG9mIEFEQyBzbGF2ZSB1c2luZyBpdHMgb3duIERNQSBjaGFubmVsIChtdWx0aW1vZGUgICAgICAgICovCisgICAgLyogICAgICAgcGFyYW1ldGVyICJETUFBY2Nlc3NNb2RlIiBzZXQgdG8gZGlzYWJsZWQpOiAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgIERNQSBjaGFubmVsIG9mIEFEQyBzbGF2ZSBzaG91bGQgc3RvcHBlZCBhZnRlciB0aGlzIGZ1bmN0aW9uIHdpdGggKi8KKyAgICAvKiAgICAgICBmdW5jdGlvbiBIQUxfQURDX1N0b3BfRE1BLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRE1BX0Fib3J0KGhhZGMtPkRNQV9IYW5kbGUpOworICAgIAorICAgIC8qIENoZWNrIGlmIERNQSBjaGFubmVsIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovCisgICAgaWYgKHRtcF9oYWxfc3RhdHVzICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfRE1BKTsKKyAgICB9CisgICAgCisgICAgLyogRGlzYWJsZSBBREMgb3ZlcnJ1biBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9BRENfRElTQUJMRV9JVChoYWRjLCBBRENfSVRfT1ZSKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAvKiAyLiBEaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbHM6IG1hc3RlciBhbmQgc2xhdmUgKi8KKyAgICAvKiBVcGRhdGUgInRtcF9oYWxfc3RhdHVzIiBvbmx5IGlmIERNQSBjaGFubmVsIGRpc2FibGluZyBwYXNzZWQsICAgICAgICAgICovCisgICAgLyogdG8gcmV0YWluIGEgcG90ZW50aWFsIGZhaWxpbmcgc3RhdHVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogQ2hlY2sgaWYgQURDIGFyZSBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLworICAgICAgaWYgKChBRENfRGlzYWJsZShoYWRjKSAhPSBIQUxfRVJST1IpICAgICAgICAgICYmCisgICAgICAgICAgKEFEQ19EaXNhYmxlKCZ0bXBoYWRjU2xhdmUpICE9IEhBTF9FUlJPUikgICApCisgICAgICB7CisgICAgICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOworICAgICAgICAKKyAgICAgICAgLyogQ2hhbmdlIEFEQyBzdGF0ZSAoQURDIG1hc3RlcikgKi8KKyAgICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kgfCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIEluIGNhc2Ugb2YgZXJyb3IsIGF0dGVtcHQgdG8gZGlzYWJsZSBBREMgaW5zdGFuY2VzIGFueXdheSAqLworICAgICAgQURDX0Rpc2FibGUoaGFkYyk7CisgICAgICBBRENfRGlzYWJsZSgmdG1waGFkY1NsYXZlKTsKKyAgICAgIAorICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIChBREMgbWFzdGVyKSB0byBlcnJvciAqLworICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCk7CisgICAgfQorICAgIAorICB9CisgIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgdGhlIGxhc3QgQURDIE1hc3RlciZTbGF2ZSByZWd1bGFyIGNvbnZlcnNpb25zIHJlc3VsdHMgZGF0YQorICAqICAgICAgICAgaW4gdGhlIHNlbGVjdGVkIG11bHRpIG1vZGUuCisgICogQG5vdGUgICBSZWFkaW5nIHJlZ2lzdGVyIENEUiBkb2VzIG5vdCBjbGVhciBmbGFnIEFEQyBmbGFnIEVPQworICAqICAgICAgICAgKEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24pLAorICAqICAgICAgICAgYXMgaXQgaXMgdGhlIGNhc2UgZm9yIGluZGVwZW5kZW50IG1vZGUgZGF0YSByZWdpc3Rlci4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZSBvZiBBREMgbWFzdGVyIChoYW5kbGUgb2YgQURDIHNsYXZlIG11c3Qgbm90IGJlIHVzZWQpCisgICogQHJldHZhbCBUaGUgY29udmVydGVkIGRhdGEgdmFsdWUuCisgICovCit1aW50MzJfdCBIQUxfQURDRXhfTXVsdGlNb2RlR2V0VmFsdWUoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIEFEQ19Db21tb25fVHlwZURlZiAqdG1wQURDX0NvbW1vbjsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfTVVMVElNT0RFX01BU1RFUl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAKKyAgLyogUG9pbnRlciB0byB0aGUgY29tbW9uIGNvbnRyb2wgcmVnaXN0ZXIgdG8gd2hpY2ggaXMgYmVsb25naW5nIGhhZGMgICAgICAgICovCisgIC8qIChEZXBlbmRpbmcgb24gU1RNMzJGMyBwcm9kdWN0LCB0aGVyZSBtYXkgYmUgdXAgdG8gNCBBREMgYW5kIDIgY29tbW9uICAgICAqLworICAvKiBjb250cm9sIHJlZ2lzdGVycykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdG1wQURDX0NvbW1vbiA9IEFEQ19DT01NT05fUkVHSVNURVIoaGFkYyk7CisgIAorICAvKiBSZXR1cm4gdGhlIG11bHRpIG1vZGUgY29udmVyc2lvbiB2YWx1ZSAqLworICByZXR1cm4gdG1wQURDX0NvbW1vbi0+Q0RSOworfQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBpbmplY3RlZCBncm91cCBjb252ZXJzaW9uIHJlc3VsdC4KKyAgKiBAbm90ZSAgIFJlYWRpbmcgcmVnaXN0ZXIgSkRSeCBhdXRvbWF0aWNhbGx5IGNsZWFycyBBREMgZmxhZyBKRU9DCisgICogICAgICAgICAoQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24pLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjbGVhciBBREMgZmxhZyBKRU9TIAorICAqICAgICAgICAgKEFEQyBncm91cCBpbmplY3RlZCBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbikKKyAgKiAgICAgICAgIE9jY3VycmVuY2Ugb2YgZmxhZyBKRU9TIHJpc2luZzoKKyAgKiAgICAgICAgICAtIElmIHNlcXVlbmNlciBpcyBjb21wb3NlZCBvZiAxIHJhbmssIGZsYWcgSkVPUyBpcyBlcXVpdmFsZW50CisgICogICAgICAgICAgICB0byBmbGFnIEpFT0MuCisgICogICAgICAgICAgLSBJZiBzZXF1ZW5jZXIgaXMgY29tcG9zZWQgb2Ygc2V2ZXJhbCByYW5rcywgZHVyaW5nIHRoZSBzY2FuCisgICogICAgICAgICAgICBzZXF1ZW5jZSBmbGFnIEpFT0Mgb25seSBpcyByYWlzZWQsIGF0IHRoZSBlbmQgb2YgdGhlIHNjYW4gc2VxdWVuY2UKKyAgKiAgICAgICAgICAgIGJvdGggZmxhZ3MgSkVPQyBhbmQgRU9TIGFyZSByYWlzZWQuCisgICogICAgICAgICBGbGFnIEpFT1MgbXVzdCBub3QgYmUgY2xlYXJlZCBieSB0aGlzIGZ1bmN0aW9uIGJlY2F1c2UKKyAgKiAgICAgICAgIGl0IHdvdWxkIG5vdCBiZSBjb21wbGlhbnQgd2l0aCBsb3cgcG93ZXIgZmVhdHVyZXMKKyAgKiAgICAgICAgIChmZWF0dXJlIGxvdyBwb3dlciBhdXRvLXdhaXQsIG5vdCBhdmFpbGFibGUgb24gYWxsIFNUTTMyIGZhbWlsaWVzKS4KKyAgKiAgICAgICAgIFRvIGNsZWFyIHRoaXMgZmxhZywgZWl0aGVyIHVzZSBmdW5jdGlvbjogCisgICogICAgICAgICBpbiBwcm9ncmFtbWluZyBtb2RlbCBJVDogQHJlZiBIQUxfQURDX0lSUUhhbmRsZXIoKSwgaW4gcHJvZ3JhbW1pbmcKKyAgKiAgICAgICAgIG1vZGVsIHBvbGxpbmc6IEByZWYgSEFMX0FEQ0V4X0luamVjdGVkUG9sbEZvckNvbnZlcnNpb24oKSAKKyAgKiAgICAgICAgIG9yIEByZWYgX19IQUxfQURDX0NMRUFSX0ZMQUcoJmhhZGMsIEFEQ19GTEFHX0pFT1MpLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHBhcmFtICBJbmplY3RlZFJhbmsgdGhlIGNvbnZlcnRlZCBBREMgaW5qZWN0ZWQgcmFuay4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBBRENfSU5KRUNURURfUkFOS18xOiBJbmplY3RlZCBDaGFubmVsMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBBRENfSU5KRUNURURfUkFOS18yOiBJbmplY3RlZCBDaGFubmVsMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBBRENfSU5KRUNURURfUkFOS18zOiBJbmplY3RlZCBDaGFubmVsMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBBRENfSU5KRUNURURfUkFOS180OiBJbmplY3RlZCBDaGFubmVsNCBzZWxlY3RlZAorICAqIEByZXR2YWwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gZGF0YQorICAqLwordWludDMyX3QgSEFMX0FEQ0V4X0luamVjdGVkR2V0VmFsdWUoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMsIHVpbnQzMl90IEluamVjdGVkUmFuaykKK3sKKyAgdWludDMyX3QgdG1wX2pkciA9IDBVOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19JTkpFQ1RFRF9SQU5LKEluamVjdGVkUmFuaykpOworICAKKyAgLyogTm90ZTogQURDIGZsYWcgSkVPQyBpcyBub3QgY2xlYXJlZCBoZXJlIGJ5IHNvZnR3YXJlIGJlY2F1c2UgICAgICAgICAgICAgICovCisgIC8qICAgICAgIGF1dG9tYXRpY2FsbHkgY2xlYXJlZCBieSBoYXJkd2FyZSB3aGVuIHJlYWRpbmcgcmVnaXN0ZXIgSkRSeC4gICAgICAqLworICAKKyAgLyogR2V0IEFEQyBjb252ZXJ0ZWQgdmFsdWUgKi8gCisgIHN3aXRjaChJbmplY3RlZFJhbmspCisgIHsgIAorICAgIGNhc2UgQURDX0lOSkVDVEVEX1JBTktfNDogCisgICAgICB0bXBfamRyID0gaGFkYy0+SW5zdGFuY2UtPkpEUjQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFEQ19JTkpFQ1RFRF9SQU5LXzM6IAorICAgICAgdG1wX2pkciA9IGhhZGMtPkluc3RhbmNlLT5KRFIzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBRENfSU5KRUNURURfUkFOS18yOiAKKyAgICAgIHRtcF9qZHIgPSBoYWRjLT5JbnN0YW5jZS0+SkRSMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQURDX0lOSkVDVEVEX1JBTktfMToKKyAgICBkZWZhdWx0OgorICAgICAgdG1wX2pkciA9IGhhZGMtPkluc3RhbmNlLT5KRFIxOworICAgICAgYnJlYWs7CisgIH0KKyAgCisgIC8qIFJldHVybiBBREMgY29udmVydGVkIHZhbHVlICovIAorICByZXR1cm4gdG1wX2pkcjsKK30KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBpbmplY3RlZCBncm91cCBjb252ZXJzaW9uIHJlc3VsdC4KKyAgKiBAbm90ZSAgIFJlYWRpbmcgcmVnaXN0ZXIgSkRSeCBhdXRvbWF0aWNhbGx5IGNsZWFycyBBREMgZmxhZyBKRU9DCisgICogICAgICAgICAoQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24pLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjbGVhciBBREMgZmxhZyBKRU9TIAorICAqICAgICAgICAgKEFEQyBncm91cCBpbmplY3RlZCBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbikKKyAgKiAgICAgICAgIE9jY3VycmVuY2Ugb2YgZmxhZyBKRU9TIHJpc2luZzoKKyAgKiAgICAgICAgICAtIElmIHNlcXVlbmNlciBpcyBjb21wb3NlZCBvZiAxIHJhbmssIGZsYWcgSkVPUyBpcyBlcXVpdmFsZW50CisgICogICAgICAgICAgICB0byBmbGFnIEpFT0MuCisgICogICAgICAgICAgLSBJZiBzZXF1ZW5jZXIgaXMgY29tcG9zZWQgb2Ygc2V2ZXJhbCByYW5rcywgZHVyaW5nIHRoZSBzY2FuCisgICogICAgICAgICAgICBzZXF1ZW5jZSBmbGFnIEpFT0Mgb25seSBpcyByYWlzZWQsIGF0IHRoZSBlbmQgb2YgdGhlIHNjYW4gc2VxdWVuY2UKKyAgKiAgICAgICAgICAgIGJvdGggZmxhZ3MgSkVPQyBhbmQgRU9TIGFyZSByYWlzZWQuCisgICogICAgICAgICBGbGFnIEpFT1MgbXVzdCBub3QgYmUgY2xlYXJlZCBieSB0aGlzIGZ1bmN0aW9uIGJlY2F1c2UKKyAgKiAgICAgICAgIGl0IHdvdWxkIG5vdCBiZSBjb21wbGlhbnQgd2l0aCBsb3cgcG93ZXIgZmVhdHVyZXMKKyAgKiAgICAgICAgIChmZWF0dXJlIGxvdyBwb3dlciBhdXRvLXdhaXQsIG5vdCBhdmFpbGFibGUgb24gYWxsIFNUTTMyIGZhbWlsaWVzKS4KKyAgKiAgICAgICAgIFRvIGNsZWFyIHRoaXMgZmxhZywgZWl0aGVyIHVzZSBmdW5jdGlvbjogCisgICogICAgICAgICBpbiBwcm9ncmFtbWluZyBtb2RlbCBJVDogQHJlZiBIQUxfQURDX0lSUUhhbmRsZXIoKSwgaW4gcHJvZ3JhbW1pbmcKKyAgKiAgICAgICAgIG1vZGVsIHBvbGxpbmc6IEByZWYgSEFMX0FEQ0V4X0luamVjdGVkUG9sbEZvckNvbnZlcnNpb24oKSAKKyAgKiAgICAgICAgIG9yIEByZWYgX19IQUxfQURDX0NMRUFSX0ZMQUcoJmhhZGMsIEFEQ19GTEFHX0pFT1MpLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHBhcmFtICBJbmplY3RlZFJhbmsgdGhlIGNvbnZlcnRlZCBBREMgaW5qZWN0ZWQgcmFuay4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBBRENfSU5KRUNURURfUkFOS18xOiBJbmplY3RlZCBDaGFubmVsMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBBRENfSU5KRUNURURfUkFOS18yOiBJbmplY3RlZCBDaGFubmVsMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBBRENfSU5KRUNURURfUkFOS18zOiBJbmplY3RlZCBDaGFubmVsMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBBRENfSU5KRUNURURfUkFOS180OiBJbmplY3RlZCBDaGFubmVsNCBzZWxlY3RlZAorICAqIEByZXR2YWwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gZGF0YQorICAqLwordWludDMyX3QgSEFMX0FEQ0V4X0luamVjdGVkR2V0VmFsdWUoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMsIHVpbnQzMl90IEluamVjdGVkUmFuaykKK3sKKyAgdWludDMyX3QgdG1wX2pkciA9IDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfSU5KRUNURURfUkFOSyhJbmplY3RlZFJhbmspKTsKKyAgCisgIC8qIEdldCBBREMgY29udmVydGVkIHZhbHVlICovIAorICBzd2l0Y2goSW5qZWN0ZWRSYW5rKQorICB7ICAKKyAgICBjYXNlIEFEQ19JTkpFQ1RFRF9SQU5LXzQ6IAorICAgICAgdG1wX2pkciA9IGhhZGMtPkluc3RhbmNlLT5KRFI0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBBRENfSU5KRUNURURfUkFOS18zOiAKKyAgICAgIHRtcF9qZHIgPSBoYWRjLT5JbnN0YW5jZS0+SkRSMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQURDX0lOSkVDVEVEX1JBTktfMjogCisgICAgICB0bXBfamRyID0gaGFkYy0+SW5zdGFuY2UtPkpEUjI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFEQ19JTkpFQ1RFRF9SQU5LXzE6CisgICAgZGVmYXVsdDoKKyAgICAgIHRtcF9qZHIgPSBoYWRjLT5JbnN0YW5jZS0+SkRSMTsKKyAgICAgIGJyZWFrOworICB9CisgIAorICAvKiBSZXR1cm4gQURDIGNvbnZlcnRlZCB2YWx1ZSAqLyAKKyAgcmV0dXJuIHRtcF9qZHI7Cit9CisjZW5kaWYgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiAocG90ZW50aWFsIGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIEFEQyBncm91cCBpbmplY3RlZCBpcyBub3QgaW1wYWN0ZWQpLCBkaXNhYmxlIEFEQyBwZXJpcGhlcmFsCisgICogICAgICAgICBpZiBubyBjb252ZXJzaW9uIGlzIG9uIGdvaW5nIG9uIGdyb3VwIGluamVjdGVkLgorICAqIEBub3RlICAgVG8gc3RvcCBBREMgY29udmVyc2lvbiBvZiBib3RoIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZCBhbmQgdG8KKyAgKiAgICAgICAgIHRvIGRpc2FibGUgQURDIHBlcmlwaGVyYWwsIGluc3RlYWQgb2YgdXNpbmcgMiBmdW5jdGlvbnMKKyAgKiAgICAgICAgIEByZWYgSEFMX0FEQ0V4X1JlZ3VsYXJTdG9wKCkgYW5kIEByZWYgSEFMX0FEQ0V4X0luamVjdGVkU3RvcCgpLAorICAqICAgICAgICAgdXNlIGZ1bmN0aW9uIEByZWYgSEFMX0FEQ19TdG9wKCkuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIGF1dG8taW5qZWN0aW9uIG1vZGUsIHRoaXMgZnVuY3Rpb24gYWxzbyBzdG9wIGNvbnZlcnNpb24KKyAgKiAgICAgICAgIG9uIEFEQyBncm91cCBpbmplY3RlZC4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cy4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9SZWd1bGFyU3RvcChBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXMgPSBIQUxfT0s7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoYWRjKTsKKyAgCisgIC8qIFN0b3AgcG90ZW50aWFsIEFEQyBjb252ZXJzaW9uIG9uIGdvaW5nIGFuZCBkaXNhYmxlIEFEQyBwZXJpcGhlcmFsICAgICAgICAqLworICAvKiBjb25kaXRpb25lZCB0bzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogLSBGb3IgQURDIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiBzdG9wOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgT24gdGhpcyBTVE0zMiBmYW1pbHksIGNvbnZlcnNpb24gb24gdGhlIG90aGVyIGdyb3VwICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIChncm91cCBpbmplY3RlZCkgY2FuIGNvbnRpbnVlIChncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQgICAgICAgICAgICAgKi8KKyAgLyogICBjb252ZXJzaW9uIHN0b3AgY29tbWFuZHMgYXJlIGluZGVwZW5kZW50KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIC0gRm9yIEFEQyBkaXNhYmxlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIE5vIGNvbnZlcnNpb24gb24gdGhlIG90aGVyIGdyb3VwIChncm91cCBpbmplY3RlZCkgbXVzdCBiZSBpbnRlbmRlZCB0byAgKi8KKyAgLyogICBjb250aW51ZSAoZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkIGFyZSBib3RoIGltcGFjdGVkIGJ5ICAgICAgICAgICAgICovCisgIC8qICAgQURDIGRpc2FibGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAKKyAgLyogMS4gU3RvcCBwb3RlbnRpYWwgY29udmVyc2lvbiBvbiBnb2luZywgb24gcmVndWxhciBncm91cCBvbmx5ICovCisgIHRtcF9oYWxfc3RhdHVzID0gQURDX0NvbnZlcnNpb25TdG9wKGhhZGMsIEFEQ19SRUdVTEFSX0dST1VQKTsKKyAgCisgIC8qIERpc2FibGUgQURDIHBlcmlwaGVyYWwgaWYgY29udmVyc2lvbiBvbiBBREMgZ3JvdXAgcmVndWxhciBpcyAgICAgICAgICAgICAqLworICAvKiBlZmZlY3RpdmVseSBzdG9wcGVkIGFuZCBpZiBubyBjb252ZXJzaW9uIG9uIHRoZSBvdGhlciBncm91cCAgICAgICAgICAgICAgKi8KKyAgLyogKEFEQyBncm91cCBpbmplY3RlZCkgaXMgaW50ZW5kZWQgdG8gY29udGludWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmKChBRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX0lOSkVDVEVEKGhhZGMpID09IFJFU0VUKSAmJgorICAgICAoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSkgPT0gUkVTRVQpICAgICApCisgIHsKKyAgICAvKiAyLiBEaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLworICAgIHRtcF9oYWxfc3RhdHVzID0gQURDX0Rpc2FibGUoaGFkYyk7CisgICAgCisgICAgLyogQ2hlY2sgaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovCisgICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kgfCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUFEWSk7CisgICAgfQorICB9CisgIC8qIENvbnZlcnNpb24gb24gQURDIGdyb3VwIHJlZ3VsYXIgZ3JvdXAgaXMgc3RvcHBlZCwgYnV0IEFEQyBpcyBub3QgICAgICAgICAqLworICAvKiBkaXNhYmxlZCBzaW5jZSBjb252ZXJzaW9uIG9uIEFEQyBncm91cCBpbmplY3RlZCBpcyBzdGlsbCBvbiBnb2luZy4gICAgICAgKi8KKyAgZWxzZQorICB7CisgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgIENMRUFSX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSk7CisgIH0KKworICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiAocG90ZW50aWFsIGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIEFEQyBncm91cCBpbmplY3RlZCBpcyBub3QgaW1wYWN0ZWQpLCBkaXNhYmxlIEFEQyBwZXJpcGhlcmFsCisgICogICAgICAgICBpZiBubyBjb252ZXJzaW9uIGlzIG9uIGdvaW5nIG9uIGdyb3VwIGluamVjdGVkLgorICAqICAgICAgICAgSW50ZXJydXB0aW9ucyBkaXNhYmxlZCBpbiB0aGlzIGZ1bmN0aW9uOgorICAqICAgICAgICAgIC0gRU9DIChlbmQgb2YgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwKSBhbmQgRU9TIChlbmQgb2YgCisgICogICAgICAgICAgICBzZXF1ZW5jZSBvZiByZWd1bGFyIGdyb3VwKQorICAqICAgICAgICAgIC0gb3ZlcnJ1bgorICAqIEBub3RlICAgVG8gc3RvcCBBREMgY29udmVyc2lvbiBvZiBib3RoIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZCBhbmQgdG8KKyAgKiAgICAgICAgIHRvIGRpc2FibGUgQURDIHBlcmlwaGVyYWwsIGluc3RlYWQgb2YgdXNpbmcgMiBmdW5jdGlvbnMKKyAgKiAgICAgICAgIEByZWYgSEFMX0FEQ0V4X1JlZ3VsYXJTdG9wKCkgYW5kIEByZWYgSEFMX0FEQ0V4X0luamVjdGVkU3RvcCgpLAorICAqICAgICAgICAgdXNlIGZ1bmN0aW9uIEByZWYgSEFMX0FEQ19TdG9wKCkuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIGF1dG8taW5qZWN0aW9uIG1vZGUsIHRoaXMgZnVuY3Rpb24gYWxzbyBzdG9wIGNvbnZlcnNpb24KKyAgKiAgICAgICAgIG9uIEFEQyBncm91cCBpbmplY3RlZC4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cy4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9SZWd1bGFyU3RvcF9JVChBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXMgPSBIQUxfT0s7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoYWRjKTsKKyAgCisgIC8qIFN0b3AgcG90ZW50aWFsIEFEQyBjb252ZXJzaW9uIG9uIGdvaW5nIGFuZCBkaXNhYmxlIEFEQyBwZXJpcGhlcmFsICAgICAgICAqLworICAvKiBjb25kaXRpb25lZCB0bzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogLSBGb3IgQURDIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiBzdG9wOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgT24gdGhpcyBTVE0zMiBmYW1pbHksIGNvbnZlcnNpb24gb24gdGhlIG90aGVyIGdyb3VwICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIChncm91cCBpbmplY3RlZCkgY2FuIGNvbnRpbnVlIChncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQgICAgICAgICAgICAgKi8KKyAgLyogICBjb252ZXJzaW9uIHN0b3AgY29tbWFuZHMgYXJlIGluZGVwZW5kZW50KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIC0gRm9yIEFEQyBkaXNhYmxlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIE5vIGNvbnZlcnNpb24gb24gdGhlIG90aGVyIGdyb3VwIChncm91cCBpbmplY3RlZCkgbXVzdCBiZSBpbnRlbmRlZCB0byAgKi8KKyAgLyogICBjb250aW51ZSAoZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkIGFyZSBib3RoIGltcGFjdGVkIGJ5ICAgICAgICAgICAgICovCisgIC8qICAgQURDIGRpc2FibGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAKKyAgLyogMS4gU3RvcCBwb3RlbnRpYWwgY29udmVyc2lvbiBvbiBnb2luZywgb24gcmVndWxhciBncm91cCBvbmx5ICovCisgIHRtcF9oYWxfc3RhdHVzID0gQURDX0NvbnZlcnNpb25TdG9wKGhhZGMsIEFEQ19SRUdVTEFSX0dST1VQKTsKKyAgCisgIC8qIERpc2FibGUgQURDIHBlcmlwaGVyYWwgaWYgY29udmVyc2lvbiBvbiBBREMgZ3JvdXAgcmVndWxhciBpcyAgICAgICAgICAgICAqLworICAvKiBlZmZlY3RpdmVseSBzdG9wcGVkIGFuZCBpZiBubyBjb252ZXJzaW9uIG9uIHRoZSBvdGhlciBncm91cCAgICAgICAgICAgICAgKi8KKyAgLyogKEFEQyBncm91cCBpbmplY3RlZCkgaXMgaW50ZW5kZWQgdG8gY29udGludWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmKChBRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX0lOSkVDVEVEKGhhZGMpID09IFJFU0VUKSAmJgorICAgICAoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSkgPT0gUkVTRVQpICAgICApCisgIHsKKyAgICAvKiBEaXNhYmxlIEFEQyBlbmQgb2YgY29udmVyc2lvbiBpbnRlcnJ1cHQgZm9yIHJlZ3VsYXIgZ3JvdXAgKi8KKyAgICAvKiBEaXNhYmxlIEFEQyBvdmVycnVuIGludGVycnVwdCAqLworICAgIF9fSEFMX0FEQ19ESVNBQkxFX0lUKGhhZGMsIChBRENfSVRfRU9DIHwgQURDX0lUX0VPUyB8IEFEQ19JVF9PVlIpKTsKKyAgICAKKyAgICAvKiAyLiBEaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLworICAgIHRtcF9oYWxfc3RhdHVzID0gQURDX0Rpc2FibGUoaGFkYyk7CisgICAgCisgICAgLyogQ2hlY2sgaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovCisgICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kgfCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUFEWSk7CisgICAgfQorICB9CisgIC8qIENvbnZlcnNpb24gb24gQURDIGdyb3VwIHJlZ3VsYXIgZ3JvdXAgaXMgc3RvcHBlZCwgYnV0IEFEQyBpcyBub3QgICAgICAgICAqLworICAvKiBkaXNhYmxlZCBzaW5jZSBjb252ZXJzaW9uIG9uIEFEQyBncm91cCBpbmplY3RlZCBpcyBzdGlsbCBvbiBnb2luZy4gICAgICAgKi8KKyAgZWxzZQorICB7CisgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgIENMRUFSX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSk7CisgIH0KKworICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiAocG90ZW50aWFsIGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIEFEQyBncm91cCBpbmplY3RlZCBpcyBub3QgaW1wYWN0ZWQpLCAKKyAgKiAgICAgICAgIGRpc2FibGUgQURDIERNQSB0cmFuc2ZlciwgZGlzYWJsZSBBREMgcGVyaXBoZXJhbAorICAqICAgICAgICAgaWYgbm8gY29udmVyc2lvbiBpcyBvbiBnb2luZyBvbiBncm91cCBpbmplY3RlZC4KKyAgKiAgICAgICAgIEludGVycnVwdGlvbnMgZGlzYWJsZWQgaW4gdGhpcyBmdW5jdGlvbjoKKyAgKiAgICAgICAgICAtIERNQSB0cmFuc2ZlciBjb21wbGV0ZQorICAqICAgICAgICAgIC0gRE1BIGhhbGYgdHJhbnNmZXIKKyAgKiAgICAgICAgICAtIG92ZXJydW4KKyAgKiBAbm90ZSAgIFRvIHN0b3AgQURDIGNvbnZlcnNpb24gb2YgYm90aCBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQgYW5kIHRvCisgICogICAgICAgICB0byBkaXNhYmxlIEFEQyBwZXJpcGhlcmFsLCBpbnN0ZWFkIG9mIHVzaW5nIDIgZnVuY3Rpb25zCisgICogICAgICAgICBAcmVmIEhBTF9BRENFeF9SZWd1bGFyU3RvcCgpIGFuZCBAcmVmIEhBTF9BRENFeF9JbmplY3RlZFN0b3AoKSwKKyAgKiAgICAgICAgIHVzZSBmdW5jdGlvbiBAcmVmIEhBTF9BRENfU3RvcCgpLgorICAqIEBub3RlICAgQ2FzZSBvZiBtdWx0aW1vZGUgZW5hYmxlZCAoZm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQ3MpOiBUaGlzIAorICAqICAgICAgICAgZnVuY3Rpb24gaXMgZm9yIHNpbmdsZS1BREMgbW9kZSBvbmx5LiBGb3IgbXVsdGltb2RlLCB1c2UgdGhlIAorICAqICAgICAgICAgZGVkaWNhdGVkIE11bHRpbW9kZVN0b3AgZnVuY3Rpb24uCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMuCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfUmVndWxhclN0b3BfRE1BKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1cyA9IEhBTF9PSzsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIAorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhhZGMpOworICAKKyAgLyogU3RvcCBwb3RlbnRpYWwgQURDIGNvbnZlcnNpb24gb24gZ29pbmcgYW5kIGRpc2FibGUgQURDIHBlcmlwaGVyYWwgICAgICAgICovCisgIC8qIGNvbmRpdGlvbmVkIHRvOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAtIEZvciBBREMgcmVndWxhciBncm91cCBjb252ZXJzaW9uIHN0b3A6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBPbiB0aGlzIFNUTTMyIGZhbWlseSwgY29udmVyc2lvbiBvbiB0aGUgb3RoZXIgZ3JvdXAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgKGdyb3VwIGluamVjdGVkKSBjYW4gY29udGludWUgKGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZCAgICAgICAgICAgICAqLworICAvKiAgIGNvbnZlcnNpb24gc3RvcCBjb21tYW5kcyBhcmUgaW5kZXBlbmRlbnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogLSBGb3IgQURDIGRpc2FibGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgTm8gY29udmVyc2lvbiBvbiB0aGUgb3RoZXIgZ3JvdXAgKGdyb3VwIGluamVjdGVkKSBtdXN0IGJlIGludGVuZGVkIHRvICAqLworICAvKiAgIGNvbnRpbnVlIChncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQgYXJlIGJvdGggaW1wYWN0ZWQgYnkgICAgICAgICAgICAgKi8KKyAgLyogICBBREMgZGlzYWJsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIAorICAvKiAxLiBTdG9wIHBvdGVudGlhbCBjb252ZXJzaW9uIG9uIGdvaW5nLCBvbiByZWd1bGFyIGdyb3VwIG9ubHkgKi8KKyAgdG1wX2hhbF9zdGF0dXMgPSBBRENfQ29udmVyc2lvblN0b3AoaGFkYywgQURDX1JFR1VMQVJfR1JPVVApOworICAKKyAgLyogRGlzYWJsZSBBREMgcGVyaXBoZXJhbCBpZiBjb252ZXJzaW9uIG9uIEFEQyBncm91cCByZWd1bGFyIGlzICAgICAgICAgICAgICovCisgIC8qIGVmZmVjdGl2ZWx5IHN0b3BwZWQgYW5kIGlmIG5vIGNvbnZlcnNpb24gb24gdGhlIG90aGVyIGdyb3VwICAgICAgICAgICAgICAqLworICAvKiAoQURDIGdyb3VwIGluamVjdGVkKSBpcyBpbnRlbmRlZCB0byBjb250aW51ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYoKEFEQ19JU19DT05WRVJTSU9OX09OR09JTkdfSU5KRUNURUQoaGFkYykgPT0gUkVTRVQpICYmCisgICAgICgoaGFkYy0+U3RhdGUgJiBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKSA9PSBSRVNFVCkgICAgICkKKyAgeworICAgIC8qIERpc2FibGUgQURDIERNQSAoQURDIERNQSBjb25maWd1cmF0aW9uIEFEQ19DRkdSX0RNQUNGRyBpcyBrZXB0KSAqLworICAgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+Q0ZHUiwgQURDX0NGR1JfRE1BRU4pOworICAgIAorICAgIC8qIERpc2FibGUgdGhlIERNQSBjaGFubmVsIChpbiBjYXNlIG9mIERNQSBpbiBjaXJjdWxhciBtb2RlIG9yIHN0b3Agd2hpbGUgKi8KKyAgICAvKiB3aGlsZSBETUEgdHJhbnNmZXIgaXMgb24gZ29pbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRE1BX0Fib3J0KGhhZGMtPkRNQV9IYW5kbGUpOyAgIAorICAgIAorICAgIC8qIENoZWNrIGlmIERNQSBjaGFubmVsIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovCisgICAgaWYgKHRtcF9oYWxfc3RhdHVzICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfRE1BKTsgICAgIAorICAgIH0KKyAgICAKKyAgICAvKiBEaXNhYmxlIEFEQyBvdmVycnVuIGludGVycnVwdCAqLworICAgIF9fSEFMX0FEQ19ESVNBQkxFX0lUKGhhZGMsIEFEQ19JVF9PVlIpOworICAgIAorICAgIC8qIDIuIERpc2FibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovCisgICAgLyogVXBkYXRlICJ0bXBfaGFsX3N0YXR1cyIgb25seSBpZiBETUEgY2hhbm5lbCBkaXNhYmxpbmcgcGFzc2VkLCAgICAgICAgICAqLworICAgIC8qIHRvIHJldGFpbiBhIHBvdGVudGlhbCBmYWlsaW5nIHN0YXR1cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIHRtcF9oYWxfc3RhdHVzID0gQURDX0Rpc2FibGUoaGFkYyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBBRENfRGlzYWJsZShoYWRjKTsKKyAgICB9CisgICAgCisgICAgLyogQ2hlY2sgaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovCisgICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kgfCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUFEWSk7CisgICAgfQorICB9CisgIC8qIENvbnZlcnNpb24gb24gQURDIGdyb3VwIHJlZ3VsYXIgZ3JvdXAgaXMgc3RvcHBlZCwgYnV0IEFEQyBpcyBub3QgICAgICAgICAqLworICAvKiBkaXNhYmxlZCBzaW5jZSBjb252ZXJzaW9uIG9uIEFEQyBncm91cCBpbmplY3RlZCBpcyBzdGlsbCBvbiBnb2luZy4gICAgICAgKi8KKyAgZWxzZQorICB7CisgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgIENMRUFSX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSk7CisgIH0KKworICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KQorLyoqCisgICogQGJyaWVmICBXaXRoIEFEQyBjb25maWd1cmVkIGluIG11bHRpbW9kZSwgZm9yIEFEQyBtYXN0ZXI6CisgICogICAgICAgICBTdG9wIEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gKHBvdGVudGlhbCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBBREMgZ3JvdXAgaW5qZWN0ZWQgaXMgbm90IGltcGFjdGVkKSwKKyAgKiAgICAgICAgIGRpc2FibGUgQURDIERNQSB0cmFuc2ZlciwgZGlzYWJsZSBBREMgcGVyaXBoZXJhbAorICAqICAgICAgICAgaWYgbm8gY29udmVyc2lvbiBpcyBvbiBnb2luZyBvbiBncm91cCBpbmplY3RlZC4KKyAgKiAgICAgICAgIEludGVycnVwdGlvbnMgZGlzYWJsZWQgaW4gdGhpcyBmdW5jdGlvbjoKKyAgKiAgICAgICAgICAtIERNQSB0cmFuc2ZlciBjb21wbGV0ZQorICAqICAgICAgICAgIC0gRE1BIGhhbGYgdHJhbnNmZXIKKyAgKiAgICAgICAgICAtIG92ZXJydW4KKyAgKiBAbm90ZSAgIFRvIHN0b3AgQURDIGNvbnZlcnNpb24gb2YgYm90aCBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQgYW5kIHRvCisgICogICAgICAgICB0byBkaXNhYmxlIEFEQyBwZXJpcGhlcmFsLCBpbnN0ZWFkIG9mIHVzaW5nIDIgZnVuY3Rpb25zCisgICogICAgICAgICBAcmVmIEhBTF9BRENFeF9SZWd1bGFyTXVsdGlNb2RlU3RvcF9ETUEoKSBhbmQKKyAgKiAgICAgICAgIEByZWYgSEFMX0FEQ0V4X0luamVjdGVkU3RvcCgpLCB1c2UgZnVuY3Rpb24KKyAgKiAgICAgICAgIEByZWYgSEFMX0FEQ0V4X011bHRpTW9kZVN0b3BfRE1BLgorICAqIEBub3RlICAgSW4gY2FzZSBvZiBhdXRvLWluamVjdGlvbiBtb2RlLCB0aGlzIGZ1bmN0aW9uIGFsc28gc3RvcCBjb252ZXJzaW9uCisgICogICAgICAgICBvbiBBREMgZ3JvdXAgaW5qZWN0ZWQuCisgICogQG5vdGUgICBNdWx0aW1vZGUgaXMga2VwdCBlbmFibGVkIGFmdGVyIHRoaXMgZnVuY3Rpb24uIFRvIGRpc2FibGUgbXVsdGltb2RlCisgICogICAgICAgICAoc2V0IHdpdGggSEFMX0FEQ0V4X011bHRpTW9kZUNvbmZpZ0NoYW5uZWwoKSApLCBBREMgbXVzdCBiZSAKKyAgKiAgICAgICAgIHJlaW5pdGlhbGl6ZWQgdXNpbmcgSEFMX0FEQ19Jbml0KCkgb3IgSEFMX0FEQ19SZUluaXQoKS4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgRE1BIGNvbmZpZ3VyZWQgaW4gY2lyY3VsYXIgbW9kZSwgZnVuY3Rpb24gCisgICogICAgICAgICBIQUxfQURDX1N0b3BfRE1BIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoaXMgZnVuY3Rpb24gd2l0aCBoYW5kbGUgb2YKKyAgKiAgICAgICAgIEFEQyBzbGF2ZSwgdG8gcHJvcGVybHkgZGlzYWJsZSB0aGUgRE1BIGNoYW5uZWwgb2YgQURDIHNsYXZlLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlIG9mIEFEQyBtYXN0ZXIgKGhhbmRsZSBvZiBBREMgc2xhdmUgbXVzdCBub3QgYmUgdXNlZCkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9SZWd1bGFyTXVsdGlNb2RlU3RvcF9ETUEoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisgIEFEQ19IYW5kbGVUeXBlRGVmIHRtcGhhZGNTbGF2ZTsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfTVVMVElNT0RFX01BU1RFUl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoYWRjKTsKKyAgCisgIC8qIFN0b3AgcG90ZW50aWFsIEFEQyBjb252ZXJzaW9uIG9uIGdvaW5nIGFuZCBkaXNhYmxlIEFEQyBwZXJpcGhlcmFsICAgICAgICAqLworICAvKiBjb25kaXRpb25lZCB0bzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogLSBGb3IgQURDIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiBzdG9wOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgT24gdGhpcyBTVE0zMiBmYW1pbHksIGNvbnZlcnNpb24gb24gdGhlIG90aGVyIGdyb3VwICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIChncm91cCBpbmplY3RlZCkgY2FuIGNvbnRpbnVlIChncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQgICAgICAgICAgICAgKi8KKyAgLyogICBjb252ZXJzaW9uIHN0b3AgY29tbWFuZHMgYXJlIGluZGVwZW5kZW50KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIC0gRm9yIEFEQyBkaXNhYmxlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIE5vIGNvbnZlcnNpb24gb24gdGhlIG90aGVyIGdyb3VwIChncm91cCBpbmplY3RlZCkgbXVzdCBiZSBpbnRlbmRlZCB0byAgKi8KKyAgLyogICBjb250aW51ZSAoZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkIGFyZSBib3RoIGltcGFjdGVkIGJ5ICAgICAgICAgICAgICovCisgIC8qICAgQURDIGRpc2FibGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAKKyAgLyogMS4gU3RvcCBwb3RlbnRpYWwgY29udmVyc2lvbiBvbiBnb2luZywgb24gcmVndWxhciBncm91cCBvbmx5ICovCisgIHRtcF9oYWxfc3RhdHVzID0gQURDX0NvbnZlcnNpb25TdG9wKGhhZGMsIEFEQ19SRUdVTEFSX0dST1VQKTsKKworICAvKiBEaXNhYmxlIEFEQyBwZXJpcGhlcmFsIGlmIGNvbnZlcnNpb24gb24gQURDIGdyb3VwIHJlZ3VsYXIgaXMgICAgICAgICAgICAgKi8KKyAgLyogZWZmZWN0aXZlbHkgc3RvcHBlZCBhbmQgaWYgbm8gY29udmVyc2lvbiBvbiB0aGUgb3RoZXIgZ3JvdXAgICAgICAgICAgICAgICovCisgIC8qIChBREMgZ3JvdXAgaW5qZWN0ZWQpIGlzIGludGVuZGVkIHRvIGNvbnRpbnVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZigoQURDX0lTX0NPTlZFUlNJT05fT05HT0lOR19JTkpFQ1RFRChoYWRjKSA9PSBSRVNFVCkgJiYKKyAgICAgKChoYWRjLT5TdGF0ZSAmIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpID09IFJFU0VUKSAgICAgKQorICB7CisgICAgLyogU2V0IGEgdGVtcG9yYXJ5IGhhbmRsZSBvZiB0aGUgQURDIHNsYXZlIGFzc29jaWF0ZWQgdG8gdGhlIEFEQyBtYXN0ZXIgICAqLworICAgIC8qIChEZXBlbmRpbmcgb24gU1RNMzJGMyBwcm9kdWN0LCB0aGVyZSBtYXkgYmUgdXAgdG8gMiBBREMgc2xhdmVzKSAgICAgICAgKi8KKyAgICBBRENfTVVMVElfU0xBVkUoaGFkYywgJnRtcGhhZGNTbGF2ZSk7CisgICAgCisgICAgaWYgKHRtcGhhZGNTbGF2ZS5JbnN0YW5jZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSAoQURDIG1hc3RlcikgdG8gZXJyb3IgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfRE1BKTsKKyAgICAgIAorICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgICAgCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgICAKKyAgICAvKiBQcm9jZWR1cmUgdG8gZGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWw6IHdhaXQgZm9yIGNvbnZlcnNpb25zICAgICAgICAgICovCisgICAgLyogZWZmZWN0aXZlbHkgc3RvcHBlZCAoQURDIG1hc3RlciBhbmQgQURDIHNsYXZlKSwgdGhlbiBkaXNhYmxlIEFEQyAgICAgICAqLworICAgIAorICAgIC8qIDEuIFdhaXQgdW50aWwgQURTVFA9MCBmb3IgQURDIG1hc3RlciBhbmQgQURDIHNsYXZlKi8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOyAgCisKKyAgICB3aGlsZShBRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX1JFR1VMQVIoaGFkYykgICAgICAgICAgfHwgCisgICAgICAgICAgQURDX0lTX0NPTlZFUlNJT05fT05HT0lOR19SRUdVTEFSKCZ0bXBoYWRjU2xhdmUpICAgKQorICAgIHsKKyAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IEFEQ19TVE9QX0NPTlZFUlNJT05fVElNRU9VVCkKKyAgICAgIHsKKyAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIChBREMgbWFzdGVyKSB0byBlcnJvciAqLworICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgICAgCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogRGlzYWJsZSB0aGUgRE1BIGNoYW5uZWwgKGluIGNhc2Ugb2YgRE1BIGluIGNpcmN1bGFyIG1vZGUgb3Igc3RvcCB3aGlsZSAqLworICAgIC8qIHdoaWxlIERNQSB0cmFuc2ZlciBpcyBvbiBnb2luZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBOb3RlOiBJbiBjYXNlIG9mIEFEQyBzbGF2ZSB1c2luZyBpdHMgb3duIERNQSBjaGFubmVsIChtdWx0aW1vZGUgICAgICAgICovCisgICAgLyogICAgICAgcGFyYW1ldGVyICJETUFBY2Nlc3NNb2RlIiBzZXQgdG8gZGlzYWJsZWQpOiAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgIERNQSBjaGFubmVsIG9mIEFEQyBzbGF2ZSBzaG91bGQgc3RvcHBlZCBhZnRlciB0aGlzIGZ1bmN0aW9uIHdpdGggKi8KKyAgICAvKiAgICAgICBmdW5jdGlvbiBIQUxfQURDX1N0b3BfRE1BLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRE1BX0Fib3J0KGhhZGMtPkRNQV9IYW5kbGUpOworICAgIAorICAgIC8qIENoZWNrIGlmIERNQSBjaGFubmVsIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovCisgICAgaWYgKHRtcF9oYWxfc3RhdHVzICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfRE1BKTsKKyAgICB9CisgICAgCisgICAgLyogRGlzYWJsZSBBREMgb3ZlcnJ1biBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9BRENfRElTQUJMRV9JVChoYWRjLCBBRENfSVRfT1ZSKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAvKiAyLiBEaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbHM6IG1hc3RlciBhbmQgc2xhdmUgKi8KKyAgICAvKiBVcGRhdGUgInRtcF9oYWxfc3RhdHVzIiBvbmx5IGlmIERNQSBjaGFubmVsIGRpc2FibGluZyBwYXNzZWQsICAgICAgICAgICovCisgICAgLyogdG8gcmV0YWluIGEgcG90ZW50aWFsIGZhaWxpbmcgc3RhdHVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogQ2hlY2sgaWYgQURDIGFyZSBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLworICAgICAgaWYgKChBRENfRGlzYWJsZShoYWRjKSAhPSBIQUxfRVJST1IpICAgICAgICAgICYmCisgICAgICAgICAgKEFEQ19EaXNhYmxlKCZ0bXBoYWRjU2xhdmUpICE9IEhBTF9FUlJPUikgICApCisgICAgICB7CisgICAgICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOworICAgICAgICAKKyAgICAgICAgLyogQ2hhbmdlIEFEQyBzdGF0ZSAoQURDIG1hc3RlcikgKi8KKyAgICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kgfCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIEluIGNhc2Ugb2YgZXJyb3IsIGF0dGVtcHQgdG8gZGlzYWJsZSBBREMgaW5zdGFuY2VzIGFueXdheSAqLworICAgICAgQURDX0Rpc2FibGUoaGFkYyk7CisgICAgICBBRENfRGlzYWJsZSgmdG1waGFkY1NsYXZlKTsKKyAgICAgIAorICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIChBREMgbWFzdGVyKSB0byBlcnJvciAqLworICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCk7CisgICAgfQorICAgIAorICB9CisgIC8qIENvbnZlcnNpb24gb24gQURDIGdyb3VwIHJlZ3VsYXIgZ3JvdXAgaXMgc3RvcHBlZCwgYnV0IEFEQyBpcyBub3QgICAgICAgICAqLworICAvKiBkaXNhYmxlZCBzaW5jZSBjb252ZXJzaW9uIG9uIEFEQyBncm91cCBpbmplY3RlZCBpcyBzdGlsbCBvbiBnb2luZy4gICAgICAgKi8KKyAgZWxzZQorICB7CisgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgIENMRUFSX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSk7CisgIH0KKyAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhhZGMpOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4ICAgICovCisKKworI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisKKy8qKgorICAqIEBicmllZiAgSW5qZWN0ZWQgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayBpbiBub24gYmxvY2tpbmcgbW9kZSAKKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0FEQ0V4X0luamVjdGVkQ29udkNwbHRDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGFkYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9BRENFeF9JbmplY3RlZENvbnZDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAqLworfQorCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKy8qKgorICAqIEBicmllZiAgSW5qZWN0ZWQgY29udGV4dCBxdWV1ZSBvdmVyZmxvdyBmbGFnIGNhbGxiYWNrLiAKKyAgKiBAbm90ZSAgIFRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIGlmIGluamVjdGVkIGNvbnRleHQgcXVldWUgaXMgZW5hYmxlZAorICAgICAgICAgICAgKHBhcmFtZXRlciAiUXVldWVJbmplY3RlZENvbnRleHQiIGluIGluamVjdGVkIGNoYW5uZWwgY29uZmlndXJhdGlvbikKKyAgICAgICAgICAgIGFuZCBpZiBhIG5ldyBpbmplY3RlZCBjb250ZXh0IGlzIHNldCB3aGVuIHF1ZXVlIGlzIGZ1bGwgKG1heGltdW0gMgorICAgICAgICAgICAgY29udGV4dHMpLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQURDRXhfSW5qZWN0ZWRRdWV1ZU92ZXJmbG93Q2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhhZGMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIGZ1bmN0aW9uIEhBTF9BRENFeF9JbmplY3RlZFF1ZXVlT3ZlcmZsb3dDYWxsYmFjayBtdXN0IGJlIGltcGxlbWVudGVkIAorICAgICAgICAgICAgaW4gdGhlIHVzZXIgZmlsZS4KKyAgKi8KK30KKyAgICAgICAgICAgICAgICAgICAgICAgIAorLyoqCisgICogQGJyaWVmICBBbmFsb2cgd2F0Y2hkb2cgMiBjYWxsYmFjayBpbiBub24gYmxvY2tpbmcgbW9kZS4gCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9BRENFeF9MZXZlbE91dE9mV2luZG93MkNhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoYWRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiBXaGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICBmdW5jdGlvbiBIQUxfQURDX0xldmVsT291dE9mV2luZG93MkNhbGxiYWNrIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBBbmFsb2cgd2F0Y2hkb2cgMyBjYWxsYmFjayBpbiBub24gYmxvY2tpbmcgbW9kZS4gCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9BRENFeF9MZXZlbE91dE9mV2luZG93M0NhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoYWRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiBXaGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICBmdW5jdGlvbiBIQUxfQURDX0xldmVsT291dE9mV2luZG93M0NhbGxiYWNrIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgKi8KK30KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgQURDRXggUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBBREMgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0gICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgQ29uZmlndXJlIGNoYW5uZWxzIG9uIHJlZ3VsYXIgZ3JvdXAKKyAgICAgICgrKSBDb25maWd1cmUgY2hhbm5lbHMgb24gaW5qZWN0ZWQgZ3JvdXAKKyAgICAgICgrKSBDb25maWd1cmUgbXVsdGltb2RlCisgICAgICAoKykgQ29uZmlndXJlIHRoZSBhbmFsb2cgd2F0Y2hkb2cKKyAgICAgIAorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgdGhlIHNlbGVjdGVkIGNoYW5uZWwgdG8gYmUgbGlua2VkIHRvIHRoZSByZWd1bGFyCisgICogICAgICAgICBncm91cC4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgdXNhZ2Ugb2YgaW50ZXJuYWwgbWVhc3VyZW1lbnQgY2hhbm5lbHM6CisgICogICAgICAgICBWYmF0L1ZyZWZJbnQvVGVtcFNlbnNvci4KKyAgKiAgICAgICAgIFRoZSByZWNvbW1lbmRlZCBzYW1wbGluZyB0aW1lIGlzIGF0IGxlYXN0OgorICAqICAgICAgICAgIC0gRm9yIGRldmljZXMgU1RNMzJGMzd4OiAxNy4xdXMgZm9yIHRlbXBlcmF0dXJlIHNlbnNvcgorICAqICAgICAgICAgIC0gRm9yIHRoZSBvdGhlciBTVE0zMkYzIGRldmljZXM6IDIuMnVzIGZvciBlYWNoIG9mIGNoYW5uZWxzIAorICAqICAgICAgICAgICAgVmJhdC9WcmVmSW50L1RlbXBTZW5zb3IuCisgICogICAgICAgICBUaGVzZSBpbnRlcm5hbCBwYXRocyBjYW4gYmUgYmUgZGlzYWJsZWQgdXNpbmcgZnVuY3Rpb24gCisgICogICAgICAgICBIQUxfQURDX0RlSW5pdCgpLgorICAqIEBub3RlICAgUG9zc2liaWxpdHkgdG8gdXBkYXRlIHBhcmFtZXRlcnMgb24gdGhlIGZseToKKyAgKiAgICAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgY2hhbm5lbCBpbnRvIHJlZ3VsYXIgZ3JvdXAsIGZvbGxvd2luZyAgCisgICogICAgICAgICBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlY29uZmlndXJlIHNvbWUgcGFyYW1ldGVycyAKKyAgKiAgICAgICAgIG9mIHN0cnVjdHVyZSAiQURDX0NoYW5uZWxDb25mVHlwZURlZiIgb24gdGhlIGZseSwgd2l0aG91dCByZXNldGluZyAKKyAgKiAgICAgICAgIHRoZSBBREMuCisgICogICAgICAgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZS4KKyAgKiAgICAgICAgIEZvciBwYXJhbWV0ZXJzIGNvbnN0cmFpbnRzLCBzZWUgY29tbWVudHMgb2Ygc3RydWN0dXJlIAorICAqICAgICAgICAgIkFEQ19DaGFubmVsQ29uZlR5cGVEZWYiLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHBhcmFtICBzQ29uZmlnIFN0cnVjdHVyZSBBREMgY2hhbm5lbCBmb3IgcmVndWxhciBncm91cC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfQ29uZmlnQ2hhbm5lbChBRENfSGFuZGxlVHlwZURlZiogaGFkYywgQURDX0NoYW5uZWxDb25mVHlwZURlZiogc0NvbmZpZykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXMgPSBIQUxfT0s7CisgIEFEQ19Db21tb25fVHlwZURlZiAqdG1wQURDX0NvbW1vbjsKKyAgQURDX0hhbmRsZVR5cGVEZWYgdG1waGFkY1NoYXJpbmdTYW1lQ29tbW9uUmVnaXN0ZXI7CisgIHVpbnQzMl90IHRtcE9mZnNldFNoaWZ0ZWQ7CisgIF9fSU8gdWludDMyX3Qgd2FpdF9sb29wX2luZGV4ID0gMFU7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX1JFR1VMQVJfUkFOSyhzQ29uZmlnLT5SYW5rKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfU0FNUExFX1RJTUUoc0NvbmZpZy0+U2FtcGxpbmdUaW1lKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfU0lOR0xFX0RJRkZFUkVOVElBTChzQ29uZmlnLT5TaW5nbGVEaWZmKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfT0ZGU0VUX05VTUJFUihzQ29uZmlnLT5PZmZzZXROdW1iZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19SQU5HRShBRENfR0VUX1JFU09MVVRJT04oaGFkYyksIHNDb25maWctPk9mZnNldCkpOworICAKKyAgCisgIC8qIFZlcmlmaWNhdGlvbiBvZiBjaGFubmVsIG51bWJlcjogQ2hhbm5lbHMgMSB0byAxNCBhcmUgYXZhaWxhYmxlIGluICAgICAgICAqLyAgCisgIC8qIGRpZmZlcmVudGlhbCBtb2RlLiBDaGFubmVscyAxNVUsIDE2VSwgMTdVLCAxOCBjYW4gYmUgdXNlZCBvbmx5IGluICAgICAgICAgICAqLworICAvKiBzaW5nbGUtZW5kZWQgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYgKHNDb25maWctPlNpbmdsZURpZmYgIT0gQURDX0RJRkZFUkVOVElBTF9FTkRFRCkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19BRENfQ0hBTk5FTChzQ29uZmlnLT5DaGFubmVsKSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0FEQ19ESUZGX0NIQU5ORUwoc0NvbmZpZy0+Q2hhbm5lbCkpOworICB9CisgIAorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhhZGMpOworICAKKyAgCisgIC8qIFBhcmFtZXRlcnMgdXBkYXRlIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHVwZGF0ZWQgd2hlbiBBREMgaXMgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0ICAgKi8KKyAgLyogY29udmVyc2lvbiBvbiBnb2luZyBvbiByZWd1bGFyIGdyb3VwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIENoYW5uZWwgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBDaGFubmVsIHJhbmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYgKEFEQ19JU19DT05WRVJTSU9OX09OR09JTkdfUkVHVUxBUihoYWRjKSA9PSBSRVNFVCkKKyAgeworICAgIC8qIFJlZ3VsYXIgc2VxdWVuY2UgY29uZmlndXJhdGlvbiAqLworICAgIC8qIEZvciBSYW5rIDEgdG8gNFUgKi8KKyAgICBpZiAoc0NvbmZpZy0+UmFuayA8IDVVKQorICAgIHsKKyAgICAgIE1PRElGWV9SRUcoaGFkYy0+SW5zdGFuY2UtPlNRUjEsCisgICAgICAgICAgICAgICAgIEFEQ19TUVIxX1JLKEFEQ19TUVIyX1NRNSwgc0NvbmZpZy0+UmFuaykgICAgLAorICAgICAgICAgICAgICAgICBBRENfU1FSMV9SSyhzQ29uZmlnLT5DaGFubmVsLCBzQ29uZmlnLT5SYW5rKSApOworICAgIH0KKyAgICAvKiBGb3IgUmFuayA1IHRvIDlVICovCisgICAgZWxzZSBpZiAoc0NvbmZpZy0+UmFuayA8IDEwVSkKKyAgICB7CisgICAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5TUVIyLAorICAgICAgICAgICAgICAgICBBRENfU1FSMl9SSyhBRENfU1FSMl9TUTUsIHNDb25maWctPlJhbmspICAgICwKKyAgICAgICAgICAgICAgICAgQURDX1NRUjJfUksoc0NvbmZpZy0+Q2hhbm5lbCwgc0NvbmZpZy0+UmFuaykgKTsKKyAgICB9CisgICAgLyogRm9yIFJhbmsgMTAgdG8gMTRVICovCisgICAgZWxzZSBpZiAoc0NvbmZpZy0+UmFuayA8IDE1VSkKKyAgICB7CisgICAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5TUVIzICAgICAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICBBRENfU1FSM19SSyhBRENfU1FSM19TUTEwLCBzQ29uZmlnLT5SYW5rKSAgICwKKyAgICAgICAgICAgICAgICAgQURDX1NRUjNfUksoc0NvbmZpZy0+Q2hhbm5lbCwgc0NvbmZpZy0+UmFuaykgKTsKKyAgICB9CisgICAgLyogRm9yIFJhbmsgMTUgdG8gMTZVICovCisgICAgZWxzZQorICAgIHsgICAKKyAgICAgIE1PRElGWV9SRUcoaGFkYy0+SW5zdGFuY2UtPlNRUjQgICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIEFEQ19TUVI0X1JLKEFEQ19TUVI0X1NRMTUsIHNDb25maWctPlJhbmspICAgLAorICAgICAgICAgICAgICAgICBBRENfU1FSNF9SSyhzQ29uZmlnLT5DaGFubmVsLCBzQ29uZmlnLT5SYW5rKSApOworICAgIH0KKyAgICAKKyAgICAKKyAgLyogUGFyYW1ldGVycyB1cGRhdGUgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgdXBkYXRlZCB3aGVuIEFEQyBpcyBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgICAqLworICAvKiBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIHJlZ3VsYXIgZ3JvdXA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIC0gQ2hhbm5lbCBzYW1wbGluZyB0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIENoYW5uZWwgb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZiAoQURDX0lTX0NPTlZFUlNJT05fT05HT0lOR19SRUdVTEFSX0lOSkVDVEVEKGhhZGMpID09IFJFU0VUKQorICB7CisgICAgLyogQ2hhbm5lbCBzYW1wbGluZyB0aW1lIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAvKiBGb3IgY2hhbm5lbHMgMTAgdG8gMThVICovCisgICAgaWYgKHNDb25maWctPkNoYW5uZWwgPj0gQURDX0NIQU5ORUxfMTApCisgICAgeworICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+U01QUjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgQURDX1NNUFIyKEFEQ19TTVBSMl9TTVAxMCwgc0NvbmZpZy0+Q2hhbm5lbCkgICAgICAsCisgICAgICAgICAgICAgICAgIEFEQ19TTVBSMihzQ29uZmlnLT5TYW1wbGluZ1RpbWUsIHNDb25maWctPkNoYW5uZWwpICk7CisgICAgfQorICAgIGVsc2UgLyogRm9yIGNoYW5uZWxzIDEgdG8gOVUgKi8KKyAgICB7CisgICAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5TTVBSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICBBRENfU01QUjEoQURDX1NNUFIxX1NNUDAsIHNDb25maWctPkNoYW5uZWwpICAgICAgICwKKyAgICAgICAgICAgICAgICAgQURDX1NNUFIxKHNDb25maWctPlNhbXBsaW5nVGltZSwgc0NvbmZpZy0+Q2hhbm5lbCkgKTsKKyAgICB9CisgICAgCisKKyAgICAvKiBDb25maWd1cmUgdGhlIG9mZnNldDogb2Zmc2V0IGVuYWJsZS9kaXNhYmxlLCBjaGFubmVsLCBvZmZzZXQgdmFsdWUgKi8KKworICAgIC8qIFNoaWZ0IHRoZSBvZmZzZXQgaW4gZnVuY3Rpb24gb2YgdGhlIHNlbGVjdGVkIEFEQyByZXNvbHV0aW9uLiAqLworICAgIC8qIE9mZnNldCBoYXMgdG8gYmUgbGVmdC1hbGlnbmVkIG9uIGJpdCAxMVUsIHRoZSBMU0IgKHJpZ2h0IGJpdHMpIGFyZSBzZXQgICovCisgICAgLyogdG8gMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHRtcE9mZnNldFNoaWZ0ZWQgPSBBRENfT0ZGU0VUX1NISUZUX1JFU09MVVRJT04oaGFkYywgc0NvbmZpZy0+T2Zmc2V0KTsKKyAgICAKKyAgICAvKiBDb25maWd1cmUgdGhlIHNlbGVjdGVkIG9mZnNldCByZWdpc3RlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogLSBFbmFibGUgb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIC0gU2V0IGNoYW5uZWwgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAtIFNldCBvZmZzZXQgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgc3dpdGNoIChzQ29uZmlnLT5PZmZzZXROdW1iZXIpCisgICAgeworICAgIGNhc2UgQURDX09GRlNFVF8xOgorICAgICAgLyogQ29uZmlndXJlIG9mZnNldCByZWdpc3RlciAxVSAqLworICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+T0ZSMSAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgQURDX09GUjFfT0ZGU0VUMV9DSCB8CisgICAgICAgICAgICAgICAgIEFEQ19PRlIxX09GRlNFVDEgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICBBRENfT0ZSMV9PRkZTRVQxX0VOICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICBBRENfT0ZSX0NIQU5ORUwoc0NvbmZpZy0+Q2hhbm5lbCkgfAorICAgICAgICAgICAgICAgICB0bXBPZmZzZXRTaGlmdGVkICAgICAgICAgICAgICAgICAgICApOworICAgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBBRENfT0ZGU0VUXzI6CisgICAgICAvKiBDb25maWd1cmUgb2Zmc2V0IHJlZ2lzdGVyIDJVICovCisgICAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5PRlIyICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICBBRENfT0ZSMl9PRkZTRVQyX0NIIHwKKyAgICAgICAgICAgICAgICAgQURDX09GUjJfT0ZGU0VUMiAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIEFEQ19PRlIyX09GRlNFVDJfRU4gICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgIEFEQ19PRlJfQ0hBTk5FTChzQ29uZmlnLT5DaGFubmVsKSB8CisgICAgICAgICAgICAgICAgIHRtcE9mZnNldFNoaWZ0ZWQgICAgICAgICAgICAgICAgICAgICk7CisgICAgICBicmVhazsKKyAgICAgICAgCisgICAgY2FzZSBBRENfT0ZGU0VUXzM6CisgICAgICAvKiBDb25maWd1cmUgb2Zmc2V0IHJlZ2lzdGVyIDNVICovCisgICAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5PRlIzICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICBBRENfT0ZSM19PRkZTRVQzX0NIIHwKKyAgICAgICAgICAgICAgICAgQURDX09GUjNfT0ZGU0VUMyAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIEFEQ19PRlIzX09GRlNFVDNfRU4gICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgIEFEQ19PRlJfQ0hBTk5FTChzQ29uZmlnLT5DaGFubmVsKSB8CisgICAgICAgICAgICAgICAgIHRtcE9mZnNldFNoaWZ0ZWQgICAgICAgICAgICAgICAgICAgICk7CisgICAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIEFEQ19PRkZTRVRfNDoKKyAgICAgIC8qIENvbmZpZ3VyZSBvZmZzZXQgcmVnaXN0ZXIgNFUgKi8KKyAgICAgIE1PRElGWV9SRUcoaGFkYy0+SW5zdGFuY2UtPk9GUjQgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIEFEQ19PRlI0X09GRlNFVDRfQ0ggfAorICAgICAgICAgICAgICAgICBBRENfT0ZSNF9PRkZTRVQ0ICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgQURDX09GUjRfT0ZGU0VUNF9FTiAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgQURDX09GUl9DSEFOTkVMKHNDb25maWctPkNoYW5uZWwpIHwKKyAgICAgICAgICAgICAgICAgdG1wT2Zmc2V0U2hpZnRlZCAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgIGJyZWFrOworICAgIAorICAgIC8qIENhc2UgQURDX09GRlNFVF9OT05FICovCisgICAgZGVmYXVsdCA6CisgICAgLyogU2NhbiBPRlIxLCBPRlIyLCBPRlIzLCBPRlI0IHRvIGNoZWNrIGlmIHRoZSBzZWxlY3RlZCBjaGFubmVsIGlzICAgICAgICAqLworICAgIC8qIGVuYWJsZWQuIElmIHRoaXMgaXMgdGhlIGNhc2UsIG9mZnNldCBPRlJ4IGlzIGRpc2FibGVkLiAgICAgICAgICAgICAgICAgKi8KKyAgICAgIGlmICgoKGhhZGMtPkluc3RhbmNlLT5PRlIxKSAmIEFEQ19PRlIxX09GRlNFVDFfQ0gpID09IEFEQ19PRlJfQ0hBTk5FTChzQ29uZmlnLT5DaGFubmVsKSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSBvZmZzZXQgT0ZSMSovCisgICAgICAgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+T0ZSMSwgQURDX09GUjFfT0ZGU0VUMV9FTik7CisgICAgICB9CisgICAgICBpZiAoKChoYWRjLT5JbnN0YW5jZS0+T0ZSMikgJiBBRENfT0ZSMl9PRkZTRVQyX0NIKSA9PSBBRENfT0ZSX0NIQU5ORUwoc0NvbmZpZy0+Q2hhbm5lbCkpCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgb2Zmc2V0IE9GUjIqLworICAgICAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPk9GUjIsIEFEQ19PRlIyX09GRlNFVDJfRU4pOyAKKyAgICAgIH0KKyAgICAgIGlmICgoKGhhZGMtPkluc3RhbmNlLT5PRlIzKSAmIEFEQ19PRlIzX09GRlNFVDNfQ0gpID09IEFEQ19PRlJfQ0hBTk5FTChzQ29uZmlnLT5DaGFubmVsKSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSBvZmZzZXQgT0ZSMyovCisgICAgICAgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+T0ZSMywgQURDX09GUjNfT0ZGU0VUM19FTik7CisgICAgICB9CisgICAgICBpZiAoKChoYWRjLT5JbnN0YW5jZS0+T0ZSNCkgJiBBRENfT0ZSNF9PRkZTRVQ0X0NIKSA9PSBBRENfT0ZSX0NIQU5ORUwoc0NvbmZpZy0+Q2hhbm5lbCkpCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgb2Zmc2V0IE9GUjQqLworICAgICAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPk9GUjQsIEFEQ19PRlI0X09GRlNFVDRfRU4pOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorCisgIH0KKyAKKworICAvKiBQYXJhbWV0ZXJzIHVwZGF0ZSBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSB1cGRhdGVkIG9ubHkgd2hlbiBBREMgaXMgZGlzYWJsZWQ6ICAgICAgICAgICAgICAgICovCisgIC8qICAtIFNpbmdsZSBvciBkaWZmZXJlbnRpYWwgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBJbnRlcm5hbCBtZWFzdXJlbWVudCBjaGFubmVsczogVmJhdC9WcmVmSW50L1RlbXBTZW5zb3IgICAgICAgICAgICAgICAgKi8KKyAgaWYgKEFEQ19JU19FTkFCTEUoaGFkYykgPT0gUkVTRVQpCisgIHsKKyAgICAvKiBDb25maWd1cmF0aW9uIG9mIGRpZmZlcmVudGlhbCBtb2RlICovCisgICAgaWYgKHNDb25maWctPlNpbmdsZURpZmYgIT0gQURDX0RJRkZFUkVOVElBTF9FTkRFRCkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIGRpZmZlcmVudGlhbCBtb2RlIChkZWZhdWx0IG1vZGU6IHNpbmdsZS1lbmRlZCkgKi8KKyAgICAgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+RElGU0VMLCBBRENfRElGU0VMX0NIQU5ORUwoc0NvbmZpZy0+Q2hhbm5lbCkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogRW5hYmxlIGRpZmZlcmVudGlhbCBtb2RlICovCisgICAgICBTRVRfQklUKGhhZGMtPkluc3RhbmNlLT5ESUZTRUwsIEFEQ19ESUZTRUxfQ0hBTk5FTChzQ29uZmlnLT5DaGFubmVsKSk7CisgICAgICAKKyAgICAgIC8qIENoYW5uZWwgc2FtcGxpbmcgdGltZSBjb25maWd1cmF0aW9uIChjaGFubmVsIEFEQ19JTnggKzEgICAgICAgICAgICAgICovCisgICAgICAvKiBjb3JyZXNwb25kaW5nIHRvIGRpZmZlcmVudGlhbCBuZWdhdGl2ZSBpbnB1dCkuICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogRm9yIGNoYW5uZWxzIDEwIHRvIDE4VSAqLworICAgICAgaWYgKHNDb25maWctPkNoYW5uZWwgPj0gQURDX0NIQU5ORUxfMTApCisgICAgICB7CisgICAgICAgIE1PRElGWV9SRUcoaGFkYy0+SW5zdGFuY2UtPlNNUFIyLAorICAgICAgICAgICAgICAgICAgIEFEQ19TTVBSMihBRENfU01QUjJfU01QMTAsIHNDb25maWctPkNoYW5uZWwgKzFVKSAgICAgICwKKyAgICAgICAgICAgICAgICAgICBBRENfU01QUjIoc0NvbmZpZy0+U2FtcGxpbmdUaW1lLCBzQ29uZmlnLT5DaGFubmVsICsxVSkgKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgLyogRm9yIGNoYW5uZWxzIDEgdG8gOVUgKi8KKyAgICAgIHsKKyAgICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+U01QUjEsCisgICAgICAgICAgICAgICAgICAgQURDX1NNUFIxKEFEQ19TTVBSMV9TTVAwLCBzQ29uZmlnLT5DaGFubmVsICsxVSkgICAgICAgLAorICAgICAgICAgICAgICAgICAgIEFEQ19TTVBSMShzQ29uZmlnLT5TYW1wbGluZ1RpbWUsIHNDb25maWctPkNoYW5uZWwgKzFVKSApOworICAgICAgfQorICAgIH0KKyAgCisgICAgCisgICAgLyogTWFuYWdlbWVudCBvZiBpbnRlcm5hbCBtZWFzdXJlbWVudCBjaGFubmVsczogVnJlZkludC9UZW1wU2Vuc29yL1ZiYXQgICAqLworICAgIC8qIGludGVybmFsIG1lYXN1cmVtZW50IHBhdGhzIGVuYWJsZTogSWYgaW50ZXJuYWwgY2hhbm5lbCBzZWxlY3RlZCwgICAgICAgKi8KKyAgICAvKiBlbmFibGUgZGVkaWNhdGVkIGludGVybmFsIGJ1ZmZlcnMgYW5kIHBhdGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogTm90ZTogdGhlc2UgaW50ZXJuYWwgbWVhc3VyZW1lbnQgcGF0aHMgY2FuIGJlIGRpc2FibGVkIHVzaW5nICAgICAgICAgICAqLworICAgIC8qIEhBTF9BRENfRGVJbml0KCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAKKyAgICAvKiBDb25maWd1cmF0aW9uIG9mIGNvbW1vbiBBREMgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogUG9pbnRlciB0byB0aGUgY29tbW9uIGNvbnRyb2wgcmVnaXN0ZXIgdG8gd2hpY2ggaXMgYmVsb25naW5nIGhhZGMgICAgICAqLworICAgIC8qIChEZXBlbmRpbmcgb24gU1RNMzJGMyBwcm9kdWN0LCB0aGVyZSBtYXkgYmUgdXAgdG8gNCBBREMgYW5kIDIgY29tbW9uICAgKi8KKyAgICAvKiBjb250cm9sIHJlZ2lzdGVycykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdG1wQURDX0NvbW1vbiA9IEFEQ19DT01NT05fUkVHSVNURVIoaGFkYyk7CisgIAorICAgIC8qIElmIHRoZSByZXF1ZXN0ZWQgaW50ZXJuYWwgbWVhc3VyZW1lbnQgcGF0aCBoYXMgYWxyZWFkeSBiZWVuIGVuYWJsZWQsICAgKi8KKyAgICAvKiBieXBhc3MgdGhlIGNvbmZpZ3VyYXRpb24gcHJvY2Vzc2luZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKCggKHNDb25maWctPkNoYW5uZWwgPT0gQURDX0NIQU5ORUxfVEVNUFNFTlNPUikgJiYKKyAgICAgICAgICAoSEFMX0lTX0JJVF9DTFIodG1wQURDX0NvbW1vbi0+Q0NSLCBBRENfQ0NSX1RTRU4pKSAgICAgICAgICAgICkgfHwKKyAgICAgICAgKCAoc0NvbmZpZy0+Q2hhbm5lbCA9PSBBRENfQ0hBTk5FTF9WQkFUKSAgICAgICAmJgorICAgICAgICAgIChIQUxfSVNfQklUX0NMUih0bXBBRENfQ29tbW9uLT5DQ1IsIEFEQ19DQ1JfVkJBVEVOKSkgICAgICAgICAgKSB8fAorICAgICAgICAoIChzQ29uZmlnLT5DaGFubmVsID09IEFEQ19DSEFOTkVMX1ZSRUZJTlQpICAgICYmCisgICAgICAgICAgKEhBTF9JU19CSVRfQ0xSKHRtcEFEQ19Db21tb24tPkNDUiwgQURDX0NDUl9WUkVGRU4pKSkKKyAgICAgICApCisgICAgeworICAgICAgLyogQ29uZmlndXJhdGlvbiBvZiBjb21tb24gQURDIHBhcmFtZXRlcnMgKGNvbnRpbnVhdGlvbikgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qIFNldCBoYW5kbGUgb2YgdGhlIG90aGVyIEFEQyBzaGFyaW5nIHRoZSBzYW1lIGNvbW1vbiByZWdpc3RlciAgICAgICAgICovCisgICAgICBBRENfQ09NTU9OX0FEQ19PVEhFUihoYWRjLCAmdG1waGFkY1NoYXJpbmdTYW1lQ29tbW9uUmVnaXN0ZXIpOworICAgICAgCisgICAgICAvKiBTb2Z0d2FyZSBpcyBhbGxvd2VkIHRvIGNoYW5nZSBjb21tb24gcGFyYW1ldGVycyBvbmx5IHdoZW4gYWxsIEFEQ3MgICAqLworICAgICAgLyogb2YgdGhlIGNvbW1vbiBncm91cCBhcmUgZGlzYWJsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIGlmICgoQURDX0lTX0VOQUJMRShoYWRjKSA9PSBSRVNFVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICggKHRtcGhhZGNTaGFyaW5nU2FtZUNvbW1vblJlZ2lzdGVyLkluc3RhbmNlID09IE5VTEwpICAgICAgICAgfHwKKyAgICAgICAgICAgIChBRENfSVNfRU5BQkxFKCZ0bXBoYWRjU2hhcmluZ1NhbWVDb21tb25SZWdpc3RlcikgPT0gUkVTRVQpICAgKSAgICkKKyAgICAgIHsKKyAgICAgICAgLyogSWYgQ2hhbm5lbF8xNiBpcyBzZWxlY3RlZCwgZW5hYmxlIFRlbXAuIHNlbnNvciBtZWFzdXJlbWVudCBwYXRoICAgICovCisgICAgICAgIC8qIE5vdGU6IFRlbXAuIHNlbnNvciBpbnRlcm5hbCBjaGFubmVscyBhdmFpbGFibGUgb24gQURDMSBvbmx5ICAgICAgICAqLworICAgICAgICBpZiAoKHNDb25maWctPkNoYW5uZWwgPT0gQURDX0NIQU5ORUxfVEVNUFNFTlNPUikgJiYgKGhhZGMtPkluc3RhbmNlID09IEFEQzEpKQorICAgICAgICB7CisgICAgICAgICAgU0VUX0JJVCh0bXBBRENfQ29tbW9uLT5DQ1IsIEFEQ19DQ1JfVFNFTik7CisgICAgICAgICAgCisgICAgICAgICAgLyogRGVsYXkgZm9yIHRlbXBlcmF0dXJlIHNlbnNvciBzdGFiaWxpemF0aW9uIHRpbWUgKi8KKyAgICAgICAgICAvKiBDb21wdXRlIG51bWJlciBvZiBDUFUgY3ljbGVzIHRvIHdhaXQgZm9yICovCisgICAgICAgICAgd2FpdF9sb29wX2luZGV4ID0gKEFEQ19URU1QU0VOU09SX0RFTEFZX1VTICogKFN5c3RlbUNvcmVDbG9jayAvIDEwMDAwMDBVKSk7CisgICAgICAgICAgd2hpbGUod2FpdF9sb29wX2luZGV4ICE9IDBVKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHdhaXRfbG9vcF9pbmRleC0tOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBJZiBDaGFubmVsXzE3IGlzIHNlbGVjdGVkLCBlbmFibGUgVkJBVCBtZWFzdXJlbWVudCBwYXRoICAgICAgICAgICAgKi8KKyAgICAgICAgLyogTm90ZTogVkJBVCBpbnRlcm5hbCBjaGFubmVscyBhdmFpbGFibGUgb24gQURDMSBvbmx5ICAgICAgICAgICAgICAgICovCisgICAgICAgIGVsc2UgaWYgKChzQ29uZmlnLT5DaGFubmVsID09IEFEQ19DSEFOTkVMX1ZCQVQpICYmIChoYWRjLT5JbnN0YW5jZSA9PSBBREMxKSkKKyAgICAgICAgeworICAgICAgICAgIFNFVF9CSVQodG1wQURDX0NvbW1vbi0+Q0NSLCBBRENfQ0NSX1ZCQVRFTik7CisgICAgICAgIH0KKyAgICAgICAgLyogSWYgQ2hhbm5lbF8xOCBpcyBzZWxlY3RlZCwgZW5hYmxlIFZSRUZJTlQgbWVhc3VyZW1lbnQgcGF0aCAgICAgICAgICovCisgICAgICAgIC8qIE5vdGU6IFZyZWZJbnQgaW50ZXJuYWwgY2hhbm5lbHMgYXZhaWxhYmxlIG9uIGFsbCBBRENzLCBidXQgb25seSAgICAqLworICAgICAgICAvKiAgICAgICBvbmUgQURDIGlzIGFsbG93ZWQgdG8gYmUgY29ubmVjdGVkIHRvIFZyZWZJbnQgYXQgdGhlIHNhbWUgICAgKi8KKyAgICAgICAgLyogICAgICAgdGltZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIGVsc2UgaWYgKHNDb25maWctPkNoYW5uZWwgPT0gQURDX0NIQU5ORUxfVlJFRklOVCkKKyAgICAgICAgeworICAgICAgICAgIFNFVF9CSVQodG1wQURDX0NvbW1vbi0+Q0NSLCBBRENfQ0NSX1ZSRUZFTik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIElmIHRoZSByZXF1ZXN0ZWQgaW50ZXJuYWwgbWVhc3VyZW1lbnQgcGF0aCBoYXMgYWxyZWFkeSBiZWVuICAgICAgICAgICovCisgICAgICAvKiBlbmFibGVkIGFuZCBvdGhlciBBREMgb2YgdGhlIGNvbW1vbiBncm91cCBhcmUgZW5hYmxlZCwgaW50ZXJuYWwgICAgICAqLworICAgICAgLyogbWVhc3VyZW1lbnQgcGF0aHMgY2Fubm90IGJlIGVuYWJsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIGVsc2UgIAorICAgICAgeworICAgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOworICAgICAgICAKKyAgICAgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICAgIAorICB9CisgICAgCisgIH0KKyAgLyogSWYgYSBjb252ZXJzaW9uIGlzIG9uIGdvaW5nIG9uIHJlZ3VsYXIgZ3JvdXAsIG5vIHVwZGF0ZSBvbiByZWd1bGFyICAgICAgICovCisgIC8qIGNoYW5uZWwgY291bGQgYmUgZG9uZSBvbiBuZWl0aGVyIG9mIHRoZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlICAqLworICAvKiBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOworICAgIAorICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIHRoZSB0aGUgc2VsZWN0ZWQgY2hhbm5lbCB0byBiZSBsaW5rZWQgdG8gdGhlIHJlZ3VsYXIKKyAgKiAgICAgICAgIGdyb3VwLgorICAqIEBub3RlICAgSW4gY2FzZSBvZiB1c2FnZSBvZiBpbnRlcm5hbCBtZWFzdXJlbWVudCBjaGFubmVsczoKKyAgKiAgICAgICAgIFZiYXQvVnJlZkludC9UZW1wU2Vuc29yLgorICAqICAgICAgICAgVGhlIHJlY29tbWVuZGVkIHNhbXBsaW5nIHRpbWUgaXMgYXQgbGVhc3Q6CisgICogICAgICAgICAgLSBGb3IgZGV2aWNlcyBTVE0zMkYzN3g6IDE3LjF1cyBmb3IgdGVtcGVyYXR1cmUgc2Vuc29yCisgICogICAgICAgICAgLSBGb3IgdGhlIG90aGVyIFNUTTMyRjMgZGV2aWNlczogMi4ydXMgZm9yIGVhY2ggb2YgY2hhbm5lbHMgCisgICogICAgICAgICAgICBWYmF0L1ZyZWZJbnQvVGVtcFNlbnNvci4KKyAgKiAgICAgICAgIFRoZXNlIGludGVybmFsIHBhdGhzIGNhbiBiZSBiZSBkaXNhYmxlZCB1c2luZyBmdW5jdGlvbiAKKyAgKiAgICAgICAgIEhBTF9BRENfRGVJbml0KCkuCisgICogQG5vdGUgICBQb3NzaWJpbGl0eSB0byB1cGRhdGUgcGFyYW1ldGVycyBvbiB0aGUgZmx5OgorICAqICAgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBjaGFubmVsIGludG8gcmVndWxhciBncm91cCwgZm9sbG93aW5nICAKKyAgKiAgICAgICAgIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVjb25maWd1cmUgc29tZSBwYXJhbWV0ZXJzIAorICAqICAgICAgICAgb2Ygc3RydWN0dXJlICJBRENfQ2hhbm5lbENvbmZUeXBlRGVmIiBvbiB0aGUgZmx5LCB3aXRob3V0IHJlc2V0aW5nIAorICAqICAgICAgICAgdGhlIEFEQy4KKyAgKiAgICAgICAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLgorICAqICAgICAgICAgRm9yIHBhcmFtZXRlcnMgY29uc3RyYWludHMsIHNlZSBjb21tZW50cyBvZiBzdHJ1Y3R1cmUgCisgICogICAgICAgICAiQURDX0NoYW5uZWxDb25mVHlwZURlZiIuCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gIHNDb25maWcgU3RydWN0dXJlIG9mIEFEQyBjaGFubmVsIGZvciByZWd1bGFyIGdyb3VwLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19Db25maWdDaGFubmVsKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCBBRENfQ2hhbm5lbENvbmZUeXBlRGVmKiBzQ29uZmlnKQoreyAKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXMgPSBIQUxfT0s7CisgIF9fSU8gdWludDMyX3Qgd2FpdF9sb29wX2luZGV4ID0gMFU7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0NIQU5ORUwoc0NvbmZpZy0+Q2hhbm5lbCkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX1JFR1VMQVJfUkFOSyhzQ29uZmlnLT5SYW5rKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfU0FNUExFX1RJTUUoc0NvbmZpZy0+U2FtcGxpbmdUaW1lKSk7CisgIAorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhhZGMpOworICAKKyAgCisgIC8qIFJlZ3VsYXIgc2VxdWVuY2UgY29uZmlndXJhdGlvbiAqLworICAvKiBGb3IgUmFuayAxIHRvIDZVICovCisgIGlmIChzQ29uZmlnLT5SYW5rIDwgN1UpCisgIHsKKyAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5TUVIzICAgICAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgQURDX1NRUjNfUksoQURDX1NRUjNfU1ExLCBzQ29uZmlnLT5SYW5rKSAgICAsCisgICAgICAgICAgICAgICBBRENfU1FSM19SSyhzQ29uZmlnLT5DaGFubmVsLCBzQ29uZmlnLT5SYW5rKSApOworICB9CisgIC8qIEZvciBSYW5rIDcgdG8gMTJVICovCisgIGVsc2UgaWYgKHNDb25maWctPlJhbmsgPCAxM1UpCisgIHsKKyAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5TUVIyICAgICAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgQURDX1NRUjJfUksoQURDX1NRUjJfU1E3LCBzQ29uZmlnLT5SYW5rKSAgICAsCisgICAgICAgICAgICAgICBBRENfU1FSMl9SSyhzQ29uZmlnLT5DaGFubmVsLCBzQ29uZmlnLT5SYW5rKSApOworICB9CisgIC8qIEZvciBSYW5rIDEzIHRvIDE2VSAqLworICBlbHNlCisgIHsKKyAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5TUVIxICAgICAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgQURDX1NRUjFfUksoQURDX1NRUjFfU1ExMywgc0NvbmZpZy0+UmFuaykgICAsCisgICAgICAgICAgICAgICBBRENfU1FSMV9SSyhzQ29uZmlnLT5DaGFubmVsLCBzQ29uZmlnLT5SYW5rKSApOworICB9CisgIAorICAKKyAgLyogQ2hhbm5lbCBzYW1wbGluZyB0aW1lIGNvbmZpZ3VyYXRpb24gKi8KKyAgLyogRm9yIGNoYW5uZWxzIDEwIHRvIDE4VSAqLworICBpZiAoc0NvbmZpZy0+Q2hhbm5lbCA+IEFEQ19DSEFOTkVMXzEwKQorICB7CisgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+U01QUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgIEFEQ19TTVBSMShBRENfU01QUjFfU01QMTAsIHNDb25maWctPkNoYW5uZWwpICAgICAgLAorICAgICAgICAgICAgICAgQURDX1NNUFIxKHNDb25maWctPlNhbXBsaW5nVGltZSwgc0NvbmZpZy0+Q2hhbm5lbCkgKTsKKyAgfQorICBlbHNlICAgLyogRm9yIGNoYW5uZWxzIDAgdG8gOVUgKi8KKyAgeworICAgIE1PRElGWV9SRUcoaGFkYy0+SW5zdGFuY2UtPlNNUFIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICBBRENfU01QUjIoQURDX1NNUFIyX1NNUDAsIHNDb25maWctPkNoYW5uZWwpICAgICAgICwKKyAgICAgICAgICAgICAgIEFEQ19TTVBSMihzQ29uZmlnLT5TYW1wbGluZ1RpbWUsIHNDb25maWctPkNoYW5uZWwpICk7CisgIH0KKyAgCisgIC8qIElmIEFEQzEgQ2hhbm5lbF8xNiBvciBDaGFubmVsXzE3IGlzIHNlbGVjdGVkLCBlbmFibGUgVGVtcGVyYXR1cmUgc2Vuc29yICAqLworICAvKiBhbmQgVlJFRklOVCBtZWFzdXJlbWVudCBwYXRoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYgKChzQ29uZmlnLT5DaGFubmVsID09IEFEQ19DSEFOTkVMX1RFTVBTRU5TT1IpIHx8CisgICAgICAoc0NvbmZpZy0+Q2hhbm5lbCA9PSBBRENfQ0hBTk5FTF9WUkVGSU5UKSAgICAgICkKKyAgeworICAgIFNFVF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNSMiwgQURDX0NSMl9UU1ZSRUZFKTsKKyAgICAKKyAgICBpZiAoKHNDb25maWctPkNoYW5uZWwgPT0gQURDX0NIQU5ORUxfVEVNUFNFTlNPUikpCisgICAgeworICAgICAgLyogRGVsYXkgZm9yIHRlbXBlcmF0dXJlIHNlbnNvciBzdGFiaWxpemF0aW9uIHRpbWUgKi8KKyAgICAgIC8qIENvbXB1dGUgbnVtYmVyIG9mIENQVSBjeWNsZXMgdG8gd2FpdCBmb3IgKi8KKyAgICAgIHdhaXRfbG9vcF9pbmRleCA9IChBRENfVEVNUFNFTlNPUl9ERUxBWV9VUyAqIChTeXN0ZW1Db3JlQ2xvY2sgLyAxMDAwMDAwVSkpOworICAgICAgd2hpbGUod2FpdF9sb29wX2luZGV4ICE9IDBVKQorICAgICAgeworICAgICAgICB3YWl0X2xvb3BfaW5kZXgtLTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogaWYgQURDMSBDaGFubmVsXzE4IGlzIHNlbGVjdGVkLCBlbmFibGUgVkJBVCBtZWFzdXJlbWVudCBwYXRoICovCisgIGVsc2UgaWYgKHNDb25maWctPkNoYW5uZWwgPT0gQURDX0NIQU5ORUxfVkJBVCkKKyAgeworICAgIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX1ZCQVQpOworICB9CisKKyAgIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorI2VuZGlmIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBBREMgaW5qZWN0ZWQgZ3JvdXAgYW5kIHRoZSBzZWxlY3RlZCBjaGFubmVsIHRvIGJlCisgICogICAgICAgICBsaW5rZWQgdG8gdGhlIGluamVjdGVkIGdyb3VwLgorICAqIEBub3RlICAgUG9zc2liaWxpdHkgdG8gdXBkYXRlIHBhcmFtZXRlcnMgb24gdGhlIGZseToKKyAgKiAgICAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgaW5qZWN0ZWQgZ3JvdXAsIGZvbGxvd2luZyBjYWxscyB0byB0aGlzIAorICAqICAgICAgICAgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVjb25maWd1cmUgc29tZSBwYXJhbWV0ZXJzIG9mIHN0cnVjdHVyZQorICAqICAgICAgICAgIkFEQ19JbmplY3Rpb25Db25mVHlwZURlZiIgb24gdGhlIGZseSwgd2l0aG91dCByZXNldGluZyB0aGUgQURDLgorICAqICAgICAgICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGUuCisgICogICAgICAgICBGb3IgcGFyYW1ldGVycyBjb25zdHJhaW50cywgc2VlIGNvbW1lbnRzIG9mIHN0cnVjdHVyZSAKKyAgKiAgICAgICAgICJBRENfSW5qZWN0aW9uQ29uZlR5cGVEZWYiLgorICAqIEBub3RlICAgSW4gY2FzZSBvZiB1c2FnZSBvZiBpbnRlcm5hbCBtZWFzdXJlbWVudCBjaGFubmVsczoKKyAgKiAgICAgICAgIFZiYXQvVnJlZkludC9UZW1wU2Vuc29yLgorICAqICAgICAgICAgVGhlIHJlY29tbWVuZGVkIHNhbXBsaW5nIHRpbWUgaXMgYXQgbGVhc3Q6CisgICogICAgICAgICAgLSBGb3IgZGV2aWNlcyBTVE0zMkYzN3g6IDE3LjF1cyBmb3IgdGVtcGVyYXR1cmUgc2Vuc29yCisgICogICAgICAgICAgLSBGb3IgdGhlIG90aGVyIFNUTTMyRjMgZGV2aWNlczogMi4ydXMgZm9yIGVhY2ggb2YgY2hhbm5lbHMgCisgICogICAgICAgICAgICBWYmF0L1ZyZWZJbnQvVGVtcFNlbnNvci4KKyAgKiAgICAgICAgIFRoZXNlIGludGVybmFsIHBhdGhzIGNhbiBiZSBiZSBkaXNhYmxlZCB1c2luZyBmdW5jdGlvbiAKKyAgKiAgICAgICAgIEhBTF9BRENfRGVJbml0KCkuCisgICogQG5vdGUgICBUbyByZXNldCBpbmplY3RlZCBzZXF1ZW5jZXIsIGZ1bmN0aW9uIEhBTF9BRENFeF9JbmplY3RlZFN0b3AoKSBjYW4KKyAgKiAgICAgICAgIGJlIHVzZWQuCisgICogQG5vdGUgICBDYXV0aW9uOiBGb3IgSW5qZWN0ZWQgQ29udGV4dCBRdWV1ZSB1c2U6IGEgY29udGV4dCBtdXN0IGJlIGZ1bGx5IAorICAqIGRlZmluZWQgYmVmb3JlIHN0YXJ0IG9mIGluamVjdGVkIGNvbnZlcnNpb246IGFsbCBjaGFubmVscyBjb25maWd1cmVkIAorICAqIGNvbnNlY3V0aXZlbHkgZm9yIHRoZSBzYW1lIEFEQyBpbnN0YW5jZS4gVGhlcmVmb3JlLCBOdW1iZXIgb2YgY2FsbHMgb2YgCisgICogSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIG11c3QgY29ycmVzcG9uZCB0byB2YWx1ZSBvZiBwYXJhbWV0ZXIgCisgICogSW5qZWN0ZWROYnJPZkNvbnZlcnNpb24gZm9yIGVhY2ggY29udGV4dC4KKyAgKiAgLSBFeGFtcGxlIDE6IElmIDEgY29udGV4dCBpbnRlbmRlZCB0byBiZSB1c2VkIChvciBub3QgdXNlIG9mIHRoaXMgZmVhdHVyZTogCisgICogICAgUXVldWVJbmplY3RlZENvbnRleHQ9RElTQUJMRSkgYW5kIHVzYWdlIG9mIHRoZSAzIGZpcnN0IGluamVjdGVkIHJhbmtzIAorICAqICAgIChJbmplY3RlZE5ick9mQ29udmVyc2lvbj0zKSwgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIG11c3QgYmUgIAorICAqICAgIGNhbGxlZCBvbmNlIGZvciBlYWNoIGNoYW5uZWwgKDMgdGltZXMpIGJlZm9yZSBsYXVuY2hpbmcgYSBjb252ZXJzaW9uLiAgIAorICAqICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgY2FsbGVkIHRvIGNvbmZpZ3VyZSB0aGUgNHRoIGluamVjdGVkIGNoYW5uZWw6ICAgCisgICogICAgaXQgd291bGQgc3RhcnQgYSBuZXcgY29udGV4dCBpbnRvIGNvbnRleHQgcXVldWUuCisgICogIC0gRXhhbXBsZSAyOiBJZiAyIGNvbnRleHRzIGludGVuZGVkIHRvIGJlIHVzZWQgYW5kIHVzYWdlIG9mIHRoZSAzIGZpcnN0IAorICAqICAgIGluamVjdGVkIHJhbmtzIChJbmplY3RlZE5ick9mQ29udmVyc2lvbj0zKSwgIAorICAqICAgIEhBTF9BRENFeF9JbmplY3RlZENvbmZpZ0NoYW5uZWwoKSBtdXN0IGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIGNoYW5uZWwgYW5kICAKKyAgKiAgICBmb3IgZWFjaCBjb250ZXh0ICgzIGNoYW5uZWxzIHggMiBjb250ZXh0cyA9IDYgY2FsbHMpLiBDb252ZXJzaW9uIGNhbiAgCisgICogICAgc3RhcnQgb25jZSB0aGUgMXN0IGNvbnRleHQgaXMgc2V0LiBUaGUgMm5kIGNvbnRleHQgY2FuIGJlIHNldCBvbiB0aGUgZmx5LgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHBhcmFtICBzQ29uZmlnSW5qZWN0ZWQgU3RydWN0dXJlIG9mIEFEQyBpbmplY3RlZCBncm91cCBhbmQgQURDIGNoYW5uZWwgZm9yCisgICogICAgICAgICBpbmplY3RlZCBncm91cC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9JbmplY3RlZENvbmZpZ0NoYW5uZWwoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMsIEFEQ19JbmplY3Rpb25Db25mVHlwZURlZiogc0NvbmZpZ0luamVjdGVkKQoreworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1cyA9IEhBTF9PSzsKKyAgQURDX0NvbW1vbl9UeXBlRGVmICp0bXBBRENfQ29tbW9uOworICBBRENfSGFuZGxlVHlwZURlZiB0bXBoYWRjU2hhcmluZ1NhbWVDb21tb25SZWdpc3RlcjsKKyAgdWludDMyX3QgdG1wT2Zmc2V0U2hpZnRlZDsKKyAgX19JTyB1aW50MzJfdCB3YWl0X2xvb3BfaW5kZXggPSAwVTsKKyAgCisgIC8qIEluamVjdGVkIGNvbnRleHQgcXVldWUgZmVhdHVyZTogdGVtcG9yYXJ5IEpTUVIgdmFyaWFibGVzIGRlZmluZWQgaW4gICAgICAqLworICAvKiBzdGF0aWMgdG8gYmUgcGFzc2VkIG92ZXIgY2FsbHMgb2YgdGhpcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdWludDMyX3QgdG1wX0pTUVJfQ29udGV4dFF1ZXVlQmVpbmdCdWlsdCA9IDBVOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19TQU1QTEVfVElNRShzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkU2FtcGxpbmdUaW1lKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfU0lOR0xFX0RJRkZFUkVOVElBTChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkU2luZ2xlRGlmZikpOworICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShzQ29uZmlnSW5qZWN0ZWQtPkF1dG9JbmplY3RlZENvbnYpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoc0NvbmZpZ0luamVjdGVkLT5RdWV1ZUluamVjdGVkQ29udGV4dCkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0VYVFRSSUdJTkpFQ19FREdFKHNDb25maWdJbmplY3RlZC0+RXh0ZXJuYWxUcmlnSW5qZWNDb252RWRnZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0VYVFRSSUdJTkpFQyhzQ29uZmlnSW5qZWN0ZWQtPkV4dGVybmFsVHJpZ0luamVjQ29udikpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX09GRlNFVF9OVU1CRVIoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZE9mZnNldE51bWJlcikpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX1JBTkdFKEFEQ19HRVRfUkVTT0xVVElPTihoYWRjKSwgc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZE9mZnNldCkpOworICAKKyAgaWYoaGFkYy0+SW5pdC5TY2FuQ29udk1vZGUgIT0gQURDX1NDQU5fRElTQUJMRSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19BRENfSU5KRUNURURfUkFOSyhzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkUmFuaykpOworICAgIGFzc2VydF9wYXJhbShJU19BRENfSU5KRUNURURfTkJfQ09OVihzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkTmJyT2ZDb252ZXJzaW9uKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZERpc2NvbnRpbnVvdXNDb252TW9kZSkpOworICB9CisgIAorICAvKiBWZXJpZmljYXRpb24gb2YgY2hhbm5lbCBudW1iZXI6IENoYW5uZWxzIDEgdG8gMTQgYXJlIGF2YWlsYWJsZSBpbiAgICAgICAgKi8gIAorICAvKiBkaWZmZXJlbnRpYWwgbW9kZS4gQ2hhbm5lbHMgMTVVLCAxNlUsIDE3VSwgMTggY2FuIGJlIHVzZWQgb25seSBpbiAgICAgICAgICAgKi8KKyAgLyogc2luZ2xlLWVuZGVkIG1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmIChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkU2luZ2xlRGlmZiAhPSBBRENfRElGRkVSRU5USUFMX0VOREVEKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0FEQ19DSEFOTkVMKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsKSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0FEQ19ESUZGX0NIQU5ORUwoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwpKTsKKyAgfQorICAKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoYWRjKTsKKyAgCisgIC8qIENvbmZpZ3VyYXRpb24gb2YgSW5qZWN0ZWQgZ3JvdXAgc2VxdWVuY2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBIYXJkd2FyZSBjb25zdHJhaW50OiBNdXN0IGZ1bGx5IGRlZmluZSBpbmplY3RlZCBjb250ZXh0IHJlZ2lzdGVyIEpTUVIgICAgKi8KKyAgLyogYmVmb3JlIG1ha2UgaXQgZW50ZXJpbmcgaW50byBpbmplY3RlZCBzZXF1ZW5jZXIgcXVldWUuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAtIGlmIHNjYW4gbW9kZSBpcyBkaXNhYmxlZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgKiBJbmplY3RlZCBjaGFubmVscyBzZXF1ZW5jZSBsZW5ndGggaXMgc2V0IHRvIDB4MDA6IDEgY2hhbm5lbCAgICAgICAgICovCisgIC8qICAgICAgY29udmVydGVkIChjaGFubmVsIG9uIGluamVjdGVkIHJhbmsgMVUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBQYXJhbWV0ZXIgIkluamVjdGVkTmJyT2ZDb252ZXJzaW9uIiBpcyBkaXNjYXJkZWQuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICogSW5qZWN0ZWQgY29udGV4dCByZWdpc3RlciBKU1FSIHNldHRpbmcgaXMgc2ltcGxlOiByZWdpc3RlciBpcyBmdWxseSAqLworICAvKiAgICAgIGRlZmluZWQgb24gb25lIGNhbGwgb2YgdGhpcyBmdW5jdGlvbiAoZm9yIGluamVjdGVkIHJhbmsgMVUpIGFuZCBjYW4gICovCisgIC8qICAgICAgYmUgZW50ZXJlZCBpbnRvIHF1ZXVlIGRpcmVjdGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAtIGlmIHNjYW4gbW9kZSBpcyBlbmFibGVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgKiBJbmplY3RlZCBjaGFubmVscyBzZXF1ZW5jZSBsZW5ndGggaXMgc2V0IHRvIHBhcmFtZXRlciAgICAgICAgICAgICAgICovCisgIC8qICAgICAgIkluamVjdGVkTmJyT2ZDb252ZXJzaW9uIi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAqIEluamVjdGVkIGNvbnRleHQgcmVnaXN0ZXIgSlNRUiBzZXR0aW5nIG1vcmUgY29tcGxleDogcmVnaXN0ZXIgaXMgICAgKi8KKyAgLyogICAgICBmdWxseSBkZWZpbmVkIG92ZXIgc3VjY2Vzc2l2ZSBjYWxscyBvZiB0aGlzIGZ1bmN0aW9uLCBmb3IgZWFjaCAgICAgICovCisgIC8qICAgICAgaW5qZWN0ZWQgY2hhbm5lbCByYW5rLiBJdCBpcyBlbnRlcmVkIGludG8gcXVldWUgb25seSB3aGVuIGFsbCAgICAgICAqLworICAvKiAgICAgIGluamVjdGVkIHJhbmtzIGhhdmUgYmVlbiBzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBOb3RlOiBTY2FuIG1vZGUgaXMgbm90IHByZXNlbnQgYnkgaGFyZHdhcmUgb24gdGhpcyBkZXZpY2UsIGJ1dCB1c2VkICAgICovCisgIC8qICAgYnkgc29mdHdhcmUgZm9yIGFsaWdubWVudCBvdmVyIGFsbCBTVE0zMiBkZXZpY2VzLiAgICAgICAgICAgICAgICAgICAgICAqLworICAKKyAgaWYgKChoYWRjLT5Jbml0LlNjYW5Db252TW9kZSA9PSBBRENfU0NBTl9ESVNBQkxFKSAgfHwKKyAgICAgIChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkTmJyT2ZDb252ZXJzaW9uID09IDFVKSAgKQorICB7CisgICAgLyogQ29uZmlndXJhdGlvbiBvZiBjb250ZXh0IHJlZ2lzdGVyIEpTUVI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIG51bWJlciBvZiByYW5rcyBpbiBpbmplY3RlZCBncm91cCBzZXF1ZW5jZXI6IGZpeGVkIHRvIDFzdCByYW5rICAgICAgKi8KKyAgICAvKiAgICAoc2NhbiBtb2RlIGRpc2FibGVkLCBvbmx5IHJhbmsgMSB1c2VkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gZXh0ZXJuYWwgdHJpZ2dlciB0byBzdGFydCBjb252ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIGV4dGVybmFsIHRyaWdnZXIgcG9sYXJpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBjaGFubmVsIHNldCB0byByYW5rIDEgKHNjYW4gbW9kZSBkaXNhYmxlZCwgb25seSByYW5rIDEgdXNlZCkgICAgICAgICovCisgICAgCisgICAgaWYgKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRSYW5rID09IEFEQ19JTkpFQ1RFRF9SQU5LXzEpCisgICAgeworICAgICAgLyogRW5hYmxlIGV4dGVybmFsIHRyaWdnZXIgaWYgdHJpZ2dlciBzZWxlY3Rpb24gaXMgZGlmZmVyZW50IG9mICAgICAgICAgKi8KKyAgICAgIC8qIHNvZnR3YXJlIHN0YXJ0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiBOb3RlOiBUaGlzIGNvbmZpZ3VyYXRpb24ga2VlcHMgdGhlIGhhcmR3YXJlIGZlYXR1cmUgb2YgcGFyYW1ldGVyICAgICAqLworICAgICAgLyogICAgICAgRXh0ZXJuYWxUcmlnSW5qZWNDb252RWRnZSAidHJpZ2dlciBlZGdlIG5vbmUiIGVxdWl2YWxlbnQgdG8gICAgKi8KKyAgICAgIC8qICAgICAgIHNvZnR3YXJlIHN0YXJ0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBpZiAoc0NvbmZpZ0luamVjdGVkLT5FeHRlcm5hbFRyaWdJbmplY0NvbnYgIT0gQURDX0lOSkVDVEVEX1NPRlRXQVJFX1NUQVJUKQorICAgICAgeworICAgICAgICBTRVRfQklUKHRtcF9KU1FSX0NvbnRleHRRdWV1ZUJlaW5nQnVpbHQsIEFEQ19KU1FSX1JLKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsLCBBRENfSU5KRUNURURfUkFOS18xKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0pTUVJfSkVYVFNFTF9TRVQoaGFkYywgc0NvbmZpZ0luamVjdGVkLT5FeHRlcm5hbFRyaWdJbmplY0NvbnYpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnSW5qZWN0ZWQtPkV4dGVybmFsVHJpZ0luamVjQ29udkVkZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIFNFVF9CSVQodG1wX0pTUVJfQ29udGV4dFF1ZXVlQmVpbmdCdWlsdCwgQURDX0pTUVJfUksoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwsIEFEQ19JTkpFQ1RFRF9SQU5LXzEpICk7CisgICAgICB9CisgICAgICAKKyAgICAgIC8qIFVwZGF0ZSBBREMgcmVnaXN0ZXIgSlNRUiAqLworICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+SlNRUiAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICBBRENfSlNRUl9KU1E0ICAgIHwKKyAgICAgICAgICAgICAgICAgQURDX0pTUVJfSlNRMyAgICB8CisgICAgICAgICAgICAgICAgIEFEQ19KU1FSX0pTUTIgICAgfAorICAgICAgICAgICAgICAgICBBRENfSlNRUl9KU1ExICAgIHwKKyAgICAgICAgICAgICAgICAgQURDX0pTUVJfSkVYVEVOICB8CisgICAgICAgICAgICAgICAgIEFEQ19KU1FSX0pFWFRTRUwgfAorICAgICAgICAgICAgICAgICBBRENfSlNRUl9KTCAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICB0bXBfSlNRUl9Db250ZXh0UXVldWVCZWluZ0J1aWx0ICk7CisgICAgICAKKyAgICAgIC8qIEZvciBkZWJ1ZyBhbmQgaW5mb3JtYXRpdmUgcmVhc29ucywgaGFkYyBoYW5kbGUgc2F2ZXMgSlNRUiBzZXR0aW5nICovCisgICAgICBoYWRjLT5JbmplY3Rpb25Db25maWcuQ29udGV4dFF1ZXVlID0gdG1wX0pTUVJfQ29udGV4dFF1ZXVlQmVpbmdCdWlsdDsKKyAgICB9CisgICAgLyogSWYgYW5vdGhlciBpbmplY3RlZCByYW5rIHRoYW4gcmFuazEgd2FzIGludGVuZGVkIHRvIGJlIHNldCwgYW5kIGNvdWxkICAqLworICAgIC8qIG5vdCBkdWUgdG8gU2NhbkNvbnZNb2RlIGRpc2FibGVkLCBlcnJvciBpcyByZXBvcnRlZC4gICAgICAgICAgICAgICAgICAgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0NPTkZJRyk7CisgICAgICAKKyAgICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0VSUk9SOworICAgIH0KKyAgCisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2FzZSBvZiBzY2FuIG1vZGUgZW5hYmxlZCwgc2V2ZXJhbCBjaGFubmVscyB0byBzZXQgaW50byBpbmplY3RlZCBncm91cCAqLworICAgIC8qIHNlcXVlbmNlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBQcm9jZWR1cmUgdG8gZGVmaW5lIGluamVjdGVkIGNvbnRleHQgcmVnaXN0ZXIgSlNRUiBvdmVyIHN1Y2Nlc3NpdmUgICAgICovCisgICAgLyogY2FsbHMgb2YgdGhpcyBmdW5jdGlvbiwgZm9yIGVhY2ggaW5qZWN0ZWQgY2hhbm5lbCByYW5rOiAgICAgICAgICAgICAgICAqLworICAgIAorICAgIC8qIDEuIFN0YXJ0IG5ldyBjb250ZXh0IGFuZCBzZXQgcGFyYW1ldGVycyByZWxhdGVkIHRvIGFsbCBpbmplY3RlZCAgICAgICAgKi8KKyAgICAvKiAgICBjaGFubmVsczogaW5qZWN0ZWQgc2VxdWVuY2UgbGVuZ3RoIGFuZCB0cmlnZ2VyICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKGhhZGMtPkluamVjdGlvbkNvbmZpZy5DaGFubmVsQ291bnQgPT0gMFUpCisgICAgeworICAgICAgLyogSW5pdGlhbGl6ZSBudW1iZXIgb2YgY2hhbm5lbHMgdGhhdCB3aWxsIGJlIGNvbmZpZ3VyZWQgb24gdGhlIGNvbnRleHQgKi8KKyAgICAgIC8qICBiZWluZyBidWlsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBoYWRjLT5JbmplY3Rpb25Db25maWcuQ2hhbm5lbENvdW50ID0gc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZE5ick9mQ29udmVyc2lvbjsKKyAgICAgIC8qIEluaXRpYWxpemUgdmFsdWUgdGhhdCB3aWxsIGJlIHNldCBpbnRvIHJlZ2lzdGVyIEpTUVIgKi8KKyAgICAgIGhhZGMtPkluamVjdGlvbkNvbmZpZy5Db250ZXh0UXVldWUgPSAweDAwMDAwMDAwVTsKKyAgICAgIAorICAgICAgLyogQ29uZmlndXJhdGlvbiBvZiBjb250ZXh0IHJlZ2lzdGVyIEpTUVI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qICAtIG51bWJlciBvZiByYW5rcyBpbiBpbmplY3RlZCBncm91cCBzZXF1ZW5jZXIgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAgLSBleHRlcm5hbCB0cmlnZ2VyIHRvIHN0YXJ0IGNvbnZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogIC0gZXh0ZXJuYWwgdHJpZ2dlciBwb2xhcml0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgCisgICAgICAvKiBFbmFibGUgZXh0ZXJuYWwgdHJpZ2dlciBpZiB0cmlnZ2VyIHNlbGVjdGlvbiBpcyBkaWZmZXJlbnQgb2YgICAgICAgICAqLworICAgICAgLyogc29mdHdhcmUgc3RhcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qIE5vdGU6IFRoaXMgY29uZmlndXJhdGlvbiBrZWVwcyB0aGUgaGFyZHdhcmUgZmVhdHVyZSBvZiBwYXJhbWV0ZXIgICAgICovCisgICAgICAvKiAgICAgICBFeHRlcm5hbFRyaWdJbmplY0NvbnZFZGdlICJ0cmlnZ2VyIGVkZ2Ugbm9uZSIgZXF1aXZhbGVudCB0byAgICAqLworICAgICAgLyogICAgICAgc29mdHdhcmUgc3RhcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIGlmIChzQ29uZmlnSW5qZWN0ZWQtPkV4dGVybmFsVHJpZ0luamVjQ29udiAhPSBBRENfSU5KRUNURURfU09GVFdBUkVfU1RBUlQpCisgICAgICB7CisgICAgICAgIFNFVF9CSVQoaGFkYy0+SW5qZWN0aW9uQ29uZmlnLkNvbnRleHRRdWV1ZSwgKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWROYnJPZkNvbnZlcnNpb24gLSAxVSkgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSlNRUl9KRVhUU0VMX1NFVChoYWRjLCBzQ29uZmlnSW5qZWN0ZWQtPkV4dGVybmFsVHJpZ0luamVjQ29udikgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDb25maWdJbmplY3RlZC0+RXh0ZXJuYWxUcmlnSW5qZWNDb252RWRnZSAgICAgICAgICAgICAgICAgICAgICAgICAgKTsgICAgICAgIAorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBTRVRfQklUKGhhZGMtPkluamVjdGlvbkNvbmZpZy5Db250ZXh0UXVldWUsIChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkTmJyT2ZDb252ZXJzaW9uIC0gMVUpICk7ICAgICAgICAKKyAgICAgIH0KKyAgICAgIAorICAgIH0KKworICAgICAgLyogMi4gQ29udGludWUgc2V0dGluZyBvZiBjb250ZXh0IHVuZGVyIGRlZmluaXRpb24gd2l0aCBwYXJhbWV0ZXIgICAgICAgKi8KKyAgICAgIC8qICAgIHJlbGF0ZWQgdG8gZWFjaCBjaGFubmVsOiBjaGFubmVsIHJhbmsgc2VxdWVuY2UgICAgICAgICAgICAgICAgICAgICovCisgICAgICAKKyAgICAgIC8qIFNldCB0aGUgSlNReCBiaXRzIGZvciB0aGUgc2VsZWN0ZWQgcmFuayAqLworICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbmplY3Rpb25Db25maWcuQ29udGV4dFF1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICBBRENfSlNRUl9SSyhBRENfU1FSM19TUTEwLCBzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkUmFuaykgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICBBRENfSlNRUl9SSyhzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCwgc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZFJhbmspICk7CisgICAgICAKKyAgICAgIC8qIERlY3JlYXNlIGNoYW5uZWwgY291bnQgYWZ0ZXIgc2V0dGluZyBpbnRvIHRlbXBvcmFyeSBKU1FSIHZhcmlhYmxlICovCisgICAgICBoYWRjLT5JbmplY3Rpb25Db25maWcuQ2hhbm5lbENvdW50IC0tOworICAgICAgCisgICAgICAvKiAzLiBFbmQgb2YgY29udGV4dCBzZXR0aW5nOiBJZiBsYXN0IGNoYW5uZWwgc2V0LCB0aGVuIHdyaXRlIGNvbnRleHQgICAqLworICAgICAgLyogICAgaW50byByZWdpc3RlciBKU1FSIGFuZCBtYWtlIGl0IGVudGVyIGludG8gcXVldWUgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIGlmIChoYWRjLT5JbmplY3Rpb25Db25maWcuQ2hhbm5lbENvdW50ID09IDBVKQorICAgICAgeworICAgICAgICAvKiBVcGRhdGUgQURDIHJlZ2lzdGVyIEpTUVIgKi8KKyAgICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+SlNRUiAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAgIEFEQ19KU1FSX0pTUTQgICAgfAorICAgICAgICAgICAgICAgICAgIEFEQ19KU1FSX0pTUTMgICAgfAorICAgICAgICAgICAgICAgICAgIEFEQ19KU1FSX0pTUTIgICAgfAorICAgICAgICAgICAgICAgICAgIEFEQ19KU1FSX0pTUTEgICAgfAorICAgICAgICAgICAgICAgICAgIEFEQ19KU1FSX0pFWFRFTiAgfAorICAgICAgICAgICAgICAgICAgIEFEQ19KU1FSX0pFWFRTRUwgfAorICAgICAgICAgICAgICAgICAgIEFEQ19KU1FSX0pMICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgaGFkYy0+SW5qZWN0aW9uQ29uZmlnLkNvbnRleHRRdWV1ZSApOworICAgICAgfQorCisgIH0KKworICAKKyAgLyogUGFyYW1ldGVycyB1cGRhdGUgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgdXBkYXRlZCB3aGVuIEFEQyBpcyBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgICAqLworICAvKiBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIGluamVjdGVkIGdyb3VwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIC0gSW5qZWN0ZWQgY29udGV4dCBxdWV1ZTogUXVldWUgZGlzYWJsZSAoYWN0aXZlIGNvbnRleHQgaXMga2VwdCkgb3IgICAgICovCisgIC8qICAgIGVuYWJsZSAoY29udGV4dCBkZWNyZW1lbnRlZCwgdXAgdG8gMiBjb250ZXh0cyBxdWV1ZWQpICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBJbmplY3RlZCBkaXNjb250aW51b3VzIG1vZGU6IGNhbiBiZSBlbmFibGVkIG9ubHkgaWYgYXV0by1pbmplY3RlZCAgICAgKi8KKyAgLyogICAgbW9kZSBpcyBkaXNhYmxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmIChBRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX0lOSkVDVEVEKGhhZGMpID09IFJFU0VUKQorICB7ICAgICAKKyAgICAvKiBJZiBhdXRvLWluamVjdGVkIG1vZGUgaXMgZGlzYWJsZWQ6IG5vIGNvbnN0cmFpbnQgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKHNDb25maWdJbmplY3RlZC0+QXV0b0luamVjdGVkQ29udiA9PSBESVNBQkxFKQorICAgIHsKKyAgICAgIE1PRElGWV9SRUcoaGFkYy0+SW5zdGFuY2UtPkNGR1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0pRTSAgICB8CisgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0pESVNDRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9JTkpFQ1RfQ09OVEVYVF9RVUVVRShzQ29uZmlnSW5qZWN0ZWQtPlF1ZXVlSW5qZWN0ZWRDb250ZXh0KSAgICAgICAgICAgfCAKKyAgICAgICAgICAgICAgICAgQURDX0NGR1JfSU5KRUNUX0RJU0NDT05USU5VT1VTKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWREaXNjb250aW51b3VzQ29udk1vZGUpICAgKTsKKyAgICB9CisgICAgLyogSWYgYXV0by1pbmplY3RlZCBtb2RlIGlzIGVuYWJsZWQ6IEluamVjdGVkIGRpc2NvbnRpbnVvdXMgc2V0dGluZyBpcyAgICAqLworICAgIC8qIGRpc2NhcmRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+Q0ZHUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgQURDX0NGR1JfSlFNICAgIHwKKyAgICAgICAgICAgICAgICAgQURDX0NGR1JfSkRJU0NFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0lOSkVDVF9DT05URVhUX1FVRVVFKHNDb25maWdJbmplY3RlZC0+UXVldWVJbmplY3RlZENvbnRleHQpICk7CisgICAgICAKKyAgICAgIC8qIElmIGluamVjdGVkIGRpc2NvbnRpbnVvdXMgbW9kZSB3YXMgaW50ZW5kZWQgdG8gYmUgc2V0IGFuZCBjb3VsZCBub3QgICovCisgICAgICAvKiBkdWUgdG8gYXV0by1pbmplY3RlZCBlbmFibGVkLCBlcnJvciBpcyByZXBvcnRlZC4gICAgICAgICAgICAgICAgICAgICAqLworICAgICAgaWYgKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWREaXNjb250aW51b3VzQ29udk1vZGUgPT0gRU5BQkxFKQorICAgICAgeworICAgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOworICAgICAgICAKKyAgICAgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorCisgIH0KKyAgCisgIAorICAvKiBQYXJhbWV0ZXJzIHVwZGF0ZSBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSB1cGRhdGVkIHdoZW4gQURDIGlzIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCAgICovCisgIC8qIGNvbnZlcnNpb24gb24gZ29pbmcgb24gcmVndWxhciBhbmQgaW5qZWN0ZWQgZ3JvdXBzOiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBBdXRvbWF0aWMgaW5qZWN0ZWQgY29udmVyc2lvbjogY2FuIGJlIGVuYWJsZWQgaWYgaW5qZWN0ZWQgZ3JvdXAgICAgICAgKi8KKyAgLyogICAgZXh0ZXJuYWwgdHJpZ2dlcnMgYXJlIGRpc2FibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIENoYW5uZWwgc2FtcGxpbmcgdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBDaGFubmVsIG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYgKEFEQ19JU19DT05WRVJTSU9OX09OR09JTkdfUkVHVUxBUl9JTkpFQ1RFRChoYWRjKSA9PSBSRVNFVCkKKyAgeyAgICAKKyAgICAvKiBJZiBpbmplY3RlZCBncm91cCBleHRlcm5hbCB0cmlnZ2VycyBhcmUgZGlzYWJsZWQgKHNldCB0byBpbmplY3RlZCAgICAgICovCisgICAgLyogc29mdHdhcmUgc3RhcnQpOiBubyBjb25zdHJhaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmIChzQ29uZmlnSW5qZWN0ZWQtPkV4dGVybmFsVHJpZ0luamVjQ29udiA9PSBBRENfSU5KRUNURURfU09GVFdBUkVfU1RBUlQpCisgICAgeworICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+Q0ZHUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0pBVVRPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgQURDX0NGR1JfSU5KRUNUX0FVVE9fQ09OVkVSU0lPTihzQ29uZmlnSW5qZWN0ZWQtPkF1dG9JbmplY3RlZENvbnYpICk7CisgICAgfQorICAgIC8qIElmIEF1dG9tYXRpYyBpbmplY3RlZCBjb252ZXJzaW9uIHdhcyBpbnRlbmRlZCB0byBiZSBzZXQgYW5kIGNvdWxkIG5vdCAgKi8KKyAgICAvKiBkdWUgdG8gaW5qZWN0ZWQgZ3JvdXAgZXh0ZXJuYWwgdHJpZ2dlcnMgZW5hYmxlZCwgZXJyb3IgaXMgcmVwb3J0ZWQuICAgICovCisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgQXV0b21hdGljIGluamVjdGVkIGNvbnZlcnNpb24gKi8KKyAgICAgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+Q0ZHUiwgQURDX0NGR1JfSkFVVE8pOworICAgICAgCisgICAgICBpZiAoc0NvbmZpZ0luamVjdGVkLT5BdXRvSW5qZWN0ZWRDb252ID09IEVOQUJMRSkKKyAgICAgIHsKKyAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfQ09ORklHKTsKKyAgICAgICAgCisgICAgICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgICAgIAorCisgICAgLyogQ2hhbm5lbCBzYW1wbGluZyB0aW1lIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAvKiBGb3IgY2hhbm5lbHMgMTAgdG8gMThVICovCisgICAgaWYgKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsID49IEFEQ19DSEFOTkVMXzEwKQorICAgIHsKKyAgICAgIE1PRElGWV9SRUcoaGFkYy0+SW5zdGFuY2UtPlNNUFIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgQURDX1NNUFIyKEFEQ19TTVBSMl9TTVAxMCwgc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwpICAgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgQURDX1NNUFIyKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRTYW1wbGluZ1RpbWUsIHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsKSApOworICAgIH0KKyAgICBlbHNlIC8qIEZvciBjaGFubmVscyAxIHRvIDlVICovCisgICAgeworICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+U01QUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICBBRENfU01QUjEoQURDX1NNUFIxX1NNUDAsIHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsKSAgICAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICBBRENfU01QUjEoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZFNhbXBsaW5nVGltZSwgc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwpICk7CisgICAgfQorICAgIAorICAgIC8qIENvbmZpZ3VyZSB0aGUgb2Zmc2V0OiBvZmZzZXQgZW5hYmxlL2Rpc2FibGUsIGNoYW5uZWwsIG9mZnNldCB2YWx1ZSAqLworICAgIAorICAgIC8qIFNoaWZ0IHRoZSBvZmZzZXQgaW4gZnVuY3Rpb24gb2YgdGhlIHNlbGVjdGVkIEFEQyByZXNvbHV0aW9uLiAqLworICAgIC8qIE9mZnNldCBoYXMgdG8gYmUgbGVmdC1hbGlnbmVkIG9uIGJpdCAxMVUsIHRoZSBMU0IgKHJpZ2h0IGJpdHMpIGFyZSBzZXQgICovCisgICAgLyogdG8gMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHRtcE9mZnNldFNoaWZ0ZWQgPSBBRENfT0ZGU0VUX1NISUZUX1JFU09MVVRJT04oaGFkYywgc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZE9mZnNldCk7CisgICAgCisgICAgLyogQ29uZmlndXJlIHRoZSBzZWxlY3RlZCBvZmZzZXQgcmVnaXN0ZXI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIC0gRW5hYmxlIG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAtIFNldCBjaGFubmVsIG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogLSBTZXQgb2Zmc2V0IHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHN3aXRjaCAoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZE9mZnNldE51bWJlcikKKyAgICB7CisgICAgY2FzZSBBRENfT0ZGU0VUXzE6CisgICAgICAvKiBDb25maWd1cmUgb2Zmc2V0IHJlZ2lzdGVyIDFVICovCisgICAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5PRlIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgQURDX09GUjFfT0ZGU0VUMV9DSCB8CisgICAgICAgICAgICAgICAgIEFEQ19PRlIxX09GRlNFVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgQURDX09GUjFfT0ZGU0VUMV9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgIEFEQ19PRlJfQ0hBTk5FTChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCkgfAorICAgICAgICAgICAgICAgICB0bXBPZmZzZXRTaGlmdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgQURDX09GRlNFVF8yOgorICAgICAgLyogQ29uZmlndXJlIG9mZnNldCByZWdpc3RlciAyVSAqLworICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+T0ZSMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIEFEQ19PRlIyX09GRlNFVDJfQ0ggfAorICAgICAgICAgICAgICAgICBBRENfT0ZSMl9PRkZTRVQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIEFEQ19PRlIyX09GRlNFVDJfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICBBRENfT0ZSX0NIQU5ORUwoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwpIHwKKyAgICAgICAgICAgICAgICAgdG1wT2Zmc2V0U2hpZnRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICBicmVhazsKKyAgICAgICAgCisgICAgY2FzZSBBRENfT0ZGU0VUXzM6CisgICAgICAvKiBDb25maWd1cmUgb2Zmc2V0IHJlZ2lzdGVyIDNVICovCisgICAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5PRlIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgQURDX09GUjNfT0ZGU0VUM19DSCB8CisgICAgICAgICAgICAgICAgIEFEQ19PRlIzX09GRlNFVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgQURDX09GUjNfT0ZGU0VUM19FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgIEFEQ19PRlJfQ0hBTk5FTChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCkgfAorICAgICAgICAgICAgICAgICB0bXBPZmZzZXRTaGlmdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgQURDX09GRlNFVF80OgorICAgICAgLyogQ29uZmlndXJlIG9mZnNldCByZWdpc3RlciA0VSAqLworICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+T0ZSNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIEFEQ19PRlI0X09GRlNFVDRfQ0ggfAorICAgICAgICAgICAgICAgICBBRENfT0ZSNF9PRkZTRVQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIEFEQ19PRlI0X09GRlNFVDRfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICBBRENfT0ZSX0NIQU5ORUwoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwpIHwKKyAgICAgICAgICAgICAgICAgdG1wT2Zmc2V0U2hpZnRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICBicmVhazsKKyAgICAKKyAgICAvKiBDYXNlIEFEQ19PRkZTRVRfTk9ORSAqLworICAgIGRlZmF1bHQgOgorICAgIC8qIFNjYW4gT0ZSMSwgT0ZSMiwgT0ZSMywgT0ZSNCB0byBjaGVjayBpZiB0aGUgc2VsZWN0ZWQgY2hhbm5lbCBpcyAgICAgICAgKi8KKyAgICAvKiBlbmFibGVkLiBJZiB0aGlzIGlzIHRoZSBjYXNlLCBvZmZzZXQgT0ZSeCBpcyBkaXNhYmxlZC4gICAgICAgICAgICAgICAgICovCisgICAgICBpZiAoKChoYWRjLT5JbnN0YW5jZS0+T0ZSMSkgJiBBRENfT0ZSMV9PRkZTRVQxX0NIKSA9PSBBRENfT0ZSX0NIQU5ORUwoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwpKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIG9mZnNldCBPRlIxKi8KKyAgICAgICAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5PRlIxLCBBRENfT0ZSMV9PRkZTRVQxX0VOKTsKKyAgICAgIH0KKyAgICAgIGlmICgoKGhhZGMtPkluc3RhbmNlLT5PRlIyKSAmIEFEQ19PRlIyX09GRlNFVDJfQ0gpID09IEFEQ19PRlJfQ0hBTk5FTChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCkpCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgb2Zmc2V0IE9GUjIqLworICAgICAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPk9GUjIsIEFEQ19PRlIyX09GRlNFVDJfRU4pOyAKKyAgICAgIH0KKyAgICAgIGlmICgoKGhhZGMtPkluc3RhbmNlLT5PRlIzKSAmIEFEQ19PRlIzX09GRlNFVDNfQ0gpID09IEFEQ19PRlJfQ0hBTk5FTChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCkpCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgb2Zmc2V0IE9GUjMqLworICAgICAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPk9GUjMsIEFEQ19PRlIzX09GRlNFVDNfRU4pOworICAgICAgfQorICAgICAgaWYgKCgoaGFkYy0+SW5zdGFuY2UtPk9GUjQpICYgQURDX09GUjRfT0ZGU0VUNF9DSCkgPT0gQURDX09GUl9DSEFOTkVMKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsKSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSBvZmZzZXQgT0ZSNCovCisgICAgICAgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+T0ZSNCwgQURDX09GUjRfT0ZGU0VUNF9FTik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgCisgIH0KKyAgCisgIAorICAvKiBQYXJhbWV0ZXJzIHVwZGF0ZSBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSB1cGRhdGVkIG9ubHkgd2hlbiBBREMgaXMgZGlzYWJsZWQ6ICAgICAgICAgICAgICAgICovCisgIC8qICAtIFNpbmdsZSBvciBkaWZmZXJlbnRpYWwgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBJbnRlcm5hbCBtZWFzdXJlbWVudCBjaGFubmVsczogVmJhdC9WcmVmSW50L1RlbXBTZW5zb3IgICAgICAgICAgICAgICAgKi8KKyAgaWYgKEFEQ19JU19FTkFCTEUoaGFkYykgPT0gUkVTRVQpCisgIHsKKyAgICAvKiBDb25maWd1cmF0aW9uIG9mIGRpZmZlcmVudGlhbCBtb2RlICovCisgICAgaWYgKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRTaW5nbGVEaWZmICE9IEFEQ19ESUZGRVJFTlRJQUxfRU5ERUQpCisgICAgeworICAgICAgLyogRGlzYWJsZSBkaWZmZXJlbnRpYWwgbW9kZSAoZGVmYXVsdCBtb2RlOiBzaW5nbGUtZW5kZWQpICovCisgICAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkRJRlNFTCwgQURDX0RJRlNFTF9DSEFOTkVMKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBFbmFibGUgZGlmZmVyZW50aWFsIG1vZGUgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+SW5zdGFuY2UtPkRJRlNFTCwgQURDX0RJRlNFTF9DSEFOTkVMKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsKSk7CisgICAgICAKKyAgICAgIC8qIENoYW5uZWwgc2FtcGxpbmcgdGltZSBjb25maWd1cmF0aW9uIChjaGFubmVsIEFEQ19JTnggKzEgICAgICAgICAgICAgICovCisgICAgICAvKiBjb3JyZXNwb25kaW5nIHRvIGRpZmZlcmVudGlhbCBuZWdhdGl2ZSBpbnB1dCkuICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogRm9yIGNoYW5uZWxzIDEwIHRvIDE4VSAqLworICAgICAgaWYgKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsID49IEFEQ19DSEFOTkVMXzEwKQorICAgICAgeworICAgICAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5TTVBSMiwKKyAgICAgICAgICAgICAgICAgICBBRENfU01QUjIoQURDX1NNUFIyX1NNUDEwLCBzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCArMVUpLAorICAgICAgICAgICAgICAgICAgIEFEQ19TTVBSMihzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkU2FtcGxpbmdUaW1lLCBzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCArMVUpICk7CisgICAgICB9CisgICAgICBlbHNlIC8qIEZvciBjaGFubmVscyAxIHRvIDlVICovCisgICAgICB7CisgICAgICAgIE1PRElGWV9SRUcoaGFkYy0+SW5zdGFuY2UtPlNNUFIxLAorICAgICAgICAgICAgICAgICAgIEFEQ19TTVBSMShBRENfU01QUjFfU01QMCwgc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwgKzFVKSwKKyAgICAgICAgICAgICAgICAgICBBRENfU01QUjEoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZFNhbXBsaW5nVGltZSwgc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwgKzFVKSApOworICAgICAgfQorICAgIH0KKyAgICAKKworICAgIC8qIE1hbmFnZW1lbnQgb2YgaW50ZXJuYWwgbWVhc3VyZW1lbnQgY2hhbm5lbHM6IFZyZWZJbnQvVGVtcFNlbnNvci9WYmF0ICAgKi8KKyAgICAvKiBpbnRlcm5hbCBtZWFzdXJlbWVudCBwYXRocyBlbmFibGU6IElmIGludGVybmFsIGNoYW5uZWwgc2VsZWN0ZWQsICAgICAgICovCisgICAgLyogZW5hYmxlIGRlZGljYXRlZCBpbnRlcm5hbCBidWZmZXJzIGFuZCBwYXRoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIE5vdGU6IHRoZXNlIGludGVybmFsIG1lYXN1cmVtZW50IHBhdGhzIGNhbiBiZSBkaXNhYmxlZCB1c2luZyAgICAgICAgICAgKi8KKyAgICAvKiBIQUxfQURDX2RlSW5pdCgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgCisgICAgLyogQ29uZmlndXJhdGlvbiBvZiBjb21tb24gQURDIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIFBvaW50ZXIgdG8gdGhlIGNvbW1vbiBjb250cm9sIHJlZ2lzdGVyIHRvIHdoaWNoIGlzIGJlbG9uZ2luZyBoYWRjICAgICAgKi8KKyAgICAvKiAoRGVwZW5kaW5nIG9uIFNUTTMyRjMgcHJvZHVjdCwgdGhlcmUgbWF5IGJlIHVwIHRvIDQgQURDIGFuZCAyIGNvbW1vbiAgICovCisgICAgLyogY29udHJvbCByZWdpc3RlcnMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHRtcEFEQ19Db21tb24gPSBBRENfQ09NTU9OX1JFR0lTVEVSKGhhZGMpOworICAKKyAgICAvKiBJZiB0aGUgcmVxdWVzdGVkIGludGVybmFsIG1lYXN1cmVtZW50IHBhdGggaGFzIGFscmVhZHkgYmVlbiBlbmFibGVkLCAgICovCisgICAgLyogYnlwYXNzIHRoZSBjb25maWd1cmF0aW9uIHByb2Nlc3NpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmICgoIChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCA9PSBBRENfQ0hBTk5FTF9URU1QU0VOU09SKSAmJgorICAgICAgICAgIChIQUxfSVNfQklUX0NMUih0bXBBRENfQ29tbW9uLT5DQ1IsIEFEQ19DQ1JfVFNFTikpICAgICAgICAgICAgKSB8fAorICAgICAgICAoIChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCA9PSBBRENfQ0hBTk5FTF9WQkFUKSAgICAgICAmJgorICAgICAgICAgIChIQUxfSVNfQklUX0NMUih0bXBBRENfQ29tbW9uLT5DQ1IsIEFEQ19DQ1JfVkJBVEVOKSkgICAgICAgICAgKSB8fAorICAgICAgICAoIChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCA9PSBBRENfQ0hBTk5FTF9WUkVGSU5UKSAgICAmJgorICAgICAgICAgIChIQUxfSVNfQklUX0NMUih0bXBBRENfQ29tbW9uLT5DQ1IsIEFEQ19DQ1JfVlJFRkVOKSkpCisgICAgICAgKQorICAgIHsKKyAgICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgY29tbW9uIEFEQyBwYXJhbWV0ZXJzIChjb250aW51YXRpb24pICAgICAgICAgICAgICAgICovCisgICAgICAvKiBTZXQgaGFuZGxlIG9mIHRoZSBvdGhlciBBREMgc2hhcmluZyB0aGUgc2FtZSBjb21tb24gcmVnaXN0ZXIgICAgICAgICAqLworICAgICAgQURDX0NPTU1PTl9BRENfT1RIRVIoaGFkYywgJnRtcGhhZGNTaGFyaW5nU2FtZUNvbW1vblJlZ2lzdGVyKTsKKyAgICAgIAorICAgICAgLyogU29mdHdhcmUgaXMgYWxsb3dlZCB0byBjaGFuZ2UgY29tbW9uIHBhcmFtZXRlcnMgb25seSB3aGVuIGFsbCBBRENzICAgKi8KKyAgICAgIC8qIG9mIHRoZSBjb21tb24gZ3JvdXAgYXJlIGRpc2FibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBpZiAoKEFEQ19JU19FTkFCTEUoaGFkYykgPT0gUkVTRVQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAoICh0bXBoYWRjU2hhcmluZ1NhbWVDb21tb25SZWdpc3Rlci5JbnN0YW5jZSA9PSBOVUxMKSAgICAgICAgIHx8CisgICAgICAgICAgICAoQURDX0lTX0VOQUJMRSgmdG1waGFkY1NoYXJpbmdTYW1lQ29tbW9uUmVnaXN0ZXIpID09IFJFU0VUKSAgICkgICApCisgICAgICB7CisgICAgICAgIC8qIElmIENoYW5uZWxfMTYgaXMgc2VsZWN0ZWQsIGVuYWJsZSBUZW1wLiBzZW5zb3IgbWVhc3VyZW1lbnQgcGF0aCAgICAqLworICAgICAgICAvKiBOb3RlOiBUZW1wLiBzZW5zb3IgaW50ZXJuYWwgY2hhbm5lbHMgYXZhaWxhYmxlIG9uIEFEQzEgb25seSAgICAgICAgKi8KKyAgICAgICAgaWYgKChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCA9PSBBRENfQ0hBTk5FTF9URU1QU0VOU09SKSAmJiAoaGFkYy0+SW5zdGFuY2UgPT0gQURDMSkpCisgICAgICAgIHsKKyAgICAgICAgICBTRVRfQklUKHRtcEFEQ19Db21tb24tPkNDUiwgQURDX0NDUl9UU0VOKTsKKyAgICAgICAgICAKKyAgICAgICAgICAvKiBEZWxheSBmb3IgdGVtcGVyYXR1cmUgc2Vuc29yIHN0YWJpbGl6YXRpb24gdGltZSAqLworICAgICAgICAgIC8qIENvbXB1dGUgbnVtYmVyIG9mIENQVSBjeWNsZXMgdG8gd2FpdCBmb3IgKi8KKyAgICAgICAgICB3YWl0X2xvb3BfaW5kZXggPSAoQURDX1RFTVBTRU5TT1JfREVMQVlfVVMgKiAoU3lzdGVtQ29yZUNsb2NrIC8gMTAwMDAwMFUpKTsKKyAgICAgICAgICB3aGlsZSh3YWl0X2xvb3BfaW5kZXggIT0gMFUpCisgICAgICAgICAgeworICAgICAgICAgICAgd2FpdF9sb29wX2luZGV4LS07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIElmIENoYW5uZWxfMTcgaXMgc2VsZWN0ZWQsIGVuYWJsZSBWQkFUIG1lYXN1cmVtZW50IHBhdGggICAgICAgICAgICAqLworICAgICAgICAvKiBOb3RlOiBWQkFUIGludGVybmFsIGNoYW5uZWxzIGF2YWlsYWJsZSBvbiBBREMxIG9ubHkgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgZWxzZSBpZiAoKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsID09IEFEQ19DSEFOTkVMX1ZCQVQpICYmIChoYWRjLT5JbnN0YW5jZSA9PSBBREMxKSkKKyAgICAgICAgeworICAgICAgICAgIFNFVF9CSVQodG1wQURDX0NvbW1vbi0+Q0NSLCBBRENfQ0NSX1ZCQVRFTik7CisgICAgICAgIH0KKyAgICAgICAgLyogSWYgQ2hhbm5lbF8xOCBpcyBzZWxlY3RlZCwgZW5hYmxlIFZSRUZJTlQgbWVhc3VyZW1lbnQgcGF0aCAgICAgICAgICovCisgICAgICAgIC8qIE5vdGU6IFZyZWZJbnQgaW50ZXJuYWwgY2hhbm5lbHMgYXZhaWxhYmxlIG9uIGFsbCBBRENzLCBidXQgb25seSAgICAqLworICAgICAgICAvKiAgICAgICBvbmUgQURDIGlzIGFsbG93ZWQgdG8gYmUgY29ubmVjdGVkIHRvIFZyZWZJbnQgYXQgdGhlIHNhbWUgICAgKi8KKyAgICAgICAgLyogICAgICAgdGltZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIGVsc2UgaWYgKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsID09IEFEQ19DSEFOTkVMX1ZSRUZJTlQpCisgICAgICAgIHsKKyAgICAgICAgICBTRVRfQklUKHRtcEFEQ19Db21tb24tPkNDUiwgQURDX0NDUl9WUkVGRU4pOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBJZiB0aGUgcmVxdWVzdGVkIGludGVybmFsIG1lYXN1cmVtZW50IHBhdGggaGFzIGFscmVhZHkgYmVlbiBlbmFibGVkICAqLworICAgICAgLyogYW5kIG90aGVyIEFEQyBvZiB0aGUgY29tbW9uIGdyb3VwIGFyZSBlbmFibGVkLCBpbnRlcm5hbCAgICAgICAgICAgICAgKi8KKyAgICAgIC8qIG1lYXN1cmVtZW50IHBhdGhzIGNhbm5vdCBiZSBlbmFibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBlbHNlICAKKyAgICAgIHsKKyAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfQ09ORklHKTsKKyAgICAgICAgCisgICAgICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgICAKKyAgfQorICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgQURDIGluamVjdGVkIGdyb3VwIGFuZCB0aGUgc2VsZWN0ZWQgY2hhbm5lbCB0byBiZQorICAqICAgICAgICAgbGlua2VkIHRvIHRoZSBpbmplY3RlZCBncm91cC4KKyAgKiBAbm90ZSAgIFBvc3NpYmlsaXR5IHRvIHVwZGF0ZSBwYXJhbWV0ZXJzIG9uIHRoZSBmbHk6CisgICogICAgICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIGluamVjdGVkIGdyb3VwLCBmb2xsb3dpbmcgY2FsbHMgdG8gdGhpcyAKKyAgKiAgICAgICAgIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlY29uZmlndXJlIHNvbWUgcGFyYW1ldGVycyBvZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgICJBRENfSW5qZWN0aW9uQ29uZlR5cGVEZWYiIG9uIHRoZSBmbHksIHdpdGhvdXQgcmVzZXRpbmcgdGhlIEFEQy4KKyAgKiAgICAgICAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlOiAKKyAgKiAgICAgICAgIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2hlbiBBREMgaXMgbm90IHVuZGVyIGNvbnZlcnNpb24uCisgICogQG5vdGUgICBJbiBjYXNlIG9mIHVzYWdlIG9mIGludGVybmFsIG1lYXN1cmVtZW50IGNoYW5uZWxzOgorICAqICAgICAgICAgVmJhdC9WcmVmSW50L1RlbXBTZW5zb3IuCisgICogICAgICAgICBUaGUgcmVjb21tZW5kZWQgc2FtcGxpbmcgdGltZSBpcyBhdCBsZWFzdDoKKyAgKiAgICAgICAgICAtIEZvciBkZXZpY2VzIFNUTTMyRjM3eDogMTcuMXVzIGZvciB0ZW1wZXJhdHVyZSBzZW5zb3IKKyAgKiAgICAgICAgICAtIEZvciB0aGUgb3RoZXIgU1RNMzJGMyBkZXZpY2VzOiAyLjJ1cyBmb3IgZWFjaCBvZiBjaGFubmVscyAKKyAgKiAgICAgICAgICAgIFZiYXQvVnJlZkludC9UZW1wU2Vuc29yLgorICAqICAgICAgICAgVGhlc2UgaW50ZXJuYWwgcGF0aHMgY2FuIGJlIGJlIGRpc2FibGVkIHVzaW5nIGZ1bmN0aW9uIAorICAqICAgICAgICAgSEFMX0FEQ19EZUluaXQoKS4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEBwYXJhbSAgc0NvbmZpZ0luamVjdGVkIFN0cnVjdHVyZSBvZiBBREMgaW5qZWN0ZWQgZ3JvdXAgYW5kIEFEQyBjaGFubmVsIGZvcgorICAqICAgICAgICAgaW5qZWN0ZWQgZ3JvdXAuCisgICogQHJldHZhbCBOb25lCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfSW5qZWN0ZWRDb25maWdDaGFubmVsKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCBBRENfSW5qZWN0aW9uQ29uZlR5cGVEZWYqIHNDb25maWdJbmplY3RlZCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXMgPSBIQUxfT0s7CisgIF9fSU8gdWludDMyX3Qgd2FpdF9sb29wX2luZGV4ID0gMFU7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0NIQU5ORUwoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19TQU1QTEVfVElNRShzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkU2FtcGxpbmdUaW1lKSk7CisgIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKHNDb25maWdJbmplY3RlZC0+QXV0b0luamVjdGVkQ29udikpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0VYVFRSSUdJTkpFQyhzQ29uZmlnSW5qZWN0ZWQtPkV4dGVybmFsVHJpZ0luamVjQ29udikpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX1JBTkdFKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRPZmZzZXQpKTsKKyAgCisgIGlmKGhhZGMtPkluaXQuU2NhbkNvbnZNb2RlICE9IEFEQ19TQ0FOX0RJU0FCTEUpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfQURDX0lOSkVDVEVEX1JBTksoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZFJhbmspKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfQURDX0lOSkVDVEVEX05CX0NPTlYoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZE5ick9mQ29udmVyc2lvbikpOworICAgIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWREaXNjb250aW51b3VzQ29udk1vZGUpKTsKKyAgfQorICAKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoYWRjKTsKKyAgCisgIC8qIENvbmZpZ3VyYXRpb24gb2YgaW5qZWN0ZWQgZ3JvdXAgc2VxdWVuY2VyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAtIGlmIHNjYW4gbW9kZSBpcyBkaXNhYmxlZCwgaW5qZWN0ZWQgY2hhbm5lbHMgc2VxdWVuY2UgbGVuZ3RoIGlzIHNldCB0byAgKi8KKyAgLyogICAweDAwOiAxIGNoYW5uZWwgY29udmVydGVkIChjaGFubmVsIG9uIHJlZ3VsYXIgcmFuayAxVSkgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFBhcmFtZXRlciAiSW5qZWN0ZWROYnJPZkNvbnZlcnNpb24iIGlzIGRpc2NhcmRlZC4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBOb3RlOiBTY2FuIG1vZGUgaXMgcHJlc2VudCBieSBoYXJkd2FyZSBvbiB0aGlzIGRldmljZSBhbmQsIGlmICAgICAgICAgICovCisgIC8qICAgZGlzYWJsZWQsIGRpc2NhcmRzIGF1dG9tYXRpY2FsbHkgbmIgb2YgY29udmVyc2lvbnMuIEFueXdheSwgbmIgb2YgICAgICAqLworICAvKiAgIGNvbnZlcnNpb25zIGlzIGZvcmNlZCB0byAweDAwIGZvciBhbGlnbm1lbnQgb3ZlciBhbGwgU1RNMzIgZGV2aWNlcy4gICAgKi8KKyAgLyogLSBpZiBzY2FuIG1vZGUgaXMgZW5hYmxlZCwgaW5qZWN0ZWQgY2hhbm5lbHMgc2VxdWVuY2UgbGVuZ3RoIGlzIHNldCB0byAgICovCisgIC8qICAgcGFyYW1ldGVyICJJbmplY3RlZE5ick9mQ29udmVyc2lvbiIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZiAoaGFkYy0+SW5pdC5TY2FuQ29udk1vZGUgPT0gQURDX1NDQU5fRElTQUJMRSkKKyAgeworICAgIGlmIChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkUmFuayA9PSBBRENfSU5KRUNURURfUkFOS18xKQorICAgIHsKKyAgICAgIC8qIENsZWFyIHRoZSBvbGQgU1F4IGJpdHMgZm9yIGFsbCBpbmplY3RlZCByYW5rcyAqLworICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+SlNRUiAgICAgICAgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgQURDX0pTUVJfSkwgICB8CisgICAgICAgICAgICAgICAgIEFEQ19KU1FSX0pTUTQgfAorICAgICAgICAgICAgICAgICBBRENfSlNRUl9KU1EzIHwKKyAgICAgICAgICAgICAgICAgQURDX0pTUVJfSlNRMiB8CisgICAgICAgICAgICAgICAgIEFEQ19KU1FSX0pTUTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICBBRENfSlNRUl9SS19KTChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0lOSkVDVEVEX1JBTktfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMVUpICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgfQorICAgIC8qIElmIGFub3RoZXIgaW5qZWN0ZWQgcmFuayB0aGFuIHJhbmsxIHdhcyBpbnRlbmRlZCB0byBiZSBzZXQsIGFuZCBjb3VsZCAgKi8KKyAgICAvKiBub3QgZHVlIHRvIFNjYW5Db252TW9kZSBkaXNhYmxlZCwgZXJyb3IgaXMgcmVwb3J0ZWQuICAgICAgICAgICAgICAgICAgICovCisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOworICAgICAgCisgICAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogU2luY2UgaW5qZWN0ZWQgY2hhbm5lbHMgcmFuayBjb252LiBvcmRlciBkZXBlbmRzIG9uIHRvdGFsIG51bWJlciBvZiAgICovCisgICAgLyogaW5qZWN0ZWQgY29udmVyc2lvbnMsIHNlbGVjdGVkIHJhbmsgbXVzdCBiZSBiZWxvdyBvciBlcXVhbCB0byB0b3RhbCAgICovCisgICAgLyogbnVtYmVyIG9mIGluamVjdGVkIGNvbnZlcnNpb25zIHRvIGJlIHVwZGF0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRSYW5rIDw9IHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWROYnJPZkNvbnZlcnNpb24pCisgICAgeworICAgICAgLyogQ2xlYXIgdGhlIG9sZCBTUXggYml0cyBmb3IgdGhlIHNlbGVjdGVkIHJhbmsgKi8KKyAgICAgIC8qIFNldCB0aGUgU1F4IGJpdHMgZm9yIHRoZSBzZWxlY3RlZCByYW5rICovCisgICAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5KU1FSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICBBRENfSlNRUl9KTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgIEFEQ19KU1FSX1JLX0pMKEFEQ19KU1FSX0pTUTEsICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkUmFuaywgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZE5ick9mQ29udmVyc2lvbikgICAgICwKKyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgIEFEQ19KU1FSX0pMX1NISUZUKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWROYnJPZkNvbnZlcnNpb24pIHwKKyAgICAgICAgICAgICAgICAgQURDX0pTUVJfUktfSkwoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwsICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRSYW5rLCAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkTmJyT2ZDb252ZXJzaW9uKSAgICAgICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBDbGVhciB0aGUgb2xkIFNReCBiaXRzIGZvciB0aGUgc2VsZWN0ZWQgcmFuayAqLworICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+SlNRUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICBBRENfSlNRUl9KTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgQURDX0pTUVJfUktfSkwoQURDX0pTUVJfSlNRMSwgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRSYW5rLCAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkTmJyT2ZDb252ZXJzaW9uKSAsCisgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAweDAwMDAwMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICB9CisgIH0KKyAgCisgIC8qIENvbmZpZ3VyYXRpb24gb2YgaW5qZWN0ZWQgZ3JvdXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBQYXJhbWV0ZXJzIHVwZGF0ZSBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSB1cGRhdGVkIG9ubHkgd2hlbiBBREMgaXMgZGlzYWJsZWQ6ICAgICAgICAgICAgICAgICovCisgIC8qICAtIGV4dGVybmFsIHRyaWdnZXIgdG8gc3RhcnQgY29udmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBQYXJhbWV0ZXJzIHVwZGF0ZSBub3QgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlOiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIC0gQXV0b21hdGljIGluamVjdGVkIGNvbnZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIEluamVjdGVkIGRpc2NvbnRpbnVvdXMgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBOb3RlOiBJbiBjYXNlIG9mIEFEQyBhbHJlYWR5IGVuYWJsZWQsIGNhdXRpb24gdG8gbm90IGxhdW5jaCBhbiB1bndhbnRlZCAgKi8KKyAgLyogICAgICAgY29udmVyc2lvbiB3aGlsZSBtb2RpZnlpbmcgcmVnaXN0ZXIgQ1IyIGJ5IHdyaXRpbmcgMSB0byBiaXQgQURPTi4gICovCisgIGlmIChBRENfSVNfRU5BQkxFKGhhZGMpID09IFJFU0VUKQorICB7ICAgIAorICAgIE1PRElGWV9SRUcoaGFkYy0+SW5zdGFuY2UtPkNSMiAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICBBRENfQ1IyX0pFWFRTRUwgfAorICAgICAgICAgICAgICAgQURDX0NSMl9BRE9OICAgICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICBzQ29uZmlnSW5qZWN0ZWQtPkV4dGVybmFsVHJpZ0luamVjQ29udiApOworICB9CisgIAorICAvKiBDb25maWd1cmF0aW9uIG9mIGluamVjdGVkIGdyb3VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIC0gQXV0b21hdGljIGluamVjdGVkIGNvbnZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIEluamVjdGVkIGRpc2NvbnRpbnVvdXMgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAKKyAgICAvKiBBdXRvbWF0aWMgaW5qZWN0ZWQgY29udmVyc2lvbiBjYW4gYmUgZW5hYmxlZCBpZiBpbmplY3RlZCBncm91cCAgICAgICAgICovCisgICAgLyogZXh0ZXJuYWwgdHJpZ2dlcnMgYXJlIGRpc2FibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmIChzQ29uZmlnSW5qZWN0ZWQtPkF1dG9JbmplY3RlZENvbnYgPT0gRU5BQkxFKQorICAgIHsKKyAgICAgIGlmIChzQ29uZmlnSW5qZWN0ZWQtPkV4dGVybmFsVHJpZ0luamVjQ29udiA9PSBBRENfSU5KRUNURURfU09GVFdBUkVfU1RBUlQpCisgICAgICB7CisgICAgICAgIFNFVF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNSMSwgQURDX0NSMV9KQVVUTyk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0NPTkZJRyk7CisgICAgICAgIAorICAgICAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogSW5qZWN0ZWQgZGlzY29udGludW91cyBjYW4gYmUgZW5hYmxlZCBvbmx5IGlmIGF1dG8taW5qZWN0ZWQgbW9kZSBpcyAgICAqLworICAgIC8qIGRpc2FibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIAorICAgIGlmIChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkRGlzY29udGludW91c0NvbnZNb2RlID09IEVOQUJMRSkKKyAgICB7CisgICAgICBpZiAoc0NvbmZpZ0luamVjdGVkLT5BdXRvSW5qZWN0ZWRDb252ID09IERJU0FCTEUpCisgICAgICB7CisgICAgICAgIFNFVF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNSMSwgQURDX0NSMV9KRElTQ0VOKTsKKyAgICAgIH0gCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0NPTkZJRyk7CisgICAgICAgIAorICAgICAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisKKworICAvKiBJbmplY3RlZENoYW5uZWwgc2FtcGxpbmcgdGltZSBjb25maWd1cmF0aW9uICovCisgIC8qIEZvciBjaGFubmVscyAxMCB0byAxOCAqLworICBpZiAoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwgPiBBRENfQ0hBTk5FTF8xMCkKKyAgeworICAgIE1PRElGWV9SRUcoaGFkYy0+SW5zdGFuY2UtPlNNUFIxLAorICAgICAgICAgICAgICAgQURDX1NNUFIxKEFEQ19TTVBSMV9TTVAxMCwgc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwpLAorICAgICAgICAgICAgICAgQURDX1NNUFIxKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRTYW1wbGluZ1RpbWUsIHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsKSApOworICB9CisgIGVsc2UgLyogRm9yIGNoYW5uZWxzIDEgdG8gOSAqLworICB7CisgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+U01QUjIsCisgICAgICAgICAgICAgICBBRENfU01QUjIoQURDX1NNUFIyX1NNUDAsIHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsKSwKKyAgICAgICAgICAgICAgIEFEQ19TTVBSMihzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkU2FtcGxpbmdUaW1lLCBzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCkgKTsKKyAgfQorICAKKyAgCisgIC8qIENvbmZpZ3VyZSB0aGUgb2Zmc2V0OiBvZmZzZXQgZW5hYmxlL2Rpc2FibGUsIEluamVjdGVkQ2hhbm5lbCwgb2Zmc2V0IHZhbHVlICovCisgIHN3aXRjaChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkUmFuaykKKyAgeworICAgIGNhc2UgMToKKyAgICAgIC8qIFNldCBpbmplY3RlZCBjaGFubmVsIDEgb2Zmc2V0ICovCisgICAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5KT0ZSMSwKKyAgICAgICAgICAgICAgICAgQURDX0pPRlIxX0pPRkZTRVQxLAorICAgICAgICAgICAgICAgICBzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkT2Zmc2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIC8qIFNldCBpbmplY3RlZCBjaGFubmVsIDIgb2Zmc2V0ICovCisgICAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5KT0ZSMiwKKyAgICAgICAgICAgICAgICAgQURDX0pPRlIyX0pPRkZTRVQyLAorICAgICAgICAgICAgICAgICBzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkT2Zmc2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIC8qIFNldCBpbmplY3RlZCBjaGFubmVsIDMgb2Zmc2V0ICovCisgICAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5KT0ZSMywKKyAgICAgICAgICAgICAgICAgQURDX0pPRlIzX0pPRkZTRVQzLAorICAgICAgICAgICAgICAgICBzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkT2Zmc2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICBkZWZhdWx0OgorICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+Sk9GUjQsCisgICAgICAgICAgICAgICAgIEFEQ19KT0ZSNF9KT0ZGU0VUNCwKKyAgICAgICAgICAgICAgICAgc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZE9mZnNldCk7CisgICAgICBicmVhazsKKyAgfQorICAKKyAgLyogSWYgQURDMSBDaGFubmVsXzE2IG9yIENoYW5uZWxfMTcgaXMgc2VsZWN0ZWQsIGVuYWJsZSBUZW1wZXJhdHVyZSBzZW5zb3IgICovCisgIC8qIGFuZCBWUkVGSU5UIG1lYXN1cmVtZW50IHBhdGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZiAoKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsID09IEFEQ19DSEFOTkVMX1RFTVBTRU5TT1IpIHx8CisgICAgICAoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwgPT0gQURDX0NIQU5ORUxfVlJFRklOVCkgICAgICApCisgIHsKKyAgICBpZiAoUkVBRF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNSMiwgQURDX0NSMl9UU1ZSRUZFKSA9PSBSRVNFVCkKKyAgICB7CisgICAgICBTRVRfQklUKGhhZGMtPkluc3RhbmNlLT5DUjIsIEFEQ19DUjJfVFNWUkVGRSk7CisgICAgICAKKyAgICAgIGlmICgoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwgPT0gQURDX0NIQU5ORUxfVEVNUFNFTlNPUikpCisgICAgICB7CisgICAgICAgIC8qIERlbGF5IGZvciB0ZW1wZXJhdHVyZSBzZW5zb3Igc3RhYmlsaXphdGlvbiB0aW1lICovCisgICAgICAgIC8qIENvbXB1dGUgbnVtYmVyIG9mIENQVSBjeWNsZXMgdG8gd2FpdCBmb3IgKi8KKyAgICAgICAgd2FpdF9sb29wX2luZGV4ID0gKEFEQ19URU1QU0VOU09SX0RFTEFZX1VTICogKFN5c3RlbUNvcmVDbG9jayAvIDEwMDAwMDBVKSk7CisgICAgICAgIHdoaWxlKHdhaXRfbG9vcF9pbmRleCAhPSAwVSkKKyAgICAgICAgeworICAgICAgICAgIHdhaXRfbG9vcF9pbmRleC0tOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIC8qIGlmIEFEQzEgQ2hhbm5lbF8xOCBpcyBzZWxlY3RlZCwgZW5hYmxlIFZCQVQgbWVhc3VyZW1lbnQgcGF0aCAqLworICBlbHNlIGlmIChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCA9PSBBRENfQ0hBTk5FTF9WQkFUKQorICB7CisgICAgU0VUX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfVkJBVCk7CisgIH0KKyAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhhZGMpOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisjZW5kaWYgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIGFuYWxvZyB3YXRjaGRvZy4KKyAgKiBAbm90ZSAgIFBvc3NpYmlsaXR5IHRvIHVwZGF0ZSBwYXJhbWV0ZXJzIG9uIHRoZSBmbHk6CisgICogICAgICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBzZWxlY3RlZCBhbmFsb2cgd2F0Y2hkb2csIGZvbGxvd2luZyAgCisgICogICAgICAgICBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlY29uZmlndXJlIHNvbWUgcGFyYW1ldGVycyAKKyAgKiAgICAgICAgIG9mIHN0cnVjdHVyZSAiQURDX0FuYWxvZ1dER0NvbmZUeXBlRGVmIiBvbiB0aGUgZmx5LCB3aXRob3V0IHJlc2V0aW5nIAorICAqICAgICAgICAgdGhlIEFEQy4KKyAgKiAgICAgICAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLgorICAqICAgICAgICAgRm9yIHBhcmFtZXRlcnMgY29uc3RyYWludHMsIHNlZSBjb21tZW50cyBvZiBzdHJ1Y3R1cmUgCisgICogICAgICAgICAiQURDX0FuYWxvZ1dER0NvbmZUeXBlRGVmIi4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEBwYXJhbSAgQW5hbG9nV0RHQ29uZmlnIFN0cnVjdHVyZSBvZiBBREMgYW5hbG9nIHdhdGNoZG9nIGNvbmZpZ3VyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfQW5hbG9nV0RHQ29uZmlnKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCBBRENfQW5hbG9nV0RHQ29uZlR5cGVEZWYqIEFuYWxvZ1dER0NvbmZpZykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXMgPSBIQUxfT0s7CisgIAorICB1aW50MzJfdCB0bXBBV0RIaWdoVGhyZXNob2xkU2hpZnRlZDsKKyAgdWludDMyX3QgdG1wQVdETG93VGhyZXNob2xkU2hpZnRlZDsKKyAgCisgIHVpbnQzMl90IHRtcEFEQ0ZsYWdBV0Qyb3JBV0QzOworICB1aW50MzJfdCB0bXBBRENJVEFXRDJvckFXRDM7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FOQUxPR19XQVRDSERPR19OVU1CRVIoQW5hbG9nV0RHQ29uZmlnLT5XYXRjaGRvZ051bWJlcikpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FOQUxPR19XQVRDSERPR19NT0RFKEFuYWxvZ1dER0NvbmZpZy0+V2F0Y2hkb2dNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKEFuYWxvZ1dER0NvbmZpZy0+SVRNb2RlKSk7CisKKyAgLyogVmVyaWZ5IGlmIHRocmVzaG9sZCBpcyB3aXRoaW4gdGhlIHNlbGVjdGVkIEFEQyByZXNvbHV0aW9uICovCisgIGFzc2VydF9wYXJhbShJU19BRENfUkFOR0UoQURDX0dFVF9SRVNPTFVUSU9OKGhhZGMpLCBBbmFsb2dXREdDb25maWctPkhpZ2hUaHJlc2hvbGQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19SQU5HRShBRENfR0VUX1JFU09MVVRJT04oaGFkYyksIEFuYWxvZ1dER0NvbmZpZy0+TG93VGhyZXNob2xkKSk7CisKKyAgaWYoKEFuYWxvZ1dER0NvbmZpZy0+V2F0Y2hkb2dNb2RlID09IEFEQ19BTkFMT0dXQVRDSERPR19TSU5HTEVfUkVHKSAgICAgfHwKKyAgICAgKEFuYWxvZ1dER0NvbmZpZy0+V2F0Y2hkb2dNb2RlID09IEFEQ19BTkFMT0dXQVRDSERPR19TSU5HTEVfSU5KRUMpICAgfHwKKyAgICAgKEFuYWxvZ1dER0NvbmZpZy0+V2F0Y2hkb2dNb2RlID09IEFEQ19BTkFMT0dXQVRDSERPR19TSU5HTEVfUkVHSU5KRUMpICApCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfQURDX0NIQU5ORUwoQW5hbG9nV0RHQ29uZmlnLT5DaGFubmVsKSk7CisgIH0KKyAgCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGFkYyk7CisgIAorICAvKiBQYXJhbWV0ZXJzIHVwZGF0ZSBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSB1cGRhdGVkIHdoZW4gQURDIGlzIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCAgICovCisgIC8qIGNvbnZlcnNpb24gb24gZ29pbmcgb24gcmVndWxhciBhbmQgaW5qZWN0ZWQgZ3JvdXBzOiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBBbmFsb2cgd2F0Y2hkb2cgY2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIC0gQW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmIChBRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX1JFR1VMQVJfSU5KRUNURUQoaGFkYykgPT0gUkVTRVQpCisgIHsKKyAgCisgICAgLyogQW5hbG9nIHdhdGNoZG9ncyBjb25maWd1cmF0aW9uICovCisgICAgaWYoQW5hbG9nV0RHQ29uZmlnLT5XYXRjaGRvZ051bWJlciA9PSBBRENfQU5BTE9HV0FUQ0hET0dfMSkKKyAgICB7CisgICAgICAvKiBDb25maWd1cmF0aW9uIG9mIGFuYWxvZyB3YXRjaGRvZzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogIC0gU2V0IHRoZSBhbmFsb2cgd2F0Y2hkb2cgZW5hYmxlIG1vZGU6IHJlZ3VsYXIgYW5kL29yIGluamVjdGVkICAgICAgKi8KKyAgICAgIC8qICAgIGdyb3Vwcywgb25lIG9yIG92ZXJhbGwgZ3JvdXAgb2YgY2hhbm5lbHMuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAgLSBTZXQgdGhlIEFuYWxvZyB3YXRjaGRvZyBjaGFubmVsIChpcyBub3QgdXNlZCBpZiB3YXRjaGRvZyAgICAgICAgICAqLworICAgICAgLyogICAgbW9kZSAiYWxsIGNoYW5uZWxzIjogQURDX0NGR1JfQVdEMVNHTD0wVSkuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5DRkdSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0FXRDFTR0wgfAorICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9KQVdEMUVOIHwKKyAgICAgICAgICAgICAgICAgQURDX0NGR1JfQVdEMUVOICB8CisgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0FXRDFDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIEFuYWxvZ1dER0NvbmZpZy0+V2F0Y2hkb2dNb2RlICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgQURDX0NGR1JfQVdEMUNIX1NISUZUKEFuYWxvZ1dER0NvbmZpZy0+Q2hhbm5lbCkgICApOworCisgICAgICAvKiBTaGlmdCB0aGUgb2Zmc2V0IGluIGZ1bmN0aW9uIG9mIHRoZSBzZWxlY3RlZCBBREMgcmVzb2x1dGlvbjogICAgICAgICAqLworICAgICAgLyogVGhyZXNob2xkcyBoYXZlIHRvIGJlIGxlZnQtYWxpZ25lZCBvbiBiaXQgMTFVLCB0aGUgTFNCIChyaWdodCBiaXRzKSAgICovCisgICAgICAvKiBhcmUgc2V0IHRvIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAKKyAgICAgIHRtcEFXREhpZ2hUaHJlc2hvbGRTaGlmdGVkID0gQURDX0FXRDFUSFJFU0hPTERfU0hJRlRfUkVTT0xVVElPTihoYWRjLCBBbmFsb2dXREdDb25maWctPkhpZ2hUaHJlc2hvbGQpOworICAgICAgdG1wQVdETG93VGhyZXNob2xkU2hpZnRlZCAgPSBBRENfQVdEMVRIUkVTSE9MRF9TSElGVF9SRVNPTFVUSU9OKGhhZGMsIEFuYWxvZ1dER0NvbmZpZy0+TG93VGhyZXNob2xkKTsKKyAgICAgIAorICAgICAgLyogU2V0IHRoZSBoaWdoIGFuZCBsb3cgdGhyZXNob2xkcyAqLworICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+VFIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIEFEQ19UUjFfSFQxIHwKKyAgICAgICAgICAgICAgICAgQURDX1RSMV9MVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICBBRENfVFJYX0hJR0hUSFJFU0hPTEQodG1wQVdESGlnaFRocmVzaG9sZFNoaWZ0ZWQpIHwKKyAgICAgICAgICAgICAgICAgdG1wQVdETG93VGhyZXNob2xkU2hpZnRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAKKyAgICAgIC8qIENsZWFyIHRoZSBBREMgQW5hbG9nIHdhdGNoZG9nIGZsYWcgKGluIGNhc2Ugb2YgbGVmdCBlbmFibGVkIGJ5ICAgICAgICovCisgICAgICAvKiBwcmV2aW91cyBBREMgb3BlcmF0aW9ucykgdG8gYmUgcmVhZHkgdG8gdXNlIGZvciBIQUxfQURDX0lSUUhhbmRsZXIoKSAqLworICAgICAgLyogb3IgSEFMX0FEQ19Qb2xsRm9yRXZlbnQoKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19JVF9BV0QxKTsKKyAgICAgIAorICAgICAgLyogQ29uZmlndXJlIEFEQyBBbmFsb2cgd2F0Y2hkb2cgaW50ZXJydXB0ICovCisgICAgICBpZihBbmFsb2dXREdDb25maWctPklUTW9kZSA9PSBFTkFCTEUpCisgICAgICB7CisgICAgICAgIC8qIEVuYWJsZSB0aGUgQURDIEFuYWxvZyB3YXRjaGRvZyBpbnRlcnJ1cHQgKi8KKyAgICAgICAgX19IQUxfQURDX0VOQUJMRV9JVChoYWRjLCBBRENfSVRfQVdEMSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIEFEQyBBbmFsb2cgd2F0Y2hkb2cgaW50ZXJydXB0ICovCisgICAgICAgIF9fSEFMX0FEQ19ESVNBQkxFX0lUKGhhZGMsIEFEQ19JVF9BV0QxKTsKKyAgICAgIH0KKyAgICAgIAorICAgIH0KKyAgICAvKiBDYXNlIG9mIEFEQ19BTkFMT0dXQVRDSERPR18yIGFuZCBBRENfQU5BTE9HV0FUQ0hET0dfMyAqLworICAgIGVsc2UKKyAgICB7CisgICAgLyogU2hpZnQgdGhlIHRocmVzaG9sZCBpbiBmdW5jdGlvbiBvZiB0aGUgc2VsZWN0ZWQgQURDIHJlc29sdXRpb24gKi8KKyAgICAvKiBoYXZlIHRvIGJlIGxlZnQtYWxpZ25lZCBvbiBiaXQgN1UsIHRoZSBMU0IgKHJpZ2h0IGJpdHMpIGFyZSBzZXQgdG8gMCAgICAqLworICAgICAgdG1wQVdESGlnaFRocmVzaG9sZFNoaWZ0ZWQgPSBBRENfQVdEMjNUSFJFU0hPTERfU0hJRlRfUkVTT0xVVElPTihoYWRjLCBBbmFsb2dXREdDb25maWctPkhpZ2hUaHJlc2hvbGQpOworICAgICAgdG1wQVdETG93VGhyZXNob2xkU2hpZnRlZCAgPSBBRENfQVdEMjNUSFJFU0hPTERfU0hJRlRfUkVTT0xVVElPTihoYWRjLCBBbmFsb2dXREdDb25maWctPkxvd1RocmVzaG9sZCk7CisKKyAgICAgIGlmIChBbmFsb2dXREdDb25maWctPldhdGNoZG9nTnVtYmVyID09IEFEQ19BTkFMT0dXQVRDSERPR18yKQorICAgICAgeworICAgICAgICAvKiBTZXQgdGhlIEFuYWxvZyB3YXRjaGRvZyBjaGFubmVsIG9yIGdyb3VwIG9mIGNoYW5uZWxzLiBUaGlzIGFsc28gICAgKi8KKyAgICAgICAgLyogZW5hYmxlcyB0aGUgd2F0Y2hkb2cuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qIE5vdGU6IENvbmRpdGlvbmFsIHJlZ2lzdGVyIHJlc2V0LCBiZWNhdXNlIHNldmVyYWwgY2hhbm5lbHMgY2FuIGJlICAqLworICAgICAgICAvKiAgICAgICBzZXQgYnkgc3VjY2Vzc2l2ZSBjYWxscyBvZiB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgaWYgKEFuYWxvZ1dER0NvbmZpZy0+V2F0Y2hkb2dNb2RlICE9IEFEQ19BTkFMT0dXQVRDSERPR19OT05FKSAKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCB0aGUgaGlnaCBhbmQgbG93IHRocmVzaG9sZHMgKi8KKyAgICAgICAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5UUjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgICAgIEFEQ19UUjJfSFQyIHwKKyAgICAgICAgICAgICAgICAgICAgIEFEQ19UUjJfTFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgICAgIEFEQ19UUlhfSElHSFRIUkVTSE9MRCh0bXBBV0RIaWdoVGhyZXNob2xkU2hpZnRlZCkgfAorICAgICAgICAgICAgICAgICAgICAgdG1wQVdETG93VGhyZXNob2xkU2hpZnRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgCisgICAgICAgICAgU0VUX0JJVChoYWRjLT5JbnN0YW5jZS0+QVdEMkNSLCBBRENfQ0ZHUl9BV0QyM0NSKEFuYWxvZ1dER0NvbmZpZy0+Q2hhbm5lbCkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+VFIyLCBBRENfVFIyX0hUMiB8IEFEQ19UUjJfTFQyKTsKKyAgICAgICAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkFXRDJDUiwgQURDX0FXRDJDUl9BV0QyQ0gpOworICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgIC8qIFNldCB0ZW1wb3JhcnkgdmFyaWFibGUgdG8gZmxhZyBhbmQgSVQgb2YgQVdEMiBvciBBV0QzIGZvciBmdXJ0aGVyICAqLworICAgICAgICAvKiBzZXR0aW5ncy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgdG1wQURDRmxhZ0FXRDJvckFXRDMgPSBBRENfRkxBR19BV0QyOworICAgICAgICB0bXBBRENJVEFXRDJvckFXRDMgPSBBRENfSVRfQVdEMjsKKyAgICAgIH0KKyAgICAgIC8qIChBbmFsb2dXREdDb25maWctPldhdGNoZG9nTnVtYmVyID09IEFEQ19BTkFMT0dXQVRDSERPR18zKSAqLworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBTZXQgdGhlIEFuYWxvZyB3YXRjaGRvZyBjaGFubmVsIG9yIGdyb3VwIG9mIGNoYW5uZWxzLiBUaGlzIGFsc28gICAgKi8KKyAgICAgICAgLyogZW5hYmxlcyB0aGUgd2F0Y2hkb2cuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qIE5vdGU6IENvbmRpdGlvbm5hbCByZWdpc3RlciByZXNldCwgYmVjYXVzZSBzZXZlcmFsIGNoYW5uZWxzIGNhbiBiZSAqLworICAgICAgICAvKiAgICAgICBzZXQgYnkgc3VjY2Vzc2l2ZSBjYWxscyBvZiB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgaWYgKEFuYWxvZ1dER0NvbmZpZy0+V2F0Y2hkb2dNb2RlICE9IEFEQ19BTkFMT0dXQVRDSERPR19OT05FKSAKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCB0aGUgaGlnaCBhbmQgbG93IHRocmVzaG9sZHMgKi8KKyAgICAgICAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5UUjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgICAgIEFEQ19UUjNfSFQzIHwKKyAgICAgICAgICAgICAgICAgICAgIEFEQ19UUjNfTFQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgICAgIEFEQ19UUlhfSElHSFRIUkVTSE9MRCh0bXBBV0RIaWdoVGhyZXNob2xkU2hpZnRlZCkgfAorICAgICAgICAgICAgICAgICAgICAgdG1wQVdETG93VGhyZXNob2xkU2hpZnRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgCisgICAgICAgICAgU0VUX0JJVChoYWRjLT5JbnN0YW5jZS0+QVdEM0NSLCBBRENfQ0ZHUl9BV0QyM0NSKEFuYWxvZ1dER0NvbmZpZy0+Q2hhbm5lbCkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+VFIzLCBBRENfVFIzX0hUMyB8IEFEQ19UUjNfTFQzKTsKKyAgICAgICAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkFXRDNDUiwgQURDX0FXRDNDUl9BV0QzQ0gpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBTZXQgdGVtcG9yYXJ5IHZhcmlhYmxlIHRvIGZsYWcgYW5kIElUIG9mIEFXRDIgb3IgQVdEMyBmb3IgZnVydGhlciAgKi8KKyAgICAgICAgLyogc2V0dGluZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIHRtcEFEQ0ZsYWdBV0Qyb3JBV0QzID0gQURDX0ZMQUdfQVdEMzsKKyAgICAgICAgdG1wQURDSVRBV0Qyb3JBV0QzID0gQURDX0lUX0FXRDM7CisgICAgICB9CisKKyAgICAgIC8qIENsZWFyIHRoZSBBREMgQW5hbG9nIHdhdGNoZG9nIGZsYWcgKGluIGNhc2Ugb2YgbGVmdCBlbmFibGVkIGJ5ICAgICAgICovCisgICAgICAvKiBwcmV2aW91cyBBREMgb3BlcmF0aW9ucykgdG8gYmUgcmVhZHkgdG8gdXNlIGZvciBIQUxfQURDX0lSUUhhbmRsZXIoKSAqLworICAgICAgLyogb3IgSEFMX0FEQ19Qb2xsRm9yRXZlbnQoKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIHRtcEFEQ0ZsYWdBV0Qyb3JBV0QzKTsKKworICAgICAgLyogQ29uZmlndXJlIEFEQyBBbmFsb2cgd2F0Y2hkb2cgaW50ZXJydXB0ICovCisgICAgICBpZihBbmFsb2dXREdDb25maWctPklUTW9kZSA9PSBFTkFCTEUpCisgICAgICB7CisgICAgICAgIF9fSEFMX0FEQ19FTkFCTEVfSVQoaGFkYywgdG1wQURDSVRBV0Qyb3JBV0QzKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgdG1wQURDSVRBV0Qyb3JBV0QzKTsKKyAgICAgIH0KKyAgICB9CisgIAorICB9CisgIC8qIElmIGEgY29udmVyc2lvbiBpcyBvbiBnb2luZyBvbiByZWd1bGFyIG9yIGluamVjdGVkIGdyb3Vwcywgbm8gdXBkYXRlICAgICAqLworICAvKiBjb3VsZCBiZSBkb25lIG9uIG5laXRoZXIgb2YgdGhlIEFXRCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBwYXJhbWV0ZXJzLiAgKi8KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOworICAgIAorICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIAorICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgYW5hbG9nIHdhdGNoZG9nLgorICAqIEBub3RlICAgQW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgY2FuIGJlIG1vZGlmaWVkIHdoaWxlIEFEQyBjb252ZXJzaW9uCisgICogICAgICAgICBpcyBvbiBnb2luZy4KKyAgKiAgICAgICAgIEluIHRoaXMgY2FzZSwgc29tZSBjb25zdHJhaW50cyBtdXN0IGJlIHRha2VuIGludG8gYWNjb3VudDoKKyAgKiAgICAgICAgIHRoZSBwcm9ncmFtbWVkIHRocmVzaG9sZCB2YWx1ZXMgYXJlIGVmZmVjdGl2ZSBmcm9tIHRoZSBuZXh0CisgICogICAgICAgICBBREMgRU9DIChlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uKS4KKyAgKiAgICAgICAgIENvbnNpZGVyaW5nIHRoYXQgcmVnaXN0ZXJzIHdyaXRlIGRlbGF5IG1heSBoYXBwZW4gZHVlIHRvCisgICogICAgICAgICBidXMgYWN0aXZpdHksIHRoaXMgbWlnaHQgY2F1c2UgYW4gdW5jZXJ0YWludHkgb24gdGhlCisgICogICAgICAgICBlZmZlY3RpdmUgdGltaW5nIG9mIHRoZSBuZXcgcHJvZ3JhbW1lZCB0aHJlc2hvbGQgdmFsdWVzLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHBhcmFtICBBbmFsb2dXREdDb25maWcgU3RydWN0dXJlIG9mIEFEQyBhbmFsb2cgd2F0Y2hkb2cgY29uZmlndXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19BbmFsb2dXREdDb25maWcoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMsIEFEQ19BbmFsb2dXREdDb25mVHlwZURlZiogQW5hbG9nV0RHQ29uZmlnKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FOQUxPR19XQVRDSERPR19NT0RFKEFuYWxvZ1dER0NvbmZpZy0+V2F0Y2hkb2dNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKEFuYWxvZ1dER0NvbmZpZy0+SVRNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfUkFOR0UoQW5hbG9nV0RHQ29uZmlnLT5IaWdoVGhyZXNob2xkKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfUkFOR0UoQW5hbG9nV0RHQ29uZmlnLT5Mb3dUaHJlc2hvbGQpKTsKKyAgCisgIGlmKChBbmFsb2dXREdDb25maWctPldhdGNoZG9nTW9kZSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX1JFRykgICAgIHx8CisgICAgIChBbmFsb2dXREdDb25maWctPldhdGNoZG9nTW9kZSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX0lOSkVDKSAgIHx8CisgICAgIChBbmFsb2dXREdDb25maWctPldhdGNoZG9nTW9kZSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX1JFR0lOSkVDKSAgKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0FEQ19DSEFOTkVMKEFuYWxvZ1dER0NvbmZpZy0+Q2hhbm5lbCkpOworICB9CisgIAorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhhZGMpOworICAKKyAgLyogQW5hbG9nIHdhdGNoZG9nIGNvbmZpZ3VyYXRpb24gKi8KKworICAvKiBDb25maWd1cmUgQURDIEFuYWxvZyB3YXRjaGRvZyBpbnRlcnJ1cHQgKi8KKyAgaWYoQW5hbG9nV0RHQ29uZmlnLT5JVE1vZGUgPT0gRU5BQkxFKQorICB7CisgICAgLyogRW5hYmxlIHRoZSBBREMgQW5hbG9nIHdhdGNoZG9nIGludGVycnVwdCAqLworICAgIF9fSEFMX0FEQ19FTkFCTEVfSVQoaGFkYywgQURDX0lUX0FXRCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgQURDIEFuYWxvZyB3YXRjaGRvZyBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9BRENfRElTQUJMRV9JVChoYWRjLCBBRENfSVRfQVdEKTsKKyAgfQorICAKKyAgLyogQ29uZmlndXJhdGlvbiBvZiBhbmFsb2cgd2F0Y2hkb2c6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIFNldCB0aGUgYW5hbG9nIHdhdGNoZG9nIGVuYWJsZSBtb2RlOiByZWd1bGFyIGFuZC9vciBpbmplY3RlZCBncm91cHMsICAqLworICAvKiAgICBvbmUgb3IgYWxsIGNoYW5uZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIC0gU2V0IHRoZSBBbmFsb2cgd2F0Y2hkb2cgY2hhbm5lbCAoaXMgbm90IHVzZWQgaWYgd2F0Y2hkb2cgICAgICAgICAgICAgICovCisgIC8qICAgIG1vZGUgImFsbCBjaGFubmVscyI6IEFEQ19DRkdSX0FXRDFTR0w9MFUpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+Q1IxICAgICAgICAgICAgLAorICAgICAgICAgICAgIEFEQ19DUjFfQVdEU0dMIHwKKyAgICAgICAgICAgICBBRENfQ1IxX0pBV0RFTiB8CisgICAgICAgICAgICAgQURDX0NSMV9BV0RFTiAgfAorICAgICAgICAgICAgIEFEQ19DUjFfQVdEQ0ggICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgQW5hbG9nV0RHQ29uZmlnLT5XYXRjaGRvZ01vZGUgfAorICAgICAgICAgICAgIEFuYWxvZ1dER0NvbmZpZy0+Q2hhbm5lbCAgICAgICApOworICAKKyAgLyogU2V0IHRoZSBoaWdoIHRocmVzaG9sZCAqLworICBXUklURV9SRUcoaGFkYy0+SW5zdGFuY2UtPkhUUiwgQW5hbG9nV0RHQ29uZmlnLT5IaWdoVGhyZXNob2xkKTsKKyAgCisgIC8qIFNldCB0aGUgbG93IHRocmVzaG9sZCAqLworICBXUklURV9SRUcoaGFkYy0+SW5zdGFuY2UtPkxUUiwgQW5hbG9nV0RHQ29uZmlnLT5Mb3dUaHJlc2hvbGQpOworCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhhZGMpOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorI2VuZGlmIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICovCisKKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEFEQyBtdWx0aW1vZGUgYW5kIGNvbmZpZ3VyZSBtdWx0aW1vZGUgcGFyYW1ldGVycworICAqIEBub3RlICAgUG9zc2liaWxpdHkgdG8gdXBkYXRlIHBhcmFtZXRlcnMgb24gdGhlIGZseToKKyAgKiAgICAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgbXVsdGltb2RlIHBhcmFtZXRlcnMsIGZvbGxvd2luZyAgCisgICogICAgICAgICBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlY29uZmlndXJlIHNvbWUgcGFyYW1ldGVycyAKKyAgKiAgICAgICAgIG9mIHN0cnVjdHVyZSAiQURDX011bHRpTW9kZVR5cGVEZWYiIG9uIHRoZSBmbHksIHdpdGhvdXQgcmVzZXRpbmcgCisgICogICAgICAgICB0aGUgQURDcyAoYm90aCBBRENzIG9mIHRoZSBjb21tb24gZ3JvdXApLgorICAqICAgICAgICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGUuCisgICogICAgICAgICBGb3IgcGFyYW1ldGVycyBjb25zdHJhaW50cywgc2VlIGNvbW1lbnRzIG9mIHN0cnVjdHVyZSAKKyAgKiAgICAgICAgICJBRENfTXVsdGlNb2RlVHlwZURlZiIuCisgICogQG5vdGUgICBUbyBjaGFuZ2UgYmFjayBjb25maWd1cmF0aW9uIGZyb20gbXVsdGltb2RlIHRvIHNpbmdsZSBtb2RlLCBBREMgbXVzdAorICAqICAgICAgICAgYmUgcmVzZXQgKHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfSW5pdCgpICkuCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gIG11bHRpbW9kZSBTdHJ1Y3R1cmUgb2YgQURDIG11bHRpbW9kZSBjb25maWd1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfTXVsdGlNb2RlQ29uZmlnQ2hhbm5lbChBRENfSGFuZGxlVHlwZURlZiogaGFkYywgQURDX011bHRpTW9kZVR5cGVEZWYqIG11bHRpbW9kZSkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXMgPSBIQUxfT0s7CisgIEFEQ19Db21tb25fVHlwZURlZiAqdG1wQURDX0NvbW1vbjsKKyAgQURDX0hhbmRsZVR5cGVEZWYgdG1waGFkY1NoYXJpbmdTYW1lQ29tbW9uUmVnaXN0ZXI7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX01VTFRJTU9ERV9NQVNURVJfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19NT0RFKG11bHRpbW9kZS0+TW9kZSkpOworICBpZihtdWx0aW1vZGUtPk1vZGUgIT0gQURDX01PREVfSU5ERVBFTkRFTlQpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfQURDX0RNQV9BQ0NFU1NfTU9ERShtdWx0aW1vZGUtPkRNQUFjY2Vzc01vZGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfQURDX1NBTVBMSU5HX0RFTEFZKG11bHRpbW9kZS0+VHdvU2FtcGxpbmdEZWxheSkpOworICB9CisgIAorICAvKiBTZXQgaGFuZGxlIG9mIHRoZSBvdGhlciBBREMgc2hhcmluZyB0aGUgc2FtZSBjb21tb24gcmVnaXN0ZXIgICAgICAgICAgICAgKi8KKyAgQURDX0NPTU1PTl9BRENfT1RIRVIoaGFkYywgJnRtcGhhZGNTaGFyaW5nU2FtZUNvbW1vblJlZ2lzdGVyKTsKKyAgaWYgKHRtcGhhZGNTaGFyaW5nU2FtZUNvbW1vblJlZ2lzdGVyLkluc3RhbmNlID09IE5VTEwpCisgIHsKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGFkYyk7CisgIAorICAvKiBQYXJhbWV0ZXJzIHVwZGF0ZSBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSB1cGRhdGVkIHdoZW4gQURDIGlzIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCAgICovCisgIC8qIGNvbnZlcnNpb24gb24gZ29pbmcgb24gcmVndWxhciBncm91cDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBNdWx0aW1vZGUgRE1BIGNvbmZpZ3VyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIC0gTXVsdGltb2RlIERNQSBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmICggKEFEQ19JU19DT05WRVJTSU9OX09OR09JTkdfUkVHVUxBUihoYWRjKSA9PSBSRVNFVCkgCisgICAgJiYgKEFEQ19JU19DT05WRVJTSU9OX09OR09JTkdfUkVHVUxBUigmdG1waGFkY1NoYXJpbmdTYW1lQ29tbW9uUmVnaXN0ZXIpID09IFJFU0VUKSApCisgIHsKKyAgICAvKiBQb2ludGVyIHRvIHRoZSBjb21tb24gY29udHJvbCByZWdpc3RlciB0byB3aGljaCBpcyBiZWxvbmdpbmcgaGFkYyAgICAgICovCisgICAgLyogKERlcGVuZGluZyBvbiBTVE0zMkYzIHByb2R1Y3QsIHRoZXJlIG1heSBoYXZlIHVwIHRvIDQgQURDIGFuZCAyIGNvbW1vbiAqLworICAgIC8qIGNvbnRyb2wgcmVnaXN0ZXJzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB0bXBBRENfQ29tbW9uID0gQURDX0NPTU1PTl9SRUdJU1RFUihoYWRjKTsKKyAgICAKKyAgICAvKiBJZiBtdWx0aW1vZGUgaXMgc2VsZWN0ZWQsIGNvbmZpZ3VyZSBhbGwgbXVsdGltb2RlIHBhcmFtYXRlcnMuICAgICAgICAgICovCisgICAgLyogT3RoZXJ3aXNlLCByZXNldCBtdWx0aW1vZGUgcGFyYW1ldGVycyAoY2FuIGJlIHVzZWQgaW4gY2FzZSBvZiAgICAgICAgICAqLworICAgIC8qIHRyYW5zaXRpb24gZnJvbSBtdWx0aW1vZGUgdG8gaW5kZXBlbmRlbnQgbW9kZSkuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZihtdWx0aW1vZGUtPk1vZGUgIT0gQURDX01PREVfSU5ERVBFTkRFTlQpCisgICAgeworICAgICAgLyogQ29uZmlndXJhdGlvbiBvZiBBREMgY29tbW9uIGdyb3VwIEFEQzEmQURDMiwgQURDMyZBREM0IGlmIGF2YWlsYWJsZSAgICAqLworICAgICAgLyogKEFEQzIsIEFEQzMsIEFEQzQgYXZhaWxhYmlsaXR5IGRlcGVuZHMgb24gU1RNMzIgcHJvZHVjdCkgICAgICAgICAgICAgICAqLworICAgICAgLyogIC0gRE1BIGFjY2VzcyBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgTU9ESUZZX1JFRyh0bXBBRENfQ29tbW9uLT5DQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIEFEQ19DQ1JfTURNQSAgfAorICAgICAgICAgICAgICAgICBBRENfQ0NSX0RNQUNGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIG11bHRpbW9kZS0+RE1BQWNjZXNzTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICBBRENfQ0NSX01VTFRJX0RNQUNPTlRSRVEoaGFkYy0+SW5pdC5ETUFDb250aW51b3VzUmVxdWVzdHMpICAgKTsKKyAgICAgIAorICAgICAgLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSB1cGRhdGVkIG9ubHkgd2hlbiBBREMgaXMgZGlzYWJsZWQ6ICAgICAgICAgICAgICAqLworICAgICAgLyogIC0gTXVsdGltb2RlIG1vZGUgc2VsZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogIC0gU2V0IGRlbGF5IGJldHdlZW4gdHdvIHNhbXBsaW5nIHBoYXNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogICAgTm90ZTogRGVsYXkgcmFuZ2UgZGVwZW5kcyBvbiBzZWxlY3RlZCByZXNvbHV0aW9uOiAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogICAgICBmcm9tIDEgdG8gMTIgY2xvY2sgY3ljbGVzIGZvciAxMiBiaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogICAgICBmcm9tIDEgdG8gMTAgY2xvY2sgY3ljbGVzIGZvciAxMCBiaXRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogICAgICBmcm9tIDEgdG8gOCBjbG9jayBjeWNsZXMgZm9yIDggYml0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogICAgICBmcm9tIDEgdG8gNiBjbG9jayBjeWNsZXMgZm9yIDYgYml0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogICAgSWYgYSBoaWdoZXIgZGVsYXkgaXMgc2VsZWN0ZWQsIGl0IHdpbGwgYmUgY2xhbXBlZCB0byBtYXhpbXVtIGRlbGF5ICAqLworICAgICAgLyogICAgcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogTm90ZTogSWYgQURDIGlzIG5vdCBpbiB0aGUgYXBwcm9wcmlhdGUgc3RhdGUgdG8gbW9kaWZ5IHRoZXNlICAgICAgICAgICAqLworICAgICAgLyogICAgICAgcGFyYW1ldGVycywgdGhlaXIgc2V0dGluZyBpcyBieXBhc3NlZCB3aXRob3V0IGVycm9yIHJlcG9ydGluZyAgICAqLworICAgICAgLyogICAgICAgKGFzIGl0IGNhbiBiZSB0aGUgZXhwZWN0ZWQgYmVoYXZpb3VyIGluIGNhc2Ugb2YgaW50ZW5kZWQgYWN0aW9uICAqLworICAgICAgLyogICAgICAgdG8gdXBkYXRlIHBhcmFtZXRlciBhYm92ZSAod2hpY2ggZnVsZmlsbHMgdGhlIEFEQyBzdGF0ZSAgICAgICAgICAqLworICAgICAgLyogICAgICAgY29uZGl0aW9uOiBubyBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIGdyb3VwIHJlZ3VsYXIpICAgICAgICAgICAgICAqLworICAgICAgLyogICAgICAgb24gdGhlIGZseSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgaWYgKChBRENfSVNfRU5BQkxFKGhhZGMpID09IFJFU0VUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgKEFEQ19JU19FTkFCTEUoJnRtcGhhZGNTaGFyaW5nU2FtZUNvbW1vblJlZ2lzdGVyKSA9PSBSRVNFVCkgICApCisgICAgICB7CisgICAgICAgIE1PRElGWV9SRUcodG1wQURDX0NvbW1vbi0+Q0NSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAgIEFEQ19DQ1JfTVVMVEkgfAorICAgICAgICAgICAgICAgICAgIEFEQ19DQ1JfREVMQVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgICBtdWx0aW1vZGUtPk1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICBtdWx0aW1vZGUtPlR3b1NhbXBsaW5nRGVsYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSAvKiBBRENfTU9ERV9JTkRFUEVOREVOVCAqLworICAgIHsKKyAgICAgIENMRUFSX0JJVCh0bXBBRENfQ29tbW9uLT5DQ1IsIEFEQ19DQ1JfTURNQSB8IEFEQ19DQ1JfRE1BQ0ZHKTsKKyAgICAgIAorICAgICAgLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSB1cGRhdGVkIG9ubHkgd2hlbiBBREMgaXMgZGlzYWJsZWQ6ICAgICAgICAgICAgICAgICovCisgICAgICAvKiAgLSBNdWx0aW1vZGUgbW9kZSBzZWxlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qICAtIE11bHRpbW9kZSBkZWxheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgaWYgKChBRENfSVNfRU5BQkxFKGhhZGMpID09IFJFU0VUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgKEFEQ19JU19FTkFCTEUoJnRtcGhhZGNTaGFyaW5nU2FtZUNvbW1vblJlZ2lzdGVyKSA9PSBSRVNFVCkgICApCisgICAgICB7CisgICAgICAgIENMRUFSX0JJVCh0bXBBRENfQ29tbW9uLT5DQ1IsIEFEQ19DQ1JfTVVMVEkgfCBBRENfQ0NSX0RFTEFZKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogSWYgb25lIG9mIHRoZSBBREMgc2hhcmluZyB0aGUgc2FtZSBjb21tb24gZ3JvdXAgaXMgZW5hYmxlZCwgbm8gdXBkYXRlICAgICovCisgIC8qIGNvdWxkIGJlIGRvbmUgb24gbmVpdGhlciBvZiB0aGUgbXVsdGltb2RlIHN0cnVjdHVyZSBwYXJhbWV0ZXJzLiAgICAgICAgICAqLworICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0NPTkZJRyk7CisgICAgCisgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgICAKKyAgICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30gCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMyOHh4IHx8IFNUTTMyRjMzNHg4ICAgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisgIAorLyoqIEBkZWZncm91cCBBRENFeF9Qcml2YXRlX0Z1bmN0aW9ucyBBRENFeCBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjay4gCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEFEQ19ETUFDb252Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgLyogUmV0cmlldmUgQURDIGhhbmRsZSBjb3JyZXNwb25kaW5nIHRvIGN1cnJlbnQgRE1BIGhhbmRsZSAqLworICBBRENfSGFuZGxlVHlwZURlZiogaGFkYyA9ICggQURDX0hhbmRsZVR5cGVEZWYqICkoKERNQV9IYW5kbGVUeXBlRGVmKiApaGRtYSktPlBhcmVudDsKKyAKKyAgLyogVXBkYXRlIHN0YXRlIG1hY2hpbmUgb24gY29udmVyc2lvbiBzdGF0dXMgaWYgbm90IGluIGVycm9yIHN0YXRlICovCisgIGlmIChIQUxfSVNfQklUX0NMUihoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCB8IEhBTF9BRENfU1RBVEVfRVJST1JfRE1BKSkKKyAgeworICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSAqLworICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX0VPQyk7CisgICAgCisgICAgLyogRGV0ZXJtaW5lIHdoZXRoZXIgYW55IGZ1cnRoZXIgY29udmVyc2lvbiB1cGNvbWluZyBvbiBncm91cCByZWd1bGFyICAgICAqLworICAgIC8qIGJ5IGV4dGVybmFsIHRyaWdnZXIsIGNvbnRpbnVvdXMgbW9kZSBvciBzY2FuIHNlcXVlbmNlIG9uIGdvaW5nLiAgICAgICAgKi8KKyAgICAvKiBOb3RlOiBPbiBTVE0zMkYzIGRldmljZXMsIGluIGNhc2Ugb2Ygc2VxdWVuY2VyIGVuYWJsZWQgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgKHNldmVyYWwgcmFua3Mgc2VsZWN0ZWQpLCBlbmQgb2YgY29udmVyc2lvbiBmbGFnIGlzIHJhaXNlZCAgICAgICAqLworICAgIC8qICAgICAgIGF0IHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZihBRENfSVNfU09GVFdBUkVfU1RBUlRfUkVHVUxBUihoYWRjKSAgICAgICAgJiYgCisgICAgICAgKGhhZGMtPkluaXQuQ29udGludW91c0NvbnZNb2RlID09IERJU0FCTEUpICAgKQorICAgIHsKKyAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICAgIENMRUFSX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSk7ICAgCisgICAgICAKKyAgICAgIGlmIChIQUxfSVNfQklUX0NMUihoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSkpCisgICAgICB7CisgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiBDb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrKGhhZGMpOyAKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDYWxsIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgIGhhZGMtPkRNQV9IYW5kbGUtPlhmZXJFcnJvckNhbGxiYWNrKGhkbWEpOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIGhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2suIAorICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBBRENfRE1BSGFsZkNvbnZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSAgIAoreworICAvKiBSZXRyaWV2ZSBBREMgaGFuZGxlIGNvcnJlc3BvbmRpbmcgdG8gY3VycmVudCBETUEgaGFuZGxlICovCisgIEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjID0gKCBBRENfSGFuZGxlVHlwZURlZiogKSgoRE1BX0hhbmRsZVR5cGVEZWYqICloZG1hKS0+UGFyZW50OworICAKKyAgLyogSGFsZiBjb252ZXJzaW9uIGNhbGxiYWNrICovCisgIEhBTF9BRENfQ29udkhhbGZDcGx0Q2FsbGJhY2soaGFkYyk7IAorfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBlcnJvciBjYWxsYmFjayAKKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgQURDX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSAgIAoreworICAvKiBSZXRyaWV2ZSBBREMgaGFuZGxlIGNvcnJlc3BvbmRpbmcgdG8gY3VycmVudCBETUEgaGFuZGxlICovCisgIEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjID0gKCBBRENfSGFuZGxlVHlwZURlZiogKSgoRE1BX0hhbmRsZVR5cGVEZWYqICloZG1hKS0+UGFyZW50OworICAKKyAgLyogU2V0IEFEQyBzdGF0ZSAqLworICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0RNQSk7CisgIAorICAvKiBTZXQgQURDIGVycm9yIGNvZGUgdG8gRE1BIGVycm9yICovCisgIFNFVF9CSVQoaGFkYy0+RXJyb3JDb2RlLCBIQUxfQURDX0VSUk9SX0RNQSk7CisgIAorICAvKiBFcnJvciBjYWxsYmFjayAqLworICBIQUxfQURDX0Vycm9yQ2FsbGJhY2soaGFkYyk7IAorfQorCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBzZWxlY3RlZCBBREMuCisgICogQG5vdGUgICBQcmVyZXF1aXNpdGUgY29uZGl0aW9uIHRvIHVzZSB0aGlzIGZ1bmN0aW9uOiBBREMgbXVzdCBiZSBkaXNhYmxlZAorICAqICAgICAgICAgYW5kIHZvbHRhZ2UgcmVndWxhdG9yIG11c3QgYmUgZW5hYmxlZCAoZG9uZSBpbnRvIEhBTF9BRENfSW5pdCgpKS4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cy4KKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBBRENfRW5hYmxlKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKyAgCisgIC8qIEFEQyBlbmFibGUgYW5kIHdhaXQgZm9yIEFEQyByZWFkeSAoaW4gY2FzZSBvZiBBREMgaXMgZGlzYWJsZWQgb3IgICAgICAgICAqLworICAvKiBlbmFibGluZyBwaGFzZSBub3QgeWV0IGNvbXBsZXRlZDogZmxhZyBBREMgcmVhZHkgbm90IHlldCBzZXQpLiAgICAgICAgICAgKi8KKyAgLyogVGltZW91dCBpbXBsZW1lbnRlZCB0byBub3QgYmUgc3R1Y2sgaWYgQURDIGNhbm5vdCBiZSBlbmFibGVkIChwb3NzaWJsZSAgICovCisgIC8qIGNhdXNlczogQURDIGNsb2NrIG5vdCBydW5uaW5nLCAuLi4pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZiAoQURDX0lTX0VOQUJMRShoYWRjKSA9PSBSRVNFVCkKKyAgeworICAgIC8qIENoZWNrIGlmIGNvbmRpdGlvbnMgdG8gZW5hYmxlIHRoZSBBREMgYXJlIGZ1bGZpbGxlZCAqLworICAgIGlmIChBRENfRU5BQkxJTkdfQ09ORElUSU9OUyhoYWRjKSA9PSBSRVNFVCkKKyAgICB7CisgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpOworICAgICAgCisgICAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgdG8gQURDIElQIGludGVybmFsIGVycm9yICovCisgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7CisgICAgICAKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICAgIAorICAgIC8qIEVuYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9BRENfRU5BQkxFKGhhZGMpOworICAgIAorICAgIC8qIFdhaXQgZm9yIEFEQyBlZmZlY3RpdmVseSBlbmFibGVkICovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsgIAorICAgIAorICAgIHdoaWxlKF9fSEFMX0FEQ19HRVRfRkxBRyhoYWRjLCBBRENfRkxBR19SRFkpID09IFJFU0VUKQorICAgIHsKKyAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IEFEQ19FTkFCTEVfVElNRU9VVCkKKyAgICAgIHsKKyAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpOworICAgICAgICAKKyAgICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIEFEQyBJUCBpbnRlcm5hbCBlcnJvciAqLworICAgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7CisgICAgICAKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIC8qIFJldHVybiBIQUwgc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgc2VsZWN0ZWQgQURDLgorICAqIEBub3RlICAgUHJlcmVxdWlzaXRlIGNvbmRpdGlvbiB0byB1c2UgdGhpcyBmdW5jdGlvbjogQURDIGNvbnZlcnNpb25zIG11c3QgYmUKKyAgKiAgICAgICAgIHN0b3BwZWQuCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMuCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQURDX0Rpc2FibGUoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDBVOworICAKKyAgLyogVmVyaWZpY2F0aW9uIGlmIEFEQyBpcyBub3QgYWxyZWFkeSBkaXNhYmxlZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE5vdGU6IGZvcmJpZGRlbiB0byBkaXNhYmxlIEFEQyAoc2V0IGJpdCBBRENfQ1JfQURESVMpIGlmIEFEQyBpcyBhbHJlYWR5ICAqLworICAvKiBkaXNhYmxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYgKEFEQ19JU19FTkFCTEUoaGFkYykgIT0gUkVTRVQgKQorICB7CisgICAgLyogQ2hlY2sgaWYgY29uZGl0aW9ucyB0byBkaXNhYmxlIHRoZSBBREMgYXJlIGZ1bGZpbGxlZCAqLworICAgIGlmIChBRENfRElTQUJMSU5HX0NPTkRJVElPTlMoaGFkYykgIT0gUkVTRVQpCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgKi8KKyAgICAgIF9fSEFMX0FEQ19ESVNBQkxFKGhhZGMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgIAorICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIEFEQyBJUCBpbnRlcm5hbCBlcnJvciAqLworICAgICAgU0VUX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfSU5URVJOQUwpOworICAgICAgCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgICAgCisgICAgLyogV2FpdCBmb3IgQURDIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICAKKyAgICB3aGlsZShIQUxfSVNfQklUX1NFVChoYWRjLT5JbnN0YW5jZS0+Q1IsIEFEQ19DUl9BREVOKSkKKyAgICB7CisgICAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBBRENfRElTQUJMRV9USU1FT1VUKQorICAgICAgeworICAgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCk7CisgICAgICAgIAorICAgICAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgdG8gQURDIElQIGludGVybmFsIGVycm9yICovCisgICAgICAgIFNFVF9CSVQoaGFkYy0+RXJyb3JDb2RlLCBIQUxfQURDX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICB9CisgIAorICAvKiBSZXR1cm4gSEFMIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisKKy8qKgorICAqIEBicmllZiAgU3RvcCBBREMgY29udmVyc2lvbi4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEBwYXJhbSAgQ29udmVyc2lvbkdyb3VwIEFEQyBncm91cCByZWd1bGFyIGFuZC9vciBpbmplY3RlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBBRENfUkVHVUxBUl9HUk9VUDogQURDIHJlZ3VsYXIgY29udmVyc2lvbiB0eXBlLgorICAqICAgICAgICAgICAgQGFyZyBBRENfSU5KRUNURURfR1JPVVA6IEFEQyBpbmplY3RlZCBjb252ZXJzaW9uIHR5cGUuCisgICogICAgICAgICAgICBAYXJnIEFEQ19SRUdVTEFSX0lOSkVDVEVEX0dST1VQOiBBREMgcmVndWxhciBhbmQgaW5qZWN0ZWQgY29udmVyc2lvbiB0eXBlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cy4KKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBBRENfQ29udmVyc2lvblN0b3AoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMsIHVpbnQzMl90IENvbnZlcnNpb25Hcm91cCkKK3sKKyAgdWludDMyX3QgdG1wX0FEQ19DUl9BRFNUQVJUX0pBRFNUQVJUID0gMFU7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDBVOworICB1aW50MzJfdCBDb252ZXJzaW9uX1RpbWVvdXRfQ1BVX2N5Y2xlcyA9IDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfQ09OVkVSU0lPTl9HUk9VUChDb252ZXJzaW9uR3JvdXApKTsKKyAgICAKKyAgLyogVmVyaWZpY2F0aW9uIGlmIEFEQyBpcyBub3QgYWxyZWFkeSBzdG9wcGVkIChvbiByZWd1bGFyIGFuZCBpbmplY3RlZCAgICAgICovCisgIC8qIGdyb3VwcykgdG8gYnlwYXNzIHRoaXMgZnVuY3Rpb24gaWYgbm90IG5lZWRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZiAoQURDX0lTX0NPTlZFUlNJT05fT05HT0lOR19SRUdVTEFSX0lOSkVDVEVEKGhhZGMpKQorICB7CisgICAgLyogUGFydGljdWxhciBjYXNlIG9mIGNvbnRpbnVvdXMgYXV0by1pbmplY3Rpb24gbW9kZSBjb21iaW5lZCB3aXRoICAgICAgICAqLworICAgIC8qIGF1dG8tZGVsYXkgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBJbiBhdXRvLWluamVjdGlvbiBtb2RlLCByZWd1bGFyIGdyb3VwIHN0b3AgQURDX0NSX0FEU1RQIGlzIHVzZWQgKG5vdCAgICovCisgICAgLyogaW5qZWN0ZWQgZ3JvdXAgc3RvcCBBRENfQ1JfSkFEU1RQKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIFByb2NlZHVyZSB0byBiZSBmb2xsb3dlZDogV2FpdCB1bnRpbCBKRU9TPTFVLCBjbGVhciBKRU9TLCBzZXQgQURTVFA9MSAgICovCisgICAgLyogKHNlZSByZWZlcmVuY2UgbWFudWFsKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmICgoSEFMX0lTX0JJVF9TRVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0pBVVRPKSkgJiYKKyAgICAgICAgIChoYWRjLT5Jbml0LkNvbnRpbnVvdXNDb252TW9kZT09RU5BQkxFKSAgICAgICAgICAgICAgICYmCisgICAgICAgICAoaGFkYy0+SW5pdC5Mb3dQb3dlckF1dG9XYWl0PT1FTkFCTEUpICAgICAgICAgICAgICAgICAgICkKKyAgICB7CisgICAgICAvKiBVc2Ugc3RvcCBvZiByZWd1bGFyIGdyb3VwICovCisgICAgICBDb252ZXJzaW9uR3JvdXAgPSBBRENfUkVHVUxBUl9HUk9VUDsKKyAgICAgIAorICAgICAgLyogV2FpdCB1bnRpbCBKRU9TPTEgKG1heGltdW0gVGltZW91dDogNCBpbmplY3RlZCBjb252ZXJzaW9ucykgKi8KKyAgICAgIHdoaWxlKF9fSEFMX0FEQ19HRVRfRkxBRyhoYWRjLCBBRENfRkxBR19KRU9TKSA9PSBSRVNFVCkKKyAgICAgIHsKKyAgICAgICAgaWYgKENvbnZlcnNpb25fVGltZW91dF9DUFVfY3ljbGVzID49IChBRENfQ09OVkVSU0lPTl9USU1FX01BWF9DUFVfQ1lDTEVTICo0VSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgICAgICAKKyAgICAgICAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgdG8gQURDIElQIGludGVybmFsIGVycm9yICovCisgICAgICAgICAgU0VUX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfSU5URVJOQUwpOworICAgICAgICAgIAorICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgQ29udmVyc2lvbl9UaW1lb3V0X0NQVV9jeWNsZXMgKys7CisgICAgICB9CisKKyAgICAgIC8qIENsZWFyIEpFT1MgKi8KKyAgICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX0pFT1MpOworICAgIH0KKyAgICAKKyAgICAvKiBTdG9wIHBvdGVudGlhbCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIHJlZ3VsYXIgZ3JvdXAgKi8KKyAgICBpZiAoQ29udmVyc2lvbkdyb3VwICE9IEFEQ19JTkpFQ1RFRF9HUk9VUCkKKyAgICB7CisgICAgICAvKiBTb2Z0d2FyZSBpcyBhbGxvd2VkIHRvIHNldCBBRFNUUCBvbmx5IHdoZW4gQURTVEFSVD0xIGFuZCBBRERJUz0wVSAqLworICAgICAgaWYgKEhBTF9JU19CSVRfU0VUKGhhZGMtPkluc3RhbmNlLT5DUiwgQURDX0NSX0FEU1RBUlQpICYmIAorICAgICAgICAgIEhBTF9JU19CSVRfQ0xSKGhhZGMtPkluc3RhbmNlLT5DUiwgQURDX0NSX0FERElTKSAgICAgKQorICAgICAgeworICAgICAgICAvKiBTdG9wIGNvbnZlcnNpb25zIG9uIHJlZ3VsYXIgZ3JvdXAgKi8KKyAgICAgICAgaGFkYy0+SW5zdGFuY2UtPkNSIHw9IEFEQ19DUl9BRFNUUDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTdG9wIHBvdGVudGlhbCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIGluamVjdGVkIGdyb3VwICovCisgICAgaWYgKENvbnZlcnNpb25Hcm91cCAhPSBBRENfUkVHVUxBUl9HUk9VUCkKKyAgICB7CisgICAgICAvKiBTb2Z0d2FyZSBpcyBhbGxvd2VkIHRvIHNldCBKQURTVFAgb25seSB3aGVuIEpBRFNUQVJUPTEgYW5kIEFERElTPTBVICovCisgICAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaGFkYy0+SW5zdGFuY2UtPkNSLCBBRENfQ1JfSkFEU1RBUlQpICYmIAorICAgICAgICAgIEhBTF9JU19CSVRfQ0xSKGhhZGMtPkluc3RhbmNlLT5DUiwgQURDX0NSX0FERElTKSAgICAgICkKKyAgICAgIHsKKyAgICAgICAgLyogU3RvcCBjb252ZXJzaW9ucyBvbiBpbmplY3RlZCBncm91cCAqLworICAgICAgICBoYWRjLT5JbnN0YW5jZS0+Q1IgfD0gQURDX0NSX0pBRFNUUDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTZWxlY3Rpb24gb2Ygc3RhcnQgYW5kIHN0b3AgYml0cyBpbiBmdW5jdGlvbiBvZiByZWd1bGFyIG9yIGluamVjdGVkIGdyb3VwICovCisgICAgc3dpdGNoKENvbnZlcnNpb25Hcm91cCkKKyAgICB7CisgICAgY2FzZSBBRENfUkVHVUxBUl9JTkpFQ1RFRF9HUk9VUDoKKyAgICAgICAgdG1wX0FEQ19DUl9BRFNUQVJUX0pBRFNUQVJUID0gKEFEQ19DUl9BRFNUQVJUIHwgQURDX0NSX0pBRFNUQVJUKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBRENfSU5KRUNURURfR1JPVVA6CisgICAgICAgIHRtcF9BRENfQ1JfQURTVEFSVF9KQURTVEFSVCA9IEFEQ19DUl9KQURTVEFSVDsKKyAgICAgICAgYnJlYWs7CisgICAgLyogQ2FzZSBBRENfUkVHVUxBUl9HUk9VUCAqLworICAgIGRlZmF1bHQ6CisgICAgICAgIHRtcF9BRENfQ1JfQURTVEFSVF9KQURTVEFSVCA9IEFEQ19DUl9BRFNUQVJUOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgCisgICAgLyogV2FpdCBmb3IgY29udmVyc2lvbiBlZmZlY3RpdmVseSBzdG9wcGVkICovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICAgIAorICAgIHdoaWxlKChoYWRjLT5JbnN0YW5jZS0+Q1IgJiB0bXBfQURDX0NSX0FEU1RBUlRfSkFEU1RBUlQpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IEFEQ19TVE9QX0NPTlZFUlNJT05fVElNRU9VVCkKKyAgICAgIHsKKyAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpOworICAgICAgICAKKyAgICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIEFEQyBJUCBpbnRlcm5hbCBlcnJvciAqLworICAgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgICAKKyAgfQorICAgCisgIC8qIFJldHVybiBIQUwgc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgc2VsZWN0ZWQgQURDLgorICAqIEBub3RlICAgUHJlcmVxdWlzaXRlIGNvbmRpdGlvbiB0byB1c2UgdGhpcyBmdW5jdGlvbjogQURDIG11c3QgYmUgZGlzYWJsZWQKKyAgKiAgICAgICAgIGFuZCB2b2x0YWdlIHJlZ3VsYXRvciBtdXN0IGJlIGVuYWJsZWQgKGRvbmUgaW50byBIQUxfQURDX0luaXQoKSkuCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMuCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQURDX0VuYWJsZShBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gMFU7CisgIF9fSU8gdWludDMyX3Qgd2FpdF9sb29wX2luZGV4ID0gMFU7CisgIAorICAvKiBBREMgZW5hYmxlIGFuZCB3YWl0IGZvciBBREMgcmVhZHkgKGluIGNhc2Ugb2YgQURDIGlzIGRpc2FibGVkIG9yICAgICAgICAgKi8KKyAgLyogZW5hYmxpbmcgcGhhc2Ugbm90IHlldCBjb21wbGV0ZWQ6IGZsYWcgQURDIHJlYWR5IG5vdCB5ZXQgc2V0KS4gICAgICAgICAgICovCisgIC8qIFRpbWVvdXQgaW1wbGVtZW50ZWQgdG8gbm90IGJlIHN0dWNrIGlmIEFEQyBjYW5ub3QgYmUgZW5hYmxlZCAocG9zc2libGUgICAqLworICAvKiBjYXVzZXM6IEFEQyBjbG9jayBub3QgcnVubmluZywgLi4uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYgKEFEQ19JU19FTkFCTEUoaGFkYykgPT0gUkVTRVQpCisgIHsKKyAgICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9BRENfRU5BQkxFKGhhZGMpOworICAgIAorICAgIC8qIERlbGF5IGZvciBBREMgc3RhYmlsaXphdGlvbiB0aW1lICovCisgICAgLyogQ29tcHV0ZSBudW1iZXIgb2YgQ1BVIGN5Y2xlcyB0byB3YWl0IGZvciAqLworICAgIHdhaXRfbG9vcF9pbmRleCA9IChBRENfU1RBQl9ERUxBWV9VUyAqIChTeXN0ZW1Db3JlQ2xvY2sgLyAxMDAwMDAwVSkpOworICAgIHdoaWxlKHdhaXRfbG9vcF9pbmRleCAhPSAwVSkKKyAgICB7CisgICAgICB3YWl0X2xvb3BfaW5kZXgtLTsKKyAgICB9CisgICAgCisgICAgLyogR2V0IHRpY2sgY291bnQgKi8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgIAorICAgIC8qIFdhaXQgZm9yIEFEQyBlZmZlY3RpdmVseSBlbmFibGVkICovCisgICAgd2hpbGUoQURDX0lTX0VOQUJMRShoYWRjKSA9PSBSRVNFVCkKKyAgICB7CisgICAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBBRENfRU5BQkxFX1RJTUVPVVQpCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgICAgCisgICAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBBREMgSVAgaW50ZXJuYWwgZXJyb3IgKi8KKyAgICAgICAgU0VUX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfSU5URVJOQUwpOworICAgICAgICAKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgICAgICAKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgIAorICAvKiBSZXR1cm4gSEFMIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgQURDIGNvbnZlcnNpb24gYW5kIGRpc2FibGUgdGhlIHNlbGVjdGVkIEFEQworICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzLgorICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEFEQ19Db252ZXJzaW9uU3RvcF9EaXNhYmxlKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKyAgCisgIC8qIFZlcmlmaWNhdGlvbiBpZiBBREMgaXMgbm90IGFscmVhZHkgZGlzYWJsZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZiAoQURDX0lTX0VOQUJMRShoYWRjKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIERpc2FibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovCisgICAgX19IQUxfQURDX0RJU0FCTEUoaGFkYyk7CisgICAgIAorICAgIC8qIEdldCB0aWNrIGNvdW50ICovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICAKKyAgICAvKiBXYWl0IGZvciBBREMgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8KKyAgICB3aGlsZShBRENfSVNfRU5BQkxFKGhhZGMpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IEFEQ19ESVNBQkxFX1RJTUVPVVQpCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgICAgCisgICAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBBREMgSVAgaW50ZXJuYWwgZXJyb3IgKi8KKyAgICAgICAgU0VUX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfSU5URVJOQUwpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIC8qIFJldHVybiBIQUwgc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisjZW5kaWYgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8gIAorLyoqCisgICogQH0KKyAgKi8KKyAgCisjZW5kaWYgLyogSEFMX0FEQ19NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8gCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmM3h4X2hhbF9jYW4uYyBiL1NyYy9zdG0zMmYzeHhfaGFsX2Nhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZGUwMGMKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJmM3h4X2hhbF9jYW4uYwpAQCAtMCwwICsxLDE5ODUgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX2Nhbi5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBDQU4gSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgQ29udHJvbGxlciBBcmVhIE5ldHdvcmsgKENBTikgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBDb250cm9sIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIEludGVycnVwdHMgbWFuYWdlbWVudAorICAqICAgICAgICAgICArIENhbGxiYWNrcyBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgjKSBJbml0aWFsaXplIHRoZSBDQU4gbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlCisgICAgICAgICAgSEFMX0NBTl9Nc3BJbml0KCk6CisgICAgICAgICAoKyspIEVuYWJsZSB0aGUgQ0FOIGludGVyZmFjZSBjbG9jayB1c2luZyBfX0hBTF9SQ0NfQ0FOeF9DTEtfRU5BQkxFKCkKKyAgICAgICAgICgrKykgQ29uZmlndXJlIENBTiBwaW5zCisgICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBjbG9jayBmb3IgdGhlIENBTiBHUElPcworICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSBDQU4gcGlucyBhcyBhbHRlcm5hdGUgZnVuY3Rpb24gb3Blbi1kcmFpbgorICAgICAgICAgKCsrKSBJbiBjYXNlIG9mIHVzaW5nIGludGVycnVwdHMgKGUuZy4gSEFMX0NBTl9BY3RpdmF0ZU5vdGlmaWNhdGlvbigpKQorICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgQ0FOIGludGVycnVwdCBwcmlvcml0eSB1c2luZworICAgICAgICAgICAgICAgICAgIEhBTF9OVklDX1NldFByaW9yaXR5KCkKKyAgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIENBTiBJUlEgaGFuZGxlciB1c2luZyBIQUxfTlZJQ19FbmFibGVJUlEoKQorICAgICAgICAgICAgICgrKyspIEluIENBTiBJUlEgaGFuZGxlciwgY2FsbCBIQUxfQ0FOX0lSUUhhbmRsZXIoKQorCisgICAgICAoIykgSW5pdGlhbGl6ZSB0aGUgQ0FOIHBlcmlwaGVyYWwgdXNpbmcgSEFMX0NBTl9Jbml0KCkgZnVuY3Rpb24uIFRoaXMKKyAgICAgICAgICBmdW5jdGlvbiByZXNvcnRzIHRvIEhBTF9DQU5fTXNwSW5pdCgpIGZvciBsb3ctbGV2ZWwgaW5pdGlhbGl6YXRpb24uCisKKyAgICAgICgjKSBDb25maWd1cmUgdGhlIHJlY2VwdGlvbiBmaWx0ZXJzIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbgorICAgICAgICAgIGZ1bmN0aW9uczoKKyAgICAgICAgICAgICgrKykgSEFMX0NBTl9Db25maWdGaWx0ZXIoKQorCisgICAgICAoIykgU3RhcnQgdGhlIENBTiBtb2R1bGUgdXNpbmcgSEFMX0NBTl9TdGFydCgpIGZ1bmN0aW9uLiBBdCB0aGlzIGxldmVsCisgICAgICAgICAgdGhlIG5vZGUgaXMgYWN0aXZlIG9uIHRoZSBidXM6IGl0IHJlY2VpdmUgbWVzc2FnZXMsIGFuZCBjYW4gc2VuZAorICAgICAgICAgIG1lc3NhZ2VzLgorCisgICAgICAoIykgVG8gbWFuYWdlIG1lc3NhZ2VzIHRyYW5zbWlzc2lvbiwgdGhlIGZvbGxvd2luZyBUeCBjb250cm9sIGZ1bmN0aW9ucworICAgICAgICAgIGNhbiBiZSB1c2VkOgorICAgICAgICAgICAgKCsrKSBIQUxfQ0FOX0FkZFR4TWVzc2FnZSgpIHRvIHJlcXVlc3QgdHJhbnNtaXNzaW9uIG9mIGEgbmV3CisgICAgICAgICAgICAgICAgIG1lc3NhZ2UuCisgICAgICAgICAgICAoKyspIEhBTF9DQU5fQWJvcnRUeFJlcXVlc3QoKSB0byBhYm9ydCB0cmFuc21pc3Npb24gb2YgYSBwZW5kaW5nCisgICAgICAgICAgICAgICAgIG1lc3NhZ2UuCisgICAgICAgICAgICAoKyspIEhBTF9DQU5fR2V0VHhNYWlsYm94ZXNGcmVlTGV2ZWwoKSB0byBnZXQgdGhlIG51bWJlciBvZiBmcmVlIFR4CisgICAgICAgICAgICAgICAgIG1haWxib3hlcy4KKyAgICAgICAgICAgICgrKykgSEFMX0NBTl9Jc1R4TWVzc2FnZVBlbmRpbmcoKSB0byBjaGVjayBpZiBhIG1lc3NhZ2UgaXMgcGVuZGluZworICAgICAgICAgICAgICAgICBpbiBhIFR4IG1haWxib3guCisgICAgICAgICAgICAoKyspIEhBTF9DQU5fR2V0VHhUaW1lc3RhbXAoKSB0byBnZXQgdGhlIHRpbWVzdGFtcCBvZiBUeCBtZXNzYWdlCisgICAgICAgICAgICAgICAgIHNlbnQsIGlmIHRpbWUgdHJpZ2dlcmVkIGNvbW11bmljYXRpb24gbW9kZSBpcyBlbmFibGVkLgorCisgICAgICAoIykgV2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgaW50byB0aGUgQ0FOIFJ4IEZJRk9zLCBpdCBjYW4gYmUgcmV0cmlldmVkCisgICAgICAgICAgdXNpbmcgdGhlIEhBTF9DQU5fR2V0UnhNZXNzYWdlKCkgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbgorICAgICAgICAgIEhBTF9DQU5fR2V0UnhGaWZvRmlsbExldmVsKCkgYWxsb3dzIHRvIGtub3cgaG93IG1hbnkgUnggbWVzc2FnZSBhcmUKKyAgICAgICAgICBzdG9yZWQgaW4gdGhlIFJ4IEZpZm8uCisKKyAgICAgICgjKSBDYWxsaW5nIHRoZSBIQUxfQ0FOX1N0b3AoKSBmdW5jdGlvbiBzdG9wcyB0aGUgQ0FOIG1vZHVsZS4KKworICAgICAgKCMpIFRoZSBkZWluaXRpYWxpemF0aW9uIGlzIGFjaGlldmVkIHdpdGggSEFMX0NBTl9EZUluaXQoKSBmdW5jdGlvbi4KKworCisgICAgICAqKiogUG9sbGluZyBtb2RlIG9wZXJhdGlvbiAqKioKKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgjKSBSZWNlcHRpb246CisgICAgICAgICAgICAoKyspIE1vbml0b3IgcmVjZXB0aW9uIG9mIG1lc3NhZ2UgdXNpbmcgSEFMX0NBTl9HZXRSeEZpZm9GaWxsTGV2ZWwoKQorICAgICAgICAgICAgICAgICB1bnRpbCBhdCBsZWFzdCBvbmUgbWVzc2FnZSBpcyByZWNlaXZlZC4KKyAgICAgICAgICAgICgrKykgVGhlbiBnZXQgdGhlIG1lc3NhZ2UgdXNpbmcgSEFMX0NBTl9HZXRSeE1lc3NhZ2UoKS4KKworICAgICAgKCMpIFRyYW5zbWlzc2lvbjoKKyAgICAgICAgICAgICgrKykgTW9uaXRvciB0aGUgVHggbWFpbGJveGVzIGF2YWlsYWJpbGl0eSB1bnRpbCBhdCBsZWFzdCBvbmUgVHgKKyAgICAgICAgICAgICAgICAgbWFpbGJveCBpcyBmcmVlLCB1c2luZyBIQUxfQ0FOX0dldFR4TWFpbGJveGVzRnJlZUxldmVsKCkuCisgICAgICAgICAgICAoKyspIFRoZW4gcmVxdWVzdCB0cmFuc21pc3Npb24gb2YgYSBtZXNzYWdlIHVzaW5nCisgICAgICAgICAgICAgICAgIEhBTF9DQU5fQWRkVHhNZXNzYWdlKCkuCisKKworICAgICAgKioqIEludGVycnVwdCBtb2RlIG9wZXJhdGlvbiAqKioKKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgKCMpIE5vdGlmaWNhdGlvbnMgYXJlIGFjdGl2YXRlZCB1c2luZyBIQUxfQ0FOX0FjdGl2YXRlTm90aWZpY2F0aW9uKCkKKyAgICAgICAgICBmdW5jdGlvbi4gVGhlbiwgdGhlIHByb2Nlc3MgY2FuIGJlIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUKKyAgICAgICAgICBhdmFpbGFibGUgdXNlciBjYWxsYmFja3M6IEhBTF9DQU5feHh4Q2FsbGJhY2soKSwgdXNpbmcgc2FtZSBBUElzCisgICAgICAgICAgSEFMX0NBTl9HZXRSeE1lc3NhZ2UoKSBhbmQgSEFMX0NBTl9BZGRUeE1lc3NhZ2UoKS4KKworICAgICAgKCMpIE5vdGlmaWNhdGlvbnMgY2FuIGJlIGRlYWN0aXZhdGVkIHVzaW5nCisgICAgICAgICAgSEFMX0NBTl9EZWFjdGl2YXRlTm90aWZpY2F0aW9uKCkgZnVuY3Rpb24uCisKKyAgICAgICgjKSBTcGVjaWFsIGNhcmUgc2hvdWxkIGJlIHRha2VuIGZvciBDQU5fSVRfUlhfRklGTzBfTVNHX1BFTkRJTkcgYW5kCisgICAgICAgICAgQ0FOX0lUX1JYX0ZJRk8xX01TR19QRU5ESU5HIG5vdGlmaWNhdGlvbnMuIFRoZXNlIG5vdGlmaWNhdGlvbnMgdHJpZworICAgICAgICAgIHRoZSBjYWxsYmFja3MgSEFMX0NBTl9SeEZJRk8wTXNnUGVuZGluZ0NhbGxiYWNrKCkgYW5kCisgICAgICAgICAgSEFMX0NBTl9SeEZJRk8xTXNnUGVuZGluZ0NhbGxiYWNrKCkuIFVzZXIgaGFzIHR3byBwb3NzaWJsZSBvcHRpb25zCisgICAgICAgICAgaGVyZS4KKyAgICAgICAgICAgICgrKykgRGlyZWN0bHkgZ2V0IHRoZSBSeCBtZXNzYWdlIGluIHRoZSBjYWxsYmFjaywgdXNpbmcKKyAgICAgICAgICAgICAgICAgSEFMX0NBTl9HZXRSeE1lc3NhZ2UoKS4KKyAgICAgICAgICAgICgrKykgT3IgZGVhY3RpdmF0ZSB0aGUgbm90aWZpY2F0aW9uIGluIHRoZSBjYWxsYmFjayB3aXRob3V0CisgICAgICAgICAgICAgICAgIGdldHRpbmcgdGhlIFJ4IG1lc3NhZ2UuIFRoZSBSeCBtZXNzYWdlIGNhbiB0aGVuIGJlIGdvdCBsYXRlcgorICAgICAgICAgICAgICAgICB1c2luZyBIQUxfQ0FOX0dldFJ4TWVzc2FnZSgpLiBPbmNlIHRoZSBSeCBtZXNzYWdlIGhhdmUgYmVlbgorICAgICAgICAgICAgICAgICByZWFkLCB0aGUgbm90aWZpY2F0aW9uIGNhbiBiZSBhY3RpdmF0ZWQgYWdhaW4uCisKKworICAgICAgKioqIFNsZWVwIG1vZGUgKioqCisgICAgICA9PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAoIykgVGhlIENBTiBwZXJpcGhlcmFsIGNhbiBiZSBwdXQgaW4gc2xlZXAgbW9kZSAobG93IHBvd2VyKSwgdXNpbmcKKyAgICAgICAgICBIQUxfQ0FOX1JlcXVlc3RTbGVlcCgpLiBUaGUgc2xlZXAgbW9kZSB3aWxsIGJlIGVudGVyZWQgYXMgc29vbiBhcyB0aGUKKyAgICAgICAgICBjdXJyZW50IENBTiBhY3Rpdml0eSAodHJhbnNtaXNzaW9uIG9yIHJlY2VwdGlvbiBvZiBhIENBTiBmcmFtZSkgd2lsbAorICAgICAgICAgIGJlIGNvbXBsZXRlZC4KKworICAgICAgKCMpIEEgbm90aWZpY2F0aW9uIGNhbiBiZSBhY3RpdmF0ZWQgdG8gYmUgaW5mb3JtZWQgd2hlbiB0aGUgc2xlZXAgbW9kZQorICAgICAgICAgIHdpbGwgYmUgZW50ZXJlZC4KKworICAgICAgKCMpIEl0IGNhbiBiZSBjaGVja2VkIGlmIHRoZSBzbGVlcCBtb2RlIGlzIGVudGVyZWQgdXNpbmcKKyAgICAgICAgICBIQUxfQ0FOX0lzU2xlZXBBY3RpdmUoKS4KKyAgICAgICAgICBOb3RlIHRoYXQgdGhlIENBTiBzdGF0ZSAoYWNjZXNzaWJsZSBmcm9tIHRoZSBBUEkgSEFMX0NBTl9HZXRTdGF0ZSgpKQorICAgICAgICAgIGlzIEhBTF9DQU5fU1RBVEVfU0xFRVBfUEVORElORyBhcyBzb29uIGFzIHRoZSBzbGVlcCBtb2RlIHJlcXVlc3QgaXMKKyAgICAgICAgICBzdWJtaXR0ZWQgKHRoZSBzbGVlcCBtb2RlIGlzIG5vdCB5ZXQgZW50ZXJlZCksIGFuZCBiZWNvbWUKKyAgICAgICAgICBIQUxfQ0FOX1NUQVRFX1NMRUVQX0FDVElWRSB3aGVuIHRoZSBzbGVlcCBtb2RlIGlzIGVmZmVjdGl2ZS4KKworICAgICAgKCMpIFRoZSB3YWtlLXVwIGZyb20gc2xlZXAgbW9kZSBjYW4gYmUgdHJpZ2dlZCBieSB0d28gd2F5czoKKyAgICAgICAgICAgICgrKykgVXNpbmcgSEFMX0NBTl9XYWtlVXAoKS4gV2hlbiByZXR1cm5pbmcgZnJvbSB0aGlzIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICB0aGUgc2xlZXAgbW9kZSBpcyBleGl0ZWQgKGlmIHJldHVybiBzdGF0dXMgaXMgSEFMX09LKS4KKyAgICAgICAgICAgICgrKykgV2hlbiBhIHN0YXJ0IG9mIFJ4IENBTiBmcmFtZSBpcyBkZXRlY3RlZCBieSB0aGUgQ0FOIHBlcmlwaGVyYWwsCisgICAgICAgICAgICAgICAgIGlmIGF1dG9tYXRpYyB3YWtlIHVwIG1vZGUgaXMgZW5hYmxlZC4KKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChDQU4pCisKKy8qKiBAZGVmZ3JvdXAgQ0FOIENBTgorICAqIEBicmllZiBDQU4gZHJpdmVyIG1vZHVsZXMKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX0NBTl9NT0RVTEVfRU5BQkxFRAorCisjaWZkZWYgSEFMX0NBTl9MRUdBQ1lfTU9EVUxFX0VOQUJMRUQKKyAgI2Vycm9yICJUaGUgQ0FOIGRyaXZlciBjYW5ub3QgYmUgdXNlZCB3aXRoIGl0cyBsZWdhY3ksIFBsZWFzZSBlbmFibGUgb25seSBvbmUgQ0FOIG1vZHVsZSBhdCBvbmNlIgorI2VuZGlmCisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDQU5fUHJpdmF0ZV9Db25zdGFudHMgQ0FOIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ0FOX1RJTUVPVVRfVkFMVUUgMTBVCisvKioKKyAgKiBAfQorICAqLworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBDQU5fRXhwb3J0ZWRfRnVuY3Rpb25zIENBTiBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENBTl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgSEFMX0NBTl9Jbml0ICAgICAgICAgICAgICAgICAgICAgICA6IEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSB0aGUgQ0FOLgorICAgICAgKCspIEhBTF9DQU5fRGVJbml0ICAgICAgICAgICAgICAgICAgICAgOiBEZS1pbml0aWFsaXplIHRoZSBDQU4uCisgICAgICAoKykgSEFMX0NBTl9Nc3BJbml0ICAgICAgICAgICAgICAgICAgICA6IEluaXRpYWxpemUgdGhlIENBTiBNU1AuCisgICAgICAoKykgSEFMX0NBTl9Nc3BEZUluaXQgICAgICAgICAgICAgICAgICA6IERlSW5pdGlhbGl6ZSB0aGUgQ0FOIE1TUC4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgQ0FOIHBlcmlwaGVyYWwgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIENBTl9Jbml0U3RydWN0LgorICAqIEBwYXJhbSAgaGNhbiBwb2ludGVyIHRvIGEgQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIENBTi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DQU5fSW5pdChDQU5fSGFuZGxlVHlwZURlZiAqaGNhbikKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIENoZWNrIENBTiBoYW5kbGUgKi8KKyAgaWYgKGhjYW4gPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0FMTF9JTlNUQU5DRShoY2FuLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShoY2FuLT5Jbml0LlRpbWVUcmlnZ2VyZWRNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKGhjYW4tPkluaXQuQXV0b0J1c09mZikpOworICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShoY2FuLT5Jbml0LkF1dG9XYWtlVXApKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoaGNhbi0+SW5pdC5BdXRvUmV0cmFuc21pc3Npb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoaGNhbi0+SW5pdC5SZWNlaXZlRmlmb0xvY2tlZCkpOworICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShoY2FuLT5Jbml0LlRyYW5zbWl0Rmlmb1ByaW9yaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19DQU5fTU9ERShoY2FuLT5Jbml0Lk1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0NBTl9TSlcoaGNhbi0+SW5pdC5TeW5jSnVtcFdpZHRoKSk7CisgIGFzc2VydF9wYXJhbShJU19DQU5fQlMxKGhjYW4tPkluaXQuVGltZVNlZzEpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0NBTl9CUzIoaGNhbi0+SW5pdC5UaW1lU2VnMikpOworICBhc3NlcnRfcGFyYW0oSVNfQ0FOX1BSRVNDQUxFUihoY2FuLT5Jbml0LlByZXNjYWxlcikpOworCisgIGlmIChoY2FuLT5TdGF0ZSA9PSBIQUxfQ0FOX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBDTE9DSywgTlZJQyAqLworICAgIEhBTF9DQU5fTXNwSW5pdChoY2FuKTsKKyAgfQorCisgIC8qIEV4aXQgZnJvbSBzbGVlcCBtb2RlICovCisgIENMRUFSX0JJVChoY2FuLT5JbnN0YW5jZS0+TUNSLCBDQU5fTUNSX1NMRUVQKTsKKworICAvKiBHZXQgdGljayAqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIENoZWNrIFNsZWVwIG1vZGUgbGVhdmUgYWNrbm93bGVkZ2UgKi8KKyAgd2hpbGUgKChoY2FuLT5JbnN0YW5jZS0+TVNSICYgQ0FOX01TUl9TTEFLKSAhPSAwVSkKKyAgeworICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBDQU5fVElNRU9VVF9WQUxVRSkKKyAgICB7CisgICAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgICAgaGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9DQU5fRVJST1JfVElNRU9VVDsKKworICAgICAgLyogQ2hhbmdlIENBTiBzdGF0ZSAqLworICAgICAgaGNhbi0+U3RhdGUgPSBIQUxfQ0FOX1NUQVRFX0VSUk9SOworCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgfQorCisgIC8qIFJlcXVlc3QgaW5pdGlhbGlzYXRpb24gKi8KKyAgU0VUX0JJVChoY2FuLT5JbnN0YW5jZS0+TUNSLCBDQU5fTUNSX0lOUlEpOworCisgIC8qIEdldCB0aWNrICovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCBpbml0aWFsaXNhdGlvbiBhY2tub3dsZWRnZSAqLworICB3aGlsZSAoKGhjYW4tPkluc3RhbmNlLT5NU1IgJiBDQU5fTVNSX0lOQUspID09IDBVKQorICB7CisgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IENBTl9USU1FT1VUX1ZBTFVFKQorICAgIHsKKyAgICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovCisgICAgICBoY2FuLT5FcnJvckNvZGUgfD0gSEFMX0NBTl9FUlJPUl9USU1FT1VUOworCisgICAgICAvKiBDaGFuZ2UgQ0FOIHN0YXRlICovCisgICAgICBoY2FuLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfRVJST1I7CisKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICB9CisKKyAgLyogU2V0IHRoZSB0aW1lIHRyaWdnZXJlZCBjb21tdW5pY2F0aW9uIG1vZGUgKi8KKyAgaWYgKGhjYW4tPkluaXQuVGltZVRyaWdnZXJlZE1vZGUgPT0gRU5BQkxFKQorICB7CisgICAgU0VUX0JJVChoY2FuLT5JbnN0YW5jZS0+TUNSLCBDQU5fTUNSX1RUQ00pOworICB9CisgIGVsc2UKKyAgeworICAgIENMRUFSX0JJVChoY2FuLT5JbnN0YW5jZS0+TUNSLCBDQU5fTUNSX1RUQ00pOworICB9CisKKyAgLyogU2V0IHRoZSBhdXRvbWF0aWMgYnVzLW9mZiBtYW5hZ2VtZW50ICovCisgIGlmIChoY2FuLT5Jbml0LkF1dG9CdXNPZmYgPT0gRU5BQkxFKQorICB7CisgICAgU0VUX0JJVChoY2FuLT5JbnN0YW5jZS0+TUNSLCBDQU5fTUNSX0FCT00pOworICB9CisgIGVsc2UKKyAgeworICAgIENMRUFSX0JJVChoY2FuLT5JbnN0YW5jZS0+TUNSLCBDQU5fTUNSX0FCT00pOworICB9CisKKyAgLyogU2V0IHRoZSBhdXRvbWF0aWMgd2FrZS11cCBtb2RlICovCisgIGlmIChoY2FuLT5Jbml0LkF1dG9XYWtlVXAgPT0gRU5BQkxFKQorICB7CisgICAgU0VUX0JJVChoY2FuLT5JbnN0YW5jZS0+TUNSLCBDQU5fTUNSX0FXVU0pOworICB9CisgIGVsc2UKKyAgeworICAgIENMRUFSX0JJVChoY2FuLT5JbnN0YW5jZS0+TUNSLCBDQU5fTUNSX0FXVU0pOworICB9CisKKyAgLyogU2V0IHRoZSBhdXRvbWF0aWMgcmV0cmFuc21pc3Npb24gKi8KKyAgaWYgKGhjYW4tPkluaXQuQXV0b1JldHJhbnNtaXNzaW9uID09IEVOQUJMRSkKKyAgeworICAgIENMRUFSX0JJVChoY2FuLT5JbnN0YW5jZS0+TUNSLCBDQU5fTUNSX05BUlQpOworICB9CisgIGVsc2UKKyAgeworICAgIFNFVF9CSVQoaGNhbi0+SW5zdGFuY2UtPk1DUiwgQ0FOX01DUl9OQVJUKTsKKyAgfQorCisgIC8qIFNldCB0aGUgcmVjZWl2ZSBGSUZPIGxvY2tlZCBtb2RlICovCisgIGlmIChoY2FuLT5Jbml0LlJlY2VpdmVGaWZvTG9ja2VkID09IEVOQUJMRSkKKyAgeworICAgIFNFVF9CSVQoaGNhbi0+SW5zdGFuY2UtPk1DUiwgQ0FOX01DUl9SRkxNKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBDTEVBUl9CSVQoaGNhbi0+SW5zdGFuY2UtPk1DUiwgQ0FOX01DUl9SRkxNKTsKKyAgfQorCisgIC8qIFNldCB0aGUgdHJhbnNtaXQgRklGTyBwcmlvcml0eSAqLworICBpZiAoaGNhbi0+SW5pdC5UcmFuc21pdEZpZm9Qcmlvcml0eSA9PSBFTkFCTEUpCisgIHsKKyAgICBTRVRfQklUKGhjYW4tPkluc3RhbmNlLT5NQ1IsIENBTl9NQ1JfVFhGUCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgQ0xFQVJfQklUKGhjYW4tPkluc3RhbmNlLT5NQ1IsIENBTl9NQ1JfVFhGUCk7CisgIH0KKworICAvKiBTZXQgdGhlIGJpdCB0aW1pbmcgcmVnaXN0ZXIgKi8KKyAgV1JJVEVfUkVHKGhjYW4tPkluc3RhbmNlLT5CVFIsICh1aW50MzJfdCkoaGNhbi0+SW5pdC5Nb2RlICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjYW4tPkluaXQuU3luY0p1bXBXaWR0aCAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2FuLT5Jbml0LlRpbWVTZWcxICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNhbi0+SW5pdC5UaW1lU2VnMiAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoY2FuLT5Jbml0LlByZXNjYWxlciAtIDFVKSkpOworCisgIC8qIEluaXRpYWxpemUgdGhlIGVycm9yIGNvZGUgKi8KKyAgaGNhbi0+RXJyb3JDb2RlID0gSEFMX0NBTl9FUlJPUl9OT05FOworCisgIC8qIEluaXRpYWxpemUgdGhlIENBTiBzdGF0ZSAqLworICBoY2FuLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlaW5pdGlhbGl6ZXMgdGhlIENBTiBwZXJpcGhlcmFsIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0CisgICogICAgICAgICByZXNldCB2YWx1ZXMuCisgICogQHBhcmFtICBoY2FuIHBvaW50ZXIgdG8gYSBDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQ0FOLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NBTl9EZUluaXQoQ0FOX0hhbmRsZVR5cGVEZWYgKmhjYW4pCit7CisgIC8qIENoZWNrIENBTiBoYW5kbGUgKi8KKyAgaWYgKGhjYW4gPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0FMTF9JTlNUQU5DRShoY2FuLT5JbnN0YW5jZSkpOworCisgIC8qIFN0b3AgdGhlIENBTiBtb2R1bGUgKi8KKyAgKHZvaWQpSEFMX0NBTl9TdG9wKGhjYW4pOworCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBDTE9DSywgTlZJQyAqLworICBIQUxfQ0FOX01zcERlSW5pdChoY2FuKTsKKworICAvKiBSZXNldCB0aGUgQ0FOIHBlcmlwaGVyYWwgKi8KKyAgU0VUX0JJVChoY2FuLT5JbnN0YW5jZS0+TUNSLCBDQU5fTUNSX1JFU0VUKTsKKworICAvKiBSZXNldCB0aGUgQ0FOIEVycm9yQ29kZSAqLworICBoY2FuLT5FcnJvckNvZGUgPSBIQUxfQ0FOX0VSUk9SX05PTkU7CisKKyAgLyogQ2hhbmdlIENBTiBzdGF0ZSAqLworICBoY2FuLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfUkVTRVQ7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBDQU4gTVNQLgorICAqIEBwYXJhbSAgaGNhbiBwb2ludGVyIHRvIGEgQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIENBTi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9DQU5fTXNwSW5pdChDQU5fSGFuZGxlVHlwZURlZiAqaGNhbikKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGNhbik7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9DQU5fTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgdGhlIENBTiBNU1AuCisgICogQHBhcmFtICBoY2FuIHBvaW50ZXIgdG8gYSBDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQ0FOLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0NBTl9Nc3BEZUluaXQoQ0FOX0hhbmRsZVR5cGVEZWYgKmhjYW4pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhjYW4pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfQ0FOX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ0FOX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMuCisgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIEhBTF9DQU5fQ29uZmlnRmlsdGVyICAgICAgICAgICAgOiBDb25maWd1cmUgdGhlIENBTiByZWNlcHRpb24gZmlsdGVycworCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIENBTiByZWNlcHRpb24gZmlsdGVyIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBDQU5fRmlsdGVySW5pdFN0cnVjdC4KKyAgKiBAcGFyYW0gIGhjYW4gcG9pbnRlciB0byBhIENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBDQU4uCisgICogQHBhcmFtICBzRmlsdGVyQ29uZmlnIHBvaW50ZXIgdG8gYSBDQU5fRmlsdGVyVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqICAgICAgICAgY29udGFpbnMgdGhlIGZpbHRlciBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgorICAqIEByZXR2YWwgTm9uZQorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NBTl9Db25maWdGaWx0ZXIoQ0FOX0hhbmRsZVR5cGVEZWYgKmhjYW4sIENBTl9GaWx0ZXJUeXBlRGVmICpzRmlsdGVyQ29uZmlnKQoreworICB1aW50MzJfdCBmaWx0ZXJuYnJiaXRwb3M7CisgIENBTl9UeXBlRGVmICpjYW5faXAgPSBoY2FuLT5JbnN0YW5jZTsKKyAgSEFMX0NBTl9TdGF0ZVR5cGVEZWYgc3RhdGUgPSBoY2FuLT5TdGF0ZTsKKworICBpZiAoKHN0YXRlID09IEhBTF9DQU5fU1RBVEVfUkVBRFkpIHx8CisgICAgICAoc3RhdGUgPT0gSEFMX0NBTl9TVEFURV9MSVNURU5JTkcpKQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0ZJTFRFUl9JRF9IQUxGV09SRChzRmlsdGVyQ29uZmlnLT5GaWx0ZXJJZEhpZ2gpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0ZJTFRFUl9JRF9IQUxGV09SRChzRmlsdGVyQ29uZmlnLT5GaWx0ZXJJZExvdykpOworICAgIGFzc2VydF9wYXJhbShJU19DQU5fRklMVEVSX0lEX0hBTEZXT1JEKHNGaWx0ZXJDb25maWctPkZpbHRlck1hc2tJZEhpZ2gpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0ZJTFRFUl9JRF9IQUxGV09SRChzRmlsdGVyQ29uZmlnLT5GaWx0ZXJNYXNrSWRMb3cpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0ZJTFRFUl9NT0RFKHNGaWx0ZXJDb25maWctPkZpbHRlck1vZGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0ZJTFRFUl9TQ0FMRShzRmlsdGVyQ29uZmlnLT5GaWx0ZXJTY2FsZSkpOworICAgIGFzc2VydF9wYXJhbShJU19DQU5fRklMVEVSX0ZJRk8oc0ZpbHRlckNvbmZpZy0+RmlsdGVyRklGT0Fzc2lnbm1lbnQpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0ZJTFRFUl9BQ1RJVkFUSU9OKHNGaWx0ZXJDb25maWctPkZpbHRlckFjdGl2YXRpb24pKTsKKworICAgIC8qIENBTiBpcyBzaW5nbGUgaW5zdGFuY2Ugd2l0aCAxNCBkZWRpY2F0ZWQgZmlsdGVycyBiYW5rcyAqLworCisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0ZJTFRFUl9CQU5LX1NJTkdMRShzRmlsdGVyQ29uZmlnLT5GaWx0ZXJCYW5rKSk7CisKKyAgICAvKiBJbml0aWFsaXNhdGlvbiBtb2RlIGZvciB0aGUgZmlsdGVyICovCisgICAgU0VUX0JJVChjYW5faXAtPkZNUiwgQ0FOX0ZNUl9GSU5JVCk7CisKKyAgICAvKiBDb252ZXJ0IGZpbHRlciBudW1iZXIgaW50byBiaXQgcG9zaXRpb24gKi8KKyAgICBmaWx0ZXJuYnJiaXRwb3MgPSAodWludDMyX3QpMSA8PCAoc0ZpbHRlckNvbmZpZy0+RmlsdGVyQmFuayAmIDB4MUZVKTsKKworICAgIC8qIEZpbHRlciBEZWFjdGl2YXRpb24gKi8KKyAgICBDTEVBUl9CSVQoY2FuX2lwLT5GQTFSLCBmaWx0ZXJuYnJiaXRwb3MpOworCisgICAgLyogRmlsdGVyIFNjYWxlICovCisgICAgaWYgKHNGaWx0ZXJDb25maWctPkZpbHRlclNjYWxlID09IENBTl9GSUxURVJTQ0FMRV8xNkJJVCkKKyAgICB7CisgICAgICAvKiAxNi1iaXQgc2NhbGUgZm9yIHRoZSBmaWx0ZXIgKi8KKyAgICAgIENMRUFSX0JJVChjYW5faXAtPkZTMVIsIGZpbHRlcm5icmJpdHBvcyk7CisKKyAgICAgIC8qIEZpcnN0IDE2LWJpdCBpZGVudGlmaWVyIGFuZCBGaXJzdCAxNi1iaXQgbWFzayAqLworICAgICAgLyogT3IgRmlyc3QgMTYtYml0IGlkZW50aWZpZXIgYW5kIFNlY29uZCAxNi1iaXQgaWRlbnRpZmllciAqLworICAgICAgY2FuX2lwLT5zRmlsdGVyUmVnaXN0ZXJbc0ZpbHRlckNvbmZpZy0+RmlsdGVyQmFua10uRlIxID0KKyAgICAgICAgKCgweDAwMDBGRkZGVSAmICh1aW50MzJfdClzRmlsdGVyQ29uZmlnLT5GaWx0ZXJNYXNrSWRMb3cpIDw8IDE2VSkgfAorICAgICAgICAoMHgwMDAwRkZGRlUgJiAodWludDMyX3Qpc0ZpbHRlckNvbmZpZy0+RmlsdGVySWRMb3cpOworCisgICAgICAvKiBTZWNvbmQgMTYtYml0IGlkZW50aWZpZXIgYW5kIFNlY29uZCAxNi1iaXQgbWFzayAqLworICAgICAgLyogT3IgVGhpcmQgMTYtYml0IGlkZW50aWZpZXIgYW5kIEZvdXJ0aCAxNi1iaXQgaWRlbnRpZmllciAqLworICAgICAgY2FuX2lwLT5zRmlsdGVyUmVnaXN0ZXJbc0ZpbHRlckNvbmZpZy0+RmlsdGVyQmFua10uRlIyID0KKyAgICAgICAgKCgweDAwMDBGRkZGVSAmICh1aW50MzJfdClzRmlsdGVyQ29uZmlnLT5GaWx0ZXJNYXNrSWRIaWdoKSA8PCAxNlUpIHwKKyAgICAgICAgKDB4MDAwMEZGRkZVICYgKHVpbnQzMl90KXNGaWx0ZXJDb25maWctPkZpbHRlcklkSGlnaCk7CisgICAgfQorCisgICAgaWYgKHNGaWx0ZXJDb25maWctPkZpbHRlclNjYWxlID09IENBTl9GSUxURVJTQ0FMRV8zMkJJVCkKKyAgICB7CisgICAgICAvKiAzMi1iaXQgc2NhbGUgZm9yIHRoZSBmaWx0ZXIgKi8KKyAgICAgIFNFVF9CSVQoY2FuX2lwLT5GUzFSLCBmaWx0ZXJuYnJiaXRwb3MpOworCisgICAgICAvKiAzMi1iaXQgaWRlbnRpZmllciBvciBGaXJzdCAzMi1iaXQgaWRlbnRpZmllciAqLworICAgICAgY2FuX2lwLT5zRmlsdGVyUmVnaXN0ZXJbc0ZpbHRlckNvbmZpZy0+RmlsdGVyQmFua10uRlIxID0KKyAgICAgICAgKCgweDAwMDBGRkZGVSAmICh1aW50MzJfdClzRmlsdGVyQ29uZmlnLT5GaWx0ZXJJZEhpZ2gpIDw8IDE2VSkgfAorICAgICAgICAoMHgwMDAwRkZGRlUgJiAodWludDMyX3Qpc0ZpbHRlckNvbmZpZy0+RmlsdGVySWRMb3cpOworCisgICAgICAvKiAzMi1iaXQgbWFzayBvciBTZWNvbmQgMzItYml0IGlkZW50aWZpZXIgKi8KKyAgICAgIGNhbl9pcC0+c0ZpbHRlclJlZ2lzdGVyW3NGaWx0ZXJDb25maWctPkZpbHRlckJhbmtdLkZSMiA9CisgICAgICAgICgoMHgwMDAwRkZGRlUgJiAodWludDMyX3Qpc0ZpbHRlckNvbmZpZy0+RmlsdGVyTWFza0lkSGlnaCkgPDwgMTZVKSB8CisgICAgICAgICgweDAwMDBGRkZGVSAmICh1aW50MzJfdClzRmlsdGVyQ29uZmlnLT5GaWx0ZXJNYXNrSWRMb3cpOworICAgIH0KKworICAgIC8qIEZpbHRlciBNb2RlICovCisgICAgaWYgKHNGaWx0ZXJDb25maWctPkZpbHRlck1vZGUgPT0gQ0FOX0ZJTFRFUk1PREVfSURNQVNLKQorICAgIHsKKyAgICAgIC8qIElkL01hc2sgbW9kZSBmb3IgdGhlIGZpbHRlciovCisgICAgICBDTEVBUl9CSVQoY2FuX2lwLT5GTTFSLCBmaWx0ZXJuYnJiaXRwb3MpOworICAgIH0KKyAgICBlbHNlIC8qIENBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVyTW9kZSA9PSBDQU5fRmlsdGVyTW9kZV9JZExpc3QgKi8KKyAgICB7CisgICAgICAvKiBJZGVudGlmaWVyIGxpc3QgbW9kZSBmb3IgdGhlIGZpbHRlciovCisgICAgICBTRVRfQklUKGNhbl9pcC0+Rk0xUiwgZmlsdGVybmJyYml0cG9zKTsKKyAgICB9CisKKyAgICAvKiBGaWx0ZXIgRklGTyBhc3NpZ25tZW50ICovCisgICAgaWYgKHNGaWx0ZXJDb25maWctPkZpbHRlckZJRk9Bc3NpZ25tZW50ID09IENBTl9GSUxURVJfRklGTzApCisgICAgeworICAgICAgLyogRklGTyAwIGFzc2lnbmF0aW9uIGZvciB0aGUgZmlsdGVyICovCisgICAgICBDTEVBUl9CSVQoY2FuX2lwLT5GRkExUiwgZmlsdGVybmJyYml0cG9zKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIEZJRk8gMSBhc3NpZ25hdGlvbiBmb3IgdGhlIGZpbHRlciAqLworICAgICAgU0VUX0JJVChjYW5faXAtPkZGQTFSLCBmaWx0ZXJuYnJiaXRwb3MpOworICAgIH0KKworICAgIC8qIEZpbHRlciBhY3RpdmF0aW9uICovCisgICAgaWYgKHNGaWx0ZXJDb25maWctPkZpbHRlckFjdGl2YXRpb24gPT0gQ0FOX0ZJTFRFUl9FTkFCTEUpCisgICAgeworICAgICAgU0VUX0JJVChjYW5faXAtPkZBMVIsIGZpbHRlcm5icmJpdHBvcyk7CisgICAgfQorCisgICAgLyogTGVhdmUgdGhlIGluaXRpYWxpc2F0aW9uIG1vZGUgZm9yIHRoZSBmaWx0ZXIgKi8KKyAgICBDTEVBUl9CSVQoY2FuX2lwLT5GTVIsIENBTl9GTVJfRklOSVQpOworCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICBoY2FuLT5FcnJvckNvZGUgfD0gSEFMX0NBTl9FUlJPUl9OT1RfSU5JVElBTElaRUQ7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ0FOX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgQ29udHJvbCBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgQ29udHJvbCBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBIQUxfQ0FOX1N0YXJ0ICAgICAgICAgICAgICAgICAgICA6IFN0YXJ0IHRoZSBDQU4gbW9kdWxlCisgICAgICAoKykgSEFMX0NBTl9TdG9wICAgICAgICAgICAgICAgICAgICAgOiBTdG9wIHRoZSBDQU4gbW9kdWxlCisgICAgICAoKykgSEFMX0NBTl9SZXF1ZXN0U2xlZXAgICAgICAgICAgICAgOiBSZXF1ZXN0IHNsZWVwIG1vZGUgZW50cnkuCisgICAgICAoKykgSEFMX0NBTl9XYWtlVXAgICAgICAgICAgICAgICAgICAgOiBXYWtlIHVwIGZyb20gc2xlZXAgbW9kZS4KKyAgICAgICgrKSBIQUxfQ0FOX0lzU2xlZXBBY3RpdmUgICAgICAgICAgICA6IENoZWNrIGlzIHNsZWVwIG1vZGUgaXMgYWN0aXZlLgorICAgICAgKCspIEhBTF9DQU5fQWRkVHhNZXNzYWdlICAgICAgICAgICAgIDogQWRkIGEgbWVzc2FnZSB0byB0aGUgVHggbWFpbGJveGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYWN0aXZhdGUgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbWlzc2lvbiByZXF1ZXN0CisgICAgICAoKykgSEFMX0NBTl9BYm9ydFR4UmVxdWVzdCAgICAgICAgICAgOiBBYm9ydCB0cmFuc21pc3Npb24gcmVxdWVzdAorICAgICAgKCspIEhBTF9DQU5fR2V0VHhNYWlsYm94ZXNGcmVlTGV2ZWwgIDogUmV0dXJuIFR4IG1haWxib3hlcyBmcmVlIGxldmVsCisgICAgICAoKykgSEFMX0NBTl9Jc1R4TWVzc2FnZVBlbmRpbmcgICAgICAgOiBDaGVjayBpZiBhIHRyYW5zbWlzc2lvbiByZXF1ZXN0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nIG9uIHRoZSBzZWxlY3RlZCBUeCBtYWlsYm94CisgICAgICAoKykgSEFMX0NBTl9HZXRSeE1lc3NhZ2UgICAgICAgICAgICAgOiBHZXQgYSBDQU4gZnJhbWUgZnJvbSB0aGUgUnggRklGTworICAgICAgKCspIEhBTF9DQU5fR2V0UnhGaWZvRmlsbExldmVsICAgICAgIDogUmV0dXJuIFJ4IEZJRk8gZmlsbCBsZXZlbAorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBDQU4gbW9kdWxlLgorICAqIEBwYXJhbSAgaGNhbiBwb2ludGVyIHRvIGFuIENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBDQU4uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ0FOX1N0YXJ0KENBTl9IYW5kbGVUeXBlRGVmICpoY2FuKQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgaWYgKGhjYW4tPlN0YXRlID09IEhBTF9DQU5fU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBDaGFuZ2UgQ0FOIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgICBoY2FuLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfTElTVEVOSU5HOworCisgICAgLyogUmVxdWVzdCBsZWF2ZSBpbml0aWFsaXNhdGlvbiAqLworICAgIENMRUFSX0JJVChoY2FuLT5JbnN0YW5jZS0+TUNSLCBDQU5fTUNSX0lOUlEpOworCisgICAgLyogR2V0IHRpY2sgKi8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgLyogV2FpdCB0aGUgYWNrbm93bGVkZ2UgKi8KKyAgICB3aGlsZSAoKGhjYW4tPkluc3RhbmNlLT5NU1IgJiBDQU5fTVNSX0lOQUspICE9IDBVKQorICAgIHsKKyAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLworICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IENBTl9USU1FT1VUX1ZBTFVFKQorICAgICAgeworICAgICAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgICAgICBoY2FuLT5FcnJvckNvZGUgfD0gSEFMX0NBTl9FUlJPUl9USU1FT1VUOworCisgICAgICAgIC8qIENoYW5nZSBDQU4gc3RhdGUgKi8KKyAgICAgICAgaGNhbi0+U3RhdGUgPSBIQUxfQ0FOX1NUQVRFX0VSUk9SOworCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorCisgICAgLyogUmVzZXQgdGhlIENBTiBFcnJvckNvZGUgKi8KKyAgICBoY2FuLT5FcnJvckNvZGUgPSBIQUxfQ0FOX0VSUk9SX05PTkU7CisKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgIGhjYW4tPkVycm9yQ29kZSB8PSBIQUxfQ0FOX0VSUk9SX05PVF9SRUFEWTsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIHRoZSBDQU4gbW9kdWxlIGFuZCBlbmFibGUgYWNjZXNzIHRvIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLgorICAqIEBwYXJhbSAgaGNhbiBwb2ludGVyIHRvIGFuIENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBDQU4uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ0FOX1N0b3AoQ0FOX0hhbmRsZVR5cGVEZWYgKmhjYW4pCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICBpZiAoaGNhbi0+U3RhdGUgPT0gSEFMX0NBTl9TVEFURV9MSVNURU5JTkcpCisgIHsKKyAgICAvKiBSZXF1ZXN0IGluaXRpYWxpc2F0aW9uICovCisgICAgU0VUX0JJVChoY2FuLT5JbnN0YW5jZS0+TUNSLCBDQU5fTUNSX0lOUlEpOworCisgICAgLyogR2V0IHRpY2sgKi8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgLyogV2FpdCB0aGUgYWNrbm93bGVkZ2UgKi8KKyAgICB3aGlsZSAoKGhjYW4tPkluc3RhbmNlLT5NU1IgJiBDQU5fTVNSX0lOQUspID09IDBVKQorICAgIHsKKyAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLworICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IENBTl9USU1FT1VUX1ZBTFVFKQorICAgICAgeworICAgICAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgICAgICBoY2FuLT5FcnJvckNvZGUgfD0gSEFMX0NBTl9FUlJPUl9USU1FT1VUOworCisgICAgICAgIC8qIENoYW5nZSBDQU4gc3RhdGUgKi8KKyAgICAgICAgaGNhbi0+U3RhdGUgPSBIQUxfQ0FOX1NUQVRFX0VSUk9SOworCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorCisgICAgLyogRXhpdCBmcm9tIHNsZWVwIG1vZGUgKi8KKyAgICBDTEVBUl9CSVQoaGNhbi0+SW5zdGFuY2UtPk1DUiwgQ0FOX01DUl9TTEVFUCk7CisKKyAgICAvKiBDaGFuZ2UgQ0FOIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgICBoY2FuLT5TdGF0ZSA9IEhBTF9DQU5fU1RBVEVfUkVBRFk7CisKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgIGhjYW4tPkVycm9yQ29kZSB8PSBIQUxfQ0FOX0VSUk9SX05PVF9TVEFSVEVEOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJlcXVlc3QgdGhlIHNsZWVwIG1vZGUgKGxvdyBwb3dlcikgZW50cnkuCisgICogICAgICAgICBXaGVuIHJldHVybmluZyBmcm9tIHRoaXMgZnVuY3Rpb24sIFNsZWVwIG1vZGUgd2lsbCBiZSBlbnRlcmVkCisgICogICAgICAgICBhcyBzb29uIGFzIHRoZSBjdXJyZW50IENBTiBhY3Rpdml0eSAodHJhbnNtaXNzaW9uIG9yIHJlY2VwdGlvbgorICAqICAgICAgICAgb2YgYSBDQU4gZnJhbWUpIGhhcyBiZWVuIGNvbXBsZXRlZC4KKyAgKiBAcGFyYW0gIGhjYW4gcG9pbnRlciB0byBhIENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBDQU4uCisgICogQHJldHZhbCBIQUwgc3RhdHVzLgorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NBTl9SZXF1ZXN0U2xlZXAoQ0FOX0hhbmRsZVR5cGVEZWYgKmhjYW4pCit7CisgIEhBTF9DQU5fU3RhdGVUeXBlRGVmIHN0YXRlID0gaGNhbi0+U3RhdGU7CisKKyAgaWYgKChzdGF0ZSA9PSBIQUxfQ0FOX1NUQVRFX1JFQURZKSB8fAorICAgICAgKHN0YXRlID09IEhBTF9DQU5fU1RBVEVfTElTVEVOSU5HKSkKKyAgeworICAgIC8qIFJlcXVlc3QgU2xlZXAgbW9kZSAqLworICAgIFNFVF9CSVQoaGNhbi0+SW5zdGFuY2UtPk1DUiwgQ0FOX01DUl9TTEVFUCk7CisKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgIGhjYW4tPkVycm9yQ29kZSB8PSBIQUxfQ0FOX0VSUk9SX05PVF9JTklUSUFMSVpFRDsKKworICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgV2FrZSB1cCBmcm9tIHNsZWVwIG1vZGUuCisgICogICAgICAgICBXaGVuIHJldHVybmluZyB3aXRoIEhBTF9PSyBzdGF0dXMgZnJvbSB0aGlzIGZ1bmN0aW9uLCBTbGVlcCBtb2RlCisgICogICAgICAgICBpcyBleGl0ZWQuCisgICogQHBhcmFtICBoY2FuIHBvaW50ZXIgdG8gYSBDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQ0FOLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cy4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DQU5fV2FrZVVwKENBTl9IYW5kbGVUeXBlRGVmICpoY2FuKQoreworICBfX0lPIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgdWludDMyX3QgdGltZW91dCA9IDEwMDAwMDBVOworICBIQUxfQ0FOX1N0YXRlVHlwZURlZiBzdGF0ZSA9IGhjYW4tPlN0YXRlOworCisgIGlmICgoc3RhdGUgPT0gSEFMX0NBTl9TVEFURV9SRUFEWSkgfHwKKyAgICAgIChzdGF0ZSA9PSBIQUxfQ0FOX1NUQVRFX0xJU1RFTklORykpCisgIHsKKyAgICAvKiBXYWtlIHVwIHJlcXVlc3QgKi8KKyAgICBDTEVBUl9CSVQoaGNhbi0+SW5zdGFuY2UtPk1DUiwgQ0FOX01DUl9TTEVFUCk7CisKKyAgICAvKiBXYWl0IHNsZWVwIG1vZGUgaXMgZXhpdGVkICovCisgICAgZG8KKyAgICB7CisgICAgICAvKiBJbmNyZW1lbnQgY291bnRlciAqLworICAgICAgY291bnQrKzsKKworICAgICAgLyogQ2hlY2sgaWYgdGltZW91dCBpcyByZWFjaGVkICovCisgICAgICBpZiAoY291bnQgPiB0aW1lb3V0KQorICAgICAgeworICAgICAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgICAgICBoY2FuLT5FcnJvckNvZGUgfD0gSEFMX0NBTl9FUlJPUl9USU1FT1VUOworCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICAgIHdoaWxlICgoaGNhbi0+SW5zdGFuY2UtPk1TUiAmIENBTl9NU1JfU0xBSykgIT0gMFUpOworCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICBoY2FuLT5FcnJvckNvZGUgfD0gSEFMX0NBTl9FUlJPUl9OT1RfSU5JVElBTElaRUQ7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaXMgc2xlZXAgbW9kZSBpcyBhY3RpdmUuCisgICogQHBhcmFtICBoY2FuIHBvaW50ZXIgdG8gYSBDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQ0FOLgorICAqIEByZXR2YWwgU3RhdHVzCisgICogICAgICAgICAgLSAwIDogU2xlZXAgbW9kZSBpcyBub3QgYWN0aXZlLgorICAqICAgICAgICAgIC0gMSA6IFNsZWVwIG1vZGUgaXMgYWN0aXZlLgorICAqLwordWludDMyX3QgSEFMX0NBTl9Jc1NsZWVwQWN0aXZlKENBTl9IYW5kbGVUeXBlRGVmICpoY2FuKQoreworICB1aW50MzJfdCBzdGF0dXMgPSAwVTsKKyAgSEFMX0NBTl9TdGF0ZVR5cGVEZWYgc3RhdGUgPSBoY2FuLT5TdGF0ZTsKKworICBpZiAoKHN0YXRlID09IEhBTF9DQU5fU1RBVEVfUkVBRFkpIHx8CisgICAgICAoc3RhdGUgPT0gSEFMX0NBTl9TVEFURV9MSVNURU5JTkcpKQorICB7CisgICAgLyogQ2hlY2sgU2xlZXAgbW9kZSAqLworICAgIGlmICgoaGNhbi0+SW5zdGFuY2UtPk1TUiAmIENBTl9NU1JfU0xBSykgIT0gMFUpCisgICAgeworICAgICAgc3RhdHVzID0gMVU7CisgICAgfQorICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFkZCBhIG1lc3NhZ2UgdG8gdGhlIGZpcnN0IGZyZWUgVHggbWFpbGJveCBhbmQgYWN0aXZhdGUgdGhlCisgICogICAgICAgICBjb3JyZXNwb25kaW5nIHRyYW5zbWlzc2lvbiByZXF1ZXN0LgorICAqIEBwYXJhbSAgaGNhbiBwb2ludGVyIHRvIGEgQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIENBTi4KKyAgKiBAcGFyYW0gIHBIZWFkZXIgcG9pbnRlciB0byBhIENBTl9UeEhlYWRlclR5cGVEZWYgc3RydWN0dXJlLgorICAqIEBwYXJhbSAgYURhdGEgYXJyYXkgY29udGFpbmluZyB0aGUgcGF5bG9hZCBvZiB0aGUgVHggZnJhbWUuCisgICogQHBhcmFtICBwVHhNYWlsYm94IHBvaW50ZXIgdG8gYSB2YXJpYWJsZSB3aGVyZSB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4KKyAgKiAgICAgICAgIHRoZSBUeE1haWxib3ggdXNlZCB0byBzdG9yZSB0aGUgVHggbWVzc2FnZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEBhcmcgQ0FOX1R4X01haWxib3hlcy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DQU5fQWRkVHhNZXNzYWdlKENBTl9IYW5kbGVUeXBlRGVmICpoY2FuLCBDQU5fVHhIZWFkZXJUeXBlRGVmICpwSGVhZGVyLCB1aW50OF90IGFEYXRhW10sIHVpbnQzMl90ICpwVHhNYWlsYm94KQoreworICB1aW50MzJfdCB0cmFuc21pdG1haWxib3g7CisgIEhBTF9DQU5fU3RhdGVUeXBlRGVmIHN0YXRlID0gaGNhbi0+U3RhdGU7CisgIHVpbnQzMl90IHRzciA9IFJFQURfUkVHKGhjYW4tPkluc3RhbmNlLT5UU1IpOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19DQU5fSURUWVBFKHBIZWFkZXItPklERSkpOworICBhc3NlcnRfcGFyYW0oSVNfQ0FOX1JUUihwSGVhZGVyLT5SVFIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0NBTl9ETEMocEhlYWRlci0+RExDKSk7CisgIGlmIChwSGVhZGVyLT5JREUgPT0gQ0FOX0lEX1NURCkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19DQU5fU1RESUQocEhlYWRlci0+U3RkSWQpKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0VYVElEKHBIZWFkZXItPkV4dElkKSk7CisgIH0KKyAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUocEhlYWRlci0+VHJhbnNtaXRHbG9iYWxUaW1lKSk7CisKKyAgaWYgKChzdGF0ZSA9PSBIQUxfQ0FOX1NUQVRFX1JFQURZKSB8fAorICAgICAgKHN0YXRlID09IEhBTF9DQU5fU1RBVEVfTElTVEVOSU5HKSkKKyAgeworICAgIC8qIENoZWNrIHRoYXQgYWxsIHRoZSBUeCBtYWlsYm94ZXMgYXJlIG5vdCBmdWxsICovCisgICAgaWYgKCgodHNyICYgQ0FOX1RTUl9UTUUwKSAhPSAwVSkgfHwKKyAgICAgICAgKCh0c3IgJiBDQU5fVFNSX1RNRTEpICE9IDBVKSB8fAorICAgICAgICAoKHRzciAmIENBTl9UU1JfVE1FMikgIT0gMFUpKQorICAgIHsKKyAgICAgIC8qIFNlbGVjdCBhbiBlbXB0eSB0cmFuc21pdCBtYWlsYm94ICovCisgICAgICB0cmFuc21pdG1haWxib3ggPSAodHNyICYgQ0FOX1RTUl9DT0RFKSA+PiBDQU5fVFNSX0NPREVfUG9zOworCisgICAgICAvKiBDaGVjayB0cmFuc21pdCBtYWlsYm94IHZhbHVlICovCisgICAgICBpZiAodHJhbnNtaXRtYWlsYm94ID4gMlUpCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovCisgICAgICAgIGhjYW4tPkVycm9yQ29kZSB8PSBIQUxfQ0FOX0VSUk9SX0lOVEVSTkFMOworCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisKKyAgICAgIC8qIFN0b3JlIHRoZSBUeCBtYWlsYm94ICovCisgICAgICAqcFR4TWFpbGJveCA9ICh1aW50MzJfdCkxIDw8IHRyYW5zbWl0bWFpbGJveDsKKworICAgICAgLyogU2V0IHVwIHRoZSBJZCAqLworICAgICAgaWYgKHBIZWFkZXItPklERSA9PSBDQU5fSURfU1REKQorICAgICAgeworICAgICAgICBoY2FuLT5JbnN0YW5jZS0+c1R4TWFpbEJveFt0cmFuc21pdG1haWxib3hdLlRJUiA9ICgocEhlYWRlci0+U3RkSWQgPDwgQ0FOX1RJMFJfU1RJRF9Qb3MpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhlYWRlci0+UlRSKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaGNhbi0+SW5zdGFuY2UtPnNUeE1haWxCb3hbdHJhbnNtaXRtYWlsYm94XS5USVIgPSAoKHBIZWFkZXItPkV4dElkIDw8IENBTl9USTBSX0VYSURfUG9zKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZWFkZXItPklERSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZWFkZXItPlJUUik7CisgICAgICB9CisKKyAgICAgIC8qIFNldCB1cCB0aGUgRExDICovCisgICAgICBoY2FuLT5JbnN0YW5jZS0+c1R4TWFpbEJveFt0cmFuc21pdG1haWxib3hdLlREVFIgPSAocEhlYWRlci0+RExDKTsKKworICAgICAgLyogU2V0IHVwIHRoZSBUcmFuc21pdCBHbG9iYWwgVGltZSBtb2RlICovCisgICAgICBpZiAocEhlYWRlci0+VHJhbnNtaXRHbG9iYWxUaW1lID09IEVOQUJMRSkKKyAgICAgIHsKKyAgICAgICAgU0VUX0JJVChoY2FuLT5JbnN0YW5jZS0+c1R4TWFpbEJveFt0cmFuc21pdG1haWxib3hdLlREVFIsIENBTl9URFQwUl9UR1QpOworICAgICAgfQorCisgICAgICAvKiBTZXQgdXAgdGhlIGRhdGEgZmllbGQgKi8KKyAgICAgIFdSSVRFX1JFRyhoY2FuLT5JbnN0YW5jZS0+c1R4TWFpbEJveFt0cmFuc21pdG1haWxib3hdLlRESFIsCisgICAgICAgICAgICAgICAgKCh1aW50MzJfdClhRGF0YVs3XSA8PCBDQU5fVERIMFJfREFUQTdfUG9zKSB8CisgICAgICAgICAgICAgICAgKCh1aW50MzJfdClhRGF0YVs2XSA8PCBDQU5fVERIMFJfREFUQTZfUG9zKSB8CisgICAgICAgICAgICAgICAgKCh1aW50MzJfdClhRGF0YVs1XSA8PCBDQU5fVERIMFJfREFUQTVfUG9zKSB8CisgICAgICAgICAgICAgICAgKCh1aW50MzJfdClhRGF0YVs0XSA8PCBDQU5fVERIMFJfREFUQTRfUG9zKSk7CisgICAgICBXUklURV9SRUcoaGNhbi0+SW5zdGFuY2UtPnNUeE1haWxCb3hbdHJhbnNtaXRtYWlsYm94XS5URExSLAorICAgICAgICAgICAgICAgICgodWludDMyX3QpYURhdGFbM10gPDwgQ0FOX1RETDBSX0RBVEEzX1BvcykgfAorICAgICAgICAgICAgICAgICgodWludDMyX3QpYURhdGFbMl0gPDwgQ0FOX1RETDBSX0RBVEEyX1BvcykgfAorICAgICAgICAgICAgICAgICgodWludDMyX3QpYURhdGFbMV0gPDwgQ0FOX1RETDBSX0RBVEExX1BvcykgfAorICAgICAgICAgICAgICAgICgodWludDMyX3QpYURhdGFbMF0gPDwgQ0FOX1RETDBSX0RBVEEwX1BvcykpOworCisgICAgICAvKiBSZXF1ZXN0IHRyYW5zbWlzc2lvbiAqLworICAgICAgU0VUX0JJVChoY2FuLT5JbnN0YW5jZS0+c1R4TWFpbEJveFt0cmFuc21pdG1haWxib3hdLlRJUiwgQ0FOX1RJMFJfVFhSUSk7CisKKyAgICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICAgIHJldHVybiBIQUxfT0s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgICAgaGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9DQU5fRVJST1JfUEFSQU07CisKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovCisgICAgaGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9DQU5fRVJST1JfTk9UX0lOSVRJQUxJWkVEOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IHRyYW5zbWlzc2lvbiByZXF1ZXN0cworICAqIEBwYXJhbSAgaGNhbiBwb2ludGVyIHRvIGFuIENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBDQU4uCisgICogQHBhcmFtICBUeE1haWxib3hlcyBMaXN0IG9mIHRoZSBUeCBNYWlsYm94ZXMgdG8gYWJvcnQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIEBhcmcgQ0FOX1R4X01haWxib3hlcy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DQU5fQWJvcnRUeFJlcXVlc3QoQ0FOX0hhbmRsZVR5cGVEZWYgKmhjYW4sIHVpbnQzMl90IFR4TWFpbGJveGVzKQoreworICBIQUxfQ0FOX1N0YXRlVHlwZURlZiBzdGF0ZSA9IGhjYW4tPlN0YXRlOworCisgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0NBTl9UWF9NQUlMQk9YX0xJU1QoVHhNYWlsYm94ZXMpKTsKKworICBpZiAoKHN0YXRlID09IEhBTF9DQU5fU1RBVEVfUkVBRFkpIHx8CisgICAgICAoc3RhdGUgPT0gSEFMX0NBTl9TVEFURV9MSVNURU5JTkcpKQorICB7CisgICAgLyogQ2hlY2sgVHggTWFpbGJveCAwICovCisgICAgaWYgKChUeE1haWxib3hlcyAmIENBTl9UWF9NQUlMQk9YMCkgIT0gMFUpCisgICAgeworICAgICAgLyogQWRkIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGZvciBUeCBNYWlsYm94IDAgKi8KKyAgICAgIFNFVF9CSVQoaGNhbi0+SW5zdGFuY2UtPlRTUiwgQ0FOX1RTUl9BQlJRMCk7CisgICAgfQorCisgICAgLyogQ2hlY2sgVHggTWFpbGJveCAxICovCisgICAgaWYgKChUeE1haWxib3hlcyAmIENBTl9UWF9NQUlMQk9YMSkgIT0gMFUpCisgICAgeworICAgICAgLyogQWRkIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGZvciBUeCBNYWlsYm94IDEgKi8KKyAgICAgIFNFVF9CSVQoaGNhbi0+SW5zdGFuY2UtPlRTUiwgQ0FOX1RTUl9BQlJRMSk7CisgICAgfQorCisgICAgLyogQ2hlY2sgVHggTWFpbGJveCAyICovCisgICAgaWYgKChUeE1haWxib3hlcyAmIENBTl9UWF9NQUlMQk9YMikgIT0gMFUpCisgICAgeworICAgICAgLyogQWRkIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGZvciBUeCBNYWlsYm94IDIgKi8KKyAgICAgIFNFVF9CSVQoaGNhbi0+SW5zdGFuY2UtPlRTUiwgQ0FOX1RTUl9BQlJRMik7CisgICAgfQorCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICBoY2FuLT5FcnJvckNvZGUgfD0gSEFMX0NBTl9FUlJPUl9OT1RfSU5JVElBTElaRUQ7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFR4IE1haWxib3hlcyBmcmVlIGxldmVsOiBudW1iZXIgb2YgZnJlZSBUeCBNYWlsYm94ZXMuCisgICogQHBhcmFtICBoY2FuIHBvaW50ZXIgdG8gYSBDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQ0FOLgorICAqIEByZXR2YWwgTnVtYmVyIG9mIGZyZWUgVHggTWFpbGJveGVzLgorICAqLwordWludDMyX3QgSEFMX0NBTl9HZXRUeE1haWxib3hlc0ZyZWVMZXZlbChDQU5fSGFuZGxlVHlwZURlZiAqaGNhbikKK3sKKyAgdWludDMyX3QgZnJlZWxldmVsID0gMFU7CisgIEhBTF9DQU5fU3RhdGVUeXBlRGVmIHN0YXRlID0gaGNhbi0+U3RhdGU7CisKKyAgaWYgKChzdGF0ZSA9PSBIQUxfQ0FOX1NUQVRFX1JFQURZKSB8fAorICAgICAgKHN0YXRlID09IEhBTF9DQU5fU1RBVEVfTElTVEVOSU5HKSkKKyAgeworICAgIC8qIENoZWNrIFR4IE1haWxib3ggMCBzdGF0dXMgKi8KKyAgICBpZiAoKGhjYW4tPkluc3RhbmNlLT5UU1IgJiBDQU5fVFNSX1RNRTApICE9IDBVKQorICAgIHsKKyAgICAgIGZyZWVsZXZlbCsrOworICAgIH0KKworICAgIC8qIENoZWNrIFR4IE1haWxib3ggMSBzdGF0dXMgKi8KKyAgICBpZiAoKGhjYW4tPkluc3RhbmNlLT5UU1IgJiBDQU5fVFNSX1RNRTEpICE9IDBVKQorICAgIHsKKyAgICAgIGZyZWVsZXZlbCsrOworICAgIH0KKworICAgIC8qIENoZWNrIFR4IE1haWxib3ggMiBzdGF0dXMgKi8KKyAgICBpZiAoKGhjYW4tPkluc3RhbmNlLT5UU1IgJiBDQU5fVFNSX1RNRTIpICE9IDBVKQorICAgIHsKKyAgICAgIGZyZWVsZXZlbCsrOworICAgIH0KKyAgfQorCisgIC8qIFJldHVybiBUeCBNYWlsYm94ZXMgZnJlZSBsZXZlbCAqLworICByZXR1cm4gZnJlZWxldmVsOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIGEgdHJhbnNtaXNzaW9uIHJlcXVlc3QgaXMgcGVuZGluZyBvbiB0aGUgc2VsZWN0ZWQgVHgKKyAgKiAgICAgICAgIE1haWxib3hlcy4KKyAgKiBAcGFyYW0gIGhjYW4gcG9pbnRlciB0byBhbiBDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQ0FOLgorICAqIEBwYXJhbSAgVHhNYWlsYm94ZXMgTGlzdCBvZiBUeCBNYWlsYm94ZXMgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIEBhcmcgQ0FOX1R4X01haWxib3hlcy4KKyAgKiBAcmV0dmFsIFN0YXR1cworICAqICAgICAgICAgIC0gMCA6IE5vIHBlbmRpbmcgdHJhbnNtaXNzaW9uIHJlcXVlc3Qgb24gYW55IHNlbGVjdGVkIFR4IE1haWxib3hlcy4KKyAgKiAgICAgICAgICAtIDEgOiBQZW5kaW5nIHRyYW5zbWlzc2lvbiByZXF1ZXN0IG9uIGF0IGxlYXN0IG9uZSBvZiB0aGUgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgICAgICBUeCBNYWlsYm94LgorICAqLwordWludDMyX3QgSEFMX0NBTl9Jc1R4TWVzc2FnZVBlbmRpbmcoQ0FOX0hhbmRsZVR5cGVEZWYgKmhjYW4sIHVpbnQzMl90IFR4TWFpbGJveGVzKQoreworICB1aW50MzJfdCBzdGF0dXMgPSAwVTsKKyAgSEFMX0NBTl9TdGF0ZVR5cGVEZWYgc3RhdGUgPSBoY2FuLT5TdGF0ZTsKKworICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19DQU5fVFhfTUFJTEJPWF9MSVNUKFR4TWFpbGJveGVzKSk7CisKKyAgaWYgKChzdGF0ZSA9PSBIQUxfQ0FOX1NUQVRFX1JFQURZKSB8fAorICAgICAgKHN0YXRlID09IEhBTF9DQU5fU1RBVEVfTElTVEVOSU5HKSkKKyAgeworICAgIC8qIENoZWNrIHBlbmRpbmcgdHJhbnNtaXNzaW9uIHJlcXVlc3Qgb24gdGhlIHNlbGVjdGVkIFR4IE1haWxib3hlcyAqLworICAgIGlmICgoaGNhbi0+SW5zdGFuY2UtPlRTUiAmIChUeE1haWxib3hlcyA8PCBDQU5fVFNSX1RNRTBfUG9zKSkgIT0gKFR4TWFpbGJveGVzIDw8IENBTl9UU1JfVE1FMF9Qb3MpKQorICAgIHsKKyAgICAgIHN0YXR1cyA9IDFVOworICAgIH0KKyAgfQorCisgIC8qIFJldHVybiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGltZXN0YW1wIG9mIFR4IG1lc3NhZ2Ugc2VudCwgaWYgdGltZSB0cmlnZ2VyZWQgY29tbXVuaWNhdGlvbgorICAgICAgICAgICAgbW9kZSBpcyBlbmFibGVkLgorICAqIEBwYXJhbSAgaGNhbiBwb2ludGVyIHRvIGEgQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIENBTi4KKyAgKiBAcGFyYW0gIFR4TWFpbGJveCBUeCBNYWlsYm94IHdoZXJlIHRoZSB0aW1lc3RhbXAgb2YgbWVzc2FnZSBzZW50IHdpbGwgYmUKKyAgKiAgICAgICAgIHJlYWQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIHZhbHVlIG9mIEBhcmcgQ0FOX1R4X01haWxib3hlcy4KKyAgKiBAcmV0dmFsIFRpbWVzdGFtcCBvZiBtZXNzYWdlIHNlbnQgZnJvbSBUeCBNYWlsYm94LgorICAqLwordWludDMyX3QgSEFMX0NBTl9HZXRUeFRpbWVzdGFtcChDQU5fSGFuZGxlVHlwZURlZiAqaGNhbiwgdWludDMyX3QgVHhNYWlsYm94KQoreworICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwVTsKKyAgdWludDMyX3QgdHJhbnNtaXRtYWlsYm94OworICBIQUxfQ0FOX1N0YXRlVHlwZURlZiBzdGF0ZSA9IGhjYW4tPlN0YXRlOworCisgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0NBTl9UWF9NQUlMQk9YKFR4TWFpbGJveCkpOworCisgIGlmICgoc3RhdGUgPT0gSEFMX0NBTl9TVEFURV9SRUFEWSkgfHwKKyAgICAgIChzdGF0ZSA9PSBIQUxfQ0FOX1NUQVRFX0xJU1RFTklORykpCisgIHsKKyAgICAvKiBTZWxlY3QgdGhlIFR4IG1haWxib3ggKi8KKyAgICB0cmFuc21pdG1haWxib3ggPSBQT1NJVElPTl9WQUwoVHhNYWlsYm94KTsKKworICAgIC8qIEdldCB0aW1lc3RhbXAgKi8KKyAgICB0aW1lc3RhbXAgPSAoaGNhbi0+SW5zdGFuY2UtPnNUeE1haWxCb3hbdHJhbnNtaXRtYWlsYm94XS5URFRSICYgQ0FOX1REVDBSX1RJTUUpID4+IENBTl9URFQwUl9USU1FX1BvczsKKyAgfQorCisgIC8qIFJldHVybiB0aGUgdGltZXN0YW1wICovCisgIHJldHVybiB0aW1lc3RhbXA7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFuIENBTiBmcmFtZSBmcm9tIHRoZSBSeCBGSUZPIHpvbmUgaW50byB0aGUgbWVzc2FnZSBSQU0uCisgICogQHBhcmFtICBoY2FuIHBvaW50ZXIgdG8gYW4gQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIENBTi4KKyAgKiBAcGFyYW0gIFJ4RmlmbyBGaWZvIG51bWJlciBvZiB0aGUgcmVjZWl2ZWQgbWVzc2FnZSB0byBiZSByZWFkLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQGFyZyBDQU5fcmVjZWl2ZV9GSUZPX251bWJlci4KKyAgKiBAcGFyYW0gIHBIZWFkZXIgcG9pbnRlciB0byBhIENBTl9SeEhlYWRlclR5cGVEZWYgc3RydWN0dXJlIHdoZXJlIHRoZSBoZWFkZXIKKyAgKiAgICAgICAgIG9mIHRoZSBSeCBmcmFtZSB3aWxsIGJlIHN0b3JlZC4KKyAgKiBAcGFyYW0gIGFEYXRhIGFycmF5IHdoZXJlIHRoZSBwYXlsb2FkIG9mIHRoZSBSeCBmcmFtZSB3aWxsIGJlIHN0b3JlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DQU5fR2V0UnhNZXNzYWdlKENBTl9IYW5kbGVUeXBlRGVmICpoY2FuLCB1aW50MzJfdCBSeEZpZm8sIENBTl9SeEhlYWRlclR5cGVEZWYgKnBIZWFkZXIsIHVpbnQ4X3QgYURhdGFbXSkKK3sKKyAgSEFMX0NBTl9TdGF0ZVR5cGVEZWYgc3RhdGUgPSBoY2FuLT5TdGF0ZTsKKworICBhc3NlcnRfcGFyYW0oSVNfQ0FOX1JYX0ZJRk8oUnhGaWZvKSk7CisKKyAgaWYgKChzdGF0ZSA9PSBIQUxfQ0FOX1NUQVRFX1JFQURZKSB8fAorICAgICAgKHN0YXRlID09IEhBTF9DQU5fU1RBVEVfTElTVEVOSU5HKSkKKyAgeworICAgIC8qIENoZWNrIHRoZSBSeCBGSUZPICovCisgICAgaWYgKFJ4RmlmbyA9PSBDQU5fUlhfRklGTzApIC8qIFJ4IGVsZW1lbnQgaXMgYXNzaWduZWQgdG8gUnggRklGTyAwICovCisgICAgeworICAgICAgLyogQ2hlY2sgdGhhdCB0aGUgUnggRklGTyAwIGlzIG5vdCBlbXB0eSAqLworICAgICAgaWYgKChoY2FuLT5JbnN0YW5jZS0+UkYwUiAmIENBTl9SRjBSX0ZNUDApID09IDBVKQorICAgICAgeworICAgICAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgICAgICBoY2FuLT5FcnJvckNvZGUgfD0gSEFMX0NBTl9FUlJPUl9QQVJBTTsKKworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIFJ4IGVsZW1lbnQgaXMgYXNzaWduZWQgdG8gUnggRklGTyAxICovCisgICAgeworICAgICAgLyogQ2hlY2sgdGhhdCB0aGUgUnggRklGTyAxIGlzIG5vdCBlbXB0eSAqLworICAgICAgaWYgKChoY2FuLT5JbnN0YW5jZS0+UkYxUiAmIENBTl9SRjFSX0ZNUDEpID09IDBVKQorICAgICAgeworICAgICAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgICAgICBoY2FuLT5FcnJvckNvZGUgfD0gSEFMX0NBTl9FUlJPUl9QQVJBTTsKKworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKworICAgIC8qIEdldCB0aGUgaGVhZGVyICovCisgICAgcEhlYWRlci0+SURFID0gQ0FOX1JJMFJfSURFICYgaGNhbi0+SW5zdGFuY2UtPnNGSUZPTWFpbEJveFtSeEZpZm9dLlJJUjsKKyAgICBpZiAocEhlYWRlci0+SURFID09IENBTl9JRF9TVEQpCisgICAgeworICAgICAgcEhlYWRlci0+U3RkSWQgPSAoQ0FOX1JJMFJfU1RJRCAmIGhjYW4tPkluc3RhbmNlLT5zRklGT01haWxCb3hbUnhGaWZvXS5SSVIpID4+IENBTl9USTBSX1NUSURfUG9zOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcEhlYWRlci0+RXh0SWQgPSAoKENBTl9SSTBSX0VYSUQgfCBDQU5fUkkwUl9TVElEKSAmIGhjYW4tPkluc3RhbmNlLT5zRklGT01haWxCb3hbUnhGaWZvXS5SSVIpID4+IENBTl9SSTBSX0VYSURfUG9zOworICAgIH0KKyAgICBwSGVhZGVyLT5SVFIgPSAoQ0FOX1JJMFJfUlRSICYgaGNhbi0+SW5zdGFuY2UtPnNGSUZPTWFpbEJveFtSeEZpZm9dLlJJUikgPj4gQ0FOX1JJMFJfUlRSX1BvczsKKyAgICBwSGVhZGVyLT5ETEMgPSAoQ0FOX1JEVDBSX0RMQyAmIGhjYW4tPkluc3RhbmNlLT5zRklGT01haWxCb3hbUnhGaWZvXS5SRFRSKSA+PiBDQU5fUkRUMFJfRExDX1BvczsKKyAgICBwSGVhZGVyLT5GaWx0ZXJNYXRjaEluZGV4ID0gKENBTl9SRFQwUl9GTUkgJiBoY2FuLT5JbnN0YW5jZS0+c0ZJRk9NYWlsQm94W1J4Rmlmb10uUkRUUikgPj4gQ0FOX1JEVDBSX0ZNSV9Qb3M7CisgICAgcEhlYWRlci0+VGltZXN0YW1wID0gKENBTl9SRFQwUl9USU1FICYgaGNhbi0+SW5zdGFuY2UtPnNGSUZPTWFpbEJveFtSeEZpZm9dLlJEVFIpID4+IENBTl9SRFQwUl9USU1FX1BvczsKKworICAgIC8qIEdldCB0aGUgZGF0YSAqLworICAgIGFEYXRhWzBdID0gKHVpbnQ4X3QpKChDQU5fUkRMMFJfREFUQTAgJiBoY2FuLT5JbnN0YW5jZS0+c0ZJRk9NYWlsQm94W1J4Rmlmb10uUkRMUikgPj4gQ0FOX1JETDBSX0RBVEEwX1Bvcyk7CisgICAgYURhdGFbMV0gPSAodWludDhfdCkoKENBTl9SREwwUl9EQVRBMSAmIGhjYW4tPkluc3RhbmNlLT5zRklGT01haWxCb3hbUnhGaWZvXS5SRExSKSA+PiBDQU5fUkRMMFJfREFUQTFfUG9zKTsKKyAgICBhRGF0YVsyXSA9ICh1aW50OF90KSgoQ0FOX1JETDBSX0RBVEEyICYgaGNhbi0+SW5zdGFuY2UtPnNGSUZPTWFpbEJveFtSeEZpZm9dLlJETFIpID4+IENBTl9SREwwUl9EQVRBMl9Qb3MpOworICAgIGFEYXRhWzNdID0gKHVpbnQ4X3QpKChDQU5fUkRMMFJfREFUQTMgJiBoY2FuLT5JbnN0YW5jZS0+c0ZJRk9NYWlsQm94W1J4Rmlmb10uUkRMUikgPj4gQ0FOX1JETDBSX0RBVEEzX1Bvcyk7CisgICAgYURhdGFbNF0gPSAodWludDhfdCkoKENBTl9SREgwUl9EQVRBNCAmIGhjYW4tPkluc3RhbmNlLT5zRklGT01haWxCb3hbUnhGaWZvXS5SREhSKSA+PiBDQU5fUkRIMFJfREFUQTRfUG9zKTsKKyAgICBhRGF0YVs1XSA9ICh1aW50OF90KSgoQ0FOX1JESDBSX0RBVEE1ICYgaGNhbi0+SW5zdGFuY2UtPnNGSUZPTWFpbEJveFtSeEZpZm9dLlJESFIpID4+IENBTl9SREgwUl9EQVRBNV9Qb3MpOworICAgIGFEYXRhWzZdID0gKHVpbnQ4X3QpKChDQU5fUkRIMFJfREFUQTYgJiBoY2FuLT5JbnN0YW5jZS0+c0ZJRk9NYWlsQm94W1J4Rmlmb10uUkRIUikgPj4gQ0FOX1JESDBSX0RBVEE2X1Bvcyk7CisgICAgYURhdGFbN10gPSAodWludDhfdCkoKENBTl9SREgwUl9EQVRBNyAmIGhjYW4tPkluc3RhbmNlLT5zRklGT01haWxCb3hbUnhGaWZvXS5SREhSKSA+PiBDQU5fUkRIMFJfREFUQTdfUG9zKTsKKworICAgIC8qIFJlbGVhc2UgdGhlIEZJRk8gKi8KKyAgICBpZiAoUnhGaWZvID09IENBTl9SWF9GSUZPMCkgLyogUnggZWxlbWVudCBpcyBhc3NpZ25lZCB0byBSeCBGSUZPIDAgKi8KKyAgICB7CisgICAgICAvKiBSZWxlYXNlIFJYIEZJRk8gMCAqLworICAgICAgU0VUX0JJVChoY2FuLT5JbnN0YW5jZS0+UkYwUiwgQ0FOX1JGMFJfUkZPTTApOworICAgIH0KKyAgICBlbHNlIC8qIFJ4IGVsZW1lbnQgaXMgYXNzaWduZWQgdG8gUnggRklGTyAxICovCisgICAgeworICAgICAgLyogUmVsZWFzZSBSWCBGSUZPIDEgKi8KKyAgICAgIFNFVF9CSVQoaGNhbi0+SW5zdGFuY2UtPlJGMVIsIENBTl9SRjFSX1JGT00xKTsKKyAgICB9CisKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgIGhjYW4tPkVycm9yQ29kZSB8PSBIQUxfQ0FOX0VSUk9SX05PVF9JTklUSUFMSVpFRDsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gUnggRklGTyBmaWxsIGxldmVsLgorICAqIEBwYXJhbSAgaGNhbiBwb2ludGVyIHRvIGFuIENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBDQU4uCisgICogQHBhcmFtICBSeEZpZm8gUnggRklGTy4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEBhcmcgQ0FOX3JlY2VpdmVfRklGT19udW1iZXIuCisgICogQHJldHZhbCBOdW1iZXIgb2YgbWVzc2FnZXMgYXZhaWxhYmxlIGluIFJ4IEZJRk8uCisgICovCit1aW50MzJfdCBIQUxfQ0FOX0dldFJ4Rmlmb0ZpbGxMZXZlbChDQU5fSGFuZGxlVHlwZURlZiAqaGNhbiwgdWludDMyX3QgUnhGaWZvKQoreworICB1aW50MzJfdCBmaWxsbGV2ZWwgPSAwVTsKKyAgSEFMX0NBTl9TdGF0ZVR5cGVEZWYgc3RhdGUgPSBoY2FuLT5TdGF0ZTsKKworICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19DQU5fUlhfRklGTyhSeEZpZm8pKTsKKworICBpZiAoKHN0YXRlID09IEhBTF9DQU5fU1RBVEVfUkVBRFkpIHx8CisgICAgICAoc3RhdGUgPT0gSEFMX0NBTl9TVEFURV9MSVNURU5JTkcpKQorICB7CisgICAgaWYgKFJ4RmlmbyA9PSBDQU5fUlhfRklGTzApCisgICAgeworICAgICAgZmlsbGxldmVsID0gaGNhbi0+SW5zdGFuY2UtPlJGMFIgJiBDQU5fUkYwUl9GTVAwOworICAgIH0KKyAgICBlbHNlIC8qIFJ4RmlmbyA9PSBDQU5fUlhfRklGTzEgKi8KKyAgICB7CisgICAgICBmaWxsbGV2ZWwgPSBoY2FuLT5JbnN0YW5jZS0+UkYxUiAmIENBTl9SRjFSX0ZNUDE7CisgICAgfQorICB9CisKKyAgLyogUmV0dXJuIFJ4IEZJRk8gZmlsbCBsZXZlbCAqLworICByZXR1cm4gZmlsbGxldmVsOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENBTl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IEludGVycnVwdHMgbWFuYWdlbWVudAorICogIEBicmllZiAgICBJbnRlcnJ1cHRzIG1hbmFnZW1lbnQKKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEludGVycnVwdHMgbWFuYWdlbWVudCAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIEhBTF9DQU5fQWN0aXZhdGVOb3RpZmljYXRpb24gICAgICA6IEVuYWJsZSBpbnRlcnJ1cHRzCisgICAgICAoKykgSEFMX0NBTl9EZWFjdGl2YXRlTm90aWZpY2F0aW9uICAgIDogRGlzYWJsZSBpbnRlcnJ1cHRzCisgICAgICAoKykgSEFMX0NBTl9JUlFIYW5kbGVyICAgICAgICAgICAgICAgIDogSGFuZGxlcyBDQU4gaW50ZXJydXB0IHJlcXVlc3QKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgaW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIGhjYW4gcG9pbnRlciB0byBhbiBDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQ0FOLgorICAqIEBwYXJhbSAgQWN0aXZlSVRzIGluZGljYXRlcyB3aGljaCBpbnRlcnJ1cHRzIHdpbGwgYmUgZW5hYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgQGFyZyBDQU5fSW50ZXJydXB0cy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DQU5fQWN0aXZhdGVOb3RpZmljYXRpb24oQ0FOX0hhbmRsZVR5cGVEZWYgKmhjYW4sIHVpbnQzMl90IEFjdGl2ZUlUcykKK3sKKyAgSEFMX0NBTl9TdGF0ZVR5cGVEZWYgc3RhdGUgPSBoY2FuLT5TdGF0ZTsKKworICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19DQU5fSVQoQWN0aXZlSVRzKSk7CisKKyAgaWYgKChzdGF0ZSA9PSBIQUxfQ0FOX1NUQVRFX1JFQURZKSB8fAorICAgICAgKHN0YXRlID09IEhBTF9DQU5fU1RBVEVfTElTVEVOSU5HKSkKKyAgeworICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgaW50ZXJydXB0cyAqLworICAgIF9fSEFMX0NBTl9FTkFCTEVfSVQoaGNhbiwgQWN0aXZlSVRzKTsKKworICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovCisgICAgaGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9DQU5fRVJST1JfTk9UX0lOSVRJQUxJWkVEOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgaW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIGhjYW4gcG9pbnRlciB0byBhbiBDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQ0FOLgorICAqIEBwYXJhbSAgSW5hY3RpdmVJVHMgaW5kaWNhdGVzIHdoaWNoIGludGVycnVwdHMgd2lsbCBiZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgQGFyZyBDQU5fSW50ZXJydXB0cy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DQU5fRGVhY3RpdmF0ZU5vdGlmaWNhdGlvbihDQU5fSGFuZGxlVHlwZURlZiAqaGNhbiwgdWludDMyX3QgSW5hY3RpdmVJVHMpCit7CisgIEhBTF9DQU5fU3RhdGVUeXBlRGVmIHN0YXRlID0gaGNhbi0+U3RhdGU7CisKKyAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0lUKEluYWN0aXZlSVRzKSk7CisKKyAgaWYgKChzdGF0ZSA9PSBIQUxfQ0FOX1NUQVRFX1JFQURZKSB8fAorICAgICAgKHN0YXRlID09IEhBTF9DQU5fU1RBVEVfTElTVEVOSU5HKSkKKyAgeworICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIGludGVycnVwdHMgKi8KKyAgICBfX0hBTF9DQU5fRElTQUJMRV9JVChoY2FuLCBJbmFjdGl2ZUlUcyk7CisKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgIGhjYW4tPkVycm9yQ29kZSB8PSBIQUxfQ0FOX0VSUk9SX05PVF9JTklUSUFMSVpFRDsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGVzIENBTiBpbnRlcnJ1cHQgcmVxdWVzdAorICAqIEBwYXJhbSAgaGNhbiBwb2ludGVyIHRvIGEgQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIENBTi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0NBTl9JUlFIYW5kbGVyKENBTl9IYW5kbGVUeXBlRGVmICpoY2FuKQoreworICB1aW50MzJfdCBlcnJvcmNvZGUgPSBIQUxfQ0FOX0VSUk9SX05PTkU7CisgIHVpbnQzMl90IGludGVycnVwdHMgPSBSRUFEX1JFRyhoY2FuLT5JbnN0YW5jZS0+SUVSKTsKKyAgdWludDMyX3QgbXNyZmxhZ3MgPSBSRUFEX1JFRyhoY2FuLT5JbnN0YW5jZS0+TVNSKTsKKyAgdWludDMyX3QgdHNyZmxhZ3MgPSBSRUFEX1JFRyhoY2FuLT5JbnN0YW5jZS0+VFNSKTsKKyAgdWludDMyX3QgcmYwcmZsYWdzID0gUkVBRF9SRUcoaGNhbi0+SW5zdGFuY2UtPlJGMFIpOworICB1aW50MzJfdCByZjFyZmxhZ3MgPSBSRUFEX1JFRyhoY2FuLT5JbnN0YW5jZS0+UkYxUik7CisgIHVpbnQzMl90IGVzcmZsYWdzID0gUkVBRF9SRUcoaGNhbi0+SW5zdGFuY2UtPkVTUik7CisKKyAgLyogVHJhbnNtaXQgTWFpbGJveCBlbXB0eSBpbnRlcnJ1cHQgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgaWYgKChpbnRlcnJ1cHRzICYgQ0FOX0lUX1RYX01BSUxCT1hfRU1QVFkpICE9IDBVKQorICB7CisgICAgLyogVHJhbnNtaXQgTWFpbGJveCAwIG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKCh0c3JmbGFncyAmIENBTl9UU1JfUlFDUDApICE9IDBVKQorICAgIHsKKyAgICAgIC8qIENsZWFyIHRoZSBUcmFuc21pc3Npb24gQ29tcGxldGUgZmxhZyAoYW5kIFRYT0swLEFMU1QwLFRFUlIwIGJpdHMpICovCisgICAgICBfX0hBTF9DQU5fQ0xFQVJfRkxBRyhoY2FuLCBDQU5fRkxBR19SUUNQMCk7CisKKyAgICAgIGlmICgodHNyZmxhZ3MgJiBDQU5fVFNSX1RYT0swKSAhPSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogVHJhbnNtaXNzaW9uIE1haWxib3ggMCBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgICAvKiBDYWxsIHdlYWsgKHN1cmNoYXJnZWQpIGNhbGxiYWNrICovCisgICAgICAgIEhBTF9DQU5fVHhNYWlsYm94MENvbXBsZXRlQ2FsbGJhY2soaGNhbik7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmICgodHNyZmxhZ3MgJiBDQU5fVFNSX0FMU1QwKSAhPSAwVSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovCisgICAgICAgICAgZXJyb3Jjb2RlIHw9IEhBTF9DQU5fRVJST1JfVFhfQUxTVDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKHRzcmZsYWdzICYgQ0FOX1RTUl9URVJSMCkgIT0gMFUpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgICAgICAgIGVycm9yY29kZSB8PSBIQUxfQ0FOX0VSUk9SX1RYX1RFUlIwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIFRyYW5zbWlzc2lvbiBNYWlsYm94IDAgYWJvcnQgY2FsbGJhY2sgKi8KKyAgICAgICAgICAvKiBDYWxsIHdlYWsgKHN1cmNoYXJnZWQpIGNhbGxiYWNrICovCisgICAgICAgICAgSEFMX0NBTl9UeE1haWxib3gwQWJvcnRDYWxsYmFjayhoY2FuKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIFRyYW5zbWl0IE1haWxib3ggMSBtYW5hZ2VtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmICgodHNyZmxhZ3MgJiBDQU5fVFNSX1JRQ1AxKSAhPSAwVSkKKyAgICB7CisgICAgICAvKiBDbGVhciB0aGUgVHJhbnNtaXNzaW9uIENvbXBsZXRlIGZsYWcgKGFuZCBUWE9LMSxBTFNUMSxURVJSMSBiaXRzKSAqLworICAgICAgX19IQUxfQ0FOX0NMRUFSX0ZMQUcoaGNhbiwgQ0FOX0ZMQUdfUlFDUDEpOworCisgICAgICBpZiAoKHRzcmZsYWdzICYgQ0FOX1RTUl9UWE9LMSkgIT0gMFUpCisgICAgICB7CisgICAgICAgIC8qIFRyYW5zbWlzc2lvbiBNYWlsYm94IDEgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgICAgLyogQ2FsbCB3ZWFrIChzdXJjaGFyZ2VkKSBjYWxsYmFjayAqLworICAgICAgICBIQUxfQ0FOX1R4TWFpbGJveDFDb21wbGV0ZUNhbGxiYWNrKGhjYW4pOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBpZiAoKHRzcmZsYWdzICYgQ0FOX1RTUl9BTFNUMSkgIT0gMFUpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgICAgICAgIGVycm9yY29kZSB8PSBIQUxfQ0FOX0VSUk9SX1RYX0FMU1QxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCh0c3JmbGFncyAmIENBTl9UU1JfVEVSUjEpICE9IDBVKQorICAgICAgICB7CisgICAgICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgICBlcnJvcmNvZGUgfD0gSEFMX0NBTl9FUlJPUl9UWF9URVJSMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBUcmFuc21pc3Npb24gTWFpbGJveCAxIGFib3J0IGNhbGxiYWNrICovCisgICAgICAgICAgLyogQ2FsbCB3ZWFrIChzdXJjaGFyZ2VkKSBjYWxsYmFjayAqLworICAgICAgICAgIEhBTF9DQU5fVHhNYWlsYm94MUFib3J0Q2FsbGJhY2soaGNhbik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBUcmFuc21pdCBNYWlsYm94IDIgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAoKHRzcmZsYWdzICYgQ0FOX1RTUl9SUUNQMikgIT0gMFUpCisgICAgeworICAgICAgLyogQ2xlYXIgdGhlIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBmbGFnIChhbmQgVFhPSzIsQUxTVDIsVEVSUjIgYml0cykgKi8KKyAgICAgIF9fSEFMX0NBTl9DTEVBUl9GTEFHKGhjYW4sIENBTl9GTEFHX1JRQ1AyKTsKKworICAgICAgaWYgKCh0c3JmbGFncyAmIENBTl9UU1JfVFhPSzIpICE9IDBVKQorICAgICAgeworICAgICAgICAvKiBUcmFuc21pc3Npb24gTWFpbGJveCAyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICAgIC8qIENhbGwgd2VhayAoc3VyY2hhcmdlZCkgY2FsbGJhY2sgKi8KKyAgICAgICAgSEFMX0NBTl9UeE1haWxib3gyQ29tcGxldGVDYWxsYmFjayhoY2FuKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaWYgKCh0c3JmbGFncyAmIENBTl9UU1JfQUxTVDIpICE9IDBVKQorICAgICAgICB7CisgICAgICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgICBlcnJvcmNvZGUgfD0gSEFMX0NBTl9FUlJPUl9UWF9BTFNUMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgodHNyZmxhZ3MgJiBDQU5fVFNSX1RFUlIyKSAhPSAwVSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovCisgICAgICAgICAgZXJyb3Jjb2RlIHw9IEhBTF9DQU5fRVJST1JfVFhfVEVSUjI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogVHJhbnNtaXNzaW9uIE1haWxib3ggMiBhYm9ydCBjYWxsYmFjayAqLworICAgICAgICAgIC8qIENhbGwgd2VhayAoc3VyY2hhcmdlZCkgY2FsbGJhY2sgKi8KKyAgICAgICAgICBIQUxfQ0FOX1R4TWFpbGJveDJBYm9ydENhbGxiYWNrKGhjYW4pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogUmVjZWl2ZSBGSUZPIDAgb3ZlcnJ1biBpbnRlcnJ1cHQgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgaWYgKChpbnRlcnJ1cHRzICYgQ0FOX0lUX1JYX0ZJRk8wX09WRVJSVU4pICE9IDBVKQorICB7CisgICAgaWYgKChyZjByZmxhZ3MgJiBDQU5fUkYwUl9GT1ZSMCkgIT0gMFUpCisgICAgeworICAgICAgLyogU2V0IENBTiBlcnJvciBjb2RlIHRvIFJ4IEZpZm8gMCBvdmVycnVuIGVycm9yICovCisgICAgICBlcnJvcmNvZGUgfD0gSEFMX0NBTl9FUlJPUl9SWF9GT1YwOworCisgICAgICAvKiBDbGVhciBGSUZPMCBPdmVycnVuIEZsYWcgKi8KKyAgICAgIF9fSEFMX0NBTl9DTEVBUl9GTEFHKGhjYW4sIENBTl9GTEFHX0ZPVjApOworICAgIH0KKyAgfQorCisgIC8qIFJlY2VpdmUgRklGTyAwIGZ1bGwgaW50ZXJydXB0IG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIGlmICgoaW50ZXJydXB0cyAmIENBTl9JVF9SWF9GSUZPMF9GVUxMKSAhPSAwVSkKKyAgeworICAgIGlmICgocmYwcmZsYWdzICYgQ0FOX1JGMFJfRlVMTDApICE9IDBVKQorICAgIHsKKyAgICAgIC8qIENsZWFyIEZJRk8gMCBmdWxsIEZsYWcgKi8KKyAgICAgIF9fSEFMX0NBTl9DTEVBUl9GTEFHKGhjYW4sIENBTl9GTEFHX0ZGMCk7CisKKyAgICAgIC8qIFJlY2VpdmUgRklGTyAwIGZ1bGwgQ2FsbGJhY2sgKi8KKyAgICAgIC8qIENhbGwgd2VhayAoc3VyY2hhcmdlZCkgY2FsbGJhY2sgKi8KKyAgICAgIEhBTF9DQU5fUnhGaWZvMEZ1bGxDYWxsYmFjayhoY2FuKTsKKyAgICB9CisgIH0KKworICAvKiBSZWNlaXZlIEZJRk8gMCBtZXNzYWdlIHBlbmRpbmcgaW50ZXJydXB0IG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqLworICBpZiAoKGludGVycnVwdHMgJiBDQU5fSVRfUlhfRklGTzBfTVNHX1BFTkRJTkcpICE9IDBVKQorICB7CisgICAgLyogQ2hlY2sgaWYgbWVzc2FnZSBpcyBzdGlsbCBwZW5kaW5nICovCisgICAgaWYgKChoY2FuLT5JbnN0YW5jZS0+UkYwUiAmIENBTl9SRjBSX0ZNUDApICE9IDBVKQorICAgIHsKKyAgICAgIC8qIFJlY2VpdmUgRklGTyAwIG1lc2FnZSBwZW5kaW5nIENhbGxiYWNrICovCisgICAgICAvKiBDYWxsIHdlYWsgKHN1cmNoYXJnZWQpIGNhbGxiYWNrICovCisgICAgICBIQUxfQ0FOX1J4RmlmbzBNc2dQZW5kaW5nQ2FsbGJhY2soaGNhbik7CisgICAgfQorICB9CisKKyAgLyogUmVjZWl2ZSBGSUZPIDEgb3ZlcnJ1biBpbnRlcnJ1cHQgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgaWYgKChpbnRlcnJ1cHRzICYgQ0FOX0lUX1JYX0ZJRk8xX09WRVJSVU4pICE9IDBVKQorICB7CisgICAgaWYgKChyZjFyZmxhZ3MgJiBDQU5fUkYxUl9GT1ZSMSkgIT0gMFUpCisgICAgeworICAgICAgLyogU2V0IENBTiBlcnJvciBjb2RlIHRvIFJ4IEZpZm8gMSBvdmVycnVuIGVycm9yICovCisgICAgICBlcnJvcmNvZGUgfD0gSEFMX0NBTl9FUlJPUl9SWF9GT1YxOworCisgICAgICAvKiBDbGVhciBGSUZPMSBPdmVycnVuIEZsYWcgKi8KKyAgICAgIF9fSEFMX0NBTl9DTEVBUl9GTEFHKGhjYW4sIENBTl9GTEFHX0ZPVjEpOworICAgIH0KKyAgfQorCisgIC8qIFJlY2VpdmUgRklGTyAxIGZ1bGwgaW50ZXJydXB0IG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIGlmICgoaW50ZXJydXB0cyAmIENBTl9JVF9SWF9GSUZPMV9GVUxMKSAhPSAwVSkKKyAgeworICAgIGlmICgocmYxcmZsYWdzICYgQ0FOX1JGMVJfRlVMTDEpICE9IDBVKQorICAgIHsKKyAgICAgIC8qIENsZWFyIEZJRk8gMSBmdWxsIEZsYWcgKi8KKyAgICAgIF9fSEFMX0NBTl9DTEVBUl9GTEFHKGhjYW4sIENBTl9GTEFHX0ZGMSk7CisKKyAgICAgIC8qIFJlY2VpdmUgRklGTyAxIGZ1bGwgQ2FsbGJhY2sgKi8KKyAgICAgIC8qIENhbGwgd2VhayAoc3VyY2hhcmdlZCkgY2FsbGJhY2sgKi8KKyAgICAgIEhBTF9DQU5fUnhGaWZvMUZ1bGxDYWxsYmFjayhoY2FuKTsKKyAgICB9CisgIH0KKworICAvKiBSZWNlaXZlIEZJRk8gMSBtZXNzYWdlIHBlbmRpbmcgaW50ZXJydXB0IG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqLworICBpZiAoKGludGVycnVwdHMgJiBDQU5fSVRfUlhfRklGTzFfTVNHX1BFTkRJTkcpICE9IDBVKQorICB7CisgICAgLyogQ2hlY2sgaWYgbWVzc2FnZSBpcyBzdGlsbCBwZW5kaW5nICovCisgICAgaWYgKChoY2FuLT5JbnN0YW5jZS0+UkYxUiAmIENBTl9SRjFSX0ZNUDEpICE9IDBVKQorICAgIHsKKyAgICAgIC8qIFJlY2VpdmUgRklGTyAxIG1lc2FnZSBwZW5kaW5nIENhbGxiYWNrICovCisgICAgICAvKiBDYWxsIHdlYWsgKHN1cmNoYXJnZWQpIGNhbGxiYWNrICovCisgICAgICBIQUxfQ0FOX1J4RmlmbzFNc2dQZW5kaW5nQ2FsbGJhY2soaGNhbik7CisgICAgfQorICB9CisKKyAgLyogU2xlZXAgaW50ZXJydXB0IG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICBpZiAoKGludGVycnVwdHMgJiBDQU5fSVRfU0xFRVBfQUNLKSAhPSAwVSkKKyAgeworICAgIGlmICgobXNyZmxhZ3MgJiBDQU5fTVNSX1NMQUtJKSAhPSAwVSkKKyAgICB7CisgICAgICAvKiBDbGVhciBTbGVlcCBpbnRlcnJ1cHQgRmxhZyAqLworICAgICAgX19IQUxfQ0FOX0NMRUFSX0ZMQUcoaGNhbiwgQ0FOX0ZMQUdfU0xBS0kpOworCisgICAgICAvKiBTbGVlcCBDYWxsYmFjayAqLworICAgICAgLyogQ2FsbCB3ZWFrIChzdXJjaGFyZ2VkKSBjYWxsYmFjayAqLworICAgICAgSEFMX0NBTl9TbGVlcENhbGxiYWNrKGhjYW4pOworICAgIH0KKyAgfQorCisgIC8qIFdha2VVcCBpbnRlcnJ1cHQgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIGlmICgoaW50ZXJydXB0cyAmIENBTl9JVF9XQUtFVVApICE9IDBVKQorICB7CisgICAgaWYgKChtc3JmbGFncyAmIENBTl9NU1JfV0tVSSkgIT0gMFUpCisgICAgeworICAgICAgLyogQ2xlYXIgV2FrZVVwIEZsYWcgKi8KKyAgICAgIF9fSEFMX0NBTl9DTEVBUl9GTEFHKGhjYW4sIENBTl9GTEFHX1dLVSk7CisKKyAgICAgIC8qIFdha2VVcCBDYWxsYmFjayAqLworICAgICAgLyogQ2FsbCB3ZWFrIChzdXJjaGFyZ2VkKSBjYWxsYmFjayAqLworICAgICAgSEFMX0NBTl9XYWtlVXBGcm9tUnhNc2dDYWxsYmFjayhoY2FuKTsKKyAgICB9CisgIH0KKworICAvKiBFcnJvciBpbnRlcnJ1cHRzIG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICBpZiAoKGludGVycnVwdHMgJiBDQU5fSVRfRVJST1IpICE9IDBVKQorICB7CisgICAgaWYgKChtc3JmbGFncyAmIENBTl9NU1JfRVJSSSkgIT0gMFUpCisgICAgeworICAgICAgLyogQ2hlY2sgRXJyb3IgV2FybmluZyBGbGFnICovCisgICAgICBpZiAoKChpbnRlcnJ1cHRzICYgQ0FOX0lUX0VSUk9SX1dBUk5JTkcpICE9IDBVKSAmJgorICAgICAgICAgICgoZXNyZmxhZ3MgJiBDQU5fRVNSX0VXR0YpICE9IDBVKSkKKyAgICAgIHsKKyAgICAgICAgLyogU2V0IENBTiBlcnJvciBjb2RlIHRvIEVycm9yIFdhcm5pbmcgKi8KKyAgICAgICAgZXJyb3Jjb2RlIHw9IEhBTF9DQU5fRVJST1JfRVdHOworCisgICAgICAgIC8qIE5vIG5lZWQgZm9yIGNsZWFyIG9mIEVycm9yIFdhcm5pbmcgRmxhZyBhcyByZWFkLW9ubHkgKi8KKyAgICAgIH0KKworICAgICAgLyogQ2hlY2sgRXJyb3IgUGFzc2l2ZSBGbGFnICovCisgICAgICBpZiAoKChpbnRlcnJ1cHRzICYgQ0FOX0lUX0VSUk9SX1BBU1NJVkUpICE9IDBVKSAmJgorICAgICAgICAgICgoZXNyZmxhZ3MgJiBDQU5fRVNSX0VQVkYpICE9IDBVKSkKKyAgICAgIHsKKyAgICAgICAgLyogU2V0IENBTiBlcnJvciBjb2RlIHRvIEVycm9yIFBhc3NpdmUgKi8KKyAgICAgICAgZXJyb3Jjb2RlIHw9IEhBTF9DQU5fRVJST1JfRVBWOworCisgICAgICAgIC8qIE5vIG5lZWQgZm9yIGNsZWFyIG9mIEVycm9yIFBhc3NpdmUgRmxhZyBhcyByZWFkLW9ubHkgKi8KKyAgICAgIH0KKworICAgICAgLyogQ2hlY2sgQnVzLW9mZiBGbGFnICovCisgICAgICBpZiAoKChpbnRlcnJ1cHRzICYgQ0FOX0lUX0JVU09GRikgIT0gMFUpICYmCisgICAgICAgICAgKChlc3JmbGFncyAmIENBTl9FU1JfQk9GRikgIT0gMFUpKQorICAgICAgeworICAgICAgICAvKiBTZXQgQ0FOIGVycm9yIGNvZGUgdG8gQnVzLU9mZiAqLworICAgICAgICBlcnJvcmNvZGUgfD0gSEFMX0NBTl9FUlJPUl9CT0Y7CisKKyAgICAgICAgLyogTm8gbmVlZCBmb3IgY2xlYXIgb2YgRXJyb3IgQnVzLU9mZiBhcyByZWFkLW9ubHkgKi8KKyAgICAgIH0KKworICAgICAgLyogQ2hlY2sgTGFzdCBFcnJvciBDb2RlIEZsYWcgKi8KKyAgICAgIGlmICgoKGludGVycnVwdHMgJiBDQU5fSVRfTEFTVF9FUlJPUl9DT0RFKSAhPSAwVSkgJiYKKyAgICAgICAgICAoKGVzcmZsYWdzICYgQ0FOX0VTUl9MRUMpICE9IDBVKSkKKyAgICAgIHsKKyAgICAgICAgc3dpdGNoIChlc3JmbGFncyAmIENBTl9FU1JfTEVDKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSAoQ0FOX0VTUl9MRUNfMCk6CisgICAgICAgICAgICAvKiBTZXQgQ0FOIGVycm9yIGNvZGUgdG8gU3R1ZmYgZXJyb3IgKi8KKyAgICAgICAgICAgIGVycm9yY29kZSB8PSBIQUxfQ0FOX0VSUk9SX1NURjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgKENBTl9FU1JfTEVDXzEpOgorICAgICAgICAgICAgLyogU2V0IENBTiBlcnJvciBjb2RlIHRvIEZvcm0gZXJyb3IgKi8KKyAgICAgICAgICAgIGVycm9yY29kZSB8PSBIQUxfQ0FOX0VSUk9SX0ZPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgKENBTl9FU1JfTEVDXzEgfCBDQU5fRVNSX0xFQ18wKToKKyAgICAgICAgICAgIC8qIFNldCBDQU4gZXJyb3IgY29kZSB0byBBY2tub3dsZWRnZW1lbnQgZXJyb3IgKi8KKyAgICAgICAgICAgIGVycm9yY29kZSB8PSBIQUxfQ0FOX0VSUk9SX0FDSzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgKENBTl9FU1JfTEVDXzIpOgorICAgICAgICAgICAgLyogU2V0IENBTiBlcnJvciBjb2RlIHRvIEJpdCByZWNlc3NpdmUgZXJyb3IgKi8KKyAgICAgICAgICAgIGVycm9yY29kZSB8PSBIQUxfQ0FOX0VSUk9SX0JSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAoQ0FOX0VTUl9MRUNfMiB8IENBTl9FU1JfTEVDXzApOgorICAgICAgICAgICAgLyogU2V0IENBTiBlcnJvciBjb2RlIHRvIEJpdCBEb21pbmFudCBlcnJvciAqLworICAgICAgICAgICAgZXJyb3Jjb2RlIHw9IEhBTF9DQU5fRVJST1JfQkQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIChDQU5fRVNSX0xFQ18yIHwgQ0FOX0VTUl9MRUNfMSk6CisgICAgICAgICAgICAvKiBTZXQgQ0FOIGVycm9yIGNvZGUgdG8gQ1JDIGVycm9yICovCisgICAgICAgICAgICBlcnJvcmNvZGUgfD0gSEFMX0NBTl9FUlJPUl9DUkM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBDbGVhciBMYXN0IGVycm9yIGNvZGUgRmxhZyAqLworICAgICAgICBDTEVBUl9CSVQoaGNhbi0+SW5zdGFuY2UtPkVTUiwgQ0FOX0VTUl9MRUMpOworICAgICAgfQorICAgIH0KKworICAgIC8qIENsZWFyIEVSUkkgRmxhZyAqLworICAgIF9fSEFMX0NBTl9DTEVBUl9GTEFHKGhjYW4sIENBTl9GTEFHX0VSUkkpOworICB9CisKKyAgLyogQ2FsbCB0aGUgRXJyb3IgY2FsbCBCYWNrIGluIGNhc2Ugb2YgRXJyb3JzICovCisgIGlmIChlcnJvcmNvZGUgIT0gSEFMX0NBTl9FUlJPUl9OT05FKQorICB7CisgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgaW4gaGFuZGxlICovCisgICAgaGNhbi0+RXJyb3JDb2RlIHw9IGVycm9yY29kZTsKKworICAgIC8qIENhbGwgRXJyb3IgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKyAgICAvKiBDYWxsIHdlYWsgKHN1cmNoYXJnZWQpIGNhbGxiYWNrICovCisgICAgSEFMX0NBTl9FcnJvckNhbGxiYWNrKGhjYW4pOworICB9Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ0FOX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDUgQ2FsbGJhY2sgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgQ0FOIENhbGxiYWNrIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgQ2FsbGJhY2sgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBjYWxsYmFjayBmdW5jdGlvbnM6CisgICAgICAoKykgSEFMX0NBTl9UeE1haWxib3gwQ29tcGxldGVDYWxsYmFjaworICAgICAgKCspIEhBTF9DQU5fVHhNYWlsYm94MUNvbXBsZXRlQ2FsbGJhY2sKKyAgICAgICgrKSBIQUxfQ0FOX1R4TWFpbGJveDJDb21wbGV0ZUNhbGxiYWNrCisgICAgICAoKykgSEFMX0NBTl9UeE1haWxib3gwQWJvcnRDYWxsYmFjaworICAgICAgKCspIEhBTF9DQU5fVHhNYWlsYm94MUFib3J0Q2FsbGJhY2sKKyAgICAgICgrKSBIQUxfQ0FOX1R4TWFpbGJveDJBYm9ydENhbGxiYWNrCisgICAgICAoKykgSEFMX0NBTl9SeEZpZm8wTXNnUGVuZGluZ0NhbGxiYWNrCisgICAgICAoKykgSEFMX0NBTl9SeEZpZm8wRnVsbENhbGxiYWNrCisgICAgICAoKykgSEFMX0NBTl9SeEZpZm8xTXNnUGVuZGluZ0NhbGxiYWNrCisgICAgICAoKykgSEFMX0NBTl9SeEZpZm8xRnVsbENhbGxiYWNrCisgICAgICAoKykgSEFMX0NBTl9TbGVlcENhbGxiYWNrCisgICAgICAoKykgSEFMX0NBTl9XYWtlVXBGcm9tUnhNc2dDYWxsYmFjaworICAgICAgKCspIEhBTF9DQU5fRXJyb3JDYWxsYmFjaworCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFRyYW5zbWlzc2lvbiBNYWlsYm94IDAgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoY2FuIHBvaW50ZXIgdG8gYSBDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQ0FOLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0NBTl9UeE1haWxib3gwQ29tcGxldGVDYWxsYmFjayhDQU5fSGFuZGxlVHlwZURlZiAqaGNhbikKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGNhbik7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9DQU5fVHhNYWlsYm94MENvbXBsZXRlQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlCisgICAgICAgICAgICB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXNzaW9uIE1haWxib3ggMSBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhjYW4gcG9pbnRlciB0byBhIENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBDQU4uCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQ0FOX1R4TWFpbGJveDFDb21wbGV0ZUNhbGxiYWNrKENBTl9IYW5kbGVUeXBlRGVmICpoY2FuKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoY2FuKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0NBTl9UeE1haWxib3gxQ29tcGxldGVDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUKKyAgICAgICAgICAgIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pc3Npb24gTWFpbGJveCAyIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGNhbiBwb2ludGVyIHRvIGEgQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIENBTi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9DQU5fVHhNYWlsYm94MkNvbXBsZXRlQ2FsbGJhY2soQ0FOX0hhbmRsZVR5cGVEZWYgKmhjYW4pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhjYW4pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfQ0FOX1R4TWFpbGJveDJDb21wbGV0ZUNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZQorICAgICAgICAgICAgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFRyYW5zbWlzc2lvbiBNYWlsYm94IDAgQ2FuY2VsbGF0aW9uIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGNhbiBwb2ludGVyIHRvIGFuIENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBDQU4uCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQ0FOX1R4TWFpbGJveDBBYm9ydENhbGxiYWNrKENBTl9IYW5kbGVUeXBlRGVmICpoY2FuKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoY2FuKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0NBTl9UeE1haWxib3gwQWJvcnRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUKKyAgICAgICAgICAgIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pc3Npb24gTWFpbGJveCAxIENhbmNlbGxhdGlvbiBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhjYW4gcG9pbnRlciB0byBhbiBDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQ0FOLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0NBTl9UeE1haWxib3gxQWJvcnRDYWxsYmFjayhDQU5fSGFuZGxlVHlwZURlZiAqaGNhbikKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGNhbik7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9DQU5fVHhNYWlsYm94MUFib3J0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlCisgICAgICAgICAgICB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXNzaW9uIE1haWxib3ggMiBDYW5jZWxsYXRpb24gY2FsbGJhY2suCisgICogQHBhcmFtICBoY2FuIHBvaW50ZXIgdG8gYW4gQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIENBTi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9DQU5fVHhNYWlsYm94MkFib3J0Q2FsbGJhY2soQ0FOX0hhbmRsZVR5cGVEZWYgKmhjYW4pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhjYW4pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfQ0FOX1R4TWFpbGJveDJBYm9ydENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZQorICAgICAgICAgICAgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFJ4IEZJRk8gMCBtZXNzYWdlIHBlbmRpbmcgY2FsbGJhY2suCisgICogQHBhcmFtICBoY2FuIHBvaW50ZXIgdG8gYSBDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQ0FOLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0NBTl9SeEZpZm8wTXNnUGVuZGluZ0NhbGxiYWNrKENBTl9IYW5kbGVUeXBlRGVmICpoY2FuKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoY2FuKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0NBTl9SeEZpZm8wTXNnUGVuZGluZ0NhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZQorICAgICAgICAgICAgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFJ4IEZJRk8gMCBmdWxsIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGNhbiBwb2ludGVyIHRvIGEgQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIENBTi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9DQU5fUnhGaWZvMEZ1bGxDYWxsYmFjayhDQU5fSGFuZGxlVHlwZURlZiAqaGNhbikKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGNhbik7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9DQU5fUnhGaWZvMEZ1bGxDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlcgorICAgICAgICAgICAgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBSeCBGSUZPIDEgbWVzc2FnZSBwZW5kaW5nIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGNhbiBwb2ludGVyIHRvIGEgQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIENBTi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9DQU5fUnhGaWZvMU1zZ1BlbmRpbmdDYWxsYmFjayhDQU5fSGFuZGxlVHlwZURlZiAqaGNhbikKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGNhbik7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9DQU5fUnhGaWZvMU1zZ1BlbmRpbmdDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUKKyAgICAgICAgICAgIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBSeCBGSUZPIDEgZnVsbCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhjYW4gcG9pbnRlciB0byBhIENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBDQU4uCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQ0FOX1J4RmlmbzFGdWxsQ2FsbGJhY2soQ0FOX0hhbmRsZVR5cGVEZWYgKmhjYW4pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhjYW4pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfQ0FOX1J4RmlmbzFGdWxsQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIKKyAgICAgICAgICAgIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgU2xlZXAgY2FsbGJhY2suCisgICogQHBhcmFtICBoY2FuIHBvaW50ZXIgdG8gYSBDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQ0FOLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0NBTl9TbGVlcENhbGxiYWNrKENBTl9IYW5kbGVUeXBlRGVmICpoY2FuKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoY2FuKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0NBTl9TbGVlcENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgV2FrZVVwIGZyb20gUnggbWVzc2FnZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhjYW4gcG9pbnRlciB0byBhIENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBDQU4uCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQ0FOX1dha2VVcEZyb21SeE1zZ0NhbGxiYWNrKENBTl9IYW5kbGVUeXBlRGVmICpoY2FuKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoY2FuKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0NBTl9XYWtlVXBGcm9tUnhNc2dDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUKKyAgICAgICAgICAgIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBFcnJvciBDQU4gY2FsbGJhY2suCisgICogQHBhcmFtICBoY2FuIHBvaW50ZXIgdG8gYSBDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQ0FOLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0NBTl9FcnJvckNhbGxiYWNrKENBTl9IYW5kbGVUeXBlRGVmICpoY2FuKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoY2FuKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0NBTl9FcnJvckNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ0FOX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDYgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgQ0FOIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIDoKKyAgICAgICgrKSBIQUxfQ0FOX0dldFN0YXRlKCkgIDogUmV0dXJuIHRoZSBDQU4gc3RhdGUuCisgICAgICAoKykgSEFMX0NBTl9HZXRFcnJvcigpICA6IFJldHVybiB0aGUgQ0FOIGVycm9yIGNvZGVzIGlmIGFueS4KKyAgICAgICgrKSBIQUxfQ0FOX1Jlc2V0RXJyb3IoKTogUmVzZXQgdGhlIENBTiBlcnJvciBjb2RlcyBpZiBhbnkuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBDQU4gc3RhdGUuCisgICogQHBhcmFtICBoY2FuIHBvaW50ZXIgdG8gYSBDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQ0FOLgorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfQ0FOX1N0YXRlVHlwZURlZiBIQUxfQ0FOX0dldFN0YXRlKENBTl9IYW5kbGVUeXBlRGVmICpoY2FuKQoreworICBIQUxfQ0FOX1N0YXRlVHlwZURlZiBzdGF0ZSA9IGhjYW4tPlN0YXRlOworCisgIGlmICgoc3RhdGUgPT0gSEFMX0NBTl9TVEFURV9SRUFEWSkgfHwKKyAgICAgIChzdGF0ZSA9PSBIQUxfQ0FOX1NUQVRFX0xJU1RFTklORykpCisgIHsKKyAgICAvKiBDaGVjayBzbGVlcCBtb2RlIGFja25vd2xlZGdlIGZsYWcgKi8KKyAgICBpZiAoKGhjYW4tPkluc3RhbmNlLT5NU1IgJiBDQU5fTVNSX1NMQUspICE9IDBVKQorICAgIHsKKyAgICAgIC8qIFNsZWVwIG1vZGUgaXMgYWN0aXZlICovCisgICAgICBzdGF0ZSA9IEhBTF9DQU5fU1RBVEVfU0xFRVBfQUNUSVZFOworICAgIH0KKyAgICAvKiBDaGVjayBzbGVlcCBtb2RlIHJlcXVlc3QgZmxhZyAqLworICAgIGVsc2UgaWYgKChoY2FuLT5JbnN0YW5jZS0+TUNSICYgQ0FOX01DUl9TTEVFUCkgIT0gMFUpCisgICAgeworICAgICAgLyogU2xlZXAgbW9kZSByZXF1ZXN0IGlzIHBlbmRpbmcgKi8KKyAgICAgIHN0YXRlID0gSEFMX0NBTl9TVEFURV9TTEVFUF9QRU5ESU5HOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogTmVpdGhlciBzbGVlcCBtb2RlIHJlcXVlc3Qgbm9yIHNsZWVwIG1vZGUgYWNrbm93bGVkZ2UgKi8KKyAgICB9CisgIH0KKworICAvKiBSZXR1cm4gQ0FOIHN0YXRlICovCisgIHJldHVybiBzdGF0ZTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIENBTiBlcnJvciBjb2RlLgorICAqIEBwYXJhbSAgaGNhbiBwb2ludGVyIHRvIGEgQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIENBTi4KKyAgKiBAcmV0dmFsIENBTiBFcnJvciBDb2RlCisgICovCit1aW50MzJfdCBIQUxfQ0FOX0dldEVycm9yKENBTl9IYW5kbGVUeXBlRGVmICpoY2FuKQoreworICAvKiBSZXR1cm4gQ0FOIGVycm9yIGNvZGUgKi8KKyAgcmV0dXJuIGhjYW4tPkVycm9yQ29kZTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXNldCB0aGUgQ0FOIGVycm9yIGNvZGUuCisgICogQHBhcmFtICBoY2FuIHBvaW50ZXIgdG8gYSBDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQ0FOLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NBTl9SZXNldEVycm9yKENBTl9IYW5kbGVUeXBlRGVmICpoY2FuKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIEhBTF9DQU5fU3RhdGVUeXBlRGVmIHN0YXRlID0gaGNhbi0+U3RhdGU7CisKKyAgaWYgKChzdGF0ZSA9PSBIQUxfQ0FOX1NUQVRFX1JFQURZKSB8fAorICAgICAgKHN0YXRlID09IEhBTF9DQU5fU1RBVEVfTElTVEVOSU5HKSkKKyAgeworICAgIC8qIFJlc2V0IENBTiBlcnJvciBjb2RlICovCisgICAgaGNhbi0+RXJyb3JDb2RlID0gMFU7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICBoY2FuLT5FcnJvckNvZGUgfD0gSEFMX0NBTl9FUlJPUl9OT1RfSU5JVElBTElaRUQ7CisKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZXR1cm4gdGhlIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX0NBTl9NT0RVTEVfRU5BQkxFRCAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogQ0FOICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmM3h4X2hhbF9jZWMuYyBiL1NyYy9zdG0zMmYzeHhfaGFsX2NlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMzc0NzMKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJmM3h4X2hhbF9jZWMuYwpAQCAtMCwwICsxLDY3MSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfY2VjLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIENFQyBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nIAorICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgSGlnaCBEZWZpbml0aW9uIE11bHRpbWVkaWEgSW50ZXJmYWNlIAorICAqICAgICAgICAgIENvbnN1bWVyIEVsZWN0cm9uaWNzIENvbnRyb2wgUGVyaXBoZXJhbCAoQ0VDKS4KKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKgorICAqICAgICAgICAgICAKKyAgQHZlcmJhdGltICAgICAgIAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoZSBDRUMgSEFMIGRyaXZlciBjYW4gYmUgdXNlZCBhcyBmb2xsb3c6CisgICAgCisgICAgKCMpIERlY2xhcmUgYSBDRUNfSGFuZGxlVHlwZURlZiBoYW5kbGUgc3RydWN0dXJlLgorICAgICgjKSBJbml0aWFsaXplIHRoZSBDRUMgbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIEhBTF9DRUNfTXNwSW5pdCAoKUFQSToKKyAgICAgICAgKCMjKSBFbmFibGUgdGhlIENFQyBpbnRlcmZhY2UgY2xvY2suCisgICAgICAgICgjIykgQ0VDIHBpbnMgY29uZmlndXJhdGlvbjoKKyAgICAgICAgICAgICgrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgQ0VDIEdQSU9zLgorICAgICAgICAgICAgKCspIENvbmZpZ3VyZSB0aGVzZSBDRUMgcGlucyBhcyBhbHRlcm5hdGUgZnVuY3Rpb24gcHVsbC11cC4KKyAgICAgICAgKCMjKSBOVklDIGNvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIGludGVycnVwdCBwcm9jZXNzIChIQUxfQ0VDX1RyYW5zbWl0X0lUKCkKKyAgICAgICAgICAgICBhbmQgSEFMX0NFQ19SZWNlaXZlX0lUKCkgQVBJcyk6CisgICAgICAgICAgICAoKykgQ29uZmlndXJlIHRoZSBDRUMgaW50ZXJydXB0IHByaW9yaXR5LgorICAgICAgICAgICAgKCspIEVuYWJsZSB0aGUgTlZJQyBDRUMgSVJRIGhhbmRsZS4KKyAgICAgICAgICAgIChAKSBUaGUgc3BlY2lmaWMgQ0VDIGludGVycnVwdHMgKFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQsIAorICAgICAgICAgICAgICAgIFJYTkUgaW50ZXJydXB0IGFuZCBFcnJvciBJbnRlcnJ1cHRzKSB3aWxsIGJlIG1hbmFnZWQgdXNpbmcgdGhlIG1hY3JvcworICAgICAgICAgICAgICAgIF9fSEFMX0NFQ19FTkFCTEVfSVQoKSBhbmQgX19IQUxfQ0VDX0RJU0FCTEVfSVQoKSBpbnNpZGUgdGhlIHRyYW5zbWl0IAorICAgICAgICAgICAgICAgIGFuZCByZWNlaXZlIHByb2Nlc3MuCisKKyAgICAoIykgUHJvZ3JhbSB0aGUgU2lnbmFsIEZyZWUgVGltZSAoU0ZUKSBhbmQgU0ZUIG9wdGlvbiwgVG9sZXJhbmNlLCByZWNlcHRpb24gc3RvcCBpbgorICAgICAgICBpbiBjYXNlIG9mIEJpdCBSaXNpbmcgRXJyb3IsIEVycm9yLUJpdCBnZW5lcmF0aW9uIGNvbmRpdGlvbnMsIGRldmljZSBsb2dpY2FsCisgICAgICAgIGFkZHJlc3MgYW5kIExpc3RlbiBtb2RlIGluIHRoZSBoY2VjIEluaXQgc3RydWN0dXJlLgorCisgICAgKCMpIEluaXRpYWxpemUgdGhlIENFQyByZWdpc3RlcnMgYnkgY2FsbGluZyB0aGUgSEFMX0NFQ19Jbml0KCkgQVBJLgorICAgICAgICAKKyAgICAoQCkgVGhpcyBBUEkgKEhBTF9DRUNfSW5pdCgpKSBjb25maWd1cmVzIGFsc28gdGhlIGxvdyBsZXZlbCBIYXJkd2FyZSBHUElPLCBDTE9DSywgQ09SVEVYLi4uZXRjKQorICAgICAgICBieSBjYWxsaW5nIHRoZSBjdXN0b21lZCBIQUxfQ0VDX01zcEluaXQoKSBBUEkuCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX0NFQ19NT0RVTEVfRU5BQkxFRAorCisjaWYgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkgICAKKy8qKiBAZGVmZ3JvdXAgQ0VDIENFQyAKKyAgKiBAYnJpZWYgSEFMIENFQyBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8gCisgIAorLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENFQ19Qcml2YXRlX0NvbnN0YW50cyBDRUMgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworLyoqCisgICogQH0KKyAgKi8KKyAKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ0VDX1ByaXZhdGVfRnVuY3Rpb25zIENFQyBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisvKioKKyAgKiBAfQorICAqLworICAKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIENFQ19FeHBvcnRlZF9GdW5jdGlvbnMgQ0VDIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ0VDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIAorICAqCitAdmVyYmF0aW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGluaXRpYWxpemUgdGhlIENFQworICAgICAgKCspIFRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBuZWVkIHRvIGJlIGNvbmZpZ3VyZWQ6IAorICAgICAgICAoKyspIFNpZ25hbEZyZWVUaW1lCisgICAgICAgICgrKykgVG9sZXJhbmNlIAorICAgICAgICAoKyspIEJSRVJ4U3RvcCAgICAgICAgICAgICAgICAgKFJYIHN0b3BwZWQgb3Igbm90IHVwb24gQml0IFJpc2luZyBFcnJvcikKKyAgICAgICAgKCsrKSBCUkVFcnJvckJpdEdlbiAgICAgICAgICAgIChFcnJvci1CaXQgZ2VuZXJhdGlvbiBpbiBjYXNlIG9mIEJpdCBSaXNpbmcgRXJyb3IpCisgICAgICAgICgrKykgTEJQRUVycm9yQml0R2VuICAgICAgICAgICAoRXJyb3ItQml0IGdlbmVyYXRpb24gaW4gY2FzZSBvZiBMb25nIEJpdCBQZXJpb2QgRXJyb3IpCisgICAgICAgICgrKykgQnJvYWRjYXN0TXNnTm9FcnJvckJpdEdlbiAoRXJyb3ItYml0IGdlbmVyYXRpb24gaW4gY2FzZSBvZiBicm9hZGNhc3QgbWVzc2FnZSBlcnJvcikKKyAgICAgICAgKCsrKSBTaWduYWxGcmVlVGltZU9wdGlvbiAgICAgIChTRlQgVGltZXIgc3RhcnQgZGVmaW5pdGlvbikKKyAgICAgICAgKCsrKSBPd25BZGRyZXNzICAgICAgICAgICAgICAgIChDRUMgZGV2aWNlIGFkZHJlc3MpCisgICAgICAgICgrKykgTGlzdGVuTW9kZQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgSW5pdGlhbGl6ZXMgdGhlIENFQyBtb2RlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBDRUNfSW5pdFR5cGVEZWYgYW5kIGNyZWF0ZXMgdGhlIGFzc29jaWF0ZWQgaGFuZGxlIC4KKyAgKiBAcGFyYW0gaGNlYyBDRUMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ0VDX0luaXQoQ0VDX0hhbmRsZVR5cGVEZWYgKmhjZWMpCit7ICAKKyAgLyogQ2hlY2sgdGhlIENFQyBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZigoaGNlYyA9PSBOVUxMKSB8fChoY2VjLT5Jbml0LlJ4QnVmZmVyID09IE5VTEwpKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovIAorICBhc3NlcnRfcGFyYW0oSVNfQ0VDX0FMTF9JTlNUQU5DRShoY2VjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQ0VDX1NJR05BTEZSRUVUSU1FKGhjZWMtPkluaXQuU2lnbmFsRnJlZVRpbWUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0NFQ19UT0xFUkFOQ0UoaGNlYy0+SW5pdC5Ub2xlcmFuY2UpKTsgIAorICBhc3NlcnRfcGFyYW0oSVNfQ0VDX0JSRVJYU1RPUChoY2VjLT5Jbml0LkJSRVJ4U3RvcCkpOworICBhc3NlcnRfcGFyYW0oSVNfQ0VDX0JSRUVSUk9SQklUR0VOKGhjZWMtPkluaXQuQlJFRXJyb3JCaXRHZW4pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0NFQ19MQlBFRVJST1JCSVRHRU4oaGNlYy0+SW5pdC5MQlBFRXJyb3JCaXRHZW4pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0NFQ19CUk9BRENBU1RFUlJPUl9OT19FUlJPUkJJVF9HRU5FUkFUSU9OKGhjZWMtPkluaXQuQnJvYWRjYXN0TXNnTm9FcnJvckJpdEdlbikpOworICBhc3NlcnRfcGFyYW0oSVNfQ0VDX1NGVE9QKGhjZWMtPkluaXQuU2lnbmFsRnJlZVRpbWVPcHRpb24pKTsgCisgIGFzc2VydF9wYXJhbShJU19DRUNfTElTVEVOSU5HX01PREUoaGNlYy0+SW5pdC5MaXN0ZW5Nb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19DRUNfT1dOX0FERFJFU1MoaGNlYy0+SW5pdC5Pd25BZGRyZXNzKSk7ICAKKworICBpZihoY2VjLT5nU3RhdGUgPT0gSEFMX0NFQ19TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBoY2VjLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLICovCisgICAgSEFMX0NFQ19Nc3BJbml0KGhjZWMpOworICB9CisgIGhjZWMtPmdTdGF0ZSA9IEhBTF9DRUNfU1RBVEVfQlVTWTsKKyAgCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfQ0VDX0RJU0FCTEUoaGNlYyk7CisgIAorICAvKiBXcml0ZSB0byBDRUMgQ29udHJvbCBSZWdpc3RlciAqLworICBoY2VjLT5JbnN0YW5jZS0+Q0ZHUiA9IGhjZWMtPkluaXQuU2lnbmFsRnJlZVRpbWUgfCBoY2VjLT5Jbml0LlRvbGVyYW5jZSB8IGhjZWMtPkluaXQuQlJFUnhTdG9wfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoY2VjLT5Jbml0LkJSRUVycm9yQml0R2VuIHwgaGNlYy0+SW5pdC5MQlBFRXJyb3JCaXRHZW4gfCBoY2VjLT5Jbml0LkJyb2FkY2FzdE1zZ05vRXJyb3JCaXRHZW4gfFwKKwkJCSBoY2VjLT5Jbml0LlNpZ25hbEZyZWVUaW1lT3B0aW9uIHwoKHVpbnQzMl90KShoY2VjLT5Jbml0Lk93bkFkZHJlc3MpPDwxNlUpIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgaGNlYy0+SW5pdC5MaXN0ZW5Nb2RlOworICAKKyAgLyogRW5hYmxlIHRoZSBmb2xsb3dpbmcgQ0VDIFRyYW5zbWlzc2lvbi9SZWNlcHRpb24gaW50ZXJydXB0cyBhcworICAgKiB3ZWxsIGFzIHRoZSBmb2xsb3dpbmcgQ0VDIFRyYW5zbWlzc2lvbi9SZWNlcHRpb24gRXJyb3JzIGludGVycnVwdHMgCisgICAqIFJ4IEJ5dGUgUmVjZWl2ZWQgSVQgCisgICAqIEVuZCBvZiBSZWNlcHRpb24gSVQgCisgICAqIFJ4IG92ZXJydW4KKyAgICogUnggYml0IHJpc2luZyBlcnJvcgorICAgKiBSeCBzaG9ydCBiaXQgcGVyaW9kIGVycm9yCisgICAqIFJ4IGxvbmcgYml0IHBlcmlvZCBlcnJvcgorICAgKiBSeCBtaXNzaW5nIGFja25vd2xlZGdlCisgICAqIFR4IEJ5dGUgUmVxdWVzdCBJVCAKKyAgICogRW5kIG9mIFRyYW5zbWlzc2lvbiBJVAorICAgKiBUeCBNaXNzaW5nIEFja25vd2xlZGdlIElUCisgICAqIFR4LUVycm9yIElUCisgICAqIFR4LUJ1ZmZlciBVbmRlcnJ1biBJVCAKKyAgICogVHggYXJiaXRyYXRpb24gbG9zdCAgICovCisgX19IQUxfQ0VDX0VOQUJMRV9JVChoY2VjLCBDRUNfSVRfUlhCUnxDRUNfSVRfUlhFTkR8Q0VDX0lFUl9SWF9BTExfRVJSfENFQ19JVF9UWEJSfENFQ19JVF9UWEVORHxDRUNfSUVSX1RYX0FMTF9FUlIpOworICAgIAorICAvKiBFbmFibGUgdGhlIENFQyBQZXJpcGhlcmFsICovCisgIF9fSEFMX0NFQ19FTkFCTEUoaGNlYyk7CisgIAorICBoY2VjLT5FcnJvckNvZGUgPSBIQUxfQ0VDX0VSUk9SX05PTkU7CisgIGhjZWMtPmdTdGF0ZSA9IEhBTF9DRUNfU1RBVEVfUkVBRFk7CisgIGhjZWMtPlJ4U3RhdGUgPSBIQUxfQ0VDX1NUQVRFX1JFQURZOworICAKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIERlSW5pdGlhbGl6ZXMgdGhlIENFQyBwZXJpcGhlcmFsIAorICAqIEBwYXJhbSBoY2VjIENFQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DRUNfRGVJbml0KENFQ19IYW5kbGVUeXBlRGVmICpoY2VjKQoreworICAvKiBDaGVjayB0aGUgQ0VDIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmKGhjZWMgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQ0VDX0FMTF9JTlNUQU5DRShoY2VjLT5JbnN0YW5jZSkpOworCisgIGhjZWMtPmdTdGF0ZSA9IEhBTF9DRUNfU1RBVEVfQlVTWTsKKyAgCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIEhBTF9DRUNfTXNwRGVJbml0KGhjZWMpOworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0NFQ19ESVNBQkxFKGhjZWMpOworICAKKyAgLyogQ2xlYXIgRmxhZ3MgKi8KKyAgX19IQUxfQ0VDX0NMRUFSX0ZMQUcoaGNlYyxDRUNfRkxBR19UWEVORHxDRUNfRkxBR19UWEJSfENFQ19GTEFHX1JYQlJ8Q0VDX0ZMQUdfUlhFTkR8Q0VDX0lTUl9BTExfRVJST1IpOworICAKKyAgLyogRGlzYWJsZSB0aGUgZm9sbG93aW5nIENFQyBUcmFuc21pc3Npb24vUmVjZXB0aW9uIGludGVycnVwdHMgYXMKKyAgICogd2VsbCBhcyB0aGUgZm9sbG93aW5nIENFQyBUcmFuc21pc3Npb24vUmVjZXB0aW9uIEVycm9ycyBpbnRlcnJ1cHRzIAorICAgKiBSeCBCeXRlIFJlY2VpdmVkIElUIAorICAgKiBFbmQgb2YgUmVjZXB0aW9uIElUIAorICAgKiBSeCBvdmVycnVuCisgICAqIFJ4IGJpdCByaXNpbmcgZXJyb3IKKyAgICogUnggc2hvcnQgYml0IHBlcmlvZCBlcnJvcgorICAgKiBSeCBsb25nIGJpdCBwZXJpb2QgZXJyb3IKKyAgICogUnggbWlzc2luZyBhY2tub3dsZWRnZQorICAgKiBUeCBCeXRlIFJlcXVlc3QgSVQgCisgICAqIEVuZCBvZiBUcmFuc21pc3Npb24gSVQKKyAgICogVHggTWlzc2luZyBBY2tub3dsZWRnZSBJVAorICAgKiBUeC1FcnJvciBJVAorICAgKiBUeC1CdWZmZXIgVW5kZXJydW4gSVQgCisgICAqIFR4IGFyYml0cmF0aW9uIGxvc3QgICAqLworICBfX0hBTF9DRUNfRElTQUJMRV9JVChoY2VjLCBDRUNfSVRfUlhCUnxDRUNfSVRfUlhFTkR8Q0VDX0lFUl9SWF9BTExfRVJSfENFQ19JVF9UWEJSfENFQ19JVF9UWEVORHxDRUNfSUVSX1RYX0FMTF9FUlIpOworICAKKyAgaGNlYy0+RXJyb3JDb2RlID0gSEFMX0NFQ19FUlJPUl9OT05FOworICBoY2VjLT5nU3RhdGUgPSBIQUxfQ0VDX1NUQVRFX1JFU0VUOworICBoY2VjLT5SeFN0YXRlID0gSEFMX0NFQ19TVEFURV9SRVNFVDsKKyAgCisgIC8qIFByb2Nlc3MgVW5sb2NrICovCisgIF9fSEFMX1VOTE9DSyhoY2VjKTsKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiBJbml0aWFsaXplcyB0aGUgT3duIEFkZHJlc3Mgb2YgdGhlIENFQyBkZXZpY2UKKyAgKiBAcGFyYW0gaGNlYyBDRUMgaGFuZGxlCisgICogQHBhcmFtICBDRUNfT3duQWRkcmVzcyBUaGUgQ0VDIG93biBhZGRyZXNzLiAgCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ0VDX1NldERldmljZUFkZHJlc3MoQ0VDX0hhbmRsZVR5cGVEZWYgKmhjZWMsIHVpbnQxNl90IENFQ19Pd25BZGRyZXNzKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQ0VDX09XTl9BRERSRVNTKENFQ19Pd25BZGRyZXNzKSk7CisKKyAgaWYgKChoY2VjLT5nU3RhdGUgPT0gSEFMX0NFQ19TVEFURV9SRUFEWSkgJiYgKGhjZWMtPlJ4U3RhdGUgPT0gSEFMX0NFQ19TVEFURV9SRUFEWSkpCisgIHsgCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhjZWMpOyAKKyAgICAKKyAgICBoY2VjLT5nU3RhdGUgPSBIQUxfQ0VDX1NUQVRFX0JVU1k7CisgIAorICAgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9DRUNfRElTQUJMRShoY2VjKTsKKyAgICAKKyAgICBpZihDRUNfT3duQWRkcmVzcyAhPSBDRUNfT1dOX0FERFJFU1NfTk9ORSkKKyAgICB7CisgICAgICBoY2VjLT5JbnN0YW5jZS0+Q0ZHUiB8PSAoKHVpbnQzMl90KUNFQ19Pd25BZGRyZXNzPDwxNlUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGNlYy0+SW5zdGFuY2UtPkNGR1IgJj0gfihDRUNfQ0ZHUl9PQVIpOworICAgIH0KKyAgICAgICAgCisgICAgaGNlYy0+Z1N0YXRlID0gSEFMX0NFQ19TVEFURV9SRUFEWTsKKyAgICBoY2VjLT5FcnJvckNvZGUgPSBIQUxfQ0VDX0VSUk9SX05PTkU7CisgICAgCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY2VjKTsgCisgICAgCisgICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgICAgX19IQUxfQ0VDX0VOQUJMRShoY2VjKTsKKyAgICAKKyAgICByZXR1cm4gIEhBTF9PSzsgCisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBDRUMgTVNQIEluaXQKKyAgKiBAcGFyYW0gaGNlYyBDRUMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisgX193ZWFrIHZvaWQgSEFMX0NFQ19Nc3BJbml0KENFQ19IYW5kbGVUeXBlRGVmICpoY2VjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoY2VjKTsKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9DRUNfTXNwSW5pdCBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gCit9CisKKy8qKgorICAqIEBicmllZiBDRUMgTVNQIERlSW5pdAorICAqIEBwYXJhbSBoY2VjIENFQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyBfX3dlYWsgdm9pZCBIQUxfQ0VDX01zcERlSW5pdChDRUNfSGFuZGxlVHlwZURlZiAqaGNlYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGNlYyk7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfQ0VDX01zcERlSW5pdCBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ0VDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSW5wdXQgYW5kIE91dHB1dCBvcGVyYXRpb24gZnVuY3Rpb25zIAorICAqICBAYnJpZWYgQ0VDIFRyYW5zbWl0L1JlY2VpdmUgZnVuY3Rpb25zIAorICAqCitAdmVyYmF0aW0gICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIyAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgQ0VDIGRhdGEgdHJhbnNmZXJzLgorICAgIAorICAgICgjKSBUaGUgQ0VDIGhhbmRsZSBtdXN0IGNvbnRhaW4gdGhlIGluaXRpYXRvciAoVFggc2lkZSkgYW5kIHRoZSBkZXN0aW5hdGlvbiAoUlggc2lkZSkKKyAgICAgICAgbG9naWNhbCBhZGRyZXNzZXMgKDQtYml0IGxvbmcgYWRkcmVzc2VzLCAweDBGIGZvciBicm9hZGNhc3QgbWVzc2FnZXMgZGVzdGluYXRpb24pCisgICAgCisgICAgKCMpIFRoZSBjb21tdW5pY2F0aW9uIGlzIHBlcmZvcm1lZCB1c2luZyBJbnRlcnJ1cHRzLiAKKyAgICAgICAgICAgVGhlc2UgQVBJJ3MgcmV0dXJuIHRoZSBIQUwgc3RhdHVzLgorICAgICAgICAgICBUaGUgZW5kIG9mIHRoZSBkYXRhIHByb2Nlc3Npbmcgd2lsbCBiZSBpbmRpY2F0ZWQgdGhyb3VnaCB0aGUgCisgICAgICAgICAgIGRlZGljYXRlZCBDRUMgSVJRIHdoZW4gdXNpbmcgSW50ZXJydXB0IG1vZGUuCisgICAgICAgICAgIFRoZSBIQUxfQ0VDX1R4Q3BsdENhbGxiYWNrKCksIEhBTF9DRUNfUnhDcGx0Q2FsbGJhY2soKSB1c2VyIGNhbGxiYWNrcyAKKyAgICAgICAgICAgd2lsbCBiZSBleGVjdXRlZCByZXNwZWN0aXZlbGx5IGF0IHRoZSBlbmQgb2YgdGhlIHRyYW5zbWl0IG9yIFJlY2VpdmUgcHJvY2VzcworICAgICAgICAgICBUaGUgSEFMX0NFQ19FcnJvckNhbGxiYWNrKCl1c2VyIGNhbGxiYWNrIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiBhIGNvbW11bmljYXRpb24gCisgICAgICAgICAgIGVycm9yIGlzIGRldGVjdGVkCisgICAgICAgIAorICAgICgjKSBBUEkncyB3aXRoIEludGVycnVwdCBhcmUgOgorICAgICAgICAgKCspIEhBTF9DRUNfVHJhbnNtaXRfSVQoKQorICAgICAgICAgKCspIEhBTF9DRUNfSVJRSGFuZGxlcigpCisKKyAgICAoIykgQSBzZXQgb2YgVXNlciBDYWxsYmFja3MgYXJlIHByb3ZpZGVkOgorICAgICAgICAgKCspIEhBTF9DRUNfVHhDcGx0Q2FsbGJhY2soKQorICAgICAgICAgKCspIEhBTF9DRUNfUnhDcGx0Q2FsbGJhY2soKQorICAgICAgICAgKCspIEhBTF9DRUNfRXJyb3JDYWxsYmFjaygpCisgICAgICAKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBTZW5kIGRhdGEgaW4gaW50ZXJydXB0IG1vZGUgCisgICogQHBhcmFtIGhjZWMgQ0VDIGhhbmRsZSAKKyAgKiBAcGFyYW0gSW5pdGlhdG9yQWRkcmVzcyBJbml0aWF0b3IgYWRkcmVzcworICAqIEBwYXJhbSBEZXN0aW5hdGlvbkFkZHJlc3MgZGVzdGluYXRpb24gbG9naWNhbCBhZGRyZXNzICAgICAgCisgICogQHBhcmFtIHBEYXRhIHBvaW50ZXIgdG8gaW5wdXQgYnl0ZSBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQgaW4gYnl0ZXMgKHdpdGhvdXQgY291bnRpbmcgdGhlIGhlYWRlcikuCisgICogICAgICAgICAgICAgIDAgbWVhbnMgb25seSB0aGUgaGVhZGVyIGlzIHNlbnQgKHBpbmcgb3BlcmF0aW9uKS4KKyAgKiAgICAgICAgICAgICAgTWF4aW11bSBUWCBzaXplIGlzIDE1IGJ5dGVzICgxIG9wY29kZSBhbmQgdXAgdG8gMTQgb3BlcmFuZHMpLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLyAgCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ0VDX1RyYW5zbWl0X0lUKENFQ19IYW5kbGVUeXBlRGVmICpoY2VjLCB1aW50OF90IEluaXRpYXRvckFkZHJlc3MsIHVpbnQ4X3QgRGVzdGluYXRpb25BZGRyZXNzLCB1aW50OF90ICpwRGF0YSwgdWludDMyX3QgU2l6ZSkKK3sKKyAgLyogaWYgdGhlIElQIGlzbid0IGFscmVhZHkgYnVzeSBhbmQgaWYgdGhlcmUgaXMgbm8gcHJldmlvdXMgdHJhbnNtaXNzaW9uCisgICAgIGFscmVhZHkgcGVuZGluZyBkdWUgdG8gYXJiaXRyYXRpb24gbG9zdCAqLworICBpZiAoaGNlYy0+Z1N0YXRlID09IEhBTF9DRUNfU1RBVEVfUkVBRFkpIAorICB7ICAgIAorICAgIGlmKChwRGF0YSA9PSBOVUxMICkgJiYgKFNpemUgPiAwVSkpIAorICAgIHsKKyAgICAgIHJldHVybiAgSEFMX0VSUk9SOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKworICAgIGFzc2VydF9wYXJhbShJU19DRUNfQUREUkVTUyhEZXN0aW5hdGlvbkFkZHJlc3MpKTsgCisgICAgYXNzZXJ0X3BhcmFtKElTX0NFQ19BRERSRVNTKEluaXRpYXRvckFkZHJlc3MpKTsgCisgICAgYXNzZXJ0X3BhcmFtKElTX0NFQ19NU0dTSVpFKFNpemUpKTsKKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoY2VjKTsKKyAgICBoY2VjLT5wVHhCdWZmUHRyID0gcERhdGE7CisgICAgaGNlYy0+Z1N0YXRlID0gSEFMX0NFQ19TVEFURV9CVVNZX1RYOworICAgIGhjZWMtPkVycm9yQ29kZSA9IEhBTF9DRUNfRVJST1JfTk9ORTsKKyAgCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNlbmQsCisgICAgICogMCBtZWFucyBvbmx5IG9uZSBoZWFkZXIgaXMgc2VudCAocGluZyBvcGVyYXRpb24pICovCisgICAgaGNlYy0+VHhYZmVyQ291bnQgPSBTaXplOworICAgIAorICAgIC8qIGluIGNhc2Ugb2Ygbm8gcGF5bG9hZCAoU2l6ZSA9IDBVKSwgc2VuZGVyIGlzIG9ubHkgcGluZ2luZyB0aGUgc3lzdGVtOworICAgICAgIFNldCBUWCBFbmQgb2YgTWVzc2FnZSAoVFhFT00pIGJpdCwgbXVzdCBiZSBzZXQgYmVmb3JlIHdyaXRpbmcgZGF0YSB0byBUWERSICovCisgICAgaWYgKFNpemUgPT0gMFUpCisgICAgeworICAgICAgX19IQUxfQ0VDX0xBU1RfQllURV9UWF9TRVQoaGNlYyk7CisgICAgfQorCisgICAgLyogc2VuZCBoZWFkZXIgYmxvY2sgKi8KKyAgICBoY2VjLT5JbnN0YW5jZS0+VFhEUiA9ICgodWludDhfdCkoSW5pdGlhdG9yQWRkcmVzcyA8PCBDRUNfSU5JVElBVE9SX0xTQl9QT1MpIHwodWludDhfdCkgRGVzdGluYXRpb25BZGRyZXNzKTsKKyAgICAvKiBTZXQgVFggU3RhcnQgb2YgTWVzc2FnZSAgKFRYU09NKSBiaXQgKi8KKyAgICBfX0hBTF9DRUNfRklSU1RfQllURV9UWF9TRVQoaGNlYyk7CisJICAgIAorICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNlYyk7IAorICAKKyAgICByZXR1cm4gSEFMX09LOworCisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBHZXQgc2l6ZSBvZiB0aGUgcmVjZWl2ZWQgZnJhbWUuCisgICogQHBhcmFtIGhjZWMgQ0VDIGhhbmRsZQorICAqIEByZXR2YWwgRnJhbWUgc2l6ZQorICAqLwordWludDMyX3QgSEFMX0NFQ19HZXRMYXN0UmVjZWl2ZWRGcmFtZVNpemUoQ0VDX0hhbmRsZVR5cGVEZWYgKmhjZWMpCit7CisgIHJldHVybiBoY2VjLT5SeFhmZXJTaXplOworfQorCisvKioKKyAgKiBAYnJpZWYgQ2hhbmdlIFJ4IEJ1ZmZlci4KKyAgKiBAcGFyYW0gaGNlYyBDRUMgaGFuZGxlCisgICogQHBhcmFtIFJ4YnVmZmVyIFJ4IEJ1ZmZlcgorICAqIEBub3RlICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgb25seSBpbnNpZGUgdGhlIEhBTF9DRUNfUnhDcGx0Q2FsbGJhY2soKSAKKyAgKiBAcmV0dmFsIEZyYW1lIHNpemUKKyAgKi8KK3ZvaWQgSEFMX0NFQ19DaGFuZ2VSeEJ1ZmZlcihDRUNfSGFuZGxlVHlwZURlZiAqaGNlYywgdWludDhfdCogUnhidWZmZXIpCit7CisgIGhjZWMtPkluaXQuUnhCdWZmZXIgPSBSeGJ1ZmZlcjsgCit9CisgIAorLyoqCisgICogQGJyaWVmIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBDRUMgaW50ZXJydXB0IHJlcXVlc3RzLgorICAqIEBwYXJhbSBoY2VjIENFQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0NFQ19JUlFIYW5kbGVyKENFQ19IYW5kbGVUeXBlRGVmICpoY2VjKQoreworICAKKyAgLyogc2F2ZSBpbnRlcnJ1cHRzIHJlZ2lzdGVyIGZvciBmdXJ0aGVyIGVycm9yIG9yIGludGVycnVwdHMgaGFuZGxpbmcgcHVycG9zZXMgKi8KKyAgdWludDMyX3QgcmVnID0gMFU7CisgIHJlZyA9IGhjZWMtPkluc3RhbmNlLT5JU1I7CisKKyAgCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1BcmJpdHJhdGlvbiBMb3N0IE1hbmFnZW1lbnQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gICAgIAorICAvKiBDRUMgVFggYXJiaXRyYXRpb24gZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYoKHJlZyAmIENFQ19GTEFHX0FSQkxTVCkgIT0gUkVTRVQpIAorICB7IAorICAgIGhjZWMtPkVycm9yQ29kZSA9IEhBTF9DRUNfRVJST1JfQVJCTFNUOworICAgIF9fSEFMX0NFQ19DTEVBUl9GTEFHKGhjZWMsIENFQ19GTEFHX0FSQkxTVCk7CisgIH0KKyAgCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1SeCBNYW5hZ2VtZW50LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorICAvKiBDRUMgUlggYnl0ZSByZWNlaXZlZCBpbnRlcnJ1cHQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKChyZWcgJiBDRUNfRkxBR19SWEJSKSAhPSBSRVNFVCkgCisgIHsgCisgICAgLyogcmVjZXB0aW9uIGlzIHN0YXJ0aW5nICovIAorICAgIGhjZWMtPlJ4U3RhdGUgPSBIQUxfQ0VDX1NUQVRFX0JVU1lfUlg7CisgICAgaGNlYy0+UnhYZmVyU2l6ZSsrOworICAgIC8qIHJlYWQgcmVjZWl2ZWQgYnl0ZSAqLworICAgICpoY2VjLT5Jbml0LlJ4QnVmZmVyKysgPSBoY2VjLT5JbnN0YW5jZS0+UlhEUjsKKyAgICBfX0hBTF9DRUNfQ0xFQVJfRkxBRyhoY2VjLCBDRUNfRkxBR19SWEJSKTsgIAorICB9CisgIAorICAvKiBDRUMgUlggZW5kIHJlY2VpdmVkIGludGVycnVwdCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYoKHJlZyAmIENFQ19GTEFHX1JYRU5EKSAhPSBSRVNFVCkgCisgIHsgCisgICAgLyogY2xlYXIgSVQgKi8KKyAgICBfX0hBTF9DRUNfQ0xFQVJfRkxBRyhoY2VjLCBDRUNfRkxBR19SWEVORCk7CisgICAgCisgICAgLyogUnggcHJvY2VzcyBpcyBjb21wbGV0ZWQsIHJlc3RvcmUgaGNlYy0+UnhTdGF0ZSB0byBSZWFkeSAqLworICAgIGhjZWMtPlJ4U3RhdGUgPSBIQUxfQ0VDX1NUQVRFX1JFQURZOyAKKyAgICBoY2VjLT5FcnJvckNvZGUgPSBIQUxfQ0VDX0VSUk9SX05PTkU7CisgICAgaGNlYy0+SW5pdC5SeEJ1ZmZlciAtPSBoY2VjLT5SeFhmZXJTaXplOworICAgIEhBTF9DRUNfUnhDcGx0Q2FsbGJhY2soaGNlYywgaGNlYy0+UnhYZmVyU2l6ZSk7IAorICAgIGhjZWMtPlJ4WGZlclNpemUgPSAwVTsgCisgIH0KKyAgCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1UeCBNYW5hZ2VtZW50LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAKKyAgLyogQ0VDIFRYIGJ5dGUgcmVxdWVzdCBpbnRlcnJ1cHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYoKHJlZyAmIENFQ19GTEFHX1RYQlIpICE9IFJFU0VUKSAKKyAgeworICAgIGlmIChoY2VjLT5UeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICAvKiBpZiB0aGlzIGlzIHRoZSBsYXN0IGJ5dGUgdHJhbnNtaXNzaW9uLCBzZXQgVFggRW5kIG9mIE1lc3NhZ2UgKFRYRU9NKSBiaXQgKi8KKyAgICAgIF9fSEFMX0NFQ19MQVNUX0JZVEVfVFhfU0VUKGhjZWMpOworICAgICAgaGNlYy0+SW5zdGFuY2UtPlRYRFIgPSAqaGNlYy0+cFR4QnVmZlB0cisrOworICAgIH0KKyAgICBlbHNlCisgICAgewkKKyAgICAgIGhjZWMtPkluc3RhbmNlLT5UWERSID0gKmhjZWMtPnBUeEJ1ZmZQdHIrKzsKKyAgICAgIGhjZWMtPlR4WGZlckNvdW50LS07CisgICAgfSAgCisgICAgLyogY2xlYXIgVHgtQnl0ZSByZXF1ZXN0IGZsYWcgKi8KKyAgICBfX0hBTF9DRUNfQ0xFQVJfRkxBRyhoY2VjLENFQ19GTEFHX1RYQlIpOyAKKyAgfSAKKyAgCisgIC8qIENFQyBUWCBlbmQgaW50ZXJydXB0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKChyZWcgJiBDRUNfRkxBR19UWEVORCkgIT0gUkVTRVQpIAorICB7CQorICAgIF9fSEFMX0NFQ19DTEVBUl9GTEFHKGhjZWMsIENFQ19GTEFHX1RYRU5EKTsKKyAgICAKKyAgICAvKiBUeCBwcm9jZXNzIGlzIGVuZGVkLCByZXN0b3JlIGhjZWMtPmdTdGF0ZSB0byBSZWFkeSAqLyAgICAgCisgICAgaGNlYy0+Z1N0YXRlID0gSEFMX0NFQ19TVEFURV9SRUFEWTsKKyAgICAvKiBDYWxsIHRoZSBQcm9jZXNzIFVubG9ja2VkIGJlZm9yZSBjYWxsaW5nIHRoZSBUeCBjYWxsIGJhY2sgQVBJIHRvIGdpdmUgdGhlIHBvc3NpYmlsaXR5IHRvCisgICAgc3RhcnQgYWdhaW4gdGhlIFRyYW5zbWlzc2lvbiB1bmRlciB0aGUgVHggY2FsbCBiYWNrIEFQSSAqLworICAgIF9fSEFMX1VOTE9DSyhoY2VjKTsKKyAgICBoY2VjLT5FcnJvckNvZGUgPSBIQUxfQ0VDX0VSUk9SX05PTkU7CisgICAgSEFMX0NFQ19UeENwbHRDYWxsYmFjayhoY2VjKTsKKyAgfSAKKyAgCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1SeC9UeCBFcnJvciBNYW5hZ2VtZW50LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAgCisgIGlmICgocmVnICYgKENFQ19JU1JfUlhPVlJ8Q0VDX0lTUl9CUkV8Q0VDX0lTUl9TQlBFfENFQ19JU1JfTEJQRXxDRUNfSVNSX1JYQUNLRXxDRUNfSVNSX1RYVURSfENFQ19JU1JfVFhFUlJ8Q0VDX0lTUl9UWEFDS0UpKSAhPSAwVSkKKyAgeworICAgIGhjZWMtPkVycm9yQ29kZSA9IHJlZzsKKyAgICBfX0hBTF9DRUNfQ0xFQVJfRkxBRyhoY2VjLCBIQUxfQ0VDX0VSUk9SX1JYT1ZSfEhBTF9DRUNfRVJST1JfQlJFfENFQ19GTEFHX0xCUEV8Q0VDX0ZMQUdfU0JQRXxIQUxfQ0VDX0VSUk9SX1JYQUNLRXxIQUxfQ0VDX0VSUk9SX1RYVURSfEhBTF9DRUNfRVJST1JfVFhFUlJ8SEFMX0NFQ19FUlJPUl9UWEFDS0UpOworCisgICAgCisgICAgaWYoKHJlZyAmIChDRUNfSVNSX1JYT1ZSfENFQ19JU1JfQlJFfENFQ19JU1JfU0JQRXxDRUNfSVNSX0xCUEV8Q0VDX0lTUl9SWEFDS0UpKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBoY2VjLT5Jbml0LlJ4QnVmZmVyLT1oY2VjLT5SeFhmZXJTaXplOwkKKyAgICAgIGhjZWMtPlJ4WGZlclNpemUgPSAwVTsgCisgICAgICBoY2VjLT5SeFN0YXRlID0gSEFMX0NFQ19TVEFURV9SRUFEWTsKKyAgICB9CisgICAgZWxzZSBpZiAoKChyZWcgJiAoQ0VDX0lTUl9UWFVEUnxDRUNfSVNSX1RYRVJSfENFQ19JU1JfVFhBQ0tFKSkgIT0gUkVTRVQpICYmICgocmVnICYgQ0VDX0lTUl9BUkJMU1QpID09IFJFU0VUKSkKKyAgICB7CQorICAgICAgLyogU2V0IHRoZSBDRUMgc3RhdGUgcmVhZHkgdG8gYmUgYWJsZSB0byBzdGFydCBhZ2FpbiB0aGUgcHJvY2VzcyAqLworICAgICAgaGNlYy0+Z1N0YXRlID0gSEFMX0NFQ19TVEFURV9SRUFEWTsKKyAgICB9CQorICAgIAorICAgIC8qIEVycm9yICBDYWxsIEJhY2sgKi8gICAgCisgICAgSEFMX0NFQ19FcnJvckNhbGxiYWNrKGhjZWMpOworICB9CisgIAorfQorCisvKioKKyAgKiBAYnJpZWYgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrCisgICogQHBhcmFtIGhjZWMgQ0VDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworIF9fd2VhayB2b2lkIEhBTF9DRUNfVHhDcGx0Q2FsbGJhY2soQ0VDX0hhbmRsZVR5cGVEZWYgKmhjZWMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhjZWMpOyAgCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfQ0VDX1R4Q3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQGJyaWVmIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjaworICAqIEBwYXJhbSBoY2VjIENFQyBoYW5kbGUKKyAgKiBAcGFyYW0gUnhGcmFtZVNpemUgU2l6ZSBvZiBmcmFtZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0NFQ19SeENwbHRDYWxsYmFjayhDRUNfSGFuZGxlVHlwZURlZiAqaGNlYywgdWludDMyX3QgUnhGcmFtZVNpemUpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhjZWMpOworICBVTlVTRUQoUnhGcmFtZVNpemUpOworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0NFQ19SeENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmIENFQyBlcnJvciBjYWxsYmFja3MKKyAgKiBAcGFyYW0gaGNlYyBDRUMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisgX193ZWFrIHZvaWQgSEFMX0NFQ19FcnJvckNhbGxiYWNrKENFQ19IYW5kbGVUeXBlRGVmICpoY2VjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoY2VjKTsKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9DRUNfRXJyb3JDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gCit9CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENFQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbiAKKyAgKiAgQGJyaWVmICAgQ0VDIGNvbnRyb2wgZnVuY3Rpb25zIAorICAqCitAdmVyYmF0aW0gICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9uICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gY29udHJvbCB0aGUgQ0VDLgorICAgICAoKykgSEFMX0NFQ19HZXRTdGF0ZSgpIEFQSSBjYW4gYmUgaGVscGZ1bCB0byBjaGVjayBpbiBydW4tdGltZSB0aGUgc3RhdGUgb2YgdGhlIENFQyBwZXJpcGhlcmFsLiAKKwkgKCspIEhBTF9DRUNfR2V0RXJyb3IoKSBBUEkgY2FuIGJlIGhlbHBmdWwgdG8gY2hlY2sgaW4gcnVuLXRpbWUgdGhlIGVycm9yIG9mIHRoZSBDRUMgcGVyaXBoZXJhbC4gCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmIHJldHVybiB0aGUgQ0VDIHN0YXRlCisgICogQHBhcmFtIGhjZWMgcG9pbnRlciB0byBhIENFQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIENFQyBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9DRUNfU3RhdGVUeXBlRGVmIEhBTF9DRUNfR2V0U3RhdGUoQ0VDX0hhbmRsZVR5cGVEZWYgKmhjZWMpCit7CisgIHVpbnQzMl90IHRlbXAxID0gMHgwMFUsIHRlbXAyID0gMHgwMFU7CisgIHRlbXAxID0gaGNlYy0+Z1N0YXRlOworICB0ZW1wMiA9IGhjZWMtPlJ4U3RhdGU7CisgIAorICByZXR1cm4gKEhBTF9DRUNfU3RhdGVUeXBlRGVmKSh0ZW1wMSB8IHRlbXAyKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIENFQyBlcnJvciBjb2RlCisgICogQHBhcmFtICBoY2VjIHBvaW50ZXIgdG8gYSBDRUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBDRUMuCisgICogQHJldHZhbCBDRUMgRXJyb3IgQ29kZQorICAqLwordWludDMyX3QgSEFMX0NFQ19HZXRFcnJvcihDRUNfSGFuZGxlVHlwZURlZiAqaGNlYykKK3sKKyAgcmV0dXJuIGhjZWMtPkVycm9yQ29kZTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyAgCisKKyNlbmRpZiAvKiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KSAqLworCisjZW5kaWYgLyogSEFMX0NFQ19NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmYzeHhfaGFsX2NvbXAuYyBiL1NyYy9zdG0zMmYzeHhfaGFsX2NvbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWU0NGY2Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZjN4eF9oYWxfY29tcC5jCkBAIC0wLDAgKzEsODMyIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2hhbF9jb21wLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIENPTVAgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgQ09NUCBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBTdGFydC9TdG9wIG9wZXJhdGlvbiBmdW5jdGlvbnMgaW4gcG9sbGluZyBtb2RlLgorICAqICAgICAgICAgICArIFN0YXJ0L1N0b3Agb3BlcmF0aW9uIGZ1bmN0aW9ucyBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAgKgorICBAdmVyYmF0aW0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgIyMjIyMgQ09NUCBQZXJpcGhlcmFsIGZlYXR1cmVzICMjIyMjCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIFsuLl0KKyAgICAgIFRoZSBTVE0zMkYzeHggZGV2aWNlIGZhbWlseSBpbnRlZ3JhdGVzIHVwIHRvIDcgYW5hbG9nIGNvbXBhcmF0b3JzIENPTVAxLCBDT01QMi4uLkNPTVA3OgorICAgICAgKCMpIFRoZSBub24gaW52ZXJ0aW5nIGlucHV0IGFuZCBpbnZlcnRpbmcgaW5wdXQgY2FuIGJlIHNldCB0byBHUElPIHBpbnMuCisgICAgICAgICAgRm9yIFNUTTMyRjN4eCBkZXZpY2VzIHBsZWFzZSByZWZlciB0byB0aGUgQ09NUCBwZXJpcGhlcmFsIHNlY3Rpb24gaW4gY29ycmVzcG9uZGluZworICAgICAgICAgIFJlZmVyZW5jZSBNYW51YWwuCisKKyAgICAgICgjKSBUaGUgQ09NUCBvdXRwdXQgaXMgYXZhaWxhYmxlIHVzaW5nIEhBTF9DT01QX0dldE91dHB1dExldmVsKCkKKyAgICAgICAgICBhbmQgY2FuIGJlIHNldCBvbiBHUElPIHBpbnMuCisgICAgICAgICAgRm9yIFNUTTMyRjN4eCBkZXZpY2VzIHBsZWFzZSByZWZlciB0byB0aGUgQ09NUCBwZXJpcGhlcmFsIHNlY3Rpb24gaW4gY29ycmVzcG9uZGluZworICAgICAgICAgIFJlZmVyZW5jZSBNYW51YWwuCisKKyAgICAgICgjKSBUaGUgQ09NUCBvdXRwdXQgY2FuIGJlIHJlZGlyZWN0ZWQgdG8gZW1iZWRkZWQgdGltZXJzIChUSU0xLCBUSU0yLCBUSU0zLi4uKS4KKyAgICAgICAgICBGb3IgU1RNMzJGM3h4IGRldmljZXMgcGxlYXNlIHJlZmVyIHRvIHRoZSBDT01QIHBlcmlwaGVyYWwgc2VjdGlvbiBpbiBjb3JyZXNwb25kaW5nCisgICAgICAgICAgUmVmZXJlbmNlIE1hbnVhbC4KKworICAgICAgKCMpIEVhY2ggY291cGxlIG9mIGNvbXBhcmF0b3JzIENPTVAxIGFuZCBDT01QMiwgQ09NUDMgYW5kIENPTVA0LCBDT01QNSBhbmQgQ09NUDYgY2FuIGJlIGNvbWJpbmVkIGluIHdpbmRvdworICAgICAgICAgIG1vZGUgYW5kIHJlc3BlY3RpdmVseSBDT01QMSwgQ09NUDMgYW5kIENPTVA1IG5vbiBpbnZlcnRpbmcgaW5wdXQgaXMgdXNlZCBhcyBjb21tb24gbm9uLWludmVydGluZyBpbnB1dC4KKworICAgICAgKCMpIFRoZSBzZXZlbiBjb21wYXJhdG9ycyBoYXZlIGludGVycnVwdCBjYXBhYmlsaXR5IHdpdGggd2FrZS11cAorICAgICAgICAgIGZyb20gU2xlZXAgYW5kIFN0b3AgbW9kZXMgKHRocm91Z2ggdGhlIEVYVEkgY29udHJvbGxlcik6CisgICAgICAgICAgKCsrKSBDT01QMSBpcyBpbnRlcm5hbGx5IGNvbm5lY3RlZCB0byBFWFRJIExpbmUgMjEKKyAgICAgICAgICAoKyspIENPTVAyIGlzIGludGVybmFsbHkgY29ubmVjdGVkIHRvIEVYVEkgTGluZSAyMgorICAgICAgICAgICgrKykgQ09NUDMgaXMgaW50ZXJuYWxseSBjb25uZWN0ZWQgdG8gRVhUSSBMaW5lIDI5CisgICAgICAgICAgKCsrKSBDT01QNCBpcyBpbnRlcm5hbGx5IGNvbm5lY3RlZCB0byBFWFRJIExpbmUgMzAKKyAgICAgICAgICAoKyspIENPTVA1IGlzIGludGVybmFsbHkgY29ubmVjdGVkIHRvIEVYVEkgTGluZSAzMQorICAgICAgICAgICgrKykgQ09NUDYgaXMgaW50ZXJuYWxseSBjb25uZWN0ZWQgdG8gRVhUSSBMaW5lIDMyCisgICAgICAgICAgKCsrKSBDT01QNyBpcyBpbnRlcm5hbGx5IGNvbm5lY3RlZCB0byBFWFRJIExpbmUgMzMuCisKKyAgICAgICAgICBGcm9tIHRoZSBjb3JyZXNwb25kaW5nIElSUSBoYW5kbGVyLCB0aGUgcmlnaHQgaW50ZXJydXB0IHNvdXJjZSBjYW4gYmUgcmV0cmlldmVkIHdpdGggdGhlCisgICAgICAgICAgYWRlcXVhdGUgbWFjcm8gX19IQUxfQ09NUF9DT01QeF9FWFRJX0dFVF9GTEFHKCkuCisKKworICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgICAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGNvbmZpZ3VyZSBhbmQgcHJvZ3JhbSB0aGUgQ29tcGFyYXRvcnMgb2YgYWxsIFNUTTMyRjN4eCBkZXZpY2VzLgorCisgICAgICBUbyB1c2UgdGhlIGNvbXBhcmF0b3IsIHBlcmZvcm0gdGhlIGZvbGxvd2luZyBzdGVwczoKKworICAgICAgKCMpIEZpbGwgaW4gdGhlIEhBTF9DT01QX01zcEluaXQoKSB0bworICAgICAgKCsrKSBDb25maWd1cmUgdGhlIGNvbXBhcmF0b3IgaW5wdXQgaW4gYW5hbG9nIG1vZGUgdXNpbmcgSEFMX0dQSU9fSW5pdCgpCisgICAgICAoKyspIENvbmZpZ3VyZSB0aGUgY29tcGFyYXRvciBvdXRwdXQgaW4gYWx0ZXJuYXRlIGZ1bmN0aW9uIG1vZGUgdXNpbmcgSEFMX0dQSU9fSW5pdCgpIHRvIG1hcCB0aGUgY29tcGFyYXRvcgorICAgICAgICAgICBvdXRwdXQgdG8gdGhlIEdQSU8gcGluCisgICAgICAoKyspIElmIHJlcXVpcmVkIGVuYWJsZSB0aGUgQ09NUCBpbnRlcnJ1cHQgKEVYVEkgbGluZSBJbnRlcnJ1cHQpOiBieSBjb25maWd1cmluZyBhbmQgZW5hYmxpbmcgRVhUSSBsaW5lIGluIEludGVycnVwdCBtb2RlIGFuZAorICAgICAgICAgICBzZWxlY3RpbmcgdGhlIGRlc2lyZWQgc2Vuc2l0aXZpdHkgbGV2ZWwgdXNpbmcgSEFMX0dQSU9fSW5pdCgpIGZ1bmN0aW9uLiBBZnRlciB0aGF0IGVuYWJsZSB0aGUgY29tcGFyYXRvcgorICAgICAgICAgICBpbnRlcnJ1cHQgdmVjdG9yIHVzaW5nIEhBTF9OVklDX1NldFByaW9yaXR5KCkgYW5kIEhBTF9OVklDX0VuYWJsZUlSUSgpIGZ1bmN0aW9ucy4KKworICAgICAgKCMpIENvbmZpZ3VyZSB0aGUgY29tcGFyYXRvciB1c2luZyBIQUxfQ09NUF9Jbml0KCkgZnVuY3Rpb246CisgICAgICAoKyspIFNlbGVjdCB0aGUgaW52ZXJ0aW5nIGlucHV0IChpbnB1dCBtaW51cykKKyAgICAgICgrKykgU2VsZWN0IHRoZSBub24taW52ZXJ0aW5nIGlucHV0IChpbnB1dCBwbHVzKQorICAgICAgKCsrKSBTZWxlY3QgdGhlIG91dHB1dCBwb2xhcml0eQorICAgICAgKCsrKSBTZWxlY3QgdGhlIG91dHB1dCByZWRpcmVjdGlvbgorICAgICAgKCsrKSBTZWxlY3QgdGhlIGh5c3RlcmVzaXMgbGV2ZWwKKyAgICAgICgrKykgU2VsZWN0IHRoZSBwb3dlciBtb2RlCisgICAgICAoKyspIFNlbGVjdCB0aGUgZXZlbnQvaW50ZXJydXB0IG1vZGUKKworICAgICAgLUBALSBIQUxfQ09NUF9Jbml0KCkgY2FsbHMgaW50ZXJuYWxseSBfX0hBTF9SQ0NfU1lTQ0ZHX0NMS19FTkFCTEUoKSBpbiBvcmRlcgorICAgICAgICAgIHRvIGVuYWJsZSB0aGUgY29tcGFyYXRvcihzKS4KKworICAgICAgKCMpIE9uLXRoZS1mbHkgcmVjb25maWd1cmF0aW9uIG9mIGNvbXBhcmF0b3IocykgbWF5IGJlIGRvbmUgYnkgY2FsbGluZyBhZ2FpbiBIQUxfQ09NUF9Jbml0KAorICAgICAgICAgIGZ1bmN0aW9uIHdpdGggbmV3IGlucHV0IHBhcmFtZXRlciB2YWx1ZXM7IEhBTF9DT01QX01zcEluaXQoKSBmdW5jdGlvbiBzaGFsbCBiZSBhZGFwdGVkCisgICAgICAgICAgdG8gc3VwcG9ydCBtdWx0aSBjb25maWd1cmF0aW9ucy4KKworICAgICAgKCMpIEVuYWJsZSB0aGUgY29tcGFyYXRvciB1c2luZyBIQUxfQ09NUF9TdGFydCgpIG9yIEhBTF9DT01QX1N0YXJ0X0lUKCkgZnVuY3Rpb25zLgorCisgICAgICAoIykgVXNlIEhBTF9DT01QX1RyaWdnZXJDYWxsYmFjaygpIGFuZC9vciBIQUxfQ09NUF9HZXRPdXRwdXRMZXZlbCgpIGZ1bmN0aW9ucworICAgICAgICAgIHRvIG1hbmFnZSBjb21wYXJhdG9yIG91dHB1dHMgKGV2ZW50cyBhbmQgb3V0cHV0IGxldmVsKS4KKworICAgICAgKCMpIERpc2FibGUgdGhlIGNvbXBhcmF0b3IgdXNpbmcgSEFMX0NPTVBfU3RvcCgpIG9yIEhBTF9DT01QX1N0b3BfSVQoKQorICAgICAgICAgIGZ1bmN0aW9uLgorCisgICAgICAoIykgRGUtaW5pdGlhbGl6ZSB0aGUgY29tcGFyYXRvciB1c2luZyBIQUxfQ09NUF9EZUluaXQoKSBmdW5jdGlvbi4KKworICAgICAgKCMpIEZvciBzYWZldHkgcHVycG9zZXMgY29tcGFyYXRvcihzKSBjYW4gYmUgbG9ja2VkIHVzaW5nIEhBTF9DT01QX0xvY2soKSBmdW5jdGlvbi4KKyAgICAgICAgICBPbmx5IGEgTUNVIHJlc2V0IGNhbiByZXNldCB0aGF0IHByb3RlY3Rpb24uCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKgorICBBZGRpdGlvbmFsIFRhYmxlczoKKworICAgIFRhYmxlIDEuIENPTVAgSW5wdXRzIGZvciB0aGUgU1RNMzJGMzAzeEIvU1RNMzJGMzAzeEMvU1RNMzJGMzAzeEUgZGV2aWNlcworICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8IENPTVAxIHwgQ09NUDIgfCBDT01QMyB8IENPTVA0IHwgQ09NUDUgfCBDT01QNiB8IENPTVA3IHwKKyAgICB8LS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgICAgICAgICAgICAgIHwgMVUvNCBWUkVGSU5UICAgIHwgIE9LICAgfCAgT0sgICB8ICBPSyAgIHwgIE9LICAgfCAgT0sgICB8ICBPSyAgIHwgIE9LICAgfAorICAgIHwgICAgICAgICAgICAgICAgIHwgMVUvMiBWUkVGSU5UICAgIHwgIE9LICAgfCAgT0sgICB8ICBPSyAgIHwgIE9LICAgfCAgT0sgICB8ICBPSyAgIHwgIE9LICAgfAorICAgIHwgICAgICAgICAgICAgICAgIHwgM1UvNCBWUkVGSU5UICAgIHwgIE9LICAgfCAgT0sgICB8ICBPSyAgIHwgIE9LICAgfCAgT0sgICB8ICBPSyAgIHwgIE9LICAgfAorICAgIHwgSW52ZXJ0aW5nIElucHV0IHwgVlJFRklOVCAgICAgICAgfCAgT0sgICB8ICBPSyAgIHwgIE9LICAgfCAgT0sgICB8ICBPSyAgIHwgIE9LICAgfCAgT0sgICB8CisgICAgfCAgICAgICAgICAgICAgICAgfCBEQUMxIE9VVCAoUEE0KSB8ICBPSyAgIHwgIE9LICAgfCAgT0sgICB8ICBPSyAgIHwgIE9LICAgfCAgT0sgICB8ICBPSyAgIHwKKyAgICB8ICAgICAgICAgICAgICAgICB8IERBQzIgT1VUIChQQTUpIHwgIE9LICAgfCAgT0sgICB8ICBPSyAgIHwgIE9LICAgfCAgT0sgICB8ICBPSyAgIHwgIE9LICAgfAorICAgIHwgICAgICAgICAgICAgICAgIHwgSU8xICAgICAgICAgICAgfCAgUEEwICB8ICBQQTIgIHwgIFBEMTVVIHwgIFBFOCAgfCAgUEQxM1UgfCAgUEQxMFUgfCAgUEMwICB8CisgICAgfCAgICAgICAgICAgICAgICAgfCBJTzIgICAgICAgICAgICB8ICAtLS0gIHwgIC0tLSAgfCAgUEIxMlUgfCAgUEIyICB8ICBQQjEwVSB8ICBQQjE1VSB8ICAtLS0gIHwKKyAgICB8LS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tfC0tLS0tLS18LS0tLS0tLXwtLS0tLS0tfC0tLS0tLS18LS0tLS0tLXwtLS0tLS0tfAorICAgIHwgIE5vbiBJbnZlcnRpbmcgIHwgSU8xICAgICAgICAgICAgfCAgUEExICB8ICBQQTcgIHwgIFBCMTRVIHwgIFBCMCAgfCAgUEQxMlUgfCAgUEQxMVUgfCAgUEEwICB8CisgICAgfCAgICBJbnB1dCAgICAgICAgfCBJTzIgICAgICAgICAgICB8ICAtLS0gIHwgIFBBMyAgfCAgUEQxNFUgfCAgUEU3ICB8ICBQQjEzVSB8ICBQQjExVSB8ICBQQzEgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisgICAgVGFibGUgMi4gQ09NUCBPdXRwdXRzIGZvciB0aGUgU1RNMzJGMzAzeEIvU1RNMzJGMzAzeEMvU1RNMzJGMzAzeEUgZGV2aWNlcworICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgQ09NUDEgfCBDT01QMiB8IENPTVAzIHwgQ09NUDQgfCBDT01QNSB8IENPTVA2IHwgQ09NUDcgfAorICAgIHwtLS0tLS0tfC0tLS0tLS18LS0tLS0tLXwtLS0tLS0tfC0tLS0tLS18LS0tLS0tLXwtLS0tLS0tfAorICAgIHwgIFBBMCAgfCAgUEEyICB8ICBQQjEgIHwgIFBDOCAgfCAgUEM3ICB8ICBQQTEwVSB8ICBQQzIgIHwKKyAgICB8ICBQRjQgIHwgIFBBNyAgfCAgLS0tICB8ICBQQTggIHwgIFBBOSAgfCAgUEM2ICB8ICAtLS0gIHwKKyAgICB8ICBQQTYgIHwgIFBBMTJVIHwgIC0tLSAgfCAgLS0tICB8ICAtLS0gIHwgIC0tLSAgfCAgLS0tICB8CisgICAgfCAgUEExMVUgfCAgUEI5ICB8ICAtLS0gIHwgIC0tLSAgfCAgLS0tICB8ICAtLS0gIHwgIC0tLSAgfAorICAgIHwgIFBCOCAgfCAgLS0tICB8ICAtLS0gIHwgIC0tLSAgfCAgLS0tICB8ICAtLS0gIHwgIC0tLSAgfAorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisgICAgVGFibGUgMy4gQ09NUCBPdXRwdXRzIHJlZGlyZWN0aW9uIHRvIGVtYmVkZGVkIHRpbWVycyBmb3IgdGhlIFNUTTMyRjMwM3hCL1NUTTMyRjMwM3hDIGRldmljZXMKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICAgICBDT01QMSAgICAgIHwgICAgIENPTVAyICAgICAgfCAgICAgQ09NUDMgICAgICB8ICAgICBDT01QNCAgICAgIHwgICAgIENPTVA1ICAgICAgfCAgICAgQ09NUDYgICAgICB8ICAgICBDT01QNyAgICAgIHwKKyAgICB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICBUSU0xIEJLSU4gICAgIHwgIFRJTTEgQktJTiAgICAgfCAgVElNMSBCS0lOICAgICB8ICBUSU0xIEJLSU4gICAgIHwgIFRJTTEgQktJTiAgICAgfCAgVElNMSBCS0lOICAgICB8ICBUSU0xIEJLSU4gICAgIHwKKyAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKKyAgICB8ICBUSU0xIEJLSU4yICAgIHwgIFRJTTEgQktJTjIgICAgfCAgVElNMSBCS0lOMiAgICB8ICBUSU0xIEJLSU4yICAgIHwgIFRJTTEgQktJTjIgICAgfCAgVElNMSBCS0lOMiAgICB8ICBUSU0xIEJLSU4yICAgIHwKKyAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKKyAgICB8ICBUSU04IEJLSU4gICAgIHwgIFRJTTggQktJTiAgICAgfCAgVElNOCBCS0lOICAgICB8ICBUSU04IEJLSU4gICAgIHwgIFRJTTggQktJTiAgICAgfCAgVElNOCBCS0lOICAgICB8ICBUSU04IEJLSU4gICAgIHwKKyAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKKyAgICB8ICBUSU04IEJLSU4yICAgIHwgIFRJTTggQktJTjIgICAgfCAgVElNOCBCS0lOMiAgICB8ICBUSU04IEJLSU4yICAgIHwgIFRJTTggQktJTjIgICAgfCAgVElNOCBCS0lOMiAgICB8ICBUSU04IEJLSU4yICAgIHwKKyAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKKyAgICB8ICBUSU0xIEJLSU4yICAgIHwgIFRJTTEgQktJTjIgICAgfCAgVElNMSBCS0lOMiAgICB8ICBUSU0xIEJLSU4yICAgIHwgIFRJTTEgQktJTjIgICAgfCAgVElNMSBCS0lOMiAgICB8ICBUSU0xIEJLSU4yICAgIHwKKyAgICB8ICAgICArICAgICAgICAgIHwgICAgICsgICAgICAgICAgfCAgICAgKyAgICAgICAgICB8ICAgICArICAgICAgICAgIHwgICAgICsgICAgICAgICAgfCAgICAgKyAgICAgICAgICB8ICAgICArICAgICAgICAgIHwKKyAgICB8ICBUSU04QktJTjIgICAgIHwgIFRJTThCS0lOMiAgICAgfCAgVElNOEJLSU4yICAgICB8ICBUSU04QktJTjIgICAgIHwgIFRJTThCS0lOMiAgICAgfCAgVElNOEJLSU4yICAgICB8ICBUSU04QktJTjIgICAgIHwKKyAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKKyAgICB8ICBUSU0xIE9DUkVGQ0xSIHwgIFRJTTEgT0NSRUZDTFIgfCAgVElNMSBPQ1JFRkNMUiB8ICBUSU04IE9DUkVGQ0xSIHwgIFRJTTggT0NSRUZDTFIgfCAgVElNOCBPQ1JFRkNMUiB8ICBUSU0xIE9DUkVGQ0xSIHwKKyAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKKyAgICB8ICBUSU0xIElDMSAgICAgIHwgIFRJTTEgSUMxICAgICAgfCAgVElNMiBPQ1JFRkNMUiB8ICBUSU0zIElDMyAgICAgIHwgIFRJTTIgSUMxICAgICAgfCAgVElNMiBJQzIgICAgICB8ICBUSU04IE9DUkVGQ0xSIHwKKyAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKKyAgICB8ICBUSU0yIElDNCAgICAgIHwgIFRJTTIgSUM0ICAgICAgfCAgVElNMyBJQzIgICAgICB8ICBUSU0zIE9DUkVGQ0xSIHwgIFRJTTMgT0NSRUZDTFIgfCAgVElNMiBPQ1JFRkNMUiB8ICBUSU0yIElDMyAgICAgIHwKKyAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKKyAgICB8ICBUSU0yIE9DUkVGQ0xSIHwgIFRJTTIgT0NSRUZDTFIgfCAgVElNNCBJQzEgICAgICB8ICBUSU00IElDMiAgICAgIHwgIFRJTTQgSUMzICAgICAgfCAgVElNMTYgT0NSRUZDTFJ8ICBUSU0xIElDMiAgICAgIHwKKyAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKKyAgICB8ICBUSU0zIElDMSAgICAgIHwgIFRJTTMgSUMxICAgICAgfCAgVElNMTUgSUMxICAgICB8ICBUSU0xNSBPQ1JFRkNMUnwgIFRJTTE2IEJLSU4gICAgfCAgVElNMTYgSUMxICAgICB8ICBUSU0xNyBPQ1JFRkNMUnwKKyAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKKyAgICB8ICBUSU0zIE9DUkVGQ0xSIHwgIFRJTTMgT0NSRUZDTFIgfCAgVElNMTUgQktJTiAgICB8ICBUSU0xNSBJQzIgICAgIHwgIFRJTTE3IElDMSAgICAgfCAgVElNNCBJQzQgICAgICB8ICBUSU0xNyBCS0lOICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKworICAgIFRhYmxlIDQuIENPTVAgT3V0cHV0cyByZWRpcmVjdGlvbiB0byBlbWJlZGRlZCB0aW1lcnMgZm9yIHRoZSBTVE0zMkYzMDN4RSBkZXZpY2VzCisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgQ09NUDEgICAgICB8ICAgICBDT01QMiAgICAgIHwgICAgIENPTVAzICAgICAgfCAgICAgQ09NUDQgICAgICB8ICAgICBDT01QNSAgICAgIHwgICAgIENPTVA2ICAgICAgfCAgICAgQ09NUDcgICAgICB8CisgICAgfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgVElNMSBCS0lOICAgICB8ICBUSU0xIEJLSU4gICAgIHwgIFRJTTEgQktJTiAgICAgfCAgVElNMSBCS0lOICgxVSkgfCAgVElNMSBCS0lOICAgICB8ICBUSU0xIEJLSU4gICAgIHwgIFRJTTEgQktJTiAoMVUpIHwKKyAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKKyAgICB8ICBUSU0xIEJLSU4yICAgIHwgIFRJTTEgQktJTjIgICAgfCAgVElNMSBCS0lOMiAgICB8ICBUSU0xIEJLSU4yICAgIHwgIFRJTTEgQktJTjIgICAgfCAgVElNMSBCS0lOMiAgICB8ICBUSU0xIEJLSU4yICAgIHwKKyAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKKyAgICB8ICBUSU04IEJLSU4gICAgIHwgIFRJTTggQktJTiAgICAgfCAgVElNOCBCS0lOICAgICB8ICBUSU04IEJLSU4gKDFVKSB8ICBUSU04IEJLSU4gICAgIHwgIFRJTTggQktJTiAgICAgfCAgVElNOCBCS0lOICgxVSkgfAorICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAorICAgIHwgIFRJTTggQktJTjIgICAgfCAgVElNOCBCS0lOMiAgICB8ICBUSU04IEJLSU4yICAgIHwgIFRJTTggQktJTjIgICAgfCAgVElNOCBCS0lOMiAgICB8ICBUSU04IEJLSU4yICAgIHwgIFRJTTggQktJTjIgICAgfAorICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAorICAgIHwgIFRJTTEgQktJTjIgICAgfCAgVElNMSBCS0lOMiAgICB8ICBUSU0xIEJLSU4yICAgIHwgIFRJTTEgQktJTjIgICAgfCAgVElNMSBCS0lOMiAgICB8ICBUSU0xIEJLSU4yICAgIHwgIFRJTTEgQktJTjIgICAgfAorICAgIHwgICAgICsgICAgICAgICAgfCAgICAgKyAgICAgICAgICB8ICAgICArICAgICAgICAgIHwgICAgICsgICAgICAgICAgfCAgICAgKyAgICAgICAgICB8ICAgICArICAgICAgICAgIHwgICAgICsgICAgICAgICAgfAorICAgIHwgIFRJTThCS0lOMiAgICAgfCAgVElNOEJLSU4yICAgICB8ICBUSU04QktJTjIgICAgIHwgIFRJTThCS0lOMiAgICAgfCAgVElNOEJLSU4yICAgICB8ICBUSU04QktJTjIgICAgIHwgIFRJTThCS0lOMiAgICAgfAorICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAorICAgIHwgIFRJTTEgT0NSRUZDTFIgfCAgVElNMSBPQ1JFRkNMUiB8ICBUSU0xIE9DUkVGQ0xSIHwgIFRJTTggT0NSRUZDTFIgfCAgVElNOCBPQ1JFRkNMUiB8ICBUSU04IE9DUkVGQ0xSIHwgIFRJTTEgT0NSRUZDTFIgfAorICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAorICAgIHwgIFRJTTEgSUMxICAgICAgfCAgVElNMSBJQzEgICAgICB8ICBUSU0yIE9DUkVGQ0xSIHwgIFRJTTMgSUMzICAgICAgfCAgVElNMiBJQzEgICAgICB8ICBUSU0yIElDMiAgICAgIHwgIFRJTTggT0NSRUZDTFIgfAorICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAorICAgIHwgIFRJTTIgSUM0ICAgICAgfCAgVElNMiBJQzQgICAgICB8ICBUSU0zIElDMiAgICAgIHwgIFRJTTMgT0NSRUZDTFIgfCAgVElNMyBPQ1JFRkNMUiB8ICBUSU0yIE9DUkVGQ0xSIHwgIFRJTTIgSUMzICAgICAgfAorICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAorICAgIHwgIFRJTTIgT0NSRUZDTFIgfCAgVElNMiBPQ1JFRkNMUiB8ICBUSU00IElDMSAgICAgIHwgIFRJTTQgSUMyICAgICAgfCAgVElNNCBJQzMgICAgICB8ICBUSU0xNiBPQ1JFRkNMUnwgIFRJTTEgSUMyICAgICAgfAorICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAorICAgIHwgIFRJTTMgSUMxICAgICAgfCAgVElNMyBJQzEgICAgICB8ICBUSU0xNSBJQzEgICAgIHwgIFRJTTE1IE9DUkVGQ0xSfCAgVElNMTYgQktJTiAgICB8ICBUSU0xNiBJQzEgICAgIHwgIFRJTTE3IE9DUkVGQ0xSfAorICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAorICAgIHwgIFRJTTMgT0NSRUZDTFIgfCAgVElNMyBPQ1JFRkNMUiB8ICBUSU0xNSBCS0lOICAgIHwgIFRJTTE1IElDMiAgICAgfCAgVElNMTcgSUMxICAgICB8ICBUSU00IElDNCAgICAgIHwgIFRJTTE3IEJLSU4gICAgfAorICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAorICAgIHwgIFRJTTIwIEJLSU4gICAgfCAgVElNMjAgQktJTiAgICB8ICBUSU0yMCBCS0lOICAgIHwgIFRJTTIwIEJLSU4gKDFVKXwgIFRJTTIwIEJLSU4gICAgfCAgVElNMjAgQktJTiAgICB8ICBUSU0yMCBCS0lOICgxVSl8CisgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8CisgICAgfCAgVElNMjAgQktJTjIgICB8ICBUSU0yMCBCS0lOMiAgIHwgIFRJTTIwIEJLSU4yICAgfCAgVElNMjAgQktJTjIgICB8ICBUSU0yMCBCS0lOMiAgIHwgIFRJTTIwIEJLSU4yICAgfCAgVElNMjAgQktJTjIgICB8CisgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8CisgICAgfCAgVElNMSBCS0lOMiAgICB8ICBUSU0xIEJLSU4yICAgIHwgIFRJTTEgQktJTjIgICAgfCAgVElNMSBCS0lOMiAgICB8ICBUSU0xIEJLSU4yICAgIHwgIFRJTTEgQktJTjIgICAgfCAgVElNMSBCS0lOMiAgICB8CisgICAgfCAgICAgKyAgICAgICAgICB8ICAgICArICAgICAgICAgIHwgICAgICsgICAgICAgICAgfCAgICAgKyAgICAgICAgICB8ICAgICArICAgICAgICAgIHwgICAgICsgICAgICAgICAgfCAgICAgKyAgICAgICAgICB8CisgICAgfCAgVElNOCBCS0lOMiAgICB8ICBUSU04IEJLSU4yICAgIHwgIFRJTTggQktJTjIgICAgfCAgVElNOCBCS0lOMiAgICB8ICBUSU04IEJLSU4yICAgIHwgIFRJTTggQktJTjIgICAgfCAgVElNOCBCS0lOMiAgICB8CisgICAgfCAgICAgKyAgICAgICAgICB8ICAgICArICAgICAgICAgIHwgICAgICsgICAgICAgICAgfCAgICAgKyAgICAgICAgICB8ICAgICArICAgICAgICAgIHwgICAgICsgICAgICAgICAgfCAgICAgKyAgICAgICAgICB8CisgICAgfCAgVElNMjAgQktJTjIgICB8ICBUSU0yMCBCS0lOMiAgIHwgIFRJTTIwIEJLSU4yICAgfCAgVElNMjAgQktJTjIgICB8ICBUSU0yMCBCS0lOMiAgIHwgIFRJTTIwIEJLSU4yICAgfCAgVElNMjAgQktJTjIgICB8CisgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgKDFVKTogIFRoaXMgY29ubmVjdGlvbiBjb25zaXN0cyBvZiBjb25uZWN0aW5nIGJvdGggR1BJTyBhbmQgQ09NUCBvdXRwdXQgdG8gVElNMS84VS8yMCBCUksgaW5wdXQgdGhyb3VnaCBhbiBPUiBnYXRlLCBpbnN0ZWFkCisgICAgICAgICAgb2YgY29ubmVjdGluZyB0aGUgR1BJTyB0byB0aGUgVElNMS84VS8yMCBCUksgaW5wdXQgYW5kIHRoZSBDT01QIG91dHB1dCB0byB0aGUgVElNMS84VS8yMCBCUktfQUNUSCBpbnB1dC4gVGhlIGFpbSBpcyB0bworICAgICAgICAgIGFkZCBhIGRpZ2l0YWwgZmlsdGVyICgzICBiaXRzKSBvbiB0aGUgQ09NUCBvdXRwdXQuCisKKyAgICBUYWJsZSA1LiBDT01QIE91dHB1dHMgYmxhbmtpbmcgc291cmNlcyBmb3IgdGhlIFNUTTMyRjMwM3hCL1NUTTMyRjMwM3hDL1NUTTMyRjMwM3hFIGRldmljZXMKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICAgICBDT01QMSAgICAgIHwgICAgIENPTVAyICAgICAgfCAgICAgQ09NUDMgICAgICB8ICAgICBDT01QNCAgICAgIHwgICAgIENPTVA1ICAgICAgfCAgICAgQ09NUDYgICAgICB8ICAgICBDT01QNyAgICAgIHwKKyAgICB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICBUSU0xIE9DNSAgICAgIHwgIFRJTTEgT0M1ICAgICAgfCAgVElNMSBPQzUgICAgICB8ICBUSU0zIE9DNCAgICAgIHwgIC0tLS0tLS0tICAgICAgfCAgVElNOCBPQzUgICAgICB8ICBUSU0xIE9DNSAgICAgIHwKKyAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKKyAgICB8ICBUSU0yIE9DMyAgICAgIHwgIFRJTTIgT0MzICAgICAgfCAgLS0tLS0tLS0gICAgICB8ICBUSU04IE9DNSAgICAgIHwgIFRJTTMgT0MzICAgICAgfCAgVElNMiBPQzQgICAgICB8ICBUSU04IE9DNSAgICAgIHwKKyAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKKyAgICB8ICBUSU0zIE9DMyAgICAgIHwgIFRJTTMgT0MzICAgICAgfCAgVElNMiBPQzQgICAgICB8ICBUSU0xNSBPQzEgICAgIHwgIFRJTTggT0M1ICAgICAgfCAgVElNMTUgT0MyICAgICB8ICBUSU0xNSBPQzIgICAgIHwKKyAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKworKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUCBDT01QCisgICogQGJyaWVmIENPTVAgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX0NPTVBfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENPTVBfUHJpdmF0ZV9Db25zdGFudHMgQ09NUCBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisjZGVmaW5lIENPTVBfTE9DS19ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgQ09NUF9MT0NLX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgQ09NUF9DU1JfQ09NUHhMT0NLCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIENPTVBfRXhwb3J0ZWRfRnVuY3Rpb25zIENPTVAgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMuCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgdG8gaW5pdGlhbGl6ZSBhbmQgZGUtaW5pdGlhbGl6ZSBjb21wYXJhdG9ycy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBDT01QIHBlcmlwaGVyYWwgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIENPTVBfSW5pdFR5cGVEZWYgYW5kIGluaXRpYWxpemUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBub3RlICAgSWYgdGhlIHNlbGVjdGVkIGNvbXBhcmF0b3IgaXMgbG9ja2VkLCBpbml0aWFsaXphdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkLgorICAqICAgICAgICAgVG8gdW5sb2NrIHRoZSBjb25maWd1cmF0aW9uLCBwZXJmb3JtIGEgc3lzdGVtIHJlc2V0LgorICAqIEBwYXJhbSAgaGNvbXAgIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ09NUF9Jbml0KENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBDaGVjayB0aGUgQ09NUCBoYW5kbGUgYWxsb2NhdGlvbiBhbmQgbG9jayBzdGF0dXMgKi8KKyAgaWYgKChoY29tcCA9PSBOVUxMKSB8fCAoKGhjb21wLT5TdGF0ZSAmIENPTVBfU1RBVEVfQklUX0xPQ0spICE9IFJFU0VUKSkKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19DT01QX0FMTF9JTlNUQU5DRShoY29tcC0+SW5zdGFuY2UpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfQ09NUF9JTlZFUlRJTkdJTlBVVChoY29tcC0+SW5pdC5JbnZlcnRpbmdJbnB1dCkpOworICAgIGFzc2VydF9wYXJhbShJU19DT01QX05PTklOVkVSVElOR0lOUFVUKGhjb21wLT5Jbml0Lk5vbkludmVydGluZ0lucHV0KSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0NPTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU5TVEFOQ0UoaGNvbXAtPkluc3RhbmNlLCBoY29tcC0+SW5pdC5Ob25JbnZlcnRpbmdJbnB1dCkpOworICAgIGFzc2VydF9wYXJhbShJU19DT01QX09VVFBVVChoY29tcC0+SW5pdC5PdXRwdXQpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfQ09NUF9PVVRQVVRfSU5TVEFOQ0UoaGNvbXAtPkluc3RhbmNlLCBoY29tcC0+SW5pdC5PdXRwdXQpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfQ09NUF9PVVRQVVRQT0woaGNvbXAtPkluaXQuT3V0cHV0UG9sKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0NPTVBfSFlTVEVSRVNJUyhoY29tcC0+SW5pdC5IeXN0ZXJlc2lzKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0NPTVBfTU9ERShoY29tcC0+SW5pdC5Nb2RlKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0NPTVBfQkxBTktJTkdTUkNFKGhjb21wLT5Jbml0LkJsYW5raW5nU3JjZSkpOworICAgIGFzc2VydF9wYXJhbShJU19DT01QX0JMQU5LSU5HU1JDRV9JTlNUQU5DRShoY29tcC0+SW5zdGFuY2UsIGhjb21wLT5Jbml0LkJsYW5raW5nU3JjZSkpOworICAgIGFzc2VydF9wYXJhbShJU19DT01QX1RSSUdHRVJNT0RFKGhjb21wLT5Jbml0LlRyaWdnZXJNb2RlKSk7CisKKyAgICBpZiAoaGNvbXAtPkluaXQuV2luZG93TW9kZSAhPSBDT01QX1dJTkRPV01PREVfRElTQUJMRSkKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfQ09NUF9XSU5ET1dNT0RFX0lOU1RBTkNFKGhjb21wLT5JbnN0YW5jZSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX0NPTVBfV0lORE9XTU9ERShoY29tcC0+SW5pdC5XaW5kb3dNb2RlKSk7CisgICAgfQorCisgICAgLyogSW5pdCBTWVNDRkcgYW5kIHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgdG8gYWNjZXNzIGNvbXBhcmF0b3JzICovCisgICAgX19IQUxfUkNDX1NZU0NGR19DTEtfRU5BQkxFKCk7CisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogU1lTQ0ZHIHRvIGFjY2VzcyBjb21wYXJhdG9ycyAqLworICAgIEhBTF9DT01QX01zcEluaXQoaGNvbXApOworCisgICAgaWYgKGhjb21wLT5TdGF0ZSA9PSBIQUxfQ09NUF9TVEFURV9SRVNFVCkKKyAgICB7CisgICAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgICBoY29tcC0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKyAgICB9CisKKyAgICAvKiBNYW5hZ2UgaW52ZXJ0aW5nIGlucHV0IGNvbXBhcmF0b3IgaW52ZXJ0aW5nIGlucHV0IGNvbm5lY3RlZCB0byBhIEdQSU8gICovCisgICAgLyogZm9yIFNUTTMyRjMwMngsIFNUTTMyRjMyeHgsIFNUTTMyRjMzeC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGhjb21wLT5Jbml0LkludmVydGluZ0lucHV0ID0gQ09NUF9JTlZFUlRJTkdJTlBVVF9TRUxFQ1RJT04oaGNvbXAtPkluc3RhbmNlLCBoY29tcC0+SW5pdC5JbnZlcnRpbmdJbnB1dCk7CisKKyAgICAvKiBTZXQgQ09NUCBwYXJhbWV0ZXJzICovCisgICAgLyogICAgIFNldCBDT01QeElOU0VMIGJpdHMgYWNjb3JkaW5nIHRvIGhjb21wLT5Jbml0LkludmVydGluZ0lucHV0IHZhbHVlICAgICAgICAqLworICAgIC8qICAgICBTZXQgQ09NUHhOT05JTlNFTCBiaXRzIGFjY29yZGluZyB0byBoY29tcC0+SW5pdC5Ob25JbnZlcnRpbmdJbnB1dCB2YWx1ZSAgKi8KKyAgICAvKiAgICAgU2V0IENPTVB4QkxBTktJTkcgYml0cyBhY2NvcmRpbmcgdG8gaGNvbXAtPkluaXQuQmxhbmtpbmdTcmNlIHZhbHVlICAgICAgICovCisgICAgLyogICAgIFNldCBDT01QeE9VVFNFTCBiaXRzIGFjY29yZGluZyB0byBoY29tcC0+SW5pdC5PdXRwdXQgdmFsdWUgICAgICAgICAgICAgICAqLworICAgIC8qICAgICBTZXQgQ09NUHhQT0wgYml0IGFjY29yZGluZyB0byBoY29tcC0+SW5pdC5PdXRwdXRQb2wgdmFsdWUgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgU2V0IENPTVB4SFlTVCBiaXRzIGFjY29yZGluZyB0byBoY29tcC0+SW5pdC5IeXN0ZXJlc2lzIHZhbHVlICAgICAgICAgICAgICovCisgICAgLyogICAgIFNldCBDT01QeE1PREUgYml0cyBhY2NvcmRpbmcgdG8gaGNvbXAtPkluaXQuTW9kZSB2YWx1ZSAgICAgICAgICAgICAgICAgICAqLworICAgIENPTVBfSU5JVChoY29tcCk7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBDT01QIHN0YXRlKi8KKyAgICBoY29tcC0+U3RhdGUgPSBIQUxfQ09NUF9TVEFURV9SRUFEWTsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplIHRoZSBDT01QIHBlcmlwaGVyYWwuCisgICogQG5vdGUgICBJZiB0aGUgc2VsZWN0ZWQgY29tcGFyYXRvciBpcyBsb2NrZWQsIGRlaW5pdGlhbGl6YXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZC4KKyAgKiAgICAgICAgIFRvIHVubG9jayB0aGUgY29uZmlndXJhdGlvbiwgcGVyZm9ybSBhIHN5c3RlbSByZXNldC4KKyAgKiBAcGFyYW0gIGhjb21wICBDT01QIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NPTVBfRGVJbml0KENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBDaGVjayB0aGUgQ09NUCBoYW5kbGUgYWxsb2NhdGlvbiBhbmQgbG9jayBzdGF0dXMgKi8KKyAgaWYgKChoY29tcCA9PSBOVUxMKSB8fCAoKGhjb21wLT5TdGF0ZSAmIENPTVBfU1RBVEVfQklUX0xPQ0spICE9IFJFU0VUKSkKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgICAgYXNzZXJ0X3BhcmFtKElTX0NPTVBfQUxMX0lOU1RBTkNFKGhjb21wLT5JbnN0YW5jZSkpOworCisgICAgLyogU2V0IENPTVBfQ1NSIHJlZ2lzdGVyIHRvIHJlc2V0IHZhbHVlICovCisgICAgQ09NUF9ERUlOSVQoaGNvbXApOworCisgICAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IFNZU0NGRywgR1BJTywgQ0xPQ0sgYW5kIE5WSUMgKi8KKyAgICBIQUxfQ09NUF9Nc3BEZUluaXQoaGNvbXApOworCisgICAgaGNvbXAtPlN0YXRlID0gSEFMX0NPTVBfU1RBVEVfUkVTRVQ7CisKKyAgICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNvbXApOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBDT01QIE1TUC4KKyAgKiBAcGFyYW0gIGhjb21wICBDT01QIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0NPTVBfTXNwSW5pdChDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoY29tcCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9DT01QX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIENPTVAgTVNQLgorICAqIEBwYXJhbSAgaGNvbXAgIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQ09NUF9Nc3BEZUluaXQoQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGNvbXApOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfQ09NUF9Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgU3RhcnQgU3RvcCBvcGVyYXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgU3RhcnQtU3RvcCBvcGVyYXRpb24gZnVuY3Rpb25zLgorICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBTdGFydCBTdG9wIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBTdGFydCBhIGNvbXBhcmF0b3Igd2l0aG91dCBpbnRlcnJ1cHQgZ2VuZXJhdGlvbi4KKyAgICAgICgrKSBTdG9wIGEgY29tcGFyYXRvciB3aXRob3V0IGludGVycnVwdCBnZW5lcmF0aW9uLgorICAgICAgKCspIFN0YXJ0IGEgY29tcGFyYXRvciB3aXRoIGludGVycnVwdCBnZW5lcmF0aW9uLgorICAgICAgKCspIFN0b3AgYSBjb21wYXJhdG9yIHdpdGggaW50ZXJydXB0IGdlbmVyYXRpb24uCisgICAgICAoKykgSGFuZGxlIGludGVycnVwdHMgZnJvbSBhIGNvbXBhcmF0b3Igd2l0aCBhc3NvY2lhdGVkIGNhbGxiYWNrIGZ1bmN0aW9uLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBjb21wYXJhdG9yLgorICAqIEBwYXJhbSAgaGNvbXAgIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ09NUF9TdGFydChDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIHVpbnQzMl90IGV4dGlsaW5lID0gMFU7CisKKyAgLyogQ2hlY2sgdGhlIENPTVAgaGFuZGxlIGFsbG9jYXRpb24gYW5kIGxvY2sgc3RhdHVzICovCisgIGlmICgoaGNvbXAgPT0gTlVMTCkgfHwgKChoY29tcC0+U3RhdGUgJiBDT01QX1NUQVRFX0JJVF9MT0NLKSAhPSBSRVNFVCkpCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICAgIGFzc2VydF9wYXJhbShJU19DT01QX0FMTF9JTlNUQU5DRShoY29tcC0+SW5zdGFuY2UpKTsKKworICAgIGlmIChoY29tcC0+U3RhdGUgPT0gSEFMX0NPTVBfU1RBVEVfUkVBRFkpCisgICAgeworICAgICAgLyogR2V0IHRoZSBFWFRJIExpbmUgb3V0cHV0IGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgIGV4dGlsaW5lID0gQ09NUF9HRVRfRVhUSV9MSU5FKGhjb21wLT5JbnN0YW5jZSk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgZXZlbnQgZ2VuZXJhdGlvbiAqLworICAgICAgaWYgKChoY29tcC0+SW5pdC5UcmlnZ2VyTW9kZSAmIChDT01QX1RSSUdHRVJNT0RFX0VWRU5UX1JJU0lORyB8IENPTVBfVFJJR0dFUk1PREVfRVZFTlRfRkFMTElORykpICE9IFJFU0VUKQorICAgICAgeworICAgICAgICAvKiBDb25maWd1cmUgdGhlIGV2ZW50IHRyaWdnZXIgcmlzaW5nIGVkZ2UgKi8KKyAgICAgICAgaWYgKChoY29tcC0+SW5pdC5UcmlnZ2VyTW9kZSAmIENPTVBfVFJJR0dFUk1PREVfRVZFTlRfUklTSU5HKSAhPSBSRVNFVCkKKyAgICAgICAgeworICAgICAgICAgIENPTVBfRVhUSV9SSVNJTkdfRU5BQkxFKGV4dGlsaW5lKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBDT01QX0VYVElfUklTSU5HX0RJU0FCTEUoZXh0aWxpbmUpOworICAgICAgICB9CisKKyAgICAgICAgLyogQ29uZmlndXJlIHRoZSB0cmlnZ2VyIGZhbGxpbmcgZWRnZSAqLworICAgICAgICBpZiAoKGhjb21wLT5Jbml0LlRyaWdnZXJNb2RlICYgQ09NUF9UUklHR0VSTU9ERV9FVkVOVF9GQUxMSU5HKSAhPSBSRVNFVCkKKyAgICAgICAgeworICAgICAgICAgIENPTVBfRVhUSV9GQUxMSU5HX0VOQUJMRShleHRpbGluZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgQ09NUF9FWFRJX0ZBTExJTkdfRElTQUJMRShleHRpbGluZSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBFbmFibGUgRVhUSSBldmVudCBnZW5lcmF0aW9uICovCisgICAgICAgIENPTVBfRVhUSV9FTkFCTEVfRVZFTlQoZXh0aWxpbmUpOworCisgICAgICAgIC8qIENsZWFyIENPTVAgRVhUSSBwZW5kaW5nIGJpdCAqLworICAgICAgICBDT01QX0VYVElfQ0xFQVJfRkxBRyhleHRpbGluZSk7CisgICAgICB9CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgY29tcGFyYXRvciAqLworICAgICAgX19IQUxfQ09NUF9FTkFCTEUoaGNvbXApOworCisgICAgICBoY29tcC0+U3RhdGUgPSBIQUxfQ09NUF9TVEFURV9CVVNZOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcCB0aGUgY29tcGFyYXRvci4KKyAgKiBAcGFyYW0gIGhjb21wICBDT01QIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NPTVBfU3RvcChDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgdGhlIENPTVAgaGFuZGxlIGFsbG9jYXRpb24gYW5kIGxvY2sgc3RhdHVzICovCisgIGlmICgoaGNvbXAgPT0gTlVMTCkgfHwgKChoY29tcC0+U3RhdGUgJiBDT01QX1NUQVRFX0JJVF9MT0NLKSAhPSBSRVNFVCkpCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICAgIGFzc2VydF9wYXJhbShJU19DT01QX0FMTF9JTlNUQU5DRShoY29tcC0+SW5zdGFuY2UpKTsKKworICAgIGlmIChoY29tcC0+U3RhdGUgPT0gSEFMX0NPTVBfU1RBVEVfQlVTWSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBFWFRJIExpbmUgZXZlbnQgbW9kZSBpZiBhbnkgKi8KKyAgICAgIENPTVBfRVhUSV9ESVNBQkxFX0VWRU5UKENPTVBfR0VUX0VYVElfTElORShoY29tcC0+SW5zdGFuY2UpKTsKKworICAgICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgY29tcGFyYXRvciAqLworICAgICAgX19IQUxfQ09NUF9ESVNBQkxFKGhjb21wKTsKKworICAgICAgaGNvbXAtPlN0YXRlID0gSEFMX0NPTVBfU1RBVEVfUkVBRFk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgY29tcGFyYXRvciBpbiBJbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhjb21wICBDT01QIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cy4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DT01QX1N0YXJ0X0lUKENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgdWludDMyX3QgZXh0aWxpbmUgPSAwVTsKKworICAvKiBDaGVjayB0aGUgQ09NUCBoYW5kbGUgYWxsb2NhdGlvbiBhbmQgbG9jayBzdGF0dXMgKi8KKyAgaWYgKChoY29tcCA9PSBOVUxMKSB8fCAoKGhjb21wLT5TdGF0ZSAmIENPTVBfU1RBVEVfQklUX0xPQ0spICE9IFJFU0VUKSkKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgICAgYXNzZXJ0X3BhcmFtKElTX0NPTVBfQUxMX0lOU1RBTkNFKGhjb21wLT5JbnN0YW5jZSkpOworCisgICAgaWYgKGhjb21wLT5TdGF0ZSA9PSBIQUxfQ09NUF9TVEFURV9SRUFEWSkKKyAgICB7CisgICAgICAvKiBDb25maWd1cmUgdGhlIEVYVEkgZXZlbnQgZ2VuZXJhdGlvbiAqLworICAgICAgaWYgKChoY29tcC0+SW5pdC5UcmlnZ2VyTW9kZSAmIChDT01QX1RSSUdHRVJNT0RFX0lUX1JJU0lORyB8IENPTVBfVFJJR0dFUk1PREVfSVRfRkFMTElORykpICE9IFJFU0VUKQorICAgICAgeworICAgICAgICAvKiBHZXQgdGhlIEVYVEkgTGluZSBvdXRwdXQgY29uZmlndXJhdGlvbiAqLworICAgICAgICBleHRpbGluZSA9IENPTVBfR0VUX0VYVElfTElORShoY29tcC0+SW5zdGFuY2UpOworCisgICAgICAgIC8qIENvbmZpZ3VyZSB0aGUgdHJpZ2dlciByaXNpbmcgZWRnZSAqLworICAgICAgICBpZiAoKGhjb21wLT5Jbml0LlRyaWdnZXJNb2RlICYgQ09NUF9UUklHR0VSTU9ERV9JVF9SSVNJTkcpICE9IFJFU0VUKQorICAgICAgICB7CisgICAgICAgICAgQ09NUF9FWFRJX1JJU0lOR19FTkFCTEUoZXh0aWxpbmUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIENPTVBfRVhUSV9SSVNJTkdfRElTQUJMRShleHRpbGluZSk7CisgICAgICAgIH0KKyAgICAgICAgLyogQ29uZmlndXJlIHRoZSB0cmlnZ2VyIGZhbGxpbmcgZWRnZSAqLworICAgICAgICBpZiAoKGhjb21wLT5Jbml0LlRyaWdnZXJNb2RlICYgQ09NUF9UUklHR0VSTU9ERV9JVF9GQUxMSU5HKSAhPSBSRVNFVCkKKyAgICAgICAgeworICAgICAgICAgIENPTVBfRVhUSV9GQUxMSU5HX0VOQUJMRShleHRpbGluZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgQ09NUF9FWFRJX0ZBTExJTkdfRElTQUJMRShleHRpbGluZSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBDbGVhciBDT01QIEVYVEkgcGVuZGluZyBiaXQgaWYgYW55ICovCisgICAgICAgIENPTVBfRVhUSV9DTEVBUl9GTEFHKGV4dGlsaW5lKTsKKworICAgICAgICAvKiBFbmFibGUgRVhUSSBpbnRlcnJ1cHQgbW9kZSAqLworICAgICAgICBDT01QX0VYVElfRU5BQkxFX0lUKGV4dGlsaW5lKTsKKworICAgICAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIGNvbXBhcmF0b3IgKi8KKyAgICAgICAgX19IQUxfQ09NUF9FTkFCTEUoaGNvbXApOworCisgICAgICAgIGhjb21wLT5TdGF0ZSA9IEhBTF9DT01QX1NUQVRFX0JVU1k7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgdGhlIGNvbXBhcmF0b3IgaW4gSW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBoY29tcCAgQ09NUCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DT01QX1N0b3BfSVQoQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIERpc2FibGUgdGhlIEVYVEkgTGluZSBpbnRlcnJ1cHQgbW9kZSAqLworICBDT01QX0VYVElfRElTQUJMRV9JVChDT01QX0dFVF9FWFRJX0xJTkUoaGNvbXAtPkluc3RhbmNlKSk7CisKKyAgc3RhdHVzID0gSEFMX0NPTVBfU3RvcChoY29tcCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBDb21wYXJhdG9yIElSUSBIYW5kbGVyLgorICAqIEBwYXJhbSAgaGNvbXAgIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCit2b2lkIEhBTF9DT01QX0lSUUhhbmRsZXIoQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCkKK3sKKyAgdWludDMyX3QgZXh0aWxpbmUgPSBDT01QX0dFVF9FWFRJX0xJTkUoaGNvbXAtPkluc3RhbmNlKTsKKworICAvKiBDaGVjayBDT01QIEVYVEkgZmxhZyAqLworICBpZiAoQ09NUF9FWFRJX0dFVF9GTEFHKGV4dGlsaW5lKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIENsZWFyIENPTVAgRVhUSSBwZW5kaW5nIGJpdCAqLworICAgIENPTVBfRVhUSV9DTEVBUl9GTEFHKGV4dGlsaW5lKTsKKworICAgIC8qIENPTVAgdHJpZ2dlciB1c2VyIGNhbGxiYWNrICovCisgICAgSEFMX0NPTVBfVHJpZ2dlckNhbGxiYWNrKGhjb21wKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIENvbXBhcmF0b3IgY2FsbGJhY2suCisgICogQHBhcmFtICBoY29tcCAgQ09NUCBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9DT01QX1RyaWdnZXJDYWxsYmFjayhDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoY29tcCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9DT01QX1RyaWdnZXJDYWxsYmFjayBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICogIEBicmllZiAgIE1hbmFnZW1lbnQgZnVuY3Rpb25zLgorICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbnRyb2wgdGhlIGNvbXBhcmF0b3JzLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIExvY2sgdGhlIHNlbGVjdGVkIGNvbXBhcmF0b3IgY29uZmlndXJhdGlvbi4KKyAgKiBAbm90ZSAgIEEgc3lzdGVtIHJlc2V0IGlzIHJlcXVpcmVkIHRvIHVubG9jayB0aGUgY29tcGFyYXRvciBjb25maWd1cmF0aW9uLgorICAqIEBwYXJhbSAgaGNvbXAgIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ09NUF9Mb2NrKENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBDaGVjayB0aGUgQ09NUCBoYW5kbGUgYWxsb2NhdGlvbiBhbmQgbG9jayBzdGF0dXMgKi8KKyAgaWYgKChoY29tcCA9PSBOVUxMKSB8fCAoKGhjb21wLT5TdGF0ZSAmIENPTVBfU1RBVEVfQklUX0xPQ0spICE9IFJFU0VUKSkKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgICAgYXNzZXJ0X3BhcmFtKElTX0NPTVBfQUxMX0lOU1RBTkNFKGhjb21wLT5JbnN0YW5jZSkpOworCisgICAgLyogU2V0IGxvY2sgZmxhZyBvbiBzdGF0ZSAqLworICAgIHN3aXRjaCAoaGNvbXAtPlN0YXRlKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX0NPTVBfU1RBVEVfQlVTWToKKyAgICAgICAgaGNvbXAtPlN0YXRlID0gSEFMX0NPTVBfU1RBVEVfQlVTWV9MT0NLRUQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBIQUxfQ09NUF9TVEFURV9SRUFEWToKKyAgICAgICAgaGNvbXAtPlN0YXRlID0gSEFMX0NPTVBfU1RBVEVfUkVBRFlfTE9DS0VEOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIHVuZXhwZWN0ZWQgc3RhdGUgKi8KKyAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoc3RhdHVzID09IEhBTF9PSykKKyAgeworICAgIC8qIFNldCB0aGUgbG9jayBiaXQgY29ycmVzcG9uZGluZyB0byBzZWxlY3RlZCBjb21wYXJhdG9yICovCisgICAgX19IQUxfQ09NUF9MT0NLKGhjb21wKTsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBvdXRwdXQgbGV2ZWwgKGhpZ2ggb3IgbG93KSBvZiB0aGUgc2VsZWN0ZWQgY29tcGFyYXRvci4KKyAgKiAgICAgICAgIFRoZSBvdXRwdXQgbGV2ZWwgZGVwZW5kcyBvbiB0aGUgc2VsZWN0ZWQgcG9sYXJpdHkuCisgICogICAgICAgICBJZiB0aGUgcG9sYXJpdHkgaXMgbm90IGludmVydGVkOgorICAqICAgICAgICAgICAtIENvbXBhcmF0b3Igb3V0cHV0IGlzIGxvdyB3aGVuIHRoZSBub24taW52ZXJ0aW5nIGlucHV0IGlzIGF0IGEgbG93ZXIKKyAgKiAgICAgICAgICAgICB2b2x0YWdlIHRoYW4gdGhlIGludmVydGluZyBpbnB1dAorICAqICAgICAgICAgICAtIENvbXBhcmF0b3Igb3V0cHV0IGlzIGhpZ2ggd2hlbiB0aGUgbm9uLWludmVydGluZyBpbnB1dCBpcyBhdCBhIGhpZ2hlcgorICAqICAgICAgICAgICAgIHZvbHRhZ2UgdGhhbiB0aGUgaW52ZXJ0aW5nIGlucHV0CisgICogICAgICAgICBJZiB0aGUgcG9sYXJpdHkgaXMgaW52ZXJ0ZWQ6CisgICogICAgICAgICAgIC0gQ29tcGFyYXRvciBvdXRwdXQgaXMgaGlnaCB3aGVuIHRoZSBub24taW52ZXJ0aW5nIGlucHV0IGlzIGF0IGEgbG93ZXIKKyAgKiAgICAgICAgICAgICB2b2x0YWdlIHRoYW4gdGhlIGludmVydGluZyBpbnB1dAorICAqICAgICAgICAgICAtIENvbXBhcmF0b3Igb3V0cHV0IGlzIGxvdyB3aGVuIHRoZSBub24taW52ZXJ0aW5nIGlucHV0IGlzIGF0IGEgaGlnaGVyCisgICogICAgICAgICAgICAgdm9sdGFnZSB0aGFuIHRoZSBpbnZlcnRpbmcgaW5wdXQKKyAgKiBAcGFyYW0gIGhjb21wICBDT01QIGhhbmRsZQorICAqIEByZXR2YWwgUmV0dXJucyB0aGUgc2VsZWN0ZWQgY29tcGFyYXRvciBvdXRwdXQgbGV2ZWw6CisgICogICAgICAgICBAYXJnIEByZWYgQ09NUF9PVVRQVVRMRVZFTF9MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBDT01QX09VVFBVVExFVkVMX0hJR0gKKyAgKgorICAqLwordWludDMyX3QgSEFMX0NPTVBfR2V0T3V0cHV0TGV2ZWwoQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCkKK3sKKyAgdWludDMyX3QgbGV2ZWwgPSAwVTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19DT01QX0FMTF9JTlNUQU5DRShoY29tcC0+SW5zdGFuY2UpKTsKKworICBsZXZlbCA9IFJFQURfQklUKGhjb21wLT5JbnN0YW5jZS0+Q1NSLCBDT01QX0NTUl9DT01QeE9VVCk7CisKKyAgaWYgKGxldmVsICE9IDBVKQorICB7CisgICAgcmV0dXJuIChDT01QX09VVFBVVExFVkVMX0hJR0gpOworICB9CisgIHJldHVybiAoQ09NUF9PVVRQVVRMRVZFTF9MT1cpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICogIEBicmllZiAgIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zLgorICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHBlcm1pdHMgdG8gZ2V0IGluIHJ1bi10aW1lIHRoZSBzdGF0dXMgb2YgdGhlIHBlcmlwaGVyYWwuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBDT01QIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIGhjb21wICBDT01QIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfQ09NUF9TdGF0ZVR5cGVEZWYgSEFMX0NPTVBfR2V0U3RhdGUoQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCkKK3sKKyAgLyogQ2hlY2sgdGhlIENPTVAgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGhjb21wID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0NPTVBfU1RBVEVfUkVTRVQ7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19DT01QX0FMTF9JTlNUQU5DRShoY29tcC0+SW5zdGFuY2UpKTsKKworICAvKiBSZXR1cm4gQ09NUCBoYW5kbGUgc3RhdGUgKi8KKyAgcmV0dXJuIGhjb21wLT5TdGF0ZTsKK30KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfQ09NUF9NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmYzeHhfaGFsX2NvcnRleC5jIGIvU3JjL3N0bTMyZjN4eF9oYWxfY29ydGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEyYzc4YgotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfaGFsX2NvcnRleC5jCkBAIC0wLDAgKzEsNTI5IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2hhbF9jb3J0ZXguYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgQ09SVEVYIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIENPUlRFWDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqCisgICogIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBbLi5dCisgICAgKioqIEhvdyB0byBjb25maWd1cmUgSW50ZXJydXB0cyB1c2luZyBDT1JURVggSEFMIGRyaXZlciAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbmZpZ3VyZSB0aGUgTlZJQyBpbnRlcnJ1cHRzIChJUlEpLgorICAgIFRoZSBDb3J0ZXgtTTQgZXhjZXB0aW9ucyBhcmUgbWFuYWdlZCBieSBDTVNJUyBmdW5jdGlvbnMuCisKKyAgICAoIykgQ29uZmlndXJlIHRoZSBOVklDIFByaW9yaXR5IEdyb3VwaW5nIHVzaW5nIEhBTF9OVklDX1NldFByaW9yaXR5R3JvdXBpbmcoKSBmdW5jdGlvbgorCisgICAgICgjKSAgQ29uZmlndXJlIHRoZSBwcmlvcml0eSBvZiB0aGUgc2VsZWN0ZWQgSVJRIENoYW5uZWxzIHVzaW5nIEhBTF9OVklDX1NldFByaW9yaXR5KCkKKworICAgICAoIykgIEVuYWJsZSB0aGUgc2VsZWN0ZWQgSVJRIENoYW5uZWxzIHVzaW5nIEhBTF9OVklDX0VuYWJsZUlSUSgpCisKKworICAgICAtQC0gV2hlbiB0aGUgTlZJQ19QUklPUklUWUdST1VQXzAgaXMgc2VsZWN0ZWQsIElSUSBwcmUtZW1wdGlvbiBpcyBubyBtb3JlIHBvc3NpYmxlLgorICAgICAgICAgVGhlIHBlbmRpbmcgSVJRIHByaW9yaXR5IHdpbGwgYmUgbWFuYWdlZCBvbmx5IGJ5IHRoZSBzdWIgcHJpb3JpdHkuCisKKyAgICAgLUAtIElSUSBwcmlvcml0eSBvcmRlciAoc29ydGVkIGJ5IGhpZ2hlc3QgdG8gbG93ZXN0IHByaW9yaXR5KToKKyAgICAgICAgKCtAKSBMb3dlc3QgcHJlLWVtcHRpb24gcHJpb3JpdHkKKyAgICAgICAgKCtAKSBMb3dlc3Qgc3ViIHByaW9yaXR5CisgICAgICAgICgrQCkgTG93ZXN0IGhhcmR3YXJlIHByaW9yaXR5IChJUlEgbnVtYmVyKQorCisgICAgWy4uXQorICAgICoqKiBIb3cgdG8gY29uZmlndXJlIFN5c3RpY2sgdXNpbmcgQ09SVEVYIEhBTCBkcml2ZXIgKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgU2V0dXAgU3lzVGljayBUaW1lciBmb3IgdGltZSBiYXNlIAorICAgICAgICAgICAKKyAgICgrKSBUaGUgSEFMX1NZU1RJQ0tfQ29uZmlnKClmdW5jdGlvbiBjYWxscyB0aGUgU3lzVGlja19Db25maWcoKSBmdW5jdGlvbiB3aGljaAorICAgICAgIGlzIGEgQ01TSVMgZnVuY3Rpb24gdGhhdDoKKyAgICAgICAgKCsrKSBDb25maWd1cmVzIHRoZSBTeXNUaWNrIFJlbG9hZCByZWdpc3RlciB3aXRoIHZhbHVlIHBhc3NlZCBhcyBmdW5jdGlvbiBwYXJhbWV0ZXIuCisgICAgICAgICgrKykgQ29uZmlndXJlcyB0aGUgU3lzVGljayBJUlEgcHJpb3JpdHkgdG8gdGhlIGxvd2VzdCB2YWx1ZSAoMHgwRlUpLgorICAgICAgICAoKyspIFJlc2V0cyB0aGUgU3lzVGljayBDb3VudGVyIHJlZ2lzdGVyLgorICAgICAgICAoKyspIENvbmZpZ3VyZXMgdGhlIFN5c1RpY2sgQ291bnRlciBjbG9jayBzb3VyY2UgdG8gYmUgQ29yZSBDbG9jayBTb3VyY2UgKEhDTEspLgorICAgICAgICAoKyspIEVuYWJsZXMgdGhlIFN5c1RpY2sgSW50ZXJydXB0LgorICAgICAgICAoKyspIFN0YXJ0cyB0aGUgU3lzVGljayBDb3VudGVyLgorICAgIAorICAgKCspIFlvdSBjYW4gY2hhbmdlIHRoZSBTeXNUaWNrIENsb2NrIHNvdXJjZSB0byBiZSBIQ0xLX0RpdjggYnkgY2FsbGluZyB0aGUgbWFjcm8KKyAgICAgICBfX0hBTF9DT1JURVhfU1lTVElDS0NMS19DT05GSUcoU1lTVElDS19DTEtTT1VSQ0VfSENMS19ESVY4KSBqdXN0IGFmdGVyIHRoZQorICAgICAgIEhBTF9TWVNUSUNLX0NvbmZpZygpIGZ1bmN0aW9uIGNhbGwuIFRoZSBfX0hBTF9DT1JURVhfU1lTVElDS0NMS19DT05GSUcoKSBtYWNybyBpcyBkZWZpbmVkCisgICAgICAgaW5zaWRlIHRoZSBzdG0zMmYzeHhfaGFsX2NvcnRleC5oIGZpbGUuCisKKyAgICgrKSBZb3UgY2FuIGNoYW5nZSB0aGUgU3lzVGljayBJUlEgcHJpb3JpdHkgYnkgY2FsbGluZyB0aGUKKyAgICAgICBIQUxfTlZJQ19TZXRQcmlvcml0eShTeXNUaWNrX0lSUW4sLi4uKSBmdW5jdGlvbiBqdXN0IGFmdGVyIHRoZSBIQUxfU1lTVElDS19Db25maWcoKSBmdW5jdGlvbiAKKyAgICAgICBjYWxsLiBUaGUgSEFMX05WSUNfU2V0UHJpb3JpdHkoKSBjYWxsIHRoZSBOVklDX1NldFByaW9yaXR5KCkgZnVuY3Rpb24gd2hpY2ggaXMgYSBDTVNJUyBmdW5jdGlvbi4KKworICAgKCspIFRvIGFkanVzdCB0aGUgU3lzVGljayB0aW1lIGJhc2UsIHVzZSB0aGUgZm9sbG93aW5nIGZvcm11bGE6CisKKyAgICAgICBSZWxvYWQgVmFsdWUgPSBTeXNUaWNrIENvdW50ZXIgQ2xvY2sgKEh6KSB4ICBEZXNpcmVkIFRpbWUgYmFzZSAocykKKyAgICAgICAoKyspIFJlbG9hZCBWYWx1ZSBpcyB0aGUgcGFyYW1ldGVyIHRvIGJlIHBhc3NlZCBmb3IgSEFMX1NZU1RJQ0tfQ29uZmlnKCkgZnVuY3Rpb24KKyAgICAgICAoKyspIFJlbG9hZCBWYWx1ZSBzaG91bGQgbm90IGV4Y2VlZCAweEZGRkZGRgorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIAorICAqLworCisvKgorICBBZGRpdGlvbmFsIFRhYmxlczogQ09SVEVYX05WSUNfUHJpb3JpdHlfVGFibGUKKyAgICAgVGhlIHRhYmxlIGJlbG93IGdpdmVzIHRoZSBhbGxvd2VkIHZhbHVlcyBvZiB0aGUgcHJlLWVtcHRpb24gcHJpb3JpdHkgYW5kIHN1YnByaW9yaXR5IGFjY29yZGluZworICAgICB0byB0aGUgUHJpb3JpdHkgR3JvdXBpbmcgY29uZmlndXJhdGlvbiBwZXJmb3JtZWQgYnkgSEFMX05WSUNfU2V0UHJpb3JpdHlHcm91cGluZygpIGZ1bmN0aW9uCisgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgIE5WSUNfUHJpb3JpdHlHcm91cCAgIHwgTlZJQ19JUlFDaGFubmVsUHJlZW1wdGlvblByaW9yaXR5IHwgTlZJQ19JUlFDaGFubmVsU3ViUHJpb3JpdHkgIHwgICAgICAgRGVzY3JpcHRpb24KKyAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBOVklDX1BSSU9SSVRZR1JPVVBfMCAgfCAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIDBVLTE1ICAgICAgICAgICAgIHwgMCBiaXRzIGZvciBwcmUtZW1wdGlvbiBwcmlvcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA0IGJpdHMgZm9yIHN1YnByaW9yaXR5CisgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgTlZJQ19QUklPUklUWUdST1VQXzEgIHwgICAgICAgICAgICAgICAgMFUtMSAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgMFUtNyAgICAgICAgICAgICAgfCAxIGJpdHMgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMgYml0cyBmb3Igc3VicHJpb3JpdHkKKyAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBOVklDX1BSSU9SSVRZR1JPVVBfMiAgfCAgICAgICAgICAgICAgICAwVS0zICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAwVS0zICAgICAgICAgICAgICB8IDIgYml0cyBmb3IgcHJlLWVtcHRpb24gcHJpb3JpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMiBiaXRzIGZvciBzdWJwcmlvcml0eQorICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIE5WSUNfUFJJT1JJVFlHUk9VUF8zICB8ICAgICAgICAgICAgICAgIDBVLTcgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIDBVLTEgICAgICAgICAgICAgIHwgMyBiaXRzIGZvciBwcmUtZW1wdGlvbiBwcmlvcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxIGJpdHMgZm9yIHN1YnByaW9yaXR5CisgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgTlZJQ19QUklPUklUWUdST1VQXzQgIHwgICAgICAgICAgICAgICAgMFUtMTUgICAgICAgICAgICAgICB8ICAgICAgICAgICAgMCAgICAgICAgICAgICAgICB8IDQgYml0cyBmb3IgcHJlLWVtcHRpb24gcHJpb3JpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMCBiaXRzIGZvciBzdWJwcmlvcml0eQorICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWCBDT1JURVgKKyAgKiBAYnJpZWYgQ09SVEVYIENPUlRFWCBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfQ09SVEVYX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0V4cG9ydGVkX0Z1bmN0aW9ucyBDT1JURVggRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworCisvKiogQGRlZmdyb3VwIENPUlRFWF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyB0aGUgQ09SVEVYIEhBTCBkcml2ZXIgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbmZpZ3VyZSBJbnRlcnJ1cHRzCisgICAgICBTeXN0aWNrIGZ1bmN0aW9uYWxpdGllcworCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisKKy8qKgorICAqIEBicmllZiAgU2V0cyB0aGUgcHJpb3JpdHkgZ3JvdXBpbmcgZmllbGQgKHByZS1lbXB0aW9uIHByaW9yaXR5IGFuZCBzdWJwcmlvcml0eSkKKyAgKiAgICAgICAgIHVzaW5nIHRoZSByZXF1aXJlZCB1bmxvY2sgc2VxdWVuY2UuCisgICogQHBhcmFtICBQcmlvcml0eUdyb3VwIFRoZSBwcmlvcml0eSBncm91cGluZyBiaXRzIGxlbmd0aC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIE5WSUNfUFJJT1JJVFlHUk9VUF8wOiAwIGJpdHMgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0IGJpdHMgZm9yIHN1YnByaW9yaXR5CisgICogICAgICAgICBAYXJnIE5WSUNfUFJJT1JJVFlHUk9VUF8xOiAxIGJpdHMgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzIGJpdHMgZm9yIHN1YnByaW9yaXR5CisgICogICAgICAgICBAYXJnIE5WSUNfUFJJT1JJVFlHUk9VUF8yOiAyIGJpdHMgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIGJpdHMgZm9yIHN1YnByaW9yaXR5CisgICogICAgICAgICBAYXJnIE5WSUNfUFJJT1JJVFlHUk9VUF8zOiAzIGJpdHMgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIGJpdHMgZm9yIHN1YnByaW9yaXR5CisgICogICAgICAgICBAYXJnIE5WSUNfUFJJT1JJVFlHUk9VUF80OiA0IGJpdHMgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIGJpdHMgZm9yIHN1YnByaW9yaXR5CisgICogQG5vdGUgICBXaGVuIHRoZSBOVklDX1ByaW9yaXR5R3JvdXBfMCBpcyBzZWxlY3RlZCwgSVJRIHByZS1lbXB0aW9uIGlzIG5vIG1vcmUgcG9zc2libGUuCisgICogICAgICAgICBUaGUgcGVuZGluZyBJUlEgcHJpb3JpdHkgd2lsbCBiZSBtYW5hZ2VkIG9ubHkgYnkgdGhlIHN1YnByaW9yaXR5LgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfTlZJQ19TZXRQcmlvcml0eUdyb3VwaW5nKHVpbnQzMl90IFByaW9yaXR5R3JvdXApCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19OVklDX1BSSU9SSVRZX0dST1VQKFByaW9yaXR5R3JvdXApKTsKKworICAvKiBTZXQgdGhlIFBSSUdST1VQWzEwOjhdIGJpdHMgYWNjb3JkaW5nIHRvIHRoZSBQcmlvcml0eUdyb3VwIHBhcmFtZXRlciB2YWx1ZSAqLworICBOVklDX1NldFByaW9yaXR5R3JvdXBpbmcoUHJpb3JpdHlHcm91cCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0cyB0aGUgcHJpb3JpdHkgb2YgYW4gaW50ZXJydXB0LgorICAqIEBwYXJhbSAgSVJRbiBFeHRlcm5hbCBpbnRlcnJ1cHQgbnVtYmVyCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW4gZW51bWVyYXRvciBvZiBJUlFuX1R5cGUgZW51bWVyYXRpb24KKyAgKiAgICAgICAgIChGb3IgdGhlIGNvbXBsZXRlIFNUTTMyIERldmljZXMgSVJRIENoYW5uZWxzIGxpc3QsIHBsZWFzZSByZWZlciB0byB0aGUgYXBwcm9wcmlhdGUgQ01TSVMgZGV2aWNlIGZpbGUgKHN0bTMyZjN4eHh4LmgpKQorICAqIEBwYXJhbSAgUHJlZW1wdFByaW9yaXR5IFRoZSBwcmUtZW1wdGlvbiBwcmlvcml0eSBmb3IgdGhlIElSUW4gY2hhbm5lbC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMTUgYXMgZGVzY3JpYmVkIGluIHRoZSB0YWJsZSBDT1JURVhfTlZJQ19Qcmlvcml0eV9UYWJsZQorICAqICAgICAgICAgQSBsb3dlciBwcmlvcml0eSB2YWx1ZSBpbmRpY2F0ZXMgYSBoaWdoZXIgcHJpb3JpdHkKKyAgKiBAcGFyYW0gIFN1YlByaW9yaXR5IHRoZSBzdWJwcmlvcml0eSBsZXZlbCBmb3IgdGhlIElSUSBjaGFubmVsLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxNSBhcyBkZXNjcmliZWQgaW4gdGhlIHRhYmxlIENPUlRFWF9OVklDX1ByaW9yaXR5X1RhYmxlCisgICogICAgICAgICBBIGxvd2VyIHByaW9yaXR5IHZhbHVlIGluZGljYXRlcyBhIGhpZ2hlciBwcmlvcml0eS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX05WSUNfU2V0UHJpb3JpdHkoSVJRbl9UeXBlIElSUW4sIHVpbnQzMl90IFByZWVtcHRQcmlvcml0eSwgdWludDMyX3QgU3ViUHJpb3JpdHkpCit7CisgIHVpbnQzMl90IHByaW9yaXR5Z3JvdXAgPSAweDAwVTsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19OVklDX1NVQl9QUklPUklUWShTdWJQcmlvcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTlZJQ19QUkVFTVBUSU9OX1BSSU9SSVRZKFByZWVtcHRQcmlvcml0eSkpOworICAKKyAgcHJpb3JpdHlncm91cCA9IE5WSUNfR2V0UHJpb3JpdHlHcm91cGluZygpOworICAKKyAgTlZJQ19TZXRQcmlvcml0eShJUlFuLCBOVklDX0VuY29kZVByaW9yaXR5KHByaW9yaXR5Z3JvdXAsIFByZWVtcHRQcmlvcml0eSwgU3ViUHJpb3JpdHkpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGVzIGEgZGV2aWNlIHNwZWNpZmljIGludGVycnVwdCBpbiB0aGUgTlZJQyBpbnRlcnJ1cHQgY29udHJvbGxlci4KKyAgKiBAbm90ZSAgIFRvIGNvbmZpZ3VyZSBpbnRlcnJ1cHRzIHByaW9yaXR5IGNvcnJlY3RseSwgdGhlIE5WSUNfUHJpb3JpdHlHcm91cENvbmZpZygpCisgICogICAgICAgICBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcGFyYW0gIElSUW4gRXh0ZXJuYWwgaW50ZXJydXB0IG51bWJlcgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFuIGVudW1lcmF0b3Igb2YgSVJRbl9UeXBlIGVudW1lcmF0aW9uCisgICogICAgICAgICAoRm9yIHRoZSBjb21wbGV0ZSBTVE0zMiBEZXZpY2VzIElSUSBDaGFubmVscyBsaXN0LCBwbGVhc2UgcmVmZXIgdG8gdGhlIGFwcHJvcHJpYXRlIENNU0lTIGRldmljZSBmaWxlIChzdG0zMmYzeHh4eC5oKSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX05WSUNfRW5hYmxlSVJRKElSUW5fVHlwZSBJUlFuKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTlZJQ19ERVZJQ0VfSVJRKElSUW4pKTsKKyAgCisgIC8qIEVuYWJsZSBpbnRlcnJ1cHQgKi8KKyAgTlZJQ19FbmFibGVJUlEoSVJRbik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZXMgYSBkZXZpY2Ugc3BlY2lmaWMgaW50ZXJydXB0IGluIHRoZSBOVklDIGludGVycnVwdCBjb250cm9sbGVyLgorICAqIEBwYXJhbSAgSVJRbiBFeHRlcm5hbCBpbnRlcnJ1cHQgbnVtYmVyCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW4gZW51bWVyYXRvciBvZiBJUlFuX1R5cGUgZW51bWVyYXRpb24KKyAgKiAgICAgICAgIChGb3IgdGhlIGNvbXBsZXRlIFNUTTMyIERldmljZXMgSVJRIENoYW5uZWxzIGxpc3QsIHBsZWFzZSByZWZlciB0byB0aGUgYXBwcm9wcmlhdGUgQ01TSVMgZGV2aWNlIGZpbGUgKHN0bTMyZjN4eHh4LmgpKQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfTlZJQ19EaXNhYmxlSVJRKElSUW5fVHlwZSBJUlFuKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTlZJQ19ERVZJQ0VfSVJRKElSUW4pKTsKKyAgCisgIC8qIERpc2FibGUgaW50ZXJydXB0ICovCisgIE5WSUNfRGlzYWJsZUlSUShJUlFuKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWF0ZXMgYSBzeXN0ZW0gcmVzZXQgcmVxdWVzdCB0byByZXNldCB0aGUgTUNVLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfTlZJQ19TeXN0ZW1SZXNldCh2b2lkKQoreworICAvKiBTeXN0ZW0gUmVzZXQgKi8KKyAgTlZJQ19TeXN0ZW1SZXNldCgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBTeXN0ZW0gVGltZXIgYW5kIGl0cyBpbnRlcnJ1cHQsIGFuZCBzdGFydHMgdGhlIFN5c3RlbSBUaWNrIFRpbWVyLgorICAqICAgICAgICAgQ291bnRlciBpcyBpbiBmcmVlIHJ1bm5pbmcgbW9kZSB0byBnZW5lcmF0ZSBwZXJpb2RpYyBpbnRlcnJ1cHRzLgorICAqIEBwYXJhbSAgVGlja3NOdW1iIFNwZWNpZmllcyB0aGUgdGlja3MgTnVtYmVyIG9mIHRpY2tzIGJldHdlZW4gdHdvIGludGVycnVwdHMuCisgICogQHJldHZhbCBzdGF0dXM6ICAtIDAgIEZ1bmN0aW9uIHN1Y2NlZWRlZC4KKyAgKiAgICAgICAgICAgICAgICAgIC0gMSAgRnVuY3Rpb24gZmFpbGVkLgorICAqLwordWludDMyX3QgSEFMX1NZU1RJQ0tfQ29uZmlnKHVpbnQzMl90IFRpY2tzTnVtYikKK3sKKyAgIHJldHVybiBTeXNUaWNrX0NvbmZpZyhUaWNrc051bWIpOworfQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgQ29ydGV4IGNvbnRyb2wgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb250cm9sIHRoZSBDT1JURVgKKyAgICAgIChOVklDLCBTWVNUSUNLLCBNUFUpIGZ1bmN0aW9uYWxpdGllcy4KKworCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisjaWYgKF9fTVBVX1BSRVNFTlQgPT0gMVUpCisJCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGVzIHRoZSBNUFUgYWxzbyBjbGVhcnMgdGhlIEhGTk1JRU5BIGJpdCAoQVJNIHJlY29tbWVuZGF0aW9uKSAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX01QVV9EaXNhYmxlKHZvaWQpCit7CisgIC8qIERpc2FibGUgZmF1bHQgZXhjZXB0aW9ucyAqLworICBTQ0ItPlNIQ1NSICY9IH5TQ0JfU0hDU1JfTUVNRkFVTFRFTkFfTXNrOworICAKKyAgLyogRGlzYWJsZSB0aGUgTVBVICovCisgIE1QVS0+Q1RSTCA9IDBVOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgdGhlIE1QVQorICAqIEBwYXJhbSAgTVBVX0NvbnRyb2wgU3BlY2lmaWVzIHRoZSBjb250cm9sIG1vZGUgb2YgdGhlIE1QVSBkdXJpbmcgaGFyZCBmYXVsdCwgCisgICogICAgICAgICAgTk1JLCBGQVVMVE1BU0sgYW5kIHByaXZpbGVnZWQgYWNjZXNzIHRvIHRoZSBkZWZhdWx0IG1lbW9yeSAKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBNUFVfSEZOTUlfUFJJVkRFRl9OT05FCisgICogICAgICAgICAgICBAYXJnIE1QVV9IQVJERkFVTFRfTk1JCisgICogICAgICAgICAgICBAYXJnIE1QVV9QUklWSUxFR0VEX0RFRkFVTFQKKyAgKiAgICAgICAgICAgIEBhcmcgTVBVX0hGTk1JX1BSSVZERUYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX01QVV9FbmFibGUodWludDMyX3QgTVBVX0NvbnRyb2wpCit7CisgIC8qIEVuYWJsZSB0aGUgTVBVICovCisgIE1QVS0+Q1RSTCAgID0gTVBVX0NvbnRyb2wgfCBNUFVfQ1RSTF9FTkFCTEVfTXNrOworICAKKyAgLyogRW5hYmxlIGZhdWx0IGV4Y2VwdGlvbnMgKi8KKyAgU0NCLT5TSENTUiB8PSBTQ0JfU0hDU1JfTUVNRkFVTFRFTkFfTXNrOworfQorCQorCS8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgYW5kIGNvbmZpZ3VyZXMgdGhlIFJlZ2lvbiBhbmQgdGhlIG1lbW9yeSB0byBiZSBwcm90ZWN0ZWQuCisgICogQHBhcmFtICBNUFVfSW5pdCBQb2ludGVyIHRvIGEgTVBVX1JlZ2lvbl9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBpbml0aWFsaXphdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX01QVV9Db25maWdSZWdpb24oTVBVX1JlZ2lvbl9Jbml0VHlwZURlZiAqTVBVX0luaXQpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19NUFVfUkVHSU9OX05VTUJFUihNUFVfSW5pdC0+TnVtYmVyKSk7CisgIGFzc2VydF9wYXJhbShJU19NUFVfUkVHSU9OX0VOQUJMRShNUFVfSW5pdC0+RW5hYmxlKSk7CisKKyAgLyogU2V0IHRoZSBSZWdpb24gbnVtYmVyICovCisgIE1QVS0+Uk5SID0gTVBVX0luaXQtPk51bWJlcjsKKworICBpZiAoKE1QVV9Jbml0LT5FbmFibGUpICE9IFJFU0VUKQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfTVBVX0lOU1RSVUNUSU9OX0FDQ0VTUyhNUFVfSW5pdC0+RGlzYWJsZUV4ZWMpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTVBVX1JFR0lPTl9QRVJNSVNTSU9OX0FUVFJJQlVURShNUFVfSW5pdC0+QWNjZXNzUGVybWlzc2lvbikpOworICAgIGFzc2VydF9wYXJhbShJU19NUFVfVEVYX0xFVkVMKE1QVV9Jbml0LT5UeXBlRXh0RmllbGQpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTVBVX0FDQ0VTU19TSEFSRUFCTEUoTVBVX0luaXQtPklzU2hhcmVhYmxlKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX01QVV9BQ0NFU1NfQ0FDSEVBQkxFKE1QVV9Jbml0LT5Jc0NhY2hlYWJsZSkpOworICAgIGFzc2VydF9wYXJhbShJU19NUFVfQUNDRVNTX0JVRkZFUkFCTEUoTVBVX0luaXQtPklzQnVmZmVyYWJsZSkpOworICAgIGFzc2VydF9wYXJhbShJU19NUFVfU1VCX1JFR0lPTl9ESVNBQkxFKE1QVV9Jbml0LT5TdWJSZWdpb25EaXNhYmxlKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX01QVV9SRUdJT05fU0laRShNUFVfSW5pdC0+U2l6ZSkpOworICAgIAorICAgIE1QVS0+UkJBUiA9IE1QVV9Jbml0LT5CYXNlQWRkcmVzczsKKyAgICBNUFUtPlJBU1IgPSAoKHVpbnQzMl90KU1QVV9Jbml0LT5EaXNhYmxlRXhlYyAgICAgICAgICAgICA8PCBNUFVfUkFTUl9YTl9Qb3MpICAgfAorICAgICAgICAgICAgICAgICgodWludDMyX3QpTVBVX0luaXQtPkFjY2Vzc1Blcm1pc3Npb24gICAgICAgIDw8IE1QVV9SQVNSX0FQX1BvcykgICB8CisgICAgICAgICAgICAgICAgKCh1aW50MzJfdClNUFVfSW5pdC0+VHlwZUV4dEZpZWxkICAgICAgICAgICAgPDwgTVBVX1JBU1JfVEVYX1BvcykgIHwKKyAgICAgICAgICAgICAgICAoKHVpbnQzMl90KU1QVV9Jbml0LT5Jc1NoYXJlYWJsZSAgICAgICAgICAgICA8PCBNUFVfUkFTUl9TX1BvcykgICAgfAorICAgICAgICAgICAgICAgICgodWludDMyX3QpTVBVX0luaXQtPklzQ2FjaGVhYmxlICAgICAgICAgICAgIDw8IE1QVV9SQVNSX0NfUG9zKSAgICB8CisgICAgICAgICAgICAgICAgKCh1aW50MzJfdClNUFVfSW5pdC0+SXNCdWZmZXJhYmxlICAgICAgICAgICAgPDwgTVBVX1JBU1JfQl9Qb3MpICAgIHwKKyAgICAgICAgICAgICAgICAoKHVpbnQzMl90KU1QVV9Jbml0LT5TdWJSZWdpb25EaXNhYmxlICAgICAgICA8PCBNUFVfUkFTUl9TUkRfUG9zKSAgfAorICAgICAgICAgICAgICAgICgodWludDMyX3QpTVBVX0luaXQtPlNpemUgICAgICAgICAgICAgICAgICAgIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSB8CisgICAgICAgICAgICAgICAgKCh1aW50MzJfdClNUFVfSW5pdC0+RW5hYmxlICAgICAgICAgICAgICAgICAgPDwgTVBVX1JBU1JfRU5BQkxFX1Bvcyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgTVBVLT5SQkFSID0gMHgwMFU7CisgICAgTVBVLT5SQVNSID0gMHgwMFU7CisgIH0KK30KKyNlbmRpZiAvKiBfX01QVV9QUkVTRU5UICovCisKKy8qKgorICAqIEBicmllZiAgR2V0cyB0aGUgcHJpb3JpdHkgZ3JvdXBpbmcgZmllbGQgZnJvbSB0aGUgTlZJQyBJbnRlcnJ1cHQgQ29udHJvbGxlci4KKyAgKiBAcmV0dmFsIFByaW9yaXR5IGdyb3VwaW5nIGZpZWxkIChTQ0ItPkFJUkNSIFsxMDo4XSBQUklHUk9VUCBmaWVsZCkKKyAgKi8KK3VpbnQzMl90IEhBTF9OVklDX0dldFByaW9yaXR5R3JvdXBpbmcodm9pZCkKK3sKKyAgLyogR2V0IHRoZSBQUklHUk9VUFsxMDo4XSBmaWVsZCB2YWx1ZSAqLworICByZXR1cm4gTlZJQ19HZXRQcmlvcml0eUdyb3VwaW5nKCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0cyB0aGUgcHJpb3JpdHkgb2YgYW4gaW50ZXJydXB0LgorICAqIEBwYXJhbSAgSVJRbiBFeHRlcm5hbCBpbnRlcnJ1cHQgbnVtYmVyCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW4gZW51bWVyYXRvciBvZiBJUlFuX1R5cGUgZW51bWVyYXRpb24KKyAgKiAgICAgICAgIChGb3IgdGhlIGNvbXBsZXRlIFNUTTMyIERldmljZXMgSVJRIENoYW5uZWxzIGxpc3QsIHBsZWFzZSByZWZlciB0byB0aGUgYXBwcm9wcmlhdGUgQ01TSVMgZGV2aWNlIGZpbGUgKHN0bTMyZjN4eHh4LmgpKQorICAqIEBwYXJhbSAgIFByaW9yaXR5R3JvdXA6IHRoZSBwcmlvcml0eSBncm91cGluZyBiaXRzIGxlbmd0aC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgTlZJQ19QUklPUklUWUdST1VQXzA6IDAgYml0cyBmb3IgcHJlLWVtcHRpb24gcHJpb3JpdHkKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCBiaXRzIGZvciBzdWJwcmlvcml0eQorICAqICAgICAgICAgICBAYXJnIE5WSUNfUFJJT1JJVFlHUk9VUF8xOiAxIGJpdHMgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgYml0cyBmb3Igc3VicHJpb3JpdHkKKyAgKiAgICAgICAgICAgQGFyZyBOVklDX1BSSU9SSVRZR1JPVVBfMjogMiBiaXRzIGZvciBwcmUtZW1wdGlvbiBwcmlvcml0eQorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIGJpdHMgZm9yIHN1YnByaW9yaXR5CisgICogICAgICAgICAgIEBhcmcgTlZJQ19QUklPUklUWUdST1VQXzM6IDMgYml0cyBmb3IgcHJlLWVtcHRpb24gcHJpb3JpdHkKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBiaXRzIGZvciBzdWJwcmlvcml0eQorICAqICAgICAgICAgICBAYXJnIE5WSUNfUFJJT1JJVFlHUk9VUF80OiA0IGJpdHMgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgYml0cyBmb3Igc3VicHJpb3JpdHkKKyAgKiBAcGFyYW0gIHBQcmVlbXB0UHJpb3JpdHkgUG9pbnRlciBvbiB0aGUgUHJlZW1wdGl2ZSBwcmlvcml0eSB2YWx1ZSAoc3RhcnRpbmcgZnJvbSAwKS4KKyAgKiBAcGFyYW0gIHBTdWJQcmlvcml0eSBQb2ludGVyIG9uIHRoZSBTdWJwcmlvcml0eSB2YWx1ZSAoc3RhcnRpbmcgZnJvbSAwKS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX05WSUNfR2V0UHJpb3JpdHkoSVJRbl9UeXBlIElSUW4sIHVpbnQzMl90IFByaW9yaXR5R3JvdXAsIHVpbnQzMl90KiBwUHJlZW1wdFByaW9yaXR5LCB1aW50MzJfdCogcFN1YlByaW9yaXR5KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTlZJQ19QUklPUklUWV9HUk9VUChQcmlvcml0eUdyb3VwKSk7CisgIC8qIEdldCBwcmlvcml0eSBmb3IgQ29ydGV4LU0gc3lzdGVtIG9yIGRldmljZSBzcGVjaWZpYyBpbnRlcnJ1cHRzICovCisgIE5WSUNfRGVjb2RlUHJpb3JpdHkoTlZJQ19HZXRQcmlvcml0eShJUlFuKSwgUHJpb3JpdHlHcm91cCwgcFByZWVtcHRQcmlvcml0eSwgcFN1YlByaW9yaXR5KTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXRzIFBlbmRpbmcgYml0IG9mIGFuIGV4dGVybmFsIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIElSUW4gRXh0ZXJuYWwgaW50ZXJydXB0IG51bWJlcgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFuIGVudW1lcmF0b3Igb2YgSVJRbl9UeXBlIGVudW1lcmF0aW9uCisgICogICAgICAgICAoRm9yIHRoZSBjb21wbGV0ZSBTVE0zMiBEZXZpY2VzIElSUSBDaGFubmVscyBsaXN0LCBwbGVhc2UgcmVmZXIgdG8gdGhlIGFwcHJvcHJpYXRlIENNU0lTIGRldmljZSBmaWxlIChzdG0zMmYzeHh4eC5oKSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX05WSUNfU2V0UGVuZGluZ0lSUShJUlFuX1R5cGUgSVJRbikKK3sKKyAgLyogU2V0IGludGVycnVwdCBwZW5kaW5nICovCisgIE5WSUNfU2V0UGVuZGluZ0lSUShJUlFuKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXRzIFBlbmRpbmcgSW50ZXJydXB0IChyZWFkcyB0aGUgcGVuZGluZyByZWdpc3RlciBpbiB0aGUgTlZJQworICAqICAgICAgICAgYW5kIHJldHVybnMgdGhlIHBlbmRpbmcgYml0IGZvciB0aGUgc3BlY2lmaWVkIGludGVycnVwdCkuCisgICogQHBhcmFtICBJUlFuIEV4dGVybmFsIGludGVycnVwdCBudW1iZXIKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbiBlbnVtZXJhdG9yIG9mIElSUW5fVHlwZSBlbnVtZXJhdGlvbgorICAqICAgICAgICAgKEZvciB0aGUgY29tcGxldGUgU1RNMzIgRGV2aWNlcyBJUlEgQ2hhbm5lbHMgbGlzdCwgcGxlYXNlIHJlZmVyIHRvIHRoZSBhcHByb3ByaWF0ZSBDTVNJUyBkZXZpY2UgZmlsZSAoc3RtMzJmM3h4eHguaCkpCisgICogQHJldHZhbCBzdGF0dXM6IC0gMCAgSW50ZXJydXB0IHN0YXR1cyBpcyBub3QgcGVuZGluZy4KKyAgKiAgICAgICAgICAgICAgICAgLSAxICBJbnRlcnJ1cHQgc3RhdHVzIGlzIHBlbmRpbmcuCisgICovCit1aW50MzJfdCBIQUxfTlZJQ19HZXRQZW5kaW5nSVJRKElSUW5fVHlwZSBJUlFuKQoreworICAvKiBSZXR1cm4gMSBpZiBwZW5kaW5nIGVsc2UgMFUgKi8KKyAgcmV0dXJuIE5WSUNfR2V0UGVuZGluZ0lSUShJUlFuKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhcnMgdGhlIHBlbmRpbmcgYml0IG9mIGFuIGV4dGVybmFsIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIElSUW4gRXh0ZXJuYWwgaW50ZXJydXB0IG51bWJlcgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFuIGVudW1lcmF0b3Igb2YgSVJRbl9UeXBlIGVudW1lcmF0aW9uCisgICogICAgICAgICAoRm9yIHRoZSBjb21wbGV0ZSBTVE0zMiBEZXZpY2VzIElSUSBDaGFubmVscyBsaXN0LCBwbGVhc2UgcmVmZXIgdG8gdGhlIGFwcHJvcHJpYXRlIENNU0lTIGRldmljZSBmaWxlIChzdG0zMmYzeHh4eC5oKSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX05WSUNfQ2xlYXJQZW5kaW5nSVJRKElSUW5fVHlwZSBJUlFuKQoreworICAvKiBDbGVhciBwZW5kaW5nIGludGVycnVwdCAqLworICBOVklDX0NsZWFyUGVuZGluZ0lSUShJUlFuKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXRzIGFjdGl2ZSBpbnRlcnJ1cHQgKCByZWFkcyB0aGUgYWN0aXZlIHJlZ2lzdGVyIGluIE5WSUMgYW5kIHJldHVybnMgdGhlIGFjdGl2ZSBiaXQpLgorICAqIEBwYXJhbSAgSVJRbiBFeHRlcm5hbCBpbnRlcnJ1cHQgbnVtYmVyCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW4gZW51bWVyYXRvciBvZiBJUlFuX1R5cGUgZW51bWVyYXRpb24KKyAgKiAgICAgICAgIChGb3IgdGhlIGNvbXBsZXRlIFNUTTMyIERldmljZXMgSVJRIENoYW5uZWxzIGxpc3QsIHBsZWFzZSByZWZlciB0byB0aGUgYXBwcm9wcmlhdGUgQ01TSVMgZGV2aWNlIGZpbGUgKHN0bTMyZjN4eHh4LmgpKQorICAqIEByZXR2YWwgc3RhdHVzOiAtIDAgIEludGVycnVwdCBzdGF0dXMgaXMgbm90IHBlbmRpbmcuCisgICogICAgICAgICAgICAgICAgIC0gMSAgSW50ZXJydXB0IHN0YXR1cyBpcyBwZW5kaW5nLgorICAqLwordWludDMyX3QgSEFMX05WSUNfR2V0QWN0aXZlKElSUW5fVHlwZSBJUlFuKQoreworICAvKiBSZXR1cm4gMSBpZiBhY3RpdmUgZWxzZSAwVSAqLworICByZXR1cm4gTlZJQ19HZXRBY3RpdmUoSVJRbik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgU3lzVGljayBjbG9jayBzb3VyY2UuCisgICogQHBhcmFtICBDTEtTb3VyY2Ugc3BlY2lmaWVzIHRoZSBTeXNUaWNrIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgQGFyZyBTWVNUSUNLX0NMS1NPVVJDRV9IQ0xLX0RJVjg6IEFIQiBjbG9jayBkaXZpZGVkIGJ5IDggc2VsZWN0ZWQgYXMgU3lzVGljayBjbG9jayBzb3VyY2UuCisgICogICAgICAgICAgICAgQGFyZyBTWVNUSUNLX0NMS1NPVVJDRV9IQ0xLOiBBSEIgY2xvY2sgc2VsZWN0ZWQgYXMgU3lzVGljayBjbG9jayBzb3VyY2UuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9TWVNUSUNLX0NMS1NvdXJjZUNvbmZpZyh1aW50MzJfdCBDTEtTb3VyY2UpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TWVNUSUNLX0NMS19TT1VSQ0UoQ0xLU291cmNlKSk7CisgIGlmIChDTEtTb3VyY2UgPT0gU1lTVElDS19DTEtTT1VSQ0VfSENMSykKKyAgeworICAgIFN5c1RpY2stPkNUUkwgfD0gU1lTVElDS19DTEtTT1VSQ0VfSENMSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICBTeXNUaWNrLT5DVFJMICY9IH5TWVNUSUNLX0NMS1NPVVJDRV9IQ0xLOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIFNZU1RJQ0sgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9TWVNUSUNLX0lSUUhhbmRsZXIodm9pZCkKK3sKKyAgSEFMX1NZU1RJQ0tfQ2FsbGJhY2soKTsKK30KKworLyoqCisgICogQGJyaWVmICBTWVNUSUNLIGNhbGxiYWNrLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NZU1RJQ0tfQ2FsbGJhY2sodm9pZCkKK3sKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TWVNUSUNLX0NhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfQ09SVEVYX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjN4eF9oYWxfY3JjLmMgYi9TcmMvc3RtMzJmM3h4X2hhbF9jcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWM2MDBmCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZjN4eF9oYWxfY3JjLmMKQEAgLTAsMCArMSw1MzkgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX2NyYy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBDUkMgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZyAKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIEN5Y2xpYyBSZWR1bmRhbmN5IENoZWNrIChDUkMpIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAgKiAgICAgICAgIAorICBAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICAgICgrKSBFbmFibGUgQ1JDIEFIQiBjbG9jayB1c2luZyBfX0hBTF9SQ0NfQ1JDX0NMS19FTkFCTEUoKTsKKyAgICAgICAgICgrKSBJbml0aWFsaXplIENSQyBjYWxjdWxhdG9yCisgICAgICAgICAgICAgKCsrKXNwZWNpZnkgZ2VuZXJhdGluZyBwb2x5bm9taWFsIChJUCBkZWZhdWx0IG9yIG5vbi1kZWZhdWx0IG9uZSkKKyAgICAgICAgICAgICAoKyspc3BlY2lmeSBpbml0aWFsaXphdGlvbiB2YWx1ZSAoSVAgZGVmYXVsdCBvciBub24tZGVmYXVsdCBvbmUpCisgICAgICAgICAgICAgKCsrKXNwZWNpZnkgaW5wdXQgZGF0YSBmb3JtYXQKKyAgICAgICAgICAgICAoKyspc3BlY2lmeSBpbnB1dCBvciBvdXRwdXQgZGF0YSBpbnZlcnNpb24gbW9kZSBpZiBhbnkKKyAgICAgICAgICgrKSBVc2UgSEFMX0NSQ19BY2N1bXVsYXRlKCkgZnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUgQ1JDIHZhbHVlIG9mIHRoZSAKKyAgICAgICAgICAgICBpbnB1dCBkYXRhIGJ1ZmZlciBzdGFydGluZyB3aXRoIHRoZSBwcmV2aW91c2x5IGNvbXB1dGVkIENSQyBhcyAKKyAgICAgICAgICAgICBpbml0aWFsaXphdGlvbiB2YWx1ZQorICAgICAgICAgKCspIFVzZSBIQUxfQ1JDX0NhbGN1bGF0ZSgpIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlIENSQyB2YWx1ZSBvZiB0aGUgCisgICAgICAgICAgICAgaW5wdXQgZGF0YSBidWZmZXIgc3RhcnRpbmcgd2l0aCB0aGUgZGVmaW5lZCBpbml0aWFsaXphdGlvbiB2YWx1ZSAKKyAgICAgICAgICAgICAoZGVmYXVsdCBvciBub24tZGVmYXVsdCkgdG8gaW5pdGlhdGUgQ1JDIGNhbGN1bGF0aW9uCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkMgQ1JDCisgICogQGJyaWVmIENSQyBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX0NSQ19NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JDX1ByaXZhdGVfRnVuY3Rpb25zIENSQyBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCitzdGF0aWMgdWludDMyX3QgQ1JDX0hhbmRsZV84KENSQ19IYW5kbGVUeXBlRGVmICpoY3JjLCB1aW50OF90IHBCdWZmZXJbXSwgdWludDMyX3QgQnVmZmVyTGVuZ3RoKTsKK3N0YXRpYyB1aW50MzJfdCBDUkNfSGFuZGxlXzE2KENSQ19IYW5kbGVUeXBlRGVmICpoY3JjLCB1aW50MTZfdCBwQnVmZmVyW10sIHVpbnQzMl90IEJ1ZmZlckxlbmd0aCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIENSQ19FeHBvcnRlZF9GdW5jdGlvbnMgQ1JDIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMuIAorICoKK0B2ZXJiYXRpbSAgICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgSW5pdGlhbGl6ZSB0aGUgQ1JDIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgCisgICAgICAgICAgaW4gdGhlIENSQ19Jbml0VHlwZURlZiBhbmQgY3JlYXRlIHRoZSBhc3NvY2lhdGVkIGhhbmRsZQorICAgICAgKCspIERlSW5pdGlhbGl6ZSB0aGUgQ1JDIHBlcmlwaGVyYWwKKyAgICAgICgrKSBJbml0aWFsaXplIHRoZSBDUkMgTVNQIChNQ1UgU3BlY2lmaWMgUGFja2FnZSkKKyAgICAgICgrKSBEZUluaXRpYWxpemUgdGhlIENSQyBNU1AKKyAKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgQ1JDIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBDUkNfSW5pdFR5cGVEZWYgYW5kIGluaXRpYWxpemUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBwYXJhbSAgaGNyYyBDUkMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JDX0luaXQoQ1JDX0hhbmRsZVR5cGVEZWYgKmhjcmMpCit7CisgIC8qIENoZWNrIHRoZSBDUkMgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYoaGNyYyA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0NSQ19BTExfSU5TVEFOQ0UoaGNyYy0+SW5zdGFuY2UpKTsKKworICBpZihoY3JjLT5TdGF0ZSA9PSBIQUxfQ1JDX1NUQVRFX1JFU0VUKQorICB7ICAgCisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGhjcmMtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgICBIQUxfQ1JDX01zcEluaXQoaGNyYyk7CisgIH0KKyAgCisgIGhjcmMtPlN0YXRlID0gSEFMX0NSQ19TVEFURV9CVVNZOyAKKyAgCisgIC8qIGNoZWNrIHdoZXRoZXIgb3Igbm90IG5vbi1kZWZhdWx0IGdlbmVyYXRpbmcgcG9seW5vbWlhbCBoYXMgYmVlbiAKKyAgICogcGlja2VkIHVwIGJ5IHVzZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RFRkFVTFRfUE9MWU5PTUlBTChoY3JjLT5Jbml0LkRlZmF1bHRQb2x5bm9taWFsVXNlKSk7IAorICBpZiAoaGNyYy0+SW5pdC5EZWZhdWx0UG9seW5vbWlhbFVzZSA9PSBERUZBVUxUX1BPTFlOT01JQUxfRU5BQkxFKQorICB7CisgICAgLyogaW5pdGlhbGl6ZSBJUCB3aXRoIGRlZmF1bHQgZ2VuZXJhdGluZyBwb2x5bm9taWFsICovCisgICAgV1JJVEVfUkVHKGhjcmMtPkluc3RhbmNlLT5QT0wsIERFRkFVTFRfQ1JDMzJfUE9MWSk7ICAKKyAgICBNT0RJRllfUkVHKGhjcmMtPkluc3RhbmNlLT5DUiwgQ1JDX0NSX1BPTFlTSVpFLCBDUkNfUE9MWUxFTkdUSF8zMkIpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIGluaXRpYWxpemUgQ1JDIElQIHdpdGggZ2VuZXJhdGluZyBwb2x5bm9taWFsIGRlZmluZWQgYnkgdXNlciAqLworICAgIGlmIChIQUxfQ1JDRXhfUG9seW5vbWlhbF9TZXQoaGNyYywgaGNyYy0+SW5pdC5HZW5lcmF0aW5nUG9seW5vbWlhbCwgaGNyYy0+SW5pdC5DUkNMZW5ndGgpICE9IEhBTF9PSykKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgfQorICAKKyAgLyogY2hlY2sgd2hldGhlciBvciBub3Qgbm9uLWRlZmF1bHQgQ1JDIGluaXRpYWwgdmFsdWUgaGFzIGJlZW4gCisgICAqIHBpY2tlZCB1cCBieSB1c2VyICovCisgIGFzc2VydF9wYXJhbShJU19ERUZBVUxUX0lOSVRfVkFMVUUoaGNyYy0+SW5pdC5EZWZhdWx0SW5pdFZhbHVlVXNlKSk7CisgIGlmIChoY3JjLT5Jbml0LkRlZmF1bHRJbml0VmFsdWVVc2UgPT0gREVGQVVMVF9JTklUX1ZBTFVFX0VOQUJMRSkKKyAgeworICAgIFdSSVRFX1JFRyhoY3JjLT5JbnN0YW5jZS0+SU5JVCwgREVGQVVMVF9DUkNfSU5JVFZBTFVFKTsgIAorICB9CisgIGVsc2UKKyAgeworICAgIFdSSVRFX1JFRyhoY3JjLT5JbnN0YW5jZS0+SU5JVCwgaGNyYy0+SW5pdC5Jbml0VmFsdWUpOworICB9CisgIAorCisgIC8qIHNldCBpbnB1dCBkYXRhIGludmVyc2lvbiBtb2RlICovCisgIGFzc2VydF9wYXJhbShJU19DUkNfSU5QVVREQVRBX0lOVkVSU0lPTl9NT0RFKGhjcmMtPkluaXQuSW5wdXREYXRhSW52ZXJzaW9uTW9kZSkpOyAKKyAgTU9ESUZZX1JFRyhoY3JjLT5JbnN0YW5jZS0+Q1IsIENSQ19DUl9SRVZfSU4sIGhjcmMtPkluaXQuSW5wdXREYXRhSW52ZXJzaW9uTW9kZSk7IAorICAKKyAgLyogc2V0IG91dHB1dCBkYXRhIGludmVyc2lvbiBtb2RlICovCisgIGFzc2VydF9wYXJhbShJU19DUkNfT1VUUFVUREFUQV9JTlZFUlNJT05fTU9ERShoY3JjLT5Jbml0Lk91dHB1dERhdGFJbnZlcnNpb25Nb2RlKSk7IAorICBNT0RJRllfUkVHKGhjcmMtPkluc3RhbmNlLT5DUiwgQ1JDX0NSX1JFVl9PVVQsIGhjcmMtPkluaXQuT3V0cHV0RGF0YUludmVyc2lvbk1vZGUpOyAgCisgIAorICAvKiBtYWtlcyBzdXJlIHRoZSBpbnB1dCBkYXRhIGZvcm1hdCAoYnl0ZXMsIGhhbGZ3b3JkcyBvciB3b3JkcyBzdHJlYW0pCisgICAqIGlzIHByb3Blcmx5IHNwZWNpZmllZCBieSB1c2VyICovCisgIGFzc2VydF9wYXJhbShJU19DUkNfSU5QVVREQVRBX0ZPUk1BVChoY3JjLT5JbnB1dERhdGFGb3JtYXQpKTsKKworICAvKiBDaGFuZ2UgQ1JDIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgaGNyYy0+U3RhdGUgPSBIQUxfQ1JDX1NUQVRFX1JFQURZOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgQ1JDIHBlcmlwaGVyYWwuIAorICAqIEBwYXJhbSAgaGNyYyBDUkMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JDX0RlSW5pdChDUkNfSGFuZGxlVHlwZURlZiAqaGNyYykKK3sgCisgIC8qIENoZWNrIHRoZSBDUkMgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYoaGNyYyA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0NSQ19BTExfSU5TVEFOQ0UoaGNyYy0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIENoZWNrIHRoZSBDUkMgcGVyaXBoZXJhbCBzdGF0ZSAqLworICBpZihoY3JjLT5TdGF0ZSA9PSBIQUxfQ1JDX1NUQVRFX0JVU1kpCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKyAgCisgIC8qIENoYW5nZSBDUkMgcGVyaXBoZXJhbCBzdGF0ZSAqLworICBoY3JjLT5TdGF0ZSA9IEhBTF9DUkNfU1RBVEVfQlVTWTsKKyAgCisgIC8qIFJlc2V0IENSQyBjYWxjdWxhdGlvbiB1bml0ICovCisgIF9fSEFMX0NSQ19EUl9SRVNFVChoY3JjKTsKKyAgCisgIC8qIFJlc2V0IElEUiByZWdpc3RlciBjb250ZW50ICovCisgIENMRUFSX0JJVChoY3JjLT5JbnN0YW5jZS0+SURSLCBDUkNfSURSX0lEUikgOworCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIEhBTF9DUkNfTXNwRGVJbml0KGhjcmMpOworCisgIC8qIENoYW5nZSBDUkMgcGVyaXBoZXJhbCBzdGF0ZSAqLworICBoY3JjLT5TdGF0ZSA9IEhBTF9DUkNfU1RBVEVfUkVTRVQ7CisKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGNyYyk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBDUkMgTVNQLgorICAqIEBwYXJhbSAgaGNyYyBDUkMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQ1JDX01zcEluaXQoQ1JDX0hhbmRsZVR5cGVEZWYgKmhjcmMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhjcmMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfQ1JDX01zcEluaXQgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplIHRoZSBDUkMgTVNQLgorICAqIEBwYXJhbSAgaGNyYyBDUkMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQ1JDX01zcERlSW5pdChDUkNfSGFuZGxlVHlwZURlZiAqaGNyYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGNyYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9DUkNfTXNwRGVJbml0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENSQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgCisgKiAgQGJyaWVmICAgIG1hbmFnZW1lbnQgZnVuY3Rpb25zLiAKKyAqCitAdmVyYmF0aW0gICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgY29tcHV0ZSB0aGUgN1UsIDhVLCAxNiBvciAzMi1iaXQgQ1JDIHZhbHVlIG9mIGFuIDhVLCAxNiBvciAzMi1iaXQgZGF0YSBidWZmZXIKKyAgICAgICAgICB1c2luZyB0aGUgY29tYmluYXRpb24gb2YgdGhlIHByZXZpb3VzIENSQyB2YWx1ZSBhbmQgdGhlIG5ldyBvbmUKKyAgICAgICAgICAKKyAgICAgICBbLi5dICBvcgorICAgICAgICAgIAorICAgICAgKCspIGNvbXB1dGUgdGhlIDdVLCA4VSwgMTYgb3IgMzItYml0IENSQyB2YWx1ZSBvZiBhbiA4VSwgMTYgb3IgMzItYml0IGRhdGEgYnVmZmVyCisgICAgICAgICAgaW5kZXBlbmRlbnRseSBvZiB0aGUgcHJldmlvdXMgQ1JDIHZhbHVlLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKiogICAgICAgICAgICAgICAgICAKKyAgKiBAYnJpZWYgIENvbXB1dGUgdGhlIDcsIDgsIDE2IG9yIDMyLWJpdCBDUkMgdmFsdWUgb2YgYW4gOCwgMTYgb3IgMzItYml0IGRhdGEgYnVmZmVyCisgICogICAgICAgICBzdGFydGluZyB3aXRoIHRoZSBwcmV2aW91c2x5IGNvbXB1dGVkIENSQyBhcyBpbml0aWFsaXphdGlvbiB2YWx1ZS4KKyAgKiBAcGFyYW0gIGhjcmMgQ1JDIGhhbmRsZQorICAqIEBwYXJhbSAgcEJ1ZmZlciBwb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhIGJ1ZmZlciwgZXhhY3QgaW5wdXQgZGF0YSBmb3JtYXQgaXMKKyAgKiAgICAgICAgIHByb3ZpZGVkIGJ5IGhjcmMtPklucHV0RGF0YUZvcm1hdC4gIAorICAqIEBwYXJhbSAgQnVmZmVyTGVuZ3RoIGlucHV0IGRhdGEgYnVmZmVyIGxlbmd0aCAobnVtYmVyIG9mIGJ5dGVzIGlmIHBCdWZmZXIKKyAgKiAgICAgICAgIHR5cGUgaXMgKiB1aW50OF90LCBudW1iZXIgb2YgaGFsZi13b3JkcyBpZiBwQnVmZmVyIHR5cGUgaXMgKiB1aW50MTZfdCwKKyAgKiAgICAgICAgIG51bWJlciBvZiB3b3JkcyBpZiBwQnVmZmVyIHR5cGUgaXMgKiB1aW50MzJfdCkuCisgICogQG5vdGUgIEJ5IGRlZmF1bHQsIHRoZSBBUEkgZXhwZWN0cyBhIHVpbnQzMl90IHBvaW50ZXIgYXMgaW5wdXQgYnVmZmVyIHBhcmFtZXRlci4KKyAgKiAgICAgICAgSW5wdXQgYnVmZmVyIHBvaW50ZXJzIHdpdGggb3RoZXIgdHlwZXMgc2ltcGx5IG5lZWQgdG8gYmUgY2FzdCBpbiB1aW50MzJfdAorICAqICAgICAgICBhbmQgdGhlIEFQSSB3aWxsIGludGVybmFsbHkgYWRqdXN0IGl0cyBpbnB1dCBkYXRhIHByb2Nlc3NpbmcgYmFzZWQgb24gdGhlCisgICogICAgICAgIGhhbmRsZSBmaWVsZCBoY3JjLT5JbnB1dERhdGFGb3JtYXQuCisgICogQHJldHZhbCB1aW50MzJfdCBDUkMgKHJldHVybmVkIHZhbHVlIExTQnMgZm9yIENSQyBzaG9ydGVyIHRoYW4gMzIgYml0cykKKyAgKi8KK3VpbnQzMl90IEhBTF9DUkNfQWNjdW11bGF0ZShDUkNfSGFuZGxlVHlwZURlZiAqaGNyYywgdWludDMyX3QgcEJ1ZmZlcltdLCB1aW50MzJfdCBCdWZmZXJMZW5ndGgpCit7CisgIHVpbnQzMl90IGluZGV4ID0gMFU7IC8qIENSQyBpbnB1dCBkYXRhIGJ1ZmZlciBpbmRleCAqLworICB1aW50MzJfdCB0ZW1wID0gMFU7ICAvKiBDUkMgb3V0cHV0IChyZWFkIGZyb20gaGNyYy0+SW5zdGFuY2UtPkRSIHJlZ2lzdGVyKSAqLworICAKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoY3JjKTsgCisgICAgCisgIC8qIENoYW5nZSBDUkMgcGVyaXBoZXJhbCBzdGF0ZSAqLyAgCisgIGhjcmMtPlN0YXRlID0gSEFMX0NSQ19TVEFURV9CVVNZOworICAKKyAgc3dpdGNoIChoY3JjLT5JbnB1dERhdGFGb3JtYXQpCisgIHsKKyAgICBjYXNlIENSQ19JTlBVVERBVEFfRk9STUFUX1dPUkRTOiAgCisgICAgICAvKiBFbnRlciBEYXRhIHRvIHRoZSBDUkMgY2FsY3VsYXRvciAqLworICAgICAgZm9yKGluZGV4ID0gMFU7IGluZGV4IDwgQnVmZmVyTGVuZ3RoOyBpbmRleCsrKQorICAgICAgeworICAgICAgICBoY3JjLT5JbnN0YW5jZS0+RFIgPSBwQnVmZmVyW2luZGV4XTsKKyAgICAgIH0KKyAgICAgIHRlbXAgPSBoY3JjLT5JbnN0YW5jZS0+RFI7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgQ1JDX0lOUFVUREFUQV9GT1JNQVRfQllURVM6IAorICAgICAgdGVtcCA9IENSQ19IYW5kbGVfOChoY3JjLCAodWludDhfdCopcEJ1ZmZlciwgQnVmZmVyTGVuZ3RoKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBDUkNfSU5QVVREQVRBX0ZPUk1BVF9IQUxGV09SRFM6IAorICAgICAgdGVtcCA9IENSQ19IYW5kbGVfMTYoaGNyYywgKHVpbnQxNl90KilwQnVmZmVyLCBCdWZmZXJMZW5ndGgpOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7ICAgICAgICAgIAorICB9CisgIAorICAvKiBDaGFuZ2UgQ1JDIHBlcmlwaGVyYWwgc3RhdGUgKi8gICAgCisgIGhjcmMtPlN0YXRlID0gSEFMX0NSQ19TVEFURV9SRUFEWTsgCisgIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoY3JjKTsKKyAgCisgIC8qIFJldHVybiB0aGUgQ1JDIGNvbXB1dGVkIHZhbHVlICovIAorICByZXR1cm4gdGVtcDsKK30KKworCisvKiogICAgICAgICAgICAgICAgICAKKyAgKiBAYnJpZWYgIENvbXB1dGUgdGhlIDcsIDgsIDE2IG9yIDMyLWJpdCBDUkMgdmFsdWUgb2YgYW4gOCwgMTYgb3IgMzItYml0IGRhdGEgYnVmZmVyCisgICogICAgICAgICBzdGFydGluZyB3aXRoIGhjcmMtPkluc3RhbmNlLT5JTklUIGFzIGluaXRpYWxpemF0aW9uIHZhbHVlLgorICAqIEBwYXJhbSAgaGNyYyBDUkMgaGFuZGxlCisgICogQHBhcmFtICBwQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgYnVmZmVyLCBleGFjdCBpbnB1dCBkYXRhIGZvcm1hdCBpcworICAqICAgICAgICAgcHJvdmlkZWQgYnkgaGNyYy0+SW5wdXREYXRhRm9ybWF0LiAgCisgICogQHBhcmFtICBCdWZmZXJMZW5ndGggaW5wdXQgZGF0YSBidWZmZXIgbGVuZ3RoIChudW1iZXIgb2YgYnl0ZXMgaWYgcEJ1ZmZlcgorICAqICAgICAgICAgdHlwZSBpcyAqIHVpbnQ4X3QsIG51bWJlciBvZiBoYWxmLXdvcmRzIGlmIHBCdWZmZXIgdHlwZSBpcyAqIHVpbnQxNl90LAorICAqICAgICAgICAgbnVtYmVyIG9mIHdvcmRzIGlmIHBCdWZmZXIgdHlwZSBpcyAqIHVpbnQzMl90KS4KKyAgKiBAbm90ZSAgQnkgZGVmYXVsdCwgdGhlIEFQSSBleHBlY3RzIGEgdWludDMyX3QgcG9pbnRlciBhcyBpbnB1dCBidWZmZXIgcGFyYW1ldGVyLgorICAqICAgICAgICBJbnB1dCBidWZmZXIgcG9pbnRlcnMgd2l0aCBvdGhlciB0eXBlcyBzaW1wbHkgbmVlZCB0byBiZSBjYXN0IGluIHVpbnQzMl90CisgICogICAgICAgIGFuZCB0aGUgQVBJIHdpbGwgaW50ZXJuYWxseSBhZGp1c3QgaXRzIGlucHV0IGRhdGEgcHJvY2Vzc2luZyBiYXNlZCBvbiB0aGUKKyAgKiAgICAgICAgaGFuZGxlIGZpZWxkIGhjcmMtPklucHV0RGF0YUZvcm1hdC4gCisgICogQHJldHZhbCB1aW50MzJfdCBDUkMgKHJldHVybmVkIHZhbHVlIExTQnMgZm9yIENSQyBzaG9ydGVyIHRoYW4gMzIgYml0cykKKyAgKi8gIAordWludDMyX3QgSEFMX0NSQ19DYWxjdWxhdGUoQ1JDX0hhbmRsZVR5cGVEZWYgKmhjcmMsIHVpbnQzMl90IHBCdWZmZXJbXSwgdWludDMyX3QgQnVmZmVyTGVuZ3RoKQoreworICB1aW50MzJfdCBpbmRleCA9IDBVOyAvKiBDUkMgaW5wdXQgZGF0YSBidWZmZXIgaW5kZXggKi8KKyAgdWludDMyX3QgdGVtcCA9IDBVOyAgLyogQ1JDIG91dHB1dCAocmVhZCBmcm9tIGhjcmMtPkluc3RhbmNlLT5EUiByZWdpc3RlcikgKi8KKyAgICAKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoY3JjKTsgCisgIAorICAvKiBDaGFuZ2UgQ1JDIHBlcmlwaGVyYWwgc3RhdGUgKi8gIAorICBoY3JjLT5TdGF0ZSA9IEhBTF9DUkNfU1RBVEVfQlVTWTsKKyAgCisgIC8qIFJlc2V0IENSQyBDYWxjdWxhdGlvbiBVbml0IChoY3JjLT5JbnN0YW5jZS0+SU5JVCBpcyAKKyAgKiAgd3JpdHRlbiBpbiBoY3JjLT5JbnN0YW5jZS0+RFIpICovCisgIF9fSEFMX0NSQ19EUl9SRVNFVChoY3JjKTsKKyAgCisgIHN3aXRjaCAoaGNyYy0+SW5wdXREYXRhRm9ybWF0KQorICB7CisgICAgY2FzZSBDUkNfSU5QVVREQVRBX0ZPUk1BVF9XT1JEUzogIAorICAgICAgLyogRW50ZXIgMzItYml0IGlucHV0IGRhdGEgdG8gdGhlIENSQyBjYWxjdWxhdG9yICovCisgICAgICBmb3IoaW5kZXggPSAwVTsgaW5kZXggPCBCdWZmZXJMZW5ndGg7IGluZGV4KyspCisgICAgICB7CisgICAgICAgIGhjcmMtPkluc3RhbmNlLT5EUiA9IHBCdWZmZXJbaW5kZXhdOworICAgICAgfQorICAgICAgdGVtcCA9IGhjcmMtPkluc3RhbmNlLT5EUjsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBDUkNfSU5QVVREQVRBX0ZPUk1BVF9CWVRFUzogCisgICAgICAvKiBTcGVjaWZpYyA4LWJpdCBpbnB1dCBkYXRhIGhhbmRsaW5nICAqLworICAgICAgdGVtcCA9IENSQ19IYW5kbGVfOChoY3JjLCAodWludDhfdCopcEJ1ZmZlciwgQnVmZmVyTGVuZ3RoKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBDUkNfSU5QVVREQVRBX0ZPUk1BVF9IQUxGV09SRFM6IAorICAgICAgLyogU3BlY2lmaWMgMTYtYml0IGlucHV0IGRhdGEgaGFuZGxpbmcgICovCisgICAgICB0ZW1wID0gQ1JDX0hhbmRsZV8xNihoY3JjLCAodWludDE2X3QqKXBCdWZmZXIsIEJ1ZmZlckxlbmd0aCk7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsgICAgICAgICAKKyAgfQorCisgIC8qIENoYW5nZSBDUkMgcGVyaXBoZXJhbCBzdGF0ZSAqLyAgICAKKyAgaGNyYy0+U3RhdGUgPSBIQUxfQ1JDX1NUQVRFX1JFQURZOyAKKyAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhjcmMpOworICAKKyAgLyogUmV0dXJuIHRoZSBDUkMgY29tcHV0ZWQgdmFsdWUgKi8gCisgIHJldHVybiB0ZW1wOworfQorICAKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgCisgKiAgQGJyaWVmICAgIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zLiAKKyAqCitAdmVyYmF0aW0gICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHBlcm1pdHMgdG8gZ2V0IGluIHJ1bi10aW1lIHRoZSBzdGF0dXMgb2YgdGhlIHBlcmlwaGVyYWwuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBDUkMgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgaGNyYyBDUkMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9DUkNfU3RhdGVUeXBlRGVmIEhBTF9DUkNfR2V0U3RhdGUoQ1JDX0hhbmRsZVR5cGVEZWYgKmhjcmMpCit7CisgIC8qIFJldHVybiBDUkMgaGFuZGxlIHN0YXRlICovCisgIHJldHVybiBoY3JjLT5TdGF0ZTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNfUHJpdmF0ZV9GdW5jdGlvbnMgQ1JDIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqICAgICAgICAgICAgIAorICAqIEBicmllZiAgRW50ZXIgOC1iaXQgaW5wdXQgZGF0YSB0byB0aGUgQ1JDIGNhbGN1bGF0b3IuCisgICogICAgICAgICBTcGVjaWZpYyBkYXRhIGhhbmRsaW5nIHRvIG9wdGltaXplIHByb2Nlc3NpbmcgdGltZS4gIAorICAqIEBwYXJhbSAgaGNyYyBDUkMgaGFuZGxlCisgICogQHBhcmFtICBwQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBCdWZmZXJMZW5ndGggaW5wdXQgZGF0YSBidWZmZXIgbGVuZ3RoCisgICogQHJldHZhbCB1aW50MzJfdCBDUkMgKHJldHVybmVkIHZhbHVlIExTQnMgZm9yIENSQyBzaG9ydGVyIHRoYW4gMzIgYml0cykKKyAgKi8KK3N0YXRpYyB1aW50MzJfdCBDUkNfSGFuZGxlXzgoQ1JDX0hhbmRsZVR5cGVEZWYgKmhjcmMsIHVpbnQ4X3QgcEJ1ZmZlcltdLCB1aW50MzJfdCBCdWZmZXJMZW5ndGgpCit7CisgIHVpbnQzMl90IGkgPSAwVTsgLyogaW5wdXQgZGF0YSBidWZmZXIgaW5kZXggKi8KKyAgCisgICAvKiBQcm9jZXNzaW5nIHRpbWUgb3B0aW1pemF0aW9uOiA0IGJ5dGVzIGFyZSBlbnRlcmVkIGluIGEgcm93IHdpdGggYSBzaW5nbGUgd29yZCB3cml0ZSwKKyAgICAqIGxhc3QgYnl0ZXMgbXVzdCBiZSBjYXJlZnVsbHkgZmVkIHRvIHRoZSBDUkMgY2FsY3VsYXRvciB0byBlbnN1cmUgYSBjb3JyZWN0IHR5cGUKKyAgICAqIGhhbmRsaW5nIGJ5IHRoZSBJUCAqLworICAgZm9yKGkgPSAwVTsgaSA8IChCdWZmZXJMZW5ndGgvNFUpOyBpKyspCisgICB7CisgICAgICBoY3JjLT5JbnN0YW5jZS0+RFIgPSAoKHVpbnQzMl90KXBCdWZmZXJbNFUqaV08PDI0VSkgfCAoKHVpbnQzMl90KXBCdWZmZXJbNFUqaSsxXTw8MTZVKSB8ICgodWludDMyX3QpcEJ1ZmZlcls0VSppKzJdPDw4VSkgfCAodWludDMyX3QpcEJ1ZmZlcls0VSppKzNdOyAgICAgIAorICAgfQorICAgLyogbGFzdCBieXRlcyBzcGVjaWZpYyBoYW5kbGluZyAqLworICAgaWYgKChCdWZmZXJMZW5ndGglNFUpICE9IDBVKQorICAgeworICAgICBpZiAgKEJ1ZmZlckxlbmd0aCU0VSA9PSAxVSkKKyAgICAgeworICAgICAgICoodWludDhfdCB2b2xhdGlsZSopICgmaGNyYy0+SW5zdGFuY2UtPkRSKSA9IHBCdWZmZXJbNCppXTsKKyAgICAgfQorICAgICBpZiAgKEJ1ZmZlckxlbmd0aCU0VSA9PSAyVSkKKyAgICAgeworICAgICAgICoodWludDE2X3Qgdm9sYXRpbGUqKSAoJmhjcmMtPkluc3RhbmNlLT5EUikgPSAoKHVpbnQzMl90KXBCdWZmZXJbNCppXTw8OCkgfCAodWludDMyX3QpcEJ1ZmZlcls0KmkrMV07CisgICAgIH0KKyAgICAgaWYgIChCdWZmZXJMZW5ndGglNFUgPT0gM1UpCisgICAgIHsKKyAgICAgICAqKHVpbnQxNl90IHZvbGF0aWxlKikgKCZoY3JjLT5JbnN0YW5jZS0+RFIpID0gKCh1aW50MzJfdClwQnVmZmVyWzQqaV08PDgpIHwgKHVpbnQzMl90KXBCdWZmZXJbNCppKzFdOworICAgICAgICoodWludDhfdCB2b2xhdGlsZSopICgmaGNyYy0+SW5zdGFuY2UtPkRSKSA9IHBCdWZmZXJbNCppKzJdOyAgICAgICAKKyAgICAgfQorICAgfQorICAKKyAgLyogUmV0dXJuIHRoZSBDUkMgY29tcHV0ZWQgdmFsdWUgKi8gCisgIHJldHVybiBoY3JjLT5JbnN0YW5jZS0+RFI7Cit9CisKKworCisvKiogICAgICAgICAgICAgCisgICogQGJyaWVmICBFbnRlciAxNi1iaXQgaW5wdXQgZGF0YSB0byB0aGUgQ1JDIGNhbGN1bGF0b3IuCisgICogICAgICAgICBTcGVjaWZpYyBkYXRhIGhhbmRsaW5nIHRvIG9wdGltaXplIHByb2Nlc3NpbmcgdGltZS4gIAorICAqIEBwYXJhbSAgaGNyYyBDUkMgaGFuZGxlCisgICogQHBhcmFtICBwQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBCdWZmZXJMZW5ndGggaW5wdXQgZGF0YSBidWZmZXIgbGVuZ3RoCisgICogQHJldHZhbCB1aW50MzJfdCBDUkMgKHJldHVybmVkIHZhbHVlIExTQnMgZm9yIENSQyBzaG9ydGVyIHRoYW4gMzIgYml0cykKKyAgKi8gIAorc3RhdGljIHVpbnQzMl90IENSQ19IYW5kbGVfMTYoQ1JDX0hhbmRsZVR5cGVEZWYgKmhjcmMsIHVpbnQxNl90IHBCdWZmZXJbXSwgdWludDMyX3QgQnVmZmVyTGVuZ3RoKQoreworICB1aW50MzJfdCBpID0gMFU7ICAvKiBpbnB1dCBkYXRhIGJ1ZmZlciBpbmRleCAqLworICAKKyAgLyogUHJvY2Vzc2luZyB0aW1lIG9wdGltaXphdGlvbjogMiBIYWxmV29yZHMgYXJlIGVudGVyZWQgaW4gYSByb3cgd2l0aCBhIHNpbmdsZSB3b3JkIHdyaXRlLAorICAgKiBpbiBjYXNlIG9mIG9kZCBsZW5ndGgsIGxhc3QgSGFsZldvcmQgbXVzdCBiZSBjYXJlZnVsbHkgZmVkIHRvIHRoZSBDUkMgY2FsY3VsYXRvciB0byBlbnN1cmUgCisgICAqIGEgY29ycmVjdCB0eXBlIGhhbmRsaW5nIGJ5IHRoZSBJUCAqLworICBmb3IoaSA9IDBVOyBpIDwgKEJ1ZmZlckxlbmd0aC8yVSk7IGkrKykKKyAgeworICAgIGhjcmMtPkluc3RhbmNlLT5EUiA9ICgodWludDMyX3QpcEJ1ZmZlclsyVSppXTw8MTZVKSB8ICh1aW50MzJfdClwQnVmZmVyWzJVKmkrMV07ICAgICAKKyAgfQorICBpZiAoKEJ1ZmZlckxlbmd0aCUyVSkgIT0gMFUpCisgIHsKKyAgICAgICAqKHVpbnQxNl90IHZvbGF0aWxlKikgKCZoY3JjLT5JbnN0YW5jZS0+RFIpID0gcEJ1ZmZlclsyKmldOyAKKyAgfQorICAgCisgIC8qIFJldHVybiB0aGUgQ1JDIGNvbXB1dGVkIHZhbHVlICovIAorICByZXR1cm4gaGNyYy0+SW5zdGFuY2UtPkRSOworfQorCisvKioKKyAgKiBAfQorICAqLworICAKKyNlbmRpZiAvKiBIQUxfQ1JDX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjN4eF9oYWxfY3JjX2V4LmMgYi9TcmMvc3RtMzJmM3h4X2hhbF9jcmNfZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODliOTc1Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZjN4eF9oYWxfY3JjX2V4LmMKQEAgLTAsMCArMSwyMzUgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX2NyY19leC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBFeHRlbmRlZCBDUkMgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGV4dGVuZGVkIAorICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgQ1JDIHBlcmlwaGVyYWwuICAKKyAgKiAgICAgICAgIAorICBAdmVyYmF0aW0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICAgICgrKSBTZXQgdXNlci1kZWZpbmVkIGdlbmVyYXRpbmcgcG9seW5vbWlhbCB0aHJ1IEhBTF9DUkNFeF9Qb2x5bm9taWFsX1NldCgpCisgICAgICAgICAoKykgQ29uZmlndXJlIElucHV0IG9yIE91dHB1dCBkYXRhIGludmVyc2lvbgorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIAorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNFeCBDUkNFeCAKKyAgKiBAYnJpZWYgQ1JDIEV4dGVuZGVkIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9DUkNfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIENSQ0V4X0V4cG9ydGVkX0Z1bmN0aW9ucyBDUkMgRXh0ZW5kZWQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIENSQyBFeHRlbmRlZCBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQGJyaWVmICAgIENSQyBFeHRlbmRlZCBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMuCisgICoKK0B2ZXJiYXRpbSAgICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAjIyMjIyBFeHRlbmRlZCBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIENvbmZpZ3VyZSB0aGUgZ2VuZXJhdGluZyBwb2x5bm9taWFsCisgICAgICAoKykgQ29uZmlndXJlIHRoZSBpbnB1dCBkYXRhIGludmVyc2lvbgorICAgICAgKCspIENvbmZpZ3VyZSB0aGUgb3V0cHV0IGRhdGEgaW52ZXJzaW9uCisgCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgQ1JDIHBvbHlub21pYWwgaWYgZGlmZmVyZW50IGZyb20gZGVmYXVsdCBvbmUuCisgICogQHBhcmFtICBoY3JjIENSQyBoYW5kbGUKKyAgKiBAcGFyYW0gIFBvbCBDUkMgZ2VuZXJhdGluZyBwb2x5bm9taWFsICg3LCA4LCAxNiBvciAzMi1iaXQgbG9uZykuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyB3cml0dGVuIGluIG5vcm1hbCByZXByZXNlbnRhdGlvbiwgZS5nLgorICAqICAgICAgICAgQGFyZyBmb3IgYSBwb2x5bm9taWFsIG9mIGRlZ3JlZSA3LCBYXjcgKyBYXjYgKyBYXjUgKyBYXjIgKyAxIGlzIHdyaXR0ZW4gMHg2NSAKKyAgKiAgICAgICAgIEBhcmcgZm9yIGEgcG9seW5vbWlhbCBvZiBkZWdyZWUgMTYsIFheMTYgKyBYXjEyICsgWF41ICsgMSBpcyB3cml0dGVuIDB4MTAyMSAgICAgCisgICogQHBhcmFtICBQb2x5TGVuZ3RoIENSQyBwb2x5bm9taWFsIGxlbmd0aC4gCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgIEBhcmcgQ1JDX1BPTFlMRU5HVEhfN0I6IDctYml0IGxvbmcgQ1JDIChnZW5lcmF0aW5nIHBvbHlub21pYWwgb2YgZGVncmVlIDcpCisgICogICAgICAgICAgQGFyZyBDUkNfUE9MWUxFTkdUSF84QjogOC1iaXQgbG9uZyBDUkMgKGdlbmVyYXRpbmcgcG9seW5vbWlhbCBvZiBkZWdyZWUgOCkKKyAgKiAgICAgICAgICBAYXJnIENSQ19QT0xZTEVOR1RIXzE2QjogMTYtYml0IGxvbmcgQ1JDIChnZW5lcmF0aW5nIHBvbHlub21pYWwgb2YgZGVncmVlIDE2KQorICAqICAgICAgICAgIEBhcmcgQ1JDX1BPTFlMRU5HVEhfMzJCOiAzMi1iaXQgbG9uZyBDUkMgKGdlbmVyYXRpbmcgcG9seW5vbWlhbCBvZiBkZWdyZWUgMzIpICAgICAgICAgICAgICAgIAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JDRXhfUG9seW5vbWlhbF9TZXQoQ1JDX0hhbmRsZVR5cGVEZWYgKmhjcmMsIHVpbnQzMl90IFBvbCwgdWludDMyX3QgUG9seUxlbmd0aCkKK3sKKyAgdWludDMyX3QgbXNiID0gMzFVOyAvKiBwb2x5bm9taWFsIGRlZ3JlZSBpcyAzMiBhdCBtb3N0LCBzbyBtc2IgaXMgaW5pdGlhbGl6ZWQgdG8gbWF4IHZhbHVlICovCisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0NSQ19QT0xfTEVOR1RIKFBvbHlMZW5ndGgpKTsKKyAgCisgIC8qIGNoZWNrIHBvbHlub21pYWwgZGVmaW5pdGlvbiB2cyBwb2x5bm9taWFsIHNpemU6CisgICAqIHBvbHlub21pYWwgbGVuZ3RoIG11c3QgYmUgYWxpZ25lZCB3aXRoIHBvbHlub21pYWwKKyAgICogZGVmaW5pdGlvbi4gSEFMX0VSUk9SIGlzIHJlcG9ydGVkIGlmIFBvbCBkZWdyZWUgaXMgCisgICAqIGxhcmdlciB0aGFuIHRoYXQgaW5kaWNhdGVkIGJ5IFBvbHlMZW5ndGguCisgICAqIExvb2sgZm9yIE1TQiBwb3NpdGlvbjogbXNiIHdpbGwgY29udGFpbiB0aGUgZGVncmVlIG9mCisgICAqICB0aGUgc2Vjb25kIHRvIHRoZSBsYXJnZXN0IHBvbHlub21pYWwgbWVtYmVyLiBFLmcuLCBmb3IKKyAgICogIFheNyArIFheNiArIFheNSArIFheMiArIDEsIG1zYiA9IDYuICovCisgIHdoaWxlICgoKFBvbCAmICgxVSA8PCBtc2IpKSA9PSAwVSkgJiYgKG1zYi0tID4gMFUpKXt9CisKKyAgc3dpdGNoIChQb2x5TGVuZ3RoKQorICB7CisgICAgY2FzZSBDUkNfUE9MWUxFTkdUSF83QjoKKyAgICAgIGlmIChtc2IgPj0gSEFMX0NSQ19MRU5HVEhfN0IpIAorICAgICAgeworICAgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1JDX1BPTFlMRU5HVEhfOEI6CisgICAgICBpZiAobXNiID49IEhBTF9DUkNfTEVOR1RIXzhCKQorICAgICAgeworICAgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICAgIH0gICAgICAKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1JDX1BPTFlMRU5HVEhfMTZCOgorICAgICAgaWYgKG1zYiA+PSBIQUxfQ1JDX0xFTkdUSF8xNkIpCisgICAgICB7CisgICAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgICAgfSAgICAgIAorICAgICAgYnJlYWs7CisgICAgY2FzZSBDUkNfUE9MWUxFTkdUSF8zMkI6CisgICAgICAvKiBubyBwb2x5bm9taWFsIGRlZmluaXRpb24gdnMuIHBvbHlub21pYWwgbGVuZ3RoIGlzc3VlIHBvc3NpYmxlICovCisgICAgICBicmVhazsgCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgIAorICB9CisKKyAgLyogc2V0IGdlbmVyYXRpbmcgcG9seW5vbWlhbCAqLworICBXUklURV9SRUcoaGNyYy0+SW5zdGFuY2UtPlBPTCwgUG9sKTsKKyAgCisgIC8qIHNldCBnZW5lcmF0aW5nIHBvbHlub21pYWwgc2l6ZSAqLworICBNT0RJRllfUkVHKGhjcmMtPkluc3RhbmNlLT5DUiwgQ1JDX0NSX1BPTFlTSVpFLCBQb2x5TGVuZ3RoKTsgIAorICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgUmV2ZXJzZSBJbnB1dCBkYXRhIG1vZGUuCisgICogQHBhcmFtICBoY3JjIENSQyBoYW5kbGUKKyAgKiBAcGFyYW0gIElucHV0UmV2ZXJzZU1vZGUgSW5wdXQgRGF0YSBpbnZlcnNpb24gbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBDUkNfSU5QVVREQVRBX05PSU5WRVJTSU9OOiBubyBjaGFuZ2UgaW4gYml0IG9yZGVyIChkZWZhdWx0IHZhbHVlKQorICAqICAgICAgICAgIEBhcmcgQ1JDX0lOUFVUREFUQV9JTlZFUlNJT05fQllURTogQnl0ZS13aXNlIGJpdCByZXZlcnNhbAorICAqICAgICAgICAgIEBhcmcgQ1JDX0lOUFVUREFUQV9JTlZFUlNJT05fSEFMRldPUkQ6IEhhbGZXb3JkLXdpc2UgYml0IHJldmVyc2FsCisgICogICAgICAgICAgQGFyZyBDUkNfSU5QVVREQVRBX0lOVkVSU0lPTl9XT1JEOiBXb3JkLXdpc2UgYml0IHJldmVyc2FsICAgICAgICAgICAgICAKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSQ0V4X0lucHV0X0RhdGFfUmV2ZXJzZShDUkNfSGFuZGxlVHlwZURlZiAqaGNyYywgdWludDMyX3QgSW5wdXRSZXZlcnNlTW9kZSkKK3sgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQ1JDX0lOUFVUREFUQV9JTlZFUlNJT05fTU9ERShJbnB1dFJldmVyc2VNb2RlKSk7CisgIAorICAvKiBDaGFuZ2UgQ1JDIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgaGNyYy0+U3RhdGUgPSBIQUxfQ1JDX1NUQVRFX0JVU1k7CisKKyAgLyogc2V0IGlucHV0IGRhdGEgaW52ZXJzaW9uIG1vZGUgKi8KKyAgTU9ESUZZX1JFRyhoY3JjLT5JbnN0YW5jZS0+Q1IsIENSQ19DUl9SRVZfSU4sIElucHV0UmV2ZXJzZU1vZGUpOyAgICAKKyAgLyogQ2hhbmdlIENSQyBwZXJpcGhlcmFsIHN0YXRlICovCisgIGhjcmMtPlN0YXRlID0gSEFMX0NSQ19TVEFURV9SRUFEWTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFJldmVyc2UgT3V0cHV0IGRhdGEgbW9kZS4KKyAgKiBAcGFyYW0gIGhjcmMgQ1JDIGhhbmRsZQorICAqIEBwYXJhbSAgT3V0cHV0UmV2ZXJzZU1vZGUgT3V0cHV0IERhdGEgaW52ZXJzaW9uIG1vZGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgIEBhcmcgQ1JDX09VVFBVVERBVEFfSU5WRVJTSU9OX0RJU0FCTEU6IG5vIENSQyBpbnZlcnNpb24gKGRlZmF1bHQgdmFsdWUpCisgICogICAgICAgICAgQGFyZyBDUkNfT1VUUFVUREFUQV9JTlZFUlNJT05fRU5BQkxFOiBiaXQtbGV2ZWwgaW52ZXJzaW9uIChlLmcuIGZvciBhIDgtYml0IENSQzogMHhCNSBiZWNvbWVzIDB4QUQpICAgICAgICAgICAgCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUkNFeF9PdXRwdXRfRGF0YV9SZXZlcnNlKENSQ19IYW5kbGVUeXBlRGVmICpoY3JjLCB1aW50MzJfdCBPdXRwdXRSZXZlcnNlTW9kZSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0NSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9NT0RFKE91dHB1dFJldmVyc2VNb2RlKSk7CisgIAorICAvKiBDaGFuZ2UgQ1JDIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgaGNyYy0+U3RhdGUgPSBIQUxfQ1JDX1NUQVRFX0JVU1k7CisKKyAgLyogc2V0IG91dHB1dCBkYXRhIGludmVyc2lvbiBtb2RlICovCisgIE1PRElGWV9SRUcoaGNyYy0+SW5zdGFuY2UtPkNSLCBDUkNfQ1JfUkVWX09VVCwgT3V0cHV0UmV2ZXJzZU1vZGUpOyAKKyAgICAgIAorICAvKiBDaGFuZ2UgQ1JDIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgaGNyYy0+U3RhdGUgPSBIQUxfQ1JDX1NUQVRFX1JFQURZOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisKKworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKworI2VuZGlmIC8qIEhBTF9DUkNfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmM3h4X2hhbF9kYWMuYyBiL1NyYy9zdG0zMmYzeHhfaGFsX2RhYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1OTQxNjgKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJmM3h4X2hhbF9kYWMuYwpAQCAtMCwwICsxLDc3MiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfZGFjLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIERBQyBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcgCisgICogICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIERpZ2l0YWwgdG8gQW5hbG9nIENvbnZlcnRlciAoREFDKSBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMgICAgICAKKyAgKgorICAqCisgQHZlcmJhdGltICAgICAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIERBQyBQZXJpcGhlcmFsIGZlYXR1cmVzICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gICAgICAgIAorICAgICAgKioqIERBQyBDaGFubmVscyAqKioKKyAgICAgID09PT09PT09PT09PT09PT09PT09ICAKKyAgICBbLi5dICAKKyAgICBUaGUgZGV2aWNlIGludGVncmF0ZXMgdXAgdG8gMyAxMi1iaXQgRGlnaXRhbCBBbmFsb2cgQ29udmVydGVycyB0aGF0IGNhbiAKKyAgICBiZSB1c2VkIGluZGVwZW5kZW50bHkgb3Igc2ltdWx0YW5lb3VzbHkgKGR1YWwgbW9kZSk6CisgICAgICAoIykgREFDMSBjaGFubmVsMSB3aXRoIERBQzFfT1VUMSAoUEE0KSBhcyBvdXRwdXQKKyAgICAgICgjKSBEQUMxIGNoYW5uZWwyIHdpdGggREFDMV9PVVQyIChQQTUpIGFzIG91dHB1dCAKKyAgICAgICAgICAoZm9yIFNUTTMyRjMgZGV2aWNlcyBoYXZpbmcgMiBjaGFubmVscyBvbiBEQUMxKQorICAgICAgKCMpIERBQzIgY2hhbm5lbDEgd2l0aCBEQUMyX09VVDEgKFBBNikgYXMgb3V0cHV0IAorICAgICAgICAgIChmb3IgU1RNMzJGMyBkZXZpY2VzIGhhdmluZyAyIERBQykKKworICAgICAgKioqIERBQyBUcmlnZ2VycyAqKioKKyAgICAgID09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIERpZ2l0YWwgdG8gQW5hbG9nIGNvbnZlcnNpb24gY2FuIGJlIG5vbi10cmlnZ2VyZWQgdXNpbmcgREFDX1RSSUdHRVJfTk9ORQorICAgIGFuZCBEQUMxX09VVDEvREFDMV9PVVQyL0RBQzJfT1VUMSBpcyBhdmFpbGFibGUgb25jZSB3cml0aW5nIHRvIERIUnggcmVnaXN0ZXIuIAorICAgIFsuLl0gCisgICAgRGlnaXRhbCB0byBBbmFsb2cgY29udmVyc2lvbiBjYW4gYmUgdHJpZ2dlcmVkIGJ5OgorICAgICAgKCMpIEV4dGVybmFsIGV2ZW50OiBFWFRJIExpbmUgOSAoYW55IEdQSU94X1BJTl85KSB1c2luZyBEQUNfVFJJR0dFUl9FWFRfSVQ5LgorICAgICAgICAgIFRoZSB1c2VkIHBpbiAoR1BJT3hfUElOXzkpIG11c3QgYmUgY29uZmlndXJlZCBpbiBpbnB1dCBtb2RlLgorICAKKyAgICAgICgjKSBUaW1lcnMgVFJHTzogVElNMiwgVElNNCwgVElNNSwgVElNNiwgVElNNyBhbmQgVElNOCAKKyAgICAgICAgICAoREFDX1RSSUdHRVJfVDJfVFJHTywgREFDX1RSSUdHRVJfVDRfVFJHTy4uLikKKyAgCisgICAgICAoIykgU29mdHdhcmUgdXNpbmcgREFDX1RSSUdHRVJfU09GVFdBUkUKKyAgCisgICAgICAqKiogREFDIEJ1ZmZlciBtb2RlIGZlYXR1cmUgKioqCisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorICAgICAgWy4uXSAKKyAgICAgIEVhY2ggREFDIGNoYW5uZWwgaW50ZWdyYXRlcyBhbiBvdXRwdXQgYnVmZmVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gCisgICAgICByZWR1Y2UgdGhlIG91dHB1dCBpbXBlZGFuY2UsIGFuZCB0byBkcml2ZSBleHRlcm5hbCBsb2FkcyBkaXJlY3RseQorICAgICAgd2l0aG91dCBoYXZpbmcgdG8gYWRkIGFuIGV4dGVybmFsIG9wZXJhdGlvbmFsIGFtcGxpZmllci4KKyAgICAgIFRvIGVuYWJsZSwgdGhlIG91dHB1dCBidWZmZXIgdXNlICAKKyAgICAgIHNDb25maWcuREFDX091dHB1dEJ1ZmZlciA9IERBQ19PVVRQVVRCVUZGRVJfRU5BQkxFOworICAgICAgT3IKKyAgICAgIEFuIG91dHB1dCBzd2l0Y2ggCisgICAgICAgICAoaW4gU1RNMzJGMzAzeDQsIFNUTTMyRjMwM3g2LCBTVE0zMkYzMDN4OAorICAgICAgICAgICAgIGMsIFNUTTMyRjMzNHg2LCBTVE0zMkYzMzR4OAorICAgICAgICAgICAmIFNUTTMyRjMzNHh4KS4KKyAgICAgIFRvIGVuYWJsZSwgdGhlIG91dHB1dCBzd2l0Y2gKKyAgICAgIHNDb25maWcuREFDX091dHB1dFN3aXRjaCA9IERBQ19PVVRQVVRTV0lUQ0hfRU5BQkxFOworICAgICAgWy4uXSAgICAgICAgIAorICAgICAgKEApIFJlZmVyIHRvIHRoZSBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMgYWJvdXQgb3V0cHV0IAorICAgICAgICAgIGltcGVkYW5jZSB2YWx1ZSB3aXRoIGFuZCB3aXRob3V0IG91dHB1dCBidWZmZXIuCisKKyAgICAgICoqKiBHUElPIGNvbmZpZ3VyYXRpb25zIGd1aWRlbGluZXMgKioqCisgICAgICA9PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFsuLl0gCisgICAgICBXaGVuIGEgREFDIGNoYW5uZWwgaXMgdXNlZCAoZXggY2hhbm5lbDEgb24gUEE0KSBhbmQgdGhlIG90aGVyIGlzIG5vdCAKKyAgICAgIChleCBjaGFubmVsMiBvbiBQQTUgaXMgY29uZmlndXJlZCBpbiBBbmFsb2cgYW5kIGRpc2FibGVkKS4KKyAgICAgIENoYW5uZWwxIG1heSBkaXN0dXJiIGNoYW5uZWwyIGFzIGNvdXBsaW5nIGVmZmVjdC4KKyAgICAgIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBjb3VwbGluZyBvbiBjaGFubmVsMiBhcyBzb29uIGFzIGNoYW5uZWwyIGlzIHR1cm5lZCBvbi4KKyAgICAgIENvdXBsaW5nIG9uIGFkamFjZW50IGNoYW5uZWwgY291bGQgYmUgYXZvaWRlZCBhcyBmb2xsb3dzOgorICAgICAgd2hlbiB1bnVzZWQgUEE1IGlzIGNvbmZpZ3VyZWQgYXMgSU5QVVQgUFVMTC1VUCBvciBET1dOLiAKKyAgICAgIFBBNSBpcyBjb25maWd1cmVkIGluIEFOQUxPRyBqdXN0IGJlZm9yZSBpdCBpcyB0dXJuZWQgb24uICAgICAKKworICAgICAgICAgICAgCisgICAgICAgKioqIERBQyB3YXZlIGdlbmVyYXRpb24gZmVhdHVyZSAqKioKKyAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKyAgICAgICBbLi5dICAgICAKKyAgICAgICBCb3RoIERBQyBjaGFubmVscyBvZiBEQUMxIGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlCisgICAgICAgbm90ZSB0aGF0IHdhdmUgZ2VuZXJhdGlvbiBpcyBub3QgYXZhaWxhYmxlIGluIERBQzIuCisgICAgICAgICAoIykgTm9pc2Ugd2F2ZQorICAgICAgICAgKCMpIFRyaWFuZ2xlIHdhdmUKKyAgICAgIAorICAgICAgIFdhdmUgZ2VuZXJhdGlvbiBpcyBOT1QgYXZhaWxhYmxlIGluIERBQzIuCisKKyAgICAgICAqKiogREFDIGRhdGEgZm9ybWF0ICoqKgorICAgICAgID09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgWy4uXSAgIAorICAgICAgIFRoZSBEQUMgZGF0YSBmb3JtYXQgY2FuIGJlOgorICAgICAgICAgKCMpIDgtYml0IHJpZ2h0IGFsaWdubWVudCB1c2luZyBEQUNfQUxJR05fOEJfUgorICAgICAgICAgKCMpIDEyLWJpdCBsZWZ0IGFsaWdubWVudCB1c2luZyBEQUNfQUxJR05fMTJCX0wKKyAgICAgICAgICgjKSAxMi1iaXQgcmlnaHQgYWxpZ25tZW50IHVzaW5nIERBQ19BTElHTl8xMkJfUgorICAKKyAgICAgICAqKiogREFDIGRhdGEgdmFsdWUgdG8gdm9sdGFnZSBjb3JyZXNwb25kYW5jZSAqKiogIAorICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKyAgICAgICBbLi5dIAorICAgICAgIFRoZSBhbmFsb2cgb3V0cHV0IHZvbHRhZ2Ugb24gZWFjaCBEQUMgY2hhbm5lbCBwaW4gaXMgZGV0ZXJtaW5lZAorICAgICAgIGJ5IHRoZSBmb2xsb3dpbmcgZXF1YXRpb246IAorICAgICAgIFsuLl0gCisgICAgICAgREFDX09VVHggPSBWUkVGKyAqIERPUiAvIDQwOTUgICAgIAorICAgICAgICgrKSB3aXRoICBET1IgaXMgdGhlIERhdGEgT3V0cHV0IFJlZ2lzdGVyCisgICAgICAgWy4uXSAgCisgICAgICAgICAgVkVGKyBpcyB0aGUgaW5wdXQgdm9sdGFnZSByZWZlcmVuY2UgKHJlZmVyIHRvIHRoZSBkZXZpY2UgZGF0YXNoZWV0KQorICAgICAgIFsuLl0gICAgICAgIAorICAgICAgICBlLmcuIFRvIHNldCBEQUNfT1VUMSB0byAwLjdWLCB1c2UKKyAgICAgICAoKykgIEFzc3VtaW5nIHRoYXQgVlJFRisgPSAzLjNWLCBEQUNfT1VUMSA9ICgzLjNVICogODY4VSkgLyA0MDk1VSA9IDAuN1YKKyAgCisgICAgICAgKioqIERNQSByZXF1ZXN0cyAgKioqCisgICAgICAgPT09PT09PT09PT09PT09PT09PT09CisgICAgICAgWy4uXSAgICAKKyAgICAgICBBIERNQTEgb3IgRE1BMiByZXF1ZXN0IGNhbiBiZSBnZW5lcmF0ZWQgd2hlbiBhbiBleHRlcm5hbCB0cmlnZ2VyIAorICAgICAgIChidXQgbm90IGEgc29mdHdhcmUgdHJpZ2dlcikgb2NjdXJzIGlmIERNQTEgb3IgRE1BMiByZXF1ZXN0cyBhcmUgCisgICAgICAgZW5hYmxlZCB1c2luZyBIQUxfREFDX1N0YXJ0X0RNQSgpLgorICAgICAgIFsuLl0KKyAgICAgICBETUExIHJlcXVlc3RzIGFyZSBtYXBwZWQgYXMgZm9sbG93aW5nOgorICAgICAgICAgKCMpIERBQzEgY2hhbm5lbDE6IG1hcHBlZCBlaXRoZXIgb24KKyAgICAgICAgICgrKykgRE1BMSBjaGFubmVsMyAKKyAgICAgICAgICgrKykgb3IgRE1BMiBjaGFubmVsMyAoZm9yIFNUTTMyRjMgZGV2aWNlcyBoYXZpbmcgMiBETUEpCisgICAgICAgICAgICAgd2hpY2ggbXVzdCBiZSBhbHJlYWR5IGNvbmZpZ3VyZWQKKyAgICAgICAgICgjKSBEQUMxIGNoYW5uZWwyOiAKKyAgICAgICAgICAgICAoZm9yIFNUTTMyRjMgZGV2aWNlcyBoYXZpbmcgMiBjaGFubmVscyBvbiBEQUMxKQorICAgICAgICAgICAgIG1hcHBlZCBlaXRoZXIgb24KKyAgICAgICAgICgrKykgRE1BMSBjaGFubmVsNCAKKyAgICAgICAgICgrKykgb3IgRE1BMiBjaGFubmVsNCAoZm9yIFNUTTMyRjMgZGV2aWNlcyBoYXZpbmcgMiBETUEpCisgICAgICAgICAgICAgd2hpY2ggbXVzdCBiZSBhbHJlYWR5IGNvbmZpZ3VyZWQKKyAgICAgIAorICAgICAgICAgKCMpIERBQzIgY2hhbm5lbDE6IG1hcHBlZCBlaXRoZXIgb24gCisgICAgICAgICAgICAgKGZvciBTVE0zMkYzIGRldmljZXMgaGF2aW5nIDIgREFDKQorICAgICAgICAgKCsrKSBETUExIGNoYW5uZWw0IAorICAgICAgICAgKCsrKSBvciBETUEyIGNoYW5uZWw0IChmb3IgU1RNMzJGMyBkZXZpY2VzIGhhdmluZyAyIERNQSkKKyAgICAgICAgICAgICB3aGljaCBtdXN0IGJlIGFscmVhZHkgY29uZmlndXJlZAorICAgIAorCisgICAgICAgKEApIEZvciBEdWFsIG1vZGUgYW5kIHNwZWNpZmljIHNpZ25hbCAoVHJpYW5nbGUgYW5kIG5vaXNlKSBnZW5lcmF0aW9uIHBsZWFzZSAKKyAgICAgICByZWZlciB0byBFeHRlbmRlZCBGZWF0dXJlcyBEcml2ZXIgZGVzY3JpcHRpb24gICAgICAgIAorCisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICAgICAgICAgIAorICAgICAgKCspIERBQyBBUEIgY2xvY2sgbXVzdCBiZSBlbmFibGVkIHRvIGdldCB3cml0ZSBhY2Nlc3MgdG8gREFDCisgICAgICAgICAgcmVnaXN0ZXJzIHVzaW5nIEhBTF9EQUNfSW5pdCgpCisgICAgICAoKykgQ29uZmlndXJlIERBQ19PVVR4IChEQUNfT1VUMTogUEE0LCBEQUNfT1VUMjogUEE1KSBpbiBhbmFsb2cgbW9kZS4KKyAgICAgICgrKSBDb25maWd1cmUgdGhlIERBQyBjaGFubmVsIHVzaW5nIEhBTF9EQUNfQ29uZmlnQ2hhbm5lbCgpIGZ1bmN0aW9uLgorICAgICAgKCspIEVuYWJsZSB0aGUgREFDIGNoYW5uZWwgdXNpbmcgSEFMX0RBQ19TdGFydCgpIG9yIEhBTF9EQUNfU3RhcnRfRE1BKCkgZnVuY3Rpb25zCisKKyAgICAgKioqIFBvbGxpbmcgbW9kZSBJTyBvcGVyYXRpb24gKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dICAgIAorICAgICAgICgrKSBTdGFydCB0aGUgREFDIHBlcmlwaGVyYWwgdXNpbmcgSEFMX0RBQ19TdGFydCgpIAorICAgICAgICgrKSBUbyByZWFkIHRoZSBEQUMgbGFzdCBkYXRhIG91dHB1dCB2YWx1ZSwgdXNlIHRoZSBIQUxfREFDX0dldFZhbHVlKCkgZnVuY3Rpb24uCisgICAgICAgKCspIFN0b3AgdGhlIERBQyBwZXJpcGhlcmFsIHVzaW5nIEhBTF9EQUNfU3RvcCgpCisgICAgICAgCisgICAgICoqKiBETUEgbW9kZSBJTyBvcGVyYXRpb24gKioqICAgIAorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgWy4uXSAgICAKKyAgICAgICAoKykgU3RhcnQgdGhlIERBQyBwZXJpcGhlcmFsIHVzaW5nIEhBTF9EQUNfU3RhcnRfRE1BKCksIGF0IHRoaXMgc3RhZ2UgdGhlIHVzZXIgc3BlY2lmeSB0aGUgbGVuZ3RoIAorICAgICAgICAgICBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGF0IGVhY2ggZW5kIG9mIGNvbnZlcnNpb24KKyAgICAgICAoKykgQXQgdGhlIG1pZGRsZSBvZiBkYXRhIHRyYW5zZmVyIEhBTF9EQUNfQ29udkhhbGZDcGx0Q2FsbGJhY2tDaDEoKSBvciBIQUxfREFDRXhfQ29udkhhbGZDcGx0Q2FsbGJhY2tDaDIoKSAgCisgICAgICAgICAgIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbiBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciAKKyAgICAgICAgICAgSEFMX0RBQ19Db252SGFsZkNwbHRDYWxsYmFja0NoMSgpIG9yIEhBTF9EQUNFeF9Db252SGFsZkNwbHRDYWxsYmFja0NoMigpCisgICAgICAgKCspIEF0IFRoZSBlbmQgb2YgZGF0YSB0cmFuc2ZlciBIQUxfREFDX0NvbnZDcGx0Q2FsbGJhY2tDaDEoKSBvciBIQUxfREFDRXhfQ29udkhhbGZDcGx0Q2FsbGJhY2tDaDIoKSAgCisgICAgICAgICAgIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbiBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciAKKyAgICAgICAgICAgSEFMX0RBQ19Db252Q3BsdENhbGxiYWNrQ2gxKCkgb3IgSEFMX0RBQ0V4X0NvbnZIYWxmQ3BsdENhbGxiYWNrQ2gyKCkKKyAgICAgICAoKykgSW4gY2FzZSBvZiB0cmFuc2ZlciBFcnJvciwgSEFMX0RBQ19FcnJvckNhbGxiYWNrQ2gxKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuIAorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0RBQ19FcnJvckNhbGxiYWNrQ2gxCisgICAgICAgKCspIEluIGNhc2Ugb2YgRE1BIHVuZGVycnVuLCBEQUMgaW50ZXJydXB0aW9uIHRyaWdnZXJzIGFuZCBleGVjdXRlIGludGVybmFsIGZ1bmN0aW9uIEhBTF9EQUNfSVJRSGFuZGxlci4KKyAgICAgICAgICAgSEFMX0RBQ19ETUFVbmRlcnJ1bkNhbGxiYWNrQ2gxKCkgb3IgSEFMX0RBQ0V4X0RNQVVuZGVycnVuQ2FsbGJhY2tDaDIoKSAgCisgICAgICAgICAgIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbiBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciAKKyAgICAgICAgICAgSEFMX0RBQ19ETUFVbmRlcnJ1bkNhbGxiYWNrQ2gxKCkgb3IgSEFMX0RBQ0V4X0RNQVVuZGVycnVuQ2FsbGJhY2tDaDIoKSBhbmQKKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0RBQ19FcnJvckNhbGxiYWNrQ2gxKCkKKyAgICAgICAoKykgU3RvcCB0aGUgREFDIHBlcmlwaGVyYWwgdXNpbmcgSEFMX0RBQ19TdG9wX0RNQSgpCisKKyAgICAgKioqIERBQyBIQUwgZHJpdmVyIG1hY3JvcyBsaXN0ICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCisgICAgIFsuLl0KKyAgICAgICBCZWxvdyB0aGUgbGlzdCBvZiBtb3N0IHVzZWQgbWFjcm9zIGluIERBQyBIQUwgZHJpdmVyLgorICAgICAgIAorICAgICAgKCspIF9fSEFMX0RBQ19FTkFCTEUgOiBFbmFibGUgdGhlIERBQyBwZXJpcGhlcmFsCisgICAgICAoKykgX19IQUxfREFDX0RJU0FCTEUgOiBEaXNhYmxlIHRoZSBEQUMgcGVyaXBoZXJhbAorICAgICAgKCspIF9fSEFMX0RBQ19DTEVBUl9GTEFHOiBDbGVhciB0aGUgREFDJ3MgcGVuZGluZyBmbGFncworICAgICAgKCspIF9fSEFMX0RBQ19HRVRfRkxBRzogR2V0IHRoZSBzZWxlY3RlZCBEQUMncyBmbGFnIHN0YXR1cyAKKyAgICAgIAorICAgICBbLi5dCisgICAgICAoQCkgWW91IGNhbiByZWZlciB0byB0aGUgREFDIEhBTCBkcml2ZXIgaGVhZGVyIGZpbGUgZm9yIG1vcmUgdXNlZnVsIG1hY3JvcyAgCisgICAKKyBAZW5kdmVyYmF0aW0gICAgCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLyAKKworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUMgREFDCisgICogQGJyaWVmIERBQyBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovIAorIAorI2lmZGVmIEhBTF9EQUNfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBEQUNfUHJpdmF0ZV9NYWNyb3MgREFDIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBEQUNfUHJpdmF0ZV9GdW5jdGlvbnMgREFDIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAKKy8qKiBAZGVmZ3JvdXAgREFDX0V4cG9ydGVkX0Z1bmN0aW9ucyBEQUMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIAorICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgCisgKgorQHZlcmJhdGltICAgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSB0aGUgREFDLiAKKyAgICAgICgrKSBEZS1pbml0aWFsaXplIHRoZSBEQUMuIAorICAgICAgICAgCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIERBQyBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMKKyAgKiAgICAgICAgIGluIHRoZSBEQUNfSW5pdFN0cnVjdCBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ19Jbml0KERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjKQoreyAKKyAgLyogQ2hlY2sgREFDIGhhbmRsZSAqLworICBpZihoZGFjID09IE5VTEwpCisgIHsKKyAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfREFDX0FMTF9JTlNUQU5DRShoZGFjLT5JbnN0YW5jZSkpOworICAKKyAgaWYoaGRhYy0+U3RhdGUgPT0gSEFMX0RBQ19TVEFURV9SRVNFVCkKKyAgeyAgCisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGhkYWMtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgICBIQUxfREFDX01zcEluaXQoaGRhYyk7CisgIH0KKyAgCisgIC8qIEluaXRpYWxpemUgdGhlIERBQyBzdGF0ZSovCisgIGhkYWMtPlN0YXRlID0gSEFMX0RBQ19TVEFURV9CVVNZOworICAgICAgIAorICAvKiBTZXQgREFDIGVycm9yIGNvZGUgdG8gbm9uZSAqLworICBoZGFjLT5FcnJvckNvZGUgPSBIQUxfREFDX0VSUk9SX05PTkU7CisgIAorICAvKiBJbml0aWFsaXplIHRoZSBEQUMgc3RhdGUqLworICBoZGFjLT5TdGF0ZSA9IEhBTF9EQUNfU1RBVEVfUkVBRFk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVpbml0aWFsaXplIHRoZSBEQUMgcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ19EZUluaXQoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMpCit7CisgIC8qIENoZWNrIERBQyBoYW5kbGUgKi8KKyAgaWYoaGRhYyA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19EQUNfQUxMX0lOU1RBTkNFKGhkYWMtPkluc3RhbmNlKSk7CisKKyAgLyogQ2hhbmdlIERBQyBzdGF0ZSAqLworICBoZGFjLT5TdGF0ZSA9IEhBTF9EQUNfU1RBVEVfQlVTWTsKKyAgCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIEhBTF9EQUNfTXNwRGVJbml0KGhkYWMpOworICAKKyAgLyogU2V0IERBQyBlcnJvciBjb2RlIHRvIG5vbmUgKi8KKyAgaGRhYy0+RXJyb3JDb2RlID0gSEFMX0RBQ19FUlJPUl9OT05FOworICAKKyAgLyogQ2hhbmdlIERBQyBzdGF0ZSAqLworICBoZGFjLT5TdGF0ZSA9IEhBTF9EQUNfU1RBVEVfUkVTRVQ7CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoZGFjKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgREFDIE1TUC4KKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfREFDX01zcEluaXQoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhkYWMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfREFDX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gCit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplIHRoZSBEQUMgTVNQLgorICAqIEBwYXJhbSAgaGRhYyBwb2ludGVyIHRvIGEgREFDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERBQy4gIAorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0RBQ19Nc3BEZUluaXQoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhkYWMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfREFDX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAKKyAqCitAdmVyYmF0aW0gICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgU3RhcnQgY29udmVyc2lvbi4KKyAgICAgICgrKSBTdG9wIGNvbnZlcnNpb24uCisgICAgICAoKykgU3RhcnQgY29udmVyc2lvbiBhbmQgZW5hYmxlIERNQSB0cmFuc2Zlci4KKyAgICAgICgrKSBTdG9wIGNvbnZlcnNpb24gYW5kIGRpc2FibGUgRE1BIHRyYW5zZmVyLgorICAgICAgKCspIEdldCByZXN1bHQgb2YgY29udmVyc2lvbi4KKyAgICAgICgrKSBHZXQgcmVzdWx0IG9mIGR1YWwgbW9kZSBjb252ZXJzaW9uLgorICAgICAgICAgICAgICAgICAgICAgCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgREFDIGFuZCBzdGFydHMgY29udmVyc2lvbiBvZiBjaGFubmVsLgorICAqIEBwYXJhbSAgaGRhYyBwb2ludGVyIHRvIGEgREFDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERBQy4KKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLiAKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBEQUNfQ0hBTk5FTF8xOiBEQUMxIENoYW5uZWwxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzI6IERBQzEgQ2hhbm5lbDIgc2VsZWN0ZWQgIAorICAqICAgICAgICAgICAgQGFyZyBEQUNfQ0hBTk5FTF8xOiBEQUMyIENoYW5uZWwxIHNlbGVjdGVkICAKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK19fd2VhayBIQUxfU3RhdHVzVHlwZURlZiBIQUxfREFDX1N0YXJ0KERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoZGFjKTsKKyAgVU5VU0VEKENoYW5uZWwpOworCisgIC8qIE5vdGUgOiBUaGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQgaW50byB0aGlzIGZpbGUgZm9yIGxpYnJhcnkgcmVmZXJlbmNlICovCisgIC8qICAgICAgICBGdW5jdGlvbiBjb250ZW50IGlzIGxvY2F0ZWQgaW50byBmaWxlIHN0bTMyZjN4eF9oYWxfZGFjX2V4LmMgICovCisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfRVJST1I7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZXMgREFDIGFuZCBzdG9wIGNvbnZlcnNpb24gb2YgY2hhbm5lbC4KKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHBhcmFtICBDaGFubmVsIFRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4gCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0NIQU5ORUxfMTogREFDMSBDaGFubmVsMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBEQUNfQ0hBTk5FTF8yOiBEQUMxIENoYW5uZWwyIHNlbGVjdGVkICAKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0NIQU5ORUxfMTogREFDMiBDaGFubmVsMSBzZWxlY3RlZCAgCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfREFDX1N0b3AoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19EQUNfQ0hBTk5FTF9JTlNUQU5DRShoZGFjLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworICAKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9EQUNfRElTQUJMRShoZGFjLCBDaGFubmVsKTsKKyAgCisgIC8qIENoYW5nZSBEQUMgc3RhdGUgKi8KKyAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX1JFQURZOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGVzIERBQyBhbmQgc3RvcCBjb252ZXJzaW9uIG9mIGNoYW5uZWwuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuIAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzE6IERBQzEgQ2hhbm5lbDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0NIQU5ORUxfMjogREFDMSBDaGFubmVsMiBzZWxlY3RlZCAgCisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzE6IERBQzIgQ2hhbm5lbDEgc2VsZWN0ZWQgICAgCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfREFDX1N0b3BfRE1BKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjLCB1aW50MzJfdCBDaGFubmVsKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgICAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19EQUNfQ0hBTk5FTF9JTlNUQU5DRShoZGFjLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworICAKKyAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgRE1BIHJlcXVlc3QgKi8KKyAgICBoZGFjLT5JbnN0YW5jZS0+Q1IgJj0gfihEQUNfQ1JfRE1BRU4xIDw8IENoYW5uZWwpOworICAgIAorICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0RBQ19ESVNBQkxFKGhkYWMsIENoYW5uZWwpOworICAKKyAgLyogRGlzYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgLyogQ2hhbm5lbDEgaXMgdXNlZCAqLworICBpZiAoQ2hhbm5lbCA9PSBEQUNfQ0hBTk5FTF8xKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICBzdGF0dXMgPSBIQUxfRE1BX0Fib3J0KGhkYWMtPkRNQV9IYW5kbGUxKTsgICAKKyAgICAKKyAgICAvKiBEaXNhYmxlIHRoZSBEQUMgRE1BIHVuZGVycnVuIGludGVycnVwdCAqLworICAgIF9fSEFMX0RBQ19ESVNBQkxFX0lUKGhkYWMsIERBQ19JVF9ETUFVRFIxKTsKKyAgfSAgIAorI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSAgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpIAorCisgIC8qIEZvciBhbGwgcHJvZHVjdHMgaW5jbHVkaW5nIGNoYW5uZWwgMlUgKi8KKyAgLyogREFDIGNoYW5uZWwgMiBpcyBhdmFpbGFibGUgb24gdG9wIG9mIERBQyBjaGFubmVsIDFVICovCisgIGVsc2UgLyogQ2hhbm5lbDIgaXMgdXNlZCBmb3IgKi8KKyAgeworICAgIC8qIERpc2FibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgc3RhdHVzID0gSEFMX0RNQV9BYm9ydChoZGFjLT5ETUFfSGFuZGxlMik7ICAgCisgICAgCisgICAgLyogRGlzYWJsZSB0aGUgREFDIERNQSB1bmRlcnJ1biBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9EQUNfRElTQUJMRV9JVChoZGFjLCBEQUNfSVRfRE1BVURSMik7CisgIH0KKyNlbmRpZgorICAgIAorICAvKiBDaGVjayBpZiBETUEgQ2hhbm5lbCBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLworICBpZiAoc3RhdHVzICE9IEhBTF9PSykKKyAgeworICAgIC8qIFVwZGF0ZSBEQUMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgIGhkYWMtPlN0YXRlID0gSEFMX0RBQ19TVEFURV9FUlJPUjsgICAgICAKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDaGFuZ2UgREFDIHN0YXRlICovCisgICAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX1JFQURZOworICB9CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyB0aGUgbGFzdCBkYXRhIG91dHB1dCB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuIAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzE6IERBQzEgQ2hhbm5lbDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0NIQU5ORUxfMjogREFDMSBDaGFubmVsMiBzZWxlY3RlZCAgCisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzE6IERBQzIgQ2hhbm5lbDEgc2VsZWN0ZWQgCisgICogQHJldHZhbCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgZGF0YSBvdXRwdXQgdmFsdWUuCisgICovCitfX3dlYWsgdWludDMyX3QgSEFMX0RBQ19HZXRWYWx1ZShEQUNfSGFuZGxlVHlwZURlZiogaGRhYywgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGRhYyk7CisgIFVOVVNFRChDaGFubmVsKTsKKworICAvKiBOb3RlIDogVGhpcyBmdW5jdGlvbiBpcyBkZWZpbmVkIGludG8gdGhpcyBmaWxlIGZvciBsaWJyYXJ5IHJlZmVyZW5jZSAqLworICAvKiAgICAgICAgRnVuY3Rpb24gY29udGVudCBpcyBsb2NhdGVkIGludG8gZmlsZSBzdG0zMmYzeHhfaGFsX2RhY19leC5jICAqLworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm5zIHRoZSBsYXN0IGRhdGEgb3V0cHV0IHZhbHVlIG9mIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4KKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHJldHZhbCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgZGF0YSBvdXRwdXQgdmFsdWUuCisgICovCitfX3dlYWsgdWludDMyX3QgSEFMX0RBQ0V4X0R1YWxHZXRWYWx1ZShEQUNfSGFuZGxlVHlwZURlZiogaGRhYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGRhYyk7CisKKyAgLyogTm90ZSA6IFRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCBpbnRvIHRoaXMgZmlsZSBmb3IgbGlicmFyeSByZWZlcmVuY2UgKi8KKyAgLyogICAgICAgIEZ1bmN0aW9uIGNvbnRlbnQgaXMgbG9jYXRlZCBpbnRvIGZpbGUgc3RtMzJmM3h4X2hhbF9kYWNfZXguYyAgKi8KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisgIAorLyoqIEBkZWZncm91cCBEQUNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgCisgKgorQHZlcmJhdGltICAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIENvbmZpZ3VyZSBjaGFubmVscy4gCisgICAgICAoKykgQ29uZmlndXJlIFRyaWFuZ2xlIHdhdmUgZ2VuZXJhdGlvbi4KKyAgICAgICgrKSBDb25maWd1cmUgTm9pc2Ugd2F2ZSBnZW5lcmF0aW9uLgorICAgICAgKCspIFNldCB0aGUgc3BlY2lmaWVkIGRhdGEgaG9sZGluZyByZWdpc3RlciB2YWx1ZSBmb3IgREFDIGNoYW5uZWwuCisgICAgICAoKykgU2V0IHRoZSBzcGVjaWZpZWQgZGF0YSBob2xkaW5nIHJlZ2lzdGVyIHZhbHVlIGZvciBEdWFsIERBQyBjaGFubmVscy4KKyAgICAgIAorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4KKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHBhcmFtICBzQ29uZmlnIERBQyBjb25maWd1cmF0aW9uIHN0cnVjdHVyZS4KKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLiAKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBEQUNfQ0hBTk5FTF8xOiBEQUMxIENoYW5uZWwxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzI6IERBQzEgQ2hhbm5lbDIgc2VsZWN0ZWQgIAorICAqICAgICAgICAgICAgQGFyZyBEQUNfQ0hBTk5FTF8xOiBEQUMyIENoYW5uZWwxIHNlbGVjdGVkIAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworCitfX3dlYWsgSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ19Db25maWdDaGFubmVsKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjLCBEQUNfQ2hhbm5lbENvbmZUeXBlRGVmKiBzQ29uZmlnLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoZGFjKTsKKyAgVU5VU0VEKHNDb25maWcpOworICBVTlVTRUQoQ2hhbm5lbCk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCitfX3dlYWsgSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ19TZXRWYWx1ZShEQUNfSGFuZGxlVHlwZURlZiogaGRhYywgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgQWxpZ25tZW50LCB1aW50MzJfdCBEYXRhKQoreyAKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGRhYyk7CisgIFVOVVNFRChDaGFubmVsKTsKKyAgVU5VU0VEKEFsaWdubWVudCk7CisgIFVOVVNFRChEYXRhKTsKKworICAvKiBOb3RlIDogVGhpcyBmdW5jdGlvbiBpcyBkZWZpbmVkIGludG8gdGhpcyBmaWxlIGZvciBsaWJyYXJ5IHJlZmVyZW5jZSAqLworICAvKiAgICAgICAgRnVuY3Rpb24gY29udGVudCBpcyBsb2NhdGVkIGludG8gZmlsZSBzdG0zMmYzeHhfaGFsX2RhY19leC5jICAqLworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9FUlJPUjsKK30KKworX193ZWFrIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNFeF9EdWFsU2V0VmFsdWUoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMsIHVpbnQzMl90IEFsaWdubWVudCwgdWludDMyX3QgRGF0YTEsIHVpbnQzMl90IERhdGEyKQoreyAKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGRhYyk7CisgIFVOVVNFRChBbGlnbm1lbnQpOworICBVTlVTRUQoRGF0YTEpOworICBVTlVTRUQoRGF0YTIpOworCisgIC8qIE5vdGUgOiBUaGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQgaW50byB0aGlzIGZpbGUgZm9yIGxpYnJhcnkgcmVmZXJlbmNlICovCisgIC8qICAgICAgICBGdW5jdGlvbiBjb250ZW50IGlzIGxvY2F0ZWQgaW50byBmaWxlIHN0bTMyZjN4eF9oYWxfZGFjX2V4LmMgICovCisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX0VSUk9SOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERBQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucworICogIEBicmllZiAgIERBQyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMgCisgKgorQHZlcmJhdGltICAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgIyMjIyMgREFDIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvCisgICAgICAoKykgQ2hlY2sgdGhlIERBQyBzdGF0ZS4KKyAgICAgICgrKSBDaGVjayB0aGUgREFDIEVycm9ycy4KKworICAgICAgICAKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgcmV0dXJuIHRoZSBEQUMgaGFuZGxlIHN0YXRlCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfREFDX1N0YXRlVHlwZURlZiBIQUxfREFDX0dldFN0YXRlKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjKQoreworICAvKiBSZXR1cm4gREFDIGhhbmRsZSBzdGF0ZSAqLworICByZXR1cm4gaGRhYy0+U3RhdGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBEQUMgZXJyb3IgY29kZQorICAqIEBwYXJhbSAgaGRhYyBwb2ludGVyIHRvIGEgREFDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERBQy4KKyAgKiBAcmV0dmFsIERBQyBFcnJvciBDb2RlCisgICovCit1aW50MzJfdCBIQUxfREFDX0dldEVycm9yKERBQ19IYW5kbGVUeXBlRGVmICpoZGFjKQoreworICByZXR1cm4gaGRhYy0+RXJyb3JDb2RlOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgREFDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSW5wdXQgYW5kIE91dHB1dCBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrIGluIG5vbiBibG9ja2luZyBtb2RlIGZvciBDaGFubmVsMSAKKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfREFDX0NvbnZDcGx0Q2FsbGJhY2tDaDEoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhkYWMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfREFDX0NvbnZDcGx0Q2FsbGJhY2sxIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgQ29udmVyc2lvbiBoYWxmIERNQSB0cmFuc2ZlciBjYWxsYmFjayBpbiBub24gYmxvY2tpbmcgbW9kZSBmb3IgQ2hhbm5lbDEgCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0RBQ19Db252SGFsZkNwbHRDYWxsYmFja0NoMShEQUNfSGFuZGxlVHlwZURlZiogaGRhYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGRhYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9EQUNfQ29udkhhbGZDcGx0Q2FsbGJhY2tDaDEgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBFcnJvciBEQUMgY2FsbGJhY2sgZm9yIENoYW5uZWwxLgorICAqIEBwYXJhbSAgaGRhYyBwb2ludGVyIHRvIGEgREFDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERBQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9EQUNfRXJyb3JDYWxsYmFja0NoMShEQUNfSGFuZGxlVHlwZURlZiAqaGRhYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGRhYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9EQUNfRXJyb3JDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisKKy8qKgorICAqIEBicmllZiAgRE1BIHVuZGVycnVuIERBQyBjYWxsYmFjayBmb3IgQ2hhbm5lbDEuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0RBQ19ETUFVbmRlcnJ1bkNhbGxiYWNrQ2gxKERBQ19IYW5kbGVUeXBlRGVmICpoZGFjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoZGFjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0RBQ19ETUFVbmRlcnJ1bkNhbGxiYWNrQ2gxIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfREFDX01PRFVMRV9FTkFCTEVEICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmM3h4X2hhbF9kYWNfZXguYyBiL1NyYy9zdG0zMmYzeHhfaGFsX2RhY19leC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MzZjZDIKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJmM3h4X2hhbF9kYWNfZXguYwpAQCAtMCwwICsxLDExNDQgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX2RhY19leC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBEQUNFeCBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZXh0ZW5kZWQgCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBEQUMgcGVyaXBoZXJhbC4gIAorICAqICAgICAKKyAgKgorICBAdmVyYmF0aW0gICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICAgICAgICAgIAorICAgICAgKCspIFdoZW4gRHVhbCBtb2RlIGlzIGVuYWJsZWQgKGkuZS4gREFDIENoYW5uZWwxIGFuZCBDaGFubmVsMiBhcmUgdXNlZCBzaW11bHRhbmVvdXNseSkgOgorICAgICAgICAgIFVzZSBIQUxfREFDRXhfRHVhbEdldFZhbHVlKCkgdG8gZ2V0IGRpZ2l0YWwgZGF0YSB0byBiZSBjb252ZXJ0ZWQgYW5kIHVzZQorICAgICAgICAgIEhBTF9EQUNFeF9EdWFsU2V0VmFsdWUoKSB0byBzZXQgZGlnaXRhbCB2YWx1ZSB0byBjb252ZXJ0ZWQgc2ltdWx0YW5lb3VzbHkgaW4gQ2hhbm5lbCAxIGFuZCBDaGFubmVsIDIuICAKKyAgICAgICgrKSBVc2UgSEFMX0RBQ0V4X1RyaWFuZ2xlV2F2ZUdlbmVyYXRlKCkgdG8gZ2VuZXJhdGUgVHJpYW5nbGUgc2lnbmFsLgorICAgICAgKCspIFVzZSBIQUxfREFDRXhfTm9pc2VXYXZlR2VuZXJhdGUoKSB0byBnZW5lcmF0ZSBOb2lzZSBzaWduYWwuCisKKyBAZW5kdmVyYmF0aW0gICAgCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX0RBQ19NT0RVTEVfRU5BQkxFRAorCisvKiogQGRlZmdyb3VwIERBQ0V4IERBQ0V4CisgICogQGJyaWVmIERBQyBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBEQUNFeF9Qcml2YXRlX0Z1bmN0aW9ucyBEQUNFeCBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCitzdGF0aWMgdm9pZCBEQUNfRE1BQ29udkNwbHRDaDEoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgREFDX0RNQUVycm9yQ2gxKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIERBQ19ETUFIYWxmQ29udkNwbHRDaDEoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOyAKKworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSAgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpIAorLyogREFDIGNoYW5uZWwgMiBpcyBhdmFpbGFibGUgb24gdG9wIG9mIERBQyBjaGFubmVsIDFVICovCitzdGF0aWMgdm9pZCBEQUNfRE1BQ29udkNwbHRDaDIoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgREFDX0RNQUVycm9yQ2gyKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIERBQ19ETUFIYWxmQ29udkNwbHRDaDIoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOyAKKyNlbmRpZiAvKiBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCAgICAgICAgICAgICAgICB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4ICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAgICAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIERBQ0V4X0V4cG9ydGVkX0Z1bmN0aW9ucyBEQUNFeCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIERBQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgREFDRXggUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICogIEBicmllZiAgIAlQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zIAorICoKK0B2ZXJiYXRpbSAgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBTZXQgdGhlIHNwZWNpZmllZCBkYXRhIGhvbGRpbmcgcmVnaXN0ZXIgdmFsdWUgZm9yIERBQyBjaGFubmVsLgorICAgICAgKCspIFNldCB0aGUgc3BlY2lmaWVkIGRhdGEgaG9sZGluZyByZWdpc3RlciB2YWx1ZSBmb3IgZHVhbCBEQUMgY2hhbm5lbAorCSAgICAgICh3aGVuIERBQyBjaGFubmVsIDIgaXMgcHJlc2VudCBpbiBEQUMgMVUpCisgICAgICAKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBzcGVjaWZpZWQgZGF0YSBob2xkaW5nIHJlZ2lzdGVyIHZhbHVlIGZvciBEQUMgY2hhbm5lbC4KKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHBhcmFtICBDaGFubmVsIFRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4gCisgICogQHBhcmFtICBBbGlnbm1lbnQgU3BlY2lmaWVzIHRoZSBkYXRhIGFsaWdubWVudCBmb3IgREFDIGNoYW5uZWwuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0FMSUdOXzhCX1I6IDhiaXQgcmlnaHQgZGF0YSBhbGlnbm1lbnQgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0FMSUdOXzEyQl9MOiAxMmJpdCBsZWZ0IGRhdGEgYWxpZ25tZW50IHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIERBQ19BTElHTl8xMkJfUjogMTJiaXQgcmlnaHQgZGF0YSBhbGlnbm1lbnQgc2VsZWN0ZWQKKyAgKiBAcGFyYW0gIERhdGEgRGF0YSB0byBiZSBsb2FkZWQgaW4gdGhlIHNlbGVjdGVkIGRhdGEgaG9sZGluZyByZWdpc3Rlci4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNfU2V0VmFsdWUoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IEFsaWdubWVudCwgdWludDMyX3QgRGF0YSkKK3sgIAorICBfX0lPIHVpbnQzMl90IHRtcCA9IDBVOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19DSEFOTkVMKENoYW5uZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19BTElHTihBbGlnbm1lbnQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19EQVRBKERhdGEpKTsKKyAgIAorICB0bXAgPSAodWludDMyX3QpIChoZGFjLT5JbnN0YW5jZSk7CisKKy8qIERBQyAxIGhhcyAxIG9yIDIgY2hhbm5lbHMgLSBubyBEQUMyICovCisvKiBEQUMgMSBoYXMgMiBjaGFubmVscyAxVSAmIDJVIC0gREFDIDIgaGFzIG9uZSBjaGFubmVsIDFVICovCisKKyAgaWYoQ2hhbm5lbCA9PSBEQUNfQ0hBTk5FTF8xKQorICB7CisgICAgdG1wICs9IERBQ19ESFIxMlIxX0FMSUdOTUVOVChBbGlnbm1lbnQpOworICB9CisjaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKyAgZWxzZSAvKiBjaGFubmVsID0gREFDX0NIQU5ORUxfMiAgKi8KKyAgeworICAgIHRtcCArPSBEQUNfREhSMTJSMl9BTElHTk1FTlQoQWxpZ25tZW50KTsKKyAgfQorI2VuZGlmIC8qIFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4ICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICAgICAgICAgICAgICAgICAgICovCisKKyAgLyogU2V0IHRoZSBEQUMgY2hhbm5lbDEgc2VsZWN0ZWQgZGF0YSBob2xkaW5nIHJlZ2lzdGVyICovCisgICooX19JTyB1aW50MzJfdCAqKSB0bXAgPSBEYXRhOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisjaWYgIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisvKiBEQUMgY2hhbm5lbCAyIGlzIHByZXNlbnQgaW4gREFDIDFVICovCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgc3BlY2lmaWVkIGRhdGEgaG9sZGluZyByZWdpc3RlciB2YWx1ZSBmb3IgZHVhbCBEQUMgY2hhbm5lbC4KKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHBhcmFtICBBbGlnbm1lbnQgU3BlY2lmaWVzIHRoZSBkYXRhIGFsaWdubWVudCBmb3IgZHVhbCBjaGFubmVsIERBQy4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBEQUNfQUxJR05fOEJfUjogOGJpdCByaWdodCBkYXRhIGFsaWdubWVudCBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBEQUNfQUxJR05fMTJCX0w6IDEyYml0IGxlZnQgZGF0YSBhbGlnbm1lbnQgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0FMSUdOXzEyQl9SOiAxMmJpdCByaWdodCBkYXRhIGFsaWdubWVudCBzZWxlY3RlZAorICAqIEBwYXJhbSAgRGF0YTI6IERhdGEgZm9yIERBQyBDaGFubmVsMiB0byBiZSBsb2FkZWQgaW4gdGhlIHNlbGVjdGVkIGRhdGEgaG9sZGluZyByZWdpc3Rlci4KKyAgKiBAcGFyYW0gIERhdGExOiBEYXRhIGZvciBEQUMgQ2hhbm5lbDEgdG8gYmUgbG9hZGVkIGluIHRoZSBzZWxlY3RlZCBkYXRhICBob2xkaW5nIHJlZ2lzdGVyLgorICAqIEBub3RlICAgSW4gZHVhbCBtb2RlLCBhIHVuaXF1ZSByZWdpc3RlciBhY2Nlc3MgaXMgcmVxdWlyZWQgdG8gd3JpdGUgaW4gYm90aAorICAqICAgICAgICAgIERBQyBjaGFubmVscyBhdCB0aGUgc2FtZSB0aW1lLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ0V4X0R1YWxTZXRWYWx1ZShEQUNfSGFuZGxlVHlwZURlZiogaGRhYywgdWludDMyX3QgQWxpZ25tZW50LCB1aW50MzJfdCBEYXRhMSwgdWludDMyX3QgRGF0YTIpCit7CisgIHVpbnQzMl90IGRhdGEgPSAwVSwgdG1wID0gMFU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19BTElHTihBbGlnbm1lbnQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19EQVRBKERhdGExKSk7CisgIGFzc2VydF9wYXJhbShJU19EQUNfREFUQShEYXRhMikpOworCisgIC8qIENhbGN1bGF0ZSBhbmQgc2V0IGR1YWwgREFDIGRhdGEgaG9sZGluZyByZWdpc3RlciB2YWx1ZSAqLworICBpZiAoQWxpZ25tZW50ID09IERBQ19BTElHTl84Ql9SKQorICB7CisgICAgZGF0YSA9ICgodWludDMyX3QpRGF0YTIgPDwgOFUpIHwgRGF0YTE7CisgIH0KKyAgZWxzZQorICB7CisgICAgZGF0YSA9ICgodWludDMyX3QpRGF0YTIgPDwgMTZVKSB8IERhdGExOworICB9CisKKyAgICB0bXAgPSAodWludDMyX3QpIChoZGFjLT5JbnN0YW5jZSk7CisgICAgdG1wICs9IERBQ19ESFIxMlJEX0FMSUdOTUVOVChBbGlnbm1lbnQpOworCisgIC8qIFNldCB0aGUgZHVhbCBEQUMgc2VsZWN0ZWQgZGF0YSBob2xkaW5nIHJlZ2lzdGVyICovCisgICooX19JTyB1aW50MzJfdCAqKXRtcCA9IGRhdGE7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorI2VuZGlmIC8qIFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4ICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICAgICAgICAgICAgICAgICAgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBEQUNFeCBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAKKyAqCitAdmVyYmF0aW0gICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgU3RhcnQgY29udmVyc2lvbi4KKyAgICAgICgrKSBTdGFydCBjb252ZXJzaW9uIGFuZCBlbmFibGUgRE1BIHRyYW5zZmVyLgorICAgICAgKCspIEdldCByZXN1bHQgb2YgY29udmVyc2lvbi4KKyAgICAgICgrKSBIYW5kbGUgREFDIElSUSdzLgorICAgICAgKCspIEdlbmVyYXRlIHRyaWFuZ3VsYXItd2F2ZSAgICAgICAgICAgICAgICAgICAKKyAgICAgICgrKSBHZW5lcmF0ZSBub2lzZS13YXZlCisJICAoKykgQ2FsbGJhY2sgZnVuY3Rpb25zIGZvciBEQUMxIENoYW5uZWwyICh3aGVuIHN1cHBvcnRlZCkKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKyNpZiAgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgICBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSAgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpIHx8IFwKKyAgICAgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKworLyogREFDIDEgaGFzIDIgY2hhbm5lbHMgMVUgJiAyVSAtIERBQyAyIGhhcyBvbmUgY2hhbm5lbCAxVSAqLworLyoqCisgICogQGJyaWVmICBFbmFibGVzIERBQyBhbmQgc3RhcnRzIGNvbnZlcnNpb24gb2YgY2hhbm5lbC4KKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHBhcmFtICBDaGFubmVsIFRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4gCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0NIQU5ORUxfMTogREFDMSBDaGFubmVsMSBvciBEQUMyIENoYW5uZWwxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzI6IERBQzEgQ2hhbm5lbDIgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNfU3RhcnQoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19EQUNfQ0hBTk5FTF9JTlNUQU5DRShoZGFjLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworICAKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoZGFjKTsKKyAgCisgIC8qIENoYW5nZSBEQUMgc3RhdGUgKi8KKyAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX0JVU1k7CisgIAorICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfREFDX0VOQUJMRShoZGFjLCBDaGFubmVsKTsKKyAgCisgIGlmKENoYW5uZWwgPT0gREFDX0NIQU5ORUxfMSkKKyAgeworICAgIC8qIENoZWNrIGlmIHNvZnR3YXJlIHRyaWdnZXIgZW5hYmxlZCAqLworICAgIGlmKChoZGFjLT5JbnN0YW5jZS0+Q1IgJiAoREFDX0NSX1RFTjEgfCBEQUNfQ1JfVFNFTDEpKSA9PSAoREFDX0NSX1RFTjEgfCBEQUNfQ1JfVFNFTDEpKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgREFDIHNvZnR3YXJlIGNvbnZlcnNpb24gKi8KKyAgICAgIFNFVF9CSVQoaGRhYy0+SW5zdGFuY2UtPlNXVFJJR1IsIERBQ19TV1RSSUdSX1NXVFJJRzEpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDaGVjayBpZiBzb2Z0d2FyZSB0cmlnZ2VyIGVuYWJsZWQgKi8KKyAgICBpZigoaGRhYy0+SW5zdGFuY2UtPkNSICYgKERBQ19DUl9URU4yIHwgREFDX0NSX1RTRUwyKSkgPT0gKERBQ19DUl9URU4yIHwgREFDX0NSX1RTRUwyKSkKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIERBQyBzb2Z0d2FyZSBjb252ZXJzaW9uICovCisgICAgICBTRVRfQklUKGhkYWMtPkluc3RhbmNlLT5TV1RSSUdSLCBEQUNfU1dUUklHUl9TV1RSSUcyKTsKKyAgICB9CisgIH0KKyAgCisgIC8qIENoYW5nZSBEQUMgc3RhdGUgKi8KKyAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX1JFQURZOworICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGRhYyk7CisgICAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKyNlbmRpZiAvKiBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCAgICAgICAgICAgICAgICB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4ICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAgICAgICAgICAgICAgICAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorLyogREFDIDEgaGFzIDEgY2hhbm5lbHMgMVUgKi8KKy8qKgorICAqIEBicmllZiAgRW5hYmxlcyBEQUMgYW5kIHN0YXJ0cyBjb252ZXJzaW9uIG9mIGNoYW5uZWwuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuIAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzE6IERBQzEgQ2hhbm5lbDEgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMgCisgICovCisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNfU3RhcnQoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19EQUNfQ0hBTk5FTF9JTlNUQU5DRShoZGFjLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworICAKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoZGFjKTsKKyAgCisgIC8qIENoYW5nZSBEQUMgc3RhdGUgKi8KKyAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX0JVU1k7CisgIAorICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfREFDX0VOQUJMRShoZGFjLCBDaGFubmVsKTsKKyAgCisgIC8qIENoZWNrIGlmIHNvZnR3YXJlIHRyaWdnZXIgZW5hYmxlZCAqLworICBpZigoaGRhYy0+SW5zdGFuY2UtPkNSICYgKERBQ19DUl9URU4xIHwgREFDX0NSX1RTRUwxKSkgPT0gKERBQ19DUl9URU4xIHwgREFDX0NSX1RTRUwxKSkKKyAgeworICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgREFDIHNvZnR3YXJlIGNvbnZlcnNpb24gKi8KKyAgICBTRVRfQklUKGhkYWMtPkluc3RhbmNlLT5TV1RSSUdSLCBEQUNfU1dUUklHUl9TV1RSSUcxKTsKKyAgfQorICAKKyAgLyogQ2hhbmdlIERBQyBzdGF0ZSAqLworICBoZGFjLT5TdGF0ZSA9IEhBTF9EQUNfU1RBVEVfUkVBRFk7CisgIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoZGFjKTsKKyAgICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworCisvKiBEQUMgMSBoYXMgMiBjaGFubmVscyAxVSAmIDJVIC0gREFDIDIgaGFzIG9uZSBjaGFubmVsIDFVICovCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKy8qIERBQyAxIGhhcyAyIGNoYW5uZWxzIDFVICYgMlUgKi8KKy8qKgorICAqIEBicmllZiAgRW5hYmxlcyBEQUMgYW5kIHN0YXJ0cyBjb252ZXJzaW9uIG9mIGNoYW5uZWwuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuIAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzE6IERBQzEgQ2hhbm5lbDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0NIQU5ORUxfMjogREFDMSBDaGFubmVsMiBzZWxlY3RlZAorICAqIEBwYXJhbSAgcERhdGEgVGhlIGRlc3RpbmF0aW9uIHBlcmlwaGVyYWwgQnVmZmVyIGFkZHJlc3MuCisgICogQHBhcmFtICBMZW5ndGggVGhlIGxlbmd0aCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gbWVtb3J5IHRvIERBQyBwZXJpcGhlcmFsCisgICogQHBhcmFtICBBbGlnbm1lbnQgU3BlY2lmaWVzIHRoZSBkYXRhIGFsaWdubWVudCBmb3IgREFDIGNoYW5uZWwuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0FMSUdOXzhCX1I6IDhiaXQgcmlnaHQgZGF0YSBhbGlnbm1lbnQgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0FMSUdOXzEyQl9MOiAxMmJpdCBsZWZ0IGRhdGEgYWxpZ25tZW50IHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIERBQ19BTElHTl8xMkJfUjogMTJiaXQgcmlnaHQgZGF0YSBhbGlnbm1lbnQgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNfU3RhcnRfRE1BKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjLCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCogcERhdGEsIHVpbnQzMl90IExlbmd0aCwgdWludDMyX3QgQWxpZ25tZW50KQoreworICB1aW50MzJfdCB0bXByZWcgPSAwVTsKKyAgICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19DSEFOTkVMX0lOU1RBTkNFKGhkYWMtPkluc3RhbmNlLCBDaGFubmVsKSk7CisgIGFzc2VydF9wYXJhbShJU19EQUNfQUxJR04oQWxpZ25tZW50KSk7CisgIAorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhkYWMpOworICAKKyAgLyogQ2hhbmdlIERBQyBzdGF0ZSAqLworICBoZGFjLT5TdGF0ZSA9IEhBTF9EQUNfU1RBVEVfQlVTWTsKKworICBpZihDaGFubmVsID09IERBQ19DSEFOTkVMXzEpCisgIHsKKyAgICAvKiBTZXQgdGhlIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayBmb3IgY2hhbm5lbDEgKi8KKyAgICBoZGFjLT5ETUFfSGFuZGxlMS0+WGZlckNwbHRDYWxsYmFjayA9IERBQ19ETUFDb252Q3BsdENoMTsKKyAgICAKKyAgICAvKiBTZXQgdGhlIERNQSBoYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrIGZvciBjaGFubmVsMSAqLworICAgIGhkYWMtPkRNQV9IYW5kbGUxLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IERBQ19ETUFIYWxmQ29udkNwbHRDaDE7CisgICAgICAKKyAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayBmb3IgY2hhbm5lbDEgKi8KKyAgICBoZGFjLT5ETUFfSGFuZGxlMS0+WGZlckVycm9yQ2FsbGJhY2sgPSBEQUNfRE1BRXJyb3JDaDE7CisKKyAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsMSBETUEgcmVxdWVzdCAqLworICAgIFNFVF9CSVQoaGRhYy0+SW5zdGFuY2UtPkNSLCBEQUNfQ1JfRE1BRU4xKTsgICAKKworICAgIC8qIENhc2Ugb2YgdXNlIG9mIGNoYW5uZWwgMVUgKi8KKyAgICBzd2l0Y2goQWxpZ25tZW50KQorICAgIHsKKyAgICAgIGNhc2UgREFDX0FMSUdOXzEyQl9SOgorICAgICAgICAvKiBHZXQgREhSMTJSMSBhZGRyZXNzICovCisgICAgICAgIHRtcHJlZyA9ICh1aW50MzJfdCkmaGRhYy0+SW5zdGFuY2UtPkRIUjEyUjE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBEQUNfQUxJR05fMTJCX0w6CisgICAgICAgIC8qIEdldCBESFIxMkwxIGFkZHJlc3MgKi8KKyAgICAgICAgdG1wcmVnID0gKHVpbnQzMl90KSZoZGFjLT5JbnN0YW5jZS0+REhSMTJMMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIERBQ19BTElHTl84Ql9SOgorICAgICAgICAvKiBHZXQgREhSOFIxIGFkZHJlc3MgKi8KKyAgICAgICAgdG1wcmVnID0gKHVpbnQzMl90KSZoZGFjLT5JbnN0YW5jZS0+REhSOFIxOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBTZXQgdGhlIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayBmb3IgY2hhbm5lbDIgKi8KKyAgICBoZGFjLT5ETUFfSGFuZGxlMi0+WGZlckNwbHRDYWxsYmFjayA9IERBQ19ETUFDb252Q3BsdENoMjsKKyAgICAKKyAgICAvKiBTZXQgdGhlIERNQSBoYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrIGZvciBjaGFubmVsMiAqLworICAgIGhkYWMtPkRNQV9IYW5kbGUyLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IERBQ19ETUFIYWxmQ29udkNwbHRDaDI7CisgICAgICAgCisgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgZm9yIGNoYW5uZWwyICovCisgICAgaGRhYy0+RE1BX0hhbmRsZTItPlhmZXJFcnJvckNhbGxiYWNrID0gREFDX0RNQUVycm9yQ2gyOworIAorICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwyIERNQSByZXF1ZXN0ICovCisgICAgU0VUX0JJVChoZGFjLT5JbnN0YW5jZS0+Q1IsIERBQ19DUl9ETUFFTjIpOyAKKyAgIAorICAgIC8qIENhc2Ugb2YgdXNlIG9mIGNoYW5uZWwgMlUgKi8KKyAgICBzd2l0Y2goQWxpZ25tZW50KQorICAgIHsKKyAgICAgIGNhc2UgREFDX0FMSUdOXzEyQl9SOgorICAgICAgICAvKiBHZXQgREhSMTJSMiBhZGRyZXNzICovCisgICAgICAgIHRtcHJlZyA9ICh1aW50MzJfdCkmaGRhYy0+SW5zdGFuY2UtPkRIUjEyUjI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBEQUNfQUxJR05fMTJCX0w6CisgICAgICAgIC8qIEdldCBESFIxMkwyIGFkZHJlc3MgKi8KKyAgICAgICAgdG1wcmVnID0gKHVpbnQzMl90KSZoZGFjLT5JbnN0YW5jZS0+REhSMTJMMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIERBQ19BTElHTl84Ql9SOgorICAgICAgICAvKiBHZXQgREhSOFIyIGFkZHJlc3MgKi8KKyAgICAgICAgdG1wcmVnID0gKHVpbnQzMl90KSZoZGFjLT5JbnN0YW5jZS0+REhSOFIyOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorIAorICAvKiBFbmFibGUgdGhlIERNQSBDaGFubmVsICovCisgIGlmKENoYW5uZWwgPT0gREFDX0NIQU5ORUxfMSkKKyAgeworICAgIC8qIEVuYWJsZSB0aGUgREFDIERNQSB1bmRlcnJ1biBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9EQUNfRU5BQkxFX0lUKGhkYWMsIERBQ19JVF9ETUFVRFIxKTsKKworICAgIC8qIEVuYWJsZSB0aGUgRE1BIENoYW5uZWwgKi8KKyAgICBIQUxfRE1BX1N0YXJ0X0lUKGhkYWMtPkRNQV9IYW5kbGUxLCAodWludDMyX3QpcERhdGEsIHRtcHJlZywgTGVuZ3RoKTsKKyAgfSAKKyAgZWxzZQorICB7CisgICAgLyogRW5hYmxlIHRoZSBEQUMgRE1BIHVuZGVycnVuIGludGVycnVwdCAqLworICAgIF9fSEFMX0RBQ19FTkFCTEVfSVQoaGRhYywgREFDX0lUX0RNQVVEUjIpOworCisgICAgLyogRW5hYmxlIHRoZSBETUEgQ2hhbm5lbCAqLworICAgIEhBTF9ETUFfU3RhcnRfSVQoaGRhYy0+RE1BX0hhbmRsZTIsICh1aW50MzJfdClwRGF0YSwgdG1wcmVnLCBMZW5ndGgpOworICB9CisgCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhkYWMpOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9EQUNfRU5BQkxFKGhkYWMsIENoYW5uZWwpOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorI2VuZGlmIC8qIFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4ICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICAgICAgICAgICAgICAgICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisvKiBEQUMgMSBoYXMgMSBjaGFubmVsIChjaGFubmVsIDFVKSAgKi8KKy8qKgorICAqIEBicmllZiAgRW5hYmxlcyBEQUMgYW5kIHN0YXJ0cyBjb252ZXJzaW9uIG9mIGNoYW5uZWwuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuIAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzE6IERBQzEgQ2hhbm5lbDEgc2VsZWN0ZWQKKyAgKiBAcGFyYW0gIHBEYXRhIFRoZSBkZXN0aW5hdGlvbiBwZXJpcGhlcmFsIEJ1ZmZlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIG1lbW9yeSB0byBEQUMgcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgQWxpZ25tZW50IFNwZWNpZmllcyB0aGUgZGF0YSBhbGlnbm1lbnQgZm9yIERBQyBjaGFubmVsLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19BTElHTl84Ql9SOiA4Yml0IHJpZ2h0IGRhdGEgYWxpZ25tZW50IHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIERBQ19BTElHTl8xMkJfTDogMTJiaXQgbGVmdCBkYXRhIGFsaWdubWVudCBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBEQUNfQUxJR05fMTJCX1I6IDEyYml0IHJpZ2h0IGRhdGEgYWxpZ25tZW50IHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfREFDX1N0YXJ0X0RNQShEQUNfSGFuZGxlVHlwZURlZiogaGRhYywgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QqIHBEYXRhLCB1aW50MzJfdCBMZW5ndGgsIHVpbnQzMl90IEFsaWdubWVudCkKK3sKKyAgdWludDMyX3QgdG1wcmVnID0gMFU7CisgICAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19EQUNfQ0hBTk5FTF9JTlNUQU5DRShoZGFjLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworICBhc3NlcnRfcGFyYW0oSVNfREFDX0FMSUdOKEFsaWdubWVudCkpOworICAKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoZGFjKTsKKyAgCisgIC8qIENoYW5nZSBEQUMgc3RhdGUgKi8KKyAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX0JVU1k7CisgICAgCisgIC8qIFNldCB0aGUgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrIGZvciBjaGFubmVsMSAqLworICBoZGFjLT5ETUFfSGFuZGxlMS0+WGZlckNwbHRDYWxsYmFjayA9IERBQ19ETUFDb252Q3BsdENoMTsKKyAgCisgIC8qIFNldCB0aGUgRE1BIGhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgZm9yIGNoYW5uZWwxICovCisgIGhkYWMtPkRNQV9IYW5kbGUxLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IERBQ19ETUFIYWxmQ29udkNwbHRDaDE7CisgICAgCisgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrIGZvciBjaGFubmVsMSAqLworICBoZGFjLT5ETUFfSGFuZGxlMS0+WGZlckVycm9yQ2FsbGJhY2sgPSBEQUNfRE1BRXJyb3JDaDE7CisKKyAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbDEgRE1BIHJlcXVlc3QgKi8KKyAgU0VUX0JJVChoZGFjLT5JbnN0YW5jZS0+Q1IsIERBQ19DUl9ETUFFTjEpOworICAgIAorICAvKiBDYXNlIG9mIHVzZSBvZiBjaGFubmVsIDFVICovCisgIHN3aXRjaChBbGlnbm1lbnQpCisgIHsKKyAgICBjYXNlIERBQ19BTElHTl8xMkJfUjoKKyAgICAgIC8qIEdldCBESFIxMlIxIGFkZHJlc3MgKi8KKyAgICAgIHRtcHJlZyA9ICh1aW50MzJfdCkmaGRhYy0+SW5zdGFuY2UtPkRIUjEyUjE7CisgICAgICBicmVhazsKKyAgICBjYXNlIERBQ19BTElHTl8xMkJfTDoKKyAgICAgIC8qIEdldCBESFIxMkwxIGFkZHJlc3MgKi8KKyAgICAgIHRtcHJlZyA9ICh1aW50MzJfdCkmaGRhYy0+SW5zdGFuY2UtPkRIUjEyTDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIERBQ19BTElHTl84Ql9SOgorICAgICAgLyogR2V0IERIUjhSMSBhZGRyZXNzICovCisgICAgICB0bXByZWcgPSAodWludDMyX3QpJmhkYWMtPkluc3RhbmNlLT5ESFI4UjE7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgCisgIC8qIEVuYWJsZSB0aGUgRE1BIENoYW5uZWwgKi8KKyAgLyogRW5hYmxlIHRoZSBEQUMgRE1BIHVuZGVycnVuIGludGVycnVwdCAqLworICBfX0hBTF9EQUNfRU5BQkxFX0lUKGhkYWMsIERBQ19JVF9ETUFVRFIxKTsKKworICAvKiBFbmFibGUgdGhlIERNQSBDaGFubmVsICovCisgIEhBTF9ETUFfU3RhcnRfSVQoaGRhYy0+RE1BX0hhbmRsZTEsICh1aW50MzJfdClwRGF0YSwgdG1wcmVnLCBMZW5ndGgpOworIAorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoZGFjKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfREFDX0VOQUJMRShoZGFjLCBDaGFubmVsKTsgCisgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggICAgKi8KKworLyogREFDIDEgaGFzIDIgY2hhbm5lbHMgMVUgJiAyVSAtIERBQyAyIGhhcyBvbmUgY2hhbm5lbCAxVSAqLworI2lmICBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSAgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgIGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkgfHwgXAorICAgICBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorLyogREFDIDEgaGFzIDIgY2hhbm5lbHMgMVUgJiAyVSAqLworLyoqCisgICogQGJyaWVmICBSZXR1cm5zIHRoZSBsYXN0IGRhdGEgb3V0cHV0IHZhbHVlIG9mIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4KKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHBhcmFtICBDaGFubmVsIFRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4gCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0NIQU5ORUxfMTogREFDMSBDaGFubmVsMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBEQUNfQ0hBTk5FTF8yOiBEQUMxIENoYW5uZWwyIHNlbGVjdGVkCisgICogQHJldHZhbCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgZGF0YSBvdXRwdXQgdmFsdWUuCisgICovCit1aW50MzJfdCBIQUxfREFDX0dldFZhbHVlKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfREFDX0NIQU5ORUxfSU5TVEFOQ0UoaGRhYy0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKyAgCisgIC8qIFJldHVybnMgdGhlIERBQyBjaGFubmVsIGRhdGEgb3V0cHV0IHJlZ2lzdGVyIHZhbHVlICovCisgIGlmKENoYW5uZWwgPT0gREFDX0NIQU5ORUxfMSkgCisgIHsKKyAgICByZXR1cm4gaGRhYy0+SW5zdGFuY2UtPkRPUjE7CisgIH0KKyAgZWxzZSAvKiBjaGFubmVsID0gREFDX0NIQU5ORUxfMiAgKi8KKyAgeworICAgIHJldHVybiBoZGFjLT5JbnN0YW5jZS0+RE9SMjsKKyAgfQorfQorI2VuZGlmIC8qIFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4ICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICAgICAgICAgICAgICAgICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisvKiBEQUMgMSBoYXMgMSBjaGFubmVsIChjaGFubmVsIDFVKSAgKi8KKy8qKgorICAqIEBicmllZiAgUmV0dXJucyB0aGUgbGFzdCBkYXRhIG91dHB1dCB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEBwYXJhbSAgY2hhbm5lbCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuIAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzE6IERBQzEgQ2hhbm5lbDEgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIFRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCBkYXRhIG91dHB1dCB2YWx1ZS4KKyAgKi8KK3VpbnQzMl90IEhBTF9EQUNfR2V0VmFsdWUoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19EQUNfQ0hBTk5FTF9JTlNUQU5DRShoZGFjLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworICAKKyAgLyogUmV0dXJucyB0aGUgREFDIGNoYW5uZWwgZGF0YSBvdXRwdXQgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgcmV0dXJuIGhkYWMtPkluc3RhbmNlLT5ET1IxOworfQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgbGFzdCBkYXRhIG91dHB1dCB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEByZXR2YWwgVGhlIHNlbGVjdGVkIERBQyBjaGFubmVsIGRhdGEgb3V0cHV0IHZhbHVlLgorICAqLwordWludDMyX3QgSEFMX0RBQ0V4X0R1YWxHZXRWYWx1ZShEQUNfSGFuZGxlVHlwZURlZiogaGRhYykKK3sKKyAgdWludDMyX3QgdG1wID0gMFU7CisKKyAgdG1wIHw9IGhkYWMtPkluc3RhbmNlLT5ET1IxOworCisjaWYgIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisvKiBEQUMgY2hhbm5lbCAyIGlzIHByZXNlbnQgaW4gREFDIDFVICovCisgIHRtcCB8PSBoZGFjLT5JbnN0YW5jZS0+RE9SMiA8PCAxNlU7CisjZW5kaWYgLyogU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAgICAgICAgICAgICAgICB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggICAgICAgICAgICAgICAgICAgKi8KKworICAvKiBSZXR1cm5zIHRoZSBEQUMgY2hhbm5lbCBkYXRhIG91dHB1dCByZWdpc3RlciB2YWx1ZSAqLworICByZXR1cm4gdG1wOworfQorCisjaWYgIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisvKiBEQUMgY2hhbm5lbCAyIGlzIGF2YWlsYWJsZSBvbiB0b3Agb2YgREFDIGNoYW5uZWwgMVUgKi8KKy8qKgorICAqIEBicmllZiAgSGFuZGxlcyBEQUMgaW50ZXJydXB0IHJlcXVlc3QKKyAgKiAgICAgICAgIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgaW50ZXJydXB0aW9uIG9mIERNQQorICAqICAgICAgICAgdW5kZXJydW4uICAKKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9EQUNfSVJRSGFuZGxlcihzdHJ1Y3QgX19EQUNfSGFuZGxlVHlwZURlZiogaGRhYykKK3sKKyAgaWYoX19IQUxfREFDX0dFVF9JVF9TT1VSQ0UoaGRhYywgREFDX0lUX0RNQVVEUjEpKQorICB7IAorICAgIC8qIENoZWNrIHVuZGVycnVuIGZsYWcgb2YgREFDIGNoYW5uZWwgMVUgKi8KKyAgICBpZihfX0hBTF9EQUNfR0VUX0ZMQUcoaGRhYywgREFDX0ZMQUdfRE1BVURSMSkpCisgICAgeworICAgICAgLyogQ2hhbmdlIERBQyBzdGF0ZSB0byBlcnJvciBzdGF0ZSAqLworICAgICAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX0VSUk9SOworICAgIAorICAgICAgLyogU2V0IERBQyBlcnJvciBjb2RlIHRvIGNoYW5lbDEgRE1BIHVuZGVycnVuIGVycm9yICovCisgICAgICBTRVRfQklUKGhkYWMtPkVycm9yQ29kZSwgSEFMX0RBQ19FUlJPUl9ETUFVTkRFUlJVTkNIMSk7CisgICAgICAgICAgCisgICAgICAvKiBDbGVhciB0aGUgdW5kZXJydW4gZmxhZyAqLworICAgICAgX19IQUxfREFDX0NMRUFSX0ZMQUcoaGRhYyxEQUNfRkxBR19ETUFVRFIxKTsKKyAgICAKKyAgICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsMSBETUEgcmVxdWVzdCAqLworICAgICAgQ0xFQVJfQklUKGhkYWMtPkluc3RhbmNlLT5DUiwgREFDX0NSX0RNQUVOMSk7CisgICAgCisgICAgICAvKiBFcnJvciBjYWxsYmFjayAqLyAKKyAgICAgIEhBTF9EQUNfRE1BVW5kZXJydW5DYWxsYmFja0NoMShoZGFjKTsKKyAgICB9CisgIH0KKyAgCisgIGlmKF9fSEFMX0RBQ19HRVRfSVRfU09VUkNFKGhkYWMsIERBQ19JVF9ETUFVRFIyKSkKKyAgeworICAgIC8qIENoZWNrIHVuZGVycnVuIGZsYWcgb2YgREFDIGNoYW5uZWwgMVUgKi8KKyAgICBpZiAoX19IQUxfREFDX0dFVF9GTEFHKGhkYWMsIERBQ19GTEFHX0RNQVVEUjIpKQorICAgIHsKKyAgICAgIC8qIENoYW5nZSBEQUMgc3RhdGUgdG8gZXJyb3Igc3RhdGUgKi8KKyAgICAgIGhkYWMtPlN0YXRlID0gSEFMX0RBQ19TVEFURV9FUlJPUjsKKyAgICAKKyAgICAgIC8qIFNldCBEQUMgZXJyb3IgY29kZSB0byBjaGFubmVsMiBETUEgdW5kZXJydW4gZXJyb3IgKi8KKyAgICAgIFNFVF9CSVQoaGRhYy0+RXJyb3JDb2RlLCBIQUxfREFDX0VSUk9SX0RNQVVOREVSUlVOQ0gyKTsKKyAgICAKKyAgICAgIC8qIENsZWFyIHRoZSB1bmRlcnJ1biBmbGFnICovCisgICAgICBfX0hBTF9EQUNfQ0xFQVJfRkxBRyhoZGFjLERBQ19GTEFHX0RNQVVEUjIpOworICAgIAorICAgICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwxIERNQSByZXF1ZXN0ICovCisgICAgICBDTEVBUl9CSVQoaGRhYy0+SW5zdGFuY2UtPkNSLCBEQUNfQ1JfRE1BRU4yKTsKKyAgIAorICAgICAgLyogRXJyb3IgY2FsbGJhY2sgKi8gCisgICAgICBIQUxfREFDRXhfRE1BVW5kZXJydW5DYWxsYmFja0NoMihoZGFjKTsKKyAgICB9CisgIH0KK30KKyNlbmRpZiAvKiBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCAgICAgICAgICAgICAgICB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4ICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAgICAgICAgICAgICAgICAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorLyogREFDIGNoYW5uZWwgMiBpcyBOT1QgYXZhaWxhYmxlLiBPbmx5IERBQyBjaGFubmVsIDEgaXMgYXZhaWxhYmxlICovCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZXMgREFDIGludGVycnVwdCByZXF1ZXN0CisgICogICAgICAgICBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGludGVycnVwdGlvbiBvZiBETUEKKyAgKiAgICAgICAgIHVuZGVycnVuLiAgCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfREFDX0lSUUhhbmRsZXIoc3RydWN0IF9fREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMpCit7CisgIGlmKF9fSEFMX0RBQ19HRVRfSVRfU09VUkNFKGhkYWMsIERBQ19JVF9ETUFVRFIxKSkKKyAgeyAgCisgICAgLyogQ2hlY2sgdW5kZXJydW4gZmxhZyBvZiBEQUMgY2hhbm5lbCAxVSAqLworICAgIGlmKF9fSEFMX0RBQ19HRVRfRkxBRyhoZGFjLCBEQUNfRkxBR19ETUFVRFIxKSkKKyAgICB7CisgICAgICAvKiBDaGFuZ2UgREFDIHN0YXRlIHRvIGVycm9yIHN0YXRlICovCisgICAgICBoZGFjLT5TdGF0ZSA9IEhBTF9EQUNfU1RBVEVfRVJST1I7CisgICAgCisgICAgICAvKiBTZXQgREFDIGVycm9yIGNvZGUgdG8gY2hhbmVsMSBETUEgdW5kZXJydW4gZXJyb3IgKi8KKyAgICAgIFNFVF9CSVQoaGRhYy0+RXJyb3JDb2RlLCBIQUxfREFDX0VSUk9SX0RNQVVOREVSUlVOQ0gxKTsKKyAgICAKKyAgICAgIC8qIENsZWFyIHRoZSB1bmRlcnJ1biBmbGFnICovCisgICAgICBfX0hBTF9EQUNfQ0xFQVJfRkxBRyhoZGFjLERBQ19GTEFHX0RNQVVEUjEpOworICAgIAorICAgICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwxIERNQSByZXF1ZXN0ICovCisgICAgICBDTEVBUl9CSVQoaGRhYy0+SW5zdGFuY2UtPkNSLCBEQUNfQ1JfRE1BRU4xKTsKKyAgICAKKyAgICAgIC8qIEVycm9yIGNhbGxiYWNrICovIAorICAgICAgSEFMX0RBQ19ETUFVbmRlcnJ1bkNhbGxiYWNrQ2gxKGhkYWMpOworICAgIH0KKyAgfQorfQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLgorICAqIEBwYXJhbSAgaGRhYyBwb2ludGVyIHRvIGEgREFDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERBQy4KKyAgKiBAcGFyYW0gIHNDb25maWcgREFDIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuIAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzE6IERBQzEgQ2hhbm5lbDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0NIQU5ORUxfMjogREFDMSBDaGFubmVsMiBzZWxlY3RlZCAgCisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzE6IERBQzIgQ2hhbm5lbDEgc2VsZWN0ZWQgCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNfQ29uZmlnQ2hhbm5lbChEQUNfSGFuZGxlVHlwZURlZiogaGRhYywgREFDX0NoYW5uZWxDb25mVHlwZURlZiogc0NvbmZpZywgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgdWludDMyX3QgdG1wcmVnMSA9IDBVLCB0bXByZWcyID0gMFU7CisKKyAgLyogQ2hlY2sgdGhlIERBQyBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19EQUNfVFJJR0dFUihzQ29uZmlnLT5EQUNfVHJpZ2dlcikpOworCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkKKyAgaWYgKChoZGFjLT5JbnN0YW5jZSA9PSBEQUMxKSAmJiAoQ2hhbm5lbCA9PSBEQUNfQ0hBTk5FTF8xKSkgCisgIHsKKyAgICAvKiBPdXRwdXQgQnVmZmVyIChCT0ZGMSkgY29udHJvbCAqLworICAgIGFzc2VydF9wYXJhbShJU19EQUNfT1VUUFVUX0JVRkZFUl9TVEFURShzQ29uZmlnLT5EQUNfT3V0cHV0QnVmZmVyKSk7ICAgIAorICB9CisgIGVsc2UgLyogREFDMSBjaGFubmVsIDJVICYgREFDMiBjaGFubmVsIDFVICovCisgIHsKKyAgICAvKiBPdXRwdXQgU3dpdGNoIChPVVRFTikgY29udHJvbCAqLworICAgIGFzc2VydF9wYXJhbShJU19EQUNfT1VUUFVUX1NXSVRDSF9TVEFURShzQ29uZmlnLT5EQUNfT3V0cHV0U3dpdGNoKSk7ICAgIAorICB9ICAgIAorI2Vsc2UKKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19PVVRQVVRfQlVGRkVSX1NUQVRFKHNDb25maWctPkRBQ19PdXRwdXRCdWZmZXIpKTsgICAgCisjZW5kaWYgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19DSEFOTkVMKENoYW5uZWwpKTsgICAKKyAKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoZGFjKTsKKyAgCisgIC8qIENoYW5nZSBEQUMgc3RhdGUgKi8KKyAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX0JVU1k7CisgIAorICAvKiBHZXQgdGhlIERBQyBDUiB2YWx1ZSAqLworICB0bXByZWcxID0gaGRhYy0+SW5zdGFuY2UtPkNSOworICAKKyAgLyogQ2xlYXIgQk9GRngtT1VURU54LCBURU54LCBUU0VMeCwgV0FWRXggYW5kIE1BTVB4IGJpdHMgKi8KKyAgCisgIC8qIENvbmZpZ3VyZSBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsOiBidWZmZXIgb3V0cHV0IG9yIHN3aXRjaCBvdXRwdXQsIHRyaWdnZXIgKi8KKyAgLyogU2V0IFRTRUx4IGFuZCBURU54IGJpdHMgYWNjb3JkaW5nIHRvIERBQ19UcmlnZ2VyIHZhbHVlICovCisgIC8qIFNldCBCT0ZGeCBiaXQgYWNjb3JkaW5nIHRvIERBQ19PdXRwdXRCdWZmZXIgdmFsdWUgT1IgKi8gICAKKyAgLyogU2V0IE9VVEVOIGJpdCBhY2NvcmRpbmcgdG8gREFDX091dHB1dFN3aXRjaCB2YWx1ZSAqLyAgIAorI2lmIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpCisgIGlmICgoaGRhYy0+SW5zdGFuY2UgPT0gREFDMSkgJiYgKENoYW5uZWwgPT0gREFDX0NIQU5ORUxfMSkpIAorICB7CisgICAgLyogT3V0cHV0IEJ1ZmZlciAoQk9GRjEpIGNvbnRyb2wgKi8KKyAgICB0bXByZWcxICY9IH4oKCh1aW50MzJfdCkoREFDX0NSX01BTVAxIHwgREFDX0NSX1dBVkUxIHwgREFDX0NSX1RTRUwxIHwgREFDX0NSX1RFTjEgfCBEQUNfQ1JfQk9GRjEpKSA8PCBDaGFubmVsKTsKKyAgICB0bXByZWcyID0gKHNDb25maWctPkRBQ19UcmlnZ2VyIHwgc0NvbmZpZy0+REFDX091dHB1dEJ1ZmZlcik7ICAgIAorICB9CisgIGVsc2UgLyogREFDMSBjaGFubmVsIDJVICYgREFDMiBjaGFubmVsIDFVICovCisgIHsKKyAgICAvKiBPdXRwdXQgU3dpdGNoIChPVVRFTikgY29udHJvbCAqLworICAgIHRtcHJlZzEgJj0gfigoKHVpbnQzMl90KShEQUNfQ1JfTUFNUDEgfCBEQUNfQ1JfV0FWRTEgfCBEQUNfQ1JfVFNFTDEgfCBEQUNfQ1JfVEVOMSB8IERBQ19DUl9PVVRFTjEpKSA8PCBDaGFubmVsKTsgICAgCisgICAgdG1wcmVnMiA9IChzQ29uZmlnLT5EQUNfVHJpZ2dlciB8IHNDb25maWctPkRBQ19PdXRwdXRTd2l0Y2gpOyAgICAKKyAgfSAgICAKKyNlbHNlCisgIHRtcHJlZzEgJj0gfigoKHVpbnQzMl90KShEQUNfQ1JfTUFNUDEgfCBEQUNfQ1JfV0FWRTEgfCBEQUNfQ1JfVFNFTDEgfCBEQUNfQ1JfVEVOMSB8IERBQ19DUl9CT0ZGMSkpIDw8IENoYW5uZWwpOworICB0bXByZWcyID0gKHNDb25maWctPkRBQ19UcmlnZ2VyIHwgc0NvbmZpZy0+REFDX091dHB1dEJ1ZmZlcik7CisjZW5kaWYgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4IHx8ICovCisgIAorICAvKiBDYWxjdWxhdGUgQ1IgcmVnaXN0ZXIgdmFsdWUgZGVwZW5kaW5nIG9uIERBQ19DaGFubmVsICovCisgIHRtcHJlZzEgfD0gdG1wcmVnMiA8PCBDaGFubmVsOworICAvKiBXcml0ZSB0byBEQUMgQ1IgKi8KKyAgaGRhYy0+SW5zdGFuY2UtPkNSID0gdG1wcmVnMTsKKyAgCisgIC8qIERpc2FibGUgd2F2ZSBnZW5lcmF0aW9uICovCisgIGhkYWMtPkluc3RhbmNlLT5DUiAmPSB+KERBQ19DUl9XQVZFMSA8PCBDaGFubmVsKTsKKworICAvKiBDaGFuZ2UgREFDIHN0YXRlICovCisgIGhkYWMtPlN0YXRlID0gSEFMX0RBQ19TVEFURV9SRUFEWTsKKyAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhkYWMpOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsIHdhdmUgZ2VuZXJhdGlvbi4KKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHBhcmFtICBDaGFubmVsIFRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBEQUNfQ0hBTk5FTF8xOiBEQUMxIENoYW5uZWwxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzI6IERBQzEgQ2hhbm5lbDIgc2VsZWN0ZWQKKyAgKiBAcGFyYW0gIEFtcGxpdHVkZSBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBEQUNfVFJJQU5HTEVBTVBMSVRVREVfMTogU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgMQorICAqICAgICAgICAgICAgQGFyZyBEQUNfVFJJQU5HTEVBTVBMSVRVREVfMzogU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgMworICAqICAgICAgICAgICAgQGFyZyBEQUNfVFJJQU5HTEVBTVBMSVRVREVfNzogU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgNworICAqICAgICAgICAgICAgQGFyZyBEQUNfVFJJQU5HTEVBTVBMSVRVREVfMTU6IFNlbGVjdCBtYXggdHJpYW5nbGUgYW1wbGl0dWRlIG9mIDE1CisgICogICAgICAgICAgICBAYXJnIERBQ19UUklBTkdMRUFNUExJVFVERV8zMTogU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgMzEKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX1RSSUFOR0xFQU1QTElUVURFXzYzOiBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiA2MworICAqICAgICAgICAgICAgQGFyZyBEQUNfVFJJQU5HTEVBTVBMSVRVREVfMTI3OiBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiAxMjcKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX1RSSUFOR0xFQU1QTElUVURFXzI1NTogU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgMjU1CisgICogICAgICAgICAgICBAYXJnIERBQ19UUklBTkdMRUFNUExJVFVERV81MTE6IFNlbGVjdCBtYXggdHJpYW5nbGUgYW1wbGl0dWRlIG9mIDUxMQorICAqICAgICAgICAgICAgQGFyZyBEQUNfVFJJQU5HTEVBTVBMSVRVREVfMTAyMzogU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgMTAyMworICAqICAgICAgICAgICAgQGFyZyBEQUNfVFJJQU5HTEVBTVBMSVRVREVfMjA0NzogU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgMjA0NworICAqICAgICAgICAgICAgQGFyZyBEQUNfVFJJQU5HTEVBTVBMSVRVREVfNDA5NTogU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgNDA5NQorICAqIEBub3RlICAgV2F2ZSBnZW5lcmF0aW9uIGlzIG5vdCBhdmFpbGFibGUgaW4gREFDMi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNFeF9UcmlhbmdsZVdhdmVHZW5lcmF0ZShEQUNfSGFuZGxlVHlwZURlZiogaGRhYywgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgQW1wbGl0dWRlKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfREFDX0NIQU5ORUwoQ2hhbm5lbCkpOworICBhc3NlcnRfcGFyYW0oSVNfREFDX0xGU1JfVU5NQVNLX1RSSUFOR0xFX0FNUExJVFVERShBbXBsaXR1ZGUpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhkYWMpOworCisgIC8qIENoYW5nZSBEQUMgc3RhdGUgKi8KKyAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX0JVU1k7CisKKyAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCB3YXZlIGdlbmVyYXRpb24gZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLworICBNT0RJRllfUkVHKGhkYWMtPkluc3RhbmNlLT5DUiwgKChEQUNfQ1JfV0FWRTEpfChEQUNfQ1JfTUFNUDEpKTw8Q2hhbm5lbCwgKERBQ19DUl9XQVZFMV8xIHwgQW1wbGl0dWRlKSA8PCBDaGFubmVsKTsKKworICAvKiBDaGFuZ2UgREFDIHN0YXRlICovCisgIGhkYWMtPlN0YXRlID0gSEFMX0RBQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoZGFjKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgd2F2ZSBnZW5lcmF0aW9uLgorICAqIEBwYXJhbSAgaGRhYyBwb2ludGVyIHRvIGEgREFDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERBQy4KKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzE6IERBQzEgQ2hhbm5lbDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0NIQU5ORUxfMjogREFDMSBDaGFubmVsMiBzZWxlY3RlZAorICAqIEBwYXJhbSAgQW1wbGl0dWRlIFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24uCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0xGU1JVTk1BU0tfQklUMDogVW5tYXNrIERBQyBjaGFubmVsIExGU1IgYml0MCBmb3Igbm9pc2Ugd2F2ZSBnZW5lcmF0aW9uCisgICogICAgICAgICAgICBAYXJnIERBQ19MRlNSVU5NQVNLX0JJVFMxXzA6IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFsxOjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0xGU1JVTk1BU0tfQklUUzJfMDogVW5tYXNrIERBQyBjaGFubmVsIExGU1IgYml0WzI6MF0gZm9yIG5vaXNlIHdhdmUgZ2VuZXJhdGlvbgorICAqICAgICAgICAgICAgQGFyZyBEQUNfTEZTUlVOTUFTS19CSVRTM18wOiBVbm1hc2sgREFDIGNoYW5uZWwgTEZTUiBiaXRbMzowXSBmb3Igbm9pc2Ugd2F2ZSBnZW5lcmF0aW9uCisgICogICAgICAgICAgICBAYXJnIERBQ19MRlNSVU5NQVNLX0JJVFM0XzA6IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFs0OjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0xGU1JVTk1BU0tfQklUUzVfMDogVW5tYXNrIERBQyBjaGFubmVsIExGU1IgYml0WzU6MF0gZm9yIG5vaXNlIHdhdmUgZ2VuZXJhdGlvbgorICAqICAgICAgICAgICAgQGFyZyBEQUNfTEZTUlVOTUFTS19CSVRTNl8wOiBVbm1hc2sgREFDIGNoYW5uZWwgTEZTUiBiaXRbNjowXSBmb3Igbm9pc2Ugd2F2ZSBnZW5lcmF0aW9uCisgICogICAgICAgICAgICBAYXJnIERBQ19MRlNSVU5NQVNLX0JJVFM3XzA6IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFs3OjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0xGU1JVTk1BU0tfQklUUzhfMDogVW5tYXNrIERBQyBjaGFubmVsIExGU1IgYml0Wzg6MF0gZm9yIG5vaXNlIHdhdmUgZ2VuZXJhdGlvbgorICAqICAgICAgICAgICAgQGFyZyBEQUNfTEZTUlVOTUFTS19CSVRTOV8wOiBVbm1hc2sgREFDIGNoYW5uZWwgTEZTUiBiaXRbOTowXSBmb3Igbm9pc2Ugd2F2ZSBnZW5lcmF0aW9uCisgICogICAgICAgICAgICBAYXJnIERBQ19MRlNSVU5NQVNLX0JJVFMxMF8wOiBVbm1hc2sgREFDIGNoYW5uZWwgTEZTUiBiaXRbMTA6MF0gZm9yIG5vaXNlIHdhdmUgZ2VuZXJhdGlvbgorICAqICAgICAgICAgICAgQGFyZyBEQUNfTEZTUlVOTUFTS19CSVRTMTFfMDogVW5tYXNrIERBQyBjaGFubmVsIExGU1IgYml0WzExOjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNFeF9Ob2lzZVdhdmVHZW5lcmF0ZShEQUNfSGFuZGxlVHlwZURlZiogaGRhYywgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgQW1wbGl0dWRlKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfREFDX0NIQU5ORUwoQ2hhbm5lbCkpOworICBhc3NlcnRfcGFyYW0oSVNfREFDX0xGU1JfVU5NQVNLX1RSSUFOR0xFX0FNUExJVFVERShBbXBsaXR1ZGUpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhkYWMpOworCisgIC8qIENoYW5nZSBEQUMgc3RhdGUgKi8KKyAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX0JVU1k7CisKKyAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCB3YXZlIGdlbmVyYXRpb24gZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLworICBNT0RJRllfUkVHKGhkYWMtPkluc3RhbmNlLT5DUiwgKChEQUNfQ1JfV0FWRTEpfChEQUNfQ1JfTUFNUDEpKTw8Q2hhbm5lbCwgKERBQ19DUl9XQVZFMV8wIHwgQW1wbGl0dWRlKSA8PCBDaGFubmVsKTsKKyAgCisgIC8qIENoYW5nZSBEQUMgc3RhdGUgKi8KKyAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhkYWMpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworI2lmICBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSAgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgIGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkgfHwgXAorICAgICBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorLyogREFDIGNoYW5uZWwgMiBpcyBhdmFpbGFibGUgb24gdG9wIG9mIERBQyBjaGFubmVsIDFVICovCisvKioKKyAgKiBAYnJpZWYgIENvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sgaW4gbm9uIGJsb2NraW5nIG1vZGUgZm9yIENoYW5uZWwyCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0RBQ0V4X0NvbnZDcGx0Q2FsbGJhY2tDaDIoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhkYWMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfREFDRXhfQ29udkNwbHRDYWxsYmFja0NoMiBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbnZlcnNpb24gaGFsZiBETUEgdHJhbnNmZXIgY2FsbGJhY2sgaW4gbm9uIGJsb2NraW5nIG1vZGUgZm9yIENoYW5uZWwyCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0RBQ0V4X0NvbnZIYWxmQ3BsdENhbGxiYWNrQ2gyKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoZGFjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0RBQ0V4X0NvbnZIYWxmQ3BsdENhbGxiYWNrQ2gyIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgRXJyb3IgREFDIGNhbGxiYWNrIGZvciBDaGFubmVsMi4KKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfREFDRXhfRXJyb3JDYWxsYmFja0NoMihEQUNfSGFuZGxlVHlwZURlZiAqaGRhYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGRhYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9EQUNFeF9FcnJvckNhbGxiYWNrQ2gyIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIHVuZGVycnVuIERBQyBjYWxsYmFjayBmb3IgY2hhbm5lbDIuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0RBQ0V4X0RNQVVuZGVycnVuQ2FsbGJhY2tDaDIoREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhkYWMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfREFDRXhfRE1BVW5kZXJydW5DYWxsYmFja0NoMiBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorI2VuZGlmIC8qIFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4ICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICAgICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgREFDRXhfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworICAKKy8qKgorICAqIEBicmllZiAgRE1BIGNvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2suIAorICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBEQUNfRE1BQ29udkNwbHRDaDEoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpICAgCit7CisgIERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjID0gKCBEQUNfSGFuZGxlVHlwZURlZiogKSgoRE1BX0hhbmRsZVR5cGVEZWYqICloZG1hKS0+UGFyZW50OworICAKKyAgSEFMX0RBQ19Db252Q3BsdENhbGxiYWNrQ2gxKGhkYWMpOyAKKyAgCisgIGhkYWMtPlN0YXRlPSBIQUxfREFDX1NUQVRFX1JFQURZOworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBoYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrLiAKKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgREFDX0RNQUhhbGZDb252Q3BsdENoMShETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgICAKK3sKKyAgICBEQUNfSGFuZGxlVHlwZURlZiogaGRhYyA9ICggREFDX0hhbmRsZVR5cGVEZWYqICkoKERNQV9IYW5kbGVUeXBlRGVmKiApaGRtYSktPlBhcmVudDsKKyAgICAvKiBDb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgSEFMX0RBQ19Db252SGFsZkNwbHRDYWxsYmFja0NoMShoZGFjKTsgCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIGVycm9yIGNhbGxiYWNrIAorICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBEQUNfRE1BRXJyb3JDaDEoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpICAgCit7CisgIERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjID0gKCBEQUNfSGFuZGxlVHlwZURlZiogKSgoRE1BX0hhbmRsZVR5cGVEZWYqICloZG1hKS0+UGFyZW50OworICAgIAorICAvKiBTZXQgREFDIGVycm9yIGNvZGUgdG8gRE1BIGVycm9yICovCisgIGhkYWMtPkVycm9yQ29kZSB8PSBIQUxfREFDX0VSUk9SX0RNQTsKKyAgICAKKyAgSEFMX0RBQ19FcnJvckNhbGxiYWNrQ2gxKGhkYWMpOyAKKyAgICAKKyAgaGRhYy0+U3RhdGU9IEhBTF9EQUNfU1RBVEVfUkVBRFk7Cit9CisKKyNpZiAgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgICBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSAgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpIHx8IFwKKyAgICAgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKy8qIERBQyBjaGFubmVsIDIgaXMgYXZhaWxhYmxlIG9uIHRvcCBvZiBEQUMgY2hhbm5lbCAxVSAqLworLyoqCisgICogQGJyaWVmICBETUEgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjay4gCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIERBQ19ETUFDb252Q3BsdENoMihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgICAKK3sKKyAgREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMgPSAoIERBQ19IYW5kbGVUeXBlRGVmKiApKChETUFfSGFuZGxlVHlwZURlZiogKWhkbWEpLT5QYXJlbnQ7CisgIAorICBIQUxfREFDRXhfQ29udkNwbHRDYWxsYmFja0NoMihoZGFjKTsKKyAgCisgIGhkYWMtPlN0YXRlPSBIQUxfREFDX1NUQVRFX1JFQURZOworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBoYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrLiAKKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgREFDX0RNQUhhbGZDb252Q3BsdENoMihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgICAKK3sKKyAgICBEQUNfSGFuZGxlVHlwZURlZiogaGRhYyA9ICggREFDX0hhbmRsZVR5cGVEZWYqICkoKERNQV9IYW5kbGVUeXBlRGVmKiApaGRtYSktPlBhcmVudDsKKyAgICAvKiBDb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgSEFMX0RBQ0V4X0NvbnZIYWxmQ3BsdENhbGxiYWNrQ2gyKGhkYWMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBlcnJvciBjYWxsYmFjayAKKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgREFDX0RNQUVycm9yQ2gyKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSAgIAoreworICBEQUNfSGFuZGxlVHlwZURlZiogaGRhYyA9ICggREFDX0hhbmRsZVR5cGVEZWYqICkoKERNQV9IYW5kbGVUeXBlRGVmKiApaGRtYSktPlBhcmVudDsKKyAgICAKKyAgLyogU2V0IERBQyBlcnJvciBjb2RlIHRvIERNQSBlcnJvciAqLworICBoZGFjLT5FcnJvckNvZGUgfD0gSEFMX0RBQ19FUlJPUl9ETUE7CisgICAgCisgIEhBTF9EQUNFeF9FcnJvckNhbGxiYWNrQ2gyKGhkYWMpOworICAgIAorICBoZGFjLT5TdGF0ZT0gSEFMX0RBQ19TVEFURV9SRUFEWTsKK30KKyNlbmRpZiAvKiBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCAgICAgICAgICAgICAgICB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4ICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAgICAgICAgICAgICAgICAgICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX0RBQ19NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmYzeHhfaGFsX2RtYS5jIGIvU3JjL3N0bTMyZjN4eF9oYWxfZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM5ZTlhNwotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfaGFsX2RtYS5jCkBAIC0wLDAgKzEsOTA0IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2hhbF9kbWEuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgRE1BIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgIAorICAqICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZyAKKyAgKiAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgRGlyZWN0IE1lbW9yeSBBY2Nlc3MgKERNQSkgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgU3RhdGUgYW5kIGVycm9ycyBmdW5jdGlvbnMKKyAgQHZlcmJhdGltICAgICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKyAgWy4uXQorICAgKCMpIEVuYWJsZSBhbmQgY29uZmlndXJlIHRoZSBwZXJpcGhlcmFsIHRvIGJlIGNvbm5lY3RlZCB0byB0aGUgRE1BIENoYW5uZWwKKyAgICAgICAoZXhjZXB0IGZvciBpbnRlcm5hbCBTUkFNIC8gRkxBU0ggbWVtb3JpZXM6IG5vIGluaXRpYWxpemF0aW9uIGlzIAorICAgICAgIG5lY2Vzc2FyeSkuIFBsZWFzZSByZWZlciB0byBSZWZlcmVuY2UgbWFudWFsIGZvciBjb25uZWN0aW9uIGJldHdlZW4gcGVyaXBoZXJhbHMKKyAgICAgICBhbmQgRE1BIHJlcXVlc3RzIC4KKworICAgKCMpIEZvciBhIGdpdmVuIENoYW5uZWwsIHByb2dyYW0gdGhlIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gdGhyb3VnaCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6ICAgCisgICAgICAgVHJhbnNmZXIgRGlyZWN0aW9uLCBTb3VyY2UgYW5kIERlc3RpbmF0aW9uIGRhdGEgZm9ybWF0cywgCisgICAgICAgQ2lyY3VsYXIgb3IgTm9ybWFsIG1vZGUsIENoYW5uZWwgUHJpb3JpdHkgbGV2ZWwsIFNvdXJjZSBhbmQgRGVzdGluYXRpb24gSW5jcmVtZW50IG1vZGUsIAorICAgICAgIHVzaW5nIEhBTF9ETUFfSW5pdCgpIGZ1bmN0aW9uLgorCisgICAoIykgVXNlIEhBTF9ETUFfR2V0U3RhdGUoKSBmdW5jdGlvbiB0byByZXR1cm4gdGhlIERNQSBzdGF0ZSBhbmQgSEFMX0RNQV9HZXRFcnJvcigpIGluIGNhc2Ugb2YgZXJyb3IgCisgICAgICAgZGV0ZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICAKKyAgICgjKSBVc2UgSEFMX0RNQV9BYm9ydCgpIGZ1bmN0aW9uIHRvIGFib3J0IHRoZSBjdXJyZW50IHRyYW5zZmVyCisgICAgICAgICAgICAgICAgICAgCisgICAgIC1ALSAgIEluIE1lbW9yeS10by1NZW1vcnkgdHJhbnNmZXIgbW9kZSwgQ2lyY3VsYXIgbW9kZSBpcyBub3QgYWxsb3dlZC4KKyAgICAgKioqIFBvbGxpbmcgbW9kZSBJTyBvcGVyYXRpb24gKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgIAorICAgIFsuLl0gCisgICAgICAoKykgVXNlIEhBTF9ETUFfU3RhcnQoKSB0byBzdGFydCBETUEgdHJhbnNmZXIgYWZ0ZXIgdGhlIGNvbmZpZ3VyYXRpb24gb2YgU291cmNlIAorICAgICAgICAgIGFkZHJlc3MgYW5kIGRlc3RpbmF0aW9uIGFkZHJlc3MgYW5kIHRoZSBMZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZAorICAgICAgKCspIFVzZSBIQUxfRE1BX1BvbGxGb3JUcmFuc2ZlcigpIHRvIHBvbGwgZm9yIHRoZSBlbmQgb2YgY3VycmVudCB0cmFuc2ZlciwgaW4gdGhpcyAgCisgICAgICAgICAgY2FzZSBhIGZpeGVkIFRpbWVvdXQgY2FuIGJlIGNvbmZpZ3VyZWQgYnkgVXNlciBkZXBlbmRpbmcgZnJvbSBoaXMgYXBwbGljYXRpb24uCisKKyAgICAgKioqIEludGVycnVwdCBtb2RlIElPIG9wZXJhdGlvbiAqKiogICAgCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorICAgIFsuLl0KKyAgICAgICgrKSBDb25maWd1cmUgdGhlIERNQSBpbnRlcnJ1cHQgcHJpb3JpdHkgdXNpbmcgSEFMX05WSUNfU2V0UHJpb3JpdHkoKQorICAgICAgKCspIEVuYWJsZSB0aGUgRE1BIElSUSBoYW5kbGVyIHVzaW5nIEhBTF9OVklDX0VuYWJsZUlSUSgpIAorICAgICAgKCspIFVzZSBIQUxfRE1BX1N0YXJ0X0lUKCkgdG8gc3RhcnQgRE1BIHRyYW5zZmVyIGFmdGVyIHRoZSBjb25maWd1cmF0aW9uIG9mICAKKyAgICAgICAgICBTb3VyY2UgYWRkcmVzcyBhbmQgZGVzdGluYXRpb24gYWRkcmVzcyBhbmQgdGhlIExlbmd0aCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkLiAKKyAgICAgICAgICBJbiB0aGlzIGNhc2UgdGhlIERNQSBpbnRlcnJ1cHQgaXMgY29uZmlndXJlZCAKKyAgICAgICgrKSBVc2UgSEFMX0RNQV9DaGFubmVsX0lSUUhhbmRsZXIoKSBjYWxsZWQgdW5kZXIgRE1BX0lSUUhhbmRsZXIoKSBJbnRlcnJ1cHQgc3Vicm91dGluZQorICAgICAgKCspIEF0IHRoZSBlbmQgb2YgZGF0YSB0cmFuc2ZlciBIQUxfRE1BX0lSUUhhbmRsZXIoKSBmdW5jdGlvbiBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4gCisgICAgICAgICAgYWRkIGhpcyBvd24gZnVuY3Rpb24gYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIFhmZXJDcGx0Q2FsbGJhY2sgYW5kIAorICAgICAgICAgIFhmZXJFcnJvckNhbGxiYWNrIChpLmUgYSBtZW1iZXIgb2YgRE1BIGhhbmRsZSBzdHJ1Y3R1cmUpLiAKKworICAgICAqKiogRE1BIEhBTCBkcml2ZXIgbWFjcm9zIGxpc3QgKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKyAgICAgWy4uXQorICAgICAgIEJlbG93IHRoZSBsaXN0IG9mIG1vc3QgdXNlZCBtYWNyb3MgaW4gRE1BIEhBTCBkcml2ZXIuCisKKyAgICAgWy4uXSAKKyAgICAgIChAKSBZb3UgY2FuIHJlZmVyIHRvIHRoZSBETUEgSEFMIGRyaXZlciBoZWFkZXIgZmlsZSBmb3IgbW9yZSB1c2VmdWwgbWFjcm9zICAKKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovIAorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBETUEgRE1BCisgICogQGJyaWVmIERNQSBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfRE1BX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBETUFfUHJpdmF0ZV9GdW5jdGlvbnMgRE1BIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3N0YXRpYyB2b2lkIERNQV9TZXRDb25maWcoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsIHVpbnQzMl90IFNyY0FkZHJlc3MsIHVpbnQzMl90IERzdEFkZHJlc3MsIHVpbnQzMl90IERhdGFMZW5ndGgpOworc3RhdGljIHZvaWQgRE1BX0NhbGNCYXNlQW5kQml0c2hpZnQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0V4cG9ydGVkX0Z1bmN0aW9ucyBETUEgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAKKyAqCitAdmVyYmF0aW0gICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgICBbLi5dCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIHRoZSBETUEgQ2hhbm5lbCBzb3VyY2UKKyAgICBhbmQgZGVzdGluYXRpb24gYWRkcmVzc2VzLCBpbmNyZW1lbnRhdGlvbiBhbmQgZGF0YSBzaXplcywgdHJhbnNmZXIgZGlyZWN0aW9uLCAKKyAgICBjaXJjdWxhci9ub3JtYWwgbW9kZSBzZWxlY3Rpb24sIG1lbW9yeS10by1tZW1vcnkgbW9kZSBzZWxlY3Rpb24gYW5kIENoYW5uZWwgcHJpb3JpdHkgdmFsdWUuCisgICAgWy4uXQorICAgIFRoZSBIQUxfRE1BX0luaXQoKSBmdW5jdGlvbiBmb2xsb3dzIHRoZSBETUEgY29uZmlndXJhdGlvbiBwcm9jZWR1cmVzIGFzIGRlc2NyaWJlZCBpbgorICAgIHJlZmVyZW5jZSBtYW51YWwuICAKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKyAgCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIERNQSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgRE1BX0luaXRUeXBlRGVmIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGhkbWEgUG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4gIAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9Jbml0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreyAKKyAgdWludDMyX3QgdG1wID0gMFU7CisgIAorICAvKiBDaGVjayB0aGUgRE1BIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmKE5VTEwgPT0gaGRtYSkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19ETUFfQUxMX0lOU1RBTkNFKGhkbWEtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19ETUFfRElSRUNUSU9OKGhkbWEtPkluaXQuRGlyZWN0aW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19ETUFfUEVSSVBIRVJBTF9JTkNfU1RBVEUoaGRtYS0+SW5pdC5QZXJpcGhJbmMpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0RNQV9NRU1PUllfSU5DX1NUQVRFKGhkbWEtPkluaXQuTWVtSW5jKSk7CisgIGFzc2VydF9wYXJhbShJU19ETUFfUEVSSVBIRVJBTF9EQVRBX1NJWkUoaGRtYS0+SW5pdC5QZXJpcGhEYXRhQWxpZ25tZW50KSk7CisgIGFzc2VydF9wYXJhbShJU19ETUFfTUVNT1JZX0RBVEFfU0laRShoZG1hLT5Jbml0Lk1lbURhdGFBbGlnbm1lbnQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0RNQV9NT0RFKGhkbWEtPkluaXQuTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRE1BX1BSSU9SSVRZKGhkbWEtPkluaXQuUHJpb3JpdHkpKTsKKyAgCisgIC8qIENoYW5nZSBETUEgcGVyaXBoZXJhbCBzdGF0ZSAqLworICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfQlVTWTsKKworICAvKiBHZXQgdGhlIENSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcCA9IGhkbWEtPkluc3RhbmNlLT5DQ1I7CisgIAorICAvKiBDbGVhciBQTCwgTVNJWkUsIFBTSVpFLCBNSU5DLCBQSU5DLCBDSVJDLCBESVIgYml0cyAqLworICB0bXAgJj0gKCh1aW50MzJfdCl+KERNQV9DQ1JfUEwgICAgfCBETUFfQ0NSX01TSVpFICB8IERNQV9DQ1JfUFNJWkUgIHwgXAorICAgICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfTUlOQyAgfCBETUFfQ0NSX1BJTkMgICB8IERNQV9DQ1JfQ0lSQyAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfRElSKSk7CisgIAorICAvKiBQcmVwYXJlIHRoZSBETUEgQ2hhbm5lbCBjb25maWd1cmF0aW9uICovCisgIHRtcCB8PSAgaGRtYS0+SW5pdC5EaXJlY3Rpb24gICAgICAgIHwKKyAgICAgICAgICBoZG1hLT5Jbml0LlBlcmlwaEluYyAgICAgICAgICAgfCBoZG1hLT5Jbml0Lk1lbUluYyAgICAgICAgICAgfAorICAgICAgICAgIGhkbWEtPkluaXQuUGVyaXBoRGF0YUFsaWdubWVudCB8IGhkbWEtPkluaXQuTWVtRGF0YUFsaWdubWVudCB8CisgICAgICAgICAgaGRtYS0+SW5pdC5Nb2RlICAgICAgICAgICAgICAgIHwgaGRtYS0+SW5pdC5Qcmlvcml0eTsKKworICAvKiBXcml0ZSB0byBETUEgQ2hhbm5lbCBDUiByZWdpc3RlciAqLworICBoZG1hLT5JbnN0YW5jZS0+Q0NSID0gdG1wOyAgCisgIAorICAvKiBJbml0aWFsaXplIERtYUJhc2VBZGRyZXNzIGFuZCBDaGFubmVsSW5kZXggcGFyYW1ldGVycyB1c2VkIAorICAgICBieSBIQUxfRE1BX0lSUUhhbmRsZXIoKSBhbmQgSEFMX0RNQV9Qb2xsRm9yVHJhbnNmZXIoKSAqLworICBETUFfQ2FsY0Jhc2VBbmRCaXRzaGlmdChoZG1hKTsKKyAgCisgIC8qIEluaXRpYWxpc2UgdGhlIGVycm9yIGNvZGUgKi8KKyAgaGRtYS0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9OT05FOworCisgIC8qIEluaXRpYWxpemUgdGhlIERNQSBzdGF0ZSovCisgIGhkbWEtPlN0YXRlID0gSEFMX0RNQV9TVEFURV9SRUFEWTsKKyAgCisgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgaGRtYS0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9ICAKKyAgCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgRE1BIHBlcmlwaGVyYWwgCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuICAKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfRGVJbml0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICAvKiBDaGVjayB0aGUgRE1BIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmKE5VTEwgPT0gaGRtYSkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19ETUFfQUxMX0lOU1RBTkNFKGhkbWEtPkluc3RhbmNlKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgRE1BIENoYW5uZWx4ICovCisgIGhkbWEtPkluc3RhbmNlLT5DQ1IgJj0gfkRNQV9DQ1JfRU47CisKKyAgLyogUmVzZXQgRE1BIENoYW5uZWwgY29udHJvbCByZWdpc3RlciAqLworICBoZG1hLT5JbnN0YW5jZS0+Q0NSICA9IDBVOworCisgIC8qIFJlc2V0IERNQSBDaGFubmVsIE51bWJlciBvZiBEYXRhIHRvIFRyYW5zZmVyIHJlZ2lzdGVyICovCisgIGhkbWEtPkluc3RhbmNlLT5DTkRUUiA9IDBVOworCisgIC8qIFJlc2V0IERNQSBDaGFubmVsIHBlcmlwaGVyYWwgYWRkcmVzcyByZWdpc3RlciAqLworICBoZG1hLT5JbnN0YW5jZS0+Q1BBUiAgPSAwVTsKKyAgCisgIC8qIFJlc2V0IERNQSBDaGFubmVsIG1lbW9yeSBhZGRyZXNzIHJlZ2lzdGVyICovCisgIGhkbWEtPkluc3RhbmNlLT5DTUFSID0gMFU7CisKKyAgLyogR2V0IERNQSBCYXNlIEFkZHJlc3MgKi8gIAorICBETUFfQ2FsY0Jhc2VBbmRCaXRzaGlmdChoZG1hKTsKKworICAvKiBDbGVhciBhbGwgZmxhZ3MgKi8KKyAgaGRtYS0+RG1hQmFzZUFkZHJlc3MtPklGQ1IgPSBETUFfRkxBR19HTDEgPDwgaGRtYS0+Q2hhbm5lbEluZGV4OworCisgIC8qIENsZWFuIGNhbGxiYWNrcyAqLworICBoZG1hLT5YZmVyQ3BsdENhbGxiYWNrID0gTlVMTDsKKyAgaGRtYS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBOVUxMOworICBoZG1hLT5YZmVyRXJyb3JDYWxsYmFjayA9IE5VTEw7CisgIGhkbWEtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAvKiBSZXNldCB0aGUgZXJyb3IgY29kZSAqLworICBoZG1hLT5FcnJvckNvZGUgPSBIQUxfRE1BX0VSUk9SX05PTkU7CisKKyAgLyogUmVzZXQgdGhlIERNQSBzdGF0ZSAqLworICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfUkVTRVQ7CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoZG1hKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElucHV0IGFuZCBPdXRwdXQgb3BlcmF0aW9uIGZ1bmN0aW9ucyAKKyAqICBAYnJpZWYgICBJL08gb3BlcmF0aW9uIGZ1bmN0aW9ucyAgCisgKgorQHZlcmJhdGltICAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjICBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgQ29uZmlndXJlIHRoZSBzb3VyY2UsIGRlc3RpbmF0aW9uIGFkZHJlc3MgYW5kIGRhdGEgbGVuZ3RoIGFuZCBTdGFydCBETUEgdHJhbnNmZXIKKyAgICAgICgrKSBDb25maWd1cmUgdGhlIHNvdXJjZSwgZGVzdGluYXRpb24gYWRkcmVzcyBhbmQgZGF0YSBsZW5ndGggYW5kIAorICAgICAgICAgIFN0YXJ0IERNQSB0cmFuc2ZlciB3aXRoIGludGVycnVwdAorICAgICAgKCspIEFib3J0IERNQSB0cmFuc2ZlcgorICAgICAgKCspIFBvbGwgZm9yIHRyYW5zZmVyIGNvbXBsZXRlCisgICAgICAoKykgSGFuZGxlIERNQSBpbnRlcnJ1cHQgcmVxdWVzdCAgCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU3RhcnQgdGhlIERNQSBUcmFuc2Zlci4KKyAgKiBAcGFyYW0gIGhkbWEgICAgICA6IHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuICAKKyAgKiBAcGFyYW0gIFNyY0FkZHJlc3MgVGhlIHNvdXJjZSBtZW1vcnkgQnVmZmVyIGFkZHJlc3MKKyAgKiBAcGFyYW0gIERzdEFkZHJlc3MgVGhlIGRlc3RpbmF0aW9uIG1lbW9yeSBCdWZmZXIgYWRkcmVzcworICAqIEBwYXJhbSAgRGF0YUxlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfU3RhcnQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsIHVpbnQzMl90IFNyY0FkZHJlc3MsIHVpbnQzMl90IERzdEFkZHJlc3MsIHVpbnQzMl90IERhdGFMZW5ndGgpCit7CisJSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19ETUFfQlVGRkVSX1NJWkUoRGF0YUxlbmd0aCkpOworICAKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoZG1hKTsKKyAgCisgIGlmKEhBTF9ETUFfU1RBVEVfUkVBRFkgPT0gaGRtYS0+U3RhdGUpCisgIHsKKyAgCS8qIENoYW5nZSBETUEgcGVyaXBoZXJhbCBzdGF0ZSAqLyAgCisgIAloZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfQlVTWTsKKyAgCQorICAJaGRtYS0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9OT05FOworICAJCisgIAkvKiBEaXNhYmxlIHRoZSBwZXJpcGhlcmFsICovCisgIAloZG1hLT5JbnN0YW5jZS0+Q0NSICY9IH5ETUFfQ0NSX0VOOyAgCisgIAkKKyAgCS8qIENvbmZpZ3VyZSB0aGUgc291cmNlLCBkZXN0aW5hdGlvbiBhZGRyZXNzIGFuZCB0aGUgZGF0YSBsZW5ndGggKi8KKyAgCURNQV9TZXRDb25maWcoaGRtYSwgU3JjQWRkcmVzcywgRHN0QWRkcmVzcywgRGF0YUxlbmd0aCk7CisgIAkKKyAgCS8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICAJaGRtYS0+SW5zdGFuY2UtPkNDUiB8PSBETUFfQ0NSX0VOOyAgCisgIH0KKyAgZWxzZQorICB7CisgIAkvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIAlfX0hBTF9VTkxPQ0soaGRtYSk7CisgIAkKKyAgCS8qIFJlbWFpbiBCVVNZICovCisgIAlzdGF0dXMgPSBIQUxfQlVTWTsKKyAgfSAgCisKKyAgcmV0dXJuIHN0YXR1czsgCit9IAorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBETUEgVHJhbnNmZXIgd2l0aCBpbnRlcnJ1cHQgZW5hYmxlZC4KKyAgKiBAcGFyYW0gIGhkbWEgICAgICAgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4gIAorICAqIEBwYXJhbSAgU3JjQWRkcmVzcyBUaGUgc291cmNlIG1lbW9yeSBCdWZmZXIgYWRkcmVzcworICAqIEBwYXJhbSAgRHN0QWRkcmVzcyBUaGUgZGVzdGluYXRpb24gbWVtb3J5IEJ1ZmZlciBhZGRyZXNzCisgICogQHBhcmFtICBEYXRhTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9TdGFydF9JVChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSwgdWludDMyX3QgU3JjQWRkcmVzcywgdWludDMyX3QgRHN0QWRkcmVzcywgdWludDMyX3QgRGF0YUxlbmd0aCkKK3sKKwlIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RNQV9CVUZGRVJfU0laRShEYXRhTGVuZ3RoKSk7CisgIAorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhkbWEpOworICAKKyAgaWYoSEFMX0RNQV9TVEFURV9SRUFEWSA9PSBoZG1hLT5TdGF0ZSkKKyAgeworICAJLyogQ2hhbmdlIERNQSBwZXJpcGhlcmFsIHN0YXRlICovICAKKyAgCWhkbWEtPlN0YXRlID0gSEFMX0RNQV9TVEFURV9CVVNZOworICAJCisgIAloZG1hLT5FcnJvckNvZGUgPSBIQUxfRE1BX0VSUk9SX05PTkU7CisgIAkKKyAgCS8qIERpc2FibGUgdGhlIHBlcmlwaGVyYWwgKi8KKyAgCWhkbWEtPkluc3RhbmNlLT5DQ1IgJj0gfkRNQV9DQ1JfRU47CisgIAkKKyAgCS8qIENvbmZpZ3VyZSB0aGUgc291cmNlLCBkZXN0aW5hdGlvbiBhZGRyZXNzIGFuZCB0aGUgZGF0YSBsZW5ndGggKi8gIAorICAJRE1BX1NldENvbmZpZyhoZG1hLCBTcmNBZGRyZXNzLCBEc3RBZGRyZXNzLCBEYXRhTGVuZ3RoKTsKKyAgCQorICAJLyogRW5hYmxlIHRoZSB0cmFuc2ZlciBjb21wbGV0ZSwgJiB0cmFuc2ZlciBlcnJvciBpbnRlcnJ1cHRzICovCisgIAkvKiBIYWxmIHRyYW5zZmVyIGludGVycnVwdCBpcyBvcHRpb25hbDogZW5hYmxlIGl0IG9ubHkgaWYgYXNzb2NpYXRlZCBjYWxsYmFjayBpcyBhdmFpbGFibGUgKi8KKyAgICBpZihOVUxMICE9IGhkbWEtPlhmZXJIYWxmQ3BsdENhbGxiYWNrICkKKyAgICB7CisgICAgICBoZG1hLT5JbnN0YW5jZS0+Q0NSIHw9IChETUFfSVRfVEMgfCBETUFfSVRfSFQgfCBETUFfSVRfVEUpOworICAgIH0KKyAgCWVsc2UKKyAgCXsKKyAgCQloZG1hLT5JbnN0YW5jZS0+Q0NSIHw9IChETUFfSVRfVEMgfCBETUFfSVRfVEUpOworICAJCWhkbWEtPkluc3RhbmNlLT5DQ1IgJj0gfkRNQV9JVF9IVDsKKyAgCX0KKyAgCQorICAJLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIAloZG1hLT5JbnN0YW5jZS0+Q0NSIHw9IERNQV9DQ1JfRU47CisgIH0KKyAgZWxzZQorICB7CisgIAkvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhkbWEpOyAKKyAgCisgICAgLyogUmVtYWluIEJVU1kgKi8KKyAgICBzdGF0dXMgPSBIQUxfQlVTWTsKKyAgfSAgICAgCisgIAorICByZXR1cm4gc3RhdHVzOyAgICAKK30gCisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgdGhlIERNQSBUcmFuc2Zlci4KKyAgKiBAcGFyYW0gIGhkbWEgIDogcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsLiAgICAgICAgICAgICAgICAgIAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9BYm9ydChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKwkvKiBEaXNhYmxlIERNQSBJVCAqLworCSBoZG1hLT5JbnN0YW5jZS0+Q0NSICY9IH4oRE1BX0lUX1RDIHwgRE1BX0lUX0hUIHwgRE1BX0lUX1RFKTsKKwkKKwkvKiBEaXNhYmxlIHRoZSBjaGFubmVsICovCisJaGRtYS0+SW5zdGFuY2UtPkNDUiAmPSB+RE1BX0NDUl9FTjsKKwkKKwkvKiBDbGVhciBhbGwgZmxhZ3MgKi8KKwloZG1hLT5EbWFCYXNlQWRkcmVzcy0+SUZDUiA9IChETUFfRkxBR19HTDEgPDwgaGRtYS0+Q2hhbm5lbEluZGV4KTsKKwkKKwkvKiBDaGFuZ2UgdGhlIERNQSBzdGF0ZSovCisJaGRtYS0+U3RhdGUgPSBIQUxfRE1BX1NUQVRFX1JFQURZOyAKKwkKKwkvKiBQcm9jZXNzIFVubG9ja2VkICovCisJX19IQUxfVU5MT0NLKGhkbWEpOworCQorCXJldHVybiBIQUxfT0s7IAorfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IHRoZSBETUEgVHJhbnNmZXIgaW4gSW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBoZG1hICA6IHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgU3RyZWFtLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9BYm9ydF9JVChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sgIAorICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIAorICBpZihIQUxfRE1BX1NUQVRFX0JVU1kgIT0gaGRtYS0+U3RhdGUpCisgIHsKKyAgICAvKiBubyB0cmFuc2ZlciBvbmdvaW5nICovCisgICAgaGRtYS0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9OT19YRkVSOworICAgICAgICAKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgZWxzZQorICB7IAorICAKKyAgICAvKiBEaXNhYmxlIERNQSBJVCAqLworICAgIGhkbWEtPkluc3RhbmNlLT5DQ1IgJj0gfihETUFfSVRfVEMgfCBETUFfSVRfSFQgfCBETUFfSVRfVEUpOworICAgIAorICAgIC8qIERpc2FibGUgdGhlIGNoYW5uZWwgKi8KKyAgICBoZG1hLT5JbnN0YW5jZS0+Q0NSICY9IH5ETUFfQ0NSX0VOOworICAgIAorICAgIC8qIENsZWFyIGFsbCBmbGFncyAqLworICAgIGhkbWEtPkRtYUJhc2VBZGRyZXNzLT5JRkNSID0gRE1BX0ZMQUdfR0wxIDw8IGhkbWEtPkNoYW5uZWxJbmRleDsKKyAgICAKKyAgICAvKiBDaGFuZ2UgdGhlIERNQSBzdGF0ZSAqLworICAgIGhkbWEtPlN0YXRlID0gSEFMX0RNQV9TVEFURV9SRUFEWTsKKyAgICAKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhkbWEpOworICAgIAorICAgIC8qIENhbGwgVXNlciBBYm9ydCBjYWxsYmFjayAqLyAKKyAgICBpZihoZG1hLT5YZmVyQWJvcnRDYWxsYmFjayAhPSBOVUxMKQorICAgIHsKKyAgICAgIGhkbWEtPlhmZXJBYm9ydENhbGxiYWNrKGhkbWEpOworICAgIH0gCisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBQb2xsaW5nIGZvciB0cmFuc2ZlciBjb21wbGV0ZS4KKyAgKiBAcGFyYW0gIGhkbWEgICAgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4KKyAgKiBAcGFyYW0gIENvbXBsZXRlTGV2ZWwgU3BlY2lmaWVzIHRoZSBETUEgbGV2ZWwgY29tcGxldGUuICAKKyAgKiBAcGFyYW0gIFRpbWVvdXQgICAgICAgVGltZW91dCBkdXJhdGlvbi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfUG9sbEZvclRyYW5zZmVyKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCB1aW50MzJfdCBDb21wbGV0ZUxldmVsLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0ZW1wOworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKyAgCisgIGlmKEhBTF9ETUFfU1RBVEVfQlVTWSAhPSBoZG1hLT5TdGF0ZSkKKyAgeworICAgIC8qIG5vIHRyYW5zZmVyIG9uZ29pbmcgKi8KKyAgICBoZG1hLT5FcnJvckNvZGUgPSBIQUxfRE1BX0VSUk9SX05PX1hGRVI7CisgICAgX19IQUxfVU5MT0NLKGhkbWEpOworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgCisgIC8qIFBvbGxpbmcgbW9kZSBub3Qgc3VwcG9ydGVkIGluIGNpcmN1bGFyIG1vZGUgKi8KKyAgaWYgKFJFU0VUICE9IChoZG1hLT5JbnN0YW5jZS0+Q0NSICYgRE1BX0NDUl9DSVJDKSkKKyAgeworICAgIGhkbWEtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfTk9UX1NVUFBPUlRFRDsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIAorICAvKiBHZXQgdGhlIGxldmVsIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyAgaWYoSEFMX0RNQV9GVUxMX1RSQU5TRkVSID09IENvbXBsZXRlTGV2ZWwpCisgIHsKKyAgICAvKiBUcmFuc2ZlciBDb21wbGV0ZSBmbGFnICovCisgICAgdGVtcCA9IERNQV9GTEFHX1RDMSA8PCBoZG1hLT5DaGFubmVsSW5kZXg7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogSGFsZiBUcmFuc2ZlciBDb21wbGV0ZSBmbGFnICovCisgICAgdGVtcCA9IERNQV9GTEFHX0hUMSA8PCBoZG1hLT5DaGFubmVsSW5kZXg7CisgIH0KKworICAvKiBHZXQgdGljayAqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIHdoaWxlKFJFU0VUID09IChoZG1hLT5EbWFCYXNlQWRkcmVzcy0+SVNSICYgdGVtcCkpCisgIHsKKyAgICBpZihSRVNFVCAhPSAoaGRtYS0+RG1hQmFzZUFkZHJlc3MtPklTUiAmIChETUFfRkxBR19URTEgPDwgaGRtYS0+Q2hhbm5lbEluZGV4KSkpCisgICAgeyAgICAgIAorICAgICAgLyogV2hlbiBhIERNQSB0cmFuc2ZlciBlcnJvciBvY2N1cnMgKi8KKyAgICAgIC8qIEEgaGFyZHdhcmUgY2xlYXIgb2YgaXRzIEVOIGJpdHMgaXMgcGVyZm9ybWVkICovCisgICAgICAvKiBDbGVhciBhbGwgZmxhZ3MgKi8KKyAgICAgIGhkbWEtPkRtYUJhc2VBZGRyZXNzLT5JRkNSID0gRE1BX0ZMQUdfR0wxIDw8IGhkbWEtPkNoYW5uZWxJbmRleDsKKyAgICAgIAorICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICAgIGhkbWEtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfVEU7CisKKyAgICAgIC8qIENoYW5nZSB0aGUgRE1BIHN0YXRlICovCisgICAgICBoZG1hLT5TdGF0ZT0gSEFMX0RNQV9TVEFURV9SRUFEWTsgICAgICAgCisgICAgICAKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoZG1hKTsKKyAgICAgIAorICAgICAgcmV0dXJuIEhBTF9FUlJPUjsgICAgICAKKyAgICB9ICAgICAgCisgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCisgICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmKChUaW1lb3V0ID09IDBVKSB8fCAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkpCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovCisgICAgICAgIGhkbWEtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfVElNRU9VVDsKKyAgICAgICAgCisgICAgICAgIC8qIENoYW5nZSB0aGUgRE1BIHN0YXRlICovCisgICAgICAgIGhkbWEtPlN0YXRlID0gSEFMX0RNQV9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoZG1hKTsKKworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmKEhBTF9ETUFfRlVMTF9UUkFOU0ZFUiA9PSBDb21wbGV0ZUxldmVsKQorICB7CisgICAgLyogQ2xlYXIgdGhlIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyAgICBoZG1hLT5EbWFCYXNlQWRkcmVzcy0+SUZDUiA9IERNQV9GTEFHX1RDMSA8PCBoZG1hLT5DaGFubmVsSW5kZXg7CisKKyAgICAvKiBUaGUgc2VsZWN0ZWQgQ2hhbm5lbHggRU4gYml0IGlzIGNsZWFyZWQgKERNQSBpcyBkaXNhYmxlZCBhbmQgCisgICAgYWxsIHRyYW5zZmVycyBhcmUgY29tcGxldGUpICovCisgICAgaGRtYS0+U3RhdGUgPSBIQUxfRE1BX1NUQVRFX1JFQURZOworICB9CisgIGVsc2UKKyAgeyAKKyAgICAvKiBDbGVhciB0aGUgaGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisgICAgaGRtYS0+RG1hQmFzZUFkZHJlc3MtPklGQ1IgPSBETUFfRkxBR19IVDEgPDwgaGRtYS0+Q2hhbm5lbEluZGV4OworICB9CisgIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoZG1hKTsgIAorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIERNQSBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4gIAorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfRE1BX0lSUUhhbmRsZXIoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisJdWludDMyX3QgZmxhZ19pdCA9IGhkbWEtPkRtYUJhc2VBZGRyZXNzLT5JU1I7CisgIHVpbnQzMl90IHNvdXJjZV9pdCA9IGhkbWEtPkluc3RhbmNlLT5DQ1I7CisgICAgICAgICAgCisgIC8qIEhhbGYgVHJhbnNmZXIgQ29tcGxldGUgSW50ZXJydXB0IG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICBpZiAoKFJFU0VUICE9IChmbGFnX2l0ICYgKERNQV9GTEFHX0hUMSA8PCBoZG1hLT5DaGFubmVsSW5kZXgpKSkgJiYgKFJFU0VUICE9IChzb3VyY2VfaXQgJiBETUFfSVRfSFQpKSkKKyAgeworICAJLyogRGlzYWJsZSB0aGUgaGFsZiB0cmFuc2ZlciBpbnRlcnJ1cHQgaWYgdGhlIERNQSBtb2RlIGlzIG5vdCBDSVJDVUxBUiAqLworICAJaWYoKGhkbWEtPkluc3RhbmNlLT5DQ1IgJiBETUFfQ0NSX0NJUkMpID09IDBVKQorICAJeworICAJCS8qIERpc2FibGUgdGhlIGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0ICovCisgIAkJaGRtYS0+SW5zdGFuY2UtPkNDUiAmPSB+RE1BX0lUX0hUOworICAJfQorICAJCisgIAkvKiBDbGVhciB0aGUgaGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisgIAloZG1hLT5EbWFCYXNlQWRkcmVzcy0+SUZDUiA9IERNQV9GTEFHX0hUMSA8PCBoZG1hLT5DaGFubmVsSW5kZXg7CisgIAkKKyAgCS8qIERNQSBwZXJpcGhlcmFsIHN0YXRlIGlzIG5vdCB1cGRhdGVkIGluIEhhbGYgVHJhbnNmZXIgKi8KKyAgCS8qIFN0YXRlIGlzIHVwZGF0ZWQgb25seSBpbiBUcmFuc2ZlciBDb21wbGV0ZSBjYXNlICovCisgIAkKKyAgCWlmKGhkbWEtPlhmZXJIYWxmQ3BsdENhbGxiYWNrICE9IE5VTEwpCisgIAl7CisgIAkJLyogSGFsZiB0cmFuc2ZlciBjYWxsYmFjayAqLworICAJCWhkbWEtPlhmZXJIYWxmQ3BsdENhbGxiYWNrKGhkbWEpOworICAJfQorICB9CisgIAorICAvKiBUcmFuc2ZlciBDb21wbGV0ZSBJbnRlcnJ1cHQgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgZWxzZSBpZiAoKFJFU0VUICE9IChmbGFnX2l0ICYgKERNQV9GTEFHX1RDMSA8PCBoZG1hLT5DaGFubmVsSW5kZXgpKSkgJiYgKFJFU0VUICE9IChzb3VyY2VfaXQgJiBETUFfSVRfVEMpKSkKKyAgeworICAJaWYoKGhkbWEtPkluc3RhbmNlLT5DQ1IgJiBETUFfQ0NSX0NJUkMpID09IDBVKQorICAJeworICAJCS8qIERpc2FibGUgdGhlIHRyYW5zZmVyIGNvbXBsZXRlICAmIHRyYW5zZmVyIGVycm9yIGludGVycnVwdHMgKi8KKyAgCQkvKiBpZiB0aGUgRE1BIG1vZGUgaXMgbm90IENJUkNVTEFSICovCisgIAkJaGRtYS0+SW5zdGFuY2UtPkNDUiAmPSB+KERNQV9JVF9UQyB8IERNQV9JVF9URSk7CisgIAkJCisgIAkJLyogQ2hhbmdlIHRoZSBETUEgc3RhdGUgKi8KKyAgCQloZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfUkVBRFk7CisgIAl9CisgIAkKKyAgCS8qIENsZWFyIHRoZSB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisgIAloZG1hLT5EbWFCYXNlQWRkcmVzcy0+SUZDUiA9IERNQV9GTEFHX1RDMSA8PCBoZG1hLT5DaGFubmVsSW5kZXg7CisgIAkKKyAgCS8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgCV9fSEFMX1VOTE9DSyhoZG1hKTsKKyAgCQorICAJaWYoaGRtYS0+WGZlckNwbHRDYWxsYmFjayAhPSBOVUxMKQorICAJeworICAJCS8qIFRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgIAkJaGRtYS0+WGZlckNwbHRDYWxsYmFjayhoZG1hKTsKKyAgCX0KKyAgfQorICAKKyAgLyogVHJhbnNmZXIgRXJyb3IgSW50ZXJydXB0IG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICBlbHNlIGlmICgoIFJFU0VUICE9IChmbGFnX2l0ICYgKERNQV9GTEFHX1RFMSA8PCBoZG1hLT5DaGFubmVsSW5kZXgpKSkgJiYgKFJFU0VUICE9IChzb3VyY2VfaXQgJiBETUFfSVRfVEUpKSkKKyAgeworICAJLyogV2hlbiBhIERNQSB0cmFuc2ZlciBlcnJvciBvY2N1cnMgKi8KKyAgICAvKiBBIGhhcmR3YXJlIGNsZWFyIG9mIGl0cyBFTiBiaXRzIGlzIHBlcmZvcm1lZCAqLworICAgIC8qIFRoZW4sIGRpc2FibGUgYWxsIERNQSBpbnRlcnJ1cHRzICovCisgICAgaGRtYS0+SW5zdGFuY2UtPkNDUiAmPSB+KERNQV9JVF9UQyB8IERNQV9JVF9IVCB8IERNQV9JVF9URSk7CisgICAgCisgICAgLyogQ2xlYXIgYWxsIGZsYWdzICovCisgICAgaGRtYS0+RG1hQmFzZUFkZHJlc3MtPklGQ1IgPSBETUFfRkxBR19HTDEgPDwgaGRtYS0+Q2hhbm5lbEluZGV4OworICAgIAorICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovCisgICAgaGRtYS0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9URTsKKyAgICAKKyAgICAvKiBDaGFuZ2UgdGhlIERNQSBzdGF0ZSAqLworICAgIGhkbWEtPlN0YXRlID0gSEFMX0RNQV9TVEFURV9SRUFEWTsgICAgCisgICAgCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoZG1hKTsgCisgICAgCisgICAgaWYoaGRtYS0+WGZlckVycm9yQ2FsbGJhY2sgIT0gTlVMTCkKKyAgICB7CisgICAgCS8qIFRyYW5zZmVyIGVycm9yIGNhbGxiYWNrICovCisgICAgCWhkbWEtPlhmZXJFcnJvckNhbGxiYWNrKGhkbWEpOworICAgIH0KKyAgfQorfSAgCisKKy8qKgorICAqIEBicmllZiAgUmVnaXN0ZXIgY2FsbGJhY2tzCisgICogQHBhcmFtICBoZG1hICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgU3RyZWFtLgorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCAgICAgICAgICAgVXNlciBDYWxsYmFjayBpZGVudGlmZXIKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIEhBTF9ETUFfQ2FsbGJhY2tJRFR5cGVEZWYgRU5VTSBhcyBwYXJhbWV0ZXIuCisgICogQHBhcmFtICBwQ2FsbGJhY2sgICAgICAgICAgICBwb2ludGVyIHRvIHByaXZhdGUgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggaGFzIHBvaW50ZXIgdG8gCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgYXMgcGFyYW1ldGVyLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX1JlZ2lzdGVyQ2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsIEhBTF9ETUFfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgdm9pZCAoKiBwQ2FsbGJhY2spKCBETUFfSGFuZGxlVHlwZURlZiAqIF9oZG1hKSkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworICAKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoZG1hKTsKKyAgCisgIGlmKEhBTF9ETUFfU1RBVEVfUkVBRFkgPT0gaGRtYS0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICBjYXNlICBIQUxfRE1BX1hGRVJfQ1BMVF9DQl9JRDoKKyAgICAgICAgICAgaGRtYS0+WGZlckNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgCisgICAgIGNhc2UgIEhBTF9ETUFfWEZFUl9IQUxGQ1BMVF9DQl9JRDoKKyAgICAgICAgICAgaGRtYS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgICAgIGJyZWFrOyAgICAgICAgIAorCisgICAgIGNhc2UgIEhBTF9ETUFfWEZFUl9FUlJPUl9DQl9JRDoKKyAgICAgICAgICAgaGRtYS0+WGZlckVycm9yQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgICAgIGJyZWFrOyAgICAgICAgIAorICAgICAgICAgICAKKyAgICAgY2FzZSAgSEFMX0RNQV9YRkVSX0FCT1JUX0NCX0lEOgorICAgICAgICAgICBoZG1hLT5YZmVyQWJvcnRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgICAgYnJlYWs7IAorICAgICAgICAgICAKKyAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9IAorICAKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoZG1hKTsKKyAgCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5SZWdpc3RlciBjYWxsYmFja3MKKyAgKiBAcGFyYW0gIGhkbWEgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBTdHJlYW0uCisgICogQHBhcmFtICBDYWxsYmFja0lEICAgICAgICAgICBVc2VyIENhbGxiYWNrIGlkZW50aWZlcgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgSEFMX0RNQV9DYWxsYmFja0lEVHlwZURlZiBFTlVNIGFzIHBhcmFtZXRlci4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8gICAgICAgICAgICAgIAorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9VblJlZ2lzdGVyQ2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsIEhBTF9ETUFfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoZG1hKTsKKyAgCisgIGlmKEhBTF9ETUFfU1RBVEVfUkVBRFkgPT0gaGRtYS0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICBjYXNlICBIQUxfRE1BX1hGRVJfQ1BMVF9DQl9JRDoKKyAgICAgICAgICAgaGRtYS0+WGZlckNwbHRDYWxsYmFjayA9IE5VTEw7CisgICAgICAgICAgIGJyZWFrOworICAgICAgIAorICAgICBjYXNlICBIQUxfRE1BX1hGRVJfSEFMRkNQTFRfQ0JfSUQ6CisgICAgICAgICAgIGhkbWEtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgICAgYnJlYWs7ICAgICAgICAgCisKKyAgICAgY2FzZSAgSEFMX0RNQV9YRkVSX0VSUk9SX0NCX0lEOgorICAgICAgICAgICBoZG1hLT5YZmVyRXJyb3JDYWxsYmFjayA9IE5VTEw7CisgICAgICAgICAgIGJyZWFrOyAgICAgICAgIAorICAgICAgICAgICAKKyAgICAgY2FzZSAgSEFMX0RNQV9YRkVSX0FCT1JUX0NCX0lEOgorICAgICAgICAgICBoZG1hLT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgICAgICAgIGJyZWFrOyAKKyAgICAgCisgICAgY2FzZSAgIEhBTF9ETUFfWEZFUl9BTExfQ0JfSUQ6CisgICAgICAgICAgIGhkbWEtPlhmZXJDcGx0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgICAgICBoZG1hLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IE5VTEw7CisgICAgICAgICAgIGhkbWEtPlhmZXJFcnJvckNhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgICAgaGRtYS0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgICAgICBicmVhazsgCisgICAgIAorICAgIGRlZmF1bHQ6CisgICAgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfSAKKyAgCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaGRtYSk7CisgIAorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zIAorICoKK0B2ZXJiYXRpbSAgIAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgIyMjIyMgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bworICAgICAgKCspIENoZWNrIHRoZSBETUEgc3RhdGUKKyAgICAgICgrKSBHZXQgZXJyb3IgY29kZQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLyAgCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyB0aGUgRE1BIHN0YXRlLgorICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsLiAgCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9ETUFfU3RhdGVUeXBlRGVmIEhBTF9ETUFfR2V0U3RhdGUoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIHJldHVybiBoZG1hLT5TdGF0ZTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIERNQSBlcnJvciBjb2RlCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4KKyAgKiBAcmV0dmFsIERNQSBFcnJvciBDb2RlCisgICovCit1aW50MzJfdCBIQUxfRE1BX0dldEVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICByZXR1cm4gaGRtYS0+RXJyb3JDb2RlOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgRE1BX1ByaXZhdGVfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIERNQSBUcmFuc2ZlciBwYXJhbWV0ZXJzLgorICAqIEBwYXJhbSAgaGRtYSAgICAgICBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsLiAgCisgICogQHBhcmFtICBTcmNBZGRyZXNzIFRoZSBzb3VyY2UgbWVtb3J5IEJ1ZmZlciBhZGRyZXNzCisgICogQHBhcmFtICBEc3RBZGRyZXNzIFRoZSBkZXN0aW5hdGlvbiBtZW1vcnkgQnVmZmVyIGFkZHJlc3MKKyAgKiBAcGFyYW0gIERhdGFMZW5ndGggVGhlIGxlbmd0aCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgdm9pZCBETUFfU2V0Q29uZmlnKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCB1aW50MzJfdCBTcmNBZGRyZXNzLCB1aW50MzJfdCBEc3RBZGRyZXNzLCB1aW50MzJfdCBEYXRhTGVuZ3RoKQoreworCS8qIENsZWFyIGFsbCBmbGFncyAqLworICBoZG1hLT5EbWFCYXNlQWRkcmVzcy0+SUZDUiAgPSAoRE1BX0ZMQUdfR0wxIDw8IGhkbWEtPkNoYW5uZWxJbmRleCk7CisgIAorICAvKiBDb25maWd1cmUgRE1BIENoYW5uZWwgZGF0YSBsZW5ndGggKi8KKyAgaGRtYS0+SW5zdGFuY2UtPkNORFRSID0gRGF0YUxlbmd0aDsKKyAgCisgIC8qIFBlcmlwaGVyYWwgdG8gTWVtb3J5ICovCisgIGlmKChoZG1hLT5Jbml0LkRpcmVjdGlvbikgPT0gRE1BX01FTU9SWV9UT19QRVJJUEgpCisgIHsgICAKKyAgICAvKiBDb25maWd1cmUgRE1BIENoYW5uZWwgZGVzdGluYXRpb24gYWRkcmVzcyAqLworICAgIGhkbWEtPkluc3RhbmNlLT5DUEFSID0gRHN0QWRkcmVzczsKKyAgICAKKyAgICAvKiBDb25maWd1cmUgRE1BIENoYW5uZWwgc291cmNlIGFkZHJlc3MgKi8KKyAgICBoZG1hLT5JbnN0YW5jZS0+Q01BUiA9IFNyY0FkZHJlc3M7CisgIH0KKyAgLyogTWVtb3J5IHRvIFBlcmlwaGVyYWwgKi8KKyAgZWxzZQorICB7CisgICAgLyogQ29uZmlndXJlIERNQSBDaGFubmVsIHNvdXJjZSBhZGRyZXNzICovCisgICAgaGRtYS0+SW5zdGFuY2UtPkNQQVIgPSBTcmNBZGRyZXNzOworICAgIAorICAgIC8qIENvbmZpZ3VyZSBETUEgQ2hhbm5lbCBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisgICAgaGRtYS0+SW5zdGFuY2UtPkNNQVIgPSBEc3RBZGRyZXNzOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBETUEgYmFzZSBhZGRyZXNzIGFuZCBjaGFubmVsIGluZGV4IGRlcGVuZGluZyBvbiBETUEgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIGhkbWEgICAgICAgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgU3RyZWFtLiAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIERNQV9DYWxjQmFzZUFuZEJpdHNoaWZ0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworI2lmIGRlZmluZWQgKERNQTIpCisgIC8qIGNhbGN1bGF0aW9uIG9mIHRoZSBjaGFubmVsIGluZGV4ICovCisgIGlmICgodWludDMyX3QpKGhkbWEtPkluc3RhbmNlKSA8ICh1aW50MzJfdCkoRE1BMl9DaGFubmVsMSkpCisgIHsKKyAgICAvKiBETUExICovCisgICAgaGRtYS0+Q2hhbm5lbEluZGV4ID0gKCgodWludDMyX3QpaGRtYS0+SW5zdGFuY2UgLSAodWludDMyX3QpRE1BMV9DaGFubmVsMSkgLyAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIgLSAodWludDMyX3QpRE1BMV9DaGFubmVsMSkpIDw8IDJVOworICAgIGhkbWEtPkRtYUJhc2VBZGRyZXNzID0gRE1BMTsKKyAgfQorICBlbHNlIAorICB7CisgICAgLyogRE1BMiAqLworICAgIGhkbWEtPkNoYW5uZWxJbmRleCA9ICgoKHVpbnQzMl90KWhkbWEtPkluc3RhbmNlIC0gKHVpbnQzMl90KURNQTJfQ2hhbm5lbDEpIC8gKCh1aW50MzJfdClETUEyX0NoYW5uZWwyIC0gKHVpbnQzMl90KURNQTJfQ2hhbm5lbDEpKSA8PCAyVTsKKyAgICBoZG1hLT5EbWFCYXNlQWRkcmVzcyA9IERNQTI7CisgIH0KKyNlbHNlCisgIC8qIGNhbGN1bGF0aW9uIG9mIHRoZSBjaGFubmVsIGluZGV4ICovCisgIC8qIERNQTEgKi8KKyAgaGRtYS0+Q2hhbm5lbEluZGV4ID0gKCgodWludDMyX3QpaGRtYS0+SW5zdGFuY2UgLSAodWludDMyX3QpRE1BMV9DaGFubmVsMSkgLyAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIgLSAodWludDMyX3QpRE1BMV9DaGFubmVsMSkpIDw8IDJVOworICBoZG1hLT5EbWFCYXNlQWRkcmVzcyA9IERNQTE7CisjZW5kaWYKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBIQUxfRE1BX01PRFVMRV9FTkFCTEVEICovCisKKy8qKgorICAqIEB9CisgICovCisgIAorICAvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjN4eF9oYWxfZmxhc2guYyBiL1NyYy9zdG0zMmYzeHhfaGFsX2ZsYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkxZGM2OQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfaGFsX2ZsYXNoLmMKQEAgLTAsMCArMSw3MTEgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX2ZsYXNoLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEZMQVNIIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcgCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBpbnRlcm5hbCBGTEFTSCBtZW1vcnk6CisgICogICAgICAgICAgICsgUHJvZ3JhbSBvcGVyYXRpb25zIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIE1lbW9yeSBDb250cm9sIGZ1bmN0aW9ucyAKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICAqICAgICAgICAgCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEZMQVNIIHBlcmlwaGVyYWwgZmVhdHVyZXMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0gVGhlIEZsYXNoIG1lbW9yeSBpbnRlcmZhY2UgbWFuYWdlcyBDUFUgQUhCIEktQ29kZSBhbmQgRC1Db2RlIGFjY2Vzc2VzIAorICAgICAgIHRvIHRoZSBGbGFzaCBtZW1vcnkuIEl0IGltcGxlbWVudHMgdGhlIGVyYXNlIGFuZCBwcm9ncmFtIEZsYXNoIG1lbW9yeSBvcGVyYXRpb25zIAorICAgICAgIGFuZCB0aGUgcmVhZCBhbmQgd3JpdGUgcHJvdGVjdGlvbiBtZWNoYW5pc21zLgorCisgIFsuLl0gVGhlIEZsYXNoIG1lbW9yeSBpbnRlcmZhY2UgYWNjZWxlcmF0ZXMgY29kZSBleGVjdXRpb24gd2l0aCBhIHN5c3RlbSBvZiBpbnN0cnVjdGlvbgorICAgICAgcHJlZmV0Y2guIAorCisgIFsuLl0gVGhlIEZMQVNIIG1haW4gZmVhdHVyZXMgYXJlOgorICAgICAgKCspIEZsYXNoIG1lbW9yeSByZWFkIG9wZXJhdGlvbnMKKyAgICAgICgrKSBGbGFzaCBtZW1vcnkgcHJvZ3JhbS9lcmFzZSBvcGVyYXRpb25zCisgICAgICAoKykgUmVhZCAvIHdyaXRlIHByb3RlY3Rpb25zCisgICAgICAoKykgUHJlZmV0Y2ggb24gSS1Db2RlCisgICAgICAoKykgT3B0aW9uIEJ5dGVzIHByb2dyYW1taW5nCisKKworICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBUaGlzIGRyaXZlciBwcm92aWRlcyBmdW5jdGlvbnMgYW5kIG1hY3JvcyB0byBjb25maWd1cmUgYW5kIHByb2dyYW0gdGhlIEZMQVNIIAorICAgICAgbWVtb3J5IG9mIGFsbCBTVE0zMkYzeHggZGV2aWNlcy4KKyAgICAKKyAgICAgICgjKSBGTEFTSCBNZW1vcnkgSS9PIFByb2dyYW1taW5nIGZ1bmN0aW9uczogdGhpcyBncm91cCBpbmNsdWRlcyBhbGwgbmVlZGVkCisgICAgICAgICAgZnVuY3Rpb25zIHRvIGVyYXNlIGFuZCBwcm9ncmFtIHRoZSBtYWluIG1lbW9yeToKKyAgICAgICAgKCsrKSBMb2NrIGFuZCBVbmxvY2sgdGhlIEZMQVNIIGludGVyZmFjZQorICAgICAgICAoKyspIEVyYXNlIGZ1bmN0aW9uOiBFcmFzZSBwYWdlLCBlcmFzZSBhbGwgcGFnZXMKKyAgICAgICAgKCsrKSBQcm9ncmFtIGZ1bmN0aW9uczogaGFsZiB3b3JkLCB3b3JkIGFuZCBkb3VibGV3b3JkCisgICAgICAoIykgRkxBU0ggT3B0aW9uIEJ5dGVzIFByb2dyYW1taW5nIGZ1bmN0aW9uczogdGhpcyBncm91cCBpbmNsdWRlcyBhbGwgbmVlZGVkCisgICAgICAgICAgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgT3B0aW9uIEJ5dGVzOgorICAgICAgICAoKyspIExvY2sgYW5kIFVubG9jayB0aGUgT3B0aW9uIEJ5dGVzCisgICAgICAgICgrKykgU2V0L1Jlc2V0IHRoZSB3cml0ZSBwcm90ZWN0aW9uCisgICAgICAgICgrKykgU2V0IHRoZSBSZWFkIHByb3RlY3Rpb24gTGV2ZWwKKyAgICAgICAgKCsrKSBQcm9ncmFtIHRoZSB1c2VyIE9wdGlvbiBCeXRlcworICAgICAgICAoKyspIExhdW5jaCB0aGUgT3B0aW9uIEJ5dGVzIGxvYWRlcgorICAgICAgICAoKyspIEVyYXNlIE9wdGlvbiBCeXRlcworICAgICAgICAoKyspIFByb2dyYW0gdGhlIGRhdGEgT3B0aW9uIEJ5dGVzCisgICAgICAgICgrKykgR2V0IHRoZSBXcml0ZSBwcm90ZWN0aW9uLgorICAgICAgICAoKyspIEdldCB0aGUgdXNlciBvcHRpb24gYnl0ZXMuCisgICAgCisgICAgICAoIykgSW50ZXJydXB0cyBhbmQgZmxhZ3MgbWFuYWdlbWVudCBmdW5jdGlvbnMgOiB0aGlzIGdyb3VwIAorICAgICAgICAgIGluY2x1ZGVzIGFsbCBuZWVkZWQgZnVuY3Rpb25zIHRvOgorICAgICAgICAoKyspIEhhbmRsZSBGTEFTSCBpbnRlcnJ1cHRzCisgICAgICAgICgrKykgV2FpdCBmb3IgbGFzdCBGTEFTSCBvcGVyYXRpb24gYWNjb3JkaW5nIHRvIGl0cyBzdGF0dXMKKyAgICAgICAgKCsrKSBHZXQgZXJyb3IgZmxhZyBzdGF0dXMKKworICBbLi5dIEluIGFkZGl0aW9uIHRvIHRoZXNlIGZ1bmN0aW9uLCB0aGlzIGRyaXZlciBpbmNsdWRlcyBhIHNldCBvZiBtYWNyb3MgYWxsb3dpbmcKKyAgICAgICB0byBoYW5kbGUgdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zOgorICAgICAgCisgICAgICAoKykgU2V0L0dldCB0aGUgbGF0ZW5jeQorICAgICAgKCspIEVuYWJsZS9EaXNhYmxlIHRoZSBwcmVmZXRjaCBidWZmZXIKKyAgICAgICgrKSBFbmFibGUvRGlzYWJsZSB0aGUgaGFsZiBjeWNsZSBhY2Nlc3MKKyAgICAgICgrKSBFbmFibGUvRGlzYWJsZSB0aGUgRkxBU0ggaW50ZXJydXB0cworICAgICAgKCspIE1vbml0b3IgdGhlIEZMQVNIIGZsYWdzIHN0YXR1cworICAgICAgICAgIAorICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfRkxBU0hfTU9EVUxFX0VOQUJMRUQKKworLyoqIEBkZWZncm91cCBGTEFTSCBGTEFTSAorICAqIEBicmllZiBGTEFTSCBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBGTEFTSF9Qcml2YXRlX0NvbnN0YW50cyBGTEFTSCBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRkxBU0hfUHJpdmF0ZV9NYWNyb3MgRkxBU0ggUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworIAorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRkxBU0hfUHJpdmF0ZV9WYXJpYWJsZXMgRkxBU0ggUHJpdmF0ZSBWYXJpYWJsZXMKKyAgKiBAeworICAqLworLyogVmFyaWFibGVzIHVzZWQgZm9yIEVyYXNlIHBhZ2VzIHVuZGVyIGludGVycnVwdGlvbiovCitGTEFTSF9Qcm9jZXNzVHlwZURlZiBwRmxhc2g7CisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBGTEFTSF9Qcml2YXRlX0Z1bmN0aW9ucyBGTEFTSCBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCitzdGF0aWMgIHZvaWQgICBGTEFTSF9Qcm9ncmFtX0hhbGZXb3JkKHVpbnQzMl90IEFkZHJlc3MsIHVpbnQxNl90IERhdGEpOworc3RhdGljICB2b2lkICAgRkxBU0hfU2V0RXJyb3JDb2RlKHZvaWQpOworZXh0ZXJuIHZvaWQgICAgRkxBU0hfUGFnZUVyYXNlKHVpbnQzMl90IFBhZ2VBZGRyZXNzKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBGTEFTSF9FeHBvcnRlZF9GdW5jdGlvbnMgRkxBU0ggRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIEZMQVNIX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgUHJvZ3JhbW1pbmcgb3BlcmF0aW9uIGZ1bmN0aW9ucyAKKyAgKiAgQGJyaWVmICAgUHJvZ3JhbW1pbmcgb3BlcmF0aW9uIGZ1bmN0aW9ucyAKKyAgKgorQHZlcmJhdGltICAgCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFByb2dyYW0gaGFsZndvcmQsIHdvcmQgb3IgZG91YmxlIHdvcmQgYXQgYSBzcGVjaWZpZWQgYWRkcmVzcworICAqIEBub3RlICAgVGhlIGZ1bmN0aW9uIEhBTF9GTEFTSF9VbmxvY2soKSBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB0byB1bmxvY2sgdGhlIEZMQVNIIGludGVyZmFjZQorICAqICAgICAgICAgVGhlIGZ1bmN0aW9uIEhBTF9GTEFTSF9Mb2NrKCkgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciB0byBsb2NrIHRoZSBGTEFTSCBpbnRlcmZhY2UKKyAgKgorICAqIEBub3RlICAgSWYgYW4gZXJhc2UgYW5kIGEgcHJvZ3JhbSBvcGVyYXRpb25zIGFyZSByZXF1ZXN0ZWQgc2ltdWx0YW5lb3VzbHksICAgIAorICAqICAgICAgICAgdGhlIGVyYXNlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgYmVmb3JlIHRoZSBwcm9ncmFtIG9uZS4KKyAgKiAgCisgICogQG5vdGUgICBGTEFTSCBzaG91bGQgYmUgcHJldmlvdXNseSBlcmFzZWQgYmVmb3JlIG5ldyBwcm9ncmFtbWluZyAob25seSBleGNlcHRpb24gdG8gdGhpcyAKKyAgKiAgICAgICAgIGlzIHdoZW4gMHgwMDAwIGlzIHByb2dyYW1tZWQpCisgICoKKyAgKiBAcGFyYW0gIFR5cGVQcm9ncmFtICAgSW5kaWNhdGUgdGhlIHdheSB0byBwcm9ncmFtIGF0IGEgc3BlY2lmaWVkIGFkZHJlc3MuCisgICogICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRkxBU0hfVHlwZV9Qcm9ncmFtCisgICogQHBhcmFtICBBZGRyZXNzICAgICAgIFNwZWNpZmllIHRoZSBhZGRyZXNzIHRvIGJlIHByb2dyYW1tZWQuCisgICogQHBhcmFtICBEYXRhICAgICAgICAgIFNwZWNpZmllIHRoZSBkYXRhIHRvIGJlIHByb2dyYW1tZWQKKyAgKiAKKyAgKiBAcmV0dmFsIEhBTF9TdGF0dXNUeXBlRGVmIEhBTCBTdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSF9Qcm9ncmFtKHVpbnQzMl90IFR5cGVQcm9ncmFtLCB1aW50MzJfdCBBZGRyZXNzLCB1aW50NjRfdCBEYXRhKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfRVJST1I7CisgIHVpbnQ4X3QgaW5kZXggPSAwVTsKKyAgdWludDhfdCBuYml0ZXJhdGlvbnMgPSAwVTsKKyAgCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soJnBGbGFzaCk7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX1RZUEVQUk9HUkFNKFR5cGVQcm9ncmFtKSk7CisgIGFzc2VydF9wYXJhbShJU19GTEFTSF9QUk9HUkFNX0FERFJFU1MoQWRkcmVzcykpOworCisgICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovCisgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oRkxBU0hfVElNRU9VVF9WQUxVRSk7CisgIAorICBpZihzdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgaWYoVHlwZVByb2dyYW0gPT0gRkxBU0hfVFlQRVBST0dSQU1fSEFMRldPUkQpCisgICAgeworICAgICAgLyogUHJvZ3JhbSBoYWxmd29yZCAoMTYtYml0KSBhdCBhIHNwZWNpZmllZCBhZGRyZXNzLiAqLworICAgICAgbmJpdGVyYXRpb25zID0gMVU7CisgICAgfQorICAgIGVsc2UgaWYoVHlwZVByb2dyYW0gPT0gRkxBU0hfVFlQRVBST0dSQU1fV09SRCkKKyAgICB7CisgICAgICAvKiBQcm9ncmFtIHdvcmQgKDMyLWJpdCA9IDIqMTYtYml0KSBhdCBhIHNwZWNpZmllZCBhZGRyZXNzLiAqLworICAgICAgbmJpdGVyYXRpb25zID0gMlU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBQcm9ncmFtIGRvdWJsZSB3b3JkICg2NC1iaXQgPSA0KjE2LWJpdCkgYXQgYSBzcGVjaWZpZWQgYWRkcmVzcy4gKi8KKyAgICAgIG5iaXRlcmF0aW9ucyA9IDRVOworICAgIH0KKworICAgIGZvciAoaW5kZXggPSAwVTsgaW5kZXggPCBuYml0ZXJhdGlvbnM7IGluZGV4KyspCisgICAgeworICAgICAgRkxBU0hfUHJvZ3JhbV9IYWxmV29yZCgoQWRkcmVzcyArICgyVSppbmRleCkpLCAodWludDE2X3QpKERhdGEgPj4gKDE2VSppbmRleCkpKTsKKworICAgICAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgICAgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oRkxBU0hfVElNRU9VVF9WQUxVRSk7CisgICAgCisgICAgICAgIC8qIElmIHRoZSBwcm9ncmFtIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIGRpc2FibGUgdGhlIFBHIEJpdCAqLworICAgICAgICBDTEVBUl9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9QRyk7CisgICAgICAvKiBJbiBjYXNlIG9mIGVycm9yLCBzdG9wIHByb2dyYW1taW5nIHByb2NlZHVyZSAqLworICAgICAgaWYgKHN0YXR1cyAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKCZwRmxhc2gpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgUHJvZ3JhbSBoYWxmd29yZCwgd29yZCBvciBkb3VibGUgd29yZCBhdCBhIHNwZWNpZmllZCBhZGRyZXNzICB3aXRoIGludGVycnVwdCBlbmFibGVkLgorICAqIEBub3RlICAgVGhlIGZ1bmN0aW9uIEhBTF9GTEFTSF9VbmxvY2soKSBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB0byB1bmxvY2sgdGhlIEZMQVNIIGludGVyZmFjZQorICAqICAgICAgICAgVGhlIGZ1bmN0aW9uIEhBTF9GTEFTSF9Mb2NrKCkgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciB0byBsb2NrIHRoZSBGTEFTSCBpbnRlcmZhY2UKKyAgKgorICAqIEBub3RlICAgSWYgYW4gZXJhc2UgYW5kIGEgcHJvZ3JhbSBvcGVyYXRpb25zIGFyZSByZXF1ZXN0ZWQgc2ltdWx0YW5lb3VzbHksICAgIAorICAqICAgICAgICAgdGhlIGVyYXNlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgYmVmb3JlIHRoZSBwcm9ncmFtIG9uZS4KKyAgKgorICAqIEBwYXJhbSAgVHlwZVByb2dyYW0gIEluZGljYXRlIHRoZSB3YXkgdG8gcHJvZ3JhbSBhdCBhIHNwZWNpZmllZCBhZGRyZXNzLgorICAqICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRkxBU0hfVHlwZV9Qcm9ncmFtCisgICogQHBhcmFtICBBZGRyZXNzICAgICAgU3BlY2lmaWUgdGhlIGFkZHJlc3MgdG8gYmUgcHJvZ3JhbW1lZC4KKyAgKiBAcGFyYW0gIERhdGEgICAgICAgICBTcGVjaWZpZSB0aGUgZGF0YSB0byBiZSBwcm9ncmFtbWVkCisgICogCisgICogQHJldHZhbCBIQUxfU3RhdHVzVHlwZURlZiBIQUwgU3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hfUHJvZ3JhbV9JVCh1aW50MzJfdCBUeXBlUHJvZ3JhbSwgdWludDMyX3QgQWRkcmVzcywgdWludDY0X3QgRGF0YSkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworICAKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSygmcEZsYXNoKTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfVFlQRVBST0dSQU0oVHlwZVByb2dyYW0pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX1BST0dSQU1fQUREUkVTUyhBZGRyZXNzKSk7CisKKyAgLyogRW5hYmxlIEVuZCBvZiBGTEFTSCBPcGVyYXRpb24gYW5kIEVycm9yIHNvdXJjZSBpbnRlcnJ1cHRzICovCisgIF9fSEFMX0ZMQVNIX0VOQUJMRV9JVChGTEFTSF9JVF9FT1AgfCBGTEFTSF9JVF9FUlIpOworICAKKyAgcEZsYXNoLkFkZHJlc3MgPSBBZGRyZXNzOworICBwRmxhc2guRGF0YSA9IERhdGE7CisKKyAgaWYoVHlwZVByb2dyYW0gPT0gRkxBU0hfVFlQRVBST0dSQU1fSEFMRldPUkQpCisgIHsKKyAgICBwRmxhc2guUHJvY2VkdXJlT25Hb2luZyA9IEZMQVNIX1BST0NfUFJPR1JBTUhBTEZXT1JEOworICAgIC8qIFByb2dyYW0gaGFsZndvcmQgKDE2LWJpdCkgYXQgYSBzcGVjaWZpZWQgYWRkcmVzcy4gKi8KKyAgICBwRmxhc2guRGF0YVJlbWFpbmluZyA9IDFVOworICB9CisgIGVsc2UgaWYoVHlwZVByb2dyYW0gPT0gRkxBU0hfVFlQRVBST0dSQU1fV09SRCkKKyAgeworICAgIHBGbGFzaC5Qcm9jZWR1cmVPbkdvaW5nID0gRkxBU0hfUFJPQ19QUk9HUkFNV09SRDsKKyAgICAvKiBQcm9ncmFtIHdvcmQgKDMyLWJpdCA6IDIqMTYtYml0KSBhdCBhIHNwZWNpZmllZCBhZGRyZXNzLiAqLworICAgIHBGbGFzaC5EYXRhUmVtYWluaW5nID0gMlU7CisgIH0KKyAgZWxzZQorICB7CisgICAgcEZsYXNoLlByb2NlZHVyZU9uR29pbmcgPSBGTEFTSF9QUk9DX1BST0dSQU1ET1VCTEVXT1JEOworICAgIC8qIFByb2dyYW0gZG91YmxlIHdvcmQgKDY0LWJpdCA6IDQqMTYtYml0KSBhdCBhIHNwZWNpZmllZCBhZGRyZXNzLiAqLworICAgIHBGbGFzaC5EYXRhUmVtYWluaW5nID0gNFU7CisgIH0KKworICAvKiBQcm9ncmFtIGhhbGZ3b3JkICgxNi1iaXQpIGF0IGEgc3BlY2lmaWVkIGFkZHJlc3MuICovCisgIEZMQVNIX1Byb2dyYW1fSGFsZldvcmQoQWRkcmVzcywgKHVpbnQxNl90KURhdGEpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgRkxBU0ggaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9GTEFTSF9JUlFIYW5kbGVyKHZvaWQpCit7CisgIHVpbnQzMl90IGFkZHJlc3N0bXAgPSAwVTsKKyAgCisgIC8qIENoZWNrIEZMQVNIIG9wZXJhdGlvbiBlcnJvciBmbGFncyAqLworICBpZihfX0hBTF9GTEFTSF9HRVRfRkxBRyhGTEFTSF9GTEFHX1dSUEVSUikgfHxfX0hBTF9GTEFTSF9HRVRfRkxBRyhGTEFTSF9GTEFHX1BHRVJSKSkKKyAgeworICAgIC8qIFJldHVybiB0aGUgZmF1bHR5IGFkZHJlc3MgKi8KKyAgICBhZGRyZXNzdG1wID0gcEZsYXNoLkFkZHJlc3M7CisgICAgLyogUmVzZXQgYWRkcmVzcyAqLworICAgIHBGbGFzaC5BZGRyZXNzID0gMHhGRkZGRkZGRlU7CisgIAorICAgIC8qIFNhdmUgdGhlIEVycm9yIGNvZGUgKi8KKyAgICBGTEFTSF9TZXRFcnJvckNvZGUoKTsKKyAgICAKKyAgICAvKiBGTEFTSCBlcnJvciBpbnRlcnJ1cHQgdXNlciBjYWxsYmFjayAqLworICAgIEhBTF9GTEFTSF9PcGVyYXRpb25FcnJvckNhbGxiYWNrKGFkZHJlc3N0bXApOworCisgICAgLyogU3RvcCB0aGUgcHJvY2VkdXJlIG9uZ29pbmcgKi8KKyAgICBwRmxhc2guUHJvY2VkdXJlT25Hb2luZyA9IEZMQVNIX1BST0NfTk9ORTsKKyAgfQorCisgIC8qIENoZWNrIEZMQVNIIEVuZCBvZiBPcGVyYXRpb24gZmxhZyAgKi8KKyAgaWYoX19IQUxfRkxBU0hfR0VUX0ZMQUcoRkxBU0hfRkxBR19FT1ApKQorICB7CisgICAgLyogQ2xlYXIgRkxBU0ggRW5kIG9mIE9wZXJhdGlvbiBwZW5kaW5nIGJpdCAqLworICAgIF9fSEFMX0ZMQVNIX0NMRUFSX0ZMQUcoRkxBU0hfRkxBR19FT1ApOworICAgIAorICAgIC8qIFByb2Nlc3MgY2FuIGNvbnRpbnVlIG9ubHkgaWYgbm8gZXJyb3IgZGV0ZWN0ZWQgKi8KKyAgICBpZihwRmxhc2guUHJvY2VkdXJlT25Hb2luZyAhPSBGTEFTSF9QUk9DX05PTkUpCisgICAgeworICAgICAgaWYocEZsYXNoLlByb2NlZHVyZU9uR29pbmcgPT0gRkxBU0hfUFJPQ19QQUdFRVJBU0UpCisgICAgICB7CisgICAgICAgIC8qIE5iIG9mIHBhZ2VzIHRvIGVyYXNlZCBjYW4gYmUgZGVjcmVhc2VkICovCisgICAgICAgIHBGbGFzaC5EYXRhUmVtYWluaW5nLS07CisKKyAgICAgICAgLyogQ2hlY2sgaWYgdGhlcmUgYXJlIHN0aWxsIHBhZ2VzIHRvIGVyYXNlICovCisgICAgICAgIGlmKHBGbGFzaC5EYXRhUmVtYWluaW5nICE9IDBVKQorICAgICAgICB7CisgICAgICAgICAgYWRkcmVzc3RtcCA9IHBGbGFzaC5BZGRyZXNzOworICAgICAgICAgIC8qSW5kaWNhdGUgdXNlciB3aGljaCBzZWN0b3IgaGFzIGJlZW4gZXJhc2VkICovCisgICAgICAgICAgSEFMX0ZMQVNIX0VuZE9mT3BlcmF0aW9uQ2FsbGJhY2soYWRkcmVzc3RtcCk7CisKKyAgICAgICAgICAvKkluY3JlbWVudCBzZWN0b3IgbnVtYmVyKi8KKyAgICAgICAgICBhZGRyZXNzdG1wID0gcEZsYXNoLkFkZHJlc3MgKyBGTEFTSF9QQUdFX1NJWkU7CisgICAgICAgICAgcEZsYXNoLkFkZHJlc3MgPSBhZGRyZXNzdG1wOworCisgICAgICAgICAgLyogSWYgdGhlIGVyYXNlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIGRpc2FibGUgdGhlIFBFUiBCaXQgKi8KKyAgICAgICAgICBDTEVBUl9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9QRVIpOworCisgICAgICAgICAgRkxBU0hfUGFnZUVyYXNlKGFkZHJlc3N0bXApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIE5vIG1vcmUgcGFnZXMgdG8gRXJhc2UsIHVzZXIgY2FsbGJhY2sgY2FuIGJlIGNhbGxlZC4gKi8KKyAgICAgICAgICAvKiBSZXNldCBTZWN0b3IgYW5kIHN0b3AgRXJhc2UgcGFnZXMgcHJvY2VkdXJlICovCisgICAgICAgICAgcEZsYXNoLkFkZHJlc3MgPSBhZGRyZXNzdG1wID0gMHhGRkZGRkZGRlU7CisgICAgICAgICAgcEZsYXNoLlByb2NlZHVyZU9uR29pbmcgPSBGTEFTSF9QUk9DX05PTkU7CisgICAgICAgICAgLyogRkxBU0ggRU9QIGludGVycnVwdCB1c2VyIGNhbGxiYWNrICovCisgICAgICAgICAgSEFMX0ZMQVNIX0VuZE9mT3BlcmF0aW9uQ2FsbGJhY2soYWRkcmVzc3RtcCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYocEZsYXNoLlByb2NlZHVyZU9uR29pbmcgPT0gRkxBU0hfUFJPQ19NQVNTRVJBU0UpCisgICAgICB7CisgICAgICAgIC8qIE9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIGRpc2FibGUgdGhlIE1FUiBCaXQgKi8KKyAgICAgICAgQ0xFQVJfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfTUVSKTsKKworICAgICAgICAgIC8qIE1hc3NFcmFzZSBlbmRlZC4gUmV0dXJuIHRoZSBzZWxlY3RlZCBiYW5rICovCisgICAgICAgICAgLyogRkxBU0ggRU9QIGludGVycnVwdCB1c2VyIGNhbGxiYWNrICovCisgICAgICAgICAgSEFMX0ZMQVNIX0VuZE9mT3BlcmF0aW9uQ2FsbGJhY2soMFUpOworCisgICAgICAgICAgLyogU3RvcCBNYXNzIEVyYXNlIHByb2NlZHVyZSovCisgICAgICAgICAgcEZsYXNoLlByb2NlZHVyZU9uR29pbmcgPSBGTEFTSF9QUk9DX05PTkU7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogTmIgb2YgMTYtYml0IGRhdGEgdG8gcHJvZ3JhbSBjYW4gYmUgZGVjcmVhc2VkICovCisgICAgICAgIHBGbGFzaC5EYXRhUmVtYWluaW5nLS07CisgICAgICAgIAorICAgICAgICAvKiBDaGVjayBpZiB0aGVyZSBhcmUgc3RpbGwgMTYtYml0IGRhdGEgdG8gcHJvZ3JhbSAqLworICAgICAgICBpZihwRmxhc2guRGF0YVJlbWFpbmluZyAhPSAwVSkKKyAgICAgICAgeworICAgICAgICAgIC8qIEluY3JlbWVudCBhZGRyZXNzIHRvIDE2LWJpdCAqLworICAgICAgICAgIHBGbGFzaC5BZGRyZXNzICs9IDJVOworICAgICAgICAgIGFkZHJlc3N0bXAgPSBwRmxhc2guQWRkcmVzczsKKyAgICAgICAgICAKKyAgICAgICAgICAvKiBTaGlmdCB0byBoYXZlIG5leHQgMTYtYml0IGRhdGEgKi8KKyAgICAgICAgICBwRmxhc2guRGF0YSA9IChwRmxhc2guRGF0YSA+PiAxNlUpOworICAgICAgICAgIAorICAgICAgICAgIC8qIE9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIGRpc2FibGUgdGhlIFBHIEJpdCAqLworICAgICAgICAgIENMRUFSX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX1BHKTsKKworICAgICAgICAgIC8qUHJvZ3JhbSBoYWxmd29yZCAoMTYtYml0KSBhdCBhIHNwZWNpZmllZCBhZGRyZXNzLiovCisgICAgICAgICAgRkxBU0hfUHJvZ3JhbV9IYWxmV29yZChhZGRyZXNzdG1wLCAodWludDE2X3QpcEZsYXNoLkRhdGEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIFByb2dyYW0gZW5kZWQuIFJldHVybiB0aGUgc2VsZWN0ZWQgYWRkcmVzcyAqLworICAgICAgICAgIC8qIEZMQVNIIEVPUCBpbnRlcnJ1cHQgdXNlciBjYWxsYmFjayAqLworICAgICAgICAgIGlmIChwRmxhc2guUHJvY2VkdXJlT25Hb2luZyA9PSBGTEFTSF9QUk9DX1BST0dSQU1IQUxGV09SRCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBIQUxfRkxBU0hfRW5kT2ZPcGVyYXRpb25DYWxsYmFjayhwRmxhc2guQWRkcmVzcyk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKHBGbGFzaC5Qcm9jZWR1cmVPbkdvaW5nID09IEZMQVNIX1BST0NfUFJPR1JBTVdPUkQpCisgICAgICAgICAgeworICAgICAgICAgICAgSEFMX0ZMQVNIX0VuZE9mT3BlcmF0aW9uQ2FsbGJhY2socEZsYXNoLkFkZHJlc3MgLSAyVSk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgCisgICAgICAgICAgeworICAgICAgICAgICAgSEFMX0ZMQVNIX0VuZE9mT3BlcmF0aW9uQ2FsbGJhY2socEZsYXNoLkFkZHJlc3MgLSA2VSk7CisgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAvKiBSZXNldCBBZGRyZXNzIGFuZCBzdG9wIFByb2dyYW0gcHJvY2VkdXJlICovCisgICAgICAgICAgcEZsYXNoLkFkZHJlc3MgPSAweEZGRkZGRkZGVTsKKyAgICAgICAgICBwRmxhc2guUHJvY2VkdXJlT25Hb2luZyA9IEZMQVNIX1BST0NfTk9ORTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICAKKworICBpZihwRmxhc2guUHJvY2VkdXJlT25Hb2luZyA9PSBGTEFTSF9QUk9DX05PTkUpCisgIHsKKyAgICAvKiBPcGVyYXRpb24gaXMgY29tcGxldGVkLCBkaXNhYmxlIHRoZSBQRywgUEVSIGFuZCBNRVIgQml0cyAqLworICAgIENMRUFSX0JJVChGTEFTSC0+Q1IsIChGTEFTSF9DUl9QRyB8IEZMQVNIX0NSX1BFUiB8IEZMQVNIX0NSX01FUikpOworCisgICAgLyogRGlzYWJsZSBFbmQgb2YgRkxBU0ggT3BlcmF0aW9uIGFuZCBFcnJvciBzb3VyY2UgaW50ZXJydXB0cyAqLworICAgIF9fSEFMX0ZMQVNIX0RJU0FCTEVfSVQoRkxBU0hfSVRfRU9QIHwgRkxBU0hfSVRfRVJSKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soJnBGbGFzaCk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBGTEFTSCBlbmQgb2Ygb3BlcmF0aW9uIGludGVycnVwdCBjYWxsYmFjaworICAqIEBwYXJhbSAgUmV0dXJuVmFsdWUgVGhlIHZhbHVlIHNhdmVkIGluIHRoaXMgcGFyYW1ldGVyIGRlcGVuZHMgb24gdGhlIG9uZ29pbmcgcHJvY2VkdXJlCisgICogICAgICAgICAgICAgICAgIC0gTWFzcyBFcmFzZTogTm8gcmV0dXJuIHZhbHVlIGV4cGVjdGVkCisgICogICAgICAgICAgICAgICAgIC0gUGFnZXMgRXJhc2U6IEFkZHJlc3Mgb2YgdGhlIHBhZ2Ugd2hpY2ggaGFzIGJlZW4gZXJhc2VkIAorICAqICAgICAgICAgICAgICAgICAgICAoaWYgMHhGRkZGRkZGRiwgaXQgbWVhbnMgdGhhdCBhbGwgdGhlIHNlbGVjdGVkIHBhZ2VzIGhhdmUgYmVlbiBlcmFzZWQpCisgICogICAgICAgICAgICAgICAgIC0gUHJvZ3JhbTogQWRkcmVzcyB3aGljaCB3YXMgc2VsZWN0ZWQgZm9yIGRhdGEgcHJvZ3JhbQorICAqIEByZXR2YWwgbm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0ZMQVNIX0VuZE9mT3BlcmF0aW9uQ2FsbGJhY2sodWludDMyX3QgUmV0dXJuVmFsdWUpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKFJldHVyblZhbHVlKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0ZMQVNIX0VuZE9mT3BlcmF0aW9uQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gCit9CisKKy8qKgorICAqIEBicmllZiAgRkxBU0ggb3BlcmF0aW9uIGVycm9yIGludGVycnVwdCBjYWxsYmFjaworICAqIEBwYXJhbSAgUmV0dXJuVmFsdWUgVGhlIHZhbHVlIHNhdmVkIGluIHRoaXMgcGFyYW1ldGVyIGRlcGVuZHMgb24gdGhlIG9uZ29pbmcgcHJvY2VkdXJlCisgICogICAgICAgICAgICAgICAgIC0gTWFzcyBFcmFzZTogTm8gcmV0dXJuIHZhbHVlIGV4cGVjdGVkCisgICogICAgICAgICAgICAgICAgIC0gUGFnZXMgRXJhc2U6IEFkZHJlc3Mgb2YgdGhlIHBhZ2Ugd2hpY2ggcmV0dXJuZWQgYW4gZXJyb3IKKyAgKiAgICAgICAgICAgICAgICAgLSBQcm9ncmFtOiBBZGRyZXNzIHdoaWNoIHdhcyBzZWxlY3RlZCBmb3IgZGF0YSBwcm9ncmFtCisgICogQHJldHZhbCBub25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfRkxBU0hfT3BlcmF0aW9uRXJyb3JDYWxsYmFjayh1aW50MzJfdCBSZXR1cm5WYWx1ZSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoUmV0dXJuVmFsdWUpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfRkxBU0hfT3BlcmF0aW9uRXJyb3JDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgCisgKiAgQGJyaWVmICAgbWFuYWdlbWVudCBmdW5jdGlvbnMgCisgKgorQHZlcmJhdGltICAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb250cm9sIHRoZSBGTEFTSCAKKyAgICBtZW1vcnkgb3BlcmF0aW9ucy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBVbmxvY2sgdGhlIEZMQVNIIGNvbnRyb2wgcmVnaXN0ZXIgYWNjZXNzCisgICogQHJldHZhbCBIQUwgU3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hfVW5sb2NrKHZvaWQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZihSRUFEX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX0xPQ0spICE9IFJFU0VUKQorICB7CisgICAgLyogQXV0aG9yaXplIHRoZSBGTEFTSCBSZWdpc3RlcnMgYWNjZXNzICovCisgICAgV1JJVEVfUkVHKEZMQVNILT5LRVlSLCBGTEFTSF9LRVkxKTsKKyAgICBXUklURV9SRUcoRkxBU0gtPktFWVIsIEZMQVNIX0tFWTIpOworCisgICAgLyogVmVyaWZ5IEZsYXNoIGlzIHVubG9ja2VkICovCisgICAgaWYoUkVBRF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9MT0NLKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBMb2NrcyB0aGUgRkxBU0ggY29udHJvbCByZWdpc3RlciBhY2Nlc3MKKyAgKiBAcmV0dmFsIEhBTCBTdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSF9Mb2NrKHZvaWQpCit7CisgIC8qIFNldCB0aGUgTE9DSyBCaXQgdG8gbG9jayB0aGUgRkxBU0ggUmVnaXN0ZXJzIGFjY2VzcyAqLworICBTRVRfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfTE9DSyk7CisgIAorICByZXR1cm4gSEFMX09LOyAgCit9CisKKy8qKgorICAqIEBicmllZiAgVW5sb2NrIHRoZSBGTEFTSCBPcHRpb24gQ29udHJvbCBSZWdpc3RlcnMgYWNjZXNzLgorICAqIEByZXR2YWwgSEFMIFN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX09CX1VubG9jayh2b2lkKQoreworICBpZiAoSEFMX0lTX0JJVF9DTFIoRkxBU0gtPkNSLCBGTEFTSF9DUl9PUFRXUkUpKQorICB7CisgICAgLyogQXV0aG9yaXplcyB0aGUgT3B0aW9uIEJ5dGUgcmVnaXN0ZXIgcHJvZ3JhbW1pbmcgKi8KKyAgICBXUklURV9SRUcoRkxBU0gtPk9QVEtFWVIsIEZMQVNIX09QVEtFWTEpOworICAgIFdSSVRFX1JFRyhGTEFTSC0+T1BUS0VZUiwgRkxBU0hfT1BUS0VZMik7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfSAgCisgIAorICByZXR1cm4gSEFMX09LOyAgCit9CisKKy8qKgorICAqIEBicmllZiAgTG9jayB0aGUgRkxBU0ggT3B0aW9uIENvbnRyb2wgUmVnaXN0ZXJzIGFjY2Vzcy4KKyAgKiBAcmV0dmFsIEhBTCBTdGF0dXMgCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hfT0JfTG9jayh2b2lkKQoreworICAvKiBDbGVhciB0aGUgT1BUV1JFIEJpdCB0byBsb2NrIHRoZSBGTEFTSCBPcHRpb24gQnl0ZSBSZWdpc3RlcnMgYWNjZXNzICovCisgIENMRUFSX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX09QVFdSRSk7CisgIAorICByZXR1cm4gSEFMX09LOyAgCit9CisgIAorLyoqCisgICogQGJyaWVmICBMYXVuY2ggdGhlIG9wdGlvbiBieXRlIGxvYWRpbmcuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVzZXQgYXV0b21hdGljYWxseSB0aGUgTUNVLgorICAqIEByZXR2YWwgSEFMIFN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX09CX0xhdW5jaCh2b2lkKQoreworICAvKiBTZXQgdGhlIE9CTF9MYXVuY2ggYml0IHRvIGxhdW5jaCB0aGUgb3B0aW9uIGJ5dGUgbG9hZGluZyAqLworICBTRVRfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfT0JMX0xBVU5DSCk7CisgIAorICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgcmV0dXJuKEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEZMQVNIX1RJTUVPVVRfVkFMVUUpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8gIAorCisvKiogQGRlZmdyb3VwIEZMQVNIX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBlcnJvcnMgZnVuY3Rpb25zIAorICogIEBicmllZiAgICBQZXJpcGhlcmFsIGVycm9ycyBmdW5jdGlvbnMgCisgKgorQHZlcmJhdGltICAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgRXJyb3JzIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcGVybWl0IHRvIGdldCBpbiBydW4tdGltZSBlcnJvcnMgb2YgIHRoZSBGTEFTSCBwZXJpcGhlcmFsLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgc3BlY2lmaWMgRkxBU0ggZXJyb3IgZmxhZy4KKyAgKiBAcmV0dmFsIEZMQVNIX0Vycm9yQ29kZSBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlOgorICAqICAgICAgICAgICAgQHJlZiBGTEFTSF9FcnJvcl9Db2RlcworICAqLwordWludDMyX3QgSEFMX0ZMQVNIX0dldEVycm9yKHZvaWQpCit7CisgICByZXR1cm4gcEZsYXNoLkVycm9yQ29kZTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEZMQVNIX1ByaXZhdGVfRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKgorICAqIEBicmllZiAgUHJvZ3JhbSBhIGhhbGYtd29yZCAoMTYtYml0KSBhdCBhIHNwZWNpZmllZCBhZGRyZXNzLgorICAqIEBwYXJhbSAgQWRkcmVzcyBzcGVjaWZ5IHRoZSBhZGRyZXNzIHRvIGJlIHByb2dyYW1tZWQuCisgICogQHBhcmFtICBEYXRhICAgIHNwZWNpZnkgdGhlIGRhdGEgdG8gYmUgcHJvZ3JhbW1lZC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEZMQVNIX1Byb2dyYW1fSGFsZldvcmQodWludDMyX3QgQWRkcmVzcywgdWludDE2X3QgRGF0YSkKK3sKKyAgLyogQ2xlYW4gdGhlIGVycm9yIGNvbnRleHQgKi8KKyAgcEZsYXNoLkVycm9yQ29kZSA9IEhBTF9GTEFTSF9FUlJPUl9OT05FOworICAKKyAgICAvKiBQcm9jZWVkIHRvIHByb2dyYW0gdGhlIG5ldyBkYXRhICovCisgICAgU0VUX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX1BHKTsKKworICAvKiBXcml0ZSBkYXRhIGluIHRoZSBhZGRyZXNzICovCisgICooX19JTyB1aW50MTZfdCopQWRkcmVzcyA9IERhdGE7Cit9CisKKy8qKgorICAqIEBicmllZiAgV2FpdCBmb3IgYSBGTEFTSCBvcGVyYXRpb24gdG8gY29tcGxldGUuCisgICogQHBhcmFtICBUaW1lb3V0ICBtYXhpbXVtIGZsYXNoIG9wZXJhdGlvbiB0aW1lb3V0CisgICogQHJldHZhbCBIQUwgU3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbih1aW50MzJfdCBUaW1lb3V0KQoreworICAvKiBXYWl0IGZvciB0aGUgRkxBU0ggb3BlcmF0aW9uIHRvIGNvbXBsZXRlIGJ5IHBvbGxpbmcgb24gQlVTWSBmbGFnIHRvIGJlIHJlc2V0LgorICAgICBFdmVuIGlmIHRoZSBGTEFTSCBvcGVyYXRpb24gZmFpbHMsIHRoZSBCVVNZIGZsYWcgd2lsbCBiZSByZXNldCBhbmQgYW4gZXJyb3IKKyAgICAgZmxhZyB3aWxsIGJlIHNldCAqLworICAgICAKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICAgCisgIHdoaWxlKF9fSEFMX0ZMQVNIX0dFVF9GTEFHKEZMQVNIX0ZMQUdfQlNZKSkgCisgIHsgCisgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZigoVGltZW91dCA9PSAwVSkgfHwgKChIQUxfR2V0VGljaygpLXRpY2tzdGFydCkgPiBUaW1lb3V0KSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgLyogQ2hlY2sgRkxBU0ggRW5kIG9mIE9wZXJhdGlvbiBmbGFnICAqLworICBpZiAoX19IQUxfRkxBU0hfR0VUX0ZMQUcoRkxBU0hfRkxBR19FT1ApKQorICB7CisgICAgLyogQ2xlYXIgRkxBU0ggRW5kIG9mIE9wZXJhdGlvbiBwZW5kaW5nIGJpdCAqLworICAgIF9fSEFMX0ZMQVNIX0NMRUFSX0ZMQUcoRkxBU0hfRkxBR19FT1ApOworICB9CisgIAorICBpZihfX0hBTF9GTEFTSF9HRVRfRkxBRyhGTEFTSF9GTEFHX1dSUEVSUikgIHx8IAorICAgICBfX0hBTF9GTEFTSF9HRVRfRkxBRyhGTEFTSF9GTEFHX1BHRVJSKSkKKyAgeworICAgIC8qU2F2ZSB0aGUgZXJyb3IgY29kZSovCisgICAgRkxBU0hfU2V0RXJyb3JDb2RlKCk7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFRoZXJlIGlzIG5vIGVycm9yIGZsYWcgc2V0ICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHNwZWNpZmljIEZMQVNIIGVycm9yIGZsYWcuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBGTEFTSF9TZXRFcnJvckNvZGUodm9pZCkKK3sKKyAgdWludDMyX3QgZmxhZ3MgPSAwVTsKKyAgCisgIGlmKF9fSEFMX0ZMQVNIX0dFVF9GTEFHKEZMQVNIX0ZMQUdfV1JQRVJSKSkKKyAgeworICAgIHBGbGFzaC5FcnJvckNvZGUgfD0gSEFMX0ZMQVNIX0VSUk9SX1dSUDsKKyAgICBmbGFncyB8PSBGTEFTSF9GTEFHX1dSUEVSUjsKKyAgfQorICBpZihfX0hBTF9GTEFTSF9HRVRfRkxBRyhGTEFTSF9GTEFHX1BHRVJSKSkKKyAgeworICAgIHBGbGFzaC5FcnJvckNvZGUgfD0gSEFMX0ZMQVNIX0VSUk9SX1BST0c7CisgICAgZmxhZ3MgfD0gRkxBU0hfRkxBR19QR0VSUjsKKyAgfQorICAvKiBDbGVhciBGTEFTSCBlcnJvciBwZW5kaW5nIGJpdHMgKi8KKyAgX19IQUxfRkxBU0hfQ0xFQVJfRkxBRyhmbGFncyk7Cit9ICAKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfRkxBU0hfTU9EVUxFX0VOQUJMRUQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmYzeHhfaGFsX2ZsYXNoX2V4LmMgYi9TcmMvc3RtMzJmM3h4X2hhbF9mbGFzaF9leC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYTQyODQKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJmM3h4X2hhbF9mbGFzaF9leC5jCkBAIC0wLDAgKzEsMTAwNSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfZmxhc2hfZXguYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgRXh0ZW5kZWQgRkxBU0ggSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZyAKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIEZMQVNIIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgRXh0ZW5kZWQgSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgRXh0ZW5kZWQgSS9PIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zIAorICAqICAgICAgICAgCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICMjIyMjIEZsYXNoIHBlcmlwaGVyYWwgZXh0ZW5kZWQgZmVhdHVyZXMgICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBjb25maWd1cmUgYW5kIHByb2dyYW0gdGhlIEZMQVNIIG1lbW9yeSAKKyAgICAgICBvZiBhbGwgU1RNMzJGM3h4eCBkZXZpY2VzLiBJdCBpbmNsdWRlcworICAgICAgIAorICAgICAgICAoKyspIFNldC9SZXNldCB0aGUgd3JpdGUgcHJvdGVjdGlvbgorICAgICAgICAoKyspIFByb2dyYW0gdGhlIHVzZXIgT3B0aW9uIEJ5dGVzCisgICAgICAgICgrKykgR2V0IHRoZSBSZWFkIHByb3RlY3Rpb24gTGV2ZWwKKyAgCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIAorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKyNpZmRlZiBIQUxfRkxBU0hfTU9EVUxFX0VOQUJMRUQKKworLyoqIEBhZGR0b2dyb3VwIEZMQVNICisgICogQHsKKyAgKi8KKy8qKiBAYWRkdG9ncm91cCBGTEFTSF9Qcml2YXRlX1ZhcmlhYmxlcworICogQHsKKyAqLworLyogVmFyaWFibGVzIHVzZWQgZm9yIEVyYXNlIHBhZ2VzIHVuZGVyIGludGVycnVwdGlvbiovCitleHRlcm4gRkxBU0hfUHJvY2Vzc1R5cGVEZWYgcEZsYXNoOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIEZMQVNIRXggRkxBU0hFeAorICAqIEBicmllZiBGTEFTSCBIQUwgRXh0ZW5zaW9uIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRkxBU0hFeF9Qcml2YXRlX0NvbnN0YW50cyBGTEFTSEV4IFByaXZhdGUgQ29uc3RhbnRzCisgKiBAeworICovCisjZGVmaW5lIEZMQVNIX1BPU0lUSU9OX0lXREdTV19CSVQgICAgICAgICh1aW50MzJfdClQT1NJVElPTl9WQUwoRkxBU0hfT0JSX0lXREdfU1cpCisjZGVmaW5lIEZMQVNIX1BPU0lUSU9OX09CX1VTRVJEQVRBMF9CSVQgICh1aW50MzJfdClQT1NJVElPTl9WQUwoRkxBU0hfT0JSX0RBVEEwKQorI2RlZmluZSBGTEFTSF9QT1NJVElPTl9PQl9VU0VSREFUQTFfQklUICAodWludDMyX3QpUE9TSVRJT05fVkFMKEZMQVNIX09CUl9EQVRBMSkKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZMQVNIRXhfUHJpdmF0ZV9NYWNyb3MgRkxBU0hFeCBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisvKioKKyAgKiBAfQorICAqLyAKKworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZMQVNIRXhfUHJpdmF0ZV9GdW5jdGlvbnMgRkxBU0hFeCBQcml2YXRlIEZ1bmN0aW9ucworICogQHsKKyAqLworLyogRXJhc2Ugb3BlcmF0aW9ucyAqLworc3RhdGljIHZvaWQgICAgICAgICAgICAgIEZMQVNIX01hc3NFcmFzZSh2b2lkKTsKK3ZvaWQgICAgRkxBU0hfUGFnZUVyYXNlKHVpbnQzMl90IFBhZ2VBZGRyZXNzKTsKKworLyogT3B0aW9uIGJ5dGVzIGNvbnRyb2wgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBGTEFTSF9PQl9FbmFibGVXUlAodWludDMyX3QgV3JpdGVQcm90ZWN0UGFnZSk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgRkxBU0hfT0JfRGlzYWJsZVdSUCh1aW50MzJfdCBXcml0ZVByb3RlY3RQYWdlKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBGTEFTSF9PQl9SRFBfTGV2ZWxDb25maWcodWludDhfdCBSZWFkUHJvdGVjdExldmVsKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBGTEFTSF9PQl9Vc2VyQ29uZmlnKHVpbnQ4X3QgVXNlckNvbmZpZyk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgRkxBU0hfT0JfUHJvZ3JhbURhdGEodWludDMyX3QgQWRkcmVzcywgdWludDhfdCBEYXRhKTsKK3N0YXRpYyB1aW50MzJfdCAgICAgICAgICBGTEFTSF9PQl9HZXRXUlAodm9pZCk7CitzdGF0aWMgdWludDMyX3QgICAgICAgICAgRkxBU0hfT0JfR2V0UkRQKHZvaWQpOworc3RhdGljIHVpbnQ4X3QgICAgICAgICAgIEZMQVNIX09CX0dldFVzZXIodm9pZCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBGTEFTSEV4X0V4cG9ydGVkX0Z1bmN0aW9ucyBGTEFTSEV4IEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisgIAorLyoqIEBkZWZncm91cCBGTEFTSEV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgRkxBU0hFeCBNZW1vcnkgRXJhc2luZyBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBGTEFTSCBNZW1vcnkgRXJhc2luZyBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltICAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICMjIyMjIEZMQVNIIEVyYXNpbmcgUHJvZ3JhbW1pbmcgZnVuY3Rpb25zICMjIyMjIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFsuLl0gVGhlIEZMQVNIIE1lbW9yeSBFcmFzaW5nIGZ1bmN0aW9ucywgaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CisgICAgKCspIEByZWYgSEFMX0ZMQVNIRXhfRXJhc2U6IHJldHVybiBvbmx5IHdoZW4gZXJhc2UgaGFzIGJlZW4gZG9uZQorICAgICgrKSBAcmVmIEhBTF9GTEFTSEV4X0VyYXNlX0lUOiBlbmQgb2YgZXJhc2UgaXMgZG9uZSB3aGVuIEByZWYgSEFMX0ZMQVNIX0VuZE9mT3BlcmF0aW9uQ2FsbGJhY2sgCisgICAgICAgIGlzIGNhbGxlZCB3aXRoIHBhcmFtZXRlciAweEZGRkZGRkZGCisKKyAgICBbLi5dIEFueSBvcGVyYXRpb24gb2YgZXJhc2Ugc2hvdWxkIGZvbGxvdyB0aGVzZSBzdGVwczoKKyAgICAoIykgQ2FsbCB0aGUgQHJlZiBIQUxfRkxBU0hfVW5sb2NrKCkgZnVuY3Rpb24gdG8gZW5hYmxlIHRoZSBmbGFzaCBjb250cm9sIHJlZ2lzdGVyIGFuZCAKKyAgICAgICAgcHJvZ3JhbSBtZW1vcnkgYWNjZXNzLgorICAgICgjKSBDYWxsIHRoZSBkZXNpcmVkIGZ1bmN0aW9uIHRvIGVyYXNlIHBhZ2UuCisgICAgKCMpIENhbGwgdGhlIEByZWYgSEFMX0ZMQVNIX0xvY2soKSB0byBkaXNhYmxlIHRoZSBmbGFzaCBwcm9ncmFtIG1lbW9yeSBhY2Nlc3MgCisgICAgICAgKHJlY29tbWVuZGVkIHRvIHByb3RlY3QgdGhlIEZMQVNIIG1lbW9yeSBhZ2FpbnN0IHBvc3NpYmxlIHVud2FudGVkIG9wZXJhdGlvbikuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisgIAorCisvKioKKyAgKiBAYnJpZWYgIFBlcmZvcm0gYSBtYXNzIGVyYXNlIG9yIGVyYXNlIHRoZSBzcGVjaWZpZWQgRkxBU0ggbWVtb3J5IHBhZ2VzCisgICogQG5vdGUgICBUbyBjb3JyZWN0bHkgcnVuIHRoaXMgZnVuY3Rpb24sIHRoZSBAcmVmIEhBTF9GTEFTSF9VbmxvY2soKSBmdW5jdGlvbgorICAqICAgICAgICAgbXVzdCBiZSBjYWxsZWQgYmVmb3JlLgorICAqICAgICAgICAgQ2FsbCB0aGUgQHJlZiBIQUxfRkxBU0hfTG9jaygpIHRvIGRpc2FibGUgdGhlIGZsYXNoIG1lbW9yeSBhY2Nlc3MgCisgICogICAgICAgICAocmVjb21tZW5kZWQgdG8gcHJvdGVjdCB0aGUgRkxBU0ggbWVtb3J5IGFnYWluc3QgcG9zc2libGUgdW53YW50ZWQgb3BlcmF0aW9uKQorICAqIEBwYXJhbVtpbl0gIHBFcmFzZUluaXQgcG9pbnRlciB0byBhbiBGTEFTSF9FcmFzZUluaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0CisgICogICAgICAgICBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGVyYXNpbmcuCisgICoKKyAgKiBAcGFyYW1bb3V0XSAgUGFnZUVycm9yIHBvaW50ZXIgdG8gdmFyaWFibGUgIHRoYXQKKyAgKiAgICAgICAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIG9uIGZhdWx0eSBwYWdlIGluIGNhc2Ugb2YgZXJyb3IKKyAgKiAgICAgICAgICgweEZGRkZGRkZGIG1lYW5zIHRoYXQgYWxsIHRoZSBwYWdlcyBoYXZlIGJlZW4gY29ycmVjdGx5IGVyYXNlZCkKKyAgKgorICAqIEByZXR2YWwgSEFMX1N0YXR1c1R5cGVEZWYgSEFMIFN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfRXJhc2UoRkxBU0hfRXJhc2VJbml0VHlwZURlZiAqcEVyYXNlSW5pdCwgdWludDMyX3QgKlBhZ2VFcnJvcikKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX0VSUk9SOworICB1aW50MzJfdCBhZGRyZXNzID0gMFU7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSygmcEZsYXNoKTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfVFlQRUVSQVNFKHBFcmFzZUluaXQtPlR5cGVFcmFzZSkpOworCisgIGlmIChwRXJhc2VJbml0LT5UeXBlRXJhc2UgPT0gRkxBU0hfVFlQRUVSQVNFX01BU1NFUkFTRSkKKyAgeworICAgICAgLyogTWFzcyBFcmFzZSByZXF1ZXN0ZWQgZm9yIEJhbmsxICovCisgICAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgICAgIGlmIChGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbigodWludDMyX3QpRkxBU0hfVElNRU9VVF9WQUxVRSkgPT0gSEFMX09LKQorICAgICAgeworICAgICAgICAvKk1hc3MgZXJhc2UgdG8gYmUgZG9uZSovCisgICAgICAgIEZMQVNIX01hc3NFcmFzZSgpOworICAgICAgICAKKyAgICAgICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovCisgICAgICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKCh1aW50MzJfdClGTEFTSF9USU1FT1VUX1ZBTFVFKTsKKyAgICAgICAgCisgICAgICAgIC8qIElmIHRoZSBlcmFzZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBkaXNhYmxlIHRoZSBNRVIgQml0ICovCisgICAgICAgIENMRUFSX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX01FUik7CisgICAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUGFnZSBFcmFzZSBpcyByZXF1ZXN0ZWQgKi8KKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19GTEFTSF9QUk9HUkFNX0FERFJFU1MocEVyYXNlSW5pdC0+UGFnZUFkZHJlc3MpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfTkJfUEFHRVMocEVyYXNlSW5pdC0+UGFnZUFkZHJlc3MsIHBFcmFzZUluaXQtPk5iUGFnZXMpKTsKKyAgICAKKyAgICAgIC8qIFBhZ2UgRXJhc2UgcmVxdWVzdGVkIG9uIGFkZHJlc3MgbG9jYXRlZCBvbiBiYW5rMSAqLworICAgICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovCisgICAgICBpZiAoRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oKHVpbnQzMl90KUZMQVNIX1RJTUVPVVRfVkFMVUUpID09IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLypJbml0aWFsaXphdGlvbiBvZiBQYWdlRXJyb3IgdmFyaWFibGUqLworICAgICAgICAqUGFnZUVycm9yID0gMHhGRkZGRkZGRlU7CisgICAgICAgIAorICAgICAgICAvKiBFcmFzZSBwYWdlIGJ5IHBhZ2UgdG8gYmUgZG9uZSovCisgICAgICAgIGZvcihhZGRyZXNzID0gcEVyYXNlSW5pdC0+UGFnZUFkZHJlc3M7CisgICAgICAgICAgICBhZGRyZXNzIDwgKChwRXJhc2VJbml0LT5OYlBhZ2VzICogRkxBU0hfUEFHRV9TSVpFKSArIHBFcmFzZUluaXQtPlBhZ2VBZGRyZXNzKTsKKyAgICAgICAgICAgIGFkZHJlc3MgKz0gRkxBU0hfUEFHRV9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgRkxBU0hfUGFnZUVyYXNlKGFkZHJlc3MpOworICAgICAgICAgIAorICAgICAgICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLworICAgICAgICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKCh1aW50MzJfdClGTEFTSF9USU1FT1VUX1ZBTFVFKTsKKyAgICAgICAgICAKKyAgICAgICAgICAvKiBJZiB0aGUgZXJhc2Ugb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgZGlzYWJsZSB0aGUgUEVSIEJpdCAqLworICAgICAgICAgIENMRUFSX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX1BFUik7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKHN0YXR1cyAhPSBIQUxfT0spCisgICAgICAgICAgeworICAgICAgICAgICAgLyogSW4gY2FzZSBvZiBlcnJvciwgc3RvcCBlcmFzZSBwcm9jZWR1cmUgYW5kIHJldHVybiB0aGUgZmF1bHR5IGFkZHJlc3MgKi8KKyAgICAgICAgICAgICpQYWdlRXJyb3IgPSBhZGRyZXNzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSygmcEZsYXNoKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFBlcmZvcm0gYSBtYXNzIGVyYXNlIG9yIGVyYXNlIHRoZSBzcGVjaWZpZWQgRkxBU0ggbWVtb3J5IHBhZ2VzIHdpdGggaW50ZXJydXB0IGVuYWJsZWQKKyAgKiBAbm90ZSAgIFRvIGNvcnJlY3RseSBydW4gdGhpcyBmdW5jdGlvbiwgdGhlIEByZWYgSEFMX0ZMQVNIX1VubG9jaygpIGZ1bmN0aW9uCisgICogICAgICAgICBtdXN0IGJlIGNhbGxlZCBiZWZvcmUuCisgICogICAgICAgICBDYWxsIHRoZSBAcmVmIEhBTF9GTEFTSF9Mb2NrKCkgdG8gZGlzYWJsZSB0aGUgZmxhc2ggbWVtb3J5IGFjY2VzcyAKKyAgKiAgICAgICAgIChyZWNvbW1lbmRlZCB0byBwcm90ZWN0IHRoZSBGTEFTSCBtZW1vcnkgYWdhaW5zdCBwb3NzaWJsZSB1bndhbnRlZCBvcGVyYXRpb24pCisgICogQHBhcmFtICBwRXJhc2VJbml0IHBvaW50ZXIgdG8gYW4gRkxBU0hfRXJhc2VJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqICAgICAgICAgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBlcmFzaW5nLgorICAqCisgICogQHJldHZhbCBIQUxfU3RhdHVzVHlwZURlZiBIQUwgU3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hFeF9FcmFzZV9JVChGTEFTSF9FcmFzZUluaXRUeXBlRGVmICpwRXJhc2VJbml0KQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSygmcEZsYXNoKTsKKworICAvKiBJZiBwcm9jZWR1cmUgYWxyZWFkeSBvbmdvaW5nLCByZWplY3QgdGhlIG5leHQgb25lICovCisgIGlmIChwRmxhc2guUHJvY2VkdXJlT25Hb2luZyAhPSBGTEFTSF9QUk9DX05PTkUpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfVFlQRUVSQVNFKHBFcmFzZUluaXQtPlR5cGVFcmFzZSkpOworCisgIC8qIEVuYWJsZSBFbmQgb2YgRkxBU0ggT3BlcmF0aW9uIGFuZCBFcnJvciBzb3VyY2UgaW50ZXJydXB0cyAqLworICBfX0hBTF9GTEFTSF9FTkFCTEVfSVQoRkxBU0hfSVRfRU9QIHwgRkxBU0hfSVRfRVJSKTsKKworICBpZiAocEVyYXNlSW5pdC0+VHlwZUVyYXNlID09IEZMQVNIX1RZUEVFUkFTRV9NQVNTRVJBU0UpCisgIHsKKyAgICAvKk1hc3MgZXJhc2UgdG8gYmUgZG9uZSovCisgICAgcEZsYXNoLlByb2NlZHVyZU9uR29pbmcgPSBGTEFTSF9QUk9DX01BU1NFUkFTRTsKKyAgICAgICAgRkxBU0hfTWFzc0VyYXNlKCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogRXJhc2UgYnkgcGFnZSB0byBiZSBkb25lKi8KKworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX1BST0dSQU1fQUREUkVTUyhwRXJhc2VJbml0LT5QYWdlQWRkcmVzcykpOworICAgIGFzc2VydF9wYXJhbShJU19GTEFTSF9OQl9QQUdFUyhwRXJhc2VJbml0LT5QYWdlQWRkcmVzcywgcEVyYXNlSW5pdC0+TmJQYWdlcykpOworCisgICAgcEZsYXNoLlByb2NlZHVyZU9uR29pbmcgPSBGTEFTSF9QUk9DX1BBR0VFUkFTRTsKKyAgICBwRmxhc2guRGF0YVJlbWFpbmluZyA9IHBFcmFzZUluaXQtPk5iUGFnZXM7CisgICAgcEZsYXNoLkFkZHJlc3MgPSBwRXJhc2VJbml0LT5QYWdlQWRkcmVzczsKKworICAgIC8qRXJhc2UgMXN0IHBhZ2UgYW5kIHdhaXQgZm9yIElUKi8KKyAgICBGTEFTSF9QYWdlRXJhc2UocEVyYXNlSW5pdC0+UGFnZUFkZHJlc3MpOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSEV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgT3B0aW9uIEJ5dGVzIFByb2dyYW1taW5nIGZ1bmN0aW9ucworICogIEBicmllZiAgIE9wdGlvbiBCeXRlcyBQcm9ncmFtbWluZyBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltICAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICMjIyMjIE9wdGlvbiBCeXRlcyBQcm9ncmFtbWluZyBmdW5jdGlvbnMgIyMjIyMgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gY29udHJvbCB0aGUgRkxBU0ggCisgICAgb3B0aW9uIGJ5dGVzIG9wZXJhdGlvbnMuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRXJhc2VzIHRoZSBGTEFTSCBvcHRpb24gYnl0ZXMuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9ucyBlcmFzZXMgYWxsIG9wdGlvbiBieXRlcyBleGNlcHQgdGhlIFJlYWQgcHJvdGVjdGlvbiAoUkRQKS4KKyAgKiAgICAgICAgIFRoZSBmdW5jdGlvbiBAcmVmIEhBTF9GTEFTSF9VbmxvY2soKSBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB0byB1bmxvY2sgdGhlIEZMQVNIIGludGVyZmFjZQorICAqICAgICAgICAgVGhlIGZ1bmN0aW9uIEByZWYgSEFMX0ZMQVNIX09CX1VubG9jaygpIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHRvIHVubG9jayB0aGUgb3B0aW9ucyBieXRlcworICAqICAgICAgICAgVGhlIGZ1bmN0aW9uIEByZWYgSEFMX0ZMQVNIX09CX0xhdW5jaCgpIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgdG8gZm9yY2UgdGhlIHJlbG9hZCBvZiB0aGUgb3B0aW9ucyBieXRlcworICAqICAgICAgICAgKHN5c3RlbSByZXNldCB3aWxsIG9jY3VyKQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hFeF9PQkVyYXNlKHZvaWQpCit7CisgIHVpbnQ4X3QgcmRwdG1wID0gT0JfUkRQX0xFVkVMXzA7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9FUlJPUjsKKworICAvKiBHZXQgdGhlIGFjdHVhbCByZWFkIHByb3RlY3Rpb24gT3B0aW9uIEJ5dGUgdmFsdWUgKi8KKyAgcmRwdG1wID0gRkxBU0hfT0JfR2V0UkRQKCk7CisKKyAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovCisgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKCh1aW50MzJfdClGTEFTSF9USU1FT1VUX1ZBTFVFKTsKKworICBpZihzdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgLyogQ2xlYW4gdGhlIGVycm9yIGNvbnRleHQgKi8KKyAgICBwRmxhc2guRXJyb3JDb2RlID0gSEFMX0ZMQVNIX0VSUk9SX05PTkU7CisKKyAgICAvKiBJZiB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgcHJvY2VlZCB0byBlcmFzZSB0aGUgb3B0aW9uIGJ5dGVzICovCisgICAgU0VUX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX09QVEVSKTsKKyAgICBTRVRfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfU1RSVCk7CisKKyAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbigodWludDMyX3QpRkxBU0hfVElNRU9VVF9WQUxVRSk7CisKKyAgICAvKiBJZiB0aGUgZXJhc2Ugb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgZGlzYWJsZSB0aGUgT1BURVIgQml0ICovCisgICAgQ0xFQVJfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfT1BURVIpOworCisgICAgaWYoc3RhdHVzID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBSZXN0b3JlIHRoZSBsYXN0IHJlYWQgcHJvdGVjdGlvbiBPcHRpb24gQnl0ZSB2YWx1ZSAqLworICAgICAgc3RhdHVzID0gRkxBU0hfT0JfUkRQX0xldmVsQ29uZmlnKHJkcHRtcCk7CisgICAgfQorICB9CisKKyAgLyogUmV0dXJuIHRoZSBlcmFzZSBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBQcm9ncmFtIG9wdGlvbiBieXRlcworICAqIEBub3RlICAgVGhlIGZ1bmN0aW9uIEByZWYgSEFMX0ZMQVNIX1VubG9jaygpIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHRvIHVubG9jayB0aGUgRkxBU0ggaW50ZXJmYWNlCisgICogICAgICAgICBUaGUgZnVuY3Rpb24gQHJlZiBIQUxfRkxBU0hfT0JfVW5sb2NrKCkgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgdG8gdW5sb2NrIHRoZSBvcHRpb25zIGJ5dGVzCisgICogICAgICAgICBUaGUgZnVuY3Rpb24gQHJlZiBIQUxfRkxBU0hfT0JfTGF1bmNoKCkgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciB0byBmb3JjZSB0aGUgcmVsb2FkIG9mIHRoZSBvcHRpb25zIGJ5dGVzCisgICogICAgICAgICAoc3lzdGVtIHJlc2V0IHdpbGwgb2NjdXIpCisgICoKKyAgKiBAcGFyYW0gIHBPQkluaXQgcG9pbnRlciB0byBhbiBGTEFTSF9PQkluaXRTdHJ1Y3Qgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgcHJvZ3JhbW1pbmcuCisgICoKKyAgKiBAcmV0dmFsIEhBTF9TdGF0dXNUeXBlRGVmIEhBTCBTdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSEV4X09CUHJvZ3JhbShGTEFTSF9PQlByb2dyYW1Jbml0VHlwZURlZiAqcE9CSW5pdCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX0VSUk9SOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soJnBGbGFzaCk7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX09QVElPTkJZVEUocE9CSW5pdC0+T3B0aW9uVHlwZSkpOworCisgIC8qIFdyaXRlIHByb3RlY3Rpb24gY29uZmlndXJhdGlvbiAqLworICBpZigocE9CSW5pdC0+T3B0aW9uVHlwZSAmIE9QVElPTkJZVEVfV1JQKSA9PSBPUFRJT05CWVRFX1dSUCkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19XUlBTVEFURShwT0JJbml0LT5XUlBTdGF0ZSkpOworICAgIGlmIChwT0JJbml0LT5XUlBTdGF0ZSA9PSBPQl9XUlBTVEFURV9FTkFCTEUpCisgICAgeworICAgICAgLyogRW5hYmxlIG9mIFdyaXRlIHByb3RlY3Rpb24gb24gdGhlIHNlbGVjdGVkIHBhZ2UgKi8KKyAgICAgIHN0YXR1cyA9IEZMQVNIX09CX0VuYWJsZVdSUChwT0JJbml0LT5XUlBQYWdlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgb2YgV3JpdGUgcHJvdGVjdGlvbiBvbiB0aGUgc2VsZWN0ZWQgcGFnZSAqLworICAgICAgc3RhdHVzID0gRkxBU0hfT0JfRGlzYWJsZVdSUChwT0JJbml0LT5XUlBQYWdlKTsKKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKCZwRmxhc2gpOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgIH0KKworICAvKiBSZWFkIHByb3RlY3Rpb24gY29uZmlndXJhdGlvbiAqLworICBpZigocE9CSW5pdC0+T3B0aW9uVHlwZSAmIE9QVElPTkJZVEVfUkRQKSA9PSBPUFRJT05CWVRFX1JEUCkKKyAgeworICAgIHN0YXR1cyA9IEZMQVNIX09CX1JEUF9MZXZlbENvbmZpZyhwT0JJbml0LT5SRFBMZXZlbCk7CisgICAgaWYgKHN0YXR1cyAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKCZwRmxhc2gpOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgIH0KKworICAvKiBVU0VSIGNvbmZpZ3VyYXRpb24gKi8KKyAgaWYoKHBPQkluaXQtPk9wdGlvblR5cGUgJiBPUFRJT05CWVRFX1VTRVIpID09IE9QVElPTkJZVEVfVVNFUikKKyAgeworICAgIHN0YXR1cyA9IEZMQVNIX09CX1VzZXJDb25maWcocE9CSW5pdC0+VVNFUkNvbmZpZyk7CisgICAgaWYgKHN0YXR1cyAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKCZwRmxhc2gpOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgIH0KKworICAvKiBEQVRBIGNvbmZpZ3VyYXRpb24qLworICBpZigocE9CSW5pdC0+T3B0aW9uVHlwZSAmIE9QVElPTkJZVEVfREFUQSkgPT0gT1BUSU9OQllURV9EQVRBKQorICB7CisgICAgc3RhdHVzID0gRkxBU0hfT0JfUHJvZ3JhbURhdGEocE9CSW5pdC0+REFUQUFkZHJlc3MsIHBPQkluaXQtPkRBVEFEYXRhKTsKKyAgICBpZiAoc3RhdHVzICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soJnBGbGFzaCk7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKCZwRmxhc2gpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBPcHRpb24gYnl0ZSBjb25maWd1cmF0aW9uCisgICogQHBhcmFtICBwT0JJbml0IHBvaW50ZXIgdG8gYW4gRkxBU0hfT0JJbml0U3RydWN0IHN0cnVjdHVyZSB0aGF0CisgICogICAgICAgICBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHByb2dyYW1taW5nLgorICAqCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9GTEFTSEV4X09CR2V0Q29uZmlnKEZMQVNIX09CUHJvZ3JhbUluaXRUeXBlRGVmICpwT0JJbml0KQoreworICBwT0JJbml0LT5PcHRpb25UeXBlID0gT1BUSU9OQllURV9XUlAgfCBPUFRJT05CWVRFX1JEUCB8IE9QVElPTkJZVEVfVVNFUjsKKworICAvKkdldCBXUlAqLworICBwT0JJbml0LT5XUlBQYWdlID0gRkxBU0hfT0JfR2V0V1JQKCk7CisKKyAgLypHZXQgUkRQIExldmVsKi8KKyAgcE9CSW5pdC0+UkRQTGV2ZWwgPSBGTEFTSF9PQl9HZXRSRFAoKTsKKworICAvKkdldCBVU0VSKi8KKyAgcE9CSW5pdC0+VVNFUkNvbmZpZyA9IEZMQVNIX09CX0dldFVzZXIoKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIE9wdGlvbiBieXRlIHVzZXIgZGF0YQorICAqIEBwYXJhbSAgREFUQUFkcmVzcyBBZGRyZXNzIG9mIHRoZSBvcHRpb24gYnl0ZSBEQVRBCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBPQl9EQVRBX0FERFJFU1NfREFUQTAKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBPQl9EQVRBX0FERFJFU1NfREFUQTEKKyAgKiBAcmV0dmFsIFZhbHVlIHByb2dyYW1tZWQgaW4gVVNFUiBkYXRhCisgICovCit1aW50MzJfdCBIQUxfRkxBU0hFeF9PQkdldFVzZXJEYXRhKHVpbnQzMl90IERBVEFBZHJlc3MpCit7CisgIHVpbnQzMl90IHZhbHVlID0gMFU7CisgIAorICBpZiAoREFUQUFkcmVzcyA9PSBPQl9EQVRBX0FERFJFU1NfREFUQTApCisgIHsKKyAgICAvKiBHZXQgdmFsdWUgcHJvZ3JhbW1lZCBpbiBPQiBVU0VSIERhdGEwICovCisgICAgdmFsdWUgPSBSRUFEX0JJVChGTEFTSC0+T0JSLCBGTEFTSF9PQlJfREFUQTApID4+IEZMQVNIX1BPU0lUSU9OX09CX1VTRVJEQVRBMF9CSVQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogR2V0IHZhbHVlIHByb2dyYW1tZWQgaW4gT0IgVVNFUiBEYXRhMSAqLworICAgIHZhbHVlID0gUkVBRF9CSVQoRkxBU0gtPk9CUiwgRkxBU0hfT0JSX0RBVEExKSA+PiBGTEFTSF9QT1NJVElPTl9PQl9VU0VSREFUQTFfQklUOworICB9CisgIAorICByZXR1cm4gdmFsdWU7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBGTEFTSEV4X1ByaXZhdGVfRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKgorICAqIEBicmllZiAgRnVsbCBlcmFzZSBvZiBGTEFTSCBtZW1vcnkgQmFuayAKKyAgKgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgRkxBU0hfTWFzc0VyYXNlKHZvaWQpCit7CisgIC8qIENsZWFuIHRoZSBlcnJvciBjb250ZXh0ICovCisgIHBGbGFzaC5FcnJvckNvZGUgPSBIQUxfRkxBU0hfRVJST1JfTk9ORTsKKworICAgIC8qIE9ubHkgYmFuazEgd2lsbCBiZSBlcmFzZWQqLworICAgIFNFVF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9NRVIpOworICAgIFNFVF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9TVFJUKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gb2YgdGhlIGRlc2lyZWQgcGFnZXMKKyAgKiBAbm90ZSAgIEFuIG9wdGlvbiBieXRlIGVyYXNlIGlzIGRvbmUgYXV0b21hdGljYWxseSBpbiB0aGlzIGZ1bmN0aW9uLiAKKyAgKiBAbm90ZSAgIFdoZW4gdGhlIG1lbW9yeSByZWFkIHByb3RlY3Rpb24gbGV2ZWwgaXMgc2VsZWN0ZWQgKFJEUCBsZXZlbCA9IDEpLCAKKyAgKiAgICAgICAgIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBwcm9ncmFtIG9yIGVyYXNlIHRoZSBmbGFzaCBwYWdlIGkgaWYKKyAgKiAgICAgICAgIGRlYnVnIGZlYXR1cmVzIGFyZSBjb25uZWN0ZWQgb3IgYm9vdCBjb2RlIGlzIGV4ZWN1dGVkIGluIFJBTSwgZXZlbiBpZiBuV1JQaSA9IDEgCisgICogCisgICogQHBhcmFtICBXcml0ZVByb3RlY3RQYWdlIHNwZWNpZmllcyB0aGUgcGFnZShzKSB0byBiZSB3cml0ZSBwcm90ZWN0ZWQuCisgICogICAgICAgICBUaGUgdmFsdWUgb2YgdGhpcyBwYXJhbWV0ZXIgZGVwZW5kIG9uIGRldmljZSB1c2VkIHdpdGhpbiB0aGUgc2FtZSBzZXJpZXMgCisgICogQHJldHZhbCBIQUwgc3RhdHVzIAorICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEZMQVNIX09CX0VuYWJsZVdSUCh1aW50MzJfdCBXcml0ZVByb3RlY3RQYWdlKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIHVpbnQxNl90IFdSUDBfRGF0YSA9IDB4RkZGRlU7CisjaWYgZGVmaW5lZChPQl9XUlAxX1dSUDEpCisgIHVpbnQxNl90IFdSUDFfRGF0YSA9IDB4RkZGRlU7CisjZW5kaWYgLyogT0JfV1JQMV9XUlAxICovCisjaWYgZGVmaW5lZChPQl9XUlAyX1dSUDIpCisgIHVpbnQxNl90IFdSUDJfRGF0YSA9IDB4RkZGRlU7CisjZW5kaWYgLyogT0JfV1JQMl9XUlAyICovCisjaWYgZGVmaW5lZChPQl9XUlAzX1dSUDMpCisgIHVpbnQxNl90IFdSUDNfRGF0YSA9IDB4RkZGRlU7CisjZW5kaWYgLyogT0JfV1JQM19XUlAzICovCisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfT0JfV1JQKFdyaXRlUHJvdGVjdFBhZ2UpKTsKKyAgICAKKyAgLyogR2V0IGN1cnJlbnQgd3JpdGUgcHJvdGVjdGVkIHBhZ2VzIGFuZCB0aGUgbmV3IHBhZ2VzIHRvIGJlIHByb3RlY3RlZCAqKioqKiovCisgIFdyaXRlUHJvdGVjdFBhZ2UgPSAodWludDMyX3QpKH4oKH5GTEFTSF9PQl9HZXRXUlAoKSkgfCBXcml0ZVByb3RlY3RQYWdlKSk7CisgIAorI2lmIGRlZmluZWQoT0JfV1JQX1BBR0VTMFRPMTVNQVNLKQorICBXUlAwX0RhdGEgPSAodWludDE2X3QpKFdyaXRlUHJvdGVjdFBhZ2UgJiBPQl9XUlBfUEFHRVMwVE8xNU1BU0spOworI2VuZGlmIC8qIE9CX1dSUF9QQUdFUzBUTzMxTUFTSyAqLworICAKKyNpZiBkZWZpbmVkKE9CX1dSUF9QQUdFUzE2VE8zMU1BU0spCisgIFdSUDFfRGF0YSA9ICh1aW50MTZfdCkoKFdyaXRlUHJvdGVjdFBhZ2UgJiBPQl9XUlBfUEFHRVMxNlRPMzFNQVNLKSA+PiA4VSk7CisjZW5kaWYgLyogT0JfV1JQX1BBR0VTMzJUTzYzTUFTSyAqLworIAorI2lmIGRlZmluZWQoT0JfV1JQX1BBR0VTMzJUTzQ3TUFTSykKKyAgV1JQMl9EYXRhID0gKHVpbnQxNl90KSgoV3JpdGVQcm90ZWN0UGFnZSAmIE9CX1dSUF9QQUdFUzMyVE80N01BU0spID4+IDE2VSk7CisjZW5kaWYgLyogT0JfV1JQX1BBR0VTMzJUTzQ3TUFTSyAqLworCisjaWYgZGVmaW5lZChPQl9XUlBfUEFHRVM0OFRPMTI3TUFTSykKKyAgV1JQM19EYXRhID0gKHVpbnQxNl90KSgoV3JpdGVQcm90ZWN0UGFnZSAmIE9CX1dSUF9QQUdFUzQ4VE8xMjdNQVNLKSA+PiAyNFUpOyAKKyNlbGlmIGRlZmluZWQoT0JfV1JQX1BBR0VTNDhUTzI1NU1BU0spCisgIFdSUDNfRGF0YSA9ICh1aW50MTZfdCkoKFdyaXRlUHJvdGVjdFBhZ2UgJiBPQl9XUlBfUEFHRVM0OFRPMjU1TUFTSykgPj4gMjRVKTsgCisjZW5kaWYgLyogT0JfV1JQX1BBR0VTNDhUTzYzTUFTSyAqLworICAKKyAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovCisgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKCh1aW50MzJfdClGTEFTSF9USU1FT1VUX1ZBTFVFKTsKKworICBpZihzdGF0dXMgPT0gSEFMX09LKQorICB7IAorICAgIC8qIENsZWFuIHRoZSBlcnJvciBjb250ZXh0ICovCisgICAgcEZsYXNoLkVycm9yQ29kZSA9IEhBTF9GTEFTSF9FUlJPUl9OT05FOworCisgICAgLyogVG8gYmUgYWJsZSB0byB3cml0ZSBhZ2FpbiBvcHRpb24gYnl0ZSwgbmVlZCB0byBwZXJmb3JtIGEgb3B0aW9uIGJ5dGUgZXJhc2UgKi8KKyAgICBzdGF0dXMgPSBIQUxfRkxBU0hFeF9PQkVyYXNlKCk7CisgICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spICAKKyAgICB7CisgICAgICAvKiBFbmFibGUgd3JpdGUgcHJvdGVjdGlvbiAqLworICAgICAgU0VUX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX09QVFBHKTsKKworI2lmIGRlZmluZWQoT0JfV1JQMF9XUlAwKQorICAgICAgaWYoV1JQMF9EYXRhICE9IDB4RkZVKQorICAgICAgeworICAgICAgICBPQi0+V1JQMCAmPSBXUlAwX0RhdGE7CisgICAgICAgIAorICAgICAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgICAgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oKHVpbnQzMl90KUZMQVNIX1RJTUVPVVRfVkFMVUUpOworICAgICAgfQorI2VuZGlmIC8qIE9CX1dSUDBfV1JQMCAqLworCisjaWYgZGVmaW5lZChPQl9XUlAxX1dSUDEpCisgICAgICBpZigoc3RhdHVzID09IEhBTF9PSykgJiYgKFdSUDFfRGF0YSAhPSAweEZGVSkpCisgICAgICB7CisgICAgICAgIE9CLT5XUlAxICY9IFdSUDFfRGF0YTsKKyAgICAgICAgCisgICAgICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLworICAgICAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbigodWludDMyX3QpRkxBU0hfVElNRU9VVF9WQUxVRSk7CisgICAgICB9CisjZW5kaWYgLyogT0JfV1JQMV9XUlAxICovCisKKyNpZiBkZWZpbmVkKE9CX1dSUDJfV1JQMikKKyAgICAgIGlmKChzdGF0dXMgPT0gSEFMX09LKSAmJiAoV1JQMl9EYXRhICE9IDB4RkZVKSkKKyAgICAgIHsKKyAgICAgICAgT0ItPldSUDIgJj0gV1JQMl9EYXRhOworICAgICAgICAKKyAgICAgICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovCisgICAgICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKCh1aW50MzJfdClGTEFTSF9USU1FT1VUX1ZBTFVFKTsKKyAgICAgIH0KKyNlbmRpZiAvKiBPQl9XUlAyX1dSUDIgKi8KKworI2lmIGRlZmluZWQoT0JfV1JQM19XUlAzKQorICAgICAgaWYoKHN0YXR1cyA9PSBIQUxfT0spICYmIChXUlAzX0RhdGEgIT0gMHhGRlUpKQorICAgICAgeworICAgICAgICBPQi0+V1JQMyAmPSBXUlAzX0RhdGE7CisgICAgICAgIAorICAgICAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgICAgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oKHVpbnQzMl90KUZMQVNIX1RJTUVPVVRfVkFMVUUpOworICAgICAgfQorI2VuZGlmIC8qIE9CX1dSUDNfV1JQMyAqLworCisgICAgICAvKiBpZiB0aGUgcHJvZ3JhbSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBkaXNhYmxlIHRoZSBPUFRQRyBCaXQgKi8KKyAgICAgIENMRUFSX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX09QVFBHKTsKKyAgICB9CisgIH0KKyAgCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBvZiB0aGUgZGVzaXJlZCBwYWdlcworICAqIEBub3RlICAgQW4gb3B0aW9uIGJ5dGUgZXJhc2UgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IGluIHRoaXMgZnVuY3Rpb24uIAorICAqIEBub3RlICAgV2hlbiB0aGUgbWVtb3J5IHJlYWQgcHJvdGVjdGlvbiBsZXZlbCBpcyBzZWxlY3RlZCAoUkRQIGxldmVsID0gMSksIAorICAqICAgICAgICAgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHByb2dyYW0gb3IgZXJhc2UgdGhlIGZsYXNoIHBhZ2UgaSBpZiAgIAorICAqICAgICAgICAgZGVidWcgZmVhdHVyZXMgYXJlIGNvbm5lY3RlZCBvciBib290IGNvZGUgaXMgZXhlY3V0ZWQgaW4gUkFNLCBldmVuIGlmIG5XUlBpID0gMSAKKyAgKiAKKyAgKiBAcGFyYW0gIFdyaXRlUHJvdGVjdFBhZ2Ugc3BlY2lmaWVzIHRoZSBwYWdlKHMpIHRvIGJlIHdyaXRlIHVucHJvdGVjdGVkLgorICAqICAgICAgICAgVGhlIHZhbHVlIG9mIHRoaXMgcGFyYW1ldGVyIGRlcGVuZCBvbiBkZXZpY2UgdXNlZCB3aXRoaW4gdGhlIHNhbWUgc2VyaWVzIAorICAqIEByZXR2YWwgSEFMIHN0YXR1cyAKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBGTEFTSF9PQl9EaXNhYmxlV1JQKHVpbnQzMl90IFdyaXRlUHJvdGVjdFBhZ2UpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgdWludDE2X3QgV1JQMF9EYXRhID0gMHhGRkZGVTsKKyNpZiBkZWZpbmVkKE9CX1dSUDFfV1JQMSkKKyAgdWludDE2X3QgV1JQMV9EYXRhID0gMHhGRkZGVTsKKyNlbmRpZiAvKiBPQl9XUlAxX1dSUDEgKi8KKyNpZiBkZWZpbmVkKE9CX1dSUDJfV1JQMikKKyAgdWludDE2X3QgV1JQMl9EYXRhID0gMHhGRkZGVTsKKyNlbmRpZiAvKiBPQl9XUlAyX1dSUDIgKi8KKyNpZiBkZWZpbmVkKE9CX1dSUDNfV1JQMykKKyAgdWludDE2X3QgV1JQM19EYXRhID0gMHhGRkZGVTsKKyNlbmRpZiAvKiBPQl9XUlAzX1dSUDMgKi8KKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19PQl9XUlAoV3JpdGVQcm90ZWN0UGFnZSkpOworCisgIC8qIEdldCBjdXJyZW50IHdyaXRlIHByb3RlY3RlZCBwYWdlcyBhbmQgdGhlIG5ldyBwYWdlcyB0byBiZSB1bnByb3RlY3RlZCAqKioqKiovCisgIFdyaXRlUHJvdGVjdFBhZ2UgPSAoRkxBU0hfT0JfR2V0V1JQKCkgfCBXcml0ZVByb3RlY3RQYWdlKTsKKworI2lmIGRlZmluZWQoT0JfV1JQX1BBR0VTMFRPMTVNQVNLKQorICBXUlAwX0RhdGEgPSAodWludDE2X3QpKFdyaXRlUHJvdGVjdFBhZ2UgJiBPQl9XUlBfUEFHRVMwVE8xNU1BU0spOworI2VuZGlmIC8qIE9CX1dSUF9QQUdFUzBUTzMxTUFTSyAqLworICAKKyNpZiBkZWZpbmVkKE9CX1dSUF9QQUdFUzE2VE8zMU1BU0spCisgIFdSUDFfRGF0YSA9ICh1aW50MTZfdCkoKFdyaXRlUHJvdGVjdFBhZ2UgJiBPQl9XUlBfUEFHRVMxNlRPMzFNQVNLKSA+PiA4VSk7CisjZW5kaWYgLyogT0JfV1JQX1BBR0VTMzJUTzYzTUFTSyAqLworIAorI2lmIGRlZmluZWQoT0JfV1JQX1BBR0VTMzJUTzQ3TUFTSykKKyAgV1JQMl9EYXRhID0gKHVpbnQxNl90KSgoV3JpdGVQcm90ZWN0UGFnZSAmIE9CX1dSUF9QQUdFUzMyVE80N01BU0spID4+IDE2VSk7CisjZW5kaWYgLyogT0JfV1JQX1BBR0VTMzJUTzQ3TUFTSyAqLworCisjaWYgZGVmaW5lZChPQl9XUlBfUEFHRVM0OFRPMTI3TUFTSykKKyAgV1JQM19EYXRhID0gKHVpbnQxNl90KSgoV3JpdGVQcm90ZWN0UGFnZSAmIE9CX1dSUF9QQUdFUzQ4VE8xMjdNQVNLKSA+PiAyNFUpOyAKKyNlbGlmIGRlZmluZWQoT0JfV1JQX1BBR0VTNDhUTzI1NU1BU0spCisgIFdSUDNfRGF0YSA9ICh1aW50MTZfdCkoKFdyaXRlUHJvdGVjdFBhZ2UgJiBPQl9XUlBfUEFHRVM0OFRPMjU1TUFTSykgPj4gMjRVKTsgCisjZW5kaWYgLyogT0JfV1JQX1BBR0VTNDhUTzYzTUFTSyAqLworCisgICAgCisgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLworICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbigodWludDMyX3QpRkxBU0hfVElNRU9VVF9WQUxVRSk7CisKKyAgaWYoc3RhdHVzID09IEhBTF9PSykKKyAgeyAKKyAgICAvKiBDbGVhbiB0aGUgZXJyb3IgY29udGV4dCAqLworICAgIHBGbGFzaC5FcnJvckNvZGUgPSBIQUxfRkxBU0hfRVJST1JfTk9ORTsKKworICAgIC8qIFRvIGJlIGFibGUgdG8gd3JpdGUgYWdhaW4gb3B0aW9uIGJ5dGUsIG5lZWQgdG8gcGVyZm9ybSBhIG9wdGlvbiBieXRlIGVyYXNlICovCisgICAgc3RhdHVzID0gSEFMX0ZMQVNIRXhfT0JFcmFzZSgpOworICAgIGlmIChzdGF0dXMgPT0gSEFMX09LKSAgCisgICAgeworICAgICAgU0VUX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX09QVFBHKTsKKworI2lmIGRlZmluZWQoT0JfV1JQMF9XUlAwKQorICAgICAgaWYoV1JQMF9EYXRhICE9IDB4RkZVKQorICAgICAgeworICAgICAgICBPQi0+V1JQMCB8PSBXUlAwX0RhdGE7CisgICAgICAgIAorICAgICAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgICAgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oKHVpbnQzMl90KUZMQVNIX1RJTUVPVVRfVkFMVUUpOworICAgICAgfQorI2VuZGlmIC8qIE9CX1dSUDBfV1JQMCAqLworCisjaWYgZGVmaW5lZChPQl9XUlAxX1dSUDEpCisgICAgICBpZigoc3RhdHVzID09IEhBTF9PSykgJiYgKFdSUDFfRGF0YSAhPSAweEZGVSkpCisgICAgICB7CisgICAgICAgIE9CLT5XUlAxIHw9IFdSUDFfRGF0YTsKKyAgICAgICAgCisgICAgICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLworICAgICAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbigodWludDMyX3QpRkxBU0hfVElNRU9VVF9WQUxVRSk7CisgICAgICB9CisjZW5kaWYgLyogT0JfV1JQMV9XUlAxICovCisKKyNpZiBkZWZpbmVkKE9CX1dSUDJfV1JQMikKKyAgICAgIGlmKChzdGF0dXMgPT0gSEFMX09LKSAmJiAoV1JQMl9EYXRhICE9IDB4RkZVKSkKKyAgICAgIHsKKyAgICAgICAgT0ItPldSUDIgfD0gV1JQMl9EYXRhOworICAgICAgICAKKyAgICAgICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovCisgICAgICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKCh1aW50MzJfdClGTEFTSF9USU1FT1VUX1ZBTFVFKTsKKyAgICAgIH0KKyNlbmRpZiAvKiBPQl9XUlAyX1dSUDIgKi8KKworI2lmIGRlZmluZWQoT0JfV1JQM19XUlAzKQorICAgICAgaWYoKHN0YXR1cyA9PSBIQUxfT0spICYmIChXUlAzX0RhdGEgIT0gMHhGRlUpKQorICAgICAgeworICAgICAgICBPQi0+V1JQMyB8PSBXUlAzX0RhdGE7CisgICAgICAgIAorICAgICAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgICAgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oKHVpbnQzMl90KUZMQVNIX1RJTUVPVVRfVkFMVUUpOworICAgICAgfQorI2VuZGlmIC8qIE9CX1dSUDNfV1JQMyAqLworCisgICAgICAvKiBpZiB0aGUgcHJvZ3JhbSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBkaXNhYmxlIHRoZSBPUFRQRyBCaXQgKi8KKyAgICAgIENMRUFSX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX09QVFBHKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHJlYWQgcHJvdGVjdGlvbiBsZXZlbC4KKyAgKiBAcGFyYW0gIFJlYWRQcm90ZWN0TGV2ZWwgc3BlY2lmaWVzIHRoZSByZWFkIHByb3RlY3Rpb24gbGV2ZWwuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIE9CX1JEUF9MRVZFTF8wIE5vIHByb3RlY3Rpb24KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBPQl9SRFBfTEVWRUxfMSBSZWFkIHByb3RlY3Rpb24gb2YgdGhlIG1lbW9yeQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIE9CX1JEUF9MRVZFTF8yIEZ1bGwgY2hpcCBwcm90ZWN0aW9uCisgICogQG5vdGUgICBXYXJuaW5nOiBXaGVuIGVuYWJsaW5nIE9CX1JEUCBsZXZlbCAyIGl0J3Mgbm8gbW9yZSBwb3NzaWJsZSB0byBnbyBiYWNrIHRvIGxldmVsIDEgb3IgMAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEZMQVNIX09CX1JEUF9MZXZlbENvbmZpZyh1aW50OF90IFJlYWRQcm90ZWN0TGV2ZWwpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19PQl9SRFBfTEVWRUwoUmVhZFByb3RlY3RMZXZlbCkpOworICAKKyAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovCisgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKCh1aW50MzJfdClGTEFTSF9USU1FT1VUX1ZBTFVFKTsKKyAgCisgIGlmKHN0YXR1cyA9PSBIQUxfT0spCisgIHsgCisgICAgLyogQ2xlYW4gdGhlIGVycm9yIGNvbnRleHQgKi8KKyAgICBwRmxhc2guRXJyb3JDb2RlID0gSEFMX0ZMQVNIX0VSUk9SX05PTkU7CisgICAgCisgICAgLyogSWYgdGhlIHByZXZpb3VzIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIHByb2NlZWQgdG8gZXJhc2UgdGhlIG9wdGlvbiBieXRlcyAqLworICAgIFNFVF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9PUFRFUik7CisgICAgU0VUX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX1NUUlQpOworCisgICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovCisgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oKHVpbnQzMl90KUZMQVNIX1RJTUVPVVRfVkFMVUUpOworCisgICAgLyogSWYgdGhlIGVyYXNlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIGRpc2FibGUgdGhlIE9QVEVSIEJpdCAqLworICAgIENMRUFSX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX09QVEVSKTsKKworICAgIGlmKHN0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBPcHRpb24gQnl0ZXMgUHJvZ3JhbW1pbmcgb3BlcmF0aW9uICovCisgICAgICBTRVRfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfT1BUUEcpOworICAgICAgCisgICAgICBXUklURV9SRUcoT0ItPlJEUCwgUmVhZFByb3RlY3RMZXZlbCk7CisgICAgICAKKyAgICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLworICAgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oKHVpbnQzMl90KUZMQVNIX1RJTUVPVVRfVkFMVUUpOyAKKyAgICAgIAorICAgICAgLyogaWYgdGhlIHByb2dyYW0gb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgZGlzYWJsZSB0aGUgT1BUUEcgQml0ICovCisgICAgICBDTEVBUl9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9PUFRQRyk7CisgICAgfQorICB9CisgIAorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFByb2dyYW0gdGhlIEZMQVNIIFVzZXIgT3B0aW9uIEJ5dGUuICAgIAorICAqIEBub3RlICAgUHJvZ3JhbW1pbmcgb2YgdGhlIE9CIHNob3VsZCBiZSBwZXJmb3JtZWQgb25seSBhZnRlciBhbiBlcmFzZSAob3RoZXJ3aXNlIFBHRVJSIG9jY3VycykKKyAgKiBAcGFyYW0gIFVzZXJDb25maWcgVGhlIEZMQVNIIFVzZXIgT3B0aW9uIEJ5dGVzIHZhbHVlczogSVdER19TVyhCaXQwKSwgUlNUX1NUT1AoQml0MSksIFJTVF9TVERCWShCaXQyKSwgbkJPT1QxKEJpdDQpLAorICAqICAgICAgICAgVkREQV9BbmFsb2dfTW9uaXRvcmluZyhCaXQ1KSBhbmQgU1JBTV9QYXJpdHlfRW5hYmxlKEJpdDYpLiAKKyAgKiAgICAgICAgIEFuZCBTREFEQzEyX1ZERF9NT05JVE9SKEJpdDcpIGZvciBTVE0zMkYzNzMgb3IgU1RNMzJGMzc4IC4gCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgRkxBU0hfT0JfVXNlckNvbmZpZyh1aW50OF90IFVzZXJDb25maWcpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfT0JfSVdER19TT1VSQ0UoKFVzZXJDb25maWcmT0JfSVdER19TVykpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX09CX1NUT1BfU09VUkNFKChVc2VyQ29uZmlnJk9CX1NUT1BfTk9fUlNUKSkpOworICBhc3NlcnRfcGFyYW0oSVNfT0JfU1REQllfU09VUkNFKChVc2VyQ29uZmlnJk9CX1NUREJZX05PX1JTVCkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX09CX0JPT1QxKChVc2VyQ29uZmlnJk9CX0JPT1QxX1NFVCkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX09CX1ZEREFfQU5BTE9HKChVc2VyQ29uZmlnJk9CX1ZEREFfQU5BTE9HX09OKSkpOworICBhc3NlcnRfcGFyYW0oSVNfT0JfU1JBTV9QQVJJVFkoKFVzZXJDb25maWcmT0JfU1JBTV9QQVJJVFlfUkVTRVQpKSk7CisjaWYgZGVmaW5lZChGTEFTSF9PQlJfU0RBREMxMl9WRERfTU9OSVRPUikKKyAgYXNzZXJ0X3BhcmFtKElTX09CX1NEQUNEX1ZERF9NT05JVE9SKChVc2VyQ29uZmlnJk9CX1NEQUNEX1ZERF9NT05JVE9SX1NFVCkpKTsKKyNlbmRpZiAvKiBGTEFTSF9PQlJfU0RBREMxMl9WRERfTU9OSVRPUiAqLworCisgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLworICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbigodWludDMyX3QpRkxBU0hfVElNRU9VVF9WQUxVRSk7CisgIAorICBpZihzdGF0dXMgPT0gSEFMX09LKQorICB7ICAgICAKKyAgICAvKiBDbGVhbiB0aGUgZXJyb3IgY29udGV4dCAqLworICAgIHBGbGFzaC5FcnJvckNvZGUgPSBIQUxfRkxBU0hfRVJST1JfTk9ORTsKKworICAgIC8qIEVuYWJsZSB0aGUgT3B0aW9uIEJ5dGVzIFByb2dyYW1taW5nIG9wZXJhdGlvbiAqLworICAgIFNFVF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9PUFRQRyk7IAorIAorI2lmICAgZGVmaW5lZChGTEFTSF9PQlJfU0RBREMxMl9WRERfTU9OSVRPUikKKyAgICBPQi0+VVNFUiA9IChVc2VyQ29uZmlnIHwgMHgwOFUpOworI2Vsc2UKKyAgICBPQi0+VVNFUiA9IChVc2VyQ29uZmlnIHwgMHg4OFUpOworI2VuZGlmCisKKyAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbigodWludDMyX3QpRkxBU0hfVElNRU9VVF9WQUxVRSk7CisKKyAgICAvKiBpZiB0aGUgcHJvZ3JhbSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBkaXNhYmxlIHRoZSBPUFRQRyBCaXQgKi8KKyAgICBDTEVBUl9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9PUFRQRyk7CisgIH0KKyAgCisgIHJldHVybiBzdGF0dXM7IAorfQorCisvKioKKyAgKiBAYnJpZWYgIFByb2dyYW1zIGEgaGFsZiB3b3JkIGF0IGEgc3BlY2lmaWVkIE9wdGlvbiBCeXRlIERhdGEgYWRkcmVzcy4KKyAgKiBAbm90ZSAgIFRoZSBmdW5jdGlvbiBAcmVmIEhBTF9GTEFTSF9VbmxvY2soKSBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB0byB1bmxvY2sgdGhlIEZMQVNIIGludGVyZmFjZQorICAqICAgICAgICAgVGhlIGZ1bmN0aW9uIEByZWYgSEFMX0ZMQVNIX09CX1VubG9jaygpIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHRvIHVubG9jayB0aGUgb3B0aW9ucyBieXRlcworICAqICAgICAgICAgVGhlIGZ1bmN0aW9uIEByZWYgSEFMX0ZMQVNIX09CX0xhdW5jaCgpIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgdG8gZm9yY2UgdGhlIHJlbG9hZCBvZiB0aGUgb3B0aW9ucyBieXRlcyAKKyAgKiAgICAgICAgIChzeXN0ZW0gcmVzZXQgd2lsbCBvY2N1cikKKyAgKiAgICAgICAgIFByb2dyYW1taW5nIG9mIHRoZSBPQiBzaG91bGQgYmUgcGVyZm9ybWVkIG9ubHkgYWZ0ZXIgYW4gZXJhc2UgKG90aGVyd2lzZSBQR0VSUiBvY2N1cnMpCisgICogQHBhcmFtICBBZGRyZXNzIHNwZWNpZmllcyB0aGUgYWRkcmVzcyB0byBiZSBwcm9ncmFtbWVkLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIDB4MUZGRkY4MDQgb3IgMHgxRkZGRjgwNi4gCisgICogQHBhcmFtICBEYXRhIHNwZWNpZmllcyB0aGUgZGF0YSB0byBiZSBwcm9ncmFtbWVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEZMQVNIX09CX1Byb2dyYW1EYXRhKHVpbnQzMl90IEFkZHJlc3MsIHVpbnQ4X3QgRGF0YSkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX0VSUk9SOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX09CX0RBVEFfQUREUkVTUyhBZGRyZXNzKSk7CisgIAorICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oKHVpbnQzMl90KUZMQVNIX1RJTUVPVVRfVkFMVUUpOworICAKKyAgaWYoc3RhdHVzID09IEhBTF9PSykKKyAgeworICAgIC8qIENsZWFuIHRoZSBlcnJvciBjb250ZXh0ICovCisgICAgcEZsYXNoLkVycm9yQ29kZSA9IEhBTF9GTEFTSF9FUlJPUl9OT05FOworCisgICAgLyogRW5hYmxlcyB0aGUgT3B0aW9uIEJ5dGVzIFByb2dyYW1taW5nIG9wZXJhdGlvbiAqLworICAgIFNFVF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9PUFRQRyk7IAorICAgICooX19JTyB1aW50MTZfdCopQWRkcmVzcyA9IERhdGE7CisgICAgCisgICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovCisgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oKHVpbnQzMl90KUZMQVNIX1RJTUVPVVRfVkFMVUUpOworICAgIAorICAgIC8qIElmIHRoZSBwcm9ncmFtIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIGRpc2FibGUgdGhlIE9QVFBHIEJpdCAqLworICAgIENMRUFSX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX09QVFBHKTsKKyAgfQorICAvKiBSZXR1cm4gdGhlIE9wdGlvbiBCeXRlIERhdGEgUHJvZ3JhbSBTdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIEZMQVNIIFdyaXRlIFByb3RlY3Rpb24gT3B0aW9uIEJ5dGVzIHZhbHVlLgorICAqIEByZXR2YWwgVGhlIEZMQVNIIFdyaXRlIFByb3RlY3Rpb24gT3B0aW9uIEJ5dGVzIHZhbHVlCisgICovCitzdGF0aWMgdWludDMyX3QgRkxBU0hfT0JfR2V0V1JQKHZvaWQpCit7CisgIC8qIFJldHVybiB0aGUgRkxBU0ggd3JpdGUgcHJvdGVjdGlvbiBSZWdpc3RlciB2YWx1ZSAqLworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhGTEFTSC0+V1JQUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgdGhlIEZMQVNIIFJlYWQgUHJvdGVjdGlvbiBsZXZlbC4KKyAgKiBAcmV0dmFsIEZMQVNIIFJEUCBsZXZlbAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBPQl9SRFBfTEVWRUxfMCBObyBwcm90ZWN0aW9uCisgICogICAgICAgICAgICBAYXJnIEByZWYgT0JfUkRQX0xFVkVMXzEgUmVhZCBwcm90ZWN0aW9uIG9mIHRoZSBtZW1vcnkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBPQl9SRFBfTEVWRUxfMiBGdWxsIGNoaXAgcHJvdGVjdGlvbgorICAqLworc3RhdGljIHVpbnQzMl90IEZMQVNIX09CX0dldFJEUCh2b2lkKQoreworICB1aW50MzJfdCB0bXBfcmVnID0gMFU7CisgIAorICAvKiBSZWFkIFJEUCBsZXZlbCBiaXRzICovCisjaWYgZGVmaW5lZChGTEFTSF9PQlJfUkRQUlQpCisgIHRtcF9yZWcgPSBSRUFEX0JJVChGTEFTSC0+T0JSLCBGTEFTSF9PQlJfUkRQUlQpOworI2VuZGlmCisjaWYgZGVmaW5lZChGTEFTSF9PQlJfTEVWRUwxX1BST1QpCisgIHRtcF9yZWcgPSBSRUFEX0JJVChGTEFTSC0+T0JSLCAoRkxBU0hfT0JSX0xFVkVMMV9QUk9UIHwgRkxBU0hfT0JSX0xFVkVMMl9QUk9UKSk7CisjZW5kaWYgLyogRkxBU0hfT0JSX0xFVkVMMV9QUk9UICovCisKKyNpZiBkZWZpbmVkKEZMQVNIX09CUl9SRFBSVCkKKyAgaWYgKHRtcF9yZWcgPT0gRkxBU0hfT0JSX1JEUFJUXzEpCisjZW5kaWYKKyNpZiBkZWZpbmVkKEZMQVNIX09CUl9MRVZFTDFfUFJPVCkKKyAgaWYgKHRtcF9yZWcgPT0gRkxBU0hfT0JSX0xFVkVMMV9QUk9UKQorI2VuZGlmIC8qIEZMQVNIX09CUl9MRVZFTDFfUFJPVCAqLworICB7CisgICAgcmV0dXJuIE9CX1JEUF9MRVZFTF8xOworICB9CisjaWYgICBkZWZpbmVkKEZMQVNIX09CUl9SRFBSVCkKKyAgZWxzZSBpZiAodG1wX3JlZyA9PSBGTEFTSF9PQlJfUkRQUlRfMikKKyNlbGlmIGRlZmluZWQoRkxBU0hfT0JSX0xFVkVMMl9QUk9UKQorICBlbHNlIGlmICh0bXBfcmVnID09IEZMQVNIX09CUl9MRVZFTDJfUFJPVCkKKyNlbmRpZgorICB7CisgICAgcmV0dXJuIE9CX1JEUF9MRVZFTF8yOworICB9CisgIGVsc2UgCisgIHsKKyAgICByZXR1cm4gT0JfUkRQX0xFVkVMXzA7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIEZMQVNIIFVzZXIgT3B0aW9uIEJ5dGUgdmFsdWUuCisgICogQHJldHZhbCAgVGhlIEZMQVNIIFVzZXIgT3B0aW9uIEJ5dGVzIHZhbHVlczogSVdER19TVyhCaXQwKSwgUlNUX1NUT1AoQml0MSksIFJTVF9TVERCWShCaXQyKSwgbkJPT1QxKEJpdDQpLAorICAqICAgICAgICAgVkREQV9BbmFsb2dfTW9uaXRvcmluZyhCaXQ1KSBhbmQgU1JBTV9QYXJpdHlfRW5hYmxlKEJpdDYpLiAKKyAgKiAgICAgICAgIEFuZCBTREFEQzEyX1ZERF9NT05JVE9SKEJpdDcpIGZvciBTVE0zMkYzNzMgb3IgU1RNMzJGMzc4IC4gCisgICovCitzdGF0aWMgdWludDhfdCBGTEFTSF9PQl9HZXRVc2VyKHZvaWQpCit7CisgIC8qIFJldHVybiB0aGUgVXNlciBPcHRpb24gQnl0ZSAqLworICByZXR1cm4gKHVpbnQ4X3QpKChSRUFEX1JFRyhGTEFTSC0+T0JSKSAmIEZMQVNIX09CUl9VU0VSKSA+PiBGTEFTSF9QT1NJVElPTl9JV0RHU1dfQklUKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEZMQVNICisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEZMQVNIX1ByaXZhdGVfRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKgorICAqIEBicmllZiAgRXJhc2UgdGhlIHNwZWNpZmllZCBGTEFTSCBtZW1vcnkgcGFnZQorICAqIEBwYXJhbSAgUGFnZUFkZHJlc3MgRkxBU0ggcGFnZSB0byBlcmFzZQorICAqICAgICAgICAgVGhlIHZhbHVlIG9mIHRoaXMgcGFyYW1ldGVyIGRlcGVuZCBvbiBkZXZpY2UgdXNlZCB3aXRoaW4gdGhlIHNhbWUgc2VyaWVzICAgICAgCisgICogCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEZMQVNIX1BhZ2VFcmFzZSh1aW50MzJfdCBQYWdlQWRkcmVzcykKK3sKKyAgLyogQ2xlYW4gdGhlIGVycm9yIGNvbnRleHQgKi8KKyAgcEZsYXNoLkVycm9yQ29kZSA9IEhBTF9GTEFTSF9FUlJPUl9OT05FOworCisgICAgLyogUHJvY2VlZCB0byBlcmFzZSB0aGUgcGFnZSAqLworICAgIFNFVF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9QRVIpOworICAgIFdSSVRFX1JFRyhGTEFTSC0+QVIsIFBhZ2VBZGRyZXNzKTsKKyAgICBTRVRfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfU1RSVCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfRkxBU0hfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmM3h4X2hhbF9ncGlvLmMgYi9TcmMvc3RtMzJmM3h4X2hhbF9ncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIwNWQxOQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfaGFsX2dwaW8uYwpAQCAtMCwwICsxLDU0NyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfZ3Bpby5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBHUElPIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIEdlbmVyYWwgUHVycG9zZSBJbnB1dC9PdXRwdXQgKEdQSU8pIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICMjIyMjIEdQSU8gUGVyaXBoZXJhbCBmZWF0dXJlcyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgICgrKSBFYWNoIHBvcnQgYml0IG9mIHRoZSBnZW5lcmFsLXB1cnBvc2UgSS9PIChHUElPKSBwb3J0cyBjYW4gYmUgaW5kaXZpZHVhbGx5CisgICAgICAgIGNvbmZpZ3VyZWQgYnkgc29mdHdhcmUgaW4gc2V2ZXJhbCBtb2RlczoKKyAgICAgICAgKCsrKSBJbnB1dCBtb2RlCisgICAgICAgICgrKykgQW5hbG9nIG1vZGUKKyAgICAgICAgKCsrKSBPdXRwdXQgbW9kZQorICAgICAgICAoKyspIEFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlCisgICAgICAgICgrKykgRXh0ZXJuYWwgaW50ZXJydXB0L2V2ZW50IGxpbmVzCisKKyAgICAoKykgRHVyaW5nIGFuZCBqdXN0IGFmdGVyIHJlc2V0LCB0aGUgYWx0ZXJuYXRlIGZ1bmN0aW9ucyBhbmQgZXh0ZXJuYWwgaW50ZXJydXB0CisgICAgICAgIGxpbmVzIGFyZSBub3QgYWN0aXZlIGFuZCB0aGUgSS9PIHBvcnRzIGFyZSBjb25maWd1cmVkIGluIGlucHV0IGZsb2F0aW5nIG1vZGUuCisKKyAgICAoKykgQWxsIEdQSU8gcGlucyBoYXZlIHdlYWsgaW50ZXJuYWwgcHVsbC11cCBhbmQgcHVsbC1kb3duIHJlc2lzdG9ycywgd2hpY2ggY2FuIGJlCisgICAgICAgIGFjdGl2YXRlZCBvciBub3QuCisKKyAgICAoKykgSW4gT3V0cHV0IG9yIEFsdGVybmF0ZSBtb2RlLCBlYWNoIElPIGNhbiBiZSBjb25maWd1cmVkIG9uIG9wZW4tZHJhaW4gb3IgcHVzaC1wdWxsCisgICAgICAgIHR5cGUgYW5kIHRoZSBJTyBzcGVlZCBjYW4gYmUgc2VsZWN0ZWQgZGVwZW5kaW5nIG9uIHRoZSBWREQgdmFsdWUuCisKKyAgICAoKykgVGhlIG1pY3JvY29udHJvbGxlciBJTyBwaW5zIGFyZSBjb25uZWN0ZWQgdG8gb25ib2FyZCBwZXJpcGhlcmFscy9tb2R1bGVzIHRocm91Z2ggYQorICAgICAgICBtdWx0aXBsZXhlciB0aGF0IGFsbG93cyBvbmx5IG9uZSBwZXJpcGhlcmFsIGFsdGVybmF0ZSBmdW5jdGlvbiAoQUYpIGNvbm5lY3RlZAorICAgICAgIHRvIGFuIElPIHBpbiBhdCBhIHRpbWUuIEluIHRoaXMgd2F5LCB0aGVyZSBjYW4gYmUgbm8gY29uZmxpY3QgYmV0d2VlbiBwZXJpcGhlcmFscworICAgICAgIHNoYXJpbmcgdGhlIHNhbWUgSU8gcGluLgorCisgICAgKCspIEFsbCBwb3J0cyBoYXZlIGV4dGVybmFsIGludGVycnVwdC9ldmVudCBjYXBhYmlsaXR5LiBUbyB1c2UgZXh0ZXJuYWwgaW50ZXJydXB0CisgICAgICAgIGxpbmVzLCB0aGUgcG9ydCBtdXN0IGJlIGNvbmZpZ3VyZWQgaW4gaW5wdXQgbW9kZS4gQWxsIGF2YWlsYWJsZSBHUElPIHBpbnMgYXJlCisgICAgICAgIGNvbm5lY3RlZCB0byB0aGUgMTYgZXh0ZXJuYWwgaW50ZXJydXB0L2V2ZW50IGxpbmVzIGZyb20gRVhUSTAgdG8gRVhUSTE1LgorCisgICAgKCspIFRoZSBleHRlcm5hbCBpbnRlcnJ1cHQvZXZlbnQgY29udHJvbGxlciBjb25zaXN0cyBvZiB1cCB0byAyMyBlZGdlIGRldGVjdG9ycworICAgICAgICAoMTYgbGluZXMgYXJlIGNvbm5lY3RlZCB0byBHUElPKSBmb3IgZ2VuZXJhdGluZyBldmVudC9pbnRlcnJ1cHQgcmVxdWVzdHMgKGVhY2gKKyAgICAgICAgaW5wdXQgbGluZSBjYW4gYmUgaW5kZXBlbmRlbnRseSBjb25maWd1cmVkIHRvIHNlbGVjdCB0aGUgdHlwZSAoaW50ZXJydXB0IG9yIGV2ZW50KQorICAgICAgICBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgdHJpZ2dlciBldmVudCAocmlzaW5nIG9yIGZhbGxpbmcgb3IgYm90aCkuIEVhY2ggbGluZSBjYW4KKyAgICAgICAgYWxzbyBiZSBtYXNrZWQgaW5kZXBlbmRlbnRseS4KKworICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgICgjKSBFbmFibGUgdGhlIEdQSU8gQUhCIGNsb2NrIHVzaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246IF9fSEFMX1JDQ19HUElPeF9DTEtfRU5BQkxFKCkuCisKKyAgICAoIykgQ29uZmlndXJlIHRoZSBHUElPIHBpbihzKSB1c2luZyBIQUxfR1BJT19Jbml0KCkuCisgICAgICAgICgrKykgQ29uZmlndXJlIHRoZSBJTyBtb2RlIHVzaW5nICJNb2RlIiBtZW1iZXIgZnJvbSBHUElPX0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICAgICAgICAoKyspIEFjdGl2YXRlIFB1bGwtdXAsIFB1bGwtZG93biByZXNpc3RvciB1c2luZyAiUHVsbCIgbWVtYmVyIGZyb20gR1BJT19Jbml0VHlwZURlZgorICAgICAgICAgICAgIHN0cnVjdHVyZS4KKyAgICAgICAgKCsrKSBJbiBjYXNlIG9mIE91dHB1dCBvciBhbHRlcm5hdGUgZnVuY3Rpb24gbW9kZSBzZWxlY3Rpb246IHRoZSBzcGVlZCBpcworICAgICAgICAgICAgIGNvbmZpZ3VyZWQgdGhyb3VnaCAiU3BlZWQiIG1lbWJlciBmcm9tIEdQSU9fSW5pdFR5cGVEZWYgc3RydWN0dXJlLgorICAgICAgICAoKyspIEluIGFsdGVybmF0ZSBtb2RlIGlzIHNlbGVjdGlvbiwgdGhlIGFsdGVybmF0ZSBmdW5jdGlvbiBjb25uZWN0ZWQgdG8gdGhlIElPCisgICAgICAgICAgICAgaXMgY29uZmlndXJlZCB0aHJvdWdoICJBbHRlcm5hdGUiIG1lbWJlciBmcm9tIEdQSU9fSW5pdFR5cGVEZWYgc3RydWN0dXJlLgorICAgICAgICAoKyspIEFuYWxvZyBtb2RlIGlzIHJlcXVpcmVkIHdoZW4gYSBwaW4gaXMgdG8gYmUgdXNlZCBhcyBBREMgY2hhbm5lbAorICAgICAgICAgICAgIG9yIERBQyBvdXRwdXQuCisgICAgICAgICgrKykgSW4gY2FzZSBvZiBleHRlcm5hbCBpbnRlcnJ1cHQvZXZlbnQgc2VsZWN0aW9uIHRoZSAiTW9kZSIgbWVtYmVyIGZyb20KKyAgICAgICAgICAgICBHUElPX0luaXRUeXBlRGVmIHN0cnVjdHVyZSBzZWxlY3QgdGhlIHR5cGUgKGludGVycnVwdCBvciBldmVudCkgYW5kCisgICAgICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgdHJpZ2dlciBldmVudCAocmlzaW5nIG9yIGZhbGxpbmcgb3IgYm90aCkuCisKKyAgICAoIykgSW4gY2FzZSBvZiBleHRlcm5hbCBpbnRlcnJ1cHQvZXZlbnQgbW9kZSBzZWxlY3Rpb24sIGNvbmZpZ3VyZSBOVklDIElSUSBwcmlvcml0eQorICAgICAgICBtYXBwZWQgdG8gdGhlIEVYVEkgbGluZSB1c2luZyBIQUxfTlZJQ19TZXRQcmlvcml0eSgpIGFuZCBlbmFibGUgaXQgdXNpbmcKKyAgICAgICAgSEFMX05WSUNfRW5hYmxlSVJRKCkuCisKKyAgICAoIykgVG8gZ2V0IHRoZSBsZXZlbCBvZiBhIHBpbiBjb25maWd1cmVkIGluIGlucHV0IG1vZGUgdXNlIEhBTF9HUElPX1JlYWRQaW4oKS4KKworICAgICgjKSBUbyBzZXQvcmVzZXQgdGhlIGxldmVsIG9mIGEgcGluIGNvbmZpZ3VyZWQgaW4gb3V0cHV0IG1vZGUgdXNlCisgICAgICAgIEhBTF9HUElPX1dyaXRlUGluKCkvSEFMX0dQSU9fVG9nZ2xlUGluKCkuCisKKyAgICgjKSBUbyBsb2NrIHBpbiBjb25maWd1cmF0aW9uIHVudGlsIG5leHQgcmVzZXQgdXNlIEhBTF9HUElPX0xvY2tQaW4oKS4KKyAgCisgICAgKCMpIER1cmluZyBhbmQganVzdCBhZnRlciByZXNldCwgdGhlIGFsdGVybmF0ZSBmdW5jdGlvbnMgYXJlIG5vdAorICAgICAgICBhY3RpdmUgYW5kIHRoZSBHUElPIHBpbnMgYXJlIGNvbmZpZ3VyZWQgaW4gaW5wdXQgZmxvYXRpbmcgbW9kZSAoZXhjZXB0IEpUQUcKKyAgICAgICAgcGlucykuCisKKyAgICAoIykgVGhlIExTRSBvc2NpbGxhdG9yIHBpbnMgT1NDMzJfSU4gYW5kIE9TQzMyX09VVCBjYW4gYmUgdXNlZCBhcyBnZW5lcmFsIHB1cnBvc2UKKyAgICAgICAgKFBDMTQgYW5kIFBDMTVVLCByZXNwZWN0aXZlbHkpIHdoZW4gdGhlIExTRSBvc2NpbGxhdG9yIGlzIG9mZi4gVGhlIExTRSBoYXMKKyAgICAgICAgcHJpb3JpdHkgb3ZlciB0aGUgR1BJTyBmdW5jdGlvbi4KKworICAgICgjKSBUaGUgSFNFIG9zY2lsbGF0b3IgcGlucyBPU0NfSU4vT1NDX09VVCBjYW4gYmUgdXNlZCBhcworICAgICAgICBnZW5lcmFsIHB1cnBvc2UgUEYwIGFuZCBQRjEsIHJlc3BlY3RpdmVseSwgd2hlbiB0aGUgSFNFIG9zY2lsbGF0b3IgaXMgb2ZmLgorICAgICAgICBUaGUgSFNFIGhhcyBwcmlvcml0eSBvdmVyIHRoZSBHUElPIGZ1bmN0aW9uLgorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJTyBHUElPCisgICogQGJyaWVmIEdQSU8gSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX0dQSU9fTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEdQSU9fUHJpdmF0ZV9EZWZpbmVzIEdQSU8gUHJpdmF0ZSBEZWZpbmVzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgR1BJT19NT0RFICAgICAgICAgICAgICgweDAwMDAwMDAzVSkKKyNkZWZpbmUgRVhUSV9NT0RFICAgICAgICAgICAgICgweDEwMDAwMDAwVSkKKyNkZWZpbmUgR1BJT19NT0RFX0lUICAgICAgICAgICgweDAwMDEwMDAwVSkKKyNkZWZpbmUgR1BJT19NT0RFX0VWVCAgICAgICAgICgweDAwMDIwMDAwVSkKKyNkZWZpbmUgUklTSU5HX0VER0UgICAgICAgICAgICgweDAwMTAwMDAwVSkKKyNkZWZpbmUgRkFMTElOR19FREdFICAgICAgICAgICgweDAwMjAwMDAwVSkKKyNkZWZpbmUgR1BJT19PVVRQVVRfVFlQRSAgICAgICgweDAwMDAwMDEwVSkKKworI2RlZmluZSBHUElPX05VTUJFUiAgICAgICAgICAgKDE2VSkKKy8qKgorICAqIEB9CisgICovCisgIAorLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEdQSU9fUHJpdmF0ZV9NYWNyb3MgR1BJTyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisvKioKKyAgKiBAfQorICAqLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEdQSU9fRXhwb3J0ZWRfRnVuY3Rpb25zIEdQSU8gRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBHUElPX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIAorICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgR1BJT3ggcGVyaXBoZXJhbCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIHRoZSBHUElPX0luaXQuCisgICogQHBhcmFtICBHUElPeCB3aGVyZSB4IGNhbiBiZSAoQS4uRikgdG8gc2VsZWN0IHRoZSBHUElPIHBlcmlwaGVyYWwgZm9yIFNUTTMyRjMgZmFtaWx5IGRldmljZXMKKyAgKiBAcGFyYW0gIEdQSU9fSW5pdCBwb2ludGVyIHRvIGEgR1BJT19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgR1BJTyBwZXJpcGhlcmFsLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfR1BJT19Jbml0KEdQSU9fVHlwZURlZiAgKkdQSU94LCBHUElPX0luaXRUeXBlRGVmICpHUElPX0luaXQpCit7CisgIHVpbnQzMl90IHBvc2l0aW9uID0gMHgwMFU7CisgIHVpbnQzMl90IGlvY3VycmVudCA9IDB4MDBVOworICB1aW50MzJfdCB0ZW1wID0gMHgwMFU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fQUxMX0lOU1RBTkNFKEdQSU94KSk7CisgIGFzc2VydF9wYXJhbShJU19HUElPX1BJTihHUElPX0luaXQtPlBpbikpOworICBhc3NlcnRfcGFyYW0oSVNfR1BJT19NT0RFKEdQSU9fSW5pdC0+TW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfR1BJT19QVUxMKEdQSU9fSW5pdC0+UHVsbCkpOworCisgIC8qIENvbmZpZ3VyZSB0aGUgcG9ydCBwaW5zICovCisgIHdoaWxlICgoKEdQSU9fSW5pdC0+UGluKSA+PiBwb3NpdGlvbikgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBHZXQgY3VycmVudCBpbyBwb3NpdGlvbiAqLworICAgIGlvY3VycmVudCA9IChHUElPX0luaXQtPlBpbikgJiAoMVUgPDwgcG9zaXRpb24pOworCisgICAgaWYoaW9jdXJyZW50KQorICAgIHsKKyAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdQSU8gTW9kZSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAvKiBJbiBjYXNlIG9mIEFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlIHNlbGVjdGlvbiAqLworICAgICAgaWYoKEdQSU9fSW5pdC0+TW9kZSA9PSBHUElPX01PREVfQUZfUFApIHx8IChHUElPX0luaXQtPk1vZGUgPT0gR1BJT19NT0RFX0FGX09EKSkKKyAgICAgIHsKKyAgICAgICAgLyogQ2hlY2sgdGhlIEFsdGVybmF0ZSBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCisgICAgICAgIGFzc2VydF9wYXJhbShJU19HUElPX0FGX0lOU1RBTkNFKEdQSU94KSk7CisgICAgICAgIGFzc2VydF9wYXJhbShJU19HUElPX0FGKEdQSU9fSW5pdC0+QWx0ZXJuYXRlKSk7CisgICAgICAgIAorICAgICAgICAvKiBDb25maWd1cmUgQWx0ZXJuYXRlIGZ1bmN0aW9uIG1hcHBlZCB3aXRoIHRoZSBjdXJyZW50IElPICovCisgICAgICAgIHRlbXAgPSBHUElPeC0+QUZSW3Bvc2l0aW9uID4+IDNdOworICAgICAgICB0ZW1wICY9IH4oMHhGVSA8PCAoKHVpbnQzMl90KShwb3NpdGlvbiAmIDB4MDdVKSAqIDRVKSkgOworICAgICAgICB0ZW1wIHw9ICgodWludDMyX3QpKEdQSU9fSW5pdC0+QWx0ZXJuYXRlKSA8PCAoKCh1aW50MzJfdClwb3NpdGlvbiAmIDB4MDdVKSAqIDRVKSk7CisgICAgICAgIEdQSU94LT5BRlJbcG9zaXRpb24gPj4gM10gPSB0ZW1wOworICAgICAgfQorCisgICAgICAvKiBDb25maWd1cmUgSU8gRGlyZWN0aW9uIG1vZGUgKElucHV0LCBPdXRwdXQsIEFsdGVybmF0ZSBvciBBbmFsb2cpICovCisgICAgICB0ZW1wID0gR1BJT3gtPk1PREVSOworICAgICAgdGVtcCAmPSB+KEdQSU9fTU9ERVJfTU9ERVIwIDw8IChwb3NpdGlvbiAqIDJVKSk7CisgICAgICB0ZW1wIHw9ICgoR1BJT19Jbml0LT5Nb2RlICYgR1BJT19NT0RFKSA8PCAocG9zaXRpb24gKiAyVSkpOworICAgICAgR1BJT3gtPk1PREVSID0gdGVtcDsKKworICAgICAgLyogSW4gY2FzZSBvZiBPdXRwdXQgb3IgQWx0ZXJuYXRlIGZ1bmN0aW9uIG1vZGUgc2VsZWN0aW9uICovCisgICAgICBpZigoR1BJT19Jbml0LT5Nb2RlID09IEdQSU9fTU9ERV9PVVRQVVRfUFApIHx8IChHUElPX0luaXQtPk1vZGUgPT0gR1BJT19NT0RFX0FGX1BQKSB8fAorICAgICAgICAgKEdQSU9fSW5pdC0+TW9kZSA9PSBHUElPX01PREVfT1VUUFVUX09EKSB8fCAoR1BJT19Jbml0LT5Nb2RlID09IEdQSU9fTU9ERV9BRl9PRCkpCisgICAgICB7CisgICAgICAgIC8qIENoZWNrIHRoZSBTcGVlZCBwYXJhbWV0ZXIgKi8KKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fU1BFRUQoR1BJT19Jbml0LT5TcGVlZCkpOworICAgICAgICAvKiBDb25maWd1cmUgdGhlIElPIFNwZWVkICovCisgICAgICAgIHRlbXAgPSBHUElPeC0+T1NQRUVEUjsKKyAgICAgICAgdGVtcCAmPSB+KEdQSU9fT1NQRUVERVJfT1NQRUVEUjAgPDwgKHBvc2l0aW9uICogMlUpKTsKKyAgICAgICAgdGVtcCB8PSAoR1BJT19Jbml0LT5TcGVlZCA8PCAocG9zaXRpb24gKiAyVSkpOworICAgICAgICBHUElPeC0+T1NQRUVEUiA9IHRlbXA7CisKKyAgICAgICAgLyogQ29uZmlndXJlIHRoZSBJTyBPdXRwdXQgVHlwZSAqLworICAgICAgICB0ZW1wID0gR1BJT3gtPk9UWVBFUjsKKyAgICAgICAgdGVtcCAmPSB+KEdQSU9fT1RZUEVSX09UXzAgPDwgcG9zaXRpb24pIDsKKyAgICAgICAgdGVtcCB8PSAoKChHUElPX0luaXQtPk1vZGUgJiBHUElPX09VVFBVVF9UWVBFKSA+PiA0VSkgPDwgcG9zaXRpb24pOworICAgICAgICBHUElPeC0+T1RZUEVSID0gdGVtcDsKKyAgICAgIH0KKworICAgICAgLyogQWN0aXZhdGUgdGhlIFB1bGwtdXAgb3IgUHVsbCBkb3duIHJlc2lzdG9yIGZvciB0aGUgY3VycmVudCBJTyAqLworICAgICAgdGVtcCA9IEdQSU94LT5QVVBEUjsKKyAgICAgIHRlbXAgJj0gfihHUElPX1BVUERSX1BVUERSMCA8PCAocG9zaXRpb24gKiAyVSkpOworICAgICAgdGVtcCB8PSAoKEdQSU9fSW5pdC0+UHVsbCkgPDwgKHBvc2l0aW9uICogMlUpKTsKKyAgICAgIEdQSU94LT5QVVBEUiA9IHRlbXA7CisKKyAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVYVEkgTW9kZSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAvKiBDb25maWd1cmUgdGhlIEV4dGVybmFsIEludGVycnVwdCBvciBldmVudCBmb3IgdGhlIGN1cnJlbnQgSU8gKi8KKyAgICAgIGlmKChHUElPX0luaXQtPk1vZGUgJiBFWFRJX01PREUpID09IEVYVElfTU9ERSkKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIFNZU0NGRyBDbG9jayAqLworICAgICAgICBfX0hBTF9SQ0NfU1lTQ0ZHX0NMS19FTkFCTEUoKTsKKworICAgICAgICB0ZW1wID0gU1lTQ0ZHLT5FWFRJQ1JbcG9zaXRpb24gPj4gMl07CisgICAgICAgIHRlbXAgJj0gfigoMHgwRlUpIDw8ICg0VSAqIChwb3NpdGlvbiAmIDB4MDNVKSkpOworICAgICAgICB0ZW1wIHw9IChHUElPX0dFVF9JTkRFWChHUElPeCkgPDwgKDRVICogKHBvc2l0aW9uICYgMHgwM1UpKSk7CisgICAgICAgIFNZU0NGRy0+RVhUSUNSW3Bvc2l0aW9uID4+IDJdID0gdGVtcDsKKworICAgICAgICAvKiBDbGVhciBFWFRJIGxpbmUgY29uZmlndXJhdGlvbiAqLworICAgICAgICB0ZW1wID0gRVhUSS0+SU1SOworICAgICAgICB0ZW1wICY9IH4oKHVpbnQzMl90KWlvY3VycmVudCk7CisgICAgICAgIGlmKChHUElPX0luaXQtPk1vZGUgJiBHUElPX01PREVfSVQpID09IEdQSU9fTU9ERV9JVCkKKyAgICAgICAgeworICAgICAgICAgIHRlbXAgfD0gaW9jdXJyZW50OworICAgICAgICB9CisgICAgICAgIEVYVEktPklNUiA9IHRlbXA7CisKKyAgICAgICAgdGVtcCA9IEVYVEktPkVNUjsKKyAgICAgICAgdGVtcCAmPSB+KCh1aW50MzJfdClpb2N1cnJlbnQpOworICAgICAgICBpZigoR1BJT19Jbml0LT5Nb2RlICYgR1BJT19NT0RFX0VWVCkgPT0gR1BJT19NT0RFX0VWVCkKKyAgICAgICAgeworICAgICAgICAgIHRlbXAgfD0gaW9jdXJyZW50OworICAgICAgICB9CisgICAgICAgIEVYVEktPkVNUiA9IHRlbXA7CisKKyAgICAgICAgLyogQ2xlYXIgUmlzaW5nIEZhbGxpbmcgZWRnZSBjb25maWd1cmF0aW9uICovCisgICAgICAgIHRlbXAgPSBFWFRJLT5SVFNSOworICAgICAgICB0ZW1wICY9IH4oKHVpbnQzMl90KWlvY3VycmVudCk7CisgICAgICAgIGlmKChHUElPX0luaXQtPk1vZGUgJiBSSVNJTkdfRURHRSkgPT0gUklTSU5HX0VER0UpCisgICAgICAgIHsKKyAgICAgICAgICB0ZW1wIHw9IGlvY3VycmVudDsKKyAgICAgICAgfQorICAgICAgICBFWFRJLT5SVFNSID0gdGVtcDsKKworICAgICAgICB0ZW1wID0gRVhUSS0+RlRTUjsKKyAgICAgICAgdGVtcCAmPSB+KCh1aW50MzJfdClpb2N1cnJlbnQpOworICAgICAgICBpZigoR1BJT19Jbml0LT5Nb2RlICYgRkFMTElOR19FREdFKSA9PSBGQUxMSU5HX0VER0UpCisgICAgICAgIHsKKyAgICAgICAgICB0ZW1wIHw9IGlvY3VycmVudDsKKyAgICAgICAgfQorICAgICAgICBFWFRJLT5GVFNSID0gdGVtcDsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgcG9zaXRpb24rKzsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgdGhlIEdQSU94IHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLgorICAqIEBwYXJhbSAgR1BJT3ggd2hlcmUgeCBjYW4gYmUgKEEuLkYpIHRvIHNlbGVjdCB0aGUgR1BJTyBwZXJpcGhlcmFsIGZvciBTVE0zMkYzMFggZGV2aWNlIG9yIFNUTTMyRjM3WCBkZXZpY2UKKyAgKiBAcGFyYW0gIEdQSU9fUGluIHNwZWNpZmllcyB0aGUgcG9ydCBiaXQgdG8gYmUgd3JpdHRlbi4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgR1BJT19QSU5feCB3aGVyZSB4IGNhbiBiZSAoMC4uMTUpLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfR1BJT19EZUluaXQoR1BJT19UeXBlRGVmICAqR1BJT3gsIHVpbnQzMl90IEdQSU9fUGluKQoreworICB1aW50MzJfdCBwb3NpdGlvbiA9IDB4MDBVOworICB1aW50MzJfdCBpb2N1cnJlbnQgPSAweDAwVTsKKyAgdWludDMyX3QgdG1wID0gMHgwMFU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fQUxMX0lOU1RBTkNFKEdQSU94KSk7CisgIGFzc2VydF9wYXJhbShJU19HUElPX1BJTihHUElPX1BpbikpOworCisgIC8qIENvbmZpZ3VyZSB0aGUgcG9ydCBwaW5zICovCisgIHdoaWxlICgoR1BJT19QaW4gPj4gcG9zaXRpb24pICE9IFJFU0VUKQorICB7CisgICAgLyogR2V0IGN1cnJlbnQgaW8gcG9zaXRpb24gKi8KKyAgICBpb2N1cnJlbnQgPSBHUElPX1BpbiAmICgxVSA8PCBwb3NpdGlvbik7CisKKyAgICBpZiAoaW9jdXJyZW50KQorICAgIHsKKyAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHUElPIE1vZGUgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAvKiBDb25maWd1cmUgSU8gRGlyZWN0aW9uIGluIElucHV0IEZsb3RpbmcgTW9kZSAqLworICAgICAgR1BJT3gtPk1PREVSICY9IH4oR1BJT19NT0RFUl9NT0RFUjAgPDwgKHBvc2l0aW9uICogMlUpKTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBkZWZhdWx0IEFsdGVybmF0ZSBGdW5jdGlvbiBpbiBjdXJyZW50IElPICovCisgICAgICBHUElPeC0+QUZSW3Bvc2l0aW9uID4+IDNdICY9IH4oMHhGVSA8PCAoKHVpbnQzMl90KShwb3NpdGlvbiAmIDB4MDdVKSAqIDRVKSkgOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIElPIFNwZWVkICovCisgICAgICBHUElPeC0+T1NQRUVEUiAmPSB+KEdQSU9fT1NQRUVERVJfT1NQRUVEUjAgPDwgKHBvc2l0aW9uICogMlUpKTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBkZWZhdWx0IHZhbHVlIElPIE91dHB1dCBUeXBlICovCisgICAgICBHUElPeC0+T1RZUEVSICAmPSB+KEdQSU9fT1RZUEVSX09UXzAgPDwgcG9zaXRpb24pIDsKKworICAgICAgLyogRGVhY3RpdmF0ZSB0aGUgUHVsbC11cCBhbmQgUHVsbC1kb3duIHJlc2lzdG9yIGZvciB0aGUgY3VycmVudCBJTyAqLworICAgICAgR1BJT3gtPlBVUERSICY9IH4oR1BJT19QVVBEUl9QVVBEUjAgPDwgKHBvc2l0aW9uICogMlUpKTsKKworICAKKyAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFWFRJIE1vZGUgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAvKiBDbGVhciB0aGUgRXh0ZXJuYWwgSW50ZXJydXB0IG9yIEV2ZW50IGZvciB0aGUgY3VycmVudCBJTyAqLworICAgICAgCisgICAgICB0bXAgPSBTWVNDRkctPkVYVElDUltwb3NpdGlvbiA+PiAyXTsKKyAgICAgIHRtcCAmPSAoKDB4MEZVKSA8PCAoNFUgKiAocG9zaXRpb24gJiAweDAzVSkpKTsKKyAgICAgIGlmKHRtcCA9PSAoR1BJT19HRVRfSU5ERVgoR1BJT3gpIDw8ICg0VSAqIChwb3NpdGlvbiAmIDB4MDNVKSkpKQorICAgICAgeworICAgICAgICB0bXAgPSAoMHgwRlUpIDw8ICg0VSAqIChwb3NpdGlvbiAmIDB4MDNVKSk7CisgICAgICAgIFNZU0NGRy0+RVhUSUNSW3Bvc2l0aW9uID4+IDJdICY9IH50bXA7CisKKyAgICAgICAgLyogQ2xlYXIgRVhUSSBsaW5lIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgICAgRVhUSS0+SU1SICY9IH4oKHVpbnQzMl90KWlvY3VycmVudCk7CisgICAgICAgIEVYVEktPkVNUiAmPSB+KCh1aW50MzJfdClpb2N1cnJlbnQpOworCisgICAgICAgIC8qIENsZWFyIFJpc2luZyBGYWxsaW5nIGVkZ2UgY29uZmlndXJhdGlvbiAqLworICAgICAgICBFWFRJLT5SVFNSICY9IH4oKHVpbnQzMl90KWlvY3VycmVudCk7CisgICAgICAgIEVYVEktPkZUU1IgJj0gfigodWludDMyX3QpaW9jdXJyZW50KTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgcG9zaXRpb24rKzsKKyAgfQorfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEdQSU9fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zIAorICogIEBicmllZiBHUElPIFJlYWQsIFdyaXRlLCBUb2dnbGUsIExvY2sgYW5kIEVYVEkgbWFuYWdlbWVudCBmdW5jdGlvbnMuCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgdGhlIHNwZWNpZmllZCBpbnB1dCBwb3J0IHBpbi4KKyAgKiBAcGFyYW0gIEdQSU94IHdoZXJlIHggY2FuIGJlIChBLi5GKSB0byBzZWxlY3QgdGhlIEdQSU8gcGVyaXBoZXJhbCBmb3IgU1RNMzJGMyBmYW1pbHkKKyAgKiBAcGFyYW0gIEdQSU9fUGluIHNwZWNpZmllcyB0aGUgcG9ydCBiaXQgdG8gcmVhZC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBHUElPX1BJTl94IHdoZXJlIHggY2FuIGJlICgwLi4xNSkuCisgICogQHJldHZhbCBUaGUgaW5wdXQgcG9ydCBwaW4gdmFsdWUuCisgICovCitHUElPX1BpblN0YXRlIEhBTF9HUElPX1JlYWRQaW4oR1BJT19UeXBlRGVmKiBHUElPeCwgdWludDE2X3QgR1BJT19QaW4pCit7CisgIEdQSU9fUGluU3RhdGUgYml0c3RhdHVzOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19HUElPX1BJTihHUElPX1BpbikpOworCisgIGlmKChHUElPeC0+SURSICYgR1BJT19QaW4pICE9ICh1aW50MzJfdClHUElPX1BJTl9SRVNFVCkKKyAgeworICAgIGJpdHN0YXR1cyA9IEdQSU9fUElOX1NFVDsKKyAgfQorICBlbHNlCisgIHsKKyAgICBiaXRzdGF0dXMgPSBHUElPX1BJTl9SRVNFVDsKKyAgfQorICByZXR1cm4gYml0c3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBvciBjbGVhciB0aGUgc2VsZWN0ZWQgZGF0YSBwb3J0IGJpdC4KKyAgKgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiB1c2VzIEdQSU94X0JTUlIgYW5kIEdQSU94X0JSUiByZWdpc3RlcnMgdG8gYWxsb3cgYXRvbWljIHJlYWQvbW9kaWZ5CisgICogICAgICAgICBhY2Nlc3Nlcy4gSW4gdGhpcyB3YXksIHRoZXJlIGlzIG5vIHJpc2sgb2YgYW4gSVJRIG9jY3VycmluZyBiZXR3ZWVuCisgICogICAgICAgICB0aGUgcmVhZCBhbmQgdGhlIG1vZGlmeSBhY2Nlc3MuCisgICoKKyAgKiBAcGFyYW0gIEdQSU94IHdoZXJlIHggY2FuIGJlIChBLi5GKSB0byBzZWxlY3QgdGhlIEdQSU8gcGVyaXBoZXJhbCBmb3IgU1RNMzJGMyBmYW1pbHkKKyAgKiBAcGFyYW0gIEdQSU9fUGluIHNwZWNpZmllcyB0aGUgcG9ydCBiaXQgdG8gYmUgd3JpdHRlbi4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgR1BJT19QSU5feCB3aGVyZSB4IGNhbiBiZSAoMC4uMTUpLgorICAqIEBwYXJhbSAgUGluU3RhdGUgc3BlY2lmaWVzIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIHRvIHRoZSBzZWxlY3RlZCBiaXQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBHUElPX1BpblN0YXRlIGVudW0gdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBHUElPX1BJTl9SRVNFVDogdG8gY2xlYXIgdGhlIHBvcnQgcGluCisgICogICAgICAgICAgICBAYXJnIEdQSU9fUElOX1NFVDogdG8gc2V0IHRoZSBwb3J0IHBpbgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfR1BJT19Xcml0ZVBpbihHUElPX1R5cGVEZWYqIEdQSU94LCB1aW50MTZfdCBHUElPX1BpbiwgR1BJT19QaW5TdGF0ZSBQaW5TdGF0ZSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fUElOKEdQSU9fUGluKSk7CisgIGFzc2VydF9wYXJhbShJU19HUElPX1BJTl9BQ1RJT04oUGluU3RhdGUpKTsKKworICBpZihQaW5TdGF0ZSAhPSBHUElPX1BJTl9SRVNFVCkKKyAgeworICAgIEdQSU94LT5CU1JSID0gKHVpbnQzMl90KUdQSU9fUGluOworICB9CisgIGVsc2UKKyAgeworICAgIEdQSU94LT5CUlIgPSAodWludDMyX3QpR1BJT19QaW47CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBUb2dnbGUgdGhlIHNwZWNpZmllZCBHUElPIHBpbi4KKyAgKiBAcGFyYW0gIEdQSU94IHdoZXJlIHggY2FuIGJlIChBLi5GKSB0byBzZWxlY3QgdGhlIEdQSU8gcGVyaXBoZXJhbCBmb3IgU1RNMzJGMyBmYW1pbHkKKyAgKiBAcGFyYW0gIEdQSU9fUGluIHNwZWNpZmllcyB0aGUgcGluIHRvIGJlIHRvZ2dsZWQuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9HUElPX1RvZ2dsZVBpbihHUElPX1R5cGVEZWYqIEdQSU94LCB1aW50MTZfdCBHUElPX1BpbikKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fUElOKEdQSU9fUGluKSk7CisKKyAgR1BJT3gtPk9EUiBePSBHUElPX1BpbjsKK30KKworLyoqCisqIEBicmllZiAgTG9jayBHUElPIFBpbnMgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuCisgICogQG5vdGUgICBUaGUgbG9ja2VkIHJlZ2lzdGVycyBhcmUgR1BJT3hfTU9ERVIsIEdQSU94X09UWVBFUiwgR1BJT3hfT1NQRUVEUiwKKyAgKiAgICAgICAgIEdQSU94X1BVUERSLCBHUElPeF9BRlJMIGFuZCBHUElPeF9BRlJILgorICAqIEBub3RlICAgVGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGxvY2tlZCBHUElPIHBpbnMgY2FuIG5vIGxvbmdlciBiZSBtb2RpZmllZAorICAqICAgICAgICAgdW50aWwgdGhlIG5leHQgcmVzZXQuCisgICogQHBhcmFtICBHUElPeCB3aGVyZSB4IGNhbiBiZSAoQS4uRikgdG8gc2VsZWN0IHRoZSBHUElPIHBlcmlwaGVyYWwgZm9yIFNUTTMyRjMgZmFtaWx5CisgICogQHBhcmFtICBHUElPX1BpbiBzcGVjaWZpZXMgdGhlIHBvcnQgYml0cyB0byBiZSBsb2NrZWQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIEdQSU9fUGluX3ggd2hlcmUgeCBjYW4gYmUgKDAuLjE1KS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9HUElPX0xvY2tQaW4oR1BJT19UeXBlRGVmKiBHUElPeCwgdWludDE2X3QgR1BJT19QaW4pCit7CisgIF9fSU8gdWludDMyX3QgdG1wID0gR1BJT19MQ0tSX0xDS0s7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fTE9DS19JTlNUQU5DRShHUElPeCkpOworICBhc3NlcnRfcGFyYW0oSVNfR1BJT19QSU4oR1BJT19QaW4pKTsKKworICAvKiBBcHBseSBsb2NrIGtleSB3cml0ZSBzZXF1ZW5jZSAqLworICB0bXAgfD0gR1BJT19QaW47CisgIC8qIFNldCBMQ0t4IGJpdChzKTogTENLSz0nMScgKyBMQ0tbMTVVLTBdICovCisgIEdQSU94LT5MQ0tSID0gdG1wOworICAvKiBSZXNldCBMQ0t4IGJpdChzKTogTENLSz0nMCcgKyBMQ0tbMTVVLTBdICovCisgIEdQSU94LT5MQ0tSID0gR1BJT19QaW47CisgIC8qIFNldCBMQ0t4IGJpdChzKTogTENLSz0nMScgKyBMQ0tbMTVVLTBdICovCisgIEdQSU94LT5MQ0tSID0gdG1wOworICAvKiBSZWFkIExDS0sgYml0Ki8KKyAgdG1wID0gR1BJT3gtPkxDS1I7CisKKyAgaWYoKEdQSU94LT5MQ0tSICYgR1BJT19MQ0tSX0xDS0spICE9IFJFU0VUKQorICB7CisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIEVYVEkgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBHUElPX1BpbiBTcGVjaWZpZXMgdGhlIHBvcnQgcGluIGNvbm5lY3RlZCB0byBjb3JyZXNwb25kaW5nIEVYVEkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0dQSU9fRVhUSV9JUlFIYW5kbGVyKHVpbnQxNl90IEdQSU9fUGluKQoreworICAvKiBFWFRJIGxpbmUgaW50ZXJydXB0IGRldGVjdGVkICovCisgIGlmKF9fSEFMX0dQSU9fRVhUSV9HRVRfSVQoR1BJT19QaW4pICE9IFJFU0VUKQorICB7CisgICAgX19IQUxfR1BJT19FWFRJX0NMRUFSX0lUKEdQSU9fUGluKTsKKyAgICBIQUxfR1BJT19FWFRJX0NhbGxiYWNrKEdQSU9fUGluKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEVYVEkgbGluZSBkZXRlY3Rpb24gY2FsbGJhY2suCisgICogQHBhcmFtICBHUElPX1BpbiBTcGVjaWZpZXMgdGhlIHBvcnQgcGluIGNvbm5lY3RlZCB0byBjb3JyZXNwb25kaW5nIEVYVEkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9HUElPX0VYVElfQ2FsbGJhY2sodWludDE2X3QgR1BJT19QaW4pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKEdQSU9fUGluKTsKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgdGhlIEhBTF9HUElPX0VYVElfQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX0dQSU9fTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmM3h4X2hhbF9ocnRpbS5jIGIvU3JjL3N0bTMyZjN4eF9oYWxfaHJ0aW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjI3ZTY3Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZjN4eF9oYWxfaHJ0aW0uYwpAQCAtMCwwICsxLDgyNDAgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX2hydGltLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFRJTSBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nIAorICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgSGlnaCBSZXNvbHV0aW9uIFRpbWVyIChIUlRJTSkgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBIUlRJTSBJbml0aWFsaXphdGlvbgorICAqICAgICAgICAgICArIERMTCBDYWxpYnJhdGlvbiBTdGFydAorICAqICAgICAgICAgICArIFRpbWVyIFRpbWUgQmFzZSBVbml0IENvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBTaW1wbGUgVGltZSBCYXNlIFN0YXJ0L1N0b3AKKyAgKiAgICAgICAgICAgKyBTaW1wbGUgVGltZSBCYXNlIFN0YXJ0L1N0b3AgSW50ZXJydXB0CisgICogICAgICAgICAgICsgU2ltcGxlIFRpbWUgQmFzZSBTdGFydC9TdG9wIERNQSBSZXF1ZXN0CisgICogICAgICAgICAgICsgU2ltcGxlIE91dHB1dCBDb21wYXJlL1BXTSBDaGFubmVsIENvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBTaW1wbGUgT3V0cHV0IENvbXBhcmUvUFdNIENoYW5uZWwgU3RhcnQvU3RvcCBJbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgKyBTaW1wbGUgT3V0cHV0IENvbXBhcmUvUFdNIENoYW5uZWwgU3RhcnQvU3RvcCBETUEgUmVxdWVzdAorICAqICAgICAgICAgICArIFNpbXBsZSBJbnB1dCBDYXB0dXJlIENoYW5uZWwgQ29uZmlndXJhdGlvbgorICAqICAgICAgICAgICArIFNpbXBsZSBJbnB1dCBDYXB0dXJlIENoYW5uZWwgU3RhcnQvU3RvcCBJbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgKyBTaW1wbGUgSW5wdXQgQ2FwdHVyZSBDaGFubmVsIFN0YXJ0L1N0b3AgRE1BIFJlcXVlc3QKKyAgKiAgICAgICAgICAgKyBTaW1wbGUgT25lIFB1bHNlIENoYW5uZWwgQ29uZmlndXJhdGlvbgorICAqICAgICAgICAgICArIFNpbXBsZSBPbmUgUHVsc2UgQ2hhbm5lbCBTdGFydC9TdG9wIEludGVycnVwdAorICAqICAgICAgICAgICArIEhSVElNIEV4dGVybmFsIFN5bmNocm9uaXphdGlvbiBDb25maWd1cmF0aW9uCisgICogICAgICAgICAgICsgSFJUSU0gQnVyc3QgTW9kZSBDb250cm9sbGVyIENvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBIUlRJTSBCdXJzdCBNb2RlIENvbnRyb2xsZXIgRW5hYmxpbmcKKyAgKiAgICAgICAgICAgKyBIUlRJTSBFeHRlcm5hbCBFdmVudHMgQ29uZGl0aW9uaW5nIENvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBIUlRJTSBGYXVsdHMgQ29uZGl0aW9uaW5nIENvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBIUlRJTSBGYXVsdHMgRW5hYmxpbmcKKyAgKiAgICAgICAgICAgKyBIUlRJTSBBREMgdHJpZ2dlciBDb25maWd1cmF0aW9uCisgICogICAgICAgICAgICsgV2F2ZWZvcm0gVGltZXIgQ29uZmlndXJhdGlvbgorICAqICAgICAgICAgICArIFdhdmVmb3JtIEV2ZW50IEZpbHRlcmluZyBDb25maWd1cmF0aW9uCisgICogICAgICAgICAgICsgV2F2ZWZvcm0gRGVhZCBUaW1lIEluc2VydGlvbiBDb25maWd1cmF0aW9uCisgICogICAgICAgICAgICsgV2F2ZWZvcm0gQ2hvcHBlciBNb2RlIENvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBXYXZlZm9ybSBDb21wYXJlIFVuaXQgQ29uZmlndXJhdGlvbgorICAqICAgICAgICAgICArIFdhdmVmb3JtIENhcHR1cmUgVW5pdCBDb25maWd1cmF0aW9uCisgICogICAgICAgICAgICsgV2F2ZWZvcm0gT3V0cHV0IENvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBXYXZlZm9ybSBDb3VudGVyIFN0YXJ0L1N0b3AKKyAgKiAgICAgICAgICAgKyBXYXZlZm9ybSBDb3VudGVyIFN0YXJ0L1N0b3AgSW50ZXJydXB0CisgICogICAgICAgICAgICsgV2F2ZWZvcm0gQ291bnRlciBTdGFydC9TdG9wIERNQSBSZXF1ZXN0CisgICogICAgICAgICAgICsgV2F2ZWZvcm0gT3V0cHV0IEVuYWJsaW5nCisgICogICAgICAgICAgICsgV2F2ZWZvcm0gT3V0cHV0IExldmVsIFNldC9HZXQKKyAgKiAgICAgICAgICAgKyBXYXZlZm9ybSBPdXRwdXQgU3RhdGUgR2V0CisgICogICAgICAgICAgICsgV2F2ZWZvcm0gQnVyc3QgRE1BIE9wZXJhdGlvbiBDb25maWd1cmF0aW9uCisgICogICAgICAgICAgICsgV2F2ZWZvcm0gQnVyc3QgRE1BIE9wZXJhdGlvbiBTdGFydAorICAqICAgICAgICAgICArIFdhdmVmb3JtIFRpbWVyIENvdW50ZXIgU29mdHdhcmUgUmVzZXQKKyAgKiAgICAgICAgICAgKyBXYXZlZm9ybSBDYXB0dXJlIFNvZnR3YXJlIFRyaWdnZXIgCisgICogICAgICAgICAgICsgV2F2ZWZvcm0gQnVyc3QgTW9kZSBDb250cm9sbGVyIFNvZnR3YXJlIFRyaWdnZXIKKyAgKiAgICAgICAgICAgKyBXYXZlZm9ybSBUaW1lciBQcmUtbG9hZGFibGUgUmVnaXN0ZXJzIFVwZGF0ZSBFbmFibGluZworICAqICAgICAgICAgICArIFdhdmVmb3JtIFRpbWVyIFByZS1sb2FkYWJsZSBSZWdpc3RlcnMgU29mdHdhcmUgVXBkYXRlCisgICogICAgICAgICAgICsgV2F2ZWZvcm0gVGltZXIgRGVsYXllZCBQcm90ZWN0aW9uIFN0YXR1cyBHZXQKKyAgKiAgICAgICAgICAgKyBXYXZlZm9ybSBUaW1lciBCdXJzdCBTdGF0dXMgR2V0CisgICogICAgICAgICAgICsgV2F2ZWZvcm0gVGltZXIgUHVzaC1QdWxsIFN0YXR1cyBHZXQKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIEdldAorICBAdmVyYmF0aW0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFNpbXBsZSBtb2RlIHYucy4gd2F2ZWZvcm0gbW9kZSAjIyMjIworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0gVGhlIEhSVElNIEhBTCBBUEkgaXMgc3BsaXQgaW50byAyIGNhdGVnb3JpZXM6CisgICAgKCMpU2ltcGxlIGZ1bmN0aW9uczogdGhlc2UgZnVuY3Rpb25zIGFsbG93IGZvciB1c2luZyBhIEhSVElNIHRpbWVyIGFzIGEgIAorICAgICAgIGdlbmVyYWwgcHVycG9zZSB0aW1lciB3aXRoIGhpZ2ggcmVzb2x1dGlvbiBjYXBhYmlsaXRpZXMuCisgICAgICAgSFJUSU0gc2ltcGxlIG1vZGVzIGFyZSBtYW5hZ2VkIHRocm91Z2ggdGhlIHNldCBvZiBmdW5jdGlvbnMgbmFtZWQKKyAgICAgICBIQUxfSFJUSU1fU2ltcGxlPEZ1bmN0aW9uPi4gVGhlc2UgZnVuY3Rpb25zIGFyZSBzaW1pbGFyIGluIG5hbWUgYW5kIHVzYWdlIAorICAgICAgIHRvIHRoZSBvbmUgZGVmaW5lZCBmb3IgdGhlIFRJTSBwZXJpcGhlcmFsLiBXaGVuIGEgSFJUSU0gdGltZXIgb3BlcmF0ZXMgaW4gCisgICAgICAgc2ltcGxlIG1vZGUsIG9ubHkgYSB2ZXJ5IGxpbWl0ZWQgc2V0IG9mIEhSVElNIGZlYXR1cmVzIGFyZSB1c2VkLgorICAgICAgIEZvbGxvd2luZyBzaW1wbGUgbW9kZXMgYXJlIHByb3Bvc2VkOgorICAgICAgICAgKCsrKU91dHB1dCBjb21wYXJlIG1vZGUsCisgICAgICAgICAoKyspUFdNIG91dHB1dCBtb2RlLAorICAgICAgICAgKCsrKUlucHV0IGNhcHR1cmUgbW9kZSwKKyAgICAgICAgICgrKylPbmUgcHVsc2UgbW9kZS4KKyAgICAoIylXYXZlZm9ybSBmdW5jdGlvbnM6IFRoZXNlIGZ1bmN0aW9ucyBhbGxvdyB0YWtpbmcgYWR2YW50YWdlIG9mIHRoZSBIUlRJTSAKKyAgICAgICBmbGV4aWJpbGl0eSB0byBwcm9kdWNlIG51bWVyb3VzIHR5cGVzIG9mIGNvbnRyb2wgc2lnbmFsLiBXaGVuIGEgSFJUSU0gdGltZXIgCisgICAgICAgb3BlcmF0ZXMgaW4gd2F2ZWZvcm0gbW9kZSwgYWxsIHRoZSBIUlRJTSBmZWF0dXJlcyBhcmUgYWNjZXNzaWJsZSB3aXRob3V0IAorICAgICAgIGFueSByZXN0cmljdGlvbi4gIEhSVElNIHdhdmVmb3JtIG1vZGVzIGFyZSBtYW5hZ2VkIHRocm91Z2ggdGhlIHNldCBvZgorICAgICAgIGZ1bmN0aW9ucyBuYW1lZCBIQUxfSFJUSU1fV2F2ZWZvcm08RnVuY3Rpb24+CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAoIylJbml0aWFsaXplIHRoZSBIUlRJTSBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudGluZyB0aGUKKyAgICAgICAgSEFMX0hSVElNX01zcEluaXQoKSBmdW5jdGlvbjoKKyAgICAgICAgKCMjKUVuYWJsZSB0aGUgSFJUSU0gY2xvY2sgc291cmNlIHVzaW5nIF9fSFJUSU14X0NMS19FTkFCTEUoKSAKKyAgICAgICAgKCMjKUNvbm5lY3QgSFJUSU0gcGlucyB0byBNQ1UgSS9PcworICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBjbG9jayBmb3IgdGhlIEhSVElNIEdQSU9zIHVzaW5nIHRoZSBmb2xsb3dpbmcKKyAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uOiBfX0hBTF9SQ0NfR1BJT3hfQ0xLX0VOQUJMRSgpICAgCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlc2UgR1BJTyBwaW5zIGluIEFsdGVybmF0ZSBGdW5jdGlvbiBtb2RlIHVzaW5nCisgICAgICAgICAgICAgICAgICBIQUxfR1BJT19Jbml0KCkKKyAgICAgICAgKCMjKVdoZW4gdXNpbmcgRE1BIHRvIGNvbnRyb2wgZGF0YSB0cmFuc2ZlciAoZS5nIEhBTF9IUlRJTV9TaW1wbGVCYXNlU3RhcnRfRE1BKCkpCisgICAgICAgICAgICAoKysrKUVuYWJsZSB0aGUgRE1BeCBpbnRlcmZhY2UgY2xvY2sgdXNpbmcgX19ETUF4X0NMS19FTkFCTEUoKQorICAgICAgICAgICAgKCsrKylJbml0aWFsaXplIHRoZSBETUEgaGFuZGxlCisgICAgICAgICAgICAoKysrKUFzc29jaWF0ZSB0aGUgaW5pdGlhbGl6ZWQgRE1BIGhhbmRsZSB0byB0aGUgYXBwcm9wcmlhdGUgRE1BIAorICAgICAgICAgICAgICAgICBoYW5kbGUgb2YgdGhlIEhSVElNIGhhbmRsZSB1c2luZyAgX19IQUxfTElOS0RNQSgpCisgICAgICAgICAgICAoKysrKUluaXRpYWxpemUgdGhlIERNQSBjaGFubmVsIHVzaW5nIEhBTF9ETUFfSW5pdCgpCisgICAgICAgICAgICAoKysrKUNvbmZpZ3VyZSB0aGUgcHJpb3JpdHkgYW5kIGVuYWJsZSB0aGUgTlZJQyBmb3IgdGhlIHRyYW5zZmVyCisgICAgICAgICAgICAgICAgIGNvbXBsZXRlIGludGVycnVwdCBvbiB0aGUgRE1BIGNoYW5uZWwgdXNpbmcgSEFMX05WSUNfU2V0UHJpb3JpdHkoKQorICAgICAgICAgICAgICAgICBhbmQgSEFMX05WSUNfRW5hYmxlSVJRKCkKKyAgICAgICAgKCMjKUluIGNhc2Ugb2YgdXNpbmcgaW50ZXJydXB0IG1vZGUgKGUuZyBIQUxfSFJUSU1fU2ltcGxlQmFzZVN0YXJ0X0lUKCkpCisgICAgICAgICAgICAoKysrKUNvbmZpZ3VyZSB0aGUgcHJpb3JpdHkgYW5kIGVuYWJsZSB0aGUgTlZJQyBmb3IgdGhlIGNvbmNlcm5lZAorICAgICAgICAgICAgICAgICBIUlRJTSBpbnRlcnJ1cHQgdXNpbmcgSEFMX05WSUNfU2V0UHJpb3JpdHkoKSBhbmQgSEFMX05WSUNfRW5hYmxlSVJRKCkKKworICAgICgjKUluaXRpYWxpemUgdGhlIEhSVElNIEhBTCB1c2luZyBIQUxfSFJUSU1fSW5pdCgpLiBUaGUgSFJUSU0gY29uZmlndXJhdGlvbiAKKyAgICAgICBzdHJ1Y3R1cmUgKGZpZWxkIG9mIHRoZSBIUlRJTSBoYW5kbGUpIHNwZWNpZmllcyB3aGljaCBnbG9iYWwgaW50ZXJydXB0IG9mCisgICAgICAgd2hvbGUgSFJUSU0gbXVzdCBiZSBlbmFibGVkIChCdXJzdCBtb2RlIHBlcmlvZCwgU3lzdGVtIGZhdWx0LCBGYXVsdHMpLgorICAgICAgIEl0IGFsc28gY29udGFpbnMgdGhlIEhSVElNIGV4dGVybmFsIHN5bmNocm9uaXphdGlvbiBjb25maWd1cmF0aW9uLiBIUlRJTQorICAgICAgIGNhbiBhY3QgYXMgYSBtYXN0ZXIgKGdlbmVyYXRpbmcgYSBzeW5jaHJvbml6YXRpb24gc2lnbmFsKSBvciBhcyBhIHNsYXZlCisgICAgICAgKHdhaXRpbmcgZm9yIGEgdHJpZ2dlciB0byBiZSBzeW5jaHJvbml6ZWQpLgorCisgICAgKCMpU3RhcnQgdGhlIGhpZ2ggcmVzb2x1dGlvbiB1bml0IHVzaW5nIEhBTF9IUlRJTV9ETExDYWxpYnJhdGlvblN0YXJ0KCkuIERMTAorICAgICAgIGNhbGlicmF0aW9uIGlzIGV4ZWN1dGVkIHBlcmlvZGljYWxseSBhbmQgY29tcGVuc2F0ZSBmb3IgcG90ZW50aWFsIHZvbHRhZ2UKKyAgICAgICBhbmQgdGVtcGVyYXR1cmUgZHJpZnRzLiBETEwgY2FsaWJyYXRpb24gcGVyaW9kIGlzIHNwZWNpZmllZCBieSB0aGUgCisgICAgICAgQ2FsaWJyYXRpb25SYXRlIGFyZ3VtZW50LgorCisgICAgKCMpSFJUSU0gdGltZXJzIGNhbm5vdCBiZSB1c2VkIHVudGlsIHRoZSBoaWdoIHJlc29sdXRpb24gdW5pdCBpcyByZWFkeS4gVGhpcyAKKyAgICAgICBjYW4gYmUgY2hlY2tlZCB1c2luZyBIQUxfSFJUSU1fUG9sbEZvckRMTENhbGlicmF0aW9uKCk6IHRoaXMgZnVuY3Rpb24gcmV0dXJucworICAgICAgIEhBTF9PSyBpZiBETEwgY2FsaWJyYXRpb24gaXMgY29tcGxldGVkIG9yIEhBTF9USU1FT1VUIGlmIHRoZSBETEwgY2FsaWJyYXRpb24KKyAgICAgICBpcyBzdGlsbCBnb2luZyBvbiB3aGVuIHRpbWVvdXQgZ2l2ZW4gYXMgYXJndW1lbnQgZXhwaXJlcy4gRExMIGNhbGlicmF0aW9uICAKKyAgICAgICBjYW4gYWxzbyBiZSBzdGFydGVkIGluIGludGVycnVwdCBtb2RlIHVzaW5nIEhBTF9IUlRJTV9ETExDYWxpYnJhdGlvblN0YXJ0X0lUKCkuIAorICAgICAgIEluIHRoYXQgY2FzZSBhbiBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIHdoZW4gdGhlIERMTCBjYWxpYnJhdGlvbiBpcyBjb21wbGV0ZWQuCisgICAgICAgTm90ZSB0aGF0IGFzIERMTCBjYWxpYnJhdGlvbiBpcyBleGVjdXRlZCBvbiBhIHBlcmlvZGljIGJhc2lzIGFuIGludGVycnVwdCAKKyAgICAgICB3aWxsIGJlIGdlbmVyYXRlZCBhdCB0aGUgZW5kIG9mIGV2ZXJ5IERMTCBjYWxpYnJhdGlvbiBvcGVyYXRpb24KKyAgICAgICh3b3JzdCBjYXNlOiBvbmUgaW50ZXJydXB0IGV2ZXJ5IDE0ICBtaWNybyBzZWNvbmRzICEpLgorCisgICAgICgjKSBDb25maWd1cmUgSFJUSU0gcmVzb3VyY2VzIHNoYXJlZCBieSBhbGwgSFJUSU0gdGltZXJzCisgICAgICAgICgjIylCdXJzdCBNb2RlIENvbnRyb2xsZXI6CisgICAgICAgICAgICAgICAgKCsrKylIQUxfSFJUSU1fQnVyc3RNb2RlQ29uZmlnKCk6IGNvbmZpZ3VyZXMgdGhlIEhSVElNIGJ1cnN0IG1vZGUKKyAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6IG9wZXJhdGluZyBtb2RlIChjb250aW51b3VzIG9yIG9uZS1zaG90IG1vZGUpLCBjbG9jaworICAgICAgICAgICAgICAgICAgICAgKHNvdXJjZSwgcHJlc2NhbGVyKSAsIHRyaWdnZXIocyksIHBlcmlvZCwgaWRsZSBkdXJhdGlvbi4KKyAgICAgICAgKCMjKUV4dGVybmFsIEV2ZW50cyBDb25kaXRpb25uaW5nOgorICAgICAgICAgICAgICAgICgrKyspSEFMX0hSVElNX0V2ZW50Q29uZmlnKCk6IGNvbmZpZ3VyZXMgdGhlIGNvbmRpdGlvbmluZyBvZiBhbgorICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgZXZlbnQgY2hhbm5lbDogc291cmNlLCBwb2xhcml0eSwgZWRnZS1zZW5zaXRpdml0eS4KKyAgICAgICAgICAgICAgICAgICAgIEV4dGVybmFsIGV2ZW50IGNhbiBiZSB1c2VkIGFzIHRyaWdnZXJzICh0aW1lciByZXNldCwgaW5wdXQKKyAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmUsIGJ1cnN0IG1vZGUsIEFEQyB0cmlnZ2VycywgZGVsYXllZCBwcm90ZWN0aW9uKQorICAgICAgICAgICAgICAgICAgICAgVGhleSBjYW4gYWxzbyBiZSB1c2VkIHRvIHNldCBvciByZXNldCB0aW1lciBvdXRwdXRzLiBVcCB0bworICAgICAgICAgICAgICAgICAgICAgMTAgZXZlbnQgY2hhbm5lbHMgYXJlIGF2YWlsYWJsZS4KKyAgICAgICAgICAgICAgICAoKysrKUhBTF9IUlRJTV9FdmVudFByZXNjYWxlckNvbmZpZygpOiBjb25maWd1cmVzIHRoZSBleHRlcm5hbAorICAgICAgICAgICAgICAgICAgICAgZXZlbnQgc2FtcGxpbmcgY2xvY2sgKHVzZWQgZm9yIGRpZ2l0YWwgZmlsdGVyaW5nKS4KKyAgICAgICAgKCMjKUZhdWx0IENvbmRpdGlvbm5pbmc6CisgICAgICAgICAgICAgICAgKCsrKylIQUxfSFJUSU1fRmF1bHRDb25maWcoKTogY29uZmlndXJlcyB0aGUgY29uZGl0aW9uaW5nIG9mIGEKKyAgICAgICAgICAgICAgICAgICAgIGZhdWx0IGNoYW5uZWw6IHNvdXJjZSwgcG9sYXJpdHksIGVkZ2Utc2Vuc2l0aXZpdHkuICBGYXVsdAorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgYXJlIHVzZWQgdG8gZGlzYWJsZSB0aGUgb3V0cHV0cyBpbiBjYXNlIG9mIGFuCisgICAgICAgICAgICAgICAgICAgICBhYm5vcm1hbCBvcGVyYXRpb24uIFVwIHRvIDUgZmF1bHQgY2hhbm5lbHMgYXJlIGF2YWlsYWJsZS4KKyAgICAgICAgICAgICAgICAoKysrKUhBTF9IUlRJTV9GYXVsdFByZXNjYWxlckNvbmZpZygpOiBjb25maWd1cmVzIHRoZSBmYXVsdAorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmcgY2xvY2sgKHVzZWQgZm9yIGRpZ2l0YWwgZmlsdGVyaW5nKS4KKyAgICAgICAgICAgICAgICAoKysrKUhBTF9IUlRJTV9GYXVsdE1vZGVDdGwoKTogRW5hYmxlcyBvciBkaXNhYmxlcyBmYXVsdCBpbnB1dChzKQorICAgICAgICAgICAgICAgICAgICAgY2lyY3VpdHJ5LiBCeSBkZWZhdWx0IGFsbCBmYXVsdCBpbnB1dHMgYXJlIGRpc2FibGVkLgorICAgICAgICAoIyMpQURDIHRyaWdnZXI6CisgICAgICAgICAgICAgICAgKCsrKylIQUxfSFJUSU1fQURDVHJpZ2dlckNvbmZpZygpOiBjb25maWd1cmVzIHRoZSBzb3VyY2UgdHJpZ2dlcmluZworICAgICAgICAgICAgICAgICAgICAgdGhlIHVwZGF0ZSBvZiB0aGUgQURDIHRyaWdnZXIgcmVnaXN0ZXIgYW5kIHRoZSBBREMgdHJpZ2dlci4KKyAgICAgICAgICAgICAgICAgICAgIDQgaW5kZXBlbmRlbnQgdHJpZ2dlcnMgYXJlIGF2YWlsYWJsZSB0byBzdGFydCBib3RoIHRoZSByZWd1bGFyCisgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIGluamVjdGVkIHNlcXVlbmNlcnMgb2YgdGhlIDIgQURDcworCisgICAgICgjKSBDb25maWd1cmUgSFJUSU0gdGltZXIgdGltZSBiYXNlIHVzaW5nIEhBTF9IUlRJTV9UaW1lQmFzZUNvbmZpZygpLiBUaGlzCisgICAgICAgICBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aGF0ZXZlciB0aGUgSFJUSU0gdGltZXIgb3BlcmF0aW5nIG1vZGUgaXMKKyAgICAgICAgIChzaW1wbGUgdi5zLiB3YXZlZm9ybSkuIEl0ICBjb25maWd1cmVzIG1haW5seToKKyAgICAgICAgKCMjKVRoZSBIUlRJTSAgdGltZXIgY291bnRlciBvcGVyYXRpbmcgbW9kZSAoY29udGludW91cyB2LnMuIG9uZSBzaG90KQorICAgICAgICAoIyMpVGhlIEhSVElNICB0aW1lciBjbG9jayBwcmVzY2FsZXIKKyAgICAgICAgKCMjKVRoZSBIUlRJTSAgdGltZXIgcGVyaW9kIAorICAgICAgICAoIyMpVGhlIEhSVElNICB0aW1lciByZXBldGl0aW9uIGNvdW50ZXIKKworICAgICAqKiogSWYgdGhlIEhSVElNIHRpbWVyIG9wZXJhdGVzIGluIHNpbXBsZSBtb2RlICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgWy4uXSAgICAKKyAgICAgKCMpIFN0YXJ0IG9yIFN0b3Agc2ltcGxlIHRpbWVycworICAgICAgICAgICAgICAoKyspU2ltcGxlIHRpbWUgYmFzZTogSEFMX0hSVElNX1NpbXBsZUJhc2VTdGFydCgpLEhBTF9IUlRJTV9TaW1wbGVCYXNlU3RvcCgpLAorICAgICAgICAgICAgICAgICAgSEFMX0hSVElNX1NpbXBsZUJhc2VTdGFydF9JVCgpLEhBTF9IUlRJTV9TaW1wbGVCYXNlU3RvcF9JVCgpLCAKKyAgICAgICAgICAgICAgICAgIEhBTF9IUlRJTV9TaW1wbGVCYXNlU3RhcnRfRE1BKCksSEFMX0hSVElNX1NpbXBsZUJhc2VTdG9wX0RNQSgpLgorICAgICAgICAgICAgICAoKyspU2ltcGxlIG91dHB1dCBjb21wYXJlOiBIQUxfSFJUSU1fU2ltcGxlT0NDaGFubmVsQ29uZmlnKCksCisgICAgICAgICAgICAgICAgICBIQUxfSFJUSU1fU2ltcGxlT0NTdGFydCgpLEhBTF9IUlRJTV9TaW1wbGVPQ1N0b3AoKSwKKyAgICAgICAgICAgICAgICAgIEhBTF9IUlRJTV9TaW1wbGVPQ1N0YXJ0X0lUKCksSEFMX0hSVElNX1NpbXBsZU9DU3RvcF9JVCgpLAorICAgICAgICAgICAgICAgICAgSEFMX0hSVElNX1NpbXBsZU9DU3RhcnRfRE1BKCksSEFMX0hSVElNX1NpbXBsZU9DU3RvcF9ETUEoKSwKKyAgICAgICAgICAgICAgKCsrKVNpbXBsZSBQV00gb3V0cHV0OiBIQUxfSFJUSU1fU2ltcGxlUFdNQ2hhbm5lbENvbmZpZygpLAorICAgICAgICAgICAgICAgICAgSEFMX0hSVElNX1NpbXBsZVBXTVN0YXJ0KCksSEFMX0hSVElNX1NpbXBsZVBXTVN0b3AoKSwKKyAgICAgICAgICAgICAgICAgIEhBTF9IUlRJTV9TaW1wbGVQV01TdGFydF9JVCgpLEhBTF9IUlRJTV9TaW1wbGVQV01TdG9wX0lUKCksCisgICAgICAgICAgICAgICAgICBIQUxfSFJUSU1fU2ltcGxlUFdNU3RhcnRfRE1BKCksSEFMX0hSVElNX1NpbXBsZVBXTVN0b3BfRE1BKCksCisgICAgICAgICAgICAgICgrKylTaW1wbGUgaW5wdXQgY2FwdHVyZTogSEFMX0hSVElNX1NpbXBsZUNhcHR1cmVDaGFubmVsQ29uZmlnKCksCisgICAgICAgICAgICAgICAgICBIQUxfSFJUSU1fU2ltcGxlQ2FwdHVyZVN0YXJ0KCksSEFMX0hSVElNX1NpbXBsZUNhcHR1cmVTdG9wKCksCisgICAgICAgICAgICAgICAgICBIQUxfSFJUSU1fU2ltcGxlQ2FwdHVyZVN0YXJ0X0lUKCksSEFMX0hSVElNX1NpbXBsZUNhcHR1cmVTdG9wX0lUKCksCisgICAgICAgICAgICAgICAgICBIQUxfSFJUSU1fU2ltcGxlQ2FwdHVyZVN0YXJ0X0RNQSgpLEhBTF9IUlRJTV9TaW1wbGVDYXB0dXJlU3RvcF9ETUEoKS4KKyAgICAgICAgICAgICAgKCsrKVNpbXBsZSBvbmUgcHVsc2U6IEhBTF9IUlRJTV9TaW1wbGVPbmVQdWxzZUNoYW5uZWxDb25maWcoKSwKKyAgICAgICAgICAgICAgICAgIEhBTF9IUlRJTV9TaW1wbGVPbmVQdWxzZVN0YXJ0KCksSEFMX0hSVElNX1NpbXBsZU9uZVB1bHNlU3RvcCgpLAorICAgICAgICAgICAgICAgICAgSEFMX0hSVElNX1NpbXBsZU9uZVB1bHNlU3RhcnRfSVQoKSxIQUxfSFJUSU1fU2ltcGxlT25lUHVsc2VTdG9wX0l0KCkuCisKKyAgICAgKioqIElmIHRoZSBIUlRJTSB0aW1lciBvcGVyYXRlcyBpbiB3YXZlZm9ybSBtb2RlICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0gICAgCisgICAgICgjKSBDb21wbGV0ZXMgd2F2ZWZvcm0gdGltZXIgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAoKyspSEFMX0hSVElNX1dhdmVmb3JtVGltZXJDb25maWcoKTogY29uZmlndXJhdGlvbiBvZiBhIEhSVElNIHRpbWVyIAorICAgICAgICAgICAgICAgICAgb3BlcmF0aW5nIGluIHdhdmUgZm9ybSBtb2RlIG1haW5seSBjb25zaXN0cyBpbjoKKyAgICAgICAgICAgICAgICAoKysrKUVuYWJsaW5nIHRoZSBIUlRJTSB0aW1lciBpbnRlcnJ1cHRzIGFuZCBETUEgcmVxdWVzdHMuCisgICAgICAgICAgICAgICAgKCsrKylFbmFibGluZyB0aGUgaGFsZiBtb2RlIGZvciB0aGUgSFJUSU0gdGltZXIuCisgICAgICAgICAgICAgICAgKCsrKylEZWZpbmluZyBob3cgdGhlIEhSVElNIHRpbWVyIHJlYWN0cyB0byBleHRlcm5hbCBzeW5jaHJvbml6YXRpb24gaW5wdXQuCisgICAgICAgICAgICAgICAgKCsrKylFbmFibGluZyB0aGUgcHVzaC1wdWxsIG1vZGUgZm9yIHRoZSBIUlRJTSB0aW1lci4KKyAgICAgICAgICAgICAgICAoKysrKUVuYWJsaW5nIHRoZSBmYXVsdCBjaGFubmVscyBmb3IgdGhlIEhSVElNIHRpbWVyLgorICAgICAgICAgICAgICAgICgrKyspRW5hYmxpbmcgdGhlIGRlYWQtdGltZSBpbnNlcnRpb24gZm9yIHRoZSBIUlRJTSB0aW1lci4KKyAgICAgICAgICAgICAgICAoKysrKVNldHRpbmcgdGhlIGRlbGF5ZWQgcHJvdGVjdGlvbiBtb2RlIGZvciB0aGUgSFJUSU0gdGltZXIgKHNvdXJjZSBhbmQgb3V0cHV0cyAKKyAgICAgICAgICAgICAgICAgICAgIG9uIHdoaWNoIHRoZSBkZWxheWVkIHByb3RlY3Rpb24gYXJlIGFwcGxpZWQpLgorICAgICAgICAgICAgICAgICgrKyspU3BlY2lmeWluZyB0aGUgSFJUSU0gdGltZXIgdXBkYXRlIGFuZCByZXNldCB0cmlnZ2Vycy4KKyAgICAgICAgICAgICAgICAoKysrKVNwZWNpZnlpbmcgdGhlIEhSVElNIHRpbWVyIHJlZ2lzdGVycyB1cGRhdGUgcG9saWN5IChlLmcuIHByZS1sb2FkIGVuYWJsaW5nKS4KKyAgICAgICAgICAgICAgKCsrKUhBTF9IUlRJTV9UaW1lckV2ZW50RmlsdGVyaW5nQ29uZmlnKCk6IGNvbmZpZ3VyZXMgZXh0ZXJuYWwgCisgICAgICAgICAgICAgICAgICBldmVudCBibGFua2luZyBhbmQgd2luZG93aW5nIGNpcmN1aXRyeSBvZiBhIEhSVElNIHRpbWVyOgorICAgICAgICAgICAgICAgICgrKyspQmxhbmtpbmc6ICB0byBtYXNrIGV4dGVybmFsIGV2ZW50cyBkdXJpbmcgYSBkZWZpbmVkICB0aW1lIHBlcmlvZCBhIGRlZmluZWQgdGltZSBwZXJpb2QKKyAgICAgICAgICAgICAgICAoKysrKVdpbmRvd2luZywgdG8gZW5hYmxlIGV4dGVybmFsIGV2ZW50cyBvbmx5IGR1cmluZyBhIGRlZmluZWQgdGltZSBwZXJpb2QKKyAgICAgICAgICAgICAgKCsrKUhBTF9IUlRJTV9EZWFkVGltZUNvbmZpZygpOiBjb25maWd1cmVzIHRoZSBkZWFkLXRpbWUgaW5zZXJ0aW9uCisgICAgICAgICAgICAgICAgICB1bml0IGZvciBhIEhSVElNIHRpbWVyLiBBbGxvd3MgdG8gZ2VuZXJhdGUgYSBjb3VwbGUgb2YKKyAgICAgICAgICAgICAgICAgIGNvbXBsZW1lbnRhcnkgc2lnbmFscyBmcm9tIGEgc2luZ2xlIHJlZmVyZW5jZSB3YXZlZm9ybSwgCisgICAgICAgICAgICAgICAgICB3aXRoIHByb2dyYW1tYWJsZSBkZWxheXMgYmV0d2VlbiBhY3RpdmUgc3RhdGUuCisgICAgICAgICAgICAgICgrKylIQUxfSFJUSU1fQ2hvcHBlck1vZGVDb25maWcoKTogY29uZmlndXJlcyB0aGUgcGFyYW1ldGVycyBvZgorICAgICAgICAgICAgICAgICAgdGhlIGhpZ2gtZnJlcXVlbmN5IGNhcnJpZXIgc2lnbmFsIGFkZGVkIG9uIHRvcCBvZiB0aGUgdGltaW5nCisgICAgICAgICAgICAgICAgICB1bml0IG91dHB1dC4gQ2hvcHBlciBtb2RlIGNhbiBiZSBlbmFibGVkIG9yIGRpc2FibGVkIGZvciBlYWNoCisgICAgICAgICAgICAgICAgICAgdGltZXIgb3V0cHV0IHNlcGFyYXRlbHkgKHNlZSAgSEFMX0hSVElNX1dhdmVmb3JtT3V0cHV0Q29uZmlnKCkpLgorICAgICAgICAgICAgICAoKyspSEFMX0hSVElNX0J1cnN0RE1BQ29uZmlnKCk6IGNvbmZpZ3VyZXMgdGhlIGJ1cnN0IERNQSBidXJzdCAKKyAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuIEFsbG93cyBoYXZpbmcgbXVsdGlwbGUgSFJUSU0gcmVnaXN0ZXJzIHVwZGF0ZWQKKyAgICAgICAgICAgICAgICAgIHdpdGggYSBzaW5nbGUgRE1BIHJlcXVlc3QuIFRoZSBidXJzdCBETUEgb3BlcmF0aW9uIGlzIHN0YXJ0ZWQKKyAgICAgICAgICAgICAgICAgIGJ5IGNhbGxpbmcgSEFMX0hSVElNX0J1cnN0RE1BVHJhbnNmZXIoKS4KKyAgICAgICAgICAgICAgKCsrKUhBTF9IUlRJTV9XYXZlZm9ybUNvbXBhcmVDb25maWcoKTpjb25maWd1cmVzIHRoZSBjb21wYXJlIHVuaXQKKyAgICAgICAgICAgICAgICAgIG9mIGEgSFJUSU0gdGltZXIuIFRoaXMgb3BlcmF0aW9uIGNvbnNpc3RzIGluIHNldHRpbmcgdGhlCisgICAgICAgICAgICAgICAgICBjb21wYXJlIHZhbHVlIGFuZCBwb3NzaWJseSBzcGVjaWZ5aW5nIHRoZSBhdXRvIGRlbGF5ZWQgbW9kZQorICAgICAgICAgICAgICAgICAgZm9yIGNvbXBhcmUgdW5pdHMgMiBhbmQgNCAoYWxsb3dzIHRvIGhhdmUgY29tcGFyZSBldmVudHMKKyAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZCByZWxhdGl2ZWx5IHRvIGNhcHR1cmUgZXZlbnRzKS4gTm90ZSB0aGF0IHdoZW4gYXV0bworICAgICAgICAgICAgICAgICAgZGVsYXllZCBtb2RlIGlzIG5lZWRlZCwgdGhlIGNhcHR1cmUgdW5pdCBhc3NvY2lhdGVkIHRvIHRoZQorICAgICAgICAgICAgICAgICAgY29tcGFyZSB1bml0IG11c3QgYmUgY29uZmlndXJlZCBzZXBhcmF0ZWx5LgorICAgICAgICAgICAgICAoKyspSEFMX0hSVElNX1dhdmVmb3JtQ2FwdHVyZUNvbmZpZygpOiBjb25maWd1cmVzIHRoZSBjYXB0dXJlIHVuaXQKKyAgICAgICAgICAgICAgICAgIG9mIGEgSFJUSU0gdGltZXIuIFRoaXMgb3BlcmF0aW9uIGNvbnNpc3RzIGluIHNwZWNpZnlpbmcgdGhlCisgICAgICAgICAgICAgICAgICBzb3VyY2UocykgIHRyaWdnZXJpbmcgdGhlIGNhcHR1cmUgKHRpbWVyIHJlZ2lzdGVyIHVwZGF0ZSBldmVudCwKKyAgICAgICAgICAgICAgICAgIGV4dGVybmFsIGV2ZW50LCB0aW1lciBvdXRwdXQgc2V0L3Jlc2V0IGV2ZW50LCBvdGhlciBIUlRJTQorICAgICAgICAgICAgICAgICAgdGltZXIgcmVsYXRlZCBldmVudHMpLiAKKyAgICAgICAgICAgICAgKCsrKUhBTF9IUlRJTV9XYXZlZm9ybU91dHB1dENvbmZpZygpOiBjb25maWd1cmF0aW9uIG9mIGEgSFJUSU0gdGltZXIKKyAgICAgICAgICAgICAgICAgIG91dHB1dCBtYWlubHkgY29uc2lzdHMgaW46IAorICAgICAgICAgICAgICAgICgrKyspU2V0dGluZyB0aGUgb3V0cHV0IHBvbGFyaXR5IChhY3RpdmUgaGlnaCBvciBhY3RpdmUgbG93KSwKKyAgICAgICAgICAgICAgICAoKysrKURlZmluaW5nIHRoZSBzZXQvcmVzZXQgY3Jvc3NiYXIgZm9yIHRoZSBvdXRwdXQsIAorICAgICAgICAgICAgICAgICgrKyspU3BlY2lmeWluZyB0aGUgZmF1bHQgbGV2ZWwgKGFjdGl2ZSBvciBpbmFjdGl2ZSkgaW4gSURMRSBhbmQgRkFVTFQgc3RhdGVzLiwKKyAgICAgICAgICAgICAgICAKKyAgICAgKCMpIFNldCB3YXZlZm9ybSB0aW1lciBvdXRwdXQocykgbGV2ZWwKKyAgICAgICAgICAgICAgKCsrKUhBTF9IUlRJTV9XYXZlZm9ybVNldE91dHB1dExldmVsKCk6IGZvcmNlcyB0aGUgb3V0cHV0IHRvIGl0cworICAgICAgICAgICAgICAgICAgYWN0aXZlIG9yIGluYWN0aXZlIGxldmVsLiBGb3IgZXhhbXBsZSwgd2hlbiBkZWFkdGltZSBpbnNlcnRpb24gCisgICAgICAgICAgICAgICAgICBpcyBlbmFibGVkIGl0IGlzIG5lY2Vzc2FyeSB0byBmb3JjZSB0aGUgb3V0cHV0IGxldmVsIGJ5IHNvZnR3YXJlCisgICAgICAgICAgICAgICAgICB0byBoYXZlIHRoZSBvdXRwdXRzIGluIGEgY29tcGxlbWVudGFyeSBzdGF0ZSBhcyBzb29uIGFzIHRoZSBSVU4gbW9kZSBpcyBlbnRlcmVkLgorICAgICAgICAgICAgICAgICAgICAgCisgICAgICgjKSBFbmFibGUgb3IgRGlzYWJsZSB3YXZlZm9ybSB0aW1lciBvdXRwdXQocykKKyAgICAgICAgICAgICAgKCsrKUhBTF9IUlRJTV9XYXZlZm9ybU91dHB1dFN0YXJ0KCksSEFMX0hSVElNX1dhdmVmb3JtT3V0cHV0U3RvcCgpLgorICAgICAgICAgICAgICAKKyAgICAgKCMpIFN0YXJ0IG9yIFN0b3Agd2F2ZWZvcm0gSFJUSU0gdGltZXIocykuIAorICAgICAgICAgICAgICAoKyspSEFMX0hSVElNX1dhdmVmb3JtQ291bnRlclN0YXJ0KCksSEFMX0hSVElNX1dhdmVmb3JtQ291bnRlclN0b3AoKSwKKyAgICAgICAgICAgICAgKCsrKUhBTF9IUlRJTV9XYXZlZm9ybUNvdW50ZXJTdGFydF9JVCgpLEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50ZXJTdG9wX0lUKCksCisgICAgICAgICAgICAgICgrKylIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudGVyU3RhcnQoKV9ETUEsSEFMX0hSVElNX1dhdmVmb3JtQ291bnRlclN0b3BfRE1BKCksCisgICAgICgjKSBCdXJzdCBtb2RlIGNvbnRyb2xsZXIgZW5hYmxpbmc6CisgICAgICAgICAgICAgICgrKylIQUxfSFJUSU1fQnVyc3RNb2RlQ3RsKCk6IGFjdGl2YXRlcyBvciBkZS1hY3RpdmF0ZXMgdGhlIAorICAgICAgICAgICAgICAgICAgYnVyc3QgbW9kZSBjb250cm9sbGVyLgorCisgICAgICgjKSBTb21lIEhSVElNIG9wZXJhdGlvbnMgY2FuIGJlIHRyaWdnZXJlZCBieSBzb2Z0d2FyZToKKyAgICAgICAgICAgICAgKCsrKUhBTF9IUlRJTV9CdXJzdE1vZGVTb2Z0d2FyZVRyaWdnZXIoKTogY2FsbGluZyB0aGlzIGZ1bmN0aW9uIAorICAgICAgICAgICAgICAgICAgdHJpZ3MgdGhlIGJ1cnN0IG9wZXJhdGlvbi4KKyAgICAgICAgICAgICAgKCsrKUhBTF9IUlRJTV9Tb2Z0d2FyZUNhcHR1cmUoKTogY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHRyaWdzIHRoZSAKKyAgICAgICAgICAgICAgICAgIGNhcHR1cmUgb2YgdGhlIEhSVElNIHRpbWVyIGNvdW50ZXIuCisgICAgICAgICAgICAgICgrKylIQUxfSFJUSU1fU29mdHdhcmVVcGRhdGUoKTogY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHRyaWdzIHRoZSAKKyAgICAgICAgICAgICAgICAgIHVwZGF0ZSBvZiB0aGUgcHJlLWxvYWRhYmxlIHJlZ2lzdGVycyBvZiB0aGUgSFJUSU0gdGltZXIKKyAgICAgICAgICAgICAgKCsrKUhBTF9IUlRJTV9Tb2Z0d2FyZVJlc2V0KCk6Y2FsbGluZyB0aGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgCisgICAgICAgICAgICAgICAgICBIUlRJTSB0aW1lciBjb3VudGVyLgorCisgICAgICgjKSBTb21lIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBhbnkgdGltZSB0byByZXRyaWV2ZSBIUlRJTSB0aW1lciByZWxhdGVkIAorICAgICAgICAgICAgaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgKCsrKUhBTF9IUlRJTV9HZXRDYXB0dXJlZFZhbHVlKCk6IHJldHVybnMgYWN0dWFsIHZhbHVlIG9mIHRoZQorICAgICAgICAgICAgICAgICAgY2FwdHVyZSByZWdpc3RlciBvZiB0aGUgZGVzaWduYXRlZCBjYXB0dXJlIHVuaXQuCisgICAgICAgICAgICAgICgrKylIQUxfSFJUSU1fV2F2ZWZvcm1HZXRPdXRwdXRMZXZlbCgpOiByZXR1cm5zIGFjdHVhbCBsZXZlbAorICAgICAgICAgICAgICAgICAoQUNUSVZFL0lOQUNUSVZFKSBvZiB0aGUgZGVzaWduYXRlZCB0aW1lciBvdXRwdXQuCisgICAgICAgICAgICAgICgrKylIQUxfSFJUSU1fV2F2ZWZvcm1HZXRPdXRwdXRTdGF0ZSgpOnJldHVybnMgYWN0dWFsIHN0YXRlCisgICAgICAgICAgICAgICAgIChJRExFL1JVTi9GQVVMVCkgb2YgdGhlIGRlc2lnbmF0ZWQgdGltZXIgb3V0cHV0LgorICAgICAgICAgICAgICAoKyspSEFMX0hSVElNX0dldERlbGF5ZWRQcm90ZWN0aW9uU3RhdHVzKCk6cmV0dXJucyBhY3R1YWwgbGV2ZWwgCisgICAgICAgICAgICAgICAgIChBQ1RJVkUvSU5BQ1RJVkUpIG9mIHRoZSBkZXNpZ25hdGVkIG91dHB1dCB3aGVuIHRoZSBkZWxheWVkCisgICAgICAgICAgICAgICAgICBwcm90ZWN0aW9uIHdhcyB0cmlnZ2VyZWQuCisgICAgICAgICAgICAgICgrKylIQUxfSFJUSU1fR2V0QnVyc3RTdGF0dXMoKTogcmV0dXJucyB0aGUgYWN0dWFsIHN0YXR1cworICAgICAgICAgICAgICAgICAoQUNUSVZFL0lOQUNUSVZFKSBvZiB0aGUgYnVyc3QgbW9kZSBjb250cm9sbGVyLgorICAgICAgICAgICAgICAoKyspSEFMX0hSVElNX0dldEN1cnJlbnRQdXNoUHVsbFN0YXR1cygpOiB3aGVuIHRoZSBwdXNoLXB1bGwgbW9kZQorICAgICAgICAgICAgICAgICBpcyBlbmFibGVkIGZvciB0aGUgSFJUSU0gdGltZXIgKHNlZSBIQUxfSFJUSU1fV2F2ZWZvcm1UaW1lckNvbmZpZygpKSwKKyAgICAgICAgICAgICAgICAgdGhlIHB1c2gtcHVsbCBzdGF0dXMgaW5kaWNhdGVzIG9uIHdoaWNoIG91dHB1dCB0aGUgc2lnbmFsIGlzIGN1cnJlbnRseSAKKyAgICAgICAgICAgICAgICAgYWN0aXZlIChlLmcgc2lnbmFsIGFwcGxpZWQgb24gb3V0cHV0IDEgYW5kIG91dHB1dCAyIGZvcmNlZAorICAgICAgICAgICAgICAgICBpbmFjdGl2ZSBvciB2aWNlIHZlcnNhKS4gCisgICAgICAgICAgICAgKCsrKUhBTF9IUlRJTV9HZXRJZGxlUHVzaFB1bGxTdGF0dXMoKTogd2hlbiB0aGUgcHVzaC1wdWxsIG1vZGUKKyAgICAgICAgICAgICAgICAgaXMgZW5hYmxlZCBmb3IgdGhlIEhSVElNIHRpbWVyIChzZWUgSEFMX0hSVElNX1dhdmVmb3JtVGltZXJDb25maWcoKSksCisgICAgICAgICAgICAgICAgIHRoZSBpZGxlIHB1c2gtcHVsbCBzdGF0dXMgaW5kaWNhdGVzIGR1cmluZyB3aGljaCBwZXJpb2QgdGhlCisgICAgICAgICAgICAgICAgIGRlbGF5ZWQgcHJvdGVjdGlvbiByZXF1ZXN0IG9jY3VycmVkIChlLmcuIHByb3RlY3Rpb24gb2NjdXJyZWQKKyAgICAgICAgICAgICAgICAgd2hlbiB0aGUgb3V0cHV0IDEgd2FzIGFjdGl2ZSBhbmQgb3V0cHV0IDIgZm9yY2VkIGluYWN0aXZlIG9yCisgICAgICAgICAgICAgICAgIHZpY2UgdmVyc2EpLgorCisgICAgICgjKSBTb21lIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBhbnkgdGltZSB0byByZXRyaWV2ZSBhY3R1YWwgSFJUSU0gc3RhdHVzCisgICAgICAgICAgICAgKCsrKUhBTF9IUlRJTV9HZXRTdGF0ZSgpOiByZXR1cm5zIGFjdHVhbCBIUlRJTSBpbnN0YW5jZSBIQUwgc3RhdGUuCisgIAorICBAZW5kdmVyYmF0aW0KKworICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIAorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9IUlRJTV9NT0RVTEVfRU5BQkxFRAorCisjaWYgZGVmaW5lZChIUlRJTTEpCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU0gSFJUSU0KKyAgKiBAYnJpZWYgSFJUSU0gSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSFJUSU1fUHJpdmF0ZV9EZWZpbmVzIEhSVElNIFByaXZhdGUgRGVmaW5lCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSFJUSU1fRkxUUl9GTFR4RU4gKEhSVElNX0ZMVFJfRkxUMUVOIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9GTFRSX0ZMVDJFTiB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fRkxUUl9GTFQzRU4gfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX0ZMVFJfRkxUNEVOIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fRkxUUl9GTFQ1RU4pCisKKyNkZWZpbmUgSFJUSU1fVElNQ1JfVElNVVBEQVRFVFJJR0dFUiAoSFJUSU1fVElNVVBEQVRFVFJJR0dFUl9NQVNURVIgIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX1RJTVVQREFURVRSSUdHRVJfVElNRVJfQSB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9USU1VUERBVEVUUklHR0VSX1RJTUVSX0IgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fVElNVVBEQVRFVFJJR0dFUl9USU1FUl9DIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX1RJTVVQREFURVRSSUdHRVJfVElNRVJfRCB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9USU1VUERBVEVUUklHR0VSX1RJTUVSX0UpCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSFJUSU1fUHJpdmF0ZV9WYXJpYWJsZXMgSFJUSU0gUHJpdmF0ZSBWYXJpYWJsZXMKKyAgKiBAeworICAqLworc3RhdGljIHVpbnQzMl90IFRpbWVySWR4VG9UaW1lcklkW10gPSAKK3sKKyAgSFJUSU1fVElNRVJJRF9USU1FUl9BLAorICBIUlRJTV9USU1FUklEX1RJTUVSX0IsCisgIEhSVElNX1RJTUVSSURfVElNRVJfQywKKyAgSFJUSU1fVElNRVJJRF9USU1FUl9ELAorICBIUlRJTV9USU1FUklEX1RJTUVSX0UsCisgIEhSVElNX1RJTUVSSURfTUFTVEVSLAorfTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEhSVElNX1ByaXZhdGVfRnVuY3Rpb25zIEhSVElNIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3N0YXRpYyB2b2lkIEhSVElNX01hc3RlckJhc2VfQ29uZmlnKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fVGltZUJhc2VDZmdUeXBlRGVmICogcFRpbWVCYXNlQ2ZnKTsKKworc3RhdGljIHZvaWQgSFJUSU1fVGltaW5nVW5pdEJhc2VfQ29uZmlnKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX1RpbWVCYXNlQ2ZnVHlwZURlZiAqIHBUaW1lQmFzZUNmZyk7CisKK3N0YXRpYyB2b2lkIEhSVElNX01hc3RlcldhdmVmb3JtX0NvbmZpZyhIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9UaW1lckNmZ1R5cGVEZWYgKiBwVGltZXJDZmcpOworCitzdGF0aWMgdm9pZCBIUlRJTV9UaW1pbmdVbml0V2F2ZWZvcm1fQ29uZmlnKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX1RpbWVyQ2ZnVHlwZURlZiAqIHBUaW1lckNmZyk7CisKK3N0YXRpYyB2b2lkIEhSVElNX0NvbXBhcmVVbml0Q29uZmlnKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENvbXBhcmVVbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fQ29tcGFyZUNmZ1R5cGVEZWYgKiBwQ29tcGFyZUNmZyk7CisKK3N0YXRpYyB2b2lkIEhSVElNX0NhcHR1cmVVbml0Q29uZmlnKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENhcHR1cmVVbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRXZlbnQpOworCitzdGF0aWMgdm9pZCBIUlRJTV9PdXRwdXRDb25maWcoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fT3V0cHV0Q2ZnVHlwZURlZiAqIHBPdXRwdXRDZmcpOworCitzdGF0aWMgdm9pZCBIUlRJTV9FdmVudENvbmZpZyhIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9FdmVudENmZ1R5cGVEZWYgKiBwRXZlbnRDZmcpOworCitzdGF0aWMgdm9pZCBIUlRJTV9USU1fUmVzZXRDb25maWcoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBFdmVudCk7ICAKKworc3RhdGljIHVpbnQzMl90IEhSVElNX0dldElURnJvbU9DTW9kZShIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT0NDaGFubmVsKTsKKworc3RhdGljIHVpbnQzMl90IEhSVElNX0dldERNQUZyb21PQ01vZGUoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT0NDaGFubmVsKTsKKworc3RhdGljIERNQV9IYW5kbGVUeXBlRGVmICogSFJUSU1fR2V0RE1BSGFuZGxlRnJvbVRpbWVySWR4KEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgpOworCitzdGF0aWMgdWludDMyX3QgR2V0VGltZXJJZHhGcm9tRE1BSGFuZGxlKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERNQV9IYW5kbGVUeXBlRGVmICogICBoZG1hKTsKKworc3RhdGljIHZvaWQgSFJUSU1fRm9yY2VSZWdpc3RlcnNVcGRhdGUoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgpOworCitzdGF0aWMgdm9pZCBIUlRJTV9IUlRJTV9JU1IoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSk7CisKK3N0YXRpYyB2b2lkIEhSVElNX01hc3Rlcl9JU1IoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSk7CisKK3N0YXRpYyB2b2lkIEhSVElNX1RpbWVyX0lTUihIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgpOworCitzdGF0aWMgdm9pZCBIUlRJTV9ETUFNYXN0ZXJDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKKworc3RhdGljIHZvaWQgSFJUSU1fRE1BVGltZXJ4Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CisKK3N0YXRpYyB2b2lkIEhSVElNX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKKworc3RhdGljIHZvaWQgSFJUSU1fQnVyc3RETUFDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBIUlRJTV9FeHBvcnRlZF9GdW5jdGlvbnMgSFJUSU0gRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIAorICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgCitAdmVyYmF0aW0gICAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgVGltZSBCYXNlIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgSW5pdGlhbGl6ZSBhIEhSVElNIGluc3RhbmNlIAorICAgICAgKCspIERlLWluaXRpYWxpemUgYSBIUlRJTSBpbnN0YW5jZSAKKyAgICAgICgrKSBJbml0aWFsaXplIHRoZSBIUlRJTSBNU1AgCisgICAgICAoKykgRGUtaW5pdGlhbGl6ZSB0aGUgSFJUSU0gTVNQIAorICAgICAgKCspIFN0YXJ0IHRoZSBoaWdoLXJlc29sdXRpb24gdW5pdCAoc3RhcnQgRExMIGNhbGlicmF0aW9uKSAKKyAgICAgICgrKSBDaGVjayB0aGF0IHRoZSBoaWdoIHJlc29sdXRpb24gdW5pdCBpcyByZWFkeSAoRExMIGNhbGlicmF0aW9uIGRvbmUpCisgICAgICAoKykgQ29uZmlndXJlIHRoZSB0aW1lIGJhc2UgdW5pdCBvZiBhIEhSVElNIHRpbWVyIAorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIGEgSFJUSU0gaW5zdGFuY2UgCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fSW5pdChIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltKQoreworICB1aW50OF90IHRpbWVyX2lkeDsKKyAgdWludDMyX3QgaHJ0aW1fbWNyOworICAKKyAgLyogQ2hlY2sgdGhlIEhSVElNIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmKGhocnRpbSA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX0FMTF9JTlNUQU5DRShoaHJ0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9JVChoaHJ0aW0tPkluaXQuSFJUSU1JbnRlcnJ1cHRSZXNxdWVzdHMpKTsgCisgCisgIC8qIFNldCB0aGUgSFJUSU0gc3RhdGUgKi8KKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9CVVNZOworICAKKyAgLyogSW5pdGlhbGl6ZSB0aGUgRE1BIGhhbmRsZXMgKi8KKyAgaGhydGltLT5oZG1hTWFzdGVyID0gKERNQV9IYW5kbGVUeXBlRGVmICopTlVMTDsgICAgCisgIGhocnRpbS0+aGRtYVRpbWVyQSA9IChETUFfSGFuZGxlVHlwZURlZiAqKU5VTEw7ICAgICAKKyAgaGhydGltLT5oZG1hVGltZXJCID0gKERNQV9IYW5kbGVUeXBlRGVmICopTlVMTDsgIAorICBoaHJ0aW0tPmhkbWFUaW1lckMgPSAoRE1BX0hhbmRsZVR5cGVEZWYgKilOVUxMOyAgCisgIGhocnRpbS0+aGRtYVRpbWVyRCA9IChETUFfSGFuZGxlVHlwZURlZiAqKU5VTEw7ICAKKyAgaGhydGltLT5oZG1hVGltZXJFID0gKERNQV9IYW5kbGVUeXBlRGVmICopTlVMTDsgIAorCisgIC8qIEhSVElNIG91dHB1dCBzeW5jaHJvbml6YXRpb24gY29uZmlndXJhdGlvbiAoaWYgcmVxdWlyZWQpICovCisgIGlmICgoaGhydGltLT5Jbml0LlN5bmNPcHRpb25zICYgSFJUSU1fU1lOQ09QVElPTl9NQVNURVIpICE9IFJFU0VUKQorICB7CisgICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19IUlRJTV9TWU5DT1VUUFVUU09VUkNFKGhocnRpbS0+SW5pdC5TeW5jT3V0cHV0U291cmNlKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1NZTkNPVVRQVVRQT0xBUklUWShoaHJ0aW0tPkluaXQuU3luY091dHB1dFBvbGFyaXR5KSk7CisgICAgCisgICAgLyogVGhlIHN5bmNocm9uaXphdGlvbiBvdXRwdXQgaW5pdGlhbGl6YXRpb24gcHJvY2VkdXJlIG11c3QgYmUgZG9uZSBwcmlvciAKKyAgICAgICB0byB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgTUNVIG91dHB1dHMgKGRvbmUgd2l0aGluIEhBTF9IUlRJTV9Nc3BJbml0KQorICAgICovCisgICAgaWYgKGhocnRpbS0+SW5zdGFuY2UgPT0gSFJUSU0xKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgSFJUSU0gcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgX19IQUxfUkNDX0hSVElNMV9DTEtfRU5BQkxFKCk7CisgICAgfQorICAgIAorICAgIGhydGltX21jciA9IGhocnRpbS0+SW5zdGFuY2UtPnNNYXN0ZXJSZWdzLk1DUjsKKyAgICAKKyAgICAvKiBTZXQgdGhlIGV2ZW50IHRvIGJlIHNlbnQgb24gdGhlIHN5bmNocm9uaXphdGlvbiBvdXRwdXQgKi8KKyAgICBocnRpbV9tY3IgJj0gfihIUlRJTV9NQ1JfU1lOQ19TUkMpOworICAgIGhydGltX21jciB8PSAoaGhydGltLT5Jbml0LlN5bmNPdXRwdXRTb3VyY2UgJiBIUlRJTV9NQ1JfU1lOQ19TUkMpOworICAgIAorICAgIC8qIFNldCB0aGUgcG9sYXJpdHkgb2YgdGhlIHN5bmNocm9uaXphdGlvbiBvdXRwdXQgKi8KKyAgICBocnRpbV9tY3IgJj0gfihIUlRJTV9NQ1JfU1lOQ19PVVQpOworICAgIGhydGltX21jciB8PSAoaGhydGltLT5Jbml0LlN5bmNPdXRwdXRQb2xhcml0eSAmIEhSVElNX01DUl9TWU5DX09VVCk7CisgICAgCisgICAgLyogVXBkYXRlIHRoZSBIUlRJTSByZWdpc3RlcnMgKi8gIAorICAgIGhocnRpbS0+SW5zdGFuY2UtPnNNYXN0ZXJSZWdzLk1DUiA9IGhydGltX21jcjsgICAgCisgIH0KKworICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQyBhbmQgRE1BICovCisgIEhBTF9IUlRJTV9Nc3BJbml0KGhocnRpbSk7CisgIAorICAvKiBIUlRJTSBpbnB1dCBzeW5jaHJvbml6YXRpb24gY29uZmlndXJhdGlvbiAoaWYgcmVxdWlyZWQpICovCisgIGlmICgoaGhydGltLT5Jbml0LlN5bmNPcHRpb25zICYgSFJUSU1fU1lOQ09QVElPTl9TTEFWRSkgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1NZTkNJTlBVVFNPVVJDRShoaHJ0aW0tPkluaXQuU3luY0lucHV0U291cmNlKSk7CisgICAgCisgICAgaHJ0aW1fbWNyID0gaGhydGltLT5JbnN0YW5jZS0+c01hc3RlclJlZ3MuTUNSOworCisgICAgLyogU2V0IHRoZSBzeW5jaHJvbml6YXRpb24gaW5wdXQgc291cmNlICovCisgICAgaHJ0aW1fbWNyICY9IH4oSFJUSU1fTUNSX1NZTkNfSU4pOworICAgIGhydGltX21jciB8PSAoaGhydGltLT5Jbml0LlN5bmNJbnB1dFNvdXJjZSAmIEhSVElNX01DUl9TWU5DX0lOKTsKKyAgICAKKyAgICAvKiBVcGRhdGUgdGhlIEhSVElNIHJlZ2lzdGVycyAqLyAgCisgICAgaGhydGltLT5JbnN0YW5jZS0+c01hc3RlclJlZ3MuTUNSID0gaHJ0aW1fbWNyOyAgICAKKyAgfQorICAKKyAgLyogSW5pdGlhbGl6ZSB0aGUgSFJUSU0gc3RhdGUqLworICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX1JFQURZOworICAKKyAgLyogSW5pdGlhbGl6ZSB0aGUgbG9jayBzdGF0dXMgb2YgdGhlIEhSVElNIEhBTCBBUEkgKi8KKyAgX19IQUxfVU5MT0NLKGhocnRpbSk7CisKKyAgLyogSW5pdGlhbGl6ZSB0aW1lciByZWxhdGVkIHBhcmFtZXRlcnMgKi8gCisgIGZvciAodGltZXJfaWR4ID0gSFJUSU1fVElNRVJJTkRFWF9USU1FUl9BIDsgCisgICAgICAgdGltZXJfaWR4IDw9IEhSVElNX1RJTUVSSU5ERVhfTUFTVEVSIDsgCisgICAgICAgdGltZXJfaWR4KyspCisgIHsKKyAgICBoaHJ0aW0tPlRpbWVyUGFyYW1bdGltZXJfaWR4XS5DYXB0dXJlVHJpZ2dlcjEgPSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9OT05FOworICAgIGhocnRpbS0+VGltZXJQYXJhbVt0aW1lcl9pZHhdLkNhcHR1cmVUcmlnZ2VyMiA9IEhSVElNX0NBUFRVUkVUUklHR0VSX05PTkU7CisgICAgaGhydGltLT5UaW1lclBhcmFtW3RpbWVyX2lkeF0uSW50ZXJydXB0UmVxdWVzdHMgPSBIUlRJTV9JVF9OT05FOworICAgIGhocnRpbS0+VGltZXJQYXJhbVt0aW1lcl9pZHhdLkRNQVJlcXVlc3RzID0gSFJUSU1fSVRfTk9ORTsKKyAgICBoaHJ0aW0tPlRpbWVyUGFyYW1bdGltZXJfaWR4XS5ETUFTcmNBZGRyZXNzID0gMFU7CisgICAgaGhydGltLT5UaW1lclBhcmFtW3RpbWVyX2lkeF0uRE1BU2l6ZSA9IDBVOworICB9CisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemVzIGEgSFJUSU0gaW5zdGFuY2UgCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fRGVJbml0IChIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltKQoreworICAvKiBDaGVjayB0aGUgSFJUSU0gaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYoaGhydGltID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fQUxMX0lOU1RBTkNFKGhocnRpbS0+SW5zdGFuY2UpKTsKKworICAvKiBTZXQgdGhlIEhSVElNIHN0YXRlICovCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfQlVTWTsKKyAgCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIEhBTF9IUlRJTV9Nc3BEZUluaXQoaGhydGltKTsKKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfUkVBRFk7CisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIE1TUCBpbml0aWFsaXphdGlvbiBmb3IgYSBIUlRJTSBpbnN0YW5jZQorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0hSVElNX01zcEluaXQoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGhydGltKTsKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgdGhlIEhBTF9IUlRJTV9Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovIAorfQorCisvKioKKyAgKiBAYnJpZWYgIE1TUCBkZS1pbml0aWFsaXphdGlvbiBvZiBhIEhSVElNIGluc3RhbmNlCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSFJUSU1fTXNwRGVJbml0KEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhocnRpbSk7CisKKyAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgIHRoZSBIQUxfSFJUSU1fTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovIAorfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgRExMIGNhbGlicmF0aW9uCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBDYWxpYnJhdGlvblJhdGUgRExMIGNhbGlicmF0aW9uIHBlcmlvZAorICAqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1NJTkdMRV9DQUxJQlJBVElPTjogT25lIHNob3QgRExMIGNhbGlicmF0aW9uCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fQ0FMSUJSQVRJT05SQVRFXzczMDA6IFBlcmlvZGljIERMTCBjYWxpYnJhdGlvbi4gVD03LjMgbXMKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9DQUxJQlJBVElPTlJBVEVfOTEwOiBQZXJpb2RpYyBETEwgY2FsaWJyYXRpb24uIFQ9OTEwIHVzCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fQ0FMSUJSQVRJT05SQVRFXzExNDogUGVyaW9kaWMgRExMIGNhbGlicmF0aW9uLiBUPTExNCB1cworICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0NBTElCUkFUSU9OUkFURV8xNDogUGVyaW9kaWMgRExMIGNhbGlicmF0aW9uLiBUPTE0IHVzCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBsb2NrcyB0aGUgSFJUSU0gaW5zdGFuY2UuIEhSVElNIGluc3RhbmNlIGlzIHVubG9ja2VkIAorICAqICAgICAgIHdpdGhpbiB0aGUgSEFMX0hSVElNX1BvbGxGb3JETExDYWxpYnJhdGlvbiBmdW5jdGlvbiwganVzdCBiZWZvcmUgCisgICogICAgICAgZXhpdGluZyB0aGUgZnVuY3Rpb24uCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fRExMQ2FsaWJyYXRpb25TdGFydChIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2FsaWJyYXRpb25SYXRlKQoreworICB1aW50MzJfdCBocnRpbV9kbGxjcjsKKyAgCisgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fQ0FMSUJSQVRJT05SQVRFKENhbGlicmF0aW9uUmF0ZSkpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGhydGltKTsKKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfQlVTWTsgCisgIAorICAvKiBDb25maWd1cmUgRExMIENhbGlicmF0aW9uICovCisgIGhydGltX2RsbGNyID0gaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuRExMQ1I7CisgIAorICBpZiAoQ2FsaWJyYXRpb25SYXRlID09IEhSVElNX1NJTkdMRV9DQUxJQlJBVElPTikKKyAgeworICAgIC8qIE9uZSBzaG90IERMTCBjYWxpYnJhdGlvbiAqLworICAgIGhydGltX2RsbGNyICY9IH4oSFJUSU1fRExMQ1JfQ0FMRU4pOworICAgIGhydGltX2RsbGNyIHw9IEhSVElNX0RMTENSX0NBTDsgICAgCisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUGVyaW9kaWMgRExMIGNhbGlicmF0aW9uICovCisgICAgaHJ0aW1fZGxsY3IgJj0gfihIUlRJTV9ETExDUl9DQUxSVEUgfCBIUlRJTV9ETExDUl9DQUwpOworICAgIGhydGltX2RsbGNyIHw9IChDYWxpYnJhdGlvblJhdGUgfCBIUlRJTV9ETExDUl9DQUxFTik7CisgIH0KKworICAvKiBVcGRhdGUgSFJUSU0gcmVnaXN0ZXIgKi8KKyAgaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuRExMQ1IgPSBocnRpbV9kbGxjcjsKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBETEwgY2FsaWJyYXRpb24uCisgICogICAgICAgICBETEwgcmVhZHkgaW50ZXJydXB0IGlzIGVuYWJsZWQKKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIENhbGlicmF0aW9uUmF0ZSBETEwgY2FsaWJyYXRpb24gcGVyaW9kCisgICogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fU0lOR0xFX0NBTElCUkFUSU9OOiBPbmUgc2hvdCBETEwgY2FsaWJyYXRpb24KKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9DQUxJQlJBVElPTlJBVEVfNzMwMDogUGVyaW9kaWMgRExMIGNhbGlicmF0aW9uLiBUPTcuMyBtcworICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0NBTElCUkFUSU9OUkFURV85MTA6IFBlcmlvZGljIERMTCBjYWxpYnJhdGlvbi4gVD05MTAgdXMKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9DQUxJQlJBVElPTlJBVEVfMTE0OiBQZXJpb2RpYyBETEwgY2FsaWJyYXRpb24uIFQ9MTE0IHVzCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fQ0FMSUJSQVRJT05SQVRFXzE0OiBQZXJpb2RpYyBETEwgY2FsaWJyYXRpb24uIFQ9MTQgdXMKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGxvY2tzIHRoZSBIUlRJTSBpbnN0YW5jZS4gSFJUSU0gaW5zdGFuY2UgaXMgdW5sb2NrZWQgCisgICogICAgICAgd2l0aGluIHRoZSBJUlEgcHJvY2Vzc2luZyBmdW5jdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIERMTCByZWFkeSAKKyAgKiAgICAgICBpbnRlcnJ1cHQuCisgICogQG5vdGUgSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIHBlcmlvZGljIGNhbGlicmF0aW9uLCB0aGUgRExMUkRZIAorICAqICAgICAgIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgZXZlcnkgdGltZSB0aGUgY2FsaWJyYXRpb24gY29tcGxldGVzIHdoaWNoCisgICogICAgICAgd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlcyB0aGUgb3ZlcmFsbCBpbnRlcnJ1cHQgcmF0ZS4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9ETExDYWxpYnJhdGlvblN0YXJ0X0lUKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDYWxpYnJhdGlvblJhdGUpCit7CisgIHVpbnQzMl90IGhydGltX2RsbGNyOworICAKKyAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9DQUxJQlJBVElPTlJBVEUoQ2FsaWJyYXRpb25SYXRlKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaHJ0aW0pOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9CVVNZOworICAKKyAgLyogRW5hYmxlIERMTCBSZWFkeSBpbnRlcnJ1cHQgZmxhZyAqLworICBfX0hBTF9IUlRJTV9FTkFCTEVfSVQoaGhydGltLCBIUlRJTV9JVF9ETExSRFkpOworICAKKyAgLyogQ29uZmlndXJlIERMTCBDYWxpYnJhdGlvbiAqLworICBocnRpbV9kbGxjciA9IGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLkRMTENSOworICAKKyAgaWYgKENhbGlicmF0aW9uUmF0ZSA9PSBIUlRJTV9TSU5HTEVfQ0FMSUJSQVRJT04pCisgIHsKKyAgICAvKiBPbmUgc2hvdCBETEwgY2FsaWJyYXRpb24gKi8KKyAgICBocnRpbV9kbGxjciAmPSB+KEhSVElNX0RMTENSX0NBTEVOKTsKKyAgICBocnRpbV9kbGxjciB8PSBIUlRJTV9ETExDUl9DQUw7ICAgIAorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFBlcmlvZGljIERMTCBjYWxpYnJhdGlvbiAqLworICAgIGhydGltX2RsbGNyICY9IH4oSFJUSU1fRExMQ1JfQ0FMUlRFIHwgSFJUSU1fRExMQ1JfQ0FMKTsKKyAgICBocnRpbV9kbGxjciB8PSAoQ2FsaWJyYXRpb25SYXRlIHwgSFJUSU1fRExMQ1JfQ0FMRU4pOworICB9CisgICAgICAgICAgICAgICAKKyAgLyogVXBkYXRlIEhSVElNIHJlZ2lzdGVyICovCisgIGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLkRMTENSID0gaHJ0aW1fZGxsY3I7CisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFBvbGxzIHRoZSBETEwgY2FsaWJyYXRpb24gcmVhZHkgZmxhZyBhbmQgcmV0dXJucyB3aGVuIHRoZSBmbGFnIGlzCisgICogICAgICAgICBzZXQgKERMTCBjYWxpYnJhdGlvbiBjb21wbGV0ZWQpIG9yIHVwb24gdGltZW91dCBleHBpcmF0aW9uCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMgCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fUG9sbEZvckRMTENhbGlicmF0aW9uKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydD0wVTsKKworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOyAgCisgICAgIAorICAvKiBDaGVjayBFbmQgb2YgY29udmVyc2lvbiBmbGFnICovCisgIHdoaWxlKF9fSEFMX0hSVElNX0dFVF9GTEFHKGhocnRpbSwgSFJUSU1fSVRfRExMUkRZKSA9PSBSRVNFVCkKKyAgeworICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYoKFRpbWVvdXQgPT0gMFUpIHx8ICgoSEFMX0dldFRpY2soKS10aWNrc3RhcnQpID4gVGltZW91dCkpCisgICAgICB7CisgICAgICAgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfRVJST1I7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBTZXQgSFJUSU0gU3RhdGUgKi8gIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX1JFQURZOworIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaHJ0aW0pOyAKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIHRpbWUgYmFzZSB1bml0IG9mIGEgdGltZXIgCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBUaW1lcklkeCBUaW1lciBpbmRleAorICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX01BU1RFUiBmb3IgbWFzdGVyIHRpbWVyCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0EgZm9yIHRpbWVyIEEKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQiBmb3IgdGltZXIgQgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9DIGZvciB0aW1lciBDCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0QgZm9yIHRpbWVyIEQKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRSBmb3IgdGltZXIgRQorICAqIEBwYXJhbSAgcFRpbWVCYXNlQ2ZnIHBvaW50ZXIgdG8gdGhlIHRpbWUgYmFzZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgcHJpb3Igc3RhcnRpbmcgdGhlIHRpbWVyIAorICAqIEBub3RlICAgVGhlIHRpbWUtYmFzZSB1bml0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgc3BlY2lmeToKKyAgKiAgICAgICAgICAgVGhlIHRpbWVyIGNvdW50ZXIgb3BlcmF0aW5nIG1vZGUgKGNvbnRpbnVvdXMsIG9uZSBzaG90KSwKKyAgKiAgICAgICAgICAgVGhlIHRpbWVyIGNsb2NrIHByZXNjYWxlciwKKyAgKiAgICAgICAgICAgVGhlIHRpbWVyIHBlcmlvZCwKKyAgKiAgICAgICAgICAgVGhlIHRpbWVyIHJlcGV0aXRpb24gY291bnRlci4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9UaW1lQmFzZUNvbmZpZyhIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fVGltZUJhc2VDZmdUeXBlRGVmICogcFRpbWVCYXNlQ2ZnKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNRVJJTkRFWChUaW1lcklkeCkpOworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fUFJFU0NBTEVSUkFUSU8ocFRpbWVCYXNlQ2ZnLT5QcmVzY2FsZXJSYXRpbykpOyAKKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX01PREUocFRpbWVCYXNlQ2ZnLT5Nb2RlKSk7IAorICAKKyAgaWYoaGhydGltLT5TdGF0ZSA9PSBIQUxfSFJUSU1fU1RBVEVfQlVTWSkKKyAgeworICAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKyAKKyAgLyogU2V0IHRoZSBIUlRJTSBzdGF0ZSAqLworICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX0JVU1k7CisKKyAgaWYgKFRpbWVySWR4ID09IEhSVElNX1RJTUVSSU5ERVhfTUFTVEVSKQorICB7CisgICAgLyogQ29uZmlndXJlIG1hc3RlciB0aW1lciB0aW1lIGJhc2UgdW5pdCAqLworICAgIEhSVElNX01hc3RlckJhc2VfQ29uZmlnKGhocnRpbSwgcFRpbWVCYXNlQ2ZnKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDb25maWd1cmUgdGltaW5nIHVuaXQgdGltZSBiYXNlIHVuaXQgKi8KKyAgICBIUlRJTV9UaW1pbmdVbml0QmFzZV9Db25maWcoaGhydGltLCBUaW1lcklkeCwgcFRpbWVCYXNlQ2ZnKTsKKyAgfQorICAgICAgCisgIC8qIFNldCBIUlRJTSBzdGF0ZSAqLworICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX1JFQURZOworICAKKyAgcmV0dXJuIEhBTF9PSzsgCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBTaW1wbGUgdGltZSBiYXNlIG1vZGUgZnVuY3Rpb25zICAKKyAqICBAYnJpZWYgICAgU2ltcGxlIHRpbWUgYmFzZSBtb2RlIGZ1bmN0aW9ucy4KK0B2ZXJiYXRpbSAgICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIFNpbXBsZSB0aW1lIGJhc2UgbW9kZSBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBTdGFydCBzaW1wbGUgdGltZSBiYXNlIAorICAgICAgKCspIFN0b3Agc2ltcGxlIHRpbWUgYmFzZSAKKyAgICAgICgrKSBTdGFydCBzaW1wbGUgdGltZSBiYXNlIGFuZCBlbmFibGUgaW50ZXJydXB0IAorICAgICAgKCspIFN0b3Agc2ltcGxlIHRpbWUgYmFzZSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHQgCisgICAgICAoKykgU3RhcnQgc2ltcGxlIHRpbWUgYmFzZSBhbmQgZW5hYmxlIERNQSB0cmFuc2ZlciAKKyAgICAgICgrKSBTdG9wIHNpbXBsZSB0aW1lIGJhc2UgYW5kIGRpc2FibGUgRE1BIHRyYW5zZmVyIAorICAgICAgLUAtICBXaGVuIGEgSFJUSU0gdGltZXIgb3BlcmF0ZXMgaW4gc2ltcGxlIHRpbWUgYmFzZSBtb2RlLCB0aGUgdGltZXIKKyAgICAgICAgICAgY291bnRlciBjb3VudHMgZnJvbSAwIHRvIHRoZSBwZXJpb2QgdmFsdWUuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBjb3VudGVyIG9mIGEgdGltZXIgb3BlcmF0aW5nIGluIHNpbXBsZSB0aW1lIGJhc2UgbW9kZS4KKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVySWR4IFRpbWVyIGluZGV4LgorICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX01BU1RFUiAgZm9yIG1hc3RlciB0aW1lcgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9BIGZvciB0aW1lciBBCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0IgZm9yIHRpbWVyIEIKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQyBmb3IgdGltZXIgQworICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9EIGZvciB0aW1lciBECisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0UgZm9yIHRpbWVyIEUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9TaW1wbGVCYXNlU3RhcnQoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCkKK3sgIAorICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTUVSSU5ERVgoVGltZXJJZHgpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhocnRpbSk7CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX0JVU1k7IAorICAKKyAgLyogRW5hYmxlIHRoZSB0aW1lciBjb3VudGVyICovCisgIF9fSEFMX0hSVElNX0VOQUJMRShoaHJ0aW0sIFRpbWVySWR4VG9UaW1lcklkW1RpbWVySWR4XSk7CisKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9SRUFEWTsgCisgICAgICAgICAgICAgICAgICAKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGhydGltKTsgIAorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIGNvdW50ZXIgb2YgYSB0aW1lciBvcGVyYXRpbmcgaW4gc2ltcGxlIHRpbWUgYmFzZSBtb2RlLgorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZXJJZHggVGltZXIgaW5kZXguCisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfTUFTVEVSICBmb3IgbWFzdGVyIHRpbWVyCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0EgZm9yIHRpbWVyIEEKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQiBmb3IgdGltZXIgQgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9DIGZvciB0aW1lciBDCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0QgZm9yIHRpbWVyIEQKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRSBmb3IgdGltZXIgRQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1NpbXBsZUJhc2VTdG9wKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCkKK3sKKyAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9USU1FUklOREVYKFRpbWVySWR4KSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaHJ0aW0pOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9CVVNZOyAKKyAgCisgIC8qIERpc2FibGUgdGhlIHRpbWVyIGNvdW50ZXIgKi8KKyAgX19IQUxfSFJUSU1fRElTQUJMRShoaHJ0aW0sIFRpbWVySWR4VG9UaW1lcklkW1RpbWVySWR4XSk7CisKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9SRUFEWTsgCisgICAgICAgICAgICAgICAgICAKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGhydGltKTsgIAorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBjb3VudGVyIG9mIGEgdGltZXIgb3BlcmF0aW5nIGluIHNpbXBsZSB0aW1lIGJhc2UgbW9kZQorICAqICAgICAgICAgKFRpbWVyIHJlcGV0aXRpb24gaW50ZXJydXB0IGlzIGVuYWJsZWQpLgorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZXJJZHggVGltZXIgaW5kZXguCisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfTUFTVEVSICBmb3IgbWFzdGVyIHRpbWVyCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0EgZm9yIHRpbWVyIEEKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQiBmb3IgdGltZXIgQgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9DIGZvciB0aW1lciBDCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0QgZm9yIHRpbWVyIEQKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRSBmb3IgdGltZXIgRQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1NpbXBsZUJhc2VTdGFydF9JVChIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4KQoreworICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTUVSSU5ERVgoVGltZXJJZHgpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhocnRpbSk7CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX0JVU1k7CisgIAorICAvKiBFbmFibGUgdGhlIHJlcGV0aXRpb24gaW50ZXJydXB0ICovCisgIGlmIChUaW1lcklkeCA9PSBIUlRJTV9USU1FUklOREVYX01BU1RFUikKKyAgeworICAgIF9fSEFMX0hSVElNX01BU1RFUl9FTkFCTEVfSVQoaGhydGltLCBIUlRJTV9NQVNURVJfSVRfTVJFUCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgX19IQUxfSFJUSU1fVElNRVJfRU5BQkxFX0lUKGhocnRpbSwgVGltZXJJZHgsIEhSVElNX1RJTV9JVF9SRVApOworICB9CisgIAorICAvKiBFbmFibGUgdGhlIHRpbWVyIGNvdW50ZXIgKi8KKyAgX19IQUxfSFJUSU1fRU5BQkxFKGhocnRpbSwgVGltZXJJZHhUb1RpbWVySWRbVGltZXJJZHhdKTsKKworICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX1JFQURZOyAKKyAgICAgICAgICAgICAgICAgIAorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaHJ0aW0pOyAgCisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgY291bnRlciBvZiBhIHRpbWVyIG9wZXJhdGluZyBpbiBzaW1wbGUgdGltZSBiYXNlIG1vZGUKKyAgKiAgICAgICAgIChUaW1lciByZXBldGl0aW9uIGludGVycnVwdCBpcyBkaXNhYmxlZCkuCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBUaW1lcklkeCBUaW1lciBpbmRleC4KKyAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9NQVNURVIgIGZvciBtYXN0ZXIgdGltZXIKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fU2ltcGxlQmFzZVN0b3BfSVQoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4KQoreworICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTUVSSU5ERVgoVGltZXJJZHgpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhocnRpbSk7CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX0JVU1k7CisgIAorICAvKiBEaXNhYmxlIHRoZSByZXBldGl0aW9uIGludGVycnVwdCAqLworICBpZiAoVGltZXJJZHggPT0gSFJUSU1fVElNRVJJTkRFWF9NQVNURVIpCisgIHsKKyAgICBfX0hBTF9IUlRJTV9NQVNURVJfRElTQUJMRV9JVChoaHJ0aW0sIEhSVElNX01BU1RFUl9JVF9NUkVQKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBfX0hBTF9IUlRJTV9USU1FUl9ESVNBQkxFX0lUKGhocnRpbSwgVGltZXJJZHgsIEhSVElNX1RJTV9JVF9SRVApOworICB9CisgIAorICAvKiBEaXNhYmxlIHRoZSB0aW1lciBjb3VudGVyICovCisgIF9fSEFMX0hSVElNX0RJU0FCTEUoaGhydGltLCBUaW1lcklkeFRvVGltZXJJZFtUaW1lcklkeF0pOworCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfUkVBRFk7IAorICAgICAgICAgICAgICAgICAgCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhocnRpbSk7ICAKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgY291bnRlciBvZiBhIHRpbWVyIG9wZXJhdGluZyBpbiBzaW1wbGUgdGltZSBiYXNlIG1vZGUKKyAgKiAgICAgICAgIChUaW1lciByZXBldGl0aW9uIERNQSByZXF1ZXN0IGlzIGVuYWJsZWQpLgorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZXJJZHggVGltZXIgaW5kZXguCisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX01BU1RFUiAgZm9yIG1hc3RlciB0aW1lcgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQiBmb3IgdGltZXIgQgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQyBmb3IgdGltZXIgQworICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRSBmb3IgdGltZXIgRQorICAqIEBwYXJhbSAgU3JjQWRkciBETUEgdHJhbnNmZXIgc291cmNlIGFkZHJlc3MKKyAgKiBAcGFyYW0gIERlc3RBZGRyIERNQSB0cmFuc2ZlciBkZXN0aW5hdGlvbiBhZGRyZXNzCisgICogQHBhcmFtICBMZW5ndGggVGhlIGxlbmd0aCBvZiBkYXRhIGl0ZW1zIChkYXRhIHNpemUpIHRvIGJlIHRyYW5zZmVycmVkCisgICogICAgICAgICAgICAgICAgICAgICBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbgorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1NpbXBsZUJhc2VTdGFydF9ETUEoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNyY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERlc3RBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBMZW5ndGgpCit7CisgIERNQV9IYW5kbGVUeXBlRGVmICogaGRtYTsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9USU1FUklOREVYKFRpbWVySWR4KSk7CisgIAorICBpZihoaHJ0aW0tPlN0YXRlID09IEhBTF9IUlRJTV9TVEFURV9CVVNZKQorICB7CisgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorICBpZihoaHJ0aW0tPlN0YXRlID09IEhBTF9IUlRJTV9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmKChTcmNBZGRyID09IDBVICkgfHwgKERlc3RBZGRyID09IDBVICkgfHwgKExlbmd0aCA9PSAwVSkpIAorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX0JVU1k7CisgICAgfQorICB9CisgIAorICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhocnRpbSk7CisgIAorICAvKiBHZXQgdGhlIHRpbWVyIERNQSBoYW5kbGVyICovCisgIGhkbWEgPSBIUlRJTV9HZXRETUFIYW5kbGVGcm9tVGltZXJJZHgoaGhydGltLCBUaW1lcklkeCk7CisgIAorICBpZiAoaGRtYSA9PSBOVUxMKSAKKyAgeworICAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9FUlJPUjsKKyAgIAorICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgX19IQUxfVU5MT0NLKGhocnRpbSk7IAorICAgCisgICByZXR1cm4gSEFMX0VSUk9SOworICB9IAorCisgIC8qIFNldCB0aGUgRE1BIHRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayAqLworICBpZiAoVGltZXJJZHggPT0gSFJUSU1fVElNRVJJTkRFWF9NQVNURVIpCisgIHsKKyAgICBoZG1hLT5YZmVyQ3BsdENhbGxiYWNrID0gSFJUSU1fRE1BTWFzdGVyQ3BsdDsKKyAgfQorICBlbHNlCisgIHsKKyAgICBoZG1hLT5YZmVyQ3BsdENhbGxiYWNrID0gSFJUSU1fRE1BVGltZXJ4Q3BsdDsKKyAgfQorICAKKyAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgaGRtYS0+WGZlckVycm9yQ2FsbGJhY2sgPSBIUlRJTV9ETUFFcnJvciA7CisgIAorICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgIEhBTF9ETUFfU3RhcnRfSVQoaGRtYSwgU3JjQWRkciwgRGVzdEFkZHIsIExlbmd0aCk7CisgIAorICAvKiBFbmFibGUgdGhlIHRpbWVyIHJlcGV0aXRpb24gRE1BIHJlcXVlc3QgKi8KKyAgaWYgKFRpbWVySWR4ID09IEhSVElNX1RJTUVSSU5ERVhfTUFTVEVSKQorICB7CisgICAgX19IQUxfSFJUSU1fTUFTVEVSX0VOQUJMRV9ETUEoaGhydGltLCBIUlRJTV9NQVNURVJfRE1BX01SRVApOworICB9CisgIGVsc2UKKyAgeworICAgIF9fSEFMX0hSVElNX1RJTUVSX0VOQUJMRV9ETUEoaGhydGltLCBUaW1lcklkeCwgSFJUSU1fVElNX0RNQV9SRVApOworICB9CisgIAorICAvKiBFbmFibGUgdGhlIHRpbWVyIGNvdW50ZXIgKi8KKyAgX19IQUxfSFJUSU1fRU5BQkxFKGhocnRpbSwgVGltZXJJZHhUb1RpbWVySWRbVGltZXJJZHhdKTsKKworICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX1JFQURZOyAKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaHJ0aW0pOyAgCisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBjb3VudGVyIG9mIGEgdGltZXIgb3BlcmF0aW5nIGluIHNpbXBsZSB0aW1lIGJhc2UgbW9kZQorICAqICAgICAgICAgKFRpbWVyIHJlcGV0aXRpb24gRE1BIHJlcXVlc3QgaXMgZGlzYWJsZWQpLgorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZXJJZHggVGltZXIgaW5kZXguCisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfTUFTVEVSICBmb3IgbWFzdGVyIHRpbWVyCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0EgZm9yIHRpbWVyIEEKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQiBmb3IgdGltZXIgQgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9DIGZvciB0aW1lciBDCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0QgZm9yIHRpbWVyIEQKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRSBmb3IgdGltZXIgRQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1NpbXBsZUJhc2VTdG9wX0RNQShIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4KQoreworICBETUFfSGFuZGxlVHlwZURlZiAqIGhkbWE7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTUVSSU5ERVgoVGltZXJJZHgpKTsKKyAgICAKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaHJ0aW0pOworICAKKyAgaWYgKFRpbWVySWR4ID09IEhSVElNX1RJTUVSSU5ERVhfTUFTVEVSKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgRE1BICovCisgICAgSEFMX0RNQV9BYm9ydChoaHJ0aW0tPmhkbWFNYXN0ZXIpOworICAgIAorICAgIC8qIERpc2FibGUgdGhlIHRpbWVyIHJlcGV0aXRpb24gRE1BIHJlcXVlc3QgKi8KKyAgICBfX0hBTF9IUlRJTV9NQVNURVJfRElTQUJMRV9ETUEoaGhydGltLCBIUlRJTV9NQVNURVJfRE1BX01SRVApOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIEdldCB0aGUgdGltZXIgRE1BIGhhbmRsZXIgKi8KKyAgICBoZG1hID0gSFJUSU1fR2V0RE1BSGFuZGxlRnJvbVRpbWVySWR4KGhocnRpbSwgVGltZXJJZHgpOworICAKKyAgICBpZiAoaGRtYSA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIHRpbWVyIHJlcGV0aXRpb24gRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX0hSVElNX1RJTUVSX0RJU0FCTEVfRE1BKGhocnRpbSwgVGltZXJJZHgsIEhSVElNX1RJTV9ETUFfUkVQKTsKKworICAgICAgLyogRGlzYWJsZSB0aGUgdGltZXIgY291bnRlciAqLworICAgICAgX19IQUxfSFJUSU1fRElTQUJMRShoaHJ0aW0sIFRpbWVySWR4VG9UaW1lcklkW1RpbWVySWR4XSk7CisKKyAgICAgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfRVJST1I7IAorCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGhydGltKTsgIAorICAgCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgRE1BICovCisgICAgICBIQUxfRE1BX0Fib3J0KGhkbWEpOworICAgIAorICAgICAgLyogRGlzYWJsZSB0aGUgdGltZXIgcmVwZXRpdGlvbiBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfSFJUSU1fVElNRVJfRElTQUJMRV9ETUEoaGhydGltLCBUaW1lcklkeCwgSFJUSU1fVElNX0RNQV9SRVApOworICAgIH0KKyAgfQorICAKKyAgLyogRGlzYWJsZSB0aGUgdGltZXIgY291bnRlciAqLworICBfX0hBTF9IUlRJTV9ESVNBQkxFKGhocnRpbSwgVGltZXJJZHhUb1RpbWVySWRbVGltZXJJZHhdKTsKKworICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX1JFQURZOyAKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaHJ0aW0pOyAgCisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFNpbXBsZSBvdXRwdXQgY29tcGFyZSBtb2RlIGZ1bmN0aW9ucyAgCisgKiAgQGJyaWVmICAgIFNpbXBsZSBvdXRwdXQgY29tcGFyZSBmdW5jdGlvbnMKK0B2ZXJiYXRpbSAgICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIFNpbXBsZSBvdXRwdXQgY29tcGFyZSBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBDb25maWd1cmUgc2ltcGxlIG91dHB1dCBjaGFubmVsIAorICAgICAgKCspIFN0YXJ0IHNpbXBsZSBvdXRwdXQgY29tcGFyZSAKKyAgICAgICgrKSBTdG9wIHNpbXBsZSBvdXRwdXQgY29tcGFyZSAKKyAgICAgICgrKSBTdGFydCBzaW1wbGUgb3V0cHV0IGNvbXBhcmUgYW5kIGVuYWJsZSBpbnRlcnJ1cHQgCisgICAgICAoKykgU3RvcCBzaW1wbGUgb3V0cHV0IGNvbXBhcmUgYW5kIGRpc2FibGUgaW50ZXJydXB0IAorICAgICAgKCspIFN0YXJ0IHNpbXBsZSBvdXRwdXQgY29tcGFyZSBhbmQgZW5hYmxlIERNQSB0cmFuc2ZlciAKKyAgICAgICgrKSBTdG9wIHNpbXBsZSBvdXRwdXQgY29tcGFyZSBhbmQgZGlzYWJsZSBETUEgdHJhbnNmZXIgCisgICAgICAgLUAtIFdoZW4gYSBIUlRJTSB0aW1lciBvcGVyYXRlcyBpbiBzaW1wbGUgb3V0cHV0IGNvbXBhcmUgbW9kZQorICAgICAgICAgICB0aGUgb3V0cHV0IGxldmVsIGlzIHNldCB0byBhIHByb2dyYW1tYWJsZSB2YWx1ZSB3aGVuIGEgbWF0Y2ggCisgICAgICAgICAgIGlzIGZvdW5kIGJldHdlZW4gdGhlIGNvbXBhcmUgcmVnaXN0ZXIgYW5kIHRoZSBjb3VudGVyLgorICAgICAgICAgICBDb21wYXJlIHVuaXQgMSBpcyBhdXRvbWF0aWNhbGx5IGFzc29jaWF0ZWQgdG8gb3V0cHV0IDEKKyAgICAgICAgICAgQ29tcGFyZSB1bml0IDIgaXMgYXV0b21hdGljYWxseSBhc3NvY2lhdGVkIHRvIG91dHB1dCAyCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgYW4gb3V0cHV0IGluIHNpbXBsZSBvdXRwdXQgY29tcGFyZSBtb2RlIAorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZXJJZHggVGltZXIgaW5kZXgKKyAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9BIGZvciB0aW1lciBBCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0IgZm9yIHRpbWVyIEIKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQyBmb3IgdGltZXIgQworICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9EIGZvciB0aW1lciBECisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0UgZm9yIHRpbWVyIEUKKyAgKiBAcGFyYW0gIE9DQ2hhbm5lbCBUaW1lciBvdXRwdXQKKyAgKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEExOiBUaW1lciBBIC0gT3V0cHV0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEEyOiBUaW1lciBBIC0gT3V0cHV0IDIKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEIxOiBUaW1lciBCIC0gT3V0cHV0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEIyOiBUaW1lciBCIC0gT3V0cHV0IDIKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEMxOiBUaW1lciBDIC0gT3V0cHV0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEMyOiBUaW1lciBDIC0gT3V0cHV0IDIKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEQxOiBUaW1lciBEIC0gT3V0cHV0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEQyOiBUaW1lciBEIC0gT3V0cHV0IDIKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEUxOiBUaW1lciBFIC0gT3V0cHV0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEUyOiBUaW1lciBFIC0gT3V0cHV0IDIgCisgICogQHBhcmFtICBwU2ltcGxlT0NDaGFubmVsQ2ZnIHBvaW50ZXIgdG8gdGhlIHNpbXBsZSBvdXRwdXQgY29tcGFyZSBvdXRwdXQgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAgKiBAbm90ZSBXaGVuIHRoZSB0aW1lciBvcGVyYXRlcyBpbiBzaW1wbGUgb3V0cHV0IGNvbXBhcmUgbW9kZToKKyAgKiAgICAgICAgIE91dHB1dCAxIGlzIGltcGxpY2l0bHkgY29udHJvbGxlZCBieSB0aGUgY29tcGFyZSB1bml0IDEKKyAgKiAgICAgICAgIE91dHB1dCAyIGlzIGltcGxpY2l0bHkgY29udHJvbGxlZCBieSB0aGUgY29tcGFyZSB1bml0IDIKKyAgKiAgICAgICBPdXRwdXQgU2V0L1Jlc2V0IGNyb3NzYmFyIGlzIHNldCBhY2NvcmRpbmcgdG8gdGhlIHNlbGVjdGVkIG91dHB1dCBjb21wYXJlIG1vZGU6CisgICogICAgICAgICBUb2dnbGU6IFNFVHh5UiA9IFJTVHh5UiA9IENNUHkKKyAgKiAgICAgICAgIEFjdGl2ZTogU0VUeHlSID0gQ01QeSwgUlNUeHlSID0gMAorICAqICAgICAgICAgSW5hY3RpdmU6IFNFVHh5ID0wLCBSU1R4eSA9IENNUHkKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9TaW1wbGVPQ0NoYW5uZWxDb25maWcoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPQ0NoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fU2ltcGxlT0NDaGFubmVsQ2ZnVHlwZURlZiogcFNpbXBsZU9DQ2hhbm5lbENmZykKK3sKKyAgdWludDMyX3QgQ29tcGFyZVVuaXQgPSAweEZGRkZGRkZGVTsKKyAgSFJUSU1fQ29tcGFyZUNmZ1R5cGVEZWYgQ29tcGFyZUNmZyA9IHswfTsKKyAgSFJUSU1fT3V0cHV0Q2ZnVHlwZURlZiBPdXRwdXRDZmcgPSB7MH07CisgIAorICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9USU1FUl9PVVRQVVQoVGltZXJJZHgsIE9DQ2hhbm5lbCkpOworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fQkFTSUNPQ01PREUocFNpbXBsZU9DQ2hhbm5lbENmZy0+TW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fT1VUUFVUUE9MQVJJVFkocFNpbXBsZU9DQ2hhbm5lbENmZy0+UG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX09VVFBVVElETEVMRVZFTChwU2ltcGxlT0NDaGFubmVsQ2ZnLT5JZGxlTGV2ZWwpKTsKKyAgCisgIGlmKGhocnRpbS0+U3RhdGUgPT0gSEFMX0hSVElNX1NUQVRFX0JVU1kpCisgIHsKKyAgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisKKyAgLyogU2V0IEhSVElNIHN0YXRlICovCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfQlVTWTsKKyAgCisgIC8qIENvbmZpZ3VyZSB0aW1lciBjb21wYXJlIHVuaXQgKi8gIAorICBzd2l0Y2ggKE9DQ2hhbm5lbCkKKyAgeworICBjYXNlIEhSVElNX09VVFBVVF9UQTE6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RCMToKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEMxOgorICBjYXNlIEhSVElNX09VVFBVVF9URDE6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RFMToKKyAgICB7CisgICAgICBDb21wYXJlVW5pdCA9IEhSVElNX0NPTVBBUkVVTklUXzE7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEhSVElNX09VVFBVVF9UQTI6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RCMjoKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEMyOgorICBjYXNlIEhSVElNX09VVFBVVF9URDI6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RFMjoKKyAgICB7CisgICAgICBDb21wYXJlVW5pdCA9IEhSVElNX0NPTVBBUkVVTklUXzI7CisgICAgfQorICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9CisgIAorICBDb21wYXJlQ2ZnLkNvbXBhcmVWYWx1ZSA9IHBTaW1wbGVPQ0NoYW5uZWxDZmctPlB1bHNlOworICBDb21wYXJlQ2ZnLkF1dG9EZWxheWVkTW9kZSA9IEhSVElNX0FVVE9ERUxBWUVETU9ERV9SRUdVTEFSOworICBDb21wYXJlQ2ZnLkF1dG9EZWxheWVkVGltZW91dCA9IDBVOworICAKKyAgSFJUSU1fQ29tcGFyZVVuaXRDb25maWcoaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGFyZVVuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZDb21wYXJlQ2ZnKTsKKyAgCisgIC8qIENvbmZpZ3VyZSB0aW1lciBvdXRwdXQgKi8KKyAgT3V0cHV0Q2ZnLlBvbGFyaXR5ID0gcFNpbXBsZU9DQ2hhbm5lbENmZy0+UG9sYXJpdHk7CisgIE91dHB1dENmZy5JZGxlTGV2ZWwgPSBwU2ltcGxlT0NDaGFubmVsQ2ZnLT5JZGxlTGV2ZWw7CisgIE91dHB1dENmZy5GYXVsdExldmVsID0gSFJUSU1fT1VUUFVURkFVTFRMRVZFTF9OT05FOworICBPdXRwdXRDZmcuSWRsZU1vZGUgPSBIUlRJTV9PVVRQVVRJRExFTU9ERV9OT05FOworICBPdXRwdXRDZmcuQ2hvcHBlck1vZGVFbmFibGUgPSBIUlRJTV9PVVRQVVRDSE9QUEVSTU9ERV9ESVNBQkxFRDsKKyAgT3V0cHV0Q2ZnLkJ1cnN0TW9kZUVudHJ5RGVsYXllZCA9IEhSVElNX09VVFBVVEJVUlNUTU9ERUVOVFJZX1JFR1VMQVI7CisgIAorICBzd2l0Y2ggKHBTaW1wbGVPQ0NoYW5uZWxDZmctPk1vZGUpCisgIHsKKyAgY2FzZSBIUlRJTV9CQVNJQ09DTU9ERV9UT0dHTEU6CisgICAgeworICAgICAgaWYgKENvbXBhcmVVbml0ID09IEhSVElNX0NPTVBBUkVVTklUXzEpCisgICAgICB7CisgICAgICAgIE91dHB1dENmZy5TZXRTb3VyY2UgPSBIUlRJTV9PVVRQVVRTRVRfVElNQ01QMTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgT3V0cHV0Q2ZnLlNldFNvdXJjZSA9IEhSVElNX09VVFBVVFNFVF9USU1DTVAyOworICAgICAgfQorICAgICAgT3V0cHV0Q2ZnLlJlc2V0U291cmNlID0gT3V0cHV0Q2ZnLlNldFNvdXJjZTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fQkFTSUNPQ01PREVfQUNUSVZFOgorICAgIHsKKyAgICAgIGlmIChDb21wYXJlVW5pdCA9PSBIUlRJTV9DT01QQVJFVU5JVF8xKQorICAgICAgeworICAgICAgICBPdXRwdXRDZmcuU2V0U291cmNlID0gSFJUSU1fT1VUUFVUU0VUX1RJTUNNUDE7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIE91dHB1dENmZy5TZXRTb3VyY2UgPSBIUlRJTV9PVVRQVVRTRVRfVElNQ01QMjsKKyAgICAgIH0KKyAgICAgIE91dHB1dENmZy5SZXNldFNvdXJjZSA9IEhSVElNX09VVFBVVFJFU0VUX05PTkU7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEhSVElNX0JBU0lDT0NNT0RFX0lOQUNUSVZFOgorICAgIHsKKyAgICAgIGlmIChDb21wYXJlVW5pdCA9PSBIUlRJTV9DT01QQVJFVU5JVF8xKQorICAgICAgeworICAgICAgICBPdXRwdXRDZmcuUmVzZXRTb3VyY2UgPSBIUlRJTV9PVVRQVVRSRVNFVF9USU1DTVAxOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBPdXRwdXRDZmcuUmVzZXRTb3VyY2UgPSBIUlRJTV9PVVRQVVRSRVNFVF9USU1DTVAyOworICAgICAgfQorICAgICAgT3V0cHV0Q2ZnLlNldFNvdXJjZSA9IEhSVElNX09VVFBVVFNFVF9OT05FOworICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorICAKKyAgSFJUSU1fT3V0cHV0Q29uZmlnKGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgIFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgT0NDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgJk91dHB1dENmZyk7ICAKKyAgCisgIC8qIFNldCBIUlRJTSBzdGF0ZSAqLworICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX1JFQURZOworICAKKyAgcmV0dXJuIEhBTF9PSzsgCit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBvdXRwdXQgY29tcGFyZSBzaWduYWwgZ2VuZXJhdGlvbiBvbiB0aGUgZGVzaWduZWQgdGltZXIgb3V0cHV0IAorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZXJJZHggVGltZXIgaW5kZXgKKyAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9BIGZvciB0aW1lciBBCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0IgZm9yIHRpbWVyIEIKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQyBmb3IgdGltZXIgQworICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9EIGZvciB0aW1lciBECisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0UgZm9yIHRpbWVyIEUKKyAgKiBAcGFyYW0gIE9DQ2hhbm5lbCBUaW1lciBvdXRwdXQKKyAgKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEExOiBUaW1lciBBIC0gT3V0cHV0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEEyOiBUaW1lciBBIC0gT3V0cHV0IDIKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEIxOiBUaW1lciBCIC0gT3V0cHV0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEIyOiBUaW1lciBCIC0gT3V0cHV0IDIKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEMxOiBUaW1lciBDIC0gT3V0cHV0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEMyOiBUaW1lciBDIC0gT3V0cHV0IDIKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEQxOiBUaW1lciBEIC0gT3V0cHV0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEQyOiBUaW1lciBEIC0gT3V0cHV0IDIKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEUxOiBUaW1lciBFIC0gT3V0cHV0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEUyOiBUaW1lciBFIC0gT3V0cHV0IDIKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9TaW1wbGVPQ1N0YXJ0KEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPQ0NoYW5uZWwpCit7CisgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNRVJfT1VUUFVUKFRpbWVySWR4LCBPQ0NoYW5uZWwpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhocnRpbSk7CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX0JVU1k7IAorICAKKyAgLyogRW5hYmxlIHRoZSB0aW1lciBvdXRwdXQgKi8KKyAgaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuT0VOUiB8PSBPQ0NoYW5uZWw7CisgICAgCisgIC8qIEVuYWJsZSB0aGUgdGltZXIgY291bnRlciAqLworICBfX0hBTF9IUlRJTV9FTkFCTEUoaGhydGltLCBUaW1lcklkeFRvVGltZXJJZFtUaW1lcklkeF0pOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9SRUFEWTsgCisgICAgICAgICAgICAgICAgICAKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGhydGltKTsgICAgICAKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIG91dHB1dCBjb21wYXJlIHNpZ25hbCBnZW5lcmF0aW9uIG9uIHRoZSBkZXNpZ25lZCB0aW1lciBvdXRwdXQgCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBUaW1lcklkeCBUaW1lciBpbmRleAorICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0EgZm9yIHRpbWVyIEEKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQiBmb3IgdGltZXIgQgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9DIGZvciB0aW1lciBDCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0QgZm9yIHRpbWVyIEQKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRSBmb3IgdGltZXIgRQorICAqIEBwYXJhbSAgT0NDaGFubmVsIFRpbWVyIG91dHB1dAorICAqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQTE6IFRpbWVyIEEgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQTI6IFRpbWVyIEEgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQjE6IFRpbWVyIEIgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQjI6IFRpbWVyIEIgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQzE6IFRpbWVyIEMgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQzI6IFRpbWVyIEMgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URDE6IFRpbWVyIEQgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URDI6IFRpbWVyIEQgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URTE6IFRpbWVyIEUgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URTI6IFRpbWVyIEUgLSBPdXRwdXQgMgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1NpbXBsZU9DU3RvcChIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE9DQ2hhbm5lbCkKK3sKKyAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9USU1FUl9PVVRQVVQoVGltZXJJZHgsIE9DQ2hhbm5lbCkpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGhydGltKTsKKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfQlVTWTsgCisgIAorICAvKiBEaXNhYmxlIHRoZSB0aW1lciBvdXRwdXQgKi8KKyAgaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuT0RJU1IgfD0gT0NDaGFubmVsOworICAgIAorICAvKiBEaXNhYmxlIHRoZSB0aW1lciBjb3VudGVyICovCisgIF9fSEFMX0hSVElNX0RJU0FCTEUoaGhydGltLCBUaW1lcklkeFRvVGltZXJJZFtUaW1lcklkeF0pOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9SRUFEWTsgCisgICAgICAgICAgICAgICAgICAKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGhydGltKTsgICAgICAKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBvdXRwdXQgY29tcGFyZSBzaWduYWwgZ2VuZXJhdGlvbiBvbiB0aGUgZGVzaWduZWQgdGltZXIgb3V0cHV0CisgICogICAgICAgICAoSW50ZXJydXB0IGlzIGVuYWJsZWQgKHNlZSBub3RlIG5vdGUgYmVsb3cpKS4KKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVySWR4IFRpbWVyIGluZGV4CisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICogQHBhcmFtICBPQ0NoYW5uZWwgVGltZXIgb3V0cHV0CisgICogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RBMTogVGltZXIgQSAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RBMjogVGltZXIgQSAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RCMTogVGltZXIgQiAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RCMjogVGltZXIgQiAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RDMTogVGltZXIgQyAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RDMjogVGltZXIgQyAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1REMTogVGltZXIgRCAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1REMjogVGltZXIgRCAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RFMTogVGltZXIgRSAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RFMjogVGltZXIgRSAtIE91dHB1dCAyCisgICogQG5vdGUgSW50ZXJydXB0IGVuYWJsaW5nIGRlcGVuZHMgb24gdGhlIGNob3NlbiBvdXRwdXQgY29tcGFyZSBtb2RlCisgICogICAgICAgICAgT3V0cHV0IHRvZ2dsZTogY29tcGFyZSBtYXRjaCBpbnRlcnJ1cHQgaXMgZW5hYmxlZAorICAqICAgICAgICAgIE91dHB1dCBzZXQgYWN0aXZlOiAgb3V0cHV0IHNldCBpbnRlcnJ1cHQgaXMgZW5hYmxlZAorICAqICAgICAgICAgIE91dHB1dCBzZXQgaW5hY3RpdmU6ICBvdXRwdXQgcmVzZXQgaW50ZXJydXB0IGlzIGVuYWJsZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9TaW1wbGVPQ1N0YXJ0X0lUKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPQ0NoYW5uZWwpCit7CisgIHVpbnQzMl90IGludGVycnVwdDsKKyAgCisgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNRVJfT1VUUFVUKFRpbWVySWR4LCBPQ0NoYW5uZWwpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhocnRpbSk7CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX0JVU1k7IAorICAKKyAgLyogR2V0IHRoZSBpbnRlcnJ1cHQgdG8gZW5hYmxlIChkZXBlbmRzIG9uIHRoZSBvdXRwdXQgY29tcGFyZSBtb2RlKSAqLworICBpbnRlcnJ1cHQgPSBIUlRJTV9HZXRJVEZyb21PQ01vZGUoaGhydGltLCBUaW1lcklkeCwgT0NDaGFubmVsKTsKKyAgCisgIC8qIEVuYWJsZSB0aGUgdGltZXIgb3V0cHV0ICovCisgIGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLk9FTlIgfD0gT0NDaGFubmVsOworICAgIAorICAvKiBFbmFibGUgdGhlIHRpbWVyIGludGVycnVwdCAoZGVwZW5kcyBvbiB0aGUgb3V0cHV0IGNvbXBhcmUgbW9kZSkgKi8KKyAgX19IQUxfSFJUSU1fVElNRVJfRU5BQkxFX0lUKGhocnRpbSwgVGltZXJJZHgsIGludGVycnVwdCk7CisgIAorICAvKiBFbmFibGUgdGhlIHRpbWVyIGNvdW50ZXIgKi8KKyAgX19IQUxfSFJUSU1fRU5BQkxFKGhocnRpbSwgVGltZXJJZHhUb1RpbWVySWRbVGltZXJJZHhdKTsKKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfUkVBRFk7IAorICAgICAgICAgICAgICAgICAgCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhocnRpbSk7ICAgICAgCisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBvdXRwdXQgY29tcGFyZSBzaWduYWwgZ2VuZXJhdGlvbiBvbiB0aGUgZGVzaWduZWQgdGltZXIgb3V0cHV0CisgICogICAgICAgICAoSW50ZXJydXB0IGlzIGRpc2FibGVkKS4KKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVySWR4IFRpbWVyIGluZGV4CisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICogQHBhcmFtICBPQ0NoYW5uZWwgVGltZXIgb3V0cHV0CisgICogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RBMTogVGltZXIgQSAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RBMjogVGltZXIgQSAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RCMTogVGltZXIgQiAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RCMjogVGltZXIgQiAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RDMTogVGltZXIgQyAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RDMjogVGltZXIgQyAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1REMTogVGltZXIgRCAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1REMjogVGltZXIgRCAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RFMTogVGltZXIgRSAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RFMjogVGltZXIgRSAtIE91dHB1dCAyCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fU2ltcGxlT0NTdG9wX0lUKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT0NDaGFubmVsKQoreworICB1aW50MzJfdCBpbnRlcnJ1cHQ7CisgIAorICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTUVSX09VVFBVVChUaW1lcklkeCwgT0NDaGFubmVsKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaHJ0aW0pOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9CVVNZOyAKKyAgCisgIC8qIERpc2FibGUgdGhlIHRpbWVyIG91dHB1dCAqLworICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5PRElTUiB8PSBPQ0NoYW5uZWw7CisgICAgCisgIC8qIEdldCB0aGUgaW50ZXJydXB0IHRvIGRpc2FibGUgKGRlcGVuZHMgb24gdGhlIG91dHB1dCBjb21wYXJlIG1vZGUpICovCisgIGludGVycnVwdCA9IEhSVElNX0dldElURnJvbU9DTW9kZShoaHJ0aW0sIFRpbWVySWR4LCBPQ0NoYW5uZWwpOworCisgIC8qIERpc2FibGUgdGhlIHRpbWVyIGludGVycnVwdCAqLworICBfX0hBTF9IUlRJTV9USU1FUl9ESVNBQkxFX0lUKGhocnRpbSwgVGltZXJJZHgsIGludGVycnVwdCk7CisgIAorICAvKiBEaXNhYmxlIHRoZSB0aW1lciBjb3VudGVyICovCisgIF9fSEFMX0hSVElNX0RJU0FCTEUoaGhydGltLCBUaW1lcklkeFRvVGltZXJJZFtUaW1lcklkeF0pOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9SRUFEWTsgCisgICAgICAgICAgICAgICAgICAKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGhydGltKTsgICAgICAKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBvdXRwdXQgY29tcGFyZSBzaWduYWwgZ2VuZXJhdGlvbiBvbiB0aGUgZGVzaWduZWQgdGltZXIgb3V0cHV0CisgICogICAgICAgICAoRE1BIHJlcXVlc3QgaXMgZW5hYmxlZCAoc2VlIG5vdGUgYmVsb3cpKS4KKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVySWR4IFRpbWVyIGluZGV4CisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICogQHBhcmFtICBPQ0NoYW5uZWwgVGltZXIgb3V0cHV0CisgICogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RBMTogVGltZXIgQSAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RBMjogVGltZXIgQSAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RCMTogVGltZXIgQiAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RCMjogVGltZXIgQiAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RDMTogVGltZXIgQyAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RDMjogVGltZXIgQyAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1REMTogVGltZXIgRCAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1REMjogVGltZXIgRCAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RFMTogVGltZXIgRSAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RFMjogVGltZXIgRSAtIE91dHB1dCAyCisgICogQHBhcmFtICBTcmNBZGRyIERNQSB0cmFuc2ZlciBzb3VyY2UgYWRkcmVzcworICAqIEBwYXJhbSAgRGVzdEFkZHIgRE1BIHRyYW5zZmVyIGRlc3RpbmF0aW9uIGFkZHJlc3MKKyAgKiBAcGFyYW0gIExlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgaXRlbXMgKGRhdGEgc2l6ZSkgdG8gYmUgdHJhbnNmZXJyZWQKKyAgKiAgICAgICAgICAgICAgICAgICAgIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uCisgICogQG5vdGUgIERNQSByZXF1ZXN0IGVuYWJsaW5nIGRlcGVuZHMgb24gdGhlIGNob3NlbiBvdXRwdXQgY29tcGFyZSBtb2RlCisgICogICAgICAgICAgT3V0cHV0IHRvZ2dsZTogY29tcGFyZSBtYXRjaCBETUEgcmVxdWVzdCBpcyBlbmFibGVkCisgICogICAgICAgICAgT3V0cHV0IHNldCBhY3RpdmU6ICBvdXRwdXQgc2V0IERNQSByZXF1ZXN0IGlzIGVuYWJsZWQKKyAgKiAgICAgICAgICBPdXRwdXQgc2V0IGluYWN0aXZlOiAgb3V0cHV0IHJlc2V0IERNQSByZXF1ZXN0IGlzIGVuYWJsZWQgCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fU2ltcGxlT0NTdGFydF9ETUEoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT0NDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU3JjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERlc3RBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTGVuZ3RoKQoreworICBETUFfSGFuZGxlVHlwZURlZiAqIGhkbWE7CisgIHVpbnQzMl90IGRtYV9yZXF1ZXN0OworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTUVSX09VVFBVVChUaW1lcklkeCwgT0NDaGFubmVsKSk7CisgIAorICBpZigoaGhydGltLT5TdGF0ZSA9PSBIQUxfSFJUSU1fU1RBVEVfQlVTWSkpCisgIHsKKyAgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisgIGlmKChoaHJ0aW0tPlN0YXRlID09IEhBTF9IUlRJTV9TVEFURV9SRUFEWSkpCisgIHsKKyAgICBpZigoU3JjQWRkciA9PSAwVSApIHx8IChEZXN0QWRkciA9PSAwVSApIHx8IChMZW5ndGggPT0gMFUpKSAKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9CVVNZOworICAgIH0KKyAgfQorICAKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaHJ0aW0pOworIAorICAgLyogRW5hYmxlIHRoZSB0aW1lciBvdXRwdXQgKi8KKyAgaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuT0VOUiB8PSBPQ0NoYW5uZWw7CisKKyAgLyogR2V0IHRoZSBETUEgcmVxdWVzdCB0byBlbmFibGUgKi8KKyAgZG1hX3JlcXVlc3QgPSBIUlRJTV9HZXRETUFGcm9tT0NNb2RlKGhocnRpbSwgVGltZXJJZHgsIE9DQ2hhbm5lbCk7CisgIAorICAvKiBHZXQgdGhlIHRpbWVyIERNQSBoYW5kbGVyICovCisgIGhkbWEgPSBIUlRJTV9HZXRETUFIYW5kbGVGcm9tVGltZXJJZHgoaGhydGltLCBUaW1lcklkeCk7CisKKyAgaWYgKGhkbWEgPT0gTlVMTCkKKyAgeworICAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9FUlJPUjsKKyAgIAorICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgX19IQUxfVU5MT0NLKGhocnRpbSk7CisgICAKKyAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICBoZG1hLT5YZmVyRXJyb3JDYWxsYmFjayA9IEhSVElNX0RNQUVycm9yIDsKKyAgCisgIC8qIFNldCB0aGUgRE1BIHRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayAqLworICBoZG1hLT5YZmVyQ3BsdENhbGxiYWNrID0gSFJUSU1fRE1BVGltZXJ4Q3BsdDsKKyAgCisgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgSEFMX0RNQV9TdGFydF9JVChoZG1hLCBTcmNBZGRyLCBEZXN0QWRkciwgTGVuZ3RoKTsKKyAgCisgIC8qIEVuYWJsZSB0aGUgdGltZXIgRE1BIHJlcXVlc3QgKi8KKyAgX19IQUxfSFJUSU1fVElNRVJfRU5BQkxFX0RNQShoaHJ0aW0sIFRpbWVySWR4LCBkbWFfcmVxdWVzdCk7CisgICAgCisgIC8qIEVuYWJsZSB0aGUgdGltZXIgY291bnRlciAqLworICBfX0hBTF9IUlRJTV9FTkFCTEUoaGhydGltLCBUaW1lcklkeFRvVGltZXJJZFtUaW1lcklkeF0pOworCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfUkVBRFk7IAorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhocnRpbSk7ICAKKyAKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgb3V0cHV0IGNvbXBhcmUgc2lnbmFsIGdlbmVyYXRpb24gb24gdGhlIGRlc2lnbmVkIHRpbWVyIG91dHB1dAorICAqICAgICAgICAgKERNQSByZXF1ZXN0IGlzIGRpc2FibGVkKS4KKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVySWR4IFRpbWVyIGluZGV4CisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICogQHBhcmFtICBPQ0NoYW5uZWwgVGltZXIgb3V0cHV0CisgICogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RBMTogVGltZXIgQSAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RBMjogVGltZXIgQSAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RCMTogVGltZXIgQiAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RCMjogVGltZXIgQiAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RDMTogVGltZXIgQyAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RDMjogVGltZXIgQyAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1REMTogVGltZXIgRCAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1REMjogVGltZXIgRCAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RFMTogVGltZXIgRSAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RFMjogVGltZXIgRSAtIE91dHB1dCAyCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fU2ltcGxlT0NTdG9wX0RNQShIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT0NDaGFubmVsKQoreworICBETUFfSGFuZGxlVHlwZURlZiAqIGhkbWE7CisgIHVpbnQzMl90IGRtYV9yZXF1ZXN0OworIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNRVJfT1VUUFVUKFRpbWVySWR4LCBPQ0NoYW5uZWwpKTsKKyAgICAKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaHJ0aW0pOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9CVVNZOyAKKworICAvKiBEaXNhYmxlIHRoZSB0aW1lciBvdXRwdXQgKi8KKyAgaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuT0RJU1IgfD0gT0NDaGFubmVsOworICAgIAorICAvKiBHZXQgdGhlIHRpbWVyIERNQSBoYW5kbGVyICovCisgIGhkbWEgPSBIUlRJTV9HZXRETUFIYW5kbGVGcm9tVGltZXJJZHgoaGhydGltLCBUaW1lcklkeCk7CisgIAorICBpZiAoaGRtYSA9PSBOVUxMKQorICB7CisgICAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9FUlJPUjsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGhydGltKTsgCisgICAKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogRGlzYWJsZSB0aGUgRE1BICovCisgIEhBTF9ETUFfQWJvcnQoaGRtYSk7CisgIAorICAvKiBHZXQgdGhlIERNQSByZXF1ZXN0IHRvIGRpc2FibGUgKi8KKyAgZG1hX3JlcXVlc3QgPSBIUlRJTV9HZXRETUFGcm9tT0NNb2RlKGhocnRpbSwgVGltZXJJZHgsIE9DQ2hhbm5lbCk7CisKKyAgLyogRGlzYWJsZSB0aGUgdGltZXIgRE1BIHJlcXVlc3QgKi8KKyAgX19IQUxfSFJUSU1fVElNRVJfRElTQUJMRV9ETUEoaGhydGltLCBUaW1lcklkeCwgZG1hX3JlcXVlc3QpOworICAKKyAgLyogRGlzYWJsZSB0aGUgdGltZXIgY291bnRlciAqLworICBfX0hBTF9IUlRJTV9ESVNBQkxFKGhocnRpbSwgVGltZXJJZHhUb1RpbWVySWRbVGltZXJJZHhdKTsKKworICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX1JFQURZOyAKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaHJ0aW0pOyAgICAgIAorICAKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIUlRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFNpbXBsZSBQV00gb3V0cHV0IG1vZGUgZnVuY3Rpb25zICAKKyAqICBAYnJpZWYgICAgU2ltcGxlIFBXTSBvdXRwdXQgZnVuY3Rpb25zCitAdmVyYmF0aW0gICAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBTaW1wbGUgUFdNIG91dHB1dCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBDb25maWd1cmUgc2ltcGxlIFBXTSBvdXRwdXQgY2hhbm5lbCAKKyAgICAgICgrKSBTdGFydCBzaW1wbGUgUFdNIG91dHB1dCAKKyAgICAgICgrKSBTdG9wIHNpbXBsZSBQV00gb3V0cHV0IAorICAgICAgKCspIFN0YXJ0IHNpbXBsZSBQV00gb3V0cHV0IGFuZCBlbmFibGUgaW50ZXJydXB0IAorICAgICAgKCspIFN0b3Agc2ltcGxlIFBXTSBvdXRwdXQgYW5kIGRpc2FibGUgaW50ZXJydXB0IAorICAgICAgKCspIFN0YXJ0IHNpbXBsZSBQV00gb3V0cHV0IGFuZCBlbmFibGUgRE1BIHRyYW5zZmVyIAorICAgICAgKCspIFN0b3Agc2ltcGxlIFBXTSBvdXRwdXQgYW5kIGRpc2FibGUgRE1BIHRyYW5zZmVyIAorICAgICAgLUAtIFdoZW4gYSBIUlRJTSB0aW1lciBvcGVyYXRlcyBpbiBzaW1wbGUgUFdNIG91dHB1dCBtb2RlIAorICAgICAgICAgIHRoZSBvdXRwdXQgbGV2ZWwgaXMgc2V0IHRvIGEgcHJvZ3JhbW1hYmxlIHZhbHVlIHdoZW4gYSBtYXRjaCBpcworICAgICAgICAgIGZvdW5kIGJldHdlZW4gdGhlIGNvbXBhcmUgcmVnaXN0ZXIgYW5kIHRoZSBjb3VudGVyIGFuZCByZXNldCB3aGVuCisgICAgICAgICAgdGhlIHRpbWVyIHBlcmlvZCBpcyByZWFjaGVkLiBEdXR5IGN5Y2xlIGlzIGRldGVybWluZWQgYnkgdGhlIAorICAgICAgICAgIGNvbXBhcmlzb24gdmFsdWUuCisgICAgICAgICAgQ29tcGFyZSB1bml0IDEgaXMgYXV0b21hdGljYWxseSBhc3NvY2lhdGVkIHRvIG91dHB1dCAxCisgICAgICAgICAgQ29tcGFyZSB1bml0IDIgaXMgYXV0b21hdGljYWxseSBhc3NvY2lhdGVkIHRvIG91dHB1dCAyCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgYW4gb3V0cHV0IGluIHNpbXBsZSBQV00gbW9kZSAKKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVySWR4IFRpbWVyIGluZGV4CisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICogQHBhcmFtICBQV01DaGFubmVsIFRpbWVyIG91dHB1dAorICAqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQTE6IFRpbWVyIEEgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQTI6IFRpbWVyIEEgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQjE6IFRpbWVyIEIgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQjI6IFRpbWVyIEIgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQzE6IFRpbWVyIEMgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQzI6IFRpbWVyIEMgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URDE6IFRpbWVyIEQgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URDI6IFRpbWVyIEQgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URTE6IFRpbWVyIEUgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URTI6IFRpbWVyIEUgLSBPdXRwdXQgMiAKKyAgKiBAcGFyYW0gIHBTaW1wbGVQV01DaGFubmVsQ2ZnIHBvaW50ZXIgdG8gdGhlIHNpbXBsZSBQV00gb3V0cHV0IGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgICogQG5vdGUgV2hlbiB0aGUgdGltZXIgb3BlcmF0ZXMgaW4gc2ltcGxlIFBXTSBvdXRwdXQgbW9kZToKKyAgKiAgICAgICAgIE91dHB1dCAxIGlzIGltcGxpY2l0bHkgY29udHJvbGxlZCBieSB0aGUgY29tcGFyZSB1bml0IDEKKyAgKiAgICAgICAgIE91dHB1dCAyIGlzIGltcGxpY2l0bHkgY29udHJvbGxlZCBieSB0aGUgY29tcGFyZSB1bml0IDIKKyAgKiAgICAgICBPdXRwdXQgU2V0L1Jlc2V0IGNyb3NzYmFyIGlzIHNldCBhcyBmb2xsb3dzOgorICAqICAgICAgICAgT3V0cHV0IDE6IFNFVHgxUiA9IENNUDEsIFJTVHgxUiA9IFBFUgorICAqICAgICAgICAgT3V0cHV0IDI6IFNFVHgyUiA9IENNUDIsIFJTVDJSID0gUEVSCisgICogQG5vdGUgV2hlbiBTaW1wbGUgUFdNIG1vZGUgaXMgdXNlZCB0aGUgcmVnaXN0ZXJzIHByZWxvYWQgbWVjaGFuaXNtIGlzIAorICAqICAgICAgIGVuYWJsZWQgKG90aGVyd2lzZSB0aGUgYmVoYXZpb3IgaXMgbm90IGd1YXJhbnRlZWQpLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1NpbXBsZVBXTUNoYW5uZWxDb25maWcoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBXTUNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX1NpbXBsZVBXTUNoYW5uZWxDZmdUeXBlRGVmKiBwU2ltcGxlUFdNQ2hhbm5lbENmZykKK3sKKyAgdWludDMyX3QgQ29tcGFyZVVuaXQgPSAweEZGRkZGRkZGVTsKKyAgSFJUSU1fQ29tcGFyZUNmZ1R5cGVEZWYgQ29tcGFyZUNmZzsKKyAgSFJUSU1fT3V0cHV0Q2ZnVHlwZURlZiBPdXRwdXRDZmc7CisgIHVpbnQzMl90IGhydGltX3RpbWNyOworCisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTUVSX09VVFBVVChUaW1lcklkeCwgUFdNQ2hhbm5lbCkpOworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fT1VUUFVUUE9MQVJJVFkocFNpbXBsZVBXTUNoYW5uZWxDZmctPlBvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9PVVRQVVRJRExFTEVWRUwocFNpbXBsZVBXTUNoYW5uZWxDZmctPklkbGVMZXZlbCkpOworICAKKyAgaWYoaGhydGltLT5TdGF0ZSA9PSBIQUxfSFJUSU1fU1RBVEVfQlVTWSkKKyAgeworICAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhocnRpbSk7CisKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9CVVNZOworCisgIC8qIENvbmZpZ3VyZSB0aW1lciBjb21wYXJlIHVuaXQgKi8gIAorICBzd2l0Y2ggKFBXTUNoYW5uZWwpCisgIHsKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEExOgorICBjYXNlIEhSVElNX09VVFBVVF9UQjE6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RDMToKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEQxOgorICBjYXNlIEhSVElNX09VVFBVVF9URTE6CisgICAgeworICAgICAgQ29tcGFyZVVuaXQgPSBIUlRJTV9DT01QQVJFVU5JVF8xOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEEyOgorICBjYXNlIEhSVElNX09VVFBVVF9UQjI6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RDMjoKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEQyOgorICBjYXNlIEhSVElNX09VVFBVVF9URTI6CisgICAgeworICAgICAgQ29tcGFyZVVuaXQgPSBIUlRJTV9DT01QQVJFVU5JVF8yOworICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorICAKKyAgQ29tcGFyZUNmZy5Db21wYXJlVmFsdWUgPSBwU2ltcGxlUFdNQ2hhbm5lbENmZy0+UHVsc2U7CisgIENvbXBhcmVDZmcuQXV0b0RlbGF5ZWRNb2RlID0gSFJUSU1fQVVUT0RFTEFZRURNT0RFX1JFR1VMQVI7CisgIENvbXBhcmVDZmcuQXV0b0RlbGF5ZWRUaW1lb3V0ID0gMFU7CisgIAorICBIUlRJTV9Db21wYXJlVW5pdENvbmZpZyhoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wYXJlVW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvbXBhcmVDZmcpOworICAKKyAgLyogQ29uZmlndXJlIHRpbWVyIG91dHB1dCAqLworICBPdXRwdXRDZmcuUG9sYXJpdHkgPSBwU2ltcGxlUFdNQ2hhbm5lbENmZy0+UG9sYXJpdHk7CisgIE91dHB1dENmZy5JZGxlTGV2ZWwgPSBwU2ltcGxlUFdNQ2hhbm5lbENmZy0+SWRsZUxldmVsOworICBPdXRwdXRDZmcuRmF1bHRMZXZlbCA9IEhSVElNX09VVFBVVEZBVUxUTEVWRUxfTk9ORTsKKyAgT3V0cHV0Q2ZnLklkbGVNb2RlID0gSFJUSU1fT1VUUFVUSURMRU1PREVfTk9ORTsKKyAgT3V0cHV0Q2ZnLkNob3BwZXJNb2RlRW5hYmxlID0gSFJUSU1fT1VUUFVUQ0hPUFBFUk1PREVfRElTQUJMRUQ7CisgIE91dHB1dENmZy5CdXJzdE1vZGVFbnRyeURlbGF5ZWQgPSBIUlRJTV9PVVRQVVRCVVJTVE1PREVFTlRSWV9SRUdVTEFSOworCisgIGlmIChDb21wYXJlVW5pdCA9PSBIUlRJTV9DT01QQVJFVU5JVF8xKQorICB7CisgICAgT3V0cHV0Q2ZnLlNldFNvdXJjZSA9IEhSVElNX09VVFBVVFNFVF9USU1DTVAxOworICB9CisgIGVsc2UKKyAgeworICAgIE91dHB1dENmZy5TZXRTb3VyY2UgPSBIUlRJTV9PVVRQVVRTRVRfVElNQ01QMjsKKyAgfQorICBPdXRwdXRDZmcuUmVzZXRTb3VyY2UgPSBIUlRJTV9PVVRQVVRTRVRfVElNUEVSOworICAKKyAgSFJUSU1fT3V0cHV0Q29uZmlnKGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgIFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgUFdNQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICZPdXRwdXRDZmcpOworICAKKyAgLyogRW5hYmxlIHRoZSByZWdpc3RlcnMgcHJlbG9hZCBtZWNoYW5pc20gKi8KKyAgaHJ0aW1fdGltY3IgICA9IGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5USU14Q1I7CisgIGhydGltX3RpbWNyIHw9IEhSVElNX1RJTUNSX1BSRUVOOworICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uVElNeENSICA9IGhydGltX3RpbWNyOyAgCisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX1JFQURZOworICAKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGhydGltKTsgIAorCisgIHJldHVybiBIQUxfT0s7IAorfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgUFdNIG91dHB1dCBzaWduYWwgZ2VuZXJhdGlvbiBvbiB0aGUgZGVzaWduZWQgdGltZXIgb3V0cHV0CisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBUaW1lcklkeCBUaW1lciBpbmRleAorICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0EgZm9yIHRpbWVyIEEKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQiBmb3IgdGltZXIgQgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9DIGZvciB0aW1lciBDCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0QgZm9yIHRpbWVyIEQKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRSBmb3IgdGltZXIgRQorICAqIEBwYXJhbSAgUFdNQ2hhbm5lbCBUaW1lciBvdXRwdXQKKyAgKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEExOiBUaW1lciBBIC0gT3V0cHV0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEEyOiBUaW1lciBBIC0gT3V0cHV0IDIKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEIxOiBUaW1lciBCIC0gT3V0cHV0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEIyOiBUaW1lciBCIC0gT3V0cHV0IDIKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEMxOiBUaW1lciBDIC0gT3V0cHV0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEMyOiBUaW1lciBDIC0gT3V0cHV0IDIKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEQxOiBUaW1lciBEIC0gT3V0cHV0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEQyOiBUaW1lciBEIC0gT3V0cHV0IDIKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEUxOiBUaW1lciBFIC0gT3V0cHV0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEUyOiBUaW1lciBFIC0gT3V0cHV0IDIKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9TaW1wbGVQV01TdGFydChIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQV01DaGFubmVsKQoreworICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTUVSX09VVFBVVChUaW1lcklkeCwgUFdNQ2hhbm5lbCkpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGhydGltKTsKKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfQlVTWTsgCisgIAorICAvKiBFbmFibGUgdGhlIHRpbWVyIG91dHB1dCAqLworICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5PRU5SIHw9IFBXTUNoYW5uZWw7CisgICAgCisgIC8qIEVuYWJsZSB0aGUgdGltZXIgY291bnRlciAqLworICBfX0hBTF9IUlRJTV9FTkFCTEUoaGhydGltLCBUaW1lcklkeFRvVGltZXJJZFtUaW1lcklkeF0pOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9SRUFEWTsgCisgICAgICAgICAgICAgICAgICAKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGhydGltKTsgICAgICAKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFBXTSBvdXRwdXQgc2lnbmFsIGdlbmVyYXRpb24gb24gdGhlIGRlc2lnbmVkIHRpbWVyIG91dHB1dAorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZXJJZHggVGltZXIgaW5kZXgKKyAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9BIGZvciB0aW1lciBBCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0IgZm9yIHRpbWVyIEIKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQyBmb3IgdGltZXIgQworICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9EIGZvciB0aW1lciBECisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0UgZm9yIHRpbWVyIEUKKyAgKiBAcGFyYW0gIFBXTUNoYW5uZWwgVGltZXIgb3V0cHV0CisgICogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RBMTogVGltZXIgQSAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RBMjogVGltZXIgQSAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RCMTogVGltZXIgQiAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RCMjogVGltZXIgQiAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RDMTogVGltZXIgQyAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RDMjogVGltZXIgQyAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1REMTogVGltZXIgRCAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1REMjogVGltZXIgRCAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RFMTogVGltZXIgRSAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RFMjogVGltZXIgRSAtIE91dHB1dCAyCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fU2ltcGxlUFdNU3RvcChIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUFdNQ2hhbm5lbCkKK3sKKyAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9USU1FUl9PVVRQVVQoVGltZXJJZHgsIFBXTUNoYW5uZWwpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhocnRpbSk7CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX0JVU1k7IAorICAKKyAgLyogRGlzYWJsZSB0aGUgdGltZXIgb3V0cHV0ICovCisgIGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLk9ESVNSIHw9IFBXTUNoYW5uZWw7CisgICAgCisgIC8qIERpc2FibGUgdGhlIHRpbWVyIGNvdW50ZXIgKi8KKyAgX19IQUxfSFJUSU1fRElTQUJMRShoaHJ0aW0sIFRpbWVySWR4VG9UaW1lcklkW1RpbWVySWR4XSk7CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX1JFQURZOyAKKyAgICAgICAgICAgICAgICAgIAorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaHJ0aW0pOyAgICAgIAorICAKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFBXTSBvdXRwdXQgc2lnbmFsIGdlbmVyYXRpb24gb24gdGhlIGRlc2lnbmVkIHRpbWVyIG91dHB1dAorICAqICAgICAgICAgKFRoZSBjb21wYXJlIGludGVycnVwdCBpcyBlbmFibGVkKS4KKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVySWR4IFRpbWVyIGluZGV4CisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICogQHBhcmFtICBQV01DaGFubmVsIFRpbWVyIG91dHB1dAorICAqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQTE6IFRpbWVyIEEgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQTI6IFRpbWVyIEEgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQjE6IFRpbWVyIEIgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQjI6IFRpbWVyIEIgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQzE6IFRpbWVyIEMgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQzI6IFRpbWVyIEMgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URDE6IFRpbWVyIEQgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URDI6IFRpbWVyIEQgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URTE6IFRpbWVyIEUgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URTI6IFRpbWVyIEUgLSBPdXRwdXQgMgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1NpbXBsZVBXTVN0YXJ0X0lUKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBXTUNoYW5uZWwpCit7CisgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNRVJfT1VUUFVUKFRpbWVySWR4LCBQV01DaGFubmVsKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaHJ0aW0pOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9CVVNZOyAKKyAgCisgIC8qIEVuYWJsZSB0aGUgdGltZXIgb3V0cHV0ICovCisgIGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLk9FTlIgfD0gUFdNQ2hhbm5lbDsKKworICAvKiBFbmFibGUgdGhlIHRpbWVyIGludGVycnVwdCAoZGVwZW5kcyBvbiB0aGUgUFdNIG91dHB1dCkgKi8KKyAgc3dpdGNoIChQV01DaGFubmVsKQorICB7CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RBMToKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEIxOgorICBjYXNlIEhSVElNX09VVFBVVF9UQzE6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1REMToKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEUxOgorICAgIHsKKyAgICAgIF9fSEFMX0hSVElNX1RJTUVSX0VOQUJMRV9JVChoaHJ0aW0sIFRpbWVySWR4LCBIUlRJTV9USU1fSVRfQ01QMSk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEhSVElNX09VVFBVVF9UQTI6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RCMjoKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEMyOgorICBjYXNlIEhSVElNX09VVFBVVF9URDI6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RFMjoKKyAgICB7CisgICAgICBfX0hBTF9IUlRJTV9USU1FUl9FTkFCTEVfSVQoaGhydGltLCBUaW1lcklkeCwgSFJUSU1fVElNX0lUX0NNUDIpOworICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorICAKKyAgLyogRW5hYmxlIHRoZSB0aW1lciBjb3VudGVyICovCisgIF9fSEFMX0hSVElNX0VOQUJMRShoaHJ0aW0sIFRpbWVySWR4VG9UaW1lcklkW1RpbWVySWR4XSk7CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX1JFQURZOyAKKyAgICAgICAgICAgICAgICAgIAorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaHJ0aW0pOyAgICAgIAorICAKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgUFdNIG91dHB1dCBzaWduYWwgZ2VuZXJhdGlvbiBvbiB0aGUgZGVzaWduZWQgdGltZXIgb3V0cHV0CisgICogICAgICAgICAoVGhlIGNvbXBhcmUgaW50ZXJydXB0IGlzIGRpc2FibGVkKS4KKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVySWR4IFRpbWVyIGluZGV4CisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICogQHBhcmFtICBQV01DaGFubmVsIFRpbWVyIG91dHB1dAorICAqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQTE6IFRpbWVyIEEgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQTI6IFRpbWVyIEEgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQjE6IFRpbWVyIEIgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQjI6IFRpbWVyIEIgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQzE6IFRpbWVyIEMgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQzI6IFRpbWVyIEMgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URDE6IFRpbWVyIEQgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URDI6IFRpbWVyIEQgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URTE6IFRpbWVyIEUgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URTI6IFRpbWVyIEUgLSBPdXRwdXQgMgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1NpbXBsZVBXTVN0b3BfSVQoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBXTUNoYW5uZWwpCit7CisgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNRVJfT1VUUFVUKFRpbWVySWR4LCBQV01DaGFubmVsKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaHJ0aW0pOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9CVVNZOyAKKyAgCisgIC8qIERpc2FibGUgdGhlIHRpbWVyIG91dHB1dCAqLworICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5PRElTUiB8PSBQV01DaGFubmVsOworICAgIAorICAvKiBEaXNhYmxlIHRoZSB0aW1lciBpbnRlcnJ1cHQgKGRlcGVuZHMgb24gdGhlIFBXTSBvdXRwdXQpICovCisgIHN3aXRjaCAoUFdNQ2hhbm5lbCkKKyAgeworICBjYXNlIEhSVElNX09VVFBVVF9UQTE6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RCMToKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEMxOgorICBjYXNlIEhSVElNX09VVFBVVF9URDE6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RFMToKKyAgICB7CisgICAgICBfX0hBTF9IUlRJTV9USU1FUl9ESVNBQkxFX0lUKGhocnRpbSwgVGltZXJJZHgsIEhSVElNX1RJTV9JVF9DTVAxKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RBMjoKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEIyOgorICBjYXNlIEhSVElNX09VVFBVVF9UQzI6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1REMjoKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEUyOgorICAgIHsKKyAgICAgIF9fSEFMX0hSVElNX1RJTUVSX0RJU0FCTEVfSVQoaGhydGltLCBUaW1lcklkeCwgSFJUSU1fVElNX0lUX0NNUDIpOworICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorICAKKyAgLyogRGlzYWJsZSB0aGUgdGltZXIgY291bnRlciAqLworICBfX0hBTF9IUlRJTV9ESVNBQkxFKGhocnRpbSwgVGltZXJJZHhUb1RpbWVySWRbVGltZXJJZHhdKTsKKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfUkVBRFk7IAorICAgICAgICAgICAgICAgICAgCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhocnRpbSk7ICAgICAgCisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgUFdNIG91dHB1dCBzaWduYWwgZ2VuZXJhdGlvbiBvbiB0aGUgZGVzaWduZWQgdGltZXIgb3V0cHV0CisgICogICAgICAgICAoVGhlIGNvbXBhcmUgRE1BIHJlcXVlc3QgaXMgZW5hYmxlZCkuCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBUaW1lcklkeCBUaW1lciBpbmRleAorICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0EgZm9yIHRpbWVyIEEKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQiBmb3IgdGltZXIgQgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9DIGZvciB0aW1lciBDCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0QgZm9yIHRpbWVyIEQKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRSBmb3IgdGltZXIgRQorICAqIEBwYXJhbSAgUFdNQ2hhbm5lbCBUaW1lciBvdXRwdXQKKyAgKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEExOiBUaW1lciBBIC0gT3V0cHV0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEEyOiBUaW1lciBBIC0gT3V0cHV0IDIKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEIxOiBUaW1lciBCIC0gT3V0cHV0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEIyOiBUaW1lciBCIC0gT3V0cHV0IDIKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEMxOiBUaW1lciBDIC0gT3V0cHV0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEMyOiBUaW1lciBDIC0gT3V0cHV0IDIKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEQxOiBUaW1lciBEIC0gT3V0cHV0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEQyOiBUaW1lciBEIC0gT3V0cHV0IDIKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEUxOiBUaW1lciBFIC0gT3V0cHV0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEUyOiBUaW1lciBFIC0gT3V0cHV0IDIKKyAgKiBAcGFyYW0gIFNyY0FkZHIgRE1BIHRyYW5zZmVyIHNvdXJjZSBhZGRyZXNzCisgICogQHBhcmFtICBEZXN0QWRkciBETUEgdHJhbnNmZXIgZGVzdGluYXRpb24gYWRkcmVzcworICAqIEBwYXJhbSAgTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSBpdGVtcyAoZGF0YSBzaXplKSB0byBiZSB0cmFuc2ZlcnJlZAorICAqICAgICAgICAgICAgICAgICAgICAgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9TaW1wbGVQV01TdGFydF9ETUEoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQV01DaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNyY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRGVzdEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTGVuZ3RoKQoreworICBETUFfSGFuZGxlVHlwZURlZiAqIGhkbWE7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTUVSX09VVFBVVChUaW1lcklkeCwgUFdNQ2hhbm5lbCkpOworICAKKyAgaWYoKGhocnRpbS0+U3RhdGUgPT0gSEFMX0hSVElNX1NUQVRFX0JVU1kpKQorICB7CisgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorICBpZigoaGhydGltLT5TdGF0ZSA9PSBIQUxfSFJUSU1fU1RBVEVfUkVBRFkpKQorICB7CisgICAgaWYoKFNyY0FkZHIgPT0gMFUgKSB8fCAoRGVzdEFkZHIgPT0gMFUgKSB8fCAoTGVuZ3RoID09IDBVKSkgCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfQlVTWTsKKyAgICB9CisgIH0KKyAgCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGhydGltKTsKKyAgCisgIC8qIEVuYWJsZSB0aGUgdGltZXIgb3V0cHV0ICovCisgIGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLk9FTlIgfD0gUFdNQ2hhbm5lbDsKKyAgCisgIC8qIEdldCB0aGUgdGltZXIgRE1BIGhhbmRsZXIgKi8KKyAgaGRtYSA9IEhSVElNX0dldERNQUhhbmRsZUZyb21UaW1lcklkeChoaHJ0aW0sIFRpbWVySWR4KTsKKworICBpZiAoaGRtYSA9PSBOVUxMKQorICB7CisgICAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9FUlJPUjsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGhydGltKTsgCisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgaGRtYS0+WGZlckVycm9yQ2FsbGJhY2sgPSBIUlRJTV9ETUFFcnJvciA7CisgIAorICAvKiBTZXQgdGhlIERNQSB0cmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgKi8KKyAgaGRtYS0+WGZlckNwbHRDYWxsYmFjayA9IEhSVElNX0RNQVRpbWVyeENwbHQ7CisgIAorICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgIEhBTF9ETUFfU3RhcnRfSVQoaGRtYSwgU3JjQWRkciwgRGVzdEFkZHIsIExlbmd0aCk7CisgIAorICAvKiBFbmFibGUgdGhlIHRpbWVyIERNQSByZXF1ZXN0ICovCisgIHN3aXRjaCAoUFdNQ2hhbm5lbCkKKyAgeworICBjYXNlIEhSVElNX09VVFBVVF9UQTE6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RCMToKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEMxOgorICBjYXNlIEhSVElNX09VVFBVVF9URDE6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RFMToKKyAgICB7CisgICAgICBfX0hBTF9IUlRJTV9USU1FUl9FTkFCTEVfRE1BKGhocnRpbSwgVGltZXJJZHgsIEhSVElNX1RJTV9ETUFfQ01QMSk7ICAgICAgCisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEhSVElNX09VVFBVVF9UQTI6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RCMjoKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEMyOgorICBjYXNlIEhSVElNX09VVFBVVF9URDI6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RFMjoKKyAgICB7CisgICAgICBfX0hBTF9IUlRJTV9USU1FUl9FTkFCTEVfRE1BKGhocnRpbSwgVGltZXJJZHgsIEhSVElNX1RJTV9ETUFfQ01QMik7ICAgICAgCisgICAgfQorICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9CisgICAKKyAgLyogRW5hYmxlIHRoZSB0aW1lciBjb3VudGVyICovCisgIF9fSEFMX0hSVElNX0VOQUJMRShoaHJ0aW0sIFRpbWVySWR4VG9UaW1lcklkW1RpbWVySWR4XSk7CisKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9SRUFEWTsgCisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGhydGltKTsgIAorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFBXTSBvdXRwdXQgc2lnbmFsIGdlbmVyYXRpb24gb24gdGhlIGRlc2lnbmVkIHRpbWVyIG91dHB1dAorICAqICAgICAgICAgKFRoZSBjb21wYXJlIERNQSByZXF1ZXN0IGlzIGRpc2FibGVkKS4KKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVySWR4IFRpbWVyIGluZGV4CisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICogQHBhcmFtICBQV01DaGFubmVsIFRpbWVyIG91dHB1dAorICAqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQTE6IFRpbWVyIEEgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQTI6IFRpbWVyIEEgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQjE6IFRpbWVyIEIgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQjI6IFRpbWVyIEIgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQzE6IFRpbWVyIEMgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQzI6IFRpbWVyIEMgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URDE6IFRpbWVyIEQgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URDI6IFRpbWVyIEQgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URTE6IFRpbWVyIEUgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URTI6IFRpbWVyIEUgLSBPdXRwdXQgMgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1NpbXBsZVBXTVN0b3BfRE1BKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBXTUNoYW5uZWwpCit7CisgIERNQV9IYW5kbGVUeXBlRGVmICogaGRtYTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNRVJfT1VUUFVUKFRpbWVySWR4LCBQV01DaGFubmVsKSk7CisgICAgCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGhydGltKTsKKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfQlVTWTsgCisKKyAgLyogRGlzYWJsZSB0aGUgdGltZXIgb3V0cHV0ICovCisgIGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLk9ESVNSIHw9IFBXTUNoYW5uZWw7CisgICAgCisgIC8qIEdldCB0aGUgdGltZXIgRE1BIGhhbmRsZXIgKi8KKyAgaGRtYSA9IEhSVElNX0dldERNQUhhbmRsZUZyb21UaW1lcklkeChoaHJ0aW0sIFRpbWVySWR4KTsKKyAgCisgIGlmIChoZG1hID09IE5VTEwpCisgIHsKKyAgICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX0VSUk9SOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaHJ0aW0pOyAKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBETUEgKi8KKyAgSEFMX0RNQV9BYm9ydChoZG1hKTsKKyAgCisgIC8qIERpc2FibGUgdGhlIHRpbWVyIERNQSByZXF1ZXN0ICovCisgIHN3aXRjaCAoUFdNQ2hhbm5lbCkKKyAgeworICBjYXNlIEhSVElNX09VVFBVVF9UQTE6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RCMToKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEMxOgorICBjYXNlIEhSVElNX09VVFBVVF9URDE6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RFMToKKyAgICB7CisgICAgICBfX0hBTF9IUlRJTV9USU1FUl9ESVNBQkxFX0RNQShoaHJ0aW0sIFRpbWVySWR4LCBIUlRJTV9USU1fRE1BX0NNUDEpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEEyOgorICBjYXNlIEhSVElNX09VVFBVVF9UQjI6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RDMjoKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEQyOgorICBjYXNlIEhSVElNX09VVFBVVF9URTI6CisgICAgeworICAgICAgX19IQUxfSFJUSU1fVElNRVJfRElTQUJMRV9ETUEoaGhydGltLCBUaW1lcklkeCwgSFJUSU1fVElNX0RNQV9DTVAyKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KKyAgCisgIC8qIERpc2FibGUgdGhlIHRpbWVyIGNvdW50ZXIgKi8KKyAgX19IQUxfSFJUSU1fRElTQUJMRShoaHJ0aW0sIFRpbWVySWR4VG9UaW1lcklkW1RpbWVySWR4XSk7CisKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9SRUFEWTsgCisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGhydGltKTsgICAgICAKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNSBTaW1wbGUgaW5wdXQgY2FwdHVyZSBmdW5jdGlvbnMgIAorICogIEBicmllZiAgICBTaW1wbGUgaW5wdXQgY2FwdHVyZSBmdW5jdGlvbnMKK0B2ZXJiYXRpbSAgICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIFNpbXBsZSBpbnB1dCBjYXB0dXJlIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIENvbmZpZ3VyZSBzaW1wbGUgaW5wdXQgY2FwdHVyZSBjaGFubmVsCisgICAgICAoKykgU3RhcnQgc2ltcGxlIGlucHV0IGNhcHR1cmUgCisgICAgICAoKykgU3RvcCBzaW1wbGUgaW5wdXQgY2FwdHVyZSAKKyAgICAgICgrKSBTdGFydCBzaW1wbGUgaW5wdXQgY2FwdHVyZSBhbmQgZW5hYmxlIGludGVycnVwdCAKKyAgICAgICgrKSBTdG9wIHNpbXBsZSBpbnB1dCBjYXB0dXJlIGFuZCBkaXNhYmxlIGludGVycnVwdCAKKyAgICAgICgrKSBTdGFydCBzaW1wbGUgaW5wdXQgY2FwdHVyZSBhbmQgZW5hYmxlIERNQSB0cmFuc2ZlciAKKyAgICAgICgrKSBTdG9wIHNpbXBsZSBpbnB1dCBjYXB0dXJlIGFuZCBkaXNhYmxlIERNQSB0cmFuc2ZlciAKKyAgICAgIC1ALSBXaGVuIGEgSFJUSU0gdGltZXIgb3BlcmF0ZXMgaW4gc2ltcGxlIGlucHV0IGNhcHR1cmUgbW9kZSAKKyAgICAgICAgICB0aGUgQ2FwdHVyZSBSZWdpc3RlciAoSFJUSU1fQ1BUMS8yeFIpIGlzIHVzZWQgdG8gbGF0Y2ggdGhlCisgICAgICAgICB2YWx1ZSBvZiB0aGUgdGltZXIgY291bnRlciBjb3VudGVyIGFmdGVyIGEgdHJhbnNpdGlvbiBkZXRlY3RlZCAKKyAgICAgICAgIG9uIGEgZ2l2ZW4gZXh0ZXJuYWwgZXZlbnQgaW5wdXQuCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgYSBzaW1wbGUgY2FwdHVyZSAKKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVySWR4IFRpbWVyIGluZGV4CisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICogQHBhcmFtICBDYXB0dXJlQ2hhbm5lbCBDYXB0dXJlIHVuaXQKKyAgKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fQ0FQVFVSRVVOSVRfMTogQ2FwdHVyZSB1bml0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9DQVBUVVJFVU5JVF8yOiBDYXB0dXJlIHVuaXQgMgorICAqIEBwYXJhbSAgcFNpbXBsZUNhcHR1cmVDaGFubmVsQ2ZnIHBvaW50ZXIgdG8gdGhlIHNpbXBsZSBjYXB0dXJlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgICogQG5vdGUgV2hlbiB0aGUgdGltZXIgb3BlcmF0ZXMgaW4gc2ltcGxlIGNhcHR1cmUgbW9kZSB0aGUgY2FwdHVyZSBpcyB0cmlnZXJyZWQKKyAgKiAgICAgICBieSB0aGUgZGVzaWduYXRlZCBleHRlcm5hbCBldmVudCBhbmQgR1BJTyBpbnB1dCBpcyBpbXBsaWNpdGx5IHVzZWQgYXMgZXZlbnQgc291cmNlLgorICAqICAgICAgIFRoZSBjYXR1cmUgY2FuIGJlIHRyaWdnZXJlZCBieSBhIHJpc2luZyBlZGdlLCBhIGZhbGxpbmcgZWRnZSBvciBib3RoCisgICogICAgICAgZWRnZXMgb24gZXZlbnQgY2hhbm5lbC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9TaW1wbGVDYXB0dXJlQ2hhbm5lbENvbmZpZyhIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDYXB0dXJlQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX1NpbXBsZUNhcHR1cmVDaGFubmVsQ2ZnVHlwZURlZiogcFNpbXBsZUNhcHR1cmVDaGFubmVsQ2ZnKQoreworICBIUlRJTV9FdmVudENmZ1R5cGVEZWYgRXZlbnRDZmc7CisgIAorICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9USU1JTkdfVU5JVChUaW1lcklkeCkpOworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fQ0FQVFVSRVVOSVQoQ2FwdHVyZUNoYW5uZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX0VWRU5UKHBTaW1wbGVDYXB0dXJlQ2hhbm5lbENmZy0+RXZlbnQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX0VWRU5UUE9MQVJJVFkocFNpbXBsZUNhcHR1cmVDaGFubmVsQ2ZnLT5FdmVudFNlbnNpdGl2aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ltcGxlQ2FwdHVyZUNoYW5uZWxDZmctPkV2ZW50UG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX0VWRU5UU0VOU0lUSVZJVFkocFNpbXBsZUNhcHR1cmVDaGFubmVsQ2ZnLT5FdmVudFNlbnNpdGl2aXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9FVkVOVEZJTFRFUihwU2ltcGxlQ2FwdHVyZUNoYW5uZWxDZmctPkV2ZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTaW1wbGVDYXB0dXJlQ2hhbm5lbENmZy0+RXZlbnRGaWx0ZXIpKTsKKyAgCisgIGlmKGhocnRpbS0+U3RhdGUgPT0gSEFMX0hSVElNX1NUQVRFX0JVU1kpCisgIHsKKyAgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaHJ0aW0pOworCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfQlVTWTsKKworICAvKiBDb25maWd1cmUgZXh0ZXJuYWwgZXZlbnQgY2hhbm5lbCAqLworICBFdmVudENmZy5GYXN0TW9kZSA9IEhSVElNX0VWRU5URkFTVE1PREVfRElTQUJMRTsKKyAgRXZlbnRDZmcuRmlsdGVyID0gcFNpbXBsZUNhcHR1cmVDaGFubmVsQ2ZnLT5FdmVudEZpbHRlcjsKKyAgRXZlbnRDZmcuUG9sYXJpdHkgPSBwU2ltcGxlQ2FwdHVyZUNoYW5uZWxDZmctPkV2ZW50UG9sYXJpdHk7CisgIEV2ZW50Q2ZnLlNlbnNpdGl2aXR5ID0gcFNpbXBsZUNhcHR1cmVDaGFubmVsQ2ZnLT5FdmVudFNlbnNpdGl2aXR5OworICBFdmVudENmZy5Tb3VyY2UgPSBIUlRJTV9FVkVOVFNSQ18xOworICAgIAorICBIUlRJTV9FdmVudENvbmZpZyhoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgIHBTaW1wbGVDYXB0dXJlQ2hhbm5lbENmZy0+RXZlbnQsCisgICAgICAgICAgICAgICAgICAgICZFdmVudENmZyk7CisKKyAgLyogTWVtb3JpemUgY2FwdHVyZSB0cmlnZ2VyICh3aWxsIGJlIGNvbmZpZ3VyZWQgd2hlbiB0aGUgY2FwdHVyZSBpcyBzdGFydGVkICovICAKKyAgSFJUSU1fQ2FwdHVyZVVuaXRDb25maWcoaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZUNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBTaW1wbGVDYXB0dXJlQ2hhbm5lbENmZy0+RXZlbnQpOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9SRUFEWTsKKyAgCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhocnRpbSk7ICAKKworICByZXR1cm4gSEFMX09LOyAKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGVzIGEgc2ltcGxlIGNhcHR1cmUgb24gdGhlIGRlc2lnbmVkIGNhcHR1cmUgdW5pdAorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZXJJZHggVGltZXIgaW5kZXgKKyAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9BIGZvciB0aW1lciBBCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0IgZm9yIHRpbWVyIEIKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQyBmb3IgdGltZXIgQworICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9EIGZvciB0aW1lciBECisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0UgZm9yIHRpbWVyIEUKKyAgKiBAcGFyYW0gIENhcHR1cmVDaGFubmVsIFRpbWVyIG91dHB1dAorICAqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9DQVBUVVJFVU5JVF8xOiBDYXB0dXJlIHVuaXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0NBUFRVUkVVTklUXzI6IENhcHR1cmUgdW5pdCAyCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICogQG5vdGUgIFRoZSBleHRlcm5hbCBldmVudCB0cmlnZ2VyaW5nIHRoZSBjYXB0dXJlIGlzIGF2YWlsYWJsZSBmb3IgYWxsIHRpbWluZyAKKyAgKiAgICAgICAgdW5pdHMuIEl0IGNhbiBiZSB1c2VkIGRpcmVjdGx5IGFuZCBpcyBhY3RpdmUgYXMgc29vbiBhcyB0aGUgdGltaW5nIAorICAqICAgICAgICB1bml0IGNvdW50ZXIgaXMgZW5hYmxlZC4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9TaW1wbGVDYXB0dXJlU3RhcnQoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDYXB0dXJlQ2hhbm5lbCkKK3sKKyAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9USU1JTkdfVU5JVChUaW1lcklkeCkpOworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fQ0FQVFVSRVVOSVQoQ2FwdHVyZUNoYW5uZWwpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhocnRpbSk7CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX0JVU1k7CisgICAgCisgIC8qIFNldCB0aGUgY2FwdHVyZSB1bml0IHRyaWdnZXIgKi8KKyAgc3dpdGNoIChDYXB0dXJlQ2hhbm5lbCkKKyAgeworICBjYXNlIEhSVElNX0NBUFRVUkVVTklUXzE6CisgICAgeworICAgICAgaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLkNQVDF4Q1IgPSBoaHJ0aW0tPlRpbWVyUGFyYW1bVGltZXJJZHhdLkNhcHR1cmVUcmlnZ2VyMTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fQ0FQVFVSRVVOSVRfMjoKKyAgICB7CisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uQ1BUMnhDUiA9IGhocnRpbS0+VGltZXJQYXJhbVtUaW1lcklkeF0uQ2FwdHVyZVRyaWdnZXIyOworICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorICAKKyAgLyogRW5hYmxlIHRoZSB0aW1lciBjb3VudGVyICovCisgIF9fSEFMX0hSVElNX0VOQUJMRShoaHJ0aW0sIFRpbWVySWR4VG9UaW1lcklkW1RpbWVySWR4XSk7CisKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9SRUFEWTsgCisgICAgICAgICAgICAgICAgICAKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGhydGltKTsgICAgICAKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZXMgYSBzaW1wbGUgY2FwdHVyZSBvbiB0aGUgZGVzaWduZWQgY2FwdHVyZSB1bml0IAorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZXJJZHggVGltZXIgaW5kZXgKKyAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9BIGZvciB0aW1lciBBCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0IgZm9yIHRpbWVyIEIKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQyBmb3IgdGltZXIgQworICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9EIGZvciB0aW1lciBECisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0UgZm9yIHRpbWVyIEUKKyAgKiBAcGFyYW0gIENhcHR1cmVDaGFubmVsIFRpbWVyIG91dHB1dAorICAqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9DQVBUVVJFVU5JVF8xOiBDYXB0dXJlIHVuaXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0NBUFRVUkVVTklUXzI6IENhcHR1cmUgdW5pdCAyCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fU2ltcGxlQ2FwdHVyZVN0b3AoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2FwdHVyZUNoYW5uZWwpCit7CisgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNSU5HX1VOSVQoVGltZXJJZHgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX0NBUFRVUkVVTklUKENhcHR1cmVDaGFubmVsKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaHJ0aW0pOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9CVVNZOworICAgIAorICAvKiBTZXQgdGhlIGNhcHR1cmUgdW5pdCB0cmlnZ2VyICovCisgIHN3aXRjaCAoQ2FwdHVyZUNoYW5uZWwpCisgIHsKKyAgY2FzZSBIUlRJTV9DQVBUVVJFVU5JVF8xOgorICAgIHsKKyAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5DUFQxeENSID0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfTk9ORTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fQ0FQVFVSRVVOSVRfMjoKKyAgICB7CisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uQ1BUMnhDUiA9IEhSVElNX0NBUFRVUkVUUklHR0VSX05PTkU7CisgICAgfQorICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9CisgIAorICAvKiBEaXNhYmxlIHRoZSB0aW1lciBjb3VudGVyICovCisgIGlmICgoaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLkNQVDF4Q1IgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfTk9ORSkgJiYKKyAgICAgIChoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uQ1BUMnhDUiA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9OT05FKSkKKyAgeworICAgIF9fSEFMX0hSVElNX0RJU0FCTEUoaGhydGltLCBUaW1lcklkeFRvVGltZXJJZFtUaW1lcklkeF0pOworICB9CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX1JFQURZOyAKKyAgICAgICAgICAgICAgICAgIAorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaHJ0aW0pOyAgICAgIAorICAKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGVzIGEgc2ltcGxlIGNhcHR1cmUgb24gdGhlIGRlc2lnbmVkIGNhcHR1cmUgdW5pdAorICAqICAgICAgICAgKENhcHR1cmUgaW50ZXJydXB0IGlzIGVuYWJsZWQpLgorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZXJJZHggVGltZXIgaW5kZXgKKyAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9BIGZvciB0aW1lciBBCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0IgZm9yIHRpbWVyIEIKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQyBmb3IgdGltZXIgQworICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9EIGZvciB0aW1lciBECisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0UgZm9yIHRpbWVyIEUKKyAgKiBAcGFyYW0gIENhcHR1cmVDaGFubmVsIFRpbWVyIG91dHB1dAorICAqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9DQVBUVVJFVU5JVF8xOiBDYXB0dXJlIHVuaXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0NBUFRVUkVVTklUXzI6IENhcHR1cmUgdW5pdCAyCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fU2ltcGxlQ2FwdHVyZVN0YXJ0X0lUKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2FwdHVyZUNoYW5uZWwpCit7CisgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNSU5HX1VOSVQoVGltZXJJZHgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX0NBUFRVUkVVTklUKENhcHR1cmVDaGFubmVsKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaHJ0aW0pOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9CVVNZOworICAgIAorICAvKiBTZXQgdGhlIGNhcHR1cmUgdW5pdCB0cmlnZ2VyICovCisgIHN3aXRjaCAoQ2FwdHVyZUNoYW5uZWwpCisgIHsKKyAgY2FzZSBIUlRJTV9DQVBUVVJFVU5JVF8xOgorICAgIHsKKyAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5DUFQxeENSID0gaGhydGltLT5UaW1lclBhcmFtW1RpbWVySWR4XS5DYXB0dXJlVHJpZ2dlcjE7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSB0aGUgY2FwdHVyZSB1bml0IDEgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9IUlRJTV9USU1FUl9FTkFCTEVfSVQoaGhydGltLCBUaW1lcklkeCwgSFJUSU1fVElNX0lUX0NQVDEpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9DQVBUVVJFVU5JVF8yOgorICAgIHsKKyAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5DUFQyeENSID0gaGhydGltLT5UaW1lclBhcmFtW1RpbWVySWR4XS5DYXB0dXJlVHJpZ2dlcjI7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSB0aGUgY2FwdHVyZSB1bml0IDIgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9IUlRJTV9USU1FUl9FTkFCTEVfSVQoaGhydGltLCBUaW1lcklkeCwgSFJUSU1fVElNX0lUX0NQVDIpOworICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorICAKKyAgLyogRW5hYmxlIHRoZSB0aW1lciBjb3VudGVyICovCisgIF9fSEFMX0hSVElNX0VOQUJMRShoaHJ0aW0sIFRpbWVySWR4VG9UaW1lcklkW1RpbWVySWR4XSk7CisKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9SRUFEWTsgCisgICAgICAgICAgICAgICAgICAKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGhydGltKTsgICAgICAKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZXMgYSBzaW1wbGUgY2FwdHVyZSBvbiB0aGUgZGVzaWduZWQgY2FwdHVyZSB1bml0CisgICogICAgICAgICAoQ2FwdHVyZSBpbnRlcnJ1cHQgaXMgZGlzYWJsZWQpLgorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZXJJZHggVGltZXIgaW5kZXgKKyAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9BIGZvciB0aW1lciBBCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0IgZm9yIHRpbWVyIEIKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQyBmb3IgdGltZXIgQworICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9EIGZvciB0aW1lciBECisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0UgZm9yIHRpbWVyIEUKKyAgKiBAcGFyYW0gIENhcHR1cmVDaGFubmVsIFRpbWVyIG91dHB1dAorICAqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9DQVBUVVJFVU5JVF8xOiBDYXB0dXJlIHVuaXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0NBUFRVUkVVTklUXzI6IENhcHR1cmUgdW5pdCAyCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fU2ltcGxlQ2FwdHVyZVN0b3BfSVQoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2FwdHVyZUNoYW5uZWwpCit7CisgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNSU5HX1VOSVQoVGltZXJJZHgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX0NBUFRVUkVVTklUKENhcHR1cmVDaGFubmVsKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaHJ0aW0pOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9CVVNZOworICAgIAorICAvKiBTZXQgdGhlIGNhcHR1cmUgdW5pdCB0cmlnZ2VyICovCisgIHN3aXRjaCAoQ2FwdHVyZUNoYW5uZWwpCisgIHsKKyAgY2FzZSBIUlRJTV9DQVBUVVJFVU5JVF8xOgorICAgIHsKKyAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5DUFQxeENSID0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfTk9ORTsKKyAgICAgIAorICAgICAgLyogRGlzYWJsZSB0aGUgY2FwdHVyZSB1bml0IDEgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9IUlRJTV9USU1FUl9ESVNBQkxFX0lUKGhocnRpbSwgVGltZXJJZHgsIEhSVElNX1RJTV9JVF9DUFQxKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fQ0FQVFVSRVVOSVRfMjoKKyAgICB7CisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uQ1BUMnhDUiA9IEhSVElNX0NBUFRVUkVUUklHR0VSX05PTkU7CisKKyAgICAgIC8qIERpc2FibGUgdGhlIGNhcHR1cmUgdW5pdCAyIGludGVycnVwdCAqLworICAgICAgX19IQUxfSFJUSU1fVElNRVJfRElTQUJMRV9JVChoaHJ0aW0sIFRpbWVySWR4LCBIUlRJTV9USU1fSVRfQ1BUMik7CisgICAgfQorICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9CisgIAorICAvKiBEaXNhYmxlIHRoZSB0aW1lciBjb3VudGVyICovCisgIGlmICgoaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLkNQVDF4Q1IgPT0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfTk9ORSkgJiYKKyAgICAgIChoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uQ1BUMnhDUiA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9OT05FKSkKKyAgeworICAgIF9fSEFMX0hSVElNX0RJU0FCTEUoaGhydGltLCBUaW1lcklkeFRvVGltZXJJZFtUaW1lcklkeF0pOworICB9CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX1JFQURZOyAKKyAgICAgICAgICAgICAgICAgIAorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaHJ0aW0pOyAgICAgIAorICAKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGVzIGEgc2ltcGxlIGNhcHR1cmUgb24gdGhlIGRlc2lnbmVkIGNhcHR1cmUgdW5pdAorICAqICAgICAgICAgKENhcHR1cmUgRE1BIHJlcXVlc3QgaXMgZW5hYmxlZCkuCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBUaW1lcklkeCBUaW1lciBpbmRleAorICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0EgZm9yIHRpbWVyIEEKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQiBmb3IgdGltZXIgQgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9DIGZvciB0aW1lciBDCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0QgZm9yIHRpbWVyIEQKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRSBmb3IgdGltZXIgRQorICAqIEBwYXJhbSAgQ2FwdHVyZUNoYW5uZWwgVGltZXIgb3V0cHV0CisgICogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0NBUFRVUkVVTklUXzE6IENhcHR1cmUgdW5pdCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fQ0FQVFVSRVVOSVRfMjogQ2FwdHVyZSB1bml0IDIKKyAgKiBAcGFyYW0gIFNyY0FkZHIgRE1BIHRyYW5zZmVyIHNvdXJjZSBhZGRyZXNzCisgICogQHBhcmFtICBEZXN0QWRkciBETUEgdHJhbnNmZXIgZGVzdGluYXRpb24gYWRkcmVzcworICAqIEBwYXJhbSAgTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSBpdGVtcyAoZGF0YSBzaXplKSB0byBiZSB0cmFuc2ZlcnJlZAorICAqICAgICAgICAgICAgICAgICAgICAgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9TaW1wbGVDYXB0dXJlU3RhcnRfRE1BKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDYXB0dXJlQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU3JjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRGVzdEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IExlbmd0aCkKK3sKKyAgRE1BX0hhbmRsZVR5cGVEZWYgKiBoZG1hOworCisgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNSU5HX1VOSVQoVGltZXJJZHgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX0NBUFRVUkVVTklUKENhcHR1cmVDaGFubmVsKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaHJ0aW0pOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9CVVNZOworICAgIAorICAvKiBHZXQgdGhlIHRpbWVyIERNQSBoYW5kbGVyICovCisgIGhkbWEgPSBIUlRJTV9HZXRETUFIYW5kbGVGcm9tVGltZXJJZHgoaGhydGltLCBUaW1lcklkeCk7CisKKyAgaWYgKGhkbWEgPT0gTlVMTCkKKyAgeworICAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9FUlJPUjsKKworICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgX19IQUxfVU5MT0NLKGhocnRpbSk7IAorCisgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgaGRtYS0+WGZlckVycm9yQ2FsbGJhY2sgPSBIUlRJTV9ETUFFcnJvciA7CisgIAorICAvKiBTZXQgdGhlIERNQSB0cmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgKi8KKyAgaGRtYS0+WGZlckNwbHRDYWxsYmFjayA9IEhSVElNX0RNQVRpbWVyeENwbHQ7CisgIAorICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgIEhBTF9ETUFfU3RhcnRfSVQoaGRtYSwgU3JjQWRkciwgRGVzdEFkZHIsIExlbmd0aCk7CisgIAorICBzd2l0Y2ggKENhcHR1cmVDaGFubmVsKQorICB7CisgIGNhc2UgSFJUSU1fQ0FQVFVSRVVOSVRfMToKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIGNhcHR1cmUgdW5pdCB0cmlnZ2VyICovCisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uQ1BUMXhDUiA9IGhocnRpbS0+VGltZXJQYXJhbVtUaW1lcklkeF0uQ2FwdHVyZVRyaWdnZXIxOworICAgICAgCisgICAgICBfX0hBTF9IUlRJTV9USU1FUl9FTkFCTEVfRE1BKGhocnRpbSwgVGltZXJJZHgsIEhSVElNX1RJTV9ETUFfQ1BUMSk7ICAgICAgCisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEhSVElNX0NBUFRVUkVVTklUXzI6CisgICAgeworICAgICAgLyogU2V0IHRoZSBjYXB0dXJlIHVuaXQgdHJpZ2dlciAqLworICAgICAgaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLkNQVDJ4Q1IgPSBoaHJ0aW0tPlRpbWVyUGFyYW1bVGltZXJJZHhdLkNhcHR1cmVUcmlnZ2VyMjsKKyAgICAgIAorICAgICAgLyogRW5hYmxlIHRoZSB0aW1lciBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfSFJUSU1fVElNRVJfRU5BQkxFX0RNQShoaHJ0aW0sIFRpbWVySWR4LCBIUlRJTV9USU1fRE1BX0NQVDIpOyAgICAgIAorICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyB9CisgIAorICAvKiBFbmFibGUgdGhlIHRpbWVyIGNvdW50ZXIgKi8KKyAgX19IQUxfSFJUSU1fRU5BQkxFKGhocnRpbSwgVGltZXJJZHhUb1RpbWVySWRbVGltZXJJZHhdKTsKKworICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX1JFQURZOyAKKyAgICAgICAgICAgICAgICAgIAorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaHJ0aW0pOyAgICAgIAorICAKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlcyBhIHNpbXBsZSBjYXB0dXJlIG9uIHRoZSBkZXNpZ25lZCBjYXB0dXJlIHVuaXQKKyAgKiAgICAgICAgIChDYXB0dXJlIERNQSByZXF1ZXN0IGlzIGRpc2FibGVkKS4KKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVySWR4IFRpbWVyIGluZGV4CisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICogQHBhcmFtICBDYXB0dXJlQ2hhbm5lbCBUaW1lciBvdXRwdXQKKyAgKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fQ0FQVFVSRVVOSVRfMTogQ2FwdHVyZSB1bml0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9DQVBUVVJFVU5JVF8yOiBDYXB0dXJlIHVuaXQgMgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1NpbXBsZUNhcHR1cmVTdG9wX0RNQShIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENhcHR1cmVDaGFubmVsKQoreworICBETUFfSGFuZGxlVHlwZURlZiAqIGhkbWE7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTUlOR19VTklUKFRpbWVySWR4KSk7CisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9DQVBUVVJFVU5JVChDYXB0dXJlQ2hhbm5lbCkpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGhydGltKTsKKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfQlVTWTsKKyAgICAKKyAgLyogR2V0IHRoZSB0aW1lciBETUEgaGFuZGxlciAqLworICBoZG1hID0gSFJUSU1fR2V0RE1BSGFuZGxlRnJvbVRpbWVySWR4KGhocnRpbSwgVGltZXJJZHgpOworCisgIGlmIChoZG1hID09IE5VTEwpCisgIHsKKyAgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfRVJST1I7CisKKyAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgIF9fSEFMX1VOTE9DSyhoaHJ0aW0pOyAKKworICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIERNQSAqLworICBIQUxfRE1BX0Fib3J0KGhkbWEpOworICAKKyAgc3dpdGNoIChDYXB0dXJlQ2hhbm5lbCkKKyAgeworICBjYXNlIEhSVElNX0NBUFRVUkVVTklUXzE6CisgICAgeworICAgICAgLyogUmVzZXQgdGhlIGNhcHR1cmUgdW5pdCB0cmlnZ2VyICovCisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uQ1BUMXhDUiA9IEhSVElNX0NBUFRVUkVUUklHR0VSX05PTkU7CisgICAgICAKKyAgICAgIC8qIERpc2FibGUgdGhlIGNhcHR1cmUgdW5pdCAxIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9IUlRJTV9USU1FUl9ESVNBQkxFX0RNQShoaHJ0aW0sIFRpbWVySWR4LCBIUlRJTV9USU1fRE1BX0NQVDEpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9DQVBUVVJFVU5JVF8yOgorICAgIHsKKyAgICAgIC8qIFJlc2V0IHRoZSBjYXB0dXJlIHVuaXQgdHJpZ2dlciAqLworICAgICAgaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLkNQVDJ4Q1IgPSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9OT05FOworICAgICAgCisgICAgICAvKiBEaXNhYmxlIHRoZSBjYXB0dXJlIHVuaXQgMiBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfSFJUSU1fVElNRVJfRElTQUJMRV9ETUEoaGhydGltLCBUaW1lcklkeCwgSFJUSU1fVElNX0RNQV9DUFQyKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KKyAgCisgIC8qIERpc2FibGUgdGhlIHRpbWVyIGNvdW50ZXIgKi8KKyAgaWYgKChoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uQ1BUMXhDUiA9PSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9OT05FKSAmJgorICAgICAgKGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5DUFQyeENSID09IEhSVElNX0NBUFRVUkVUUklHR0VSX05PTkUpKQorICB7CisgICAgX19IQUxfSFJUSU1fRElTQUJMRShoaHJ0aW0sIFRpbWVySWR4VG9UaW1lcklkW1RpbWVySWR4XSk7CisgIH0KKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfUkVBRFk7IAorICAgICAgICAgICAgICAgICAgCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhocnRpbSk7ICAgICAgCisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDYgU2ltcGxlIG9uZSBwdWxzZSBmdW5jdGlvbnMgIAorICogIEBicmllZiAgICBTaW1wbGUgb25lIHB1bHNlIGZ1bmN0aW9ucworQHZlcmJhdGltICAgIAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgU2ltcGxlIG9uZSBwdWxzZSBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBDb25maWd1cmUgb25lIHB1bHNlIGNoYW5uZWwgCisgICAgICAoKykgU3RhcnQgb25lIHB1bHNlIGdlbmVyYXRpb24gCisgICAgICAoKykgU3RvcCBvbmUgcHVsc2UgZ2VuZXJhdGlvbiAKKyAgICAgICgrKSBTdGFydCBvbmUgcHVsc2UgZ2VuZXJhdGlvbiBhbmQgZW5hYmxlIGludGVycnVwdCAKKyAgICAgICgrKSBTdG9wIG9uZSBwdWxzZSBnZW5lcmF0aW9uIGFuZCBkaXNhYmxlIGludGVycnVwdCAKKyAgICAgIC1ALSBXaGVuIGEgSFJUSU0gdGltZXIgb3BlcmF0ZXMgaW4gc2ltcGxlIG9uZSBwdWxzZSBtb2RlIAorICAgICAgICAgIHRoZSB0aW1lciBjb3VudGVyIGlzIHN0YXJ0ZWQgaW4gcmVzcG9uc2UgdG8gdHJhbnNpdGlvbiBkZXRlY3RlZCAKKyAgICAgICAgICBvbiBhIGdpdmVuIGV4dGVybmFsIGV2ZW50IGlucHV0IHRvIGdlbmVyYXRlIGEgcHVsc2Ugd2l0aCBhIAorICAgICAgICAgIHByb2dyYW1tYWJsZSBsZW5ndGggYWZ0ZXIgYSBwcm9ncmFtbWFibGUgZGVsYXkuCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgYW4gb3V0cHV0IHNpbXBsZSBvbmUgcHVsc2UgbW9kZSAKKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVySWR4IFRpbWVyIGluZGV4CisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICogQHBhcmFtICBPbmVQdWxzZUNoYW5uZWwgVGltZXIgb3V0cHV0CisgICogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RBMTogVGltZXIgQSAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RBMjogVGltZXIgQSAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RCMTogVGltZXIgQiAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RCMjogVGltZXIgQiAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RDMTogVGltZXIgQyAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RDMjogVGltZXIgQyAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1REMTogVGltZXIgRCAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1REMjogVGltZXIgRCAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RFMTogVGltZXIgRSAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RFMjogVGltZXIgRSAtIE91dHB1dCAyIAorICAqIEBwYXJhbSAgcFNpbXBsZU9uZVB1bHNlQ2hhbm5lbENmZyBwb2ludGVyIHRvIHRoZSBzaW1wbGUgb25lIHB1bHNlIG91dHB1dCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICAqIEBub3RlIFdoZW4gdGhlIHRpbWVyIG9wZXJhdGVzIGluIHNpbXBsZSBvbmUgcHVsc2UgbW9kZToKKyAgKiAgICAgICAgIHRoZSB0aW1lciBjb3VudGVyIGlzIGltcGxpY2l0bHkgc3RhcnRlZCBieSB0aGUgcmVzZXQgZXZlbnQsCisgICogICAgICAgICB0aGUgcmVzZXQgb2YgdGhlIHRpbWVyIGNvdW50ZXIgaXMgdHJpZ2dlcmVkIGJ5IHRoZSBkZXNpZ25hdGVkIGV4dGVybmFsIGV2ZW50CisgICogICAgICAgICBHUElPIGlucHV0IGlzIGltcGxpY2l0bHkgdXNlZCBhcyBldmVudCBzb3VyY2UsCisgICogICAgICAgICBPdXRwdXQgMSBpcyBpbXBsaWNpdGx5IGNvbnRyb2xsZWQgYnkgdGhlIGNvbXBhcmUgdW5pdCAxLAorICAqICAgICAgICAgT3V0cHV0IDIgaXMgaW1wbGljaXRseSBjb250cm9sbGVkIGJ5IHRoZSBjb21wYXJlIHVuaXQgMi4KKyAgKiAgICAgICBPdXRwdXQgU2V0L1Jlc2V0IGNyb3NzYmFyIGlzIHNldCBhcyBmb2xsb3dzOgorICAqICAgICAgICAgT3V0cHV0IDE6IFNFVHgxUiA9IENNUDEsIFJTVHgxUiA9IFBFUgorICAqICAgICAgICAgT3V0cHV0IDI6IFNFVHgyUiA9IENNUDIsIFJTVDJSID0gUEVSCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICogQG5vdGUgSWYgSEFMX0hSVElNX1NpbXBsZU9uZVB1bHNlQ2hhbm5lbENvbmZpZyBpcyBjYWxsZWQgZm9yIGJvdGggdGltZXIgCisgICogICAgICAgb3V0cHV0cywgdGhlIHJlc2V0IGV2ZW50IHJlbGF0ZWQgY29uZmlndXJhdGlvbiBkYXRhIHByb3ZpZGVkIGluIHRoZSAKKyAgKiAgICAgICBzZWNvbmQgY2FsbCB3aWxsIG92ZXJyaWRlIHRoZSByZXNldCBldmVudCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gZGF0YSAKKyAgKiAgICAgICBwcm92aWRlZCBpbiB0aGUgZmlyc3QgY2FsbC4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9TaW1wbGVPbmVQdWxzZUNoYW5uZWxDb25maWcoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPbmVQdWxzZUNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fU2ltcGxlT25lUHVsc2VDaGFubmVsQ2ZnVHlwZURlZiogcFNpbXBsZU9uZVB1bHNlQ2hhbm5lbENmZykKK3sKKyAgdWludDMyX3QgQ29tcGFyZVVuaXQgPSAweEZGRkZGRkZGVTsKKyAgSFJUSU1fQ29tcGFyZUNmZ1R5cGVEZWYgQ29tcGFyZUNmZzsKKyAgSFJUSU1fT3V0cHV0Q2ZnVHlwZURlZiBPdXRwdXRDZmc7CisgIEhSVElNX0V2ZW50Q2ZnVHlwZURlZiBFdmVudENmZzsKKyAgCisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTUVSX09VVFBVVChUaW1lcklkeCwgT25lUHVsc2VDaGFubmVsKSk7CisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9PVVRQVVRQT0xBUklUWShwU2ltcGxlT25lUHVsc2VDaGFubmVsQ2ZnLT5PdXRwdXRQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fT1VUUFVUSURMRUxFVkVMKHBTaW1wbGVPbmVQdWxzZUNoYW5uZWxDZmctPk91dHB1dElkbGVMZXZlbCkpOworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fRVZFTlQocFNpbXBsZU9uZVB1bHNlQ2hhbm5lbENmZy0+RXZlbnQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX0VWRU5UUE9MQVJJVFkocFNpbXBsZU9uZVB1bHNlQ2hhbm5lbENmZy0+RXZlbnRTZW5zaXRpdml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNpbXBsZU9uZVB1bHNlQ2hhbm5lbENmZy0+RXZlbnRQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fRVZFTlRTRU5TSVRJVklUWShwU2ltcGxlT25lUHVsc2VDaGFubmVsQ2ZnLT5FdmVudFNlbnNpdGl2aXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9FVkVOVEZJTFRFUihwU2ltcGxlT25lUHVsc2VDaGFubmVsQ2ZnLT5FdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTaW1wbGVPbmVQdWxzZUNoYW5uZWxDZmctPkV2ZW50RmlsdGVyKSk7CisgIAorICBpZihoaHJ0aW0tPlN0YXRlID09IEhBTF9IUlRJTV9TVEFURV9CVVNZKQorICB7CisgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGhydGltKTsKKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfQlVTWTsKKworICAvKiBDb25maWd1cmUgdGltZXIgY29tcGFyZSB1bml0ICovICAKKyAgc3dpdGNoIChPbmVQdWxzZUNoYW5uZWwpCisgIHsKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEExOgorICBjYXNlIEhSVElNX09VVFBVVF9UQjE6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RDMToKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEQxOgorICBjYXNlIEhSVElNX09VVFBVVF9URTE6CisgICAgeworICAgICAgQ29tcGFyZVVuaXQgPSBIUlRJTV9DT01QQVJFVU5JVF8xOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEEyOgorICBjYXNlIEhSVElNX09VVFBVVF9UQjI6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RDMjoKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEQyOgorICBjYXNlIEhSVElNX09VVFBVVF9URTI6CisgICAgeworICAgICAgQ29tcGFyZVVuaXQgPSBIUlRJTV9DT01QQVJFVU5JVF8yOworICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorICAKKyAgQ29tcGFyZUNmZy5Db21wYXJlVmFsdWUgPSBwU2ltcGxlT25lUHVsc2VDaGFubmVsQ2ZnLT5QdWxzZTsKKyAgQ29tcGFyZUNmZy5BdXRvRGVsYXllZE1vZGUgPSBIUlRJTV9BVVRPREVMQVlFRE1PREVfUkVHVUxBUjsKKyAgQ29tcGFyZUNmZy5BdXRvRGVsYXllZFRpbWVvdXQgPSAwVTsKKyAgCisgIEhSVElNX0NvbXBhcmVVbml0Q29uZmlnKGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBhcmVVbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29tcGFyZUNmZyk7CisgIAorICAvKiBDb25maWd1cmUgdGltZXIgb3V0cHV0ICovCisgIE91dHB1dENmZy5Qb2xhcml0eSA9IHBTaW1wbGVPbmVQdWxzZUNoYW5uZWxDZmctPk91dHB1dFBvbGFyaXR5OworICBPdXRwdXRDZmcuSWRsZUxldmVsID0gcFNpbXBsZU9uZVB1bHNlQ2hhbm5lbENmZy0+T3V0cHV0SWRsZUxldmVsOworICBPdXRwdXRDZmcuRmF1bHRMZXZlbCA9IEhSVElNX09VVFBVVEZBVUxUTEVWRUxfTk9ORTsKKyAgT3V0cHV0Q2ZnLklkbGVNb2RlID0gSFJUSU1fT1VUUFVUSURMRU1PREVfTk9ORTsKKyAgT3V0cHV0Q2ZnLkNob3BwZXJNb2RlRW5hYmxlID0gSFJUSU1fT1VUUFVUQ0hPUFBFUk1PREVfRElTQUJMRUQ7CisgIE91dHB1dENmZy5CdXJzdE1vZGVFbnRyeURlbGF5ZWQgPSBIUlRJTV9PVVRQVVRCVVJTVE1PREVFTlRSWV9SRUdVTEFSOworCisgIGlmIChDb21wYXJlVW5pdCA9PSBIUlRJTV9DT01QQVJFVU5JVF8xKQorICB7CisgICAgT3V0cHV0Q2ZnLlNldFNvdXJjZSA9IEhSVElNX09VVFBVVFNFVF9USU1DTVAxOworICB9CisgIGVsc2UKKyAgeworICAgIE91dHB1dENmZy5TZXRTb3VyY2UgPSBIUlRJTV9PVVRQVVRTRVRfVElNQ01QMjsKKyAgfQorICBPdXRwdXRDZmcuUmVzZXRTb3VyY2UgPSBIUlRJTV9PVVRQVVRTRVRfVElNUEVSOworICAKKyAgSFJUSU1fT3V0cHV0Q29uZmlnKGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgIFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgT25lUHVsc2VDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgJk91dHB1dENmZyk7ICAKKyAgCisgIC8qIENvbmZpZ3VyZSBleHRlcm5hbCBldmVudCBjaGFubmVsICovCisgIEV2ZW50Q2ZnLkZhc3RNb2RlID0gSFJUSU1fRVZFTlRGQVNUTU9ERV9ESVNBQkxFOworICBFdmVudENmZy5GaWx0ZXIgPSBwU2ltcGxlT25lUHVsc2VDaGFubmVsQ2ZnLT5FdmVudEZpbHRlcjsKKyAgRXZlbnRDZmcuUG9sYXJpdHkgPSBwU2ltcGxlT25lUHVsc2VDaGFubmVsQ2ZnLT5FdmVudFBvbGFyaXR5OworICBFdmVudENmZy5TZW5zaXRpdml0eSA9IHBTaW1wbGVPbmVQdWxzZUNoYW5uZWxDZmctPkV2ZW50U2Vuc2l0aXZpdHk7CisgIEV2ZW50Q2ZnLlNvdXJjZSA9IEhSVElNX0VWRU5UU1JDXzE7CisgICAgCisgIEhSVElNX0V2ZW50Q29uZmlnKGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgcFNpbXBsZU9uZVB1bHNlQ2hhbm5lbENmZy0+RXZlbnQsCisgICAgICAgICAgICAgICAgICAgICZFdmVudENmZyk7CisKKyAgLyogQ29uZmlndXJlIHRoZSB0aW1lciByZXNldCByZWdpc3RlciAqLworICBIUlRJTV9USU1fUmVzZXRDb25maWcoaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgVGltZXJJZHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgcFNpbXBsZU9uZVB1bHNlQ2hhbm5lbENmZy0+RXZlbnQpOyAgCisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX1JFQURZOworICAKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGhydGltKTsgIAorCisgIHJldHVybiBIQUxfT0s7IAorfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgdGhlIHNpbXBsZSBvbmUgcHVsc2Ugc2lnbmFsIGdlbmVyYXRpb24gb24gdGhlIGRlc2lnbmVkIG91dHB1dCAKKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVySWR4IFRpbWVyIGluZGV4CisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICogQHBhcmFtICBPbmVQdWxzZUNoYW5uZWwgVGltZXIgb3V0cHV0CisgICogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RBMTogVGltZXIgQSAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RBMjogVGltZXIgQSAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RCMTogVGltZXIgQiAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RCMjogVGltZXIgQiAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RDMTogVGltZXIgQyAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RDMjogVGltZXIgQyAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1REMTogVGltZXIgRCAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1REMjogVGltZXIgRCAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RFMTogVGltZXIgRSAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RFMjogVGltZXIgRSAtIE91dHB1dCAyCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fU2ltcGxlT25lUHVsc2VTdGFydChIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPbmVQdWxzZUNoYW5uZWwpCit7CisgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNRVJfT1VUUFVUKFRpbWVySWR4LCBPbmVQdWxzZUNoYW5uZWwpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhocnRpbSk7CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX0JVU1k7IAorICAKKyAgLyogRW5hYmxlIHRoZSB0aW1lciBvdXRwdXQgKi8KKyAgaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuT0VOUiB8PSBPbmVQdWxzZUNoYW5uZWw7CisgICAgCisgIC8qIEVuYWJsZSB0aGUgdGltZXIgY291bnRlciAqLworICBfX0hBTF9IUlRJTV9FTkFCTEUoaGhydGltLCBUaW1lcklkeFRvVGltZXJJZFtUaW1lcklkeF0pOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9SRUFEWTsgCisgICAgICAgICAgICAgICAgICAKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGhydGltKTsgICAgICAKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZXMgdGhlIHNpbXBsZSBvbmUgcHVsc2Ugc2lnbmFsIGdlbmVyYXRpb24gb24gdGhlIGRlc2lnbmVkIG91dHB1dCAKKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVySWR4IFRpbWVyIGluZGV4CisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICogQHBhcmFtICBPbmVQdWxzZUNoYW5uZWwgVGltZXIgb3V0cHV0CisgICogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RBMTogVGltZXIgQSAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RBMjogVGltZXIgQSAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RCMTogVGltZXIgQiAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RCMjogVGltZXIgQiAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RDMTogVGltZXIgQyAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RDMjogVGltZXIgQyAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1REMTogVGltZXIgRCAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1REMjogVGltZXIgRCAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RFMTogVGltZXIgRSAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RFMjogVGltZXIgRSAtIE91dHB1dCAyCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fU2ltcGxlT25lUHVsc2VTdG9wKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT25lUHVsc2VDaGFubmVsKQoreworICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTUVSX09VVFBVVChUaW1lcklkeCwgT25lUHVsc2VDaGFubmVsKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaHJ0aW0pOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9CVVNZOyAKKyAgCisgIC8qIERpc2FibGUgdGhlIHRpbWVyIG91dHB1dCAqLworICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5PRElTUiB8PSBPbmVQdWxzZUNoYW5uZWw7CisgIAorICAvKiBEaXNhYmxlIHRoZSB0aW1lciBjb3VudGVyICovCisgIF9fSEFMX0hSVElNX0RJU0FCTEUoaGhydGltLCBUaW1lcklkeFRvVGltZXJJZFtUaW1lcklkeF0pOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9SRUFEWTsgCisgICAgICAgICAgICAgICAgICAKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGhydGltKTsgICAgICAKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlcyB0aGUgc2ltcGxlIG9uZSBwdWxzZSBzaWduYWwgZ2VuZXJhdGlvbiBvbiB0aGUgZGVzaWduZWQgb3V0cHV0CisgICogICAgICAgICAoVGhlIGNvbXBhcmUgaW50ZXJydXB0IGlzIGVuYWJsZWQgKHB1bHNlIHN0YXJ0KSkuCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBUaW1lcklkeCBUaW1lciBpbmRleAorICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0EgZm9yIHRpbWVyIEEKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQiBmb3IgdGltZXIgQgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9DIGZvciB0aW1lciBDCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0QgZm9yIHRpbWVyIEQKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRSBmb3IgdGltZXIgRQorICAqIEBwYXJhbSAgT25lUHVsc2VDaGFubmVsIFRpbWVyIG91dHB1dAorICAqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQTE6IFRpbWVyIEEgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQTI6IFRpbWVyIEEgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQjE6IFRpbWVyIEIgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQjI6IFRpbWVyIEIgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQzE6IFRpbWVyIEMgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQzI6IFRpbWVyIEMgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URDE6IFRpbWVyIEQgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URDI6IFRpbWVyIEQgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URTE6IFRpbWVyIEUgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URTI6IFRpbWVyIEUgLSBPdXRwdXQgMgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1NpbXBsZU9uZVB1bHNlU3RhcnRfSVQoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE9uZVB1bHNlQ2hhbm5lbCkKK3sKKyAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9USU1FUl9PVVRQVVQoVGltZXJJZHgsIE9uZVB1bHNlQ2hhbm5lbCkpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGhydGltKTsKKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfQlVTWTsgCisgIAorICAvKiBFbmFibGUgdGhlIHRpbWVyIG91dHB1dCAqLworICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5PRU5SIHw9IE9uZVB1bHNlQ2hhbm5lbDsKKworICAvKiBFbmFibGUgdGhlIHRpbWVyIGludGVycnVwdCAoZGVwZW5kcyBvbiB0aGUgT25lUHVsc2Ugb3V0cHV0KSAqLworICBzd2l0Y2ggKE9uZVB1bHNlQ2hhbm5lbCkKKyAgeworICBjYXNlIEhSVElNX09VVFBVVF9UQTE6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RCMToKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEMxOgorICBjYXNlIEhSVElNX09VVFBVVF9URDE6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RFMToKKyAgICB7CisgICAgICBfX0hBTF9IUlRJTV9USU1FUl9FTkFCTEVfSVQoaGhydGltLCBUaW1lcklkeCwgSFJUSU1fVElNX0lUX0NNUDEpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEEyOgorICBjYXNlIEhSVElNX09VVFBVVF9UQjI6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RDMjoKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEQyOgorICBjYXNlIEhSVElNX09VVFBVVF9URTI6CisgICAgeworICAgICAgX19IQUxfSFJUSU1fVElNRVJfRU5BQkxFX0lUKGhocnRpbSwgVGltZXJJZHgsIEhSVElNX1RJTV9JVF9DTVAyKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KKyAgCisgIC8qIEVuYWJsZSB0aGUgdGltZXIgY291bnRlciAqLworICBfX0hBTF9IUlRJTV9FTkFCTEUoaGhydGltLCBUaW1lcklkeFRvVGltZXJJZFtUaW1lcklkeF0pOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9SRUFEWTsgCisgICAgICAgICAgICAgICAgICAKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGhydGltKTsgICAgICAKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZXMgdGhlIHNpbXBsZSBvbmUgcHVsc2Ugc2lnbmFsIGdlbmVyYXRpb24gb24gdGhlIGRlc2lnbmVkIG91dHB1dAorICAqICAgICAgICAgKFRoZSBjb21wYXJlIGludGVycnVwdCBpcyBkaXNhYmxlZCkuCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBUaW1lcklkeCBUaW1lciBpbmRleAorICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0EgZm9yIHRpbWVyIEEKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQiBmb3IgdGltZXIgQgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9DIGZvciB0aW1lciBDCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0QgZm9yIHRpbWVyIEQKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRSBmb3IgdGltZXIgRQorICAqIEBwYXJhbSAgT25lUHVsc2VDaGFubmVsIFRpbWVyIG91dHB1dAorICAqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQTE6IFRpbWVyIEEgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQTI6IFRpbWVyIEEgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQjE6IFRpbWVyIEIgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQjI6IFRpbWVyIEIgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQzE6IFRpbWVyIEMgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQzI6IFRpbWVyIEMgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URDE6IFRpbWVyIEQgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URDI6IFRpbWVyIEQgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URTE6IFRpbWVyIEUgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URTI6IFRpbWVyIEUgLSBPdXRwdXQgMgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1NpbXBsZU9uZVB1bHNlU3RvcF9JVChIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE9uZVB1bHNlQ2hhbm5lbCkKK3sKKyAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTUVSX09VVFBVVChUaW1lcklkeCwgT25lUHVsc2VDaGFubmVsKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaHJ0aW0pOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9CVVNZOyAKKyAgCisgIC8qIERpc2FibGUgdGhlIHRpbWVyIG91dHB1dCAqLworICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5PRElTUiB8PSBPbmVQdWxzZUNoYW5uZWw7CisgICAgCisgIC8qIERpc2FibGUgdGhlIHRpbWVyIGludGVycnVwdCAoZGVwZW5kcyBvbiB0aGUgT25lUHVsc2Ugb3V0cHV0KSAqLworICBzd2l0Y2ggKE9uZVB1bHNlQ2hhbm5lbCkKKyAgeworICBjYXNlIEhSVElNX09VVFBVVF9UQTE6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RCMToKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEMxOgorICBjYXNlIEhSVElNX09VVFBVVF9URDE6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RFMToKKyAgICB7CisgICAgICBfX0hBTF9IUlRJTV9USU1FUl9ESVNBQkxFX0lUKGhocnRpbSwgVGltZXJJZHgsIEhSVElNX1RJTV9JVF9DTVAxKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RBMjoKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEIyOgorICBjYXNlIEhSVElNX09VVFBVVF9UQzI6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1REMjoKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEUyOgorICAgIHsKKyAgICAgIF9fSEFMX0hSVElNX1RJTUVSX0RJU0FCTEVfSVQoaGhydGltLCBUaW1lcklkeCwgSFJUSU1fVElNX0lUX0NNUDIpOworICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorICAKKyAgLyogRGlzYWJsZSB0aGUgdGltZXIgY291bnRlciAqLworICBfX0hBTF9IUlRJTV9ESVNBQkxFKGhocnRpbSwgVGltZXJJZHhUb1RpbWVySWRbVGltZXJJZHhdKTsKKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfUkVBRFk7IAorICAgICAgICAgICAgICAgICAgCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhocnRpbSk7ICAgICAgCisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDcgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgIAorICogIEBicmllZiAgICBIUlRJTSBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucworQHZlcmJhdGltICAgIAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSFJUSU0gY29uZmlndXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb25maWd1cmUgdGhlIEhSVElNIAorICAgICAgICAgIHJlc291cmNlcyBzaGFyZWQgYnkgYWxsIHRoZSBIUlRJTSB0aW1lcnMgb3BlcmF0aW5nIGluIHdhdmVmb3JtIG1vZGU6CisgICAgICAoKykgQ29uZmlndXJlIHRoZSBidXJzdCBtb2RlIGNvbnRyb2xsZXIgCisgICAgICAoKykgQ29uZmlndXJlIGFuIGV4dGVybmFsIGV2ZW50IGNvbmRpdGlvbm5pbmcgCisgICAgICAoKykgQ29uZmlndXJlIHRoZSBleHRlcm5hbCBldmVudHMgc2FtcGxpbmcgY2xvY2sgIAorICAgICAgKCspIENvbmZpZ3VyZSBhIGZhdWx0IGNvbmRpdGlvbm5pbmcgCisgICAgICAoKykgRW5hYmxlIG9yIGRpc2FibGUgZmF1bHQgaW5wdXRzIAorICAgICAgKCspIENvbmZpZ3VyZSB0aGUgZmF1bHRzIHNhbXBsaW5nIGNsb2NrICAKKyAgICAgICgrKSBDb25maWd1cmUgYW4gQURDIHRyaWdnZXIgIAorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIGJ1cnN0IG1vZGUgZmVhdHVyZSBvZiB0aGUgSFJUSU0gCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBwQnVyc3RNb2RlQ2ZnIHBvaW50ZXIgdG8gdGhlIGJ1cnN0IG1vZGUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBzdGFydGluZyB0aGUgYnVyc3QgbW9kZSAKKyAgKiAgICAgICBjb250cm9sbGVyCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fQnVyc3RNb2RlQ29uZmlnKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX0J1cnN0TW9kZUNmZ1R5cGVEZWYqIHBCdXJzdE1vZGVDZmcpCit7CisgIHVpbnQzMl90IGhydGltX2JtY3I7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fQlVSU1RNT0RFKHBCdXJzdE1vZGVDZmctPk1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX0JVUlNUTU9ERUNMT0NLU09VUkNFKHBCdXJzdE1vZGVDZmctPkNsb2NrU291cmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9IUlRJTV9CVVJTVE1PREVQUkVTQ0FMRVIocEJ1cnN0TW9kZUNmZy0+UHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9CVVJTVE1PREVQUkVMT0FEKHBCdXJzdE1vZGVDZmctPlByZWxvYWRFbmFibGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX0JVUlNUTU9ERVRSSUdHRVIocEJ1cnN0TW9kZUNmZy0+VHJpZ2dlcikpOworICAgICAgICAgICAgICAgCisgIGlmKGhocnRpbS0+U3RhdGUgPT0gSEFMX0hSVElNX1NUQVRFX0JVU1kpCisgIHsKKyAgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaHJ0aW0pOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9CVVNZOworICAKKyAgaHJ0aW1fYm1jciA9IGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLkJNQ1I7CisKKyAgLyogU2V0IHRoZSBidXJzdCBtb2RlIG9wZXJhdGluZyBtb2RlICovCisgIGhydGltX2JtY3IgJj0gfihIUlRJTV9CTUNSX0JNT00pOworICBocnRpbV9ibWNyIHw9IHBCdXJzdE1vZGVDZmctPk1vZGU7CisgIAorICAvKiBTZXQgdGhlIGJ1cnN0IG1vZGUgY2xvY2sgc291cmNlICovCisgIGhydGltX2JtY3IgJj0gfihIUlRJTV9CTUNSX0JNQ0xLKTsKKyAgaHJ0aW1fYm1jciB8PSBwQnVyc3RNb2RlQ2ZnLT5DbG9ja1NvdXJjZTsKKyAgCisgIC8qIFNldCB0aGUgYnVyc3QgbW9kZSBwcmVzY2FsZXIgKi8KKyAgaHJ0aW1fYm1jciAmPSB+KEhSVElNX0JNQ1JfQk1QUlNDKTsKKyAgaHJ0aW1fYm1jciB8PSBwQnVyc3RNb2RlQ2ZnLT5QcmVzY2FsZXI7CisgCisgIC8qIEVuYWJsZS9kaXNhYmxlIGJ1cnN0IG1vZGUgcmVnaXN0ZXJzIHByZWxvYWQgKi8KKyAgaHJ0aW1fYm1jciAmPSB+KEhSVElNX0JNQ1JfQk1QUkVOKTsKKyAgaHJ0aW1fYm1jciB8PSBwQnVyc3RNb2RlQ2ZnLT5QcmVsb2FkRW5hYmxlOworIAorICAvKiBTZXQgdGhlIGJ1cnN0IG1vZGUgdHJpZ2dlciAqLworICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5CTVRSR1IgPSBwQnVyc3RNb2RlQ2ZnLT5UcmlnZ2VyOworICAKKyAgLyogU2V0IHRoZSBidXJzdCBtb2RlIGNvbXBhcmUgdmFsdWUgKi8KKyAgaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuQk1DTVBSID0gcEJ1cnN0TW9kZUNmZy0+SWRsZUR1cmF0aW9uOworICAKKyAgLyogU2V0IHRoZSBidXJzdCBtb2RlIHBlcmlvZCAqLworICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5CTVBFUiA9IHBCdXJzdE1vZGVDZmctPlBlcmlvZDsKKyAgCisgIC8qIFVwZGF0ZSB0aGUgSFJUSU0gcmVnaXN0ZXJzICovICAKKyAgaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuQk1DUiA9IGhydGltX2JtY3I7CisKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9SRUFEWTsKKyAgCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhocnRpbSk7ICAKKworICByZXR1cm4gSEFMX09LOyAKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBjb25kaXRpb25pbmcgb2YgYW4gZXh0ZXJuYWwgZXZlbnQKKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIEV2ZW50IGV4dGVybmFsIGV2ZW50IHRvIGNvbmZpZ3VyZQorICAqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0VWRU5UX05PTkU6IG5vIGV4dGVybmFsIEV2ZW50CisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fRVZFTlRfMTogRXh0ZXJuYWwgZXZlbnQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0VWRU5UXzI6IEV4dGVybmFsIGV2ZW50IDIKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9FVkVOVF8zOiBFeHRlcm5hbCBldmVudCAzCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fRVZFTlRfNDogRXh0ZXJuYWwgZXZlbnQgNAorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0VWRU5UXzU6IEV4dGVybmFsIGV2ZW50IDUKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9FVkVOVF82OiBFeHRlcm5hbCBldmVudCA2CisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fRVZFTlRfNzogRXh0ZXJuYWwgZXZlbnQgNworICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0VWRU5UXzg6IEV4dGVybmFsIGV2ZW50IDgKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9FVkVOVF85OiBFeHRlcm5hbCBldmVudCA5CisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fRVZFTlRfMTA6IEV4dGVybmFsIGV2ZW50IDEwCisgICogQHBhcmFtICBwRXZlbnRDZmcgcG9pbnRlciB0byB0aGUgZXZlbnQgY29uZGl0aW9uaW5nIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgc3RhcnRpbmcgdGhlIHRpbWVyCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fRXZlbnRDb25maWcoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9FdmVudENmZ1R5cGVEZWYqIHBFdmVudENmZykKK3sKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fRVZFTlRTUkMocEV2ZW50Q2ZnLT5Tb3VyY2UpKTsgCisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9FVkVOVFBPTEFSSVRZKHBFdmVudENmZy0+U2Vuc2l0aXZpdHksIHBFdmVudENmZy0+UG9sYXJpdHkpKTsgCisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9FVkVOVFNFTlNJVElWSVRZKHBFdmVudENmZy0+U2Vuc2l0aXZpdHkpKTsgCisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9FVkVOVEZBU1RNT0RFKEV2ZW50LCBwRXZlbnRDZmctPkZhc3RNb2RlKSk7IAorICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fRVZFTlRGSUxURVIoRXZlbnQsIHBFdmVudENmZy0+RmlsdGVyKSk7IAorICAKKyAgaWYoaGhydGltLT5TdGF0ZSA9PSBIQUxfSFJUSU1fU1RBVEVfQlVTWSkKKyAgeworICAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhocnRpbSk7CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX0JVU1k7CisKKyAgLyogQ29uZmlndXJlIHRoZSBldmVudCBjaGFubmVsICovCisgIEhSVElNX0V2ZW50Q29uZmlnKGhocnRpbSwgRXZlbnQsIHBFdmVudENmZyk7CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX1JFQURZOworICAKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGhydGltKTsgIAorCisgIHJldHVybiBIQUxfT0s7IAorfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIGV4dGVybmFsIGV2ZW50IGNvbmRpdGlvbmluZyBibG9jayBwcmVzY2FsZXIKKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFByZXNjYWxlciBQcmVzY2FsZXIgdmFsdWUKKyAgKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9FVkVOVFBSRVNDQUxFUl9ESVYxOiBmRUVWUz1mSFJUSU0KKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9FVkVOVFBSRVNDQUxFUl9ESVYyOiBmRUVWUz1mSFJUSU0gLyAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fRVZFTlRQUkVTQ0FMRVJfRElWNDogZkVFVlM9ZkhSVElNIC8gNAorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0VWRU5UUFJFU0NBTEVSX0RJVjg6IGZFRVZTPWZIUlRJTSAvIDgKKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBzdGFydGluZyB0aGUgdGltZXIKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9FdmVudFByZXNjYWxlckNvbmZpZyhIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFByZXNjYWxlcikKK3sKKyAgdWludDMyX3QgaHJ0aW1fZWVjcjM7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fRVZFTlRQUkVTQ0FMRVIoUHJlc2NhbGVyKSk7CisgIAorICBpZihoaHJ0aW0tPlN0YXRlID09IEhBTF9IUlRJTV9TVEFURV9CVVNZKQorICB7CisgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGhydGltKTsKKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfQlVTWTsKKworICAvKiBTZXQgdGhlIGV4dGVybmFsIGV2ZW50IHByZXNjYWxlciAqLworICBocnRpbV9lZWNyMyA9IGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLkVFQ1IzOworICBocnRpbV9lZWNyMyAmPSB+KEhSVElNX0VFQ1IzX0VFVlNEKTsKKyAgaHJ0aW1fZWVjcjMgfD0gUHJlc2NhbGVyOworICAKKyAgLyogVXBkYXRlIHRoZSBIUlRJTSByZWdpc3RlcnMgKi8KKyAgaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuRUVDUjMgPSBocnRpbV9lZWNyMzsKKworICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX1JFQURZOworICAKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGhydGltKTsgIAorCisgIHJldHVybiBIQUxfT0s7IAorfQorIAorLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBjb25kaXRpb25pbmcgb2YgZmF1bHQgaW5wdXQKKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIEZhdWx0IGZhdWx0IGlucHV0IHRvIGNvbmZpZ3VyZQorICAqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0ZBVUxUXzE6IEZhdWx0IGlucHV0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9GQVVMVF8yOiBGYXVsdCBpbnB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fRkFVTFRfMzogRmF1bHQgaW5wdXQgMworICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0ZBVUxUXzQ6IEZhdWx0IGlucHV0IDQKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9GQVVMVF81OiBGYXVsdCBpbnB1dCA1CisgICogQHBhcmFtICBwRmF1bHRDZmcgcG9pbnRlciB0byB0aGUgZmF1bHQgY29uZGl0aW9uaW5nIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgc3RhcnRpbmcgdGhlIHRpbWVyIGFuZCBiZWZvcmUKKyAgKiAgICAgICBlbmFibGluZyBmYXVsdHMgaW5wdXRzCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fRmF1bHRDb25maWcoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBGYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9GYXVsdENmZ1R5cGVEZWYqIHBGYXVsdENmZykKK3sKKyAgdWludDMyX3QgaHJ0aW1fZmx0aW5yMTsKKyAgdWludDMyX3QgaHJ0aW1fZmx0aW5yMjsKKyAgCisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX0ZBVUxUKEZhdWx0KSk7CisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9GQVVMVFNPVVJDRShwRmF1bHRDZmctPlNvdXJjZSkpOworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fRkFVTFRQT0xBUklUWShwRmF1bHRDZmctPlBvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9GQVVMVEZJTFRFUihwRmF1bHRDZmctPkZpbHRlcikpOworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fRkFVTFRMT0NLKHBGYXVsdENmZy0+TG9jaykpOworICAKKyAgaWYoaGhydGltLT5TdGF0ZSA9PSBIQUxfSFJUSU1fU1RBVEVfQlVTWSkKKyAgeworICAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhocnRpbSk7CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX0JVU1k7CisKKyAgLyogQ29uZmlndXJlIGZhdWx0IGNoYW5uZWwgKi8KKyAgaHJ0aW1fZmx0aW5yMSA9IGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLkZMVElOUjE7CisgIGhydGltX2ZsdGlucjIgPSBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5GTFRJTlIyOworIAorICBzd2l0Y2ggKEZhdWx0KQorICB7CisgIGNhc2UgSFJUSU1fRkFVTFRfMToKKyAgICB7CisgICAgICBocnRpbV9mbHRpbnIxICY9IH4oSFJUSU1fRkxUSU5SMV9GTFQxUCB8IEhSVElNX0ZMVElOUjFfRkxUMVNSQyB8IEhSVElNX0ZMVElOUjFfRkxUMUYgfCBIUlRJTV9GTFRJTlIxX0ZMVDFMQ0spOworICAgICAgaHJ0aW1fZmx0aW5yMSB8PSBwRmF1bHRDZmctPlBvbGFyaXR5OworICAgICAgaHJ0aW1fZmx0aW5yMSB8PSBwRmF1bHRDZmctPlNvdXJjZTsKKyAgICAgIGhydGltX2ZsdGlucjEgfD0gcEZhdWx0Q2ZnLT5GaWx0ZXI7CisgICAgICBocnRpbV9mbHRpbnIxIHw9IHBGYXVsdENmZy0+TG9jazsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fRkFVTFRfMjoKKyAgICB7CisgICAgICBocnRpbV9mbHRpbnIxICY9IH4oSFJUSU1fRkxUSU5SMV9GTFQyUCB8IEhSVElNX0ZMVElOUjFfRkxUMlNSQyB8IEhSVElNX0ZMVElOUjFfRkxUMkYgfCBIUlRJTV9GTFRJTlIxX0ZMVDJMQ0spOworICAgICAgaHJ0aW1fZmx0aW5yMSB8PSAocEZhdWx0Q2ZnLT5Qb2xhcml0eSA8PCA4VSk7CisgICAgICBocnRpbV9mbHRpbnIxIHw9IHBGYXVsdENmZy0+U291cmNlIDw8IEhSVElNX0ZMVElOUjFfRkxUMlNSQ19Qb3M7CisgICAgICBocnRpbV9mbHRpbnIxIHw9IChwRmF1bHRDZmctPkZpbHRlciA8PCA4VSk7CisgICAgICBocnRpbV9mbHRpbnIxIHw9IChwRmF1bHRDZmctPkxvY2sgPDwgOFUpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9GQVVMVF8zOgorICAgIHsKKyAgICAgIGhydGltX2ZsdGlucjEgJj0gfihIUlRJTV9GTFRJTlIxX0ZMVDNQIHwgSFJUSU1fRkxUSU5SMV9GTFQzU1JDIHwgSFJUSU1fRkxUSU5SMV9GTFQzRiB8IEhSVElNX0ZMVElOUjFfRkxUM0xDSyk7CisgICAgICBocnRpbV9mbHRpbnIxIHw9IChwRmF1bHRDZmctPlBvbGFyaXR5IDw8IDE2VSk7CisgICAgICBocnRpbV9mbHRpbnIxIHw9IHBGYXVsdENmZy0+U291cmNlIDw8IEhSVElNX0ZMVElOUjFfRkxUM1NSQ19Qb3M7CisgICAgICBocnRpbV9mbHRpbnIxIHw9IChwRmF1bHRDZmctPkZpbHRlciA8PCAxNlUpOworICAgICAgaHJ0aW1fZmx0aW5yMSB8PSAocEZhdWx0Q2ZnLT5Mb2NrIDw8IDE2VSk7CisgICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9GQVVMVF80OgorICAgIHsKKyAgICAgIGhydGltX2ZsdGlucjEgJj0gfihIUlRJTV9GTFRJTlIxX0ZMVDRQIHwgSFJUSU1fRkxUSU5SMV9GTFQ0U1JDIHwgSFJUSU1fRkxUSU5SMV9GTFQ0RiB8IEhSVElNX0ZMVElOUjFfRkxUNExDSyk7CisgICAgICBocnRpbV9mbHRpbnIxIHw9IChwRmF1bHRDZmctPlBvbGFyaXR5IDw8IDI0VSk7CisgICAgICBocnRpbV9mbHRpbnIxIHw9IHBGYXVsdENmZy0+U291cmNlIDw8IEhSVElNX0ZMVElOUjFfRkxUNFNSQ19Qb3M7CisgICAgICBocnRpbV9mbHRpbnIxIHw9IChwRmF1bHRDZmctPkZpbHRlciA8PCAyNFUpOworICAgICAgaHJ0aW1fZmx0aW5yMSB8PSAocEZhdWx0Q2ZnLT5Mb2NrIDw8IDI0VSk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEhSVElNX0ZBVUxUXzU6CisgICAgeworICAgICAgaHJ0aW1fZmx0aW5yMiAmPSB+KEhSVElNX0ZMVElOUjJfRkxUNVAgfCBIUlRJTV9GTFRJTlIyX0ZMVDVTUkMgfCBIUlRJTV9GTFRJTlIyX0ZMVDVGIHwgSFJUSU1fRkxUSU5SMl9GTFQ1TENLKTsKKyAgICAgIGhydGltX2ZsdGlucjIgfD0gcEZhdWx0Q2ZnLT5Qb2xhcml0eTsKKyAgICAgIGhydGltX2ZsdGlucjEgfD0gcEZhdWx0Q2ZnLT5Tb3VyY2UgPDwgSFJUSU1fRkxUSU5SMl9GTFQ1U1JDX1BvczsKKyAgICAgIGhydGltX2ZsdGlucjIgfD0gcEZhdWx0Q2ZnLT5GaWx0ZXI7CisgICAgICBocnRpbV9mbHRpbnIyIHw9IHBGYXVsdENmZy0+TG9jazsKKyAgICB9CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KKworICAvKiBVcGRhdGUgdGhlIEhSVElNIHJlZ2lzdGVycyAqLworICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5GTFRJTlIxID0gaHJ0aW1fZmx0aW5yMTsKKyAgaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuRkxUSU5SMiA9IGhydGltX2ZsdGlucjI7CisKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9SRUFEWTsKKyAgCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhocnRpbSk7ICAKKworICByZXR1cm4gSEFMX09LOyAKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBmYXVsdCBjb25kaXRpb25pbmcgYmxvY2sgcHJlc2NhbGVyCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBQcmVzY2FsZXIgUHJlc2NhbGVyIHZhbHVlCisgICogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fRkFVTFRQUkVTQ0FMRVJfRElWMTogZkZMVFM9ZkhSVElNCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fRkFVTFRQUkVTQ0FMRVJfRElWMjogZkZMVFM9ZkhSVElNIC8gMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0ZBVUxUUFJFU0NBTEVSX0RJVjQ6IGZGTFRTPWZIUlRJTSAvIDQKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9GQVVMVFBSRVNDQUxFUl9ESVY4OiBmRkxUUz1mSFJUSU0gLyA4CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgc3RhcnRpbmcgdGhlIHRpbWVyIGFuZCBiZWZvcmUKKyAgKiAgICAgICBlbmFibGluZyBmYXVsdHMgaW5wdXRzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fRmF1bHRQcmVzY2FsZXJDb25maWcoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQcmVzY2FsZXIpCit7CisgIHVpbnQzMl90IGhydGltX2ZsdGlucjI7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fRkFVTFRQUkVTQ0FMRVIoUHJlc2NhbGVyKSk7CisgIAorICBpZihoaHJ0aW0tPlN0YXRlID09IEhBTF9IUlRJTV9TVEFURV9CVVNZKQorICB7CisgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGhydGltKTsKKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfQlVTWTsKKworICAvKiBTZXQgdGhlIGV4dGVybmFsIGV2ZW50IHByZXNjYWxlciAqLworICBocnRpbV9mbHRpbnIyID0gaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuRkxUSU5SMjsKKyAgaHJ0aW1fZmx0aW5yMiAmPSB+KEhSVElNX0ZMVElOUjJfRkxUU0QpOworICBocnRpbV9mbHRpbnIyIHw9IFByZXNjYWxlcjsKKyAgCisgIC8qIFVwZGF0ZSB0aGUgSFJUSU0gcmVnaXN0ZXJzICovCisgIGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLkZMVElOUjIgPSBocnRpbV9mbHRpbnIyOworCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfUkVBRFk7CisgIAorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaHJ0aW0pOyAgCisKKyAgcmV0dXJuIEhBTF9PSzsgCit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgSFJUSU14IEZhdWx0IG1vZGUuCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBGYXVsdHMgZmF1bHQgaW5wdXQocykgdG8gZW5hYmxlIG9yIGRpc2FibGUKKyAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0ZBVUxUXzE6IEZhdWx0IGlucHV0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9GQVVMVF8yOiBGYXVsdCBpbnB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fRkFVTFRfMzogRmF1bHQgaW5wdXQgMworICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0ZBVUxUXzQ6IEZhdWx0IGlucHV0IDQKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9GQVVMVF81OiBGYXVsdCBpbnB1dCA1CisgICogQHBhcmFtICBFbmFibGUgRmF1bHQocykgZW5hYmxpbmcKKyAgKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9GQVVMVE1PREVDVExfRU5BQkxFRDogRmF1bHQocykgZW5hYmxlZAorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0ZBVUxUTU9ERUNUTF9ESVNBQkxFRDogRmF1bHQocykgZGlzYWJsZWQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0hSVElNX0ZhdWx0TW9kZUN0bChIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEZhdWx0cywgCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBFbmFibGUpCit7CisgIHVpbnQzMl90IGhydGltX2ZsdGlucjE7CisgIHVpbnQzMl90IGhydGltX2ZsdGlucjI7CisgIAorICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9GQVVMVChGYXVsdHMpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX0ZBVUxUTU9ERUNUTChFbmFibGUpKTsKKworICAvKiBDb25maWd1cmUgZmF1bHQgY2hhbm5lbCAqLworICBocnRpbV9mbHRpbnIxID0gaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuRkxUSU5SMTsKKyAgaHJ0aW1fZmx0aW5yMiA9IGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLkZMVElOUjI7CisgIAorICBpZiAoKEZhdWx0cyAmIEhSVElNX0ZBVUxUXzEpICE9IFJFU0VUKQorICB7CisgICAgaHJ0aW1fZmx0aW5yMSAmPSB+SFJUSU1fRkxUSU5SMV9GTFQxRTsKKyAgICBocnRpbV9mbHRpbnIxIHw9IEVuYWJsZTsKKyAgfQorICBpZiAoKEZhdWx0cyAmIEhSVElNX0ZBVUxUXzIpICE9IFJFU0VUKQorICB7CisgICAgaHJ0aW1fZmx0aW5yMSAmPSB+SFJUSU1fRkxUSU5SMV9GTFQyRTsKKyAgICBocnRpbV9mbHRpbnIxIHw9IChFbmFibGUgPDwgOFUpOworICB9CisgIGlmICgoRmF1bHRzICYgSFJUSU1fRkFVTFRfMykgIT0gUkVTRVQpCisgIHsKKyAgICBocnRpbV9mbHRpbnIxICY9IH5IUlRJTV9GTFRJTlIxX0ZMVDNFOworICAgIGhydGltX2ZsdGlucjEgfD0gKEVuYWJsZSA8PCAxNlUpOworICB9CisgIGlmICgoRmF1bHRzICYgSFJUSU1fRkFVTFRfNCkgIT0gUkVTRVQpCisgIHsKKyAgICBocnRpbV9mbHRpbnIxICY9IH5IUlRJTV9GTFRJTlIxX0ZMVDRFOyAKKyAgICBocnRpbV9mbHRpbnIxIHw9IChFbmFibGUgPDwgMjRVKTsKKyAgfQorICBpZiAoKEZhdWx0cyAmIEhSVElNX0ZBVUxUXzUpICE9IFJFU0VUKQorICB7CisgICAgaHJ0aW1fZmx0aW5yMiAmPSB+SFJUSU1fRkxUSU5SMl9GTFQ1RTsKKyAgICBocnRpbV9mbHRpbnIyIHw9IEVuYWJsZTsKKyAgfQorCisgIC8qIFVwZGF0ZSB0aGUgSFJUSU14IHJlZ2lzdGVycyAqLworICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5GTFRJTlIxID0gaHJ0aW1fZmx0aW5yMTsKKyAgaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuRkxUSU5SMiA9IGhydGltX2ZsdGlucjI7Cit9ICAgICAgCisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyBib3RoIHRoZSBBREMgdHJpZ2dlciByZWdpc3RlciB1cGRhdGUgc291cmNlIGFuZCB0aGUgQURDCisgICogICAgICAgICB0cmlnZ2VyIHNvdXJjZS4KKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIEFEQ1RyaWdnZXIgQURDIHRyaWdnZXIgdG8gY29uZmlndXJlCisgICogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fQURDVFJJR0dFUl8xOiBBREMgdHJpZ2dlciAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fQURDVFJJR0dFUl8yOiBBREMgdHJpZ2dlciAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fQURDVFJJR0dFUl8zOiBBREMgdHJpZ2dlciAzCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fQURDVFJJR0dFUl80OiBBREMgdHJpZ2dlciA0CisgICogQHBhcmFtICBwQURDVHJpZ2dlckNmZyBwb2ludGVyIHRvIHRoZSBBREMgdHJpZ2dlciBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHN0YXJ0aW5nIHRoZSB0aW1lcgorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX0FEQ1RyaWdnZXJDb25maWcoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEFEQ1RyaWdnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9BRENUcmlnZ2VyQ2ZnVHlwZURlZiogcEFEQ1RyaWdnZXJDZmcpCit7CisgIHVpbnQzMl90IGhydGltX2NyMTsKKyAgCisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX0FEQ1RSSUdHRVIoQURDVHJpZ2dlcikpOworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fQURDVFJJR0dFUlVQREFURShwQURDVHJpZ2dlckNmZy0+VXBkYXRlU291cmNlKSk7CisgIAorICBpZihoaHJ0aW0tPlN0YXRlID09IEhBTF9IUlRJTV9TVEFURV9CVVNZKQorICB7CisgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGhydGltKTsKKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfQlVTWTsKKworICAvKiBTZXQgdGhlIEFEQyB0cmlnZ2VyIHVwZGF0ZSBzb3VyY2UgKi8KKyAgaHJ0aW1fY3IxID0gaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuQ1IxOworCisgIHN3aXRjaCAoQURDVHJpZ2dlcikKKyAgeworICBjYXNlIEhSVElNX0FEQ1RSSUdHRVJfMToKKyAgICB7CisgICAgICBocnRpbV9jcjEgJj0gfihIUlRJTV9DUjFfQURDMVVTUkMpOworICAgICAgaHJ0aW1fY3IxIHw9IChwQURDVHJpZ2dlckNmZy0+VXBkYXRlU291cmNlICYgSFJUSU1fQ1IxX0FEQzFVU1JDKTsKKyAgICAgIAorICAgICAgLyogU2V0IHRoZSBBREMgdHJpZ2dlciAxIHNvdXJjZSAqLworICAgICAgaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuQURDMVIgPSBwQURDVHJpZ2dlckNmZy0+VHJpZ2dlcjsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fQURDVFJJR0dFUl8yOgorICAgIHsKKyAgICAgIGhydGltX2NyMSAmPSB+KEhSVElNX0NSMV9BREMyVVNSQyk7CisgICAgICBocnRpbV9jcjEgfD0gKChwQURDVHJpZ2dlckNmZy0+VXBkYXRlU291cmNlIDw8IDNVKSAmIEhSVElNX0NSMV9BREMyVVNSQyk7IAorCisgICAgICAvKiBTZXQgdGhlIEFEQyB0cmlnZ2VyIDIgc291cmNlICovCisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5BREMyUiA9IHBBRENUcmlnZ2VyQ2ZnLT5UcmlnZ2VyOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9BRENUUklHR0VSXzM6CisgICAgeworICAgICAgaHJ0aW1fY3IxICY9IH4oSFJUSU1fQ1IxX0FEQzNVU1JDKTsKKyAgICAgIGhydGltX2NyMSB8PSAoKHBBRENUcmlnZ2VyQ2ZnLT5VcGRhdGVTb3VyY2UgPDwgNlUpICYgSFJUSU1fQ1IxX0FEQzNVU1JDKTsgCisgICAgICAKKyAgICAgIC8qIFNldCB0aGUgQURDIHRyaWdnZXIgMyBzb3VyY2UgKi8KKyAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLkFEQzNSID0gcEFEQ1RyaWdnZXJDZmctPlRyaWdnZXI7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEhSVElNX0FEQ1RSSUdHRVJfNDoKKyAgICB7CisgICAgICBocnRpbV9jcjEgJj0gfihIUlRJTV9DUjFfQURDNFVTUkMpOworICAgICAgaHJ0aW1fY3IxIHw9ICgocEFEQ1RyaWdnZXJDZmctPlVwZGF0ZVNvdXJjZSA8PCA5VSkgJiBIUlRJTV9DUjFfQURDNFVTUkMpOyAKKyAgICAgIAorICAgICAgLyogU2V0IHRoZSBBREMgdHJpZ2dlciA0IHNvdXJjZSAqLworICAgICAgaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuQURDNFIgPSBwQURDVHJpZ2dlckNmZy0+VHJpZ2dlcjsKKyAgICB9CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KKyAgCisgIC8qIFVwZGF0ZSB0aGUgSFJUSU0gcmVnaXN0ZXJzICovCisgIGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLkNSMSA9IGhydGltX2NyMTsKKworICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX1JFQURZOworICAKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGhydGltKTsgIAorCisgIHJldHVybiBIQUxfT0s7IAorfQorCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFJUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwOCBUaW1lciB3YXZlZm9ybSBjb25maWd1cmF0aW9uIGFuZCBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgSFJUSU0gdGltZXIgY29uZmlndXJhdGlvbiBhbmQgY29udHJvbCBmdW5jdGlvbnMKK0B2ZXJiYXRpbSAgICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEhSVElNIHRpbWVyIGNvbmZpZ3VyYXRpb24gYW5kIGNvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgdXNlZCB0byBjb25maWd1cmUgYW5kIGNvbnRyb2wgYSAKKyAgICAgICAgICBIUlRJTSB0aW1lciBvcGVyYXRpbmcgaW4gd2F2ZWZvcm0gbW9kZToKKyAgICAgICgrKSBDb25maWd1cmUgSFJUSU0gdGltZXIgZ2VuZXJhbCBiZWhhdmlvcgorICAgICAgKCspIENvbmZpZ3VyZSBIUlRJTSB0aW1lciBldmVudCBmaWx0ZXJpbmcKKyAgICAgICgrKSBDb25maWd1cmUgSFJUSU0gdGltZXIgZGVhZHRpbWUgaW5zZXJ0aW9uIAorICAgICAgKCspIENvbmZpZ3VyZSBIUlRJTSB0aW1lciBjaG9wcGVyIG1vZGUgIAorICAgICAgKCspIENvbmZpZ3VyZSBIUlRJTSB0aW1lciBidXJzdCBETUEgCisgICAgICAoKykgQ29uZmlndXJlIEhSVElNIHRpbWVyIGNvbXBhcmUgdW5pdAorICAgICAgKCspIENvbmZpZ3VyZSBIUlRJTSB0aW1lciBjYXB0dXJlIHVuaXQgCisgICAgICAoKykgQ29uZmlndXJlIEhSVElNIHRpbWVyIG91dHB1dCAKKyAgICAgICgrKSBTZXQgSFJUSU0gdGltZXIgb3V0cHV0IGxldmVsCisgICAgICAoKykgRW5hYmxlIEhSVElNIHRpbWVyIG91dHB1dAorICAgICAgKCspIERpc2FibGUgSFJUSU0gdGltZXIgb3V0cHV0CisgICAgICAoKykgU3RhcnQgSFJUSU0gdGltZXIKKyAgICAgICgrKSBTdG9wIEhSVElNIHRpbWVyCisgICAgICAoKykgU3RhcnQgSFJUSU0gdGltZXIgYW5kIGVuYWJsZSBpbnRlcnJ1cHQgCisgICAgICAoKykgU3RvcCBIUlRJTSB0aW1lciBhbmQgZGlzYWJsZSBpbnRlcnJ1cHQKKyAgICAgICgrKSBTdGFydCBIUlRJTSB0aW1lciBhbmQgZW5hYmxlIERNQSB0cmFuc2ZlciAgCisgICAgICAoKykgU3RvcCBIUlRJTSB0aW1lciBhbmQgZGlzYWJsZSBETUEgdHJhbnNmZXIgIAorICAgICAgKCspIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBidXJzdCBtb2RlIGNvbnRyb2xsZXIgIAorICAgICAgKCspIFN0YXJ0IHRoZSBidXJzdCBtb2RlIGNvbnRyb2xsZXIgKGJ5IHNvZnR3YXJlKQorICAgICAgKCspIFRyaWdnZXIgYSBDYXB0dXJlIChieSBzb2Z0d2FyZSkKKyAgICAgICgrKSBVcGRhdGUgdGhlIEhSVElNIHRpbWVyIHByZWxvYWRhYmxlIHJlZ2lzdGVycyAoYnkgc29mdHdhcmUpCisgICAgICAoKykgUmVzZXQgdGhlIEhSVElNIHRpbWVyIGNvdW50ZXIgKGJ5IHNvZnR3YXJlKQorICAgICAgKCspIFN0YXJ0IGEgYnVyc3QgRE1BIHRyYW5zZmVyCisgICAgICAoKykgRW5hYmxlIHRpbWVyIHJlZ2lzdGVyIHVwZGF0ZQorICAgICAgKCspIERpc2FibGUgdGltZXIgcmVnaXN0ZXIgdXBkYXRlCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgZ2VuZXJhbCBiZWhhdmlvciBvZiBhIHRpbWVyIG9wZXJhdGluZyBpbiB3YXZlZm9ybSBtb2RlIAorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZXJJZHggVGltZXIgaW5kZXgKKyAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9NQVNURVIgIGZvciBtYXN0ZXIgdGltZXIKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICogQHBhcmFtICBwVGltZXJDZmcgcG9pbnRlciB0byB0aGUgdGltZXIgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAgKiBAbm90ZSBXaGVuIHRoZSB0aW1lciBvcGVyYXRlcyBpbiB3YXZlZm9ybSBtb2RlLCBhbGwgdGhlIGZlYXR1cmVzIHN1cHBvcnRlZCBieQorICAqICAgICAgIHRoZSBIUlRJTSBhcmUgYXZhaWxhYmxlIHdpdGhvdXQgYW55IGxpbWl0YXRpb24uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgc3RhcnRpbmcgdGhlIHRpbWVyCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fV2F2ZWZvcm1UaW1lckNvbmZpZyhIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9UaW1lckNmZ1R5cGVEZWYgKiBwVGltZXJDZmcpCit7CisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTUVSSU5ERVgoVGltZXJJZHgpKTsKKyAgCisgIC8qIFJlbGV2YW50IGZvciBhbGwgSFJUSU0gdGltZXJzLCBpbmNsdWRpbmcgdGhlIG1hc3RlciAqLworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fSEFMRk1PREUocFRpbWVyQ2ZnLT5IYWxmTW9kZUVuYWJsZSkpOworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fU1lOQ1NUQVJUKHBUaW1lckNmZy0+U3RhcnRPblN5bmMpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1NZTkNSRVNFVChwVGltZXJDZmctPlJlc2V0T25TeW5jKSk7CisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9EQUNTWU5DKHBUaW1lckNmZy0+REFDU3luY2hybykpOworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fUFJFTE9BRChwVGltZXJDZmctPlByZWxvYWRFbmFibGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTUVSQlVSU1RNT0RFKHBUaW1lckNmZy0+QnVyc3RNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9VUERBVEVPTlJFUEVUSVRJT04ocFRpbWVyQ2ZnLT5SZXBldGl0aW9uVXBkYXRlKSk7CisgIAorICBpZihoaHJ0aW0tPlN0YXRlID09IEhBTF9IUlRJTV9TVEFURV9CVVNZKQorICB7CisgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGhydGltKTsKKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfQlVTWTsKKyAgCisgIGlmIChUaW1lcklkeCA9PSBIUlRJTV9USU1FUklOREVYX01BU1RFUikKKyAgeworICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVVBEQVRFR0FUSU5HX01BU1RFUihwVGltZXJDZmctPlVwZGF0ZUdhdGluZykpOworICAgIGFzc2VydF9wYXJhbShJU19IUlRJTV9NQVNURVJfSVQocFRpbWVyQ2ZnLT5JbnRlcnJ1cHRSZXF1ZXN0cykpOworICAgIGFzc2VydF9wYXJhbShJU19IUlRJTV9NQVNURVJfRE1BKHBUaW1lckNmZy0+RE1BUmVxdWVzdHMpKTsKKyAgICAKKyAgICAvKiBDb25maWd1cmUgbWFzdGVyIHRpbWVyICovCisgICAgSFJUSU1fTWFzdGVyV2F2ZWZvcm1fQ29uZmlnKGhocnRpbSwgcFRpbWVyQ2ZnKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1VQREFURUdBVElOR19USU0ocFRpbWVyQ2ZnLT5VcGRhdGVHYXRpbmcpKTsgIAorICAgIGFzc2VydF9wYXJhbShJU19IUlRJTV9USU1fSVQocFRpbWVyQ2ZnLT5JbnRlcnJ1cHRSZXF1ZXN0cykpOworICAgIGFzc2VydF9wYXJhbShJU19IUlRJTV9USU1fRE1BKHBUaW1lckNmZy0+RE1BUmVxdWVzdHMpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNUFVTSFBVTExNT0RFKHBUaW1lckNmZy0+UHVzaFB1bGwpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNRkFVTFRFTkFCTEUocFRpbWVyQ2ZnLT5GYXVsdEVuYWJsZSkpOworICAgIGFzc2VydF9wYXJhbShJU19IUlRJTV9USU1GQVVMVExPQ0socFRpbWVyQ2ZnLT5GYXVsdExvY2spKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNREVBRFRJTUVJTlNFUlRJT04ocFRpbWVyQ2ZnLT5QdXNoUHVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRpbWVyQ2ZnLT5EZWFkVGltZUluc2VydGlvbikpOworICAgIGFzc2VydF9wYXJhbShJU19IUlRJTV9USU1ERUxBWUVEUFJPVEVDVElPTihwVGltZXJDZmctPlB1c2hQdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGltZXJDZmctPkRlbGF5ZWRQcm90ZWN0aW9uTW9kZSkpOworICAgIGFzc2VydF9wYXJhbShJU19IUlRJTV9USU1VUERBVEVUUklHR0VSKHBUaW1lckNmZy0+VXBkYXRlVHJpZ2dlcikpOyAKKyAgICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNUkVTRVRUUklHR0VSKHBUaW1lckNmZy0+UmVzZXRUcmlnZ2VyKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTVVQREFURU9OUkVTRVQocFRpbWVyQ2ZnLT5SZXNldFVwZGF0ZSkpOworCisgICAgLyogQ29uZmlndXJlIHRpbWluZyB1bml0ICovCisgICAgSFJUSU1fVGltaW5nVW5pdFdhdmVmb3JtX0NvbmZpZyhoaHJ0aW0sIFRpbWVySWR4LCBwVGltZXJDZmcpOworICB9CisgIAorICAvKiBVcGRhdGUgdGltZXIgcGFyYW1ldGVycyAqLworICBoaHJ0aW0tPlRpbWVyUGFyYW1bVGltZXJJZHhdLkludGVycnVwdFJlcXVlc3RzID0gcFRpbWVyQ2ZnLT5JbnRlcnJ1cHRSZXF1ZXN0czsKKyAgaGhydGltLT5UaW1lclBhcmFtW1RpbWVySWR4XS5ETUFSZXF1ZXN0cyA9IHBUaW1lckNmZy0+RE1BUmVxdWVzdHM7CisgIGhocnRpbS0+VGltZXJQYXJhbVtUaW1lcklkeF0uRE1BU3JjQWRkcmVzcyA9IHBUaW1lckNmZy0+RE1BU3JjQWRkcmVzczsKKyAgaGhydGltLT5UaW1lclBhcmFtW1RpbWVySWR4XS5ETUFEc3RBZGRyZXNzID0gcFRpbWVyQ2ZnLT5ETUFEc3RBZGRyZXNzOworICBoaHJ0aW0tPlRpbWVyUGFyYW1bVGltZXJJZHhdLkRNQVNpemUgPSBwVGltZXJDZmctPkRNQVNpemU7CisKKyAgLyogRm9yY2UgYSBzb2Z0d2FyZSB1cGRhdGUgKi8KKyAgSFJUSU1fRm9yY2VSZWdpc3RlcnNVcGRhdGUoaGhydGltLCBUaW1lcklkeCk7CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX1JFQURZOworICAKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGhydGltKTsgIAorCisgIHJldHVybiBIQUxfT0s7IAorfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIGV2ZW50IGZpbHRlcmluZyBjYXBhYmlsaXRpZXMgb2YgYSB0aW1lciAoYmxhbmtpbmcsIHdpbmRvd2luZykgCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBUaW1lcklkeCBUaW1lciBpbmRleAorICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0EgZm9yIHRpbWVyIEEKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQiBmb3IgdGltZXIgQgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9DIGZvciB0aW1lciBDCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0QgZm9yIHRpbWVyIEQKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRSBmb3IgdGltZXIgRQorICAqIEBwYXJhbSAgRXZlbnQgZXh0ZXJuYWwgZXZlbnQgZm9yIHdoaWNoIHRpbWVyIGV2ZW50IGZpbHRlcmluZyBtdXN0IGJlIGNvbmZpZ3VyZWQKKyAgKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9FVkVOVF8xOiBFeHRlcm5hbCBldmVudCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fRVZFTlRfMjogRXh0ZXJuYWwgZXZlbnQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0VWRU5UXzM6IEV4dGVybmFsIGV2ZW50IDMKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9FVkVOVF80OiBFeHRlcm5hbCBldmVudCA0CisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fRVZFTlRfNTogRXh0ZXJuYWwgZXZlbnQgNQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0VWRU5UXzY6IEV4dGVybmFsIGV2ZW50IDYKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9FVkVOVF83OiBFeHRlcm5hbCBldmVudCA3CisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fRVZFTlRfODogRXh0ZXJuYWwgZXZlbnQgOAorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0VWRU5UXzk6IEV4dGVybmFsIGV2ZW50IDkKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9FVkVOVF8xMDogRXh0ZXJuYWwgZXZlbnQgMTAKKyAgKiBAcGFyYW0gIHBUaW1lckV2ZW50RmlsdGVyaW5nQ2ZnIHBvaW50ZXIgdG8gdGhlIHRpbWVyIGV2ZW50IGZpbHRlcmluZyBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHN0YXJ0aW5nIHRoZSB0aW1lcgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1RpbWVyRXZlbnRGaWx0ZXJpbmdDb25maWcoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9UaW1lckV2ZW50RmlsdGVyaW5nQ2ZnVHlwZURlZiogcFRpbWVyRXZlbnRGaWx0ZXJpbmdDZmcpCit7CisgIHVpbnQzMl90IGhydGltX2VlZnI7CisgIAorICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9USU1JTkdfVU5JVChUaW1lcklkeCkpOworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fRVZFTlQoRXZlbnQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTUVWRU5URklMVEVSKHBUaW1lckV2ZW50RmlsdGVyaW5nQ2ZnLT5GaWx0ZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTUVWRU5UTEFUQ0gocFRpbWVyRXZlbnRGaWx0ZXJpbmdDZmctPkxhdGNoKSk7CisgIAorICBpZihoaHJ0aW0tPlN0YXRlID09IEhBTF9IUlRJTV9TVEFURV9CVVNZKQorICB7CisgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGhydGltKTsKKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfQlVTWTsKKworICAvKiBDb25maWd1cmUgdGltZXIgZXZlbnQgZmlsdGVyaW5nIGNhcGFiaWxpdGllcyAqLworICBzd2l0Y2ggKEV2ZW50KQorICB7CisgIGNhc2UgSFJUSU1fRVZFTlRfTk9ORToKKyAgICB7CisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uRUVGeFIxID0gMFU7CisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uRUVGeFIyID0gMFU7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEhSVElNX0VWRU5UXzE6CisgICAgeworICAgICAgaHJ0aW1fZWVmciA9IGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5FRUZ4UjE7CisgICAgICBocnRpbV9lZWZyICY9IH4oSFJUSU1fRUVGUjFfRUUxRkxUUiB8IEhSVElNX0VFRlIxX0VFMUxUQ0gpOworICAgICAgaHJ0aW1fZWVmciB8PSAocFRpbWVyRXZlbnRGaWx0ZXJpbmdDZmctPkZpbHRlciB8IHBUaW1lckV2ZW50RmlsdGVyaW5nQ2ZnLT5MYXRjaCk7CisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uRUVGeFIxID0gaHJ0aW1fZWVmcjsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fRVZFTlRfMjoKKyAgICB7CisgICAgICBocnRpbV9lZWZyID0gaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLkVFRnhSMTsKKyAgICAgIGhydGltX2VlZnIgJj0gfihIUlRJTV9FRUZSMV9FRTJGTFRSIHwgSFJUSU1fRUVGUjFfRUUyTFRDSCk7CisgICAgICBocnRpbV9lZWZyIHw9ICgocFRpbWVyRXZlbnRGaWx0ZXJpbmdDZmctPkZpbHRlciB8IHBUaW1lckV2ZW50RmlsdGVyaW5nQ2ZnLT5MYXRjaCkgPDwgNlUpOworICAgICAgaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLkVFRnhSMSA9IGhydGltX2VlZnI7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEhSVElNX0VWRU5UXzM6CisgICAgeworICAgICAgaHJ0aW1fZWVmciA9IGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5FRUZ4UjE7CisgICAgICBocnRpbV9lZWZyICY9IH4oSFJUSU1fRUVGUjFfRUUzRkxUUiB8IEhSVElNX0VFRlIxX0VFM0xUQ0gpOworICAgICAgaHJ0aW1fZWVmciB8PSAoKHBUaW1lckV2ZW50RmlsdGVyaW5nQ2ZnLT5GaWx0ZXIgfCBwVGltZXJFdmVudEZpbHRlcmluZ0NmZy0+TGF0Y2gpIDw8IDEyVSk7CisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uRUVGeFIxID0gaHJ0aW1fZWVmcjsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fRVZFTlRfNDoKKyAgICB7CisgICAgICBocnRpbV9lZWZyID0gaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLkVFRnhSMTsKKyAgICAgIGhydGltX2VlZnIgJj0gfihIUlRJTV9FRUZSMV9FRTRGTFRSIHwgSFJUSU1fRUVGUjFfRUU0TFRDSCk7CisgICAgICBocnRpbV9lZWZyIHw9ICgocFRpbWVyRXZlbnRGaWx0ZXJpbmdDZmctPkZpbHRlciB8IHBUaW1lckV2ZW50RmlsdGVyaW5nQ2ZnLT5MYXRjaCkgPDwgMThVKTsKKyAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5FRUZ4UjEgPSBocnRpbV9lZWZyOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9FVkVOVF81OgorICAgIHsKKyAgICAgIGhydGltX2VlZnIgPSBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uRUVGeFIxOworICAgICAgaHJ0aW1fZWVmciAmPSB+KEhSVElNX0VFRlIxX0VFNUZMVFIgfCBIUlRJTV9FRUZSMV9FRTVMVENIKTsKKyAgICAgIGhydGltX2VlZnIgfD0gKChwVGltZXJFdmVudEZpbHRlcmluZ0NmZy0+RmlsdGVyIHwgcFRpbWVyRXZlbnRGaWx0ZXJpbmdDZmctPkxhdGNoKSA8PCAyNFUpOworICAgICAgaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLkVFRnhSMSA9IGhydGltX2VlZnI7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEhSVElNX0VWRU5UXzY6CisgICAgeworICAgICAgaHJ0aW1fZWVmciA9IGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5FRUZ4UjI7CisgICAgICBocnRpbV9lZWZyICY9IH4oSFJUSU1fRUVGUjJfRUU2RkxUUiB8IEhSVElNX0VFRlIyX0VFNkxUQ0gpOworICAgICAgaHJ0aW1fZWVmciB8PSAocFRpbWVyRXZlbnRGaWx0ZXJpbmdDZmctPkZpbHRlciB8IHBUaW1lckV2ZW50RmlsdGVyaW5nQ2ZnLT5MYXRjaCk7CisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uRUVGeFIyID0gaHJ0aW1fZWVmcjsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fRVZFTlRfNzoKKyAgICB7CisgICAgICBocnRpbV9lZWZyID0gaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLkVFRnhSMjsKKyAgICAgIGhydGltX2VlZnIgJj0gfihIUlRJTV9FRUZSMl9FRTdGTFRSIHwgSFJUSU1fRUVGUjJfRUU3TFRDSCk7CisgICAgICBocnRpbV9lZWZyIHw9ICgocFRpbWVyRXZlbnRGaWx0ZXJpbmdDZmctPkZpbHRlciB8IHBUaW1lckV2ZW50RmlsdGVyaW5nQ2ZnLT5MYXRjaCkgPDwgNlUpOworICAgICAgaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLkVFRnhSMiA9IGhydGltX2VlZnI7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEhSVElNX0VWRU5UXzg6CisgICAgeworICAgICAgaHJ0aW1fZWVmciA9IGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5FRUZ4UjI7CisgICAgICBocnRpbV9lZWZyICY9IH4oSFJUSU1fRUVGUjJfRUU4RkxUUiB8IEhSVElNX0VFRlIyX0VFOExUQ0gpOworICAgICAgaHJ0aW1fZWVmciB8PSAoKHBUaW1lckV2ZW50RmlsdGVyaW5nQ2ZnLT5GaWx0ZXIgfCBwVGltZXJFdmVudEZpbHRlcmluZ0NmZy0+TGF0Y2gpIDw8IDEyVSk7CisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uRUVGeFIyID0gaHJ0aW1fZWVmcjsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fRVZFTlRfOToKKyAgICB7CisgICAgICBocnRpbV9lZWZyID0gaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLkVFRnhSMjsKKyAgICAgIGhydGltX2VlZnIgJj0gfihIUlRJTV9FRUZSMl9FRTlGTFRSIHwgSFJUSU1fRUVGUjJfRUU5TFRDSCk7CisgICAgICBocnRpbV9lZWZyIHw9ICgocFRpbWVyRXZlbnRGaWx0ZXJpbmdDZmctPkZpbHRlciB8IHBUaW1lckV2ZW50RmlsdGVyaW5nQ2ZnLT5MYXRjaCkgPDwgMThVKTsKKyAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5FRUZ4UjIgPSBocnRpbV9lZWZyOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9FVkVOVF8xMDoKKyAgICB7CisgICAgICBocnRpbV9lZWZyID0gaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLkVFRnhSMjsKKyAgICAgIGhydGltX2VlZnIgJj0gfihIUlRJTV9FRUZSMl9FRTEwRkxUUiB8IEhSVElNX0VFRlIyX0VFMTBMVENIKTsKKyAgICAgIGhydGltX2VlZnIgfD0gKChwVGltZXJFdmVudEZpbHRlcmluZ0NmZy0+RmlsdGVyIHwgcFRpbWVyRXZlbnRGaWx0ZXJpbmdDZmctPkxhdGNoKSA8PCAyNFUpOworICAgICAgaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLkVFRnhSMiA9IGhydGltX2VlZnI7CisgICAgfQorICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX1JFQURZOworICAKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGhydGltKTsgIAorCisgIHJldHVybiBIQUxfT0s7IAorfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIGRlYWR0aW1lIGluc2VydGlvbiBmZWF0dXJlIGZvciBhIHRpbWVyIAorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZXJJZHggVGltZXIgaW5kZXgKKyAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9BIGZvciB0aW1lciBBCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0IgZm9yIHRpbWVyIEIKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQyBmb3IgdGltZXIgQworICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9EIGZvciB0aW1lciBECisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0UgZm9yIHRpbWVyIEUKKyAgKiBAcGFyYW0gIHBEZWFkVGltZUNmZyBwb2ludGVyIHRvIHRoZSBkZWFkdGltZSBpbnNlcnRpb24gY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBzdGFydGluZyB0aGUgdGltZXIKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9EZWFkVGltZUNvbmZpZyhIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX0RlYWRUaW1lQ2ZnVHlwZURlZiogcERlYWRUaW1lQ2ZnKQoreworICB1aW50MzJfdCBocnRpbV9kdHI7CisgIAorICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9USU1JTkdfVU5JVChUaW1lcklkeCkpOworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNREVBRFRJTUVfUFJFU0NBTEVSUkFUSU8ocERlYWRUaW1lQ2ZnLT5QcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTURFQURUSU1FX1JJU0lOR1NJR04ocERlYWRUaW1lQ2ZnLT5SaXNpbmdTaWduKSk7CisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9USU1ERUFEVElNRV9SSVNJTkdMT0NLKHBEZWFkVGltZUNmZy0+UmlzaW5nTG9jaykpOworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNREVBRFRJTUVfUklTSU5HU0lHTkxPQ0socERlYWRUaW1lQ2ZnLT5SaXNpbmdTaWduTG9jaykpOworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNREVBRFRJTUVfRkFMTElOR1NJR04ocERlYWRUaW1lQ2ZnLT5GYWxsaW5nU2lnbikpOworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNREVBRFRJTUVfRkFMTElOR0xPQ0socERlYWRUaW1lQ2ZnLT5GYWxsaW5nTG9jaykpOworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNREVBRFRJTUVfRkFMTElOR1NJR05MT0NLKHBEZWFkVGltZUNmZy0+RmFsbGluZ1NpZ25Mb2NrKSk7CisgIAorICBpZihoaHJ0aW0tPlN0YXRlID09IEhBTF9IUlRJTV9TVEFURV9CVVNZKQorICB7CisgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGhydGltKTsKKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfQlVTWTsKKworICBocnRpbV9kdHIgPSBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uRFR4UjsKKyAgICAgCisgIC8qIENsZWFyIHRpbWVyIGRlYWR0aW1lIGNvbmZpZ3VyYXRpb24gKi8KKyAgaHJ0aW1fZHRyICY9IH4oSFJUSU1fRFRSX0RUUiB8IEhSVElNX0RUUl9TRFRSIHwgSFJUSU1fRFRSX0RUUFJTQyB8CisgICAgICAgICAgICAgICAgIEhSVElNX0RUUl9EVFJTTEsgfCBIUlRJTV9EVFJfRFRSTEsgfCBIUlRJTV9EVFJfRFRGIHwKKyAgICAgICAgICAgICAgICAgSFJUSU1fRFRSX1NEVEYgfCBIUlRJTV9EVFJfRFRGU0xLIHwgSFJUSU1fRFRSX0RURkxLKTsKKyAgCisgIC8qIFNldCB0aW1lciBkZWFkdGltZSBjb25maWd1cmF0aW9uICovCisgIGhydGltX2R0ciB8PSBwRGVhZFRpbWVDZmctPlByZXNjYWxlcjsKKyAgaHJ0aW1fZHRyIHw9IHBEZWFkVGltZUNmZy0+UmlzaW5nVmFsdWU7CisgIGhydGltX2R0ciB8PSBwRGVhZFRpbWVDZmctPlJpc2luZ1NpZ247CisgIGhydGltX2R0ciB8PSBwRGVhZFRpbWVDZmctPlJpc2luZ1NpZ25Mb2NrOworICBocnRpbV9kdHIgfD0gcERlYWRUaW1lQ2ZnLT5SaXNpbmdMb2NrOworICBocnRpbV9kdHIgfD0gKHBEZWFkVGltZUNmZy0+RmFsbGluZ1ZhbHVlIDw8IDE2VSk7CisgIGhydGltX2R0ciB8PSBwRGVhZFRpbWVDZmctPkZhbGxpbmdTaWduOworICBocnRpbV9kdHIgfD0gcERlYWRUaW1lQ2ZnLT5GYWxsaW5nU2lnbkxvY2s7CisgIGhydGltX2R0ciB8PSBwRGVhZFRpbWVDZmctPkZhbGxpbmdMb2NrOworICAgIAorICAvKiBVcGRhdGUgdGhlIEhSVElNIHJlZ2lzdGVycyAqLyAgCisgIGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5EVHhSID0gaHJ0aW1fZHRyOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9SRUFEWTsKKyAgCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhocnRpbSk7ICAKKworICByZXR1cm4gSEFMX09LOyAKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBjaG9wcGVyIG1vZGUgZmVhdHVyZSBmb3IgYSB0aW1lciAKKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVySWR4IFRpbWVyIGluZGV4CisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICogQHBhcmFtICBwQ2hvcHBlck1vZGVDZmcgcG9pbnRlciB0byB0aGUgY2hvcHBlciBtb2RlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY29uZmlndXJpbmcgdGhlIHRpbWVyIG91dHB1dChzKQorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX0Nob3BwZXJNb2RlQ29uZmlnKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fQ2hvcHBlck1vZGVDZmdUeXBlRGVmKiBwQ2hvcHBlck1vZGVDZmcpCit7CisgIHVpbnQzMl90IGhydGltX2NocHI7CisgIAorICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9USU1JTkdfVU5JVChUaW1lcklkeCkpOworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fQ0hPUFBFUl9QUkVTQ0FMRVJSQVRJTyhwQ2hvcHBlck1vZGVDZmctPkNhcnJpZXJGcmVxKSk7CisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9DSE9QUEVSX0RVVFlDWUNMRShwQ2hvcHBlck1vZGVDZmctPkR1dHlDeWNsZSkpOworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fQ0hPUFBFUl9QVUxTRVdJRFRIKHBDaG9wcGVyTW9kZUNmZy0+U3RhcnRQdWxzZSkpOworICAKKyAgaWYoaGhydGltLT5TdGF0ZSA9PSBIQUxfSFJUSU1fU1RBVEVfQlVTWSkKKyAgeworICAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhocnRpbSk7CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX0JVU1k7CisKKyAgaHJ0aW1fY2hwciA9IGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5DSFB4UjsKKyAgICAgCisgIC8qIENsZWFyIHRpbWVyIGNob3BwZXIgbW9kZSBjb25maWd1cmF0aW9uICovCisgIGhydGltX2NocHIgJj0gfihIUlRJTV9DSFBSX0NBUkZSUSB8IEhSVElNX0NIUFJfQ0FSRFRZIHwgSFJUSU1fQ0hQUl9TVFJQVyk7CisgIAorICAvKiBTZXQgdGltZXIgY2hvcHBlIG1vZGUgY29uZmlndXJhdGlvbiAqLworICBocnRpbV9jaHByIHw9IHBDaG9wcGVyTW9kZUNmZy0+Q2FycmllckZyZXE7CisgIGhydGltX2NocHIgfD0gKHBDaG9wcGVyTW9kZUNmZy0+RHV0eUN5Y2xlKTsKKyAgaHJ0aW1fY2hwciB8PSAocENob3BwZXJNb2RlQ2ZnLT5TdGFydFB1bHNlKTsKKyAgICAKKyAgLyogVXBkYXRlIHRoZSBIUlRJTSByZWdpc3RlcnMgKi8gIAorICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uQ0hQeFIgPSBocnRpbV9jaHByOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9SRUFEWTsKKyAgCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhocnRpbSk7ICAKKworICByZXR1cm4gSEFMX09LOyAKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBidXJzdCBETUEgY29udHJvbGxlciBmb3IgYSB0aW1lciAKKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVySWR4IFRpbWVyIGluZGV4CisgICogICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9NQVNURVIgIGZvciBtYXN0ZXIgdGltZXIKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICogQHBhcmFtICBSZWdpc3RlcnNUb1VwZGF0ZSByZWdpc3RlcnMgdG8gYmUgd3JpdHRlbiBieSBETUEKKyAgKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9CVVJTVERNQV9DUjogSFJUSU1fTUNSIG9yIEhSVElNX1RJTXhDUgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0JVUlNURE1BX0lDUjogSFJUSU1fTUlDUiBvciBIUlRJTV9USU14SUNSCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fQlVSU1RETUFfRElFUjogSFJUSU1fTURJRVIgb3IgSFJUSU1fVElNeERJRVIKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9CVVJTVERNQV9DTlQ6IEhSVElNX01DTlQgb3IgSFJUSU1fVElNeENOVAorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0JVUlNURE1BX1BFUjogSFJUSU1fTVBFUiBvciBIUlRJTV9USU14UEVSCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fQlVSU1RETUFfUkVQOiBIUlRJTV9NUkVQIG9yIEhSVElNX1RJTXhSRVAKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9CVVJTVERNQV9DTVAxOiBIUlRJTV9NQ01QMSBvciBIUlRJTV9USU14Q01QMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0JVUlNURE1BX0NNUDI6IEhSVElNX01DTVAyIG9yIEhSVElNX1RJTXhDTVAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fQlVSU1RETUFfQ01QMzogSFJUSU1fTUNNUDMgb3IgSFJUSU1fVElNeENNUDMKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9CVVJTVERNQV9DTVA0OiBIUlRJTV9NQ01QNCBvciBIUlRJTV9USU14Q01QNAorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0JVUlNURE1BX0RUUjogSFJUSU1fVElNeERUUgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0JVUlNURE1BX1NFVDFSOiBIUlRJTV9USU14U0VUMVIKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9CVVJTVERNQV9SU1QxUjogSFJUSU1fVElNeFJTVDFSCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fQlVSU1RETUFfU0VUMlI6IEhSVElNX1RJTXhTRVQyUgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0JVUlNURE1BX1JTVDJSOiBIUlRJTV9USU14UlNUMlIKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9CVVJTVERNQV9FRUZSMTogSFJUSU1fVElNeEVFRlIxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fQlVSU1RETUFfRUVGUjI6IEhSVElNX1RJTXhFRUZSMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0JVUlNURE1BX1JTVFI6IEhSVElNX1RJTXhSU1RSCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fQlVSU1RETUFfQ0hQUjogSFJUSU1fVElNeENIUFIKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9CVVJTVERNQV9PVVRSOiBIUlRJTV9USU14T1VUUgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0JVUlNURE1BX0ZMVFI6IEhSVElNX1RJTXhGTFRSCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgc3RhcnRpbmcgdGhlIHRpbWVyCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fQnVyc3RETUFDb25maWcoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSZWdpc3RlcnNUb1VwZGF0ZSkKK3sKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNRVJfQlVSU1RETUEoVGltZXJJZHgsIFJlZ2lzdGVyc1RvVXBkYXRlKSk7CisgIAorICBpZihoaHJ0aW0tPlN0YXRlID09IEhBTF9IUlRJTV9TVEFURV9CVVNZKQorICB7CisgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGhydGltKTsKKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfQlVTWTsKKworICAvKiBTZXQgdGhlIGJ1cnN0IERNQSB0aW1lciB1cGRhdGUgcmVnaXN0ZXIgKi8KKyAgc3dpdGNoIChUaW1lcklkeCkgCisgIHsKKyAgY2FzZSBIUlRJTV9USU1FUklOREVYX1RJTUVSX0E6CisgICAgeworICAgICAgaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuQkRUQVVQUiA9IFJlZ2lzdGVyc1RvVXBkYXRlOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9USU1FUklOREVYX1RJTUVSX0I6CisgICAgeworICAgICAgaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuQkRUQlVQUiA9IFJlZ2lzdGVyc1RvVXBkYXRlOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9USU1FUklOREVYX1RJTUVSX0M6CisgICAgeworICAgICAgaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuQkRUQ1VQUiA9IFJlZ2lzdGVyc1RvVXBkYXRlOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9USU1FUklOREVYX1RJTUVSX0Q6CisgICAgeworICAgICAgaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuQkRURFVQUiA9IFJlZ2lzdGVyc1RvVXBkYXRlOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9USU1FUklOREVYX1RJTUVSX0U6CisgICAgeworICAgICAgaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuQkRURVVQUiA9IFJlZ2lzdGVyc1RvVXBkYXRlOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9USU1FUklOREVYX01BU1RFUjoKKyAgICB7CisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5CRE1VUFIgPSBSZWdpc3RlcnNUb1VwZGF0ZTsKKyAgICB9CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfUkVBRFk7CisgIAorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaHJ0aW0pOyAgCisKKyAgcmV0dXJuIEhBTF9PSzsgCit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgY29tcGFyZSB1bml0IG9mIGEgdGltZXIgb3BlcmF0aW5nIGluIHdhdmVmb3JtIG1vZGUgCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBUaW1lcklkeCBUaW1lciBpbmRleAorICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX01BU1RFUiAgZm9yIG1hc3RlciB0aW1lcgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9BIGZvciB0aW1lciBBCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0IgZm9yIHRpbWVyIEIKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQyBmb3IgdGltZXIgQworICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9EIGZvciB0aW1lciBECisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0UgZm9yIHRpbWVyIEUKKyAgKiBAcGFyYW0gIENvbXBhcmVVbml0IENvbXBhcmUgdW5pdCB0byBjb25maWd1cmUKKyAgKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fQ09NUEFSRVVOSVRfMTogQ29tcGFyZSB1bml0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9DT01QQVJFVU5JVF8yOiBDb21wYXJlIHVuaXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0NPTVBBUkVVTklUXzM6IENvbXBhcmUgdW5pdCAzCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fQ09NUEFSRVVOSVRfNDogQ29tcGFyZSB1bml0IDQKKyAgKiBAcGFyYW0gIHBDb21wYXJlQ2ZnIHBvaW50ZXIgdG8gdGhlIGNvbXBhcmUgdW5pdCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICAqIEBub3RlIFdoZW4gYXV0byBkZWxheWVkIG1vZGUgaXMgcmVxdWlyZWQgZm9yIGNvbXBhcmUgdW5pdCAyIG9yIGNvbXBhcmUgdW5pdCA0LCAKKyAgKiAgICAgICBhcHBsaWNhdGlvbiBoYXMgdG8gY29uZmlndXJlIHNlcGFyYXRlbHkgdGhlIGNhcHR1cmUgdW5pdC4gQ2FwdHVyZSB1bml0IAorICAqICAgICAgIHRvIGNvbmZpZ3VyZSBpbiB0aGF0IGNhc2UgZGVwZW5kcyBvbiB0aGUgY29tcGFyZSB1bml0IGF1dG8gZGVsYXllZCBtb2RlCisgICogICAgICAgaXMgYXBwbGllZCB0byAoc2VlIGJlbG93KToKKyAgKiAgICAgICAgIEF1dG8gZGVsYXllZCBvbiBvdXRwdXQgY29tcGFyZSAyOiBjYXB0dXJlIHVuaXQgMSBtdXN0IGJlIGNvbmZpZ3VyZWQKKyAgKiAgICAgICAgIEF1dG8gZGVsYXllZCBvbiBvdXRwdXQgY29tcGFyZSA0OiBjYXB0dXJlIHVuaXQgMiBtdXN0IGJlIGNvbmZpZ3VyZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBzdGFydGluZyB0aGUgdGltZXIKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9XYXZlZm9ybUNvbXBhcmVDb25maWcoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENvbXBhcmVVbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9Db21wYXJlQ2ZnVHlwZURlZiogcENvbXBhcmVDZmcpCit7CisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTUVSSU5ERVgoVGltZXJJZHgpKTsKKyAgCisgIGlmKGhocnRpbS0+U3RhdGUgPT0gSEFMX0hSVElNX1NUQVRFX0JVU1kpCisgIHsKKyAgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaHJ0aW0pOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9CVVNZOworICAKKyAgLyogQ29uZmlndXJlIHRoZSBjb21wYXJlIHVuaXQgKi8KKyAgaWYgKFRpbWVySWR4ID09IEhSVElNX1RJTUVSSU5ERVhfTUFTVEVSKQorICB7CisgICAgc3dpdGNoIChDb21wYXJlVW5pdCkKKyAgICB7CisgICAgICBjYXNlIEhSVElNX0NPTVBBUkVVTklUXzE6CisgICAgICAgIHsKKyAgICAgICAgaGhydGltLT5JbnN0YW5jZS0+c01hc3RlclJlZ3MuTUNNUDFSID0gcENvbXBhcmVDZmctPkNvbXBhcmVWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSFJUSU1fQ09NUEFSRVVOSVRfMjoKKyAgICAgICAgeworICAgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zTWFzdGVyUmVncy5NQ01QMlIgPSBwQ29tcGFyZUNmZy0+Q29tcGFyZVZhbHVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBIUlRJTV9DT01QQVJFVU5JVF8zOgorICAgICAgICB7CisgICAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNNYXN0ZXJSZWdzLk1DTVAzUiA9IHBDb21wYXJlQ2ZnLT5Db21wYXJlVmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEhSVElNX0NPTVBBUkVVTklUXzQ6CisgICAgICAgIHsKKyAgICAgICAgaGhydGltLT5JbnN0YW5jZS0+c01hc3RlclJlZ3MuTUNNUDRSID0gcENvbXBhcmVDZmctPkNvbXBhcmVWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBzd2l0Y2ggKENvbXBhcmVVbml0KQorICAgIHsKKyAgICBjYXNlIEhSVElNX0NPTVBBUkVVTklUXzE6CisgICAgICB7CisgICAgICAgIC8qIFNldCB0aGUgY29tcGFyZSB2YWx1ZSAqLworICAgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uQ01QMXhSID0gcENvbXBhcmVDZmctPkNvbXBhcmVWYWx1ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgSFJUSU1fQ09NUEFSRVVOSVRfMjoKKyAgICAgIHsKKyAgICAgICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fQ09NUEFSRVVOSVRfQVVUT0RFTEFZRURNT0RFKENvbXBhcmVVbml0LCBwQ29tcGFyZUNmZy0+QXV0b0RlbGF5ZWRNb2RlKSk7CisgICAgICAgIAorICAgICAgICAvKiBTZXQgdGhlIGNvbXBhcmUgdmFsdWUgKi8KKyAgICAgICAgaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLkNNUDJ4UiA9IHBDb21wYXJlQ2ZnLT5Db21wYXJlVmFsdWU7CisgICAgICAgIAorICAgICAgICBpZiAocENvbXBhcmVDZmctPkF1dG9EZWxheWVkTW9kZSAhPSBIUlRJTV9BVVRPREVMQVlFRE1PREVfUkVHVUxBUikKKyAgICAgICAgeworICAgICAgICAgIC8qIENvbmZpZ3VyZSBhdXRvLWRlbGF5ZWQgbW9kZSAqLworICAgICAgICAgIC8qIERFTENNUDIgYml0ZmllbGQgbXVzdCBiZSByZXNldCB3aGVuIHJlcHJvZ3JhbW1lZCBmcm9tIG9uZSB2YWx1ZSAqLworICAgICAgICAgIC8qIHRvIHRoZSBvdGhlciB0byByZWluaXRpYWxpemUgcHJvcGVybHkgdGhlIGF1dG8tZGVsYXllZCBtZWNoYW5pc20gKi8KKyAgICAgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uVElNeENSICY9IH5IUlRJTV9USU1DUl9ERUxDTVAyOworICAgICAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5USU14Q1IgfD0gcENvbXBhcmVDZmctPkF1dG9EZWxheWVkTW9kZTsKKyAgICAgICAgICAKKyAgICAgICAgICAvKiBTZXQgdGhlIGNvbXBhcmUgdmFsdWUgZm9yIHRpbWVvdXQgY29tcGFyZSB1bml0IChpZiBhbnkpICovCisgICAgICAgICAgaWYgKHBDb21wYXJlQ2ZnLT5BdXRvRGVsYXllZE1vZGUgPT0gSFJUSU1fQVVUT0RFTEFZRURNT0RFX0FVVE9ERUxBWUVEX1RJTUVPVVRDTVAxKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5DTVAxeFIgPSBwQ29tcGFyZUNmZy0+QXV0b0RlbGF5ZWRUaW1lb3V0OworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChwQ29tcGFyZUNmZy0+QXV0b0RlbGF5ZWRNb2RlID09IEhSVElNX0FVVE9ERUxBWUVETU9ERV9BVVRPREVMQVlFRF9USU1FT1VUQ01QMykKKyAgICAgICAgICB7CisgICAgICAgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uQ01QM3hSID0gcENvbXBhcmVDZmctPkF1dG9EZWxheWVkVGltZW91dDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgSFJUSU1fQ09NUEFSRVVOSVRfMzoKKyAgICAgIHsKKyAgICAgICAgLyogU2V0IHRoZSBjb21wYXJlIHZhbHVlICovCisgICAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5DTVAzeFIgPSBwQ29tcGFyZUNmZy0+Q29tcGFyZVZhbHVlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBIUlRJTV9DT01QQVJFVU5JVF80OgorICAgICAgeworICAgICAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgICAgICAgIGFzc2VydF9wYXJhbShJU19IUlRJTV9DT01QQVJFVU5JVF9BVVRPREVMQVlFRE1PREUoQ29tcGFyZVVuaXQsIHBDb21wYXJlQ2ZnLT5BdXRvRGVsYXllZE1vZGUpKTsKKyAgICAgICAgCisgICAgICAgIC8qIFNldCB0aGUgY29tcGFyZSB2YWx1ZSAqLworICAgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uQ01QNHhSID0gcENvbXBhcmVDZmctPkNvbXBhcmVWYWx1ZTsKKyAgICAgICAgCisgICAgICAgIGlmIChwQ29tcGFyZUNmZy0+QXV0b0RlbGF5ZWRNb2RlICE9IEhSVElNX0FVVE9ERUxBWUVETU9ERV9SRUdVTEFSKQorICAgICAgICB7CisgICAgICAgICAgLyogQ29uZmlndXJlIGF1dG8tZGVsYXllZCBtb2RlICovCisgICAgICAgICAgLyogREVMQ01QNCBiaXRmaWVsZCBtdXN0IGJlIHJlc2V0IHdoZW4gcmVwcm9ncmFtbWVkIGZyb20gb25lIHZhbHVlICovCisgICAgICAgICAgLyogdG8gdGhlIG90aGVyIHRvIHJlaW5pdGlhbGl6ZSBwcm9wZXJseSB0aGUgYXV0by1kZWxheWVkIG1lY2hhbmlzbSAqLworICAgICAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5USU14Q1IgJj0gfkhSVElNX1RJTUNSX0RFTENNUDQ7CisgICAgICAgICAgaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLlRJTXhDUiB8PSAocENvbXBhcmVDZmctPkF1dG9EZWxheWVkTW9kZSA8PCAyVSk7CisgICAgICAgICAgCisgICAgICAgICAgLyogU2V0IHRoZSBjb21wYXJlIHZhbHVlIGZvciB0aW1lb3V0IGNvbXBhcmUgdW5pdCAoaWYgYW55KSAqLworICAgICAgICAgIGlmIChwQ29tcGFyZUNmZy0+QXV0b0RlbGF5ZWRNb2RlID09IEhSVElNX0FVVE9ERUxBWUVETU9ERV9BVVRPREVMQVlFRF9USU1FT1VUQ01QMSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uQ01QMXhSID0gcENvbXBhcmVDZmctPkF1dG9EZWxheWVkVGltZW91dDsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAocENvbXBhcmVDZmctPkF1dG9EZWxheWVkTW9kZSA9PSBIUlRJTV9BVVRPREVMQVlFRE1PREVfQVVUT0RFTEFZRURfVElNRU9VVENNUDMpCisgICAgICAgICAgeworICAgICAgICAgICAgaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLkNNUDN4UiA9IHBDb21wYXJlQ2ZnLT5BdXRvRGVsYXllZFRpbWVvdXQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX1JFQURZOworICAKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGhydGltKTsgIAorCisgIHJldHVybiBIQUxfT0s7IAorfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIGNhcHR1cmUgdW5pdCBvZiBhIHRpbWVyIG9wZXJhdGluZyBpbiB3YXZlZm9ybSBtb2RlIAorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZXJJZHggVGltZXIgaW5kZXgKKyAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9BIGZvciB0aW1lciBBCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0IgZm9yIHRpbWVyIEIKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQyBmb3IgdGltZXIgQworICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9EIGZvciB0aW1lciBECisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0UgZm9yIHRpbWVyIEUKKyAgKiBAcGFyYW0gIENhcHR1cmVVbml0IENhcHR1cmUgdW5pdCB0byBjb25maWd1cmUKKyAgKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fQ0FQVFVSRVVOSVRfMTogQ2FwdHVyZSB1bml0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9DQVBUVVJFVU5JVF8yOiBDYXB0dXJlIHVuaXQgMgorICAqIEBwYXJhbSAgcENhcHR1cmVDZmcgcG9pbnRlciB0byB0aGUgY29tcGFyZSB1bml0IGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgc3RhcnRpbmcgdGhlIHRpbWVyCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fV2F2ZWZvcm1DYXB0dXJlQ29uZmlnKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDYXB0dXJlVW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fQ2FwdHVyZUNmZ1R5cGVEZWYqIHBDYXB0dXJlQ2ZnKQoreworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9USU1FUl9DQVBUVVJFVFJJR0dFUihUaW1lcklkeCwgcENhcHR1cmVDZmctPlRyaWdnZXIpKTsKKyAgCisgIGlmKGhocnRpbS0+U3RhdGUgPT0gSEFMX0hSVElNX1NUQVRFX0JVU1kpCisgIHsKKyAgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaHJ0aW0pOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9CVVNZOworCisgIC8qIENvbmZpZ3VyZSB0aGUgY2FwdHVyZSB1bml0ICovCisgIHN3aXRjaCAoQ2FwdHVyZVVuaXQpCisgIHsKKyAgY2FzZSBIUlRJTV9DQVBUVVJFVU5JVF8xOgorICAgIHsKKyAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5DUFQxeENSID0gcENhcHR1cmVDZmctPlRyaWdnZXI7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEhSVElNX0NBUFRVUkVVTklUXzI6CisgICAgeworICAgICAgaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLkNQVDJ4Q1IgPSBwQ2FwdHVyZUNmZy0+VHJpZ2dlcjsKKyAgICB9CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfUkVBRFk7CisgIAorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaHJ0aW0pOyAgCisKKyAgcmV0dXJuIEhBTF9PSzsgCit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgb3V0cHV0IG9mIGEgdGltZXIgb3BlcmF0aW5nIGluIHdhdmVmb3JtIG1vZGUgCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBUaW1lcklkeCBUaW1lciBpbmRleAorICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0EgZm9yIHRpbWVyIEEKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQiBmb3IgdGltZXIgQgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9DIGZvciB0aW1lciBDCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0QgZm9yIHRpbWVyIEQKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRSBmb3IgdGltZXIgRQorICAqIEBwYXJhbSAgT3V0cHV0IFRpbWVyIG91dHB1dAorICAqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQTE6IFRpbWVyIEEgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQTI6IFRpbWVyIEEgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQjE6IFRpbWVyIEIgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQjI6IFRpbWVyIEIgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQzE6IFRpbWVyIEMgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQzI6IFRpbWVyIEMgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URDE6IFRpbWVyIEQgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URDI6IFRpbWVyIEQgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URTE6IFRpbWVyIEUgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URTI6IFRpbWVyIEUgLSBPdXRwdXQgMiAKKyAgKiBAcGFyYW0gIHBPdXRwdXRDZmcgcG9pbnRlciB0byB0aGUgdGltZXIgb3V0cHV0IGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY29uZmlndXJpbmcgdGhlIHRpbWVyIGFuZCBhZnRlciAKKyAgKiAgICAgICBjb25maWd1cmluZyB0aGUgZGVhZHRpbWUgaW5zZXJ0aW9uIGZlYXR1cmUgKGlmIHJlcXVpcmVkKS4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9XYXZlZm9ybU91dHB1dENvbmZpZyhIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9PdXRwdXRDZmdUeXBlRGVmICogcE91dHB1dENmZykKK3sKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNRVJfT1VUUFVUKFRpbWVySWR4LCBPdXRwdXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX09VVFBVVFBPTEFSSVRZKHBPdXRwdXRDZmctPlBvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9PVVRQVVRJRExFTEVWRUwocE91dHB1dENmZy0+SWRsZUxldmVsKSk7CisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9PVVRQVVRJRExFTU9ERShwT3V0cHV0Q2ZnLT5JZGxlTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fT1VUUFVURkFVTFRMRVZFTChwT3V0cHV0Q2ZnLT5GYXVsdExldmVsKSk7CisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9PVVRQVVRDSE9QUEVSTU9ERShwT3V0cHV0Q2ZnLT5DaG9wcGVyTW9kZUVuYWJsZSkpOworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fT1VUUFVUQlVSU1RNT0RFRU5UUlkocE91dHB1dENmZy0+QnVyc3RNb2RlRW50cnlEZWxheWVkKSk7CisKKyAgaWYoaGhydGltLT5TdGF0ZSA9PSBIQUxfSFJUSU1fU1RBVEVfQlVTWSkKKyAgeworICAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhocnRpbSk7CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX0JVU1k7CisKKyAgLyogQ29uZmlndXJlIHRoZSB0aW1lciBvdXRwdXQgKi8KKyAgSFJUSU1fT3V0cHV0Q29uZmlnKGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgIFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgcE91dHB1dENmZyk7ICAKKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfUkVBRFk7CisgIAorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaHJ0aW0pOyAgCisKKyAgcmV0dXJuIEhBTF9PSzsgCit9CisKKy8qKgorICAqIEBicmllZiAgRm9yY2VzIHRoZSB0aW1lciBvdXRwdXQgdG8gaXRzIGFjdGl2ZSBvciBpbmFjdGl2ZSBzdGF0ZSAKKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVySWR4IFRpbWVyIGluZGV4CisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICogQHBhcmFtICBPdXRwdXQgVGltZXIgb3V0cHV0CisgICogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RBMTogVGltZXIgQSAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RBMjogVGltZXIgQSAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RCMTogVGltZXIgQiAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RCMjogVGltZXIgQiAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RDMTogVGltZXIgQyAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RDMjogVGltZXIgQyAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1REMTogVGltZXIgRCAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1REMjogVGltZXIgRCAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RFMTogVGltZXIgRSAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RFMjogVGltZXIgRSAtIE91dHB1dCAyCisgICogQHBhcmFtIE91dHB1dExldmVsIGluZGljYXRlcyB3aGV0aGVyIHRoZSBvdXRwdXQgaXMgZm9yY2VkIHRvIGl0cyBhY3RpdmUgb3IgaW5hY3RpdmUgbGV2ZWwKKyAgKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRMRVZFTF9BQ1RJVkU6IG91dHB1dCBpcyBmb3JjZWQgdG8gaXRzIGFjdGl2ZSBsZXZlbAorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVExFVkVMX0lOQUNUSVZFOiBvdXRwdXQgaXMgZm9yY2VkIHRvIGl0cyBpbmFjdGl2ZSBsZXZlbAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqIEBub3RlIFRoZSAnc29mdHdhcmUgc2V0L3Jlc2V0IHRyaWdnZXInIGJpdCBpbiB0aGUgb3V0cHV0IHNldC9yZXNldCByZWdpc3RlcnMgCisgICogICAgICAgaXMgYXV0b21hdGljYWxseSByZXNldCBieSBoYXJkd2FyZQorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1dhdmVmb3JtU2V0T3V0cHV0TGV2ZWwoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT3V0cHV0TGV2ZWwpCit7CisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTUVSX09VVFBVVChUaW1lcklkeCwgT3V0cHV0KSk7CisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9PVVRQVVRMRVZFTChPdXRwdXRMZXZlbCkpOworICAKKyAgaWYoaGhydGltLT5TdGF0ZSA9PSBIQUxfSFJUSU1fU1RBVEVfQlVTWSkKKyAgeworICAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhocnRpbSk7CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX0JVU1k7CisKKyAgLyogRm9yY2UgdGltZXIgb3V0cHV0IGxldmVsICovCisgIHN3aXRjaCAoT3V0cHV0KQorICB7CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RBMToKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEIxOgorICBjYXNlIEhSVElNX09VVFBVVF9UQzE6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1REMToKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEUxOgorICAgIHsKKyAgICAgIGlmIChPdXRwdXRMZXZlbCA9PSBIUlRJTV9PVVRQVVRMRVZFTF9BQ1RJVkUpCisgICAgICB7CisgICAgICAgIC8qIEZvcmNlIG91dHB1dCB0byBpdHMgYWN0aXZlIHN0YXRlICovCisgICAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5TRVR4MVIgfD0gSFJUSU1fU0VUMVJfU1NUOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBGb3JjZSBvdXRwdXQgdG8gaXRzIGluYWN0aXZlIHN0YXRlICovCisgICAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5SU1R4MVIgfD0gSFJUSU1fUlNUMVJfU1JUOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEEyOgorICBjYXNlIEhSVElNX09VVFBVVF9UQjI6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RDMjoKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEQyOgorICBjYXNlIEhSVElNX09VVFBVVF9URTI6CisgICAgeworICAgICAgaWYgKE91dHB1dExldmVsID09IEhSVElNX09VVFBVVExFVkVMX0FDVElWRSkKKyAgICAgIHsKKyAgICAgICAgLyogRm9yY2Ugb3V0cHV0IHRvIGl0cyBhY3RpdmUgc3RhdGUgKi8KKyAgICAgICAgaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLlNFVHgyUiB8PSBIUlRJTV9TRVQyUl9TU1Q7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIEZvcmNlIG91dHB1dCB0byBpdHMgaW5hY3RpdmUgc3RhdGUgKi8KKyAgICAgICAgaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLlJTVHgyUiB8PSBIUlRJTV9SU1QyUl9TUlQ7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX1JFQURZOworICAKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGhydGltKTsgIAorCisgIHJldHVybiBIQUxfT0s7IAorfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgdGhlIGdlbmVyYXRpb24gb2YgdGhlIHdhdmVmb3JtIHNpZ25hbCBvbiB0aGUgZGVzaWduYXRlZCBvdXRwdXQocykKKyAgKiAgICAgICAgIE91dHB1dHMgY2FuIGJlIGNvbWJpbmVkIChPUmVkKSB0byBhbGxvdyBmb3Igc2ltdWx0YW5lb3VzIG91dHB1dCBlbmFibGluZy4KKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIE91dHB1dHNUb1N0YXJ0IFRpbWVyIG91dHB1dChzKSB0byBlbmFibGUKKyAgKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEExOiBUaW1lciBBIC0gT3V0cHV0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEEyOiBUaW1lciBBIC0gT3V0cHV0IDIKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEIxOiBUaW1lciBCIC0gT3V0cHV0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEIyOiBUaW1lciBCIC0gT3V0cHV0IDIKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEMxOiBUaW1lciBDIC0gT3V0cHV0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEMyOiBUaW1lciBDIC0gT3V0cHV0IDIKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEQxOiBUaW1lciBEIC0gT3V0cHV0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEQyOiBUaW1lciBEIC0gT3V0cHV0IDIKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEUxOiBUaW1lciBFIC0gT3V0cHV0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9PVVRQVVRfVEUyOiBUaW1lciBFIC0gT3V0cHV0IDIKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9XYXZlZm9ybU91dHB1dFN0YXJ0KEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPdXRwdXRzVG9TdGFydCkKK3sKKyAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9PVVRQVVQoT3V0cHV0c1RvU3RhcnQpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhocnRpbSk7CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX0JVU1k7IAorICAKKyAgLyogRW5hYmxlIHRoZSBIUlRJTSBvdXRwdXRzICovCisgIGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLk9FTlIgfD0gKE91dHB1dHNUb1N0YXJ0KTsKKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfUkVBRFk7IAorICAgICAgICAgICAgICAgICAgCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhocnRpbSk7ICAgICAgCisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGVzIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSB3YXZlZm9ybSBzaWduYWwgb24gdGhlIGRlc2lnbmF0ZWQgb3V0cHV0KHMpCisgICogICAgICAgICBPdXRwdXRzIGNhbiBiZSBjb21iaW5lZCAoT1JlZCkgdG8gYWxsb3cgZm9yIHNpbXVsdGFuZW91cyBvdXRwdXQgZGlzYWJsaW5nLgorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZQorICAqIEBwYXJhbSAgT3V0cHV0c1RvU3RvcCBUaW1lciBvdXRwdXQocykgdG8gZGlzYWJsZQorICAqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQTE6IFRpbWVyIEEgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQTI6IFRpbWVyIEEgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQjE6IFRpbWVyIEIgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQjI6IFRpbWVyIEIgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQzE6IFRpbWVyIEMgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQzI6IFRpbWVyIEMgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URDE6IFRpbWVyIEQgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URDI6IFRpbWVyIEQgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URTE6IFRpbWVyIEUgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URTI6IFRpbWVyIEUgLSBPdXRwdXQgMgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1dhdmVmb3JtT3V0cHV0U3RvcChIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPdXRwdXRzVG9TdG9wKQoreworICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX09VVFBVVChPdXRwdXRzVG9TdG9wKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaHJ0aW0pOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9CVVNZOyAKKyAgCisgIC8qIEVuYWJsZSB0aGUgSFJUSU0gb3V0cHV0cyAqLworICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5PRElTUiB8PSAoT3V0cHV0c1RvU3RvcCk7CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX1JFQURZOyAKKyAgICAgICAgICAgICAgICAgIAorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaHJ0aW0pOyAgICAgIAorICAKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIGNvdW50ZXIgb2YgdGhlIGRlc2lnbmF0ZWQgdGltZXIocykgb3BlcmF0aW5nIGluIHdhdmVmb3JtIG1vZGUKKyAgKiAgICAgICAgIFRpbWVycyBjYW4gYmUgY29tYmluZWQgKE9SZWQpIHRvIGFsbG93IGZvciBzaW11bHRhbmVvdXMgY291bnRlciBzdGFydC4KKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVycyBUaW1lciBjb3VudGVyKHMpIHRvIHN0YXJ0CisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSURfTUFTVEVSIAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJRF9USU1FUl9BIAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJRF9USU1FUl9CIAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJRF9USU1FUl9DIAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJRF9USU1FUl9EIAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJRF9USU1FUl9FIAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1dhdmVmb3JtQ291bnRlclN0YXJ0KEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJzKQoreworICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTUVSSUQoVGltZXJzKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaHJ0aW0pOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9CVVNZOyAKKyAgCisgIC8qIEVuYWJsZSB0aW1lcihzKSBjb3VudGVyICovCisgIGhocnRpbS0+SW5zdGFuY2UtPnNNYXN0ZXJSZWdzLk1DUiB8PSAoVGltZXJzKTsKKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfUkVBRFk7IAorICAgICAgICAgICAgICAgICAgCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhocnRpbSk7ICAgICAgCisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBjb3VudGVyIG9mIHRoZSBkZXNpZ25hdGVkIHRpbWVyKHMpIG9wZXJhdGluZyBpbiB3YXZlZm9ybSBtb2RlCisgICogICAgICAgICBUaW1lcnMgY2FuIGJlIGNvbWJpbmVkIChPUmVkKSB0byBhbGxvdyBmb3Igc2ltdWx0YW5lb3VzIGNvdW50ZXIgc3RvcC4KKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVycyBUaW1lciBjb3VudGVyKHMpIHRvIHN0b3AKKyAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJRF9NQVNURVIgCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklEX0EgCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklEX0IgCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklEX0MgCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklEX0QgCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklEX0UgCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICogQG5vdGUgVGhlIGNvdW50ZXIgb2YgYSB0aW1lciBpcyBzdG9wcGVkIG9ubHkgaWYgYWxsIHRpbWVyIG91dHB1dHMgYXJlIGRpc2FibGVkICAgCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudGVyU3RvcChIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJzKQoreworICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTUVSSUQoVGltZXJzKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaHJ0aW0pOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9CVVNZOyAKKyAgCisgIC8qIERpc2FibGUgdGltZXIocykgY291bnRlciAqLworICBoaHJ0aW0tPkluc3RhbmNlLT5zTWFzdGVyUmVncy5NQ1IgJj0gfihUaW1lcnMpOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9SRUFEWTsgCisgICAgICAgICAgICAgICAgICAKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGhydGltKTsgICAgICAKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBjb3VudGVyIG9mIHRoZSBkZXNpZ25hdGVkIHRpbWVyKHMpIG9wZXJhdGluZyBpbiB3YXZlZm9ybSBtb2RlCisgICogICAgICAgICBUaW1lcnMgY2FuIGJlIGNvbWJpbmVkIChPUmVkKSB0byBhbGxvdyBmb3Igc2ltdWx0YW5lb3VzIGNvdW50ZXIgc3RhcnQuCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBUaW1lcnMgVGltZXIgY291bnRlcihzKSB0byBzdGFydAorICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklEX01BU1RFUiAKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSURfQSAKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSURfQiAKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSURfQyAKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSURfRCAKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSURfRSAKKyAgKiBAbm90ZSBIUlRJTSBpbnRlcnJ1cHRzIChlLmcuIGZhdWx0cyBpbnRlcnJ1cHRzKSBhbmQgaW50ZXJydXB0cyByZWxhdGVkCisgICogICAgICAgdG8gdGhlIHRpbWVycyB0byBzdGFydCBhcmUgZW5hYmxlZCB3aXRoaW4gdGhpcyBmdW5jdGlvbi4gCisgICogICAgICAgSW50ZXJydXB0cyB0byBlbmFibGUgYXJlIHNlbGVjdGVkIHRocm91Z2ggSEFMX0hSVElNX1dhdmVmb3JtVGltZXJDb25maWcKKyAgKiAgICAgICBmdW5jdGlvbi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50ZXJTdGFydF9JVChIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVycykKK3sKKyAgdWludDhfdCB0aW1lcl9pZHg7CisgIAorICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTUVSSUQoVGltZXJzKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaHJ0aW0pOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9CVVNZOworICAKKyAgLyogRW5hYmxlIEhSVElNIGludGVycnVwdHMgKGlmIHJlcXVpcmVkKSAqLworICBfX0hBTF9IUlRJTV9FTkFCTEVfSVQoaGhydGltLCBoaHJ0aW0tPkluaXQuSFJUSU1JbnRlcnJ1cHRSZXNxdWVzdHMpOworICAKKyAgLyogRW5hYmxlIG1hc3RlciB0aW1lciByZWxhdGVkIGludGVycnVwdHMgKGlmIHJlcXVpcmVkKSAqLworICBpZiAoKFRpbWVycyAmIEhSVElNX1RJTUVSSURfTUFTVEVSKSAhPSBSRVNFVCkKKyAgeworICAgIF9fSEFMX0hSVElNX01BU1RFUl9FTkFCTEVfSVQoaGhydGltLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhocnRpbS0+VGltZXJQYXJhbVtIUlRJTV9USU1FUklOREVYX01BU1RFUl0uSW50ZXJydXB0UmVxdWVzdHMpOworICB9CisgIAorICAvKiBFbmFibGUgdGltaW5nIHVuaXQgcmVsYXRlZCBpbnRlcnJ1cHRzIChpZiByZXF1aXJlZCkgKi8KKyAgZm9yICh0aW1lcl9pZHggPSBIUlRJTV9USU1FUklOREVYX1RJTUVSX0EgOyAKKyAgICAgICB0aW1lcl9pZHggPCBIUlRJTV9USU1FUklOREVYX01BU1RFUiA7IAorICAgICAgIHRpbWVyX2lkeCsrKQorICB7CisgICAgaWYgKChUaW1lcnMgJiBUaW1lcklkeFRvVGltZXJJZFt0aW1lcl9pZHhdKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBfX0hBTF9IUlRJTV9USU1FUl9FTkFCTEVfSVQoaGhydGltLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lcl9pZHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhocnRpbS0+VGltZXJQYXJhbVt0aW1lcl9pZHhdLkludGVycnVwdFJlcXVlc3RzKTsKKyAgICB9CisgIH0KKyAgCisgIC8qIEVuYWJsZSB0aW1lcihzKSBjb3VudGVyICovCisgIGhocnRpbS0+SW5zdGFuY2UtPnNNYXN0ZXJSZWdzLk1DUiB8PSAoVGltZXJzKTsKKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfUkVBRFk7IAorICAgICAgICAgICAgICAgICAgCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhocnRpbSk7ICAgICAgCisgIAorICByZXR1cm4gSEFMX09LO30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgY291bnRlciBvZiB0aGUgZGVzaWduYXRlZCB0aW1lcihzKSBvcGVyYXRpbmcgaW4gd2F2ZWZvcm0gbW9kZQorICAqICAgICAgICAgVGltZXJzIGNhbiBiZSBjb21iaW5lZCAoT1JlZCkgdG8gYWxsb3cgZm9yIHNpbXVsdGFuZW91cyBjb3VudGVyIHN0b3AuCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBUaW1lcnMgVGltZXIgY291bnRlcihzKSB0byBzdG9wCisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSURfTUFTVEVSIAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJRF9BIAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJRF9CIAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJRF9DIAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJRF9EIAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJRF9FIAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqIEBub3RlIFRoZSBjb3VudGVyIG9mIGEgdGltZXIgaXMgc3RvcHBlZCBvbmx5IGlmIGFsbCB0aW1lciBvdXRwdXRzIGFyZSBkaXNhYmxlZAorICAqIEBub3RlIEFsbCBlbmFibGVkIHRpbWVyIHJlbGF0ZWQgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQuCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudGVyU3RvcF9JVChIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJzKQoreworICAvKiArKyBXQSAqLworICBfX0lPIHVpbnQzMl90IGRlbGFpID0gKHVpbnQzMl90KSgweDE3RlUpOworICAvKiAtLSBXQSAqLworICAKKyAgdWludDhfdCB0aW1lcl9pZHg7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNRVJJRChUaW1lcnMpKTsKKyAgCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGhydGltKTsKKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfQlVTWTsgCisKKyAgLyogRGlzYWJsZSBIUlRJTSBpbnRlcnJ1cHRzIChpZiByZXF1aXJlZCkgKi8KKyAgX19IQUxfSFJUSU1fRElTQUJMRV9JVChoaHJ0aW0sIGhocnRpbS0+SW5pdC5IUlRJTUludGVycnVwdFJlc3F1ZXN0cyk7CisgIAorICAvKiBEaXNhYmxlIG1hc3RlciB0aW1lciByZWxhdGVkIGludGVycnVwdHMgKGlmIHJlcXVpcmVkKSAqLworICBpZiAoKFRpbWVycyAmIEhSVElNX1RJTUVSSURfTUFTVEVSKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIEludGVycnVwdHMgZW5hYmxlIGZsYWcgbXVzdCBiZSBjbGVhcmVkIG9uZSBieSBvbmUgKi8KKyAgICBfX0hBTF9IUlRJTV9NQVNURVJfRElTQUJMRV9JVChoaHJ0aW0sIGhocnRpbS0+VGltZXJQYXJhbVtIUlRJTV9USU1FUklOREVYX01BU1RFUl0uSW50ZXJydXB0UmVxdWVzdHMpOyAKKyAgfQorICAKKyAgLyogRGlzYWJsZSB0aW1pbmcgdW5pdCByZWxhdGVkIGludGVycnVwdHMgKGlmIHJlcXVpcmVkKSAqLworICBmb3IgKHRpbWVyX2lkeCA9IEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSA7IAorICAgICAgIHRpbWVyX2lkeCA8IEhSVElNX1RJTUVSSU5ERVhfTUFTVEVSIDsgCisgICAgICAgdGltZXJfaWR4KyspCisgIHsKKyAgICBpZiAoKFRpbWVycyAmIFRpbWVySWR4VG9UaW1lcklkW3RpbWVyX2lkeF0pICE9IFJFU0VUKQorICAgIHsKKyAgICAgIF9fSEFMX0hSVElNX1RJTUVSX0RJU0FCTEVfSVQoaGhydGltLCB0aW1lcl9pZHgsIGhocnRpbS0+VGltZXJQYXJhbVt0aW1lcl9pZHhdLkludGVycnVwdFJlcXVlc3RzKTsKKyAgICB9CisgIH0KKyAgCisgIC8qICsrIFdBICovCisgIGRvIHsgZGVsYWktLTsgfSB3aGlsZSAoZGVsYWkgIT0gMFUpOworICAvKiAtLSBXQSAqLworICAKKyAgLyogRGlzYWJsZSB0aW1lcihzKSBjb3VudGVyICovCisgIGhocnRpbS0+SW5zdGFuY2UtPnNNYXN0ZXJSZWdzLk1DUiAmPSB+KFRpbWVycyk7CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX1JFQURZOyAKKyAgCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhocnRpbSk7ICAgICAgCisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgY291bnRlciBvZiB0aGUgZGVzaWduYXRlZCB0aW1lcihzKSBvcGVyYXRpbmcgaW4gd2F2ZWZvcm0gbW9kZQorICAqICAgICAgICAgVGltZXJzIGNhbiBiZSBjb21iaW5lZCAoT1JlZCkgdG8gYWxsb3cgZm9yIHNpbXVsdGFuZW91cyBjb3VudGVyIHN0YXJ0LgorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZXJzIFRpbWVyIGNvdW50ZXIocykgdG8gc3RhcnQKKyAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgIEhSVElNX1RJTUVSSURfTUFTVEVSIAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJRF9BIAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJRF9CIAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJRF9DIAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJRF9EIAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJRF9FIAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyB0aGUgZG1hIHJlcXVlc3QocykgbWVudGlvbm5lZCBpbiB0aGUgdGltZXIKKyAgKiAgICAgICBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlIGZvciBldmVyeSB0aW1lcnMgdG8gc3RhcnQuCisgICogQG5vdGUgVGhlIHNvdXJjZSBtZW1vcnkgYWRkcmVzcywgdGhlIGRlc3RpbmF0aW9uIG1lbW9yeSBhZGRyZXNzIGFuZCB0aGUKKyAgKiAgICAgICBzaXplIG9mIGVhY2ggRE1BIHRyYW5zZmVyIGFyZSBzcGVjaWZpZWQgYXQgdGltZXIgY29uZmlndXJhdGlvbiB0aW1lCisgICogICAgICAgKHNlZSBIQUxfSFJUSU1fV2F2ZWZvcm1UaW1lckNvbmZpZykKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50ZXJTdGFydF9ETUEoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJzKQoreworICB1aW50OF90IHRpbWVyX2lkeDsKKyAgRE1BX0hhbmRsZVR5cGVEZWYgKiBoZG1hOworICAKKyAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9USU1FUklEKFRpbWVycykpOworCisgIGlmKChoaHJ0aW0tPlN0YXRlID09IEhBTF9IUlRJTV9TVEFURV9CVVNZKSkKKyAgeworICAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKworICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX0JVU1k7CisgIAorICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhocnRpbSk7CisgIAorICBpZiAoKChUaW1lcnMgJiBIUlRJTV9USU1FUklEX01BU1RFUikgIT0gUkVTRVQpICYmCisgICAgICAoaGhydGltLT5UaW1lclBhcmFtW0hSVElNX1RJTUVSSU5ERVhfTUFTVEVSXS5ETUFSZXF1ZXN0cyAhPSAwVSkpCisgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBoaHJ0aW0tPmhkbWFNYXN0ZXItPlhmZXJFcnJvckNhbGxiYWNrID0gSFJUSU1fRE1BRXJyb3IgOworICAgICAgCisgICAgICAvKiBTZXQgdGhlIERNQSB0cmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgKi8KKyAgICAgIGhocnRpbS0+aGRtYU1hc3Rlci0+WGZlckNwbHRDYWxsYmFjayA9IEhSVElNX0RNQU1hc3RlckNwbHQ7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIEhBTF9ETUFfU3RhcnRfSVQoaGhydGltLT5oZG1hTWFzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICBoaHJ0aW0tPlRpbWVyUGFyYW1bSFJUSU1fVElNRVJJTkRFWF9NQVNURVJdLkRNQVNyY0FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgIGhocnRpbS0+VGltZXJQYXJhbVtIUlRJTV9USU1FUklOREVYX01BU1RFUl0uRE1BRHN0QWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgaGhydGltLT5UaW1lclBhcmFtW0hSVElNX1RJTUVSSU5ERVhfTUFTVEVSXS5ETUFTaXplKTsKKyAgICAgIAorICAgICAgLyogRW5hYmxlIHRoZSB0aW1lciBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfSFJUSU1fTUFTVEVSX0VOQUJMRV9ETUEoaGhydGltLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGhydGltLT5UaW1lclBhcmFtW0hSVElNX1RJTUVSSU5ERVhfTUFTVEVSXS5ETUFSZXF1ZXN0cyk7CisgIH0KKyAgCisgIGZvciAodGltZXJfaWR4ID0gSFJUSU1fVElNRVJJTkRFWF9USU1FUl9BIDsgCisgICAgICAgdGltZXJfaWR4IDwgSFJUSU1fVElNRVJJTkRFWF9NQVNURVIgOyAKKyAgICAgICB0aW1lcl9pZHgrKykKKyAgeworICAgIGlmICgoKFRpbWVycyAmIFRpbWVySWR4VG9UaW1lcklkW3RpbWVyX2lkeF0pICE9IFJFU0VUKSAmJgorICAgICAgICAgKGhocnRpbS0+VGltZXJQYXJhbVt0aW1lcl9pZHhdLkRNQVJlcXVlc3RzICE9IDBVKSkKKyAgICB7CisgICAgICAvKiBHZXQgdGhlIHRpbWVyIERNQSBoYW5kbGVyICovCisgICAgICBoZG1hID0gSFJUSU1fR2V0RE1BSGFuZGxlRnJvbVRpbWVySWR4KGhocnRpbSwgdGltZXJfaWR4KTsKKworICAgICAgaWYgKGhkbWEgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9FUlJPUjsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoaHJ0aW0pOyAKKworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorCisgICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGhkbWEtPlhmZXJFcnJvckNhbGxiYWNrID0gSFJUSU1fRE1BRXJyb3IgOworICAgICAgCisgICAgICAvKiBTZXQgdGhlIERNQSB0cmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgKi8KKyAgICAgIGhkbWEtPlhmZXJDcGx0Q2FsbGJhY2sgPSBIUlRJTV9ETUFUaW1lcnhDcGx0OworICAgICAgCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBIQUxfRE1BX1N0YXJ0X0lUKGhkbWEsCisgICAgICAgICAgICAgICAgICAgICAgIGhocnRpbS0+VGltZXJQYXJhbVt0aW1lcl9pZHhdLkRNQVNyY0FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgIGhocnRpbS0+VGltZXJQYXJhbVt0aW1lcl9pZHhdLkRNQURzdEFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgIGhocnRpbS0+VGltZXJQYXJhbVt0aW1lcl9pZHhdLkRNQVNpemUpOworICAgICAgCisgICAgICAvKiBFbmFibGUgdGhlIHRpbWVyIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9IUlRJTV9USU1FUl9FTkFCTEVfRE1BKGhocnRpbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVyX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGhydGltLT5UaW1lclBhcmFtW3RpbWVyX2lkeF0uRE1BUmVxdWVzdHMpOyAKKyAgICB9CisgIH0KKworICAvKiBFbmFibGUgdGhlIHRpbWVyIGNvdW50ZXIgKi8KKyAgX19IQUxfSFJUSU1fRU5BQkxFKGhocnRpbSwgVGltZXJzKTsKKworICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX1JFQURZOyAKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaHJ0aW0pOyAgCisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBjb3VudGVyIG9mIHRoZSBkZXNpZ25hdGVkIHRpbWVyKHMpIG9wZXJhdGluZyBpbiB3YXZlZm9ybSBtb2RlCisgICogICAgICAgICBUaW1lcnMgY2FuIGJlIGNvbWJpbmVkIChPUmVkKSB0byBhbGxvdyBmb3Igc2ltdWx0YW5lb3VzIGNvdW50ZXIgc3RvcC4KKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVycyBUaW1lciBjb3VudGVyKHMpIHRvIHN0b3AKKyAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJRF9NQVNURVIgCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklEX0EgCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklEX0IgCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklEX0MgCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklEX0QgCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklEX0UgCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICogQG5vdGUgIFRoZSBjb3VudGVyIG9mIGEgdGltZXIgaXMgc3RvcHBlZCBvbmx5IGlmIGFsbCB0aW1lciBvdXRwdXRzIGFyZSBkaXNhYmxlZAorICAqIEBub3RlICBBbGwgZW5hYmxlZCB0aW1lciByZWxhdGVkIERNQSByZXF1ZXN0cyBhcmUgZGlzYWJsZWQuCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudGVyU3RvcF9ETUEoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcnMpCit7CisgIHVpbnQ4X3QgdGltZXJfaWR4OworICBETUFfSGFuZGxlVHlwZURlZiAqIGhkbWE7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTUVSSUQoVGltZXJzKSk7CisKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9CVVNZOyAKKworICBpZiAoKChUaW1lcnMgJiBIUlRJTV9USU1FUklEX01BU1RFUikgIT0gUkVTRVQpICYmCisgICAgICAoaGhydGltLT5UaW1lclBhcmFtW0hSVElNX1RJTUVSSU5ERVhfTUFTVEVSXS5ETUFSZXF1ZXN0cyAhPSAwVSkpCisgIHsgCisgICAgLyogRGlzYWJsZSB0aGUgRE1BICovCisgICAgSEFMX0RNQV9BYm9ydChoaHJ0aW0tPmhkbWFNYXN0ZXIpOworICAgIAorICAgIC8qIERpc2FibGUgdGhlIERNQSByZXF1ZXN0KHMpICovCisgICAgX19IQUxfSFJUSU1fTUFTVEVSX0RJU0FCTEVfRE1BKGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGhydGltLT5UaW1lclBhcmFtW0hSVElNX1RJTUVSSU5ERVhfTUFTVEVSXS5ETUFSZXF1ZXN0cyk7CisgIH0KKyAgCisgIGZvciAodGltZXJfaWR4ID0gSFJUSU1fVElNRVJJTkRFWF9USU1FUl9BIDsgCisgICAgICAgdGltZXJfaWR4IDwgSFJUSU1fVElNRVJJTkRFWF9NQVNURVIgOyAKKyAgICAgICB0aW1lcl9pZHgrKykKKyAgeworICAgIGlmICgoKFRpbWVycyAmIFRpbWVySWR4VG9UaW1lcklkW3RpbWVyX2lkeF0pICE9IFJFU0VUKSAmJgorICAgICAgICAoaGhydGltLT5UaW1lclBhcmFtW3RpbWVyX2lkeF0uRE1BUmVxdWVzdHMgIT0gMFUpKQorICAgIHsKKyAgICAgIC8qIEdldCB0aGUgdGltZXIgRE1BIGhhbmRsZXIgKi8KKyAgICAgIGhkbWEgPSBIUlRJTV9HZXRETUFIYW5kbGVGcm9tVGltZXJJZHgoaGhydGltLCB0aW1lcl9pZHgpOworCisgICAgICBpZiAoaGRtYSA9PSBOVUxMKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBETUEgcmVxdWVzdChzKSAqLworICAgICAgICBfX0hBTF9IUlRJTV9USU1FUl9ESVNBQkxFX0RNQShoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lcl9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaHJ0aW0tPlRpbWVyUGFyYW1bdGltZXJfaWR4XS5ETUFSZXF1ZXN0cyk7IAorCisgICAgICAgIC8qIERpc2FibGUgdGhlIHRpbWVyIGNvdW50ZXIgKi8KKyAgICAgICAgX19IQUxfSFJUSU1fRElTQUJMRShoaHJ0aW0sIFRpbWVycyk7CisgICAgCisgICAgICAgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfRVJST1I7IAorICAgICAgICAgICAgICAgICAgCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgfQorCisgICAgICAvKiBEaXNhYmxlIHRoZSBETUEgKi8KKyAgICAgIEhBTF9ETUFfQWJvcnQoaGRtYSk7CisgICAgICAKKyAgICAvKiBEaXNhYmxlIHRoZSBETUEgcmVxdWVzdChzKSAqLworICAgICAgX19IQUxfSFJUSU1fVElNRVJfRElTQUJMRV9ETUEoaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXJfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGhydGltLT5UaW1lclBhcmFtW3RpbWVyX2lkeF0uRE1BUmVxdWVzdHMpOyAgICAgIAorICAgIH0KKyAgfQorICAKKyAgLyogRGlzYWJsZSB0aGUgdGltZXIgY291bnRlciAqLworICBfX0hBTF9IUlRJTV9ESVNBQkxFKGhocnRpbSwgVGltZXJzKTsKKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfUkVBRFk7IAorICAgICAgICAgICAgICAgICAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgSFJUSU0gYnVyc3QgbW9kZSBjb250cm9sbGVyLgorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZQorICAqIEBwYXJhbSAgRW5hYmxlIEJ1cnN0IG1vZGUgY29udHJvbGxlciBlbmFibGluZworICAqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0JVUlNUTU9ERUNUTF9FTkFCTEVEOiBCdXJzdCBtb2RlIGVuYWJsZWQKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9CVVJTVE1PREVDVExfRElTQUJMRUQ6IEJ1cnN0IG1vZGUgZGlzYWJsZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIHN0YXJ0aW5nIHRoZSB0aW1lcihzKQorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX0J1cnN0TW9kZUN0bChIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBFbmFibGUpCit7CisgIHVpbnQzMl90IGhydGltX2JtY3I7CisgIAorICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9CVVJTVE1PREVDVEwoRW5hYmxlKSk7CisgIAorICBpZihoaHJ0aW0tPlN0YXRlID09IEhBTF9IUlRJTV9TVEFURV9CVVNZKQorICB7CisgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGhydGltKTsKKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfQlVTWTsKKworICAvKiBFbmFibGUvRGlzYWJsZSB0aGUgYnVyc3QgbW9kZSBjb250cm9sbGVyICovCisgIGhydGltX2JtY3IgPSBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5CTUNSOworICBocnRpbV9ibWNyICY9IH4oSFJUSU1fQk1DUl9CTUUpOworICBocnRpbV9ibWNyIHw9IEVuYWJsZTsKKyAgCisgIC8qIFVwZGF0ZSB0aGUgSFJUSU0gcmVnaXN0ZXJzICovCisgIGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLkJNQ1IgPSBocnRpbV9ibWNyOworCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfUkVBRFk7CisgIAorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaHJ0aW0pOyAgCisKKyAgcmV0dXJuIEhBTF9PSzsgCit9CisKKy8qKgorICAqIEBicmllZiAgVHJpZ2dlcnMgdGhlIGJ1cnN0IG1vZGUgb3BlcmF0aW9uLgorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX0J1cnN0TW9kZVNvZnR3YXJlVHJpZ2dlcihIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0pCit7CisgIGlmKGhocnRpbS0+U3RhdGUgPT0gSEFMX0hSVElNX1NUQVRFX0JVU1kpCisgIHsKKyAgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaHJ0aW0pOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9CVVNZOworCisgIC8qIFNvZnR3YXJlIHRyaWdnZXIgb2YgdGhlIGJ1cnN0IG1vZGUgY29udHJvbGxlciAqLworICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5CTVRSR1IgfD0gSFJUSU1fQk1UUkdSX1NXOworCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfUkVBRFk7CisgIAorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaHJ0aW0pOyAgCisKKyAgcmV0dXJuIEhBTF9PSzsgCit9CisKKy8qKgorICAqIEBicmllZiAgVHJpZ2dlcnMgYSBzb2Z0d2FyZSBjYXB0dXJlIG9uIHRoZSBkZXNpZ25lZCBjYXB0dXJlIHVuaXQKKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVySWR4IFRpbWVyIGluZGV4CisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICogQHBhcmFtICBDYXB0dXJlVW5pdCBDYXB0dXJlIHVuaXQgdG8gdHJpZworICAqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9DQVBUVVJFVU5JVF8xOiBDYXB0dXJlIHVuaXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX0NBUFRVUkVVTklUXzI6IENhcHR1cmUgdW5pdCAyCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICogQG5vdGUgVGhlICdzb2Z0d2FyZSBjYXB0dXJlJyBiaXQgaW4gdGhlIGNhcHVyZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGlzCisgICogICAgICAgYXV0b21hdGljYWxseSByZXNldCBieSBoYXJkd2FyZQorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1NvZnR3YXJlQ2FwdHVyZShIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2FwdHVyZVVuaXQpCit7CisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTUlOR19VTklUKFRpbWVySWR4KSk7CisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9DQVBUVVJFVU5JVChDYXB0dXJlVW5pdCkpOworICAKKyAgaWYoaGhydGltLT5TdGF0ZSA9PSBIQUxfSFJUSU1fU1RBVEVfQlVTWSkKKyAgeworICAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhocnRpbSk7CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX0JVU1k7CisKKyAgLyogRm9yY2UgYSBzb2Z0d2FyZSBjYXB0dXJlIG9uIGNvbmNlcm5lZCBjYXB0dXJlIHVuaXQgKi8KKyAgc3dpdGNoIChDYXB0dXJlVW5pdCkKKyAgeworICBjYXNlIEhSVElNX0NBUFRVUkVVTklUXzE6CisgICAgeworICAgICAgaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLkNQVDF4Q1IgfD0gSFJUSU1fQ1BUMUNSX1NXQ1BUOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9DQVBUVVJFVU5JVF8yOgorICAgIHsKKyAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5DUFQyeENSIHw9IEhSVElNX0NQVDJDUl9TV0NQVDsKKyAgICB9CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfUkVBRFk7CisgIAorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaHJ0aW0pOyAgCisKKyAgcmV0dXJuIEhBTF9PSzsgCit9CisKKy8qKgorICAqIEBicmllZiAgVHJpZ2dlcnMgdGhlIHVwZGF0ZSBvZiB0aGUgcmVnaXN0ZXJzIG9mIG9uZSBvciBzZXZlcmFsIHRpbWVycworICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZXJzIHRpbWVycyBjb25jZXJuZWQgd2l0aCB0aGUgc29mdHdhcmUgcmVnaXN0ZXIgdXBkYXRlCisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSVVBEQVRFX01BU1RFUiAKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSVVBEQVRFX0EgCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUlVQREFURV9CIAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJVUERBVEVfQyAKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSVVBEQVRFX0QgCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUlVQREFURV9FIAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqIEBub3RlIFRoZSAnc29mdHdhcmUgdXBkYXRlJyBiaXRzIGluIHRoZSBIUlRJTSBjb25yb2wgcmVnaXN0ZXIgMiByZWdpc3RlciBhcmUKKyAgKiAgICAgICBhdXRvbWF0aWNhbGx5IHJlc2V0IGJ5IGhhcmR3YXJlCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fU29mdHdhcmVVcGRhdGUoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcnMpCit7CisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTUVSVVBEQVRFKFRpbWVycykpOworICAKKyAgaWYoaGhydGltLT5TdGF0ZSA9PSBIQUxfSFJUSU1fU1RBVEVfQlVTWSkKKyAgeworICAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhocnRpbSk7CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX0JVU1k7CisKKyAgLyogRm9yY2UgdGltZXIocykgcmVnaXN0ZXJzIHVwZGF0ZSAqLworICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5DUjIgfD0gVGltZXJzOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9SRUFEWTsKKyAgCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhocnRpbSk7ICAKKworICByZXR1cm4gSEFMX09LOyAKK30KKworLyoqCisgICogQGJyaWVmICBUcmlnZ2VycyB0aGUgcmVzZXQgb2Ygb25lIG9yIHNldmVyYWwgdGltZXJzCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBUaW1lcnMgdGltZXJzIGNvbmNlcm5lZCB3aXRoIHRoZSBzb2Z0d2FyZSBjb3VudGVyIHJlc2V0CisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSUkVTRVRfTUFTVEVSIAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJSRVNFVF9USU1FUl9BIAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJSRVNFVF9USU1FUl9CIAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJSRVNFVF9USU1FUl9DIAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJSRVNFVF9USU1FUl9EIAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJSRVNFVF9USU1FUl9FIAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqIEBub3RlIFRoZSAnc29mdHdhcmUgcmVzZXQnIGJpdHMgaW4gdGhlIEhSVElNIGNvbnJvbCByZWdpc3RlciAyICBhcmUKKyAgKiAgICAgICBhdXRvbWF0aWNhbGx5IHJlc2V0IGJ5IGhhcmR3YXJlCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSFJUSU1fU29mdHdhcmVSZXNldChIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJzKQoreworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9USU1FUlJFU0VUKFRpbWVycykpOworICAKKyAgaWYoaGhydGltLT5TdGF0ZSA9PSBIQUxfSFJUSU1fU1RBVEVfQlVTWSkKKyAgeworICAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhocnRpbSk7CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX0JVU1k7CisKKyAgLyogRm9yY2UgdGltZXIocykgcmVnaXN0ZXJzIHJlc2V0ICovCisgIGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLkNSMiA9IFRpbWVyczsKKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfUkVBRFk7CisgIAorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaHJ0aW0pOyAgCisKKyAgcmV0dXJuIEhBTF9PSzsgCit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIGEgYnVyc3QgRE1BIG9wZXJhdGlvbiB0byB1cGRhdGUgSFJUSU0gY29udHJvbCByZWdpc3RlcnMgY29udGVudAorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZXJJZHggVGltZXIgaW5kZXgKKyAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9NQVNURVIgIGZvciBtYXN0ZXIgdGltZXIKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICogQHBhcmFtICBCdXJzdEJ1ZmZlckFkZHJlc3MgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRoZSBIUlRJTSBjb250cm9sIHJlZ2lzdGVycworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50IHdpbGwgYmUgdXBkYXRlZCBmcm9tLgorICAqIEBwYXJhbSAgQnVyc3RCdWZmZXJMZW5ndGggc2l6ZSAoaW4gV09SRFMpIG9mIHRoZSBidXJzdCBidWZmZXIuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICogQG5vdGUgVGhlIFRpbWVySWR4IHBhcmFtZXRlciBkZXRlcm1pbmVzIHRoZSBkbWEgY2hhbm5lbCB0byBiZSB1c2VkIGJ5IHRoZSAgCisgICogICAgICAgRE1BIGJ1cnN0IGNvbnRyb2xsZXIgKHNlZSBiZWxvdykKKyAgKiAgICAgICBIUlRJTV9USU1FUklOREVYX01BU1RFUjogRE1BIGNoYW5uZWwgMiBpcyB1c2VkIGJ5IHRoZSBETUEgYnVyc3QgY29udHJvbGxlcgorICAqICAgICAgIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQTogRE1BIGNoYW5uZWwgMyBpcyB1c2VkIGJ5IHRoZSBETUEgYnVyc3QgY29udHJvbGxlcgorICAqICAgICAgIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQjogRE1BIGNoYW5uZWwgNCBpcyB1c2VkIGJ5IHRoZSBETUEgYnVyc3QgY29udHJvbGxlcgorICAqICAgICAgIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQzogRE1BIGNoYW5uZWwgNSBpcyB1c2VkIGJ5IHRoZSBETUEgYnVyc3QgY29udHJvbGxlcgorICAqICAgICAgIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRDogRE1BIGNoYW5uZWwgNiBpcyB1c2VkIGJ5IHRoZSBETUEgYnVyc3QgY29udHJvbGxlcgorICAqICAgICAgIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRTogRE1BIGNoYW5uZWwgNyBpcyB1c2VkIGJ5IHRoZSBETUEgYnVyc3QgY29udHJvbGxlcgorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX0J1cnN0RE1BVHJhbnNmZXIoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdXJzdEJ1ZmZlckFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdXJzdEJ1ZmZlckxlbmd0aCkKK3sKKyAgRE1BX0hhbmRsZVR5cGVEZWYgKiBoZG1hOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19IUlRJTV9USU1FUklOREVYKFRpbWVySWR4KSk7CisgIAorICBpZigoaGhydGltLT5TdGF0ZSA9PSBIQUxfSFJUSU1fU1RBVEVfQlVTWSkpCisgIHsKKyAgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisgIGlmKChoaHJ0aW0tPlN0YXRlID09IEhBTF9IUlRJTV9TVEFURV9SRUFEWSkpCisgIHsKKyAgICBpZigoQnVyc3RCdWZmZXJBZGRyZXNzID09IDBVICkgfHwgKEJ1cnN0QnVmZmVyTGVuZ3RoID09IDBVKSkgCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfQlVTWTsKKyAgICB9CisgIH0KKyAgCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGhydGltKTsKKyAgCisgIC8qIEdldCB0aGUgdGltZXIgRE1BIGhhbmRsZXIgKi8KKyAgaGRtYSA9IEhSVElNX0dldERNQUhhbmRsZUZyb21UaW1lcklkeChoaHJ0aW0sIFRpbWVySWR4KTsKKworICBpZiAoaGRtYSA9PSBOVUxMKSAKKyAgeworICAgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfRVJST1I7IAorCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaHJ0aW0pOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFNldCB0aGUgRE1BIHRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayAqLworICBoZG1hLT5YZmVyQ3BsdENhbGxiYWNrID0gSFJUSU1fQnVyc3RETUFDcGx0OworICAKKyAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgaGRtYS0+WGZlckVycm9yQ2FsbGJhY2sgPSBIUlRJTV9ETUFFcnJvciA7CisgIAorICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgIEhBTF9ETUFfU3RhcnRfSVQoaGRtYSwgCisgICAgICAgICAgICAgICAgICAgQnVyc3RCdWZmZXJBZGRyZXNzLCAKKyAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJihoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5CRE1BRFIpLAorICAgICAgICAgICAgICAgICAgIEJ1cnN0QnVmZmVyTGVuZ3RoKTsKKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfUkVBRFk7IAorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhocnRpbSk7ICAKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlcyB0aGUgdHJhbnNmZXIgZnJvbSBwcmVsb2FkIHRvIGFjdGl2ZSByZWdpc3RlcnMgZm9yIG9uZQorICAqICAgICAgICAgb3Igc2V2ZXJhbCB0aW1pbmcgdW5pdHMgKGluY2x1ZGluZyBtYXN0ZXIgdGltZXIpLgorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZXJzIFRpbWVyKHMpIGNvbmNlcm5lZCBieSB0aGUgcmVnaXN0ZXIgcHJlbG9hZCBlbmFibGluZyBjb21tYW5kCisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSVVBEQVRFX01BU1RFUiAKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSVVBEQVRFX0EgCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUlVQREFURV9CIAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJVUERBVEVfQyAKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSVVBEQVRFX0QgCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUlVQREFURV9FIAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1VwZGF0ZUVuYWJsZShIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcnMpCit7CisgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNRVJVUERBVEUoVGltZXJzKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaHJ0aW0pOworICAKKyAgaGhydGltLT5TdGF0ZSA9IEhBTF9IUlRJTV9TVEFURV9CVVNZOyAKKyAgCisgIC8qIEVuYWJsZSB0aW1lcihzKSByZWdpc3RlcnMgdXBkYXRlICovCisgIGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLkNSMSAmPSB+KFRpbWVycyk7CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX1JFQURZOyAKKyAgICAgICAgICAgICAgICAgIAorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaHJ0aW0pOyAgICAgIAorICAKKyAgcmV0dXJuIEhBTF9PSzsKKyAgfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGVzIHRoZSB0cmFuc2ZlciBmcm9tIHByZWxvYWQgdG8gYWN0aXZlIHJlZ2lzdGVycyBmb3Igb25lCisgICogICAgICAgICBvciBzZXZlcmFsIHRpbWluZyB1bml0cyAoaW5jbHVkaW5nIG1hc3RlciB0aW1lcikuCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBUaW1lcnMgVGltZXIocykgY29uY2VybmVkIGJ5IHRoZSByZWdpc3RlciBwcmVsb2FkIGRpc2FibGluZyBjb21tYW5kCisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSVVBEQVRFX01BU1RFUiAKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSVVBEQVRFX0EgCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUlVQREFURV9CIAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJVUERBVEVfQyAKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSVVBEQVRFX0QgCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUlVQREFURV9FIAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hSVElNX1VwZGF0ZURpc2FibGUoSFJUSU1fSGFuZGxlVHlwZURlZiAqaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJzKQoreworICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTUVSVVBEQVRFKFRpbWVycykpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGhydGltKTsKKyAgCisgIGhocnRpbS0+U3RhdGUgPSBIQUxfSFJUSU1fU1RBVEVfQlVTWTsgCisgIAorICAvKiBFbmFibGUgdGltZXIocykgcmVnaXN0ZXJzIHVwZGF0ZSAqLworICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5DUjEgfD0gKFRpbWVycyk7CisgIAorICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX1JFQURZOyAKKyAgICAgICAgICAgICAgICAgIAorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaHJ0aW0pOyAgICAgIAorICAKKyAgcmV0dXJuIEhBTF9PSzsKKyAgfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDkgUGVyaXBoZXJhbCBzdGF0ZSBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgCitAdmVyYmF0aW0gICAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIHVzZWQgdG8gZ2V0IEhSVElNIG9yIEhSVElNIHRpbWVyIAorICAgICAgICAgIHNwZWNpZmljIGluZm9ybWF0aW9uOgorICAgICAgKCspIEdldCBIUlRJTSBIQUwgc3RhdGUgCisgICAgICAoKykgR2V0IGNhcHR1cmVkIHZhbHVlIAorICAgICAgKCspIEdldCBIUlRJTSB0aW1lciBvdXRwdXQgbGV2ZWwgCisgICAgICAoKykgR2V0IEhSVElNIHRpbWVyIG91dHB1dCBzdGF0ZSAKKyAgICAgICgrKSBHZXQgZGVsYXllZCBwcm90ZWN0aW9uIHN0YXR1cyAgCisgICAgICAoKykgR2V0IGJ1cnN0IHN0YXR1cyAKKyAgICAgICgrKSBHZXQgY3VycmVudCBwdXNoLXB1bGwgc3RhdHVzICAKKyAgICAgICgrKSBHZXQgaWRsZSBwdXNoLXB1bGwgc3RhdHVzICAKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICByZXR1cm4gdGhlIEhSVElNIEhBTCBzdGF0ZQorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfSFJUSU1fU3RhdGVUeXBlRGVmIEhBTF9IUlRJTV9HZXRTdGF0ZShIUlRJTV9IYW5kbGVUeXBlRGVmKiBoaHJ0aW0pCit7CisgIC8qIFJldHVybiBIUlRJTSBzdGF0ZSAqLworICByZXR1cm4gaGhydGltLT5TdGF0ZTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm5zIGFjdHVhbCB2YWx1ZSBvZiB0aGUgY2FwdHVyZSByZWdpc3RlciBvZiB0aGUgZGVzaWduYXRlZCBjYXB0dXJlIHVuaXQgCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBUaW1lcklkeCBUaW1lciBpbmRleAorICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0EgZm9yIHRpbWVyIEEKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQiBmb3IgdGltZXIgQgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9DIGZvciB0aW1lciBDCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0QgZm9yIHRpbWVyIEQKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRSBmb3IgdGltZXIgRQorICAqIEBwYXJhbSAgQ2FwdHVyZVVuaXQgQ2FwdHVyZSB1bml0IHRvIHRyaWcKKyAgKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fQ0FQVFVSRVVOSVRfMTogQ2FwdHVyZSB1bml0IDEKKyAgKiAgICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9DQVBUVVJFVU5JVF8yOiBDYXB0dXJlIHVuaXQgMgorICAqIEByZXR2YWwgQ2FwdHVyZWQgdmFsdWUKKyAgKi8KK3VpbnQzMl90IEhBTF9IUlRJTV9HZXRDYXB0dXJlZFZhbHVlKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENhcHR1cmVVbml0KQoreworICB1aW50MzJfdCBjYXB0dXJlZF92YWx1ZSA9IDBVOworICAKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNSU5HX1VOSVQoVGltZXJJZHgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX0NBUFRVUkVVTklUKENhcHR1cmVVbml0KSk7CisKKyAgLyogUmVhZCBjYXB0dXJlZCB2YWx1ZSAqLworICBzd2l0Y2ggKENhcHR1cmVVbml0KQorICB7CisgIGNhc2UgSFJUSU1fQ0FQVFVSRVVOSVRfMToKKyAgICB7CisgICAgICBjYXB0dXJlZF92YWx1ZSA9IGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5DUFQxeFI7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEhSVElNX0NBUFRVUkVVTklUXzI6CisgICAgeworICAgICAgY2FwdHVyZWRfdmFsdWUgPSBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uQ1BUMnhSOworICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorICAKKyAgcmV0dXJuIGNhcHR1cmVkX3ZhbHVlOyAKK30KKworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgYWN0dWFsIGxldmVsIChhY3RpdmUgb3IgaW5hY3RpdmUpIG9mIHRoZSBkZXNpZ25hdGVkIG91dHB1dCAKKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVySWR4IFRpbWVyIGluZGV4CisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICogQHBhcmFtICBPdXRwdXQgVGltZXIgb3V0cHV0CisgICogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RBMTogVGltZXIgQSAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RBMjogVGltZXIgQSAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RCMTogVGltZXIgQiAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RCMjogVGltZXIgQiAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RDMTogVGltZXIgQyAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RDMjogVGltZXIgQyAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1REMTogVGltZXIgRCAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1REMjogVGltZXIgRCAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RFMTogVGltZXIgRSAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RFMjogVGltZXIgRSAtIE91dHB1dCAyCisgICogQHJldHZhbCBPdXRwdXQgbGV2ZWwKKyAgKiBAbm90ZSBSZXR1cm5lZCBvdXRwdXQgbGV2ZWwgaXMgdGFrZW4gYmVmb3JlIHRoZSBvdXRwdXQgc3RhZ2UgKGNob3BwZXIsIAorICAqICAgICAgICBwb2xhcml0eSkuCisgICovCit1aW50MzJfdCBIQUxfSFJUSU1fV2F2ZWZvcm1HZXRPdXRwdXRMZXZlbChIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPdXRwdXQpCit7CisgIHVpbnQzMl90IG91dHB1dF9sZXZlbCA9IEhSVElNX09VVFBVVExFVkVMX0lOQUNUSVZFOworICAKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNRVJfT1VUUFVUKFRpbWVySWR4LCBPdXRwdXQpKTsKKyAgCisgIC8qIFJlYWQgdGhlIG91dHB1dCBsZXZlbCAqLworICBzd2l0Y2ggKE91dHB1dCkKKyAgeworICBjYXNlIEhSVElNX09VVFBVVF9UQTE6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RCMToKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEMxOgorICBjYXNlIEhSVElNX09VVFBVVF9URDE6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RFMToKKyAgICB7CisgICAgICBpZiAoKGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5USU14SVNSICYgSFJUSU1fVElNSVNSX08xQ1BZKSAhPSBSRVNFVCkKKyAgICAgIHsKKyAgICAgICAgb3V0cHV0X2xldmVsID0gSFJUSU1fT1VUUFVUTEVWRUxfQUNUSVZFOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBvdXRwdXRfbGV2ZWwgPSBIUlRJTV9PVVRQVVRMRVZFTF9JTkFDVElWRTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RBMjoKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEIyOgorICBjYXNlIEhSVElNX09VVFBVVF9UQzI6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1REMjoKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEUyOgorICAgIHsKKyAgICAgIGlmICgoaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLlRJTXhJU1IgJiBIUlRJTV9USU1JU1JfTzJDUFkpICE9IFJFU0VUKQorICAgICAgeworICAgICAgICBvdXRwdXRfbGV2ZWwgPSBIUlRJTV9PVVRQVVRMRVZFTF9BQ1RJVkU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIG91dHB1dF9sZXZlbCA9IEhSVElNX09VVFBVVExFVkVMX0lOQUNUSVZFOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorICAKKyAgcmV0dXJuIG91dHB1dF9sZXZlbDsgCit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyBhY3R1YWwgc3RhdGUgKFJVTiwgSURMRSwgRkFVTFQpIG9mIHRoZSBkZXNpZ25hdGVkIG91dHB1dCAKKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVySWR4IFRpbWVyIGluZGV4CisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICogQHBhcmFtICBPdXRwdXQgVGltZXIgb3V0cHV0CisgICogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RBMTogVGltZXIgQSAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RBMjogVGltZXIgQSAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RCMTogVGltZXIgQiAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RCMjogVGltZXIgQiAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RDMTogVGltZXIgQyAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RDMjogVGltZXIgQyAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1REMTogVGltZXIgRCAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1REMjogVGltZXIgRCAtIE91dHB1dCAyCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RFMTogVGltZXIgRSAtIE91dHB1dCAxCisgICogICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fT1VUUFVUX1RFMjogVGltZXIgRSAtIE91dHB1dCAyCisgICogQHJldHZhbCBPdXRwdXQgc3RhdGUKKyAgKi8KK3VpbnQzMl90IEhBTF9IUlRJTV9XYXZlZm9ybUdldE91dHB1dFN0YXRlKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE91dHB1dCkKK3sKKyAgdWludDMyX3Qgb3V0cHV0X2JpdCA9IDBVOworICB1aW50MzJfdCBvdXRwdXRfc3RhdGUgPSBIUlRJTV9PVVRQVVRTVEFURV9JRExFOworICAKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNRVJfT1VUUFVUKFRpbWVySWR4LCBPdXRwdXQpKTsKKyAgCisgIC8qIFNldCBvdXRwdXQgc3RhdGUgYWNjb3JkaW5nIHRvIG91dHB1dCBjb250cm9sIHN0YXR1cyBhbmQgb3V0cHV0IGRpc2FibGUgc3RhdHVzICovCisgIHN3aXRjaCAoT3V0cHV0KQorICB7CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RBMToKKyAgICB7CisgICAgICBvdXRwdXRfYml0ID0gSFJUSU1fT0VOUl9UQTFPRU47CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEhSVElNX09VVFBVVF9UQTI6CisgICAgeworICAgICAgb3V0cHV0X2JpdCA9IEhSVElNX09FTlJfVEEyT0VOOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEIxOgorICAgIHsKKyAgICAgIG91dHB1dF9iaXQgPSBIUlRJTV9PRU5SX1RCMU9FTjsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RCMjoKKyAgICB7CisgICAgICBvdXRwdXRfYml0ID0gSFJUSU1fT0VOUl9UQjJPRU47CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEhSVElNX09VVFBVVF9UQzE6CisgICAgeworICAgICAgb3V0cHV0X2JpdCA9IEhSVElNX09FTlJfVEMxT0VOOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEMyOgorICAgIHsKKyAgICAgIG91dHB1dF9iaXQgPSBIUlRJTV9PRU5SX1RDMk9FTjsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fT1VUUFVUX1REMToKKyAgICB7CisgICAgICBvdXRwdXRfYml0ID0gSFJUSU1fT0VOUl9URDFPRU47CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEhSVElNX09VVFBVVF9URDI6CisgICAgeworICAgICAgb3V0cHV0X2JpdCA9IEhSVElNX09FTlJfVEQyT0VOOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEUxOgorICAgIHsKKyAgICAgIG91dHB1dF9iaXQgPSBIUlRJTV9PRU5SX1RFMU9FTjsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RFMjoKKyAgICB7CisgICAgICBvdXRwdXRfYml0ID0gSFJUSU1fT0VOUl9URTJPRU47CisgICAgfQorICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9CisgIAorICBpZiAoKGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLk9FTlIgJiBvdXRwdXRfYml0KSAhPSBSRVNFVCkKKyAgeworICAgIC8qIE91dHB1dCBpcyBlbmFibGVkOiBvdXRwdXQgaW4gUlVOIHN0YXRlICh3aGF0ZXZlciBvdXB1dCBkaXNhYmxlIHN0YXR1cyBpcykqLworICAgIG91dHB1dF9zdGF0ZSA9IEhSVElNX09VVFBVVFNUQVRFX1JVTjsKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiAoKGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLk9EU1IgJiBvdXRwdXRfYml0KSAhPSBSRVNFVCkKKyAgICB7CisgICAgLyogT3V0cHV0IGlzIGRpc2FibGVkOiBvdXRwdXQgaW4gRkFVTFQgc3RhdGUgKi8KKyAgICAgIG91dHB1dF9zdGF0ZSA9IEhSVElNX09VVFBVVFNUQVRFX0ZBVUxUOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogT3V0cHV0IGlzIGRpc2FibGVkOiBvdXRwdXQgaW4gSURMRSBzdGF0ZSAqLworICAgICAgb3V0cHV0X3N0YXRlID0gSFJUSU1fT1VUUFVUU1RBVEVfSURMRTsKKyAgICB9CisgIH0KKyAgCisgIHJldHVybihvdXRwdXRfc3RhdGUpOyAgCit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyB0aGUgbGV2ZWwgKGFjdGl2ZSBvciBpbmFjdGl2ZSkgb2YgdGhlIGRlc2lnbmF0ZWQgb3V0cHV0IAorICAqICAgICAgICAgd2hlbiB0aGUgZGVsYXllZCBwcm90ZWN0aW9uIHdhcyB0cmlnZ2VyZWQuCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBUaW1lcklkeCBUaW1lciBpbmRleAorICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0EgZm9yIHRpbWVyIEEKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQiBmb3IgdGltZXIgQgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9DIGZvciB0aW1lciBDCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0QgZm9yIHRpbWVyIEQKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRSBmb3IgdGltZXIgRQorICAqIEBwYXJhbSAgT3V0cHV0IFRpbWVyIG91dHB1dAorICAqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQTE6IFRpbWVyIEEgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQTI6IFRpbWVyIEEgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQjE6IFRpbWVyIEIgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQjI6IFRpbWVyIEIgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQzE6IFRpbWVyIEMgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQzI6IFRpbWVyIEMgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URDE6IFRpbWVyIEQgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URDI6IFRpbWVyIEQgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URTE6IFRpbWVyIEUgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URTI6IFRpbWVyIEUgLSBPdXRwdXQgMgorICAqIEByZXR2YWwgRGVsYXllZCBwcm90ZWN0aW9uIHN0YXR1cyAKKyAgKi8KK3VpbnQzMl90IEhBTF9IUlRJTV9HZXREZWxheWVkUHJvdGVjdGlvblN0YXR1cyhIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE91dHB1dCkKK3sKKyAgdWludDMyX3QgZGVsYXllZF9wcm90ZWN0aW9uX3N0YXR1cyA9IEhSVElNX09VVFBVVExFVkVMX0lOQUNUSVZFOworICAKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSFJUSU1fVElNRVJfT1VUUFVUKFRpbWVySWR4LCBPdXRwdXQpKTsKKworICAvKiBSZWFkIHRoZSBkZWxheWVkIHByb3RlY3Rpb24gc3RhdHVzICovCisgIHN3aXRjaCAoT3V0cHV0KQorICB7CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RBMToKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEIxOgorICBjYXNlIEhSVElNX09VVFBVVF9UQzE6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1REMToKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEUxOgorICAgIHsKKyAgICAgIGlmICgoaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLlRJTXhJU1IgJiBIUlRJTV9USU1JU1JfTzFTVEFUKSAhPSBSRVNFVCkKKyAgICAgIHsKKyAgICAgICAgLyogT3V0cHV0IDEgd2FzIGFjdGl2ZSB3aGVuIHRoZSBkZWxheWVkIGlkbGUgcHJvdGVjdGlvbiB3YXMgdHJpZ2dlcmVkICovCisgICAgICAgIGRlbGF5ZWRfcHJvdGVjdGlvbl9zdGF0dXMgPSBIUlRJTV9PVVRQVVRMRVZFTF9BQ1RJVkU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIE91dHB1dCAxIHdhcyBpbmFjdGl2ZSB3aGVuIHRoZSBkZWxheWVkIGlkbGUgcHJvdGVjdGlvbiB3YXMgdHJpZ2dlcmVkICovCisgICAgICAgIGRlbGF5ZWRfcHJvdGVjdGlvbl9zdGF0dXMgPSBIUlRJTV9PVVRQVVRMRVZFTF9JTkFDVElWRTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RBMjoKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEIyOgorICBjYXNlIEhSVElNX09VVFBVVF9UQzI6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1REMjoKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEUyOgorICAgIHsKKyAgICAgIGlmICgoaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLlRJTXhJU1IgJiBIUlRJTV9USU1JU1JfTzJTVEFUKSAhPSBSRVNFVCkKKyAgICAgIHsKKyAgICAgICAgLyogT3V0cHV0IDIgd2FzIGFjdGl2ZSB3aGVuIHRoZSBkZWxheWVkIGlkbGUgcHJvdGVjdGlvbiB3YXMgdHJpZ2dlcmVkICovCisgICAgICAgIGRlbGF5ZWRfcHJvdGVjdGlvbl9zdGF0dXMgPSBIUlRJTV9PVVRQVVRMRVZFTF9BQ1RJVkU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIE91dHB1dCAyIHdhcyBpbmFjdGl2ZSB3aGVuIHRoZSBkZWxheWVkIGlkbGUgcHJvdGVjdGlvbiB3YXMgdHJpZ2dlcmVkICovCisgICAgICAgIGRlbGF5ZWRfcHJvdGVjdGlvbl9zdGF0dXMgPSBIUlRJTV9PVVRQVVRMRVZFTF9JTkFDVElWRTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KKyAgCisgIHJldHVybiBkZWxheWVkX3Byb3RlY3Rpb25fc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgdGhlIGFjdHVhbCBzdGF0dXMgKGFjdGl2ZSBvciBpbmFjdGl2ZSkgb2YgdGhlIGJ1cnN0IG1vZGUgY29udHJvbGxlciAKKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIEJ1cnN0IG1vZGUgY29udHJvbGxlciBzdGF0dXMgCisgICovCit1aW50MzJfdCBIQUxfSFJUSU1fR2V0QnVyc3RTdGF0dXMoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSkKK3sKKyAgdWludDMyX3QgYnVyc3RfbW9kZV9zdGF0dXM7CisKKyAgLyogUmVhZCBidXJzdCBtb2RlIHN0YXR1cyAqLworICBidXJzdF9tb2RlX3N0YXR1cyA9IChoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5CTUNSICYgSFJUSU1fQk1DUl9CTVNUQVQpOworICAKKyAgcmV0dXJuIGJ1cnN0X21vZGVfc3RhdHVzOyAKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgb24gd2hpY2ggb3V0cHV0IHRoZSBzaWduYWwgaXMgY3VycmVudGx5IGFjdGl2ZSAod2hlbiB0aGUKKyAgKiAgICAgICAgIHB1c2ggcHVsbCBtb2RlIGlzIGVuYWJsZWQpLgorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZXJJZHggVGltZXIgaW5kZXgKKyAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9BIGZvciB0aW1lciBBCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0IgZm9yIHRpbWVyIEIKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQyBmb3IgdGltZXIgQworICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9EIGZvciB0aW1lciBECisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0UgZm9yIHRpbWVyIEUKKyAgKiBAcmV0dmFsIEJ1cnN0IG1vZGUgY29udHJvbGxlciBzdGF0dXMgCisgICovCit1aW50MzJfdCBIQUxfSFJUSU1fR2V0Q3VycmVudFB1c2hQdWxsU3RhdHVzKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4KQoreworICB1aW50MzJfdCBjdXJyZW50X3B1c2hwdWxsX3N0YXR1czsKKworICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTUlOR19VTklUKFRpbWVySWR4KSk7CisKKyAgLyogUmVhZCBjdXJyZW50IHB1c2ggcHVsbCBzdGF0dXMgKi8KKyAgY3VycmVudF9wdXNocHVsbF9zdGF0dXMgPSAoaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLlRJTXhJU1IgJiBIUlRJTV9USU1JU1JfQ1BQU1RBVCk7CisgIAorICByZXR1cm4gY3VycmVudF9wdXNocHVsbF9zdGF0dXM7IAorfQorCisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIG9uIHdoaWNoIG91dHB1dCB0aGUgc2lnbmFsIHdhcyBhcHBsaWVkLCBpbiBwdXNoLXB1bGwgbW9kZSwKKyAgICAgICAgICAgIGJhbGFuY2VkIGZhdWx0IG1vZGUgb3IgZGVsYXllZCBpZGxlIG1vZGUsIHdoZW4gdGhlIHByb3RlY3Rpb24gd2FzIHRyaWdnZXJlZC4KKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVySWR4IFRpbWVyIGluZGV4CisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICogQHJldHZhbCBJZGxlIFB1c2ggUHVsbCBTdGF0dXMgCisgICovCit1aW50MzJfdCBIQUxfSFJUSU1fR2V0SWRsZVB1c2hQdWxsU3RhdHVzKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4KQoreworICB1aW50MzJfdCBpZGxlX3B1c2hwdWxsX3N0YXR1czsKKworICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX1RJTUlOR19VTklUKFRpbWVySWR4KSk7CisKKyAgLyogUmVhZCBjdXJyZW50IHB1c2ggcHVsbCBzdGF0dXMgKi8KKyAgaWRsZV9wdXNocHVsbF9zdGF0dXMgPSAoaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLlRJTXhJU1IgJiBIUlRJTV9USU1JU1JfSVBQU1RBVCk7CisgIAorICByZXR1cm4gaWRsZV9wdXNocHVsbF9zdGF0dXM7IAorfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhSVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEwIEludGVycnVwdHMgaGFuZGxpbmcKKyAqICBAYnJpZWYgIEZ1bmN0aW9ucyBjYWxsZWQgd2hlbiBIUlRJTSBnZW5lcmF0ZXMgYW4gaW50ZXJydXB0CisgKiAgICAgICAgICA3IGludGVycnVwdHMgY2FuIGJlIGdlbmVyYXRlZCBieSB0aGUgbWFzdGVyIHRpbWVyOgorICogICAgICAgICAgICAtIE1hc3RlciB0aW1lciByZWdpc3RlcnMgdXBkYXRlCisgKiAgICAgICAgICAgIC0gU3luY2hyb25pemF0aW9uIGV2ZW50IHJlY2VpdmVkCisgKiAgICAgICAgICAgIC0gTWFzdGVyIHRpbWVyIHJlcGV0aXRpb24gZXZlbnQKKyAqICAgICAgICAgICAgLSBNYXN0ZXIgQ29tcGFyZSAxIHRvIDQgZXZlbnQKKyAqICAgICAgICAgIDE0IGludGVycnVwdHMgY2FuIGJlIGdlbmVyYXRlZCBieSBlYWNoIHRpbWluZyB1bml0OgorICogICAgICAgICAgICAtIERlbGF5ZWQgcHJvdGVjdGlvbiB0cmlnZ2VyZWQKKyAqICAgICAgICAgICAgLSBDb3VudGVyIHJlc2V0IG9yIHJvbGwtb3ZlciBldmVudAorICogICAgICAgICAgICAtIE91dHB1dCAxIGFuZCBvdXRwdXQgMiByZXNldCAodHJhbnNpdGlvbiBhY3RpdmUgdG8gaW5hY3RpdmUpCisgKiAgICAgICAgICAgIC0gT3V0cHV0IDEgYW5kIG91dHB1dCAyIHNldCAodHJhbnNpdGlvbiBpbmFjdGl2ZSB0byBhY3RpdmUpCisgKiAgICAgICAgICAgIC0gQ2FwdHVyZSAxIGFuZCAyIGV2ZW50cworICogICAgICAgICAgICAtIFRpbWluZyB1bml0IHJlZ2lzdGVycyB1cGRhdGUKKyAqICAgICAgICAgICAgLSBSZXBldGl0aW9uIGV2ZW50CisgKiAgICAgICAgICAgIC0gQ29tcGFyZSAxIHRvIDQgZXZlbnQKKyAqICAgICAgICAgIDggZ2xvYmFsIGludGVycnVwdHMgYXJlIGdlbmVyYXRlZCBmb3IgdGhlIHdob2xlIEhSVElNOgorICogICAgICAgICAgICAtIFN5c3RlbSBmYXVsdCBhbmQgRmF1bHQgMSB0byA1IChyZWdhcmRsZXNzIG9mIHRoZSB0aW1pbmcgdW5pdCBhdHRyaWJ1dGlvbikKKyAqICAgICAgICAgICAgLSBETEwgY2FsaWJyYXRpb24gZG9uZQorICogICAgICAgICAgICAtIEJ1cnN0IG1vZGUgcGVyaW9kIGNvbXBsZXRlZAorQHZlcmJhdGltICAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhSVElNIGludGVycnVwdHMgaGFuZGxpbmcgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBtYW5hZ2UgdGhlIEhSVElNICAKKyAgICBpbnRlcnJ1cHRzOgorICAgICAgKCspICBIUlRJTSBpbnRlcnJ1cHQgaGFuZGxlcgorICAgICAgKCspICBDYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBGYXVsdDEgaW50ZXJydXB0IG9jY3VycworICAgICAgKCspICBDYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBGYXVsdDIgaW50ZXJydXB0IG9jY3VycworICAgICAgKCspICBDYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBGYXVsdDMgaW50ZXJydXB0IG9jY3VycworICAgICAgKCspICBDYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBGYXVsdDQgaW50ZXJydXB0IG9jY3VycworICAgICAgKCspICBDYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBGYXVsdDUgaW50ZXJydXB0IG9jY3VycworICAgICAgKCspICBDYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBzeXN0ZW0gRmF1bHQgaW50ZXJydXB0IG9jY3VycworICAgICAgKCspICBDYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBETEwgcmVhZHkgaW50ZXJydXB0IG9jY3VycworICAgICAgKCspICBDYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBidXJzdCBtb2RlIHBlcmlvZCBpbnRlcnJ1cHQgb2NjdXJzCisgICAgICAoKykgIENhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHN5bmNocm9uaXphdGlvbiBpbnB1dCBpbnRlcnJ1cHQgb2NjdXJzCisgICAgICAoKykgIENhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIGEgdGltZXIgcmVnaXN0ZXIgdXBkYXRlIGludGVycnVwdCBvY2N1cnMKKyAgICAgICgrKSAgQ2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIHdoZW4gYSB0aW1lciByZXBldGl0aW9uIGludGVycnVwdCBvY2N1cnMKKyAgICAgICgrKSAgQ2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIHdoZW4gYSBjb21wYXJlIDEgbWF0Y2ggaW50ZXJydXB0IG9jY3VycworICAgICAgKCspICBDYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhIGNvbXBhcmUgMiBtYXRjaCBpbnRlcnJ1cHQgb2NjdXJzCisgICAgICAoKykgIENhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIGEgY29tcGFyZSAzIG1hdGNoIGludGVycnVwdCBvY2N1cnMKKyAgICAgICgrKSAgQ2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIHdoZW4gYSBjb21wYXJlIDQgbWF0Y2ggaW50ZXJydXB0IG9jY3VycworICAgICAgKCspICBDYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhIGNhcHR1cmUgMSBpbnRlcnJ1cHQgb2NjdXJzCisgICAgICAoKykgIENhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIGEgY2FwdHVyZSAyIGludGVycnVwdCBvY2N1cnMKKyAgICAgICgrKSAgQ2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIHdoZW4gYSBkZWxheWVkIHByb3RlY3Rpb24gaW50ZXJydXB0IG9jY3VycworICAgICAgKCspICBDYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhIHRpbWVyIGNvdW50ZXIgcmVzZXQgaW50ZXJydXB0IG9jY3VycworICAgICAgKCspICBDYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhIHRpbWVyIG91dHB1dCAxIHNldCBpbnRlcnJ1cHQgb2NjdXJzCisgICAgICAoKykgIENhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIGEgdGltZXIgb3V0cHV0IDEgcmVzZXQgaW50ZXJydXB0IG9jY3VycworICAgICAgKCspICBDYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhIHRpbWVyIG91dHB1dCAyIHNldCBpbnRlcnJ1cHQgb2NjdXJzCisgICAgICAoKykgIENhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIGEgdGltZXIgb3V0cHV0IDIgcmVzZXQgaW50ZXJydXB0IG9jY3VycworICAgICAgKCspICBDYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhIHRpbWVyIG91dHB1dCAyIHJlc2V0IGludGVycnVwdCBvY2N1cnMKKyAgICAgICgrKSAgQ2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIHVwb24gY29tcGxldGlvbiBvZiBhIGJ1cnN0IERNQSB0cmFuc2ZlcgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBIUlRJTSBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVySWR4IFRpbWVyIGluZGV4CisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBvZiBAcmVmIEhSVElNX1RpbWVyX0luZGV4CisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9IUlRJTV9JUlFIYW5kbGVyKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4KQoreworICAvKiBIUlRJTSBpbnRlcnJ1cHRzIGhhbmRsaW5nICovCisgIGlmIChUaW1lcklkeCA9PSBIUlRJTV9USU1FUklOREVYX0NPTU1PTikKKyAgeworICAgIEhSVElNX0hSVElNX0lTUihoaHJ0aW0pOworICB9CisgIGVsc2UgaWYgKFRpbWVySWR4ID09IEhSVElNX1RJTUVSSU5ERVhfTUFTVEVSKQorICB7CisgICAgLyogTWFzdGVyIHJlbGF0ZWQgaW50ZXJydXB0cyBoYW5kbGluZyAqLworICAgICAgSFJUSU1fTWFzdGVyX0lTUihoaHJ0aW0pOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFRpbWluZyB1bml0IHJlbGF0ZWQgaW50ZXJydXB0cyBoYW5kbGluZyAqLworICAgIEhSVElNX1RpbWVyX0lTUihoaHJ0aW0sIFRpbWVySWR4KTsKKyAgfQorICAKK30KKworLyoqCisgICogQGJyaWVmICBDYWxsYmFjayBmdW5jdGlvbiBpbnZva2VkIHdoZW4gYSBmYXVsdCAxIGludGVycnVwdCBvY2N1cmVkCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlICAqIEByZXR2YWwgTm9uZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0hSVElNX0ZhdWx0MUNhbGxiYWNrKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhocnRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9IUlRJTV9GYXVsdDFDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQGJyaWVmICBDYWxsYmFjayBmdW5jdGlvbiBpbnZva2VkIHdoZW4gYSBmYXVsdCAyIGludGVycnVwdCBvY2N1cmVkCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSFJUSU1fRmF1bHQyQ2FsbGJhY2soSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGhydGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0hSVElNX0ZhdWx0MkNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovIAorfQorCisvKioKKyAgKiBAYnJpZWYgIENhbGxiYWNrIGZ1bmN0aW9uIGludm9rZWQgd2hlbiBhIGZhdWx0IDMgaW50ZXJydXB0IG9jY3VyZWQKKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUgCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSFJUSU1fRmF1bHQzQ2FsbGJhY2soSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGhydGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0hSVElNX0ZhdWx0M0NhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovIAorfQorCisvKioKKyAgKiBAYnJpZWYgIENhbGxiYWNrIGZ1bmN0aW9uIGludm9rZWQgd2hlbiBhIGZhdWx0IDQgaW50ZXJydXB0IG9jY3VyZWQKKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUgCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSFJUSU1fRmF1bHQ0Q2FsbGJhY2soSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGhydGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0hSVElNX0ZhdWx0NENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovIAorfQorCisvKioKKyAgKiBAYnJpZWYgIENhbGxiYWNrIGZ1bmN0aW9uIGludm9rZWQgd2hlbiBhIGZhdWx0IDUgaW50ZXJydXB0IG9jY3VyZWQKKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUgIAorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0hSVElNX0ZhdWx0NUNhbGxiYWNrKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhocnRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9IUlRJTV9GYXVsdDVDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQGJyaWVmICBDYWxsYmFjayBmdW5jdGlvbiBpbnZva2VkIHdoZW4gYSBzeXN0ZW0gZmF1bHQgaW50ZXJydXB0IG9jY3VyZWQKKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUgIAorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0hSVElNX1N5c3RlbUZhdWx0Q2FsbGJhY2soSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGhydGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0hSVElNX1N5c3RlbUZhdWx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gCit9CisKKy8qKgorICAqIEBicmllZiAgQ2FsbGJhY2sgZnVuY3Rpb24gaW52b2tlZCB3aGVuIHRoZSBETEwgY2FsaWJyYXRpb24gaXMgY29tcGxldGVkCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9IUlRJTV9ETExDYWxicmF0aW9uUmVhZHlDYWxsYmFjayhIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaHJ0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSFJUSU1fRExMQ2FsYnJhdGlvbkNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovIAorfQorCisvKioKKyAgKiBAYnJpZWYgIENhbGxiYWNrIGZ1bmN0aW9uIGludm9rZWQgd2hlbiB0aGUgZW5kIG9mIHRoZSBidXJzdCBtb2RlIHBlcmlvZCBpcyByZWFjaGVkCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9IUlRJTV9CdXJzdE1vZGVQZXJpb2RDYWxsYmFjayhIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaHJ0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSFJUSU1fQnVyc3RNb2RlQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gCit9CisKKy8qKgorICAqIEBicmllZiAgQ2FsbGJhY2sgZnVuY3Rpb24gaW52b2tlZCB3aGVuIGEgc3luY2hyb25pemF0aW9uIGlucHV0IGV2ZW50IGlzIHJlY2VpdmVkCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9IUlRJTV9TeW5jaHJvbml6YXRpb25FdmVudENhbGxiYWNrKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhocnRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9IUlRJTV9TeW5jaHJvbml6YXRpb25FdmVudENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovIAorfQorCisvKioKKyAgKiBAYnJpZWYgIENhbGxiYWNrIGZ1bmN0aW9uIGludm9rZWQgd2hlbiB0aW1lciByZWdpc3RlcnMgYXJlIHVwZGF0ZWQKKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUgIAorICAqIEBwYXJhbSAgVGltZXJJZHggVGltZXIgaW5kZXgKKyAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9NQVNURVIgIGZvciBtYXN0ZXIgdGltZXIKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSFJUSU1fUmVnaXN0ZXJzVXBkYXRlQ2FsbGJhY2soSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGhydGltKTsKKyAgVU5VU0VEKFRpbWVySWR4KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0hSVElNX01hc3Rlcl9SZWdpc3RlcnNVcGRhdGVDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQGJyaWVmICBDYWxsYmFjayBmdW5jdGlvbiBpbnZva2VkIHdoZW4gdGltZXIgcmVwZXRpdGlvbiBwZXJpb2QgaGFzIGVsYXBzZWQKKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUgIAorICAqIEBwYXJhbSAgVGltZXJJZHggVGltZXIgaW5kZXgKKyAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9NQVNURVIgIGZvciBtYXN0ZXIgdGltZXIKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSFJUSU1fUmVwZXRpdGlvbkV2ZW50Q2FsbGJhY2soSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGhydGltKTsKKyAgVU5VU0VEKFRpbWVySWR4KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0hSVElNX01hc3Rlcl9SZXBldGl0aW9uRXZlbnRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQGJyaWVmICBDYWxsYmFjayBmdW5jdGlvbiBpbnZva2VkIHdoZW4gdGhlIHRpbWVyIGNvdW50ZXIgbWF0Y2hlcyB0aGUgdmFsdWUKKyAgKiAgICAgICAgIHByb2dyYW1tZWQgaW4gdGhlIGNvbXBhcmUgMSByZWdpc3RlcgorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZSAgCisgICogQHBhcmFtICBUaW1lcklkeCBUaW1lciBpbmRleAorICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX01BU1RFUiAgZm9yIG1hc3RlciB0aW1lcgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9BIGZvciB0aW1lciBBCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0IgZm9yIHRpbWVyIEIKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQyBmb3IgdGltZXIgQworICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9EIGZvciB0aW1lciBECisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0UgZm9yIHRpbWVyIEUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9IUlRJTV9Db21wYXJlMUV2ZW50Q2FsbGJhY2soSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGhydGltKTsKKyAgVU5VU0VEKFRpbWVySWR4KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0hSVElNX01hc3Rlcl9Db21wYXJlMUV2ZW50Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gCit9CisKKy8qKgorICAqIEBicmllZiAgQ2FsbGJhY2sgZnVuY3Rpb24gaW52b2tlZCB3aGVuIHRoZSB0aW1lciBjb3VudGVyIG1hdGNoZXMgdGhlIHZhbHVlCisgICogICAgICAgICBwcm9ncmFtbWVkIGluIHRoZSBjb21wYXJlIDIgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUgIAorICAqIEByZXR2YWwgTm9uZQorICAqIEBwYXJhbSAgVGltZXJJZHggVGltZXIgaW5kZXgKKyAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9NQVNURVIgIGZvciBtYXN0ZXIgdGltZXIKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICovCitfX3dlYWsgdm9pZCBIQUxfSFJUSU1fQ29tcGFyZTJFdmVudENhbGxiYWNrKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhocnRpbSk7CisgIFVOVVNFRChUaW1lcklkeCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9IUlRJTV9NYXN0ZXJfQ29tcGFyZTJFdmVudENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovIAorfQorCisvKioKKyAgKiBAYnJpZWYgIENhbGxiYWNrIGZ1bmN0aW9uIGludm9rZWQgd2hlbiB0aGUgdGltZXIgY291bnRlciBtYXRjaGVzIHRoZSB2YWx1ZQorICAqICAgICAgICAgcHJvZ3JhbW1lZCBpbiB0aGUgY29tcGFyZSAzIHJlZ2lzdGVyCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlICAKKyAgKiBAcGFyYW0gIFRpbWVySWR4IFRpbWVyIGluZGV4CisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfTUFTVEVSICBmb3IgbWFzdGVyIHRpbWVyCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0EgZm9yIHRpbWVyIEEKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQiBmb3IgdGltZXIgQgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9DIGZvciB0aW1lciBDCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0QgZm9yIHRpbWVyIEQKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRSBmb3IgdGltZXIgRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0hSVElNX0NvbXBhcmUzRXZlbnRDYWxsYmFjayhIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaHJ0aW0pOworICBVTlVTRUQoVGltZXJJZHgpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSFJUSU1fTWFzdGVyX0NvbXBhcmUzRXZlbnRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQGJyaWVmICBDYWxsYmFjayBmdW5jdGlvbiBpbnZva2VkIHdoZW4gdGhlIHRpbWVyIGNvdW50ZXIgbWF0Y2hlcyB0aGUgdmFsdWUKKyAgKiAgICAgICAgIHByb2dyYW1tZWQgaW4gdGhlIGNvbXBhcmUgNCByZWdpc3Rlci4KKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUgIAorICAqIEBwYXJhbSAgVGltZXJJZHggVGltZXIgaW5kZXgKKyAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9NQVNURVIgIGZvciBtYXN0ZXIgdGltZXIKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSFJUSU1fQ29tcGFyZTRFdmVudENhbGxiYWNrKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhocnRpbSk7CisgIFVOVVNFRChUaW1lcklkeCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9IUlRJTV9NYXN0ZXJfQ29tcGFyZTRFdmVudENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovIAorfQorCisvKioKKyAgKiBAYnJpZWYgIENhbGxiYWNrIGZ1bmN0aW9uIGludm9rZWQgd2hlbiB0aGUgdGltZXIgeCBjYXB0dXJlIDEgZXZlbnQgb2NjdXJzCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlICAKKyAgKiBAcGFyYW0gIFRpbWVySWR4IFRpbWVyIGluZGV4CisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSFJUSU1fQ2FwdHVyZTFFdmVudENhbGxiYWNrKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhocnRpbSk7CisgIFVOVVNFRChUaW1lcklkeCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9IUlRJTV9UaW1lcl9DYXB0dXJlMUV2ZW50Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gCit9CisKKy8qKgorICAqIEBicmllZiAgQ2FsbGJhY2sgZnVuY3Rpb24gaW52b2tlZCB3aGVuIHRoZSB0aW1lciB4IGNhcHR1cmUgMiBldmVudCBvY2N1cnMKKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUgIAorICAqIEBwYXJhbSAgVGltZXJJZHggVGltZXIgaW5kZXgKKyAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9BIGZvciB0aW1lciBBCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0IgZm9yIHRpbWVyIEIKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQyBmb3IgdGltZXIgQworICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9EIGZvciB0aW1lciBECisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0UgZm9yIHRpbWVyIEUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9IUlRJTV9DYXB0dXJlMkV2ZW50Q2FsbGJhY2soSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGhydGltKTsKKyAgVU5VU0VEKFRpbWVySWR4KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0hSVElNX1RpbWVyX0NhcHR1cmUyRXZlbnRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQGJyaWVmICBDYWxsYmFjayBmdW5jdGlvbiBpbnZva2VkIHdoZW4gdGhlIGRlbGF5ZWQgaWRsZSBvciBiYWxhbmNlZCBpZGxlIG1vZGUgaXMgCisgICogICAgICAgICBlbnRlcmVkLgorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZSAgCisgICogQHBhcmFtICBUaW1lcklkeCBUaW1lciBpbmRleAorICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0EgZm9yIHRpbWVyIEEKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQiBmb3IgdGltZXIgQgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9DIGZvciB0aW1lciBDCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0QgZm9yIHRpbWVyIEQKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRSBmb3IgdGltZXIgRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0hSVElNX0RlbGF5ZWRQcm90ZWN0aW9uQ2FsbGJhY2soSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGhydGltKTsKKyAgVU5VU0VEKFRpbWVySWR4KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0hSVElNX1RpbWVyX0RlbGF5ZWRQcm90ZWN0aW9uQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gCit9CisKKy8qKgorICAqIEBicmllZiAgQ2FsbGJhY2sgZnVuY3Rpb24gaW52b2tlZCB3aGVuIHRoZSB0aW1lciB4IGNvdW50ZXIgcmVzZXQvcm9sbC1vdmVyCisgICogICAgICAgICBldmVudCBvY2N1cnMuCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlICAKKyAgKiBAcGFyYW0gIFRpbWVySWR4IFRpbWVyIGluZGV4CisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQSBmb3IgdGltZXIgQQorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9CIGZvciB0aW1lciBCCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0MgZm9yIHRpbWVyIEMKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRCBmb3IgdGltZXIgRAorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FIGZvciB0aW1lciBFCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSFJUSU1fQ291bnRlclJlc2V0Q2FsbGJhY2soSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGhydGltKTsKKyAgVU5VU0VEKFRpbWVySWR4KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0hSVElNX1RpbWVyX0NvdW50ZXJSZXNldENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovIAorfQorCisvKioKKyAgKiBAYnJpZWYgIENhbGxiYWNrIGZ1bmN0aW9uIGludm9rZWQgd2hlbiB0aGUgdGltZXIgeCBvdXRwdXQgMSBpcyBzZXQKKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUgIAorICAqIEBwYXJhbSAgVGltZXJJZHggVGltZXIgaW5kZXgKKyAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9BIGZvciB0aW1lciBBCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0IgZm9yIHRpbWVyIEIKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQyBmb3IgdGltZXIgQworICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9EIGZvciB0aW1lciBECisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0UgZm9yIHRpbWVyIEUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9IUlRJTV9PdXRwdXQxU2V0Q2FsbGJhY2soSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGhydGltKTsKKyAgVU5VU0VEKFRpbWVySWR4KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0hSVElNX1RpbWVyX091dHB1dDFTZXRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQGJyaWVmICBDYWxsYmFjayBmdW5jdGlvbiBpbnZva2VkIHdoZW4gdGhlIHRpbWVyIHggb3V0cHV0IDEgaXMgcmVzZXQKKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUgIAorICAqIEBwYXJhbSAgVGltZXJJZHggVGltZXIgaW5kZXgKKyAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9BIGZvciB0aW1lciBBCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0IgZm9yIHRpbWVyIEIKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQyBmb3IgdGltZXIgQworICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9EIGZvciB0aW1lciBECisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0UgZm9yIHRpbWVyIEUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9IUlRJTV9PdXRwdXQxUmVzZXRDYWxsYmFjayhIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaHJ0aW0pOworICBVTlVTRUQoVGltZXJJZHgpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSFJUSU1fVGltZXJfT3V0cHV0MVJlc2V0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gCit9CisKKy8qKgorICAqIEBicmllZiAgQ2FsbGJhY2sgZnVuY3Rpb24gaW52b2tlZCB3aGVuIHRoZSB0aW1lciB4IG91dHB1dCAyIGlzIHNldAorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZSAgCisgICogQHBhcmFtICBUaW1lcklkeCBUaW1lciBpbmRleAorICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0EgZm9yIHRpbWVyIEEKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQiBmb3IgdGltZXIgQgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9DIGZvciB0aW1lciBDCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0QgZm9yIHRpbWVyIEQKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRSBmb3IgdGltZXIgRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0hSVElNX091dHB1dDJTZXRDYWxsYmFjayhIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaHJ0aW0pOworICBVTlVTRUQoVGltZXJJZHgpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSFJUSU1fVGltZXJfT3V0cHV0MlNldENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovIAorfQorCisvKioKKyAgKiBAYnJpZWYgIENhbGxiYWNrIGZ1bmN0aW9uIGludm9rZWQgd2hlbiB0aGUgdGltZXIgeCBvdXRwdXQgMiBpcyByZXNldAorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZSAgCisgICogQHBhcmFtICBUaW1lcklkeCBUaW1lciBpbmRleAorICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0EgZm9yIHRpbWVyIEEKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQiBmb3IgdGltZXIgQgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9DIGZvciB0aW1lciBDCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0QgZm9yIHRpbWVyIEQKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRSBmb3IgdGltZXIgRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0hSVElNX091dHB1dDJSZXNldENhbGxiYWNrKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhocnRpbSk7CisgIFVOVVNFRChUaW1lcklkeCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9IUlRJTV9UaW1lcl9PdXRwdXQyUmVzZXRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQGJyaWVmICBDYWxsYmFjayBmdW5jdGlvbiBpbnZva2VkIHdoZW4gYSBETUEgYnVyc3QgdHJhbnNmZXIgaXMgY29tcGxldGVkCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlICAKKyAgKiBAcGFyYW0gIFRpbWVySWR4IFRpbWVyIGluZGV4CisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfTUFTVEVSICBmb3IgbWFzdGVyIHRpbWVyCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0EgZm9yIHRpbWVyIEEKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQiBmb3IgdGltZXIgQgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9DIGZvciB0aW1lciBDCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0QgZm9yIHRpbWVyIEQKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRSBmb3IgdGltZXIgRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0hSVElNX0J1cnN0RE1BVHJhbnNmZXJDYWxsYmFjayhIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGhydGltKTsKKyAgVU5VU0VEKFRpbWVySWR4KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0hSVElNX0J1cnN0RE1BVHJhbnNmZXJDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQGJyaWVmICBDYWxsYmFjayBmdW5jdGlvbiBpbnZva2VkIHdoZW4gYSBETUEgZXJyb3Igb2NjdXJzCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSFJUSU1fRXJyb3JDYWxsYmFjayhIUlRJTV9IYW5kbGVUeXBlRGVmICpoaHJ0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhocnRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9IUlRJTV9FcnJvckNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovIAorfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgSFJUSU1fUHJpdmF0ZV9GdW5jdGlvbnMgSFJUSU0gUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIG1hc3RlciB0aW1lciB0aW1lIGJhc2UKKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIHBUaW1lQmFzZUNmZyBwb2ludGVyIHRvIHRoZSB0aW1lIGJhc2UgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkICBIUlRJTV9NYXN0ZXJCYXNlX0NvbmZpZyhIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9UaW1lQmFzZUNmZ1R5cGVEZWYgKiBwVGltZUJhc2VDZmcpCit7CisgIHVpbnQzMl90IGhydGltX21jcjsKKyAgCisgIC8qIENvbmZpZ3VyZSBtYXN0ZXIgdGltZXIgKi8KKyAgaHJ0aW1fbWNyID0gaGhydGltLT5JbnN0YW5jZS0+c01hc3RlclJlZ3MuTUNSOworICAKKyAgLyogU2V0IHRoZSBwcmVzY2FsZXIgcmF0aW8gKi8KKyAgaHJ0aW1fbWNyICY9ICh1aW50MzJfdCkgfihIUlRJTV9NQ1JfQ0tfUFNDKTsKKyAgaHJ0aW1fbWNyIHw9ICh1aW50MzJfdClwVGltZUJhc2VDZmctPlByZXNjYWxlclJhdGlvOworICAKKyAgLyogU2V0IHRoZSBvcGVyYXRpbmcgbW9kZSAqLworICBocnRpbV9tY3IgJj0gKHVpbnQzMl90KSB+KEhSVElNX01DUl9DT05UIHwgSFJUSU1fTUNSX1JFVFJJRyk7CisgIGhydGltX21jciB8PSAodWludDMyX3QpcFRpbWVCYXNlQ2ZnLT5Nb2RlOworICAKKyAgLyogVXBkYXRlIHRoZSBIUlRJTSByZWdpc3RlcnMgKi8KKyAgaGhydGltLT5JbnN0YW5jZS0+c01hc3RlclJlZ3MuTUNSICA9IGhydGltX21jcjsKKyAgaGhydGltLT5JbnN0YW5jZS0+c01hc3RlclJlZ3MuTVBFUiA9IHBUaW1lQmFzZUNmZy0+UGVyaW9kOworICBoaHJ0aW0tPkluc3RhbmNlLT5zTWFzdGVyUmVncy5NUkVQID0gcFRpbWVCYXNlQ2ZnLT5SZXBldGl0aW9uQ291bnRlcjsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIHRpbWluZyB1bml0IChUaW1lciBBIHRvIFRpbWVyIEUpIHRpbWUgYmFzZQorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZXJJZHggVGltZXIgaW5kZXgKKyAgKiBAcGFyYW0gIHBUaW1lQmFzZUNmZyBwb2ludGVyIHRvIHRoZSB0aW1lIGJhc2UgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkICBIUlRJTV9UaW1pbmdVbml0QmFzZV9Db25maWcoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHggLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9UaW1lQmFzZUNmZ1R5cGVEZWYgKiBwVGltZUJhc2VDZmcpCit7CisgIHVpbnQzMl90IGhydGltX3RpbWNyOworICAKKyAgLyogQ29uZmlndXJlIG1hc3RlciB0aW1pbmcgdW5pdCAqLworICBocnRpbV90aW1jciA9IGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5USU14Q1I7CisgCisgIC8qIFNldCB0aGUgcHJlc2NhbGVyIHJhdGlvICovCisgIGhydGltX3RpbWNyICY9ICh1aW50MzJfdCkgfihIUlRJTV9USU1DUl9DS19QU0MpOworICBocnRpbV90aW1jciB8PSAodWludDMyX3QpcFRpbWVCYXNlQ2ZnLT5QcmVzY2FsZXJSYXRpbzsKKworICAvKiBTZXQgdGhlIG9wZXJhdGluZyBtb2RlICovCisgIGhydGltX3RpbWNyICY9ICh1aW50MzJfdCkgfihIUlRJTV9USU1DUl9DT05UIHwgSFJUSU1fVElNQ1JfUkVUUklHKTsKKyAgaHJ0aW1fdGltY3IgfD0gKHVpbnQzMl90KXBUaW1lQmFzZUNmZy0+TW9kZTsKKyAgCisgIC8qIFVwZGF0ZSB0aGUgSFJUSU0gcmVnaXN0ZXJzICovCisgIGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5USU14Q1IgID0gaHJ0aW1fdGltY3I7CisgIGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5QRVJ4UiA9IHBUaW1lQmFzZUNmZy0+UGVyaW9kOworICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uUkVQeFIgPSBwVGltZUJhc2VDZmctPlJlcGV0aXRpb25Db3VudGVyOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIG1hc3RlciB0aW1lciBpbiB3YXZlZm9ybSBtb2RlCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBwVGltZXJDZmcgcG9pbnRlciB0byB0aGUgdGltZXIgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgIEhSVElNX01hc3RlcldhdmVmb3JtX0NvbmZpZyhIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fVGltZXJDZmdUeXBlRGVmICogcFRpbWVyQ2ZnKQoreworICB1aW50MzJfdCBocnRpbV9tY3I7CisgIHVpbnQzMl90IGhydGltX2JtY3I7CisgIAorICAvKiBDb25maWd1cmUgbWFzdGVyIHRpbWVyICovCisgIGhydGltX21jciA9IGhocnRpbS0+SW5zdGFuY2UtPnNNYXN0ZXJSZWdzLk1DUjsKKyAgaHJ0aW1fYm1jciA9IGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLkJNQ1I7CisgIAorICAvKiBFbmFibGUvRGlzYWJsZSB0aGUgaGFsZiBtb2RlICovCisgIGhydGltX21jciAmPSB+KEhSVElNX01DUl9IQUxGKTsKKyAgaHJ0aW1fbWNyIHw9IHBUaW1lckNmZy0+SGFsZk1vZGVFbmFibGU7CisgIAorICAvKiBFbmFibGUvRGlzYWJsZSB0aGUgdGltZXIgc3RhcnQgdXBvbiBzeW5jaHJvbml6YXRpb24gZXZlbnQgcmVjZXB0aW9uICovCisgIGhydGltX21jciAmPSB+KEhSVElNX01DUl9TWU5DU1RSVE0pOworICBocnRpbV9tY3IgfD0gcFRpbWVyQ2ZnLT5TdGFydE9uU3luYzsKKyAKKyAgLyogRW5hYmxlL0Rpc2FibGUgdGhlIHRpbWVyIHJlc2V0IHVwb24gc3luY2hyb25pemF0aW9uIGV2ZW50IHJlY2VwdGlvbiAqLworICBocnRpbV9tY3IgJj0gfihIUlRJTV9NQ1JfU1lOQ1JTVE0pOworICBocnRpbV9tY3IgfD0gcFRpbWVyQ2ZnLT5SZXNldE9uU3luYzsKKyAgCisgIC8qIEVuYWJsZS9EaXNhYmxlIHRoZSBEQUMgc3luY2hyb25pemF0aW9uIGV2ZW50IGdlbmVyYXRpb24gKi8KKyAgaHJ0aW1fbWNyICY9IH4oSFJUSU1fTUNSX0RBQ1NZTkMpOworICBocnRpbV9tY3IgfD0gcFRpbWVyQ2ZnLT5EQUNTeW5jaHJvOworICAKKyAgLyogRW5hYmxlL0Rpc2FibGUgcHJlbG9hZCBtZWFjaGFuaXNtIGZvciB0aW1lciByZWdpc3RlcnMgKi8KKyAgaHJ0aW1fbWNyICY9IH4oSFJUSU1fTUNSX1BSRUVOKTsKKyAgaHJ0aW1fbWNyIHw9IHBUaW1lckNmZy0+UHJlbG9hZEVuYWJsZTsKKyAgCisgIC8qIE1hc3RlciB0aW1lciByZWdpc3RlcnMgdXBkYXRlIGhhbmRsaW5nICovCisgIGhydGltX21jciAmPSB+KEhSVElNX01DUl9CUlNURE1BKTsKKyAgaHJ0aW1fbWNyIHw9IChwVGltZXJDZmctPlVwZGF0ZUdhdGluZyA8PCAyVSk7CisgIAorICAvKiBFbmFibGUvRGlzYWJsZSByZWdpc3RlcnMgdXBkYXRlIG9uIHJlcGV0aXRpb24gKi8KKyAgaHJ0aW1fbWNyICY9IH4oSFJUSU1fTUNSX01SRVBVKTsKKyAgaHJ0aW1fbWNyIHw9IHBUaW1lckNmZy0+UmVwZXRpdGlvblVwZGF0ZTsKKyAgCisgIC8qIFNldCB0aGUgdGltZXIgYnVyc3QgbW9kZSAqLworICBocnRpbV9ibWNyICY9IH4oSFJUSU1fQk1DUl9NVEJNKTsKKyAgaHJ0aW1fYm1jciB8PSBwVGltZXJDZmctPkJ1cnN0TW9kZTsKKworICAvKiBVcGRhdGUgdGhlIEhSVElNIHJlZ2lzdGVycyAqLworICBoaHJ0aW0tPkluc3RhbmNlLT5zTWFzdGVyUmVncy5NQ1IgID0gaHJ0aW1fbWNyOworICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5CTUNSID0gaHJ0aW1fYm1jcjsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIHRpbWluZyB1bml0IChUaW1lciBBIHRvIFRpbWVyIEUpIGluIHdhdmVmb3JtIG1vZGUgCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBUaW1lcklkeCBUaW1lciBpbmRleAorICAqIEBwYXJhbSAgcFRpbWVyQ2ZnIHBvaW50ZXIgdG8gdGhlIHRpbWVyIGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkICBIUlRJTV9UaW1pbmdVbml0V2F2ZWZvcm1fQ29uZmlnKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fVGltZXJDZmdUeXBlRGVmICogcFRpbWVyQ2ZnKQoreworICB1aW50MzJfdCBocnRpbV90aW1jcjsKKyAgdWludDMyX3QgaHJ0aW1fdGltZmx0cjsKKyAgdWludDMyX3QgaHJ0aW1fdGltb3V0cjsKKyAgdWludDMyX3QgaHJ0aW1fdGltcnN0cjsKKyAgdWludDMyX3QgaHJ0aW1fYm1jcjsKKworICAvKiBVUERHQVQgYml0ZmllbGQgbXVzdCBiZSByZXNldCBiZWZvcmUgcHJvZ3JhbW1pbmcgYSBuZXcgdmFsdWUgKi8KKyAgaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLlRJTXhDUiAmPSB+KEhSVElNX1RJTUNSX1VQREdBVCk7CisKKyAgLyogQ29uZmlndXJlIHRpbWluZyB1bml0IChUaW1lciBBIHRvIFRpbWVyIEUpICovCisgIGhydGltX3RpbWNyICAgPSBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uVElNeENSOworICBocnRpbV90aW1mbHRyID0gaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLkZMVHhSOworICBocnRpbV90aW1vdXRyID0gaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLk9VVHhSOworICBocnRpbV90aW1yc3RyID0gaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLlJTVHhSOworICBocnRpbV9ibWNyICAgID0gaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuQk1DUjsKKyAgCisgIC8qIEVuYWJsZS9EaXNhYmxlIHRoZSBoYWxmIG1vZGUgKi8KKyAgaHJ0aW1fdGltY3IgJj0gfihIUlRJTV9USU1DUl9IQUxGKTsKKyAgaHJ0aW1fdGltY3IgfD0gcFRpbWVyQ2ZnLT5IYWxmTW9kZUVuYWJsZTsKKyAgCisgIC8qIEVuYWJsZS9EaXNhYmxlIHRoZSB0aW1lciBzdGFydCB1cG9uIHN5bmNocm9uaXphdGlvbiBldmVudCByZWNlcHRpb24gKi8KKyAgaHJ0aW1fdGltY3IgJj0gfihIUlRJTV9USU1DUl9TWU5DU1RSVCk7CisgIGhydGltX3RpbWNyIHw9IHBUaW1lckNmZy0+U3RhcnRPblN5bmM7CisgCisgIC8qIEVuYWJsZS9EaXNhYmxlIHRoZSB0aW1lciByZXNldCB1cG9uIHN5bmNocm9uaXphdGlvbiBldmVudCByZWNlcHRpb24gKi8KKyAgaHJ0aW1fdGltY3IgJj0gfihIUlRJTV9USU1DUl9TWU5DUlNUKTsKKyAgaHJ0aW1fdGltY3IgfD0gcFRpbWVyQ2ZnLT5SZXNldE9uU3luYzsKKyAgCisgIC8qIEVuYWJsZS9EaXNhYmxlIHRoZSBEQUMgc3luY2hyb25pemF0aW9uIGV2ZW50IGdlbmVyYXRpb24gKi8KKyAgaHJ0aW1fdGltY3IgJj0gfihIUlRJTV9USU1DUl9EQUNTWU5DKTsKKyAgaHJ0aW1fdGltY3IgfD0gcFRpbWVyQ2ZnLT5EQUNTeW5jaHJvOworICAKKyAgLyogRW5hYmxlL0Rpc2FibGUgcHJlbG9hZCBtZWFjaGFuaXNtIGZvciB0aW1lciByZWdpc3RlcnMgKi8KKyAgaHJ0aW1fdGltY3IgJj0gfihIUlRJTV9USU1DUl9QUkVFTik7CisgIGhydGltX3RpbWNyIHw9IHBUaW1lckNmZy0+UHJlbG9hZEVuYWJsZTsKKyAgCisgIC8qIFRpbWluZyB1bml0IHJlZ2lzdGVycyB1cGRhdGUgaGFuZGxpbmcgKi8KKyAgaHJ0aW1fdGltY3IgJj0gfihIUlRJTV9USU1DUl9VUERHQVQpOworICBocnRpbV90aW1jciB8PSBwVGltZXJDZmctPlVwZGF0ZUdhdGluZzsKKworICAvKiBFbmFibGUvRGlzYWJsZSByZWdpc3RlcnMgdXBkYXRlIG9uIHJlcGV0aXRpb24gKi8KKyAgaHJ0aW1fdGltY3IgJj0gfihIUlRJTV9USU1DUl9UUkVQVSk7CisgIGlmIChwVGltZXJDZmctPlJlcGV0aXRpb25VcGRhdGUgPT0gSFJUSU1fVVBEQVRFT05SRVBFVElUSU9OX0VOQUJMRUQpCisgIHsKKyAgICBocnRpbV90aW1jciB8PSBIUlRJTV9USU1DUl9UUkVQVTsKKyAgfQorCisgIC8qIFNldCB0aGUgcHVzaC1wdWxsIG1vZGUgKi8KKyAgaHJ0aW1fdGltY3IgJj0gfihIUlRJTV9USU1DUl9QU0hQTEwpOworICBocnRpbV90aW1jciB8PSBwVGltZXJDZmctPlB1c2hQdWxsOworICAKKyAgLyogRW5hYmxlL0Rpc2FibGUgcmVnaXN0ZXJzIHVwZGF0ZSBvbiB0aW1lciBjb3VudGVyIHJlc2V0ICovCisgIGhydGltX3RpbWNyICY9IH4oSFJUSU1fVElNQ1JfVFJTVFUpOworICBocnRpbV90aW1jciB8PSBwVGltZXJDZmctPlJlc2V0VXBkYXRlOworICAKKyAgLyogU2V0IHRoZSB0aW1lciB1cGRhdGUgdHJpZ2dlciAqLworICBocnRpbV90aW1jciAmPSB+KEhSVElNX1RJTUNSX1RJTVVQREFURVRSSUdHRVIpOworICBocnRpbV90aW1jciB8PSBwVGltZXJDZmctPlVwZGF0ZVRyaWdnZXI7CisgIAorICAvKiBFbmFibGUvRGlzYWJsZSB0aGUgZmF1bHQgY2hhbm5lbCBhdCB0aW1lciBsZXZlbCAqLworICBocnRpbV90aW1mbHRyICY9IH4oSFJUSU1fRkxUUl9GTFR4RU4pOworICBocnRpbV90aW1mbHRyIHw9IChwVGltZXJDZmctPkZhdWx0RW5hYmxlICYgSFJUSU1fRkxUUl9GTFR4RU4pOworICAKKyAgLyogTG9jay9VbmxvY2sgZmF1bHQgc291cmNlcyBhdCB0aW1lciBsZXZlbCAqLworICBocnRpbV90aW1mbHRyICY9IH4oSFJUSU1fRkxUUl9GTFRMQ0spOworICBocnRpbV90aW1mbHRyIHw9IHBUaW1lckNmZy0+RmF1bHRMb2NrOworICAKKyAgLyogVGhlIGRlYWR0aW1lIGNhbm5vdCBiZSB1c2VkIHNpbXVsdGFuZW91c2x5IHdpdGggdGhlIHB1c2gtcHVsbCBtb2RlICovCisgIGlmIChwVGltZXJDZmctPlB1c2hQdWxsID09IEhSVElNX1RJTVBVU0hQVUxMTU9ERV9ESVNBQkxFRCkKKyAgeworICAgIC8qIEVuYWJsZS9EaXNhYmxlIGRlYWQgdGltZSBpbnNlcnRpb24gYXQgdGltZXIgbGV2ZWwgKi8KKyAgICBocnRpbV90aW1vdXRyICY9IH4oSFJUSU1fT1VUUl9EVEVOKTsKKyAgICBocnRpbV90aW1vdXRyIHw9IHBUaW1lckNmZy0+RGVhZFRpbWVJbnNlcnRpb247CisgIH0KKyAgCisgIC8qIEVuYWJsZS9EaXNhYmxlIGRlbGF5ZWQgcHJvdGVjdGlvbiBhdCB0aW1lciBsZXZlbAorICAgICBEZWxheWVkIElkbGUgaXMgYXZhaWxhYmxlIHdoYXRldmVyIHRoZSB0aW1lciBvcGVyYXRpbmcgbW9kZSAocmVndWxhciwgcHVzaC1wdWxsKQorICAgICBCYWxhbmNlZCBJZGxlIGlzIG9ubHkgYXZhaWxhYmxlIGluIHB1c2gtcHVsbCBtb2RlCisgICovCisgIGlmICggICAoKHBUaW1lckNmZy0+RGVsYXllZFByb3RlY3Rpb25Nb2RlICE9IEhSVElNX1RJTUVSX0FfQl9DX0RFTEFZRURQUk9URUNUSU9OX0JBTEFOQ0VEX0VFVjYpCisgICAgICAgJiYgKHBUaW1lckNmZy0+RGVsYXllZFByb3RlY3Rpb25Nb2RlICE9IEhSVElNX1RJTUVSX0FfQl9DX0RFTEFZRURQUk9URUNUSU9OX0JBTEFOQ0VEX0VFVjcpKQorICAgICAgIHx8IChwVGltZXJDZmctPlB1c2hQdWxsID09IEhSVElNX1RJTVBVU0hQVUxMTU9ERV9FTkFCTEVEKSkKKyAgeworICAgIGhydGltX3RpbW91dHIgJj0gfihIUlRJTV9PVVRSX0RMWVBSVHwgSFJUSU1fT1VUUl9ETFlQUlRFTik7CisgICAgaHJ0aW1fdGltb3V0ciB8PSBwVGltZXJDZmctPkRlbGF5ZWRQcm90ZWN0aW9uTW9kZTsKKyAgfQorICAgIAorICAvKiBTZXQgdGhlIHRpbWVyIGNvdW50ZXIgcmVzZXQgdHJpZ2dlciAqLworICBocnRpbV90aW1yc3RyID0gcFRpbWVyQ2ZnLT5SZXNldFRyaWdnZXI7CisKKyAgLyogU2V0IHRoZSB0aW1lciBidXJzdCBtb2RlICovCisgIHN3aXRjaCAoVGltZXJJZHgpCisgIHsKKyAgY2FzZSBIUlRJTV9USU1FUklOREVYX1RJTUVSX0E6CisgICAgeworICAgICAgaHJ0aW1fYm1jciAmPSB+KEhSVElNX0JNQ1JfVEFCTSk7CisgICAgICBocnRpbV9ibWNyIHw9ICggcFRpbWVyQ2ZnLT5CdXJzdE1vZGUgPDwgMVUpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9USU1FUklOREVYX1RJTUVSX0I6CisgICAgeworICAgICAgaHJ0aW1fYm1jciAmPSB+KEhSVElNX0JNQ1JfVEJCTSk7CisgICAgICBocnRpbV9ibWNyIHw9ICggcFRpbWVyQ2ZnLT5CdXJzdE1vZGUgPDwgMlUpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9USU1FUklOREVYX1RJTUVSX0M6CisgICAgeworICAgICAgaHJ0aW1fYm1jciAmPSB+KEhSVElNX0JNQ1JfVENCTSk7CisgICAgICBocnRpbV9ibWNyIHw9ICggcFRpbWVyQ2ZnLT5CdXJzdE1vZGUgPDwgM1UpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9USU1FUklOREVYX1RJTUVSX0Q6CisgICAgeworICAgICAgaHJ0aW1fYm1jciAmPSB+KEhSVElNX0JNQ1JfVERCTSk7CisgICAgICBocnRpbV9ibWNyIHw9ICggcFRpbWVyQ2ZnLT5CdXJzdE1vZGUgPDwgNFUpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9USU1FUklOREVYX1RJTUVSX0U6CisgICAgeworICAgICAgaHJ0aW1fYm1jciAmPSB+KEhSVElNX0JNQ1JfVEVCTSk7CisgICAgICBocnRpbV9ibWNyIHw9ICggcFRpbWVyQ2ZnLT5CdXJzdE1vZGUgPDwgNVUpOworICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorIAorICAvKiBVcGRhdGUgdGhlIEhSVElNIHJlZ2lzdGVycyAqLworICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uVElNeENSICA9IGhydGltX3RpbWNyOworICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uRkxUeFIgPSBocnRpbV90aW1mbHRyOworICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uT1VUeFIgPSBocnRpbV90aW1vdXRyOworICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uUlNUeFIgPSBocnRpbV90aW1yc3RyOyAgCisgIGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLkJNQ1IgPSBocnRpbV9ibWNyOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgYSBjb21wYXJlIHVuaXQgCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBUaW1lcklkeCBUaW1lciBpbmRleAorICAqIEBwYXJhbSAgQ29tcGFyZVVuaXQgQ29tcGFyZSB1bml0IGlkZW50aWZpZXIKKyAgKiBAcGFyYW0gIHBDb21wYXJlQ2ZnIHBvaW50ZXIgdG8gdGhlIGNvbXBhcmUgdW5pdCBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCAgSFJUSU1fQ29tcGFyZVVuaXRDb25maWcoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDb21wYXJlVW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUlRJTV9Db21wYXJlQ2ZnVHlwZURlZiAqIHBDb21wYXJlQ2ZnKQoreworICBpZiAoVGltZXJJZHggPT0gSFJUSU1fVElNRVJJTkRFWF9NQVNURVIpCisgIHsKKyAgICAvKiBDb25maWd1cmUgdGhlIGNvbXBhcmUgdW5pdCBvZiB0aGUgbWFzdGVyIHRpbWVyICovCisgICAgc3dpdGNoIChDb21wYXJlVW5pdCkKKyAgICB7CisgICAgY2FzZSBIUlRJTV9DT01QQVJFVU5JVF8xOgorICAgICAgeworICAgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zTWFzdGVyUmVncy5NQ01QMVIgPSBwQ29tcGFyZUNmZy0+Q29tcGFyZVZhbHVlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBIUlRJTV9DT01QQVJFVU5JVF8yOgorICAgICAgeworICAgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zTWFzdGVyUmVncy5NQ01QMlIgPSBwQ29tcGFyZUNmZy0+Q29tcGFyZVZhbHVlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBIUlRJTV9DT01QQVJFVU5JVF8zOgorICAgICAgeworICAgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zTWFzdGVyUmVncy5NQ01QM1IgPSBwQ29tcGFyZUNmZy0+Q29tcGFyZVZhbHVlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBIUlRJTV9DT01QQVJFVU5JVF80OgorICAgICAgeworICAgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zTWFzdGVyUmVncy5NQ01QNFIgPSBwQ29tcGFyZUNmZy0+Q29tcGFyZVZhbHVlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDb25maWd1cmUgdGhlIGNvbXBhcmUgdW5pdCBvZiB0aGUgdGltaW5nIHVuaXQgKi8KKyAgICBzd2l0Y2ggKENvbXBhcmVVbml0KQorICAgIHsKKyAgICBjYXNlIEhSVElNX0NPTVBBUkVVTklUXzE6CisgICAgICB7CisgICAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5DTVAxeFIgPSBwQ29tcGFyZUNmZy0+Q29tcGFyZVZhbHVlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBIUlRJTV9DT01QQVJFVU5JVF8yOgorICAgICAgeworICAgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uQ01QMnhSID0gcENvbXBhcmVDZmctPkNvbXBhcmVWYWx1ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgSFJUSU1fQ09NUEFSRVVOSVRfMzoKKyAgICAgIHsKKyAgICAgICAgaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLkNNUDN4UiA9IHBDb21wYXJlQ2ZnLT5Db21wYXJlVmFsdWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEhSVElNX0NPTVBBUkVVTklUXzQ6CisgICAgICB7CisgICAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5DTVA0eFIgPSBwQ29tcGFyZUNmZy0+Q29tcGFyZVZhbHVlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0gICAgCisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIGEgY2FwdHVyZSB1bml0IAorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZXJJZHggVGltZXIgaW5kZXgKKyAgKiBAcGFyYW0gIENhcHR1cmVVbml0IENhcHR1cmUgdW5pdCBpZGVudGlmaWVyCisgICogQHBhcmFtICBFdmVudCBFdmVudCByZWZlcmVuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEhSVElNX0NhcHR1cmVVbml0Q29uZmlnKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENhcHR1cmVVbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRXZlbnQpCit7CisgIHVpbnQzMl90IENhcHR1cmVUcmlnZ2VyID0gMHhGRkZGRkZGRlU7CisgIAorICBzd2l0Y2ggKEV2ZW50KQorICB7CisgIGNhc2UgSFJUSU1fRVZFTlRfMToKKyAgICB7CisgICAgICBDYXB0dXJlVHJpZ2dlciA9IEhSVElNX0NBUFRVUkVUUklHR0VSX0VFVl8xOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9FVkVOVF8yOgorICAgIHsKKyAgICAgIENhcHR1cmVUcmlnZ2VyID0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfRUVWXzI7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEhSVElNX0VWRU5UXzM6CisgICAgeworICAgICAgQ2FwdHVyZVRyaWdnZXIgPSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9FRVZfMzsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fRVZFTlRfNDoKKyAgICB7CisgICAgICBDYXB0dXJlVHJpZ2dlciA9IEhSVElNX0NBUFRVUkVUUklHR0VSX0VFVl80OworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9FVkVOVF81OgorICAgIHsKKyAgICAgIENhcHR1cmVUcmlnZ2VyID0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfRUVWXzU7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEhSVElNX0VWRU5UXzY6CisgICAgeworICAgICAgQ2FwdHVyZVRyaWdnZXIgPSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9FRVZfNjsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fRVZFTlRfNzoKKyAgICB7CisgICAgICBDYXB0dXJlVHJpZ2dlciA9IEhSVElNX0NBUFRVUkVUUklHR0VSX0VFVl83OworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9FVkVOVF84OgorICAgIHsKKyAgICAgIENhcHR1cmVUcmlnZ2VyID0gSFJUSU1fQ0FQVFVSRVRSSUdHRVJfRUVWXzg7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEhSVElNX0VWRU5UXzk6CisgICAgeworICAgICAgQ2FwdHVyZVRyaWdnZXIgPSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9FRVZfOTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fRVZFTlRfMTA6CisgICAgeworICAgICAgQ2FwdHVyZVRyaWdnZXIgPSBIUlRJTV9DQVBUVVJFVFJJR0dFUl9FRVZfMTA7CisgICAgfQorICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9CisgIAorICBzd2l0Y2ggKENhcHR1cmVVbml0KQorICB7CisgIGNhc2UgSFJUSU1fQ0FQVFVSRVVOSVRfMToKKyAgICB7CisgICAgICBoaHJ0aW0tPlRpbWVyUGFyYW1bVGltZXJJZHhdLkNhcHR1cmVUcmlnZ2VyMSA9IENhcHR1cmVUcmlnZ2VyOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9DQVBUVVJFVU5JVF8yOgorICAgIHsKKyAgICAgIGhocnRpbS0+VGltZXJQYXJhbVtUaW1lcklkeF0uQ2FwdHVyZVRyaWdnZXIyID0gQ2FwdHVyZVRyaWdnZXI7CisgICAgfQorICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgb3V0cHV0IG9mIGEgdGltaW5nIHVuaXQgCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBUaW1lcklkeCBUaW1lciBpbmRleAorICAqIEBwYXJhbSAgT3V0cHV0IHRpbWluZyB1bml0IG91dHB1dCBpZGVudGlmaWVyCisgICogQHBhcmFtICBwT3V0cHV0Q2ZnIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCAgSFJUSU1fT3V0cHV0Q29uZmlnKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSVElNX091dHB1dENmZ1R5cGVEZWYgKiBwT3V0cHV0Q2ZnKQoreworICB1aW50MzJfdCBocnRpbV9vdXRyOworICB1aW50MzJfdCBocnRpbV9kdHI7CisgIAorICB1aW50MzJfdCBzaGlmdCA9IDB4RkZGRkZGRkZVOworICAKKyAgaHJ0aW1fb3V0ciA9IGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5PVVR4UjsKKyAgaHJ0aW1fZHRyID0gaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLkRUeFI7CisgIAorICBzd2l0Y2ggKE91dHB1dCkKKyAgeworICBjYXNlIEhSVElNX09VVFBVVF9UQTE6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RCMToKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEMxOgorICBjYXNlIEhSVElNX09VVFBVVF9URDE6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RFMToKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIG91dHB1dCBzZXQvcmVzZXQgY3Jvc3NiYXIgKi8KKyAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5TRVR4MVIgPSBwT3V0cHV0Q2ZnLT5TZXRTb3VyY2U7CisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uUlNUeDFSID0gcE91dHB1dENmZy0+UmVzZXRTb3VyY2U7CisgICAgICAKKyAgICAgIHNoaWZ0ID0gMFU7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEhSVElNX09VVFBVVF9UQTI6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RCMjoKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEMyOgorICBjYXNlIEhSVElNX09VVFBVVF9URDI6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RFMjoKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIG91dHB1dCBzZXQvcmVzZXQgY3Jvc3NiYXIgKi8KKyAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5TRVR4MlIgPSBwT3V0cHV0Q2ZnLT5TZXRTb3VyY2U7CisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uUlNUeDJSID0gcE91dHB1dENmZy0+UmVzZXRTb3VyY2U7CisKKyAgICAgIHNoaWZ0ID0gMTZVOworICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorICAKKyAgLyogQ2xlYXIgb3V0cHV0IGNvbmZpZyAqLworICBocnRpbV9vdXRyICY9IH4oKEhSVElNX09VVFJfUE9MMSB8CisgICAgICAgICAgICAgICAgICAgSFJUSU1fT1VUUl9JRExNMSB8CisgICAgICAgICAgICAgICAgICAgSFJUSU1fT1VUUl9JRExFUzF8CisgICAgICAgICAgICAgICAgICAgSFJUSU1fT1VUUl9GQVVMVDF8CisgICAgICAgICAgICAgICAgICAgSFJUSU1fT1VUUl9DSFAxIHwKKyAgICAgICAgICAgICAgICAgICBIUlRJTV9PVVRSX0RJREwxKSAgPDwgc2hpZnQpOworICAKKyAgLyogU2V0IHRoZSBwb2xhcml0eSAqLworICBocnRpbV9vdXRyIHw9IChwT3V0cHV0Q2ZnLT5Qb2xhcml0eSA8PCBzaGlmdCk7CisgIAorICAvKiBTZXQgdGhlIElETEUgbW9kZSAqLworICBocnRpbV9vdXRyIHw9IChwT3V0cHV0Q2ZnLT5JZGxlTW9kZSA8PCBzaGlmdCk7CisgIAorICAvKiBTZXQgdGhlIElETEUgc3RhdGUgKi8KKyAgaHJ0aW1fb3V0ciB8PSAocE91dHB1dENmZy0+SWRsZUxldmVsIDw8IHNoaWZ0KTsKKyAgCisgIC8qIFNldCB0aGUgRkFVTFQgc3RhdGUgKi8KKyAgaHJ0aW1fb3V0ciB8PSAocE91dHB1dENmZy0+RmF1bHRMZXZlbCA8PCBzaGlmdCk7CisgIAorICAvKiBTZXQgdGhlIGNob3BwZXIgbW9kZSAqLworICBocnRpbV9vdXRyIHw9IChwT3V0cHV0Q2ZnLT5DaG9wcGVyTW9kZUVuYWJsZSA8PCBzaGlmdCk7CisKKyAgLyogU2V0IHRoZSBidXJzdCBtb2RlIGVudHJ5IG1vZGUgOiBkZWFkdGltZSBpbnNlcnRpb24gd2hlbiBlbnRlcmluZyB0aGUgaWRsZQorICAgICBzdGF0ZSBkdXJpbmcgYSBidXJzdCBtb2RlIG9wZXJhdGlvbiBpcyBhbGxvd2VkIG9ubHkgdW5kZXIgdGhlIGZvbGxvd2luZworICAgICBjb25kaXRpb25zOgorICAgICAtIHRoZSBvdXRwdXRzIGlzIGFjdGl2ZSBkdXJpbmcgdGhlIGJ1cnN0IG1vZGUgKElETEVTPTFVKQorICAgICAtIHBvc2l0aXZlIGRlYWR0aW1lcyAoU0RUUi9TRFRGIHNldCB0byAwVSkKKyAgKi8KKyAgaWYgKChwT3V0cHV0Q2ZnLT5JZGxlTGV2ZWwgPT0gSFJUSU1fT1VUUFVUSURMRUxFVkVMX0FDVElWRSkgJiYgCisgICAgICAoKGhydGltX2R0ciAmIEhSVElNX0RUUl9TRFRSKSA9PSBSRVNFVCkgJiYKKyAgICAgICgoaHJ0aW1fZHRyICYgSFJUSU1fRFRSX1NEVEYpID09IFJFU0VUKSkKKyAgeworICAgIGhydGltX291dHIgfD0gKHBPdXRwdXRDZmctPkJ1cnN0TW9kZUVudHJ5RGVsYXllZCA8PCBzaGlmdCk7CisgIH0KKyAgCisgIC8qIFVwZGF0ZSBIUlRJTSByZWdpc3RlciAqLworICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uT1VUeFIgPSBocnRpbV9vdXRyOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgYW4gZXh0ZXJuYWwgZXZlbnQgY2hhbm5lbCAKKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIEV2ZW50IEV2ZW50IGNoYW5uZWwgaWRlbnRpZmllcgorICAqIEBwYXJhbSAgcEV2ZW50Q2ZnIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGNoYW5uZWwgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSFJUSU1fRXZlbnRDb25maWcoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJUSU1fRXZlbnRDZmdUeXBlRGVmICpwRXZlbnRDZmcpCit7CisgIHVpbnQzMl90IGhydGltX2VlY3IxOworICB1aW50MzJfdCBocnRpbV9lZWNyMjsKKyAgdWludDMyX3QgaHJ0aW1fZWVjcjM7CisKKyAgLyogQ29uZmlndXJlIGV4dGVybmFsIGV2ZW50IGNoYW5uZWwgKi8KKyAgaHJ0aW1fZWVjcjEgPSBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5FRUNSMTsKKyAgaHJ0aW1fZWVjcjIgPSBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5FRUNSMjsKKyAgaHJ0aW1fZWVjcjMgPSBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5FRUNSMzsKKyAgCisgIHN3aXRjaCAoRXZlbnQpCisgIHsKKyAgY2FzZSBIUlRJTV9FVkVOVF9OT05FOgorICAgIHsKKyAgICAgIGhydGltX2VlY3IxID0gaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuRUVDUjEgPSAwVTsKKyAgICAgIGhydGltX2VlY3IyID0gaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuRUVDUjIgPSAwVTsKKyAgICAgIGhydGltX2VlY3IzID0gaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuRUVDUjMgPSAwVTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fRVZFTlRfMToKKyAgICB7CisgICAgICBocnRpbV9lZWNyMSAmPSB+KEhSVElNX0VFQ1IxX0VFMVNSQyB8IEhSVElNX0VFQ1IxX0VFMVBPTCB8IEhSVElNX0VFQ1IxX0VFMVNOUyB8IEhSVElNX0VFQ1IxX0VFMUZBU1QpOworICAgICAgaHJ0aW1fZWVjcjEgfD0gcEV2ZW50Q2ZnLT5Tb3VyY2U7CisgICAgICBocnRpbV9lZWNyMSB8PSAocEV2ZW50Q2ZnLT5Qb2xhcml0eSAmIEhSVElNX0VFQ1IxX0VFMVBPTCk7CisgICAgICBocnRpbV9lZWNyMSB8PSBwRXZlbnRDZmctPlNlbnNpdGl2aXR5OworICAgICAgLyogVXBkYXRlIHRoZSBIUlRJTSByZWdpc3RlcnMgKGFsbCBiaXRmaWVsZHMgYnV0IEVFMUZBU1QgYml0KSAqLworICAgICAgaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuRUVDUjEgPSBocnRpbV9lZWNyMTsKKyAgICAgIC8qIFVwZGF0ZSB0aGUgSFJUSU0gcmVnaXN0ZXJzIChFRTFGQVNUIGJpdCkgKi8KKyAgICAgIGhydGltX2VlY3IxIHw9IHBFdmVudENmZy0+RmFzdE1vZGU7CisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5FRUNSMSA9IGhydGltX2VlY3IxOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9FVkVOVF8yOgorICAgIHsKKyAgICAgIGhydGltX2VlY3IxICY9IH4oSFJUSU1fRUVDUjFfRUUyU1JDIHwgSFJUSU1fRUVDUjFfRUUyUE9MIHwgSFJUSU1fRUVDUjFfRUUyU05TIHwgSFJUSU1fRUVDUjFfRUUyRkFTVCk7CisgICAgICBocnRpbV9lZWNyMSB8PSAocEV2ZW50Q2ZnLT5Tb3VyY2UgPDwgNlUpOworICAgICAgaHJ0aW1fZWVjcjEgfD0gKChwRXZlbnRDZmctPlBvbGFyaXR5IDw8IDZVKSAmIChIUlRJTV9FRUNSMV9FRTJQT0wpKTsKKyAgICAgIGhydGltX2VlY3IxIHw9IChwRXZlbnRDZmctPlNlbnNpdGl2aXR5IDw8IDZVKTsKKyAgICAgIC8qIFVwZGF0ZSB0aGUgSFJUSU0gcmVnaXN0ZXJzIChhbGwgYml0ZmllbGRzIGJ1dCBFRTJGQVNUIGJpdCkgKi8KKyAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLkVFQ1IxID0gaHJ0aW1fZWVjcjE7CisgICAgICAvKiBVcGRhdGUgdGhlIEhSVElNIHJlZ2lzdGVycyAoRUUyRkFTVCBiaXQpICovCisgICAgICBocnRpbV9lZWNyMSB8PSAocEV2ZW50Q2ZnLT5GYXN0TW9kZSA8PCA2VSk7CisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5FRUNSMSA9IGhydGltX2VlY3IxOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9FVkVOVF8zOgorICAgIHsKKyAgICAgIGhydGltX2VlY3IxICY9IH4oSFJUSU1fRUVDUjFfRUUzU1JDIHwgSFJUSU1fRUVDUjFfRUUzUE9MIHwgSFJUSU1fRUVDUjFfRUUzU05TIHwgSFJUSU1fRUVDUjFfRUUzRkFTVCk7CisgICAgICBocnRpbV9lZWNyMSB8PSAocEV2ZW50Q2ZnLT5Tb3VyY2UgPDwgMTJVKTsKKyAgICAgIGhydGltX2VlY3IxIHw9ICgocEV2ZW50Q2ZnLT5Qb2xhcml0eSA8PCAxMlUpICYgKEhSVElNX0VFQ1IxX0VFM1BPTCkpOworICAgICAgaHJ0aW1fZWVjcjEgfD0gKHBFdmVudENmZy0+U2Vuc2l0aXZpdHkgPDwgMTJVKTsKKyAgICAgIC8qIFVwZGF0ZSB0aGUgSFJUSU0gcmVnaXN0ZXJzIChhbGwgYml0ZmllbGRzIGJ1dCBFRTNGQVNUIGJpdCkgKi8KKyAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLkVFQ1IxID0gaHJ0aW1fZWVjcjE7CisgICAgICAvKiBVcGRhdGUgdGhlIEhSVElNIHJlZ2lzdGVycyAoRUUzRkFTVCBiaXQpICovCisgICAgICBocnRpbV9lZWNyMSB8PSAocEV2ZW50Q2ZnLT5GYXN0TW9kZSA8PCAxMlUpOworICAgICAgaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuRUVDUjEgPSBocnRpbV9lZWNyMTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fRVZFTlRfNDoKKyAgICB7CisgICAgICBocnRpbV9lZWNyMSAmPSB+KEhSVElNX0VFQ1IxX0VFNFNSQyB8IEhSVElNX0VFQ1IxX0VFNFBPTCB8IEhSVElNX0VFQ1IxX0VFNFNOUyB8IEhSVElNX0VFQ1IxX0VFNEZBU1QpOworICAgICAgaHJ0aW1fZWVjcjEgfD0gKHBFdmVudENmZy0+U291cmNlIDw8IDE4VSk7CisgICAgICBocnRpbV9lZWNyMSB8PSAoKHBFdmVudENmZy0+UG9sYXJpdHkgPDwgMThVKSAmIChIUlRJTV9FRUNSMV9FRTRQT0wpKTsKKyAgICAgIGhydGltX2VlY3IxIHw9IChwRXZlbnRDZmctPlNlbnNpdGl2aXR5IDw8IDE4VSk7CisgICAgICAvKiBVcGRhdGUgdGhlIEhSVElNIHJlZ2lzdGVycyAoYWxsIGJpdGZpZWxkcyBidXQgRUU0RkFTVCBiaXQpICovCisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5FRUNSMSA9IGhydGltX2VlY3IxOworICAgICAgLyogVXBkYXRlIHRoZSBIUlRJTSByZWdpc3RlcnMgKEVFNEZBU1QgYml0KSAqLworICAgICAgaHJ0aW1fZWVjcjEgfD0gKHBFdmVudENmZy0+RmFzdE1vZGUgPDwgMThVKTsKKyAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLkVFQ1IxID0gaHJ0aW1fZWVjcjE7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEhSVElNX0VWRU5UXzU6CisgICAgeworICAgICAgaHJ0aW1fZWVjcjEgJj0gfihIUlRJTV9FRUNSMV9FRTVTUkMgfCBIUlRJTV9FRUNSMV9FRTVQT0wgfCBIUlRJTV9FRUNSMV9FRTVTTlMgfCBIUlRJTV9FRUNSMV9FRTVGQVNUKTsKKyAgICAgIGhydGltX2VlY3IxIHw9IChwRXZlbnRDZmctPlNvdXJjZSA8PCAyNFUpOworICAgICAgaHJ0aW1fZWVjcjEgfD0gKChwRXZlbnRDZmctPlBvbGFyaXR5IDw8IDI0VSkgJiAoSFJUSU1fRUVDUjFfRUU1UE9MKSk7CisgICAgICBocnRpbV9lZWNyMSB8PSAocEV2ZW50Q2ZnLT5TZW5zaXRpdml0eSA8PCAyNFUpOworICAgICAgLyogVXBkYXRlIHRoZSBIUlRJTSByZWdpc3RlcnMgKGFsbCBiaXRmaWVsZHMgYnV0IEVFNUZBU1QgYml0KSAqLworICAgICAgaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuRUVDUjEgPSBocnRpbV9lZWNyMTsKKyAgICAgIC8qIFVwZGF0ZSB0aGUgSFJUSU0gcmVnaXN0ZXJzIChFRTVGQVNUIGJpdCkgKi8KKyAgICAgIGhydGltX2VlY3IxIHw9IChwRXZlbnRDZmctPkZhc3RNb2RlIDw8IDI0VSk7CisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5FRUNSMSA9IGhydGltX2VlY3IxOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9FVkVOVF82OgorICAgIHsKKyAgICAgIGhydGltX2VlY3IyICY9IH4oSFJUSU1fRUVDUjJfRUU2U1JDIHwgSFJUSU1fRUVDUjJfRUU2UE9MIHwgSFJUSU1fRUVDUjJfRUU2U05TKTsKKyAgICAgIGhydGltX2VlY3IyIHw9IHBFdmVudENmZy0+U291cmNlOworICAgICAgaHJ0aW1fZWVjcjIgfD0gKHBFdmVudENmZy0+UG9sYXJpdHkgJiBIUlRJTV9FRUNSMl9FRTZQT0wpOworICAgICAgaHJ0aW1fZWVjcjIgfD0gcEV2ZW50Q2ZnLT5TZW5zaXRpdml0eTsKKyAgICAgIGhydGltX2VlY3IzICY9IH4oSFJUSU1fRUVDUjNfRUU2Rik7CisgICAgICBocnRpbV9lZWNyMyB8PSBwRXZlbnRDZmctPkZpbHRlcjsKKyAgICAgIC8qIFVwZGF0ZSB0aGUgSFJUSU0gcmVnaXN0ZXJzICovCisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5FRUNSMiA9IGhydGltX2VlY3IyOworICAgICAgaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuRUVDUjMgPSBocnRpbV9lZWNyMzsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fRVZFTlRfNzoKKyAgICB7CisgICAgICBocnRpbV9lZWNyMiAmPSB+KEhSVElNX0VFQ1IyX0VFN1NSQyB8IEhSVElNX0VFQ1IyX0VFN1BPTCB8IEhSVElNX0VFQ1IyX0VFN1NOUyk7CisgICAgICBocnRpbV9lZWNyMiB8PSAocEV2ZW50Q2ZnLT5Tb3VyY2UgPDwgNlUpOworICAgICAgaHJ0aW1fZWVjcjIgfD0gKChwRXZlbnRDZmctPlBvbGFyaXR5IDw8IDZVKSAmIChIUlRJTV9FRUNSMl9FRTdQT0wpKTsKKyAgICAgIGhydGltX2VlY3IyIHw9IChwRXZlbnRDZmctPlNlbnNpdGl2aXR5IDw8IDZVKTsKKyAgICAgIGhydGltX2VlY3IzICY9IH4oSFJUSU1fRUVDUjNfRUU3Rik7CisgICAgICBocnRpbV9lZWNyMyB8PSAocEV2ZW50Q2ZnLT5GaWx0ZXIgPDwgNlUpOworICAgICAgLyogVXBkYXRlIHRoZSBIUlRJTSByZWdpc3RlcnMgKi8KKyAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLkVFQ1IyID0gaHJ0aW1fZWVjcjI7CisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5FRUNSMyA9IGhydGltX2VlY3IzOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9FVkVOVF84OgorICAgIHsKKyAgICAgIGhydGltX2VlY3IyICY9IH4oSFJUSU1fRUVDUjJfRUU4U1JDIHwgSFJUSU1fRUVDUjJfRUU4UE9MIHwgSFJUSU1fRUVDUjJfRUU4U05TKTsKKyAgICAgIGhydGltX2VlY3IyIHw9IChwRXZlbnRDZmctPlNvdXJjZSA8PCAxMlUpOworICAgICAgaHJ0aW1fZWVjcjIgfD0gKChwRXZlbnRDZmctPlBvbGFyaXR5IDw8IDEyVSkgJiAoSFJUSU1fRUVDUjJfRUU4UE9MKSk7CisgICAgICBocnRpbV9lZWNyMiB8PSAocEV2ZW50Q2ZnLT5TZW5zaXRpdml0eSA8PCAxMlUpOworICAgICAgaHJ0aW1fZWVjcjMgJj0gfihIUlRJTV9FRUNSM19FRThGKTsKKyAgICAgIGhydGltX2VlY3IzIHw9IChwRXZlbnRDZmctPkZpbHRlciA8PCAxMlUpOworICAgICAgLyogVXBkYXRlIHRoZSBIUlRJTSByZWdpc3RlcnMgKi8KKyAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLkVFQ1IyID0gaHJ0aW1fZWVjcjI7CisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5FRUNSMyA9IGhydGltX2VlY3IzOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9FVkVOVF85OgorICAgIHsKKyAgICAgIGhydGltX2VlY3IyICY9IH4oSFJUSU1fRUVDUjJfRUU5U1JDIHwgSFJUSU1fRUVDUjJfRUU5UE9MIHwgSFJUSU1fRUVDUjJfRUU5U05TKTsKKyAgICAgIGhydGltX2VlY3IyIHw9IChwRXZlbnRDZmctPlNvdXJjZSA8PCAxOFUpOworICAgICAgaHJ0aW1fZWVjcjIgfD0gKChwRXZlbnRDZmctPlBvbGFyaXR5IDw8IDE4VSkgJiAoSFJUSU1fRUVDUjJfRUU5UE9MKSk7CisgICAgICBocnRpbV9lZWNyMiB8PSAocEV2ZW50Q2ZnLT5TZW5zaXRpdml0eSA8PCAxOFUpOworICAgICAgaHJ0aW1fZWVjcjMgJj0gfihIUlRJTV9FRUNSM19FRTlGKTsKKyAgICAgIGhydGltX2VlY3IzIHw9IChwRXZlbnRDZmctPkZpbHRlciA8PCAxOFUpOworICAgICAgLyogVXBkYXRlIHRoZSBIUlRJTSByZWdpc3RlcnMgKi8KKyAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLkVFQ1IyID0gaHJ0aW1fZWVjcjI7CisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5FRUNSMyA9IGhydGltX2VlY3IzOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9FVkVOVF8xMDoKKyAgICB7CisgICAgICBocnRpbV9lZWNyMiAmPSB+KEhSVElNX0VFQ1IyX0VFMTBTUkMgfCBIUlRJTV9FRUNSMl9FRTEwUE9MIHwgSFJUSU1fRUVDUjJfRUUxMFNOUyk7CisgICAgICBocnRpbV9lZWNyMiB8PSAocEV2ZW50Q2ZnLT5Tb3VyY2UgPDwgMjRVKTsKKyAgICAgIGhydGltX2VlY3IyIHw9ICgocEV2ZW50Q2ZnLT5Qb2xhcml0eSA8PCAyNFUpICYgKEhSVElNX0VFQ1IyX0VFMTBQT0wpKTsKKyAgICAgIGhydGltX2VlY3IyIHw9IChwRXZlbnRDZmctPlNlbnNpdGl2aXR5IDw8IDI0VSk7CisgICAgICBocnRpbV9lZWNyMyAmPSB+KEhSVElNX0VFQ1IzX0VFMTBGKTsKKyAgICAgIGhydGltX2VlY3IzIHw9IChwRXZlbnRDZmctPkZpbHRlciA8PCAyNFUpOworICAgICAgLyogVXBkYXRlIHRoZSBIUlRJTSByZWdpc3RlcnMgKi8KKyAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLkVFQ1IyID0gaHJ0aW1fZWVjcjI7CisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5FRUNSMyA9IGhydGltX2VlY3IzOworICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIHRpbWVyIGNvdW50ZXIgcmVzZXQgCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBUaW1lcklkeCBUaW1lciBpbmRleAorICAqIEBwYXJhbSAgRXZlbnQgRXZlbnQgY2hhbm5lbCBpZGVudGlmaWVyCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBIUlRJTV9USU1fUmVzZXRDb25maWcoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBFdmVudCkKK3sKKyAgc3dpdGNoIChFdmVudCkKKyAgeworICBjYXNlIEhSVElNX0VWRU5UXzE6CisgICAgeworICAgICAgaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLlJTVHhSID0gSFJUSU1fVElNUkVTRVRUUklHR0VSX0VFVl8xOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9FVkVOVF8yOgorICAgIHsKKyAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5SU1R4UiA9IEhSVElNX1RJTVJFU0VUVFJJR0dFUl9FRVZfMjsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fRVZFTlRfMzoKKyAgICB7CisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uUlNUeFIgPSBIUlRJTV9USU1SRVNFVFRSSUdHRVJfRUVWXzM7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEhSVElNX0VWRU5UXzQ6CisgICAgeworICAgICAgaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLlJTVHhSID0gSFJUSU1fVElNUkVTRVRUUklHR0VSX0VFVl80OworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9FVkVOVF81OgorICAgIHsKKyAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5SU1R4UiA9IEhSVElNX1RJTVJFU0VUVFJJR0dFUl9FRVZfNTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fRVZFTlRfNjoKKyAgICB7CisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uUlNUeFIgPSBIUlRJTV9USU1SRVNFVFRSSUdHRVJfRUVWXzY7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEhSVElNX0VWRU5UXzc6CisgICAgeworICAgICAgaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLlJTVHhSID0gSFJUSU1fVElNUkVTRVRUUklHR0VSX0VFVl83OworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9FVkVOVF84OgorICAgIHsKKyAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5SU1R4UiA9IEhSVElNX1RJTVJFU0VUVFJJR0dFUl9FRVZfODsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fRVZFTlRfOToKKyAgICB7CisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uUlNUeFIgPSBIUlRJTV9USU1SRVNFVFRSSUdHRVJfRUVWXzk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEhSVElNX0VWRU5UXzEwOgorICAgIHsKKyAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW1RpbWVySWR4XS5SU1R4UiA9IEhSVElNX1RJTVJFU0VUVFJJR0dFUl9FRVZfMTA7CisgICAgfQorICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyB0aGUgaW50ZXJydXB0IHRvIGVuYWJsZSBvciBkaXNhYmxlIGFjY29yZGluZyB0byB0aGUKKyAgKiAgICAgICAgIE9DIG1vZGUuCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBUaW1lcklkeCBUaW1lciBpbmRleAorICAqIEBwYXJhbSAgT0NDaGFubmVsIFRpbWVyIG91dHB1dAorICAqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQTE6IFRpbWVyIEEgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQTI6IFRpbWVyIEEgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQjE6IFRpbWVyIEIgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQjI6IFRpbWVyIEIgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQzE6IFRpbWVyIEMgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQzI6IFRpbWVyIEMgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URDE6IFRpbWVyIEQgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URDI6IFRpbWVyIEQgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URTE6IFRpbWVyIEUgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URTI6IFRpbWVyIEUgLSBPdXRwdXQgMgorICAqIEByZXR2YWwgSW50ZXJydXB0IHRvIGVuYWJsZSBvciBkaXNhYmxlCisgICovCitzdGF0aWMgdWludDMyX3QgSFJUSU1fR2V0SVRGcm9tT0NNb2RlKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPQ0NoYW5uZWwpCit7CisgIHVpbnQzMl90IGhydGltX3NldDsKKyAgdWludDMyX3QgaHJ0aW1fcmVzZXQ7CisgIHVpbnQzMl90IGludGVycnVwdCA9IDBVOworICAKKyAgc3dpdGNoIChPQ0NoYW5uZWwpCisgIHsKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEExOgorICBjYXNlIEhSVElNX09VVFBVVF9UQjE6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RDMToKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEQxOgorICBjYXNlIEhSVElNX09VVFBVVF9URTE6CisgICAgeworICAgICAgLyogUmV0cmVpdmVzIGFjdHVhbCBPQyBtb2RlIGFuZCBzZXQgaW50ZXJydXB0IGFjY29yZGluZ2x5ICovCisgICAgICBocnRpbV9zZXQgPSBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uU0VUeDFSOworICAgICAgaHJ0aW1fcmVzZXQgPSBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uUlNUeDFSOworICAgICAgCisgICAgICBpZiAoKChocnRpbV9zZXQgJiBIUlRJTV9PVVRQVVRTRVRfVElNQ01QMSkgPT0gSFJUSU1fT1VUUFVUU0VUX1RJTUNNUDEpICYmCisgICAgICAgICAgKChocnRpbV9yZXNldCAmIEhSVElNX09VVFBVVFNFVF9USU1DTVAxKSA9PSBIUlRJTV9PVVRQVVRTRVRfVElNQ01QMSkpCisgICAgICB7CisgICAgICAgIC8qIE9DIG1vZGU6IEhSVElNX0JBU0lDT0NNT0RFX1RPR0dMRSAqLworICAgICAgICBpbnRlcnJ1cHQgPSBIUlRJTV9USU1fSVRfQ01QMTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCgoaHJ0aW1fc2V0ICYgSFJUSU1fT1VUUFVUU0VUX1RJTUNNUDEpID09IEhSVElNX09VVFBVVFNFVF9USU1DTVAxKSAmJgorICAgICAgICAgICAgICAgKGhydGltX3Jlc2V0ICA9PSAwVSkpCisgICAgICB7CisgICAgICAgICAvKiBPQyBtb2RlOiBIUlRJTV9CQVNJQ09DTU9ERV9BQ1RJVkUgKi8KKyAgICAgICAgaW50ZXJydXB0ID0gSFJUSU1fVElNX0lUX1NFVDE7CisgICAgICB9CisgICAgICBlbHNlIGlmICgoaHJ0aW1fc2V0ID09IDBVKSAmJgorICAgICAgICAgICAgICAgKChocnRpbV9yZXNldCAmIEhSVElNX09VVFBVVFNFVF9USU1DTVAxKSA9PSBIUlRJTV9PVVRQVVRTRVRfVElNQ01QMSkpCisgICAgICB7CisgICAgICAgICAvKiBPQyBtb2RlOiBIUlRJTV9CQVNJQ09DTU9ERV9JTkFDVElWRSAqLworICAgICAgICBpbnRlcnJ1cHQgPSBIUlRJTV9USU1fSVRfUlNUMTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RBMjoKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEIyOgorICBjYXNlIEhSVElNX09VVFBVVF9UQzI6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1REMjoKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEUyOgorICAgIHsKKyAgICAgIC8qIFJldHJlaXZlcyBhY3R1YWwgT0MgbW9kZSBhbmQgc2V0IGludGVycnVwdCBhY2NvcmRpbmdseSAqLworICAgICAgaHJ0aW1fc2V0ID0gaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLlNFVHgyUjsKKyAgICAgIGhydGltX3Jlc2V0ID0gaGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbVGltZXJJZHhdLlJTVHgyUjsKKyAgICAgIAorICAgICAgaWYgKCgoaHJ0aW1fc2V0ICYgSFJUSU1fT1VUUFVUU0VUX1RJTUNNUDIpID09IEhSVElNX09VVFBVVFNFVF9USU1DTVAyKSAmJgorICAgICAgICAgICgoaHJ0aW1fcmVzZXQgJiBIUlRJTV9PVVRQVVRTRVRfVElNQ01QMikgPT0gSFJUSU1fT1VUUFVUU0VUX1RJTUNNUDIpKQorICAgICAgeworICAgICAgICAvKiBPQyBtb2RlOiBIUlRJTV9CQVNJQ09DTU9ERV9UT0dHTEUgKi8KKyAgICAgICAgaW50ZXJydXB0ID0gSFJUSU1fVElNX0lUX0NNUDI7CisgICAgICB9CisgICAgICBlbHNlIGlmICgoKGhydGltX3NldCAmIEhSVElNX09VVFBVVFNFVF9USU1DTVAyKSA9PSBIUlRJTV9PVVRQVVRTRVRfVElNQ01QMikgJiYKKyAgICAgICAgICAgICAgIChocnRpbV9yZXNldCAgPT0gMFUpKQorICAgICAgeworICAgICAgICAgLyogT0MgbW9kZTogSFJUSU1fQkFTSUNPQ01PREVfQUNUSVZFICovCisgICAgICAgIGludGVycnVwdCA9IEhSVElNX1RJTV9JVF9TRVQyOworICAgICAgfQorICAgICAgZWxzZSBpZiAoKGhydGltX3NldCA9PSAwVSkgJiYKKyAgICAgICAgICAgICAgICgoaHJ0aW1fcmVzZXQgJiBIUlRJTV9PVVRQVVRTRVRfVElNQ01QMikgPT0gSFJUSU1fT1VUUFVUU0VUX1RJTUNNUDIpKQorICAgICAgeworICAgICAgICAgLyogT0MgbW9kZTogSFJUSU1fQkFTSUNPQ01PREVfSU5BQ1RJVkUgKi8KKyAgICAgICAgaW50ZXJydXB0ID0gSFJUSU1fVElNX0lUX1JTVDI7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9CisgIAorICByZXR1cm4gaW50ZXJydXB0OworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgdGhlIERNQSByZXF1ZXN0IHRvIGVuYWJsZSBvciBkaXNhYmxlIGFjY29yZGluZyB0byB0aGUKKyAgKiAgICAgICAgIE9DIG1vZGUuCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHBhcmFtICBUaW1lcklkeCBUaW1lciBpbmRleAorICAqIEBwYXJhbSAgT0NDaGFubmVsIFRpbWVyIG91dHB1dAorICAqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQTE6IFRpbWVyIEEgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQTI6IFRpbWVyIEEgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQjE6IFRpbWVyIEIgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQjI6IFRpbWVyIEIgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQzE6IFRpbWVyIEMgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9UQzI6IFRpbWVyIEMgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URDE6IFRpbWVyIEQgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URDI6IFRpbWVyIEQgLSBPdXRwdXQgMgorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URTE6IFRpbWVyIEUgLSBPdXRwdXQgMQorICAqICAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX09VVFBVVF9URTI6IFRpbWVyIEUgLSBPdXRwdXQgMgorICAqIEByZXR2YWwgRE1BIHJlcXVlc3QgdG8gZW5hYmxlIG9yIGRpc2FibGUKKyAgKi8KK3N0YXRpYyB1aW50MzJfdCBIUlRJTV9HZXRETUFGcm9tT0NNb2RlKEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE9DQ2hhbm5lbCkKK3sKKyAgdWludDMyX3QgaHJ0aW1fc2V0OworICB1aW50MzJfdCBocnRpbV9yZXNldDsKKyAgdWludDMyX3QgZG1hX3JlcXVlc3QgPSAwVTsKKyAgCisgIHN3aXRjaCAoT0NDaGFubmVsKQorICB7CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RBMToKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEIxOgorICBjYXNlIEhSVElNX09VVFBVVF9UQzE6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1REMToKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEUxOgorICAgIHsKKyAgICAgIC8qIFJldHJlaXZlcyBhY3R1YWwgT0MgbW9kZSBhbmQgc2V0IGRtYV9yZXF1ZXN0IGFjY29yZGluZ2x5ICovCisgICAgICBocnRpbV9zZXQgPSBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uU0VUeDFSOworICAgICAgaHJ0aW1fcmVzZXQgPSBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uUlNUeDFSOworICAgICAgCisgICAgICBpZiAoKChocnRpbV9zZXQgJiBIUlRJTV9PVVRQVVRTRVRfVElNQ01QMSkgPT0gSFJUSU1fT1VUUFVUU0VUX1RJTUNNUDEpICYmCisgICAgICAgICAgKChocnRpbV9yZXNldCAmIEhSVElNX09VVFBVVFNFVF9USU1DTVAxKSA9PSBIUlRJTV9PVVRQVVRTRVRfVElNQ01QMSkpCisgICAgICB7CisgICAgICAgIC8qIE9DIG1vZGU6IEhSVElNX0JBU0lDT0NNT0RFX1RPR0dMRSAqLworICAgICAgICBkbWFfcmVxdWVzdCA9IEhSVElNX1RJTV9ETUFfQ01QMTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCgoaHJ0aW1fc2V0ICYgSFJUSU1fT1VUUFVUU0VUX1RJTUNNUDEpID09IEhSVElNX09VVFBVVFNFVF9USU1DTVAxKSAmJgorICAgICAgICAgICAgICAgKGhydGltX3Jlc2V0ICA9PSAwVSkpCisgICAgICB7CisgICAgICAgICAvKiBPQyBtb2RlOiBIUlRJTV9CQVNJQ09DTU9ERV9BQ1RJVkUgKi8KKyAgICAgICAgZG1hX3JlcXVlc3QgPSBIUlRJTV9USU1fRE1BX1NFVDE7CisgICAgICB9CisgICAgICBlbHNlIGlmICgoaHJ0aW1fc2V0ID09IDBVKSAmJgorICAgICAgICAgICAgICAgKChocnRpbV9yZXNldCAmIEhSVElNX09VVFBVVFNFVF9USU1DTVAxKSA9PSBIUlRJTV9PVVRQVVRTRVRfVElNQ01QMSkpCisgICAgICB7CisgICAgICAgICAvKiBPQyBtb2RlOiBIUlRJTV9CQVNJQ09DTU9ERV9JTkFDVElWRSAqLworICAgICAgICBkbWFfcmVxdWVzdCA9IEhSVElNX1RJTV9ETUFfUlNUMTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fT1VUUFVUX1RBMjoKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEIyOgorICBjYXNlIEhSVElNX09VVFBVVF9UQzI6CisgIGNhc2UgSFJUSU1fT1VUUFVUX1REMjoKKyAgY2FzZSBIUlRJTV9PVVRQVVRfVEUyOgorICAgIHsKKyAgICAgIC8qIFJldHJlaXZlcyBhY3R1YWwgT0MgbW9kZSBhbmQgc2V0IGRtYV9yZXF1ZXN0IGFjY29yZGluZ2x5ICovCisgICAgICBocnRpbV9zZXQgPSBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uU0VUeDJSOworICAgICAgaHJ0aW1fcmVzZXQgPSBoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1tUaW1lcklkeF0uUlNUeDJSOworICAgICAgCisgICAgICBpZiAoKChocnRpbV9zZXQgJiBIUlRJTV9PVVRQVVRTRVRfVElNQ01QMikgPT0gSFJUSU1fT1VUUFVUU0VUX1RJTUNNUDIpICYmCisgICAgICAgICAgKChocnRpbV9yZXNldCAmIEhSVElNX09VVFBVVFNFVF9USU1DTVAyKSA9PSBIUlRJTV9PVVRQVVRTRVRfVElNQ01QMikpCisgICAgICB7CisgICAgICAgIC8qIE9DIG1vZGU6IEhSVElNX0JBU0lDT0NNT0RFX1RPR0dMRSAqLworICAgICAgICBkbWFfcmVxdWVzdCA9IEhSVElNX1RJTV9ETUFfQ01QMjsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCgoaHJ0aW1fc2V0ICYgSFJUSU1fT1VUUFVUU0VUX1RJTUNNUDIpID09IEhSVElNX09VVFBVVFNFVF9USU1DTVAyKSAmJgorICAgICAgICAgICAgICAgKGhydGltX3Jlc2V0ICA9PSAwVSkpCisgICAgICB7CisgICAgICAgICAvKiBPQyBtb2RlOiBIUlRJTV9CQVNJQ09DTU9ERV9BQ1RJVkUgKi8KKyAgICAgICAgZG1hX3JlcXVlc3QgPSBIUlRJTV9USU1fRE1BX1NFVDI7CisgICAgICB9CisgICAgICBlbHNlIGlmICgoaHJ0aW1fc2V0ID09IDBVKSAmJgorICAgICAgICAgICAgICAgKChocnRpbV9yZXNldCAmIEhSVElNX09VVFBVVFNFVF9USU1DTVAyKSA9PSBIUlRJTV9PVVRQVVRTRVRfVElNQ01QMikpCisgICAgICB7CisgICAgICAgICAvKiBPQyBtb2RlOiBIUlRJTV9CQVNJQ09DTU9ERV9JTkFDVElWRSAqLworICAgICAgICBkbWFfcmVxdWVzdCA9IEhSVElNX1RJTV9ETUFfUlNUMjsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KKyAgCisgIHJldHVybiBkbWFfcmVxdWVzdDsKK30KKworc3RhdGljIERNQV9IYW5kbGVUeXBlRGVmICogSFJUSU1fR2V0RE1BSGFuZGxlRnJvbVRpbWVySWR4KEhSVElNX0hhbmRsZVR5cGVEZWYgKiBoaHJ0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgpCit7CisgIERNQV9IYW5kbGVUeXBlRGVmICogaGRtYSA9IChETUFfSGFuZGxlVHlwZURlZiAqKU5VTEw7CisgIAorICBzd2l0Y2ggKFRpbWVySWR4KQorICB7CisgIGNhc2UgSFJUSU1fVElNRVJJTkRFWF9NQVNURVI6CisgICAgeworICAgICAgaGRtYSA9IGhocnRpbS0+aGRtYU1hc3RlcjsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9BOgorICAgIHsKKyAgICAgIGhkbWEgPSBoaHJ0aW0tPmhkbWFUaW1lckE7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQjoKKyAgICB7CisgICAgICBoZG1hID0gaGhydGltLT5oZG1hVGltZXJCOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9USU1FUklOREVYX1RJTUVSX0M6CisgICAgeworICAgICAgaGRtYSA9IGhocnRpbS0+aGRtYVRpbWVyQzsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9EOgorICAgIHsKKyAgICAgIGhkbWEgPSBoaHJ0aW0tPmhkbWFUaW1lckQ7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRToKKyAgICB7CisgICAgICBoZG1hID0gaGhydGltLT5oZG1hVGltZXJFOworICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorICAKKyAgcmV0dXJuIGhkbWE7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBHZXRUaW1lcklkeEZyb21ETUFIYW5kbGUoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE1BX0hhbmRsZVR5cGVEZWYgKiAgIGhkbWEpCit7CisgIHVpbnQzMl90IHRpbWVkX2lkeCA9IDB4RkZGRkZGRkZVOworICAKKyAgaWYgKGhkbWEgPT0gIGhocnRpbS0+aGRtYU1hc3RlcikKKyAgeworICAgIHRpbWVkX2lkeCA9IEhSVElNX1RJTUVSSU5ERVhfTUFTVEVSOworICB9CisgIGVsc2UgaWYgKGhkbWEgPT0gaGhydGltLT5oZG1hVGltZXJBKQorICB7CisgICAgdGltZWRfaWR4ID0gSFJUSU1fVElNRVJJTkRFWF9USU1FUl9BOworICB9CisgIGVsc2UgaWYgKGhkbWEgPT0gaGhydGltLT5oZG1hVGltZXJCKQorICB7CisgICAgdGltZWRfaWR4ID0gSFJUSU1fVElNRVJJTkRFWF9USU1FUl9COworICB9CisgIGVsc2UgaWYgKGhkbWEgPT0gaGhydGltLT5oZG1hVGltZXJDKQorICB7CisgICAgdGltZWRfaWR4ID0gSFJUSU1fVElNRVJJTkRFWF9USU1FUl9DOworICB9CisgIGVsc2UgaWYgKGhkbWEgPT0gaGhydGltLT5oZG1hVGltZXJEKQorICB7CisgICAgdGltZWRfaWR4ID0gSFJUSU1fVElNRVJJTkRFWF9USU1FUl9EOworICB9CisgIGVsc2UgaWYgKGhkbWEgPT0gaGhydGltLT5oZG1hVGltZXJFKQorICB7CisgICAgdGltZWRfaWR4ID0gSFJUSU1fVElNRVJJTkRFWF9USU1FUl9FOworICB9CisgICAKKyAgcmV0dXJuIHRpbWVkX2lkeDsKK30KKworLyoqCisgICogQGJyaWVmICBGb3JjZXMgYW4gaW1tZWRpYXRlIHRyYW5zZmVyIGZyb20gdGhlIHByZWxvYWQgdG8gdGhlIGFjdGl2ZSAKKyAgKiAgICAgICAgIHJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gIGhocnRpbSBwb2ludGVyIHRvIEhBTCBIUlRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVySWR4IFRpbWVyIGluZGV4CisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBIUlRJTV9Gb3JjZVJlZ2lzdGVyc1VwZGF0ZShIUlRJTV9IYW5kbGVUeXBlRGVmICogaGhydGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXJJZHgpCit7CisgIHN3aXRjaCAoVGltZXJJZHgpCisgIHsKKyAgY2FzZSBIUlRJTV9USU1FUklOREVYX01BU1RFUjoKKyAgICB7CisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5DUjIgfD0gSFJUSU1fQ1IyX01TV1U7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQToKKyAgICB7CisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5DUjIgfD0gSFJUSU1fQ1IyX1RBU1dVOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9USU1FUklOREVYX1RJTUVSX0I6CisgICAgeworICAgICAgaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuQ1IyIHw9IEhSVElNX0NSMl9UQlNXVTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9DOgorICAgIHsKKyAgICAgIGhocnRpbS0+SW5zdGFuY2UtPnNDb21tb25SZWdzLkNSMiB8PSBIUlRJTV9DUjJfVENTV1U7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfRDoKKyAgICB7CisgICAgICBoaHJ0aW0tPkluc3RhbmNlLT5zQ29tbW9uUmVncy5DUjIgfD0gSFJUSU1fQ1IyX1REU1dVOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBIUlRJTV9USU1FUklOREVYX1RJTUVSX0U6CisgICAgeworICAgICAgaGhydGltLT5JbnN0YW5jZS0+c0NvbW1vblJlZ3MuQ1IyIHw9IEhSVElNX0NSMl9URVNXVTsKKyAgICB9CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KK30KKworCisvKioKKyAgKiBAYnJpZWYgIEhSVElNIGludGVycnVwdHMgc2VydmljZSByb3V0aW5lCisgICogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBIUlRJTV9IUlRJTV9JU1IoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSkKK3sKKyAgLyogRmF1bHQgMSBldmVudCAqLworICBpZihfX0hBTF9IUlRJTV9HRVRfRkxBRyhoaHJ0aW0sIEhSVElNX0ZMQUdfRkxUMSkgIT0gUkVTRVQpCisgIHsKKyAgICBpZihfX0hBTF9IUlRJTV9HRVRfSVRTVEFUVVMoaGhydGltLCBIUlRJTV9JVF9GTFQxKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBfX0hBTF9IUlRJTV9DTEVBUl9JVChoaHJ0aW0sIEhSVElNX0lUX0ZMVDEpOworICAgICAgCisgICAgICAvKiBJbnZva2UgRmF1bHQgMSBldmVudCBjYWxsYmFjayAqLworICAgICAgSEFMX0hSVElNX0ZhdWx0MUNhbGxiYWNrKGhocnRpbSk7ICAKKyAgICB9CisgIH0KKyAgCisgIC8qIEZhdWx0IDIgZXZlbnQgKi8KKyAgaWYoX19IQUxfSFJUSU1fR0VUX0ZMQUcoaGhydGltLCBIUlRJTV9GTEFHX0ZMVDIpICE9IFJFU0VUKQorICB7CisgICAgaWYoX19IQUxfSFJUSU1fR0VUX0lUU1RBVFVTKGhocnRpbSwgSFJUSU1fSVRfRkxUMikgIT0gUkVTRVQpCisgICAgeworICAgICAgX19IQUxfSFJUSU1fQ0xFQVJfSVQoaGhydGltLCBIUlRJTV9JVF9GTFQyKTsKKyAgICAgIAorICAgICAgLyogSW52b2tlIEZhdWx0IDIgZXZlbnQgY2FsbGJhY2sgKi8KKyAgICAgIEhBTF9IUlRJTV9GYXVsdDJDYWxsYmFjayhoaHJ0aW0pOyAgCisgICAgfQorICB9CisgIAorICAvKiBGYXVsdCAzIGV2ZW50ICovCisgIGlmKF9fSEFMX0hSVElNX0dFVF9GTEFHKGhocnRpbSwgSFJUSU1fRkxBR19GTFQzKSAhPSBSRVNFVCkKKyAgeworICAgIGlmKF9fSEFMX0hSVElNX0dFVF9JVFNUQVRVUyhoaHJ0aW0sIEhSVElNX0lUX0ZMVDMpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIF9fSEFMX0hSVElNX0NMRUFSX0lUKGhocnRpbSwgSFJUSU1fSVRfRkxUMyk7CisgICAgICAKKyAgICAgIC8qIEludm9rZSBGYXVsdCAzIGV2ZW50IGNhbGxiYWNrICovCisgICAgICBIQUxfSFJUSU1fRmF1bHQzQ2FsbGJhY2soaGhydGltKTsgIAorICAgIH0KKyAgfQorICAKKyAgLyogRmF1bHQgNCBldmVudCAqLworICBpZihfX0hBTF9IUlRJTV9HRVRfRkxBRyhoaHJ0aW0sIEhSVElNX0ZMQUdfRkxUNCkgIT0gUkVTRVQpCisgIHsKKyAgICBpZihfX0hBTF9IUlRJTV9HRVRfSVRTVEFUVVMoaGhydGltLCBIUlRJTV9JVF9GTFQ0KSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBfX0hBTF9IUlRJTV9DTEVBUl9JVChoaHJ0aW0sIEhSVElNX0lUX0ZMVDQpOworICAgICAgCisgICAgICAvKiBJbnZva2UgRmF1bHQgNCBldmVudCBjYWxsYmFjayAqLworICAgICAgSEFMX0hSVElNX0ZhdWx0NENhbGxiYWNrKGhocnRpbSk7ICAKKyAgICB9CisgIH0KKyAgCisgIC8qIEZhdWx0IDUgZXZlbnQgKi8KKyAgaWYoX19IQUxfSFJUSU1fR0VUX0ZMQUcoaGhydGltLCBIUlRJTV9GTEFHX0ZMVDUpICE9IFJFU0VUKQorICB7CisgICAgaWYoX19IQUxfSFJUSU1fR0VUX0lUU1RBVFVTKGhocnRpbSwgSFJUSU1fSVRfRkxUNSkgIT0gUkVTRVQpCisgICAgeworICAgICAgX19IQUxfSFJUSU1fQ0xFQVJfSVQoaGhydGltLCBIUlRJTV9JVF9GTFQ1KTsKKyAgICAgIAorICAgICAgLyogSW52b2tlIEZhdWx0IDUgZXZlbnQgY2FsbGJhY2sgKi8KKyAgICAgIEhBTF9IUlRJTV9GYXVsdDVDYWxsYmFjayhoaHJ0aW0pOyAgCisgICAgfQorICB9CisgIAorICAvKiBTeXN0ZW0gZmF1bHQgZXZlbnQgKi8KKyAgaWYoX19IQUxfSFJUSU1fR0VUX0ZMQUcoaGhydGltLCBIUlRJTV9GTEFHX1NZU0ZMVCkgIT0gUkVTRVQpCisgIHsKKyAgICBpZihfX0hBTF9IUlRJTV9HRVRfSVRTVEFUVVMoaGhydGltLCBIUlRJTV9JVF9TWVNGTFQpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIF9fSEFMX0hSVElNX0NMRUFSX0lUKGhocnRpbSwgSFJUSU1fSVRfU1lTRkxUKTsKKyAgICAgIAorICAgICAgLyogSW52b2tlIFN5c3RlbSBmYXVsdCBldmVudCBjYWxsYmFjayAqLworICAgICAgSEFMX0hSVElNX1N5c3RlbUZhdWx0Q2FsbGJhY2soaGhydGltKTsgIAorICAgIH0KKyAgfQorfQorCisvKioKKyogQGJyaWVmICBNYXN0ZXIgdGltZXIgaW50ZXJydXB0cyBzZXJ2aWNlIHJvdXRpbmUKKyogQHBhcmFtICBoaHJ0aW0gcG9pbnRlciB0byBIQUwgSFJUSU0gaGFuZGxlCisqIEByZXR2YWwgTm9uZQorKi8KK3N0YXRpYyB2b2lkIEhSVElNX01hc3Rlcl9JU1IoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSkKK3sKKyAgLyogRExMIGNhbGlicmF0aW9uIHJlYWR5IGV2ZW50ICovCisgIGlmKF9fSEFMX0hSVElNX0dFVF9GTEFHKGhocnRpbSwgSFJUSU1fRkxBR19ETExSRFkpICE9IFJFU0VUKQorICB7CisgICAgaWYoX19IQUxfSFJUSU1fR0VUX0lUU1RBVFVTKGhocnRpbSwgSFJUSU1fSVRfRExMUkRZKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBfX0hBTF9IUlRJTV9DTEVBUl9JVChoaHJ0aW0sIEhSVElNX0lUX0RMTFJEWSk7CisgICAgICAKKyAgICAgIC8qIFNldCBIUlRJTSBTdGF0ZSAqLyAgCisgICAgICBoaHJ0aW0tPlN0YXRlID0gSEFMX0hSVElNX1NUQVRFX1JFQURZOworICAgICAgCisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGhydGltKTsgCisgICAgICAKKyAgICAgIC8qIEludm9rZSBTeXN0ZW0gZmF1bHQgZXZlbnQgY2FsbGJhY2sgKi8KKyAgICAgIEhBTF9IUlRJTV9ETExDYWxicmF0aW9uUmVhZHlDYWxsYmFjayhoaHJ0aW0pOyAgCisgICAgfQorICB9CisgIAorICAvKiBCdXJzdCBtb2RlIHBlcmlvZCBldmVudCAqLworICBpZihfX0hBTF9IUlRJTV9HRVRfRkxBRyhoaHJ0aW0sIEhSVElNX0ZMQUdfQk1QRVIpICE9IFJFU0VUKQorICB7CisgICAgaWYoX19IQUxfSFJUSU1fR0VUX0lUU1RBVFVTKGhocnRpbSwgSFJUSU1fSVRfQk1QRVIpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIF9fSEFMX0hSVElNX0NMRUFSX0lUKGhocnRpbSwgSFJUSU1fSVRfQk1QRVIpOworICAgICAgCisgICAgICAvKiBJbnZva2UgQnVyc3QgbW9kZSBwZXJpb2QgZXZlbnQgY2FsbGJhY2sgKi8KKyAgICAgIEhBTF9IUlRJTV9CdXJzdE1vZGVQZXJpb2RDYWxsYmFjayhoaHJ0aW0pOyAgCisgICAgfQorICB9ICAKKyAgCisgIC8qIE1hc3RlciB0aW1lciBjb21wYXJlIDEgZXZlbnQgKi8KKyAgaWYoX19IQUxfSFJUSU1fTUFTVEVSX0dFVF9GTEFHKGhocnRpbSwgSFJUSU1fTUFTVEVSX0ZMQUdfTUNNUDEpICE9IFJFU0VUKQorICB7CisgICAgaWYoX19IQUxfSFJUSU1fTUFTVEVSX0dFVF9JVFNUQVRVUyhoaHJ0aW0sIEhSVElNX01BU1RFUl9JVF9NQ01QMSkgIT0gUkVTRVQpCisgICAgeworICAgICAgX19IQUxfSFJUSU1fTUFTVEVSX0NMRUFSX0lUKGhocnRpbSwgSFJUSU1fTUFTVEVSX0lUX01DTVAxKTsKKyAgICAgIAorICAgICAgLyogSW52b2tlIGNvbXBhcmUgMSBldmVudCBjYWxsYmFjayAqLworICAgICAgSEFMX0hSVElNX0NvbXBhcmUxRXZlbnRDYWxsYmFjayhoaHJ0aW0sIEhSVElNX1RJTUVSSU5ERVhfTUFTVEVSKTsgIAorICAgIH0KKyAgfQorICAKKyAgLyogTWFzdGVyIHRpbWVyIGNvbXBhcmUgMiBldmVudCAqLworICBpZihfX0hBTF9IUlRJTV9NQVNURVJfR0VUX0ZMQUcoaGhydGltLCBIUlRJTV9NQVNURVJfRkxBR19NQ01QMikgIT0gUkVTRVQpCisgIHsKKyAgICBpZihfX0hBTF9IUlRJTV9NQVNURVJfR0VUX0lUU1RBVFVTKGhocnRpbSwgSFJUSU1fTUFTVEVSX0lUX01DTVAyKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBfX0hBTF9IUlRJTV9NQVNURVJfQ0xFQVJfSVQoaGhydGltLCBIUlRJTV9NQVNURVJfSVRfTUNNUDIpOworICAgICAgCisgICAgICAvKiBJbnZva2UgY29tcGFyZSAyIGV2ZW50IGNhbGxiYWNrICovCisgICAgICBIQUxfSFJUSU1fQ29tcGFyZTJFdmVudENhbGxiYWNrKGhocnRpbSwgSFJUSU1fVElNRVJJTkRFWF9NQVNURVIpOyAgCisgICAgfQorICB9CisgIAorICAvKiBNYXN0ZXIgdGltZXIgY29tcGFyZSAzIGV2ZW50ICovCisgIGlmKF9fSEFMX0hSVElNX01BU1RFUl9HRVRfRkxBRyhoaHJ0aW0sIEhSVElNX01BU1RFUl9GTEFHX01DTVAzKSAhPSBSRVNFVCkKKyAgeworICAgIGlmKF9fSEFMX0hSVElNX01BU1RFUl9HRVRfSVRTVEFUVVMoaGhydGltLCBIUlRJTV9NQVNURVJfSVRfTUNNUDMpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIF9fSEFMX0hSVElNX01BU1RFUl9DTEVBUl9JVChoaHJ0aW0sIEhSVElNX01BU1RFUl9JVF9NQ01QMyk7CisgICAgICAKKyAgICAgIC8qIEludm9rZSBjb21wYXJlIDMgZXZlbnQgY2FsbGJhY2sgKi8KKyAgICAgIEhBTF9IUlRJTV9Db21wYXJlM0V2ZW50Q2FsbGJhY2soaGhydGltLCBIUlRJTV9USU1FUklOREVYX01BU1RFUik7ICAKKyAgICB9CisgIH0KKyAgCisgIC8qIE1hc3RlciB0aW1lciBjb21wYXJlIDQgZXZlbnQgKi8KKyAgaWYoX19IQUxfSFJUSU1fTUFTVEVSX0dFVF9GTEFHKGhocnRpbSwgSFJUSU1fTUFTVEVSX0ZMQUdfTUNNUDQpICE9IFJFU0VUKQorICB7CisgICAgaWYoX19IQUxfSFJUSU1fTUFTVEVSX0dFVF9JVFNUQVRVUyhoaHJ0aW0sIEhSVElNX01BU1RFUl9JVF9NQ01QNCkgIT0gUkVTRVQpCisgICAgeworICAgICAgX19IQUxfSFJUSU1fTUFTVEVSX0NMRUFSX0lUKGhocnRpbSwgSFJUSU1fTUFTVEVSX0lUX01DTVA0KTsKKyAgICAgIAorICAgICAgLyogSW52b2tlIGNvbXBhcmUgNCBldmVudCBjYWxsYmFjayAqLworICAgICAgSEFMX0hSVElNX0NvbXBhcmU0RXZlbnRDYWxsYmFjayhoaHJ0aW0sIEhSVElNX1RJTUVSSU5ERVhfTUFTVEVSKTsgIAorICAgIH0KKyAgfQorICAKKyAgLyogTWFzdGVyIHRpbWVyIHJlcGV0aXRpb24gZXZlbnQgKi8KKyAgaWYoX19IQUxfSFJUSU1fTUFTVEVSX0dFVF9GTEFHKGhocnRpbSwgSFJUSU1fTUFTVEVSX0ZMQUdfTVJFUCkgIT0gUkVTRVQpCisgIHsKKyAgICBpZihfX0hBTF9IUlRJTV9NQVNURVJfR0VUX0lUU1RBVFVTKGhocnRpbSwgSFJUSU1fTUFTVEVSX0lUX01SRVApICE9IFJFU0VUKQorICAgIHsKKyAgICAgIF9fSEFMX0hSVElNX01BU1RFUl9DTEVBUl9JVChoaHJ0aW0sIEhSVElNX01BU1RFUl9JVF9NUkVQKTsKKyAgICAgIAorICAgICAgLyogSW52b2tlIHJlcGV0aXRpb24gZXZlbnQgY2FsbGJhY2sgKi8KKyAgICAgIEhBTF9IUlRJTV9SZXBldGl0aW9uRXZlbnRDYWxsYmFjayhoaHJ0aW0sIEhSVElNX1RJTUVSSU5ERVhfTUFTVEVSKTsgIAorICAgIH0KKyAgfQorICAKKyAgLyogU3luY2hyb25pemF0aW9uIGlucHV0IGV2ZW50ICovCisgIGlmKF9fSEFMX0hSVElNX01BU1RFUl9HRVRfRkxBRyhoaHJ0aW0sIEhSVElNX01BU1RFUl9GTEFHX1NZTkMpICE9IFJFU0VUKQorICB7CisgICAgaWYoX19IQUxfSFJUSU1fTUFTVEVSX0dFVF9JVFNUQVRVUyhoaHJ0aW0sIEhSVElNX01BU1RFUl9JVF9TWU5DKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBfX0hBTF9IUlRJTV9NQVNURVJfQ0xFQVJfSVQoaGhydGltLCBIUlRJTV9NQVNURVJfSVRfU1lOQyk7CisgICAgICAKKyAgICAgIC8qIEludm9rZSBzeW5jaHJvbml6YXRpb24gZXZlbnQgY2FsbGJhY2sgKi8KKyAgICAgIEhBTF9IUlRJTV9TeW5jaHJvbml6YXRpb25FdmVudENhbGxiYWNrKGhocnRpbSk7ICAKKyAgICB9CisgIH0KKyAgCisgIC8qIE1hc3RlciB0aW1lciByZWdpc3RlcnMgdXBkYXRlIGV2ZW50ICovCisgIGlmKF9fSEFMX0hSVElNX01BU1RFUl9HRVRfRkxBRyhoaHJ0aW0sIEhSVElNX01BU1RFUl9GTEFHX01VUEQpICE9IFJFU0VUKQorICB7CisgICAgaWYoX19IQUxfSFJUSU1fTUFTVEVSX0dFVF9JVFNUQVRVUyhoaHJ0aW0sIEhSVElNX01BU1RFUl9JVF9NVVBEKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBfX0hBTF9IUlRJTV9NQVNURVJfQ0xFQVJfSVQoaGhydGltLCBIUlRJTV9NQVNURVJfSVRfTVVQRCk7CisgICAgICAKKyAgICAgIC8qIEludm9rZSByZWdpc3RlcnMgdXBkYXRlIGV2ZW50IGNhbGxiYWNrICovCisgICAgICBIQUxfSFJUSU1fUmVnaXN0ZXJzVXBkYXRlQ2FsbGJhY2soaGhydGltLCBIUlRJTV9USU1FUklOREVYX01BU1RFUik7ICAKKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBUaW1lciBpbnRlcnJ1cHRzIHNlcnZpY2Ugcm91dGluZQorICAqIEBwYXJhbSAgaGhydGltIHBvaW50ZXIgdG8gSEFMIEhSVElNIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZXJJZHggVGltZXIgaW5kZXgKKyAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9BIGZvciB0aW1lciBBCisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0IgZm9yIHRpbWVyIEIKKyAgKiAgICAgICAgICAgICAgICAgICBAYXJnIEhSVElNX1RJTUVSSU5ERVhfVElNRVJfQyBmb3IgdGltZXIgQworICAqICAgICAgICAgICAgICAgICAgIEBhcmcgSFJUSU1fVElNRVJJTkRFWF9USU1FUl9EIGZvciB0aW1lciBECisgICogICAgICAgICAgICAgICAgICAgQGFyZyBIUlRJTV9USU1FUklOREVYX1RJTUVSX0UgZm9yIHRpbWVyIEUKKyAgKiBAcmV0dmFsIE5vbmUKKyovCitzdGF0aWMgdm9pZCBIUlRJTV9UaW1lcl9JU1IoSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhocnRpbSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVySWR4KQoreworICAvKiBUaW1lciBjb21wYXJlIDEgZXZlbnQgKi8KKyAgaWYoX19IQUxfSFJUSU1fVElNRVJfR0VUX0ZMQUcoaGhydGltLCBUaW1lcklkeCwgSFJUSU1fVElNX0ZMQUdfQ01QMSkgIT0gUkVTRVQpCisgIHsKKyAgICBpZihfX0hBTF9IUlRJTV9USU1FUl9HRVRfSVRTVEFUVVMoaGhydGltLCBUaW1lcklkeCwgSFJUSU1fVElNX0lUX0NNUDEpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIF9fSEFMX0hSVElNX1RJTUVSX0NMRUFSX0lUKGhocnRpbSwgVGltZXJJZHgsIEhSVElNX1RJTV9JVF9DTVAxKTsKKyAgICAgIAorICAgICAgLyogSW52b2tlIGNvbXBhcmUgMSBldmVudCBjYWxsYmFjayAqLworICAgICAgSEFMX0hSVElNX0NvbXBhcmUxRXZlbnRDYWxsYmFjayhoaHJ0aW0sIFRpbWVySWR4KTsgIAorICAgIH0KKyAgfQorICAKKyAgLyogVGltZXIgY29tcGFyZSAyIGV2ZW50ICovCisgIGlmKF9fSEFMX0hSVElNX1RJTUVSX0dFVF9GTEFHKGhocnRpbSwgVGltZXJJZHgsIEhSVElNX1RJTV9GTEFHX0NNUDIpICE9IFJFU0VUKQorICB7CisgICAgaWYoX19IQUxfSFJUSU1fVElNRVJfR0VUX0lUU1RBVFVTKGhocnRpbSwgVGltZXJJZHgsIEhSVElNX1RJTV9JVF9DTVAyKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBfX0hBTF9IUlRJTV9USU1FUl9DTEVBUl9JVChoaHJ0aW0sIFRpbWVySWR4LCBIUlRJTV9USU1fSVRfQ01QMik7CisgICAgICAKKyAgICAgIC8qIEludm9rZSBjb21wYXJlIDIgZXZlbnQgY2FsbGJhY2sgKi8KKyAgICAgIEhBTF9IUlRJTV9Db21wYXJlMkV2ZW50Q2FsbGJhY2soaGhydGltLCBUaW1lcklkeCk7ICAKKyAgICB9CisgIH0KKyAgCisgIC8qIFRpbWVyIGNvbXBhcmUgMyBldmVudCAqLworICBpZihfX0hBTF9IUlRJTV9USU1FUl9HRVRfRkxBRyhoaHJ0aW0sIFRpbWVySWR4LCBIUlRJTV9USU1fRkxBR19DTVAzKSAhPSBSRVNFVCkKKyAgeworICAgIGlmKF9fSEFMX0hSVElNX1RJTUVSX0dFVF9JVFNUQVRVUyhoaHJ0aW0sIFRpbWVySWR4LCBIUlRJTV9USU1fSVRfQ01QMykgIT0gUkVTRVQpCisgICAgeworICAgICAgX19IQUxfSFJUSU1fVElNRVJfQ0xFQVJfSVQoaGhydGltLCBUaW1lcklkeCwgSFJUSU1fVElNX0lUX0NNUDMpOworICAgICAgCisgICAgICAvKiBJbnZva2UgY29tcGFyZSAzIGV2ZW50IGNhbGxiYWNrICovCisgICAgICBIQUxfSFJUSU1fQ29tcGFyZTNFdmVudENhbGxiYWNrKGhocnRpbSwgVGltZXJJZHgpOyAgCisgICAgfQorICB9CisgIAorICAvKiBUaW1lciBjb21wYXJlIDQgZXZlbnQgKi8KKyAgaWYoX19IQUxfSFJUSU1fVElNRVJfR0VUX0ZMQUcoaGhydGltLCBUaW1lcklkeCwgSFJUSU1fVElNX0ZMQUdfQ01QNCkgIT0gUkVTRVQpCisgIHsKKyAgICBpZihfX0hBTF9IUlRJTV9USU1FUl9HRVRfSVRTVEFUVVMoaGhydGltLCBUaW1lcklkeCwgSFJUSU1fVElNX0lUX0NNUDQpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIF9fSEFMX0hSVElNX1RJTUVSX0NMRUFSX0lUKGhocnRpbSwgVGltZXJJZHgsIEhSVElNX1RJTV9JVF9DTVA0KTsKKyAgICAgIAorICAgICAgLyogSW52b2tlIGNvbXBhcmUgNCBldmVudCBjYWxsYmFjayAqLworICAgICAgSEFMX0hSVElNX0NvbXBhcmU0RXZlbnRDYWxsYmFjayhoaHJ0aW0sIFRpbWVySWR4KTsgIAorICAgIH0KKyAgfQorICAKKyAgLyogVGltZXIgcmVwZXRpdGlvbiBldmVudCAqLworICBpZihfX0hBTF9IUlRJTV9USU1FUl9HRVRfRkxBRyhoaHJ0aW0sIFRpbWVySWR4LCBIUlRJTV9USU1fRkxBR19SRVApICE9IFJFU0VUKQorICB7CisgICAgaWYoX19IQUxfSFJUSU1fVElNRVJfR0VUX0lUU1RBVFVTKGhocnRpbSwgVGltZXJJZHgsIEhSVElNX1RJTV9JVF9SRVApICE9IFJFU0VUKQorICAgIHsKKyAgICAgIF9fSEFMX0hSVElNX1RJTUVSX0NMRUFSX0lUKGhocnRpbSwgVGltZXJJZHgsIEhSVElNX1RJTV9JVF9SRVApOworICAgICAgCisgICAgICAvKiBJbnZva2UgcmVwZXRpdGlvbiBldmVudCBjYWxsYmFjayAqLworICAgICAgSEFMX0hSVElNX1JlcGV0aXRpb25FdmVudENhbGxiYWNrKGhocnRpbSwgVGltZXJJZHgpOyAgCisgICAgfQorICB9CisgIAorICAvKiBUaW1lciByZWdpc3RlcnMgdXBkYXRlIGV2ZW50ICovCisgIGlmKF9fSEFMX0hSVElNX1RJTUVSX0dFVF9GTEFHKGhocnRpbSwgVGltZXJJZHgsIEhSVElNX1RJTV9GTEFHX1VQRCkgIT0gUkVTRVQpCisgIHsKKyAgICBpZihfX0hBTF9IUlRJTV9USU1FUl9HRVRfSVRTVEFUVVMoaGhydGltLCBUaW1lcklkeCwgSFJUSU1fVElNX0lUX1VQRCkgIT0gUkVTRVQpCisgICAgeworICAgICAgX19IQUxfSFJUSU1fVElNRVJfQ0xFQVJfSVQoaGhydGltLCBUaW1lcklkeCwgSFJUSU1fVElNX0lUX1VQRCk7CisgICAgICAKKyAgICAgIC8qIEludm9rZSByZWdpc3RlcnMgdXBkYXRlIGV2ZW50IGNhbGxiYWNrICovCisgICAgICBIQUxfSFJUSU1fUmVnaXN0ZXJzVXBkYXRlQ2FsbGJhY2soaGhydGltLCBUaW1lcklkeCk7ICAKKyAgICB9CisgIH0KKyAgCisgIC8qIFRpbWVyIGNhcHR1cmUgMSBldmVudCAqLworICBpZihfX0hBTF9IUlRJTV9USU1FUl9HRVRfRkxBRyhoaHJ0aW0sIFRpbWVySWR4LCBIUlRJTV9USU1fRkxBR19DUFQxKSAhPSBSRVNFVCkKKyAgeyAgICAKKyAgICBpZihfX0hBTF9IUlRJTV9USU1FUl9HRVRfSVRTVEFUVVMoaGhydGltLCBUaW1lcklkeCwgSFJUSU1fVElNX0lUX0NQVDEpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIF9fSEFMX0hSVElNX1RJTUVSX0NMRUFSX0lUKGhocnRpbSwgVGltZXJJZHgsIEhSVElNX1RJTV9JVF9DUFQxKTsKKyAgICAgIAorICAgICAgLyogSW52b2tlIGNhcHR1cmUgMSBldmVudCBjYWxsYmFjayAqLworICAgICAgSEFMX0hSVElNX0NhcHR1cmUxRXZlbnRDYWxsYmFjayhoaHJ0aW0sIFRpbWVySWR4KTsgIAorICAgIH0KKyAgfQorICAKKyAgLyogVGltZXIgY2FwdHVyZSAyIGV2ZW50ICovCisgIGlmKF9fSEFMX0hSVElNX1RJTUVSX0dFVF9GTEFHKGhocnRpbSwgVGltZXJJZHgsIEhSVElNX1RJTV9GTEFHX0NQVDIpICE9IFJFU0VUKQorICB7CisgICAgaWYoX19IQUxfSFJUSU1fVElNRVJfR0VUX0lUU1RBVFVTKGhocnRpbSwgVGltZXJJZHgsIEhSVElNX1RJTV9JVF9DUFQyKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBfX0hBTF9IUlRJTV9USU1FUl9DTEVBUl9JVChoaHJ0aW0sIFRpbWVySWR4LCBIUlRJTV9USU1fSVRfQ1BUMik7CisgICAgICAKKyAgICAgIC8qIEludm9rZSBjYXB0dXJlIDIgZXZlbnQgY2FsbGJhY2sgKi8KKyAgICAgIEhBTF9IUlRJTV9DYXB0dXJlMkV2ZW50Q2FsbGJhY2soaGhydGltLCBUaW1lcklkeCk7ICAKKyAgICB9CisgIH0KKyAgCisgIC8qIFRpbWVyIG91dHB1dCAxIHNldCBldmVudCAqLworICBpZihfX0hBTF9IUlRJTV9USU1FUl9HRVRfRkxBRyhoaHJ0aW0sIFRpbWVySWR4LCBIUlRJTV9USU1fRkxBR19TRVQxKSAhPSBSRVNFVCkKKyAgeworICAgIGlmKF9fSEFMX0hSVElNX1RJTUVSX0dFVF9JVFNUQVRVUyhoaHJ0aW0sIFRpbWVySWR4LCBIUlRJTV9USU1fSVRfU0VUMSkgIT0gUkVTRVQpCisgICAgeworICAgICAgX19IQUxfSFJUSU1fVElNRVJfQ0xFQVJfSVQoaGhydGltLCBUaW1lcklkeCwgSFJUSU1fVElNX0lUX1NFVDEpOworICAgICAgCisgICAgICAvKiBJbnZva2Ugb3V0cHV0IDEgc2V0IGV2ZW50IGNhbGxiYWNrICovCisgICAgICBIQUxfSFJUSU1fT3V0cHV0MVNldENhbGxiYWNrKGhocnRpbSwgVGltZXJJZHgpOyAgCisgICAgfQorICB9CisgIAorICAvKiBUaW1lciBvdXRwdXQgMSByZXNldCBldmVudCAqLworICBpZihfX0hBTF9IUlRJTV9USU1FUl9HRVRfRkxBRyhoaHJ0aW0sIFRpbWVySWR4LCBIUlRJTV9USU1fRkxBR19SU1QxKSAhPSBSRVNFVCkKKyAgeworICAgIGlmKF9fSEFMX0hSVElNX1RJTUVSX0dFVF9JVFNUQVRVUyhoaHJ0aW0sIFRpbWVySWR4LCBIUlRJTV9USU1fSVRfUlNUMSkgIT0gUkVTRVQpCisgICAgeworICAgICAgX19IQUxfSFJUSU1fVElNRVJfQ0xFQVJfSVQoaGhydGltLCBUaW1lcklkeCwgSFJUSU1fVElNX0lUX1JTVDEpOworICAgICAgCisgICAgICAvKiBJbnZva2Ugb3V0cHV0IDEgcmVzZXQgZXZlbnQgY2FsbGJhY2sgKi8KKyAgICAgIEhBTF9IUlRJTV9PdXRwdXQxUmVzZXRDYWxsYmFjayhoaHJ0aW0sIFRpbWVySWR4KTsgIAorICAgIH0KKyAgfQorICAKKyAgLyogVGltZXIgb3V0cHV0IDIgc2V0IGV2ZW50ICovCisgIGlmKF9fSEFMX0hSVElNX1RJTUVSX0dFVF9GTEFHKGhocnRpbSwgVGltZXJJZHgsIEhSVElNX1RJTV9GTEFHX1NFVDIpICE9IFJFU0VUKQorICB7CisgICAgaWYoX19IQUxfSFJUSU1fVElNRVJfR0VUX0lUU1RBVFVTKGhocnRpbSwgVGltZXJJZHgsIEhSVElNX1RJTV9JVF9TRVQyKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBfX0hBTF9IUlRJTV9USU1FUl9DTEVBUl9JVChoaHJ0aW0sIFRpbWVySWR4LCBIUlRJTV9USU1fSVRfU0VUMik7CisgICAgICAKKyAgICAgIC8qIEludm9rZSBvdXRwdXQgMiBzZXQgZXZlbnQgY2FsbGJhY2sgKi8KKyAgICAgIEhBTF9IUlRJTV9PdXRwdXQyU2V0Q2FsbGJhY2soaGhydGltLCBUaW1lcklkeCk7ICAKKyAgICB9CisgIH0KKyAgCisgIC8qIFRpbWVyIG91dHB1dCAyIHJlc2V0IGV2ZW50ICovCisgIGlmKF9fSEFMX0hSVElNX1RJTUVSX0dFVF9GTEFHKGhocnRpbSwgVGltZXJJZHgsIEhSVElNX1RJTV9GTEFHX1JTVDIpICE9IFJFU0VUKQorICB7CisgICAgaWYoX19IQUxfSFJUSU1fVElNRVJfR0VUX0lUU1RBVFVTKGhocnRpbSwgVGltZXJJZHgsIEhSVElNX1RJTV9JVF9SU1QyKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBfX0hBTF9IUlRJTV9USU1FUl9DTEVBUl9JVChoaHJ0aW0sIFRpbWVySWR4LCBIUlRJTV9USU1fSVRfUlNUMik7CisgICAgICAKKyAgICAgIC8qIEludm9rZSBvdXRwdXQgMiByZXNldCBldmVudCBjYWxsYmFjayAqLworICAgICAgSEFMX0hSVElNX091dHB1dDJSZXNldENhbGxiYWNrKGhocnRpbSwgVGltZXJJZHgpOyAgCisgICAgfQorICB9CisgIAorICAvKiBUaW1lciByZXNldCBldmVudCAqLworICBpZihfX0hBTF9IUlRJTV9USU1FUl9HRVRfRkxBRyhoaHJ0aW0sIFRpbWVySWR4LCBIUlRJTV9USU1fRkxBR19SU1QpICE9IFJFU0VUKQorICB7CisgICAgaWYoX19IQUxfSFJUSU1fVElNRVJfR0VUX0lUU1RBVFVTKGhocnRpbSwgVGltZXJJZHgsIEhSVElNX1RJTV9JVF9SU1QpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIF9fSEFMX0hSVElNX1RJTUVSX0NMRUFSX0lUKGhocnRpbSwgVGltZXJJZHgsIEhSVElNX1RJTV9JVF9SU1QpOworICAgICAgCisgICAgICAvKiBJbnZva2UgdGltZXIgcmVzZXQgY2FsbGJhY2sgKi8KKyAgICAgIEhBTF9IUlRJTV9Db3VudGVyUmVzZXRDYWxsYmFjayhoaHJ0aW0sIFRpbWVySWR4KTsgIAorICAgIH0KKyAgfQorICAKKyAgLyogRGVsYXllZCBwcm90ZWN0aW9uIGV2ZW50ICovICAKKyAgaWYoX19IQUxfSFJUSU1fVElNRVJfR0VUX0ZMQUcoaGhydGltLCBUaW1lcklkeCwgSFJUSU1fVElNX0ZMQUdfRExZUFJUKSAhPSBSRVNFVCkKKyAgeworICAgIGlmKF9fSEFMX0hSVElNX1RJTUVSX0dFVF9JVFNUQVRVUyhoaHJ0aW0sIFRpbWVySWR4LCBIUlRJTV9USU1fSVRfRExZUFJUKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBfX0hBTF9IUlRJTV9USU1FUl9DTEVBUl9JVChoaHJ0aW0sIFRpbWVySWR4LCBIUlRJTV9USU1fSVRfRExZUFJUKTsKKyAgICAgIAorICAgICAgLyogSW52b2tlIGRlbGF5ZWQgcHJvdGVjdGlvbiBjYWxsYmFjayAqLworICAgICAgSEFMX0hSVElNX0RlbGF5ZWRQcm90ZWN0aW9uQ2FsbGJhY2soaGhydGltLCBUaW1lcklkeCk7ICAKKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBETUEgY2FsbGJhY2sgaW52b2tlZCB1cG9uIG1hc3RlciB0aW1lciByZWxhdGVkIERNQSByZXF1ZXN0IGNvbXBsZXRpb24KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSFJUSU1fRE1BTWFzdGVyQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhydGltID0gKEhSVElNX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmKiApaGRtYSktPlBhcmVudDsKKyAgCisgIGlmICgoaHJ0aW0tPkluc3RhbmNlLT5zTWFzdGVyUmVncy5NRElFUiAmIEhSVElNX01BU1RFUl9ETUFfTUNNUDEpICE9IFJFU0VUKQorICB7CisgICAgSEFMX0hSVElNX0NvbXBhcmUxRXZlbnRDYWxsYmFjayhocnRpbSwgSFJUSU1fVElNRVJJTkRFWF9NQVNURVIpOworICB9CisgIGVsc2UgaWYgKChocnRpbS0+SW5zdGFuY2UtPnNNYXN0ZXJSZWdzLk1ESUVSICYgSFJUSU1fTUFTVEVSX0RNQV9NQ01QMikgIT0gUkVTRVQpCisgIHsKKyAgICBIQUxfSFJUSU1fQ29tcGFyZTJFdmVudENhbGxiYWNrKGhydGltLCBIUlRJTV9USU1FUklOREVYX01BU1RFUik7CisgIH0KKyAgZWxzZSBpZiAoKGhydGltLT5JbnN0YW5jZS0+c01hc3RlclJlZ3MuTURJRVIgJiBIUlRJTV9NQVNURVJfRE1BX01DTVAzKSAhPSBSRVNFVCkKKyAgeworICAgIEhBTF9IUlRJTV9Db21wYXJlM0V2ZW50Q2FsbGJhY2soaHJ0aW0sIEhSVElNX1RJTUVSSU5ERVhfTUFTVEVSKTsKKyAgfQorICBlbHNlIGlmICgoaHJ0aW0tPkluc3RhbmNlLT5zTWFzdGVyUmVncy5NRElFUiAmIEhSVElNX01BU1RFUl9ETUFfTUNNUDQpICE9IFJFU0VUKQorICB7CisgICAgSEFMX0hSVElNX0NvbXBhcmU0RXZlbnRDYWxsYmFjayhocnRpbSwgSFJUSU1fVElNRVJJTkRFWF9NQVNURVIpOworICB9CisgIGVsc2UgaWYgKChocnRpbS0+SW5zdGFuY2UtPnNNYXN0ZXJSZWdzLk1ESUVSICYgSFJUSU1fTUFTVEVSX0RNQV9NUkVQKSAhPSBSRVNFVCkKKyAgeworICAgIEhBTF9IUlRJTV9SZXBldGl0aW9uRXZlbnRDYWxsYmFjayhocnRpbSwgSFJUSU1fVElNRVJJTkRFWF9NQVNURVIpOworICB9CisgIGVsc2UgaWYgKChocnRpbS0+SW5zdGFuY2UtPnNNYXN0ZXJSZWdzLk1ESUVSICYgSFJUSU1fTUFTVEVSX0RNQV9TWU5DKSAhPSBSRVNFVCkKKyAgeworICAgIEhBTF9IUlRJTV9TeW5jaHJvbml6YXRpb25FdmVudENhbGxiYWNrKGhydGltKTsKKyAgfQorICBlbHNlIGlmICgoaHJ0aW0tPkluc3RhbmNlLT5zTWFzdGVyUmVncy5NRElFUiAmIEhSVElNX01BU1RFUl9ETUFfTVVQRCkgIT0gUkVTRVQpCisgIHsKKyAgICBIQUxfSFJUSU1fUmVnaXN0ZXJzVXBkYXRlQ2FsbGJhY2soaHJ0aW0sIEhSVElNX1RJTUVSSU5ERVhfTUFTVEVSKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBjYWxsYmFjayBpbnZva2VkIHVwb24gdGltZXIgQS4uRSByZWxhdGVkIERNQSByZXF1ZXN0IGNvbXBsZXRpb24KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSFJUSU1fRE1BVGltZXJ4Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgdWludDhfdCB0aW1lcl9pZHg7CisKKyAgSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhydGltID0gKEhSVElNX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmKiApaGRtYSktPlBhcmVudDsKKyAgCisgIHRpbWVyX2lkeCA9IEdldFRpbWVySWR4RnJvbURNQUhhbmRsZShocnRpbSwgaGRtYSk7CisKKyAgaWYgKCAhSVNfSFJUSU1fVElNRVJJTkRFWCh0aW1lcl9pZHgpICkgcmV0dXJuOworCisgIAorICBpZiAoKGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbdGltZXJfaWR4XS5USU14RElFUiAmIEhSVElNX1RJTV9ETUFfQ01QMSkgIT0gUkVTRVQpCisgIHsKKyAgICBIQUxfSFJUSU1fQ29tcGFyZTFFdmVudENhbGxiYWNrKGhydGltLCB0aW1lcl9pZHgpOworICB9CisgIGVsc2UgaWYgKChocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW3RpbWVyX2lkeF0uVElNeERJRVIgJiBIUlRJTV9USU1fRE1BX0NNUDIpICE9IFJFU0VUKQorICB7CisgICAgSEFMX0hSVElNX0NvbXBhcmUyRXZlbnRDYWxsYmFjayhocnRpbSwgdGltZXJfaWR4KTsKKyAgfQorICBlbHNlIGlmICgoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1t0aW1lcl9pZHhdLlRJTXhESUVSICYgSFJUSU1fVElNX0RNQV9DTVAzKSAhPSBSRVNFVCkKKyAgeworICAgIEhBTF9IUlRJTV9Db21wYXJlM0V2ZW50Q2FsbGJhY2soaHJ0aW0sIHRpbWVyX2lkeCk7CisgIH0KKyAgZWxzZSBpZiAoKGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbdGltZXJfaWR4XS5USU14RElFUiAmIEhSVElNX1RJTV9ETUFfQ01QNCkgIT0gUkVTRVQpCisgIHsKKyAgICBIQUxfSFJUSU1fQ29tcGFyZTRFdmVudENhbGxiYWNrKGhydGltLCB0aW1lcl9pZHgpOworICB9CisgIGVsc2UgaWYgKChocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW3RpbWVyX2lkeF0uVElNeERJRVIgJiBIUlRJTV9USU1fRE1BX1JFUCkgIT0gUkVTRVQpCisgIHsKKyAgICBIQUxfSFJUSU1fUmVwZXRpdGlvbkV2ZW50Q2FsbGJhY2soaHJ0aW0sIHRpbWVyX2lkeCk7CisgIH0KKyAgZWxzZSBpZiAoKGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbdGltZXJfaWR4XS5USU14RElFUiAmIEhSVElNX1RJTV9ETUFfVVBEKSAhPSBSRVNFVCkKKyAgeworICAgIEhBTF9IUlRJTV9SZWdpc3RlcnNVcGRhdGVDYWxsYmFjayhocnRpbSwgdGltZXJfaWR4KTsKKyAgfQorICBlbHNlIGlmICgoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1t0aW1lcl9pZHhdLlRJTXhESUVSICYgSFJUSU1fVElNX0RNQV9DUFQxKSAhPSBSRVNFVCkKKyAgeworICAgIEhBTF9IUlRJTV9DYXB0dXJlMUV2ZW50Q2FsbGJhY2soaHJ0aW0sIHRpbWVyX2lkeCk7CisgIH0KKyAgZWxzZSBpZiAoKGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbdGltZXJfaWR4XS5USU14RElFUiAmIEhSVElNX1RJTV9ETUFfQ1BUMikgIT0gUkVTRVQpCisgIHsKKyAgICBIQUxfSFJUSU1fQ2FwdHVyZTJFdmVudENhbGxiYWNrKGhydGltLCB0aW1lcl9pZHgpOworICB9CisgIGVsc2UgaWYgKChocnRpbS0+SW5zdGFuY2UtPnNUaW1lcnhSZWdzW3RpbWVyX2lkeF0uVElNeERJRVIgJiBIUlRJTV9USU1fRE1BX1NFVDEpICE9IFJFU0VUKQorICB7CisgICAgSEFMX0hSVElNX091dHB1dDFTZXRDYWxsYmFjayhocnRpbSwgdGltZXJfaWR4KTsKKyAgfQorICBlbHNlIGlmICgoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1t0aW1lcl9pZHhdLlRJTXhESUVSICYgSFJUSU1fVElNX0RNQV9SU1QxKSAhPSBSRVNFVCkKKyAgeworICAgIEhBTF9IUlRJTV9PdXRwdXQxUmVzZXRDYWxsYmFjayhocnRpbSwgdGltZXJfaWR4KTsKKyAgfQorICBlbHNlIGlmICgoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1t0aW1lcl9pZHhdLlRJTXhESUVSICYgSFJUSU1fVElNX0RNQV9TRVQyKSAhPSBSRVNFVCkKKyAgeworICAgIEhBTF9IUlRJTV9PdXRwdXQyU2V0Q2FsbGJhY2soaHJ0aW0sIHRpbWVyX2lkeCk7CisgIH0KKyAgZWxzZSBpZiAoKGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbdGltZXJfaWR4XS5USU14RElFUiAmIEhSVElNX1RJTV9ETUFfUlNUMikgIT0gUkVTRVQpCisgIHsKKyAgICBIQUxfSFJUSU1fT3V0cHV0MlJlc2V0Q2FsbGJhY2soaHJ0aW0sIHRpbWVyX2lkeCk7CisgIH0KKyAgZWxzZSBpZiAoKGhydGltLT5JbnN0YW5jZS0+c1RpbWVyeFJlZ3NbdGltZXJfaWR4XS5USU14RElFUiAmIEhSVElNX1RJTV9ETUFfUlNUKSAhPSBSRVNFVCkKKyAgeworICAgIEhBTF9IUlRJTV9Db3VudGVyUmVzZXRDYWxsYmFjayhocnRpbSwgdGltZXJfaWR4KTsKKyAgfQorICBlbHNlIGlmICgoaHJ0aW0tPkluc3RhbmNlLT5zVGltZXJ4UmVnc1t0aW1lcl9pZHhdLlRJTXhESUVSICYgSFJUSU1fVElNX0RNQV9ETFlQUlQpICE9IFJFU0VUKQorICB7CisgICAgSEFMX0hSVElNX0RlbGF5ZWRQcm90ZWN0aW9uQ2FsbGJhY2soaHJ0aW0sIHRpbWVyX2lkeCk7CisgIH0KK30KKworLyoqCisqIEBicmllZiAgRE1BIGVycm9yIGNhbGxiYWNrIAorKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorKiBAcmV0dmFsIE5vbmUKKyovCitzdGF0aWMgdm9pZCBIUlRJTV9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhydGltID0gKEhSVElNX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmKiApaGRtYSktPlBhcmVudDsKKyAgCisgIEhBTF9IUlRJTV9FcnJvckNhbGxiYWNrKGhydGltKTsKK30KKworLyoqCisgICogQGJyaWVmICBETUEgY2FsbGJhY2sgaW52b2tlZCB1cG9uIGJ1cnN0IERNQSB0cmFuc2ZlciBjb21wbGV0aW9uCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEhSVElNX0J1cnN0RE1BQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgSFJUSU1fSGFuZGxlVHlwZURlZiAqIGhydGltID0gKEhSVElNX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmKiApaGRtYSktPlBhcmVudDsKKyAgCisgIEhBTF9IUlRJTV9CdXJzdERNQVRyYW5zZmVyQ2FsbGJhY2soaHJ0aW0sIEdldFRpbWVySWR4RnJvbURNQUhhbmRsZShocnRpbSwgaGRtYSkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSFJUSU0xICovCisKKyNlbmRpZiAvKiBIQUxfSFJUSU1fTU9EVUxFX0VOQUJMRUQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmYzeHhfaGFsX2kyYy5jIGIvU3JjL3N0bTMyZjN4eF9oYWxfaTJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI4YjNmMwotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfaGFsX2kyYy5jCkBAIC0wLDAgKzEsNDg3NCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfaTJjLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEkyQyBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBJbnRlciBJbnRlZ3JhdGVkIENpcmN1aXQgKEkyQykgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGUgSTJDIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKKworICAgICgjKSBEZWNsYXJlIGEgSTJDX0hhbmRsZVR5cGVEZWYgaGFuZGxlIHN0cnVjdHVyZSwgZm9yIGV4YW1wbGU6CisgICAgICAgIEkyQ19IYW5kbGVUeXBlRGVmICBoaTJjOworCisgICAgKCMpSW5pdGlhbGl6ZSB0aGUgSTJDIGxvdyBsZXZlbCByZXNvdXJjZXMgYnkgaW1wbGVtZW50aW5nIHRoZSBIQUxfSTJDX01zcEluaXQoKSBBUEk6CisgICAgICAgICgjIykgRW5hYmxlIHRoZSBJMkN4IGludGVyZmFjZSBjbG9jaworICAgICAgICAoIyMpIEkyQyBwaW5zIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBJMkMgR1BJT3MKKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSBJMkMgcGlucyBhcyBhbHRlcm5hdGUgZnVuY3Rpb24gb3Blbi1kcmFpbgorICAgICAgICAoIyMpIE5WSUMgY29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgaW50ZXJydXB0IHByb2Nlc3MKKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgSTJDeCBpbnRlcnJ1cHQgcHJpb3JpdHkKKyAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgTlZJQyBJMkMgSVJRIENoYW5uZWwKKyAgICAgICAgKCMjKSBETUEgQ29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgRE1BIHByb2Nlc3MKKyAgICAgICAgICAgICgrKyspIERlY2xhcmUgYSBETUFfSGFuZGxlVHlwZURlZiBoYW5kbGUgc3RydWN0dXJlIGZvciB0aGUgdHJhbnNtaXQgb3IgcmVjZWl2ZSBjaGFubmVsCisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIERNQXggaW50ZXJmYWNlIGNsb2NrIHVzaW5nCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIERNQSBoYW5kbGUgcGFyYW1ldGVycworICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBETUEgVHggb3IgUnggY2hhbm5lbAorICAgICAgICAgICAgKCsrKykgQXNzb2NpYXRlIHRoZSBpbml0aWFsaXplZCBETUEgaGFuZGxlIHRvIHRoZSBoaTJjIERNQSBUeCBvciBSeCBoYW5kbGUKKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgcHJpb3JpdHkgYW5kIGVuYWJsZSB0aGUgTlZJQyBmb3IgdGhlIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBvbgorICAgICAgICAgICAgICAgICAgdGhlIERNQSBUeCBvciBSeCBjaGFubmVsCisKKyAgICAoIykgQ29uZmlndXJlIHRoZSBDb21tdW5pY2F0aW9uIENsb2NrIFRpbWluZywgT3duIEFkZHJlc3MxLCBNYXN0ZXIgQWRkcmVzc2luZyBtb2RlLCBEdWFsIEFkZHJlc3NpbmcgbW9kZSwKKyAgICAgICAgT3duIEFkZHJlc3MyLCBPd24gQWRkcmVzczIgTWFzaywgR2VuZXJhbCBjYWxsIGFuZCBOb3N0cmV0Y2ggbW9kZSBpbiB0aGUgaGkyYyBJbml0IHN0cnVjdHVyZS4KKworICAgICgjKSBJbml0aWFsaXplIHRoZSBJMkMgcmVnaXN0ZXJzIGJ5IGNhbGxpbmcgdGhlIEhBTF9JMkNfSW5pdCgpLCBjb25maWd1cmVzIGFsc28gdGhlIGxvdyBsZXZlbCBIYXJkd2FyZQorICAgICAgICAoR1BJTywgQ0xPQ0ssIE5WSUMuLi5ldGMpIGJ5IGNhbGxpbmcgdGhlIGN1c3RvbWl6ZWQgSEFMX0kyQ19Nc3BJbml0KCZoaTJjKSBBUEkuCisKKyAgICAoIykgVG8gY2hlY2sgaWYgdGFyZ2V0IGRldmljZSBpcyByZWFkeSBmb3IgY29tbXVuaWNhdGlvbiwgdXNlIHRoZSBmdW5jdGlvbiBIQUxfSTJDX0lzRGV2aWNlUmVhZHkoKQorCisgICAgKCMpIEZvciBJMkMgSU8gYW5kIElPIE1FTSBvcGVyYXRpb25zLCB0aHJlZSBvcGVyYXRpb24gbW9kZXMgYXJlIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBkcml2ZXIgOgorCisgICAgKioqIFBvbGxpbmcgbW9kZSBJTyBvcGVyYXRpb24gKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgKCspIFRyYW5zbWl0IGluIG1hc3RlciBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX0kyQ19NYXN0ZXJfVHJhbnNtaXQoKQorICAgICAgKCspIFJlY2VpdmUgaW4gbWFzdGVyIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfSTJDX01hc3Rlcl9SZWNlaXZlKCkKKyAgICAgICgrKSBUcmFuc21pdCBpbiBzbGF2ZSBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX0kyQ19TbGF2ZV9UcmFuc21pdCgpCisgICAgICAoKykgUmVjZWl2ZSBpbiBzbGF2ZSBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX0kyQ19TbGF2ZV9SZWNlaXZlKCkKKworICAgICoqKiBQb2xsaW5nIG1vZGUgSU8gTUVNIG9wZXJhdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgKCspIFdyaXRlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUgdG8gYSBzcGVjaWZpYyBtZW1vcnkgYWRkcmVzcyB1c2luZyBIQUxfSTJDX01lbV9Xcml0ZSgpCisgICAgICAoKykgUmVhZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlIGZyb20gYSBzcGVjaWZpYyBtZW1vcnkgYWRkcmVzcyB1c2luZyBIQUxfSTJDX01lbV9SZWFkKCkKKworCisgICAgKioqIEludGVycnVwdCBtb2RlIElPIG9wZXJhdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgrKSBUcmFuc21pdCBpbiBtYXN0ZXIgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfSTJDX01hc3Rlcl9UcmFuc21pdF9JVCgpCisgICAgICAoKykgQXQgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2ZlciwgSEFMX0kyQ19NYXN0ZXJUeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSTJDX01hc3RlclR4Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKSBSZWNlaXZlIGluIG1hc3RlciBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHVzaW5nIEhBTF9JMkNfTWFzdGVyX1JlY2VpdmVfSVQoKQorICAgICAgKCspIEF0IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIsIEhBTF9JMkNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyQ19NYXN0ZXJSeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgVHJhbnNtaXQgaW4gc2xhdmUgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfSTJDX1NsYXZlX1RyYW5zbWl0X0lUKCkKKyAgICAgICgrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyLCBIQUxfSTJDX1NsYXZlVHhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyQ19TbGF2ZVR4Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKSBSZWNlaXZlIGluIHNsYXZlIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX0kyQ19TbGF2ZV9SZWNlaXZlX0lUKCkKKyAgICAgICgrKSBBdCByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyLCBIQUxfSTJDX1NsYXZlUnhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyQ19TbGF2ZVJ4Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKSBJbiBjYXNlIG9mIHRyYW5zZmVyIEVycm9yLCBIQUxfSTJDX0Vycm9yQ2FsbGJhY2soKSBmdW5jdGlvbiBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyQ19FcnJvckNhbGxiYWNrKCkKKyAgICAgICgrKSBBYm9ydCBhIG1hc3RlciBJMkMgcHJvY2VzcyBjb21tdW5pY2F0aW9uIHdpdGggSW50ZXJydXB0IHVzaW5nIEhBTF9JMkNfTWFzdGVyX0Fib3J0X0lUKCkKKyAgICAgICgrKSBFbmQgb2YgYWJvcnQgcHJvY2VzcywgSEFMX0kyQ19BYm9ydENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSTJDX0Fib3J0Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKSBEaXNjYXJkIGEgc2xhdmUgSTJDIHByb2Nlc3MgY29tbXVuaWNhdGlvbiB1c2luZyBfX0hBTF9JMkNfR0VORVJBVEVfTkFDSygpIG1hY3JvLgorICAgICAgICAgICBUaGlzIGFjdGlvbiB3aWxsIGluZm9ybSBNYXN0ZXIgdG8gZ2VuZXJhdGUgYSBTdG9wIGNvbmRpdGlvbiB0byBkaXNjYXJkIHRoZSBjb21tdW5pY2F0aW9uLgorCisKKyAgICAqKiogSW50ZXJydXB0IG1vZGUgSU8gc2VxdWVudGlhbCBvcGVyYXRpb24gKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgIChAKSBUaGVzZSBpbnRlcmZhY2VzIGFsbG93IHRvIG1hbmFnZSBhIHNlcXVlbnRpYWwgdHJhbnNmZXIgd2l0aCBhIHJlcGVhdGVkIHN0YXJ0IGNvbmRpdGlvbgorICAgICAgICAgIHdoZW4gYSBkaXJlY3Rpb24gY2hhbmdlIGR1cmluZyB0cmFuc2ZlcgorICAgIFsuLl0KKyAgICAgICgrKSBBIHNwZWNpZmljIG9wdGlvbiBmaWVsZCBtYW5hZ2UgdGhlIGRpZmZlcmVudCBzdGVwcyBvZiBhIHNlcXVlbnRpYWwgdHJhbnNmZXIKKyAgICAgICgrKSBPcHRpb24gZmllbGQgdmFsdWVzIGFyZSBkZWZpbmVkIHRocm91Z2ggQHJlZiBJMkNfWEZFUk9QVElPTlMgYW5kIGFyZSBsaXN0ZWQgYmVsb3c6CisgICAgICAoKyspIEkyQ19GSVJTVF9BTkRfTEFTVF9GUkFNRTogTm8gc2VxdWVudGlhbCB1c2FnZSwgZnVuY3Rpb25uYWwgaXMgc2FtZSBhcyBhc3NvY2lhdGVkIGludGVyZmFjZXMgaW4gbm8gc2VxdWVudGlhbCBtb2RlCisgICAgICAoKyspIEkyQ19GSVJTVF9GUkFNRTogU2VxdWVudGlhbCB1c2FnZSwgdGhpcyBvcHRpb24gYWxsb3cgdG8gbWFuYWdlIGEgc2VxdWVuY2Ugd2l0aCBzdGFydCBjb25kaXRpb24sIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZGF0YSB0byB0cmFuc2ZlciB3aXRob3V0IGEgZmluYWwgc3RvcCBjb25kaXRpb24KKyAgICAgICgrKykgSTJDX0ZJUlNUX0FORF9ORVhUX0ZSQU1FOiBTZXF1ZW50aWFsIHVzYWdlIChNYXN0ZXIgb25seSksIHRoaXMgb3B0aW9uIGFsbG93IHRvIG1hbmFnZSBhIHNlcXVlbmNlIHdpdGggc3RhcnQgY29uZGl0aW9uLCBhZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGRhdGEgdG8gdHJhbnNmZXIgd2l0aG91dCBhIGZpbmFsIHN0b3AgY29uZGl0aW9uLCBhbiB0aGVuIHBlcm1pdCBhIGNhbGwgdGhlIHNhbWUgbWFzdGVyIHNlcXVlbnRpYWwgaW50ZXJmYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V2ZXJhbCB0aW1lcyAobGlrZSBIQUxfSTJDX01hc3Rlcl9TZXF1ZW50aWFsX1RyYW5zbWl0X0lUKCkgdGhlbiBIQUxfSTJDX01hc3Rlcl9TZXF1ZW50aWFsX1RyYW5zbWl0X0lUKCkpCisgICAgICAoKyspIEkyQ19ORVhUX0ZSQU1FOiBTZXF1ZW50aWFsIHVzYWdlLCB0aGlzIG9wdGlvbiBhbGxvdyB0byBtYW5hZ2UgYSBzZXF1ZW5jZSB3aXRoIGEgcmVzdGFydCBjb25kaXRpb24sIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgd2l0aCBuZXcgZGF0YSB0byB0cmFuc2ZlciBpZiB0aGUgZGlyZWN0aW9uIGNoYW5nZSBvciBtYW5hZ2Ugb25seSB0aGUgbmV3IGRhdGEgdG8gdHJhbnNmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBubyBkaXJlY3Rpb24gY2hhbmdlIGFuZCB3aXRob3V0IGEgZmluYWwgc3RvcCBjb25kaXRpb24gaW4gYm90aCBjYXNlcworICAgICAgKCsrKSBJMkNfTEFTVF9GUkFNRTogU2VxdWVudGlhbCB1c2FnZSwgdGhpcyBvcHRpb24gYWxsb3cgdG8gbWFuYWdlIGEgc2VxdWFuY2Ugd2l0aCBhIHJlc3RhcnQgY29uZGl0aW9uLCBhZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHdpdGggbmV3IGRhdGEgdG8gdHJhbnNmZXIgaWYgdGhlIGRpcmVjdGlvbiBjaGFuZ2Ugb3IgbWFuYWdlIG9ubHkgdGhlIG5ldyBkYXRhIHRvIHRyYW5zZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm8gZGlyZWN0aW9uIGNoYW5nZSBhbmQgd2l0aCBhIGZpbmFsIHN0b3AgY29uZGl0aW9uIGluIGJvdGggY2FzZXMKKyAgICAgICgrKykgSTJDX0xBU1RfRlJBTUVfTk9fU1RPUDogU2VxdWVudGlhbCB1c2FnZSAoTWFzdGVyIG9ubHkpLCB0aGlzIG9wdGlvbiBhbGxvdyB0byBtYW5hZ2UgYSByZXN0YXJ0IGNvbmRpdGlvbiBhZnRlciBzZXZlcmFsIGNhbGwgb2YgdGhlIHNhbWUgbWFzdGVyIHNlcXVlbnRpYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Ugc2V2ZXJhbCB0aW1lcyAobGluayB3aXRoIG9wdGlvbiBJMkNfRklSU1RfQU5EX05FWFRfRlJBTUUpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzYWdlIGNhbiwgdHJhbnNmZXIgc2V2ZXJhbCBieXRlcyBvbmUgYnkgb25lIHVzaW5nIEhBTF9JMkNfTWFzdGVyX1NlcXVlbnRpYWxfVHJhbnNtaXRfSVQob3B0aW9uIEkyQ19GSVJTVF9BTkRfTkVYVF9GUkFNRSB0aGVuIEkyQ19ORVhUX0ZSQU1FKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgSEFMX0kyQ19NYXN0ZXJfU2VxdWVudGlhbF9SZWNlaXZlX0lUKG9wdGlvbiBJMkNfRklSU1RfQU5EX05FWFRfRlJBTUUgdGhlbiBJMkNfTkVYVF9GUkFNRSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlbiB1c2FnZSBvZiB0aGlzIG9wdGlvbiBJMkNfTEFTVF9GUkFNRV9OT19TVE9QIGF0IHRoZSBsYXN0IFRyYW5zbWl0IG9yIFJlY2VpdmUgc2VxdWVuY2UgcGVybWl0IHRvIGNhbGwgdGhlIG9wb3NpdGUgaW50ZXJmYWNlIFJlY2VpdmUgb3IgVHJhbnNtaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgc3RvcHBpbmcgdGhlIGNvbW11bmljYXRpb24gYW5kIHNvIGdlbmVyYXRlIGEgcmVzdGFydCBjb25kaXRpb24uCisKKyAgICAgICgrKSBEaWZmZXJlbnRzIHNlcXVlbnRpYWwgSTJDIGludGVyZmFjZXMgYXJlIGxpc3RlZCBiZWxvdzoKKyAgICAgICgrKykgU2VxdWVudGlhbCB0cmFuc21pdCBpbiBtYXN0ZXIgSTJDIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX0kyQ19NYXN0ZXJfU2VxdWVudGlhbF9UcmFuc21pdF9JVCgpCisgICAgICAoKysrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIGN1cnJlbnQgZnJhbWUgdHJhbnNmZXIsIEhBTF9JMkNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyQ19NYXN0ZXJUeENwbHRDYWxsYmFjaygpCisgICAgICAoKyspIFNlcXVlbnRpYWwgcmVjZWl2ZSBpbiBtYXN0ZXIgSTJDIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX0kyQ19NYXN0ZXJfU2VxdWVudGlhbF9SZWNlaXZlX0lUKCkKKyAgICAgICgrKyspIEF0IHJlY2VwdGlvbiBlbmQgb2YgY3VycmVudCBmcmFtZSB0cmFuc2ZlciwgSEFMX0kyQ19NYXN0ZXJSeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSTJDX01hc3RlclJ4Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKykgQWJvcnQgYSBtYXN0ZXIgSTJDIHByb2Nlc3MgY29tbXVuaWNhdGlvbiB3aXRoIEludGVycnVwdCB1c2luZyBIQUxfSTJDX01hc3Rlcl9BYm9ydF9JVCgpCisgICAgICAoKysrKSBFbmQgb2YgYWJvcnQgcHJvY2VzcywgSEFMX0kyQ19BYm9ydENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSTJDX0Fib3J0Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKykgRW5hYmxlL2Rpc2FibGUgdGhlIEFkZHJlc3MgbGlzdGVuIG1vZGUgaW4gc2xhdmUgSTJDIG1vZGUgdXNpbmcgSEFMX0kyQ19FbmFibGVMaXN0ZW5fSVQoKSBIQUxfSTJDX0Rpc2FibGVMaXN0ZW5fSVQoKQorICAgICAgKCsrKykgV2hlbiBhZGRyZXNzIHNsYXZlIEkyQyBtYXRjaCwgSEFMX0kyQ19BZGRyQ2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSB0byBjaGVjayB0aGUgQWRkcmVzcyBNYXRjaCBDb2RlIGFuZCB0aGUgdHJhbnNtaXNzaW9uIGRpcmVjdGlvbiByZXF1ZXN0IGJ5IG1hc3RlciAoV3JpdGUvUmVhZCkuCisgICAgICAoKysrKSBBdCBMaXN0ZW4gbW9kZSBlbmQgSEFMX0kyQ19MaXN0ZW5DcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyQ19MaXN0ZW5DcGx0Q2FsbGJhY2soKQorICAgICAgKCsrKSBTZXF1ZW50aWFsIHRyYW5zbWl0IGluIHNsYXZlIEkyQyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHVzaW5nIEhBTF9JMkNfU2xhdmVfU2VxdWVudGlhbF9UcmFuc21pdF9JVCgpCisgICAgICAoKysrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIGN1cnJlbnQgZnJhbWUgdHJhbnNmZXIsIEhBTF9JMkNfU2xhdmVUeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSTJDX1NsYXZlVHhDcGx0Q2FsbGJhY2soKQorICAgICAgKCsrKSBTZXF1ZW50aWFsIHJlY2VpdmUgaW4gc2xhdmUgSTJDIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX0kyQ19TbGF2ZV9TZXF1ZW50aWFsX1JlY2VpdmVfSVQoKQorICAgICAgKCsrKykgQXQgcmVjZXB0aW9uIGVuZCBvZiBjdXJyZW50IGZyYW1lIHRyYW5zZmVyLCBIQUxfSTJDX1NsYXZlUnhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyQ19TbGF2ZVJ4Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKykgSW4gY2FzZSBvZiB0cmFuc2ZlciBFcnJvciwgSEFMX0kyQ19FcnJvckNhbGxiYWNrKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9JMkNfRXJyb3JDYWxsYmFjaygpCisgICAgICAoKyspIEFib3J0IGEgbWFzdGVyIEkyQyBwcm9jZXNzIGNvbW11bmljYXRpb24gd2l0aCBJbnRlcnJ1cHQgdXNpbmcgSEFMX0kyQ19NYXN0ZXJfQWJvcnRfSVQoKQorICAgICAgKCsrKSBFbmQgb2YgYWJvcnQgcHJvY2VzcywgSEFMX0kyQ19BYm9ydENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSTJDX0Fib3J0Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKykgRGlzY2FyZCBhIHNsYXZlIEkyQyBwcm9jZXNzIGNvbW11bmljYXRpb24gdXNpbmcgX19IQUxfSTJDX0dFTkVSQVRFX05BQ0soKSBtYWNyby4KKyAgICAgICAgICAgVGhpcyBhY3Rpb24gd2lsbCBpbmZvcm0gTWFzdGVyIHRvIGdlbmVyYXRlIGEgU3RvcCBjb25kaXRpb24gdG8gZGlzY2FyZCB0aGUgY29tbXVuaWNhdGlvbi4KKworICAgICoqKiBJbnRlcnJ1cHQgbW9kZSBJTyBNRU0gb3BlcmF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgrKSBXcml0ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdCB0byBhIHNwZWNpZmljIG1lbW9yeSBhZGRyZXNzIHVzaW5nCisgICAgICAgICAgSEFMX0kyQ19NZW1fV3JpdGVfSVQoKQorICAgICAgKCspIEF0IE1lbW9yeSBlbmQgb2Ygd3JpdGUgdHJhbnNmZXIsIEhBTF9JMkNfTWVtVHhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyQ19NZW1UeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgUmVhZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdCBmcm9tIGEgc3BlY2lmaWMgbWVtb3J5IGFkZHJlc3MgdXNpbmcKKyAgICAgICAgICBIQUxfSTJDX01lbV9SZWFkX0lUKCkKKyAgICAgICgrKSBBdCBNZW1vcnkgZW5kIG9mIHJlYWQgdHJhbnNmZXIsIEhBTF9JMkNfTWVtUnhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyQ19NZW1SeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgSW4gY2FzZSBvZiB0cmFuc2ZlciBFcnJvciwgSEFMX0kyQ19FcnJvckNhbGxiYWNrKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9JMkNfRXJyb3JDYWxsYmFjaygpCisKKyAgICAqKiogRE1BIG1vZGUgSU8gb3BlcmF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgrKSBUcmFuc21pdCBpbiBtYXN0ZXIgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSAoRE1BKSB1c2luZworICAgICAgICAgIEhBTF9JMkNfTWFzdGVyX1RyYW5zbWl0X0RNQSgpCisgICAgICAoKykgQXQgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2ZlciwgSEFMX0kyQ19NYXN0ZXJUeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSTJDX01hc3RlclR4Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKSBSZWNlaXZlIGluIG1hc3RlciBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIChETUEpIHVzaW5nCisgICAgICAgICAgSEFMX0kyQ19NYXN0ZXJfUmVjZWl2ZV9ETUEoKQorICAgICAgKCspIEF0IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIsIEhBTF9JMkNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyQ19NYXN0ZXJSeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgVHJhbnNtaXQgaW4gc2xhdmUgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSAoRE1BKSB1c2luZworICAgICAgICAgIEhBTF9JMkNfU2xhdmVfVHJhbnNtaXRfRE1BKCkKKyAgICAgICgrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyLCBIQUxfSTJDX1NsYXZlVHhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyQ19TbGF2ZVR4Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKSBSZWNlaXZlIGluIHNsYXZlIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgKERNQSkgdXNpbmcKKyAgICAgICAgICBIQUxfSTJDX1NsYXZlX1JlY2VpdmVfRE1BKCkKKyAgICAgICgrKSBBdCByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyLCBIQUxfSTJDX1NsYXZlUnhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyQ19TbGF2ZVJ4Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKSBJbiBjYXNlIG9mIHRyYW5zZmVyIEVycm9yLCBIQUxfSTJDX0Vycm9yQ2FsbGJhY2soKSBmdW5jdGlvbiBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyQ19FcnJvckNhbGxiYWNrKCkKKyAgICAgICgrKSBBYm9ydCBhIG1hc3RlciBJMkMgcHJvY2VzcyBjb21tdW5pY2F0aW9uIHdpdGggSW50ZXJydXB0IHVzaW5nIEhBTF9JMkNfTWFzdGVyX0Fib3J0X0lUKCkKKyAgICAgICgrKSBFbmQgb2YgYWJvcnQgcHJvY2VzcywgSEFMX0kyQ19BYm9ydENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSTJDX0Fib3J0Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKSBEaXNjYXJkIGEgc2xhdmUgSTJDIHByb2Nlc3MgY29tbXVuaWNhdGlvbiB1c2luZyBfX0hBTF9JMkNfR0VORVJBVEVfTkFDSygpIG1hY3JvLgorICAgICAgICAgICBUaGlzIGFjdGlvbiB3aWxsIGluZm9ybSBNYXN0ZXIgdG8gZ2VuZXJhdGUgYSBTdG9wIGNvbmRpdGlvbiB0byBkaXNjYXJkIHRoZSBjb21tdW5pY2F0aW9uLgorCisgICAgKioqIERNQSBtb2RlIElPIE1FTSBvcGVyYXRpb24gKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgKCspIFdyaXRlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggRE1BIHRvIGEgc3BlY2lmaWMgbWVtb3J5IGFkZHJlc3MgdXNpbmcKKyAgICAgICAgICBIQUxfSTJDX01lbV9Xcml0ZV9ETUEoKQorICAgICAgKCspIEF0IE1lbW9yeSBlbmQgb2Ygd3JpdGUgdHJhbnNmZXIsIEhBTF9JMkNfTWVtVHhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyQ19NZW1UeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgUmVhZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQSBmcm9tIGEgc3BlY2lmaWMgbWVtb3J5IGFkZHJlc3MgdXNpbmcKKyAgICAgICAgICBIQUxfSTJDX01lbV9SZWFkX0RNQSgpCisgICAgICAoKykgQXQgTWVtb3J5IGVuZCBvZiByZWFkIHRyYW5zZmVyLCBIQUxfSTJDX01lbVJ4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9JMkNfTWVtUnhDcGx0Q2FsbGJhY2soKQorICAgICAgKCspIEluIGNhc2Ugb2YgdHJhbnNmZXIgRXJyb3IsIEhBTF9JMkNfRXJyb3JDYWxsYmFjaygpIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSTJDX0Vycm9yQ2FsbGJhY2soKQorCisKKyAgICAgKioqIEkyQyBIQUwgZHJpdmVyIG1hY3JvcyBsaXN0ICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0KKyAgICAgICBCZWxvdyB0aGUgbGlzdCBvZiBtb3N0IHVzZWQgbWFjcm9zIGluIEkyQyBIQUwgZHJpdmVyLgorCisgICAgICAoKykgX19IQUxfSTJDX0VOQUJMRTogRW5hYmxlIHRoZSBJMkMgcGVyaXBoZXJhbAorICAgICAgKCspIF9fSEFMX0kyQ19ESVNBQkxFOiBEaXNhYmxlIHRoZSBJMkMgcGVyaXBoZXJhbAorICAgICAgKCspIF9fSEFMX0kyQ19HRU5FUkFURV9OQUNLOiBHZW5lcmF0ZSBhIE5vbi1BY2tub3dsZWRnZSBJMkMgcGVyaXBoZXJhbCBpbiBTbGF2ZSBtb2RlCisgICAgICAoKykgX19IQUxfSTJDX0dFVF9GTEFHOiBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgSTJDIGZsYWcgaXMgc2V0IG9yIG5vdAorICAgICAgKCspIF9fSEFMX0kyQ19DTEVBUl9GTEFHOiBDbGVhciB0aGUgc3BlY2lmaWVkIEkyQyBwZW5kaW5nIGZsYWcKKyAgICAgICgrKSBfX0hBTF9JMkNfRU5BQkxFX0lUOiBFbmFibGUgdGhlIHNwZWNpZmllZCBJMkMgaW50ZXJydXB0CisgICAgICAoKykgX19IQUxfSTJDX0RJU0FCTEVfSVQ6IERpc2FibGUgdGhlIHNwZWNpZmllZCBJMkMgaW50ZXJydXB0CisKKyAgICAgWy4uXQorICAgICAgIChAKSBZb3UgY2FuIHJlZmVyIHRvIHRoZSBJMkMgSEFMIGRyaXZlciBoZWFkZXIgZmlsZSBmb3IgbW9yZSB1c2VmdWwgbWFjcm9zCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkMgSTJDCisgICogQGJyaWVmIEkyQyBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfSTJDX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEkyQ19Qcml2YXRlX0RlZmluZSBJMkMgUHJpdmF0ZSBEZWZpbmUKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1JTkdfQ0xFQVJfTUFTSyAgICgweEYwRkZGRkZGVSkgIC8qITwgSTJDIFRJTUlORyBjbGVhciByZWdpc3RlciBNYXNrICovCisjZGVmaW5lIEkyQ19USU1FT1VUX0FERFIgICAgKDEwMDAwVSkgICAgICAgLyohPCAxMCBzICAqLworI2RlZmluZSBJMkNfVElNRU9VVF9CVVNZICAgICgyNVUpICAgICAgICAgIC8qITwgMjUgbXMgKi8KKyNkZWZpbmUgSTJDX1RJTUVPVVRfRElSICAgICAoMjVVKSAgICAgICAgICAvKiE8IDI1IG1zICovCisjZGVmaW5lIEkyQ19USU1FT1VUX1JYTkUgICAgKDI1VSkgICAgICAgICAgLyohPCAyNSBtcyAqLworI2RlZmluZSBJMkNfVElNRU9VVF9TVE9QRiAgICgyNVUpICAgICAgICAgIC8qITwgMjUgbXMgKi8KKyNkZWZpbmUgSTJDX1RJTUVPVVRfVEMgICAgICAoMjVVKSAgICAgICAgICAvKiE8IDI1IG1zICovCisjZGVmaW5lIEkyQ19USU1FT1VUX1RDUiAgICAgKDI1VSkgICAgICAgICAgLyohPCAyNSBtcyAqLworI2RlZmluZSBJMkNfVElNRU9VVF9UWElTICAgICgyNVUpICAgICAgICAgIC8qITwgMjUgbXMgKi8KKyNkZWZpbmUgSTJDX1RJTUVPVVRfRkxBRyAgICAoMjVVKSAgICAgICAgICAvKiE8IDI1IG1zICovCisKKyNkZWZpbmUgTUFYX05CWVRFX1NJWkUgICAgICAyNTVVCisjZGVmaW5lIFNsYXZlQWRkcl9TSElGVCAgICAgN1UKKyNkZWZpbmUgU2xhdmVBZGRyX01TSyAgICAgICAweDA2VQorCisvKiBQcml2YXRlIGRlZmluZSBmb3IgQHJlZiBQcmV2aW91c1N0YXRlIHVzYWdlICovCisjZGVmaW5lIEkyQ19TVEFURV9NU0sgICAgICAgICAgICAgKCh1aW50MzJfdCkoKEhBTF9JMkNfU1RBVEVfQlVTWV9UWCB8IEhBTF9JMkNfU1RBVEVfQlVTWV9SWCkgJiAofigodWludDMyX3QpSEFMX0kyQ19TVEFURV9SRUFEWSkpKSkgLyohPCBNYXNrIFN0YXRlIGRlZmluZSwga2VlcCBvbmx5IFJYIGFuZCBUWCBiaXRzICAgICAgICAgICAgKi8KKyNkZWZpbmUgSTJDX1NUQVRFX05PTkUgICAgICAgICAgICAoKHVpbnQzMl90KShIQUxfSTJDX01PREVfTk9ORSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERlZmF1bHQgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJMkNfU1RBVEVfTUFTVEVSX0JVU1lfVFggICgodWludDMyX3QpKChIQUxfSTJDX1NUQVRFX0JVU1lfVFggJiBJMkNfU1RBVEVfTVNLKSB8IEhBTF9JMkNfTU9ERV9NQVNURVIpKSAgICAgICAgICAgIC8qITwgTWFzdGVyIEJ1c3kgVFgsIGNvbWJpbmFpc29uIG9mIFN0YXRlIExTQiBhbmQgTW9kZSBlbnVtICovCisjZGVmaW5lIEkyQ19TVEFURV9NQVNURVJfQlVTWV9SWCAgKCh1aW50MzJfdCkoKEhBTF9JMkNfU1RBVEVfQlVTWV9SWCAmIEkyQ19TVEFURV9NU0spIHwgSEFMX0kyQ19NT0RFX01BU1RFUikpICAgICAgICAgICAgLyohPCBNYXN0ZXIgQnVzeSBSWCwgY29tYmluYWlzb24gb2YgU3RhdGUgTFNCIGFuZCBNb2RlIGVudW0gKi8KKyNkZWZpbmUgSTJDX1NUQVRFX1NMQVZFX0JVU1lfVFggICAoKHVpbnQzMl90KSgoSEFMX0kyQ19TVEFURV9CVVNZX1RYICYgSTJDX1NUQVRFX01TSykgfCBIQUxfSTJDX01PREVfU0xBVkUpKSAgICAgICAgICAgICAvKiE8IFNsYXZlIEJ1c3kgVFgsIGNvbWJpbmFpc29uIG9mIFN0YXRlIExTQiBhbmQgTW9kZSBlbnVtICAqLworI2RlZmluZSBJMkNfU1RBVEVfU0xBVkVfQlVTWV9SWCAgICgodWludDMyX3QpKChIQUxfSTJDX1NUQVRFX0JVU1lfUlggJiBJMkNfU1RBVEVfTVNLKSB8IEhBTF9JMkNfTU9ERV9TTEFWRSkpICAgICAgICAgICAgIC8qITwgU2xhdmUgQnVzeSBSWCwgY29tYmluYWlzb24gb2YgU3RhdGUgTFNCIGFuZCBNb2RlIGVudW0gICovCisjZGVmaW5lIEkyQ19TVEFURV9NRU1fQlVTWV9UWCAgICAgKCh1aW50MzJfdCkoKEhBTF9JMkNfU1RBVEVfQlVTWV9UWCAmIEkyQ19TVEFURV9NU0spIHwgSEFMX0kyQ19NT0RFX01FTSkpICAgICAgICAgICAgICAgLyohPCBNZW1vcnkgQnVzeSBUWCwgY29tYmluYWlzb24gb2YgU3RhdGUgTFNCIGFuZCBNb2RlIGVudW0gKi8KKyNkZWZpbmUgSTJDX1NUQVRFX01FTV9CVVNZX1JYICAgICAoKHVpbnQzMl90KSgoSEFMX0kyQ19TVEFURV9CVVNZX1JYICYgSTJDX1NUQVRFX01TSykgfCBIQUxfSTJDX01PREVfTUVNKSkgICAgICAgICAgICAgICAvKiE8IE1lbW9yeSBCdXN5IFJYLCBjb21iaW5haXNvbiBvZiBTdGF0ZSBMU0IgYW5kIE1vZGUgZW51bSAqLworCisKKy8qIFByaXZhdGUgZGVmaW5lIHRvIGNlbnRyYWxpemUgdGhlIGVuYWJsZS9kaXNhYmxlIG9mIEludGVycnVwdHMgKi8KKyNkZWZpbmUgSTJDX1hGRVJfVFhfSVQgICAgICAgICAgKDB4MDAwMDAwMDFVKQorI2RlZmluZSBJMkNfWEZFUl9SWF9JVCAgICAgICAgICAoMHgwMDAwMDAwMlUpCisjZGVmaW5lIEkyQ19YRkVSX0xJU1RFTl9JVCAgICAgICgweDAwMDAwMDA0VSkKKworI2RlZmluZSBJMkNfWEZFUl9FUlJPUl9JVCAgICAgICAoMHgwMDAwMDAxMVUpCisjZGVmaW5lIEkyQ19YRkVSX0NQTFRfSVQgICAgICAgICgweDAwMDAwMDEyVSkKKyNkZWZpbmUgSTJDX1hGRVJfUkVMT0FEX0lUICAgICAgKDB4MDAwMDAwMTJVKQorCisvKiBQcml2YXRlIGRlZmluZSBTZXF1ZW50aWFsIFRyYW5zZmVyIE9wdGlvbnMgZGVmYXVsdC9yZXNldCB2YWx1ZSAqLworI2RlZmluZSBJMkNfTk9fT1BUSU9OX0ZSQU1FICAgICAoMHhGRkZGMDAwMFUpCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBJMkNfR0VUX0RNQV9SRU1BSU5fREFUQShfX0hBTkRMRV9fKSAoKCgoX19IQU5ETEVfXyktPlN0YXRlKSA9PSBIQUxfSTJDX1NUQVRFX0JVU1lfVFgpICAgPyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKShfX0hBTkRMRV9fKS0+aGRtYXR4LT5JbnN0YW5jZSktPkNORFRSKSkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKShfX0hBTkRMRV9fKS0+aGRtYXJ4LT5JbnN0YW5jZSktPkNORFRSKSkpCisKKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEkyQ19Qcml2YXRlX0Z1bmN0aW9ucyBJMkMgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogUHJpdmF0ZSBmdW5jdGlvbnMgdG8gaGFuZGxlIERNQSB0cmFuc2ZlciAqLworc3RhdGljIHZvaWQgSTJDX0RNQU1hc3RlclRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBJMkNfRE1BTWFzdGVyUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgSTJDX0RNQVNsYXZlVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIEkyQ19ETUFTbGF2ZVJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIEkyQ19ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBJMkNfRE1BQWJvcnQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyB0byBoYW5kbGUgSVQgdHJhbnNmZXIgKi8KK3N0YXRpYyB2b2lkIEkyQ19JVEFkZHJDcGx0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBJVEZsYWdzKTsKK3N0YXRpYyB2b2lkIEkyQ19JVE1hc3RlclNlcXVlbnRpYWxDcGx0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKK3N0YXRpYyB2b2lkIEkyQ19JVFNsYXZlU2VxdWVudGlhbENwbHQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOworc3RhdGljIHZvaWQgSTJDX0lUTWFzdGVyQ3BsdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncyk7CitzdGF0aWMgdm9pZCBJMkNfSVRTbGF2ZUNwbHQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IElURmxhZ3MpOworc3RhdGljIHZvaWQgSTJDX0lUTGlzdGVuQ3BsdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncyk7CitzdGF0aWMgdm9pZCBJMkNfSVRFcnJvcihJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgRXJyb3JDb2RlKTsKKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgdG8gaGFuZGxlIElUIHRyYW5zZmVyICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX1JlcXVlc3RNZW1vcnlXcml0ZShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDE2X3QgTWVtQWRkcmVzcywgdWludDE2X3QgTWVtQWRkU2l6ZSwgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfUmVxdWVzdE1lbW9yeVJlYWQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZFNpemUsIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IFRpY2tzdGFydCk7CisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIGZvciBJMkMgdHJhbnNmZXIgSVJRIGhhbmRsZXIgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfTWFzdGVyX0lTUl9JVChzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncywgdWludDMyX3QgSVRTb3VyY2VzKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfU2xhdmVfSVNSX0lUKHN0cnVjdCBfX0kyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBJVEZsYWdzLCB1aW50MzJfdCBJVFNvdXJjZXMpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEkyQ19NYXN0ZXJfSVNSX0RNQShzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncywgdWludDMyX3QgSVRTb3VyY2VzKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfU2xhdmVfSVNSX0RNQShzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncywgdWludDMyX3QgSVRTb3VyY2VzKTsKKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgdG8gaGFuZGxlIGZsYWdzIGR1cmluZyBwb2xsaW5nIHRyYW5zZmVyICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdHVzLCB1aW50MzJfdCBUaW1lb3V0LCB1aW50MzJfdCBUaWNrc3RhcnQpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEkyQ19XYWl0T25UWElTRmxhZ1VudGlsVGltZW91dChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfV2FpdE9uUlhORUZsYWdVbnRpbFRpbWVvdXQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IFRpY2tzdGFydCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX1dhaXRPblNUT1BGbGFnVW50aWxUaW1lb3V0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBUaW1lb3V0LCB1aW50MzJfdCBUaWNrc3RhcnQpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEkyQ19Jc0Fja25vd2xlZGdlRmFpbGVkKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBUaW1lb3V0LCB1aW50MzJfdCBUaWNrc3RhcnQpOworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyB0byBjZW50cmFsaXplIHRoZSBlbmFibGUvZGlzYWJsZSBvZiBJbnRlcnJ1cHRzICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX0VuYWJsZV9JUlEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IEludGVycnVwdFJlcXVlc3QpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEkyQ19EaXNhYmxlX0lSUShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgSW50ZXJydXB0UmVxdWVzdCk7CisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIHRvIGZsdXNoIFRYRFIgcmVnaXN0ZXIgKi8KK3N0YXRpYyB2b2lkIEkyQ19GbHVzaF9UWERSKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgdG8gaGFuZGxlICBzdGFydCwgcmVzdGFydCBvciBzdG9wIGEgdHJhbnNmZXIgKi8KK3N0YXRpYyB2b2lkIEkyQ19UcmFuc2ZlckNvbmZpZyhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgU2l6ZSwgdWludDMyX3QgTW9kZSwgdWludDMyX3QgUmVxdWVzdCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEkyQ19FeHBvcnRlZF9GdW5jdGlvbnMgSTJDIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIGFuZAorICAgICAgICAgIGRlaW5pdGlhbGl6ZSB0aGUgSTJDeCBwZXJpcGhlcmFsOgorCisgICAgICAoKykgVXNlciBtdXN0IEltcGxlbWVudCBIQUxfSTJDX01zcEluaXQoKSBmdW5jdGlvbiBpbiB3aGljaCBoZSBjb25maWd1cmVzCisgICAgICAgICAgYWxsIHJlbGF0ZWQgcGVyaXBoZXJhbHMgcmVzb3VyY2VzIChDTE9DSywgR1BJTywgRE1BLCBJVCBhbmQgTlZJQyApLgorCisgICAgICAoKykgQ2FsbCB0aGUgZnVuY3Rpb24gSEFMX0kyQ19Jbml0KCkgdG8gY29uZmlndXJlIHRoZSBzZWxlY3RlZCBkZXZpY2Ugd2l0aAorICAgICAgICAgIHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uOgorICAgICAgICAoKyspIENsb2NrIFRpbWluZworICAgICAgICAoKyspIE93biBBZGRyZXNzIDEKKyAgICAgICAgKCsrKSBBZGRyZXNzaW5nIG1vZGUgKE1hc3RlciwgU2xhdmUpCisgICAgICAgICgrKykgRHVhbCBBZGRyZXNzaW5nIG1vZGUKKyAgICAgICAgKCsrKSBPd24gQWRkcmVzcyAyCisgICAgICAgICgrKykgT3duIEFkZHJlc3MgMiBNYXNrCisgICAgICAgICgrKykgR2VuZXJhbCBjYWxsIG1vZGUKKyAgICAgICAgKCsrKSBOb3N0cmV0Y2ggbW9kZQorCisgICAgICAoKykgQ2FsbCB0aGUgZnVuY3Rpb24gSEFMX0kyQ19EZUluaXQoKSB0byByZXN0b3JlIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICBvZiB0aGUgc2VsZWN0ZWQgSTJDeCBwZXJpcGhlcmFsLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBJMkMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycworICAqICAgICAgICAgaW4gdGhlIEkyQ19Jbml0VHlwZURlZiBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfSW5pdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYykKK3sKKyAgLyogQ2hlY2sgdGhlIEkyQyBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaGkyYyA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX0lOU1RBTkNFKGhpMmMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19JMkNfT1dOX0FERFJFU1MxKGhpMmMtPkluaXQuT3duQWRkcmVzczEpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BRERSRVNTSU5HX01PREUoaGkyYy0+SW5pdC5BZGRyZXNzaW5nTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfSTJDX0RVQUxfQUREUkVTUyhoaTJjLT5Jbml0LkR1YWxBZGRyZXNzTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfSTJDX09XTl9BRERSRVNTMihoaTJjLT5Jbml0Lk93bkFkZHJlc3MyKSk7CisgIGFzc2VydF9wYXJhbShJU19JMkNfT1dOX0FERFJFU1MyX01BU0soaGkyYy0+SW5pdC5Pd25BZGRyZXNzMk1hc2tzKSk7CisgIGFzc2VydF9wYXJhbShJU19JMkNfR0VORVJBTF9DQUxMKGhpMmMtPkluaXQuR2VuZXJhbENhbGxNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19JMkNfTk9fU1RSRVRDSChoaTJjLT5Jbml0Lk5vU3RyZXRjaE1vZGUpKTsKKworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBoaTJjLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIENPUlRFWC4uLmV0YyAqLworICAgIEhBTF9JMkNfTXNwSW5pdChoaTJjKTsKKyAgfQorCisgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIEkyQyBwZXJpcGhlcmFsICovCisgIF9fSEFMX0kyQ19ESVNBQkxFKGhpMmMpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJMkN4IFRJTUlOR1IgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDb25maWd1cmUgSTJDeDogRnJlcXVlbmN5IHJhbmdlICovCisgIGhpMmMtPkluc3RhbmNlLT5USU1JTkdSID0gaGkyYy0+SW5pdC5UaW1pbmcgJiBUSU1JTkdfQ0xFQVJfTUFTSzsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTJDeCBPQVIxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogRGlzYWJsZSBPd24gQWRkcmVzczEgYmVmb3JlIHNldCB0aGUgT3duIEFkZHJlc3MxIGNvbmZpZ3VyYXRpb24gKi8KKyAgaGkyYy0+SW5zdGFuY2UtPk9BUjEgJj0gfkkyQ19PQVIxX09BMUVOOworCisgIC8qIENvbmZpZ3VyZSBJMkN4OiBPd24gQWRkcmVzczEgYW5kIGFjayBvd24gYWRkcmVzczEgbW9kZSAqLworICBpZiAoaGkyYy0+SW5pdC5BZGRyZXNzaW5nTW9kZSA9PSBJMkNfQUREUkVTU0lOR01PREVfN0JJVCkKKyAgeworICAgIGhpMmMtPkluc3RhbmNlLT5PQVIxID0gKEkyQ19PQVIxX09BMUVOIHwgaGkyYy0+SW5pdC5Pd25BZGRyZXNzMSk7CisgIH0KKyAgZWxzZSAvKiBJMkNfQUREUkVTU0lOR01PREVfMTBCSVQgKi8KKyAgeworICAgIGhpMmMtPkluc3RhbmNlLT5PQVIxID0gKEkyQ19PQVIxX09BMUVOIHwgSTJDX09BUjFfT0ExTU9ERSB8IGhpMmMtPkluaXQuT3duQWRkcmVzczEpOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkyQ3ggQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENvbmZpZ3VyZSBJMkN4OiBBZGRyZXNzaW5nIE1hc3RlciBtb2RlICovCisgIGlmIChoaTJjLT5Jbml0LkFkZHJlc3NpbmdNb2RlID09IEkyQ19BRERSRVNTSU5HTU9ERV8xMEJJVCkKKyAgeworICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgPSAoSTJDX0NSMl9BREQxMCk7CisgIH0KKyAgLyogRW5hYmxlIHRoZSBBVVRPRU5EIGJ5IGRlZmF1bHQsIGFuZCBlbmFibGUgTkFDSyAoc2hvdWxkIGJlIGRpc2FibGUgb25seSBkdXJpbmcgU2xhdmUgcHJvY2VzcyAqLworICBoaTJjLT5JbnN0YW5jZS0+Q1IyIHw9IChJMkNfQ1IyX0FVVE9FTkQgfCBJMkNfQ1IyX05BQ0spOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJMkN4IE9BUjIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBEaXNhYmxlIE93biBBZGRyZXNzMiBiZWZvcmUgc2V0IHRoZSBPd24gQWRkcmVzczIgY29uZmlndXJhdGlvbiAqLworICBoaTJjLT5JbnN0YW5jZS0+T0FSMiAmPSB+STJDX0RVQUxBRERSRVNTX0VOQUJMRTsKKworICAvKiBDb25maWd1cmUgSTJDeDogRHVhbCBtb2RlIGFuZCBPd24gQWRkcmVzczIgKi8KKyAgaGkyYy0+SW5zdGFuY2UtPk9BUjIgPSAoaGkyYy0+SW5pdC5EdWFsQWRkcmVzc01vZGUgfCBoaTJjLT5Jbml0Lk93bkFkZHJlc3MyIHwgKGhpMmMtPkluaXQuT3duQWRkcmVzczJNYXNrcyA8PCA4KSk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkyQ3ggQ1IxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENvbmZpZ3VyZSBJMkN4OiBHZW5lcmFsY2FsbCBhbmQgTm9TdHJldGNoIG1vZGUgKi8KKyAgaGkyYy0+SW5zdGFuY2UtPkNSMSA9IChoaTJjLT5Jbml0LkdlbmVyYWxDYWxsTW9kZSB8IGhpMmMtPkluaXQuTm9TdHJldGNoTW9kZSk7CisKKyAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBJMkMgcGVyaXBoZXJhbCAqLworICBfX0hBTF9JMkNfRU5BQkxFKGhpMmMpOworCisgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKyAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICBoaTJjLT5QcmV2aW91c1N0YXRlID0gSTJDX1NUQVRFX05PTkU7CisgIGhpMmMtPk1vZGUgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgSTJDIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfRGVJbml0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBDaGVjayB0aGUgSTJDIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChoaTJjID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfSU5TVEFOQ0UoaGkyYy0+SW5zdGFuY2UpKTsKKworICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBJMkMgUGVyaXBoZXJhbCBDbG9jayAqLworICBfX0hBTF9JMkNfRElTQUJMRShoaTJjKTsKKworICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMgKi8KKyAgSEFMX0kyQ19Nc3BEZUluaXQoaGkyYyk7CisKKyAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9OT05FOworICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVTRVQ7CisgIGhpMmMtPlByZXZpb3VzU3RhdGUgPSBJMkNfU1RBVEVfTk9ORTsKKyAgaGkyYy0+TW9kZSA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIEluaXRpYWxpemUgdGhlIEkyQyBNU1AuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JMkNfTXNwSW5pdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGkyYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9JMkNfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgRGVJbml0aWFsaXplIHRoZSBJMkMgTVNQLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSTJDX01zcERlSW5pdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGkyYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9JMkNfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSW5wdXQgYW5kIE91dHB1dCBvcGVyYXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgRGF0YSB0cmFuc2ZlcnMgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gbWFuYWdlIHRoZSBJMkMgZGF0YQorICAgIHRyYW5zZmVycy4KKworICAgICgjKSBUaGVyZSBhcmUgdHdvIG1vZGVzIG9mIHRyYW5zZmVyOgorICAgICAgICgrKykgQmxvY2tpbmcgbW9kZSA6IFRoZSBjb21tdW5pY2F0aW9uIGlzIHBlcmZvcm1lZCBpbiB0aGUgcG9sbGluZyBtb2RlLgorICAgICAgICAgICAgVGhlIHN0YXR1cyBvZiBhbGwgZGF0YSBwcm9jZXNzaW5nIGlzIHJldHVybmVkIGJ5IHRoZSBzYW1lIGZ1bmN0aW9uCisgICAgICAgICAgICBhZnRlciBmaW5pc2hpbmcgdHJhbnNmZXIuCisgICAgICAgKCsrKSBOby1CbG9ja2luZyBtb2RlIDogVGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nIEludGVycnVwdHMKKyAgICAgICAgICAgIG9yIERNQS4gVGhlc2UgZnVuY3Rpb25zIHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSB0cmFuc2ZlciBzdGFydHVwLgorICAgICAgICAgICAgVGhlIGVuZCBvZiB0aGUgZGF0YSBwcm9jZXNzaW5nIHdpbGwgYmUgaW5kaWNhdGVkIHRocm91Z2ggdGhlCisgICAgICAgICAgICBkZWRpY2F0ZWQgSTJDIElSUSB3aGVuIHVzaW5nIEludGVycnVwdCBtb2RlIG9yIHRoZSBETUEgSVJRIHdoZW4KKyAgICAgICAgICAgIHVzaW5nIERNQSBtb2RlLgorCisgICAgKCMpIEJsb2NraW5nIG1vZGUgZnVuY3Rpb25zIGFyZSA6CisgICAgICAgICgrKykgSEFMX0kyQ19NYXN0ZXJfVHJhbnNtaXQoKQorICAgICAgICAoKyspIEhBTF9JMkNfTWFzdGVyX1JlY2VpdmUoKQorICAgICAgICAoKyspIEhBTF9JMkNfU2xhdmVfVHJhbnNtaXQoKQorICAgICAgICAoKyspIEhBTF9JMkNfU2xhdmVfUmVjZWl2ZSgpCisgICAgICAgICgrKykgSEFMX0kyQ19NZW1fV3JpdGUoKQorICAgICAgICAoKyspIEhBTF9JMkNfTWVtX1JlYWQoKQorICAgICAgICAoKyspIEhBTF9JMkNfSXNEZXZpY2VSZWFkeSgpCisKKyAgICAoIykgTm8tQmxvY2tpbmcgbW9kZSBmdW5jdGlvbnMgd2l0aCBJbnRlcnJ1cHQgYXJlIDoKKyAgICAgICAgKCsrKSBIQUxfSTJDX01hc3Rlcl9UcmFuc21pdF9JVCgpCisgICAgICAgICgrKykgSEFMX0kyQ19NYXN0ZXJfUmVjZWl2ZV9JVCgpCisgICAgICAgICgrKykgSEFMX0kyQ19TbGF2ZV9UcmFuc21pdF9JVCgpCisgICAgICAgICgrKykgSEFMX0kyQ19TbGF2ZV9SZWNlaXZlX0lUKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX01lbV9Xcml0ZV9JVCgpCisgICAgICAgICgrKykgSEFMX0kyQ19NZW1fUmVhZF9JVCgpCisKKyAgICAoIykgTm8tQmxvY2tpbmcgbW9kZSBmdW5jdGlvbnMgd2l0aCBETUEgYXJlIDoKKyAgICAgICAgKCsrKSBIQUxfSTJDX01hc3Rlcl9UcmFuc21pdF9ETUEoKQorICAgICAgICAoKyspIEhBTF9JMkNfTWFzdGVyX1JlY2VpdmVfRE1BKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX1NsYXZlX1RyYW5zbWl0X0RNQSgpCisgICAgICAgICgrKykgSEFMX0kyQ19TbGF2ZV9SZWNlaXZlX0RNQSgpCisgICAgICAgICgrKykgSEFMX0kyQ19NZW1fV3JpdGVfRE1BKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX01lbV9SZWFkX0RNQSgpCisKKyAgICAoIykgQSBzZXQgb2YgVHJhbnNmZXIgQ29tcGxldGUgQ2FsbGJhY2tzIGFyZSBwcm92aWRlZCBpbiBub24gQmxvY2tpbmcgbW9kZToKKyAgICAgICAgKCsrKSBIQUxfSTJDX01lbVR4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX01lbVJ4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX01hc3RlclR4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX01hc3RlclJ4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX1NsYXZlVHhDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9JMkNfU2xhdmVSeENwbHRDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX0kyQ19FcnJvckNhbGxiYWNrKCkKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdHMgaW4gbWFzdGVyIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBUYXJnZXQgZGV2aWNlIGFkZHJlc3M6IFRoZSBkZXZpY2UgNyBiaXRzIGFkZHJlc3MgdmFsdWUKKyAgKiAgICAgICAgIGluIGRhdGFzaGVldCBtdXN0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYmVmb3JlIGNhbGxpbmcgdGhlIGludGVyZmFjZQorICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWFzdGVyX1RyYW5zbWl0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gMFU7CisKKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50Ki8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgaWYgKEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpMmMsIEkyQ19GTEFHX0JVU1ksIFNFVCwgSTJDX1RJTUVPVVRfQlVTWSwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKworICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9UWDsKKyAgICBoaTJjLT5Nb2RlICAgICAgPSBIQUxfSTJDX01PREVfTUFTVEVSOworICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICA9IHBEYXRhOworICAgIGhpMmMtPlhmZXJDb3VudCA9IFNpemU7CisgICAgaGkyYy0+WGZlcklTUiAgID0gTlVMTDsKKworICAgIC8qIFNlbmQgU2xhdmUgQWRkcmVzcyAqLworICAgIC8qIFNldCBOQllURVMgdG8gd3JpdGUgYW5kIHJlbG9hZCBpZiBoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSBhbmQgZ2VuZXJhdGUgUkVTVEFSVCAqLworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsIGhpMmMtPlhmZXJTaXplLCBJMkNfUkVMT0FEX01PREUsIEkyQ19HRU5FUkFURV9TVEFSVF9XUklURSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCBoaTJjLT5YZmVyU2l6ZSwgSTJDX0FVVE9FTkRfTU9ERSwgSTJDX0dFTkVSQVRFX1NUQVJUX1dSSVRFKTsKKyAgICB9CisKKyAgICB3aGlsZSAoaGkyYy0+WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgLyogV2FpdCB1bnRpbCBUWElTIGZsYWcgaXMgc2V0ICovCisgICAgICBpZiAoSTJDX1dhaXRPblRYSVNGbGFnVW50aWxUaW1lb3V0KGhpMmMsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBpZiAoaGkyYy0+RXJyb3JDb2RlID09IEhBTF9JMkNfRVJST1JfQUYpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogV3JpdGUgZGF0YSB0byBUWERSICovCisgICAgICBoaTJjLT5JbnN0YW5jZS0+VFhEUiA9ICgqaGkyYy0+cEJ1ZmZQdHIrKyk7CisgICAgICBoaTJjLT5YZmVyQ291bnQtLTsKKyAgICAgIGhpMmMtPlhmZXJTaXplLS07CisKKyAgICAgIGlmICgoaGkyYy0+WGZlclNpemUgPT0gMFUpICYmIChoaTJjLT5YZmVyQ291bnQgIT0gMFUpKQorICAgICAgeworICAgICAgICAvKiBXYWl0IHVudGlsIFRDUiBmbGFnIGlzIHNldCAqLworICAgICAgICBpZiAoSTJDX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaGkyYywgSTJDX0ZMQUdfVENSLCBSRVNFVCwgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCBoaTJjLT5YZmVyU2l6ZSwgSTJDX1JFTE9BRF9NT0RFLCBJMkNfTk9fU1RBUlRTVE9QKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBoaTJjLT5YZmVyU2l6ZSA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICAgICAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgaGkyYy0+WGZlclNpemUsIEkyQ19BVVRPRU5EX01PREUsIEkyQ19OT19TVEFSVFNUT1ApOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyogTm8gbmVlZCB0byBDaGVjayBUQyBmbGFnLCB3aXRoIEFVVE9FTkQgbW9kZSB0aGUgc3RvcCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCAqLworICAgIC8qIFdhaXQgdW50aWwgU1RPUEYgZmxhZyBpcyBzZXQgKi8KKyAgICBpZiAoSTJDX1dhaXRPblNUT1BGbGFnVW50aWxUaW1lb3V0KGhpMmMsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIGlmIChoaTJjLT5FcnJvckNvZGUgPT0gSEFMX0kyQ19FUlJPUl9BRikKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKworICAgIC8qIENsZWFyIFNUT1AgRmxhZyAqLworICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX1NUT1BGKTsKKworICAgIC8qIENsZWFyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworICAgIEkyQ19SRVNFVF9DUjIoaGkyYyk7CisKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisgICAgaGkyYy0+TW9kZSAgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmVzIGluIG1hc3RlciBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3MgVGFyZ2V0IGRldmljZSBhZGRyZXNzOiBUaGUgZGV2aWNlIDcgYml0cyBhZGRyZXNzIHZhbHVlCisgICogICAgICAgICBpbiBkYXRhc2hlZXQgbXVzdCBiZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJlZm9yZSBjYWxsaW5nIHRoZSBpbnRlcmZhY2UKKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9SZWNlaXZlKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gMFU7CisKKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50Ki8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgaWYgKEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpMmMsIEkyQ19GTEFHX0JVU1ksIFNFVCwgSTJDX1RJTUVPVVRfQlVTWSwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKworICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9SWDsKKyAgICBoaTJjLT5Nb2RlICAgICAgPSBIQUxfSTJDX01PREVfTUFTVEVSOworICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICA9IHBEYXRhOworICAgIGhpMmMtPlhmZXJDb3VudCA9IFNpemU7CisgICAgaGkyYy0+WGZlcklTUiAgID0gTlVMTDsKKworICAgIC8qIFNlbmQgU2xhdmUgQWRkcmVzcyAqLworICAgIC8qIFNldCBOQllURVMgdG8gd3JpdGUgYW5kIHJlbG9hZCBpZiBoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSBhbmQgZ2VuZXJhdGUgUkVTVEFSVCAqLworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsIGhpMmMtPlhmZXJTaXplLCBJMkNfUkVMT0FEX01PREUsIEkyQ19HRU5FUkFURV9TVEFSVF9SRUFEKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhpMmMtPlhmZXJTaXplID0gaGkyYy0+WGZlckNvdW50OworICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsIGhpMmMtPlhmZXJTaXplLCBJMkNfQVVUT0VORF9NT0RFLCBJMkNfR0VORVJBVEVfU1RBUlRfUkVBRCk7CisgICAgfQorCisgICAgd2hpbGUgKGhpMmMtPlhmZXJDb3VudCA+IDBVKQorICAgIHsKKyAgICAgIC8qIFdhaXQgdW50aWwgUlhORSBmbGFnIGlzIHNldCAqLworICAgICAgaWYgKEkyQ19XYWl0T25SWE5FRmxhZ1VudGlsVGltZW91dChoaTJjLCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaWYgKGhpMmMtPkVycm9yQ29kZSA9PSBIQUxfSTJDX0VSUk9SX0FGKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogUmVhZCBkYXRhIGZyb20gUlhEUiAqLworICAgICAgKCpoaTJjLT5wQnVmZlB0cisrKSA9IGhpMmMtPkluc3RhbmNlLT5SWERSOworICAgICAgaGkyYy0+WGZlclNpemUtLTsKKyAgICAgIGhpMmMtPlhmZXJDb3VudC0tOworCisgICAgICBpZiAoKGhpMmMtPlhmZXJTaXplID09IDBVKSAmJiAoaGkyYy0+WGZlckNvdW50ICE9IDBVKSkKKyAgICAgIHsKKyAgICAgICAgLyogV2FpdCB1bnRpbCBUQ1IgZmxhZyBpcyBzZXQgKi8KKyAgICAgICAgaWYgKEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpMmMsIEkyQ19GTEFHX1RDUiwgUkVTRVQsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgaGkyYy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICAgICAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgaGkyYy0+WGZlclNpemUsIEkyQ19SRUxPQURfTU9ERSwgSTJDX05PX1NUQVJUU1RPUCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsIGhpMmMtPlhmZXJTaXplLCBJMkNfQVVUT0VORF9NT0RFLCBJMkNfTk9fU1RBUlRTVE9QKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIE5vIG5lZWQgdG8gQ2hlY2sgVEMgZmxhZywgd2l0aCBBVVRPRU5EIG1vZGUgdGhlIHN0b3AgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgKi8KKyAgICAvKiBXYWl0IHVudGlsIFNUT1BGIGZsYWcgaXMgc2V0ICovCisgICAgaWYgKEkyQ19XYWl0T25TVE9QRmxhZ1VudGlsVGltZW91dChoaTJjLCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICBpZiAoaGkyYy0+RXJyb3JDb2RlID09IEhBTF9JMkNfRVJST1JfQUYpCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDbGVhciBTVE9QIEZsYWcgKi8KKyAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19TVE9QRik7CisKKyAgICAvKiBDbGVhciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KKyAgICBJMkNfUkVTRVRfQ1IyKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgIGhpMmMtPk1vZGUgID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdHMgaW4gc2xhdmUgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9UcmFuc21pdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDBVOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgfQorICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICBoaTJjLT5TdGF0ZSAgICAgPSBIQUxfSTJDX1NUQVRFX0JVU1lfVFg7CisgICAgaGkyYy0+TW9kZSAgICAgID0gSEFMX0kyQ19NT0RFX1NMQVZFOworICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICA9IHBEYXRhOworICAgIGhpMmMtPlhmZXJDb3VudCA9IFNpemU7CisgICAgaGkyYy0+WGZlcklTUiAgID0gTlVMTDsKKworICAgIC8qIEVuYWJsZSBBZGRyZXNzIEFja25vd2xlZGdlICovCisgICAgaGkyYy0+SW5zdGFuY2UtPkNSMiAmPSB+STJDX0NSMl9OQUNLOworCisgICAgLyogV2FpdCB1bnRpbCBBRERSIGZsYWcgaXMgc2V0ICovCisgICAgaWYgKEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpMmMsIEkyQ19GTEFHX0FERFIsIFJFU0VULCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIEFkZHJlc3MgQWNrbm93bGVkZ2UgKi8KKyAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgfD0gSTJDX0NSMl9OQUNLOworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKworICAgIC8qIENsZWFyIEFERFIgZmxhZyAqLworICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FERFIpOworCisgICAgLyogSWYgMTBiaXQgYWRkcmVzc2luZyBtb2RlIGlzIHNlbGVjdGVkICovCisgICAgaWYgKGhpMmMtPkluaXQuQWRkcmVzc2luZ01vZGUgPT0gSTJDX0FERFJFU1NJTkdNT0RFXzEwQklUKQorICAgIHsKKyAgICAgIC8qIFdhaXQgdW50aWwgQUREUiBmbGFnIGlzIHNldCAqLworICAgICAgaWYgKEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpMmMsIEkyQ19GTEFHX0FERFIsIFJFU0VULCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSBBZGRyZXNzIEFja25vd2xlZGdlICovCisgICAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgfD0gSTJDX0NSMl9OQUNLOworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisKKyAgICAgIC8qIENsZWFyIEFERFIgZmxhZyAqLworICAgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQUREUik7CisgICAgfQorCisgICAgLyogV2FpdCB1bnRpbCBESVIgZmxhZyBpcyBzZXQgVHJhbnNtaXR0ZXIgbW9kZSAqLworICAgIGlmIChJMkNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoaTJjLCBJMkNfRkxBR19ESVIsIFJFU0VULCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIEFkZHJlc3MgQWNrbm93bGVkZ2UgKi8KKyAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgfD0gSTJDX0NSMl9OQUNLOworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKworICAgIHdoaWxlIChoaTJjLT5YZmVyQ291bnQgPiAwVSkKKyAgICB7CisgICAgICAvKiBXYWl0IHVudGlsIFRYSVMgZmxhZyBpcyBzZXQgKi8KKyAgICAgIGlmIChJMkNfV2FpdE9uVFhJU0ZsYWdVbnRpbFRpbWVvdXQoaGkyYywgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICAgICAgICBoaTJjLT5JbnN0YW5jZS0+Q1IyIHw9IEkyQ19DUjJfTkFDSzsKKworICAgICAgICBpZiAoaGkyYy0+RXJyb3JDb2RlID09IEhBTF9JMkNfRVJST1JfQUYpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBXcml0ZSBkYXRhIHRvIFRYRFIgKi8KKyAgICAgIGhpMmMtPkluc3RhbmNlLT5UWERSID0gKCpoaTJjLT5wQnVmZlB0cisrKTsKKyAgICAgIGhpMmMtPlhmZXJDb3VudC0tOworICAgIH0KKworICAgIC8qIFdhaXQgdW50aWwgU1RPUCBmbGFnIGlzIHNldCAqLworICAgIGlmIChJMkNfV2FpdE9uU1RPUEZsYWdVbnRpbFRpbWVvdXQoaGkyYywgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogRGlzYWJsZSBBZGRyZXNzIEFja25vd2xlZGdlICovCisgICAgICBoaTJjLT5JbnN0YW5jZS0+Q1IyIHw9IEkyQ19DUjJfTkFDSzsKKworICAgICAgaWYgKGhpMmMtPkVycm9yQ29kZSA9PSBIQUxfSTJDX0VSUk9SX0FGKQorICAgICAgeworICAgICAgICAvKiBOb3JtYWwgdXNlIGNhc2UgZm9yIFRyYW5zbWl0dGVyIG1vZGUgKi8KKyAgICAgICAgLyogQSBOQUNLIGlzIGdlbmVyYXRlZCB0byBjb25maXJtIHRoZSBlbmQgb2YgdHJhbnNmZXIgKi8KKyAgICAgICAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9OT05FOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorCisgICAgLyogQ2xlYXIgU1RPUCBmbGFnICovCisgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfU1RPUEYpOworCisgICAgLyogV2FpdCB1bnRpbCBCVVNZIGZsYWcgaXMgcmVzZXQgKi8KKyAgICBpZiAoSTJDX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaGkyYywgSTJDX0ZMQUdfQlVTWSwgU0VULCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIEFkZHJlc3MgQWNrbm93bGVkZ2UgKi8KKyAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgfD0gSTJDX0NSMl9OQUNLOworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKworICAgIC8qIERpc2FibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgfD0gSTJDX0NSMl9OQUNLOworCisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgIGhpMmMtPk1vZGUgID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlIGluIHNsYXZlIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZQorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9SZWNlaXZlKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gMFU7CisKKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9SWDsKKyAgICBoaTJjLT5Nb2RlICAgICAgPSBIQUxfSTJDX01PREVfU0xBVkU7CisgICAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9OT05FOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaGkyYy0+cEJ1ZmZQdHIgID0gcERhdGE7CisgICAgaGkyYy0+WGZlckNvdW50ID0gU2l6ZTsKKyAgICBoaTJjLT5YZmVySVNSICAgPSBOVUxMOworCisgICAgLyogRW5hYmxlIEFkZHJlc3MgQWNrbm93bGVkZ2UgKi8KKyAgICBoaTJjLT5JbnN0YW5jZS0+Q1IyICY9IH5JMkNfQ1IyX05BQ0s7CisKKyAgICAvKiBXYWl0IHVudGlsIEFERFIgZmxhZyBpcyBzZXQgKi8KKyAgICBpZiAoSTJDX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaGkyYywgSTJDX0ZMQUdfQUREUiwgUkVTRVQsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICAgICAgaGkyYy0+SW5zdGFuY2UtPkNSMiB8PSBJMkNfQ1IyX05BQ0s7CisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorCisgICAgLyogQ2xlYXIgQUREUiBmbGFnICovCisgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQUREUik7CisKKyAgICAvKiBXYWl0IHVudGlsIERJUiBmbGFnIGlzIHJlc2V0IFJlY2VpdmVyIG1vZGUgKi8KKyAgICBpZiAoSTJDX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaGkyYywgSTJDX0ZMQUdfRElSLCBTRVQsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICAgICAgaGkyYy0+SW5zdGFuY2UtPkNSMiB8PSBJMkNfQ1IyX05BQ0s7CisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorCisgICAgd2hpbGUgKGhpMmMtPlhmZXJDb3VudCA+IDBVKQorICAgIHsKKyAgICAgIC8qIFdhaXQgdW50aWwgUlhORSBmbGFnIGlzIHNldCAqLworICAgICAgaWYgKEkyQ19XYWl0T25SWE5FRmxhZ1VudGlsVGltZW91dChoaTJjLCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSBBZGRyZXNzIEFja25vd2xlZGdlICovCisgICAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgfD0gSTJDX0NSMl9OQUNLOworCisgICAgICAgIC8qIFN0b3JlIExhc3QgcmVjZWl2ZSBkYXRhIGlmIGFueSAqLworICAgICAgICBpZiAoX19IQUxfSTJDX0dFVF9GTEFHKGhpMmMsIEkyQ19GTEFHX1JYTkUpID09IFNFVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFJlYWQgZGF0YSBmcm9tIFJYRFIgKi8KKyAgICAgICAgICAoKmhpMmMtPnBCdWZmUHRyKyspID0gaGkyYy0+SW5zdGFuY2UtPlJYRFI7CisgICAgICAgICAgaGkyYy0+WGZlckNvdW50LS07CisgICAgICAgIH0KKworICAgICAgICBpZiAoaGkyYy0+RXJyb3JDb2RlID09IEhBTF9JMkNfRVJST1JfVElNRU9VVCkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIFJlYWQgZGF0YSBmcm9tIFJYRFIgKi8KKyAgICAgICgqaGkyYy0+cEJ1ZmZQdHIrKykgPSBoaTJjLT5JbnN0YW5jZS0+UlhEUjsKKyAgICAgIGhpMmMtPlhmZXJDb3VudC0tOworICAgIH0KKworICAgIC8qIFdhaXQgdW50aWwgU1RPUCBmbGFnIGlzIHNldCAqLworICAgIGlmIChJMkNfV2FpdE9uU1RPUEZsYWdVbnRpbFRpbWVvdXQoaGkyYywgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogRGlzYWJsZSBBZGRyZXNzIEFja25vd2xlZGdlICovCisgICAgICBoaTJjLT5JbnN0YW5jZS0+Q1IyIHw9IEkyQ19DUjJfTkFDSzsKKworICAgICAgaWYgKGhpMmMtPkVycm9yQ29kZSA9PSBIQUxfSTJDX0VSUk9SX0FGKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorCisgICAgLyogQ2xlYXIgU1RPUCBmbGFnICovCisgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfU1RPUEYpOworCisgICAgLyogV2FpdCB1bnRpbCBCVVNZIGZsYWcgaXMgcmVzZXQgKi8KKyAgICBpZiAoSTJDX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaGkyYywgSTJDX0ZMQUdfQlVTWSwgU0VULCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIEFkZHJlc3MgQWNrbm93bGVkZ2UgKi8KKyAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgfD0gSTJDX0NSMl9OQUNLOworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKworICAgIC8qIERpc2FibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgfD0gSTJDX0NSMl9OQUNLOworCisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgIGhpMmMtPk1vZGUgID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBpbiBtYXN0ZXIgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdAorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIFRhcmdldCBkZXZpY2UgYWRkcmVzczogVGhlIGRldmljZSA3IGJpdHMgYWRkcmVzcyB2YWx1ZQorICAqICAgICAgICAgaW4gZGF0YXNoZWV0IG11c3QgYmUgc2hpZnRlZCB0byB0aGUgbGVmdCBiZWZvcmUgY2FsbGluZyB0aGUgaW50ZXJmYWNlCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWFzdGVyX1RyYW5zbWl0X0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgdWludDMyX3QgeGZlcm1vZGUgPSAwVTsKKworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9SRUFEWSkKKyAgeworICAgIGlmIChfX0hBTF9JMkNfR0VUX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQlVTWSkgPT0gU0VUKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICBoaTJjLT5TdGF0ZSAgICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9UWDsKKyAgICBoaTJjLT5Nb2RlICAgICAgICA9IEhBTF9JMkNfTU9ERV9NQVNURVI7CisgICAgaGkyYy0+RXJyb3JDb2RlICAgPSBIQUxfSTJDX0VSUk9SX05PTkU7CisKKyAgICAvKiBQcmVwYXJlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICBoaTJjLT5wQnVmZlB0ciAgICA9IHBEYXRhOworICAgIGhpMmMtPlhmZXJDb3VudCAgID0gU2l6ZTsKKyAgICBoaTJjLT5YZmVyT3B0aW9ucyA9IEkyQ19OT19PUFRJT05fRlJBTUU7CisgICAgaGkyYy0+WGZlcklTUiAgICAgPSBJMkNfTWFzdGVyX0lTUl9JVDsKKworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgeGZlcm1vZGUgPSBJMkNfUkVMT0FEX01PREU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICAgIHhmZXJtb2RlID0gSTJDX0FVVE9FTkRfTU9ERTsKKyAgICB9CisKKyAgICAvKiBTZW5kIFNsYXZlIEFkZHJlc3MgKi8KKyAgICAvKiBTZXQgTkJZVEVTIHRvIHdyaXRlIGFuZCByZWxvYWQgaWYgaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUgKi8KKyAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgaGkyYy0+WGZlclNpemUsIHhmZXJtb2RlLCBJMkNfR0VORVJBVEVfU1RBUlRfV1JJVEUpOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIC8qIE5vdGUgOiBUaGUgSTJDIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgSTJDIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisKKyAgICAvKiBFbmFibGUgRVJSLCBUQywgU1RPUCwgTkFDSywgVFhJIGludGVycnVwdCAqLworICAgIC8qIHBvc3NpYmxlIHRvIGVuYWJsZSBhbGwgb2YgdGhlc2UgKi8KKyAgICAvKiBJMkNfSVRfRVJSSSB8IEkyQ19JVF9UQ0l8IEkyQ19JVF9TVE9QSXwgSTJDX0lUX05BQ0tJIHwgSTJDX0lUX0FERFJJIHwgSTJDX0lUX1JYSSB8IEkyQ19JVF9UWEkgKi8KKyAgICBJMkNfRW5hYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9UWF9JVCk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgaW4gbWFzdGVyIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQKKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBUYXJnZXQgZGV2aWNlIGFkZHJlc3M6IFRoZSBkZXZpY2UgNyBiaXRzIGFkZHJlc3MgdmFsdWUKKyAgKiAgICAgICAgIGluIGRhdGFzaGVldCBtdXN0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYmVmb3JlIGNhbGxpbmcgdGhlIGludGVyZmFjZQorICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9SZWNlaXZlX0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgdWludDMyX3QgeGZlcm1vZGUgPSAwVTsKKworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9SRUFEWSkKKyAgeworICAgIGlmIChfX0hBTF9JMkNfR0VUX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQlVTWSkgPT0gU0VUKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICBoaTJjLT5TdGF0ZSAgICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9SWDsKKyAgICBoaTJjLT5Nb2RlICAgICAgICA9IEhBTF9JMkNfTU9ERV9NQVNURVI7CisgICAgaGkyYy0+RXJyb3JDb2RlICAgPSBIQUxfSTJDX0VSUk9SX05PTkU7CisKKyAgICAvKiBQcmVwYXJlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICBoaTJjLT5wQnVmZlB0ciAgICA9IHBEYXRhOworICAgIGhpMmMtPlhmZXJDb3VudCAgID0gU2l6ZTsKKyAgICBoaTJjLT5YZmVyT3B0aW9ucyA9IEkyQ19OT19PUFRJT05fRlJBTUU7CisgICAgaGkyYy0+WGZlcklTUiAgICAgPSBJMkNfTWFzdGVyX0lTUl9JVDsKKworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgeGZlcm1vZGUgPSBJMkNfUkVMT0FEX01PREU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICAgIHhmZXJtb2RlID0gSTJDX0FVVE9FTkRfTU9ERTsKKyAgICB9CisKKyAgICAvKiBTZW5kIFNsYXZlIEFkZHJlc3MgKi8KKyAgICAvKiBTZXQgTkJZVEVTIHRvIHdyaXRlIGFuZCByZWxvYWQgaWYgaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUgKi8KKyAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgaGkyYy0+WGZlclNpemUsIHhmZXJtb2RlLCBJMkNfR0VORVJBVEVfU1RBUlRfUkVBRCk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgLyogTm90ZSA6IFRoZSBJMkMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBJMkMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKworICAgIC8qIEVuYWJsZSBFUlIsIFRDLCBTVE9QLCBOQUNLLCBSWEkgaW50ZXJydXB0ICovCisgICAgLyogcG9zc2libGUgdG8gZW5hYmxlIGFsbCBvZiB0aGVzZSAqLworICAgIC8qIEkyQ19JVF9FUlJJIHwgSTJDX0lUX1RDSXwgSTJDX0lUX1NUT1BJfCBJMkNfSVRfTkFDS0kgfCBJMkNfSVRfQUREUkkgfCBJMkNfSVRfUlhJIHwgSTJDX0lUX1RYSSAqLworICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1JYX0lUKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXQgaW4gc2xhdmUgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdAorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfU2xhdmVfVHJhbnNtaXRfSVQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIGhpMmMtPlN0YXRlICAgICAgID0gSEFMX0kyQ19TVEFURV9CVVNZX1RYOworICAgIGhpMmMtPk1vZGUgICAgICAgID0gSEFMX0kyQ19NT0RFX1NMQVZFOworICAgIGhpMmMtPkVycm9yQ29kZSAgID0gSEFMX0kyQ19FUlJPUl9OT05FOworCisgICAgLyogRW5hYmxlIEFkZHJlc3MgQWNrbm93bGVkZ2UgKi8KKyAgICBoaTJjLT5JbnN0YW5jZS0+Q1IyICY9IH5JMkNfQ1IyX05BQ0s7CisKKyAgICAvKiBQcmVwYXJlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICBoaTJjLT5wQnVmZlB0ciAgICA9IHBEYXRhOworICAgIGhpMmMtPlhmZXJDb3VudCAgID0gU2l6ZTsKKyAgICBoaTJjLT5YZmVyU2l6ZSAgICA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICBoaTJjLT5YZmVyT3B0aW9ucyA9IEkyQ19OT19PUFRJT05fRlJBTUU7CisgICAgaGkyYy0+WGZlcklTUiAgICAgPSBJMkNfU2xhdmVfSVNSX0lUOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIC8qIE5vdGUgOiBUaGUgSTJDIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgSTJDIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisKKyAgICAvKiBFbmFibGUgRVJSLCBUQywgU1RPUCwgTkFDSywgVFhJIGludGVycnVwdCAqLworICAgIC8qIHBvc3NpYmxlIHRvIGVuYWJsZSBhbGwgb2YgdGhlc2UgKi8KKyAgICAvKiBJMkNfSVRfRVJSSSB8IEkyQ19JVF9UQ0l8IEkyQ19JVF9TVE9QSXwgSTJDX0lUX05BQ0tJIHwgSTJDX0lUX0FERFJJIHwgSTJDX0lUX1JYSSB8IEkyQ19JVF9UWEkgKi8KKyAgICBJMkNfRW5hYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9UWF9JVCB8IEkyQ19YRkVSX0xJU1RFTl9JVCk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgaW4gc2xhdmUgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdAorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfU2xhdmVfUmVjZWl2ZV9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgICAgICAgPSBIQUxfSTJDX1NUQVRFX0JVU1lfUlg7CisgICAgaGkyYy0+TW9kZSAgICAgICAgPSBIQUxfSTJDX01PREVfU0xBVkU7CisgICAgaGkyYy0+RXJyb3JDb2RlICAgPSBIQUxfSTJDX0VSUk9SX05PTkU7CisKKyAgICAvKiBFbmFibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgJj0gfkkyQ19DUjJfTkFDSzsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICAgID0gcERhdGE7CisgICAgaGkyYy0+WGZlckNvdW50ICAgPSBTaXplOworICAgIGhpMmMtPlhmZXJTaXplICAgID0gaGkyYy0+WGZlckNvdW50OworICAgIGhpMmMtPlhmZXJPcHRpb25zID0gSTJDX05PX09QVElPTl9GUkFNRTsKKyAgICBoaTJjLT5YZmVySVNSICAgICA9IEkyQ19TbGF2ZV9JU1JfSVQ7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgLyogTm90ZSA6IFRoZSBJMkMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBJMkMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKworICAgIC8qIEVuYWJsZSBFUlIsIFRDLCBTVE9QLCBOQUNLLCBSWEkgaW50ZXJydXB0ICovCisgICAgLyogcG9zc2libGUgdG8gZW5hYmxlIGFsbCBvZiB0aGVzZSAqLworICAgIC8qIEkyQ19JVF9FUlJJIHwgSTJDX0lUX1RDSXwgSTJDX0lUX1NUT1BJfCBJMkNfSVRfTkFDS0kgfCBJMkNfSVRfQUREUkkgfCBJMkNfSVRfUlhJIHwgSTJDX0lUX1RYSSAqLworICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1JYX0lUIHwgSTJDX1hGRVJfTElTVEVOX0lUKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXQgaW4gbWFzdGVyIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBETUEKKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBUYXJnZXQgZGV2aWNlIGFkZHJlc3M6IFRoZSBkZXZpY2UgNyBiaXRzIGFkZHJlc3MgdmFsdWUKKyAgKiAgICAgICAgIGluIGRhdGFzaGVldCBtdXN0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYmVmb3JlIGNhbGxpbmcgdGhlIGludGVyZmFjZQorICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9UcmFuc21pdF9ETUEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICB1aW50MzJfdCB4ZmVybW9kZSA9IDBVOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBJMkNfRkxBR19CVVNZKSA9PSBTRVQpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9CVVNZOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIGhpMmMtPlN0YXRlICAgICAgID0gSEFMX0kyQ19TVEFURV9CVVNZX1RYOworICAgIGhpMmMtPk1vZGUgICAgICAgID0gSEFMX0kyQ19NT0RFX01BU1RFUjsKKyAgICBoaTJjLT5FcnJvckNvZGUgICA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICAgID0gcERhdGE7CisgICAgaGkyYy0+WGZlckNvdW50ICAgPSBTaXplOworICAgIGhpMmMtPlhmZXJPcHRpb25zID0gSTJDX05PX09QVElPTl9GUkFNRTsKKyAgICBoaTJjLT5YZmVySVNSICAgICA9IEkyQ19NYXN0ZXJfSVNSX0RNQTsKKworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgeGZlcm1vZGUgPSBJMkNfUkVMT0FEX01PREU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICAgIHhmZXJtb2RlID0gSTJDX0FVVE9FTkRfTU9ERTsKKyAgICB9CisKKyAgICBpZiAoaGkyYy0+WGZlclNpemUgPiAwVSkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIEkyQyBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIGhpMmMtPmhkbWF0eC0+WGZlckNwbHRDYWxsYmFjayA9IEkyQ19ETUFNYXN0ZXJUcmFuc21pdENwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBoaTJjLT5oZG1hdHgtPlhmZXJFcnJvckNhbGxiYWNrID0gSTJDX0RNQUVycm9yOworCisgICAgICAvKiBTZXQgdGhlIHVudXNlZCBETUEgY2FsbGJhY2tzIHRvIE5VTEwgKi8KKyAgICAgIGhpMmMtPmhkbWF0eC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgaGkyYy0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIEhBTF9ETUFfU3RhcnRfSVQoaGkyYy0+aGRtYXR4LCAodWludDMyX3QpcERhdGEsICh1aW50MzJfdCkmaGkyYy0+SW5zdGFuY2UtPlRYRFIsIGhpMmMtPlhmZXJTaXplKTsKKworICAgICAgLyogU2VuZCBTbGF2ZSBBZGRyZXNzICovCisgICAgICAvKiBTZXQgTkJZVEVTIHRvIHdyaXRlIGFuZCByZWxvYWQgaWYgaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUgYW5kIGdlbmVyYXRlIFJFU1RBUlQgKi8KKyAgICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCBoaTJjLT5YZmVyU2l6ZSwgeGZlcm1vZGUsIEkyQ19HRU5FUkFURV9TVEFSVF9XUklURSk7CisKKyAgICAgIC8qIFVwZGF0ZSBYZmVyQ291bnQgdmFsdWUgKi8KKyAgICAgIGhpMmMtPlhmZXJDb3VudCAtPSBoaTJjLT5YZmVyU2l6ZTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAvKiBOb3RlIDogVGhlIEkyQyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgSTJDIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKyAgICAgIC8qIEVuYWJsZSBFUlIgYW5kIE5BQ0sgaW50ZXJydXB0cyAqLworICAgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfRVJST1JfSVQpOworCisgICAgICAvKiBFbmFibGUgRE1BIFJlcXVlc3QgKi8KKyAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgfD0gSTJDX0NSMV9UWERNQUVOOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogVXBkYXRlIFRyYW5zZmVyIElTUiBmdW5jdGlvbiBwb2ludGVyICovCisgICAgICBoaTJjLT5YZmVySVNSID0gSTJDX01hc3Rlcl9JU1JfSVQ7CisKKyAgICAgIC8qIFNlbmQgU2xhdmUgQWRkcmVzcyAqLworICAgICAgLyogU2V0IE5CWVRFUyB0byB3cml0ZSBhbmQgZ2VuZXJhdGUgU1RBUlQgY29uZGl0aW9uICovCisgICAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgaGkyYy0+WGZlclNpemUsIEkyQ19BVVRPRU5EX01PREUsIEkyQ19HRU5FUkFURV9TVEFSVF9XUklURSk7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgLyogTm90ZSA6IFRoZSBJMkMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIEkyQyBpbnRlcnJ1cHQgaGFuZGxlIGV4ZWN1dGlvbiBiZWZvcmUgY3VycmVudAorICAgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisgICAgICAvKiBFbmFibGUgRVJSLCBUQywgU1RPUCwgTkFDSywgVFhJIGludGVycnVwdCAqLworICAgICAgLyogcG9zc2libGUgdG8gZW5hYmxlIGFsbCBvZiB0aGVzZSAqLworICAgICAgLyogSTJDX0lUX0VSUkkgfCBJMkNfSVRfVENJfCBJMkNfSVRfU1RPUEl8IEkyQ19JVF9OQUNLSSB8IEkyQ19JVF9BRERSSSB8IEkyQ19JVF9SWEkgfCBJMkNfSVRfVFhJICovCisgICAgICBJMkNfRW5hYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9UWF9JVCk7CisgICAgfQorCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlIGluIG1hc3RlciBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggRE1BCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3MgVGFyZ2V0IGRldmljZSBhZGRyZXNzOiBUaGUgZGV2aWNlIDcgYml0cyBhZGRyZXNzIHZhbHVlCisgICogICAgICAgICBpbiBkYXRhc2hlZXQgbXVzdCBiZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJlZm9yZSBjYWxsaW5nIHRoZSBpbnRlcmZhY2UKKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NYXN0ZXJfUmVjZWl2ZV9ETUEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICB1aW50MzJfdCB4ZmVybW9kZSA9IDBVOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBJMkNfRkxBR19CVVNZKSA9PSBTRVQpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9CVVNZOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIGhpMmMtPlN0YXRlICAgICAgID0gSEFMX0kyQ19TVEFURV9CVVNZX1JYOworICAgIGhpMmMtPk1vZGUgICAgICAgID0gSEFMX0kyQ19NT0RFX01BU1RFUjsKKyAgICBoaTJjLT5FcnJvckNvZGUgICA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICAgID0gcERhdGE7CisgICAgaGkyYy0+WGZlckNvdW50ICAgPSBTaXplOworICAgIGhpMmMtPlhmZXJPcHRpb25zID0gSTJDX05PX09QVElPTl9GUkFNRTsKKyAgICBoaTJjLT5YZmVySVNSICAgICA9IEkyQ19NYXN0ZXJfSVNSX0RNQTsKKworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgeGZlcm1vZGUgPSBJMkNfUkVMT0FEX01PREU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICAgIHhmZXJtb2RlID0gSTJDX0FVVE9FTkRfTU9ERTsKKyAgICB9CisKKyAgICBpZiAoaGkyYy0+WGZlclNpemUgPiAwVSkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIEkyQyBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIGhpMmMtPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayA9IEkyQ19ETUFNYXN0ZXJSZWNlaXZlQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGhpMmMtPmhkbWFyeC0+WGZlckVycm9yQ2FsbGJhY2sgPSBJMkNfRE1BRXJyb3I7CisKKyAgICAgIC8qIFNldCB0aGUgdW51c2VkIERNQSBjYWxsYmFja3MgdG8gTlVMTCAqLworICAgICAgaGkyYy0+aGRtYXJ4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IE5VTEw7CisgICAgICBoaTJjLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgSEFMX0RNQV9TdGFydF9JVChoaTJjLT5oZG1hcngsICh1aW50MzJfdCkmaGkyYy0+SW5zdGFuY2UtPlJYRFIsICh1aW50MzJfdClwRGF0YSwgaGkyYy0+WGZlclNpemUpOworCisgICAgICAvKiBTZW5kIFNsYXZlIEFkZHJlc3MgKi8KKyAgICAgIC8qIFNldCBOQllURVMgdG8gcmVhZCBhbmQgcmVsb2FkIGlmIGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFIGFuZCBnZW5lcmF0ZSBSRVNUQVJUICovCisgICAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgaGkyYy0+WGZlclNpemUsIHhmZXJtb2RlLCBJMkNfR0VORVJBVEVfU1RBUlRfUkVBRCk7CisKKyAgICAgIC8qIFVwZGF0ZSBYZmVyQ291bnQgdmFsdWUgKi8KKyAgICAgIGhpMmMtPlhmZXJDb3VudCAtPSBoaTJjLT5YZmVyU2l6ZTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAvKiBOb3RlIDogVGhlIEkyQyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgSTJDIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKyAgICAgIC8qIEVuYWJsZSBFUlIgYW5kIE5BQ0sgaW50ZXJydXB0cyAqLworICAgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfRVJST1JfSVQpOworCisgICAgICAvKiBFbmFibGUgRE1BIFJlcXVlc3QgKi8KKyAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgfD0gSTJDX0NSMV9SWERNQUVOOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogVXBkYXRlIFRyYW5zZmVyIElTUiBmdW5jdGlvbiBwb2ludGVyICovCisgICAgICBoaTJjLT5YZmVySVNSID0gSTJDX01hc3Rlcl9JU1JfSVQ7CisKKyAgICAgIC8qIFNlbmQgU2xhdmUgQWRkcmVzcyAqLworICAgICAgLyogU2V0IE5CWVRFUyB0byByZWFkIGFuZCBnZW5lcmF0ZSBTVEFSVCBjb25kaXRpb24gKi8KKyAgICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCBoaTJjLT5YZmVyU2l6ZSwgSTJDX0FVVE9FTkRfTU9ERSwgSTJDX0dFTkVSQVRFX1NUQVJUX1JFQUQpOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgIC8qIE5vdGUgOiBUaGUgSTJDIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBJMkMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICBwcm9jZXNzIHVubG9jayAqLworICAgICAgLyogRW5hYmxlIEVSUiwgVEMsIFNUT1AsIE5BQ0ssIFRYSSBpbnRlcnJ1cHQgKi8KKyAgICAgIC8qIHBvc3NpYmxlIHRvIGVuYWJsZSBhbGwgb2YgdGhlc2UgKi8KKyAgICAgIC8qIEkyQ19JVF9FUlJJIHwgSTJDX0lUX1RDSXwgSTJDX0lUX1NUT1BJfCBJMkNfSVRfTkFDS0kgfCBJMkNfSVRfQUREUkkgfCBJMkNfSVRfUlhJIHwgSTJDX0lUX1RYSSAqLworICAgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfVFhfSVQpOworICAgIH0KKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFRyYW5zbWl0IGluIHNsYXZlIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBETUEKKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX1NsYXZlX1RyYW5zbWl0X0RNQShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgfQorICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIGhpMmMtPlN0YXRlICAgICAgID0gSEFMX0kyQ19TVEFURV9CVVNZX1RYOworICAgIGhpMmMtPk1vZGUgICAgICAgID0gSEFMX0kyQ19NT0RFX1NMQVZFOworICAgIGhpMmMtPkVycm9yQ29kZSAgID0gSEFMX0kyQ19FUlJPUl9OT05FOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaGkyYy0+cEJ1ZmZQdHIgICAgPSBwRGF0YTsKKyAgICBoaTJjLT5YZmVyQ291bnQgICA9IFNpemU7CisgICAgaGkyYy0+WGZlclNpemUgICAgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgaGkyYy0+WGZlck9wdGlvbnMgPSBJMkNfTk9fT1BUSU9OX0ZSQU1FOworICAgIGhpMmMtPlhmZXJJU1IgICAgID0gSTJDX1NsYXZlX0lTUl9ETUE7CisKKyAgICAvKiBTZXQgdGhlIEkyQyBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBoaTJjLT5oZG1hdHgtPlhmZXJDcGx0Q2FsbGJhY2sgPSBJMkNfRE1BU2xhdmVUcmFuc21pdENwbHQ7CisKKyAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgIGhpMmMtPmhkbWF0eC0+WGZlckVycm9yQ2FsbGJhY2sgPSBJMkNfRE1BRXJyb3I7CisKKyAgICAvKiBTZXQgdGhlIHVudXNlZCBETUEgY2FsbGJhY2tzIHRvIE5VTEwgKi8KKyAgICBoaTJjLT5oZG1hdHgtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gTlVMTDsKKyAgICBoaTJjLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICBIQUxfRE1BX1N0YXJ0X0lUKGhpMmMtPmhkbWF0eCwgKHVpbnQzMl90KXBEYXRhLCAodWludDMyX3QpJmhpMmMtPkluc3RhbmNlLT5UWERSLCBoaTJjLT5YZmVyU2l6ZSk7CisKKyAgICAvKiBFbmFibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgJj0gfkkyQ19DUjJfTkFDSzsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBOb3RlIDogVGhlIEkyQyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIEkyQyBpbnRlcnJ1cHQgaGFuZGxlIGV4ZWN1dGlvbiBiZWZvcmUgY3VycmVudAorICAgICAgICAgICAgICBwcm9jZXNzIHVubG9jayAqLworICAgIC8qIEVuYWJsZSBFUlIsIFNUT1AsIE5BQ0ssIEFERFIgaW50ZXJydXB0cyAqLworICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX0xJU1RFTl9JVCk7CisKKyAgICAvKiBFbmFibGUgRE1BIFJlcXVlc3QgKi8KKyAgICBoaTJjLT5JbnN0YW5jZS0+Q1IxIHw9IEkyQ19DUjFfVFhETUFFTjsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZSBpbiBzbGF2ZSBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggRE1BCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9SZWNlaXZlX0RNQShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgfQorICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIGhpMmMtPlN0YXRlICAgICAgID0gSEFMX0kyQ19TVEFURV9CVVNZX1JYOworICAgIGhpMmMtPk1vZGUgICAgICAgID0gSEFMX0kyQ19NT0RFX1NMQVZFOworICAgIGhpMmMtPkVycm9yQ29kZSAgID0gSEFMX0kyQ19FUlJPUl9OT05FOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaGkyYy0+cEJ1ZmZQdHIgICAgPSBwRGF0YTsKKyAgICBoaTJjLT5YZmVyQ291bnQgICA9IFNpemU7CisgICAgaGkyYy0+WGZlclNpemUgICAgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgaGkyYy0+WGZlck9wdGlvbnMgPSBJMkNfTk9fT1BUSU9OX0ZSQU1FOworICAgIGhpMmMtPlhmZXJJU1IgICAgID0gSTJDX1NsYXZlX0lTUl9ETUE7CisKKyAgICAvKiBTZXQgdGhlIEkyQyBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBoaTJjLT5oZG1hcngtPlhmZXJDcGx0Q2FsbGJhY2sgPSBJMkNfRE1BU2xhdmVSZWNlaXZlQ3BsdDsKKworICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgaGkyYy0+aGRtYXJ4LT5YZmVyRXJyb3JDYWxsYmFjayA9IEkyQ19ETUFFcnJvcjsKKworICAgIC8qIFNldCB0aGUgdW51c2VkIERNQSBjYWxsYmFja3MgdG8gTlVMTCAqLworICAgIGhpMmMtPmhkbWFyeC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBOVUxMOworICAgIGhpMmMtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgIEhBTF9ETUFfU3RhcnRfSVQoaGkyYy0+aGRtYXJ4LCAodWludDMyX3QpJmhpMmMtPkluc3RhbmNlLT5SWERSLCAodWludDMyX3QpcERhdGEsIGhpMmMtPlhmZXJTaXplKTsKKworICAgIC8qIEVuYWJsZSBBZGRyZXNzIEFja25vd2xlZGdlICovCisgICAgaGkyYy0+SW5zdGFuY2UtPkNSMiAmPSB+STJDX0NSMl9OQUNLOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIC8qIE5vdGUgOiBUaGUgSTJDIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgSTJDIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisgICAgLyogRW5hYmxlIEVSUiwgU1RPUCwgTkFDSywgQUREUiBpbnRlcnJ1cHRzICovCisgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfTElTVEVOX0lUKTsKKworICAgIC8qIEVuYWJsZSBETUEgUmVxdWVzdCAqLworICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgfD0gSTJDX0NSMV9SWERNQUVOOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKy8qKgorICAqIEBicmllZiAgV3JpdGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZSB0byBhIHNwZWNpZmljIG1lbW9yeSBhZGRyZXNzCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3MgVGFyZ2V0IGRldmljZSBhZGRyZXNzOiBUaGUgZGV2aWNlIDcgYml0cyBhZGRyZXNzIHZhbHVlCisgICogICAgICAgICBpbiBkYXRhc2hlZXQgbXVzdCBiZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJlZm9yZSBjYWxsaW5nIHRoZSBpbnRlcmZhY2UKKyAgKiBAcGFyYW0gIE1lbUFkZHJlc3MgSW50ZXJuYWwgbWVtb3J5IGFkZHJlc3MKKyAgKiBAcGFyYW0gIE1lbUFkZFNpemUgU2l6ZSBvZiBpbnRlcm5hbCBtZW1vcnkgYWRkcmVzcworICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWVtX1dyaXRlKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRTaXplLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gMFU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19NRU1BRERfU0laRShNZW1BZGRTaXplKSk7CisKKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50Ki8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgaWYgKEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpMmMsIEkyQ19GTEFHX0JVU1ksIFNFVCwgSTJDX1RJTUVPVVRfQlVTWSwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKworICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9UWDsKKyAgICBoaTJjLT5Nb2RlICAgICAgPSBIQUxfSTJDX01PREVfTUVNOworICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICA9IHBEYXRhOworICAgIGhpMmMtPlhmZXJDb3VudCA9IFNpemU7CisgICAgaGkyYy0+WGZlcklTUiAgID0gTlVMTDsKKworICAgIC8qIFNlbmQgU2xhdmUgQWRkcmVzcyBhbmQgTWVtb3J5IEFkZHJlc3MgKi8KKyAgICBpZiAoSTJDX1JlcXVlc3RNZW1vcnlXcml0ZShoaTJjLCBEZXZBZGRyZXNzLCBNZW1BZGRyZXNzLCBNZW1BZGRTaXplLCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICBpZiAoaGkyYy0+RXJyb3JDb2RlID09IEhBTF9JMkNfRVJST1JfQUYpCisgICAgICB7CisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKworICAgIC8qIFNldCBOQllURVMgdG8gd3JpdGUgYW5kIHJlbG9hZCBpZiBoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSAqLworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsIGhpMmMtPlhmZXJTaXplLCBJMkNfUkVMT0FEX01PREUsIEkyQ19OT19TVEFSVFNUT1ApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgaGkyYy0+WGZlclNpemUsIEkyQ19BVVRPRU5EX01PREUsIEkyQ19OT19TVEFSVFNUT1ApOworICAgIH0KKworICAgIGRvCisgICAgeworICAgICAgLyogV2FpdCB1bnRpbCBUWElTIGZsYWcgaXMgc2V0ICovCisgICAgICBpZiAoSTJDX1dhaXRPblRYSVNGbGFnVW50aWxUaW1lb3V0KGhpMmMsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBpZiAoaGkyYy0+RXJyb3JDb2RlID09IEhBTF9JMkNfRVJST1JfQUYpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBXcml0ZSBkYXRhIHRvIFRYRFIgKi8KKyAgICAgIGhpMmMtPkluc3RhbmNlLT5UWERSID0gKCpoaTJjLT5wQnVmZlB0cisrKTsKKyAgICAgIGhpMmMtPlhmZXJDb3VudC0tOworICAgICAgaGkyYy0+WGZlclNpemUtLTsKKworICAgICAgaWYgKChoaTJjLT5YZmVyU2l6ZSA9PSAwVSkgJiYgKGhpMmMtPlhmZXJDb3VudCAhPSAwVSkpCisgICAgICB7CisgICAgICAgIC8qIFdhaXQgdW50aWwgVENSIGZsYWcgaXMgc2V0ICovCisgICAgICAgIGlmIChJMkNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoaTJjLCBJMkNfRkxBR19UQ1IsIFJFU0VULCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICAgICAgeworICAgICAgICAgIGhpMmMtPlhmZXJTaXplID0gTUFYX05CWVRFX1NJWkU7CisgICAgICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsIGhpMmMtPlhmZXJTaXplLCBJMkNfUkVMT0FEX01PREUsIEkyQ19OT19TVEFSVFNUT1ApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGhpMmMtPlhmZXJTaXplID0gaGkyYy0+WGZlckNvdW50OworICAgICAgICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCBoaTJjLT5YZmVyU2l6ZSwgSTJDX0FVVE9FTkRfTU9ERSwgSTJDX05PX1NUQVJUU1RPUCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIH0KKyAgICB3aGlsZSAoaGkyYy0+WGZlckNvdW50ID4gMFUpOworCisgICAgLyogTm8gbmVlZCB0byBDaGVjayBUQyBmbGFnLCB3aXRoIEFVVE9FTkQgbW9kZSB0aGUgc3RvcCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCAqLworICAgIC8qIFdhaXQgdW50aWwgU1RPUEYgZmxhZyBpcyByZXNldCAqLworICAgIGlmIChJMkNfV2FpdE9uU1RPUEZsYWdVbnRpbFRpbWVvdXQoaGkyYywgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgaWYgKGhpMmMtPkVycm9yQ29kZSA9PSBIQUxfSTJDX0VSUk9SX0FGKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorCisgICAgLyogQ2xlYXIgU1RPUCBGbGFnICovCisgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfU1RPUEYpOworCisgICAgLyogQ2xlYXIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCisgICAgSTJDX1JFU0VUX0NSMihoaTJjKTsKKworICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKyAgICBoaTJjLT5Nb2RlICA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlIGZyb20gYSBzcGVjaWZpYyBtZW1vcnkgYWRkcmVzcworICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIFRhcmdldCBkZXZpY2UgYWRkcmVzczogVGhlIGRldmljZSA3IGJpdHMgYWRkcmVzcyB2YWx1ZQorICAqICAgICAgICAgaW4gZGF0YXNoZWV0IG11c3QgYmUgc2hpZnRlZCB0byB0aGUgbGVmdCBiZWZvcmUgY2FsbGluZyB0aGUgaW50ZXJmYWNlCisgICogQHBhcmFtICBNZW1BZGRyZXNzIEludGVybmFsIG1lbW9yeSBhZGRyZXNzCisgICogQHBhcmFtICBNZW1BZGRTaXplIFNpemUgb2YgaW50ZXJuYWwgbWVtb3J5IGFkZHJlc3MKKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01lbV9SZWFkKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRTaXplLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gMFU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19NRU1BRERfU0laRShNZW1BZGRTaXplKSk7CisKKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50Ki8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgaWYgKEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpMmMsIEkyQ19GTEFHX0JVU1ksIFNFVCwgSTJDX1RJTUVPVVRfQlVTWSwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKworICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9SWDsKKyAgICBoaTJjLT5Nb2RlICAgICAgPSBIQUxfSTJDX01PREVfTUVNOworICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICA9IHBEYXRhOworICAgIGhpMmMtPlhmZXJDb3VudCA9IFNpemU7CisgICAgaGkyYy0+WGZlcklTUiAgID0gTlVMTDsKKworICAgIC8qIFNlbmQgU2xhdmUgQWRkcmVzcyBhbmQgTWVtb3J5IEFkZHJlc3MgKi8KKyAgICBpZiAoSTJDX1JlcXVlc3RNZW1vcnlSZWFkKGhpMmMsIERldkFkZHJlc3MsIE1lbUFkZHJlc3MsIE1lbUFkZFNpemUsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIGlmIChoaTJjLT5FcnJvckNvZGUgPT0gSEFMX0kyQ19FUlJPUl9BRikKKyAgICAgIHsKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorCisgICAgLyogU2VuZCBTbGF2ZSBBZGRyZXNzICovCisgICAgLyogU2V0IE5CWVRFUyB0byB3cml0ZSBhbmQgcmVsb2FkIGlmIGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFIGFuZCBnZW5lcmF0ZSBSRVNUQVJUICovCisgICAgaWYgKGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFKQorICAgIHsKKyAgICAgIGhpMmMtPlhmZXJTaXplID0gTUFYX05CWVRFX1NJWkU7CisgICAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgaGkyYy0+WGZlclNpemUsIEkyQ19SRUxPQURfTU9ERSwgSTJDX0dFTkVSQVRFX1NUQVJUX1JFQUQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgaGkyYy0+WGZlclNpemUsIEkyQ19BVVRPRU5EX01PREUsIEkyQ19HRU5FUkFURV9TVEFSVF9SRUFEKTsKKyAgICB9CisKKyAgICBkbworICAgIHsKKyAgICAgIC8qIFdhaXQgdW50aWwgUlhORSBmbGFnIGlzIHNldCAqLworICAgICAgaWYgKEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpMmMsIEkyQ19GTEFHX1JYTkUsIFJFU0VULCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorCisgICAgICAvKiBSZWFkIGRhdGEgZnJvbSBSWERSICovCisgICAgICAoKmhpMmMtPnBCdWZmUHRyKyspID0gaGkyYy0+SW5zdGFuY2UtPlJYRFI7CisgICAgICBoaTJjLT5YZmVyU2l6ZS0tOworICAgICAgaGkyYy0+WGZlckNvdW50LS07CisKKyAgICAgIGlmICgoaGkyYy0+WGZlclNpemUgPT0gMFUpICYmIChoaTJjLT5YZmVyQ291bnQgIT0gMFUpKQorICAgICAgeworICAgICAgICAvKiBXYWl0IHVudGlsIFRDUiBmbGFnIGlzIHNldCAqLworICAgICAgICBpZiAoSTJDX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaGkyYywgSTJDX0ZMQUdfVENSLCBSRVNFVCwgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCBoaTJjLT5YZmVyU2l6ZSwgSTJDX1JFTE9BRF9NT0RFLCBJMkNfTk9fU1RBUlRTVE9QKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBoaTJjLT5YZmVyU2l6ZSA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICAgICAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgaGkyYy0+WGZlclNpemUsIEkyQ19BVVRPRU5EX01PREUsIEkyQ19OT19TVEFSVFNUT1ApOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHdoaWxlIChoaTJjLT5YZmVyQ291bnQgPiAwVSk7CisKKyAgICAvKiBObyBuZWVkIHRvIENoZWNrIFRDIGZsYWcsIHdpdGggQVVUT0VORCBtb2RlIHRoZSBzdG9wIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkICovCisgICAgLyogV2FpdCB1bnRpbCBTVE9QRiBmbGFnIGlzIHJlc2V0ICovCisgICAgaWYgKEkyQ19XYWl0T25TVE9QRmxhZ1VudGlsVGltZW91dChoaTJjLCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICBpZiAoaGkyYy0+RXJyb3JDb2RlID09IEhBTF9JMkNfRVJST1JfQUYpCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDbGVhciBTVE9QIEZsYWcgKi8KKyAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19TVE9QRik7CisKKyAgICAvKiBDbGVhciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KKyAgICBJMkNfUkVTRVRfQ1IyKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgIGhpMmMtPk1vZGUgID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKy8qKgorICAqIEBicmllZiAgV3JpdGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQgdG8gYSBzcGVjaWZpYyBtZW1vcnkgYWRkcmVzcworICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIFRhcmdldCBkZXZpY2UgYWRkcmVzczogVGhlIGRldmljZSA3IGJpdHMgYWRkcmVzcyB2YWx1ZQorICAqICAgICAgICAgaW4gZGF0YXNoZWV0IG11c3QgYmUgc2hpZnRlZCB0byB0aGUgbGVmdCBiZWZvcmUgY2FsbGluZyB0aGUgaW50ZXJmYWNlCisgICogQHBhcmFtICBNZW1BZGRyZXNzIEludGVybmFsIG1lbW9yeSBhZGRyZXNzCisgICogQHBhcmFtICBNZW1BZGRTaXplIFNpemUgb2YgaW50ZXJuYWwgbWVtb3J5IGFkZHJlc3MKKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NZW1fV3JpdGVfSVQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZFNpemUsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKyAgdWludDMyX3QgeGZlcm1vZGUgPSAwVTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJDX01FTUFERF9TSVpFKE1lbUFkZFNpemUpKTsKKworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgIH0KKworICAgIGlmIChfX0hBTF9JMkNfR0VUX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQlVTWSkgPT0gU0VUKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50Ki8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgaGkyYy0+U3RhdGUgICAgICAgPSBIQUxfSTJDX1NUQVRFX0JVU1lfVFg7CisgICAgaGkyYy0+TW9kZSAgICAgICAgPSBIQUxfSTJDX01PREVfTUVNOworICAgIGhpMmMtPkVycm9yQ29kZSAgID0gSEFMX0kyQ19FUlJPUl9OT05FOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaGkyYy0+cEJ1ZmZQdHIgICAgPSBwRGF0YTsKKyAgICBoaTJjLT5YZmVyQ291bnQgICA9IFNpemU7CisgICAgaGkyYy0+WGZlck9wdGlvbnMgPSBJMkNfTk9fT1BUSU9OX0ZSQU1FOworICAgIGhpMmMtPlhmZXJJU1IgICAgID0gSTJDX01hc3Rlcl9JU1JfSVQ7CisKKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICAgIHhmZXJtb2RlID0gSTJDX1JFTE9BRF9NT0RFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgICB4ZmVybW9kZSA9IEkyQ19BVVRPRU5EX01PREU7CisgICAgfQorCisgICAgLyogU2VuZCBTbGF2ZSBBZGRyZXNzIGFuZCBNZW1vcnkgQWRkcmVzcyAqLworICAgIGlmIChJMkNfUmVxdWVzdE1lbW9yeVdyaXRlKGhpMmMsIERldkFkZHJlc3MsIE1lbUFkZHJlc3MsIE1lbUFkZFNpemUsIEkyQ19USU1FT1VUX0ZMQUcsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIGlmIChoaTJjLT5FcnJvckNvZGUgPT0gSEFMX0kyQ19FUlJPUl9BRikKKyAgICAgIHsKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorCisgICAgLyogU2V0IE5CWVRFUyB0byB3cml0ZSBhbmQgcmVsb2FkIGlmIGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFIGFuZCBnZW5lcmF0ZSBSRVNUQVJUICovCisgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsIGhpMmMtPlhmZXJTaXplLCB4ZmVybW9kZSwgSTJDX05PX1NUQVJUU1RPUCk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgLyogTm90ZSA6IFRoZSBJMkMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBJMkMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKworICAgIC8qIEVuYWJsZSBFUlIsIFRDLCBTVE9QLCBOQUNLLCBUWEkgaW50ZXJydXB0ICovCisgICAgLyogcG9zc2libGUgdG8gZW5hYmxlIGFsbCBvZiB0aGVzZSAqLworICAgIC8qIEkyQ19JVF9FUlJJIHwgSTJDX0lUX1RDSXwgSTJDX0lUX1NUT1BJfCBJMkNfSVRfTkFDS0kgfCBJMkNfSVRfQUREUkkgfCBJMkNfSVRfUlhJIHwgSTJDX0lUX1RYSSAqLworICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1RYX0lUKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdCBmcm9tIGEgc3BlY2lmaWMgbWVtb3J5IGFkZHJlc3MKKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBUYXJnZXQgZGV2aWNlIGFkZHJlc3M6IFRoZSBkZXZpY2UgNyBiaXRzIGFkZHJlc3MgdmFsdWUKKyAgKiAgICAgICAgIGluIGRhdGFzaGVldCBtdXN0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYmVmb3JlIGNhbGxpbmcgdGhlIGludGVyZmFjZQorICAqIEBwYXJhbSAgTWVtQWRkcmVzcyBJbnRlcm5hbCBtZW1vcnkgYWRkcmVzcworICAqIEBwYXJhbSAgTWVtQWRkU2l6ZSBTaXplIG9mIGludGVybmFsIG1lbW9yeSBhZGRyZXNzCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWVtX1JlYWRfSVQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZFNpemUsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKyAgdWludDMyX3QgeGZlcm1vZGUgPSAwVTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJDX01FTUFERF9TSVpFKE1lbUFkZFNpemUpKTsKKworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgIH0KKworICAgIGlmIChfX0hBTF9JMkNfR0VUX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQlVTWSkgPT0gU0VUKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50Ki8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgaGkyYy0+U3RhdGUgICAgICAgPSBIQUxfSTJDX1NUQVRFX0JVU1lfUlg7CisgICAgaGkyYy0+TW9kZSAgICAgICAgPSBIQUxfSTJDX01PREVfTUVNOworICAgIGhpMmMtPkVycm9yQ29kZSAgID0gSEFMX0kyQ19FUlJPUl9OT05FOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaGkyYy0+cEJ1ZmZQdHIgICAgPSBwRGF0YTsKKyAgICBoaTJjLT5YZmVyQ291bnQgICA9IFNpemU7CisgICAgaGkyYy0+WGZlck9wdGlvbnMgPSBJMkNfTk9fT1BUSU9OX0ZSQU1FOworICAgIGhpMmMtPlhmZXJJU1IgICAgID0gSTJDX01hc3Rlcl9JU1JfSVQ7CisKKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICAgIHhmZXJtb2RlID0gSTJDX1JFTE9BRF9NT0RFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgICB4ZmVybW9kZSA9IEkyQ19BVVRPRU5EX01PREU7CisgICAgfQorCisgICAgLyogU2VuZCBTbGF2ZSBBZGRyZXNzIGFuZCBNZW1vcnkgQWRkcmVzcyAqLworICAgIGlmIChJMkNfUmVxdWVzdE1lbW9yeVJlYWQoaGkyYywgRGV2QWRkcmVzcywgTWVtQWRkcmVzcywgTWVtQWRkU2l6ZSwgSTJDX1RJTUVPVVRfRkxBRywgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgaWYgKGhpMmMtPkVycm9yQ29kZSA9PSBIQUxfSTJDX0VSUk9SX0FGKQorICAgICAgeworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTZXQgTkJZVEVTIHRvIHdyaXRlIGFuZCByZWxvYWQgaWYgaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUgYW5kIGdlbmVyYXRlIFJFU1RBUlQgKi8KKyAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgaGkyYy0+WGZlclNpemUsIHhmZXJtb2RlLCBJMkNfR0VORVJBVEVfU1RBUlRfUkVBRCk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgLyogTm90ZSA6IFRoZSBJMkMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBJMkMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKworICAgIC8qIEVuYWJsZSBFUlIsIFRDLCBTVE9QLCBOQUNLLCBSWEkgaW50ZXJydXB0ICovCisgICAgLyogcG9zc2libGUgdG8gZW5hYmxlIGFsbCBvZiB0aGVzZSAqLworICAgIC8qIEkyQ19JVF9FUlJJIHwgSTJDX0lUX1RDSXwgSTJDX0lUX1NUT1BJfCBJMkNfSVRfTkFDS0kgfCBJMkNfSVRfQUREUkkgfCBJMkNfSVRfUlhJIHwgSTJDX0lUX1RYSSAqLworICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1JYX0lUKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggRE1BIHRvIGEgc3BlY2lmaWMgbWVtb3J5IGFkZHJlc3MKKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBUYXJnZXQgZGV2aWNlIGFkZHJlc3M6IFRoZSBkZXZpY2UgNyBiaXRzIGFkZHJlc3MgdmFsdWUKKyAgKiAgICAgICAgIGluIGRhdGFzaGVldCBtdXN0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYmVmb3JlIGNhbGxpbmcgdGhlIGludGVyZmFjZQorICAqIEBwYXJhbSAgTWVtQWRkcmVzcyBJbnRlcm5hbCBtZW1vcnkgYWRkcmVzcworICAqIEBwYXJhbSAgTWVtQWRkU2l6ZSBTaXplIG9mIGludGVybmFsIG1lbW9yeSBhZGRyZXNzCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWVtX1dyaXRlX0RNQShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDE2X3QgTWVtQWRkcmVzcywgdWludDE2X3QgTWVtQWRkU2l6ZSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDBVOworICB1aW50MzJfdCB4ZmVybW9kZSA9IDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfTUVNQUREX1NJWkUoTWVtQWRkU2l6ZSkpOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgfQorCisgICAgaWYgKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBJMkNfRkxBR19CVVNZKSA9PSBTRVQpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9CVVNZOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICBoaTJjLT5TdGF0ZSAgICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9UWDsKKyAgICBoaTJjLT5Nb2RlICAgICAgICA9IEhBTF9JMkNfTU9ERV9NRU07CisgICAgaGkyYy0+RXJyb3JDb2RlICAgPSBIQUxfSTJDX0VSUk9SX05PTkU7CisKKyAgICAvKiBQcmVwYXJlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICBoaTJjLT5wQnVmZlB0ciAgICA9IHBEYXRhOworICAgIGhpMmMtPlhmZXJDb3VudCAgID0gU2l6ZTsKKyAgICBoaTJjLT5YZmVyT3B0aW9ucyA9IEkyQ19OT19PUFRJT05fRlJBTUU7CisgICAgaGkyYy0+WGZlcklTUiAgICAgPSBJMkNfTWFzdGVyX0lTUl9ETUE7CisKKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICAgIHhmZXJtb2RlID0gSTJDX1JFTE9BRF9NT0RFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgICB4ZmVybW9kZSA9IEkyQ19BVVRPRU5EX01PREU7CisgICAgfQorCisgICAgLyogU2VuZCBTbGF2ZSBBZGRyZXNzIGFuZCBNZW1vcnkgQWRkcmVzcyAqLworICAgIGlmIChJMkNfUmVxdWVzdE1lbW9yeVdyaXRlKGhpMmMsIERldkFkZHJlc3MsIE1lbUFkZHJlc3MsIE1lbUFkZFNpemUsIEkyQ19USU1FT1VUX0ZMQUcsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIGlmIChoaTJjLT5FcnJvckNvZGUgPT0gSEFMX0kyQ19FUlJPUl9BRikKKyAgICAgIHsKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorCisgICAgLyogU2V0IHRoZSBJMkMgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgaGkyYy0+aGRtYXR4LT5YZmVyQ3BsdENhbGxiYWNrID0gSTJDX0RNQU1hc3RlclRyYW5zbWl0Q3BsdDsKKworICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgaGkyYy0+aGRtYXR4LT5YZmVyRXJyb3JDYWxsYmFjayA9IEkyQ19ETUFFcnJvcjsKKworICAgIC8qIFNldCB0aGUgdW51c2VkIERNQSBjYWxsYmFja3MgdG8gTlVMTCAqLworICAgIGhpMmMtPmhkbWF0eC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBOVUxMOworICAgIGhpMmMtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgIEhBTF9ETUFfU3RhcnRfSVQoaGkyYy0+aGRtYXR4LCAodWludDMyX3QpcERhdGEsICh1aW50MzJfdCkmaGkyYy0+SW5zdGFuY2UtPlRYRFIsIGhpMmMtPlhmZXJTaXplKTsKKworICAgIC8qIFNlbmQgU2xhdmUgQWRkcmVzcyAqLworICAgIC8qIFNldCBOQllURVMgdG8gd3JpdGUgYW5kIHJlbG9hZCBpZiBoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSBhbmQgZ2VuZXJhdGUgUkVTVEFSVCAqLworICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCBoaTJjLT5YZmVyU2l6ZSwgeGZlcm1vZGUsIEkyQ19OT19TVEFSVFNUT1ApOworCisgICAgLyogVXBkYXRlIFhmZXJDb3VudCB2YWx1ZSAqLworICAgIGhpMmMtPlhmZXJDb3VudCAtPSBoaTJjLT5YZmVyU2l6ZTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBOb3RlIDogVGhlIEkyQyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIEkyQyBpbnRlcnJ1cHQgaGFuZGxlIGV4ZWN1dGlvbiBiZWZvcmUgY3VycmVudAorICAgICAgICAgICAgICBwcm9jZXNzIHVubG9jayAqLworICAgIC8qIEVuYWJsZSBFUlIgYW5kIE5BQ0sgaW50ZXJydXB0cyAqLworICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX0VSUk9SX0lUKTsKKworICAgIC8qIEVuYWJsZSBETUEgUmVxdWVzdCAqLworICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgfD0gSTJDX0NSMV9UWERNQUVOOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZWFkcyBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQSBmcm9tIGEgc3BlY2lmaWMgbWVtb3J5IGFkZHJlc3MuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3MgVGFyZ2V0IGRldmljZSBhZGRyZXNzOiBUaGUgZGV2aWNlIDcgYml0cyBhZGRyZXNzIHZhbHVlCisgICogICAgICAgICBpbiBkYXRhc2hlZXQgbXVzdCBiZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJlZm9yZSBjYWxsaW5nIHRoZSBpbnRlcmZhY2UKKyAgKiBAcGFyYW0gIE1lbUFkZHJlc3MgSW50ZXJuYWwgbWVtb3J5IGFkZHJlc3MKKyAgKiBAcGFyYW0gIE1lbUFkZFNpemUgU2l6ZSBvZiBpbnRlcm5hbCBtZW1vcnkgYWRkcmVzcworICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSByZWFkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01lbV9SZWFkX0RNQShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDE2X3QgTWVtQWRkcmVzcywgdWludDE2X3QgTWVtQWRkU2l6ZSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDBVOworICB1aW50MzJfdCB4ZmVybW9kZSA9IDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfTUVNQUREX1NJWkUoTWVtQWRkU2l6ZSkpOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgfQorCisgICAgaWYgKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBJMkNfRkxBR19CVVNZKSA9PSBTRVQpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9CVVNZOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICBoaTJjLT5TdGF0ZSAgICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9SWDsKKyAgICBoaTJjLT5Nb2RlICAgICAgICA9IEhBTF9JMkNfTU9ERV9NRU07CisgICAgaGkyYy0+RXJyb3JDb2RlICAgPSBIQUxfSTJDX0VSUk9SX05PTkU7CisKKyAgICAvKiBQcmVwYXJlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICBoaTJjLT5wQnVmZlB0ciAgICA9IHBEYXRhOworICAgIGhpMmMtPlhmZXJDb3VudCAgID0gU2l6ZTsKKyAgICBoaTJjLT5YZmVyT3B0aW9ucyA9IEkyQ19OT19PUFRJT05fRlJBTUU7CisgICAgaGkyYy0+WGZlcklTUiAgICAgPSBJMkNfTWFzdGVyX0lTUl9ETUE7CisKKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICAgIHhmZXJtb2RlID0gSTJDX1JFTE9BRF9NT0RFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgICB4ZmVybW9kZSA9IEkyQ19BVVRPRU5EX01PREU7CisgICAgfQorCisgICAgLyogU2VuZCBTbGF2ZSBBZGRyZXNzIGFuZCBNZW1vcnkgQWRkcmVzcyAqLworICAgIGlmIChJMkNfUmVxdWVzdE1lbW9yeVJlYWQoaGkyYywgRGV2QWRkcmVzcywgTWVtQWRkcmVzcywgTWVtQWRkU2l6ZSwgSTJDX1RJTUVPVVRfRkxBRywgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgaWYgKGhpMmMtPkVycm9yQ29kZSA9PSBIQUxfSTJDX0VSUk9SX0FGKQorICAgICAgeworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIEkyQyBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBoaTJjLT5oZG1hcngtPlhmZXJDcGx0Q2FsbGJhY2sgPSBJMkNfRE1BTWFzdGVyUmVjZWl2ZUNwbHQ7CisKKyAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgIGhpMmMtPmhkbWFyeC0+WGZlckVycm9yQ2FsbGJhY2sgPSBJMkNfRE1BRXJyb3I7CisKKyAgICAvKiBTZXQgdGhlIHVudXNlZCBETUEgY2FsbGJhY2tzIHRvIE5VTEwgKi8KKyAgICBoaTJjLT5oZG1hcngtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gTlVMTDsKKyAgICBoaTJjLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICBIQUxfRE1BX1N0YXJ0X0lUKGhpMmMtPmhkbWFyeCwgKHVpbnQzMl90KSZoaTJjLT5JbnN0YW5jZS0+UlhEUiwgKHVpbnQzMl90KXBEYXRhLCBoaTJjLT5YZmVyU2l6ZSk7CisKKyAgICAvKiBTZXQgTkJZVEVTIHRvIHdyaXRlIGFuZCByZWxvYWQgaWYgaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUgYW5kIGdlbmVyYXRlIFJFU1RBUlQgKi8KKyAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgaGkyYy0+WGZlclNpemUsIHhmZXJtb2RlLCBJMkNfR0VORVJBVEVfU1RBUlRfUkVBRCk7CisKKyAgICAvKiBVcGRhdGUgWGZlckNvdW50IHZhbHVlICovCisgICAgaGkyYy0+WGZlckNvdW50IC09IGhpMmMtPlhmZXJTaXplOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIC8qIEVuYWJsZSBETUEgUmVxdWVzdCAqLworICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgfD0gSTJDX0NSMV9SWERNQUVOOworCisgICAgLyogTm90ZSA6IFRoZSBJMkMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBJMkMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKyAgICAvKiBFbmFibGUgRVJSIGFuZCBOQUNLIGludGVycnVwdHMgKi8KKyAgICBJMkNfRW5hYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9FUlJPUl9JVCk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrcyBpZiB0YXJnZXQgZGV2aWNlIGlzIHJlYWR5IGZvciBjb21tdW5pY2F0aW9uLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHdpdGggTWVtb3J5IGRldmljZXMKKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBUYXJnZXQgZGV2aWNlIGFkZHJlc3M6IFRoZSBkZXZpY2UgNyBiaXRzIGFkZHJlc3MgdmFsdWUKKyAgKiAgICAgICAgIGluIGRhdGFzaGVldCBtdXN0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYmVmb3JlIGNhbGxpbmcgdGhlIGludGVyZmFjZQorICAqIEBwYXJhbSAgVHJpYWxzIE51bWJlciBvZiB0cmlhbHMKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19Jc0RldmljZVJlYWR5KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50MzJfdCBUcmlhbHMsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDBVOworCisgIF9fSU8gdWludDMyX3QgSTJDX1RyaWFscyA9IDBVOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBJMkNfRkxBR19CVVNZKSA9PSBTRVQpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9CVVNZOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9CVVNZOworICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIGRvCisgICAgeworICAgICAgLyogR2VuZXJhdGUgU3RhcnQgKi8KKyAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgPSBJMkNfR0VORVJBVEVfU1RBUlQoaGkyYy0+SW5pdC5BZGRyZXNzaW5nTW9kZSwgRGV2QWRkcmVzcyk7CisKKyAgICAgIC8qIE5vIG5lZWQgdG8gQ2hlY2sgVEMgZmxhZywgd2l0aCBBVVRPRU5EIG1vZGUgdGhlIHN0b3AgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgKi8KKyAgICAgIC8qIFdhaXQgdW50aWwgU1RPUEYgZmxhZyBpcyBzZXQgb3IgYSBOQUNLIGZsYWcgaXMgc2V0Ki8KKyAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgICAgICB3aGlsZSAoKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBJMkNfRkxBR19TVE9QRikgPT0gUkVTRVQpICYmIChfX0hBTF9JMkNfR0VUX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQUYpID09IFJFU0VUKSAmJiAoaGkyYy0+U3RhdGUgIT0gSEFMX0kyQ19TVEFURV9USU1FT1VUKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICAgICAgeworICAgICAgICAgIGlmICgoVGltZW91dCA9PSAwVSkgfHwgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIERldmljZSBpcyByZWFkeSAqLworICAgICAgICAgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgICAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBDaGVjayBpZiB0aGUgTkFDS0YgZmxhZyBoYXMgbm90IGJlZW4gc2V0ICovCisgICAgICBpZiAoX19IQUxfSTJDX0dFVF9GTEFHKGhpMmMsIEkyQ19GTEFHX0FGKSA9PSBSRVNFVCkKKyAgICAgIHsKKyAgICAgICAgLyogV2FpdCB1bnRpbCBTVE9QRiBmbGFnIGlzIHJlc2V0ICovCisgICAgICAgIGlmIChJMkNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoaTJjLCBJMkNfRkxBR19TVE9QRiwgUkVTRVQsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2xlYXIgU1RPUCBGbGFnICovCisgICAgICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX1NUT1BGKTsKKworICAgICAgICAvKiBEZXZpY2UgaXMgcmVhZHkgKi8KKyAgICAgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAgIHJldHVybiBIQUxfT0s7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFdhaXQgdW50aWwgU1RPUEYgZmxhZyBpcyByZXNldCAqLworICAgICAgICBpZiAoSTJDX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaGkyYywgSTJDX0ZMQUdfU1RPUEYsIFJFU0VULCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENsZWFyIE5BQ0sgRmxhZyAqLworICAgICAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19BRik7CisKKyAgICAgICAgLyogQ2xlYXIgU1RPUCBGbGFnLCBhdXRvIGdlbmVyYXRlZCB3aXRoIGF1dG9lbmQqLworICAgICAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19TVE9QRik7CisgICAgICB9CisKKyAgICAgIC8qIENoZWNrIGlmIHRoZSBtYXhpbXVtIGFsbG93ZWQgbnVtYmVyIG9mIHRyaWFscyBoYXMgYmVlbiByZWFjaGVkICovCisgICAgICBpZiAoSTJDX1RyaWFscysrID09IFRyaWFscykKKyAgICAgIHsKKyAgICAgICAgLyogR2VuZXJhdGUgU3RvcCAqLworICAgICAgICBoaTJjLT5JbnN0YW5jZS0+Q1IyIHw9IEkyQ19DUjJfU1RPUDsKKworICAgICAgICAvKiBXYWl0IHVudGlsIFNUT1BGIGZsYWcgaXMgcmVzZXQgKi8KKyAgICAgICAgaWYgKEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpMmMsIEkyQ19GTEFHX1NUT1BGLCBSRVNFVCwgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBDbGVhciBTVE9QIEZsYWcgKi8KKyAgICAgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfU1RPUEYpOworICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoSTJDX1RyaWFscyA8IFRyaWFscyk7CisKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFNlcXVlbnRpYWwgdHJhbnNtaXQgaW4gbWFzdGVyIEkyQyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0LgorICAqIEBub3RlICAgVGhpcyBpbnRlcmZhY2UgYWxsb3cgdG8gbWFuYWdlIHJlcGVhdGVkIHN0YXJ0IGNvbmRpdGlvbiB3aGVuIGEgZGlyZWN0aW9uIGNoYW5nZSBkdXJpbmcgdHJhbnNmZXIKKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBUYXJnZXQgZGV2aWNlIGFkZHJlc3M6IFRoZSBkZXZpY2UgNyBiaXRzIGFkZHJlc3MgdmFsdWUKKyAgKiAgICAgICAgIGluIGRhdGFzaGVldCBtdXN0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYmVmb3JlIGNhbGxpbmcgdGhlIGludGVyZmFjZQorICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHBhcmFtICBYZmVyT3B0aW9ucyBPcHRpb25zIG9mIFRyYW5zZmVyLCB2YWx1ZSBvZiBAcmVmIEkyQ19YRkVST1BUSU9OUworICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NYXN0ZXJfU2VxdWVudGlhbF9UcmFuc21pdF9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKQoreworICB1aW50MzJfdCB4ZmVybW9kZSA9IDBVOworICB1aW50MzJfdCB4ZmVycmVxdWVzdCA9IEkyQ19HRU5FUkFURV9TVEFSVF9XUklURTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJDX1RSQU5TRkVSX09QVElPTlNfUkVRVUVTVChYZmVyT3B0aW9ucykpOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgICAgID0gSEFMX0kyQ19TVEFURV9CVVNZX1RYOworICAgIGhpMmMtPk1vZGUgICAgICA9IEhBTF9JMkNfTU9ERV9NQVNURVI7CisgICAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9OT05FOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaGkyYy0+cEJ1ZmZQdHIgICAgPSBwRGF0YTsKKyAgICBoaTJjLT5YZmVyQ291bnQgICA9IFNpemU7CisgICAgaGkyYy0+WGZlck9wdGlvbnMgPSBYZmVyT3B0aW9uczsKKyAgICBoaTJjLT5YZmVySVNSICAgICA9IEkyQ19NYXN0ZXJfSVNSX0lUOworCisgICAgLyogSWYgc2l6ZSA+IE1BWF9OQllURV9TSVpFLCB1c2UgcmVsb2FkIG1vZGUgKi8KKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICAgIHhmZXJtb2RlID0gSTJDX1JFTE9BRF9NT0RFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgICB4ZmVybW9kZSA9IGhpMmMtPlhmZXJPcHRpb25zOworICAgIH0KKworICAgIC8qIElmIHRyYW5zZmVyIGRpcmVjdGlvbiBub3QgY2hhbmdlLCBkbyBub3QgZ2VuZXJhdGUgUmVzdGFydCBDb25kaXRpb24gKi8KKyAgICAvKiBNZWFuIFByZXZpb3VzIHN0YXRlIGlzIHNhbWUgYXMgY3VycmVudCBzdGF0ZSAqLworICAgIGlmIChoaTJjLT5QcmV2aW91c1N0YXRlID09IEkyQ19TVEFURV9NQVNURVJfQlVTWV9UWCkKKyAgICB7CisgICAgICB4ZmVycmVxdWVzdCA9IEkyQ19OT19TVEFSVFNUT1A7CisgICAgfQorCisgICAgLyogU2VuZCBTbGF2ZSBBZGRyZXNzIGFuZCBzZXQgTkJZVEVTIHRvIHdyaXRlICovCisgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsIGhpMmMtPlhmZXJTaXplLCB4ZmVybW9kZSwgeGZlcnJlcXVlc3QpOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIC8qIE5vdGUgOiBUaGUgSTJDIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgSTJDIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfVFhfSVQpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBTZXF1ZW50aWFsIHJlY2VpdmUgaW4gbWFzdGVyIEkyQyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0CisgICogQG5vdGUgICBUaGlzIGludGVyZmFjZSBhbGxvdyB0byBtYW5hZ2UgcmVwZWF0ZWQgc3RhcnQgY29uZGl0aW9uIHdoZW4gYSBkaXJlY3Rpb24gY2hhbmdlIGR1cmluZyB0cmFuc2ZlcgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIFRhcmdldCBkZXZpY2UgYWRkcmVzczogVGhlIGRldmljZSA3IGJpdHMgYWRkcmVzcyB2YWx1ZQorICAqICAgICAgICAgaW4gZGF0YXNoZWV0IG11c3QgYmUgc2hpZnRlZCB0byB0aGUgbGVmdCBiZWZvcmUgY2FsbGluZyB0aGUgaW50ZXJmYWNlCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcGFyYW0gIFhmZXJPcHRpb25zIE9wdGlvbnMgb2YgVHJhbnNmZXIsIHZhbHVlIG9mIEByZWYgSTJDX1hGRVJPUFRJT05TCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9TZXF1ZW50aWFsX1JlY2VpdmVfSVQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucykKK3sKKyAgdWludDMyX3QgeGZlcm1vZGUgPSAwVTsKKyAgdWludDMyX3QgeGZlcnJlcXVlc3QgPSBJMkNfR0VORVJBVEVfU1RBUlRfUkVBRDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJDX1RSQU5TRkVSX09QVElPTlNfUkVRVUVTVChYZmVyT3B0aW9ucykpOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgICAgID0gSEFMX0kyQ19TVEFURV9CVVNZX1JYOworICAgIGhpMmMtPk1vZGUgICAgICA9IEhBTF9JMkNfTU9ERV9NQVNURVI7CisgICAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9OT05FOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaGkyYy0+cEJ1ZmZQdHIgICAgPSBwRGF0YTsKKyAgICBoaTJjLT5YZmVyQ291bnQgICA9IFNpemU7CisgICAgaGkyYy0+WGZlck9wdGlvbnMgPSBYZmVyT3B0aW9uczsKKyAgICBoaTJjLT5YZmVySVNSICAgICA9IEkyQ19NYXN0ZXJfSVNSX0lUOworCisgICAgLyogSWYgaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUsIHVzZSByZWxvYWQgbW9kZSAqLworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgeGZlcm1vZGUgPSBJMkNfUkVMT0FEX01PREU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICAgIHhmZXJtb2RlID0gaGkyYy0+WGZlck9wdGlvbnM7CisgICAgfQorCisgICAgLyogSWYgdHJhbnNmZXIgZGlyZWN0aW9uIG5vdCBjaGFuZ2UsIGRvIG5vdCBnZW5lcmF0ZSBSZXN0YXJ0IENvbmRpdGlvbiAqLworICAgIC8qIE1lYW4gUHJldmlvdXMgc3RhdGUgaXMgc2FtZSBhcyBjdXJyZW50IHN0YXRlICovCisgICAgaWYgKGhpMmMtPlByZXZpb3VzU3RhdGUgPT0gSTJDX1NUQVRFX01BU1RFUl9CVVNZX1JYKQorICAgIHsKKyAgICAgIHhmZXJyZXF1ZXN0ID0gSTJDX05PX1NUQVJUU1RPUDsKKyAgICB9CisKKyAgICAvKiBTZW5kIFNsYXZlIEFkZHJlc3MgYW5kIHNldCBOQllURVMgdG8gcmVhZCAqLworICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCBoaTJjLT5YZmVyU2l6ZSwgeGZlcm1vZGUsIHhmZXJyZXF1ZXN0KTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBOb3RlIDogVGhlIEkyQyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIEkyQyBpbnRlcnJ1cHQgaGFuZGxlIGV4ZWN1dGlvbiBiZWZvcmUgY3VycmVudAorICAgICAgICAgICAgICBwcm9jZXNzIHVubG9jayAqLworICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1JYX0lUKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VxdWVudGlhbCB0cmFuc21pdCBpbiBzbGF2ZS9kZXZpY2UgSTJDIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIFRoaXMgaW50ZXJmYWNlIGFsbG93IHRvIG1hbmFnZSByZXBlYXRlZCBzdGFydCBjb25kaXRpb24gd2hlbiBhIGRpcmVjdGlvbiBjaGFuZ2UgZHVyaW5nIHRyYW5zZmVyCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEBwYXJhbSAgWGZlck9wdGlvbnMgT3B0aW9ucyBvZiBUcmFuc2ZlciwgdmFsdWUgb2YgQHJlZiBJMkNfWEZFUk9QVElPTlMKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfU2xhdmVfU2VxdWVudGlhbF9UcmFuc21pdF9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJDX1RSQU5TRkVSX09QVElPTlNfUkVRVUVTVChYZmVyT3B0aW9ucykpOworCisgIGlmICgoaGkyYy0+U3RhdGUgJiBIQUxfSTJDX1NUQVRFX0xJU1RFTikgPT0gSEFMX0kyQ19TVEFURV9MSVNURU4pCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBEaXNhYmxlIEludGVycnVwdHMsIHRvIHByZXZlbnQgcHJlZW1wdGlvbiBkdXJpbmcgdHJlYXRtZW50IGluIGNhc2Ugb2YgbXVsdGljYWxsICovCisgICAgSTJDX0Rpc2FibGVfSVJRKGhpMmMsIEkyQ19YRkVSX0xJU1RFTl9JVCB8IEkyQ19YRkVSX1RYX0lUKTsKKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIC8qIEkyQyBjYW5ub3QgbWFuYWdlIGZ1bGwgZHVwbGV4IGV4Y2hhbmdlIHNvIGRpc2FibGUgcHJldmlvdXMgSVQgZW5hYmxlZCBpZiBhbnkgKi8KKyAgICAvKiBhbmQgdGhlbiB0b2dnbGUgdGhlIEhBTCBzbGF2ZSBSWCBzdGF0ZSB0byBUWCBzdGF0ZSAqLworICAgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX0JVU1lfUlhfTElTVEVOKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgYXNzb2NpYXRlZCBJbnRlcnJ1cHRzICovCisgICAgICBJMkNfRGlzYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfUlhfSVQpOworICAgIH0KKworICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9UWF9MSVNURU47CisgICAgaGkyYy0+TW9kZSAgICAgID0gSEFMX0kyQ19NT0RFX1NMQVZFOworICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIEVuYWJsZSBBZGRyZXNzIEFja25vd2xlZGdlICovCisgICAgaGkyYy0+SW5zdGFuY2UtPkNSMiAmPSB+STJDX0NSMl9OQUNLOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaGkyYy0+cEJ1ZmZQdHIgICAgPSBwRGF0YTsKKyAgICBoaTJjLT5YZmVyQ291bnQgICA9IFNpemU7CisgICAgaGkyYy0+WGZlclNpemUgICAgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgaGkyYy0+WGZlck9wdGlvbnMgPSBYZmVyT3B0aW9uczsKKyAgICBoaTJjLT5YZmVySVNSICAgICA9IEkyQ19TbGF2ZV9JU1JfSVQ7CisKKyAgICBpZiAoSTJDX0dFVF9ESVIoaGkyYykgPT0gSTJDX0RJUkVDVElPTl9SRUNFSVZFKQorICAgIHsKKyAgICAgIC8qIENsZWFyIEFERFIgZmxhZyBhZnRlciBwcmVwYXJlIHRoZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgICAvKiBUaGlzIGFjdGlvbiB3aWxsIGdlbmVyYXRlIGFuIGFja25vd2xlZGdlIHRvIHRoZSBNYXN0ZXIgKi8KKyAgICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FERFIpOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBOb3RlIDogVGhlIEkyQyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgSTJDIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgcHJvY2VzcyB1bmxvY2sgKi8KKyAgICAvKiBSRW5hYmxlIEFERFIgaW50ZXJydXB0ICovCisgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfVFhfSVQgfCBJMkNfWEZFUl9MSVNURU5fSVQpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VxdWVudGlhbCByZWNlaXZlIGluIHNsYXZlL2RldmljZSBJMkMgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdAorICAqIEBub3RlICAgVGhpcyBpbnRlcmZhY2UgYWxsb3cgdG8gbWFuYWdlIHJlcGVhdGVkIHN0YXJ0IGNvbmRpdGlvbiB3aGVuIGEgZGlyZWN0aW9uIGNoYW5nZSBkdXJpbmcgdHJhbnNmZXIKKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHBhcmFtICBYZmVyT3B0aW9ucyBPcHRpb25zIG9mIFRyYW5zZmVyLCB2YWx1ZSBvZiBAcmVmIEkyQ19YRkVST1BUSU9OUworICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9TZXF1ZW50aWFsX1JlY2VpdmVfSVQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19UUkFOU0ZFUl9PUFRJT05TX1JFUVVFU1QoWGZlck9wdGlvbnMpKTsKKworICBpZiAoKGhpMmMtPlN0YXRlICYgSEFMX0kyQ19TVEFURV9MSVNURU4pID09IEhBTF9JMkNfU1RBVEVfTElTVEVOKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogRGlzYWJsZSBJbnRlcnJ1cHRzLCB0byBwcmV2ZW50IHByZWVtcHRpb24gZHVyaW5nIHRyZWF0bWVudCBpbiBjYXNlIG9mIG11bHRpY2FsbCAqLworICAgIEkyQ19EaXNhYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9MSVNURU5fSVQgfCBJMkNfWEZFUl9SWF9JVCk7CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICAvKiBJMkMgY2Fubm90IG1hbmFnZSBmdWxsIGR1cGxleCBleGNoYW5nZSBzbyBkaXNhYmxlIHByZXZpb3VzIElUIGVuYWJsZWQgaWYgYW55ICovCisgICAgLyogYW5kIHRoZW4gdG9nZ2xlIHRoZSBIQUwgc2xhdmUgVFggc3RhdGUgdG8gUlggc3RhdGUgKi8KKyAgICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9CVVNZX1RYX0xJU1RFTikKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIGFzc29jaWF0ZWQgSW50ZXJydXB0cyAqLworICAgICAgSTJDX0Rpc2FibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1RYX0lUKTsKKyAgICB9CisKKyAgICBoaTJjLT5TdGF0ZSAgICAgPSBIQUxfSTJDX1NUQVRFX0JVU1lfUlhfTElTVEVOOworICAgIGhpMmMtPk1vZGUgICAgICA9IEhBTF9JMkNfTU9ERV9TTEFWRTsKKyAgICBoaTJjLT5FcnJvckNvZGUgPSBIQUxfSTJDX0VSUk9SX05PTkU7CisKKyAgICAvKiBFbmFibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgJj0gfkkyQ19DUjJfTkFDSzsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICAgID0gcERhdGE7CisgICAgaGkyYy0+WGZlckNvdW50ICAgPSBTaXplOworICAgIGhpMmMtPlhmZXJTaXplICAgID0gaGkyYy0+WGZlckNvdW50OworICAgIGhpMmMtPlhmZXJPcHRpb25zID0gWGZlck9wdGlvbnM7CisgICAgaGkyYy0+WGZlcklTUiAgICAgPSBJMkNfU2xhdmVfSVNSX0lUOworCisgICAgaWYgKEkyQ19HRVRfRElSKGhpMmMpID09IEkyQ19ESVJFQ1RJT05fVFJBTlNNSVQpCisgICAgeworICAgICAgLyogQ2xlYXIgQUREUiBmbGFnIGFmdGVyIHByZXBhcmUgdGhlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICAgIC8qIFRoaXMgYWN0aW9uIHdpbGwgZ2VuZXJhdGUgYW4gYWNrbm93bGVkZ2UgdG8gdGhlIE1hc3RlciAqLworICAgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQUREUik7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIC8qIE5vdGUgOiBUaGUgSTJDIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBJMkMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICBwcm9jZXNzIHVubG9jayAqLworICAgIC8qIFJFbmFibGUgQUREUiBpbnRlcnJ1cHQgKi8KKyAgICBJMkNfRW5hYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9SWF9JVCB8IEkyQ19YRkVSX0xJU1RFTl9JVCk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIEFkZHJlc3MgbGlzdGVuIG1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfRW5hYmxlTGlzdGVuX0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9SRUFEWSkKKyAgeworICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9MSVNURU47CisgICAgaGkyYy0+WGZlcklTUiA9IEkyQ19TbGF2ZV9JU1JfSVQ7CisKKyAgICAvKiBFbmFibGUgdGhlIEFkZHJlc3MgTWF0Y2ggaW50ZXJydXB0ICovCisgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfTElTVEVOX0lUKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgQWRkcmVzcyBsaXN0ZW4gbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX0Rpc2FibGVMaXN0ZW5fSVQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpCit7CisgIC8qIERlY2xhcmF0aW9uIG9mIHRtcCB0byBwcmV2ZW50IHVuZGVmaW5lZCBiZWhhdmlvciBvZiB2b2xhdGlsZSB1c2FnZSAqLworICB1aW50MzJfdCB0bXA7CisKKyAgLyogRGlzYWJsZSBBZGRyZXNzIGxpc3RlbiBtb2RlIG9ubHkgaWYgYSB0cmFuc2ZlciBpcyBub3Qgb25nb2luZyAqLworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9MSVNURU4pCisgIHsKKyAgICB0bXAgPSAodWludDMyX3QpKGhpMmMtPlN0YXRlKSAmIEkyQ19TVEFURV9NU0s7CisgICAgaGkyYy0+UHJldmlvdXNTdGF0ZSA9IHRtcCB8ICh1aW50MzJfdCkoaGkyYy0+TW9kZSk7CisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgIGhpMmMtPk1vZGUgPSBIQUxfSTJDX01PREVfTk9ORTsKKyAgICBoaTJjLT5YZmVySVNSID0gTlVMTDsKKworICAgIC8qIERpc2FibGUgdGhlIEFkZHJlc3MgTWF0Y2ggaW50ZXJydXB0ICovCisgICAgSTJDX0Rpc2FibGVfSVJRKGhpMmMsIEkyQ19YRkVSX0xJU1RFTl9JVCk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IGEgbWFzdGVyIEkyQyBJVCBvciBETUEgcHJvY2VzcyBjb21tdW5pY2F0aW9uIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIFRhcmdldCBkZXZpY2UgYWRkcmVzczogVGhlIGRldmljZSA3IGJpdHMgYWRkcmVzcyB2YWx1ZQorICAqICAgICAgICAgaW4gZGF0YXNoZWV0IG11c3QgYmUgc2hpZnRlZCB0byB0aGUgbGVmdCBiZWZvcmUgY2FsbGluZyB0aGUgaW50ZXJmYWNlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9BYm9ydF9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcykKK3sKKyAgaWYgKGhpMmMtPk1vZGUgPT0gSEFMX0kyQ19NT0RFX01BU1RFUikKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIC8qIERpc2FibGUgSW50ZXJydXB0cyAqLworICAgIEkyQ19EaXNhYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9SWF9JVCk7CisgICAgSTJDX0Rpc2FibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1RYX0lUKTsKKworICAgIC8qIFNldCBTdGF0ZSBhdCBIQUxfSTJDX1NUQVRFX0FCT1JUICovCisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX0FCT1JUOworCisgICAgLyogU2V0IE5CWVRFUyB0byAxIHRvIGdlbmVyYXRlIGEgZHVtbXkgcmVhZCBvbiBJMkMgcGVyaXBoZXJhbCAqLworICAgIC8qIFNldCBBVVRPRU5EIG1vZGUsIHRoaXMgd2lsbCBnZW5lcmF0ZSBhIE5BQ0sgdGhlbiBTVE9QIGNvbmRpdGlvbiB0byBhYm9ydCB0aGUgY3VycmVudCB0cmFuc2ZlciAqLworICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCAxLCBJMkNfQVVUT0VORF9NT0RFLCBJMkNfR0VORVJBVEVfU1RPUCk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgLyogTm90ZSA6IFRoZSBJMkMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBJMkMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKyAgICBJMkNfRW5hYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9DUExUX0lUKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogV3JvbmcgdXNhZ2Ugb2YgYWJvcnQgZnVuY3Rpb24gKi8KKyAgICAvKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIG9ubHkgaW4gY2FzZSBvZiBhYm9ydCBtb25pdG9yZWQgYnkgbWFzdGVyIGRldmljZSAqLworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfSVJRX0hhbmRsZXJfYW5kX0NhbGxiYWNrcyBJUlEgSGFuZGxlciBhbmQgQ2FsbGJhY2tzCisgKiBAeworICovCisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIEkyQyBldmVudCBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfSTJDX0VWX0lSUUhhbmRsZXIoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpCit7CisgIC8qIEdldCBjdXJyZW50IElUIEZsYWdzIGFuZCBJVCBzb3VyY2VzIHZhbHVlICovCisgIHVpbnQzMl90IGl0ZmxhZ3MgICA9IFJFQURfUkVHKGhpMmMtPkluc3RhbmNlLT5JU1IpOworICB1aW50MzJfdCBpdHNvdXJjZXMgPSBSRUFEX1JFRyhoaTJjLT5JbnN0YW5jZS0+Q1IxKTsKKworICAvKiBJMkMgZXZlbnRzIHRyZWF0bWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKGhpMmMtPlhmZXJJU1IgIT0gTlVMTCkKKyAgeworICAgIGhpMmMtPlhmZXJJU1IoaGkyYywgaXRmbGFncywgaXRzb3VyY2VzKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBJMkMgZXJyb3IgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0kyQ19FUl9JUlFIYW5kbGVyKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICB1aW50MzJfdCBpdGZsYWdzICAgPSBSRUFEX1JFRyhoaTJjLT5JbnN0YW5jZS0+SVNSKTsKKyAgdWludDMyX3QgaXRzb3VyY2VzID0gUkVBRF9SRUcoaGkyYy0+SW5zdGFuY2UtPkNSMSk7CisKKyAgLyogSTJDIEJ1cyBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoaXRmbGFncyAmIEkyQ19GTEFHX0JFUlIpICE9IFJFU0VUKSAmJiAoKGl0c291cmNlcyAmIEkyQ19JVF9FUlJJKSAhPSBSRVNFVCkpCisgIHsKKyAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9CRVJSOworCisgICAgLyogQ2xlYXIgQkVSUiBmbGFnICovCisgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQkVSUik7CisgIH0KKworICAvKiBJMkMgT3Zlci1SdW4vVW5kZXItUnVuIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoaXRmbGFncyAmIEkyQ19GTEFHX09WUikgIT0gUkVTRVQpICYmICgoaXRzb3VyY2VzICYgSTJDX0lUX0VSUkkpICE9IFJFU0VUKSkKKyAgeworICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX09WUjsKKworICAgIC8qIENsZWFyIE9WUiBmbGFnICovCisgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfT1ZSKTsKKyAgfQorCisgIC8qIEkyQyBBcmJpdHJhdGlvbiBMb3NzIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoaXRmbGFncyAmIEkyQ19GTEFHX0FSTE8pICE9IFJFU0VUKSAmJiAoKGl0c291cmNlcyAmIEkyQ19JVF9FUlJJKSAhPSBSRVNFVCkpCisgIHsKKyAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9BUkxPOworCisgICAgLyogQ2xlYXIgQVJMTyBmbGFnICovCisgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQVJMTyk7CisgIH0KKworICAvKiBDYWxsIHRoZSBFcnJvciBDYWxsYmFjayBpbiBjYXNlIG9mIEVycm9yIGRldGVjdGVkICovCisgIGlmICgoaGkyYy0+RXJyb3JDb2RlICYgKEhBTF9JMkNfRVJST1JfQkVSUiB8IEhBTF9JMkNfRVJST1JfT1ZSIHwgSEFMX0kyQ19FUlJPUl9BUkxPKSkgIT0gIEhBTF9JMkNfRVJST1JfTk9ORSkKKyAgeworICAgIEkyQ19JVEVycm9yKGhpMmMsIGhpMmMtPkVycm9yQ29kZSk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBNYXN0ZXIgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSTJDX01hc3RlclR4Q3BsdENhbGxiYWNrKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaTJjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0kyQ19NYXN0ZXJUeENwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIE1hc3RlciBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JMkNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpMmMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSTJDX01hc3RlclJ4Q3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKiBAYnJpZWYgIFNsYXZlIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0kyQ19TbGF2ZVR4Q3BsdENhbGxiYWNrKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaTJjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0kyQ19TbGF2ZVR4Q3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgU2xhdmUgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSTJDX1NsYXZlUnhDcGx0Q2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpMmMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSTJDX1NsYXZlUnhDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTbGF2ZSBBZGRyZXNzIE1hdGNoIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBUcmFuc2ZlckRpcmVjdGlvbiBNYXN0ZXIgcmVxdWVzdCBUcmFuc2ZlciBEaXJlY3Rpb24gKFdyaXRlL1JlYWQpLCB2YWx1ZSBvZiBAcmVmIEkyQ19YRkVSRElSRUNUSU9OCisgICogQHBhcmFtICBBZGRyTWF0Y2hDb2RlIEFkZHJlc3MgTWF0Y2ggQ29kZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0kyQ19BZGRyQ2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQ4X3QgVHJhbnNmZXJEaXJlY3Rpb24sIHVpbnQxNl90IEFkZHJNYXRjaENvZGUpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpMmMpOworICBVTlVTRUQoVHJhbnNmZXJEaXJlY3Rpb24pOworICBVTlVTRUQoQWRkck1hdGNoQ29kZSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9JMkNfQWRkckNhbGxiYWNrKCkgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBMaXN0ZW4gQ29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JMkNfTGlzdGVuQ3BsdENhbGxiYWNrKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaTJjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0kyQ19MaXN0ZW5DcGx0Q2FsbGJhY2soKSBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIE1lbW9yeSBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JMkNfTWVtVHhDcGx0Q2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpMmMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSTJDX01lbVR4Q3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgTWVtb3J5IFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0kyQ19NZW1SeENwbHRDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGkyYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9JMkNfTWVtUnhDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBJMkMgZXJyb3IgY2FsbGJhY2suCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JMkNfRXJyb3JDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGkyYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9JMkNfRXJyb3JDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEkyQyBhYm9ydCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0kyQ19BYm9ydENwbHRDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGkyYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9JMkNfQWJvcnRDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIFN0YXRlLCBNb2RlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBQZXJpcGhlcmFsIFN0YXRlLCBNb2RlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlLCBNb2RlIGFuZCBFcnJvciBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwZXJtaXQgdG8gZ2V0IGluIHJ1bi10aW1lIHRoZSBzdGF0dXMgb2YgdGhlIHBlcmlwaGVyYWwKKyAgICBhbmQgdGhlIGRhdGEgZmxvdy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIEkyQyBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLworSEFMX0kyQ19TdGF0ZVR5cGVEZWYgSEFMX0kyQ19HZXRTdGF0ZShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYykKK3sKKyAgLyogUmV0dXJuIEkyQyBoYW5kbGUgc3RhdGUgKi8KKyAgcmV0dXJuIGhpMmMtPlN0YXRlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgdGhlIEkyQyBNYXN0ZXIsIFNsYXZlLCBNZW1vcnkgb3Igbm8gbW9kZS4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgSTJDIG1vZHVsZQorICAqIEByZXR2YWwgSEFMIG1vZGUKKyAgKi8KK0hBTF9JMkNfTW9kZVR5cGVEZWYgSEFMX0kyQ19HZXRNb2RlKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICByZXR1cm4gaGkyYy0+TW9kZTsKK30KKworLyoqCisqIEBicmllZiAgUmV0dXJuIHRoZSBJMkMgZXJyb3IgY29kZS4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyogQHJldHZhbCBJMkMgRXJyb3IgQ29kZQorKi8KK3VpbnQzMl90IEhBTF9JMkNfR2V0RXJyb3IoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpCit7CisgIHJldHVybiBoaTJjLT5FcnJvckNvZGU7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBJMkNfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEludGVycnVwdCBTdWItUm91dGluZSB3aGljaCBoYW5kbGUgdGhlIEludGVycnVwdCBGbGFncyBNYXN0ZXIgTW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgSVRGbGFncyBJbnRlcnJ1cHQgZmxhZ3MgdG8gaGFuZGxlLgorICAqIEBwYXJhbSAgSVRTb3VyY2VzIEludGVycnVwdCBzb3VyY2VzIGVuYWJsZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX01hc3Rlcl9JU1JfSVQoc3RydWN0IF9fSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IElURmxhZ3MsIHVpbnQzMl90IElUU291cmNlcykKK3sKKyAgdWludDE2X3QgZGV2YWRkcmVzcyA9IDBVOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgaWYgKCgoSVRGbGFncyAmIEkyQ19GTEFHX0FGKSAhPSBSRVNFVCkgJiYgKChJVFNvdXJjZXMgJiBJMkNfSVRfTkFDS0kpICE9IFJFU0VUKSkKKyAgeworICAgIC8qIENsZWFyIE5BQ0sgRmxhZyAqLworICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FGKTsKKworICAgIC8qIFNldCBjb3JyZXNwb25kaW5nIEVycm9yIENvZGUgKi8KKyAgICAvKiBObyBuZWVkIHRvIGdlbmVyYXRlIFNUT1AsIGl0IGlzIGF1dG9tYXRpY2FsbHkgZG9uZSAqLworICAgIC8qIEVycm9yIGNhbGxiYWNrIHdpbGwgYmUgc2VuZCBkdXJpbmcgc3RvcCBmbGFnIHRyZWF0bWVudCAqLworICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0FGOworCisgICAgLyogRmx1c2ggVFggcmVnaXN0ZXIgKi8KKyAgICBJMkNfRmx1c2hfVFhEUihoaTJjKTsKKyAgfQorICBlbHNlIGlmICgoKElURmxhZ3MgJiBJMkNfRkxBR19SWE5FKSAhPSBSRVNFVCkgJiYgKChJVFNvdXJjZXMgJiBJMkNfSVRfUlhJKSAhPSBSRVNFVCkpCisgIHsKKyAgICAvKiBSZWFkIGRhdGEgZnJvbSBSWERSICovCisgICAgKCpoaTJjLT5wQnVmZlB0cisrKSA9IGhpMmMtPkluc3RhbmNlLT5SWERSOworICAgIGhpMmMtPlhmZXJTaXplLS07CisgICAgaGkyYy0+WGZlckNvdW50LS07CisgIH0KKyAgZWxzZSBpZiAoKChJVEZsYWdzICYgSTJDX0ZMQUdfVFhJUykgIT0gUkVTRVQpICYmICgoSVRTb3VyY2VzICYgSTJDX0lUX1RYSSkgIT0gUkVTRVQpKQorICB7CisgICAgLyogV3JpdGUgZGF0YSB0byBUWERSICovCisgICAgaGkyYy0+SW5zdGFuY2UtPlRYRFIgPSAoKmhpMmMtPnBCdWZmUHRyKyspOworICAgIGhpMmMtPlhmZXJTaXplLS07CisgICAgaGkyYy0+WGZlckNvdW50LS07CisgIH0KKyAgZWxzZSBpZiAoKChJVEZsYWdzICYgSTJDX0ZMQUdfVENSKSAhPSBSRVNFVCkgJiYgKChJVFNvdXJjZXMgJiBJMkNfSVRfVENJKSAhPSBSRVNFVCkpCisgIHsKKyAgICBpZiAoKGhpMmMtPlhmZXJTaXplID09IDBVKSAmJiAoaGkyYy0+WGZlckNvdW50ICE9IDBVKSkKKyAgICB7CisgICAgICBkZXZhZGRyZXNzID0gKGhpMmMtPkluc3RhbmNlLT5DUjIgJiBJMkNfQ1IyX1NBREQpOworCisgICAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgICB7CisgICAgICAgIGhpMmMtPlhmZXJTaXplID0gTUFYX05CWVRFX1NJWkU7CisgICAgICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBkZXZhZGRyZXNzLCBoaTJjLT5YZmVyU2l6ZSwgSTJDX1JFTE9BRF9NT0RFLCBJMkNfTk9fU1RBUlRTVE9QKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgICAgIGlmIChoaTJjLT5YZmVyT3B0aW9ucyAhPSBJMkNfTk9fT1BUSU9OX0ZSQU1FKQorICAgICAgICB7CisgICAgICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIGRldmFkZHJlc3MsIGhpMmMtPlhmZXJTaXplLCBoaTJjLT5YZmVyT3B0aW9ucywgSTJDX05PX1NUQVJUU1RPUCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIGRldmFkZHJlc3MsIGhpMmMtPlhmZXJTaXplLCBJMkNfQVVUT0VORF9NT0RFLCBJMkNfTk9fU1RBUlRTVE9QKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogQ2FsbCBUeENwbHRDYWxsYmFjaygpIGlmIG5vIHN0b3AgbW9kZSBpcyBzZXQgKi8KKyAgICAgIGlmIChJMkNfR0VUX1NUT1BfTU9ERShoaTJjKSAhPSBJMkNfQVVUT0VORF9NT0RFKQorICAgICAgeworICAgICAgICAvKiBDYWxsIEkyQyBNYXN0ZXIgU2VxdWVudGlhbCBjb21wbGV0ZSBwcm9jZXNzICovCisgICAgICAgIEkyQ19JVE1hc3RlclNlcXVlbnRpYWxDcGx0KGhpMmMpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBXcm9uZyBzaXplIFN0YXR1cyByZWdhcmRpbmcgVENSIGZsYWcgZXZlbnQgKi8KKyAgICAgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisgICAgICAgIEkyQ19JVEVycm9yKGhpMmMsIEhBTF9JMkNfRVJST1JfU0laRSk7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UgaWYgKCgoSVRGbGFncyAmIEkyQ19GTEFHX1RDKSAhPSBSRVNFVCkgJiYgKChJVFNvdXJjZXMgJiBJMkNfSVRfVENJKSAhPSBSRVNFVCkpCisgIHsKKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIGlmIChJMkNfR0VUX1NUT1BfTU9ERShoaTJjKSAhPSBJMkNfQVVUT0VORF9NT0RFKQorICAgICAgeworICAgICAgICAvKiBHZW5lcmF0ZSBhIHN0b3AgY29uZGl0aW9uIGluIGNhc2Ugb2Ygbm8gdHJhbnNmZXIgb3B0aW9uICovCisgICAgICAgIGlmIChoaTJjLT5YZmVyT3B0aW9ucyA9PSBJMkNfTk9fT1BUSU9OX0ZSQU1FKQorICAgICAgICB7CisgICAgICAgICAgLyogR2VuZXJhdGUgU3RvcCAqLworICAgICAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgfD0gSTJDX0NSMl9TVE9QOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIENhbGwgSTJDIE1hc3RlciBTZXF1ZW50aWFsIGNvbXBsZXRlIHByb2Nlc3MgKi8KKyAgICAgICAgICBJMkNfSVRNYXN0ZXJTZXF1ZW50aWFsQ3BsdChoaTJjKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogV3Jvbmcgc2l6ZSBTdGF0dXMgcmVnYXJkaW5nIFRDIGZsYWcgZXZlbnQgKi8KKyAgICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworICAgICAgSTJDX0lURXJyb3IoaGkyYywgSEFMX0kyQ19FUlJPUl9TSVpFKTsKKyAgICB9CisgIH0KKworICBpZiAoKChJVEZsYWdzICYgSTJDX0ZMQUdfU1RPUEYpICE9IFJFU0VUKSAmJiAoKElUU291cmNlcyAmIEkyQ19JVF9TVE9QSSkgIT0gUkVTRVQpKQorICB7CisgICAgLyogQ2FsbCBJMkMgTWFzdGVyIGNvbXBsZXRlIHByb2Nlc3MgKi8KKyAgICBJMkNfSVRNYXN0ZXJDcGx0KGhpMmMsIElURmxhZ3MpOworICB9CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbnRlcnJ1cHQgU3ViLVJvdXRpbmUgd2hpY2ggaGFuZGxlIHRoZSBJbnRlcnJ1cHQgRmxhZ3MgU2xhdmUgTW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgSVRGbGFncyBJbnRlcnJ1cHQgZmxhZ3MgdG8gaGFuZGxlLgorICAqIEBwYXJhbSAgSVRTb3VyY2VzIEludGVycnVwdCBzb3VyY2VzIGVuYWJsZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX1NsYXZlX0lTUl9JVChzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncywgdWludDMyX3QgSVRTb3VyY2VzKQoreworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhpMmMpOworCisgIGlmICgoKElURmxhZ3MgJiBJMkNfRkxBR19BRikgIT0gUkVTRVQpICYmICgoSVRTb3VyY2VzICYgSTJDX0lUX05BQ0tJKSAhPSBSRVNFVCkpCisgIHsKKyAgICAvKiBDaGVjayB0aGF0IEkyQyB0cmFuc2ZlciBmaW5pc2hlZCAqLworICAgIC8qIGlmIHllcywgbm9ybWFsIHVzZSBjYXNlLCBhIE5BQ0sgaXMgc2VudCBieSB0aGUgTUFTVEVSIHdoZW4gVHJhbnNmZXIgaXMgZmluaXNoZWQgKi8KKyAgICAvKiBNZWFuIFhmZXJDb3VudCA9PSAwKi8KKyAgICAvKiBTbyBjbGVhciBGbGFnIE5BQ0tGIG9ubHkgKi8KKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIGlmICgoKGhpMmMtPlhmZXJPcHRpb25zID09IEkyQ19GSVJTVF9BTkRfTEFTVF9GUkFNRSkgfHwgKGhpMmMtPlhmZXJPcHRpb25zID09IEkyQ19MQVNUX0ZSQU1FKSkgJiYgXAorICAgICAgICAgIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX0xJU1RFTikpCisgICAgICB7CisgICAgICAgIC8qIENhbGwgSTJDIExpc3RlbiBjb21wbGV0ZSBwcm9jZXNzICovCisgICAgICAgIEkyQ19JVExpc3RlbkNwbHQoaGkyYywgSVRGbGFncyk7CisgICAgICB9CisgICAgICBlbHNlIGlmICgoaGkyYy0+WGZlck9wdGlvbnMgIT0gSTJDX05PX09QVElPTl9GUkFNRSkgJiYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQlVTWV9UWF9MSVNURU4pKQorICAgICAgeworICAgICAgICAvKiBDbGVhciBOQUNLIEZsYWcgKi8KKyAgICAgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQUYpOworCisgICAgICAgIC8qIEZsdXNoIFRYIHJlZ2lzdGVyICovCisgICAgICAgIEkyQ19GbHVzaF9UWERSKGhpMmMpOworCisgICAgICAgIC8qIExhc3QgQnl0ZSBpcyBUcmFuc21pdHRlZCAqLworICAgICAgICAvKiBDYWxsIEkyQyBTbGF2ZSBTZXF1ZW50aWFsIGNvbXBsZXRlIHByb2Nlc3MgKi8KKyAgICAgICAgSTJDX0lUU2xhdmVTZXF1ZW50aWFsQ3BsdChoaTJjKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogQ2xlYXIgTkFDSyBGbGFnICovCisgICAgICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FGKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIGlmIG5vLCBlcnJvciB1c2UgY2FzZSwgYSBOb24tQWNrbm93bGVkZ2Ugb2YgbGFzdCBEYXRhIGlzIGdlbmVyYXRlZCBieSB0aGUgTUFTVEVSKi8KKyAgICAgIC8qIENsZWFyIE5BQ0sgRmxhZyAqLworICAgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQUYpOworCisgICAgICAvKiBTZXQgRXJyb3JDb2RlIGNvcnJlc3BvbmRpbmcgdG8gYSBOb24tQWNrbm93bGVkZ2UgKi8KKyAgICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0FGOworICAgIH0KKyAgfQorICBlbHNlIGlmICgoKElURmxhZ3MgJiBJMkNfRkxBR19SWE5FKSAhPSBSRVNFVCkgJiYgKChJVFNvdXJjZXMgJiBJMkNfSVRfUlhJKSAhPSBSRVNFVCkpCisgIHsKKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgLyogUmVhZCBkYXRhIGZyb20gUlhEUiAqLworICAgICAgKCpoaTJjLT5wQnVmZlB0cisrKSA9IGhpMmMtPkluc3RhbmNlLT5SWERSOworICAgICAgaGkyYy0+WGZlclNpemUtLTsKKyAgICAgIGhpMmMtPlhmZXJDb3VudC0tOworICAgIH0KKworICAgIGlmICgoaGkyYy0+WGZlckNvdW50ID09IDBVKSAmJiBcCisgICAgICAgIChoaTJjLT5YZmVyT3B0aW9ucyAhPSBJMkNfTk9fT1BUSU9OX0ZSQU1FKSkKKyAgICB7CisgICAgICAvKiBDYWxsIEkyQyBTbGF2ZSBTZXF1ZW50aWFsIGNvbXBsZXRlIHByb2Nlc3MgKi8KKyAgICAgIEkyQ19JVFNsYXZlU2VxdWVudGlhbENwbHQoaGkyYyk7CisgICAgfQorICB9CisgIGVsc2UgaWYgKCgoSVRGbGFncyAmIEkyQ19GTEFHX0FERFIpICE9IFJFU0VUKSAmJiAoKElUU291cmNlcyAmIEkyQ19JVF9BRERSSSkgIT0gUkVTRVQpKQorICB7CisgICAgSTJDX0lUQWRkckNwbHQoaGkyYywgSVRGbGFncyk7CisgIH0KKyAgZWxzZSBpZiAoKChJVEZsYWdzICYgSTJDX0ZMQUdfVFhJUykgIT0gUkVTRVQpICYmICgoSVRTb3VyY2VzICYgSTJDX0lUX1RYSSkgIT0gUkVTRVQpKQorICB7CisgICAgLyogV3JpdGUgZGF0YSB0byBUWERSIG9ubHkgaWYgWGZlckNvdW50IG5vdCByZWFjaCAiMCIgKi8KKyAgICAvKiBBIFRYSVMgZmxhZyBjYW4gYmUgc2V0LCBkdXJpbmcgU1RPUCB0cmVhdG1lbnQgICAgICAqLworICAgIC8qIENoZWNrIGlmIGFsbCBEYXRhcyBoYXZlIGFscmVhZHkgYmVlbiBzZW50ICovCisgICAgLyogSWYgaXQgaXMgdGhlIGNhc2UsIHRoaXMgbGFzdCB3cml0ZSBpbiBUWERSIGlzIG5vdCBzZW50LCBjb3JyZXNwb25kIHRvIGEgZHVtbXkgVFhJUyBldmVudCAqLworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiAwVSkKKyAgICB7CisgICAgICAvKiBXcml0ZSBkYXRhIHRvIFRYRFIgKi8KKyAgICAgIGhpMmMtPkluc3RhbmNlLT5UWERSID0gKCpoaTJjLT5wQnVmZlB0cisrKTsKKyAgICAgIGhpMmMtPlhmZXJDb3VudC0tOworICAgICAgaGkyYy0+WGZlclNpemUtLTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmICgoaGkyYy0+WGZlck9wdGlvbnMgPT0gSTJDX05FWFRfRlJBTUUpIHx8IChoaTJjLT5YZmVyT3B0aW9ucyA9PSBJMkNfRklSU1RfRlJBTUUpKQorICAgICAgeworICAgICAgICAvKiBMYXN0IEJ5dGUgaXMgVHJhbnNtaXR0ZWQgKi8KKyAgICAgICAgLyogQ2FsbCBJMkMgU2xhdmUgU2VxdWVudGlhbCBjb21wbGV0ZSBwcm9jZXNzICovCisgICAgICAgIEkyQ19JVFNsYXZlU2VxdWVudGlhbENwbHQoaGkyYyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogQ2hlY2sgaWYgU1RPUEYgaXMgc2V0ICovCisgIGlmICgoKElURmxhZ3MgJiBJMkNfRkxBR19TVE9QRikgIT0gUkVTRVQpICYmICgoSVRTb3VyY2VzICYgSTJDX0lUX1NUT1BJKSAhPSBSRVNFVCkpCisgIHsKKyAgICAvKiBDYWxsIEkyQyBTbGF2ZSBjb21wbGV0ZSBwcm9jZXNzICovCisgICAgSTJDX0lUU2xhdmVDcGx0KGhpMmMsIElURmxhZ3MpOworICB9CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbnRlcnJ1cHQgU3ViLVJvdXRpbmUgd2hpY2ggaGFuZGxlIHRoZSBJbnRlcnJ1cHQgRmxhZ3MgTWFzdGVyIE1vZGUgd2l0aCBETUEuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIElURmxhZ3MgSW50ZXJydXB0IGZsYWdzIHRvIGhhbmRsZS4KKyAgKiBAcGFyYW0gIElUU291cmNlcyBJbnRlcnJ1cHQgc291cmNlcyBlbmFibGVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEkyQ19NYXN0ZXJfSVNSX0RNQShzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncywgdWludDMyX3QgSVRTb3VyY2VzKQoreworICB1aW50MTZfdCBkZXZhZGRyZXNzID0gMFU7CisgIHVpbnQzMl90IHhmZXJtb2RlID0gMFU7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaTJjKTsKKworICBpZiAoKChJVEZsYWdzICYgSTJDX0ZMQUdfQUYpICE9IFJFU0VUKSAmJiAoKElUU291cmNlcyAmIEkyQ19JVF9OQUNLSSkgIT0gUkVTRVQpKQorICB7CisgICAgLyogQ2xlYXIgTkFDSyBGbGFnICovCisgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQUYpOworCisgICAgLyogU2V0IGNvcnJlc3BvbmRpbmcgRXJyb3IgQ29kZSAqLworICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0FGOworCisgICAgLyogTm8gbmVlZCB0byBnZW5lcmF0ZSBTVE9QLCBpdCBpcyBhdXRvbWF0aWNhbGx5IGRvbmUgKi8KKyAgICAvKiBCdXQgZW5hYmxlIFNUT1AgaW50ZXJydXB0LCB0byB0cmVhdCBpdCAqLworICAgIC8qIEVycm9yIGNhbGxiYWNrIHdpbGwgYmUgc2VuZCBkdXJpbmcgc3RvcCBmbGFnIHRyZWF0bWVudCAqLworICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX0NQTFRfSVQpOworCisgICAgLyogRmx1c2ggVFggcmVnaXN0ZXIgKi8KKyAgICBJMkNfRmx1c2hfVFhEUihoaTJjKTsKKyAgfQorICBlbHNlIGlmICgoKElURmxhZ3MgJiBJMkNfRkxBR19UQ1IpICE9IFJFU0VUKSAmJiAoKElUU291cmNlcyAmIEkyQ19JVF9UQ0kpICE9IFJFU0VUKSkKKyAgeworICAgIC8qIERpc2FibGUgVEMgaW50ZXJydXB0ICovCisgICAgX19IQUxfSTJDX0RJU0FCTEVfSVQoaGkyYywgSTJDX0lUX1RDSSk7CisKKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ICE9IDBVKQorICAgIHsKKyAgICAgIC8qIFJlY292ZXIgU2xhdmUgYWRkcmVzcyAqLworICAgICAgZGV2YWRkcmVzcyA9IChoaTJjLT5JbnN0YW5jZS0+Q1IyICYgSTJDX0NSMl9TQUREKTsKKworICAgICAgLyogUHJlcGFyZSB0aGUgbmV3IFhmZXJTaXplIHRvIHRyYW5zZmVyICovCisgICAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgICB7CisgICAgICAgIGhpMmMtPlhmZXJTaXplID0gTUFYX05CWVRFX1NJWkU7CisgICAgICAgIHhmZXJtb2RlID0gSTJDX1JFTE9BRF9NT0RFOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBoaTJjLT5YZmVyU2l6ZSA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICAgICAgeGZlcm1vZGUgPSBJMkNfQVVUT0VORF9NT0RFOworICAgICAgfQorCisgICAgICAvKiBTZXQgdGhlIG5ldyBYZmVyU2l6ZSBpbiBOYnl0ZXMgcmVnaXN0ZXIgKi8KKyAgICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBkZXZhZGRyZXNzLCBoaTJjLT5YZmVyU2l6ZSwgeGZlcm1vZGUsIEkyQ19OT19TVEFSVFNUT1ApOworCisgICAgICAvKiBVcGRhdGUgWGZlckNvdW50IHZhbHVlICovCisgICAgICBoaTJjLT5YZmVyQ291bnQgLT0gaGkyYy0+WGZlclNpemU7CisKKyAgICAgIC8qIEVuYWJsZSBETUEgUmVxdWVzdCAqLworICAgICAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQlVTWV9SWCkKKyAgICAgIHsKKyAgICAgICAgaGkyYy0+SW5zdGFuY2UtPkNSMSB8PSBJMkNfQ1IxX1JYRE1BRU47CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgfD0gSTJDX0NSMV9UWERNQUVOOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogV3Jvbmcgc2l6ZSBTdGF0dXMgcmVnYXJkaW5nIFRDUiBmbGFnIGV2ZW50ICovCisgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyAgICAgIEkyQ19JVEVycm9yKGhpMmMsIEhBTF9JMkNfRVJST1JfU0laRSk7CisgICAgfQorICB9CisgIGVsc2UgaWYgKCgoSVRGbGFncyAmIEkyQ19GTEFHX1NUT1BGKSAhPSBSRVNFVCkgJiYgKChJVFNvdXJjZXMgJiBJMkNfSVRfU1RPUEkpICE9IFJFU0VUKSkKKyAgeworICAgIC8qIENhbGwgSTJDIE1hc3RlciBjb21wbGV0ZSBwcm9jZXNzICovCisgICAgSTJDX0lUTWFzdGVyQ3BsdChoaTJjLCBJVEZsYWdzKTsKKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW50ZXJydXB0IFN1Yi1Sb3V0aW5lIHdoaWNoIGhhbmRsZSB0aGUgSW50ZXJydXB0IEZsYWdzIFNsYXZlIE1vZGUgd2l0aCBETUEuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIElURmxhZ3MgSW50ZXJydXB0IGZsYWdzIHRvIGhhbmRsZS4KKyAgKiBAcGFyYW0gIElUU291cmNlcyBJbnRlcnJ1cHQgc291cmNlcyBlbmFibGVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEkyQ19TbGF2ZV9JU1JfRE1BKHN0cnVjdCBfX0kyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBJVEZsYWdzLCB1aW50MzJfdCBJVFNvdXJjZXMpCit7CisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgaWYgKCgoSVRGbGFncyAmIEkyQ19GTEFHX0FGKSAhPSBSRVNFVCkgJiYgKChJVFNvdXJjZXMgJiBJMkNfSVRfTkFDS0kpICE9IFJFU0VUKSkKKyAgeworICAgIC8qIENoZWNrIHRoYXQgSTJDIHRyYW5zZmVyIGZpbmlzaGVkICovCisgICAgLyogaWYgeWVzLCBub3JtYWwgdXNlIGNhc2UsIGEgTkFDSyBpcyBzZW50IGJ5IHRoZSBNQVNURVIgd2hlbiBUcmFuc2ZlciBpcyBmaW5pc2hlZCAqLworICAgIC8qIE1lYW4gWGZlckNvdW50ID09IDAgKi8KKyAgICAvKiBTbyBjbGVhciBGbGFnIE5BQ0tGIG9ubHkgKi8KKyAgICBpZiAoSTJDX0dFVF9ETUFfUkVNQUlOX0RBVEEoaGkyYykgPT0gMFUpCisgICAgeworICAgICAgLyogQ2xlYXIgTkFDSyBGbGFnICovCisgICAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19BRik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBpZiBubywgZXJyb3IgdXNlIGNhc2UsIGEgTm9uLUFja25vd2xlZGdlIG9mIGxhc3QgRGF0YSBpcyBnZW5lcmF0ZWQgYnkgdGhlIE1BU1RFUiovCisgICAgICAvKiBDbGVhciBOQUNLIEZsYWcgKi8KKyAgICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FGKTsKKworICAgICAgLyogU2V0IEVycm9yQ29kZSBjb3JyZXNwb25kaW5nIHRvIGEgTm9uLUFja25vd2xlZGdlICovCisgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9BRjsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoKChJVEZsYWdzICYgSTJDX0ZMQUdfQUREUikgIT0gUkVTRVQpICYmICgoSVRTb3VyY2VzICYgSTJDX0lUX0FERFJJKSAhPSBSRVNFVCkpCisgIHsKKyAgICAvKiBDbGVhciBBRERSIGZsYWcgKi8KKyAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19BRERSKTsKKyAgfQorICBlbHNlIGlmICgoKElURmxhZ3MgJiBJMkNfRkxBR19TVE9QRikgIT0gUkVTRVQpICYmICgoSVRTb3VyY2VzICYgSTJDX0lUX1NUT1BJKSAhPSBSRVNFVCkpCisgIHsKKyAgICAvKiBDYWxsIEkyQyBTbGF2ZSBjb21wbGV0ZSBwcm9jZXNzICovCisgICAgSTJDX0lUU2xhdmVDcGx0KGhpMmMsIElURmxhZ3MpOworICB9CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBNYXN0ZXIgc2VuZHMgdGFyZ2V0IGRldmljZSBhZGRyZXNzIGZvbGxvd2VkIGJ5IGludGVybmFsIG1lbW9yeSBhZGRyZXNzIGZvciB3cml0ZSByZXF1ZXN0LgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIFRhcmdldCBkZXZpY2UgYWRkcmVzczogVGhlIGRldmljZSA3IGJpdHMgYWRkcmVzcyB2YWx1ZQorICAqICAgICAgICAgaW4gZGF0YXNoZWV0IG11c3QgYmUgc2hpZnRlZCB0byB0aGUgbGVmdCBiZWZvcmUgY2FsbGluZyB0aGUgaW50ZXJmYWNlCisgICogQHBhcmFtICBNZW1BZGRyZXNzIEludGVybmFsIG1lbW9yeSBhZGRyZXNzCisgICogQHBhcmFtICBNZW1BZGRTaXplIFNpemUgb2YgaW50ZXJuYWwgbWVtb3J5IGFkZHJlc3MKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEBwYXJhbSAgVGlja3N0YXJ0IFRpY2sgc3RhcnQgdmFsdWUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfUmVxdWVzdE1lbW9yeVdyaXRlKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRTaXplLCB1aW50MzJfdCBUaW1lb3V0LCB1aW50MzJfdCBUaWNrc3RhcnQpCit7CisgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCBNZW1BZGRTaXplLCBJMkNfUkVMT0FEX01PREUsIEkyQ19HRU5FUkFURV9TVEFSVF9XUklURSk7CisKKyAgLyogV2FpdCB1bnRpbCBUWElTIGZsYWcgaXMgc2V0ICovCisgIGlmIChJMkNfV2FpdE9uVFhJU0ZsYWdVbnRpbFRpbWVvdXQoaGkyYywgVGltZW91dCwgVGlja3N0YXJ0KSAhPSBIQUxfT0spCisgIHsKKyAgICBpZiAoaGkyYy0+RXJyb3JDb2RlID09IEhBTF9JMkNfRVJST1JfQUYpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKworICAvKiBJZiBNZW1vcnkgYWRkcmVzcyBzaXplIGlzIDhCaXQgKi8KKyAgaWYgKE1lbUFkZFNpemUgPT0gSTJDX01FTUFERF9TSVpFXzhCSVQpCisgIHsKKyAgICAvKiBTZW5kIE1lbW9yeSBBZGRyZXNzICovCisgICAgaGkyYy0+SW5zdGFuY2UtPlRYRFIgPSBJMkNfTUVNX0FERF9MU0IoTWVtQWRkcmVzcyk7CisgIH0KKyAgLyogSWYgTWVtb3J5IGFkZHJlc3Mgc2l6ZSBpcyAxNkJpdCAqLworICBlbHNlCisgIHsKKyAgICAvKiBTZW5kIE1TQiBvZiBNZW1vcnkgQWRkcmVzcyAqLworICAgIGhpMmMtPkluc3RhbmNlLT5UWERSID0gSTJDX01FTV9BRERfTVNCKE1lbUFkZHJlc3MpOworCisgICAgLyogV2FpdCB1bnRpbCBUWElTIGZsYWcgaXMgc2V0ICovCisgICAgaWYgKEkyQ19XYWl0T25UWElTRmxhZ1VudGlsVGltZW91dChoaTJjLCBUaW1lb3V0LCBUaWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICBpZiAoaGkyYy0+RXJyb3JDb2RlID09IEhBTF9JMkNfRVJST1JfQUYpCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTZW5kIExTQiBvZiBNZW1vcnkgQWRkcmVzcyAqLworICAgIGhpMmMtPkluc3RhbmNlLT5UWERSID0gSTJDX01FTV9BRERfTFNCKE1lbUFkZHJlc3MpOworICB9CisKKyAgLyogV2FpdCB1bnRpbCBUQ1IgZmxhZyBpcyBzZXQgKi8KKyAgaWYgKEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpMmMsIEkyQ19GTEFHX1RDUiwgUkVTRVQsIFRpbWVvdXQsIFRpY2tzdGFydCkgIT0gSEFMX09LKQorICB7CisgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBNYXN0ZXIgc2VuZHMgdGFyZ2V0IGRldmljZSBhZGRyZXNzIGZvbGxvd2VkIGJ5IGludGVybmFsIG1lbW9yeSBhZGRyZXNzIGZvciByZWFkIHJlcXVlc3QuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3MgVGFyZ2V0IGRldmljZSBhZGRyZXNzOiBUaGUgZGV2aWNlIDcgYml0cyBhZGRyZXNzIHZhbHVlCisgICogICAgICAgICBpbiBkYXRhc2hlZXQgbXVzdCBiZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJlZm9yZSBjYWxsaW5nIHRoZSBpbnRlcmZhY2UKKyAgKiBAcGFyYW0gIE1lbUFkZHJlc3MgSW50ZXJuYWwgbWVtb3J5IGFkZHJlc3MKKyAgKiBAcGFyYW0gIE1lbUFkZFNpemUgU2l6ZSBvZiBpbnRlcm5hbCBtZW1vcnkgYWRkcmVzcworICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHBhcmFtICBUaWNrc3RhcnQgVGljayBzdGFydCB2YWx1ZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEkyQ19SZXF1ZXN0TWVtb3J5UmVhZChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDE2X3QgTWVtQWRkcmVzcywgdWludDE2X3QgTWVtQWRkU2l6ZSwgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KQoreworICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgTWVtQWRkU2l6ZSwgSTJDX1NPRlRFTkRfTU9ERSwgSTJDX0dFTkVSQVRFX1NUQVJUX1dSSVRFKTsKKworICAvKiBXYWl0IHVudGlsIFRYSVMgZmxhZyBpcyBzZXQgKi8KKyAgaWYgKEkyQ19XYWl0T25UWElTRmxhZ1VudGlsVGltZW91dChoaTJjLCBUaW1lb3V0LCBUaWNrc3RhcnQpICE9IEhBTF9PSykKKyAgeworICAgIGlmIChoaTJjLT5FcnJvckNvZGUgPT0gSEFMX0kyQ19FUlJPUl9BRikKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorCisgIC8qIElmIE1lbW9yeSBhZGRyZXNzIHNpemUgaXMgOEJpdCAqLworICBpZiAoTWVtQWRkU2l6ZSA9PSBJMkNfTUVNQUREX1NJWkVfOEJJVCkKKyAgeworICAgIC8qIFNlbmQgTWVtb3J5IEFkZHJlc3MgKi8KKyAgICBoaTJjLT5JbnN0YW5jZS0+VFhEUiA9IEkyQ19NRU1fQUREX0xTQihNZW1BZGRyZXNzKTsKKyAgfQorICAvKiBJZiBNZW1vcnkgYWRkcmVzcyBzaXplIGlzIDE2Qml0ICovCisgIGVsc2UKKyAgeworICAgIC8qIFNlbmQgTVNCIG9mIE1lbW9yeSBBZGRyZXNzICovCisgICAgaGkyYy0+SW5zdGFuY2UtPlRYRFIgPSBJMkNfTUVNX0FERF9NU0IoTWVtQWRkcmVzcyk7CisKKyAgICAvKiBXYWl0IHVudGlsIFRYSVMgZmxhZyBpcyBzZXQgKi8KKyAgICBpZiAoSTJDX1dhaXRPblRYSVNGbGFnVW50aWxUaW1lb3V0KGhpMmMsIFRpbWVvdXQsIFRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIGlmIChoaTJjLT5FcnJvckNvZGUgPT0gSEFMX0kyQ19FUlJPUl9BRikKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKworICAgIC8qIFNlbmQgTFNCIG9mIE1lbW9yeSBBZGRyZXNzICovCisgICAgaGkyYy0+SW5zdGFuY2UtPlRYRFIgPSBJMkNfTUVNX0FERF9MU0IoTWVtQWRkcmVzcyk7CisgIH0KKworICAvKiBXYWl0IHVudGlsIFRDIGZsYWcgaXMgc2V0ICovCisgIGlmIChJMkNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoaTJjLCBJMkNfRkxBR19UQywgUkVTRVQsIFRpbWVvdXQsIFRpY2tzdGFydCkgIT0gSEFMX09LKQorICB7CisgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJMkMgQWRkcmVzcyBjb21wbGV0ZSBwcm9jZXNzIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGkyYyBJMkMgaGFuZGxlLgorICAqIEBwYXJhbSAgSVRGbGFncyBJbnRlcnJ1cHQgZmxhZ3MgdG8gaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJDX0lUQWRkckNwbHQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IElURmxhZ3MpCit7CisgIHVpbnQ4X3QgdHJhbnNmZXJkaXJlY3Rpb24gPSAwVTsKKyAgdWludDE2X3Qgc2xhdmVhZGRyY29kZSA9IDBVOworICB1aW50MTZfdCBvd25hZGQxY29kZSA9IDBVOworICB1aW50MTZfdCBvd25hZGQyY29kZSA9IDBVOworCisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKElURmxhZ3MpOworCisgIC8qIEluIGNhc2Ugb2YgTGlzdGVuIHN0YXRlLCBuZWVkIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBhZGRyZXNzIG1hdGNoIGNvZGUgZXZlbnQgKi8KKyAgaWYgKChoaTJjLT5TdGF0ZSAmIEhBTF9JMkNfU1RBVEVfTElTVEVOKSA9PSBIQUxfSTJDX1NUQVRFX0xJU1RFTikKKyAgeworICAgIHRyYW5zZmVyZGlyZWN0aW9uID0gSTJDX0dFVF9ESVIoaGkyYyk7CisgICAgc2xhdmVhZGRyY29kZSAgICAgPSBJMkNfR0VUX0FERFJfTUFUQ0goaGkyYyk7CisgICAgb3duYWRkMWNvZGUgICAgICAgPSBJMkNfR0VUX09XTl9BRERSRVNTMShoaTJjKTsKKyAgICBvd25hZGQyY29kZSAgICAgICA9IEkyQ19HRVRfT1dOX0FERFJFU1MyKGhpMmMpOworCisgICAgLyogSWYgMTBiaXRzIGFkZHJlc3NpbmcgbW9kZSBpcyBzZWxlY3RlZCAqLworICAgIGlmIChoaTJjLT5Jbml0LkFkZHJlc3NpbmdNb2RlID09IEkyQ19BRERSRVNTSU5HTU9ERV8xMEJJVCkKKyAgICB7CisgICAgICBpZiAoKHNsYXZlYWRkcmNvZGUgJiBTbGF2ZUFkZHJfTVNLKSA9PSAoKG93bmFkZDFjb2RlID4+IFNsYXZlQWRkcl9TSElGVCkgJiBTbGF2ZUFkZHJfTVNLKSkKKyAgICAgIHsKKyAgICAgICAgc2xhdmVhZGRyY29kZSA9IG93bmFkZDFjb2RlOworICAgICAgICBoaTJjLT5BZGRyRXZlbnRDb3VudCsrOworICAgICAgICBpZiAoaGkyYy0+QWRkckV2ZW50Q291bnQgPT0gMlUpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBSZXNldCBBZGRyZXNzIEV2ZW50IGNvdW50ZXIgKi8KKyAgICAgICAgICBoaTJjLT5BZGRyRXZlbnRDb3VudCA9IDBVOworCisgICAgICAgICAgLyogQ2xlYXIgQUREUiBmbGFnICovCisgICAgICAgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQUREUik7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAgICAgLyogQ2FsbCBTbGF2ZSBBZGRyIGNhbGxiYWNrICovCisgICAgICAgICAgSEFMX0kyQ19BZGRyQ2FsbGJhY2soaGkyYywgdHJhbnNmZXJkaXJlY3Rpb24sIHNsYXZlYWRkcmNvZGUpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHNsYXZlYWRkcmNvZGUgPSBvd25hZGQyY29kZTsKKworICAgICAgICAvKiBEaXNhYmxlIEFERFIgSW50ZXJydXB0cyAqLworICAgICAgICBJMkNfRGlzYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfTElTVEVOX0lUKTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgICAvKiBDYWxsIFNsYXZlIEFkZHIgY2FsbGJhY2sgKi8KKyAgICAgICAgSEFMX0kyQ19BZGRyQ2FsbGJhY2soaGkyYywgdHJhbnNmZXJkaXJlY3Rpb24sIHNsYXZlYWRkcmNvZGUpOworICAgICAgfQorICAgIH0KKyAgICAvKiBlbHNlIDcgYml0cyBhZGRyZXNzaW5nIG1vZGUgaXMgc2VsZWN0ZWQgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgLyogRGlzYWJsZSBBRERSIEludGVycnVwdHMgKi8KKyAgICAgIEkyQ19EaXNhYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9MSVNURU5fSVQpOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgIC8qIENhbGwgU2xhdmUgQWRkciBjYWxsYmFjayAqLworICAgICAgSEFMX0kyQ19BZGRyQ2FsbGJhY2soaGkyYywgdHJhbnNmZXJkaXJlY3Rpb24sIHNsYXZlYWRkcmNvZGUpOworICAgIH0KKyAgfQorICAvKiBFbHNlIGNsZWFyIGFkZHJlc3MgZmxhZyBvbmx5ICovCisgIGVsc2UKKyAgeworICAgIC8qIENsZWFyIEFERFIgZmxhZyAqLworICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FERFIpOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEkyQyBNYXN0ZXIgc2VxdWVudGlhbCBjb21wbGV0ZSBwcm9jZXNzLgorICAqIEBwYXJhbSAgaGkyYyBJMkMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJDX0lUTWFzdGVyU2VxdWVudGlhbENwbHQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpCit7CisgIC8qIFJlc2V0IEkyQyBoYW5kbGUgbW9kZSAqLworICBoaTJjLT5Nb2RlID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgLyogTm8gR2VuZXJhdGUgU3RvcCwgdG8gcGVybWl0IHJlc3RhcnQgbW9kZSAqLworICAvKiBUaGUgc3RvcCB3aWxsIGJlIGRvbmUgYXQgdGhlIGVuZCBvZiB0cmFuc2Zlciwgd2hlbiBJMkNfQVVUT0VORF9NT0RFIGVuYWJsZSAqLworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9CVVNZX1RYKQorICB7CisgICAgaGkyYy0+U3RhdGUgICAgICAgICA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisgICAgaGkyYy0+UHJldmlvdXNTdGF0ZSA9IEkyQ19TVEFURV9NQVNURVJfQlVTWV9UWDsKKyAgICBoaTJjLT5YZmVySVNSICAgICAgID0gTlVMTDsKKworICAgIC8qIERpc2FibGUgSW50ZXJydXB0cyAqLworICAgIEkyQ19EaXNhYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9UWF9JVCk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisgICAgSEFMX0kyQ19NYXN0ZXJUeENwbHRDYWxsYmFjayhoaTJjKTsKKyAgfQorICAvKiBoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX0JVU1lfUlggKi8KKyAgZWxzZQorICB7CisgICAgaGkyYy0+U3RhdGUgICAgICAgICA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisgICAgaGkyYy0+UHJldmlvdXNTdGF0ZSA9IEkyQ19TVEFURV9NQVNURVJfQlVTWV9SWDsKKyAgICBoaTJjLT5YZmVySVNSICAgICAgID0gTlVMTDsKKworICAgIC8qIERpc2FibGUgSW50ZXJydXB0cyAqLworICAgIEkyQ19EaXNhYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9SWF9JVCk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisgICAgSEFMX0kyQ19NYXN0ZXJSeENwbHRDYWxsYmFjayhoaTJjKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEkyQyBTbGF2ZSBzZXF1ZW50aWFsIGNvbXBsZXRlIHByb2Nlc3MuCisgICogQHBhcmFtICBoaTJjIEkyQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMkNfSVRTbGF2ZVNlcXVlbnRpYWxDcGx0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBSZXNldCBJMkMgaGFuZGxlIG1vZGUgKi8KKyAgaGkyYy0+TW9kZSA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX0JVU1lfVFhfTElTVEVOKQorICB7CisgICAgLyogUmVtb3ZlIEhBTF9JMkNfU1RBVEVfU0xBVkVfQlVTWV9UWCwga2VlcCBvbmx5IEhBTF9JMkNfU1RBVEVfTElTVEVOICovCisgICAgaGkyYy0+U3RhdGUgICAgICAgICA9IEhBTF9JMkNfU1RBVEVfTElTVEVOOworICAgIGhpMmMtPlByZXZpb3VzU3RhdGUgPSBJMkNfU1RBVEVfU0xBVkVfQlVTWV9UWDsKKworICAgIC8qIERpc2FibGUgSW50ZXJydXB0cyAqLworICAgIEkyQ19EaXNhYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9UWF9JVCk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgLyogQ2FsbCB0aGUgVHggY29tcGxldGUgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIHRoZSBlbmQgb2YgdHJhbnNtaXQgcHJvY2VzcyAqLworICAgIEhBTF9JMkNfU2xhdmVUeENwbHRDYWxsYmFjayhoaTJjKTsKKyAgfQorCisgIGVsc2UgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQlVTWV9SWF9MSVNURU4pCisgIHsKKyAgICAvKiBSZW1vdmUgSEFMX0kyQ19TVEFURV9TTEFWRV9CVVNZX1JYLCBrZWVwIG9ubHkgSEFMX0kyQ19TVEFURV9MSVNURU4gKi8KKyAgICBoaTJjLT5TdGF0ZSAgICAgICAgID0gSEFMX0kyQ19TVEFURV9MSVNURU47CisgICAgaGkyYy0+UHJldmlvdXNTdGF0ZSA9IEkyQ19TVEFURV9TTEFWRV9CVVNZX1JYOworCisgICAgLyogRGlzYWJsZSBJbnRlcnJ1cHRzICovCisgICAgSTJDX0Rpc2FibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1JYX0lUKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBDYWxsIHRoZSBSeCBjb21wbGV0ZSBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgdGhlIGVuZCBvZiByZWNlaXZlIHByb2Nlc3MgKi8KKyAgICBIQUxfSTJDX1NsYXZlUnhDcGx0Q2FsbGJhY2soaGkyYyk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBJMkMgTWFzdGVyIGNvbXBsZXRlIHByb2Nlc3MuCisgICogQHBhcmFtICBoaTJjIEkyQyBoYW5kbGUuCisgICogQHBhcmFtICBJVEZsYWdzIEludGVycnVwdCBmbGFncyB0byBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMkNfSVRNYXN0ZXJDcGx0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBJVEZsYWdzKQoreworICAvKiBDbGVhciBTVE9QIEZsYWcgKi8KKyAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfU1RPUEYpOworCisgIC8qIENsZWFyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworICBJMkNfUkVTRVRfQ1IyKGhpMmMpOworCisgIC8qIFJlc2V0IGhhbmRsZSBwYXJhbWV0ZXJzICovCisgIGhpMmMtPlByZXZpb3VzU3RhdGUgPSBJMkNfU1RBVEVfTk9ORTsKKyAgaGkyYy0+WGZlcklTUiAgICAgICA9IE5VTEw7CisgIGhpMmMtPlhmZXJPcHRpb25zICAgPSBJMkNfTk9fT1BUSU9OX0ZSQU1FOworCisgIGlmICgoSVRGbGFncyAmIEkyQ19GTEFHX0FGKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIENsZWFyIE5BQ0sgRmxhZyAqLworICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FGKTsKKworICAgIC8qIFNldCBhY2tub3dsZWRnZSBlcnJvciBjb2RlICovCisgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfQUY7CisgIH0KKworICAvKiBGbHVzaCBUWCByZWdpc3RlciAqLworICBJMkNfRmx1c2hfVFhEUihoaTJjKTsKKworICAvKiBEaXNhYmxlIEludGVycnVwdHMgKi8KKyAgSTJDX0Rpc2FibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1RYX0lUIHwgSTJDX1hGRVJfUlhfSVQpOworCisgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworICBpZiAoKGhpMmMtPkVycm9yQ29kZSAhPSBIQUxfSTJDX0VSUk9SX05PTkUpIHx8IChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX0FCT1JUKSkKKyAgeworICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworICAgIEkyQ19JVEVycm9yKGhpMmMsIGhpMmMtPkVycm9yQ29kZSk7CisgIH0KKyAgLyogaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9CVVNZX1RYICovCisgIGVsc2UgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQlVTWV9UWCkKKyAgeworICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKworICAgIGlmIChoaTJjLT5Nb2RlID09IEhBTF9JMkNfTU9ERV9NRU0pCisgICAgeworICAgICAgaGkyYy0+TW9kZSA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworICAgICAgSEFMX0kyQ19NZW1UeENwbHRDYWxsYmFjayhoaTJjKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhpMmMtPk1vZGUgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyAgICAgIEhBTF9JMkNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soaGkyYyk7CisgICAgfQorICB9CisgIC8qIGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQlVTWV9SWCAqLworICBlbHNlIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX0JVU1lfUlgpCisgIHsKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisKKyAgICBpZiAoaGkyYy0+TW9kZSA9PSBIQUxfSTJDX01PREVfTUVNKQorICAgIHsKKyAgICAgIGhpMmMtPk1vZGUgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICBIQUxfSTJDX01lbVJ4Q3BsdENhbGxiYWNrKGhpMmMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGkyYy0+TW9kZSA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgIEhBTF9JMkNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soaGkyYyk7CisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgSTJDIFNsYXZlIGNvbXBsZXRlIHByb2Nlc3MuCisgICogQHBhcmFtICBoaTJjIEkyQyBoYW5kbGUuCisgICogQHBhcmFtICBJVEZsYWdzIEludGVycnVwdCBmbGFncyB0byBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMkNfSVRTbGF2ZUNwbHQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IElURmxhZ3MpCit7CisgIC8qIENsZWFyIFNUT1AgRmxhZyAqLworICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19TVE9QRik7CisKKyAgLyogQ2xlYXIgQUREUiBmbGFnICovCisgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FERFIpOworCisgIC8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKyAgSTJDX0Rpc2FibGVfSVJRKGhpMmMsIEkyQ19YRkVSX0xJU1RFTl9JVCB8IEkyQ19YRkVSX1RYX0lUIHwgSTJDX1hGRVJfUlhfSVQpOworCisgIC8qIERpc2FibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICBoaTJjLT5JbnN0YW5jZS0+Q1IyIHw9IEkyQ19DUjJfTkFDSzsKKworICAvKiBDbGVhciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KKyAgSTJDX1JFU0VUX0NSMihoaTJjKTsKKworICAvKiBGbHVzaCBUWCByZWdpc3RlciAqLworICBJMkNfRmx1c2hfVFhEUihoaTJjKTsKKworICAvKiBJZiBhIERNQSBpcyBvbmdvaW5nLCBVcGRhdGUgaGFuZGxlIHNpemUgY29udGV4dCAqLworICBpZiAoKChoaTJjLT5JbnN0YW5jZS0+Q1IxICYgSTJDX0NSMV9UWERNQUVOKSA9PSBJMkNfQ1IxX1RYRE1BRU4pIHx8CisgICAgICAoKGhpMmMtPkluc3RhbmNlLT5DUjEgJiBJMkNfQ1IxX1JYRE1BRU4pID09IEkyQ19DUjFfUlhETUFFTikpCisgIHsKKyAgICBoaTJjLT5YZmVyQ291bnQgPSBJMkNfR0VUX0RNQV9SRU1BSU5fREFUQShoaTJjKTsKKyAgfQorCisgIC8qIEFsbCBkYXRhIGFyZSBub3QgdHJhbnNmZXJyZWQsIHNvIHNldCBlcnJvciBjb2RlIGFjY29yZGluZ2x5ICovCisgIGlmIChoaTJjLT5YZmVyQ291bnQgIT0gMFUpCisgIHsKKyAgICAvKiBTZXQgRXJyb3JDb2RlIGNvcnJlc3BvbmRpbmcgdG8gYSBOb24tQWNrbm93bGVkZ2UgKi8KKyAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9BRjsKKyAgfQorCisgIC8qIFN0b3JlIExhc3QgcmVjZWl2ZSBkYXRhIGlmIGFueSAqLworICBpZiAoKChJVEZsYWdzICYgSTJDX0ZMQUdfUlhORSkgIT0gUkVTRVQpKQorICB7CisgICAgLyogUmVhZCBkYXRhIGZyb20gUlhEUiAqLworICAgICgqaGkyYy0+cEJ1ZmZQdHIrKykgPSBoaTJjLT5JbnN0YW5jZS0+UlhEUjsKKworICAgIGlmICgoaGkyYy0+WGZlclNpemUgPiAwVSkpCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUtLTsKKyAgICAgIGhpMmMtPlhmZXJDb3VudC0tOworCisgICAgICAvKiBTZXQgRXJyb3JDb2RlIGNvcnJlc3BvbmRpbmcgdG8gYSBOb24tQWNrbm93bGVkZ2UgKi8KKyAgICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0FGOworICAgIH0KKyAgfQorCisgIGhpMmMtPlByZXZpb3VzU3RhdGUgPSBJMkNfU1RBVEVfTk9ORTsKKyAgaGkyYy0+TW9kZSA9IEhBTF9JMkNfTU9ERV9OT05FOworICBoaTJjLT5YZmVySVNSID0gTlVMTDsKKworICBpZiAoaGkyYy0+RXJyb3JDb2RlICE9IEhBTF9JMkNfRVJST1JfTk9ORSkKKyAgeworICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworICAgIEkyQ19JVEVycm9yKGhpMmMsIGhpMmMtPkVycm9yQ29kZSk7CisKKyAgICAvKiBDYWxsIHRoZSBMaXN0ZW4gQ29tcGxldGUgY2FsbGJhY2ssIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiB0aGUgZW5kIG9mIExpc3RlbiB1c2VjYXNlICovCisgICAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfTElTVEVOKQorICAgIHsKKyAgICAgIC8qIENhbGwgSTJDIExpc3RlbiBjb21wbGV0ZSBwcm9jZXNzICovCisgICAgICBJMkNfSVRMaXN0ZW5DcGx0KGhpMmMsIElURmxhZ3MpOworICAgIH0KKyAgfQorICBlbHNlIGlmIChoaTJjLT5YZmVyT3B0aW9ucyAhPSBJMkNfTk9fT1BUSU9OX0ZSQU1FKQorICB7CisgICAgaGkyYy0+WGZlck9wdGlvbnMgPSBJMkNfTk9fT1BUSU9OX0ZSQU1FOworICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBDYWxsIHRoZSBMaXN0ZW4gQ29tcGxldGUgY2FsbGJhY2ssIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiB0aGUgZW5kIG9mIExpc3RlbiB1c2VjYXNlICovCisgICAgSEFMX0kyQ19MaXN0ZW5DcGx0Q2FsbGJhY2soaGkyYyk7CisgIH0KKyAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisgIGVsc2UgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQlVTWV9SWCkKKyAgeworICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBDYWxsIHRoZSBTbGF2ZSBSeCBDb21wbGV0ZSBjYWxsYmFjayAqLworICAgIEhBTF9JMkNfU2xhdmVSeENwbHRDYWxsYmFjayhoaTJjKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgLyogQ2FsbCB0aGUgU2xhdmUgVHggQ29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBIQUxfSTJDX1NsYXZlVHhDcGx0Q2FsbGJhY2soaGkyYyk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBJMkMgTGlzdGVuIGNvbXBsZXRlIHByb2Nlc3MuCisgICogQHBhcmFtICBoaTJjIEkyQyBoYW5kbGUuCisgICogQHBhcmFtICBJVEZsYWdzIEludGVycnVwdCBmbGFncyB0byBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMkNfSVRMaXN0ZW5DcGx0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBJVEZsYWdzKQoreworICAvKiBSZXNldCBoYW5kbGUgcGFyYW1ldGVycyAqLworICBoaTJjLT5YZmVyT3B0aW9ucyA9IEkyQ19OT19PUFRJT05fRlJBTUU7CisgIGhpMmMtPlByZXZpb3VzU3RhdGUgPSBJMkNfU1RBVEVfTk9ORTsKKyAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICBoaTJjLT5Nb2RlID0gSEFMX0kyQ19NT0RFX05PTkU7CisgIGhpMmMtPlhmZXJJU1IgPSBOVUxMOworCisgIC8qIFN0b3JlIExhc3QgcmVjZWl2ZSBkYXRhIGlmIGFueSAqLworICBpZiAoKChJVEZsYWdzICYgSTJDX0ZMQUdfUlhORSkgIT0gUkVTRVQpKQorICB7CisgICAgLyogUmVhZCBkYXRhIGZyb20gUlhEUiAqLworICAgICgqaGkyYy0+cEJ1ZmZQdHIrKykgPSBoaTJjLT5JbnN0YW5jZS0+UlhEUjsKKworICAgIGlmICgoaGkyYy0+WGZlclNpemUgPiAwVSkpCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUtLTsKKyAgICAgIGhpMmMtPlhmZXJDb3VudC0tOworCisgICAgICAvKiBTZXQgRXJyb3JDb2RlIGNvcnJlc3BvbmRpbmcgdG8gYSBOb24tQWNrbm93bGVkZ2UgKi8KKyAgICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0FGOworICAgIH0KKyAgfQorCisgIC8qIERpc2FibGUgYWxsIEludGVycnVwdHMqLworICBJMkNfRGlzYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfTElTVEVOX0lUIHwgSTJDX1hGRVJfUlhfSVQgfCBJMkNfWEZFUl9UWF9JVCk7CisKKyAgLyogQ2xlYXIgTkFDSyBGbGFnICovCisgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FGKTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAvKiBDYWxsIHRoZSBMaXN0ZW4gQ29tcGxldGUgY2FsbGJhY2ssIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiB0aGUgZW5kIG9mIExpc3RlbiB1c2VjYXNlICovCisgIEhBTF9JMkNfTGlzdGVuQ3BsdENhbGxiYWNrKGhpMmMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEkyQyBpbnRlcnJ1cHRzIGVycm9yIHByb2Nlc3MuCisgICogQHBhcmFtICBoaTJjIEkyQyBoYW5kbGUuCisgICogQHBhcmFtICBFcnJvckNvZGUgRXJyb3IgY29kZSB0byBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMkNfSVRFcnJvcihJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgRXJyb3JDb2RlKQoreworICAvKiBSZXNldCBoYW5kbGUgcGFyYW1ldGVycyAqLworICBoaTJjLT5Nb2RlICAgICAgICAgID0gSEFMX0kyQ19NT0RFX05PTkU7CisgIGhpMmMtPlhmZXJPcHRpb25zICAgPSBJMkNfTk9fT1BUSU9OX0ZSQU1FOworICBoaTJjLT5YZmVyQ291bnQgICAgID0gMFU7CisKKyAgLyogU2V0IG5ldyBlcnJvciBjb2RlICovCisgIGhpMmMtPkVycm9yQ29kZSB8PSBFcnJvckNvZGU7CisKKyAgLyogRGlzYWJsZSBJbnRlcnJ1cHRzICovCisgIGlmICgoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9MSVNURU4pICAgICAgICAgfHwKKyAgICAgIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX0JVU1lfVFhfTElTVEVOKSB8fAorICAgICAgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQlVTWV9SWF9MSVNURU4pKQorICB7CisgICAgLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cywgZXhjZXB0IGludGVycnVwdHMgcmVsYXRlZCB0byBMSVNURU4gc3RhdGUgKi8KKyAgICBJMkNfRGlzYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfUlhfSVQgfCBJMkNfWEZFUl9UWF9JVCk7CisKKyAgICAvKiBrZWVwIEhBTF9JMkNfU1RBVEVfTElTVEVOIGlmIHNldCAqLworICAgIGhpMmMtPlN0YXRlICAgICAgICAgPSBIQUxfSTJDX1NUQVRFX0xJU1RFTjsKKyAgICBoaTJjLT5QcmV2aW91c1N0YXRlID0gSTJDX1NUQVRFX05PTkU7CisgICAgaGkyYy0+WGZlcklTUiAgICAgICA9IEkyQ19TbGF2ZV9JU1JfSVQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworICAgIEkyQ19EaXNhYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9MSVNURU5fSVQgfCBJMkNfWEZFUl9SWF9JVCB8IEkyQ19YRkVSX1RYX0lUKTsKKworICAgIC8qIElmIHN0YXRlIGlzIGFuIGFib3J0IHRyZWF0bWVudCBvbiBnb2luZCwgZG9uJ3QgY2hhbmdlIHN0YXRlICovCisgICAgLyogVGhpcyBjaGFuZ2Ugd2lsbCBiZSBkbyBsYXRlciAqLworICAgIGlmIChoaTJjLT5TdGF0ZSAhPSBIQUxfSTJDX1NUQVRFX0FCT1JUKQorICAgIHsKKyAgICAgIC8qIFNldCBIQUxfSTJDX1NUQVRFX1JFQURZICovCisgICAgICBoaTJjLT5TdGF0ZSAgICAgICAgID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKyAgICB9CisgICAgaGkyYy0+UHJldmlvdXNTdGF0ZSA9IEkyQ19TVEFURV9OT05FOworICAgIGhpMmMtPlhmZXJJU1IgICAgICAgPSBOVUxMOworICB9CisKKyAgLyogQWJvcnQgRE1BIFRYIHRyYW5zZmVyIGlmIGFueSAqLworICBpZiAoKGhpMmMtPkluc3RhbmNlLT5DUjEgJiBJMkNfQ1IxX1RYRE1BRU4pID09IEkyQ19DUjFfVFhETUFFTikKKyAgeworICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgJj0gfkkyQ19DUjFfVFhETUFFTjsKKworICAgIC8qIFNldCB0aGUgSTJDIERNQSBBYm9ydCBjYWxsYmFjayA6CisgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX0kyQ19FcnJvckNhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICBoaTJjLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gSTJDX0RNQUFib3J0OworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIC8qIEFib3J0IERNQSBUWCAqLworICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhpMmMtPmhkbWF0eCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIENhbGwgRGlyZWN0bHkgWGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgaGkyYy0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayhoaTJjLT5oZG1hdHgpOworICAgIH0KKyAgfQorICAvKiBBYm9ydCBETUEgUlggdHJhbnNmZXIgaWYgYW55ICovCisgIGVsc2UgaWYgKChoaTJjLT5JbnN0YW5jZS0+Q1IxICYgSTJDX0NSMV9SWERNQUVOKSA9PSBJMkNfQ1IxX1JYRE1BRU4pCisgIHsKKyAgICBoaTJjLT5JbnN0YW5jZS0+Q1IxICY9IH5JMkNfQ1IxX1JYRE1BRU47CisKKyAgICAvKiBTZXQgdGhlIEkyQyBETUEgQWJvcnQgY2FsbGJhY2sgOgorICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9JMkNfRXJyb3JDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgaGkyYy0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IEkyQ19ETUFBYm9ydDsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBBYm9ydCBETUEgUlggKi8KKyAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChoaTJjLT5oZG1hcngpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBDYWxsIERpcmVjdGx5IGhpMmMtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgaGkyYy0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayhoaTJjLT5oZG1hcngpOworICAgIH0KKyAgfQorICBlbHNlIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX0FCT1JUKQorICB7CisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworICAgIEhBTF9JMkNfQWJvcnRDcGx0Q2FsbGJhY2soaGkyYyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworICAgIEhBTF9JMkNfRXJyb3JDYWxsYmFjayhoaTJjKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEkyQyBUeCBkYXRhIHJlZ2lzdGVyIGZsdXNoIHByb2Nlc3MuCisgICogQHBhcmFtICBoaTJjIEkyQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMkNfRmx1c2hfVFhEUihJMkNfSGFuZGxlVHlwZURlZiAqaGkyYykKK3sKKyAgLyogSWYgYSBwZW5kaW5nIFRYSVMgZmxhZyBpcyBzZXQgKi8KKyAgLyogV3JpdGUgYSBkdW1teSBkYXRhIGluIFRYRFIgdG8gY2xlYXIgaXQgKi8KKyAgaWYgKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBJMkNfRkxBR19UWElTKSAhPSBSRVNFVCkKKyAgeworICAgIGhpMmMtPkluc3RhbmNlLT5UWERSID0gMHgwMFU7CisgIH0KKworICAvKiBGbHVzaCBUWCByZWdpc3RlciBpZiBub3QgZW1wdHkgKi8KKyAgaWYgKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBJMkNfRkxBR19UWEUpID09IFJFU0VUKQorICB7CisgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfVFhFKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBJMkMgbWFzdGVyIHRyYW5zbWl0IHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEkyQ19ETUFNYXN0ZXJUcmFuc21pdENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjID0gKEkyQ19IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyAgLyogRGlzYWJsZSBETUEgUmVxdWVzdCAqLworICBoaTJjLT5JbnN0YW5jZS0+Q1IxICY9IH5JMkNfQ1IxX1RYRE1BRU47CisKKyAgLyogSWYgbGFzdCB0cmFuc2ZlciwgZW5hYmxlIFNUT1AgaW50ZXJydXB0ICovCisgIGlmIChoaTJjLT5YZmVyQ291bnQgPT0gMFUpCisgIHsKKyAgICAvKiBFbmFibGUgU1RPUCBpbnRlcnJ1cHQgKi8KKyAgICBJMkNfRW5hYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9DUExUX0lUKTsKKyAgfQorICAvKiBlbHNlIHByZXBhcmUgYSBuZXcgRE1BIHRyYW5zZmVyIGFuZCBlbmFibGUgVENSZWxvYWQgaW50ZXJydXB0ICovCisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSBCdWZmZXIgcG9pbnRlciAqLworICAgIGhpMmMtPnBCdWZmUHRyICs9IGhpMmMtPlhmZXJTaXplOworCisgICAgLyogU2V0IHRoZSBYZmVyU2l6ZSB0byB0cmFuc2ZlciAqLworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgfQorCisgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgIEhBTF9ETUFfU3RhcnRfSVQoaGkyYy0+aGRtYXR4LCAodWludDMyX3QpaGkyYy0+cEJ1ZmZQdHIsICh1aW50MzJfdCkmaGkyYy0+SW5zdGFuY2UtPlRYRFIsIGhpMmMtPlhmZXJTaXplKTsKKworICAgIC8qIEVuYWJsZSBUQyBpbnRlcnJ1cHRzICovCisgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfUkVMT0FEX0lUKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBJMkMgc2xhdmUgdHJhbnNtaXQgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJDX0RNQVNsYXZlVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoZG1hKTsKKworICAvKiBObyBzcGVjaWZpYyBhY3Rpb24sIE1hc3RlciBmdWxseSBtYW5hZ2UgdGhlIGdlbmVyYXRpb24gb2YgU1RPUCBjb25kaXRpb24gKi8KKyAgLyogTWVhbiB0aGF0IHRoaXMgZ2VuZXJhdGlvbiBjYW4gYXJyaXZlIGF0IGFueSB0aW1lLCBhdCB0aGUgZW5kIG9yIGR1cmluZyBETUEgcHJvY2VzcyAqLworICAvKiBTbyBTVE9QIGNvbmRpdGlvbiBzaG91bGQgYmUgbWFuYWdlIHRocm91Z2ggSW50ZXJydXB0IHRyZWF0bWVudCAqLworfQorCisvKioKKyAgKiBAYnJpZWYgRE1BIEkyQyBtYXN0ZXIgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMkNfRE1BTWFzdGVyUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjID0gKEkyQ19IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyAgLyogRGlzYWJsZSBETUEgUmVxdWVzdCAqLworICBoaTJjLT5JbnN0YW5jZS0+Q1IxICY9IH5JMkNfQ1IxX1JYRE1BRU47CisKKyAgLyogSWYgbGFzdCB0cmFuc2ZlciwgZW5hYmxlIFNUT1AgaW50ZXJydXB0ICovCisgIGlmIChoaTJjLT5YZmVyQ291bnQgPT0gMFUpCisgIHsKKyAgICAvKiBFbmFibGUgU1RPUCBpbnRlcnJ1cHQgKi8KKyAgICBJMkNfRW5hYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9DUExUX0lUKTsKKyAgfQorICAvKiBlbHNlIHByZXBhcmUgYSBuZXcgRE1BIHRyYW5zZmVyIGFuZCBlbmFibGUgVENSZWxvYWQgaW50ZXJydXB0ICovCisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSBCdWZmZXIgcG9pbnRlciAqLworICAgIGhpMmMtPnBCdWZmUHRyICs9IGhpMmMtPlhmZXJTaXplOworCisgICAgLyogU2V0IHRoZSBYZmVyU2l6ZSB0byB0cmFuc2ZlciAqLworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgfQorCisgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgIEhBTF9ETUFfU3RhcnRfSVQoaGkyYy0+aGRtYXJ4LCAodWludDMyX3QpJmhpMmMtPkluc3RhbmNlLT5SWERSLCAodWludDMyX3QpaGkyYy0+cEJ1ZmZQdHIsIGhpMmMtPlhmZXJTaXplKTsKKworICAgIC8qIEVuYWJsZSBUQyBpbnRlcnJ1cHRzICovCisgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfUkVMT0FEX0lUKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBJMkMgc2xhdmUgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMkNfRE1BU2xhdmVSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGRtYSk7CisKKyAgLyogTm8gc3BlY2lmaWMgYWN0aW9uLCBNYXN0ZXIgZnVsbHkgbWFuYWdlIHRoZSBnZW5lcmF0aW9uIG9mIFNUT1AgY29uZGl0aW9uICovCisgIC8qIE1lYW4gdGhhdCB0aGlzIGdlbmVyYXRpb24gY2FuIGFycml2ZSBhdCBhbnkgdGltZSwgYXQgdGhlIGVuZCBvciBkdXJpbmcgRE1BIHByb2Nlc3MgKi8KKyAgLyogU28gU1RPUCBjb25kaXRpb24gc2hvdWxkIGJlIG1hbmFnZSB0aHJvdWdoIEludGVycnVwdCB0cmVhdG1lbnQgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgSTJDIGNvbW11bmljYXRpb24gZXJyb3IgY2FsbGJhY2suCisgICogQHBhcmFtIGhkbWEgRE1BIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJDX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyA9IChJMkNfSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCisgIC8qIERpc2FibGUgQWNrbm93bGVkZ2UgKi8KKyAgaGkyYy0+SW5zdGFuY2UtPkNSMiB8PSBJMkNfQ1IyX05BQ0s7CisKKyAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisgIEkyQ19JVEVycm9yKGhpMmMsIEhBTF9JMkNfRVJST1JfRE1BKTsKK30KKworLyoqCisgICogQGJyaWVmIERNQSBJMkMgY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaworICAqICAgICAgICAoVG8gYmUgY2FsbGVkIGF0IGVuZCBvZiBETUEgQWJvcnQgcHJvY2VkdXJlKS4KKyAgKiBAcGFyYW0gaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJDX0RNQUFib3J0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyA9IChJMkNfSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCisgIC8qIERpc2FibGUgQWNrbm93bGVkZ2UgKi8KKyAgaGkyYy0+SW5zdGFuY2UtPkNSMiB8PSBJMkNfQ1IyX05BQ0s7CisKKyAgLyogUmVzZXQgQWJvcnRDcGx0Q2FsbGJhY2sgKi8KKyAgaGkyYy0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgIGhpMmMtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgIC8qIENoZWNrIGlmIGNvbWUgZnJvbSBhYm9ydCBmcm9tIHVzZXIgKi8KKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQUJPUlQpCisgIHsKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyAgICBIQUxfSTJDX0Fib3J0Q3BsdENhbGxiYWNrKGhpMmMpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworICAgIEhBTF9JMkNfRXJyb3JDYWxsYmFjayhoaTJjKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBJMkMgQ29tbXVuaWNhdGlvbiBUaW1lb3V0LgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBGbGFnIFNwZWNpZmllcyB0aGUgSTJDIGZsYWcgdG8gY2hlY2suCisgICogQHBhcmFtICBTdGF0dXMgVGhlIG5ldyBGbGFnIHN0YXR1cyAoU0VUIG9yIFJFU0VUKS4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEBwYXJhbSAgVGlja3N0YXJ0IFRpY2sgc3RhcnQgdmFsdWUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgRmxhZywgRmxhZ1N0YXR1cyBTdGF0dXMsIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IFRpY2tzdGFydCkKK3sKKyAgd2hpbGUgKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBGbGFnKSA9PSBTdGF0dXMpCisgIHsKKyAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KKyAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmICgoVGltZW91dCA9PSAwVSkgfHwgKChIQUxfR2V0VGljaygpIC0gVGlja3N0YXJ0KSA+IFRpbWVvdXQpKQorICAgICAgeworICAgICAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisgICAgICAgIGhpMmMtPk1vZGUgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBJMkMgQ29tbXVuaWNhdGlvbiBUaW1lb3V0IGZvciBzcGVjaWZpYyB1c2FnZSBvZiBUWElTIGZsYWcuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEBwYXJhbSAgVGlja3N0YXJ0IFRpY2sgc3RhcnQgdmFsdWUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfV2FpdE9uVFhJU0ZsYWdVbnRpbFRpbWVvdXQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IFRpY2tzdGFydCkKK3sKKyAgd2hpbGUgKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBJMkNfRkxBR19UWElTKSA9PSBSRVNFVCkKKyAgeworICAgIC8qIENoZWNrIGlmIGEgTkFDSyBpcyBkZXRlY3RlZCAqLworICAgIGlmIChJMkNfSXNBY2tub3dsZWRnZUZhaWxlZChoaTJjLCBUaW1lb3V0LCBUaWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLworICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYgKChUaW1lb3V0ID09IDBVKSB8fCAoKEhBTF9HZXRUaWNrKCkgLSBUaWNrc3RhcnQpID4gVGltZW91dCkpCisgICAgICB7CisgICAgICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKyAgICAgICAgaGkyYy0+TW9kZSA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgSTJDIENvbW11bmljYXRpb24gVGltZW91dCBmb3Igc3BlY2lmaWMgdXNhZ2Ugb2YgU1RPUCBmbGFnLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcGFyYW0gIFRpY2tzdGFydCBUaWNrIHN0YXJ0IHZhbHVlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX1dhaXRPblNUT1BGbGFnVW50aWxUaW1lb3V0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBUaW1lb3V0LCB1aW50MzJfdCBUaWNrc3RhcnQpCit7CisgIHdoaWxlIChfX0hBTF9JMkNfR0VUX0ZMQUcoaGkyYywgSTJDX0ZMQUdfU1RPUEYpID09IFJFU0VUKQorICB7CisgICAgLyogQ2hlY2sgaWYgYSBOQUNLIGlzIGRldGVjdGVkICovCisgICAgaWYgKEkyQ19Jc0Fja25vd2xlZGdlRmFpbGVkKGhpMmMsIFRpbWVvdXQsIFRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCisgICAgaWYgKChUaW1lb3V0ID09IDBVKSB8fCAoKEhBTF9HZXRUaWNrKCkgLSBUaWNrc3RhcnQpID4gVGltZW91dCkpCisgICAgeworICAgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfVElNRU9VVDsKKyAgICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKyAgICAgIGhpMmMtPk1vZGUgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIEkyQyBDb21tdW5pY2F0aW9uIFRpbWVvdXQgZm9yIHNwZWNpZmljIHVzYWdlIG9mIFJYTkUgZmxhZy4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHBhcmFtICBUaWNrc3RhcnQgVGljayBzdGFydCB2YWx1ZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEkyQ19XYWl0T25SWE5FRmxhZ1VudGlsVGltZW91dChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KQoreworICB3aGlsZSAoX19IQUxfSTJDX0dFVF9GTEFHKGhpMmMsIEkyQ19GTEFHX1JYTkUpID09IFJFU0VUKQorICB7CisgICAgLyogQ2hlY2sgaWYgYSBOQUNLIGlzIGRldGVjdGVkICovCisgICAgaWYgKEkyQ19Jc0Fja25vd2xlZGdlRmFpbGVkKGhpMmMsIFRpbWVvdXQsIFRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgYSBTVE9QRiBpcyBkZXRlY3RlZCAqLworICAgIGlmIChfX0hBTF9JMkNfR0VUX0ZMQUcoaGkyYywgSTJDX0ZMQUdfU1RPUEYpID09IFNFVCkKKyAgICB7CisgICAgICAvKiBDaGVjayBpZiBhbiBSWE5FIGlzIHBlbmRpbmcgKi8KKyAgICAgIC8qIFN0b3JlIExhc3QgcmVjZWl2ZSBkYXRhIGlmIGFueSAqLworICAgICAgaWYgKChfX0hBTF9JMkNfR0VUX0ZMQUcoaGkyYywgSTJDX0ZMQUdfUlhORSkgPT0gU0VUKSAmJiAoaGkyYy0+WGZlclNpemUgPiAwVSkpCisgICAgICB7CisgICAgICAgIC8qIFJldHVybiBIQUxfT0sgKi8KKyAgICAgICAgLyogVGhlIFJlYWRpbmcgb2YgZGF0YSBmcm9tIFJYRFIgd2lsbCBiZSBkb25lIGluIGNhbGxlciBmdW5jdGlvbiAqLworICAgICAgICByZXR1cm4gSEFMX09LOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBDbGVhciBTVE9QIEZsYWcgKi8KKyAgICAgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfU1RPUEYpOworCisgICAgICAgIC8qIENsZWFyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworICAgICAgICBJMkNfUkVTRVRfQ1IyKGhpMmMpOworCisgICAgICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKyAgICAgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgICAgICBoaTJjLT5Nb2RlID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KKyAgICBpZiAoKFRpbWVvdXQgPT0gMFUpIHx8ICgoSEFMX0dldFRpY2soKSAtIFRpY2tzdGFydCkgPiBUaW1lb3V0KSkKKyAgICB7CisgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9USU1FT1VUOworICAgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgQWNrbm93bGVkZ2UgZmFpbGVkIGRldGVjdGlvbiBkdXJpbmcgYW4gSTJDIENvbW11bmljYXRpb24uCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEBwYXJhbSAgVGlja3N0YXJ0IFRpY2sgc3RhcnQgdmFsdWUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfSXNBY2tub3dsZWRnZUZhaWxlZChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KQoreworICBpZiAoX19IQUxfSTJDX0dFVF9GTEFHKGhpMmMsIEkyQ19GTEFHX0FGKSA9PSBTRVQpCisgIHsKKyAgICAvKiBXYWl0IHVudGlsIFNUT1AgRmxhZyBpcyByZXNldCAqLworICAgIC8qIEF1dG9FbmQgc2hvdWxkIGJlIGluaXRpYXRlIGFmdGVyIEFGICovCisgICAgd2hpbGUgKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBJMkNfRkxBR19TVE9QRikgPT0gUkVTRVQpCisgICAgeworICAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCisgICAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgICAgeworICAgICAgICBpZiAoKFRpbWVvdXQgPT0gMFUpIHx8ICgoSEFMX0dldFRpY2soKSAtIFRpY2tzdGFydCkgPiBUaW1lb3V0KSkKKyAgICAgICAgeworICAgICAgICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKyAgICAgICAgICBoaTJjLT5Nb2RlID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIENsZWFyIE5BQ0tGIEZsYWcgKi8KKyAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19BRik7CisKKyAgICAvKiBDbGVhciBTVE9QIEZsYWcgKi8KKyAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19TVE9QRik7CisKKyAgICAvKiBGbHVzaCBUWCByZWdpc3RlciAqLworICAgIEkyQ19GbHVzaF9UWERSKGhpMmMpOworCisgICAgLyogQ2xlYXIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCisgICAgSTJDX1JFU0VUX0NSMihoaTJjKTsKKworICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfQUY7CisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgIGhpMmMtPk1vZGUgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlcyBJMkN4IGNvbW11bmljYXRpb24gd2hlbiBzdGFydGluZyB0cmFuc2ZlciBvciBkdXJpbmcgdHJhbnNmZXIgKFRDIG9yIFRDUiBmbGFnIGFyZSBzZXQpLgorICAqIEBwYXJhbSAgaGkyYyBJMkMgaGFuZGxlLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBTcGVjaWZpZXMgdGhlIHNsYXZlIGFkZHJlc3MgdG8gYmUgcHJvZ3JhbW1lZC4KKyAgKiBAcGFyYW0gIFNpemUgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcHJvZ3JhbW1lZC4KKyAgKiAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDI1NS4KKyAgKiBAcGFyYW0gIE1vZGUgTmV3IHN0YXRlIG9mIHRoZSBJMkMgU1RBUlQgY29uZGl0aW9uIGdlbmVyYXRpb24uCisgICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICBAYXJnIEByZWYgSTJDX1JFTE9BRF9NT0RFIEVuYWJsZSBSZWxvYWQgbW9kZSAuCisgICogICAgIEBhcmcgQHJlZiBJMkNfQVVUT0VORF9NT0RFIEVuYWJsZSBBdXRvbWF0aWMgZW5kIG1vZGUuCisgICogICAgIEBhcmcgQHJlZiBJMkNfU09GVEVORF9NT0RFIEVuYWJsZSBTb2Z0d2FyZSBlbmQgbW9kZS4KKyAgKiBAcGFyYW0gIFJlcXVlc3QgTmV3IHN0YXRlIG9mIHRoZSBJMkMgU1RBUlQgY29uZGl0aW9uIGdlbmVyYXRpb24uCisgICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICBAYXJnIEByZWYgSTJDX05PX1NUQVJUU1RPUCBEb24ndCBHZW5lcmF0ZSBzdG9wIGFuZCBzdGFydCBjb25kaXRpb24uCisgICogICAgIEBhcmcgQHJlZiBJMkNfR0VORVJBVEVfU1RPUCBHZW5lcmF0ZSBzdG9wIGNvbmRpdGlvbiAoU2l6ZSBzaG91bGQgYmUgc2V0IHRvIDApLgorICAqICAgICBAYXJnIEByZWYgSTJDX0dFTkVSQVRFX1NUQVJUX1JFQUQgR2VuZXJhdGUgUmVzdGFydCBmb3IgcmVhZCByZXF1ZXN0LgorICAqICAgICBAYXJnIEByZWYgSTJDX0dFTkVSQVRFX1NUQVJUX1dSSVRFIEdlbmVyYXRlIFJlc3RhcnQgZm9yIHdyaXRlIHJlcXVlc3QuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMkNfVHJhbnNmZXJDb25maWcoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsICB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90IFNpemUsIHVpbnQzMl90IE1vZGUsIHVpbnQzMl90IFJlcXVlc3QpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX0lOU1RBTkNFKGhpMmMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19UUkFOU0ZFUl9NT0RFKE1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RSQU5TRkVSX1JFUVVFU1QoUmVxdWVzdCkpOworCisgIC8qIHVwZGF0ZSBDUjIgcmVnaXN0ZXIgKi8KKyAgTU9ESUZZX1JFRyhoaTJjLT5JbnN0YW5jZS0+Q1IyLCAoKEkyQ19DUjJfU0FERCB8IEkyQ19DUjJfTkJZVEVTIHwgSTJDX0NSMl9SRUxPQUQgfCBJMkNfQ1IyX0FVVE9FTkQgfCAoSTJDX0NSMl9SRF9XUk4gJiAodWludDMyX3QpKFJlcXVlc3QgPj4gKDMxVSAtIEkyQ19DUjJfUkRfV1JOX1BvcykpKSB8IEkyQ19DUjJfU1RBUlQgfCBJMkNfQ1IyX1NUT1ApKSwgXAorICAgICAgICAgICAgICh1aW50MzJfdCkoKCh1aW50MzJfdClEZXZBZGRyZXNzICYgSTJDX0NSMl9TQUREKSB8ICgoKHVpbnQzMl90KVNpemUgPDwgSTJDX0NSMl9OQllURVNfUG9zKSAmIEkyQ19DUjJfTkJZVEVTKSB8ICh1aW50MzJfdClNb2RlIHwgKHVpbnQzMl90KVJlcXVlc3QpKTsKK30KKworLyoqCisgICogQGJyaWVmICBNYW5hZ2UgdGhlIGVuYWJsaW5nIG9mIEludGVycnVwdHMuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIEludGVycnVwdFJlcXVlc3QgVmFsdWUgb2YgQHJlZiBJMkNfSW50ZXJydXB0X2NvbmZpZ3VyYXRpb25fZGVmaW5pdGlvbi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfRW5hYmxlX0lSUShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgSW50ZXJydXB0UmVxdWVzdCkKK3sKKyAgdWludDMyX3QgdG1waXNyID0gMFU7CisKKyAgaWYgKChoaTJjLT5YZmVySVNSID09IEkyQ19NYXN0ZXJfSVNSX0RNQSkgfHwgXAorICAgICAgKGhpMmMtPlhmZXJJU1IgPT0gSTJDX1NsYXZlX0lTUl9ETUEpKQorICB7CisgICAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgSTJDX1hGRVJfTElTVEVOX0lUKSA9PSBJMkNfWEZFUl9MSVNURU5fSVQpCisgICAgeworICAgICAgLyogRW5hYmxlIEVSUiwgU1RPUCwgTkFDSyBhbmQgQUREUiBpbnRlcnJ1cHRzICovCisgICAgICB0bXBpc3IgfD0gSTJDX0lUX0FERFJJIHwgSTJDX0lUX1NUT1BJIHwgSTJDX0lUX05BQ0tJIHwgSTJDX0lUX0VSUkk7CisgICAgfQorCisgICAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgSTJDX1hGRVJfRVJST1JfSVQpID09IEkyQ19YRkVSX0VSUk9SX0lUKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSBFUlIgYW5kIE5BQ0sgaW50ZXJydXB0cyAqLworICAgICAgdG1waXNyIHw9IEkyQ19JVF9FUlJJIHwgSTJDX0lUX05BQ0tJOworICAgIH0KKworICAgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIEkyQ19YRkVSX0NQTFRfSVQpID09IEkyQ19YRkVSX0NQTFRfSVQpCisgICAgeworICAgICAgLyogRW5hYmxlIFNUT1AgaW50ZXJydXB0cyAqLworICAgICAgdG1waXNyIHw9IEkyQ19JVF9TVE9QSTsKKyAgICB9CisKKyAgICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBJMkNfWEZFUl9SRUxPQURfSVQpID09IEkyQ19YRkVSX1JFTE9BRF9JVCkKKyAgICB7CisgICAgICAvKiBFbmFibGUgVEMgaW50ZXJydXB0cyAqLworICAgICAgdG1waXNyIHw9IEkyQ19JVF9UQ0k7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIEkyQ19YRkVSX0xJU1RFTl9JVCkgPT0gSTJDX1hGRVJfTElTVEVOX0lUKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSBFUlIsIFNUT1AsIE5BQ0ssIGFuZCBBRERSIGludGVycnVwdHMgKi8KKyAgICAgIHRtcGlzciB8PSBJMkNfSVRfQUREUkkgfCBJMkNfSVRfU1RPUEkgfCBJMkNfSVRfTkFDS0kgfCBJMkNfSVRfRVJSSTsKKyAgICB9CisKKyAgICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBJMkNfWEZFUl9UWF9JVCkgPT0gSTJDX1hGRVJfVFhfSVQpCisgICAgeworICAgICAgLyogRW5hYmxlIEVSUiwgVEMsIFNUT1AsIE5BQ0sgYW5kIFJYSSBpbnRlcnJ1cHRzICovCisgICAgICB0bXBpc3IgfD0gSTJDX0lUX0VSUkkgfCBJMkNfSVRfVENJIHwgSTJDX0lUX1NUT1BJIHwgSTJDX0lUX05BQ0tJIHwgSTJDX0lUX1RYSTsKKyAgICB9CisKKyAgICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBJMkNfWEZFUl9SWF9JVCkgPT0gSTJDX1hGRVJfUlhfSVQpCisgICAgeworICAgICAgLyogRW5hYmxlIEVSUiwgVEMsIFNUT1AsIE5BQ0sgYW5kIFRYSSBpbnRlcnJ1cHRzICovCisgICAgICB0bXBpc3IgfD0gSTJDX0lUX0VSUkkgfCBJMkNfSVRfVENJIHwgSTJDX0lUX1NUT1BJIHwgSTJDX0lUX05BQ0tJIHwgSTJDX0lUX1JYSTsKKyAgICB9CisKKyAgICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBJMkNfWEZFUl9DUExUX0lUKSA9PSBJMkNfWEZFUl9DUExUX0lUKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSBTVE9QIGludGVycnVwdHMgKi8KKyAgICAgIHRtcGlzciB8PSBJMkNfSVRfU1RPUEk7CisgICAgfQorICB9CisKKyAgLyogRW5hYmxlIGludGVycnVwdHMgb25seSBhdCB0aGUgZW5kICovCisgIC8qIHRvIGF2b2lkIHRoZSByaXNrIG9mIEkyQyBpbnRlcnJ1cHQgaGFuZGxlIGV4ZWN1dGlvbiBiZWZvcmUgKi8KKyAgLyogYWxsIGludGVycnVwdHMgcmVxdWVzdGVkIGRvbmUgKi8KKyAgX19IQUxfSTJDX0VOQUJMRV9JVChoaTJjLCB0bXBpc3IpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgTWFuYWdlIHRoZSBkaXNhYmxpbmcgb2YgSW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgSW50ZXJydXB0UmVxdWVzdCBWYWx1ZSBvZiBAcmVmIEkyQ19JbnRlcnJ1cHRfY29uZmlndXJhdGlvbl9kZWZpbml0aW9uLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEkyQ19EaXNhYmxlX0lSUShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgSW50ZXJydXB0UmVxdWVzdCkKK3sKKyAgdWludDMyX3QgdG1waXNyID0gMFU7CisKKyAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgSTJDX1hGRVJfVFhfSVQpID09IEkyQ19YRkVSX1RYX0lUKQorICB7CisgICAgLyogRGlzYWJsZSBUQyBhbmQgVFhJIGludGVycnVwdHMgKi8KKyAgICB0bXBpc3IgfD0gSTJDX0lUX1RDSSB8IEkyQ19JVF9UWEk7CisKKyAgICBpZiAoKGhpMmMtPlN0YXRlICYgSEFMX0kyQ19TVEFURV9MSVNURU4pICE9IEhBTF9JMkNfU1RBVEVfTElTVEVOKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgTkFDSyBhbmQgU1RPUCBpbnRlcnJ1cHRzICovCisgICAgICB0bXBpc3IgfD0gSTJDX0lUX1NUT1BJIHwgSTJDX0lUX05BQ0tJIHwgSTJDX0lUX0VSUkk7CisgICAgfQorICB9CisKKyAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgSTJDX1hGRVJfUlhfSVQpID09IEkyQ19YRkVSX1JYX0lUKQorICB7CisgICAgLyogRGlzYWJsZSBUQyBhbmQgUlhJIGludGVycnVwdHMgKi8KKyAgICB0bXBpc3IgfD0gSTJDX0lUX1RDSSB8IEkyQ19JVF9SWEk7CisKKyAgICBpZiAoKGhpMmMtPlN0YXRlICYgSEFMX0kyQ19TVEFURV9MSVNURU4pICE9IEhBTF9JMkNfU1RBVEVfTElTVEVOKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgTkFDSyBhbmQgU1RPUCBpbnRlcnJ1cHRzICovCisgICAgICB0bXBpc3IgfD0gSTJDX0lUX1NUT1BJIHwgSTJDX0lUX05BQ0tJIHwgSTJDX0lUX0VSUkk7CisgICAgfQorICB9CisKKyAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgSTJDX1hGRVJfTElTVEVOX0lUKSA9PSBJMkNfWEZFUl9MSVNURU5fSVQpCisgIHsKKyAgICAvKiBEaXNhYmxlIEFERFIsIE5BQ0sgYW5kIFNUT1AgaW50ZXJydXB0cyAqLworICAgIHRtcGlzciB8PSBJMkNfSVRfQUREUkkgfCBJMkNfSVRfU1RPUEkgfCBJMkNfSVRfTkFDS0kgfCBJMkNfSVRfRVJSSTsKKyAgfQorCisgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIEkyQ19YRkVSX0VSUk9SX0lUKSA9PSBJMkNfWEZFUl9FUlJPUl9JVCkKKyAgeworICAgIC8qIEVuYWJsZSBFUlIgYW5kIE5BQ0sgaW50ZXJydXB0cyAqLworICAgIHRtcGlzciB8PSBJMkNfSVRfRVJSSSB8IEkyQ19JVF9OQUNLSTsKKyAgfQorCisgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIEkyQ19YRkVSX0NQTFRfSVQpID09IEkyQ19YRkVSX0NQTFRfSVQpCisgIHsKKyAgICAvKiBFbmFibGUgU1RPUCBpbnRlcnJ1cHRzICovCisgICAgdG1waXNyIHw9IEkyQ19JVF9TVE9QSTsKKyAgfQorCisgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIEkyQ19YRkVSX1JFTE9BRF9JVCkgPT0gSTJDX1hGRVJfUkVMT0FEX0lUKQorICB7CisgICAgLyogRW5hYmxlIFRDIGludGVycnVwdHMgKi8KKyAgICB0bXBpc3IgfD0gSTJDX0lUX1RDSTsKKyAgfQorCisgIC8qIERpc2FibGUgaW50ZXJydXB0cyBvbmx5IGF0IHRoZSBlbmQgKi8KKyAgLyogdG8gYXZvaWQgYSBicmVha2luZyBzaXR1YXRpb24gbGlrZSBhdCAidCIgdGltZSAqLworICAvKiBhbGwgZGlzYWJsZSBpbnRlcnJ1cHRzIHJlcXVlc3QgYXJlIG5vdCBkb25lICovCisgIF9fSEFMX0kyQ19ESVNBQkxFX0lUKGhpMmMsIHRtcGlzcik7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9JMkNfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmM3h4X2hhbF9pMmNfZXguYyBiL1NyYy9zdG0zMmYzeHhfaGFsX2kyY19leC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMTQyZDQKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJmM3h4X2hhbF9pMmNfZXguYwpAQCAtMCwwICsxLDM1MSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfaTJjX2V4LmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEkyQyBFeHRlbmRlZCBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIEkyQyBFeHRlbmRlZCBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEV4dGVuZGVkIGZlYXR1cmVzIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICMjIyMjIEkyQyBwZXJpcGhlcmFsIEV4dGVuZGVkIGZlYXR1cmVzICAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBbLi5dIENvbXBhcmluZyB0byBvdGhlciBwcmV2aW91cyBkZXZpY2VzLCB0aGUgSTJDIGludGVyZmFjZSBmb3IgU1RNMzJGM3h4CisgICAgICAgZGV2aWNlcyBjb250YWlucyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgZmVhdHVyZXMKKworICAgICAgICgrKSBQb3NzaWJpbGl0eSB0byBkaXNhYmxlIG9yIGVuYWJsZSBBbmFsb2cgTm9pc2UgRmlsdGVyCisgICAgICAgKCspIFVzZSBvZiBhIGNvbmZpZ3VyZWQgRGlnaXRhbCBOb2lzZSBGaWx0ZXIKKyAgICAgICAoKykgRGlzYWJsZSBvciBlbmFibGUgd2FrZXVwIGZyb20gU3RvcCBtb2RlKHMpCisgICAgICAgKCspIERpc2FibGUgb3IgZW5hYmxlIEZhc3QgTW9kZSBQbHVzCisKKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0gVGhpcyBkcml2ZXIgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGNvbmZpZ3VyZSBOb2lzZSBGaWx0ZXIgYW5kIFdha2UgVXAgRmVhdHVyZQorICAgICgjKSBDb25maWd1cmUgSTJDIEFuYWxvZyBub2lzZSBmaWx0ZXIgdXNpbmcgdGhlIGZ1bmN0aW9uIEhBTF9JMkNFeF9Db25maWdBbmFsb2dGaWx0ZXIoKQorICAgICgjKSBDb25maWd1cmUgSTJDIERpZ2l0YWwgbm9pc2UgZmlsdGVyIHVzaW5nIHRoZSBmdW5jdGlvbiBIQUxfSTJDRXhfQ29uZmlnRGlnaXRhbEZpbHRlcigpCisgICAgKCMpIENvbmZpZ3VyZSB0aGUgZW5hYmxlIG9yIGRpc2FibGUgb2YgSTJDIFdha2UgVXAgTW9kZSB1c2luZyB0aGUgZnVuY3Rpb25zIDoKKyAgICAgICAgICAoKyspIEhBTF9JMkNFeF9FbmFibGVXYWtlVXAoKQorICAgICAgICAgICgrKykgSEFMX0kyQ0V4X0Rpc2FibGVXYWtlVXAoKQorICAgICgjKSBDb25maWd1cmUgdGhlIGVuYWJsZSBvciBkaXNhYmxlIG9mIGZhc3QgbW9kZSBwbHVzIGRyaXZpbmcgY2FwYWJpbGl0eSB1c2luZyB0aGUgZnVuY3Rpb25zIDoKKyAgICAgICAgICAoKyspIEhBTF9JMkNFeF9FbmFibGVGYXN0TW9kZVBsdXMoKQorICAgICAgICAgICgrKykgSEFMX0kyQ0V4X0Rpc2FibGVGYXN0TW9kZVBsdXMoKQorICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEkyQ0V4IEkyQ0V4CisgICogQGJyaWVmIEkyQyBFeHRlbmRlZCBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfSTJDX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBJMkNFeF9FeHBvcnRlZF9GdW5jdGlvbnMgSTJDIEV4dGVuZGVkIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgRXh0ZW5kZWQgZmVhdHVyZXMgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEV4dGVuZGVkIGZlYXR1cmVzIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgQ29uZmlndXJlIE5vaXNlIEZpbHRlcnMKKyAgICAgICgrKSBDb25maWd1cmUgV2FrZSBVcCBGZWF0dXJlCisgICAgICAoKykgQ29uZmlndXJlIEZhc3QgTW9kZSBQbHVzCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIEkyQyBBbmFsb2cgbm9pc2UgZmlsdGVyLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkN4IHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBBbmFsb2dGaWx0ZXIgTmV3IHN0YXRlIG9mIHRoZSBBbmFsb2cgZmlsdGVyLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ0V4X0NvbmZpZ0FuYWxvZ0ZpbHRlcihJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgQW5hbG9nRmlsdGVyKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9JTlNUQU5DRShoaTJjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FOQUxPR19GSUxURVIoQW5hbG9nRmlsdGVyKSk7CisKKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfQlVTWTsKKworICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIEkyQyBwZXJpcGhlcmFsICovCisgICAgX19IQUxfSTJDX0RJU0FCTEUoaGkyYyk7CisKKyAgICAvKiBSZXNldCBJMkN4IEFOT0ZGIGJpdCAqLworICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgJj0gfihJMkNfQ1IxX0FORk9GRik7CisKKyAgICAvKiBTZXQgYW5hbG9nIGZpbHRlciBiaXQqLworICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgfD0gQW5hbG9nRmlsdGVyOworCisgICAgX19IQUxfSTJDX0VOQUJMRShoaTJjKTsKKworICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBJMkMgRGlnaXRhbCBub2lzZSBmaWx0ZXIuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQ3ggcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIERpZ2l0YWxGaWx0ZXIgQ29lZmZpY2llbnQgb2YgZGlnaXRhbCBub2lzZSBmaWx0ZXIgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDBGLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ0V4X0NvbmZpZ0RpZ2l0YWxGaWx0ZXIoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IERpZ2l0YWxGaWx0ZXIpCit7CisgIHVpbnQzMl90IHRtcHJlZyA9IDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX0lOU1RBTkNFKGhpMmMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19JMkNfRElHSVRBTF9GSUxURVIoRGlnaXRhbEZpbHRlcikpOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX0JVU1k7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBJMkMgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0kyQ19ESVNBQkxFKGhpMmMpOworCisgICAgLyogR2V0IHRoZSBvbGQgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgICB0bXByZWcgPSBoaTJjLT5JbnN0YW5jZS0+Q1IxOworCisgICAgLyogUmVzZXQgSTJDeCBETkYgYml0cyBbMTE6OF0gKi8KKyAgICB0bXByZWcgJj0gfihJMkNfQ1IxX0RORik7CisKKyAgICAvKiBTZXQgSTJDeCBETkYgY29lZmZpY2llbnQgKi8KKyAgICB0bXByZWcgfD0gRGlnaXRhbEZpbHRlciA8PCA4VTsKKworICAgIC8qIFN0b3JlIHRoZSBuZXcgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgICBoaTJjLT5JbnN0YW5jZS0+Q1IxID0gdG1wcmVnOworCisgICAgX19IQUxfSTJDX0VOQUJMRShoaTJjKTsKKworICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBJMkMgd2FrZXVwIGZyb20gU3RvcCBtb2RlKHMpLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkN4IHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDRXhfRW5hYmxlV2FrZVVwKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJDX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShoaTJjLT5JbnN0YW5jZSkpOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX0JVU1k7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBJMkMgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0kyQ19ESVNBQkxFKGhpMmMpOworCisgICAgLyogRW5hYmxlIHdha2V1cCBmcm9tIHN0b3AgbW9kZSAqLworICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgfD0gSTJDX0NSMV9XVVBFTjsKKworICAgIF9fSEFMX0kyQ19FTkFCTEUoaGkyYyk7CisKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEkyQyB3YWtldXAgZnJvbSBTdG9wIG1vZGUocykuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQ3ggcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNFeF9EaXNhYmxlV2FrZVVwKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJDX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShoaTJjLT5JbnN0YW5jZSkpOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX0JVU1k7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBJMkMgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0kyQ19ESVNBQkxFKGhpMmMpOworCisgICAgLyogRW5hYmxlIHdha2V1cCBmcm9tIHN0b3AgbW9kZSAqLworICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgJj0gfihJMkNfQ1IxX1dVUEVOKTsKKworICAgIF9fSEFMX0kyQ19FTkFCTEUoaGkyYyk7CisKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIEVuYWJsZSB0aGUgSTJDIGZhc3QgbW9kZSBwbHVzIGRyaXZpbmcgY2FwYWJpbGl0eS4KKyAgKiBAcGFyYW0gQ29uZmlnRmFzdE1vZGVQbHVzIFNlbGVjdHMgdGhlIHBpbi4KKyAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIEByZWYgSTJDRXhfRmFzdE1vZGVQbHVzIHZhbHVlcworICAqIEBub3RlICBGb3IgSTJDMSwgZmFzdCBtb2RlIHBsdXMgZHJpdmluZyBjYXBhYmlsaXR5IGNhbiBiZSBlbmFibGVkIG9uIGFsbCBzZWxlY3RlZAorICAqICAgICAgICBJMkMxIHBpbnMgdXNpbmcgSTJDX0ZBU1RNT0RFUExVU19JMkMxIHBhcmFtZXRlciBvciBpbmRlcGVuZGVudGx5CisgICogICAgICAgIG9uIGVhY2ggb25lIG9mIHRoZSBmb2xsb3dpbmcgcGlucyBQQjYsIFBCNywgUEI4IGFuZCBQQjkuCisgICogQG5vdGUgIEZvciByZW1haW5pbmcgSTJDMSBwaW5zIChQQTE0LCBQQTE1Li4uKSBmYXN0IG1vZGUgcGx1cyBkcml2aW5nIGNhcGFiaWxpdHkKKyAgKiAgICAgICAgY2FuIGJlIGVuYWJsZWQgb25seSBieSB1c2luZyBJMkNfRkFTVE1PREVQTFVTX0kyQzEgcGFyYW1ldGVyLgorICAqIEBub3RlICBGb3IgYWxsIEkyQzIgcGlucyBmYXN0IG1vZGUgcGx1cyBkcml2aW5nIGNhcGFiaWxpdHkgY2FuIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgb25seSBieSB1c2luZyBJMkNfRkFTVE1PREVQTFVTX0kyQzIgcGFyYW1ldGVyLgorICAqIEBub3RlICBGb3IgYWxsIEkyQzMgcGlucyBmYXN0IG1vZGUgcGx1cyBkcml2aW5nIGNhcGFiaWxpdHkgY2FuIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgb25seSBieSB1c2luZyBJMkNfRkFTVE1PREVQTFVTX0kyQzMgcGFyYW1ldGVyLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfSTJDRXhfRW5hYmxlRmFzdE1vZGVQbHVzKHVpbnQzMl90IENvbmZpZ0Zhc3RNb2RlUGx1cykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJDX0ZBU1RNT0RFUExVUyhDb25maWdGYXN0TW9kZVBsdXMpKTsKKworICAvKiBFbmFibGUgU1lTQ0ZHIGNsb2NrICovCisgIF9fSEFMX1JDQ19TWVNDRkdfQ0xLX0VOQUJMRSgpOworCisgIC8qIEVuYWJsZSBmYXN0IG1vZGUgcGx1cyBkcml2aW5nIGNhcGFiaWxpdHkgZm9yIHNlbGVjdGVkIHBpbiAqLworICBTRVRfQklUKFNZU0NGRy0+Q0ZHUjEsICh1aW50MzJfdClDb25maWdGYXN0TW9kZVBsdXMpOworfQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSB0aGUgSTJDIGZhc3QgbW9kZSBwbHVzIGRyaXZpbmcgY2FwYWJpbGl0eS4KKyAgKiBAcGFyYW0gQ29uZmlnRmFzdE1vZGVQbHVzIFNlbGVjdHMgdGhlIHBpbi4KKyAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIEByZWYgSTJDRXhfRmFzdE1vZGVQbHVzIHZhbHVlcworICAqIEBub3RlICBGb3IgSTJDMSwgZmFzdCBtb2RlIHBsdXMgZHJpdmluZyBjYXBhYmlsaXR5IGNhbiBiZSBkaXNhYmxlZCBvbiBhbGwgc2VsZWN0ZWQKKyAgKiAgICAgICAgSTJDMSBwaW5zIHVzaW5nIEkyQ19GQVNUTU9ERVBMVVNfSTJDMSBwYXJhbWV0ZXIgb3IgaW5kZXBlbmRlbnRseQorICAqICAgICAgICBvbiBlYWNoIG9uZSBvZiB0aGUgZm9sbG93aW5nIHBpbnMgUEI2LCBQQjcsIFBCOCBhbmQgUEI5LgorICAqIEBub3RlICBGb3IgcmVtYWluaW5nIEkyQzEgcGlucyAoUEExNCwgUEExNS4uLikgZmFzdCBtb2RlIHBsdXMgZHJpdmluZyBjYXBhYmlsaXR5CisgICogICAgICAgIGNhbiBiZSBkaXNhYmxlZCBvbmx5IGJ5IHVzaW5nIEkyQ19GQVNUTU9ERVBMVVNfSTJDMSBwYXJhbWV0ZXIuCisgICogQG5vdGUgIEZvciBhbGwgSTJDMiBwaW5zIGZhc3QgbW9kZSBwbHVzIGRyaXZpbmcgY2FwYWJpbGl0eSBjYW4gYmUgZGlzYWJsZWQKKyAgKiAgICAgICAgb25seSBieSB1c2luZyBJMkNfRkFTVE1PREVQTFVTX0kyQzIgcGFyYW1ldGVyLgorICAqIEBub3RlICBGb3IgYWxsIEkyQzMgcGlucyBmYXN0IG1vZGUgcGx1cyBkcml2aW5nIGNhcGFiaWxpdHkgY2FuIGJlIGRpc2FibGVkCisgICogICAgICAgIG9ubHkgYnkgdXNpbmcgSTJDX0ZBU1RNT0RFUExVU19JMkMzIHBhcmFtZXRlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0kyQ0V4X0Rpc2FibGVGYXN0TW9kZVBsdXModWludDMyX3QgQ29uZmlnRmFzdE1vZGVQbHVzKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfRkFTVE1PREVQTFVTKENvbmZpZ0Zhc3RNb2RlUGx1cykpOworCisgIC8qIEVuYWJsZSBTWVNDRkcgY2xvY2sgKi8KKyAgX19IQUxfUkNDX1NZU0NGR19DTEtfRU5BQkxFKCk7CisKKyAgLyogRGlzYWJsZSBmYXN0IG1vZGUgcGx1cyBkcml2aW5nIGNhcGFiaWxpdHkgZm9yIHNlbGVjdGVkIHBpbiAqLworICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMSwgKHVpbnQzMl90KUNvbmZpZ0Zhc3RNb2RlUGx1cyk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfSTJDX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjN4eF9oYWxfaTJzLmMgYi9TcmMvc3RtMzJmM3h4X2hhbF9pMnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGZiNjAyCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZjN4eF9oYWxfaTJzLmMKQEAgLTAsMCArMSwxMzM3IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2hhbF9pMnMuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSTJTIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcgCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBJbnRlZ3JhdGVkIEludGVyY2hpcCBTb3VuZCAoSTJTKSBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucworICBAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIFsuLl0KKyAgICBUaGUgSTJTIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKKyAgICAKKyAgICAoIykgRGVjbGFyZSBhIEkyU19IYW5kbGVUeXBlRGVmIGhhbmRsZSBzdHJ1Y3R1cmUuCisgICAgKCMpIEluaXRpYWxpemUgdGhlIEkyUyBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudCB0aGUgSEFMX0kyU19Nc3BJbml0KCkgQVBJOgorICAgICAgICAoIyMpIEVuYWJsZSB0aGUgU1BJeCBpbnRlcmZhY2UgY2xvY2suICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAoIyMpIEkyUyBwaW5zIGNvbmZpZ3VyYXRpb246CisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgSTJTIEdQSU9zLgorICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZXNlIEkyUyBwaW5zIGFzIGFsdGVybmF0ZSBmdW5jdGlvbiBwdWxsLXVwLgorICAgICAgICAoIyMpIE5WSUMgY29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgaW50ZXJydXB0IHByb2Nlc3MgKEhBTF9JMlNfVHJhbnNtaXRfSVQoKQorICAgICAgICAgICAgIGFuZCBIQUxfSTJTX1JlY2VpdmVfSVQoKSBBUElzKS4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgSTJTeCBpbnRlcnJ1cHQgcHJpb3JpdHkuCisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIE5WSUMgSTJTIElSUSBoYW5kbGUuCisgICAgICAgICgjIykgRE1BIENvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIERNQSBwcm9jZXNzIChIQUxfSTJTX1RyYW5zbWl0X0RNQSgpCisgICAgICAgICAgICAgYW5kIEhBTF9JMlNfUmVjZWl2ZV9ETUEoKSBBUElzOgorICAgICAgICAgICAgKCsrKykgRGVjbGFyZSBhIERNQSBoYW5kbGUgc3RydWN0dXJlIGZvciB0aGUgVHgvUnggY2hhbm5lbC4KKyAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgRE1BeCBpbnRlcmZhY2UgY2xvY2suCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIGRlY2xhcmVkIERNQSBoYW5kbGUgc3RydWN0dXJlIHdpdGggdGhlIHJlcXVpcmVkIFR4L1J4IHBhcmFtZXRlcnMuCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIERNQSBUeC9SeCBDaGFubmVsLgorICAgICAgICAgICAgKCsrKykgQXNzb2NpYXRlIHRoZSBpbml0aWxhbGl6ZWQgRE1BIGhhbmRsZSB0byB0aGUgSTJTIERNQSBUeC9SeCBoYW5kbGUuCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIHByaW9yaXR5IGFuZCBlbmFibGUgdGhlIE5WSUMgZm9yIHRoZSB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgb24gdGhlIAorICAgICAgICAgICAgICAgIERNQSBUeC9SeCBDaGFubmVsLgorICAKKyAgICgjKSBQcm9ncmFtIHRoZSBNb2RlLCBTdGFuZGFyZCwgRGF0YSBGb3JtYXQsIE1DTEsgT3V0cHV0LCBBdWRpbyBmcmVxdWVuY3kgYW5kIFBvbGFyaXR5CisgICAgICAgdXNpbmcgSEFMX0kyU19Jbml0KCkgZnVuY3Rpb24uCisKKyAgIC1ALSBUaGUgc3BlY2lmaWMgSTJTIGludGVycnVwdHMgKFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQsIAorICAgICAgIFJYTkUgaW50ZXJydXB0IGFuZCBFcnJvciBJbnRlcnJ1cHRzKSB3aWxsIGJlIG1hbmFnZWQgdXNpbmcgdGhlIG1hY3JvcworICAgICAgIF9fSEFMX0kyU19FTkFCTEVfSVQoKSBhbmQgX19IQUxfSTJTX0RJU0FCTEVfSVQoKSBpbnNpZGUgdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIHByb2Nlc3MuCisgICAtQC0gTWFrZSBzdXJlIHRoYXQgZWl0aGVyOgorICAgICAgICgrQCkgSTJTIGNsb2NrIGlzIGNvbmZpZ3VyZWQgYmFzZWQgb24gU1lTQ0xLIG9yIAorICAgICAgICgrQCkgRXh0ZXJuYWwgY2xvY2sgc291cmNlIGlzIGNvbmZpZ3VyZWQgYWZ0ZXIgc2V0dGluZyBjb3JyZWN0bHkgCisgICAgICAgICAgICB0aGUgZGVmaW5lIGNvbnN0YW50IEVYVEVSTkFMX0NMT0NLX1ZBTFVFIGluIHRoZSBzdG0zMmYzeHhfaGFsX2NvbmYuaCBmaWxlLiAKKworICAgKCMpIFRocmVlIG1vZGUgb2Ygb3BlcmF0aW9ucyBhcmUgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIGRyaXZlciA6CisgIAorICAgKioqIFBvbGxpbmcgbW9kZSBJTyBvcGVyYXRpb24gKioqCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIFsuLl0gICAgCisgICAgICgrKSBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX0kyU19UcmFuc21pdCgpIAorICAgICAoKykgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlIHVzaW5nIEhBTF9JMlNfUmVjZWl2ZSgpCisgICAKKyAgICoqKiBJbnRlcnJ1cHQgbW9kZSBJTyBvcGVyYXRpb24gKioqCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgWy4uXSAgICAKKyAgICAgKCspIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uIGJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX0kyU19UcmFuc21pdF9JVCgpIAorICAgICAoKykgQXQgdHJhbnNtaXNzaW9uIGVuZCBvZiBoYWxmIHRyYW5zZmVyIEhBTF9JMlNfVHhIYWxmQ3BsdENhbGxiYWNrIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbiAKKyAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9JMlNfVHhIYWxmQ3BsdENhbGxiYWNrIAorICAgICAoKykgQXQgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2ZlciBIQUxfSTJTX1R4Q3BsdENhbGxiYWNrIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbiAKKyAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9JMlNfVHhDcGx0Q2FsbGJhY2sKKyAgICAgKCspIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uIGJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX0kyU19SZWNlaXZlX0lUKCkgCisgICAgICgrKSBBdCByZWNlcHRpb24gZW5kIG9mIGhhbGYgdHJhbnNmZXIgSEFMX0kyU19SeEhhbGZDcGx0Q2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuIAorICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyU19SeEhhbGZDcGx0Q2FsbGJhY2sgCisgICAgICgrKSBBdCByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyIEhBTF9JMlNfUnhDcGx0Q2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuIAorICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyU19SeENwbHRDYWxsYmFjaworICAgICAoKykgSW4gY2FzZSBvZiB0cmFuc2ZlciBFcnJvciwgSEFMX0kyU19FcnJvckNhbGxiYWNrKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuIAorICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyU19FcnJvckNhbGxiYWNrCisKKyAgICoqKiBETUEgbW9kZSBJTyBvcGVyYXRpb24gKioqCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIFsuLl0gCisgICAgICgrKSBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbiBibG9ja2luZyBtb2RlIChETUEpIHVzaW5nIEhBTF9JMlNfVHJhbnNtaXRfRE1BKCkgCisgICAgICgrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIGhhbGYgdHJhbnNmZXIgSEFMX0kyU19UeEhhbGZDcGx0Q2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuIAorICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyU19UeEhhbGZDcGx0Q2FsbGJhY2sgCisgICAgICgrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyIEhBTF9JMlNfVHhDcGx0Q2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuIAorICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyU19UeENwbHRDYWxsYmFjaworICAgICAoKykgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24gYmxvY2tpbmcgbW9kZSAoRE1BKSB1c2luZyBIQUxfSTJTX1JlY2VpdmVfRE1BKCkgCisgICAgICgrKSBBdCByZWNlcHRpb24gZW5kIG9mIGhhbGYgdHJhbnNmZXIgSEFMX0kyU19SeEhhbGZDcGx0Q2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuIAorICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyU19SeEhhbGZDcGx0Q2FsbGJhY2sgCisgICAgICgrKSBBdCByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyIEhBTF9JMlNfUnhDcGx0Q2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuIAorICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyU19SeENwbHRDYWxsYmFjaworICAgICAoKykgSW4gY2FzZSBvZiB0cmFuc2ZlciBFcnJvciwgSEFMX0kyU19FcnJvckNhbGxiYWNrKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuIAorICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyU19FcnJvckNhbGxiYWNrCisgICAgICgrKSBQYXVzZSB0aGUgRE1BIFRyYW5zZmVyIHVzaW5nIEhBTF9JMlNfRE1BUGF1c2UoKQorICAgICAoKykgUmVzdW1lIHRoZSBETUEgVHJhbnNmZXIgdXNpbmcgSEFMX0kyU19ETUFSZXN1bWUoKQorICAgICAoKykgU3RvcCB0aGUgRE1BIFRyYW5zZmVyIHVzaW5nIEhBTF9JMlNfRE1BU3RvcCgpCisKKyAgICoqKiBJMlMgSEFMIGRyaXZlciBtYWNyb3MgbGlzdCAqKioKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgWy4uXQorICAgICBCZWxvdyB0aGUgbGlzdCBvZiBtb3N0IHVzZWQgbWFjcm9zIGluIEkyUyBIQUwgZHJpdmVyLgorICAgICAgIAorICAgICAgKCspIF9fSEFMX0kyU19FTkFCTEU6IEVuYWJsZSB0aGUgc3BlY2lmaWVkIFNQSSBwZXJpcGhlcmFsIChpbiBJMlMgbW9kZSkgCisgICAgICAoKykgX19IQUxfSTJTX0RJU0FCTEU6IERpc2FibGUgdGhlIHNwZWNpZmllZCBTUEkgcGVyaXBoZXJhbCAoaW4gSTJTIG1vZGUpCisgICAgICAoKykgX19IQUxfSTJTX0VOQUJMRV9JVCA6IEVuYWJsZSB0aGUgc3BlY2lmaWVkIEkyUyBpbnRlcnJ1cHRzCisgICAgICAoKykgX19IQUxfSTJTX0RJU0FCTEVfSVQgOiBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgSTJTIGludGVycnVwdHMKKyAgICAgICgrKSBfX0hBTF9JMlNfR0VUX0ZMQUc6IENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBJMlMgZmxhZyBpcyBzZXQgb3Igbm90CisKKyAgICBbLi5dCisgICAgICAoQCkgWW91IGNhbiByZWZlciB0byB0aGUgSTJTIEhBTCBkcml2ZXIgaGVhZGVyIGZpbGUgZm9yIG1vcmUgdXNlZnVsIG1hY3JvcworCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8gCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbC5oIgorCisjaWZkZWYgSEFMX0kyU19NT0RVTEVfRU5BQkxFRAorCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlMgSTJTCisgICogQGJyaWVmIEkyUyBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJMlNfUHJpdmF0ZV9GdW5jdGlvbnMgSTJTIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgSTJTX0RNQVR4Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgIEkyU19ETUFUeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgSTJTX0RNQVJ4Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgIEkyU19ETUFSeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgSTJTX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgSTJTX1RyYW5zbWl0X0lUKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgSTJTX1JlY2VpdmVfSVQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmICBJMlNfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChJMlNfSGFuZGxlVHlwZURlZiAqaGkycywgdWludDMyX3QgRmxhZywgdWludDMyX3QgU3RhdGUsIHVpbnQzMl90IFRpbWVvdXQpOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX0V4cG9ydGVkX0Z1bmN0aW9ucyBJMlMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCAgSTJTX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAKKyAgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAKKyAgKgorQHZlcmJhdGltICAgIAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGluaXRpYWxpemUgYW5kIAorICAgICAgICAgIGRlLWluaXRpYWxpYXplIHRoZSBJMlN4IHBlcmlwaGVyYWwgaW4gc2ltcGxleCBtb2RlOgorCisgICAgICAoKykgVXNlciBtdXN0IEltcGxlbWVudCBIQUxfSTJTX01zcEluaXQoKSBmdW5jdGlvbiBpbiB3aGljaCBoZSBjb25maWd1cmVzIAorICAgICAgICAgIGFsbCByZWxhdGVkIHBlcmlwaGVyYWxzIHJlc291cmNlcyAoQ0xPQ0ssIEdQSU8sIERNQSwgSVQgYW5kIE5WSUMgKS4KKworICAgICAgKCspIENhbGwgdGhlIGZ1bmN0aW9uIEhBTF9JMlNfSW5pdCgpIHRvIGNvbmZpZ3VyZSB0aGUgc2VsZWN0ZWQgZGV2aWNlIHdpdGggCisgICAgICAgICAgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb246CisgICAgICAgICgrKykgTW9kZQorICAgICAgICAoKyspIFN0YW5kYXJkIAorICAgICAgICAoKyspIERhdGEgRm9ybWF0CisgICAgICAgICgrKykgTUNMSyBPdXRwdXQKKyAgICAgICAgKCsrKSBBdWRpbyBmcmVxdWVuY3kKKyAgICAgICAgKCsrKSBQb2xhcml0eQorICAgICAgICAoKyspIEZ1bGwgZHVwbGV4IG1vZGUKKworICAgICAgKCspIENhbGwgdGhlIGZ1bmN0aW9uIEhBTF9JMlNfRGVJbml0KCkgdG8gcmVzdG9yZSB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIAorICAgICAgICAgIG9mIHRoZSBzZWxlY3RlZCBJMlN4IHBlcmlwZXJhbC4gCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgSW5pdGlhbGl6ZXMgdGhlIEkyUyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIAorICAqICAgICAgICAgaW4gdGhlIEkyU19Jbml0VHlwZURlZiBhbmQgY3JlYXRlIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGhpMnM6IHBvaW50ZXIgdG8gYSBJMlNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIEkyUyBtb2R1bGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK19fd2VhayBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX0luaXQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpMnMpOworCisgIC8qIE5vdGUgOiBUaGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQgaW50byB0aGlzIGZpbGUgZm9yIGxpYnJhcnkgcmVmZXJlbmNlLiAgKi8KKyAgLyogICAgICAgIEZ1bmN0aW9uIGNvbnRlbnQgaXMgbG9jYXRlZCBpbnRvIGZpbGUgc3RtMzJmM3h4X2hhbF9pMnNfZXguYyB0byAqLworICAvKiAgICAgICAgaGFuZGxlIHRoZSBwb3NzaWJsZSBJMlMgaW50ZXJmYWNlcyBkZWZpbmVkIGluIFNUTTMyRjN4eCBkZXZpY2VzICovCisgIAorICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzIGFzIG5vdCBpbXBsZW1lbnRlZCBoZXJlICovCisgIHJldHVybiBIQUxfRVJST1I7Cit9CisKKy8qKgorICAqIEBicmllZiBEZUluaXRpYWxpemVzIHRoZSBJMlMgcGVyaXBoZXJhbCAKKyAgKiBAcGFyYW0gIGhpMnM6IHBvaW50ZXIgdG8gYSBJMlNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIEkyUyBtb2R1bGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMlNfRGVJbml0KEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKQoreworICAvKiBDaGVjayB0aGUgSTJTIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmKGhpMnMgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMlNfQUxMX0lOU1RBTkNFKGhpMnMtPkluc3RhbmNlKSk7CisKKyAgaGkycy0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX0JVU1k7CisgIAorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMuLi4gKi8KKyAgSEFMX0kyU19Nc3BEZUluaXQoaGkycyk7CisKKyAgaGkycy0+RXJyb3JDb2RlID0gSEFMX0kyU19FUlJPUl9OT05FOworICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVTRVQ7CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoaTJzKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgSTJTIE1TUCBJbml0CisgICogQHBhcmFtICBoaTJzOiBwb2ludGVyIHRvIGEgSTJTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMlMgbW9kdWxlCisgICogQHJldHZhbCBOb25lCisgICovCisgX193ZWFrIHZvaWQgSEFMX0kyU19Nc3BJbml0KEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaTJzKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0kyU19Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovIAorfQorCisvKioKKyAgKiBAYnJpZWYgSTJTIE1TUCBEZUluaXQKKyAgKiBAcGFyYW0gIGhpMnM6IHBvaW50ZXIgdG8gYSBJMlNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIEkyUyBtb2R1bGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyBfX3dlYWsgdm9pZCBIQUxfSTJTX01zcERlSW5pdChJMlNfSGFuZGxlVHlwZURlZiAqaGkycykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGkycyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9JMlNfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovIAorfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyU19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgCisgICogIEBicmllZiBEYXRhIHRyYW5zZmVycyBmdW5jdGlvbnMgCisgICoKK0B2ZXJiYXRpbSAgIAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgSTJTIGRhdGEgCisgICAgdHJhbnNmZXJzLgorCisgICAgKCMpIFRoZXJlIGFyZSB0d28gbW9kZXMgb2YgdHJhbnNmZXI6CisgICAgICAgKCsrKSBCbG9ja2luZyBtb2RlIDogVGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIGluIHRoZSBwb2xsaW5nIG1vZGUuIAorICAgICAgICAgICAgVGhlIHN0YXR1cyBvZiBhbGwgZGF0YSBwcm9jZXNzaW5nIGlzIHJldHVybmVkIGJ5IHRoZSBzYW1lIGZ1bmN0aW9uIAorICAgICAgICAgICAgYWZ0ZXIgZmluaXNoaW5nIHRyYW5zZmVyLiAgCisgICAgICAgKCsrKSBOby1CbG9ja2luZyBtb2RlIDogVGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nIEludGVycnVwdHMgCisgICAgICAgICAgICBvciBETUEuIFRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgdHJhbnNmZXIgc3RhcnR1cC4KKyAgICAgICAgICAgIFRoZSBlbmQgb2YgdGhlIGRhdGEgcHJvY2Vzc2luZyB3aWxsIGJlIGluZGljYXRlZCB0aHJvdWdoIHRoZSAKKyAgICAgICAgICAgIGRlZGljYXRlZCBJMlMgSVJRIHdoZW4gdXNpbmcgSW50ZXJydXB0IG1vZGUgb3IgdGhlIERNQSBJUlEgd2hlbiAKKyAgICAgICAgICAgIHVzaW5nIERNQSBtb2RlLgorCisgICAgKCMpIEJsb2NraW5nIG1vZGUgZnVuY3Rpb25zIGFyZSA6CisgICAgICAgICgrKykgSEFMX0kyU19UcmFuc21pdCgpCisgICAgICAgICgrKykgSEFMX0kyU19SZWNlaXZlKCkKKyAgICAgICAgCisgICAgKCMpIE5vLUJsb2NraW5nIG1vZGUgZnVuY3Rpb25zIHdpdGggSW50ZXJydXB0IGFyZSA6CisgICAgICAgICgrKykgSEFMX0kyU19UcmFuc21pdF9JVCgpCisgICAgICAgICgrKykgSEFMX0kyU19SZWNlaXZlX0lUKCkKKworICAgICgjKSBOby1CbG9ja2luZyBtb2RlIGZ1bmN0aW9ucyB3aXRoIERNQSBhcmUgOgorICAgICAgICAoKyspIEhBTF9JMlNfVHJhbnNtaXRfRE1BKCkKKyAgICAgICAgKCsrKSBIQUxfSTJTX1JlY2VpdmVfRE1BKCkKKworICAgICgjKSBBIHNldCBvZiBUcmFuc2ZlciBDb21wbGV0ZSBDYWxsYmFja3MgYXJlIHByb3ZpZGVkIGluIG5vbiBCbG9ja2luZyBtb2RlOgorICAgICAgICAoKyspIEhBTF9JMlNfVHhDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9JMlNfUnhDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9JMlNfRXJyb3JDYWxsYmFjaygpCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBUcmFuc21pdCBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlCisgICogQHBhcmFtICBoaTJzOiBwb2ludGVyIHRvIGEgSTJTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMlMgbW9kdWxlCisgICogQHBhcmFtIHBEYXRhIGEgMTYtYml0IHBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtIFNpemUgbnVtYmVyIG9mIGRhdGEgc2FtcGxlIHRvIGJlIHNlbnQ6CisgICogQG5vdGUgV2hlbiBhIDE2LWJpdCBkYXRhIGZyYW1lIG9yIGEgMTYtYml0IGRhdGEgZnJhbWUgZXh0ZW5kZWQgaXMgc2VsZWN0ZWQgZHVyaW5nIHRoZSBJMlMKKyAgKiAgICAgICBjb25maWd1cmF0aW9uIHBoYXNlLCB0aGUgU2l6ZSBwYXJhbWV0ZXIgbWVhbnMgdGhlIG51bWJlciBvZiAxNi1iaXQgZGF0YSBsZW5ndGggCisgICogICAgICAgaW4gdGhlIHRyYW5zYWN0aW9uIGFuZCB3aGVuIGEgMjQtYml0IGRhdGEgZnJhbWUgb3IgYSAzMi1iaXQgZGF0YSBmcmFtZSBpcyBzZWxlY3RlZCAKKyAgKiAgICAgICB0aGUgU2l6ZSBwYXJhbWV0ZXIgbWVhbnMgdGhlIG51bWJlciBvZiAxNi1iaXQgZGF0YSBsZW5ndGguIAorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQG5vdGUgVGhlIEkyUyBpcyBrZXB0IGVuYWJsZWQgYXQgdGhlIGVuZCBvZiB0cmFuc2FjdGlvbiB0byBhdm9pZCB0aGUgY2xvY2sgZGUtc3luY2hyb25pemF0aW9uIAorICAqICAgICAgIGJldHdlZW4gTWFzdGVyIGFuZCBTbGF2ZShleGFtcGxlOiBhdWRpbyBzdHJlYW1pbmcpLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyU19UcmFuc21pdChJMlNfSGFuZGxlVHlwZURlZiAqaGkycywgdWludDE2X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KQoreworICBpZigocERhdGEgPT0gTlVMTCApIHx8IChTaXplID09IDBVKSkgCisgIHsKKyAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgfQorICAKKyAgaWYoaGkycy0+U3RhdGUgPT0gSEFMX0kyU19TVEFURV9SRUFEWSkKKyAgeyAKKyAgICBpZigoKGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSICYgKFNQSV9JMlNDRkdSX0RBVExFTiB8IFNQSV9JMlNDRkdSX0NITEVOKSkgPT0gSTJTX0RBVEFGT1JNQVRfMjRCKXx8XAorICAgICAgICgoaGkycy0+SW5zdGFuY2UtPkkyU0NGR1IgJiAoU1BJX0kyU0NGR1JfREFUTEVOIHwgU1BJX0kyU0NGR1JfQ0hMRU4pKSA9PSBJMlNfREFUQUZPUk1BVF8zMkIpKQorICAgIHsKKyAgICAgIGhpMnMtPlR4WGZlclNpemUgPSAoU2l6ZSA8PCAxVSk7CisgICAgICBoaTJzLT5UeFhmZXJDb3VudCA9IChTaXplIDw8IDFVKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhpMnMtPlR4WGZlclNpemUgPSBTaXplOworICAgICAgaGkycy0+VHhYZmVyQ291bnQgPSBTaXplOworICAgIH0KKyAgICAKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkycyk7CisgICAgCisgICAgaGkycy0+RXJyb3JDb2RlID0gSEFMX0kyU19FUlJPUl9OT05FOworICAgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9CVVNZX1RYOworICAgCisgICAgLyogQ2hlY2sgaWYgdGhlIEkyUyBpcyBhbHJlYWR5IGVuYWJsZWQgKi8gCisgICAgaWYoKGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSICZTUElfSTJTQ0ZHUl9JMlNFKSAhPSBTUElfSTJTQ0ZHUl9JMlNFKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSBJMlMgcGVyaXBoZXJhbCAqLworICAgICAgX19IQUxfSTJTX0VOQUJMRShoaTJzKTsKKyAgICB9CisgICAgCisgICAgd2hpbGUoaGkycy0+VHhYZmVyQ291bnQgPiAwVSkKKyAgICB7CisgICAgICBoaTJzLT5JbnN0YW5jZS0+RFIgPSAoKnBEYXRhKyspOworICAgICAgaGkycy0+VHhYZmVyQ291bnQtLTsgICAKKyAgICAgIC8qIFdhaXQgdW50aWwgVFhFIGZsYWcgaXMgc2V0ICovCisgICAgICBpZiAoSTJTX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaGkycywgSTJTX0ZMQUdfVFhFLCBSRVNFVCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICAvKiBTZXQgdGhlIGVycm9yIGNvZGUgYW5kIGV4ZWN1dGUgZXJyb3IgY2FsbGJhY2sqLworICAgICAgICBoaTJzLT5FcnJvckNvZGUgfD0gSEFMX0kyU19FUlJPUl9USU1FT1VUOworICAgICAgICBIQUxfSTJTX0Vycm9yQ2FsbGJhY2soaGkycyk7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKworICAgICAgLyogQ2hlY2sgaWYgYW4gdW5kZXJydW4gb2NjdXJzICovCisgICAgICBpZihfX0hBTF9JMlNfR0VUX0ZMQUcoaGkycywgSTJTX0ZMQUdfVURSKSA9PSBTRVQpIAorICAgICAgeworICAgICAgICAvKiBTZXQgdGhlIEkyUyBTdGF0ZSByZWFkeSAqLworICAgICAgICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVBRFk7IAorCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhpMnMpOworCisgICAgICAgIC8qIFNldCB0aGUgZXJyb3IgY29kZSBhbmQgZXhlY3V0ZSBlcnJvciBjYWxsYmFjayovCisgICAgICAgIGhpMnMtPkVycm9yQ29kZSB8PSBIQUxfSTJTX0VSUk9SX1VEUjsKKyAgICAgICAgSEFMX0kyU19FcnJvckNhbGxiYWNrKGhpMnMpOworCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICAgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9SRUFEWTsgCisgICAgCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJzKTsKKyAgICAKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlIAorICAqIEBwYXJhbSAgaGkyczogcG9pbnRlciB0byBhIEkyU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgSTJTIG1vZHVsZQorICAqIEBwYXJhbSBwRGF0YSBhIDE2LWJpdCBwb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSBTaXplIG51bWJlciBvZiBkYXRhIHNhbXBsZSB0byBiZSBzZW50OgorICAqIEBub3RlIFdoZW4gYSAxNi1iaXQgZGF0YSBmcmFtZSBvciBhIDE2LWJpdCBkYXRhIGZyYW1lIGV4dGVuZGVkIGlzIHNlbGVjdGVkIGR1cmluZyB0aGUgSTJTCisgICogICAgICAgY29uZmlndXJhdGlvbiBwaGFzZSwgdGhlIFNpemUgcGFyYW1ldGVyIG1lYW5zIHRoZSBudW1iZXIgb2YgMTYtYml0IGRhdGEgbGVuZ3RoIAorICAqICAgICAgIGluIHRoZSB0cmFuc2FjdGlvbiBhbmQgd2hlbiBhIDI0LWJpdCBkYXRhIGZyYW1lIG9yIGEgMzItYml0IGRhdGEgZnJhbWUgaXMgc2VsZWN0ZWQgCisgICogICAgICAgdGhlIFNpemUgcGFyYW1ldGVyIG1lYW5zIHRoZSBudW1iZXIgb2YgMTYtYml0IGRhdGEgbGVuZ3RoLiAKKyAgKiBAcGFyYW0gVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQG5vdGUgVGhlIEkyUyBpcyBrZXB0IGVuYWJsZWQgYXQgdGhlIGVuZCBvZiB0cmFuc2FjdGlvbiB0byBhdm9pZCB0aGUgY2xvY2sgZGUtc3luY2hyb25pemF0aW9uIAorICAqICAgICAgIGJldHdlZW4gTWFzdGVyIGFuZCBTbGF2ZShleGFtcGxlOiBhdWRpbyBzdHJlYW1pbmcpLgorICAqIEBub3RlIEluIEkyUyBNYXN0ZXIgUmVjZWl2ZXIgbW9kZSwganVzdCBhZnRlciBlbmFibGluZyB0aGUgcGVyaXBoZXJhbCB0aGUgY2xvY2sgd2lsbCBiZSBnZW5lcmF0ZQorICAqICAgICAgIGluIGNvbnRpbm91c2Ugd2F5IGFuZCBhcyB0aGUgSTJTIGlzIG5vdCBkaXNhYmxlZCBhdCB0aGUgZW5kIG9mIHRoZSBJMlMgdHJhbnNhY3Rpb24uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX1JlY2VpdmUoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMsIHVpbnQxNl90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgaWYoKHBEYXRhID09IE5VTEwgKSB8fCAoU2l6ZSA9PSAwVSkpIAorICB7CisgICAgcmV0dXJuICBIQUxfRVJST1I7CisgIH0KKyAgCisgIGlmKGhpMnMtPlN0YXRlID09IEhBTF9JMlNfU1RBVEVfUkVBRFkpCisgIHsgCisgICAgaWYoKChoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiAmIChTUElfSTJTQ0ZHUl9EQVRMRU4gfCBTUElfSTJTQ0ZHUl9DSExFTikpID09IEkyU19EQVRBRk9STUFUXzI0Qil8fFwKKyAgICAgICAoKGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSICYgKFNQSV9JMlNDRkdSX0RBVExFTiB8IFNQSV9JMlNDRkdSX0NITEVOKSkgPT0gSTJTX0RBVEFGT1JNQVRfMzJCKSkKKyAgICB7CisgICAgICBoaTJzLT5SeFhmZXJTaXplID0gKFNpemUgPDwgMVUpOworICAgICAgaGkycy0+UnhYZmVyQ291bnQgPSAoU2l6ZSA8PCAxVSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoaTJzLT5SeFhmZXJTaXplID0gU2l6ZTsKKyAgICAgIGhpMnMtPlJ4WGZlckNvdW50ID0gU2l6ZTsKKyAgICB9CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMnMpOworCisgICAgaGkycy0+RXJyb3JDb2RlID0gSEFMX0kyU19FUlJPUl9OT05FOworICAgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9CVVNZX1JYOworCisgICAgLyogQ2hlY2sgaWYgdGhlIEkyUyBpcyBhbHJlYWR5IGVuYWJsZWQgKi8gCisgICAgaWYoKGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSICYgU1BJX0kyU0NGR1JfSTJTRSkgIT0gU1BJX0kyU0NGR1JfSTJTRSkKKyAgICB7CisgICAgICAvKiBFbmFibGUgSTJTIHBlcmlwaGVyYWwgKi8KKyAgICAgIF9fSEFMX0kyU19FTkFCTEUoaGkycyk7CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgTWFzdGVyIFJlY2VpdmVyIG1vZGUgaXMgc2VsZWN0ZWQgKi8KKyAgICBpZigoaGkycy0+SW5zdGFuY2UtPkkyU0NGR1IgJiBTUElfSTJTQ0ZHUl9JMlNDRkcpID09IEkyU19NT0RFX01BU1RFUl9SWCkKKyAgICB7CisgICAgICAvKiBDbGVhciB0aGUgT3ZlcnJ1biBGbGFnIGJ5IGEgcmVhZCBvcGVyYXRpb24gb24gdGhlIFNQSV9EUiByZWdpc3RlciBmb2xsb3dlZCBieSBhIHJlYWQKKyAgICAgIGFjY2VzcyB0byB0aGUgU1BJX1NSIHJlZ2lzdGVyLiAqLyAKKyAgICAgIF9fSEFMX0kyU19DTEVBUl9PVlJGTEFHKGhpMnMpOworICAgIH0KKworICAgIC8qIFJlY2VpdmUgZGF0YSAqLworICAgIHdoaWxlKGhpMnMtPlJ4WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgLyogV2FpdCB1bnRpbCBSWE5FIGZsYWcgaXMgc2V0ICovCisgICAgICBpZiAoSTJTX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaGkycywgSTJTX0ZMQUdfUlhORSwgUkVTRVQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogU2V0IHRoZSBlcnJvciBjb2RlIGFuZCBleGVjdXRlIGVycm9yIGNhbGxiYWNrKi8KKyAgICAgICAgaGkycy0+RXJyb3JDb2RlIHw9IEhBTF9JMlNfRVJST1JfVElNRU9VVDsKKyAgICAgICAgSEFMX0kyU19FcnJvckNhbGxiYWNrKGhpMnMpOworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgICAKKyAgICAgIC8qIENoZWNrIGlmIGFuIG92ZXJydW4gb2NjdXJzICovCisgICAgICBpZihfX0hBTF9JMlNfR0VUX0ZMQUcoaGkycywgSTJTX0ZMQUdfT1ZSKSA9PSBTRVQpIAorICAgICAgeworICAgICAgICAvKiBTZXQgdGhlIEkyUyBTdGF0ZSByZWFkeSAqLworICAgICAgICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVBRFk7IAorCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhpMnMpOworCisgICAgICAgIC8qIFNldCB0aGUgZXJyb3IgY29kZSBhbmQgZXhlY3V0ZSBlcnJvciBjYWxsYmFjayovCisgICAgICAgIGhpMnMtPkVycm9yQ29kZSB8PSBIQUxfSTJTX0VSUk9SX09WUjsKKyAgICAgICAgSEFMX0kyU19FcnJvckNhbGxiYWNrKGhpMnMpOworCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisKKyAgICAgICgqcERhdGErKykgPSBoaTJzLT5JbnN0YW5jZS0+RFI7CisgICAgICBoaTJzLT5SeFhmZXJDb3VudC0tOworICAgIH0KKworICAgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9SRUFEWTsgCisgICAgCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJzKTsKKyAgICAKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgVHJhbnNtaXQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQKKyAgKiBAcGFyYW0gIGhpMnM6IHBvaW50ZXIgdG8gYSBJMlNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIEkyUyBtb2R1bGUKKyAgKiBAcGFyYW0gcERhdGEgYSAxNi1iaXQgcG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gU2l6ZSBudW1iZXIgb2YgZGF0YSBzYW1wbGUgdG8gYmUgc2VudDoKKyAgKiBAbm90ZSBXaGVuIGEgMTYtYml0IGRhdGEgZnJhbWUgb3IgYSAxNi1iaXQgZGF0YSBmcmFtZSBleHRlbmRlZCBpcyBzZWxlY3RlZCBkdXJpbmcgdGhlIEkyUworICAqICAgICAgIGNvbmZpZ3VyYXRpb24gcGhhc2UsIHRoZSBTaXplIHBhcmFtZXRlciBtZWFucyB0aGUgbnVtYmVyIG9mIDE2LWJpdCBkYXRhIGxlbmd0aCAKKyAgKiAgICAgICBpbiB0aGUgdHJhbnNhY3Rpb24gYW5kIHdoZW4gYSAyNC1iaXQgZGF0YSBmcmFtZSBvciBhIDMyLWJpdCBkYXRhIGZyYW1lIGlzIHNlbGVjdGVkIAorICAqICAgICAgIHRoZSBTaXplIHBhcmFtZXRlciBtZWFucyB0aGUgbnVtYmVyIG9mIDE2LWJpdCBkYXRhIGxlbmd0aC4gCisgICogQG5vdGUgVGhlIEkyUyBpcyBrZXB0IGVuYWJsZWQgYXQgdGhlIGVuZCBvZiB0cmFuc2FjdGlvbiB0byBhdm9pZCB0aGUgY2xvY2sgZGUtc3luY2hyb25pemF0aW9uIAorICAqICAgICAgIGJldHdlZW4gTWFzdGVyIGFuZCBTbGF2ZShleGFtcGxlOiBhdWRpbyBzdHJlYW1pbmcpLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyU19UcmFuc21pdF9JVChJMlNfSGFuZGxlVHlwZURlZiAqaGkycywgdWludDE2X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICBpZihoaTJzLT5TdGF0ZSA9PSBIQUxfSTJTX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkgCisgICAgeworICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgfQorCisgICAgaGkycy0+cFR4QnVmZlB0ciA9IHBEYXRhOworICAgIGlmKCgoaGkycy0+SW5zdGFuY2UtPkkyU0NGR1IgJiAoU1BJX0kyU0NGR1JfREFUTEVOIHwgU1BJX0kyU0NGR1JfQ0hMRU4pKSA9PSBJMlNfREFUQUZPUk1BVF8yNEIpfHxcCisgICAgICAoKGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSICYgKFNQSV9JMlNDRkdSX0RBVExFTiB8IFNQSV9JMlNDRkdSX0NITEVOKSkgPT0gSTJTX0RBVEFGT1JNQVRfMzJCKSkKKyAgICB7CisgICAgICBoaTJzLT5UeFhmZXJTaXplID0gKFNpemUgPDwgMVUpOworICAgICAgaGkycy0+VHhYZmVyQ291bnQgPSAoU2l6ZSA8PCAxVSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoaTJzLT5UeFhmZXJTaXplID0gU2l6ZTsKKyAgICAgIGhpMnMtPlR4WGZlckNvdW50ID0gU2l6ZTsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkycyk7CisKKyAgICBoaTJzLT5FcnJvckNvZGUgPSBIQUxfSTJTX0VSUk9SX05PTkU7CisgICAgaGkycy0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX0JVU1lfVFg7CisKKyAgICAvKiBFbmFibGUgVFhFIGFuZCBFUlIgaW50ZXJydXB0ICovCisgICAgX19IQUxfSTJTX0VOQUJMRV9JVChoaTJzLCAoSTJTX0lUX1RYRSB8IEkyU19JVF9FUlIpKTsKKworICAgIC8qIENoZWNrIGlmIHRoZSBJMlMgaXMgYWxyZWFkeSBlbmFibGVkICovIAorICAgIGlmKChoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiAmU1BJX0kyU0NGR1JfSTJTRSkgIT0gU1BJX0kyU0NGR1JfSTJTRSkKKyAgICB7CisgICAgICAvKiBFbmFibGUgSTJTIHBlcmlwaGVyYWwgKi8KKyAgICAgIF9fSEFMX0kyU19FTkFCTEUoaGkycyk7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJzKTsKKyAgICAKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdAorICAqIEBwYXJhbSAgaGkyczogcG9pbnRlciB0byBhIEkyU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgSTJTIG1vZHVsZQorICAqIEBwYXJhbSBwRGF0YSBhIDE2LWJpdCBwb2ludGVyIHRvIHRoZSBSZWNlaXZlIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSBTaXplIG51bWJlciBvZiBkYXRhIHNhbXBsZSB0byBiZSBzZW50OgorICAqIEBub3RlIFdoZW4gYSAxNi1iaXQgZGF0YSBmcmFtZSBvciBhIDE2LWJpdCBkYXRhIGZyYW1lIGV4dGVuZGVkIGlzIHNlbGVjdGVkIGR1cmluZyB0aGUgSTJTCisgICogICAgICAgY29uZmlndXJhdGlvbiBwaGFzZSwgdGhlIFNpemUgcGFyYW1ldGVyIG1lYW5zIHRoZSBudW1iZXIgb2YgMTYtYml0IGRhdGEgbGVuZ3RoIAorICAqICAgICAgIGluIHRoZSB0cmFuc2FjdGlvbiBhbmQgd2hlbiBhIDI0LWJpdCBkYXRhIGZyYW1lIG9yIGEgMzItYml0IGRhdGEgZnJhbWUgaXMgc2VsZWN0ZWQgCisgICogICAgICAgdGhlIFNpemUgcGFyYW1ldGVyIG1lYW5zIHRoZSBudW1iZXIgb2YgMTYtYml0IGRhdGEgbGVuZ3RoLiAKKyAgKiBAbm90ZSBUaGUgSTJTIGlzIGtlcHQgZW5hYmxlZCBhdCB0aGUgZW5kIG9mIHRyYW5zYWN0aW9uIHRvIGF2b2lkIHRoZSBjbG9jayBkZS1zeW5jaHJvbml6YXRpb24gCisgICogICAgICAgYmV0d2VlbiBNYXN0ZXIgYW5kIFNsYXZlKGV4YW1wbGU6IGF1ZGlvIHN0cmVhbWluZykuCisgICogQG5vdGUgSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIERNQSBmb3IgdGhlIEkyUyByZWNlaXZlciB0byBhdm9pZCBkZS1zeW5jaHJvbmlzYXRpb24gCisgICogYmV0d2VlbiBNYXN0ZXIgYW5kIFNsYXZlIG90aGVyd2lzZSB0aGUgSTJTIGludGVycnVwdCBzaG91bGQgYmUgb3B0aW1pemVkLiAKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMlNfUmVjZWl2ZV9JVChJMlNfSGFuZGxlVHlwZURlZiAqaGkycywgdWludDE2X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICBpZihoaTJzLT5TdGF0ZSA9PSBIQUxfSTJTX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkgCisgICAgeworICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgfQorCisgICAgaGkycy0+cFJ4QnVmZlB0ciA9IHBEYXRhOworICAgIGlmKCgoaGkycy0+SW5zdGFuY2UtPkkyU0NGR1IgJiAoU1BJX0kyU0NGR1JfREFUTEVOIHwgU1BJX0kyU0NGR1JfQ0hMRU4pKSA9PSBJMlNfREFUQUZPUk1BVF8yNEIpfHxcCisgICAgICAoKGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSICYgKFNQSV9JMlNDRkdSX0RBVExFTiB8IFNQSV9JMlNDRkdSX0NITEVOKSkgPT0gSTJTX0RBVEFGT1JNQVRfMzJCKSkKKyAgICB7CisgICAgICBoaTJzLT5SeFhmZXJTaXplID0gKFNpemUgPDwgMVUpOworICAgICAgaGkycy0+UnhYZmVyQ291bnQgPSAoU2l6ZSA8PCAxVSk7CisgICAgfSAgCisgICAgZWxzZQorICAgIHsKKyAgICAgIGhpMnMtPlJ4WGZlclNpemUgPSBTaXplOworICAgICAgaGkycy0+UnhYZmVyQ291bnQgPSBTaXplOworICAgIH0KKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkycyk7CisgICAgCisgICAgaGkycy0+RXJyb3JDb2RlID0gSEFMX0kyU19FUlJPUl9OT05FOworICAgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9CVVNZX1JYOworCisgICAgLyogRW5hYmxlIFRYRSBhbmQgRVJSIGludGVycnVwdCAqLworICAgIF9fSEFMX0kyU19FTkFCTEVfSVQoaGkycywgKEkyU19JVF9SWE5FIHwgSTJTX0lUX0VSUikpOworICAgIAorICAgIC8qIENoZWNrIGlmIHRoZSBJMlMgaXMgYWxyZWFkeSBlbmFibGVkICovIAorICAgIGlmKChoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiAmU1BJX0kyU0NGR1JfSTJTRSkgIT0gU1BJX0kyU0NGR1JfSTJTRSkKKyAgICB7CisgICAgICAvKiBFbmFibGUgSTJTIHBlcmlwaGVyYWwgKi8KKyAgICAgIF9fSEFMX0kyU19FTkFCTEUoaGkycyk7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJzKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOyAKKyAgfSAKK30KKworLyoqCisgICogQGJyaWVmIFRyYW5zbWl0IGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggRE1BCisgICogQHBhcmFtICBoaTJzOiBwb2ludGVyIHRvIGEgSTJTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMlMgbW9kdWxlCisgICogQHBhcmFtIHBEYXRhIGEgMTYtYml0IHBvaW50ZXIgdG8gdGhlIFRyYW5zbWl0IGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSBTaXplIG51bWJlciBvZiBkYXRhIHNhbXBsZSB0byBiZSBzZW50OgorICAqIEBub3RlIFdoZW4gYSAxNi1iaXQgZGF0YSBmcmFtZSBvciBhIDE2LWJpdCBkYXRhIGZyYW1lIGV4dGVuZGVkIGlzIHNlbGVjdGVkIGR1cmluZyB0aGUgSTJTCisgICogICAgICAgY29uZmlndXJhdGlvbiBwaGFzZSwgdGhlIFNpemUgcGFyYW1ldGVyIG1lYW5zIHRoZSBudW1iZXIgb2YgMTYtYml0IGRhdGEgbGVuZ3RoIAorICAqICAgICAgIGluIHRoZSB0cmFuc2FjdGlvbiBhbmQgd2hlbiBhIDI0LWJpdCBkYXRhIGZyYW1lIG9yIGEgMzItYml0IGRhdGEgZnJhbWUgaXMgc2VsZWN0ZWQgCisgICogICAgICAgdGhlIFNpemUgcGFyYW1ldGVyIG1lYW5zIHRoZSBudW1iZXIgb2YgMTYtYml0IGRhdGEgbGVuZ3RoLiAKKyAgKiBAbm90ZSBUaGUgSTJTIGlzIGtlcHQgZW5hYmxlZCBhdCB0aGUgZW5kIG9mIHRyYW5zYWN0aW9uIHRvIGF2b2lkIHRoZSBjbG9jayBkZS1zeW5jaHJvbml6YXRpb24gCisgICogICAgICAgYmV0d2VlbiBNYXN0ZXIgYW5kIFNsYXZlKGV4YW1wbGU6IGF1ZGlvIHN0cmVhbWluZykuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX1RyYW5zbWl0X0RNQShJMlNfSGFuZGxlVHlwZURlZiAqaGkycywgdWludDE2X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICB1aW50MzJfdCAqdG1wOworICAKKyAgaWYoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkgCisgIHsKKyAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgfQorCisgIGlmKGhpMnMtPlN0YXRlID09IEhBTF9JMlNfU1RBVEVfUkVBRFkpCisgIHsgIAorICAgIGhpMnMtPnBUeEJ1ZmZQdHIgPSBwRGF0YTsKKyAgICBpZigoKGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSICYgKFNQSV9JMlNDRkdSX0RBVExFTiB8IFNQSV9JMlNDRkdSX0NITEVOKSkgPT0gSTJTX0RBVEFGT1JNQVRfMjRCKXx8XAorICAgICAgKChoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiAmIChTUElfSTJTQ0ZHUl9EQVRMRU4gfCBTUElfSTJTQ0ZHUl9DSExFTikpID09IEkyU19EQVRBRk9STUFUXzMyQikpCisgICAgeworICAgICAgaGkycy0+VHhYZmVyU2l6ZSA9IChTaXplIDw8IDFVKTsKKyAgICAgIGhpMnMtPlR4WGZlckNvdW50ID0gKFNpemUgPDwgMVUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGkycy0+VHhYZmVyU2l6ZSA9IFNpemU7CisgICAgICBoaTJzLT5UeFhmZXJDb3VudCA9IFNpemU7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMnMpOworCisgICAgaGkycy0+RXJyb3JDb2RlID0gSEFMX0kyU19FUlJPUl9OT05FOworICAgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9CVVNZX1RYOworCisgICAgLyogU2V0IHRoZSBJMlMgVHggRE1BIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBoaTJzLT5oZG1hdHgtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gSTJTX0RNQVR4SGFsZkNwbHQ7CisKKyAgICAvKiBTZXQgdGhlIEkyUyBUeCBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBoaTJzLT5oZG1hdHgtPlhmZXJDcGx0Q2FsbGJhY2sgPSBJMlNfRE1BVHhDcGx0OworCisgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICBoaTJzLT5oZG1hdHgtPlhmZXJFcnJvckNhbGxiYWNrID0gSTJTX0RNQUVycm9yOworCisgICAgLyogRW5hYmxlIHRoZSBUeCBETUEgQ2hhbm5lbCAqLworICAgIHRtcCA9ICh1aW50MzJfdCopJnBEYXRhOworICAgIEhBTF9ETUFfU3RhcnRfSVQoaGkycy0+aGRtYXR4LCAqKHVpbnQzMl90Kil0bXAsICh1aW50MzJfdCkmaGkycy0+SW5zdGFuY2UtPkRSLCBoaTJzLT5UeFhmZXJTaXplKTsKKworICAgIC8qIENoZWNrIGlmIHRoZSBJMlMgaXMgYWxyZWFkeSBlbmFibGVkICovIAorICAgIGlmKChoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiAmU1BJX0kyU0NGR1JfSTJTRSkgIT0gU1BJX0kyU0NGR1JfSTJTRSkKKyAgICB7CisgICAgICAvKiBFbmFibGUgSTJTIHBlcmlwaGVyYWwgKi8KKyAgICAgIF9fSEFMX0kyU19FTkFCTEUoaGkycyk7CisgICAgfQorCisgICAgLyogRW5hYmxlIFR4IERNQSBSZXF1ZXN0ICovCisgICAgaGkycy0+SW5zdGFuY2UtPkNSMiB8PSBTUElfQ1IyX1RYRE1BRU47CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMnMpOworICAgIAorICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggRE1BIAorICAqIEBwYXJhbSAgaGkyczogcG9pbnRlciB0byBhIEkyU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgSTJTIG1vZHVsZQorICAqIEBwYXJhbSBwRGF0YSBhIDE2LWJpdCBwb2ludGVyIHRvIHRoZSBSZWNlaXZlIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSBTaXplIG51bWJlciBvZiBkYXRhIHNhbXBsZSB0byBiZSBzZW50OgorICAqIEBub3RlIFdoZW4gYSAxNi1iaXQgZGF0YSBmcmFtZSBvciBhIDE2LWJpdCBkYXRhIGZyYW1lIGV4dGVuZGVkIGlzIHNlbGVjdGVkIGR1cmluZyB0aGUgSTJTCisgICogICAgICAgY29uZmlndXJhdGlvbiBwaGFzZSwgdGhlIFNpemUgcGFyYW1ldGVyIG1lYW5zIHRoZSBudW1iZXIgb2YgMTYtYml0IGRhdGEgbGVuZ3RoIAorICAqICAgICAgIGluIHRoZSB0cmFuc2FjdGlvbiBhbmQgd2hlbiBhIDI0LWJpdCBkYXRhIGZyYW1lIG9yIGEgMzItYml0IGRhdGEgZnJhbWUgaXMgc2VsZWN0ZWQgCisgICogICAgICAgdGhlIFNpemUgcGFyYW1ldGVyIG1lYW5zIHRoZSBudW1iZXIgb2YgMTYtYml0IGRhdGEgbGVuZ3RoLiAKKyAgKiBAbm90ZSBUaGUgSTJTIGlzIGtlcHQgZW5hYmxlZCBhdCB0aGUgZW5kIG9mIHRyYW5zYWN0aW9uIHRvIGF2b2lkIHRoZSBjbG9jayBkZS1zeW5jaHJvbml6YXRpb24gCisgICogICAgICAgYmV0d2VlbiBNYXN0ZXIgYW5kIFNsYXZlKGV4YW1wbGU6IGF1ZGlvIHN0cmVhbWluZykuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX1JlY2VpdmVfRE1BKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzLCB1aW50MTZfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIHVpbnQzMl90ICp0bXA7CisgIAorICBpZigocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKSAKKyAgeworICAgIHJldHVybiAgSEFMX0VSUk9SOworICB9CisKKyAgaWYoaGkycy0+U3RhdGUgPT0gSEFMX0kyU19TVEFURV9SRUFEWSkKKyAgeworICAgIGhpMnMtPnBSeEJ1ZmZQdHIgPSBwRGF0YTsKKyAgICBpZigoKGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSICYgKFNQSV9JMlNDRkdSX0RBVExFTiB8IFNQSV9JMlNDRkdSX0NITEVOKSkgPT0gSTJTX0RBVEFGT1JNQVRfMjRCKXx8XAorICAgICAgKChoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiAmIChTUElfSTJTQ0ZHUl9EQVRMRU4gfCBTUElfSTJTQ0ZHUl9DSExFTikpID09IEkyU19EQVRBRk9STUFUXzMyQikpCisgICAgeworICAgICAgaGkycy0+UnhYZmVyU2l6ZSA9IChTaXplIDw8IDFVKTsKKyAgICAgIGhpMnMtPlJ4WGZlckNvdW50ID0gKFNpemUgPDwgMVUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGkycy0+UnhYZmVyU2l6ZSA9IFNpemU7CisgICAgICBoaTJzLT5SeFhmZXJDb3VudCA9IFNpemU7CisgICAgfQorICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJzKTsKKyAgICAKKyAgICBoaTJzLT5FcnJvckNvZGUgPSBIQUxfSTJTX0VSUk9SX05PTkU7CisgICAgaGkycy0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX0JVU1lfUlg7CisgICAKKyAgICAvKiBTZXQgdGhlIEkyUyBSeCBETUEgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGhpMnMtPmhkbWFyeC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBJMlNfRE1BUnhIYWxmQ3BsdDsKKworICAgIC8qIFNldCB0aGUgSTJTIFJ4IERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGhpMnMtPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayA9IEkyU19ETUFSeENwbHQ7CisgICAgCisgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICBoaTJzLT5oZG1hcngtPlhmZXJFcnJvckNhbGxiYWNrID0gSTJTX0RNQUVycm9yOworICAgIAorICAgIC8qIENoZWNrIGlmIE1hc3RlciBSZWNlaXZlciBtb2RlIGlzIHNlbGVjdGVkICovCisgICAgaWYoKGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSICYgU1BJX0kyU0NGR1JfSTJTQ0ZHKSA9PSBJMlNfTU9ERV9NQVNURVJfUlgpCisgICAgeworICAgICAgLyogQ2xlYXIgdGhlIE92ZXJydW4gRmxhZyBieSBhIHJlYWQgb3BlcmF0aW9uIHRvIHRoZSBTUElfRFIgcmVnaXN0ZXIgZm9sbG93ZWQgYnkgYSByZWFkCisgICAgICBhY2Nlc3MgdG8gdGhlIFNQSV9TUiByZWdpc3Rlci4gKi8gCisgICAgICBfX0hBTF9JMlNfQ0xFQVJfT1ZSRkxBRyhoaTJzKTsKKyAgICB9CisgICAgCisgICAgLyogRW5hYmxlIHRoZSBSeCBETUEgQ2hhbm5lbCAqLworICAgIHRtcCA9ICh1aW50MzJfdCopJnBEYXRhOworICAgIEhBTF9ETUFfU3RhcnRfSVQoaGkycy0+aGRtYXJ4LCAodWludDMyX3QpJmhpMnMtPkluc3RhbmNlLT5EUiwgKih1aW50MzJfdCopdG1wLCBoaTJzLT5SeFhmZXJTaXplKTsKKyAgICAKKyAgICAvKiBDaGVjayBpZiB0aGUgSTJTIGlzIGFscmVhZHkgZW5hYmxlZCAqLyAKKyAgICBpZigoaGkycy0+SW5zdGFuY2UtPkkyU0NGR1IgJlNQSV9JMlNDRkdSX0kyU0UpICE9IFNQSV9JMlNDRkdSX0kyU0UpCisgICAgeworICAgICAgLyogRW5hYmxlIEkyUyBwZXJpcGhlcmFsICovCisgICAgICBfX0hBTF9JMlNfRU5BQkxFKGhpMnMpOworICAgIH0KKworICAgIC8qIEVuYWJsZSBSeCBETUEgUmVxdWVzdCAqLworICAgIGhpMnMtPkluc3RhbmNlLT5DUjIgfD0gU1BJX0NSMl9SWERNQUVOOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJzKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBQYXVzZXMgdGhlIGF1ZGlvIHN0cmVhbSBwbGF5aW5nIGZyb20gdGhlIE1lZGlhLgorICAqIEBwYXJhbSAgaGkyczogcG9pbnRlciB0byBhIEkyU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgSTJTIG1vZHVsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworX193ZWFrIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMlNfRE1BUGF1c2UoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGkycyk7CisgIAorICBpZihoaTJzLT5TdGF0ZSA9PSBIQUxfSTJTX1NUQVRFX0JVU1lfVFgpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBJMlMgRE1BIFR4IHJlcXVlc3QgKi8KKyAgICBoaTJzLT5JbnN0YW5jZS0+Q1IyICY9ICh1aW50MzJfdCkoflNQSV9DUjJfVFhETUFFTik7CisgIH0KKyAgZWxzZSBpZihoaTJzLT5TdGF0ZSA9PSBIQUxfSTJTX1NUQVRFX0JVU1lfUlgpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBJMlMgRE1BIFJ4IHJlcXVlc3QgKi8KKyAgICBoaTJzLT5JbnN0YW5jZS0+Q1IyICY9ICh1aW50MzJfdCkoflNQSV9DUjJfUlhETUFFTik7CisgIH0KKyAgCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhpMnMpOworICAKKyAgcmV0dXJuIEhBTF9PSzsgCit9CisKKy8qKgorICAqIEBicmllZiBSZXN1bWVzIHRoZSBhdWRpbyBzdHJlYW0gcGxheWluZyBmcm9tIHRoZSBNZWRpYS4KKyAgKiBAcGFyYW0gIGhpMnM6IHBvaW50ZXIgdG8gYSBJMlNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIEkyUyBtb2R1bGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK19fd2VhayBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX0RNQVJlc3VtZShJMlNfSGFuZGxlVHlwZURlZiAqaGkycykKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaTJzKTsKKyAgCisgIGlmKGhpMnMtPlN0YXRlID09IEhBTF9JMlNfU1RBVEVfQlVTWV9UWCkKKyAgeworICAgIC8qIEVuYWJsZSB0aGUgSTJTIERNQSBUeCByZXF1ZXN0ICovCisgICAgaGkycy0+SW5zdGFuY2UtPkNSMiB8PSBTUElfQ1IyX1RYRE1BRU47CisgIH0KKyAgZWxzZSBpZihoaTJzLT5TdGF0ZSA9PSBIQUxfSTJTX1NUQVRFX0JVU1lfUlgpCisgIHsKKyAgICAvKiBFbmFibGUgdGhlIEkyUyBETUEgUnggcmVxdWVzdCAqLworICAgIGhpMnMtPkluc3RhbmNlLT5DUjIgfD0gU1BJX0NSMl9SWERNQUVOOworICB9CisgIAorICAvKiBJZiB0aGUgSTJTIHBlcmlwaGVyYWwgaXMgc3RpbGwgbm90IGVuYWJsZWQsIGVuYWJsZSBpdCAqLworICBpZiAoKGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSICYgU1BJX0kyU0NGR1JfSTJTRSkgPT0gMFUpCisgIHsKKyAgICAvKiBFbmFibGUgSTJTIHBlcmlwaGVyYWwgKi8gICAgCisgICAgX19IQUxfSTJTX0VOQUJMRShoaTJzKTsKKyAgfQorICAKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGkycyk7CisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgUmVzdW1lcyB0aGUgYXVkaW8gc3RyZWFtIHBsYXlpbmcgZnJvbSB0aGUgTWVkaWEuCisgICogQHBhcmFtICBoaTJzOiBwb2ludGVyIHRvIGEgSTJTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMlMgbW9kdWxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitfX3dlYWsgSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyU19ETUFTdG9wKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKQoreworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhpMnMpOworICAKKyAgLyogRGlzYWJsZSB0aGUgSTJTIFR4L1J4IERNQSByZXF1ZXN0cyAqLworICBoaTJzLT5JbnN0YW5jZS0+Q1IyICY9ICh1aW50MzJfdCkoflNQSV9DUjJfVFhETUFFTik7CisgIGhpMnMtPkluc3RhbmNlLT5DUjIgJj0gKHVpbnQzMl90KSh+U1BJX0NSMl9SWERNQUVOKTsKKyAgCisgIC8qIEFib3J0IHRoZSBJMlMgRE1BIHR4IGNoYW5uZWwgKi8KKyAgaWYoaGkycy0+aGRtYXR4ICE9IE5VTEwpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBJMlMgRE1BIGNoYW5uZWwgKi8KKyAgICBfX0hBTF9ETUFfRElTQUJMRShoaTJzLT5oZG1hdHgpOworICAgIEhBTF9ETUFfQWJvcnQoaGkycy0+aGRtYXR4KTsKKyAgfQorICAvKiBBYm9ydCB0aGUgSTJTIERNQSByeCBjaGFubmVsICovCisgIGlmKGhpMnMtPmhkbWFyeCAhPSBOVUxMKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgSTJTIERNQSBjaGFubmVsICovCisgICAgX19IQUxfRE1BX0RJU0FCTEUoaGkycy0+aGRtYXJ4KTsKKyAgICBIQUxfRE1BX0Fib3J0KGhpMnMtPmhkbWFyeCk7CisgIH0KKworICAvKiBEaXNhYmxlIEkyUyBwZXJpcGhlcmFsICovCisgIF9fSEFMX0kyU19ESVNBQkxFKGhpMnMpOworICAKKyAgaGkycy0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX1JFQURZOworICAKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGkycyk7CisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBJMlMgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBoaTJzOiBwb2ludGVyIHRvIGEgSTJTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMlMgbW9kdWxlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9JMlNfSVJRSGFuZGxlcihJMlNfSGFuZGxlVHlwZURlZiAqaGkycykKK3sgIAorICBfX0lPIHVpbnQzMl90IGkyc3NyID0gaGkycy0+SW5zdGFuY2UtPlNSOworCisgIGlmKGhpMnMtPlN0YXRlID09IEhBTF9JMlNfU1RBVEVfQlVTWV9SWCkKKyAgeyAgCisgICAgLyogSTJTIGluIG1vZGUgUmVjZWl2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYoKChpMnNzciAmIEkyU19GTEFHX1JYTkUpID09IEkyU19GTEFHX1JYTkUpICYmIChfX0hBTF9JMlNfR0VUX0lUX1NPVVJDRShoaTJzLCBJMlNfSVRfUlhORSkgIT0gUkVTRVQpKQorICAgIHsKKyAgICAgIEkyU19SZWNlaXZlX0lUKGhpMnMpOworICAgIH0KKworICAgIC8qIEkyUyBPdmVycnVuIGVycm9yIGludGVycnVwdCBvY2N1cmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmKCgoaTJzc3IgJiBJMlNfRkxBR19PVlIpID09IEkyU19GTEFHX09WUikgJiYgKF9fSEFMX0kyU19HRVRfSVRfU09VUkNFKGhpMnMsIEkyU19JVF9FUlIpICE9IFJFU0VUKSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIFJYTkUgYW5kIEVSUiBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX0kyU19ESVNBQkxFX0lUKGhpMnMsIChJMlNfSVRfUlhORSB8IEkyU19JVF9FUlIpKTsKKworICAgICAgLyogU2V0IHRoZSBJMlMgU3RhdGUgcmVhZHkgKi8KKyAgICAgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9SRUFEWTsgCisKKyAgICAgIC8qIFNldCB0aGUgZXJyb3IgY29kZSBhbmQgZXhlY3V0ZSBlcnJvciBjYWxsYmFjayovCisgICAgICBoaTJzLT5FcnJvckNvZGUgfD0gSEFMX0kyU19FUlJPUl9PVlI7CisgICAgICBIQUxfSTJTX0Vycm9yQ2FsbGJhY2soaGkycyk7CisgICAgfSAgCisgIH0KKyAgZWxzZSBpZihoaTJzLT5TdGF0ZSA9PSBIQUxfSTJTX1NUQVRFX0JVU1lfVFgpCisgIHsgIAorICAgIC8qIEkyUyBpbiBtb2RlIFRyYW1pdHRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmKCgoaTJzc3IgJiBJMlNfRkxBR19UWEUpID09IEkyU19GTEFHX1RYRSkgJiYgKF9fSEFMX0kyU19HRVRfSVRfU09VUkNFKGhpMnMsIEkyU19JVF9UWEUpICE9IFJFU0VUKSkKKyAgICB7ICAgICAKKyAgICAgIEkyU19UcmFuc21pdF9JVChoaTJzKTsKKyAgICB9IAorICAgIAorICAgIC8qIEkyUyBVbmRlcnJ1biBlcnJvciBpbnRlcnJ1cHQgb2NjdXJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmKCgoaTJzc3IgJiBJMlNfRkxBR19VRFIpID09IEkyU19GTEFHX1VEUikgJiYgKF9fSEFMX0kyU19HRVRfSVRfU09VUkNFKGhpMnMsIEkyU19JVF9FUlIpICE9IFJFU0VUKSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIFRYRSBhbmQgRVJSIGludGVycnVwdCAqLworICAgICAgX19IQUxfSTJTX0RJU0FCTEVfSVQoaGkycywgKEkyU19JVF9UWEUgfCBJMlNfSVRfRVJSKSk7CisKKyAgICAgIC8qIFNldCB0aGUgSTJTIFN0YXRlIHJlYWR5ICovCisgICAgICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVBRFk7IAorCisgICAgICAvKiBTZXQgdGhlIGVycm9yIGNvZGUgYW5kIGV4ZWN1dGUgZXJyb3IgY2FsbGJhY2sqLworICAgICAgaGkycy0+RXJyb3JDb2RlIHw9IEhBTF9JMlNfRVJST1JfVURSOworICAgICAgSEFMX0kyU19FcnJvckNhbGxiYWNrKGhpMnMpOworICAgIH0KKyAgfQorfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKworLyoqIEBhZGR0b2dyb3VwIEkyU19FeHBvcnRlZF9GdW5jdGlvbnMgSTJTIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCAgSTJTX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgVHggVHJhbnNmZXIgSGFsZiBjb21wbGV0ZWQgY2FsbGJhY2tzCisgICogQHBhcmFtICBoaTJzOiBwb2ludGVyIHRvIGEgSTJTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMlMgbW9kdWxlCisgICogQHJldHZhbCBOb25lCisgICovCisgX193ZWFrIHZvaWQgSEFMX0kyU19UeEhhbGZDcGx0Q2FsbGJhY2soSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpMnMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSTJTX1R4SGFsZkNwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQGJyaWVmIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFja3MKKyAgKiBAcGFyYW0gIGhpMnM6IHBvaW50ZXIgdG8gYSBJMlNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIEkyUyBtb2R1bGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyBfX3dlYWsgdm9pZCBIQUxfSTJTX1R4Q3BsdENhbGxiYWNrKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaTJzKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0kyU19UeENwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQGJyaWVmIFJ4IFRyYW5zZmVyIGhhbGYgY29tcGxldGVkIGNhbGxiYWNrcworICAqIEBwYXJhbSAgaGkyczogcG9pbnRlciB0byBhIEkyU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgSTJTIG1vZHVsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0kyU19SeEhhbGZDcGx0Q2FsbGJhY2soSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpMnMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSTJTX1J4Q3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2tzCisgICogQHBhcmFtICBoaTJzOiBwb2ludGVyIHRvIGEgSTJTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMlMgbW9kdWxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSTJTX1J4Q3BsdENhbGxiYWNrKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaTJzKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0kyU19SeENwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgSTJTIGVycm9yIGNhbGxiYWNrcworICAqIEBwYXJhbSAgaGkyczogcG9pbnRlciB0byBhIEkyU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgSTJTIG1vZHVsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworIF9fd2VhayB2b2lkIEhBTF9JMlNfRXJyb3JDYWxsYmFjayhJMlNfSGFuZGxlVHlwZURlZiAqaGkycykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGkycyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9JMlNfRXJyb3JDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zIAorICAqICBAYnJpZWYgICBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAKKyAgKgorQHZlcmJhdGltICAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHBlcm1pdHMgdG8gZ2V0IGluIHJ1bi10aW1lIHRoZSBzdGF0dXMgb2YgdGhlIHBlcmlwaGVyYWwgCisgICAgYW5kIHRoZSBkYXRhIGZsb3cuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBJMlMgc3RhdGUKKyAgKiBAcGFyYW0gIGhpMnM6IHBvaW50ZXIgdG8gYSBJMlNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIEkyUyBtb2R1bGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLworSEFMX0kyU19TdGF0ZVR5cGVEZWYgSEFMX0kyU19HZXRTdGF0ZShJMlNfSGFuZGxlVHlwZURlZiAqaGkycykKK3sKKyAgcmV0dXJuIGhpMnMtPlN0YXRlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgSTJTIGVycm9yIGNvZGUKKyAgKiBAcGFyYW0gIGhpMnM6IHBvaW50ZXIgdG8gYSBJMlNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIEkyUyBtb2R1bGUKKyAgKiBAcmV0dmFsIEkyUyBFcnJvciBDb2RlCisgICovCit1aW50MzJfdCBIQUxfSTJTX0dldEVycm9yKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKQoreworICByZXR1cm4gaGkycy0+RXJyb3JDb2RlOworfQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEkyU19Qcml2YXRlX0Z1bmN0aW9ucyBJMlMgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmIERNQSBJMlMgdHJhbnNtaXQgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjayAKKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEkyU19ETUFUeENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIEkyU19IYW5kbGVUeXBlRGVmKiBoaTJzID0gKCBJMlNfSGFuZGxlVHlwZURlZiogKSgoRE1BX0hhbmRsZVR5cGVEZWYqICloZG1hKS0+UGFyZW50OworICAKKyAgaWYoKGhkbWEtPkluc3RhbmNlLT5DQ1IgJiBETUFfQ0NSX0NJUkMpID09IDBVKQorICB7CisgICAgLyogRGlzYWJsZSBUeCBETUEgUmVxdWVzdCAqLworICAgIGhpMnMtPkluc3RhbmNlLT5DUjIgJj0gKHVpbnQzMl90KSh+U1BJX0NSMl9UWERNQUVOKTsKKyAgCisgICAgaGkycy0+VHhYZmVyQ291bnQgPSAwVTsKKyAgICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVBRFk7CisgIH0KKyAgSEFMX0kyU19UeENwbHRDYWxsYmFjayhoaTJzKTsKK30KKworLyoqCisgICogQGJyaWVmIERNQSBJMlMgdHJhbnNtaXQgcHJvY2VzcyBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrIAorICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJTX0RNQVR4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIEkyU19IYW5kbGVUeXBlRGVmKiBoaTJzID0gKEkyU19IYW5kbGVUeXBlRGVmKikoKERNQV9IYW5kbGVUeXBlRGVmKiloZG1hKS0+UGFyZW50OworCisgIEhBTF9JMlNfVHhIYWxmQ3BsdENhbGxiYWNrKGhpMnMpOworfQorCisvKioKKyAgKiBAYnJpZWYgRE1BIEkyUyByZWNlaXZlIHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2sgCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMlNfRE1BUnhDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBJMlNfSGFuZGxlVHlwZURlZiogaGkycyA9ICggSTJTX0hhbmRsZVR5cGVEZWYqICkoKERNQV9IYW5kbGVUeXBlRGVmKiApaGRtYSktPlBhcmVudDsKKworICBpZigoaGRtYS0+SW5zdGFuY2UtPkNDUiAmIERNQV9DQ1JfQ0lSQykgPT0gMFUpCisgIHsKKyAgICAvKiBEaXNhYmxlIFJ4IERNQSBSZXF1ZXN0ICovCisgICAgaGkycy0+SW5zdGFuY2UtPkNSMiAmPSAodWludDMyX3QpKH5TUElfQ1IyX1JYRE1BRU4pOworICAgIGhpMnMtPlJ4WGZlckNvdW50ID0gMFU7CisgICAgaGkycy0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX1JFQURZOworICB9CisgIEhBTF9JMlNfUnhDcGx0Q2FsbGJhY2soaGkycyk7IAorfQorCisvKioKKyAgKiBAYnJpZWYgRE1BIEkyUyByZWNlaXZlIHByb2Nlc3MgaGFsZiBjb21wbGV0ZSBjYWxsYmFjayAKKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEkyU19ETUFSeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBJMlNfSGFuZGxlVHlwZURlZiogaGkycyA9IChJMlNfSGFuZGxlVHlwZURlZiopKChETUFfSGFuZGxlVHlwZURlZiopaGRtYSktPlBhcmVudDsKKworICBIQUxfSTJTX1J4SGFsZkNwbHRDYWxsYmFjayhoaTJzKTsgCit9CisKKy8qKgorICAqIEBicmllZiBETUEgSTJTIGNvbW11bmljYXRpb24gZXJyb3IgY2FsbGJhY2sgCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMlNfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIEkyU19IYW5kbGVUeXBlRGVmKiBoaTJzID0gKCBJMlNfSGFuZGxlVHlwZURlZiogKSgoRE1BX0hhbmRsZVR5cGVEZWYqICloZG1hKS0+UGFyZW50OworICAKKyAgLyogRGlzYWJsZSBSeCBhbmQgVHggRE1BIFJlcXVlc3QgKi8KKyAgaGkycy0+SW5zdGFuY2UtPkNSMiAmPSAodWludDMyX3QpKH4oU1BJX0NSMl9SWERNQUVOIHwgU1BJX0NSMl9UWERNQUVOKSk7CisgIGhpMnMtPlR4WGZlckNvdW50ID0gMFU7CisgIGhpMnMtPlJ4WGZlckNvdW50ID0gMFU7CisgIAorICBoaTJzLT5TdGF0ZT0gSEFMX0kyU19TVEFURV9SRUFEWTsKKworICAvKiBTZXQgdGhlIGVycm9yIGNvZGUgYW5kIGV4ZWN1dGUgZXJyb3IgY2FsbGJhY2sqLworICBoaTJzLT5FcnJvckNvZGUgfD0gSEFMX0kyU19FUlJPUl9ETUE7CisgIEhBTF9JMlNfRXJyb3JDYWxsYmFjayhoaTJzKTsKK30KKworLyoqCisgICogQGJyaWVmIFRyYW5zbWl0IGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0CisgICogQHBhcmFtICBoaTJzOiBwb2ludGVyIHRvIGEgSTJTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMlMgbW9kdWxlCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMlNfVHJhbnNtaXRfSVQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpCit7CisgIC8qIFRyYW5zbWl0IGRhdGEgKi8KKyAgaGkycy0+SW5zdGFuY2UtPkRSID0gKCpoaTJzLT5wVHhCdWZmUHRyKyspOworICBoaTJzLT5UeFhmZXJDb3VudC0tOworCisgIGlmKGhpMnMtPlR4WGZlckNvdW50ID09IDBVKQorICB7CisgICAgLyogRGlzYWJsZSBUWEUgYW5kIEVSUiBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9JMlNfRElTQUJMRV9JVChoaTJzLCAoSTJTX0lUX1RYRSB8IEkyU19JVF9FUlIpKTsKKworICAgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9SRUFEWTsKKyAgICBIQUxfSTJTX1R4Q3BsdENhbGxiYWNrKGhpMnMpOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0CisgICogQHBhcmFtIGhpMnM6IEkyUyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEkyU19SZWNlaXZlX0lUKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKQoreworICAvKiBSZWNlaXZlIGRhdGEgKi8gICAgCisgICgqaGkycy0+cFJ4QnVmZlB0cisrKSA9IGhpMnMtPkluc3RhbmNlLT5EUjsKKyAgaGkycy0+UnhYZmVyQ291bnQtLTsKKworICBpZihoaTJzLT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgeworICAgIC8qIERpc2FibGUgUlhORSBhbmQgRVJSIGludGVycnVwdCAqLworICAgIF9fSEFMX0kyU19ESVNBQkxFX0lUKGhpMnMsIChJMlNfSVRfUlhORSB8IEkyU19JVF9FUlIpKTsKKworICAgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9SRUFEWTsgICAgIAorICAgIEhBTF9JMlNfUnhDcGx0Q2FsbGJhY2soaGkycyk7IAorICB9Cit9CisKKy8qKgorICAqIEBicmllZiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgSTJTIENvbW11bmljYXRpb24gVGltZW91dC4KKyAgKiBAcGFyYW0gIGhpMnM6IHBvaW50ZXIgdG8gYSBJMlNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIEkyUyBtb2R1bGUKKyAgKiBAcGFyYW0gRmxhZyBGbGFnIGNoZWNrZWQKKyAgKiBAcGFyYW0gU3RhdGUgVmFsdWUgb2YgdGhlIGZsYWcgZXhwZWN0ZWQKKyAgKiBAcGFyYW0gVGltZW91dCBEdXJhdGlvbiBvZiB0aGUgdGltZW91dAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEkyU19XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KEkyU19IYW5kbGVUeXBlRGVmICpoaTJzLCB1aW50MzJfdCBGbGFnLCB1aW50MzJfdCBTdGF0ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgCisgIC8qIFdhaXQgdW50aWwgZmxhZyBpcyBzZXQgKi8KKyAgaWYoU3RhdGUgPT0gUkVTRVQpCisgIHsKKyAgICB3aGlsZShfX0hBTF9JMlNfR0VUX0ZMQUcoaGkycywgRmxhZykgPT0gUkVTRVQpCisgICAgeworICAgICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgICAgeworICAgICAgICBpZigoVGltZW91dCA9PSAwVSkgfHwgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IHRoZSBJMlMgU3RhdGUgcmVhZHkgKi8KKyAgICAgICAgICBoaTJzLT5TdGF0ZT0gSEFMX0kyU19TVEFURV9SRUFEWTsKKworICAgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaGkycyk7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgd2hpbGUoX19IQUxfSTJTX0dFVF9GTEFHKGhpMnMsIEZsYWcpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICAgIHsKKyAgICAgICAgaWYoKFRpbWVvdXQgPT0gMFUpIHx8ICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCB0aGUgSTJTIFN0YXRlIHJlYWR5ICovCisgICAgICAgICAgaGkycy0+U3RhdGU9IEhBTF9JMlNfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhpMnMpOworCisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggICAgICAgICAgICAgICAgICAgKi8KKworI2VuZGlmIC8qIEhBTF9JMlNfTU9EVUxFX0VOQUJMRUQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmYzeHhfaGFsX2kyc19leC5jIGIvU3JjL3N0bTMyZjN4eF9oYWxfaTJzX2V4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZiNTNmNwotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfaGFsX2kyc19leC5jCkBAIC0wLDAgKzEsMTYwMCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfaTJzX2V4LmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEkyUyBFeHRlbmRlZCBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nIAorICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiBJMlMgRXh0ZW5kZWQgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBFeHRlbmRlZCBmZWF0dXJlcyBGdW5jdGlvbnMKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICMjIyMjIEkyUyBFeHRlbmRlZCBmZWF0dXJlcyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCisgWy4uXQorICAgICgjKSBJbiBJMlMgZnVsbCBkdXBsZXggbW9kZSwgZWFjaCBTUEkgcGVyaXBoZXJhbCBpcyBhYmxlIHRvIG1hbmFnZSBzZW5kaW5nIGFuZCByZWNlaXZpbmcgCisgICAgICAgIGRhdGEgc2ltdWx0YW5lb3VzbHkgdXNpbmcgdHdvIGRhdGEgbGluZXMuIEVhY2ggU1BJIHBlcmlwaGVyYWwgaGFzIGFuIGV4dGVuZGVkIGJsb2NrIAorICAgICAgICBjYWxsZWQgSTJTeGV4dCBpZS4gSTJTMmV4dCBmb3IgU1BJMiBhbmQgSTJTM2V4dCBmb3IgU1BJMykuCisgICAgKCMpIFRoZSBFeHRlbmRlZCBibG9jayBpcyBub3QgYSBmdWxsIFNQSSBJUCwgaXQgaXMgdXNlZCBvbmx5IGFzIEkyUyBzbGF2ZSB0bworICAgICAgICBpbXBsZW1lbnQgZnVsbCBkdXBsZXggbW9kZS4gVGhlIEV4dGVuZGVkIGJsb2NrIHVzZXMgdGhlIHNhbWUgY2xvY2sgc291cmNlcworICAgICAgICBhcyBpdHMgbWFzdGVyLgorCisgICAgKCMpIEJvdGggSTJTeCBhbmQgSTJTeF9leHQgY2FuIGJlIGNvbmZpZ3VyZWQgYXMgdHJhbnNtaXR0ZXJzIG9yIHJlY2VpdmVycy4KKworICAgICAtQC0gT25seSBJMlN4IGNhbiBkZWxpdmVyIFNDSyBhbmQgV1MgdG8gSTJTeF9leHQgaW4gZnVsbCBkdXBsZXggbW9kZSwgd2hlcmUgCisgICAgICAgICBJMlN4IGNhbiBiZSBJMlMyIG9yIEkyUzMuCisKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIFsuLl0KKyAgIFRocmVlIG1vZGUgb2Ygb3BlcmF0aW9ucyBhcmUgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIGRyaXZlciA6ICAgICAKKyAgICAKKyAgICoqKiBQb2xsaW5nIG1vZGUgSU8gb3BlcmF0aW9uICoqKgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBbLi5dICAgIAorICAgICAoKykgU2VuZCBhbmQgcmVjZWl2ZSBpbiB0aGUgc2FtZSB0aW1lIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX0kyU19UcmFuc21pdFJlY2VpdmUoKSAKKyAgCisgICAqKiogSW50ZXJydXB0IG1vZGUgSU8gb3BlcmF0aW9uICoqKiAgICAKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBbLi5dICAgIAorICAgICAoKykgU2VuZCBhbmQgcmVjZWl2ZSBpbiB0aGUgc2FtZSB0aW1lIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbiBibG9ja2luZyBtb2RlIHVzaW5nIEhBTF9JMlNfVHJhbnNtaXRSZWNlaXZlX0lUKCkgCisgICAgICgrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIGhhbGYgdHJhbnNmZXIgSEFMX0kyU19UeEhhbGZDcGx0Q2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuIAorICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyU19UeEhhbGZDcGx0Q2FsbGJhY2sgCisgICAgICgrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyIEhBTF9JMlNfVHhDcGx0Q2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuIAorICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyU19UeENwbHRDYWxsYmFjaworICAgICAoKykgQXQgcmVjZXB0aW9uIGVuZCBvZiBoYWxmIHRyYW5zZmVyIEhBTF9JMlNfUnhIYWxmQ3BsdENhbGxiYWNrIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbiAKKyAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9JMlNfUnhIYWxmQ3BsdENhbGxiYWNrIAorICAgICAoKykgQXQgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2ZlciBIQUxfSTJTX1J4Q3BsdENhbGxiYWNrIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbiAKKyAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9JMlNfUnhDcGx0Q2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAoKykgSW4gY2FzZSBvZiB0cmFuc2ZlciBFcnJvciwgSEFMX0kyU19FcnJvckNhbGxiYWNrKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuIAorICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyU19FcnJvckNhbGxiYWNrCisKKyAgICoqKiBETUEgbW9kZSBJTyBvcGVyYXRpb24gKioqICAgIAorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBbLi5dIAorICAgICAoKykgU2VuZCBhbmQgcmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24gYmxvY2tpbmcgbW9kZSAoRE1BKSB1c2luZyBIQUxfSTJTX1RyYW5zbWl0UmVjZWl2ZV9ETUEoKSAKKyAgICAgKCspIEF0IHRyYW5zbWlzc2lvbiBlbmQgb2YgaGFsZiB0cmFuc2ZlciBIQUxfSTJTX1R4SGFsZkNwbHRDYWxsYmFjayBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4gCisgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSTJTX1R4SGFsZkNwbHRDYWxsYmFjayAKKyAgICAgKCspIEF0IHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIgSEFMX0kyU19UeENwbHRDYWxsYmFjayBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4gCisgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSTJTX1R4Q3BsdENhbGxiYWNrCisgICAgICgrKSBBdCByZWNlcHRpb24gZW5kIG9mIGhhbGYgdHJhbnNmZXIgSEFMX0kyU19SeEhhbGZDcGx0Q2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuIAorICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyU19SeEhhbGZDcGx0Q2FsbGJhY2sgCisgICAgICgrKSBBdCByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyIEhBTF9JMlNfUnhDcGx0Q2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuIAorICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyU19SeENwbHRDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgKCspIEluIGNhc2Ugb2YgdHJhbnNmZXIgRXJyb3IsIEhBTF9JMlNfRXJyb3JDYWxsYmFjaygpIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbiAKKyAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9JMlNfRXJyb3JDYWxsYmFjaworICAgICAoKykgUGF1c2UgdGhlIERNQSBUcmFuc2ZlciB1c2luZyBIQUxfSTJTX0RNQVBhdXNlKCkgICAgICAKKyAgICAgKCspIFJlc3VtZSB0aGUgRE1BIFRyYW5zZmVyIHVzaW5nIEhBTF9JMlNfRE1BUmVzdW1lKCkgIAorICAgICAoKykgU3RvcCB0aGUgRE1BIFRyYW5zZmVyIHVzaW5nIEhBTF9JMlNfRE1BU3RvcCgpICAKKyAgCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKy8qCisgIEFkZGl0aW9uYWwgRmlndXJlOiBUaGUgRXh0ZW5kZWQgYmxvY2sgdXNlcyB0aGUgc2FtZSBjbG9jayBzb3VyY2VzIGFzIGl0cyBtYXN0ZXIuCisKKyAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgSTJTeF9TQ0sgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfAorICAtLS0tLS0tLS0tKy0tPnwgICAgICAgICAgSTJTeCAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tPkkyU3hfU0QoaW4vb3V0KQorICAgICAgICAgKy0tfC0tPnwgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfCAgIHwgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgIHwgICB8ICAgICAgICAgIAorIEkyU19XUyB8ICAgfCAgICAgICAgICAgCisgLS0tLS0tPnwgICB8ICAgICAgICAgIAorICAgICAgICB8ICAgfCAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgfCAgICstLT58ICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgIHwgICAgICAgfCAgICAgICBJMlN4X2V4dCAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0+STJTeF9leHRTRChpbi9vdXQpCisgICAgICAgICArLS0tLS0+fCAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbC5oIgorCisjaWZkZWYgSEFMX0kyU19NT0RVTEVfRU5BQkxFRAorCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNFeCBJMlNFeAorICAqIEBicmllZiBJMlMgRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoU1BJX0kyU19GVUxMRFVQTEVYX1NVUFBPUlQpCisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEkyU0V4X1ByaXZhdGVfVHlwZWRlZiBJMlMgRXh0ZW5kZWQgUHJpdmF0ZSBUeXBlZGVmCisgICogQHsKKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBJMlNfVVNFX0kyUyAgICAgID0gMHgwMFUsICAgLyohPCBJMlN4IHNob3VsZCBiZSB1c2VkICAgICAgICAgICAqLworICBJMlNfVVNFX0kyU0VYVCAgID0gMHgwMSAgICAvKiE8IEkyU3hfZXh0IHNob3VsZCBiZSB1c2VkICAgICAgICovICAgCit9STJTX1VzZVR5cGVEZWY7CisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJMlNFeF9Qcml2YXRlX0Z1bmN0aW9ucyBJMlMgRXh0ZW5kZWQgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworc3RhdGljIHZvaWQgSTJTX1R4UnhETUFDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIEkyU19UeFJ4RE1BSGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgSTJTX1R4UnhETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBJMlNfRnVsbER1cGxleFR4X0lUKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzLCBJMlNfVXNlVHlwZURlZiBpMnNVc2VkKTsKK3N0YXRpYyB2b2lkIEkyU19GdWxsRHVwbGV4UnhfSVQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMsIEkyU19Vc2VUeXBlRGVmIGkyc1VzZWQpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEkyU19GdWxsRHVwbGV4V2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChJMlNfSGFuZGxlVHlwZURlZiAqaGkycywgdWludDMyX3QgRmxhZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFN0YXRlLCB1aW50MzJfdCBUaW1lb3V0LCBJMlNfVXNlVHlwZURlZiBpMnNVc2VkKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogU1BJX0kyU19GVUxMRFVQTEVYX1NVUFBPUlQgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAYWRkdG9ncm91cCBJMlMgSTJTCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEkyU19FeHBvcnRlZF9GdW5jdGlvbnMgSTJTIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCAgSTJTX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGluaXRpYWxpemUgYW5kIAorICAgICAgICAgIGRlLWluaXRpYWxpYXplIHRoZSBJMlN4IHBlcmlwaGVyYWwgaW4gc2ltcGxleCBtb2RlOgorCisgICAgICAoKykgVXNlciBtdXN0IEltcGxlbWVudCBIQUxfSTJTX01zcEluaXQoKSBmdW5jdGlvbiBpbiB3aGljaCBoZSBjb25maWd1cmVzIAorICAgICAgICAgIGFsbCByZWxhdGVkIHBlcmlwaGVyYWxzIHJlc291cmNlcyAoQ0xPQ0ssIEdQSU8sIERNQSwgSVQgYW5kIE5WSUMgKS4KKworICAgICAgKCspIENhbGwgdGhlIGZ1bmN0aW9uIEhBTF9JMlNfSW5pdCgpIHRvIGNvbmZpZ3VyZSB0aGUgc2VsZWN0ZWQgZGV2aWNlIHdpdGggCisgICAgICAgICAgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb246CisgICAgICAgICgrKykgTW9kZQorICAgICAgICAoKyspIFN0YW5kYXJkIAorICAgICAgICAoKyspIERhdGEgRm9ybWF0CisgICAgICAgICgrKykgTUNMSyBPdXRwdXQKKyAgICAgICAgKCsrKSBBdWRpbyBmcmVxdWVuY3kKKyAgICAgICAgKCsrKSBQb2xhcml0eQorCisgICAgICAoKykgQ2FsbCB0aGUgZnVuY3Rpb24gSEFMX0kyU19EZUluaXQoKSB0byByZXN0b3JlIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gCisgICAgICAgICAgb2YgdGhlIHNlbGVjdGVkIEkyU3ggcGVyaXBlcmFsLiAKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBJbml0aWFsaXplcyB0aGUgSTJTIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgCisgICogICAgICAgICBpbiB0aGUgSTJTX0luaXRUeXBlRGVmIGFuZCBjcmVhdGUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBwYXJhbSBoaTJzOiBJMlMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX0luaXQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpCit7CisgIHVpbnQxNl90IHRtcHJlZyA9IDBVLCBpMnNkaXYgPSAyVSwgaTJzb2RkID0gMFUsIHBhY2tldGxlbmd0aCA9IDFVOworICB1aW50MzJfdCB0bXAgPSAwVSwgaTJzY2xrID0gMFU7CisjaWYgZGVmaW5lZChTUElfSTJTX0ZVTExEVVBMRVhfU1VQUE9SVCkKKyAgUkNDX1BlcmlwaENMS0luaXRUeXBlRGVmIHJjY3BlcmlwaGNsa2luaXQ7CisjZW5kaWYgLyogU1BJX0kyU19GVUxMRFVQTEVYX1NVUFBPUlQgKi8KKworICAvKiBDaGVjayB0aGUgSTJTIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmKGhpMnMgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJTX0FMTF9JTlNUQU5DRShoaTJzLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfSTJTX01PREUoaGkycy0+SW5pdC5Nb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19JMlNfU1RBTkRBUkQoaGkycy0+SW5pdC5TdGFuZGFyZCkpOworICBhc3NlcnRfcGFyYW0oSVNfSTJTX0RBVEFfRk9STUFUKGhpMnMtPkluaXQuRGF0YUZvcm1hdCkpOworICBhc3NlcnRfcGFyYW0oSVNfSTJTX01DTEtfT1VUUFVUKGhpMnMtPkluaXQuTUNMS091dHB1dCkpOworICBhc3NlcnRfcGFyYW0oSVNfSTJTX0FVRElPX0ZSRVEoaGkycy0+SW5pdC5BdWRpb0ZyZXEpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0kyU19DUE9MKGhpMnMtPkluaXQuQ1BPTCkpOyAgCisgIGFzc2VydF9wYXJhbShJU19JMlNfQ0xPQ0tTT1VSQ0UoaGkycy0+SW5pdC5DbG9ja1NvdXJjZSkpOworICBhc3NlcnRfcGFyYW0oSVNfSTJTX0ZVTExEVVBMRVhfTU9ERShoaTJzLT5Jbml0LkZ1bGxEdXBsZXhNb2RlKSk7CisKKyAgaGkycy0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX0JVU1k7CisKKyAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIENPUlRFWC4uLmV0YyAqLworICBIQUxfSTJTX01zcEluaXQoaGkycyk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTUEl4IEkyU0NGR1IgJiBJMlNQUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ2xlYXIgSTJTTU9ELCBJMlNFLCBJMlNDRkcsIFBDTVNZTkMsIEkyU1NURCwgQ0tQT0wsIERBVExFTiBhbmQgQ0hMRU4gYml0cyAqLworICBoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiAmPSB+KFNQSV9JMlNDRkdSX0NITEVOIHwgU1BJX0kyU0NGR1JfREFUTEVOIHwgU1BJX0kyU0NGR1JfQ0tQT0wgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0kyU0NGR1JfSTJTU1REIHwgU1BJX0kyU0NGR1JfUENNU1lOQyB8IFNQSV9JMlNDRkdSX0kyU0NGRyB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUElfSTJTQ0ZHUl9JMlNFIHwgU1BJX0kyU0NGR1JfSTJTTU9EKTsgCisgIGhpMnMtPkluc3RhbmNlLT5JMlNQUiA9IDB4MDAwMlU7CisKKyAgLyogR2V0IHRoZSBJMlNDRkdSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcHJlZyA9IGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSOworCisgIC8qIElmIHRoZSBkZWZhdWx0IHZhbHVlIGhhcyB0byBiZSB3cml0dGVuLCByZWluaXRpYWxpemUgaTJzZGl2IGFuZCBpMnNvZGQqLworICBpZihoaTJzLT5Jbml0LkF1ZGlvRnJlcSA9PSBJMlNfQVVESU9GUkVRX0RFRkFVTFQpCisgIHsKKyAgICBpMnNvZGQgPSAodWludDE2X3QpMFU7CisgICAgaTJzZGl2ID0gKHVpbnQxNl90KTJVOyAgIAorICB9CisgIC8qIElmIHRoZSByZXF1ZXN0ZWQgYXVkaW8gZnJlcXVlbmN5IGlzIG5vdCB0aGUgZGVmYXVsdCwgY29tcHV0ZSB0aGUgcHJlc2NhbGVyICovCisgIGVsc2UKKyAgeworICAgIC8qIENoZWNrIHRoZSBmcmFtZSBsZW5ndGggKEZvciB0aGUgUHJlc2NhbGVyIGNvbXB1dGluZykgKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZihoaTJzLT5Jbml0LkRhdGFGb3JtYXQgPT0gSTJTX0RBVEFGT1JNQVRfMTZCKQorICAgIHsKKyAgICAgIC8qIFBhY2tldCBsZW5ndGggaXMgMTYgYml0cyAqLworICAgICAgcGFja2V0bGVuZ3RoID0gMVU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBQYWNrZXQgbGVuZ3RoIGlzIDMyIGJpdHMgKi8KKyAgICAgIHBhY2tldGxlbmd0aCA9IDJVOworICAgIH0KKyAgICAKKyAgICAvKiBHZXQgSTJTIHNvdXJjZSBDbG9jayBmcmVxdWVuY3kgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZCAoU1BJX0kyU19GVUxMRFVQTEVYX1NVUFBPUlQpCisgICAgcmNjcGVyaXBoY2xraW5pdC5QZXJpcGhDbG9ja1NlbGVjdGlvbiA9IFJDQ19QRVJJUEhDTEtfSTJTOworCisgICAgLyogSWYgYW4gZXh0ZXJuYWwgSTJTIGNsb2NrIGhhcyB0byBiZSB1c2VkLCB0aGUgc3BlY2lmaWMgZGVmaW5lIHNob3VsZCBiZSBzZXQgIAorICAgIGluIHRoZSBwcm9qZWN0IGNvbmZpZ3VyYXRpb24gb3IgaW4gdGhlIHN0bTMyZjN4eF9jb25mLmggZmlsZSAqLworICAgIGlmKGhpMnMtPkluaXQuQ2xvY2tTb3VyY2UgPT0gSTJTX0NMT0NLX0VYVEVSTkFMKQorICAgIHsgICAgCisgICAgICAvKiBTZXQgZXh0ZXJuYWwgY2xvY2sgYXMgSTJTIGNsb2NrIHNvdXJjZSAqLworICAgICAgcmNjcGVyaXBoY2xraW5pdC5JMnNDbG9ja1NlbGVjdGlvbiA9IFJDQ19JMlNDTEtTT1VSQ0VfRVhUOworICAgICAgSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZygmcmNjcGVyaXBoY2xraW5pdCk7CisKKyAgICAgIC8qIFNldCB0aGUgSTJTIGNsb2NrIHRvIHRoZSBleHRlcm5hbCBjbG9jayAgdmFsdWUgKi8KKyAgICAgIGkyc2NsayA9IEVYVEVSTkFMX0NMT0NLX1ZBTFVFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogU2V0IFNZU0NMSyBhcyBJMlMgY2xvY2sgc291cmNlICovCisgICAgICByY2NwZXJpcGhjbGtpbml0Lkkyc0Nsb2NrU2VsZWN0aW9uID0gUkNDX0kyU0NMS1NPVVJDRV9TWVNDTEs7CisgICAgICBIQUxfUkNDRXhfUGVyaXBoQ0xLQ29uZmlnKCZyY2NwZXJpcGhjbGtpbml0KTsKKworICAgICAgLyogR2V0IHRoZSBJMlMgc291cmNlIGNsb2NrIHZhbHVlICovCisgICAgICBpMnNjbGsgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOworICAgIH0KKyNlbmRpZiAvKiBTUElfSTJTX0ZVTExEVVBMRVhfU1VQUE9SVCAqLworCisjaWYgZGVmaW5lZCAoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQgKFNUTTMyRjM3OHh4KQorICAgIGlmKGhpMnMtPkluc3RhbmNlID09IFNQSTEpCisgICAgeworICAgICAgaTJzY2xrID0gSEFMX1JDQ19HZXRQQ0xLMkZyZXEoKTsKKyAgICB9CisgICAgZWxzZSBpZigoaGkycy0+SW5zdGFuY2UgPT0gU1BJMikgfHwgKGhpMnMtPkluc3RhbmNlID09IFNQSTMpKQorICAgIHsKKyAgICAgIGkyc2NsayA9IEhBTF9SQ0NfR2V0UENMSzFGcmVxKCk7CisgICAgfQorI2VuZGlmIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICovCisgICAgCisgICAgLyogQ29tcHV0ZSB0aGUgUmVhbCBkaXZpZGVyIGRlcGVuZGluZyBvbiB0aGUgTUNMSyBvdXRwdXQgc3RhdGUsIHdpdGggYSBmbG9hdGluZyBwb2ludCAqLworICAgIGlmKGhpMnMtPkluaXQuTUNMS091dHB1dCA9PSBJMlNfTUNMS09VVFBVVF9FTkFCTEUpCisgICAgeworICAgICAgLyogTUNMSyBvdXRwdXQgaXMgZW5hYmxlZCAqLworICAgICAgdG1wID0gKHVpbnQxNl90KSgoKCgoaTJzY2xrIC8gMjU2VSkgKiAxMFUpIC8gaGkycy0+SW5pdC5BdWRpb0ZyZXEpKSArIDVVKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIE1DTEsgb3V0cHV0IGlzIGRpc2FibGVkICovCisgICAgICB0bXAgPSAodWludDE2X3QpKCgoKChpMnNjbGsgLyAoMzJVICogcGFja2V0bGVuZ3RoKSkgKjEwVSApIC8gaGkycy0+SW5pdC5BdWRpb0ZyZXEpKSArIDVVKTsKKyAgICB9CisgICAgCisgICAgLyogUmVtb3ZlIHRoZSBmbGF0dGluZyBwb2ludCAqLworICAgIHRtcCA9IHRtcCAvIDEwVTsgIAorICAgIAorICAgIC8qIENoZWNrIHRoZSBwYXJpdHkgb2YgdGhlIGRpdmlkZXIgKi8KKyAgICBpMnNvZGQgPSAodWludDE2X3QpKHRtcCAmICh1aW50MTZfdCkweDAwMDFVKTsKKyAgICAKKyAgICAvKiBDb21wdXRlIHRoZSBpMnNkaXYgcHJlc2NhbGVyICovCisgICAgaTJzZGl2ID0gKHVpbnQxNl90KSgodG1wIC0gaTJzb2RkKSAvIDJVKTsKKyAgICAKKyAgICAvKiBHZXQgdGhlIE1hc2sgZm9yIHRoZSBPZGQgYml0IChTUElfSTJTUFJbOF0pIHJlZ2lzdGVyICovCisgICAgaTJzb2RkID0gKHVpbnQxNl90KSAoaTJzb2RkIDw8IDhVKTsKKyAgfQorICAKKyAgLyogVGVzdCBpZiB0aGUgZGl2aWRlciBpcyAxIG9yIDAgb3IgZ3JlYXRlciB0aGFuIDB4RkZVICovCisgIGlmKChpMnNkaXYgPCAyVSkgfHwgKGkyc2RpdiA+IDB4RkZVKSkKKyAgeworICAgIC8qIFNldCB0aGUgZGVmYXVsdCB2YWx1ZXMgKi8KKyAgICBpMnNkaXYgPSAyVTsKKyAgICBpMnNvZGQgPSAwVTsKKyAgfQorICAKKyAgLyogV3JpdGUgdG8gU1BJeCBJMlNQUiByZWdpc3RlciB0aGUgY29tcHV0ZWQgdmFsdWUgKi8KKyAgaGkycy0+SW5zdGFuY2UtPkkyU1BSID0gKHVpbnQxNl90KSgodWludDE2X3QpaTJzZGl2IHwgKHVpbnQxNl90KShpMnNvZGQgfCAodWludDE2X3QpaGkycy0+SW5pdC5NQ0xLT3V0cHV0KSk7CisgIAorICAvKiBDb25maWd1cmUgdGhlIEkyUyB3aXRoIHRoZSBJMlNfSW5pdFN0cnVjdCB2YWx1ZXMgKi8KKyAgdG1wcmVnIHw9ICh1aW50MTZfdCkoKHVpbnQxNl90KVNQSV9JMlNDRkdSX0kyU01PRCB8ICh1aW50MTZfdCkoaGkycy0+SW5pdC5Nb2RlIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpKGhpMnMtPkluaXQuU3RhbmRhcmQgfCAodWludDE2X3QpKGhpMnMtPkluaXQuRGF0YUZvcm1hdCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KWhpMnMtPkluaXQuQ1BPTCkpKSk7CisgIAorICAvKiBXcml0ZSB0byBTUEl4IEkyU0NGR1IgKi8gIAorICBoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiA9IHRtcHJlZzsKKyAgCisjaWYgZGVmaW5lZCAoU1BJX0kyU19GVUxMRFVQTEVYX1NVUFBPUlQpCisgIGlmIChoaTJzLT5Jbml0LkZ1bGxEdXBsZXhNb2RlID09IEkyU19GVUxMRFVQTEVYTU9ERV9FTkFCTEUpCisgIHsKKyAgICAvKiBDbGVhciBJMlNNT0QsIEkyU0UsIEkyU0NGRywgUENNU1lOQywgSTJTU1RELCBDS1BPTCwgREFUTEVOIGFuZCBDSExFTiBiaXRzICovCisgICAgSTJTeEVYVChoaTJzLT5JbnN0YW5jZSktPkkyU0NGR1IgJj0gfihTUElfSTJTQ0ZHUl9DSExFTiB8IFNQSV9JMlNDRkdSX0RBVExFTiB8IFNQSV9JMlNDRkdSX0NLUE9MIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0kyU0NGR1JfSTJTU1REIHwgU1BJX0kyU0NGR1JfUENNU1lOQyB8IFNQSV9JMlNDRkdSX0kyU0NGRyB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSV9JMlNDRkdSX0kyU0UgfCBTUElfSTJTQ0ZHUl9JMlNNT0QpOworICAgIEkyU3hFWFQoaGkycy0+SW5zdGFuY2UpLT5JMlNQUiA9IDB4MDAwMlU7CisKKyAgICAvKiBHZXQgdGhlIEkyU0NGR1IgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgICB0bXByZWcgPSBJMlN4RVhUKGhpMnMtPkluc3RhbmNlKS0+STJTQ0ZHUjsKKyAgICAKKyAgICAvKiBHZXQgdGhlIG1vZGUgdG8gYmUgY29uZmlndXJlZCBmb3IgdGhlIGV4dGVuZGVkIEkyUyAqLworICAgIGlmKChoaTJzLT5Jbml0Lk1vZGUgPT0gSTJTX01PREVfTUFTVEVSX1RYKSB8fCAoaGkycy0+SW5pdC5Nb2RlID09IEkyU19NT0RFX1NMQVZFX1RYKSkKKyAgICB7CisgICAgICB0bXAgPSBJMlNfTU9ERV9TTEFWRV9SWDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmKChoaTJzLT5Jbml0Lk1vZGUgPT0gSTJTX01PREVfTUFTVEVSX1JYKSB8fCAoaGkycy0+SW5pdC5Nb2RlID09IEkyU19NT0RFX1NMQVZFX1JYKSkKKyAgICAgIHsKKyAgICAgICAgdG1wID0gSTJTX01PREVfU0xBVkVfVFg7CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIENvbmZpZ3VyZSB0aGUgSTJTIFNsYXZlIHdpdGggdGhlIEkyUyBNYXN0ZXIgcGFyYW1ldGVyIHZhbHVlcyAqLworICAgIHRtcHJlZyB8PSAodWludDE2X3QpKCh1aW50MTZfdClTUElfSTJTQ0ZHUl9JMlNNT0QgfCAodWludDE2X3QpKHRtcCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpKGhpMnMtPkluaXQuU3RhbmRhcmQgfCAodWludDE2X3QpKGhpMnMtPkluaXQuRGF0YUZvcm1hdCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpaGkycy0+SW5pdC5DUE9MKSkpKTsKKyAgICAKKyAgICAvKiBXcml0ZSB0byBTUEl4IEkyU0NGR1IgKi8gIAorICAgIEkyU3hFWFQoaGkycy0+SW5zdGFuY2UpLT5JMlNDRkdSID0gdG1wcmVnOworICB9CisjZW5kaWYgLyogU1BJX0kyU19GVUxMRFVQTEVYX1NVUFBPUlQgKi8KKworICBoaTJzLT5FcnJvckNvZGUgPSBIQUxfSTJTX0VSUk9SX05PTkU7CisgIGhpMnMtPlN0YXRlPSBIQUxfSTJTX1NUQVRFX1JFQURZOworICAKKyAgcmV0dXJuIEhBTF9PSzsKK30KKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkIChTUElfSTJTX0ZVTExEVVBMRVhfU1VQUE9SVCkKKy8qKiBAYWRkdG9ncm91cCAgSTJTX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIEkyUy9JMlNleHQgaW50ZXJydXB0IHJlcXVlc3RzIGluIGZ1bGwtZHVwbGV4IG1vZGUuCisgICogQHBhcmFtICBoaTJzOiBJMlMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCit2b2lkIEhBTF9JMlNfRnVsbER1cGxleF9JUlFIYW5kbGVyKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKQoreworICBfX0lPIHVpbnQzMl90IGkyc3NyID0gaGkycy0+SW5zdGFuY2UtPlNSIDsKKyAgX19JTyB1aW50MzJfdCBpMnNleHRzciA9IEkyU3hFWFQoaGkycy0+SW5zdGFuY2UpLT5TUjsKKworICAvKiBDaGVjayBpZiB0aGUgSTJTX01PREVfTUFTVEVSX1RYIG9yIEkyU19NT0RFX1NMQVZFX1RYIE1vZGUgaXMgc2VsZWN0ZWQgKi8KKyAgaWYoKChoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiAmIFNQSV9JMlNDRkdSX0kyU0NGRykgPT0gSTJTX01PREVfTUFTVEVSX1RYKSB8fCAoKGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSICYgU1BJX0kyU0NGR1JfSTJTQ0ZHKSA9PSBJMlNfTU9ERV9TTEFWRV9UWCkpCisgIHsKKyAgICAvKiBJMlMgaW4gbW9kZSBUcmFuc21pdHRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZigoKGkyc3NyICYgSTJTX0ZMQUdfVFhFKSA9PSBJMlNfRkxBR19UWEUpICYmIChfX0hBTF9JMlNfR0VUX0lUX1NPVVJDRShoaTJzLCBJMlNfSVRfVFhFKSAhPSBSRVNFVCkpCisgICAgeworICAgICAgLyogV2hlbiB0aGUgSTJTIG1vZGUgaXMgY29uZmlndXJlZCBhcyBJMlNfTU9ERV9NQVNURVJfVFggb3IgSTJTX01PREVfU0xBVkVfVFgsCisgICAgICB0aGUgSTJTIFRYRSBpbnRlcnJ1cHQgd2lsbCBiZSBnZW5lcmF0ZWQgdG8gbWFuYWdlIHRoZSBmdWxsLWR1cGxleCB0cmFuc21pdCBwaGFzZS4gKi8KKyAgICAgIEkyU19GdWxsRHVwbGV4VHhfSVQoaGkycywgSTJTX1VTRV9JMlMpOworICAgIH0KKworICAgIC8qIEkyU2V4dCBpbiBtb2RlIFJlY2VpdmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZigoKGkyc2V4dHNyICYgSTJTX0ZMQUdfUlhORSkgPT0gSTJTX0ZMQUdfUlhORSkgJiYgKF9fSEFMX0kyU0VYVF9HRVRfSVRfU09VUkNFKGhpMnMsIEkyU19JVF9SWE5FKSAhPSBSRVNFVCkpCisgICAgeworICAgICAgLyogV2hlbiB0aGUgSTJTIG1vZGUgaXMgY29uZmlndXJlZCBhcyBJMlNfTU9ERV9NQVNURVJfVFggb3IgSTJTX01PREVfU0xBVkVfVFgsCisgICAgICB0aGUgSTJTZXh0IFJYTkUgaW50ZXJydXB0IHdpbGwgYmUgZ2VuZXJhdGVkIHRvIG1hbmFnZSB0aGUgZnVsbC1kdXBsZXggcmVjZWl2ZSBwaGFzZS4gKi8KKyAgICAgIEkyU19GdWxsRHVwbGV4UnhfSVQoaGkycywgSTJTX1VTRV9JMlNFWFQpOworICAgIH0KKworICAgIC8qIEkyU2V4dCBPdmVycnVuIGVycm9yIGludGVycnVwdCBvY2N1cmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZigoKGkyc2V4dHNyICYgSTJTX0ZMQUdfT1ZSKSA9PSBJMlNfRkxBR19PVlIpICYmIChfX0hBTF9JMlNFWFRfR0VUX0lUX1NPVVJDRShoaTJzLCBJMlNfSVRfRVJSKSAhPSBSRVNFVCkpCisgICAgeworICAgICAgLyogRGlzYWJsZSBSWE5FIGFuZCBFUlIgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9JMlNFWFRfRElTQUJMRV9JVChoaTJzLCAoSTJTX0lUX1JYTkUgfCBJMlNfSVRfRVJSKSk7CisKKyAgICAgIC8qIERpc2FibGUgVFhFIGFuZCBFUlIgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9JMlNfRElTQUJMRV9JVChoaTJzLCAoSTJTX0lUX1RYRSB8IEkyU19JVF9FUlIpKTsKKworICAgICAgLyogU2V0IHRoZSBJMlMgU3RhdGUgcmVhZHkgKi8KKyAgICAgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9SRUFEWTsKKworICAgICAgLyogU2V0IHRoZSBlcnJvciBjb2RlIGFuZCBleGVjdXRlIGVycm9yIGNhbGxiYWNrKi8KKyAgICAgIGhpMnMtPkVycm9yQ29kZSB8PSBIQUxfSTJTX0VSUk9SX09WUjsKKyAgICAgIEhBTF9JMlNfRXJyb3JDYWxsYmFjayhoaTJzKTsKKyAgICB9CisKKyAgICAvKiBJMlMgVW5kZXJydW4gZXJyb3IgaW50ZXJydXB0IG9jY3VyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYoKChpMnNzciAmIEkyU19GTEFHX1VEUikgPT0gSTJTX0ZMQUdfVURSKSAmJiAoX19IQUxfSTJTX0dFVF9JVF9TT1VSQ0UoaGkycywgSTJTX0lUX0VSUikgIT0gUkVTRVQpKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgVFhFIGFuZCBFUlIgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9JMlNfRElTQUJMRV9JVChoaTJzLCAoSTJTX0lUX1RYRSB8IEkyU19JVF9FUlIpKTsKKworICAgICAgLyogRGlzYWJsZSBSWE5FIGFuZCBFUlIgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9JMlNFWFRfRElTQUJMRV9JVChoaTJzLCAoSTJTX0lUX1JYTkUgfCBJMlNfSVRfRVJSKSk7CisKKyAgICAgIC8qIFNldCB0aGUgSTJTIFN0YXRlIHJlYWR5ICovCisgICAgICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIFNldCB0aGUgZXJyb3IgY29kZSBhbmQgZXhlY3V0ZSBlcnJvciBjYWxsYmFjayovCisgICAgICBoaTJzLT5FcnJvckNvZGUgfD0gSEFMX0kyU19FUlJPUl9VRFI7CisgICAgICBIQUxfSTJTX0Vycm9yQ2FsbGJhY2soaGkycyk7CisgICAgfQorICB9CisgIC8qIFRoZSBJMlNfTU9ERV9NQVNURVJfUlggb3IgSTJTX01PREVfU0xBVkVfUlggTW9kZSBpcyBzZWxlY3RlZCAqLworICBlbHNlCisgIHsKKyAgICAvKiBJMlNleHQgaW4gbW9kZSBUcmFuc21pdHRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZigoKGkyc2V4dHNyICYgSTJTX0ZMQUdfVFhFKSA9PSBJMlNfRkxBR19UWEUpICYmIChfX0hBTF9JMlNFWFRfR0VUX0lUX1NPVVJDRShoaTJzLCBJMlNfSVRfVFhFKSAhPSBSRVNFVCkpCisgICAgeworICAgICAgLyogV2hlbiB0aGUgSTJTIG1vZGUgaXMgY29uZmlndXJlZCBhcyBJMlNfTU9ERV9NQVNURVJfUlggb3IgSTJTX01PREVfU0xBVkVfUlgsCisgICAgICB0aGUgSTJTZXh0IFRYRSBpbnRlcnJ1cHQgd2lsbCBiZSBnZW5lcmF0ZWQgdG8gbWFuYWdlIHRoZSBmdWxsLWR1cGxleCB0cmFuc21pdCBwaGFzZS4gKi8KKyAgICAgIEkyU19GdWxsRHVwbGV4VHhfSVQoaGkycywgSTJTX1VTRV9JMlNFWFQpOworICAgIH0KKworICAgIC8qIEkyUyBpbiBtb2RlIFJlY2VpdmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZigoKGkyc3NyICYgSTJTX0ZMQUdfUlhORSkgPT0gSTJTX0ZMQUdfUlhORSkgJiYgKF9fSEFMX0kyU19HRVRfSVRfU09VUkNFKGhpMnMsIEkyU19JVF9SWE5FKSAhPSBSRVNFVCkpCisgICAgeworICAgICAgLyogV2hlbiB0aGUgSTJTIG1vZGUgaXMgY29uZmlndXJlZCBhcyBJMlNfTU9ERV9NQVNURVJfUlggb3IgSTJTX01PREVfU0xBVkVfUlgsCisgICAgICB0aGUgSTJTIFJYTkUgaW50ZXJydXB0IHdpbGwgYmUgZ2VuZXJhdGVkIHRvIG1hbmFnZSB0aGUgZnVsbC1kdXBsZXggcmVjZWl2ZSBwaGFzZS4gKi8KKyAgICAgIEkyU19GdWxsRHVwbGV4UnhfSVQoaGkycywgSTJTX1VTRV9JMlMpOworICAgIH0KKworICAgIC8qIEkyUyBPdmVycnVuIGVycm9yIGludGVycnVwdCBvY2N1cmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmKCgoaTJzc3IgJiBJMlNfRkxBR19PVlIpID09IEkyU19GTEFHX09WUikgJiYgKF9fSEFMX0kyU19HRVRfSVRfU09VUkNFKGhpMnMsIEkyU19JVF9FUlIpICE9IFJFU0VUKSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIFJYTkUgYW5kIEVSUiBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX0kyU19ESVNBQkxFX0lUKGhpMnMsIChJMlNfSVRfUlhORSB8IEkyU19JVF9FUlIpKTsKKworICAgICAgLyogRGlzYWJsZSBUWEUgYW5kIEVSUiBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX0kyU0VYVF9ESVNBQkxFX0lUKGhpMnMsIChJMlNfSVRfVFhFIHwgSTJTX0lUX0VSUikpOworCisgICAgICAvKiBTZXQgdGhlIEkyUyBTdGF0ZSByZWFkeSAqLworICAgICAgaGkycy0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX1JFQURZOworCisgICAgICAvKiBTZXQgdGhlIGVycm9yIGNvZGUgYW5kIGV4ZWN1dGUgZXJyb3IgY2FsbGJhY2sqLworICAgICAgaGkycy0+RXJyb3JDb2RlIHw9IEhBTF9JMlNfRVJST1JfT1ZSOworICAgICAgSEFMX0kyU19FcnJvckNhbGxiYWNrKGhpMnMpOworICAgIH0KKworICAgIC8qIEkyU2V4dCBVbmRlcnJ1biBlcnJvciBpbnRlcnJ1cHQgb2NjdXJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZigoKGkyc2V4dHNyICYgSTJTX0ZMQUdfVURSKSA9PSBJMlNfRkxBR19VRFIpICYmIChfX0hBTF9JMlNFWFRfR0VUX0lUX1NPVVJDRShoaTJzLCBJMlNfSVRfRVJSKSAhPSBSRVNFVCkpCisgICAgeworICAgICAgLyogRGlzYWJsZSBUWEUgYW5kIEVSUiBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX0kyU0VYVF9ESVNBQkxFX0lUKGhpMnMsIChJMlNfSVRfVFhFIHwgSTJTX0lUX0VSUikpOworCisgICAgICAvKiBEaXNhYmxlIFJYTkUgYW5kIEVSUiBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX0kyU19ESVNBQkxFX0lUKGhpMnMsIChJMlNfSVRfUlhORSB8IEkyU19JVF9FUlIpKTsKKworICAgICAgLyogU2V0IHRoZSBJMlMgU3RhdGUgcmVhZHkgKi8KKyAgICAgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9SRUFEWTsKKworICAgICAgLyogU2V0IHRoZSBlcnJvciBjb2RlIGFuZCBleGVjdXRlIGVycm9yIGNhbGxiYWNrKi8KKyAgICAgIGhpMnMtPkVycm9yQ29kZSB8PSBIQUxfSTJTX0VSUk9SX1VEUjsKKyAgICAgIEhBTF9JMlNfRXJyb3JDYWxsYmFjayhoaTJzKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFR4IGFuZCBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2tzCisgICogQHBhcmFtIGhpMnM6IEkyUyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JMlNfVHhSeENwbHRDYWxsYmFjayhJMlNfSGFuZGxlVHlwZURlZiAqaGkycykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGkycyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9JMlNfVHhSeENwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgVHggYW5kIFJ4IFRyYW5zZmVyIGhhbGYgY29tcGxldGVkIGNhbGxiYWNrcworICAqIEBwYXJhbSBoaTJzOiBJMlMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSTJTX1R4UnhIYWxmQ3BsdENhbGxiYWNrKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaTJzKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0kyU19UeFJ4SGFsZkNwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogU1BJX0kyU19GVUxMRFVQTEVYX1NVUFBPUlQgKi8KKworLyoqIEBhZGR0b2dyb3VwIEkyU19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAgKgorICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwZXJtaXQgdG8gZ2V0IGluIHJ1bi10aW1lIHRoZSBzdGF0dXMgb2YgdGhlIHBlcmlwaGVyYWwKKyAgICBhbmQgdGhlIGRhdGEgZmxvdy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiBQYXVzZXMgdGhlIGF1ZGlvIHN0cmVhbSBwbGF5aW5nIGZyb20gdGhlIE1lZGlhLgorICAqIEBwYXJhbSAgaGkycyA6IEkyUyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMlNfRE1BUGF1c2UoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGkycyk7CisKKyAgaWYoaGkycy0+U3RhdGUgPT0gSEFMX0kyU19TVEFURV9CVVNZX1RYKQorICB7CisgICAgLyogUGF1c2UgdGhlIGF1ZGlvIGZpbGUgcGxheWluZyBieSBkaXNhYmxpbmcgdGhlIEkyUyBETUEgcmVxdWVzdCAqLworICAgIGhpMnMtPkluc3RhbmNlLT5DUjIgJj0gKHVpbnQzMl90KSh+U1BJX0NSMl9UWERNQUVOKTsKKyAgfQorICBlbHNlIGlmKGhpMnMtPlN0YXRlID09IEhBTF9JMlNfU1RBVEVfQlVTWV9SWCkKKyAgeworICAgIC8qIFBhdXNlIHRoZSBhdWRpbyBmaWxlIHBsYXlpbmcgYnkgZGlzYWJsaW5nIHRoZSBJMlMgRE1BIHJlcXVlc3QgKi8KKyAgICBoaTJzLT5JbnN0YW5jZS0+Q1IyICY9ICh1aW50MzJfdCkoflNQSV9DUjJfUlhETUFFTik7CisgIH0KKyNpZiBkZWZpbmVkIChTUElfSTJTX0ZVTExEVVBMRVhfU1VQUE9SVCkKKyAgZWxzZSBpZihoaTJzLT5TdGF0ZSA9PSBIQUxfSTJTX1NUQVRFX0JVU1lfVFhfUlgpCisgIHsKKyAgICAvKiBQYXVzZSB0aGUgYXVkaW8gZmlsZSBwbGF5aW5nIGJ5IGRpc2FibGluZyB0aGUgSTJTIERNQSByZXF1ZXN0ICovCisgICAgaGkycy0+SW5zdGFuY2UtPkNSMiAmPSAodWludDMyX3QpKH4oU1BJX0NSMl9SWERNQUVOIHwgU1BJX0NSMl9UWERNQUVOKSk7CisgICAgSTJTeEVYVChoaTJzLT5JbnN0YW5jZSktPkNSMiAmPSAodWludDMyX3QpKH4oU1BJX0NSMl9SWERNQUVOIHwgU1BJX0NSMl9UWERNQUVOKSk7CisgIH0KKyNlbmRpZiAvKiBTUElfSTJTX0ZVTExEVVBMRVhfU1VQUE9SVCAqLworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhpMnMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiBSZXN1bWVzIHRoZSBhdWRpbyBzdHJlYW0gcGxheWluZyBmcm9tIHRoZSBNZWRpYS4KKyAgKiBAcGFyYW0gIGhpMnMgOiBJMlMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX0RNQVJlc3VtZShJMlNfSGFuZGxlVHlwZURlZiAqaGkycykKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaTJzKTsKKworICBpZihoaTJzLT5TdGF0ZSA9PSBIQUxfSTJTX1NUQVRFX0JVU1lfVFgpCisgIHsKKyAgICAvKiBFbmFibGUgdGhlIEkyUyBETUEgcmVxdWVzdCAqLworICAgIGhpMnMtPkluc3RhbmNlLT5DUjIgfD0gU1BJX0NSMl9UWERNQUVOOworICB9CisgIGVsc2UgaWYoaGkycy0+U3RhdGUgPT0gSEFMX0kyU19TVEFURV9CVVNZX1JYKQorICB7CisgICAgLyogRW5hYmxlIHRoZSBJMlMgRE1BIHJlcXVlc3QgKi8KKyAgICBoaTJzLT5JbnN0YW5jZS0+Q1IyIHw9IFNQSV9DUjJfUlhETUFFTjsKKyAgfQorI2lmIGRlZmluZWQgKFNQSV9JMlNfRlVMTERVUExFWF9TVVBQT1JUKQorICBlbHNlIGlmKGhpMnMtPlN0YXRlID09IEhBTF9JMlNfU1RBVEVfQlVTWV9UWF9SWCkKKyAgeworICAgIC8qIFBhdXNlIHRoZSBhdWRpbyBmaWxlIHBsYXlpbmcgYnkgZGlzYWJsaW5nIHRoZSBJMlMgRE1BIHJlcXVlc3QgKi8KKyAgICBoaTJzLT5JbnN0YW5jZS0+Q1IyIHw9IChTUElfQ1IyX1JYRE1BRU4gfCBTUElfQ1IyX1RYRE1BRU4pOworICAgIEkyU3hFWFQoaGkycy0+SW5zdGFuY2UpLT5DUjIgfD0gKFNQSV9DUjJfUlhETUFFTiB8IFNQSV9DUjJfVFhETUFFTik7CisKKyAgICAvKiBJZiB0aGUgSTJTZXh0IHBlcmlwaGVyYWwgaXMgc3RpbGwgbm90IGVuYWJsZWQsIGVuYWJsZSBpdCAqLworICAgIGlmICgoSTJTeEVYVChoaTJzLT5JbnN0YW5jZSktPkkyU0NGR1IgJiBTUElfSTJTQ0ZHUl9JMlNFKSA9PSAwVSkKKyAgICB7CisgICAgICAvKiBFbmFibGUgSTJTZXh0IHBlcmlwaGVyYWwgKi8KKyAgICAgIF9fSEFMX0kyU0VYVF9FTkFCTEUoaGkycyk7CisgICAgfQorICB9CisjZW5kaWYgLyogU1BJX0kyU19GVUxMRFVQTEVYX1NVUFBPUlQgKi8KKworICAvKiBJZiB0aGUgSTJTIHBlcmlwaGVyYWwgaXMgc3RpbGwgbm90IGVuYWJsZWQsIGVuYWJsZSBpdCAqLworICBpZiAoKGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSICYgU1BJX0kyU0NGR1JfSTJTRSkgPT0gMFUpCisgIHsKKyAgICAvKiBFbmFibGUgSTJTIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9JMlNfRU5BQkxFKGhpMnMpOworICB9CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGkycyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIFJlc3VtZXMgdGhlIGF1ZGlvIHN0cmVhbSBwbGF5aW5nIGZyb20gdGhlIE1lZGlhLgorICAqIEBwYXJhbSBoaTJzOiBJMlMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX0RNQVN0b3AoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGkycyk7CisKKyAgaWYoaGkycy0+U3RhdGUgPT0gSEFMX0kyU19TVEFURV9CVVNZX1RYKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgSTJTIERNQSByZXF1ZXN0cyAqLworICAgIGhpMnMtPkluc3RhbmNlLT5DUjIgJj0gKHVpbnQzMl90KSh+U1BJX0NSMl9UWERNQUVOKTsKKworICAgIC8qIERpc2FibGUgdGhlIEkyUyBETUEgQ2hhbm5lbCAqLworICAgIEhBTF9ETUFfQWJvcnQoaGkycy0+aGRtYXR4KTsKKyAgfQorICBlbHNlIGlmKGhpMnMtPlN0YXRlID09IEhBTF9JMlNfU1RBVEVfQlVTWV9SWCkKKyAgeworICAgIC8qIERpc2FibGUgdGhlIEkyUyBETUEgcmVxdWVzdHMgKi8KKyAgICBoaTJzLT5JbnN0YW5jZS0+Q1IyICY9ICh1aW50MzJfdCkoflNQSV9DUjJfUlhETUFFTik7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBJMlMgRE1BIENoYW5uZWwgKi8KKyAgICBIQUxfRE1BX0Fib3J0KGhpMnMtPmhkbWFyeCk7CisgIH0KKyNpZiBkZWZpbmVkIChTUElfSTJTX0ZVTExEVVBMRVhfU1VQUE9SVCkKKyAgZWxzZSBpZihoaTJzLT5TdGF0ZSA9PSBIQUxfSTJTX1NUQVRFX0JVU1lfVFhfUlgpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBJMlMgRE1BIHJlcXVlc3RzICovCisgICAgaGkycy0+SW5zdGFuY2UtPkNSMiAmPSAodWludDMyX3QpKH4oU1BJX0NSMl9SWERNQUVOIHwgU1BJX0NSMl9UWERNQUVOKSk7CisgICAgSTJTeEVYVChoaTJzLT5JbnN0YW5jZSktPkNSMiAmPSAodWludDMyX3QpKH4oU1BJX0NSMl9SWERNQUVOIHwgU1BJX0NSMl9UWERNQUVOKSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBJMlMgRE1BIENoYW5uZWxzICovCisgICAgSEFMX0RNQV9BYm9ydChoaTJzLT5oZG1hdHgpOworICAgIEhBTF9ETUFfQWJvcnQoaGkycy0+aGRtYXJ4KTsKKworICAgIC8qIERpc2FibGUgSTJTZXh0IHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9JMlNFWFRfRElTQUJMRShoaTJzKTsKKyAgfQorI2VuZGlmIC8qIFNQSV9JMlNfRlVMTERVUExFWF9TVVBQT1JUICovCisKKyAgLyogRGlzYWJsZSBJMlMgcGVyaXBoZXJhbCAqLworICBfX0hBTF9JMlNfRElTQUJMRShoaTJzKTsKKworICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGkycyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8gIAorCisvKioKKyAgKiBAfQorICAqLyAgCisKKyNpZiBkZWZpbmVkIChTUElfSTJTX0ZVTExEVVBMRVhfU1VQUE9SVCkKKy8qKiBAYWRkdG9ncm91cCBJMlNFeAorICAqIEBicmllZiBJMlMgRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEkyU0V4X0V4cG9ydGVkX0Z1bmN0aW9ucyBJMlMgRXh0ZW5kZWQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEkyUyBFeHRlbmRlZCBGZWF0dXJlcyBGdW5jdGlvbnMgCisgICogIEBicmllZiAgIEV4dGVuZGVkIGZlYXR1cmVzIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0gICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEV4dGVuZGVkIGZlYXR1cmVzIEZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgSTJTIGRhdGEgCisgICAgdHJhbnNmZXJzLgorCisgICAgKCMpIFRoZXJlIGlzIHR3byBtb2RlIG9mIHRyYW5zZmVyOgorICAgICAgICgrKykgQmxvY2tpbmcgbW9kZTogVGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIGluIHRoZSBwb2xsaW5nIG1vZGUuIAorICAgICAgICAgICAgVGhlIHN0YXR1cyBvZiBhbGwgZGF0YSBwcm9jZXNzaW5nIGlzIHJldHVybmVkIGJ5IHRoZSBzYW1lIGZ1bmN0aW9uIAorICAgICAgICAgICAgYWZ0ZXIgZmluaXNoaW5nIHRyYW5zZmVyLiAgCisgICAgICAgKCsrKSBOby1CbG9ja2luZyBtb2RlOiBUaGUgY29tbXVuaWNhdGlvbiBpcyBwZXJmb3JtZWQgdXNpbmcgSW50ZXJydXB0cyAKKyAgICAgICAgICAgIG9yIERNQS4gVGhlc2UgZnVuY3Rpb25zIHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSB0cmFuc2ZlciBzdGFydHVwLgorICAgICAgICAgICAgVGhlIGVuZCBvZiB0aGUgZGF0YSBwcm9jZXNzaW5nIHdpbGwgYmUgaW5kaWNhdGVkIHRocm91Z2ggdGhlIAorICAgICAgICAgICAgZGVkaWNhdGVkIEkyUyBJUlEgd2hlbiB1c2luZyBJbnRlcnJ1cHQgbW9kZSBvciB0aGUgRE1BIElSUSB3aGVuIAorICAgICAgICAgICAgdXNpbmcgRE1BIG1vZGUuCisKKyAgICAoIykgQmxvY2tpbmcgbW9kZSBmdW5jdGlvbnMgYXJlIDoKKyAgICAgICAgKCsrKSBIQUxfSTJTX1RyYW5zbWl0UmVjZWl2ZSgpCisgICAgICAgIAorICAgICgjKSBOby1CbG9ja2luZyBtb2RlIGZ1bmN0aW9ucyB3aXRoIEludGVycnVwdCBhcmU6CisgICAgICAgICgrKykgSEFMX0kyU19UcmFuc21pdFJlY2VpdmVfSVQoKQorICAgICAgICAoKyspIEhBTF9JMlNGdWxsRHVwbGV4X0lSUUhhbmRsZXIoKQorCisgICAgKCMpIE5vLUJsb2NraW5nIG1vZGUgZnVuY3Rpb25zIHdpdGggRE1BIGFyZToKKyAgICAgICAgKCsrKSBIQUxfSTJTX1RyYW5zbWl0UmVjZWl2ZV9ETUEoKQorCisgICAgKCMpIEEgc2V0IG9mIFRyYW5zZmVyIENvbXBsZXRlIENhbGxiYWNrcyBhcmUgcHJvdmlkZWQgaW4gTm9fQmxvY2tpbmcgbW9kZToKKyAgICAgICAgKCsrKSBIQUxfSTJTX1R4UnhDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9JMlNfVHhSeEhhbGZDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9JMlNfVHhSeEVycm9yQ2FsbGJhY2soKQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworICAgICAKKy8qKgorICAqIEBicmllZiBGdWxsLUR1cGxleCBUcmFuc21pdC9SZWNlaXZlIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gaGkyczogSTJTIGhhbmRsZQorICAqIEBwYXJhbSBwVHhEYXRhIGEgMTYtYml0IHBvaW50ZXIgdG8gdGhlIFRyYW5zbWl0IGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSBwUnhEYXRhIGEgMTYtYml0IHBvaW50ZXIgdG8gdGhlIFJlY2VpdmUgZGF0YSBidWZmZXIuCisgICogQHBhcmFtIFNpemUgbnVtYmVyIG9mIGRhdGEgc2FtcGxlIHRvIGJlIHNlbnQ6CisgICogQG5vdGUgV2hlbiBhIDE2LWJpdCBkYXRhIGZyYW1lIG9yIGEgMTYtYml0IGRhdGEgZnJhbWUgZXh0ZW5kZWQgaXMgc2VsZWN0ZWQgZHVyaW5nIHRoZSBJMlMKKyAgKiAgICAgICBjb25maWd1cmF0aW9uIHBoYXNlLCB0aGUgU2l6ZSBwYXJhbWV0ZXIgbWVhbnMgdGhlIG51bWJlciBvZiAxNi1iaXQgZGF0YSBsZW5ndGggCisgICogICAgICAgaW4gdGhlIHRyYW5zYWN0aW9uIGFuZCB3aGVuIGEgMjQtYml0IGRhdGEgZnJhbWUgb3IgYSAzMi1iaXQgZGF0YSBmcmFtZSBpcyBzZWxlY3RlZCAKKyAgKiAgICAgICB0aGUgU2l6ZSBwYXJhbWV0ZXIgbWVhbnMgdGhlIG51bWJlciBvZiAxNi1iaXQgZGF0YSBsZW5ndGguIAorICAqIEBwYXJhbSBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAbm90ZSBUaGUgSTJTIGlzIGtlcHQgZW5hYmxlZCBhdCB0aGUgZW5kIG9mIHRyYW5zYWN0aW9uIHRvIGF2b2lkIHRoZSBjbG9jayBkZS1zeW5jaHJvbml6YXRpb24gCisgICogICAgICAgYmV0d2VlbiBNYXN0ZXIgYW5kIFNsYXZlKGV4YW1wbGU6IGF1ZGlvIHN0cmVhbWluZykuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTRXhfVHJhbnNtaXRSZWNlaXZlKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzLCB1aW50MTZfdCAqcFR4RGF0YSwgdWludDE2X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIGlmKChwVHhEYXRhID09IE5VTEwgKSB8fCAocFJ4RGF0YSA9PSBOVUxMICkgfHwgKFNpemUgPT0gMFUpKSAKKyAgeworICAgIHJldHVybiAgSEFMX0VSUk9SOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB9CisgIAorICAvKiBDaGVjayB0aGUgSTJTIFN0YXRlICovCisgIGlmKGhpMnMtPlN0YXRlID09IEhBTF9JMlNfU1RBVEVfUkVBRFkpCisgIHsgIAorICAgIC8qIENoZWNrIHRoZSBEYXRhIGZvcm1hdDogV2hlbiBhIDE2LWJpdCBkYXRhIGZyYW1lIG9yIGEgMTYtYml0IGRhdGEgZnJhbWUgZXh0ZW5kZWQgCisgICAgICAgaXMgc2VsZWN0ZWQgZHVyaW5nIHRoZSBJMlMgY29uZmlndXJhdGlvbiBwaGFzZSwgdGhlIFNpemUgcGFyYW1ldGVyIG1lYW5zIHRoZSBudW1iZXIKKyAgICAgICBvZiAxNi1iaXQgZGF0YSBsZW5ndGggaW4gdGhlIHRyYW5zYWN0aW9uIGFuZCB3aGVuIGEgMjQtYml0IGRhdGEgZnJhbWUgb3IgYSAzMi1iaXQgZGF0YSAKKyAgICAgICBmcmFtZSBpcyBzZWxlY3RlZCB0aGUgU2l6ZSBwYXJhbWV0ZXIgbWVhbnMgdGhlIG51bWJlciBvZiAxNi1iaXQgZGF0YSBsZW5ndGguICovCisgICAgaWYoKChoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiAmIChTUElfSTJTQ0ZHUl9EQVRMRU4gfCBTUElfSTJTQ0ZHUl9DSExFTikpID09IEkyU19EQVRBRk9STUFUXzI0Qil8fFwKKyAgICAgICgoaGkycy0+SW5zdGFuY2UtPkkyU0NGR1IgJiAoU1BJX0kyU0NGR1JfREFUTEVOIHwgU1BJX0kyU0NGR1JfQ0hMRU4pKSA9PSBJMlNfREFUQUZPUk1BVF8zMkIpKQorICAgIHsKKyAgICAgIGhpMnMtPlR4WGZlclNpemUgPSAoU2l6ZSA8PCAxVSk7CisgICAgICBoaTJzLT5UeFhmZXJDb3VudCA9IChTaXplIDw8IDFVKTsKKyAgICAgIGhpMnMtPlJ4WGZlclNpemUgPSAoU2l6ZSA8PCAxVSk7CisgICAgICBoaTJzLT5SeFhmZXJDb3VudCA9IChTaXplIDw8IDFVKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhpMnMtPlR4WGZlclNpemUgPSBTaXplOworICAgICAgaGkycy0+VHhYZmVyQ291bnQgPSBTaXplOworICAgICAgaGkycy0+UnhYZmVyU2l6ZSA9IFNpemU7CisgICAgICBoaTJzLT5SeFhmZXJDb3VudCA9IFNpemU7CisgICAgfQorICAgIAorICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJzKTsKKyAgICAKKyAgICBoaTJzLT5FcnJvckNvZGUgPSBIQUxfSTJTX0VSUk9SX05PTkU7CisKKyAgICAvKiBTZXQgdGhlIEkyUyBTdGF0ZSBidXN5IFRYL1JYICovCisgICAgaGkycy0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX0JVU1lfVFhfUlg7CisgICAgCisgICAgLyogQ2hlY2sgaWYgdGhlIEkyU19NT0RFX01BU1RFUl9UWCBvciBJMlNfTU9ERV9TTEFWRV9UWCBNb2RlIGlzIHNlbGVjdGVkICovCisgICAgaWYoKChoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiAmIFNQSV9JMlNDRkdSX0kyU0NGRykgPT0gSTJTX01PREVfTUFTVEVSX1RYKSB8fCAoKGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSICYgU1BJX0kyU0NGR1JfSTJTQ0ZHKSA9PSBJMlNfTU9ERV9TTEFWRV9UWCkpCisgICAgeyAKKyAgICAgIC8qIFByZXBhcmUgdGhlIEZpcnN0IERhdGEgYmVmb3JlIGVuYWJsaW5nIHRoZSBJMlMgKi8KKyAgICAgIGlmKChoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiAmIFNQSV9JMlNDRkdSX0kyU0NGRykgPT0gSTJTX01PREVfU0xBVkVfVFgpCisgICAgICB7CisgICAgICAgIGhpMnMtPkluc3RhbmNlLT5EUiA9ICgqcFR4RGF0YSsrKTsKKyAgICAgICAgaGkycy0+VHhYZmVyQ291bnQtLTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyogQ2hlY2sgaWYgdGhlIEkyUyBpcyBhbHJlYWR5IGVuYWJsZWQ6IFRoZSBJMlMgaXMga2VwdCBlbmFibGVkIGF0IHRoZSBlbmQgb2YgdHJhbnNhY3Rpb24KKyAgICAgIHRvIGF2b2lkIHRoZSBjbG9jayBkZS1zeW5jaHJvbml6YXRpb24gYmV0d2VlbiBNYXN0ZXIgYW5kIFNsYXZlLiAqLyAKKyAgICAgIGlmKChoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiAmU1BJX0kyU0NGR1JfSTJTRSkgIT0gU1BJX0kyU0NGR1JfSTJTRSkKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIEkyU2V4dChyZWNlaXZlcikgYmVmb3JlIGVuYWJsaW5nIEkyU3ggcGVyaXBoZXJhbCAqLyAgICAKKyAgICAgICAgX19IQUxfSTJTRVhUX0VOQUJMRShoaTJzKTsKKyAgICAgICAgCisgICAgICAgIC8qIEVuYWJsZSBJMlN4IHBlcmlwaGVyYWwgKi8gICAgCisgICAgICAgIF9fSEFMX0kyU19FTkFCTEUoaGkycyk7CisgICAgICB9CisgICAgICAKKyAgICAgIHdoaWxlKGhpMnMtPlJ4WGZlckNvdW50ID4gMFUpCisgICAgICB7CisgICAgICAgIC8qIFdhaXQgdW50aWwgVFhFIGZsYWcgaXMgc2V0ICovCisgICAgICAgIGlmIChJMlNfRnVsbER1cGxleFdhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaGkycywgSTJTX0ZMQUdfVFhFLCBTRVQsIFRpbWVvdXQsIEkyU19VU0VfSTJTKSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZXQgdGhlIGVycm9yIGNvZGUgYW5kIGV4ZWN1dGUgZXJyb3IgY2FsbGJhY2sqLworICAgICAgICAgIGhpMnMtPkVycm9yQ29kZSB8PSBIQUxfSTJTX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgICAgSEFMX0kyU19FcnJvckNhbGxiYWNrKGhpMnMpOworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChoaTJzLT5UeFhmZXJDb3VudCA+IDBVKQorICAgICAgICB7CisgICAgICAgICAgLyogQ2hlY2sgaWYgYW4gdW5kZXJydW4gb2NjdXJzICovCisgICAgICAgICAgaWYoX19IQUxfSTJTX0dFVF9GTEFHKGhpMnMsIEkyU19GTEFHX1VEUikgPT0gU0VUKSAKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBTZXQgdGhlIEkyUyBTdGF0ZSByZWFkeSAqLworICAgICAgICAgICAgaGkycy0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX1JFQURZOyAKKworICAgICAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICAgICAgX19IQUxfVU5MT0NLKGhpMnMpOworCisgICAgICAgICAgICAvKiBTZXQgdGhlIGVycm9yIGNvZGUgYW5kIGV4ZWN1dGUgZXJyb3IgY2FsbGJhY2sqLworICAgICAgICAgICAgaGkycy0+RXJyb3JDb2RlIHw9IEhBTF9JMlNfRVJST1JfVURSOworICAgICAgICAgICAgSEFMX0kyU19FcnJvckNhbGxiYWNrKGhpMnMpOworCisgICAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICAgIH0KKworICAgICAgICAgIGhpMnMtPkluc3RhbmNlLT5EUiA9ICgqcFR4RGF0YSsrKTsKKyAgICAgICAgICBoaTJzLT5UeFhmZXJDb3VudC0tOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBXYWl0IHVudGlsIFJYTkUgZmxhZyBpcyBzZXQgKi8KKyAgICAgICAgaWYgKEkyU19GdWxsRHVwbGV4V2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoaTJzLCBJMlNfRkxBR19SWE5FLCBTRVQsIFRpbWVvdXQsIEkyU19VU0VfSTJTRVhUKSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZXQgdGhlIGVycm9yIGNvZGUgYW5kIGV4ZWN1dGUgZXJyb3IgY2FsbGJhY2sqLworICAgICAgICAgIGhpMnMtPkVycm9yQ29kZSB8PSBIQUxfSTJTX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgICAgSEFMX0kyU19FcnJvckNhbGxiYWNrKGhpMnMpOworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENoZWNrIGlmIGFuIG92ZXJydW4gb2NjdXJzICovCisgICAgICAgIGlmKF9fSEFMX0kyU0VYVF9HRVRfRkxBRyhoaTJzLCBJMlNfRkxBR19PVlIpID09IFNFVCkgCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZXQgdGhlIEkyUyBTdGF0ZSByZWFkeSAqLworICAgICAgICAgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9SRUFEWTsgCisKKyAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhpMnMpOworCisgICAgICAgICAgLyogU2V0IHRoZSBlcnJvciBjb2RlIGFuZCBleGVjdXRlIGVycm9yIGNhbGxiYWNrKi8KKyAgICAgICAgICBoaTJzLT5FcnJvckNvZGUgfD0gSEFMX0kyU19FUlJPUl9PVlI7CisgICAgICAgICAgSEFMX0kyU19FcnJvckNhbGxiYWNrKGhpMnMpOworICAgICAgCisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgICgqcFJ4RGF0YSsrKSA9IEkyU3hFWFQoaGkycy0+SW5zdGFuY2UpLT5EUjsKKyAgICAgICAgaGkycy0+UnhYZmVyQ291bnQtLTsJCisgICAgICB9CisgICAgfQorICAgIC8qIFRoZSBJMlNfTU9ERV9NQVNURVJfUlggb3IgSTJTX01PREVfU0xBVkVfUlggTW9kZSBpcyBzZWxlY3RlZCAqLworICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBQcmVwYXJlIHRoZSBGaXJzdCBEYXRhIGJlZm9yZSBlbmFibGluZyB0aGUgSTJTICovCisgICAgICBJMlN4RVhUKGhpMnMtPkluc3RhbmNlKS0+RFIgPSAoKnBUeERhdGErKyk7CisgICAgICBoaTJzLT5UeFhmZXJDb3VudC0tOworCisgICAgICAvKiBDaGVjayBpZiB0aGUgSTJTIGlzIGFscmVhZHkgZW5hYmxlZCAqLyAKKyAgICAgIGlmKChoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiAmU1BJX0kyU0NGR1JfSTJTRSkgIT0gU1BJX0kyU0NGR1JfSTJTRSkKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIEkyUyBwZXJpcGhlcmFsIGJlZm9yZSB0aGUgSTJTZXh0Ki8gICAgCisgICAgICAgIF9fSEFMX0kyU19FTkFCTEUoaGkycyk7CisgICAgICAgIAorICAgICAgICAvKiBFbmFibGUgSTJTZXh0KHRyYW5zbWl0dGVyKSBhZnRlciBlbmFibGluZyBJMlN4IHBlcmlwaGVyYWwgKi8gICAgCisgICAgICAgIF9fSEFMX0kyU0VYVF9FTkFCTEUoaGkycyk7CisgICAgICB9CisKKyAgICAgIC8qIENoZWNrIGlmIE1hc3RlciBSZWNlaXZlciBtb2RlIGlzIHNlbGVjdGVkICovCisgICAgICBpZigoaGkycy0+SW5zdGFuY2UtPkkyU0NGR1IgJiBTUElfSTJTQ0ZHUl9JMlNDRkcpID09IEkyU19NT0RFX01BU1RFUl9SWCkKKyAgICAgIHsKKyAgICAgICAgLyogQ2xlYXIgdGhlIE92ZXJydW4gRmxhZyBieSBhIHJlYWQgb3BlcmF0aW9uIG9uIHRoZSBTUElfRFIgcmVnaXN0ZXIgZm9sbG93ZWQgYnkgYSByZWFkCisgICAgICAgIGFjY2VzcyB0byB0aGUgU1BJX1NSIHJlZ2lzdGVyLiAqLyAKKyAgICAgICAgX19IQUxfSTJTX0NMRUFSX09WUkZMQUcoaGkycyk7ICAgICAgICAKKyAgICAgIH0gICAgCisgICAgICAKKyAgICAgIHdoaWxlKGhpMnMtPlJ4WGZlckNvdW50ID4gMFUpCisgICAgICB7CisgICAgICAgIC8qIFdhaXQgdW50aWwgVFhFIGZsYWcgaXMgc2V0ICovCisgICAgICAgIGlmIChJMlNfRnVsbER1cGxleFdhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaGkycywgSTJTX0ZMQUdfVFhFLCBTRVQsIFRpbWVvdXQsIEkyU19VU0VfSTJTRVhUKSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZXQgdGhlIGVycm9yIGNvZGUgYW5kIGV4ZWN1dGUgZXJyb3IgY2FsbGJhY2sqLworICAgICAgICAgIGhpMnMtPkVycm9yQ29kZSB8PSBIQUxfSTJTX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgICAgSEFMX0kyU19FcnJvckNhbGxiYWNrKGhpMnMpOworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChoaTJzLT5UeFhmZXJDb3VudCA+IDBVKQorICAgICAgICB7CisgICAgICAgICAgLyogQ2hlY2sgaWYgYW4gdW5kZXJydW4gb2NjdXJzICovCisgICAgICAgICAgaWYoX19IQUxfSTJTRVhUX0dFVF9GTEFHKGhpMnMsIEkyU19GTEFHX1VEUikgPT0gU0VUKSAKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBTZXQgdGhlIEkyUyBTdGF0ZSByZWFkeSAqLworICAgICAgICAgICAgaGkycy0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX1JFQURZOyAKKworICAgICAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICAgICAgX19IQUxfVU5MT0NLKGhpMnMpOworCisgICAgICAgICAgICAvKiBTZXQgdGhlIGVycm9yIGNvZGUgYW5kIGV4ZWN1dGUgZXJyb3IgY2FsbGJhY2sqLworICAgICAgICAgICAgaGkycy0+RXJyb3JDb2RlIHw9IEhBTF9JMlNfRVJST1JfVURSOworICAgICAgICAgICAgSEFMX0kyU19FcnJvckNhbGxiYWNrKGhpMnMpOworCisgICAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICAgIH0KKworICAgICAgICAgIEkyU3hFWFQoaGkycy0+SW5zdGFuY2UpLT5EUiA9ICgqcFR4RGF0YSsrKTsKKyAgICAgICAgICBoaTJzLT5UeFhmZXJDb3VudC0tOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBXYWl0IHVudGlsIFJYTkUgZmxhZyBpcyBzZXQgKi8KKyAgICAgICAgaWYgKEkyU19GdWxsRHVwbGV4V2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoaTJzLCBJMlNfRkxBR19SWE5FLCBTRVQsIFRpbWVvdXQsIEkyU19VU0VfSTJTKSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZXQgdGhlIGVycm9yIGNvZGUgYW5kIGV4ZWN1dGUgZXJyb3IgY2FsbGJhY2sqLworICAgICAgICAgIGhpMnMtPkVycm9yQ29kZSB8PSBIQUxfSTJTX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgICAgSEFMX0kyU19FcnJvckNhbGxiYWNrKGhpMnMpOworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENoZWNrIGlmIGFuIG92ZXJydW4gb2NjdXJzICovCisgICAgICAgIGlmKF9fSEFMX0kyU19HRVRfRkxBRyhoaTJzLCBJMlNfRkxBR19PVlIpID09IFNFVCkgCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZXQgdGhlIEkyUyBTdGF0ZSByZWFkeSAqLworICAgICAgICAgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9SRUFEWTsgCisKKyAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhpMnMpOworCisgICAgICAgICAgLyogU2V0IHRoZSBlcnJvciBjb2RlIGFuZCBleGVjdXRlIGVycm9yIGNhbGxiYWNrKi8KKyAgICAgICAgICBoaTJzLT5FcnJvckNvZGUgfD0gSEFMX0kyU19FUlJPUl9PVlI7CisgICAgICAgICAgSEFMX0kyU19FcnJvckNhbGxiYWNrKGhpMnMpOworCisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgICgqcFJ4RGF0YSsrKSA9IGhpMnMtPkluc3RhbmNlLT5EUjsKKyAgICAgICAgaGkycy0+UnhYZmVyQ291bnQtLTsJCisgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIFNldCB0aGUgSTJTIFN0YXRlIHJlYWR5ICovCisgICAgaGkycy0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX1JFQURZOyAKKyAgICAKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMnMpOworICAgIAorICAgIHJldHVybiBIQUxfT0s7ICAgIAorICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfSAgICAgCisKKy8qKgorICAqIEBicmllZiBGdWxsLUR1cGxleCBUcmFuc21pdC9SZWNlaXZlIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgSW50ZXJydXB0IAorICAqIEBwYXJhbSBoaTJzOiBJMlMgaGFuZGxlCisgICogQHBhcmFtIHBUeERhdGEgYSAxNi1iaXQgcG9pbnRlciB0byB0aGUgVHJhbnNtaXQgZGF0YSBidWZmZXIuCisgICogQHBhcmFtIHBSeERhdGEgYSAxNi1iaXQgcG9pbnRlciB0byB0aGUgUmVjZWl2ZSBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gU2l6ZSBudW1iZXIgb2YgZGF0YSBzYW1wbGUgdG8gYmUgc2VudDoKKyAgKiBAbm90ZSBXaGVuIGEgMTYtYml0IGRhdGEgZnJhbWUgb3IgYSAxNi1iaXQgZGF0YSBmcmFtZSBleHRlbmRlZCBpcyBzZWxlY3RlZCBkdXJpbmcgdGhlIEkyUworICAqICAgICAgIGNvbmZpZ3VyYXRpb24gcGhhc2UsIHRoZSBTaXplIHBhcmFtZXRlciBtZWFucyB0aGUgbnVtYmVyIG9mIDE2LWJpdCBkYXRhIGxlbmd0aCAKKyAgKiAgICAgICBpbiB0aGUgdHJhbnNhY3Rpb24gYW5kIHdoZW4gYSAyNC1iaXQgZGF0YSBmcmFtZSBvciBhIDMyLWJpdCBkYXRhIGZyYW1lIGlzIHNlbGVjdGVkIAorICAqICAgICAgIHRoZSBTaXplIHBhcmFtZXRlciBtZWFucyB0aGUgbnVtYmVyIG9mIDE2LWJpdCBkYXRhIGxlbmd0aC4gCisgICogQG5vdGUgVGhlIEkyUyBpcyBrZXB0IGVuYWJsZWQgYXQgdGhlIGVuZCBvZiB0cmFuc2FjdGlvbiB0byBhdm9pZCB0aGUgY2xvY2sgZGUtc3luY2hyb25pemF0aW9uIAorICAqICAgICAgIGJldHdlZW4gTWFzdGVyIGFuZCBTbGF2ZShleGFtcGxlOiBhdWRpbyBzdHJlYW1pbmcpLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyU0V4X1RyYW5zbWl0UmVjZWl2ZV9JVChJMlNfSGFuZGxlVHlwZURlZiAqaGkycywgdWludDE2X3QgKnBUeERhdGEsIHVpbnQxNl90ICpwUnhEYXRhLCB1aW50MTZfdCBTaXplKQoreworICBpZihoaTJzLT5TdGF0ZSA9PSBIQUxfSTJTX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYoKHBUeERhdGEgPT0gTlVMTCApIHx8IChwUnhEYXRhID09IE5VTEwgKSB8fCAoU2l6ZSA9PSAwVSkpIAorICAgIHsKKyAgICAgIHJldHVybiAgSEFMX0VSUk9SOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgICAKKyAgICBoaTJzLT5wVHhCdWZmUHRyID0gcFR4RGF0YTsKKyAgICBoaTJzLT5wUnhCdWZmUHRyID0gcFJ4RGF0YTsKKyAgICAKKyAgICAvKiBDaGVjayB0aGUgRGF0YSBmb3JtYXQ6IFdoZW4gYSAxNi1iaXQgZGF0YSBmcmFtZSBvciBhIDE2LWJpdCBkYXRhIGZyYW1lIGV4dGVuZGVkIAorICAgICAgIGlzIHNlbGVjdGVkIGR1cmluZyB0aGUgSTJTIGNvbmZpZ3VyYXRpb24gcGhhc2UsIHRoZSBTaXplIHBhcmFtZXRlciBtZWFucyB0aGUgbnVtYmVyCisgICAgICAgb2YgMTYtYml0IGRhdGEgbGVuZ3RoIGluIHRoZSB0cmFuc2FjdGlvbiBhbmQgd2hlbiBhIDI0LWJpdCBkYXRhIGZyYW1lIG9yIGEgMzItYml0IGRhdGEgCisgICAgICAgZnJhbWUgaXMgc2VsZWN0ZWQgdGhlIFNpemUgcGFyYW1ldGVyIG1lYW5zIHRoZSBudW1iZXIgb2YgMTYtYml0IGRhdGEgbGVuZ3RoLiAqLworICAgIGlmKCgoaGkycy0+SW5zdGFuY2UtPkkyU0NGR1IgJiAoU1BJX0kyU0NGR1JfREFUTEVOIHwgU1BJX0kyU0NGR1JfQ0hMRU4pKSA9PSBJMlNfREFUQUZPUk1BVF8yNEIpfHxcCisgICAgICAoKGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSICYgKFNQSV9JMlNDRkdSX0RBVExFTiB8IFNQSV9JMlNDRkdSX0NITEVOKSkgPT0gSTJTX0RBVEFGT1JNQVRfMzJCKSkKKyAgICB7CisgICAgICBoaTJzLT5UeFhmZXJTaXplID0gKFNpemUgPDwgMVUpOworICAgICAgaGkycy0+VHhYZmVyQ291bnQgPSAoU2l6ZSA8PCAxVSk7CisgICAgICBoaTJzLT5SeFhmZXJTaXplID0gKFNpemUgPDwgMVUpOworICAgICAgaGkycy0+UnhYZmVyQ291bnQgPSAoU2l6ZSA8PCAxVSk7CisgICAgfSAgCisgICAgZWxzZQorICAgIHsKKyAgICAgIGhpMnMtPlR4WGZlclNpemUgPSBTaXplOworICAgICAgaGkycy0+VHhYZmVyQ291bnQgPSBTaXplOworICAgICAgaGkycy0+UnhYZmVyU2l6ZSA9IFNpemU7CisgICAgICBoaTJzLT5SeFhmZXJDb3VudCA9IFNpemU7CisgICAgfQorICAgIAorICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJzKTsKKyAgICAKKyAgICBoaTJzLT5FcnJvckNvZGUgPSBIQUxfSTJTX0VSUk9SX05PTkU7CisgICAgaGkycy0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX0JVU1lfVFhfUlg7CisgICAgCisgICAgLyogQ2hlY2sgaWYgdGhlIEkyU19NT0RFX01BU1RFUl9UWCBvciBJMlNfTU9ERV9TTEFWRV9UWCBNb2RlIGlzIHNlbGVjdGVkICovCisgICAgaWYoKChoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiAmIFNQSV9JMlNDRkdSX0kyU0NGRykgPT0gSTJTX01PREVfTUFTVEVSX1RYKSB8fCAoKGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSICYgU1BJX0kyU0NGR1JfSTJTQ0ZHKSA9PSBJMlNfTU9ERV9TTEFWRV9UWCkpCisgICAgeyAKKyAgICAgIC8qIEVuYWJsZSBJMlNleHQgUlhORSBhbmQgRVJSIGludGVycnVwdHMgKi8KKyAgICAgIF9fSEFMX0kyU0VYVF9FTkFCTEVfSVQoaGkycywgKEkyU19JVF9SWE5FIHwgSTJTX0lUX0VSUikpOworICAgICAgCisgICAgICAvKiBFbmFibGUgSTJTeCBUWEUgYW5kIEVSUiBpbnRlcnJ1cHRzICovCisgICAgICBfX0hBTF9JMlNfRU5BQkxFX0lUKGhpMnMsIChJMlNfSVRfVFhFIHwgSTJTX0lUX0VSUikpOworICAgICAgCisgICAgICAvKiBDaGVjayBpZiB0aGUgSTJTIGlzIGFscmVhZHkgZW5hYmxlZCAqLyAKKyAgICAgIGlmKChoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiAmU1BJX0kyU0NGR1JfSTJTRSkgIT0gU1BJX0kyU0NGR1JfSTJTRSkKKyAgICAgIHsKKyAgICAgICAgaWYoKGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSICYgU1BJX0kyU0NGR1JfSTJTQ0ZHKSA9PSBJMlNfTU9ERV9TTEFWRV9UWCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFByZXBhcmUgdGhlIEZpcnN0IERhdGEgYmVmb3JlIGVuYWJsaW5nIHRoZSBJMlMgKi8KKyAgICAgICAgICBpZihoaTJzLT5UeFhmZXJDb3VudCAhPSAwVSkKKyAgICAgICAgICB7ICAgIAorICAgICAgICAgICAgLyogVHJhbnNtaXQgRmlyc3QgZGF0YSAqLyAgICAgICAgICAKKyAgICAgICAgICAgIGhpMnMtPkluc3RhbmNlLT5EUiA9ICgqaGkycy0+cFR4QnVmZlB0cisrKTsKKyAgICAgICAgICAgIGhpMnMtPlR4WGZlckNvdW50LS07CQorCisgICAgICAgICAgICBpZihoaTJzLT5UeFhmZXJDb3VudCA9PSAwVSkKKyAgICAgICAgICAgIHsgICAgCisgICAgICAgICAgICAgIC8qIERpc2FibGUgVFhFIGFuZCBFUlIgaW50ZXJydXB0ICovCisgICAgICAgICAgICAgIF9fSEFMX0kyU19ESVNBQkxFX0lUKGhpMnMsIChJMlNfSVRfVFhFIHwgSTJTX0lUX0VSUikpOworCisgICAgICAgICAgICAgIGlmKGhpMnMtPlJ4WGZlckNvdW50ID09IDBVKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRGlzYWJsZSBJMlNleHQgUlhORSBhbmQgRVJSIGludGVycnVwdCAqLworICAgICAgICAgICAgICAgIF9fSEFMX0kyU0VYVF9ESVNBQkxFX0lUKGhpMnMsIChJMlNfSVRfUlhORXwgSTJTX0lUX0VSUikpOworCisgICAgICAgICAgICAgICAgaGkycy0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX1JFQURZOworICAgICAgICAgICAgICAgIEhBTF9JMlNfVHhSeENwbHRDYWxsYmFjayhoaTJzKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBFbmFibGUgSTJTZXh0KHJlY2VpdmVyKSBiZWZvcmUgZW5hYmxpbmcgSTJTeCBwZXJpcGhlcmFsICovICAgIAorICAgICAgICBfX0hBTF9JMlNFWFRfRU5BQkxFKGhpMnMpOworICAgICAgICAKKyAgICAgICAgLyogRW5hYmxlIEkyU3ggcGVyaXBoZXJhbCAqLyAgICAKKyAgICAgICAgX19IQUxfSTJTX0VOQUJMRShoaTJzKTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogVGhlIEkyU19NT0RFX01BU1RFUl9SWCBvciBJMlNfTU9ERV9TTEFWRV9SWCBNb2RlIGlzIHNlbGVjdGVkICovIAorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBFbmFibGUgSTJTZXh0IFRYRSBhbmQgRVJSIGludGVycnVwdHMgKi8KKyAgICAgIF9fSEFMX0kyU0VYVF9FTkFCTEVfSVQoaGkycywgKEkyU19JVF9UWEUgfCBJMlNfSVRfRVJSKSk7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSBJMlNleHQgUlhORSBhbmQgRVJSIGludGVycnVwdHMgKi8KKyAgICAgIF9fSEFMX0kyU19FTkFCTEVfSVQoaGkycywgKEkyU19JVF9SWE5FIHwgSTJTX0lUX0VSUikpOworICAgICAgCisgICAgICAvKiBDaGVjayBpZiB0aGUgSTJTIGlzIGFscmVhZHkgZW5hYmxlZCAqLyAKKyAgICAgIGlmKChoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiAmU1BJX0kyU0NGR1JfSTJTRSkgIT0gU1BJX0kyU0NGR1JfSTJTRSkKKyAgICAgIHsKKyAgICAgICAgLyogUHJlcGFyZSB0aGUgRmlyc3QgRGF0YSBiZWZvcmUgZW5hYmxpbmcgdGhlIEkyUyAqLworICAgICAgICBpZihoaTJzLT5UeFhmZXJDb3VudCAhPSAwVSkKKyAgICAgICAgeyAgICAKKyAgICAgICAgICAvKiBUcmFuc21pdCBGaXJzdCBkYXRhICovICAgICAgICAgIAorICAgICAgICAgIEkyU3hFWFQoaGkycy0+SW5zdGFuY2UpLT5EUiA9ICgqaGkycy0+cFR4QnVmZlB0cisrKTsKKyAgICAgICAgICBoaTJzLT5UeFhmZXJDb3VudC0tOwkKKworICAgICAgICAgIGlmKGhpMnMtPlR4WGZlckNvdW50ID09IDBVKQorICAgICAgICAgIHsgICAgCisgICAgICAgICAgICAvKiBEaXNhYmxlIEkyU2V4dCBUWEUgYW5kIEVSUiBpbnRlcnJ1cHQgKi8KKyAgICAgICAgICAgIF9fSEFMX0kyU0VYVF9ESVNBQkxFX0lUKGhpMnMsIChJMlNfSVRfVFhFIHwgSTJTX0lUX0VSUikpOworCisgICAgICAgICAgICBpZihoaTJzLT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogRGlzYWJsZSBSWE5FIGFuZCBFUlIgaW50ZXJydXB0ICovCisgICAgICAgICAgICAgIF9fSEFMX0kyU19ESVNBQkxFX0lUKGhpMnMsIChJMlNfSVRfUlhORXwgSTJTX0lUX0VSUikpOworCisgICAgICAgICAgICAgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9SRUFEWTsKKyAgICAgICAgICAgICAgSEFMX0kyU19UeFJ4Q3BsdENhbGxiYWNrKGhpMnMpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBFbmFibGUgSTJTZXh0KHRyYW5zbWl0dGVyKSBhZnRlciBlbmFibGluZyBJMlN4IHBlcmlwaGVyYWwgKi8gICAgCisgICAgICAgIF9fSEFMX0kyU0VYVF9FTkFCTEUoaGkycyk7CisKKyAgICAgICAgLyogRW5hYmxlIEkyUyBwZXJpcGhlcmFsICovICAgIAorICAgICAgICBfX0hBTF9JMlNfRU5BQkxFKGhpMnMpOworICAgICAgfQorICAgIH0gIAorICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkycyk7CisgICAgCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7IAorICB9Cit9CisKKy8qKgorICAqIEBicmllZiBGdWxsLUR1cGxleCBUcmFuc21pdC9SZWNlaXZlIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgRE1BICAKKyAgKiBAcGFyYW0gaGkyczogSTJTIGhhbmRsZQorICAqIEBwYXJhbSBwVHhEYXRhIGEgMTYtYml0IHBvaW50ZXIgdG8gdGhlIFRyYW5zbWl0IGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSBwUnhEYXRhIGEgMTYtYml0IHBvaW50ZXIgdG8gdGhlIFJlY2VpdmUgZGF0YSBidWZmZXIuCisgICogQHBhcmFtIFNpemUgbnVtYmVyIG9mIGRhdGEgc2FtcGxlIHRvIGJlIHNlbnQ6CisgICogQG5vdGUgV2hlbiBhIDE2LWJpdCBkYXRhIGZyYW1lIG9yIGEgMTYtYml0IGRhdGEgZnJhbWUgZXh0ZW5kZWQgaXMgc2VsZWN0ZWQgZHVyaW5nIHRoZSBJMlMKKyAgKiAgICAgICBjb25maWd1cmF0aW9uIHBoYXNlLCB0aGUgU2l6ZSBwYXJhbWV0ZXIgbWVhbnMgdGhlIG51bWJlciBvZiAxNi1iaXQgZGF0YSBsZW5ndGggCisgICogICAgICAgaW4gdGhlIHRyYW5zYWN0aW9uIGFuZCB3aGVuIGEgMjQtYml0IGRhdGEgZnJhbWUgb3IgYSAzMi1iaXQgZGF0YSBmcmFtZSBpcyBzZWxlY3RlZCAKKyAgKiAgICAgICB0aGUgU2l6ZSBwYXJhbWV0ZXIgbWVhbnMgdGhlIG51bWJlciBvZiAxNi1iaXQgZGF0YSBsZW5ndGguIAorICAqIEBub3RlIFRoZSBJMlMgaXMga2VwdCBlbmFibGVkIGF0IHRoZSBlbmQgb2YgdHJhbnNhY3Rpb24gdG8gYXZvaWQgdGhlIGNsb2NrIGRlLXN5bmNocm9uaXphdGlvbiAKKyAgKiAgICAgICBiZXR3ZWVuIE1hc3RlciBhbmQgU2xhdmUoZXhhbXBsZTogYXVkaW8gc3RyZWFtaW5nKS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMlNFeF9UcmFuc21pdFJlY2VpdmVfRE1BKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzLCB1aW50MTZfdCAqcFR4RGF0YSwgdWludDE2X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIHVpbnQzMl90ICp0bXA7CisgICAgCisgIGlmKChwVHhEYXRhID09IE5VTEwgKSB8fCAocFJ4RGF0YSA9PSBOVUxMICkgfHwgKFNpemUgPT0gMFUpKSAKKyAgeworICAgIHJldHVybiAgSEFMX0VSUk9SOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB9CisKKyAgaWYoaGkycy0+U3RhdGUgPT0gSEFMX0kyU19TVEFURV9SRUFEWSkKKyAgeyAgICAKKyAgICBoaTJzLT5wVHhCdWZmUHRyID0gcFR4RGF0YTsKKyAgICBoaTJzLT5wUnhCdWZmUHRyID0gcFJ4RGF0YTsKKyAgICAKKyAgICAvKiBDaGVjayB0aGUgRGF0YSBmb3JtYXQ6IFdoZW4gYSAxNi1iaXQgZGF0YSBmcmFtZSBvciBhIDE2LWJpdCBkYXRhIGZyYW1lIGV4dGVuZGVkIAorICAgICAgIGlzIHNlbGVjdGVkIGR1cmluZyB0aGUgSTJTIGNvbmZpZ3VyYXRpb24gcGhhc2UsIHRoZSBTaXplIHBhcmFtZXRlciBtZWFucyB0aGUgbnVtYmVyCisgICAgICAgb2YgMTYtYml0IGRhdGEgbGVuZ3RoIGluIHRoZSB0cmFuc2FjdGlvbiBhbmQgd2hlbiBhIDI0LWJpdCBkYXRhIGZyYW1lIG9yIGEgMzItYml0IGRhdGEgCisgICAgICAgZnJhbWUgaXMgc2VsZWN0ZWQgdGhlIFNpemUgcGFyYW1ldGVyIG1lYW5zIHRoZSBudW1iZXIgb2YgMTYtYml0IGRhdGEgbGVuZ3RoLiAqLworICAgIGlmKCgoaGkycy0+SW5zdGFuY2UtPkkyU0NGR1IgJiAoU1BJX0kyU0NGR1JfREFUTEVOIHwgU1BJX0kyU0NGR1JfQ0hMRU4pKSA9PSBJMlNfREFUQUZPUk1BVF8yNEIpfHxcCisgICAgICAoKGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSICYgKFNQSV9JMlNDRkdSX0RBVExFTiB8IFNQSV9JMlNDRkdSX0NITEVOKSkgPT0gSTJTX0RBVEFGT1JNQVRfMzJCKSkKKyAgICB7CisgICAgICBoaTJzLT5UeFhmZXJTaXplID0gKFNpemUgPDwgMVUpOworICAgICAgaGkycy0+VHhYZmVyQ291bnQgPSAoU2l6ZSA8PCAxVSk7CisgICAgICBoaTJzLT5SeFhmZXJTaXplID0gKFNpemUgPDwgMVUpOworICAgICAgaGkycy0+UnhYZmVyQ291bnQgPSAoU2l6ZSA8PCAxVSk7CisgICAgfSAgCisgICAgZWxzZQorICAgIHsKKyAgICAgIGhpMnMtPlR4WGZlclNpemUgPSBTaXplOworICAgICAgaGkycy0+VHhYZmVyQ291bnQgPSBTaXplOworICAgICAgaGkycy0+UnhYZmVyU2l6ZSA9IFNpemU7CisgICAgICBoaTJzLT5SeFhmZXJDb3VudCA9IFNpemU7CisgICAgfQorICAgIAorICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJzKTsKKyAgICAKKyAgICBoaTJzLT5FcnJvckNvZGUgPSBIQUxfSTJTX0VSUk9SX05PTkU7CisgICAgaGkycy0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX0JVU1lfVFhfUlg7CisKKyAgICAvKiBTZXQgdGhlIEkyUyBSeCBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBoaTJzLT5oZG1hcngtPlhmZXJDcGx0Q2FsbGJhY2sgPSBJMlNfVHhSeERNQUNwbHQ7CisKKyAgICAvKiBTZXQgdGhlIEkyUyBSeCBETUEgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGhpMnMtPmhkbWFyeC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBJMlNfVHhSeERNQUhhbGZDcGx0OworCisgICAgLyogU2V0IHRoZSBJMlMgUnggRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgaGkycy0+aGRtYXJ4LT5YZmVyRXJyb3JDYWxsYmFjayA9IEkyU19UeFJ4RE1BRXJyb3I7CisKKyAgICAvKiBTZXQgdGhlIEkyUyBUeCBETUEgdHJhbnNmZXIgY2FsbGJhY2tzIGFzIE5VTEwgYmVjYXVzZSB0aGUKKyAgICBjb21tdW5pY2F0aW9uIGNsb3NpbmcgaXMgcGVyZm9ybWVkIGluIERNQSByZWNlcHRpb24gY2FsbGJhY2tzICovCisgICAgaGkycy0+aGRtYXR4LT5YZmVyQ3BsdENhbGxiYWNrID0gTlVMTDsKKyAgICBoaTJzLT5oZG1hdHgtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gTlVMTDsKKworICAgIC8qIFNldCB0aGUgSTJTIFR4IERNQSBlcnJvciBjYWxsYmFjayAqLworICAgIGhpMnMtPmhkbWF0eC0+WGZlckVycm9yQ2FsbGJhY2sgPSBJMlNfVHhSeERNQUVycm9yOworICAgIAorICAgIC8qIENoZWNrIGlmIHRoZSBJMlNfTU9ERV9NQVNURVJfVFggb3IgSTJTX01PREVfU0xBVkVfVFggTW9kZSBpcyBzZWxlY3RlZCAqLworICAgIGlmKCgoaGkycy0+SW5zdGFuY2UtPkkyU0NGR1IgJiBTUElfSTJTQ0ZHUl9JMlNDRkcpID09IEkyU19NT0RFX01BU1RFUl9UWCkgfHwgKChoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiAmIFNQSV9JMlNDRkdSX0kyU0NGRykgPT0gSTJTX01PREVfU0xBVkVfVFgpKQorICAgIHsgIAorICAgICAgLyogRW5hYmxlIHRoZSBSeCBETUEgQ2hhbm5lbCAqLworICAgICAgdG1wID0gKHVpbnQzMl90KikmcFJ4RGF0YTsKKyAgICAgIEhBTF9ETUFfU3RhcnRfSVQoaGkycy0+aGRtYXJ4LCAodWludDMyX3QpJkkyU3hFWFQoaGkycy0+SW5zdGFuY2UpLT5EUiwgKih1aW50MzJfdCopdG1wLCBoaTJzLT5SeFhmZXJTaXplKTsgICAgICAKKyAgICAgIAorICAgICAgLyogRW5hYmxlIFJ4IERNQSBSZXF1ZXN0ICovICAKKyAgICAgIEkyU3hFWFQoaGkycy0+SW5zdGFuY2UpLT5DUjIgfD0gU1BJX0NSMl9SWERNQUVOOworICAgICAgCisgICAgICAvKiBFbmFibGUgdGhlIFR4IERNQSBDaGFubmVsICovCisgICAgICB0bXAgPSAodWludDMyX3QqKSZwVHhEYXRhOworICAgICAgSEFMX0RNQV9TdGFydF9JVChoaTJzLT5oZG1hdHgsICoodWludDMyX3QqKXRtcCwgKHVpbnQzMl90KSZoaTJzLT5JbnN0YW5jZS0+RFIsIGhpMnMtPlR4WGZlclNpemUpOworICAgICAgCisgICAgICAvKiBFbmFibGUgVHggRE1BIFJlcXVlc3QgKi8gIAorICAgICAgaGkycy0+SW5zdGFuY2UtPkNSMiB8PSBTUElfQ1IyX1RYRE1BRU47CisKKyAgICAgIC8qIENoZWNrIGlmIHRoZSBJMlMgaXMgYWxyZWFkeSBlbmFibGVkICovIAorICAgICAgaWYoKGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSICYgU1BJX0kyU0NGR1JfSTJTRSkgIT0gU1BJX0kyU0NGR1JfSTJTRSkKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIEkyU2V4dChyZWNlaXZlcikgYmVmb3JlIGVuYWJsaW5nIEkyU3ggcGVyaXBoZXJhbCAqLyAgICAgCisgICAgICAgIF9fSEFMX0kyU0VYVF9FTkFCTEUoaGkycyk7CisgICAgICAgIAorICAgICAgICAvKiBFbmFibGUgSTJTIHBlcmlwaGVyYWwgYWZ0ZXIgdGhlIEkyU2V4dCovICAgIAorICAgICAgICBfX0hBTF9JMlNfRU5BQkxFKGhpMnMpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogQ2hlY2sgaWYgTWFzdGVyIFJlY2VpdmVyIG1vZGUgaXMgc2VsZWN0ZWQgKi8KKyAgICAgIGlmKChoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiAmIFNQSV9JMlNDRkdSX0kyU0NGRykgPT0gSTJTX01PREVfTUFTVEVSX1JYKQorICAgICAgeworICAgICAgICAvKiBDbGVhciB0aGUgT3ZlcnJ1biBGbGFnIGJ5IGEgcmVhZCBvcGVyYXRpb24gb24gdGhlIFNQSV9EUiByZWdpc3RlciBmb2xsb3dlZCBieSBhIHJlYWQKKyAgICAgICAgYWNjZXNzIHRvIHRoZSBTUElfU1IgcmVnaXN0ZXIuICovIAorICAgICAgICBfX0hBTF9JMlNfQ0xFQVJfT1ZSRkxBRyhoaTJzKTsgICAgICAgIAorICAgICAgfQorCisgICAgICAvKiBFbmFibGUgdGhlIFR4IERNQSBDaGFubmVsICovCisgICAgICB0bXAgPSAodWludDMyX3QqKSZwVHhEYXRhOworICAgICAgSEFMX0RNQV9TdGFydF9JVChoaTJzLT5oZG1hdHgsICoodWludDMyX3QqKXRtcCwgKHVpbnQzMl90KSZJMlN4RVhUKGhpMnMtPkluc3RhbmNlKS0+RFIsIGhpMnMtPlR4WGZlclNpemUpOworCisgICAgICAvKiBFbmFibGUgVHggRE1BIFJlcXVlc3QgKi8gIAorICAgICAgSTJTeEVYVChoaTJzLT5JbnN0YW5jZSktPkNSMiB8PSBTUElfQ1IyX1RYRE1BRU47CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgUnggRE1BIENoYW5uZWwgKi8KKyAgICAgIHRtcCA9ICh1aW50MzJfdCopJnBSeERhdGE7CisgICAgICBIQUxfRE1BX1N0YXJ0X0lUKGhpMnMtPmhkbWFyeCwgKHVpbnQzMl90KSZoaTJzLT5JbnN0YW5jZS0+RFIsICoodWludDMyX3QqKXRtcCwgaGkycy0+UnhYZmVyU2l6ZSk7ICAgICAgCisKKyAgICAgIC8qIEVuYWJsZSBSeCBETUEgUmVxdWVzdCAqLyAgCisgICAgICBoaTJzLT5JbnN0YW5jZS0+Q1IyIHw9IFNQSV9DUjJfUlhETUFFTjsKKworICAgICAgLyogQ2hlY2sgaWYgdGhlIEkyUyBpcyBhbHJlYWR5IGVuYWJsZWQgKi8gCisgICAgICBpZigoaGkycy0+SW5zdGFuY2UtPkkyU0NGR1IgJiBTUElfSTJTQ0ZHUl9JMlNFKSAhPSBTUElfSTJTQ0ZHUl9JMlNFKQorICAgICAgeworICAgICAgICAvKiBFbmFibGUgSTJTZXh0KHRyYW5zbWl0dGVyKSBiZWZvcmUgZW5hYmxpbmcgSTJTeCBwZXJpcGhlcmFsICovICAgIAorICAgICAgICBfX0hBTF9JMlNFWFRfRU5BQkxFKGhpMnMpOworCisgICAgICAgIC8qIEVuYWJsZSBJMlMgcGVyaXBoZXJhbCBhZnRlciB0aGUgSTJTZXh0Ki8gICAgCisgICAgICAgIF9fSEFMX0kyU19FTkFCTEUoaGkycyk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkycyk7CisgICAgCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8gIAorCisvKiogQGFkZHRvZ3JvdXAgSTJTRXhfUHJpdmF0ZV9GdW5jdGlvbnMgSTJTIEV4dGVuZGVkIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIERNQSBJMlMgdHJhbnNtaXQgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrIAorICAqIEBwYXJhbSBoZG1hIERNQSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEkyU19UeFJ4RE1BQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgICAKK3sKKyAgSTJTX0hhbmRsZVR5cGVEZWYqIGhpMnMgPSAoIEkyU19IYW5kbGVUeXBlRGVmKiApKChETUFfSGFuZGxlVHlwZURlZiogKWhkbWEpLT5QYXJlbnQ7CisKKyAgLyogRE1BIE5vcm1hbCBNb2RlICovCisgIGlmKChoZG1hLT5JbnN0YW5jZS0+Q0NSICYgRE1BX0NDUl9DSVJDKSA9PSAwVSkKKyAgeworICAgIC8qIERpc2FibGUgUngvVHggRE1BIFJlcXVlc3QgKi8KKyAgICBpZigoKGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSICYgU1BJX0kyU0NGR1JfSTJTQ0ZHKSA9PSBJMlNfTU9ERV9NQVNURVJfVFgpIHx8ICgoaGkycy0+SW5zdGFuY2UtPkkyU0NGR1IgJiBTUElfSTJTQ0ZHUl9JMlNDRkcpID09IEkyU19NT0RFX1NMQVZFX1RYKSkKKyAgICB7CisgICAgICBoaTJzLT5JbnN0YW5jZS0+Q1IyICY9ICh1aW50MzJfdCkoflNQSV9DUjJfVFhETUFFTik7CisgICAgICBJMlN4RVhUKGhpMnMtPkluc3RhbmNlKS0+Q1IyICY9ICh1aW50MzJfdCkoflNQSV9DUjJfUlhETUFFTik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoaTJzLT5JbnN0YW5jZS0+Q1IyICY9ICh1aW50MzJfdCkoflNQSV9DUjJfUlhETUFFTik7CisgICAgICBJMlN4RVhUKGhpMnMtPkluc3RhbmNlKS0+Q1IyICY9ICh1aW50MzJfdCkoflNQSV9DUjJfVFhETUFFTik7CisgICAgfQorCisgICAgaGkycy0+UnhYZmVyQ291bnQgPSAwVTsKKyAgICBoaTJzLT5UeFhmZXJDb3VudCA9IDBVOworCisgICAgaGkycy0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX1JFQURZOworICB9CisKKyAgSEFMX0kyU19UeFJ4Q3BsdENhbGxiYWNrKGhpMnMpOworfQorCitzdGF0aWMgdm9pZCBJMlNfVHhSeERNQUhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBJMlNfSGFuZGxlVHlwZURlZiogaGkycyA9ICggSTJTX0hhbmRsZVR5cGVEZWYqICkoKERNQV9IYW5kbGVUeXBlRGVmKiApaGRtYSktPlBhcmVudDsKKworICBIQUxfSTJTX1R4UnhIYWxmQ3BsdENhbGxiYWNrKGhpMnMpOworfQorICAgICAgCisvKioKKyAgKiBAYnJpZWYgRE1BIEkyUyBjb21tdW5pY2F0aW9uIGVycm9yIGNhbGxiYWNrIAorICAqIEBwYXJhbSBoZG1hIDogRE1BIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJTX1R4UnhETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgICAKK3sKKyAgSTJTX0hhbmRsZVR5cGVEZWYqIGhpMnMgPSAoIEkyU19IYW5kbGVUeXBlRGVmKiApKChETUFfSGFuZGxlVHlwZURlZiogKWhkbWEpLT5QYXJlbnQ7CisgIAorICAvKiBEaXNhYmxlIFJ4IGFuZCBUeCBETUEgUmVxdWVzdCAqLworICBoaTJzLT5JbnN0YW5jZS0+Q1IyICY9ICh1aW50MzJfdCkofihTUElfQ1IyX1JYRE1BRU4gfCBTUElfQ1IyX1RYRE1BRU4pKTsKKyAgSTJTeEVYVChoaTJzLT5JbnN0YW5jZSktPkNSMiAmPSAodWludDMyX3QpKH4oU1BJX0NSMl9SWERNQUVOIHwgU1BJX0NSMl9UWERNQUVOKSk7CisKKyAgaGkycy0+VHhYZmVyQ291bnQgPSAwVTsKKyAgaGkycy0+UnhYZmVyQ291bnQgPSAwVTsKKyAgCisgIGhpMnMtPlN0YXRlPSBIQUxfSTJTX1NUQVRFX1JFQURZOworICAKKyAgLyogU2V0IHRoZSBlcnJvciBjb2RlIGFuZCBleGVjdXRlIGVycm9yIGNhbGxiYWNrKi8KKyAgaGkycy0+RXJyb3JDb2RlIHw9IEhBTF9JMlNfRVJST1JfRE1BOworICBIQUxfSTJTX0Vycm9yQ2FsbGJhY2soaGkycyk7Cit9CisKKy8qKgorICAqIEBicmllZiBGdWxsLUR1cGxleCBJVCBoYW5kbGVyIHRyYW5zbWl0IGZ1bmN0aW9uIAorICAqIEBwYXJhbSBoaTJzOiBJMlMgaGFuZGxlCisgICogQHBhcmFtIGkyc1VzZWQ6IGluZGljYXRlIGlmIEkyU3ggb3IgSTJTeF9leHQgaXMgY29uY2VybmVkCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMlNfRnVsbER1cGxleFR4X0lUKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzLCBJMlNfVXNlVHlwZURlZiBpMnNVc2VkKQoreworICBpZihpMnNVc2VkID09IEkyU19VU0VfSTJTKQorICB7CisgICAgLyogVHJhbnNtaXQgZGF0YSAqLyAgICAgICAgICAKKyAgICBoaTJzLT5JbnN0YW5jZS0+RFIgPSAoKmhpMnMtPnBUeEJ1ZmZQdHIrKyk7CisgICAgaGkycy0+VHhYZmVyQ291bnQtLTsJCisKKyAgICBpZihoaTJzLT5UeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7ICAgIAorICAgICAgLyogRGlzYWJsZSBUWEUgYW5kIEVSUiBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX0kyU19ESVNBQkxFX0lUKGhpMnMsIChJMlNfSVRfVFhFIHwgSTJTX0lUX0VSUikpOworCisgICAgICBpZihoaTJzLT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgaGkycy0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX1JFQURZOyAKKyAgICAgICAgSEFMX0kyU19UeFJ4Q3BsdENhbGxiYWNrKGhpMnMpOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBUcmFuc21pdCBkYXRhICovICAgICAgICAgIAorICAgIEkyU3hFWFQoaGkycy0+SW5zdGFuY2UpLT5EUiA9ICgqaGkycy0+cFR4QnVmZlB0cisrKTsKKyAgICBoaTJzLT5UeFhmZXJDb3VudC0tOwkKKworICAgIGlmKGhpMnMtPlR4WGZlckNvdW50ID09IDBVKQorICAgIHsgICAgCisgICAgICAvKiBEaXNhYmxlIEkyU2V4dCBUWEUgYW5kIEVSUiBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX0kyU0VYVF9ESVNBQkxFX0lUKGhpMnMsIChJMlNfSVRfVFhFIHwgSTJTX0lUX0VSUikpOworCisgICAgICBpZihoaTJzLT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgaGkycy0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX1JFQURZOyAKKyAgICAgICAgSEFMX0kyU19UeFJ4Q3BsdENhbGxiYWNrKGhpMnMpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgRnVsbC1EdXBsZXggSVQgaGFuZGxlciByZWNlaXZlIGZ1bmN0aW9uIAorICAqIEBwYXJhbSBoaTJzOiBJMlMgaGFuZGxlCisgICogQHBhcmFtIGkyc1VzZWQ6IGluZGljYXRlIGlmIEkyU3ggb3IgSTJTeF9leHQgaXMgY29uY2VybmVkCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMlNfRnVsbER1cGxleFJ4X0lUKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzLCBJMlNfVXNlVHlwZURlZiBpMnNVc2VkKQoreworICBpZihpMnNVc2VkID09IEkyU19VU0VfSTJTKQorICB7CisgICAgLyogUmVjZWl2ZSBkYXRhICovCisgICAgKCpoaTJzLT5wUnhCdWZmUHRyKyspID0gaGkycy0+SW5zdGFuY2UtPkRSOworICAgIGhpMnMtPlJ4WGZlckNvdW50LS07CisKKyAgICBpZihoaTJzLT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7ICAgIAorICAgICAgLyogRGlzYWJsZSBSWE5FIGFuZCBFUlIgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9JMlNfRElTQUJMRV9JVChoaTJzLCAoSTJTX0lUX1JYTkUgfCBJMlNfSVRfRVJSKSk7CisKKyAgICAgIGlmKGhpMnMtPlR4WGZlckNvdW50ID09IDBVKQorICAgICAgeworICAgICAgICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVBRFk7IAorICAgICAgICBIQUxfSTJTX1R4UnhDcGx0Q2FsbGJhY2soaGkycyk7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJlY2VpdmUgZGF0YSAqLyAgICAgICAgICAKKyAgICAoKmhpMnMtPnBSeEJ1ZmZQdHIrKykgPSBJMlN4RVhUKGhpMnMtPkluc3RhbmNlKS0+RFI7CisgICAgaGkycy0+UnhYZmVyQ291bnQtLTsJCisKKyAgICBpZihoaTJzLT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7ICAgICAgCisgICAgICAvKiBEaXNhYmxlIEkyU2V4dCBSWE5FIGFuZCBFUlIgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9JMlNFWFRfRElTQUJMRV9JVChoaTJzLCAoSTJTX0lUX1JYTkUgfCBJMlNfSVRfRVJSKSk7CisKKyAgICAgIGlmKGhpMnMtPlR4WGZlckNvdW50ID09IDBVKQorICAgICAgeworICAgICAgICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVBRFk7IAorICAgICAgICBIQUxfSTJTX1R4UnhDcGx0Q2FsbGJhY2soaGkycyk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEBicmllZiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgSTJTIENvbW11bmljYXRpb24gVGltZW91dC4KKyAgKiBAcGFyYW0gaGkyczogSTJTIGhhbmRsZQorICAqIEBwYXJhbSBGbGFnIEZsYWcgY2hlY2tlZAorICAqIEBwYXJhbSBTdGF0ZSBWYWx1ZSBvZiB0aGUgZmxhZyBleHBlY3RlZAorICAqIEBwYXJhbSBUaW1lb3V0IER1cmF0aW9uIG9mIHRoZSB0aW1lb3V0CisgICogQHBhcmFtIGkyc1VzZWQ6IEkyUyBpbnN0YW5jZSByZWZlcmVuY2UKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMlNfRnVsbER1cGxleFdhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMsIHVpbnQzMl90IEZsYWcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTdGF0ZSwgdWludDMyX3QgVGltZW91dCwgSTJTX1VzZVR5cGVEZWYgaTJzVXNlZCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICAgCisgIGlmKGkyc1VzZWQgPT0gSTJTX1VTRV9JMlMpCisgIHsKKyAgICBpZihTdGF0ZSA9PSBSRVNFVCkKKyAgICB7ICAgIAorICAgICAgLyogV2FpdCB1bnRpbCBmbGFnIGlzIHJlc2V0ICovCisgICAgICB3aGlsZSgoX19IQUxfSTJTX0dFVF9GTEFHKGhpMnMsIEZsYWcpKSAhPSBSRVNFVCkKKyAgICAgIHsKKyAgICAgICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgICAgICB7CisgICAgICAgICAgaWYoKFRpbWVvdXQgPT0gMFUpIHx8ICgoSEFMX0dldFRpY2soKS10aWNrc3RhcnQpID4gVGltZW91dCkpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogU2V0IHRoZSBJMlMgU3RhdGUgcmVhZHkgKi8KKyAgICAgICAgICAgIGhpMnMtPlN0YXRlPSBIQUxfSTJTX1NUQVRFX1JFQURZOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgICBfX0hBTF9VTkxPQ0soaGkycyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSAvKiBTdGF0ZSA9PSBTRVQgKi8KKyAgICB7CisgICAgICAvKiBXYWl0IHVudGlsIGZsYWcgaXMgc2V0ICovCisgICAgICB3aGlsZSgoX19IQUxfSTJTX0dFVF9GTEFHKGhpMnMsIEZsYWcpKSAhPSBTRVQpCisgICAgICB7CisgICAgICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICAgICAgeworICAgICAgICAgIGlmKChUaW1lb3V0ID09IDBVKSB8fCAoKEhBTF9HZXRUaWNrKCktdGlja3N0YXJ0KSA+IFRpbWVvdXQpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNldCB0aGUgSTJTIFN0YXRlIHJlYWR5ICovCisgICAgICAgICAgICBoaTJzLT5TdGF0ZT0gSEFMX0kyU19TVEFURV9SRUFEWTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICAgICAgX19IQUxfVU5MT0NLKGhpMnMpOworICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UgLyogaTJzVXNlZCA9PSBJMlNfVVNFX0kyU0VYVCAqLworICB7CisgICAgaWYoU3RhdGUgPT0gUkVTRVQpCisgICAgeyAgICAKKyAgICAgIC8qIFdhaXQgdW50aWwgZmxhZyBpcyByZXNldCAqLworICAgICAgd2hpbGUoKF9fSEFMX0kyU0VYVF9HRVRfRkxBRyhoaTJzLCBGbGFnKSkgIT0gUkVTRVQpCisgICAgICB7CisgICAgICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICAgICAgeworICAgICAgICAgIGlmKChUaW1lb3V0ID09IDBVKSB8fCAoKEhBTF9HZXRUaWNrKCktdGlja3N0YXJ0KSA+IFRpbWVvdXQpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNldCB0aGUgSTJTIFN0YXRlIHJlYWR5ICovCisgICAgICAgICAgICBoaTJzLT5TdGF0ZT0gSEFMX0kyU19TVEFURV9SRUFEWTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICAgICAgX19IQUxfVU5MT0NLKGhpMnMpOworICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgLyogU3RhdGUgPT0gU0VUICovCisgICAgeworICAgICAgLyogV2FpdCB1bnRpbCBmbGFnIGlzIHNldCAqLworICAgICAgd2hpbGUoKF9fSEFMX0kyU0VYVF9HRVRfRkxBRyhoaTJzLCBGbGFnKSkgIT0gU0VUKQorICAgICAgeworICAgICAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgICAgIHsKKyAgICAgICAgICBpZigoVGltZW91dCA9PSAwVSkgfHwgKChIQUxfR2V0VGljaygpLXRpY2tzdGFydCkgPiBUaW1lb3V0KSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBTZXQgdGhlIEkyUyBTdGF0ZSByZWFkeSAqLworICAgICAgICAgICAgaGkycy0+U3RhdGU9IEhBTF9JMlNfU1RBVEVfUkVBRFk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgICAgIF9fSEFMX1VOTE9DSyhoaTJzKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgcmV0dXJuIEhBTF9PSzsgICAgICAKK30KKyNlbmRpZiAvKiBTUElfSTJTX0ZVTExEVVBMRVhfU1VQUE9SVCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLyAgCisKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAgICAgICAgICAgICAgICAgICAqLworCisjZW5kaWYgLyogSEFMX0kyU19NT0RVTEVfRU5BQkxFRCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjN4eF9oYWxfaXJkYS5jIGIvU3JjL3N0bTMyZjN4eF9oYWxfaXJkYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjODQzNTgKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJmM3h4X2hhbF9pcmRhLmMKQEAgLTAsMCArMSwyMjk0IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2hhbF9pcmRhLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIElSREEgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgSXJEQSAoSW5mcmFyZWQgRGF0YSBBc3NvY2lhdGlvbikgUGVyaXBoZXJhbAorICAqICAgICAgICAgIChJUkRBKQorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhlIElSREEgSEFMIGRyaXZlciBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOgorCisgICAgKCMpIERlY2xhcmUgYSBJUkRBX0hhbmRsZVR5cGVEZWYgaGFuZGxlIHN0cnVjdHVyZSAoZWcuIElSREFfSGFuZGxlVHlwZURlZiBoaXJkYSkuCisgICAgKCMpIEluaXRpYWxpemUgdGhlIElSREEgbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIEhBTF9JUkRBX01zcEluaXQoKSBBUEkKKyAgICAgICAgaW4gc2V0dGluZyB0aGUgYXNzb2NpYXRlZCBVU0FSVCBvciBVQVJUIGluIElSREEgbW9kZToKKyAgICAgICAgKCsrKSBFbmFibGUgdGhlIFVTQVJUeC9VQVJUeCBpbnRlcmZhY2UgY2xvY2suCisgICAgICAgICgrKykgVVNBUlR4L1VBUlR4IHBpbnMgY29uZmlndXJhdGlvbjoKKyAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBVU0FSVHgvVUFSVHggR1BJT3MuCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlc2UgVVNBUlR4L1VBUlR4IHBpbnMgKFRYIGFzIGFsdGVybmF0ZSBmdW5jdGlvbiBwdWxsLXVwLCBSWCBhcyBhbHRlcm5hdGUgZnVuY3Rpb24gSW5wdXQpLgorICAgICAgICAoKyspIE5WSUMgY29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgaW50ZXJydXB0IHByb2Nlc3MgKEhBTF9JUkRBX1RyYW5zbWl0X0lUKCkKKyAgICAgICAgICAgICBhbmQgSEFMX0lSREFfUmVjZWl2ZV9JVCgpIEFQSXMpOiAKKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgVVNBUlR4L1VBUlR4IGludGVycnVwdCBwcmlvcml0eS4KKyAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgTlZJQyBVU0FSVHgvVUFSVHggSVJRIGhhbmRsZS4gICAgICAgICAgICAKKyAgICAgICAgICAgICgrKyspIFRoZSBzcGVjaWZpYyBJUkRBIGludGVycnVwdHMgKFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQsCisgICAgICAgICAgICAgICAgICBSWE5FIGludGVycnVwdCBhbmQgRXJyb3IgSW50ZXJydXB0cykgd2lsbCBiZSBtYW5hZ2VkIHVzaW5nIHRoZSBtYWNyb3MKKyAgICAgICAgICAgICAgICAgIF9fSEFMX0lSREFfRU5BQkxFX0lUKCkgYW5kIF9fSEFMX0lSREFfRElTQUJMRV9JVCgpIGluc2lkZSB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgcHJvY2Vzcy4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgKCsrKSBETUEgQ29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgRE1BIHByb2Nlc3MgKEhBTF9JUkRBX1RyYW5zbWl0X0RNQSgpCisgICAgICAgICAgICAgYW5kIEhBTF9JUkRBX1JlY2VpdmVfRE1BKCkgQVBJcyk6CisgICAgICAgICAgICAoKysrKSBEZWNsYXJlIGEgRE1BIGhhbmRsZSBzdHJ1Y3R1cmUgZm9yIHRoZSBUeC9SeCBjaGFubmVsLgorICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBETUF4IGludGVyZmFjZSBjbG9jay4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgZGVjbGFyZWQgRE1BIGhhbmRsZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgcmVxdWlyZWQgVHgvUnggcGFyYW1ldGVycy4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgRE1BIFR4L1J4IGNoYW5uZWwuCisgICAgICAgICAgICAoKysrKSBBc3NvY2lhdGUgdGhlIGluaXRpYWxpemVkIERNQSBoYW5kbGUgdG8gdGhlIElSREEgRE1BIFR4L1J4IGhhbmRsZS4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgcHJpb3JpdHkgYW5kIGVuYWJsZSB0aGUgTlZJQyBmb3IgdGhlIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBvbiB0aGUgRE1BIFR4L1J4IGNoYW5uZWwuCisKKyAgICAoIykgUHJvZ3JhbSB0aGUgQmF1ZCBSYXRlLCBXb3JkIExlbmd0aCBhbmQgUGFyaXR5IGFuZCBNb2RlKFJlY2VpdmVyL1RyYW5zbWl0dGVyKSwKKyAgICAgICAgdGhlIG5vcm1hbCBvciBsb3cgcG93ZXIgbW9kZSBhbmQgdGhlIGNsb2NrIHByZXNjYWxlciBpbiB0aGUgaGlyZGEgaGFuZGxlIEluaXQgc3RydWN0dXJlLgorCisgICAgKCMpIEluaXRpYWxpemUgdGhlIElSREEgcmVnaXN0ZXJzIGJ5IGNhbGxpbmcgdGhlIEhBTF9JUkRBX0luaXQoKSBBUEk6CisgICAgICAgICgrKykgVGhpcyBBUEkgY29uZmlndXJlcyBhbHNvIHRoZSBsb3cgbGV2ZWwgSGFyZHdhcmUgKEdQSU8sIENMT0NLLCBDT1JURVguLi5ldGMpCisgICAgICAgICAgICAgYnkgY2FsbGluZyB0aGUgY3VzdG9taXplZCBIQUxfSVJEQV9Nc3BJbml0KCkgQVBJLgorCisgICAgICAgICAtQEAtIFRoZSBzcGVjaWZpYyBJUkRBIGludGVycnVwdHMgKFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQsCisgICAgICAgICAgICAgUlhORSBpbnRlcnJ1cHQgYW5kIEVycm9yIEludGVycnVwdHMpIHdpbGwgYmUgbWFuYWdlZCB1c2luZyB0aGUgbWFjcm9zCisgICAgICAgICAgICAgX19IQUxfSVJEQV9FTkFCTEVfSVQoKSBhbmQgX19IQUxfSVJEQV9ESVNBQkxFX0lUKCkgaW5zaWRlIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBwcm9jZXNzLgorCisgICAgKCMpIFRocmVlIG9wZXJhdGlvbiBtb2RlcyBhcmUgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIGRyaXZlciA6CisKKyAgICAgKioqIFBvbGxpbmcgbW9kZSBJTyBvcGVyYXRpb24gKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisgICAgICAgKCspIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfSVJEQV9UcmFuc21pdCgpCisgICAgICAgKCspIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfSVJEQV9SZWNlaXZlKCkKKworICAgICAqKiogSW50ZXJydXB0IG1vZGUgSU8gb3BlcmF0aW9uICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisgICAgICAgKCspIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX0lSREFfVHJhbnNtaXRfSVQoKQorICAgICAgICgrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyIEhBTF9JUkRBX1R4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSVJEQV9UeENwbHRDYWxsYmFjaygpCisgICAgICAgKCspIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX0lSREFfUmVjZWl2ZV9JVCgpCisgICAgICAgKCspIEF0IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIgSEFMX0lSREFfUnhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9JUkRBX1J4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAoKykgSW4gY2FzZSBvZiB0cmFuc2ZlciBFcnJvciwgSEFMX0lSREFfRXJyb3JDYWxsYmFjaygpIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0lSREFfRXJyb3JDYWxsYmFjaygpCisKKyAgICAgKioqIERNQSBtb2RlIElPIG9wZXJhdGlvbiAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0KKyAgICAgICAoKykgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSAoRE1BKSB1c2luZyBIQUxfSVJEQV9UcmFuc21pdF9ETUEoKQorICAgICAgICgrKSBBdCB0cmFuc21pc3Npb24gaGFsZiBvZiB0cmFuc2ZlciBIQUxfSVJEQV9UeEhhbGZDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9JUkRBX1R4SGFsZkNwbHRDYWxsYmFjaygpCisgICAgICAgKCspIEF0IHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIgSEFMX0lSREFfVHhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9JUkRBX1R4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAoKykgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSAoRE1BKSB1c2luZyBIQUxfSVJEQV9SZWNlaXZlX0RNQSgpCisgICAgICAgKCspIEF0IHJlY2VwdGlvbiBoYWxmIG9mIHRyYW5zZmVyIEhBTF9JUkRBX1J4SGFsZkNwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0lSREFfUnhIYWxmQ3BsdENhbGxiYWNrKCkKKyAgICAgICAoKykgQXQgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2ZlciBIQUxfSVJEQV9SeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0lSREFfUnhDcGx0Q2FsbGJhY2soKQorICAgICAgICgrKSBJbiBjYXNlIG9mIHRyYW5zZmVyIEVycm9yLCBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKCkKKworICAgICAqKiogSVJEQSBIQUwgZHJpdmVyIG1hY3JvcyBsaXN0ICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgWy4uXQorICAgICAgIEJlbG93IHRoZSBsaXN0IG9mIG1vc3QgdXNlZCBtYWNyb3MgaW4gSVJEQSBIQUwgZHJpdmVyLgorCisgICAgICAgKCspIF9fSEFMX0lSREFfRU5BQkxFOiBFbmFibGUgdGhlIElSREEgcGVyaXBoZXJhbAorICAgICAgICgrKSBfX0hBTF9JUkRBX0RJU0FCTEU6IERpc2FibGUgdGhlIElSREEgcGVyaXBoZXJhbAorICAgICAgICgrKSBfX0hBTF9JUkRBX0dFVF9GTEFHIDogQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIElSREEgZmxhZyBpcyBzZXQgb3Igbm90CisgICAgICAgKCspIF9fSEFMX0lSREFfQ0xFQVJfRkxBRyA6IENsZWFyIHRoZSBzcGVjaWZpZWQgSVJEQSBwZW5kaW5nIGZsYWcKKyAgICAgICAoKykgX19IQUxfSVJEQV9FTkFCTEVfSVQ6IEVuYWJsZSB0aGUgc3BlY2lmaWVkIElSREEgaW50ZXJydXB0CisgICAgICAgKCspIF9fSEFMX0lSREFfRElTQUJMRV9JVDogRGlzYWJsZSB0aGUgc3BlY2lmaWVkIElSREEgaW50ZXJydXB0CisgICAgICAgKCspIF9fSEFMX0lSREFfR0VUX0lUX1NPVVJDRTogQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBJUkRBIGludGVycnVwdCBpcyBlbmFibGVkCisKKyAgICAgWy4uXQorICAgICAgIChAKSBZb3UgY2FuIHJlZmVyIHRvIHRoZSBJUkRBIEhBTCBkcml2ZXIgaGVhZGVyIGZpbGUgZm9yIG1vcmUgdXNlZnVsIG1hY3JvcworCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVJEQSBJUkRBCisgICogQGJyaWVmIElSREEgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX0lSREFfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElSREFfUHJpdmF0ZV9Db25zdGFudHMgSVJEQSBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisjZGVmaW5lIElSREFfVEVBQ0tfUkVBQ0tfVElNRU9VVCAgICAgICAgICAgIDEwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSVJEQSBUWCBvciBSWCBlbmFibGUgYWNrbm93bGVkZ2UgdGltZS1vdXQgdmFsdWUgICovCisjZGVmaW5lIElSREFfQ1IxX0ZJRUxEUyAgKCh1aW50MzJfdCkoVVNBUlRfQ1IxX00gfCBVU0FSVF9DUjFfUENFIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBVU0FSVF9DUjFfUFMgfCBVU0FSVF9DUjFfVEUgfCBVU0FSVF9DUjFfUkUpKSAgLyohPCBVQVJUIG9yIFVTQVJUIENSMSBmaWVsZHMgb2YgcGFyYW1ldGVycyBzZXQgYnkgSVJEQV9TZXRDb25maWcgQVBJICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgSVJEQV9Qcml2YXRlX0Z1bmN0aW9ucworICAqIEB7CisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSVJEQV9TZXRDb25maWcoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSVJEQV9DaGVja0lkbGVTdGF0ZShJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJUkRBX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSwgdWludDMyX3QgRmxhZywgRmxhZ1N0YXR1cyBTdGF0dXMsIHVpbnQzMl90IFRpY2tzdGFydCwgdWludDMyX3QgVGltZW91dCk7CitzdGF0aWMgdm9pZCBJUkRBX0VuZFR4VHJhbnNmZXIoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitzdGF0aWMgdm9pZCBJUkRBX0VuZFJ4VHJhbnNmZXIoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitzdGF0aWMgdm9pZCBJUkRBX0RNQVRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBJUkRBX0RNQVRyYW5zbWl0SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgSVJEQV9ETUFSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBJUkRBX0RNQVJlY2VpdmVIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBJUkRBX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIElSREFfRE1BQWJvcnRPbkVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIElSREFfRE1BVHhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIElSREFfRE1BUnhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIElSREFfRE1BVHhPbmx5QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBJUkRBX0RNQVJ4T25seUFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIElSREFfVHJhbnNtaXRfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSVJEQV9FbmRUcmFuc21pdF9JVChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJUkRBX1JlY2VpdmVfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIElSREFfRXhwb3J0ZWRfRnVuY3Rpb25zIElSREEgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gaW5pdGlhbGl6ZSB0aGUgVVNBUlR4CisgIGluIGFzeW5jaHJvbm91cyBJUkRBIG1vZGUuCisgICgrKSBGb3IgdGhlIGFzeW5jaHJvbm91cyBtb2RlIG9ubHkgdGhlc2UgcGFyYW1ldGVycyBjYW4gYmUgY29uZmlndXJlZDoKKyAgICAgICgrKykgQmF1ZCBSYXRlCisgICAgICAoKyspIFdvcmQgTGVuZ3RoCisgICAgICAoKyspIFBhcml0eQorICAgICAgKCsrKSBQb3dlciBtb2RlCisgICAgICAoKyspIFByZXNjYWxlciBzZXR0aW5nCisgICAgICAoKyspIFJlY2VpdmVyL3RyYW5zbWl0dGVyIG1vZGVzCisKKyAgWy4uXQorICBUaGUgSEFMX0lSREFfSW5pdCgpIEFQSSBmb2xsb3dzIHRoZSBVU0FSVCBhc3luY2hyb25vdXMgY29uZmlndXJhdGlvbiBwcm9jZWR1cmVzCisgIChkZXRhaWxzIGZvciB0aGUgcHJvY2VkdXJlcyBhcmUgYXZhaWxhYmxlIGluIHJlZmVyZW5jZSBtYW51YWwpLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKgorICBBZGRpdGlvbmFsIHJlbWFyazogIElmIHRoZSBwYXJpdHkgaXMgZW5hYmxlZCwgdGhlbiB0aGUgTVNCIGJpdCBvZiB0aGUgZGF0YSB3cml0dGVuCisgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGRhdGEgcmVnaXN0ZXIgaXMgdHJhbnNtaXR0ZWQgYnV0IGlzIGNoYW5nZWQgYnkgdGhlIHBhcml0eSBiaXQuCisgICAgICAgICAgICAgICAgICAgICAgQWNjb3JkaW5nIHRvIGRldmljZSBjYXBhYmlsaXR5IChzdXBwb3J0IG9yIG5vdCBvZiA3LWJpdCB3b3JkIGxlbmd0aCksCisgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgbGVuZ3RoIGlzIGVpdGhlciBkZWZpbmVkIGJ5IHRoZSBNIGJpdCAoOC1iaXRzIG9yIDktYml0cykKKyAgICAgICAgICAgICAgICAgICAgICBvciBieSB0aGUgTTEgYW5kIE0wIGJpdHMgKDctYml0LCA4LWJpdCBvciA5LWJpdCkuCisgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGUgSVJEQSBmcmFtZSBmb3JtYXRzIGFyZSBhcyBsaXN0ZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZToKKworICAgIFRhYmxlIDEuIElSREEgZnJhbWUgZm9ybWF0LiAgICAgICAgICAgICAKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgICBNIGJpdCAgICAgICB8ICBQQ0UgYml0ICB8ICAgICAgICAgICAgIElSREEgZnJhbWUgICAgICAgICAgICAgICAgfAorICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgICAgICAgMCAgICAgICAgIHwgICAgIDAgICAgIHwgICAgfCBTQiB8ICAgIDgtYml0IGRhdGEgICB8IFNUQiB8ICAgICB8CisgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgICAgICAwICAgICAgICAgfCAgICAgMSAgICAgfCAgICB8IFNCIHwgNy1iaXQgZGF0YSB8IFBCIHwgU1RCIHwgICAgIHwKKyAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAgICAgIDEgICAgICAgICB8ICAgICAwICAgICB8ICAgIHwgU0IgfCAgICA5LWJpdCBkYXRhICAgfCBTVEIgfCAgICAgfAorICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgICAgICAgMSAgICAgICAgIHwgICAgIDEgICAgIHwgICAgfCBTQiB8IDgtYml0IGRhdGEgfCBQQiB8IFNUQiB8ICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgIE0xIGJpdCB8ICBNMCBiaXQgfCAgUENFIGJpdCAgfCAgICAgICAgICAgICBJUkRBIGZyYW1lICAgICAgICAgICAgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAwICAgIHwgICAgMCAgICB8ICAgICAwICAgICB8ICAgIHwgU0IgfCAgICA4IGJpdCBkYXRhICAgfCBTVEIgfCAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDAgICAgfCAgICAwICAgIHwgICAgIDEgICAgIHwgICAgfCBTQiB8IDcgYml0IGRhdGEgfCBQQiB8IFNUQiB8ICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMCAgICB8ICAgIDEgICAgfCAgICAgMCAgICAgfCAgICB8IFNCIHwgICAgOSBiaXQgZGF0YSAgIHwgU1RCIHwgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAwICAgIHwgICAgMSAgICB8ICAgICAxICAgICB8ICAgIHwgU0IgfCA4IGJpdCBkYXRhIHwgUEIgfCBTVEIgfCAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDEgICAgfCAgICAwICAgIHwgICAgIDAgICAgIHwgICAgfCBTQiB8ICAgIDcgYml0IGRhdGEgICB8IFNUQiB8ICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMSAgICB8ICAgIDAgICAgfCAgICAgMSAgICAgfCAgICB8IFNCIHwgNiBiaXQgZGF0YSB8IFBCIHwgU1RCIHwgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisKKyovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgSVJEQSBtb2RlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBJUkRBX0luaXRUeXBlRGVmIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfSW5pdChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBDaGVjayB0aGUgSVJEQSBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZihoaXJkYSA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBVU0FSVC9VQVJUIGFzc29jaWF0ZWQgdG8gdGhlIElSREEgaGFuZGxlICovCisgIGFzc2VydF9wYXJhbShJU19JUkRBX0lOU1RBTkNFKGhpcmRhLT5JbnN0YW5jZSkpOworCisgIGlmKGhpcmRhLT5nU3RhdGUgPT0gSEFMX0lSREFfU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaGlyZGEtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSyAqLworICAgIEhBTF9JUkRBX01zcEluaXQoaGlyZGEpOworICB9CisKKyAgaGlyZGEtPmdTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCB0byB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCisgIF9fSEFMX0lSREFfRElTQUJMRShoaXJkYSk7CisKKyAgLyogU2V0IHRoZSBJUkRBIENvbW11bmljYXRpb24gcGFyYW1ldGVycyAqLworICBpZiAoSVJEQV9TZXRDb25maWcoaGlyZGEpID09IEhBTF9FUlJPUikKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBJbiBJUkRBIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgLSBMSU5FTiwgU1RPUCBhbmQgQ0xLRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAtIFNDRU4gYW5kIEhEU0VMIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4qLworICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjIsIChVU0FSVF9DUjJfTElORU4gfCBVU0FSVF9DUjJfQ0xLRU4gfCBVU0FSVF9DUjJfU1RPUCkpOworICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIChVU0FSVF9DUjNfU0NFTiB8IFVTQVJUX0NSM19IRFNFTCkpOworCisgIC8qIHNldCB0aGUgVUFSVC9VU0FSVCBpbiBJUkRBIG1vZGUgKi8KKyAgaGlyZGEtPkluc3RhbmNlLT5DUjMgfD0gVVNBUlRfQ1IzX0lSRU47CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0lSREFfRU5BQkxFKGhpcmRhKTsKKworICAvKiBURUFDSyBhbmQvb3IgUkVBQ0sgdG8gY2hlY2sgYmVmb3JlIG1vdmluZyBoaXJkYS0+Z1N0YXRlIGFuZCBoaXJkYS0+UnhTdGF0ZSB0byBSZWFkeSAqLworICByZXR1cm4gKElSREFfQ2hlY2tJZGxlU3RhdGUoaGlyZGEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIElSREEgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfRGVJbml0KElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIENoZWNrIHRoZSBJUkRBIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmKGhpcmRhID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIFVTQVJUL1VBUlQgYXNzb2NpYXRlZCB0byB0aGUgSVJEQSBoYW5kbGUgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0lSREFfSU5TVEFOQ0UoaGlyZGEtPkluc3RhbmNlKSk7CisKKyAgaGlyZGEtPmdTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX0JVU1k7CisKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgSEFMX0lSREFfTXNwRGVJbml0KGhpcmRhKTsKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9JUkRBX0RJU0FCTEUoaGlyZGEpOworCisgIGhpcmRhLT5FcnJvckNvZGUgPSBIQUxfSVJEQV9FUlJPUl9OT05FOworICBoaXJkYS0+Z1N0YXRlICAgID0gSEFMX0lSREFfU1RBVEVfUkVTRVQ7CisgIGhpcmRhLT5SeFN0YXRlICAgPSBIQUxfSVJEQV9TVEFURV9SRVNFVDsKKworICAvKiBQcm9jZXNzIFVubG9jayAqLworICBfX0hBTF9VTkxPQ0soaGlyZGEpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgSVJEQSBNU1AuCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JUkRBX01zcEluaXQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGlyZGEpOworCisgIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICB0aGUgSEFMX0lSREFfTXNwSW5pdCBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIElSREEgTVNQLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSVJEQV9Nc3BEZUluaXQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGlyZGEpOworCisgIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICB0aGUgSEFMX0lSREFfTXNwRGVJbml0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElSREFfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogIEBicmllZiAgIElSREEgVHJhbnNtaXQgYW5kIFJlY2VpdmUgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBtYW5hZ2UgdGhlIElSREEgZGF0YSB0cmFuc2ZlcnMuCisKKyAgWy4uXQorICAgIElyREEgaXMgYSBoYWxmIGR1cGxleCBjb21tdW5pY2F0aW9uIHByb3RvY29sLiBJZiB0aGUgVHJhbnNtaXR0ZXIgaXMgYnVzeSwgYW55IGRhdGEKKyAgICBvbiB0aGUgSXJEQSByZWNlaXZlIGxpbmUgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBJckRBIGRlY29kZXIgYW5kIGlmIHRoZSBSZWNlaXZlcgorICAgIGlzIGJ1c3ksIGRhdGEgb24gdGhlIFRYIGZyb20gdGhlIFVTQVJUIHRvIElyREEgd2lsbCBub3QgYmUgZW5jb2RlZCBieSBJckRBLgorICAgIFdoaWxlIHJlY2VpdmluZyBkYXRhLCB0cmFuc21pc3Npb24gc2hvdWxkIGJlIGF2b2lkZWQgYXMgdGhlIGRhdGEgdG8gYmUgdHJhbnNtaXR0ZWQKKyAgICBjb3VsZCBiZSBjb3JydXB0ZWQuCisKKyAgICAoIykgVGhlcmUgYXJlIHR3byBtb2RlIG9mIHRyYW5zZmVyOgorICAgICAgICAoKyspIEJsb2NraW5nIG1vZGU6IHRoZSBjb21tdW5pY2F0aW9uIGlzIHBlcmZvcm1lZCBpbiBwb2xsaW5nIG1vZGUuCisgICAgICAgICAgICAgVGhlIEhBTCBzdGF0dXMgb2YgYWxsIGRhdGEgcHJvY2Vzc2luZyBpcyByZXR1cm5lZCBieSB0aGUgc2FtZSBmdW5jdGlvbgorICAgICAgICAgICAgIGFmdGVyIGZpbmlzaGluZyB0cmFuc2Zlci4KKyAgICAgICAgKCsrKSBOb24tQmxvY2tpbmcgbW9kZTogdGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nIEludGVycnVwdHMKKyAgICAgICAgICAgICBvciBETUEsIHRoZXNlIEFQSSdzIHJldHVybiB0aGUgSEFMIHN0YXR1cy4KKyAgICAgICAgICAgICBUaGUgZW5kIG9mIHRoZSBkYXRhIHByb2Nlc3Npbmcgd2lsbCBiZSBpbmRpY2F0ZWQgdGhyb3VnaCB0aGUKKyAgICAgICAgICAgICBkZWRpY2F0ZWQgSVJEQSBJUlEgd2hlbiB1c2luZyBJbnRlcnJ1cHQgbW9kZSBvciB0aGUgRE1BIElSUSB3aGVuCisgICAgICAgICAgICAgdXNpbmcgRE1BIG1vZGUuCisgICAgICAgICAgICAgVGhlIEhBTF9JUkRBX1R4Q3BsdENhbGxiYWNrKCksIEhBTF9JUkRBX1J4Q3BsdENhbGxiYWNrKCkgdXNlciBjYWxsYmFja3MKKyAgICAgICAgICAgICB3aWxsIGJlIGV4ZWN1dGVkIHJlc3BlY3RpdmVseSBhdCB0aGUgZW5kIG9mIHRoZSBUcmFuc21pdCBvciBSZWNlaXZlIHByb2Nlc3MKKyAgICAgICAgICAgICBUaGUgSEFMX0lSREFfRXJyb3JDYWxsYmFjaygpIHVzZXIgY2FsbGJhY2sgd2lsbCBiZSBleGVjdXRlZCB3aGVuIGEgY29tbXVuaWNhdGlvbiBlcnJvciBpcyBkZXRlY3RlZAorCisgICAgKCMpIEJsb2NraW5nIG1vZGUgQVBJcyBhcmUgOgorICAgICAgICAoKyspIEhBTF9JUkRBX1RyYW5zbWl0KCkKKyAgICAgICAgKCsrKSBIQUxfSVJEQV9SZWNlaXZlKCkKKworICAgICgjKSBOb24gQmxvY2tpbmcgbW9kZSBBUElzIHdpdGggSW50ZXJydXB0IGFyZSA6CisgICAgICAgICgrKykgSEFMX0lSREFfVHJhbnNtaXRfSVQoKQorICAgICAgICAoKyspIEhBTF9JUkRBX1JlY2VpdmVfSVQoKQorICAgICAgICAoKyspIEhBTF9JUkRBX0lSUUhhbmRsZXIoKQorCisgICAgKCMpIE5vbiBCbG9ja2luZyBtb2RlIGZ1bmN0aW9ucyB3aXRoIERNQSBhcmUgOgorICAgICAgICAoKyspIEhBTF9JUkRBX1RyYW5zbWl0X0RNQSgpCisgICAgICAgICgrKykgSEFMX0lSREFfUmVjZWl2ZV9ETUEoKQorICAgICAgICAoKyspIEhBTF9JUkRBX0RNQVBhdXNlKCkKKyAgICAgICAgKCsrKSBIQUxfSVJEQV9ETUFSZXN1bWUoKQorICAgICAgICAoKyspIEhBTF9JUkRBX0RNQVN0b3AoKQorCisgICAgKCMpIEEgc2V0IG9mIFRyYW5zZmVyIENvbXBsZXRlIENhbGxiYWNrcyBhcmUgcHJvdmlkZWQgaW4gTm9uIEJsb2NraW5nIG1vZGU6CisgICAgICAgICgrKykgSEFMX0lSREFfVHhIYWxmQ3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfSVJEQV9UeENwbHRDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX0lSREFfUnhIYWxmQ3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfSVJEQV9SeENwbHRDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX0lSREFfRXJyb3JDYWxsYmFjaygpCisKKyAgICAoIykgTm9uLUJsb2NraW5nIG1vZGUgdHJhbnNmZXJzIGNvdWxkIGJlIGFib3J0ZWQgdXNpbmcgQWJvcnQgQVBJJ3MgOgorICAgICAgICAoKyspIEhBTF9JUkRBX0Fib3J0KCkKKyAgICAgICAgKCsrKSBIQUxfSVJEQV9BYm9ydFRyYW5zbWl0KCkKKyAgICAgICAgKCsrKSBIQUxfSVJEQV9BYm9ydFJlY2VpdmUoKQorICAgICAgICAoKyspIEhBTF9JUkRBX0Fib3J0X0lUKCkKKyAgICAgICAgKCsrKSBIQUxfSVJEQV9BYm9ydFRyYW5zbWl0X0lUKCkKKyAgICAgICAgKCsrKSBIQUxfSVJEQV9BYm9ydFJlY2VpdmVfSVQoKQorCisgICAgKCMpIEZvciBBYm9ydCBzZXJ2aWNlcyBiYXNlZCBvbiBpbnRlcnJ1cHRzIChIQUxfSVJEQV9BYm9ydHh4eF9JVCksIGEgc2V0IG9mIEFib3J0IENvbXBsZXRlIENhbGxiYWNrcyBhcmUgcHJvdmlkZWQ6CisgICAgICAgICgrKykgSEFMX0lSREFfQWJvcnRDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9JUkRBX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9JUkRBX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjaygpCisKKyAgICAoIykgSW4gTm9uLUJsb2NraW5nIG1vZGUgdHJhbnNmZXJzLCBwb3NzaWJsZSBlcnJvcnMgYXJlIHNwbGl0IGludG8gMiBjYXRlZ29yaWVzLgorICAgICAgICBFcnJvcnMgYXJlIGhhbmRsZWQgYXMgZm9sbG93cyA6CisgICAgICAgKCsrKSBFcnJvciBpcyBjb25zaWRlcmVkIGFzIFJlY292ZXJhYmxlIGFuZCBub24gYmxvY2tpbmcgOiBUcmFuc2ZlciBjb3VsZCBnbyB0aWxsIGVuZCwgYnV0IGVycm9yIHNldmVyaXR5IGlzIAorICAgICAgICAgICAgdG8gYmUgZXZhbHVhdGVkIGJ5IHVzZXIgOiB0aGlzIGNvbmNlcm5zIEZyYW1lIEVycm9yLCBQYXJpdHkgRXJyb3Igb3IgTm9pc2UgRXJyb3IgaW4gSW50ZXJydXB0IG1vZGUgcmVjZXB0aW9uIC4KKyAgICAgICAgICAgIFJlY2VpdmVkIGNoYXJhY3RlciBpcyB0aGVuIHJldHJpZXZlZCBhbmQgc3RvcmVkIGluIFJ4IGJ1ZmZlciwgRXJyb3IgY29kZSBpcyBzZXQgdG8gYWxsb3cgdXNlciB0byBpZGVudGlmeSBlcnJvciB0eXBlLAorICAgICAgICAgICAgYW5kIEhBTF9JUkRBX0Vycm9yQ2FsbGJhY2soKSB1c2VyIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLiBUcmFuc2ZlciBpcyBrZXB0IG9uZ29pbmcgb24gSVJEQSBzaWRlLgorICAgICAgICAgICAgSWYgdXNlciB3YW50cyB0byBhYm9ydCBpdCwgQWJvcnQgc2VydmljZXMgc2hvdWxkIGJlIGNhbGxlZCBieSB1c2VyLgorICAgICAgICgrKykgRXJyb3IgaXMgY29uc2lkZXJlZCBhcyBCbG9ja2luZyA6IFRyYW5zZmVyIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgcHJvcGVybHkgYW5kIGlzIGFib3J0ZWQuCisgICAgICAgICAgICBUaGlzIGNvbmNlcm5zIE92ZXJydW4gRXJyb3IgSW4gSW50ZXJydXB0IG1vZGUgcmVjZXB0aW9uIGFuZCBhbGwgZXJyb3JzIGluIERNQSBtb2RlLgorICAgICAgICAgICAgRXJyb3IgY29kZSBpcyBzZXQgdG8gYWxsb3cgdXNlciB0byBpZGVudGlmeSBlcnJvciB0eXBlLCBhbmQgSEFMX0lSREFfRXJyb3JDYWxsYmFjaygpIHVzZXIgY2FsbGJhY2sgaXMgZXhlY3V0ZWQuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50LgorICAqIEBwYXJhbSAgVGltZW91dCBTcGVjaWZ5IHRpbWVvdXQgdmFsdWUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9UcmFuc21pdChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDE2X3QqIHRtcDsKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gMFU7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFR4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZihoaXJkYS0+Z1N0YXRlID09IEhBTF9JUkRBX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGlyZGEpOworCisgICAgaGlyZGEtPkVycm9yQ29kZSA9IEhBTF9JUkRBX0VSUk9SX05PTkU7CisgICAgaGlyZGEtPmdTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX0JVU1lfVFg7CisKKyAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ21lbnQqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICBoaXJkYS0+VHhYZmVyU2l6ZSA9IFNpemU7CisgICAgaGlyZGEtPlR4WGZlckNvdW50ID0gU2l6ZTsKKyAgICB3aGlsZShoaXJkYS0+VHhYZmVyQ291bnQgPiAwVSkKKyAgICB7CisgICAgICBoaXJkYS0+VHhYZmVyQ291bnQtLTsKKworICAgICAgaWYoSVJEQV9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpcmRhLCBJUkRBX0ZMQUdfVFhFLCBSRVNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICAgIGlmICgoaGlyZGEtPkluaXQuV29yZExlbmd0aCA9PSBJUkRBX1dPUkRMRU5HVEhfOUIpICYmIChoaXJkYS0+SW5pdC5QYXJpdHkgPT0gSVJEQV9QQVJJVFlfTk9ORSkpCisgICAgICB7CisgICAgICAgIHRtcCA9ICh1aW50MTZfdCopIHBEYXRhOworICAgICAgICBoaXJkYS0+SW5zdGFuY2UtPlREUiA9ICgqdG1wICYgKHVpbnQxNl90KTB4MDFGRlUpOworICAgICAgICBwRGF0YSArPSAyVTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaGlyZGEtPkluc3RhbmNlLT5URFIgPSAoKnBEYXRhKysgJiAodWludDhfdCkweEZGVSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYoSVJEQV9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpcmRhLCBJUkRBX0ZMQUdfVEMsIFJFU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorCisgICAgLyogQXQgZW5kIG9mIFR4IHByb2Nlc3MsIHJlc3RvcmUgaGlyZGEtPmdTdGF0ZSB0byBSZWFkeSAqLworICAgIGhpcmRhLT5nU3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGlyZGEpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkLgorICAqIEBwYXJhbSAgVGltZW91dCBTcGVjaWZ5IHRpbWVvdXQgdmFsdWUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9SZWNlaXZlKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MTZfdCogdG1wOworICB1aW50MTZfdCB1aE1hc2s7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDBVOworCisgIC8qIENoZWNrIHRoYXQgYSBSeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYoaGlyZGEtPlJ4U3RhdGUgPT0gSEFMX0lSREFfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZigocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaXJkYSk7CisKKyAgICBoaXJkYS0+RXJyb3JDb2RlID0gSEFMX0lSREFfRVJST1JfTk9ORTsKKyAgICBoaXJkYS0+UnhTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX0JVU1lfUlg7CisKKyAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ21lbnQqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICBoaXJkYS0+UnhYZmVyU2l6ZSA9IFNpemU7CisgICAgaGlyZGEtPlJ4WGZlckNvdW50ID0gU2l6ZTsKKworICAgIC8qIENvbXB1dGF0aW9uIG9mIHRoZSBtYXNrIHRvIGFwcGx5IHRvIFJEUiByZWdpc3RlcgorICAgICAgIG9mIHRoZSBVQVJUIGFzc29jaWF0ZWQgdG8gdGhlIElSREEgKi8KKyAgICBJUkRBX01BU0tfQ09NUFVUQVRJT04oaGlyZGEpOworICAgIHVoTWFzayA9IGhpcmRhLT5NYXNrOworCisgICAgLyogQ2hlY2sgZGF0YSByZW1haW5pbmcgdG8gYmUgcmVjZWl2ZWQgKi8KKyAgICB3aGlsZShoaXJkYS0+UnhYZmVyQ291bnQgPiAwVSkKKyAgICB7CisgICAgICBoaXJkYS0+UnhYZmVyQ291bnQtLTsKKworICAgICAgaWYoSVJEQV9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpcmRhLCBJUkRBX0ZMQUdfUlhORSwgUkVTRVQsIHRpY2tzdGFydCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgICBpZiAoKGhpcmRhLT5Jbml0LldvcmRMZW5ndGggPT0gSVJEQV9XT1JETEVOR1RIXzlCKSAmJiAoaGlyZGEtPkluaXQuUGFyaXR5ID09IElSREFfUEFSSVRZX05PTkUpKQorICAgICAgeworICAgICAgICB0bXAgPSAodWludDE2X3QqKSBwRGF0YSA7CisgICAgICAgICp0bXAgPSAodWludDE2X3QpKGhpcmRhLT5JbnN0YW5jZS0+UkRSICYgdWhNYXNrKTsKKyAgICAgICAgcERhdGEgKz0yVTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgKnBEYXRhKysgPSAodWludDhfdCkoaGlyZGEtPkluc3RhbmNlLT5SRFIgJiAodWludDhfdCl1aE1hc2spOworICAgICAgfQorICAgIH0KKworICAgIC8qIEF0IGVuZCBvZiBSeCBwcm9jZXNzLCByZXN0b3JlIGhpcmRhLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgaGlyZGEtPlJ4U3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGlyZGEpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50LgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfVHJhbnNtaXRfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYoaGlyZGEtPmdTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGlyZGEpOworCisgICAgaGlyZGEtPnBUeEJ1ZmZQdHIgPSBwRGF0YTsKKyAgICBoaXJkYS0+VHhYZmVyU2l6ZSA9IFNpemU7CisgICAgaGlyZGEtPlR4WGZlckNvdW50ID0gU2l6ZTsKKworICAgIGhpcmRhLT5FcnJvckNvZGUgPSBIQUxfSVJEQV9FUlJPUl9OT05FOworICAgIGhpcmRhLT5nU3RhdGUgPSBIQUxfSVJEQV9TVEFURV9CVVNZX1RYOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaXJkYSk7CisKKyAgICAvKiBFbmFibGUgdGhlIElSREEgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBFbXB0eSBJbnRlcnJ1cHQgKi8KKyAgICBTRVRfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVFhFSUUpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX1JlY2VpdmVfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIC8qIENoZWNrIHRoYXQgYSBSeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYoaGlyZGEtPlJ4U3RhdGUgPT0gSEFMX0lSREFfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZigocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpcmRhKTsKKworICAgIGhpcmRhLT5wUnhCdWZmUHRyID0gcERhdGE7CisgICAgaGlyZGEtPlJ4WGZlclNpemUgPSBTaXplOworICAgIGhpcmRhLT5SeFhmZXJDb3VudCA9IFNpemU7CisKKyAgICAvKiBDb21wdXRhdGlvbiBvZiB0aGUgbWFzayB0byBhcHBseSB0byB0aGUgUkRSIHJlZ2lzdGVyCisgICAgICAgb2YgdGhlIFVBUlQgYXNzb2NpYXRlZCB0byB0aGUgSVJEQSAqLworICAgIElSREFfTUFTS19DT01QVVRBVElPTihoaXJkYSk7CisKKyAgICBoaXJkYS0+RXJyb3JDb2RlID0gSEFMX0lSREFfRVJST1JfTk9ORTsKKyAgICBoaXJkYS0+UnhTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX0JVU1lfUlg7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpcmRhKTsKKworICAgIC8qIEVuYWJsZSB0aGUgSVJEQSBQYXJpdHkgRXJyb3IgYW5kIERhdGEgUmVnaXN0ZXIgbm90IGVtcHR5IEludGVycnVwdHMgKi8KKyAgICBTRVRfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRXwgVVNBUlRfQ1IxX1JYTkVJRSk7CisKKyAgICAvKiBFbmFibGUgdGhlIElSREEgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSAqLworICAgIFNFVF9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIERNQSBtb2RlLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHBhcmFtICBwRGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSBzZW50LgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfVHJhbnNtaXRfRE1BKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICAvKiBDaGVjayBpZiBVU0FSVC9VQVJUIGluc3RhbmNlIGFzc29jaWF0ZWQgdG8gdGhlIElSREEgaGFuZGxlIHN1cHBvcnRzIGNvbnRpbnVvdXMgY29tbXVuaWNhdGlvbiB1c2luZyBETUEgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfRE1BX0lOU1RBTkNFKGhpcmRhLT5JbnN0YW5jZSkpOworCisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYoaGlyZGEtPmdTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGlyZGEpOworCisgICAgaGlyZGEtPnBUeEJ1ZmZQdHIgPSBwRGF0YTsKKyAgICBoaXJkYS0+VHhYZmVyU2l6ZSA9IFNpemU7CisgICAgaGlyZGEtPlR4WGZlckNvdW50ID0gU2l6ZTsKKworICAgIGhpcmRhLT5FcnJvckNvZGUgPSBIQUxfSVJEQV9FUlJPUl9OT05FOworICAgIGhpcmRhLT5nU3RhdGUgPSBIQUxfSVJEQV9TVEFURV9CVVNZX1RYOworCisgICAgLyogU2V0IHRoZSBJUkRBIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGhpcmRhLT5oZG1hdHgtPlhmZXJDcGx0Q2FsbGJhY2sgPSBJUkRBX0RNQVRyYW5zbWl0Q3BsdDsKKworICAgIC8qIFNldCB0aGUgSVJEQSBETUEgaGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGhpcmRhLT5oZG1hdHgtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gSVJEQV9ETUFUcmFuc21pdEhhbGZDcGx0OworCisgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICBoaXJkYS0+aGRtYXR4LT5YZmVyRXJyb3JDYWxsYmFjayA9IElSREFfRE1BRXJyb3I7CisKKyAgICAvKiBTZXQgdGhlIERNQSBhYm9ydCBjYWxsYmFjayAqLworICAgIGhpcmRhLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgIC8qIEVuYWJsZSB0aGUgSVJEQSB0cmFuc21pdCBETUEgY2hhbm5lbCAqLworICAgIEhBTF9ETUFfU3RhcnRfSVQoaGlyZGEtPmhkbWF0eCwgKHVpbnQzMl90KWhpcmRhLT5wVHhCdWZmUHRyLCAodWludDMyX3QpJmhpcmRhLT5JbnN0YW5jZS0+VERSLCBTaXplKTsKKworICAgIC8qIENsZWFyIHRoZSBUQyBmbGFnIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgICBfX0hBTF9JUkRBX0NMRUFSX0ZMQUcoaGlyZGEsIElSREFfQ0xFQVJfVENGKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGlyZGEpOworCisgICAgLyogRW5hYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRyYW5zbWl0IHJlcXVlc3QgYnkgc2V0dGluZyB0aGUgRE1BVCBiaXQKKyAgICAgICBpbiB0aGUgVVNBUlQgQ1IzIHJlZ2lzdGVyICovCisgICAgU0VUX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIERNQSBtb2RlLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZC4KKyAgKiBAbm90ZSAgIFdoZW4gdGhlIElSREEgcGFyaXR5IGlzIGVuYWJsZWQgKFBDRSA9IDEpLCB0aGUgcmVjZWl2ZWQgZGF0YSBjb250YWlucworICAqICAgICAgICAgdGhlIHBhcml0eSBiaXQgKE1TQiBwb3NpdGlvbikuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9SZWNlaXZlX0RNQShJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgLyogQ2hlY2sgaWYgVVNBUlQvVUFSVCBpbnN0YW5jZSBhc3NvY2lhdGVkIHRvIHRoZSBJUkRBIGhhbmRsZSBzdXBwb3J0cyBjb250aW51b3VzIGNvbW11bmljYXRpb24gdXNpbmcgRE1BICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0RNQV9JTlNUQU5DRShoaXJkYS0+SW5zdGFuY2UpKTsKKworICAvKiBDaGVjayB0aGF0IGEgUnggcHJvY2VzcyBpcyBub3QgYWxyZWFkeSBvbmdvaW5nICovCisgIGlmKGhpcmRhLT5SeFN0YXRlID09IEhBTF9JUkRBX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaXJkYSk7CisKKyAgICBoaXJkYS0+cFJ4QnVmZlB0ciA9IHBEYXRhOworICAgIGhpcmRhLT5SeFhmZXJTaXplID0gU2l6ZTsKKworICAgIGhpcmRhLT5FcnJvckNvZGUgPSBIQUxfSVJEQV9FUlJPUl9OT05FOworICAgIGhpcmRhLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfQlVTWV9SWDsKKworICAgIC8qIFNldCB0aGUgSVJEQSBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBoaXJkYS0+aGRtYXJ4LT5YZmVyQ3BsdENhbGxiYWNrID0gSVJEQV9ETUFSZWNlaXZlQ3BsdDsKKworICAgIC8qIFNldCB0aGUgSVJEQSBETUEgaGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGhpcmRhLT5oZG1hcngtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gSVJEQV9ETUFSZWNlaXZlSGFsZkNwbHQ7CisKKyAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgIGhpcmRhLT5oZG1hcngtPlhmZXJFcnJvckNhbGxiYWNrID0gSVJEQV9ETUFFcnJvcjsKKworICAgIC8qIFNldCB0aGUgRE1BIGFib3J0IGNhbGxiYWNrICovCisgICAgaGlyZGEtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgIEhBTF9ETUFfU3RhcnRfSVQoaGlyZGEtPmhkbWFyeCwgKHVpbnQzMl90KSZoaXJkYS0+SW5zdGFuY2UtPlJEUiwgKHVpbnQzMl90KWhpcmRhLT5wUnhCdWZmUHRyLCBTaXplKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGlyZGEpOworCisgICAgLyogRW5hYmxlIHRoZSBVQVJUIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQgKi8KKyAgICBTRVRfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisKKyAgICAvKiBFbmFibGUgdGhlIFVBUlQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSAqLworICAgIFNFVF9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgLyogRW5hYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRoZSByZWNlaXZlciByZXF1ZXN0IGJ5IHNldHRpbmcgdGhlIERNQVIgYml0CisgICAgICAgaW4gdGhlIFVTQVJUIENSMyByZWdpc3RlciAqLworICAgIFNFVF9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKworLyoqCisgICogQGJyaWVmICBQYXVzZSB0aGUgRE1BIFRyYW5zZmVyLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9ETUFQYXVzZShJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhpcmRhKTsKKworICBpZiAoKGhpcmRhLT5nU3RhdGUgPT0gSEFMX0lSREFfU1RBVEVfQlVTWV9UWCkgJiYKKyAgICAgIChIQUxfSVNfQklUX1NFVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKSkKKyAgeworICAgIC8qIERpc2FibGUgdGhlIElSREEgRE1BIFR4IHJlcXVlc3QgKi8KKyAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKyAgfQorICBpZiAoKGhpcmRhLT5SeFN0YXRlID09IEhBTF9JUkRBX1NUQVRFX0JVU1lfUlgpICYmCisgICAgICAoSEFMX0lTX0JJVF9TRVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkpCisgIHsKKyAgICAvKiBEaXNhYmxlIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBJUkRBIERNQSBSeCByZXF1ZXN0ICovCisgICAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaXJkYSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBSZXN1bWUgdGhlIERNQSBUcmFuc2Zlci4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVBUlQgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfRE1BUmVzdW1lKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGlyZGEpOworCisgIGlmKGhpcmRhLT5nU3RhdGUgPT0gSEFMX0lSREFfU1RBVEVfQlVTWV9UWCkKKyAgeworICAgIC8qIEVuYWJsZSB0aGUgSVJEQSBETUEgVHggcmVxdWVzdCAqLworICAgIFNFVF9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKyAgfQorICBpZihoaXJkYS0+UnhTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9CVVNZX1JYKQorICB7CisgICAgLyogQ2xlYXIgdGhlIE92ZXJydW4gZmxhZyBiZWZvcmUgcmVzdW1pbmcgdGhlIFJ4IHRyYW5zZmVyKi8KKyAgICBfX0hBTF9JUkRBX0NMRUFSX09SRUZMQUcoaGlyZGEpOworCisgICAgLyogUmVlbmFibGUgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgICAgU0VUX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworICAgIFNFVF9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgLyogRW5hYmxlIHRoZSBJUkRBIERNQSBSeCByZXF1ZXN0ICovCisgICAgU0VUX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworICB9CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGlyZGEpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcCB0aGUgRE1BIFRyYW5zZmVyLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVUFSVCBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9ETUFTdG9wKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIFRoZSBMb2NrIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIEFQSSB0byBhbGxvdyB0aGUgdXNlciBhcHBsaWNhdGlvbgorICAgICB0byBjYWxsIHRoZSBIQUwgSVJEQSBBUEkgdW5kZXIgY2FsbGJhY2tzIEhBTF9JUkRBX1R4Q3BsdENhbGxiYWNrKCkgLyBIQUxfSVJEQV9SeENwbHRDYWxsYmFjaygpIC8KKyAgICAgSEFMX0lSREFfVHhIYWxmQ3BsdENhbGxiYWNrKCkgLyBIQUxfSVJEQV9SeEhhbGZDcGx0Q2FsbGJhY2soKToKKyAgICAgaW5kZWVkLCB3aGVuIEhBTF9ETUFfQWJvcnQoKSBBUEkgaXMgY2FsbGVkLCB0aGUgRE1BIFRYL1JYIFRyYW5zZmVyIG9yIEhhbGYgVHJhbnNmZXIgY29tcGxldGUKKyAgICAgaW50ZXJydXB0IGlzIGdlbmVyYXRlZCBpZiB0aGUgRE1BIHRyYW5zZmVyIGludGVycnVwdGlvbiBvY2N1cnMgYXQgdGhlIG1pZGRsZSBvciBhdCB0aGUgZW5kIG9mCisgICAgIHRoZSBzdHJlYW0gYW5kIHRoZSBjb3JyZXNwb25kaW5nIGNhbGwgYmFjayBpcyBleGVjdXRlZC4gKi8KKworICAvKiBTdG9wIElSREEgRE1BIFR4IHJlcXVlc3QgaWYgb25nb2luZyAqLworICBpZiAoKGhpcmRhLT5nU3RhdGUgPT0gSEFMX0lSREFfU1RBVEVfQlVTWV9UWCkgJiYKKyAgICAgIChIQUxfSVNfQklUX1NFVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKSkKKyAgeworICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgLyogQWJvcnQgdGhlIElSREEgRE1BIFR4IGNoYW5uZWwgKi8KKyAgICBpZihoaXJkYS0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgSEFMX0RNQV9BYm9ydChoaXJkYS0+aGRtYXR4KTsKKyAgICB9CisKKyAgICBJUkRBX0VuZFR4VHJhbnNmZXIoaGlyZGEpOworICB9CisKKyAgLyogU3RvcCBJUkRBIERNQSBSeCByZXF1ZXN0IGlmIG9uZ29pbmcgKi8KKyAgaWYgKChoaXJkYS0+UnhTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9CVVNZX1JYKSAmJgorICAgICAgKEhBTF9JU19CSVRfU0VUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpKQorICB7CisgICAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBBYm9ydCB0aGUgSVJEQSBETUEgUnggY2hhbm5lbCAqLworICAgIGlmKGhpcmRhLT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICBIQUxfRE1BX0Fib3J0KGhpcmRhLT5oZG1hcngpOworICAgIH0KKworICAgIElSREFfRW5kUnhUcmFuc2ZlcihoaXJkYSk7CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IG9uZ29pbmcgdHJhbnNmZXJzIChibG9ja2luZyBtb2RlKS4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVBUlQgbW9kdWxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuIAorICAqICAgICAgICAgVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nIG9wZXJhdGlvbnMgOgorICAqICAgICAgICAgICAtIERpc2FibGUgSVJEQSBJbnRlcnJ1cHRzIChUeCBhbmQgUngpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gYmxvY2tpbmcgbW9kZSA6IHdoZW4gZXhpdGluZyBmdW5jdGlvbiwgQWJvcnQgaXMgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfQWJvcnQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogRGlzYWJsZSBUWEVJRSwgVENJRSwgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUUgfCBVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9UWEVJRSB8IFVTQVJUX0NSMV9UQ0lFKSk7CisgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgLyogRGlzYWJsZSB0aGUgSVJEQSBETUEgVHggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICB7CisgICAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICAvKiBBYm9ydCB0aGUgSVJEQSBETUEgVHggY2hhbm5lbCA6IHVzZSBibG9ja2luZyBETUEgQWJvcnQgQVBJIChubyBjYWxsYmFjaykgKi8KKyAgICBpZihoaXJkYS0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBJUkRBIERNQSBBYm9ydCBjYWxsYmFjayB0byBOdWxsLiAKKyAgICAgICAgIE5vIGNhbGwgYmFjayBleGVjdXRpb24gYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgIGhpcmRhLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgICAgSEFMX0RNQV9BYm9ydChoaXJkYS0+aGRtYXR4KTsKKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBJUkRBIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgIHsKKyAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEFib3J0IHRoZSBJUkRBIERNQSBSeCBjaGFubmVsIDogdXNlIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKG5vIGNhbGxiYWNrKSAqLworICAgIGlmKGhpcmRhLT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIElSREEgRE1BIEFib3J0IGNhbGxiYWNrIHRvIE51bGwuIAorICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaGlyZGEtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICBIQUxfRE1BX0Fib3J0KGhpcmRhLT5oZG1hcngpOworICAgIH0KKyAgfQorCisgIC8qIFJlc2V0IFR4IGFuZCBSeCB0cmFuc2ZlciBjb3VudGVycyAqLworICBoaXJkYS0+VHhYZmVyQ291bnQgPSAwVTsgCisgIGhpcmRhLT5SeFhmZXJDb3VudCA9IDBVOyAKKworICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICBfX0hBTF9JUkRBX0NMRUFSX0ZMQUcoaGlyZGEsIElSREFfQ0xFQVJfT1JFRiB8IElSREFfQ0xFQVJfTkVGIHwgSVJEQV9DTEVBUl9QRUYgfCBJUkRBX0NMRUFSX0ZFRik7CisKKyAgLyogUmVzdG9yZSBoaXJkYS0+Z1N0YXRlIGFuZCBoaXJkYS0+UnhTdGF0ZSB0byBSZWFkeSAqLworICBoaXJkYS0+Z1N0YXRlICA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworICBoaXJkYS0+UnhTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworCisgIC8qIFJlc2V0IEhhbmRsZSBFcnJvckNvZGUgdG8gTm8gRXJyb3IgKi8KKyAgaGlyZGEtPkVycm9yQ29kZSA9IEhBTF9JUkRBX0VSUk9SX05PTkU7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIFRyYW5zbWl0IHRyYW5zZmVyIChibG9ja2luZyBtb2RlKS4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVBUlQgbW9kdWxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgVHggdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuIAorICAqICAgICAgICAgVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nIG9wZXJhdGlvbnMgOgorICAqICAgICAgICAgICAtIERpc2FibGUgSVJEQSBJbnRlcnJ1cHRzIChUeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBibG9ja2luZyBtb2RlIDogd2hlbiBleGl0aW5nIGZ1bmN0aW9uLCBBYm9ydCBpcyBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9BYm9ydFRyYW5zbWl0KElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIERpc2FibGUgVFhFSUUgYW5kIFRDSUUgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfVFhFSUUgfCBVU0FSVF9DUjFfVENJRSkpOworCisgIC8qIERpc2FibGUgdGhlIElSREEgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgeworICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgLyogQWJvcnQgdGhlIElSREEgRE1BIFR4IGNoYW5uZWwgOiB1c2UgYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAobm8gY2FsbGJhY2spICovCisgICAgaWYoaGlyZGEtPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgSVJEQSBETUEgQWJvcnQgY2FsbGJhY2sgdG8gTnVsbC4gCisgICAgICAgICBObyBjYWxsIGJhY2sgZXhlY3V0aW9uIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBoaXJkYS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIEhBTF9ETUFfQWJvcnQoaGlyZGEtPmhkbWF0eCk7CisgICAgfQorICB9CisKKyAgLyogUmVzZXQgVHggdHJhbnNmZXIgY291bnRlciAqLworICBoaXJkYS0+VHhYZmVyQ291bnQgPSAwVTsgCisKKyAgLyogUmVzdG9yZSBoaXJkYS0+Z1N0YXRlIHRvIFJlYWR5ICovCisgIGhpcmRhLT5nU3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IG9uZ29pbmcgUmVjZWl2ZSB0cmFuc2ZlciAoYmxvY2tpbmcgbW9kZSkuCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBVQVJUIG1vZHVsZS4KKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIFJ4IHRyYW5zZmVyIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLiAKKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIElSREEgSW50ZXJydXB0cyAoUngpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gYmxvY2tpbmcgbW9kZSA6IHdoZW4gZXhpdGluZyBmdW5jdGlvbiwgQWJvcnQgaXMgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfQWJvcnRSZWNlaXZlKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIERpc2FibGUgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpOworICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgIC8qIERpc2FibGUgdGhlIElSREEgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgeworICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgLyogQWJvcnQgdGhlIElSREEgRE1BIFJ4IGNoYW5uZWwgOiB1c2UgYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAobm8gY2FsbGJhY2spICovCisgICAgaWYoaGlyZGEtPmhkbWFyeCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgSVJEQSBETUEgQWJvcnQgY2FsbGJhY2sgdG8gTnVsbC4gCisgICAgICAgICBObyBjYWxsIGJhY2sgZXhlY3V0aW9uIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBoaXJkYS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIEhBTF9ETUFfQWJvcnQoaGlyZGEtPmhkbWFyeCk7CisgICAgfQorICB9CisKKyAgLyogUmVzZXQgUnggdHJhbnNmZXIgY291bnRlciAqLworICBoaXJkYS0+UnhYZmVyQ291bnQgPSAwVTsgCisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfSVJEQV9DTEVBUl9GTEFHKGhpcmRhLCBJUkRBX0NMRUFSX09SRUYgfCBJUkRBX0NMRUFSX05FRiB8IElSREFfQ0xFQVJfUEVGIHwgSVJEQV9DTEVBUl9GRUYpOworCisgIC8qIFJlc3RvcmUgaGlyZGEtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaGlyZGEtPlJ4U3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IG9uZ29pbmcgdHJhbnNmZXJzIChJbnRlcnJ1cHQgbW9kZSkuCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBVQVJUIG1vZHVsZS4KKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIHRyYW5zZmVyIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLiAKKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIElSREEgSW50ZXJydXB0cyAoVHggYW5kIFJ4KQorICAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkKKyAgKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0X0lUIChpbiBjYXNlIG9mIHRyYW5zZmVyIGluIERNQSBtb2RlKQorICAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKKyAgKiAgICAgICAgICAgLSBBdCBhYm9ydCBjb21wbGV0aW9uLCBjYWxsIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sKKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIEludGVycnVwdCBtb2RlLCBtZWFuaW5nIHRoYXQgYWJvcnQgcHJvY2VkdXJlIGNvdWxkIGJlCisgICogICAgICAgICBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZCBvbmx5IHdoZW4gdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjayBpcyBleGVjdXRlZCAobm90IHdoZW4gZXhpdGluZyBmdW5jdGlvbikuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfQWJvcnRfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgdWludDMyX3QgYWJvcnRjcGx0ID0gMVU7CisgIAorICAvKiBEaXNhYmxlIFRYRUlFLCBUQ0lFLCBSWE5FLCBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRSB8IFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1RYRUlFIHwgVVNBUlRfQ1IxX1RDSUUpKTsKKyAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAvKiBJZiBETUEgVHggYW5kL29yIERNQSBSeCBIYW5kbGVzIGFyZSBhc3NvY2lhdGVkIHRvIElSREEgSGFuZGxlLCBETUEgQWJvcnQgY29tcGxldGUgY2FsbGJhY2tzIHNob3VsZCBiZSBpbml0aWFsaXNlZAorICAgICBiZWZvcmUgYW55IGNhbGwgdG8gRE1BIEFib3J0IGZ1bmN0aW9ucyAqLworICAvKiBETUEgVHggSGFuZGxlIGlzIHZhbGlkICovCisgIGlmKGhpcmRhLT5oZG1hdHggIT0gTlVMTCkKKyAgeworICAgIC8qIFNldCBETUEgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgaWYgSVJEQSBETUEgVHggcmVxdWVzdCBpZiBlbmFibGVkLgorICAgICAgIE90aGVyd2lzZSwgc2V0IGl0IHRvIE5VTEwgKi8KKyAgICBpZihIQUxfSVNfQklUX1NFVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICAgIHsKKyAgICAgIGhpcmRhLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gSVJEQV9ETUFUeEFib3J0Q2FsbGJhY2s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoaXJkYS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgfQorICB9CisgIC8qIERNQSBSeCBIYW5kbGUgaXMgdmFsaWQgKi8KKyAgaWYoaGlyZGEtPmhkbWFyeCAhPSBOVUxMKQorICB7CisgICAgLyogU2V0IERNQSBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayBpZiBJUkRBIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQuCisgICAgICAgT3RoZXJ3aXNlLCBzZXQgaXQgdG8gTlVMTCAqLworICAgIGlmKEhBTF9JU19CSVRfU0VUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgICAgeworICAgICAgaGlyZGEtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBJUkRBX0RNQVJ4QWJvcnRDYWxsYmFjazsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhpcmRhLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICB9CisgIH0KKyAgCisgIC8qIERpc2FibGUgdGhlIElSREEgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZihIQUxfSVNfQklUX1NFVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICB7CisgICAgLyogRGlzYWJsZSBETUEgVHggYXQgVUFSVCBsZXZlbCAqLworICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgLyogQWJvcnQgdGhlIElSREEgRE1BIFR4IGNoYW5uZWwgOiB1c2Ugbm9uIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKGNhbGxiYWNrKSAqLworICAgIGlmKGhpcmRhLT5oZG1hdHggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBJUkRBIFR4IERNQSBBYm9ydCBjYWxsYmFjayBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpc2VkIDogCisgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfSVJEQV9BYm9ydENwbHRDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisKKyAgICAgIC8qIEFib3J0IERNQSBUWCAqLworICAgICAgaWYoSEFMX0RNQV9BYm9ydF9JVChoaXJkYS0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGhpcmRhLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgYWJvcnRjcGx0ID0gMFU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogRGlzYWJsZSB0aGUgSVJEQSBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICB7CisgICAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBBYm9ydCB0aGUgSVJEQSBETUEgUnggY2hhbm5lbCA6IHVzZSBub24gYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAoY2FsbGJhY2spICovCisgICAgaWYoaGlyZGEtPmhkbWFyeCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIElSREEgUnggRE1BIEFib3J0IGNhbGxiYWNrIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGlzZWQgOiAKKyAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9JUkRBX0Fib3J0Q3BsdENhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKworICAgICAgLyogQWJvcnQgRE1BIFJYICovCisgICAgICBpZihIQUxfRE1BX0Fib3J0X0lUKGhpcmRhLT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaGlyZGEtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgICBhYm9ydGNwbHQgPSAxVTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgYWJvcnRjcGx0ID0gMFU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogaWYgbm8gRE1BIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrIGV4ZWN1dGlvbiBpcyByZXF1aXJlZCA9PiBjYWxsIHVzZXIgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaWYgKGFib3J0Y3BsdCA9PSAxVSkKKyAgeworICAgIC8qIFJlc2V0IFR4IGFuZCBSeCB0cmFuc2ZlciBjb3VudGVycyAqLworICAgIGhpcmRhLT5UeFhmZXJDb3VudCA9IDBVOyAKKyAgICBoaXJkYS0+UnhYZmVyQ291bnQgPSAwVTsKKworICAgIC8qIFJlc2V0IGVycm9yQ29kZSAqLworICAgIGhpcmRhLT5FcnJvckNvZGUgPSBIQUxfSVJEQV9FUlJPUl9OT05FOworCisgICAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgICBfX0hBTF9JUkRBX0NMRUFSX0ZMQUcoaGlyZGEsIElSREFfQ0xFQVJfT1JFRiB8IElSREFfQ0xFQVJfTkVGIHwgSVJEQV9DTEVBUl9QRUYgfCBJUkRBX0NMRUFSX0ZFRik7CisKKyAgICAvKiBSZXN0b3JlIGhpcmRhLT5nU3RhdGUgYW5kIGhpcmRhLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgaGlyZGEtPmdTdGF0ZSAgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKyAgICBoaXJkYS0+UnhTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworCisgICAgLyogQXMgbm8gRE1BIHRvIGJlIGFib3J0ZWQsIGNhbGwgZGlyZWN0bHkgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIEhBTF9JUkRBX0Fib3J0Q3BsdENhbGxiYWNrKGhpcmRhKTsKKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgb25nb2luZyBUcmFuc21pdCB0cmFuc2ZlciAoSW50ZXJydXB0IG1vZGUpLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVUFSVCBtb2R1bGUuCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyBUeCB0cmFuc2ZlciBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4gCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBJUkRBIEludGVycnVwdHMgKFR4KQorICAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkKKyAgKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0X0lUIChpbiBjYXNlIG9mIHRyYW5zZmVyIGluIERNQSBtb2RlKQorICAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKKyAgKiAgICAgICAgICAgLSBBdCBhYm9ydCBjb21wbGV0aW9uLCBjYWxsIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sKKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIEludGVycnVwdCBtb2RlLCBtZWFuaW5nIHRoYXQgYWJvcnQgcHJvY2VkdXJlIGNvdWxkIGJlCisgICogICAgICAgICBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZCBvbmx5IHdoZW4gdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjayBpcyBleGVjdXRlZCAobm90IHdoZW4gZXhpdGluZyBmdW5jdGlvbikuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfQWJvcnRUcmFuc21pdF9JVChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBEaXNhYmxlIFRYRUlFIGFuZCBUQ0lFIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1RYRUlFIHwgVVNBUlRfQ1IxX1RDSUUpKTsKKworICAvKiBEaXNhYmxlIHRoZSBJUkRBIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgIHsKKyAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBJUkRBIERNQSBUeCBjaGFubmVsIDogdXNlIG5vbiBibG9ja2luZyBETUEgQWJvcnQgQVBJIChjYWxsYmFjaykgKi8KKyAgICBpZihoaXJkYS0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBJUkRBIERNQSBBYm9ydCBjYWxsYmFjayA6IAorICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX0lSREFfQWJvcnRDcGx0Q2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaGlyZGEtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBJUkRBX0RNQVR4T25seUFib3J0Q2FsbGJhY2s7CisKKyAgICAgIC8qIEFib3J0IERNQSBUWCAqLworICAgICAgaWYoSEFMX0RNQV9BYm9ydF9JVChoaXJkYS0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgaGlyZGEtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgICBoaXJkYS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayhoaXJkYS0+aGRtYXR4KTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFJlc2V0IFR4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgICAgIGhpcmRhLT5UeFhmZXJDb3VudCA9IDBVOyAKKworICAgICAgLyogUmVzdG9yZSBoaXJkYS0+Z1N0YXRlIHRvIFJlYWR5ICovCisgICAgICBoaXJkYS0+Z1N0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIEhBTF9JUkRBX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soaGlyZGEpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBSZXNldCBUeCB0cmFuc2ZlciBjb3VudGVyICovCisgICAgaGlyZGEtPlR4WGZlckNvdW50ID0gMFU7IAorCisgICAgLyogUmVzdG9yZSBoaXJkYS0+Z1N0YXRlIHRvIFJlYWR5ICovCisgICAgaGlyZGEtPmdTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworCisgICAgLyogQXMgbm8gRE1BIHRvIGJlIGFib3J0ZWQsIGNhbGwgZGlyZWN0bHkgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIEhBTF9JUkRBX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soaGlyZGEpOworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIFJlY2VpdmUgdHJhbnNmZXIgKEludGVycnVwdCBtb2RlKS4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVBUlQgbW9kdWxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgUnggdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuIAorICAqICAgICAgICAgVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nIG9wZXJhdGlvbnMgOgorICAqICAgICAgICAgICAtIERpc2FibGUgSVJEQSBJbnRlcnJ1cHRzIChSeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydF9JVCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogICAgICAgICAgIC0gQXQgYWJvcnQgY29tcGxldGlvbiwgY2FsbCB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBJbnRlcnJ1cHQgbW9kZSwgbWVhbmluZyB0aGF0IGFib3J0IHByb2NlZHVyZSBjb3VsZCBiZQorICAqICAgICAgICAgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQgb25seSB3aGVuIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgKG5vdCB3aGVuIGV4aXRpbmcgZnVuY3Rpb24pLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX0Fib3J0UmVjZWl2ZV9JVChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBEaXNhYmxlIFJYTkUsIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFIHwgVVNBUlRfQ1IxX1BFSUUpKTsKKyAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAvKiBEaXNhYmxlIHRoZSBJUkRBIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgIHsKKyAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEFib3J0IHRoZSBJUkRBIERNQSBSeCBjaGFubmVsIDogdXNlIG5vbiBibG9ja2luZyBETUEgQWJvcnQgQVBJIChjYWxsYmFjaykgKi8KKyAgICBpZihoaXJkYS0+aGRtYXJ4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBJUkRBIERNQSBBYm9ydCBjYWxsYmFjayA6IAorICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX0lSREFfQWJvcnRDcGx0Q2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaGlyZGEtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBJUkRBX0RNQVJ4T25seUFib3J0Q2FsbGJhY2s7CisKKyAgICAgIC8qIEFib3J0IERNQSBSWCAqLworICAgICAgaWYoSEFMX0RNQV9BYm9ydF9JVChoaXJkYS0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgaGlyZGEtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgICBoaXJkYS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayhoaXJkYS0+aGRtYXJ4KTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFJlc2V0IFJ4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgICAgIGhpcmRhLT5SeFhmZXJDb3VudCA9IDBVOyAKKworICAgICAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgICAgIF9fSEFMX0lSREFfQ0xFQVJfRkxBRyhoaXJkYSwgSVJEQV9DTEVBUl9PUkVGIHwgSVJEQV9DTEVBUl9ORUYgfCBJUkRBX0NMRUFSX1BFRiB8IElSREFfQ0xFQVJfRkVGKTsKKworICAgICAgLyogUmVzdG9yZSBoaXJkYS0+UnhTdGF0ZSB0byBSZWFkeSAqLworICAgICAgaGlyZGEtPlJ4U3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKworICAgICAgLyogQXMgbm8gRE1BIHRvIGJlIGFib3J0ZWQsIGNhbGwgZGlyZWN0bHkgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgSEFMX0lSREFfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKGhpcmRhKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUmVzZXQgUnggdHJhbnNmZXIgY291bnRlciAqLworICAgIGhpcmRhLT5SeFhmZXJDb3VudCA9IDBVOyAKKworICAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgICAgX19IQUxfSVJEQV9DTEVBUl9GTEFHKGhpcmRhLCBJUkRBX0NMRUFSX09SRUYgfCBJUkRBX0NMRUFSX05FRiB8IElSREFfQ0xFQVJfUEVGIHwgSVJEQV9DTEVBUl9GRUYpOworCisgICAgLyogUmVzdG9yZSBoaXJkYS0+UnhTdGF0ZSB0byBSZWFkeSAqLworICAgIGhpcmRhLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBBcyBubyBETUEgdG8gYmUgYWJvcnRlZCwgY2FsbCBkaXJlY3RseSB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgSEFMX0lSREFfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKGhpcmRhKTsKKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIElSREEgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0lSREFfSVJRSGFuZGxlcihJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICB1aW50MzJfdCBpc3JmbGFncyAgID0gUkVBRF9SRUcoaGlyZGEtPkluc3RhbmNlLT5JU1IpOworICB1aW50MzJfdCBjcjFpdHMgICAgID0gUkVBRF9SRUcoaGlyZGEtPkluc3RhbmNlLT5DUjEpOworICB1aW50MzJfdCBjcjNpdHM7CisgIHVpbnQzMl90IGVycm9yZmxhZ3M7CisKKyAgLyogSWYgbm8gZXJyb3Igb2NjdXJzICovCisgIGVycm9yZmxhZ3MgPSAoaXNyZmxhZ3MgJiAodWludDMyX3QpKFVTQVJUX0lTUl9QRSB8IFVTQVJUX0lTUl9GRSB8IFVTQVJUX0lTUl9PUkUgfCBVU0FSVF9JU1JfTkUpKTsKKyAgaWYgKGVycm9yZmxhZ3MgPT0gUkVTRVQpCisgIHsKKyAgICAvKiBJUkRBIGluIG1vZGUgUmVjZWl2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZigoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1JYTkUpICE9IFJFU0VUKSAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWE5FSUUpICE9IFJFU0VUKSkKKyAgICB7CisgICAgICBJUkRBX1JlY2VpdmVfSVQoaGlyZGEpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfSAgCisKKyAgLyogSWYgc29tZSBlcnJvcnMgb2NjdXIgKi8KKyAgY3IzaXRzID0gUkVBRF9SRUcoaGlyZGEtPkluc3RhbmNlLT5DUjMpOworICBpZiggICAoZXJyb3JmbGFncyAhPSBSRVNFVCkgCisgICAgICYmICggICAgKChjcjNpdHMgJiBVU0FSVF9DUjNfRUlFKSAhPSBSRVNFVCkKKyAgICAgICAgICB8fCAoKGNyMWl0cyAmIChVU0FSVF9DUjFfUlhORUlFIHwgVVNBUlRfQ1IxX1BFSUUpKSAhPSBSRVNFVCkpICkKKyAgeworICAgIC8qIElSREEgcGFyaXR5IGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZigoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1BFKSAhPSBSRVNFVCkgJiYgKChjcjFpdHMgJiBVU0FSVF9DUjFfUEVJRSkgIT0gUkVTRVQpKQorICAgIHsKKyAgICAgIF9fSEFMX0lSREFfQ0xFQVJfSVQoaGlyZGEsIElSREFfQ0xFQVJfUEVGKTsKKworICAgICAgaGlyZGEtPkVycm9yQ29kZSB8PSBIQUxfSVJEQV9FUlJPUl9QRTsKKyAgICB9CisKKyAgICAvKiBJUkRBIGZyYW1lIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9GRSkgIT0gUkVTRVQpICYmICgoY3IzaXRzICYgVVNBUlRfQ1IzX0VJRSkgIT0gUkVTRVQpKQorICAgIHsKKyAgICAgIF9fSEFMX0lSREFfQ0xFQVJfSVQoaGlyZGEsIElSREFfQ0xFQVJfRkVGKTsKKworICAgICAgaGlyZGEtPkVycm9yQ29kZSB8PSBIQUxfSVJEQV9FUlJPUl9GRTsKKyAgICB9CisKKyAgICAvKiBJUkRBIG5vaXNlIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9ORSkgIT0gUkVTRVQpICYmICgoY3IzaXRzICYgVVNBUlRfQ1IzX0VJRSkgIT0gUkVTRVQpKQorICAgIHsKKyAgICAgIF9fSEFMX0lSREFfQ0xFQVJfSVQoaGlyZGEsIElSREFfQ0xFQVJfTkVGKTsKKworICAgICAgaGlyZGEtPkVycm9yQ29kZSB8PSBIQUxfSVJEQV9FUlJPUl9ORTsKKyAgICB9CisKKyAgICAvKiBJUkRBIE92ZXItUnVuIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9PUkUpICE9IFJFU0VUKSAmJgorICAgICAgICgoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWE5FSUUpICE9IFJFU0VUKSB8fCAoKGNyM2l0cyAmIFVTQVJUX0NSM19FSUUpICE9IFJFU0VUKSkpCisgICAgeworICAgICAgX19IQUxfSVJEQV9DTEVBUl9JVChoaXJkYSwgSVJEQV9DTEVBUl9PUkVGKTsKKworICAgICAgaGlyZGEtPkVycm9yQ29kZSB8PSBIQUxfSVJEQV9FUlJPUl9PUkU7CisgICAgfQorCisgICAgLyogQ2FsbCBJUkRBIEVycm9yIENhbGwgYmFjayBmdW5jdGlvbiBpZiBuZWVkIGJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZihoaXJkYS0+RXJyb3JDb2RlICE9IEhBTF9JUkRBX0VSUk9SX05PTkUpCisgICAgeworICAgICAgLyogSVJEQSBpbiBtb2RlIFJlY2VpdmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICBpZigoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1JYTkUpICE9IFJFU0VUKSAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWE5FSUUpICE9IFJFU0VUKSkKKyAgICAgIHsKKyAgICAgICAgSVJEQV9SZWNlaXZlX0lUKGhpcmRhKTsKKyAgICAgIH0KKworICAgICAgLyogSWYgT3ZlcnJ1biBlcnJvciBvY2N1cnMsIG9yIGlmIGFueSBlcnJvciBvY2N1cnMgaW4gRE1BIG1vZGUgcmVjZXB0aW9uLAorICAgICAgICAgY29uc2lkZXIgZXJyb3IgYXMgYmxvY2tpbmcgKi8KKyAgICAgIGlmICgoKGhpcmRhLT5FcnJvckNvZGUgJiBIQUxfSVJEQV9FUlJPUl9PUkUpICE9IFJFU0VUKSB8fAorICAgICAgICAgIChIQUxfSVNfQklUX1NFVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKSkKKyAgICAgIHsgIAorICAgICAgICAvKiBCbG9ja2luZyBlcnJvciA6IHRyYW5zZmVyIGlzIGFib3J0ZWQKKyAgICAgICAgICAgU2V0IHRoZSBJUkRBIHN0YXRlIHJlYWR5IHRvIGJlIGFibGUgdG8gc3RhcnQgYWdhaW4gdGhlIHByb2Nlc3MsCisgICAgICAgICAgIERpc2FibGUgUnggSW50ZXJydXB0cywgYW5kIGRpc2FibGUgUnggRE1BIHJlcXVlc3QsIGlmIG9uZ29pbmcgKi8KKyAgICAgICAgSVJEQV9FbmRSeFRyYW5zZmVyKGhpcmRhKTsKKworICAgICAgICAvKiBEaXNhYmxlIHRoZSBJUkRBIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgICAgICAgaWYgKEhBTF9JU19CSVRfU0VUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgICAgICAgIHsKKyAgICAgICAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgICAgICAgIC8qIEFib3J0IHRoZSBJUkRBIERNQSBSeCBjaGFubmVsICovCisgICAgICAgICAgaWYoaGlyZGEtPmhkbWFyeCAhPSBOVUxMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNldCB0aGUgSVJEQSBETUEgQWJvcnQgY2FsbGJhY2sgOiAKKyAgICAgICAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9JUkRBX0Vycm9yQ2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgICAgICAgaGlyZGEtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBJUkRBX0RNQUFib3J0T25FcnJvcjsKKworICAgICAgICAgICAgLyogQWJvcnQgRE1BIFJYICovCisgICAgICAgICAgICBpZihIQUxfRE1BX0Fib3J0X0lUKGhpcmRhLT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogQ2FsbCBEaXJlY3RseSBoaXJkYS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayBmdW5jdGlvbiBpbiBjYXNlIG9mIGVycm9yICovCisgICAgICAgICAgICAgIGhpcmRhLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrKGhpcmRhLT5oZG1hcngpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgICAgICBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKGhpcmRhKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgICAgSEFMX0lSREFfRXJyb3JDYWxsYmFjayhoaXJkYSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogTm9uIEJsb2NraW5nIGVycm9yIDogdHJhbnNmZXIgY291bGQgZ28gb24uIAorICAgICAgICAgICBFcnJvciBpcyBub3RpZmllZCB0byB1c2VyIHRocm91Z2ggdXNlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKGhpcmRhKTsKKyAgICAgICAgaGlyZGEtPkVycm9yQ29kZSA9IEhBTF9JUkRBX0VSUk9SX05PTkU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybjsKKworICB9IC8qIEVuZCBpZiBzb21lIGVycm9yIG9jY3VycyAqLworCisgIC8qIElSREEgaW4gbW9kZSBUcmFuc21pdHRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZigoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1RYRSkgIT0gUkVTRVQpICYmICgoY3IxaXRzICYgVVNBUlRfQ1IxX1RYRUlFKSAhPSBSRVNFVCkpCisgIHsKKyAgICBJUkRBX1RyYW5zbWl0X0lUKGhpcmRhKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBJUkRBIGluIG1vZGUgVHJhbnNtaXR0ZXIgKHRyYW5zbWlzc2lvbiBlbmQpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9UQykgIT0gUkVTRVQpICYmICgoY3IxaXRzICYgVVNBUlRfQ1IxX1RDSUUpICE9IFJFU0VUKSkKKyAgeworICAgIElSREFfRW5kVHJhbnNtaXRfSVQoaGlyZGEpOworICAgIHJldHVybjsKKyAgfQorCit9CisKKy8qKgorICAqIEBicmllZiAgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSVJEQV9UeENwbHRDYWxsYmFjayhJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaXJkYSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9JUkRBX1R4Q3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBUeCBIYWxmIFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVTQVJUIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JUkRBX1R4SGFsZkNwbHRDYWxsYmFjayhJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaXJkYSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9JUkRBX1R4SGFsZkNwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSVJEQV9SeENwbHRDYWxsYmFjayhJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaXJkYSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9JUkRBX1J4Q3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBSeCBIYWxmIFRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0lSREFfUnhIYWxmQ3BsdENhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpcmRhKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0lSREFfUnhIYWxmQ3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBJUkRBIGVycm9yIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpcmRhKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0lSREFfRXJyb3JDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgSVJEQSBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0lSREFfQWJvcnRDcGx0Q2FsbGJhY2sgKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpcmRhKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0lSREFfQWJvcnRDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIElSREEgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JUkRBX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpcmRhKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0lSREFfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgSVJEQSBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSVJEQV9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpcmRhKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0lSREFfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zCisgICogIEBicmllZiAgIElSREEgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byByZXR1cm4gdGhlIFN0YXRlIG9mIElyREEKKyAgICBjb21tdW5pY2F0aW9uIHByb2Nlc3MgYW5kIGFsc28gcmV0dXJuIFBlcmlwaGVyYWwgRXJyb3JzIG9jY3VycmVkIGR1cmluZyBjb21tdW5pY2F0aW9uIHByb2Nlc3MKKyAgICAgKCspIEhBTF9JUkRBX0dldFN0YXRlKCkgQVBJIGNhbiBiZSBoZWxwZnVsIHRvIGNoZWNrIGluIHJ1bi10aW1lIHRoZSBzdGF0ZQorICAgICAgICAgb2YgdGhlIElSREEgcGVyaXBoZXJhbCBoYW5kbGUuCisgICAgICgrKSBIQUxfSVJEQV9HZXRFcnJvcigpIGNoZWNrcyBpbiBydW4tdGltZSBlcnJvcnMgdGhhdCBjb3VsZCBvY2N1ciBkdXJpbmcKKyAgICAgICAgIGNvbW11bmljYXRpb24uCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBJUkRBIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfSVJEQV9TdGF0ZVR5cGVEZWYgSEFMX0lSREFfR2V0U3RhdGUoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogUmV0dXJuIElSREEgaGFuZGxlIHN0YXRlICovCisgIHVpbnQzMl90IHRlbXAxPSAweDAwVSwgdGVtcDIgPSAweDAwVTsKKyAgdGVtcDEgPSBoaXJkYS0+Z1N0YXRlOworICB0ZW1wMiA9IGhpcmRhLT5SeFN0YXRlOworCisgIHJldHVybiAoSEFMX0lSREFfU3RhdGVUeXBlRGVmKSh0ZW1wMSB8IHRlbXAyKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIElSREEgaGFuZGxlIGVycm9yIGNvZGUuCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcmV0dmFsIElSREEgRXJyb3IgQ29kZQorICAqLwordWludDMyX3QgSEFMX0lSREFfR2V0RXJyb3IoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgcmV0dXJuIGhpcmRhLT5FcnJvckNvZGU7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVJEQV9Qcml2YXRlX0Z1bmN0aW9ucyBJUkRBIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIElSREEgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIElSREFfU2V0Q29uZmlnKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIHVpbnQzMl90IHRtcHJlZyAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMFU7CisgIElSREFfQ2xvY2tTb3VyY2VUeXBlRGVmIGNsb2Nrc291cmNlID0gSVJEQV9DTE9DS1NPVVJDRV9VTkRFRklORUQ7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHJldCAgICAgICAgICAgICAgID0gSEFMX09LOworCisgIC8qIENoZWNrIHRoZSBjb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0lSREFfQkFVRFJBVEUoaGlyZGEtPkluaXQuQmF1ZFJhdGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0lSREFfV09SRF9MRU5HVEgoaGlyZGEtPkluaXQuV29yZExlbmd0aCkpOworICBhc3NlcnRfcGFyYW0oSVNfSVJEQV9QQVJJVFkoaGlyZGEtPkluaXQuUGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19JUkRBX1RYX1JYX01PREUoaGlyZGEtPkluaXQuTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfSVJEQV9QUkVTQ0FMRVIoaGlyZGEtPkluaXQuUHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19JUkRBX1BPV0VSTU9ERShoaXJkYS0+SW5pdC5Qb3dlck1vZGUpKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ29uZmlndXJlIHRoZSBJUkRBIFdvcmQgTGVuZ3RoLCBQYXJpdHkgYW5kIHRyYW5zZmVyIE1vZGU6CisgICAgIFNldCB0aGUgTSBiaXRzIGFjY29yZGluZyB0byBoaXJkYS0+SW5pdC5Xb3JkTGVuZ3RoIHZhbHVlCisgICAgIFNldCBQQ0UgYW5kIFBTIGJpdHMgYWNjb3JkaW5nIHRvIGhpcmRhLT5Jbml0LlBhcml0eSB2YWx1ZQorICAgICBTZXQgVEUgYW5kIFJFIGJpdHMgYWNjb3JkaW5nIHRvIGhpcmRhLT5Jbml0Lk1vZGUgdmFsdWUgKi8KKyAgdG1wcmVnID0gKHVpbnQzMl90KWhpcmRhLT5Jbml0LldvcmRMZW5ndGggfCBoaXJkYS0+SW5pdC5QYXJpdHkgfCBoaXJkYS0+SW5pdC5Nb2RlIDsKKworICBNT0RJRllfUkVHKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCBJUkRBX0NSMV9GSUVMRFMsIHRtcHJlZyk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBDUjMgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIE1PRElGWV9SRUcoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19JUkxQLCBoaXJkYS0+SW5pdC5Qb3dlck1vZGUpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgR1RQUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBNT0RJRllfUkVHKGhpcmRhLT5JbnN0YW5jZS0+R1RQUiwgVVNBUlRfR1RQUl9QU0MsIGhpcmRhLT5Jbml0LlByZXNjYWxlcik7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBCUlIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIElSREFfR0VUQ0xPQ0tTT1VSQ0UoaGlyZGEsIGNsb2Nrc291cmNlKTsKKyAgc3dpdGNoIChjbG9ja3NvdXJjZSkKKyAgeworICAgIGNhc2UgSVJEQV9DTE9DS1NPVVJDRV9QQ0xLMToKKyAgICAgIGhpcmRhLT5JbnN0YW5jZS0+QlJSID0gKHVpbnQxNl90KSgoSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKSArIChoaXJkYS0+SW5pdC5CYXVkUmF0ZS8yVSkpIC8gaGlyZGEtPkluaXQuQmF1ZFJhdGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJUkRBX0NMT0NLU09VUkNFX1BDTEsyOgorICAgICAgaGlyZGEtPkluc3RhbmNlLT5CUlIgPSAodWludDE2X3QpKChIQUxfUkNDX0dldFBDTEsyRnJlcSgpICsgKGhpcmRhLT5Jbml0LkJhdWRSYXRlLzJVKSkgLyBoaXJkYS0+SW5pdC5CYXVkUmF0ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIElSREFfQ0xPQ0tTT1VSQ0VfSFNJOgorICAgICAgaGlyZGEtPkluc3RhbmNlLT5CUlIgPSAodWludDE2X3QpKChIU0lfVkFMVUUgKyAoaGlyZGEtPkluaXQuQmF1ZFJhdGUvMlUpKSAvIGhpcmRhLT5Jbml0LkJhdWRSYXRlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVJEQV9DTE9DS1NPVVJDRV9TWVNDTEs6CisgICAgICBoaXJkYS0+SW5zdGFuY2UtPkJSUiA9ICh1aW50MTZfdCkoKEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCkgKyAoaGlyZGEtPkluaXQuQmF1ZFJhdGUvMlUpKSAvIGhpcmRhLT5Jbml0LkJhdWRSYXRlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVJEQV9DTE9DS1NPVVJDRV9MU0U6CisgICAgICBoaXJkYS0+SW5zdGFuY2UtPkJSUiA9ICh1aW50MTZfdCkoKExTRV9WQUxVRSAgKyAoaGlyZGEtPkluaXQuQmF1ZFJhdGUvMlUpKSAvIGhpcmRhLT5Jbml0LkJhdWRSYXRlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVJEQV9DTE9DS1NPVVJDRV9VTkRFRklORUQ6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayB0aGUgSVJEQSBJZGxlIFN0YXRlLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSVJEQV9DaGVja0lkbGVTdGF0ZShJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKworICAvKiBJbml0aWFsaXplIHRoZSBJUkRBIEVycm9yQ29kZSAqLworICBoaXJkYS0+RXJyb3JDb2RlID0gSEFMX0lSREFfRVJST1JfTk9ORTsKKworICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ21lbnQqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIFRFQUNLIGJpdHMgaW4gSVNSIGlzIGNoZWNrZWQgb25seSB3aGVuIGF2YWlsYWJsZS4KKyAgICAgQml0IGlzIGRlZmluZWQgYW5kIGF2YWlsYWJsZSBvbmx5IGZvciBVQVJUIGluc3RhbmNlcyBzdXBwb3J0aW5nIFdha2VVcCBmcm9tIFN0b3AgTW9kZSBmZWF0dXJlLiAKKyAgKi8KKyAgaWYgKElTX1VBUlRfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFKGhpcmRhLT5JbnN0YW5jZSkpCisgIHsKKyAgICAvKiBDaGVjayBpZiB0aGUgVHJhbnNtaXR0ZXIgaXMgZW5hYmxlZCAqLworICAgIGlmKChoaXJkYS0+SW5zdGFuY2UtPkNSMSAmIFVTQVJUX0NSMV9URSkgPT0gVVNBUlRfQ1IxX1RFKQorICAgIHsKKyAgICAgIC8qIFdhaXQgdW50aWwgVEVBQ0sgZmxhZyBpcyBzZXQgKi8KKyAgICAgIGlmKElSREFfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoaXJkYSwgVVNBUlRfSVNSX1RFQUNLLCBSRVNFVCwgdGlja3N0YXJ0LCBJUkRBX1RFQUNLX1JFQUNLX1RJTUVPVVQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogVGltZW91dCBvY2N1cnJlZCAqLworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogQ2hlY2sgaWYgdGhlIFJlY2VpdmVyIGlzIGVuYWJsZWQgKi8KKyAgaWYoKGhpcmRhLT5JbnN0YW5jZS0+Q1IxICYgVVNBUlRfQ1IxX1JFKSA9PSBVU0FSVF9DUjFfUkUpCisgIHsKKyAgICAvKiBXYWl0IHVudGlsIFJFQUNLIGZsYWcgaXMgc2V0ICovCisgICAgaWYoSVJEQV9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpcmRhLCBVU0FSVF9JU1JfUkVBQ0ssIFJFU0VULCB0aWNrc3RhcnQsIElSREFfVEVBQ0tfUkVBQ0tfVElNRU9VVCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFRpbWVvdXQgT2NjdXJlZCAqLworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorCisgIC8qIEluaXRpYWxpemUgdGhlIElSREEgc3RhdGUqLworICBoaXJkYS0+Z1N0YXRlICA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworICBoaXJkYS0+UnhTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhpcmRhKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBJUkRBIENvbW11bmljYXRpb24gVGltZW91dC4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEBwYXJhbSAgRmxhZyBTcGVjaWZpZXMgdGhlIElSREEgZmxhZyB0byBjaGVjay4KKyAgKiBAcGFyYW0gIFN0YXR1cyB0aGUgbmV3IGZsYWcgc3RhdHVzIChTRVQgb3IgUkVTRVQpLiBUaGUgZnVuY3Rpb24gaXMgbG9ja2VkIGluIGEgd2hpbGUgbG9vcCBhcyBsb25nIGFzIHRoZSBmbGFnIHJlbWFpbnMgc2V0IHRvIFN0YXR1cy4KKyAgKiBAcGFyYW0gIFRpY2tzdGFydCBUaWNrIHN0YXJ0IHZhbHVlCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJUkRBX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSwgdWludDMyX3QgRmxhZywgRmxhZ1N0YXR1cyBTdGF0dXMsIHVpbnQzMl90IFRpY2tzdGFydCwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgLyogV2FpdCB1bnRpbCBmbGFnIGlzIHNldCAqLworICB3aGlsZSgoX19IQUxfSVJEQV9HRVRfRkxBRyhoaXJkYSwgRmxhZykgPyBTRVQgOiBSRVNFVCkgPT0gU3RhdHVzKQorICB7CisgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCisgICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmKChUaW1lb3V0ID09IDBVKSB8fCAoKEhBTF9HZXRUaWNrKCktVGlja3N0YXJ0KSA+IFRpbWVvdXQpKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIFRYRSwgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzIGZvciB0aGUgaW50ZXJydXB0IHByb2Nlc3MgKi8KKyAgICAgICAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRSB8IFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1RYRUlFKSk7CisgICAgICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAgICAgaGlyZGEtPmdTdGF0ZSAgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKyAgICAgICAgaGlyZGEtPlJ4U3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoaXJkYSk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gSEFMX09LOworfQorCisKKy8qKgorICAqIEBicmllZiAgRW5kIG9uZ29pbmcgVHggdHJhbnNmZXIgb24gSVJEQSBwZXJpcGhlcmFsIChmb2xsb3dpbmcgZXJyb3IgZGV0ZWN0aW9uIG9yIFRyYW5zbWl0IGNvbXBsZXRpb24pLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJUkRBX0VuZFR4VHJhbnNmZXIoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogRGlzYWJsZSBUWEVJRSBhbmQgVENJRSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9UWEVJRSB8IFVTQVJUX0NSMV9UQ0lFKSk7CisKKyAgLyogQXQgZW5kIG9mIFR4IHByb2Nlc3MsIHJlc3RvcmUgaGlyZGEtPmdTdGF0ZSB0byBSZWFkeSAqLworICBoaXJkYS0+Z1N0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBFbmQgb25nb2luZyBSeCB0cmFuc2ZlciBvbiBVQVJUIHBlcmlwaGVyYWwgKGZvbGxvd2luZyBlcnJvciBkZXRlY3Rpb24gb3IgUmVjZXB0aW9uIGNvbXBsZXRpb24pLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJUkRBX0VuZFJ4VHJhbnNmZXIoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogRGlzYWJsZSBSWE5FLCBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRSB8IFVTQVJUX0NSMV9QRUlFKSk7CisgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgLyogQXQgZW5kIG9mIFJ4IHByb2Nlc3MsIHJlc3RvcmUgaGlyZGEtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaGlyZGEtPlJ4U3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIERNQSBJUkRBIHRyYW5zbWl0IHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIFBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSVJEQV9ETUFUcmFuc21pdENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIElSREFfSGFuZGxlVHlwZURlZiogaGlyZGEgPSAoSVJEQV9IYW5kbGVUeXBlRGVmKikoaGRtYS0+UGFyZW50KTsKKworICAvKiBETUEgTm9ybWFsIG1vZGUgKi8KKyAgaWYgKCBIQUxfSVNfQklUX0NMUihoZG1hLT5JbnN0YW5jZS0+Q0NSLCBETUFfQ0NSX0NJUkMpICkKKyAgeworICAgIGhpcmRhLT5UeFhmZXJDb3VudCA9IDBVOworCisgICAgLyogRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0cmFuc21pdCByZXF1ZXN0IGJ5IHJlc2V0dGluZyB0aGUgRE1BVCBiaXQKKyAgICAgICBpbiB0aGUgSVJEQSBDUjMgcmVnaXN0ZXIgKi8KKyAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEVuYWJsZSB0aGUgSVJEQSBUcmFuc21pdCBDb21wbGV0ZSBJbnRlcnJ1cHQgKi8KKyAgICBTRVRfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVENJRSk7CisgIH0KKyAgLyogRE1BIENpcmN1bGFyIG1vZGUgKi8KKyAgZWxzZQorICB7CisgICAgSEFMX0lSREFfVHhDcGx0Q2FsbGJhY2soaGlyZGEpOworICB9CisKK30KKworLyoqCisgICogQGJyaWVmICBETUEgSVJEQSB0cmFuc21pdCBwcm9jZXNzIGhhbGYgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIFBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSVJEQV9ETUFUcmFuc21pdEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBJUkRBX0hhbmRsZVR5cGVEZWYqIGhpcmRhID0gKElSREFfSGFuZGxlVHlwZURlZiopKGhkbWEtPlBhcmVudCk7CisKKyAgSEFMX0lSREFfVHhIYWxmQ3BsdENhbGxiYWNrKGhpcmRhKTsKK30KKworLyoqCisgICogQGJyaWVmICBETUEgSVJEQSByZWNlaXZlIHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIFBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIElSREFfRE1BUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIElSREFfSGFuZGxlVHlwZURlZiogaGlyZGEgPSAoSVJEQV9IYW5kbGVUeXBlRGVmKikoaGRtYS0+UGFyZW50KTsKKworICAvKiBETUEgTm9ybWFsIG1vZGUgKi8KKyAgaWYgKCBIQUxfSVNfQklUX0NMUihoZG1hLT5JbnN0YW5jZS0+Q0NSLCBETUFfQ0NSX0NJUkMpICkKKyAgeworICAgIGhpcmRhLT5SeFhmZXJDb3VudCA9IDBVOworCisgICAgLyogRGlzYWJsZSBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKyAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgLyogRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0aGUgcmVjZWl2ZXIgcmVxdWVzdCBieSByZXNldHRpbmcgdGhlIERNQVIgYml0CisgICAgICAgaW4gdGhlIElSREEgQ1IzIHJlZ2lzdGVyICovCisgICAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBBdCBlbmQgb2YgUnggcHJvY2VzcywgcmVzdG9yZSBoaXJkYS0+UnhTdGF0ZSB0byBSZWFkeSAqLworICAgIGhpcmRhLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisgIH0KKworICBIQUxfSVJEQV9SeENwbHRDYWxsYmFjayhoaXJkYSk7Cit9CisKKy8qKgorICAqIEBicmllZiBETUEgSVJEQSByZWNlaXZlIHByb2Nlc3MgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gaGRtYSBQb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIElSREFfRE1BUmVjZWl2ZUhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBJUkRBX0hhbmRsZVR5cGVEZWYqIGhpcmRhID0gKElSREFfSGFuZGxlVHlwZURlZiopKGhkbWEtPlBhcmVudCk7CisKKyAgSEFMX0lSREFfUnhIYWxmQ3BsdENhbGxiYWNrKGhpcmRhKTsKK30KKworLyoqCisgICogQGJyaWVmICBETUEgSVJEQSBjb21tdW5pY2F0aW9uIGVycm9yIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBQb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIElSREFfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIElSREFfSGFuZGxlVHlwZURlZiogaGlyZGEgPSAoSVJEQV9IYW5kbGVUeXBlRGVmKikoaGRtYS0+UGFyZW50KTsKKworICAvKiBTdG9wIElSREEgRE1BIFR4IHJlcXVlc3QgaWYgb25nb2luZyAqLworICBpZiAoICAoaGlyZGEtPmdTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9CVVNZX1RYKQorICAgICAgJiYoSEFMX0lTX0JJVF9TRVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkgKQorICB7CisgICAgaGlyZGEtPlR4WGZlckNvdW50ID0gMFU7CisgICAgSVJEQV9FbmRUeFRyYW5zZmVyKGhpcmRhKTsKKyAgfQorCisgIC8qIFN0b3AgSVJEQSBETUEgUnggcmVxdWVzdCBpZiBvbmdvaW5nICovCisgIGlmICggIChoaXJkYS0+UnhTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9CVVNZX1JYKQorICAgICAgJiYoSEFMX0lTX0JJVF9TRVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkgKQorICB7CisgICAgaGlyZGEtPlJ4WGZlckNvdW50ID0gMFU7CisgICAgSVJEQV9FbmRSeFRyYW5zZmVyKGhpcmRhKTsKKyAgfQorCisgIGhpcmRhLT5FcnJvckNvZGUgfD0gSEFMX0lSREFfRVJST1JfRE1BOworICBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKGhpcmRhKTsKK30KKworLyoqCisgICogQGJyaWVmICBETUEgSVJEQSBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSBIQUwgc2VydmljZXMgb24gRXJyb3IKKyAgKiAgICAgICAgIChUbyBiZSBjYWxsZWQgYXQgZW5kIG9mIERNQSBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIGVycm9yIG9jY3VycmVuY2UpLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSVJEQV9ETUFBYm9ydE9uRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIElSREFfSGFuZGxlVHlwZURlZiogaGlyZGEgPSAoSVJEQV9IYW5kbGVUeXBlRGVmKikoaGRtYS0+UGFyZW50KTsKKyAgaGlyZGEtPlJ4WGZlckNvdW50ID0gMFU7CisgIGhpcmRhLT5UeFhmZXJDb3VudCA9IDBVOworCisgIEhBTF9JUkRBX0Vycm9yQ2FsbGJhY2soaGlyZGEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBJUkRBIFR4IGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IHVzZXIKKyAgKiAgICAgICAgIChUbyBiZSBjYWxsZWQgYXQgZW5kIG9mIERNQSBUeCBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIHVzZXIgYWJvcnQgcmVxdWVzdCkuCisgICogQG5vdGUgICBXaGVuIHRoaXMgY2FsbGJhY2sgaXMgZXhlY3V0ZWQsIFVzZXIgQWJvcnQgY29tcGxldGUgY2FsbCBiYWNrIGlzIGNhbGxlZCBvbmx5IGlmIG5vCisgICogICAgICAgICBBYm9ydCBzdGlsbCBvbmdvaW5nIGZvciBSeCBETUEgSGFuZGxlLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSVJEQV9ETUFUeEFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIElSREFfSGFuZGxlVHlwZURlZiogaGlyZGEgPSAoSVJEQV9IYW5kbGVUeXBlRGVmKiApKGhkbWEtPlBhcmVudCk7CisgIAorICBoaXJkYS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgLyogQ2hlY2sgaWYgYW4gQWJvcnQgcHJvY2VzcyBpcyBzdGlsbCBvbmdvaW5nICovCisgIGlmKGhpcmRhLT5oZG1hcnggIT0gTlVMTCkKKyAgeworICAgIGlmKGhpcmRhLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrICE9IE5VTEwpCisgICAgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICAKKyAgLyogTm8gQWJvcnQgcHJvY2VzcyBzdGlsbCBvbmdvaW5nIDogQWxsIERNQSBjaGFubmVscyBhcmUgYWJvcnRlZCwgY2FsbCB1c2VyIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrICovCisgIGhpcmRhLT5UeFhmZXJDb3VudCA9IDBVOworICBoaXJkYS0+UnhYZmVyQ291bnQgPSAwVTsKKworICAvKiBSZXNldCBlcnJvckNvZGUgKi8KKyAgaGlyZGEtPkVycm9yQ29kZSA9IEhBTF9JUkRBX0VSUk9SX05PTkU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfSVJEQV9DTEVBUl9GTEFHKGhpcmRhLCBJUkRBX0NMRUFSX09SRUYgfCBJUkRBX0NMRUFSX05FRiB8IElSREFfQ0xFQVJfUEVGIHwgSVJEQV9DTEVBUl9GRUYpOworCisgIC8qIFJlc3RvcmUgaGlyZGEtPmdTdGF0ZSBhbmQgaGlyZGEtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaGlyZGEtPmdTdGF0ZSAgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKyAgaGlyZGEtPlJ4U3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKworICAvKiBDYWxsIHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgSEFMX0lSREFfQWJvcnRDcGx0Q2FsbGJhY2soaGlyZGEpOworfQorCisKKy8qKgorICAqIEBicmllZiAgRE1BIElSREEgUnggY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgdXNlcgorICAqICAgICAgICAgKFRvIGJlIGNhbGxlZCBhdCBlbmQgb2YgRE1BIFJ4IEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgdXNlciBhYm9ydCByZXF1ZXN0KS4KKyAgKiBAbm90ZSAgIFdoZW4gdGhpcyBjYWxsYmFjayBpcyBleGVjdXRlZCwgVXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsIGJhY2sgaXMgY2FsbGVkIG9ubHkgaWYgbm8KKyAgKiAgICAgICAgIEFib3J0IHN0aWxsIG9uZ29pbmcgZm9yIFR4IERNQSBIYW5kbGUuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJUkRBX0RNQVJ4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgSVJEQV9IYW5kbGVUeXBlRGVmKiBoaXJkYSA9IChJUkRBX0hhbmRsZVR5cGVEZWYqICkoaGRtYS0+UGFyZW50KTsKKyAgCisgIGhpcmRhLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAvKiBDaGVjayBpZiBhbiBBYm9ydCBwcm9jZXNzIGlzIHN0aWxsIG9uZ29pbmcgKi8KKyAgaWYoaGlyZGEtPmhkbWF0eCAhPSBOVUxMKQorICB7CisgICAgaWYoaGlyZGEtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIAorICAvKiBObyBBYm9ydCBwcm9jZXNzIHN0aWxsIG9uZ29pbmcgOiBBbGwgRE1BIGNoYW5uZWxzIGFyZSBhYm9ydGVkLCBjYWxsIHVzZXIgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaGlyZGEtPlR4WGZlckNvdW50ID0gMFU7CisgIGhpcmRhLT5SeFhmZXJDb3VudCA9IDBVOworCisgIC8qIFJlc2V0IGVycm9yQ29kZSAqLworICBoaXJkYS0+RXJyb3JDb2RlID0gSEFMX0lSREFfRVJST1JfTk9ORTsKKworICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICBfX0hBTF9JUkRBX0NMRUFSX0ZMQUcoaGlyZGEsIElSREFfQ0xFQVJfT1JFRiB8IElSREFfQ0xFQVJfTkVGIHwgSVJEQV9DTEVBUl9QRUYgfCBJUkRBX0NMRUFSX0ZFRik7CisKKyAgLyogUmVzdG9yZSBoaXJkYS0+Z1N0YXRlIGFuZCBoaXJkYS0+UnhTdGF0ZSB0byBSZWFkeSAqLworICBoaXJkYS0+Z1N0YXRlICA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworICBoaXJkYS0+UnhTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworCisgIC8qIENhbGwgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBIQUxfSVJEQV9BYm9ydENwbHRDYWxsYmFjayhoaXJkYSk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBETUEgSVJEQSBUeCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSB1c2VyIGJ5IGEgY2FsbCB0bworICAqICAgICAgICAgSEFMX0lSREFfQWJvcnRUcmFuc21pdF9JVCBBUEkgKEFib3J0IG9ubHkgVHggdHJhbnNmZXIpCisgICogICAgICAgICAoVGhpcyBjYWxsYmFjayBpcyBleGVjdXRlZCBhdCBlbmQgb2YgRE1BIFR4IEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgdXNlciBhYm9ydCByZXF1ZXN0LAorICAqICAgICAgICAgYW5kIGxlYWRzIHRvIHVzZXIgVHggQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgZXhlY3V0aW9uKS4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIElSREFfRE1BVHhPbmx5QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgSVJEQV9IYW5kbGVUeXBlRGVmKiBoaXJkYSA9IChJUkRBX0hhbmRsZVR5cGVEZWYqKShoZG1hLT5QYXJlbnQpOworCisgIGhpcmRhLT5UeFhmZXJDb3VudCA9IDBVOworCisgIC8qIFJlc3RvcmUgaGlyZGEtPmdTdGF0ZSB0byBSZWFkeSAqLworICBoaXJkYS0+Z1N0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisKKyAgLyogQ2FsbCB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisgIEhBTF9JUkRBX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soaGlyZGEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBJUkRBIFJ4IGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IHVzZXIgYnkgYSBjYWxsIHRvCisgICogICAgICAgICBIQUxfSVJEQV9BYm9ydFJlY2VpdmVfSVQgQVBJIChBYm9ydCBvbmx5IFJ4IHRyYW5zZmVyKQorICAqICAgICAgICAgKFRoaXMgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgYXQgZW5kIG9mIERNQSBSeCBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIHVzZXIgYWJvcnQgcmVxdWVzdCwKKyAgKiAgICAgICAgIGFuZCBsZWFkcyB0byB1c2VyIFJ4IEFib3J0IENvbXBsZXRlIGNhbGxiYWNrIGV4ZWN1dGlvbikuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJUkRBX0RNQVJ4T25seUFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIElSREFfSGFuZGxlVHlwZURlZiogaGlyZGEgPSAoIElSREFfSGFuZGxlVHlwZURlZiogKSgoRE1BX0hhbmRsZVR5cGVEZWYqICloZG1hKS0+UGFyZW50OworCisgIGhpcmRhLT5SeFhmZXJDb3VudCA9IDBVOworCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgIF9fSEFMX0lSREFfQ0xFQVJfRkxBRyhoaXJkYSwgSVJEQV9DTEVBUl9PUkVGIHwgSVJEQV9DTEVBUl9ORUYgfCBJUkRBX0NMRUFSX1BFRiB8IElSREFfQ0xFQVJfRkVGKTsKKworICAvKiBSZXN0b3JlIGhpcmRhLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIGhpcmRhLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisKKyAgLyogQ2FsbCB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisgIEhBTF9JUkRBX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhoaXJkYSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAbm90ZSAgIEZ1bmN0aW9uIGlzIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZQorICAqICAgICAgICAgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfSVJEQV9UcmFuc21pdF9JVCgpLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSVJEQV9UcmFuc21pdF9JVChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICB1aW50MTZfdCogdG1wOworCisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG9uZ29pbmcgKi8KKyAgaWYoaGlyZGEtPmdTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9CVVNZX1RYKQorICB7CisgICAgaWYoaGlyZGEtPlR4WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIElSREEgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBFbXB0eSBJbnRlcnJ1cHQgKi8KKyAgICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RYRUlFKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBJUkRBIFRyYW5zbWl0IENvbXBsZXRlIEludGVycnVwdCAqLworICAgICAgU0VUX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RDSUUpOworCisgICAgICByZXR1cm4gSEFMX09LOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKChoaXJkYS0+SW5pdC5Xb3JkTGVuZ3RoID09IElSREFfV09SRExFTkdUSF85QikgJiYgKGhpcmRhLT5Jbml0LlBhcml0eSA9PSBJUkRBX1BBUklUWV9OT05FKSkKKyAgICAgIHsKKyAgICAgICAgdG1wID0gKHVpbnQxNl90KikgaGlyZGEtPnBUeEJ1ZmZQdHI7CisgICAgICAgIGhpcmRhLT5JbnN0YW5jZS0+VERSID0gKCp0bXAgJiAodWludDE2X3QpMHgwMUZGVSk7CisgICAgICAgIGhpcmRhLT5wVHhCdWZmUHRyICs9IDJVOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBoaXJkYS0+SW5zdGFuY2UtPlREUiA9ICh1aW50OF90KSgqaGlyZGEtPnBUeEJ1ZmZQdHIrKyAmICh1aW50OF90KTB4RkZVKTsKKyAgICAgIH0KKyAgICAgIGhpcmRhLT5UeFhmZXJDb3VudC0tOworCisgICAgICByZXR1cm4gSEFMX09LOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBXcmFwIHVwIHRyYW5zbWlzc2lvbiBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIElSREFfRW5kVHJhbnNtaXRfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogRGlzYWJsZSB0aGUgSVJEQSBUcmFuc21pdCBDb21wbGV0ZSBJbnRlcnJ1cHQgKi8KKyAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVENJRSk7CisKKyAgLyogVHggcHJvY2VzcyBpcyBlbmRlZCwgcmVzdG9yZSBoaXJkYS0+Z1N0YXRlIHRvIFJlYWR5ICovCisgIGhpcmRhLT5nU3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKworICBIQUxfSVJEQV9UeENwbHRDYWxsYmFjayhoaXJkYSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGludGVycnVwdCBtb2RlLgorICAqIEBub3RlICAgRnVuY3Rpb24gaXMgY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9JUkRBX1JlY2VpdmVfSVQoKQorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSVJEQV9SZWNlaXZlX0lUKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIHVpbnQxNl90KiB0bXA7CisgIHVpbnQxNl90ICB1aE1hc2sgPSBoaXJkYS0+TWFzazsKKyAgdWludDE2X3QgIHVoZGF0YTsKKworICAvKiBDaGVjayB0aGF0IGEgUnggcHJvY2VzcyBpcyBvbmdvaW5nICovCisgIGlmIChoaXJkYS0+UnhTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9CVVNZX1JYKQorICB7CisgICAgdWhkYXRhID0gKHVpbnQxNl90KSBSRUFEX1JFRyhoaXJkYS0+SW5zdGFuY2UtPlJEUik7CisgICAgaWYgKChoaXJkYS0+SW5pdC5Xb3JkTGVuZ3RoID09IElSREFfV09SRExFTkdUSF85QikgJiYgKGhpcmRhLT5Jbml0LlBhcml0eSA9PSBJUkRBX1BBUklUWV9OT05FKSkKKyAgICB7CisgICAgICB0bXAgPSAodWludDE2X3QqKSBoaXJkYS0+cFJ4QnVmZlB0ciA7CisgICAgICAqdG1wID0gKHVpbnQxNl90KSh1aGRhdGEgJiB1aE1hc2spOworICAgICAgaGlyZGEtPnBSeEJ1ZmZQdHIgKz0yVTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICpoaXJkYS0+cFJ4QnVmZlB0cisrID0gKHVpbnQ4X3QpKHVoZGF0YSAmICh1aW50OF90KXVoTWFzayk7CisgICAgfQorCisgICAgaWYoLS1oaXJkYS0+UnhYZmVyQ291bnQgPT0gMFUpCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgSVJEQSBQYXJpdHkgRXJyb3IgSW50ZXJydXB0IGFuZCBSWE5FIGludGVycnVwdCAqLworICAgICAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRSB8IFVTQVJUX0NSMV9QRUlFKSk7CisKKyAgICAgIC8qIERpc2FibGUgdGhlIElSREEgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSAqLworICAgICAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgICAgLyogUnggcHJvY2VzcyBpcyBjb21wbGV0ZWQsIHJlc3RvcmUgaGlyZGEtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgICAgIGhpcmRhLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisKKyAgICAgIEhBTF9JUkRBX1J4Q3BsdENhbGxiYWNrKGhpcmRhKTsKKworICAgICAgcmV0dXJuIEhBTF9PSzsKKyAgICB9CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIENsZWFyIFJYTkUgaW50ZXJydXB0IGZsYWcgKi8KKyAgICBfX0hBTF9JUkRBX1NFTkRfUkVRKGhpcmRhLCBJUkRBX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsKKworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX0lSREFfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmM3h4X2hhbF9pd2RnLmMgYi9TcmMvc3RtMzJmM3h4X2hhbF9pd2RnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc5ZjRkOQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfaGFsX2l3ZGcuYwpAQCAtMCwwICsxLDI4MCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfaXdkZy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBJV0RHIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcgCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBJbmRlcGVuZGVudCBXYXRjaGRvZyAoSVdERykgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgU3RhcnQgZnVuY3Rpb25zCisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgIyMjIyMgSVdERyBHZW5lcmljIGZlYXR1cmVzICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgKCspIFRoZSBJV0RHIGNhbiBiZSBzdGFydGVkIGJ5IGVpdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSAoY29uZmlndXJhYmxlCisgICAgICAgIHRocm91Z2ggb3B0aW9uIGJ5dGUpLgorCisgICAgKCspIFRoZSBJV0RHIGlzIGNsb2NrZWQgYnkgTG93LVNwZWVkIGNsb2NrIChMU0kpIGFuZCB0aHVzIHN0YXlzIGFjdGl2ZSBldmVuCisgICAgICAgIGlmIHRoZSBtYWluIGNsb2NrIGZhaWxzLgorCisgICAgKCspIE9uY2UgdGhlIElXREcgaXMgc3RhcnRlZCwgdGhlIExTSSBpcyBmb3JjZWQgT04gYW5kIGJvdGggY2FuIG5vdCBiZSAKKyAgICAgICAgZGlzYWJsZWQuIFRoZSBjb3VudGVyIHN0YXJ0cyBjb3VudGluZyBkb3duIGZyb20gdGhlIHJlc2V0IHZhbHVlICgweEZGRlUpLgorICAgICAgICBXaGVuIGl0IHJlYWNoZXMgdGhlIGVuZCBvZiBjb3VudCB2YWx1ZSAoMHgwMDBVKSBhIHJlc2V0IHNpZ25hbCBpcyAKKyAgICAgICAgZ2VuZXJhdGVkIChJV0RHIHJlc2V0KS4KKworICAgICgrKSBXaGVuZXZlciB0aGUga2V5IHZhbHVlIDB4MDAwMCBBQUFBIGlzIHdyaXR0ZW4gaW4gdGhlIElXREdfS1IgcmVnaXN0ZXIsIAorICAgICAgICB0aGUgSVdER19STFIgdmFsdWUgaXMgcmVsb2FkZWQgaW4gdGhlIGNvdW50ZXIgYW5kIHRoZSB3YXRjaGRvZyByZXNldCBpcworICAgICAgICBwcmV2ZW50ZWQuCisKKyAgICAoKykgVGhlIElXREcgaXMgaW1wbGVtZW50ZWQgaW4gdGhlIFZERCB2b2x0YWdlIGRvbWFpbiB0aGF0IGlzIHN0aWxsIGZ1bmN0aW9uYWwKKyAgICAgICAgaW4gU1RPUCBhbmQgU1RBTkRCWSBtb2RlIChJV0RHIHJlc2V0IGNhbiB3YWtlLXVwIGZyb20gU1RBTkRCWSkuCisgICAgICAgIElXREdSU1QgZmxhZyBpbiBSQ0NfQ1NSIHJlZ2lzdGVyIGNhbiBiZSB1c2VkIHRvIGluZm9ybSB3aGVuIGFuIElXREcKKyAgICAgICAgcmVzZXQgb2NjdXJzLgorCisgICAgKCspIERlYnVnIG1vZGUgOiBXaGVuIHRoZSBtaWNyb2NvbnRyb2xsZXIgZW50ZXJzIGRlYnVnIG1vZGUgKGNvcmUgaGFsdGVkKSwKKyAgICAgICAgdGhlIElXREcgY291bnRlciBlaXRoZXIgY29udGludWVzIHRvIHdvcmsgbm9ybWFsbHkgb3Igc3RvcHMsIGRlcGVuZGluZyAKKyAgICAgICAgb24gREJHX0lXREdfU1RPUCBjb25maWd1cmF0aW9uIGJpdCBpbiBEQkcgbW9kdWxlLCBhY2Nlc3NpYmxlIHRocm91Z2gKKyAgICAgICAgX19IQUxfREJHTUNVX0ZSRUVaRV9JV0RHKCkgYW5kIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9JV0RHKCkgbWFjcm9zCisKKyAgICBbLi5dIE1pbi1tYXggdGltZW91dCB2YWx1ZSBANDFLSHogKExTSSk6IH4wLjFtcyAvIH4yNS41cworICAgICAgICAgVGhlIElXREcgdGltZW91dCBtYXkgdmFyeSBkdWUgdG8gTFNJIGZyZXF1ZW5jeSBkaXNwZXJzaW9uLiBTVE0zMkYzeHgKKyAgICAgICAgIGRldmljZXMgcHJvdmlkZSB0aGUgY2FwYWJpbGl0eSB0byBtZWFzdXJlIHRoZSBMU0kgZnJlcXVlbmN5IChMU0kgY2xvY2sKKyAgICAgICAgIGNvbm5lY3RlZCBpbnRlcm5hbGx5IHRvIFRJTTE2IENIMSBpbnB1dCBjYXB0dXJlKS4gVGhlIG1lYXN1cmVkIHZhbHVlCisgICAgICAgICBjYW4gYmUgdXNlZCB0byBoYXZlIGFuIElXREcgdGltZW91dCB3aXRoIGFuIGFjY2VwdGFibGUgYWNjdXJhY3kuCisKKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICAoIykgVXNlIElXREcgdXNpbmcgSEFMX0lXREdfSW5pdCgpIGZ1bmN0aW9uIHRvIDoKKyAgICAgICgrKykgRW5hYmxlIGluc3RhbmNlIGJ5IHdyaXRpbmcgU3RhcnQga2V5d29yZCBpbiBJV0RHX0tFWSByZWdpc3Rlci4gTFNJIAorICAgICAgICAgICBjbG9jayBpcyBmb3JjZWQgT04gYW5kIElXREcgY291bnRlciBzdGFydHMgZG93bmNvdW50aW5nLgorICAgICAgKCsrKSBFbmFibGUgd3JpdGUgYWNjZXNzIHRvIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXI6IElXREdfUFIsIElXREdfUkxSICYgCisgICAgICAgICAgIElXREdfV0lOUi4KKyAgICAgICgrKykgQ29uZmlndXJlIHRoZSBJV0RHIHByZXNjYWxlciBhbmQgY291bnRlciByZWxvYWQgdmFsdWUuIFRoaXMgcmVsb2FkIAorICAgICAgICAgICB2YWx1ZSB3aWxsIGJlIGxvYWRlZCBpbiB0aGUgSVdERyBjb3VudGVyIGVhY2ggdGltZSB0aGUgd2F0Y2hkb2cgaXMgCisgICAgICAgICAgIHJlbG9hZGVkLCB0aGVuIHRoZSBJV0RHIHdpbGwgc3RhcnQgY291bnRpbmcgZG93biBmcm9tIHRoaXMgdmFsdWUuCisgICAgICAoKyspIHdhaXQgZm9yIHN0YXR1cyBmbGFncyB0byBiZSByZXNldCIKKyAgICAgICgrKykgRGVwZW5kaW5nIG9uIHdpbmRvdyBwYXJhbWV0ZXI6CisgICAgICAgICgrKyspIElmIFdpbmRvdyBJbml0IHBhcmFtZXRlciBpcyBzYW1lIGFzIFdpbmRvdyByZWdpc3RlciB2YWx1ZSwgCisgICAgICAgICAgICAgbm90aGluZyBtb3JlIGlzIGRvbmUgYnV0IHJlbG9hZCBjb3VudGVyIHZhbHVlIGluIG9yZGVyIHRvIGV4aXQgCisgICAgICAgICAgICAgZnVuY3Rpb24gd2l0aHkgZXhhY3QgdGltZSBiYXNlLgorICAgICAgICAoKysrKSBFbHNlIG1vZGlmeSBXaW5kb3cgcmVnaXN0ZXIuIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IHJlbG9hZAorICAgICAgICAgICAgIHdhdGNoZG9nIGNvdW50ZXIuCisKKyAgICAoIykgVGhlbiB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbSBtdXN0IHJlZnJlc2ggdGhlIElXREcgY291bnRlciBhdCByZWd1bGFyCisgICAgICAgIGludGVydmFscyBkdXJpbmcgbm9ybWFsIG9wZXJhdGlvbiB0byBwcmV2ZW50IGFuIE1DVSByZXNldCwgdXNpbmcKKyAgICAgICAgSEFMX0lXREdfUmVmcmVzaCgpIGZ1bmN0aW9uLgorCisgICAgICoqKiBJV0RHIEhBTCBkcml2ZXIgbWFjcm9zIGxpc3QgKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisgICAgICAgQmVsb3cgdGhlIGxpc3Qgb2YgbW9zdCB1c2VkIG1hY3JvcyBpbiBJV0RHIEhBTCBkcml2ZXI6CisgICAgICAoKykgX19IQUxfSVdER19TVEFSVDogRW5hYmxlIHRoZSBJV0RHIHBlcmlwaGVyYWwKKyAgICAgICgrKSBfX0hBTF9JV0RHX1JFTE9BRF9DT1VOVEVSOiBSZWxvYWRzIElXREcgY291bnRlciB3aXRoIHZhbHVlIGRlZmluZWQgaW4KKyAgICAgICAgICB0aGUgcmVsb2FkIHJlZ2lzdGVyCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9JV0RHX01PRFVMRV9FTkFCTEVECisvKiogQGFkZHRvZ3JvdXAgSVdERworICAqIEBicmllZiBJV0RHIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJV0RHX1ByaXZhdGVfRGVmaW5lcyBJV0RHIFByaXZhdGUgRGVmaW5lcworICAqIEB7CisgICovCisvKiBTdGF0dXMgcmVnaXN0ZXIgbmVlZCA1IFJDIExTSSBkaXZpZGVkIGJ5IHByZXNjYWxlciBjbG9jayB0byBiZSB1cGRhdGVkLiBXaXRoIAorICAgaGlnaGVyIHByZXNjYWxlciAoMjU2VSksIGFuZCBhY2NvcmRpbmcgdG8gSFNJIHZhcmlhdGlvbiwgd2UgbmVlZCB0byB3YWl0IGF0IAorICAgbGVhc3QgNiBjeWNsZXMgc28gNDggbXMuICovCisjZGVmaW5lIEhBTF9JV0RHX0RFRkFVTFRfVElNRU9VVCAgICAgICAgICAgIDQ4dQorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBhZGR0b2dyb3VwIElXREdfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIElXREdfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgU3RhcnQgZnVuY3Rpb25zLgorICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgU3RhcnQgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgSW5pdGlhbGl6ZSB0aGUgSVdERyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIHRoZSAKKyAgICAgICAgICBJV0RHX0luaXRUeXBlRGVmIG9mIGFzc29jaWF0ZWQgaGFuZGxlLgorICAgICAgKCspIE1hbmFnZSBXaW5kb3cgb3B0aW9uLgorICAgICAgKCspIE9uY2UgaW5pdGlhbGl6YXRpb24gaXMgcGVyZm9ybWVkIGluIEhBTF9JV0RHX0luaXQgZnVuY3Rpb24sIFdhdGNoZG9nIAorICAgICAgICAgIGlzIHJlbG9hZGVkIGluIG9yZGVyIHRvIGV4aXQgZnVuY3Rpb24gd2l0aCBjb3JyZWN0IHRpbWUgYmFzZS4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBJV0RHIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gdGhlIAorICAqICAgICAgICAgSVdER19Jbml0VHlwZURlZiBhbmQgc3RhcnQgd2F0Y2hkb2cuIEJlZm9yZSBleGl0aW5nIGZ1bmN0aW9uLCAKKyAgKiAgICAgICAgIHdhdGNoZG9nIGlzIHJlZnJlc2hlZCBpbiBvcmRlciB0byBoYXZlIGNvcnJlY3QgdGltZSBiYXNlLgorICAqIEBwYXJhbSAgaGl3ZGcgIHBvaW50ZXIgdG8gYSBJV0RHX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJV0RHIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JV0RHX0luaXQoSVdER19IYW5kbGVUeXBlRGVmICpoaXdkZykKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIENoZWNrIHRoZSBJV0RHIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmKGhpd2RnID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0lXREdfQUxMX0lOU1RBTkNFKGhpd2RnLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfSVdER19QUkVTQ0FMRVIoaGl3ZGctPkluaXQuUHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19JV0RHX1JFTE9BRChoaXdkZy0+SW5pdC5SZWxvYWQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0lXREdfV0lORE9XKGhpd2RnLT5Jbml0LldpbmRvdykpOworCisgIC8qIEVuYWJsZSBJV0RHLiBMU0kgaXMgdHVybmVkIG9uIGF1dG9tYXRpY2FseSAqLworICBfX0hBTF9JV0RHX1NUQVJUKGhpd2RnKTsKKworICAvKiBFbmFibGUgd3JpdGUgYWNjZXNzIHRvIElXREdfUFIsIElXREdfUkxSIGFuZCBJV0RHX1dJTlIgcmVnaXN0ZXJzIGJ5IHdyaXRpbmcKKyAgMHg1NTU1IGluIEtSICovCisgIElXREdfRU5BQkxFX1dSSVRFX0FDQ0VTUyhoaXdkZyk7CisKKyAgLyogV3JpdGUgdG8gSVdERyByZWdpc3RlcnMgdGhlIFByZXNjYWxlciAmIFJlbG9hZCB2YWx1ZXMgdG8gd29yayB3aXRoICovCisgIGhpd2RnLT5JbnN0YW5jZS0+UFIgPSBoaXdkZy0+SW5pdC5QcmVzY2FsZXI7CisgIGhpd2RnLT5JbnN0YW5jZS0+UkxSID0gaGl3ZGctPkluaXQuUmVsb2FkOworCisgIC8qIENoZWNrIHBlbmRpbmcgZmxhZywgaWYgcHJldmlvdXMgdXBkYXRlIG5vdCBkb25lLCByZXR1cm4gdGltZW91dCAqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAvKiBXYWl0IGZvciByZWdpc3RlciB0byBiZSB1cGRhdGVkICovCisgIHdoaWxlKGhpd2RnLT5JbnN0YW5jZS0+U1IgIT0gUkVTRVQpCisgIHsKKyAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gSEFMX0lXREdfREVGQVVMVF9USU1FT1VUKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKworICAvKiBJZiB3aW5kb3cgcGFyYW1ldGVyIGlzIGRpZmZlcmVudCB0aGFuIGN1cnJlbnQgdmFsdWUsIG1vZGlmeSB3aW5kb3cgCisgIHJlZ2lzdGVyICovCisgIGlmKGhpd2RnLT5JbnN0YW5jZS0+V0lOUiAhPSBoaXdkZy0+SW5pdC5XaW5kb3cpCisgIHsKKyAgICAvKiBXcml0ZSB0byBJV0RHIFdJTlIgdGhlIElXREdfV2luZG93IHZhbHVlIHRvIGNvbXBhcmUgd2l0aC4gSW4gYW55IGNhc2UsCisgICAgZXZlbiBpZiB3aW5kb3cgZmVhdHVyZSBpcyBkaXNhYmxlZCwgV2F0Y2hkb2cgd2lsbCBiZSByZWxvYWRlZCBieSB3cml0aW5nIAorICAgIHdpbmRvd3MgcmVnaXN0ZXIgKi8KKyAgICBoaXdkZy0+SW5zdGFuY2UtPldJTlIgPSBoaXdkZy0+SW5pdC5XaW5kb3c7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUmVsb2FkIElXREcgY291bnRlciB3aXRoIHZhbHVlIGRlZmluZWQgaW4gdGhlIHJlbG9hZCByZWdpc3RlciAqLworICAgIF9fSEFMX0lXREdfUkVMT0FEX0NPVU5URVIoaGl3ZGcpOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAYWRkdG9ncm91cCBJV0RHX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAqICBAYnJpZWYgICBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBSZWZyZXNoIHRoZSBJV0RHLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisKKy8qKgorICAqIEBicmllZiAgUmVmcmVzaCB0aGUgSVdERy4KKyAgKiBAcGFyYW0gIGhpd2RnICBwb2ludGVyIHRvIGEgSVdER19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVdERyBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVdER19SZWZyZXNoKElXREdfSGFuZGxlVHlwZURlZiAqaGl3ZGcpCit7CisgIC8qIFJlbG9hZCBJV0RHIGNvdW50ZXIgd2l0aCB2YWx1ZSBkZWZpbmVkIGluIHRoZSByZWxvYWQgcmVnaXN0ZXIgKi8KKyAgX19IQUxfSVdER19SRUxPQURfQ09VTlRFUihoaXdkZyk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX0lXREdfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmM3h4X2hhbF9tc3BfdGVtcGxhdGUuYyBiL1NyYy9zdG0zMmYzeHhfaGFsX21zcF90ZW1wbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NzJiODMKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJmM3h4X2hhbF9tc3BfdGVtcGxhdGUuYwpAQCAtMCwwICsxLDExNyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfbXNwX3RlbXBsYXRlLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhBTCBNU1AgbW9kdWxlLgorICAqICAgICAgICAgIFRoaXMgZmlsZSB0ZW1wbGF0ZSBpcyBsb2NhdGVkIGluIHRoZSBIQUwgZm9sZGVyIGFuZCBzaG91bGQgYmUgY29waWVkIAorICAqICAgICAgICAgIHRvIHRoZSB1c2VyIGZvbGRlci4KKyAgKiAgICAgICAgIAorICBAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovIAorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfTVNQIEhBTCBNU1AgbW9kdWxlCisgICogQGJyaWVmIEhBTCBNU1AgbW9kdWxlLgorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX01TUF9FeHBvcnRlZF9GdW5jdGlvbnMgSEFMIE1TUCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBHbG9iYWwgTVNQLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfTXNwSW5pdCh2b2lkKQoreworICAgCit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplcyB0aGUgR2xvYmFsIE1TUC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX01zcERlSW5pdCh2b2lkKQoreworICAKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgUFBQIE1TUC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BQUF9Nc3BJbml0KHZvaWQpCit7CisgICAKK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIHRoZSBQUFAgTVNQLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFBQX01zcERlSW5pdCh2b2lkKQoreworICAKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmYzeHhfaGFsX25hbmQuYyBiL1NyYy9zdG0zMmYzeHhfaGFsX25hbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2ZiNTE0Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZjN4eF9oYWxfbmFuZC5jCkBAIC0wLDAgKzEsMTgwNyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfbmFuZC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBOQU5EIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBhIGdlbmVyaWMgZmlybXdhcmUgdG8gZHJpdmUgTkFORCBtZW1vcmllcyBtb3VudGVkIAorICAqICAgICAgICAgIGFzIGV4dGVybmFsIGRldmljZS4KKyAgKiAgICAgICAgIAorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gICAgCisgICAgWy4uXQorICAgICAgVGhpcyBkcml2ZXIgaXMgYSBnZW5lcmljIGxheWVyZWQgZHJpdmVyIHdoaWNoIGNvbnRhaW5zIGEgc2V0IG9mIEFQSXMgdXNlZCB0byAKKyAgICAgIGNvbnRyb2wgTkFORCBmbGFzaCBtZW1vcmllcy4gSXQgdXNlcyB0aGUgRk1DIGxheWVyIGZ1bmN0aW9ucyB0byBpbnRlcmZhY2UgCisgICAgICB3aXRoIE5BTkQgZGV2aWNlcy4gVGhpcyBkcml2ZXIgaXMgdXNlZCBhcyBmb2xsb3dzOgorICAgIAorICAgICAgKCspIE5BTkQgZmxhc2ggbWVtb3J5IGNvbmZpZ3VyYXRpb24gc2VxdWVuY2UgdXNpbmcgdGhlIGZ1bmN0aW9uIEhBTF9OQU5EX0luaXQoKSAKKyAgICAgICAgICB3aXRoIGNvbnRyb2wgYW5kIHRpbWluZyBwYXJhbWV0ZXJzIGZvciBib3RoIGNvbW1vbiBhbmQgYXR0cmlidXRlIHNwYWNlcy4KKyAgICAgICAgICAgIAorICAgICAgKCspIFJlYWQgTkFORCBmbGFzaCBtZW1vcnkgbWFrZXIgYW5kIGRldmljZSBJRHMgdXNpbmcgdGhlIGZ1bmN0aW9uCisgICAgICAgICAgSEFMX05BTkRfUmVhZF9JRCgpLiBUaGUgcmVhZCBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gdGhlIE5BTkRfSURfVHlwZURlZiAKKyAgICAgICAgICBzdHJ1Y3R1cmUgZGVjbGFyZWQgYnkgdGhlIGZ1bmN0aW9uIGNhbGxlci4gCisgICAgICAgIAorICAgICAgKCspIEFjY2VzcyBOQU5EIGZsYXNoIG1lbW9yeSBieSByZWFkL3dyaXRlIG9wZXJhdGlvbnMgdXNpbmcgdGhlIGZ1bmN0aW9ucworICAgICAgICAgIEhBTF9OQU5EX1JlYWRfUGFnZV84YigpL0hBTF9OQU5EX1JlYWRfU3BhcmVBcmVhXzhiKCksIAorICAgICAgICAgIEhBTF9OQU5EX1dyaXRlX1BhZ2VfOGIoKS9IQUxfTkFORF9Xcml0ZV9TcGFyZUFyZWFfOGIoKSwKKyAgICAgICAgICBIQUxfTkFORF9SZWFkX1BhZ2VfMTZiKCkvSEFMX05BTkRfUmVhZF9TcGFyZUFyZWFfMTZiKCksIAorICAgICAgICAgIEhBTF9OQU5EX1dyaXRlX1BhZ2VfMTZiKCkvSEFMX05BTkRfV3JpdGVfU3BhcmVBcmVhXzE2YigpCisgICAgICAgICAgdG8gcmVhZC93cml0ZSBwYWdlKHMpL3NwYXJlIGFyZWEocykuIFRoZXNlIGZ1bmN0aW9ucyB1c2Ugc3BlY2lmaWMgZGV2aWNlIAorICAgICAgICAgIGluZm9ybWF0aW9uIChCbG9jaywgcGFnZSBzaXplLi4pIHByZWRlZmluZWQgYnkgdGhlIHVzZXIgaW4gdGhlIEhBTF9OQU5EX0luZm9fVHlwZURlZiAKKyAgICAgICAgICBzdHJ1Y3R1cmUuIFRoZSByZWFkL3dyaXRlIGFkZHJlc3MgaW5mb3JtYXRpb24gaXMgY29udGFpbmVkIGJ5IHRoZSBOYW5kX0FkZHJlc3NfVHlwZWRlZgorICAgICAgICAgIHN0cnVjdHVyZSBwYXNzZWQgYXMgcGFyYW1ldGVyLgorICAgICAgICAKKyAgICAgICgrKSBQZXJmb3JtIE5BTkQgZmxhc2ggUmVzZXQgY2hpcCBvcGVyYXRpb24gdXNpbmcgdGhlIGZ1bmN0aW9uIEhBTF9OQU5EX1Jlc2V0KCkuCisgICAgICAgIAorICAgICAgKCspIFBlcmZvcm0gTkFORCBmbGFzaCBlcmFzZSBibG9jayBvcGVyYXRpb24gdXNpbmcgdGhlIGZ1bmN0aW9uIEhBTF9OQU5EX0VyYXNlX0Jsb2NrKCkuCisgICAgICAgICAgVGhlIGVyYXNlIGJsb2NrIGFkZHJlc3MgaW5mb3JtYXRpb24gaXMgY29udGFpbmVkIGluIHRoZSBOYW5kX0FkZHJlc3NfVHlwZWRlZiAKKyAgICAgICAgICBzdHJ1Y3R1cmUgcGFzc2VkIGFzIHBhcmFtZXRlci4KKyAgICAKKyAgICAgICgrKSBSZWFkIHRoZSBOQU5EIGZsYXNoIHN0YXR1cyBvcGVyYXRpb24gdXNpbmcgdGhlIGZ1bmN0aW9uIEhBTF9OQU5EX1JlYWRfU3RhdHVzKCkuCisgICAgICAgIAorICAgICAgKCspIFlvdSBjYW4gYWxzbyBjb250cm9sIHRoZSBOQU5EIGRldmljZSBieSBjYWxsaW5nIHRoZSBjb250cm9sIEFQSXMgSEFMX05BTkRfRUNDX0VuYWJsZSgpLworICAgICAgICAgIEhBTF9OQU5EX0VDQ19EaXNhYmxlKCkgdG8gcmVzcGVjdGl2ZWx5IGVuYWJsZS9kaXNhYmxlIHRoZSBFQ0MgY29kZSBjb3JyZWN0aW9uCisgICAgICAgICAgZmVhdHVyZSBvciB0aGUgZnVuY3Rpb24gSEFMX05BTkRfR2V0RUNDKCkgdG8gZ2V0IHRoZSBFQ0MgY29ycmVjdGlvbiBjb2RlLiAKKyAgICAgICAKKyAgICAgICgrKSBZb3UgY2FuIG1vbml0b3IgdGhlIE5BTkQgZGV2aWNlIEhBTCBzdGF0ZSBieSBjYWxsaW5nIHRoZSBmdW5jdGlvbgorICAgICAgICAgIEhBTF9OQU5EX0dldFN0YXRlKCkgIAorCisgICAgWy4uXQorICAgICAgKEApIFRoaXMgZHJpdmVyIGlzIGEgc2V0IG9mIGdlbmVyaWMgQVBJcyB3aGljaCBoYW5kbGUgc3RhbmRhcmQgTkFORCBmbGFzaCBvcGVyYXRpb25zLgorICAgICAgICAgIElmIGEgTkFORCBmbGFzaCBkZXZpY2UgY29udGFpbnMgZGlmZmVyZW50IG9wZXJhdGlvbnMgYW5kL29yIGltcGxlbWVudGF0aW9ucywgCisgICAgICAgICAgaXQgc2hvdWxkIGJlIGltcGxlbWVudGVkIHNlcGFyYXRlbHkuCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLyAKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsLmgiCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KQorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX05BTkRfTU9EVUxFX0VOQUJMRUQKKworLyoqIEBkZWZncm91cCBOQU5EIE5BTkQKKyAgKiBAYnJpZWYgTkFORCBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBOQU5EX1ByaXZhdGVfQ29uc3RhbnRzIE5BTkQgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgICAKKy8qKiBAZGVmZ3JvdXAgTkFORF9Qcml2YXRlX01hY3JvcyBOQU5EIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgTkFORF9FeHBvcnRlZF9GdW5jdGlvbnMgTkFORCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworICAgIAorLyoqIEBkZWZncm91cCBOQU5EX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAKKyAgKiBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIAorICAqCisgIEB2ZXJiYXRpbSAgICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAjIyMjIyBOQU5EIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0gIAorICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gaW5pdGlhbGl6ZS9kZS1pbml0aWFsaXplCisgICAgdGhlIE5BTkQgbWVtb3J5CisgIAorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKyAgICAKKy8qKgorICAqIEBicmllZiAgUGVyZm9ybSBOQU5EIG1lbW9yeSBJbml0aWFsaXphdGlvbiBzZXF1ZW5jZQorICAqIEBwYXJhbSAgaG5hbmQgcG9pbnRlciB0byBhIE5BTkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBOQU5EIG1vZHVsZS4KKyAgKiBAcGFyYW0gIENvbVNwYWNlX1RpbWluZyBwb2ludGVyIHRvIENvbW1vbiBzcGFjZSB0aW1pbmcgc3RydWN0dXJlCisgICogQHBhcmFtICBBdHRTcGFjZV9UaW1pbmcgcG9pbnRlciB0byBBdHRyaWJ1dGUgc3BhY2UgdGltaW5nIHN0cnVjdHVyZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgIEhBTF9OQU5EX0luaXQoTkFORF9IYW5kbGVUeXBlRGVmICpobmFuZCwgRk1DX05BTkRfUENDX1RpbWluZ1R5cGVEZWYgKkNvbVNwYWNlX1RpbWluZywgRk1DX05BTkRfUENDX1RpbWluZ1R5cGVEZWYgKkF0dFNwYWNlX1RpbWluZykKK3sKKyAgLyogQ2hlY2sgdGhlIE5BTkQgaGFuZGxlIHN0YXRlICovCisgIGlmKGhuYW5kID09IE5VTEwpCisgIHsKKyAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIGlmKGhuYW5kLT5TdGF0ZSA9PSBIQUxfTkFORF9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBobmFuZC0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKyAgICAvKiBJbml0aWFsaXplIHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKE1TUCkgKi8KKyAgICBIQUxfTkFORF9Nc3BJbml0KGhuYW5kKTsKKyAgfSAKKworICAvKiBJbml0aWFsaXplIE5BTkQgY29udHJvbCBJbnRlcmZhY2UgKi8KKyAgRk1DX05BTkRfSW5pdChobmFuZC0+SW5zdGFuY2UsICYoaG5hbmQtPkluaXQpKTsKKyAgCisgIC8qIEluaXRpYWxpemUgTkFORCBjb21tb24gc3BhY2UgdGltaW5nIEludGVyZmFjZSAqLyAgCisgIEZNQ19OQU5EX0NvbW1vblNwYWNlX1RpbWluZ19Jbml0KGhuYW5kLT5JbnN0YW5jZSwgQ29tU3BhY2VfVGltaW5nLCBobmFuZC0+SW5pdC5OYW5kQmFuayk7CisgIAorICAvKiBJbml0aWFsaXplIE5BTkQgYXR0cmlidXRlIHNwYWNlIHRpbWluZyBJbnRlcmZhY2UgKi8gIAorICBGTUNfTkFORF9BdHRyaWJ1dGVTcGFjZV9UaW1pbmdfSW5pdChobmFuZC0+SW5zdGFuY2UsIEF0dFNwYWNlX1RpbWluZywgaG5hbmQtPkluaXQuTmFuZEJhbmspOworICAKKyAgLyogRW5hYmxlIHRoZSBOQU5EIGRldmljZSAqLworICBfX0ZNQ19OQU5EX0VOQUJMRShobmFuZC0+SW5zdGFuY2UsIGhuYW5kLT5Jbml0Lk5hbmRCYW5rKTsKKyAgCisgIC8qIFVwZGF0ZSB0aGUgTkFORCBjb250cm9sbGVyIHN0YXRlICovCisgIGhuYW5kLT5TdGF0ZSA9IEhBTF9OQU5EX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgUGVyZm9ybSBOQU5EIG1lbW9yeSBEZS1Jbml0aWFsaXphdGlvbiBzZXF1ZW5jZQorICAqIEBwYXJhbSAgaG5hbmQgcG9pbnRlciB0byBhIE5BTkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBOQU5EIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9OQU5EX0RlSW5pdChOQU5EX0hhbmRsZVR5cGVEZWYgKmhuYW5kKSAgCit7CisgIC8qIEluaXRpYWxpemUgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAoTVNQKSAqLworICBIQUxfTkFORF9Nc3BEZUluaXQoaG5hbmQpOworCisgIC8qIENvbmZpZ3VyZSB0aGUgTkFORCByZWdpc3RlcnMgd2l0aCB0aGVpciByZXNldCB2YWx1ZXMgKi8KKyAgRk1DX05BTkRfRGVJbml0KGhuYW5kLT5JbnN0YW5jZSwgaG5hbmQtPkluaXQuTmFuZEJhbmspOworCisgIC8qIFJlc2V0IHRoZSBOQU5EIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaG5hbmQtPlN0YXRlID0gSEFMX05BTkRfU1RBVEVfUkVTRVQ7CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhobmFuZCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBOQU5EIE1TUCBJbml0CisgICogQHBhcmFtICBobmFuZCBwb2ludGVyIHRvIGEgTkFORF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIE5BTkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX05BTkRfTXNwSW5pdChOQU5EX0hhbmRsZVR5cGVEZWYgKmhuYW5kKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChobmFuZCk7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfTkFORF9Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovIAorfQorCisvKioKKyAgKiBAYnJpZWYgIE5BTkQgTVNQIERlSW5pdAorICAqIEBwYXJhbSAgaG5hbmQgcG9pbnRlciB0byBhIE5BTkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBOQU5EIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9OQU5EX01zcERlSW5pdChOQU5EX0hhbmRsZVR5cGVEZWYgKmhuYW5kKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChobmFuZCk7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfTkFORF9Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gCit9CisKKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgTkFORCBkZXZpY2UgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBobmFuZCBwb2ludGVyIHRvIGEgTkFORF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIE5BTkQgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK3ZvaWQgSEFMX05BTkRfSVJRSGFuZGxlcihOQU5EX0hhbmRsZVR5cGVEZWYgKmhuYW5kKQoreworICAvKiBDaGVjayBOQU5EIGludGVycnVwdCBSaXNpbmcgZWRnZSBmbGFnICovCisgIGlmKF9fRk1DX05BTkRfR0VUX0ZMQUcoaG5hbmQtPkluc3RhbmNlLCBobmFuZC0+SW5pdC5OYW5kQmFuaywgRk1DX0ZMQUdfUklTSU5HX0VER0UpKQorICB7CisgICAgLyogTkFORCBpbnRlcnJ1cHQgY2FsbGJhY2sqLworICAgIEhBTF9OQU5EX0lUQ2FsbGJhY2soaG5hbmQpOworICAKKyAgICAvKiBDbGVhciBOQU5EIGludGVycnVwdCBSaXNpbmcgZWRnZSBwZW5kaW5nIGJpdCAqLworICAgIF9fRk1DX05BTkRfQ0xFQVJfRkxBRyhobmFuZC0+SW5zdGFuY2UsIGhuYW5kLT5Jbml0Lk5hbmRCYW5rLCBGTUNfRkxBR19SSVNJTkdfRURHRSk7CisgIH0KKyAgCisgIC8qIENoZWNrIE5BTkQgaW50ZXJydXB0IExldmVsIGZsYWcgKi8KKyAgaWYoX19GTUNfTkFORF9HRVRfRkxBRyhobmFuZC0+SW5zdGFuY2UsIGhuYW5kLT5Jbml0Lk5hbmRCYW5rLCBGTUNfRkxBR19MRVZFTCkpCisgIHsKKyAgICAvKiBOQU5EIGludGVycnVwdCBjYWxsYmFjayovCisgICAgSEFMX05BTkRfSVRDYWxsYmFjayhobmFuZCk7CisgIAorICAgIC8qIENsZWFyIE5BTkQgaW50ZXJydXB0IExldmVsIHBlbmRpbmcgYml0ICovCisgICAgX19GTUNfTkFORF9DTEVBUl9GTEFHKGhuYW5kLT5JbnN0YW5jZSwgaG5hbmQtPkluaXQuTmFuZEJhbmssIEZNQ19GTEFHX0xFVkVMKTsKKyAgfQorCisgIC8qIENoZWNrIE5BTkQgaW50ZXJydXB0IEZhbGxpbmcgZWRnZSBmbGFnICovCisgIGlmKF9fRk1DX05BTkRfR0VUX0ZMQUcoaG5hbmQtPkluc3RhbmNlLCBobmFuZC0+SW5pdC5OYW5kQmFuaywgRk1DX0ZMQUdfRkFMTElOR19FREdFKSkKKyAgeworICAgIC8qIE5BTkQgaW50ZXJydXB0IGNhbGxiYWNrKi8KKyAgICBIQUxfTkFORF9JVENhbGxiYWNrKGhuYW5kKTsKKyAgCisgICAgLyogQ2xlYXIgTkFORCBpbnRlcnJ1cHQgRmFsbGluZyBlZGdlIHBlbmRpbmcgYml0ICovCisgICAgX19GTUNfTkFORF9DTEVBUl9GTEFHKGhuYW5kLT5JbnN0YW5jZSwgaG5hbmQtPkluaXQuTmFuZEJhbmssIEZNQ19GTEFHX0ZBTExJTkdfRURHRSk7CisgIH0KKyAgCisgIC8qIENoZWNrIE5BTkQgaW50ZXJydXB0IEZJRk8gZW1wdHkgZmxhZyAqLworICBpZihfX0ZNQ19OQU5EX0dFVF9GTEFHKGhuYW5kLT5JbnN0YW5jZSwgaG5hbmQtPkluaXQuTmFuZEJhbmssIEZNQ19GTEFHX0ZFTVBUKSkKKyAgeworICAgIC8qIE5BTkQgaW50ZXJydXB0IGNhbGxiYWNrKi8KKyAgICBIQUxfTkFORF9JVENhbGxiYWNrKGhuYW5kKTsKKyAgCisgICAgLyogQ2xlYXIgTkFORCBpbnRlcnJ1cHQgRklGTyBlbXB0eSBwZW5kaW5nIGJpdCAqLworICAgIF9fRk1DX05BTkRfQ0xFQVJfRkxBRyhobmFuZC0+SW5zdGFuY2UsIGhuYW5kLT5Jbml0Lk5hbmRCYW5rLCBGTUNfRkxBR19GRU1QVCk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBOQU5EIGludGVycnVwdCBmZWF0dXJlIGNhbGxiYWNrCisgICogQHBhcmFtICBobmFuZCBwb2ludGVyIHRvIGEgTkFORF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIE5BTkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX05BTkRfSVRDYWxsYmFjayhOQU5EX0hhbmRsZVR5cGVEZWYgKmhuYW5kKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChobmFuZCk7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfTkFORF9JVENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisgCisvKioKKyAgKiBAfQorICAqLworICAKKy8qKiBAZGVmZ3JvdXAgTkFORF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElucHV0IGFuZCBPdXRwdXQgZnVuY3Rpb25zIAorICAqIEBicmllZiAgICBJbnB1dCBPdXRwdXQgYW5kIG1lbW9yeSBjb250cm9sIGZ1bmN0aW9ucyAKKyAgKgorICBAdmVyYmF0aW0gICAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAjIyMjIyBOQU5EIElucHV0IGFuZCBPdXRwdXQgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dICAKKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIHVzZSBhbmQgY29udHJvbCB0aGUgTkFORCAKKyAgICBtZW1vcnkKKyAgCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgdGhlIE5BTkQgbWVtb3J5IGVsZWN0cm9uaWMgc2lnbmF0dXJlCisgICogQHBhcmFtICBobmFuZCBwb2ludGVyIHRvIGEgTkFORF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIE5BTkQgbW9kdWxlLgorICAqIEBwYXJhbSAgcE5BTkRfSUQgTkFORCBJRCBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9OQU5EX1JlYWRfSUQoTkFORF9IYW5kbGVUeXBlRGVmICpobmFuZCwgTkFORF9JRFR5cGVEZWYgKnBOQU5EX0lEKQoreworICBfX0lPIHVpbnQzMl90IGRhdGEgPSAwVTsKKyAgX19JTyB1aW50MzJfdCBkYXRhMSA9IDBVOworICB1aW50MzJfdCBkZXZpY2VhZGRyZXNzID0gMFU7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhobmFuZCk7ICAKKyAgCisgIC8qIENoZWNrIHRoZSBOQU5EIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaWYoaG5hbmQtPlN0YXRlID09IEhBTF9OQU5EX1NUQVRFX0JVU1kpCisgIHsKKyAgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisgIAorICAvKiBJZGVudGlmeSB0aGUgZGV2aWNlIGFkZHJlc3MgKi8KKyAgaWYoaG5hbmQtPkluaXQuTmFuZEJhbmsgPT0gRk1DX05BTkRfQkFOSzIpCisgIHsKKyAgICBkZXZpY2VhZGRyZXNzID0gTkFORF9ERVZJQ0UxOworICB9CisgIGVsc2UKKyAgeworICAgIGRldmljZWFkZHJlc3MgPSBOQU5EX0RFVklDRTI7CisgIH0KKyAgCisgIC8qIFVwZGF0ZSB0aGUgTkFORCBjb250cm9sbGVyIHN0YXRlICovIAorICBobmFuZC0+U3RhdGUgPSBIQUxfTkFORF9TVEFURV9CVVNZOworICAKKyAgLyogU2VuZCBSZWFkIElEIGNvbW1hbmQgc2VxdWVuY2UgKi8gICAKKyAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQ01EX0FSRUEpKSAgPSBOQU5EX0NNRF9SRUFESUQ7CisgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gMHgwMDsKKworICAvKiBSZWFkIHRoZSBlbGVjdHJvbmljIHNpZ25hdHVyZSBmcm9tIE5BTkQgZmxhc2ggKi8KKyAgaWYgKGhuYW5kLT5Jbml0Lk1lbW9yeURhdGFXaWR0aCA9PSBGTUNfTkFORF9QQ0NfTUVNX0JVU19XSURUSF84KQorICB7CisgICAgZGF0YSA9ICooX19JTyB1aW50MzJfdCAqKWRldmljZWFkZHJlc3M7CisKKyAgICAvKiBSZXR1cm4gdGhlIGRhdGEgcmVhZCAqLworICAgIHBOQU5EX0lELT5NYWtlcl9JZCAgID0gQUREUl8xU1RfQ1lDTEUoZGF0YSk7CisgICAgcE5BTkRfSUQtPkRldmljZV9JZCAgPSBBRERSXzJORF9DWUNMRShkYXRhKTsKKyAgICBwTkFORF9JRC0+VGhpcmRfSWQgICA9IEFERFJfM1JEX0NZQ0xFKGRhdGEpOworICAgIHBOQU5EX0lELT5Gb3VydGhfSWQgID0gQUREUl80VEhfQ1lDTEUoZGF0YSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgZGF0YSA9ICooX19JTyB1aW50MzJfdCAqKWRldmljZWFkZHJlc3M7CisgICAgZGF0YTEgPSAqKChfX0lPIHVpbnQzMl90ICopZGV2aWNlYWRkcmVzcyArIDRVKTsKKyAgICAKKyAgICAvKiBSZXR1cm4gdGhlIGRhdGEgcmVhZCAqLworICAgIHBOQU5EX0lELT5NYWtlcl9JZCAgID0gQUREUl8xU1RfQ1lDTEUoZGF0YSk7CisgICAgcE5BTkRfSUQtPkRldmljZV9JZCAgPSBBRERSXzNSRF9DWUNMRShkYXRhKTsKKyAgICBwTkFORF9JRC0+VGhpcmRfSWQgICA9IEFERFJfMVNUX0NZQ0xFKGRhdGExKTsKKyAgICBwTkFORF9JRC0+Rm91cnRoX0lkICA9IEFERFJfM1JEX0NZQ0xFKGRhdGExKTsKKyAgfQorICAKKyAgLyogVXBkYXRlIHRoZSBOQU5EIGNvbnRyb2xsZXIgc3RhdGUgKi8gCisgIGhuYW5kLT5TdGF0ZSA9IEhBTF9OQU5EX1NUQVRFX1JFQURZOworICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaG5hbmQpOworICAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgTkFORCBtZW1vcnkgcmVzZXQKKyAgKiBAcGFyYW0gIGhuYW5kIHBvaW50ZXIgdG8gYSBOQU5EX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgTkFORCBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTkFORF9SZXNldChOQU5EX0hhbmRsZVR5cGVEZWYgKmhuYW5kKQoreworICB1aW50MzJfdCBkZXZpY2VhZGRyZXNzID0gMFU7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhobmFuZCk7CisKKyAgLyogQ2hlY2sgdGhlIE5BTkQgY29udHJvbGxlciBzdGF0ZSAqLworICBpZihobmFuZC0+U3RhdGUgPT0gSEFMX05BTkRfU1RBVEVfQlVTWSkKKyAgeworICAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKworICAvKiBJZGVudGlmeSB0aGUgZGV2aWNlIGFkZHJlc3MgKi8KKyAgaWYoaG5hbmQtPkluaXQuTmFuZEJhbmsgPT0gRk1DX05BTkRfQkFOSzIpCisgIHsKKyAgICBkZXZpY2VhZGRyZXNzID0gTkFORF9ERVZJQ0UxOworICB9CisgIGVsc2UKKyAgeworICAgIGRldmljZWFkZHJlc3MgPSBOQU5EX0RFVklDRTI7CisgIH0gIAorICAKKyAgLyogVXBkYXRlIHRoZSBOQU5EIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaG5hbmQtPlN0YXRlID0gSEFMX05BTkRfU1RBVEVfQlVTWTsgCisgIAorICAvKiBTZW5kIE5BTkQgcmVzZXQgY29tbWFuZCAqLyAgCisgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IENNRF9BUkVBKSkgPSAweEZGOworCisKKyAgLyogVXBkYXRlIHRoZSBOQU5EIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaG5hbmQtPlN0YXRlID0gSEFMX05BTkRfU1RBVEVfUkVBRFk7CisgIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhobmFuZCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKKworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgZGV2aWNlOiBFbnRlciB0aGUgcGh5c2ljYWwgcGFyYW1ldGVycyBvZiB0aGUgZGV2aWNlCisgICogQHBhcmFtICBobmFuZCBwb2ludGVyIHRvIGEgTkFORF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIE5BTkQgbW9kdWxlLgorICAqIEBwYXJhbSAgcERldmljZUNvbmZpZyBwb2ludGVyIHRvIE5BTkRfRGV2aWNlQ29uZmlnVHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmICBIQUxfTkFORF9Db25maWdEZXZpY2UoTkFORF9IYW5kbGVUeXBlRGVmICpobmFuZCwgTkFORF9EZXZpY2VDb25maWdUeXBlRGVmICpwRGV2aWNlQ29uZmlnKQoreworICBobmFuZC0+Q29uZmlnLlBhZ2VTaXplICAgICAgICAgICA9IHBEZXZpY2VDb25maWctPlBhZ2VTaXplOworICBobmFuZC0+Q29uZmlnLlNwYXJlQXJlYVNpemUgICAgICA9IHBEZXZpY2VDb25maWctPlNwYXJlQXJlYVNpemU7CisgIGhuYW5kLT5Db25maWcuQmxvY2tTaXplICAgICAgICAgID0gcERldmljZUNvbmZpZy0+QmxvY2tTaXplOworICBobmFuZC0+Q29uZmlnLkJsb2NrTmJyICAgICAgICAgICA9IHBEZXZpY2VDb25maWctPkJsb2NrTmJyOworICBobmFuZC0+Q29uZmlnLlBsYW5lU2l6ZSAgICAgICAgICA9IHBEZXZpY2VDb25maWctPlBsYW5lU2l6ZTsKKyAgaG5hbmQtPkNvbmZpZy5QbGFuZU5iciAgICAgICAgICAgPSBwRGV2aWNlQ29uZmlnLT5QbGFuZU5icjsKKyAgaG5hbmQtPkNvbmZpZy5FeHRyYUNvbW1hbmRFbmFibGUgPSBwRGV2aWNlQ29uZmlnLT5FeHRyYUNvbW1hbmRFbmFibGU7CisgIAorICByZXR1cm4gSEFMX09LOworfQorICAKKy8qKgorICAqIEBicmllZiAgUmVhZCBQYWdlKHMpIGZyb20gTkFORCBtZW1vcnkgYmxvY2sgKDgtYml0cyBhZGRyZXNzaW5nKQorICAqIEBwYXJhbSAgaG5hbmQgcG9pbnRlciB0byBhIE5BTkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBOQU5EIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBBZGRyZXNzIHBvaW50ZXIgdG8gTkFORCBhZGRyZXNzIHN0cnVjdHVyZQorICAqIEBwYXJhbSAgcEJ1ZmZlciBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlYWQgYnVmZmVyCisgICogQHBhcmFtICBOdW1QYWdlVG9SZWFkIG51bWJlciBvZiBwYWdlcyB0byByZWFkIGZyb20gYmxvY2sgCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTkFORF9SZWFkX1BhZ2VfOGIoTkFORF9IYW5kbGVUeXBlRGVmICpobmFuZCwgTkFORF9BZGRyZXNzVHlwZURlZiAqcEFkZHJlc3MsIHVpbnQ4X3QgKnBCdWZmZXIsIHVpbnQzMl90IE51bVBhZ2VUb1JlYWQpCit7ICAgCisgIF9fSU8gdWludDMyX3QgaW5kZXggID0gMFU7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDBVOworICB1aW50MzJfdCBkZXZpY2VhZGRyZXNzID0gMFUsIHNpemUgPSAwVSwgbnVtUGFnZXNSZWFkID0gMFUsIG5hbmRhZGRyZXNzID0gMFU7CisgIAorICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhuYW5kKTsgCisgIAorICAvKiBDaGVjayB0aGUgTkFORCBjb250cm9sbGVyIHN0YXRlICovCisgIGlmKGhuYW5kLT5TdGF0ZSA9PSBIQUxfTkFORF9TVEFURV9CVVNZKQorICB7CisgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorICAKKyAgLyogSWRlbnRpZnkgdGhlIGRldmljZSBhZGRyZXNzICovCisgIGlmKGhuYW5kLT5Jbml0Lk5hbmRCYW5rID09IEZNQ19OQU5EX0JBTksyKQorICB7CisgICAgZGV2aWNlYWRkcmVzcyA9IE5BTkRfREVWSUNFMTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBkZXZpY2VhZGRyZXNzID0gTkFORF9ERVZJQ0UyOworICB9CisKKyAgLyogVXBkYXRlIHRoZSBOQU5EIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaG5hbmQtPlN0YXRlID0gSEFMX05BTkRfU1RBVEVfQlVTWTsKKyAgCisgIC8qIE5BTkQgcmF3IGFkZHJlc3MgY2FsY3VsYXRpb24gKi8KKyAgbmFuZGFkZHJlc3MgPSBBUlJBWV9BRERSRVNTKHBBZGRyZXNzLCBobmFuZCk7CisKKyAgLyogUGFnZShzKSByZWFkIGxvb3AgKi8gIAorICB3aGlsZSgoTnVtUGFnZVRvUmVhZCAhPSAwVSkgJiYgKG5hbmRhZGRyZXNzIDwgKChobmFuZC0+Q29uZmlnLkJsb2NrU2l6ZSkgKiAoaG5hbmQtPkNvbmZpZy5CbG9ja05icikpKSkKKyAgeworICAgIC8qIHVwZGF0ZSB0aGUgYnVmZmVyIHNpemUgKi8KKyAgICBzaXplID0gKGhuYW5kLT5Db25maWcuUGFnZVNpemUpICsgKChobmFuZC0+Q29uZmlnLlBhZ2VTaXplKSAqIG51bVBhZ2VzUmVhZCk7CisgICAgCisgICAgLyogU2VuZCByZWFkIHBhZ2UgY29tbWFuZCBzZXF1ZW5jZSAqLworICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IENNRF9BUkVBKSkgPSBOQU5EX0NNRF9BUkVBX0E7CisgICAKKyAgICAvKiBDYXJkcyB3aXRoIHBhZ2Ugc2l6ZSA8PSA1MTIgYnl0ZXMgKi8KKyAgICBpZigoaG5hbmQtPkNvbmZpZy5QYWdlU2l6ZSkgPD0gNTEyVSkKKyAgICB7CisgICAgICBpZiAoKChobmFuZC0+Q29uZmlnLkJsb2NrU2l6ZSkqKGhuYW5kLT5Db25maWcuQmxvY2tOYnIpKSA8PSA2NTUzNVUpCisgICAgICB7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gMHgwMDsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBBRERSXzFTVF9DWUNMRShuYW5kYWRkcmVzcyk7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8yTkRfQ1lDTEUobmFuZGFkZHJlc3MpOworICAgICAgfQorICAgICAgZWxzZSAvKiAoKGhuYW5kLT5Db25maWcuQmxvY2tTaXplKSooaG5hbmQtPkNvbmZpZy5CbG9ja05icikpID4gNjU1MzUgKi8KKyAgICAgIHsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSAweDAwOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IEFERFJfMVNUX0NZQ0xFKG5hbmRhZGRyZXNzKTsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBBRERSXzJORF9DWUNMRShuYW5kYWRkcmVzcyk7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8zUkRfQ1lDTEUobmFuZGFkZHJlc3MpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIChobmFuZC0+Q29uZmlnLlBhZ2VTaXplKSA+IDUxMiAqLworICAgIHsKKyAgICAgIGlmICgoKGhuYW5kLT5Db25maWcuQmxvY2tTaXplKSooaG5hbmQtPkNvbmZpZy5CbG9ja05icikpIDw9IDY1NTM1VSkKKyAgICAgIHsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSAweDAwOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IDB4MDA7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8xU1RfQ1lDTEUobmFuZGFkZHJlc3MpOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IEFERFJfMk5EX0NZQ0xFKG5hbmRhZGRyZXNzKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgLyogKChobmFuZC0+Q29uZmlnLkJsb2NrU2l6ZSkqKGhuYW5kLT5Db25maWcuQmxvY2tOYnIpKSA+IDY1NTM1ICovCisgICAgICB7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gMHgwMDsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSAweDAwOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IEFERFJfMVNUX0NZQ0xFKG5hbmRhZGRyZXNzKTsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBBRERSXzJORF9DWUNMRShuYW5kYWRkcmVzcyk7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8zUkRfQ1lDTEUobmFuZGFkZHJlc3MpOworICAgICAgfQorICAgIH0KKyAgCisgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQ01EX0FSRUEpKSAgPSBOQU5EX0NNRF9BUkVBX1RSVUUxOworICAgICAgCisgICAgLyogQ2hlY2sgaWYgYW4gZXh0cmEgY29tbWFuZCBpcyBuZWVkZWQgZm9yIHJlYWRpbmcgcGFnZXMgICovCisgICAgaWYoaG5hbmQtPkNvbmZpZy5FeHRyYUNvbW1hbmRFbmFibGUgPT0gRU5BQkxFKQorICAgIHsKKyAgICAgIC8qIEdldCB0aWNrICovCisgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgICAgCisgICAgICAvKiBSZWFkIHN0YXR1cyB1bnRpbCBOQU5EIGlzIHJlYWR5ICovCisgICAgICB3aGlsZShIQUxfTkFORF9SZWFkX1N0YXR1cyhobmFuZCkgIT0gTkFORF9SRUFEWSkKKyAgICAgIHsKKyAgICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IE5BTkRfV1JJVEVfVElNRU9VVCkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsgCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIAorICAgICAgLyogR28gYmFjayB0byByZWFkIG1vZGUgKi8KKyAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IENNRF9BUkVBKSkgPSAoKHVpbnQ4X3QpMHgwMCk7CisgICAgICBfX0RTQigpOworICAgIH0KKyAgICAKKyAgICAvKiBHZXQgRGF0YSBpbnRvIEJ1ZmZlciAqLyAgICAKKyAgICBmb3IoOyBpbmRleCA8IHNpemU7IGluZGV4KyspCisgICAgeworICAgICAgKih1aW50OF90ICopcEJ1ZmZlcisrID0gKih1aW50OF90ICopZGV2aWNlYWRkcmVzczsKKyAgICB9CisgICAgCisgICAgLyogSW5jcmVtZW50IHJlYWQgcGFnZXMgbnVtYmVyICovCisgICAgbnVtUGFnZXNSZWFkKys7CisgICAgCisgICAgLyogRGVjcmVtZW50IHBhZ2VzIHRvIHJlYWQgKi8KKyAgICBOdW1QYWdlVG9SZWFkLS07CisgICAgCisgICAgLyogSW5jcmVtZW50IHRoZSBOQU5EIGFkZHJlc3MgKi8KKyAgICBuYW5kYWRkcmVzcyA9ICh1aW50MzJfdCkobmFuZGFkZHJlc3MgKyAxVSk7CisgIH0KKyAgCisgIC8qIFVwZGF0ZSB0aGUgTkFORCBjb250cm9sbGVyIHN0YXRlICovCisgIGhuYW5kLT5TdGF0ZSA9IEhBTF9OQU5EX1NUQVRFX1JFQURZOworICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaG5hbmQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVhZCBQYWdlKHMpIGZyb20gTkFORCBtZW1vcnkgYmxvY2sgKDE2LWJpdHMgYWRkcmVzc2luZykKKyAgKiBAcGFyYW0gIGhuYW5kIHBvaW50ZXIgdG8gYSBOQU5EX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgTkFORCBtb2R1bGUuCisgICogQHBhcmFtICBwQWRkcmVzcyBwb2ludGVyIHRvIE5BTkQgYWRkcmVzcyBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gIHBCdWZmZXIgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZWFkIGJ1ZmZlci4gcEJ1ZmZlciBzaG91bGQgYmUgMTZiaXRzIGFsaWduZWQKKyAgKiBAcGFyYW0gIE51bVBhZ2VUb1JlYWQgbnVtYmVyIG9mIHBhZ2VzIHRvIHJlYWQgZnJvbSBibG9jayAKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9OQU5EX1JlYWRfUGFnZV8xNmIoTkFORF9IYW5kbGVUeXBlRGVmICpobmFuZCwgTkFORF9BZGRyZXNzVHlwZURlZiAqcEFkZHJlc3MsIHVpbnQxNl90ICpwQnVmZmVyLCB1aW50MzJfdCBOdW1QYWdlVG9SZWFkKQoreyAgIAorICBfX0lPIHVpbnQzMl90IGluZGV4ICA9IDBVOworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKyAgdWludDMyX3QgZGV2aWNlYWRkcmVzcyA9IDBVLCBzaXplID0gMFUsIG51bVBhZ2VzUmVhZCA9IDBVLCBuYW5kYWRkcmVzcyA9IDBVOworICAKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhobmFuZCk7IAorICAKKyAgLyogQ2hlY2sgdGhlIE5BTkQgY29udHJvbGxlciBzdGF0ZSAqLworICBpZihobmFuZC0+U3RhdGUgPT0gSEFMX05BTkRfU1RBVEVfQlVTWSkKKyAgeworICAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKyAgCisgIC8qIElkZW50aWZ5IHRoZSBkZXZpY2UgYWRkcmVzcyAqLworICBpZihobmFuZC0+SW5pdC5OYW5kQmFuayA9PSBGTUNfTkFORF9CQU5LMikKKyAgeworICAgIGRldmljZWFkZHJlc3MgPSBOQU5EX0RFVklDRTE7CisgIH0KKyAgZWxzZQorICB7CisgICAgZGV2aWNlYWRkcmVzcyA9IE5BTkRfREVWSUNFMjsKKyAgfQorCisgIC8qIFVwZGF0ZSB0aGUgTkFORCBjb250cm9sbGVyIHN0YXRlICovIAorICBobmFuZC0+U3RhdGUgPSBIQUxfTkFORF9TVEFURV9CVVNZOworICAKKyAgLyogTkFORCByYXcgYWRkcmVzcyBjYWxjdWxhdGlvbiAqLworICBuYW5kYWRkcmVzcyA9IEFSUkFZX0FERFJFU1MocEFkZHJlc3MsIGhuYW5kKTsKKyAgCisgIC8qIFBhZ2UocykgcmVhZCBsb29wICovICAKKyAgd2hpbGUoKE51bVBhZ2VUb1JlYWQgIT0gMFUpICYmIChuYW5kYWRkcmVzcyA8ICgoaG5hbmQtPkNvbmZpZy5CbG9ja1NpemUpICogKGhuYW5kLT5Db25maWcuQmxvY2tOYnIpKSkpCisgIHsKKyAgICAvKiB1cGRhdGUgdGhlIGJ1ZmZlciBzaXplICovCisgICAgc2l6ZSA9IChobmFuZC0+Q29uZmlnLlBhZ2VTaXplKSArICgoaG5hbmQtPkNvbmZpZy5QYWdlU2l6ZSkgKiBudW1QYWdlc1JlYWQpOworICAgIAorICAgIC8qIFNlbmQgcmVhZCBwYWdlIGNvbW1hbmQgc2VxdWVuY2UgKi8KKyAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBDTURfQVJFQSkpID0gTkFORF9DTURfQVJFQV9BOyAgCisgICAgX19EU0IoKTsKKyAgICAKKyAgICAvKiBDYXJkcyB3aXRoIHBhZ2Ugc2l6ZSA8PSA1MTIgYnl0ZXMgKi8KKyAgICBpZigoaG5hbmQtPkNvbmZpZy5QYWdlU2l6ZSkgPD0gNTEyVSkKKyAgICB7CisgICAgICBpZiAoKChobmFuZC0+Q29uZmlnLkJsb2NrU2l6ZSkqKGhuYW5kLT5Db25maWcuQmxvY2tOYnIpKSA8PSA2NTUzNVUpCisgICAgICB7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gMHgwMDsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBBRERSXzFTVF9DWUNMRShuYW5kYWRkcmVzcyk7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8yTkRfQ1lDTEUobmFuZGFkZHJlc3MpOworICAgICAgfQorICAgICAgZWxzZSAvKiAoKGhuYW5kLT5Db25maWcuQmxvY2tTaXplKSooaG5hbmQtPkNvbmZpZy5CbG9ja05icikpID4gNjU1MzUgKi8KKyAgICAgIHsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSAweDAwOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IEFERFJfMVNUX0NZQ0xFKG5hbmRhZGRyZXNzKTsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBBRERSXzJORF9DWUNMRShuYW5kYWRkcmVzcyk7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8zUkRfQ1lDTEUobmFuZGFkZHJlc3MpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIChobmFuZC0+Q29uZmlnLlBhZ2VTaXplKSA+IDUxMiAqLworICAgIHsKKyAgICAgIGlmICgoKGhuYW5kLT5Db25maWcuQmxvY2tTaXplKSooaG5hbmQtPkNvbmZpZy5CbG9ja05icikpIDw9IDY1NTM1VSkKKyAgICAgIHsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSAweDAwOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IDB4MDA7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8xU1RfQ1lDTEUobmFuZGFkZHJlc3MpOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IEFERFJfMk5EX0NZQ0xFKG5hbmRhZGRyZXNzKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgLyogKChobmFuZC0+Q29uZmlnLkJsb2NrU2l6ZSkqKGhuYW5kLT5Db25maWcuQmxvY2tOYnIpKSA+IDY1NTM1ICovCisgICAgICB7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gMHgwMDsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSAweDAwOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IEFERFJfMVNUX0NZQ0xFKG5hbmRhZGRyZXNzKTsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBBRERSXzJORF9DWUNMRShuYW5kYWRkcmVzcyk7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8zUkRfQ1lDTEUobmFuZGFkZHJlc3MpOworICAgICAgfQorICAgIH0KKyAgCisgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQ01EX0FSRUEpKSAgPSBOQU5EX0NNRF9BUkVBX1RSVUUxOworICAgIAorICAgIGlmKGhuYW5kLT5Db25maWcuRXh0cmFDb21tYW5kRW5hYmxlID09IEVOQUJMRSkKKyAgICB7CisgICAgICAvKiBHZXQgdGljayAqLworICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICAgIAorICAgICAgLyogUmVhZCBzdGF0dXMgdW50aWwgTkFORCBpcyByZWFkeSAqLworICAgICAgd2hpbGUoSEFMX05BTkRfUmVhZF9TdGF0dXMoaG5hbmQpICE9IE5BTkRfUkVBRFkpCisgICAgICB7CisgICAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBOQU5EX1dSSVRFX1RJTUVPVVQpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7IAorICAgICAgICB9CisgICAgICB9CisgICAgICAKKyAgICAgIC8qIEdvIGJhY2sgdG8gcmVhZCBtb2RlICovCisgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBDTURfQVJFQSkpID0gKCh1aW50OF90KTB4MDApOworICAgIH0KKyAgICAKKyAgICAvKiBHZXQgRGF0YSBpbnRvIEJ1ZmZlciAqLyAgICAKKyAgICBmb3IoOyBpbmRleCA8IHNpemU7IGluZGV4KyspCisgICAgeworICAgICAgKih1aW50MTZfdCAqKXBCdWZmZXIrKyA9ICoodWludDE2X3QgKilkZXZpY2VhZGRyZXNzOworICAgIH0KKyAgICAKKyAgICAvKiBJbmNyZW1lbnQgcmVhZCBwYWdlcyBudW1iZXIgKi8KKyAgICBudW1QYWdlc1JlYWQrKzsKKyAgICAKKyAgICAvKiBEZWNyZW1lbnQgcGFnZXMgdG8gcmVhZCAqLworICAgIE51bVBhZ2VUb1JlYWQtLTsKKyAgICAKKyAgICAvKiBJbmNyZW1lbnQgdGhlIE5BTkQgYWRkcmVzcyAqLworICAgIG5hbmRhZGRyZXNzID0gKHVpbnQzMl90KShuYW5kYWRkcmVzcyArIDFVKTsKKyAgfQorICAKKyAgLyogVXBkYXRlIHRoZSBOQU5EIGNvbnRyb2xsZXIgc3RhdGUgKi8gCisgIGhuYW5kLT5TdGF0ZSA9IEhBTF9OQU5EX1NUQVRFX1JFQURZOworICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaG5hbmQpOyAgCisgICAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgUGFnZShzKSB0byBOQU5EIG1lbW9yeSBibG9jayAoOC1iaXRzIGFkZHJlc3NpbmcpCisgICogQHBhcmFtICBobmFuZCBwb2ludGVyIHRvIGEgTkFORF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIE5BTkQgbW9kdWxlLgorICAqIEBwYXJhbSAgcEFkZHJlc3MgcG9pbnRlciB0byBOQU5EIGFkZHJlc3Mgc3RydWN0dXJlCisgICogQHBhcmFtICBwQnVmZmVyIHBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlciB0byB3cml0ZSAgCisgICogQHBhcmFtICBOdW1QYWdlVG9Xcml0ZSAgOiBudW1iZXIgb2YgcGFnZXMgdG8gd3JpdGUgdG8gYmxvY2sgCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTkFORF9Xcml0ZV9QYWdlXzhiKE5BTkRfSGFuZGxlVHlwZURlZiAqaG5hbmQsIE5BTkRfQWRkcmVzc1R5cGVEZWYgKnBBZGRyZXNzLCB1aW50OF90ICpwQnVmZmVyLCB1aW50MzJfdCBOdW1QYWdlVG9Xcml0ZSkKK3sKKyAgX19JTyB1aW50MzJfdCBpbmRleCA9IDBVOworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKyAgdWludDMyX3QgZGV2aWNlYWRkcmVzcyA9IDBVLCBzaXplID0gMFUsIG51bVBhZ2VzV3JpdHRlbiA9IDBVLCBuYW5kYWRkcmVzcyA9IDBVOworICAKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhobmFuZCk7ICAKKworICAvKiBDaGVjayB0aGUgTkFORCBjb250cm9sbGVyIHN0YXRlICovCisgIGlmKGhuYW5kLT5TdGF0ZSA9PSBIQUxfTkFORF9TVEFURV9CVVNZKQorICB7CisgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorICAKKyAgLyogSWRlbnRpZnkgdGhlIGRldmljZSBhZGRyZXNzICovCisgIGlmKGhuYW5kLT5Jbml0Lk5hbmRCYW5rID09IEZNQ19OQU5EX0JBTksyKQorICB7CisgICAgZGV2aWNlYWRkcmVzcyA9IE5BTkRfREVWSUNFMTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBkZXZpY2VhZGRyZXNzID0gTkFORF9ERVZJQ0UyOworICB9CisgIAorICAvKiBVcGRhdGUgdGhlIE5BTkQgY29udHJvbGxlciBzdGF0ZSAqLyAKKyAgaG5hbmQtPlN0YXRlID0gSEFMX05BTkRfU1RBVEVfQlVTWTsKKyAgCisgIC8qIE5BTkQgcmF3IGFkZHJlc3MgY2FsY3VsYXRpb24gKi8KKyAgbmFuZGFkZHJlc3MgPSBBUlJBWV9BRERSRVNTKHBBZGRyZXNzLCBobmFuZCk7CisgICAgCisgIC8qIFBhZ2Uocykgd3JpdGUgbG9vcCAqLworICB3aGlsZSgoTnVtUGFnZVRvV3JpdGUgIT0gMFUpICYmIChuYW5kYWRkcmVzcyA8ICgoaG5hbmQtPkNvbmZpZy5CbG9ja1NpemUpICogKGhuYW5kLT5Db25maWcuQmxvY2tOYnIpKSkpCisgIHsKKyAgICAvKiB1cGRhdGUgdGhlIGJ1ZmZlciBzaXplICovCisgICAgc2l6ZSA9IGhuYW5kLT5Db25maWcuUGFnZVNpemUgKyAoKGhuYW5kLT5Db25maWcuUGFnZVNpemUpICogbnVtUGFnZXNXcml0dGVuKTsKKyAgICAKKyAgICAvKiBTZW5kIHdyaXRlIHBhZ2UgY29tbWFuZCBzZXF1ZW5jZSAqLworICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IENNRF9BUkVBKSkgPSBOQU5EX0NNRF9BUkVBX0E7CisgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQ01EX0FSRUEpKSA9IE5BTkRfQ01EX1dSSVRFMDsKKworICAgIC8qIENhcmRzIHdpdGggcGFnZSBzaXplIDw9IDUxMiBieXRlcyAqLworICAgIGlmKChobmFuZC0+Q29uZmlnLlBhZ2VTaXplKSA8PSA1MTJVKQorICAgIHsKKyAgICAgIGlmICgoKGhuYW5kLT5Db25maWcuQmxvY2tTaXplKSooaG5hbmQtPkNvbmZpZy5CbG9ja05icikpIDw9IDY1NTM1VSkKKyAgICAgIHsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSAweDAwOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IEFERFJfMVNUX0NZQ0xFKG5hbmRhZGRyZXNzKTsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBBRERSXzJORF9DWUNMRShuYW5kYWRkcmVzcyk7CisgICAgICB9CisgICAgICBlbHNlIC8qICgoaG5hbmQtPkNvbmZpZy5CbG9ja1NpemUpKihobmFuZC0+Q29uZmlnLkJsb2NrTmJyKSkgPiA2NTUzNSAqLworICAgICAgeworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IDB4MDA7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8xU1RfQ1lDTEUobmFuZGFkZHJlc3MpOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IEFERFJfMk5EX0NZQ0xFKG5hbmRhZGRyZXNzKTsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBBRERSXzNSRF9DWUNMRShuYW5kYWRkcmVzcyk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgLyogKGhuYW5kLT5Db25maWcuUGFnZVNpemUpID4gNTEyICovCisgICAgeworICAgICAgaWYgKCgoaG5hbmQtPkNvbmZpZy5CbG9ja1NpemUpKihobmFuZC0+Q29uZmlnLkJsb2NrTmJyKSkgPD0gNjU1MzVVKQorICAgICAgeworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IDB4MDA7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gMHgwMDsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBBRERSXzFTVF9DWUNMRShuYW5kYWRkcmVzcyk7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8yTkRfQ1lDTEUobmFuZGFkZHJlc3MpOworICAgICAgfQorICAgICAgZWxzZSAvKiAoKGhuYW5kLT5Db25maWcuQmxvY2tTaXplKSooaG5hbmQtPkNvbmZpZy5CbG9ja05icikpID4gNjU1MzUgKi8KKyAgICAgIHsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSAweDAwOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IDB4MDA7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8xU1RfQ1lDTEUobmFuZGFkZHJlc3MpOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IEFERFJfMk5EX0NZQ0xFKG5hbmRhZGRyZXNzKTsKKyAgICAgICAgX19EU0IoKTsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBBRERSXzNSRF9DWUNMRShuYW5kYWRkcmVzcyk7CisgICAgICAgIF9fRFNCKCk7CisgICAgICB9CisgICAgfQorICAKKworICAgIC8qIFdyaXRlIGRhdGEgdG8gbWVtb3J5ICovCisgICAgZm9yKDsgaW5kZXggPCBzaXplOyBpbmRleCsrKQorICAgIHsKKyAgICAgICooX19JTyB1aW50OF90ICopZGV2aWNlYWRkcmVzcyA9ICoodWludDhfdCAqKXBCdWZmZXIrKzsKKyAgICB9CisgICAKKyAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBDTURfQVJFQSkpID0gTkFORF9DTURfV1JJVEVfVFJVRTE7CisgICAgCisgICAgLyogUmVhZCBzdGF0dXMgdW50aWwgTkFORCBpcyByZWFkeSAqLworICAgIHdoaWxlKEhBTF9OQU5EX1JlYWRfU3RhdHVzKGhuYW5kKSAhPSBOQU5EX1JFQURZKQorICAgIHsKKyAgICAgIC8qIEdldCB0aWNrICovCisgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgICAgCisgICAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gTkFORF9XUklURV9USU1FT1VUKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7IAorICAgICAgfQorICAgIH0KKyAKKyAgICAvKiBJbmNyZW1lbnQgd3JpdHRlbiBwYWdlcyBudW1iZXIgKi8KKyAgICBudW1QYWdlc1dyaXR0ZW4rKzsKKyAgICAKKyAgICAvKiBEZWNyZW1lbnQgcGFnZXMgdG8gd3JpdGUgKi8KKyAgICBOdW1QYWdlVG9Xcml0ZS0tOworICAgIAorICAgIC8qIEluY3JlbWVudCB0aGUgTkFORCBhZGRyZXNzICovCisgICAgbmFuZGFkZHJlc3MgPSAodWludDMyX3QpKG5hbmRhZGRyZXNzICsgMVUpOworICB9CisgIAorICAvKiBVcGRhdGUgdGhlIE5BTkQgY29udHJvbGxlciBzdGF0ZSAqLyAKKyAgaG5hbmQtPlN0YXRlID0gSEFMX05BTkRfU1RBVEVfUkVBRFk7CisgIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhobmFuZCk7CisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIFBhZ2UocykgdG8gTkFORCBtZW1vcnkgYmxvY2sgKDE2LWJpdHMgYWRkcmVzc2luZykKKyAgKiBAcGFyYW0gIGhuYW5kIHBvaW50ZXIgdG8gYSBOQU5EX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgTkFORCBtb2R1bGUuCisgICogQHBhcmFtICBwQWRkcmVzcyBwb2ludGVyIHRvIE5BTkQgYWRkcmVzcyBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gIHBCdWZmZXIgcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyIHRvIHdyaXRlLiBwQnVmZmVyIHNob3VsZCBiZSAxNmJpdHMgYWxpZ25lZAorICAqIEBwYXJhbSAgTnVtUGFnZVRvV3JpdGUgIDogbnVtYmVyIG9mIHBhZ2VzIHRvIHdyaXRlIHRvIGJsb2NrIAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX05BTkRfV3JpdGVfUGFnZV8xNmIoTkFORF9IYW5kbGVUeXBlRGVmICpobmFuZCwgTkFORF9BZGRyZXNzVHlwZURlZiAqcEFkZHJlc3MsIHVpbnQxNl90ICpwQnVmZmVyLCB1aW50MzJfdCBOdW1QYWdlVG9Xcml0ZSkKK3sKKyAgX19JTyB1aW50MzJfdCBpbmRleCA9IDBVOworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKyAgdWludDMyX3QgZGV2aWNlYWRkcmVzcyA9IDBVLCBzaXplID0gMFUsIG51bVBhZ2VzV3JpdHRlbiA9IDBVLCBuYW5kYWRkcmVzcyA9IDBVOworICAKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhobmFuZCk7ICAKKworICAvKiBDaGVjayB0aGUgTkFORCBjb250cm9sbGVyIHN0YXRlICovCisgIGlmKGhuYW5kLT5TdGF0ZSA9PSBIQUxfTkFORF9TVEFURV9CVVNZKQorICB7CisgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorICAKKyAgLyogSWRlbnRpZnkgdGhlIGRldmljZSBhZGRyZXNzICovCisgIGlmKGhuYW5kLT5Jbml0Lk5hbmRCYW5rID09IEZNQ19OQU5EX0JBTksyKQorICB7CisgICAgZGV2aWNlYWRkcmVzcyA9IE5BTkRfREVWSUNFMTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBkZXZpY2VhZGRyZXNzID0gTkFORF9ERVZJQ0UyOworICB9CisgIAorICAvKiBVcGRhdGUgdGhlIE5BTkQgY29udHJvbGxlciBzdGF0ZSAqLyAKKyAgaG5hbmQtPlN0YXRlID0gSEFMX05BTkRfU1RBVEVfQlVTWTsKKyAgCisgIC8qIE5BTkQgcmF3IGFkZHJlc3MgY2FsY3VsYXRpb24gKi8KKyAgbmFuZGFkZHJlc3MgPSBBUlJBWV9BRERSRVNTKHBBZGRyZXNzLCBobmFuZCk7CisgIAorICAvKiBQYWdlKHMpIHdyaXRlIGxvb3AgKi8KKyAgd2hpbGUoKE51bVBhZ2VUb1dyaXRlICE9IDBVKSAmJiAobmFuZGFkZHJlc3MgPCAoKGhuYW5kLT5Db25maWcuQmxvY2tTaXplKSAqIChobmFuZC0+Q29uZmlnLkJsb2NrTmJyKSkpKQorICB7CisgICAgLyogdXBkYXRlIHRoZSBidWZmZXIgc2l6ZSAqLworICAgIHNpemUgPSAoaG5hbmQtPkNvbmZpZy5QYWdlU2l6ZSkgKyAoKGhuYW5kLT5Db25maWcuUGFnZVNpemUpICogbnVtUGFnZXNXcml0dGVuKTsKKyAKKyAgICAvKiBTZW5kIHdyaXRlIHBhZ2UgY29tbWFuZCBzZXF1ZW5jZSAqLworICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IENNRF9BUkVBKSkgPSBOQU5EX0NNRF9BUkVBX0E7CisgICAgX19EU0IoKTsKKyAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBDTURfQVJFQSkpID0gTkFORF9DTURfV1JJVEUwOworICAgIF9fRFNCKCk7CisKKyAgICAvKiBDYXJkcyB3aXRoIHBhZ2Ugc2l6ZSA8PSA1MTIgYnl0ZXMgKi8KKyAgICBpZigoaG5hbmQtPkNvbmZpZy5QYWdlU2l6ZSkgPD0gNTEyVSkKKyAgICB7CisgICAgICBpZiAoKChobmFuZC0+Q29uZmlnLkJsb2NrU2l6ZSkqKGhuYW5kLT5Db25maWcuQmxvY2tOYnIpKSA8PSA2NTUzNVUpCisgICAgICB7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gMHgwMDsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBBRERSXzFTVF9DWUNMRShuYW5kYWRkcmVzcyk7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8yTkRfQ1lDTEUobmFuZGFkZHJlc3MpOworICAgICAgfQorICAgICAgZWxzZSAvKiAoKGhuYW5kLT5Db25maWcuQmxvY2tTaXplKSooaG5hbmQtPkNvbmZpZy5CbG9ja05icikpID4gNjU1MzUgKi8KKyAgICAgIHsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSAweDAwOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IEFERFJfMVNUX0NZQ0xFKG5hbmRhZGRyZXNzKTsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBBRERSXzJORF9DWUNMRShuYW5kYWRkcmVzcyk7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8zUkRfQ1lDTEUobmFuZGFkZHJlc3MpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIChobmFuZC0+Q29uZmlnLlBhZ2VTaXplKSA+IDUxMiAqLworICAgIHsKKyAgICAgIGlmICgoKGhuYW5kLT5Db25maWcuQmxvY2tTaXplKSooaG5hbmQtPkNvbmZpZy5CbG9ja05icikpIDw9IDY1NTM1VSkKKyAgICAgIHsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSAweDAwOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IDB4MDA7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8xU1RfQ1lDTEUobmFuZGFkZHJlc3MpOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IEFERFJfMk5EX0NZQ0xFKG5hbmRhZGRyZXNzKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgLyogKChobmFuZC0+Q29uZmlnLkJsb2NrU2l6ZSkqKGhuYW5kLT5Db25maWcuQmxvY2tOYnIpKSA+IDY1NTM1ICovCisgICAgICB7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gMHgwMDsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSAweDAwOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IEFERFJfMVNUX0NZQ0xFKG5hbmRhZGRyZXNzKTsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBBRERSXzJORF9DWUNMRShuYW5kYWRkcmVzcyk7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8zUkRfQ1lDTEUobmFuZGFkZHJlc3MpOworICAgICAgfQorICAgIH0KKyAgCisgICAgLyogV3JpdGUgZGF0YSB0byBtZW1vcnkgKi8KKyAgICBmb3IoOyBpbmRleCA8IHNpemU7IGluZGV4KyspCisgICAgeworICAgICAgKihfX0lPIHVpbnQxNl90ICopZGV2aWNlYWRkcmVzcyA9ICoodWludDE2X3QgKilwQnVmZmVyKys7CisgICAgfQorICAgCisgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQ01EX0FSRUEpKSA9IE5BTkRfQ01EX1dSSVRFX1RSVUUxOworICAgIAorICAgIC8qIFJlYWQgc3RhdHVzIHVudGlsIE5BTkQgaXMgcmVhZHkgKi8KKyAgICB3aGlsZShIQUxfTkFORF9SZWFkX1N0YXR1cyhobmFuZCkgIT0gTkFORF9SRUFEWSkKKyAgICB7CisgICAgICAvKiBHZXQgdGljayAqLworICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICAKKyAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBOQU5EX1dSSVRFX1RJTUVPVVQpCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsgCisgICAgICB9IAorICAgIH0gICAKKyAKKyAgICAvKiBJbmNyZW1lbnQgd3JpdHRlbiBwYWdlcyBudW1iZXIgKi8KKyAgICBudW1QYWdlc1dyaXR0ZW4rKzsKKyAgICAKKyAgICAvKiBEZWNyZW1lbnQgcGFnZXMgdG8gd3JpdGUgKi8KKyAgICBOdW1QYWdlVG9Xcml0ZS0tOworICAgIAorICAgIC8qIEluY3JlbWVudCB0aGUgTkFORCBhZGRyZXNzICovCisgICAgbmFuZGFkZHJlc3MgPSAodWludDMyX3QpKG5hbmRhZGRyZXNzICsgMVUpOworICB9CisgIAorICAvKiBVcGRhdGUgdGhlIE5BTkQgY29udHJvbGxlciBzdGF0ZSAqLyAKKyAgaG5hbmQtPlN0YXRlID0gSEFMX05BTkRfU1RBVEVfUkVBRFk7CisgIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhobmFuZCk7ICAgICAgCisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgU3BhcmUgYXJlYShzKSBmcm9tIE5BTkQgbWVtb3J5IAorICAqIEBwYXJhbSAgaG5hbmQgcG9pbnRlciB0byBhIE5BTkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBOQU5EIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBBZGRyZXNzIHBvaW50ZXIgdG8gTkFORCBhZGRyZXNzIHN0cnVjdHVyZQorICAqIEBwYXJhbSAgcEJ1ZmZlciBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIgdG8gd3JpdGUgIAorICAqIEBwYXJhbSAgTnVtU3BhcmVBcmVhVG9SZWFkIE51bWJlciBvZiBzcGFyZSBhcmVhIHRvIHJlYWQgIAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9OQU5EX1JlYWRfU3BhcmVBcmVhXzhiKE5BTkRfSGFuZGxlVHlwZURlZiAqaG5hbmQsIE5BTkRfQWRkcmVzc1R5cGVEZWYgKnBBZGRyZXNzLCB1aW50OF90ICpwQnVmZmVyLCB1aW50MzJfdCBOdW1TcGFyZUFyZWFUb1JlYWQpCit7CisgIF9fSU8gdWludDMyX3QgaW5kZXggPSAwVTsKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gMFU7CisgIHVpbnQzMl90IGRldmljZWFkZHJlc3MgPSAwVSwgc2l6ZSA9IDBVLCBudW1TcGFyZUFyZWFSZWFkID0gMFUsIG5hbmRhZGRyZXNzID0gMFUsIGNvbHVtbmFkZHJlc3MgPSAwVTsKKyAgCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaG5hbmQpOyAgCisgIAorICAvKiBDaGVjayB0aGUgTkFORCBjb250cm9sbGVyIHN0YXRlICovCisgIGlmKGhuYW5kLT5TdGF0ZSA9PSBIQUxfTkFORF9TVEFURV9CVVNZKQorICB7CisgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorICAKKyAgLyogSWRlbnRpZnkgdGhlIGRldmljZSBhZGRyZXNzICovCisgIGlmKGhuYW5kLT5Jbml0Lk5hbmRCYW5rID09IEZNQ19OQU5EX0JBTksyKQorICB7CisgICAgZGV2aWNlYWRkcmVzcyA9IE5BTkRfREVWSUNFMTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBkZXZpY2VhZGRyZXNzID0gTkFORF9ERVZJQ0UyOworICB9CisgIAorICAvKiBVcGRhdGUgdGhlIE5BTkQgY29udHJvbGxlciBzdGF0ZSAqLworICBobmFuZC0+U3RhdGUgPSBIQUxfTkFORF9TVEFURV9CVVNZOworICAKKyAgLyogTkFORCByYXcgYWRkcmVzcyBjYWxjdWxhdGlvbiAqLworICBuYW5kYWRkcmVzcyA9IEFSUkFZX0FERFJFU1MocEFkZHJlc3MsIGhuYW5kKTsKKyAgCisgIC8qIENvbHVtbiBpbiBwYWdlIGFkZHJlc3MgKi8KKyAgY29sdW1uYWRkcmVzcyA9IENPTFVNTl9BRERSRVNTKGhuYW5kKTsKKyAgCisgIC8qIFNwYXJlIGFyZWEocykgcmVhZCBsb29wICovIAorICB3aGlsZSgoTnVtU3BhcmVBcmVhVG9SZWFkICE9IDBVKSAmJiAobmFuZGFkZHJlc3MgPCAoKGhuYW5kLT5Db25maWcuQmxvY2tTaXplKSAqIChobmFuZC0+Q29uZmlnLkJsb2NrTmJyKSkpKQorICB7ICAgICAKKyAgICAvKiB1cGRhdGUgdGhlIGJ1ZmZlciBzaXplICovCisgICAgc2l6ZSA9IChobmFuZC0+Q29uZmlnLlNwYXJlQXJlYVNpemUpICsgKChobmFuZC0+Q29uZmlnLlNwYXJlQXJlYVNpemUpICogbnVtU3BhcmVBcmVhUmVhZCk7CisKKyAgICAvKiBDYXJkcyB3aXRoIHBhZ2Ugc2l6ZSA8PSA1MTIgYnl0ZXMgKi8KKyAgICBpZigoaG5hbmQtPkNvbmZpZy5QYWdlU2l6ZSkgPD0gNTEyVSkKKyAgICB7CisgICAgICAvKiBTZW5kIHJlYWQgc3BhcmUgYXJlYSBjb21tYW5kIHNlcXVlbmNlICovICAgICAKKyAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IENNRF9BUkVBKSkgPSBOQU5EX0NNRF9BUkVBX0M7CisgICAgICAKKyAgICAgIGlmICgoKGhuYW5kLT5Db25maWcuQmxvY2tTaXplKSooaG5hbmQtPkNvbmZpZy5CbG9ja05icikpIDw9IDY1NTM1VSkKKyAgICAgIHsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSAweDAwOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IEFERFJfMVNUX0NZQ0xFKG5hbmRhZGRyZXNzKTsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBBRERSXzJORF9DWUNMRShuYW5kYWRkcmVzcyk7CisgICAgICB9CisgICAgICBlbHNlIC8qICgoaG5hbmQtPkNvbmZpZy5CbG9ja1NpemUpKihobmFuZC0+Q29uZmlnLkJsb2NrTmJyKSkgPiA2NTUzNSAqLworICAgICAgeworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IDB4MDA7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8xU1RfQ1lDTEUobmFuZGFkZHJlc3MpOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IEFERFJfMk5EX0NZQ0xFKG5hbmRhZGRyZXNzKTsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBBRERSXzNSRF9DWUNMRShuYW5kYWRkcmVzcyk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgLyogKGhuYW5kLT5Db25maWcuUGFnZVNpemUpID4gNTEyICovCisgICAgeworICAgICAgLyogU2VuZCByZWFkIHNwYXJlIGFyZWEgY29tbWFuZCBzZXF1ZW5jZSAqLyAKKyAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IENNRF9BUkVBKSkgPSBOQU5EX0NNRF9BUkVBX0E7CisgICAgICAKKyAgICAgIGlmICgoKGhuYW5kLT5Db25maWcuQmxvY2tTaXplKSooaG5hbmQtPkNvbmZpZy5CbG9ja05icikpIDw9IDY1NTM1VSkKKyAgICAgIHsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBDT0xVTU5fMVNUX0NZQ0xFKGNvbHVtbmFkZHJlc3MpOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IENPTFVNTl8yTkRfQ1lDTEUoY29sdW1uYWRkcmVzcyk7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8xU1RfQ1lDTEUobmFuZGFkZHJlc3MpOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IEFERFJfMk5EX0NZQ0xFKG5hbmRhZGRyZXNzKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgLyogKChobmFuZC0+Q29uZmlnLkJsb2NrU2l6ZSkqKGhuYW5kLT5Db25maWcuQmxvY2tOYnIpKSA+IDY1NTM1ICovCisgICAgICB7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQ09MVU1OXzFTVF9DWUNMRShjb2x1bW5hZGRyZXNzKTsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBDT0xVTU5fMk5EX0NZQ0xFKGNvbHVtbmFkZHJlc3MpOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IEFERFJfMVNUX0NZQ0xFKG5hbmRhZGRyZXNzKTsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBBRERSXzJORF9DWUNMRShuYW5kYWRkcmVzcyk7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8zUkRfQ1lDTEUobmFuZGFkZHJlc3MpOworICAgICAgfQorICAgIH0KKworICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IENNRF9BUkVBKSkgPSBOQU5EX0NNRF9BUkVBX1RSVUUxOworICAgIAorICAgIGlmKGhuYW5kLT5Db25maWcuRXh0cmFDb21tYW5kRW5hYmxlID09IEVOQUJMRSkKKyAgICB7CisgICAgICAvKiBHZXQgdGljayAqLworICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICAgIAorICAgICAgLyogUmVhZCBzdGF0dXMgdW50aWwgTkFORCBpcyByZWFkeSAqLworICAgICAgd2hpbGUoSEFMX05BTkRfUmVhZF9TdGF0dXMoaG5hbmQpICE9IE5BTkRfUkVBRFkpCisgICAgICB7CisgICAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBOQU5EX1dSSVRFX1RJTUVPVVQpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7IAorICAgICAgICB9CisgICAgICB9CisgICAgICAKKyAgICAgIC8qIEdvIGJhY2sgdG8gcmVhZCBtb2RlICovCisgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBDTURfQVJFQSkpID0gKCh1aW50OF90KTB4MDApOworICAgIH0KKyAgICAKKyAgICAvKiBHZXQgRGF0YSBpbnRvIEJ1ZmZlciAqLworICAgIGZvcig7IGluZGV4IDwgc2l6ZTsgaW5kZXgrKykKKyAgICB7CisgICAgICAqKHVpbnQ4X3QgKilwQnVmZmVyKysgPSAqKHVpbnQ4X3QgKilkZXZpY2VhZGRyZXNzOworICAgIH0KKyAgICAKKyAgICAvKiBJbmNyZW1lbnQgcmVhZCBzcGFyZSBhcmVhcyBudW1iZXIgKi8KKyAgICBudW1TcGFyZUFyZWFSZWFkKys7CisgICAgCisgICAgLyogRGVjcmVtZW50IHNwYXJlIGFyZWFzIHRvIHJlYWQgKi8KKyAgICBOdW1TcGFyZUFyZWFUb1JlYWQtLTsKKyAgICAKKyAgICAvKiBJbmNyZW1lbnQgdGhlIE5BTkQgYWRkcmVzcyAqLworICAgIG5hbmRhZGRyZXNzID0gKHVpbnQzMl90KShuYW5kYWRkcmVzcyArIDFVKTsKKyAgfQorICAKKyAgLyogVXBkYXRlIHRoZSBOQU5EIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaG5hbmQtPlN0YXRlID0gSEFMX05BTkRfU1RBVEVfUkVBRFk7CisgIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhobmFuZCk7CisKKyAgcmV0dXJuIEhBTF9PSzsgIAorfQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgU3BhcmUgYXJlYShzKSBmcm9tIE5BTkQgbWVtb3J5ICgxNi1iaXRzIGFkZHJlc3NpbmcpCisgICogQHBhcmFtICBobmFuZCBwb2ludGVyIHRvIGEgTkFORF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIE5BTkQgbW9kdWxlLgorICAqIEBwYXJhbSAgcEFkZHJlc3MgcG9pbnRlciB0byBOQU5EIGFkZHJlc3Mgc3RydWN0dXJlCisgICogQHBhcmFtICBwQnVmZmVyIHBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlciB0byB3cml0ZS4gcEJ1ZmZlciBzaG91bGQgYmUgMTZiaXRzIGFsaWduZWQuCisgICogQHBhcmFtICBOdW1TcGFyZUFyZWFUb1JlYWQgTnVtYmVyIG9mIHNwYXJlIGFyZWEgdG8gcmVhZCAgCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX05BTkRfUmVhZF9TcGFyZUFyZWFfMTZiKE5BTkRfSGFuZGxlVHlwZURlZiAqaG5hbmQsIE5BTkRfQWRkcmVzc1R5cGVEZWYgKnBBZGRyZXNzLCB1aW50MTZfdCAqcEJ1ZmZlciwgdWludDMyX3QgTnVtU3BhcmVBcmVhVG9SZWFkKQoreworICBfX0lPIHVpbnQzMl90IGluZGV4ID0gMFU7IAorICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKyAgdWludDMyX3QgZGV2aWNlYWRkcmVzcyA9IDBVLCBzaXplID0gMFUsIG51bVNwYXJlQXJlYVJlYWQgPSAwVSwgbmFuZGFkZHJlc3MgPSAwVSwgY29sdW1uYWRkcmVzcyA9IDBVOworICAKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhobmFuZCk7CisgIAorICAvKiBDaGVjayB0aGUgTkFORCBjb250cm9sbGVyIHN0YXRlICovCisgIGlmKGhuYW5kLT5TdGF0ZSA9PSBIQUxfTkFORF9TVEFURV9CVVNZKQorICB7CisgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorICAKKyAgLyogSWRlbnRpZnkgdGhlIGRldmljZSBhZGRyZXNzICovCisgIGlmKGhuYW5kLT5Jbml0Lk5hbmRCYW5rID09IEZNQ19OQU5EX0JBTksyKQorICB7CisgICAgZGV2aWNlYWRkcmVzcyA9IE5BTkRfREVWSUNFMTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBkZXZpY2VhZGRyZXNzID0gTkFORF9ERVZJQ0UyOworICB9CisgIAorICAvKiBVcGRhdGUgdGhlIE5BTkQgY29udHJvbGxlciBzdGF0ZSAqLworICBobmFuZC0+U3RhdGUgPSBIQUxfTkFORF9TVEFURV9CVVNZOworICAKKyAgLyogTkFORCByYXcgYWRkcmVzcyBjYWxjdWxhdGlvbiAqLworICBuYW5kYWRkcmVzcyA9IEFSUkFZX0FERFJFU1MocEFkZHJlc3MsIGhuYW5kKTsKKyAgCisgIC8qIENvbHVtbiBpbiBwYWdlIGFkZHJlc3MgKi8KKyAgY29sdW1uYWRkcmVzcyA9ICh1aW50MzJfdCkoQ09MVU1OX0FERFJFU1MoaG5hbmQpICogMlUpOworICAKKyAgLyogU3BhcmUgYXJlYShzKSByZWFkIGxvb3AgKi8gCisgIHdoaWxlKChOdW1TcGFyZUFyZWFUb1JlYWQgIT0gMFUpICYmIChuYW5kYWRkcmVzcyA8ICgoaG5hbmQtPkNvbmZpZy5CbG9ja1NpemUpICogKGhuYW5kLT5Db25maWcuQmxvY2tOYnIpKSkpCisgIHsKKyAgICAvKiB1cGRhdGUgdGhlIGJ1ZmZlciBzaXplICovCisgICAgc2l6ZSA9IChobmFuZC0+Q29uZmlnLlNwYXJlQXJlYVNpemUpICsgKChobmFuZC0+Q29uZmlnLlNwYXJlQXJlYVNpemUpICogbnVtU3BhcmVBcmVhUmVhZCk7CisKKyAgICAvKiBDYXJkcyB3aXRoIHBhZ2Ugc2l6ZSA8PSA1MTIgYnl0ZXMgKi8KKyAgICBpZigoaG5hbmQtPkNvbmZpZy5QYWdlU2l6ZSkgPD0gNTEyVSkKKyAgICB7CisgICAgICAvKiBTZW5kIHJlYWQgc3BhcmUgYXJlYSBjb21tYW5kIHNlcXVlbmNlICovICAgICAKKyAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IENNRF9BUkVBKSkgPSBOQU5EX0NNRF9BUkVBX0M7CisgICAgICAKKyAgICAgIGlmICgoKGhuYW5kLT5Db25maWcuQmxvY2tTaXplKSooaG5hbmQtPkNvbmZpZy5CbG9ja05icikpIDw9IDY1NTM1VSkKKyAgICAgIHsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSAweDAwOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IEFERFJfMVNUX0NZQ0xFKG5hbmRhZGRyZXNzKTsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBBRERSXzJORF9DWUNMRShuYW5kYWRkcmVzcyk7CisgICAgICB9CisgICAgICBlbHNlIC8qICgoaG5hbmQtPkNvbmZpZy5CbG9ja1NpemUpKihobmFuZC0+Q29uZmlnLkJsb2NrTmJyKSkgPiA2NTUzNSAqLworICAgICAgeworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IDB4MDA7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8xU1RfQ1lDTEUobmFuZGFkZHJlc3MpOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IEFERFJfMk5EX0NZQ0xFKG5hbmRhZGRyZXNzKTsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBBRERSXzNSRF9DWUNMRShuYW5kYWRkcmVzcyk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgLyogKGhuYW5kLT5Db25maWcuUGFnZVNpemUpID4gNTEyICovCisgICAgeworICAgICAgLyogU2VuZCByZWFkIHNwYXJlIGFyZWEgY29tbWFuZCBzZXF1ZW5jZSAqLyAgICAgCisgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBDTURfQVJFQSkpID0gTkFORF9DTURfQVJFQV9BOworICAgICAgCisgICAgICBpZiAoKChobmFuZC0+Q29uZmlnLkJsb2NrU2l6ZSkqKGhuYW5kLT5Db25maWcuQmxvY2tOYnIpKSA8PSA2NTUzNVUpCisgICAgICB7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQ09MVU1OXzFTVF9DWUNMRShjb2x1bW5hZGRyZXNzKTsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBDT0xVTU5fMk5EX0NZQ0xFKGNvbHVtbmFkZHJlc3MpOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IEFERFJfMVNUX0NZQ0xFKG5hbmRhZGRyZXNzKTsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBBRERSXzJORF9DWUNMRShuYW5kYWRkcmVzcyk7CisgICAgICB9CisgICAgICBlbHNlIC8qICgoaG5hbmQtPkNvbmZpZy5CbG9ja1NpemUpKihobmFuZC0+Q29uZmlnLkJsb2NrTmJyKSkgPiA2NTUzNSAqLworICAgICAgeworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IENPTFVNTl8xU1RfQ1lDTEUoY29sdW1uYWRkcmVzcyk7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQ09MVU1OXzJORF9DWUNMRShjb2x1bW5hZGRyZXNzKTsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBBRERSXzFTVF9DWUNMRShuYW5kYWRkcmVzcyk7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8yTkRfQ1lDTEUobmFuZGFkZHJlc3MpOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IEFERFJfM1JEX0NZQ0xFKG5hbmRhZGRyZXNzKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBDTURfQVJFQSkpID0gTkFORF9DTURfQVJFQV9UUlVFMTsKKworICAgIGlmKGhuYW5kLT5Db25maWcuRXh0cmFDb21tYW5kRW5hYmxlID09IEVOQUJMRSkKKyAgICB7CisgICAgICAvKiBHZXQgdGljayAqLworICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICAgIAorICAgICAgLyogUmVhZCBzdGF0dXMgdW50aWwgTkFORCBpcyByZWFkeSAqLworICAgICAgd2hpbGUoSEFMX05BTkRfUmVhZF9TdGF0dXMoaG5hbmQpICE9IE5BTkRfUkVBRFkpCisgICAgICB7CisgICAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBOQU5EX1dSSVRFX1RJTUVPVVQpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7IAorICAgICAgICB9CisgICAgICB9CisgICAgICAKKyAgICAgIC8qIEdvIGJhY2sgdG8gcmVhZCBtb2RlICovCisgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBDTURfQVJFQSkpID0gKCh1aW50OF90KTB4MDApOworICAgIH0KKyAgICAKKyAgICAvKiBHZXQgRGF0YSBpbnRvIEJ1ZmZlciAqLworICAgIGZvcig7IGluZGV4IDwgc2l6ZTsgaW5kZXgrKykKKyAgICB7CisgICAgICAqKHVpbnQxNl90ICopcEJ1ZmZlcisrID0gKih1aW50MTZfdCAqKWRldmljZWFkZHJlc3M7CisgICAgfQorICAgIAorICAgIC8qIEluY3JlbWVudCByZWFkIHNwYXJlIGFyZWFzIG51bWJlciAqLworICAgIG51bVNwYXJlQXJlYVJlYWQrKzsKKyAgICAKKyAgICAvKiBEZWNyZW1lbnQgc3BhcmUgYXJlYXMgdG8gcmVhZCAqLworICAgIE51bVNwYXJlQXJlYVRvUmVhZC0tOworICAgIAorICAgIC8qIEluY3JlbWVudCB0aGUgTkFORCBhZGRyZXNzICovCisgICAgbmFuZGFkZHJlc3MgPSAodWludDMyX3QpKG5hbmRhZGRyZXNzICsgMVUpOworICB9CisgIAorICAvKiBVcGRhdGUgdGhlIE5BTkQgY29udHJvbGxlciBzdGF0ZSAqLworICBobmFuZC0+U3RhdGUgPSBIQUxfTkFORF9TVEFURV9SRUFEWTsKKyAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhuYW5kKTsgICAgIAorCisgIHJldHVybiBIQUxfT0s7ICAKK30KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBTcGFyZSBhcmVhKHMpIHRvIE5BTkQgbWVtb3J5IAorICAqIEBwYXJhbSAgaG5hbmQgcG9pbnRlciB0byBhIE5BTkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBOQU5EIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBBZGRyZXNzIHBvaW50ZXIgdG8gTkFORCBhZGRyZXNzIHN0cnVjdHVyZQorICAqIEBwYXJhbSAgcEJ1ZmZlciBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIgdG8gd3JpdGUgIAorICAqIEBwYXJhbSAgTnVtU3BhcmVBcmVhVG93cml0ZSAgOiBudW1iZXIgb2Ygc3BhcmUgYXJlYXMgdG8gd3JpdGUgdG8gYmxvY2sKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9OQU5EX1dyaXRlX1NwYXJlQXJlYV84YihOQU5EX0hhbmRsZVR5cGVEZWYgKmhuYW5kLCBOQU5EX0FkZHJlc3NUeXBlRGVmICpwQWRkcmVzcywgdWludDhfdCAqcEJ1ZmZlciwgdWludDMyX3QgTnVtU3BhcmVBcmVhVG93cml0ZSkKK3sKKyAgX19JTyB1aW50MzJfdCBpbmRleCA9IDBVOworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKyAgdWludDMyX3QgZGV2aWNlYWRkcmVzcyA9IDBVLCBzaXplID0gMFUsIG51bVNwYXJlQXJlYVdyaXR0ZW4gPSAwVSwgbmFuZGFkZHJlc3MgPSAwVSwgY29sdW1uYWRkcmVzcyA9IDBVOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaG5hbmQpOyAKKyAgCisgIC8qIENoZWNrIHRoZSBOQU5EIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaWYoaG5hbmQtPlN0YXRlID09IEhBTF9OQU5EX1NUQVRFX0JVU1kpCisgIHsKKyAgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisgIAorICAvKiBJZGVudGlmeSB0aGUgZGV2aWNlIGFkZHJlc3MgKi8KKyAgaWYoaG5hbmQtPkluaXQuTmFuZEJhbmsgPT0gRk1DX05BTkRfQkFOSzIpCisgIHsKKyAgICBkZXZpY2VhZGRyZXNzID0gTkFORF9ERVZJQ0UxOworICB9CisgIGVsc2UKKyAgeworICAgIGRldmljZWFkZHJlc3MgPSBOQU5EX0RFVklDRTI7CisgIH0KKyAgCisgIC8qIFVwZGF0ZSB0aGUgRk1DX05BTkQgY29udHJvbGxlciBzdGF0ZSAqLworICBobmFuZC0+U3RhdGUgPSBIQUxfTkFORF9TVEFURV9CVVNZOyAgCisgIAorICAvKiBQYWdlIGFkZHJlc3MgY2FsY3VsYXRpb24gKi8KKyAgbmFuZGFkZHJlc3MgPSBBUlJBWV9BRERSRVNTKHBBZGRyZXNzLCBobmFuZCk7IAorICAKKyAgLyogQ29sdW1uIGluIHBhZ2UgYWRkcmVzcyAqLworICBjb2x1bW5hZGRyZXNzID0gQ09MVU1OX0FERFJFU1MoaG5hbmQpOworICAKKyAgLyogU3BhcmUgYXJlYShzKSB3cml0ZSBsb29wICovCisgIHdoaWxlKChOdW1TcGFyZUFyZWFUb3dyaXRlICE9IDBVKSAmJiAobmFuZGFkZHJlc3MgPCAoKGhuYW5kLT5Db25maWcuQmxvY2tTaXplKSAqIChobmFuZC0+Q29uZmlnLkJsb2NrTmJyKSkpKQorICB7CisgICAgLyogdXBkYXRlIHRoZSBidWZmZXIgc2l6ZSAqLworICAgIHNpemUgPSAoaG5hbmQtPkNvbmZpZy5TcGFyZUFyZWFTaXplKSArICgoaG5hbmQtPkNvbmZpZy5TcGFyZUFyZWFTaXplKSAqIG51bVNwYXJlQXJlYVdyaXR0ZW4pOworCisgICAgLyogQ2FyZHMgd2l0aCBwYWdlIHNpemUgPD0gNTEyIGJ5dGVzICovCisgICAgaWYoKGhuYW5kLT5Db25maWcuUGFnZVNpemUpIDw9IDUxMlUpCisgICAgeworICAgICAgLyogU2VuZCB3cml0ZSBTcGFyZSBhcmVhIGNvbW1hbmQgc2VxdWVuY2UgKi8KKyAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IENNRF9BUkVBKSkgPSBOQU5EX0NNRF9BUkVBX0M7CisgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBDTURfQVJFQSkpID0gTkFORF9DTURfV1JJVEUwOworICAgICAgCisgICAgICBpZiAoKChobmFuZC0+Q29uZmlnLkJsb2NrU2l6ZSkqKGhuYW5kLT5Db25maWcuQmxvY2tOYnIpKSA8PSA2NTUzNVUpCisgICAgICB7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gMHgwMDsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBBRERSXzFTVF9DWUNMRShuYW5kYWRkcmVzcyk7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8yTkRfQ1lDTEUobmFuZGFkZHJlc3MpOworICAgICAgfQorICAgICAgZWxzZSAvKiAoKGhuYW5kLT5Db25maWcuQmxvY2tTaXplKSooaG5hbmQtPkNvbmZpZy5CbG9ja05icikpID4gNjU1MzUgKi8KKyAgICAgIHsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSAweDAwOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IEFERFJfMVNUX0NZQ0xFKG5hbmRhZGRyZXNzKTsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBBRERSXzJORF9DWUNMRShuYW5kYWRkcmVzcyk7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8zUkRfQ1lDTEUobmFuZGFkZHJlc3MpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIChobmFuZC0+Q29uZmlnLlBhZ2VTaXplKSA+IDUxMiAqLworICAgIHsKKyAgICAgIC8qIFNlbmQgd3JpdGUgU3BhcmUgYXJlYSBjb21tYW5kIHNlcXVlbmNlICovCisgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBDTURfQVJFQSkpID0gTkFORF9DTURfQVJFQV9BOworICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQ01EX0FSRUEpKSA9IE5BTkRfQ01EX1dSSVRFMDsKKyAgICAKKyAgICAgIGlmICgoKGhuYW5kLT5Db25maWcuQmxvY2tTaXplKSooaG5hbmQtPkNvbmZpZy5CbG9ja05icikpIDw9IDY1NTM1VSkKKyAgICAgIHsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBDT0xVTU5fMVNUX0NZQ0xFKGNvbHVtbmFkZHJlc3MpOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IENPTFVNTl8yTkRfQ1lDTEUoY29sdW1uYWRkcmVzcyk7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8xU1RfQ1lDTEUobmFuZGFkZHJlc3MpOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IEFERFJfMk5EX0NZQ0xFKG5hbmRhZGRyZXNzKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgLyogKChobmFuZC0+Q29uZmlnLkJsb2NrU2l6ZSkqKGhuYW5kLT5Db25maWcuQmxvY2tOYnIpKSA+IDY1NTM1ICovCisgICAgICB7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQ09MVU1OXzFTVF9DWUNMRShjb2x1bW5hZGRyZXNzKTsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBDT0xVTU5fMk5EX0NZQ0xFKGNvbHVtbmFkZHJlc3MpOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IEFERFJfMVNUX0NZQ0xFKG5hbmRhZGRyZXNzKTsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBBRERSXzJORF9DWUNMRShuYW5kYWRkcmVzcyk7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8zUkRfQ1lDTEUobmFuZGFkZHJlc3MpOworICAgICAgfQorICAgIH0KKyAgCisgICAgLyogV3JpdGUgZGF0YSB0byBtZW1vcnkgKi8KKyAgICBmb3IoOyBpbmRleCA8IHNpemU7IGluZGV4KyspCisgICAgeworICAgICAgKihfX0lPIHVpbnQ4X3QgKilkZXZpY2VhZGRyZXNzID0gKih1aW50OF90ICopcEJ1ZmZlcisrOworICAgIH0KKyAgIAorICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IENNRF9BUkVBKSkgPSBOQU5EX0NNRF9XUklURV9UUlVFMTsKKyAgICAKKyAgICAvKiBHZXQgdGljayAqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgICAgCisgICAgLyogUmVhZCBzdGF0dXMgdW50aWwgTkFORCBpcyByZWFkeSAqLworICAgIHdoaWxlKEhBTF9OQU5EX1JlYWRfU3RhdHVzKGhuYW5kKSAhPSBOQU5EX1JFQURZKQorICAgIHsKKyAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBOQU5EX1dSSVRFX1RJTUVPVVQpCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsgCisgICAgICB9CisgICAgfQorCisgICAgLyogSW5jcmVtZW50IHdyaXR0ZW4gc3BhcmUgYXJlYXMgbnVtYmVyICovCisgICAgbnVtU3BhcmVBcmVhV3JpdHRlbisrOworICAgIAorICAgIC8qIERlY3JlbWVudCBzcGFyZSBhcmVhcyB0byB3cml0ZSAqLworICAgIE51bVNwYXJlQXJlYVRvd3JpdGUtLTsKKyAgICAKKyAgICAvKiBJbmNyZW1lbnQgdGhlIE5BTkQgYWRkcmVzcyAqLworICAgIG5hbmRhZGRyZXNzID0gKHVpbnQzMl90KShuYW5kYWRkcmVzcyArIDFVKTsKKyAgfQorCisgIC8qIFVwZGF0ZSB0aGUgTkFORCBjb250cm9sbGVyIHN0YXRlICovCisgIGhuYW5kLT5TdGF0ZSA9IEhBTF9OQU5EX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhuYW5kKTsKKyAgICAKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBTcGFyZSBhcmVhKHMpIHRvIE5BTkQgbWVtb3J5ICgxNi1iaXRzIGFkZHJlc3NpbmcpCisgICogQHBhcmFtICBobmFuZCBwb2ludGVyIHRvIGEgTkFORF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIE5BTkQgbW9kdWxlLgorICAqIEBwYXJhbSAgcEFkZHJlc3MgcG9pbnRlciB0byBOQU5EIGFkZHJlc3Mgc3RydWN0dXJlCisgICogQHBhcmFtICBwQnVmZmVyIHBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlciB0byB3cml0ZS4gcEJ1ZmZlciBzaG91bGQgYmUgMTZiaXRzIGFsaWduZWQuICAKKyAgKiBAcGFyYW0gIE51bVNwYXJlQXJlYVRvd3JpdGUgIDogbnVtYmVyIG9mIHNwYXJlIGFyZWFzIHRvIHdyaXRlIHRvIGJsb2NrCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTkFORF9Xcml0ZV9TcGFyZUFyZWFfMTZiKE5BTkRfSGFuZGxlVHlwZURlZiAqaG5hbmQsIE5BTkRfQWRkcmVzc1R5cGVEZWYgKnBBZGRyZXNzLCB1aW50MTZfdCAqcEJ1ZmZlciwgdWludDMyX3QgTnVtU3BhcmVBcmVhVG93cml0ZSkKK3sKKyAgX19JTyB1aW50MzJfdCBpbmRleCA9IDBVOworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKyAgdWludDMyX3QgZGV2aWNlYWRkcmVzcyA9IDBVLCBzaXplID0gMFUsIG51bVNwYXJlQXJlYVdyaXR0ZW4gPSAwVSwgbmFuZGFkZHJlc3MgPSAwVSwgY29sdW1uYWRkcmVzcyA9IDBVOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaG5hbmQpOyAKKyAgCisgIC8qIENoZWNrIHRoZSBOQU5EIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaWYoaG5hbmQtPlN0YXRlID09IEhBTF9OQU5EX1NUQVRFX0JVU1kpCisgIHsKKyAgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisgIAorICAvKiBJZGVudGlmeSB0aGUgZGV2aWNlIGFkZHJlc3MgKi8KKyAgaWYoaG5hbmQtPkluaXQuTmFuZEJhbmsgPT0gRk1DX05BTkRfQkFOSzIpCisgIHsKKyAgICBkZXZpY2VhZGRyZXNzID0gTkFORF9ERVZJQ0UxOworICB9CisgIGVsc2UKKyAgeworICAgIGRldmljZWFkZHJlc3MgPSBOQU5EX0RFVklDRTI7CisgIH0KKyAgCisgIC8qIFVwZGF0ZSB0aGUgRk1DX05BTkQgY29udHJvbGxlciBzdGF0ZSAqLworICBobmFuZC0+U3RhdGUgPSBIQUxfTkFORF9TVEFURV9CVVNZOyAgCisgIAorICAvKiBOQU5EIHJhdyBhZGRyZXNzIGNhbGN1bGF0aW9uICovCisgIG5hbmRhZGRyZXNzID0gQVJSQVlfQUREUkVTUyhwQWRkcmVzcywgaG5hbmQpOworICAKKyAgLyogQ29sdW1uIGluIHBhZ2UgYWRkcmVzcyAqLworICBjb2x1bW5hZGRyZXNzID0gKHVpbnQzMl90KShDT0xVTU5fQUREUkVTUyhobmFuZCkgKiAyVSk7CisgIAorICAvKiBTcGFyZSBhcmVhKHMpIHdyaXRlIGxvb3AgKi8KKyAgd2hpbGUoKE51bVNwYXJlQXJlYVRvd3JpdGUgIT0gMFUpICYmIChuYW5kYWRkcmVzcyA8ICgoaG5hbmQtPkNvbmZpZy5CbG9ja1NpemUpICogKGhuYW5kLT5Db25maWcuQmxvY2tOYnIpKSkpCisgIHsKKyAgICAvKiB1cGRhdGUgdGhlIGJ1ZmZlciBzaXplICovCisgICAgc2l6ZSA9IChobmFuZC0+Q29uZmlnLlNwYXJlQXJlYVNpemUpICsgKChobmFuZC0+Q29uZmlnLlNwYXJlQXJlYVNpemUpICogbnVtU3BhcmVBcmVhV3JpdHRlbik7CisKKyAgICAvKiBDYXJkcyB3aXRoIHBhZ2Ugc2l6ZSA8PSA1MTIgYnl0ZXMgKi8KKyAgICBpZigoaG5hbmQtPkNvbmZpZy5QYWdlU2l6ZSkgPD0gNTEyVSkKKyAgICB7CisgICAgICAvKiBTZW5kIHdyaXRlIFNwYXJlIGFyZWEgY29tbWFuZCBzZXF1ZW5jZSAqLworICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQ01EX0FSRUEpKSA9IE5BTkRfQ01EX0FSRUFfQzsKKyAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IENNRF9BUkVBKSkgPSBOQU5EX0NNRF9XUklURTA7CisgICAgCisgICAgICBpZiAoKChobmFuZC0+Q29uZmlnLkJsb2NrU2l6ZSkqKGhuYW5kLT5Db25maWcuQmxvY2tOYnIpKSA8PSA2NTUzNVUpCisgICAgICB7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gMHgwMDsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBBRERSXzFTVF9DWUNMRShuYW5kYWRkcmVzcyk7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8yTkRfQ1lDTEUobmFuZGFkZHJlc3MpOworICAgICAgfQorICAgICAgZWxzZSAvKiAoKGhuYW5kLT5Db25maWcuQmxvY2tTaXplKSooaG5hbmQtPkNvbmZpZy5CbG9ja05icikpID4gNjU1MzUgKi8KKyAgICAgIHsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSAweDAwOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IEFERFJfMVNUX0NZQ0xFKG5hbmRhZGRyZXNzKTsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBBRERSXzJORF9DWUNMRShuYW5kYWRkcmVzcyk7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8zUkRfQ1lDTEUobmFuZGFkZHJlc3MpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIChobmFuZC0+Q29uZmlnLlBhZ2VTaXplKSA+IDUxMiAqLworICAgIHsKKyAgICAgIC8qIFNlbmQgd3JpdGUgU3BhcmUgYXJlYSBjb21tYW5kIHNlcXVlbmNlICovCisgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBDTURfQVJFQSkpID0gTkFORF9DTURfQVJFQV9BOworICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQ01EX0FSRUEpKSA9IE5BTkRfQ01EX1dSSVRFMDsKKyAgICAKKyAgICAgIGlmICgoKGhuYW5kLT5Db25maWcuQmxvY2tTaXplKSooaG5hbmQtPkNvbmZpZy5CbG9ja05icikpIDw9IDY1NTM1VSkKKyAgICAgIHsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBDT0xVTU5fMVNUX0NZQ0xFKGNvbHVtbmFkZHJlc3MpOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IENPTFVNTl8yTkRfQ1lDTEUoY29sdW1uYWRkcmVzcyk7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8xU1RfQ1lDTEUobmFuZGFkZHJlc3MpOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IEFERFJfMk5EX0NZQ0xFKG5hbmRhZGRyZXNzKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgLyogKChobmFuZC0+Q29uZmlnLkJsb2NrU2l6ZSkqKGhuYW5kLT5Db25maWcuQmxvY2tOYnIpKSA+IDY1NTM1ICovCisgICAgICB7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQ09MVU1OXzFTVF9DWUNMRShjb2x1bW5hZGRyZXNzKTsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBDT0xVTU5fMk5EX0NZQ0xFKGNvbHVtbmFkZHJlc3MpOworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IEFERFJfMVNUX0NZQ0xFKG5hbmRhZGRyZXNzKTsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBBRERSXzJORF9DWUNMRShuYW5kYWRkcmVzcyk7CisgICAgICAgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8zUkRfQ1lDTEUobmFuZGFkZHJlc3MpOworICAgICAgfQorICAgIH0KKyAgCisgICAgLyogV3JpdGUgZGF0YSB0byBtZW1vcnkgKi8KKyAgICBmb3IoOyBpbmRleCA8IHNpemU7IGluZGV4KyspCisgICAgeworICAgICAgKihfX0lPIHVpbnQxNl90ICopZGV2aWNlYWRkcmVzcyA9ICoodWludDE2X3QgKilwQnVmZmVyKys7CisgICAgfQorICAgCisgICAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQ01EX0FSRUEpKSA9IE5BTkRfQ01EX1dSSVRFX1RSVUUxOworICAgCisgICAgLyogUmVhZCBzdGF0dXMgdW50aWwgTkFORCBpcyByZWFkeSAqLworICAgIHdoaWxlKEhBTF9OQU5EX1JlYWRfU3RhdHVzKGhuYW5kKSAhPSBOQU5EX1JFQURZKQorICAgIHsKKyAgICAgIC8qIEdldCB0aWNrICovCisgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgIAorICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IE5BTkRfV1JJVEVfVElNRU9VVCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOyAKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJbmNyZW1lbnQgd3JpdHRlbiBzcGFyZSBhcmVhcyBudW1iZXIgKi8KKyAgICBudW1TcGFyZUFyZWFXcml0dGVuKys7CisgICAgCisgICAgLyogRGVjcmVtZW50IHNwYXJlIGFyZWFzIHRvIHdyaXRlICovCisgICAgTnVtU3BhcmVBcmVhVG93cml0ZS0tOworICAgIAorICAgIC8qIEluY3JlbWVudCB0aGUgTkFORCBhZGRyZXNzICovCisgICAgbmFuZGFkZHJlc3MgPSAodWludDMyX3QpKG5hbmRhZGRyZXNzICsgMVUpOworICB9CisKKyAgLyogVXBkYXRlIHRoZSBOQU5EIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaG5hbmQtPlN0YXRlID0gSEFMX05BTkRfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaG5hbmQpOworCisgIHJldHVybiBIQUxfT0s7ICAKK30KKworLyoqCisgICogQGJyaWVmICBOQU5EIG1lbW9yeSBCbG9jayBlcmFzZSAKKyAgKiBAcGFyYW0gIGhuYW5kIHBvaW50ZXIgdG8gYSBOQU5EX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgTkFORCBtb2R1bGUuCisgICogQHBhcmFtICBwQWRkcmVzcyBwb2ludGVyIHRvIE5BTkQgYWRkcmVzcyBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9OQU5EX0VyYXNlX0Jsb2NrKE5BTkRfSGFuZGxlVHlwZURlZiAqaG5hbmQsIE5BTkRfQWRkcmVzc1R5cGVEZWYgKnBBZGRyZXNzKQoreworICB1aW50MzJfdCBkZXZpY2VhZGRyZXNzID0gMFU7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDBVOworICAKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhobmFuZCk7CisgIAorICAvKiBDaGVjayB0aGUgTkFORCBjb250cm9sbGVyIHN0YXRlICovCisgIGlmKGhuYW5kLT5TdGF0ZSA9PSBIQUxfTkFORF9TVEFURV9CVVNZKQorICB7CisgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorICAKKyAgLyogSWRlbnRpZnkgdGhlIGRldmljZSBhZGRyZXNzICovCisgIGlmKGhuYW5kLT5Jbml0Lk5hbmRCYW5rID09IEZNQ19OQU5EX0JBTksyKQorICB7CisgICAgZGV2aWNlYWRkcmVzcyA9IE5BTkRfREVWSUNFMTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBkZXZpY2VhZGRyZXNzID0gTkFORF9ERVZJQ0UyOworICB9CisgIAorICAvKiBVcGRhdGUgdGhlIE5BTkQgY29udHJvbGxlciBzdGF0ZSAqLworICBobmFuZC0+U3RhdGUgPSBIQUxfTkFORF9TVEFURV9CVVNZOyAgCisgIAorICAvKiBTZW5kIEVyYXNlIGJsb2NrIGNvbW1hbmQgc2VxdWVuY2UgKi8KKyAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQ01EX0FSRUEpKSA9IE5BTkRfQ01EX0VSQVNFMDsKKworICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBBRERSX0FSRUEpKSA9IEFERFJfMVNUX0NZQ0xFKEFSUkFZX0FERFJFU1MocEFkZHJlc3MsIGhuYW5kKSk7CisgICooX19JTyB1aW50OF90ICopKCh1aW50MzJfdCkoZGV2aWNlYWRkcmVzcyB8IEFERFJfQVJFQSkpID0gQUREUl8yTkRfQ1lDTEUoQVJSQVlfQUREUkVTUyhwQWRkcmVzcywgaG5hbmQpKTsKKyAgKihfX0lPIHVpbnQ4X3QgKikoKHVpbnQzMl90KShkZXZpY2VhZGRyZXNzIHwgQUREUl9BUkVBKSkgPSBBRERSXzNSRF9DWUNMRShBUlJBWV9BRERSRVNTKHBBZGRyZXNzLCBobmFuZCkpOworICAgIAorICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBDTURfQVJFQSkpID0gTkFORF9DTURfRVJBU0UxOyAKKyAgCisgIC8qIFVwZGF0ZSB0aGUgTkFORCBjb250cm9sbGVyIHN0YXRlICovCisgIGhuYW5kLT5TdGF0ZSA9IEhBTF9OQU5EX1NUQVRFX1JFQURZOworICAKKyAgLyogR2V0IHRpY2sgKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgCisgIC8qIFJlYWQgc3RhdHVzIHVudGlsIE5BTkQgaXMgcmVhZHkgKi8KKyAgd2hpbGUoSEFMX05BTkRfUmVhZF9TdGF0dXMoaG5hbmQpICE9IE5BTkRfUkVBRFkpCisgIHsKKyAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gTkFORF9XUklURV9USU1FT1VUKQorICAgIHsKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhobmFuZCk7ICAgIAorICAKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsgCisgICAgfSAKKyAgfSAgICAKKyAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaG5hbmQpOyAgICAKKyAgCisgIHJldHVybiBIQUxfT0s7ICAKK30KKworLyoqCisgICogQGJyaWVmICBOQU5EIG1lbW9yeSByZWFkIHN0YXR1cyAKKyAgKiBAcGFyYW0gIGhuYW5kIHBvaW50ZXIgdG8gYSBOQU5EX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgTkFORCBtb2R1bGUuCisgICogQHJldHZhbCBOQU5EIHN0YXR1cworICAqLwordWludDMyX3QgSEFMX05BTkRfUmVhZF9TdGF0dXMoTkFORF9IYW5kbGVUeXBlRGVmICpobmFuZCkKK3sKKyAgdWludDMyX3QgZGF0YSA9IDBVOworICB1aW50MzJfdCBkZXZpY2VhZGRyZXNzID0gMFU7CisgIAorICAvKiBJZGVudGlmeSB0aGUgZGV2aWNlIGFkZHJlc3MgKi8KKyAgaWYoaG5hbmQtPkluaXQuTmFuZEJhbmsgPT0gRk1DX05BTkRfQkFOSzIpCisgIHsKKyAgICBkZXZpY2VhZGRyZXNzID0gTkFORF9ERVZJQ0UxOworICB9CisgIGVsc2UKKyAgeworICAgIGRldmljZWFkZHJlc3MgPSBOQU5EX0RFVklDRTI7CisgIH0gCisKKyAgLyogU2VuZCBSZWFkIHN0YXR1cyBvcGVyYXRpb24gY29tbWFuZCAqLworICAqKF9fSU8gdWludDhfdCAqKSgodWludDMyX3QpKGRldmljZWFkZHJlc3MgfCBDTURfQVJFQSkpID0gTkFORF9DTURfU1RBVFVTOworICAKKyAgLyogUmVhZCBzdGF0dXMgcmVnaXN0ZXIgZGF0YSAqLworICBkYXRhID0gKihfX0lPIHVpbnQ4X3QgKilkZXZpY2VhZGRyZXNzOworCisgIC8qIFJldHVybiB0aGUgc3RhdHVzICovCisgIGlmKChkYXRhICYgTkFORF9FUlJPUikgPT0gTkFORF9FUlJPUikKKyAgeworICAgIHJldHVybiBOQU5EX0VSUk9SOworICB9IAorICBlbHNlIGlmKChkYXRhICYgTkFORF9SRUFEWSkgPT0gTkFORF9SRUFEWSkKKyAgeworICAgIHJldHVybiBOQU5EX1JFQURZOworICB9CisKKyAgcmV0dXJuIE5BTkRfQlVTWTsgCit9CisKKy8qKgorICAqIEBicmllZiAgSW5jcmVtZW50IHRoZSBOQU5EIG1lbW9yeSBhZGRyZXNzCisgICogQHBhcmFtICBobmFuZCBwb2ludGVyIHRvIGEgTkFORF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIE5BTkQgbW9kdWxlLgorICAqIEBwYXJhbSBwQWRkcmVzcyBwb2ludGVyIHRvIE5BTkQgYWRkcmVzcyBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdHVzIG9mIHRoZSBpbmNyZW1lbnQgYWRkcmVzcyBvcGVyYXRpb24uIEl0IGNhbiBiZToKKyAgKiAgICAgICAgICAgLSBOQU5EX1ZBTElEX0FERFJFU1M6IFdoZW4gdGhlIG5ldyBhZGRyZXNzIGlzIHZhbGlkIGFkZHJlc3MKKyAgKiAgICAgICAgICAgLSBOQU5EX0lOVkFMSURfQUREUkVTUzogV2hlbiB0aGUgbmV3IGFkZHJlc3MgaXMgaW52YWxpZCBhZGRyZXNzCisgICovCit1aW50MzJfdCBIQUxfTkFORF9BZGRyZXNzX0luYyhOQU5EX0hhbmRsZVR5cGVEZWYgKmhuYW5kLCBOQU5EX0FkZHJlc3NUeXBlRGVmICpwQWRkcmVzcykKK3sKKyAgdWludDMyX3Qgc3RhdHVzID0gTkFORF9WQUxJRF9BRERSRVNTOworIAorICAvKiBJbmNyZW1lbnQgcGFnZSBhZGRyZXNzICovCisgIHBBZGRyZXNzLT5QYWdlKys7CisKKyAgLyogQ2hlY2sgTkFORCBhZGRyZXNzIGlzIHZhbGlkICovCisgIGlmKHBBZGRyZXNzLT5QYWdlID09IGhuYW5kLT5Db25maWcuQmxvY2tTaXplKQorICB7CisgICAgcEFkZHJlc3MtPlBhZ2UgPSAwVTsKKyAgICBwQWRkcmVzcy0+QmxvY2srKzsKKyAgICAKKyAgICBpZihwQWRkcmVzcy0+QmxvY2sgPT0gaG5hbmQtPkNvbmZpZy5QbGFuZVNpemUpCisgICAgeworICAgICAgcEFkZHJlc3MtPkJsb2NrID0gMFU7CisgICAgICBwQWRkcmVzcy0+UGxhbmUrKzsKKworICAgICAgaWYocEFkZHJlc3MtPlBsYW5lID09IChobmFuZC0+Q29uZmlnLlBsYW5lTmJyKSkKKyAgICAgIHsKKyAgICAgICAgc3RhdHVzID0gTkFORF9JTlZBTElEX0FERFJFU1M7CisgICAgICB9CisgICAgfQorICB9IAorICAKKyAgcmV0dXJuIChzdGF0dXMpOworfQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBOQU5EX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAKKyAqICBAYnJpZWYgICBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAKKyAqCitAdmVyYmF0aW0gICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgTkFORCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb250cm9sIGR5bmFtaWNhbGx5CisgICAgdGhlIE5BTkQgaW50ZXJmYWNlLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLyAKKworICAgIAorLyoqCisgICogQGJyaWVmICBFbmFibGVzIGR5bmFtaWNhbGx5IE5BTkQgRUNDIGZlYXR1cmUuCisgICogQHBhcmFtICBobmFuZCBwb2ludGVyIHRvIGEgTkFORF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIE5BTkQgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLyAgICAKK0hBTF9TdGF0dXNUeXBlRGVmICBIQUxfTkFORF9FQ0NfRW5hYmxlKE5BTkRfSGFuZGxlVHlwZURlZiAqaG5hbmQpCit7CisgIC8qIENoZWNrIHRoZSBOQU5EIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaWYoaG5hbmQtPlN0YXRlID09IEhBTF9OQU5EX1NUQVRFX0JVU1kpCisgIHsKKyAgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisKKyAgLyogVXBkYXRlIHRoZSBOQU5EIHN0YXRlICovCisgIGhuYW5kLT5TdGF0ZSA9IEhBTF9OQU5EX1NUQVRFX0JVU1k7CisgICAKKyAgLyogRW5hYmxlIEVDQyBmZWF0dXJlICovCisgIEZNQ19OQU5EX0VDQ19FbmFibGUoaG5hbmQtPkluc3RhbmNlLCBobmFuZC0+SW5pdC5OYW5kQmFuayk7CisgIAorICAvKiBVcGRhdGUgdGhlIE5BTkQgc3RhdGUgKi8KKyAgaG5hbmQtPlN0YXRlID0gSEFMX05BTkRfU1RBVEVfUkVBRFk7CisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGVzIGR5bmFtaWNhbGx5IEZNQ19OQU5EIEVDQyBmZWF0dXJlLgorICAqIEBwYXJhbSAgaG5hbmQgcG9pbnRlciB0byBhIE5BTkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBOQU5EIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8gIAorSEFMX1N0YXR1c1R5cGVEZWYgIEhBTF9OQU5EX0VDQ19EaXNhYmxlKE5BTkRfSGFuZGxlVHlwZURlZiAqaG5hbmQpCit7CisgIC8qIENoZWNrIHRoZSBOQU5EIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaWYoaG5hbmQtPlN0YXRlID09IEhBTF9OQU5EX1NUQVRFX0JVU1kpCisgIHsKKyAgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisKKyAgLyogVXBkYXRlIHRoZSBOQU5EIHN0YXRlICovCisgIGhuYW5kLT5TdGF0ZSA9IEhBTF9OQU5EX1NUQVRFX0JVU1k7CisgICAgCisgIC8qIERpc2FibGUgRUNDIGZlYXR1cmUgKi8KKyAgRk1DX05BTkRfRUNDX0Rpc2FibGUoaG5hbmQtPkluc3RhbmNlLCBobmFuZC0+SW5pdC5OYW5kQmFuayk7CisgIAorICAvKiBVcGRhdGUgdGhlIE5BTkQgc3RhdGUgKi8KKyAgaG5hbmQtPlN0YXRlID0gSEFMX05BTkRfU1RBVEVfUkVBRFk7CisgIAorICByZXR1cm4gSEFMX09LOyAgCit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZXMgZHluYW1pY2FsbHkgTkFORCBFQ0MgZmVhdHVyZS4KKyAgKiBAcGFyYW0gIGhuYW5kIHBvaW50ZXIgdG8gYSBOQU5EX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgTkFORCBtb2R1bGUuCisgICogQHBhcmFtICBFQ0N2YWwgcG9pbnRlciB0byBFQ0MgdmFsdWUgCisgICogQHBhcmFtICBUaW1lb3V0IG1heGltdW0gdGltZW91dCB0byB3YWl0ICAgIAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgIEhBTF9OQU5EX0dldEVDQyhOQU5EX0hhbmRsZVR5cGVEZWYgKmhuYW5kLCB1aW50MzJfdCAqRUNDdmFsLCB1aW50MzJfdCBUaW1lb3V0KQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIAorICAvKiBDaGVjayB0aGUgTkFORCBjb250cm9sbGVyIHN0YXRlICovCisgIGlmKGhuYW5kLT5TdGF0ZSA9PSBIQUxfTkFORF9TVEFURV9CVVNZKQorICB7CisgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorICAKKyAgLyogVXBkYXRlIHRoZSBOQU5EIHN0YXRlICovCisgIGhuYW5kLT5TdGF0ZSA9IEhBTF9OQU5EX1NUQVRFX0JVU1k7ICAKKyAgIAorICAvKiBHZXQgTkFORCBFQ0MgdmFsdWUgKi8KKyAgc3RhdHVzID0gRk1DX05BTkRfR2V0RUNDKGhuYW5kLT5JbnN0YW5jZSwgRUNDdmFsLCBobmFuZC0+SW5pdC5OYW5kQmFuaywgVGltZW91dCk7CisgIAorICAvKiBVcGRhdGUgdGhlIE5BTkQgc3RhdGUgKi8KKyAgaG5hbmQtPlN0YXRlID0gSEFMX05BTkRfU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIHN0YXR1czsgIAorfQorCisvKioKKyAgKiBAfQorICAqLworICAKKyAgICAKKy8qKiBAZGVmZ3JvdXAgTkFORF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zIAorICogIEBicmllZiAgIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zIAorICoKK0B2ZXJiYXRpbSAgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBOQU5EIFN0YXRlIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHBlcm1pdHMgdG8gZ2V0IGluIHJ1bi10aW1lIHRoZSBzdGF0dXMgb2YgdGhlIE5BTkQgY29udHJvbGxlciAKKyAgICBhbmQgdGhlIGRhdGEgZmxvdy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKyAgCisvKioKKyAgKiBAYnJpZWYgIHJldHVybiB0aGUgTkFORCBzdGF0ZQorICAqIEBwYXJhbSAgaG5hbmQgcG9pbnRlciB0byBhIE5BTkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBOQU5EIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLworSEFMX05BTkRfU3RhdGVUeXBlRGVmIEhBTF9OQU5EX0dldFN0YXRlKE5BTkRfSGFuZGxlVHlwZURlZiAqaG5hbmQpCit7CisgIHJldHVybiBobmFuZC0+U3RhdGU7Cit9CisKKy8qKgorICAqIEB9CisgICovICAKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9OQU5EX01PRFVMRV9FTkFCTEVEICAqLworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmM3h4X2hhbF9ub3IuYyBiL1NyYy9zdG0zMmYzeHhfaGFsX25vci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YmY0MTIKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJmM3h4X2hhbF9ub3IuYwpAQCAtMCwwICsxLDEwNTcgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX25vci5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBOT1IgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGEgZ2VuZXJpYyBmaXJtd2FyZSB0byBkcml2ZSBOT1IgbWVtb3JpZXMgbW91bnRlZCAKKyAgKiAgICAgICAgICBhcyBleHRlcm5hbCBkZXZpY2UuCisgICogICAgICAgICAKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gICAgICAgCisgICAgWy4uXQorICAgICAgVGhpcyBkcml2ZXIgaXMgYSBnZW5lcmljIGxheWVyZWQgZHJpdmVyIHdoaWNoIGNvbnRhaW5zIGEgc2V0IG9mIEFQSXMgdXNlZCB0byAKKyAgICAgIGNvbnRyb2wgTk9SIGZsYXNoIG1lbW9yaWVzLiBJdCB1c2VzIHRoZSBGTUMgbGF5ZXIgZnVuY3Rpb25zIHRvIGludGVyZmFjZSAKKyAgICAgIHdpdGggTk9SIGRldmljZXMuIFRoaXMgZHJpdmVyIGlzIHVzZWQgYXMgZm9sbG93czoKKyAgICAKKyAgICAgICgrKSBOT1IgZmxhc2ggbWVtb3J5IGNvbmZpZ3VyYXRpb24gc2VxdWVuY2UgdXNpbmcgdGhlIGZ1bmN0aW9uIEhBTF9OT1JfSW5pdCgpIAorICAgICAgICAgIHdpdGggY29udHJvbCBhbmQgdGltaW5nIHBhcmFtZXRlcnMgZm9yIGJvdGggbm9ybWFsIGFuZCBleHRlbmRlZCBtb2RlLgorICAgICAgICAgICAgCisgICAgICAoKykgUmVhZCBOT1IgZmxhc2ggbWVtb3J5IG1hbnVmYWN0dXJlciBjb2RlIGFuZCBkZXZpY2UgSURzIHVzaW5nIHRoZSBmdW5jdGlvbgorICAgICAgICAgIEhBTF9OT1JfUmVhZF9JRCgpLiBUaGUgcmVhZCBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gdGhlIE5PUl9JRF9UeXBlRGVmIAorICAgICAgICAgIHN0cnVjdHVyZSBkZWNsYXJlZCBieSB0aGUgZnVuY3Rpb24gY2FsbGVyLiAKKyAgICAgICAgCisgICAgICAoKykgQWNjZXNzIE5PUiBmbGFzaCBtZW1vcnkgYnkgcmVhZC93cml0ZSBkYXRhIHVuaXQgb3BlcmF0aW9ucyB1c2luZyB0aGUgZnVuY3Rpb25zCisgICAgICAgICAgSEFMX05PUl9SZWFkKCksIEhBTF9OT1JfUHJvZ3JhbSgpLgorICAgICAgICAKKyAgICAgICgrKSBQZXJmb3JtIE5PUiBmbGFzaCBlcmFzZSBibG9jay9jaGlwIG9wZXJhdGlvbnMgdXNpbmcgdGhlIGZ1bmN0aW9ucyAKKyAgICAgICAgICBIQUxfTk9SX0VyYXNlX0Jsb2NrKCkgYW5kIEhBTF9OT1JfRXJhc2VfQ2hpcCgpLgorICAgICAgICAKKyAgICAgICgrKSBSZWFkIHRoZSBOT1IgZmxhc2ggQ0ZJIChjb21tb24gZmxhc2ggaW50ZXJmYWNlKSBJRHMgdXNpbmcgdGhlIGZ1bmN0aW9uCisgICAgICAgICAgSEFMX05PUl9SZWFkX0NGSSgpLiBUaGUgcmVhZCBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gdGhlIE5PUl9DRklfVHlwZURlZgorICAgICAgICAgIHN0cnVjdHVyZSBkZWNsYXJlZCBieSB0aGUgZnVuY3Rpb24gY2FsbGVyLgorICAgICAgICAKKyAgICAgICgrKSBZb3UgY2FuIGFsc28gY29udHJvbCB0aGUgTk9SIGRldmljZSBieSBjYWxsaW5nIHRoZSBjb250cm9sIEFQSXMgSEFMX05PUl9Xcml0ZU9wZXJhdGlvbl9FbmFibGUoKS8KKyAgICAgICAgICBIQUxfTk9SX1dyaXRlT3BlcmF0aW9uX0Rpc2FibGUoKSB0byByZXNwZWN0aXZlbHkgZW5hYmxlL2Rpc2FibGUgdGhlIE5PUiB3cml0ZSBvcGVyYXRpb24gIAorICAgICAgIAorICAgICAgKCspIFlvdSBjYW4gbW9uaXRvciB0aGUgTk9SIGRldmljZSBIQUwgc3RhdGUgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb24KKyAgICAgICAgICBIQUxfTk9SX0dldFN0YXRlKCkgCisgICAgWy4uXQorICAgICAoQCkgVGhpcyBkcml2ZXIgaXMgYSBzZXQgb2YgZ2VuZXJpYyBBUElzIHdoaWNoIGhhbmRsZSBzdGFuZGFyZCBOT1IgZmxhc2ggb3BlcmF0aW9ucy4KKyAgICAgICAgIElmIGEgTk9SIGZsYXNoIGRldmljZSBjb250YWlucyBkaWZmZXJlbnQgb3BlcmF0aW9ucyBhbmQvb3IgaW1wbGVtZW50YXRpb25zLCAKKyAgICAgICAgIGl0IHNob3VsZCBiZSBpbXBsZW1lbnRlZCBzZXBhcmF0ZWx5LgorCisgICAgICoqKiBOT1IgSEFMIGRyaXZlciBtYWNyb3MgbGlzdCAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorICAgICBbLi5dCisgICAgICAgQmVsb3cgdGhlIGxpc3Qgb2YgbW9zdCB1c2VkIG1hY3JvcyBpbiBOT1IgSEFMIGRyaXZlci4KKyAgICAgICAKKyAgICAgICgrKSBOT1JfV1JJVEU6IE5PUiBtZW1vcnkgd3JpdGUgZGF0YSB0byBzcGVjaWZpZWQgYWRkcmVzcworCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8gCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbC5oIgorCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9OT1JfTU9EVUxFX0VOQUJMRUQKKy8qKiBAZGVmZ3JvdXAgTk9SIE5PUgorICAqIEBicmllZiBOT1IgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIE5PUl9Qcml2YXRlX0NvbnN0YW50cyBOT1IgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiBDb25zdGFudHMgdG8gZGVmaW5lIGFkZHJlc3MgdG8gc2V0IHRvIHdyaXRlIGEgY29tbWFuZCAqLworI2RlZmluZSBOT1JfQ01EX0FERFJFU1NfRklSU1QgICAgICAgICAgICAgICAgICh1aW50MTZfdCkweDA1NTUKKyNkZWZpbmUgTk9SX0NNRF9BRERSRVNTX0ZJUlNUX0NGSSAgICAgICAgICAgICAodWludDE2X3QpMHgwMDU1CisjZGVmaW5lIE5PUl9DTURfQUREUkVTU19TRUNPTkQgICAgICAgICAgICAgICAgKHVpbnQxNl90KTB4MDJBQQorI2RlZmluZSBOT1JfQ01EX0FERFJFU1NfVEhJUkQgICAgICAgICAgICAgICAgICh1aW50MTZfdCkweDA1NTUKKyNkZWZpbmUgTk9SX0NNRF9BRERSRVNTX0ZPVVJUSCAgICAgICAgICAgICAgICAodWludDE2X3QpMHgwNTU1CisjZGVmaW5lIE5PUl9DTURfQUREUkVTU19GSUZUSCAgICAgICAgICAgICAgICAgKHVpbnQxNl90KTB4MDJBQQorI2RlZmluZSBOT1JfQ01EX0FERFJFU1NfU0lYVEggICAgICAgICAgICAgICAgICh1aW50MTZfdCkweDA1NTUKKworLyogQ29uc3RhbnRzIHRvIGRlZmluZSBkYXRhIHRvIHByb2dyYW0gYSBjb21tYW5kICovCisjZGVmaW5lIE5PUl9DTURfREFUQV9SRUFEX1JFU0VUICAgICAgICAgICAgICAgKHVpbnQxNl90KTB4MDBGMAorI2RlZmluZSBOT1JfQ01EX0RBVEFfRklSU1QgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCkweDAwQUEKKyNkZWZpbmUgTk9SX0NNRF9EQVRBX1NFQ09ORCAgICAgICAgICAgICAgICAgICAodWludDE2X3QpMHgwMDU1CisjZGVmaW5lIE5PUl9DTURfREFUQV9BVVRPX1NFTEVDVCAgICAgICAgICAgICAgKHVpbnQxNl90KTB4MDA5MAorI2RlZmluZSBOT1JfQ01EX0RBVEFfUFJPR1JBTSAgICAgICAgICAgICAgICAgICh1aW50MTZfdCkweDAwQTAKKyNkZWZpbmUgTk9SX0NNRF9EQVRBX0NISVBfQkxPQ0tfRVJBU0VfVEhJUkQgICAodWludDE2X3QpMHgwMDgwCisjZGVmaW5lIE5PUl9DTURfREFUQV9DSElQX0JMT0NLX0VSQVNFX0ZPVVJUSCAgKHVpbnQxNl90KTB4MDBBQQorI2RlZmluZSBOT1JfQ01EX0RBVEFfQ0hJUF9CTE9DS19FUkFTRV9GSUZUSCAgICh1aW50MTZfdCkweDAwNTUKKyNkZWZpbmUgTk9SX0NNRF9EQVRBX0NISVBfRVJBU0UgICAgICAgICAgICAgICAodWludDE2X3QpMHgwMDEwCisjZGVmaW5lIE5PUl9DTURfREFUQV9DRkkgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KTB4MDA5OAorCisjZGVmaW5lIE5PUl9DTURfREFUQV9CVUZGRVJfQU5EX1BST0cgICAgICAgICAgKHVpbnQ4X3QpMHgyNQorI2RlZmluZSBOT1JfQ01EX0RBVEFfQlVGRkVSX0FORF9QUk9HX0NPTkZJUk0gICh1aW50OF90KTB4MjkKKyNkZWZpbmUgTk9SX0NNRF9EQVRBX0JMT0NLX0VSQVNFICAgICAgICAgICAgICAodWludDhfdCkweDMwCisKKy8qIE1hc2sgb24gTk9SIFNUQVRVUyBSRUdJU1RFUiAqLworI2RlZmluZSBOT1JfTUFTS19TVEFUVVNfRFE1ICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCkweDAwMjAKKyNkZWZpbmUgTk9SX01BU0tfU1RBVFVTX0RRNiAgICAgICAgICAgICAgICAgICAodWludDE2X3QpMHgwMDQwCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIE5PUl9Qcml2YXRlX01hY3JvcyBOT1IgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIE5PUl9Qcml2YXRlX1ZhcmlhYmxlcyBOT1IgUHJpdmF0ZSBWYXJpYWJsZXMKKyAqIEB7CisgKi8KKworc3RhdGljIHVpbnQzMl90IHV3Tk9STWVtb3J5RGF0YVdpZHRoICA9IE5PUl9NRU1PUllfOEI7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIE5PUl9FeHBvcnRlZF9GdW5jdGlvbnMgTk9SIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTk9SX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAKKyAgKiBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIAorICAqCisgIEB2ZXJiYXRpbSAgICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICMjIyMjIE5PUiBJbml0aWFsaXphdGlvbiBhbmQgZGVfaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dICAKKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGluaXRpYWxpemUvZGUtaW5pdGlhbGl6ZQorICAgIHRoZSBOT1IgbWVtb3J5CisgIAorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKyAgICAKKy8qKgorICAqIEBicmllZiAgUGVyZm9ybSB0aGUgTk9SIG1lbW9yeSBJbml0aWFsaXphdGlvbiBzZXF1ZW5jZQorICAqIEBwYXJhbSAgaG5vciBwb2ludGVyIHRvIGEgTk9SX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgTk9SIG1vZHVsZS4KKyAgKiBAcGFyYW0gIFRpbWluZyBwb2ludGVyIHRvIE5PUiBjb250cm9sIHRpbWluZyBzdHJ1Y3R1cmUgCisgICogQHBhcmFtICBFeHRUaW1pbmcgcG9pbnRlciB0byBOT1IgZXh0ZW5kZWQgbW9kZSB0aW1pbmcgc3RydWN0dXJlICAgIAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX05PUl9Jbml0KE5PUl9IYW5kbGVUeXBlRGVmICpobm9yLCBGTUNfTk9SU1JBTV9UaW1pbmdUeXBlRGVmICpUaW1pbmcsIEZNQ19OT1JTUkFNX1RpbWluZ1R5cGVEZWYgKkV4dFRpbWluZykKK3sKKyAgLyogQ2hlY2sgdGhlIE5PUiBoYW5kbGUgcGFyYW1ldGVyICovCisgIGlmKGhub3IgPT0gTlVMTCkKKyAgeworICAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIAorICBpZihobm9yLT5TdGF0ZSA9PSBIQUxfTk9SX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGhub3ItPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKE1TUCkgKi8KKyAgICBIQUxfTk9SX01zcEluaXQoaG5vcik7CisgIH0KKworICAvKiBJbml0aWFsaXplIE5PUiBjb250cm9sIEludGVyZmFjZSAqLworICBGTUNfTk9SU1JBTV9Jbml0KGhub3ItPkluc3RhbmNlLCAmKGhub3ItPkluaXQpKTsKKworICAvKiBJbml0aWFsaXplIE5PUiB0aW1pbmcgSW50ZXJmYWNlICovCisgIEZNQ19OT1JTUkFNX1RpbWluZ19Jbml0KGhub3ItPkluc3RhbmNlLCBUaW1pbmcsIGhub3ItPkluaXQuTlNCYW5rKTsgCisKKyAgLyogSW5pdGlhbGl6ZSBOT1IgZXh0ZW5kZWQgbW9kZSB0aW1pbmcgSW50ZXJmYWNlICovCisgIEZNQ19OT1JTUkFNX0V4dGVuZGVkX1RpbWluZ19Jbml0KGhub3ItPkV4dGVuZGVkLCBFeHRUaW1pbmcsIGhub3ItPkluaXQuTlNCYW5rLCBobm9yLT5Jbml0LkV4dGVuZGVkTW9kZSk7CisKKyAgLyogRW5hYmxlIHRoZSBOT1JTUkFNIGRldmljZSAqLworICBfX0ZNQ19OT1JTUkFNX0VOQUJMRShobm9yLT5JbnN0YW5jZSwgaG5vci0+SW5pdC5OU0JhbmspOyAgCisKKyAgLyogSW5pdGlhbGl6ZSBOT1IgTWVtb3J5IERhdGEgV2lkdGgqLworICBpZiAoaG5vci0+SW5pdC5NZW1vcnlEYXRhV2lkdGggPT0gRk1DX05PUlNSQU1fTUVNX0JVU19XSURUSF84KQorICB7CisgICAgdXdOT1JNZW1vcnlEYXRhV2lkdGggPSBOT1JfTUVNT1JZXzhCOworICB9CisgIGVsc2UKKyAgeworICAgIHV3Tk9STWVtb3J5RGF0YVdpZHRoID0gTk9SX01FTU9SWV8xNkI7CisgIH0KKworICAvKiBDaGVjayB0aGUgTk9SIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaG5vci0+U3RhdGUgPSBIQUxfTk9SX1NUQVRFX1JFQURZOyAKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgUGVyZm9ybSBOT1IgbWVtb3J5IERlLUluaXRpYWxpemF0aW9uIHNlcXVlbmNlCisgICogQHBhcmFtICBobm9yIHBvaW50ZXIgdG8gYSBOT1JfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBOT1IgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX05PUl9EZUluaXQoTk9SX0hhbmRsZVR5cGVEZWYgKmhub3IpICAKK3sKKyAgLyogRGUtSW5pdGlhbGl6ZSB0aGUgbG93IGxldmVsIGhhcmR3YXJlIChNU1ApICovCisgIEhBTF9OT1JfTXNwRGVJbml0KGhub3IpOworIAorICAvKiBDb25maWd1cmUgdGhlIE5PUiByZWdpc3RlcnMgd2l0aCB0aGVpciByZXNldCB2YWx1ZXMgKi8KKyAgRk1DX05PUlNSQU1fRGVJbml0KGhub3ItPkluc3RhbmNlLCBobm9yLT5FeHRlbmRlZCwgaG5vci0+SW5pdC5OU0JhbmspOworICAKKyAgLyogVXBkYXRlIHRoZSBOT1IgY29udHJvbGxlciBzdGF0ZSAqLworICBobm9yLT5TdGF0ZSA9IEhBTF9OT1JfU1RBVEVfUkVTRVQ7CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhobm9yKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIE5PUiBNU1AgSW5pdAorICAqIEBwYXJhbSAgaG5vciBwb2ludGVyIHRvIGEgTk9SX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgTk9SIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9OT1JfTXNwSW5pdChOT1JfSGFuZGxlVHlwZURlZiAqaG5vcikKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaG5vcik7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9OT1JfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQGJyaWVmICBOT1IgTVNQIERlSW5pdAorICAqIEBwYXJhbSAgaG5vciBwb2ludGVyIHRvIGEgTk9SX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgTk9SIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9OT1JfTXNwRGVJbml0KE5PUl9IYW5kbGVUeXBlRGVmICpobm9yKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChobm9yKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX05PUl9Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gCit9CisKKy8qKgorICAqIEBicmllZiAgTk9SIE1TUCBXYWl0IGZybyBSZWFkeS9CdXN5IHNpZ25hbAorICAqIEBwYXJhbSAgaG5vciBwb2ludGVyIHRvIGEgTk9SX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgTk9SIG1vZHVsZS4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgTWF4aW11bSB0aW1lb3V0IHZhbHVlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfTk9SX01zcFdhaXQoTk9SX0hhbmRsZVR5cGVEZWYgKmhub3IsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhub3IpOworICBVTlVTRUQoVGltZW91dCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9OT1JfTXNwV2FpdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKyAgCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIE5PUl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElucHV0IGFuZCBPdXRwdXQgZnVuY3Rpb25zIAorICAqIEBicmllZiAgICBJbnB1dCBPdXRwdXQgYW5kIG1lbW9yeSBjb250cm9sIGZ1bmN0aW9ucyAKKyAgKgorICBAdmVyYmF0aW0gICAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICMjIyMjIE5PUiBJbnB1dCBhbmQgT3V0cHV0IGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXSAgCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byB1c2UgYW5kIGNvbnRyb2wgdGhlIE5PUiBtZW1vcnkKKyAgCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworICAKKy8qKgorICAqIEBicmllZiAgUmVhZCBOT1IgZmxhc2ggSURzCisgICogQHBhcmFtICBobm9yIHBvaW50ZXIgdG8gYSBOT1JfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBOT1IgbW9kdWxlLgorICAqIEBwYXJhbSAgcE5PUl9JRCBwb2ludGVyIHRvIE5PUiBJRCBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9OT1JfUmVhZF9JRChOT1JfSGFuZGxlVHlwZURlZiAqaG5vciwgTk9SX0lEVHlwZURlZiAqcE5PUl9JRCkKK3sKKyAgdWludDMyX3QgZGV2aWNlYWRkcmVzcyA9IDBVOworICAKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhobm9yKTsKKyAgCisgIC8qIENoZWNrIHRoZSBOT1IgY29udHJvbGxlciBzdGF0ZSAqLworICBpZihobm9yLT5TdGF0ZSA9PSBIQUxfTk9SX1NUQVRFX0JVU1kpCisgIHsKKyAgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisgICAgCisgIC8qIFNlbGVjdCB0aGUgTk9SIGRldmljZSBhZGRyZXNzICovCisgIGlmIChobm9yLT5Jbml0Lk5TQmFuayA9PSBGTUNfTk9SU1JBTV9CQU5LMSkKKyAgeworICAgIGRldmljZWFkZHJlc3MgPSBOT1JfTUVNT1JZX0FEUkVTUzE7CisgIH0KKyAgZWxzZSBpZiAoaG5vci0+SW5pdC5OU0JhbmsgPT0gRk1DX05PUlNSQU1fQkFOSzIpCisgIHsKKyAgICBkZXZpY2VhZGRyZXNzID0gTk9SX01FTU9SWV9BRFJFU1MyOworICB9CisgIGVsc2UgaWYgKGhub3ItPkluaXQuTlNCYW5rID09IEZNQ19OT1JTUkFNX0JBTkszKQorICB7CisgICAgZGV2aWNlYWRkcmVzcyA9IE5PUl9NRU1PUllfQURSRVNTMzsKKyAgfQorICBlbHNlIC8qIEZNQ19OT1JTUkFNX0JBTks0ICovCisgIHsKKyAgICBkZXZpY2VhZGRyZXNzID0gTk9SX01FTU9SWV9BRFJFU1M0OworICB9ICAKKyAgICAKKyAgLyogVXBkYXRlIHRoZSBOT1IgY29udHJvbGxlciBzdGF0ZSAqLworICBobm9yLT5TdGF0ZSA9IEhBTF9OT1JfU1RBVEVfQlVTWTsKKyAgCisgIC8qIFNlbmQgcmVhZCBJRCBjb21tYW5kICovCisgIE5PUl9XUklURShOT1JfQUREUl9TSElGVChkZXZpY2VhZGRyZXNzLCB1d05PUk1lbW9yeURhdGFXaWR0aCwgTk9SX0NNRF9BRERSRVNTX0ZJUlNUKSwgTk9SX0NNRF9EQVRBX0ZJUlNUKTsKKyAgTk9SX1dSSVRFKE5PUl9BRERSX1NISUZUKGRldmljZWFkZHJlc3MsIHV3Tk9STWVtb3J5RGF0YVdpZHRoLCBOT1JfQ01EX0FERFJFU1NfU0VDT05EKSwgTk9SX0NNRF9EQVRBX1NFQ09ORCk7CisgIE5PUl9XUklURShOT1JfQUREUl9TSElGVChkZXZpY2VhZGRyZXNzLCB1d05PUk1lbW9yeURhdGFXaWR0aCwgTk9SX0NNRF9BRERSRVNTX1RISVJEKSwgTk9SX0NNRF9EQVRBX0FVVE9fU0VMRUNUKTsKKworICAvKiBSZWFkIHRoZSBOT1IgSURzICovCisgIHBOT1JfSUQtPk1hbnVmYWN0dXJlcl9Db2RlID0gKihfX0lPIHVpbnQxNl90ICopIE5PUl9BRERSX1NISUZUKGRldmljZWFkZHJlc3MsIHV3Tk9STWVtb3J5RGF0YVdpZHRoLCBNQ19BRERSRVNTKTsKKyAgcE5PUl9JRC0+RGV2aWNlX0NvZGUxICAgICAgPSAqKF9fSU8gdWludDE2X3QgKikgTk9SX0FERFJfU0hJRlQoZGV2aWNlYWRkcmVzcywgdXdOT1JNZW1vcnlEYXRhV2lkdGgsIERFVklDRV9DT0RFMV9BRERSKTsKKyAgcE5PUl9JRC0+RGV2aWNlX0NvZGUyICAgICAgPSAqKF9fSU8gdWludDE2X3QgKikgTk9SX0FERFJfU0hJRlQoZGV2aWNlYWRkcmVzcywgdXdOT1JNZW1vcnlEYXRhV2lkdGgsIERFVklDRV9DT0RFMl9BRERSKTsKKyAgcE5PUl9JRC0+RGV2aWNlX0NvZGUzICAgICAgPSAqKF9fSU8gdWludDE2X3QgKikgTk9SX0FERFJfU0hJRlQoZGV2aWNlYWRkcmVzcywgdXdOT1JNZW1vcnlEYXRhV2lkdGgsIERFVklDRV9DT0RFM19BRERSKTsKKyAgCisgIC8qIENoZWNrIHRoZSBOT1IgY29udHJvbGxlciBzdGF0ZSAqLworICBobm9yLT5TdGF0ZSA9IEhBTF9OT1JfU1RBVEVfUkVBRFk7CisgIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhobm9yKTsgICAKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyB0aGUgTk9SIG1lbW9yeSB0byBSZWFkIG1vZGUuCisgICogQHBhcmFtICBobm9yIHBvaW50ZXIgdG8gYSBOT1JfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBOT1IgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX05PUl9SZXR1cm5Ub1JlYWRNb2RlKE5PUl9IYW5kbGVUeXBlRGVmICpobm9yKQoreworICB1aW50MzJfdCBkZXZpY2VhZGRyZXNzID0gMFU7ICAKKyAgCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaG5vcik7CisgIAorICAvKiBDaGVjayB0aGUgTk9SIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaWYoaG5vci0+U3RhdGUgPT0gSEFMX05PUl9TVEFURV9CVVNZKQorICB7CisgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorICAKKyAgLyogU2VsZWN0IHRoZSBOT1IgZGV2aWNlIGFkZHJlc3MgKi8KKyAgaWYgKGhub3ItPkluaXQuTlNCYW5rID09IEZNQ19OT1JTUkFNX0JBTksxKQorICB7CisgICAgZGV2aWNlYWRkcmVzcyA9IE5PUl9NRU1PUllfQURSRVNTMTsKKyAgfQorICBlbHNlIGlmIChobm9yLT5Jbml0Lk5TQmFuayA9PSBGTUNfTk9SU1JBTV9CQU5LMikKKyAgeworICAgIGRldmljZWFkZHJlc3MgPSBOT1JfTUVNT1JZX0FEUkVTUzI7CisgIH0KKyAgZWxzZSBpZiAoaG5vci0+SW5pdC5OU0JhbmsgPT0gRk1DX05PUlNSQU1fQkFOSzMpCisgIHsKKyAgICBkZXZpY2VhZGRyZXNzID0gTk9SX01FTU9SWV9BRFJFU1MzOworICB9CisgIGVsc2UgLyogRk1DX05PUlNSQU1fQkFOSzQgKi8KKyAgeworICAgIGRldmljZWFkZHJlc3MgPSBOT1JfTUVNT1JZX0FEUkVTUzQ7CisgIH0gIAorICAKKyAgTk9SX1dSSVRFKGRldmljZWFkZHJlc3MsIE5PUl9DTURfREFUQV9SRUFEX1JFU0VUKTsKKworICAvKiBDaGVjayB0aGUgTk9SIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaG5vci0+U3RhdGUgPSBIQUxfTk9SX1NUQVRFX1JFQURZOworICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaG5vcik7ICAgCisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgZGF0YSBmcm9tIE5PUiBtZW1vcnkgCisgICogQHBhcmFtICBobm9yIHBvaW50ZXIgdG8gYSBOT1JfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBOT1IgbW9kdWxlLgorICAqIEBwYXJhbSAgcEFkZHJlc3MgcG9pbnRlciB0byBEZXZpY2UgYWRkcmVzcworICAqIEBwYXJhbSAgcERhdGEgcG9pbnRlciB0byByZWFkIGRhdGEgIAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX05PUl9SZWFkKE5PUl9IYW5kbGVUeXBlRGVmICpobm9yLCB1aW50MzJfdCAqcEFkZHJlc3MsIHVpbnQxNl90ICpwRGF0YSkKK3sKKyAgdWludDMyX3QgZGV2aWNlYWRkcmVzcyA9IDBVOworICAKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhobm9yKTsKKyAgCisgIC8qIENoZWNrIHRoZSBOT1IgY29udHJvbGxlciBzdGF0ZSAqLworICBpZihobm9yLT5TdGF0ZSA9PSBIQUxfTk9SX1NUQVRFX0JVU1kpCisgIHsKKyAgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisgICAgCisgIC8qIFNlbGVjdCB0aGUgTk9SIGRldmljZSBhZGRyZXNzICovCisgIGlmIChobm9yLT5Jbml0Lk5TQmFuayA9PSBGTUNfTk9SU1JBTV9CQU5LMSkKKyAgeworICAgIGRldmljZWFkZHJlc3MgPSBOT1JfTUVNT1JZX0FEUkVTUzE7CisgIH0KKyAgZWxzZSBpZiAoaG5vci0+SW5pdC5OU0JhbmsgPT0gRk1DX05PUlNSQU1fQkFOSzIpCisgIHsKKyAgICBkZXZpY2VhZGRyZXNzID0gTk9SX01FTU9SWV9BRFJFU1MyOworICB9CisgIGVsc2UgaWYgKGhub3ItPkluaXQuTlNCYW5rID09IEZNQ19OT1JTUkFNX0JBTkszKQorICB7CisgICAgZGV2aWNlYWRkcmVzcyA9IE5PUl9NRU1PUllfQURSRVNTMzsKKyAgfQorICBlbHNlIC8qIEZNQ19OT1JTUkFNX0JBTks0ICovCisgIHsKKyAgICBkZXZpY2VhZGRyZXNzID0gTk9SX01FTU9SWV9BRFJFU1M0OworICB9IAorICAgIAorICAvKiBVcGRhdGUgdGhlIE5PUiBjb250cm9sbGVyIHN0YXRlICovCisgIGhub3ItPlN0YXRlID0gSEFMX05PUl9TVEFURV9CVVNZOworICAKKyAgLyogU2VuZCByZWFkIGRhdGEgY29tbWFuZCAqLworICBOT1JfV1JJVEUoTk9SX0FERFJfU0hJRlQoZGV2aWNlYWRkcmVzcywgdXdOT1JNZW1vcnlEYXRhV2lkdGgsIE5PUl9DTURfQUREUkVTU19GSVJTVCksIE5PUl9DTURfREFUQV9GSVJTVCk7IAorICBOT1JfV1JJVEUoTk9SX0FERFJfU0hJRlQoZGV2aWNlYWRkcmVzcywgdXdOT1JNZW1vcnlEYXRhV2lkdGgsIE5PUl9DTURfQUREUkVTU19TRUNPTkQpLCBOT1JfQ01EX0RBVEFfU0VDT05EKTsgIAorICBOT1JfV1JJVEUoKHVpbnQzMl90KXBBZGRyZXNzLCBOT1JfQ01EX0RBVEFfUkVBRF9SRVNFVCk7CisKKyAgLyogUmVhZCB0aGUgZGF0YSAqLworICAqcERhdGEgPSAqKF9fSU8gdWludDMyX3QgKikodWludDMyX3QpcEFkZHJlc3M7CisgIAorICAvKiBDaGVjayB0aGUgTk9SIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaG5vci0+U3RhdGUgPSBIQUxfTk9SX1NUQVRFX1JFQURZOworICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaG5vcik7CisgIAorICByZXR1cm4gSEFMX09LOyAgCit9CisKKy8qKgorICAqIEBicmllZiAgUHJvZ3JhbSBkYXRhIHRvIE5PUiBtZW1vcnkgCisgICogQHBhcmFtICBobm9yIHBvaW50ZXIgdG8gYSBOT1JfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBOT1IgbW9kdWxlLgorICAqIEBwYXJhbSAgcEFkZHJlc3MgRGV2aWNlIGFkZHJlc3MKKyAgKiBAcGFyYW0gIHBEYXRhIHBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gd3JpdGUgICAKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9OT1JfUHJvZ3JhbShOT1JfSGFuZGxlVHlwZURlZiAqaG5vciwgdWludDMyX3QgKnBBZGRyZXNzLCB1aW50MTZfdCAqcERhdGEpCit7CisgIHVpbnQzMl90IGRldmljZWFkZHJlc3MgPSAwVTsKKyAgCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaG5vcik7CisgIAorICAvKiBDaGVjayB0aGUgTk9SIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaWYoaG5vci0+U3RhdGUgPT0gSEFMX05PUl9TVEFURV9CVVNZKQorICB7CisgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorICAgIAorICAvKiBTZWxlY3QgdGhlIE5PUiBkZXZpY2UgYWRkcmVzcyAqLworICBpZiAoaG5vci0+SW5pdC5OU0JhbmsgPT0gRk1DX05PUlNSQU1fQkFOSzEpCisgIHsKKyAgICBkZXZpY2VhZGRyZXNzID0gTk9SX01FTU9SWV9BRFJFU1MxOworICB9CisgIGVsc2UgaWYgKGhub3ItPkluaXQuTlNCYW5rID09IEZNQ19OT1JTUkFNX0JBTksyKQorICB7CisgICAgZGV2aWNlYWRkcmVzcyA9IE5PUl9NRU1PUllfQURSRVNTMjsKKyAgfQorICBlbHNlIGlmIChobm9yLT5Jbml0Lk5TQmFuayA9PSBGTUNfTk9SU1JBTV9CQU5LMykKKyAgeworICAgIGRldmljZWFkZHJlc3MgPSBOT1JfTUVNT1JZX0FEUkVTUzM7CisgIH0KKyAgZWxzZSAvKiBGTUNfTk9SU1JBTV9CQU5LNCAqLworICB7CisgICAgZGV2aWNlYWRkcmVzcyA9IE5PUl9NRU1PUllfQURSRVNTNDsKKyAgfSAKKyAgICAKKyAgLyogVXBkYXRlIHRoZSBOT1IgY29udHJvbGxlciBzdGF0ZSAqLworICBobm9yLT5TdGF0ZSA9IEhBTF9OT1JfU1RBVEVfQlVTWTsKKyAgCisgIC8qIFNlbmQgcHJvZ3JhbSBkYXRhIGNvbW1hbmQgKi8KKyAgTk9SX1dSSVRFKE5PUl9BRERSX1NISUZUKGRldmljZWFkZHJlc3MsIHV3Tk9STWVtb3J5RGF0YVdpZHRoLCBOT1JfQ01EX0FERFJFU1NfRklSU1QpLCBOT1JfQ01EX0RBVEFfRklSU1QpOworICBOT1JfV1JJVEUoTk9SX0FERFJfU0hJRlQoZGV2aWNlYWRkcmVzcywgdXdOT1JNZW1vcnlEYXRhV2lkdGgsIE5PUl9DTURfQUREUkVTU19TRUNPTkQpLCBOT1JfQ01EX0RBVEFfU0VDT05EKTsKKyAgTk9SX1dSSVRFKE5PUl9BRERSX1NISUZUKGRldmljZWFkZHJlc3MsIHV3Tk9STWVtb3J5RGF0YVdpZHRoLCBOT1JfQ01EX0FERFJFU1NfVEhJUkQpLCBOT1JfQ01EX0RBVEFfUFJPR1JBTSk7CisKKyAgLyogV3JpdGUgdGhlIGRhdGEgKi8KKyBOT1JfV1JJVEUocEFkZHJlc3MsICpwRGF0YSk7CisgIAorICAvKiBDaGVjayB0aGUgTk9SIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaG5vci0+U3RhdGUgPSBIQUxfTk9SX1NUQVRFX1JFQURZOworICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaG5vcik7CisgIAorICByZXR1cm4gSEFMX09LOyAgCit9CisKKy8qKgorICAqIEBicmllZiAgUmVhZHMgYSBibG9jayBvZiBkYXRhIGZyb20gdGhlIEZNQyBOT1IgbWVtb3J5LgorICAqIEBwYXJhbSAgaG5vciBwb2ludGVyIHRvIGEgTk9SX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgTk9SIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHV3QWRkcmVzcyBOT1IgbWVtb3J5IGludGVybmFsIGFkZHJlc3MgdG8gcmVhZCBmcm9tLgorICAqIEBwYXJhbSAgcERhdGEgcG9pbnRlciB0byB0aGUgYnVmZmVyIHRoYXQgcmVjZWl2ZXMgdGhlIGRhdGEgcmVhZCBmcm9tIHRoZSAKKyAgKiAgICAgICAgIE5PUiBtZW1vcnkuCisgICogQHBhcmFtICB1d0J1ZmZlclNpemUgbnVtYmVyIG9mIEhhbGYgd29yZCB0byByZWFkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX05PUl9SZWFkQnVmZmVyKE5PUl9IYW5kbGVUeXBlRGVmICpobm9yLCB1aW50MzJfdCB1d0FkZHJlc3MsIHVpbnQxNl90ICpwRGF0YSwgdWludDMyX3QgdXdCdWZmZXJTaXplKQoreworICB1aW50MzJfdCBkZXZpY2VhZGRyZXNzID0gMFU7CisgIAorICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhub3IpOworICAKKyAgLyogQ2hlY2sgdGhlIE5PUiBjb250cm9sbGVyIHN0YXRlICovCisgIGlmKGhub3ItPlN0YXRlID09IEhBTF9OT1JfU1RBVEVfQlVTWSkKKyAgeworICAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKyAgICAKKyAgLyogU2VsZWN0IHRoZSBOT1IgZGV2aWNlIGFkZHJlc3MgKi8KKyAgaWYgKGhub3ItPkluaXQuTlNCYW5rID09IEZNQ19OT1JTUkFNX0JBTksxKQorICB7CisgICAgZGV2aWNlYWRkcmVzcyA9IE5PUl9NRU1PUllfQURSRVNTMTsKKyAgfQorICBlbHNlIGlmIChobm9yLT5Jbml0Lk5TQmFuayA9PSBGTUNfTk9SU1JBTV9CQU5LMikKKyAgeworICAgIGRldmljZWFkZHJlc3MgPSBOT1JfTUVNT1JZX0FEUkVTUzI7CisgIH0KKyAgZWxzZSBpZiAoaG5vci0+SW5pdC5OU0JhbmsgPT0gRk1DX05PUlNSQU1fQkFOSzMpCisgIHsKKyAgICBkZXZpY2VhZGRyZXNzID0gTk9SX01FTU9SWV9BRFJFU1MzOworICB9CisgIGVsc2UgLyogRk1DX05PUlNSQU1fQkFOSzQgKi8KKyAgeworICAgIGRldmljZWFkZHJlc3MgPSBOT1JfTUVNT1JZX0FEUkVTUzQ7CisgIH0gIAorICAgIAorICAvKiBVcGRhdGUgdGhlIE5PUiBjb250cm9sbGVyIHN0YXRlICovCisgIGhub3ItPlN0YXRlID0gSEFMX05PUl9TVEFURV9CVVNZOworICAKKyAgLyogU2VuZCByZWFkIGRhdGEgY29tbWFuZCAqLworICBOT1JfV1JJVEUoTk9SX0FERFJfU0hJRlQoZGV2aWNlYWRkcmVzcywgdXdOT1JNZW1vcnlEYXRhV2lkdGgsIE5PUl9DTURfQUREUkVTU19GSVJTVCksIE5PUl9DTURfREFUQV9GSVJTVCk7IAorICBOT1JfV1JJVEUoTk9SX0FERFJfU0hJRlQoZGV2aWNlYWRkcmVzcywgdXdOT1JNZW1vcnlEYXRhV2lkdGgsIE5PUl9DTURfQUREUkVTU19TRUNPTkQpLCBOT1JfQ01EX0RBVEFfU0VDT05EKTsgIAorICBOT1JfV1JJVEUodXdBZGRyZXNzLCBOT1JfQ01EX0RBVEFfUkVBRF9SRVNFVCk7CisgIAorICAvKiBSZWFkIGJ1ZmZlciAqLworICB3aGlsZSggdXdCdWZmZXJTaXplID4gMFUpIAorICB7CisgICAgKnBEYXRhKysgPSAqKF9fSU8gdWludDE2X3QgKil1d0FkZHJlc3M7CisgICAgdXdBZGRyZXNzICs9IDJVOworICAgIHV3QnVmZmVyU2l6ZS0tOworICB9IAorICAKKyAgLyogQ2hlY2sgdGhlIE5PUiBjb250cm9sbGVyIHN0YXRlICovCisgIGhub3ItPlN0YXRlID0gSEFMX05PUl9TVEFURV9SRUFEWTsKKyAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhub3IpOworICAKKyAgcmV0dXJuIEhBTF9PSzsgIAorfQorCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlcyBhIGhhbGYtd29yZCBidWZmZXIgdG8gdGhlIEZNQyBOT1IgbWVtb3J5LiBUaGlzIGZ1bmN0aW9uIAorICAqICAgICAgICAgbXVzdCBiZSB1c2VkIG9ubHkgd2l0aCBTMjlHTDEyOFAgTk9SIG1lbW9yeS4gCisgICogQHBhcmFtICBobm9yIHBvaW50ZXIgdG8gYSBOT1JfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBOT1IgbW9kdWxlLgorICAqIEBwYXJhbSAgdXdBZGRyZXNzIE5PUiBtZW1vcnkgaW50ZXJuYWwgYWRkcmVzcyBmcm9tIHdoaWNoIHRoZSBkYXRhIAorICAqIEBub3RlICAgU29tZSBOT1IgbWVtb3J5IG5lZWQgQWRkcmVzcyBhbGlnbmVkIHRvIHh4IGJ5dGVzIChjYW4gYmUgYWxpZ25lZCB0byAKKyAgKiAgICAgICAgICA2NCBieXRlcyBib3VuZGFyeSBmb3IgZXhhbXBsZSkuCisgICogQHBhcmFtICBwRGF0YSBwb2ludGVyIHRvIHNvdXJjZSBkYXRhIGJ1ZmZlci4gCisgICogQHBhcmFtICB1d0J1ZmZlclNpemUgbnVtYmVyIG9mIEhhbGYgd29yZHMgdG8gd3JpdGUuIAorICAqIEBub3RlICAgVGhlIG1heGltdW0gYnVmZmVyIHNpemUgYWxsb3dlZCBpcyBOT1IgbWVtb3J5IGRlcGVuZGVudAorICAqICAgICAgICAgKGNhbiBiZSA2NCBCeXRlcyBtYXggZm9yIGV4YW1wbGUpLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLyAKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9OT1JfUHJvZ3JhbUJ1ZmZlcihOT1JfSGFuZGxlVHlwZURlZiAqaG5vciwgdWludDMyX3QgdXdBZGRyZXNzLCB1aW50MTZfdCAqcERhdGEsIHVpbnQzMl90IHV3QnVmZmVyU2l6ZSkKK3sKKyAgdWludDE2X3QgKiBwX2N1cnJlbnRhZGRyZXNzID0gKHVpbnQxNl90ICopTlVMTDsKKyAgdWludDE2X3QgKiBwX2VuZGFkZHJlc3MgPSAodWludDE2X3QgKilOVUxMOworICB1aW50MzJfdCBsYXN0bG9hZGVkYWRkcmVzcyA9IDBVLCBkZXZpY2VhZGRyZXNzID0gMFU7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhobm9yKTsKKyAgCisgIC8qIENoZWNrIHRoZSBOT1IgY29udHJvbGxlciBzdGF0ZSAqLworICBpZihobm9yLT5TdGF0ZSA9PSBIQUxfTk9SX1NUQVRFX0JVU1kpCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKyAgICAKKyAgLyogU2VsZWN0IHRoZSBOT1IgZGV2aWNlIGFkZHJlc3MgKi8KKyAgaWYgKGhub3ItPkluaXQuTlNCYW5rID09IEZNQ19OT1JTUkFNX0JBTksxKQorICB7CisgICAgZGV2aWNlYWRkcmVzcyA9IE5PUl9NRU1PUllfQURSRVNTMTsKKyAgfQorICBlbHNlIGlmIChobm9yLT5Jbml0Lk5TQmFuayA9PSBGTUNfTk9SU1JBTV9CQU5LMikKKyAgeworICAgIGRldmljZWFkZHJlc3MgPSBOT1JfTUVNT1JZX0FEUkVTUzI7CisgIH0KKyAgZWxzZSBpZiAoaG5vci0+SW5pdC5OU0JhbmsgPT0gRk1DX05PUlNSQU1fQkFOSzMpCisgIHsKKyAgICBkZXZpY2VhZGRyZXNzID0gTk9SX01FTU9SWV9BRFJFU1MzOworICB9CisgIGVsc2UgLyogRk1DX05PUlNSQU1fQkFOSzQgKi8KKyAgeworICAgIGRldmljZWFkZHJlc3MgPSBOT1JfTUVNT1JZX0FEUkVTUzQ7CisgIH0gIAorICAgIAorICAvKiBVcGRhdGUgdGhlIE5PUiBjb250cm9sbGVyIHN0YXRlICovCisgIGhub3ItPlN0YXRlID0gSEFMX05PUl9TVEFURV9CVVNZOworICAKKyAgLyogSW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KKyAgcF9jdXJyZW50YWRkcmVzcyAgPSAodWludDE2X3QqKSgodWludDMyX3QpKHV3QWRkcmVzcykpOworICBwX2VuZGFkZHJlc3MgICAgICA9IHBfY3VycmVudGFkZHJlc3MgKyAodXdCdWZmZXJTaXplLTFVKTsKKyAgbGFzdGxvYWRlZGFkZHJlc3MgPSAodWludDMyX3QpKHV3QWRkcmVzcyk7CisKKyAgLyogSXNzdWUgdW5sb2NrIGNvbW1hbmQgc2VxdWVuY2UgKi8KKyAgTk9SX1dSSVRFKE5PUl9BRERSX1NISUZUKGRldmljZWFkZHJlc3MsIHV3Tk9STWVtb3J5RGF0YVdpZHRoLCBOT1JfQ01EX0FERFJFU1NfRklSU1QpLCBOT1JfQ01EX0RBVEFfRklSU1QpOworICBOT1JfV1JJVEUoTk9SX0FERFJfU0hJRlQoZGV2aWNlYWRkcmVzcywgdXdOT1JNZW1vcnlEYXRhV2lkdGgsIE5PUl9DTURfQUREUkVTU19TRUNPTkQpLCBOT1JfQ01EX0RBVEFfU0VDT05EKTsgCisKKyAgLyogV3JpdGUgQnVmZmVyIExvYWQgQ29tbWFuZCAqLworICBOT1JfV1JJVEUoKHVpbnQzMl90KShwX2N1cnJlbnRhZGRyZXNzKSwgTk9SX0NNRF9EQVRBX0JVRkZFUl9BTkRfUFJPRyk7IAorICBOT1JfV1JJVEUoKHVpbnQzMl90KShwX2N1cnJlbnRhZGRyZXNzKSwgKHV3QnVmZmVyU2l6ZS0xVSkpOyAKKworICAvKiBMb2FkIERhdGEgaW50byBOT1IgQnVmZmVyICovCisgIHdoaWxlKHBfY3VycmVudGFkZHJlc3MgPD0gcF9lbmRhZGRyZXNzKQorICB7CisgICAgLyogU3RvcmUgbGFzdCBsb2FkZWQgYWRkcmVzcyAmIGRhdGEgdmFsdWUgKGZvciBwb2xsaW5nKSAqLworICAgIGxhc3Rsb2FkZWRhZGRyZXNzID0gKHVpbnQzMl90KXBfY3VycmVudGFkZHJlc3M7CisgCisgICAgTk9SX1dSSVRFKHBfY3VycmVudGFkZHJlc3MsICpwRGF0YSsrKTsKKworICAgIHBfY3VycmVudGFkZHJlc3MrKzsKKyAgfQorCisgIE5PUl9XUklURSgodWludDMyX3QpKGxhc3Rsb2FkZWRhZGRyZXNzKSwgTk9SX0NNRF9EQVRBX0JVRkZFUl9BTkRfUFJPR19DT05GSVJNKTsgCisgIAorICAvKiBDaGVjayB0aGUgTk9SIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaG5vci0+U3RhdGUgPSBIQUxfTk9SX1NUQVRFX1JFQURZOworICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaG5vcik7CisgIAorICByZXR1cm4gSEFMX09LOyAKKyAgCit9CisKKy8qKgorICAqIEBicmllZiAgRXJhc2UgdGhlIHNwZWNpZmllZCBibG9jayBvZiB0aGUgTk9SIG1lbW9yeSAKKyAgKiBAcGFyYW0gIGhub3IgcG9pbnRlciB0byBhIE5PUl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIE5PUiBtb2R1bGUuCisgICogQHBhcmFtICBCbG9ja0FkZHJlc3MgQmxvY2sgdG8gZXJhc2UgYWRkcmVzcyAKKyAgKiBAcGFyYW0gIEFkZHJlc3MgRGV2aWNlIGFkZHJlc3MKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9OT1JfRXJhc2VfQmxvY2soTk9SX0hhbmRsZVR5cGVEZWYgKmhub3IsIHVpbnQzMl90IEJsb2NrQWRkcmVzcywgdWludDMyX3QgQWRkcmVzcykKK3sKKyAgdWludDMyX3QgZGV2aWNlYWRkcmVzcyA9IDBVOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaG5vcik7CisgIAorICAvKiBDaGVjayB0aGUgTk9SIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaWYoaG5vci0+U3RhdGUgPT0gSEFMX05PUl9TVEFURV9CVVNZKQorICB7CisgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorICAgIAorICAvKiBTZWxlY3QgdGhlIE5PUiBkZXZpY2UgYWRkcmVzcyAqLworICBpZiAoaG5vci0+SW5pdC5OU0JhbmsgPT0gRk1DX05PUlNSQU1fQkFOSzEpCisgIHsKKyAgICBkZXZpY2VhZGRyZXNzID0gTk9SX01FTU9SWV9BRFJFU1MxOworICB9CisgIGVsc2UgaWYgKGhub3ItPkluaXQuTlNCYW5rID09IEZNQ19OT1JTUkFNX0JBTksyKQorICB7CisgICAgZGV2aWNlYWRkcmVzcyA9IE5PUl9NRU1PUllfQURSRVNTMjsKKyAgfQorICBlbHNlIGlmIChobm9yLT5Jbml0Lk5TQmFuayA9PSBGTUNfTk9SU1JBTV9CQU5LMykKKyAgeworICAgIGRldmljZWFkZHJlc3MgPSBOT1JfTUVNT1JZX0FEUkVTUzM7CisgIH0KKyAgZWxzZSAvKiBGTUNfTk9SU1JBTV9CQU5LNCAqLworICB7CisgICAgZGV2aWNlYWRkcmVzcyA9IE5PUl9NRU1PUllfQURSRVNTNDsKKyAgfQorICAgIAorICAvKiBVcGRhdGUgdGhlIE5PUiBjb250cm9sbGVyIHN0YXRlICovCisgIGhub3ItPlN0YXRlID0gSEFMX05PUl9TVEFURV9CVVNZOworICAKKyAgLyogU2VuZCBibG9jayBlcmFzZSBjb21tYW5kIHNlcXVlbmNlICovCisgIE5PUl9XUklURShOT1JfQUREUl9TSElGVChkZXZpY2VhZGRyZXNzLCB1d05PUk1lbW9yeURhdGFXaWR0aCwgTk9SX0NNRF9BRERSRVNTX0ZJUlNUKSwgTk9SX0NNRF9EQVRBX0ZJUlNUKTsKKyAgTk9SX1dSSVRFKE5PUl9BRERSX1NISUZUKGRldmljZWFkZHJlc3MsIHV3Tk9STWVtb3J5RGF0YVdpZHRoLCBOT1JfQ01EX0FERFJFU1NfU0VDT05EKSwgTk9SX0NNRF9EQVRBX1NFQ09ORCk7CisgIE5PUl9XUklURShOT1JfQUREUl9TSElGVChkZXZpY2VhZGRyZXNzLCB1d05PUk1lbW9yeURhdGFXaWR0aCwgTk9SX0NNRF9BRERSRVNTX1RISVJEKSwgTk9SX0NNRF9EQVRBX0NISVBfQkxPQ0tfRVJBU0VfVEhJUkQpOworICBOT1JfV1JJVEUoTk9SX0FERFJfU0hJRlQoZGV2aWNlYWRkcmVzcywgdXdOT1JNZW1vcnlEYXRhV2lkdGgsIE5PUl9DTURfQUREUkVTU19GT1VSVEgpLCBOT1JfQ01EX0RBVEFfQ0hJUF9CTE9DS19FUkFTRV9GT1VSVEgpOworICBOT1JfV1JJVEUoTk9SX0FERFJfU0hJRlQoZGV2aWNlYWRkcmVzcywgdXdOT1JNZW1vcnlEYXRhV2lkdGgsIE5PUl9DTURfQUREUkVTU19GSUZUSCksIE5PUl9DTURfREFUQV9DSElQX0JMT0NLX0VSQVNFX0ZJRlRIKTsKKyAgTk9SX1dSSVRFKCh1aW50MzJfdCkoQmxvY2tBZGRyZXNzICsgQWRkcmVzcyksIE5PUl9DTURfREFUQV9CTE9DS19FUkFTRSk7CisKKyAgLyogQ2hlY2sgdGhlIE5PUiBtZW1vcnkgc3RhdHVzIGFuZCB1cGRhdGUgdGhlIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaG5vci0+U3RhdGUgPSBIQUxfTk9SX1NUQVRFX1JFQURZOworICAgIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhobm9yKTsKKyAgCisgIHJldHVybiBIQUxfT0s7CisgCit9CisKKy8qKgorICAqIEBicmllZiAgRXJhc2UgdGhlIGVudGlyZSBOT1IgY2hpcC4KKyAgKiBAcGFyYW0gIGhub3IgcG9pbnRlciB0byBhIE5PUl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIE5PUiBtb2R1bGUuCisgICogQHBhcmFtICBBZGRyZXNzIERldmljZSBhZGRyZXNzICAKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9OT1JfRXJhc2VfQ2hpcChOT1JfSGFuZGxlVHlwZURlZiAqaG5vciwgdWludDMyX3QgQWRkcmVzcykKK3sKKyAgdWludDMyX3QgZGV2aWNlYWRkcmVzcyA9IDBVOworICAKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhobm9yKTsKKyAgCisgIC8qIENoZWNrIHRoZSBOT1IgY29udHJvbGxlciBzdGF0ZSAqLworICBpZihobm9yLT5TdGF0ZSA9PSBIQUxfTk9SX1NUQVRFX0JVU1kpCisgIHsKKyAgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisgICAgCisgIC8qIFNlbGVjdCB0aGUgTk9SIGRldmljZSBhZGRyZXNzICovCisgIGlmIChobm9yLT5Jbml0Lk5TQmFuayA9PSBGTUNfTk9SU1JBTV9CQU5LMSkKKyAgeworICAgIGRldmljZWFkZHJlc3MgPSBOT1JfTUVNT1JZX0FEUkVTUzE7CisgIH0KKyAgZWxzZSBpZiAoaG5vci0+SW5pdC5OU0JhbmsgPT0gRk1DX05PUlNSQU1fQkFOSzIpCisgIHsKKyAgICBkZXZpY2VhZGRyZXNzID0gTk9SX01FTU9SWV9BRFJFU1MyOworICB9CisgIGVsc2UgaWYgKGhub3ItPkluaXQuTlNCYW5rID09IEZNQ19OT1JTUkFNX0JBTkszKQorICB7CisgICAgZGV2aWNlYWRkcmVzcyA9IE5PUl9NRU1PUllfQURSRVNTMzsKKyAgfQorICBlbHNlIC8qIEZNQ19OT1JTUkFNX0JBTks0ICovCisgIHsKKyAgICBkZXZpY2VhZGRyZXNzID0gTk9SX01FTU9SWV9BRFJFU1M0OworICB9CisgICAgCisgIC8qIFVwZGF0ZSB0aGUgTk9SIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaG5vci0+U3RhdGUgPSBIQUxfTk9SX1NUQVRFX0JVU1k7ICAKKyAgICAKKyAgLyogU2VuZCBOT1IgY2hpcCBlcmFzZSBjb21tYW5kIHNlcXVlbmNlICovCisgIE5PUl9XUklURShOT1JfQUREUl9TSElGVChkZXZpY2VhZGRyZXNzLCB1d05PUk1lbW9yeURhdGFXaWR0aCwgTk9SX0NNRF9BRERSRVNTX0ZJUlNUKSwgTk9SX0NNRF9EQVRBX0ZJUlNUKTsKKyAgTk9SX1dSSVRFKE5PUl9BRERSX1NISUZUKGRldmljZWFkZHJlc3MsIHV3Tk9STWVtb3J5RGF0YVdpZHRoLCBOT1JfQ01EX0FERFJFU1NfU0VDT05EKSwgTk9SX0NNRF9EQVRBX1NFQ09ORCk7CisgIE5PUl9XUklURShOT1JfQUREUl9TSElGVChkZXZpY2VhZGRyZXNzLCB1d05PUk1lbW9yeURhdGFXaWR0aCwgTk9SX0NNRF9BRERSRVNTX1RISVJEKSwgTk9SX0NNRF9EQVRBX0NISVBfQkxPQ0tfRVJBU0VfVEhJUkQpOworICBOT1JfV1JJVEUoTk9SX0FERFJfU0hJRlQoZGV2aWNlYWRkcmVzcywgdXdOT1JNZW1vcnlEYXRhV2lkdGgsIE5PUl9DTURfQUREUkVTU19GT1VSVEgpLCBOT1JfQ01EX0RBVEFfQ0hJUF9CTE9DS19FUkFTRV9GT1VSVEgpOworICBOT1JfV1JJVEUoTk9SX0FERFJfU0hJRlQoZGV2aWNlYWRkcmVzcywgdXdOT1JNZW1vcnlEYXRhV2lkdGgsIE5PUl9DTURfQUREUkVTU19GSUZUSCksIE5PUl9DTURfREFUQV9DSElQX0JMT0NLX0VSQVNFX0ZJRlRIKTsgIAorICBOT1JfV1JJVEUoTk9SX0FERFJfU0hJRlQoZGV2aWNlYWRkcmVzcywgdXdOT1JNZW1vcnlEYXRhV2lkdGgsIE5PUl9DTURfQUREUkVTU19TSVhUSCksIE5PUl9DTURfREFUQV9DSElQX0VSQVNFKTsKKyAgCisgIC8qIENoZWNrIHRoZSBOT1IgbWVtb3J5IHN0YXR1cyBhbmQgdXBkYXRlIHRoZSBjb250cm9sbGVyIHN0YXRlICovCisgIGhub3ItPlN0YXRlID0gSEFMX05PUl9TVEFURV9SRUFEWTsKKyAgICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaG5vcik7CisgIAorICByZXR1cm4gSEFMX09LOyAgCit9CisKKy8qKgorICAqIEBicmllZiAgUmVhZCBOT1IgZmxhc2ggQ0ZJIElEcworICAqIEBwYXJhbSAgaG5vciBwb2ludGVyIHRvIGEgTk9SX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgTk9SIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBOT1JfQ0ZJIHBvaW50ZXIgdG8gTk9SIENGSSBJRHMgc3RydWN0dXJlICAKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9OT1JfUmVhZF9DRkkoTk9SX0hhbmRsZVR5cGVEZWYgKmhub3IsIE5PUl9DRklUeXBlRGVmICpwTk9SX0NGSSkKK3sKKyAgdWludDMyX3QgZGV2aWNlYWRkcmVzcyA9IDBVOworICAKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhobm9yKTsKKyAgCisgIC8qIENoZWNrIHRoZSBOT1IgY29udHJvbGxlciBzdGF0ZSAqLworICBpZihobm9yLT5TdGF0ZSA9PSBIQUxfTk9SX1NUQVRFX0JVU1kpCisgIHsKKyAgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisgICAgCisgIC8qIFNlbGVjdCB0aGUgTk9SIGRldmljZSBhZGRyZXNzICovCisgIGlmIChobm9yLT5Jbml0Lk5TQmFuayA9PSBGTUNfTk9SU1JBTV9CQU5LMSkKKyAgeworICAgIGRldmljZWFkZHJlc3MgPSBOT1JfTUVNT1JZX0FEUkVTUzE7CisgIH0KKyAgZWxzZSBpZiAoaG5vci0+SW5pdC5OU0JhbmsgPT0gRk1DX05PUlNSQU1fQkFOSzIpCisgIHsKKyAgICBkZXZpY2VhZGRyZXNzID0gTk9SX01FTU9SWV9BRFJFU1MyOworICB9CisgIGVsc2UgaWYgKGhub3ItPkluaXQuTlNCYW5rID09IEZNQ19OT1JTUkFNX0JBTkszKQorICB7CisgICAgZGV2aWNlYWRkcmVzcyA9IE5PUl9NRU1PUllfQURSRVNTMzsKKyAgfQorICBlbHNlIC8qIEZNQ19OT1JTUkFNX0JBTks0ICovCisgIHsKKyAgICBkZXZpY2VhZGRyZXNzID0gTk9SX01FTU9SWV9BRFJFU1M0OworICB9ICAKKyAgICAKKyAgLyogVXBkYXRlIHRoZSBOT1IgY29udHJvbGxlciBzdGF0ZSAqLworICBobm9yLT5TdGF0ZSA9IEhBTF9OT1JfU1RBVEVfQlVTWTsKKyAgCisgIC8qIFNlbmQgcmVhZCBDRkkgcXVlcnkgY29tbWFuZCAqLworICBOT1JfV1JJVEUoTk9SX0FERFJfU0hJRlQoZGV2aWNlYWRkcmVzcywgdXdOT1JNZW1vcnlEYXRhV2lkdGgsIE5PUl9DTURfQUREUkVTU19GSVJTVF9DRkkpLCBOT1JfQ01EX0RBVEFfQ0ZJKTsKKworICAvKiByZWFkIHRoZSBOT1IgQ0ZJIGluZm9ybWF0aW9uICovCisgIHBOT1JfQ0ZJLT5DRklfMSA9ICooX19JTyB1aW50MTZfdCAqKSBOT1JfQUREUl9TSElGVChkZXZpY2VhZGRyZXNzLCB1d05PUk1lbW9yeURhdGFXaWR0aCwgQ0ZJMV9BRERSRVNTKTsKKyAgcE5PUl9DRkktPkNGSV8yID0gKihfX0lPIHVpbnQxNl90ICopIE5PUl9BRERSX1NISUZUKGRldmljZWFkZHJlc3MsIHV3Tk9STWVtb3J5RGF0YVdpZHRoLCBDRkkyX0FERFJFU1MpOworICBwTk9SX0NGSS0+Q0ZJXzMgPSAqKF9fSU8gdWludDE2X3QgKikgTk9SX0FERFJfU0hJRlQoZGV2aWNlYWRkcmVzcywgdXdOT1JNZW1vcnlEYXRhV2lkdGgsIENGSTNfQUREUkVTUyk7CisgIHBOT1JfQ0ZJLT5DRklfNCA9ICooX19JTyB1aW50MTZfdCAqKSBOT1JfQUREUl9TSElGVChkZXZpY2VhZGRyZXNzLCB1d05PUk1lbW9yeURhdGFXaWR0aCwgQ0ZJNF9BRERSRVNTKTsKKworICAvKiBDaGVjayB0aGUgTk9SIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaG5vci0+U3RhdGUgPSBIQUxfTk9SX1NUQVRFX1JFQURZOworICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaG5vcik7CisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworICAKKy8qKiBAZGVmZ3JvdXAgTk9SX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAKKyAqICBAYnJpZWYgICBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAKKyAqCitAdmVyYmF0aW0gICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBOT1IgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbnRyb2wgZHluYW1pY2FsbHkKKyAgICB0aGUgTk9SIGludGVyZmFjZS4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKyAgICAKKy8qKgorICAqIEBicmllZiAgRW5hYmxlcyBkeW5hbWljYWxseSBOT1Igd3JpdGUgb3BlcmF0aW9uLgorICAqIEBwYXJhbSAgaG5vciBwb2ludGVyIHRvIGEgTk9SX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgTk9SIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9OT1JfV3JpdGVPcGVyYXRpb25fRW5hYmxlKE5PUl9IYW5kbGVUeXBlRGVmICpobm9yKQoreworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhub3IpOworCisgIC8qIEVuYWJsZSB3cml0ZSBvcGVyYXRpb24gKi8KKyAgRk1DX05PUlNSQU1fV3JpdGVPcGVyYXRpb25fRW5hYmxlKGhub3ItPkluc3RhbmNlLCBobm9yLT5Jbml0Lk5TQmFuayk7IAorICAKKyAgLyogVXBkYXRlIHRoZSBOT1IgY29udHJvbGxlciBzdGF0ZSAqLworICBobm9yLT5TdGF0ZSA9IEhBTF9OT1JfU1RBVEVfUkVBRFk7CisgIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhobm9yKTsgCisgIAorICByZXR1cm4gSEFMX09LOyAgCit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZXMgZHluYW1pY2FsbHkgTk9SIHdyaXRlIG9wZXJhdGlvbi4KKyAgKiBAcGFyYW0gIGhub3IgcG9pbnRlciB0byBhIE5PUl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIE5PUiBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTk9SX1dyaXRlT3BlcmF0aW9uX0Rpc2FibGUoTk9SX0hhbmRsZVR5cGVEZWYgKmhub3IpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaG5vcik7CisKKyAgLyogVXBkYXRlIHRoZSBTUkFNIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaG5vci0+U3RhdGUgPSBIQUxfTk9SX1NUQVRFX0JVU1k7CisgICAgCisgIC8qIERpc2FibGUgd3JpdGUgb3BlcmF0aW9uICovCisgIEZNQ19OT1JTUkFNX1dyaXRlT3BlcmF0aW9uX0Rpc2FibGUoaG5vci0+SW5zdGFuY2UsIGhub3ItPkluaXQuTlNCYW5rKTsgCisgIAorICAvKiBVcGRhdGUgdGhlIE5PUiBjb250cm9sbGVyIHN0YXRlICovCisgIGhub3ItPlN0YXRlID0gSEFMX05PUl9TVEFURV9QUk9URUNURUQ7CisgIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhobm9yKTsgCisgIAorICByZXR1cm4gSEFMX09LOyAgCit9CisKKy8qKgorICAqIEB9CisgICovICAKKyAgCisvKiogQGRlZmdyb3VwIE5PUl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zIAorICogIEBicmllZiAgIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zIAorICoKK0B2ZXJiYXRpbSAgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBOT1IgU3RhdGUgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcGVybWl0cyB0byBnZXQgaW4gcnVuLXRpbWUgdGhlIHN0YXR1cyBvZiB0aGUgTk9SIGNvbnRyb2xsZXIgCisgICAgYW5kIHRoZSBkYXRhIGZsb3cuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisgIAorLyoqCisgICogQGJyaWVmICByZXR1cm4gdGhlIE5PUiBjb250cm9sbGVyIHN0YXRlCisgICogQHBhcmFtICBobm9yIHBvaW50ZXIgdG8gYSBOT1JfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBOT1IgbW9kdWxlLgorICAqIEByZXR2YWwgTk9SIGNvbnRyb2xsZXIgc3RhdGUKKyAgKi8KK0hBTF9OT1JfU3RhdGVUeXBlRGVmIEhBTF9OT1JfR2V0U3RhdGUoTk9SX0hhbmRsZVR5cGVEZWYgKmhub3IpCit7CisgIHJldHVybiBobm9yLT5TdGF0ZTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm5zIHRoZSBOT1Igb3BlcmF0aW9uIHN0YXR1cy4KKyAgKiBAcGFyYW0gIGhub3IgcG9pbnRlciB0byBhIE5PUl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIE5PUiBtb2R1bGUuICAgCisgICogQHBhcmFtICBBZGRyZXNzIERldmljZSBhZGRyZXNzCisgICogQHBhcmFtICBUaW1lb3V0IE5PUiBwcm9nYW1taW5nIFRpbWVvdXQKKyAgKiBAcmV0dmFsIE5PUl9TdGF0dXM6IFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmU6IEhBTF9OT1JfU1RBVFVTX1NVQ0NFU1MsIEhBTF9OT1JfU1RBVFVTX0VSUk9SCisgICogICAgICAgICBvciBIQUxfTk9SX1NUQVRVU19USU1FT1VUCisgICovCitIQUxfTk9SX1N0YXR1c1R5cGVEZWYgSEFMX05PUl9HZXRTdGF0dXMoTk9SX0hhbmRsZVR5cGVEZWYgKmhub3IsIHVpbnQzMl90IEFkZHJlc3MsIHVpbnQzMl90IFRpbWVvdXQpCit7IAorICBIQUxfTk9SX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX05PUl9TVEFUVVNfT05HT0lORzsKKyAgdWludDE2X3QgdG1wX3NyMSA9IDBVLCB0bXBfc3IyID0gMFU7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDBVOworCisgIC8qIFBvbGwgb24gTk9SIG1lbW9yeSBSZWFkeS9CdXN5IHNpZ25hbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBIQUxfTk9SX01zcFdhaXQoaG5vciwgVGltZW91dCk7CisgIAorICAvKiBHZXQgdGljayAqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICB3aGlsZSgoc3RhdHVzICE9IEhBTF9OT1JfU1RBVFVTX1NVQ0NFU1MpICYmIChzdGF0dXMgIT0gSEFMX05PUl9TVEFUVVNfVElNRU9VVCkpCisgIHsKKyAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KKyAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYoKFRpbWVvdXQgPT0gMFUpfHwoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFRpbWVvdXQpKQorICAgIHsKKyAgICAgIHN0YXR1cyA9IEhBTF9OT1JfU1RBVFVTX1RJTUVPVVQ7IAorICAgIH0gIAorICAgIH0gCisgICAgCisgICAgLyogUmVhZCBOT1Igc3RhdHVzIHJlZ2lzdGVyIChEUTYgYW5kIERRNSkgKi8KKyAgICB0bXBfc3IxID0gKihfX0lPIHVpbnQxNl90ICopQWRkcmVzczsKKyAgICB0bXBfc3IyID0gKihfX0lPIHVpbnQxNl90ICopQWRkcmVzczsKKworICAgIC8qIElmIERRNiBkaWQgbm90IHRvZ2dsZSBiZXR3ZWVuIHRoZSB0d28gcmVhZHMgdGhlbiByZXR1cm4gTk9SX1N1Y2Nlc3MgKi8KKyAgICBpZigodG1wX3NyMSAmIE5PUl9NQVNLX1NUQVRVU19EUTYpID09ICh0bXBfc3IyICYgTk9SX01BU0tfU1RBVFVTX0RRNikpIAorICAgIHsKKyAgICAgIHJldHVybiBIQUxfTk9SX1NUQVRVU19TVUNDRVNTOworICAgIH0KKyAgICAKKyAgICBpZigodG1wX3NyMSAmIE5PUl9NQVNLX1NUQVRVU19EUTUpICE9IE5PUl9NQVNLX1NUQVRVU19EUTUpCisgICAgeworICAgICAgc3RhdHVzID0gSEFMX05PUl9TVEFUVVNfT05HT0lORzsKKyAgICB9CisgICAgCisgICAgdG1wX3NyMSA9ICooX19JTyB1aW50MTZfdCAqKUFkZHJlc3M7CisgICAgdG1wX3NyMiA9ICooX19JTyB1aW50MTZfdCAqKUFkZHJlc3M7CisKKyAgICAvKiBJZiBEUTYgZGlkIG5vdCB0b2dnbGUgYmV0d2VlbiB0aGUgdHdvIHJlYWRzIHRoZW4gcmV0dXJuIE5PUl9TdWNjZXNzICovCisgICAgaWYoKHRtcF9zcjEgJiBOT1JfTUFTS19TVEFUVVNfRFE2KSA9PSAodG1wX3NyMiAmIE5PUl9NQVNLX1NUQVRVU19EUTYpKSAKKyAgICB7CisgICAgICByZXR1cm4gSEFMX05PUl9TVEFUVVNfU1VDQ0VTUzsKKyAgICB9CisgICAgZWxzZSBpZigodG1wX3NyMSAmIE5PUl9NQVNLX1NUQVRVU19EUTUpID09IE5PUl9NQVNLX1NUQVRVU19EUTUpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9OT1JfU1RBVFVTX0VSUk9SOworICAgIH0gCisgIH0KKworICAvKiBSZXR1cm4gdGhlIG9wZXJhdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogSEFMX05PUl9NT0RVTEVfRU5BQkxFRCAqLworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmM3h4X2hhbF9vcGFtcC5jIGIvU3JjL3N0bTMyZjN4eF9oYWxfb3BhbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTY5ZjdmCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZjN4eF9oYWxfb3BhbXAuYwpAQCAtMCwwICsxLDkyMiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfb3BhbXAuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgT1BBTVAgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZyAKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIG9wZXJhdGlvbmFsIGFtcGxpZmllcnMgKE9QQU1QMSwuLi5PUEFNUDQpIAorICAqICAgICAgICAgIHBlcmlwaGVyYWw6IAorICAqICAgICAgICAgICArIE9QQU1QIENvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBPUEFNUCBjYWxpYnJhdGlvbgorICAqICAgICAgICAgIFRoYW5rcyB0bworICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uL2RlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIEkvTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgICogICAgICAgICAKKyAgQHZlcmJhdGltCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICMjIyMjIE9QQU1QIFBlcmlwaGVyYWwgRmVhdHVyZXMgIyMjIyMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgIAorICBbLi5dIFRoZSBkZXZpY2UgaW50ZWdyYXRlcyB1cCB0byA0IG9wZXJhdGlvbmFsIGFtcGxpZmllcnMgT1BBTVAxLCBPUEFNUDIsCisgICAgICAgT1BBTVAzIGFuZCBPUEFNUDQ6CisgICAgICAgCisgICAgICAgKCMpIFRoZSBPUEFNUChzKSBwcm92aWRlcyBzZXZlcmFsIGV4Y2x1c2l2ZSBydW5uaW5nIG1vZGVzLgorICAgICAgICgrKykgU3RhbmRhbG9uZSBtb2RlCisgICAgICAgKCsrKSBQcm9ncmFtbWFibGUgR2FpbiBBbXBsaWZpZXIgKFBHQSkgbW9kZSAoUmVzaXN0b3IgZmVlZGJhY2sgb3V0cHV0KQorICAgICAgICgrKykgRm9sbG93ZXIgbW9kZQorCisgICAgICAgKCMpIFRoZSBPUEFNUChzKSBwcm92aWRlKHMpIGNhbGlicmF0aW9uIGNhcGFiaWxpdGllcy4gIAorICAgICAgICgrKykgQ2FsaWJyYXRpb24gYWltcyBhdCBjb3JyZWN0aW5nIHNvbWUgb2Zmc2V0IGZvciBydW5uaW5nIG1vZGUuCisgICAgICAgKCsrKSBUaGUgT1BBTVAgdXNlcyBlaXRoZXIgZmFjdG9yeSBjYWxpYnJhdGlvbiBzZXR0aW5ncyBPUiB1c2VyIGRlZmluZWQgCisgICAgICAgICAgIGNhbGlicmF0aW9uICh0cmltbWluZykgc2V0dGluZ3MgKGkuZS4gdHJpbW1pbmcgbW9kZSkuCisgICAgICAgKCsrKSBUaGUgdXNlciBkZWZpbmVkIHNldHRpbmdzIGNhbiBiZSBmaWd1cmVkIG91dCB1c2luZyBzZWxmIGNhbGlicmF0aW9uIAorICAgICAgICAgICBoYW5kbGVkIGJ5IEhBTF9PUEFNUF9TZWxmQ2FsaWJyYXRlLCBIQUxfT1BBTVBFeF9TZWxmQ2FsaWJyYXRlQWxsCisgICAgICAgKCsrKSBIQUxfT1BBTVBfU2VsZkNhbGlicmF0ZToKKyAgICAgICAoKyspIFJ1bnMgYXV0b21hdGljYWxseSB0aGUgY2FsaWJyYXRpb24gaW4gMiBzdGVwcy4gCisgICAgICAgICAgICAoOTBVJSBvZiBWRERBIGZvciBOTU9TIHRyYW5zaXN0b3JzLCAxMFUlIG9mIFZEREEgZm9yIFBNT1MgdHJhbnNpc3RvcnMpLgorICAgICAgICAgICAgKEFzIE9QQU1QIGlzIFJhaWwtdG8tcmFpbCBpbnB1dC9vdXRwdXQsIHRoZXNlIDIgc3RlcHMgY2FsaWJyYXRpb24gaXMgCisgICAgICAgICAgICBhcHByb3ByaWF0ZSBhbmQgZW5vdWdoIGluIG1vc3QgY2FzZXMpLgorICAgICAgICgrKykgRW5hYmxlcyB0aGUgdXNlciB0cmltbWluZyBtb2RlCisgICAgICAgKCsrKSBVcGRhdGVzIHRoZSBpbml0IHN0cnVjdHVyZSB3aXRoIHRyaW1taW5nIHZhbHVlcyB3aXRoIGZyZXNoIGNhbGlicmF0aW9uIAorICAgICAgICAgICAgcmVzdWx0cy4gCisgICAgICAgICAgICBUaGUgdXNlciBtYXkgc3RvcmUgdGhlIGNhbGlicmF0aW9uIHJlc3VsdHMgZm9yIGxhcmdlciAKKyAgICAgICAgICAgIChleCBtb25pdG9yaW5nIHRoZSB0cmltbWluZyBhcyBhIGZ1bmN0aW9uIG9mIHRlbXBlcmF0dXJlIAorICAgICAgICAgICAgZm9yIGluc3RhbmNlKQorICAgICAgICgrKykgZm9yIFNUTTMyRjMgZGV2aWNlcyBoYXZpbmcgMiBvciA0IE9QQU1QcworICAgICAgICAgICAgSEFMX09QQU1QRXhfU2VsZkNhbGlicmF0ZUFsbAorICAgICAgICAgICAgcnVucyBjYWxpYnJhdGlvbiBvZiAyIG9yIDQgT1BBTVBzIGluIHBhcmFsbGVsLiAKKyAgICAgICAKKyAgICAgICAoIykgRm9yIGFueSBydW5uaW5nIG1vZGUsIGFuIGFkZGl0aW9uYWwgVGltZXItY29udHJvbGxlZCBNdXggKG11bHRpcGxleGVyKSAKKyAgICAgICAgICAgbW9kZSBjYW4gYmUgc2V0IG9uIHRvcC4KKyAgICAgICAoKyspIFRpbWVyLWNvbnRyb2xsZWQgTXV4IG1vZGUgYWxsb3dzIEF1dG9tYXRpYyBzd2l0Y2hpbmcgYmV0d2VlbiBpbnZlcnRpbmcKKyAgICAgICAgICAgYW5kIG5vbi1pbnZlcnRpbmcgaW5wdXQuIAorICAgICAgICgrKykgSGVuY2Ugb24gdG9wIG9mIGRlZmF1bHRzIChwcmltYXJ5KSBpbnZlcnRpbmcgYW5kIG5vbi1pbnZlcnRpbmcgaW5wdXRzLAorICAgICAgICAgICB0aGUgdXNlciBzaGFsbCBzZWxlY3Qgc2Vjb25kYXJ5IGludmVydGluZyBhbmQgbm9uIGludmVydGluZyBpbnB1dHMuCisgICAgICAgKCsrKSBUSU0xIENDNiBwcm92aWRlcyB0aGUgYWx0ZXJuYXRlIHN3aXRjaGluZyB0ZW1wbyBiZXR3ZWVuIGRlZmF1bHRzIAorICAgICAgICAgICAocHJpbWFyeSkgYW5kIHNlY29uZGFyeSBpbnB1dHMuIAorICAgICAgICAgICAgIAorICAgICAgICgjKSBSdW5uaW5nIG1vZGU6IFN0YW5kYWxvbmUgbW9kZSAKKyAgICAgICAoKyspIEdhaW4gaXMgc2V0IGV4dGVybmFsbHkgKGdhaW4gZGVwZW5kcyBvbiBleHRlcm5hbCBsb2FkcykuCisgICAgICAgKCsrKSBGb2xsb3dlciBtb2RlIGFsc28gcG9zc2libGUgZXh0ZXJuYWxseSBieSBjb25uZWN0aW5nIHRoZSBpbnZlcnRpbmcgaW5wdXQgdG8KKyAgICAgICAgICAgdGhlIG91dHB1dC4KKyAgICAgICAKKyAgICAgICAoIykgUnVubmluZyBtb2RlOiBGb2xsb3dlciBtb2RlCisgICAgICAgKCsrKSBObyBJbnZlcnRpbmcgSW5wdXQgaXMgY29ubmVjdGVkLgorICAgICAgIAorICAgICAgICgjKSBSdW5uaW5nIG1vZGU6IFByb2dyYW1tYWJsZSBHYWluIEFtcGxpZmllciAoUEdBKSBtb2RlIAorICAgICAgICAgICAoUmVzaXN0b3IgZmVlZGJhY2sgb3V0cHV0KQorICAgICAgICgrKykgVGhlIE9QQU1QKHMpIG91dHB1dChzKSBjYW4gYmUgaW50ZXJuYWxseSBjb25uZWN0ZWQgdG8gcmVzaXN0b3IgZmVlZGJhY2sKKyAgICAgICAgICAgb3V0cHV0LgorICAgICAgICgrKykgT1BBTVAgZ2FpbiBpcyBlaXRoZXIgMlUsIDRVLCA4IG9yIDE2LgorICAgICAgICAKKyAgICAgIAorICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXSAKKyAgICAqKiogQ2FsaWJyYXRpb24gKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgIFRvIHJ1biB0aGUgb3BhbXAgY2FsaWJyYXRpb24gc2VsZiBjYWxpYnJhdGlvbjoKKworICAgICAgKCMpIFN0YXJ0IGNhbGlicmF0aW9uIHVzaW5nIEhBTF9PUEFNUF9TZWxmQ2FsaWJyYXRlLiAKKyAgICAgICAgICAgU3RvcmUgdGhlIGNhbGlicmF0aW9uIHJlc3VsdHMuCisKKyAgICAqKiogUnVubmluZyBtb2RlICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICBUbyB1c2UgdGhlIG9wYW1wLCBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgc3RlcHM6CisgICAgICAgICAgICAKKyAgICAgICgjKSBGaWxsIGluIHRoZSBIQUxfT1BBTVBfTXNwSW5pdCgpIHRvCisgICAgICAoKyspIENvbmZpZ3VyZSB0aGUgb3BhbXAgaW5wdXQgQU5EIG91dHB1dCBpbiBhbmFsb2cgbW9kZSB1c2luZyAKKyAgICAgICAgICBIQUxfR1BJT19Jbml0KCkgdG8gbWFwIHRoZSBvcGFtcCBvdXRwdXQgdG8gdGhlIEdQSU8gcGluLgorICAKKyAgICAgICgjKSBDb25maWd1cmUgdGhlIG9wYW1wIHVzaW5nIEhBTF9PUEFNUF9Jbml0KCkgZnVuY3Rpb246CisgICAgICAoKyspIFNlbGVjdCB0aGUgbW9kZQorICAgICAgKCsrKSBTZWxlY3QgdGhlIGludmVydGluZyBpbnB1dAorICAgICAgKCsrKSBTZWxlY3QgdGhlIG5vbi1pbnZlcnRpbmcgaW5wdXQgCisgICAgICAoKyspIFNlbGVjdCBpZiB0aGUgVGltZXIgY29udHJvbGxlZCBNdXggbW9kZSBpcyBlbmFibGVkL2Rpc2FibGVkCisgICAgICAoKyspIElmIHRoZSBUaW1lciBjb250cm9sbGVkIE11eCBtb2RlIGlzIGVuYWJsZWQsIHNlbGVjdCB0aGUgc2Vjb25kYXJ5IGludmVydGluZyBpbnB1dAorICAgICAgKCsrKSBJZiB0aGUgVGltZXIgY29udHJvbGxlZCBNdXggbW9kZSBpcyBlbmFibGVkLCBTZWxlY3QgdGhlIHNlY29uZGFyeSBub24taW52ZXJ0aW5nIGlucHV0IAorICAgICAgKCsrKSBJZiBQR0EgbW9kZSBpcyBlbmFibGVkLCBTZWxlY3QgaWYgaW52ZXJ0aW5nIGlucHV0IGlzIGNvbm5lY3RlZC4KKyAgICAgICgrKykgU2VsZWN0IGVpdGhlciBmYWN0b3J5IG9yIHVzZXIgZGVmaW5lZCB0cmltbWluZyBtb2RlLgorICAgICAgKCsrKSBJZiB0aGUgdXNlciBkZWZpbmVkIHRyaW1taW5nIG1vZGUgaXMgZW5hYmxlZCwgc2VsZWN0IFBNT1MgJiBOTU9TIHRyaW1taW5nIHZhbHVlcworICAgICAgICAgICh0eXAuIHNldHRpbmdzIHJldHVybmVkIGJ5IEhBTF9PUEFNUF9TZWxmQ2FsaWJyYXRlIGZ1bmN0aW9uKS4KKyAgICAgIAorICAgICAgKCMpIEVuYWJsZSB0aGUgb3BhbXAgdXNpbmcgSEFMX09QQU1QX1N0YXJ0KCkgZnVuY3Rpb24uCisgICAgICAgICAgIAorICAgICAgKCMpIERpc2FibGUgdGhlIG9wYW1wIHVzaW5nIEhBTF9PUEFNUF9TdG9wKCkgZnVuY3Rpb24uCisgICAgICAKKyAgICAgICgjKSBMb2NrIHRoZSBvcGFtcCBpbiBydW5uaW5nIG1vZGUgdXNpbmcgSEFMX09QQU1QX0xvY2soKSBmdW5jdGlvbi4gRnJvbSB0aGVuIFRoZSBjb25maWd1cmF0aW9uIAorICAgICAgICAgIGNhbiAgYmUgbW9kaWZpZWQgCisgICAgICAoKyspIEFmdGVyIEhXIHJlc2V0IAorICAgICAgKCsrKSBPUiB0aGFua3MgdG8gSEFMX09QQU1QX01zcERlSW5pdCBjYWxsZWQgKHVzZXIgZGVmaW5lZCkgZnJvbSBIQUxfT1BBTVBfRGVJbml0LgorCisgICAgKioqIFJ1bm5pbmcgbW9kZTogY2hhbmdlIG9mIGNvbmZpZ3VyYXRpb24gd2hpbGUgT1BBTVAgT04gICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRvIFJlLWNvbmZpZ3VyZSBPUEFNUCB3aGVuIE9QQU1QIGlzIE9OIChjaGFuZ2Ugb24gdGhlIGZseSkKKyAgICAgICgjKSBJZiBuZWVkZWQsIEZpbGwgaW4gdGhlIEhBTF9PUEFNUF9Nc3BJbml0KCkKKyAgICAgICgrKykgVGhpcyBpcyB0aGUgY2FzZSBmb3IgaW5zdGFuY2UgaWYgeW91IHdpc2ggdG8gdXNlIG5ldyBPUEFNUCBJL08KKworICAgICAgKCMpIENvbmZpZ3VyZSB0aGUgb3BhbXAgdXNpbmcgSEFMX09QQU1QX0luaXQoKSBmdW5jdGlvbjoKKyAgICAgICgrKykgQXMgaW4gY29uZmlndXJlIGNhc2UsIHNlbGVjdHMgZmlyc3QgdGhlIHBhcmFtZXRlcnMgeW91IHdpc2ggdG8gbW9kaWZ5LgorICAgICAgCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIAorICAqLworCisvKgorICBBZGRpdGlvbmFsIFRhYmxlczoKKyAgICBUaGUgT1BBTVBzIG5vbiBpbnZlcnRpbmcgaW5wdXQgKGJvdGggZGVmYXVsdCBhbmQgc2Vjb25kYXJ5KSBjYW4gYmUgCisgICAgc2VsZWN0ZWQgYW1vbmcgdGhlIGxpc3Qgc2hvd24gYnkgdGFibGUgYmVsb3cuCisgICAgICAgCisgICAgVGhlIE9QQU1QcyBub24gaW52ZXJ0aW5nIGlucHV0IChib3RoIGRlZmF1bHQgYW5kIHNlY29uZGFyeSkgY2FuIGJlIAorICAgIHNlbGVjdGVkIGFtb25nIHRoZSBsaXN0IHNob3duIGJ5IHRhYmxlIGJlbG93LgorICAgICAgIAorICAgIFRhYmxlIDEuICBPUEFNUHMgaW52ZXJ0aW5nL25vbi1pbnZlcnRpbmcgaW5wdXRzIGZvciB0aGUgU1RNMzJGMyBkZXZpY2VzOgorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgICAgIAorICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgIHwgT1BBTVAxIHwgT1BBTVAyIHwgT1BBTVAzIHwgT1BBTVA0IHwKKyAgICB8LS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS18LS0tLS0tLS18LS0tLS0tLS18LS0tLS0tLS18LS0tLS0tLS18CisgICAgfCAgICAgICAgICAgICAgICAgfCBObyBjb25ufCAgIFggICAgfCAgIFggICAgfCAgIFggICAgfCAgIFggICAgfAorICAgIHwgSW52ZXJ0aW5nIElucHV0IHwgVk0wICAgIHwgIFBDNSAgIHwgIFBDNSAgIHwgIFBCMTAgIHwgIFBCMTAgIHwKKyAgICB8ICgxKSAgICAgICAgICAgICB8IFZNMSAgICB8ICBQQTMgICB8ICBQQTUgICB8ICBQQjIgICB8ICBQRDggICB8CisgICAgfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tfAorICAgIHwgICAgICAgICAgICAgICAgIHwgVlAwICAgIHwgIFBBMSAgIHwgIFBBNyAgIHwgIFBCMCAgIHwgIFBCMTMgIHwKKyAgICB8ICBOb24gSW52ZXJ0aW5nICB8IFZQMSAgICB8ICBQQTcgICB8ICBQRDE0ICB8ICBQQjEzICB8ICBQRDExICB8CisgICAgfCAgICBJbnB1dCAgICAgICAgfCBWUDIgICAgfCAgUEEzICAgfCAgUEIwICAgfCAgUEExICAgfCAgUEE0ICAgfAorICAgIHwgICAgICAgICAgICAgICAgIHwgVlAzICAgIHwgIFBBNSAgIHwgIFBCMTQgIHwgIFBBNSAgIHwgIFBCMTEgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAKKyAgICAoMSk6IE5BIGluIGZvbGxvd2VyIG1vZGUuCisgICAgICAgICAgIAorICAgIFRhYmxlIDIuICBPUEFNUHMgb3V0cHV0cyBmb3IgdGhlIFNUTTMyRjMgZGV2aWNlczoKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAgICAKKyAgICB8ICAgICAgICAgICAgICAgICB8ICAgICAgICB8IE9QQU1QMSB8IE9QQU1QMiB8IE9QQU1QMyB8IE9QQU1QNCB8CisgICAgfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tfAorICAgIHwgT3V0cHV0ICAgICAgICAgIHwgICAgICAgIHwgIFBBMiAgIHwgIFBBNiAgIHwgIFBCMSAgIHwgIFBCMTIgIHwKKyAgICB8LS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS18LS0tLS0tLS18LS0tLS0tLS18LS0tLS0tLS18LS0tLS0tLS18CisKKyovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbC5oIgorICAgIAorLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9PUEFNUF9NT0RVTEVfRU5BQkxFRAorCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKworLyoqIEBkZWZncm91cCBPUEFNUCBPUEFNUAorICAqIEBicmllZiBPUEFNUCBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBPUEFNUF9Qcml2YXRlX0RlZmluZSBPUEFNUCBQcml2YXRlIERlZmluZQorICogQHsKKyAqLworLyogQ1NSIHJlZ2lzdGVyIHJlc2V0IHZhbHVlICovIAorI2RlZmluZSBPUEFNUF9DU1JfUkVTRVRfVkFMVUUgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgT1BBTVBfRXhwb3J0ZWRfRnVuY3Rpb25zIE9QQU1QIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgT1BBTVBfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAKKyAqCitAdmVyYmF0aW0gICAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorIAorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgT1BBTVAgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIE9QQU1QX0luaXRUeXBlRGVmIGFuZCBjcmVhdGUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBub3RlICAgSWYgdGhlIHNlbGVjdGVkIG9wYW1wIGlzIGxvY2tlZCwgaW5pdGlhbGl6YXRpb24gY2FuJ3QgYmUgcGVyZm9ybWVkLgorICAqICAgICAgICAgVG8gdW5sb2NrIHRoZSBjb25maWd1cmF0aW9uLCBwZXJmb3JtIGEgc3lzdGVtIHJlc2V0LgorICAqIEBwYXJhbSAgaG9wYW1wIE9QQU1QIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX09QQU1QX0luaXQoT1BBTVBfSGFuZGxlVHlwZURlZiAqaG9wYW1wKQorCit7IAorICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgdGhlIE9QQU1QIGhhbmRsZSBhbGxvY2F0aW9uIGFuZCBsb2NrIHN0YXR1cyAqLworICAvKiBJbml0IG5vdCBhbGxvd2VkIGlmIGNhbGlicmF0aW9uIGlzIG9uZ29pbmcgKi8KKyAgaWYoKGhvcGFtcCA9PSBOVUxMKSB8fCAoaG9wYW1wLT5TdGF0ZSA9PSBIQUxfT1BBTVBfU1RBVEVfQlVTWUxPQ0tFRCkgXAorICAgICAgICAgICAgICAgICAgICAgIHx8IChob3BhbXAtPlN0YXRlID09IEhBTF9PUEFNUF9TVEFURV9DQUxJQkJVU1kpKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAgIAorICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfT1BBTVBfQUxMX0lOU1RBTkNFKGhvcGFtcC0+SW5zdGFuY2UpKTsKKyAgICAgICAKKyAgICAvKiBTZXQgT1BBTVAgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19PUEFNUF9GVU5DVElPTkFMX05PUk1BTE1PREUoaG9wYW1wLT5Jbml0Lk1vZGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfT1BBTVBfTk9OSU5WRVJUSU5HX0lOUFVUKGhvcGFtcC0+SW5pdC5Ob25JbnZlcnRpbmdJbnB1dCkpOworICAgIGlmICgoaG9wYW1wLT5Jbml0Lk1vZGUpID09IE9QQU1QX1NUQU5EQUxPTkVfTU9ERSkKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfT1BBTVBfSU5WRVJUSU5HX0lOUFVUKGhvcGFtcC0+SW5pdC5JbnZlcnRpbmdJbnB1dCkpOworICAgIH0KKyAgCisgICAgYXNzZXJ0X3BhcmFtKElTX09QQU1QX1RJTUVSQ09OVFJPTExFRF9NVVhNT0RFKGhvcGFtcC0+SW5pdC5UaW1lckNvbnRyb2xsZWRNdXhtb2RlKSk7CisKKyAgICBpZiAoKGhvcGFtcC0+SW5pdC5UaW1lckNvbnRyb2xsZWRNdXhtb2RlKSA9PSBPUEFNUF9USU1FUkNPTlRST0xMRURNVVhNT0RFX0VOQUJMRSkKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfT1BBTVBfU0VDX05PTklOVkVSVElOR0lOUFVUKGhvcGFtcC0+SW5pdC5Ob25JbnZlcnRpbmdJbnB1dFNlY29uZGFyeSkpOworICAgICAgaWYgKChob3BhbXAtPkluaXQuTW9kZSkgPT0gT1BBTVBfU1RBTkRBTE9ORV9NT0RFKQorICAgICAgeworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfT1BBTVBfU0VDX0lOVkVSVElOR0lOUFVUKGhvcGFtcC0+SW5pdC5JbnZlcnRpbmdJbnB1dFNlY29uZGFyeSkpOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICBpZiAoKGhvcGFtcC0+SW5pdC5Nb2RlKSA9PSBPUEFNUF9QR0FfTU9ERSkKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfT1BBTVBfUEdBQ09OTkVDVChob3BhbXAtPkluaXQuUGdhQ29ubmVjdCkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX09QQU1QX1BHQV9HQUlOKGhvcGFtcC0+SW5pdC5QZ2FHYWluKSk7CisgICAgfQorICAgIAorICAgIGFzc2VydF9wYXJhbShJU19PUEFNUF9UUklNTUlORyhob3BhbXAtPkluaXQuVXNlclRyaW1taW5nKSk7IAorICAgIGlmICgoaG9wYW1wLT5Jbml0LlVzZXJUcmltbWluZykgPT0gT1BBTVBfVFJJTU1JTkdfVVNFUikKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfT1BBTVBfVFJJTU1JTkdWQUxVRShob3BhbXAtPkluaXQuVHJpbW1pbmdWYWx1ZVApKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19PUEFNUF9UUklNTUlOR1ZBTFVFKGhvcGFtcC0+SW5pdC5UcmltbWluZ1ZhbHVlTikpOworICAgIH0KKyAKKyAgICAvKiBJbml0IFNZU0NGRyBhbmQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSB0byBhY2Nlc3Mgb3BhbXAgKi8KKyAgICBfX0hBTF9SQ0NfU1lTQ0ZHX0NMS19FTkFCTEUoKTsKKyAgICAKKyAgICBpZihob3BhbXAtPlN0YXRlID09IEhBTF9PUEFNUF9TVEFURV9SRVNFVCkKKyAgICB7CisgICAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgICBob3BhbXAtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisgICAgfQorCisgICAgLyogQ2FsbCBNU1AgaW5pdCBmdW5jdGlvbiAqLworICAgIEhBTF9PUEFNUF9Nc3BJbml0KGhvcGFtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAvKiBTZXQgT1BBTVAgcGFyYW1ldGVycyAqLworICAgIC8qICAgICBTZXQgIGJpdHMgYWNjb3JkaW5nIHRvIGhvcGFtcC0+aG9wYW1wLT5Jbml0Lk1vZGUgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICBTZXQgIGJpdHMgYWNjb3JkaW5nIHRvIGhvcGFtcC0+aG9wYW1wLT5Jbml0LkludmVydGluZ0lucHV0IHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICBTZXQgIGJpdHMgYWNjb3JkaW5nIHRvIGhvcGFtcC0+aG9wYW1wLT5Jbml0Lk5vbkludmVydGluZ0lucHV0IHZhbHVlICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICBTZXQgIGJpdHMgYWNjb3JkaW5nIHRvIGhvcGFtcC0+aG9wYW1wLT5Jbml0LlRpbWVyQ29udHJvbGxlZE11eG1vZGUgdmFsdWUgICAgICAgICAgICAgICAqLworICAgIC8qICAgICBTZXQgIGJpdHMgYWNjb3JkaW5nIHRvIGhvcGFtcC0+aG9wYW1wLT5Jbml0LkludmVydGluZ0lucHV0U2Vjb25kYXJ5ICB2YWx1ZSAgICAgICAgICAgICAqLworICAgIC8qICAgICBTZXQgIGJpdHMgYWNjb3JkaW5nIHRvIGhvcGFtcC0+aG9wYW1wLT5Jbml0Lk5vbkludmVydGluZ0lucHV0U2Vjb25kYXJ5IHZhbHVlICAgICAgICAgICAqLworICAgIC8qICAgICBTZXQgIGJpdHMgYWNjb3JkaW5nIHRvIGhvcGFtcC0+aG9wYW1wLT5Jbml0LlBnYUNvbm5lY3QgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICBTZXQgIGJpdHMgYWNjb3JkaW5nIHRvIGhvcGFtcC0+aG9wYW1wLT5Jbml0LlBnYUdhaW4gdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICBTZXQgIGJpdHMgYWNjb3JkaW5nIHRvIGhvcGFtcC0+aG9wYW1wLT5Jbml0LlVzZXJUcmltbWluZyB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICBTZXQgIGJpdHMgYWNjb3JkaW5nIHRvIGhvcGFtcC0+aG9wYW1wLT5Jbml0LlRyaW1taW5nVmFsdWVQIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICBTZXQgIGJpdHMgYWNjb3JkaW5nIHRvIGhvcGFtcC0+aG9wYW1wLT5Jbml0LlRyaW1taW5nVmFsdWVOIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIAorICAgIAorICAgIC8qIGNoZWNrIGlmIE9QQU1QX1BHQV9NT0RFICYgaW4gRm9sbG93ZXIgbW9kZSAqLworICAgIC8qICAgLSBJbnZlcnRpbmdJbnB1dCAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgLSBJbnZlcnRpbmdJbnB1dFNlY29uZGFyeSAgICAgICAgICAgICAgICAqLworICAgIC8qIGFyZSBOb3QgQXBwbGljYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIAorICAgIGlmICgoaG9wYW1wLT5Jbml0Lk1vZGUgPT0gT1BBTVBfUEdBX01PREUpIHx8IChob3BhbXAtPkluaXQuTW9kZSA9PSBPUEFNUF9GT0xMT1dFUl9NT0RFKSkKKyAgICB7CisgICAgICBNT0RJRllfUkVHKGhvcGFtcC0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX1VQREFURV9QQVJBTUVURVJTX0lOSVRfTUFTSywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcGFtcC0+SW5pdC5Nb2RlIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcGFtcC0+SW5pdC5Ob25JbnZlcnRpbmdJbnB1dCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3BhbXAtPkluaXQuVGltZXJDb250cm9sbGVkTXV4bW9kZSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3BhbXAtPkluaXQuTm9uSW52ZXJ0aW5nSW5wdXRTZWNvbmRhcnkgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcGFtcC0+SW5pdC5QZ2FDb25uZWN0IHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcGFtcC0+SW5pdC5QZ2FHYWluIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcGFtcC0+SW5pdC5Vc2VyVHJpbW1pbmcgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhvcGFtcC0+SW5pdC5UcmltbWluZ1ZhbHVlUCA8PCBPUEFNUF9JTlBVVF9OT05JTlZFUlRJTkcpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChob3BhbXAtPkluaXQuVHJpbW1pbmdWYWx1ZU4gPDwgT1BBTVBfSU5QVVRfSU5WRVJUSU5HKSk7ICAKKworICAgIH0gICAgCisgICAgZWxzZSAvKiBPUEFNUF9TVEFOREFMT05FX01PREUgKi8KKyAgICB7CisgICAgICBNT0RJRllfUkVHKGhvcGFtcC0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX1VQREFURV9QQVJBTUVURVJTX0lOSVRfTUFTSywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcGFtcC0+SW5pdC5Nb2RlIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcGFtcC0+SW5pdC5JbnZlcnRpbmdJbnB1dCAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3BhbXAtPkluaXQuTm9uSW52ZXJ0aW5nSW5wdXQgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9wYW1wLT5Jbml0LlRpbWVyQ29udHJvbGxlZE11eG1vZGUgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9wYW1wLT5Jbml0LkludmVydGluZ0lucHV0U2Vjb25kYXJ5ICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3BhbXAtPkluaXQuTm9uSW52ZXJ0aW5nSW5wdXRTZWNvbmRhcnkgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcGFtcC0+SW5pdC5QZ2FDb25uZWN0IHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcGFtcC0+SW5pdC5QZ2FHYWluIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcGFtcC0+SW5pdC5Vc2VyVHJpbW1pbmcgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhvcGFtcC0+SW5pdC5UcmltbWluZ1ZhbHVlUCA8PCBPUEFNUF9JTlBVVF9OT05JTlZFUlRJTkcpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChob3BhbXAtPkluaXQuVHJpbW1pbmdWYWx1ZU4gPDwgT1BBTVBfSU5QVVRfSU5WRVJUSU5HKSk7ICAgICAKKyAgICB9IAorICAgIAorICAgIC8qIFVwZGF0ZSB0aGUgT1BBTVAgc3RhdGUqLworICAgIGlmIChob3BhbXAtPlN0YXRlID09IEhBTF9PUEFNUF9TVEFURV9SRVNFVCkKKyAgICB7CisgICAgICAvKiBGcm9tIFJFU0VUIHN0YXRlIHRvIFJFQURZIFN0YXRlICovCisgICAgaG9wYW1wLT5TdGF0ZSA9IEhBTF9PUEFNUF9TVEFURV9SRUFEWTsKKyAgICB9CisgICAgLyogZWxzZTogcmVtYWluIGluIFJFQURZIG9yIEJVU1kgc3RhdGUgKG5vIHVwZGF0ZSkgKi8KKyAgCisgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9Cit9CisKKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIHRoZSBPUEFNUCBwZXJpcGhlcmFsIAorICAqIEBub3RlICAgRGVpbml0aWFsaXphdGlvbiBjYW4ndCBiZSBwZXJmb3JtZWQgaWYgdGhlIE9QQU1QIGNvbmZpZ3VyYXRpb24gaXMgbG9ja2VkLgorICAqICAgICAgICAgVG8gdW5sb2NrIHRoZSBjb25maWd1cmF0aW9uLCBwZXJmb3JtIGEgc3lzdGVtIHJlc2V0LgorICAqIEBwYXJhbSAgaG9wYW1wIE9QQU1QIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX09QQU1QX0RlSW5pdChPUEFNUF9IYW5kbGVUeXBlRGVmICpob3BhbXApCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBDaGVjayB0aGUgT1BBTVAgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgLyogRGVJbml0IG5vdCBhbGxvd2VkIGlmIGNhbGlicmF0aW9uIGlzIG9uZ29pbmcgKi8KKyAgaWYoKGhvcGFtcCA9PSBOVUxMKSB8fCAoaG9wYW1wLT5TdGF0ZSA9PSBIQUxfT1BBTVBfU1RBVEVfQ0FMSUJCVVNZKSkKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgICAgYXNzZXJ0X3BhcmFtKElTX09QQU1QX0FMTF9JTlNUQU5DRShob3BhbXAtPkluc3RhbmNlKSk7CisKKyAgICAvKiBTZXQgT1BBTVBfQ1NSIHJlZ2lzdGVyIHRvIHJlc2V0IHZhbHVlICovCisgICAgV1JJVEVfUkVHKGhvcGFtcC0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX1JFU0VUX1ZBTFVFKTsKKworICAgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSyBhbmQgTlZJQyAqLworICAgIC8qIFdoZW4gT1BBTVAgaXMgbG9ja2VkLCB1bmxvY2tpbmcgY2FuIGJlIGFjaGlldmVkIHRoYW5rcyB0byAqLyAKKyAgICAvKiBfX0hBTF9SQ0NfU1lTQ0ZHX0NMS19ESVNBQkxFKCkgY2FsbCB3aXRoaW4gSEFMX09QQU1QX01zcERlSW5pdCAqLworICAgIC8qIE5vdGUgdGhhdCBfX0hBTF9SQ0NfU1lTQ0ZHX0NMS19ESVNBQkxFKCkgYWxzbyBkaXNhYmxlcyBjb21wYXJhdG9yICovCisgICAgSEFMX09QQU1QX01zcERlSW5pdChob3BhbXApOworCisgICAgaWYgKE9QQU1QX0NTUl9SRVNFVF9WQUxVRSA9PSBob3BhbXAtPkluc3RhbmNlLT5DU1IpCisgICAgeworICAgICAgLyogVXBkYXRlIHRoZSBPUEFNUCBzdGF0ZSAqLworICAgICAgaG9wYW1wLT5TdGF0ZSA9IEhBTF9PUEFNUF9TVEFURV9SRVNFVDsKKyAgICB9CisgICAgZWxzZSAvKiBSRVNFVCBTVEFURSAqLyAKKyAgICB7CisgICAgICAvKiBEZUluaXQgbm90IGNvbXBsZXRlICovIAorICAgICAgLyogSXQgY2FuIGJlIHRoZSBjYXNlIGlmIE9QQU1QIHdhcyBmb3JtZXJseSBsb2NrZWQgKi8gCisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisKKyAgICAgIC8qIFRoZSBPUEFNUCBzdGF0ZSBpcyBOT1QgdXBkYXRlZCAqLyAgICAgIAorICAgIH0KKworICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaG9wYW1wKTsKKyAgfQorICAKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgT1BBTVAgTVNQLgorICAqIEBwYXJhbSAgaG9wYW1wIE9QQU1QIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX09QQU1QX01zcEluaXQoT1BBTVBfSGFuZGxlVHlwZURlZiAqaG9wYW1wKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChob3BhbXApOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfT1BBTVBfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworCisgICAvKiBFeGFtcGxlICovIAorfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgT1BBTVAgTVNQLgorICAqIEBwYXJhbSAgaG9wYW1wIE9QQU1QIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX09QQU1QX01zcERlSW5pdChPUEFNUF9IYW5kbGVUeXBlRGVmICpob3BhbXApCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhvcGFtcCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9PUEFNUF9Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KKworfQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgT1BBTVBfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbiBmdW5jdGlvbnMgCisgKiAgQGJyaWVmICAgRGF0YSB0cmFuc2ZlcnMgZnVuY3Rpb25zIAorICoKK0B2ZXJiYXRpbSAgIAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gbWFuYWdlIHRoZSBPUEFNUCBkYXRhIAorICAgIHRyYW5zZmVycy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgb3BhbXAKKyAgKiBAcGFyYW0gIGhvcGFtcCBPUEFNUCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX09QQU1QX1N0YXJ0KE9QQU1QX0hhbmRsZVR5cGVEZWYgKmhvcGFtcCkKK3sgCisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgCisgIC8qIENoZWNrIHRoZSBPUEFNUCBoYW5kbGUgYWxsb2NhdGlvbiAqLworICAvKiBDaGVjayBpZiBPUEFNUCBsb2NrZWQgKi8KKyAgaWYoKGhvcGFtcCA9PSBOVUxMKSB8fCAoaG9wYW1wLT5TdGF0ZSA9PSBIQUxfT1BBTVBfU1RBVEVfQlVTWUxPQ0tFRCkpCisgICAgICAgICAgICAgICAgICAgICAgCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICAgIGFzc2VydF9wYXJhbShJU19PUEFNUF9BTExfSU5TVEFOQ0UoaG9wYW1wLT5JbnN0YW5jZSkpOworICAgIAorICAgIGlmKGhvcGFtcC0+U3RhdGUgPT0gSEFMX09QQU1QX1NUQVRFX1JFQURZKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgb3BhbXAgKi8KKyAgICAgIFNFVF9CSVQgKGhvcGFtcC0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX09QQU1QeEVOKTsKKworICAgICAgLyogVXBkYXRlIHRoZSBPUEFNUCBzdGF0ZSovICAgICAKKyAgICAgIC8qIEZyb20gSEFMX09QQU1QX1NUQVRFX1JFQURZIHRvIEhBTF9PUEFNUF9TVEFURV9CVVNZICovCisgICAgICBob3BhbXAtPlN0YXRlID0gSEFMX09QQU1QX1NUQVRFX0JVU1k7ICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgfQorICAgIAorICAgIAorICAgfQorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgdGhlIG9wYW1wIAorICAqIEBwYXJhbSAgaG9wYW1wIE9QQU1QIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX09QQU1QX1N0b3AoT1BBTVBfSGFuZGxlVHlwZURlZiAqaG9wYW1wKQoreyAKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworICAgIAorICAvKiBDaGVjayB0aGUgT1BBTVAgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgLyogQ2hlY2sgaWYgT1BBTVAgbG9ja2VkICovCisgIC8qIENoZWNrIGlmIE9QQU1QIGNhbGlicmF0aW9uIG9uZ29pbmcgKi8KKyAgaWYoKGhvcGFtcCA9PSBOVUxMKSB8fCAoaG9wYW1wLT5TdGF0ZSA9PSBIQUxfT1BBTVBfU1RBVEVfQlVTWUxPQ0tFRCkgXAorICAgICAgICAgICAgICAgICAgICAgIHx8IChob3BhbXAtPlN0YXRlID09IEhBTF9PUEFNUF9TVEFURV9DQUxJQkJVU1kpKSAgCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICAgIGFzc2VydF9wYXJhbShJU19PUEFNUF9BTExfSU5TVEFOQ0UoaG9wYW1wLT5JbnN0YW5jZSkpOworCisgICAgaWYoaG9wYW1wLT5TdGF0ZSA9PSBIQUxfT1BBTVBfU1RBVEVfQlVTWSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBvcGFtcCAqLworICAgICAgQ0xFQVJfQklUIChob3BhbXAtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9PUEFNUHhFTik7IAorICAgIAorICAgICAgLyogVXBkYXRlIHRoZSBPUEFNUCBzdGF0ZSovICAgICAKKyAgICAgIC8qIEZyb20gIEhBTF9PUEFNUF9TVEFURV9CVVNZIHRvIEhBTF9PUEFNUF9TVEFURV9SRUFEWSovCisgICAgICBob3BhbXAtPlN0YXRlID0gSEFMX09QQU1QX1NUQVRFX1JFQURZOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgIH0KKyAgfQorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJ1biB0aGUgc2VsZiBjYWxpYnJhdGlvbiBvZiBvbmUgT1BBTVAKKyAgKiBAcGFyYW0gIGhvcGFtcCBoYW5kbGUKKyAgKiBAcmV0dmFsIFVwZGF0ZWQgb2Zmc2V0IHRyaW1taW5nIHZhbHVlcyAoUE1PUyAmIE5NT1MpLCB1c2VyIHRyaW1taW5nIGlzIGVuYWJsZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKiBAbm90ZSAgIENhbGlicmF0aW9uIHJ1bnMgYWJvdXQgMjUgbXMuCisgICovCisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9PUEFNUF9TZWxmQ2FsaWJyYXRlKE9QQU1QX0hhbmRsZVR5cGVEZWYgKmhvcGFtcCkKK3sgCisKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworICAKKyAgdWludDMyX3QgdHJpbW1pbmd2YWx1ZW4gPSAwVTsKKyAgdWludDMyX3QgdHJpbW1pbmd2YWx1ZXAgPSAwVTsKKyAgdWludDMyX3QgZGVsdGE7CisgIAorICAvKiBDaGVjayB0aGUgT1BBTVAgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgLyogQ2hlY2sgaWYgT1BBTVAgbG9ja2VkICovCisgIGlmKChob3BhbXAgPT0gTlVMTCkgfHwgKGhvcGFtcC0+U3RhdGUgPT0gSEFMX09QQU1QX1NUQVRFX0JVU1lMT0NLRUQpKQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAKKyAgICAvKiBDaGVjayBpZiBPUEFNUCBpbiBjYWxpYnJhdGlvbiBtb2RlIGFuZCBjYWxpYnJhdGlvbiBub3QgeWV0IGVuYWJsZSAqLworICAgIGlmKGhvcGFtcC0+U3RhdGUgPT0gIEhBTF9PUEFNUF9TVEFURV9SRUFEWSkKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfT1BBTVBfQUxMX0lOU1RBTkNFKGhvcGFtcC0+SW5zdGFuY2UpKTsKKworICAgICAgLyogU2V0IENhbGlicmF0aW9uIG1vZGUgKi8KKyAgICAgIC8qIE5vbi1pbnZlcnRpbmcgaW5wdXQgY29ubmVjdGVkIHRvIGNhbGlicmF0aW9uIHJlZmVyZW5jZSB2b2x0YWdlLiAqLworICAgICAgU0VUX0JJVChob3BhbXAtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9GT1JDRVZQKTsKKworICAgICAgLyogIHVzZXIgdHJpbW1pbmcgdmFsdWVzIGFyZSB1c2VkIGZvciBvZmZzZXQgY2FsaWJyYXRpb24gKi8KKyAgICAgIFNFVF9CSVQoaG9wYW1wLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfVVNFUlRSSU0pOworICAgICAgCisgICAgICAvKiBFbmFibGUgY2FsaWJyYXRpb24gKi8KKyAgICAgIFNFVF9CSVQgKGhvcGFtcC0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX0NBTE9OKTsKKyAgCisgICAgICAvKiAxc3QgY2FsaWJyYXRpb24gLSBOICovCisgICAgICAvKiBTZWxlY3QgOTBVJSBWUkVGICovCisgICAgICBNT0RJRllfUkVHKGhvcGFtcC0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX0NBTFNFTCwgT1BBTVBfVlJFRl85MFZEREEpOworICAgICAgCisgICAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIG9wYW1wICovCisgICAgICBTRVRfQklUIChob3BhbXAtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9PUEFNUHhFTik7CisgICAgICAKKyAgICAgIC8qIEluaXQgdHJpbW1pbmcgY291bnRlciAqLyAgICAKKyAgICAgIC8qIE1lZGl1bSB2YWx1ZSAqLworICAgICAgdHJpbW1pbmd2YWx1ZW4gPSAxNlU7IAorICAgICAgZGVsdGEgPSA4VTsKKyAgICAgIAorICAgICAgd2hpbGUgKGRlbHRhICE9IDBVKQorICAgICAgeworICAgICAgICAvKiBTZXQgY2FuZGlkYXRlIHRyaW1taW5nICovCisgICAgICAgIE1PRElGWV9SRUcoaG9wYW1wLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfVFJJTU9GRlNFVE4sIHRyaW1taW5ndmFsdWVuPDxPUEFNUF9JTlBVVF9JTlZFUlRJTkcpOworICAgICAgICAgICAgICAKKyAgICAgICAgLyogT0ZGVFJJTW1heCBkZWxheSAyIG1zIGFzIHBlciBkYXRhc2hlZXQgKGVsZWN0cmljYWwgY2hhcmFjdGVyaXN0aWNzICovIAorICAgICAgICAvKiBPZmZzZXQgdHJpbSB0aW1lOiBkdXJpbmcgY2FsaWJyYXRpb24sIG1pbmltdW0gdGltZSBuZWVkZWQgYmV0d2VlbiAqLworICAgICAgICAvKiB0d28gc3RlcHMgdG8gaGF2ZSAxIG1WIGFjY3VyYWN5ICovCisgICAgICAgIEhBTF9EZWxheSgyVSk7CisKKyAgICAgICAgaWYgKChob3BhbXAtPkluc3RhbmNlLT5DU1IgJiBPUEFNUF9DU1JfT1VUQ0FMKSAhPSBSRVNFVCkKKyAgICAgICAgeyAKKyAgICAgICAgICAvKiBPUEFNUF9DU1JfT1VUQ0FMIGlzIEhJR0ggdHJ5IGhpZ2hlciB0cmltbWluZyAqLworICAgICAgICAgIHRyaW1taW5ndmFsdWVuICs9IGRlbHRhOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIE9QQU1QX0NTUl9PVVRDQUwgaXMgTE9XIHRyeSBsb3dlciB0cmltbWluZyAqLworICAgICAgICAgIHRyaW1taW5ndmFsdWVuIC09IGRlbHRhOworICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGRlbHRhID4+PSAxVTsKKyAgICAgIH0KKworICAgICAgLyogU3RpbGwgbmVlZCB0byBjaGVjayBpZiByaWdoIGNhbGlicmF0aW9uIGlzIGN1cnJlbnQgdmFsdWUgb3IgdW4gc3RlcCBiZWxvdyAqLworICAgICAgLyogSW5kZWVkIHRoZSBmaXJzdCB2YWx1ZSB0aGF0IGNhdXNlcyB0aGUgT1VUQ0FMIGJpdCB0byBjaGFuZ2UgZnJvbSAxIHRvIDAgICovCisgICAgICBNT0RJRllfUkVHKGhvcGFtcC0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX1RSSU1PRkZTRVROLCB0cmltbWluZ3ZhbHVlbjw8T1BBTVBfSU5QVVRfSU5WRVJUSU5HKTsKKyAgICAgIAorICAgICAgIC8qIE9GRlRSSU1tYXggZGVsYXkgMiBtcyBhcyBwZXIgZGF0YXNoZWV0IChlbGVjdHJpY2FsIGNoYXJhY3RlcmlzdGljcyAqLyAKKyAgICAgICAvKiBPZmZzZXQgdHJpbSB0aW1lOiBkdXJpbmcgY2FsaWJyYXRpb24sIG1pbmltdW0gdGltZSBuZWVkZWQgYmV0d2VlbiAqLworICAgICAgIC8qIHR3byBzdGVwcyB0byBoYXZlIDEgbVYgYWNjdXJhY3kgKi8KKyAgICAgICBIQUxfRGVsYXkoMlUpOworICAgICAgCisgICAgICBpZiAoKGhvcGFtcC0+SW5zdGFuY2UtPkNTUiAmIE9QQU1QX0NTUl9PVVRDQUwpICE9IFJFU0VUKSAKKyAgICAgIHsgCisgICAgICAgIC8qIE9QQU1QX0NTUl9PVVRDQUwgaXMgYWN0dWFsbHkgb25lIHZhbHVlIG1vcmUgKi8KKyAgICAgICAgdHJpbW1pbmd2YWx1ZW4rKzsKKyAgICAgICAgLyogU2V0IHJpZ2h0IHRyaW1taW5nICovCisgICAgICAgIE1PRElGWV9SRUcoaG9wYW1wLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfVFJJTU9GRlNFVE4sIHRyaW1taW5ndmFsdWVuPDxPUEFNUF9JTlBVVF9JTlZFUlRJTkcpOworICAgICAgfQorICAgICAgIAorICAgICAgLyogMm5kIGNhbGlicmF0aW9uIC0gUCAqLworICAgICAgLyogU2VsZWN0IDEwVSUgVlJFRiAqLworICAgICAgTU9ESUZZX1JFRyhob3BhbXAtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9DQUxTRUwsIE9QQU1QX1ZSRUZfMTBWRERBKTsKKyAgICAgIAorICAgICAgLyogSW5pdCB0cmltbWluZyBjb3VudGVyICovICAgIAorICAgICAgLyogTWVkaXVtIHZhbHVlICovCisgICAgICB0cmltbWluZ3ZhbHVlcCA9IDE2VTsgCisgICAgICBkZWx0YSA9IDhVOworICAgICAgCisgICAgICB3aGlsZSAoZGVsdGEgIT0gMFUpCisgICAgICB7CisgICAgICAgIC8qIFNldCBjYW5kaWRhdGUgdHJpbW1pbmcgKi8KKyAgICAgICAgTU9ESUZZX1JFRyhob3BhbXAtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9UUklNT0ZGU0VUUCwgdHJpbW1pbmd2YWx1ZXA8PE9QQU1QX0lOUFVUX05PTklOVkVSVElORyk7CisgICAgICAgICAgICAgICAKKyAgICAgICAgLyogT0ZGVFJJTW1heCBkZWxheSAyIG1zIGFzIHBlciBkYXRhc2hlZXQgKGVsZWN0cmljYWwgY2hhcmFjdGVyaXN0aWNzICovIAorICAgICAgICAvKiBPZmZzZXQgdHJpbSB0aW1lOiBkdXJpbmcgY2FsaWJyYXRpb24sIG1pbmltdW0gdGltZSBuZWVkZWQgYmV0d2VlbiAqLworICAgICAgICAvKiB0d28gc3RlcHMgdG8gaGF2ZSAxIG1WIGFjY3VyYWN5ICovCisgICAgICAgIEhBTF9EZWxheSgyVSk7CisKKyAgICAgICAgaWYgKChob3BhbXAtPkluc3RhbmNlLT5DU1IgJiBPUEFNUF9DU1JfT1VUQ0FMKSAhPSBSRVNFVCkgCisgICAgICAgIHsgCisgICAgICAgICAgLyogT1BBTVBfQ1NSX09VVENBTCBpcyBISUdIIHRyeSBoaWdoZXIgdHJpbW1pbmcgKi8KKyAgICAgICAgICB0cmltbWluZ3ZhbHVlcCArPSBkZWx0YTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB0cmltbWluZ3ZhbHVlcCAtPSBkZWx0YTsKKyAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBkZWx0YSA+Pj0gMVU7CisgICAgICB9CisgICAgICAKKyAgICAgIC8qIFN0aWxsIG5lZWQgdG8gY2hlY2sgaWYgcmlnaCBjYWxpYnJhdGlvbiBpcyBjdXJyZW50IHZhbHVlIG9yIHVuIHN0ZXAgYmVsb3cgKi8KKyAgICAgIC8qIEluZGVlZCB0aGUgZmlyc3QgdmFsdWUgdGhhdCBjYXVzZXMgdGhlIE9VVENBTCBiaXQgdG8gY2hhbmdlIGZyb20gMSB0byAwVSAqLworICAgICAgLyogU2V0IGNhbmRpZGF0ZSB0cmltbWluZyAqLworICAgICAgTU9ESUZZX1JFRyhob3BhbXAtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9UUklNT0ZGU0VUUCwgdHJpbW1pbmd2YWx1ZXA8PE9QQU1QX0lOUFVUX05PTklOVkVSVElORyk7CisKKyAgICAgICAvKiBPRkZUUklNbWF4IGRlbGF5IDIgbXMgYXMgcGVyIGRhdGFzaGVldCAoZWxlY3RyaWNhbCBjaGFyYWN0ZXJpc3RpY3MgKi8gCisgICAgICAgLyogT2Zmc2V0IHRyaW0gdGltZTogZHVyaW5nIGNhbGlicmF0aW9uLCBtaW5pbXVtIHRpbWUgbmVlZGVkIGJldHdlZW4gKi8KKyAgICAgICAvKiB0d28gc3RlcHMgdG8gaGF2ZSAxIG1WIGFjY3VyYWN5ICovCisgICAgICAgSEFMX0RlbGF5KDJVKTsKKyAgICAgIAorICAgICAgaWYgKChob3BhbXAtPkluc3RhbmNlLT5DU1IgJiBPUEFNUF9DU1JfT1VUQ0FMKSAhPSBSRVNFVCkKKyAgICAgIHsgCisgICAgICAgIC8qIE9QQU1QX0NTUl9PVVRDQUwgaXMgYWN0dWFsbHkgb25lIHZhbHVlIG1vcmUgKi8KKyAgICAgICAgdHJpbW1pbmd2YWx1ZXArKzsKKyAgICAgICAgLyogU2V0IHJpZ2h0IHRyaW1taW5nICovCisgICAgICAgIE1PRElGWV9SRUcoaG9wYW1wLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfVFJJTU9GRlNFVFAsIHRyaW1taW5ndmFsdWVwPDxPUEFNUF9JTlBVVF9OT05JTlZFUlRJTkcpOworICAgICAgfQorICAgICAgICAgICAKKyAgICAgIC8qIERpc2FibGUgY2FsaWJyYXRpb24gKi8KKyAgICAgIENMRUFSX0JJVCAoaG9wYW1wLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfQ0FMT04pOworCisgICAgICAvKiBEaXNhYmxlIHRoZSBPUEFNUCAqLworICAgICAgQ0xFQVJfQklUIChob3BhbXAtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9PUEFNUHhFTik7CisgICAgICAKKyAgICAgIC8qIFNldCBvcGVyYXRpbmcgbW9kZSAgKi8KKyAgICAgIC8qIE5vbi1pbnZlcnRpbmcgaW5wdXQgY29ubmVjdGVkIHRvIGNhbGlicmF0aW9uIHJlZmVyZW5jZSB2b2x0YWdlLiAqLworICAgICAgQ0xFQVJfQklUKGhvcGFtcC0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX0ZPUkNFVlApOworICAgICAgICAgICAgCisgICAgICAvKiBTZWxmIGNhbGlicmF0aW9uIGlzIHN1Y2Nlc3NmdWwgICovCisgICAgICAvKiBTdG9yZSBjYWxpYnJhdGlvbih1c2VyIHRpbW1pbmcpIHJlc3VsdHMgaW4gaW5pdCBzdHJ1Y3R1cmUuICovCisKKyAgICAgIC8qIFdyaXRlIGNhbGlicmF0aW9uIHJlc3VsdCBOICovCisgICAgICBob3BhbXAtPkluaXQuVHJpbW1pbmdWYWx1ZU4gPSB0cmltbWluZ3ZhbHVlbjsKKyAgICAgCisgICAgICAvKiBXcml0ZSBjYWxpYnJhdGlvbiByZXN1bHQgUCAqLworICAgICAgaG9wYW1wLT5Jbml0LlRyaW1taW5nVmFsdWVQID0gdHJpbW1pbmd2YWx1ZXA7CisKKyAgICAgIC8qIFNlbGVjdCB1c2VyIHRpbW1pbmcgbW9kZSAqLyAgICAgIAorICAgICAgLyogQW5kIHVwZGF0ZWQgd2l0aCBjYWxpYnJhdGVkIHNldHRpbmdzICovCisgICAgICBob3BhbXAtPkluaXQuVXNlclRyaW1taW5nID0gT1BBTVBfVFJJTU1JTkdfVVNFUjsKKyAgICAgIE1PRElGWV9SRUcoaG9wYW1wLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfVFJJTU9GRlNFVFAsIHRyaW1taW5ndmFsdWVwPDxPUEFNUF9JTlBVVF9OT05JTlZFUlRJTkcpOworICAgICAgTU9ESUZZX1JFRyhob3BhbXAtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9UUklNT0ZGU0VUTiwgdHJpbW1pbmd2YWx1ZW48PE9QQU1QX0lOUFVUX0lOVkVSVElORyk7CisgICAgfQorCisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIE9QQU1QIGNhbiBub3QgYmUgY2FsaWJyYXRlZCBmcm9tIHRoaXMgbW9kZSAqLyAKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICB9ICAgCisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBPUEFNUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgCisgKiAgQGJyaWVmICAgbWFuYWdlbWVudCBmdW5jdGlvbnMgCisgKgorQHZlcmJhdGltICAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb250cm9sIHRoZSBPUEFNUCBkYXRhIAorICAgIHRyYW5zZmVycy4KKworCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgTG9jayB0aGUgc2VsZWN0ZWQgb3BhbXAgY29uZmlndXJhdGlvbi4gCisgICogQHBhcmFtICBob3BhbXAgT1BBTVAgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfT1BBTVBfTG9jayhPUEFNUF9IYW5kbGVUeXBlRGVmICpob3BhbXApCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBDaGVjayB0aGUgT1BBTVAgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgLyogQ2hlY2sgaWYgT1BBTVAgbG9ja2VkICovCisgIC8qIE9QQU1QIGNhbiBiZSBsb2NrZWQgd2hlbiBlbmFibGVkIGFuZCBydW5uaW5nIGluIG5vcm1hbCBtb2RlICovIAorICAvKiAgIEl0IGlzIG1lYW5pbmdsZXNzIG90aGVyd2lzZSAqLworICBpZigoaG9wYW1wID09IE5VTEwpIHx8IChob3BhbXAtPlN0YXRlID09IEhBTF9PUEFNUF9TVEFURV9SRVNFVCkgXAorICAgICAgICAgICAgICAgICAgICAgIHx8IChob3BhbXAtPlN0YXRlID09IEhBTF9PUEFNUF9TVEFURV9SRUFEWSkgXAorICAgICAgICAgICAgICAgICAgICAgIHx8IChob3BhbXAtPlN0YXRlID09IEhBTF9PUEFNUF9TVEFURV9DQUxJQkJVU1kpXAorICAgICAgICAgICAgICAgICAgICAgIHx8IChob3BhbXAtPlN0YXRlID09IEhBTF9PUEFNUF9TVEFURV9CVVNZTE9DS0VEKSkKKyAgCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgCisgIGVsc2UKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfT1BBTVBfQUxMX0lOU1RBTkNFKGhvcGFtcC0+SW5zdGFuY2UpKTsKKyAgICAKKyAgIC8qIExvY2sgT1BBTVAgKi8KKyAgICBTRVRfQklUIChob3BhbXAtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9MT0NLKTsKKyAgCisgICAvKiBPUEFNUCBzdGF0ZSBjaGFuZ2VkIHRvIGxvY2tlZCAqLworICAgIGhvcGFtcC0+U3RhdGUgPSBIQUxfT1BBTVBfU1RBVEVfQlVTWUxPQ0tFRDsKKyAgfQorICByZXR1cm4gc3RhdHVzOyAKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBPUEFNUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zIAorICogIEBicmllZiAgIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zIAorICoKK0B2ZXJiYXRpbSAgIAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcGVybWl0IHRvIGdldCBpbiBydW4tdGltZSB0aGUgc3RhdHVzIG9mIHRoZSBwZXJpcGhlcmFsIAorICAgIGFuZCB0aGUgZGF0YSBmbG93LgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgT1BBTVAgc3RhdGUKKyAgKiBAcGFyYW0gIGhvcGFtcCBPUEFNUCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLworSEFMX09QQU1QX1N0YXRlVHlwZURlZiBIQUxfT1BBTVBfR2V0U3RhdGUoT1BBTVBfSGFuZGxlVHlwZURlZiAqaG9wYW1wKQoreworICAvKiBDaGVjayB0aGUgT1BBTVAgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYoaG9wYW1wID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX09QQU1QX1NUQVRFX1JFU0VUOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfT1BBTVBfQUxMX0lOU1RBTkNFKGhvcGFtcC0+SW5zdGFuY2UpKTsKKworICByZXR1cm4gaG9wYW1wLT5TdGF0ZTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIE9QQU1QIGZhY3RvcnkgdHJpbW1pbmcgdmFsdWUKKyAgKiBAcGFyYW0gIGhvcGFtcCBPUEFNUCBoYW5kbGUKKyAgKiBAcGFyYW0gIHRyaW1taW5nb2Zmc2V0IFRyaW1taW5nIG9mZnNldCAoUCBvciBOKQorICAqIEByZXR2YWwgVHJpbW1pbmcgdmFsdWUgKFAgb3IgTik6IHJhbmdlOiAwLT4zMQorICAqICAgICAgICAgb3IgT1BBTVBfRkFDVE9SWVRSSU1NSU5HX0RVTU1ZIGlmIHRyaW1taW5nIHZhbHVlIGlzIG5vdCBhdmFpbGFibGUKKyAqLworCitPUEFNUF9UcmltbWluZ1ZhbHVlVHlwZURlZiBIQUxfT1BBTVBfR2V0VHJpbU9mZnNldCAoT1BBTVBfSGFuZGxlVHlwZURlZiAqaG9wYW1wLCB1aW50MzJfdCB0cmltbWluZ29mZnNldCkKK3sKKyAgdWludDMyX3Qgb2xkdXNlcnRyaW1taW5nID0gMFU7CisgIE9QQU1QX1RyaW1taW5nVmFsdWVUeXBlRGVmICBvbGR0cmltbWluZ3ZhbHVlcCA9IDBVLCBvbGR0cmltbWluZ3ZhbHVlbiA9IDBVLCB0cmltbWluZ3ZhbHVlID0gMFU7CisgIAorICAvKiBDaGVjayB0aGUgT1BBTVAgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgLyogVmFsdWUgY2FuIGJlIHJldHJpZXZlZCBpbiBIQUxfT1BBTVBfU1RBVEVfUkVBRFkgc3RhdGUgKi8KKyAgaWYoKGhvcGFtcCA9PSBOVUxMKSB8fCAoaG9wYW1wLT5TdGF0ZSA9PSBIQUxfT1BBTVBfU1RBVEVfUkVTRVQpIFwKKyAgICAgICAgICAgICAgICAgICAgICB8fCAoaG9wYW1wLT5TdGF0ZSA9PSBIQUxfT1BBTVBfU1RBVEVfQlVTWSkgXAorICAgICAgICAgICAgICAgICAgICAgIHx8IChob3BhbXAtPlN0YXRlID09IEhBTF9PUEFNUF9TVEFURV9DQUxJQkJVU1kpXAorICAgICAgICAgICAgICAgICAgICAgIHx8IChob3BhbXAtPlN0YXRlID09IEhBTF9PUEFNUF9TVEFURV9CVVNZTE9DS0VEKSkKKyAgeworICAgIHJldHVybiBPUEFNUF9GQUNUT1JZVFJJTU1JTkdfRFVNTVk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICAgIGFzc2VydF9wYXJhbShJU19PUEFNUF9BTExfSU5TVEFOQ0UoaG9wYW1wLT5JbnN0YW5jZSkpOworICAgIGFzc2VydF9wYXJhbShJU19PUEFNUF9GQUNUT1JZVFJJTU1JTkcodHJpbW1pbmdvZmZzZXQpKTsKKyAgICAKKyAgICAvKiBDaGVjayB0aGUgdHJpbW1pbmcgbW9kZSAqLworICAgIGlmICgoUkVBRF9CSVQoaG9wYW1wLT5JbnN0YW5jZS0+Q1NSLE9QQU1QX0NTUl9VU0VSVFJJTSkpICE9IFJFU0VUKSAKKyAgICB7CisgICAgICAvKiBVc2VyIHRyaW1taW5nIGlzIHVzZWQgKi8KKyAgICAgIG9sZHVzZXJ0cmltbWluZyA9IE9QQU1QX1RSSU1NSU5HX1VTRVI7CisgICAgICAvKiBTdG9yZSB0aGUgVHJpbW1pbmdWYWx1ZVAgJiBUcmltbWluZ1ZhbHVlTiAqLworICAgICAgb2xkdHJpbW1pbmd2YWx1ZXAgPSAoaG9wYW1wLT5JbnN0YW5jZS0+Q1NSICYgT1BBTVBfQ1NSX1RSSU1PRkZTRVRQKSA+PiBPUEFNUF9JTlBVVF9OT05JTlZFUlRJTkc7CisgICAgICBvbGR0cmltbWluZ3ZhbHVlbiA9IChob3BhbXAtPkluc3RhbmNlLT5DU1IgJiBPUEFNUF9DU1JfVFJJTU9GRlNFVE4pID4+IE9QQU1QX0lOUFVUX0lOVkVSVElORzsKKyAgICB9CisgICAgCisgICAgLyogU2V0IGZhY3RvcnkgdGltbWluZyBtb2RlICovCisgICAgQ0xFQVJfQklUIChob3BhbXAtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9VU0VSVFJJTSk7CisgICAgCisgICAgLyogR2V0IGZhY3RvcnkgdHJpbW1pbmcgICovCisgICAgaWYgKHRyaW1taW5nb2Zmc2V0ID09IE9QQU1QX0ZBQ1RPUllUUklNTUlOR19QKQorICAgIHsKKyAgICAgIC8qIFJldHVybiBUcmltT2Zmc2V0UCAqLworICAgICB0cmltbWluZ3ZhbHVlID0gKChob3BhbXAtPkluc3RhbmNlLT5DU1IgJiBPUEFNUF9DU1JfVFJJTU9GRlNFVFApID4+IE9QQU1QX0lOUFVUX05PTklOVkVSVElORyk7CisgICAgfQorICAgIGVsc2UgCisgICAgeworICAgICAgLyogUmV0dXJuIFRyaW1PZmZzZXROICovCisgICAgICB0cmltbWluZ3ZhbHVlID0gKChob3BhbXAtPkluc3RhbmNlLT5DU1IgJiBPUEFNUF9DU1JfVFJJTU9GRlNFVE4pID4+IE9QQU1QX0lOUFVUX0lOVkVSVElORyk7CisgICAgfQorICAgIAorICAgIC8qIFJlc3RvcmUgdXNlciB0cmltbWluZyBjb25maWd1cmF0aW9uIGlmIGl0IHdhcyBmb3JtZXJseSBzZXQgKi8KKyAgICAvKiBDaGVjayBpZiB1c2VyIHRyaW1taW5nIHdhcyB1c2VkICovCisgICAgaWYgKG9sZHVzZXJ0cmltbWluZyA9PSBPUEFNUF9UUklNTUlOR19VU0VSKSAKKyAgICB7CisgICAgICAvKiBSZXN0b3JlIHVzZXIgdHJpbW1pbmcgKi8KKyAgICAgIFNFVF9CSVQoaG9wYW1wLT5JbnN0YW5jZS0+Q1NSLE9QQU1QX0NTUl9VU0VSVFJJTSk7CisgICAgICBNT0RJRllfUkVHKGhvcGFtcC0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX1RSSU1PRkZTRVRQLCBvbGR0cmltbWluZ3ZhbHVlcDw8T1BBTVBfSU5QVVRfTk9OSU5WRVJUSU5HKTsKKyAgICAgIE1PRElGWV9SRUcoaG9wYW1wLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfVFJJTU9GRlNFVE4sIG9sZHRyaW1taW5ndmFsdWVuPDxPUEFNUF9JTlBVVF9JTlZFUlRJTkcpOworICAgIH0KKyAgfSAgCisgIHJldHVybiB0cmltbWluZ3ZhbHVlOworfQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisKKyNlbmRpZiAvKiBIQUxfT1BBTVBfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjN4eF9oYWxfb3BhbXBfZXguYyBiL1NyYy9zdG0zMmYzeHhfaGFsX29wYW1wX2V4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY2MTRjNgotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfaGFsX29wYW1wX2V4LmMKQEAgLTAsMCArMSw3NDMgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX29wYW1wX2V4LmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEV4dGVuZGVkIE9QQU1QIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgUG93ZXIgQ29udHJvbGxlciAoT1BBTVApIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgRXh0ZW5kZWQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uICBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wgIGZ1bmN0aW9ucworICAqICAgICAgICAgCisgIEB2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfT1BBTVBfTU9EVUxFX0VOQUJMRUQKKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisKKy8qKiBAZGVmZ3JvdXAgT1BBTVBFeCBPUEFNUEV4CisgICogQGJyaWVmIE9QQU1QIEV4dGVuZGVkIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqIEB7CisgICovCisKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBPUEFNUEV4X0V4cG9ydGVkX0Z1bmN0aW9ucyBPUEFNUCBFeHRlbmRlZCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisKKy8qKiBAZGVmZ3JvdXAgT1BBTVBFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEV4dGVuZGVkIElucHV0IGFuZCBPdXRwdXQgb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBFeHRlbmRlZCBTZWxmIGNhbGlicmF0aW9uIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEV4dGVuZGVkIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKQorLyogIDIgT1BBTVBTIGF2YWlsYWJsZSAqLworLyogIDIgT1BBTVBTIGNhbiBiZSBjYWxpYnJhdGVkIGluIHBhcmFsbGVsICovCisKKy8qKgorICAqIEBicmllZiAgUnVuIHRoZSBzZWxmIGNhbGlicmF0aW9uIG9mIDIgT1BBTVBzIGluIHBhcmFsbGVsLgorICAqIEBwYXJhbSAgaG9wYW1wMSBoYW5kbGUKKyAgKiBAcGFyYW0gIGhvcGFtcDIgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICogQG5vdGUgICBVcGRhdGVkIG9mZnNldCB0cmltbWluZyB2YWx1ZXMgKFBNT1MgJiBOTU9TKSwgdXNlciB0cmltbWluZyBpcyBlbmFibGVkCisgICogQG5vdGUgICBDYWxpYnJhdGlvbiBydW5zIGFib3V0IDI1IG1zLgorICAqLworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfT1BBTVBFeF9TZWxmQ2FsaWJyYXRlQWxsKE9QQU1QX0hhbmRsZVR5cGVEZWYgKmhvcGFtcDEsIE9QQU1QX0hhbmRsZVR5cGVEZWYgKmhvcGFtcDIpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgCisgIHVpbnQzMl90IHRyaW1taW5ndmFsdWVuMSA9IDBVOworICB1aW50MzJfdCB0cmltbWluZ3ZhbHVlcDEgPSAwVTsKKyAgdWludDMyX3QgdHJpbW1pbmd2YWx1ZW4yID0gMFU7CisgIHVpbnQzMl90IHRyaW1taW5ndmFsdWVwMiA9IDBVOworCisgIHVpbnQzMl90IGRlbHRhOworCisgIGlmKChob3BhbXAxID09IE5VTEwpIHx8IChob3BhbXAxLT5TdGF0ZSA9PSBIQUxfT1BBTVBfU1RBVEVfQlVTWUxPQ0tFRCkgfHwgXAorICAgICAoaG9wYW1wMiA9PSBOVUxMKSB8fCAoaG9wYW1wMi0+U3RhdGUgPT0gSEFMX09QQU1QX1NUQVRFX0JVU1lMT0NLRUQpKSAKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorIAorICBpZihzdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgLyogQ2hlY2sgaWYgT1BBTVAgaW4gY2FsaWJyYXRpb24gbW9kZSBhbmQgY2FsaWJyYXRpb24gbm90IHlldCBlbmFibGUgKi8KKyAgICBpZigoaG9wYW1wMS0+U3RhdGUgPT0gIEhBTF9PUEFNUF9TVEFURV9SRUFEWSkgJiYgKGhvcGFtcDItPlN0YXRlID09ICBIQUxfT1BBTVBfU1RBVEVfUkVBRFkpKQorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19PUEFNUF9BTExfSU5TVEFOQ0UoaG9wYW1wMS0+SW5zdGFuY2UpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19PUEFNUF9BTExfSU5TVEFOQ0UoaG9wYW1wMi0+SW5zdGFuY2UpKTsKKworICAgICAgLyogU2V0IENhbGlicmF0aW9uIG1vZGUgKi8KKyAgICAgIC8qIE5vbi1pbnZlcnRpbmcgaW5wdXQgY29ubmVjdGVkIHRvIGNhbGlicmF0aW9uIHJlZmVyZW5jZSB2b2x0YWdlLiAqLworICAgICAgU0VUX0JJVChob3BhbXAxLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfRk9SQ0VWUCk7CisgICAgICBTRVRfQklUKGhvcGFtcDItPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9GT1JDRVZQKTsKKyAgICAgIAorICAgICAgLyogIHVzZXIgdHJpbW1pbmcgdmFsdWVzIGFyZSB1c2VkIGZvciBvZmZzZXQgY2FsaWJyYXRpb24gKi8KKyAgICAgIFNFVF9CSVQoaG9wYW1wMS0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX1VTRVJUUklNKTsKKyAgICAgIFNFVF9CSVQoaG9wYW1wMi0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX1VTRVJUUklNKTsKKyAgICAgIAorICAgICAgLyogRW5hYmxlIGNhbGlicmF0aW9uICovCisgICAgICBTRVRfQklUIChob3BhbXAxLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfQ0FMT04pOworICAgICAgU0VUX0JJVCAoaG9wYW1wMi0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX0NBTE9OKTsKKyAgICAgIAorICAgICAgLyogMXN0IGNhbGlicmF0aW9uIC0gTiAqLworICAgICAgLyogU2VsZWN0IDkwVSUgVlJFRiAqLworICAgICAgTU9ESUZZX1JFRyhob3BhbXAxLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfQ0FMU0VMLCBPUEFNUF9WUkVGXzkwVkREQSk7CisgICAgICBNT0RJRllfUkVHKGhvcGFtcDItPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9DQUxTRUwsIE9QQU1QX1ZSRUZfOTBWRERBKTsKKyAgICAgIAorICAgICAgLyogRW5hYmxlIHRoZSBvcGFtcHMgKi8KKyAgICAgIFNFVF9CSVQgKGhvcGFtcDEtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9PUEFNUHhFTik7CisgICAgICBTRVRfQklUIChob3BhbXAyLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfT1BBTVB4RU4pOworICAgICAgCisgICAgICAvKiBJbml0IHRyaW1taW5nIGNvdW50ZXIgKi8gICAgCisgICAgICAvKiBNZWRpdW0gdmFsdWUgKi8KKyAgICAgIHRyaW1taW5ndmFsdWVuMSA9IDE2VTsgCisgICAgICB0cmltbWluZ3ZhbHVlbjIgPSAxNlU7IAorICAgICAgZGVsdGEgPSA4VTsgCisgICAgCisgICAgICB3aGlsZSAoZGVsdGEgIT0gMFUpCisgICAgICB7CisgICAgICAgIC8qIFNldCBjYW5kaWRhdGUgdHJpbW1pbmcgKi8KKyAgICAgICAgTU9ESUZZX1JFRyhob3BhbXAxLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfVFJJTU9GRlNFVE4sIHRyaW1taW5ndmFsdWVuMTw8T1BBTVBfSU5QVVRfSU5WRVJUSU5HKTsKKyAgICAgICAgTU9ESUZZX1JFRyhob3BhbXAyLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfVFJJTU9GRlNFVE4sIHRyaW1taW5ndmFsdWVuMjw8T1BBTVBfSU5QVVRfSU5WRVJUSU5HKTsKKyAgICAgICAgICAgICAgCisgICAgICAgIC8qIE9GRlRSSU1tYXggZGVsYXkgMiBtcyBhcyBwZXIgZGF0YXNoZWV0IChlbGVjdHJpY2FsIGNoYXJhY3RlcmlzdGljcyAqLyAKKyAgICAgICAgLyogT2Zmc2V0IHRyaW0gdGltZTogZHVyaW5nIGNhbGlicmF0aW9uLCBtaW5pbXVtIHRpbWUgbmVlZGVkIGJldHdlZW4gKi8KKyAgICAgICAgLyogdHdvIHN0ZXBzIHRvIGhhdmUgMSBtViBhY2N1cmFjeSAqLworICAgICAgICBIQUxfRGVsYXkoMlUpOworCisgICAgICAgIGlmIChob3BhbXAxLT5JbnN0YW5jZS0+Q1NSICYgT1BBTVBfQ1NSX09VVENBTCkgCisgICAgICAgIHsgCisgICAgICAgICAgLyogT1BBTVBfQ1NSX09VVENBTCBpcyBISUdIIHRyeSBoaWdoZXIgdHJpbW1pbmcgKi8KKyAgICAgICAgICB0cmltbWluZ3ZhbHVlbjEgKz0gZGVsdGE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogT1BBTVBfQ1NSX09VVENBTCBpcyBMT1cgdHJ5IGxvd2VyIHRyaW1taW5nICovCisgICAgICAgICAgdHJpbW1pbmd2YWx1ZW4xIC09IGRlbHRhOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhvcGFtcDItPkluc3RhbmNlLT5DU1IgJiBPUEFNUF9DU1JfT1VUQ0FMKSAKKyAgICAgICAgeyAKKyAgICAgICAgICAvKiBPUEFNUF9DU1JfT1VUQ0FMIGlzIEhJR0ggdHJ5IGhpZ2hlciB0cmltbWluZyAqLworICAgICAgICAgIHRyaW1taW5ndmFsdWVuMiArPSBkZWx0YTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBPUEFNUF9DU1JfT1VUQ0FMIGlzIExPVyB0cnkgbG93ZXIgdHJpbW1pbmcgKi8KKyAgICAgICAgICB0cmltbWluZ3ZhbHVlbjIgLT0gZGVsdGE7CisgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgZGVsdGEgPj49IDFVOworICAgICAgfQorCisgICAgICAvLyBTdGlsbCBuZWVkIHRvIGNoZWNrIGlmIHJpZ2ggY2FsaWJyYXRpb24gaXMgY3VycmVudCB2YWx1ZSBvciB1biBzdGVwIGJlbG93CisgICAgICAvLyBJbmRlZWQgdGhlIGZpcnN0IHZhbHVlIHRoYXQgY2F1c2VzIHRoZSBPVVRDQUwgYml0IHRvIGNoYW5nZSBmcm9tIDEgdG8gMCAKKyAgICAgIE1PRElGWV9SRUcoaG9wYW1wMS0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX1RSSU1PRkZTRVROLCB0cmltbWluZ3ZhbHVlbjE8PE9QQU1QX0lOUFVUX0lOVkVSVElORyk7CisgICAgICBNT0RJRllfUkVHKGhvcGFtcDItPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9UUklNT0ZGU0VUTiwgdHJpbW1pbmd2YWx1ZW4yPDxPUEFNUF9JTlBVVF9JTlZFUlRJTkcpOworICAgICAgCisgICAgICAvKiBPRkZUUklNbWF4IGRlbGF5IDIgbXMgYXMgcGVyIGRhdGFzaGVldCAoZWxlY3RyaWNhbCBjaGFyYWN0ZXJpc3RpY3MgKi8gCisgICAgICAvKiBPZmZzZXQgdHJpbSB0aW1lOiBkdXJpbmcgY2FsaWJyYXRpb24sIG1pbmltdW0gdGltZSBuZWVkZWQgYmV0d2VlbiAqLworICAgICAgLyogdHdvIHN0ZXBzIHRvIGhhdmUgMSBtViBhY2N1cmFjeSAqLworICAgICAgSEFMX0RlbGF5KDJVKTsKKyAgICAgIAorICAgICAgaWYgKGhvcGFtcDEtPkluc3RhbmNlLT5DU1IgJiBPUEFNUF9DU1JfT1VUQ0FMKSAKKyAgICAgICAgeyAKKyAgICAgICAgICAvKiBPUEFNUF9DU1JfT1VUQ0FMIGlzIGFjdHVhbGx5IG9uZSB2YWx1ZSBtb3JlICovCisgICAgICAgICAgdHJpbW1pbmd2YWx1ZW4xKys7CisgICAgICAgICAgLyogU2V0IHJpZ2h0IHRyaW1taW5nICovCisgICAgICAgICAgTU9ESUZZX1JFRyhob3BhbXAxLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfVFJJTU9GRlNFVE4sIHRyaW1taW5ndmFsdWVuMTw8T1BBTVBfSU5QVVRfSU5WRVJUSU5HKTsKKyAgICAgICAgfQorCisgICAgICBpZiAoaG9wYW1wMi0+SW5zdGFuY2UtPkNTUiAmIE9QQU1QX0NTUl9PVVRDQUwpIAorICAgICAgICB7IAorICAgICAgICAgIC8qIE9QQU1QX0NTUl9PVVRDQUwgaXMgYWN0dWFsbHkgb25lIHZhbHVlIG1vcmUgKi8KKyAgICAgICAgICB0cmltbWluZ3ZhbHVlbjIrKzsKKyAgICAgICAgICAvKiBTZXQgcmlnaHQgdHJpbW1pbmcgKi8KKyAgICAgICAgICBNT0RJRllfUkVHKGhvcGFtcDEtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9UUklNT0ZGU0VUTiwgdHJpbW1pbmd2YWx1ZW4yPDxPUEFNUF9JTlBVVF9JTlZFUlRJTkcpOworICAgICAgICB9CisgICAgCisgICAgICAvKiAybmQgY2FsaWJyYXRpb24gLSBQICovCisgICAgICAvKiBTZWxlY3QgMTBVJSBWUkVGICovCisgICAgICBNT0RJRllfUkVHKGhvcGFtcDEtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9DQUxTRUwsIE9QQU1QX1ZSRUZfMTBWRERBKTsKKyAgICAgIE1PRElGWV9SRUcoaG9wYW1wMi0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX0NBTFNFTCwgT1BBTVBfVlJFRl8xMFZEREEpOworICAgICAgCisgICAgICAvKiBJbml0IHRyaW1taW5nIGNvdW50ZXIgKi8gICAgCisgICAgICAvKiBNZWRpdW0gdmFsdWUgKi8KKyAgICAgIHRyaW1taW5ndmFsdWVwMSA9IDE2VTsgCisgICAgICB0cmltbWluZ3ZhbHVlcDIgPSAxNlU7IAorICAgICAgZGVsdGEgPSA4VTsKKyAgICAgIAorICAgICAgd2hpbGUgKGRlbHRhICE9IDBVKQorICAgICAgeworICAgICAgICAvKiBTZXQgY2FuZGlkYXRlIHRyaW1taW5nICovCisgICAgICAgIE1PRElGWV9SRUcoaG9wYW1wMS0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX1RSSU1PRkZTRVRQLCB0cmltbWluZ3ZhbHVlcDE8PE9QQU1QX0lOUFVUX05PTklOVkVSVElORyk7CisgICAgICAgIE1PRElGWV9SRUcoaG9wYW1wMi0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX1RSSU1PRkZTRVRQLCB0cmltbWluZ3ZhbHVlcDI8PE9QQU1QX0lOUFVUX05PTklOVkVSVElORyk7CisgICAgICAgICAgICAgICAKKyAgICAgICAgLyogT0ZGVFJJTW1heCBkZWxheSAyIG1zIGFzIHBlciBkYXRhc2hlZXQgKGVsZWN0cmljYWwgY2hhcmFjdGVyaXN0aWNzICovIAorICAgICAgICAvKiBPZmZzZXQgdHJpbSB0aW1lOiBkdXJpbmcgY2FsaWJyYXRpb24sIG1pbmltdW0gdGltZSBuZWVkZWQgYmV0d2VlbiAqLworICAgICAgICAvKiB0d28gc3RlcHMgdG8gaGF2ZSAxIG1WIGFjY3VyYWN5ICovCisgICAgICAgIEhBTF9EZWxheSgyVSk7CisKKyAgICAgICAgaWYgKGhvcGFtcDEtPkluc3RhbmNlLT5DU1IgJiBPUEFNUF9DU1JfT1VUQ0FMKSAKKyAgICAgICAgeyAKKyAgICAgICAgICAvKiBPUEFNUF9DU1JfT1VUQ0FMIGlzIEhJR0ggdHJ5IGhpZ2hlciB0cmltbWluZyAqLworICAgICAgICAgIHRyaW1taW5ndmFsdWVwMSArPSBkZWx0YTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB0cmltbWluZ3ZhbHVlcDEgLT0gZGVsdGE7CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICBpZiAoaG9wYW1wMi0+SW5zdGFuY2UtPkNTUiAmIE9QQU1QX0NTUl9PVVRDQUwpIAorICAgICAgICB7IAorICAgICAgICAgIC8qIE9QQU1QX0NTUl9PVVRDQUwgaXMgSElHSCB0cnkgaGlnaGVyIHRyaW1taW5nICovCisgICAgICAgICAgdHJpbW1pbmd2YWx1ZXAyICs9IGRlbHRhOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHRyaW1taW5ndmFsdWVwMiAtPSBkZWx0YTsKKyAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBkZWx0YSA+Pj0gMVU7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIFN0aWxsIG5lZWQgdG8gY2hlY2sgaWYgcmlnaCBjYWxpYnJhdGlvbiBpcyBjdXJyZW50IHZhbHVlIG9yIHVuIHN0ZXAgYmVsb3cKKyAgICAgIC8vIEluZGVlZCB0aGUgZmlyc3QgdmFsdWUgdGhhdCBjYXVzZXMgdGhlIE9VVENBTCBiaXQgdG8gY2hhbmdlIGZyb20gMSB0byAwIAorICAgICAgLyogU2V0IGNhbmRpZGF0ZSB0cmltbWluZyAqLworICAgICAgTU9ESUZZX1JFRyhob3BhbXAxLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfVFJJTU9GRlNFVFAsIHRyaW1taW5ndmFsdWVwMTw8T1BBTVBfSU5QVVRfTk9OSU5WRVJUSU5HKTsKKyAgICAgIE1PRElGWV9SRUcoaG9wYW1wMi0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX1RSSU1PRkZTRVRQLCB0cmltbWluZ3ZhbHVlcDI8PE9QQU1QX0lOUFVUX05PTklOVkVSVElORyk7CisKKyAgICAgICAvKiBPRkZUUklNbWF4IGRlbGF5IDIgbXMgYXMgcGVyIGRhdGFzaGVldCAoZWxlY3RyaWNhbCBjaGFyYWN0ZXJpc3RpY3MgKi8gCisgICAgICAgLyogT2Zmc2V0IHRyaW0gdGltZTogZHVyaW5nIGNhbGlicmF0aW9uLCBtaW5pbXVtIHRpbWUgbmVlZGVkIGJldHdlZW4gKi8KKyAgICAgICAvKiB0d28gc3RlcHMgdG8gaGF2ZSAxIG1WIGFjY3VyYWN5ICovCisgICAgICAgSEFMX0RlbGF5KDJVKTsKKyAgICAgIAorICAgICAgaWYgKGhvcGFtcDEtPkluc3RhbmNlLT5DU1IgJiBPUEFNUF9DU1JfT1VUQ0FMKSAKKyAgICAgICAgeyAKKyAgICAgICAgICAvKiBPUEFNUF9DU1JfT1VUQ0FMIGlzIGFjdHVhbGx5IG9uZSB2YWx1ZSBtb3JlICovCisgICAgICAgICAgdHJpbW1pbmd2YWx1ZXAxKys7CisgICAgICAgICAgLyogU2V0IHJpZ2h0IHRyaW1taW5nICovCisgICAgICAgICAgTU9ESUZZX1JFRyhob3BhbXAxLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfVFJJTU9GRlNFVFAsIHRyaW1taW5ndmFsdWVwMTw8T1BBTVBfSU5QVVRfTk9OSU5WRVJUSU5HKTsKKyAgICAgICAgfQorICAgIAorICAgICAgaWYgKGhvcGFtcDItPkluc3RhbmNlLT5DU1IgJiBPUEFNUF9DU1JfT1VUQ0FMKSAKKyAgICAgICAgeyAKKyAgICAgICAgICAvKiBPUEFNUF9DU1JfT1VUQ0FMIGlzIGFjdHVhbGx5IG9uZSB2YWx1ZSBtb3JlICovCisgICAgICAgICAgdHJpbW1pbmd2YWx1ZXAyKys7CisgICAgICAgICAgLyogU2V0IHJpZ2h0IHRyaW1taW5nICovCisgICAgICAgICAgTU9ESUZZX1JFRyhob3BhbXAyLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfVFJJTU9GRlNFVFAsIHRyaW1taW5ndmFsdWVwMjw8T1BBTVBfSU5QVVRfTk9OSU5WRVJUSU5HKTsKKyAgICAgICAgfQorCisgICAgICAvKiBEaXNhYmxlIGNhbGlicmF0aW9uICovCisgICAgICBDTEVBUl9CSVQgKGhvcGFtcDEtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9DQUxPTik7CisgICAgICBDTEVBUl9CSVQgKGhvcGFtcDItPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9DQUxPTik7CisKKyAgICAgIC8qIERpc2FibGUgdGhlIE9QQU1QcyAqLworICAgICAgQ0xFQVJfQklUIChob3BhbXAxLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfT1BBTVB4RU4pOworICAgICAgQ0xFQVJfQklUIChob3BhbXAyLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfT1BBTVB4RU4pOworCisgICAgICAvKiBTZXQgb3BlcmF0aW5nIG1vZGUgYmFjayAqLworICAgICAgQ0xFQVJfQklUKGhvcGFtcDEtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9GT1JDRVZQKTsKKyAgICAgIENMRUFSX0JJVChob3BhbXAyLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfRk9SQ0VWUCk7CisgICAgICAKKyAgICAgIC8qIFNlbGYgY2FsaWJyYXRpb24gaXMgc3VjY2Vzc2Z1bCAgKi8KKyAgICAgIC8qIFN0b3JlIGNhbGlicmF0aW9uKHVzZXIgdGltbWluZykgcmVzdWx0cyBpbiBpbml0IHN0cnVjdHVyZS4gKi8KKyAgICAgIC8qIFNlbGVjdCB1c2VyIHRpbW1pbmcgbW9kZSAqLworCisgICAgICAvKiBXcml0ZSBjYWxpYnJhdGlvbiByZXN1bHQgTiAqLworICAgICAgaG9wYW1wMS0+SW5pdC5UcmltbWluZ1ZhbHVlTiA9IHRyaW1taW5ndmFsdWVuMTsKKyAgICAgIGhvcGFtcDItPkluaXQuVHJpbW1pbmdWYWx1ZU4gPSB0cmltbWluZ3ZhbHVlbjI7CisgICAgIAorICAgICAgLyogV3JpdGUgY2FsaWJyYXRpb24gcmVzdWx0IFAgKi8KKyAgICAgIGhvcGFtcDEtPkluaXQuVHJpbW1pbmdWYWx1ZVAgPSB0cmltbWluZ3ZhbHVlcDE7CisgICAgICBob3BhbXAyLT5Jbml0LlRyaW1taW5nVmFsdWVQID0gdHJpbW1pbmd2YWx1ZXAyOworICAgICAgICAgICAgCisgICAgICAvKiBDYWxpYnJhdGlvbiAqLworICAgICAgaG9wYW1wMS0+SW5pdC5Vc2VyVHJpbW1pbmcgPSBPUEFNUF9UUklNTUlOR19VU0VSOworICAgICAgaG9wYW1wMi0+SW5pdC5Vc2VyVHJpbW1pbmcgPSBPUEFNUF9UUklNTUlOR19VU0VSOworICAgIAorICAgICAgLyogU2VsZWN0IHVzZXIgdGltbWluZyBtb2RlICovICAgICAgCisgICAgICAvKiBBbmQgdXBkYXRlZCB3aXRoIGNhbGlicmF0ZWQgc2V0dGluZ3MgKi8KKyAgICAgIGhvcGFtcDEtPkluaXQuVXNlclRyaW1taW5nID0gT1BBTVBfVFJJTU1JTkdfVVNFUjsKKyAgICAgIGhvcGFtcDItPkluaXQuVXNlclRyaW1taW5nID0gT1BBTVBfVFJJTU1JTkdfVVNFUjsKKyAgICAgIAorICAgICAgTU9ESUZZX1JFRyhob3BhbXAxLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfVFJJTU9GRlNFVE4sIHRyaW1taW5ndmFsdWVuMTw8T1BBTVBfSU5QVVRfSU5WRVJUSU5HKTsKKyAgICAgIE1PRElGWV9SRUcoaG9wYW1wMi0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX1RSSU1PRkZTRVROLCB0cmltbWluZ3ZhbHVlbjI8PE9QQU1QX0lOUFVUX0lOVkVSVElORyk7CisgICAgIAorICAgICAgTU9ESUZZX1JFRyhob3BhbXAxLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfVFJJTU9GRlNFVFAsIHRyaW1taW5ndmFsdWVwMTw8T1BBTVBfSU5QVVRfTk9OSU5WRVJUSU5HKTsKKyAgICAgIE1PRElGWV9SRUcoaG9wYW1wMi0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX1RSSU1PRkZTRVRQLCB0cmltbWluZ3ZhbHVlcDI8PE9QQU1QX0lOUFVUX05PTklOVkVSVElORyk7ICAgICAgCisgICAgICAgICAgCisgICAgfQorICAgIAorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBBdCBsZWFzdCBvbmUgT1BBTVAgY2FuIG5vdCBiZSBjYWxpYnJhdGVkICovIAorICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgIH0gICAKKyAgfQorICAKKyAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkKKy8qICA0IE9QQU1QUyBhdmFpbGFibGUgKi8KKy8qICA0IE9QQU1QUyBjYW4gYmUgY2FsaWJyYXRlZCBpbiBwYXJhbGxlbCAqLworCisvKioKKyAgKiBAYnJpZWYgIFJ1biB0aGUgc2VsZiBjYWxpYnJhdGlvbiBvZiA0IE9QQU1QcyBpbiBwYXJhbGxlbC4KKyAgKiBAcGFyYW0gIGhvcGFtcDEgaGFuZGxlCisgICogQHBhcmFtICBob3BhbXAyIGhhbmRsZQorICAqIEBwYXJhbSAgaG9wYW1wMyBoYW5kbGUKKyAgKiBAcGFyYW0gIGhvcGFtcDQgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICogQG5vdGUgICBVcGRhdGVkIG9mZnNldCB0cmltbWluZyB2YWx1ZXMgKFBNT1MgJiBOTU9TKSwgdXNlciB0cmltbWluZyBpcyBlbmFibGVkCisgICogQG5vdGUgICBDYWxpYnJhdGlvbiBydW5zIGFib3V0IDI1IG1zLgorICAqLworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfT1BBTVBFeF9TZWxmQ2FsaWJyYXRlQWxsKE9QQU1QX0hhbmRsZVR5cGVEZWYgKmhvcGFtcDEsIE9QQU1QX0hhbmRsZVR5cGVEZWYgKmhvcGFtcDIsIE9QQU1QX0hhbmRsZVR5cGVEZWYgKmhvcGFtcDMsIE9QQU1QX0hhbmRsZVR5cGVEZWYgKmhvcGFtcDQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgCisgIHVpbnQzMl90IHRyaW1taW5ndmFsdWVuMSA9IDBVOworICB1aW50MzJfdCB0cmltbWluZ3ZhbHVlcDEgPSAwVTsKKyAgdWludDMyX3QgdHJpbW1pbmd2YWx1ZW4yID0gMFU7CisgIHVpbnQzMl90IHRyaW1taW5ndmFsdWVwMiA9IDBVOworICB1aW50MzJfdCB0cmltbWluZ3ZhbHVlbjMgPSAwVTsKKyAgdWludDMyX3QgdHJpbW1pbmd2YWx1ZXAzID0gMFU7CisgIHVpbnQzMl90IHRyaW1taW5ndmFsdWVuNCA9IDBVOworICB1aW50MzJfdCB0cmltbWluZ3ZhbHVlcDQgPSAwVTsKKworICB1aW50MzJfdCBkZWx0YTsKKworICBpZigoaG9wYW1wMSA9PSBOVUxMKSB8fCAoaG9wYW1wMS0+U3RhdGUgPT0gSEFMX09QQU1QX1NUQVRFX0JVU1lMT0NLRUQpIHx8IFwKKyAgICAgKGhvcGFtcDIgPT0gTlVMTCkgfHwgKGhvcGFtcDItPlN0YXRlID09IEhBTF9PUEFNUF9TVEFURV9CVVNZTE9DS0VEKSB8fCBcCisgICAgIChob3BhbXAzID09IE5VTEwpIHx8IChob3BhbXAzLT5TdGF0ZSA9PSBIQUxfT1BBTVBfU1RBVEVfQlVTWUxPQ0tFRCkgfHwgXAorICAgICAoaG9wYW1wNCA9PSBOVUxMKSB8fCAoaG9wYW1wNC0+U3RhdGUgPT0gSEFMX09QQU1QX1NUQVRFX0JVU1lMT0NLRUQpKSAKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorIAorICBpZihzdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgLyogQ2hlY2sgaWYgT1BBTVAgaW4gY2FsaWJyYXRpb24gbW9kZSBhbmQgY2FsaWJyYXRpb24gbm90IHlldCBlbmFibGUgKi8KKyAgICBpZigoaG9wYW1wMS0+U3RhdGUgPT0gIEhBTF9PUEFNUF9TVEFURV9SRUFEWSkgJiYgKGhvcGFtcDItPlN0YXRlID09ICBIQUxfT1BBTVBfU1RBVEVfUkVBRFkpICYmIFwKKyAgICAgICAoaG9wYW1wMy0+U3RhdGUgPT0gIEhBTF9PUEFNUF9TVEFURV9SRUFEWSkgJiYgKGhvcGFtcDQtPlN0YXRlID09ICBIQUxfT1BBTVBfU1RBVEVfUkVBRFkpKQorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19PUEFNUF9BTExfSU5TVEFOQ0UoaG9wYW1wMS0+SW5zdGFuY2UpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19PUEFNUF9BTExfSU5TVEFOQ0UoaG9wYW1wMi0+SW5zdGFuY2UpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19PUEFNUF9BTExfSU5TVEFOQ0UoaG9wYW1wMy0+SW5zdGFuY2UpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19PUEFNUF9BTExfSU5TVEFOQ0UoaG9wYW1wNC0+SW5zdGFuY2UpKTsKKworICAgICAgLyogU2V0IENhbGlicmF0aW9uIG1vZGUgKi8KKyAgICAgIC8qIE5vbi1pbnZlcnRpbmcgaW5wdXQgY29ubmVjdGVkIHRvIGNhbGlicmF0aW9uIHJlZmVyZW5jZSB2b2x0YWdlLiAqLworICAgICAgU0VUX0JJVChob3BhbXAxLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfRk9SQ0VWUCk7CisgICAgICBTRVRfQklUKGhvcGFtcDItPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9GT1JDRVZQKTsKKyAgICAgIFNFVF9CSVQoaG9wYW1wMy0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX0ZPUkNFVlApOworICAgICAgU0VUX0JJVChob3BhbXA0LT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfRk9SQ0VWUCk7CisgICAgICAKKyAgICAgIC8qICB1c2VyIHRyaW1taW5nIHZhbHVlcyBhcmUgdXNlZCBmb3Igb2Zmc2V0IGNhbGlicmF0aW9uICovCisgICAgICBTRVRfQklUKGhvcGFtcDEtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9VU0VSVFJJTSk7CisgICAgICBTRVRfQklUKGhvcGFtcDItPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9VU0VSVFJJTSk7CisgICAgICBTRVRfQklUKGhvcGFtcDMtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9VU0VSVFJJTSk7CisgICAgICBTRVRfQklUKGhvcGFtcDQtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9VU0VSVFJJTSk7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSBjYWxpYnJhdGlvbiAqLworICAgICAgU0VUX0JJVCAoaG9wYW1wMS0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX0NBTE9OKTsKKyAgICAgIFNFVF9CSVQgKGhvcGFtcDItPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9DQUxPTik7CisgICAgICBTRVRfQklUIChob3BhbXAzLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfQ0FMT04pOworICAgICAgU0VUX0JJVCAoaG9wYW1wNC0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX0NBTE9OKTsKKyAgICAgIAorICAgICAgLyogMXN0IGNhbGlicmF0aW9uIC0gTiAqLworICAgICAgLyogU2VsZWN0IDkwVSUgVlJFRiAqLworICAgICAgTU9ESUZZX1JFRyhob3BhbXAxLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfQ0FMU0VMLCBPUEFNUF9WUkVGXzkwVkREQSk7CisgICAgICBNT0RJRllfUkVHKGhvcGFtcDItPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9DQUxTRUwsIE9QQU1QX1ZSRUZfOTBWRERBKTsKKyAgICAgIE1PRElGWV9SRUcoaG9wYW1wMy0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX0NBTFNFTCwgT1BBTVBfVlJFRl85MFZEREEpOworICAgICAgTU9ESUZZX1JFRyhob3BhbXA0LT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfQ0FMU0VMLCBPUEFNUF9WUkVGXzkwVkREQSk7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSB0aGUgb3BhbXBzICovCisgICAgICBTRVRfQklUIChob3BhbXAxLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfT1BBTVB4RU4pOworICAgICAgU0VUX0JJVCAoaG9wYW1wMi0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX09QQU1QeEVOKTsKKyAgICAgIFNFVF9CSVQgKGhvcGFtcDMtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9PUEFNUHhFTik7CisgICAgICBTRVRfQklUIChob3BhbXA0LT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfT1BBTVB4RU4pOworICAgICAgCisgICAgICAvKiBJbml0IHRyaW1taW5nIGNvdW50ZXIgKi8gICAgCisgICAgICAvKiBNZWRpdW0gdmFsdWUgKi8KKyAgICAgIHRyaW1taW5ndmFsdWVuMSA9IDE2VTsgCisgICAgICB0cmltbWluZ3ZhbHVlbjIgPSAxNlU7IAorICAgICAgdHJpbW1pbmd2YWx1ZW4zID0gMTZVOyAKKyAgICAgIHRyaW1taW5ndmFsdWVuNCA9IDE2VTsgCisgICAgICBkZWx0YSA9IDhVOyAKKyAgICAKKyAgICAgIHdoaWxlIChkZWx0YSAhPSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogU2V0IGNhbmRpZGF0ZSB0cmltbWluZyAqLworICAgICAgICBNT0RJRllfUkVHKGhvcGFtcDEtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9UUklNT0ZGU0VUTiwgdHJpbW1pbmd2YWx1ZW4xPDxPUEFNUF9JTlBVVF9JTlZFUlRJTkcpOworICAgICAgICBNT0RJRllfUkVHKGhvcGFtcDItPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9UUklNT0ZGU0VUTiwgdHJpbW1pbmd2YWx1ZW4yPDxPUEFNUF9JTlBVVF9JTlZFUlRJTkcpOworICAgICAgICBNT0RJRllfUkVHKGhvcGFtcDMtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9UUklNT0ZGU0VUTiwgdHJpbW1pbmd2YWx1ZW4zPDxPUEFNUF9JTlBVVF9JTlZFUlRJTkcpOworICAgICAgICBNT0RJRllfUkVHKGhvcGFtcDQtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9UUklNT0ZGU0VUTiwgdHJpbW1pbmd2YWx1ZW40PDxPUEFNUF9JTlBVVF9JTlZFUlRJTkcpOworICAgICAgICAgICAgICAKKyAgICAgICAgLyogT0ZGVFJJTW1heCBkZWxheSAyIG1zIGFzIHBlciBkYXRhc2hlZXQgKGVsZWN0cmljYWwgY2hhcmFjdGVyaXN0aWNzICovIAorICAgICAgICAvKiBPZmZzZXQgdHJpbSB0aW1lOiBkdXJpbmcgY2FsaWJyYXRpb24sIG1pbmltdW0gdGltZSBuZWVkZWQgYmV0d2VlbiAqLworICAgICAgICAvKiB0d28gc3RlcHMgdG8gaGF2ZSAxIG1WIGFjY3VyYWN5ICovCisgICAgICAgIEhBTF9EZWxheSgyVSk7CisKKyAgICAgICAgaWYgKChob3BhbXAxLT5JbnN0YW5jZS0+Q1NSICYgT1BBTVBfQ1NSX09VVENBTCkgIT0gUkVTRVQpIAorICAgICAgICB7IAorICAgICAgICAgIC8qIE9QQU1QX0NTUl9PVVRDQUwgaXMgSElHSCB0cnkgaGlnaGVyIHRyaW1taW5nICovCisgICAgICAgICAgdHJpbW1pbmd2YWx1ZW4xICs9IGRlbHRhOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIE9QQU1QX0NTUl9PVVRDQUwgaXMgTE9XIHRyeSBsb3dlciB0cmltbWluZyAqLworICAgICAgICAgIHRyaW1taW5ndmFsdWVuMSAtPSBkZWx0YTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoaG9wYW1wMi0+SW5zdGFuY2UtPkNTUiAmIE9QQU1QX0NTUl9PVVRDQUwpICE9IFJFU0VUKSAKKyAgICAgICAgeyAKKyAgICAgICAgICAvKiBPUEFNUF9DU1JfT1VUQ0FMIGlzIEhJR0ggdHJ5IGhpZ2hlciB0cmltbWluZyAqLworICAgICAgICAgIHRyaW1taW5ndmFsdWVuMiArPSBkZWx0YTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBPUEFNUF9DU1JfT1VUQ0FMIGlzIExPVyB0cnkgbG93ZXIgdHJpbW1pbmcgKi8KKyAgICAgICAgICB0cmltbWluZ3ZhbHVlbjIgLT0gZGVsdGE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGhvcGFtcDMtPkluc3RhbmNlLT5DU1IgJiBPUEFNUF9DU1JfT1VUQ0FMKSAhPSBSRVNFVCkgCisgICAgICAgIHsgCisgICAgICAgICAgLyogT1BBTVBfQ1NSX09VVENBTCBpcyBISUdIIHRyeSBoaWdoZXIgdHJpbW1pbmcgKi8KKyAgICAgICAgICB0cmltbWluZ3ZhbHVlbjMgKz0gZGVsdGE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogT1BBTVBfQ1NSX09VVENBTCBpcyBMT1cgdHJ5IGxvd2VyIHRyaW1taW5nICovCisgICAgICAgICAgdHJpbW1pbmd2YWx1ZW4zIC09IGRlbHRhOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChob3BhbXA0LT5JbnN0YW5jZS0+Q1NSICYgT1BBTVBfQ1NSX09VVENBTCkgIT0gUkVTRVQpIAorICAgICAgICB7IAorICAgICAgICAgIC8qIE9QQU1QX0NTUl9PVVRDQUwgaXMgSElHSCB0cnkgaGlnaGVyIHRyaW1taW5nICovCisgICAgICAgICAgdHJpbW1pbmd2YWx1ZW40ICs9IGRlbHRhOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIE9QQU1QX0NTUl9PVVRDQUwgaXMgTE9XIHRyeSBsb3dlciB0cmltbWluZyAqLworICAgICAgICAgIHRyaW1taW5ndmFsdWVuNCAtPSBkZWx0YTsKKyAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBkZWx0YSA+Pj0gMVU7CisgICAgICB9CisKKyAgICAgIC8qIFN0aWxsIG5lZWQgdG8gY2hlY2sgaWYgcmlnaCBjYWxpYnJhdGlvbiBpcyBjdXJyZW50IHZhbHVlIG9yIHVuIHN0ZXAgYmVsb3cgKi8KKyAgICAgIC8qIEluZGVlZCB0aGUgZmlyc3QgdmFsdWUgdGhhdCBjYXVzZXMgdGhlIE9VVENBTCBiaXQgdG8gY2hhbmdlIGZyb20gMSB0byAwVSAqLworICAgICAgTU9ESUZZX1JFRyhob3BhbXAxLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfVFJJTU9GRlNFVE4sIHRyaW1taW5ndmFsdWVuMTw8T1BBTVBfSU5QVVRfSU5WRVJUSU5HKTsKKyAgICAgIE1PRElGWV9SRUcoaG9wYW1wMi0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX1RSSU1PRkZTRVROLCB0cmltbWluZ3ZhbHVlbjI8PE9QQU1QX0lOUFVUX0lOVkVSVElORyk7CisgICAgICBNT0RJRllfUkVHKGhvcGFtcDMtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9UUklNT0ZGU0VUTiwgdHJpbW1pbmd2YWx1ZW4zPDxPUEFNUF9JTlBVVF9JTlZFUlRJTkcpOworICAgICAgTU9ESUZZX1JFRyhob3BhbXA0LT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfVFJJTU9GRlNFVE4sIHRyaW1taW5ndmFsdWVuNDw8T1BBTVBfSU5QVVRfSU5WRVJUSU5HKTsKKyAgICAgIAorICAgICAgLyogT0ZGVFJJTW1heCBkZWxheSAyIG1zIGFzIHBlciBkYXRhc2hlZXQgKGVsZWN0cmljYWwgY2hhcmFjdGVyaXN0aWNzICovIAorICAgICAgLyogT2Zmc2V0IHRyaW0gdGltZTogZHVyaW5nIGNhbGlicmF0aW9uLCBtaW5pbXVtIHRpbWUgbmVlZGVkIGJldHdlZW4gKi8KKyAgICAgIC8qIHR3byBzdGVwcyB0byBoYXZlIDEgbVYgYWNjdXJhY3kgKi8KKyAgICAgIEhBTF9EZWxheSgyVSk7CisgICAgICAKKyAgICAgIGlmICgoaG9wYW1wMS0+SW5zdGFuY2UtPkNTUiAmIE9QQU1QX0NTUl9PVVRDQUwpICE9IFJFU0VUKSAKKyAgICAgIHsgCisgICAgICAgIC8qIE9QQU1QX0NTUl9PVVRDQUwgaXMgYWN0dWFsbHkgb25lIHZhbHVlIG1vcmUgKi8KKyAgICAgICAgdHJpbW1pbmd2YWx1ZW4xKys7CisgICAgICAgIC8qIFNldCByaWdodCB0cmltbWluZyAqLworICAgICAgICBNT0RJRllfUkVHKGhvcGFtcDEtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9UUklNT0ZGU0VUTiwgdHJpbW1pbmd2YWx1ZW4xPDxPUEFNUF9JTlBVVF9JTlZFUlRJTkcpOworICAgICAgfQorCisgICAgICBpZiAoKGhvcGFtcDItPkluc3RhbmNlLT5DU1IgJiBPUEFNUF9DU1JfT1VUQ0FMKSAhPSBSRVNFVCkgCisgICAgICB7IAorICAgICAgICAvKiBPUEFNUF9DU1JfT1VUQ0FMIGlzIGFjdHVhbGx5IG9uZSB2YWx1ZSBtb3JlICovCisgICAgICAgIHRyaW1taW5ndmFsdWVuMisrOworICAgICAgICAvKiBTZXQgcmlnaHQgdHJpbW1pbmcgKi8KKyAgICAgICAgTU9ESUZZX1JFRyhob3BhbXAyLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfVFJJTU9GRlNFVE4sIHRyaW1taW5ndmFsdWVuMjw8T1BBTVBfSU5QVVRfSU5WRVJUSU5HKTsKKyAgICAgIH0KKworICAgICAgaWYgKChob3BhbXAzLT5JbnN0YW5jZS0+Q1NSICYgT1BBTVBfQ1NSX09VVENBTCkgIT0gUkVTRVQpIAorICAgICAgeyAKKyAgICAgICAgLyogT1BBTVBfQ1NSX09VVENBTCBpcyBhY3R1YWxseSBvbmUgdmFsdWUgbW9yZSAqLworICAgICAgICB0cmltbWluZ3ZhbHVlbjMrKzsKKyAgICAgICAgLyogU2V0IHJpZ2h0IHRyaW1taW5nICovCisgICAgICAgIE1PRElGWV9SRUcoaG9wYW1wMy0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX1RSSU1PRkZTRVROLCB0cmltbWluZ3ZhbHVlbjM8PE9QQU1QX0lOUFVUX0lOVkVSVElORyk7CisgICAgICB9CisKKyAgICAgIGlmICgoaG9wYW1wNC0+SW5zdGFuY2UtPkNTUiAmIE9QQU1QX0NTUl9PVVRDQUwpICE9IFJFU0VUKSAKKyAgICAgIHsgCisgICAgICAgIC8qIE9QQU1QX0NTUl9PVVRDQUwgaXMgYWN0dWFsbHkgb25lIHZhbHVlIG1vcmUgKi8KKyAgICAgICAgdHJpbW1pbmd2YWx1ZW40Kys7CisgICAgICAgIC8qIFNldCByaWdodCB0cmltbWluZyAqLworICAgICAgICBNT0RJRllfUkVHKGhvcGFtcDQtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9UUklNT0ZGU0VUTiwgdHJpbW1pbmd2YWx1ZW40PDxPUEFNUF9JTlBVVF9JTlZFUlRJTkcpOworICAgICAgfQorICAgICAgICAgICAgCisgICAgICAvKiAybmQgY2FsaWJyYXRpb24gLSBQICovCisgICAgICAvKiBTZWxlY3QgMTBVJSBWUkVGICovCisgICAgICBNT0RJRllfUkVHKGhvcGFtcDEtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9DQUxTRUwsIE9QQU1QX1ZSRUZfMTBWRERBKTsKKyAgICAgIE1PRElGWV9SRUcoaG9wYW1wMi0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX0NBTFNFTCwgT1BBTVBfVlJFRl8xMFZEREEpOworICAgICAgTU9ESUZZX1JFRyhob3BhbXAzLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfQ0FMU0VMLCBPUEFNUF9WUkVGXzEwVkREQSk7CisgICAgICBNT0RJRllfUkVHKGhvcGFtcDQtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9DQUxTRUwsIE9QQU1QX1ZSRUZfMTBWRERBKTsKKyAgICAgIAorICAgICAgLyogSW5pdCB0cmltbWluZyBjb3VudGVyICovICAgIAorICAgICAgLyogTWVkaXVtIHZhbHVlICovCisgICAgICB0cmltbWluZ3ZhbHVlcDEgPSAxNlU7IAorICAgICAgdHJpbW1pbmd2YWx1ZXAyID0gMTZVOyAKKyAgICAgIHRyaW1taW5ndmFsdWVwMyA9IDE2VTsgCisgICAgICB0cmltbWluZ3ZhbHVlcDQgPSAxNlU7IAorICAgICAgCisgICAgICBkZWx0YSA9IDhVOworICAgICAgCisgICAgICB3aGlsZSAoZGVsdGEgIT0gMFUpCisgICAgICB7CisgICAgICAgIC8qIFNldCBjYW5kaWRhdGUgdHJpbW1pbmcgKi8KKyAgICAgICAgTU9ESUZZX1JFRyhob3BhbXAxLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfVFJJTU9GRlNFVFAsIHRyaW1taW5ndmFsdWVwMTw8T1BBTVBfSU5QVVRfTk9OSU5WRVJUSU5HKTsKKyAgICAgICAgTU9ESUZZX1JFRyhob3BhbXAyLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfVFJJTU9GRlNFVFAsIHRyaW1taW5ndmFsdWVwMjw8T1BBTVBfSU5QVVRfTk9OSU5WRVJUSU5HKTsKKyAgICAgICAgTU9ESUZZX1JFRyhob3BhbXAzLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfVFJJTU9GRlNFVFAsIHRyaW1taW5ndmFsdWVwMzw8T1BBTVBfSU5QVVRfTk9OSU5WRVJUSU5HKTsKKyAgICAgICAgTU9ESUZZX1JFRyhob3BhbXA0LT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfVFJJTU9GRlNFVFAsIHRyaW1taW5ndmFsdWVwNDw8T1BBTVBfSU5QVVRfTk9OSU5WRVJUSU5HKTsKKyAgICAgICAgICAgICAgIAorICAgICAgICAvKiBPRkZUUklNbWF4IGRlbGF5IDIgbXMgYXMgcGVyIGRhdGFzaGVldCAoZWxlY3RyaWNhbCBjaGFyYWN0ZXJpc3RpY3MgKi8gCisgICAgICAgIC8qIE9mZnNldCB0cmltIHRpbWU6IGR1cmluZyBjYWxpYnJhdGlvbiwgbWluaW11bSB0aW1lIG5lZWRlZCBiZXR3ZWVuICovCisgICAgICAgIC8qIHR3byBzdGVwcyB0byBoYXZlIDEgbVYgYWNjdXJhY3kgKi8KKyAgICAgICAgSEFMX0RlbGF5KDJVKTsKKworICAgICAgICBpZiAoKGhvcGFtcDEtPkluc3RhbmNlLT5DU1IgJiBPUEFNUF9DU1JfT1VUQ0FMKSAhPSBSRVNFVCkgCisgICAgICAgIHsgCisgICAgICAgICAgLyogT1BBTVBfQ1NSX09VVENBTCBpcyBISUdIIHRyeSBoaWdoZXIgdHJpbW1pbmcgKi8KKyAgICAgICAgICB0cmltbWluZ3ZhbHVlcDEgKz0gZGVsdGE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgdHJpbW1pbmd2YWx1ZXAxIC09IGRlbHRhOworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgaWYgKChob3BhbXAyLT5JbnN0YW5jZS0+Q1NSICYgT1BBTVBfQ1NSX09VVENBTCkgIT0gUkVTRVQpIAorICAgICAgICB7IAorICAgICAgICAgIC8qIE9QQU1QX0NTUl9PVVRDQUwgaXMgSElHSCB0cnkgaGlnaGVyIHRyaW1taW5nICovCisgICAgICAgICAgdHJpbW1pbmd2YWx1ZXAyICs9IGRlbHRhOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHRyaW1taW5ndmFsdWVwMiAtPSBkZWx0YTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoaG9wYW1wMy0+SW5zdGFuY2UtPkNTUiAmIE9QQU1QX0NTUl9PVVRDQUwpICE9IFJFU0VUKSAKKyAgICAgICAgeyAKKyAgICAgICAgICAvKiBPUEFNUF9DU1JfT1VUQ0FMIGlzIEhJR0ggdHJ5IGhpZ2hlciB0cmltbWluZyAqLworICAgICAgICAgIHRyaW1taW5ndmFsdWVwMyArPSBkZWx0YTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB0cmltbWluZ3ZhbHVlcDMgLT0gZGVsdGE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGhvcGFtcDQtPkluc3RhbmNlLT5DU1IgJiBPUEFNUF9DU1JfT1VUQ0FMKSAhPSBSRVNFVCkgCisgICAgICAgIHsgCisgICAgICAgICAgLyogT1BBTVBfQ1NSX09VVENBTCBpcyBISUdIIHRyeSBoaWdoZXIgdHJpbW1pbmcgKi8KKyAgICAgICAgICB0cmltbWluZ3ZhbHVlcDQgKz0gZGVsdGE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgdHJpbW1pbmd2YWx1ZXA0IC09IGRlbHRhOworICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgZGVsdGEgPj49IDFVOworICAgICAgfQorICAgICAgCisgICAgICAvKiBTdGlsbCBuZWVkIHRvIGNoZWNrIGlmIHJpZ2ggY2FsaWJyYXRpb24gaXMgY3VycmVudCB2YWx1ZSBvciB1biBzdGVwIGJlbG93ICovCisgICAgICAvKiBJbmRlZWQgdGhlIGZpcnN0IHZhbHVlIHRoYXQgY2F1c2VzIHRoZSBPVVRDQUwgYml0IHRvIGNoYW5nZSBmcm9tIDEgdG8gMFUgKi8KKyAgICAgIC8qIFNldCBjYW5kaWRhdGUgdHJpbW1pbmcgKi8KKyAgICAgIE1PRElGWV9SRUcoaG9wYW1wMS0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX1RSSU1PRkZTRVRQLCB0cmltbWluZ3ZhbHVlcDE8PE9QQU1QX0lOUFVUX05PTklOVkVSVElORyk7CisgICAgICBNT0RJRllfUkVHKGhvcGFtcDItPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9UUklNT0ZGU0VUUCwgdHJpbW1pbmd2YWx1ZXAyPDxPUEFNUF9JTlBVVF9OT05JTlZFUlRJTkcpOworICAgICAgTU9ESUZZX1JFRyhob3BhbXAzLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfVFJJTU9GRlNFVFAsIHRyaW1taW5ndmFsdWVwMzw8T1BBTVBfSU5QVVRfTk9OSU5WRVJUSU5HKTsKKyAgICAgIE1PRElGWV9SRUcoaG9wYW1wNC0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX1RSSU1PRkZTRVRQLCB0cmltbWluZ3ZhbHVlcDQ8PE9QQU1QX0lOUFVUX05PTklOVkVSVElORyk7CisKKyAgICAgIC8qIE9GRlRSSU1tYXggZGVsYXkgMiBtcyBhcyBwZXIgZGF0YXNoZWV0IChlbGVjdHJpY2FsIGNoYXJhY3RlcmlzdGljcyAqLyAKKyAgICAgIC8qIE9mZnNldCB0cmltIHRpbWU6IGR1cmluZyBjYWxpYnJhdGlvbiwgbWluaW11bSB0aW1lIG5lZWRlZCBiZXR3ZWVuICovCisgICAgICAvKiB0d28gc3RlcHMgdG8gaGF2ZSAxIG1WIGFjY3VyYWN5ICovCisgICAgICBIQUxfRGVsYXkoMlUpOworICAgICAgCisgICAgICBpZiAoKGhvcGFtcDEtPkluc3RhbmNlLT5DU1IgJiBPUEFNUF9DU1JfT1VUQ0FMKSAhPSBSRVNFVCkgCisgICAgICB7IAorICAgICAgICAvKiBUcmltbWluZyB2YWx1ZSBpcyBhY3R1YWxseSBvbmUgdmFsdWUgbW9yZSAqLworICAgICAgICB0cmltbWluZ3ZhbHVlcDErKzsKKyAgICAgICAgLyogU2V0IHJpZ2h0IHRyaW1taW5nICovCisgICAgICAgIE1PRElGWV9SRUcoaG9wYW1wMS0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX1RSSU1PRkZTRVRQLCB0cmltbWluZ3ZhbHVlcDE8PE9QQU1QX0lOUFVUX05PTklOVkVSVElORyk7CisgICAgICB9CisgICAgCisgICAgICBpZiAoKGhvcGFtcDItPkluc3RhbmNlLT5DU1IgJiBPUEFNUF9DU1JfT1VUQ0FMKSAhPSBSRVNFVCkgCisgICAgICB7IAorICAgICAgICAvKiBUcmltbWluZyB2YWx1ZSBpcyBhY3R1YWxseSBvbmUgdmFsdWUgbW9yZSAqLworICAgICAgICB0cmltbWluZ3ZhbHVlcDIrKzsKKyAgICAgICAgLyogU2V0IHJpZ2h0IHRyaW1taW5nICovCisgICAgICAgIE1PRElGWV9SRUcoaG9wYW1wMi0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX1RSSU1PRkZTRVRQLCB0cmltbWluZ3ZhbHVlcDI8PE9QQU1QX0lOUFVUX05PTklOVkVSVElORyk7CisgICAgICB9CisKKyAgICAgIGlmICgoaG9wYW1wMy0+SW5zdGFuY2UtPkNTUiAmIE9QQU1QX0NTUl9PVVRDQUwpICE9IFJFU0VUKSAKKyAgICAgIHsgCisgICAgICAgIC8qIFRyaW1taW5nIHZhbHVlIGlzIGFjdHVhbGx5IG9uZSB2YWx1ZSBtb3JlICovCisgICAgICAgIHRyaW1taW5ndmFsdWVwMysrOworICAgICAgICAvKiBTZXQgcmlnaHQgdHJpbW1pbmcgKi8KKyAgICAgICAgTU9ESUZZX1JFRyhob3BhbXAzLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfVFJJTU9GRlNFVFAsIHRyaW1taW5ndmFsdWVwMzw8T1BBTVBfSU5QVVRfTk9OSU5WRVJUSU5HKTsKKyAgICAgIH0KKworICAgICAgaWYgKChob3BhbXA0LT5JbnN0YW5jZS0+Q1NSICYgT1BBTVBfQ1NSX09VVENBTCkgIT0gUkVTRVQpIAorICAgICAgeyAKKyAgICAgICAgLyogVHJpbW1pbmcgdmFsdWUgaXMgYWN0dWFsbHkgb25lIHZhbHVlIG1vcmUgKi8KKyAgICAgICAgdHJpbW1pbmd2YWx1ZXA0Kys7CisgICAgICAgIC8qIFNldCByaWdodCB0cmltbWluZyAqLworICAgICAgICBNT0RJRllfUkVHKGhvcGFtcDQtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9UUklNT0ZGU0VUUCwgdHJpbW1pbmd2YWx1ZXA0PDxPUEFNUF9JTlBVVF9OT05JTlZFUlRJTkcpOworICAgICAgfQorCisgICAgICAvKiBEaXNhYmxlIGNhbGlicmF0aW9uICovCisgICAgICBDTEVBUl9CSVQgKGhvcGFtcDEtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9DQUxPTik7CisgICAgICBDTEVBUl9CSVQgKGhvcGFtcDItPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9DQUxPTik7CisgICAgICBDTEVBUl9CSVQgKGhvcGFtcDMtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9DQUxPTik7CisgICAgICBDTEVBUl9CSVQgKGhvcGFtcDQtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9DQUxPTik7CisKKyAgICAgIC8qIERpc2FibGUgdGhlIE9QQU1QcyAqLworICAgICAgQ0xFQVJfQklUIChob3BhbXAxLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfT1BBTVB4RU4pOworICAgICAgQ0xFQVJfQklUIChob3BhbXAyLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfT1BBTVB4RU4pOworICAgICAgQ0xFQVJfQklUIChob3BhbXAzLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfT1BBTVB4RU4pOworICAgICAgQ0xFQVJfQklUIChob3BhbXA0LT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfT1BBTVB4RU4pOworCisgICAgICAvKiBTZXQgbm9ybWFsIG9wZXJhdGluZyBtb2RlIGJhY2sgKi8KKyAgICAgIENMRUFSX0JJVChob3BhbXAxLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfRk9SQ0VWUCk7CisgICAgICBDTEVBUl9CSVQoaG9wYW1wMi0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX0ZPUkNFVlApOworICAgICAgQ0xFQVJfQklUKGhvcGFtcDMtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9GT1JDRVZQKTsKKyAgICAgIENMRUFSX0JJVChob3BhbXA0LT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfRk9SQ0VWUCk7CisgICAgICAKKyAgICAgIC8qIFNlbGYgY2FsaWJyYXRpb24gaXMgc3VjY2Vzc2Z1bCAgKi8KKyAgICAgIC8qIFN0b3JlIGNhbGlicmF0aW9uKHVzZXIgdGltbWluZykgcmVzdWx0cyBpbiBpbml0IHN0cnVjdHVyZS4gKi8KKyAgICAgIC8qIFNlbGVjdCB1c2VyIHRpbW1pbmcgbW9kZSAqLworCisgICAgICAvKiBXcml0ZSBjYWxpYnJhdGlvbiByZXN1bHQgTiAqLworICAgICAgaG9wYW1wMS0+SW5pdC5UcmltbWluZ1ZhbHVlTiA9IHRyaW1taW5ndmFsdWVuMTsKKyAgICAgIGhvcGFtcDItPkluaXQuVHJpbW1pbmdWYWx1ZU4gPSB0cmltbWluZ3ZhbHVlbjI7CisgICAgICBob3BhbXAzLT5Jbml0LlRyaW1taW5nVmFsdWVOID0gdHJpbW1pbmd2YWx1ZW4zOworICAgICAgaG9wYW1wNC0+SW5pdC5UcmltbWluZ1ZhbHVlTiA9IHRyaW1taW5ndmFsdWVuNDsKKyAgICAgCisgICAgICAvKiBXcml0ZSBjYWxpYnJhdGlvbiByZXN1bHQgUCAqLworICAgICAgaG9wYW1wMS0+SW5pdC5UcmltbWluZ1ZhbHVlUCA9IHRyaW1taW5ndmFsdWVwMTsKKyAgICAgIGhvcGFtcDItPkluaXQuVHJpbW1pbmdWYWx1ZVAgPSB0cmltbWluZ3ZhbHVlcDI7CisgICAgICBob3BhbXAzLT5Jbml0LlRyaW1taW5nVmFsdWVQID0gdHJpbW1pbmd2YWx1ZXAzOworICAgICAgaG9wYW1wNC0+SW5pdC5UcmltbWluZ1ZhbHVlUCA9IHRyaW1taW5ndmFsdWVwNDsKKyAgICAgICAgICAgIAorICAgICAgLyogU2VsZWN0IHVzZXIgdGltbWluZyBtb2RlICovICAgICAgCisgICAgICAvKiBBbmQgdXBkYXRlZCB3aXRoIGNhbGlicmF0ZWQgc2V0dGluZ3MgKi8KKyAgICAgIGhvcGFtcDEtPkluaXQuVXNlclRyaW1taW5nID0gT1BBTVBfVFJJTU1JTkdfVVNFUjsKKyAgICAgIGhvcGFtcDItPkluaXQuVXNlclRyaW1taW5nID0gT1BBTVBfVFJJTU1JTkdfVVNFUjsKKyAgICAgIGhvcGFtcDMtPkluaXQuVXNlclRyaW1taW5nID0gT1BBTVBfVFJJTU1JTkdfVVNFUjsKKyAgICAgIGhvcGFtcDQtPkluaXQuVXNlclRyaW1taW5nID0gT1BBTVBfVFJJTU1JTkdfVVNFUjsKKyAgICAgICAgICAgCisgICAgICBNT0RJRllfUkVHKGhvcGFtcDEtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9UUklNT0ZGU0VUTiwgdHJpbW1pbmd2YWx1ZW4xPDxPUEFNUF9JTlBVVF9JTlZFUlRJTkcpOworICAgICAgTU9ESUZZX1JFRyhob3BhbXAyLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfVFJJTU9GRlNFVE4sIHRyaW1taW5ndmFsdWVuMjw8T1BBTVBfSU5QVVRfSU5WRVJUSU5HKTsKKyAgICAgIE1PRElGWV9SRUcoaG9wYW1wMy0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX1RSSU1PRkZTRVROLCB0cmltbWluZ3ZhbHVlbjM8PE9QQU1QX0lOUFVUX0lOVkVSVElORyk7CisgICAgICBNT0RJRllfUkVHKGhvcGFtcDQtPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9UUklNT0ZGU0VUTiwgdHJpbW1pbmd2YWx1ZW40PDxPUEFNUF9JTlBVVF9JTlZFUlRJTkcpOworICAgICAKKyAgICAgIE1PRElGWV9SRUcoaG9wYW1wMS0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX1RSSU1PRkZTRVRQLCB0cmltbWluZ3ZhbHVlcDE8PE9QQU1QX0lOUFVUX05PTklOVkVSVElORyk7CisgICAgICBNT0RJRllfUkVHKGhvcGFtcDItPkluc3RhbmNlLT5DU1IsIE9QQU1QX0NTUl9UUklNT0ZGU0VUUCwgdHJpbW1pbmd2YWx1ZXAyPDxPUEFNUF9JTlBVVF9OT05JTlZFUlRJTkcpOyAgICAgIAorICAgICAgTU9ESUZZX1JFRyhob3BhbXAzLT5JbnN0YW5jZS0+Q1NSLCBPUEFNUF9DU1JfVFJJTU9GRlNFVFAsIHRyaW1taW5ndmFsdWVwMzw8T1BBTVBfSU5QVVRfTk9OSU5WRVJUSU5HKTsKKyAgICAgIE1PRElGWV9SRUcoaG9wYW1wNC0+SW5zdGFuY2UtPkNTUiwgT1BBTVBfQ1NSX1RSSU1PRkZTRVRQLCB0cmltbWluZ3ZhbHVlcDQ8PE9QQU1QX0lOUFVUX05PTklOVkVSVElORyk7ICAgICAgICAgCisgICAgCisgICAgfQorICAgIAorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBBdCBsZWFzdCBvbmUgT1BBTVAgY2FuIG5vdCBiZSBjYWxpYnJhdGVkICovIAorICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgIH0gICAKKyAgfQorICAKKyAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAgICAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisKKyNlbmRpZiAvKiBIQUxfT1BBTVBfTU9EVUxFX0VOQUJMRUQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmYzeHhfaGFsX3BjY2FyZC5jIGIvU3JjL3N0bTMyZjN4eF9oYWxfcGNjYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFjYWUxOAotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfaGFsX3BjY2FyZC5jCkBAIC0wLDAgKzEsNzQ5IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2hhbF9wY2NhcmQuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgUENDQVJEIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBhIGdlbmVyaWMgZmlybXdhcmUgdG8gZHJpdmUgUENDQVJEIG1lbW9yaWVzIG1vdW50ZWQgCisgICogICAgICAgICAgYXMgZXh0ZXJuYWwgZGV2aWNlLgorICAqICAgICAgICAgCisgIEB2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgIFsuLl0KKyAgICAgVGhpcyBkcml2ZXIgaXMgYSBnZW5lcmljIGxheWVyZWQgZHJpdmVyIHdoaWNoIGNvbnRhaW5zIGEgc2V0IG9mIEFQSXMgdXNlZCB0byAKKyAgICAgY29udHJvbCBQQ0NBUkQvY29tcGFjdCBmbGFzaCBtZW1vcmllcy4gSXQgdXNlcyB0aGUgRk1DIGxheWVyIGZ1bmN0aW9ucyAKKyAgICAgdG8gaW50ZXJmYWNlIHdpdGggUENDQVJEIGRldmljZXMuIFRoaXMgZHJpdmVyIGlzIHVzZWQgZm9yOgorICAgIAorICAgICgrKSBQQ0NBUkQvY29tcGFjdCBmbGFzaCBtZW1vcnkgY29uZmlndXJhdGlvbiBzZXF1ZW5jZSB1c2luZyB0aGUgZnVuY3Rpb24gCisgICAgICAgIEhBTF9QQ0NBUkRfSW5pdCgpIHdpdGggY29udHJvbCBhbmQgdGltaW5nIHBhcmFtZXRlcnMgZm9yIGJvdGggY29tbW9uIGFuZCAKKyAgICAgICAgYXR0cmlidXRlIHNwYWNlcy4KKyAgICAgICAgICAgIAorICAgICgrKSBSZWFkIFBDQ0FSRC9jb21wYWN0IGZsYXNoIG1lbW9yeSBtYWtlciBhbmQgZGV2aWNlIElEcyB1c2luZyB0aGUgZnVuY3Rpb24KKyAgICAgICAgSEFMX1BDQ0FSRF9SZWFkX0lEKCkuIFRoZSByZWFkIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiB0aGUgQ29tcGFjdEZsYXNoX0lEIAorICAgICAgICBzdHJ1Y3R1cmUgZGVjbGFyZWQgYnkgdGhlIGZ1bmN0aW9uIGNhbGxlci4gCisgICAgICAgIAorICAgICgrKSBBY2Nlc3MgUENDQVJEL2NvbXBhY3QgZmxhc2ggbWVtb3J5IGJ5IHJlYWQvd3JpdGUgb3BlcmF0aW9ucyB1c2luZyB0aGUgZnVuY3Rpb25zCisgICAgICAgIEhBTF9QQ0NBUkRfUmVhZF9TZWN0b3IoKS9IQUxfUENDQVJEX1dyaXRlX1NlY3RvcigpLCB0byByZWFkL3dyaXRlIHNlY3Rvci4gCisgICAgICAgIAorICAgICgrKSBQZXJmb3JtIFBDQ0FSRC9jb21wYWN0IGZsYXNoIFJlc2V0IGNoaXAgb3BlcmF0aW9uIHVzaW5nIHRoZSBmdW5jdGlvbiBIQUxfUENDQVJEX1Jlc2V0KCkuCisgICAgICAgIAorICAgICgrKSBQZXJmb3JtIFBDQ0FSRC9jb21wYWN0IGZsYXNoIGVyYXNlIHNlY3RvciBvcGVyYXRpb24gdXNpbmcgdGhlIGZ1bmN0aW9uIAorICAgICAgICBIQUxfUENDQVJEX0VyYXNlX1NlY3RvcigpLgorICAgIAorICAgICgrKSBSZWFkIHRoZSBQQ0NBUkQvY29tcGFjdCBmbGFzaCBzdGF0dXMgb3BlcmF0aW9uIHVzaW5nIHRoZSBmdW5jdGlvbiBIQUxfUENDQVJEX1JlYWRTdGF0dXMoKS4KKyAgICAgCisgICAgKCspIFlvdSBjYW4gbW9uaXRvciB0aGUgUENDQVJEL2NvbXBhY3QgZmxhc2ggIGRldmljZSBIQUwgc3RhdGUgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb24KKyAgICAgICAgSEFMX1BDQ0FSRF9HZXRTdGF0ZSgpICAgICAKKyAgICAgICAgCisgICBbLi5dCisgICAgIChAKSBUaGlzIGRyaXZlciBpcyBhIHNldCBvZiBnZW5lcmljIEFQSXMgd2hpY2ggaGFuZGxlIHN0YW5kYXJkIFBDQ0FSRC9jb21wYWN0IGZsYXNoIAorICAgICAgICAgb3BlcmF0aW9ucy4gSWYgYSBQQ0NBUkQvY29tcGFjdCBmbGFzaCBkZXZpY2UgY29udGFpbnMgZGlmZmVyZW50IG9wZXJhdGlvbnMgCisgICAgICAgICBhbmQvb3IgaW1wbGVtZW50YXRpb25zLCBpdCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgc2VwYXJhdGVseS4KKyAgIAorICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovIAorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWwuaCIKKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX1BDQ0FSRF9NT0RVTEVfRU5BQkxFRAorCisvKiogQGRlZmdyb3VwIFBDQ0FSRCBQQ0NBUkQKKyAgKiBAYnJpZWYgUENDQVJEIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFBDQ0FSRF9Qcml2YXRlX0NvbnN0YW50cyBQQ0NBUkQgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworCisjZGVmaW5lIFBDQ0FSRF9USU1FT1VUX1JFQURfSUQgICAgICAweDAwMDBGRkZGCisjZGVmaW5lIFBDQ0FSRF9USU1FT1VUX1NFQ1RPUiAgICAgICAweDAwMDBGRkZGCisjZGVmaW5lIFBDQ0FSRF9USU1FT1VUX1NUQVRVUyAgICAgICAweDAxMDAwMDAwCisKKyNkZWZpbmUgUENDQVJEX1NUQVRVU19PSyAgICAgICAgICAgICh1aW50OF90KTB4NTgKKyNkZWZpbmUgUENDQVJEX1NUQVRVU19XUklURV9PSyAgICAgICh1aW50OF90KTB4NTAKKy8qKgorICAqIEB9CisgICovIAorCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBQQ0NBUkRfRXhwb3J0ZWRfRnVuY3Rpb25zIFBDQ0FSRCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFBDQ0FSRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgCisgICogQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAKKyAgKgorICBAdmVyYmF0aW0gICAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICMjIyMjIFBDQ0FSRCBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dICAKKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGluaXRpYWxpemUvZGUtaW5pdGlhbGl6ZQorICAgIHRoZSBQQ0NBUkQgbWVtb3J5CisgIAorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKyAgICAKKy8qKgorICAqIEBicmllZiAgUGVyZm9ybSB0aGUgUENDQVJEIG1lbW9yeSBJbml0aWFsaXphdGlvbiBzZXF1ZW5jZQorICAqIEBwYXJhbSAgaHBjY2FyZCBwb2ludGVyIHRvIGEgUENDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgUENDQVJEIG1vZHVsZS4KKyAgKiBAcGFyYW0gIENvbVNwYWNlVGltaW5nIENvbW1vbiBzcGFjZSB0aW1pbmcgc3RydWN0dXJlCisgICogQHBhcmFtICBBdHRTcGFjZVRpbWluZyBBdHRyaWJ1dGUgc3BhY2UgdGltaW5nIHN0cnVjdHVyZQorICAqIEBwYXJhbSAgSU9TcGFjZVRpbWluZyBJTyBzcGFjZSB0aW1pbmcgc3RydWN0dXJlICAgICAKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0NBUkRfSW5pdChQQ0NBUkRfSGFuZGxlVHlwZURlZiAqaHBjY2FyZCwgRk1DX05BTkRfUENDX1RpbWluZ1R5cGVEZWYgKkNvbVNwYWNlVGltaW5nLCBGTUNfTkFORF9QQ0NfVGltaW5nVHlwZURlZiAqQXR0U3BhY2VUaW1pbmcsIEZNQ19OQU5EX1BDQ19UaW1pbmdUeXBlRGVmICpJT1NwYWNlVGltaW5nKQoreworICAvKiBDaGVjayB0aGUgUENDQVJEIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaWYoaHBjY2FyZCA9PSBOVUxMKQorICB7CisgICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgCisgIGlmKGhwY2NhcmQtPlN0YXRlID09IEhBTF9QQ0NBUkRfU1RBVEVfUkVTRVQpCisgIHsgIAorICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBocGNjYXJkLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworICAgIAorICAgIC8qIEluaXRpYWxpemUgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAoTVNQKSAqLworICAgIEhBTF9QQ0NBUkRfTXNwSW5pdChocGNjYXJkKTsKKyAgfQorICAKKyAgLyogSW5pdGlhbGl6ZSB0aGUgUENDQVJEIHN0YXRlICovCisgIGhwY2NhcmQtPlN0YXRlID0gSEFMX1BDQ0FSRF9TVEFURV9CVVNZOyAgICAKKworICAvKiBJbml0aWFsaXplIFBDQ0FSRCBjb250cm9sIEludGVyZmFjZSAqLworICBGTUNfUENDQVJEX0luaXQoaHBjY2FyZC0+SW5zdGFuY2UsICYoaHBjY2FyZC0+SW5pdCkpOworICAKKyAgLyogSW5pdCBQQ0NBUkQgY29tbW9uIHNwYWNlIHRpbWluZyBJbnRlcmZhY2UgKi8KKyAgRk1DX1BDQ0FSRF9Db21tb25TcGFjZV9UaW1pbmdfSW5pdChocGNjYXJkLT5JbnN0YW5jZSwgQ29tU3BhY2VUaW1pbmcpOworICAKKyAgLyogSW5pdCBQQ0NBUkQgYXR0cmlidXRlIHNwYWNlIHRpbWluZyBJbnRlcmZhY2UgKi8gIAorICBGTUNfUENDQVJEX0F0dHJpYnV0ZVNwYWNlX1RpbWluZ19Jbml0KGhwY2NhcmQtPkluc3RhbmNlLCBBdHRTcGFjZVRpbWluZyk7CisgIAorICAvKiBJbml0IFBDQ0FSRCBJTyBzcGFjZSB0aW1pbmcgSW50ZXJmYWNlICovICAKKyAgRk1DX1BDQ0FSRF9JT1NwYWNlX1RpbWluZ19Jbml0KGhwY2NhcmQtPkluc3RhbmNlLCBJT1NwYWNlVGltaW5nKTsKKyAgCisgIC8qIEVuYWJsZSB0aGUgUENDQVJEIGRldmljZSAqLworICBfX0ZNQ19QQ0NBUkRfRU5BQkxFKGhwY2NhcmQtPkluc3RhbmNlKTsgCisgIAorICAvKiBVcGRhdGUgdGhlIFBDQ0FSRCBzdGF0ZSAqLworICBocGNjYXJkLT5TdGF0ZSA9IEhBTF9QQ0NBUkRfU1RBVEVfUkVBRFk7ICAKKyAgCisgIHJldHVybiBIQUxfT0s7CisKK30KKworLyoqCisgICogQGJyaWVmICBQZXJmb3JtIHRoZSBQQ0NBUkQgbWVtb3J5IERlLWluaXRpYWxpemF0aW9uIHNlcXVlbmNlCisgICogQHBhcmFtICBocGNjYXJkIHBvaW50ZXIgdG8gYSBQQ0NBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBQQ0NBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgIEhBTF9QQ0NBUkRfRGVJbml0KFBDQ0FSRF9IYW5kbGVUeXBlRGVmICpocGNjYXJkKQoreworICAvKiBEZS1Jbml0aWFsaXplIHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKE1TUCkgKi8KKyAgSEFMX1BDQ0FSRF9Nc3BEZUluaXQoaHBjY2FyZCk7CisgICAKKyAgLyogQ29uZmlndXJlIHRoZSBQQ0NBUkQgcmVnaXN0ZXJzIHdpdGggdGhlaXIgcmVzZXQgdmFsdWVzICovCisgIEZNQ19QQ0NBUkRfRGVJbml0KGhwY2NhcmQtPkluc3RhbmNlKTsKKyAgCisgIC8qIFVwZGF0ZSB0aGUgUENDQVJEIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaHBjY2FyZC0+U3RhdGUgPSBIQUxfUENDQVJEX1NUQVRFX1JFU0VUOworCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHBjY2FyZCk7CisKKyAgcmV0dXJuIEhBTF9PSzsgCit9CisKKy8qKgorICAqIEBicmllZiAgUENDQVJEIE1TUCBJbml0CisgICogQHBhcmFtICBocGNjYXJkIHBvaW50ZXIgdG8gYSBQQ0NBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBQQ0NBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1BDQ0FSRF9Nc3BJbml0KFBDQ0FSRF9IYW5kbGVUeXBlRGVmICpocGNjYXJkKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocGNjYXJkKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1BDQ0FSRF9Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovIAorfQorCisvKioKKyAgKiBAYnJpZWYgIFBDQ0FSRCBNU1AgRGVJbml0CisgICogQHBhcmFtICBocGNjYXJkIHBvaW50ZXIgdG8gYSBQQ0NBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBQQ0NBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1BDQ0FSRF9Nc3BEZUluaXQoUENDQVJEX0hhbmRsZVR5cGVEZWYgKmhwY2NhcmQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhwY2NhcmQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUENDQVJEX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQQ0NBUkRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJbnB1dCBPdXRwdXQgYW5kIG1lbW9yeSBmdW5jdGlvbnMgCisgICogQGJyaWVmICAgIElucHV0IE91dHB1dCBhbmQgbWVtb3J5IGNvbnRyb2wgZnVuY3Rpb25zIAorICAqCisgIEB2ZXJiYXRpbSAgICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgIyMjIyMgUENDQVJEIElucHV0IE91dHB1dCBhbmQgbWVtb3J5IGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXSAgCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byB1c2UgYW5kIGNvbnRyb2wgdGhlIFBDQ0FSRCBtZW1vcnkKKyAgCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworICAKKy8qKgorICAqIEBicmllZiAgUmVhZCBDb21wYWN0IEZsYXNoJ3MgSUQuCisgICogQHBhcmFtICBocGNjYXJkIHBvaW50ZXIgdG8gYSBQQ0NBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBQQ0NBUkQgbW9kdWxlLgorICAqIEBwYXJhbSAgQ29tcGFjdEZsYXNoX0lEIENvbXBhY3QgZmxhc2ggSUQgc3RydWN0dXJlLiAgCisgICogQHBhcmFtICBwU3RhdHVzIHBvaW50ZXIgdG8gY29tcGFjdCBmbGFzaCBzdGF0dXMgICAgICAgICAKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKiAgIAorICAqLyAKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0NBUkRfUmVhZF9JRChQQ0NBUkRfSGFuZGxlVHlwZURlZiAqaHBjY2FyZCwgdWludDhfdCBDb21wYWN0Rmxhc2hfSURbXSwgdWludDhfdCAqcFN0YXR1cykKK3sKKyAgdWludDMyX3QgdGltZW91dCA9IFBDQ0FSRF9USU1FT1VUX1JFQURfSUQsIGluZGV4ID0gMFU7CisgIHVpbnQ4X3Qgc3RhdHVzID0gMFU7CisgIAorICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhwY2NhcmQpOyAgCisgIAorICAvKiBDaGVjayB0aGUgUENDQVJEIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaWYoaHBjY2FyZC0+U3RhdGUgPT0gSEFMX1BDQ0FSRF9TVEFURV9CVVNZKQorICB7CisgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorICAKKyAgLyogVXBkYXRlIHRoZSBQQ0NBUkQgY29udHJvbGxlciBzdGF0ZSAqLworICBocGNjYXJkLT5TdGF0ZSA9IEhBTF9QQ0NBUkRfU1RBVEVfQlVTWTsKKyAgCisgIC8qIEluaXRpYWxpemUgdGhlIENGIHN0YXR1cyAqLworICAqcFN0YXR1cyA9IFBDQ0FSRF9SRUFEWTsgIAorICAKKyAgLyogU2VuZCB0aGUgSWRlbnRpZnkgQ29tbWFuZCAqLworICAqKF9fSU8gdWludDE2X3QgKikoUENDQVJEX0lPX1NQQUNFX1BSSU1BUllfQUREUiB8IEFUQV9TVEFUVVNfQ01EKSAgPSAweEVDRUM7CisgICAgCisgIC8qIFJlYWQgQ0YgSURzIGFuZCB0aW1lb3V0IHRyZWF0bWVudCAqLworICBkbyAKKyAgeworICAgICAvKiBSZWFkIHRoZSBDRiBzdGF0dXMgKi8KKyAgICAgc3RhdHVzID0gKihfX0lPIHVpbnQ4X3QgKikoUENDQVJEX0lPX1NQQUNFX1BSSU1BUllfQUREUiB8IEFUQV9TVEFUVVNfQ01EX0FMVEVSTkFURSk7CisgICAgIAorICAgICB0aW1lb3V0LS07CisgIH13aGlsZSgoc3RhdHVzICE9IFBDQ0FSRF9TVEFUVVNfT0spICYmIHRpbWVvdXQpOyAKKyAgCisgIGlmKHRpbWVvdXQgPT0gMFUpCisgIHsKKyAgICAqcFN0YXR1cyA9IFBDQ0FSRF9USU1FT1VUX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgICAvKiBSZWFkIENGIElEIGJ5dGVzICovCisgICAgZm9yKGluZGV4ID0gMFU7IGluZGV4IDwgMTZVOyBpbmRleCsrKQorICAgIHsKKyAgICAgIENvbXBhY3RGbGFzaF9JRFtpbmRleF0gPSAqKF9fSU8gdWludDhfdCAqKShQQ0NBUkRfSU9fU1BBQ0VfUFJJTUFSWV9BRERSIHwgQVRBX0RBVEEpOworICAgIH0gICAgCisgIH0KKyAgCisgIC8qIFVwZGF0ZSB0aGUgUENDQVJEIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaHBjY2FyZC0+U3RhdGUgPSBIQUxfUENDQVJEX1NUQVRFX1JFQURZOworICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHBjY2FyZCk7ICAKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisgICAKKy8qKgorICAqIEBicmllZiAgUmVhZCBzZWN0b3IgZnJvbSBQQ0NBUkQgbWVtb3J5CisgICogQHBhcmFtICBocGNjYXJkIHBvaW50ZXIgdG8gYSBQQ0NBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBQQ0NBUkQgbW9kdWxlLgorICAqIEBwYXJhbSAgcEJ1ZmZlciBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlYWQgYnVmZmVyCisgICogQHBhcmFtICBTZWN0b3JBZGRyZXNzIFNlY3RvciBhZGRyZXNzIHRvIHJlYWQKKyAgKiBAcGFyYW0gIHBTdGF0dXMgcG9pbnRlciB0byBDRiBzdGF0dXMKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8gICAgCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENDQVJEX1JlYWRfU2VjdG9yKFBDQ0FSRF9IYW5kbGVUeXBlRGVmICpocGNjYXJkLCB1aW50MTZfdCAqcEJ1ZmZlciwgdWludDE2X3QgU2VjdG9yQWRkcmVzcywgdWludDhfdCAqcFN0YXR1cykKK3sKKyAgdWludDMyX3QgdGltZW91dCA9IFBDQ0FSRF9USU1FT1VUX1NFQ1RPUiwgaW5kZXggPSAwVTsKKyAgdWludDhfdCBzdGF0dXMgPSAwVTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhwY2NhcmQpOworICAKKyAgLyogQ2hlY2sgdGhlIFBDQ0FSRCBjb250cm9sbGVyIHN0YXRlICovCisgIGlmKGhwY2NhcmQtPlN0YXRlID09IEhBTF9QQ0NBUkRfU1RBVEVfQlVTWSkKKyAgeworICAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKyAgCisgIC8qIFVwZGF0ZSB0aGUgUENDQVJEIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaHBjY2FyZC0+U3RhdGUgPSBIQUxfUENDQVJEX1NUQVRFX0JVU1k7CisKKyAgLyogSW5pdGlhbGl6ZSBDRiBzdGF0dXMgKi8KKyAgKnBTdGF0dXMgPSBQQ0NBUkRfUkVBRFk7CisKKyAgLyogU2V0IHRoZSBwYXJhbWV0ZXJzIHRvIHdyaXRlIGEgc2VjdG9yICovCisgICooX19JTyB1aW50MTZfdCAqKShQQ0NBUkRfSU9fU1BBQ0VfUFJJTUFSWV9BRERSIHwgQVRBX0NZTElOREVSX0hJR0gpID0gKHVpbnQxNl90KTB4MDA7CisgICooX19JTyB1aW50MTZfdCAqKShQQ0NBUkRfSU9fU1BBQ0VfUFJJTUFSWV9BRERSIHwgQVRBX1NFQ1RPUl9DT1VOVCkgID0gKCh1aW50MTZfdCkweDAxMDAgKSB8ICgodWludDE2X3QpU2VjdG9yQWRkcmVzcyk7CisgICooX19JTyB1aW50MTZfdCAqKShQQ0NBUkRfSU9fU1BBQ0VfUFJJTUFSWV9BRERSIHwgQVRBX1NUQVRVU19DTUQpICAgID0gKHVpbnQxNl90KTB4RTRBMDsgIAorCisgIGRvCisgIHsKKyAgICAvKiB3YWl0IHRpbGwgdGhlIFN0YXR1cyA9IDB4ODBVICovCisgICAgc3RhdHVzID0gICooX19JTyB1aW50MTZfdCAqKShQQ0NBUkRfSU9fU1BBQ0VfUFJJTUFSWV9BRERSIHwgQVRBX1NUQVRVU19DTURfQUxURVJOQVRFKTsKKyAgICB0aW1lb3V0LS07CisgIH13aGlsZSgoc3RhdHVzID09IDB4ODBVKSAmJiB0aW1lb3V0KTsKKyAgCisgIGlmKHRpbWVvdXQgPT0gMFUpCisgIHsKKyAgICAqcFN0YXR1cyA9IFBDQ0FSRF9USU1FT1VUX0VSUk9SOworICB9CisgIAorICB0aW1lb3V0ID0gMHhGRkZGVTsKKworICBkbworICB7CisgICAgLyogd2FpdCB0aWxsIHRoZSBTdGF0dXMgPSBQQ0NBUkRfU1RBVFVTX09LICovCisgICAgc3RhdHVzID0gICooX19JTyB1aW50MTZfdCAqKShQQ0NBUkRfSU9fU1BBQ0VfUFJJTUFSWV9BRERSIHwgQVRBX1NUQVRVU19DTURfQUxURVJOQVRFKTsKKyAgICB0aW1lb3V0LS07CisgIH13aGlsZSgoc3RhdHVzICE9IFBDQ0FSRF9TVEFUVVNfT0spICYmIHRpbWVvdXQpOworICAKKyAgaWYodGltZW91dCA9PSAwVSkKKyAgeworICAgICpwU3RhdHVzID0gUENDQVJEX1RJTUVPVVRfRVJST1I7CisgIH0KKyAgCisgIC8qIFJlYWQgYnl0ZXMgKi8KKyAgZm9yKDsgaW5kZXggPCBQQ0NBUkRfU0VDVE9SX1NJWkU7IGluZGV4KyspCisgIHsKKyAgICAqKHVpbnQxNl90ICopcEJ1ZmZlcisrID0gKih1aW50MTZfdCAqKShQQ0NBUkRfSU9fU1BBQ0VfUFJJTUFSWV9BRERSKTsKKyAgfSAKKworICAvKiBVcGRhdGUgdGhlIFBDQ0FSRCBjb250cm9sbGVyIHN0YXRlICovCisgIGhwY2NhcmQtPlN0YXRlID0gSEFMX1BDQ0FSRF9TVEFURV9SRUFEWTsKKyAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhwY2NhcmQpOworICAgICAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKworLyoqCisgICogQGJyaWVmICBXcml0ZSBzZWN0b3IgdG8gUENDQVJEIG1lbW9yeQorICAqIEBwYXJhbSAgaHBjY2FyZCBwb2ludGVyIHRvIGEgUENDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgUENDQVJEIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBCdWZmZXIgcG9pbnRlciB0byBzb3VyY2Ugd3JpdGUgYnVmZmVyCisgICogQHBhcmFtICBTZWN0b3JBZGRyZXNzIFNlY3RvciBhZGRyZXNzIHRvIHdyaXRlCisgICogQHBhcmFtICBwU3RhdHVzIHBvaW50ZXIgdG8gQ0Ygc3RhdHVzCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENDQVJEX1dyaXRlX1NlY3RvcihQQ0NBUkRfSGFuZGxlVHlwZURlZiAqaHBjY2FyZCwgdWludDE2X3QgKnBCdWZmZXIsIHVpbnQxNl90IFNlY3RvckFkZHJlc3MsICB1aW50OF90ICpwU3RhdHVzKQoreworICB1aW50MzJfdCB0aW1lb3V0ID0gUENDQVJEX1RJTUVPVVRfU0VDVE9SLCBpbmRleCA9IDBVOworICB1aW50OF90IHN0YXR1cyA9IDBVOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHBjY2FyZCk7ICAKKyAgCisgIC8qIENoZWNrIHRoZSBQQ0NBUkQgY29udHJvbGxlciBzdGF0ZSAqLworICBpZihocGNjYXJkLT5TdGF0ZSA9PSBIQUxfUENDQVJEX1NUQVRFX0JVU1kpCisgIHsKKyAgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisgICAKKyAgLyogVXBkYXRlIHRoZSBQQ0NBUkQgY29udHJvbGxlciBzdGF0ZSAqLworICBocGNjYXJkLT5TdGF0ZSA9IEhBTF9QQ0NBUkRfU1RBVEVfQlVTWTsKKyAgICAKKyAgLyogSW5pdGlhbGl6ZSBDRiBzdGF0dXMgKi8KKyAgKnBTdGF0dXMgPSBQQ0NBUkRfUkVBRFk7ICAKKyAgICAKKyAgLyogU2V0IHRoZSBwYXJhbWV0ZXJzIHRvIHdyaXRlIGEgc2VjdG9yICovCisgICooX19JTyB1aW50MTZfdCAqKShQQ0NBUkRfSU9fU1BBQ0VfUFJJTUFSWV9BRERSIHwgQVRBX0NZTElOREVSX0hJR0gpID0gKHVpbnQxNl90KTB4MDA7CisgICooX19JTyB1aW50MTZfdCAqKShQQ0NBUkRfSU9fU1BBQ0VfUFJJTUFSWV9BRERSIHwgQVRBX1NFQ1RPUl9DT1VOVCkgID0gKCh1aW50MTZfdCkweDAxMDAgKSB8ICgodWludDE2X3QpU2VjdG9yQWRkcmVzcyk7CisgICooX19JTyB1aW50MTZfdCAqKShQQ0NBUkRfSU9fU1BBQ0VfUFJJTUFSWV9BRERSIHwgQVRBX1NUQVRVU19DTUQpICAgID0gKHVpbnQxNl90KTB4MzBBMDsKKyAgCisgIGRvCisgIHsKKyAgICAvKiBXYWl0IHRpbGwgdGhlIFN0YXR1cyA9IFBDQ0FSRF9TVEFUVVNfT0sgKi8KKyAgICBzdGF0dXMgPSAgKihfX0lPIHVpbnQ4X3QgKikoUENDQVJEX0lPX1NQQUNFX1BSSU1BUllfQUREUiB8IEFUQV9TVEFUVVNfQ01EX0FMVEVSTkFURSk7CisgICAgdGltZW91dC0tOworICB9d2hpbGUoKHN0YXR1cyAhPSBQQ0NBUkRfU1RBVFVTX09LKSAmJiB0aW1lb3V0KTsKKyAgCisgIGlmKHRpbWVvdXQgPT0gMFUpCisgIHsKKyAgICAqcFN0YXR1cyA9IFBDQ0FSRF9USU1FT1VUX0VSUk9SOworICB9CisgIAorICAvKiBXcml0ZSBieXRlcyAqLworICBmb3IoOyBpbmRleCA8IFBDQ0FSRF9TRUNUT1JfU0laRTsgaW5kZXgrKykKKyAgeworICAgICoodWludDE2X3QgKikoUENDQVJEX0lPX1NQQUNFX1BSSU1BUllfQUREUikgPSAqKHVpbnQxNl90ICopcEJ1ZmZlcisrOworICB9CisKKyAgZG8KKyAgeworICAgIC8qIFdhaXQgdGlsbCB0aGUgU3RhdHVzID0gUENDQVJEX1NUQVRVU19XUklURV9PSyAqLworICAgIHN0YXR1cyA9ICAqKF9fSU8gdWludDhfdCAqKShQQ0NBUkRfSU9fU1BBQ0VfUFJJTUFSWV9BRERSIHwgQVRBX1NUQVRVU19DTURfQUxURVJOQVRFKTsKKyAgICB0aW1lb3V0LS07CisgIH13aGlsZSgoc3RhdHVzICE9IFBDQ0FSRF9TVEFUVVNfV1JJVEVfT0spICYmIHRpbWVvdXQpOworCisgIGlmKHRpbWVvdXQgPT0gMFUpCisgIHsKKyAgICAqcFN0YXR1cyA9IFBDQ0FSRF9USU1FT1VUX0VSUk9SOworICB9ICAKKworICAvKiBVcGRhdGUgdGhlIFBDQ0FSRCBjb250cm9sbGVyIHN0YXRlICovCisgIGhwY2NhcmQtPlN0YXRlID0gSEFMX1BDQ0FSRF9TVEFURV9SRUFEWTsKKyAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhwY2NhcmQpOyAgCisgIAorICByZXR1cm4gSEFMX09LOworfQorCisKKy8qKgorICAqIEBicmllZiAgRXJhc2Ugc2VjdG9yIGZyb20gUENDQVJEIG1lbW9yeSAKKyAgKiBAcGFyYW0gIGhwY2NhcmQgcG9pbnRlciB0byBhIFBDQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFBDQ0FSRCBtb2R1bGUuCisgICogQHBhcmFtICBTZWN0b3JBZGRyZXNzIFNlY3RvciBhZGRyZXNzIHRvIGVyYXNlCisgICogQHBhcmFtICBwU3RhdHVzIHBvaW50ZXIgdG8gQ0Ygc3RhdHVzCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiAgSEFMX1BDQ0FSRF9FcmFzZV9TZWN0b3IoUENDQVJEX0hhbmRsZVR5cGVEZWYgKmhwY2NhcmQsIHVpbnQxNl90IFNlY3RvckFkZHJlc3MsIHVpbnQ4X3QgKnBTdGF0dXMpCit7CisgIHVpbnQzMl90IHRpbWVvdXQgPSAweDQwMFU7CisgIHVpbnQ4X3Qgc3RhdHVzID0gMFU7CisgIAorICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhwY2NhcmQpOyAgCisgIAorICAvKiBDaGVjayB0aGUgUENDQVJEIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaWYoaHBjY2FyZC0+U3RhdGUgPT0gSEFMX1BDQ0FSRF9TVEFURV9CVVNZKQorICB7CisgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorCisgIC8qIFVwZGF0ZSB0aGUgUENDQVJEIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaHBjY2FyZC0+U3RhdGUgPSBIQUxfUENDQVJEX1NUQVRFX0JVU1k7CisgIAorICAvKiBJbml0aWFsaXplIENGIHN0YXR1cyAqLyAKKyAgKnBTdGF0dXMgPSBQQ0NBUkRfUkVBRFk7CisgICAgCisgIC8qIFNldCB0aGUgcGFyYW1ldGVycyB0byB3cml0ZSBhIHNlY3RvciAqLworICAqKF9fSU8gdWludDhfdCAqKShQQ0NBUkRfSU9fU1BBQ0VfUFJJTUFSWV9BRERSIHwgQVRBX0NZTElOREVSX0xPVykgID0gMHgwMDsKKyAgKihfX0lPIHVpbnQ4X3QgKikoUENDQVJEX0lPX1NQQUNFX1BSSU1BUllfQUREUiB8IEFUQV9DWUxJTkRFUl9ISUdIKSA9IDB4MDA7CisgICooX19JTyB1aW50OF90ICopKFBDQ0FSRF9JT19TUEFDRV9QUklNQVJZX0FERFIgfCBBVEFfU0VDVE9SX05VTUJFUikgPSBTZWN0b3JBZGRyZXNzOworICAqKF9fSU8gdWludDhfdCAqKShQQ0NBUkRfSU9fU1BBQ0VfUFJJTUFSWV9BRERSIHwgQVRBX1NFQ1RPUl9DT1VOVCkgID0gMHgwMTsKKyAgKihfX0lPIHVpbnQ4X3QgKikoUENDQVJEX0lPX1NQQUNFX1BSSU1BUllfQUREUiB8IEFUQV9DQVJEX0hFQUQpICAgICA9IDB4QTA7CisgICooX19JTyB1aW50OF90ICopKFBDQ0FSRF9JT19TUEFDRV9QUklNQVJZX0FERFIgfCBBVEFfU1RBVFVTX0NNRCkgICAgPSBBVEFfRVJBU0VfU0VDVE9SX0NNRDsKKyAgCisgIC8qIHdhaXQgdGlsbCB0aGUgQ0YgaXMgcmVhZHkgKi8KKyAgc3RhdHVzID0gICooX19JTyB1aW50OF90ICopKFBDQ0FSRF9JT19TUEFDRV9QUklNQVJZX0FERFIgfCBBVEFfU1RBVFVTX0NNRF9BTFRFUk5BVEUpOworICAKKyAgd2hpbGUoKHN0YXR1cyAhPSBQQ0NBUkRfU1RBVFVTX1dSSVRFX09LKSAmJiB0aW1lb3V0KQorICB7CisgICAgc3RhdHVzID0gICooX19JTyB1aW50OF90ICopKFBDQ0FSRF9JT19TUEFDRV9QUklNQVJZX0FERFIgfCBBVEFfU1RBVFVTX0NNRF9BTFRFUk5BVEUpOworICAgIHRpbWVvdXQtLTsKKyAgfSAKKyAgCisgIGlmKHRpbWVvdXQgPT0gMFUpCisgIHsKKyAgICAqcFN0YXR1cyA9IFBDQ0FSRF9USU1FT1VUX0VSUk9SOworICB9CisgIAorICAvKiBDaGVjayB0aGUgUENDQVJEIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaHBjY2FyZC0+U3RhdGUgPSBIQUxfUENDQVJEX1NUQVRFX1JFQURZOworICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHBjY2FyZCk7ICAgCisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlc2V0IHRoZSBQQ0NBUkQgbWVtb3J5IAorICAqIEBwYXJhbSAgaHBjY2FyZCBwb2ludGVyIHRvIGEgUENDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgUENDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0NBUkRfUmVzZXQoUENDQVJEX0hhbmRsZVR5cGVEZWYgKmhwY2NhcmQpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHBjY2FyZCk7ICAKKyAgCisgIC8qIENoZWNrIHRoZSBQQ0NBUkQgY29udHJvbGxlciBzdGF0ZSAqLworICBpZihocGNjYXJkLT5TdGF0ZSA9PSBIQUxfUENDQVJEX1NUQVRFX0JVU1kpCisgIHsKKyAgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisKKyAgLyogUHJvdmlkZSBhbiBTVyByZXNldCBhbmQgUmVhZCBhbmQgdmVyaWZ5IHRoZToKKyAgIC0gQ0YgQ29uZmlndXJhdGlvbiBPcHRpb24gUmVnaXN0ZXIgYXQgYWRkcmVzcyAweDk4MDAwMjAwVSAtLT4gMHg4MAorICAgLSBDYXJkIENvbmZpZ3VyYXRpb24gYW5kIFN0YXR1cyBSZWdpc3RlcglhdCBhZGRyZXNzIDB4OTgwMDAyMDJVIC0tPiAweDAwCisgICAtIFBpbiBSZXBsYWNlbWVudCBSZWdpc3RlciAgYXQgYWRkcmVzcyAweDk4MDAwMjA0VSAtLT4gMHgwQworICAgLSBTb2NrZXQgYW5kIENvcHkgUmVnaXN0ZXIgYXQgYWRkcmVzcyAweDk4MDAwMjA2VSAtLT4gMHgwMAorICAqLworCisgIC8qIENoZWNrIHRoZSBQQ0NBUkQgY29udHJvbGxlciBzdGF0ZSAqLworICBocGNjYXJkLT5TdGF0ZSA9IEhBTF9QQ0NBUkRfU1RBVEVfQlVTWTsKKyAgCisgICooX19JTyB1aW50OF90ICopKFBDQ0FSRF9BVFRSSUJVVEVfU1BBQ0VfQUREUkVTUyB8IEFUQV9DQVJEX0NPTkZJR1VSQVRJT04pID0gMHgwMTsKKyAgICAKKyAgLyogQ2hlY2sgdGhlIFBDQ0FSRCBjb250cm9sbGVyIHN0YXRlICovCisgIGhwY2NhcmQtPlN0YXRlID0gSEFMX1BDQ0FSRF9TVEFURV9SRUFEWTsKKyAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhwY2NhcmQpOyAgCisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBQQ0NBUkQgZGV2aWNlIGludGVycnVwdCByZXF1ZXN0LgorICAqIEBwYXJhbSAgaHBjY2FyZCBwb2ludGVyIHRvIGEgUENDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgUENDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCit2b2lkIEhBTF9QQ0NBUkRfSVJRSGFuZGxlcihQQ0NBUkRfSGFuZGxlVHlwZURlZiAqaHBjY2FyZCkKK3sKKyAgLyogQ2hlY2sgUENDQVJEIGludGVycnVwdCBSaXNpbmcgZWRnZSBmbGFnICovCisgIGlmKF9fRk1DX1BDQ0FSRF9HRVRfRkxBRyhocGNjYXJkLT5JbnN0YW5jZSwgRk1DX0ZMQUdfUklTSU5HX0VER0UpKQorICB7CisgICAgLyogUENDQVJEIGludGVycnVwdCBjYWxsYmFjayovCisgICAgSEFMX1BDQ0FSRF9JVENhbGxiYWNrKGhwY2NhcmQpOworICAKKyAgICAvKiBDbGVhciBQQ0NBUkQgaW50ZXJydXB0IFJpc2luZyBlZGdlIHBlbmRpbmcgYml0ICovCisgICAgX19GTUNfUENDQVJEX0NMRUFSX0ZMQUcoaHBjY2FyZC0+SW5zdGFuY2UsIEZNQ19GTEFHX1JJU0lOR19FREdFKTsKKyAgfQorICAKKyAgLyogQ2hlY2sgUENDQVJEIGludGVycnVwdCBMZXZlbCBmbGFnICovCisgIGlmKF9fRk1DX1BDQ0FSRF9HRVRfRkxBRyhocGNjYXJkLT5JbnN0YW5jZSwgRk1DX0ZMQUdfTEVWRUwpKQorICB7CisgICAgLyogUENDQVJEIGludGVycnVwdCBjYWxsYmFjayovCisgICAgSEFMX1BDQ0FSRF9JVENhbGxiYWNrKGhwY2NhcmQpOworICAKKyAgICAvKiBDbGVhciBQQ0NBUkQgaW50ZXJydXB0IExldmVsIHBlbmRpbmcgYml0ICovCisgICAgX19GTUNfUENDQVJEX0NMRUFSX0ZMQUcoaHBjY2FyZC0+SW5zdGFuY2UsIEZNQ19GTEFHX0xFVkVMKTsKKyAgfQorCisgIC8qIENoZWNrIFBDQ0FSRCBpbnRlcnJ1cHQgRmFsbGluZyBlZGdlIGZsYWcgKi8KKyAgaWYoX19GTUNfUENDQVJEX0dFVF9GTEFHKGhwY2NhcmQtPkluc3RhbmNlLCBGTUNfRkxBR19GQUxMSU5HX0VER0UpKQorICB7CisgICAgLyogUENDQVJEIGludGVycnVwdCBjYWxsYmFjayovCisgICAgSEFMX1BDQ0FSRF9JVENhbGxiYWNrKGhwY2NhcmQpOworICAKKyAgICAvKiBDbGVhciBQQ0NBUkQgaW50ZXJydXB0IEZhbGxpbmcgZWRnZSBwZW5kaW5nIGJpdCAqLworICAgIF9fRk1DX1BDQ0FSRF9DTEVBUl9GTEFHKGhwY2NhcmQtPkluc3RhbmNlLCBGTUNfRkxBR19GQUxMSU5HX0VER0UpOworICB9CisgIAorICAvKiBDaGVjayBQQ0NBUkQgaW50ZXJydXB0IEZJRk8gZW1wdHkgZmxhZyAqLworICBpZihfX0ZNQ19QQ0NBUkRfR0VUX0ZMQUcoaHBjY2FyZC0+SW5zdGFuY2UsIEZNQ19GTEFHX0ZFTVBUKSkKKyAgeworICAgIC8qIFBDQ0FSRCBpbnRlcnJ1cHQgY2FsbGJhY2sqLworICAgIEhBTF9QQ0NBUkRfSVRDYWxsYmFjayhocGNjYXJkKTsKKyAgCisgICAgLyogQ2xlYXIgUENDQVJEIGludGVycnVwdCBGSUZPIGVtcHR5IHBlbmRpbmcgYml0ICovCisgICAgX19GTUNfUENDQVJEX0NMRUFSX0ZMQUcoaHBjY2FyZC0+SW5zdGFuY2UsIEZNQ19GTEFHX0ZFTVBUKTsKKyAgfSAgCisKK30KKworLyoqCisgICogQGJyaWVmICBQQ0NBUkQgaW50ZXJydXB0IGZlYXR1cmUgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhwY2NhcmQgcG9pbnRlciB0byBhIFBDQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFBDQ0FSRCBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUENDQVJEX0lUQ2FsbGJhY2soUENDQVJEX0hhbmRsZVR5cGVEZWYgKmhwY2NhcmQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhwY2NhcmQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUENDQVJEX0lUQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKyAgCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBDQ0FSRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zIAorICogIEBicmllZiAgIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zIAorICoKK0B2ZXJiYXRpbSAgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAjIyMjIyBQQ0NBUkQgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwZXJtaXRzIHRvIGdldCBpbiBydW4tdGltZSB0aGUgc3RhdHVzIG9mIHRoZSBQQ0NBUkQgY29udHJvbGxlciAKKyAgICBhbmQgdGhlIGRhdGEgZmxvdy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8gCisgIAorLyoqCisgICogQGJyaWVmICByZXR1cm4gdGhlIFBDQ0FSRCBjb250cm9sbGVyIHN0YXRlCisgICogQHBhcmFtICBocGNjYXJkIHBvaW50ZXIgdG8gYSBQQ0NBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBQQ0NBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfUENDQVJEX1N0YXRlVHlwZURlZiBIQUxfUENDQVJEX0dldFN0YXRlKFBDQ0FSRF9IYW5kbGVUeXBlRGVmICpocGNjYXJkKQoreworICByZXR1cm4gaHBjY2FyZC0+U3RhdGU7Cit9ICAKKyAKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBjb21wYWN0IGZsYXNoIG1lbW9yeSBzdGF0dXMKKyAgKiBAcGFyYW0gIGhwY2NhcmQgcG9pbnRlciB0byBhIFBDQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFBDQ0FSRCBtb2R1bGUuICAgICAgIAorICAqIEByZXR2YWwgTmV3IHN0YXR1cyBvZiB0aGUgQ0Ygb3BlcmF0aW9uLiBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgLSBDb21wYWN0Rmxhc2hfVElNRU9VVF9FUlJPUjogd2hlbiB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIGdlbmVyYXRlIAorICAqICAgICAgICAgICAgYSBUaW1lb3V0IGVycm9yCisgICogICAgICAgICAgLSBDb21wYWN0Rmxhc2hfUkVBRFk6IHdoZW4gbWVtb3J5IGlzIHJlYWR5IGZvciB0aGUgbmV4dCBvcGVyYXRpb24gICAgIAorICAqICAgICAgICAgICAgICAgIAorICAqLworSEFMX1BDQ0FSRF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0NBUkRfR2V0U3RhdHVzKFBDQ0FSRF9IYW5kbGVUeXBlRGVmICpocGNjYXJkKQoreworICB1aW50MzJfdCB0aW1lb3V0ID0gUENDQVJEX1RJTUVPVVRfU1RBVFVTLCBzdGF0dXNfY2YgPSAwVTsgIAorICAKKyAgLyogQ2hlY2sgdGhlIFBDQ0FSRCBjb250cm9sbGVyIHN0YXRlICovCisgIGlmKGhwY2NhcmQtPlN0YXRlID09IEhBTF9QQ0NBUkRfU1RBVEVfQlVTWSkKKyAgeworICAgICByZXR1cm4gSEFMX1BDQ0FSRF9TVEFUVVNfT05HT0lORzsKKyAgfQorCisgIHN0YXR1c19jZiA9ICAqKF9fSU8gdWludDhfdCAqKShQQ0NBUkRfSU9fU1BBQ0VfUFJJTUFSWV9BRERSIHwgQVRBX1NUQVRVU19DTURfQUxURVJOQVRFKTsKKyAgCisgIHdoaWxlKChzdGF0dXNfY2YgPT0gUENDQVJEX0JVU1kpICYmIHRpbWVvdXQpCisgIHsKKyAgICBzdGF0dXNfY2YgPSAgKihfX0lPIHVpbnQ4X3QgKikoUENDQVJEX0lPX1NQQUNFX1BSSU1BUllfQUREUiB8IEFUQV9TVEFUVVNfQ01EX0FMVEVSTkFURSk7CisgICAgdGltZW91dC0tOworICB9CisKKyAgaWYodGltZW91dCA9PSAwVSkKKyAgeyAgICAgICAgICAKKyAgICBzdGF0dXNfY2YgPSAgUENDQVJEX1RJTUVPVVRfRVJST1I7ICAgICAgCisgIH0gICAKKworICAvKiBSZXR1cm4gdGhlIG9wZXJhdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIChIQUxfUENDQVJEX1N0YXR1c1R5cGVEZWYpIHN0YXR1c19jZjsgICAgICAKK30KKyAgCisvKioKKyAgKiBAYnJpZWYgIFJlYWRzIHRoZSBDb21wYWN0IEZsYXNoIG1lbW9yeSBzdGF0dXMgdXNpbmcgdGhlIFJlYWQgc3RhdHVzIGNvbW1hbmQKKyAgKiBAcGFyYW0gIGhwY2NhcmQgcG9pbnRlciB0byBhIFBDQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFBDQ0FSRCBtb2R1bGUuICAgICAgCisgICogQHJldHZhbCBUaGUgc3RhdHVzIG9mIHRoZSBDb21wYWN0IEZsYXNoIG1lbW9yeS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgIC0gQ29tcGFjdEZsYXNoX0JVU1k6IHdoZW4gbWVtb3J5IGlzIGJ1c3kKKyAgKiAgICAgICAgICAtIENvbXBhY3RGbGFzaF9SRUFEWTogd2hlbiBtZW1vcnkgaXMgcmVhZHkgZm9yIHRoZSBuZXh0IG9wZXJhdGlvbiAgICAKKyAgKiAgICAgICAgICAtIENvbXBhY3RGbGFzaF9FUlJPUjogd2hlbiB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIGdlcmVyYXRlcyBlcnJvciAgICAgICAgICAgICAgICAKKyAgKi8KK0hBTF9QQ0NBUkRfU3RhdHVzVHlwZURlZiBIQUxfUENDQVJEX1JlYWRTdGF0dXMoUENDQVJEX0hhbmRsZVR5cGVEZWYgKmhwY2NhcmQpCit7CisgIHVpbnQ4X3QgZGF0YSA9IDBVLCBzdGF0dXNfY2YgPSBQQ0NBUkRfQlVTWTsKKyAgCisgIC8qIENoZWNrIHRoZSBQQ0NBUkQgY29udHJvbGxlciBzdGF0ZSAqLworICBpZihocGNjYXJkLT5TdGF0ZSA9PSBIQUxfUENDQVJEX1NUQVRFX0JVU1kpCisgIHsKKyAgICAgcmV0dXJuIEhBTF9QQ0NBUkRfU1RBVFVTX09OR09JTkc7CisgIH0gCisKKyAgLyogUmVhZCBzdGF0dXMgb3BlcmF0aW9uICovCisgIGRhdGEgPSAgKihfX0lPIHVpbnQ4X3QgKikoUENDQVJEX0lPX1NQQUNFX1BSSU1BUllfQUREUiB8IEFUQV9TVEFUVVNfQ01EX0FMVEVSTkFURSk7CisKKyAgaWYoKGRhdGEgJiBQQ0NBUkRfVElNRU9VVF9FUlJPUikgPT0gUENDQVJEX1RJTUVPVVRfRVJST1IpCisgIHsKKyAgICBzdGF0dXNfY2YgPSBQQ0NBUkRfVElNRU9VVF9FUlJPUjsKKyAgfSAKKyAgZWxzZSBpZigoZGF0YSAmIFBDQ0FSRF9SRUFEWSkgPT0gUENDQVJEX1JFQURZKQorICB7CisgICAgc3RhdHVzX2NmID0gUENDQVJEX1JFQURZOworICB9CisgIAorICByZXR1cm4gKEhBTF9QQ0NBUkRfU3RhdHVzVHlwZURlZikgc3RhdHVzX2NmOworfSAgCisgCisvKioKKyAgKiBAfQorICAqLworICAKKy8qKgorICAqIEB9CisgICovCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX1BDQ0FSRF9NT0RVTEVfRU5BQkxFRCAqLyAgCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmYzeHhfaGFsX3BjZC5jIGIvU3JjL3N0bTMyZjN4eF9oYWxfcGNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NhZDI5YQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfaGFsX3BjZC5jCkBAIC0wLDAgKzEsMTMzNiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfcGNkLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFBDRCBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nIAorICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgVVNCIFBlcmlwaGVyYWwgQ29udHJvbGxlcjoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAgKiAgICAgICAgIAorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgVGhlIFBDRCBIQUwgZHJpdmVyIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CisKKyAgICAgKCMpIERlY2xhcmUgYSBQQ0RfSGFuZGxlVHlwZURlZiBoYW5kbGUgc3RydWN0dXJlLCBmb3IgZXhhbXBsZToKKyAgICAgICAgIFBDRF9IYW5kbGVUeXBlRGVmICBocGNkOworICAgICAgICAKKyAgICAgKCMpIEZpbGwgcGFyYW1ldGVycyBvZiBJbml0IHN0cnVjdHVyZSBpbiBIQ0QgaGFuZGxlCisgIAorICAgICAoIykgQ2FsbCBIQUxfUENEX0luaXQoKSBBUEkgdG8gaW5pdGlhbGl6ZSB0aGUgSENEIHBlcmlwaGVyYWwgKENvcmUsIERldmljZSBjb3JlLCAuLi4pIAorCisgICAgICgjKSBJbml0aWFsaXplIHRoZSBQQ0QgbG93IGxldmVsIHJlc291cmNlcyB0aHJvdWdoIHRoZSBIQUxfUENEX01zcEluaXQoKSBBUEk6CisgICAgICAgICAoIyMpIEVuYWJsZSB0aGUgUENEL1VTQiBMb3cgTGV2ZWwgaW50ZXJmYWNlIGNsb2NrIHVzaW5nIAorICAgICAgICAgICAgICAoKysrKSBfX0hBTF9SQ0NfVVNCX0NMS19FTkFCTEUoKTsKKyAgICAgICAgICAgCisgICAgICAgICAoIyMpIEluaXRpYWxpemUgdGhlIHJlbGF0ZWQgR1BJTyBjbG9ja3MKKyAgICAgICAgICgjIykgQ29uZmlndXJlIFBDRCBwaW4tb3V0CisgICAgICAgICAoIyMpIENvbmZpZ3VyZSBQQ0QgTlZJQyBpbnRlcnJ1cHQKKyAgICAKKyAgICAgKCMpQXNzb2NpYXRlIHRoZSBVcHBlciBVU0IgZGV2aWNlIHN0YWNrIHRvIHRoZSBIQUwgUENEIERyaXZlcjoKKyAgICAgICAgICgjIykgaHBjZC5wRGF0YSA9IHBkZXY7CisKKyAgICAgKCMpRW5hYmxlIEhDRCB0cmFuc21pc3Npb24gYW5kIHJlY2VwdGlvbjoKKyAgICAgICAgICgjIykgSEFMX1BDRF9TdGFydCgpOworCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsLmgiCisKKyNpZmRlZiBIQUxfUENEX01PRFVMRV9FTkFCTEVECisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeDgpICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjM3M3hDKQorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFBDRCBQQ0QKKyAgKiBAYnJpZWYgUENEIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgUENEX1ByaXZhdGVfRGVmaW5lIFBDRCBQcml2YXRlIERlZmluZQorICAqIEB7CisgICovCisjZGVmaW5lIEJUQUJMRV9BRERSRVNTICAgICAgICAgICAgICAgICAgKDB4MDAwVSkgIAorLyoqCisgICogQH0KKyAgKi8gCisgIAorLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQQ0RfUHJpdmF0ZV9GdW5jdGlvbnMgUENEIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBQQ0RfRVBfSVNSX0hhbmRsZXIoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOworLyoqCisgICogQH0KKyAgKi8gCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFBDRF9FeHBvcnRlZF9GdW5jdGlvbnMgUENEIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUENEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAKKyAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIAorICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFBDRCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgUENEX0luaXRUeXBlRGVmIGFuZCBjcmVhdGUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0luaXQoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpCit7IAorICB1aW50MzJfdCBpID0gMFU7CisKKyAgdWludDMyX3Qgd0ludGVycnVwdF9NYXNrID0gMFU7CisgIAorICAvKiBDaGVjayB0aGUgUENEIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmKGhwY2QgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19QQ0RfQUxMX0lOU1RBTkNFKGhwY2QtPkluc3RhbmNlKSk7CisKKyAgaWYoaHBjZC0+U3RhdGUgPT0gSEFMX1BDRF9TVEFURV9SRVNFVCkKKyAgeyAgCisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGhwY2QtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisgIAorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDLi4uICovCisgICAgSEFMX1BDRF9Nc3BJbml0KGhwY2QpOworICB9CisKKyAgaHBjZC0+U3RhdGUgPSBIQUxfUENEX1NUQVRFX0JVU1k7CisgCisgLyogSW5pdCBlbmRwb2ludHMgc3RydWN0dXJlcyAqLworIGZvciAoaSA9IDBVOyBpIDwgaHBjZC0+SW5pdC5kZXZfZW5kcG9pbnRzIDsgaSsrKQorIHsKKyAgIC8qIEluaXQgZXAgc3RydWN0dXJlICovCisgICBocGNkLT5JTl9lcFtpXS5pc19pbiA9IDFVOworICAgaHBjZC0+SU5fZXBbaV0ubnVtID0gaTsKKyAgIC8qIENvbnRyb2wgdW50aWwgZXAgaXMgYWN0dmF0ZWQgKi8KKyAgIGhwY2QtPklOX2VwW2ldLnR5cGUgPSBQQ0RfRVBfVFlQRV9DVFJMOworICAgaHBjZC0+SU5fZXBbaV0ubWF4cGFja2V0ID0gIDBVOworICAgaHBjZC0+SU5fZXBbaV0ueGZlcl9idWZmID0gMFU7CisgICBocGNkLT5JTl9lcFtpXS54ZmVyX2xlbiA9IDBVOworIH0KKyAKKyBmb3IgKGkgPSAwVTsgaSA8IGhwY2QtPkluaXQuZGV2X2VuZHBvaW50cyA7IGkrKykKKyB7CisgICBocGNkLT5PVVRfZXBbaV0uaXNfaW4gPSAwVTsKKyAgIGhwY2QtPk9VVF9lcFtpXS5udW0gPSBpOworICAgLyogQ29udHJvbCB1bnRpbCBlcCBpcyBhY3RpdmF0ZWQgKi8KKyAgIGhwY2QtPk9VVF9lcFtpXS50eXBlID0gUENEX0VQX1RZUEVfQ1RSTDsKKyAgIGhwY2QtPk9VVF9lcFtpXS5tYXhwYWNrZXQgPSAwVTsKKyAgIGhwY2QtPk9VVF9lcFtpXS54ZmVyX2J1ZmYgPSAwVTsKKyAgIGhwY2QtPk9VVF9lcFtpXS54ZmVyX2xlbiA9IDBVOworIH0KKyAgCisgLyogSW5pdCBEZXZpY2UgKi8KKyAvKkNOVFJfRlJFUyA9IDFVKi8KKyBocGNkLT5JbnN0YW5jZS0+Q05UUiA9IFVTQl9DTlRSX0ZSRVM7CisgCisgLypDTlRSX0ZSRVMgPSAwVSovCisgaHBjZC0+SW5zdGFuY2UtPkNOVFIgPSAwVTsKKyAKKyAvKkNsZWFyIHBlbmRpbmcgaW50ZXJydXB0cyovCisgaHBjZC0+SW5zdGFuY2UtPklTVFIgPSAwVTsKKyAKKyAgLypTZXQgQnRhYmxlIEFkcmVzcyovCisgaHBjZC0+SW5zdGFuY2UtPkJUQUJMRSA9IEJUQUJMRV9BRERSRVNTOworICAKKyAgLypzZXQgd0ludGVycnVwdF9NYXNrIGdsb2JhbCB2YXJpYWJsZSovCisgIHdJbnRlcnJ1cHRfTWFzayA9IFVTQl9DTlRSX0NUUk0gIHwgVVNCX0NOVFJfV0tVUE0gfCBVU0JfQ05UUl9TVVNQTSB8IFVTQl9DTlRSX0VSUk0gXAorICB8IFVTQl9DTlRSX1NPRk0gfCBVU0JfQ05UUl9FU09GTSB8IFVTQl9DTlRSX1JFU0VUTTsKKyAgCisgIC8qU2V0IGludGVycnVwdCBtYXNrKi8KKyAgaHBjZC0+SW5zdGFuY2UtPkNOVFIgPSB3SW50ZXJydXB0X01hc2s7CisgIAorICBocGNkLT5VU0JfQWRkcmVzcyA9IDBVOworICBocGNkLT5TdGF0ZT0gSEFMX1BDRF9TVEFURV9SRUFEWTsKKworIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplcyB0aGUgUENEIHBlcmlwaGVyYWwgCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRGVJbml0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICAvKiBDaGVjayB0aGUgUENEIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmKGhwY2QgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICBocGNkLT5TdGF0ZSA9IEhBTF9QQ0RfU1RBVEVfQlVTWTsKKyAgCisgIC8qIFN0b3AgRGV2aWNlICovCisgIEhBTF9QQ0RfU3RvcChocGNkKTsKKyAgICAKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgSEFMX1BDRF9Nc3BEZUluaXQoaHBjZCk7CisgIAorICBocGNkLT5TdGF0ZSA9IEhBTF9QQ0RfU1RBVEVfUkVTRVQ7IAorICAKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgUENEIE1TUC4KKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1BDRF9Nc3BJbml0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocGNkKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1BDRF9Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplcyBQQ0QgTVNQLgorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUENEX01zcERlSW5pdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHBjZCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9QQ0RfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUENEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAKKyAqICBAYnJpZWYgICBEYXRhIHRyYW5zZmVycyBmdW5jdGlvbnMgCisgKgorQHZlcmJhdGltICAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBtYW5hZ2UgdGhlIFBDRCBkYXRhIAorICAgIHRyYW5zZmVycy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKyAgCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBVU0IgZGV2aWNlLgorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1N0YXJ0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreyAKKyAgLyogIERQIFB1bGwtRG93biBpcyBleHRlcm5hbCAqLworICBIQUxfUENERXhfU2V0Q29ubmVjdGlvblN0YXRlIChocGNkLCAxVSk7CisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgdGhlIFVTQiBkZXZpY2UuCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfU3RvcChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkKK3sgCisgIF9fSEFMX0xPQ0soaHBjZCk7IAorICAKKyAgICAvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzIGFuZCBmb3JjZSBVU0IgcmVzZXQgKi8KKyAgaHBjZC0+SW5zdGFuY2UtPkNOVFIgPSBVU0JfQ05UUl9GUkVTOworICAKKyAgLyogY2xlYXIgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAqLworICBocGNkLT5JbnN0YW5jZS0+SVNUUiA9IDBVOworICAKKyAgLyogc3dpdGNoLW9mZiBkZXZpY2UgKi8KKyAgaHBjZC0+SW5zdGFuY2UtPkNOVFIgPSAoVVNCX0NOVFJfRlJFUyB8IFVTQl9DTlRSX1BEV04pOworICAKKyAgX19IQUxfVU5MT0NLKGhwY2QpOyAKKyAgcmV0dXJuIEhBTF9PSzsKK30KKy8qKgorICAqIEB9CisgICovCisgIAorLyoqCisgICogQH0KKyAgKi8gIAorCisvKiogQGFkZHRvZ3JvdXAgUENEX1ByaXZhdGVfRnVuY3Rpb25zIFBDRCBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBQQ0QgRW5kcG9pbnQgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBQQ0RfRVBfSVNSX0hhbmRsZXIoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpCit7CisgIFBDRF9FUFR5cGVEZWYgKmVwOworICB1aW50MTZfdCBjb3VudD0wVTsKKyAgdWludDhfdCBFUGluZGV4OworICBfX0lPIHVpbnQxNl90IHdJc3RyOyAgCisgIF9fSU8gdWludDE2X3Qgd0VQVmFsID0gMFU7CisgIAorICAvKiBzdGF5IGluIGxvb3Agd2hpbGUgcGVuZGluZyBpbnRlcnJ1cHRzICovCisgIHdoaWxlICgoKHdJc3RyID0gaHBjZC0+SW5zdGFuY2UtPklTVFIpICYgVVNCX0lTVFJfQ1RSKSAhPSAwVSkKKyAgeworICAgIC8qIGV4dHJhY3QgaGlnaGVzdCBwcmlvcml0eSBlbmRwb2ludCBudW1iZXIgKi8KKyAgICBFUGluZGV4ID0gKHVpbnQ4X3QpKHdJc3RyICYgVVNCX0lTVFJfRVBfSUQpOworICAgIAorICAgIGlmIChFUGluZGV4ID09IDBVKQorICAgIHsKKyAgICAgIC8qIERlY29kZSBhbmQgc2VydmljZSBjb250cm9sIGVuZHBvaW50IGludGVycnVwdCAqLworICAgICAgCisgICAgICAvKiBESVIgYml0ID0gb3JpZ2luIG9mIHRoZSBpbnRlcnJ1cHQgKi8gICAKKyAgICAgIGlmICgod0lzdHIgJiBVU0JfSVNUUl9ESVIpID09IDBVKQorICAgICAgeworICAgICAgICAvKiBESVIgPSAwVSAqLworICAgICAgICAKKyAgICAgICAgLyogRElSID0gMCAgICAgID0+IElOICBpbnQgKi8KKyAgICAgICAgLyogRElSID0gMCBpbXBsaWVzIHRoYXQgKEVQX0NUUl9UWCA9IDFVKSBhbHdheXMgICovCisgICAgICAgIFBDRF9DTEVBUl9UWF9FUF9DVFIoaHBjZC0+SW5zdGFuY2UsIFBDRF9FTkRQMCk7CisgICAgICAgIGVwID0gJmhwY2QtPklOX2VwWzBdOworICAgICAgICAKKyAgICAgICAgZXAtPnhmZXJfY291bnQgPSBQQ0RfR0VUX0VQX1RYX0NOVChocGNkLT5JbnN0YW5jZSwgZXAtPm51bSk7CisgICAgICAgIGVwLT54ZmVyX2J1ZmYgKz0gZXAtPnhmZXJfY291bnQ7CisgCisgICAgICAgIC8qIFRYIENPTVBMRVRFICovCisgICAgICAgIEhBTF9QQ0RfRGF0YUluU3RhZ2VDYWxsYmFjayhocGNkLCAwVSk7CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgaWYoKGhwY2QtPlVTQl9BZGRyZXNzID4gMFUpJiYgKCBlcC0+eGZlcl9sZW4gPT0gMFUpKQorICAgICAgICB7CisgICAgICAgICAgaHBjZC0+SW5zdGFuY2UtPkRBRERSID0gKGhwY2QtPlVTQl9BZGRyZXNzIHwgVVNCX0RBRERSX0VGKTsKKyAgICAgICAgICBocGNkLT5VU0JfQWRkcmVzcyA9IDBVOworICAgICAgICB9CisgICAgICAgIAorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBESVIgPSAxVSAqLworICAgICAgICAKKyAgICAgICAgLyogRElSID0gMVUgJiBDVFJfUlggICAgICAgPT4gU0VUVVAgb3IgT1VUIGludCAqLworICAgICAgICAvKiBESVIgPSAxVSAmIChDVFJfVFggfCBDVFJfUlgpID0+IDIgaW50IHBlbmRpbmcgKi8KKyAgICAgICAgZXAgPSAmaHBjZC0+T1VUX2VwWzBdOworICAgICAgICB3RVBWYWwgPSBQQ0RfR0VUX0VORFBPSU5UKGhwY2QtPkluc3RhbmNlLCBQQ0RfRU5EUDApOworICAgICAgICAKKyAgICAgICAgaWYgKCh3RVBWYWwgJiBVU0JfRVBfU0VUVVApICE9IDBVKQorICAgICAgICB7CisgICAgICAgICAgLyogR2V0IFNFVFVQIFBhY2tldCovCisgICAgICAgICAgZXAtPnhmZXJfY291bnQgPSBQQ0RfR0VUX0VQX1JYX0NOVChocGNkLT5JbnN0YW5jZSwgZXAtPm51bSk7CisgICAgICAgICAgUENEX1JlYWRQTUEoaHBjZC0+SW5zdGFuY2UsICh1aW50OF90Kikodm9pZCopaHBjZC0+U2V0dXAgLGVwLT5wbWFhZHJlc3MgLCBlcC0+eGZlcl9jb3VudCk7CisgICAgICAgICAgLyogU0VUVVAgYml0IGtlcHQgZnJvemVuIHdoaWxlIENUUl9SWCA9IDFVKi8gCisgICAgICAgICAgUENEX0NMRUFSX1JYX0VQX0NUUihocGNkLT5JbnN0YW5jZSwgUENEX0VORFAwKTsgCisgICAgICAgICAgCisgICAgICAgICAgLyogUHJvY2VzcyBTRVRVUCBQYWNrZXQqLworICAgICAgICAgIEhBTF9QQ0RfU2V0dXBTdGFnZUNhbGxiYWNrKGhwY2QpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBlbHNlIGlmICgod0VQVmFsICYgVVNCX0VQX0NUUl9SWCkgIT0gMFUpCisgICAgICAgIHsKKyAgICAgICAgICBQQ0RfQ0xFQVJfUlhfRVBfQ1RSKGhwY2QtPkluc3RhbmNlLCBQQ0RfRU5EUDApOworICAgICAgICAgIC8qIEdldCBDb250cm9sIERhdGEgT1VUIFBhY2tldCovCisgICAgICAgICAgZXAtPnhmZXJfY291bnQgPSBQQ0RfR0VUX0VQX1JYX0NOVChocGNkLT5JbnN0YW5jZSwgZXAtPm51bSk7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKGVwLT54ZmVyX2NvdW50ICE9IDBVKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFBDRF9SZWFkUE1BKGhwY2QtPkluc3RhbmNlLCBlcC0+eGZlcl9idWZmLCBlcC0+cG1hYWRyZXNzLCBlcC0+eGZlcl9jb3VudCk7CisgICAgICAgICAgICBlcC0+eGZlcl9idWZmKz1lcC0+eGZlcl9jb3VudDsKKyAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgLyogUHJvY2VzcyBDb250cm9sIERhdGEgT1VUIFBhY2tldCovCisgICAgICAgICAgIEhBTF9QQ0RfRGF0YU91dFN0YWdlQ2FsbGJhY2soaHBjZCwgMFUpOworICAgICAgICAgIAorICAgICAgICAgIFBDRF9TRVRfRVBfUlhfQ05UKGhwY2QtPkluc3RhbmNlLCBQQ0RfRU5EUDAsIGVwLT5tYXhwYWNrZXQpCisgICAgICAgICAgUENEX1NFVF9FUF9SWF9TVEFUVVMoaHBjZC0+SW5zdGFuY2UsIFBDRF9FTkRQMCwgVVNCX0VQX1JYX1ZBTElEKQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAKKyAgICAgIC8qIERlY29kZSBhbmQgc2VydmljZSBub24gY29udHJvbCBlbmRwb2ludHMgaW50ZXJydXB0ICAqLworICAgICAgCisgICAgICAvKiBwcm9jZXNzIHJlbGF0ZWQgZW5kcG9pbnQgcmVnaXN0ZXIgKi8KKyAgICAgIHdFUFZhbCA9IFBDRF9HRVRfRU5EUE9JTlQoaHBjZC0+SW5zdGFuY2UsIEVQaW5kZXgpOworICAgICAgaWYgKCh3RVBWYWwgJiBVU0JfRVBfQ1RSX1JYKSAhPSAwVSkKKyAgICAgIHsgIAorICAgICAgICAvKiBjbGVhciBpbnQgZmxhZyAqLworICAgICAgICBQQ0RfQ0xFQVJfUlhfRVBfQ1RSKGhwY2QtPkluc3RhbmNlLCBFUGluZGV4KTsKKyAgICAgICAgZXAgPSAmaHBjZC0+T1VUX2VwW0VQaW5kZXhdOworICAgICAgICAKKyAgICAgICAgLyogT1VUIGRvdWJsZSBCdWZmZXJpbmcqLworICAgICAgICBpZiAoZXAtPmRvdWJsZWJ1ZmZlciA9PSAwVSkKKyAgICAgICAgeworICAgICAgICAgIGNvdW50ID0gUENEX0dFVF9FUF9SWF9DTlQoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pOworICAgICAgICAgIGlmIChjb3VudCAhPSAwVSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBQQ0RfUmVhZFBNQShocGNkLT5JbnN0YW5jZSwgZXAtPnhmZXJfYnVmZiwgZXAtPnBtYWFkcmVzcywgY291bnQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKFBDRF9HRVRfRU5EUE9JTlQoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pJiBVU0JfRVBfRFRPR19SWCkgPT0gVVNCX0VQX0RUT0dfUlgpCisgICAgICAgICAgeworICAgICAgICAgICAgLypyZWFkIGZyb20gZW5kcG9pbnQgQlVGMEFkZHIgYnVmZmVyKi8KKyAgICAgICAgICAgIGNvdW50ID0gUENEX0dFVF9FUF9EQlVGMF9DTlQoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pOworICAgICAgICAgICAgaWYgKGNvdW50ICE9IDBVKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBQQ0RfUmVhZFBNQShocGNkLT5JbnN0YW5jZSwgZXAtPnhmZXJfYnVmZiwgZXAtPnBtYWFkZHIwLCBjb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKnJlYWQgZnJvbSBlbmRwb2ludCBCVUYxQWRkciBidWZmZXIqLworICAgICAgICAgICAgY291bnQgPSBQQ0RfR0VUX0VQX0RCVUYxX0NOVChocGNkLT5JbnN0YW5jZSwgZXAtPm51bSk7CisgICAgICAgICAgICBpZiAoY291bnQgIT0gMFUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIFBDRF9SZWFkUE1BKGhwY2QtPkluc3RhbmNlLCBlcC0+eGZlcl9idWZmLCBlcC0+cG1hYWRkcjEsIGNvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgUENEX0ZyZWVVc2VyQnVmZmVyKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCBQQ0RfRVBfREJVRl9PVVQpICAKKyAgICAgICAgfQorICAgICAgICAvKm11bHRpLXBhY2tldCBvbiB0aGUgTk9OIGNvbnRyb2wgT1VUIGVuZHBvaW50Ki8KKyAgICAgICAgZXAtPnhmZXJfY291bnQrPWNvdW50OworICAgICAgICBlcC0+eGZlcl9idWZmKz1jb3VudDsKKyAgICAgICAKKyAgICAgICAgaWYgKChlcC0+eGZlcl9sZW4gPT0gMFUpIHx8IChjb3VudCA8IGVwLT5tYXhwYWNrZXQpKQorICAgICAgICB7CisgICAgICAgICAgLyogUlggQ09NUExFVEUgKi8KKyAgICAgICAgICBIQUxfUENEX0RhdGFPdXRTdGFnZUNhbGxiYWNrKGhwY2QsIGVwLT5udW0pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIEhBTF9QQ0RfRVBfUmVjZWl2ZShocGNkLCBlcC0+bnVtLCBlcC0+eGZlcl9idWZmLCBlcC0+eGZlcl9sZW4pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgfSAvKiBpZigod0VQVmFsICYgRVBfQ1RSX1JYKSAqLworICAgICAgCisgICAgICBpZiAoKHdFUFZhbCAmIFVTQl9FUF9DVFJfVFgpICE9IDBVKQorICAgICAgeworICAgICAgICBlcCA9ICZocGNkLT5JTl9lcFtFUGluZGV4XTsKKyAgICAgICAgCisgICAgICAgIC8qIGNsZWFyIGludCBmbGFnICovCisgICAgICAgIFBDRF9DTEVBUl9UWF9FUF9DVFIoaHBjZC0+SW5zdGFuY2UsIEVQaW5kZXgpOworICAgICAgICAKKyAgICAgICAgLyogSU4gZG91YmxlIEJ1ZmZlcmluZyovCisgICAgICAgIGlmIChlcC0+ZG91YmxlYnVmZmVyID09IDBVKQorICAgICAgICB7CisgICAgICAgICAgZXAtPnhmZXJfY291bnQgPSBQQ0RfR0VUX0VQX1RYX0NOVChocGNkLT5JbnN0YW5jZSwgZXAtPm51bSk7CisgICAgICAgICAgaWYgKGVwLT54ZmVyX2NvdW50ICE9IDBVKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFBDRF9Xcml0ZVBNQShocGNkLT5JbnN0YW5jZSwgZXAtPnhmZXJfYnVmZiwgZXAtPnBtYWFkcmVzcywgZXAtPnhmZXJfY291bnQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKFBDRF9HRVRfRU5EUE9JTlQoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pJiBVU0JfRVBfRFRPR19UWCkgPT0gVVNCX0VQX0RUT0dfVFgpCisgICAgICAgICAgeworICAgICAgICAgICAgLypyZWFkIGZyb20gZW5kcG9pbnQgQlVGMEFkZHIgYnVmZmVyKi8KKyAgICAgICAgICAgIGVwLT54ZmVyX2NvdW50ID0gUENEX0dFVF9FUF9EQlVGMF9DTlQoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pOworICAgICAgICAgICAgaWYgKGVwLT54ZmVyX2NvdW50ICE9IDBVKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBQQ0RfV3JpdGVQTUEoaHBjZC0+SW5zdGFuY2UsIGVwLT54ZmVyX2J1ZmYsIGVwLT5wbWFhZGRyMCwgZXAtPnhmZXJfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgLypyZWFkIGZyb20gZW5kcG9pbnQgQlVGMUFkZHIgYnVmZmVyKi8KKyAgICAgICAgICAgIGVwLT54ZmVyX2NvdW50ID0gUENEX0dFVF9FUF9EQlVGMV9DTlQoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pOworICAgICAgICAgICAgaWYgKGVwLT54ZmVyX2NvdW50ICE9IDBVKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBQQ0RfV3JpdGVQTUEoaHBjZC0+SW5zdGFuY2UsIGVwLT54ZmVyX2J1ZmYsIGVwLT5wbWFhZGRyMSwgZXAtPnhmZXJfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBQQ0RfRnJlZVVzZXJCdWZmZXIoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0sIFBDRF9FUF9EQlVGX0lOKSAgCisgICAgICAgIH0KKyAgICAgICAgLyptdWx0aS1wYWNrZXQgb24gdGhlIE5PTiBjb250cm9sIElOIGVuZHBvaW50Ki8KKyAgICAgICAgZXAtPnhmZXJfY291bnQgPSBQQ0RfR0VUX0VQX1RYX0NOVChocGNkLT5JbnN0YW5jZSwgZXAtPm51bSk7CisgICAgICAgIGVwLT54ZmVyX2J1ZmYrPWVwLT54ZmVyX2NvdW50OworICAgICAgIAorICAgICAgICAvKiBaZXJvIExlbmd0aCBQYWNrZXQ/ICovCisgICAgICAgIGlmIChlcC0+eGZlcl9sZW4gPT0gMFUpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBUWCBDT01QTEVURSAqLworICAgICAgICAgIEhBTF9QQ0RfRGF0YUluU3RhZ2VDYWxsYmFjayhocGNkLCBlcC0+bnVtKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBIQUxfUENEX0VQX1RyYW5zbWl0KGhwY2QsIGVwLT5udW0sIGVwLT54ZmVyX2J1ZmYsIGVwLT54ZmVyX2xlbik7CisgICAgICAgIH0KKyAgICAgIH0gCisgICAgfQorICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgUENEX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUENEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAKKyAqIEB7CisgKi8gICAgCisgCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBQQ0QgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3ZvaWQgSEFMX1BDRF9JUlFIYW5kbGVyKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICAKKyAgaWYgKF9fSEFMX1BDRF9HRVRfRkxBRyAoaHBjZCwgVVNCX0lTVFJfQ1RSKSkKKyAgeworICAgIC8qIHNlcnZpY2luZyBvZiB0aGUgZW5kcG9pbnQgY29ycmVjdCB0cmFuc2ZlciBpbnRlcnJ1cHQgKi8KKyAgICAvKiBjbGVhciBvZiB0aGUgQ1RSIGZsYWcgaW50byB0aGUgc3ViICovCisgICAgUENEX0VQX0lTUl9IYW5kbGVyKGhwY2QpOworICB9CisKKyAgaWYgKF9fSEFMX1BDRF9HRVRfRkxBRyAoaHBjZCwgVVNCX0lTVFJfUkVTRVQpKQorICB7CisgICAgX19IQUxfUENEX0NMRUFSX0ZMQUcoaHBjZCwgVVNCX0lTVFJfUkVTRVQpOworICAgIEhBTF9QQ0RfUmVzZXRDYWxsYmFjayhocGNkKTsKKyAgICBIQUxfUENEX1NldEFkZHJlc3MoaHBjZCwgMFUpOworICB9CisKKyAgaWYgKF9fSEFMX1BDRF9HRVRfRkxBRyAoaHBjZCwgVVNCX0lTVFJfUE1BT1ZSKSkKKyAgeworICAgIF9fSEFMX1BDRF9DTEVBUl9GTEFHKGhwY2QsIFVTQl9JU1RSX1BNQU9WUik7ICAgIAorICB9CisgIGlmIChfX0hBTF9QQ0RfR0VUX0ZMQUcgKGhwY2QsIFVTQl9JU1RSX0VSUikpCisgIHsKKyAgICBfX0hBTF9QQ0RfQ0xFQVJfRkxBRyhocGNkLCBVU0JfSVNUUl9FUlIpOyAKKyAgfQorCisgIGlmIChfX0hBTF9QQ0RfR0VUX0ZMQUcgKGhwY2QsIFVTQl9JU1RSX1dLVVApKQorICB7CisgICAgaHBjZC0+SW5zdGFuY2UtPkNOVFIgJj0gKHVpbnQxNl90KSB+KFVTQl9DTlRSX0xQTU9ERSk7CisgICAgaHBjZC0+SW5zdGFuY2UtPkNOVFIgJj0gKHVpbnQxNl90KSB+KFVTQl9DTlRSX0ZTVVNQKTsKKworICAgIEhBTF9QQ0RfUmVzdW1lQ2FsbGJhY2soaHBjZCk7CisKKyAgICBfX0hBTF9QQ0RfQ0xFQVJfRkxBRyhocGNkLCBVU0JfSVNUUl9XS1VQKTsgICAgIAorICB9CisKKyAgaWYgKF9fSEFMX1BDRF9HRVRfRkxBRyAoaHBjZCwgVVNCX0lTVFJfU1VTUCkpCisgIHsKKyAgICAvKiBGb3JjZSBsb3ctcG93ZXIgbW9kZSBpbiB0aGUgbWFjcm9jZWxsICovCisgICAgaHBjZC0+SW5zdGFuY2UtPkNOVFIgfD0gVVNCX0NOVFJfRlNVU1A7CisKKyAgICAvKiBjbGVhciBvZiB0aGUgSVNUUiBiaXQgbXVzdCBiZSBkb25lIGFmdGVyIHNldHRpbmcgb2YgQ05UUl9GU1VTUCAqLworICAgIF9fSEFMX1BDRF9DTEVBUl9GTEFHKGhwY2QsIFVTQl9JU1RSX1NVU1ApOworCisgICAgaHBjZC0+SW5zdGFuY2UtPkNOVFIgfD0gVVNCX0NOVFJfTFBNT0RFOworICAgIGlmIChfX0hBTF9QQ0RfR0VUX0ZMQUcgKGhwY2QsIFVTQl9JU1RSX1dLVVApID09IDBVKQorICAgIHsKKyAgICAgIEhBTF9QQ0RfU3VzcGVuZENhbGxiYWNrKGhwY2QpOworICAgIH0KKyAgfQorCisgIGlmIChfX0hBTF9QQ0RfR0VUX0ZMQUcgKGhwY2QsIFVTQl9JU1RSX1NPRikpCisgIHsKKyAgICBfX0hBTF9QQ0RfQ0xFQVJfRkxBRyhocGNkLCBVU0JfSVNUUl9TT0YpOyAKKyAgICBIQUxfUENEX1NPRkNhbGxiYWNrKGhwY2QpOworICB9CisKKyAgaWYgKF9fSEFMX1BDRF9HRVRfRkxBRyAoaHBjZCwgVVNCX0lTVFJfRVNPRikpCisgIHsKKyAgICAvKiBjbGVhciBFU09GIGZsYWcgaW4gSVNUUiAqLworICAgIF9fSEFMX1BDRF9DTEVBUl9GTEFHKGhwY2QsIFVTQl9JU1RSX0VTT0YpOyAKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIERhdGEgb3V0IHN0YWdlIGNhbGxiYWNrcworICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHBhcmFtICBlcG51bSBlbmRwb2ludCBudW1iZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyBfX3dlYWsgdm9pZCBIQUxfUENEX0RhdGFPdXRTdGFnZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwbnVtKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocGNkKTsKKyAgVU5VU0VEKGVwbnVtKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1BDRF9EYXRhT3V0U3RhZ2VDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQGJyaWVmICBEYXRhIElOIHN0YWdlIGNhbGxiYWNrcworICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHBhcmFtICBlcG51bSBlbmRwb2ludCBudW1iZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyBfX3dlYWsgdm9pZCBIQUxfUENEX0RhdGFJblN0YWdlQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBudW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhwY2QpOworICBVTlVTRUQoZXBudW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUENEX0RhdGFJblN0YWdlQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gCit9CisvKioKKyAgKiBAYnJpZWYgIFNldHVwIHN0YWdlIGNhbGxiYWNrCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyBfX3dlYWsgdm9pZCBIQUxfUENEX1NldHVwU3RhZ2VDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHBjZCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9QQ0RfU2V0dXBTdGFnZUNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovIAorfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQiBTdGFydCBPZiBGcmFtZSBjYWxsYmFja3MKKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworIF9fd2VhayB2b2lkIEhBTF9QQ0RfU09GQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhwY2QpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUENEX1NPRkNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovIAorfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQiBSZXNldCBjYWxsYmFja3MKKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworIF9fd2VhayB2b2lkIEhBTF9QQ0RfUmVzZXRDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHBjZCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9QQ0RfUmVzZXRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQGJyaWVmICBTdXNwZW5kIGV2ZW50IGNhbGxiYWNrcworICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisgX193ZWFrIHZvaWQgSEFMX1BDRF9TdXNwZW5kQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhwY2QpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUENEX1N1c3BlbmRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQGJyaWVmICBSZXN1bWUgZXZlbnQgY2FsbGJhY2tzCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyBfX3dlYWsgdm9pZCBIQUxfUENEX1Jlc3VtZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocGNkKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1BDRF9SZXN1bWVDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQGJyaWVmICBJbmNvbXBsZXRlIElTTyBPVVQgY2FsbGJhY2tzCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcGFyYW0gIGVwbnVtIGVuZHBvaW50IG51bWJlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworIF9fd2VhayB2b2lkIEhBTF9QQ0RfSVNPT1VUSW5jb21wbGV0ZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwbnVtKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocGNkKTsKKyAgVU5VU0VEKGVwbnVtKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1BDRF9JU09PVVRJbmNvbXBsZXRlQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gCit9CisKKy8qKgorICAqIEBicmllZiAgSW5jb21wbGV0ZSBJU08gSU4gIGNhbGxiYWNrcworICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHBhcmFtICBlcG51bSBlbmRwb2ludCBudW1iZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyBfX3dlYWsgdm9pZCBIQUxfUENEX0lTT0lOSW5jb21wbGV0ZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwbnVtKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocGNkKTsKKyAgVU5VU0VEKGVwbnVtKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1BDRF9JU09JTkluY29tcGxldGVDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQGJyaWVmICBDb25uZWN0aW9uIGV2ZW50IGNhbGxiYWNrcworICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisgX193ZWFrIHZvaWQgSEFMX1BDRF9Db25uZWN0Q2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhwY2QpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUENEX0Nvbm5lY3RDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQGJyaWVmICBEaXNjb25uZWN0aW9uIGV2ZW50IGNhbGxiYWNrcworICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisgX193ZWFrIHZvaWQgSEFMX1BDRF9EaXNjb25uZWN0Q2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhwY2QpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUENEX0Rpc2Nvbm5lY3RDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKy8qKgorICAqIEB9CisgICovCisgIAorLyoqIEBkZWZncm91cCBQQ0RfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zIAorICogIEBicmllZiAgIG1hbmFnZW1lbnQgZnVuY3Rpb25zIAorICoKK0B2ZXJiYXRpbSAgIAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gY29udHJvbCB0aGUgUENEIGRhdGEgCisgICAgdHJhbnNmZXJzLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbm5lY3QgdGhlIFVTQiBkZXZpY2UgCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRGV2Q29ubmVjdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkKK3sKKyAgX19IQUxfTE9DSyhocGNkKTsgCisgIAorICAvKiBFbmFibGluZyBEUCBQdWxsLURvd24gYml0IHRvIENvbm5lY3QgaW50ZXJuYWwgcHVsbC11cCBvbiBVU0IgRFAgbGluZSAqLworICAgSEFMX1BDREV4X1NldENvbm5lY3Rpb25TdGF0ZShocGNkLCAxVSk7CisgIAorICBfX0hBTF9VTkxPQ0soaHBjZCk7IAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2Nvbm5lY3QgdGhlIFVTQiBkZXZpY2UgCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRGV2RGlzY29ubmVjdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkKK3sKKyAgX19IQUxfTE9DSyhocGNkKTsgCisgIAorICAvKiBEaXNhYmxlIERQIFB1bGwtRG93biBiaXQqLworICBIQUxfUENERXhfU2V0Q29ubmVjdGlvblN0YXRlKGhwY2QsIDBVKTsKKyAgCisgIF9fSEFMX1VOTE9DSyhocGNkKTsgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBVU0IgRGV2aWNlIGFkZHJlc3MgCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcGFyYW0gIGFkZHJlc3MgbmV3IGRldmljZSBhZGRyZXNzCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1NldEFkZHJlc3MoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgYWRkcmVzcykKK3sKKyAgIF9fSEFMX0xPQ0soaHBjZCk7IAorCisgICBpZihhZGRyZXNzID09IDBVKSAKKyAgIHsKKyAgICAgLyogc2V0IGRldmljZSBhZGRyZXNzIGFuZCBlbmFibGUgZnVuY3Rpb24gKi8KKyAgICAgaHBjZC0+SW5zdGFuY2UtPkRBRERSID0gVVNCX0RBRERSX0VGOworICAgfQorICAgZWxzZSAvKiBVU0IgQWRkcmVzcyB3aWxsIGJlIGFwcGxpZWQgbGF0ZXIgKi8KKyAgIHsKKyAgICAgaHBjZC0+VVNCX0FkZHJlc3MgPSBhZGRyZXNzOworICAgfQorCisgIF9fSEFMX1VOTE9DSyhocGNkKTsgICAKKyAgcmV0dXJuIEhBTF9PSzsKK30KKy8qKgorICAqIEBicmllZiAgT3BlbiBhbmQgY29uZmlndXJlIGFuIGVuZHBvaW50CisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcGFyYW0gIGVwX2FkZHIgZW5kcG9pbnQgYWRkcmVzcworICAqIEBwYXJhbSAgZXBfbXBzIGVuZHBvaW50IG1heCBwYWNrZXQgc2l6ZQorICAqIEBwYXJhbSAgZXBfdHlwZSBlbmRwb2ludCB0eXBlICAgCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0VQX09wZW4oUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBfYWRkciwgdWludDE2X3QgZXBfbXBzLCB1aW50OF90IGVwX3R5cGUpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmICByZXQgPSBIQUxfT0s7CisgIFBDRF9FUFR5cGVEZWYgKmVwOworICAKKyAgaWYgKChlcF9hZGRyICYgMHg4MFUpID09IDB4ODBVKQorICB7CisgICAgZXAgPSAmaHBjZC0+SU5fZXBbZXBfYWRkciAmIDB4N0ZVXTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBlcCA9ICZocGNkLT5PVVRfZXBbZXBfYWRkciAmIDB4N0ZVXTsKKyAgfQorICBlcC0+bnVtICAgPSBlcF9hZGRyICYgMHg3RlU7CisgIAorICBlcC0+aXNfaW4gPSAoMHg4MFUgJiBlcF9hZGRyKSAhPSAwVTsKKyAgZXAtPm1heHBhY2tldCA9IGVwX21wczsKKyAgZXAtPnR5cGUgPSBlcF90eXBlOworICAKKyAgX19IQUxfTE9DSyhocGNkKTsgCisKKyAgLyogaW5pdGlhbGl6ZSBFbmRwb2ludCAqLworICBzd2l0Y2ggKGVwLT50eXBlKQorICB7CisgIGNhc2UgUENEX0VQX1RZUEVfQ1RSTDoKKyAgICBQQ0RfU0VUX0VQVFlQRShocGNkLT5JbnN0YW5jZSwgZXAtPm51bSwgVVNCX0VQX0NPTlRST0wpOworICAgIGJyZWFrOworICBjYXNlIFBDRF9FUF9UWVBFX0JVTEs6CisgICAgUENEX1NFVF9FUFRZUEUoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0sIFVTQl9FUF9CVUxLKTsKKyAgICBicmVhazsKKyAgY2FzZSBQQ0RfRVBfVFlQRV9JTlRSOgorICAgIFBDRF9TRVRfRVBUWVBFKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCBVU0JfRVBfSU5URVJSVVBUKTsKKyAgICBicmVhazsKKyAgY2FzZSBQQ0RfRVBfVFlQRV9JU09DOgorICAgIFBDRF9TRVRfRVBUWVBFKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCBVU0JfRVBfSVNPQ0hST05PVVMpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9IAorICAKKyAgUENEX1NFVF9FUF9BRERSRVNTKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCBlcC0+bnVtKTsKKyAgCisgIGlmIChlcC0+ZG91YmxlYnVmZmVyID09IDBVKSAKKyAgeworICAgIGlmIChlcC0+aXNfaW4pCisgICAgeworICAgICAgLypTZXQgdGhlIGVuZHBvaW50IFRyYW5zbWl0IGJ1ZmZlciBhZGRyZXNzICovCisgICAgICBQQ0RfU0VUX0VQX1RYX0FERFJFU1MoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0sIGVwLT5wbWFhZHJlc3MpOworICAgICAgUENEX0NMRUFSX1RYX0RUT0coaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pCisgICAgICAvKiBDb25maWd1cmUgTkFLIHN0YXR1cyBmb3IgdGhlIEVuZHBvaW50Ki8KKyAgICAgIFBDRF9TRVRfRVBfVFhfU1RBVFVTKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCBVU0JfRVBfVFhfTkFLKSAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qU2V0IHRoZSBlbmRwb2ludCBSZWNlaXZlIGJ1ZmZlciBhZGRyZXNzICovCisgICAgICBQQ0RfU0VUX0VQX1JYX0FERFJFU1MoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0sIGVwLT5wbWFhZHJlc3MpOworICAgICAgLypTZXQgdGhlIGVuZHBvaW50IFJlY2VpdmUgYnVmZmVyIGNvdW50ZXIqLworICAgICAgUENEX1NFVF9FUF9SWF9DTlQoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0sIGVwLT5tYXhwYWNrZXQpCisgICAgICBQQ0RfQ0xFQVJfUlhfRFRPRyhocGNkLT5JbnN0YW5jZSwgZXAtPm51bSkKKyAgICAgIC8qIENvbmZpZ3VyZSBWQUxJRCBzdGF0dXMgZm9yIHRoZSBFbmRwb2ludCovCisgICAgICBQQ0RfU0VUX0VQX1JYX1NUQVRVUyhocGNkLT5JbnN0YW5jZSwgZXAtPm51bSwgVVNCX0VQX1JYX1ZBTElEKQorICAgIH0KKyAgfQorICAvKkRvdWJsZSBCdWZmZXIqLworICBlbHNlCisgIHsKKyAgICAvKlNldCB0aGUgZW5kcG9pbnQgYXMgZG91YmxlIGJ1ZmZlcmVkKi8KKyAgICBQQ0RfU0VUX0VQX0RCVUYoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pOworICAgIC8qU2V0IGJ1ZmZlciBhZGRyZXNzIGZvciBkb3VibGUgYnVmZmVyZWQgbW9kZSovCisgICAgUENEX1NFVF9FUF9EQlVGX0FERFIoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0sZXAtPnBtYWFkZHIwLCBlcC0+cG1hYWRkcjEpCisgICAgCisgICAgaWYgKGVwLT5pc19pbj09MFUpCisgICAgeworICAgICAgLyogQ2xlYXIgdGhlIGRhdGEgdG9nZ2xlIGJpdHMgZm9yIHRoZSBlbmRwb2ludCBJTi9PVVQqLworICAgICAgUENEX0NMRUFSX1JYX0RUT0coaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pCisgICAgICBQQ0RfQ0xFQVJfVFhfRFRPRyhocGNkLT5JbnN0YW5jZSwgZXAtPm51bSkKKyAgICAgIAorICAgICAgLyogUmVzZXQgdmFsdWUgb2YgdGhlIGRhdGEgdG9nZ2xlIGJpdHMgZm9yIHRoZSBlbmRwb2ludCBvdXQqLworICAgICAgUENEX1RYX0RUT0coaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pOworICAgICAgCisgICAgICBQQ0RfU0VUX0VQX1JYX1NUQVRVUyhocGNkLT5JbnN0YW5jZSwgZXAtPm51bSwgVVNCX0VQX1JYX1ZBTElEKQorICAgICAgUENEX1NFVF9FUF9UWF9TVEFUVVMoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0sIFVTQl9FUF9UWF9ESVMpCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBDbGVhciB0aGUgZGF0YSB0b2dnbGUgYml0cyBmb3IgdGhlIGVuZHBvaW50IElOL09VVCovCisgICAgICBQQ0RfQ0xFQVJfUlhfRFRPRyhocGNkLT5JbnN0YW5jZSwgZXAtPm51bSkKKyAgICAgIFBDRF9DTEVBUl9UWF9EVE9HKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtKQorICAgICAgUENEX1JYX0RUT0coaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pOworICAgICAgLyogQ29uZmlndXJlIERJU0FCTEUgc3RhdHVzIGZvciB0aGUgRW5kcG9pbnQqLworICAgICAgUENEX1NFVF9FUF9UWF9TVEFUVVMoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0sIFVTQl9FUF9UWF9ESVMpCisgICAgICBQQ0RfU0VUX0VQX1JYX1NUQVRVUyhocGNkLT5JbnN0YW5jZSwgZXAtPm51bSwgVVNCX0VQX1JYX0RJUykKKyAgICB9CisgIH0gCisgIAorICBfX0hBTF9VTkxPQ0soaHBjZCk7ICAgCisgIHJldHVybiByZXQ7Cit9CisKKworLyoqCisgICogQGJyaWVmICBEZWFjdGl2YXRlIGFuIGVuZHBvaW50CisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcGFyYW0gIGVwX2FkZHIgZW5kcG9pbnQgYWRkcmVzcworICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9DbG9zZShQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyKQoreyAgCisgIFBDRF9FUFR5cGVEZWYgKmVwOworICAKKyAgaWYgKChlcF9hZGRyICYgMHg4MFUpID09IDB4ODBVKQorICB7CisgICAgZXAgPSAmaHBjZC0+SU5fZXBbZXBfYWRkciAmIDB4N0ZdOworICB9CisgIGVsc2UKKyAgeworICAgIGVwID0gJmhwY2QtPk9VVF9lcFtlcF9hZGRyICYgMHg3Rl07CisgIH0KKyAgZXAtPm51bSAgID0gZXBfYWRkciAmIDB4N0ZVOworICAKKyAgZXAtPmlzX2luID0gKDB4ODBVICYgZXBfYWRkcikgIT0gMFU7CisgIAorICBfX0hBTF9MT0NLKGhwY2QpOyAKKworICBpZiAoZXAtPmRvdWJsZWJ1ZmZlciA9PSAwVSkgCisgIHsKKyAgICBpZiAoZXAtPmlzX2luKQorICAgIHsKKyAgICAgIFBDRF9DTEVBUl9UWF9EVE9HKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtKQorICAgICAgLyogQ29uZmlndXJlIERJU0FCTEUgc3RhdHVzIGZvciB0aGUgRW5kcG9pbnQqLworICAgICAgUENEX1NFVF9FUF9UWF9TVEFUVVMoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0sIFVTQl9FUF9UWF9ESVMpIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgUENEX0NMRUFSX1JYX0RUT0coaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pCisgICAgICAvKiBDb25maWd1cmUgRElTQUJMRSBzdGF0dXMgZm9yIHRoZSBFbmRwb2ludCovCisgICAgICBQQ0RfU0VUX0VQX1JYX1NUQVRVUyhocGNkLT5JbnN0YW5jZSwgZXAtPm51bSwgVVNCX0VQX1JYX0RJUykKKyAgICB9CisgIH0KKyAgLypEb3VibGUgQnVmZmVyKi8KKyAgZWxzZQorICB7IAorICAgIGlmIChlcC0+aXNfaW49PTBVKQorICAgIHsKKyAgICAgIC8qIENsZWFyIHRoZSBkYXRhIHRvZ2dsZSBiaXRzIGZvciB0aGUgZW5kcG9pbnQgSU4vT1VUKi8KKyAgICAgIFBDRF9DTEVBUl9SWF9EVE9HKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtKQorICAgICAgUENEX0NMRUFSX1RYX0RUT0coaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pCisgICAgICAKKyAgICAgIC8qIFJlc2V0IHZhbHVlIG9mIHRoZSBkYXRhIHRvZ2dsZSBiaXRzIGZvciB0aGUgZW5kcG9pbnQgb3V0Ki8KKyAgICAgIFBDRF9UWF9EVE9HKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtKTsKKyAgICAgIAorICAgICAgUENEX1NFVF9FUF9SWF9TVEFUVVMoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0sIFVTQl9FUF9SWF9ESVMpCisgICAgICBQQ0RfU0VUX0VQX1RYX1NUQVRVUyhocGNkLT5JbnN0YW5jZSwgZXAtPm51bSwgVVNCX0VQX1RYX0RJUykKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIENsZWFyIHRoZSBkYXRhIHRvZ2dsZSBiaXRzIGZvciB0aGUgZW5kcG9pbnQgSU4vT1VUKi8KKyAgICAgIFBDRF9DTEVBUl9SWF9EVE9HKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtKQorICAgICAgUENEX0NMRUFSX1RYX0RUT0coaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pCisgICAgICBQQ0RfUlhfRFRPRyhocGNkLT5JbnN0YW5jZSwgZXAtPm51bSk7CisgICAgICAvKiBDb25maWd1cmUgRElTQUJMRSBzdGF0dXMgZm9yIHRoZSBFbmRwb2ludCovCisgICAgICBQQ0RfU0VUX0VQX1RYX1NUQVRVUyhocGNkLT5JbnN0YW5jZSwgZXAtPm51bSwgVVNCX0VQX1RYX0RJUykKKyAgICAgIFBDRF9TRVRfRVBfUlhfU1RBVFVTKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCBVU0JfRVBfUlhfRElTKQorICAgIH0KKyAgfSAKKyAgCisgIF9fSEFMX1VOTE9DSyhocGNkKTsgICAKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgIAorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHBhcmFtICBlcF9hZGRyIGVuZHBvaW50IGFkZHJlc3MKKyAgKiBAcGFyYW0gIHBCdWYgcG9pbnRlciB0byB0aGUgcmVjZXB0aW9uIGJ1ZmZlciAgIAorICAqIEBwYXJhbSAgbGVuIGFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0VQX1JlY2VpdmUoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBfYWRkciwgdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbGVuKQoreworICAKKyBQQ0RfRVBUeXBlRGVmICplcDsKKyAgCisgIGVwID0gJmhwY2QtPk9VVF9lcFtlcF9hZGRyICYgMHg3Rl07CisgIAorICAvKnNldHVwIGFuZCBzdGFydCB0aGUgWGZlciAqLworICBlcC0+eGZlcl9idWZmID0gcEJ1ZjsgIAorICBlcC0+eGZlcl9sZW4gPSBsZW47CisgIGVwLT54ZmVyX2NvdW50ID0gMFU7CisgIGVwLT5pc19pbiA9IDBVOworICBlcC0+bnVtID0gZXBfYWRkciAmIDB4N0ZVOworCisgIC8qIE11bHRpIHBhY2tldCB0cmFuc2ZlciovCisgIGlmIChlcC0+eGZlcl9sZW4gPiBlcC0+bWF4cGFja2V0KQorICB7CisgICAgbGVuPWVwLT5tYXhwYWNrZXQ7CisgICAgZXAtPnhmZXJfbGVuLT1sZW47IAorICB9CisgIGVsc2UKKyAgeworICAgIGxlbj1lcC0+eGZlcl9sZW47CisgICAgZXAtPnhmZXJfbGVuID0wVTsKKyAgfQorICAKKyAgLyogY29uZmlndXJlIGFuZCB2YWxpZGF0ZSBSeCBlbmRwb2ludCAqLworICBpZiAoZXAtPmRvdWJsZWJ1ZmZlciA9PSAwVSkgCisgIHsKKyAgICAvKlNldCBSWCBidWZmZXIgY291bnQqLworICAgIFBDRF9TRVRfRVBfUlhfQ05UKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCBsZW4pCisgIH0KKyAgZWxzZQorICB7CisgICAgLypTZXQgdGhlIERvdWJsZSBidWZmZXIgY291bnRlciovCisgICAgUENEX1NFVF9FUF9EQlVGMV9DTlQoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0sIGVwLT5pc19pbiwgbGVuKQorICB9IAorICAKKyAgUENEX1NFVF9FUF9SWF9TVEFUVVMoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0sIFVTQl9FUF9SWF9WQUxJRCkKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBSZWNlaXZlZCBEYXRhIFNpemUKKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEBwYXJhbSAgZXBfYWRkciBlbmRwb2ludCBhZGRyZXNzCisgICogQHJldHZhbCBEYXRhIFNpemUKKyAgKi8KK3VpbnQxNl90IEhBTF9QQ0RfRVBfR2V0UnhDb3VudChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyKQoreworICByZXR1cm4gaHBjZC0+T1VUX2VwW2VwX2FkZHIgJiAweDdGXS54ZmVyX2NvdW50OworfQorLyoqCisgICogQGJyaWVmICBTZW5kIGFuIGFtb3VudCBvZiBkYXRhICAKKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEBwYXJhbSAgZXBfYWRkciBlbmRwb2ludCBhZGRyZXNzCisgICogQHBhcmFtICBwQnVmIHBvaW50ZXIgdG8gdGhlIHRyYW5zbWlzc2lvbiBidWZmZXIgICAKKyAgKiBAcGFyYW0gIGxlbiBhbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0VQX1RyYW5zbWl0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwX2FkZHIsIHVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IGxlbikKK3sKKyAgUENEX0VQVHlwZURlZiAqZXA7CisgIHVpbnQxNl90IHBtYWJ1ZmZlciA9IDBVOworICAgIAorICBlcCA9ICZocGNkLT5JTl9lcFtlcF9hZGRyICYgMHg3Rl07CisgIAorICAvKnNldHVwIGFuZCBzdGFydCB0aGUgWGZlciAqLworICBlcC0+eGZlcl9idWZmID0gcEJ1ZjsgIAorICBlcC0+eGZlcl9sZW4gPSBsZW47CisgIGVwLT54ZmVyX2NvdW50ID0gMFU7CisgIGVwLT5pc19pbiA9IDFVOworICBlcC0+bnVtID0gZXBfYWRkciAmIDB4N0ZVOworCisgIC8qTXVsdGkgcGFja2V0IHRyYW5zZmVyKi8KKyAgaWYgKGVwLT54ZmVyX2xlbiA+IGVwLT5tYXhwYWNrZXQpCisgIHsKKyAgICBsZW49ZXAtPm1heHBhY2tldDsKKyAgICBlcC0+eGZlcl9sZW4tPWxlbjsgCisgIH0KKyAgZWxzZQorICB7ICAKKyAgICBsZW49ZXAtPnhmZXJfbGVuOworICAgIGVwLT54ZmVyX2xlbiA9MFU7CisgIH0KKyAgCisgIC8qIGNvbmZpZ3VyZSBhbmQgdmFsaWRhdGUgVHggZW5kcG9pbnQgKi8KKyAgaWYgKGVwLT5kb3VibGVidWZmZXIgPT0gMFUpIAorICB7CisgICAgUENEX1dyaXRlUE1BKGhwY2QtPkluc3RhbmNlLCBlcC0+eGZlcl9idWZmLCBlcC0+cG1hYWRyZXNzLCBsZW4pOworICAgIFBDRF9TRVRfRVBfVFhfQ05UKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCBsZW4pOworICB9CisgIGVsc2UKKyAgeworICAgIC8qV3JpdGUgdGhlIGRhdGEgdG8gdGhlIFVTQiBlbmRwb2ludCovCisgICAgaWYgKChQQ0RfR0VUX0VORFBPSU5UKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtKSYgVVNCX0VQX0RUT0dfVFgpID09IFVTQl9FUF9EVE9HX1RYKQorICAgIHsKKyAgICAgIHBtYWJ1ZmZlciA9IGVwLT5wbWFhZGRyMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHBtYWJ1ZmZlciA9IGVwLT5wbWFhZGRyMDsKKyAgICB9CisgICAgUENEX1dyaXRlUE1BKGhwY2QtPkluc3RhbmNlLCBlcC0+eGZlcl9idWZmLCBwbWFidWZmZXIsIGxlbik7CisgICAgUENEX0ZyZWVVc2VyQnVmZmVyKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCBlcC0+aXNfaW4pCisgIH0KKworICBQQ0RfU0VUX0VQX1RYX1NUQVRVUyhocGNkLT5JbnN0YW5jZSwgZXAtPm51bSwgVVNCX0VQX1RYX1ZBTElEKQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGEgU1RBTEwgY29uZGl0aW9uIG92ZXIgYW4gZW5kcG9pbnQKKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEBwYXJhbSAgZXBfYWRkciBlbmRwb2ludCBhZGRyZXNzCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0VQX1NldFN0YWxsKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwX2FkZHIpCit7CisgIFBDRF9FUFR5cGVEZWYgKmVwOworICAgCisgIF9fSEFMX0xPQ0soaHBjZCk7IAorICAgCisgIGlmICgoMHg4MFUgJiBlcF9hZGRyKSA9PSAweDgwVSkKKyAgeworICAgIGVwID0gJmhwY2QtPklOX2VwW2VwX2FkZHIgJiAweDdGXTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBlcCA9ICZocGNkLT5PVVRfZXBbZXBfYWRkcl07CisgIH0KKyAgCisgIGVwLT5pc19zdGFsbCA9IDFVOworICBlcC0+bnVtICAgPSBlcF9hZGRyICYgMHg3RlU7CisgIGVwLT5pc19pbiA9ICgoZXBfYWRkciAmIDB4ODBVKSA9PSAweDgwVSk7CisgIAorICBpZiAoZXAtPm51bSA9PSAwVSkKKyAgeworICAgIC8qIFRoaXMgbWFjcm8gc2V0cyBTVEFMTCBzdGF0dXMgZm9yIFJYICYgVFgqLyAKKyAgICBQQ0RfU0VUX0VQX1RYUlhfU1RBVFVTKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCBVU0JfRVBfUlhfU1RBTEwsIFVTQl9FUF9UWF9TVEFMTCkgCisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKGVwLT5pc19pbikKKyAgICB7CisgICAgICBQQ0RfU0VUX0VQX1RYX1NUQVRVUyhocGNkLT5JbnN0YW5jZSwgZXAtPm51bSAsIFVTQl9FUF9UWF9TVEFMTCkgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBQQ0RfU0VUX0VQX1JYX1NUQVRVUyhocGNkLT5JbnN0YW5jZSwgZXAtPm51bSAsIFVTQl9FUF9SWF9TVEFMTCkKKyAgICB9CisgIH0KKyAgX19IQUxfVU5MT0NLKGhwY2QpOyAKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgYSBTVEFMTCBjb25kaXRpb24gb3ZlciBpbiBhbiBlbmRwb2ludAorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHBhcmFtICBlcF9hZGRyIGVuZHBvaW50IGFkZHJlc3MKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRVBfQ2xyU3RhbGwoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBfYWRkcikKK3sKKyAgUENEX0VQVHlwZURlZiAqZXA7CisgIAorICBpZiAoKDB4ODBVICYgZXBfYWRkcikgPT0gMHg4MFUpCisgIHsKKyAgICBlcCA9ICZocGNkLT5JTl9lcFtlcF9hZGRyICYgMHg3Rl07CisgIH0KKyAgZWxzZQorICB7CisgICAgZXAgPSAmaHBjZC0+T1VUX2VwW2VwX2FkZHJdOworICB9CisgIAorICBlcC0+aXNfc3RhbGwgPSAwVTsKKyAgZXAtPm51bSAgID0gZXBfYWRkciAmIDB4N0ZVOworICBlcC0+aXNfaW4gPSAoKGVwX2FkZHIgJiAweDgwVSkgPT0gMHg4MFUpOworICAKKyAgX19IQUxfTE9DSyhocGNkKTsgCisgIAorICBpZiAoZXAtPmlzX2luKQorICB7CisgICAgUENEX0NMRUFSX1RYX0RUT0coaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pCisgICAgUENEX1NFVF9FUF9UWF9TVEFUVVMoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0sIFVTQl9FUF9UWF9WQUxJRCkKKyAgfQorICBlbHNlCisgIHsKKyAgICBQQ0RfQ0xFQVJfUlhfRFRPRyhocGNkLT5JbnN0YW5jZSwgZXAtPm51bSkKKyAgICBQQ0RfU0VUX0VQX1JYX1NUQVRVUyhocGNkLT5JbnN0YW5jZSwgZXAtPm51bSwgVVNCX0VQX1JYX1ZBTElEKQorICB9CisgIF9fSEFMX1VOTE9DSyhocGNkKTsgCisgICAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRmx1c2ggYW4gZW5kcG9pbnQKKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEBwYXJhbSAgZXBfYWRkciBlbmRwb2ludCBhZGRyZXNzCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0VQX0ZsdXNoKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwX2FkZHIpCit7IAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhBTF9QQ0RfQWN0aXZhdGVSZW1vdGVXYWtldXAgOiBhY3RpdmUgcmVtb3RlIHdha2V1cCBzaWduYWxsaW5nCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfQWN0aXZhdGVSZW1vdGVXYWtldXAoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpCit7CisgIGhwY2QtPkluc3RhbmNlLT5DTlRSIHw9IFVTQl9DTlRSX1JFU1VNRTsKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBIQUxfUENEX0RlQWN0aXZhdGVSZW1vdGVXYWtldXAgOiBkZS1hY3RpdmUgcmVtb3RlIHdha2V1cCBzaWduYWxsaW5nCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRGVBY3RpdmF0ZVJlbW90ZVdha2V1cChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkKK3sKKyAgaHBjZC0+SW5zdGFuY2UtPkNOVFIgJj1+KCh1aW50MzJfdClVU0JfQ05UUl9SRVNVTUUpOworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworICAKKy8qKiBAZGVmZ3JvdXAgUENEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgCisgKiAgQGJyaWVmICAgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgCisgKgorQHZlcmJhdGltICAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwZXJtaXRzIHRvIGdldCBpbiBydW4tdGltZSB0aGUgc3RhdHVzIG9mIHRoZSBwZXJpcGhlcmFsIAorICAgIGFuZCB0aGUgZGF0YSBmbG93LgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgUENEIHN0YXRlCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLworUENEX1N0YXRlVHlwZURlZiBIQUxfUENEX0dldFN0YXRlKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICByZXR1cm4gaHBjZC0+U3RhdGU7Cit9CisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeDggICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzNzN4QyAgICAgICAgICAgICAgICAgICAqLworCisjZW5kaWYgLyogSEFMX1BDRF9NT0RVTEVfRU5BQkxFRCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjN4eF9oYWxfcGNkX2V4LmMgYi9TcmMvc3RtMzJmM3h4X2hhbF9wY2RfZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmJlZmJmCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZjN4eF9oYWxfcGNkX2V4LmMKQEAgLTAsMCArMSwzMjcgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX3BjZF9leC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBFeHRlbmRlZCBQQ0QgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZyAKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFVTQiBQZXJpcGhlcmFsIENvbnRyb2xsZXI6CisgICogICAgICAgICAgICsgQ29uZmlndXJhdGlvbiBvZiB0aGUgUE1BIGZvciBFUAorICAqICAgICAgICAgCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWwuaCIKKworI2lmZGVmIEhBTF9QQ0RfTU9EVUxFX0VOQUJMRUQKKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4OCkgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzczeEMpCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUENERXggUENERXgKKyAgKiBAYnJpZWYgUENEIEV4dGVuZGVkIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBQQ0RFeF9FeHBvcnRlZF9GdW5jdGlvbnMgUENERXggRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBQQ0RFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgUENERXggY29udHJvbCBmdW5jdGlvbnMgCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIFVwZGF0ZSBQTUEgY29uZmlndXJhdGlvbgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgQ29uZmlndXJlIFBNQSBmb3IgRVAKKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEBwYXJhbSAgZXBfYWRkciBlbmRwb2ludCBhZGRyZXNzCisgICogQHBhcmFtICBlcF9raW5kIGVuZHBvaW50IEtpbmQKKyAgKiAgICAgICAgICAgICAgICBAYXJnIFVTQl9TTkdfQlVGOiBTaW5nbGUgQnVmZmVyIHVzZWQKKyAgKiAgICAgICAgICAgICAgICBAYXJnIFVTQl9EQkxfQlVGOiBEb3VibGUgQnVmZmVyIHVzZWQKKyAgKiBAcGFyYW0gIHBtYWFkcmVzcyBFUCBhZGRyZXNzIGluIFRoZSBQTUE6IEluIGNhc2Ugb2Ygc2luZ2xlIGJ1ZmZlciBlbmRwb2ludAorICAqICAgICAgICAgICAgICAgICAgIHRoaXMgcGFyYW1ldGVyIGlzIDE2LWJpdCB2YWx1ZSBwcm92aWRpbmcgdGhlIGFkZHJlc3MKKyAgKiAgICAgICAgICAgICAgICAgICBpbiBQTUEgYWxsb2NhdGVkIHRvIGVuZHBvaW50LgorICAqICAgICAgICAgICAgICAgICAgIEluIGNhc2Ugb2YgZG91YmxlIGJ1ZmZlciBlbmRwb2ludCB0aGlzIHBhcmFtZXRlcgorICAqICAgICAgICAgICAgICAgICAgIGlzIGEgMzItYml0IHZhbHVlIHByb3ZpZGluZyB0aGUgZW5kcG9pbnQgYnVmZmVyIDAgYWRkcmVzcworICAqICAgICAgICAgICAgICAgICAgIGluIHRoZSBMU0IgcGFydCBvZiAzMi1iaXQgdmFsdWUgYW5kIGVuZHBvaW50IGJ1ZmZlciAxIGFkZHJlc3MKKyAgKiAgICAgICAgICAgICAgICAgICBpbiB0aGUgTVNCIHBhcnQgb2YgMzItYml0IHZhbHVlLgorICAqIEByZXR2YWwgOiBzdGF0dXMKKyAgKi8KKworSEFMX1N0YXR1c1R5cGVEZWYgIEhBTF9QQ0RFeF9QTUFDb25maWcoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZXBfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGVwX2tpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwbWFhZHJlc3MpCisKK3sKKyAgUENEX0VQVHlwZURlZiAqZXA7CisgIAorICAvKiBpbml0aWFsaXplIGVwIHN0cnVjdHVyZSovCisgIGlmICgoMHg4MFUgJiBlcF9hZGRyKSA9PSAweDgwVSkKKyAgeworICAgIGVwID0gJmhwY2QtPklOX2VwW2VwX2FkZHIgJiAweDdGVV07CisgIH0KKyAgZWxzZQorICB7CisgICAgZXAgPSAmaHBjZC0+T1VUX2VwW2VwX2FkZHJdOworICB9CisgIAorICAvKiBIZXJlIHdlIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBpcyBzaW5nbGUgb3IgZG91YmxlIEJ1ZmZlciovCisgIGlmIChlcF9raW5kID09IFBDRF9TTkdfQlVGKQorICB7CisgICAgLypTaW5nbGUgQnVmZmVyKi8KKyAgICBlcC0+ZG91YmxlYnVmZmVyID0gMFU7CisgICAgLypDb25maWd1cmUgdGhlIFBNQSovCisgICAgZXAtPnBtYWFkcmVzcyA9ICh1aW50MTZfdClwbWFhZHJlc3M7CisgIH0KKyAgZWxzZSAvKlVTQl9EQkxfQlVGKi8KKyAgeworICAgIC8qRG91YmxlIEJ1ZmZlciBFbmRwb2ludCovCisgICAgZXAtPmRvdWJsZWJ1ZmZlciA9IDE7CisgICAgLypDb25maWd1cmUgdGhlIFBNQSovCisgICAgZXAtPnBtYWFkZHIwID0gIHBtYWFkcmVzcyAmIDB4RkZGRlU7CisgICAgZXAtPnBtYWFkZHIxID0gIChwbWFhZHJlc3MgJiAweEZGRkYwMDAwVSkgPj4gMTZVOworICB9CisgIAorICByZXR1cm4gSEFMX09LOyAKK30KKy8qKgorICAqIEB9CisgICovIAorCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqIEBkZWZncm91cCBQQ0RFeF9Qcml2YXRlX0Z1bmN0aW9ucyBQQ0QgRXh0ZW5kZWQgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEMpICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKQorICAgICAKKy8qKgorICAqIEBicmllZiBDb3B5IGEgYnVmZmVyIGZyb20gdXNlciBtZW1vcnkgYXJlYSB0byBwYWNrZXQgbWVtb3J5IGFyZWEgKFBNQSkKKyAgKiBAcGFyYW0gICBVU0J4OiBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgIHBiVXNyQnVmOiBwb2ludGVyIHRvIHVzZXIgbWVtb3J5IGFyZWEuCisgICogQHBhcmFtICAgd1BNQUJ1ZkFkZHI6IGFkZHJlc3MgaW50byBQTUEuCisgICogQHBhcmFtICAgd05CeXRlczogbm8uIG9mIGJ5dGVzIHRvIGJlIGNvcGllZC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgUENEX1dyaXRlUE1BKFVTQl9UeXBlRGVmICAqVVNCeCwgdWludDhfdCAqcGJVc3JCdWYsIHVpbnQxNl90IHdQTUFCdWZBZGRyLCB1aW50MTZfdCB3TkJ5dGVzKQoreworICB1aW50MzJfdCBuID0gICgodWludDMyX3QpKCh1aW50MzJfdCl3TkJ5dGVzICsgMVUpKSA+PiAxVTsKKyAgCisgIHVpbnQzMl90IGksIHRlbXAxLCB0ZW1wMjsKKyAgdWludDE2X3QgKnBkd1ZhbDsKKyAgcGR3VmFsID0gKHVpbnQxNl90ICopKCh1aW50MzJfdCkod1BNQUJ1ZkFkZHIgKiAyICsgKHVpbnQzMl90KVVTQnggKyAweDQwMFUpKTsKKyAgCisgIGZvciAoaSA9IG47IGkgIT0gMDsgaS0tKQorICB7CisgICAgdGVtcDEgPSAodWludDE2X3QpICogcGJVc3JCdWY7CisgICAgcGJVc3JCdWYrKzsKKyAgICB0ZW1wMiA9IHRlbXAxIHwgKCh1aW50MTZfdCkoKHVpbnQxNl90KSAgKiBwYlVzckJ1ZiA8PCA4VSkpIDsKKyAgICAqcGR3VmFsKysgPSB0ZW1wMjsKKyAgICBwZHdWYWwrKzsKKyAgICBwYlVzckJ1ZisrOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBDb3B5IGEgYnVmZmVyIGZyb20gdXNlciBtZW1vcnkgYXJlYSB0byBwYWNrZXQgbWVtb3J5IGFyZWEgKFBNQSkKKyAgKiBAcGFyYW0gICBVU0J4OiBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgIHBiVXNyQnVmOiBwb2ludGVyIHRvIHVzZXIgbWVtb3J5IGFyZWEuCisgICogQHBhcmFtICAgd1BNQUJ1ZkFkZHI6IGFkZHJlc3MgaW50byBQTUEuCisgICogQHBhcmFtICAgd05CeXRlczogbm8uIG9mIGJ5dGVzIHRvIGJlIGNvcGllZC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgUENEX1JlYWRQTUEoVVNCX1R5cGVEZWYgICpVU0J4LCB1aW50OF90ICpwYlVzckJ1ZiwgdWludDE2X3Qgd1BNQUJ1ZkFkZHIsIHVpbnQxNl90IHdOQnl0ZXMpCit7CisgIHVpbnQzMl90IG4gPSAodWludDMyX3Qpd05CeXRlcyA+PiAxVTsKKyAgdWludDMyX3QgaTsKKyAgdWludDE2X3QgKnBkd1ZhbDsKKyAgdWludDMyX3QgdGVtcDsKKyAgcGR3VmFsID0gKHVpbnQxNl90ICopKCh1aW50MzJfdCkod1BNQUJ1ZkFkZHIgKiAyICsgKHVpbnQzMl90KVVTQnggKyAweDQwMFUpKTsKKyAgCisgIGZvciAoaSA9IG47IGkgIT0gMFU7IGktLSkKKyAgeworICAgIHRlbXAgPSAqcGR3VmFsKys7CisgICAgKnBiVXNyQnVmKysgPSAoKHRlbXAgPj4gMCkgJiAweEZGKTsKKyAgICAqcGJVc3JCdWYrKyA9ICgodGVtcCA+PiA4KSAmIDB4RkYpOworICAgIHBkd1ZhbCsrOworICB9CisKKyAgaWYgKHdOQnl0ZXMgJSAyKQorICB7CisgICAgdGVtcCA9ICpwZHdWYWwrKzsKKyAgICAqcGJVc3JCdWYrKyA9ICgodGVtcCA+PiAwKSAmIDB4RkYpOworICB9Cit9CisjZW5kaWYgLyogU1RNMzJGMzAzeEMgICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4ICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMng4KSAKKy8qKgorICAqIEBicmllZiBDb3B5IGEgYnVmZmVyIGZyb20gdXNlciBtZW1vcnkgYXJlYSB0byBwYWNrZXQgbWVtb3J5IGFyZWEgKFBNQSkKKyAgKiBAcGFyYW0gICBVU0J4OiBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgIHBiVXNyQnVmOiBwb2ludGVyIHRvIHVzZXIgbWVtb3J5IGFyZWEuCisgICogQHBhcmFtICAgd1BNQUJ1ZkFkZHI6IGFkZHJlc3MgaW50byBQTUEuCisgICogQHBhcmFtICAgd05CeXRlczogbm8uIG9mIGJ5dGVzIHRvIGJlIGNvcGllZC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgUENEX1dyaXRlUE1BKFVTQl9UeXBlRGVmICAqVVNCeCwgdWludDhfdCAqcGJVc3JCdWYsIHVpbnQxNl90IHdQTUFCdWZBZGRyLCB1aW50MTZfdCB3TkJ5dGVzKQoreworICB1aW50MzJfdCBuID0gICgodWludDMyX3QpKCh1aW50MzJfdCl3TkJ5dGVzICsgMVUpKSA+PiAxVTsKKyAgdWludDMyX3QgaTsKKyAgdWludDE2X3QgdGVtcDEsIHRlbXAyOworICB1aW50MTZfdCAqcGR3VmFsOworICBwZHdWYWwgPSAodWludDE2X3QgKikoKHVpbnQzMl90KSh3UE1BQnVmQWRkciArICh1aW50MzJfdClVU0J4ICsgMHg0MDBVKSk7ICAKKyAgZm9yIChpID0gbjsgaSAhPSAwVTsgaS0tKQorICB7CisgICAgdGVtcDEgPSAodWludDE2X3QpICogcGJVc3JCdWY7CisgICAgcGJVc3JCdWYrKzsKKyAgICB0ZW1wMiA9IHRlbXAxIHwgKCh1aW50MTZfdCkoKHVpbnQxNl90KSAgKiBwYlVzckJ1ZiA8PCA4VSkpIDsKKyAgICAqcGR3VmFsKysgPSB0ZW1wMjsKKyAgICBwYlVzckJ1ZisrOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBDb3B5IGEgYnVmZmVyIGZyb20gdXNlciBtZW1vcnkgYXJlYSB0byBwYWNrZXQgbWVtb3J5IGFyZWEgKFBNQSkKKyAgKiBAcGFyYW0gICBVU0J4OiBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgIHBiVXNyQnVmOiBwb2ludGVyIHRvIHVzZXIgbWVtb3J5IGFyZWEuCisgICogQHBhcmFtICAgd1BNQUJ1ZkFkZHI6IGFkZHJlc3MgaW50byBQTUEuCisgICogQHBhcmFtICAgd05CeXRlczogbm8uIG9mIGJ5dGVzIHRvIGJlIGNvcGllZC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgUENEX1JlYWRQTUEoVVNCX1R5cGVEZWYgICpVU0J4LCB1aW50OF90ICpwYlVzckJ1ZiwgdWludDE2X3Qgd1BNQUJ1ZkFkZHIsIHVpbnQxNl90IHdOQnl0ZXMpCit7CisgIHVpbnQzMl90IG4gPSAodWludDMyX3Qpd05CeXRlcyA+PiAxVTsKKyAgdWludDMyX3QgaTsKKyAgdWludDE2X3QgKnBkd1ZhbDsKKyAgdWludDMyX3QgdGVtcDsKKyAgcGR3VmFsID0gKHVpbnQxNl90ICopKCh1aW50MzJfdCkod1BNQUJ1ZkFkZHIgKyAodWludDMyX3QpVVNCeCArIDB4NDAwVSkpOworCisgIGZvciAoaSA9IG47IGkgIT0gMFU7IGktLSkKKyAgeworICAgIHRlbXAgPSAqcGR3VmFsKys7CisgICAgKnBiVXNyQnVmKysgPSAoKHRlbXAgPj4gMCkgJiAweEZGKTsKKyAgICAqcGJVc3JCdWYrKyA9ICgodGVtcCA+PiA4KSAmIDB4RkYpOworICB9CisKKyAgaWYgKHdOQnl0ZXMgJSAyKQorICB7CisgICAgdGVtcCA9ICpwZHdWYWwrKzsKKyAgICAqcGJVc3JCdWYrKyA9ICgodGVtcCA+PiAwKSAmIDB4RkYpOworICB9Cit9CisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyAgICAgICAgICAgICAgICB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMng4ICAgICAgICAgICAgICAgICAgICovCisKKy8qKgorICAqIEB9CisgICovIAorCisvKiogQGFkZHRvZ3JvdXAgUENERXhfRXhwb3J0ZWRfRnVuY3Rpb25zIFBDREV4IEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBQQ0RFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIEV4dGVuZGVkIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgU29mdHdhcmUgRGV2aWNlIENvbm5lY3Rpb24KKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEBwYXJhbSAgc3RhdGUgRGV2aWNlIHN0YXRlCisgICogQHJldHZhbCBOb25lCisgICovCisgX193ZWFrIHZvaWQgSEFMX1BDREV4X1NldENvbm5lY3Rpb25TdGF0ZShQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBzdGF0ZSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHBjZCk7CisgIFVOVVNFRChzdGF0ZSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9QQ0RFeF9TZXRDb25uZWN0aW9uU3RhdGUgY291bGQgYmUgaW1wbGVuZXRkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovIAorfQorLyoqCisgICogQH0KKyAgKi8gCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeDggICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzNzN4QyAgICAgICAgICAgICAgICAgICAqLworCisjZW5kaWYgLyogSEFMX1BDRF9NT0RVTEVfRU5BQkxFRCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjN4eF9oYWxfcHdyLmMgYi9TcmMvc3RtMzJmM3h4X2hhbF9wd3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWM0OWE3Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZjN4eF9oYWxfcHdyLmMKQEAgLTAsMCArMSw0NzcgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX3B3ci5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBQV1IgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgUG93ZXIgQ29udHJvbGxlciAoUFdSKSBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uL2RlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKgorICBAdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFBXUiBQV1IKKyAgKiBAYnJpZWYgUFdSIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9QV1JfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFBXUl9FeHBvcnRlZF9GdW5jdGlvbnMgUFdSIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAKKyAgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgIEFmdGVyIHJlc2V0LCB0aGUgYmFja3VwIGRvbWFpbiAoUlRDIHJlZ2lzdGVycywgUlRDIGJhY2t1cCBkYXRhCisgICAgICByZWdpc3RlcnMgYW5kIGJhY2t1cCBTUkFNKSBpcyBwcm90ZWN0ZWQgYWdhaW5zdCBwb3NzaWJsZSB1bndhbnRlZAorICAgICAgd3JpdGUgYWNjZXNzZXMuCisgICAgICBUbyBlbmFibGUgYWNjZXNzIHRvIHRoZSBSVEMgRG9tYWluIGFuZCBSVEMgcmVnaXN0ZXJzLCBwcm9jZWVkIGFzIGZvbGxvd3M6CisgICAgICAgICgrKSBFbmFibGUgdGhlIFBvd2VyIENvbnRyb2xsZXIgKFBXUikgQVBCMSBpbnRlcmZhY2UgY2xvY2sgdXNpbmcgdGhlCisgICAgICAgICAgICBfX0hBTF9SQ0NfUFdSX0NMS19FTkFCTEUoKSBtYWNyby4KKyAgICAgICAgKCspIEVuYWJsZSBhY2Nlc3MgdG8gUlRDIGRvbWFpbiB1c2luZyB0aGUgSEFMX1BXUl9FbmFibGVCa1VwQWNjZXNzKCkgZnVuY3Rpb24uCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBEZWluaXRpYWxpemVzIHRoZSBQV1IgcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JfRGVJbml0KHZvaWQpCit7CisgIF9fSEFMX1JDQ19QV1JfRk9SQ0VfUkVTRVQoKTsKKyAgX19IQUxfUkNDX1BXUl9SRUxFQVNFX1JFU0VUKCk7Cit9CisKKy8qKgorICAqIEBicmllZiBFbmFibGVzIGFjY2VzcyB0byB0aGUgYmFja3VwIGRvbWFpbiAoUlRDIHJlZ2lzdGVycywgUlRDCisgICogICAgICAgICBiYWNrdXAgZGF0YSByZWdpc3RlcnMgYW5kIGJhY2t1cCBTUkFNKS4KKyAgKiBAbm90ZSAgSWYgdGhlIEhTRSBkaXZpZGVkIGJ5IDMyIGlzIHVzZWQgYXMgdGhlIFJUQyBjbG9jaywgdGhlCisgICogICAgICAgICBCYWNrdXAgRG9tYWluIEFjY2VzcyBzaG91bGQgYmUga2VwdCBlbmFibGVkLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSX0VuYWJsZUJrVXBBY2Nlc3Modm9pZCkKK3sKKyAgU0VUX0JJVChQV1ItPkNSLCBQV1JfQ1JfREJQKTsgIAorfQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZXMgYWNjZXNzIHRvIHRoZSBiYWNrdXAgZG9tYWluIChSVEMgcmVnaXN0ZXJzLCBSVEMKKyAgKiAgICAgICAgIGJhY2t1cCBkYXRhIHJlZ2lzdGVycyBhbmQgYmFja3VwIFNSQU0pLgorICAqIEBub3RlICBJZiB0aGUgSFNFIGRpdmlkZWQgYnkgMzIgaXMgdXNlZCBhcyB0aGUgUlRDIGNsb2NrLCB0aGUKKyAgKiAgICAgICAgIEJhY2t1cCBEb21haW4gQWNjZXNzIHNob3VsZCBiZSBrZXB0IGVuYWJsZWQuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JfRGlzYWJsZUJrVXBBY2Nlc3Modm9pZCkKK3sKKyAgQ0xFQVJfQklUKFBXUi0+Q1IsIFBXUl9DUl9EQlApOyAgCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAKKyAgKiAgQGJyaWVmIExvdyBQb3dlciBtb2RlcyBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAKKyAgICAqKiogV2FrZVVwIHBpbiBjb25maWd1cmF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgKCspIFdha2VVcCBwaW4gaXMgdXNlZCB0byB3YWtldXAgdGhlIHN5c3RlbSBmcm9tIFN0YW5kYnkgbW9kZS4gVGhpcyBwaW4gaXMKKyAgICAgICAgICBmb3JjZWQgaW4gaW5wdXQgcHVsbCBkb3duIGNvbmZpZ3VyYXRpb24gYW5kIGlzIGFjdGl2ZSBvbiByaXNpbmcgZWRnZXMuCisgICAgICAoKykgVGhlcmUgYXJlIHVwIHRvIHRocmVlIFdha2VVcCBwaW5zOgorICAgICAgICAgICgrKylXYWtlVXAgUGluIDEgb24gUEEuMDAuCisgICAgICAgICAgKCsrKVdha2VVcCBQaW4gMiBvbiBQQy4xMyAoU1RNMzJGMzAzeEMsIFNUTTMyRjMwM3hFIG9ubHkpLgorICAgICAgICAgICgrKylXYWtlVXAgUGluIDMgb24gUEUuMDYuCisKKyAgICAqKiogTWFpbiBhbmQgQmFja3VwIFJlZ3VsYXRvcnMgY29uZmlndXJhdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAoKykgV2hlbiB0aGUgYmFja3VwIGRvbWFpbiBpcyBzdXBwbGllZCBieSBWREQgKGFuYWxvZyBzd2l0Y2ggY29ubmVjdGVkIHRvIFZERCkKKyAgICAgICAgICB0aGUgYmFja3VwIFNSQU0gaXMgcG93ZXJlZCBmcm9tIFZERCB3aGljaCByZXBsYWNlcyB0aGUgVkJBVCBwb3dlciBzdXBwbHkgdG8KKyAgICAgICAgICBzYXZlIGJhdHRlcnkgbGlmZS4KKworICAgICAgKCspIFRoZSBiYWNrdXAgU1JBTSBpcyBub3QgbWFzcyBlcmFzZWQgYnkgYSB0YW1wZXIgZXZlbnQuIEl0IGlzIHJlYWQKKyAgICAgICAgICBwcm90ZWN0ZWQgdG8gcHJldmVudCBjb25maWRlbnRpYWwgZGF0YSwgc3VjaCBhcyBjcnlwdG9ncmFwaGljIHByaXZhdGUKKyAgICAgICAgICBrZXksIGZyb20gYmVpbmcgYWNjZXNzZWQuIFRoZSBiYWNrdXAgU1JBTSBjYW4gYmUgZXJhc2VkIG9ubHkgdGhyb3VnaAorICAgICAgICAgIHRoZSBGbGFzaCBpbnRlcmZhY2Ugd2hlbiBhIHByb3RlY3Rpb24gbGV2ZWwgY2hhbmdlIGZyb20gbGV2ZWwgMSB0bworICAgICAgICAgIGxldmVsIDAgaXMgcmVxdWVzdGVkLgorICAgICAgLUAtIFJlZmVyIHRvIHRoZSBkZXNjcmlwdGlvbiBvZiBSZWFkIHByb3RlY3Rpb24gKFJEUCkgaW4gdGhlIEZsYXNoCisgICAgICAgICAgcHJvZ3JhbW1pbmcgbWFudWFsLgorCisgICAgICAgIFJlZmVyIHRvIHRoZSBkYXRhc2hlZXRzIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICAqKiogTG93IFBvd2VyIG1vZGVzIGNvbmZpZ3VyYXRpb24gKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgIFRoZSBkZXZpY2VzIGZlYXR1cmUgMyBsb3ctcG93ZXIgbW9kZXM6CisgICAgICAoKykgU2xlZXAgbW9kZTogQ29ydGV4LU00IGNvcmUgc3RvcHBlZCwgcGVyaXBoZXJhbHMga2VwdCBydW5uaW5nLgorICAgICAgKCspIFN0b3AgbW9kZTogYWxsIGNsb2NrcyBhcmUgc3RvcHBlZCwgcmVndWxhdG9yIHJ1bm5pbmcsIHJlZ3VsYXRvcgorICAgICAgICAgIGluIGxvdyBwb3dlciBtb2RlCisgICAgICAoKykgU3RhbmRieSBtb2RlOiAxLjJWIGRvbWFpbiBwb3dlcmVkIG9mZiAobW9kZSBub3QgYXZhaWxhYmxlIG9uIFNUTTMyRjN4OCBkZXZpY2VzKS4KKworICAgKioqIFNsZWVwIG1vZGUgKioqCisgICA9PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAoKykgRW50cnk6CisgICAgICAgICAgVGhlIFNsZWVwIG1vZGUgaXMgZW50ZXJlZCBieSB1c2luZyB0aGUgSEFMX1BXUl9FbnRlclNMRUVQTW9kZShQV1JfTUFJTlJFR1VMQVRPUl9PTiwgUFdSX1NMRUVQRU5UUllfV0Z4KQorICAgICAgICAgICAgICBmdW5jdGlvbnMgd2l0aAorICAgICAgICAgICgrKykgUFdSX1NMRUVQRU5UUllfV0ZJOiBlbnRlciBTTEVFUCBtb2RlIHdpdGggV0ZJIGluc3RydWN0aW9uCisgICAgICAgICAgKCsrKSBQV1JfU0xFRVBFTlRSWV9XRkU6IGVudGVyIFNMRUVQIG1vZGUgd2l0aCBXRkUgaW5zdHJ1Y3Rpb24KKyAgICAgCisgICAgICAoKykgRXhpdDoKKyAgICAgICAgKCsrKSBBbnkgcGVyaXBoZXJhbCBpbnRlcnJ1cHQgYWNrbm93bGVkZ2VkIGJ5IHRoZSBuZXN0ZWQgdmVjdG9yZWQgaW50ZXJydXB0CisgICAgICAgICAgICAgIGNvbnRyb2xsZXIgKE5WSUMpIGNhbiB3YWtlIHVwIHRoZSBkZXZpY2UgZnJvbSBTbGVlcCBtb2RlLgorCisgICAqKiogU3RvcCBtb2RlICoqKgorICAgPT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICBJbiBTdG9wIG1vZGUsIGFsbCBjbG9ja3MgaW4gdGhlIDEuOFYgZG9tYWluIGFyZSBzdG9wcGVkLCB0aGUgUExMLCB0aGUgSFNJLAorICAgICAgYW5kIHRoZSBIU0UgUkMgb3NjaWxsYXRvcnMgYXJlIGRpc2FibGVkLiBJbnRlcm5hbCBTUkFNIGFuZCByZWdpc3RlciBjb250ZW50cworICAgICAgYXJlIHByZXNlcnZlZC4KKyAgICAgIFRoZSB2b2x0YWdlIHJlZ3VsYXRvciBjYW4gYmUgY29uZmlndXJlZCBlaXRoZXIgaW4gbm9ybWFsIG9yIGxvdy1wb3dlciBtb2RlIHRvIG1pbmltaXplIHRoZSBjb25zdW1wdGlvbi4KKworICAgICAgKCspIEVudHJ5OgorICAgICAgICAgIFRoZSBTdG9wIG1vZGUgaXMgZW50ZXJlZCB1c2luZyB0aGUgSEFMX1BXUl9FbnRlclNUT1BNb2RlKFBXUl9NQUlOUkVHVUxBVE9SX09OLCBQV1JfU1RPUEVOVFJZX1dGSSApCisgICAgICAgICAgICAgZnVuY3Rpb24gd2l0aDoKKyAgICAgICAgICAoKyspIE1haW4gcmVndWxhdG9yIE9OIG9yCisgICAgICAgICAgKCsrKSBMb3cgUG93ZXIgcmVndWxhdG9yIE9OLgorICAgICAgICAgICgrKykgUFdSX1NUT1BFTlRSWV9XRkk6IGVudGVyIFNUT1AgbW9kZSB3aXRoIFdGSSBpbnN0cnVjdGlvbiBvcgorICAgICAgICAgICgrKykgUFdSX1NUT1BFTlRSWV9XRkU6IGVudGVyIFNUT1AgbW9kZSB3aXRoIFdGRSBpbnN0cnVjdGlvbgorICAgICAgKCspIEV4aXQ6CisgICAgICAgICAgKCsrKSBBbnkgRVhUSSBMaW5lIChJbnRlcm5hbCBvciBFeHRlcm5hbCkgY29uZmlndXJlZCBpbiBJbnRlcnJ1cHQvRXZlbnQgbW9kZS4KKyAgICAgICAgICAoKyspIFNvbWUgc3BlY2lmaWMgY29tbXVuaWNhdGlvbiBwZXJpcGhlcmFscyAoQ0VDLCBVU0FSVCwgSTJDKSBpbnRlcnJ1cHRzLCAKKyAgICAgICAgICAgICAgIHdoZW4gcHJvZ3JhbW1lZCBpbiB3YWtldXAgbW9kZSAodGhlIHBlcmlwaGVyYWwgbXVzdCBiZSAKKyAgICAgICAgICAgICAgIHByb2dyYW1tZWQgaW4gd2FrZXVwIG1vZGUgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGludGVycnVwdCB2ZWN0b3IgCisgICAgICAgICAgICAgICBtdXN0IGJlIGVuYWJsZWQgaW4gdGhlIE5WSUMpLgorCisgICAqKiogU3RhbmRieSBtb2RlICoqKgorICAgPT09PT09PT09PT09PT09PT09PT0KKyAgICAgWy4uXQorICAgICAgVGhlIFN0YW5kYnkgbW9kZSBhbGxvd3MgdG8gYWNoaWV2ZSB0aGUgbG93ZXN0IHBvd2VyIGNvbnN1bXB0aW9uLiBJdCBpcyBiYXNlZAorICAgICAgb24gdGhlIENvcnRleC1NNCBkZWVwIHNsZWVwIG1vZGUsIHdpdGggdGhlIHZvbHRhZ2UgcmVndWxhdG9yIGRpc2FibGVkLgorICAgICAgVGhlIDEuOFYgZG9tYWluIGlzIGNvbnNlcXVlbnRseSBwb3dlcmVkIG9mZi4gVGhlIFBMTCwgdGhlIEhTSSBvc2NpbGxhdG9yIGFuZAorICAgICAgdGhlIEhTRSBvc2NpbGxhdG9yIGFyZSBhbHNvIHN3aXRjaGVkIG9mZi4gU1JBTSBhbmQgcmVnaXN0ZXIgY29udGVudHMgYXJlIGxvc3QKKyAgICAgIGV4Y2VwdCBmb3IgdGhlIFJUQyByZWdpc3RlcnMsIFJUQyBiYWNrdXAgcmVnaXN0ZXJzLCBiYWNrdXAgU1JBTSBhbmQgU3RhbmRieQorICAgICAgY2lyY3VpdHJ5LgorICAgICAgVGhlIHZvbHRhZ2UgcmVndWxhdG9yIGlzIE9GRi4KKworICAgICAgKCspIEVudHJ5OgorICAgICAgICAgICgrKykgVGhlIFN0YW5kYnkgbW9kZSBpcyBlbnRlcmVkIHVzaW5nIHRoZSBIQUxfUFdSX0VudGVyU1RBTkRCWU1vZGUoKSBmdW5jdGlvbi4KKyAgICAgICgrKSBFeGl0OgorICAgICAgICAgICgrKykgV0tVUCBwaW4gcmlzaW5nIGVkZ2UsIFJUQyBhbGFybSAoQWxhcm0gQSBhbmQgQWxhcm0gQiksIFJUQyB3YWtldXAsCisgICAgICAgICAgICAgICB0YW1wZXIgZXZlbnQsIHRpbWUtc3RhbXAgZXZlbnQsIGV4dGVybmFsIHJlc2V0IGluIE5SU1QgcGluLCBJV0RHIHJlc2V0LgorCisgICAqKiogQXV0by13YWtldXAgKEFXVSkgZnJvbSBsb3ctcG93ZXIgbW9kZSAqKioKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgIFRoZSBNQ1UgY2FuIGJlIHdva2VuIHVwIGZyb20gbG93LXBvd2VyIG1vZGUgYnkgYW4gUlRDIEFsYXJtIGV2ZW50LCBhbiBSVEMKKyAgICAgIFdha2V1cCBldmVudCwgYSB0YW1wZXIgZXZlbnQsIGEgdGltZS1zdGFtcCBldmVudCwgb3IgYSBjb21wYXJhdG9yIGV2ZW50LCAKKyAgICAgIHdpdGhvdXQgZGVwZW5kaW5nIG9uIGFuIGV4dGVybmFsIGludGVycnVwdCAoQXV0by13YWtldXAgbW9kZSkuCisKKyAgICAoKykgUlRDIGF1dG8td2FrZXVwIChBV1UpIGZyb20gdGhlIFN0b3AgYW5kIFN0YW5kYnkgbW9kZXMKKworICAgICAgKCsrKSBUbyB3YWtlIHVwIGZyb20gdGhlIFN0b3AgbW9kZSB3aXRoIGFuIFJUQyBhbGFybSBldmVudCwgaXQgaXMgbmVjZXNzYXJ5IHRvCisgICAgICAgICAgICBjb25maWd1cmUgdGhlIFJUQyB0byBnZW5lcmF0ZSB0aGUgUlRDIGFsYXJtIHVzaW5nIHRoZSBIQUxfUlRDX1NldEFsYXJtX0lUKCkgZnVuY3Rpb24uCisKKyAgICAgICgrKykgVG8gd2FrZSB1cCBmcm9tIHRoZSBTdG9wIG1vZGUgd2l0aCBhbiBSVEMgVGFtcGVyIG9yIHRpbWUgc3RhbXAgZXZlbnQsIGl0CisgICAgICAgICAgIGlzIG5lY2Vzc2FyeSB0byBjb25maWd1cmUgdGhlIFJUQyB0byBkZXRlY3QgdGhlIHRhbXBlciBvciB0aW1lIHN0YW1wIGV2ZW50IHVzaW5nIHRoZQorICAgICAgICAgICBIQUxfUlRDX1NldFRpbWVTdGFtcF9JVCgpIG9yIEhBTF9SVENfU2V0VGFtcGVyX0lUKCkgZnVuY3Rpb25zLgorCisgICAgICAoKyspIFRvIHdha2UgdXAgZnJvbSB0aGUgU3RvcCBtb2RlIHdpdGggYW4gUlRDIFdha2VVcCBldmVudCwgaXQgaXMgbmVjZXNzYXJ5IHRvCisgICAgICAgICAgIGNvbmZpZ3VyZSB0aGUgUlRDIHRvIGdlbmVyYXRlIHRoZSBSVEMgV2FrZVVwIGV2ZW50IHVzaW5nIHRoZSBIQUxfUlRDX1NldFdha2VVcFRpbWVyX0lUKCkgZnVuY3Rpb24uCisKKyAgICAoKykgQ29tcGFyYXRvciBhdXRvLXdha2V1cCAoQVdVKSBmcm9tIHRoZSBTdG9wIG1vZGUKKworICAgICAgKCsrKSBUbyB3YWtlIHVwIGZyb20gdGhlIFN0b3AgbW9kZSB3aXRoIGEgY29tcGFyYXRvciB3YWtldXAgZXZlbnQsIGl0IGlzIG5lY2Vzc2FyeSB0bzoKKyAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBFWFRJIExpbmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb21wYXJhdG9yIChleGFtcGxlIEVYVEkgTGluZSAyMiBmb3IgY29tcGFyYXRvciAyVSkgCisgICAgICAgICAgICAgICAgIHRvIGJlIHNlbnNpdGl2ZSB0byB0byB0aGUgc2VsZWN0ZWQgZWRnZXMgKGZhbGxpbmcsIHJpc2luZyBvciBmYWxsaW5nIAorICAgICAgICAgICAgICAgICBhbmQgcmlzaW5nKSAoSW50ZXJydXB0IG9yIEV2ZW50IG1vZGVzKSB1c2luZyB0aGUgRVhUSV9Jbml0KCkgZnVuY3Rpb24uCisgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgY29tcGFyYXRvciB0byBnZW5lcmF0ZSB0aGUgZXZlbnQuICAgICAgCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlcyB0aGUgV2FrZVVwIFBJTnggZnVuY3Rpb25hbGl0eS4KKyAgKiBAcGFyYW0gV2FrZVVwUGlueCBTcGVjaWZpZXMgdGhlIFBvd2VyIFdha2UtVXAgcGluIHRvIGVuYWJsZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSB2YWx1ZSBvZiA6CisgICogICAgICAgICAgIEByZWYgUFdSX1dha2VVcF9QaW5zCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JfRW5hYmxlV2FrZVVwUGluKHVpbnQzMl90IFdha2VVcFBpbngpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19QV1JfV0FLRVVQX1BJTihXYWtlVXBQaW54KSk7CisgIC8qIEVuYWJsZSB0aGUgRVdVUHggcGluICovCisgIFNFVF9CSVQoUFdSLT5DU1IsIFdha2VVcFBpbngpOworfQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZXMgdGhlIFdha2VVcCBQSU54IGZ1bmN0aW9uYWxpdHkuCisgICogQHBhcmFtIFdha2VVcFBpbnggU3BlY2lmaWVzIHRoZSBQb3dlciBXYWtlLVVwIHBpbiB0byBkaXNhYmxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHZhbHVlcyBvZiA6CisgICogICAgICAgICAgIEByZWYgUFdSX1dha2VVcF9QaW5zCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JfRGlzYWJsZVdha2VVcFBpbih1aW50MzJfdCBXYWtlVXBQaW54KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUFdSX1dBS0VVUF9QSU4oV2FrZVVwUGlueCkpOworICAvKiBEaXNhYmxlIHRoZSBFV1VQeCBwaW4gKi8KKyAgQ0xFQVJfQklUKFBXUi0+Q1NSLCBXYWtlVXBQaW54KTsKK30KKworLyoqCisgICogQGJyaWVmIEVudGVycyBTbGVlcCBtb2RlLgorICAqIEBub3RlICBJbiBTbGVlcCBtb2RlLCBhbGwgSS9PIHBpbnMga2VlcCB0aGUgc2FtZSBzdGF0ZSBhcyBpbiBSdW4gbW9kZS4KKyAgKiBAcGFyYW0gUmVndWxhdG9yIFNwZWNpZmllcyB0aGUgcmVndWxhdG9yIHN0YXRlIGluIFNMRUVQIG1vZGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgUFdSX01BSU5SRUdVTEFUT1JfT046IFNMRUVQIG1vZGUgd2l0aCByZWd1bGF0b3IgT04KKyAgKiAgICAgICAgICAgIEBhcmcgUFdSX0xPV1BPV0VSUkVHVUxBVE9SX09OOiBTTEVFUCBtb2RlIHdpdGggbG93IHBvd2VyIHJlZ3VsYXRvciBPTgorICAqIEBub3RlIFRoaXMgcGFyYW1ldGVyIGhhcyBubyBlZmZlY3QgaW4gRjMgZmFtaWx5IGFuZCBpcyBqdXN0IG1haW50YWluZWQgdG8gCisgICogICAgICAgb2ZmZXIgZnVsbCBwb3J0YWJpbGl0eSBvZiBvdGhlciBTVE0zMiBmYW1pbGllcyBzb2Z0d2FyZXMuCisgICogQHBhcmFtIFNMRUVQRW50cnkgU3BlY2lmaWVzIGlmIFNMRUVQIG1vZGUgaXMgZW50ZXJlZCB3aXRoIFdGSSBvciBXRkUgaW5zdHJ1Y3Rpb24uCisgICogICAgICAgICAgIFdoZW4gV0ZJIGVudHJ5IGlzIHVzZWQsIHRpY2sgaW50ZXJydXB0IGhhdmUgdG8gYmUgZGlzYWJsZWQgaWYgbm90IGRlc2lyZWQgYXMgCisgICogICAgICAgICAgIHRoZSBpbnRlcnJ1cHQgd2FrZSB1cCBzb3VyY2UuCisgICogICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFBXUl9TTEVFUEVOVFJZX1dGSTogZW50ZXIgU0xFRVAgbW9kZSB3aXRoIFdGSSBpbnN0cnVjdGlvbgorICAqICAgICAgICAgICAgQGFyZyBQV1JfU0xFRVBFTlRSWV9XRkU6IGVudGVyIFNMRUVQIG1vZGUgd2l0aCBXRkUgaW5zdHJ1Y3Rpb24KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUl9FbnRlclNMRUVQTW9kZSh1aW50MzJfdCBSZWd1bGF0b3IsIHVpbnQ4X3QgU0xFRVBFbnRyeSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9TTEVFUF9FTlRSWShTTEVFUEVudHJ5KSk7CisKKyAgLyogQ2xlYXIgU0xFRVBERUVQIGJpdCBvZiBDb3J0ZXggU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgU0NCLT5TQ1IgJj0gKHVpbnQzMl90KX4oKHVpbnQzMl90KVNDQl9TQ1JfU0xFRVBERUVQX01zayk7CisKKyAgLyogU2VsZWN0IFNMRUVQIG1vZGUgZW50cnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKFNMRUVQRW50cnkgPT0gUFdSX1NMRUVQRU5UUllfV0ZJKQorICB7CisgICAgLyogUmVxdWVzdCBXYWl0IEZvciBJbnRlcnJ1cHQgKi8KKyAgICBfX1dGSSgpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJlcXVlc3QgV2FpdCBGb3IgRXZlbnQgKi8KKyAgICBfX1NFVigpOworICAgIF9fV0ZFKCk7CisgICAgX19XRkUoKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgRW50ZXJzIFNUT1AgbW9kZS4KKyAgKiBAbm90ZSAgSW4gU3RvcCBtb2RlLCBhbGwgSS9PIHBpbnMga2VlcCB0aGUgc2FtZSBzdGF0ZSBhcyBpbiBSdW4gbW9kZS4KKyAgKiBAbm90ZSAgV2hlbiBleGl0aW5nIFN0b3AgbW9kZSBieSBpc3N1aW5nIGFuIGludGVycnVwdCBvciBhIHdha2V1cCBldmVudCwKKyAgKiAgICAgICAgIHRoZSBIU0kgUkMgb3NjaWxsYXRvciBpcyBzZWxlY3RlZCBhcyBzeXN0ZW0gY2xvY2suCisgICogQG5vdGUgIFdoZW4gdGhlIHZvbHRhZ2UgcmVndWxhdG9yIG9wZXJhdGVzIGluIGxvdyBwb3dlciBtb2RlLCBhbiBhZGRpdGlvbmFsCisgICogICAgICAgICBzdGFydHVwIGRlbGF5IGlzIGluY3VycmVkIHdoZW4gd2FraW5nIHVwIGZyb20gU3RvcCBtb2RlLgorICAqICAgICAgICAgQnkga2VlcGluZyB0aGUgaW50ZXJuYWwgcmVndWxhdG9yIE9OIGR1cmluZyBTdG9wIG1vZGUsIHRoZSBjb25zdW1wdGlvbgorICAqICAgICAgICAgaXMgaGlnaGVyIGFsdGhvdWdoIHRoZSBzdGFydHVwIHRpbWUgaXMgcmVkdWNlZC4KKyAgKiBAcGFyYW0gUmVndWxhdG9yIFNwZWNpZmllcyB0aGUgcmVndWxhdG9yIHN0YXRlIGluIFNUT1AgbW9kZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBQV1JfTUFJTlJFR1VMQVRPUl9PTjogU1RPUCBtb2RlIHdpdGggcmVndWxhdG9yIE9OCisgICogICAgICAgICAgICBAYXJnIFBXUl9MT1dQT1dFUlJFR1VMQVRPUl9PTjogU1RPUCBtb2RlIHdpdGggbG93IHBvd2VyIHJlZ3VsYXRvciBPTgorICAqIEBwYXJhbSBTVE9QRW50cnkgc3BlY2lmaWVzIGlmIFNUT1AgbW9kZSBpbiBlbnRlcmVkIHdpdGggV0ZJIG9yIFdGRSBpbnN0cnVjdGlvbi4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBQV1JfU1RPUEVOVFJZX1dGSTpFbnRlciBTVE9QIG1vZGUgd2l0aCBXRkkgaW5zdHJ1Y3Rpb24KKyAgKiAgICAgICAgICAgIEBhcmcgUFdSX1NUT1BFTlRSWV9XRkU6IEVudGVyIFNUT1AgbW9kZSB3aXRoIFdGRSBpbnN0cnVjdGlvbgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSX0VudGVyU1RPUE1vZGUodWludDMyX3QgUmVndWxhdG9yLCB1aW50OF90IFNUT1BFbnRyeSkKK3sKKyAgdWludDMyX3QgdG1wcmVnID0gMFU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9SRUdVTEFUT1IoUmVndWxhdG9yKSk7CisgIGFzc2VydF9wYXJhbShJU19QV1JfU1RPUF9FTlRSWShTVE9QRW50cnkpKTsKKworICAvKiBTZWxlY3QgdGhlIHJlZ3VsYXRvciBzdGF0ZSBpbiBTVE9QIG1vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgdG1wcmVnID0gUFdSLT5DUjsKKyAgCisgIC8qIENsZWFyIFBERFMgYW5kIExQRFMgYml0cyAqLworICB0bXByZWcgJj0gKHVpbnQzMl90KX4oUFdSX0NSX1BERFMgfCBQV1JfQ1JfTFBEUyk7CisKKyAgLyogU2V0IExQRFMgYml0IGFjY29yZGluZyB0byBSZWd1bGF0b3IgdmFsdWUgKi8KKyAgdG1wcmVnIHw9IFJlZ3VsYXRvcjsKKworICAvKiBTdG9yZSB0aGUgbmV3IHZhbHVlICovCisgIFBXUi0+Q1IgPSB0bXByZWc7CisKKyAgLyogU2V0IFNMRUVQREVFUCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovCisgIFNDQi0+U0NSIHw9IFNDQl9TQ1JfU0xFRVBERUVQX01zazsKKworICAvKiBTZWxlY3QgU1RPUCBtb2RlIGVudHJ5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYoU1RPUEVudHJ5ID09IFBXUl9TVE9QRU5UUllfV0ZJKQorICB7CisgICAgLyogUmVxdWVzdCBXYWl0IEZvciBJbnRlcnJ1cHQgKi8KKyAgICBfX1dGSSgpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJlcXVlc3QgV2FpdCBGb3IgRXZlbnQgKi8KKyAgICBfX1NFVigpOworICAgIF9fV0ZFKCk7CisgICAgX19XRkUoKTsKKyAgfQorCisgIC8qIFJlc2V0IFNMRUVQREVFUCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovCisgIFNDQi0+U0NSICY9ICh1aW50MzJfdCl+KCh1aW50MzJfdClTQ0JfU0NSX1NMRUVQREVFUF9Nc2spOworfQorCisvKioKKyAgKiBAYnJpZWYgRW50ZXJzIFNUQU5EQlkgbW9kZS4KKyAgKiBAbm90ZSAgSW4gU3RhbmRieSBtb2RlLCBhbGwgSS9PIHBpbnMgYXJlIGhpZ2ggaW1wZWRhbmNlIGV4Y2VwdCBmb3I6CisgICogICAgICAgICAgLSBSZXNldCBwYWQgKHN0aWxsIGF2YWlsYWJsZSksIAorICAqICAgICAgICAgIC0gUlRDIGFsdGVybmF0ZSBmdW5jdGlvbiBwaW5zIGlmIGNvbmZpZ3VyZWQgZm9yIHRhbXBlciwgdGltZS1zdGFtcCwgUlRDCisgICogICAgICAgICAgICBBbGFybSBvdXQsIG9yIFJUQyBjbG9jayBjYWxpYnJhdGlvbiBvdXQsIAorICAqICAgICAgICAgIC0gV0tVUCBwaW5zIGlmIGVuYWJsZWQuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JfRW50ZXJTVEFOREJZTW9kZSh2b2lkKQoreworICAvKiBTZWxlY3QgU1RBTkRCWSBtb2RlICovCisgIFBXUi0+Q1IgfD0gUFdSX0NSX1BERFM7CisKKyAgLyogU2V0IFNMRUVQREVFUCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovCisgIFNDQi0+U0NSIHw9IFNDQl9TQ1JfU0xFRVBERUVQX01zazsKKworICAvKiBUaGlzIG9wdGlvbiBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IHN0b3JlIG9wZXJhdGlvbnMgYXJlIGNvbXBsZXRlZCAqLworI2lmIGRlZmluZWQgKCBfX0NDX0FSTSkKKyAgX19mb3JjZV9zdG9yZXMoKTsKKyNlbmRpZgorICAvKiBSZXF1ZXN0IFdhaXQgRm9yIEludGVycnVwdCAqLworICBfX1dGSSgpOworfQorCisvKioKKyAgKiBAYnJpZWYgSW5kaWNhdGVzIFNsZWVwLU9uLUV4aXQgd2hlbiByZXR1cm5pbmcgZnJvbSBIYW5kbGVyIG1vZGUgdG8gVGhyZWFkIG1vZGUuIAorICAqIEBub3RlIFNldCBTTEVFUE9ORVhJVCBiaXQgb2YgU0NSIHJlZ2lzdGVyLiBXaGVuIHRoaXMgYml0IGlzIHNldCwgdGhlIHByb2Nlc3NvciAKKyAgKiAgICAgICByZS1lbnRlcnMgU0xFRVAgbW9kZSB3aGVuIGFuIGludGVycnVwdGlvbiBoYW5kbGluZyBpcyBvdmVyLgorICAqICAgICAgIFNldHRpbmcgdGhpcyBiaXQgaXMgdXNlZnVsIHdoZW4gdGhlIHByb2Nlc3NvciBpcyBleHBlY3RlZCB0byBydW4gb25seSBvbgorICAqICAgICAgIGludGVycnVwdGlvbnMgaGFuZGxpbmcuICAgICAgICAgCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JfRW5hYmxlU2xlZXBPbkV4aXQodm9pZCkKK3sKKyAgLyogU2V0IFNMRUVQT05FWElUIGJpdCBvZiBDb3J0ZXggU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgU0VUX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NMRUVQT05FWElUX01zaykpOworfQorCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlcyBTbGVlcC1Pbi1FeGl0IGZlYXR1cmUgd2hlbiByZXR1cm5pbmcgZnJvbSBIYW5kbGVyIG1vZGUgdG8gVGhyZWFkIG1vZGUuIAorICAqIEBub3RlIENsZWFycyBTTEVFUE9ORVhJVCBiaXQgb2YgU0NSIHJlZ2lzdGVyLiBXaGVuIHRoaXMgYml0IGlzIHNldCwgdGhlIHByb2Nlc3NvciAKKyAgKiAgICAgICByZS1lbnRlcnMgU0xFRVAgbW9kZSB3aGVuIGFuIGludGVycnVwdGlvbiBoYW5kbGluZyBpcyBvdmVyLiAgICAgICAgICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUl9EaXNhYmxlU2xlZXBPbkV4aXQodm9pZCkKK3sKKyAgLyogQ2xlYXIgU0xFRVBPTkVYSVQgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBDTEVBUl9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TTEVFUE9ORVhJVF9Nc2spKTsKK30KKworCisKKy8qKgorICAqIEBicmllZiBFbmFibGVzIENPUlRFWCBNNCBTRVZPTlBFTkQgYml0LiAKKyAgKiBAbm90ZSBTZXRzIFNFVk9OUEVORCBiaXQgb2YgU0NSIHJlZ2lzdGVyLiBXaGVuIHRoaXMgYml0IGlzIHNldCwgdGhpcyBjYXVzZXMgCisgICogICAgICAgV0ZFIHRvIHdha2UgdXAgd2hlbiBhbiBpbnRlcnJ1cHQgbW92ZXMgZnJvbSBpbmFjdGl2ZSB0byBwZW5kZWQuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JfRW5hYmxlU0VWT25QZW5kKHZvaWQpCit7CisgIC8qIFNldCBTRVZPTlBFTkQgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBTRVRfQklUKFNDQi0+U0NSLCAoKHVpbnQzMl90KVNDQl9TQ1JfU0VWT05QRU5EX01zaykpOworfQorCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlcyBDT1JURVggTTQgU0VWT05QRU5EIGJpdC4gCisgICogQG5vdGUgQ2xlYXJzIFNFVk9OUEVORCBiaXQgb2YgU0NSIHJlZ2lzdGVyLiBXaGVuIHRoaXMgYml0IGlzIHNldCwgdGhpcyBjYXVzZXMgCisgICogICAgICAgV0ZFIHRvIHdha2UgdXAgd2hlbiBhbiBpbnRlcnJ1cHQgbW92ZXMgZnJvbSBpbmFjdGl2ZSB0byBwZW5kZWQuICAgICAgICAgCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JfRGlzYWJsZVNFVk9uUGVuZCh2b2lkKQoreworICAvKiBDbGVhciBTRVZPTlBFTkQgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBDTEVBUl9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TRVZPTlBFTkRfTXNrKSk7Cit9CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX1BXUl9NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmYzeHhfaGFsX3B3cl9leC5jIGIvU3JjL3N0bTMyZjN4eF9oYWxfcHdyX2V4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY1ZGI0MwotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfaGFsX3B3cl9leC5jCkBAIC0wLDAgKzEsMjg4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2hhbF9wd3JfZXguYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgRXh0ZW5kZWQgUFdSIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFBvd2VyIENvbnRyb2xsZXIgKFBXUikgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBFeHRlbmRlZCBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqICAgICAgICAgCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JFeCBQV1JFeAorICAqIEBicmllZiAgICBQV1JFeCBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfUFdSX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQV1JFeF9Qcml2YXRlX0NvbnN0YW50cyBQV1IgRXh0ZW5kZWQgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworI2RlZmluZSBQVkRfTU9ERV9JVCAgICAgICAgICAgICAgICgweDAwMDEwMDAwVSkKKyNkZWZpbmUgUFZEX01PREVfRVZUICAgICAgICAgICAgICAoMHgwMDAyMDAwMFUpCisjZGVmaW5lIFBWRF9SSVNJTkdfRURHRSAgICAgICAgICAgKDB4MDAwMDAwMDFVKQorI2RlZmluZSBQVkRfRkFMTElOR19FREdFICAgICAgICAgICgweDAwMDAwMDAyVSkKKy8qKgorICAqIEB9CisgICovCisgCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBQV1JFeF9FeHBvcnRlZF9GdW5jdGlvbnMgUFdSIEV4dGVuZGVkIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBQZXJpcGhlcmFsIEV4dGVuZGVkIENvbnRyb2wgRnVuY3Rpb25zCisgICogIEBicmllZiAgIEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgRXh0ZW5kZWQgY29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgKioqIFBWRCBjb25maWd1cmF0aW9uIChwcmVzZW50IG9uIGFsbCBvdGhlciBkZXZpY2VzIHRoYW4gU1RNMzJGM3g4IGRldmljZXMpICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAoKykgVGhlIFBWRCBpcyB1c2VkIHRvIG1vbml0b3IgdGhlIFZERCBwb3dlciBzdXBwbHkgYnkgY29tcGFyaW5nIGl0IHRvIGEKKyAgICAgICAgICB0aHJlc2hvbGQgc2VsZWN0ZWQgYnkgdGhlIFBWRCBMZXZlbCAoUExTWzI6MF0gYml0cyBpbiB0aGUgUFdSX0NSKS4KKyAgICAgICgrKSBBIFBWRE8gZmxhZyBpcyBhdmFpbGFibGUgdG8gaW5kaWNhdGUgaWYgVkREL1ZEREEgaXMgaGlnaGVyIG9yIGxvd2VyCisgICAgICAgICAgdGhhbiB0aGUgUFZEIHRocmVzaG9sZC4gVGhpcyBldmVudCBpcyBpbnRlcm5hbGx5IGNvbm5lY3RlZCB0byB0aGUgRVhUSQorICAgICAgICAgIGxpbmUxNiBhbmQgY2FuIGdlbmVyYXRlIGFuIGludGVycnVwdCBpZiBlbmFibGVkLiBUaGlzIGlzIGRvbmUgdGhyb3VnaAorICAgICAgICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfSVQoKSBtYWNybworICAgICAgKCspIFRoZSBQVkQgaXMgc3RvcHBlZCBpbiBTdGFuZGJ5IG1vZGUuCisgICAgICAtQC0gUFZEIGlzIG5vdCBhdmFpbGFibGUgb24gU1RNMzJGM3g4IFByb2R1Y3QgTGluZQorCisKKyAgICAqKiogVm9sdGFnZSByZWd1bGF0b3IgKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgrKSBUaGUgdm9sdGFnZSByZWd1bGF0b3IgaXMgYWx3YXlzIGVuYWJsZWQgYWZ0ZXIgUmVzZXQuIEl0IHdvcmtzIGluIHRocmVlIGRpZmZlcmVudAorICAgICAgICAgIG1vZGVzLgorICAgICAgICAgIEluIFJ1biBtb2RlLCB0aGUgcmVndWxhdG9yIHN1cHBsaWVzIGZ1bGwgcG93ZXIgdG8gdGhlIDEuOFYgZG9tYWluIChjb3JlLCBtZW1vcmllcworICAgICAgICAgIGFuZCBkaWdpdGFsIHBlcmlwaGVyYWxzKS4KKyAgICAgICAgICBJbiBTdG9wIG1vZGUsIHRoZSByZWd1bGF0b3Igc3VwcGxpZXMgbG93IHBvd2VyIHRvIHRoZSAxLjhWIGRvbWFpbiwgcHJlc2VydmluZworICAgICAgICAgIGNvbnRlbnRzIG9mIHJlZ2lzdGVycyBhbmQgU1JBTS4KKyAgICAgICAgICBJbiBTdG9wIG1vZGUsIHRoZSByZWd1bGF0b3IgaXMgcG93ZXJlZCBvZmYuIFRoZSBjb250ZW50cyBvZiB0aGUgcmVnaXN0ZXJzIGFuZCBTUkFNCisgICAgICAgICAgYXJlIGxvc3QgZXhjZXB0IGZvciB0aGUgU3RhbmRieSBjaXJjdWl0cnkgYW5kIHRoZSBCYWNrdXAgRG9tYWluLgorICAgICAgICAgIE5vdGU6IGluIHRoZSBTVE0zMkYzeDh4eCBkZXZpY2VzLCB0aGUgdm9sdGFnZSByZWd1bGF0b3IgaXMgYnlwYXNzZWQgYW5kIHRoZQorICAgICAgICAgIG1pY3JvY29udHJvbGxlciBtdXN0IGJlIHBvd2VyZWQgZnJvbSBhIG5vbWluYWwgVkREID0gMS44ViArLy04VSUgdm9sdGFnZS4KKworCisgICAgICAoKykgQSBQVkRPIGZsYWcgaXMgYXZhaWxhYmxlIHRvIGluZGljYXRlIGlmIFZERC9WRERBIGlzIGhpZ2hlciBvciBsb3dlcgorICAgICAgICAgIHRoYW4gdGhlIFBWRCB0aHJlc2hvbGQuIFRoaXMgZXZlbnQgaXMgaW50ZXJuYWxseSBjb25uZWN0ZWQgdG8gdGhlIEVYVEkKKyAgICAgICAgICBsaW5lMTYgYW5kIGNhbiBnZW5lcmF0ZSBhbiBpbnRlcnJ1cHQgaWYgZW5hYmxlZC4gVGhpcyBpcyBkb25lIHRocm91Z2gKKyAgICAgICAgICBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX0lUKCkgbWFjcm8KKyAgICAgICgrKSBUaGUgUFZEIGlzIHN0b3BwZWQgaW4gU3RhbmRieSBtb2RlLgorCisKKyAgICAqKiogU0RBREMgcG93ZXIgY29uZmlndXJhdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgrKSBPbiBTVE0zMkYzNzN4Qy9TVE0zMkYzNzh4eCBkZXZpY2VzLCB0aGVyZSBhcmUgdXAgdG8gCisgICAgICAgICAgMyBTREFEQyBpbnN0YW5jZXMgdGhhdCBjYW4gYmUgZW5hYmxlZC9kaXNhYmxlZC4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjM3M3hDKQorCisvKioKKyAgKiBAYnJpZWYgQ29uZmlndXJlcyB0aGUgdm9sdGFnZSB0aHJlc2hvbGQgZGV0ZWN0ZWQgYnkgdGhlIFBvd2VyIFZvbHRhZ2UgRGV0ZWN0b3IoUFZEKS4KKyAgKiBAcGFyYW0gc0NvbmZpZ1BWRCBwb2ludGVyIHRvIGFuIFBXUl9QVkRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uCisgICogICAgICAgIGluZm9ybWF0aW9uIGZvciB0aGUgUFZELgorICAqIEBub3RlIFJlZmVyIHRvIHRoZSBlbGVjdHJpY2FsIGNoYXJhY3RlcmlzdGljcyBvZiB5b3VyIGRldmljZSBkYXRhc2hlZXQgZm9yCisgICogICAgICAgICBtb3JlIGRldGFpbHMgYWJvdXQgdGhlIHZvbHRhZ2UgdGhyZXNob2xkIGNvcnJlc3BvbmRpbmcgdG8gZWFjaAorICAqICAgICAgICAgZGV0ZWN0aW9uIGxldmVsLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSX0NvbmZpZ1BWRChQV1JfUFZEVHlwZURlZiAqc0NvbmZpZ1BWRCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9QVkRfTEVWRUwoc0NvbmZpZ1BWRC0+UFZETGV2ZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9QVkRfTU9ERShzQ29uZmlnUFZELT5Nb2RlKSk7CisKKyAgLyogU2V0IFBMU1s3OjVdIGJpdHMgYWNjb3JkaW5nIHRvIFBWRExldmVsIHZhbHVlICovCisgIE1PRElGWV9SRUcoUFdSLT5DUiwgUFdSX0NSX1BMUywgc0NvbmZpZ1BWRC0+UFZETGV2ZWwpOworICAKKyAgLyogQ2xlYXIgYW55IHByZXZpb3VzIGNvbmZpZy4gS2VlcCBpdCBjbGVhciBpZiBubyBldmVudCBvciBJVCBtb2RlIGlzIHNlbGVjdGVkICovCisgIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX0VWRU5UKCk7CisgIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX0lUKCk7CisgIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCk7X19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCk7CisKKyAgLyogQ29uZmlndXJlIGludGVycnVwdCBtb2RlICovCisgIGlmKChzQ29uZmlnUFZELT5Nb2RlICYgUFZEX01PREVfSVQpID09IFBWRF9NT0RFX0lUKQorICB7CisgICAgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9JVCgpOworICB9CisgIAorICAvKiBDb25maWd1cmUgZXZlbnQgbW9kZSAqLworICBpZigoc0NvbmZpZ1BWRC0+TW9kZSAmIFBWRF9NT0RFX0VWVCkgPT0gUFZEX01PREVfRVZUKQorICB7CisgICAgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9FVkVOVCgpOworICB9CisgIAorICAvKiBDb25maWd1cmUgdGhlIGVkZ2UgKi8KKyAgaWYoKHNDb25maWdQVkQtPk1vZGUgJiBQVkRfUklTSU5HX0VER0UpID09IFBWRF9SSVNJTkdfRURHRSkKKyAgeworICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTsKKyAgfQorICAKKyAgaWYoKHNDb25maWdQVkQtPk1vZGUgJiBQVkRfRkFMTElOR19FREdFKSA9PSBQVkRfRkFMTElOR19FREdFKQorICB7CisgICAgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlcyB0aGUgUG93ZXIgVm9sdGFnZSBEZXRlY3RvcihQVkQpLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSX0VuYWJsZVBWRCh2b2lkKQoreworICBTRVRfQklUKFBXUi0+Q1IsIFBXUl9DUl9QVkRFKTsgIAorfQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZXMgdGhlIFBvd2VyIFZvbHRhZ2UgRGV0ZWN0b3IoUFZEKS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUl9EaXNhYmxlUFZEKHZvaWQpCit7CisgIENMRUFSX0JJVChQV1ItPkNSLCBQV1JfQ1JfUFZERSk7ICAKK30KKworLyoqCisgICogQGJyaWVmIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgUFdSIFBWRCBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAbm90ZSBUaGlzIEFQSSBzaG91bGQgYmUgY2FsbGVkIHVuZGVyIHRoZSBQVkRfSVJRSGFuZGxlcigpLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSX1BWRF9JUlFIYW5kbGVyKHZvaWQpCit7CisgIC8qIENoZWNrIFBXUiBleHRpIGZsYWcgKi8KKyAgaWYoX19IQUxfUFdSX1BWRF9FWFRJX0dFVF9GTEFHKCkgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBQV1IgUFZEIGludGVycnVwdCB1c2VyIGNhbGxiYWNrICovCisgICAgSEFMX1BXUl9QVkRDYWxsYmFjaygpOworCisgICAgLyogQ2xlYXIgUFdSIEV4dGkgcGVuZGluZyBiaXQgKi8KKyAgICBfX0hBTF9QV1JfUFZEX0VYVElfQ0xFQVJfRkxBRygpOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBQV1IgUFZEIGludGVycnVwdCBjYWxsYmFjaworICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1BXUl9QVkRDYWxsYmFjayh2b2lkKQoreworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1BXUl9QVkRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzNzN4QyAgICAgICAgICAgICAgICAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKworLyoqCisgICogQGJyaWVmICBFbmFibGVzIHRoZSBTREFEQyBwZXJpcGhlcmFsIGZ1bmN0aW9uYWxpeQorICAqIEBwYXJhbSAgQW5hbG9neCBzcGVjaWZpZXMgdGhlIFNEQURDIHBlcmlwaGVyYWwgaW5zdGFuY2UuCisgICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IFBXUl9TREFEQ19BTkFMT0cxLCBQV1JfU0RBRENfQU5BTE9HMiBvciBQV1JfU0RBRENfQU5BTE9HMy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUkV4X0VuYWJsZVNEQURDKHVpbnQzMl90IEFuYWxvZ3gpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19QV1JfU0RBRENfQU5BTE9HKEFuYWxvZ3gpKTsKKworICAvKiBFbmFibGUgUFdSIGNsb2NrIGludGVyZmFjZSBmb3IgU0RBREMgdXNlICovCisgIF9fSEFMX1JDQ19QV1JfQ0xLX0VOQUJMRSgpOworICAgIAorICBQV1ItPkNSIHw9IEFuYWxvZ3g7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZXMgdGhlIFNEQURDIHBlcmlwaGVyYWwgZnVuY3Rpb25hbGl5CisgICogQHBhcmFtICBBbmFsb2d4IHNwZWNpZmllcyB0aGUgU0RBREMgcGVyaXBoZXJhbCBpbnN0YW5jZS4KKyAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogUFdSX1NEQURDX0FOQUxPRzEsIFBXUl9TREFEQ19BTkFMT0cyIG9yIFBXUl9TREFEQ19BTkFMT0czLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSRXhfRGlzYWJsZVNEQURDKHVpbnQzMl90IEFuYWxvZ3gpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19QV1JfU0RBRENfQU5BTE9HKEFuYWxvZ3gpKTsKKyAgCisgIFBXUi0+Q1IgJj0gfkFuYWxvZ3g7Cit9CisKKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX1BXUl9NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmYzeHhfaGFsX3JjYy5jIGIvU3JjL3N0bTMyZjN4eF9oYWxfcmNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyYjIzNAotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfaGFsX3JjYy5jCkBAIC0wLDAgKzEsMTIxNSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfcmNjLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFJDQyBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nIAorICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgUmVzZXQgYW5kIENsb2NrIENvbnRyb2wgKFJDQykgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqICAgICAgIAorICBAdmVyYmF0aW0gICAgICAgICAgICAgICAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFJDQyBzcGVjaWZpYyBmZWF0dXJlcyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICAKKyAgICAgIEFmdGVyIHJlc2V0IHRoZSBkZXZpY2UgaXMgcnVubmluZyBmcm9tIEludGVybmFsIEhpZ2ggU3BlZWQgb3NjaWxsYXRvcgorICAgICAgKEhTSSA4TUh6KSB3aXRoIEZsYXNoIDAgd2FpdCBzdGF0ZSwgRmxhc2ggcHJlZmV0Y2ggYnVmZmVyIGlzIGVuYWJsZWQsIAorICAgICAgYW5kIGFsbCBwZXJpcGhlcmFscyBhcmUgb2ZmIGV4Y2VwdCBpbnRlcm5hbCBTUkFNLCBGbGFzaCBhbmQgSlRBRy4KKyAgICAgICgrKSBUaGVyZSBpcyBubyBwcmVzY2FsZXIgb24gSGlnaCBzcGVlZCAoQUhCKSBhbmQgTG93IHNwZWVkIChBUEIpIGJ1c2VzOworICAgICAgICAgIGFsbCBwZXJpcGhlcmFscyBtYXBwZWQgb24gdGhlc2UgYnVzZXMgYXJlIHJ1bm5pbmcgYXQgSFNJIHNwZWVkLgorICAgICAgKCspIFRoZSBjbG9jayBmb3IgYWxsIHBlcmlwaGVyYWxzIGlzIHN3aXRjaGVkIG9mZiwgZXhjZXB0IHRoZSBTUkFNIGFuZCBGTEFTSC4KKyAgICAgICgrKSBBbGwgR1BJT3MgYXJlIGluIGlucHV0IGZsb2F0aW5nIHN0YXRlLCBleGNlcHQgdGhlIEpUQUcgcGlucyB3aGljaAorICAgICAgICAgIGFyZSBhc3NpZ25lZCB0byBiZSB1c2VkIGZvciBkZWJ1ZyBwdXJwb3NlLgorICAgIFsuLl0gT25jZSB0aGUgZGV2aWNlIHN0YXJ0ZWQgZnJvbSByZXNldCwgdGhlIHVzZXIgYXBwbGljYXRpb24gaGFzIHRvOgorICAgICAgKCspIENvbmZpZ3VyZSB0aGUgY2xvY2sgc291cmNlIHRvIGJlIHVzZWQgdG8gZHJpdmUgdGhlIFN5c3RlbSBjbG9jaworICAgICAgICAgIChpZiB0aGUgYXBwbGljYXRpb24gbmVlZHMgaGlnaGVyIGZyZXF1ZW5jeS9wZXJmb3JtYW5jZSkKKyAgICAgICgrKSBDb25maWd1cmUgdGhlIFN5c3RlbSBjbG9jayBmcmVxdWVuY3kgYW5kIEZsYXNoIHNldHRpbmdzICAKKyAgICAgICgrKSBDb25maWd1cmUgdGhlIEFIQiBhbmQgQVBCIGJ1c2VzIHByZXNjYWxlcnMKKyAgICAgICgrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgcGVyaXBoZXJhbChzKSB0byBiZSB1c2VkCisgICAgICAoKykgQ29uZmlndXJlIHRoZSBjbG9jayBzb3VyY2UocykgZm9yIHBlcmlwaGVyYWxzIHdob3NlIGNsb2NrcyBhcmUgbm90CisgICAgICAgICAgZGVyaXZlZCBmcm9tIHRoZSBTeXN0ZW0gY2xvY2sgKFJUQywgQURDLCBJMkMsIEkyUywgVElNLCBVU0IgRlMpCisKKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBSQ0MgTGltaXRhdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgCisgICAgICBBIGRlbGF5IGJldHdlZW4gYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxlIGFuZCB0aGUgZWZmZWN0aXZlIHBlcmlwaGVyYWwgCisgICAgICBlbmFibGluZyBzaG91bGQgYmUgdGFrZW4gaW50byBhY2NvdW50IGluIG9yZGVyIHRvIG1hbmFnZSB0aGUgcGVyaXBoZXJhbCByZWFkL3dyaXRlIAorICAgICAgZnJvbS90byByZWdpc3RlcnMuCisgICAgICAoKykgVGhpcyBkZWxheSBkZXBlbmRzIG9uIHRoZSBwZXJpcGhlcmFsIG1hcHBpbmcuCisgICAgICAgICgrKykgQUhCICYgQVBCIHBlcmlwaGVyYWxzLCAxIGR1bW15IHJlYWQgaXMgbmVjZXNzYXJ5CisKKyAgICBbLi5dICAKKyAgICAgIFdvcmthcm91bmRzOgorICAgICAgKCMpIEZvciBBSEIgJiBBUEIgcGVyaXBoZXJhbHMsIGEgZHVtbXkgcmVhZCB0byB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciBoYXMgYmVlbgorICAgICAgICAgIGluc2VydGVkIGluIGVhY2ggX19IQUxfUkNDX1BQUF9DTEtfRU5BQkxFKCkgbWFjcm8uCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgCisqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0MgUkNDCisqIEBicmllZiBSQ0MgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX1JDQ19NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUkNDX1ByaXZhdGVfQ29uc3RhbnRzIFJDQyBQcml2YXRlIENvbnN0YW50cworICogQHsKKyAqLworLyogQml0cyBwb3NpdGlvbiBpbiAgaW4gdGhlIENGR1IgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkNDX0NGR1JfSFBSRV9CSVROVU1CRVIgICAgICAgICAgIFBPU0lUSU9OX1ZBTChSQ0NfQ0ZHUl9IUFJFKQorI2RlZmluZSBSQ0NfQ0ZHUl9QUFJFMV9CSVROVU1CRVIgICAgICAgICAgUE9TSVRJT05fVkFMKFJDQ19DRkdSX1BQUkUxKQorI2RlZmluZSBSQ0NfQ0ZHUl9QUFJFMl9CSVROVU1CRVIgICAgICAgICAgUE9TSVRJT05fVkFMKFJDQ19DRkdSX1BQUkUyKQorLyoqCisgICogQH0KKyAgKi8KKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJDQ19Qcml2YXRlX01hY3JvcyBSQ0MgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisjZGVmaW5lIE1DTzFfQ0xLX0VOQUJMRSgpICAgICBfX0hBTF9SQ0NfR1BJT0FfQ0xLX0VOQUJMRSgpCisjZGVmaW5lIE1DTzFfR1BJT19QT1JUICAgICAgICBHUElPQQorI2RlZmluZSBNQ08xX1BJTiAgICAgICAgICAgICAgR1BJT19QSU5fOAorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSQ0NfUHJpdmF0ZV9WYXJpYWJsZXMgUkNDIFByaXZhdGUgVmFyaWFibGVzCisgICogQHsKKyAgKi8KK2NvbnN0IHVpbnQ4X3QgYVBMTE1VTEZhY3RvclRhYmxlWzE2XSA9IHsgMlUsICAzVSwgIDRVLCAgNVUsICA2VSwgIDdVLCAgOFUsICA5VSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwVSwgMTFVLCAxMlUsIDEzVSwgMTRVLCAxNVUsIDE2VSwgMTZVfTsKK2NvbnN0IHVpbnQ4X3QgYVByZWRpdkZhY3RvclRhYmxlWzE2XSA9IHsgMVUsIDJVLCAgM1UsICA0VSwgIDVVLCAgNlUsICA3VSwgIDhVLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5VSwxMFUsIDExVSwgMTJVLCAxM1UsIDE0VSwgMTVVLCAxNlV9OworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFJDQ19FeHBvcnRlZF9GdW5jdGlvbnMgUkNDIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAKKyAgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAKKyAgKgorICBAdmVyYmF0aW0gICAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb25maWd1cmUgdGhlIGludGVybmFsL2V4dGVybmFsIG9zY2lsbGF0b3JzCisgICAgICAoSFNFLCBIU0ksIExTRSwgTFNJLCBQTEwsIENTUyBhbmQgTUNPKSBhbmQgdGhlIFN5c3RlbSBidXNlcyBjbG9ja3MgKFNZU0NMSywgQUhCLCBBUEIxCisgICAgICBhbmQgQVBCMikuCisKKyAgICBbLi5dIEludGVybmFsL2V4dGVybmFsIGNsb2NrIGFuZCBQTEwgY29uZmlndXJhdGlvbgorICAgICAgKCMpIEhTSSAoaGlnaC1zcGVlZCBpbnRlcm5hbCksIDggTUh6IGZhY3RvcnktdHJpbW1lZCBSQyB1c2VkIGRpcmVjdGx5IG9yIHRocm91Z2gKKyAgICAgICAgICB0aGUgUExMIGFzIFN5c3RlbSBjbG9jayBzb3VyY2UuCisgICAgICAgICAgVGhlIEhTSSBjbG9jayBjYW4gYmUgdXNlZCBhbHNvIHRvIGNsb2NrIHRoZSBVU0FSVCBhbmQgSTJDIHBlcmlwaGVyYWxzLgorCisgICAgICAoIykgTFNJIChsb3ctc3BlZWQgaW50ZXJuYWwpLCB+NDAgS0h6IGxvdyBjb25zdW1wdGlvbiBSQyB1c2VkIGFzIElXREcgYW5kL29yIFJUQworICAgICAgICAgIGNsb2NrIHNvdXJjZS4KKworICAgICAgKCMpIEhTRSAoaGlnaC1zcGVlZCBleHRlcm5hbCksIDQgdG8gMzIgTUh6IGNyeXN0YWwgb3NjaWxsYXRvciB1c2VkIGRpcmVjdGx5IG9yCisgICAgICAgICAgdGhyb3VnaCB0aGUgUExMIGFzIFN5c3RlbSBjbG9jayBzb3VyY2UuIENhbiBiZSB1c2VkIGFsc28gYXMgUlRDIGNsb2NrIHNvdXJjZS4KKworICAgICAgKCMpIExTRSAobG93LXNwZWVkIGV4dGVybmFsKSwgMzIgS0h6IG9zY2lsbGF0b3IgdXNlZCBhcyBSVEMgY2xvY2sgc291cmNlLiAgIAorCisgICAgICAoIykgUExMIChjbG9ja2VkIGJ5IEhTSSBvciBIU0UpLCBmZWF0dXJpbmcgZGlmZmVyZW50IG91dHB1dCBjbG9ja3M6CisgICAgICAgICgrKykgVGhlIGZpcnN0IG91dHB1dCBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBoaWdoIHNwZWVkIHN5c3RlbSBjbG9jayAodXAgdG8gNzIgTUh6KQorICAgICAgICAoKyspIFRoZSBzZWNvbmQgb3V0cHV0IGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNsb2NrIGZvciB0aGUgVVNCIEZTICg0OCBNSHopCisgICAgICAgICgrKykgVGhlIHRoaXJkIG91dHB1dCBtYXkgYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY2xvY2sgZm9yIHRoZSBBREMgcGVyaXBoZXJhbHMgKHVwIHRvIDcyIE1IeikKKyAgICAgICAgKCsrKSBUaGUgZm91cnRoIG91dHB1dCBtYXkgYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY2xvY2sgZm9yIHRoZSBUSU0gcGVyaXBoZXJhbHMgKDE0NCBNSHopCisKKyAgICAgICgjKSBDU1MgKENsb2NrIHNlY3VyaXR5IHN5c3RlbSksIG9uY2UgZW5hYmxlIHVzaW5nIHRoZSBtYWNybyBfX0hBTF9SQ0NfQ1NTX0VOQUJMRSgpCisgICAgICAgICAgYW5kIGlmIGEgSFNFIGNsb2NrIGZhaWx1cmUgb2NjdXJzKEhTRSB1c2VkIGRpcmVjdGx5IG9yIHRocm91Z2ggUExMIGFzIFN5c3RlbSAKKyAgICAgICAgICBjbG9jayBzb3VyY2UpLCB0aGUgU3lzdGVtIGNsb2NrcyBhdXRvbWF0aWNhbGx5IHN3aXRjaGVkIHRvIEhTSSBhbmQgYW4gaW50ZXJydXB0CisgICAgICAgICAgaXMgZ2VuZXJhdGVkIGlmIGVuYWJsZWQuIFRoZSBpbnRlcnJ1cHQgaXMgbGlua2VkIHRvIHRoZSBDb3J0ZXgtTTQgTk1JIAorICAgICAgICAgIChOb24tTWFza2FibGUgSW50ZXJydXB0KSBleGNlcHRpb24gdmVjdG9yLiAgIAorCisgICAgICAoIykgTUNPIChtaWNyb2NvbnRyb2xsZXIgY2xvY2sgb3V0cHV0KSwgdXNlZCB0byBvdXRwdXQgU1lTQ0xLLCBIU0ksIEhTRSwgTFNJLCBMU0Ugb3IgUExMCisgICAgICAgICAgY2xvY2sgKGRpdmlkZWQgYnkgMikgb3V0cHV0IG9uIHBpbiAoc3VjaCBhcyBQQTggcGluKS4KKworICAgIFsuLl0gU3lzdGVtLCBBSEIgYW5kIEFQQiBidXNlcyBjbG9ja3MgY29uZmlndXJhdGlvbgorICAgICAgKCMpIFNldmVyYWwgY2xvY2sgc291cmNlcyBjYW4gYmUgdXNlZCB0byBkcml2ZSB0aGUgU3lzdGVtIGNsb2NrIChTWVNDTEspOiBIU0ksCisgICAgICAgICAgSFNFIGFuZCBQTEwuCisgICAgICAgICAgVGhlIEFIQiBjbG9jayAoSENMSykgaXMgZGVyaXZlZCBmcm9tIFN5c3RlbSBjbG9jayB0aHJvdWdoIGNvbmZpZ3VyYWJsZQorICAgICAgICAgIHByZXNjYWxlciBhbmQgdXNlZCB0byBjbG9jayB0aGUgQ1BVLCBtZW1vcnkgYW5kIHBlcmlwaGVyYWxzIG1hcHBlZAorICAgICAgICAgIG9uIEFIQiBidXMgKERNQSwgR1BJTy4uLikuIEFQQjEgKFBDTEsxKSBhbmQgQVBCMiAoUENMSzIpIGNsb2NrcyBhcmUgZGVyaXZlZAorICAgICAgICAgIGZyb20gQUhCIGNsb2NrIHRocm91Z2ggY29uZmlndXJhYmxlIHByZXNjYWxlcnMgYW5kIHVzZWQgdG8gY2xvY2sKKyAgICAgICAgICB0aGUgcGVyaXBoZXJhbHMgbWFwcGVkIG9uIHRoZXNlIGJ1c2VzLiBZb3UgY2FuIHVzZQorICAgICAgICAgICJAcmVmIEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCkiIGZ1bmN0aW9uIHRvIHJldHJpZXZlIHRoZSBmcmVxdWVuY2llcyBvZiB0aGVzZSBjbG9ja3MuCisKKyAgICAgICgjKSBBbGwgdGhlIHBlcmlwaGVyYWwgY2xvY2tzIGFyZSBkZXJpdmVkIGZyb20gdGhlIFN5c3RlbSBjbG9jayAoU1lTQ0xLKSBleGNlcHQ6CisgICAgICAgICgrKykgVGhlIEZMQVNIIHByb2dyYW0vZXJhc2UgY2xvY2sgIHdoaWNoIGlzIGFsd2F5cyBIU0kgOE1IeiBjbG9jay4KKyAgICAgICAgKCsrKSBUaGUgVVNCIDQ4IE1IeiBjbG9jayB3aGljaCBpcyBkZXJpdmVkIGZyb20gdGhlIFBMTCBWQ08gY2xvY2suCisgICAgICAgICgrKykgVGhlIFVTQVJUIGNsb2NrIHdoaWNoIGNhbiBiZSBkZXJpdmVkIGFzIHdlbGwgZnJvbSBIU0kgOE1IeiwgTFNJIG9yIExTRS4KKyAgICAgICAgKCsrKSBUaGUgSTJDIGNsb2NrIHdoaWNoIGNhbiBiZSBkZXJpdmVkIGFzIHdlbGwgZnJvbSBIU0kgOE1IeiBjbG9jay4KKyAgICAgICAgKCsrKSBUaGUgQURDIGNsb2NrIHdoaWNoIGlzIGRlcml2ZWQgZnJvbSBQTEwgb3V0cHV0LgorICAgICAgICAoKyspIFRoZSBSVEMgY2xvY2sgd2hpY2ggaXMgZGVyaXZlZCBmcm9tIHRoZSBMU0UsIExTSSBvciAxIE1IeiBIU0VfUlRDCisgICAgICAgICAgICAgKEhTRSBkaXZpZGVkIGJ5IGEgcHJvZ3JhbW1hYmxlIHByZXNjYWxlcikuIFRoZSBTeXN0ZW0gY2xvY2sgKFNZU0NMSykKKyAgICAgICAgICAgICBmcmVxdWVuY3kgbXVzdCBiZSBoaWdoZXIgb3IgZXF1YWwgdG8gdGhlIFJUQyBjbG9jayBmcmVxdWVuY3kuCisgICAgICAgICgrKykgSVdERyBjbG9jayB3aGljaCBpcyBhbHdheXMgdGhlIExTSSBjbG9jay4KKworICAgICAgICAgKCMpIEZvciB0aGUgU1RNMzJGM3h4IGRldmljZXMsIHRoZSBtYXhpbXVtIGZyZXF1ZW5jeSBvZiB0aGUgU1lTQ0xLLCBIQ0xLLCBQQ0xLMSBhbmQgUENMSzIgaXMgNzIgTUh6LAorICAgICAgICAgICAgIERlcGVuZGluZyBvbiB0aGUgU1lTQ0xLIGZyZXF1ZW5jeSwgdGhlIGZsYXNoIGxhdGVuY3kgc2hvdWxkIGJlIGFkYXB0ZWQgYWNjb3JkaW5nbHkuCisKKyAgICAgICAgICgjKSBBZnRlciByZXNldCwgdGhlIFN5c3RlbSBjbG9jayBzb3VyY2UgaXMgdGhlIEhTSSAoOCBNSHopIHdpdGggMCBXUyBhbmQKKyAgICAgICAgICAgICBwcmVmZXRjaCBpcyBkaXNhYmxlZC4KKyAgQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKyAgCisvKgorICBBZGRpdGlvbmFsIGNvbnNpZGVyYXRpb24gb24gdGhlIFNZU0NMSyBiYXNlZCBvbiBMYXRlbmN5IHNldHRpbmdzOgorICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgIHwgTGF0ZW5jeSAgICAgICB8IFNZU0NMSyBjbG9jayBmcmVxdWVuY3kgKE1IeikgIHwKKyAgICAgICAgfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAgICB8MFdTKDFDUFUgY3ljbGUpfCAgICAgICAwIDwgU1lTQ0xLIDw9IDI0ICAgICAgICB8CisgICAgICAgIHwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgICAgfDFXUygyQ1BVIGN5Y2xlKXwgICAgICAyNCA8IFNZU0NMSyA8PSA0OCAgICAgICAgfAorICAgICAgICB8LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICAgIHwyV1MoM0NQVSBjeWNsZSl8ICAgICAgNDggPCBTWVNDTEsgPD0gNzIgICAgICAgIHwKKyAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJlc2V0cyB0aGUgUkNDIGNsb2NrIGNvbmZpZ3VyYXRpb24gdG8gdGhlIGRlZmF1bHQgcmVzZXQgc3RhdGUuCisgICogQG5vdGUgICBUaGUgZGVmYXVsdCByZXNldCBzdGF0ZSBvZiB0aGUgY2xvY2sgY29uZmlndXJhdGlvbiBpcyBnaXZlbiBiZWxvdzoKKyAgKiAgICAgICAgICAgIC0gSFNJIE9OIGFuZCB1c2VkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UKKyAgKiAgICAgICAgICAgIC0gSFNFIGFuZCBQTEwgT0ZGCisgICogICAgICAgICAgICAtIEFIQiwgQVBCMSBhbmQgQVBCMiBwcmVzY2FsZXIgc2V0IHRvIDEuCisgICogICAgICAgICAgICAtIENTUyBhbmQgTUNPMSBPRkYKKyAgKiAgICAgICAgICAgIC0gQWxsIGludGVycnVwdHMgZGlzYWJsZWQKKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgbW9kaWZ5IHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZQorICAqICAgICAgICAgICAgLSBQZXJpcGhlcmFsIGNsb2NrcworICAqICAgICAgICAgICAgLSBMU0ksIExTRSBhbmQgUlRDIGNsb2NrcworICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JDQ19EZUluaXQodm9pZCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gMDsKKworICAvKiBTZXQgSFNJT04gYml0ICovCisgIFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSU9OKTsKKworICAvKiBJbnN1cmUgSFNJUkRZIGJpdCBpcyBzZXQgYmVmb3JlIHdyaXRpbmcgZGVmYXVsdCBIU0lUUklNIHZhbHVlICovCisgIC8qIEdldCBzdGFydCB0aWNrICovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCB0aWxsIEhTSSBpcyByZWFkeSAqLworICB3aGlsZShSRUFEX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSA9PSBSRVNFVCkKKyAgeworICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IEhTSV9USU1FT1VUX1ZBTFVFKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKworICAvKiBTZXQgSFNJVFJJTSBkZWZhdWx0IHZhbHVlICovCisgIE1PRElGWV9SRUcoUkNDLT5DUiwgUkNDX0NSX0hTSVRSSU0sIFJDQ19DUl9IU0lUUklNXzQpOworCisgIC8qIFJlc2V0IFNXWzE6MF0sIEhQUkVbMzowXSwgUFBSRTFbMjowXSwgUFBSRTJbMjowXSBhbmQgTUNPU0VMWzI6MF0gYml0cyAqLworICBDTEVBUl9CSVQoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9TVyB8IFJDQ19DRkdSX0hQUkUgfCBSQ0NfQ0ZHUl9QUFJFMSB8IFJDQ19DRkdSX1BQUkUyIHwgUkNDX0NGR1JfTUNPKTsKKworICAvKiBJbnN1cmUgSFNJIHNlbGVjdGVkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UgKi8KKyAgLyogR2V0IHN0YXJ0IHRpY2sgKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBXYWl0IHRpbGwgc3lzdGVtIGNsb2NrIHNvdXJjZSBpcyByZWFkeSAqLworICB3aGlsZShSRUFEX0JJVChSQ0MtPkNGR1IsIFJDQ19DRkdSX1NXUykgIT0gUkNDX0NGR1JfU1dTX0hTSSkKKyAgeworICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IENMT0NLU1dJVENIX1RJTUVPVVRfVkFMVUUpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorCisgIC8qIFVwZGF0ZSB0aGUgU3lzdGVtQ29yZUNsb2NrIGdsb2JhbCB2YXJpYWJsZSBmb3IgSFNJIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UgKi8KKyAgU3lzdGVtQ29yZUNsb2NrID0gSFNJX1ZBTFVFOworCisgIC8qIENvbmZpZ3VyZSB0aGUgc291cmNlIG9mIHRpbWUgYmFzZSBjb25zaWRlcmluZyBuZXcgc3lzdGVtIGNsb2NrIHNldHRpbmdzICAqLworICBpZihIQUxfSW5pdFRpY2soVElDS19JTlRfUFJJT1JJVFkpICE9IEhBTF9PSykKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZXNldCBIU0VPTiwgQ1NTT04sIFBMTE9OIGJpdHMgKi8KKyAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9QTExPTiB8IFJDQ19DUl9DU1NPTiB8IFJDQ19DUl9IU0VPTik7CisKKyAgLyogUmVzZXQgSFNFQllQIGJpdCAqLworICBDTEVBUl9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTRUJZUCk7CisKKyAgLyogSW5zdXJlIFBMTFJEWSBpcyByZXNldCAqLworICAvKiBHZXQgc3RhcnQgdGljayAqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICB3aGlsZShSRUFEX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfUExMUkRZKSAhPSAwVSkKKyAgeworICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFBMTF9USU1FT1VUX1ZBTFVFKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKworICAvKiBSZXNldCBDRkdSIHJlZ2lzdGVyICovCisgIENMRUFSX1JFRyhSQ0MtPkNGR1IpOworCisgIC8qIFJlc2V0IENGR1IyIHJlZ2lzdGVyICovCisgIENMRUFSX1JFRyhSQ0MtPkNGR1IyKTsKKworICAvKiBSZXNldCBDRkdSMyByZWdpc3RlciAqLworICBDTEVBUl9SRUcoUkNDLT5DRkdSMyk7CisKKyAgLyogQ2xlYXIgYWxsIGludGVycnVwdCBmbGFncyAqLworICBTRVRfQklUKFJDQy0+Q0lSLCBSQ0NfQ0lSX0xTSVJEWUMgfCBSQ0NfQ0lSX0xTRVJEWUMgfCBSQ0NfQ0lSX0hTSVJEWUMgfCBSQ0NfQ0lSX0hTRVJEWUMgfCBSQ0NfQ0lSX1BMTFJEWUMgfCBSQ0NfQ0lSX0NTU0MpOworCisgIC8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfUkVHKFJDQy0+Q0lSKTsKKworICAvKiBSZXNldCBhbGwgQ1NSIGZsYWdzICovCisgIF9fSEFMX1JDQ19DTEVBUl9SRVNFVF9GTEFHUygpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFJDQyBPc2NpbGxhdG9ycyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIHRoZQorICAqICAgICAgICAgUkNDX09zY0luaXRUeXBlRGVmLgorICAqIEBwYXJhbSAgUkNDX09zY0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhbiBSQ0NfT3NjSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgUkNDIE9zY2lsbGF0b3JzLgorICAqIEBub3RlICAgVGhlIFBMTCBpcyBub3QgZGlzYWJsZWQgd2hlbiB1c2VkIGFzIHN5c3RlbSBjbG9jay4KKyAgKiBAbm90ZSAgIFRyYW5zaXRpb25zIExTRSBCeXBhc3MgdG8gTFNFIE9uIGFuZCBMU0UgT24gdG8gTFNFIEJ5cGFzcyBhcmUgbm90CisgICogICAgICAgICBzdXBwb3J0ZWQgYnkgdGhpcyBtYWNyby4gVXNlciBzaG91bGQgcmVxdWVzdCBhIHRyYW5zaXRpb24gdG8gTFNFIE9mZgorICAqICAgICAgICAgZmlyc3QgYW5kIHRoZW4gTFNFIE9uIG9yIExTRSBCeXBhc3MuCisgICogQG5vdGUgICBUcmFuc2l0aW9uIEhTRSBCeXBhc3MgdG8gSFNFIE9uIGFuZCBIU0UgT24gdG8gSFNFIEJ5cGFzcyBhcmUgbm90CisgICogICAgICAgICBzdXBwb3J0ZWQgYnkgdGhpcyBtYWNyby4gVXNlciBzaG91bGQgcmVxdWVzdCBhIHRyYW5zaXRpb24gdG8gSFNFIE9mZgorICAqICAgICAgICAgZmlyc3QgYW5kIHRoZW4gSFNFIE9uIG9yIEhTRSBCeXBhc3MuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUkNDX09zY0NvbmZpZyhSQ0NfT3NjSW5pdFR5cGVEZWYgICpSQ0NfT3NjSW5pdFN0cnVjdCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIENoZWNrIE51bGwgcG9pbnRlciAqLworICBpZihSQ0NfT3NjSW5pdFN0cnVjdCA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SQ0NfT1NDSUxMQVRPUlRZUEUoUkNDX09zY0luaXRTdHJ1Y3QtPk9zY2lsbGF0b3JUeXBlKSk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhTRSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorICBpZigoKFJDQ19Pc2NJbml0U3RydWN0LT5Pc2NpbGxhdG9yVHlwZSkgJiBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNFKSA9PSBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNFKQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX0hTRShSQ0NfT3NjSW5pdFN0cnVjdC0+SFNFU3RhdGUpKTsKKworICAgIC8qIFdoZW4gdGhlIEhTRSBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jayBvciBjbG9jayBzb3VyY2UgZm9yIFBMTCBpbiB0aGVzZSBjYXNlcyBpdCBpcyBub3QgYWxsb3dlZCB0byBiZSBkaXNhYmxlZCAqLworICAgIGlmKChfX0hBTF9SQ0NfR0VUX1NZU0NMS19TT1VSQ0UoKSA9PSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19IU0UpIAorICAgICAgIHx8ICgoX19IQUxfUkNDX0dFVF9TWVNDTEtfU09VUkNFKCkgPT0gUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfUExMQ0xLKSAmJiAoX19IQUxfUkNDX0dFVF9QTExfT1NDU09VUkNFKCkgPT0gUkNDX1BMTFNPVVJDRV9IU0UpKSkKKyAgICB7CisgICAgICBpZigoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX0hTRVJEWSkgIT0gUkVTRVQpICYmIChSQ0NfT3NjSW5pdFN0cnVjdC0+SFNFU3RhdGUgPT0gUkNDX0hTRV9PRkYpKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogU2V0IHRoZSBuZXcgSFNFIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgIF9fSEFMX1JDQ19IU0VfQ09ORklHKFJDQ19Pc2NJbml0U3RydWN0LT5IU0VTdGF0ZSk7CisgICAgICAKKyNpZiBkZWZpbmVkKFJDQ19DRkdSX1BMTFNSQ19IU0lfRElWMikKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgSFNFIHByZWRpdmlzaW9uIGZhY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICBfX0hBTF9SQ0NfSFNFX1BSRURJVl9DT05GSUcoUkNDX09zY0luaXRTdHJ1Y3QtPkhTRVByZWRpdlZhbHVlKTsKKyNlbmRpZiAvKiBSQ0NfQ0ZHUl9QTExTUkNfSFNJX0RJVjIgKi8KKworICAgICAgIC8qIENoZWNrIHRoZSBIU0UgU3RhdGUgKi8KKyAgICAgIGlmKFJDQ19Pc2NJbml0U3RydWN0LT5IU0VTdGF0ZSAhPSBSQ0NfSFNFX09GRikKKyAgICAgIHsKKyAgICAgICAgLyogR2V0IFN0YXJ0IFRpY2sgKi8KKyAgICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICAgICAgCisgICAgICAgIC8qIFdhaXQgdGlsbCBIU0UgaXMgcmVhZHkgKi8KKyAgICAgICAgd2hpbGUoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX0hTRVJEWSkgPT0gUkVTRVQpCisgICAgICAgIHsKKyAgICAgICAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gSFNFX1RJTUVPVVRfVkFMVUUpCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBHZXQgU3RhcnQgVGljayAqLworICAgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgICAgICAKKyAgICAgICAgLyogV2FpdCB0aWxsIEhTRSBpcyBkaXNhYmxlZCAqLworICAgICAgICB3aGlsZShfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfSFNFUkRZKSAhPSBSRVNFVCkKKyAgICAgICAgeworICAgICAgICAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gSFNFX1RJTUVPVVRfVkFMVUUpCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhTSSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisgIGlmKCgoUkNDX09zY0luaXRTdHJ1Y3QtPk9zY2lsbGF0b3JUeXBlKSAmIFJDQ19PU0NJTExBVE9SVFlQRV9IU0kpID09IFJDQ19PU0NJTExBVE9SVFlQRV9IU0kpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfSFNJKFJDQ19Pc2NJbml0U3RydWN0LT5IU0lTdGF0ZSkpOworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfQ0FMSUJSQVRJT05fVkFMVUUoUkNDX09zY0luaXRTdHJ1Y3QtPkhTSUNhbGlicmF0aW9uVmFsdWUpKTsKKyAgICAKKyAgICAvKiBDaGVjayBpZiBIU0kgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgb3IgYXMgUExMIHNvdXJjZSB3aGVuIFBMTCBpcyBzZWxlY3RlZCBhcyBzeXN0ZW0gY2xvY2sgKi8gCisgICAgaWYoKF9fSEFMX1JDQ19HRVRfU1lTQ0xLX1NPVVJDRSgpID09IFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX0hTSSkgCisgICAgICAgfHwgKChfX0hBTF9SQ0NfR0VUX1NZU0NMS19TT1VSQ0UoKSA9PSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19QTExDTEspICYmIChfX0hBTF9SQ0NfR0VUX1BMTF9PU0NTT1VSQ0UoKSA9PSBSQ0NfUExMU09VUkNFX0hTSSkpKQorICAgIHsKKyAgICAgIC8qIFdoZW4gSFNJIGlzIHVzZWQgYXMgc3lzdGVtIGNsb2NrIGl0IHdpbGwgbm90IGRpc2FibGVkICovCisgICAgICBpZigoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX0hTSVJEWSkgIT0gUkVTRVQpICYmIChSQ0NfT3NjSW5pdFN0cnVjdC0+SFNJU3RhdGUgIT0gUkNDX0hTSV9PTikpCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICAvKiBPdGhlcndpc2UsIGp1c3QgdGhlIGNhbGlicmF0aW9uIGlzIGFsbG93ZWQgKi8KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogQWRqdXN0cyB0aGUgSW50ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0kpIGNhbGlicmF0aW9uIHZhbHVlLiovCisgICAgICAgIF9fSEFMX1JDQ19IU0lfQ0FMSUJSQVRJT05WQUxVRV9BREpVU1QoUkNDX09zY0luaXRTdHJ1Y3QtPkhTSUNhbGlicmF0aW9uVmFsdWUpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIEhTSSBTdGF0ZSAqLworICAgICAgaWYoUkNDX09zY0luaXRTdHJ1Y3QtPkhTSVN0YXRlICE9IFJDQ19IU0lfT0ZGKQorICAgICAgeworICAgICAgIC8qIEVuYWJsZSB0aGUgSW50ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0kpLiAqLworICAgICAgICBfX0hBTF9SQ0NfSFNJX0VOQUJMRSgpOworICAgICAgICAKKyAgICAgICAgLyogR2V0IFN0YXJ0IFRpY2sgKi8KKyAgICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICAgICAgCisgICAgICAgIC8qIFdhaXQgdGlsbCBIU0kgaXMgcmVhZHkgKi8KKyAgICAgICAgd2hpbGUoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX0hTSVJEWSkgPT0gUkVTRVQpCisgICAgICAgIHsKKyAgICAgICAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gSFNJX1RJTUVPVVRfVkFMVUUpCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAvKiBBZGp1c3RzIHRoZSBJbnRlcm5hbCBIaWdoIFNwZWVkIG9zY2lsbGF0b3IgKEhTSSkgY2FsaWJyYXRpb24gdmFsdWUuKi8KKyAgICAgICAgX19IQUxfUkNDX0hTSV9DQUxJQlJBVElPTlZBTFVFX0FESlVTVChSQ0NfT3NjSW5pdFN0cnVjdC0+SFNJQ2FsaWJyYXRpb25WYWx1ZSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIEludGVybmFsIEhpZ2ggU3BlZWQgb3NjaWxsYXRvciAoSFNJKS4gKi8KKyAgICAgICAgX19IQUxfUkNDX0hTSV9ESVNBQkxFKCk7CisgICAgICAgIAorICAgICAgICAvKiBHZXQgU3RhcnQgVGljayAqLworICAgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgICAgICAKKyAgICAgICAgLyogV2FpdCB0aWxsIEhTSSBpcyBkaXNhYmxlZCAqLworICAgICAgICB3aGlsZShfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfSFNJUkRZKSAhPSBSRVNFVCkKKyAgICAgICAgeworICAgICAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBIU0lfVElNRU9VVF9WQUxVRSkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExTSSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKyAgaWYoKChSQ0NfT3NjSW5pdFN0cnVjdC0+T3NjaWxsYXRvclR5cGUpICYgUkNDX09TQ0lMTEFUT1JUWVBFX0xTSSkgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX0xTSSkKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19MU0koUkNDX09zY0luaXRTdHJ1Y3QtPkxTSVN0YXRlKSk7CisgICAgCisgICAgLyogQ2hlY2sgdGhlIExTSSBTdGF0ZSAqLworICAgIGlmKFJDQ19Pc2NJbml0U3RydWN0LT5MU0lTdGF0ZSAhPSBSQ0NfTFNJX09GRikKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIEludGVybmFsIExvdyBTcGVlZCBvc2NpbGxhdG9yIChMU0kpLiAqLworICAgICAgX19IQUxfUkNDX0xTSV9FTkFCTEUoKTsKKyAgICAgIAorICAgICAgLyogR2V0IFN0YXJ0IFRpY2sgKi8KKyAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgICAgICAKKyAgICAgIC8qIFdhaXQgdGlsbCBMU0kgaXMgcmVhZHkgKi8gIAorICAgICAgd2hpbGUoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX0xTSVJEWSkgPT0gUkVTRVQpCisgICAgICB7CisgICAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBMU0lfVElNRU9VVF9WQUxVRSkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgSW50ZXJuYWwgTG93IFNwZWVkIG9zY2lsbGF0b3IgKExTSSkuICovCisgICAgICBfX0hBTF9SQ0NfTFNJX0RJU0FCTEUoKTsKKyAgICAgIAorICAgICAgLyogR2V0IFN0YXJ0IFRpY2sgKi8KKyAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgICAgICAKKyAgICAgIC8qIFdhaXQgdGlsbCBMU0kgaXMgZGlzYWJsZWQgKi8gIAorICAgICAgd2hpbGUoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX0xTSVJEWSkgIT0gUkVTRVQpCisgICAgICB7CisgICAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBMU0lfVElNRU9VVF9WQUxVRSkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMU0UgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisgIGlmKCgoUkNDX09zY0luaXRTdHJ1Y3QtPk9zY2lsbGF0b3JUeXBlKSAmIFJDQ19PU0NJTExBVE9SVFlQRV9MU0UpID09IFJDQ19PU0NJTExBVE9SVFlQRV9MU0UpCisgIHsKKyAgICBGbGFnU3RhdHVzICAgICAgIHB3cmNsa2NoYW5nZWQgPSBSRVNFVDsKKyAgICAKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfTFNFKFJDQ19Pc2NJbml0U3RydWN0LT5MU0VTdGF0ZSkpOworCisgICAgLyogVXBkYXRlIExTRSBjb25maWd1cmF0aW9uIGluIEJhY2t1cCBEb21haW4gY29udHJvbCByZWdpc3RlciAgICAqLworICAgIC8qIFJlcXVpcmVzIHRvIGVuYWJsZSB3cml0ZSBhY2Nlc3MgdG8gQmFja3VwIERvbWFpbiBvZiBuZWNlc3NhcnkgKi8KKyAgICBpZihfX0hBTF9SQ0NfUFdSX0lTX0NMS19ESVNBQkxFRCgpKQorICAgIHsKKyAgICAgIF9fSEFMX1JDQ19QV1JfQ0xLX0VOQUJMRSgpOworICAgICAgcHdyY2xrY2hhbmdlZCA9IFNFVDsKKyAgICB9CisgICAgCisgICAgaWYoSEFMX0lTX0JJVF9DTFIoUFdSLT5DUiwgUFdSX0NSX0RCUCkpCisgICAgeworICAgICAgLyogRW5hYmxlIHdyaXRlIGFjY2VzcyB0byBCYWNrdXAgZG9tYWluICovCisgICAgICBTRVRfQklUKFBXUi0+Q1IsIFBXUl9DUl9EQlApOworICAgICAgCisgICAgICAvKiBXYWl0IGZvciBCYWNrdXAgZG9tYWluIFdyaXRlIHByb3RlY3Rpb24gZGlzYWJsZSAqLworICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgICAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoUFdSLT5DUiwgUFdSX0NSX0RCUCkpCisgICAgICB7CisgICAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFJDQ19EQlBfVElNRU9VVF9WQUxVRSkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIFNldCB0aGUgbmV3IExTRSBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBfX0hBTF9SQ0NfTFNFX0NPTkZJRyhSQ0NfT3NjSW5pdFN0cnVjdC0+TFNFU3RhdGUpOworICAgIC8qIENoZWNrIHRoZSBMU0UgU3RhdGUgKi8KKyAgICBpZihSQ0NfT3NjSW5pdFN0cnVjdC0+TFNFU3RhdGUgIT0gUkNDX0xTRV9PRkYpCisgICAgeworICAgICAgLyogR2V0IFN0YXJ0IFRpY2sgKi8KKyAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgICAgICAKKyAgICAgIC8qIFdhaXQgdGlsbCBMU0UgaXMgcmVhZHkgKi8gIAorICAgICAgd2hpbGUoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX0xTRVJEWSkgPT0gUkVTRVQpCisgICAgICB7CisgICAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBSQ0NfTFNFX1RJTUVPVVRfVkFMVUUpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIEdldCBTdGFydCBUaWNrICovCisgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgICAgCisgICAgICAvKiBXYWl0IHRpbGwgTFNFIGlzIGRpc2FibGVkICovICAKKyAgICAgIHdoaWxlKF9fSEFMX1JDQ19HRVRfRkxBRyhSQ0NfRkxBR19MU0VSRFkpICE9IFJFU0VUKQorICAgICAgeworICAgICAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gUkNDX0xTRV9USU1FT1VUX1ZBTFVFKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyogUmVxdWlyZSB0byBkaXNhYmxlIHBvd2VyIGNsb2NrIGlmIG5lY2Vzc2FyeSAqLworICAgIGlmKHB3cmNsa2NoYW5nZWQgPT0gU0VUKQorICAgIHsKKyAgICAgIF9fSEFMX1JDQ19QV1JfQ0xLX0RJU0FCTEUoKTsKKyAgICB9CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBMTCBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QTEwoUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExTdGF0ZSkpOworICBpZiAoKFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMU3RhdGUpICE9IFJDQ19QTExfTk9ORSkKKyAgeworICAgIC8qIENoZWNrIGlmIHRoZSBQTEwgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgb3Igbm90ICovCisgICAgaWYoX19IQUxfUkNDX0dFVF9TWVNDTEtfU09VUkNFKCkgIT0gUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfUExMQ0xLKQorICAgIHsgCisgICAgICBpZigoUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExTdGF0ZSkgPT0gUkNDX1BMTF9PTikKKyAgICAgIHsKKyAgICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QTExTT1VSQ0UoUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExTb3VyY2UpKTsKKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QTExfTVVMKFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMTVVMKSk7CisjaWYgICBkZWZpbmVkKFJDQ19DRkdSX1BMTFNSQ19IU0lfUFJFRElWKQorICAgICAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BSRURJVihSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBSRURJVikpOworI2VuZGlmCisgIAorICAgICAgICAvKiBEaXNhYmxlIHRoZSBtYWluIFBMTC4gKi8KKyAgICAgICAgX19IQUxfUkNDX1BMTF9ESVNBQkxFKCk7CisgICAgICAgIAorICAgICAgICAvKiBHZXQgU3RhcnQgVGljayAqLworICAgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgICAgICAKKyAgICAgICAgLyogV2FpdCB0aWxsIFBMTCBpcyBkaXNhYmxlZCAqLworICAgICAgICB3aGlsZShfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfUExMUkRZKSAgIT0gUkVTRVQpCisgICAgICAgIHsKKyAgICAgICAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gUExMX1RJTUVPVVRfVkFMVUUpCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUl9QTExTUkNfSFNJX1BSRURJVikKKyAgICAgICAgLyogQ29uZmlndXJlIHRoZSBtYWluIFBMTCBjbG9jayBzb3VyY2UsIHByZWRpdmlkZXIgYW5kIG11bHRpcGxpY2F0aW9uIGZhY3Rvci4gKi8KKyAgICAgICAgX19IQUxfUkNDX1BMTF9DT05GSUcoUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUFJFRElWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTE1VTCk7CisjZWxzZQorICAgICAgLyogQ29uZmlndXJlIHRoZSBtYWluIFBMTCBjbG9jayBzb3VyY2UgYW5kIG11bHRpcGxpY2F0aW9uIGZhY3Rvci4gKi8KKyAgICAgIF9fSEFMX1JDQ19QTExfQ09ORklHKFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExNVUwpOworI2VuZGlmIC8qIFJDQ19DRkdSX1BMTFNSQ19IU0lfUFJFRElWICovCisgICAgICAgIC8qIEVuYWJsZSB0aGUgbWFpbiBQTEwuICovCisgICAgICAgIF9fSEFMX1JDQ19QTExfRU5BQkxFKCk7CisgICAgICAgIAorICAgICAgICAvKiBHZXQgU3RhcnQgVGljayAqLworICAgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgICAgICAKKyAgICAgICAgLyogV2FpdCB0aWxsIFBMTCBpcyByZWFkeSAqLworICAgICAgICB3aGlsZShfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfUExMUkRZKSAgPT0gUkVTRVQpCisgICAgICAgIHsKKyAgICAgICAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gUExMX1RJTUVPVVRfVkFMVUUpCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBtYWluIFBMTC4gKi8KKyAgICAgICAgX19IQUxfUkNDX1BMTF9ESVNBQkxFKCk7CisgCisgICAgICAgIC8qIEdldCBTdGFydCBUaWNrICovCisgICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgICAgICAgIAorICAgICAgICAvKiBXYWl0IHRpbGwgUExMIGlzIGRpc2FibGVkICovICAKKyAgICAgICAgd2hpbGUoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX1BMTFJEWSkgICE9IFJFU0VUKQorICAgICAgICB7CisgICAgICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFBMTF9USU1FT1VUX1ZBTFVFKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICB9CisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBDUFUsIEFIQiBhbmQgQVBCIGJ1c2VzIGNsb2NrcyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCAKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFJDQ19DbGtJbml0U3RydWN0LgorICAqIEBwYXJhbSAgUkNDX0Nsa0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhbiBSQ0NfT3NjSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgUkNDIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBGTGF0ZW5jeSBGTEFTSCBMYXRlbmN5ICAgICAgICAgICAgICAgICAgIAorICAqICAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGlzIHBhcmFtZXRlciBkZXBlbmQgb24gZGV2aWNlIHVzZWQgd2l0aGluIHRoZSBzYW1lIHNlcmllcworICAqIEBub3RlICAgVGhlIFN5c3RlbUNvcmVDbG9jayBDTVNJUyB2YXJpYWJsZSBpcyB1c2VkIHRvIHN0b3JlIFN5c3RlbSBDbG9jayBGcmVxdWVuY3kgCisgICogICAgICAgICBhbmQgdXBkYXRlZCBieSBAcmVmIEhBTF9SQ0NfR2V0SENMS0ZyZXEoKSBmdW5jdGlvbiBjYWxsZWQgd2l0aGluIHRoaXMgZnVuY3Rpb24KKyAgKgorICAqIEBub3RlICAgVGhlIEhTSSBpcyB1c2VkIChlbmFibGVkIGJ5IGhhcmR3YXJlKSBhcyBzeXN0ZW0gY2xvY2sgc291cmNlIGFmdGVyCisgICogICAgICAgICBzdGFydC11cCBmcm9tIFJlc2V0LCB3YWtlLXVwIGZyb20gU1RPUCBhbmQgU1RBTkRCWSBtb2RlLCBvciBpbiBjYXNlCisgICogICAgICAgICBvZiBmYWlsdXJlIG9mIHRoZSBIU0UgdXNlZCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGFzIHN5c3RlbSBjbG9jaworICAqICAgICAgICAgKGlmIHRoZSBDbG9jayBTZWN1cml0eSBTeXN0ZW0gQ1NTIGlzIGVuYWJsZWQpLgorICAqICAgICAgICAgICAKKyAgKiBAbm90ZSAgIEEgc3dpdGNoIGZyb20gb25lIGNsb2NrIHNvdXJjZSB0byBhbm90aGVyIG9jY3VycyBvbmx5IGlmIHRoZSB0YXJnZXQKKyAgKiAgICAgICAgIGNsb2NrIHNvdXJjZSBpcyByZWFkeSAoY2xvY2sgc3RhYmxlIGFmdGVyIHN0YXJ0LXVwIGRlbGF5IG9yIFBMTCBsb2NrZWQpLiAKKyAgKiAgICAgICAgIElmIGEgY2xvY2sgc291cmNlIHdoaWNoIGlzIG5vdCB5ZXQgcmVhZHkgaXMgc2VsZWN0ZWQsIHRoZSBzd2l0Y2ggd2lsbAorICAqICAgICAgICAgb2NjdXIgd2hlbiB0aGUgY2xvY2sgc291cmNlIHdpbGwgYmUgcmVhZHkuIAorICAqICAgICAgICAgWW91IGNhbiB1c2UgQHJlZiBIQUxfUkNDX0dldENsb2NrQ29uZmlnKCkgZnVuY3Rpb24gdG8ga25vdyB3aGljaCBjbG9jayBpcworICAqICAgICAgICAgY3VycmVudGx5IHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SQ0NfQ2xvY2tDb25maWcoUkNDX0Nsa0luaXRUeXBlRGVmICAqUkNDX0Nsa0luaXRTdHJ1Y3QsIHVpbnQzMl90IEZMYXRlbmN5KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKworICAvKiBDaGVjayBOdWxsIHBvaW50ZXIgKi8KKyAgaWYoUkNDX0Nsa0luaXRTdHJ1Y3QgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUkNDX0NMT0NLVFlQRShSQ0NfQ2xrSW5pdFN0cnVjdC0+Q2xvY2tUeXBlKSk7CisgIGFzc2VydF9wYXJhbShJU19GTEFTSF9MQVRFTkNZKEZMYXRlbmN5KSk7CisKKyAgLyogVG8gY29ycmVjdGx5IHJlYWQgZGF0YSBmcm9tIEZMQVNIIG1lbW9yeSwgdGhlIG51bWJlciBvZiB3YWl0IHN0YXRlcyAoTEFURU5DWSkgCisgIG11c3QgYmUgY29ycmVjdGx5IHByb2dyYW1tZWQgYWNjb3JkaW5nIHRvIHRoZSBmcmVxdWVuY3kgb2YgdGhlIENQVSBjbG9jayAKKyAgICAoSENMSykgb2YgdGhlIGRldmljZS4gKi8KKworICAvKiBJbmNyZWFzaW5nIHRoZSBudW1iZXIgb2Ygd2FpdCBzdGF0ZXMgYmVjYXVzZSBvZiBoaWdoZXIgQ1BVIGZyZXF1ZW5jeSAqLworICBpZihGTGF0ZW5jeSA+IF9fSEFMX0ZMQVNIX0dFVF9MQVRFTkNZKCkpCisgIHsgICAgCisgICAgLyogUHJvZ3JhbSB0aGUgbmV3IG51bWJlciBvZiB3YWl0IHN0YXRlcyB0byB0aGUgTEFURU5DWSBiaXRzIGluIHRoZSBGTEFTSF9BQ1IgcmVnaXN0ZXIgKi8KKyAgICBfX0hBTF9GTEFTSF9TRVRfTEFURU5DWShGTGF0ZW5jeSk7CisgICAgCisgICAgLyogQ2hlY2sgdGhhdCB0aGUgbmV3IG51bWJlciBvZiB3YWl0IHN0YXRlcyBpcyB0YWtlbiBpbnRvIGFjY291bnQgdG8gYWNjZXNzIHRoZSBGbGFzaAorICAgIG1lbW9yeSBieSByZWFkaW5nIHRoZSBGTEFTSF9BQ1IgcmVnaXN0ZXIgKi8KKyAgICBpZihfX0hBTF9GTEFTSF9HRVRfTEFURU5DWSgpICE9IEZMYXRlbmN5KQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIQ0xLIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZigoKFJDQ19DbGtJbml0U3RydWN0LT5DbG9ja1R5cGUpICYgUkNDX0NMT0NLVFlQRV9IQ0xLKSA9PSBSQ0NfQ0xPQ0tUWVBFX0hDTEspCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX0hDTEsoUkNDX0Nsa0luaXRTdHJ1Y3QtPkFIQkNMS0RpdmlkZXIpKTsKKyAgICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfSFBSRSwgUkNDX0Nsa0luaXRTdHJ1Y3QtPkFIQkNMS0RpdmlkZXIpOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNZU0NMSyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorICBpZigoKFJDQ19DbGtJbml0U3RydWN0LT5DbG9ja1R5cGUpICYgUkNDX0NMT0NLVFlQRV9TWVNDTEspID09IFJDQ19DTE9DS1RZUEVfU1lTQ0xLKQorICB7ICAgIAorICAgIGFzc2VydF9wYXJhbShJU19SQ0NfU1lTQ0xLU09VUkNFKFJDQ19DbGtJbml0U3RydWN0LT5TWVNDTEtTb3VyY2UpKTsKKyAgICAKKyAgICAvKiBIU0UgaXMgc2VsZWN0ZWQgYXMgU3lzdGVtIENsb2NrIFNvdXJjZSAqLworICAgIGlmKFJDQ19DbGtJbml0U3RydWN0LT5TWVNDTEtTb3VyY2UgPT0gUkNDX1NZU0NMS1NPVVJDRV9IU0UpCisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIEhTRSByZWFkeSBmbGFnICovICAKKyAgICAgIGlmKF9fSEFMX1JDQ19HRVRfRkxBRyhSQ0NfRkxBR19IU0VSRFkpID09IFJFU0VUKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgICAvKiBQTEwgaXMgc2VsZWN0ZWQgYXMgU3lzdGVtIENsb2NrIFNvdXJjZSAqLworICAgIGVsc2UgaWYoUkNDX0Nsa0luaXRTdHJ1Y3QtPlNZU0NMS1NvdXJjZSA9PSBSQ0NfU1lTQ0xLU09VUkNFX1BMTENMSykKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgUExMIHJlYWR5IGZsYWcgKi8gIAorICAgICAgaWYoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX1BMTFJEWSkgPT0gUkVTRVQpCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICAgIC8qIEhTSSBpcyBzZWxlY3RlZCBhcyBTeXN0ZW0gQ2xvY2sgU291cmNlICovCisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBIU0kgcmVhZHkgZmxhZyAqLyAgCisgICAgICBpZihfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfSFNJUkRZKSA9PSBSRVNFVCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBfX0hBTF9SQ0NfU1lTQ0xLX0NPTkZJRyhSQ0NfQ2xrSW5pdFN0cnVjdC0+U1lTQ0xLU291cmNlKTsKKworICAgIC8qIEdldCBTdGFydCBUaWNrICovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICAKKyAgICB3aGlsZSAoX19IQUxfUkNDX0dFVF9TWVNDTEtfU09VUkNFKCkgIT0gKFJDQ19DbGtJbml0U3RydWN0LT5TWVNDTEtTb3VyY2UgPDwgUkNDX0NGR1JfU1dTX1BvcykpCisgICAgeworICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IENMT0NLU1dJVENIX1RJTUVPVVRfVkFMVUUpCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogRGVjcmVhc2luZyB0aGUgbnVtYmVyIG9mIHdhaXQgc3RhdGVzIGJlY2F1c2Ugb2YgbG93ZXIgQ1BVIGZyZXF1ZW5jeSAqLworICBpZihGTGF0ZW5jeSA8IF9fSEFMX0ZMQVNIX0dFVF9MQVRFTkNZKCkpCisgIHsgICAgCisgICAgLyogUHJvZ3JhbSB0aGUgbmV3IG51bWJlciBvZiB3YWl0IHN0YXRlcyB0byB0aGUgTEFURU5DWSBiaXRzIGluIHRoZSBGTEFTSF9BQ1IgcmVnaXN0ZXIgKi8KKyAgICBfX0hBTF9GTEFTSF9TRVRfTEFURU5DWShGTGF0ZW5jeSk7CisgICAgCisgICAgLyogQ2hlY2sgdGhhdCB0aGUgbmV3IG51bWJlciBvZiB3YWl0IHN0YXRlcyBpcyB0YWtlbiBpbnRvIGFjY291bnQgdG8gYWNjZXNzIHRoZSBGbGFzaAorICAgIG1lbW9yeSBieSByZWFkaW5nIHRoZSBGTEFTSF9BQ1IgcmVnaXN0ZXIgKi8KKyAgICBpZihfX0hBTF9GTEFTSF9HRVRfTEFURU5DWSgpICE9IEZMYXRlbmN5KQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICB9ICAgIAorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUENMSzEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKyAgaWYoKChSQ0NfQ2xrSW5pdFN0cnVjdC0+Q2xvY2tUeXBlKSAmIFJDQ19DTE9DS1RZUEVfUENMSzEpID09IFJDQ19DTE9DS1RZUEVfUENMSzEpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BDTEsoUkNDX0Nsa0luaXRTdHJ1Y3QtPkFQQjFDTEtEaXZpZGVyKSk7CisgICAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX1BQUkUxLCBSQ0NfQ2xrSW5pdFN0cnVjdC0+QVBCMUNMS0RpdmlkZXIpOworICB9CisgIAorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBDTEsyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisgIGlmKCgoUkNDX0Nsa0luaXRTdHJ1Y3QtPkNsb2NrVHlwZSkgJiBSQ0NfQ0xPQ0tUWVBFX1BDTEsyKSA9PSBSQ0NfQ0xPQ0tUWVBFX1BDTEsyKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QQ0xLKFJDQ19DbGtJbml0U3RydWN0LT5BUEIyQ0xLRGl2aWRlcikpOworICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9QUFJFMiwgKChSQ0NfQ2xrSW5pdFN0cnVjdC0+QVBCMkNMS0RpdmlkZXIpIDw8IDNVKSk7CisgIH0KKyAKKyAgLyogVXBkYXRlIHRoZSBTeXN0ZW1Db3JlQ2xvY2sgZ2xvYmFsIHZhcmlhYmxlICovCisgIFN5c3RlbUNvcmVDbG9jayA9IEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCkgPj4gQUhCUHJlc2NUYWJsZVsoUkNDLT5DRkdSICYgUkNDX0NGR1JfSFBSRSk+PiBSQ0NfQ0ZHUl9IUFJFX0JJVE5VTUJFUl07CisKKyAgLyogQ29uZmlndXJlIHRoZSBzb3VyY2Ugb2YgdGltZSBiYXNlIGNvbnNpZGVyaW5nIG5ldyBzeXN0ZW0gY2xvY2tzIHNldHRpbmdzKi8KKyAgSEFMX0luaXRUaWNrIChUSUNLX0lOVF9QUklPUklUWSk7CisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgUkNDIGNsb2NrcyBjb250cm9sIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbSAgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbnRyb2wgdGhlIFJDQyBDbG9ja3MgCisgICAgZnJlcXVlbmNpZXMuCisKKyAgQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoUkNDX0NGR1JfTUNPUFJFKQorLyoqCisgICogQGJyaWVmICBTZWxlY3RzIHRoZSBjbG9jayBzb3VyY2UgdG8gb3V0cHV0IG9uIE1DTyBwaW4uCisgICogQG5vdGUgICBNQ08gcGluIHNob3VsZCBiZSBjb25maWd1cmVkIGluIGFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlLgorICAqIEBwYXJhbSAgUkNDX01DT3ggc3BlY2lmaWVzIHRoZSBvdXRwdXQgZGlyZWN0aW9uIGZvciB0aGUgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzEgQ2xvY2sgc291cmNlIHRvIG91dHB1dCBvbiBNQ08xIHBpbihQQTgpLgorICAqIEBwYXJhbSAgUkNDX01DT1NvdXJjZSBzcGVjaWZpZXMgdGhlIGNsb2NrIHNvdXJjZSB0byBvdXRwdXQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9OT0NMT0NLICAgICBObyBjbG9jayBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX1NZU0NMSyAgICAgIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcyBNQ08gY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9IU0kgICAgICAgICBIU0kgc2VsZWN0ZWQgYXMgTUNPIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfSFNFICAgICAgICAgSFNFIHNlbGVjdGVkIGFzIE1DTyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX0xTSSAgICAgICAgIExTSSBzZWxlY3RlZCBhcyBNQ08gY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9MU0UgICAgICAgICBMU0Ugc2VsZWN0ZWQgYXMgTUNPIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfUExMQ0xLICAgICAgUExMQ0xLIHNlbGVjdGVkIGFzIE1DTyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX1BMTENMS19ESVYyIFBMTENMSyBEaXZpZGVkIGJ5IDIgc2VsZWN0ZWQgYXMgTUNPIGNsb2NrCisgICogQHBhcmFtICBSQ0NfTUNPRGl2IHNwZWNpZmllcyB0aGUgTUNPIERJVi4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ09ESVZfMSAgIG5vIGRpdmlzaW9uIGFwcGxpZWQgdG8gTUNPIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl8yICAgZGl2aXNpb24gYnkgMiBhcHBsaWVkIHRvIE1DTyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ09ESVZfNCAgIGRpdmlzaW9uIGJ5IDQgYXBwbGllZCB0byBNQ08gY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPRElWXzggICBkaXZpc2lvbiBieSA4IGFwcGxpZWQgdG8gTUNPIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl8xNiAgZGl2aXNpb24gYnkgMTYgYXBwbGllZCB0byBNQ08gY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPRElWXzMyICBkaXZpc2lvbiBieSAzMiBhcHBsaWVkIHRvIE1DTyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ09ESVZfNjQgIGRpdmlzaW9uIGJ5IDY0IGFwcGxpZWQgdG8gTUNPIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl8xMjggZGl2aXNpb24gYnkgMTI4IGFwcGxpZWQgdG8gTUNPIGNsb2NrCisgICogQHJldHZhbCBOb25lCisgICovCisjZWxzZQorLyoqCisgICogQGJyaWVmICBTZWxlY3RzIHRoZSBjbG9jayBzb3VyY2UgdG8gb3V0cHV0IG9uIE1DTyBwaW4uCisgICogQG5vdGUgICBNQ08gcGluIHNob3VsZCBiZSBjb25maWd1cmVkIGluIGFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlLgorICAqIEBwYXJhbSAgUkNDX01DT3ggc3BlY2lmaWVzIHRoZSBvdXRwdXQgZGlyZWN0aW9uIGZvciB0aGUgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzEgQ2xvY2sgc291cmNlIHRvIG91dHB1dCBvbiBNQ08xIHBpbihQQTgpLgorICAqIEBwYXJhbSAgUkNDX01DT1NvdXJjZSBzcGVjaWZpZXMgdGhlIGNsb2NrIHNvdXJjZSB0byBvdXRwdXQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9OT0NMT0NLICAgICBObyBjbG9jayBzZWxlY3RlZCBhcyBNQ08gY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9TWVNDTEsgICAgICBTeXN0ZW0gY2xvY2sgc2VsZWN0ZWQgYXMgTUNPIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfSFNJICAgICAgICAgSFNJIHNlbGVjdGVkIGFzIE1DTyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX0hTRSAgICAgICAgIEhTRSBzZWxlY3RlZCBhcyBNQ08gY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9MU0kgICAgICAgICBMU0kgc2VsZWN0ZWQgYXMgTUNPIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfTFNFICAgICAgICAgTFNFIHNlbGVjdGVkIGFzIE1DTyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX1BMTENMS19ESVYyIFBMTENMSyBEaXZpZGVkIGJ5IDIgc2VsZWN0ZWQgYXMgTUNPIGNsb2NrCisgICogQHBhcmFtICBSQ0NfTUNPRGl2IHNwZWNpZmllcyB0aGUgTUNPIERJVi4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ09ESVZfMSBubyBkaXZpc2lvbiBhcHBsaWVkIHRvIE1DTyBjbG9jaworICAqIEByZXR2YWwgTm9uZQorICAqLworI2VuZGlmCit2b2lkIEhBTF9SQ0NfTUNPQ29uZmlnKHVpbnQzMl90IFJDQ19NQ094LCB1aW50MzJfdCBSQ0NfTUNPU291cmNlLCB1aW50MzJfdCBSQ0NfTUNPRGl2KQoreworICBHUElPX0luaXRUeXBlRGVmIGdwaW87CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JDQ19NQ08oUkNDX01DT3gpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JDQ19NQ09ESVYoUkNDX01DT0RpdikpOworICBhc3NlcnRfcGFyYW0oSVNfUkNDX01DTzFTT1VSQ0UoUkNDX01DT1NvdXJjZSkpOworICAKKyAgLyogQ29uZmlndXJlIHRoZSBNQ08xIHBpbiBpbiBhbHRlcm5hdGUgZnVuY3Rpb24gbW9kZSAqLworICBncGlvLk1vZGUgICAgICA9IEdQSU9fTU9ERV9BRl9QUDsKKyAgZ3Bpby5TcGVlZCAgICAgPSBHUElPX1NQRUVEX0ZSRVFfSElHSDsKKyAgZ3Bpby5QdWxsICAgICAgPSBHUElPX05PUFVMTDsKKyAgZ3Bpby5QaW4gICAgICAgPSBNQ08xX1BJTjsKKyAgZ3Bpby5BbHRlcm5hdGUgPSBHUElPX0FGMF9NQ087CisKKyAgLyogTUNPMSBDbG9jayBFbmFibGUgKi8KKyAgTUNPMV9DTEtfRU5BQkxFKCk7CisgIAorICBIQUxfR1BJT19Jbml0KE1DTzFfR1BJT19QT1JULCAmZ3Bpbyk7CisgIAorICAvKiBDb25maWd1cmUgdGhlIE1DTyBjbG9jayBzb3VyY2UgKi8KKyAgX19IQUxfUkNDX01DTzFfQ09ORklHKFJDQ19NQ09Tb3VyY2UsIFJDQ19NQ09EaXYpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgdGhlIENsb2NrIFNlY3VyaXR5IFN5c3RlbS4KKyAgKiBAbm90ZSAgIElmIGEgZmFpbHVyZSBpcyBkZXRlY3RlZCBvbiB0aGUgSFNFIG9zY2lsbGF0b3IgY2xvY2ssIHRoaXMgb3NjaWxsYXRvcgorICAqICAgICAgICAgaXMgYXV0b21hdGljYWxseSBkaXNhYmxlZCBhbmQgYW4gaW50ZXJydXB0IGlzIGdlbmVyYXRlZCB0byBpbmZvcm0gdGhlCisgICogICAgICAgICBzb2Z0d2FyZSBhYm91dCB0aGUgZmFpbHVyZSAoQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIEludGVycnVwdCwgQ1NTSSksCisgICogICAgICAgICBhbGxvd2luZyB0aGUgTUNVIHRvIHBlcmZvcm0gcmVzY3VlIG9wZXJhdGlvbnMuIFRoZSBDU1NJIGlzIGxpbmtlZCB0byAKKyAgKiAgICAgICAgIHRoZSBDb3J0ZXgtTTQgTk1JIChOb24tTWFza2FibGUgSW50ZXJydXB0KSBleGNlcHRpb24gdmVjdG9yLiAgCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9SQ0NfRW5hYmxlQ1NTKHZvaWQpCit7CisgICooX19JTyB1aW50MzJfdCAqKSBSQ0NfQ1JfQ1NTT05fQkIgPSAodWludDMyX3QpRU5BQkxFOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGVzIHRoZSBDbG9jayBTZWN1cml0eSBTeXN0ZW0uCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9SQ0NfRGlzYWJsZUNTUyh2b2lkKQoreworICAqKF9fSU8gdWludDMyX3QgKikgUkNDX0NSX0NTU09OX0JCID0gKHVpbnQzMl90KURJU0FCTEU7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyB0aGUgU1lTQ0xLIGZyZXF1ZW5jeSAgICAgCisgICogQG5vdGUgICBUaGUgc3lzdGVtIGZyZXF1ZW5jeSBjb21wdXRlZCBieSB0aGlzIGZ1bmN0aW9uIGlzIG5vdCB0aGUgcmVhbCAKKyAgKiAgICAgICAgIGZyZXF1ZW5jeSBpbiB0aGUgY2hpcC4gSXQgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB0aGUgcHJlZGVmaW5lZCAKKyAgKiAgICAgICAgIGNvbnN0YW50IGFuZCB0aGUgc2VsZWN0ZWQgY2xvY2sgc291cmNlOgorICAqIEBub3RlICAgICBJZiBTWVNDTEsgc291cmNlIGlzIEhTSSwgZnVuY3Rpb24gcmV0dXJucyB2YWx1ZXMgYmFzZWQgb24gSFNJX1ZBTFVFKCopCisgICogQG5vdGUgICAgIElmIFNZU0NMSyBzb3VyY2UgaXMgSFNFLCBmdW5jdGlvbiByZXR1cm5zIGEgdmFsdWUgYmFzZWQgb24gSFNFX1ZBTFVFCisgICogICAgICAgICAgIGRpdmlkZWQgYnkgUFJFRElWIGZhY3RvcigqKikKKyAgKiBAbm90ZSAgICAgSWYgU1lTQ0xLIHNvdXJjZSBpcyBQTEwsIGZ1bmN0aW9uIHJldHVybnMgYSB2YWx1ZSBiYXNlZCBvbiBIU0VfVkFMVUUKKyAgKiAgICAgICAgICAgZGl2aWRlZCBieSBQUkVESVYgZmFjdG9yKCoqKSBvciBIU0lfVkFMVUUoKikgbXVsdGlwbGllZCBieSB0aGUgUExMIGZhY3Rvci4KKyAgKiBAbm90ZSAgICAgKCopIEhTSV9WQUxVRSBpcyBhIGNvbnN0YW50IGRlZmluZWQgaW4gc3RtMzJmM3h4X2hhbF9jb25mLmggZmlsZSAoZGVmYXVsdCB2YWx1ZQorICAqICAgICAgICAgICAgICAgOCBNSHopIGJ1dCB0aGUgcmVhbCB2YWx1ZSBtYXkgdmFyeSBkZXBlbmRpbmcgb24gdGhlIHZhcmlhdGlvbnMKKyAgKiAgICAgICAgICAgICAgIGluIHZvbHRhZ2UgYW5kIHRlbXBlcmF0dXJlLgorICAqIEBub3RlICAgICAoKiopIEhTRV9WQUxVRSBpcyBhIGNvbnN0YW50IGRlZmluZWQgaW4gc3RtMzJmM3h4X2hhbF9jb25mLmggZmlsZSAoZGVmYXVsdCB2YWx1ZQorICAqICAgICAgICAgICAgICAgIDggTUh6KSwgdXNlciBoYXMgdG8gZW5zdXJlIHRoYXQgSFNFX1ZBTFVFIGlzIHNhbWUgYXMgdGhlIHJlYWwKKyAgKiAgICAgICAgICAgICAgICBmcmVxdWVuY3kgb2YgdGhlIGNyeXN0YWwgdXNlZC4gT3RoZXJ3aXNlLCB0aGlzIGZ1bmN0aW9uIG1heQorICAqICAgICAgICAgICAgICAgIGhhdmUgd3JvbmcgcmVzdWx0LgorICAqICAgICAgICAgICAgICAgICAgCisgICogQG5vdGUgICBUaGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gY291bGQgYmUgbm90IGNvcnJlY3Qgd2hlbiB1c2luZyBmcmFjdGlvbmFsCisgICogICAgICAgICB2YWx1ZSBmb3IgSFNFIGNyeXN0YWwuCisgICogICAgICAgICAgIAorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBieSB0aGUgdXNlciBhcHBsaWNhdGlvbiB0byBjb21wdXRlIHRoZSAKKyAgKiAgICAgICAgIGJhdWQtcmF0ZSBmb3IgdGhlIGNvbW11bmljYXRpb24gcGVyaXBoZXJhbHMgb3IgY29uZmlndXJlIG90aGVyIHBhcmFtZXRlcnMuCisgICogICAgICAgICAgIAorICAqIEBub3RlICAgRWFjaCB0aW1lIFNZU0NMSyBjaGFuZ2VzLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHRvIHVwZGF0ZSB0aGUKKyAgKiAgICAgICAgIHJpZ2h0IFNZU0NMSyB2YWx1ZS4gT3RoZXJ3aXNlLCBhbnkgY29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgaW5jb3JyZWN0LgorICAqICAgICAgICAgCisgICogQHJldHZhbCBTWVNDTEsgZnJlcXVlbmN5CisgICovCit1aW50MzJfdCBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSh2b2lkKQoreworICB1aW50MzJfdCB0bXByZWcgPSAwVSwgcHJlZGl2ID0gMFUsIHBsbGNsayA9IDBVLCBwbGxtdWwgPSAwVTsKKyAgdWludDMyX3Qgc3lzY2xvY2tmcmVxID0gMFU7CisgIAorICB0bXByZWcgPSBSQ0MtPkNGR1I7CisgIAorICAvKiBHZXQgU1lTQ0xLIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgc3dpdGNoICh0bXByZWcgJiBSQ0NfQ0ZHUl9TV1MpCisgIHsKKyAgICBjYXNlIFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX0hTRTogIC8qIEhTRSB1c2VkIGFzIHN5c3RlbSBjbG9jayAqLworICAgIHsKKyAgICAgIHN5c2Nsb2NrZnJlcSA9IEhTRV9WQUxVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX1BMTENMSzogIC8qIFBMTCB1c2VkIGFzIHN5c3RlbSBjbG9jayAqLworICAgIHsKKyAgICAgIHBsbG11bCA9IGFQTExNVUxGYWN0b3JUYWJsZVsodWludDMyX3QpKHRtcHJlZyAmIFJDQ19DRkdSX1BMTE1VTCkgPj4gUE9TSVRJT05fVkFMKFJDQ19DRkdSX1BMTE1VTCldOworICAgICAgcHJlZGl2ID0gYVByZWRpdkZhY3RvclRhYmxlWyh1aW50MzJfdCkoUkNDLT5DRkdSMiAmIFJDQ19DRkdSMl9QUkVESVYpID4+IFBPU0lUSU9OX1ZBTChSQ0NfQ0ZHUjJfUFJFRElWKV07CisjaWYgZGVmaW5lZChSQ0NfQ0ZHUl9QTExTUkNfSFNJX0RJVjIpCisgICAgICBpZiAoKHRtcHJlZyAmIFJDQ19DRkdSX1BMTFNSQykgIT0gUkNDX1BMTFNPVVJDRV9IU0kpCisgICAgICB7CisgICAgICAgIC8qIEhTRSB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UgOiBQTExDTEsgPSBIU0UvUFJFRElWICogUExMTVVMICovCisgICAgICAgIHBsbGNsayA9IChIU0VfVkFMVUUgLyBwcmVkaXYpICogcGxsbXVsOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBIU0kgdXNlZCBhcyBQTEwgY2xvY2sgc291cmNlIDogUExMQ0xLID0gSFNJLzIgKiBQTExNVUwgKi8KKyAgICAgICAgcGxsY2xrID0gKEhTSV9WQUxVRSA+PiAxVSkgKiBwbGxtdWw7CisgICAgICB9CisjZWxzZQorICAgICAgaWYgKCh0bXByZWcgJiBSQ0NfQ0ZHUl9QTExTUkNfSFNFX1BSRURJVikgPT0gUkNDX0NGR1JfUExMU1JDX0hTRV9QUkVESVYpCisgICAgICB7CisgICAgICAgIC8qIEhTRSB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UgOiBQTExDTEsgPSBIU0UvUFJFRElWICogUExMTVVMICovCisgICAgICAgIHBsbGNsayA9IChIU0VfVkFMVUUgLyBwcmVkaXYpICogcGxsbXVsOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBIU0kgdXNlZCBhcyBQTEwgY2xvY2sgc291cmNlIDogUExMQ0xLID0gSFNJL1BSRURJViAqIFBMTE1VTCAqLworICAgICAgICBwbGxjbGsgPSAoSFNJX1ZBTFVFIC8gcHJlZGl2KSAqIHBsbG11bDsKKyAgICAgIH0KKyNlbmRpZiAvKiBSQ0NfQ0ZHUl9QTExTUkNfSFNJX0RJVjIgKi8KKyAgICAgIHN5c2Nsb2NrZnJlcSA9IHBsbGNsazsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX0hTSTogIC8qIEhTSSB1c2VkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UgKi8KKyAgICBkZWZhdWx0OiAvKiBIU0kgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgKi8KKyAgICB7CisgICAgICBzeXNjbG9ja2ZyZXEgPSBIU0lfVkFMVUU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHN5c2Nsb2NrZnJlcTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm5zIHRoZSBIQ0xLIGZyZXF1ZW5jeSAgICAgCisgICogQG5vdGUgICBFYWNoIHRpbWUgSENMSyBjaGFuZ2VzLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHRvIHVwZGF0ZSB0aGUKKyAgKiAgICAgICAgIHJpZ2h0IEhDTEsgdmFsdWUuIE90aGVyd2lzZSwgYW55IGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGluY29ycmVjdC4KKyAgKiAKKyAgKiBAbm90ZSAgIFRoZSBTeXN0ZW1Db3JlQ2xvY2sgQ01TSVMgdmFyaWFibGUgaXMgdXNlZCB0byBzdG9yZSBTeXN0ZW0gQ2xvY2sgRnJlcXVlbmN5IAorICAqICAgICAgICAgYW5kIHVwZGF0ZWQgd2l0aGluIHRoaXMgZnVuY3Rpb24KKyAgKiBAcmV0dmFsIEhDTEsgZnJlcXVlbmN5CisgICovCit1aW50MzJfdCBIQUxfUkNDX0dldEhDTEtGcmVxKHZvaWQpCit7CisgIHJldHVybiBTeXN0ZW1Db3JlQ2xvY2s7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyB0aGUgUENMSzEgZnJlcXVlbmN5ICAgICAKKyAgKiBAbm90ZSAgIEVhY2ggdGltZSBQQ0xLMSBjaGFuZ2VzLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHRvIHVwZGF0ZSB0aGUKKyAgKiAgICAgICAgIHJpZ2h0IFBDTEsxIHZhbHVlLiBPdGhlcndpc2UsIGFueSBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBpbmNvcnJlY3QuCisgICogQHJldHZhbCBQQ0xLMSBmcmVxdWVuY3kKKyAgKi8KK3VpbnQzMl90IEhBTF9SQ0NfR2V0UENMSzFGcmVxKHZvaWQpCit7CisgIC8qIEdldCBIQ0xLIHNvdXJjZSBhbmQgQ29tcHV0ZSBQQ0xLMSBmcmVxdWVuY3kgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcmV0dXJuIChIQUxfUkNDX0dldEhDTEtGcmVxKCkgPj4gQVBCUHJlc2NUYWJsZVsoUkNDLT5DRkdSICYgUkNDX0NGR1JfUFBSRTEpID4+IFJDQ19DRkdSX1BQUkUxX0JJVE5VTUJFUl0pOworfSAgICAKKworLyoqCisgICogQGJyaWVmICBSZXR1cm5zIHRoZSBQQ0xLMiBmcmVxdWVuY3kgICAgIAorICAqIEBub3RlICAgRWFjaCB0aW1lIFBDTEsyIGNoYW5nZXMsIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgdG8gdXBkYXRlIHRoZQorICAqICAgICAgICAgcmlnaHQgUENMSzIgdmFsdWUuIE90aGVyd2lzZSwgYW55IGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGluY29ycmVjdC4KKyAgKiBAcmV0dmFsIFBDTEsyIGZyZXF1ZW5jeQorICAqLwordWludDMyX3QgSEFMX1JDQ19HZXRQQ0xLMkZyZXEodm9pZCkKK3sKKyAgLyogR2V0IEhDTEsgc291cmNlIGFuZCBDb21wdXRlIFBDTEsyIGZyZXF1ZW5jeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICByZXR1cm4gKEhBTF9SQ0NfR2V0SENMS0ZyZXEoKT4+IEFQQlByZXNjVGFibGVbKFJDQy0+Q0ZHUiAmIFJDQ19DRkdSX1BQUkUyKSA+PiBSQ0NfQ0ZHUl9QUFJFMl9CSVROVU1CRVJdKTsKK30gCisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgUkNDX09zY0luaXRTdHJ1Y3QgYWNjb3JkaW5nIHRvIHRoZSBpbnRlcm5hbCAKKyAgKiBSQ0MgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuCisgICogQHBhcmFtICBSQ0NfT3NjSW5pdFN0cnVjdCBwb2ludGVyIHRvIGFuIFJDQ19Pc2NJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCAKKyAgKiB3aWxsIGJlIGNvbmZpZ3VyZWQuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9SQ0NfR2V0T3NjQ29uZmlnKFJDQ19Pc2NJbml0VHlwZURlZiAgKlJDQ19Pc2NJbml0U3RydWN0KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oUkNDX09zY0luaXRTdHJ1Y3QgIT0gTlVMTCk7CisKKyAgLyogU2V0IGFsbCBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSBPc2NpbGxhdG9yIHR5cGUgcGFyYW1ldGVyIC0tLS0tLS0tLS0tLS0tLSovCisgIFJDQ19Pc2NJbml0U3RydWN0LT5Pc2NpbGxhdG9yVHlwZSA9IFJDQ19PU0NJTExBVE9SVFlQRV9IU0UgfCBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNJICBcCisgICAgICAgICAgICAgICAgICB8IFJDQ19PU0NJTExBVE9SVFlQRV9MU0UgfCBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNJOworCisKKyAgLyogR2V0IHRoZSBIU0UgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKChSQ0MtPkNSICZSQ0NfQ1JfSFNFQllQKSA9PSBSQ0NfQ1JfSFNFQllQKQorICB7CisgICAgUkNDX09zY0luaXRTdHJ1Y3QtPkhTRVN0YXRlID0gUkNDX0hTRV9CWVBBU1M7CisgIH0KKyAgZWxzZSBpZigoUkNDLT5DUiAmUkNDX0NSX0hTRU9OKSA9PSBSQ0NfQ1JfSFNFT04pCisgIHsKKyAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+SFNFU3RhdGUgPSBSQ0NfSFNFX09OOworICB9CisgIGVsc2UKKyAgeworICAgIFJDQ19Pc2NJbml0U3RydWN0LT5IU0VTdGF0ZSA9IFJDQ19IU0VfT0ZGOworICB9CisjaWYgZGVmaW5lZChSQ0NfQ0ZHUl9QTExTUkNfSFNJX0RJVjIpCisgIFJDQ19Pc2NJbml0U3RydWN0LT5IU0VQcmVkaXZWYWx1ZSA9IF9fSEFMX1JDQ19IU0VfR0VUX1BSRURJVigpOworI2VuZGlmCisKKyAgLyogR2V0IHRoZSBIU0kgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKChSQ0MtPkNSICZSQ0NfQ1JfSFNJT04pID09IFJDQ19DUl9IU0lPTikKKyAgeworICAgIFJDQ19Pc2NJbml0U3RydWN0LT5IU0lTdGF0ZSA9IFJDQ19IU0lfT047CisgIH0KKyAgZWxzZQorICB7CisgICAgUkNDX09zY0luaXRTdHJ1Y3QtPkhTSVN0YXRlID0gUkNDX0hTSV9PRkY7CisgIH0KKyAgCisgIFJDQ19Pc2NJbml0U3RydWN0LT5IU0lDYWxpYnJhdGlvblZhbHVlID0gKHVpbnQzMl90KSgoUkNDLT5DUiAmIFJDQ19DUl9IU0lUUklNKSA+PiBQT1NJVElPTl9WQUwoUkNDX0NSX0hTSVRSSU0pKTsKKyAgCisgIC8qIEdldCB0aGUgTFNFIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZigoUkNDLT5CRENSICZSQ0NfQkRDUl9MU0VCWVApID09IFJDQ19CRENSX0xTRUJZUCkKKyAgeworICAgIFJDQ19Pc2NJbml0U3RydWN0LT5MU0VTdGF0ZSA9IFJDQ19MU0VfQllQQVNTOworICB9CisgIGVsc2UgaWYoKFJDQy0+QkRDUiAmUkNDX0JEQ1JfTFNFT04pID09IFJDQ19CRENSX0xTRU9OKQorICB7CisgICAgUkNDX09zY0luaXRTdHJ1Y3QtPkxTRVN0YXRlID0gUkNDX0xTRV9PTjsKKyAgfQorICBlbHNlCisgIHsKKyAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+TFNFU3RhdGUgPSBSQ0NfTFNFX09GRjsKKyAgfQorICAKKyAgLyogR2V0IHRoZSBMU0kgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKChSQ0MtPkNTUiAmUkNDX0NTUl9MU0lPTikgPT0gUkNDX0NTUl9MU0lPTikKKyAgeworICAgIFJDQ19Pc2NJbml0U3RydWN0LT5MU0lTdGF0ZSA9IFJDQ19MU0lfT047CisgIH0KKyAgZWxzZQorICB7CisgICAgUkNDX09zY0luaXRTdHJ1Y3QtPkxTSVN0YXRlID0gUkNDX0xTSV9PRkY7CisgIH0KKyAgCisKKyAgLyogR2V0IHRoZSBQTEwgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKChSQ0MtPkNSICZSQ0NfQ1JfUExMT04pID09IFJDQ19DUl9QTExPTikKKyAgeworICAgIFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX09OOworICB9CisgIGVsc2UKKyAgeworICAgIFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX09GRjsKKyAgfQorICBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFNvdXJjZSA9ICh1aW50MzJfdCkoUkNDLT5DRkdSICYgUkNDX0NGR1JfUExMU1JDKTsKKyAgUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExNVUwgPSAodWludDMyX3QpKFJDQy0+Q0ZHUiAmIFJDQ19DRkdSX1BMTE1VTCk7CisjaWYgZGVmaW5lZChSQ0NfQ0ZHUl9QTExTUkNfSFNJX1BSRURJVikKKyAgUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QUkVESVYgPSAodWludDMyX3QpKFJDQy0+Q0ZHUjIgJiBSQ0NfQ0ZHUjJfUFJFRElWKTsKKyNlbmRpZiAvKiBSQ0NfQ0ZHUl9QTExTUkNfSFNJX1BSRURJViAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgUkNDX0Nsa0luaXRTdHJ1Y3QgYWNjb3JkaW5nIHRvIHRoZSBpbnRlcm5hbCAKKyAgKiBSQ0MgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuCisgICogQHBhcmFtICBSQ0NfQ2xrSW5pdFN0cnVjdCBwb2ludGVyIHRvIGFuIFJDQ19DbGtJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCAKKyAgKiBjb250YWlucyB0aGUgY3VycmVudCBjbG9jayBjb25maWd1cmF0aW9uLgorICAqIEBwYXJhbSAgcEZMYXRlbmN5IFBvaW50ZXIgb24gdGhlIEZsYXNoIExhdGVuY3kuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9SQ0NfR2V0Q2xvY2tDb25maWcoUkNDX0Nsa0luaXRUeXBlRGVmICAqUkNDX0Nsa0luaXRTdHJ1Y3QsIHVpbnQzMl90ICpwRkxhdGVuY3kpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShSQ0NfQ2xrSW5pdFN0cnVjdCAhPSBOVUxMKTsKKyAgYXNzZXJ0X3BhcmFtKHBGTGF0ZW5jeSAhPSBOVUxMKTsKKworICAvKiBTZXQgYWxsIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIENsb2NrIHR5cGUgcGFyYW1ldGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUkNDX0Nsa0luaXRTdHJ1Y3QtPkNsb2NrVHlwZSA9IFJDQ19DTE9DS1RZUEVfU1lTQ0xLIHwgUkNDX0NMT0NLVFlQRV9IQ0xLIHwgUkNDX0NMT0NLVFlQRV9QQ0xLMSB8IFJDQ19DTE9DS1RZUEVfUENMSzI7CisgIAorICAvKiBHZXQgdGhlIFNZU0NMSyBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisgIFJDQ19DbGtJbml0U3RydWN0LT5TWVNDTEtTb3VyY2UgPSAodWludDMyX3QpKFJDQy0+Q0ZHUiAmIFJDQ19DRkdSX1NXKTsKKyAgCisgIC8qIEdldCB0aGUgSENMSyBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKyAgUkNDX0Nsa0luaXRTdHJ1Y3QtPkFIQkNMS0RpdmlkZXIgPSAodWludDMyX3QpKFJDQy0+Q0ZHUiAmIFJDQ19DRkdSX0hQUkUpOyAKKyAgCisgIC8qIEdldCB0aGUgQVBCMSBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKyAgUkNDX0Nsa0luaXRTdHJ1Y3QtPkFQQjFDTEtEaXZpZGVyID0gKHVpbnQzMl90KShSQ0MtPkNGR1IgJiBSQ0NfQ0ZHUl9QUFJFMSk7ICAgCisgIAorICAvKiBHZXQgdGhlIEFQQjIgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisgIFJDQ19DbGtJbml0U3RydWN0LT5BUEIyQ0xLRGl2aWRlciA9ICh1aW50MzJfdCkoKFJDQy0+Q0ZHUiAmIFJDQ19DRkdSX1BQUkUyKSA+PiAzVSk7CisgIAorICAvKiBHZXQgdGhlIEZsYXNoIFdhaXQgU3RhdGUgKExhdGVuY3kpIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gICAKKyAgKnBGTGF0ZW5jeSA9ICh1aW50MzJfdCkoRkxBU0gtPkFDUiAmIEZMQVNIX0FDUl9MQVRFTkNZKTsgCit9CisKKy8qKgorICAqIEBicmllZiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIFJDQyBDU1MgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQG5vdGUgVGhpcyBBUEkgc2hvdWxkIGJlIGNhbGxlZCB1bmRlciB0aGUgTk1JX0hhbmRsZXIoKS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1JDQ19OTUlfSVJRSGFuZGxlcih2b2lkKQoreworICAvKiBDaGVjayBSQ0MgQ1NTRiBmbGFnICAqLworICBpZihfX0hBTF9SQ0NfR0VUX0lUKFJDQ19JVF9DU1MpKQorICB7CisgICAgLyogUkNDIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBpbnRlcnJ1cHQgdXNlciBjYWxsYmFjayAqLworICAgIEhBTF9SQ0NfQ1NTQ2FsbGJhY2soKTsKKyAgICAKKyAgICAvKiBDbGVhciBSQ0MgQ1NTIHBlbmRpbmcgYml0ICovCisgICAgX19IQUxfUkNDX0NMRUFSX0lUKFJDQ19JVF9DU1MpOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUkNDIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBpbnRlcnJ1cHQgY2FsbGJhY2sKKyAgKiBAcmV0dmFsIG5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9SQ0NfQ1NTQ2FsbGJhY2sodm9pZCkKK3sKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgIHRoZSBIQUxfUkNDX0NTU0NhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICAqLyAKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9SQ0NfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmM3h4X2hhbF9yY2NfZXguYyBiL1NyYy9zdG0zMmYzeHhfaGFsX3JjY19leC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYThjZmYKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJmM3h4X2hhbF9yY2NfZXguYwpAQCAtMCwwICsxLDE1OTYgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX3JjY19leC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBFeHRlbmRlZCBSQ0MgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZyAKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgUkNDIGV4dGVuc2lvbiBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLyAKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfUkNDX01PRFVMRV9FTkFCTEVECisKKy8qKiBAZGVmZ3JvdXAgUkNDRXggUkNDRXgKKyAgKiBAYnJpZWYgUkNDIEV4dGVuc2lvbiBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJDQ0V4X1ByaXZhdGVfTWFjcm9zIFJDQ0V4IFByaXZhdGUgTWFjcm9zCisgKiBAeworICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjJfQURDMVBSRVMpIHx8IGRlZmluZWQoUkNDX0NGR1IyX0FEQ1BSRTEyKSB8fCBkZWZpbmVkKFJDQ19DRkdSMl9BRENQUkUzNCkgfHwgZGVmaW5lZChSQ0NfQ0ZHUl9VU0JQUkUpIFwKKyB8fCBkZWZpbmVkKFJDQ19DRkdSM19USU0xU1cpIHx8IGRlZmluZWQoUkNDX0NGR1IzX1RJTTJTVykgfHwgZGVmaW5lZChSQ0NfQ0ZHUjNfVElNOFNXKSB8fCBkZWZpbmVkKFJDQ19DRkdSM19USU0xNVNXKSAgICAgXAorIHx8IGRlZmluZWQoUkNDX0NGR1IzX1RJTTE2U1cpIHx8IGRlZmluZWQoUkNDX0NGR1IzX1RJTTE3U1cpIHx8IGRlZmluZWQoUkNDX0NGR1IzX1RJTTIwU1cpIHx8IGRlZmluZWQoUkNDX0NGR1IzX1RJTTM0U1cpICBcCisgfHwgZGVmaW5lZChSQ0NfQ0ZHUjNfSFJUSU0xU1cpCisvKiogQGRlZmdyb3VwIFJDQ0V4X1ByaXZhdGVfRnVuY3Rpb25zIFJDQ0V4IFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3N0YXRpYyB1aW50MzJfdCBSQ0NfR2V0UExMQ0xLRnJlcSh2b2lkKTsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBSQ0NfQ0ZHUjJfQURDMVBSRVMgfHwgUkNDX0NGR1IyX0FEQ1BSRXh4IHx8IFJDQ19DRkdSM19USU14U1cgfHwgUkNDX0NGR1IzX0hSVElNMVNXIHx8IFJDQ19DRkdSX1VTQlBSRSAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0V4cG9ydGVkX0Z1bmN0aW9ucyBSQ0NFeCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAKKyAgKiBAYnJpZWYgICAgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0gICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgIyMjIyMgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb250cm9sIHRoZSBSQ0MgQ2xvY2tzIAorICAgIGZyZXF1ZW5jaWVzLgorICAgIFsuLl0gCisgICAgKEApIEltcG9ydGFudCBub3RlOiBDYXJlIG11c3QgYmUgdGFrZW4gd2hlbiBIQUxfUkNDRXhfUGVyaXBoQ0xLQ29uZmlnKCkgaXMgdXNlZCB0bworICAgICAgICBzZWxlY3QgdGhlIFJUQyBjbG9jayBzb3VyY2U7IGluIHRoaXMgY2FzZSB0aGUgQmFja3VwIGRvbWFpbiB3aWxsIGJlIHJlc2V0IGluICAKKyAgICAgICAgb3JkZXIgdG8gbW9kaWZ5IHRoZSBSVEMgQ2xvY2sgc291cmNlLCBhcyBjb25zZXF1ZW5jZSBSVEMgcmVnaXN0ZXJzIChpbmNsdWRpbmcgCisgICAgICAgIHRoZSBiYWNrdXAgcmVnaXN0ZXJzKSBhcmUgc2V0IHRvIHRoZWlyIHJlc2V0IHZhbHVlcy4KKyAgICAgIAorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgUkNDIGV4dGVuZGVkIHBlcmlwaGVyYWxzIGNsb2NrcyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgUkNDX1BlcmlwaENMS0luaXRUeXBlRGVmLgorICAqIEBwYXJhbSAgUGVyaXBoQ2xrSW5pdCBwb2ludGVyIHRvIGFuIFJDQ19QZXJpcGhDTEtJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqICAgICAgICAgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBFeHRlbmRlZCBQZXJpcGhlcmFscyBjbG9ja3MKKyAgKiAgICAgICAgIChBREMsIENFQywgSTJDLCBJMlMsIFNEQURDLCBIUlRJTSwgVElNLCBVU0FSVCwgUlRDIGFuZCBVU0IpLgorICAqCisgICogQG5vdGUgICBDYXJlIG11c3QgYmUgdGFrZW4gd2hlbiBIQUxfUkNDRXhfUGVyaXBoQ0xLQ29uZmlnKCkgaXMgdXNlZCB0byBzZWxlY3QgCisgICogICAgICAgICB0aGUgUlRDIGNsb2NrIHNvdXJjZTsgaW4gdGhpcyBjYXNlIHRoZSBCYWNrdXAgZG9tYWluIHdpbGwgYmUgcmVzZXQgaW4gIAorICAqICAgICAgICAgb3JkZXIgdG8gbW9kaWZ5IHRoZSBSVEMgQ2xvY2sgc291cmNlLCBhcyBjb25zZXF1ZW5jZSBSVEMgcmVnaXN0ZXJzIChpbmNsdWRpbmcgCisgICogICAgICAgICB0aGUgYmFja3VwIHJlZ2lzdGVycykgYW5kIFJDQ19CRENSIHJlZ2lzdGVyIGFyZSBzZXQgdG8gdGhlaXIgcmVzZXQgdmFsdWVzLgorICAqCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUkNDRXhfUGVyaXBoQ0xLQ29uZmlnKFJDQ19QZXJpcGhDTEtJbml0VHlwZURlZiAgKlBlcmlwaENsa0luaXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDBVOworICB1aW50MzJfdCB0ZW1wX3JlZyA9IDBVOworICAgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BFUklQSENMT0NLKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSk7CisgIAorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUlRDIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19SVEMpID09IChSQ0NfUEVSSVBIQ0xLX1JUQykpCisgIHsKKyAgICAvKiBjaGVjayBmb3IgUlRDIFBhcmFtZXRlcnMgdXNlZCB0byBvdXRwdXQgUlRDQ0xLICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19SVENDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+UlRDQ2xvY2tTZWxlY3Rpb24pKTsKKworICAgIEZsYWdTdGF0dXMgICAgICAgcHdyY2xrY2hhbmdlZCA9IFJFU0VUOworCisgICAgLyogQXMgc29vbiBhcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY2hhbmdlIFJUQyBjbG9jayBzb3VyY2UsIGFjdGl2YXRpb24gb2YgdGhlIAorICAgICAgIHBvd2VyIGRvbWFpbiBpcyBkb25lLiAqLworICAgIC8qIFJlcXVpcmVzIHRvIGVuYWJsZSB3cml0ZSBhY2Nlc3MgdG8gQmFja3VwIERvbWFpbiBvZiBuZWNlc3NhcnkgKi8KKyAgICBpZihfX0hBTF9SQ0NfUFdSX0lTX0NMS19ESVNBQkxFRCgpKQorICAgIHsKKyAgICAgIF9fSEFMX1JDQ19QV1JfQ0xLX0VOQUJMRSgpOworICAgICAgcHdyY2xrY2hhbmdlZCA9IFNFVDsKKyAgICB9CisgICAgCisgICAgaWYoSEFMX0lTX0JJVF9DTFIoUFdSLT5DUiwgUFdSX0NSX0RCUCkpCisgICAgeworICAgICAgLyogRW5hYmxlIHdyaXRlIGFjY2VzcyB0byBCYWNrdXAgZG9tYWluICovCisgICAgICBTRVRfQklUKFBXUi0+Q1IsIFBXUl9DUl9EQlApOworICAgICAgCisgICAgICAvKiBXYWl0IGZvciBCYWNrdXAgZG9tYWluIFdyaXRlIHByb3RlY3Rpb24gZGlzYWJsZSAqLworICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICAgIAorICAgICAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoUFdSLT5DUiwgUFdSX0NSX0RCUCkpCisgICAgICB7CisgICAgICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUkNDX0RCUF9USU1FT1VUX1ZBTFVFKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIFJlc2V0IHRoZSBCYWNrdXAgZG9tYWluIG9ubHkgaWYgdGhlIFJUQyBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uIGlzIG1vZGlmaWVkIGZyb20gcmVzZXQgdmFsdWUgKi8gCisgICAgdGVtcF9yZWcgPSAoUkNDLT5CRENSICYgUkNDX0JEQ1JfUlRDU0VMKTsKKyAgICBpZigodGVtcF9yZWcgIT0gMHgwMDAwMDAwMFUpICYmICh0ZW1wX3JlZyAhPSAoUGVyaXBoQ2xrSW5pdC0+UlRDQ2xvY2tTZWxlY3Rpb24gJiBSQ0NfQkRDUl9SVENTRUwpKSkKKyAgICB7CisgICAgICAvKiBTdG9yZSB0aGUgY29udGVudCBvZiBCRENSIHJlZ2lzdGVyIGJlZm9yZSB0aGUgcmVzZXQgb2YgQmFja3VwIERvbWFpbiAqLworICAgICAgdGVtcF9yZWcgPSAoUkNDLT5CRENSICYgfihSQ0NfQkRDUl9SVENTRUwpKTsKKyAgICAgIC8qIFJUQyBDbG9jayBzZWxlY3Rpb24gY2FuIGJlIGNoYW5nZWQgb25seSBpZiB0aGUgQmFja3VwIERvbWFpbiBpcyByZXNldCAqLworICAgICAgX19IQUxfUkNDX0JBQ0tVUFJFU0VUX0ZPUkNFKCk7CisgICAgICBfX0hBTF9SQ0NfQkFDS1VQUkVTRVRfUkVMRUFTRSgpOworICAgICAgLyogUmVzdG9yZSB0aGUgQ29udGVudCBvZiBCRENSIHJlZ2lzdGVyICovCisgICAgICBSQ0MtPkJEQ1IgPSB0ZW1wX3JlZzsKKyAgICAKKyAgICAgIC8qIFdhaXQgZm9yIExTRVJEWSBpZiBMU0Ugd2FzIGVuYWJsZWQgKi8KKyAgICAgIGlmIChIQUxfSVNfQklUX1NFVCh0ZW1wX3JlZywgUkNDX0JEQ1JfTFNFT04pKQorICAgICAgeworICAgICAgICAvKiBHZXQgU3RhcnQgVGljayAqLworICAgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgICAgICAKKyAgICAgICAgLyogV2FpdCB0aWxsIExTRSBpcyByZWFkeSAqLyAgCisgICAgICAgIHdoaWxlKF9fSEFMX1JDQ19HRVRfRkxBRyhSQ0NfRkxBR19MU0VSRFkpID09IFJFU0VUKQorICAgICAgICB7CisgICAgICAgICAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBSQ0NfTFNFX1RJTUVPVVRfVkFMVUUpCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICAgIH0gICAgICAKKyAgICAgICAgfSAgCisgICAgICB9CisgICAgfQorICAgIF9fSEFMX1JDQ19SVENfQ09ORklHKFBlcmlwaENsa0luaXQtPlJUQ0Nsb2NrU2VsZWN0aW9uKTsgCisKKyAgICAvKiBSZXF1aXJlIHRvIGRpc2FibGUgcG93ZXIgY2xvY2sgaWYgbmVjZXNzYXJ5ICovCisgICAgaWYocHdyY2xrY2hhbmdlZCA9PSBTRVQpCisgICAgeworICAgICAgX19IQUxfUkNDX1BXUl9DTEtfRElTQUJMRSgpOworICAgIH0KKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVDEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZigoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfVVNBUlQxKSA9PSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSkKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19VU0FSVDFDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+VXNhcnQxQ2xvY2tTZWxlY3Rpb24pKTsKKyAgICAKKyAgICAvKiBDb25maWd1cmUgdGhlIFVTQVJUMSBjbG9jayBzb3VyY2UgKi8KKyAgICBfX0hBTF9SQ0NfVVNBUlQxX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5Vc2FydDFDbG9ja1NlbGVjdGlvbik7CisgIH0KKworI2lmIGRlZmluZWQoUkNDX0NGR1IzX1VTQVJUMlNXKQorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUMiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisgIGlmKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19VU0FSVDIpID09IFJDQ19QRVJJUEhDTEtfVVNBUlQyKQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1VTQVJUMkNMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5Vc2FydDJDbG9ja1NlbGVjdGlvbikpOworICAgIAorICAgIC8qIENvbmZpZ3VyZSB0aGUgVVNBUlQyIGNsb2NrIHNvdXJjZSAqLworICAgIF9fSEFMX1JDQ19VU0FSVDJfQ09ORklHKFBlcmlwaENsa0luaXQtPlVzYXJ0MkNsb2NrU2VsZWN0aW9uKTsKKyAgfQorI2VuZGlmIC8qIFJDQ19DRkdSM19VU0FSVDJTVyAqLworCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfVVNBUlQzU1cpCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUMyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorICBpZigoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfVVNBUlQzKSA9PSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMykKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19VU0FSVDNDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+VXNhcnQzQ2xvY2tTZWxlY3Rpb24pKTsKKyAgICAKKyAgICAvKiBDb25maWd1cmUgdGhlIFVTQVJUMyBjbG9jayBzb3VyY2UgKi8KKyAgICBfX0hBTF9SQ0NfVVNBUlQzX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5Vc2FydDNDbG9ja1NlbGVjdGlvbik7CisgIH0KKyNlbmRpZiAvKiBSQ0NfQ0ZHUjNfVVNBUlQzU1cgKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJMkMxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisgIGlmKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19JMkMxKSA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzEpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfSTJDMUNMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5JMmMxQ2xvY2tTZWxlY3Rpb24pKTsKKyAgICAKKyAgICAvKiBDb25maWd1cmUgdGhlIEkyQzEgY2xvY2sgc291cmNlICovCisgICAgX19IQUxfUkNDX0kyQzFfQ09ORklHKFBlcmlwaENsa0luaXQtPkkyYzFDbG9ja1NlbGVjdGlvbik7CisgIH0KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpXAorIHx8IGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpXAorIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpICAgICAgICAgICAgICAgICAgICAgICAgXAorIHx8IGRlZmluZWQoU1RNMzJGMzczeEMpCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorICBpZigoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfVVNCKSA9PSBSQ0NfUEVSSVBIQ0xLX1VTQikKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19VU0JDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+VVNCQ2xvY2tTZWxlY3Rpb24pKTsKKyAgICAKKyAgICAvKiBDb25maWd1cmUgdGhlIFVTQiBjbG9jayBzb3VyY2UgKi8KKyAgICBfX0hBTF9SQ0NfVVNCX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5VU0JDbG9ja1NlbGVjdGlvbik7CisgIH0KKworI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4OCAgICAgICAgICAgICAgICB8fCAqLworICAgICAgIC8qIFNUTTMyRjM3M3hDICAgICAgICAgICAgICAgICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KVwKKyB8fCBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KVwKKyB8fCBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KVwKKyB8fCBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkyQzIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKyAgaWYoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX0kyQzIpID09IFJDQ19QRVJJUEhDTEtfSTJDMikKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19JMkMyQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPkkyYzJDbG9ja1NlbGVjdGlvbikpOworICAgIAorICAgIC8qIENvbmZpZ3VyZSB0aGUgSTJDMiBjbG9jayBzb3VyY2UgKi8KKyAgICBfX0hBTF9SQ0NfSTJDMl9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+STJjMkNsb2NrU2VsZWN0aW9uKTsKKyAgfQorCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggICAgICAgICAgICAgICAgICAgKi8KKyAgCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eClcCisgfHwgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJMkMzIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisgIGlmKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19JMkMzKSA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzMpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfSTJDM0NMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5JMmMzQ2xvY2tTZWxlY3Rpb24pKTsKKyAgICAKKyAgICAvKiBDb25maWd1cmUgdGhlIEkyQzMgY2xvY2sgc291cmNlICovCisgICAgX19IQUxfUkNDX0kyQzNfQ09ORklHKFBlcmlwaENsa0luaXQtPkkyYzNDbG9ja1NlbGVjdGlvbik7CisgIH0KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisgIAorI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpXAorIHx8IGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVUFSVDQgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKyAgaWYoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1VBUlQ0KSA9PSBSQ0NfUEVSSVBIQ0xLX1VBUlQ0KQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1VBUlQ0Q0xLU09VUkNFKFBlcmlwaENsa0luaXQtPlVhcnQ0Q2xvY2tTZWxlY3Rpb24pKTsKKyAgICAKKyAgICAvKiBDb25maWd1cmUgdGhlIFVBUlQ0IGNsb2NrIHNvdXJjZSAqLworICAgIF9fSEFMX1JDQ19VQVJUNF9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+VWFydDRDbG9ja1NlbGVjdGlvbik7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVQVJUNSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorICBpZigoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfVUFSVDUpID09IFJDQ19QRVJJUEhDTEtfVUFSVDUpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfVUFSVDVDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+VWFydDVDbG9ja1NlbGVjdGlvbikpOworICAgIAorICAgIC8qIENvbmZpZ3VyZSB0aGUgVUFSVDUgY2xvY2sgc291cmNlICovCisgICAgX19IQUxfUkNDX1VBUlQ1X0NPTkZJRyhQZXJpcGhDbGtJbml0LT5VYXJ0NUNsb2NrU2VsZWN0aW9uKTsKKyAgfQorCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eClcCisgfHwgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eClcCisgfHwgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTJTIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisgIGlmKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19JMlMpID09IFJDQ19QRVJJUEhDTEtfSTJTKQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX0kyU0NMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5JMnNDbG9ja1NlbGVjdGlvbikpOworICAgIAorICAgIC8qIENvbmZpZ3VyZSB0aGUgSTJTIGNsb2NrIHNvdXJjZSAqLworICAgIF9fSEFMX1JDQ19JMlNfQ09ORklHKFBlcmlwaENsa0luaXQtPkkyc0Nsb2NrU2VsZWN0aW9uKTsKKyAgfQorCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisgIAorI2lmIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisgICAgICAKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQURDMSBjbG9jayBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLSovIAorICBpZigoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfQURDMSkgPT0gUkNDX1BFUklQSENMS19BREMxKQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX0FEQzFQTExDTEtfRElWKFBlcmlwaENsa0luaXQtPkFkYzFDbG9ja1NlbGVjdGlvbikpOworICAgIAorICAgIC8qIENvbmZpZ3VyZSB0aGUgQURDMSBjbG9jayBzb3VyY2UgKi8KKyAgICBfX0hBTF9SQ0NfQURDMV9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+QWRjMUNsb2NrU2VsZWN0aW9uKTsKKyAgfQorCisjZW5kaWYgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggKi8KKyAgCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eClcCisgfHwgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eClcCisgfHwgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkKKyAgICAgIAorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBREMxICYgQURDMiBjbG9jayBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0qLyAKKyAgaWYoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX0FEQzEyKSA9PSBSQ0NfUEVSSVBIQ0xLX0FEQzEyKQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX0FEQzEyUExMQ0xLX0RJVihQZXJpcGhDbGtJbml0LT5BZGMxMkNsb2NrU2VsZWN0aW9uKSk7CisgICAgCisgICAgLyogQ29uZmlndXJlIHRoZSBBREMxMiBjbG9jayBzb3VyY2UgKi8KKyAgICBfX0hBTF9SQ0NfQURDMTJfQ09ORklHKFBlcmlwaENsa0luaXQtPkFkYzEyQ2xvY2tTZWxlY3Rpb24pOworICB9CisKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggICAgKi8gICAgCisgIAorI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpXAorIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQURDMyAmIEFEQzQgY2xvY2sgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tKi8gCisgIGlmKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19BREMzNCkgPT0gUkNDX1BFUklQSENMS19BREMzNCkKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19BREMzNFBMTENMS19ESVYoUGVyaXBoQ2xrSW5pdC0+QWRjMzRDbG9ja1NlbGVjdGlvbikpOworICAgIAorICAgIC8qIENvbmZpZ3VyZSB0aGUgQURDMzQgY2xvY2sgc291cmNlICovCisgICAgX19IQUxfUkNDX0FEQzM0X0NPTkZJRyhQZXJpcGhDbGtJbml0LT5BZGMzNENsb2NrU2VsZWN0aW9uKTsKKyAgfQorCisjZW5kaWYgLyogU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKyAgICAgIAorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBREMxIGNsb2NrIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisgIGlmKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19BREMxKSA9PSBSQ0NfUEVSSVBIQ0xLX0FEQzEpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfQURDMVBDTEsyX0RJVihQZXJpcGhDbGtJbml0LT5BZGMxQ2xvY2tTZWxlY3Rpb24pKTsKKyAgICAKKyAgICAvKiBDb25maWd1cmUgdGhlIEFEQzEgY2xvY2sgc291cmNlICovCisgICAgX19IQUxfUkNDX0FEQzFfQ09ORklHKFBlcmlwaENsa0luaXQtPkFkYzFDbG9ja1NlbGVjdGlvbik7CisgIH0KKworI2VuZGlmIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KVwKKyB8fCBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KVwKKyB8fCBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KVwKKyB8fCBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRJTTEgY2xvY2sgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tKi8gCisgIGlmKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19USU0xKSA9PSBSQ0NfUEVSSVBIQ0xLX1RJTTEpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfVElNMUNMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5UaW0xQ2xvY2tTZWxlY3Rpb24pKTsKKyAgICAKKyAgICAvKiBDb25maWd1cmUgdGhlIFRJTTEgY2xvY2sgc291cmNlICovCisgICAgX19IQUxfUkNDX1RJTTFfQ09ORklHKFBlcmlwaENsa0luaXQtPlRpbTFDbG9ja1NlbGVjdGlvbik7CisgIH0KKworI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisgIAorI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpXAorIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVElNOCBjbG9jayBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0qLyAKKyAgaWYoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1RJTTgpID09IFJDQ19QRVJJUEhDTEtfVElNOCkKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19USU04Q0xLU09VUkNFKFBlcmlwaENsa0luaXQtPlRpbThDbG9ja1NlbGVjdGlvbikpOworICAgIAorICAgIC8qIENvbmZpZ3VyZSB0aGUgVElNOCBjbG9jayBzb3VyY2UgKi8KKyAgICBfX0hBTF9SQ0NfVElNOF9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+VGltOENsb2NrU2VsZWN0aW9uKTsKKyAgfQorCisjZW5kaWYgLyogU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUSU0xNSBjbG9jayBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0qLyAKKyAgaWYoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1RJTTE1KSA9PSBSQ0NfUEVSSVBIQ0xLX1RJTTE1KQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1RJTTE1Q0xLU09VUkNFKFBlcmlwaENsa0luaXQtPlRpbTE1Q2xvY2tTZWxlY3Rpb24pKTsKKyAgICAKKyAgICAvKiBDb25maWd1cmUgdGhlIFRJTTE1IGNsb2NrIHNvdXJjZSAqLworICAgIF9fSEFMX1JDQ19USU0xNV9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+VGltMTVDbG9ja1NlbGVjdGlvbik7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUSU0xNiBjbG9jayBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0qLyAKKyAgaWYoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1RJTTE2KSA9PSBSQ0NfUEVSSVBIQ0xLX1RJTTE2KQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1RJTTE2Q0xLU09VUkNFKFBlcmlwaENsa0luaXQtPlRpbTE2Q2xvY2tTZWxlY3Rpb24pKTsKKyAgICAKKyAgICAvKiBDb25maWd1cmUgdGhlIFRJTTE2IGNsb2NrIHNvdXJjZSAqLworICAgIF9fSEFMX1JDQ19USU0xNl9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+VGltMTZDbG9ja1NlbGVjdGlvbik7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUSU0xNyBjbG9jayBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0qLyAKKyAgaWYoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1RJTTE3KSA9PSBSQ0NfUEVSSVBIQ0xLX1RJTTE3KQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1RJTTE3Q0xLU09VUkNFKFBlcmlwaENsa0luaXQtPlRpbTE3Q2xvY2tTZWxlY3Rpb24pKTsKKyAgICAKKyAgICAvKiBDb25maWd1cmUgdGhlIFRJTTE3IGNsb2NrIHNvdXJjZSAqLworICAgIF9fSEFMX1JDQ19USU0xN19DT05GSUcoUGVyaXBoQ2xrSW5pdC0+VGltMTdDbG9ja1NlbGVjdGlvbik7CisgIH0KKworI2VuZGlmIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMzNHg4KQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhSVElNMSBjbG9jayBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0qLyAKKyAgaWYoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX0hSVElNMSkgPT0gUkNDX1BFUklQSENMS19IUlRJTTEpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfSFJUSU0xQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPkhydGltMUNsb2NrU2VsZWN0aW9uKSk7CisgICAgCisgICAgLyogQ29uZmlndXJlIHRoZSBIUlRJTTEgY2xvY2sgc291cmNlICovCisgICAgX19IQUxfUkNDX0hSVElNMV9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+SHJ0aW0xQ2xvY2tTZWxlY3Rpb24pOworICB9CisKKyNlbmRpZiAvKiBTVE0zMkYzMzR4OCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKyAgCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNEQURDIGNsb2NrIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorICBpZigoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfU0RBREMpID09IFJDQ19QRVJJUEhDTEtfU0RBREMpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfU0RBRENTWVNDTEtfRElWKFBlcmlwaENsa0luaXQtPlNkYWRjQ2xvY2tTZWxlY3Rpb24pKTsKKyAgICAKKyAgICAvKiBDb25maWd1cmUgdGhlIFNEQURDIGNsb2NrIHByZXNjYWxlciAqLworICAgIF9fSEFMX1JDQ19TREFEQ19DT05GSUcoUGVyaXBoQ2xrSW5pdC0+U2RhZGNDbG9ja1NlbGVjdGlvbik7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDRUMgY2xvY2sgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisgIGlmKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19DRUMpID09IFJDQ19QRVJJUEhDTEtfQ0VDKQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX0NFQ0NMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5DZWNDbG9ja1NlbGVjdGlvbikpOworICAgIAorICAgIC8qIENvbmZpZ3VyZSB0aGUgQ0VDIGNsb2NrIHNvdXJjZSAqLworICAgIF9fSEFMX1JDQ19DRUNfQ09ORklHKFBlcmlwaENsa0luaXQtPkNlY0Nsb2NrU2VsZWN0aW9uKTsKKyAgfQorCisjZW5kaWYgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8KKyAgCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkKKyAgCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRJTTIgY2xvY2sgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisgIGlmKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19USU0yKSA9PSBSQ0NfUEVSSVBIQ0xLX1RJTTIpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfVElNMkNMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5UaW0yQ2xvY2tTZWxlY3Rpb24pKTsKKyAgICAKKyAgICAvKiBDb25maWd1cmUgdGhlIENFQyBjbG9jayBzb3VyY2UgKi8KKyAgICBfX0hBTF9SQ0NfVElNMl9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+VGltMkNsb2NrU2VsZWN0aW9uKTsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRJTTMgY2xvY2sgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisgIGlmKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19USU0zNCkgPT0gUkNDX1BFUklQSENMS19USU0zNCkKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19USU0zQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPlRpbTM0Q2xvY2tTZWxlY3Rpb24pKTsKKyAgICAKKyAgICAvKiBDb25maWd1cmUgdGhlIENFQyBjbG9jayBzb3VyY2UgKi8KKyAgICBfX0hBTF9SQ0NfVElNMzRfQ09ORklHKFBlcmlwaENsa0luaXQtPlRpbTM0Q2xvY2tTZWxlY3Rpb24pOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVElNMTUgY2xvY2sgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0qLyAKKyAgaWYoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1RJTTE1KSA9PSBSQ0NfUEVSSVBIQ0xLX1RJTTE1KQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1RJTTE1Q0xLU09VUkNFKFBlcmlwaENsa0luaXQtPlRpbTE1Q2xvY2tTZWxlY3Rpb24pKTsKKyAgICAKKyAgICAvKiBDb25maWd1cmUgdGhlIENFQyBjbG9jayBzb3VyY2UgKi8KKyAgICBfX0hBTF9SQ0NfVElNMTVfQ09ORklHKFBlcmlwaENsa0luaXQtPlRpbTE1Q2xvY2tTZWxlY3Rpb24pOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVElNMTYgY2xvY2sgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0qLyAKKyAgaWYoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1RJTTE2KSA9PSBSQ0NfUEVSSVBIQ0xLX1RJTTE2KQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1RJTTE2Q0xLU09VUkNFKFBlcmlwaENsa0luaXQtPlRpbTE2Q2xvY2tTZWxlY3Rpb24pKTsKKyAgICAKKyAgICAvKiBDb25maWd1cmUgdGhlIENFQyBjbG9jayBzb3VyY2UgKi8KKyAgICBfX0hBTF9SQ0NfVElNMTZfQ09ORklHKFBlcmlwaENsa0luaXQtPlRpbTE2Q2xvY2tTZWxlY3Rpb24pOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVElNMTcgY2xvY2sgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0qLyAKKyAgaWYoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1RJTTE3KSA9PSBSQ0NfUEVSSVBIQ0xLX1RJTTE3KQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1RJTTE3Q0xLU09VUkNFKFBlcmlwaENsa0luaXQtPlRpbTE3Q2xvY2tTZWxlY3Rpb24pKTsKKyAgICAKKyAgICAvKiBDb25maWd1cmUgdGhlIENFQyBjbG9jayBzb3VyY2UgKi8KKyAgICBfX0hBTF9SQ0NfVElNMTdfQ09ORklHKFBlcmlwaENsa0luaXQtPlRpbTE3Q2xvY2tTZWxlY3Rpb24pOworICB9CisKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCAqLyAgCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KQorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUSU0yMCBjbG9jayBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLSovIAorICBpZigoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfVElNMjApID09IFJDQ19QRVJJUEhDTEtfVElNMjApCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfVElNMjBDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+VGltMjBDbG9ja1NlbGVjdGlvbikpOworICAgIAorICAgIC8qIENvbmZpZ3VyZSB0aGUgQ0VDIGNsb2NrIHNvdXJjZSAqLworICAgIF9fSEFMX1JDQ19USU0yMF9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+VGltMjBDbG9ja1NlbGVjdGlvbik7CisgIH0KKyNlbmRpZiAvKiBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCAqLyAgCisKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBSQ0NfQ2xrSW5pdFN0cnVjdCBhY2NvcmRpbmcgdG8gdGhlIGludGVybmFsCisgICogUkNDIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLgorICAqIEBwYXJhbSAgUGVyaXBoQ2xrSW5pdCBwb2ludGVyIHRvIGFuIFJDQ19QZXJpcGhDTEtJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqICAgICAgICAgcmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIEV4dGVuZGVkIFBlcmlwaGVyYWxzIGNsb2NrcworICAqICAgICAgICAgKEFEQywgQ0VDLCBJMkMsIEkyUywgU0RBREMsIEhSVElNLCBUSU0sIFVTQVJULCBSVEMgYW5kIFVTQiBjbG9ja3MpLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUkNDRXhfR2V0UGVyaXBoQ0xLQ29uZmlnKFJDQ19QZXJpcGhDTEtJbml0VHlwZURlZiAgKlBlcmlwaENsa0luaXQpCit7CisgIC8qIFNldCBhbGwgcG9zc2libGUgdmFsdWVzIGZvciB0aGUgZXh0ZW5kZWQgY2xvY2sgdHlwZSBwYXJhbWV0ZXItLS0tLS0tLS0tLS0qLworICAvKiBDb21tb24gcGFydCBmaXJzdCAqLworI2lmIGRlZmluZWQoUkNDX0NGR1IzX1VTQVJUMlNXKSAmJiBkZWZpbmVkKFJDQ19DRkdSM19VU0FSVDNTVykKKyAgUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSB8IFJDQ19QRVJJUEhDTEtfVVNBUlQyIHwgUkNDX1BFUklQSENMS19VU0FSVDMgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19JMkMxICAgfCBSQ0NfUEVSSVBIQ0xLX1JUQzsKKyNlbHNlCisgIFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uID0gUkNDX1BFUklQSENMS19VU0FSVDEgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19JMkMxICAgfCBSQ0NfUEVSSVBIQ0xLX1JUQzsKKyNlbmRpZiAvKiBSQ0NfQ0ZHUjNfVVNBUlQyU1cgJiYgUkNDX0NGR1IzX1VTQVJUM1NXICovCisgIAorICAvKiBHZXQgdGhlIFJUQyBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUGVyaXBoQ2xrSW5pdC0+UlRDQ2xvY2tTZWxlY3Rpb24gPSBfX0hBTF9SQ0NfR0VUX1JUQ19TT1VSQ0UoKTsKKyAgLyogR2V0IHRoZSBVU0FSVDEgY2xvY2sgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPlVzYXJ0MUNsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9VU0FSVDFfU09VUkNFKCk7CisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfVVNBUlQyU1cpCisgIC8qIEdldCB0aGUgVVNBUlQyIGNsb2NrIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBQZXJpcGhDbGtJbml0LT5Vc2FydDJDbG9ja1NlbGVjdGlvbiA9IF9fSEFMX1JDQ19HRVRfVVNBUlQyX1NPVVJDRSgpOworI2VuZGlmIC8qIFJDQ19DRkdSM19VU0FSVDJTVyAqLworI2lmIGRlZmluZWQoUkNDX0NGR1IzX1VTQVJUM1NXKQorICAgLyogR2V0IHRoZSBVU0FSVDMgY2xvY2sgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPlVzYXJ0M0Nsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9VU0FSVDNfU09VUkNFKCk7CisjZW5kaWYgLyogUkNDX0NGR1IzX1VTQVJUM1NXICovCisgIC8qIEdldCB0aGUgSTJDMSBjbG9jayBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUGVyaXBoQ2xrSW5pdC0+STJjMUNsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9JMkMxX1NPVVJDRSgpOworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSlcCisgICAgfHwgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QylcCisgICAgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfHwgZGVmaW5lZChTVE0zMkYzNzN4QykKKworICBQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbiB8PSBSQ0NfUEVSSVBIQ0xLX1VTQjsKKyAgLyogR2V0IHRoZSBVU0IgY2xvY2sgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPlVTQkNsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9VU0JfU09VUkNFKCk7CisKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeDggICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzNzN4QyAgICAgICAgICAgICAgICAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eClcCisgICAgfHwgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eClcCisgICAgfHwgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eClcCisgICAgfHwgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKworICBQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbiB8PSBSQ0NfUEVSSVBIQ0xLX0kyQzI7CisgIC8qIEdldCB0aGUgSTJDMiBjbG9jayBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUGVyaXBoQ2xrSW5pdC0+STJjMkNsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9JMkMyX1NPVVJDRSgpOworCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggICAgICAgICAgICAgICAgICAgKi8KKyAgCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eClcCisgICAgfHwgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKworICBQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbiB8PSBSQ0NfUEVSSVBIQ0xLX0kyQzM7CisgIC8qIEdldCB0aGUgSTJDMyBjbG9jayBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUGVyaXBoQ2xrSW5pdC0+STJjM0Nsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9JMkMzX1NPVVJDRSgpOworCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworICAKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KVwKKyAgICB8fCBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fGRlZmluZWQoU1RNMzJGMzU4eHgpCisKKyAgUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24gfD0gKFJDQ19QRVJJUEhDTEtfVUFSVDQgIHwgUkNDX1BFUklQSENMS19VQVJUNSk7CisgIC8qIEdldCB0aGUgVUFSVDQgY2xvY2sgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPlVhcnQ0Q2xvY2tTZWxlY3Rpb24gPSBfX0hBTF9SQ0NfR0VUX1VBUlQ0X1NPVVJDRSgpOworICAvKiBHZXQgdGhlIFVBUlQ1IGNsb2NrIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBQZXJpcGhDbGtJbml0LT5VYXJ0NUNsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9VQVJUNV9TT1VSQ0UoKTsKKworI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpXAorICAgIHx8IGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpXAorICAgIHx8IGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisKKyAgUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24gfD0gUkNDX1BFUklQSENMS19JMlM7CisgIC8qIEdldCB0aGUgSTJTIGNsb2NrIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBQZXJpcGhDbGtJbml0LT5JMnNDbG9ja1NlbGVjdGlvbiA9IF9fSEFMX1JDQ19HRVRfSTJTX1NPVVJDRSgpOworCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4IHx8ICovCisgIAorI2lmIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpXAorICAgIHx8IGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisgICAgICAKKyAgUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24gfD0gUkNDX1BFUklQSENMS19BREMxOworICAvKiBHZXQgdGhlIEFEQzEgY2xvY2sgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPkFkYzFDbG9ja1NlbGVjdGlvbiA9IF9fSEFMX1JDQ19HRVRfQURDMV9TT1VSQ0UoKTsKKworI2VuZGlmIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggICAgICAgICAgICAgICAgICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpXAorICAgIHx8IGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpXAorICAgIHx8IGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpCisKKyAgUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24gfD0gUkNDX1BFUklQSENMS19BREMxMjsKKyAgLyogR2V0IHRoZSBBREMxICYgQURDMiBjbG9jayBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUGVyaXBoQ2xrSW5pdC0+QWRjMTJDbG9ja1NlbGVjdGlvbiA9IF9fSEFMX1JDQ19HRVRfQURDMTJfU09VUkNFKCk7CisKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpXAorICAgIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpCisKKyAgUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24gfD0gUkNDX1BFUklQSENMS19BREMzNDsKKyAgIC8qIEdldCB0aGUgQURDMyAmIEFEQzQgY2xvY2sgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPkFkYzM0Q2xvY2tTZWxlY3Rpb24gPSBfX0hBTF9SQ0NfR0VUX0FEQzM0X1NPVVJDRSgpOworCisjZW5kaWYgLyogU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eClcCisgICAgfHwgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eClcCisgICAgfHwgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eClcCisgICAgfHwgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKworICBQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbiB8PSBSQ0NfUEVSSVBIQ0xLX1RJTTE7CisgIC8qIEdldCB0aGUgVElNMSBjbG9jayBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUGVyaXBoQ2xrSW5pdC0+VGltMUNsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9USU0xX1NPVVJDRSgpOworCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggICAgKi8KKyAgCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eClcCisgICAgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkKKworICBQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbiB8PSBSQ0NfUEVSSVBIQ0xLX1RJTTg7CisgIC8qIEdldCB0aGUgVElNOCBjbG9jayBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUGVyaXBoQ2xrSW5pdC0+VGltOENsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9USU04X1NPVVJDRSgpOworCisjZW5kaWYgLyogU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKworICBQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbiB8PSAoUkNDX1BFUklQSENMS19USU0xNSB8IFJDQ19QRVJJUEhDTEtfVElNMTYgfCBSQ0NfUEVSSVBIQ0xLX1RJTTE3KTsKKyAgLyogR2V0IHRoZSBUSU0xNSBjbG9jayBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUGVyaXBoQ2xrSW5pdC0+VGltMTVDbG9ja1NlbGVjdGlvbiA9IF9fSEFMX1JDQ19HRVRfVElNMTVfU09VUkNFKCk7CisgIC8qIEdldCB0aGUgVElNMTYgY2xvY2sgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPlRpbTE2Q2xvY2tTZWxlY3Rpb24gPSBfX0hBTF9SQ0NfR0VUX1RJTTE2X1NPVVJDRSgpOworICAvKiBHZXQgdGhlIFRJTTE3IGNsb2NrIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBQZXJpcGhDbGtJbml0LT5UaW0xN0Nsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9USU0xN19TT1VSQ0UoKTsKKworI2VuZGlmIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMzNHg4KQorCisgIFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uIHw9IFJDQ19QRVJJUEhDTEtfSFJUSU0xOworICAvKiBHZXQgdGhlIEhSVElNMSBjbG9jayBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUGVyaXBoQ2xrSW5pdC0+SHJ0aW0xQ2xvY2tTZWxlY3Rpb24gPSBfX0hBTF9SQ0NfR0VUX0hSVElNMV9TT1VSQ0UoKTsKKworI2VuZGlmIC8qIFNUTTMyRjMzNHg4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorCisgIFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uIHw9IFJDQ19QRVJJUEhDTEtfU0RBREM7CisgIC8qIEdldCB0aGUgU0RBREMgY2xvY2sgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPlNkYWRjQ2xvY2tTZWxlY3Rpb24gPSBfX0hBTF9SQ0NfR0VUX1NEQURDX1NPVVJDRSgpOworCisgIFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uIHw9IFJDQ19QRVJJUEhDTEtfQ0VDOworICAvKiBHZXQgdGhlIENFQyBjbG9jayBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUGVyaXBoQ2xrSW5pdC0+Q2VjQ2xvY2tTZWxlY3Rpb24gPSBfX0hBTF9SQ0NfR0VUX0NFQ19TT1VSQ0UoKTsKKworI2VuZGlmIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KQorCisgIFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uIHw9IFJDQ19QRVJJUEhDTEtfVElNMjsKKyAgLyogR2V0IHRoZSBUSU0yIGNsb2NrIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBQZXJpcGhDbGtJbml0LT5UaW0yQ2xvY2tTZWxlY3Rpb24gPSBfX0hBTF9SQ0NfR0VUX1RJTTJfU09VUkNFKCk7CisKKyAgUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24gfD0gUkNDX1BFUklQSENMS19USU0zNDsKKyAgLyogR2V0IHRoZSBUSU0zIGNsb2NrIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBQZXJpcGhDbGtJbml0LT5UaW0zNENsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9USU0zNF9TT1VSQ0UoKTsKKworICBQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbiB8PSBSQ0NfUEVSSVBIQ0xLX1RJTTE1OworICAvKiBHZXQgdGhlIFRJTTE1IGNsb2NrIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBQZXJpcGhDbGtJbml0LT5UaW0xNUNsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9USU0xNV9TT1VSQ0UoKTsKKworICBQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbiB8PSBSQ0NfUEVSSVBIQ0xLX1RJTTE2OworICAvKiBHZXQgdGhlIFRJTTE2IGNsb2NrIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBQZXJpcGhDbGtJbml0LT5UaW0xNkNsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9USU0xNl9TT1VSQ0UoKTsKKworICBQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbiB8PSBSQ0NfUEVSSVBIQ0xLX1RJTTE3OworICAvKiBHZXQgdGhlIFRJTTE3IGNsb2NrIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBQZXJpcGhDbGtJbml0LT5UaW0xN0Nsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9USU0xN19TT1VSQ0UoKTsKKworI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4ICovCisgIAorI2lmIGRlZmluZWQgKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KQorICBQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbiB8PSBSQ0NfUEVSSVBIQ0xLX1RJTTIwOworICAvKiBHZXQgdGhlIFRJTTIwIGNsb2NrIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBQZXJpcGhDbGtJbml0LT5UaW0yMENsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9USU0yMF9TT1VSQ0UoKTsKKyNlbmRpZiAvKiBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgdGhlIHBlcmlwaGVyYWwgY2xvY2sgZnJlcXVlbmN5CisgICogQG5vdGUgICBSZXR1cm5zIDAgaWYgcGVyaXBoZXJhbCBjbG9jayBpcyB1bmtub3duIG9yIDB4REVBRERFQUQgaWYgbm90IGFwcGxpY2FibGUuCisgICogQHBhcmFtICBQZXJpcGhDbGsgUGVyaXBoZXJhbCBjbG9jayBpZGVudGlmaWVyCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfUlRDICAgICBSVEMgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfVVNBUlQxICBVU0FSVDEgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfSTJDMSAgICBJMkMxIHBlcmlwaGVyYWwgY2xvY2sKKyAgQGlmIFNUTTMyRjMwMXg4CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19JMkMyICAgIEkyQzIgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfSTJDMyAgICBJMkMzIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0kyUyAgICAgSTJTIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0FEQzEgICAgQURDMSBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19USU0xICAgIFRJTTEgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfVElNMTUgICBUSU0xNSBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19USU0xNiAgIFRJTTE2IHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1RJTTE3ICAgVElNMTcgcGVyaXBoZXJhbCBjbG9jaworICBAZW5kaWYKKyAgQGlmIFNUTTMyRjMwMng4CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19JMkMyICAgIEkyQzIgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfSTJDMyAgICBJMkMzIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0kyUyAgICAgSTJTIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1VTQiAgICAgVVNCIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0FEQzEgICAgQURDMSBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19USU0xICAgIFRJTTEgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfVElNMTUgICBUSU0xNSBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19USU0xNiAgIFRJTTE2IHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1RJTTE3ICAgVElNMTcgcGVyaXBoZXJhbCBjbG9jaworICBAZW5kaWYKKyAgQGlmIFNUTTMyRjMwMnhDCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VU0FSVDIgIFVTQVJUMiBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VU0FSVDMgIFVTQVJUMyBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VQVJUNCAgIFVBUlQ0IHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1VBUlQ1ICAgVUFSVDUgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfSTJDMiAgICBJMkMyIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0kyUyAgICAgSTJTIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1VTQiAgICAgVVNCIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0FEQzEyICAgQURDMTIgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfVElNMSAgICBUSU0xIHBlcmlwaGVyYWwgY2xvY2sKKyAgQGVuZGlmCisgIEBpZiBTVE0zMkYzMDJ4RQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfVVNBUlQyICBVU0FSVDIgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfVVNBUlQzICBVU0FSVDMgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfVUFSVDQgICBVQVJUNCBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VQVJUNSAgIFVBUlQ1IHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0kyQzIgICAgSTJDMiBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19JMkMzICAgIEkyQzMgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfSTJTICAgICBJMlMgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfVVNCICAgICBVU0IgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfQURDMTIgICBBREMxMiBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19USU0xICAgIFRJTTEgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfVElNMiAgICBUSU0yIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1RJTTE1ICAgVElNMTUgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfVElNMTYgICBUSU0xNiBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19USU0xNyAgIFRJTTE3IHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1RJTTM0ICAgVElNMzQgcGVyaXBoZXJhbCBjbG9jaworICBAZW5kaWYKKyAgQGlmIFNUTTMyRjMwM3g4CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19BREMxMiAgIEFEQzEyIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1RJTTEgICAgVElNMSBwZXJpcGhlcmFsIGNsb2NrCisgIEBlbmRpZgorICBAaWYgU1RNMzJGMzAzeEMKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMiAgVVNBUlQyIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMyAgVVNBUlQzIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1VBUlQ0ICAgVUFSVDQgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfVUFSVDUgICBVQVJUNSBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19JMkMyICAgIEkyQzIgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfSTJTICAgICBJMlMgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfVVNCICAgICBVU0IgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfQURDMTIgICBBREMxMiBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19BREMzNCAgIEFEQzM0IHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1RJTTEgICAgVElNMSBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19USU04ICAgIFRJTTggcGVyaXBoZXJhbCBjbG9jaworICBAZW5kaWYKKyAgQGlmIFNUTTMyRjMwM3hFCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VU0FSVDIgIFVTQVJUMiBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VU0FSVDMgIFVTQVJUMyBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VQVJUNCAgIFVBUlQ0IHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1VBUlQ1ICAgVUFSVDUgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfSTJDMiAgICBJMkMyIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0kyQzMgICAgSTJDMyBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19JMlMgICAgIEkyUyBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VU0IgICAgIFVTQiBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19BREMxMiAgIEFEQzEyIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0FEQzM0ICAgQURDMzQgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfVElNMSAgICBUSU0xIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1RJTTIgICAgVElNMiBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19USU04ICAgIFRJTTggcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfVElNMTUgICBUSU0xNSBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19USU0xNiAgIFRJTTE2IHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1RJTTE3ICAgVElNMTcgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfVElNMjAgICBUSU0yMCBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19USU0zNCAgIFRJTTM0IHBlcmlwaGVyYWwgY2xvY2sKKyAgQGVuZGlmCisgIEBpZiBTVE0zMkYzMTh4eAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfSTJDMiAgICBJMkMyIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0kyQzMgICAgSTJDMyBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19JMlMgICAgIEkyUyBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19BREMxICAgIEFEQzEgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfVElNMSAgICBUSU0xIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1RJTTE1ICAgVElNMTUgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfVElNMTYgICBUSU0xNiBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19USU0xNyAgIFRJTTE3IHBlcmlwaGVyYWwgY2xvY2sKKyAgQGVuZGlmCisgIEBpZiBTVE0zMkYzMjh4eAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfSTJDMiAgICBJMkMyIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0FEQzEyICAgQURDMTIgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfVElNMSAgICBUSU0xIHBlcmlwaGVyYWwgY2xvY2sKKyAgQGVuZGlmCisgIEBpZiBTVE0zMkYzMzR4OAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfQURDMTIgICBBREMxMiBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19USU0xICAgIFRJTTEgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfSFJUSU0xICBIUlRJTTEgcGVyaXBoZXJhbCBjbG9jaworICBAZW5kaWYKKyAgQGlmIFNUTTMyRjM1OHh4CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VU0FSVDIgIFVTQVJUMiBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VU0FSVDMgIFVTQVJUMyBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VQVJUNCAgIFVBUlQ0IHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1VBUlQ1ICAgVUFSVDUgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfSTJTICAgICBJMlMgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfQURDMTIgICBBREMxMiBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19BREMzNCAgIEFEQzM0IHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1RJTTEgICAgVElNMSBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19USU04ICAgIFRJTTggcGVyaXBoZXJhbCBjbG9jaworICBAZW5kaWYKKyAgQGlmIFNUTTMyRjM3M3hDCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VU0FSVDIgIFVTQVJUMiBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VU0FSVDMgIFVTQVJUMyBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19JMkMyICAgIEkyQzIgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfVVNCICAgICBVU0IgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfQURDMSAgICBBREMxIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1NEQURDICAgU0RBREMgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfQ0VDICAgICBDRUMgcGVyaXBoZXJhbCBjbG9jaworICBAZW5kaWYKKyAgQGlmIFNUTTMyRjM3OHh4CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VU0FSVDIgIFVTQVJUMiBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VU0FSVDMgIFVTQVJUMyBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19JMkMyICAgIEkyQzIgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfQURDMSAgICBBREMxIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1NEQURDICAgU0RBREMgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfQ0VDICAgICBDRUMgcGVyaXBoZXJhbCBjbG9jaworICBAZW5kaWYKKyAgQGlmIFNUTTMyRjM5OHh4CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VU0FSVDIgIFVTQVJUMiBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VU0FSVDMgIFVTQVJUMyBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VQVJUNCAgIFVBUlQ0IHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1VBUlQ1ICAgVUFSVDUgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfSTJDMiAgICBJMkMyIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0kyQzMgICAgSTJDMyBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19JMlMgICAgIEkyUyBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19BREMxMiAgIEFEQzEyIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0FEQzM0ICAgQURDMzQgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfVElNMSAgICBUSU0xIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1RJTTIgICAgVElNMiBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19USU04ICAgIFRJTTggcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfVElNMTUgICBUSU0xNSBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19USU0xNiAgIFRJTTE2IHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1RJTTE3ICAgVElNMTcgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfVElNMjAgICBUSU0yMCBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19USU0zNCAgIFRJTTM0IHBlcmlwaGVyYWwgY2xvY2sKKyAgQGVuZGlmCisgICogQHJldHZhbCBGcmVxdWVuY3kgaW4gSHogKDA6IG1lYW5zIHRoYXQgbm8gYXZhaWxhYmxlIGZyZXF1ZW5jeSBmb3IgdGhlIHBlcmlwaGVyYWwpCisgICovCit1aW50MzJfdCBIQUxfUkNDRXhfR2V0UGVyaXBoQ0xLRnJlcSh1aW50MzJfdCBQZXJpcGhDbGspCit7CisgIC8qIGZyZXF1ZW5jeSA9PSAwIDogbWVhbnMgdGhhdCBubyBhdmFpbGFibGUgZnJlcXVlbmN5IGZvciB0aGUgcGVyaXBoZXJhbCAqLworICB1aW50MzJfdCBmcmVxdWVuY3kgPSAwVTsKKworICB1aW50MzJfdCBzcmNjbGsgPSAwVTsKKyNpZiBkZWZpbmVkKFJDQ19DRkdSMl9BREMxUFJFUykgfHwgZGVmaW5lZChSQ0NfQ0ZHUjJfQURDUFJFMTIpIHx8IGRlZmluZWQoUkNDX0NGR1IyX0FEQ1BSRTM0KQorICB1aW50MTZfdCBhZGNfcGxsX3ByZWRpdl90YWJsZVsxNl0gPSB7IDFVLCAgMlUsICA0VSwgIDZVLCA4VSwgMTBVLCAxMlUsIDE2VSwgMzJVLCA2NFUsIDEyOFUsIDI1NlUsIDI1NlUsIDI1NlUsIDI1NlUsIDI1NlV9OworI2VuZGlmIC8qIFJDQ19DRkdSMl9BREMxUFJFUyB8fCBSQ0NfQ0ZHUjJfQURDUFJFMTIgfHwgUkNDX0NGR1IyX0FEQ1BSRTM0ICovCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUl9TRFBSRSkKKyAgdWludDhfdCBzZGFkY19wcmVzY2FsZXJfdGFibGVbMTZdID0geyAyVSwgIDRVLCAgNlUsIDhVLCAxMFUsIDEyVSwgMTRVLCAxNlUsIDIwVSwgMjRVLCAyOFUsIDMyVSwgMzZVLCA0MFUsIDQ0VSwgNDhVfTsKKyNlbmRpZiAvKiBSQ0NfQ0ZHUl9TRFBSRSAqLworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SQ0NfUEVSSVBIQ0xPQ0soUGVyaXBoQ2xrKSk7CisgIAorICBzd2l0Y2ggKFBlcmlwaENsaykKKyAgeworICBjYXNlIFJDQ19QRVJJUEhDTEtfUlRDOgorICAgIHsKKyAgICAgIC8qIEdldCB0aGUgY3VycmVudCBSVEMgc291cmNlICovCisgICAgICBzcmNjbGsgPSBfX0hBTF9SQ0NfR0VUX1JUQ19TT1VSQ0UoKTsKKworICAgICAgLyogQ2hlY2sgaWYgTFNFIGlzIHJlYWR5IGFuZCBpZiBSVEMgY2xvY2sgc2VsZWN0aW9uIGlzIExTRSAqLworICAgICAgaWYgKChzcmNjbGsgPT0gUkNDX1JUQ0NMS1NPVVJDRV9MU0UpICYmIChIQUxfSVNfQklUX1NFVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRVJEWSkpKQorICAgICAgeworICAgICAgICBmcmVxdWVuY3kgPSBMU0VfVkFMVUU7CisgICAgICB9CisgICAgICAvKiBDaGVjayBpZiBMU0kgaXMgcmVhZHkgYW5kIGlmIFJUQyBjbG9jayBzZWxlY3Rpb24gaXMgTFNJICovCisgICAgICBlbHNlIGlmICgoc3JjY2xrID09IFJDQ19SVENDTEtTT1VSQ0VfTFNJKSAmJiAoSEFMX0lTX0JJVF9TRVQoUkNDLT5DU1IsIFJDQ19DU1JfTFNJUkRZKSkpCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IExTSV9WQUxVRTsKKyAgICAgIH0KKyAgICAgIC8qIENoZWNrIGlmIEhTRSBpcyByZWFkeSAgYW5kIGlmIFJUQyBjbG9jayBzZWxlY3Rpb24gaXMgSFNJX0RJVjMyKi8KKyAgICAgIGVsc2UgaWYgKChzcmNjbGsgPT0gUkNDX1JUQ0NMS1NPVVJDRV9IU0VfRElWMzIpICYmIChIQUxfSVNfQklUX1NFVChSQ0MtPkNSLCBSQ0NfQ1JfSFNFUkRZKSkpCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IEhTRV9WQUxVRSAvIDMyVTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgY2FzZSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMToKKyAgICB7CisgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgVVNBUlQxIHNvdXJjZSAqLworICAgICAgc3JjY2xrID0gX19IQUxfUkNDX0dFVF9VU0FSVDFfU09VUkNFKCk7CisKKyAgICAgIC8qIENoZWNrIGlmIFVTQVJUMSBjbG9jayBzZWxlY3Rpb24gaXMgUENMSzEgKi8KKyNpZiBkZWZpbmVkKFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzIpCisgICAgICBpZiAoc3JjY2xrID09IFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzIpCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0UENMSzJGcmVxKCk7CisgICAgICB9CisjZWxzZQorICAgICAgaWYgKHNyY2NsayA9PSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsxKQorICAgICAgeworICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFBDTEsxRnJlcSgpOworICAgICAgfQorI2VuZGlmIC8qIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzIgKi8KKyAgICAgIC8qIENoZWNrIGlmIEhTSSBpcyByZWFkeSBhbmQgaWYgVVNBUlQxIGNsb2NrIHNlbGVjdGlvbiBpcyBIU0kgKi8KKyAgICAgIGVsc2UgaWYgKChzcmNjbGsgPT0gUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0kpICYmIChIQUxfSVNfQklUX1NFVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSkpCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsKKyAgICAgIH0KKyAgICAgIC8qIENoZWNrIGlmIFVTQVJUMSBjbG9jayBzZWxlY3Rpb24gaXMgU1lTQ0xLICovCisgICAgICBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX1VTQVJUMUNMS1NPVVJDRV9TWVNDTEspCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCk7CisgICAgICB9CisgICAgICAvKiBDaGVjayBpZiBMU0UgaXMgcmVhZHkgIGFuZCBpZiBVU0FSVDEgY2xvY2sgc2VsZWN0aW9uIGlzIExTRSAqLworICAgICAgZWxzZSBpZiAoKHNyY2NsayA9PSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0xTRSkgJiYgKEhBTF9JU19CSVRfU0VUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFUkRZKSkpCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IExTRV9WQUxVRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyNpZiBkZWZpbmVkKFJDQ19DRkdSM19VU0FSVDJTVykKKyAgY2FzZSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMjoKKyAgICB7CisgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgVVNBUlQyIHNvdXJjZSAqLworICAgICAgc3JjY2xrID0gX19IQUxfUkNDX0dFVF9VU0FSVDJfU09VUkNFKCk7CisKKyAgICAgIC8qIENoZWNrIGlmIFVTQVJUMiBjbG9jayBzZWxlY3Rpb24gaXMgUENMSzEgKi8KKyAgICAgIGlmIChzcmNjbGsgPT0gUkNDX1VTQVJUMkNMS1NPVVJDRV9QQ0xLMSkKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKTsKKyAgICAgIH0KKyAgICAgIC8qIENoZWNrIGlmIEhTSSBpcyByZWFkeSBhbmQgaWYgVVNBUlQyIGNsb2NrIHNlbGVjdGlvbiBpcyBIU0kgKi8KKyAgICAgIGVsc2UgaWYgKChzcmNjbGsgPT0gUkNDX1VTQVJUMkNMS1NPVVJDRV9IU0kpICYmIChIQUxfSVNfQklUX1NFVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSkpCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsKKyAgICAgIH0KKyAgICAgIC8qIENoZWNrIGlmIFVTQVJUMiBjbG9jayBzZWxlY3Rpb24gaXMgU1lTQ0xLICovCisgICAgICBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX1VTQVJUMkNMS1NPVVJDRV9TWVNDTEspCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCk7CisgICAgICB9CisgICAgICAvKiBDaGVjayBpZiBMU0UgaXMgcmVhZHkgIGFuZCBpZiBVU0FSVDIgY2xvY2sgc2VsZWN0aW9uIGlzIExTRSAqLworICAgICAgZWxzZSBpZiAoKHNyY2NsayA9PSBSQ0NfVVNBUlQyQ0xLU09VUkNFX0xTRSkgJiYgKEhBTF9JU19CSVRfU0VUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFUkRZKSkpCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IExTRV9WQUxVRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZiAvKiBSQ0NfQ0ZHUjNfVVNBUlQyU1cgKi8KKyNpZiBkZWZpbmVkKFJDQ19DRkdSM19VU0FSVDNTVykKKyAgY2FzZSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMzoKKyAgICB7CisgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgVVNBUlQzIHNvdXJjZSAqLworICAgICAgc3JjY2xrID0gX19IQUxfUkNDX0dFVF9VU0FSVDNfU09VUkNFKCk7CisKKyAgICAgIC8qIENoZWNrIGlmIFVTQVJUMyBjbG9jayBzZWxlY3Rpb24gaXMgUENMSzEgKi8KKyAgICAgIGlmIChzcmNjbGsgPT0gUkNDX1VTQVJUM0NMS1NPVVJDRV9QQ0xLMSkKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKTsKKyAgICAgIH0KKyAgICAgIC8qIENoZWNrIGlmIEhTSSBpcyByZWFkeSBhbmQgaWYgVVNBUlQzIGNsb2NrIHNlbGVjdGlvbiBpcyBIU0kgKi8KKyAgICAgIGVsc2UgaWYgKChzcmNjbGsgPT0gUkNDX1VTQVJUM0NMS1NPVVJDRV9IU0kpICYmIChIQUxfSVNfQklUX1NFVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSkpCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsKKyAgICAgIH0KKyAgICAgIC8qIENoZWNrIGlmIFVTQVJUMyBjbG9jayBzZWxlY3Rpb24gaXMgU1lTQ0xLICovCisgICAgICBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX1VTQVJUM0NMS1NPVVJDRV9TWVNDTEspCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCk7CisgICAgICB9CisgICAgICAvKiBDaGVjayBpZiBMU0UgaXMgcmVhZHkgIGFuZCBpZiBVU0FSVDMgY2xvY2sgc2VsZWN0aW9uIGlzIExTRSAqLworICAgICAgZWxzZSBpZiAoKHNyY2NsayA9PSBSQ0NfVVNBUlQzQ0xLU09VUkNFX0xTRSkgJiYgKEhBTF9JU19CSVRfU0VUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFUkRZKSkpCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IExTRV9WQUxVRTsKKyAgICAgIH0KKyAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmIC8qIFJDQ19DRkdSM19VU0FSVDNTVyAqLworI2lmIGRlZmluZWQoUkNDX0NGR1IzX1VBUlQ0U1cpCisgIGNhc2UgUkNDX1BFUklQSENMS19VQVJUNDoKKyAgICB7CisgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgVUFSVDQgc291cmNlICovCisgICAgICBzcmNjbGsgPSBfX0hBTF9SQ0NfR0VUX1VBUlQ0X1NPVVJDRSgpOworCisgICAgICAvKiBDaGVjayBpZiBVQVJUNCBjbG9jayBzZWxlY3Rpb24gaXMgUENMSzEgKi8KKyAgICAgIGlmIChzcmNjbGsgPT0gUkNDX1VBUlQ0Q0xLU09VUkNFX1BDTEsxKQorICAgICAgeworICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFBDTEsxRnJlcSgpOworICAgICAgfQorICAgICAgLyogQ2hlY2sgaWYgSFNJIGlzIHJlYWR5IGFuZCBpZiBVQVJUNCBjbG9jayBzZWxlY3Rpb24gaXMgSFNJICovCisgICAgICBlbHNlIGlmICgoc3JjY2xrID09IFJDQ19VQVJUNENMS1NPVVJDRV9IU0kpICYmIChIQUxfSVNfQklUX1NFVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSkpCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsKKyAgICAgIH0KKyAgICAgIC8qIENoZWNrIGlmIFVBUlQ0IGNsb2NrIHNlbGVjdGlvbiBpcyBTWVNDTEsgKi8KKyAgICAgIGVsc2UgaWYgKHNyY2NsayA9PSBSQ0NfVUFSVDRDTEtTT1VSQ0VfU1lTQ0xLKQorICAgICAgeworICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOworICAgICAgfQorICAgICAgLyogQ2hlY2sgaWYgTFNFIGlzIHJlYWR5ICBhbmQgaWYgVUFSVDQgY2xvY2sgc2VsZWN0aW9uIGlzIExTRSAqLworICAgICAgZWxzZSBpZiAoKHNyY2NsayA9PSBSQ0NfVUFSVDRDTEtTT1VSQ0VfTFNFKSAmJiAoSEFMX0lTX0JJVF9TRVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VSRFkpKSkKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gTFNFX1ZBTFVFOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmIC8qIFJDQ19DRkdSM19VQVJUNFNXICovCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfVUFSVDVTVykKKyAgY2FzZSBSQ0NfUEVSSVBIQ0xLX1VBUlQ1OgorICAgIHsKKyAgICAgIC8qIEdldCB0aGUgY3VycmVudCBVQVJUNSBzb3VyY2UgKi8KKyAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfVUFSVDVfU09VUkNFKCk7CisKKyAgICAgIC8qIENoZWNrIGlmIFVBUlQ1IGNsb2NrIHNlbGVjdGlvbiBpcyBQQ0xLMSAqLworICAgICAgaWYgKHNyY2NsayA9PSBSQ0NfVUFSVDVDTEtTT1VSQ0VfUENMSzEpCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0UENMSzFGcmVxKCk7CisgICAgICB9CisgICAgICAvKiBDaGVjayBpZiBIU0kgaXMgcmVhZHkgYW5kIGlmIFVBUlQ1IGNsb2NrIHNlbGVjdGlvbiBpcyBIU0kgKi8KKyAgICAgIGVsc2UgaWYgKChzcmNjbGsgPT0gUkNDX1VBUlQ1Q0xLU09VUkNFX0hTSSkgJiYgKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9IU0lSRFkpKSkKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gSFNJX1ZBTFVFOworICAgICAgfQorICAgICAgLyogQ2hlY2sgaWYgVUFSVDUgY2xvY2sgc2VsZWN0aW9uIGlzIFNZU0NMSyAqLworICAgICAgZWxzZSBpZiAoc3JjY2xrID09IFJDQ19VQVJUNUNMS1NPVVJDRV9TWVNDTEspCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCk7CisgICAgICB9CisgICAgICAvKiBDaGVjayBpZiBMU0UgaXMgcmVhZHkgIGFuZCBpZiBVQVJUNSBjbG9jayBzZWxlY3Rpb24gaXMgTFNFICovCisgICAgICBlbHNlIGlmICgoc3JjY2xrID09IFJDQ19VQVJUNUNMS1NPVVJDRV9MU0UpICYmIChIQUxfSVNfQklUX1NFVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRVJEWSkpKQorICAgICAgeworICAgICAgICBmcmVxdWVuY3kgPSBMU0VfVkFMVUU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisjZW5kaWYgLyogUkNDX0NGR1IzX1VBUlQ1U1cgKi8KKyAgY2FzZSBSQ0NfUEVSSVBIQ0xLX0kyQzE6CisgICAgeworICAgICAgLyogR2V0IHRoZSBjdXJyZW50IEkyQzEgc291cmNlICovCisgICAgICBzcmNjbGsgPSBfX0hBTF9SQ0NfR0VUX0kyQzFfU09VUkNFKCk7CisKKyAgICAgIC8qIENoZWNrIGlmIEhTSSBpcyByZWFkeSBhbmQgaWYgSTJDMSBjbG9jayBzZWxlY3Rpb24gaXMgSFNJICovCisgICAgICBpZiAoKHNyY2NsayA9PSBSQ0NfSTJDMUNMS1NPVVJDRV9IU0kpICYmIChIQUxfSVNfQklUX1NFVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSkpCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsKKyAgICAgIH0KKyAgICAgIC8qIENoZWNrIGlmIEkyQzEgY2xvY2sgc2VsZWN0aW9uIGlzIFNZU0NMSyAqLworICAgICAgZWxzZSBpZiAoc3JjY2xrID09IFJDQ19JMkMxQ0xLU09VUkNFX1NZU0NMSykKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyNpZiBkZWZpbmVkKFJDQ19DRkdSM19JMkMyU1cpCisgIGNhc2UgUkNDX1BFUklQSENMS19JMkMyOgorICAgIHsKKyAgICAgIC8qIEdldCB0aGUgY3VycmVudCBJMkMyIHNvdXJjZSAqLworICAgICAgc3JjY2xrID0gX19IQUxfUkNDX0dFVF9JMkMyX1NPVVJDRSgpOworCisgICAgICAvKiBDaGVjayBpZiBIU0kgaXMgcmVhZHkgYW5kIGlmIEkyQzIgY2xvY2sgc2VsZWN0aW9uIGlzIEhTSSAqLworICAgICAgaWYgKChzcmNjbGsgPT0gUkNDX0kyQzJDTEtTT1VSQ0VfSFNJKSAmJiAoSEFMX0lTX0JJVF9TRVQoUkNDLT5DUiwgUkNDX0NSX0hTSVJEWSkpKQorICAgICAgeworICAgICAgICBmcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICB9CisgICAgICAvKiBDaGVjayBpZiBJMkMyIGNsb2NrIHNlbGVjdGlvbiBpcyBTWVNDTEsgKi8KKyAgICAgIGVsc2UgaWYgKHNyY2NsayA9PSBSQ0NfSTJDMkNMS1NPVVJDRV9TWVNDTEspCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisjZW5kaWYgLyogUkNDX0NGR1IzX0kyQzJTVyAqLworI2lmIGRlZmluZWQoUkNDX0NGR1IzX0kyQzNTVykKKyAgY2FzZSBSQ0NfUEVSSVBIQ0xLX0kyQzM6CisgICAgeworICAgICAgLyogR2V0IHRoZSBjdXJyZW50IEkyQzMgc291cmNlICovCisgICAgICBzcmNjbGsgPSBfX0hBTF9SQ0NfR0VUX0kyQzNfU09VUkNFKCk7CisKKyAgICAgIC8qIENoZWNrIGlmIEhTSSBpcyByZWFkeSBhbmQgaWYgSTJDMyBjbG9jayBzZWxlY3Rpb24gaXMgSFNJICovCisgICAgICBpZiAoKHNyY2NsayA9PSBSQ0NfSTJDM0NMS1NPVVJDRV9IU0kpICYmIChIQUxfSVNfQklUX1NFVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSkpCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsKKyAgICAgIH0KKyAgICAgIC8qIENoZWNrIGlmIEkyQzMgY2xvY2sgc2VsZWN0aW9uIGlzIFNZU0NMSyAqLworICAgICAgZWxzZSBpZiAoc3JjY2xrID09IFJDQ19JMkMzQ0xLU09VUkNFX1NZU0NMSykKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZiAvKiBSQ0NfQ0ZHUjNfSTJDM1NXICovCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUl9JMlNTUkMpCisgIGNhc2UgUkNDX1BFUklQSENMS19JMlM6CisgICAgeworICAgICAgLyogR2V0IHRoZSBjdXJyZW50IEkyUyBzb3VyY2UgKi8KKyAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfSTJTX1NPVVJDRSgpOworCisgICAgICAvKiBDaGVjayBpZiBJMlMgY2xvY2sgc2VsZWN0aW9uIGlzIEV4dGVybmFsIGNsb2NrIG1hcHBlZCBvbiB0aGUgSTJTX0NLSU4gcGluICovCisgICAgICBpZiAoc3JjY2xrID09IFJDQ19JMlNDTEtTT1VSQ0VfRVhUKQorICAgICAgeworICAgICAgICAvKiBFeHRlcm5hbCBjbG9jayB1c2VkLiBGcmVxdWVuY3kgY2Fubm90IGJlIHJldHVybmVkLiovCisgICAgICAgIGZyZXF1ZW5jeSA9IDB4REVBRERFQURVOworICAgICAgfQorICAgICAgLyogQ2hlY2sgaWYgSTJTIGNsb2NrIHNlbGVjdGlvbiBpcyBTWVNDTEsgKi8KKyAgICAgIGVsc2UgaWYgKHNyY2NsayA9PSBSQ0NfSTJTQ0xLU09VUkNFX1NZU0NMSykKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZiAvKiBSQ0NfQ0ZHUl9JMlNTUkMgKi8KKyNpZiBkZWZpbmVkKFJDQ19DRkdSX1VTQlBSRSkKKyAgY2FzZSBSQ0NfUEVSSVBIQ0xLX1VTQjoKKyAgICB7CisgICAgICAvKiBDaGVjayBpZiBQTEwgaXMgcmVhZHkgKi8KKyAgICAgIGlmIChIQUxfSVNfQklUX1NFVChSQ0MtPkNSLCBSQ0NfQ1JfUExMUkRZKSkKKyAgICAgIHsKKyAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IFVTQiBzb3VyY2UgKi8KKyAgICAgICAgc3JjY2xrID0gX19IQUxfUkNDX0dFVF9VU0JfU09VUkNFKCk7CisKKyAgICAgICAgLyogQ2hlY2sgaWYgVVNCIGNsb2NrIHNlbGVjdGlvbiBpcyBub3QgZGl2aWRlZCAqLworICAgICAgICBpZiAoc3JjY2xrID09IFJDQ19VU0JDTEtTT1VSQ0VfUExMKQorICAgICAgICB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gUkNDX0dldFBMTENMS0ZyZXEoKTsKKyAgICAgICAgfQorICAgICAgICAvKiBDaGVjayBpZiBVU0IgY2xvY2sgc2VsZWN0aW9uIGlzIGRpdmlkZWQgYnkgMS41ICovCisgICAgICAgIGVsc2UgLyogUkNDX1VTQkNMS1NPVVJDRV9QTExfRElWMV81ICovCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSAoUkNDX0dldFBMTENMS0ZyZXEoKSAqIDNVKSAvIDJVOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisjZW5kaWYgLyogUkNDX0NGR1JfVVNCUFJFICovCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjJfQURDMVBSRVMpIHx8IGRlZmluZWQoUkNDX0NGR1JfQURDUFJFKQorICBjYXNlIFJDQ19QRVJJUEhDTEtfQURDMToKKyAgICB7CisgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgQURDMSBzb3VyY2UgKi8KKyAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfQURDMV9TT1VSQ0UoKTsKKyNpZiBkZWZpbmVkKFJDQ19DRkdSMl9BREMxUFJFUykKKyAgICAgIC8qIENoZWNrIGlmIEFEQzEgY2xvY2sgc2VsZWN0aW9uIGlzIEFIQiAqLworICAgICAgaWYgKHNyY2NsayA9PSBSQ0NfQURDMVBMTENMS19PRkYpCisgICAgICB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gU3lzdGVtQ29yZUNsb2NrOworICAgICAgfQorICAgICAgLyogUExMIGNsb2NrIGhhcyBiZWVuIHNlbGVjdGVkICovCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIENoZWNrIGlmIFBMTCBpcyByZWFkeSAqLworICAgICAgICBpZiAoSEFMX0lTX0JJVF9TRVQoUkNDLT5DUiwgUkNDX0NSX1BMTFJEWSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBGcmVxdWVuY3kgaXMgdGhlIFBMTCBmcmVxdWVuY3kgZGl2aWRlZCBieSBBREMgcHJlc2NhbGVyICgxVS8yVS80VS82VS84VS8xMFUvMTJVLzE2VS8zMlUvNjRVLzEyOFUvMjU2VSkgKi8KKyAgICAgICAgICBmcmVxdWVuY3kgPSBSQ0NfR2V0UExMQ0xLRnJlcSgpIC8gYWRjX3BsbF9wcmVkaXZfdGFibGVbKHNyY2NsayA+PiBQT1NJVElPTl9WQUwoUkNDX0NGR1IyX0FEQzFQUkVTKSkgJiAweEZVXTsKKyAgICAgICAgfQorICAgICAgfQorI2Vsc2UgLyogUkNDX0NGR1JfQURDUFJFICovCisgICAgICAvKiBBREMxIGlzIHNldCB0byBQTENLMiBmcmVxdWVuY3kgZGl2aWRlZCBieSAyVS80VS82VS84VSAqLworICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRQQ0xLMkZyZXEoKSAvICgoKHNyY2NsayAgPj4gUE9TSVRJT05fVkFMKFJDQ19DRkdSX0FEQ1BSRSkpICsgMVUpICogMlUpOworI2VuZGlmIC8qIFJDQ19DRkdSMl9BREMxUFJFUyAqLworICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmIC8qIFJDQ19DRkdSMl9BREMxUFJFUyB8fCBSQ0NfQ0ZHUl9BRENQUkUgKi8KKyNpZiBkZWZpbmVkKFJDQ19DRkdSMl9BRENQUkUxMikKKyAgY2FzZSBSQ0NfUEVSSVBIQ0xLX0FEQzEyOgorICAgIHsKKyAgICAgIC8qIEdldCB0aGUgY3VycmVudCBBREMxMiBzb3VyY2UgKi8KKyAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfQURDMTJfU09VUkNFKCk7CisgICAgICAvKiBDaGVjayBpZiBBREMxMiBjbG9jayBzZWxlY3Rpb24gaXMgQUhCICovCisgICAgICBpZiAoc3JjY2xrID09IFJDQ19BREMxMlBMTENMS19PRkYpCisgICAgICB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gU3lzdGVtQ29yZUNsb2NrOworICAgICAgfQorICAgICAgLyogUExMIGNsb2NrIGhhcyBiZWVuIHNlbGVjdGVkICovCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIENoZWNrIGlmIFBMTCBpcyByZWFkeSAqLworICAgICAgICBpZiAoSEFMX0lTX0JJVF9TRVQoUkNDLT5DUiwgUkNDX0NSX1BMTFJEWSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBGcmVxdWVuY3kgaXMgdGhlIFBMTCBmcmVxdWVuY3kgZGl2aWRlZCBieSBBREMgcHJlc2NhbGVyICgxVS8yVS80VS82LzhVLzEwVS8xMlUvMTZVLzMyVS82NFUvMTI4VS8yNTZVKSAqLworICAgICAgICAgIGZyZXF1ZW5jeSA9IFJDQ19HZXRQTExDTEtGcmVxKCkgLyBhZGNfcGxsX3ByZWRpdl90YWJsZVsoc3JjY2xrID4+IFBPU0lUSU9OX1ZBTChSQ0NfQ0ZHUjJfQURDUFJFMTIpKSAmIDB4Rl07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZiAvKiBSQ0NfQ0ZHUjJfQURDUFJFMTIgKi8KKyNpZiBkZWZpbmVkKFJDQ19DRkdSMl9BRENQUkUzNCkKKyAgY2FzZSBSQ0NfUEVSSVBIQ0xLX0FEQzM0OgorICAgIHsKKyAgICAgIC8qIEdldCB0aGUgY3VycmVudCBBREMzNCBzb3VyY2UgKi8KKyAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfQURDMzRfU09VUkNFKCk7CisgICAgICAvKiBDaGVjayBpZiBBREMzNCBjbG9jayBzZWxlY3Rpb24gaXMgQUhCICovCisgICAgICBpZiAoc3JjY2xrID09IFJDQ19BREMzNFBMTENMS19PRkYpCisgICAgICB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gU3lzdGVtQ29yZUNsb2NrOworICAgICAgfQorICAgICAgLyogUExMIGNsb2NrIGhhcyBiZWVuIHNlbGVjdGVkICovCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIENoZWNrIGlmIFBMTCBpcyByZWFkeSAqLworICAgICAgICBpZiAoSEFMX0lTX0JJVF9TRVQoUkNDLT5DUiwgUkNDX0NSX1BMTFJEWSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBGcmVxdWVuY3kgaXMgdGhlIFBMTCBmcmVxdWVuY3kgZGl2aWRlZCBieSBBREMgcHJlc2NhbGVyICgxVS8yVS80VS82VS84VS8xMFUvMTJVLzE2VS8zMlUvNjRVLzEyOFUvMjU2VSkgKi8KKyAgICAgICAgICBmcmVxdWVuY3kgPSBSQ0NfR2V0UExMQ0xLRnJlcSgpIC8gYWRjX3BsbF9wcmVkaXZfdGFibGVbKHNyY2NsayA+PiBQT1NJVElPTl9WQUwoUkNDX0NGR1IyX0FEQ1BSRTM0KSkgJiAweEZdOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisjZW5kaWYgLyogUkNDX0NGR1IyX0FEQ1BSRTM0ICovCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfVElNMVNXKQorICBjYXNlIFJDQ19QRVJJUEhDTEtfVElNMToKKyAgICB7CisgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgVElNMSBzb3VyY2UgKi8KKyAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfVElNMV9TT1VSQ0UoKTsKKworICAgICAgLyogQ2hlY2sgaWYgUExMIGlzIHJlYWR5IGFuZCBpZiBUSU0xIGNsb2NrIHNlbGVjdGlvbiBpcyBQTEwgKi8KKyAgICAgIGlmICgoc3JjY2xrID09IFJDQ19USU0xQ0xLX1BMTENMSykgJiYgKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9QTExSRFkpKSkKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gUkNDX0dldFBMTENMS0ZyZXEoKTsKKyAgICAgIH0KKyAgICAgIC8qIENoZWNrIGlmIFRJTTEgY2xvY2sgc2VsZWN0aW9uIGlzIFNZU0NMSyAqLworICAgICAgZWxzZSBpZiAoc3JjY2xrID09IFJDQ19USU0xQ0xLX0hDTEspCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IFN5c3RlbUNvcmVDbG9jazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZiAvKiBSQ0NfQ0ZHUjNfVElNMVNXICovCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfVElNMlNXKQorICBjYXNlIFJDQ19QRVJJUEhDTEtfVElNMjoKKyAgICB7CisgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgVElNMiBzb3VyY2UgKi8KKyAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfVElNMl9TT1VSQ0UoKTsKKworICAgICAgLyogQ2hlY2sgaWYgUExMIGlzIHJlYWR5IGFuZCBpZiBUSU0yIGNsb2NrIHNlbGVjdGlvbiBpcyBQTEwgKi8KKyAgICAgIGlmICgoc3JjY2xrID09IFJDQ19USU0yQ0xLX1BMTENMSykgJiYgKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9QTExSRFkpKSkKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gUkNDX0dldFBMTENMS0ZyZXEoKTsKKyAgICAgIH0KKyAgICAgIC8qIENoZWNrIGlmIFRJTTIgY2xvY2sgc2VsZWN0aW9uIGlzIFNZU0NMSyAqLworICAgICAgZWxzZSBpZiAoc3JjY2xrID09IFJDQ19USU0yQ0xLX0hDTEspCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IFN5c3RlbUNvcmVDbG9jazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZiAvKiBSQ0NfQ0ZHUjNfVElNMlNXICovCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfVElNOFNXKQorICBjYXNlIFJDQ19QRVJJUEhDTEtfVElNODoKKyAgICB7CisgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgVElNOCBzb3VyY2UgKi8KKyAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfVElNOF9TT1VSQ0UoKTsKKworICAgICAgLyogQ2hlY2sgaWYgUExMIGlzIHJlYWR5IGFuZCBpZiBUSU04IGNsb2NrIHNlbGVjdGlvbiBpcyBQTEwgKi8KKyAgICAgIGlmICgoc3JjY2xrID09IFJDQ19USU04Q0xLX1BMTENMSykgJiYgKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9QTExSRFkpKSkKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gUkNDX0dldFBMTENMS0ZyZXEoKTsKKyAgICAgIH0KKyAgICAgIC8qIENoZWNrIGlmIFRJTTggY2xvY2sgc2VsZWN0aW9uIGlzIFNZU0NMSyAqLworICAgICAgZWxzZSBpZiAoc3JjY2xrID09IFJDQ19USU04Q0xLX0hDTEspCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IFN5c3RlbUNvcmVDbG9jazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZiAvKiBSQ0NfQ0ZHUjNfVElNOFNXICovCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfVElNMTVTVykKKyAgY2FzZSBSQ0NfUEVSSVBIQ0xLX1RJTTE1OgorICAgIHsKKyAgICAgIC8qIEdldCB0aGUgY3VycmVudCBUSU0xNSBzb3VyY2UgKi8KKyAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfVElNMTVfU09VUkNFKCk7CisKKyAgICAgIC8qIENoZWNrIGlmIFBMTCBpcyByZWFkeSBhbmQgaWYgVElNMTUgY2xvY2sgc2VsZWN0aW9uIGlzIFBMTCAqLworICAgICAgaWYgKChzcmNjbGsgPT0gUkNDX1RJTTE1Q0xLX1BMTENMSykgJiYgKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9QTExSRFkpKSkKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gUkNDX0dldFBMTENMS0ZyZXEoKTsKKyAgICAgIH0KKyAgICAgIC8qIENoZWNrIGlmIFRJTTE1IGNsb2NrIHNlbGVjdGlvbiBpcyBTWVNDTEsgKi8KKyAgICAgIGVsc2UgaWYgKHNyY2NsayA9PSBSQ0NfVElNMTVDTEtfSENMSykKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gU3lzdGVtQ29yZUNsb2NrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmIC8qIFJDQ19DRkdSM19USU0xNVNXICovCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfVElNMTZTVykKKyAgY2FzZSBSQ0NfUEVSSVBIQ0xLX1RJTTE2OgorICAgIHsKKyAgICAgIC8qIEdldCB0aGUgY3VycmVudCBUSU0xNiBzb3VyY2UgKi8KKyAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfVElNMTZfU09VUkNFKCk7CisKKyAgICAgIC8qIENoZWNrIGlmIFBMTCBpcyByZWFkeSBhbmQgaWYgVElNMTYgY2xvY2sgc2VsZWN0aW9uIGlzIFBMTCAqLworICAgICAgaWYgKChzcmNjbGsgPT0gUkNDX1RJTTE2Q0xLX1BMTENMSykgJiYgKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9QTExSRFkpKSkKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gUkNDX0dldFBMTENMS0ZyZXEoKTsKKyAgICAgIH0KKyAgICAgIC8qIENoZWNrIGlmIFRJTTE2IGNsb2NrIHNlbGVjdGlvbiBpcyBTWVNDTEsgKi8KKyAgICAgIGVsc2UgaWYgKHNyY2NsayA9PSBSQ0NfVElNMTZDTEtfSENMSykKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gU3lzdGVtQ29yZUNsb2NrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmIC8qIFJDQ19DRkdSM19USU0xNlNXICovCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfVElNMTdTVykKKyAgY2FzZSBSQ0NfUEVSSVBIQ0xLX1RJTTE3OgorICAgIHsKKyAgICAgIC8qIEdldCB0aGUgY3VycmVudCBUSU0xNyBzb3VyY2UgKi8KKyAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfVElNMTdfU09VUkNFKCk7CisKKyAgICAgIC8qIENoZWNrIGlmIFBMTCBpcyByZWFkeSBhbmQgaWYgVElNMTcgY2xvY2sgc2VsZWN0aW9uIGlzIFBMTCAqLworICAgICAgaWYgKChzcmNjbGsgPT0gUkNDX1RJTTE3Q0xLX1BMTENMSykgJiYgKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9QTExSRFkpKSkKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gUkNDX0dldFBMTENMS0ZyZXEoKTsKKyAgICAgIH0KKyAgICAgIC8qIENoZWNrIGlmIFRJTTE3IGNsb2NrIHNlbGVjdGlvbiBpcyBTWVNDTEsgKi8KKyAgICAgIGVsc2UgaWYgKHNyY2NsayA9PSBSQ0NfVElNMTdDTEtfSENMSykKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gU3lzdGVtQ29yZUNsb2NrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmIC8qIFJDQ19DRkdSM19USU0xN1NXICovCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfVElNMjBTVykKKyAgY2FzZSBSQ0NfUEVSSVBIQ0xLX1RJTTIwOgorICAgIHsKKyAgICAgIC8qIEdldCB0aGUgY3VycmVudCBUSU0yMCBzb3VyY2UgKi8KKyAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfVElNMjBfU09VUkNFKCk7CisKKyAgICAgIC8qIENoZWNrIGlmIFBMTCBpcyByZWFkeSBhbmQgaWYgVElNMjAgY2xvY2sgc2VsZWN0aW9uIGlzIFBMTCAqLworICAgICAgaWYgKChzcmNjbGsgPT0gUkNDX1RJTTIwQ0xLX1BMTENMSykgJiYgKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9QTExSRFkpKSkKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gUkNDX0dldFBMTENMS0ZyZXEoKTsKKyAgICAgIH0KKyAgICAgIC8qIENoZWNrIGlmIFRJTTIwIGNsb2NrIHNlbGVjdGlvbiBpcyBTWVNDTEsgKi8KKyAgICAgIGVsc2UgaWYgKHNyY2NsayA9PSBSQ0NfVElNMjBDTEtfSENMSykKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gU3lzdGVtQ29yZUNsb2NrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmIC8qIFJDQ19DRkdSM19USU0yMFNXICovCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfVElNMzRTVykKKyAgY2FzZSBSQ0NfUEVSSVBIQ0xLX1RJTTM0OgorICAgIHsKKyAgICAgIC8qIEdldCB0aGUgY3VycmVudCBUSU0zNCBzb3VyY2UgKi8KKyAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfVElNMzRfU09VUkNFKCk7CisKKyAgICAgIC8qIENoZWNrIGlmIFBMTCBpcyByZWFkeSBhbmQgaWYgVElNMzQgY2xvY2sgc2VsZWN0aW9uIGlzIFBMTCAqLworICAgICAgaWYgKChzcmNjbGsgPT0gUkNDX1RJTTM0Q0xLX1BMTENMSykgJiYgKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9QTExSRFkpKSkKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gUkNDX0dldFBMTENMS0ZyZXEoKTsKKyAgICAgIH0KKyAgICAgIC8qIENoZWNrIGlmIFRJTTM0IGNsb2NrIHNlbGVjdGlvbiBpcyBTWVNDTEsgKi8KKyAgICAgIGVsc2UgaWYgKHNyY2NsayA9PSBSQ0NfVElNMzRDTEtfSENMSykKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gU3lzdGVtQ29yZUNsb2NrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmIC8qIFJDQ19DRkdSM19USU0zNFNXICovCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfSFJUSU0xU1cpCisgIGNhc2UgUkNDX1BFUklQSENMS19IUlRJTTE6CisgICAgeworICAgICAgLyogR2V0IHRoZSBjdXJyZW50IEhSVElNMSBzb3VyY2UgKi8KKyAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfSFJUSU0xX1NPVVJDRSgpOworCisgICAgICAvKiBDaGVjayBpZiBQTEwgaXMgcmVhZHkgYW5kIGlmIEhSVElNMSBjbG9jayBzZWxlY3Rpb24gaXMgUExMICovCisgICAgICBpZiAoKHNyY2NsayA9PSBSQ0NfSFJUSU0xQ0xLX1BMTENMSykgJiYgKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9QTExSRFkpKSkKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gUkNDX0dldFBMTENMS0ZyZXEoKTsKKyAgICAgIH0KKyAgICAgIC8qIENoZWNrIGlmIEhSVElNMSBjbG9jayBzZWxlY3Rpb24gaXMgU1lTQ0xLICovCisgICAgICBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX0hSVElNMUNMS19IQ0xLKQorICAgICAgeworICAgICAgICBmcmVxdWVuY3kgPSBTeXN0ZW1Db3JlQ2xvY2s7CisgICAgICB9CisgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZiAvKiBSQ0NfQ0ZHUjNfSFJUSU0xU1cgKi8KKyNpZiBkZWZpbmVkKFJDQ19DRkdSX1NEUFJFKQorICBjYXNlIFJDQ19QRVJJUEhDTEtfU0RBREM6CisgICAgeworICAgICAgLyogR2V0IHRoZSBjdXJyZW50IFNEQURDIHNvdXJjZSAqLworICAgICAgc3JjY2xrID0gX19IQUxfUkNDX0dFVF9TREFEQ19TT1VSQ0UoKTsKKyAgICAgIC8qIEZyZXF1ZW5jeSBpcyB0aGUgc3lzdGVtIGZyZXF1ZW5jeSBkaXZpZGVkIGJ5IFNEQURDIHByZXNjYWxlciAoMlUvNFUvNlUvOFUvMTBVLzEyVS8xNFUvMTZVLzIwVS8yNFUvMjhVLzMyVS8zNlUvNDBVLzQ0VS80OFUpICovCisgICAgICBmcmVxdWVuY3kgPSBTeXN0ZW1Db3JlQ2xvY2sgLyBzZGFkY19wcmVzY2FsZXJfdGFibGVbKHNyY2NsayA+PiBQT1NJVElPTl9WQUwoUkNDX0NGR1JfU0RQUkUpKSAmIDB4Rl07CisgICAgICBicmVhazsKKyAgICB9CisjZW5kaWYgLyogUkNDX0NGR1JfU0RQUkUgKi8KKyNpZiBkZWZpbmVkKFJDQ19DRkdSM19DRUNTVykKKyAgY2FzZSBSQ0NfUEVSSVBIQ0xLX0NFQzoKKyAgICB7CisgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgQ0VDIHNvdXJjZSAqLworICAgICAgc3JjY2xrID0gX19IQUxfUkNDX0dFVF9DRUNfU09VUkNFKCk7CisKKyAgICAgIC8qIENoZWNrIGlmIEhTSSBpcyByZWFkeSBhbmQgaWYgQ0VDIGNsb2NrIHNlbGVjdGlvbiBpcyBIU0kgKi8KKyAgICAgIGlmICgoc3JjY2xrID09IFJDQ19DRUNDTEtTT1VSQ0VfSFNJKSAmJiAoSEFMX0lTX0JJVF9TRVQoUkNDLT5DUiwgUkNDX0NSX0hTSVJEWSkpKQorICAgICAgeworICAgICAgICBmcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICB9CisgICAgICAvKiBDaGVjayBpZiBMU0UgaXMgcmVhZHkgIGFuZCBpZiBDRUMgY2xvY2sgc2VsZWN0aW9uIGlzIExTRSAqLworICAgICAgZWxzZSBpZiAoKHNyY2NsayA9PSBSQ0NfQ0VDQ0xLU09VUkNFX0xTRSkgJiYgKEhBTF9JU19CSVRfU0VUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFUkRZKSkpCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IExTRV9WQUxVRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZiAvKiBSQ0NfQ0ZHUjNfQ0VDU1cgKi8KKyAgZGVmYXVsdDogCisgICAgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybihmcmVxdWVuY3kpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKyNpZiBkZWZpbmVkKFJDQ19DRkdSMl9BREMxUFJFUykgfHwgZGVmaW5lZChSQ0NfQ0ZHUjJfQURDUFJFMTIpIHx8IGRlZmluZWQoUkNDX0NGR1IyX0FEQ1BSRTM0KSB8fCBkZWZpbmVkKFJDQ19DRkdSX1VTQlBSRSkgXAorIHx8IGRlZmluZWQoUkNDX0NGR1IzX1RJTTFTVykgfHwgZGVmaW5lZChSQ0NfQ0ZHUjNfVElNMlNXKSB8fCBkZWZpbmVkKFJDQ19DRkdSM19USU04U1cpIHx8IGRlZmluZWQoUkNDX0NGR1IzX1RJTTE1U1cpICAgICBcCisgfHwgZGVmaW5lZChSQ0NfQ0ZHUjNfVElNMTZTVykgfHwgZGVmaW5lZChSQ0NfQ0ZHUjNfVElNMTdTVykgfHwgZGVmaW5lZChSQ0NfQ0ZHUjNfVElNMjBTVykgfHwgZGVmaW5lZChSQ0NfQ0ZHUjNfVElNMzRTVykgIFwKKyB8fCBkZWZpbmVkKFJDQ19DRkdSM19IUlRJTTFTVykKKworLyoqIEBhZGR0b2dyb3VwIFJDQ0V4X1ByaXZhdGVfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3N0YXRpYyB1aW50MzJfdCBSQ0NfR2V0UExMQ0xLRnJlcSh2b2lkKQoreworICB1aW50MzJfdCBwbGxtdWwgPSAwVSwgcGxsc291cmNlID0gMFUsIHByZWRpdiA9IDBVLCBwbGxjbGsgPSAwVTsKKworICBwbGxtdWwgPSBSQ0MtPkNGR1IgJiBSQ0NfQ0ZHUl9QTExNVUw7CisgIHBsbG11bCA9ICggcGxsbXVsID4+IDE4VSkgKyAyVTsKKyAgcGxsc291cmNlID0gUkNDLT5DRkdSICYgUkNDX0NGR1JfUExMU1JDOworI2lmIGRlZmluZWQoUkNDX0NGR1JfUExMU1JDX0hTSV9ESVYyKQorICBpZiAocGxsc291cmNlICE9IFJDQ19QTExTT1VSQ0VfSFNJKQorICB7CisgICAgcHJlZGl2ID0gKFJDQy0+Q0ZHUjIgJiBSQ0NfQ0ZHUjJfUFJFRElWKSArIDFVOworICAgIC8qIEhTRSB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UgOiBQTExDTEsgPSBIU0UvUFJFRElWICogUExMTVVMICovCisgICAgcGxsY2xrID0gKEhTRV9WQUxVRS9wcmVkaXYpICogcGxsbXVsOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIEhTSSB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UgOiBQTExDTEsgPSBIU0kvMlUgKiBQTExNVUwgKi8KKyAgICBwbGxjbGsgPSAoSFNJX1ZBTFVFID4+IDFVKSAqIHBsbG11bDsKKyAgfQorI2Vsc2UKKyAgcHJlZGl2ID0gKFJDQy0+Q0ZHUjIgJiBSQ0NfQ0ZHUjJfUFJFRElWKSArIDFVOworICBpZiAocGxsc291cmNlID09IFJDQ19DRkdSX1BMTFNSQ19IU0VfUFJFRElWKQorICB7CisgICAgLyogSFNFIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZSA6IFBMTENMSyA9IEhTRS9QUkVESVYgKiBQTExNVUwgKi8KKyAgICBwbGxjbGsgPSAoSFNFX1ZBTFVFL3ByZWRpdikgKiBwbGxtdWw7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogSFNJIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZSA6IFBMTENMSyA9IEhTSS9QUkVESVYgKiBQTExNVUwgKi8KKyAgICBwbGxjbGsgPSAoSFNJX1ZBTFVFL3ByZWRpdikgKiBwbGxtdWw7CisgIH0KKyNlbmRpZiAvKiBSQ0NfQ0ZHUl9QTExTUkNfSFNJX0RJVjIgKi8KKworICByZXR1cm4gcGxsY2xrOworfQorLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFJDQ19DRkdSMl9BREMxUFJFUyB8fCBSQ0NfQ0ZHUjJfQURDUFJFeHggfHwgUkNDX0NGR1IzX1RJTXhTVyB8fCBSQ0NfQ0ZHUjNfSFJUSU0xU1cgfHwgUkNDX0NGR1JfVVNCUFJFICovCisgIAorLyoqCisgICogQH0KKyAgKi8KKyAgCisjZW5kaWYgLyogSEFMX1JDQ19NT0RVTEVfRU5BQkxFRCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjN4eF9oYWxfcnRjLmMgYi9TcmMvc3RtMzJmM3h4X2hhbF9ydGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTlmODc1Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZjN4eF9oYWxfcnRjLmMKQEAgLTAsMCArMSwxNTg4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2hhbF9ydGMuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgUlRDIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcgCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBSZWFsLVRpbWUgQ2xvY2sgKFJUQykgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbgorICAqICAgICAgICAgICArIENhbGVuZGFyIChUaW1lIGFuZCBEYXRlKSBjb25maWd1cmF0aW9uCisgICogICAgICAgICAgICsgQWxhcm1zIChBbGFybSBBIGFuZCBBbGFybSBCKSBjb25maWd1cmF0aW9uCisgICogICAgICAgICAgICsgV2FrZVVwIFRpbWVyIGNvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBUaW1lU3RhbXAgY29uZmlndXJhdGlvbgorICAqICAgICAgICAgICArIFRhbXBlcnMgY29uZmlndXJhdGlvbgorICAqICAgICAgICAgICArIEJhY2t1cCBEYXRhIFJlZ2lzdGVycyBjb25maWd1cmF0aW9uICAKKyAgKiAgICAgICAgICAgKyBSVEMgVGFtcGVyIGFuZCBUaW1lU3RhbXAgUGlucyBTZWxlY3Rpb24gCisgICogICAgICAgICAgICsgSW50ZXJydXB0cyBhbmQgZmxhZ3MgbWFuYWdlbWVudAorICAqCisgIEB2ZXJiYXRpbQorCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFJUQyBPcGVyYXRpbmcgQ29uZGl0aW9uICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gVGhlIHJlYWwtdGltZSBjbG9jayAoUlRDKSBhbmQgdGhlIFJUQyBiYWNrdXAgcmVnaXN0ZXJzIGNhbiBiZSBwb3dlcmVkCisgICAgICAgICBmcm9tIHRoZSBWQkFUIHZvbHRhZ2Ugd2hlbiB0aGUgbWFpbiBWREQgc3VwcGx5IGlzIHBvd2VyZWQgb2ZmLgorICAgICAgICAgVG8gcmV0YWluIHRoZSBjb250ZW50IG9mIHRoZSBSVEMgYmFja3VwIHJlZ2lzdGVycyBhbmQgc3VwcGx5IHRoZSBSVEMgCisgICAgICAgICB3aGVuIFZERCBpcyB0dXJuZWQgb2ZmLCBWQkFUIHBpbiBjYW4gYmUgY29ubmVjdGVkIHRvIGFuIG9wdGlvbmFsCisgICAgICAgICBzdGFuZGJ5IHZvbHRhZ2Ugc3VwcGxpZWQgYnkgYSBiYXR0ZXJ5IG9yIGJ5IGFub3RoZXIgc291cmNlLgorICAKKyAgICBbLi5dIFRvIGFsbG93IHRoZSBSVEMgdG8gb3BlcmF0ZSBldmVuIHdoZW4gdGhlIG1haW4gZGlnaXRhbCBzdXBwbHkgKFZERCkgCisgICAgICAgICBpcyB0dXJuZWQgb2ZmLCB0aGUgVkJBVCBwaW4gcG93ZXJzIHRoZSBmb2xsb3dpbmcgYmxvY2tzOgorICAgICAgICAgICAoIykgVGhlIFJUQworICAgICAgICAgICAoIykgVGhlIExTRSBvc2NpbGxhdG9yCisgICAgICAgICAgICgjKSBQQzEzIHRvIFBDMTUgSS9PcyAod2hlbiBhdmFpbGFibGUpCisgIAorICAgIFsuLl0gV2hlbiB0aGUgYmFja3VwIGRvbWFpbiBpcyBzdXBwbGllZCBieSBWREQgKGFuYWxvZyBzd2l0Y2ggY29ubmVjdGVkIAorICAgICAgICAgdG8gVkREKSwgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZToKKyAgICAgICAgICAgKCMpIFBDMTQgYW5kIFBDMTUgY2FuIGJlIHVzZWQgYXMgZWl0aGVyIEdQSU8gb3IgTFNFIHBpbnMKKyAgICAgICAgICAgKCMpIFBDMTMgY2FuIGJlIHVzZWQgYXMgYSBHUElPIG9yIGFzIHRoZSBSVENfT1VUIHBpbgorICAKKyAgICBbLi5dIFdoZW4gdGhlIGJhY2t1cCBkb21haW4gaXMgc3VwcGxpZWQgYnkgVkJBVCAoYW5hbG9nIHN3aXRjaCBjb25uZWN0ZWQgCisgICAgICAgICB0byBWQkFUIGJlY2F1c2UgVkREIGlzIG5vdCBwcmVzZW50KSwgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZToKKyAgICAgICAgICAgKCMpIFBDMTQgYW5kIFBDMTUgY2FuIGJlIHVzZWQgYXMgTFNFIHBpbnMgb25seQorICAgICAgICAgICAoIykgUEMxMyBjYW4gYmUgdXNlZCBhcyB0aGUgUlRDX09VVCBwaW4gCisgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBCYWNrdXAgRG9tYWluIFJlc2V0ICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gVGhlIGJhY2t1cCBkb21haW4gcmVzZXQgc2V0cyBhbGwgUlRDIHJlZ2lzdGVycyBhbmQgdGhlIFJDQ19CRENSIAorICAgICAgICAgcmVnaXN0ZXIgdG8gdGhlaXIgcmVzZXQgdmFsdWVzLiAKKyAgICAgICAgIEEgYmFja3VwIGRvbWFpbiByZXNldCBpcyBnZW5lcmF0ZWQgd2hlbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBldmVudHMKKyAgICAgICAgIG9jY3VyczoKKyAgICAgICAgICAgKCMpIFNvZnR3YXJlIHJlc2V0LCB0cmlnZ2VyZWQgYnkgc2V0dGluZyB0aGUgQkRSU1QgYml0IGluIHRoZSAKKyAgICAgICAgICAgICAgIFJDQyBCYWNrdXAgZG9tYWluIGNvbnRyb2wgcmVnaXN0ZXIgKFJDQ19CRENSKS4KKyAgICAgICAgICAgKCMpIFZERCBvciBWQkFUIHBvd2VyIG9uLCBpZiBib3RoIHN1cHBsaWVzIGhhdmUgcHJldmlvdXNseSBiZWVuCisgICAgICAgICAgICAgICBwb3dlcmVkIG9mZi4KKworICAgICAgICAgICAgICAgICAgICMjIyMjIEJhY2t1cCBEb21haW4gQWNjZXNzICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gQWZ0ZXIgcmVzZXQsIHRoZSBiYWNrdXAgZG9tYWluIChSVEMgcmVnaXN0ZXJzLCBSVEMgYmFja3VwIGRhdGEgCisgICAgICAgICByZWdpc3RlcnMgYW5kIGJhY2t1cCBTUkFNKSBpcyBwcm90ZWN0ZWQgYWdhaW5zdCBwb3NzaWJsZSB1bndhbnRlZCB3cml0ZSAKKyAgICAgICAgIGFjY2Vzc2VzLgorCisgICAgWy4uXSBUbyBlbmFibGUgYWNjZXNzIHRvIHRoZSBSVEMgRG9tYWluIGFuZCBSVEMgcmVnaXN0ZXJzLCBwcm9jZWVkIGFzIGZvbGxvd3M6CisgICAgICAgICAgICgjKSBFbmFibGUgdGhlIFBvd2VyIENvbnRyb2xsZXIgKFBXUikgQVBCMSBpbnRlcmZhY2UgY2xvY2sgdXNpbmcgdGhlCisgICAgICAgICAgICAgICBfX0hBTF9SQ0NfUFdSX0NMS19FTkFCTEUoKSBmdW5jdGlvbi4KKyAgICAgICAgICAgKCMpIEVuYWJsZSBhY2Nlc3MgdG8gUlRDIGRvbWFpbiB1c2luZyB0aGUgSEFMX1BXUl9FbmFibGVCa1VwQWNjZXNzKCkgZnVuY3Rpb24uCisgICAgICAgICAgICgjKSBTZWxlY3QgdGhlIFJUQyBjbG9jayBzb3VyY2UgdXNpbmcgdGhlIF9fSEFMX1JDQ19SVENfQ09ORklHKCkgZnVuY3Rpb24uCisgICAgICAgICAgICgjKSBFbmFibGUgUlRDIENsb2NrIHVzaW5nIHRoZSBfX0hBTF9SQ0NfUlRDX0VOQUJMRSgpIGZ1bmN0aW9uLgorICAKKyAgCisgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIFJUQyBEcml2ZXIgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAKKyAgICAgICAgKCspIEVuYWJsZSB0aGUgUlRDIGRvbWFpbiBhY2Nlc3MgKHNlZSBkZXNjcmlwdGlvbiBpbiB0aGUgc2VjdGlvbiBhYm92ZSkuCisgICAgICAgICgrKSBDb25maWd1cmUgdGhlIFJUQyBQcmVzY2FsZXIgKEFzeW5jaHJvbm91cyBhbmQgU3luY2hyb25vdXMpIGFuZCBSVEMgaG91ciAKKyAgICAgICAgICAgIGZvcm1hdCB1c2luZyB0aGUgSEFMX1JUQ19Jbml0KCkgZnVuY3Rpb24uCisgIAorICAgICoqKiBUaW1lIGFuZCBEYXRlIGNvbmZpZ3VyYXRpb24gKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dIAorICAgICAgICAoKykgVG8gY29uZmlndXJlIHRoZSBSVEMgQ2FsZW5kYXIgKFRpbWUgYW5kIERhdGUpIHVzZSB0aGUgSEFMX1JUQ19TZXRUaW1lKCkgCisgICAgICAgICAgICBhbmQgSEFMX1JUQ19TZXREYXRlKCkgZnVuY3Rpb25zLgorICAgICAgICAoKykgVG8gcmVhZCB0aGUgUlRDIENhbGVuZGFyLCB1c2UgdGhlIEhBTF9SVENfR2V0VGltZSgpIGFuZCBIQUxfUlRDX0dldERhdGUoKSBmdW5jdGlvbnMuIAorICAKKyAgICAqKiogQWxhcm0gY29uZmlndXJhdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAgICgrKSBUbyBjb25maWd1cmUgdGhlIFJUQyBBbGFybSB1c2UgdGhlIEhBTF9SVENfU2V0QWxhcm0oKSBmdW5jdGlvbi4gCisgICAgICAgICAgICBZb3UgY2FuIGFsc28gY29uZmlndXJlIHRoZSBSVEMgQWxhcm0gd2l0aCBpbnRlcnJ1cHQgbW9kZSB1c2luZyB0aGUgCisgICAgICAgICAgICBIQUxfUlRDX1NldEFsYXJtX0lUKCkgZnVuY3Rpb24uCisgICAgICAgICgrKSBUbyByZWFkIHRoZSBSVEMgQWxhcm0sIHVzZSB0aGUgSEFMX1JUQ19HZXRBbGFybSgpIGZ1bmN0aW9uLgorICAKKyAgICAqKiogUlRDIFdha2V1cCBjb25maWd1cmF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAKKyAgICAgICAgKCspIFRvIGNvbmZpZ3VyZSB0aGUgUlRDIFdha2V1cCBDbG9jayBzb3VyY2UgYW5kIENvdW50ZXIgdXNlIHRoZSBIQUxfUlRDX1NldFdha2VVcFRpbWVyKCkKKyAgICAgICAgICAgIGZ1bmN0aW9uLiBZb3UgY2FuIGFsc28gY29uZmlndXJlIHRoZSBSVEMgV2FrZXVwIHRpbWVyIHdpdGggaW50ZXJydXB0IG1vZGUgCisgICAgICAgICAgICB1c2luZyB0aGUgSEFMX1JUQ19TZXRXYWtlVXBUaW1lcl9JVCgpIGZ1bmN0aW9uLgorICAgICAgICAoKykgVG8gcmVhZCB0aGUgUlRDIFdha2VVcCBDb3VudGVyIHJlZ2lzdGVyLCB1c2UgdGhlIEhBTF9SVENfR2V0V2FrZVVwVGltZXIoKSAKKyAgICAgICAgICAgIGZ1bmN0aW9uLgorICAKKyAgICAqKiogVGltZVN0YW1wIGNvbmZpZ3VyYXRpb24gKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICAgKCspIENvbmZpZ3VyZSB0aGUgUlRDX0FGIHRyaWdnZXIgYW5kIGVuYWJsZXMgdGhlIFJUQyBUaW1lU3RhbXAgdXNpbmcgdGhlIAorICAgICAgICAgICAgSEFMX1JUQ19TZXRUaW1lU3RhbXAoKSBmdW5jdGlvbi4gWW91IGNhbiBhbHNvIGNvbmZpZ3VyZSB0aGUgUlRDIFRpbWVTdGFtcCB3aXRoIAorICAgICAgICAgICAgaW50ZXJydXB0IG1vZGUgdXNpbmcgdGhlIEhBTF9SVENfU2V0VGltZVN0YW1wX0lUKCkgZnVuY3Rpb24uCisgICAgICAgICgrKSBUbyByZWFkIHRoZSBSVEMgVGltZVN0YW1wIFRpbWUgYW5kIERhdGUgcmVnaXN0ZXIsIHVzZSB0aGUgSEFMX1JUQ19HZXRUaW1lU3RhbXAoKQorICAgICAgICAgICAgZnVuY3Rpb24uCisgIAorICAgICoqKiBUYW1wZXIgY29uZmlndXJhdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgICAoKykgRW5hYmxlIHRoZSBSVEMgVGFtcGVyIGFuZCBDb25maWd1cmUgdGhlIFRhbXBlciBmaWx0ZXIgY291bnQsIHRyaWdnZXIgRWRnZSAKKyAgICAgICAgICAgIG9yIExldmVsIGFjY29yZGluZyB0byB0aGUgVGFtcGVyIGZpbHRlciAoaWYgZXF1YWwgdG8gMCBFZGdlIGVsc2UgTGV2ZWwpIAorICAgICAgICAgICAgdmFsdWUsIHNhbXBsaW5nIGZyZXF1ZW5jeSwgcHJlY2hhcmdlIG9yIGRpc2NoYXJnZSBhbmQgUHVsbC1VUCB1c2luZyB0aGUgCisgICAgICAgICAgICBIQUxfUlRDX1NldFRhbXBlcigpIGZ1bmN0aW9uLiBZb3UgY2FuIGNvbmZpZ3VyZSBSVEMgVGFtcGVyIHdpdGggaW50ZXJydXB0IAorICAgICAgICAgICAgbW9kZSB1c2luZyBIQUxfUlRDX1NldFRhbXBlcl9JVCgpIGZ1bmN0aW9uLgorICAKKyAgICAqKiogQmFja3VwIERhdGEgUmVnaXN0ZXJzIGNvbmZpZ3VyYXRpb24gKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICAgKCspIFRvIHdyaXRlIHRvIHRoZSBSVEMgQmFja3VwIERhdGEgcmVnaXN0ZXJzLCB1c2UgdGhlIEhBTF9SVENfQktVUFdyaXRlKCkKKyAgICAgICAgICAgIGZ1bmN0aW9uLiAgCisgICAgICAgICgrKSBUbyByZWFkIHRoZSBSVEMgQmFja3VwIERhdGEgcmVnaXN0ZXJzLCB1c2UgdGhlIEhBTF9SVENfQktVUFJlYWQoKQorICAgICAgICAgICAgZnVuY3Rpb24uCisgICAKKworICAgICAgICAgICAgICAgICAgIyMjIyMgUlRDIGFuZCBsb3cgcG93ZXIgbW9kZXMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSBUaGUgTUNVIGNhbiBiZSB3b2tlbiB1cCBmcm9tIGEgbG93IHBvd2VyIG1vZGUgYnkgYW4gUlRDIGFsdGVybmF0ZSAKKyAgICAgICAgIGZ1bmN0aW9uLgorICAgIFsuLl0gVGhlIFJUQyBhbHRlcm5hdGUgZnVuY3Rpb25zIGFyZSB0aGUgUlRDIGFsYXJtcyAoQWxhcm0gQSBhbmQgQWxhcm0gQiksIAorICAgICAgICAgUlRDIHdha2V1cCwgUlRDIHRhbXBlciBldmVudCBkZXRlY3Rpb24gYW5kIFJUQyB0aW1lIHN0YW1wIGV2ZW50IGRldGVjdGlvbi4KKyAgICAgICAgIFRoZXNlIFJUQyBhbHRlcm5hdGUgZnVuY3Rpb25zIGNhbiB3YWtlIHVwIHRoZSBzeXN0ZW0gZnJvbSB0aGUgU3RvcCBhbmQgCisgICAgICAgICBTdGFuZGJ5IGxvdyBwb3dlciBtb2Rlcy4KKyAgICBbLi5dIFRoZSBzeXN0ZW0gY2FuIGFsc28gd2FrZSB1cCBmcm9tIGxvdyBwb3dlciBtb2RlcyB3aXRob3V0IGRlcGVuZGluZyAKKyAgICAgICAgIG9uIGFuIGV4dGVybmFsIGludGVycnVwdCAoQXV0by13YWtldXAgbW9kZSksIGJ5IHVzaW5nIHRoZSBSVEMgYWxhcm0gCisgICAgICAgICBvciB0aGUgUlRDIHdha2V1cCBldmVudHMuCisgICAgWy4uXSBUaGUgUlRDIHByb3ZpZGVzIGEgcHJvZ3JhbW1hYmxlIHRpbWUgYmFzZSBmb3Igd2FraW5nIHVwIGZyb20gdGhlIAorICAgICAgICAgU3RvcCBvciBTdGFuZGJ5IG1vZGUgYXQgcmVndWxhciBpbnRlcnZhbHMuCisgICAgICAgICBXYWtldXAgZnJvbSBTVE9QIGFuZCBTdGFuZGJ5IG1vZGVzIGlzIHBvc3NpYmxlIG9ubHkgd2hlbiB0aGUgUlRDIGNsb2NrIHNvdXJjZQorICAgICAgICAgaXMgTFNFIG9yIExTSS4KKyAgICAgCisgIEBlbmR2ZXJiYXRpbQorCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgUlRDCisgICogQGJyaWVmIFJUQyBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfUlRDX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAYWRkdG9ncm91cCBSVENfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyAgCisvKiogQGFkZHRvZ3JvdXAgUlRDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIAorICoKK0B2ZXJiYXRpbSAgICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBbLi5dIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gaW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIHRoZSAKKyAgICAgICAgIFJUQyBQcmVzY2FsZXIgKFN5bmNocm9ub3VzIGFuZCBBc3luY2hyb25vdXMpLCBSVEMgSG91ciBmb3JtYXQsIGRpc2FibGUgCisgICAgICAgICBSVEMgcmVnaXN0ZXJzIFdyaXRlIHByb3RlY3Rpb24sIGVudGVyIGFuZCBleGl0IHRoZSBSVEMgaW5pdGlhbGl6YXRpb24gbW9kZSwgCisgICAgICAgICBSVEMgcmVnaXN0ZXJzIHN5bmNocm9uaXphdGlvbiBjaGVjayBhbmQgcmVmZXJlbmNlIGNsb2NrIGRldGVjdGlvbiBlbmFibGUuCisgICAgICAgICAoIykgVGhlIFJUQyBQcmVzY2FsZXIgaXMgcHJvZ3JhbW1lZCB0byBnZW5lcmF0ZSB0aGUgUlRDIDFIeiB0aW1lIGJhc2UuIAorICAgICAgICAgICAgIEl0IGlzIHNwbGl0IGludG8gMiBwcm9ncmFtbWFibGUgcHJlc2NhbGVycyB0byBtaW5pbWl6ZSBwb3dlciBjb25zdW1wdGlvbi4KKyAgICAgICAgICAgICAoKyspIEEgNy1iaXQgYXN5bmNocm9ub3VzIHByZXNjYWxlciBhbmQgYSAxNS1iaXQgc3luY2hyb25vdXMgcHJlc2NhbGVyLgorICAgICAgICAgICAgICgrKykgV2hlbiBib3RoIHByZXNjYWxlcnMgYXJlIHVzZWQsIGl0IGlzIHJlY29tbWVuZGVkIHRvIGNvbmZpZ3VyZSB0aGUgCisgICAgICAgICAgICAgICAgIGFzeW5jaHJvbm91cyBwcmVzY2FsZXIgdG8gYSBoaWdoIHZhbHVlIHRvIG1pbmltaXplIHBvd2VyIGNvbnN1bXB0aW9uLgorICAgICAgICAgKCMpIEFsbCBSVEMgcmVnaXN0ZXJzIGFyZSBXcml0ZSBwcm90ZWN0ZWQuIFdyaXRpbmcgdG8gdGhlIFJUQyByZWdpc3RlcnMKKyAgICAgICAgICAgICBpcyBlbmFibGVkIGJ5IHdyaXRpbmcgYSBrZXkgaW50byB0aGUgV3JpdGUgUHJvdGVjdGlvbiByZWdpc3RlciwgUlRDX1dQUi4KKyAgICAgICAgICgjKSBUbyBjb25maWd1cmUgdGhlIFJUQyBDYWxlbmRhciwgdXNlciBhcHBsaWNhdGlvbiBzaG91bGQgZW50ZXIgCisgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gbW9kZS4gSW4gdGhpcyBtb2RlLCB0aGUgY2FsZW5kYXIgY291bnRlciBpcyBzdG9wcGVkIAorICAgICAgICAgICAgIGFuZCBpdHMgdmFsdWUgY2FuIGJlIHVwZGF0ZWQuIFdoZW4gdGhlIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlIGlzIAorICAgICAgICAgICAgIGNvbXBsZXRlLCB0aGUgY2FsZW5kYXIgcmVzdGFydHMgY291bnRpbmcgYWZ0ZXIgNCBSVENDTEsgY3ljbGVzLgorICAgICAgICAgKCMpIFRvIHJlYWQgdGhlIGNhbGVuZGFyIHRocm91Z2ggdGhlIHNoYWRvdyByZWdpc3RlcnMgYWZ0ZXIgQ2FsZW5kYXIgCisgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24sIGNhbGVuZGFyIHVwZGF0ZSBvciBhZnRlciB3YWtldXAgZnJvbSBsb3cgcG93ZXIgbW9kZXMgCisgICAgICAgICAgICAgdGhlIHNvZnR3YXJlIG11c3QgZmlyc3QgY2xlYXIgdGhlIFJTRiBmbGFnLiBUaGUgc29mdHdhcmUgbXVzdCB0aGVuIAorICAgICAgICAgICAgIHdhaXQgdW50aWwgaXQgaXMgc2V0IGFnYWluIGJlZm9yZSByZWFkaW5nIHRoZSBjYWxlbmRhciwgd2hpY2ggbWVhbnMgCisgICAgICAgICAgICAgdGhhdCB0aGUgY2FsZW5kYXIgcmVnaXN0ZXJzIGhhdmUgYmVlbiBjb3JyZWN0bHkgY29waWVkIGludG8gdGhlIAorICAgICAgICAgICAgIFJUQ19UUiBhbmQgUlRDX0RSIHNoYWRvdyByZWdpc3RlcnMuVGhlIEhBTF9SVENfV2FpdEZvclN5bmNocm8oKSBmdW5jdGlvbiAKKyAgICAgICAgICAgICBpbXBsZW1lbnRzIHRoZSBhYm92ZSBzb2Z0d2FyZSBzZXF1ZW5jZSAoUlNGIGNsZWFyIGFuZCBSU0YgY2hlY2spLgorIAorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBSVEMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyAKKyAgKiAgICAgICAgIGluIHRoZSBSVENfSW5pdFR5cGVEZWYgc3RydWN0dXJlIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19Jbml0KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreworICAvKiBDaGVjayB0aGUgUlRDIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgaWYoaHJ0YyA9PSBOVUxMKQorICB7CisgICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfQUxMX0lOU1RBTkNFKGhydGMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfSE9VUl9GT1JNQVQoaHJ0Yy0+SW5pdC5Ib3VyRm9ybWF0KSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfQVNZTkNIX1BSRURJVihocnRjLT5Jbml0LkFzeW5jaFByZWRpdikpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1NZTkNIX1BSRURJVihocnRjLT5Jbml0LlN5bmNoUHJlZGl2KSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfT1VUUFVUKGhydGMtPkluaXQuT3V0UHV0KSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfT1VUUFVUX1BPTChocnRjLT5Jbml0Lk91dFB1dFBvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfT1VUUFVUX1RZUEUoaHJ0Yy0+SW5pdC5PdXRQdXRUeXBlKSk7CisgICAgCisgIGlmKGhydGMtPlN0YXRlID09IEhBTF9SVENfU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHJ0Yy0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworICAgIC8qIEluaXRpYWxpemUgUlRDIE1TUCAqLworICAgIEhBTF9SVENfTXNwSW5pdChocnRjKTsKKyAgfQorICAKKyAgLyogU2V0IFJUQyBzdGF0ZSAqLyAgCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOyAgCisgICAgICAgCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIFNldCBJbml0aWFsaXphdGlvbiBtb2RlICovCisgIGlmKFJUQ19FbnRlckluaXRNb2RlKGhydGMpICE9IEhBTF9PSykKKyAgeworICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOyAKKyAgICAKKyAgICAvKiBTZXQgUlRDIHN0YXRlICovCisgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0VSUk9SOworICAgIAorICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0gCisgIGVsc2UKKyAgeyAKKyAgICAvKiBDbGVhciBSVENfQ1IgRk1ULCBPU0VMIGFuZCBQT0wgQml0cyAqLworICAgIGhydGMtPkluc3RhbmNlLT5DUiAmPSAoKHVpbnQzMl90KX4oUlRDX0NSX0ZNVCB8IFJUQ19DUl9PU0VMIHwgUlRDX0NSX1BPTCkpOworICAgIC8qIFNldCBSVENfQ1IgcmVnaXN0ZXIgKi8KKyAgICBocnRjLT5JbnN0YW5jZS0+Q1IgfD0gKHVpbnQzMl90KShocnRjLT5Jbml0LkhvdXJGb3JtYXQgfCBocnRjLT5Jbml0Lk91dFB1dCB8IGhydGMtPkluaXQuT3V0UHV0UG9sYXJpdHkpOworICAgIAorICAgIC8qIENvbmZpZ3VyZSB0aGUgUlRDIFBSRVIgKi8KKyAgICBocnRjLT5JbnN0YW5jZS0+UFJFUiA9ICh1aW50MzJfdCkoaHJ0Yy0+SW5pdC5TeW5jaFByZWRpdik7CisgICAgaHJ0Yy0+SW5zdGFuY2UtPlBSRVIgfD0gKHVpbnQzMl90KShocnRjLT5Jbml0LkFzeW5jaFByZWRpdiA8PCAxNlUpOworICAgIAorICAgIC8qIEV4aXQgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICAgIGhydGMtPkluc3RhbmNlLT5JU1IgJj0gKHVpbnQzMl90KX5SVENfSVNSX0lOSVQ7CisKKyAgICAvKiBJZiAgQ1JfQllQU0hBRCBiaXQgPSAwLCB3YWl0IGZvciBzeW5jaHJvIGVsc2UgdGhpcyBjaGVjayBpcyBub3QgbmVlZGVkICovCisgICAgaWYoKGhydGMtPkluc3RhbmNlLT5DUiAmIFJUQ19DUl9CWVBTSEFEKSA9PSBSRVNFVCkKKyAgICB7CisgICAgICBpZihIQUxfUlRDX1dhaXRGb3JTeW5jaHJvKGhydGMpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9FUlJPUjsKKworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKworICAgIGhydGMtPkluc3RhbmNlLT5UQUZDUiAmPSAodWludDMyX3QpflJUQ19UQUZDUl9BTEFSTU9VVFRZUEU7CisgICAgaHJ0Yy0+SW5zdGFuY2UtPlRBRkNSIHw9ICh1aW50MzJfdCkoaHJ0Yy0+SW5pdC5PdXRQdXRUeXBlKTsgCisgICAgCisgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7IAorICAgIAorICAgIC8qIFNldCBSVEMgc3RhdGUgKi8KKyAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7CisgICAgCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgUlRDIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gZG9lc24ndCByZXNldCB0aGUgUlRDIEJhY2t1cCBEYXRhIHJlZ2lzdGVycy4gICAKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfRGVJbml0KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMTF9JTlNUQU5DRShocnRjLT5JbnN0YW5jZSkpOworCisgIC8qIFNldCBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7IAorICAKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisgIAorICAvKiBTZXQgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICBpZihSVENfRW50ZXJJbml0TW9kZShocnRjKSAhPSBIQUxfT0spCisgIHsKKyAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsgCisgICAgCisgICAgLyogU2V0IFJUQyBzdGF0ZSAqLworICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9FUlJPUjsKKyAgICAKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9ICAKKyAgZWxzZQorICB7CisgICAgLyogUmVzZXQgVFIsIERSIGFuZCBDUiByZWdpc3RlcnMgKi8KKyAgICBocnRjLT5JbnN0YW5jZS0+VFIgPSAweDAwMDAwMDAwVTsKKyAgICBocnRjLT5JbnN0YW5jZS0+RFIgPSAoUlRDX0RSX1dEVV8wIHwgUlRDX0RSX01VXzAgfCBSVENfRFJfRFVfMCk7CisgICAgLyogUmVzZXQgQWxsIENSIGJpdHMgZXhjZXB0IENSWzI6MF0gKi8KKyAgICBocnRjLT5JbnN0YW5jZS0+Q1IgJj0gUlRDX0NSX1dVQ0tTRUw7CisgICAgCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICAKKyAgICAvKiBXYWl0IHRpbGwgV1VUV0YgZmxhZyBpcyBzZXQgYW5kIGlmIFRpbWUgb3V0IGlzIHJlYWNoZWQgZXhpdCAqLworICAgIHdoaWxlKCgoaHJ0Yy0+SW5zdGFuY2UtPklTUikgJiBSVENfSVNSX1dVVFdGKSA9PSAodWludDMyX3QpUkVTRVQpCisgICAgeworICAgICAgaWYoKEhBTF9HZXRUaWNrKCktdGlja3N0YXJ0KSA+IFJUQ19USU1FT1VUX1ZBTFVFKQorICAgICAgeyAKKyAgICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOyAKKyAgICAgICAgCisgICAgICAgIC8qIFNldCBSVEMgc3RhdGUgKi8KKyAgICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1RJTUVPVVQ7CisgICAgICAgIAorICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9IAorICAgIH0KKyAgICAKKyAgICAvKiBSZXNldCBhbGwgUlRDIENSIHJlZ2lzdGVyIGJpdHMgKi8KKyAgICBocnRjLT5JbnN0YW5jZS0+Q1IgJj0gMHgwMDAwMDAwMFU7CisgICAgaHJ0Yy0+SW5zdGFuY2UtPldVVFIgPSBSVENfV1VUUl9XVVQ7CisgICAgaHJ0Yy0+SW5zdGFuY2UtPlBSRVIgPSAoKHVpbnQzMl90KShSVENfUFJFUl9QUkVESVZfQSB8IDB4MDAwMDAwRkZVKSk7CisgICAgaHJ0Yy0+SW5zdGFuY2UtPkFMUk1BUiA9IDB4MDAwMDAwMDBVOyAgICAgICAgCisgICAgaHJ0Yy0+SW5zdGFuY2UtPkFMUk1CUiA9IDB4MDAwMDAwMDBVOworICAgIGhydGMtPkluc3RhbmNlLT5TSElGVFIgPSAweDAwMDAwMDAwVTsKKyAgICBocnRjLT5JbnN0YW5jZS0+Q0FMUiA9IDB4MDAwMDAwMDBVOworICAgIGhydGMtPkluc3RhbmNlLT5BTFJNQVNTUiA9IDB4MDAwMDAwMDBVOworICAgIGhydGMtPkluc3RhbmNlLT5BTFJNQlNTUiA9IDB4MDAwMDAwMDBVOworICAgIAorICAgIC8qIFJlc2V0IElTUiByZWdpc3RlciBhbmQgZXhpdCBpbml0aWFsaXphdGlvbiBtb2RlICovCisgICAgaHJ0Yy0+SW5zdGFuY2UtPklTUiA9IDB4MDAwMDAwMDBVOworICAgIAorICAgIC8qIFJlc2V0IFRhbXBlciBhbmQgYWx0ZXJuYXRlIGZ1bmN0aW9ucyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisgICAgaHJ0Yy0+SW5zdGFuY2UtPlRBRkNSID0gMHgwMDAwMDAwMFU7CisgICAgCisgICAgLyogSWYgIFJUQ19DUl9CWVBTSEFEIGJpdCA9IDBVLCB3YWl0IGZvciBzeW5jaHJvIGVsc2UgdGhpcyBjaGVjayBpcyBub3QgbmVlZGVkICovCisgICAgaWYoKGhydGMtPkluc3RhbmNlLT5DUiAmIFJUQ19DUl9CWVBTSEFEKSA9PSBSRVNFVCkKKyAgICB7CisgICAgICBpZihIQUxfUlRDX1dhaXRGb3JTeW5jaHJvKGhydGMpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOyAgCisgICAgICAgIAorICAgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfRVJST1I7CisgICAgICAgIAorICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0gICAgCisgIH0KKyAgCisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsgIAorICAKKyAgLyogRGUtSW5pdGlhbGl6ZSBSVEMgTVNQICovCisgIEhBTF9SVENfTXNwRGVJbml0KGhydGMpOworICAKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFU0VUOyAKKyAgCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBSVEMgTVNQLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9SVENfTXNwSW5pdChSVENfSGFuZGxlVHlwZURlZiogaHJ0YykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHJ0Yyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9SVENfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIFJUQyBNU1AuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUgCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUlRDX01zcERlSW5pdChSVENfSGFuZGxlVHlwZURlZiogaHJ0YykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHJ0Yyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9SVENfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovIAorfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgUlRDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAqICBAYnJpZWYgICBSVEMgVGltZSBhbmQgRGF0ZSBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0gICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICMjIyMjIFJUQyBUaW1lIGFuZCBEYXRlIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorIAorIFsuLl0gVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb25maWd1cmUgVGltZSBhbmQgRGF0ZSBmZWF0dXJlcworCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBSVEMgY3VycmVudCB0aW1lLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBzVGltZSBQb2ludGVyIHRvIFRpbWUgc3RydWN0dXJlCisgICogQHBhcmFtICBGb3JtYXQgU3BlY2lmaWVzIHRoZSBmb3JtYXQgb2YgdGhlIGVudGVyZWQgcGFyYW1ldGVycy4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBSVENfRk9STUFUX0JJTjogQmluYXJ5IGRhdGEgZm9ybWF0IAorICAqICAgICAgICAgICAgQGFyZyBSVENfRk9STUFUX0JDRDogQkNEIGRhdGEgZm9ybWF0CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX1NldFRpbWUoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIFJUQ19UaW1lVHlwZURlZiAqc1RpbWUsIHVpbnQzMl90IEZvcm1hdCkKK3sKKyAgdWludDMyX3QgdG1wcmVnID0gMFU7CisgIAorIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfRk9STUFUKEZvcm1hdCkpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0RBWUxJR0hUX1NBVklORyhzVGltZS0+RGF5TGlnaHRTYXZpbmcpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19TVE9SRV9PUEVSQVRJT04oc1RpbWUtPlN0b3JlT3BlcmF0aW9uKSk7CisgIAorICAvKiBQcm9jZXNzIExvY2tlZCAqLyAKKyAgX19IQUxfTE9DSyhocnRjKTsKKyAgCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworICAKKyAgaWYoRm9ybWF0ID09IFJUQ19GT1JNQVRfQklOKQorICB7CisgICAgaWYoKGhydGMtPkluc3RhbmNlLT5DUiAmIFJUQ19DUl9GTVQpICE9ICh1aW50MzJfdClSRVNFVCkKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0hPVVIxMihzVGltZS0+SG91cnMpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfSE9VUkZPUk1BVDEyKHNUaW1lLT5UaW1lRm9ybWF0KSk7CisgICAgfSAKKyAgICBlbHNlCisgICAgeworICAgICAgc1RpbWUtPlRpbWVGb3JtYXQgPSAweDAwVTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfSE9VUjI0KHNUaW1lLT5Ib3VycykpOworICAgIH0KKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX01JTlVURVMoc1RpbWUtPk1pbnV0ZXMpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX1NFQ09ORFMoc1RpbWUtPlNlY29uZHMpKTsKKyAgICAKKyAgICB0bXByZWcgPSAodWludDMyX3QpKCgodWludDMyX3QpUlRDX0J5dGVUb0JjZDIoc1RpbWUtPkhvdXJzKSA8PCAxNlUpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfQnl0ZVRvQmNkMihzVGltZS0+TWludXRlcykgPDwgOFUpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfQnl0ZVRvQmNkMihzVGltZS0+U2Vjb25kcykpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgKCgodWludDMyX3Qpc1RpbWUtPlRpbWVGb3JtYXQpIDw8IDE2VSkpOyAgCisgIH0KKyAgZWxzZQorICB7CisgICAgaWYoKGhydGMtPkluc3RhbmNlLT5DUiAmIFJUQ19DUl9GTVQpICE9ICh1aW50MzJfdClSRVNFVCkKKyAgICB7CisgICAgICB0bXByZWcgPSBSVENfQmNkMlRvQnl0ZShzVGltZS0+SG91cnMpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSMTIodG1wcmVnKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0hPVVJGT1JNQVQxMihzVGltZS0+VGltZUZvcm1hdCkpOyAKKyAgICB9IAorICAgIGVsc2UKKyAgICB7CisgICAgICBzVGltZS0+VGltZUZvcm1hdCA9IDB4MDBVOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSMjQoUlRDX0JjZDJUb0J5dGUoc1RpbWUtPkhvdXJzKSkpOworICAgIH0KKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX01JTlVURVMoUlRDX0JjZDJUb0J5dGUoc1RpbWUtPk1pbnV0ZXMpKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19TRUNPTkRTKFJUQ19CY2QyVG9CeXRlKHNUaW1lLT5TZWNvbmRzKSkpOworICAgIHRtcHJlZyA9ICgoKHVpbnQzMl90KShzVGltZS0+SG91cnMpIDw8IDE2VSkgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3QpKHNUaW1lLT5NaW51dGVzKSA8PCA4VSkgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3Qpc1RpbWUtPlNlY29uZHMpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KShzVGltZS0+VGltZUZvcm1hdCkgPDwgMTZVKSk7ICAgCisgIH0KKyAgCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworICAKKyAgLyogU2V0IEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgaWYoUlRDX0VudGVySW5pdE1vZGUoaHJ0YykgIT0gSEFMX09LKQorICB7CisgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7IAorICAgIAorICAgIC8qIFNldCBSVEMgc3RhdGUgKi8KKyAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfRVJST1I7CisgICAgCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLyAKKyAgICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisgICAgCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfSAKKyAgZWxzZQorICB7CisgICAgLyogU2V0IHRoZSBSVENfVFIgcmVnaXN0ZXIgKi8KKyAgICBocnRjLT5JbnN0YW5jZS0+VFIgPSAodWludDMyX3QpKHRtcHJlZyAmIFJUQ19UUl9SRVNFUlZFRF9NQVNLKTsKKyAgICAgCisgICAgLyogQ2xlYXIgdGhlIGJpdHMgdG8gYmUgY29uZmlndXJlZCAqLworICAgIGhydGMtPkluc3RhbmNlLT5DUiAmPSAoKHVpbnQzMl90KX5SVENfQ1JfQkNLKTsKKyAgICAKKyAgICAvKiBDb25maWd1cmUgdGhlIFJUQ19DUiByZWdpc3RlciAqLworICAgIGhydGMtPkluc3RhbmNlLT5DUiB8PSAodWludDMyX3QpKHNUaW1lLT5EYXlMaWdodFNhdmluZyB8IHNUaW1lLT5TdG9yZU9wZXJhdGlvbik7CisgICAgCisgICAgLyogRXhpdCBJbml0aWFsaXphdGlvbiBtb2RlICovCisgICAgaHJ0Yy0+SW5zdGFuY2UtPklTUiAmPSAoKHVpbnQzMl90KX5SVENfSVNSX0lOSVQpOworICAgIAorICAgIC8qIElmICBDUl9CWVBTSEFEIGJpdCA9IDBVLCB3YWl0IGZvciBzeW5jaHJvIGVsc2UgdGhpcyBjaGVjayBpcyBub3QgbmVlZGVkICovCisgICAgaWYoKGhydGMtPkluc3RhbmNlLT5DUiAmIFJUQ19DUl9CWVBTSEFEKSA9PSBSRVNFVCkKKyAgICB7CisgICAgICBpZihIQUxfUlRDX1dhaXRGb3JTeW5jaHJvKGhydGMpICE9IEhBTF9PSykKKyAgICAgIHsgICAgICAgIAorICAgICAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7ICAKKyAgICAgICAgCisgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9FUlJPUjsKKyAgICAgICAgCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8gCisgICAgICAgIF9fSEFMX1VOTE9DSyhocnRjKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworICAgIAorICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworICAKKyAgIF9fSEFMX1VOTE9DSyhocnRjKTsgCisgICAgIAorICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBSVEMgY3VycmVudCB0aW1lLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBzVGltZSBQb2ludGVyIHRvIFRpbWUgc3RydWN0dXJlCisgICogQHBhcmFtICBGb3JtYXQgU3BlY2lmaWVzIHRoZSBmb3JtYXQgb2YgdGhlIGVudGVyZWQgcGFyYW1ldGVycy4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBSVENfRk9STUFUX0JJTjogQmluYXJ5IGRhdGEgZm9ybWF0IAorICAqICAgICAgICAgICAgQGFyZyBSVENfRk9STUFUX0JDRDogQkNEIGRhdGEgZm9ybWF0CisgICogQG5vdGUgIFlvdSBjYW4gdXNlIFN1YlNlY29uZHMgYW5kIFNlY29uZEZyYWN0aW9uIChzVGltZSBzdHJ1Y3R1cmUgZmllbGRzIHJldHVybmVkKSB0byBjb252ZXJ0IFN1YlNlY29uZHMKKyAgKiAgICAgICAgdmFsdWUgaW4gc2Vjb25kIGZyYWN0aW9uIHJhdGlvIHdpdGggdGltZSB1bml0IGZvbGxvd2luZyBnZW5lcmljIGZvcm11bGE6CisgICogICAgICAgIFNlY29uZCBmcmFjdGlvbiByYXRpbyAqIHRpbWVfdW5pdD0gWyhTZWNvbmRGcmFjdGlvbi1TdWJTZWNvbmRzKS8oU2Vjb25kRnJhY3Rpb24rMSldICogdGltZV91bml0CisgICogICAgICAgIFRoaXMgY29udmVyc2lvbiBjYW4gYmUgcGVyZm9ybWVkIG9ubHkgaWYgbm8gc2hpZnQgb3BlcmF0aW9uIGlzIHBlbmRpbmcgKGllLiBTSEZQPTApIHdoZW4gUFJFRElWX1MgPj0gU1MKKyAgKiBAbm90ZSAgIENhbGwgSEFMX1JUQ19HZXREYXRlKCkgYWZ0ZXIgSEFMX1JUQ19HZXRUaW1lKCkgdG8gdW5sb2NrIHRoZSB2YWx1ZXMgCisgICogICAgICAgICBpbiB0aGUgaGlnaGVyLW9yZGVyIGNhbGVuZGFyIHNoYWRvdyByZWdpc3RlcnMuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX0dldFRpbWUoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIFJUQ19UaW1lVHlwZURlZiAqc1RpbWUsIHVpbnQzMl90IEZvcm1hdCkKK3sKKyAgdWludDMyX3QgdG1wcmVnID0gMFU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19GT1JNQVQoRm9ybWF0KSk7CisgIAorICAvKiBHZXQgc3Vic2Vjb25kcyBzdHJ1Y3R1cmUgZmllbGQgZnJvbSB0aGUgY29ycmVzcG9uZGluZyByZWdpc3RlciovCisgIHNUaW1lLT5TdWJTZWNvbmRzID0gKHVpbnQzMl90KShocnRjLT5JbnN0YW5jZS0+U1NSKTsKKworICAvKiBHZXQgU2Vjb25kRnJhY3Rpb24gc3RydWN0dXJlIGZpZWxkIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0ZXIgZmllbGQqLworICBzVGltZS0+U2Vjb25kRnJhY3Rpb24gPSAodWludDMyX3QpKGhydGMtPkluc3RhbmNlLT5QUkVSICYgUlRDX1BSRVJfUFJFRElWX1MpOworICAKKyAgLyogR2V0IHRoZSBUUiByZWdpc3RlciAqLworICB0bXByZWcgPSAodWludDMyX3QpKGhydGMtPkluc3RhbmNlLT5UUiAmIFJUQ19UUl9SRVNFUlZFRF9NQVNLKTsgCisgIAorICAvKiBGaWxsIHRoZSBzdHJ1Y3R1cmUgZmllbGRzIHdpdGggdGhlIHJlYWQgcGFyYW1ldGVycyAqLworICBzVGltZS0+SG91cnMgPSAodWludDhfdCkoKHRtcHJlZyAmIChSVENfVFJfSFQgfCBSVENfVFJfSFUpKSA+PiAxNlUpOworICBzVGltZS0+TWludXRlcyA9ICh1aW50OF90KSgodG1wcmVnICYgKFJUQ19UUl9NTlQgfCBSVENfVFJfTU5VKSkgPj44VSk7CisgIHNUaW1lLT5TZWNvbmRzID0gKHVpbnQ4X3QpKHRtcHJlZyAmIChSVENfVFJfU1QgfCBSVENfVFJfU1UpKTsKKyAgc1RpbWUtPlRpbWVGb3JtYXQgPSAodWludDhfdCkoKHRtcHJlZyAmIChSVENfVFJfUE0pKSA+PiAxNlUpOyAKKyAgCisgIC8qIENoZWNrIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGZvcm1hdCAqLworICBpZihGb3JtYXQgPT0gUlRDX0ZPUk1BVF9CSU4pCisgIHsKKyAgICAvKiBDb252ZXJ0IHRoZSB0aW1lIHN0cnVjdHVyZSBwYXJhbWV0ZXJzIHRvIEJpbmFyeSBmb3JtYXQgKi8KKyAgICBzVGltZS0+SG91cnMgPSAodWludDhfdClSVENfQmNkMlRvQnl0ZShzVGltZS0+SG91cnMpOworICAgIHNUaW1lLT5NaW51dGVzID0gKHVpbnQ4X3QpUlRDX0JjZDJUb0J5dGUoc1RpbWUtPk1pbnV0ZXMpOworICAgIHNUaW1lLT5TZWNvbmRzID0gKHVpbnQ4X3QpUlRDX0JjZDJUb0J5dGUoc1RpbWUtPlNlY29uZHMpOyAgCisgIH0KKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFJUQyBjdXJyZW50IGRhdGUuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcGFyYW0gIHNEYXRlIFBvaW50ZXIgdG8gZGF0ZSBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gIEZvcm1hdCBzcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiB0aGUgZW50ZXJlZCBwYXJhbWV0ZXJzLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFJUQ19GT1JNQVRfQklOOiBCaW5hcnkgZGF0YSBmb3JtYXQgCisgICogICAgICAgICAgICBAYXJnIFJUQ19GT1JNQVRfQkNEOiBCQ0QgZGF0YSBmb3JtYXQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfU2V0RGF0ZShSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgUlRDX0RhdGVUeXBlRGVmICpzRGF0ZSwgdWludDMyX3QgRm9ybWF0KQoreworICB1aW50MzJfdCBkYXRldG1wcmVnID0gMFU7CisgIAorIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfRk9STUFUKEZvcm1hdCkpOworICAKKyAvKiBQcm9jZXNzIExvY2tlZCAqLyAKKyBfX0hBTF9MT0NLKGhydGMpOworICAKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7IAorICAKKyAgaWYoKEZvcm1hdCA9PSBSVENfRk9STUFUX0JJTikgJiYgKChzRGF0ZS0+TW9udGggJiAweDEwVSkgPT0gMHgxMFUpKQorICB7CisgICAgc0RhdGUtPk1vbnRoID0gKHVpbnQ4X3QpKChzRGF0ZS0+TW9udGggJiAodWludDhfdCl+KDB4MTBVKSkgKyAodWludDhfdCkweDBBVSk7CisgIH0KKyAgCisgIGFzc2VydF9wYXJhbShJU19SVENfV0VFS0RBWShzRGF0ZS0+V2Vla0RheSkpOworICAKKyAgaWYoRm9ybWF0ID09IFJUQ19GT1JNQVRfQklOKQorICB7ICAgCisgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19ZRUFSKHNEYXRlLT5ZZWFyKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19NT05USChzRGF0ZS0+TW9udGgpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0RBVEUoc0RhdGUtPkRhdGUpKTsgCisgICAgCisgICBkYXRldG1wcmVnID0gKCgodWludDMyX3QpUlRDX0J5dGVUb0JjZDIoc0RhdGUtPlllYXIpIDw8IDE2VSkgfCBcCisgICAgICAgICAgICAgICAgICgodWludDMyX3QpUlRDX0J5dGVUb0JjZDIoc0RhdGUtPk1vbnRoKSA8PCA4VSkgfCBcCisgICAgICAgICAgICAgICAgICgodWludDMyX3QpUlRDX0J5dGVUb0JjZDIoc0RhdGUtPkRhdGUpKSB8IFwKKyAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClzRGF0ZS0+V2Vla0RheSA8PCAxM1UpKTsgICAKKyAgfQorICBlbHNlCisgIHsgICAKKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX1lFQVIoUlRDX0JjZDJUb0J5dGUoc0RhdGUtPlllYXIpKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19NT05USChSVENfQmNkMlRvQnl0ZShzRGF0ZS0+TW9udGgpKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19EQVRFKFJUQ19CY2QyVG9CeXRlKHNEYXRlLT5EYXRlKSkpOworICAgIAorICAgIGRhdGV0bXByZWcgPSAoKCgodWludDMyX3Qpc0RhdGUtPlllYXIpIDw8IDE2VSkgfCBcCisgICAgICAgICAgICAgICAgICAoKCh1aW50MzJfdClzRGF0ZS0+TW9udGgpIDw8IDhVKSB8IFwKKyAgICAgICAgICAgICAgICAgICgodWludDMyX3Qpc0RhdGUtPkRhdGUpIHwgXAorICAgICAgICAgICAgICAgICAgKCgodWludDMyX3Qpc0RhdGUtPldlZWtEYXkpIDw8IDEzVSkpOyAgCisgIH0KKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKyAgCisgIC8qIFNldCBJbml0aWFsaXphdGlvbiBtb2RlICovCisgIGlmKFJUQ19FbnRlckluaXRNb2RlKGhydGMpICE9IEhBTF9PSykKKyAgeworICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOyAKKyAgICAKKyAgICAvKiBTZXQgUlRDIHN0YXRlKi8KKyAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfRVJST1I7CisgICAgCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLyAKKyAgICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisgICAgCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfSAKKyAgZWxzZQorICB7CisgICAgLyogU2V0IHRoZSBSVENfRFIgcmVnaXN0ZXIgKi8KKyAgICBocnRjLT5JbnN0YW5jZS0+RFIgPSAodWludDMyX3QpKGRhdGV0bXByZWcgJiBSVENfRFJfUkVTRVJWRURfTUFTSyk7CisgICAgCisgICAgLyogRXhpdCBJbml0aWFsaXphdGlvbiBtb2RlICovCisgICAgaHJ0Yy0+SW5zdGFuY2UtPklTUiAmPSAoKHVpbnQzMl90KX5SVENfSVNSX0lOSVQpOworICAgIAorICAgIC8qIElmICBDUl9CWVBTSEFEIGJpdCA9IDBVLCB3YWl0IGZvciBzeW5jaHJvIGVsc2UgdGhpcyBjaGVjayBpcyBub3QgbmVlZGVkICovCisgICAgaWYoKGhydGMtPkluc3RhbmNlLT5DUiAmIFJUQ19DUl9CWVBTSEFEKSA9PSBSRVNFVCkKKyAgICB7CisgICAgICBpZihIQUxfUlRDX1dhaXRGb3JTeW5jaHJvKGhydGMpICE9IEhBTF9PSykKKyAgICAgIHsgCisgICAgICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsgIAorICAgICAgICAKKyAgICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0VSUk9SOworICAgICAgICAKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLyAKKyAgICAgICAgX19IQUxfVU5MT0NLKGhydGMpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7ICAKKyAgICAKKyAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFkgOworICAgIAorICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8gCisgICAgX19IQUxfVU5MT0NLKGhydGMpOworICAgIAorICAgIHJldHVybiBIQUxfT0s7ICAgIAorICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFJUQyBjdXJyZW50IGRhdGUuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcGFyYW0gIHNEYXRlIFBvaW50ZXIgdG8gRGF0ZSBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gIEZvcm1hdCBTcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiB0aGUgZW50ZXJlZCBwYXJhbWV0ZXJzLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFJUQ19GT1JNQVRfQklOIDogIEJpbmFyeSBkYXRhIGZvcm1hdCAKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0ZPUk1BVF9CQ0QgOiAgQkNEIGRhdGEgZm9ybWF0CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX0dldERhdGUoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIFJUQ19EYXRlVHlwZURlZiAqc0RhdGUsIHVpbnQzMl90IEZvcm1hdCkKK3sKKyAgdWludDMyX3QgZGF0ZXRtcHJlZyA9IDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfRk9STUFUKEZvcm1hdCkpOworICAgICAgICAgIAorICAvKiBHZXQgdGhlIERSIHJlZ2lzdGVyICovCisgIGRhdGV0bXByZWcgPSAodWludDMyX3QpKGhydGMtPkluc3RhbmNlLT5EUiAmIFJUQ19EUl9SRVNFUlZFRF9NQVNLKTsgCisKKyAgLyogRmlsbCB0aGUgc3RydWN0dXJlIGZpZWxkcyB3aXRoIHRoZSByZWFkIHBhcmFtZXRlcnMgKi8KKyAgc0RhdGUtPlllYXIgPSAodWludDhfdCkoKGRhdGV0bXByZWcgJiAoUlRDX0RSX1lUIHwgUlRDX0RSX1lVKSkgPj4gMTZVKTsKKyAgc0RhdGUtPk1vbnRoID0gKHVpbnQ4X3QpKChkYXRldG1wcmVnICYgKFJUQ19EUl9NVCB8IFJUQ19EUl9NVSkpID4+IDhVKTsKKyAgc0RhdGUtPkRhdGUgPSAodWludDhfdCkoZGF0ZXRtcHJlZyAmIChSVENfRFJfRFQgfCBSVENfRFJfRFUpKTsKKyAgc0RhdGUtPldlZWtEYXkgPSAodWludDhfdCkoKGRhdGV0bXByZWcgJiAoUlRDX0RSX1dEVSkpID4+IDEzVSk7IAorCisgIC8qIENoZWNrIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGZvcm1hdCAqLworICBpZihGb3JtYXQgPT0gUlRDX0ZPUk1BVF9CSU4pCisgIHsgICAgCisgICAgLyogQ29udmVydCB0aGUgZGF0ZSBzdHJ1Y3R1cmUgcGFyYW1ldGVycyB0byBCaW5hcnkgZm9ybWF0ICovCisgICAgc0RhdGUtPlllYXIgPSAodWludDhfdClSVENfQmNkMlRvQnl0ZShzRGF0ZS0+WWVhcik7CisgICAgc0RhdGUtPk1vbnRoID0gKHVpbnQ4X3QpUlRDX0JjZDJUb0J5dGUoc0RhdGUtPk1vbnRoKTsKKyAgICBzRGF0ZS0+RGF0ZSA9ICh1aW50OF90KVJUQ19CY2QyVG9CeXRlKHNEYXRlLT5EYXRlKTsgIAorICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBSVENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMworICogIEBicmllZiAgIFJUQyBBbGFybSBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0gICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICMjIyMjIFJUQyBBbGFybSBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAKKyBbLi5dIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gY29uZmlndXJlIEFsYXJtIGZlYXR1cmUKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBzcGVjaWZpZWQgUlRDIEFsYXJtLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBzQWxhcm0gUG9pbnRlciB0byBBbGFybSBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gIEZvcm1hdCBTcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiB0aGUgZW50ZXJlZCBwYXJhbWV0ZXJzLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgQGFyZyBSVENfRk9STUFUX0JJTjogQmluYXJ5IGRhdGEgZm9ybWF0IAorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZPUk1BVF9CQ0Q6IEJDRCBkYXRhIGZvcm1hdAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19TZXRBbGFybShSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgUlRDX0FsYXJtVHlwZURlZiAqc0FsYXJtLCB1aW50MzJfdCBGb3JtYXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDBVOworICB1aW50MzJfdCB0bXByZWcgPSAwVSwgc3Vic2Vjb25kdG1wcmVnID0gMFU7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0ZPUk1BVChGb3JtYXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTEFSTShzQWxhcm0tPkFsYXJtKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfQUxBUk1fTUFTSyhzQWxhcm0tPkFsYXJtTWFzaykpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX0RBVEVfV0VFS0RBWV9TRUwoc0FsYXJtLT5BbGFybURhdGVXZWVrRGF5U2VsKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfQUxBUk1fU1VCX1NFQ09ORF9WQUxVRShzQWxhcm0tPkFsYXJtVGltZS5TdWJTZWNvbmRzKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfQUxBUk1fU1VCX1NFQ09ORF9NQVNLKHNBbGFybS0+QWxhcm1TdWJTZWNvbmRNYXNrKSk7CisgIAorICAvKiBQcm9jZXNzIExvY2tlZCAqLyAKKyAgX19IQUxfTE9DSyhocnRjKTsKKyAgCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworICAKKyAgaWYoRm9ybWF0ID09IFJUQ19GT1JNQVRfQklOKQorICB7CisgICAgaWYoKGhydGMtPkluc3RhbmNlLT5DUiAmIFJUQ19DUl9GTVQpICE9ICh1aW50MzJfdClSRVNFVCkKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0hPVVIxMihzQWxhcm0tPkFsYXJtVGltZS5Ib3VycykpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSRk9STUFUMTIoc0FsYXJtLT5BbGFybVRpbWUuVGltZUZvcm1hdCkpOworICAgIH0gCisgICAgZWxzZQorICAgIHsKKyAgICAgIHNBbGFybS0+QWxhcm1UaW1lLlRpbWVGb3JtYXQgPSAweDAwVTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfSE9VUjI0KHNBbGFybS0+QWxhcm1UaW1lLkhvdXJzKSk7CisgICAgfQorICAgIGFzc2VydF9wYXJhbShJU19SVENfTUlOVVRFUyhzQWxhcm0tPkFsYXJtVGltZS5NaW51dGVzKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19TRUNPTkRTKHNBbGFybS0+QWxhcm1UaW1lLlNlY29uZHMpKTsKKyAgICAKKyAgICBpZihzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXlTZWwgPT0gUlRDX0FMQVJNREFURVdFRUtEQVlTRUxfREFURSkKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX0RBVEVfV0VFS0RBWV9EQVRFKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTEFSTV9EQVRFX1dFRUtEQVlfV0VFS0RBWShzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXkpKTsKKyAgICB9CisgICAgCisgICAgdG1wcmVnID0gKCgodWludDMyX3QpUlRDX0J5dGVUb0JjZDIoc0FsYXJtLT5BbGFybVRpbWUuSG91cnMpIDw8IDE2VSkgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3QpUlRDX0J5dGVUb0JjZDIoc0FsYXJtLT5BbGFybVRpbWUuTWludXRlcykgPDwgOFUpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19CeXRlVG9CY2QyKHNBbGFybS0+QWxhcm1UaW1lLlNlY29uZHMpKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdCkoc0FsYXJtLT5BbGFybVRpbWUuVGltZUZvcm1hdCkgPDwgMTZVKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfQnl0ZVRvQmNkMihzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXkpIDw8IDI0VSkgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3Qpc0FsYXJtLT5BbGFybURhdGVXZWVrRGF5U2VsKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdClzQWxhcm0tPkFsYXJtTWFzaykpOyAKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZigoaHJ0Yy0+SW5zdGFuY2UtPkNSICYgUlRDX0NSX0ZNVCkgIT0gKHVpbnQzMl90KVJFU0VUKQorICAgIHsKKyAgICAgIHRtcHJlZyA9IFJUQ19CY2QyVG9CeXRlKHNBbGFybS0+QWxhcm1UaW1lLkhvdXJzKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfSE9VUjEyKHRtcHJlZykpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSRk9STUFUMTIoc0FsYXJtLT5BbGFybVRpbWUuVGltZUZvcm1hdCkpOworICAgIH0gCisgICAgZWxzZQorICAgIHsKKyAgICAgIHNBbGFybS0+QWxhcm1UaW1lLlRpbWVGb3JtYXQgPSAweDAwVTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfSE9VUjI0KFJUQ19CY2QyVG9CeXRlKHNBbGFybS0+QWxhcm1UaW1lLkhvdXJzKSkpOworICAgIH0KKyAgICAKKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX01JTlVURVMoUlRDX0JjZDJUb0J5dGUoc0FsYXJtLT5BbGFybVRpbWUuTWludXRlcykpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX1NFQ09ORFMoUlRDX0JjZDJUb0J5dGUoc0FsYXJtLT5BbGFybVRpbWUuU2Vjb25kcykpKTsKKyAgICAKKyAgICBpZihzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXlTZWwgPT0gUlRDX0FMQVJNREFURVdFRUtEQVlTRUxfREFURSkKKyAgICB7CisgICAgICB0bXByZWcgPSBSVENfQmNkMlRvQnl0ZShzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTEFSTV9EQVRFX1dFRUtEQVlfREFURSh0bXByZWcpKTsgICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB0bXByZWcgPSBSVENfQmNkMlRvQnl0ZShzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTEFSTV9EQVRFX1dFRUtEQVlfV0VFS0RBWSh0bXByZWcpKTsgICAgICAKKyAgICB9ICAKKyAgICAKKyAgICB0bXByZWcgPSAoKCh1aW50MzJfdCkoc0FsYXJtLT5BbGFybVRpbWUuSG91cnMpIDw8IDE2VSkgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3QpKHNBbGFybS0+QWxhcm1UaW1lLk1pbnV0ZXMpIDw8IDhVKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdCkgc0FsYXJtLT5BbGFybVRpbWUuU2Vjb25kcykgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3QpKHNBbGFybS0+QWxhcm1UaW1lLlRpbWVGb3JtYXQpIDw8IDE2VSkgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3QpKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheSkgPDwgMjRVKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdClzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXlTZWwpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KXNBbGFybS0+QWxhcm1NYXNrKSk7ICAgCisgIH0KKyAgCisgIC8qIENvbmZpZ3VyZSB0aGUgQWxhcm0gQSBvciBBbGFybSBCIFN1YiBTZWNvbmQgcmVnaXN0ZXJzICovCisgIHN1YnNlY29uZHRtcHJlZyA9ICh1aW50MzJfdCkoKHVpbnQzMl90KShzQWxhcm0tPkFsYXJtVGltZS5TdWJTZWNvbmRzKSB8ICh1aW50MzJfdCkoc0FsYXJtLT5BbGFybVN1YlNlY29uZE1hc2spKTsKKyAgCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIENvbmZpZ3VyZSB0aGUgQWxhcm0gcmVnaXN0ZXIgKi8KKyAgaWYoc0FsYXJtLT5BbGFybSA9PSBSVENfQUxBUk1fQSkKKyAgeworICAgIC8qIERpc2FibGUgdGhlIEFsYXJtIEEgaW50ZXJydXB0ICovCisgICAgX19IQUxfUlRDX0FMQVJNQV9ESVNBQkxFKGhydGMpOworICAgIAorICAgIC8qIEluIGNhc2Ugb2YgaW50ZXJydXB0IG1vZGUgaXMgdXNlZCwgdGhlIGludGVycnVwdCBzb3VyY2UgbXVzdCBkaXNhYmxlZCAqLyAKKyAgICBfX0hBTF9SVENfQUxBUk1fRElTQUJMRV9JVChocnRjLCBSVENfSVRfQUxSQSk7CisgICAgICAgICAKKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgIC8qIFdhaXQgdGlsbCBSVEMgQUxSQVdGIGZsYWcgaXMgc2V0IGFuZCBpZiBUaW1lIG91dCBpcyByZWFjaGVkIGV4aXQgKi8KKyAgICB3aGlsZShfX0hBTF9SVENfQUxBUk1fR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfQUxSQVdGKSA9PSBSRVNFVCkKKyAgICB7CisgICAgICBpZigoSEFMX0dldFRpY2soKS10aWNrc3RhcnQpID4gUlRDX1RJTUVPVVRfVkFMVUUpCisgICAgICB7CisgICAgICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKyAgICAgICAgCisgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9USU1FT1VUOyAKKyAgICAgICAgCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8gCisgICAgICAgIF9fSEFMX1VOTE9DSyhocnRjKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0gICAKKyAgICB9CisgICAgCisgICAgaHJ0Yy0+SW5zdGFuY2UtPkFMUk1BUiA9ICh1aW50MzJfdCl0bXByZWc7CisgICAgLyogQ29uZmlndXJlIHRoZSBBbGFybSBBIFN1YiBTZWNvbmQgcmVnaXN0ZXIgKi8KKyAgICBocnRjLT5JbnN0YW5jZS0+QUxSTUFTU1IgPSBzdWJzZWNvbmR0bXByZWc7CisgICAgLyogQ29uZmlndXJlIHRoZSBBbGFybSBzdGF0ZTogRW5hYmxlIEFsYXJtICovCisgICAgX19IQUxfUlRDX0FMQVJNQV9FTkFCTEUoaHJ0Yyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgQWxhcm0gQiBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9SVENfQUxBUk1CX0RJU0FCTEUoaHJ0Yyk7CisgICAgCisgICAgLyogSW4gY2FzZSBvZiBpbnRlcnJ1cHQgbW9kZSBpcyB1c2VkLCB0aGUgaW50ZXJydXB0IHNvdXJjZSBtdXN0IGRpc2FibGVkICovIAorICAgIF9fSEFMX1JUQ19BTEFSTV9ESVNBQkxFX0lUKGhydGMsIFJUQ19JVF9BTFJCKTsKKyAgICAgICAKKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgIC8qIFdhaXQgdGlsbCBSVEMgQUxSQldGIGZsYWcgaXMgc2V0IGFuZCBpZiBUaW1lIG91dCBpcyByZWFjaGVkIGV4aXQgKi8KKyAgICB3aGlsZShfX0hBTF9SVENfQUxBUk1fR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfQUxSQldGKSA9PSBSRVNFVCkKKyAgICB7CisgICAgICBpZigoSEFMX0dldFRpY2soKS10aWNrc3RhcnQpID4gUlRDX1RJTUVPVVRfVkFMVUUpCisgICAgICB7CisgICAgICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKyAgICAgICAgCisgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9USU1FT1VUOyAKKyAgICAgICAgCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8gCisgICAgICAgIF9fSEFMX1VOTE9DSyhocnRjKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0gIAorICAgIH0gICAgCisgICAgCisgICAgaHJ0Yy0+SW5zdGFuY2UtPkFMUk1CUiA9ICh1aW50MzJfdCl0bXByZWc7CisgICAgLyogQ29uZmlndXJlIHRoZSBBbGFybSBCIFN1YiBTZWNvbmQgcmVnaXN0ZXIgKi8KKyAgICBocnRjLT5JbnN0YW5jZS0+QUxSTUJTU1IgPSBzdWJzZWNvbmR0bXByZWc7CisgICAgLyogQ29uZmlndXJlIHRoZSBBbGFybSBzdGF0ZTogRW5hYmxlIEFsYXJtICovCisgICAgX19IQUxfUlRDX0FMQVJNQl9FTkFCTEUoaHJ0Yyk7IAorICB9CisgIAorICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7ICAgCisgIAorICAvKiBDaGFuZ2UgUlRDIHN0YXRlICovCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsgCisgIAorICAvKiBQcm9jZXNzIFVubG9ja2VkICovIAorICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgc3BlY2lmaWVkIFJUQyBBbGFybSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSAgc0FsYXJtIFBvaW50ZXIgdG8gQWxhcm0gc3RydWN0dXJlCisgICogQHBhcmFtICBGb3JtYXQgU3BlY2lmaWVzIHRoZSBmb3JtYXQgb2YgdGhlIGVudGVyZWQgcGFyYW1ldGVycy4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZPUk1BVF9CSU46IEJpbmFyeSBkYXRhIGZvcm1hdCAKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19GT1JNQVRfQkNEOiBCQ0QgZGF0YSBmb3JtYXQKKyAgKiBAbm90ZSAgIFRoZSBBbGFybSByZWdpc3RlciBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgQWxhcm0KKyAgKiAgICAgICAgIGlzIGRpc2FibGVkIChVc2UgdGhlIEhBTF9SVENfRGVhY3RpdmF0ZUFsYXJtKCkpLiAgIAorICAqIEBub3RlICAgVGhlIEhBTF9SVENfU2V0VGltZSgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBlbmFibGluZyB0aGUgQWxhcm0gZmVhdHVyZS4gICAKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfU2V0QWxhcm1fSVQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIFJUQ19BbGFybVR5cGVEZWYgKnNBbGFybSwgdWludDMyX3QgRm9ybWF0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKyAgdWludDMyX3QgdG1wcmVnID0gMFUsIHN1YnNlY29uZHRtcHJlZyA9IDBVOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19GT1JNQVQoRm9ybWF0KSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfQUxBUk0oc0FsYXJtLT5BbGFybSkpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX01BU0soc0FsYXJtLT5BbGFybU1hc2spKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTEFSTV9EQVRFX1dFRUtEQVlfU0VMKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheVNlbCkpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX1NVQl9TRUNPTkRfVkFMVUUoc0FsYXJtLT5BbGFybVRpbWUuU3ViU2Vjb25kcykpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX1NVQl9TRUNPTkRfTUFTSyhzQWxhcm0tPkFsYXJtU3ViU2Vjb25kTWFzaykpOworICAgICAgCisgIC8qIFByb2Nlc3MgTG9ja2VkICovIAorICBfX0hBTF9MT0NLKGhydGMpOworICAKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7CisgIAorICBpZihGb3JtYXQgPT0gUlRDX0ZPUk1BVF9CSU4pCisgIHsKKyAgICBpZigoaHJ0Yy0+SW5zdGFuY2UtPkNSICYgUlRDX0NSX0ZNVCkgIT0gKHVpbnQzMl90KVJFU0VUKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfSE9VUjEyKHNBbGFybS0+QWxhcm1UaW1lLkhvdXJzKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0hPVVJGT1JNQVQxMihzQWxhcm0tPkFsYXJtVGltZS5UaW1lRm9ybWF0KSk7CisgICAgfSAKKyAgICBlbHNlCisgICAgeworICAgICAgc0FsYXJtLT5BbGFybVRpbWUuVGltZUZvcm1hdCA9IDB4MDBVOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSMjQoc0FsYXJtLT5BbGFybVRpbWUuSG91cnMpKTsKKyAgICB9CisgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19NSU5VVEVTKHNBbGFybS0+QWxhcm1UaW1lLk1pbnV0ZXMpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX1NFQ09ORFMoc0FsYXJtLT5BbGFybVRpbWUuU2Vjb25kcykpOworICAgIAorICAgIGlmKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheVNlbCA9PSBSVENfQUxBUk1EQVRFV0VFS0RBWVNFTF9EQVRFKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfQUxBUk1fREFURV9XRUVLREFZX0RBVEUoc0FsYXJtLT5BbGFybURhdGVXZWVrRGF5KSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX0RBVEVfV0VFS0RBWV9XRUVLREFZKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheSkpOworICAgIH0KKyAgICB0bXByZWcgPSAoKCh1aW50MzJfdClSVENfQnl0ZVRvQmNkMihzQWxhcm0tPkFsYXJtVGltZS5Ib3VycykgPDwgMTZVKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfQnl0ZVRvQmNkMihzQWxhcm0tPkFsYXJtVGltZS5NaW51dGVzKSA8PCA4VSkgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3QpUlRDX0J5dGVUb0JjZDIoc0FsYXJtLT5BbGFybVRpbWUuU2Vjb25kcykpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KShzQWxhcm0tPkFsYXJtVGltZS5UaW1lRm9ybWF0KSA8PCAxNlUpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19CeXRlVG9CY2QyKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheSkgPDwgMjRVKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdClzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXlTZWwpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KXNBbGFybS0+QWxhcm1NYXNrKSk7IAorICB9CisgIGVsc2UKKyAgeworICAgIGlmKChocnRjLT5JbnN0YW5jZS0+Q1IgJiBSVENfQ1JfRk1UKSAhPSAodWludDMyX3QpUkVTRVQpCisgICAgeworICAgICAgdG1wcmVnID0gUlRDX0JjZDJUb0J5dGUoc0FsYXJtLT5BbGFybVRpbWUuSG91cnMpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSMTIodG1wcmVnKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0hPVVJGT1JNQVQxMihzQWxhcm0tPkFsYXJtVGltZS5UaW1lRm9ybWF0KSk7CisgICAgfSAKKyAgICBlbHNlCisgICAgeworICAgICAgc0FsYXJtLT5BbGFybVRpbWUuVGltZUZvcm1hdCA9IDB4MDBVOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSMjQoUlRDX0JjZDJUb0J5dGUoc0FsYXJtLT5BbGFybVRpbWUuSG91cnMpKSk7CisgICAgfQorICAgIAorICAgIGFzc2VydF9wYXJhbShJU19SVENfTUlOVVRFUyhSVENfQmNkMlRvQnl0ZShzQWxhcm0tPkFsYXJtVGltZS5NaW51dGVzKSkpOworICAgIGFzc2VydF9wYXJhbShJU19SVENfU0VDT05EUyhSVENfQmNkMlRvQnl0ZShzQWxhcm0tPkFsYXJtVGltZS5TZWNvbmRzKSkpOworICAgIAorICAgIGlmKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheVNlbCA9PSBSVENfQUxBUk1EQVRFV0VFS0RBWVNFTF9EQVRFKQorICAgIHsKKyAgICAgIHRtcHJlZyA9IFJUQ19CY2QyVG9CeXRlKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX0RBVEVfV0VFS0RBWV9EQVRFKHRtcHJlZykpOyAgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHRtcHJlZyA9IFJUQ19CY2QyVG9CeXRlKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX0RBVEVfV0VFS0RBWV9XRUVLREFZKHRtcHJlZykpOyAgICAgIAorICAgIH0KKyAgICB0bXByZWcgPSAoKCh1aW50MzJfdCkoc0FsYXJtLT5BbGFybVRpbWUuSG91cnMpIDw8IDE2VSkgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3QpKHNBbGFybS0+QWxhcm1UaW1lLk1pbnV0ZXMpIDw8IDhVKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdCkgc0FsYXJtLT5BbGFybVRpbWUuU2Vjb25kcykgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3QpKHNBbGFybS0+QWxhcm1UaW1lLlRpbWVGb3JtYXQpIDw8IDE2VSkgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3QpKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheSkgPDwgMjRVKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdClzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXlTZWwpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KXNBbGFybS0+QWxhcm1NYXNrKSk7ICAgICAKKyAgfQorICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIEEgb3IgQWxhcm0gQiBTdWIgU2Vjb25kIHJlZ2lzdGVycyAqLworICBzdWJzZWNvbmR0bXByZWcgPSAodWludDMyX3QpKCh1aW50MzJfdCkoc0FsYXJtLT5BbGFybVRpbWUuU3ViU2Vjb25kcykgfCAodWludDMyX3QpKHNBbGFybS0+QWxhcm1TdWJTZWNvbmRNYXNrKSk7CisgIAorICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKyAgCisgIC8qIENvbmZpZ3VyZSB0aGUgQWxhcm0gcmVnaXN0ZXIgKi8KKyAgaWYoc0FsYXJtLT5BbGFybSA9PSBSVENfQUxBUk1fQSkKKyAgeworICAgIC8qIERpc2FibGUgdGhlIEFsYXJtIEEgaW50ZXJydXB0ICovCisgICAgX19IQUxfUlRDX0FMQVJNQV9ESVNBQkxFKGhydGMpOworCisgICAgLyogQ2xlYXIgZmxhZyBhbGFybSBBICovCisgICAgX19IQUxfUlRDX0FMQVJNX0NMRUFSX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfQUxSQUYpOworCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICAvKiBXYWl0IHRpbGwgUlRDIEFMUkFXRiBmbGFnIGlzIHNldCBhbmQgaWYgVGltZSBvdXQgaXMgcmVhY2hlZCBleGl0ICovCisgICAgd2hpbGUoX19IQUxfUlRDX0FMQVJNX0dFVF9GTEFHKGhydGMsIFJUQ19GTEFHX0FMUkFXRikgPT0gUkVTRVQpCisgICAgeworICAgICAgaWYoKEhBTF9HZXRUaWNrKCktdGlja3N0YXJ0KSA+IFJUQ19USU1FT1VUX1ZBTFVFKQorICAgICAgeworICAgICAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisgICAgICAgIAorICAgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsgCisgICAgICAgIAorICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovIAorICAgICAgICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9ICAKKyAgICB9CisgICAgCisgICAgaHJ0Yy0+SW5zdGFuY2UtPkFMUk1BUiA9ICh1aW50MzJfdCl0bXByZWc7CisgICAgLyogQ29uZmlndXJlIHRoZSBBbGFybSBBIFN1YiBTZWNvbmQgcmVnaXN0ZXIgKi8KKyAgICBocnRjLT5JbnN0YW5jZS0+QUxSTUFTU1IgPSBzdWJzZWNvbmR0bXByZWc7CisgICAgLyogQ29uZmlndXJlIHRoZSBBbGFybSBzdGF0ZTogRW5hYmxlIEFsYXJtICovCisgICAgX19IQUxfUlRDX0FMQVJNQV9FTkFCTEUoaHJ0Yyk7CisgICAgLyogQ29uZmlndXJlIHRoZSBBbGFybSBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9SVENfQUxBUk1fRU5BQkxFX0lUKGhydGMsUlRDX0lUX0FMUkEpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIERpc2FibGUgdGhlIEFsYXJtIEIgaW50ZXJydXB0ICovCisgICAgX19IQUxfUlRDX0FMQVJNQl9ESVNBQkxFKGhydGMpOworCisgICAgLyogQ2xlYXIgZmxhZyBhbGFybSBCICovCisgICAgX19IQUxfUlRDX0FMQVJNX0NMRUFSX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfQUxSQkYpOworCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICAvKiBXYWl0IHRpbGwgUlRDIEFMUkJXRiBmbGFnIGlzIHNldCBhbmQgaWYgVGltZSBvdXQgaXMgcmVhY2hlZCBleGl0ICovCisgICAgd2hpbGUoX19IQUxfUlRDX0FMQVJNX0dFVF9GTEFHKGhydGMsIFJUQ19GTEFHX0FMUkJXRikgPT0gUkVTRVQpCisgICAgeworICAgICAgaWYoKEhBTF9HZXRUaWNrKCktdGlja3N0YXJ0KSA+IFJUQ19USU1FT1VUX1ZBTFVFKQorICAgICAgeworICAgICAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisgICAgICAgIAorICAgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsgCisgICAgICAgIAorICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovIAorICAgICAgICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9ICAKKyAgICB9CisKKyAgICBocnRjLT5JbnN0YW5jZS0+QUxSTUJSID0gKHVpbnQzMl90KXRtcHJlZzsKKyAgICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIEIgU3ViIFNlY29uZCByZWdpc3RlciAqLworICAgIGhydGMtPkluc3RhbmNlLT5BTFJNQlNTUiA9IHN1YnNlY29uZHRtcHJlZzsKKyAgICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIHN0YXRlOiBFbmFibGUgQWxhcm0gKi8KKyAgICBfX0hBTF9SVENfQUxBUk1CX0VOQUJMRShocnRjKTsKKyAgICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIGludGVycnVwdCAqLworICAgIF9fSEFMX1JUQ19BTEFSTV9FTkFCTEVfSVQoaHJ0YywgUlRDX0lUX0FMUkIpOworICB9CisKKyAgLyogUlRDIEFsYXJtIEludGVycnVwdCBDb25maWd1cmF0aW9uOiBFWFRJIGNvbmZpZ3VyYXRpb24gKi8KKyAgX19IQUxfUlRDX0FMQVJNX0VYVElfRU5BQkxFX0lUKCk7CisgIAorICBfX0hBTF9SVENfQUxBUk1fRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTsKKyAgCisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsgIAorICAKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOyAKKyAgCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8gCisgIF9fSEFMX1VOTE9DSyhocnRjKTsgIAorICAKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZWFjdGl2YXRlIHRoZSBzcGVjaWZpZWQgUlRDIEFsYXJtLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBBbGFybSBTcGVjaWZpZXMgdGhlIEFsYXJtLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFJUQ19BTEFSTV9BIDogIEFsYXJtQQorICAqICAgICAgICAgICAgQGFyZyBSVENfQUxBUk1fQiA6ICBBbGFybUIKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfRGVhY3RpdmF0ZUFsYXJtKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBBbGFybSkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gMFU7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNKEFsYXJtKSk7CisgIAorICAvKiBQcm9jZXNzIExvY2tlZCAqLyAKKyAgX19IQUxfTE9DSyhocnRjKTsKKyAgCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworICAKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisgIAorICBpZihBbGFybSA9PSBSVENfQUxBUk1fQSkKKyAgeworICAgIC8qIEFsYXJtQSAqLworICAgIF9fSEFMX1JUQ19BTEFSTUFfRElTQUJMRShocnRjKTsKKyAgICAKKyAgICAvKiBJbiBjYXNlIG9mIGludGVycnVwdCBtb2RlIGlzIHVzZWQsIHRoZSBpbnRlcnJ1cHQgc291cmNlIG11c3QgZGlzYWJsZWQgKi8gCisgICAgX19IQUxfUlRDX0FMQVJNX0RJU0FCTEVfSVQoaHJ0YywgUlRDX0lUX0FMUkEpOworICAgIAorICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgICAgCisgICAgLyogV2FpdCB0aWxsIFJUQyBBTFJ4V0YgZmxhZyBpcyBzZXQgYW5kIGlmIFRpbWUgb3V0IGlzIHJlYWNoZWQgZXhpdCAqLworICAgIHdoaWxlKF9fSEFMX1JUQ19BTEFSTV9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19BTFJBV0YpID09IFJFU0VUKQorICAgIHsKKyAgICAgIGlmKChIQUxfR2V0VGljaygpLXRpY2tzdGFydCkgPiBSVENfVElNRU9VVF9WQUxVRSkKKyAgICAgIHsgCisgICAgICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKyAgICAgICAgCisgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9USU1FT1VUOyAKKyAgICAgICAgCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8gCisgICAgICAgIF9fSEFMX1VOTE9DSyhocnRjKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0gICAgICAKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQWxhcm1CICovCisgICAgX19IQUxfUlRDX0FMQVJNQl9ESVNBQkxFKGhydGMpOworICAgIAorICAgIC8qIEluIGNhc2Ugb2YgaW50ZXJydXB0IG1vZGUgaXMgdXNlZCwgdGhlIGludGVycnVwdCBzb3VyY2UgbXVzdCBkaXNhYmxlZCAqLyAKKyAgICBfX0hBTF9SVENfQUxBUk1fRElTQUJMRV9JVChocnRjLFJUQ19JVF9BTFJCKTsKKyAgICAKKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgIAorICAgIC8qIFdhaXQgdGlsbCBSVEMgQUxSeFdGIGZsYWcgaXMgc2V0IGFuZCBpZiBUaW1lIG91dCBpcyByZWFjaGVkIGV4aXQgKi8KKyAgICB3aGlsZShfX0hBTF9SVENfQUxBUk1fR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfQUxSQldGKSA9PSBSRVNFVCkKKyAgICB7CisgICAgICBpZigoSEFMX0dldFRpY2soKS10aWNrc3RhcnQpID4gUlRDX1RJTUVPVVRfVkFMVUUpCisgICAgICB7CisgICAgICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKyAgICAgICAgCisgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9USU1FT1VUOyAKKyAgICAgICAgCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8gCisgICAgICAgIF9fSEFMX1VOTE9DSyhocnRjKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0gICAgCisgICAgfQorICB9CisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKyAgCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsgCisgIAorICAvKiBQcm9jZXNzIFVubG9ja2VkICovIAorICBfX0hBTF9VTkxPQ0soaHJ0Yyk7ICAKKyAgCisgIHJldHVybiBIQUxfT0s7IAorfQorICAgICAgICAgICAKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBSVEMgQWxhcm0gdmFsdWUgYW5kIG1hc2tzLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBzQWxhcm0gUG9pbnRlciB0byBEYXRlIHN0cnVjdHVyZQorICAqIEBwYXJhbSAgQWxhcm0gU3BlY2lmaWVzIHRoZSBBbGFybS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0FMQVJNX0E6IEFsYXJtQQorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0FMQVJNX0I6IEFsYXJtQiAgCisgICogQHBhcmFtICBGb3JtYXQgU3BlY2lmaWVzIHRoZSBmb3JtYXQgb2YgdGhlIGVudGVyZWQgcGFyYW1ldGVycy4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZPUk1BVF9CSU46IEJpbmFyeSBkYXRhIGZvcm1hdCAKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19GT1JNQVRfQkNEOiBCQ0QgZGF0YSBmb3JtYXQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfR2V0QWxhcm0oUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIFJUQ19BbGFybVR5cGVEZWYgKnNBbGFybSwgdWludDMyX3QgQWxhcm0sIHVpbnQzMl90IEZvcm1hdCkKK3sKKyAgdWludDMyX3QgdG1wcmVnID0gMFUsIHN1YnNlY29uZHRtcHJlZyA9IDBVOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19GT1JNQVQoRm9ybWF0KSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfQUxBUk0oQWxhcm0pKTsKKyAgCisgIGlmKEFsYXJtID09IFJUQ19BTEFSTV9BKQorICB7CisgICAgLyogQWxhcm1BICovCisgICAgc0FsYXJtLT5BbGFybSA9IFJUQ19BTEFSTV9BOworICAgIAorICAgIHRtcHJlZyA9ICh1aW50MzJfdCkoaHJ0Yy0+SW5zdGFuY2UtPkFMUk1BUik7CisgICAgc3Vic2Vjb25kdG1wcmVnID0gKHVpbnQzMl90KSgoaHJ0Yy0+SW5zdGFuY2UtPkFMUk1BU1NSICkgJiBSVENfQUxSTUFTU1JfU1MpOworICB9CisgIGVsc2UKKyAgeworICAgIHNBbGFybS0+QWxhcm0gPSBSVENfQUxBUk1fQjsKKyAgICAKKyAgICB0bXByZWcgPSAodWludDMyX3QpKGhydGMtPkluc3RhbmNlLT5BTFJNQlIpOworICAgIHN1YnNlY29uZHRtcHJlZyA9ICh1aW50MzJfdCkoKGhydGMtPkluc3RhbmNlLT5BTFJNQlNTUikgJiBSVENfQUxSTUJTU1JfU1MpOworICB9CisgICAgCisgIC8qIEZpbGwgdGhlIHN0cnVjdHVyZSB3aXRoIHRoZSByZWFkIHBhcmFtZXRlcnMgKi8KKyAgc0FsYXJtLT5BbGFybVRpbWUuSG91cnMgPSAodWludDMyX3QpKCh0bXByZWcgJiAoUlRDX0FMUk1BUl9IVCB8IFJUQ19BTFJNQVJfSFUpKSA+PiAxNlUpOworICBzQWxhcm0tPkFsYXJtVGltZS5NaW51dGVzID0gKHVpbnQzMl90KSgodG1wcmVnICYgKFJUQ19BTFJNQVJfTU5UIHwgUlRDX0FMUk1BUl9NTlUpKSA+PiA4VSk7CisgIHNBbGFybS0+QWxhcm1UaW1lLlNlY29uZHMgPSAodWludDMyX3QpKHRtcHJlZyAmIChSVENfQUxSTUFSX1NUIHwgUlRDX0FMUk1BUl9TVSkpOworICBzQWxhcm0tPkFsYXJtVGltZS5UaW1lRm9ybWF0ID0gKHVpbnQzMl90KSgodG1wcmVnICYgUlRDX0FMUk1BUl9QTSkgPj4gMTZVKTsKKyAgc0FsYXJtLT5BbGFybVRpbWUuU3ViU2Vjb25kcyA9ICh1aW50MzJfdCkgc3Vic2Vjb25kdG1wcmVnOworICBzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXkgPSAodWludDMyX3QpKCh0bXByZWcgJiAoUlRDX0FMUk1BUl9EVCB8IFJUQ19BTFJNQVJfRFUpKSA+PiAyNFUpOworICBzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXlTZWwgPSAodWludDMyX3QpKHRtcHJlZyAmIFJUQ19BTFJNQVJfV0RTRUwpOworICBzQWxhcm0tPkFsYXJtTWFzayA9ICh1aW50MzJfdCkodG1wcmVnICYgUlRDX0FMQVJNTUFTS19BTEwpOworICAgIAorICBpZihGb3JtYXQgPT0gUlRDX0ZPUk1BVF9CSU4pCisgIHsKKyAgICBzQWxhcm0tPkFsYXJtVGltZS5Ib3VycyA9IFJUQ19CY2QyVG9CeXRlKHNBbGFybS0+QWxhcm1UaW1lLkhvdXJzKTsKKyAgICBzQWxhcm0tPkFsYXJtVGltZS5NaW51dGVzID0gUlRDX0JjZDJUb0J5dGUoc0FsYXJtLT5BbGFybVRpbWUuTWludXRlcyk7CisgICAgc0FsYXJtLT5BbGFybVRpbWUuU2Vjb25kcyA9IFJUQ19CY2QyVG9CeXRlKHNBbGFybS0+QWxhcm1UaW1lLlNlY29uZHMpOworICAgIHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheSA9IFJUQ19CY2QyVG9CeXRlKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheSk7CisgIH0gIAorICAgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBBbGFybSBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUlRDX0FsYXJtSVJRSGFuZGxlcihSVENfSGFuZGxlVHlwZURlZiogaHJ0YykKK3sgIAorICAvKiBHZXQgdGhlIEFsYXJtQSBpbnRlcnJ1cHQgc291cmNlIGVuYWJsZSBzdGF0dXMgKi8KKyAgaWYoX19IQUxfUlRDX0FMQVJNX0dFVF9JVF9TT1VSQ0UoaHJ0YywgUlRDX0lUX0FMUkEpICE9IFJFU0VUKQorICB7CisgICAgLyogR2V0IHRoZSBwZW5kaW5nIHN0YXR1cyBvZiB0aGUgQWxhcm1BIEludGVycnVwdCAqLworICAgIGlmKF9fSEFMX1JUQ19BTEFSTV9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19BTFJBRikgIT0gUkVTRVQpCisgICAgeworICAgICAgLyogQWxhcm1BIGNhbGxiYWNrICovIAorICAgICAgSEFMX1JUQ19BbGFybUFFdmVudENhbGxiYWNrKGhydGMpOworICAgICAgCisgICAgICAvKiBDbGVhciB0aGUgQWxhcm1BIGludGVycnVwdCBwZW5kaW5nIGJpdCAqLworICAgICAgX19IQUxfUlRDX0FMQVJNX0NMRUFSX0ZMQUcoaHJ0YyxSVENfRkxBR19BTFJBRik7CisgICAgfQorICB9CisgIAorICAvKiBHZXQgdGhlIEFsYXJtQiBpbnRlcnJ1cHQgc291cmNlIGVuYWJsZSBzdGF0dXMgKi8KKyAgaWYoX19IQUxfUlRDX0FMQVJNX0dFVF9JVF9TT1VSQ0UoaHJ0YywgUlRDX0lUX0FMUkIpICE9IFJFU0VUKQorICB7CisgICAgLyogR2V0IHRoZSBwZW5kaW5nIHN0YXR1cyBvZiB0aGUgQWxhcm1CIEludGVycnVwdCAqLworICAgIGlmKF9fSEFMX1JUQ19BTEFSTV9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19BTFJCRikgIT0gUkVTRVQpCisgICAgeworICAgICAgLyogQWxhcm1CIGNhbGxiYWNrICovIAorICAgICAgSEFMX1JUQ0V4X0FsYXJtQkV2ZW50Q2FsbGJhY2soaHJ0Yyk7CisgICAgICAKKyAgICAgIC8qIENsZWFyIHRoZSBBbGFybUIgaW50ZXJydXB0IHBlbmRpbmcgYml0ICovCisgICAgICBfX0hBTF9SVENfQUxBUk1fQ0xFQVJfRkxBRyhocnRjLFJUQ19GTEFHX0FMUkJGKTsKKyAgICB9CisgIH0KKyAgCisgIC8qIENsZWFyIHRoZSBFWFRJJ3MgbGluZSBGbGFnIGZvciBSVEMgQWxhcm0gKi8KKyAgX19IQUxfUlRDX0FMQVJNX0VYVElfQ0xFQVJfRkxBRygpOworICAKKyAgLyogQ2hhbmdlIFJUQyBzdGF0ZSAqLworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7IAorfQorCisvKioKKyAgKiBAYnJpZWYgIEFsYXJtIEEgY2FsbGJhY2suCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9SVENfQWxhcm1BRXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHJ0Yyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9SVENfQWxhcm1BRXZlbnRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBBbGFybUEgUG9sbGluZyByZXF1ZXN0LgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfUG9sbEZvckFsYXJtQUV2ZW50KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lb3V0KQoreyAgCisKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsgICAKKyAgCisgIHdoaWxlKF9fSEFMX1JUQ19BTEFSTV9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19BTFJBRikgPT0gUkVTRVQpCisgIHsKKyAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYoKFRpbWVvdXQgPT0gMFUpIHx8ICgoSEFMX0dldFRpY2soKS10aWNrc3RhcnQpID4gVGltZW91dCkpCisgICAgICB7CisgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9USU1FT1VUOworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisgIAorICAvKiBDbGVhciB0aGUgQWxhcm0gaW50ZXJydXB0IHBlbmRpbmcgYml0ICovCisgIF9fSEFMX1JUQ19BTEFSTV9DTEVBUl9GTEFHKGhydGMsIFJUQ19GTEFHX0FMUkFGKTsKKyAgCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOyAKKyAgCisgIHJldHVybiBIQUxfT0s7ICAKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBAYWRkdG9ncm91cCBSVENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zIAorICogIEBicmllZiAgIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgCisgKgorQHZlcmJhdGltICAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvCisgICAgICAoKykgV2FpdCBmb3IgUlRDIFRpbWUgYW5kIERhdGUgU3luY2hyb25pemF0aW9uCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV2FpdCB1bnRpbCB0aGUgUlRDIFRpbWUgYW5kIERhdGUgcmVnaXN0ZXJzIChSVENfVFIgYW5kIFJUQ19EUikgYXJlCisgICogICAgICAgICBzeW5jaHJvbml6ZWQgd2l0aCBSVEMgQVBCIGNsb2NrLgorICAqIEBub3RlICAgVGhlIFJUQyBSZXN5bmNocm9uaXphdGlvbiBtb2RlIGlzIHdyaXRlIHByb3RlY3RlZCwgdXNlIHRoZSAKKyAgKiAgICAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRSgpIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIAorICAqIEBub3RlICAgVG8gcmVhZCB0aGUgY2FsZW5kYXIgdGhyb3VnaCB0aGUgc2hhZG93IHJlZ2lzdGVycyBhZnRlciBDYWxlbmRhciAKKyAgKiAgICAgICAgIGluaXRpYWxpemF0aW9uLCBjYWxlbmRhciB1cGRhdGUgb3IgYWZ0ZXIgd2FrZXVwIGZyb20gbG93IHBvd2VyIG1vZGVzIAorICAqICAgICAgICAgdGhlIHNvZnR3YXJlIG11c3QgZmlyc3QgY2xlYXIgdGhlIFJTRiBmbGFnLiAKKyAgKiAgICAgICAgIFRoZSBzb2Z0d2FyZSBtdXN0IHRoZW4gd2FpdCB1bnRpbCBpdCBpcyBzZXQgYWdhaW4gYmVmb3JlIHJlYWRpbmcgCisgICogICAgICAgICB0aGUgY2FsZW5kYXIsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGNhbGVuZGFyIHJlZ2lzdGVycyBoYXZlIGJlZW4gCisgICogICAgICAgICBjb3JyZWN0bHkgY29waWVkIGludG8gdGhlIFJUQ19UUiBhbmQgUlRDX0RSIHNoYWRvdyByZWdpc3RlcnMuICAgCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfV2FpdEZvclN5bmNocm8oUlRDX0hhbmRsZVR5cGVEZWYqIGhydGMpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDBVOworCisgIC8qIENsZWFyIFJTRiBmbGFnICovCisgIGhydGMtPkluc3RhbmNlLT5JU1IgJj0gKHVpbnQzMl90KVJUQ19SU0ZfTUFTSzsKKyAgCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCB0aGUgcmVnaXN0ZXJzIHRvIGJlIHN5bmNocm9uaXNlZCAqLworICB3aGlsZSgoaHJ0Yy0+SW5zdGFuY2UtPklTUiAmIFJUQ19JU1JfUlNGKSA9PSAodWludDMyX3QpUkVTRVQpCisgIHsKKyAgICBpZigoSEFMX0dldFRpY2soKS10aWNrc3RhcnQpID4gUlRDX1RJTUVPVVRfVkFMVUUpCisgICAgeyAgICAgICAKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9IAorICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBAYWRkdG9ncm91cCBSVENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNSBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICogIEBicmllZiAgIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zIAorICoKK0B2ZXJiYXRpbSAgIAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8KKyAgICAgICgrKSBHZXQgUlRDIHN0YXRlCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgUlRDIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfUlRDU3RhdGVUeXBlRGVmIEhBTF9SVENfR2V0U3RhdGUoUlRDX0hhbmRsZVR5cGVEZWYqIGhydGMpCit7CisgIC8qIFJldHVybiBSVEMgaGFuZGxlIHN0YXRlICovCisgIHJldHVybiBocnRjLT5TdGF0ZTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBAYWRkdG9ncm91cCBSVENfUHJpdmF0ZV9GdW5jdGlvbnMgUlRDIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyAgICAKKy8qKgorICAqIEBicmllZiAgRW50ZXIgdGhlIFJUQyBJbml0aWFsaXphdGlvbiBtb2RlLgorICAqIEBub3RlICAgVGhlIFJUQyBJbml0aWFsaXphdGlvbiBtb2RlIGlzIHdyaXRlIHByb3RlY3RlZCwgdXNlIHRoZQorICAqICAgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKCkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBIQUxfT0sgOiBSVEMgaXMgaW4gSW5pdCBtb2RlCisgICogICAgICAgICAgLSBIQUxfVElNRU9VVCA6IFJUQyBpcyBub3QgaW4gSW5pdCBtb2RlIGFuZCBpbiBUaW1lb3V0IAorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgUlRDX0VudGVySW5pdE1vZGUoUlRDX0hhbmRsZVR5cGVEZWYqIGhydGMpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDBVOworICAKKyAgLyogQ2hlY2sgaWYgdGhlIEluaXRpYWxpemF0aW9uIG1vZGUgaXMgc2V0ICovCisgIGlmKChocnRjLT5JbnN0YW5jZS0+SVNSICYgUlRDX0lTUl9JTklURikgPT0gKHVpbnQzMl90KVJFU0VUKQorICB7CisgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBtb2RlICovCisgICAgaHJ0Yy0+SW5zdGFuY2UtPklTUiA9ICh1aW50MzJfdClSVENfSU5JVF9NQVNLOworICAgIAorICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgICAgLyogV2FpdCB0aWxsIFJUQyBpcyBpbiBJTklUIHN0YXRlIGFuZCBpZiBUaW1lIG91dCBpcyByZWFjaGVkIGV4aXQgKi8KKyAgICB3aGlsZSgoaHJ0Yy0+SW5zdGFuY2UtPklTUiAmIFJUQ19JU1JfSU5JVEYpID09ICh1aW50MzJfdClSRVNFVCkKKyAgICB7CisgICAgICBpZigoSEFMX0dldFRpY2soKS10aWNrc3RhcnQpID4gUlRDX1RJTUVPVVRfVkFMVUUpCisgICAgICB7ICAgICAgIAorICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9IAorICAgIH0KKyAgfQorICAKKyAgcmV0dXJuIEhBTF9PSzsgIAorfQorCisKKy8qKgorICAqIEBicmllZiAgQ29udmVydCBhIDIgZGlnaXQgZGVjaW1hbCB0byBCQ0QgZm9ybWF0LgorICAqIEBwYXJhbSAgVmFsdWUgQnl0ZSB0byBiZSBjb252ZXJ0ZWQKKyAgKiBAcmV0dmFsIENvbnZlcnRlZCBieXRlCisgICovCit1aW50OF90IFJUQ19CeXRlVG9CY2QyKHVpbnQ4X3QgVmFsdWUpCit7CisgIHVpbnQzMl90IGJjZGhpZ2ggPSAwVTsKKyAgCisgIHdoaWxlKFZhbHVlID49IDEwVSkKKyAgeworICAgIGJjZGhpZ2grKzsKKyAgICBWYWx1ZSAtPSAxMFU7CisgIH0KKyAgCisgIHJldHVybiAgKCh1aW50OF90KShiY2RoaWdoIDw8IDRVKSB8IFZhbHVlKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb252ZXJ0IGZyb20gMiBkaWdpdCBCQ0QgdG8gQmluYXJ5LgorICAqIEBwYXJhbSAgVmFsdWUgQkNEIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICAqIEByZXR2YWwgQ29udmVydGVkIHdvcmQKKyAgKi8KK3VpbnQ4X3QgUlRDX0JjZDJUb0J5dGUodWludDhfdCBWYWx1ZSkKK3sKKyAgdWludDMyX3QgdG1wID0gMFU7CisgIHRtcCA9ICgodWludDhfdCkoVmFsdWUgJiAodWludDhfdCkweEYwVSkgPj4gKHVpbnQ4X3QpMHg0VSkgKiAxMFU7CisgIHJldHVybiAodG1wICsgKFZhbHVlICYgKHVpbnQ4X3QpMHgwRlUpKTsKK30KKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfUlRDX01PRFVMRV9FTkFCTEVEICovCisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmYzeHhfaGFsX3J0Y19leC5jIGIvU3JjL3N0bTMyZjN4eF9oYWxfcnRjX2V4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ3Mjc3YwotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfaGFsX3J0Y19leC5jCkBAIC0wLDAgKzEsMTY0OCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfcnRjX2V4LmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEV4dGVuZGVkIFJUQyBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nIAorICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgUmVhbCBUaW1lIENsb2NrIChSVEMpIEV4dGVuZGVkIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgUlRDIFRpbWUgU3RhbXAgZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUlRDIFRhbXBlciBmdW5jdGlvbnMgCisgICogICAgICAgICAgICsgUlRDIFdha2UtdXAgZnVuY3Rpb25zCisgICogICAgICAgICAgICsgRXh0ZW5kZWQgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBFeHRlbmRlZCBSVEMgZmVhdHVyZXMgZnVuY3Rpb25zICAgIAorICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0gCisgICAgKCspIEVuYWJsZSB0aGUgUlRDIGRvbWFpbiBhY2Nlc3MuCisgICAgKCspIENvbmZpZ3VyZSB0aGUgUlRDIFByZXNjYWxlciAoQXN5bmNocm9ub3VzIGFuZCBTeW5jaHJvbm91cykgYW5kIFJUQyBob3VyIAorICAgICAgICBmb3JtYXQgdXNpbmcgdGhlIEhBTF9SVENfSW5pdCgpIGZ1bmN0aW9uLgorICAKKyAgKioqIFJUQyBXYWtldXAgY29uZmlndXJhdGlvbiAqKioKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXSAKKyAgICAoKykgVG8gY29uZmlndXJlIHRoZSBSVEMgV2FrZXVwIENsb2NrIHNvdXJjZSBhbmQgQ291bnRlciB1c2UgdGhlIEhBTF9SVENFeF9TZXRXYWtlVXBUaW1lcigpCisgICAgICAgIGZ1bmN0aW9uLiBZb3UgY2FuIGFsc28gY29uZmlndXJlIHRoZSBSVEMgV2FrZXVwIHRpbWVyIHdpdGggaW50ZXJydXB0IG1vZGUgCisgICAgICAgIHVzaW5nIHRoZSBIQUxfUlRDRXhfU2V0V2FrZVVwVGltZXJfSVQoKSBmdW5jdGlvbi4KKyAgICAoKykgVG8gcmVhZCB0aGUgUlRDIFdha2VVcCBDb3VudGVyIHJlZ2lzdGVyLCB1c2UgdGhlIEhBTF9SVENFeF9HZXRXYWtlVXBUaW1lcigpCisgICAgICAgIGZ1bmN0aW9uLgorICAKKyAgKioqIFRpbWVTdGFtcCBjb25maWd1cmF0aW9uICoqKgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICAgICAgKCspIENvbmZpZ3VyZSB0aGUgUlRDX0FGIHRyaWdnZXIgYW5kIGVuYWJsZSB0aGUgUlRDIFRpbWVTdGFtcCB1c2luZyB0aGUgCisgICAgICAgIEhBTF9SVENFeF9TZXRUaW1lU3RhbXAoKSBmdW5jdGlvbi4gWW91IGNhbiBhbHNvIGNvbmZpZ3VyZSB0aGUgUlRDIFRpbWVTdGFtcCB3aXRoCisgICAgICAgIGludGVycnVwdCBtb2RlIHVzaW5nIHRoZSBIQUxfUlRDRXhfU2V0VGltZVN0YW1wX0lUKCkgZnVuY3Rpb24uCisgICAgKCspIFRvIHJlYWQgdGhlIFJUQyBUaW1lU3RhbXAgVGltZSBhbmQgRGF0ZSByZWdpc3RlciwgdXNlIHRoZSBIQUxfUlRDRXhfR2V0VGltZVN0YW1wKCkKKyAgICAgICAgZnVuY3Rpb24uCisgICAgKCspIFRoZSBUSU1FU1RBTVAgYWx0ZXJuYXRlIGZ1bmN0aW9uIGlzIG1hcHBlZCB0byBSVENfQUYxIChQQzEzVSkuCisgIAorICAqKiogVGFtcGVyIGNvbmZpZ3VyYXRpb24gKioqCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgICAgICAoKykgRW5hYmxlIHRoZSBSVEMgVGFtcGVyIGFuZCBjb25maWd1cmUgdGhlIFRhbXBlciBmaWx0ZXIgY291bnQsIHRyaWdnZXIgRWRnZSAKKyAgICAgICAgb3IgTGV2ZWwgYWNjb3JkaW5nIHRvIHRoZSBUYW1wZXIgZmlsdGVyIChpZiBlcXVhbCB0byAwIEVkZ2UgZWxzZSBMZXZlbCkgCisgICAgICAgIHZhbHVlLCBzYW1wbGluZyBmcmVxdWVuY3ksIHByZWNoYXJnZSBvciBkaXNjaGFyZ2UgYW5kIFB1bGwtVVAgdXNpbmcgdGhlIAorICAgICAgICBIQUxfUlRDRXhfU2V0VGFtcGVyKCkgZnVuY3Rpb24uIFlvdSBjYW4gY29uZmlndXJlIFJUQyBUYW1wZXIgd2l0aCBpbnRlcnJ1cHQKKyAgICAgICAgbW9kZSB1c2luZyBIQUxfUlRDRXhfU2V0VGFtcGVyX0lUKCkgZnVuY3Rpb24uCisgICAgKCspIFRoZSBUQU1QRVIxIGFsdGVybmF0ZSBmdW5jdGlvbiBpcyBtYXBwZWQgdG8gUlRDX0FGMSAoUEMxM1UpLgorCisgICoqKiBCYWNrdXAgRGF0YSBSZWdpc3RlcnMgY29uZmlndXJhdGlvbiAqKioKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgKCspIFRvIHdyaXRlIHRvIHRoZSBSVEMgQmFja3VwIERhdGEgcmVnaXN0ZXJzLCB1c2UgdGhlIEhBTF9SVENFeF9CS1VQV3JpdGUoKQorICAgICAgICBmdW5jdGlvbi4gIAorICAgICgrKSBUbyByZWFkIHRoZSBSVEMgQmFja3VwIERhdGEgcmVnaXN0ZXJzLCB1c2UgdGhlIEhBTF9SVENFeF9CS1VQUmVhZCgpCisgICAgICAgIGZ1bmN0aW9uLgorICAgICAKKyAgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIAorICAqLyAKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKworCisvKiogQGFkZHRvZ3JvdXAgUlRDRXgKKyAgKiBAYnJpZWYgUlRDIEV4dGVuZGVkIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9SVENfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBhZGR0b2dyb3VwIFJUQ0V4X0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisgIAorCisvKiogQGFkZHRvZ3JvdXAgUlRDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICogIEBicmllZiAgIFJUQyBUaW1lU3RhbXAgYW5kIFRhbXBlciBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0gICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICMjIyMjIFJUQyBUaW1lU3RhbXAgYW5kIFRhbXBlciBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAKKyBbLi5dIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gY29uZmlndXJlIFRpbWVTdGFtcCBmZWF0dXJlCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IFRpbWVTdGFtcC4KKyAgKiBAbm90ZSAgIFRoaXMgQVBJIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBlbmFibGluZyB0aGUgVGltZVN0YW1wIGZlYXR1cmUuIAorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBUaW1lU3RhbXBFZGdlIFNwZWNpZmllcyB0aGUgcGluIGVkZ2Ugb24gd2hpY2ggdGhlIFRpbWVTdGFtcCBpcworICAqICAgICAgICAgYWN0aXZhdGVkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgQGFyZyBSVENfVElNRVNUQU1QRURHRV9SSVNJTkc6IHRoZSBUaW1lIHN0YW1wIGV2ZW50IG9jY3VycyBvbiB0aGUgIAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpc2luZyBlZGdlIG9mIHRoZSByZWxhdGVkIHBpbi4KKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19USU1FU1RBTVBFREdFX0ZBTExJTkc6IHRoZSBUaW1lIHN0YW1wIGV2ZW50IG9jY3VycyBvbiB0aGUgCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxpbmcgZWRnZSBvZiB0aGUgcmVsYXRlZCBwaW4uCisgICogQHBhcmFtICBSVENfVGltZVN0YW1wUGluIHNwZWNpZmllcyB0aGUgUlRDIFRpbWVTdGFtcCBQaW4uCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19USU1FU1RBTVBQSU5fREVGQVVMVDogUEMxMyBpcyBzZWxlY3RlZCBhcyBSVEMgVGltZVN0YW1wIFBpbi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRUaW1lU3RhbXAoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IFRpbWVTdGFtcEVkZ2UsIHVpbnQzMl90IFJUQ19UaW1lU3RhbXBQaW4pCit7CisgIHVpbnQzMl90IHRtcHJlZyA9IDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1FU1RBTVBfRURHRShUaW1lU3RhbXBFZGdlKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfVElNRVNUQU1QX1BJTihSVENfVGltZVN0YW1wUGluKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICAvKiBHZXQgdGhlIFJUQ19DUiByZWdpc3RlciBhbmQgY2xlYXIgdGhlIGJpdHMgdG8gYmUgY29uZmlndXJlZCAqLworICB0bXByZWcgPSAodWludDMyX3QpKGhydGMtPkluc3RhbmNlLT5DUiAmICh1aW50MzJfdCl+KFJUQ19DUl9UU0VER0UgfCBSVENfQ1JfVFNFKSk7CisKKyAgdG1wcmVnfD0gVGltZVN0YW1wRWRnZTsKKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKworICAvKiBDb25maWd1cmUgdGhlIFRpbWUgU3RhbXAgVFNFREdFIGFuZCBFbmFibGUgYml0cyAqLworICBocnRjLT5JbnN0YW5jZS0+Q1IgPSAodWludDMyX3QpdG1wcmVnOworCisgIF9fSEFMX1JUQ19USU1FU1RBTVBfRU5BQkxFKGhydGMpOworCisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAvKiBDaGFuZ2UgUlRDIHN0YXRlICovCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBUaW1lU3RhbXAgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAbm90ZSAgIFRoaXMgQVBJIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBlbmFibGluZyB0aGUgVGltZVN0YW1wIGZlYXR1cmUuCisgICogQHBhcmFtICBUaW1lU3RhbXBFZGdlIFNwZWNpZmllcyB0aGUgcGluIGVkZ2Ugb24gd2hpY2ggdGhlIFRpbWVTdGFtcCBpcyAKKyAgKiAgICAgICAgIGFjdGl2YXRlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX1RJTUVTVEFNUEVER0VfUklTSU5HOiB0aGUgVGltZSBzdGFtcCBldmVudCBvY2N1cnMgb24gdGhlICAKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaXNpbmcgZWRnZSBvZiB0aGUgcmVsYXRlZCBwaW4uCisgICogICAgICAgICAgICAgQGFyZyBSVENfVElNRVNUQU1QRURHRV9GQUxMSU5HOiB0aGUgVGltZSBzdGFtcCBldmVudCBvY2N1cnMgb24gdGhlIAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxsaW5nIGVkZ2Ugb2YgdGhlIHJlbGF0ZWQgcGluLgorICAqIEBwYXJhbSAgUlRDX1RpbWVTdGFtcFBpbiBTcGVjaWZpZXMgdGhlIFJUQyBUaW1lU3RhbXAgUGluLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgQGFyZyBSVENfVElNRVNUQU1QUElOX0RFRkFVTFQ6IFBDMTMgaXMgc2VsZWN0ZWQgYXMgUlRDIFRpbWVTdGFtcCBQaW4uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0VGltZVN0YW1wX0lUKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lU3RhbXBFZGdlLCB1aW50MzJfdCBSVENfVGltZVN0YW1wUGluKQoreworICB1aW50MzJfdCB0bXByZWcgPSAwVTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNRVNUQU1QX0VER0UoVGltZVN0YW1wRWRnZSkpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1RJTUVTVEFNUF9QSU4oUlRDX1RpbWVTdGFtcFBpbikpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovIAorICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIEdldCB0aGUgUlRDX0NSIHJlZ2lzdGVyIGFuZCBjbGVhciB0aGUgYml0cyB0byBiZSBjb25maWd1cmVkICovCisgIHRtcHJlZyA9ICh1aW50MzJfdCkoaHJ0Yy0+SW5zdGFuY2UtPkNSICYgKHVpbnQzMl90KX4oUlRDX0NSX1RTRURHRSB8IFJUQ19DUl9UU0UpKTsKKworICB0bXByZWcgfD0gVGltZVN0YW1wRWRnZTsKKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKworICAvKiBDb25maWd1cmUgdGhlIFRpbWUgU3RhbXAgVFNFREdFIGFuZCBFbmFibGUgYml0cyAqLworICBocnRjLT5JbnN0YW5jZS0+Q1IgPSAodWludDMyX3QpdG1wcmVnOworCisgIF9fSEFMX1JUQ19USU1FU1RBTVBfRU5BQkxFKGhydGMpOworCisgIC8qIEVuYWJsZSBJVCB0aW1lc3RhbXAgKi8KKyAgX19IQUxfUlRDX1RJTUVTVEFNUF9FTkFCTEVfSVQoaHJ0YyxSVENfSVRfVFMpOworCisgIC8qIFJUQyB0aW1lc3RhbXAgSW50ZXJydXB0IENvbmZpZ3VyYXRpb246IEVYVEkgY29uZmlndXJhdGlvbiAqLworICBfX0hBTF9SVENfVEFNUEVSX1RJTUVTVEFNUF9FWFRJX0VOQUJMRV9JVCgpOworCisgIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlYWN0aXZhdGUgVGltZVN0YW1wLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfRGVhY3RpdmF0ZVRpbWVTdGFtcChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgdWludDMyX3QgdG1wcmVnID0gMFU7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKworICAvKiBJbiBjYXNlIG9mIGludGVycnVwdCBtb2RlIGlzIHVzZWQsIHRoZSBpbnRlcnJ1cHQgc291cmNlIG11c3QgZGlzYWJsZWQgKi8KKyAgX19IQUxfUlRDX1RJTUVTVEFNUF9ESVNBQkxFX0lUKGhydGMsIFJUQ19JVF9UUyk7CisKKyAgLyogR2V0IHRoZSBSVENfQ1IgcmVnaXN0ZXIgYW5kIGNsZWFyIHRoZSBiaXRzIHRvIGJlIGNvbmZpZ3VyZWQgKi8KKyAgdG1wcmVnID0gKHVpbnQzMl90KShocnRjLT5JbnN0YW5jZS0+Q1IgJiAodWludDMyX3QpfihSVENfQ1JfVFNFREdFIHwgUlRDX0NSX1RTRSkpOworCisgIC8qIENvbmZpZ3VyZSB0aGUgVGltZSBTdGFtcCBUU0VER0UgYW5kIEVuYWJsZSBiaXRzICovCisgIGhydGMtPkluc3RhbmNlLT5DUiA9ICh1aW50MzJfdCl0bXByZWc7CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgUlRDIFRpbWVTdGFtcCB2YWx1ZS4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSAgc1RpbWVTdGFtcCBQb2ludGVyIHRvIFRpbWUgc3RydWN0dXJlCisgICogQHBhcmFtICBzVGltZVN0YW1wRGF0ZSBQb2ludGVyIHRvIERhdGUgc3RydWN0dXJlICAKKyAgKiBAcGFyYW0gIEZvcm1hdCBzcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiB0aGUgZW50ZXJlZCBwYXJhbWV0ZXJzLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgQGFyZyBSVENfRk9STUFUX0JJTjogQmluYXJ5IGRhdGEgZm9ybWF0IAorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZPUk1BVF9CQ0Q6IEJDRCBkYXRhIGZvcm1hdAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X0dldFRpbWVTdGFtcChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgUlRDX1RpbWVUeXBlRGVmKiBzVGltZVN0YW1wLCBSVENfRGF0ZVR5cGVEZWYqIHNUaW1lU3RhbXBEYXRlLCB1aW50MzJfdCBGb3JtYXQpCit7CisgIHVpbnQzMl90IHRtcHRpbWUgPSAwVSwgdG1wZGF0ZSA9IDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfRk9STUFUKEZvcm1hdCkpOworCisgIC8qIEdldCB0aGUgVGltZVN0YW1wIHRpbWUgYW5kIGRhdGUgcmVnaXN0ZXJzIHZhbHVlcyAqLworICB0bXB0aW1lID0gKHVpbnQzMl90KShocnRjLT5JbnN0YW5jZS0+VFNUUiAmIFJUQ19UUl9SRVNFUlZFRF9NQVNLKTsKKyAgdG1wZGF0ZSA9ICh1aW50MzJfdCkoaHJ0Yy0+SW5zdGFuY2UtPlRTRFIgJiBSVENfRFJfUkVTRVJWRURfTUFTSyk7CisKKyAgLyogRmlsbCB0aGUgVGltZSBzdHJ1Y3R1cmUgZmllbGRzIHdpdGggdGhlIHJlYWQgcGFyYW1ldGVycyAqLworICBzVGltZVN0YW1wLT5Ib3VycyA9ICh1aW50OF90KSgodG1wdGltZSAmIChSVENfVFJfSFQgfCBSVENfVFJfSFUpKSA+PiAxNlUpOworICBzVGltZVN0YW1wLT5NaW51dGVzID0gKHVpbnQ4X3QpKCh0bXB0aW1lICYgKFJUQ19UUl9NTlQgfCBSVENfVFJfTU5VKSkgPj4gOFUpOworICBzVGltZVN0YW1wLT5TZWNvbmRzID0gKHVpbnQ4X3QpKHRtcHRpbWUgJiAoUlRDX1RSX1NUIHwgUlRDX1RSX1NVKSk7CisgIHNUaW1lU3RhbXAtPlRpbWVGb3JtYXQgPSAodWludDhfdCkoKHRtcHRpbWUgJiAoUlRDX1RSX1BNKSkgPj4gMTZVKTsKKyAgc1RpbWVTdGFtcC0+U3ViU2Vjb25kcyA9ICh1aW50MzJfdCkgaHJ0Yy0+SW5zdGFuY2UtPlRTU1NSOworCisgIC8qIEZpbGwgdGhlIERhdGUgc3RydWN0dXJlIGZpZWxkcyB3aXRoIHRoZSByZWFkIHBhcmFtZXRlcnMgKi8KKyAgc1RpbWVTdGFtcERhdGUtPlllYXIgPSAwVTsKKyAgc1RpbWVTdGFtcERhdGUtPk1vbnRoID0gKHVpbnQ4X3QpKCh0bXBkYXRlICYgKFJUQ19EUl9NVCB8IFJUQ19EUl9NVSkpID4+IDhVKTsKKyAgc1RpbWVTdGFtcERhdGUtPkRhdGUgPSAodWludDhfdCkodG1wZGF0ZSAmIChSVENfRFJfRFQgfCBSVENfRFJfRFUpKTsKKyAgc1RpbWVTdGFtcERhdGUtPldlZWtEYXkgPSAodWludDhfdCkoKHRtcGRhdGUgJiAoUlRDX0RSX1dEVSkpID4+IDEzVSk7CisKKyAgLyogQ2hlY2sgdGhlIGlucHV0IHBhcmFtZXRlcnMgZm9ybWF0ICovCisgIGlmKEZvcm1hdCA9PSBSVENfRk9STUFUX0JJTikKKyAgeworICAgIC8qIENvbnZlcnQgdGhlIFRpbWVTdGFtcCBzdHJ1Y3R1cmUgcGFyYW1ldGVycyB0byBCaW5hcnkgZm9ybWF0ICovCisgICAgc1RpbWVTdGFtcC0+SG91cnMgPSAodWludDhfdClSVENfQmNkMlRvQnl0ZShzVGltZVN0YW1wLT5Ib3Vycyk7CisgICAgc1RpbWVTdGFtcC0+TWludXRlcyA9ICh1aW50OF90KVJUQ19CY2QyVG9CeXRlKHNUaW1lU3RhbXAtPk1pbnV0ZXMpOworICAgIHNUaW1lU3RhbXAtPlNlY29uZHMgPSAodWludDhfdClSVENfQmNkMlRvQnl0ZShzVGltZVN0YW1wLT5TZWNvbmRzKTsKKworICAgIC8qIENvbnZlcnQgdGhlIERhdGVUaW1lU3RhbXAgc3RydWN0dXJlIHBhcmFtZXRlcnMgdG8gQmluYXJ5IGZvcm1hdCAqLworICAgIHNUaW1lU3RhbXBEYXRlLT5Nb250aCA9ICh1aW50OF90KVJUQ19CY2QyVG9CeXRlKHNUaW1lU3RhbXBEYXRlLT5Nb250aCk7CisgICAgc1RpbWVTdGFtcERhdGUtPkRhdGUgPSAodWludDhfdClSVENfQmNkMlRvQnl0ZShzVGltZVN0YW1wRGF0ZS0+RGF0ZSk7CisgICAgc1RpbWVTdGFtcERhdGUtPldlZWtEYXkgPSAodWludDhfdClSVENfQmNkMlRvQnl0ZShzVGltZVN0YW1wRGF0ZS0+V2Vla0RheSk7CisgIH0KKworICAvKiBDbGVhciB0aGUgVElNRVNUQU1QIEZsYWcgKi8KKyAgX19IQUxfUlRDX1RJTUVTVEFNUF9DTEVBUl9GTEFHKGhydGMsIFJUQ19GTEFHX1RTRik7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgVGFtcGVyCisgICogQG5vdGUgICBCeSBjYWxsaW5nIHRoaXMgQVBJIHdlIGRpc2FibGUgdGhlIHRhbXBlciBpbnRlcnJ1cHQgZm9yIGFsbCB0YW1wZXJzLiAKKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSAgc1RhbXBlciBQb2ludGVyIHRvIFRhbXBlciBTdHJ1Y3R1cmUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0VGFtcGVyKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfVGFtcGVyVHlwZURlZiogc1RhbXBlcikKK3sKKyAgdWludDMyX3QgdG1wcmVnID0gMFU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19UQU1QRVIoc1RhbXBlci0+VGFtcGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfVEFNUEVSX1RSSUdHRVIoc1RhbXBlci0+VHJpZ2dlcikpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1RBTVBFUl9GSUxURVIoc1RhbXBlci0+RmlsdGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfVEFNUEVSX1NBTVBMSU5HX0ZSRVEoc1RhbXBlci0+U2FtcGxpbmdGcmVxdWVuY3kpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19UQU1QRVJfUFJFQ0hBUkdFX0RVUkFUSU9OKHNUYW1wZXItPlByZWNoYXJnZUR1cmF0aW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfVEFNUEVSX1BVTExVUF9TVEFURShzVGFtcGVyLT5UYW1wZXJQdWxsVXApKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19UQU1QRVJfVElNRVNUQU1QT05UQU1QRVJfREVURUNUSU9OKHNUYW1wZXItPlRpbWVTdGFtcE9uVGFtcGVyRGV0ZWN0aW9uKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICBpZihzVGFtcGVyLT5UcmlnZ2VyICE9IFJUQ19UQU1QRVJUUklHR0VSX1JJU0lOR0VER0UpCisgIHsKKyAgICBzVGFtcGVyLT5UcmlnZ2VyID0gKHVpbnQzMl90KShzVGFtcGVyLT5UYW1wZXIgPDwgMVUpOworICB9CisKKyAgdG1wcmVnID0gKCh1aW50MzJfdClzVGFtcGVyLT5UYW1wZXIgfCAodWludDMyX3Qpc1RhbXBlci0+VHJpZ2dlciB8ICh1aW50MzJfdClzVGFtcGVyLT5GaWx0ZXIgfFwKKyAgICAgICAgICAgICh1aW50MzJfdClzVGFtcGVyLT5TYW1wbGluZ0ZyZXF1ZW5jeSB8ICh1aW50MzJfdClzVGFtcGVyLT5QcmVjaGFyZ2VEdXJhdGlvbiB8XAorICAgICAgICAgICAgKHVpbnQzMl90KXNUYW1wZXItPlRhbXBlclB1bGxVcCB8IHNUYW1wZXItPlRpbWVTdGFtcE9uVGFtcGVyRGV0ZWN0aW9uKTsKKworICBocnRjLT5JbnN0YW5jZS0+VEFGQ1IgJj0gKHVpbnQzMl90KX4oKHVpbnQzMl90KXNUYW1wZXItPlRhbXBlciB8ICh1aW50MzJfdCkoc1RhbXBlci0+VGFtcGVyIDw8IDFVKSB8ICh1aW50MzJfdClSVENfVEFGQ1JfVEFNUFRTIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpUlRDX1RBRkNSX1RBTVBGUkVRIHwgKHVpbnQzMl90KVJUQ19UQUZDUl9UQU1QRkxUIHwgKHVpbnQzMl90KVJUQ19UQUZDUl9UQU1QUFJDSCB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KVJUQ19UQUZDUl9UQU1QUFVESVMgfCAodWludDMyX3QpUlRDX1RBRkNSX1RBTVBJRSk7CisKKyAgaHJ0Yy0+SW5zdGFuY2UtPlRBRkNSIHw9IHRtcHJlZzsKKyAgCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsgCisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgVGFtcGVyIHdpdGggaW50ZXJydXB0LgorICAqIEBub3RlICAgQnkgY2FsbGluZyB0aGlzIEFQSSB3ZSBmb3JjZSB0aGUgdGFtcGVyIGludGVycnVwdCBmb3IgYWxsIHRhbXBlcnMuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcGFyYW0gIHNUYW1wZXIgUG9pbnRlciB0byBSVEMgVGFtcGVyLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1NldFRhbXBlcl9JVChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgUlRDX1RhbXBlclR5cGVEZWYqIHNUYW1wZXIpCit7CisgIHVpbnQzMl90IHRtcHJlZyA9IDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfVEFNUEVSKHNUYW1wZXItPlRhbXBlcikpOyAKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19UQU1QRVJfVFJJR0dFUihzVGFtcGVyLT5UcmlnZ2VyKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfVEFNUEVSX0ZJTFRFUihzVGFtcGVyLT5GaWx0ZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19UQU1QRVJfU0FNUExJTkdfRlJFUShzVGFtcGVyLT5TYW1wbGluZ0ZyZXF1ZW5jeSkpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1RBTVBFUl9QUkVDSEFSR0VfRFVSQVRJT04oc1RhbXBlci0+UHJlY2hhcmdlRHVyYXRpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19UQU1QRVJfUFVMTFVQX1NUQVRFKHNUYW1wZXItPlRhbXBlclB1bGxVcCkpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1RBTVBFUl9USU1FU1RBTVBPTlRBTVBFUl9ERVRFQ1RJT04oc1RhbXBlci0+VGltZVN0YW1wT25UYW1wZXJEZXRlY3Rpb24pKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIENvbmZpZ3VyZSB0aGUgdGFtcGVyIHRyaWdnZXIgKi8KKyAgaWYoc1RhbXBlci0+VHJpZ2dlciAhPSBSVENfVEFNUEVSVFJJR0dFUl9SSVNJTkdFREdFKQorICB7CisgICAgc1RhbXBlci0+VHJpZ2dlciA9ICh1aW50MzJfdCkgKHNUYW1wZXItPlRhbXBlcjw8MVUpOworICB9CisKKyAgdG1wcmVnID0gKCh1aW50MzJfdClzVGFtcGVyLT5UYW1wZXIgfCAodWludDMyX3Qpc1RhbXBlci0+VHJpZ2dlciB8ICh1aW50MzJfdClzVGFtcGVyLT5GaWx0ZXIgfFwKKyAgICAgICAgICAgICh1aW50MzJfdClzVGFtcGVyLT5TYW1wbGluZ0ZyZXF1ZW5jeSB8ICh1aW50MzJfdClzVGFtcGVyLT5QcmVjaGFyZ2VEdXJhdGlvbiB8XAorICAgICAgICAgICAgKHVpbnQzMl90KXNUYW1wZXItPlRhbXBlclB1bGxVcCB8IHNUYW1wZXItPlRpbWVTdGFtcE9uVGFtcGVyRGV0ZWN0aW9uKTsKKworICBocnRjLT5JbnN0YW5jZS0+VEFGQ1IgJj0gKHVpbnQzMl90KX4oKHVpbnQzMl90KXNUYW1wZXItPlRhbXBlciB8ICh1aW50MzJfdCkoc1RhbXBlci0+VGFtcGVyIDw8IDFVKSB8ICh1aW50MzJfdClSVENfVEFGQ1JfVEFNUFRTIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpUlRDX1RBRkNSX1RBTVBGUkVRIHwgKHVpbnQzMl90KVJUQ19UQUZDUl9UQU1QRkxUIHwgKHVpbnQzMl90KVJUQ19UQUZDUl9UQU1QUFJDSCB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KVJUQ19UQUZDUl9UQU1QUFVESVMpOworCisgIGhydGMtPkluc3RhbmNlLT5UQUZDUiB8PSB0bXByZWc7CisKKyAgLyogQ29uZmlndXJlIHRoZSBUYW1wZXIgSW50ZXJydXB0IGluIHRoZSBSVENfVEFGQ1IgKi8KKyAgaHJ0Yy0+SW5zdGFuY2UtPlRBRkNSIHw9ICh1aW50MzJfdClSVENfVEFGQ1JfVEFNUElFOworCisgIC8qIFJUQyBUYW1wZXIgSW50ZXJydXB0IENvbmZpZ3VyYXRpb246IEVYVEkgY29uZmlndXJhdGlvbiAqLworICBfX0hBTF9SVENfVEFNUEVSX1RJTUVTVEFNUF9FWFRJX0VOQUJMRV9JVCgpOworICAKKyAgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZWFjdGl2YXRlIFRhbXBlci4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSAgVGFtcGVyIFNlbGVjdGVkIHRhbXBlciBwaW4uCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBSVENfVEFNUEVSXzEsIFJUQ19UQU1QRVJfMiBhbmQgUlRDX1RBTVBFUl8zICgqKQorICAqIEBub3RlICAgKCopIFJUQ19UQU1QRVJfMyBub3QgcHJlc2VudCBvbiBhbGwgdGhlIGRldmljZXMKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9EZWFjdGl2YXRlVGFtcGVyKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUYW1wZXIpCit7CisgIGFzc2VydF9wYXJhbShJU19SVENfVEFNUEVSKFRhbXBlcikpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgVGFtcGVyIHBpbiAqLworICBocnRjLT5JbnN0YW5jZS0+VEFGQ1IgJj0gKHVpbnQzMl90KX5UYW1wZXI7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIFRpbWVTdGFtcCBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUlRDRXhfVGFtcGVyVGltZVN0YW1wSVJRSGFuZGxlcihSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sgIAorICAvKiBHZXQgdGhlIFRpbWVTdGFtcCBpbnRlcnJ1cHQgc291cmNlIGVuYWJsZSBzdGF0dXMgKi8KKyAgaWYoX19IQUxfUlRDX1RJTUVTVEFNUF9HRVRfSVRfU09VUkNFKGhydGMsIFJUQ19JVF9UUykgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBHZXQgdGhlIHBlbmRpbmcgc3RhdHVzIG9mIHRoZSBUSU1FU1RBTVAgSW50ZXJydXB0ICovCisgICAgaWYoX19IQUxfUlRDX1RJTUVTVEFNUF9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19UU0YpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIC8qIFRJTUVTVEFNUCBjYWxsYmFjayAqLyAKKyAgICAgIEhBTF9SVENFeF9UaW1lU3RhbXBFdmVudENhbGxiYWNrKGhydGMpOworICAKKyAgICAgIC8qIENsZWFyIHRoZSBUSU1FU1RBTVAgaW50ZXJydXB0IHBlbmRpbmcgYml0ICovCisgICAgICBfX0hBTF9SVENfVElNRVNUQU1QX0NMRUFSX0ZMQUcoaHJ0YyxSVENfRkxBR19UU0YpOworICAgIH0KKyAgfQorCisgIC8qIEdldCB0aGUgVGFtcGVyIGludGVycnVwdHMgc291cmNlIGVuYWJsZSBzdGF0dXMgKi8KKyAgaWYoX19IQUxfUlRDX1RBTVBFUl9HRVRfSVRfU09VUkNFKGhydGMsIFJUQ19JVF9UQU1QKSkKKyAgeworICAgLyogR2V0IHRoZSBwZW5kaW5nIHN0YXR1cyBvZiB0aGUgVGFtcGVyMSBJbnRlcnJ1cHQgKi8KKyAgICBpZihfX0hBTF9SVENfVEFNUEVSX0dFVF9GTEFHKGhydGMsIFJUQ19GTEFHX1RBTVAxRikgIT0gUkVTRVQpCisgICAgeworICAgICAgLyogVGFtcGVyMSBjYWxsYmFjayAqLyAKKyAgICAgIEhBTF9SVENFeF9UYW1wZXIxRXZlbnRDYWxsYmFjayhocnRjKTsKKyAgCisgICAgICAvKiBDbGVhciB0aGUgVGFtcGVyMSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgKi8KKyAgICAgIF9fSEFMX1JUQ19UQU1QRVJfQ0xFQVJfRkxBRyhocnRjLFJUQ19GTEFHX1RBTVAxRik7CisgICAgfQorICB9CisKKyAgLyogR2V0IHRoZSBUYW1wZXIgaW50ZXJydXB0cyBzb3VyY2UgZW5hYmxlIHN0YXR1cyAqLworICBpZihfX0hBTF9SVENfVEFNUEVSX0dFVF9JVF9TT1VSQ0UoaHJ0YywgUlRDX0lUX1RBTVApKQorICB7CisgICAvKiBHZXQgdGhlIHBlbmRpbmcgc3RhdHVzIG9mIHRoZSBUYW1wZXIyIEludGVycnVwdCAqLworICAgIGlmKF9fSEFMX1JUQ19UQU1QRVJfR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfVEFNUDJGKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICAvKiBUYW1wZXIyIGNhbGxiYWNrICovIAorICAgICAgSEFMX1JUQ0V4X1RhbXBlcjJFdmVudENhbGxiYWNrKGhydGMpOworICAKKyAgICAgIC8qIENsZWFyIHRoZSBUYW1wZXIyIGludGVycnVwdCBwZW5kaW5nIGJpdCAqLworICAgICAgX19IQUxfUlRDX1RBTVBFUl9DTEVBUl9GTEFHKGhydGMsIFJUQ19GTEFHX1RBTVAyRik7CisgICAgfQorICB9CisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisgIC8qIEdldCB0aGUgVGFtcGVyIGludGVycnVwdHMgc291cmNlIGVuYWJsZSBzdGF0dXMgKi8KKyAgaWYoX19IQUxfUlRDX1RBTVBFUl9HRVRfSVRfU09VUkNFKGhydGMsIFJUQ19JVF9UQU1QKSkKKyAgeworICAgLyogR2V0IHRoZSBwZW5kaW5nIHN0YXR1cyBvZiB0aGUgVGFtcGVyMyBJbnRlcnJ1cHQgKi8KKyAgICBpZihfX0hBTF9SVENfVEFNUEVSX0dFVF9GTEFHKGhydGMsIFJUQ19GTEFHX1RBTVAzRikgIT0gUkVTRVQpCisgICAgeworICAgICAgLyogVGFtcGVyMyBjYWxsYmFjayAqLworICAgICAgSEFMX1JUQ0V4X1RhbXBlcjNFdmVudENhbGxiYWNrKGhydGMpOworCisgICAgICAvKiBDbGVhciB0aGUgVGFtcGVyMyBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgKi8KKyAgICAgIF9fSEFMX1JUQ19UQU1QRVJfQ0xFQVJfRkxBRyhocnRjLCBSVENfRkxBR19UQU1QM0YpOworICAgIH0KKyAgfQorI2VuZGlmIC8qIFJUQ19UQU1QRVIzX1NVUFBPUlQgKi8KKworICAvKiBDbGVhciB0aGUgRVhUSSdzIEZsYWcgZm9yIFJUQyBUaW1lU3RhbXAgYW5kIFRhbXBlciAqLworICBfX0hBTF9SVENfVEFNUEVSX1RJTUVTVEFNUF9FWFRJX0NMRUFSX0ZMQUcoKTsKKworICAvKiBDaGFuZ2UgUlRDIHN0YXRlICovCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKK30KKworLyoqCisgICogQGJyaWVmICBUaW1lU3RhbXAgY2FsbGJhY2suIAorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUlRDRXhfVGltZVN0YW1wRXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHJ0Yyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9SVENFeF9UaW1lU3RhbXBFdmVudENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBUYW1wZXIgMSBjYWxsYmFjay4gCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9SVENFeF9UYW1wZXIxRXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHJ0Yyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9SVENFeF9UYW1wZXIxRXZlbnRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFRhbXBlciAyIGNhbGxiYWNrLiAKKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1JUQ0V4X1RhbXBlcjJFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocnRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1JUQ0V4X1RhbXBlcjJFdmVudENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIFRhbXBlciAzIGNhbGxiYWNrLiAKKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1JUQ0V4X1RhbXBlcjNFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocnRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1JUQ0V4X1RhbXBlcjNFdmVudENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisjZW5kaWYgLyogUlRDX1RBTVBFUjNfU1VQUE9SVCAqLworCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBUaW1lU3RhbXAgcG9sbGluZyByZXF1ZXN0LgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9Qb2xsRm9yVGltZVN0YW1wRXZlbnQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgd2hpbGUoX19IQUxfUlRDX1RJTUVTVEFNUF9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19UU0YpID09IFJFU0VUKQorICB7CisgICAgaWYoX19IQUxfUlRDX1RJTUVTVEFNUF9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19UU09WRikgIT0gUkVTRVQpCisgICAgeworICAgICAgLyogQ2xlYXIgdGhlIFRJTUVTVEFNUCBPdmVyUnVuIEZsYWcgKi8KKyAgICAgIF9fSEFMX1JUQ19USU1FU1RBTVBfQ0xFQVJfRkxBRyhocnRjLCBSVENfRkxBR19UU09WRik7CisKKyAgICAgIC8qIENoYW5nZSBUSU1FU1RBTVAgc3RhdGUgKi8KKyAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9FUlJPUjsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYoKFRpbWVvdXQgPT0gMFUpIHx8ICgoSEFMX0dldFRpY2soKS10aWNrc3RhcnQpID4gVGltZW91dCkpCisgICAgICB7CisgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9USU1FT1VUOworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogQ2hhbmdlIFJUQyBzdGF0ZSAqLworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgVGFtcGVyIDEgUG9sbGluZy4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfUG9sbEZvclRhbXBlcjFFdmVudChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgVGltZW91dCkKK3sgIAorICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIEdldCB0aGUgc3RhdHVzIG9mIHRoZSBJbnRlcnJ1cHQgKi8KKyAgd2hpbGUoX19IQUxfUlRDX1RBTVBFUl9HRVRfRkxBRyhocnRjLFJUQ19GTEFHX1RBTVAxRik9PSBSRVNFVCkKKyAgeworICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZigoVGltZW91dCA9PSAwVSkgfHwgKChIQUxfR2V0VGljaygpLXRpY2tzdGFydCkgPiBUaW1lb3V0KSkKKyAgICAgIHsKKyAgICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1RJTUVPVVQ7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBDbGVhciB0aGUgVGFtcGVyIEZsYWcgKi8KKyAgX19IQUxfUlRDX1RBTVBFUl9DTEVBUl9GTEFHKGhydGMsUlRDX0ZMQUdfVEFNUDFGKTsKKworICAvKiBDaGFuZ2UgUlRDIHN0YXRlICovCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBUYW1wZXIgMiBQb2xsaW5nLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9Qb2xsRm9yVGFtcGVyMkV2ZW50KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lb3V0KQoreyAgCisgIHVpbnQzMl90IHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogR2V0IHRoZSBzdGF0dXMgb2YgdGhlIEludGVycnVwdCAqLworICB3aGlsZShfX0hBTF9SVENfVEFNUEVSX0dFVF9GTEFHKGhydGMsUlRDX0ZMQUdfVEFNUDJGKSA9PSBSRVNFVCkKKyAgeworICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZigoVGltZW91dCA9PSAwVSkgfHwgKChIQUxfR2V0VGljaygpLXRpY2tzdGFydCkgPiBUaW1lb3V0KSkKKyAgICAgIHsKKyAgICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1RJTUVPVVQ7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBDbGVhciB0aGUgVGFtcGVyIEZsYWcgKi8KKyAgX19IQUxfUlRDX1RBTVBFUl9DTEVBUl9GTEFHKGhydGMsUlRDX0ZMQUdfVEFNUDJGKTsKKworICAvKiBDaGFuZ2UgUlRDIHN0YXRlICovCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisjaWYgZGVmaW5lZChSVENfVEFNUEVSM19TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBIYW5kbGUgVGFtcGVyIDMgUG9sbGluZy4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfUG9sbEZvclRhbXBlcjNFdmVudChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgVGltZW91dCkKK3sgIAorICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIEdldCB0aGUgc3RhdHVzIG9mIHRoZSBJbnRlcnJ1cHQgKi8KKyAgd2hpbGUoX19IQUxfUlRDX1RBTVBFUl9HRVRfRkxBRyhocnRjLFJUQ19GTEFHX1RBTVAzRikgPT0gUkVTRVQpCisgIHsKKyAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYoKFRpbWVvdXQgPT0gMFUpIHx8ICgoSEFMX0dldFRpY2soKS10aWNrc3RhcnQpID4gVGltZW91dCkpCisgICAgICB7CisgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9USU1FT1VUOworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogQ2xlYXIgdGhlIFRhbXBlciBGbGFnICovCisgIF9fSEFMX1JUQ19UQU1QRVJfQ0xFQVJfRkxBRyhocnRjLFJUQ19GTEFHX1RBTVAzRik7CisKKyAgLyogQ2hhbmdlIFJUQyBzdGF0ZSAqLworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKyNlbmRpZiAvKiBSVENfVEFNUEVSM19TVVBQT1JUICovCisKKy8qKgorICAqIEB9CisgICovCisgIAorLyoqIEBhZGR0b2dyb3VwIFJUQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAgKiBAYnJpZWYgICAgUlRDIFdha2UtdXAgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbSAgIAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFJUQyBXYWtlLXVwIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorIAorIFsuLl0gVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb25maWd1cmUgV2FrZS11cCBmZWF0dXJlCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IHdha2UgdXAgdGltZXIuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcGFyYW0gIFdha2VVcENvdW50ZXIgV2FrZSB1cCBjb3VudGVyCisgICogQHBhcmFtICBXYWtlVXBDbG9jayBXYWtlIHVwIGNsb2NrICAKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRXYWtlVXBUaW1lcihSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgV2FrZVVwQ291bnRlciwgdWludDMyX3QgV2FrZVVwQ2xvY2spCit7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfV0FLRVVQX0NMT0NLKFdha2VVcENsb2NrKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfV0FLRVVQX0NPVU5URVIoV2FrZVVwQ291bnRlcikpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisgCisgIC8qQ2hlY2sgUlRDIFdVVFdGIGZsYWcgaXMgcmVzZXQgb25seSB3aGVuIHdha2UgdXAgdGltZXIgZW5hYmxlZCovCisgIGlmKChocnRjLT5JbnN0YW5jZS0+Q1IgJiBSVENfQ1JfV1VURSkgIT0gUkVTRVQpeworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgIC8qIFdhaXQgdGlsbCBSVEMgV1VUV0YgZmxhZyBpcyByZXNldCBhbmQgaWYgVGltZSBvdXQgaXMgcmVhY2hlZCBleGl0ICovCisgICB3aGlsZShfX0hBTF9SVENfV0FLRVVQVElNRVJfR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfV1VUV0YpID09IFNFVCkKKyAgIHsKKyAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gUlRDX1RJTUVPVVRfVkFMVUUpCisgICAgICB7CisgICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsKKworICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8gCisgICAgICAgX19IQUxfVU5MT0NLKGhydGMpOworCisgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9ESVNBQkxFKGhydGMpOworICAgICAKKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBXYWl0IHRpbGwgUlRDIFdVVFdGIGZsYWcgaXMgc2V0IGFuZCBpZiBUaW1lIG91dCBpcyByZWFjaGVkIGV4aXQgKi8KKyAgd2hpbGUoX19IQUxfUlRDX1dBS0VVUFRJTUVSX0dFVF9GTEFHKGhydGMsIFJUQ19GTEFHX1dVVFdGKSA9PSBSRVNFVCkKKyAgeworICAgIGlmKChIQUxfR2V0VGljaygpLXRpY2tzdGFydCkgPiBSVENfVElNRU9VVF9WQUxVRSkKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhydGMpOworCisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICB9CisKKyAgLyogQ2xlYXIgdGhlIFdha2V1cCBUaW1lciBjbG9jayBzb3VyY2UgYml0cyBpbiBDUiByZWdpc3RlciAqLworICBocnRjLT5JbnN0YW5jZS0+Q1IgJj0gKHVpbnQzMl90KX5SVENfQ1JfV1VDS1NFTDsKKworICAvKiBDb25maWd1cmUgdGhlIGNsb2NrIHNvdXJjZSAqLworICBocnRjLT5JbnN0YW5jZS0+Q1IgfD0gKHVpbnQzMl90KVdha2VVcENsb2NrOworCisgIC8qIENvbmZpZ3VyZSB0aGUgV2FrZXVwIFRpbWVyIGNvdW50ZXIgKi8KKyAgaHJ0Yy0+SW5zdGFuY2UtPldVVFIgPSAodWludDMyX3QpV2FrZVVwQ291bnRlcjsKKworICAgLyogRW5hYmxlIHRoZSBXYWtldXAgVGltZXIgKi8KKyAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VOQUJMRShocnRjKTsKKworICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHdha2UgdXAgdGltZXIgd2l0aCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcGFyYW0gIFdha2VVcENvdW50ZXIgV2FrZSB1cCBjb3VudGVyCisgICogQHBhcmFtICBXYWtlVXBDbG9jayBXYWtlIHVwIGNsb2NrICAKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRXYWtlVXBUaW1lcl9JVChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgV2FrZVVwQ291bnRlciwgdWludDMyX3QgV2FrZVVwQ2xvY2spCit7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfV0FLRVVQX0NMT0NLKFdha2VVcENsb2NrKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfV0FLRVVQX0NPVU5URVIoV2FrZVVwQ291bnRlcikpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisKKyAgLypDaGVjayBSVEMgV1VUV0YgZmxhZyBpcyByZXNldCBvbmx5IHdoZW4gd2FrZSB1cCB0aW1lciBlbmFibGVkKi8KKyAgaWYoKGhydGMtPkluc3RhbmNlLT5DUiAmIFJUQ19DUl9XVVRFKSAhPSBSRVNFVCl7CisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAKKyAgIC8qIFdhaXQgdGlsbCBSVEMgV1VUV0YgZmxhZyBpcyByZXNldCBhbmQgaWYgVGltZSBvdXQgaXMgcmVhY2hlZCBleGl0ICovCisgICB3aGlsZShfX0hBTF9SVENfV0FLRVVQVElNRVJfR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfV1VUV0YpID09IFNFVCkKKyAgIHsKKyAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gUlRDX1RJTUVPVVRfVkFMVUUpCisgICAgICB7CisgICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsKKworICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8gCisgICAgICAgX19IQUxfVU5MT0NLKGhydGMpOworCisgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFdha2UtVXAgdGltZXIgKi8KKyAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0RJU0FCTEUoaHJ0Yyk7CisKKyAgLyogQ2xlYXIgZmxhZyBXYWtlLVVwICovCisgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9DTEVBUl9GTEFHKGhydGMsIFJUQ19GTEFHX1dVVEYpOworCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCB0aWxsIFJUQyBXVVRXRiBmbGFnIGlzIHNldCBhbmQgaWYgVGltZSBvdXQgaXMgcmVhY2hlZCBleGl0ICovCisgIHdoaWxlKF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19XVVRXRikgPT0gUkVTRVQpCisgIHsKKyAgICBpZigoSEFMX0dldFRpY2soKS10aWNrc3RhcnQpID4gUlRDX1RJTUVPVVRfVkFMVUUpCisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1RJTUVPVVQ7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorCisgIC8qIENvbmZpZ3VyZSB0aGUgV2FrZXVwIFRpbWVyIGNvdW50ZXIgKi8KKyAgaHJ0Yy0+SW5zdGFuY2UtPldVVFIgPSAodWludDMyX3QpV2FrZVVwQ291bnRlcjsKKworICAvKiBDbGVhciB0aGUgV2FrZXVwIFRpbWVyIGNsb2NrIHNvdXJjZSBiaXRzIGluIENSIHJlZ2lzdGVyICovCisgIGhydGMtPkluc3RhbmNlLT5DUiAmPSAodWludDMyX3QpflJUQ19DUl9XVUNLU0VMOworCisgIC8qIENvbmZpZ3VyZSB0aGUgY2xvY2sgc291cmNlICovCisgIGhydGMtPkluc3RhbmNlLT5DUiB8PSAodWludDMyX3QpV2FrZVVwQ2xvY2s7CisKKyAgLyogUlRDIFdha2VVcFRpbWVyIEludGVycnVwdCBDb25maWd1cmF0aW9uOiBFWFRJIGNvbmZpZ3VyYXRpb24gKi8KKyAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfRU5BQkxFX0lUKCk7CisKKyAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7CisKKyAgLyogQ29uZmlndXJlIHRoZSBJbnRlcnJ1cHQgaW4gdGhlIFJUQ19DUiByZWdpc3RlciAqLworICBfX0hBTF9SVENfV0FLRVVQVElNRVJfRU5BQkxFX0lUKGhydGMsUlRDX0lUX1dVVCk7CisKKyAgLyogRW5hYmxlIHRoZSBXYWtldXAgVGltZXIgKi8KKyAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VOQUJMRShocnRjKTsKKworICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVhY3RpdmF0ZSB3YWtlIHVwIHRpbWVyIGNvdW50ZXIuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUgCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCit1aW50MzJfdCBIQUxfUlRDRXhfRGVhY3RpdmF0ZVdha2VVcFRpbWVyKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIERpc2FibGUgdGhlIFdha2V1cCBUaW1lciAqLworICBfX0hBTF9SVENfV0FLRVVQVElNRVJfRElTQUJMRShocnRjKTsKKworICAvKiBJbiBjYXNlIG9mIGludGVycnVwdCBtb2RlIGlzIHVzZWQsIHRoZSBpbnRlcnJ1cHQgc291cmNlIG11c3QgZGlzYWJsZWQgKi8KKyAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0RJU0FCTEVfSVQoaHJ0YyxSVENfSVRfV1VUKTsKKworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAvKiBXYWl0IHRpbGwgUlRDIFdVVFdGIGZsYWcgaXMgc2V0IGFuZCBpZiBUaW1lIG91dCBpcyByZWFjaGVkIGV4aXQgKi8KKyAgd2hpbGUoX19IQUxfUlRDX1dBS0VVUFRJTUVSX0dFVF9GTEFHKGhydGMsIFJUQ19GTEFHX1dVVFdGKSA9PSBSRVNFVCkKKyAgeworICAgIGlmKChIQUxfR2V0VGljaygpLXRpY2tzdGFydCkgPiBSVENfVElNRU9VVF9WQUxVRSkKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhydGMpOworCisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICB9CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB3YWtlIHVwIHRpbWVyIGNvdW50ZXIuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUgCisgICogQHJldHZhbCBDb3VudGVyIHZhbHVlCisgICovCit1aW50MzJfdCBIQUxfUlRDRXhfR2V0V2FrZVVwVGltZXIoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpCit7CisgIC8qIEdldCB0aGUgY291bnRlciB2YWx1ZSAqLworICByZXR1cm4gKCh1aW50MzJfdCkoaHJ0Yy0+SW5zdGFuY2UtPldVVFIgJiBSVENfV1VUUl9XVVQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgV2FrZSBVcCBUaW1lciBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUlRDRXhfV2FrZVVwVGltZXJJUlFIYW5kbGVyKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreworICAvKiBHZXQgdGhlIHBlbmRpbmcgc3RhdHVzIG9mIHRoZSBXQUtFVVBUSU1FUiBJbnRlcnJ1cHQgKi8KKyAgaWYoX19IQUxfUlRDX1dBS0VVUFRJTUVSX0dFVF9GTEFHKGhydGMsIFJUQ19GTEFHX1dVVEYpICE9IFJFU0VUKQorICB7CisgICAgLyogV0FLRVVQVElNRVIgY2FsbGJhY2sgKi8KKyAgICBIQUxfUlRDRXhfV2FrZVVwVGltZXJFdmVudENhbGxiYWNrKGhydGMpOworICAgIAorICAgIC8qIENsZWFyIHRoZSBXQUtFVVBUSU1FUiBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgKi8KKyAgICBfX0hBTF9SVENfV0FLRVVQVElNRVJfQ0xFQVJfRkxBRyhocnRjLCBSVENfRkxBR19XVVRGKTsKKyAgfQorCisgIC8qIENsZWFyIHRoZSBFWFRJJ3MgbGluZSBGbGFnIGZvciBSVEMgV2FrZVVwVGltZXIgKi8KKyAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfQ0xFQVJfRkxBRygpOworICAKKyAgLyogQ2hhbmdlIFJUQyBzdGF0ZSAqLworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7Cit9CisKKy8qKgorICAqIEBicmllZiAgV2FrZSBVcCBUaW1lciBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1JUQ0V4X1dha2VVcFRpbWVyRXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHJ0Yyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9SVENFeF9XYWtlVXBUaW1lckV2ZW50Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIEhhbmRsZSBXYWtlIFVwIFRpbWVyIFBvbGxpbmcuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1BvbGxGb3JXYWtlVXBUaW1lckV2ZW50KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIHdoaWxlKF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19XVVRGKSA9PSBSRVNFVCkKKyAgeworICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZigoVGltZW91dCA9PSAwVSkgfHwgKChIQUxfR2V0VGljaygpLXRpY2tzdGFydCkgPiBUaW1lb3V0KSkKKyAgICAgIHsKKyAgICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1RJTUVPVVQ7CisgICAgICAKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIENsZWFyIHRoZSBXQUtFVVBUSU1FUiBGbGFnICovCisgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9DTEVBUl9GTEFHKGhydGMsIFJUQ19GTEFHX1dVVEYpOworCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBhZGR0b2dyb3VwIFJUQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMKKyAgKiBAYnJpZWYgICAgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0gICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bworICAgICAgKCspIFdyaXRlIGEgZGF0YSBpbiBhIHNwZWNpZmllZCBSVEMgQmFja3VwIGRhdGEgcmVnaXN0ZXIKKyAgICAgICgrKSBSZWFkIGEgZGF0YSBpbiBhIHNwZWNpZmllZCBSVEMgQmFja3VwIGRhdGEgcmVnaXN0ZXIKKyAgICAgICgrKSBTZXQgdGhlIENvYXJzZSBjYWxpYnJhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAgKCspIERlYWN0aXZhdGUgdGhlIENvYXJzZSBjYWxpYnJhdGlvbiBwYXJhbWV0ZXJzCisgICAgICAoKykgU2V0IHRoZSBTbW9vdGggY2FsaWJyYXRpb24gcGFyYW1ldGVycy4KKyAgICAgICgrKSBDb25maWd1cmUgdGhlIFN5bmNocm9uaXphdGlvbiBTaGlmdCBDb250cm9sIFNldHRpbmdzLgorICAgICAgKCspIENvbmZpZ3VyZSB0aGUgQ2FsaWJyYXRpb24gUGlub3V0IChSVENfQ0FMSUIpIFNlbGVjdGlvbiAoMUh6IG9yIDUxMkh6KS4KKyAgICAgICgrKSBEZWFjdGl2YXRlIHRoZSBDYWxpYnJhdGlvbiBQaW5vdXQgKFJUQ19DQUxJQikgU2VsZWN0aW9uICgxSHogb3IgNTEySHopLgorICAgICAgKCspIEVuYWJsZSB0aGUgUlRDIHJlZmVyZW5jZSBjbG9jayBkZXRlY3Rpb24uCisgICAgICAoKykgRGlzYWJsZSB0aGUgUlRDIHJlZmVyZW5jZSBjbG9jayBkZXRlY3Rpb24uCisgICAgICAoKykgRW5hYmxlIHRoZSBCeXBhc3MgU2hhZG93IGZlYXR1cmUuCisgICAgICAoKykgRGlzYWJsZSB0aGUgQnlwYXNzIFNoYWRvdyBmZWF0dXJlLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGEgZGF0YSBpbiBhIHNwZWNpZmllZCBSVEMgQmFja3VwIGRhdGEgcmVnaXN0ZXIuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUgCisgICogQHBhcmFtICBCYWNrdXBSZWdpc3RlciBSVEMgQmFja3VwIGRhdGEgUmVnaXN0ZXIgbnVtYmVyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogUlRDX0JLUF9EUnggd2hlcmUgeCBjYW4gYmUgZnJvbSAwIHRvIDE5IHRvIAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmeSB0aGUgcmVnaXN0ZXIuCisgICogQHBhcmFtICBEYXRhIERhdGEgdG8gYmUgd3JpdHRlbiBpbiB0aGUgc3BlY2lmaWVkIFJUQyBCYWNrdXAgZGF0YSByZWdpc3Rlci4gICAgICAgICAgICAgICAgICAgICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1JUQ0V4X0JLVVBXcml0ZShSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgQmFja3VwUmVnaXN0ZXIsIHVpbnQzMl90IERhdGEpCit7CisgIHVpbnQzMl90IHRtcCA9IDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfQktQKEJhY2t1cFJlZ2lzdGVyKSk7CisgIAorICB0bXAgPSAodWludDMyX3QpJihocnRjLT5JbnN0YW5jZS0+QktQMFIpOworICB0bXAgKz0gKEJhY2t1cFJlZ2lzdGVyICogNFUpOworCisgIC8qIFdyaXRlIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgKi8KKyAgKihfX0lPIHVpbnQzMl90ICopdG1wID0gKHVpbnQzMl90KURhdGE7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVhZHMgZGF0YSBmcm9tIHRoZSBzcGVjaWZpZWQgUlRDIEJhY2t1cCBkYXRhIFJlZ2lzdGVyLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlIAorICAqIEBwYXJhbSAgQmFja3VwUmVnaXN0ZXIgUlRDIEJhY2t1cCBkYXRhIFJlZ2lzdGVyIG51bWJlci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IFJUQ19CS1BfRFJ4IHdoZXJlIHggY2FuIGJlIGZyb20gMCB0byAxOSB0byAKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZnkgdGhlIHJlZ2lzdGVyLiAgICAgICAgICAgICAgICAgICAKKyAgKiBAcmV0dmFsIFJlYWQgdmFsdWUKKyAgKi8KK3VpbnQzMl90IEhBTF9SVENFeF9CS1VQUmVhZChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgQmFja3VwUmVnaXN0ZXIpCit7CisgIHVpbnQzMl90IHRtcCA9IDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfQktQKEJhY2t1cFJlZ2lzdGVyKSk7CisKKyAgdG1wID0gKHVpbnQzMl90KSYoaHJ0Yy0+SW5zdGFuY2UtPkJLUDBSKTsKKyAgdG1wICs9IChCYWNrdXBSZWdpc3RlciAqIDRVKTsKKworICAvKiBSZWFkIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgKi8KKyAgcmV0dXJuICgqKF9fSU8gdWludDMyX3QgKil0bXApOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgU21vb3RoIGNhbGlicmF0aW9uIHBhcmFtZXRlcnMuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUgIAorICAqIEBwYXJhbSAgU21vb3RoQ2FsaWJQZXJpb2QgU2VsZWN0IHRoZSBTbW9vdGggQ2FsaWJyYXRpb24gUGVyaW9kLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIDoKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19TTU9PVEhDQUxJQl9QRVJJT0RfMzJTRUM6IFRoZSBzbW9vdGggY2FsaWJyYXRpb24gcGVyaW9kIGlzIDMycy4KKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19TTU9PVEhDQUxJQl9QRVJJT0RfMTZTRUM6IFRoZSBzbW9vdGggY2FsaWJyYXRpb24gcGVyaW9kIGlzIDE2cy4KKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19TTU9PVEhDQUxJQl9QRVJJT0RfOFNFQzogVGhlIHNtb290aCBjYWxpYnJhdGlvbiBwZXJpb2QgaXMgOHMuCisgICogQHBhcmFtICBTbW9vdGhDYWxpYlBsdXNQdWxzZXMgU2VsZWN0IHRvIFNldCBvciByZXNldCB0aGUgQ0FMUCBiaXQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19TTU9PVEhDQUxJQl9QTFVTUFVMU0VTX1NFVDogQWRkIG9uZSBSVENDTEsgcHVsc2UgZXZlcnkgMioxMSBwdWxzZXMuCisgICogICAgICAgICAgICAgQGFyZyBSVENfU01PT1RIQ0FMSUJfUExVU1BVTFNFU19SRVNFVDogTm8gUlRDQ0xLIHB1bHNlcyBhcmUgYWRkZWQuCisgICogQHBhcmFtICBTbW9vdGhDYWxpYk1pbnVzUHVsc2VzVmFsdWUgU2VsZWN0IHRoZSB2YWx1ZSBvZiBDQUxNWzg6MF0gYml0cy4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIGFueSB2YWx1ZSBmcm9tIDAgdG8gMHgwMDAwMDFGRi4KKyAgKiBAbm90ZSAgIFRvIGRlYWN0aXZhdGUgdGhlIHNtb290aCBjYWxpYnJhdGlvbiwgdGhlIGZpZWxkIFNtb290aENhbGliUGx1c1B1bHNlcyAKKyAgKiAgICAgICAgIG11c3QgYmUgZXF1YWwgdG8gU01PT1RIQ0FMSUJfUExVU1BVTFNFU19SRVNFVCBhbmQgdGhlIGZpZWxkIAorICAqICAgICAgICAgU21vb3RoQ2FsaWJNaW51c1B1bHNlc1ZhbHVlIG11dCBiZSBlcXVhbCB0byAwLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1NldFNtb290aENhbGliKFJUQ19IYW5kbGVUeXBlRGVmKiBocnRjLCB1aW50MzJfdCBTbW9vdGhDYWxpYlBlcmlvZCwgdWludDMyX3QgU21vb3RoQ2FsaWJQbHVzUHVsc2VzLCB1aW50MzJfdCBTbW9vdGhDYWxpYk1pbnVzUHVsc2VzVmFsdWUpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfU01PT1RIX0NBTElCX1BFUklPRChTbW9vdGhDYWxpYlBlcmlvZCkpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1NNT09USF9DQUxJQl9QTFVTKFNtb290aENhbGliUGx1c1B1bHNlcykpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1NNT09USF9DQUxJQl9NSU5VUyhTbW9vdGhDYWxpYk1pbnVzUHVsc2VzVmFsdWUpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIGNoZWNrIGlmIGEgY2FsaWJyYXRpb24gaXMgcGVuZGluZyovCisgIGlmKChocnRjLT5JbnN0YW5jZS0+SVNSICYgUlRDX0lTUl9SRUNBTFBGKSAhPSBSRVNFVCkKKyAgeworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAvKiBjaGVjayBpZiBhIGNhbGlicmF0aW9uIGlzIHBlbmRpbmcqLworICAgIHdoaWxlKChocnRjLT5JbnN0YW5jZS0+SVNSICYgUlRDX0lTUl9SRUNBTFBGKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBpZigoSEFMX0dldFRpY2soKS10aWNrc3RhcnQpID4gUlRDX1RJTUVPVVRfVkFMVUUpCisgICAgICB7CisgICAgICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAgICAgICAvKiBDaGFuZ2UgUlRDIHN0YXRlICovCisgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9USU1FT1VUOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhydGMpOworCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBDb25maWd1cmUgdGhlIFNtb290aCBjYWxpYnJhdGlvbiBzZXR0aW5ncyAqLworICBocnRjLT5JbnN0YW5jZS0+Q0FMUiA9ICh1aW50MzJfdCkoKHVpbnQzMl90KVNtb290aENhbGliUGVyaW9kIHwgKHVpbnQzMl90KVNtb290aENhbGliUGx1c1B1bHNlcyB8ICh1aW50MzJfdClTbW9vdGhDYWxpYk1pbnVzUHVsc2VzVmFsdWUpOworCisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAvKiBDaGFuZ2UgUlRDIHN0YXRlICovCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgU3luY2hyb25pemF0aW9uIFNoaWZ0IENvbnRyb2wgU2V0dGluZ3MuCisgICogQG5vdGUgICBXaGVuIFJFRkNLT04gaXMgc2V0LCBmaXJtd2FyZSBtdXN0IG5vdCB3cml0ZSB0byBTaGlmdCBjb250cm9sIHJlZ2lzdGVyLiAKKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZSAgICAKKyAgKiBAcGFyYW0gIFNoaWZ0QWRkMVM6IFNlbGVjdCB0byBhZGQgb3Igbm90IDEgc2Vjb25kIHRvIHRoZSB0aW1lIGNhbGVuZGFyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgOgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX1NISUZUQUREMVNfU0VUOiBBZGQgb25lIHNlY29uZCB0byB0aGUgY2xvY2sgY2FsZW5kYXIuIAorICAqICAgICAgICAgICAgIEBhcmcgUlRDX1NISUZUQUREMVNfUkVTRVQ6IE5vIGVmZmVjdC4KKyAgKiBAcGFyYW0gIFNoaWZ0U3ViRlMgU2VsZWN0IHRoZSBudW1iZXIgb2YgU2Vjb25kIEZyYWN0aW9ucyB0byBzdWJzdGl0dXRlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgYW55IHZhbHVlIGZyb20gMCB0byAweDdGRkYuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0U3luY2hyb1NoaWZ0KFJUQ19IYW5kbGVUeXBlRGVmKiBocnRjLCB1aW50MzJfdCBTaGlmdEFkZDFTLCB1aW50MzJfdCBTaGlmdFN1YkZTKQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1NISUZUX0FERDFTKFNoaWZ0QWRkMVMpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19TSElGVF9TVUJGUyhTaGlmdFN1YkZTKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAvKiBXYWl0IHVudGlsIHRoZSBzaGlmdCBpcyBjb21wbGV0ZWQqLworICAgIHdoaWxlKChocnRjLT5JbnN0YW5jZS0+SVNSICYgUlRDX0lTUl9TSFBGKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBpZigoSEFMX0dldFRpY2soKS10aWNrc3RhcnQpID4gUlRDX1RJTUVPVVRfVkFMVUUpCisgICAgICB7CisgICAgICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgdGhlIHJlZmVyZW5jZSBjbG9jayBkZXRlY3Rpb24gaXMgZGlzYWJsZWQgKi8KKyAgICBpZigoaHJ0Yy0+SW5zdGFuY2UtPkNSICYgUlRDX0NSX1JFRkNLT04pID09IFJFU0VUKQorICAgIHsKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgU2hpZnQgc2V0dGluZ3MgKi8KKyAgICAgIGhydGMtPkluc3RhbmNlLT5TSElGVFIgPSAodWludDMyX3QpKHVpbnQzMl90KShTaGlmdFN1YkZTKSB8ICh1aW50MzJfdCkoU2hpZnRBZGQxUyk7CisKKyAgICAgIC8qIElmICBSVENfQ1JfQllQU0hBRCBiaXQgPSAwVSwgd2FpdCBmb3Igc3luY2hybyBlbHNlIHRoaXMgY2hlY2sgaXMgbm90IG5lZWRlZCAqLworICAgICAgaWYoKGhydGMtPkluc3RhbmNlLT5DUiAmIFJUQ19DUl9CWVBTSEFEKSA9PSBSRVNFVCkKKyAgICAgIHsKKyAgICAgICAgaWYoSEFMX1JUQ19XYWl0Rm9yU3luY2hybyhocnRjKSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICAgICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9FUlJPUjsKKworICAgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgICAvKiBDaGFuZ2UgUlRDIHN0YXRlICovCisgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfRVJST1I7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBDYWxpYnJhdGlvbiBQaW5vdXQgKFJUQ19DQUxJQikgU2VsZWN0aW9uICgxSHogb3IgNTEySHopLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBDYWxpYk91dHB1dCBTZWxlY3QgdGhlIENhbGlicmF0aW9uIG91dHB1dCBTZWxlY3Rpb24gLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgQGFyZyBSVENfQ0FMSUJPVVRQVVRfNTEySFo6IEEgc2lnbmFsIGhhcyBhIHJlZ3VsYXIgd2F2ZWZvcm0gYXQgNTEySHouIAorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0NBTElCT1VUUFVUXzFIWjogQSBzaWduYWwgaGFzIGEgcmVndWxhciB3YXZlZm9ybSBhdCAxSHouCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0Q2FsaWJyYXRpb25PdXRQdXQoUlRDX0hhbmRsZVR5cGVEZWYqIGhydGMsIHVpbnQzMl90IENhbGliT3V0cHV0KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0NBTElCX09VVFBVVChDYWxpYk91dHB1dCkpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisKKyAgLyogQ2xlYXIgZmxhZ3MgYmVmb3JlIGNvbmZpZyAqLworICBocnRjLT5JbnN0YW5jZS0+Q1IgJj0gKHVpbnQzMl90KX5SVENfQ1JfQ09TRUw7CisKKyAgLyogQ29uZmlndXJlIHRoZSBSVENfQ1IgcmVnaXN0ZXIgKi8KKyAgaHJ0Yy0+SW5zdGFuY2UtPkNSIHw9ICh1aW50MzJfdClDYWxpYk91dHB1dDsKKworICBfX0hBTF9SVENfQ0FMSUJSQVRJT05fT1VUUFVUX0VOQUJMRShocnRjKTsKKworICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgLyogQ2hhbmdlIFJUQyBzdGF0ZSAqLworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZWFjdGl2YXRlIHRoZSBDYWxpYnJhdGlvbiBQaW5vdXQgKFJUQ19DQUxJQikgU2VsZWN0aW9uICgxSHogb3IgNTEySHopLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfRGVhY3RpdmF0ZUNhbGlicmF0aW9uT3V0UHV0KFJUQ19IYW5kbGVUeXBlRGVmKiBocnRjKQoreworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIF9fSEFMX1JUQ19DQUxJQlJBVElPTl9PVVRQVVRfRElTQUJMRShocnRjKTsKKworICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgLyogQ2hhbmdlIFJUQyBzdGF0ZSAqLworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFJUQyByZWZlcmVuY2UgY2xvY2sgZGV0ZWN0aW9uLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0UmVmQ2xvY2soUlRDX0hhbmRsZVR5cGVEZWYqIGhydGMpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisKKyAgLyogU2V0IEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgaWYoUlRDX0VudGVySW5pdE1vZGUoaHJ0YykgIT0gSEFMX09LKQorICB7CisgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAvKiBTZXQgUlRDIHN0YXRlKi8KKyAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfRVJST1I7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhydGMpOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICBfX0hBTF9SVENfQ0xPQ0tSRUZfREVURUNUSU9OX0VOQUJMRShocnRjKTsKKworICAgIC8qIEV4aXQgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICAgIGhydGMtPkluc3RhbmNlLT5JU1IgJj0gKHVpbnQzMl90KX5SVENfSVNSX0lOSVQ7CisgIH0KKworICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgUlRDIHJlZmVyZW5jZSBjbG9jayBkZXRlY3Rpb24uCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9EZWFjdGl2YXRlUmVmQ2xvY2soUlRDX0hhbmRsZVR5cGVEZWYqIGhydGMpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisKKyAgLyogU2V0IEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgaWYoUlRDX0VudGVySW5pdE1vZGUoaHJ0YykgIT0gSEFMX09LKQorICB7CisgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAvKiBTZXQgUlRDIHN0YXRlKi8KKyAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfRVJST1I7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhydGMpOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICBfX0hBTF9SVENfQ0xPQ0tSRUZfREVURUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisKKyAgICAvKiBFeGl0IEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgICBocnRjLT5JbnN0YW5jZS0+SVNSICY9ICh1aW50MzJfdCl+UlRDX0lTUl9JTklUOworICB9CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBCeXBhc3MgU2hhZG93IGZlYXR1cmUuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAbm90ZSAgIFdoZW4gdGhlIEJ5cGFzcyBTaGFkb3cgaXMgZW5hYmxlZCB0aGUgY2FsZW5kYXIgdmFsdWUgYXJlIHRha2VuIAorICAqICAgICAgICAgZGlyZWN0bHkgZnJvbSB0aGUgQ2FsZW5kYXIgY291bnRlci4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9FbmFibGVCeXBhc3NTaGFkb3coUlRDX0hhbmRsZVR5cGVEZWYqIGhydGMpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisKKyAgLyogU2V0IHRoZSBCWVBTSEFEIGJpdCAqLworICBocnRjLT5JbnN0YW5jZS0+Q1IgfD0gKHVpbnQ4X3QpUlRDX0NSX0JZUFNIQUQ7CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgQnlwYXNzIFNoYWRvdyBmZWF0dXJlLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQG5vdGUgICBXaGVuIHRoZSBCeXBhc3MgU2hhZG93IGlzIGVuYWJsZWQgdGhlIGNhbGVuZGFyIHZhbHVlIGFyZSB0YWtlbgorICAqICAgICAgICAgZGlyZWN0bHkgZnJvbSB0aGUgQ2FsZW5kYXIgY291bnRlci4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9EaXNhYmxlQnlwYXNzU2hhZG93KFJUQ19IYW5kbGVUeXBlRGVmKiBocnRjKQoreworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIFJlc2V0IHRoZSBCWVBTSEFEIGJpdCAqLworICBocnRjLT5JbnN0YW5jZS0+Q1IgJj0gKCh1aW50OF90KX5SVENfQ1JfQllQU0hBRCk7CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBSVENFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IEV4dGVuZGVkIGZlYXR1cmVzIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBFeHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltICAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAjIyMjIyBFeHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIFJUQyBBbHJhbSBCIGNhbGxiYWNrCisgICAgICAoKykgUlRDIFBvbGwgZm9yIEFsYXJtIEIgcmVxdWVzdAorICAgICAgICAgICAgICAgCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEFsYXJtIEIgY2FsbGJhY2suCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9SVENFeF9BbGFybUJFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocnRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1JUQ0V4X0FsYXJtQkV2ZW50Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgQWxhcm1CIFBvbGxpbmcgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfUG9sbEZvckFsYXJtQkV2ZW50KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lb3V0KQoreyAgCisgIHVpbnQzMl90IHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgIAorICB3aGlsZShfX0hBTF9SVENfQUxBUk1fR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfQUxSQkYpID09IFJFU0VUKQorICB7CisgICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmKChUaW1lb3V0ID09IDBVKSB8fCAoKEhBTF9HZXRUaWNrKCktdGlja3N0YXJ0KSA+IFRpbWVvdXQpKQorICAgICAgeworICAgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgLyogQ2xlYXIgdGhlIEFsYXJtIEZsYWcgKi8KKyAgX19IQUxfUlRDX0FMQVJNX0NMRUFSX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfQUxSQkYpOworICAKKyAgLyogQ2hhbmdlIFJUQyBzdGF0ZSAqLworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7IAorICAKKyAgcmV0dXJuIEhBTF9PSzsgCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfUlRDX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjN4eF9oYWxfc2RhZGMuYyBiL1NyYy9zdG0zMmYzeHhfaGFsX3NkYWRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ4MGFiMwotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfaGFsX3NkYWRjLmMKQEAgLTAsMCArMSwyNjk0IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2hhbF9zZGFkYy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nIAorICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgU2lnbWEtRGVsdGEgQW5hbG9nIHRvIERpZ2l0YWwgQ29udmVydGVyCisgICogICAgICAgICAgKFNEQURDKSBwZXJpcGhlcmFsczoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbgorICAqICAgICAgICAgICArIFJlZ3VsYXIgQ2hhbm5lbHMgQ29uZmlndXJhdGlvbgorICAqICAgICAgICAgICArIEluamVjdGVkIGNoYW5uZWxzIENvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBQb3dlciBzYXZpbmcKKyAgKiAgICAgICAgICAgKyBSZWd1bGFyL0luamVjdGVkIENoYW5uZWxzIERNQSBDb25maWd1cmF0aW9uCisgICogICAgICAgICAgICsgSW50ZXJydXB0cyBhbmQgZmxhZ3MgbWFuYWdlbWVudAorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICMjIyMjIFNEQURDIHNwZWNpZmljIGZlYXR1cmVzICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgICAgICAgICAgCisgIFsuLl0gCisgICgjKSAxNi1iaXQgc2lnbWEgZGVsdGEgYXJjaGl0ZWN0dXJlLgorICAoIykgU2VsZiBjYWxpYnJhdGlvbi4KKyAgKCMpIEludGVycnVwdCBnZW5lcmF0aW9uIGF0IHRoZSBlbmQgb2YgY2FsaWJyYXRpb24sIHJlZ3VsYXIvaW5qZWN0ZWQgY29udmVyc2lvbiAgCisgICAgICBhbmQgaW4gY2FzZSBvZiBvdmVycnVuIGV2ZW50cy4KKyAgKCMpIFNpbmdsZSBhbmQgY29udGludW91cyBjb252ZXJzaW9uIG1vZGVzLgorICAoIykgRXh0ZXJuYWwgdHJpZ2dlciBvcHRpb24gd2l0aCBjb25maWd1cmFibGUgcG9sYXJpdHkgZm9yIGluamVjdGVkIGNvbnZlcnNpb24uCisgICgjKSBNdWx0aSBtb2RlIChzeW5jaHJvbml6ZWQgYW5vdGhlciBTREFEQyB3aXRoIFNEQURDMSkuCisgICgjKSBETUEgcmVxdWVzdCBnZW5lcmF0aW9uIGR1cmluZyByZWd1bGFyIG9yIGluamVjdGVkIGNoYW5uZWwgY29udmVyc2lvbi4KKworICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgICoqKiBJbml0aWFsaXphdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgKCMpIEFzIHByZXJlcXVpc2l0ZSwgZmlsbCBpbiB0aGUgSEFMX1NEQURDX01zcEluaXQoKSA6CisgICAgICAgICgrKykgRW5hYmxlIFNEQURDeCBjbG9jayBpbnRlcmZhY2Ugd2l0aCBfX1NEQURDeF9DTEtfRU5BQkxFKCkuCisgICAgICAgICgrKykgQ29uZmlndXJlIFNEQURDeCBjbG9jayBkaXZpZGVyIHdpdGggSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZy4KKyAgICAgICAgKCsrKSBFbmFibGUgcG93ZXIgb24gU0RBREMgd2l0aCBIQUxfUFdSRXhfRW5hYmxlU0RBREMoKS4KKyAgICAgICAgKCsrKSBFbmFibGUgdGhlIGNsb2NrcyBmb3IgdGhlIFNEQURDIEdQSU9TIHdpdGggX19IQUxfUkNDX0dQSU94X0NMS19FTkFCTEUoKS4KKyAgICAgICAgKCsrKSBDb25maWd1cmUgdGhlc2UgU0RBREMgcGlucyBpbiBhbmFsb2cgbW9kZSB1c2luZyBIQUxfR1BJT19Jbml0KCkuCisgICAgICAgICgrKykgSWYgaW50ZXJydXB0IG1vZGUgaXMgdXNlZCwgZW5hYmxlIGFuZCBjb25maWd1cmUgU0RBREMgZ2xvYmFsCisgICAgICAgICAgICBpbnRlcnJ1cHQgd2l0aCBIQUxfTlZJQ19TZXRQcmlvcml0eSgpIGFuZCBIQUxfTlZJQ19FbmFibGVJUlEoKS4KKyAgICAgICAgKCsrKSBJZiBETUEgbW9kZSBpcyB1c2VkLCBjb25maWd1cmUgRE1BIHdpdGggSEFMX0RNQV9Jbml0IGFuZCBsaW5rIGl0CisgICAgICAgICAgICB3aXRoIFNEQURDIGhhbmRsZSB1c2luZyBfX0hBTF9MSU5LRE1BLgorICAgICAgKCMpIENvbmZpZ3VyZSB0aGUgU0RBREMgbG93IHBvd2VyIG1vZGUsIGZhc3QgY29udmVyc2lvbiBtb2RlLCBzbG93IGNsb2NrCisgICAgICAgICAgbW9kZSBhbmQgU0RBREMxIHJlZmVyZW5jZSB2b2x0YWdlIHVzaW5nIHRoZSBIQUxfQURDX0luaXQoKSBmdW5jdGlvbi4KKyAgICAgICAgICBOb3RlOiBDb21tb24gcmVmZXJlbmNlIHZvbHRhZ2UuIGlzIGNvbW1vbiB0byBhbGwgU0RBREMgaW5zdGFuY2VzLgorICAgICAgKCMpIFByZXBhcmUgY2hhbm5lbCBjb25maWd1cmF0aW9ucyAoaW5wdXQgbW9kZSwgY29tbW9uIG1vZGUsIGdhaW4gYW5kCisgICAgICAgICAgb2Zmc2V0KSB1c2luZyBIQUxfU0RBRENfUHJlcGFyZUNoYW5uZWxDb25maWcgYW5kIGFzc29jaWF0ZSBjaGFubmVsCisgICAgICAgICAgd2l0aCBvbmUgY29uZmlndXJhdGlvbiB1c2luZyBIQUxfU0RBRENfQXNzb2NpYXRlQ2hhbm5lbENvbmZpZy4KKworICAgICoqKiBDYWxpYnJhdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgjKSBTdGFydCBjYWxpYnJhdGlvbiB1c2luZyBIQUxfU0RBRENfU3RhcnRDYWxpYnJhdGlvbiBvcgorICAgICAgICAgIEhBTF9TREFEQ19DYWxpYnJhdGlvblN0YXJ0X0lULgorICAgICAgKCMpIEluIHBvbGxpbmcgbW9kZSwgdXNlIEhBTF9TREFEQ19Qb2xsRm9yQ2FsaWJFdmVudCB0byBkZXRlY3QgdGhlIGVuZCBvZgorICAgICAgICAgIGNhbGlicmF0aW9uLgorICAgICAgKCMpIEluIGludGVycnVwdCBtb2RlLCBIQUxfU0RBRENfQ2FsaWJyYXRpb25DcGx0Q2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgYXQKKyAgICAgICAgICB0aGUgZW5kIG9mIGNhbGlicmF0aW9uLgorCisgICAgKioqIFJlZ3VsYXIgY2hhbm5lbCBjb252ZXJzaW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgICAKKyAgICAgICgjKSBTZWxlY3QgdHJpZ2dlciBmb3IgcmVndWxhciBjb252ZXJzaW9uIHVzaW5nCisgICAgICAgICAgSEFMX1NEQURDX1NlbGVjdFJlZ3VsYXJUcmlnZ2VyLgorICAgICAgKCMpIFNlbGVjdCByZWd1bGFyIGNoYW5uZWwgYW5kIGVuYWJsZS9kaXNhYmxlIGNvbnRpbnVvdXMgbW9kZSB1c2luZworICAgICAgICAgIEhBTF9TREFEQ19Db25maWdDaGFubmVsLgorICAgICAgKCMpIFN0YXJ0IHJlZ3VsYXIgY29udmVyc2lvbiB1c2luZyBIQUxfU0RBRENfU3RhcnQsIEhBTF9TREFEQ19TdGFydF9JVAorICAgICAgICAgIG9yIEhBTF9TREFEQ19TdGFydF9ETUEuCisgICAgICAoIykgSW4gcG9sbGluZyBtb2RlLCB1c2UgSEFMX1NEQURDX1BvbGxGb3JDb252ZXJzaW9uIHRvIGRldGVjdCB0aGUgZW5kIG9mCisgICAgICAgICAgcmVndWxhciBjb252ZXJzaW9uLgorICAgICAgKCMpIEluIGludGVycnVwdCBtb2RlLCBIQUxfU0RBRENfQ29udkNwbHRDYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBhdCB0aGUgCisgICAgICAgICAgZW5kIG9mIHJlZ3VsYXIgY29udmVyc2lvbi4KKyAgICAgICgjKSBHZXQgdmFsdWUgb2YgcmVndWxhciBjb252ZXJzaW9uIHVzaW5nIEhBTF9TREFEQ19HZXRWYWx1ZS4KKyAgICAgICgjKSBJbiBETUEgbW9kZSwgSEFMX1NEQURDX0NvbnZIYWxmQ3BsdENhbGxiYWNrIGFuZCAKKyAgICAgICAgICBIQUxfU0RBRENfQ29udkNwbHRDYWxsYmFjayB3aWxsIGJlIGNhbGxlZCByZXNwZWN0aXZlbHkgYXQgdGhlIGhhbGYgCisgICAgICAgICAgdHJhbnNmZXIgYW5kIGF0IHRoZSB0cmFuc2ZlciBjb21wbGV0ZS4KKyAgICAgICgjKSBTdG9wIHJlZ3VsYXIgY29udmVyc2lvbiB1c2luZyBIQUxfU0RBRENfU3RvcCwgSEFMX1NEQURDX1N0b3BfSVQKKyAgICAgICAgICBvciBIQUxfU0RBRENfU3RvcF9ETUEuCisKKyAgICAqKiogSW5qZWN0ZWQgY2hhbm5lbHMgY29udmVyc2lvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gICAgCisgICAgICAoIykgRW5hYmxlL2Rpc2FibGUgZGVsYXkgb24gaW5qZWN0ZWQgY29udmVyc2lvbiB1c2luZyAKKyAgICAgICAgICBIQUxfU0RBRENfU2VsZWN0SW5qZWN0ZWREZWxheS4KKyAgICAgICgjKSBJZiBleHRlcm5hbCB0cmlnZ2VyIGlzIHVzZWQgZm9yIGluamVjdGVkIGNvbnZlcnNpb24sIGNvbmZpZ3VyZSB0aGlzCisgICAgICAgICAgdHJpZ2dlciB1c2luZyBIQUxfU0RBRENfU2VsZWN0SW5qZWN0ZWRFeHRUcmlnZ2VyLgorICAgICAgKCMpIFNlbGVjdCB0cmlnZ2VyIGZvciBpbmplY3RlZCBjb252ZXJzaW9uIHVzaW5nCisgICAgICAgICAgSEFMX1NEQURDX1NlbGVjdEluamVjdGVkVHJpZ2dlci4KKyAgICAgICgjKSBTZWxlY3QgaW5qZWN0ZWQgY2hhbm5lbHMgYW5kIGVuYWJsZS9kaXNhYmxlIGNvbnRpbnVvdXMgbW9kZSB1c2luZworICAgICAgICAgIEhBTF9TREFEQ19JbmplY3RlZENvbmZpZ0NoYW5uZWwuCisgICAgICAoIykgU3RhcnQgaW5qZWN0ZWQgY29udmVyc2lvbiB1c2luZyBIQUxfU0RBRENfSW5qZWN0ZWRTdGFydCwKKyAgICAgICAgICBIQUxfU0RBRENfSW5qZWN0ZWRTdGFydF9JVCBvciBIQUxfU0RBRENfSW5qZWN0ZWRTdGFydF9ETUEuCisgICAgICAoIykgSW4gcG9sbGluZyBtb2RlLCB1c2UgSEFMX1NEQURDX1BvbGxGb3JJbmplY3RlZENvbnZlcnNpb24gdG8gZGV0ZWN0IHRoZQorICAgICAgICAgIGVuZCBvZiBpbmplY3RlZCBjb252ZXJzaW9uLgorICAgICAgKCMpIEluIGludGVycnVwdCBtb2RlLCBIQUxfU0RBRENfSW5qZWN0ZWRDb252Q3BsdENhbGxiYWNrIHdpbGwgYmUgY2FsbGVkCisgICAgICAgICAgYXQgdGhlIGVuZCBvZiBpbmplY3RlZCBjb252ZXJzaW9uLgorICAgICAgKCMpIEdldCB2YWx1ZSBvZiBpbmplY3RlZCBjb252ZXJzaW9uIGFuZCBjb3JyZXNwb25kaW5nIGNoYW5uZWwgdXNpbmcgCisgICAgICAgICAgSEFMX1NEQURDX0luamVjdGVkR2V0VmFsdWUuCisgICAgICAoIykgSW4gRE1BIG1vZGUsIEhBTF9TREFEQ19JbmplY3RlZENvbnZIYWxmQ3BsdENhbGxiYWNrIGFuZCAKKyAgICAgICAgICBIQUxfU0RBRENfSW5qZWN0ZWRDb252Q3BsdENhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHJlc3BlY3RpdmVseSBhdCB0aGUKKyAgICAgICAgICBoYWxmIHRyYW5zZmVyIGFuZCBhdCB0aGUgdHJhbnNmZXIgY29tcGxldGUuCisgICAgICAoIykgU3RvcCBpbmplY3RlZCBjb252ZXJzaW9uIHVzaW5nIEhBTF9TREFEQ19JbmplY3RlZFN0b3AsIAorICAgICAgICAgIEhBTF9TREFEQ19JbmplY3RlZFN0b3BfSVQgb3IgSEFMX1NEQURDX0luamVjdGVkU3RvcF9ETUEuCisKKyAgICAqKiogTXVsdGkgbW9kZSByZWd1bGFyIGNoYW5uZWxzIGNvbnZlcnNpb25zICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgjKSBTZWxlY3QgdHlwZSBvZiBtdWx0aW1vZGUgKFNEQURDMS9TREFEQzIgb3IgU0RBREMxL1NEQURDMykgdXNpbmcKKyAgICAgICAgICBIQUxfU0RBRENfTXVsdGlNb2RlQ29uZmlnQ2hhbm5lbC4KKyAgICAgICgjKSBTZWxlY3Qgc29mdHdhcmUgdHJpZ2dlciBmb3IgU0RBREMxIGFuZCBzeW5jaHJvbml6ZWQgdHJpZ2dlciBmb3IKKyAgICAgICAgICBTREFEQzIgKG9yIFNEQURDMykgdXNpbmcgSEFMX1NEQURDX1NlbGVjdFJlZ3VsYXJUcmlnZ2VyLgorICAgICAgKCMpIFNlbGVjdCByZWd1bGFyIGNoYW5uZWwgZm9yIFNEQURDMSBhbmQgU0RBREMyIChvciBTREFEQzMpIHVzaW5nCisgICAgICAgICAgSEFMX1NEQURDX0NvbmZpZ0NoYW5uZWwuCisgICAgICAoIykgU3RhcnQgcmVndWxhciBjb252ZXJzaW9uIGZvciBTREFEQzIgKG9yIFNEQURDMykgd2l0aCBIQUxfU0RBRENfU3RhcnQuCisgICAgICAoIykgU3RhcnQgcmVndWxhciBjb252ZXJzaW9uIGZvciBTREFEQzEgdXNpbmcgSEFMX1NEQURDX1N0YXJ0LCAKKyAgICAgICAgICBIQUxfU0RBRENfU3RhcnRfSVQgb3IgSEFMX1NEQURDX011bHRpTW9kZVN0YXJ0X0RNQS4KKyAgICAgICgjKSBJbiBwb2xsaW5nIG1vZGUsIHVzZSBIQUxfU0RBRENfUG9sbEZvckNvbnZlcnNpb24gdG8gZGV0ZWN0IHRoZSBlbmQgb2YKKyAgICAgICAgICByZWd1bGFyIGNvbnZlcnNpb24gZm9yIFNEQURDMS4KKyAgICAgICgjKSBJbiBpbnRlcnJ1cHQgbW9kZSwgSEFMX1NEQURDX0NvbnZDcGx0Q2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgYXQgdGhlIAorICAgICAgICAgIGVuZCBvZiByZWd1bGFyIGNvbnZlcnNpb24gZm9yIFNEQURDMS4KKyAgICAgICgjKSBHZXQgdmFsdWUgb2YgcmVndWxhciBjb252ZXJzaW9ucyB1c2luZyBIQUxfU0RBRENfTXVsdGlNb2RlR2V0VmFsdWUuCisgICAgICAoIykgSW4gRE1BIG1vZGUsIEhBTF9TREFEQ19Db252SGFsZkNwbHRDYWxsYmFjayBhbmQgCisgICAgICAgICAgSEFMX1NEQURDX0NvbnZDcGx0Q2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgcmVzcGVjdGl2ZWx5IGF0IHRoZSBoYWxmIAorICAgICAgICAgIHRyYW5zZmVyIGFuZCBhdCB0aGUgdHJhbnNmZXIgY29tcGxldGUgZm9yIFNEQURDMS4KKyAgICAgICgjKSBTdG9wIHJlZ3VsYXIgY29udmVyc2lvbiB1c2luZyBIQUxfU0RBRENfU3RvcCwgSEFMX1NEQURDX1N0b3BfSVQKKyAgICAgICAgICBvciBIQUxfU0RBRENfTXVsdGlNb2RlU3RvcF9ETUEgZm9yIFNEQURDMS4KKyAgICAgICgjKSBTdG9wIHJlZ3VsYXIgY29udmVyc2lvbiB1c2luZyBIQUxfU0RBRENfU3RvcCBmb3IgU0RBREMyIChvciBTREFEQzMpLgorCisgICAgKioqIE11bHRpIG1vZGUgaW5qZWN0ZWQgY2hhbm5lbHMgY29udmVyc2lvbnMgKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgKCMpIFNlbGVjdCB0eXBlIG9mIG11bHRpbW9kZSAoU0RBREMxL1NEQURDMiBvciBTREFEQzEvU0RBREMzKSB1c2luZworICAgICAgICAgIEhBTF9TREFEQ19JbmplY3RlZE11bHRpTW9kZUNvbmZpZ0NoYW5uZWwuCisgICAgICAoIykgU2VsZWN0IHNvZnR3YXJlIG9yIGV4dGVybmFsIHRyaWdnZXIgZm9yIFNEQURDMSBhbmQgc3luY2hyb25pemVkIAorICAgICAgICAgIHRyaWdnZXIgZm9yIFNEQURDMiAob3IgU0RBREMzKSB1c2luZyBIQUxfU0RBRENfU2VsZWN0SW5qZWN0ZWRUcmlnZ2VyLgorICAgICAgKCMpIFNlbGVjdCBpbmplY3RlZCBjaGFubmVscyBmb3IgU0RBREMxIGFuZCBTREFEQzIgKG9yIFNEQURDMykgdXNpbmcKKyAgICAgICAgICBIQUxfU0RBRENfSW5qZWN0ZWRDb25maWdDaGFubmVsLgorICAgICAgKCMpIFN0YXJ0IGluamVjdGVkIGNvbnZlcnNpb24gZm9yIFNEQURDMiAob3IgU0RBREMzKSB3aXRoIAorICAgICAgICAgIEhBTF9TREFEQ19JbmplY3RlZFN0YXJ0LgorICAgICAgKCMpIFN0YXJ0IGluamVjdGVkIGNvbnZlcnNpb24gZm9yIFNEQURDMSB1c2luZyBIQUxfU0RBRENfSW5qZWN0ZWRTdGFydCwKKyAgICAgICAgICBIQUxfU0RBRENfSW5qZWN0ZWRTdGFydF9JVCBvciBIQUxfU0RBRENfSW5qZWN0ZWRNdWx0aU1vZGVTdGFydF9ETUEuCisgICAgICAoIykgSW4gcG9sbGluZyBtb2RlLCB1c2UgSEFMX1NEQURDX0luamVjdGVkUG9sbEZvckNvbnZlcnNpb24gdG8gZGV0ZWN0IAorICAgICAgICAgIHRoZSBlbmQgb2YgaW5qZWN0ZWQgY29udmVyc2lvbiBmb3IgU0RBREMxLgorICAgICAgKCMpIEluIGludGVycnVwdCBtb2RlLCBIQUxfU0RBRENfSW5qZWN0ZWRDb252Q3BsdENhbGxiYWNrIHdpbGwgYmUgY2FsbGVkCisgICAgICAgICAgYXQgdGhlIGVuZCBvZiBpbmplY3RlZCBjb252ZXJzaW9uIGZvciBTREFEQzEuCisgICAgICAoIykgR2V0IHZhbHVlIG9mIGluamVjdGVkIGNvbnZlcnNpb25zIHVzaW5nIAorICAgICAgICAgIEhBTF9TREFEQ19JbmplY3RlZE11bHRpTW9kZUdldFZhbHVlLgorICAgICAgKCMpIEluIERNQSBtb2RlLCBIQUxfU0RBRENfSW5qZWN0ZWRDb252SGFsZkNwbHRDYWxsYmFjayBhbmQgCisgICAgICAgICAgSEFMX1NEQURDX0luamVjdGVkQ29udkNwbHRDYWxsYmFjayB3aWxsIGJlIGNhbGxlZCByZXNwZWN0aXZlbHkgYXQgdGhlCisgICAgICAgICAgaGFsZiB0cmFuc2ZlciBhbmQgYXQgdGhlIHRyYW5zZmVyIGNvbXBsZXRlIGZvciBTREFEQzEuCisgICAgICAoIykgU3RvcCBpbmplY3RlZCBjb252ZXJzaW9uIHVzaW5nIEhBTF9TREFEQ19JbmplY3RlZFN0b3AsIAorICAgICAgICAgIEhBTF9TREFEQ19JbmplY3RlZFN0b3BfSVQgb3IgSEFMX1NEQURDX0luamVjdGVkZE11bHRpTW9kZVN0b3BfRE1BCisgICAgICAgICAgZm9yIFNEQURDMS4KKyAgICAgICgjKSBTdG9wIGluamVjdGVkIGNvbnZlcnNpb24gdXNpbmcgSEFMX1NEQURDX0luamVjdGVkU3RvcCBmb3IgU0RBREMyCisgICAgICAgICAgKG9yIFNEQURDMykuCisKKyAgICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAKKyAgKi8gCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX1NEQURDX01PRFVMRV9FTkFCTEVECisjaWYgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKy8qKiBAZGVmZ3JvdXAgU0RBREMgU0RBREMKKyAgKiBAYnJpZWYgU0RBREMgSEFMIGRyaXZlciBtb2R1bGVzCisgICogQHsKKyAgKi8gCisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTREFEQ19Qcml2YXRlX0RlZmluZSBTREFEQyBQcml2YXRlIERlZmluZQorICogQHsKKyAqLworI2RlZmluZSBTREFEQ19USU1FT1VUICAgICAgICAgIDIwMFVMCisjZGVmaW5lIFNEQURDX0NPTkZSRUdfT0ZGU0VUICAgMHgwMDAwMDAyMFVMCisjZGVmaW5lIFNEQURDX0pEQVRBUl9DSF9PRkZTRVQgMjRVTAorI2RlZmluZSBTREFEQ19NU0JfTUFTSyAgICAgICAgIDB4RkZGRjAwMDBVTAorI2RlZmluZSBTREFEQ19MU0JfTUFTSyAgICAgICAgIDB4MDAwMEZGRkZVTAorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTREFEQ19Qcml2YXRlX0Z1bmN0aW9ucyBTREFEQyBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTREFEQ19FbnRlckluaXRNb2RlKFNEQURDX0hhbmRsZVR5cGVEZWYqIGhzZGFkYyk7CitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgU0RBRENfRXhpdEluaXRNb2RlKFNEQURDX0hhbmRsZVR5cGVEZWYqIGhzZGFkYyk7CitzdGF0aWMgdWludDMyX3QgICAgICAgICAgU0RBRENfR2V0SW5qQ2hhbm5lbHNOYnIodWludDMyX3QgQ2hhbm5lbHMpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNEQURDX1JlZ0NvbnZTdGFydChTREFEQ19IYW5kbGVUeXBlRGVmKiBoc2RhZGMpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNEQURDX1JlZ0NvbnZTdG9wKFNEQURDX0hhbmRsZVR5cGVEZWYqIGhzZGFkYyk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU0RBRENfSW5qQ29udlN0YXJ0KFNEQURDX0hhbmRsZVR5cGVEZWYqIGhzZGFkYyk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU0RBRENfSW5qQ29udlN0b3AoU0RBRENfSGFuZGxlVHlwZURlZiogaHNkYWRjKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICBTREFEQ19ETUFSZWd1bGFySGFsZkNvbnZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICBTREFEQ19ETUFSZWd1bGFyQ29udkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgICAgICAgICAgICAgIFNEQURDX0RNQUluamVjdGVkSGFsZkNvbnZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICBTREFEQ19ETUFJbmplY3RlZENvbnZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICBTREFEQ19ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBTREFEQ19FeHBvcnRlZF9GdW5jdGlvbnMgU0RBREMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBTREFEQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAKKyAqCitAdmVyYmF0aW0gICAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBJbml0aWFsaXplIHRoZSBTREFEQy4gCisgICAgICAoKykgRGUtaW5pdGlhbGl6ZSB0aGUgU0RBREMuIAorICAgICAgICAgCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBTREFEQyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgU0RBRENfSW5pdFR5cGVEZWYgc3RydWN0dXJlLgorICAqIEBub3RlICAgSWYgbXVsdGlwbGUgU0RBREMgYXJlIHVzZWQsIHBsZWFzZSBjb25maWd1cmUgZmlyc3QgU0RBREMxIHRvIHNldAorICAqICAgICAgICAgdGhlIGNvbW1vbiByZWZlcmVuY2Ugdm9sdGFnZS4KKyAgKiBAcGFyYW0gIGhzZGFkYyBTREFEQyBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzLgorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEQURDX0luaXQoU0RBRENfSGFuZGxlVHlwZURlZiogaHNkYWRjKQoreworICAvKiBDaGVjayBTREFEQyBoYW5kbGUgKi8KKyAgaWYoaHNkYWRjID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIAorICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TREFEQ19BTExfSU5TVEFOQ0UoaHNkYWRjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU0RBRENfTE9XUE9XRVJfTU9ERShoc2RhZGMtPkluaXQuSWRsZUxvd1Bvd2VyTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU0RBRENfRkFTVF9DT05WX01PREUoaHNkYWRjLT5Jbml0LkZhc3RDb252ZXJzaW9uTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU0RBRENfU0xPV19DTE9DS19NT0RFKGhzZGFkYy0+SW5pdC5TbG93Q2xvY2tNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19TREFEQ19WUkVGKGhzZGFkYy0+SW5pdC5SZWZlcmVuY2VWb2x0YWdlKSk7CisgIAorICAvKiBJbml0aWFsaXplIFNEQURDIHZhcmlhYmxlcyB3aXRoIGRlZmF1bHQgdmFsdWVzICovCisgIGhzZGFkYy0+UmVndWxhckNvbnRNb2RlICAgICA9IFNEQURDX0NPTlRJTlVPVVNfQ09OVl9PRkY7CisgIGhzZGFkYy0+SW5qZWN0ZWRDb250TW9kZSAgICA9IFNEQURDX0NPTlRJTlVPVVNfQ09OVl9PRkY7CisgIGhzZGFkYy0+SW5qZWN0ZWRDaGFubmVsc05iciA9IDFVOworICBoc2RhZGMtPkluakNvbnZSZW1haW5pbmcgICAgPSAxVTsKKyAgaHNkYWRjLT5SZWd1bGFyVHJpZ2dlciAgICAgID0gU0RBRENfU09GVFdBUkVfVFJJR0dFUjsKKyAgaHNkYWRjLT5JbmplY3RlZFRyaWdnZXIgICAgID0gU0RBRENfU09GVFdBUkVfVFJJR0dFUjsKKyAgaHNkYWRjLT5FeHRUcmlnZ2VyRWRnZSAgICAgID0gU0RBRENfRVhUX1RSSUdfUklTSU5HX0VER0U7CisgIGhzZGFkYy0+UmVndWxhck11bHRpbW9kZSAgICA9IFNEQURDX01VTFRJTU9ERV9TREFEQzFfU0RBREMyOworICBoc2RhZGMtPkluamVjdGVkTXVsdGltb2RlICAgPSBTREFEQ19NVUxUSU1PREVfU0RBREMxX1NEQURDMjsKKyAgaHNkYWRjLT5FcnJvckNvZGUgICAgICAgICAgID0gU0RBRENfRVJST1JfTk9ORTsKKyAgICAKKyAgLyogQ2FsbCBNU1AgaW5pdCBmdW5jdGlvbiAqLworICBIQUxfU0RBRENfTXNwSW5pdChoc2RhZGMpOworICAKKyAgLyogU2V0IGlkbGUgbG93IHBvd2VyIGFuZCBzbG93IGNsb2NrIG1vZGVzICovCisgIGhzZGFkYy0+SW5zdGFuY2UtPkNSMSAmPSB+KFNEQURDX0NSMV9TQkl8U0RBRENfQ1IxX1BESXxTREFEQ19DUjFfU0xPV0NLKTsKKyAgaHNkYWRjLT5JbnN0YW5jZS0+Q1IxIHw9IChoc2RhZGMtPkluaXQuSWRsZUxvd1Bvd2VyTW9kZSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoc2RhZGMtPkluaXQuU2xvd0Nsb2NrTW9kZSk7CisKKyAgLyogU2V0IGZhc3QgY29udmVyc2lvbiBtb2RlICovCisgIGhzZGFkYy0+SW5zdGFuY2UtPkNSMiAmPSB+KFNEQURDX0NSMl9GQVNUKTsKKyAgaHNkYWRjLT5JbnN0YW5jZS0+Q1IyIHw9IGhzZGFkYy0+SW5pdC5GYXN0Q29udmVyc2lvbk1vZGU7CisKKyAgLyogU2V0IHJlZmVyZW5jZSB2b2x0YWdlIGNvbW1vbiB0byBhbGwgU0RBREMgaW5zdGFuY2VzICovCisgIC8qIFVwZGF0ZSB0aGlzIHBhcmFtZXRlciBvbmx5IGlmIG5lZWRlZCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBzZXR0bGluZyB0aW1lICovCisgIGlmKChTREFEQzEtPkNSMSAmIFNEQURDX0NSMV9SRUZWKSAhPSBoc2RhZGMtPkluaXQuUmVmZXJlbmNlVm9sdGFnZSkKKyAgeworICAgIC8qIFZvbHRhZ2UgcmVmZXJlbmNlIGJpdHMgYXJlIGNvbW1vbiB0byBhbGwgU0FEQyBpbnN0YW5jZXMgYnV0IGFyZSAgICAgICAgKi8KKyAgICAvKiBwcmVzZW50IGluIFNEQURDMSByZWdpc3Rlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgU0RBREMxLT5DUjEgJj0gfihTREFEQ19DUjFfUkVGVik7CisgICAgU0RBREMxLT5DUjEgfD0gaHNkYWRjLT5Jbml0LlJlZmVyZW5jZVZvbHRhZ2U7CisgICAgCisgICAgLyogV2FpdCBhdCBsZWFzdCAybXMgYmVmb3JlIHNldHRpbmcgQURPTiAqLworICAgIEhBTF9EZWxheSgyVSk7CisgIH0KKyAgCisgIC8qIEVuYWJsZSBTREFEQyAqLworICBoc2RhZGMtPkluc3RhbmNlLT5DUjIgfD0gU0RBRENfQ1IyX0FET047CisKKyAgLyogV2FpdCBlbmQgb2Ygc3RhYmlsaXphdGlvbiAqLworICB3aGlsZSgoaHNkYWRjLT5JbnN0YW5jZS0+SVNSICYgU0RBRENfSVNSX1NUQUJJUCkgIT0gMFVMKQorICB7CisgIH0KKyAgCisgIC8qIFNldCBTREFEQyB0byByZWFkeSBzdGF0ZSAqLworICBoc2RhZGMtPlN0YXRlID0gSEFMX1NEQURDX1NUQVRFX1JFQURZOworICAKKyAgLyogUmV0dXJuIEhBTCBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKyAgCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemVzIHRoZSBTREFEQy4KKyAgKiBAcGFyYW0gIGhzZGFkYyBTREFEQyBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzLgorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEQURDX0RlSW5pdChTREFEQ19IYW5kbGVUeXBlRGVmKiBoc2RhZGMpCit7CisgIC8qIENoZWNrIFNEQURDIGhhbmRsZSAqLworICBpZihoc2RhZGMgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TREFEQ19BTExfSU5TVEFOQ0UoaHNkYWRjLT5JbnN0YW5jZSkpOworCisgIC8qIERpc2FibGUgdGhlIFNEQURDICovCisgIGhzZGFkYy0+SW5zdGFuY2UtPkNSMiAmPSB+KFNEQURDX0NSMl9BRE9OKTsKKworICAvKiBSZXNldCBhbGwgcmVnaXN0ZXJzICovCisgIGhzZGFkYy0+SW5zdGFuY2UtPkNSMSAgICAgID0gMHgwMDAwMDAwMFVMOworICBoc2RhZGMtPkluc3RhbmNlLT5DUjIgICAgICA9IDB4MDAwMDAwMDBVTDsKKyAgaHNkYWRjLT5JbnN0YW5jZS0+SkNIR1IgICAgPSAweDAwMDAwMDAxVUw7CisgIGhzZGFkYy0+SW5zdGFuY2UtPkNPTkYwUiAgID0gMHgwMDAwMDAwMFVMOworICBoc2RhZGMtPkluc3RhbmNlLT5DT05GMVIgICA9IDB4MDAwMDAwMDBVTDsKKyAgaHNkYWRjLT5JbnN0YW5jZS0+Q09ORjJSICAgPSAweDAwMDAwMDAwVUw7CisgIGhzZGFkYy0+SW5zdGFuY2UtPkNPTkZDSFIxID0gMHgwMDAwMDAwMFVMOworICBoc2RhZGMtPkluc3RhbmNlLT5DT05GQ0hSMiA9IDB4MDAwMDAwMDBVTDsKKworICAvKiBDYWxsIE1TUCBkZWluaXQgZnVuY3Rpb24gKi8KKyAgSEFMX1NEQURDX01zcERlSW5pdChoc2RhZGMpOworCisgIC8qIFNldCBTREFEQyBpbiByZXNldCBzdGF0ZSAqLworICBoc2RhZGMtPlN0YXRlID0gSEFMX1NEQURDX1NUQVRFX1JFU0VUOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKyAgICAKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFNEQURDIE1TUC4KKyAgKiBAcGFyYW0gIGhzZGFkYyBTREFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TREFEQ19Nc3BJbml0KFNEQURDX0hhbmRsZVR5cGVEZWYqIGhzZGFkYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNkYWRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NEQURDX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovIAorfQorCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemVzIHRoZSBTREFEQyBNU1AuCisgICogQHBhcmFtICBoc2RhZGMgU0RBREMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU0RBRENfTXNwRGVJbml0KFNEQURDX0hhbmRsZVR5cGVEZWYqIGhzZGFkYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNkYWRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NEQURDX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8gCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU0RBRENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBwZXJpcGhlcmFsIGNvbnRyb2wgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIFBlcmlwaGVyYWwgY29udHJvbCBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0gICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIGNvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgUHJvZ3JhbSBvbmUgb2YgdGhlIHRocmVlIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucyBmb3IgY2hhbm5lbHMuCisgICAgICAoKykgQXNzb2NpYXRlIGNoYW5uZWwgdG8gb25lIG9mIGNvbmZpZ3VyYXRpb25zLgorICAgICAgKCspIFNlbGVjdCByZWd1bGFyIGFuZCBpbmplY3RlZCBjaGFubmVscy4KKyAgICAgICgrKSBFbmFibGUvZGlzYWJsZSBjb250aW51b3VzIG1vZGUgZm9yIHJlZ3VsYXIgYW5kIGluamVjdGVkIGNvbnZlcnNpb25zLgorICAgICAgKCspIFNlbGVjdCByZWd1bGFyIGFuZCBpbmplY3RlZCB0cmlnZ2Vycy4KKyAgICAgICgrKSBTZWxlY3QgYW5kIGNvbmZpZ3VyZSBpbmplY3RlZCBleHRlcm5hbCB0cmlnZ2VyLgorICAgICAgKCspIEVuYWJsZS9kaXNhYmxlIGRlbGF5IGFkZGl0aW9uIGZvciBpbmplY3RlZCBjb252ZXJzaW9ucy4KKyAgICAgICgrKSBDb25maWd1cmUgbXVsdGltb2RlLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSB1c2VyIHRvIHNldCBwYXJhbWV0ZXJzIGZvciBhIGNvbmZpZ3VyYXRpb24uCisgICogICAgICAgICBQYXJhbWV0ZXJzIGFyZSBpbnB1dCBtb2RlLCBjb21tb24gbW9kZSwgZ2FpbiBhbmQgb2Zmc2V0LgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiBTREFEQyBpbnN0YW5jZSBpcyBpbiBpZGxlIHN0YXRlCisgICogICAgICAgICAobmVpdGhlciBjYWxpYnJhdGlvbiBub3IgcmVndWxhciBvciBpbmplY3RlZCBjb252ZXJzaW9uIG9uZ29pbmcpCisgICogQHBhcmFtICBoc2RhZGMgU0RBREMgaGFuZGxlLgorICAqIEBwYXJhbSAgQ29uZkluZGV4IEluZGV4IG9mIGNvbmZpZ3VyYXRpb24gdG8gbW9kaWZ5LgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTREFEQ19Db25mSW5kZXguCisgICogQHBhcmFtICBDb25mUGFyYW1TdHJ1Y3QgUGFyYW1ldGVycyB0byBhcHBseSBmb3IgdGhpcyBjb25maWd1cmF0aW9uLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEQURDX1ByZXBhcmVDaGFubmVsQ29uZmlnKFNEQURDX0hhbmRsZVR5cGVEZWYgKmhzZGFkYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ29uZkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEQURDX0NvbmZQYXJhbVR5cGVEZWYqIENvbmZQYXJhbVN0cnVjdCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworICB1aW50MzJfdCAgICAgICAgICB0bXA7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU0RBRENfQUxMX0lOU1RBTkNFKGhzZGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NEQURDX0NPTkZfSU5ERVgoQ29uZkluZGV4KSk7CisgIGFzc2VydF9wYXJhbShDb25mUGFyYW1TdHJ1Y3QgIT0gKCh2b2lkKikgMCkpOworICBhc3NlcnRfcGFyYW0oSVNfU0RBRENfSU5QVVRfTU9ERShDb25mUGFyYW1TdHJ1Y3QtPklucHV0TW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU0RBRENfR0FJTihDb25mUGFyYW1TdHJ1Y3QtPkdhaW4pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NEQURDX0NPTU1PTl9NT0RFKENvbmZQYXJhbVN0cnVjdC0+Q29tbW9uTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU0RBRENfT0ZGU0VUX1ZBTFVFKENvbmZQYXJhbVN0cnVjdC0+T2Zmc2V0KSk7CisKKyAgLyogQ2hlY2sgU0RBREMgc3RhdGUgaXMgcmVhZHkgKi8KKyAgaWYoaHNkYWRjLT5TdGF0ZSAhPSBIQUxfU0RBRENfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogRW50ZXIgaW5pdCBtb2RlICovCisgICAgaWYoU0RBRENfRW50ZXJJbml0TW9kZShoc2RhZGMpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBTZXQgU0RBREMgaW4gZXJyb3Igc3RhdGUgKi8KKyAgICAgIGhzZGFkYy0+U3RhdGUgPSBIQUxfU0RBRENfU1RBVEVfRVJST1I7CisgICAgICBzdGF0dXMgPSBIQUxfVElNRU9VVDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFByb2dyYW0gY29uZmlndXJhdGlvbiByZWdpc3RlciB3aXRoIHBhcmFtZXRlcnMgKi8KKyAgICAgIHRtcCA9ICh1aW50MzJfdCkoKHVpbnQzMl90KShoc2RhZGMtPkluc3RhbmNlKSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgU0RBRENfQ09ORlJFR19PRkZTRVQgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkoQ29uZkluZGV4IDw8IDJVTCkpOworICAgICAgKihfX0lPIHVpbnQzMl90ICopICh0bXApID0gKHVpbnQzMl90KSAoQ29uZlBhcmFtU3RydWN0LT5JbnB1dE1vZGUgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25mUGFyYW1TdHJ1Y3QtPkdhaW4gfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25mUGFyYW1TdHJ1Y3QtPkNvbW1vbk1vZGUgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25mUGFyYW1TdHJ1Y3QtPk9mZnNldCk7CisgICAgICAvKiBFeGl0IGluaXQgbW9kZSAqLworICAgICAgU0RBRENfRXhpdEluaXRNb2RlKGhzZGFkYyk7CisgICAgfQorICB9CisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgdXNlciB0byBhc3NvY2lhdGUgYSBjaGFubmVsIHdpdGggb25lIG9mIHRoZQorICAqICAgICAgICAgYXZhaWxhYmxlIGNvbmZpZ3VyYXRpb25zLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiBTREFEQyBpbnN0YW5jZSBpcyBpbiBpZGxlIHN0YXRlCisgICogICAgICAgICAobmVpdGhlciBjYWxpYnJhdGlvbiBub3IgcmVndWxhciBvciBpbmplY3RlZCBjb252ZXJzaW9uIG9uZ29pbmcpCisgICogQHBhcmFtICBoc2RhZGMgU0RBREMgaGFuZGxlLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBDaGFubmVsIHRvIGFzc29jaWF0ZSB3aXRoIGNvbmZpZ3VyYXRpb24uCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNEQURDX0NoYW5uZWxfU2VsZWN0aW9uLgorICAqIEBwYXJhbSAgQ29uZkluZGV4IEluZGV4IG9mIGNvbmZpZ3VyYXRpb24gdG8gYXNzb2NpYXRlIHdpdGggY2hhbm5lbC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU0RBRENfQ29uZkluZGV4LgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEQURDX0Fzc29jaWF0ZUNoYW5uZWxDb25maWcoU0RBRENfSGFuZGxlVHlwZURlZiAqaHNkYWRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENvbmZJbmRleCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworICB1aW50MzJfdCAgICAgICAgICBjaGFubmVsbnVtOworCisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NEQURDX0FMTF9JTlNUQU5DRShoc2RhZGMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19TREFEQ19SRUdVTEFSX0NIQU5ORUwoQ2hhbm5lbCkpOworICBhc3NlcnRfcGFyYW0oSVNfU0RBRENfQ09ORl9JTkRFWChDb25mSW5kZXgpKTsKKworICAvKiBDaGVjayBTREFEQyBzdGF0ZSBpcyByZWFkeSAqLworICBpZihoc2RhZGMtPlN0YXRlICE9IEhBTF9TREFEQ19TVEFURV9SRUFEWSkKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBFbnRlciBpbml0IG1vZGUgKi8KKyAgICBpZihTREFEQ19FbnRlckluaXRNb2RlKGhzZGFkYykgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFNldCBTREFEQyBpbiBlcnJvciBzdGF0ZSAqLworICAgICAgaHNkYWRjLT5TdGF0ZSA9IEhBTF9TREFEQ19TVEFURV9FUlJPUjsKKyAgICAgIHN0YXR1cyA9IEhBTF9USU1FT1VUOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogUHJvZ3JhbSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgYWNjb3JkaW5nIHBhcmFtZXRlcnMgKi8KKyAgICAgIGlmKENoYW5uZWwgIT0gU0RBRENfQ0hBTk5FTF84KQorICAgICAgeworICAgICAgICAvKiBHZXQgY2hhbm5lbCBudW1iZXIgKi8KKyAgICAgICAgY2hhbm5lbG51bSA9ICh1aW50MzJfdCkoQ2hhbm5lbD4+MTZVTCk7CisKKyAgICAgICAgLyogU2V0IHRoZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgICAgaHNkYWRjLT5JbnN0YW5jZS0+Q09ORkNIUjEgJj0gKHVpbnQzMl90KSB+KCh1aW50MzJfdClTREFEQ19DT05GQ0hSMV9DT05GQ0gwIDw8ICgoY2hhbm5lbG51bSA8PCAyVUwpICYgMHgxRlVMKSk7CisgICAgICAgIGhzZGFkYy0+SW5zdGFuY2UtPkNPTkZDSFIxIHw9ICh1aW50MzJfdCkgKENvbmZJbmRleCA8PCAoKGNoYW5uZWxudW0gPDwgMlVMKSAmIDB4MUZVTCkpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBoc2RhZGMtPkluc3RhbmNlLT5DT05GQ0hSMiA9ICh1aW50MzJfdCkgKENvbmZJbmRleCk7CisgICAgICB9ICAgICAgCisgICAgICAvKiBFeGl0IGluaXQgbW9kZSAqLworICAgICAgU0RBRENfRXhpdEluaXRNb2RlKGhzZGFkYyk7CisgICAgfQorICB9CisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byBzZWxlY3QgY2hhbm5lbCBmb3IgcmVndWxhciBjb252ZXJzaW9uIGFuZAorICAqICAgICAgICAgdG8gZW5hYmxlL2Rpc2FibGUgY29udGludW91cyBtb2RlIGZvciByZWd1bGFyIGNvbnZlcnNpb24uCisgICogQHBhcmFtICBoc2RhZGMgU0RBREMgaGFuZGxlLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBDaGFubmVsIGZvciByZWd1bGFyIGNvbnZlcnNpb24uCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNEQURDX0NoYW5uZWxfU2VsZWN0aW9uLgorICAqIEBwYXJhbSAgQ29udGludW91c01vZGUgRW5hYmxlL2Rpc2FibGUgY29udGludW91cyBtb2RlIGZvciByZWd1bGFyIGNvbnZlcnNpb24uCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNEQURDX0NvbnRpbnVvdXNNb2RlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEQURDX0NvbmZpZ0NoYW5uZWwoU0RBRENfSGFuZGxlVHlwZURlZiAqaHNkYWRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENvbnRpbnVvdXNNb2RlKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU0RBRENfQUxMX0lOU1RBTkNFKGhzZGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NEQURDX1JFR1VMQVJfQ0hBTk5FTChDaGFubmVsKSk7CisgIGFzc2VydF9wYXJhbShJU19TREFEQ19DT05USU5VT1VTX01PREUoQ29udGludW91c01vZGUpKTsKKyAgCisgIC8qIENoZWNrIFNEQURDIHN0YXRlICovCisgIGlmKChoc2RhZGMtPlN0YXRlICE9IEhBTF9TREFEQ19TVEFURV9SRVNFVCkgJiYgKGhzZGFkYy0+U3RhdGUgIT0gSEFMX1NEQURDX1NUQVRFX0VSUk9SKSkKKyAgeworICAgIC8qIFNldCBSQ0hbMzowXSBhbmQgUkNPTlQgYml0cyBpbiBTREFEQ19DUjIgKi8KKyAgICBoc2RhZGMtPkluc3RhbmNlLT5DUjIgJj0gKHVpbnQzMl90KSB+KFNEQURDX0NSMl9SQ0ggfCBTREFEQ19DUjJfUkNPTlQpOworICAgIGlmKENvbnRpbnVvdXNNb2RlID09IFNEQURDX0NPTlRJTlVPVVNfQ09OVl9PTikKKyAgICB7CisgICAgICBoc2RhZGMtPkluc3RhbmNlLT5DUjIgfD0gKHVpbnQzMl90KSAoKENoYW5uZWwgJiBTREFEQ19NU0JfTUFTSykgfCBTREFEQ19DUjJfUkNPTlQpOyAgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhzZGFkYy0+SW5zdGFuY2UtPkNSMiB8PSAodWludDMyX3QpICgoQ2hhbm5lbCAmIFNEQURDX01TQl9NQVNLKSk7ICAgIAorICAgIH0KKyAgICAvKiBTdG9yZSBjb250aW51b3VzIG1vZGUgaW5mb3JtYXRpb24gKi8KKyAgICBoc2RhZGMtPlJlZ3VsYXJDb250TW9kZSA9IENvbnRpbnVvdXNNb2RlOworICB9CisgIGVsc2UKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gc2VsZWN0IGNoYW5uZWxzIGZvciBpbmplY3RlZCBjb252ZXJzaW9uIGFuZAorICAqICAgICAgICAgdG8gZW5hYmxlL2Rpc2FibGUgY29udGludW91cyBtb2RlIGZvciBpbmplY3RlZCBjb252ZXJzaW9uLgorICAqIEBwYXJhbSAgaHNkYWRjIFNEQURDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIENoYW5uZWwgQ2hhbm5lbHMgZm9yIGluamVjdGVkIGNvbnZlcnNpb24uCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZXMgY29tYmluYXRpb24gb2YgQHJlZiBTREFEQ19DaGFubmVsX1NlbGVjdGlvbi4KKyAgKiBAcGFyYW0gIENvbnRpbnVvdXNNb2RlIEVuYWJsZS9kaXNhYmxlIGNvbnRpbnVvdXMgbW9kZSBmb3IgaW5qZWN0ZWQgY29udmVyc2lvbi4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU0RBRENfQ29udGludW91c01vZGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RBRENfSW5qZWN0ZWRDb25maWdDaGFubmVsKFNEQURDX0hhbmRsZVR5cGVEZWYgKmhzZGFkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ29udGludW91c01vZGUpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TREFEQ19BTExfSU5TVEFOQ0UoaHNkYWRjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU0RBRENfSU5KRUNURURfQ0hBTk5FTChDaGFubmVsKSk7CisgIGFzc2VydF9wYXJhbShJU19TREFEQ19DT05USU5VT1VTX01PREUoQ29udGludW91c01vZGUpKTsKKyAgCisgIC8qIENoZWNrIFNEQURDIHN0YXRlICovCisgIGlmKChoc2RhZGMtPlN0YXRlICE9IEhBTF9TREFEQ19TVEFURV9SRVNFVCkgJiYgKGhzZGFkYy0+U3RhdGUgIT0gSEFMX1NEQURDX1NUQVRFX0VSUk9SKSkKKyAgeworICAgIC8qIFNldCBKQ0hHWzg6MF0gYml0cyBpbiBTREFEQ19KQ0hHICovCisgICAgaHNkYWRjLT5JbnN0YW5jZS0+SkNIR1IgPSAodWludDMyX3QpIChDaGFubmVsICYgU0RBRENfTFNCX01BU0spOworICAgIC8qIFNldCBvciBjbGVhciBKQ09OVCBiaXQgaW4gU0RBRENfQ1IyICovCisgICAgaWYoQ29udGludW91c01vZGUgPT0gU0RBRENfQ09OVElOVU9VU19DT05WX09OKQorICAgIHsKKyAgICAgIGhzZGFkYy0+SW5zdGFuY2UtPkNSMiB8PSBTREFEQ19DUjJfSkNPTlQ7ICAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHNkYWRjLT5JbnN0YW5jZS0+Q1IyICY9IH4oU0RBRENfQ1IyX0pDT05UKTsKKyAgICB9CisgICAgLyogU3RvcmUgY29udGludW91cyBtb2RlIGluZm9ybWF0aW9uICovCisgICAgaHNkYWRjLT5JbmplY3RlZENvbnRNb2RlID0gQ29udGludW91c01vZGU7CisgICAgLyogU3RvcmUgbnVtYmVyIG9mIGluamVjdGVkIGNoYW5uZWxzICovCisgICAgaHNkYWRjLT5JbmplY3RlZENoYW5uZWxzTmJyID0gU0RBRENfR2V0SW5qQ2hhbm5lbHNOYnIoQ2hhbm5lbCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byBzZWxlY3QgdHJpZ2dlciBmb3IgcmVndWxhciBjb252ZXJzaW9ucy4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQgaWYgcmVndWxhciBjb252ZXJzaW9uIGlzIG9uZ29pbmcuCisgICogQHBhcmFtICBoc2RhZGMgU0RBREMgaGFuZGxlLgorICAqIEBwYXJhbSAgVHJpZ2dlciBUcmlnZ2VyIGZvciByZWd1bGFyIGNvbnZlcnNpb25zLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlIDoKKyAgKiAgICAgICAgICAgIEBhcmcgU0RBRENfU09GVFdBUkVfVFJJR0dFUiA6IFNvZnR3YXJlIHRyaWdnZXIuCisgICogICAgICAgICAgICBAYXJnIFNEQURDX1NZTkNIUk9OT1VTX1RSSUdHRVIgOiBTeW5jaHJvbm91cyB3aXRoIFNEQURDMSAob25seSBmb3IgU0RBREMyIGFuZCBTREFEQzMpLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEQURDX1NlbGVjdFJlZ3VsYXJUcmlnZ2VyKFNEQURDX0hhbmRsZVR5cGVEZWYgKmhzZGFkYywgdWludDMyX3QgVHJpZ2dlcikKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NEQURDX0FMTF9JTlNUQU5DRShoc2RhZGMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19TREFEQ19SRUdVTEFSX1RSSUdHRVIoVHJpZ2dlcikpOworCisgIC8qIENoZWNrIHBhcmFtZXRlcnMgY29tcGF0aWJpbGl0eSAqLworICBpZigoaHNkYWRjLT5JbnN0YW5jZSA9PSBTREFEQzEpICYmIChUcmlnZ2VyID09IFNEQURDX1NZTkNIUk9OT1VTX1RSSUdHRVIpKQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIC8qIENoZWNrIFNEQURDIHN0YXRlICovCisgIGVsc2UgaWYoKGhzZGFkYy0+U3RhdGUgPT0gSEFMX1NEQURDX1NUQVRFX1JFQURZKSB8fCBcCisgICAgICAgICAgKGhzZGFkYy0+U3RhdGUgPT0gSEFMX1NEQURDX1NUQVRFX0NBTElCKSB8fCBcCisgICAgICAgICAgKGhzZGFkYy0+U3RhdGUgPT0gSEFMX1NEQURDX1NUQVRFX0lOSikpCisgIHsKKyAgICAvKiBTdG9yZSByZWd1bGFyIHRyaWdnZXIgaW5mb3JtYXRpb24gKi8KKyAgICBoc2RhZGMtPlJlZ3VsYXJUcmlnZ2VyID0gVHJpZ2dlcjsKKyAgfQorICBlbHNlCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7ICAgIAorICB9CisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byBzZWxlY3QgdHJpZ2dlciBmb3IgaW5qZWN0ZWQgY29udmVyc2lvbnMuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgY2FsbGVkIGlmIGluamVjdGVkIGNvbnZlcnNpb24gaXMgb25nb2luZy4KKyAgKiBAcGFyYW0gIGhzZGFkYyBTREFEQyBoYW5kbGUuCisgICogQHBhcmFtICBUcmlnZ2VyIFRyaWdnZXIgZm9yIGluamVjdGVkIGNvbnZlcnNpb25zLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlIDoKKyAgKiAgICAgICAgICAgIEBhcmcgU0RBRENfU09GVFdBUkVfVFJJR0dFUiA6IFNvZnR3YXJlIHRyaWdnZXIuCisgICogICAgICAgICAgICBAYXJnIFNEQURDX1NZTkNIUk9OT1VTX1RSSUdHRVIgOiBTeW5jaHJvbm91cyB3aXRoIFNEQURDMSAob25seSBmb3IgU0RBREMyIGFuZCBTREFEQzMpLgorICAqICAgICAgICAgICAgQGFyZyBTREFEQ19FWFRFUk5BTF9UUklHR0VSIDogRXh0ZXJuYWwgdHJpZ2dlci4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TREFEQ19TZWxlY3RJbmplY3RlZFRyaWdnZXIoU0RBRENfSGFuZGxlVHlwZURlZiAqaHNkYWRjLCB1aW50MzJfdCBUcmlnZ2VyKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU0RBRENfQUxMX0lOU1RBTkNFKGhzZGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NEQURDX0lOSkVDVEVEX1RSSUdHRVIoVHJpZ2dlcikpOworCisgIC8qIENoZWNrIHBhcmFtZXRlcnMgY29tcGF0aWJpbGl0eSAqLworICBpZigoaHNkYWRjLT5JbnN0YW5jZSA9PSBTREFEQzEpICYmIChUcmlnZ2VyID09IFNEQURDX1NZTkNIUk9OT1VTX1RSSUdHRVIpKQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIC8qIENoZWNrIFNEQURDIHN0YXRlICovCisgIGVsc2UgaWYoKGhzZGFkYy0+U3RhdGUgPT0gSEFMX1NEQURDX1NUQVRFX1JFQURZKSB8fCBcCisgICAgICAgICAgKGhzZGFkYy0+U3RhdGUgPT0gSEFMX1NEQURDX1NUQVRFX0NBTElCKSB8fCBcCisgICAgICAgICAgKGhzZGFkYy0+U3RhdGUgPT0gSEFMX1NEQURDX1NUQVRFX1JFRykpCisgIHsKKyAgICAvKiBTdG9yZSByZWd1bGFyIHRyaWdnZXIgaW5mb3JtYXRpb24gKi8KKyAgICBoc2RhZGMtPkluamVjdGVkVHJpZ2dlciA9IFRyaWdnZXI7CisgIH0KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOyAgICAKKyAgfQorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gc2VsZWN0IGFuZCBjb25maWd1cmUgaW5qZWN0ZWQgZXh0ZXJuYWwgdHJpZ2dlci4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBvbmx5IHdoZW4gU0RBREMgaW5zdGFuY2UgaXMgaW4gaWRsZSBzdGF0ZQorICAqICAgICAgICAgKG5laXRoZXIgY2FsaWJyYXRpb24gbm9yIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgY29udmVyc2lvbiBvbmdvaW5nKQorICAqIEBwYXJhbSAgaHNkYWRjIFNEQURDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIEluamVjdGVkRXh0VHJpZ2dlciBFeHRlcm5hbCB0cmlnZ2VyIGZvciBpbmplY3RlZCBjb252ZXJzaW9ucy4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU0RBRENfSW5qZWN0ZWRFeHRUcmlnZ2VyLgorICAqIEBwYXJhbSAgRXh0VHJpZ2dlckVkZ2UgRWRnZSBvZiBleHRlcm5hbCBpbmplY3RlZCB0cmlnZ2VyLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTREFEQ19FeHRUcmlnZ2VyRWRnZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TREFEQ19TZWxlY3RJbmplY3RlZEV4dFRyaWdnZXIoU0RBRENfSGFuZGxlVHlwZURlZiAqaHNkYWRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBJbmplY3RlZEV4dFRyaWdnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEV4dFRyaWdnZXJFZGdlKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU0RBRENfQUxMX0lOU1RBTkNFKGhzZGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NEQURDX0VYVF9JTkpFQ19UUklHKEluamVjdGVkRXh0VHJpZ2dlcikpOworICBhc3NlcnRfcGFyYW0oSVNfU0RBRENfRVhUX1RSSUdfRURHRShFeHRUcmlnZ2VyRWRnZSkpOworCisgIC8qIENoZWNrIFNEQURDIHN0YXRlICovCisgIGlmKGhzZGFkYy0+U3RhdGUgPT0gSEFMX1NEQURDX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogRW50ZXIgaW5pdCBtb2RlICovCisgICAgaWYoU0RBRENfRW50ZXJJbml0TW9kZShoc2RhZGMpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBTZXQgU0RBREMgaW4gZXJyb3Igc3RhdGUgKi8KKyAgICAgIGhzZGFkYy0+U3RhdGUgPSBIQUxfU0RBRENfU1RBVEVfRVJST1I7CisgICAgICBzdGF0dXMgPSBIQUxfVElNRU9VVDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFNldCBKRVhUU0VMWzI6MF0gYml0cyBpbiBTREFEQ19DUjIgcmVnaXN0ZXIgKi8KKyAgICAgIGhzZGFkYy0+SW5zdGFuY2UtPkNSMiAmPSB+KFNEQURDX0NSMl9KRVhUU0VMKTsKKyAgICAgIGhzZGFkYy0+SW5zdGFuY2UtPkNSMiB8PSBJbmplY3RlZEV4dFRyaWdnZXI7CisKKyAgICAgIC8qIFN0b3JlIGV4dGVybmFsIHRyaWdnZXIgZWRnZSBpbmZvcm1hdGlvbiAqLworICAgICAgaHNkYWRjLT5FeHRUcmlnZ2VyRWRnZSA9IEV4dFRyaWdnZXJFZGdlOworCisgICAgICAvKiBFeGl0IGluaXQgbW9kZSAqLworICAgICAgU0RBRENfRXhpdEluaXRNb2RlKGhzZGFkYyk7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gZW5hYmxlL2Rpc2FibGUgZGVsYXkgYWRkaXRpb24gZm9yIGluamVjdGVkIGNvbnZlcnNpb25zLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiBTREFEQyBpbnN0YW5jZSBpcyBpbiBpZGxlIHN0YXRlCisgICogICAgICAgICAobmVpdGhlciBjYWxpYnJhdGlvbiBub3IgcmVndWxhciBvciBpbmplY3RlZCBjb252ZXJzaW9uIG9uZ29pbmcpCisgICogQHBhcmFtICBoc2RhZGMgU0RBREMgaGFuZGxlLgorICAqIEBwYXJhbSAgSW5qZWN0ZWREZWxheSBFbmFibGUvZGlzYWJsZSBkZWxheSBmb3IgaW5qZWN0ZWQgY29udmVyc2lvbnMuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNEQURDX0luamVjdGVkRGVsYXkuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RBRENfU2VsZWN0SW5qZWN0ZWREZWxheShTREFEQ19IYW5kbGVUeXBlRGVmICpoc2RhZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBJbmplY3RlZERlbGF5KQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU0RBRENfQUxMX0lOU1RBTkNFKGhzZGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NEQURDX0lOSkVDVEVEX0RFTEFZKEluamVjdGVkRGVsYXkpKTsKKworICAvKiBDaGVjayBTREFEQyBzdGF0ZSAqLworICBpZihoc2RhZGMtPlN0YXRlID09IEhBTF9TREFEQ19TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIEVudGVyIGluaXQgbW9kZSAqLworICAgIGlmKFNEQURDX0VudGVySW5pdE1vZGUoaHNkYWRjKSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogU2V0IFNEQURDIGluIGVycm9yIHN0YXRlICovCisgICAgICBoc2RhZGMtPlN0YXRlID0gSEFMX1NEQURDX1NUQVRFX0VSUk9SOworICAgICAgc3RhdHVzID0gSEFMX1RJTUVPVVQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBTZXQgSkRTIGJpdCBpbiBTREFEQ19DUjIgcmVnaXN0ZXIgKi8KKyAgICAgIGhzZGFkYy0+SW5zdGFuY2UtPkNSMiAmPSB+KFNEQURDX0NSMl9KRFMpOworICAgICAgaHNkYWRjLT5JbnN0YW5jZS0+Q1IyIHw9IEluamVjdGVkRGVsYXk7CisKKyAgICAgIC8qIEV4aXQgaW5pdCBtb2RlICovCisgICAgICBTREFEQ19FeGl0SW5pdE1vZGUoaHNkYWRjKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byBjb25maWd1cmUgbXVsdGltb2RlIGZvciByZWd1bGFyIGNvbnZlcnNpb25zLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCBpZiByZWd1bGFyIGNvbnZlcnNpb24gaXMgb25nb2luZworICAqICAgICAgICAgYW5kIHNob3VsZCBiZSBjb3VsZCBvbmx5IGZvciBTREFEQzEuCisgICogQHBhcmFtICBoc2RhZGMgU0RBREMgaGFuZGxlLgorICAqIEBwYXJhbSAgTXVsdGltb2RlVHlwZSBUeXBlIG9mIG11bHRpbW9kZSBmb3IgcmVndWxhciBjb252ZXJzaW9ucy4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU0RBRENfTXVsdGltb2RlVHlwZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TREFEQ19NdWx0aU1vZGVDb25maWdDaGFubmVsKFNEQURDX0hhbmRsZVR5cGVEZWYqIGhzZGFkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE11bHRpbW9kZVR5cGUpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TREFEQ19BTExfSU5TVEFOQ0UoaHNkYWRjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU0RBRENfTVVMVElNT0RFX1RZUEUoTXVsdGltb2RlVHlwZSkpOworCisgIC8qIENoZWNrIGluc3RhbmNlIGlzIFNEQURDMSAqLworICBpZihoc2RhZGMtPkluc3RhbmNlICE9IFNEQURDMSkKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICAvKiBDaGVjayBTREFEQyBzdGF0ZSAqLworICBlbHNlIGlmKChoc2RhZGMtPlN0YXRlID09IEhBTF9TREFEQ19TVEFURV9SRUFEWSkgfHwgXAorICAgICAgICAgIChoc2RhZGMtPlN0YXRlID09IEhBTF9TREFEQ19TVEFURV9DQUxJQikgfHwgXAorICAgICAgICAgIChoc2RhZGMtPlN0YXRlID09IEhBTF9TREFEQ19TVEFURV9JTkopKQorICB7CisgICAgLyogU3RvcmUgcmVndWxhciB0cmlnZ2VyIGluZm9ybWF0aW9uICovCisgICAgaHNkYWRjLT5SZWd1bGFyTXVsdGltb2RlID0gTXVsdGltb2RlVHlwZTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7ICAgIAorICB9CisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byBjb25maWd1cmUgbXVsdGltb2RlIGZvciBpbmplY3RlZCBjb252ZXJzaW9ucy4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQgaWYgaW5qZWN0ZWQgY29udmVyc2lvbiBpcyBvbmdvaW5nCisgICogICAgICAgICBhbmQgc2hvdWxkIGJlIGNvdWxkIG9ubHkgZm9yIFNEQURDMS4KKyAgKiBAcGFyYW0gIGhzZGFkYyBTREFEQyBoYW5kbGUuCisgICogQHBhcmFtICBNdWx0aW1vZGVUeXBlIFR5cGUgb2YgbXVsdGltb2RlIGZvciBpbmplY3RlZCBjb252ZXJzaW9ucy4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU0RBRENfTXVsdGltb2RlVHlwZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TREFEQ19JbmplY3RlZE11bHRpTW9kZUNvbmZpZ0NoYW5uZWwoU0RBRENfSGFuZGxlVHlwZURlZiogaHNkYWRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBNdWx0aW1vZGVUeXBlKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU0RBRENfQUxMX0lOU1RBTkNFKGhzZGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NEQURDX01VTFRJTU9ERV9UWVBFKE11bHRpbW9kZVR5cGUpKTsKKworICAvKiBDaGVjayBpbnN0YW5jZSBpcyBTREFEQzEgKi8KKyAgaWYoaHNkYWRjLT5JbnN0YW5jZSAhPSBTREFEQzEpCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgLyogQ2hlY2sgU0RBREMgc3RhdGUgKi8KKyAgZWxzZSBpZigoaHNkYWRjLT5TdGF0ZSA9PSBIQUxfU0RBRENfU1RBVEVfUkVBRFkpIHx8IFwKKyAgICAgICAgICAoaHNkYWRjLT5TdGF0ZSA9PSBIQUxfU0RBRENfU1RBVEVfQ0FMSUIpIHx8IFwKKyAgICAgICAgICAoaHNkYWRjLT5TdGF0ZSA9PSBIQUxfU0RBRENfU1RBVEVfUkVHKSkKKyAgeworICAgIC8qIFN0b3JlIHJlZ3VsYXIgdHJpZ2dlciBpbmZvcm1hdGlvbiAqLworICAgIGhzZGFkYy0+SW5qZWN0ZWRNdWx0aW1vZGUgPSBNdWx0aW1vZGVUeXBlOworICB9CisgIGVsc2UKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsgICAgCisgIH0KKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNEQURDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgSW5wdXQgYW5kIE91dHB1dCBvcGVyYXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIElPIG9wZXJhdGlvbiBDb250cm9sIGZ1bmN0aW9ucyAKKyAqCitAdmVyYmF0aW0gICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgU3RhcnQgY2FsaWJyYXRpb24uCisgICAgICAoKykgUG9sbCBmb3IgdGhlIGVuZCBvZiBjYWxpYnJhdGlvbi4KKyAgICAgICgrKSBTdGFydCBjYWxpYnJhdGlvbiBhbmQgZW5hYmxlIGludGVycnVwdC4KKyAgICAgICgrKSBTdGFydCBjb252ZXJzaW9uIG9mIHJlZ3VsYXIvaW5qZWN0ZWQgY2hhbm5lbC4KKyAgICAgICgrKSBQb2xsIGZvciB0aGUgZW5kIG9mIHJlZ3VsYXIvaW5qZWN0ZWQgY29udmVyc2lvbi4KKyAgICAgICgrKSBTdG9wIGNvbnZlcnNpb24gb2YgcmVndWxhci9pbmplY3RlZCBjaGFubmVsLgorICAgICAgKCspIFN0YXJ0IGNvbnZlcnNpb24gb2YgcmVndWxhci9pbmplY3RlZCBjaGFubmVsIGFuZCBlbmFibGUgaW50ZXJydXB0LgorICAgICAgKCspIFN0b3AgY29udmVyc2lvbiBvZiByZWd1bGFyL2luamVjdGVkIGNoYW5uZWwgYW5kIGRpc2FibGUgaW50ZXJydXB0LgorICAgICAgKCspIFN0YXJ0IGNvbnZlcnNpb24gb2YgcmVndWxhci9pbmplY3RlZCBjaGFubmVsIGFuZCBlbmFibGUgRE1BIHRyYW5zZmVyLgorICAgICAgKCspIFN0b3AgY29udmVyc2lvbiBvZiByZWd1bGFyL2luamVjdGVkIGNoYW5uZWwgYW5kIGRpc2FibGUgRE1BIHRyYW5zZmVyLgorICAgICAgKCspIFN0YXJ0IG11bHRpbW9kZSBhbmQgZW5hYmxlIERNQSB0cmFuc2ZlciBmb3IgcmVndWxhci9pbmplY3RlZCBjb252ZXJzaW9uLgorICAgICAgKCspIFN0b3AgbXVsdGltb2RlIGFuZCBkaXNhYmxlIERNQSB0cmFuc2ZlciBmb3IgcmVndWxhci9pbmplY3RlZCBjb252ZXJzaW9uLi4KKyAgICAgICgrKSBHZXQgcmVzdWx0IG9mIHJlZ3VsYXIgY2hhbm5lbCBjb252ZXJzaW9uLgorICAgICAgKCspIEdldCByZXN1bHQgb2YgaW5qZWN0ZWQgY2hhbm5lbCBjb252ZXJzaW9uLgorICAgICAgKCspIEdldCByZXN1bHQgb2YgbXVsdGltb2RlIGNvbnZlcnNpb24uCisgICAgICAoKykgSGFuZGxlIFNEQURDIGludGVycnVwdCByZXF1ZXN0LgorICAgICAgKCspIENhbGxiYWNrcyBmb3IgY2FsaWJyYXRpb24gYW5kIHJlZ3VsYXIvaW5qZWN0ZWQgY29udmVyc2lvbnMuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gc3RhcnQgY2FsaWJyYXRpb24gaW4gcG9sbGluZyBtb2RlLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiBTREFEQyBpbnN0YW5jZSBpcyBpbiBpZGxlIHN0YXRlCisgICogICAgICAgICAobmVpdGhlciBjYWxpYnJhdGlvbiBub3IgcmVndWxhciBvciBpbmplY3RlZCBjb252ZXJzaW9uIG9uZ29pbmcpLgorICAqIEBwYXJhbSAgaHNkYWRjIFNEQURDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIENhbGlicmF0aW9uU2VxdWVuY2UgQ2FsaWJyYXRpb24gc2VxdWVuY2UuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNEQURDX0NhbGlicmF0aW9uU2VxdWVuY2UuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RBRENfQ2FsaWJyYXRpb25TdGFydChTREFEQ19IYW5kbGVUeXBlRGVmICpoc2RhZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDYWxpYnJhdGlvblNlcXVlbmNlKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU0RBRENfQUxMX0lOU1RBTkNFKGhzZGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NEQURDX0NBTElCX1NFUVVFTkNFKENhbGlicmF0aW9uU2VxdWVuY2UpKTsKKworICAvKiBDaGVjayBTREFEQyBzdGF0ZSAqLworICBpZihoc2RhZGMtPlN0YXRlID09IEhBTF9TREFEQ19TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIEVudGVyIGluaXQgbW9kZSAqLworICAgIGlmKFNEQURDX0VudGVySW5pdE1vZGUoaHNkYWRjKSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogU2V0IFNEQURDIGluIGVycm9yIHN0YXRlICovCisgICAgICBoc2RhZGMtPlN0YXRlID0gSEFMX1NEQURDX1NUQVRFX0VSUk9SOworICAgICAgc3RhdHVzID0gSEFMX1RJTUVPVVQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBTZXQgQ0FMSUJDTlRbMTowXSBiaXRzIGluIFNEQURDX0NSMiByZWdpc3RlciAqLworICAgICAgaHNkYWRjLT5JbnN0YW5jZS0+Q1IyICY9IH4oU0RBRENfQ1IyX0NBTElCQ05UKTsKKyAgICAgIGhzZGFkYy0+SW5zdGFuY2UtPkNSMiB8PSBDYWxpYnJhdGlvblNlcXVlbmNlOworCisgICAgICAvKiBFeGl0IGluaXQgbW9kZSAqLworICAgICAgU0RBRENfRXhpdEluaXRNb2RlKGhzZGFkYyk7CisKKyAgICAgIC8qIFNldCBTVEFSVENBTElCIGluIFNEQURDX0NSMiAqLworICAgICAgaHNkYWRjLT5JbnN0YW5jZS0+Q1IyIHw9IFNEQURDX0NSMl9TVEFSVENBTElCOworCisgICAgICAvKiBTZXQgU0RBREMgaW4gY2FsaWJyYXRpb24gc3RhdGUgKi8KKyAgICAgIGhzZGFkYy0+U3RhdGUgPSBIQUxfU0RBRENfU1RBVEVfQ0FMSUI7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gcG9sbCBmb3IgdGhlIGVuZCBvZiBjYWxpYnJhdGlvbi4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGlmIGNhbGlicmF0aW9uIGlzIG9uZ29pbmcuCisgICogQHBhcmFtICBoc2RhZGMgU0RBREMgaGFuZGxlLgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IHZhbHVlIGluIG1pbGxpc2Vjb25kcy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TREFEQ19Qb2xsRm9yQ2FsaWJFdmVudChTREFEQ19IYW5kbGVUeXBlRGVmKiBoc2RhZGMsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TREFEQ19BTExfSU5TVEFOQ0UoaHNkYWRjLT5JbnN0YW5jZSkpOworCisgIC8qIENoZWNrIFNEQURDIHN0YXRlICovCisgIGlmKGhzZGFkYy0+U3RhdGUgIT0gSEFMX1NEQURDX1NUQVRFX0NBTElCKQorICB7CisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogR2V0IHRpbWVvdXQgKi8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOyAgCisKKyAgICAvKiBXYWl0IEVPQ0FMRiBiaXQgaW4gU0RBRENfSVNSIHJlZ2lzdGVyICovCisgICAgd2hpbGUoKGhzZGFkYy0+SW5zdGFuY2UtPklTUiAmIFNEQURDX0lTUl9FT0NBTEYpICE9IFNEQURDX0lTUl9FT0NBTEYpCisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIFRpbWVvdXQgKi8KKyAgICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICAgIHsKKyAgICAgICAgaWYoKChIQUxfR2V0VGljaygpLXRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVUwpKQorICAgICAgICB7CisgICAgICAgICAgLyogUmV0dXJuIHRpbWVvdXQgc3RhdHVzICovCisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIC8qIFNldCBDTFJFT0NBTEYgYml0IGluIFNEQURDX0NMUklTUiByZWdpc3RlciAqLworICAgIGhzZGFkYy0+SW5zdGFuY2UtPkNMUklTUiB8PSBTREFEQ19JU1JfQ0xSRU9DQUxGOworCisgICAgLyogU2V0IFNEQURDIGluIHJlYWR5IHN0YXRlICovCisgICAgaHNkYWRjLT5TdGF0ZSA9IEhBTF9TREFEQ19TVEFURV9SRUFEWTsKKworICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX09LOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gc3RhcnQgY2FsaWJyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIFNEQURDIGluc3RhbmNlIGlzIGluIGlkbGUgc3RhdGUKKyAgKiAgICAgICAgIChuZWl0aGVyIGNhbGlicmF0aW9uIG5vciByZWd1bGFyIG9yIGluamVjdGVkIGNvbnZlcnNpb24gb25nb2luZykuCisgICogQHBhcmFtICBoc2RhZGMgU0RBREMgaGFuZGxlLgorICAqIEBwYXJhbSAgQ2FsaWJyYXRpb25TZXF1ZW5jZSBDYWxpYnJhdGlvbiBzZXF1ZW5jZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU0RBRENfQ2FsaWJyYXRpb25TZXF1ZW5jZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TREFEQ19DYWxpYnJhdGlvblN0YXJ0X0lUKFNEQURDX0hhbmRsZVR5cGVEZWYgKmhzZGFkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENhbGlicmF0aW9uU2VxdWVuY2UpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TREFEQ19BTExfSU5TVEFOQ0UoaHNkYWRjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU0RBRENfQ0FMSUJfU0VRVUVOQ0UoQ2FsaWJyYXRpb25TZXF1ZW5jZSkpOworCisgIC8qIENoZWNrIFNEQURDIHN0YXRlICovCisgIGlmKGhzZGFkYy0+U3RhdGUgPT0gSEFMX1NEQURDX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogRW50ZXIgaW5pdCBtb2RlICovCisgICAgaWYoU0RBRENfRW50ZXJJbml0TW9kZShoc2RhZGMpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBTZXQgU0RBREMgaW4gZXJyb3Igc3RhdGUgKi8KKyAgICAgIGhzZGFkYy0+U3RhdGUgPSBIQUxfU0RBRENfU1RBVEVfRVJST1I7CisgICAgICBzdGF0dXMgPSBIQUxfVElNRU9VVDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFNldCBDQUxJQkNOVFsxOjBdIGJpdHMgaW4gU0RBRENfQ1IyIHJlZ2lzdGVyICovCisgICAgICBoc2RhZGMtPkluc3RhbmNlLT5DUjIgJj0gfihTREFEQ19DUjJfQ0FMSUJDTlQpOworICAgICAgaHNkYWRjLT5JbnN0YW5jZS0+Q1IyIHw9IENhbGlicmF0aW9uU2VxdWVuY2U7CisKKyAgICAgIC8qIEV4aXQgaW5pdCBtb2RlICovCisgICAgICBTREFEQ19FeGl0SW5pdE1vZGUoaHNkYWRjKTsKKworICAgICAgLyogU2V0IEVPQ0FMSUUgYml0IGluIFNEQURDX0NSMSByZWdpc3RlciAqLworICAgICAgaHNkYWRjLT5JbnN0YW5jZS0+Q1IxIHw9IFNEQURDX0NSMV9FT0NBTElFOworCisgICAgICAvKiBTZXQgU1RBUlRDQUxJQiBpbiBTREFEQ19DUjIgKi8KKyAgICAgIGhzZGFkYy0+SW5zdGFuY2UtPkNSMiB8PSBTREFEQ19DUjJfU1RBUlRDQUxJQjsKKworICAgICAgLyogU2V0IFNEQURDIGluIGNhbGlicmF0aW9uIHN0YXRlICovCisgICAgICBoc2RhZGMtPlN0YXRlID0gSEFMX1NEQURDX1NUQVRFX0NBTElCOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHN0YXJ0IHJlZ3VsYXIgY29udmVyc2lvbiBpbiBwb2xsaW5nIG1vZGUuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIFNEQURDIGluc3RhbmNlIGlzIGluIGlkbGUgc3RhdGUKKyAgKiAgICAgICAgIG9yIGlmIGluamVjdGVkIGNvbnZlcnNpb24gaXMgb25nb2luZy4KKyAgKiBAcGFyYW0gIGhzZGFkYyBTREFEQyBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RBRENfU3RhcnQoU0RBRENfSGFuZGxlVHlwZURlZiAqaHNkYWRjKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU0RBRENfQUxMX0lOU1RBTkNFKGhzZGFkYy0+SW5zdGFuY2UpKTsKKworICAvKiBDaGVjayBTREFEQyBzdGF0ZSAqLworICBpZigoaHNkYWRjLT5TdGF0ZSA9PSBIQUxfU0RBRENfU1RBVEVfUkVBRFkpIHx8IFwKKyAgICAgKGhzZGFkYy0+U3RhdGUgPT0gSEFMX1NEQURDX1NUQVRFX0lOSikpCisgIHsKKyAgICAvKiBTdGFydCByZWd1bGFyIGNvbnZlcnNpb24gKi8KKyAgICBzdGF0dXMgPSBTREFEQ19SZWdDb252U3RhcnQoaHNkYWRjKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHBvbGwgZm9yIHRoZSBlbmQgb2YgcmVndWxhciBjb252ZXJzaW9uLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9ubHkgaWYgcmVndWxhciBjb252ZXJzaW9uIGlzIG9uZ29pbmcuCisgICogQHBhcmFtICBoc2RhZGMgU0RBREMgaGFuZGxlLgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IHZhbHVlIGluIG1pbGxpc2Vjb25kcy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TREFEQ19Qb2xsRm9yQ29udmVyc2lvbihTREFEQ19IYW5kbGVUeXBlRGVmKiBoc2RhZGMsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TREFEQ19BTExfSU5TVEFOQ0UoaHNkYWRjLT5JbnN0YW5jZSkpOworCisgIC8qIENoZWNrIFNEQURDIHN0YXRlICovCisgIGlmKChoc2RhZGMtPlN0YXRlICE9IEhBTF9TREFEQ19TVEFURV9SRUcpICYmIFwKKyAgICAgKGhzZGFkYy0+U3RhdGUgIT0gSEFMX1NEQURDX1NUQVRFX1JFR19JTkopKQorICB7CisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogR2V0IHRpbWVvdXQgKi8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOyAgCisKKyAgICAvKiBXYWl0IFJFT0NGIGJpdCBpbiBTREFEQ19JU1IgcmVnaXN0ZXIgKi8KKyAgICB3aGlsZSgoaHNkYWRjLT5JbnN0YW5jZS0+SVNSICYgU0RBRENfSVNSX1JFT0NGKSAhPSBTREFEQ19JU1JfUkVPQ0YpCisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIFRpbWVvdXQgKi8KKyAgICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICAgIHsKKyAgICAgICAgaWYoKChIQUxfR2V0VGljaygpLXRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVUwpKQorICAgICAgICB7CisgICAgICAgICAgLyogUmV0dXJuIHRpbWVvdXQgc3RhdHVzICovCisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIC8qIENoZWNrIGlmIG92ZXJydW4gb2NjdXJzICovCisgICAgaWYoKGhzZGFkYy0+SW5zdGFuY2UtPklTUiAmIFNEQURDX0lTUl9ST1ZSRikgPT0gU0RBRENfSVNSX1JPVlJGKQorICAgIHsKKyAgICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlIGFuZCBjYWxsIGVycm9yIGNhbGxiYWNrICovCisgICAgICBoc2RhZGMtPkVycm9yQ29kZSA9IFNEQURDX0VSUk9SX1JFR1VMQVJfT1ZFUlJVTjsKKyAgICAgIEhBTF9TREFEQ19FcnJvckNhbGxiYWNrKGhzZGFkYyk7CisKKyAgICAgIC8qIFNldCBDTFJST1ZSRiBiaXQgaW4gU0RBRENfQ0xSSVNSIHJlZ2lzdGVyICovCisgICAgICBoc2RhZGMtPkluc3RhbmNlLT5DTFJJU1IgfD0gU0RBRENfSVNSX0NMUlJPVlJGOworICAgIH0KKyAgICAvKiBVcGRhdGUgU0RBREMgc3RhdGUgb25seSBpZiBub3QgY29udGludW91cyBjb252ZXJzaW9uIGFuZCBTVyB0cmlnZ2VyICovCisgICAgaWYoKGhzZGFkYy0+UmVndWxhckNvbnRNb2RlID09IFNEQURDX0NPTlRJTlVPVVNfQ09OVl9PRkYpICYmIFwKKyAgICAgICAoaHNkYWRjLT5SZWd1bGFyVHJpZ2dlciA9PSBTREFEQ19TT0ZUV0FSRV9UUklHR0VSKSkKKyAgICB7CisgICAgICBoc2RhZGMtPlN0YXRlID0gKGhzZGFkYy0+U3RhdGUgPT0gSEFMX1NEQURDX1NUQVRFX1JFRykgPyBcCisgICAgICAgICAgICAgICAgICAgICAgSEFMX1NEQURDX1NUQVRFX1JFQURZIDogSEFMX1NEQURDX1NUQVRFX0lOSjsKKyAgICB9CisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfT0s7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byBzdG9wIHJlZ3VsYXIgY29udmVyc2lvbiBpbiBwb2xsaW5nIG1vZGUuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgb25seSBpZiByZWd1bGFyIGNvbnZlcnNpb24gaXMgb25nb2luZy4KKyAgKiBAcGFyYW0gIGhzZGFkYyBTREFEQyBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RBRENfU3RvcChTREFEQ19IYW5kbGVUeXBlRGVmICpoc2RhZGMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TREFEQ19BTExfSU5TVEFOQ0UoaHNkYWRjLT5JbnN0YW5jZSkpOworCisgIC8qIENoZWNrIFNEQURDIHN0YXRlICovCisgIGlmKChoc2RhZGMtPlN0YXRlICE9IEhBTF9TREFEQ19TVEFURV9SRUcpICYmIFwKKyAgICAgKGhzZGFkYy0+U3RhdGUgIT0gSEFMX1NEQURDX1NUQVRFX1JFR19JTkopKQorICB7CisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBTdG9wIHJlZ3VsYXIgY29udmVyc2lvbiAqLworICAgIHN0YXR1cyA9IFNEQURDX1JlZ0NvbnZTdG9wKGhzZGFkYyk7CisgIH0KKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHN0YXJ0IHJlZ3VsYXIgY29udmVyc2lvbiBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBvbmx5IHdoZW4gU0RBREMgaW5zdGFuY2UgaXMgaW4gaWRsZSBzdGF0ZQorICAqICAgICAgICAgb3IgaWYgaW5qZWN0ZWQgY29udmVyc2lvbiBpcyBvbmdvaW5nLgorICAqIEBwYXJhbSAgaHNkYWRjIFNEQURDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TREFEQ19TdGFydF9JVChTREFEQ19IYW5kbGVUeXBlRGVmICpoc2RhZGMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TREFEQ19BTExfSU5TVEFOQ0UoaHNkYWRjLT5JbnN0YW5jZSkpOworCisgIC8qIENoZWNrIFNEQURDIHN0YXRlICovCisgIGlmKChoc2RhZGMtPlN0YXRlID09IEhBTF9TREFEQ19TVEFURV9SRUFEWSkgfHwgXAorICAgICAoaHNkYWRjLT5TdGF0ZSA9PSBIQUxfU0RBRENfU1RBVEVfSU5KKSkKKyAgeworICAgIC8qIFNldCBSRU9DSUUgYW5kIFJPVlJJRSBiaXRzIGluIFNEQURDX0NSMSByZWdpc3RlciAqLworICAgIGhzZGFkYy0+SW5zdGFuY2UtPkNSMSB8PSAodWludDMyX3QpIChTREFEQ19DUjFfUkVPQ0lFIHwgU0RBRENfQ1IxX1JPVlJJRSk7CisKKyAgICAvKiBTdGFydCByZWd1bGFyIGNvbnZlcnNpb24gKi8KKyAgICBzdGF0dXMgPSBTREFEQ19SZWdDb252U3RhcnQoaHNkYWRjKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHN0b3AgcmVndWxhciBjb252ZXJzaW9uIGluIGludGVycnVwdCBtb2RlLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9ubHkgaWYgcmVndWxhciBjb252ZXJzaW9uIGlzIG9uZ29pbmcuCisgICogQHBhcmFtICBoc2RhZGMgU0RBREMgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEQURDX1N0b3BfSVQoU0RBRENfSGFuZGxlVHlwZURlZiAqaHNkYWRjKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU0RBRENfQUxMX0lOU1RBTkNFKGhzZGFkYy0+SW5zdGFuY2UpKTsKKworICAvKiBDaGVjayBTREFEQyBzdGF0ZSAqLworICBpZigoaHNkYWRjLT5TdGF0ZSAhPSBIQUxfU0RBRENfU1RBVEVfUkVHKSAmJiBcCisgICAgIChoc2RhZGMtPlN0YXRlICE9IEhBTF9TREFEQ19TVEFURV9SRUdfSU5KKSkKKyAgeworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2xlYXIgUkVPQ0lFIGFuZCBST1ZSSUUgYml0cyBpbiBTREFEQ19DUjEgcmVnaXN0ZXIgKi8KKyAgICBoc2RhZGMtPkluc3RhbmNlLT5DUjEgJj0gKHVpbnQzMl90KSB+KFNEQURDX0NSMV9SRU9DSUUgfCBTREFEQ19DUjFfUk9WUklFKTsKKworICAgIC8qIFN0b3AgcmVndWxhciBjb252ZXJzaW9uICovCisgICAgc3RhdHVzID0gU0RBRENfUmVnQ29udlN0b3AoaHNkYWRjKTsKKyAgfQorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gc3RhcnQgcmVndWxhciBjb252ZXJzaW9uIGluIERNQSBtb2RlLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiBTREFEQyBpbnN0YW5jZSBpcyBpbiBpZGxlIHN0YXRlCisgICogICAgICAgICBvciBpZiBpbmplY3RlZCBjb252ZXJzaW9uIGlzIG9uZ29pbmcuCisgICogQHBhcmFtICBoc2RhZGMgU0RBREMgaGFuZGxlLgorICAqIEBwYXJhbSAgcERhdGEgVGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIFNEQURDIHBlcmlwaGVyYWwgdG8gbWVtb3J5LgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEQURDX1N0YXJ0X0RNQShTREFEQ19IYW5kbGVUeXBlRGVmICpoc2RhZGMsIHVpbnQzMl90ICpwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTGVuZ3RoKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU0RBRENfQUxMX0lOU1RBTkNFKGhzZGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKHBEYXRhICE9ICgodm9pZCopIDApKTsKKyAgYXNzZXJ0X3BhcmFtKExlbmd0aCAhPSAwVUwpOworCisgIC8qIENoZWNrIHRoYXQgRE1BIGlzIG5vdCBlbmFibGVkIGZvciBpbmplY3RlZCBjb252ZXJzaW9uICovCisgIGlmKChoc2RhZGMtPkluc3RhbmNlLT5DUjEgJiBTREFEQ19DUjFfSkRNQUVOKSA9PSBTREFEQ19DUjFfSkRNQUVOKQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIC8qIENoZWNrIHBhcmFtZXRlcnMgY29tcGF0aWJpbGl0eSAqLworICBlbHNlIGlmKChoc2RhZGMtPlJlZ3VsYXJUcmlnZ2VyID09IFNEQURDX1NPRlRXQVJFX1RSSUdHRVIpICYmIFwKKyAgICAgICAgICAoaHNkYWRjLT5SZWd1bGFyQ29udE1vZGUgPT0gU0RBRENfQ09OVElOVU9VU19DT05WX09GRikgJiYgXAorICAgICAgICAgIChoc2RhZGMtPmhkbWEtPkluaXQuTW9kZSA9PSBETUFfTk9STUFMKSAmJiBcCisgICAgICAgICAgKExlbmd0aCAhPSAxVSkpCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgZWxzZSBpZigoaHNkYWRjLT5SZWd1bGFyVHJpZ2dlciA9PSBTREFEQ19TT0ZUV0FSRV9UUklHR0VSKSAmJiBcCisgICAgICAgICAgKGhzZGFkYy0+UmVndWxhckNvbnRNb2RlID09IFNEQURDX0NPTlRJTlVPVVNfQ09OVl9PRkYpICYmIFwKKyAgICAgICAgICAoaHNkYWRjLT5oZG1hLT5Jbml0Lk1vZGUgPT0gRE1BX0NJUkNVTEFSKSkKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICAvKiBDaGVjayBTREFEQyBzdGF0ZSAqLworICBlbHNlIGlmKChoc2RhZGMtPlN0YXRlID09IEhBTF9TREFEQ19TVEFURV9SRUFEWSkgfHwgXAorICAgICAgICAgIChoc2RhZGMtPlN0YXRlID09IEhBTF9TREFEQ19TVEFURV9JTkopKQorICB7CisgICAgLyogU2V0IGNhbGxiYWNrcyBvbiBETUEgaGFuZGxlciAqLworICAgIGhzZGFkYy0+aGRtYS0+WGZlckNwbHRDYWxsYmFjayA9IFNEQURDX0RNQVJlZ3VsYXJDb252Q3BsdDsKKyAgICBoc2RhZGMtPmhkbWEtPlhmZXJFcnJvckNhbGxiYWNrID0gU0RBRENfRE1BRXJyb3I7CisgICAgaWYoaHNkYWRjLT5oZG1hLT5Jbml0Lk1vZGUgPT0gRE1BX0NJUkNVTEFSKQorICAgIHsKKyAgICAgIGhzZGFkYy0+aGRtYS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBTREFEQ19ETUFSZWd1bGFySGFsZkNvbnZDcGx0OworICAgIH0KKyAgICAKKyAgICAvKiBTZXQgUkRNQUVOIGJpdCBpbiBTREFEQ19DUjEgcmVnaXN0ZXIgKi8KKyAgICBoc2RhZGMtPkluc3RhbmNlLT5DUjEgfD0gU0RBRENfQ1IxX1JETUFFTjsKKworICAgIC8qIFN0YXJ0IERNQSBpbiBpbnRlcnJ1cHQgbW9kZSAqLworICAgIGlmKEhBTF9ETUFfU3RhcnRfSVQoaHNkYWRjLT5oZG1hLCAodWludDMyX3QpJmhzZGFkYy0+SW5zdGFuY2UtPlJEQVRBUiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSBwRGF0YSwgTGVuZ3RoKSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogU2V0IFNEQURDIGluIGVycm9yIHN0YXRlICovCisgICAgICBoc2RhZGMtPlN0YXRlID0gSEFMX1NEQURDX1NUQVRFX0VSUk9SOworICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogU3RhcnQgcmVndWxhciBjb252ZXJzaW9uICovCisgICAgICBzdGF0dXMgPSBTREFEQ19SZWdDb252U3RhcnQoaHNkYWRjKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byBzdG9wIHJlZ3VsYXIgY29udmVyc2lvbiBpbiBETUEgbW9kZS4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGlmIHJlZ3VsYXIgY29udmVyc2lvbiBpcyBvbmdvaW5nLgorICAqIEBwYXJhbSAgaHNkYWRjIFNEQURDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TREFEQ19TdG9wX0RNQShTREFEQ19IYW5kbGVUeXBlRGVmICpoc2RhZGMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TREFEQ19BTExfSU5TVEFOQ0UoaHNkYWRjLT5JbnN0YW5jZSkpOworCisgIC8qIENoZWNrIFNEQURDIHN0YXRlICovCisgIGlmKChoc2RhZGMtPlN0YXRlICE9IEhBTF9TREFEQ19TVEFURV9SRUcpICYmIFwKKyAgICAgKGhzZGFkYy0+U3RhdGUgIT0gSEFMX1NEQURDX1NUQVRFX1JFR19JTkopKQorICB7CisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDbGVhciBSRE1BRU4gYml0IGluIFNEQURDX0NSMSByZWdpc3RlciAqLworICAgIGhzZGFkYy0+SW5zdGFuY2UtPkNSMSAmPSB+KFNEQURDX0NSMV9SRE1BRU4pOworCisgICAgLyogU3RvcCBjdXJyZW50IERNQSB0cmFuc2ZlciAqLworICAgIGlmKEhBTF9ETUFfQWJvcnQoaHNkYWRjLT5oZG1hKSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogU2V0IFNEQURDIGluIGVycm9yIHN0YXRlICovCisgICAgICBoc2RhZGMtPlN0YXRlID0gSEFMX1NEQURDX1NUQVRFX0VSUk9SOworICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogU3RvcCByZWd1bGFyIGNvbnZlcnNpb24gKi8KKyAgICAgIHN0YXR1cyA9IFNEQURDX1JlZ0NvbnZTdG9wKGhzZGFkYyk7CisgICAgfQorICB9CisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byBnZXQgcmVndWxhciBjb252ZXJzaW9uIHZhbHVlLgorICAqIEBwYXJhbSAgaHNkYWRjIFNEQURDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIFJlZ3VsYXIgY29udmVyc2lvbiB2YWx1ZQorICAqLwordWludDMyX3QgSEFMX1NEQURDX0dldFZhbHVlKFNEQURDX0hhbmRsZVR5cGVEZWYgKmhzZGFkYykKK3sKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU0RBRENfQUxMX0lOU1RBTkNFKGhzZGFkYy0+SW5zdGFuY2UpKTsKKworICAvKiBSZXR1cm4gcmVndWxhciBjb252ZXJzaW9uIHZhbHVlICovCisgIHJldHVybiBoc2RhZGMtPkluc3RhbmNlLT5SREFUQVI7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gc3RhcnQgaW5qZWN0ZWQgY29udmVyc2lvbiBpbiBwb2xsaW5nIG1vZGUuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIFNEQURDIGluc3RhbmNlIGlzIGluIGlkbGUgc3RhdGUKKyAgKiAgICAgICAgIG9yIGlmIHJlZ3VsYXIgY29udmVyc2lvbiBpcyBvbmdvaW5nLgorICAqIEBwYXJhbSAgaHNkYWRjIFNEQURDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TREFEQ19JbmplY3RlZFN0YXJ0KFNEQURDX0hhbmRsZVR5cGVEZWYgKmhzZGFkYykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOworCisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NEQURDX0FMTF9JTlNUQU5DRShoc2RhZGMtPkluc3RhbmNlKSk7CisKKyAgLyogQ2hlY2sgU0RBREMgc3RhdGUgKi8KKyAgaWYoKGhzZGFkYy0+U3RhdGUgPT0gSEFMX1NEQURDX1NUQVRFX1JFQURZKSB8fCBcCisgICAgIChoc2RhZGMtPlN0YXRlID09IEhBTF9TREFEQ19TVEFURV9SRUcpKQorICB7CisgICAgLyogU3RhcnQgaW5qZWN0ZWQgY29udmVyc2lvbiAqLworICAgIHN0YXR1cyA9IFNEQURDX0luakNvbnZTdGFydChoc2RhZGMpOworICB9CisgIGVsc2UKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gcG9sbCBmb3IgdGhlIGVuZCBvZiBpbmplY3RlZCBjb252ZXJzaW9uLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9ubHkgaWYgaW5qZWN0ZWQgY29udmVyc2lvbiBpcyBvbmdvaW5nLgorICAqIEBwYXJhbSAgaHNkYWRjIFNEQURDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCB2YWx1ZSBpbiBtaWxsaXNlY29uZHMuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RBRENfUG9sbEZvckluamVjdGVkQ29udmVyc2lvbihTREFEQ19IYW5kbGVUeXBlRGVmKiBoc2RhZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU0RBRENfQUxMX0lOU1RBTkNFKGhzZGFkYy0+SW5zdGFuY2UpKTsKKworICAvKiBDaGVjayBTREFEQyBzdGF0ZSAqLworICBpZigoaHNkYWRjLT5TdGF0ZSAhPSBIQUxfU0RBRENfU1RBVEVfSU5KKSAmJiBcCisgICAgIChoc2RhZGMtPlN0YXRlICE9IEhBTF9TREFEQ19TVEFURV9SRUdfSU5KKSkKKyAgeworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIEdldCB0aW1lb3V0ICovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsgIAorCisgICAgLyogV2FpdCBKRU9DRiBiaXQgaW4gU0RBRENfSVNSIHJlZ2lzdGVyICovCisgICAgd2hpbGUoKGhzZGFkYy0+SW5zdGFuY2UtPklTUiAmIFNEQURDX0lTUl9KRU9DRikgIT0gU0RBRENfSVNSX0pFT0NGKQorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBUaW1lb3V0ICovCisgICAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgICB7CisgICAgICAgIGlmKCgoSEFMX0dldFRpY2soKS10aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFVMKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFJldHVybiB0aW1lb3V0IHN0YXR1cyAqLworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAvKiBDaGVjayBpZiBvdmVycnVuIG9jY3VycyAqLworICAgIGlmKChoc2RhZGMtPkluc3RhbmNlLT5JU1IgJiBTREFEQ19JU1JfSk9WUkYpID09IFNEQURDX0lTUl9KT1ZSRikKKyAgICB7CisgICAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSBhbmQgY2FsbCBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHNkYWRjLT5FcnJvckNvZGUgPSBTREFEQ19FUlJPUl9JTkpFQ1RFRF9PVkVSUlVOOworICAgICAgSEFMX1NEQURDX0Vycm9yQ2FsbGJhY2soaHNkYWRjKTsKKworICAgICAgLyogU2V0IENMUkpPVlJGIGJpdCBpbiBTREFEQ19DTFJJU1IgcmVnaXN0ZXIgKi8KKyAgICAgIGhzZGFkYy0+SW5zdGFuY2UtPkNMUklTUiB8PSBTREFEQ19JU1JfQ0xSSk9WUkY7CisgICAgfQorICAgIC8qIFVwZGF0ZSByZW1haW5pbmcgaW5qZWN0ZWQgY29udmVyc2lvbnMgKi8KKyAgICBoc2RhZGMtPkluakNvbnZSZW1haW5pbmctLTsKKyAgICBpZihoc2RhZGMtPkluakNvbnZSZW1haW5pbmcgPT0gMFVMKQorICAgIHsKKyAgICAgIC8qIGVuZCBvZiBpbmplY3RlZCBzZXF1ZW5jZSwgcmVzZXQgdGhlIHZhbHVlICovCisgICAgICBoc2RhZGMtPkluakNvbnZSZW1haW5pbmcgPSBoc2RhZGMtPkluamVjdGVkQ2hhbm5lbHNOYnI7CisgICAgfQorCisgICAgLyogVXBkYXRlIFNEQURDIHN0YXRlIG9ubHkgaWYgbm90IGNvbnRpbnVvdXMgY29udmVyc2lvbiwgU1cgdHJpZ2dlciAqLworICAgIC8qIGFuZCBlbmQgb2YgaW5qZWN0ZWQgc2VxdWVuY2UgKi8KKyAgICBpZigoaHNkYWRjLT5JbmplY3RlZENvbnRNb2RlID09IFNEQURDX0NPTlRJTlVPVVNfQ09OVl9PRkYpICYmIFwKKyAgICAgICAoaHNkYWRjLT5JbmplY3RlZFRyaWdnZXIgPT0gU0RBRENfU09GVFdBUkVfVFJJR0dFUikgJiYgXAorICAgICAgIChoc2RhZGMtPkluakNvbnZSZW1haW5pbmcgPT0gaHNkYWRjLT5JbmplY3RlZENoYW5uZWxzTmJyKSkKKyAgICB7CisgICAgICBoc2RhZGMtPlN0YXRlID0gKGhzZGFkYy0+U3RhdGUgPT0gSEFMX1NEQURDX1NUQVRFX0lOSikgPyBcCisgICAgICAgICAgICAgICAgICAgICAgSEFMX1NEQURDX1NUQVRFX1JFQURZIDogSEFMX1NEQURDX1NUQVRFX1JFRzsKKyAgICB9CisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfT0s7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byBzdG9wIGluamVjdGVkIGNvbnZlcnNpb24gaW4gcG9sbGluZyBtb2RlLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9ubHkgaWYgaW5qZWN0ZWQgY29udmVyc2lvbiBpcyBvbmdvaW5nLgorICAqIEBwYXJhbSAgaHNkYWRjIFNEQURDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TREFEQ19JbmplY3RlZFN0b3AoU0RBRENfSGFuZGxlVHlwZURlZiAqaHNkYWRjKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU0RBRENfQUxMX0lOU1RBTkNFKGhzZGFkYy0+SW5zdGFuY2UpKTsKKworICAvKiBDaGVjayBTREFEQyBzdGF0ZSAqLworICBpZigoaHNkYWRjLT5TdGF0ZSAhPSBIQUxfU0RBRENfU1RBVEVfSU5KKSAmJiBcCisgICAgIChoc2RhZGMtPlN0YXRlICE9IEhBTF9TREFEQ19TVEFURV9SRUdfSU5KKSkKKyAgeworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogU3RvcCBpbmplY3RlZCBjb252ZXJzaW9uICovCisgICAgc3RhdHVzID0gU0RBRENfSW5qQ29udlN0b3AoaHNkYWRjKTsKKyAgfQorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gc3RhcnQgaW5qZWN0ZWQgY29udmVyc2lvbiBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBvbmx5IHdoZW4gU0RBREMgaW5zdGFuY2UgaXMgaW4gaWRsZSBzdGF0ZQorICAqICAgICAgICAgb3IgaWYgcmVndWxhciBjb252ZXJzaW9uIGlzIG9uZ29pbmcuCisgICogQHBhcmFtICBoc2RhZGMgU0RBREMgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEQURDX0luamVjdGVkU3RhcnRfSVQoU0RBRENfSGFuZGxlVHlwZURlZiAqaHNkYWRjKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU0RBRENfQUxMX0lOU1RBTkNFKGhzZGFkYy0+SW5zdGFuY2UpKTsKKworICAvKiBDaGVjayBTREFEQyBzdGF0ZSAqLworICBpZigoaHNkYWRjLT5TdGF0ZSA9PSBIQUxfU0RBRENfU1RBVEVfUkVBRFkpIHx8IFwKKyAgICAgKGhzZGFkYy0+U3RhdGUgPT0gSEFMX1NEQURDX1NUQVRFX1JFRykpCisgIHsKKyAgICAvKiBTZXQgSkVPQ0lFIGFuZCBKT1ZSSUUgYml0cyBpbiBTREFEQ19DUjEgcmVnaXN0ZXIgKi8KKyAgICBoc2RhZGMtPkluc3RhbmNlLT5DUjEgfD0gKHVpbnQzMl90KSAoU0RBRENfQ1IxX0pFT0NJRSB8IFNEQURDX0NSMV9KT1ZSSUUpOworCisgICAgLyogU3RhcnQgaW5qZWN0ZWQgY29udmVyc2lvbiAqLworICAgIHN0YXR1cyA9IFNEQURDX0luakNvbnZTdGFydChoc2RhZGMpOworICB9CisgIGVsc2UKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gc3RvcCBpbmplY3RlZCBjb252ZXJzaW9uIGluIGludGVycnVwdCBtb2RlLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9ubHkgaWYgaW5qZWN0ZWQgY29udmVyc2lvbiBpcyBvbmdvaW5nLgorICAqIEBwYXJhbSAgaHNkYWRjIFNEQURDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TREFEQ19JbmplY3RlZFN0b3BfSVQoU0RBRENfSGFuZGxlVHlwZURlZiAqaHNkYWRjKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU0RBRENfQUxMX0lOU1RBTkNFKGhzZGFkYy0+SW5zdGFuY2UpKTsKKworICAvKiBDaGVjayBTREFEQyBzdGF0ZSAqLworICBpZigoaHNkYWRjLT5TdGF0ZSAhPSBIQUxfU0RBRENfU1RBVEVfSU5KKSAmJiBcCisgICAgIChoc2RhZGMtPlN0YXRlICE9IEhBTF9TREFEQ19TVEFURV9SRUdfSU5KKSkKKyAgeworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2xlYXIgSkVPQ0lFIGFuZCBKT1ZSSUUgYml0cyBpbiBTREFEQ19DUjEgcmVnaXN0ZXIgKi8KKyAgICBoc2RhZGMtPkluc3RhbmNlLT5DUjEgJj0gKHVpbnQzMl90KSB+KFNEQURDX0NSMV9KRU9DSUUgfCBTREFEQ19DUjFfSk9WUklFKTsKKworICAgIC8qIFN0b3AgaW5qZWN0ZWQgY29udmVyc2lvbiAqLworICAgIHN0YXR1cyA9IFNEQURDX0luakNvbnZTdG9wKGhzZGFkYyk7CisgIH0KKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHN0YXJ0IGluamVjdGVkIGNvbnZlcnNpb24gaW4gRE1BIG1vZGUuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIFNEQURDIGluc3RhbmNlIGlzIGluIGlkbGUgc3RhdGUKKyAgKiAgICAgICAgIG9yIGlmIHJlZ3VsYXIgY29udmVyc2lvbiBpcyBvbmdvaW5nLgorICAqIEBwYXJhbSAgaHNkYWRjIFNEQURDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBEYXRhIFRoZSBkZXN0aW5hdGlvbiBidWZmZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIExlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBTREFEQyBwZXJpcGhlcmFsIHRvIG1lbW9yeS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TREFEQ19JbmplY3RlZFN0YXJ0X0RNQShTREFEQ19IYW5kbGVUeXBlRGVmICpoc2RhZGMsIHVpbnQzMl90ICpwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBMZW5ndGgpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TREFEQ19BTExfSU5TVEFOQ0UoaHNkYWRjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0ocERhdGEgIT0gKCh2b2lkKikgMCkpOworICBhc3NlcnRfcGFyYW0oTGVuZ3RoICE9IDBVTCk7CisKKyAgLyogQ2hlY2sgdGhhdCBETUEgaXMgbm90IGVuYWJsZWQgZm9yIHJlZ3VsYXIgY29udmVyc2lvbiAqLworICBpZigoaHNkYWRjLT5JbnN0YW5jZS0+Q1IxICYgU0RBRENfQ1IxX1JETUFFTikgPT0gU0RBRENfQ1IxX1JETUFFTikKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICAvKiBDaGVjayBwYXJhbWV0ZXJzIGNvbXBhdGliaWxpdHkgKi8KKyAgZWxzZSBpZigoaHNkYWRjLT5JbmplY3RlZFRyaWdnZXIgPT0gU0RBRENfU09GVFdBUkVfVFJJR0dFUikgJiYgXAorICAgICAgICAgIChoc2RhZGMtPkluamVjdGVkQ29udE1vZGUgPT0gU0RBRENfQ09OVElOVU9VU19DT05WX09GRikgJiYgXAorICAgICAgICAgIChoc2RhZGMtPmhkbWEtPkluaXQuTW9kZSA9PSBETUFfTk9STUFMKSAmJiBcCisgICAgICAgICAgKExlbmd0aCA+IGhzZGFkYy0+SW5qZWN0ZWRDaGFubmVsc05icikpCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgZWxzZSBpZigoaHNkYWRjLT5JbmplY3RlZFRyaWdnZXIgPT0gU0RBRENfU09GVFdBUkVfVFJJR0dFUikgJiYgXAorICAgICAgICAgIChoc2RhZGMtPkluamVjdGVkQ29udE1vZGUgPT0gU0RBRENfQ09OVElOVU9VU19DT05WX09GRikgJiYgXAorICAgICAgICAgIChoc2RhZGMtPmhkbWEtPkluaXQuTW9kZSA9PSBETUFfQ0lSQ1VMQVIpKQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIC8qIENoZWNrIFNEQURDIHN0YXRlICovCisgIGVsc2UgaWYoKGhzZGFkYy0+U3RhdGUgPT0gSEFMX1NEQURDX1NUQVRFX1JFQURZKSB8fCBcCisgICAgICAgICAgKGhzZGFkYy0+U3RhdGUgPT0gSEFMX1NEQURDX1NUQVRFX1JFRykpCisgIHsKKyAgICAvKiBTZXQgY2FsbGJhY2tzIG9uIERNQSBoYW5kbGVyICovCisgICAgaHNkYWRjLT5oZG1hLT5YZmVyQ3BsdENhbGxiYWNrID0gU0RBRENfRE1BSW5qZWN0ZWRDb252Q3BsdDsKKyAgICBoc2RhZGMtPmhkbWEtPlhmZXJFcnJvckNhbGxiYWNrID0gU0RBRENfRE1BRXJyb3I7CisgICAgaWYoaHNkYWRjLT5oZG1hLT5Jbml0Lk1vZGUgPT0gRE1BX0NJUkNVTEFSKQorICAgIHsKKyAgICAgIGhzZGFkYy0+aGRtYS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBTREFEQ19ETUFJbmplY3RlZEhhbGZDb252Q3BsdDsKKyAgICB9CisgICAgCisgICAgLyogU2V0IEpETUFFTiBiaXQgaW4gU0RBRENfQ1IxIHJlZ2lzdGVyICovCisgICAgaHNkYWRjLT5JbnN0YW5jZS0+Q1IxIHw9IFNEQURDX0NSMV9KRE1BRU47CisKKyAgICAvKiBTdGFydCBETUEgaW4gaW50ZXJydXB0IG1vZGUgKi8KKyAgICBpZihIQUxfRE1BX1N0YXJ0X0lUKGhzZGFkYy0+aGRtYSwgKHVpbnQzMl90KSZoc2RhZGMtPkluc3RhbmNlLT5KREFUQVIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkgcERhdGEsIExlbmd0aCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFNldCBTREFEQyBpbiBlcnJvciBzdGF0ZSAqLworICAgICAgaHNkYWRjLT5TdGF0ZSA9IEhBTF9TREFEQ19TVEFURV9FUlJPUjsKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFN0YXJ0IGluamVjdGVkIGNvbnZlcnNpb24gKi8KKyAgICAgIHN0YXR1cyA9IFNEQURDX0luakNvbnZTdGFydChoc2RhZGMpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHN0b3AgaW5qZWN0ZWQgY29udmVyc2lvbiBpbiBETUEgbW9kZS4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGlmIGluamVjdGVkIGNvbnZlcnNpb24gaXMgb25nb2luZy4KKyAgKiBAcGFyYW0gIGhzZGFkYyBTREFEQyBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RBRENfSW5qZWN0ZWRTdG9wX0RNQShTREFEQ19IYW5kbGVUeXBlRGVmICpoc2RhZGMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TREFEQ19BTExfSU5TVEFOQ0UoaHNkYWRjLT5JbnN0YW5jZSkpOworCisgIC8qIENoZWNrIFNEQURDIHN0YXRlICovCisgIGlmKChoc2RhZGMtPlN0YXRlICE9IEhBTF9TREFEQ19TVEFURV9JTkopICYmIFwKKyAgICAgKGhzZGFkYy0+U3RhdGUgIT0gSEFMX1NEQURDX1NUQVRFX1JFR19JTkopKQorICB7CisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDbGVhciBKRE1BRU4gYml0IGluIFNEQURDX0NSMSByZWdpc3RlciAqLworICAgIGhzZGFkYy0+SW5zdGFuY2UtPkNSMSAmPSB+KFNEQURDX0NSMV9KRE1BRU4pOworCisgICAgLyogU3RvcCBjdXJyZW50IERNQSB0cmFuc2ZlciAqLworICAgIGlmKEhBTF9ETUFfQWJvcnQoaHNkYWRjLT5oZG1hKSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogU2V0IFNEQURDIGluIGVycm9yIHN0YXRlICovCisgICAgICBoc2RhZGMtPlN0YXRlID0gSEFMX1NEQURDX1NUQVRFX0VSUk9SOworICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogU3RvcCBpbmplY3RlZCBjb252ZXJzaW9uICovCisgICAgICBzdGF0dXMgPSBTREFEQ19JbmpDb252U3RvcChoc2RhZGMpOworICAgIH0KKyAgfQorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gZ2V0IGluamVjdGVkIGNvbnZlcnNpb24gdmFsdWUuCisgICogQHBhcmFtICBoc2RhZGMgU0RBREMgaGFuZGxlLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBDb3JyZXNwb25kaW5nIGNoYW5uZWwgb2YgaW5qZWN0ZWQgY29udmVyc2lvbi4KKyAgKiBAcmV0dmFsIEluamVjdGVkIGNvbnZlcnNpb24gdmFsdWUKKyAgKi8KK3VpbnQzMl90IEhBTF9TREFEQ19JbmplY3RlZEdldFZhbHVlKFNEQURDX0hhbmRsZVR5cGVEZWYgKmhzZGFkYywgdWludDMyX3QqIENoYW5uZWwpCit7CisgIHVpbnQzMl90IHZhbHVlOworCisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NEQURDX0FMTF9JTlNUQU5DRShoc2RhZGMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShDaGFubmVsICE9ICgodm9pZCopIDApKTsKKworICAvKiBSZWFkIFNEQURDX0pEQVRBUiByZWdpc3RlciBhbmQgZXh0cmFjdCBjaGFubmVsIGFuZCBjb252ZXJzaW9uIHZhbHVlICovCisgIHZhbHVlID0gaHNkYWRjLT5JbnN0YW5jZS0+SkRBVEFSOworICAqQ2hhbm5lbCA9ICgodmFsdWUgJiBTREFEQ19KREFUQVJfSkRBVEFDSCkgPj4gU0RBRENfSkRBVEFSX0NIX09GRlNFVCk7CisgIHZhbHVlICY9IFNEQURDX0pEQVRBUl9KREFUQTsKKyAgCisgIC8qIFJldHVybiBpbmplY3RlZCBjb252ZXJzaW9uIHZhbHVlICovCisgIHJldHVybiB2YWx1ZTsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byBzdGFydCBtdWx0aW1vZGUgcmVndWxhciBjb252ZXJzaW9ucyBpbiBETUEgbW9kZS4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBvbmx5IHdoZW4gU0RBREMgaW5zdGFuY2UgaXMgaW4gaWRsZSBzdGF0ZQorICAqICAgICAgICAgb3IgaWYgaW5qZWN0ZWQgY29udmVyc2lvbiBpcyBvbmdvaW5nLgorICAqIEBwYXJhbSAgaHNkYWRjIFNEQURDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBEYXRhIFRoZSBkZXN0aW5hdGlvbiBidWZmZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIExlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBTREFEQyBwZXJpcGhlcmFsIHRvIG1lbW9yeS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TREFEQ19NdWx0aU1vZGVTdGFydF9ETUEoU0RBRENfSGFuZGxlVHlwZURlZiogaHNkYWRjLCB1aW50MzJfdCogcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IExlbmd0aCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOworCisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NEQURDX0FMTF9JTlNUQU5DRShoc2RhZGMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShwRGF0YSAhPSAoKHZvaWQqKSAwKSk7CisgIGFzc2VydF9wYXJhbShMZW5ndGggIT0gMFVMKTsKKworICAvKiBDaGVjayBpbnN0YW5jZSBpcyBTREFEQzEgKi8KKyAgaWYoaHNkYWRjLT5JbnN0YW5jZSAhPSBTREFEQzEpCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgLyogQ2hlY2sgdGhhdCBETUEgaXMgbm90IGVuYWJsZWQgZm9yIGluamVjdGVkIGNvbnZlcnNpb24gKi8KKyAgZWxzZSBpZigoaHNkYWRjLT5JbnN0YW5jZS0+Q1IxICYgU0RBRENfQ1IxX0pETUFFTikgPT0gU0RBRENfQ1IxX0pETUFFTikKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICAvKiBDaGVjayBwYXJhbWV0ZXJzIGNvbXBhdGliaWxpdHkgKi8KKyAgZWxzZSBpZigoaHNkYWRjLT5SZWd1bGFyVHJpZ2dlciA9PSBTREFEQ19TT0ZUV0FSRV9UUklHR0VSKSAmJiBcCisgICAgICAgICAgKGhzZGFkYy0+UmVndWxhckNvbnRNb2RlID09IFNEQURDX0NPTlRJTlVPVVNfQ09OVl9PRkYpICYmIFwKKyAgICAgICAgICAoaHNkYWRjLT5oZG1hLT5Jbml0Lk1vZGUgPT0gRE1BX05PUk1BTCkgJiYgXAorICAgICAgICAgIChMZW5ndGggIT0gMVUpKQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIGVsc2UgaWYoKGhzZGFkYy0+UmVndWxhclRyaWdnZXIgPT0gU0RBRENfU09GVFdBUkVfVFJJR0dFUikgJiYgXAorICAgICAgICAgIChoc2RhZGMtPlJlZ3VsYXJDb250TW9kZSA9PSBTREFEQ19DT05USU5VT1VTX0NPTlZfT0ZGKSAmJiBcCisgICAgICAgICAgKGhzZGFkYy0+aGRtYS0+SW5pdC5Nb2RlID09IERNQV9DSVJDVUxBUikpCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgLyogQ2hlY2sgU0RBREMgc3RhdGUgKi8KKyAgZWxzZSBpZigoaHNkYWRjLT5TdGF0ZSA9PSBIQUxfU0RBRENfU1RBVEVfUkVBRFkpIHx8IFwKKyAgICAgICAgICAoaHNkYWRjLT5TdGF0ZSA9PSBIQUxfU0RBRENfU1RBVEVfSU5KKSkKKyAgeworICAgIC8qIFNldCBjYWxsYmFja3Mgb24gRE1BIGhhbmRsZXIgKi8KKyAgICBoc2RhZGMtPmhkbWEtPlhmZXJDcGx0Q2FsbGJhY2sgPSBTREFEQ19ETUFSZWd1bGFyQ29udkNwbHQ7CisgICAgaHNkYWRjLT5oZG1hLT5YZmVyRXJyb3JDYWxsYmFjayA9IFNEQURDX0RNQUVycm9yOworICAgIGlmKGhzZGFkYy0+aGRtYS0+SW5pdC5Nb2RlID09IERNQV9DSVJDVUxBUikKKyAgICB7CisgICAgICBoc2RhZGMtPmhkbWEtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gU0RBRENfRE1BUmVndWxhckhhbGZDb252Q3BsdDsKKyAgICB9CisgICAgLyogU2V0IFJETUFFTiBiaXQgaW4gU0RBRENfQ1IxIHJlZ2lzdGVyICovCisgICAgaHNkYWRjLT5JbnN0YW5jZS0+Q1IxIHw9IFNEQURDX0NSMV9SRE1BRU47CisKKyAgICAvKiBTdGFydCBETUEgaW4gaW50ZXJydXB0IG1vZGUgKi8KKyAgICBpZihoc2RhZGMtPlJlZ3VsYXJNdWx0aW1vZGUgPT0gU0RBRENfTVVMVElNT0RFX1NEQURDMV9TREFEQzIpCisgICAgeworICAgICAgc3RhdHVzID0gSEFMX0RNQV9TdGFydF9JVChoc2RhZGMtPmhkbWEsICh1aW50MzJfdCkmaHNkYWRjLT5JbnN0YW5jZS0+UkRBVEExMlIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSBwRGF0YSwgTGVuZ3RoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHN0YXR1cyA9IEhBTF9ETUFfU3RhcnRfSVQoaHNkYWRjLT5oZG1hLCAodWludDMyX3QpJmhzZGFkYy0+SW5zdGFuY2UtPlJEQVRBMTNSLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkgcERhdGEsIExlbmd0aCk7CisgICAgfQorICAgIGlmKHN0YXR1cyAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogU2V0IFNEQURDIGluIGVycm9yIHN0YXRlICovCisgICAgICBoc2RhZGMtPlN0YXRlID0gSEFMX1NEQURDX1NUQVRFX0VSUk9SOworICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogU3RhcnQgcmVndWxhciBjb252ZXJzaW9uICovCisgICAgICBzdGF0dXMgPSBTREFEQ19SZWdDb252U3RhcnQoaHNkYWRjKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byBzdG9wIG11bHRpbW9kZSByZWd1bGFyIGNvbnZlcnNpb25zIGluIERNQSBtb2RlLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9ubHkgaWYgcmVndWxhciBjb252ZXJzaW9uIGlzIG9uZ29pbmcuCisgICogQHBhcmFtICBoc2RhZGMgU0RBREMgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEQURDX011bHRpTW9kZVN0b3BfRE1BKFNEQURDX0hhbmRsZVR5cGVEZWYqIGhzZGFkYykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOworCisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NEQURDX0FMTF9JTlNUQU5DRShoc2RhZGMtPkluc3RhbmNlKSk7CisKKyAgLyogQ2hlY2sgaW5zdGFuY2UgaXMgU0RBREMxICovCisgIGlmKGhzZGFkYy0+SW5zdGFuY2UgIT0gU0RBREMxKQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIC8qIENoZWNrIFNEQURDIHN0YXRlICovCisgIGVsc2UgaWYoKGhzZGFkYy0+U3RhdGUgIT0gSEFMX1NEQURDX1NUQVRFX1JFRykgJiYgXAorICAgICAgICAgIChoc2RhZGMtPlN0YXRlICE9IEhBTF9TREFEQ19TVEFURV9SRUdfSU5KKSkKKyAgeworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2xlYXIgUkRNQUVOIGJpdCBpbiBTREFEQ19DUjEgcmVnaXN0ZXIgKi8KKyAgICBoc2RhZGMtPkluc3RhbmNlLT5DUjEgJj0gfihTREFEQ19DUjFfUkRNQUVOKTsKKworICAgIC8qIFN0b3AgY3VycmVudCBETUEgdHJhbnNmZXIgKi8KKyAgICBpZihIQUxfRE1BX0Fib3J0KGhzZGFkYy0+aGRtYSkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFNldCBTREFEQyBpbiBlcnJvciBzdGF0ZSAqLworICAgICAgaHNkYWRjLT5TdGF0ZSA9IEhBTF9TREFEQ19TVEFURV9FUlJPUjsKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFN0b3AgcmVndWxhciBjb252ZXJzaW9uICovCisgICAgICBzdGF0dXMgPSBTREFEQ19SZWdDb252U3RvcChoc2RhZGMpOworICAgIH0KKyAgfQorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gZ2V0IG11bHRpbW9kZSByZWd1bGFyIGNvbnZlcnNpb24gdmFsdWUuCisgICogQHBhcmFtICBoc2RhZGMgU0RBREMgaGFuZGxlLgorICAqIEByZXR2YWwgTXVsdGltb2RlIHJlZ3VsYXIgY29udmVyc2lvbiB2YWx1ZQorICAqLwordWludDMyX3QgSEFMX1NEQURDX011bHRpTW9kZUdldFZhbHVlKFNEQURDX0hhbmRsZVR5cGVEZWYqIGhzZGFkYykKK3sKKyAgdWludDMyX3QgdmFsdWU7CisgIAorICAvKiBDaGVjayBwYXJhbWV0ZXJzIGFuZCBjaGVjayBpbnN0YW5jZSBpcyBTREFEQzEgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NEQURDX0FMTF9JTlNUQU5DRShoc2RhZGMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShoc2RhZGMtPkluc3RhbmNlID09IFNEQURDMSk7CisKKyAgLyogcmVhZCBtdWx0aW1vZGUgcmVndWxhciB2YWx1ZSAqLworICB2YWx1ZSA9IChoc2RhZGMtPlJlZ3VsYXJNdWx0aW1vZGUgPT0gU0RBRENfTVVMVElNT0RFX1NEQURDMV9TREFEQzIpID8gXAorICAgICAgICAgIGhzZGFkYy0+SW5zdGFuY2UtPlJEQVRBMTJSIDogaHNkYWRjLT5JbnN0YW5jZS0+UkRBVEExM1I7CisKKyAgLyogUmV0dXJuIG11bHRpbW9kZSByZWd1bGFyIGNvbnZlcnNpb25zIHZhbHVlICovCisgIHJldHVybiB2YWx1ZTsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byBzdGFydCBtdWx0aW1vZGUgaW5qZWN0ZWQgY29udmVyc2lvbnMgaW4gRE1BIG1vZGUuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIFNEQURDIGluc3RhbmNlIGlzIGluIGlkbGUgc3RhdGUKKyAgKiAgICAgICAgIG9yIGlmIHJlZ3VsYXIgY29udmVyc2lvbiBpcyBvbmdvaW5nLgorICAqIEBwYXJhbSAgaHNkYWRjIFNEQURDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBEYXRhIFRoZSBkZXN0aW5hdGlvbiBidWZmZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIExlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBTREFEQyBwZXJpcGhlcmFsIHRvIG1lbW9yeS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TREFEQ19JbmplY3RlZE11bHRpTW9kZVN0YXJ0X0RNQShTREFEQ19IYW5kbGVUeXBlRGVmKiBoc2RhZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBEYXRhLCB1aW50MzJfdCBMZW5ndGgpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TREFEQ19BTExfSU5TVEFOQ0UoaHNkYWRjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0ocERhdGEgIT0gKCh2b2lkKikgMCkpOworICBhc3NlcnRfcGFyYW0oTGVuZ3RoICE9IDBVTCk7CisKKyAgLyogQ2hlY2sgaW5zdGFuY2UgaXMgU0RBREMxICovCisgIGlmKGhzZGFkYy0+SW5zdGFuY2UgIT0gU0RBREMxKQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIC8qIENoZWNrIHRoYXQgRE1BIGlzIG5vdCBlbmFibGVkIGZvciByZWd1bGFyIGNvbnZlcnNpb24gKi8KKyAgZWxzZSBpZigoaHNkYWRjLT5JbnN0YW5jZS0+Q1IxICYgU0RBRENfQ1IxX1JETUFFTikgPT0gU0RBRENfQ1IxX1JETUFFTikKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICAvKiBDaGVjayBwYXJhbWV0ZXJzIGNvbXBhdGliaWxpdHkgKi8KKyAgZWxzZSBpZigoaHNkYWRjLT5JbmplY3RlZFRyaWdnZXIgPT0gU0RBRENfU09GVFdBUkVfVFJJR0dFUikgJiYgXAorICAgICAgICAgIChoc2RhZGMtPkluamVjdGVkQ29udE1vZGUgPT0gU0RBRENfQ09OVElOVU9VU19DT05WX09GRikgJiYgXAorICAgICAgICAgIChoc2RhZGMtPmhkbWEtPkluaXQuTW9kZSA9PSBETUFfTk9STUFMKSAmJiBcCisgICAgICAgICAgKExlbmd0aCA+IChoc2RhZGMtPkluamVjdGVkQ2hhbm5lbHNOYnIgPDwgMVUpKSkKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICBlbHNlIGlmKChoc2RhZGMtPkluamVjdGVkVHJpZ2dlciA9PSBTREFEQ19TT0ZUV0FSRV9UUklHR0VSKSAmJiBcCisgICAgICAgICAgKGhzZGFkYy0+SW5qZWN0ZWRDb250TW9kZSA9PSBTREFEQ19DT05USU5VT1VTX0NPTlZfT0ZGKSAmJiBcCisgICAgICAgICAgKGhzZGFkYy0+aGRtYS0+SW5pdC5Nb2RlID09IERNQV9DSVJDVUxBUikpCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgLyogQ2hlY2sgU0RBREMgc3RhdGUgKi8KKyAgZWxzZSBpZigoaHNkYWRjLT5TdGF0ZSA9PSBIQUxfU0RBRENfU1RBVEVfUkVBRFkpIHx8IFwKKyAgICAgICAgICAoaHNkYWRjLT5TdGF0ZSA9PSBIQUxfU0RBRENfU1RBVEVfUkVHKSkKKyAgeworICAgIC8qIFNldCBjYWxsYmFja3Mgb24gRE1BIGhhbmRsZXIgKi8KKyAgICBoc2RhZGMtPmhkbWEtPlhmZXJDcGx0Q2FsbGJhY2sgPSBTREFEQ19ETUFJbmplY3RlZENvbnZDcGx0OworICAgIGhzZGFkYy0+aGRtYS0+WGZlckVycm9yQ2FsbGJhY2sgPSBTREFEQ19ETUFFcnJvcjsKKyAgICBpZihoc2RhZGMtPmhkbWEtPkluaXQuTW9kZSA9PSBETUFfQ0lSQ1VMQVIpCisgICAgeworICAgICAgaHNkYWRjLT5oZG1hLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFNEQURDX0RNQUluamVjdGVkSGFsZkNvbnZDcGx0OworICAgIH0KKyAgICAvKiBTZXQgSkRNQUVOIGJpdCBpbiBTREFEQ19DUjEgcmVnaXN0ZXIgKi8KKyAgICBoc2RhZGMtPkluc3RhbmNlLT5DUjEgfD0gU0RBRENfQ1IxX0pETUFFTjsKKworICAgIC8qIFN0YXJ0IERNQSBpbiBpbnRlcnJ1cHQgbW9kZSAqLworICAgIGlmKGhzZGFkYy0+SW5qZWN0ZWRNdWx0aW1vZGUgPT0gU0RBRENfTVVMVElNT0RFX1NEQURDMV9TREFEQzIpCisgICAgeworICAgICAgc3RhdHVzID0gSEFMX0RNQV9TdGFydF9JVChoc2RhZGMtPmhkbWEsICh1aW50MzJfdCkmaHNkYWRjLT5JbnN0YW5jZS0+SkRBVEExMlIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSBwRGF0YSwgTGVuZ3RoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHN0YXR1cyA9IEhBTF9ETUFfU3RhcnRfSVQoaHNkYWRjLT5oZG1hLCAodWludDMyX3QpJmhzZGFkYy0+SW5zdGFuY2UtPkpEQVRBMTNSLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkgcERhdGEsIExlbmd0aCk7CisgICAgfQorICAgIGlmKHN0YXR1cyAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogU2V0IFNEQURDIGluIGVycm9yIHN0YXRlICovCisgICAgICBoc2RhZGMtPlN0YXRlID0gSEFMX1NEQURDX1NUQVRFX0VSUk9SOworICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogU3RhcnQgaW5qZWN0ZWQgY29udmVyc2lvbiAqLworICAgICAgc3RhdHVzID0gU0RBRENfSW5qQ29udlN0YXJ0KGhzZGFkYyk7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gc3RvcCBtdWx0aW1vZGUgaW5qZWN0ZWQgY29udmVyc2lvbnMgaW4gRE1BIG1vZGUuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgb25seSBpZiBpbmplY3RlZCBjb252ZXJzaW9uIGlzIG9uZ29pbmcuCisgICogQHBhcmFtICBoc2RhZGMgU0RBREMgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEQURDX0luamVjdGVkTXVsdGlNb2RlU3RvcF9ETUEoU0RBRENfSGFuZGxlVHlwZURlZiogaHNkYWRjKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU0RBRENfQUxMX0lOU1RBTkNFKGhzZGFkYy0+SW5zdGFuY2UpKTsKKworICAvKiBDaGVjayBpbnN0YW5jZSBpcyBTREFEQzEgKi8KKyAgaWYoaHNkYWRjLT5JbnN0YW5jZSAhPSBTREFEQzEpCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgLyogQ2hlY2sgU0RBREMgc3RhdGUgKi8KKyAgZWxzZSBpZigoaHNkYWRjLT5TdGF0ZSAhPSBIQUxfU0RBRENfU1RBVEVfSU5KKSAmJiBcCisgICAgICAgICAgKGhzZGFkYy0+U3RhdGUgIT0gSEFMX1NEQURDX1NUQVRFX1JFR19JTkopKQorICB7CisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDbGVhciBKRE1BRU4gYml0IGluIFNEQURDX0NSMSByZWdpc3RlciAqLworICAgIGhzZGFkYy0+SW5zdGFuY2UtPkNSMSAmPSB+KFNEQURDX0NSMV9KRE1BRU4pOworCisgICAgLyogU3RvcCBjdXJyZW50IERNQSB0cmFuc2ZlciAqLworICAgIGlmKEhBTF9ETUFfQWJvcnQoaHNkYWRjLT5oZG1hKSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogU2V0IFNEQURDIGluIGVycm9yIHN0YXRlICovCisgICAgICBoc2RhZGMtPlN0YXRlID0gSEFMX1NEQURDX1NUQVRFX0VSUk9SOworICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogU3RvcCBpbmplY3RlZCBjb252ZXJzaW9uICovCisgICAgICBzdGF0dXMgPSBTREFEQ19JbmpDb252U3RvcChoc2RhZGMpOworICAgIH0KKyAgfQorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gZ2V0IG11bHRpbW9kZSBpbmplY3RlZCBjb252ZXJzaW9uIHZhbHVlLgorICAqIEBwYXJhbSAgaHNkYWRjIFNEQURDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE11bHRpbW9kZSBpbmplY3RlZCBjb252ZXJzaW9uIHZhbHVlCisgICovCit1aW50MzJfdCBIQUxfU0RBRENfSW5qZWN0ZWRNdWx0aU1vZGVHZXRWYWx1ZShTREFEQ19IYW5kbGVUeXBlRGVmKiBoc2RhZGMpCit7CisgIHVpbnQzMl90IHZhbHVlOworICAKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyBhbmQgY2hlY2sgaW5zdGFuY2UgaXMgU0RBREMxICovCisgIGFzc2VydF9wYXJhbShJU19TREFEQ19BTExfSU5TVEFOQ0UoaHNkYWRjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oaHNkYWRjLT5JbnN0YW5jZSA9PSBTREFEQzEpOworCisgIC8qIHJlYWQgbXVsdGltb2RlIGluamVjdGVkIHZhbHVlICovCisgIHZhbHVlID0gKGhzZGFkYy0+SW5qZWN0ZWRNdWx0aW1vZGUgPT0gU0RBRENfTVVMVElNT0RFX1NEQURDMV9TREFEQzIpID8gXAorICAgICAgICAgIGhzZGFkYy0+SW5zdGFuY2UtPkpEQVRBMTJSIDogaHNkYWRjLT5JbnN0YW5jZS0+SkRBVEExM1I7CisKKyAgLyogUmV0dXJuIG11bHRpbW9kZSBpbmplY3RlZCBjb252ZXJzaW9ucyB2YWx1ZSAqLworICByZXR1cm4gdmFsdWU7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBTREFEQyBpbnRlcnJ1cHRzLgorICAqIEBwYXJhbSAgaHNkYWRjIFNEQURDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1NEQURDX0lSUUhhbmRsZXIoU0RBRENfSGFuZGxlVHlwZURlZiogaHNkYWRjKQoreworICB1aW50MzJfdCB0bXBfaXNyID0gaHNkYWRjLT5JbnN0YW5jZS0+SVNSOworICAgIAorICAvKiBDaGVjayBpZiBlbmQgb2YgcmVndWxhciBjb252ZXJzaW9uICovCisgIGlmKCgoaHNkYWRjLT5JbnN0YW5jZS0+Q1IxICYgU0RBRENfQ1IxX1JFT0NJRSkgPT0gU0RBRENfQ1IxX1JFT0NJRSkgJiYKKyAgICAgKCh0bXBfaXNyICYgU0RBRENfSVNSX1JFT0NGKSA9PSBTREFEQ19JU1JfUkVPQ0YpKQorICB7CisgICAgLyogQ2FsbCByZWd1bGFyIGNvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBIQUxfU0RBRENfQ29udkNwbHRDYWxsYmFjayhoc2RhZGMpOworCisgICAgLyogRW5kIG9mIGNvbnZlcnNpb24gaWYgbW9kZSBpcyBub3QgY29udGludW91cyBhbmQgc29mdHdhcmUgdHJpZ2dlciAqLworICAgIGlmKChoc2RhZGMtPlJlZ3VsYXJDb250TW9kZSA9PSBTREFEQ19DT05USU5VT1VTX0NPTlZfT0ZGKSAmJiBcCisgICAgICAgKGhzZGFkYy0+UmVndWxhclRyaWdnZXIgPT0gU0RBRENfU09GVFdBUkVfVFJJR0dFUikpCisgICAgeworICAgICAgLyogQ2xlYXIgUkVPQ0lFIGFuZCBST1ZSSUUgYml0cyBpbiBTREFEQ19DUjEgcmVnaXN0ZXIgKi8KKyAgICAgIGhzZGFkYy0+SW5zdGFuY2UtPkNSMSAmPSB+KFNEQURDX0NSMV9SRU9DSUUgfCBTREFEQ19DUjFfUk9WUklFKTsKKworICAgICAgLyogVXBkYXRlIFNEQURDIHN0YXRlICovCisgICAgICBoc2RhZGMtPlN0YXRlID0gKGhzZGFkYy0+U3RhdGUgPT0gSEFMX1NEQURDX1NUQVRFX1JFRykgPyBcCisgICAgICAgICAgICAgICAgICAgICAgSEFMX1NEQURDX1NUQVRFX1JFQURZIDogSEFMX1NEQURDX1NUQVRFX0lOSjsKKyAgICB9CisgIH0KKyAgLyogQ2hlY2sgaWYgZW5kIG9mIGluamVjdGVkIGNvbnZlcnNpb24gKi8KKyAgZWxzZSBpZigoKGhzZGFkYy0+SW5zdGFuY2UtPkNSMSAmIFNEQURDX0NSMV9KRU9DSUUpID09IFNEQURDX0NSMV9KRU9DSUUpICYmCisgICAgICAgICAgKCh0bXBfaXNyICYgU0RBRENfSVNSX0pFT0NGKSA9PSBTREFEQ19JU1JfSkVPQ0YpKQorICB7CisgICAgLyogQ2FsbCBpbmplY3RlZCBjb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgSEFMX1NEQURDX0luamVjdGVkQ29udkNwbHRDYWxsYmFjayhoc2RhZGMpOworCisgICAgLyogVXBkYXRlIHJlbWFpbmluZyBpbmplY3RlZCBjb252ZXJzaW9ucyAqLworICAgIGhzZGFkYy0+SW5qQ29udlJlbWFpbmluZy0tOworICAgIGlmKGhzZGFkYy0+SW5qQ29udlJlbWFpbmluZyA9PTBVTCkKKyAgICB7CisgICAgICAvKiBlbmQgb2YgaW5qZWN0ZWQgc2VxdWVuY2UsIHJlc2V0IHRoZSB2YWx1ZSAqLworICAgICAgaHNkYWRjLT5JbmpDb252UmVtYWluaW5nID0gaHNkYWRjLT5JbmplY3RlZENoYW5uZWxzTmJyOworICAgIH0KKyAgICAvKiBFbmQgb2YgY29udmVyc2lvbiBpZiBtb2RlIGlzIG5vdCBjb250aW51b3VzLCBzb2Z0d2FyZSB0cmlnZ2VyICovCisgICAgLyogYW5kIGVuZCBvZiBpbmplY3RlZCBzZXF1ZW5jZSAqLworICAgIGlmKChoc2RhZGMtPkluamVjdGVkQ29udE1vZGUgPT0gU0RBRENfQ09OVElOVU9VU19DT05WX09GRikgJiYgXAorICAgICAgIChoc2RhZGMtPkluamVjdGVkVHJpZ2dlciA9PSBTREFEQ19TT0ZUV0FSRV9UUklHR0VSKSAmJiBcCisgICAgICAgKGhzZGFkYy0+SW5qQ29udlJlbWFpbmluZyA9PSBoc2RhZGMtPkluamVjdGVkQ2hhbm5lbHNOYnIpKQorICAgIHsKKyAgICAgIC8qIENsZWFyIEpFT0NJRSBhbmQgSk9WUklFIGJpdHMgaW4gU0RBRENfQ1IxIHJlZ2lzdGVyICovCisgICAgICBoc2RhZGMtPkluc3RhbmNlLT5DUjEgJj0gfihTREFEQ19DUjFfSkVPQ0lFIHwgU0RBRENfQ1IxX0pPVlJJRSk7CisKKyAgICAgIC8qIFVwZGF0ZSBTREFEQyBzdGF0ZSAqLworICAgICAgaHNkYWRjLT5TdGF0ZSA9IChoc2RhZGMtPlN0YXRlID09IEhBTF9TREFEQ19TVEFURV9JTkopID8gXAorICAgICAgICAgICAgICAgICAgICAgIEhBTF9TREFEQ19TVEFURV9SRUFEWSA6IEhBTF9TREFEQ19TVEFURV9SRUc7CisgICAgfQorICB9CisgIC8qIENoZWNrIGlmIGVuZCBvZiBjYWxpYnJhdGlvbiAqLworICBlbHNlIGlmKCgoaHNkYWRjLT5JbnN0YW5jZS0+Q1IxICYgU0RBRENfQ1IxX0VPQ0FMSUUpID09IFNEQURDX0NSMV9FT0NBTElFKSAmJgorICAgICAgICAgICgodG1wX2lzciAmIFNEQURDX0lTUl9FT0NBTEYpID09IFNEQURDX0lTUl9FT0NBTEYpKQorICB7CisgICAgLyogQ2xlYXIgRU9DQUxJRSBiaXQgaW4gU0RBRENfQ1IxIHJlZ2lzdGVyICovCisgICAgaHNkYWRjLT5JbnN0YW5jZS0+Q1IxICY9IH4oU0RBRENfQ1IxX0VPQ0FMSUUpOworCisgICAgLyogU2V0IENMUkVPQ0FMRiBiaXQgaW4gU0RBRENfQ0xSSVNSIHJlZ2lzdGVyICovCisgICAgaHNkYWRjLT5JbnN0YW5jZS0+Q0xSSVNSIHw9IFNEQURDX0lTUl9DTFJFT0NBTEY7CisKKyAgICAvKiBDYWxsIGNhbGlicmF0aW9uIGNhbGxiYWNrICovCisgICAgSEFMX1NEQURDX0NhbGlicmF0aW9uQ3BsdENhbGxiYWNrKGhzZGFkYyk7CisKKyAgICAvKiBVcGRhdGUgU0RBREMgc3RhdGUgKi8KKyAgICBoc2RhZGMtPlN0YXRlID0gSEFMX1NEQURDX1NUQVRFX1JFQURZOworICB9CisgIC8qIENoZWNrIGlmIG92ZXJydW4gb2NjdXJzIGR1cmluZyByZWd1bGFyIGNvbnZlcnNpb24gKi8KKyAgZWxzZSBpZigoKGhzZGFkYy0+SW5zdGFuY2UtPkNSMSAmIFNEQURDX0NSMV9ST1ZSSUUpID09IFNEQURDX0NSMV9ST1ZSSUUpICYmCisgICAgICAgICAgKCh0bXBfaXNyICYgU0RBRENfSVNSX1JPVlJGKSA9PSBTREFEQ19JU1JfUk9WUkYpKQorICB7CisgICAgLyogU2V0IENMUlJPVlJGIGJpdCBpbiBTREFEQ19DTFJJU1IgcmVnaXN0ZXIgKi8KKyAgICBoc2RhZGMtPkluc3RhbmNlLT5DTFJJU1IgfD0gU0RBRENfSVNSX0NMUlJPVlJGOworCisgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICBoc2RhZGMtPkVycm9yQ29kZSA9IFNEQURDX0VSUk9SX1JFR1VMQVJfT1ZFUlJVTjsKKworICAgIC8qIENhbGwgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICBIQUxfU0RBRENfRXJyb3JDYWxsYmFjayhoc2RhZGMpOworICB9CisgIC8qIENoZWNrIGlmIG92ZXJydW4gb2NjdXJzIGR1cmluZyBpbmplY3RlZCBjb252ZXJzaW9uICovCisgIGVsc2UgaWYoKChoc2RhZGMtPkluc3RhbmNlLT5DUjEgJiBTREFEQ19DUjFfSk9WUklFKSA9PSBTREFEQ19DUjFfSk9WUklFKSAmJgorICAgICAgICAgICgodG1wX2lzciAmIFNEQURDX0lTUl9KT1ZSRikgPT0gU0RBRENfSVNSX0pPVlJGKSkKKyAgeworICAgIC8qIFNldCBDTFJKT1ZSRiBiaXQgaW4gU0RBRENfQ0xSSVNSIHJlZ2lzdGVyICovCisgICAgaHNkYWRjLT5JbnN0YW5jZS0+Q0xSSVNSIHw9IFNEQURDX0lTUl9DTFJKT1ZSRjsKKworICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovCisgICAgaHNkYWRjLT5FcnJvckNvZGUgPSBTREFEQ19FUlJPUl9JTkpFQ1RFRF9PVkVSUlVOOworCisgICAgLyogQ2FsbCBlcnJvciBjYWxsYmFjayAqLworICAgIEhBTF9TREFEQ19FcnJvckNhbGxiYWNrKGhzZGFkYyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogTm8gYWRkaXRpb25hbCBJUlEgc291cmNlICovCisgIH0KKyAgCisgIHJldHVybjsKK30KKworLyoqCisgICogQGJyaWVmICBDYWxpYnJhdGlvbiBjb21wbGV0ZSBjYWxsYmFjay4gCisgICogQHBhcmFtICBoc2RhZGMgU0RBREMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NEQURDX0NhbGlicmF0aW9uQ3BsdENhbGxiYWNrKFNEQURDX0hhbmRsZVR5cGVEZWYqIGhzZGFkYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNkYWRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NEQURDX0NhbGlicmF0aW9uQ3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgSGFsZiByZWd1bGFyIGNvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2suIAorICAqIEBwYXJhbSAgaHNkYWRjIFNEQURDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TREFEQ19Db252SGFsZkNwbHRDYWxsYmFjayhTREFEQ19IYW5kbGVUeXBlRGVmKiBoc2RhZGMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzZGFkYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TREFEQ19Db252SGFsZkNwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlZ3VsYXIgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjay4gCisgICogQG5vdGUgICBJbiBpbnRlcnJ1cHQgbW9kZSwgdXNlciBoYXMgdG8gcmVhZCBjb252ZXJzaW9uIHZhbHVlIGluIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgICAgIHVzaW5nIEhBTF9TREFEQ19HZXRWYWx1ZSBvciBIQUxfU0RBRENfTXVsdGlNb2RlR2V0VmFsdWUuCisgICogQHBhcmFtICBoc2RhZGMgU0RBREMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NEQURDX0NvbnZDcGx0Q2FsbGJhY2soU0RBRENfSGFuZGxlVHlwZURlZiogaHNkYWRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc2RhZGMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU0RBRENfQ29udkNwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBIYWxmIGluamVjdGVkIGNvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2suIAorICAqIEBwYXJhbSAgaHNkYWRjIFNEQURDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TREFEQ19JbmplY3RlZENvbnZIYWxmQ3BsdENhbGxiYWNrKFNEQURDX0hhbmRsZVR5cGVEZWYqIGhzZGFkYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNkYWRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NEQURDX0luamVjdGVkQ29udkhhbGZDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgSW5qZWN0ZWQgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjay4gCisgICogQG5vdGUgICBJbiBpbnRlcnJ1cHQgbW9kZSwgdXNlciBoYXMgdG8gcmVhZCBjb252ZXJzaW9uIHZhbHVlIGluIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgICAgIHVzaW5nIEhBTF9TREFEQ19JbmplY3RlZEdldFZhbHVlIG9yIEhBTF9TREFEQ19JbmplY3RlZE11bHRpTW9kZUdldFZhbHVlLgorICAqIEBwYXJhbSAgaHNkYWRjIFNEQURDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TREFEQ19JbmplY3RlZENvbnZDcGx0Q2FsbGJhY2soU0RBRENfSGFuZGxlVHlwZURlZiogaHNkYWRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc2RhZGMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU0RBRENfSW5qZWN0ZWRDb252Q3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEVycm9yIGNhbGxiYWNrLiAKKyAgKiBAcGFyYW0gIGhzZGFkYyBTREFEQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU0RBRENfRXJyb3JDYWxsYmFjayhTREFEQ19IYW5kbGVUeXBlRGVmKiBoc2RhZGMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzZGFkYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TREFEQ19FcnJvckNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBoYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrIGZvciByZWd1bGFyIGNvbnZlcnNpb24uIAorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU0RBRENfRE1BUmVndWxhckhhbGZDb252Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgICAKK3sKKyAgLyogR2V0IFNEQURDIGhhbmRsZSAqLworICBTREFEQ19IYW5kbGVUeXBlRGVmKiBoc2RhZGMgPSAoU0RBRENfSGFuZGxlVHlwZURlZiopICgoRE1BX0hhbmRsZVR5cGVEZWYqKWhkbWEpLT5QYXJlbnQ7CisKKyAgLyogQ2FsbCByZWd1bGFyIGhhbGYgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayAqLworICBIQUxfU0RBRENfQ29udkhhbGZDcGx0Q2FsbGJhY2soaHNkYWRjKTsKK30KKworLyoqCisgICogQGJyaWVmICBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgZm9yIHJlZ3VsYXIgY29udmVyc2lvbi4gCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTREFEQ19ETUFSZWd1bGFyQ29udkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpICAgCit7CisgIC8qIEdldCBTREFEQyBoYW5kbGUgKi8KKyAgU0RBRENfSGFuZGxlVHlwZURlZiogaHNkYWRjID0gKFNEQURDX0hhbmRsZVR5cGVEZWYqKSAoKERNQV9IYW5kbGVUeXBlRGVmKiloZG1hKS0+UGFyZW50OworCisgIC8qIENhbGwgcmVndWxhciBjb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrICovCisgIEhBTF9TREFEQ19Db252Q3BsdENhbGxiYWNrKGhzZGFkYyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIGhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgZm9yIGluamVjdGVkIGNvbnZlcnNpb24uIAorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU0RBRENfRE1BSW5qZWN0ZWRIYWxmQ29udkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpICAgCit7CisgIC8qIEdldCBTREFEQyBoYW5kbGUgKi8KKyAgU0RBRENfSGFuZGxlVHlwZURlZiogaHNkYWRjID0gKFNEQURDX0hhbmRsZVR5cGVEZWYqKSAoKERNQV9IYW5kbGVUeXBlRGVmKiloZG1hKS0+UGFyZW50OworCisgIC8qIENhbGwgaW5qZWN0ZWQgaGFsZiBjb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrICovCisgIEhBTF9TREFEQ19JbmplY3RlZENvbnZIYWxmQ3BsdENhbGxiYWNrKGhzZGFkYyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrIGZvciBpbmplY3RlZCBjb252ZXJzaW9uLiAKKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNEQURDX0RNQUluamVjdGVkQ29udkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpICAgCit7CisgIC8qIEdldCBTREFEQyBoYW5kbGUgKi8KKyAgU0RBRENfSGFuZGxlVHlwZURlZiogaHNkYWRjID0gKFNEQURDX0hhbmRsZVR5cGVEZWYqKSAoKERNQV9IYW5kbGVUeXBlRGVmKiloZG1hKS0+UGFyZW50OworCisgIC8qIENhbGwgaW5qZWN0ZWQgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayAqLworICBIQUxfU0RBRENfSW5qZWN0ZWRDb252Q3BsdENhbGxiYWNrKGhzZGFkYyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIGVycm9yIGNhbGxiYWNrLiAKKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNEQURDX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSAgIAoreworICAvKiBHZXQgU0RBREMgaGFuZGxlICovCisgIFNEQURDX0hhbmRsZVR5cGVEZWYqIGhzZGFkYyA9IChTREFEQ19IYW5kbGVUeXBlRGVmKikgKChETUFfSGFuZGxlVHlwZURlZiopaGRtYSktPlBhcmVudDsKKworICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICBoc2RhZGMtPkVycm9yQ29kZSA9IFNEQURDX0VSUk9SX0RNQTsKKworICAvKiBDYWxsIGVycm9yIGNhbGxiYWNrICovCisgIEhBTF9TREFEQ19FcnJvckNhbGxiYWNrKGhzZGFkYyk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU0RBRENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICogIEBicmllZiAgIFNEQURDIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zIAorICoKK0B2ZXJiYXRpbSAgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgIyMjIyMgQURDIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgIFsuLl0gVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bworICAgICAgKCspIEdldCB0aGUgU0RBREMgc3RhdGUKKyAgICAgICgrKSBHZXQgdGhlIFNEQURDIEVycm9yCisgICAgICAgICAKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisgIAorLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byBnZXQgdGhlIGN1cnJlbnQgU0RBREMgc3RhdGUuCisgICogQHBhcmFtICBoc2RhZGMgU0RBREMgaGFuZGxlLgorICAqIEByZXR2YWwgU0RBREMgc3RhdGUuCisgICovCitIQUxfU0RBRENfU3RhdGVUeXBlRGVmIEhBTF9TREFEQ19HZXRTdGF0ZShTREFEQ19IYW5kbGVUeXBlRGVmKiBoc2RhZGMpCit7CisgIHJldHVybiBoc2RhZGMtPlN0YXRlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIGdldCB0aGUgY3VycmVudCBTREFEQyBlcnJvciBjb2RlLgorICAqIEBwYXJhbSAgaHNkYWRjIFNEQURDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIFNEQURDIGVycm9yIGNvZGUuCisgICovCit1aW50MzJfdCBIQUxfU0RBRENfR2V0RXJyb3IoU0RBRENfSGFuZGxlVHlwZURlZiogaHNkYWRjKQoreworICByZXR1cm4gaHNkYWRjLT5FcnJvckNvZGU7Cit9CisgICAgCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgU0RBRENfUHJpdmF0ZV9GdW5jdGlvbnMgU0RBREMgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIGVudGVyIGluIGluaXQgbW9kZSBmb3IgU0RBREMgaW5zdGFuY2UuCisgICogQHBhcmFtICBoc2RhZGMgU0RBREMgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cy4KKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTREFEQ19FbnRlckluaXRNb2RlKFNEQURDX0hhbmRsZVR5cGVEZWYqIGhzZGFkYykKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICAKKyAgLyogU2V0IElOSVQgYml0IG9uIFNEQURDX0NSMSByZWdpc3RlciAqLworICBoc2RhZGMtPkluc3RhbmNlLT5DUjEgfD0gU0RBRENfQ1IxX0lOSVQ7CisKKyAgLyogV2FpdCBJTklUUkRZIGJpdCBvbiBTREFEQ19JU1IgKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgd2hpbGUoKGhzZGFkYy0+SW5zdGFuY2UtPklTUiAmIFNEQURDX0lTUl9JTklUUkRZKSA9PSAodWludDMyX3QpUkVTRVQpCisgIHsKKyAgICBpZigoSEFMX0dldFRpY2soKS10aWNrc3RhcnQpID4gU0RBRENfVElNRU9VVCkKKyAgICB7ICAgICAgIAorICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0gCisgIH0KKyAgCisgIC8qIFJldHVybiBIQUwgc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gZXhpdCBmcm9tIGluaXQgbW9kZSBmb3IgU0RBREMgaW5zdGFuY2UuCisgICogQHBhcmFtICBoc2RhZGMgU0RBREMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KK3N0YXRpYyB2b2lkIFNEQURDX0V4aXRJbml0TW9kZShTREFEQ19IYW5kbGVUeXBlRGVmKiBoc2RhZGMpCit7CisgIC8qIFJlc2V0IElOSVQgYml0IGluIFNEQURDX0NSMSByZWdpc3RlciAqLworICBoc2RhZGMtPkluc3RhbmNlLT5DUjEgJj0gfihTREFEQ19DUjFfSU5JVCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gZ2V0IHRoZSBudW1iZXIgb2YgaW5qZWN0ZWQgY2hhbm5lbHMuCisgICogQHBhcmFtICBDaGFubmVscyBiaXRmaWVsZCBvZiBpbmplY3RlZCBjaGFubmVscy4KKyAgKiBAcmV0dmFsIE51bWJlciBvZiBpbmplY3RlZCBjaGFubmVscy4KKyAgKi8KK3N0YXRpYyB1aW50MzJfdCBTREFEQ19HZXRJbmpDaGFubmVsc05icih1aW50MzJfdCBDaGFubmVscykKK3sKKyAgdWludDMyX3QgbmJDaGFubmVscyA9IDBVTDsKKyAgdWludDMyX3QgdG1wLGk7CisgIAorICAvKiBHZXQgdGhlIG51bWJlciBvZiBjaGFubmVscyBmcm9tIGJpdGZpZWxkICovCisgIHRtcCA9ICh1aW50MzJfdCkgKENoYW5uZWxzICYgU0RBRENfTFNCX01BU0spOworICBmb3IoaSA9IDBVTCA7IGkgPCA5VUwgOyBpKyspCisgIHsKKyAgICBpZigodG1wICYgMHgwMDAwMDAwMVVMKSAhPSAwVUwpCisgICAgeworICAgICAgbmJDaGFubmVscysrOworICAgIH0KKyAgICB0bXAgPSAodWludDMyX3QpICh0bXAgPj4gMVVMKTsKKyAgfQorICByZXR1cm4gbmJDaGFubmVsczsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byByZWFsbHkgc3RhcnQgcmVndWxhciBjb252ZXJzaW9uLgorICAqIEBwYXJhbSAgaHNkYWRjIFNEQURDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMuCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU0RBRENfUmVnQ29udlN0YXJ0KFNEQURDX0hhbmRsZVR5cGVEZWYqIGhzZGFkYykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIENoZWNrIHJlZ3VsYXIgdHJpZ2dlciAqLworICBpZihoc2RhZGMtPlJlZ3VsYXJUcmlnZ2VyID09IFNEQURDX1NPRlRXQVJFX1RSSUdHRVIpCisgIHsKKyAgICAvKiBTZXQgUlNXU1RBUlQgYml0IGluIFNEQURDX0NSMiByZWdpc3RlciAqLworICAgIGhzZGFkYy0+SW5zdGFuY2UtPkNSMiB8PSBTREFEQ19DUjJfUlNXU1RBUlQ7CisgIH0KKyAgZWxzZSAvKiBzeW5jaHJvbnVvdXMgdHJpZ2dlciAqLworICB7CisgICAgLyogRW50ZXIgaW5pdCBtb2RlICovCisgICAgaWYoU0RBRENfRW50ZXJJbml0TW9kZShoc2RhZGMpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBTZXQgU0RBREMgaW4gZXJyb3Igc3RhdGUgKi8KKyAgICAgIGhzZGFkYy0+U3RhdGUgPSBIQUxfU0RBRENfU1RBVEVfRVJST1I7CisgICAgICBzdGF0dXMgPSBIQUxfVElNRU9VVDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFNldCBSU1lOQyBiaXQgaW4gU0RBRENfQ1IxIHJlZ2lzdGVyICovCisgICAgICBoc2RhZGMtPkluc3RhbmNlLT5DUjEgfD0gU0RBRENfQ1IxX1JTWU5DOworCisgICAgICAvKiBFeGl0IGluaXQgbW9kZSAqLworICAgICAgU0RBRENfRXhpdEluaXRNb2RlKGhzZGFkYyk7CisgICAgfQorICB9CisgIC8qIFVwZGF0ZSBTREFEQyBzdGF0ZSBvbmx5IGlmIHN0YXR1cyBpcyBPSyAqLworICBpZihzdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgaHNkYWRjLT5TdGF0ZSA9IChoc2RhZGMtPlN0YXRlID09IEhBTF9TREFEQ19TVEFURV9SRUFEWSkgPyBcCisgICAgICAgICAgICAgICAgICAgIEhBTF9TREFEQ19TVEFURV9SRUcgOiBIQUxfU0RBRENfU1RBVEVfUkVHX0lOSjsKKyAgfQorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gcmVhbGx5IHN0b3AgcmVndWxhciBjb252ZXJzaW9uLgorICAqIEBwYXJhbSAgaHNkYWRjIFNEQURDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMuCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU0RBRENfUmVnQ29udlN0b3AoU0RBRENfSGFuZGxlVHlwZURlZiogaHNkYWRjKQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisgIF9fSU8gdWludDMyX3QgZHVtbXlfcmVhZF9mb3JfcmVnaXN0ZXJfcmVzZXQ7CisgIAorICAvKiBDaGVjayBjb250aW51b3VzIG1vZGUgKi8KKyAgaWYoaHNkYWRjLT5SZWd1bGFyQ29udE1vZGUgPT0gU0RBRENfQ09OVElOVU9VU19DT05WX09OKQorICB7CisgICAgLyogQ2xlYXIgUkVPQ0YgYnkgcmVhZGluZyBTREFEQ19SREFUQVIgcmVnaXN0ZXIgKi8KKyAgICBkdW1teV9yZWFkX2Zvcl9yZWdpc3Rlcl9yZXNldCA9IGhzZGFkYy0+SW5zdGFuY2UtPlJEQVRBUjsKKyAgICBVTlVTRUQoZHVtbXlfcmVhZF9mb3JfcmVnaXN0ZXJfcmVzZXQpOworCisgICAgLyogQ2xlYXIgUkNPTlQgYml0IGluIFNEQURDX0NSMiByZWdpc3RlciAqLworICAgIGhzZGFkYy0+SW5zdGFuY2UtPkNSMiAmPSB+KFNEQURDX0NSMl9SQ09OVCk7CisgIH0KKyAgLyogV2FpdCBmb3IgdGhlIGVuZCBvZiByZWd1bGFyIGNvbnZlcnNpb24gKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsgIAorICB3aGlsZSgoaHNkYWRjLT5JbnN0YW5jZS0+SVNSICYgU0RBRENfSVNSX1JDSVApICE9IDBVTCkKKyAgeworICAgIGlmKChIQUxfR2V0VGljaygpLXRpY2tzdGFydCkgPiBTREFEQ19USU1FT1VUKQorICAgIHsKKyAgICAgIC8qIFNldCBTREFEQyBpbiBlcnJvciBzdGF0ZSBhbmQgcmV0dXJuIHRpbWVvdXQgc3RhdHVzICovCisgICAgICBoc2RhZGMtPlN0YXRlID0gSEFMX1NEQURDX1NUQVRFX0VSUk9SOworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorICAvKiBDaGVjayBpZiB0cmlnZ2VyIGlzIHN5bmNocm9udW91cyAqLworICBpZihoc2RhZGMtPlJlZ3VsYXJUcmlnZ2VyID09IFNEQURDX1NZTkNIUk9OT1VTX1RSSUdHRVIpCisgIHsKKyAgICAvKiBFbnRlciBpbml0IG1vZGUgKi8KKyAgICBpZihTREFEQ19FbnRlckluaXRNb2RlKGhzZGFkYykgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFNldCBTREFEQyBpbiBlcnJvciBzdGF0ZSBhbmQgcmV0dXJuIHRpbWVvdXQgc3RhdHVzICovCisgICAgICBoc2RhZGMtPlN0YXRlID0gSEFMX1NEQURDX1NUQVRFX0VSUk9SOworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogQ2xlYXIgUlNZTkMgYml0IGluIFNEQURDX0NSMSByZWdpc3RlciAqLworICAgICAgaHNkYWRjLT5JbnN0YW5jZS0+Q1IxICY9IH4oU0RBRENfQ1IxX1JTWU5DKTsKKworICAgICAgLyogRXhpdCBpbml0IG1vZGUgKi8KKyAgICAgIFNEQURDX0V4aXRJbml0TW9kZShoc2RhZGMpOworICAgIH0KKyAgfQorICAvKiBDaGVjayBpZiBjb250aW51b3VzIG1vZGUgKi8KKyAgaWYoaHNkYWRjLT5SZWd1bGFyQ29udE1vZGUgPT0gU0RBRENfQ09OVElOVU9VU19DT05WX09OKQorICB7CisgICAgLyogUmVzdG9yZSBSQ09OVCBiaXQgaW4gU0RBRENfQ1IyIHJlZ2lzdGVyICovCisgICAgaHNkYWRjLT5JbnN0YW5jZS0+Q1IyIHw9IFNEQURDX0NSMl9SQ09OVDsKKyAgfQorICAvKiBDbGVhciBSRU9DRiBieSByZWFkaW5nIFNEQURDX1JEQVRBUiByZWdpc3RlciAqLworICBkdW1teV9yZWFkX2Zvcl9yZWdpc3Rlcl9yZXNldCA9IGhzZGFkYy0+SW5zdGFuY2UtPlJEQVRBUjsKKyAgVU5VU0VEKGR1bW15X3JlYWRfZm9yX3JlZ2lzdGVyX3Jlc2V0KTsKKworICAvKiBTZXQgQ0xSUk9WUkYgYml0IGluIFNEQURDX0NMUklTUiByZWdpc3RlciAqLworICBoc2RhZGMtPkluc3RhbmNlLT5DTFJJU1IgfD0gU0RBRENfSVNSX0NMUlJPVlJGOworCisgIC8qIFVwZGF0ZSBTREFEQyBzdGF0ZSAqLworICBoc2RhZGMtPlN0YXRlID0gKGhzZGFkYy0+U3RhdGUgPT0gSEFMX1NEQURDX1NUQVRFX1JFRykgPyBcCisgICAgICAgICAgICAgICAgICBIQUxfU0RBRENfU1RBVEVfUkVBRFkgOiBIQUxfU0RBRENfU1RBVEVfSU5KOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byByZWFsbHkgc3RhcnQgaW5qZWN0ZWQgY29udmVyc2lvbi4KKyAgKiBAcGFyYW0gIGhzZGFkYyBTREFEQyBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzLgorICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNEQURDX0luakNvbnZTdGFydChTREFEQ19IYW5kbGVUeXBlRGVmKiBoc2RhZGMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBJbml0aWFsaXplIG51bWJlciBvZiBpbmplY3RlZCBjb252ZXJzaW9ucyByZW1haW5pbmcgKi8KKyAgaHNkYWRjLT5JbmpDb252UmVtYWluaW5nID0gaHNkYWRjLT5JbmplY3RlZENoYW5uZWxzTmJyOworCisgIC8qIENoZWNrIGluamVjdGVkIHRyaWdnZXIgKi8KKyAgaWYoaHNkYWRjLT5JbmplY3RlZFRyaWdnZXIgPT0gU0RBRENfU09GVFdBUkVfVFJJR0dFUikKKyAgeworICAgIC8qIFNldCBKU1dTVEFSVCBiaXQgaW4gU0RBRENfQ1IyIHJlZ2lzdGVyICovCisgICAgaHNkYWRjLT5JbnN0YW5jZS0+Q1IyIHw9IFNEQURDX0NSMl9KU1dTVEFSVDsKKyAgfQorICBlbHNlIC8qIGV4dGVybmFsIG9yIHN5bmNocm9udW91cyB0cmlnZ2VyICovCisgIHsKKyAgICAvKiBFbnRlciBpbml0IG1vZGUgKi8KKyAgICBpZihTREFEQ19FbnRlckluaXRNb2RlKGhzZGFkYykgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFNldCBTREFEQyBpbiBlcnJvciBzdGF0ZSAqLworICAgICAgaHNkYWRjLT5TdGF0ZSA9IEhBTF9TREFEQ19TVEFURV9FUlJPUjsKKyAgICAgIHN0YXR1cyA9IEhBTF9USU1FT1VUOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYoaHNkYWRjLT5JbmplY3RlZFRyaWdnZXIgPT0gU0RBRENfU1lOQ0hST05PVVNfVFJJR0dFUikKKyAgICAgIHsKKyAgICAgICAgLyogU2V0IEpTWU5DIGJpdCBpbiBTREFEQ19DUjEgcmVnaXN0ZXIgKi8KKyAgICAgICAgaHNkYWRjLT5JbnN0YW5jZS0+Q1IxIHw9IFNEQURDX0NSMV9KU1lOQzsKKyAgICAgIH0KKyAgICAgIGVsc2UgLyogZXh0ZXJuYWwgdHJpZ2dlciAqLworICAgICAgeworICAgICAgICAvKiBTZXQgSkVYVEVOWzE6MF0gYml0cyBpbiBTREFEQ19DUjIgcmVnaXN0ZXIgKi8KKyAgICAgICAgaHNkYWRjLT5JbnN0YW5jZS0+Q1IyIHw9IGhzZGFkYy0+RXh0VHJpZ2dlckVkZ2U7CisgICAgICB9CisgICAgICAvKiBFeGl0IGluaXQgbW9kZSAqLworICAgICAgU0RBRENfRXhpdEluaXRNb2RlKGhzZGFkYyk7CisgICAgfQorICB9CisgIC8qIFVwZGF0ZSBTREFEQyBzdGF0ZSBvbmx5IGlmIHN0YXR1cyBpcyBPSyAqLworICBpZihzdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgaHNkYWRjLT5TdGF0ZSA9IChoc2RhZGMtPlN0YXRlID09IEhBTF9TREFEQ19TVEFURV9SRUFEWSkgPyBcCisgICAgICAgICAgICAgICAgICAgIEhBTF9TREFEQ19TVEFURV9JTkogOiBIQUxfU0RBRENfU1RBVEVfUkVHX0lOSjsKKyAgfQorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gcmVhbGx5IHN0b3AgaW5qZWN0ZWQgY29udmVyc2lvbi4KKyAgKiBAcGFyYW0gIGhzZGFkYyBTREFEQyBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzLgorICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNEQURDX0luakNvbnZTdG9wKFNEQURDX0hhbmRsZVR5cGVEZWYqIGhzZGFkYykKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICBfX0lPIHVpbnQzMl90IGR1bW15X3JlYWRfZm9yX3JlZ2lzdGVyX3Jlc2V0OworICAKKyAgLyogQ2hlY2sgY29udGludW91cyBtb2RlICovCisgIGlmKGhzZGFkYy0+SW5qZWN0ZWRDb250TW9kZSA9PSBTREFEQ19DT05USU5VT1VTX0NPTlZfT04pCisgIHsKKyAgICAvKiBDbGVhciBKRU9DRiBieSByZWFkaW5nIFNEQURDX0pEQVRBUiByZWdpc3RlciAqLworICAgIGR1bW15X3JlYWRfZm9yX3JlZ2lzdGVyX3Jlc2V0ID0gIGhzZGFkYy0+SW5zdGFuY2UtPkpEQVRBUjsKKyAgICBVTlVTRUQoZHVtbXlfcmVhZF9mb3JfcmVnaXN0ZXJfcmVzZXQpOworCisgICAgLyogQ2xlYXIgSkNPTlQgYml0IGluIFNEQURDX0NSMiByZWdpc3RlciAqLworICAgIGhzZGFkYy0+SW5zdGFuY2UtPkNSMiAmPSB+KFNEQURDX0NSMl9KQ09OVCk7CisgIH0KKyAgLyogV2FpdCBmb3IgdGhlIGVuZCBvZiBpbmplY3RlZCBjb252ZXJzaW9uICovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7ICAKKyAgd2hpbGUoKGhzZGFkYy0+SW5zdGFuY2UtPklTUiAmIFNEQURDX0lTUl9KQ0lQKSAhPSAwVUwpCisgIHsKKyAgICBpZigoSEFMX0dldFRpY2soKS10aWNrc3RhcnQpID4gU0RBRENfVElNRU9VVCkKKyAgICB7CisgICAgICAvKiBTZXQgU0RBREMgaW4gZXJyb3Igc3RhdGUgYW5kIHJldHVybiB0aW1lb3V0IHN0YXR1cyAqLworICAgICAgaHNkYWRjLT5TdGF0ZSA9IEhBTF9TREFEQ19TVEFURV9FUlJPUjsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKyAgLyogQ2hlY2sgaWYgdHJpZ2dlciBpcyBub3Qgc29mdHdhcmUgKi8KKyAgaWYoaHNkYWRjLT5JbmplY3RlZFRyaWdnZXIgIT0gU0RBRENfU09GVFdBUkVfVFJJR0dFUikKKyAgeworICAgIC8qIEVudGVyIGluaXQgbW9kZSAqLworICAgIGlmKFNEQURDX0VudGVySW5pdE1vZGUoaHNkYWRjKSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogU2V0IFNEQURDIGluIGVycm9yIHN0YXRlIGFuZCByZXR1cm4gdGltZW91dCBzdGF0dXMgKi8KKyAgICAgIGhzZGFkYy0+U3RhdGUgPSBIQUxfU0RBRENfU1RBVEVfRVJST1I7CisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBDaGVjayBpZiB0cmlnZ2VyIGlzIHN5bmNocm9udW91cyAqLworICAgICAgaWYoaHNkYWRjLT5JbmplY3RlZFRyaWdnZXIgPT0gU0RBRENfU1lOQ0hST05PVVNfVFJJR0dFUikKKyAgICAgIHsKKyAgICAgICAgLyogQ2xlYXIgSlNZTkMgYml0IGluIFNEQURDX0NSMSByZWdpc3RlciAqLworICAgICAgICBoc2RhZGMtPkluc3RhbmNlLT5DUjEgJj0gfihTREFEQ19DUjFfSlNZTkMpOworICAgICAgfQorICAgICAgZWxzZSAvKiBleHRlcm5hbCB0cmlnZ2VyICovCisgICAgICB7CisgICAgICAgIC8qIENsZWFyIEpFWFRFTlsxOjBdIGJpdHMgaW4gU0RBRENfQ1IyIHJlZ2lzdGVyICovCisgICAgICAgIGhzZGFkYy0+SW5zdGFuY2UtPkNSMiAmPSB+KFNEQURDX0NSMl9KRVhURU4pOworICAgICAgfQorICAgICAgLyogRXhpdCBpbml0IG1vZGUgKi8KKyAgICAgIFNEQURDX0V4aXRJbml0TW9kZShoc2RhZGMpOworICAgIH0KKyAgfQorICAvKiBDaGVjayBpZiBjb250aW51b3VzIG1vZGUgKi8KKyAgaWYoaHNkYWRjLT5JbmplY3RlZENvbnRNb2RlID09IFNEQURDX0NPTlRJTlVPVVNfQ09OVl9PTikKKyAgeworICAgIC8qIFJlc3RvcmUgSkNPTlQgYml0IGluIFNEQURDX0NSMiByZWdpc3RlciAqLworICAgIGhzZGFkYy0+SW5zdGFuY2UtPkNSMiB8PSBTREFEQ19DUjJfSkNPTlQ7CisgIH0KKyAgLyogQ2xlYXIgSkVPQ0YgYnkgcmVhZGluZyBTREFEQ19KREFUQVIgcmVnaXN0ZXIgKi8KKyAgZHVtbXlfcmVhZF9mb3JfcmVnaXN0ZXJfcmVzZXQgPSBoc2RhZGMtPkluc3RhbmNlLT5KREFUQVI7CisgIFVOVVNFRChkdW1teV9yZWFkX2Zvcl9yZWdpc3Rlcl9yZXNldCk7CisKKyAgLyogU2V0IENMUkpPVlJGIGJpdCBpbiBTREFEQ19DTFJJU1IgcmVnaXN0ZXIgKi8KKyAgaHNkYWRjLT5JbnN0YW5jZS0+Q0xSSVNSIHw9IFNEQURDX0lTUl9DTFJKT1ZSRjsKKworICAvKiBVcGRhdGUgU0RBREMgc3RhdGUgKi8KKyAgaHNkYWRjLT5TdGF0ZSA9IChoc2RhZGMtPlN0YXRlID09IEhBTF9TREFEQ19TVEFURV9JTkopID8gXAorICAgICAgICAgICAgICAgICAgSEFMX1NEQURDX1NUQVRFX1JFQURZIDogSEFMX1NEQURDX1NUQVRFX1JFRzsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovIAorCisjZW5kaWYgLyogZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkgKi8KKyNlbmRpZiAvKiBIQUxfU0RBRENfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjN4eF9oYWxfc21hcnRjYXJkLmMgYi9TcmMvc3RtMzJmM3h4X2hhbF9zbWFydGNhcmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWNjZmViCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZjN4eF9oYWxfc21hcnRjYXJkLmMKQEAgLTAsMCArMSwyMjk0IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2hhbF9zbWFydGNhcmQuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgU01BUlRDQVJEIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFNNQVJUQ0FSRCBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGUgU01BUlRDQVJEIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKKworICAgICgjKSBEZWNsYXJlIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgaGFuZGxlIHN0cnVjdHVyZSAoZWcuIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIGhzbWFydGNhcmQpLgorICAgICgjKSBBc3NvY2lhdGUgYSBVU0FSVCB0byB0aGUgU01BUlRDQVJEIGhhbmRsZSBoc21hcnRjYXJkLgorICAgICgjKSBJbml0aWFsaXplIHRoZSBTTUFSVENBUkQgbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIEhBTF9TTUFSVENBUkRfTXNwSW5pdCgpIEFQSToKKyAgICAgICAgKCsrKSBFbmFibGUgdGhlIFVTQVJUeCBpbnRlcmZhY2UgY2xvY2suCisgICAgICAgICgrKykgVVNBUlQgcGlucyBjb25maWd1cmF0aW9uOgorICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBjbG9jayBmb3IgdGhlIFVTQVJUIEdQSU9zLgorICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBVU0FSVCBwaW5zIChUWCBhcyBhbHRlcm5hdGUgZnVuY3Rpb24gcHVsbC11cCwgUlggYXMgYWx0ZXJuYXRlIGZ1bmN0aW9uIElucHV0KS4KKyAgICAgICAgKCsrKSBOVklDIGNvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIGludGVycnVwdCBwcm9jZXNzIChIQUxfU01BUlRDQVJEX1RyYW5zbWl0X0lUKCkKKyAgICAgICAgICAgICBhbmQgSEFMX1NNQVJUQ0FSRF9SZWNlaXZlX0lUKCkgQVBJcyk6CisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIFVTQVJUeCBpbnRlcnJ1cHQgcHJpb3JpdHkuCisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIE5WSUMgVVNBUlQgSVJRIGhhbmRsZS4KKyAgICAgICAgKCsrKSBETUEgQ29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgRE1BIHByb2Nlc3MgKEhBTF9TTUFSVENBUkRfVHJhbnNtaXRfRE1BKCkKKyAgICAgICAgICAgICBhbmQgSEFMX1NNQVJUQ0FSRF9SZWNlaXZlX0RNQSgpIEFQSXMpOgorICAgICAgICAgICAgKCsrKykgRGVjbGFyZSBhIERNQSBoYW5kbGUgc3RydWN0dXJlIGZvciB0aGUgVHgvUnggY2hhbm5lbC4KKyAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgRE1BeCBpbnRlcmZhY2UgY2xvY2suCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIGRlY2xhcmVkIERNQSBoYW5kbGUgc3RydWN0dXJlIHdpdGggdGhlIHJlcXVpcmVkIFR4L1J4IHBhcmFtZXRlcnMuCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIERNQSBUeC9SeCBjaGFubmVsLgorICAgICAgICAgICAgKCsrKykgQXNzb2NpYXRlIHRoZSBpbml0aWFsaXplZCBETUEgaGFuZGxlIHRvIHRoZSBTTUFSVENBUkQgRE1BIFR4L1J4IGhhbmRsZS4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgcHJpb3JpdHkgYW5kIGVuYWJsZSB0aGUgTlZJQyBmb3IgdGhlIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBvbiB0aGUgRE1BIFR4L1J4IGNoYW5uZWwuCisKKyAgICAoIykgUHJvZ3JhbSB0aGUgQmF1ZCBSYXRlLCBQYXJpdHksIE1vZGUoUmVjZWl2ZXIvVHJhbnNtaXR0ZXIpLCBjbG9jayBlbmFibGluZy9kaXNhYmxpbmcgYW5kIGFjY29yZGluZ2x5LAorICAgICAgICB0aGUgY2xvY2sgcGFyYW1ldGVycyAocGFyaXR5LCBwaGFzZSwgbGFzdCBiaXQpLCBwcmVzY2FsZXIgdmFsdWUsIGd1YXJkIHRpbWUgYW5kIE5BQ0sgb24gdHJhbnNtaXNzaW9uCisgICAgICAgIGVycm9yIGVuYWJsaW5nIG9yIGRpc2FibGluZyBpbiB0aGUgaHNtYXJ0Y2FyZCBoYW5kbGUgSW5pdCBzdHJ1Y3R1cmUuCisKKyAgICAoIykgSWYgcmVxdWlyZWQsIHByb2dyYW0gU01BUlRDQVJEIGFkdmFuY2VkIGZlYXR1cmVzIChUWC9SWCBwaW5zIHN3YXAsIFRpbWVPdXQsIGF1dG8tcmV0cnkgY291bnRlciwuLi4pCisgICAgICAgIGluIHRoZSBoc21hcnRjYXJkIGhhbmRsZSBBZHZhbmNlZEluaXQgc3RydWN0dXJlLgorCisgICAgKCMpIEluaXRpYWxpemUgdGhlIFNNQVJUQ0FSRCByZWdpc3RlcnMgYnkgY2FsbGluZyB0aGUgSEFMX1NNQVJUQ0FSRF9Jbml0KCkgQVBJOgorICAgICAgICAoKyspIFRoaXMgQVBJIGNvbmZpZ3VyZXMgYWxzbyB0aGUgbG93IGxldmVsIEhhcmR3YXJlIChHUElPLCBDTE9DSywgQ09SVEVYLi4uZXRjKQorICAgICAgICAgICAgIGJ5IGNhbGxpbmcgdGhlIGN1c3RvbWl6ZWQgSEFMX1NNQVJUQ0FSRF9Nc3BJbml0KCkgQVBJLgorICAgICAgICBbLi5dCisgICAgICAgIChAKSBUaGUgc3BlY2lmaWMgU01BUlRDQVJEIGludGVycnVwdHMgKFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQsCisgICAgICAgICAgICAgUlhORSBpbnRlcnJ1cHQgYW5kIEVycm9yIEludGVycnVwdHMpIHdpbGwgYmUgbWFuYWdlZCB1c2luZyB0aGUgbWFjcm9zCisgICAgICAgICAgICAgX19IQUxfU01BUlRDQVJEX0VOQUJMRV9JVCgpIGFuZCBfX0hBTF9TTUFSVENBUkRfRElTQUJMRV9JVCgpIGluc2lkZSB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgcHJvY2Vzcy4KKworICAgIFsuLl0KKyAgICBbLi5dIFRocmVlIG9wZXJhdGlvbiBtb2RlcyBhcmUgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIGRyaXZlciA6CisKKyAgICAgKioqIFBvbGxpbmcgbW9kZSBJTyBvcGVyYXRpb24gKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisgICAgICAgKCspIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfU01BUlRDQVJEX1RyYW5zbWl0KCkKKyAgICAgICAoKykgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlIHVzaW5nIEhBTF9TTUFSVENBUkRfUmVjZWl2ZSgpCisKKyAgICAgKioqIEludGVycnVwdCBtb2RlIElPIG9wZXJhdGlvbiAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgWy4uXQorICAgICAgICgrKSBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHVzaW5nIEhBTF9TTUFSVENBUkRfVHJhbnNtaXRfSVQoKQorICAgICAgICgrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyIEhBTF9TTUFSVENBUkRfVHhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9TTUFSVENBUkRfVHhDcGx0Q2FsbGJhY2soKQorICAgICAgICgrKSBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHVzaW5nIEhBTF9TTUFSVENBUkRfUmVjZWl2ZV9JVCgpCisgICAgICAgKCspIEF0IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIgSEFMX1NNQVJUQ0FSRF9SeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX1NNQVJUQ0FSRF9SeENwbHRDYWxsYmFjaygpCisgICAgICAgKCspIEluIGNhc2Ugb2YgdHJhbnNmZXIgRXJyb3IsIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjaygpIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX1NNQVJUQ0FSRF9FcnJvckNhbGxiYWNrKCkKKworICAgICAqKiogRE1BIG1vZGUgSU8gb3BlcmF0aW9uICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgWy4uXQorICAgICAgICgrKSBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIChETUEpIHVzaW5nIEhBTF9TTUFSVENBUkRfVHJhbnNtaXRfRE1BKCkKKyAgICAgICAoKykgQXQgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2ZlciBIQUxfU01BUlRDQVJEX1R4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfU01BUlRDQVJEX1R4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAoKykgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSAoRE1BKSB1c2luZyBIQUxfU01BUlRDQVJEX1JlY2VpdmVfRE1BKCkKKyAgICAgICAoKykgQXQgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2ZlciBIQUxfU01BUlRDQVJEX1J4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfU01BUlRDQVJEX1J4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAoKykgSW4gY2FzZSBvZiB0cmFuc2ZlciBFcnJvciwgSEFMX1NNQVJUQ0FSRF9FcnJvckNhbGxiYWNrKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfU01BUlRDQVJEX0Vycm9yQ2FsbGJhY2soKQorCisgICAgICoqKiBTTUFSVENBUkQgSEFMIGRyaXZlciBtYWNyb3MgbGlzdCAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisgICAgICAgQmVsb3cgdGhlIGxpc3Qgb2YgbW9zdCB1c2VkIG1hY3JvcyBpbiBTTUFSVENBUkQgSEFMIGRyaXZlci4KKworICAgICAgICgrKSBfX0hBTF9TTUFSVENBUkRfR0VUX0ZMQUcgOiBDaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBmbGFnIGlzIHNldAorICAgICAgICgrKSBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfRkxBRyA6IENsZWFyIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIHBlbmRpbmcgZmxhZworICAgICAgICgrKSBfX0hBTF9TTUFSVENBUkRfRU5BQkxFX0lUOiBFbmFibGUgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgaW50ZXJydXB0CisgICAgICAgKCspIF9fSEFMX1NNQVJUQ0FSRF9ESVNBQkxFX0lUOiBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIGludGVycnVwdAorICAgICAgICgrKSBfX0hBTF9TTUFSVENBUkRfR0VUX0lUX1NPVVJDRTogQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgaW50ZXJydXB0IGlzIGVuYWJsZWQKKworICAgICBbLi5dCisgICAgICAgKEApIFlvdSBjYW4gcmVmZXIgdG8gdGhlIFNNQVJUQ0FSRCBIQUwgZHJpdmVyIGhlYWRlciBmaWxlIGZvciBtb3JlIHVzZWZ1bCBtYWNyb3MKKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRCBTTUFSVENBUkQKKyAgKiBAYnJpZWYgU01BUlRDQVJEIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9TTUFSVENBUkRfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9Qcml2YXRlX0NvbnN0YW50cyBTTUFSVENBUkQgUHJpdmF0ZSBDb25zdGFudHMKKyAqIEB7CisgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1RFQUNLX1JFQUNLX1RJTUVPVVQgICAgICAgICAgICAgICAxMDAwICAgICAgLyohPCBTTUFSVENBUkQgVFggb3IgUlggZW5hYmxlIGFja25vd2xlZGdlIHRpbWUtb3V0IHZhbHVlICAqLworCisjZGVmaW5lIFVTQVJUX0NSMV9GSUVMRFMgICAgICAoKHVpbnQzMl90KShVU0FSVF9DUjFfTSB8IFVTQVJUX0NSMV9QQ0UgfCBVU0FSVF9DUjFfUFMgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfVEUgfCBVU0FSVF9DUjFfUkUgfCBVU0FSVF9DUjFfT1ZFUjgpKSAgICAgICAvKiE8IFVTQVJUIENSMSBmaWVsZHMgb2YgcGFyYW1ldGVycyBzZXQgYnkgU01BUlRDQVJEX1NldENvbmZpZyBBUEkgKi8KKyNkZWZpbmUgVVNBUlRfQ1IyX0NMS19GSUVMRFMgICgodWludDMyX3QpKFVTQVJUX0NSMl9DTEtFTnxVU0FSVF9DUjJfQ1BPTHxVU0FSVF9DUjJfQ1BIQXxVU0FSVF9DUjJfTEJDTCkpIC8qITwgU01BUlRDQVJEIGNsb2NrLXJlbGF0ZWQgVVNBUlQgQ1IyIGZpZWxkcyBvZiBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFVTQVJUX0NSMl9GSUVMRFMgICAgICAoKHVpbnQzMl90KShVU0FSVF9DUjJfUlRPRU58VVNBUlRfQ1IyX0NMS19GSUVMRFN8VVNBUlRfQ1IyX1NUT1ApKSAvKiE8IFVTQVJUIENSMiBmaWVsZHMgb2YgcGFyYW1ldGVycyBzZXQgYnkgU01BUlRDQVJEX1NldENvbmZpZyBBUEkgKi8KKyNkZWZpbmUgVVNBUlRfQ1IzX0ZJRUxEUyAgICAgICgodWludDMyX3QpKFVTQVJUX0NSM19PTkVCSVR8VVNBUlRfQ1IzX05BQ0t8VVNBUlRfQ1IzX1NDQVJDTlQpKSAgIC8qITwgVVNBUlQgQ1IzIGZpZWxkcyBvZiBwYXJhbWV0ZXJzIHNldCBieSBTTUFSVENBUkRfU2V0Q29uZmlnIEFQSSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFNNQVJUQ0FSRF9Qcml2YXRlX0Z1bmN0aW9ucworICAqIEB7CisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU01BUlRDQVJEX1NldENvbmZpZyhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CitzdGF0aWMgdm9pZCBTTUFSVENBUkRfQWR2RmVhdHVyZUNvbmZpZyhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU01BUlRDQVJEX0NoZWNrSWRsZVN0YXRlKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTTUFSVENBUkRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgdWludDMyX3QgRmxhZywgRmxhZ1N0YXR1cyBTdGF0dXMsIHVpbnQzMl90IFRpY2tzdGFydCwgdWludDMyX3QgVGltZW91dCk7CitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRW5kVHhUcmFuc2ZlcihTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRW5kUnhUcmFuc2ZlcihTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRE1BVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9ETUFSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU01BUlRDQVJEX0RNQUFib3J0T25FcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRE1BVHhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9ETUFSeEFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU01BUlRDQVJEX0RNQVR4T25seUFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU01BUlRDQVJEX0RNQVJ4T25seUFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNNQVJUQ0FSRF9UcmFuc21pdF9JVChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU01BUlRDQVJEX0VuZFRyYW5zbWl0X0lUKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTTUFSVENBUkRfUmVjZWl2ZV9JVChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9FeHBvcnRlZF9GdW5jdGlvbnMgU01BUlRDQVJEIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gaW5pdGlhbGl6ZSB0aGUgVVNBUlR4CisgIGFzc29jaWF0ZWQgdG8gdGhlIFNtYXJ0Q2FyZC4KKyAgWy4uXQorICBUaGUgU21hcnRjYXJkIGludGVyZmFjZSBpcyBkZXNpZ25lZCB0byBzdXBwb3J0IGFzeW5jaHJvbm91cyBwcm90b2NvbCBTbWFydGNhcmRzIGFzCisgIGRlZmluZWQgaW4gdGhlIElTTyA3ODE2LTMgc3RhbmRhcmQuCisgIFsuLl0KKyAgVGhlIFVTQVJUIGNhbiBwcm92aWRlIGEgY2xvY2sgdG8gdGhlIHNtYXJ0Y2FyZCB0aHJvdWdoIHRoZSBTQ0xLIG91dHB1dC4KKyAgSW4gc21hcnRjYXJkIG1vZGUsIFNDTEsgaXMgbm90IGFzc29jaWF0ZWQgdG8gdGhlIGNvbW11bmljYXRpb24gYnV0IGlzIHNpbXBseSBkZXJpdmVkCisgIGZyb20gdGhlIGludGVybmFsIHBlcmlwaGVyYWwgaW5wdXQgY2xvY2sgdGhyb3VnaCBhIDUtYml0IHByZXNjYWxlci4KKyAgWy4uXQorICAoKykgVGhlc2UgcGFyYW1ldGVycyBjYW4gYmUgY29uZmlndXJlZDoKKyAgICAgICgrKykgQmF1ZCBSYXRlCisgICAgICAoKyspIFBhcml0eTogc2hvdWxkIGJlIGVuYWJsZWQKKyAgICAgICgrKykgUmVjZWl2ZXIvdHJhbnNtaXR0ZXIgbW9kZXMKKyAgICAgICgrKykgU3luY2hyb25vdXMgbW9kZSAoYW5kIGlmIGVuYWJsZWQsIHBoYXNlLCBwb2xhcml0eSBhbmQgbGFzdCBiaXQgcGFyYW1ldGVycykKKyAgICAgICgrKykgUHJlc2NhbGVyIHZhbHVlCisgICAgICAoKyspIEd1YXJkIGJpdCB0aW1lCisgICAgICAoKyspIE5BQ0sgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIG9uIHRyYW5zbWlzc2lvbiBlcnJvcgorCisgICgrKSBUaGUgZm9sbG93aW5nIGFkdmFuY2VkIGZlYXR1cmVzIGNhbiBiZSBjb25maWd1cmVkIGFzIHdlbGw6CisgICAgICAoKyspIFRYIGFuZC9vciBSWCBwaW4gbGV2ZWwgaW52ZXJzaW9uCisgICAgICAoKyspIGRhdGEgbG9naWNhbCBsZXZlbCBpbnZlcnNpb24KKyAgICAgICgrKykgUlggYW5kIFRYIHBpbnMgc3dhcAorICAgICAgKCsrKSBSWCBvdmVycnVuIGRldGVjdGlvbiBkaXNhYmxpbmcKKyAgICAgICgrKykgRE1BIGRpc2FibGluZyBvbiBSWCBlcnJvcgorICAgICAgKCsrKSBNU0IgZmlyc3Qgb24gY29tbXVuaWNhdGlvbiBsaW5lCisgICAgICAoKyspIFRpbWUgb3V0IGVuYWJsaW5nIChhbmQgaWYgYWN0aXZhdGVkLCB0aW1lb3V0IHZhbHVlKQorICAgICAgKCsrKSBCbG9jayBsZW5ndGgKKyAgICAgICgrKykgQXV0by1yZXRyeSBjb3VudGVyCisgIFsuLl0KKyAgVGhlIEhBTF9TTUFSVENBUkRfSW5pdCgpIEFQSSBmb2xsb3dzIHRoZSBVU0FSVCBzeW5jaHJvbm91cyBjb25maWd1cmF0aW9uIHByb2NlZHVyZXMKKyAgKGRldGFpbHMgZm9yIHRoZSBwcm9jZWR1cmVzIGFyZSBhdmFpbGFibGUgaW4gcmVmZXJlbmNlIG1hbnVhbCkuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qCisgIEFkZGl0aW9uYWwgVGFibGU6CisgICAgRnJhbWUgTGVuZ3RoIGlzIGZpeGVkIHRvIDggYml0cyBwbHVzIHBhcml0eToKKyAgICBTTUFSVENBUkQgZnJhbWUgZm9ybWF0IGlzIGdpdmVuIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8IE0xTTAgYml0cyB8ICBQQ0UgYml0ICB8ICAgICAgICAgIFNNQVJUQ0FSRCBmcmFtZSAgICAgICAgICAgICAgfAorICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAgMDEgICAgfCAgICAxICAgICAgfCAgICB8IFNCIHwgOCBiaXQgZGF0YSB8IFBCIHwgU1RCIHwgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFNNQVJUQ0FSRCBtb2RlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9Jbml0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBDaGVjayB0aGUgU01BUlRDQVJEIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmKGhzbWFydGNhcmQgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgVVNBUlQgYXNzb2NpYXRlZCB0byB0aGUgU01BUlRDQVJEIGhhbmRsZSAqLworICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX0lOU1RBTkNFKGhzbWFydGNhcmQtPkluc3RhbmNlKSk7CisKKyAgaWYoaHNtYXJ0Y2FyZC0+Z1N0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHNtYXJ0Y2FyZC0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLICovCisgICAgSEFMX1NNQVJUQ0FSRF9Nc3BJbml0KGhzbWFydGNhcmQpOworICB9CisKKyAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgdG8gc2V0IHNtYXJ0Y2FyZCBtb2RlICovCisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVUUpOworCisgIC8qIEluIFNtYXJ0Q2FyZCBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CisgIC0gTElORU4gaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgLSBIRFNFTCBhbmQgSVJFTiAgYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLiovCisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfTElORU4pOworICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgKFVTQVJUX0NSM19IRFNFTCB8IFVTQVJUX0NSM19JUkVOKSk7CisKKyAgLyogc2V0IHRoZSBVU0FSVCBpbiBTTUFSVENBUkQgbW9kZSAqLworICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19TQ0VOKTsKKworICAvKiBTZXQgdGhlIFNNQVJUQ0FSRCBDb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgKi8KKyAgaWYgKFNNQVJUQ0FSRF9TZXRDb25maWcoaHNtYXJ0Y2FyZCkgPT0gSEFMX0VSUk9SKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIGlmIChoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQgIT0gU01BUlRDQVJEX0FEVkZFQVRVUkVfTk9fSU5JVCkKKyAgeworICAgIFNNQVJUQ0FSRF9BZHZGZWF0dXJlQ29uZmlnKGhzbWFydGNhcmQpOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1VFKTsKKworICAvKiBURUFDSyBhbmQvb3IgUkVBQ0sgdG8gY2hlY2sgYmVmb3JlIG1vdmluZyBoc21hcnRjYXJkLT5nU3RhdGUgYW5kIGhzbWFydGNhcmQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgcmV0dXJuIChTTUFSVENBUkRfQ2hlY2tJZGxlU3RhdGUoaHNtYXJ0Y2FyZCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgU01BUlRDQVJEIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9EZUluaXQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIENoZWNrIHRoZSBTTUFSVENBUkQgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYoaHNtYXJ0Y2FyZCA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBVU0FSVC9VQVJUIGFzc29jaWF0ZWQgdG8gdGhlIFNNQVJUQ0FSRCBoYW5kbGUgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NNQVJUQ0FSRF9JTlNUQU5DRShoc21hcnRjYXJkLT5JbnN0YW5jZSkpOworCisgIGhzbWFydGNhcmQtPmdTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVUUpOworCisgIFdSSVRFX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCAweDBVKTsKKyAgV1JJVEVfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjIsIDB4MFUpOworICBXUklURV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgMHgwVSk7CisgIFdSSVRFX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+UlRPUiwgMHgwVSk7CisgIFdSSVRFX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+R1RQUiwgMHgwVSk7CisKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgSEFMX1NNQVJUQ0FSRF9Nc3BEZUluaXQoaHNtYXJ0Y2FyZCk7CisKKyAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlID0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9OT05FOworICBoc21hcnRjYXJkLT5nU3RhdGUgICAgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFU0VUOworICBoc21hcnRjYXJkLT5SeFN0YXRlICAgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFU0VUOworCisgIC8qIFByb2Nlc3MgVW5sb2NrICovCisgIF9fSEFMX1VOTE9DSyhoc21hcnRjYXJkKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFNNQVJUQ0FSRCBNU1AuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NNQVJUQ0FSRF9Nc3BJbml0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc21hcnRjYXJkKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NNQVJUQ0FSRF9Nc3BJbml0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgU01BUlRDQVJEIE1TUC4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU01BUlRDQVJEX01zcERlSW5pdChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNtYXJ0Y2FyZCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TTUFSVENBUkRfTXNwRGVJbml0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgU01BUlRDQVJEIFRyYW5zbWl0IGFuZCBSZWNlaXZlIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gbWFuYWdlIHRoZSBTTUFSVENBUkQgZGF0YSB0cmFuc2ZlcnMuCisKKyAgWy4uXQorICAgIFNtYXJ0Y2FyZCBpcyBhIHNpbmdsZSB3aXJlIGhhbGYgZHVwbGV4IGNvbW11bmljYXRpb24gcHJvdG9jb2wuCisgICAgVGhlIFNtYXJ0Y2FyZCBpbnRlcmZhY2UgaXMgZGVzaWduZWQgdG8gc3VwcG9ydCBhc3luY2hyb25vdXMgcHJvdG9jb2wgU21hcnRjYXJkcyBhcworICAgIGRlZmluZWQgaW4gdGhlIElTTyA3ODE2LTMgc3RhbmRhcmQuIFRoZSBVU0FSVCBzaG91bGQgYmUgY29uZmlndXJlZCBhczoKKyAgICAoKykgOCBiaXRzIHBsdXMgcGFyaXR5OiB3aGVyZSBNPTEgYW5kIFBDRT0xIGluIHRoZSBVU0FSVF9DUjEgcmVnaXN0ZXIKKyAgICAoKykgMS41IHN0b3AgYml0cyB3aGVuIHRyYW5zbWl0dGluZyBhbmQgcmVjZWl2aW5nOiB3aGVyZSBTVE9QPTExIGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIuCisKKyAgWy4uXQorICAgICgjKSBUaGVyZSBhcmUgdHdvIG1vZGVzIG9mIHRyYW5zZmVyOgorICAgICAgICAoKyspIEJsb2NraW5nIG1vZGU6IFRoZSBjb21tdW5pY2F0aW9uIGlzIHBlcmZvcm1lZCBpbiBwb2xsaW5nIG1vZGUuCisgICAgICAgICAgICAgVGhlIEhBTCBzdGF0dXMgb2YgYWxsIGRhdGEgcHJvY2Vzc2luZyBpcyByZXR1cm5lZCBieSB0aGUgc2FtZSBmdW5jdGlvbgorICAgICAgICAgICAgIGFmdGVyIGZpbmlzaGluZyB0cmFuc2Zlci4KKyAgICAgICAgKCsrKSBOb24tQmxvY2tpbmcgbW9kZTogVGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nIEludGVycnVwdHMKKyAgICAgICAgICAgICBvciBETUEsIHRoZSByZWxldmFudCBBUEkncyByZXR1cm4gdGhlIEhBTCBzdGF0dXMuCisgICAgICAgICAgICAgVGhlIGVuZCBvZiB0aGUgZGF0YSBwcm9jZXNzaW5nIHdpbGwgYmUgaW5kaWNhdGVkIHRocm91Z2ggdGhlCisgICAgICAgICAgICAgZGVkaWNhdGVkIFNNQVJUQ0FSRCBJUlEgd2hlbiB1c2luZyBJbnRlcnJ1cHQgbW9kZSBvciB0aGUgRE1BIElSUSB3aGVuCisgICAgICAgICAgICAgdXNpbmcgRE1BIG1vZGUuCisgICAgICAgICgrKykgVGhlIEhBTF9TTUFSVENBUkRfVHhDcGx0Q2FsbGJhY2soKSwgSEFMX1NNQVJUQ0FSRF9SeENwbHRDYWxsYmFjaygpIHVzZXIgY2FsbGJhY2tzCisgICAgICAgICAgICAgd2lsbCBiZSBleGVjdXRlZCByZXNwZWN0aXZlbHkgYXQgdGhlIGVuZCBvZiB0aGUgVHJhbnNtaXQgb3IgUmVjZWl2ZSBwcm9jZXNzCisgICAgICAgICAgICAgVGhlIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjaygpIHVzZXIgY2FsbGJhY2sgd2lsbCBiZSBleGVjdXRlZCB3aGVuIGEgY29tbXVuaWNhdGlvbgorICAgICAgICAgICAgIGVycm9yIGlzIGRldGVjdGVkLgorCisgICAgKCMpIEJsb2NraW5nIG1vZGUgQVBJcyBhcmUgOgorICAgICAgICAoKyspIEhBTF9TTUFSVENBUkRfVHJhbnNtaXQoKQorICAgICAgICAoKyspIEhBTF9TTUFSVENBUkRfUmVjZWl2ZSgpCisKKyAgICAoIykgTm9uIEJsb2NraW5nIG1vZGUgQVBJcyB3aXRoIEludGVycnVwdCBhcmUgOgorICAgICAgICAoKyspIEhBTF9TTUFSVENBUkRfVHJhbnNtaXRfSVQoKQorICAgICAgICAoKyspIEhBTF9TTUFSVENBUkRfUmVjZWl2ZV9JVCgpCisgICAgICAgICgrKykgSEFMX1NNQVJUQ0FSRF9JUlFIYW5kbGVyKCkKKworICAgICgjKSBOb24gQmxvY2tpbmcgbW9kZSBmdW5jdGlvbnMgd2l0aCBETUEgYXJlIDoKKyAgICAgICAgKCsrKSBIQUxfU01BUlRDQVJEX1RyYW5zbWl0X0RNQSgpCisgICAgICAgICgrKykgSEFMX1NNQVJUQ0FSRF9SZWNlaXZlX0RNQSgpCisKKyAgICAoIykgQSBzZXQgb2YgVHJhbnNmZXIgQ29tcGxldGUgQ2FsbGJhY2tzIGFyZSBwcm92aWRlZCBpbiBub24gQmxvY2tpbmcgbW9kZToKKyAgICAgICAgKCsrKSBIQUxfU01BUlRDQVJEX1R4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfU01BUlRDQVJEX1J4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfU01BUlRDQVJEX0Vycm9yQ2FsbGJhY2soKQorCisgICAgKCMpIE5vbi1CbG9ja2luZyBtb2RlIHRyYW5zZmVycyBjb3VsZCBiZSBhYm9ydGVkIHVzaW5nIEFib3J0IEFQSSdzIDoKKyAgICAgICAgKCsrKSBIQUxfU01BUlRDQVJEX0Fib3J0KCkKKyAgICAgICAgKCsrKSBIQUxfU01BUlRDQVJEX0Fib3J0VHJhbnNtaXQoKQorICAgICAgICAoKyspIEhBTF9TTUFSVENBUkRfQWJvcnRSZWNlaXZlKCkKKyAgICAgICAgKCsrKSBIQUxfU01BUlRDQVJEX0Fib3J0X0lUKCkKKyAgICAgICAgKCsrKSBIQUxfU01BUlRDQVJEX0Fib3J0VHJhbnNtaXRfSVQoKQorICAgICAgICAoKyspIEhBTF9TTUFSVENBUkRfQWJvcnRSZWNlaXZlX0lUKCkKKworICAgICgjKSBGb3IgQWJvcnQgc2VydmljZXMgYmFzZWQgb24gaW50ZXJydXB0cyAoSEFMX1NNQVJUQ0FSRF9BYm9ydHh4eF9JVCksIGEgc2V0IG9mIEFib3J0IENvbXBsZXRlIENhbGxiYWNrcyBhcmUgcHJvdmlkZWQ6CisgICAgICAgICgrKykgSEFMX1NNQVJUQ0FSRF9BYm9ydENwbHRDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX1NNQVJUQ0FSRF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfU01BUlRDQVJEX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjaygpCisKKyAgICAoIykgSW4gTm9uLUJsb2NraW5nIG1vZGUgdHJhbnNmZXJzLCBwb3NzaWJsZSBlcnJvcnMgYXJlIHNwbGl0IGludG8gMiBjYXRlZ29yaWVzLgorICAgICAgICBFcnJvcnMgYXJlIGhhbmRsZWQgYXMgZm9sbG93cyA6CisgICAgICAgICgrKykgRXJyb3IgaXMgY29uc2lkZXJlZCBhcyBSZWNvdmVyYWJsZSBhbmQgbm9uIGJsb2NraW5nIDogVHJhbnNmZXIgY291bGQgZ28gdGlsbCBlbmQsIGJ1dCBlcnJvciBzZXZlcml0eSBpcyAKKyAgICAgICAgICAgICB0byBiZSBldmFsdWF0ZWQgYnkgdXNlciA6IHRoaXMgY29uY2VybnMgRnJhbWUgRXJyb3IsIFBhcml0eSBFcnJvciBvciBOb2lzZSBFcnJvciBpbiBJbnRlcnJ1cHQgbW9kZSByZWNlcHRpb24gLgorICAgICAgICAgICAgIFJlY2VpdmVkIGNoYXJhY3RlciBpcyB0aGVuIHJldHJpZXZlZCBhbmQgc3RvcmVkIGluIFJ4IGJ1ZmZlciwgRXJyb3IgY29kZSBpcyBzZXQgdG8gYWxsb3cgdXNlciB0byBpZGVudGlmeSBlcnJvciB0eXBlLAorICAgICAgICAgICAgIGFuZCBIQUxfU01BUlRDQVJEX0Vycm9yQ2FsbGJhY2soKSB1c2VyIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLiBUcmFuc2ZlciBpcyBrZXB0IG9uZ29pbmcgb24gU01BUlRDQVJEIHNpZGUuCisgICAgICAgICAgICAgSWYgdXNlciB3YW50cyB0byBhYm9ydCBpdCwgQWJvcnQgc2VydmljZXMgc2hvdWxkIGJlIGNhbGxlZCBieSB1c2VyLgorICAgICAgICAoKyspIEVycm9yIGlzIGNvbnNpZGVyZWQgYXMgQmxvY2tpbmcgOiBUcmFuc2ZlciBjb3VsZCBub3QgYmUgY29tcGxldGVkIHByb3Blcmx5IGFuZCBpcyBhYm9ydGVkLgorICAgICAgICAgICAgIFRoaXMgY29uY2VybnMgRnJhbWUgRXJyb3IgaW4gSW50ZXJydXB0IG1vZGUgdHJhbm1pc3Npb24sIE92ZXJydW4gRXJyb3IgaW4gSW50ZXJydXB0IG1vZGUgcmVjZXB0aW9uIGFuZCBhbGwgZXJyb3JzIGluIERNQSBtb2RlLgorICAgICAgICAgICAgIEVycm9yIGNvZGUgaXMgc2V0IHRvIGFsbG93IHVzZXIgdG8gaWRlbnRpZnkgZXJyb3IgdHlwZSwgYW5kIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjaygpIHVzZXIgY2FsbGJhY2sgaXMgZXhlY3V0ZWQuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQuCisgICogQHBhcmFtICBUaW1lb3V0ICBUaW1lb3V0IGR1cmF0aW9uLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9UcmFuc21pdChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDBVOworCisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYgKGhzbWFydGNhcmQtPmdTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1lfVFg7CisKKyAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ21lbnQqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsIGZpcnN0IHRvIHVwZGF0ZSBtb2RlIGZvciBUWCBtYXN0ZXIgKi8KKyAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1VFKTsKKworICAgIC8qIERpc2FibGUgUngsIGVuYWJsZSBUeCAqLworICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUkUpOworICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPlJRUiwgU01BUlRDQVJEX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsKKyAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9URSk7CisgICAgCisgICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVUUpOworCisgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlID0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9OT05FOworICAgIGhzbWFydGNhcmQtPlR4WGZlclNpemUgPSBTaXplOworICAgIGhzbWFydGNhcmQtPlR4WGZlckNvdW50ID0gU2l6ZTsKKworICAgIHdoaWxlKGhzbWFydGNhcmQtPlR4WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgaHNtYXJ0Y2FyZC0+VHhYZmVyQ291bnQtLTsKKyAgICAgIGlmKFNNQVJUQ0FSRF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9GTEFHX1RYRSwgUkVTRVQsIHRpY2tzdGFydCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgICBoc21hcnRjYXJkLT5JbnN0YW5jZS0+VERSID0gKCpwRGF0YSsrICYgKHVpbnQ4X3QpMHhGRlUpOworICAgIH0KKyAgICBpZihTTUFSVENBUkRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoc21hcnRjYXJkLCBTTUFSVENBUkRfRkxBR19UQywgUkVTRVQsIHRpY2tzdGFydCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgICAgLyogUmUtZW5hYmxlIFJ4IGF0IGVuZCBvZiB0cmFuc21pc3Npb24gaWYgaW5pdGlhbCBtb2RlIGlzIFJ4L1R4ICovCisgICAgaWYoaHNtYXJ0Y2FyZC0+SW5pdC5Nb2RlID09IFNNQVJUQ0FSRF9NT0RFX1RYX1JYKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgZmlyc3QgdG8gdXBkYXRlIG1vZGVzICovCisgICAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1VFKTsKKyAgICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1JFKTsKKyAgICAgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICAgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVUUpOworICAgIH0KKyAgICAKKyAgICAvKiBBdCBlbmQgb2YgVHggcHJvY2VzcywgcmVzdG9yZSBoc21hcnRjYXJkLT5nU3RhdGUgdG8gUmVhZHkgKi8KKyAgICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoc21hcnRjYXJkKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkLgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9SZWNlaXZlKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gMFU7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZihoc21hcnRjYXJkLT5SeFN0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZigocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoc21hcnRjYXJkKTsKKworICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSA9IEhBTF9TTUFSVENBUkRfRVJST1JfTk9ORTsKKyAgICBoc21hcnRjYXJkLT5SeFN0YXRlICAgPSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1lfUlg7CisKKyAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ21lbnQqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICBoc21hcnRjYXJkLT5SeFhmZXJTaXplID0gU2l6ZTsKKyAgICBoc21hcnRjYXJkLT5SeFhmZXJDb3VudCA9IFNpemU7CisKKyAgICAvKiBDaGVjayB0aGUgcmVtYWluIGRhdGEgdG8gYmUgcmVjZWl2ZWQgKi8KKyAgICB3aGlsZShoc21hcnRjYXJkLT5SeFhmZXJDb3VudCA+IDBVKQorICAgIHsKKyAgICAgIGhzbWFydGNhcmQtPlJ4WGZlckNvdW50LS07CisKKyAgICAgIGlmKFNNQVJUQ0FSRF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9GTEFHX1JYTkUsIFJFU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgICAgKnBEYXRhKysgPSAodWludDhfdCkoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPlJEUiAmICh1aW50OF90KTB4MDBGRik7CisgICAgfQorCisgICAgLyogQXQgZW5kIG9mIFJ4IHByb2Nlc3MsIHJlc3RvcmUgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICAgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoc21hcnRjYXJkKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHBhcmFtICBwRGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSBzZW50LgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9UcmFuc21pdF9JVChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYgKGhzbWFydGNhcmQtPmdTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoc21hcnRjYXJkKTsKKworICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSA9IEhBTF9TTUFSVENBUkRfRVJST1JfTk9ORTsKKyAgICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1lfVFg7CisKKyAgICBoc21hcnRjYXJkLT5wVHhCdWZmUHRyID0gcERhdGE7CisgICAgaHNtYXJ0Y2FyZC0+VHhYZmVyU2l6ZSA9IFNpemU7CisgICAgaHNtYXJ0Y2FyZC0+VHhYZmVyQ291bnQgPSBTaXplOworCisgICAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCBmaXJzdCB0byB1cGRhdGUgbW9kZSBmb3IgVFggbWFzdGVyICovCisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRSk7CisKKyAgICAvKiBEaXNhYmxlIFJ4LCBlbmFibGUgVHggKi8KKyAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1JFKTsKKyAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5SUVIsIFNNQVJUQ0FSRF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVEUpOworICAgIAorICAgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1VFKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICAvKiBFbmFibGUgdGhlIFNNQVJUQ0FSRCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvcikgKi8KKyAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgLyogRW5hYmxlIHRoZSBTTUFSVENBUkQgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBFbXB0eSBJbnRlcnJ1cHQgKi8KKyAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UWEVJRSk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEBwYXJhbSAgcERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgcmVjZWl2ZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1JlY2VpdmVfSVQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICAvKiBDaGVjayB0aGF0IGEgUnggcHJvY2VzcyBpcyBub3QgYWxyZWFkeSBvbmdvaW5nICovCisgIGlmKGhzbWFydGNhcmQtPlJ4U3RhdGUgPT0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICBoc21hcnRjYXJkLT5FcnJvckNvZGUgPSBIQUxfU01BUlRDQVJEX0VSUk9SX05PTkU7CisgICAgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSAgID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9CVVNZX1JYOworCisgICAgaHNtYXJ0Y2FyZC0+cFJ4QnVmZlB0ciA9IHBEYXRhOworICAgIGhzbWFydGNhcmQtPlJ4WGZlclNpemUgPSBTaXplOworICAgIGhzbWFydGNhcmQtPlJ4WGZlckNvdW50ID0gU2l6ZTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICAvKiBFbmFibGUgdGhlIFNNQVJUQ0FSRCBQYXJpdHkgRXJyb3IgYW5kIERhdGEgUmVnaXN0ZXIgbm90IGVtcHR5IEludGVycnVwdHMgKi8KKyAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFfCBVU0FSVF9DUjFfUlhORUlFKTsKKworICAgIC8qIEVuYWJsZSB0aGUgU01BUlRDQVJEIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIERNQSBtb2RlLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1RyYW5zbWl0X0RNQShTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYgKGhzbWFydGNhcmQtPmdTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoc21hcnRjYXJkKTsKKworICAgIGhzbWFydGNhcmQtPmdTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfQlVTWV9UWDsKKworICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSA9IEhBTF9TTUFSVENBUkRfRVJST1JfTk9ORTsKKyAgICBoc21hcnRjYXJkLT5wVHhCdWZmUHRyID0gcERhdGE7CisgICAgaHNtYXJ0Y2FyZC0+VHhYZmVyU2l6ZSA9IFNpemU7CisgICAgaHNtYXJ0Y2FyZC0+VHhYZmVyQ291bnQgPSBTaXplOworCisgICAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCBmaXJzdCB0byB1cGRhdGUgbW9kZSBmb3IgVFggbWFzdGVyICovCisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRSk7CisKKyAgICAvKiBEaXNhYmxlIFJ4LCBlbmFibGUgVHggKi8KKyAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1JFKTsKKyAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5SUVIsIFNNQVJUQ0FSRF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVEUpOworICAgIAorICAgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1VFKTsKKworICAgIC8qIFNldCB0aGUgU01BUlRDQVJEIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGhzbWFydGNhcmQtPmhkbWF0eC0+WGZlckNwbHRDYWxsYmFjayA9IFNNQVJUQ0FSRF9ETUFUcmFuc21pdENwbHQ7CisKKyAgICAvKiBTZXQgdGhlIFNNQVJUQ0FSRCBlcnJvciBjYWxsYmFjayAqLworICAgIGhzbWFydGNhcmQtPmhkbWF0eC0+WGZlckVycm9yQ2FsbGJhY2sgPSBTTUFSVENBUkRfRE1BRXJyb3I7CisKKyAgICAvKiBTZXQgdGhlIERNQSBhYm9ydCBjYWxsYmFjayAqLworICAgIGhzbWFydGNhcmQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgLyogRW5hYmxlIHRoZSBTTUFSVENBUkQgdHJhbnNtaXQgRE1BIGNoYW5uZWwgKi8KKyAgICBIQUxfRE1BX1N0YXJ0X0lUKGhzbWFydGNhcmQtPmhkbWF0eCwgKHVpbnQzMl90KWhzbWFydGNhcmQtPnBUeEJ1ZmZQdHIsICh1aW50MzJfdCkmaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPlREUiwgU2l6ZSk7CisKKyAgICAvKiBDbGVhciB0aGUgVEMgZmxhZyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5JQ1IsIFVTQVJUX0lDUl9UQ0NGKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICAvKiBFbmFibGUgdGhlIFVBUlQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IpICovCisgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgIC8qIEVuYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0cmFuc21pdCByZXF1ZXN0IGJ5IHNldHRpbmcgdGhlIERNQVQgYml0CisgICAgICAgaW4gdGhlIFNNQVJUQ0FSRCBhc3NvY2lhdGVkIFVTQVJUIENSMyByZWdpc3RlciAqLworICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIERNQSBtb2RlLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkLgorICAqIEBub3RlICAgVGhlIFNNQVJUQ0FSRC1hc3NvY2lhdGVkIFVTQVJUIHBhcml0eSBpcyBlbmFibGVkIChQQ0UgPSAxKSwKKyAgKiAgICAgICAgIHRoZSByZWNlaXZlZCBkYXRhIGNvbnRhaW4gdGhlIHBhcml0eSBiaXQgKE1TQiBwb3NpdGlvbikuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1JlY2VpdmVfRE1BKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZihoc21hcnRjYXJkLT5SeFN0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZigocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhzbWFydGNhcmQpOworCisgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlID0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9OT05FOworICAgIGhzbWFydGNhcmQtPlJ4U3RhdGUgICA9IEhBTF9TTUFSVENBUkRfU1RBVEVfQlVTWV9SWDsKKworICAgIGhzbWFydGNhcmQtPnBSeEJ1ZmZQdHIgPSBwRGF0YTsKKyAgICBoc21hcnRjYXJkLT5SeFhmZXJTaXplID0gU2l6ZTsKKworICAgIC8qIFNldCB0aGUgU01BUlRDQVJEIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGhzbWFydGNhcmQtPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayA9IFNNQVJUQ0FSRF9ETUFSZWNlaXZlQ3BsdDsKKworICAgIC8qIFNldCB0aGUgU01BUlRDQVJEIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgIGhzbWFydGNhcmQtPmhkbWFyeC0+WGZlckVycm9yQ2FsbGJhY2sgPSBTTUFSVENBUkRfRE1BRXJyb3I7CisKKyAgICAvKiBTZXQgdGhlIERNQSBhYm9ydCBjYWxsYmFjayAqLworICAgIGhzbWFydGNhcmQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgIEhBTF9ETUFfU3RhcnRfSVQoaHNtYXJ0Y2FyZC0+aGRtYXJ4LCAodWludDMyX3QpJmhzbWFydGNhcmQtPkluc3RhbmNlLT5SRFIsICh1aW50MzJfdCloc21hcnRjYXJkLT5wUnhCdWZmUHRyLCBTaXplKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICAvKiBFbmFibGUgdGhlIFVBUlQgUGFyaXR5IEVycm9yIEludGVycnVwdCAqLworICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworCisgICAgLyogRW5hYmxlIHRoZSBVQVJUIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgLyogRW5hYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRoZSByZWNlaXZlciByZXF1ZXN0IGJ5IHNldHRpbmcgdGhlIERNQVIgYml0CisgICAgICAgaW4gdGhlIFNNQVJUQ0FSRCBhc3NvY2lhdGVkIFVTQVJUIENSMyByZWdpc3RlciAqLworICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIHRyYW5zZmVycyAoYmxvY2tpbmcgbW9kZSkuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuIAorICAqICAgICAgICAgVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nIG9wZXJhdGlvbnMgOgorICAqICAgICAgICAgICAtIERpc2FibGUgU01BUlRDQVJEIEludGVycnVwdHMgKFR4IGFuZCBSeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBibG9ja2luZyBtb2RlIDogd2hlbiBleGl0aW5nIGZ1bmN0aW9uLCBBYm9ydCBpcyBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX0Fib3J0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBEaXNhYmxlIFJUT0lFLCBFT0JJRSwgVFhFSUUsIFRDSUUsIFJYTkUsIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUUgfCBVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9UWEVJRSB8IFVTQVJUX0NSMV9UQ0lFIHwgVVNBUlRfQ1IxX1JUT0lFIHwgVVNBUlRfQ1IxX0VPQklFKSk7CisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICB7CisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBTTUFSVENBUkQgRE1BIFR4IGNoYW5uZWwgOiB1c2UgYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAobm8gY2FsbGJhY2spICovCisgICAgaWYoaHNtYXJ0Y2FyZC0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBTTUFSVENBUkQgRE1BIEFib3J0IGNhbGxiYWNrIHRvIE51bGwuIAorICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaHNtYXJ0Y2FyZC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIEhBTF9ETUFfQWJvcnQoaHNtYXJ0Y2FyZC0+aGRtYXR4KTsKKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICB7CisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEFib3J0IHRoZSBTTUFSVENBUkQgRE1BIFJ4IGNoYW5uZWwgOiB1c2UgYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAobm8gY2FsbGJhY2spICovCisgICAgaWYoaHNtYXJ0Y2FyZC0+aGRtYXJ4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBTTUFSVENBUkQgRE1BIEFib3J0IGNhbGxiYWNrIHRvIE51bGwuIAorICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaHNtYXJ0Y2FyZC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIEhBTF9ETUFfQWJvcnQoaHNtYXJ0Y2FyZC0+aGRtYXJ4KTsKKyAgICB9CisgIH0KKworICAvKiBSZXNldCBUeCBhbmQgUnggdHJhbnNmZXIgY291bnRlcnMgKi8KKyAgaHNtYXJ0Y2FyZC0+VHhYZmVyQ291bnQgPSAwVTsgCisgIGhzbWFydGNhcmQtPlJ4WGZlckNvdW50ID0gMFU7IAorCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9PUkVGIHwgU01BUlRDQVJEX0NMRUFSX05FRiB8IFNNQVJUQ0FSRF9DTEVBUl9QRUYgfCBTTUFSVENBUkRfQ0xFQVJfRkVGIHwgU01BUlRDQVJEX0NMRUFSX1JUT0YgfCBTTUFSVENBUkRfQ0xFQVJfRU9CRik7CisKKyAgLyogUmVzdG9yZSBoc21hcnRjYXJkLT5nU3RhdGUgYW5kIGhzbWFydGNhcmQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaHNtYXJ0Y2FyZC0+Z1N0YXRlICA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgIC8qIFJlc2V0IEhhbmRsZSBFcnJvckNvZGUgdG8gTm8gRXJyb3IgKi8KKyAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlID0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9OT05FOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgb25nb2luZyBUcmFuc21pdCB0cmFuc2ZlciAoYmxvY2tpbmcgbW9kZSkuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgVHggdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuIAorICAqICAgICAgICAgVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nIG9wZXJhdGlvbnMgOgorICAqICAgICAgICAgICAtIERpc2FibGUgU01BUlRDQVJEIEludGVycnVwdHMgKFR4KQorICAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkKKyAgKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0IChpbiBjYXNlIG9mIHRyYW5zZmVyIGluIERNQSBtb2RlKQorICAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIGJsb2NraW5nIG1vZGUgOiB3aGVuIGV4aXRpbmcgZnVuY3Rpb24sIEFib3J0IGlzIGNvbnNpZGVyZWQgYXMgY29tcGxldGVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfQWJvcnRUcmFuc21pdChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogRGlzYWJsZSBUWEVJRSBhbmQgVENJRSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1RYRUlFIHwgVVNBUlRfQ1IxX1RDSUUpKTsKKworICAvKiBDaGVjayBpZiBhIHJlY2VpdmUgcHJvY2VzcyBpcyBvbmdvaW5nIG9yIG5vdC4gSWYgbm90IGRpc2FibGUgRVJSIElUICovCisgIGlmKGhzbWFydGNhcmQtPlJ4U3RhdGUgPT0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIERpc2FibGUgdGhlIFNNQVJUQ0FSRCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvcikgKi8KKyAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICB7CisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBTTUFSVENBUkQgRE1BIFR4IGNoYW5uZWwgOiB1c2UgYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAobm8gY2FsbGJhY2spICovCisgICAgaWYoaHNtYXJ0Y2FyZC0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBTTUFSVENBUkQgRE1BIEFib3J0IGNhbGxiYWNrIHRvIE51bGwuIAorICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaHNtYXJ0Y2FyZC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIEhBTF9ETUFfQWJvcnQoaHNtYXJ0Y2FyZC0+aGRtYXR4KTsKKyAgICB9CisgIH0KKworICAvKiBSZXNldCBUeCB0cmFuc2ZlciBjb3VudGVyICovCisgIGhzbWFydGNhcmQtPlR4WGZlckNvdW50ID0gMFU7IAorCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9GRUYpOworCisgIC8qIFJlc3RvcmUgaHNtYXJ0Y2FyZC0+Z1N0YXRlIHRvIFJlYWR5ICovCisgIGhzbWFydGNhcmQtPmdTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIFJlY2VpdmUgdHJhbnNmZXIgKGJsb2NraW5nIG1vZGUpLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIFJ4IHRyYW5zZmVyIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLiAKKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIFNNQVJUQ0FSRCBJbnRlcnJ1cHRzIChSeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBibG9ja2luZyBtb2RlIDogd2hlbiBleGl0aW5nIGZ1bmN0aW9uLCBBYm9ydCBpcyBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX0Fib3J0UmVjZWl2ZShTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogRGlzYWJsZSBSVE9JRSwgRU9CSUUsIFJYTkUsIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUUgfCBVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9SVE9JRSB8IFVTQVJUX0NSMV9FT0JJRSkpOworCisgIC8qIENoZWNrIGlmIGEgVHJhbnNtaXQgcHJvY2VzcyBpcyBvbmdvaW5nIG9yIG5vdC4gSWYgbm90IGRpc2FibGUgRVJSIElUICovCisgIGlmKGhzbWFydGNhcmQtPmdTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgU01BUlRDQVJEIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yKSAqLworICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFNNQVJUQ0FSRCBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgIHsKKyAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgLyogQWJvcnQgdGhlIFNNQVJUQ0FSRCBETUEgUnggY2hhbm5lbCA6IHVzZSBibG9ja2luZyBETUEgQWJvcnQgQVBJIChubyBjYWxsYmFjaykgKi8KKyAgICBpZihoc21hcnRjYXJkLT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFNNQVJUQ0FSRCBETUEgQWJvcnQgY2FsbGJhY2sgdG8gTnVsbC4gCisgICAgICAgICBObyBjYWxsIGJhY2sgZXhlY3V0aW9uIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBoc21hcnRjYXJkLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgICAgSEFMX0RNQV9BYm9ydChoc21hcnRjYXJkLT5oZG1hcngpOworICAgIH0KKyAgfQorCisgIC8qIFJlc2V0IFJ4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgaHNtYXJ0Y2FyZC0+UnhYZmVyQ291bnQgPSAwVTsgCisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX0NMRUFSX09SRUYgfCBTTUFSVENBUkRfQ0xFQVJfTkVGIHwgU01BUlRDQVJEX0NMRUFSX1BFRiB8IFNNQVJUQ0FSRF9DTEVBUl9GRUYgfCBTTUFSVENBUkRfQ0xFQVJfUlRPRiB8IFNNQVJUQ0FSRF9DTEVBUl9FT0JGKTsKKworICAvKiBSZXN0b3JlIGhzbWFydGNhcmQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIHRyYW5zZmVycyAoSW50ZXJydXB0IG1vZGUpLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIHRyYW5zZmVyIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLiAKKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIFNNQVJUQ0FSRCBJbnRlcnJ1cHRzIChUeCBhbmQgUngpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnRfSVQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqICAgICAgICAgICAtIEF0IGFib3J0IGNvbXBsZXRpb24sIGNhbGwgdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjaworICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gSW50ZXJydXB0IG1vZGUsIG1lYW5pbmcgdGhhdCBhYm9ydCBwcm9jZWR1cmUgY291bGQgYmUKKyAgKiAgICAgICAgIGNvbnNpZGVyZWQgYXMgY29tcGxldGVkIG9ubHkgd2hlbiB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIChub3Qgd2hlbiBleGl0aW5nIGZ1bmN0aW9uKS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX0Fib3J0X0lUKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICB1aW50MzJfdCBhYm9ydGNwbHQgPSAxVTsKKyAgCisgIC8qIERpc2FibGUgUlRPSUUsIEVPQklFLCBUWEVJRSwgVENJRSwgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRSB8IFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1RYRUlFIHwgVVNBUlRfQ1IxX1RDSUUgfCBVU0FSVF9DUjFfUlRPSUUgfCBVU0FSVF9DUjFfRU9CSUUpKTsKKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgIC8qIElmIERNQSBUeCBhbmQvb3IgRE1BIFJ4IEhhbmRsZXMgYXJlIGFzc29jaWF0ZWQgdG8gU01BUlRDQVJEIEhhbmRsZSwgRE1BIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrcyBzaG91bGQgYmUgaW5pdGlhbGlzZWQKKyAgICAgYmVmb3JlIGFueSBjYWxsIHRvIERNQSBBYm9ydCBmdW5jdGlvbnMgKi8KKyAgLyogRE1BIFR4IEhhbmRsZSBpcyB2YWxpZCAqLworICBpZihoc21hcnRjYXJkLT5oZG1hdHggIT0gTlVMTCkKKyAgeworICAgIC8qIFNldCBETUEgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgaWYgU01BUlRDQVJEIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQuCisgICAgICAgT3RoZXJ3aXNlLCBzZXQgaXQgdG8gTlVMTCAqLworICAgIGlmKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgICB7CisgICAgICBoc21hcnRjYXJkLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gU01BUlRDQVJEX0RNQVR4QWJvcnRDYWxsYmFjazsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhzbWFydGNhcmQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgIH0KKyAgfQorICAvKiBETUEgUnggSGFuZGxlIGlzIHZhbGlkICovCisgIGlmKGhzbWFydGNhcmQtPmhkbWFyeCAhPSBOVUxMKQorICB7CisgICAgLyogU2V0IERNQSBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayBpZiBTTUFSVENBUkQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZC4KKyAgICAgICBPdGhlcndpc2UsIHNldCBpdCB0byBOVUxMICovCisgICAgaWYoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICAgIHsKKyAgICAgIGhzbWFydGNhcmQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBTTUFSVENBUkRfRE1BUnhBYm9ydENhbGxiYWNrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHNtYXJ0Y2FyZC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgfQorICB9CisgIAorICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZihIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgIHsKKyAgICAvKiBEaXNhYmxlIERNQSBUeCBhdCBVQVJUIGxldmVsICovCisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBTTUFSVENBUkQgRE1BIFR4IGNoYW5uZWwgOiB1c2Ugbm9uIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKGNhbGxiYWNrKSAqLworICAgIGlmKGhzbWFydGNhcmQtPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNNQVJUQ0FSRCBUeCBETUEgQWJvcnQgY2FsbGJhY2sgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXNlZCA6IAorICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX1NNQVJUQ0FSRF9BYm9ydENwbHRDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisKKyAgICAgIC8qIEFib3J0IERNQSBUWCAqLworICAgICAgaWYoSEFMX0RNQV9BYm9ydF9JVChoc21hcnRjYXJkLT5oZG1hdHgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaHNtYXJ0Y2FyZC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGFib3J0Y3BsdCA9IDBVOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFNNQVJUQ0FSRCBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgIHsKKyAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgLyogQWJvcnQgdGhlIFNNQVJUQ0FSRCBETUEgUnggY2hhbm5lbCA6IHVzZSBub24gYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAoY2FsbGJhY2spICovCisgICAgaWYoaHNtYXJ0Y2FyZC0+aGRtYXJ4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU01BUlRDQVJEIFJ4IERNQSBBYm9ydCBjYWxsYmFjayBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpc2VkIDogCisgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfU01BUlRDQVJEX0Fib3J0Q3BsdENhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKworICAgICAgLyogQWJvcnQgRE1BIFJYICovCisgICAgICBpZihIQUxfRE1BX0Fib3J0X0lUKGhzbWFydGNhcmQtPmhkbWFyeCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBoc21hcnRjYXJkLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgYWJvcnRjcGx0ID0gMVU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGFib3J0Y3BsdCA9IDBVOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIGlmIG5vIERNQSBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjayBleGVjdXRpb24gaXMgcmVxdWlyZWQgPT4gY2FsbCB1c2VyIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrICovCisgIGlmIChhYm9ydGNwbHQgPT0gMVUpCisgIHsKKyAgICAvKiBSZXNldCBUeCBhbmQgUnggdHJhbnNmZXIgY291bnRlcnMgKi8KKyAgICBoc21hcnRjYXJkLT5UeFhmZXJDb3VudCA9IDBVOyAKKyAgICBoc21hcnRjYXJkLT5SeFhmZXJDb3VudCA9IDBVOworCisgICAgLyogUmVzZXQgZXJyb3JDb2RlICovCisgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlID0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9OT05FOworCisgICAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfRkxBRyhoc21hcnRjYXJkLCBTTUFSVENBUkRfQ0xFQVJfT1JFRiB8IFNNQVJUQ0FSRF9DTEVBUl9ORUYgfCBTTUFSVENBUkRfQ0xFQVJfUEVGIHwgU01BUlRDQVJEX0NMRUFSX0ZFRiB8IFNNQVJUQ0FSRF9DTEVBUl9SVE9GIHwgU01BUlRDQVJEX0NMRUFSX0VPQkYpOworCisgICAgLyogUmVzdG9yZSBoc21hcnRjYXJkLT5nU3RhdGUgYW5kIGhzbWFydGNhcmQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgICBoc21hcnRjYXJkLT5nU3RhdGUgID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKyAgICBoc21hcnRjYXJkLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBIQUxfU01BUlRDQVJEX0Fib3J0Q3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIFRyYW5zbWl0IHRyYW5zZmVyIChJbnRlcnJ1cHQgbW9kZSkuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgVHggdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuIAorICAqICAgICAgICAgVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nIG9wZXJhdGlvbnMgOgorICAqICAgICAgICAgICAtIERpc2FibGUgU01BUlRDQVJEIEludGVycnVwdHMgKFR4KQorICAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkKKyAgKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0X0lUIChpbiBjYXNlIG9mIHRyYW5zZmVyIGluIERNQSBtb2RlKQorICAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKKyAgKiAgICAgICAgICAgLSBBdCBhYm9ydCBjb21wbGV0aW9uLCBjYWxsIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sKKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIEludGVycnVwdCBtb2RlLCBtZWFuaW5nIHRoYXQgYWJvcnQgcHJvY2VkdXJlIGNvdWxkIGJlCisgICogICAgICAgICBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZCBvbmx5IHdoZW4gdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjayBpcyBleGVjdXRlZCAobm90IHdoZW4gZXhpdGluZyBmdW5jdGlvbikuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9BYm9ydFRyYW5zbWl0X0lUKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBEaXNhYmxlIFRYRUlFIGFuZCBUQ0lFIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfVFhFSUUgfCBVU0FSVF9DUjFfVENJRSkpOworCisgIC8qIENoZWNrIGlmIGEgcmVjZWl2ZSBwcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90LiBJZiBub3QgZGlzYWJsZSBFUlIgSVQgKi8KKyAgaWYoaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgU01BUlRDQVJEIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yKSAqLworICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFNNQVJUQ0FSRCBETUEgVHggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgIHsKKyAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgLyogQWJvcnQgdGhlIFNNQVJUQ0FSRCBETUEgVHggY2hhbm5lbCA6IHVzZSBub24gYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAoY2FsbGJhY2spICovCisgICAgaWYoaHNtYXJ0Y2FyZC0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBTTUFSVENBUkQgRE1BIEFib3J0IGNhbGxiYWNrIDogCisgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfU01BUlRDQVJEX0Fib3J0Q3BsdENhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgIGhzbWFydGNhcmQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBTTUFSVENBUkRfRE1BVHhPbmx5QWJvcnRDYWxsYmFjazsKKworICAgICAgLyogQWJvcnQgRE1BIFRYICovCisgICAgICBpZihIQUxfRE1BX0Fib3J0X0lUKGhzbWFydGNhcmQtPmhkbWF0eCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICAvKiBDYWxsIERpcmVjdGx5IGhzbWFydGNhcmQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgICBoc21hcnRjYXJkLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrKGhzbWFydGNhcmQtPmhkbWF0eCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBSZXNldCBUeCB0cmFuc2ZlciBjb3VudGVyICovCisgICAgICBoc21hcnRjYXJkLT5UeFhmZXJDb3VudCA9IDBVOyAKKworICAgICAgLyogUmVzdG9yZSBoc21hcnRjYXJkLT5nU3RhdGUgdG8gUmVhZHkgKi8KKyAgICAgIGhzbWFydGNhcmQtPmdTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIEhBTF9TTUFSVENBUkRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUmVzZXQgVHggdHJhbnNmZXIgY291bnRlciAqLworICAgIGhzbWFydGNhcmQtPlR4WGZlckNvdW50ID0gMFU7IAorCisgICAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfRkxBRyhoc21hcnRjYXJkLCBTTUFSVENBUkRfQ0xFQVJfRkVGKTsKKworICAgIC8qIFJlc3RvcmUgaHNtYXJ0Y2FyZC0+Z1N0YXRlIHRvIFJlYWR5ICovCisgICAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBIQUxfU01BUlRDQVJEX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IG9uZ29pbmcgUmVjZWl2ZSB0cmFuc2ZlciAoSW50ZXJydXB0IG1vZGUpLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIFJ4IHRyYW5zZmVyIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLiAKKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIFNNQVJUQ0FSRCBJbnRlcnJ1cHRzIChSeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydF9JVCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogICAgICAgICAgIC0gQXQgYWJvcnQgY29tcGxldGlvbiwgY2FsbCB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBJbnRlcnJ1cHQgbW9kZSwgbWVhbmluZyB0aGF0IGFib3J0IHByb2NlZHVyZSBjb3VsZCBiZQorICAqICAgICAgICAgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQgb25seSB3aGVuIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgKG5vdCB3aGVuIGV4aXRpbmcgZnVuY3Rpb24pLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfQWJvcnRSZWNlaXZlX0lUKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBEaXNhYmxlIFJUT0lFLCBFT0JJRSwgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRSB8IFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1JUT0lFIHwgVVNBUlRfQ1IxX0VPQklFKSk7CisKKyAgLyogQ2hlY2sgaWYgYSBUcmFuc21pdCBwcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90LiBJZiBub3QgZGlzYWJsZSBFUlIgSVQgKi8KKyAgaWYoaHNtYXJ0Y2FyZC0+Z1N0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IpICovCisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworICB9CisKKyAgLyogRGlzYWJsZSB0aGUgU01BUlRDQVJEIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgeworICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBBYm9ydCB0aGUgU01BUlRDQVJEIERNQSBSeCBjaGFubmVsIDogdXNlIG5vbiBibG9ja2luZyBETUEgQWJvcnQgQVBJIChjYWxsYmFjaykgKi8KKyAgICBpZihoc21hcnRjYXJkLT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFNNQVJUQ0FSRCBETUEgQWJvcnQgY2FsbGJhY2sgOiAKKyAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9TTUFSVENBUkRfQWJvcnRDcGx0Q2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaHNtYXJ0Y2FyZC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFNNQVJUQ0FSRF9ETUFSeE9ubHlBYm9ydENhbGxiYWNrOworCisgICAgICAvKiBBYm9ydCBETUEgUlggKi8KKyAgICAgIGlmKEhBTF9ETUFfQWJvcnRfSVQoaHNtYXJ0Y2FyZC0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgaHNtYXJ0Y2FyZC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayBmdW5jdGlvbiBpbiBjYXNlIG9mIGVycm9yICovCisgICAgICAgIGhzbWFydGNhcmQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2soaHNtYXJ0Y2FyZC0+aGRtYXJ4KTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFJlc2V0IFJ4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgICAgIGhzbWFydGNhcmQtPlJ4WGZlckNvdW50ID0gMFU7IAorCisgICAgICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICAgICAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX0NMRUFSX09SRUYgfCBTTUFSVENBUkRfQ0xFQVJfTkVGIHwgU01BUlRDQVJEX0NMRUFSX1BFRiB8IFNNQVJUQ0FSRF9DTEVBUl9GRUYgfCBTTUFSVENBUkRfQ0xFQVJfUlRPRiB8IFNNQVJUQ0FSRF9DTEVBUl9FT0JGKTsKKworICAgICAgLyogUmVzdG9yZSBoc21hcnRjYXJkLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgICBoc21hcnRjYXJkLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICAgICAgLyogQXMgbm8gRE1BIHRvIGJlIGFib3J0ZWQsIGNhbGwgZGlyZWN0bHkgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgSEFMX1NNQVJUQ0FSRF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJlc2V0IFJ4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgICBoc21hcnRjYXJkLT5SeFhmZXJDb3VudCA9IDBVOyAKKworICAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgICAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX0NMRUFSX09SRUYgfCBTTUFSVENBUkRfQ0xFQVJfTkVGIHwgU01BUlRDQVJEX0NMRUFSX1BFRiB8IFNNQVJUQ0FSRF9DTEVBUl9GRUYgfCBTTUFSVENBUkRfQ0xFQVJfUlRPRiB8IFNNQVJUQ0FSRF9DTEVBUl9FT0JGKTsKKworICAgIC8qIFJlc3RvcmUgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICAgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgICAgLyogQXMgbm8gRE1BIHRvIGJlIGFib3J0ZWQsIGNhbGwgZGlyZWN0bHkgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIEhBTF9TTUFSVENBUkRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIEhhbmRsZSBTTUFSVENBUkQgaW50ZXJydXB0IHJlcXVlc3RzLgorICAqIEBwYXJhbSBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfU01BUlRDQVJEX0lSUUhhbmRsZXIoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIHVpbnQzMl90IGlzcmZsYWdzICAgPSBSRUFEX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+SVNSKTsKKyAgdWludDMyX3QgY3IxaXRzICAgICA9IFJFQURfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEpOworICB1aW50MzJfdCBjcjNpdHM7CisgIHVpbnQzMl90IGVycm9yZmxhZ3M7CisKKyAgLyogSWYgbm8gZXJyb3Igb2NjdXJzICovCisgIGVycm9yZmxhZ3MgPSAoaXNyZmxhZ3MgJiAodWludDMyX3QpKFVTQVJUX0lTUl9QRSB8IFVTQVJUX0lTUl9GRSB8IFVTQVJUX0lTUl9PUkUgfCBVU0FSVF9JU1JfTkUgfCBVU0FSVF9JU1JfUlRPRikpOworICBpZiAoZXJyb3JmbGFncyA9PSBSRVNFVCkKKyAgeworICAgIC8qIFNNQVJUQ0FSRCBpbiBtb2RlIFJlY2VpdmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9SWE5FKSAhPSBSRVNFVCkgJiYgKChjcjFpdHMgJiBVU0FSVF9DUjFfUlhORUlFKSAhPSBSRVNFVCkpCisgICAgeworICAgICAgU01BUlRDQVJEX1JlY2VpdmVfSVQoaHNtYXJ0Y2FyZCk7CisgICAgICAvKiBDbGVhciBSWE5FIGludGVycnVwdCBmbGFnIGRvbmUgYnkgcmVhZGluZyBSRFIgaW4gU01BUlRDQVJEX1JlY2VpdmVfSVQoKSAqLworICAgICAgcmV0dXJuOworICAgIH0KKyAgfSAgCisKKyAgLyogSWYgc29tZSBlcnJvcnMgb2NjdXIgKi8KKyAgY3IzaXRzID0gUkVBRF9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMyk7CisgIGlmKCAgIChlcnJvcmZsYWdzICE9IFJFU0VUKSAKKyAgICAgJiYgKCAgICAoKGNyM2l0cyAmIFVTQVJUX0NSM19FSUUpICE9IFJFU0VUKQorICAgICAgICAgIHx8ICgoY3IxaXRzICYgKFVTQVJUX0NSMV9SWE5FSUUgfCBVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9SVE9JRSkpICE9IFJFU0VUKSkgKQorICB7CisgICAgLyogU01BUlRDQVJEIHBhcml0eSBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9QRSkgIT0gUkVTRVQpICYmICgoY3IxaXRzICYgVVNBUlRfQ1IxX1BFSUUpICE9IFJFU0VUKSkKKyAgICB7CisgICAgICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfSVQoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX0NMRUFSX1BFRik7CisKKyAgICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSB8PSBIQUxfU01BUlRDQVJEX0VSUk9SX1BFOworICAgIH0KKworICAgIC8qIFNNQVJUQ0FSRCBmcmFtZSBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfRkUpICE9IFJFU0VUKSAmJiAoKGNyM2l0cyAmIFVTQVJUX0NSM19FSUUpICE9IFJFU0VUKSkKKyAgICB7CisgICAgICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfSVQoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX0NMRUFSX0ZFRik7CisKKyAgICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSB8PSBIQUxfU01BUlRDQVJEX0VSUk9SX0ZFOworICAgIH0KKworICAgIC8qIFNNQVJUQ0FSRCBub2lzZSBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfTkUpICE9IFJFU0VUKSAmJiAoKGNyM2l0cyAmIFVTQVJUX0NSM19FSUUpICE9IFJFU0VUKSkKKyAgICB7CisgICAgICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfSVQoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX0NMRUFSX05FRik7CisKKyAgICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSB8PSBIQUxfU01BUlRDQVJEX0VSUk9SX05FOworICAgIH0KKworICAgIC8qIFNNQVJUQ0FSRCBPdmVyLVJ1biBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfT1JFKSAhPSBSRVNFVCkgJiYKKyAgICAgICAoKChjcjFpdHMgJiBVU0FSVF9DUjFfUlhORUlFKSAhPSBSRVNFVCkgfHwgKChjcjNpdHMgJiBVU0FSVF9DUjNfRUlFKSAhPSBSRVNFVCkpKQorICAgIHsKKyAgICAgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9JVChoc21hcnRjYXJkLCBTTUFSVENBUkRfQ0xFQVJfT1JFRik7CisKKyAgICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSB8PSBIQUxfU01BUlRDQVJEX0VSUk9SX09SRTsKKyAgICB9CisKKyAgICAvKiBTTUFSVENBUkQgcmVjZWl2ZXIgdGltZW91dCBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUlRPRikgIT0gUkVTRVQpICYmICgoY3IxaXRzICYgVVNBUlRfQ1IxX1JUT0lFKSAhPSBSRVNFVCkpCisgICAgeworICAgICAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0lUKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9SVE9GKTsKKworICAgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlIHw9IEhBTF9TTUFSVENBUkRfRVJST1JfUlRPOworICAgIH0KKworICAgIC8qIENhbGwgU01BUlRDQVJEIEVycm9yIENhbGwgYmFjayBmdW5jdGlvbiBpZiBuZWVkIGJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZihoc21hcnRjYXJkLT5FcnJvckNvZGUgIT0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9OT05FKQorICAgIHsKKyAgICAgIC8qIFNNQVJUQ0FSRCBpbiBtb2RlIFJlY2VpdmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICBpZigoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1JYTkUpICE9IFJFU0VUKSAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWE5FSUUpICE9IFJFU0VUKSkKKyAgICAgIHsKKyAgICAgICAgU01BUlRDQVJEX1JlY2VpdmVfSVQoaHNtYXJ0Y2FyZCk7CisgICAgICB9CisKKyAgICAgIC8qIElmIEVycm9yIGlzIHRvIGJlIGNvbnNpZGVyZWQgYXMgYmxvY2tpbmcgOgorICAgICAgICAgIC0gUmVjZWl2ZXIgVGltZW91dCBlcnJvciBpbiBSZWNlcHRpb24KKyAgICAgICAgICAtIE92ZXJydW4gZXJyb3IgaW4gUmVjZXB0aW9uCisgICAgICAgICAgLSBhbnkgZXJyb3Igb2NjdXJzIGluIERNQSBtb2RlIHJlY2VwdGlvbgorICAgICAgKi8KKyAgICAgIGlmICggICAoKGhzbWFydGNhcmQtPkVycm9yQ29kZSAmIChIQUxfU01BUlRDQVJEX0VSUk9SX1JUTyB8IEhBTF9TTUFSVENBUkRfRVJST1JfT1JFKSkgIT0gUkVTRVQpCisgICAgICAgICAgfHwgKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkpCisgICAgICB7ICAKKyAgICAgICAgLyogQmxvY2tpbmcgZXJyb3IgOiB0cmFuc2ZlciBpcyBhYm9ydGVkCisgICAgICAgICAgIFNldCB0aGUgU01BUlRDQVJEIHN0YXRlIHJlYWR5IHRvIGJlIGFibGUgdG8gc3RhcnQgYWdhaW4gdGhlIHByb2Nlc3MsCisgICAgICAgICAgIERpc2FibGUgUnggSW50ZXJydXB0cywgYW5kIGRpc2FibGUgUnggRE1BIHJlcXVlc3QsIGlmIG9uZ29pbmcgKi8KKyAgICAgICAgU01BUlRDQVJEX0VuZFJ4VHJhbnNmZXIoaHNtYXJ0Y2FyZCk7CisKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgU01BUlRDQVJEIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgICAgICAgaWYgKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgICAgICAgeworICAgICAgICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAgICAgICAvKiBBYm9ydCB0aGUgU01BUlRDQVJEIERNQSBSeCBjaGFubmVsICovCisgICAgICAgICAgaWYoaHNtYXJ0Y2FyZC0+aGRtYXJ4ICE9IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogU2V0IHRoZSBTTUFSVENBUkQgRE1BIEFib3J0IGNhbGxiYWNrIDogCisgICAgICAgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfU01BUlRDQVJEX0Vycm9yQ2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgICAgICAgaHNtYXJ0Y2FyZC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFNNQVJUQ0FSRF9ETUFBYm9ydE9uRXJyb3I7CisKKyAgICAgICAgICAgIC8qIEFib3J0IERNQSBSWCAqLworICAgICAgICAgICAgaWYoSEFMX0RNQV9BYm9ydF9JVChoc21hcnRjYXJkLT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogQ2FsbCBEaXJlY3RseSBoc21hcnRjYXJkLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKi8KKyAgICAgICAgICAgICAgaHNtYXJ0Y2FyZC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayhoc21hcnRjYXJkLT5oZG1hcngpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgICAgICBIQUxfU01BUlRDQVJEX0Vycm9yQ2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICAgIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjayhoc21hcnRjYXJkKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogb3RoZXIgZXJyb3IgdHlwZSB0byBiZSBjb25zaWRlcmVkIGFzIGJsb2NraW5nIDoKKyAgICAgICAgICAtIEZyYW1lIGVycm9yIGluIFRyYW5zbWlzc2lvbgorICAgICAgKi8KKyAgICAgIGVsc2UgaWYgKChoc21hcnRjYXJkLT5nU3RhdGUgPT0gSEFMX1NNQVJUQ0FSRF9TVEFURV9CVVNZX1RYKSAmJiAoKGhzbWFydGNhcmQtPkVycm9yQ29kZSAmIEhBTF9TTUFSVENBUkRfRVJST1JfRkUpICE9IFJFU0VUKSkKKyAgICAgIHsKKyAgICAgICAgLyogQmxvY2tpbmcgZXJyb3IgOiB0cmFuc2ZlciBpcyBhYm9ydGVkCisgICAgICAgICAgIFNldCB0aGUgU01BUlRDQVJEIHN0YXRlIHJlYWR5IHRvIGJlIGFibGUgdG8gc3RhcnQgYWdhaW4gdGhlIHByb2Nlc3MsCisgICAgICAgICAgIERpc2FibGUgVHggSW50ZXJydXB0cywgYW5kIGRpc2FibGUgVHggRE1BIHJlcXVlc3QsIGlmIG9uZ29pbmcgKi8KKyAgICAgICAgU01BUlRDQVJEX0VuZFR4VHJhbnNmZXIoaHNtYXJ0Y2FyZCk7CisKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgU01BUlRDQVJEIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgICAgICAgaWYgKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgICAgICAgeworICAgICAgICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICAgICAgICAvKiBBYm9ydCB0aGUgU01BUlRDQVJEIERNQSBUeCBjaGFubmVsICovCisgICAgICAgICAgaWYoaHNtYXJ0Y2FyZC0+aGRtYXR4ICE9IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogU2V0IHRoZSBTTUFSVENBUkQgRE1BIEFib3J0IGNhbGxiYWNrIDogCisgICAgICAgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfU01BUlRDQVJEX0Vycm9yQ2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgICAgICAgaHNtYXJ0Y2FyZC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFNNQVJUQ0FSRF9ETUFBYm9ydE9uRXJyb3I7CisKKyAgICAgICAgICAgIC8qIEFib3J0IERNQSBUWCAqLworICAgICAgICAgICAgaWYoSEFMX0RNQV9BYm9ydF9JVChoc21hcnRjYXJkLT5oZG1hdHgpICE9IEhBTF9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogQ2FsbCBEaXJlY3RseSBoc21hcnRjYXJkLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKi8KKyAgICAgICAgICAgICAgaHNtYXJ0Y2FyZC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayhoc21hcnRjYXJkLT5oZG1hdHgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgICAgICBIQUxfU01BUlRDQVJEX0Vycm9yQ2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICAgIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjayhoc21hcnRjYXJkKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBOb24gQmxvY2tpbmcgZXJyb3IgOiB0cmFuc2ZlciBjb3VsZCBnbyBvbi4gCisgICAgICAgICAgIEVycm9yIGlzIG5vdGlmaWVkIHRvIHVzZXIgdGhyb3VnaCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjayhoc21hcnRjYXJkKTsKKyAgICAgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlID0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9OT05FOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CisKKyAgfSAvKiBFbmQgaWYgc29tZSBlcnJvciBvY2N1cnMgKi8KKworICAvKiBTTUFSVENBUkQgaW4gbW9kZSBSZWNlaXZlciwgZW5kIG9mIGJsb2NrIGludGVycnVwdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZigoKGlzcmZsYWdzICYgVVNBUlRfSVNSX0VPQkYpICE9IFJFU0VUKSAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9FT0JJRSkgIT0gUkVTRVQpKQorICB7CisgICAgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisgICAgX19IQUxfVU5MT0NLKGhzbWFydGNhcmQpOworICAgIEhBTF9TTUFSVENBUkRfUnhDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisgICAgLyogQ2xlYXIgRU9CRiBpbnRlcnJ1cHQgYWZ0ZXIgSEFMX1NNQVJUQ0FSRF9SeENwbHRDYWxsYmFjaygpIGNhbGwgZm9yIHRoZSBFbmQgb2YgQmxvY2sgaW5mb3JtYXRpb24KKyAgICAgKiB0byBiZSBhdmFpbGFibGUgZHVyaW5nIEhBTF9TTUFSVENBUkRfUnhDcGx0Q2FsbGJhY2soKSBwcm9jZXNzaW5nICovCisgICAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0lUKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9FT0JGKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBTTUFSVENBUkQgaW4gbW9kZSBUcmFuc21pdHRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZigoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1RYRSkgIT0gUkVTRVQpICYmICgoY3IxaXRzICYgVVNBUlRfQ1IxX1RYRUlFKSAhPSBSRVNFVCkpCisgIHsKKyAgICBTTUFSVENBUkRfVHJhbnNtaXRfSVQoaHNtYXJ0Y2FyZCk7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogU01BUlRDQVJEIGluIG1vZGUgVHJhbnNtaXR0ZXIgKHRyYW5zbWlzc2lvbiBlbmQpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKChfX0hBTF9TTUFSVENBUkRfR0VUX0lUKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9JVF9UQykgIT0gUkVTRVQpICYmKF9fSEFMX1NNQVJUQ0FSRF9HRVRfSVRfU09VUkNFKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9JVF9UQykgIT0gUkVTRVQpKQorICB7CisgICAgU01BUlRDQVJEX0VuZFRyYW5zbWl0X0lUKGhzbWFydGNhcmQpOworICAgIHJldHVybjsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU01BUlRDQVJEX1R4Q3BsdENhbGxiYWNrKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc21hcnRjYXJkKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NNQVJUQ0FSRF9UeENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TTUFSVENBUkRfUnhDcGx0Q2FsbGJhY2soU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzbWFydGNhcmQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU01BUlRDQVJEX1J4Q3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTTUFSVENBUkQgZXJyb3IgY2FsbGJhY2suCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NNQVJUQ0FSRF9FcnJvckNhbGxiYWNrKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc21hcnRjYXJkKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NNQVJUQ0FSRF9FcnJvckNhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTTUFSVENBUkQgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NNQVJUQ0FSRF9BYm9ydENwbHRDYWxsYmFjayAoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzbWFydGNhcmQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU01BUlRDQVJEX0Fib3J0Q3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTTUFSVENBUkQgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NNQVJUQ0FSRF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrIChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNtYXJ0Y2FyZCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TTUFSVENBUkRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgU01BUlRDQVJEIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NNQVJUQ0FSRF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc21hcnRjYXJkKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NNQVJUQ0FSRF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgU01BUlRDQVJEIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIHJldHVybiB0aGUgU3RhdGUgb2YgU21hcnRDYXJkCisgICAgaGFuZGxlIGFuZCBhbHNvIHJldHVybiBQZXJpcGhlcmFsIEVycm9ycyBvY2N1cnJlZCBkdXJpbmcgY29tbXVuaWNhdGlvbiBwcm9jZXNzCisgICAgICgrKSBIQUxfU01BUlRDQVJEX0dldFN0YXRlKCkgQVBJIGNhbiBiZSBoZWxwZnVsIHRvIGNoZWNrIGluIHJ1bi10aW1lIHRoZSBzdGF0ZQorICAgICAgICAgb2YgdGhlIFNNQVJUQ0FSRCBwZXJpcGhlcmFsLgorICAgICAoKykgSEFMX1NNQVJUQ0FSRF9HZXRFcnJvcigpIGNoZWNrcyBpbiBydW4tdGltZSBlcnJvcnMgdGhhdCBjb3VsZCBvY2N1ciBkdXJpbmcKKyAgICAgICAgIGNvbW11bmljYXRpb24uCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBTTUFSVENBUkQgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIFNNQVJUQ0FSRCBoYW5kbGUgc3RhdGUKKyAgKi8KK0hBTF9TTUFSVENBUkRfU3RhdGVUeXBlRGVmIEhBTF9TTUFSVENBUkRfR2V0U3RhdGUoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIFJldHVybiBTTUFSVENBUkQgaGFuZGxlIHN0YXRlICovCisgIHVpbnQzMl90IHRlbXAxPSAweDAwVSwgdGVtcDIgPSAweDAwVTsKKyAgdGVtcDEgPSBoc21hcnRjYXJkLT5nU3RhdGU7CisgIHRlbXAyID0gaHNtYXJ0Y2FyZC0+UnhTdGF0ZTsKKworICByZXR1cm4gKEhBTF9TTUFSVENBUkRfU3RhdGVUeXBlRGVmKSh0ZW1wMSB8IHRlbXAyKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFNNQVJUQ0FSRCBoYW5kbGUgZXJyb3IgY29kZS4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHJldHZhbCBTTUFSVENBUkQgaGFuZGxlIEVycm9yIENvZGUKKyovCit1aW50MzJfdCBIQUxfU01BUlRDQVJEX0dldEVycm9yKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICByZXR1cm4gaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9Qcml2YXRlX0Z1bmN0aW9ucyBTTUFSVENBUkQgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgU01BUlRDQVJEIGFzc29jaWF0ZWQgVVNBUlQgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNNQVJUQ0FSRF9TZXRDb25maWcoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIHVpbnQzMl90IHRtcHJlZyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwVTsKKyAgU01BUlRDQVJEX0Nsb2NrU291cmNlVHlwZURlZiBjbG9ja3NvdXJjZSA9IFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHJldCAgICAgICAgICAgICAgICAgICAgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NNQVJUQ0FSRF9JTlNUQU5DRShoc21hcnRjYXJkLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX0JBVURSQVRFKGhzbWFydGNhcmQtPkluaXQuQmF1ZFJhdGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQVJUQ0FSRF9XT1JEX0xFTkdUSChoc21hcnRjYXJkLT5Jbml0LldvcmRMZW5ndGgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQVJUQ0FSRF9TVE9QQklUUyhoc21hcnRjYXJkLT5Jbml0LlN0b3BCaXRzKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfUEFSSVRZKGhzbWFydGNhcmQtPkluaXQuUGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfTU9ERShoc21hcnRjYXJkLT5Jbml0Lk1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQVJUQ0FSRF9QT0xBUklUWShoc21hcnRjYXJkLT5Jbml0LkNMS1BvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfUEhBU0UoaHNtYXJ0Y2FyZC0+SW5pdC5DTEtQaGFzZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX0xBU1RCSVQoaHNtYXJ0Y2FyZC0+SW5pdC5DTEtMYXN0Qml0KSk7CisgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfT05FX0JJVF9TQU1QTEUoaHNtYXJ0Y2FyZC0+SW5pdC5PbmVCaXRTYW1wbGluZykpOworICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX05BQ0soaHNtYXJ0Y2FyZC0+SW5pdC5OQUNLRW5hYmxlKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfVElNRU9VVChoc21hcnRjYXJkLT5Jbml0LlRpbWVPdXRFbmFibGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQVJUQ0FSRF9BVVRPUkVUUllfQ09VTlQoaHNtYXJ0Y2FyZC0+SW5pdC5BdXRvUmV0cnlDb3VudCkpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBJbiBTbWFydENhcmQgbW9kZSwgTSBhbmQgUENFIGFyZSBmb3JjZWQgdG8gMSAoOCBiaXRzICsgcGFyaXR5KS4KKyAgICogT3ZlcnNhbXBsaW5nIGlzIGZvcmNlZCB0byAxNiAoT1ZFUjggPSAwKS4KKyAgICogQ29uZmlndXJlIHRoZSBQYXJpdHkgYW5kIE1vZGU6CisgICAqICBzZXQgUFMgYml0IGFjY29yZGluZyB0byBoc21hcnRjYXJkLT5Jbml0LlBhcml0eSB2YWx1ZQorICAgKiAgc2V0IFRFIGFuZCBSRSBiaXRzIGFjY29yZGluZyB0byBoc21hcnRjYXJkLT5Jbml0Lk1vZGUgdmFsdWUgKi8KKyAgdG1wcmVnID0gKHVpbnQzMl90KSBoc21hcnRjYXJkLT5Jbml0LlBhcml0eSB8IGhzbWFydGNhcmQtPkluaXQuTW9kZTsKKyAgdG1wcmVnIHw9ICh1aW50MzJfdCkgaHNtYXJ0Y2FyZC0+SW5pdC5Xb3JkTGVuZ3RoOworICBNT0RJRllfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9GSUVMRFMsIHRtcHJlZyk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBDUjIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHRtcHJlZyA9IGhzbWFydGNhcmQtPkluaXQuU3RvcEJpdHM7CisgIC8qIFN5bmNocm9ub3VzIG1vZGUgaXMgYWN0aXZhdGVkIGJ5IGRlZmF1bHQgKi8KKyAgdG1wcmVnIHw9ICh1aW50MzJfdCkgVVNBUlRfQ1IyX0NMS0VOIHwgaHNtYXJ0Y2FyZC0+SW5pdC5DTEtQb2xhcml0eTsKKyAgdG1wcmVnIHw9ICh1aW50MzJfdCkgaHNtYXJ0Y2FyZC0+SW5pdC5DTEtQaGFzZSB8IGhzbWFydGNhcmQtPkluaXQuQ0xLTGFzdEJpdDsKKyAgdG1wcmVnIHw9ICh1aW50MzJfdCkgaHNtYXJ0Y2FyZC0+SW5pdC5UaW1lT3V0RW5hYmxlOworICBNT0RJRllfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9GSUVMRFMsIHRtcHJlZyk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBDUjMgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENvbmZpZ3VyZQorICAgKiAtIG9uZS1iaXQgc2FtcGxpbmcgbWV0aG9kIHZlcnN1cyB0aHJlZSBzYW1wbGVzJyBtYWpvcml0eSBydWxlCisgICAqICAgYWNjb3JkaW5nIHRvIGhzbWFydGNhcmQtPkluaXQuT25lQml0U2FtcGxpbmcKKyAgICogLSBOQUNLIHRyYW5zbWlzc2lvbiBpbiBjYXNlIG9mIHBhcml0eSBlcnJvciBhY2NvcmRpbmcKKyAgICogICB0byBoc21hcnRjYXJkLT5Jbml0Lk5BQ0tFbmFibGUKKyAgICogLSBhdXRvcmV0cnkgY291bnRlciBhY2NvcmRpbmcgdG8gaHNtYXJ0Y2FyZC0+SW5pdC5BdXRvUmV0cnlDb3VudCAgICAgKi8KKyAgdG1wcmVnID0gICh1aW50MzJfdCkgaHNtYXJ0Y2FyZC0+SW5pdC5PbmVCaXRTYW1wbGluZyB8IGhzbWFydGNhcmQtPkluaXQuTkFDS0VuYWJsZTsKKyAgdG1wcmVnIHw9ICgodWludDMyX3QpaHNtYXJ0Y2FyZC0+SW5pdC5BdXRvUmV0cnlDb3VudCA8PCBTTUFSVENBUkRfQ1IzX1NDQVJDTlRfTFNCX1BPUyk7CisgIE1PRElGWV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPiBDUjMsVVNBUlRfQ1IzX0ZJRUxEUywgdG1wcmVnKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIEdUUFIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgdG1wcmVnID0gKGhzbWFydGNhcmQtPkluaXQuUHJlc2NhbGVyIHwgKCh1aW50MzJfdCloc21hcnRjYXJkLT5Jbml0Lkd1YXJkVGltZSA8PCBTTUFSVENBUkRfR1RQUl9HVF9MU0JfUE9TKSk7CisgIE1PRElGWV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkdUUFIsIChVU0FSVF9HVFBSX0dUfFVTQVJUX0dUUFJfUFNDKSwgdG1wcmVnKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIFJUT1IgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgdG1wcmVnID0gICAoKHVpbnQzMl90KWhzbWFydGNhcmQtPkluaXQuQmxvY2tMZW5ndGggPDwgU01BUlRDQVJEX1JUT1JfQkxFTl9MU0JfUE9TKTsKKyAgaWYgKGhzbWFydGNhcmQtPkluaXQuVGltZU91dEVuYWJsZSA9PSBTTUFSVENBUkRfVElNRU9VVF9FTkFCTEUpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX1RJTUVPVVRfVkFMVUUoaHNtYXJ0Y2FyZC0+SW5pdC5UaW1lT3V0VmFsdWUpKTsKKyAgICB0bXByZWcgfD0gICh1aW50MzJfdCkgaHNtYXJ0Y2FyZC0+SW5pdC5UaW1lT3V0VmFsdWU7CisgIH0KKyAgTU9ESUZZX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+UlRPUiwgKFVTQVJUX1JUT1JfUlRPfFVTQVJUX1JUT1JfQkxFTiksIHRtcHJlZyk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBCUlIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFNNQVJUQ0FSRF9HRVRDTE9DS1NPVVJDRShoc21hcnRjYXJkLCBjbG9ja3NvdXJjZSk7CisgIHN3aXRjaCAoY2xvY2tzb3VyY2UpCisgIHsKKyAgICBjYXNlIFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9QQ0xLMToKKyAgICAgIGhzbWFydGNhcmQtPkluc3RhbmNlLT5CUlIgPSAodWludDE2X3QpKChIQUxfUkNDX0dldFBDTEsxRnJlcSgpICsgKGhzbWFydGNhcmQtPkluaXQuQmF1ZFJhdGUvMlUpKSAvIGhzbWFydGNhcmQtPkluaXQuQmF1ZFJhdGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfUENMSzI6CisgICAgICBoc21hcnRjYXJkLT5JbnN0YW5jZS0+QlJSID0gKHVpbnQxNl90KSgoSEFMX1JDQ19HZXRQQ0xLMkZyZXEoKSArIChoc21hcnRjYXJkLT5Jbml0LkJhdWRSYXRlLzJVKSkgLyBoc21hcnRjYXJkLT5Jbml0LkJhdWRSYXRlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU01BUlRDQVJEX0NMT0NLU09VUkNFX0hTSToKKyAgICAgIGhzbWFydGNhcmQtPkluc3RhbmNlLT5CUlIgPSAodWludDE2X3QpKChIU0lfVkFMVUUgKyAoaHNtYXJ0Y2FyZC0+SW5pdC5CYXVkUmF0ZS8yVSkpIC8gaHNtYXJ0Y2FyZC0+SW5pdC5CYXVkUmF0ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9TWVNDTEs6CisgICAgICBoc21hcnRjYXJkLT5JbnN0YW5jZS0+QlJSID0gKHVpbnQxNl90KSgoSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKSArIChoc21hcnRjYXJkLT5Jbml0LkJhdWRSYXRlLzJVKSkgLyBoc21hcnRjYXJkLT5Jbml0LkJhdWRSYXRlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU01BUlRDQVJEX0NMT0NLU09VUkNFX0xTRToKKyAgICAgIGhzbWFydGNhcmQtPkluc3RhbmNlLT5CUlIgPSAodWludDE2X3QpKChMU0VfVkFMVUUgKyAoaHNtYXJ0Y2FyZC0+SW5pdC5CYXVkUmF0ZS8yVSkpIC8gaHNtYXJ0Y2FyZC0+SW5pdC5CYXVkUmF0ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9VTkRFRklORUQ6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgU01BUlRDQVJEIGFzc29jaWF0ZWQgVVNBUlQgcGVyaXBoZXJhbCBhZHZhbmNlZCBmZWF0dXJlcy4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU01BUlRDQVJEX0FkdkZlYXR1cmVDb25maWcoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIENoZWNrIHdoZXRoZXIgdGhlIHNldCBvZiBhZHZhbmNlZCBmZWF0dXJlcyB0byBjb25maWd1cmUgaXMgcHJvcGVybHkgc2V0ICovCisgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfQURWRkVBVFVSRV9JTklUKGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCkpOworCisgIC8qIGlmIHJlcXVpcmVkLCBjb25maWd1cmUgVFggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCwgU01BUlRDQVJEX0FEVkZFQVRVUkVfVFhJTlZFUlRfSU5JVCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX0FEVkZFQVRVUkVfVFhJTlYoaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LlR4UGluTGV2ZWxJbnZlcnQpKTsKKyAgICBNT0RJRllfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9UWElOViwgaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LlR4UGluTGV2ZWxJbnZlcnQpOworICB9CisKKyAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBSWCBwaW4gYWN0aXZlIGxldmVsIGludmVyc2lvbiAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0LCBTTUFSVENBUkRfQURWRkVBVFVSRV9SWElOVkVSVF9JTklUKSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfQURWRkVBVFVSRV9SWElOVihoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuUnhQaW5MZXZlbEludmVydCkpOworICAgIE1PRElGWV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX1JYSU5WLCBoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuUnhQaW5MZXZlbEludmVydCk7CisgIH0KKworICAvKiBpZiByZXF1aXJlZCwgY29uZmlndXJlIGRhdGEgaW52ZXJzaW9uICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX0RBVEFJTlZFUlRfSU5JVCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX0FEVkZFQVRVUkVfREFUQUlOVihoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuRGF0YUludmVydCkpOworICAgIE1PRElGWV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0RBVEFJTlYsIGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5EYXRhSW52ZXJ0KTsKKyAgfQorCisgIC8qIGlmIHJlcXVpcmVkLCBjb25maWd1cmUgUlgvVFggcGlucyBzd2FwICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1NXQVBfSU5JVCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX0FEVkZFQVRVUkVfU1dBUChoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuU3dhcCkpOworICAgIE1PRElGWV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX1NXQVAsIGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5Td2FwKTsKKyAgfQorCisgIC8qIGlmIHJlcXVpcmVkLCBjb25maWd1cmUgUlggb3ZlcnJ1biBkZXRlY3Rpb24gZGlzYWJsaW5nICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1JYT1ZFUlJVTkRJU0FCTEVfSU5JVCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX09WRVJSVU4oaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0Lk92ZXJydW5EaXNhYmxlKSk7CisgICAgTU9ESUZZX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfT1ZSRElTLCBoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuT3ZlcnJ1bkRpc2FibGUpOworICB9CisKKyAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBETUEgZGlzYWJsaW5nIG9uIHJlY2VwdGlvbiBlcnJvciAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0LCBTTUFSVENBUkRfQURWRkVBVFVSRV9ETUFESVNBQkxFT05FUlJPUl9JTklUKSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfQURWRkVBVFVSRV9ETUFPTlJYRVJST1IoaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LkRNQURpc2FibGVvblJ4RXJyb3IpKTsKKyAgICBNT0RJRllfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ERFJFLCBoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuRE1BRGlzYWJsZW9uUnhFcnJvcik7CisgIH0KKworICAvKiBpZiByZXF1aXJlZCwgY29uZmlndXJlIE1TQiBmaXJzdCBvbiBjb21tdW5pY2F0aW9uIGxpbmUgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCwgU01BUlRDQVJEX0FEVkZFQVRVUkVfTVNCRklSU1RfSU5JVCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX0FEVkZFQVRVUkVfTVNCRklSU1QoaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0Lk1TQkZpcnN0KSk7CisgICAgTU9ESUZZX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfTVNCRklSU1QsIGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5NU0JGaXJzdCk7CisgIH0KKworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHRoZSBTTUFSVENBUkQgSWRsZSBTdGF0ZS4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNNQVJUQ0FSRF9DaGVja0lkbGVTdGF0ZShTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gMFU7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgU01BUlRDQVJEIEVycm9yQ29kZSAqLworICBoc21hcnRjYXJkLT5FcnJvckNvZGUgPSBIQUxfU01BUlRDQVJEX0VSUk9SX05PTkU7CisKKyAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdtZW50Ki8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBDaGVjayBpZiB0aGUgVHJhbnNtaXR0ZXIgaXMgZW5hYmxlZCAqLworICBpZigoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSAmIFVTQVJUX0NSMV9URSkgPT0gVVNBUlRfQ1IxX1RFKQorICB7CisgICAgLyogV2FpdCB1bnRpbCBURUFDSyBmbGFnIGlzIHNldCAqLworICAgIGlmKFNNQVJUQ0FSRF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhzbWFydGNhcmQsIFVTQVJUX0lTUl9URUFDSywgUkVTRVQsIHRpY2tzdGFydCwgU01BUlRDQVJEX1RFQUNLX1JFQUNLX1RJTUVPVVQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBUaW1lb3V0IG9jY3VycmVkICovCisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICB9CisKKyAgLyogQ2hlY2sgaWYgdGhlIFJlY2VpdmVyIGlzIGVuYWJsZWQgKi8KKyAgaWYoKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEgJiBVU0FSVF9DUjFfUkUpID09IFVTQVJUX0NSMV9SRSkKKyAgeworICAgIC8qIFdhaXQgdW50aWwgUkVBQ0sgZmxhZyBpcyBzZXQgKi8KKyAgICBpZihTTUFSVENBUkRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoc21hcnRjYXJkLCBVU0FSVF9JU1JfUkVBQ0ssIFJFU0VULCB0aWNrc3RhcnQsIFNNQVJUQ0FSRF9URUFDS19SRUFDS19USU1FT1VUKSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogVGltZW91dCBvY2N1cnJlZCAqLworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorCisgIC8qIEluaXRpYWxpemUgdGhlIFNNQVJUQ0FSRCBzdGF0ZXMgKi8KKyAgaHNtYXJ0Y2FyZC0+Z1N0YXRlICA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzbWFydGNhcmQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIFNNQVJUQ0FSRCBDb21tdW5pY2F0aW9uIFRpbWVvdXQuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEBwYXJhbSAgRmxhZyBTcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBmbGFnIHRvIGNoZWNrLgorICAqIEBwYXJhbSAgU3RhdHVzIFRoZSBuZXcgRmxhZyBzdGF0dXMgKFNFVCBvciBSRVNFVCkuCisgICogQHBhcmFtICBUaWNrc3RhcnQgVGljayBzdGFydCB2YWx1ZQorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNNQVJUQ0FSRF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50MzJfdCBGbGFnLCBGbGFnU3RhdHVzIFN0YXR1cywgdWludDMyX3QgVGlja3N0YXJ0LCB1aW50MzJfdCBUaW1lb3V0KQoreworICAvKiBXYWl0IHVudGlsIGZsYWcgaXMgc2V0ICovCisgIHdoaWxlKChfX0hBTF9TTUFSVENBUkRfR0VUX0ZMQUcoaHNtYXJ0Y2FyZCwgRmxhZykgPyBTRVQgOiBSRVNFVCkgPT0gU3RhdHVzKQorICB7CisgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCisgICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmKChUaW1lb3V0ID09IDBVKSB8fCAoKEhBTF9HZXRUaWNrKCktVGlja3N0YXJ0KSA+IFRpbWVvdXQpKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIFRYRSwgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzIGZvciB0aGUgaW50ZXJydXB0IHByb2Nlc3MgKi8KKyAgICAgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFIHwgVVNBUlRfQ1IxX1BFSUUgfCBVU0FSVF9DUjFfVFhFSUUpKTsKKyAgICAgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgICAgIGhzbWFydGNhcmQtPmdTdGF0ZSAgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworICAgICAgICBoc21hcnRjYXJkLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoc21hcnRjYXJkKTsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gSEFMX09LOworfQorCisKKy8qKgorICAqIEBicmllZiAgRW5kIG9uZ29pbmcgVHggdHJhbnNmZXIgb24gU01BUlRDQVJEIHBlcmlwaGVyYWwgKGZvbGxvd2luZyBlcnJvciBkZXRlY3Rpb24gb3IgVHJhbnNtaXQgY29tcGxldGlvbikuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9FbmRUeFRyYW5zZmVyKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBEaXNhYmxlIFRYRUlFLCBUQ0lFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9UWEVJRSB8IFVTQVJUX0NSMV9UQ0lFKSk7CisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAvKiBBdCBlbmQgb2YgVHggcHJvY2VzcywgcmVzdG9yZSBoc21hcnRjYXJkLT5nU3RhdGUgdG8gUmVhZHkgKi8KKyAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIEVuZCBvbmdvaW5nIFJ4IHRyYW5zZmVyIG9uIFVBUlQgcGVyaXBoZXJhbCAoZm9sbG93aW5nIGVycm9yIGRldGVjdGlvbiBvciBSZWNlcHRpb24gY29tcGxldGlvbikuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9FbmRSeFRyYW5zZmVyKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBEaXNhYmxlIFJYTkUsIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpOworICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgLyogQXQgZW5kIG9mIFJ4IHByb2Nlc3MsIHJlc3RvcmUgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICBoc21hcnRjYXJkLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIERNQSBTTUFSVENBUkQgdHJhbnNtaXQgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgUG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRE1BVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiogaHNtYXJ0Y2FyZCA9IChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiopKGhkbWEtPlBhcmVudCk7CisgIGhzbWFydGNhcmQtPlR4WGZlckNvdW50ID0gMFU7CisKKyAgLyogRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0cmFuc21pdCByZXF1ZXN0IGJ5IHJlc2V0dGluZyB0aGUgRE1BVCBiaXQKKyAgaW4gdGhlIFNNQVJUQ0FSRCBhc3NvY2lhdGVkIFVTQVJUIENSMyByZWdpc3RlciAqLworICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgIC8qIEVuYWJsZSB0aGUgU01BUlRDQVJEIFRyYW5zbWl0IENvbXBsZXRlIEludGVycnVwdCAqLworICBfX0hBTF9TTUFSVENBUkRfRU5BQkxFX0lUKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9JVF9UQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFNNQVJUQ0FSRCByZWNlaXZlIHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIFBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU01BUlRDQVJEX0RNQVJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiogaHNtYXJ0Y2FyZCA9IChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiopKGhkbWEtPlBhcmVudCk7CisgIGhzbWFydGNhcmQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgLyogRGlzYWJsZSBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgIC8qIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgdGhlIHJlY2VpdmVyIHJlcXVlc3QgYnkgcmVzZXR0aW5nIHRoZSBETUFSIGJpdAorICAgICBpbiB0aGUgU01BUlRDQVJEIGFzc29jaWF0ZWQgVVNBUlQgQ1IzIHJlZ2lzdGVyICovCisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgLyogQXQgZW5kIG9mIFJ4IHByb2Nlc3MsIHJlc3RvcmUgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICBoc21hcnRjYXJkLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICBIQUxfU01BUlRDQVJEX1J4Q3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBTTUFSVENBUkQgY29tbXVuaWNhdGlvbiBlcnJvciBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgUG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmKiBoc21hcnRjYXJkID0gKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmKikoaGRtYS0+UGFyZW50KTsKKworICAvKiBTdG9wIFNNQVJUQ0FSRCBETUEgVHggcmVxdWVzdCBpZiBvbmdvaW5nICovCisgIGlmICggIChoc21hcnRjYXJkLT5nU3RhdGUgPT0gSEFMX1NNQVJUQ0FSRF9TVEFURV9CVVNZX1RYKQorICAgICAgJiYoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKSApCisgIHsKKyAgICBoc21hcnRjYXJkLT5UeFhmZXJDb3VudCA9IDBVOworICAgIFNNQVJUQ0FSRF9FbmRUeFRyYW5zZmVyKGhzbWFydGNhcmQpOworICB9CisKKyAgLyogU3RvcCBTTUFSVENBUkQgRE1BIFJ4IHJlcXVlc3QgaWYgb25nb2luZyAqLworICBpZiAoICAoaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1lfUlgpCisgICAgICAmJihIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpICkKKyAgeworICAgIGhzbWFydGNhcmQtPlJ4WGZlckNvdW50ID0gMFU7CisgICAgU01BUlRDQVJEX0VuZFJ4VHJhbnNmZXIoaHNtYXJ0Y2FyZCk7CisgIH0KKworICBoc21hcnRjYXJkLT5FcnJvckNvZGUgfD0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9ETUE7CisgIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjayhoc21hcnRjYXJkKTsKK30KKworLyoqCisgICogQGJyaWVmICBETUEgU01BUlRDQVJEIGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IEhBTCBzZXJ2aWNlcyBvbiBFcnJvcgorICAqICAgICAgICAgKFRvIGJlIGNhbGxlZCBhdCBlbmQgb2YgRE1BIEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJyZW5jZSkuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRE1BQWJvcnRPbkVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiogaHNtYXJ0Y2FyZCA9IChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiopKGhkbWEtPlBhcmVudCk7CisgIGhzbWFydGNhcmQtPlJ4WGZlckNvdW50ID0gMFU7CisgIGhzbWFydGNhcmQtPlR4WGZlckNvdW50ID0gMFU7CisKKyAgSEFMX1NNQVJUQ0FSRF9FcnJvckNhbGxiYWNrKGhzbWFydGNhcmQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBTTUFSVENBUkQgVHggY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgdXNlcgorICAqICAgICAgICAgKFRvIGJlIGNhbGxlZCBhdCBlbmQgb2YgRE1BIFR4IEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgdXNlciBhYm9ydCByZXF1ZXN0KS4KKyAgKiBAbm90ZSAgIFdoZW4gdGhpcyBjYWxsYmFjayBpcyBleGVjdXRlZCwgVXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsIGJhY2sgaXMgY2FsbGVkIG9ubHkgaWYgbm8KKyAgKiAgICAgICAgIEFib3J0IHN0aWxsIG9uZ29pbmcgZm9yIFJ4IERNQSBIYW5kbGUuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRE1BVHhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiogaHNtYXJ0Y2FyZCA9IChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiogKShoZG1hLT5QYXJlbnQpOworICAKKyAgaHNtYXJ0Y2FyZC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgLyogQ2hlY2sgaWYgYW4gQWJvcnQgcHJvY2VzcyBpcyBzdGlsbCBvbmdvaW5nICovCisgIGlmKGhzbWFydGNhcmQtPmhkbWFyeCAhPSBOVUxMKQorICB7CisgICAgaWYoaHNtYXJ0Y2FyZC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayAhPSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgCisgIC8qIE5vIEFib3J0IHByb2Nlc3Mgc3RpbGwgb25nb2luZyA6IEFsbCBETUEgY2hhbm5lbHMgYXJlIGFib3J0ZWQsIGNhbGwgdXNlciBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayAqLworICBoc21hcnRjYXJkLT5UeFhmZXJDb3VudCA9IDBVOworICBoc21hcnRjYXJkLT5SeFhmZXJDb3VudCA9IDBVOworCisgIC8qIFJlc2V0IGVycm9yQ29kZSAqLworICBoc21hcnRjYXJkLT5FcnJvckNvZGUgPSBIQUxfU01BUlRDQVJEX0VSUk9SX05PTkU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX0NMRUFSX09SRUYgfCBTTUFSVENBUkRfQ0xFQVJfTkVGIHwgU01BUlRDQVJEX0NMRUFSX1BFRiB8IFNNQVJUQ0FSRF9DTEVBUl9GRUYgfCBTTUFSVENBUkRfQ0xFQVJfUlRPRiB8IFNNQVJUQ0FSRF9DTEVBUl9FT0JGKTsKKworICAvKiBSZXN0b3JlIGhzbWFydGNhcmQtPmdTdGF0ZSBhbmQgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICBoc21hcnRjYXJkLT5nU3RhdGUgID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKyAgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisKKyAgLyogQ2FsbCB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisgIEhBTF9TTUFSVENBUkRfQWJvcnRDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBETUEgU01BUlRDQVJEIFJ4IGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IHVzZXIKKyAgKiAgICAgICAgIChUbyBiZSBjYWxsZWQgYXQgZW5kIG9mIERNQSBSeCBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIHVzZXIgYWJvcnQgcmVxdWVzdCkuCisgICogQG5vdGUgICBXaGVuIHRoaXMgY2FsbGJhY2sgaXMgZXhlY3V0ZWQsIFVzZXIgQWJvcnQgY29tcGxldGUgY2FsbCBiYWNrIGlzIGNhbGxlZCBvbmx5IGlmIG5vCisgICogICAgICAgICBBYm9ydCBzdGlsbCBvbmdvaW5nIGZvciBUeCBETUEgSGFuZGxlLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU01BUlRDQVJEX0RNQVJ4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYqIGhzbWFydGNhcmQgPSAoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYqICkoaGRtYS0+UGFyZW50KTsKKyAgCisgIGhzbWFydGNhcmQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgIC8qIENoZWNrIGlmIGFuIEFib3J0IHByb2Nlc3MgaXMgc3RpbGwgb25nb2luZyAqLworICBpZihoc21hcnRjYXJkLT5oZG1hdHggIT0gTlVMTCkKKyAgeworICAgIGlmKGhzbWFydGNhcmQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIAorICAvKiBObyBBYm9ydCBwcm9jZXNzIHN0aWxsIG9uZ29pbmcgOiBBbGwgRE1BIGNoYW5uZWxzIGFyZSBhYm9ydGVkLCBjYWxsIHVzZXIgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaHNtYXJ0Y2FyZC0+VHhYZmVyQ291bnQgPSAwVTsKKyAgaHNtYXJ0Y2FyZC0+UnhYZmVyQ291bnQgPSAwVTsKKworICAvKiBSZXNldCBlcnJvckNvZGUgKi8KKyAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlID0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9OT05FOworCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9PUkVGIHwgU01BUlRDQVJEX0NMRUFSX05FRiB8IFNNQVJUQ0FSRF9DTEVBUl9QRUYgfCBTTUFSVENBUkRfQ0xFQVJfRkVGIHwgU01BUlRDQVJEX0NMRUFSX1JUT0YgfCBTTUFSVENBUkRfQ0xFQVJfRU9CRik7CisKKyAgLyogUmVzdG9yZSBoc21hcnRjYXJkLT5nU3RhdGUgYW5kIGhzbWFydGNhcmQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaHNtYXJ0Y2FyZC0+Z1N0YXRlICA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgIC8qIENhbGwgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBIQUxfU01BUlRDQVJEX0Fib3J0Q3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworfQorCisKKy8qKgorICAqIEBicmllZiAgRE1BIFNNQVJUQ0FSRCBUeCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSB1c2VyIGJ5IGEgY2FsbCB0bworICAqICAgICAgICAgSEFMX1NNQVJUQ0FSRF9BYm9ydFRyYW5zbWl0X0lUIEFQSSAoQWJvcnQgb25seSBUeCB0cmFuc2ZlcikKKyAgKiAgICAgICAgIChUaGlzIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIGF0IGVuZCBvZiBETUEgVHggQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyB1c2VyIGFib3J0IHJlcXVlc3QsCisgICogICAgICAgICBhbmQgbGVhZHMgdG8gdXNlciBUeCBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayBleGVjdXRpb24pLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU01BUlRDQVJEX0RNQVR4T25seUFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmKiBoc21hcnRjYXJkID0gKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmKikoaGRtYS0+UGFyZW50KTsKKworICBoc21hcnRjYXJkLT5UeFhmZXJDb3VudCA9IDBVOworCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9GRUYpOworCisgIC8qIFJlc3RvcmUgaHNtYXJ0Y2FyZC0+Z1N0YXRlIHRvIFJlYWR5ICovCisgIGhzbWFydGNhcmQtPmdTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisKKyAgLyogQ2FsbCB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisgIEhBTF9TTUFSVENBUkRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhoc21hcnRjYXJkKTsKK30KKworLyoqCisgICogQGJyaWVmICBETUEgU01BUlRDQVJEIFJ4IGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IHVzZXIgYnkgYSBjYWxsIHRvCisgICogICAgICAgICBIQUxfU01BUlRDQVJEX0Fib3J0UmVjZWl2ZV9JVCBBUEkgKEFib3J0IG9ubHkgUnggdHJhbnNmZXIpCisgICogICAgICAgICAoVGhpcyBjYWxsYmFjayBpcyBleGVjdXRlZCBhdCBlbmQgb2YgRE1BIFJ4IEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgdXNlciBhYm9ydCByZXF1ZXN0LAorICAqICAgICAgICAgYW5kIGxlYWRzIHRvIHVzZXIgUnggQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgZXhlY3V0aW9uKS4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9ETUFSeE9ubHlBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiogaHNtYXJ0Y2FyZCA9ICggU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYqICkoaGRtYS0+UGFyZW50KTsKKworICBoc21hcnRjYXJkLT5SeFhmZXJDb3VudCA9IDBVOworCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9PUkVGIHwgU01BUlRDQVJEX0NMRUFSX05FRiB8IFNNQVJUQ0FSRF9DTEVBUl9QRUYgfCBTTUFSVENBUkRfQ0xFQVJfRkVGIHwgU01BUlRDQVJEX0NMRUFSX1JUT0YgfCBTTUFSVENBUkRfQ0xFQVJfRU9CRik7CisKKyAgLyogUmVzdG9yZSBoc21hcnRjYXJkLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgIC8qIENhbGwgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBIQUxfU01BUlRDQVJEX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhoc21hcnRjYXJkKTsKK30KKworLyoqCisgICogQGJyaWVmIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiAgICAgICAgIEZ1bmN0aW9uIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZQorICAqICAgICAgICAgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfU01BUlRDQVJEX1RyYW5zbWl0X0lUKCkKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTTUFSVENBUkRfVHJhbnNtaXRfSVQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG9uZ29pbmcgKi8KKyAgaWYgKGhzbWFydGNhcmQtPmdTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1lfVFgpCisgIHsKKyAgICBpZihoc21hcnRjYXJkLT5UeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBFbXB0eSBJbnRlcnJ1cHQgKi8KKyAgICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVFhFSUUpOworCisgICAgICAvKiBFbmFibGUgdGhlIFNNQVJUQ0FSRCBUcmFuc21pdCBDb21wbGV0ZSBJbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1NNQVJUQ0FSRF9FTkFCTEVfSVQoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX0lUX1RDKTsKKworICAgICAgcmV0dXJuIEhBTF9PSzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhzbWFydGNhcmQtPkluc3RhbmNlLT5URFIgPSAoKmhzbWFydGNhcmQtPnBUeEJ1ZmZQdHIrKyAmICh1aW50OF90KTB4RkZVKTsKKyAgICAgIGhzbWFydGNhcmQtPlR4WGZlckNvdW50LS07CisKKyAgICAgIHJldHVybiBIQUxfT0s7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFdyYXAgdXAgdHJhbnNtaXNzaW9uIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTTUFSVENBUkRfRW5kVHJhbnNtaXRfSVQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIERpc2FibGUgdGhlIFNNQVJUQ0FSRCBUcmFuc21pdCBDb21wbGV0ZSBJbnRlcnJ1cHQgKi8KKyAgX19IQUxfU01BUlRDQVJEX0RJU0FCTEVfSVQoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX0lUX1RDKTsKKworICAvKiBDaGVjayBpZiBhIHJlY2VpdmUgcHJvY2VzcyBpcyBvbmdvaW5nIG9yIG5vdC4gSWYgbm90IGRpc2FibGUgRVJSIElUICovCisgIGlmKGhzbWFydGNhcmQtPlJ4U3RhdGUgPT0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIERpc2FibGUgdGhlIFNNQVJUQ0FSRCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvcikgKi8KKyAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisgIH0KKworICAvKiBSZS1lbmFibGUgUnggYXQgZW5kIG9mIHRyYW5zbWlzc2lvbiBpZiBpbml0aWFsIG1vZGUgaXMgUngvVHggKi8KKyAgaWYoaHNtYXJ0Y2FyZC0+SW5pdC5Nb2RlID09IFNNQVJUQ0FSRF9NT0RFX1RYX1JYKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCBmaXJzdCB0byB1cGRhdGUgbW9kZXMgKi8KKyAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1VFKTsKKyAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9SRSk7CisgICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVUUpOworICB9CisgIAorICAvKiBUeCBwcm9jZXNzIGlzIGVuZGVkLCByZXN0b3JlIGhzbWFydGNhcmQtPmdTdGF0ZSB0byBSZWFkeSAqLworICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgIEhBTF9TTUFSVENBUkRfVHhDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiAgICAgICAgIEZ1bmN0aW9uIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZQorICAqICAgICAgICAgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfU01BUlRDQVJEX1JlY2VpdmVfSVQoKS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTTUFSVENBUkRfUmVjZWl2ZV9JVChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgb25nb2luZyAqLworICBpZiAoaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1lfUlgpCisgIHsKKyAgICAqaHNtYXJ0Y2FyZC0+cFJ4QnVmZlB0cisrID0gKHVpbnQ4X3QpKGhzbWFydGNhcmQtPkluc3RhbmNlLT5SRFIgJiAodWludDhfdCkweEZGKTsKKworICAgIGlmKC0taHNtYXJ0Y2FyZC0+UnhYZmVyQ291bnQgPT0gMFUpCisgICAgeworICAgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9SWE5FSUUpOworCisgICAgICAvKiBDaGVjayBpZiBhIHRyYW5zbWl0IHByb2Nlc3MgaXMgb25nb2luZyBvciBub3QuIElmIG5vdCBkaXNhYmxlIEVSUiBJVCAqLworICAgICAgaWYoaHNtYXJ0Y2FyZC0+Z1N0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFkpCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIFNNQVJUQ0FSRCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpICovCisgICAgICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKyAgICAgIH0KKworICAgICAgLyogRGlzYWJsZSB0aGUgU01BUlRDQVJEIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQgKi8KKyAgICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisKKyAgICAgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgICAgICBIQUxfU01BUlRDQVJEX1J4Q3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworCisgICAgICByZXR1cm4gSEFMX09LOworICAgIH0KKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2xlYXIgUlhORSBpbnRlcnJ1cHQgZmxhZyAqLworICAgIF9fSEFMX1NNQVJUQ0FSRF9TRU5EX1JFUShoc21hcnRjYXJkLCBTTUFSVENBUkRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOworCisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfU01BUlRDQVJEX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjN4eF9oYWxfc21hcnRjYXJkX2V4LmMgYi9TcmMvc3RtMzJmM3h4X2hhbF9zbWFydGNhcmRfZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjYzNDE5Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZjN4eF9oYWxfc21hcnRjYXJkX2V4LmMKQEAgLTAsMCArMSwyMDYgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX3NtYXJ0Y2FyZF9leC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBTTUFSVENBUkQgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGV4dGVuZGVkIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgU21hcnRDYXJkLgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICoKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICMjIyMjIFNNQVJUQ0FSRCBwZXJpcGhlcmFsIGV4dGVuZGVkIGZlYXR1cmVzICAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgIFRoZSBFeHRlbmRlZCBTTUFSVENBUkQgSEFMIGRyaXZlciBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOgorCisgICAgKCMpIEFmdGVyIGhhdmluZyBjb25maWd1cmVkIHRoZSBTTUFSVENBUkQgYmFzaWMgZmVhdHVyZXMgd2l0aCBIQUxfU01BUlRDQVJEX0luaXQoKSwKKyAgICAgICAgdGhlbiBwcm9ncmFtIFNNQVJUQ0FSRCBhZHZhbmNlZCBmZWF0dXJlcyBpZiByZXF1aXJlZCAoVFgvUlggcGlucyBzd2FwLCBUaW1lT3V0LAorICAgICAgICBhdXRvLXJldHJ5IGNvdW50ZXIsLi4uKSBpbiB0aGUgaHNtYXJ0Y2FyZCBBZHZhbmNlZEluaXQgc3RydWN0dXJlLgorCisKKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSREV4IFNNQVJUQ0FSREV4CisgICogQGJyaWVmIFNNQVJUQ0FSRCBFeHRlbnNpb24gSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworI2lmZGVmIEhBTF9TTUFSVENBUkRfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSREV4X0V4cG9ydGVkX0Z1bmN0aW9ucyAgU01BUlRDQVJEIEV4dGVuZGVkIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJERXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogQGJyaWVmICAgIEV4dGVuZGVkIGNvbnRyb2wgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIHRoZSBTTUFSVENBUkQuCisgICAgICgrKSBIQUxfU01BUlRDQVJERXhfQmxvY2tMZW5ndGhfQ29uZmlnKCkgQVBJIGFsbG93cyB0byBjb25maWd1cmUgdGhlIEJsb2NrIExlbmd0aCBvbiB0aGUgZmx5CisgICAgICgrKSBIQUxfU01BUlRDQVJERXhfVGltZU91dF9Db25maWcoKSBBUEkgYWxsb3dzIHRvIGNvbmZpZ3VyZSB0aGUgcmVjZWl2ZXIgdGltZW91dCB2YWx1ZSBvbiB0aGUgZmx5CisgICAgICgrKSBIQUxfU01BUlRDQVJERXhfRW5hYmxlUmVjZWl2ZXJUaW1lT3V0KCkgQVBJIGVuYWJsZXMgdGhlIHJlY2VpdmVyIHRpbWVvdXQgZmVhdHVyZQorICAgICAoKykgSEFMX1NNQVJUQ0FSREV4X0Rpc2FibGVSZWNlaXZlclRpbWVPdXQoKSBBUEkgZGlzYWJsZXMgdGhlIHJlY2VpdmVyIHRpbWVvdXQgZmVhdHVyZQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgVXBkYXRlIG9uIHRoZSBmbHkgdGhlIFNNQVJUQ0FSRCBibG9jayBsZW5ndGggaW4gUlRPUiByZWdpc3Rlci4KKyAgKiBAcGFyYW0gaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcGFyYW0gQmxvY2tMZW5ndGggU01BUlRDQVJEIGJsb2NrIGxlbmd0aCAoOC1iaXQgbG9uZyBhdCBtb3N0KQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfU01BUlRDQVJERXhfQmxvY2tMZW5ndGhfQ29uZmlnKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90IEJsb2NrTGVuZ3RoKQoreworICBNT0RJRllfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5SVE9SLCBVU0FSVF9SVE9SX0JMRU4sICgodWludDMyX3QpQmxvY2tMZW5ndGggPDwgU01BUlRDQVJEX1JUT1JfQkxFTl9MU0JfUE9TKSk7Cit9CisKKy8qKgorICAqIEBicmllZiBVcGRhdGUgb24gdGhlIGZseSB0aGUgcmVjZWl2ZXIgdGltZW91dCB2YWx1ZSBpbiBSVE9SIHJlZ2lzdGVyLgorICAqIEBwYXJhbSBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEBwYXJhbSBUaW1lT3V0VmFsdWUgcmVjZWl2ZXIgdGltZW91dCB2YWx1ZSBpbiBudW1iZXIgb2YgYmF1ZCBibG9ja3MuIFRoZSB0aW1lb3V0CisgICogICAgICAgICAgICAgICAgICAgICB2YWx1ZSBtdXN0IGJlIGxlc3Mgb3IgZXF1YWwgdG8gMHgwRkZGRkZGRkYuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9TTUFSVENBUkRFeF9UaW1lT3V0X0NvbmZpZyhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgdWludDMyX3QgVGltZU91dFZhbHVlKQoreworICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX1RJTUVPVVRfVkFMVUUoaHNtYXJ0Y2FyZC0+SW5pdC5UaW1lT3V0VmFsdWUpKTsKKyAgTU9ESUZZX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+UlRPUiwgVVNBUlRfUlRPUl9SVE8sIFRpbWVPdXRWYWx1ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiBFbmFibGUgdGhlIFNNQVJUQ0FSRCByZWNlaXZlciB0aW1lb3V0IGZlYXR1cmUuCisgICogQHBhcmFtIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJERXhfRW5hYmxlUmVjZWl2ZXJUaW1lT3V0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworCisgIGlmKGhzbWFydGNhcmQtPmdTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhzbWFydGNhcmQpOworCisgICAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9CVVNZOworCisgICAgLyogU2V0IHRoZSBVU0FSVCBSVE9FTiBiaXQgKi8KKyAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9SVE9FTik7CisKKyAgICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoc21hcnRjYXJkKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgcmVjZWl2ZXIgdGltZW91dCBmZWF0dXJlLgorICAqIEBwYXJhbSBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSREV4X0Rpc2FibGVSZWNlaXZlclRpbWVPdXQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisKKyAgaWYoaHNtYXJ0Y2FyZC0+Z1N0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1k7CisKKyAgICAvKiBDbGVhciB0aGUgVVNBUlQgUlRPRU4gYml0ICovCisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9SVE9FTik7CisKKyAgICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoc21hcnRjYXJkKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfU01BUlRDQVJEX01PRFVMRV9FTkFCTEVEICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmM3h4X2hhbF9zbWJ1cy5jIGIvU3JjL3N0bTMyZjN4eF9oYWxfc21idXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODAzMTgzCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZjN4eF9oYWxfc21idXMuYwpAQCAtMCwwICsxLDIxNjEgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX3NtYnVzLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFNNQlVTIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFN5c3RlbSBNYW5hZ2VtZW50IEJ1cyAoU01CdXMpIHBlcmlwaGVyYWwsCisgICogICAgICAgICAgYmFzZWQgb24gSTJDIHByaW5jaXBsZXMgb2Ygb3BlcmF0aW9uIDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGUgU01CVVMgSEFMIGRyaXZlciBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOgorCisgICAgKCMpIERlY2xhcmUgYSBTTUJVU19IYW5kbGVUeXBlRGVmIGhhbmRsZSBzdHJ1Y3R1cmUsIGZvciBleGFtcGxlOgorICAgICAgICBTTUJVU19IYW5kbGVUeXBlRGVmICBoc21idXM7CisKKyAgICAoIylJbml0aWFsaXplIHRoZSBTTUJVUyBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudGluZyB0aGUgSEFMX1NNQlVTX01zcEluaXQoKSBBUEk6CisgICAgICAgICgjIykgRW5hYmxlIHRoZSBTTUJVU3ggaW50ZXJmYWNlIGNsb2NrCisgICAgICAgICgjIykgU01CVVMgcGlucyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgU01CVVMgR1BJT3MKKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSBTTUJVUyBwaW5zIGFzIGFsdGVybmF0ZSBmdW5jdGlvbiBvcGVuLWRyYWluCisgICAgICAgICgjIykgTlZJQyBjb25maWd1cmF0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBpbnRlcnJ1cHQgcHJvY2VzcworICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBTTUJVU3ggaW50ZXJydXB0IHByaW9yaXR5CisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIE5WSUMgU01CVVMgSVJRIENoYW5uZWwKKworICAgICgjKSBDb25maWd1cmUgdGhlIENvbW11bmljYXRpb24gQ2xvY2sgVGltaW5nLCBCdXMgVGltZW91dCwgT3duIEFkZHJlc3MxLCBNYXN0ZXIgQWRkcmVzc2luZyBtb2RlLAorICAgICAgICBEdWFsIEFkZHJlc3NpbmcgbW9kZSwgT3duIEFkZHJlc3MyLCBPd24gQWRkcmVzczIgTWFzaywgR2VuZXJhbCBjYWxsLCBOb3N0cmV0Y2ggbW9kZSwKKyAgICAgICAgUGVyaXBoZXJhbCBtb2RlIGFuZCBQYWNrZXQgRXJyb3IgQ2hlY2sgbW9kZSBpbiB0aGUgaHNtYnVzIEluaXQgc3RydWN0dXJlLgorCisgICAgKCMpIEluaXRpYWxpemUgdGhlIFNNQlVTIHJlZ2lzdGVycyBieSBjYWxsaW5nIHRoZSBIQUxfU01CVVNfSW5pdCgpIEFQSToKKyAgICAgICAgKCsrKSBUaGVzZSBBUEkncyBjb25maWd1cmVzIGFsc28gdGhlIGxvdyBsZXZlbCBIYXJkd2FyZSBHUElPLCBDTE9DSywgQ09SVEVYLi4uZXRjKQorICAgICAgICAgICAgIGJ5IGNhbGxpbmcgdGhlIGN1c3RvbWl6ZWQgSEFMX1NNQlVTX01zcEluaXQoJmhzbWJ1cykgQVBJLgorCisgICAgKCMpIFRvIGNoZWNrIGlmIHRhcmdldCBkZXZpY2UgaXMgcmVhZHkgZm9yIGNvbW11bmljYXRpb24sIHVzZSB0aGUgZnVuY3Rpb24gSEFMX1NNQlVTX0lzRGV2aWNlUmVhZHkoKQorCisgICAgKCMpIEZvciBTTUJVUyBJTyBvcGVyYXRpb25zLCBvbmx5IG9uZSBtb2RlIG9mIG9wZXJhdGlvbnMgaXMgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIGRyaXZlcgorCisgICAgKioqIEludGVycnVwdCBtb2RlIElPIG9wZXJhdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgrKSBUcmFuc21pdCBpbiBtYXN0ZXIvaG9zdCBTTUJVUyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHVzaW5nIEhBTF9TTUJVU19NYXN0ZXJfVHJhbnNtaXRfSVQoKQorICAgICAgKCsrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyIEhBTF9TTUJVU19NYXN0ZXJUeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfU01CVVNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soKQorICAgICAgKCspIFJlY2VpdmUgaW4gbWFzdGVyL2hvc3QgU01CVVMgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfU01CVVNfTWFzdGVyX1JlY2VpdmVfSVQoKQorICAgICAgKCsrKSBBdCByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyIEhBTF9TTUJVU19NYXN0ZXJSeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfU01CVVNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soKQorICAgICAgKCspIEFib3J0IGEgbWFzdGVyL2hvc3QgU01CVVMgcHJvY2VzcyBjb21tdW5pY2F0aW9uIHdpdGggSW50ZXJydXB0IHVzaW5nIEhBTF9TTUJVU19NYXN0ZXJfQWJvcnRfSVQoKQorICAgICAgKCsrKSBUaGUgYXNzb2NpYXRlZCBwcmV2aW91cyB0cmFuc2ZlciBjYWxsYmFjayBpcyBjYWxsZWQgYXQgdGhlIGVuZCBvZiBhYm9ydCBwcm9jZXNzCisgICAgICAoKyspIG1lYW4gSEFMX1NNQlVTX01hc3RlclR4Q3BsdENhbGxiYWNrKCkgaW4gY2FzZSBvZiBwcmV2aW91cyBzdGF0ZSB3YXMgbWFzdGVyIHRyYW5zbWl0CisgICAgICAoKyspIG1lYW4gSEFMX1NNQlVTX01hc3RlclJ4Q3BsdENhbGxiYWNrKCkgaW4gY2FzZSBvZiBwcmV2aW91cyBzdGF0ZSB3YXMgbWFzdGVyIHJlY2VpdmUKKyAgICAgICgrKSBFbmFibGUvZGlzYWJsZSB0aGUgQWRkcmVzcyBsaXN0ZW4gbW9kZSBpbiBzbGF2ZS9kZXZpY2Ugb3IgaG9zdC9zbGF2ZSBTTUJVUyBtb2RlCisgICAgICAgICAgIHVzaW5nIEhBTF9TTUJVU19FbmFibGVMaXN0ZW5fSVQoKSBIQUxfU01CVVNfRGlzYWJsZUxpc3Rlbl9JVCgpCisgICAgICAoKyspIFdoZW4gYWRkcmVzcyBzbGF2ZS9kZXZpY2UgU01CVVMgbWF0Y2gsIEhBTF9TTUJVU19BZGRyQ2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSB0byBjaGVjayB0aGUgQWRkcmVzcyBNYXRjaCBDb2RlIGFuZCB0aGUgdHJhbnNtaXNzaW9uIGRpcmVjdGlvbiByZXF1ZXN0IGJ5IG1hc3Rlci9ob3N0IChXcml0ZS9SZWFkKS4KKyAgICAgICgrKykgQXQgTGlzdGVuIG1vZGUgZW5kIEhBTF9TTUJVU19MaXN0ZW5DcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX1NNQlVTX0xpc3RlbkNwbHRDYWxsYmFjaygpCisgICAgICAoKykgVHJhbnNtaXQgaW4gc2xhdmUvZGV2aWNlIFNNQlVTIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX1NNQlVTX1NsYXZlX1RyYW5zbWl0X0lUKCkKKyAgICAgICgrKykgQXQgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2ZlciBIQUxfU01CVVNfU2xhdmVUeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfU01CVVNfU2xhdmVUeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgUmVjZWl2ZSBpbiBzbGF2ZS9kZXZpY2UgU01CVVMgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfU01CVVNfU2xhdmVfUmVjZWl2ZV9JVCgpCisgICAgICAoKyspIEF0IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIgSEFMX1NNQlVTX1NsYXZlUnhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX1NNQlVTX1NsYXZlUnhDcGx0Q2FsbGJhY2soKQorICAgICAgKCspIEVuYWJsZS9EaXNhYmxlIHRoZSBTTUJVUyBhbGVydCBtb2RlIHVzaW5nIEhBTF9TTUJVU19FbmFibGVBbGVydF9JVCgpIEhBTF9TTUJVU19EaXNhYmxlQWxlcnRfSVQoKQorICAgICAgKCsrKSBXaGVuIFNNQlVTIEFsZXJ0IGlzIGdlbmVyYXRlZCBIQUxfU01CVVNfRXJyb3JDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfU01CVVNfRXJyb3JDYWxsYmFjaygpCisgICAgICAgICAgIHRvIGNoZWNrIHRoZSBBbGVydCBFcnJvciBDb2RlIHVzaW5nIGZ1bmN0aW9uIEhBTF9TTUJVU19HZXRFcnJvcigpCisgICAgICAoKykgR2V0IEhBTCBzdGF0ZSBtYWNoaW5lIG9yIGVycm9yIHZhbHVlcyB1c2luZyBIQUxfU01CVVNfR2V0U3RhdGUoKSBvciBIQUxfU01CVVNfR2V0RXJyb3IoKQorICAgICAgKCspIEluIGNhc2Ugb2YgdHJhbnNmZXIgRXJyb3IsIEhBTF9TTUJVU19FcnJvckNhbGxiYWNrKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9TTUJVU19FcnJvckNhbGxiYWNrKCkKKyAgICAgICAgICAgdG8gY2hlY2sgdGhlIEVycm9yIENvZGUgdXNpbmcgZnVuY3Rpb24gSEFMX1NNQlVTX0dldEVycm9yKCkKKworICAgICAqKiogU01CVVMgSEFMIGRyaXZlciBtYWNyb3MgbGlzdCAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisgICAgICAgQmVsb3cgdGhlIGxpc3Qgb2YgbW9zdCB1c2VkIG1hY3JvcyBpbiBTTUJVUyBIQUwgZHJpdmVyLgorCisgICAgICAoKykgX19IQUxfU01CVVNfRU5BQkxFOiAgICAgIEVuYWJsZSB0aGUgU01CVVMgcGVyaXBoZXJhbAorICAgICAgKCspIF9fSEFMX1NNQlVTX0RJU0FCTEU6ICAgICBEaXNhYmxlIHRoZSBTTUJVUyBwZXJpcGhlcmFsCisgICAgICAoKykgX19IQUxfU01CVVNfR0VUX0ZMQUc6ICAgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTTUJVUyBmbGFnIGlzIHNldCBvciBub3QKKyAgICAgICgrKSBfX0hBTF9TTUJVU19DTEVBUl9GTEFHOiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBTTUJVUyBwZW5kaW5nIGZsYWcKKyAgICAgICgrKSBfX0hBTF9TTUJVU19FTkFCTEVfSVQ6ICAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgU01CVVMgaW50ZXJydXB0CisgICAgICAoKykgX19IQUxfU01CVVNfRElTQUJMRV9JVDogIERpc2FibGUgdGhlIHNwZWNpZmllZCBTTUJVUyBpbnRlcnJ1cHQKKworICAgICBbLi5dCisgICAgICAgKEApIFlvdSBjYW4gcmVmZXIgdG8gdGhlIFNNQlVTIEhBTCBkcml2ZXIgaGVhZGVyIGZpbGUgZm9yIG1vcmUgdXNlZnVsIG1hY3JvcworCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUJVUyBTTUJVUworICAqIEBicmllZiBTTUJVUyBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfU01CVVNfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNNQlVTX1ByaXZhdGVfRGVmaW5lIFNNQlVTIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNSU5HX0NMRUFSX01BU0sgICAoMHhGMEZGRkZGRlUpICAgICAgLyohPCBTTUJVUyBUSU1JTkcgY2xlYXIgcmVnaXN0ZXIgTWFzayAqLworI2RlZmluZSBIQUxfVElNRU9VVF9BRERSICAgICgxMDAwMFUpICAgICAgICAgICAvKiE8IDEwIHMgICovCisjZGVmaW5lIEhBTF9USU1FT1VUX0JVU1kgICAgKDI1VSkgICAgICAgICAgICAgIC8qITwgMjUgbXMgKi8KKyNkZWZpbmUgSEFMX1RJTUVPVVRfRElSICAgICAoMjVVKSAgICAgICAgICAgICAgLyohPCAyNSBtcyAqLworI2RlZmluZSBIQUxfVElNRU9VVF9SWE5FICAgICgyNVUpICAgICAgICAgICAgICAvKiE8IDI1IG1zICovCisjZGVmaW5lIEhBTF9USU1FT1VUX1NUT1BGICAgKDI1VSkgICAgICAgICAgICAgIC8qITwgMjUgbXMgKi8KKyNkZWZpbmUgSEFMX1RJTUVPVVRfVEMgICAgICAoMjVVKSAgICAgICAgICAgICAgLyohPCAyNSBtcyAqLworI2RlZmluZSBIQUxfVElNRU9VVF9UQ1IgICAgICgyNVUpICAgICAgICAgICAgICAvKiE8IDI1IG1zICovCisjZGVmaW5lIEhBTF9USU1FT1VUX1RYSVMgICAgKDI1VSkgICAgICAgICAgICAgIC8qITwgMjUgbXMgKi8KKyNkZWZpbmUgTUFYX05CWVRFX1NJWkUgICAgICAyNTVVCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgU01CVVNfUHJpdmF0ZV9GdW5jdGlvbnMgU01CVVMgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNNQlVTX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50MzJfdCBGbGFnLCBGbGFnU3RhdHVzIFN0YXR1cywgdWludDMyX3QgVGltZW91dCk7CisKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTTUJVU19FbmFibGVfSVJRKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDE2X3QgSW50ZXJydXB0UmVxdWVzdCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU01CVVNfRGlzYWJsZV9JUlEoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50MTZfdCBJbnRlcnJ1cHRSZXF1ZXN0KTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTTUJVU19NYXN0ZXJfSVNSKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cyk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU01CVVNfU2xhdmVfSVNSKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cyk7CisKK3N0YXRpYyB2b2lkIFNNQlVTX0NvbnZlcnRPdGhlclhmZXJPcHRpb25zKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cyk7CisKK3N0YXRpYyB2b2lkIFNNQlVTX0lURXJyb3JIYW5kbGVyKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cyk7CisKK3N0YXRpYyB2b2lkIFNNQlVTX1RyYW5zZmVyQ29uZmlnKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgU2l6ZSwgdWludDMyX3QgTW9kZSwgdWludDMyX3QgUmVxdWVzdCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFNNQlVTX0V4cG9ydGVkX0Z1bmN0aW9ucyBTTUJVUyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFNNQlVTX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIGFuZAorICAgICAgICAgIGRlaW5pdGlhbGl6ZSB0aGUgU01CVVN4IHBlcmlwaGVyYWw6CisKKyAgICAgICgrKSBVc2VyIG11c3QgSW1wbGVtZW50IEhBTF9TTUJVU19Nc3BJbml0KCkgZnVuY3Rpb24gaW4gd2hpY2ggaGUgY29uZmlndXJlcworICAgICAgICAgIGFsbCByZWxhdGVkIHBlcmlwaGVyYWxzIHJlc291cmNlcyAoQ0xPQ0ssIEdQSU8sIElUIGFuZCBOVklDICkuCisKKyAgICAgICgrKSBDYWxsIHRoZSBmdW5jdGlvbiBIQUxfU01CVVNfSW5pdCgpIHRvIGNvbmZpZ3VyZSB0aGUgc2VsZWN0ZWQgZGV2aWNlIHdpdGgKKyAgICAgICAgICB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbjoKKyAgICAgICAgKCsrKSBDbG9jayBUaW1pbmcKKyAgICAgICAgKCsrKSBCdXMgVGltZW91dAorICAgICAgICAoKyspIEFuYWxvZyBGaWxlciBtb2RlCisgICAgICAgICgrKykgT3duIEFkZHJlc3MgMQorICAgICAgICAoKyspIEFkZHJlc3NpbmcgbW9kZSAoTWFzdGVyLCBTbGF2ZSkKKyAgICAgICAgKCsrKSBEdWFsIEFkZHJlc3NpbmcgbW9kZQorICAgICAgICAoKyspIE93biBBZGRyZXNzIDIKKyAgICAgICAgKCsrKSBPd24gQWRkcmVzcyAyIE1hc2sKKyAgICAgICAgKCsrKSBHZW5lcmFsIGNhbGwgbW9kZQorICAgICAgICAoKyspIE5vc3RyZXRjaCBtb2RlCisgICAgICAgICgrKykgUGFja2V0IEVycm9yIENoZWNrIG1vZGUKKyAgICAgICAgKCsrKSBQZXJpcGhlcmFsIG1vZGUKKworCisgICAgICAoKykgQ2FsbCB0aGUgZnVuY3Rpb24gSEFMX1NNQlVTX0RlSW5pdCgpIHRvIHJlc3RvcmUgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgorICAgICAgICAgIG9mIHRoZSBzZWxlY3RlZCBTTUJVU3ggcGVyaXBoZXJhbC4KKworICAgICAgKCspIEVuYWJsZS9EaXNhYmxlIEFuYWxvZy9EaWdpdGFsIGZpbHRlcnMgd2l0aCBIQUxfU01CVVNfQ29uZmlnQW5hbG9nRmlsdGVyKCkgYW5kCisgICAgICAgICAgSEFMX1NNQlVTX0NvbmZpZ0RpZ2l0YWxGaWx0ZXIoKS4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBTTUJVUyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzCisgICogICAgICAgICBpbiB0aGUgU01CVVNfSW5pdFR5cGVEZWYgYW5kIGluaXRpYWxpemUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfSW5pdChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpCit7CisgIC8qIENoZWNrIHRoZSBTTUJVUyBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHNtYnVzID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX0FMTF9JTlNUQU5DRShoc21idXMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUJVU19BTkFMT0dfRklMVEVSKGhzbWJ1cy0+SW5pdC5BbmFsb2dGaWx0ZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX09XTl9BRERSRVNTMShoc21idXMtPkluaXQuT3duQWRkcmVzczEpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX0FERFJFU1NJTkdfTU9ERShoc21idXMtPkluaXQuQWRkcmVzc2luZ01vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX0RVQUxfQUREUkVTUyhoc21idXMtPkluaXQuRHVhbEFkZHJlc3NNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUJVU19PV05fQUREUkVTUzIoaHNtYnVzLT5Jbml0Lk93bkFkZHJlc3MyKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUJVU19PV05fQUREUkVTUzJfTUFTSyhoc21idXMtPkluaXQuT3duQWRkcmVzczJNYXNrcykpOworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfR0VORVJBTF9DQUxMKGhzbWJ1cy0+SW5pdC5HZW5lcmFsQ2FsbE1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX05PX1NUUkVUQ0goaHNtYnVzLT5Jbml0Lk5vU3RyZXRjaE1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX1BFQyhoc21idXMtPkluaXQuUGFja2V0RXJyb3JDaGVja01vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX1BFUklQSEVSQUxfTU9ERShoc21idXMtPkluaXQuUGVyaXBoZXJhbE1vZGUpKTsKKworICBpZiAoaHNtYnVzLT5TdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHNtYnVzLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgKi8KKyAgICBIQUxfU01CVVNfTXNwSW5pdChoc21idXMpOworICB9CisKKyAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIFNNQlVTIHBlcmlwaGVyYWwgKi8KKyAgX19IQUxfU01CVVNfRElTQUJMRShoc21idXMpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTTUJVU3ggVElNSU5HUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENvbmZpZ3VyZSBTTUJVU3g6IEZyZXF1ZW5jeSByYW5nZSAqLworICBoc21idXMtPkluc3RhbmNlLT5USU1JTkdSID0gaHNtYnVzLT5Jbml0LlRpbWluZyAmIFRJTUlOR19DTEVBUl9NQVNLOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTTUJVU3ggVElNRU9VVFIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDb25maWd1cmUgU01CVVN4OiBCdXMgVGltZW91dCAgKi8KKyAgaHNtYnVzLT5JbnN0YW5jZS0+VElNRU9VVFIgJj0gfkkyQ19USU1FT1VUUl9USU1PVVRFTjsKKyAgaHNtYnVzLT5JbnN0YW5jZS0+VElNRU9VVFIgJj0gfkkyQ19USU1FT1VUUl9URVhURU47CisgIGhzbWJ1cy0+SW5zdGFuY2UtPlRJTUVPVVRSID0gaHNtYnVzLT5Jbml0LlNNQnVzVGltZW91dDsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU01CVVN4IE9BUjEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENvbmZpZ3VyZSBTTUJVU3g6IE93biBBZGRyZXNzMSBhbmQgYWNrIG93biBhZGRyZXNzMSBtb2RlICovCisgIGhzbWJ1cy0+SW5zdGFuY2UtPk9BUjEgJj0gfkkyQ19PQVIxX09BMUVOOworCisgIGlmIChoc21idXMtPkluaXQuT3duQWRkcmVzczEgIT0gMFUpCisgIHsKKyAgICBpZiAoaHNtYnVzLT5Jbml0LkFkZHJlc3NpbmdNb2RlID09IFNNQlVTX0FERFJFU1NJTkdNT0RFXzdCSVQpCisgICAgeworICAgICAgaHNtYnVzLT5JbnN0YW5jZS0+T0FSMSA9IChJMkNfT0FSMV9PQTFFTiB8IGhzbWJ1cy0+SW5pdC5Pd25BZGRyZXNzMSk7CisgICAgfQorICAgIGVsc2UgLyogU01CVVNfQUREUkVTU0lOR01PREVfMTBCSVQgKi8KKyAgICB7CisgICAgICBoc21idXMtPkluc3RhbmNlLT5PQVIxID0gKEkyQ19PQVIxX09BMUVOIHwgSTJDX09BUjFfT0ExTU9ERSB8IGhzbWJ1cy0+SW5pdC5Pd25BZGRyZXNzMSk7CisgICAgfQorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNNQlVTeCBDUjIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDb25maWd1cmUgU01CVVN4OiBBZGRyZXNzaW5nIE1hc3RlciBtb2RlICovCisgIGlmIChoc21idXMtPkluaXQuQWRkcmVzc2luZ01vZGUgPT0gU01CVVNfQUREUkVTU0lOR01PREVfMTBCSVQpCisgIHsKKyAgICBoc21idXMtPkluc3RhbmNlLT5DUjIgPSAoSTJDX0NSMl9BREQxMCk7CisgIH0KKyAgLyogRW5hYmxlIHRoZSBBVVRPRU5EIGJ5IGRlZmF1bHQsIGFuZCBlbmFibGUgTkFDSyAoc2hvdWxkIGJlIGRpc2FibGUgb25seSBkdXJpbmcgU2xhdmUgcHJvY2VzcykgKi8KKyAgLyogQVVUT0VORCBhbmQgTkFDSyBiaXQgd2lsbCBiZSBtYW5hZ2UgZHVyaW5nIFRyYW5zZmVyIHByb2Nlc3MgKi8KKyAgaHNtYnVzLT5JbnN0YW5jZS0+Q1IyIHw9IChJMkNfQ1IyX0FVVE9FTkQgfCBJMkNfQ1IyX05BQ0spOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTTUJVU3ggT0FSMiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ29uZmlndXJlIFNNQlVTeDogRHVhbCBtb2RlIGFuZCBPd24gQWRkcmVzczIgKi8KKyAgaHNtYnVzLT5JbnN0YW5jZS0+T0FSMiA9IChoc21idXMtPkluaXQuRHVhbEFkZHJlc3NNb2RlIHwgaHNtYnVzLT5Jbml0Lk93bkFkZHJlc3MyIHwgKGhzbWJ1cy0+SW5pdC5Pd25BZGRyZXNzMk1hc2tzIDw8IDhVKSk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNNQlVTeCBDUjEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDb25maWd1cmUgU01CVVN4OiBHZW5lcmFsY2FsbCBhbmQgTm9TdHJldGNoIG1vZGUgKi8KKyAgaHNtYnVzLT5JbnN0YW5jZS0+Q1IxID0gKGhzbWJ1cy0+SW5pdC5HZW5lcmFsQ2FsbE1vZGUgfCBoc21idXMtPkluaXQuTm9TdHJldGNoTW9kZSB8IGhzbWJ1cy0+SW5pdC5QYWNrZXRFcnJvckNoZWNrTW9kZSB8IGhzbWJ1cy0+SW5pdC5QZXJpcGhlcmFsTW9kZSB8IGhzbWJ1cy0+SW5pdC5BbmFsb2dGaWx0ZXIpOworCisgIC8qIEVuYWJsZSBTbGF2ZSBCeXRlIENvbnRyb2wgb25seSBpbiBjYXNlIG9mIFBhY2tldCBFcnJvciBDaGVjayBpcyBlbmFibGVkIGFuZCBTTUJVUyBQZXJpcGhlcmFsIGlzIHNldCBpbiBTbGF2ZSBtb2RlICovCisgIGlmICgoaHNtYnVzLT5Jbml0LlBhY2tldEVycm9yQ2hlY2tNb2RlID09IFNNQlVTX1BFQ19FTkFCTEUpCisgICAgICAmJiAoKGhzbWJ1cy0+SW5pdC5QZXJpcGhlcmFsTW9kZSA9PSBTTUJVU19QRVJJUEhFUkFMX01PREVfU01CVVNfU0xBVkUpIHx8IChoc21idXMtPkluaXQuUGVyaXBoZXJhbE1vZGUgPT0gU01CVVNfUEVSSVBIRVJBTF9NT0RFX1NNQlVTX1NMQVZFX0FSUCkpKQorICB7CisgICAgaHNtYnVzLT5JbnN0YW5jZS0+Q1IxIHw9IEkyQ19DUjFfU0JDOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBTTUJVUyBwZXJpcGhlcmFsICovCisgIF9fSEFMX1NNQlVTX0VOQUJMRShoc21idXMpOworCisgIGhzbWJ1cy0+RXJyb3JDb2RlID0gSEFMX1NNQlVTX0VSUk9SX05PTkU7CisgIGhzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRUFEWTsKKyAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgU01CVVMgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX0RlSW5pdChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpCit7CisgIC8qIENoZWNrIHRoZSBTTUJVUyBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHNtYnVzID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX0FMTF9JTlNUQU5DRShoc21idXMtPkluc3RhbmNlKSk7CisKKyAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFNNQlVTIFBlcmlwaGVyYWwgQ2xvY2sgKi8KKyAgX19IQUxfU01CVVNfRElTQUJMRShoc21idXMpOworCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyAqLworICBIQUxfU01CVVNfTXNwRGVJbml0KGhzbWJ1cyk7CisKKyAgaHNtYnVzLT5FcnJvckNvZGUgPSBIQUxfU01CVVNfRVJST1JfTk9ORTsKKyAgaHNtYnVzLT5QcmV2aW91c1N0YXRlID0gIEhBTF9TTUJVU19TVEFURV9SRVNFVDsKKyAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRVNFVDsKKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIEluaXRpYWxpemUgdGhlIFNNQlVTIE1TUC4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NNQlVTX01zcEluaXQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc21idXMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU01CVVNfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgRGVJbml0aWFsaXplIHRoZSBTTUJVUyBNU1AuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TTUJVU19Nc3BEZUluaXQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc21idXMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU01CVVNfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIEFuYWxvZyBub2lzZSBmaWx0ZXIuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcGFyYW0gIEFuYWxvZ0ZpbHRlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0FOQUxPR0ZJTFRFUl9FTkFCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19BTkFMT0dGSUxURVJfRElTQUJMRQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX0NvbmZpZ0FuYWxvZ0ZpbHRlcihTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQzMl90IEFuYWxvZ0ZpbHRlcikKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX0FMTF9JTlNUQU5DRShoc21idXMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUJVU19BTkFMT0dfRklMVEVSKEFuYWxvZ0ZpbHRlcikpOworCisgIGlmIChoc21idXMtPlN0YXRlID09IEhBTF9TTUJVU19TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoc21idXMpOworCisgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9CVVNZOworCisgICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgU01CVVMgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX1NNQlVTX0RJU0FCTEUoaHNtYnVzKTsKKworICAgIC8qIFJlc2V0IEFOT0ZGIGJpdCAqLworICAgIGhzbWJ1cy0+SW5zdGFuY2UtPkNSMSAmPSB+KEkyQ19DUjFfQU5GT0ZGKTsKKworICAgIC8qIFNldCBhbmFsb2cgZmlsdGVyIGJpdCovCisgICAgaHNtYnVzLT5JbnN0YW5jZS0+Q1IxIHw9IEFuYWxvZ0ZpbHRlcjsKKworICAgIF9fSEFMX1NNQlVTX0VOQUJMRShoc21idXMpOworCisgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIERpZ2l0YWwgbm9pc2UgZmlsdGVyLgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHBhcmFtICBEaWdpdGFsRmlsdGVyIENvZWZmaWNpZW50IG9mIGRpZ2l0YWwgbm9pc2UgZmlsdGVyIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgwRi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19Db25maWdEaWdpdGFsRmlsdGVyKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDMyX3QgRGlnaXRhbEZpbHRlcikKK3sKKyAgdWludDMyX3QgdG1wcmVnID0gMFU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX0FMTF9JTlNUQU5DRShoc21idXMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUJVU19ESUdJVEFMX0ZJTFRFUihEaWdpdGFsRmlsdGVyKSk7CisKKyAgaWYgKGhzbWJ1cy0+U3RhdGUgPT0gSEFMX1NNQlVTX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhzbWJ1cyk7CisKKyAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX0JVU1k7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBTTUJVUyBwZXJpcGhlcmFsICovCisgICAgX19IQUxfU01CVVNfRElTQUJMRShoc21idXMpOworCisgICAgLyogR2V0IHRoZSBvbGQgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgICB0bXByZWcgPSBoc21idXMtPkluc3RhbmNlLT5DUjE7CisKKyAgICAvKiBSZXNldCBJMkMgRE5GIGJpdHMgWzExOjhdICovCisgICAgdG1wcmVnICY9IH4oSTJDX0NSMV9ETkYpOworCisgICAgLyogU2V0IEkyQ3ggRE5GIGNvZWZmaWNpZW50ICovCisgICAgdG1wcmVnIHw9IERpZ2l0YWxGaWx0ZXIgPDwgSTJDX0NSMV9ETkZfUG9zOworCisgICAgLyogU3RvcmUgdGhlIG5ldyByZWdpc3RlciB2YWx1ZSAqLworICAgIGhzbWJ1cy0+SW5zdGFuY2UtPkNSMSA9IHRtcHJlZzsKKworICAgIF9fSEFMX1NNQlVTX0VOQUJMRShoc21idXMpOworCisgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBEYXRhIHRyYW5zZmVycyBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBtYW5hZ2UgdGhlIFNNQlVTIGRhdGEKKyAgICB0cmFuc2ZlcnMuCisKKyAgICAoIykgQmxvY2tpbmcgbW9kZSBmdW5jdGlvbiB0byBjaGVjayBpZiBkZXZpY2UgaXMgcmVhZHkgZm9yIHVzYWdlIGlzIDoKKyAgICAgICAgKCsrKSBIQUxfU01CVVNfSXNEZXZpY2VSZWFkeSgpCisKKyAgICAoIykgVGhlcmUgaXMgb25seSBvbmUgbW9kZSBvZiB0cmFuc2ZlcjoKKyAgICAgICAoKyspIE5vbi1CbG9ja2luZyBtb2RlIDogVGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nIEludGVycnVwdHMuCisgICAgICAgICAgICBUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIHRyYW5zZmVyIHN0YXJ0dXAuCisgICAgICAgICAgICBUaGUgZW5kIG9mIHRoZSBkYXRhIHByb2Nlc3Npbmcgd2lsbCBiZSBpbmRpY2F0ZWQgdGhyb3VnaCB0aGUKKyAgICAgICAgICAgIGRlZGljYXRlZCBTTUJVUyBJUlEgd2hlbiB1c2luZyBJbnRlcnJ1cHQgbW9kZS4KKworICAgICgjKSBOb24tQmxvY2tpbmcgbW9kZSBmdW5jdGlvbnMgd2l0aCBJbnRlcnJ1cHQgYXJlIDoKKyAgICAgICAgKCsrKSBIQUxfU01CVVNfTWFzdGVyX1RyYW5zbWl0X0lUKCkKKyAgICAgICAgKCsrKSBIQUxfU01CVVNfTWFzdGVyX1JlY2VpdmVfSVQoKQorICAgICAgICAoKyspIEhBTF9TTUJVU19TbGF2ZV9UcmFuc21pdF9JVCgpCisgICAgICAgICgrKykgSEFMX1NNQlVTX1NsYXZlX1JlY2VpdmVfSVQoKQorICAgICAgICAoKyspIEhBTF9TTUJVU19FbmFibGVMaXN0ZW5fSVQoKSBvciBhbGlhcyBIQUxfU01CVVNfRW5hYmxlTGlzdGVuX0lUKCkKKyAgICAgICAgKCsrKSBIQUxfU01CVVNfRGlzYWJsZUxpc3Rlbl9JVCgpCisgICAgICAgICgrKykgSEFMX1NNQlVTX0VuYWJsZUFsZXJ0X0lUKCkKKyAgICAgICAgKCsrKSBIQUxfU01CVVNfRGlzYWJsZUFsZXJ0X0lUKCkKKworICAgICgjKSBBIHNldCBvZiBUcmFuc2ZlciBDb21wbGV0ZSBDYWxsYmFja3MgYXJlIHByb3ZpZGVkIGluIG5vbi1CbG9ja2luZyBtb2RlOgorICAgICAgICAoKyspIEhBTF9TTUJVU19NYXN0ZXJUeENwbHRDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX1NNQlVTX01hc3RlclJ4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfU01CVVNfU2xhdmVUeENwbHRDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX1NNQlVTX1NsYXZlUnhDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9TTUJVU19BZGRyQ2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9TTUJVU19MaXN0ZW5DcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9TTUJVU19FcnJvckNhbGxiYWNrKCkKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBpbiBtYXN0ZXIvaG9zdCBTTUJVUyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIFRhcmdldCBkZXZpY2UgYWRkcmVzczogVGhlIGRldmljZSA3IGJpdHMgYWRkcmVzcyB2YWx1ZQorICAqICAgICAgICAgaW4gZGF0YXNoZWV0IG11c3QgYmUgc2hpZnRlZCB0byB0aGUgbGVmdCBiZWZvcmUgY2FsbGluZyB0aGUgaW50ZXJmYWNlCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcGFyYW0gIFhmZXJPcHRpb25zIE9wdGlvbnMgb2YgVHJhbnNmZXIsIHZhbHVlIG9mIEByZWYgU01CVVNfWGZlck9wdGlvbnNfZGVmaW5pdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX01hc3Rlcl9UcmFuc21pdF9JVChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX1RSQU5TRkVSX09QVElPTlNfUkVRVUVTVChYZmVyT3B0aW9ucykpOworCisgIGlmIChoc21idXMtPlN0YXRlID09IEhBTF9TTUJVU19TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoc21idXMpOworCisgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9UWDsKKyAgICBoc21idXMtPkVycm9yQ29kZSA9IEhBTF9TTUJVU19FUlJPUl9OT05FOworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhzbWJ1cy0+cEJ1ZmZQdHIgPSBwRGF0YTsKKyAgICBoc21idXMtPlhmZXJDb3VudCA9IFNpemU7CisgICAgaHNtYnVzLT5YZmVyT3B0aW9ucyA9IFhmZXJPcHRpb25zOworCisgICAgLyogSW4gY2FzZSBvZiBRdWljayBjb21tYW5kLCByZW1vdmUgYXV0b2VuZCBtb2RlICovCisgICAgLyogTWFuYWdlIHRoZSBzdG9wIGdlbmVyYXRpb24gYnkgc29mdHdhcmUgKi8KKyAgICBpZiAoaHNtYnVzLT5wQnVmZlB0ciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGhzbWJ1cy0+WGZlck9wdGlvbnMgJj0gflNNQlVTX0FVVE9FTkRfTU9ERTsKKyAgICB9CisKKyAgICBpZiAoU2l6ZSA+IE1BWF9OQllURV9TSVpFKQorICAgIHsKKyAgICAgIGhzbWJ1cy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhzbWJ1cy0+WGZlclNpemUgPSBTaXplOworICAgIH0KKworICAgIC8qIFNlbmQgU2xhdmUgQWRkcmVzcyAqLworICAgIC8qIFNldCBOQllURVMgdG8gd3JpdGUgYW5kIHJlbG9hZCBpZiBzaXplID4gTUFYX05CWVRFX1NJWkUgYW5kIGdlbmVyYXRlIFJFU1RBUlQgKi8KKyAgICBpZiAoKGhzbWJ1cy0+WGZlclNpemUgPT0gTUFYX05CWVRFX1NJWkUpICYmIChoc21idXMtPlhmZXJTaXplIDwgaHNtYnVzLT5YZmVyQ291bnQpKQorICAgIHsKKyAgICAgIFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhzbWJ1cywgRGV2QWRkcmVzcywgaHNtYnVzLT5YZmVyU2l6ZSwgU01CVVNfUkVMT0FEX01PREUgfCAoaHNtYnVzLT5YZmVyT3B0aW9ucyAmIFNNQlVTX1NFTkRQRUNfTU9ERSksIFNNQlVTX0dFTkVSQVRFX1NUQVJUX1dSSVRFKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIElmIHRyYW5zZmVyIGRpcmVjdGlvbiBub3QgY2hhbmdlLCBkbyBub3QgZ2VuZXJhdGUgUmVzdGFydCBDb25kaXRpb24gKi8KKyAgICAgIC8qIE1lYW4gUHJldmlvdXMgc3RhdGUgaXMgc2FtZSBhcyBjdXJyZW50IHN0YXRlICovCisgICAgICBpZiAoKGhzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfVFgpICYmIChJU19TTUJVU19UUkFOU0ZFUl9PVEhFUl9PUFRJT05TX1JFUVVFU1QoaHNtYnVzLT5YZmVyT3B0aW9ucykgPT0gMCkpCisgICAgICB7CisgICAgICAgIFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhzbWJ1cywgRGV2QWRkcmVzcywgaHNtYnVzLT5YZmVyU2l6ZSwgaHNtYnVzLT5YZmVyT3B0aW9ucywgU01CVVNfTk9fU1RBUlRTVE9QKTsKKyAgICAgIH0KKyAgICAgIC8qIEVsc2UgdHJhbnNmZXIgZGlyZWN0aW9uIGNoYW5nZSwgc28gZ2VuZXJhdGUgUmVzdGFydCB3aXRoIG5ldyB0cmFuc2ZlciBkaXJlY3Rpb24gKi8KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogQ29udmVydCBPVEhFUl94eHggWGZlck9wdGlvbnMgaWYgYW55ICovCisgICAgICAgIFNNQlVTX0NvbnZlcnRPdGhlclhmZXJPcHRpb25zKGhzbWJ1cyk7CisKKyAgICAgICAgLyogSGFuZGxlIFRyYW5zZmVyICovCisgICAgICAgIFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhzbWJ1cywgRGV2QWRkcmVzcywgaHNtYnVzLT5YZmVyU2l6ZSwgaHNtYnVzLT5YZmVyT3B0aW9ucywgU01CVVNfR0VORVJBVEVfU1RBUlRfV1JJVEUpOworICAgICAgfQorCisgICAgICAvKiBJZiBQRUMgbW9kZSBpcyBlbmFibGUsIHNpemUgdG8gdHJhbnNtaXQgbWFuYWdlIGJ5IFNXIHBhcnQgc2hvdWxkIGJlIFNpemUtMSBieXRlLCBjb3JyZXNwb25kaW5nIHRvIFBFQyBieXRlICovCisgICAgICAvKiBQRUMgYnl0ZSBpcyBhdXRvbWF0aWNhbGx5IHNlbnQgYnkgSFcgYmxvY2ssIG5vIG5lZWQgdG8gbWFuYWdlIGl0IGluIFRyYW5zbWl0IHByb2Nlc3MgKi8KKyAgICAgIGlmIChTTUJVU19HRVRfUEVDX01PREUoaHNtYnVzKSAhPSBSRVNFVCkKKyAgICAgIHsKKyAgICAgICAgaHNtYnVzLT5YZmVyU2l6ZS0tOworICAgICAgICBoc21idXMtPlhmZXJDb3VudC0tOworICAgICAgfQorICAgIH0KKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgIC8qIE5vdGUgOiBUaGUgU01CVVMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBTTUJVUyBpbnRlcnJ1cHQgaGFuZGxlIGV4ZWN1dGlvbiBiZWZvcmUgY3VycmVudAorICAgICAgICAgICAgICBwcm9jZXNzIHVubG9jayAqLworICAgIFNNQlVTX0VuYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9UWCk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgaW4gbWFzdGVyL2hvc3QgU01CVVMgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBUYXJnZXQgZGV2aWNlIGFkZHJlc3M6IFRoZSBkZXZpY2UgNyBiaXRzIGFkZHJlc3MgdmFsdWUKKyAgKiAgICAgICAgIGluIGRhdGFzaGVldCBtdXN0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYmVmb3JlIGNhbGxpbmcgdGhlIGludGVyZmFjZQorICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHBhcmFtICBYZmVyT3B0aW9ucyBPcHRpb25zIG9mIFRyYW5zZmVyLCB2YWx1ZSBvZiBAcmVmIFNNQlVTX1hmZXJPcHRpb25zX2RlZmluaXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19NYXN0ZXJfUmVjZWl2ZV9JVChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX1RSQU5TRkVSX09QVElPTlNfUkVRVUVTVChYZmVyT3B0aW9ucykpOworCisgIGlmIChoc21idXMtPlN0YXRlID09IEhBTF9TTUJVU19TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoc21idXMpOworCisgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9SWDsKKyAgICBoc21idXMtPkVycm9yQ29kZSA9IEhBTF9TTUJVU19FUlJPUl9OT05FOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaHNtYnVzLT5wQnVmZlB0ciA9IHBEYXRhOworICAgIGhzbWJ1cy0+WGZlckNvdW50ID0gU2l6ZTsKKyAgICBoc21idXMtPlhmZXJPcHRpb25zID0gWGZlck9wdGlvbnM7CisKKyAgICAvKiBJbiBjYXNlIG9mIFF1aWNrIGNvbW1hbmQsIHJlbW92ZSBhdXRvZW5kIG1vZGUgKi8KKyAgICAvKiBNYW5hZ2UgdGhlIHN0b3AgZ2VuZXJhdGlvbiBieSBzb2Z0d2FyZSAqLworICAgIGlmIChoc21idXMtPnBCdWZmUHRyID09IE5VTEwpCisgICAgeworICAgICAgaHNtYnVzLT5YZmVyT3B0aW9ucyAmPSB+U01CVVNfQVVUT0VORF9NT0RFOworICAgIH0KKworICAgIGlmIChTaXplID4gTUFYX05CWVRFX1NJWkUpCisgICAgeworICAgICAgaHNtYnVzLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHNtYnVzLT5YZmVyU2l6ZSA9IFNpemU7CisgICAgfQorCisgICAgLyogU2VuZCBTbGF2ZSBBZGRyZXNzICovCisgICAgLyogU2V0IE5CWVRFUyB0byB3cml0ZSBhbmQgcmVsb2FkIGlmIHNpemUgPiBNQVhfTkJZVEVfU0laRSBhbmQgZ2VuZXJhdGUgUkVTVEFSVCAqLworICAgIGlmICgoaHNtYnVzLT5YZmVyU2l6ZSA9PSBNQVhfTkJZVEVfU0laRSkgJiYgKGhzbWJ1cy0+WGZlclNpemUgPCBoc21idXMtPlhmZXJDb3VudCkpCisgICAgeworICAgICAgU01CVVNfVHJhbnNmZXJDb25maWcoaHNtYnVzLCBEZXZBZGRyZXNzLCBoc21idXMtPlhmZXJTaXplLCBTTUJVU19SRUxPQURfTU9ERSAgfCAoaHNtYnVzLT5YZmVyT3B0aW9ucyAmIFNNQlVTX1NFTkRQRUNfTU9ERSksIFNNQlVTX0dFTkVSQVRFX1NUQVJUX1JFQUQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogSWYgdHJhbnNmZXIgZGlyZWN0aW9uIG5vdCBjaGFuZ2UsIGRvIG5vdCBnZW5lcmF0ZSBSZXN0YXJ0IENvbmRpdGlvbiAqLworICAgICAgLyogTWVhbiBQcmV2aW91cyBzdGF0ZSBpcyBzYW1lIGFzIGN1cnJlbnQgc3RhdGUgKi8KKyAgICAgIGlmICgoaHNtYnVzLT5QcmV2aW91c1N0YXRlID09IEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9SWCkgJiYgKElTX1NNQlVTX1RSQU5TRkVSX09USEVSX09QVElPTlNfUkVRVUVTVChoc21idXMtPlhmZXJPcHRpb25zKSA9PSAwKSkKKyAgICAgIHsKKyAgICAgICAgU01CVVNfVHJhbnNmZXJDb25maWcoaHNtYnVzLCBEZXZBZGRyZXNzLCBoc21idXMtPlhmZXJTaXplLCBoc21idXMtPlhmZXJPcHRpb25zLCBTTUJVU19OT19TVEFSVFNUT1ApOworICAgICAgfQorICAgICAgLyogRWxzZSB0cmFuc2ZlciBkaXJlY3Rpb24gY2hhbmdlLCBzbyBnZW5lcmF0ZSBSZXN0YXJ0IHdpdGggbmV3IHRyYW5zZmVyIGRpcmVjdGlvbiAqLworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBDb252ZXJ0IE9USEVSX3h4eCBYZmVyT3B0aW9ucyBpZiBhbnkgKi8KKyAgICAgICAgU01CVVNfQ29udmVydE90aGVyWGZlck9wdGlvbnMoaHNtYnVzKTsKKworICAgICAgICAvKiBIYW5kbGUgVHJhbnNmZXIgKi8KKyAgICAgICAgU01CVVNfVHJhbnNmZXJDb25maWcoaHNtYnVzLCBEZXZBZGRyZXNzLCBoc21idXMtPlhmZXJTaXplLCBoc21idXMtPlhmZXJPcHRpb25zLCBTTUJVU19HRU5FUkFURV9TVEFSVF9SRUFEKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICAvKiBOb3RlIDogVGhlIFNNQlVTIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgU01CVVMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKyAgICBTTUJVU19FbmFibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfUlgpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBhIG1hc3Rlci9ob3N0IFNNQlVTIHByb2Nlc3MgY29tbXVuaWNhdGlvbiB3aXRoIEludGVycnVwdC4KKyAgKiBAbm90ZSAgIFRoaXMgYWJvcnQgY2FuIGJlIGNhbGxlZCBvbmx5IGlmIHN0YXRlIGlzIHJlYWR5CisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3MgVGFyZ2V0IGRldmljZSBhZGRyZXNzOiBUaGUgZGV2aWNlIDcgYml0cyBhZGRyZXNzIHZhbHVlCisgICogICAgICAgICBpbiBkYXRhc2hlZXQgbXVzdCBiZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJlZm9yZSBjYWxsaW5nIHRoZSBpbnRlcmZhY2UKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19NYXN0ZXJfQWJvcnRfSVQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50MTZfdCBEZXZBZGRyZXNzKQoreworICBpZiAoaHNtYnVzLT5TdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHNtYnVzKTsKKworICAgIC8qIEtlZXAgdGhlIHNhbWUgc3RhdGUgYXMgcHJldmlvdXMgKi8KKyAgICAvKiB0byBwZXJmb3JtIGFzIHdlbGwgdGhlIGNhbGwgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZW5kIG9mIHRyYW5zZmVyIGNhbGxiYWNrICovCisgICAgaWYgKGhzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfVFgpCisgICAgeworICAgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9UWDsKKyAgICB9CisgICAgZWxzZSBpZiAoaHNtYnVzLT5QcmV2aW91c1N0YXRlID09IEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9SWCkKKyAgICB7CisgICAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1JYOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogV3JvbmcgdXNhZ2Ugb2YgYWJvcnQgZnVuY3Rpb24gKi8KKyAgICAgIC8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgb25seSBpbiBjYXNlIG9mIGFib3J0IG1vbml0b3JlZCBieSBtYXN0ZXIgZGV2aWNlICovCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgICBoc21idXMtPkVycm9yQ29kZSA9IEhBTF9TTUJVU19FUlJPUl9OT05FOworCisgICAgLyogU2V0IE5CWVRFUyB0byAxIHRvIGdlbmVyYXRlIGEgZHVtbXkgcmVhZCBvbiBTTUJVUyBwZXJpcGhlcmFsICovCisgICAgLyogU2V0IEFVVE9FTkQgbW9kZSwgdGhpcyB3aWxsIGdlbmVyYXRlIGEgTkFDSyB0aGVuIFNUT1AgY29uZGl0aW9uIHRvIGFib3J0IHRoZSBjdXJyZW50IHRyYW5zZmVyICovCisgICAgU01CVVNfVHJhbnNmZXJDb25maWcoaHNtYnVzLCBEZXZBZGRyZXNzLCAxVSwgU01CVVNfQVVUT0VORF9NT0RFLCBTTUJVU19OT19TVEFSVFNUT1ApOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgICAgLyogTm90ZSA6IFRoZSBTTUJVUyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIFNNQlVTIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisgICAgaWYgKGhzbWJ1cy0+U3RhdGUgPT0gSEFMX1NNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1RYKQorICAgIHsKKyAgICAgIFNNQlVTX0VuYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9UWCk7CisgICAgfQorICAgIGVsc2UgaWYgKGhzbWJ1cy0+U3RhdGUgPT0gSEFMX1NNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1JYKQorICAgIHsKKyAgICAgIFNNQlVTX0VuYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9SWCk7CisgICAgfQorCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBpbiBzbGF2ZS9kZXZpY2UgU01CVVMgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHBhcmFtICBYZmVyT3B0aW9ucyBPcHRpb25zIG9mIFRyYW5zZmVyLCB2YWx1ZSBvZiBAcmVmIFNNQlVTX1hmZXJPcHRpb25zX2RlZmluaXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19TbGF2ZV9UcmFuc21pdF9JVChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX1RSQU5TRkVSX09QVElPTlNfUkVRVUVTVChYZmVyT3B0aW9ucykpOworCisgIGlmICgoaHNtYnVzLT5TdGF0ZSAmIEhBTF9TTUJVU19TVEFURV9MSVNURU4pID09IEhBTF9TTUJVU19TVEFURV9MSVNURU4pCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBEaXNhYmxlIEludGVycnVwdHMsIHRvIHByZXZlbnQgcHJlZW1wdGlvbiBkdXJpbmcgdHJlYXRtZW50IGluIGNhc2Ugb2YgbXVsdGljYWxsICovCisgICAgU01CVVNfRGlzYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9BRERSIHwgU01CVVNfSVRfVFgpOworCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhzbWJ1cyk7CisKKyAgICBoc21idXMtPlN0YXRlID0gKEhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1RYIHwgSEFMX1NNQlVTX1NUQVRFX0xJU1RFTik7CisgICAgaHNtYnVzLT5FcnJvckNvZGUgPSBIQUxfU01CVVNfRVJST1JfTk9ORTsKKworICAgIC8qIFNldCBTQkMgYml0IHRvIG1hbmFnZSBBY2tub3dsZWRnZSBhdCBlYWNoIGJpdCAqLworICAgIGhzbWJ1cy0+SW5zdGFuY2UtPkNSMSB8PSBJMkNfQ1IxX1NCQzsKKworICAgIC8qIEVuYWJsZSBBZGRyZXNzIEFja25vd2xlZGdlICovCisgICAgaHNtYnVzLT5JbnN0YW5jZS0+Q1IyICY9IH5JMkNfQ1IyX05BQ0s7CisKKyAgICAvKiBQcmVwYXJlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICBoc21idXMtPnBCdWZmUHRyID0gcERhdGE7CisgICAgaHNtYnVzLT5YZmVyQ291bnQgPSBTaXplOworICAgIGhzbWJ1cy0+WGZlck9wdGlvbnMgPSBYZmVyT3B0aW9uczsKKworICAgIC8qIENvbnZlcnQgT1RIRVJfeHh4IFhmZXJPcHRpb25zIGlmIGFueSAqLworICAgIFNNQlVTX0NvbnZlcnRPdGhlclhmZXJPcHRpb25zKGhzbWJ1cyk7CisKKyAgICBpZiAoU2l6ZSA+IE1BWF9OQllURV9TSVpFKQorICAgIHsKKyAgICAgIGhzbWJ1cy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhzbWJ1cy0+WGZlclNpemUgPSBTaXplOworICAgIH0KKworICAgIC8qIFNldCBOQllURVMgdG8gd3JpdGUgYW5kIHJlbG9hZCBpZiBzaXplID4gTUFYX05CWVRFX1NJWkUgYW5kIGdlbmVyYXRlIFJFU1RBUlQgKi8KKyAgICBpZiAoKGhzbWJ1cy0+WGZlclNpemUgPT0gTUFYX05CWVRFX1NJWkUpICYmIChoc21idXMtPlhmZXJTaXplIDwgaHNtYnVzLT5YZmVyQ291bnQpKQorICAgIHsKKyAgICAgIFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhzbWJ1cywgMFUsIGhzbWJ1cy0+WGZlclNpemUsIFNNQlVTX1JFTE9BRF9NT0RFIHwgKGhzbWJ1cy0+WGZlck9wdGlvbnMgJiBTTUJVU19TRU5EUEVDX01PREUpLCBTTUJVU19OT19TVEFSVFNUT1ApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogU2V0IE5CWVRFIHRvIHRyYW5zbWl0ICovCisgICAgICBTTUJVU19UcmFuc2ZlckNvbmZpZyhoc21idXMsIDBVLCBoc21idXMtPlhmZXJTaXplLCBoc21idXMtPlhmZXJPcHRpb25zLCBTTUJVU19OT19TVEFSVFNUT1ApOworCisgICAgICAvKiBJZiBQRUMgbW9kZSBpcyBlbmFibGUsIHNpemUgdG8gdHJhbnNtaXQgc2hvdWxkIGJlIFNpemUtMSBieXRlLCBjb3JyZXNwb25kaW5nIHRvIFBFQyBieXRlICovCisgICAgICAvKiBQRUMgYnl0ZSBpcyBhdXRvbWF0aWNhbGx5IHNlbnQgYnkgSFcgYmxvY2ssIG5vIG5lZWQgdG8gbWFuYWdlIGl0IGluIFRyYW5zbWl0IHByb2Nlc3MgKi8KKyAgICAgIGlmIChTTUJVU19HRVRfUEVDX01PREUoaHNtYnVzKSAhPSBSRVNFVCkKKyAgICAgIHsKKyAgICAgICAgaHNtYnVzLT5YZmVyU2l6ZS0tOworICAgICAgICBoc21idXMtPlhmZXJDb3VudC0tOworICAgICAgfQorICAgIH0KKworICAgIC8qIENsZWFyIEFERFIgZmxhZyBhZnRlciBwcmVwYXJlIHRoZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgLyogVGhpcyBhY3Rpb24gd2lsbCBnZW5lcmF0ZSBhbiBhY2tub3dsZWRnZSB0byB0aGUgSE9TVCAqLworICAgIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX0FERFIpOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgICAgLyogTm90ZSA6IFRoZSBTTUJVUyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIFNNQlVTIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisgICAgLyogUkVuYWJsZSBBRERSIGludGVycnVwdCAqLworICAgIFNNQlVTX0VuYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9UWCB8IFNNQlVTX0lUX0FERFIpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZSBpbiBzbGF2ZS9kZXZpY2UgU01CVVMgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHBhcmFtICBYZmVyT3B0aW9ucyBPcHRpb25zIG9mIFRyYW5zZmVyLCB2YWx1ZSBvZiBAcmVmIFNNQlVTX1hmZXJPcHRpb25zX2RlZmluaXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19TbGF2ZV9SZWNlaXZlX0lUKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfVFJBTlNGRVJfT1BUSU9OU19SRVFVRVNUKFhmZXJPcHRpb25zKSk7CisKKyAgaWYgKChoc21idXMtPlN0YXRlICYgSEFMX1NNQlVTX1NUQVRFX0xJU1RFTikgPT0gSEFMX1NNQlVTX1NUQVRFX0xJU1RFTikKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIERpc2FibGUgSW50ZXJydXB0cywgdG8gcHJldmVudCBwcmVlbXB0aW9uIGR1cmluZyB0cmVhdG1lbnQgaW4gY2FzZSBvZiBtdWx0aWNhbGwgKi8KKyAgICBTTUJVU19EaXNhYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX0FERFIgfCBTTUJVU19JVF9SWCk7CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHNtYnVzKTsKKworICAgIGhzbWJ1cy0+U3RhdGUgPSAoSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfUlggfCBIQUxfU01CVVNfU1RBVEVfTElTVEVOKTsKKyAgICBoc21idXMtPkVycm9yQ29kZSA9IEhBTF9TTUJVU19FUlJPUl9OT05FOworCisgICAgLyogU2V0IFNCQyBiaXQgdG8gbWFuYWdlIEFja25vd2xlZGdlIGF0IGVhY2ggYml0ICovCisgICAgaHNtYnVzLT5JbnN0YW5jZS0+Q1IxIHw9IEkyQ19DUjFfU0JDOworCisgICAgLyogRW5hYmxlIEFkZHJlc3MgQWNrbm93bGVkZ2UgKi8KKyAgICBoc21idXMtPkluc3RhbmNlLT5DUjIgJj0gfkkyQ19DUjJfTkFDSzsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhzbWJ1cy0+cEJ1ZmZQdHIgPSBwRGF0YTsKKyAgICBoc21idXMtPlhmZXJTaXplID0gU2l6ZTsKKyAgICBoc21idXMtPlhmZXJDb3VudCA9IFNpemU7CisgICAgaHNtYnVzLT5YZmVyT3B0aW9ucyA9IFhmZXJPcHRpb25zOworCisgICAgLyogQ29udmVydCBPVEhFUl94eHggWGZlck9wdGlvbnMgaWYgYW55ICovCisgICAgU01CVVNfQ29udmVydE90aGVyWGZlck9wdGlvbnMoaHNtYnVzKTsKKworICAgIC8qIFNldCBOQllURSB0byByZWNlaXZlICovCisgICAgLyogSWYgWGZlclNpemUgZXF1YWwgIjEiLCBvciBYZmVyU2l6ZSBlcXVhbCAiMiIgd2l0aCBQRUMgcmVxdWVzdGVkIChtZWFuIDEgZGF0YSBieXRlICsgMSBQRUMgYnl0ZSAqLworICAgIC8qIG5vIG5lZWQgdG8gc2V0IFJFTE9BRCBiaXQgbW9kZSwgYSBBQ0sgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBpbiB0aGF0IGNhc2UgKi8KKyAgICAvKiBlbHNlIG5lZWQgdG8gc2V0IFJFTE9BRCBiaXQgbW9kZSB0byBnZW5lcmF0ZSBhbiBhdXRvbWF0aWMgQUNLIGF0IGVhY2ggYnl0ZSBSZWNlaXZlZCAqLworICAgIC8qIFRoaXMgUkVMT0FEIGJpdCB3aWxsIGJlIHJlc2V0IGZvciBsYXN0IEJZVEUgdG8gYmUgcmVjZWl2ZSBpbiBTTUJVU19TbGF2ZV9JU1IgKi8KKyAgICBpZiAoKGhzbWJ1cy0+WGZlclNpemUgPT0gMVUpIHx8ICgoaHNtYnVzLT5YZmVyU2l6ZSA9PSAyVSkgJiYgKFNNQlVTX0dFVF9QRUNfTU9ERShoc21idXMpICE9IFJFU0VUKSkpCisgICAgeworICAgICAgU01CVVNfVHJhbnNmZXJDb25maWcoaHNtYnVzLCAwVSwgaHNtYnVzLT5YZmVyU2l6ZSwgaHNtYnVzLT5YZmVyT3B0aW9ucywgU01CVVNfTk9fU1RBUlRTVE9QKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhzbWJ1cywgMFUsIDFVLCBoc21idXMtPlhmZXJPcHRpb25zIHwgU01CVVNfUkVMT0FEX01PREUsIFNNQlVTX05PX1NUQVJUU1RPUCk7CisgICAgfQorCisgICAgLyogQ2xlYXIgQUREUiBmbGFnIGFmdGVyIHByZXBhcmUgdGhlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICAvKiBUaGlzIGFjdGlvbiB3aWxsIGdlbmVyYXRlIGFuIGFja25vd2xlZGdlIHRvIHRoZSBIT1NUICovCisgICAgX19IQUxfU01CVVNfQ0xFQVJfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfQUREUik7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICAvKiBOb3RlIDogVGhlIFNNQlVTIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgU01CVVMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKyAgICAvKiBSRW5hYmxlIEFERFIgaW50ZXJydXB0ICovCisgICAgU01CVVNfRW5hYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX1JYIHwgU01CVVNfSVRfQUREUik7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIEFkZHJlc3MgbGlzdGVuIG1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19FbmFibGVMaXN0ZW5fSVQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX0xJU1RFTjsKKworICAvKiBFbmFibGUgdGhlIEFkZHJlc3MgTWF0Y2ggaW50ZXJydXB0ICovCisgIFNNQlVTX0VuYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9BRERSKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIEFkZHJlc3MgbGlzdGVuIG1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19EaXNhYmxlTGlzdGVuX0lUKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cykKK3sKKyAgLyogRGlzYWJsZSBBZGRyZXNzIGxpc3RlbiBtb2RlIG9ubHkgaWYgYSB0cmFuc2ZlciBpcyBub3Qgb25nb2luZyAqLworICBpZiAoaHNtYnVzLT5TdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfTElTVEVOKQorICB7CisgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRUFEWTsKKworICAgIC8qIERpc2FibGUgdGhlIEFkZHJlc3MgTWF0Y2ggaW50ZXJydXB0ICovCisgICAgU01CVVNfRGlzYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9BRERSKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBTTUJVUyBhbGVydCBtb2RlIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVN4IHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfRW5hYmxlQWxlcnRfSVQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICAvKiBFbmFibGUgU01CdXMgYWxlcnQgKi8KKyAgaHNtYnVzLT5JbnN0YW5jZS0+Q1IxIHw9IEkyQ19DUjFfQUxFUlRFTjsKKworICAvKiBDbGVhciBBTEVSVCBmbGFnICovCisgIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX0FMRVJUKTsKKworICAvKiBFbmFibGUgQWxlcnQgSW50ZXJydXB0ICovCisgIFNNQlVTX0VuYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9BTEVSVCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgU01CVVMgYWxlcnQgbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTeCBwZXJpcGhlcmFsLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX0Rpc2FibGVBbGVydF9JVChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpCit7CisgIC8qIEVuYWJsZSBTTUJ1cyBhbGVydCAqLworICBoc21idXMtPkluc3RhbmNlLT5DUjEgJj0gfkkyQ19DUjFfQUxFUlRFTjsKKworICAvKiBEaXNhYmxlIEFsZXJ0IEludGVycnVwdCAqLworICBTTUJVU19EaXNhYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX0FMRVJUKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRhcmdldCBkZXZpY2UgaXMgcmVhZHkgZm9yIGNvbW11bmljYXRpb24uCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3MgVGFyZ2V0IGRldmljZSBhZGRyZXNzOiBUaGUgZGV2aWNlIDcgYml0cyBhZGRyZXNzIHZhbHVlCisgICogICAgICAgICBpbiBkYXRhc2hlZXQgbXVzdCBiZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJlZm9yZSBjYWxsaW5nIHRoZSBpbnRlcmZhY2UKKyAgKiBAcGFyYW0gIFRyaWFscyBOdW1iZXIgb2YgdHJpYWxzCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19Jc0RldmljZVJlYWR5KFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDMyX3QgVHJpYWxzLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKworICBfX0lPIHVpbnQzMl90IFNNQlVTX1RyaWFscyA9IDBVOworCisgIGlmIChoc21idXMtPlN0YXRlID09IEhBTF9TTUJVU19TVEFURV9SRUFEWSkKKyAgeworICAgIGlmIChfX0hBTF9TTUJVU19HRVRfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfQlVTWSkgIT0gUkVTRVQpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9CVVNZOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoc21idXMpOworCisgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9CVVNZOworICAgIGhzbWJ1cy0+RXJyb3JDb2RlID0gSEFMX1NNQlVTX0VSUk9SX05PTkU7CisKKyAgICBkbworICAgIHsKKyAgICAgIC8qIEdlbmVyYXRlIFN0YXJ0ICovCisgICAgICBoc21idXMtPkluc3RhbmNlLT5DUjIgPSBTTUJVU19HRU5FUkFURV9TVEFSVChoc21idXMtPkluaXQuQWRkcmVzc2luZ01vZGUsIERldkFkZHJlc3MpOworCisgICAgICAvKiBObyBuZWVkIHRvIENoZWNrIFRDIGZsYWcsIHdpdGggQVVUT0VORCBtb2RlIHRoZSBzdG9wIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkICovCisgICAgICAvKiBXYWl0IHVudGlsIFNUT1BGIGZsYWcgaXMgc2V0IG9yIGEgTkFDSyBmbGFnIGlzIHNldCovCisgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgICAgd2hpbGUgKChfX0hBTF9TTUJVU19HRVRfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfU1RPUEYpID09IFJFU0VUKSAmJiAoX19IQUxfU01CVVNfR0VUX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX0FGKSA9PSBSRVNFVCkgJiYgKGhzbWJ1cy0+U3RhdGUgIT0gSEFMX1NNQlVTX1NUQVRFX1RJTUVPVVQpKQorICAgICAgeworICAgICAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgICAgICB7CisgICAgICAgICAgaWYgKChUaW1lb3V0ID09IDBVKSB8fCAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogRGV2aWNlIGlzIHJlYWR5ICovCisgICAgICAgICAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFQURZOworCisgICAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKyAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogQ2hlY2sgaWYgdGhlIE5BQ0tGIGZsYWcgaGFzIG5vdCBiZWVuIHNldCAqLworICAgICAgaWYgKF9fSEFMX1NNQlVTX0dFVF9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19BRikgPT0gUkVTRVQpCisgICAgICB7CisgICAgICAgIC8qIFdhaXQgdW50aWwgU1RPUEYgZmxhZyBpcyByZXNldCAqLworICAgICAgICBpZiAoU01CVVNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoc21idXMsIFNNQlVTX0ZMQUdfU1RPUEYsIFJFU0VULCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBDbGVhciBTVE9QIEZsYWcgKi8KKyAgICAgICAgX19IQUxfU01CVVNfQ0xFQVJfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfU1RPUEYpOworCisgICAgICAgIC8qIERldmljZSBpcyByZWFkeSAqLworICAgICAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9PSzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogV2FpdCB1bnRpbCBTVE9QRiBmbGFnIGlzIHJlc2V0ICovCisgICAgICAgIGlmIChTTUJVU19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhzbWJ1cywgU01CVVNfRkxBR19TVE9QRiwgUkVTRVQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENsZWFyIE5BQ0sgRmxhZyAqLworICAgICAgICBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19BRik7CisKKyAgICAgICAgLyogQ2xlYXIgU1RPUCBGbGFnLCBhdXRvIGdlbmVyYXRlZCB3aXRoIGF1dG9lbmQqLworICAgICAgICBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19TVE9QRik7CisgICAgICB9CisKKyAgICAgIC8qIENoZWNrIGlmIHRoZSBtYXhpbXVtIGFsbG93ZWQgbnVtYmVyIG9mIHRyaWFscyBoYXMgYmVlbiByZWFjaGVkICovCisgICAgICBpZiAoU01CVVNfVHJpYWxzKysgPT0gVHJpYWxzKQorICAgICAgeworICAgICAgICAvKiBHZW5lcmF0ZSBTdG9wICovCisgICAgICAgIGhzbWJ1cy0+SW5zdGFuY2UtPkNSMiB8PSBJMkNfQ1IyX1NUT1A7CisKKyAgICAgICAgLyogV2FpdCB1bnRpbCBTVE9QRiBmbGFnIGlzIHJlc2V0ICovCisgICAgICAgIGlmIChTTUJVU19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhzbWJ1cywgU01CVVNfRkxBR19TVE9QRiwgUkVTRVQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENsZWFyIFNUT1AgRmxhZyAqLworICAgICAgICBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19TVE9QRik7CisgICAgICB9CisgICAgfQorICAgIHdoaWxlIChTTUJVU19UcmlhbHMgPCBUcmlhbHMpOworCisgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfSVJRX0hhbmRsZXJfYW5kX0NhbGxiYWNrcyBJUlEgSGFuZGxlciBhbmQgQ2FsbGJhY2tzCisgKiBAeworICovCisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIFNNQlVTIGV2ZW50IGludGVycnVwdCByZXF1ZXN0LgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9TTUJVU19FVl9JUlFIYW5kbGVyKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cykKK3sKKyAgdWludDMyX3QgdG1waXNydmFsdWUgPSAwVTsKKworICAvKiBVc2UgYSBsb2NhbCB2YXJpYWJsZSB0byBzdG9yZSB0aGUgY3VycmVudCBJU1IgZmxhZ3MgKi8KKyAgLyogVGhpcyBhY3Rpb24gd2lsbCBhdm9pZCBhIHdyb25nIHRyZWF0bWVudCBkdWUgdG8gSVNSIGZsYWdzIGNoYW5nZSBkdXJpbmcgaW50ZXJydXB0IGhhbmRsZXIgKi8KKyAgdG1waXNydmFsdWUgPSBTTUJVU19HRVRfSVNSX1JFRyhoc21idXMpOworCisgIC8qIFNNQlVTIGluIG1vZGUgVHJhbnNtaXR0ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoU01CVVNfQ0hFQ0tfRkxBRyh0bXBpc3J2YWx1ZSwgU01CVVNfRkxBR19UWElTKSAhPSBSRVNFVCkgfHwgKFNNQlVTX0NIRUNLX0ZMQUcodG1waXNydmFsdWUsIFNNQlVTX0ZMQUdfVENSKSAhPSBSRVNFVCkgfHwgKFNNQlVTX0NIRUNLX0ZMQUcodG1waXNydmFsdWUsIFNNQlVTX0ZMQUdfVEMpICE9IFJFU0VUKSB8fCAoU01CVVNfQ0hFQ0tfRkxBRyh0bXBpc3J2YWx1ZSwgU01CVVNfRkxBR19TVE9QRikgIT0gUkVTRVQpIHx8IChTTUJVU19DSEVDS19GTEFHKHRtcGlzcnZhbHVlLCBTTUJVU19GTEFHX0FGKSAhPSBSRVNFVCkpICYmIChfX0hBTF9TTUJVU19HRVRfSVRfU09VUkNFKGhzbWJ1cywgKFNNQlVTX0lUX1RDSSB8IFNNQlVTX0lUX1NUT1BJIHwgU01CVVNfSVRfTkFDS0kgfCBTTUJVU19JVF9UWEkpKSAhPSBSRVNFVCkpCisgIHsKKyAgICAvKiBTbGF2ZSBtb2RlIHNlbGVjdGVkICovCisgICAgaWYgKChoc21idXMtPlN0YXRlICYgSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfVFgpID09IEhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1RYKQorICAgIHsKKyAgICAgIFNNQlVTX1NsYXZlX0lTUihoc21idXMpOworICAgIH0KKyAgICAvKiBNYXN0ZXIgbW9kZSBzZWxlY3RlZCAqLworICAgIGVsc2UgaWYgKChoc21idXMtPlN0YXRlICYgSEFMX1NNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1RYKSA9PSBIQUxfU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfVFgpCisgICAgeworICAgICAgU01CVVNfTWFzdGVyX0lTUihoc21idXMpOworICAgIH0KKyAgfQorCisgIC8qIFNNQlVTIGluIG1vZGUgUmVjZWl2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKFNNQlVTX0NIRUNLX0ZMQUcodG1waXNydmFsdWUsIFNNQlVTX0ZMQUdfUlhORSkgIT0gUkVTRVQpIHx8IChTTUJVU19DSEVDS19GTEFHKHRtcGlzcnZhbHVlLCBTTUJVU19GTEFHX1RDUikgIT0gUkVTRVQpIHx8IChTTUJVU19DSEVDS19GTEFHKHRtcGlzcnZhbHVlLCBTTUJVU19GTEFHX1RDKSAhPSBSRVNFVCkgfHwgKFNNQlVTX0NIRUNLX0ZMQUcodG1waXNydmFsdWUsIFNNQlVTX0ZMQUdfU1RPUEYpICE9IFJFU0VUKSB8fCAoU01CVVNfQ0hFQ0tfRkxBRyh0bXBpc3J2YWx1ZSwgU01CVVNfRkxBR19BRikgIT0gUkVTRVQpKSAmJiAoX19IQUxfU01CVVNfR0VUX0lUX1NPVVJDRShoc21idXMsIChTTUJVU19JVF9UQ0kgfCBTTUJVU19JVF9TVE9QSSB8IFNNQlVTX0lUX05BQ0tJIHwgU01CVVNfSVRfUlhJKSkgIT0gUkVTRVQpKQorICB7CisgICAgLyogU2xhdmUgbW9kZSBzZWxlY3RlZCAqLworICAgIGlmICgoaHNtYnVzLT5TdGF0ZSAmIEhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1JYKSA9PSBIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9SWCkKKyAgICB7CisgICAgICBTTUJVU19TbGF2ZV9JU1IoaHNtYnVzKTsKKyAgICB9CisgICAgLyogTWFzdGVyIG1vZGUgc2VsZWN0ZWQgKi8KKyAgICBlbHNlIGlmICgoaHNtYnVzLT5TdGF0ZSAmIEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9SWCkgPT0gSEFMX1NNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1JYKQorICAgIHsKKyAgICAgIFNNQlVTX01hc3Rlcl9JU1IoaHNtYnVzKTsKKyAgICB9CisgIH0KKworICAvKiBTTUJVUyBpbiBtb2RlIExpc3RlbmVyIE9ubHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChTTUJVU19DSEVDS19GTEFHKHRtcGlzcnZhbHVlLCBTTUJVU19GTEFHX0FERFIpICE9IFJFU0VUKSB8fCAoU01CVVNfQ0hFQ0tfRkxBRyh0bXBpc3J2YWx1ZSwgU01CVVNfRkxBR19TVE9QRikgIT0gUkVTRVQpIHx8IChTTUJVU19DSEVDS19GTEFHKHRtcGlzcnZhbHVlLCBTTUJVU19GTEFHX0FGKSAhPSBSRVNFVCkpCisgICAgICAmJiAoKF9fSEFMX1NNQlVTX0dFVF9JVF9TT1VSQ0UoaHNtYnVzLCBTTUJVU19JVF9BRERSSSkgIT0gUkVTRVQpIHx8IChfX0hBTF9TTUJVU19HRVRfSVRfU09VUkNFKGhzbWJ1cywgU01CVVNfSVRfU1RPUEkpICE9IFJFU0VUKSB8fCAoX19IQUxfU01CVVNfR0VUX0lUX1NPVVJDRShoc21idXMsIFNNQlVTX0lUX05BQ0tJKSAhPSBSRVNFVCkpKQorICB7CisgICAgaWYgKChoc21idXMtPlN0YXRlICYgSEFMX1NNQlVTX1NUQVRFX0xJU1RFTikgPT0gSEFMX1NNQlVTX1NUQVRFX0xJU1RFTikKKyAgICB7CisgICAgICBTTUJVU19TbGF2ZV9JU1IoaHNtYnVzKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgU01CVVMgZXJyb3IgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1NNQlVTX0VSX0lSUUhhbmRsZXIoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICBTTUJVU19JVEVycm9ySGFuZGxlcihoc21idXMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIE1hc3RlciBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TTUJVU19NYXN0ZXJUeENwbHRDYWxsYmFjayhTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzbWJ1cyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TTUJVU19NYXN0ZXJUeENwbHRDYWxsYmFjaygpIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgTWFzdGVyIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NNQlVTX01hc3RlclJ4Q3BsdENhbGxiYWNrKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNtYnVzKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NNQlVTX01hc3RlclJ4Q3BsdENhbGxiYWNrKCkgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqIEBicmllZiAgU2xhdmUgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU01CVVNfU2xhdmVUeENwbHRDYWxsYmFjayhTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzbWJ1cyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TTUJVU19TbGF2ZVR4Q3BsdENhbGxiYWNrKCkgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTbGF2ZSBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TTUJVU19TbGF2ZVJ4Q3BsdENhbGxiYWNrKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNtYnVzKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NNQlVTX1NsYXZlUnhDcGx0Q2FsbGJhY2soKSBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFNsYXZlIEFkZHJlc3MgTWF0Y2ggY2FsbGJhY2suCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcGFyYW0gIFRyYW5zZmVyRGlyZWN0aW9uIE1hc3RlciByZXF1ZXN0IFRyYW5zZmVyIERpcmVjdGlvbiAoV3JpdGUvUmVhZCkKKyAgKiBAcGFyYW0gIEFkZHJNYXRjaENvZGUgQWRkcmVzcyBNYXRjaCBDb2RlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU01CVVNfQWRkckNhbGxiYWNrKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDhfdCBUcmFuc2ZlckRpcmVjdGlvbiwgdWludDE2X3QgQWRkck1hdGNoQ29kZSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNtYnVzKTsKKyAgVU5VU0VEKFRyYW5zZmVyRGlyZWN0aW9uKTsKKyAgVU5VU0VEKEFkZHJNYXRjaENvZGUpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU01CVVNfQWRkckNhbGxiYWNrKCkgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBMaXN0ZW4gQ29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TTUJVU19MaXN0ZW5DcGx0Q2FsbGJhY2soU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc21idXMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU01CVVNfTGlzdGVuQ3BsdENhbGxiYWNrKCkgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTTUJVUyBlcnJvciBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NNQlVTX0Vycm9yQ2FsbGJhY2soU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc21idXMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU01CVVNfRXJyb3JDYWxsYmFjaygpIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwZXJtaXRzIHRvIGdldCBpbiBydW4tdGltZSB0aGUgc3RhdHVzIG9mIHRoZSBwZXJpcGhlcmFsCisgICAgYW5kIHRoZSBkYXRhIGZsb3cuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBTTUJVUyBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLwordWludDMyX3QgSEFMX1NNQlVTX0dldFN0YXRlKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cykKK3sKKyAgLyogUmV0dXJuIFNNQlVTIGhhbmRsZSBzdGF0ZSAqLworICByZXR1cm4gaHNtYnVzLT5TdGF0ZTsKK30KKworLyoqCisqIEBicmllZiAgUmV0dXJuIHRoZSBTTUJVUyBlcnJvciBjb2RlLgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorKiBAcmV0dmFsIFNNQlVTIEVycm9yIENvZGUKKyovCit1aW50MzJfdCBIQUxfU01CVVNfR2V0RXJyb3IoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICByZXR1cm4gaHNtYnVzLT5FcnJvckNvZGU7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBTTUJVU19Qcml2YXRlX0Z1bmN0aW9ucyBTTUJVUyBQcml2YXRlIEZ1bmN0aW9ucworICogIEBicmllZiAgIERhdGEgdHJhbnNmZXJzIFByaXZhdGUgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbnRlcnJ1cHQgU3ViLVJvdXRpbmUgd2hpY2ggaGFuZGxlIHRoZSBJbnRlcnJ1cHQgRmxhZ3MgTWFzdGVyIE1vZGUuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTTUJVU19NYXN0ZXJfSVNSKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cykKK3sKKyAgdWludDE2X3QgRGV2QWRkcmVzczsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzbWJ1cyk7CisKKyAgaWYgKF9fSEFMX1NNQlVTX0dFVF9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19BRikgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBDbGVhciBOQUNLIEZsYWcgKi8KKyAgICBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19BRik7CisKKyAgICAvKiBTZXQgY29ycmVzcG9uZGluZyBFcnJvciBDb2RlICovCisgICAgLyogTm8gbmVlZCB0byBnZW5lcmF0ZSBTVE9QLCBpdCBpcyBhdXRvbWF0aWNhbGx5IGRvbmUgKi8KKyAgICBoc21idXMtPkVycm9yQ29kZSB8PSBIQUxfU01CVVNfRVJST1JfQUNLRjsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgIC8qIENhbGwgdGhlIEVycm9yIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciAqLworICAgIEhBTF9TTUJVU19FcnJvckNhbGxiYWNrKGhzbWJ1cyk7CisgIH0KKyAgZWxzZSBpZiAoX19IQUxfU01CVVNfR0VUX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX1NUT1BGKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIENoZWNrIGFuZCB0cmVhdCBlcnJvcnMgaWYgZXJyb3JzIG9jY3VycyBkdXJpbmcgU1RPUCBwcm9jZXNzICovCisgICAgU01CVVNfSVRFcnJvckhhbmRsZXIoaHNtYnVzKTsKKworICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworICAgIGlmIChoc21idXMtPlN0YXRlID09IEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9UWCkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIEludGVycnVwdCAqLworICAgICAgU01CVVNfRGlzYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9UWCk7CisKKyAgICAgIC8qIENsZWFyIFNUT1AgRmxhZyAqLworICAgICAgX19IQUxfU01CVVNfQ0xFQVJfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfU1RPUEYpOworCisgICAgICAvKiBDbGVhciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KKyAgICAgIFNNQlVTX1JFU0VUX0NSMihoc21idXMpOworCisgICAgICAvKiBGbHVzaCByZW1haW5pbmcgZGF0YSBpbiBGaWZvIHJlZ2lzdGVyIGluIGNhc2Ugb2YgZXJyb3Igb2NjdXJzIGJlZm9yZSBUWEVtcHR5ICovCisgICAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBTTUJVUyBwZXJpcGhlcmFsICovCisgICAgICBfX0hBTF9TTUJVU19ESVNBQkxFKGhzbWJ1cyk7CisKKyAgICAgIGhzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRUFEWTsKKyAgICAgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgICAgICAvKiBSRWVuYWJsZSB0aGUgc2VsZWN0ZWQgU01CVVMgcGVyaXBoZXJhbCAqLworICAgICAgX19IQUxfU01CVVNfRU5BQkxFKGhzbWJ1cyk7CisKKyAgICAgIEhBTF9TTUJVU19NYXN0ZXJUeENwbHRDYWxsYmFjayhoc21idXMpOworICAgIH0KKyAgICBlbHNlIGlmIChoc21idXMtPlN0YXRlID09IEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9SWCkKKyAgICB7CisgICAgICAvKiBTdG9yZSBMYXN0IHJlY2VpdmUgZGF0YSBpZiBhbnkgKi8KKyAgICAgIGlmIChfX0hBTF9TTUJVU19HRVRfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfUlhORSkgIT0gUkVTRVQpCisgICAgICB7CisgICAgICAgIC8qIFJlYWQgZGF0YSBmcm9tIFJYRFIgKi8KKyAgICAgICAgKCpoc21idXMtPnBCdWZmUHRyKyspID0gaHNtYnVzLT5JbnN0YW5jZS0+UlhEUjsKKworICAgICAgICBpZiAoKGhzbWJ1cy0+WGZlclNpemUgPiAwVSkpCisgICAgICAgIHsKKyAgICAgICAgICBoc21idXMtPlhmZXJTaXplLS07CisgICAgICAgICAgaHNtYnVzLT5YZmVyQ291bnQtLTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBEaXNhYmxlIEludGVycnVwdCAqLworICAgICAgU01CVVNfRGlzYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9SWCk7CisKKyAgICAgIC8qIENsZWFyIFNUT1AgRmxhZyAqLworICAgICAgX19IQUxfU01CVVNfQ0xFQVJfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfU1RPUEYpOworCisgICAgICAvKiBDbGVhciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KKyAgICAgIFNNQlVTX1JFU0VUX0NSMihoc21idXMpOworCisgICAgICBoc21idXMtPlByZXZpb3VzU3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfUkVBRFk7CisgICAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFQURZOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgICAgSEFMX1NNQlVTX01hc3RlclJ4Q3BsdENhbGxiYWNrKGhzbWJ1cyk7CisgICAgfQorICB9CisgIGVsc2UgaWYgKF9fSEFMX1NNQlVTX0dFVF9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19SWE5FKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIFJlYWQgZGF0YSBmcm9tIFJYRFIgKi8KKyAgICAoKmhzbWJ1cy0+cEJ1ZmZQdHIrKykgPSBoc21idXMtPkluc3RhbmNlLT5SWERSOworICAgIGhzbWJ1cy0+WGZlclNpemUtLTsKKyAgICBoc21idXMtPlhmZXJDb3VudC0tOworICB9CisgIGVsc2UgaWYgKF9fSEFMX1NNQlVTX0dFVF9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19UWElTKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIFdyaXRlIGRhdGEgdG8gVFhEUiAqLworICAgIGhzbWJ1cy0+SW5zdGFuY2UtPlRYRFIgPSAoKmhzbWJ1cy0+cEJ1ZmZQdHIrKyk7CisgICAgaHNtYnVzLT5YZmVyU2l6ZS0tOworICAgIGhzbWJ1cy0+WGZlckNvdW50LS07CisgIH0KKyAgZWxzZSBpZiAoX19IQUxfU01CVVNfR0VUX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX1RDUikgIT0gUkVTRVQpCisgIHsKKyAgICBpZiAoKGhzbWJ1cy0+WGZlclNpemUgPT0gMFUpICYmIChoc21idXMtPlhmZXJDb3VudCAhPSAwVSkpCisgICAgeworICAgICAgRGV2QWRkcmVzcyA9IChoc21idXMtPkluc3RhbmNlLT5DUjIgJiBJMkNfQ1IyX1NBREQpOworCisgICAgICBpZiAoaHNtYnVzLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICAgIHsKKyAgICAgICAgU01CVVNfVHJhbnNmZXJDb25maWcoaHNtYnVzLCBEZXZBZGRyZXNzLCBNQVhfTkJZVEVfU0laRSwgKFNNQlVTX1JFTE9BRF9NT0RFIHwgKGhzbWJ1cy0+WGZlck9wdGlvbnMgJiBTTUJVU19TRU5EUEVDX01PREUpKSwgU01CVVNfTk9fU1RBUlRTVE9QKTsKKyAgICAgICAgaHNtYnVzLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBoc21idXMtPlhmZXJTaXplID0gaHNtYnVzLT5YZmVyQ291bnQ7CisgICAgICAgIFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhzbWJ1cywgRGV2QWRkcmVzcywgaHNtYnVzLT5YZmVyU2l6ZSwgaHNtYnVzLT5YZmVyT3B0aW9ucywgU01CVVNfTk9fU1RBUlRTVE9QKTsKKyAgICAgICAgLyogSWYgUEVDIG1vZGUgaXMgZW5hYmxlLCBzaXplIHRvIHRyYW5zbWl0IHNob3VsZCBiZSBTaXplLTEgYnl0ZSwgY29ycmVzcG9uZGluZyB0byBQRUMgYnl0ZSAqLworICAgICAgICAvKiBQRUMgYnl0ZSBpcyBhdXRvbWF0aWNhbGx5IHNlbnQgYnkgSFcgYmxvY2ssIG5vIG5lZWQgdG8gbWFuYWdlIGl0IGluIFRyYW5zbWl0IHByb2Nlc3MgKi8KKyAgICAgICAgaWYgKFNNQlVTX0dFVF9QRUNfTU9ERShoc21idXMpICE9IFJFU0VUKQorICAgICAgICB7CisgICAgICAgICAgaHNtYnVzLT5YZmVyU2l6ZS0tOworICAgICAgICAgIGhzbWJ1cy0+WGZlckNvdW50LS07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKGhzbWJ1cy0+WGZlclNpemUgPT0gMFUpICYmIChoc21idXMtPlhmZXJDb3VudCA9PSAwVSkpCisgICAgeworICAgICAgLyogQ2FsbCBUeENwbHRDYWxsYmFjaygpIGlmIG5vIHN0b3AgbW9kZSBpcyBzZXQgKi8KKyAgICAgIGlmIChTTUJVU19HRVRfU1RPUF9NT0RFKGhzbWJ1cykgIT0gU01CVVNfQVVUT0VORF9NT0RFKQorICAgICAgeworICAgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyAgICAgICAgaWYgKGhzbWJ1cy0+U3RhdGUgPT0gSEFMX1NNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1RYKQorICAgICAgICB7CisgICAgICAgICAgLyogRGlzYWJsZSBJbnRlcnJ1cHQgKi8KKyAgICAgICAgICBTTUJVU19EaXNhYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX1RYKTsKKyAgICAgICAgICBoc21idXMtPlByZXZpb3VzU3RhdGUgPSBoc21idXMtPlN0YXRlOworICAgICAgICAgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICAgICAgICBIQUxfU01CVVNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soaHNtYnVzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChoc21idXMtPlN0YXRlID09IEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9SWCkKKyAgICAgICAgeworICAgICAgICAgIFNNQlVTX0Rpc2FibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfUlgpOworICAgICAgICAgIGhzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9IGhzbWJ1cy0+U3RhdGU7CisgICAgICAgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRUFEWTsKKworICAgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgICAgICAgIEhBTF9TTUJVU19NYXN0ZXJSeENwbHRDYWxsYmFjayhoc21idXMpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UgaWYgKF9fSEFMX1NNQlVTX0dFVF9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19UQykgIT0gUkVTRVQpCisgIHsKKyAgICBpZiAoaHNtYnVzLT5YZmVyQ291bnQgPT0gMFUpCisgICAgeworICAgICAgLyogU3BlY2lmaWMgdXNlIGNhc2UgZm9yIFF1aWNrIGNvbW1hbmQgKi8KKyAgICAgIGlmIChoc21idXMtPnBCdWZmUHRyID09IE5VTEwpCisgICAgICB7CisgICAgICAgIC8qIEdlbmVyYXRlIGEgU3RvcCBjb21tYW5kICovCisgICAgICAgIGhzbWJ1cy0+SW5zdGFuY2UtPkNSMiB8PSBJMkNfQ1IyX1NUT1A7CisgICAgICB9CisgICAgICAvKiBDYWxsIFR4Q3BsdENhbGxiYWNrKCkgaWYgbm8gc3RvcCBtb2RlIGlzIHNldCAqLworICAgICAgZWxzZSBpZiAoU01CVVNfR0VUX1NUT1BfTU9ERShoc21idXMpICE9IFNNQlVTX0FVVE9FTkRfTU9ERSkKKyAgICAgIHsKKyAgICAgICAgLyogTm8gR2VuZXJhdGUgU3RvcCwgdG8gcGVybWl0IHJlc3RhcnQgbW9kZSAqLworICAgICAgICAvKiBUaGUgc3RvcCB3aWxsIGJlIGRvbmUgYXQgdGhlIGVuZCBvZiB0cmFuc2Zlciwgd2hlbiBTTUJVU19BVVRPRU5EX01PREUgZW5hYmxlICovCisKKyAgICAgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisgICAgICAgIGlmIChoc21idXMtPlN0YXRlID09IEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9UWCkKKyAgICAgICAgeworICAgICAgICAgIC8qIERpc2FibGUgSW50ZXJydXB0ICovCisgICAgICAgICAgU01CVVNfRGlzYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9UWCk7CisgICAgICAgICAgaHNtYnVzLT5QcmV2aW91c1N0YXRlID0gaHNtYnVzLT5TdGF0ZTsKKyAgICAgICAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFQURZOworCisgICAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgICAgICAgICAgSEFMX1NNQlVTX01hc3RlclR4Q3BsdENhbGxiYWNrKGhzbWJ1cyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaHNtYnVzLT5TdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfUlgpCisgICAgICAgIHsKKyAgICAgICAgICBTTUJVU19EaXNhYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX1JYKTsKKyAgICAgICAgICBoc21idXMtPlByZXZpb3VzU3RhdGUgPSBoc21idXMtPlN0YXRlOworICAgICAgICAgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICAgICAgICBIQUxfU01CVVNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soaHNtYnVzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKy8qKgorICAqIEBicmllZiAgSW50ZXJydXB0IFN1Yi1Sb3V0aW5lIHdoaWNoIGhhbmRsZSB0aGUgSW50ZXJydXB0IEZsYWdzIFNsYXZlIE1vZGUuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTTUJVU19TbGF2ZV9JU1IoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICB1aW50OF90IFRyYW5zZmVyRGlyZWN0aW9uID0gMFU7CisgIHVpbnQxNl90IFNsYXZlQWRkckNvZGUgPSAwVTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzbWJ1cyk7CisKKyAgaWYgKF9fSEFMX1NNQlVTX0dFVF9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19BRikgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBDaGVjayB0aGF0IFNNQlVTIHRyYW5zZmVyIGZpbmlzaGVkICovCisgICAgLyogaWYgeWVzLCBub3JtYWwgdXNlY2FzZSwgYSBOQUNLIGlzIHNlbnQgYnkgdGhlIEhPU1Qgd2hlbiBUcmFuc2ZlciBpcyBmaW5pc2hlZCAqLworICAgIC8qIE1lYW4gWGZlckNvdW50ID09IDAqLworICAgIC8qIFNvIGNsZWFyIEZsYWcgTkFDS0Ygb25seSAqLworICAgIGlmIChoc21idXMtPlhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICAvKiBDbGVhciBOQUNLIEZsYWcgKi8KKyAgICAgIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX0FGKTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBpZiBubywgZXJyb3IgdXNlY2FzZSwgYSBOb24tQWNrbm93bGVkZ2Ugb2YgbGFzdCBEYXRhIGlzIGdlbmVyYXRlZCBieSB0aGUgSE9TVCovCisgICAgICAvKiBDbGVhciBOQUNLIEZsYWcgKi8KKyAgICAgIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX0FGKTsKKworICAgICAgLyogU2V0IEhBTCBTdGF0ZSB0byAiSWRsZSIgU3RhdGUsIG1lYW4gdG8gTElTVEVOIHN0YXRlICovCisgICAgICAvKiBTbyByZXNldCBTbGF2ZSBCdXN5IHN0YXRlICovCisgICAgICBoc21idXMtPlByZXZpb3VzU3RhdGUgPSBoc21idXMtPlN0YXRlOworICAgICAgaHNtYnVzLT5TdGF0ZSAmPSB+KCh1aW50MzJfdClIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9UWCk7CisgICAgICBoc21idXMtPlN0YXRlICY9IH4oKHVpbnQzMl90KUhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1JYKTsKKworICAgICAgLyogRGlzYWJsZSBSWC9UWCBJbnRlcnJ1cHRzLCBrZWVwIG9ubHkgQUREUiBJbnRlcnJ1cHQgKi8KKyAgICAgIFNNQlVTX0Rpc2FibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfUlggfCBTTUJVU19JVF9UWCk7CisKKyAgICAgIC8qIFNldCBFcnJvckNvZGUgY29ycmVzcG9uZGluZyB0byBhIE5vbi1BY2tub3dsZWRnZSAqLworICAgICAgaHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX1NNQlVTX0VSUk9SX0FDS0Y7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgICAgICAvKiBDYWxsIHRoZSBFcnJvciBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgKi8KKyAgICAgIEhBTF9TTUJVU19FcnJvckNhbGxiYWNrKGhzbWJ1cyk7CisgICAgfQorICB9CisgIGVsc2UgaWYgKF9fSEFMX1NNQlVTX0dFVF9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19BRERSKSAhPSBSRVNFVCkKKyAgeworICAgIFRyYW5zZmVyRGlyZWN0aW9uID0gU01CVVNfR0VUX0RJUihoc21idXMpOworICAgIFNsYXZlQWRkckNvZGUgPSBTTUJVU19HRVRfQUREUl9NQVRDSChoc21idXMpOworCisgICAgLyogRGlzYWJsZSBBRERSIGludGVycnVwdCB0byBwcmV2ZW50IG11bHRpcGxlIEFERFJJbnRlcnJ1cHQqLworICAgIC8qIE90aGVyIEFERFJJbnRlcnJ1cHQgd2lsbCBiZSB0cmVhdCBpbiBuZXh0IExpc3RlbiB1c2VjYXNlICovCisgICAgX19IQUxfU01CVVNfRElTQUJMRV9JVChoc21idXMsIFNNQlVTX0lUX0FERFJJKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgIC8qIENhbGwgU2xhdmUgQWRkciBjYWxsYmFjayAqLworICAgIEhBTF9TTUJVU19BZGRyQ2FsbGJhY2soaHNtYnVzLCBUcmFuc2ZlckRpcmVjdGlvbiwgU2xhdmVBZGRyQ29kZSk7CisgIH0KKyAgZWxzZSBpZiAoKF9fSEFMX1NNQlVTX0dFVF9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19SWE5FKSAhPSBSRVNFVCkgfHwgKF9fSEFMX1NNQlVTX0dFVF9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19UQ1IpICE9IFJFU0VUKSkKKyAgeworICAgIGlmICgoaHNtYnVzLT5TdGF0ZSAmIEhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1JYKSA9PSBIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9SWCkKKyAgICB7CisgICAgICAvKiBSZWFkIGRhdGEgZnJvbSBSWERSICovCisgICAgICAoKmhzbWJ1cy0+cEJ1ZmZQdHIrKykgPSBoc21idXMtPkluc3RhbmNlLT5SWERSOworICAgICAgaHNtYnVzLT5YZmVyU2l6ZS0tOworICAgICAgaHNtYnVzLT5YZmVyQ291bnQtLTsKKworICAgICAgaWYgKGhzbWJ1cy0+WGZlckNvdW50ID09IDFVKQorICAgICAgeworICAgICAgICAvKiBSZWNlaXZlIGxhc3QgQnl0ZSwgY2FuIGJlIFBFQyBieXRlIGluIGNhc2Ugb2YgUEVDIEJZVEUgZW5hYmxlZCAqLworICAgICAgICAvKiBvciBvbmx5IHRoZSBsYXN0IEJ5dGUgb2YgVHJhbnNmZXIgKi8KKyAgICAgICAgLyogU28gcmVzZXQgdGhlIFJFTE9BRCBiaXQgbW9kZSAqLworICAgICAgICBoc21idXMtPlhmZXJPcHRpb25zICY9IH5TTUJVU19SRUxPQURfTU9ERTsKKyAgICAgICAgU01CVVNfVHJhbnNmZXJDb25maWcoaHNtYnVzLCAwVSwgMVUsIGhzbWJ1cy0+WGZlck9wdGlvbnMsIFNNQlVTX05PX1NUQVJUU1RPUCk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChoc21idXMtPlhmZXJDb3VudCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogTGFzdCBCeXRlIGlzIHJlY2VpdmVkLCBkaXNhYmxlIEludGVycnVwdCAqLworICAgICAgICBTTUJVU19EaXNhYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX1JYKTsKKworICAgICAgICAvKiBSZW1vdmUgSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfUlgsIGtlZXAgb25seSBIQUxfU01CVVNfU1RBVEVfTElTVEVOICovCisgICAgICAgIGhzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9IGhzbWJ1cy0+U3RhdGU7CisgICAgICAgIGhzbWJ1cy0+U3RhdGUgJj0gfigodWludDMyX3QpSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfUlgpOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICAgICAgLyogQ2FsbCB0aGUgUnggY29tcGxldGUgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIHRoZSBlbmQgb2YgcmVjZWl2ZSBwcm9jZXNzICovCisgICAgICAgIEhBTF9TTUJVU19TbGF2ZVJ4Q3BsdENhbGxiYWNrKGhzbWJ1cyk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFNldCBSZWxvYWQgZm9yIG5leHQgQnl0ZXMgKi8KKyAgICAgICAgU01CVVNfVHJhbnNmZXJDb25maWcoaHNtYnVzLCAwVSwgMVUsIFNNQlVTX1JFTE9BRF9NT0RFICB8IChoc21idXMtPlhmZXJPcHRpb25zICYgU01CVVNfU0VORFBFQ19NT0RFKSwgU01CVVNfTk9fU1RBUlRTVE9QKTsKKworICAgICAgICAvKiBBY2sgbGFzdCBCeXRlIFJlYWQgKi8KKyAgICAgICAgaHNtYnVzLT5JbnN0YW5jZS0+Q1IyICY9IH5JMkNfQ1IyX05BQ0s7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChoc21idXMtPlN0YXRlICYgSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfVFgpID09IEhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1RYKQorICAgIHsKKyAgICAgIGlmICgoaHNtYnVzLT5YZmVyU2l6ZSA9PSAwVSkgJiYgKGhzbWJ1cy0+WGZlckNvdW50ICE9IDBVKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKGhzbWJ1cy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICBTTUJVU19UcmFuc2ZlckNvbmZpZyhoc21idXMsIDBVLCBNQVhfTkJZVEVfU0laRSwgKFNNQlVTX1JFTE9BRF9NT0RFIHwgKGhzbWJ1cy0+WGZlck9wdGlvbnMgJiBTTUJVU19TRU5EUEVDX01PREUpKSwgU01CVVNfTk9fU1RBUlRTVE9QKTsKKyAgICAgICAgICBoc21idXMtPlhmZXJTaXplID0gTUFYX05CWVRFX1NJWkU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaHNtYnVzLT5YZmVyU2l6ZSA9IGhzbWJ1cy0+WGZlckNvdW50OworICAgICAgICAgIFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhzbWJ1cywgMFUsIGhzbWJ1cy0+WGZlclNpemUsIGhzbWJ1cy0+WGZlck9wdGlvbnMsIFNNQlVTX05PX1NUQVJUU1RPUCk7CisgICAgICAgICAgLyogSWYgUEVDIG1vZGUgaXMgZW5hYmxlLCBzaXplIHRvIHRyYW5zbWl0IHNob3VsZCBiZSBTaXplLTEgYnl0ZSwgY29ycmVzcG9uZGluZyB0byBQRUMgYnl0ZSAqLworICAgICAgICAgIC8qIFBFQyBieXRlIGlzIGF1dG9tYXRpY2FsbHkgc2VudCBieSBIVyBibG9jaywgbm8gbmVlZCB0byBtYW5hZ2UgaXQgaW4gVHJhbnNtaXQgcHJvY2VzcyAqLworICAgICAgICAgIGlmIChTTUJVU19HRVRfUEVDX01PREUoaHNtYnVzKSAhPSBSRVNFVCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBoc21idXMtPlhmZXJTaXplLS07CisgICAgICAgICAgICBoc21idXMtPlhmZXJDb3VudC0tOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlIGlmIChfX0hBTF9TTUJVU19HRVRfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfVFhJUykgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBXcml0ZSBkYXRhIHRvIFRYRFIgb25seSBpZiBYZmVyQ291bnQgbm90IHJlYWNoICIwIiAqLworICAgIC8qIEEgVFhJUyBmbGFnIGNhbiBiZSBzZXQsIGR1cmluZyBTVE9QIHRyZWF0bWVudCAgICAgICovCisgICAgLyogQ2hlY2sgaWYgYWxsIERhdGEgaGF2ZSBhbHJlYWR5IGJlZW4gc2VudCAqLworICAgIC8qIElmIGl0IGlzIHRoZSBjYXNlLCB0aGlzIGxhc3Qgd3JpdGUgaW4gVFhEUiBpcyBub3Qgc2VudCwgY29ycmVzcG9uZCB0byBhIGR1bW15IFRYSVMgZXZlbnQgKi8KKyAgICBpZiAoaHNtYnVzLT5YZmVyQ291bnQgPiAwVSkKKyAgICB7CisgICAgICAvKiBXcml0ZSBkYXRhIHRvIFRYRFIgKi8KKyAgICAgIGhzbWJ1cy0+SW5zdGFuY2UtPlRYRFIgPSAoKmhzbWJ1cy0+cEJ1ZmZQdHIrKyk7CisgICAgICBoc21idXMtPlhmZXJDb3VudC0tOworICAgICAgaHNtYnVzLT5YZmVyU2l6ZS0tOworICAgIH0KKworICAgIGlmIChoc21idXMtPlhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICAvKiBMYXN0IEJ5dGUgaXMgVHJhbnNtaXR0ZWQgKi8KKyAgICAgIC8qIFJlbW92ZSBIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9UWCwga2VlcCBvbmx5IEhBTF9TTUJVU19TVEFURV9MSVNURU4gKi8KKyAgICAgIFNNQlVTX0Rpc2FibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfVFgpOworICAgICAgaHNtYnVzLT5QcmV2aW91c1N0YXRlID0gaHNtYnVzLT5TdGF0ZTsKKyAgICAgIGhzbWJ1cy0+U3RhdGUgJj0gfigodWludDMyX3QpSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfVFgpOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgICAgLyogQ2FsbCB0aGUgVHggY29tcGxldGUgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIHRoZSBlbmQgb2YgdHJhbnNtaXQgcHJvY2VzcyAqLworICAgICAgSEFMX1NNQlVTX1NsYXZlVHhDcGx0Q2FsbGJhY2soaHNtYnVzKTsKKyAgICB9CisgIH0KKworICAvKiBDaGVjayBpZiBTVE9QRiBpcyBzZXQgKi8KKyAgaWYgKF9fSEFMX1NNQlVTX0dFVF9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19TVE9QRikgIT0gUkVTRVQpCisgIHsKKyAgICBpZiAoKGhzbWJ1cy0+U3RhdGUgJiBIQUxfU01CVVNfU1RBVEVfTElTVEVOKSA9PSBIQUxfU01CVVNfU1RBVEVfTElTVEVOKQorICAgIHsKKyAgICAgIC8qIFN0b3JlIExhc3QgcmVjZWl2ZSBkYXRhIGlmIGFueSAqLworICAgICAgaWYgKF9fSEFMX1NNQlVTX0dFVF9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19SWE5FKSAhPSBSRVNFVCkKKyAgICAgIHsKKyAgICAgICAgLyogUmVhZCBkYXRhIGZyb20gUlhEUiAqLworICAgICAgICAoKmhzbWJ1cy0+cEJ1ZmZQdHIrKykgPSBoc21idXMtPkluc3RhbmNlLT5SWERSOworCisgICAgICAgIGlmICgoaHNtYnVzLT5YZmVyU2l6ZSA+IDBVKSkKKyAgICAgICAgeworICAgICAgICAgIGhzbWJ1cy0+WGZlclNpemUtLTsKKyAgICAgICAgICBoc21idXMtPlhmZXJDb3VudC0tOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIERpc2FibGUgUlggYW5kIFRYIEludGVycnVwdHMgKi8KKyAgICAgIFNNQlVTX0Rpc2FibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfUlggfCBTTUJVU19JVF9UWCk7CisKKyAgICAgIC8qIERpc2FibGUgQUREUiBJbnRlcnJ1cHQgKi8KKyAgICAgIFNNQlVTX0Rpc2FibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfQUREUik7CisKKyAgICAgIC8qIERpc2FibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICAgICAgaHNtYnVzLT5JbnN0YW5jZS0+Q1IyIHw9IEkyQ19DUjJfTkFDSzsKKworICAgICAgLyogQ2xlYXIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCisgICAgICBTTUJVU19SRVNFVF9DUjIoaHNtYnVzKTsKKworICAgICAgLyogQ2xlYXIgU1RPUCBGbGFnICovCisgICAgICBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19TVE9QRik7CisKKyAgICAgIC8qIENsZWFyIEFERFIgZmxhZyAqLworICAgICAgX19IQUxfU01CVVNfQ0xFQVJfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfQUREUik7CisKKyAgICAgIGhzbWJ1cy0+WGZlck9wdGlvbnMgPSAwVTsKKyAgICAgIGhzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9IGhzbWJ1cy0+U3RhdGU7CisgICAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFQURZOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgICAgLyogQ2FsbCB0aGUgTGlzdGVuIENvbXBsZXRlIGNhbGxiYWNrLCB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgdGhlIGVuZCBvZiBMaXN0ZW4gdXNlY2FzZSAqLworICAgICAgSEFMX1NNQlVTX0xpc3RlbkNwbHRDYWxsYmFjayhoc21idXMpOworICAgIH0KKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKy8qKgorICAqIEBicmllZiAgTWFuYWdlIHRoZSBlbmFibGluZyBvZiBJbnRlcnJ1cHRzLgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHBhcmFtICBJbnRlcnJ1cHRSZXF1ZXN0IFZhbHVlIG9mIEByZWYgU01CVVNfSW50ZXJydXB0X2NvbmZpZ3VyYXRpb25fZGVmaW5pdGlvbi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTTUJVU19FbmFibGVfSVJRKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDE2X3QgSW50ZXJydXB0UmVxdWVzdCkKK3sKKyAgdWludDMyX3QgdG1waXNyID0gMFU7CisKKyAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgU01CVVNfSVRfQUxFUlQpID09IFNNQlVTX0lUX0FMRVJUKQorICB7CisgICAgLyogRW5hYmxlIEVSUiBpbnRlcnJ1cHQgKi8KKyAgICB0bXBpc3IgfD0gU01CVVNfSVRfRVJSSTsKKyAgfQorCisgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIFNNQlVTX0lUX0FERFIpID09IFNNQlVTX0lUX0FERFIpCisgIHsKKyAgICAvKiBFbmFibGUgQUREUiwgU1RPUCBpbnRlcnJ1cHQgKi8KKyAgICB0bXBpc3IgfD0gU01CVVNfSVRfQUREUkkgfCBTTUJVU19JVF9TVE9QSSB8IFNNQlVTX0lUX05BQ0tJIHwgU01CVVNfSVRfRVJSSTsKKyAgfQorCisgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIFNNQlVTX0lUX1RYKSA9PSBTTUJVU19JVF9UWCkKKyAgeworICAgIC8qIEVuYWJsZSBFUlIsIFRDLCBTVE9QLCBOQUNLLCBSWEkgaW50ZXJydXB0ICovCisgICAgdG1waXNyIHw9IFNNQlVTX0lUX0VSUkkgfCBTTUJVU19JVF9UQ0kgfCBTTUJVU19JVF9TVE9QSSB8IFNNQlVTX0lUX05BQ0tJIHwgU01CVVNfSVRfVFhJOworICB9CisKKyAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgU01CVVNfSVRfUlgpID09IFNNQlVTX0lUX1JYKQorICB7CisgICAgLyogRW5hYmxlIEVSUiwgVEMsIFNUT1AsIE5BQ0ssIFRYSSBpbnRlcnJ1cHQgKi8KKyAgICB0bXBpc3IgfD0gU01CVVNfSVRfRVJSSSB8IFNNQlVTX0lUX1RDSSB8IFNNQlVTX0lUX1NUT1BJIHwgU01CVVNfSVRfTkFDS0kgfCBTTUJVU19JVF9SWEk7CisgIH0KKworICAvKiBFbmFibGUgaW50ZXJydXB0cyBvbmx5IGF0IHRoZSBlbmQgKi8KKyAgLyogdG8gYXZvaWQgdGhlIHJpc2sgb2YgU01CVVMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlICovCisgIC8qIGFsbCBpbnRlcnJ1cHRzIHJlcXVlc3RlZCBkb25lICovCisgIF9fSEFMX1NNQlVTX0VOQUJMRV9JVChoc21idXMsIHRtcGlzcik7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKy8qKgorICAqIEBicmllZiAgTWFuYWdlIHRoZSBkaXNhYmxpbmcgb2YgSW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEBwYXJhbSAgSW50ZXJydXB0UmVxdWVzdCBWYWx1ZSBvZiBAcmVmIFNNQlVTX0ludGVycnVwdF9jb25maWd1cmF0aW9uX2RlZmluaXRpb24uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU01CVVNfRGlzYWJsZV9JUlEoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50MTZfdCBJbnRlcnJ1cHRSZXF1ZXN0KQoreworICB1aW50MzJfdCB0bXBpc3IgPSAwVTsKKworICBpZiAoKChJbnRlcnJ1cHRSZXF1ZXN0ICYgU01CVVNfSVRfQUxFUlQpID09IFNNQlVTX0lUX0FMRVJUKSAmJiAoaHNtYnVzLT5TdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfUkVBRFkpKQorICB7CisgICAgLyogRGlzYWJsZSBFUlIgaW50ZXJydXB0ICovCisgICAgdG1waXNyIHw9IFNNQlVTX0lUX0VSUkk7CisgIH0KKworICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBTTUJVU19JVF9UWCkgPT0gU01CVVNfSVRfVFgpCisgIHsKKyAgICAvKiBEaXNhYmxlIFRDLCBTVE9QLCBOQUNLLCBUWEkgaW50ZXJydXB0ICovCisgICAgdG1waXNyIHw9IFNNQlVTX0lUX1RDSSB8IFNNQlVTX0lUX1RYSTsKKworICAgIGlmICgoU01CVVNfR0VUX0FMRVJUX0VOQUJMRUQoaHNtYnVzKSA9PSBSRVNFVCkKKyAgICAgICAgJiYgKChoc21idXMtPlN0YXRlICYgSEFMX1NNQlVTX1NUQVRFX0xJU1RFTikgIT0gSEFMX1NNQlVTX1NUQVRFX0xJU1RFTikpCisgICAgeworICAgICAgLyogRGlzYWJsZSBFUlIgaW50ZXJydXB0ICovCisgICAgICB0bXBpc3IgfD0gU01CVVNfSVRfRVJSSTsKKyAgICB9CisKKyAgICBpZiAoKGhzbWJ1cy0+U3RhdGUgJiBIQUxfU01CVVNfU1RBVEVfTElTVEVOKSAhPSBIQUxfU01CVVNfU1RBVEVfTElTVEVOKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgU1RPUEksIE5BQ0tJICovCisgICAgICB0bXBpc3IgfD0gU01CVVNfSVRfU1RPUEkgfCBTTUJVU19JVF9OQUNLSTsKKyAgICB9CisgIH0KKworICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBTTUJVU19JVF9SWCkgPT0gU01CVVNfSVRfUlgpCisgIHsKKyAgICAvKiBEaXNhYmxlIFRDLCBTVE9QLCBOQUNLLCBSWEkgaW50ZXJydXB0ICovCisgICAgdG1waXNyIHw9IFNNQlVTX0lUX1RDSSB8IFNNQlVTX0lUX1JYSTsKKworICAgIGlmICgoU01CVVNfR0VUX0FMRVJUX0VOQUJMRUQoaHNtYnVzKSA9PSBSRVNFVCkKKyAgICAgICAgJiYgKChoc21idXMtPlN0YXRlICYgSEFMX1NNQlVTX1NUQVRFX0xJU1RFTikgIT0gSEFMX1NNQlVTX1NUQVRFX0xJU1RFTikpCisgICAgeworICAgICAgLyogRGlzYWJsZSBFUlIgaW50ZXJydXB0ICovCisgICAgICB0bXBpc3IgfD0gU01CVVNfSVRfRVJSSTsKKyAgICB9CisKKyAgICBpZiAoKGhzbWJ1cy0+U3RhdGUgJiBIQUxfU01CVVNfU1RBVEVfTElTVEVOKSAhPSBIQUxfU01CVVNfU1RBVEVfTElTVEVOKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgU1RPUEksIE5BQ0tJICovCisgICAgICB0bXBpc3IgfD0gU01CVVNfSVRfU1RPUEkgfCBTTUJVU19JVF9OQUNLSTsKKyAgICB9CisgIH0KKworICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBTTUJVU19JVF9BRERSKSA9PSBTTUJVU19JVF9BRERSKQorICB7CisgICAgLyogRW5hYmxlIEFERFIsIFNUT1AgaW50ZXJydXB0ICovCisgICAgdG1waXNyIHw9IFNNQlVTX0lUX0FERFJJIHwgU01CVVNfSVRfU1RPUEkgfCBTTUJVU19JVF9OQUNLSTsKKworICAgIGlmIChTTUJVU19HRVRfQUxFUlRfRU5BQkxFRChoc21idXMpID09IFJFU0VUKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgRVJSIGludGVycnVwdCAqLworICAgICAgdG1waXNyIHw9IFNNQlVTX0lUX0VSUkk7CisgICAgfQorICB9CisKKyAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzIG9ubHkgYXQgdGhlIGVuZCAqLworICAvKiB0byBhdm9pZCBhIGJyZWFraW5nIHNpdHVhdGlvbiBsaWtlIGF0ICJ0IiB0aW1lICovCisgIC8qIGFsbCBkaXNhYmxlIGludGVycnVwdHMgcmVxdWVzdCBhcmUgbm90IGRvbmUgKi8KKyAgX19IQUxfU01CVVNfRElTQUJMRV9JVChoc21idXMsIHRtcGlzcik7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTTUJVUyBpbnRlcnJ1cHRzIGVycm9yIGhhbmRsZXIuCisgICogQHBhcmFtICBoc21idXMgU01CVVMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU01CVVNfSVRFcnJvckhhbmRsZXIoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICB1aW50MzJfdCBpdGZsYWdzICAgPSBSRUFEX1JFRyhoc21idXMtPkluc3RhbmNlLT5JU1IpOworICB1aW50MzJfdCBpdHNvdXJjZXMgPSBSRUFEX1JFRyhoc21idXMtPkluc3RhbmNlLT5DUjEpOworCisgIC8qIFNNQlVTIEJ1cyBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoaXRmbGFncyAmIFNNQlVTX0ZMQUdfQkVSUikgIT0gUkVTRVQpICYmICgoaXRzb3VyY2VzICYgU01CVVNfSVRfRVJSSSkgIT0gUkVTRVQpKQorICB7CisgICAgaHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX1NNQlVTX0VSUk9SX0JFUlI7CisKKyAgICAvKiBDbGVhciBCRVJSIGZsYWcgKi8KKyAgICBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19CRVJSKTsKKyAgfQorCisgIC8qIFNNQlVTIE92ZXItUnVuL1VuZGVyLVJ1biBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGl0ZmxhZ3MgJiBTTUJVU19GTEFHX09WUikgIT0gUkVTRVQpICYmICgoaXRzb3VyY2VzICYgU01CVVNfSVRfRVJSSSkgIT0gUkVTRVQpKQorICB7CisgICAgaHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX1NNQlVTX0VSUk9SX09WUjsKKworICAgIC8qIENsZWFyIE9WUiBmbGFnICovCisgICAgX19IQUxfU01CVVNfQ0xFQVJfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfT1ZSKTsKKyAgfQorCisgIC8qIFNNQlVTIEFyYml0cmF0aW9uIExvc3MgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGl0ZmxhZ3MgJiBTTUJVU19GTEFHX0FSTE8pICE9IFJFU0VUKSAmJiAoKGl0c291cmNlcyAmIFNNQlVTX0lUX0VSUkkpICE9IFJFU0VUKSkKKyAgeworICAgIGhzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9TTUJVU19FUlJPUl9BUkxPOworCisgICAgLyogQ2xlYXIgQVJMTyBmbGFnICovCisgICAgX19IQUxfU01CVVNfQ0xFQVJfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfQVJMTyk7CisgIH0KKworICAvKiBTTUJVUyBUaW1lb3V0IGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChpdGZsYWdzICYgU01CVVNfRkxBR19USU1FT1VUKSAhPSBSRVNFVCkgJiYgKChpdHNvdXJjZXMgJiBTTUJVU19JVF9FUlJJKSAhPSBSRVNFVCkpCisgIHsKKyAgICBoc21idXMtPkVycm9yQ29kZSB8PSBIQUxfU01CVVNfRVJST1JfQlVTVElNRU9VVDsKKworICAgIC8qIENsZWFyIFRJTUVPVVQgZmxhZyAqLworICAgIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX1RJTUVPVVQpOworICB9CisKKyAgLyogU01CVVMgQWxlcnQgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoaXRmbGFncyAmIFNNQlVTX0ZMQUdfQUxFUlQpICE9IFJFU0VUKSAmJiAoKGl0c291cmNlcyAmIFNNQlVTX0lUX0VSUkkpICE9IFJFU0VUKSkKKyAgeworICAgIGhzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9TTUJVU19FUlJPUl9BTEVSVDsKKworICAgIC8qIENsZWFyIEFMRVJUIGZsYWcgKi8KKyAgICBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19BTEVSVCk7CisgIH0KKworICAvKiBTTUJVUyBQYWNrZXQgRXJyb3IgQ2hlY2sgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChpdGZsYWdzICYgU01CVVNfRkxBR19QRUNFUlIpICE9IFJFU0VUKSAmJiAoKGl0c291cmNlcyAmIFNNQlVTX0lUX0VSUkkpICE9IFJFU0VUKSkKKyAgeworICAgIGhzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9TTUJVU19FUlJPUl9QRUNFUlI7CisKKyAgICAvKiBDbGVhciBQRUMgZXJyb3IgZmxhZyAqLworICAgIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX1BFQ0VSUik7CisgIH0KKworICAvKiBDYWxsIHRoZSBFcnJvciBDYWxsYmFjayBpbiBjYXNlIG9mIEVycm9yIGRldGVjdGVkICovCisgIGlmICgoaHNtYnVzLT5FcnJvckNvZGUgIT0gSEFMX1NNQlVTX0VSUk9SX05PTkUpICYmIChoc21idXMtPkVycm9yQ29kZSAhPSBIQUxfU01CVVNfRVJST1JfQUNLRikpCisgIHsKKyAgICAvKiBEbyBub3QgUmVzZXQgdGhlIEhBTCBzdGF0ZSBpbiBjYXNlIG9mIEFMRVJUIGVycm9yICovCisgICAgaWYgKChoc21idXMtPkVycm9yQ29kZSAmIEhBTF9TTUJVU19FUlJPUl9BTEVSVCkgIT0gSEFMX1NNQlVTX0VSUk9SX0FMRVJUKQorICAgIHsKKyAgICAgIGlmICgoKGhzbWJ1cy0+U3RhdGUgJiBIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9UWCkgPT0gSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfVFgpCisgICAgICAgICAgfHwgKChoc21idXMtPlN0YXRlICYgSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfUlgpID09IEhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1JYKSkKKyAgICAgIHsKKyAgICAgICAgLyogUmVzZXQgb25seSBIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9YWCAqLworICAgICAgICAvKiBrZWVwIEhBTF9TTUJVU19TVEFURV9MSVNURU4gaWYgc2V0ICovCisgICAgICAgIGhzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRUFEWTsKKyAgICAgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9MSVNURU47CisgICAgICB9CisgICAgfQorCisgICAgLyogQ2FsbCB0aGUgRXJyb3IgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyICovCisgICAgSEFMX1NNQlVTX0Vycm9yQ2FsbGJhY2soaHNtYnVzKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBTTUJVUyBDb21tdW5pY2F0aW9uIFRpbWVvdXQuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcGFyYW0gIEZsYWcgU3BlY2lmaWVzIHRoZSBTTUJVUyBmbGFnIHRvIGNoZWNrLgorICAqIEBwYXJhbSAgU3RhdHVzIFRoZSBuZXcgRmxhZyBzdGF0dXMgKFNFVCBvciBSRVNFVCkuCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTTUJVU19XYWl0T25GbGFnVW50aWxUaW1lb3V0KFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDMyX3QgRmxhZywgRmxhZ1N0YXR1cyBTdGF0dXMsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCB1bnRpbCBmbGFnIGlzIHNldCAqLworICBpZiAoU3RhdHVzID09IFJFU0VUKQorICB7CisgICAgd2hpbGUgKF9fSEFMX1NNQlVTX0dFVF9GTEFHKGhzbWJ1cywgRmxhZykgPT0gUkVTRVQpCisgICAgeworICAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCisgICAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgICAgeworICAgICAgICBpZiAoKFRpbWVvdXQgPT0gMFUpIHx8ICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSkKKyAgICAgICAgeworICAgICAgICAgIGhzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9IGhzbWJ1cy0+U3RhdGU7CisgICAgICAgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRUFEWTsKKworICAgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICB3aGlsZSAoX19IQUxfU01CVVNfR0VUX0ZMQUcoaHNtYnVzLCBGbGFnKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KKyAgICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgICB7CisgICAgICAgIGlmICgoVGltZW91dCA9PSAwVSkgfHwgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpKQorICAgICAgICB7CisgICAgICAgICAgaHNtYnVzLT5QcmV2aW91c1N0YXRlID0gaHNtYnVzLT5TdGF0ZTsKKyAgICAgICAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFQURZOworCisgICAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIFNNQlVTeCBjb21tdW5pY2F0aW9uIHdoZW4gc3RhcnRpbmcgdHJhbnNmZXIgb3IgZHVyaW5nIHRyYW5zZmVyIChUQyBvciBUQ1IgZmxhZyBhcmUgc2V0KS4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBTTUJVUyBoYW5kbGUuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIHNwZWNpZmllcyB0aGUgc2xhdmUgYWRkcmVzcyB0byBiZSBwcm9ncmFtbWVkLgorICAqIEBwYXJhbSAgU2l6ZSBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSBwcm9ncmFtbWVkLgorICAqICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMjU1LgorICAqIEBwYXJhbSAgTW9kZSBOZXcgc3RhdGUgb2YgdGhlIFNNQlVTIFNUQVJUIGNvbmRpdGlvbiBnZW5lcmF0aW9uLgorICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvciBhIGNvbWJpbmF0aW9uICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgQGFyZyBAcmVmIFNNQlVTX1JFTE9BRF9NT0RFIEVuYWJsZSBSZWxvYWQgbW9kZS4KKyAgKiAgICAgQGFyZyBAcmVmIFNNQlVTX0FVVE9FTkRfTU9ERSBFbmFibGUgQXV0b21hdGljIGVuZCBtb2RlLgorICAqICAgICBAYXJnIEByZWYgU01CVVNfU09GVEVORF9NT0RFIEVuYWJsZSBTb2Z0d2FyZSBlbmQgbW9kZSBhbmQgUmVsb2FkIG1vZGUuCisgICogICAgIEBhcmcgQHJlZiBTTUJVU19TRU5EUEVDX01PREUgRW5hYmxlIFBhY2tldCBFcnJvciBDYWxjdWxhdGlvbiBtb2RlLgorICAqIEBwYXJhbSAgUmVxdWVzdCBOZXcgc3RhdGUgb2YgdGhlIFNNQlVTIFNUQVJUIGNvbmRpdGlvbiBnZW5lcmF0aW9uLgorICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgQGFyZyBAcmVmIFNNQlVTX05PX1NUQVJUU1RPUCBEb24ndCBHZW5lcmF0ZSBzdG9wIGFuZCBzdGFydCBjb25kaXRpb24uCisgICogICAgIEBhcmcgQHJlZiBTTUJVU19HRU5FUkFURV9TVE9QIEdlbmVyYXRlIHN0b3AgY29uZGl0aW9uIChTaXplIHNob3VsZCBiZSBzZXQgdG8gMCkuCisgICogICAgIEBhcmcgQHJlZiBTTUJVU19HRU5FUkFURV9TVEFSVF9SRUFEIEdlbmVyYXRlIFJlc3RhcnQgZm9yIHJlYWQgcmVxdWVzdC4KKyAgKiAgICAgQGFyZyBAcmVmIFNNQlVTX0dFTkVSQVRFX1NUQVJUX1dSSVRFIEdlbmVyYXRlIFJlc3RhcnQgZm9yIHdyaXRlIHJlcXVlc3QuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTTUJVU19UcmFuc2ZlckNvbmZpZyhTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsICB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90IFNpemUsIHVpbnQzMl90IE1vZGUsIHVpbnQzMl90IFJlcXVlc3QpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TTUJVU19BTExfSU5TVEFOQ0UoaHNtYnVzLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfVFJBTlNGRVJfTU9ERShNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUJVU19UUkFOU0ZFUl9SRVFVRVNUKFJlcXVlc3QpKTsKKworICAvKiB1cGRhdGUgQ1IyIHJlZ2lzdGVyICovCisgIE1PRElGWV9SRUcoaHNtYnVzLT5JbnN0YW5jZS0+Q1IyLCAoKEkyQ19DUjJfU0FERCB8IEkyQ19DUjJfTkJZVEVTIHwgSTJDX0NSMl9SRUxPQUQgfCBJMkNfQ1IyX0FVVE9FTkQgfCAoSTJDX0NSMl9SRF9XUk4gJiAodWludDMyX3QpKFJlcXVlc3QgPj4gKDMxVSAtIEkyQ19DUjJfUkRfV1JOX1BvcykpKSB8IEkyQ19DUjJfU1RBUlQgfCBJMkNfQ1IyX1NUT1AgIHwgSTJDX0NSMl9QRUNCWVRFKSksIFwKKyAgICAgICAgICAgICAodWludDMyX3QpKCgodWludDMyX3QpRGV2QWRkcmVzcyAmIEkyQ19DUjJfU0FERCkgfCAoKCh1aW50MzJfdClTaXplIDw8IEkyQ19DUjJfTkJZVEVTX1BvcykgJiBJMkNfQ1IyX05CWVRFUykgfCAodWludDMyX3QpTW9kZSB8ICh1aW50MzJfdClSZXF1ZXN0KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29udmVydCBTTUJVU3ggT1RIRVJfeHh4IFhmZXJPcHRpb25zIHRvIGZ1bmN0aW9ubmFsIFhmZXJPcHRpb25zLgorICAqIEBwYXJhbSAgaHNtYnVzIFNNQlVTIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNNQlVTX0NvbnZlcnRPdGhlclhmZXJPcHRpb25zKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cykKK3sKKyAgLyogaWYgdXNlciBzZXQgWGZlck9wdGlvbnMgdG8gU01CVVNfT1RIRVJfRlJBTUVfTk9fUEVDICAgKi8KKyAgLyogaXQgcmVxdWVzdCBpbXBsaWNpdGx5IHRvIGdlbmVyYXRlIGEgcmVzdGFydCBjb25kaXRpb24gKi8KKyAgLyogc2V0IFhmZXJPcHRpb25zIHRvIFNNQlVTX0ZJUlNUX0ZSQU1FICAgICAgICAgICAgICAgICAgKi8KKyAgaWYgKGhzbWJ1cy0+WGZlck9wdGlvbnMgPT0gU01CVVNfT1RIRVJfRlJBTUVfTk9fUEVDKQorICB7CisgICAgaHNtYnVzLT5YZmVyT3B0aW9ucyA9IFNNQlVTX0ZJUlNUX0ZSQU1FOworICB9CisgIC8qIGVsc2UgaWYgdXNlciBzZXQgWGZlck9wdGlvbnMgdG8gU01CVVNfT1RIRVJfRlJBTUVfV0lUSF9QRUMgKi8KKyAgLyogaXQgcmVxdWVzdCBpbXBsaWNpdGx5IHRvIGdlbmVyYXRlIGEgcmVzdGFydCBjb25kaXRpb24gICAgICAqLworICAvKiBzZXQgWGZlck9wdGlvbnMgdG8gU01CVVNfRklSU1RfRlJBTUUgfCBTTUJVU19TRU5EUEVDX01PREUgICovCisgIGVsc2UgaWYgKGhzbWJ1cy0+WGZlck9wdGlvbnMgPT0gU01CVVNfT1RIRVJfRlJBTUVfV0lUSF9QRUMpCisgIHsKKyAgICBoc21idXMtPlhmZXJPcHRpb25zID0gU01CVVNfRklSU1RfRlJBTUUgfCBTTUJVU19TRU5EUEVDX01PREU7CisgIH0KKyAgLyogZWxzZSBpZiB1c2VyIHNldCBYZmVyT3B0aW9ucyB0byBTTUJVU19PVEhFUl9BTkRfTEFTVF9GUkFNRV9OT19QRUMgKi8KKyAgLyogaXQgcmVxdWVzdCBpbXBsaWNpdGx5IHRvIGdlbmVyYXRlIGEgcmVzdGFydCBjb25kaXRpb24gICAgICAgICAgICAgKi8KKyAgLyogdGhlbiBnZW5lcmF0ZSBhIHN0b3AgY29uZGl0aW9uIGF0IHRoZSBlbmQgb2YgdHJhbnNmZXIgICAgICAgICAgICAgKi8KKyAgLyogc2V0IFhmZXJPcHRpb25zIHRvIFNNQlVTX0ZJUlNUX0FORF9MQVNUX0ZSQU1FX05PX1BFQyAgICAgICAgICAgICAgKi8KKyAgZWxzZSBpZiAoaHNtYnVzLT5YZmVyT3B0aW9ucyA9PSBTTUJVU19PVEhFUl9BTkRfTEFTVF9GUkFNRV9OT19QRUMpCisgIHsKKyAgICBoc21idXMtPlhmZXJPcHRpb25zID0gU01CVVNfRklSU1RfQU5EX0xBU1RfRlJBTUVfTk9fUEVDOworICB9CisgIC8qIGVsc2UgaWYgdXNlciBzZXQgWGZlck9wdGlvbnMgdG8gU01CVVNfT1RIRVJfQU5EX0xBU1RfRlJBTUVfV0lUSF9QRUMgKi8KKyAgLyogaXQgcmVxdWVzdCBpbXBsaWNpdGx5IHRvIGdlbmVyYXRlIGEgcmVzdGFydCBjb25kaXRpb24gICAgICAgICAgICAgICAqLworICAvKiB0aGVuIGdlbmVyYXRlIGEgc3RvcCBjb25kaXRpb24gYXQgdGhlIGVuZCBvZiB0cmFuc2ZlciAgICAgICAgICAgICAgICovCisgIC8qIHNldCBYZmVyT3B0aW9ucyB0byBTTUJVU19GSVJTVF9BTkRfTEFTVF9GUkFNRV9XSVRIX1BFQyAgICAgICAgICAgICAgKi8KKyAgZWxzZSBpZiAoaHNtYnVzLT5YZmVyT3B0aW9ucyA9PSBTTUJVU19PVEhFUl9BTkRfTEFTVF9GUkFNRV9XSVRIX1BFQykKKyAgeworICAgIGhzbWJ1cy0+WGZlck9wdGlvbnMgPSBTTUJVU19GSVJTVF9BTkRfTEFTVF9GUkFNRV9XSVRIX1BFQzsKKyAgfQorfQorLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9TTUJVU19NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmYzeHhfaGFsX3NwaS5jIGIvU3JjL3N0bTMyZjN4eF9oYWxfc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU2OGFjOAotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfaGFsX3NwaS5jCkBAIC0wLDAgKzEsMzg2MyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfc3BpLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFNQSSBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKFNQSSkgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgVGhlIFNQSSBIQUwgZHJpdmVyIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CisKKyAgICAgICgjKSBEZWNsYXJlIGEgU1BJX0hhbmRsZVR5cGVEZWYgaGFuZGxlIHN0cnVjdHVyZSwgZm9yIGV4YW1wbGU6CisgICAgICAgICAgU1BJX0hhbmRsZVR5cGVEZWYgIGhzcGk7CisKKyAgICAgICgjKUluaXRpYWxpemUgdGhlIFNQSSBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudGluZyB0aGUgSEFMX1NQSV9Nc3BJbml0KCkgQVBJOgorICAgICAgICAgICgjIykgRW5hYmxlIHRoZSBTUEl4IGludGVyZmFjZSBjbG9jaworICAgICAgICAgICgjIykgU1BJIHBpbnMgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgU1BJIEdQSU9zCisgICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGVzZSBTUEkgcGlucyBhcyBhbHRlcm5hdGUgZnVuY3Rpb24gcHVzaC1wdWxsCisgICAgICAgICAgKCMjKSBOVklDIGNvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIGludGVycnVwdCBwcm9jZXNzCisgICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgU1BJeCBpbnRlcnJ1cHQgcHJpb3JpdHkKKyAgICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBOVklDIFNQSSBJUlEgaGFuZGxlCisgICAgICAgICAgKCMjKSBETUEgQ29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgRE1BIHByb2Nlc3MKKyAgICAgICAgICAgICAgKCsrKykgRGVjbGFyZSBhIERNQV9IYW5kbGVUeXBlRGVmIGhhbmRsZSBzdHJ1Y3R1cmUgZm9yIHRoZSB0cmFuc21pdCBvciByZWNlaXZlIFN0cmVhbS9DaGFubmVsCisgICAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgRE1BeCBjbG9jaworICAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIERNQSBoYW5kbGUgcGFyYW1ldGVycworICAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIERNQSBUeCBvciBSeCBTdHJlYW0vQ2hhbm5lbAorICAgICAgICAgICAgICAoKysrKSBBc3NvY2lhdGUgdGhlIGluaXRpYWxpemVkIGhkbWFfdHggaGFuZGxlIHRvIHRoZSBoc3BpIERNQSBUeCBvciBSeCBoYW5kbGUKKyAgICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBwcmlvcml0eSBhbmQgZW5hYmxlIHRoZSBOVklDIGZvciB0aGUgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IG9uIHRoZSBETUEgVHggb3IgUnggU3RyZWFtL0NoYW5uZWwKKworICAgICAgKCMpIFByb2dyYW0gdGhlIE1vZGUsIEJpZGlyZWN0aW9uYWxNb2RlICwgRGF0YSBzaXplLCBCYXVkcmF0ZSBQcmVzY2FsZXIsIE5TUworICAgICAgICAgIG1hbmFnZW1lbnQsIENsb2NrIHBvbGFyaXR5IGFuZCBwaGFzZSwgRmlyc3RCaXQgYW5kIENSQyBjb25maWd1cmF0aW9uIGluIHRoZSBoc3BpIEluaXQgc3RydWN0dXJlLgorCisgICAgICAoIykgSW5pdGlhbGl6ZSB0aGUgU1BJIHJlZ2lzdGVycyBieSBjYWxsaW5nIHRoZSBIQUxfU1BJX0luaXQoKSBBUEk6CisgICAgICAgICAgKCsrKSBUaGlzIEFQSSBjb25maWd1cmVzIGFsc28gdGhlIGxvdyBsZXZlbCBIYXJkd2FyZSBHUElPLCBDTE9DSywgQ09SVEVYLi4uZXRjKQorICAgICAgICAgICAgICBieSBjYWxsaW5nIHRoZSBjdXN0b21pemVkIEhBTF9TUElfTXNwSW5pdCgpIEFQSS4KKyAgICAgWy4uXQorICAgICAgIENpcmN1bGFyIG1vZGUgcmVzdHJpY3Rpb246CisgICAgICAoIykgVGhlIERNQSBjaXJjdWxhciBtb2RlIGNhbm5vdCBiZSB1c2VkIHdoZW4gdGhlIFNQSSBpcyBjb25maWd1cmVkIGluIHRoZXNlIG1vZGVzOgorICAgICAgICAgICgjIykgTWFzdGVyIDJMaW5lcyBSeE9ubHkKKyAgICAgICAgICAoIyMpIE1hc3RlciAxTGluZSBSeAorICAgICAgKCMpIFRoZSBDUkMgZmVhdHVyZSBpcyBub3QgbWFuYWdlZCB3aGVuIHRoZSBETUEgY2lyY3VsYXIgbW9kZSBpcyBlbmFibGVkCisgICAgICAoIykgV2hlbiB0aGUgU1BJIERNQSBQYXVzZS9TdG9wIGZlYXR1cmVzIGFyZSB1c2VkLCB3ZSBtdXN0IHVzZSB0aGUgZm9sbG93aW5nIEFQSXMKKyAgICAgICAgICB0aGUgSEFMX1NQSV9ETUFQYXVzZSgpLyBIQUxfU1BJX0RNQVN0b3AoKSBvbmx5IHVuZGVyIHRoZSBTUEkgY2FsbGJhY2tzCisgICAgIFsuLl0KKyAgICAgICBNYXN0ZXIgUmVjZWl2ZSBtb2RlIHJlc3RyaWN0aW9uOgorICAgICAgKCMpIEluIE1hc3RlciB1bmlkaXJlY3Rpb25hbCByZWNlaXZlLW9ubHkgbW9kZSAoTVNUUiA9MSwgQklESU1PREU9MCwgUlhPTkxZPTApIG9yCisgICAgICAgICAgYmlkaXJlY3Rpb25hbCByZWNlaXZlIG1vZGUgKE1TVFI9MSwgQklESU1PREU9MSwgQklESU9FPTApLCB0byBlbnN1cmUgdGhhdCB0aGUgU1BJCisgICAgICAgICAgZG9lcyBub3QgaW5pdGlhdGUgYSBuZXcgdHJhbnNmZXIgdGhlIGZvbGxvd2luZyBwcm9jZWR1cmUgaGFzIHRvIGJlIHJlc3BlY3RlZDoKKyAgICAgICAgICAoIyMpIEhBTF9TUElfRGVJbml0KCkKKyAgICAgICAgICAoIyMpIEhBTF9TUElfSW5pdCgpCisgICAgIFsuLl0KKyAgICAgICBUaGUgSEFMIGRyaXZlcnMgZG8gbm90IGFsbG93IHJlYWNoaW5nIGFsbCBzdXBwb3J0ZWQgU1BJIGZyZXF1ZW5jaWVzIGluIHRoZSBkaWZmZXJlbnQgU1BJCisgICAgICAgbW9kZXMuIFJlZmVyIHRvIHRoZSBzb3VyY2UgY29kZSAoc3RtMzJ4eHh4X2hhbF9zcGkuYyBoZWFkZXIpIHRvIGdldCBhIHN1bW1hcnkgb2YgdGhlCisgICAgICAgbWF4aW11bSBTUEkgZnJlcXVlbmN5IHRoYXQgY2FuIGJlIHJlYWNoZWQgd2l0aCBhIGRhdGEgc2l6ZSBvZiA4IG9yIDE2IGJpdHMsIGRlcGVuZGluZyBvbgorICAgICAgIHRoZSBBUEJ4IHBlcmlwaGVyYWwgY2xvY2sgZnJlcXVlbmN5IChmUENMSykgdXNlZCBieSB0aGUgU1BJIGluc3RhbmNlLgorCisKKyAgQGVuZHZlcmJhdGltCisKKyAgQWRkaXRpb25hbCB0YWJsZSA6CisKKyAgICAgICBEYXRhU2l6ZSA9IFNQSV9EQVRBU0laRV84QklUOgorICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgMkxpbmVzIEZ1bGxkdXBsZXggICB8ICAgICAyTGluZXMgUnhPbmx5ICAgIHwgICAgICAgICAxTGluZSAgICAgICAgfAorICAgICAgIHwgUHJvY2VzcyB8IFRyYW5mZXJ0IG1vZGUgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgIE1hc3RlciAgfCAgU2xhdmUgICB8ICBNYXN0ZXIgICB8ICBTbGF2ZSAgIHwgIE1hc3RlciAgIHwgIFNsYXZlICAgfAorICAgICAgIHw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09fAorICAgICAgIHwgICAgVCAgICB8ICAgICBQb2xsaW5nICAgIHwgRnBjbGsvNCAgfCBGcGNsay84ICB8ICAgIE5BICAgICB8ICAgIE5BICAgIHwgICAgTkEgICAgIHwgICBOQSAgICAgfAorICAgICAgIHwgICAgWCAgICB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorICAgICAgIHwgICAgLyAgICB8ICAgICBJbnRlcnJ1cHQgIHwgRnBjbGsvNCAgfCBGcGNsay8xNiB8ICAgIE5BICAgICB8ICAgIE5BICAgIHwgICAgTkEgICAgIHwgICBOQSAgICAgfAorICAgICAgIHwgICAgUiAgICB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorICAgICAgIHwgICAgWCAgICB8ICAgICAgIERNQSAgICAgIHwgRnBjbGsvMiAgfCBGcGNsay8yICB8ICAgIE5BICAgICB8ICAgIE5BICAgIHwgICAgTkEgICAgIHwgICBOQSAgICAgfAorICAgICAgIHw9PT09PT09PT18PT09PT09PT09PT09PT09PXw9PT09PT09PT09fD09PT09PT09PT18PT09PT09PT09PT18PT09PT09PT09PXw9PT09PT09PT09PXw9PT09PT09PT09fAorICAgICAgIHwgICAgICAgICB8ICAgICBQb2xsaW5nICAgIHwgRnBjbGsvNCAgfCBGcGNsay84ICB8IEZwY2xrLzE2ICB8IEZwY2xrLzggIHwgRnBjbGsvOCAgIHwgRnBjbGsvOCAgfAorICAgICAgIHwgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorICAgICAgIHwgICAgUiAgICB8ICAgICBJbnRlcnJ1cHQgIHwgRnBjbGsvOCAgfCBGcGNsay8xNiB8IEZwY2xrLzggICB8IEZwY2xrLzggIHwgRnBjbGsvOCAgIHwgRnBjbGsvNCAgfAorICAgICAgIHwgICAgWCAgICB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorICAgICAgIHwgICAgICAgICB8ICAgICAgIERNQSAgICAgIHwgRnBjbGsvNCAgfCBGcGNsay8yICB8IEZwY2xrLzIgICB8IEZwY2xrLzE2IHwgRnBjbGsvMiAgIHwgRnBjbGsvMTYgfAorICAgICAgIHw9PT09PT09PT18PT09PT09PT09PT09PT09PXw9PT09PT09PT09fD09PT09PT09PT18PT09PT09PT09PT18PT09PT09PT09PXw9PT09PT09PT09PXw9PT09PT09PT09fAorICAgICAgIHwgICAgICAgICB8ICAgICBQb2xsaW5nICAgIHwgRnBjbGsvOCAgfCBGcGNsay8yICB8ICAgICBOQSAgICB8ICAgIE5BICAgIHwgRnBjbGsvOCAgIHwgRnBjbGsvOCAgfAorICAgICAgIHwgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorICAgICAgIHwgICAgVCAgICB8ICAgICBJbnRlcnJ1cHQgIHwgRnBjbGsvMiAgfCBGcGNsay80ICB8ICAgICBOQSAgICB8ICAgIE5BICAgIHwgRnBjbGsvMTYgIHwgRnBjbGsvOCAgfAorICAgICAgIHwgICAgWCAgICB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorICAgICAgIHwgICAgICAgICB8ICAgICAgIERNQSAgICAgIHwgRnBjbGsvMiAgfCBGcGNsay8yICB8ICAgICBOQSAgICB8ICAgIE5BICAgIHwgRnBjbGsvOCAgIHwgRnBjbGsvMTYgfAorICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisgICAgICAgRGF0YVNpemUgPSBTUElfREFUQVNJWkVfMTZCSVQ6CisgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAyTGluZXMgRnVsbGR1cGxleCAgIHwgICAgIDJMaW5lcyBSeE9ubHkgICAgfCAgICAgICAgIDFMaW5lICAgICAgICB8CisgICAgICAgfCBQcm9jZXNzIHwgVHJhbmZlcnQgbW9kZSAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgTWFzdGVyICB8ICBTbGF2ZSAgIHwgIE1hc3RlciAgIHwgIFNsYXZlICAgfCAgTWFzdGVyICAgfCAgU2xhdmUgICB8CisgICAgICAgfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18CisgICAgICAgfCAgICBUICAgIHwgICAgIFBvbGxpbmcgICAgfCBGcGNsay80ICB8IEZwY2xrLzggIHwgICAgTkEgICAgIHwgICAgTkEgICAgfCAgICBOQSAgICAgfCAgIE5BICAgICB8CisgICAgICAgfCAgICBYICAgIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgICAgICAgfCAgICAvICAgIHwgICAgIEludGVycnVwdCAgfCBGcGNsay80ICB8IEZwY2xrLzE2IHwgICAgTkEgICAgIHwgICAgTkEgICAgfCAgICBOQSAgICAgfCAgIE5BICAgICB8CisgICAgICAgfCAgICBSICAgIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgICAgICAgfCAgICBYICAgIHwgICAgICAgRE1BICAgICAgfCBGcGNsay8yICB8IEZwY2xrLzIgIHwgICAgTkEgICAgIHwgICAgTkEgICAgfCAgICBOQSAgICAgfCAgIE5BICAgICB8CisgICAgICAgfD09PT09PT09PXw9PT09PT09PT09PT09PT09fD09PT09PT09PT18PT09PT09PT09PXw9PT09PT09PT09PXw9PT09PT09PT09fD09PT09PT09PT09fD09PT09PT09PT18CisgICAgICAgfCAgICAgICAgIHwgICAgIFBvbGxpbmcgICAgfCBGcGNsay80ICB8IEZwY2xrLzggIHwgRnBjbGsvMTYgIHwgRnBjbGsvOCAgfCBGcGNsay84ICAgfCBGcGNsay84ICB8CisgICAgICAgfCAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgICAgICAgfCAgICBSICAgIHwgICAgIEludGVycnVwdCAgfCBGcGNsay84ICB8IEZwY2xrLzE2IHwgRnBjbGsvOCAgIHwgRnBjbGsvOCAgfCBGcGNsay84ICAgfCBGcGNsay80ICB8CisgICAgICAgfCAgICBYICAgIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgICAgICAgfCAgICAgICAgIHwgICAgICAgRE1BICAgICAgfCBGcGNsay80ICB8IEZwY2xrLzIgIHwgRnBjbGsvMiAgIHwgRnBjbGsvMTYgfCBGcGNsay8yICAgfCBGcGNsay8xNiB8CisgICAgICAgfD09PT09PT09PXw9PT09PT09PT09PT09PT09fD09PT09PT09PT18PT09PT09PT09PXw9PT09PT09PT09PXw9PT09PT09PT09fD09PT09PT09PT09fD09PT09PT09PT18CisgICAgICAgfCAgICAgICAgIHwgICAgIFBvbGxpbmcgICAgfCBGcGNsay84ICB8IEZwY2xrLzIgIHwgICAgIE5BICAgIHwgICAgTkEgICAgfCBGcGNsay84ICAgfCBGcGNsay84ICB8CisgICAgICAgfCAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgICAgICAgfCAgICBUICAgIHwgICAgIEludGVycnVwdCAgfCBGcGNsay8yICB8IEZwY2xrLzQgIHwgICAgIE5BICAgIHwgICAgTkEgICAgfCBGcGNsay8xNiAgfCBGcGNsay84ICB8CisgICAgICAgfCAgICBYICAgIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgICAgICAgfCAgICAgICAgIHwgICAgICAgRE1BICAgICAgfCBGcGNsay8yICB8IEZwY2xrLzIgIHwgICAgIE5BICAgIHwgICAgTkEgICAgfCBGcGNsay84ICAgfCBGcGNsay8xNiB8CisgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgQG5vdGUgVGhlIG1heCBTUEkgZnJlcXVlbmN5IGRlcGVuZCBvbiBTUEkgZGF0YSBzaXplICg0Yml0cywgNWJpdHMsLi4uLCA4Yml0cywuLi4xNWJpdHMsIDE2Yml0cyksCisgICAgICAgICAgICAgU1BJIG1vZGUoMiBMaW5lcyBmdWxsZHVwbGV4LCAyIGxpbmVzIFJ4T25seSwgMSBsaW5lIFRYL1JYKSBhbmQgUHJvY2VzcyBtb2RlIChQb2xsaW5nLCBJVCwgRE1BKS4KKyAgICAgICBAbm90ZQorICAgICAgICAgICAgKCMpIFRYL1JYIHByb2Nlc3NlcyBhcmUgSEFMX1NQSV9UcmFuc21pdFJlY2VpdmUoKSwgSEFMX1NQSV9UcmFuc21pdFJlY2VpdmVfSVQoKSBhbmQgSEFMX1NQSV9UcmFuc21pdFJlY2VpdmVfRE1BKCkKKyAgICAgICAgICAgICgjKSBSWCBwcm9jZXNzZXMgYXJlIEhBTF9TUElfUmVjZWl2ZSgpLCBIQUxfU1BJX1JlY2VpdmVfSVQoKSBhbmQgSEFMX1NQSV9SZWNlaXZlX0RNQSgpCisgICAgICAgICAgICAoIykgVFggcHJvY2Vzc2VzIGFyZSBIQUxfU1BJX1RyYW5zbWl0KCksIEhBTF9TUElfVHJhbnNtaXRfSVQoKSBhbmQgSEFMX1NQSV9UcmFuc21pdF9ETUEoKQorCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBTUEkgU1BJCisgICogQGJyaWVmIFNQSSBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisjaWZkZWYgSEFMX1NQSV9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU1BJX1ByaXZhdGVfQ29uc3RhbnRzIFNQSSBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisjZGVmaW5lIFNQSV9ERUZBVUxUX1RJTUVPVVQgMTAwVQorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTUElfUHJpdmF0ZV9GdW5jdGlvbnMgU1BJIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9ETUFUcmFuc21pdENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU1BJX0RNQVJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNQSV9ETUFUcmFuc21pdFJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNQSV9ETUFIYWxmVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNQSV9ETUFIYWxmUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU1BJX0RNQUhhbGZUcmFuc21pdFJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNQSV9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBTUElfRE1BQWJvcnRPbkVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNQSV9ETUFUeEFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU1BJX0RNQVJ4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQzMl90IEZsYWcsIHVpbnQzMl90IFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IFRpY2tzdGFydCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1BJX1dhaXRGaWZvU3RhdGVVbnRpbFRpbWVvdXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQzMl90IEZpZm8sIHVpbnQzMl90IFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IFRpY2tzdGFydCk7CitzdGF0aWMgdm9pZCBTUElfVHhJU1JfOEJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitzdGF0aWMgdm9pZCBTUElfVHhJU1JfMTZCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworc3RhdGljIHZvaWQgU1BJX1J4SVNSXzhCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworc3RhdGljIHZvaWQgU1BJX1J4SVNSXzE2QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3N0YXRpYyB2b2lkIFNQSV8ybGluZXNSeElTUl84QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3N0YXRpYyB2b2lkIFNQSV8ybGluZXNUeElTUl84QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3N0YXRpYyB2b2lkIFNQSV8ybGluZXNUeElTUl8xNkJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitzdGF0aWMgdm9pZCBTUElfMmxpbmVzUnhJU1JfMTZCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKK3N0YXRpYyB2b2lkIFNQSV9SeElTUl84QklUQ1JDKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3N0YXRpYyB2b2lkIFNQSV9SeElTUl8xNkJJVENSQyhzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitzdGF0aWMgdm9pZCBTUElfMmxpbmVzUnhJU1JfOEJJVENSQyhzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitzdGF0aWMgdm9pZCBTUElfMmxpbmVzUnhJU1JfMTZCSVRDUkMoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCitzdGF0aWMgdm9pZCBTUElfQWJvcnRSeF9JU1IoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworc3RhdGljIHZvaWQgU1BJX0Fib3J0VHhfSVNSKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3N0YXRpYyB2b2lkIFNQSV9DbG9zZVJ4VHhfSVNSKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3N0YXRpYyB2b2lkIFNQSV9DbG9zZVJ4X0lTUihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitzdGF0aWMgdm9pZCBTUElfQ2xvc2VUeF9JU1IoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNQSV9FbmRSeFRyYW5zYWN0aW9uKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50MzJfdCBUaW1lb3V0LCB1aW50MzJfdCBUaWNrc3RhcnQpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNQSV9FbmRSeFR4VHJhbnNhY3Rpb24oU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IFRpY2tzdGFydCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTUElfRXhwb3J0ZWRfRnVuY3Rpb25zIFNQSSBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gaW5pdGlhbGl6ZSBhbmQKKyAgICAgICAgICBkZS1pbml0aWFsaXplIHRoZSBTUEl4IHBlcmlwaGVyYWw6CisKKyAgICAgICgrKSBVc2VyIG11c3QgaW1wbGVtZW50IEhBTF9TUElfTXNwSW5pdCgpIGZ1bmN0aW9uIGluIHdoaWNoIGhlIGNvbmZpZ3VyZXMKKyAgICAgICAgICBhbGwgcmVsYXRlZCBwZXJpcGhlcmFscyByZXNvdXJjZXMgKENMT0NLLCBHUElPLCBETUEsIElUIGFuZCBOVklDICkuCisKKyAgICAgICgrKSBDYWxsIHRoZSBmdW5jdGlvbiBIQUxfU1BJX0luaXQoKSB0byBjb25maWd1cmUgdGhlIHNlbGVjdGVkIGRldmljZSB3aXRoCisgICAgICAgICAgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb246CisgICAgICAgICgrKykgTW9kZQorICAgICAgICAoKyspIERpcmVjdGlvbgorICAgICAgICAoKyspIERhdGEgU2l6ZQorICAgICAgICAoKyspIENsb2NrIFBvbGFyaXR5IGFuZCBQaGFzZQorICAgICAgICAoKyspIE5TUyBNYW5hZ2VtZW50CisgICAgICAgICgrKykgQmF1ZFJhdGUgUHJlc2NhbGVyCisgICAgICAgICgrKykgRmlyc3RCaXQKKyAgICAgICAgKCsrKSBUSU1vZGUKKyAgICAgICAgKCsrKSBDUkMgQ2FsY3VsYXRpb24KKyAgICAgICAgKCsrKSBDUkMgUG9seW5vbWlhbCBpZiBDUkMgZW5hYmxlZAorICAgICAgICAoKyspIENSQyBMZW5ndGgsIHVzZWQgb25seSB3aXRoIERhdGE4IGFuZCBEYXRhMTYKKyAgICAgICAgKCsrKSBGSUZPIHJlY2VwdGlvbiB0aHJlc2hvbGQKKworICAgICAgKCspIENhbGwgdGhlIGZ1bmN0aW9uIEhBTF9TUElfRGVJbml0KCkgdG8gcmVzdG9yZSB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCisgICAgICAgICAgb2YgdGhlIHNlbGVjdGVkIFNQSXggcGVyaXBoZXJhbC4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBTUEkgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycworICAqICAgICAgICAgaW4gdGhlIFNQSV9Jbml0VHlwZURlZiBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX0luaXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIHVpbnQzMl90IGZyeHRoOworCisgIC8qIENoZWNrIHRoZSBTUEkgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGhzcGkgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0FMTF9JTlNUQU5DRShoc3BpLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU1BJX01PREUoaHNwaS0+SW5pdC5Nb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19TUElfRElSRUNUSU9OKGhzcGktPkluaXQuRGlyZWN0aW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19TUElfREFUQVNJWkUoaHNwaS0+SW5pdC5EYXRhU2l6ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU1BJX05TUyhoc3BpLT5Jbml0Lk5TUykpOworICBhc3NlcnRfcGFyYW0oSVNfU1BJX05TU1AoaHNwaS0+SW5pdC5OU1NQTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0JBVURSQVRFX1BSRVNDQUxFUihoc3BpLT5Jbml0LkJhdWRSYXRlUHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19TUElfRklSU1RfQklUKGhzcGktPkluaXQuRmlyc3RCaXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9USU1PREUoaHNwaS0+SW5pdC5USU1vZGUpKTsKKyAgaWYgKGhzcGktPkluaXQuVElNb2RlID09IFNQSV9USU1PREVfRElTQUJMRSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19TUElfQ1BPTChoc3BpLT5Jbml0LkNMS1BvbGFyaXR5KSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1NQSV9DUEhBKGhzcGktPkluaXQuQ0xLUGhhc2UpKTsKKyAgfQorI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9DUkNfQ0FMQ1VMQVRJT04oaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbikpOworICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1NQSV9DUkNfUE9MWU5PTUlBTChoc3BpLT5Jbml0LkNSQ1BvbHlub21pYWwpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfU1BJX0NSQ19MRU5HVEgoaHNwaS0+SW5pdC5DUkNMZW5ndGgpKTsKKyAgfQorI2Vsc2UKKyAgaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9IFNQSV9DUkNDQUxDVUxBVElPTl9ESVNBQkxFOworI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgaWYgKGhzcGktPlN0YXRlID09IEhBTF9TUElfU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHNwaS0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDLi4uICovCisgICAgSEFMX1NQSV9Nc3BJbml0KGhzcGkpOworICB9CisKKyAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgU1BJIHBlcmlwaGVyYWwgKi8KKyAgX19IQUxfU1BJX0RJU0FCTEUoaHNwaSk7CisKKyAgLyogQWxpZ24gYnkgZGVmYXVsdCB0aGUgcnMgZmlmbyB0aHJlc2hvbGQgb24gdGhlIGRhdGEgc2l6ZSAqLworICBpZiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSA+IFNQSV9EQVRBU0laRV84QklUKQorICB7CisgICAgZnJ4dGggPSBTUElfUlhGSUZPX1RIUkVTSE9MRF9IRjsKKyAgfQorICBlbHNlCisgIHsKKyAgICBmcnh0aCA9IFNQSV9SWEZJRk9fVEhSRVNIT0xEX1FGOworICB9CisKKyAgLyogQ1JDIGNhbGN1bGF0aW9uIGlzIHZhbGlkIG9ubHkgZm9yIDE2Qml0IGFuZCA4IEJpdCAqLworICBpZiAoKGhzcGktPkluaXQuRGF0YVNpemUgIT0gU1BJX0RBVEFTSVpFXzE2QklUKSAmJiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSAhPSBTUElfREFUQVNJWkVfOEJJVCkpCisgIHsKKyAgICAvKiBDUkMgbXVzdCBiZSBkaXNhYmxlZCAqLworICAgIGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPSBTUElfQ1JDQ0FMQ1VMQVRJT05fRElTQUJMRTsKKyAgfQorCisgIC8qIEFsaWduIHRoZSBDUkMgTGVuZ3RoIG9uIHRoZSBkYXRhIHNpemUgKi8KKyAgaWYgKGhzcGktPkluaXQuQ1JDTGVuZ3RoID09IFNQSV9DUkNfTEVOR1RIX0RBVEFTSVpFKQorICB7CisgICAgLyogQ1JDIExlbmd0aCBhbGlnbmVkIG9uIHRoZSBkYXRhIHNpemUgOiB2YWx1ZSBzZXQgYnkgZGVmYXVsdCAqLworICAgIGlmIChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpCisgICAgeworICAgICAgaHNwaS0+SW5pdC5DUkNMZW5ndGggPSBTUElfQ1JDX0xFTkdUSF8xNkJJVDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhzcGktPkluaXQuQ1JDTGVuZ3RoID0gU1BJX0NSQ19MRU5HVEhfOEJJVDsKKyAgICB9CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNQSXggQ1IxICYgQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ29uZmlndXJlIDogU1BJIE1vZGUsIENvbW11bmljYXRpb24gTW9kZSwgQ2xvY2sgcG9sYXJpdHkgYW5kIHBoYXNlLCBOU1MgbWFuYWdlbWVudCwKKyAgQ29tbXVuaWNhdGlvbiBzcGVlZCwgRmlyc3QgYml0IGFuZCBDUkMgY2FsY3VsYXRpb24gc3RhdGUgKi8KKyAgV1JJVEVfUkVHKGhzcGktPkluc3RhbmNlLT5DUjEsIChoc3BpLT5Jbml0Lk1vZGUgfCBoc3BpLT5Jbml0LkRpcmVjdGlvbiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHNwaS0+SW5pdC5DTEtQb2xhcml0eSB8IGhzcGktPkluaXQuQ0xLUGhhc2UgfCAoaHNwaS0+SW5pdC5OU1MgJiBTUElfQ1IxX1NTTSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhzcGktPkluaXQuQmF1ZFJhdGVQcmVzY2FsZXIgfCBoc3BpLT5Jbml0LkZpcnN0Qml0ICB8IGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24pKTsKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qIENvbmZpZ3VyZSA6IENSQyBMZW5ndGggKi8KKyAgaWYgKGhzcGktPkluaXQuQ1JDTGVuZ3RoID09IFNQSV9DUkNfTEVOR1RIXzE2QklUKQorICB7CisgICAgaHNwaS0+SW5zdGFuY2UtPkNSMSB8PSBTUElfQ1IxX0NSQ0w7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIENvbmZpZ3VyZSA6IE5TUyBtYW5hZ2VtZW50LCBUSSBNb2RlLCBOU1MgUHVsc2UsIERhdGEgc2l6ZSBhbmQgUnggRmlmbyBUaHJlc2hvbGQgKi8KKyAgV1JJVEVfUkVHKGhzcGktPkluc3RhbmNlLT5DUjIsICgoKGhzcGktPkluaXQuTlNTID4+IDE2VSkgJiBTUElfQ1IyX1NTT0UpIHwgaHNwaS0+SW5pdC5USU1vZGUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhzcGktPkluaXQuTlNTUE1vZGUgfCBoc3BpLT5Jbml0LkRhdGFTaXplKSB8IGZyeHRoKTsKKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNQSXggQ1JDUE9MWSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENvbmZpZ3VyZSA6IENSQyBQb2x5bm9taWFsICovCisgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgIHsKKyAgICBXUklURV9SRUcoaHNwaS0+SW5zdGFuY2UtPkNSQ1BSLCBoc3BpLT5Jbml0LkNSQ1BvbHlub21pYWwpOworICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworI2lmIGRlZmluZWQoU1BJX0kyU0NGR1JfSTJTTU9EKQorICAvKiBBY3RpdmF0ZSB0aGUgU1BJIG1vZGUgKE1ha2Ugc3VyZSB0aGF0IEkyU01PRCBiaXQgaW4gSTJTQ0ZHUiByZWdpc3RlciBpcyByZXNldCkgKi8KKyAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9JMlNNT0QpOworI2VuZGlmIC8qIFNQSV9JMlNDRkdSX0kyU01PRCAqLworCisgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfTk9ORTsKKyAgaHNwaS0+U3RhdGUgICAgID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlLUluaXRpYWxpemUgdGhlIFNQSSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9EZUluaXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIENoZWNrIHRoZSBTUEkgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGhzcGkgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayBTUEkgSW5zdGFuY2UgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19TUElfQUxMX0lOU1RBTkNFKGhzcGktPkluc3RhbmNlKSk7CisKKyAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgU1BJIFBlcmlwaGVyYWwgQ2xvY2sgKi8KKyAgX19IQUxfU1BJX0RJU0FCTEUoaHNwaSk7CisKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IEdQSU8sIENMT0NLLCBOVklDLi4uICovCisgIEhBTF9TUElfTXNwRGVJbml0KGhzcGkpOworCisgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfTk9ORTsKKyAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFU0VUOworCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHNwaSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBTUEkgTVNQLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NQSV9Nc3BJbml0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc3BpKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NQSV9Nc3BJbml0IHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlLUluaXRpYWxpemUgdGhlIFNQSSBNU1AuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU1BJX01zcERlSW5pdChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNwaSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TUElfTXNwRGVJbml0IHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBEYXRhIHRyYW5zZmVycyBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBtYW5hZ2UgdGhlIFNQSQorICAgIGRhdGEgdHJhbnNmZXJzLgorCisgICAgWy4uXSBUaGUgU1BJIHN1cHBvcnRzIG1hc3RlciBhbmQgc2xhdmUgbW9kZSA6CisKKyAgICAoIykgVGhlcmUgYXJlIHR3byBtb2RlcyBvZiB0cmFuc2ZlcjoKKyAgICAgICAoKyspIEJsb2NraW5nIG1vZGU6IFRoZSBjb21tdW5pY2F0aW9uIGlzIHBlcmZvcm1lZCBpbiBwb2xsaW5nIG1vZGUuCisgICAgICAgICAgICBUaGUgSEFMIHN0YXR1cyBvZiBhbGwgZGF0YSBwcm9jZXNzaW5nIGlzIHJldHVybmVkIGJ5IHRoZSBzYW1lIGZ1bmN0aW9uCisgICAgICAgICAgICBhZnRlciBmaW5pc2hpbmcgdHJhbnNmZXIuCisgICAgICAgKCsrKSBOby1CbG9ja2luZyBtb2RlOiBUaGUgY29tbXVuaWNhdGlvbiBpcyBwZXJmb3JtZWQgdXNpbmcgSW50ZXJydXB0cworICAgICAgICAgICAgb3IgRE1BLCBUaGVzZSBBUElzIHJldHVybiB0aGUgSEFMIHN0YXR1cy4KKyAgICAgICAgICAgIFRoZSBlbmQgb2YgdGhlIGRhdGEgcHJvY2Vzc2luZyB3aWxsIGJlIGluZGljYXRlZCB0aHJvdWdoIHRoZQorICAgICAgICAgICAgZGVkaWNhdGVkIFNQSSBJUlEgd2hlbiB1c2luZyBJbnRlcnJ1cHQgbW9kZSBvciB0aGUgRE1BIElSUSB3aGVuCisgICAgICAgICAgICB1c2luZyBETUEgbW9kZS4KKyAgICAgICAgICAgIFRoZSBIQUxfU1BJX1R4Q3BsdENhbGxiYWNrKCksIEhBTF9TUElfUnhDcGx0Q2FsbGJhY2soKSBhbmQgSEFMX1NQSV9UeFJ4Q3BsdENhbGxiYWNrKCkgdXNlciBjYWxsYmFja3MKKyAgICAgICAgICAgIHdpbGwgYmUgZXhlY3V0ZWQgcmVzcGVjdGl2ZWx5IGF0IHRoZSBlbmQgb2YgdGhlIHRyYW5zbWl0IG9yIFJlY2VpdmUgcHJvY2VzcworICAgICAgICAgICAgVGhlIEhBTF9TUElfRXJyb3JDYWxsYmFjaygpdXNlciBjYWxsYmFjayB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gYSBjb21tdW5pY2F0aW9uIGVycm9yIGlzIGRldGVjdGVkCisKKyAgICAoIykgQVBJcyBwcm92aWRlZCBmb3IgdGhlc2UgMiB0cmFuc2ZlciBtb2RlcyAoQmxvY2tpbmcgbW9kZSBvciBOb24gYmxvY2tpbmcgbW9kZSB1c2luZyBlaXRoZXIgSW50ZXJydXB0IG9yIERNQSkKKyAgICAgICAgZXhpc3QgZm9yIDFMaW5lIChzaW1wbGV4KSBhbmQgMkxpbmVzIChmdWxsIGR1cGxleCkgbW9kZXMuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXQgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1RyYW5zbWl0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gMFU7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGVycm9yY29kZSA9IEhBTF9PSzsKKworCisgIC8qIENoZWNrIERpcmVjdGlvbiBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9ESVJFQ1RJT05fMkxJTkVTX09SXzFMSU5FKGhzcGktPkluaXQuRGlyZWN0aW9uKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3BpKTsKKworICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50Ki8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICBpZiAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9SRUFEWSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9CVVNZOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgLyogU2V0IHRoZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiAqLworICBoc3BpLT5TdGF0ZSAgICAgICA9IEhBTF9TUElfU1RBVEVfQlVTWV9UWDsKKyAgaHNwaS0+RXJyb3JDb2RlICAgPSBIQUxfU1BJX0VSUk9SX05PTkU7CisgIGhzcGktPnBUeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilwRGF0YTsKKyAgaHNwaS0+VHhYZmVyU2l6ZSAgPSBTaXplOworICBoc3BpLT5UeFhmZXJDb3VudCA9IFNpemU7CisKKyAgLypJbml0IGZpZWxkIG5vdCB1c2VkIGluIGhhbmRsZSB0byB6ZXJvICovCisgIGhzcGktPnBSeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilOVUxMOworICBoc3BpLT5SeFhmZXJTaXplICA9IDBVOworICBoc3BpLT5SeFhmZXJDb3VudCA9IDBVOworICBoc3BpLT5UeElTUiAgICAgICA9IE5VTEw7CisgIGhzcGktPlJ4SVNSICAgICAgID0gTlVMTDsKKworICAvKiBDb25maWd1cmUgY29tbXVuaWNhdGlvbiBkaXJlY3Rpb24gOiAxTGluZSAqLworICBpZiAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8xTElORSkKKyAgeworICAgIFNQSV8xTElORV9UWChoc3BpKTsKKyAgfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBSZXNldCBDUkMgQ2FsY3VsYXRpb24gKi8KKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgeworICAgIFNQSV9SRVNFVF9DUkMoaHNwaSk7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIENoZWNrIGlmIHRoZSBTUEkgaXMgYWxyZWFkeSBlbmFibGVkICovCisgIGlmICgoaHNwaS0+SW5zdGFuY2UtPkNSMSAmIFNQSV9DUjFfU1BFKSAhPSBTUElfQ1IxX1NQRSkKKyAgeworICAgIC8qIEVuYWJsZSBTUEkgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX1NQSV9FTkFCTEUoaHNwaSk7CisgIH0KKworICAvKiBUcmFuc21pdCBkYXRhIGluIDE2IEJpdCBtb2RlICovCisgIGlmIChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpCisgIHsKKyAgICBpZiAoKGhzcGktPkluaXQuTW9kZSA9PSBTUElfTU9ERV9TTEFWRSkgfHwgKGhzcGktPlR4WGZlckNvdW50ID09IDB4MDFVKSkKKyAgICB7CisgICAgICBoc3BpLT5JbnN0YW5jZS0+RFIgPSAqKCh1aW50MTZfdCAqKXBEYXRhKTsKKyAgICAgIHBEYXRhICs9IHNpemVvZih1aW50MTZfdCk7CisgICAgICBoc3BpLT5UeFhmZXJDb3VudC0tOworICAgIH0KKyAgICAvKiBUcmFuc21pdCBkYXRhIGluIDE2IEJpdCBtb2RlICovCisgICAgd2hpbGUgKGhzcGktPlR4WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgLyogV2FpdCB1bnRpbCBUWEUgZmxhZyBpcyBzZXQgdG8gc2VuZCBkYXRhICovCisgICAgICBpZiAoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIFNQSV9GTEFHX1RYRSkpCisgICAgICB7CisgICAgICAgIGhzcGktPkluc3RhbmNlLT5EUiA9ICooKHVpbnQxNl90ICopcERhdGEpOworICAgICAgICBwRGF0YSArPSBzaXplb2YodWludDE2X3QpOworICAgICAgICBoc3BpLT5UeFhmZXJDb3VudC0tOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBUaW1lb3V0IG1hbmFnZW1lbnQgKi8KKyAgICAgICAgaWYgKChUaW1lb3V0ID09IDBVKSB8fCAoKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkgJiYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+PSAgVGltZW91dCkpKQorICAgICAgICB7CisgICAgICAgICAgZXJyb3Jjb2RlID0gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICAvKiBUcmFuc21pdCBkYXRhIGluIDggQml0IG1vZGUgKi8KKyAgZWxzZQorICB7CisgICAgaWYgKChoc3BpLT5Jbml0Lk1vZGUgPT0gU1BJX01PREVfU0xBVkUpIHx8IChoc3BpLT5UeFhmZXJDb3VudCA9PSAweDAxVSkpCisgICAgeworICAgICAgaWYgKGhzcGktPlR4WGZlckNvdW50ID4gMVUpCisgICAgICB7CisgICAgICAgIC8qIHdyaXRlIG9uIHRoZSBkYXRhIHJlZ2lzdGVyIGluIHBhY2tpbmcgbW9kZSAqLworICAgICAgICBoc3BpLT5JbnN0YW5jZS0+RFIgPSAqKCh1aW50MTZfdCAqKXBEYXRhKTsKKyAgICAgICAgcERhdGEgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgICAgICAgaHNwaS0+VHhYZmVyQ291bnQgLT0gMlU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICooKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFIpID0gKCpwRGF0YSsrKTsKKyAgICAgICAgaHNwaS0+VHhYZmVyQ291bnQtLTsKKyAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKGhzcGktPlR4WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgLyogV2FpdCB1bnRpbCBUWEUgZmxhZyBpcyBzZXQgdG8gc2VuZCBkYXRhICovCisgICAgICBpZiAoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIFNQSV9GTEFHX1RYRSkpCisgICAgICB7CisgICAgICAgIGlmIChoc3BpLT5UeFhmZXJDb3VudCA+IDFVKQorICAgICAgICB7CisgICAgICAgICAgLyogd3JpdGUgb24gdGhlIGRhdGEgcmVnaXN0ZXIgaW4gcGFja2luZyBtb2RlICovCisgICAgICAgICAgaHNwaS0+SW5zdGFuY2UtPkRSID0gKigodWludDE2X3QgKilwRGF0YSk7CisgICAgICAgICAgcERhdGEgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgICAgICAgICBoc3BpLT5UeFhmZXJDb3VudCAtPSAyVTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAqKChfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSKSA9ICgqcERhdGErKyk7CisgICAgICAgICAgaHNwaS0+VHhYZmVyQ291bnQtLTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBUaW1lb3V0IG1hbmFnZW1lbnQgKi8KKyAgICAgICAgaWYgKChUaW1lb3V0ID09IDBVKSB8fCAoKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkgJiYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+PSAgVGltZW91dCkpKQorICAgICAgICB7CisgICAgICAgICAgZXJyb3Jjb2RlID0gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyogRW5hYmxlIENSQyBUcmFuc21pc3Npb24gKi8KKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgeworICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9DUkNORVhUKTsKKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgLyogQ2hlY2sgdGhlIGVuZCBvZiB0aGUgdHJhbnNhY3Rpb24gKi8KKyAgaWYgKFNQSV9FbmRSeFR4VHJhbnNhY3Rpb24oaHNwaSwgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgIHsKKyAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0ZMQUc7CisgIH0KKworICAvKiBDbGVhciBvdmVycnVuIGZsYWcgaW4gMiBMaW5lcyBjb21tdW5pY2F0aW9uIG1vZGUgYmVjYXVzZSByZWNlaXZlZCBpcyBub3QgcmVhZCAqLworICBpZiAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8yTElORVMpCisgIHsKKyAgICBfX0hBTF9TUElfQ0xFQVJfT1ZSRkxBRyhoc3BpKTsKKyAgfQorCisgIGlmIChoc3BpLT5FcnJvckNvZGUgIT0gSEFMX1NQSV9FUlJPUl9OT05FKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOworICB9CisKK2Vycm9yOgorICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzcGkpOworICByZXR1cm4gZXJyb3Jjb2RlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgcmVjZWl2ZWQKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9SZWNlaXZlKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIF9fSU8gdWludDE2X3QgdG1wcmVnID0gMFU7CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gMFU7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGVycm9yY29kZSA9IEhBTF9PSzsKKworCisgIGlmICgoaHNwaS0+SW5pdC5Nb2RlID09IFNQSV9NT0RFX01BU1RFUikgJiYgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTKSkKKyAgeworICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9CVVNZX1JYOworICAgIC8qIENhbGwgdHJhbnNtaXQtcmVjZWl2ZSBmdW5jdGlvbiB0byBzZW5kIER1bW15IGRhdGEgb24gVHggbGluZSBhbmQgZ2VuZXJhdGUgY2xvY2sgb24gQ0xLIGxpbmUgKi8KKyAgICByZXR1cm4gSEFMX1NQSV9UcmFuc21pdFJlY2VpdmUoaHNwaSwgcERhdGEsIHBEYXRhLCBTaXplLCBUaW1lb3V0KTsKKyAgfQorCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNwaSk7CisKKyAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgaWYgKGhzcGktPlN0YXRlICE9IEhBTF9TUElfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfQlVTWTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIC8qIFNldCB0aGUgdHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gKi8KKyAgaHNwaS0+U3RhdGUgICAgICAgPSBIQUxfU1BJX1NUQVRFX0JVU1lfUlg7CisgIGhzcGktPkVycm9yQ29kZSAgID0gSEFMX1NQSV9FUlJPUl9OT05FOworICBoc3BpLT5wUnhCdWZmUHRyICA9ICh1aW50OF90ICopcERhdGE7CisgIGhzcGktPlJ4WGZlclNpemUgID0gU2l6ZTsKKyAgaHNwaS0+UnhYZmVyQ291bnQgPSBTaXplOworCisgIC8qSW5pdCBmaWVsZCBub3QgdXNlZCBpbiBoYW5kbGUgdG8gemVybyAqLworICBoc3BpLT5wVHhCdWZmUHRyICA9ICh1aW50OF90ICopTlVMTDsKKyAgaHNwaS0+VHhYZmVyU2l6ZSAgPSAwVTsKKyAgaHNwaS0+VHhYZmVyQ291bnQgPSAwVTsKKyAgaHNwaS0+UnhJU1IgICAgICAgPSBOVUxMOworICBoc3BpLT5UeElTUiAgICAgICA9IE5VTEw7CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qIFJlc2V0IENSQyBDYWxjdWxhdGlvbiAqLworICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICB7CisgICAgU1BJX1JFU0VUX0NSQyhoc3BpKTsKKyAgICAvKiB0aGlzIGlzIGRvbmUgdG8gaGFuZGxlIHRoZSBDUkNORVhUIGJlZm9yZSB0aGUgbGF0ZXN0IGRhdGEgKi8KKyAgICBoc3BpLT5SeFhmZXJDb3VudC0tOworICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAvKiBTZXQgdGhlIFJ4IEZpRm8gdGhyZXNob2xkICovCisgIGlmIChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpCisgIHsKKyAgICAvKiBzZXQgZmlmb3J4dGhyZXNvbGQgYWNjb3JkaW5nIHRoZSByZWNlcHRpb24gZGF0YSBsZW5ndGg6IDE2Yml0ICovCisgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9SWEZJRk9fVEhSRVNIT0xEKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBzZXQgZmlmb3J4dGhyZXNvbGQgYWNjb3JkaW5nIHRoZSByZWNlcHRpb24gZGF0YSBsZW5ndGg6IDhiaXQgKi8KKyAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9SWEZJRk9fVEhSRVNIT0xEKTsKKyAgfQorCisgIC8qIENvbmZpZ3VyZSBjb21tdW5pY2F0aW9uIGRpcmVjdGlvbjogMUxpbmUgKi8KKyAgaWYgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMUxJTkUpCisgIHsKKyAgICBTUElfMUxJTkVfUlgoaHNwaSk7CisgIH0KKworICAvKiBDaGVjayBpZiB0aGUgU1BJIGlzIGFscmVhZHkgZW5hYmxlZCAqLworICBpZiAoKGhzcGktPkluc3RhbmNlLT5DUjEgJiBTUElfQ1IxX1NQRSkgIT0gU1BJX0NSMV9TUEUpCisgIHsKKyAgICAvKiBFbmFibGUgU1BJIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9TUElfRU5BQkxFKGhzcGkpOworICB9CisKKyAgLyogUmVjZWl2ZSBkYXRhIGluIDggQml0IG1vZGUgKi8KKyAgaWYgKGhzcGktPkluaXQuRGF0YVNpemUgPD0gU1BJX0RBVEFTSVpFXzhCSVQpCisgIHsKKyAgICAvKiBUcmFuc2ZlciBsb29wICovCisgICAgd2hpbGUgKGhzcGktPlJ4WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIFJYTkUgZmxhZyAqLworICAgICAgaWYgKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBTUElfRkxBR19SWE5FKSkKKyAgICAgIHsKKyAgICAgICAgLyogcmVhZCB0aGUgcmVjZWl2ZWQgZGF0YSAqLworICAgICAgICAoKiAodWludDhfdCAqKXBEYXRhKSA9ICooX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUjsKKyAgICAgICAgcERhdGEgKz0gc2l6ZW9mKHVpbnQ4X3QpOworICAgICAgICBoc3BpLT5SeFhmZXJDb3VudC0tOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBUaW1lb3V0IG1hbmFnZW1lbnQgKi8KKyAgICAgICAgaWYgKChUaW1lb3V0ID09IDBVKSB8fCAoKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkgJiYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+PSAgVGltZW91dCkpKQorICAgICAgICB7CisgICAgICAgICAgZXJyb3Jjb2RlID0gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBUcmFuc2ZlciBsb29wICovCisgICAgd2hpbGUgKGhzcGktPlJ4WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIFJYTkUgZmxhZyAqLworICAgICAgaWYgKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBTUElfRkxBR19SWE5FKSkKKyAgICAgIHsKKyAgICAgICAgKigodWludDE2X3QgKilwRGF0YSkgPSBoc3BpLT5JbnN0YW5jZS0+RFI7CisgICAgICAgIHBEYXRhICs9IHNpemVvZih1aW50MTZfdCk7CisgICAgICAgIGhzcGktPlJ4WGZlckNvdW50LS07CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFRpbWVvdXQgbWFuYWdlbWVudCAqLworICAgICAgICBpZiAoKFRpbWVvdXQgPT0gMFUpIHx8ICgoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKSAmJiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID49ICBUaW1lb3V0KSkpCisgICAgICAgIHsKKyAgICAgICAgICBlcnJvcmNvZGUgPSBIQUxfVElNRU9VVDsKKyAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qIEhhbmRsZSB0aGUgQ1JDIFRyYW5zbWlzc2lvbiAqLworICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICB7CisgICAgLyogZnJlZXplIHRoZSBDUkMgYmVmb3JlIHRoZSBsYXRlc3QgZGF0YSAqLworICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9DUkNORVhUKTsKKworICAgIC8qIFJlYWQgdGhlIGxhdGVzdCBkYXRhICovCisgICAgaWYgKFNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX1JYTkUsIFNFVCwgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogdGhlIGxhdGVzdCBkYXRhIGhhcyBub3QgYmVlbiByZWNlaXZlZCAqLworICAgICAgZXJyb3Jjb2RlID0gSEFMX1RJTUVPVVQ7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIC8qIFJlY2VpdmUgbGFzdCBkYXRhIGluIDE2IEJpdCBtb2RlICovCisgICAgaWYgKGhzcGktPkluaXQuRGF0YVNpemUgPiBTUElfREFUQVNJWkVfOEJJVCkKKyAgICB7CisgICAgICAqKCh1aW50MTZfdCAqKXBEYXRhKSA9IGhzcGktPkluc3RhbmNlLT5EUjsKKyAgICB9CisgICAgLyogUmVjZWl2ZSBsYXN0IGRhdGEgaW4gOCBCaXQgbW9kZSAqLworICAgIGVsc2UKKyAgICB7CisgICAgICAoKih1aW50OF90ICopcERhdGEpID0gKihfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSOworICAgIH0KKworICAgIC8qIFdhaXQgdGhlIENSQyBkYXRhICovCisgICAgaWYgKFNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX1JYTkUsIFNFVCwgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsKKyAgICAgIGVycm9yY29kZSA9IEhBTF9USU1FT1VUOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvKiBSZWFkIENSQyB0byBGbHVzaCBEUiBhbmQgUlhORSBmbGFnICovCisgICAgaWYgKGhzcGktPkluaXQuRGF0YVNpemUgPT0gU1BJX0RBVEFTSVpFXzE2QklUKQorICAgIHsKKyAgICAgIHRtcHJlZyA9IGhzcGktPkluc3RhbmNlLT5EUjsKKyAgICAgIC8qIFRvIGF2b2lkIEdDQyB3YXJuaW5nICovCisgICAgICBVTlVTRUQodG1wcmVnKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHRtcHJlZyA9ICooX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUjsKKyAgICAgIC8qIFRvIGF2b2lkIEdDQyB3YXJuaW5nICovCisgICAgICBVTlVTRUQodG1wcmVnKTsKKworICAgICAgaWYgKChoc3BpLT5Jbml0LkRhdGFTaXplID09IFNQSV9EQVRBU0laRV84QklUKSAmJiAoaHNwaS0+SW5pdC5DUkNMZW5ndGggPT0gU1BJX0NSQ19MRU5HVEhfMTZCSVQpKQorICAgICAgeworICAgICAgICBpZiAoU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfUlhORSwgU1BJX0ZMQUdfUlhORSwgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICAvKiBFcnJvciBvbiB0aGUgQ1JDIHJlY2VwdGlvbiAqLworICAgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0NSQyk7CisgICAgICAgICAgZXJyb3Jjb2RlID0gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICB0bXByZWcgPSAqKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFI7CisgICAgICAgIC8qIFRvIGF2b2lkIEdDQyB3YXJuaW5nICovCisgICAgICAgIFVOVVNFRCh0bXByZWcpOworICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgLyogQ2hlY2sgdGhlIGVuZCBvZiB0aGUgdHJhbnNhY3Rpb24gKi8KKyAgaWYgKFNQSV9FbmRSeFRyYW5zYWN0aW9uKGhzcGksIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICB7CisgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9GTEFHOworICB9CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qIENoZWNrIGlmIENSQyBlcnJvciBvY2N1cnJlZCAqLworICBpZiAoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIFNQSV9GTEFHX0NSQ0VSUikpCisgIHsKKyAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9DUkMpOworICAgIF9fSEFMX1NQSV9DTEVBUl9DUkNFUlJGTEFHKGhzcGkpOworICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICBpZiAoaHNwaS0+RXJyb3JDb2RlICE9IEhBTF9TUElfRVJST1JfTk9ORSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgfQorCitlcnJvciA6CisgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKyAgX19IQUxfVU5MT0NLKGhzcGkpOworICByZXR1cm4gZXJyb3Jjb2RlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRyYW5zbWl0IGFuZCBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHBhcmFtICBwVHhEYXRhIHBvaW50ZXIgdG8gdHJhbnNtaXNzaW9uIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBwUnhEYXRhIHBvaW50ZXIgdG8gcmVjZXB0aW9uIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQgYW5kIHJlY2VpdmVkCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwVHhEYXRhLCB1aW50OF90ICpwUnhEYXRhLCB1aW50MTZfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdG1wID0gMFUsIHRtcDEgPSAwVTsKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIF9fSU8gdWludDE2X3QgdG1wcmVnID0gMFU7CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gMFU7CisgIC8qIFZhcmlhYmxlIHVzZWQgdG8gYWx0ZXJuYXRlIFJ4IGFuZCBUeCBkdXJpbmcgdHJhbnNmZXIgKi8KKyAgdWludDMyX3QgdHhhbGxvd2VkID0gMVU7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGVycm9yY29kZSA9IEhBTF9PSzsKKworCisgIC8qIENoZWNrIERpcmVjdGlvbiBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9ESVJFQ1RJT05fMkxJTkVTKGhzcGktPkluaXQuRGlyZWN0aW9uKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3BpKTsKKworICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50Ki8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICB0bXAgID0gaHNwaS0+U3RhdGU7CisgIHRtcDEgPSBoc3BpLT5Jbml0Lk1vZGU7CisKKyAgaWYgKCEoKHRtcCA9PSBIQUxfU1BJX1NUQVRFX1JFQURZKSB8fCBcCisgICAgICAgICgodG1wMSA9PSBTUElfTU9ERV9NQVNURVIpICYmIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykgJiYgKHRtcCA9PSBIQUxfU1BJX1NUQVRFX0JVU1lfUlgpKSkpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfQlVTWTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgaWYgKChwVHhEYXRhID09IE5VTEwpIHx8IChwUnhEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgLyogRG9uJ3Qgb3ZlcndyaXRlIGluIGNhc2Ugb2YgSEFMX1NQSV9TVEFURV9CVVNZX1JYICovCisgIGlmIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX0JVU1lfUlgpCisgIHsKKyAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfQlVTWV9UWF9SWDsKKyAgfQorCisgIC8qIFNldCB0aGUgdHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gKi8KKyAgaHNwaS0+RXJyb3JDb2RlICAgPSBIQUxfU1BJX0VSUk9SX05PTkU7CisgIGhzcGktPnBSeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilwUnhEYXRhOworICBoc3BpLT5SeFhmZXJDb3VudCA9IFNpemU7CisgIGhzcGktPlJ4WGZlclNpemUgID0gU2l6ZTsKKyAgaHNwaS0+cFR4QnVmZlB0ciAgPSAodWludDhfdCAqKXBUeERhdGE7CisgIGhzcGktPlR4WGZlckNvdW50ID0gU2l6ZTsKKyAgaHNwaS0+VHhYZmVyU2l6ZSAgPSBTaXplOworCisgIC8qSW5pdCBmaWVsZCBub3QgdXNlZCBpbiBoYW5kbGUgdG8gemVybyAqLworICBoc3BpLT5SeElTUiAgICAgICA9IE5VTEw7CisgIGhzcGktPlR4SVNSICAgICAgID0gTlVMTDsKKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyogUmVzZXQgQ1JDIENhbGN1bGF0aW9uICovCisgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgIHsKKyAgICBTUElfUkVTRVRfQ1JDKGhzcGkpOworICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAvKiBTZXQgdGhlIFJ4IEZpZm8gdGhyZXNob2xkICovCisgIGlmICgoaHNwaS0+SW5pdC5EYXRhU2l6ZSA+IFNQSV9EQVRBU0laRV84QklUKSB8fCAoaHNwaS0+UnhYZmVyQ291bnQgPiAxVSkpCisgIHsKKyAgICAvKiBzZXQgZmlmb3J4dGhyZXNob2xkIGFjY29yZGluZyB0aGUgcmVjZXB0aW9uIGRhdGEgbGVuZ3RoOiAxNmJpdCAqLworICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfUlhGSUZPX1RIUkVTSE9MRCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogc2V0IGZpZm9yeHRocmVzaG9sZCBhY2NvcmRpbmcgdGhlIHJlY2VwdGlvbiBkYXRhIGxlbmd0aDogOGJpdCAqLworICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworICB9CisKKyAgLyogQ2hlY2sgaWYgdGhlIFNQSSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKyAgaWYgKChoc3BpLT5JbnN0YW5jZS0+Q1IxICYgU1BJX0NSMV9TUEUpICE9IFNQSV9DUjFfU1BFKQorICB7CisgICAgLyogRW5hYmxlIFNQSSBwZXJpcGhlcmFsICovCisgICAgX19IQUxfU1BJX0VOQUJMRShoc3BpKTsKKyAgfQorCisgIC8qIFRyYW5zbWl0IGFuZCBSZWNlaXZlIGRhdGEgaW4gMTYgQml0IG1vZGUgKi8KKyAgaWYgKGhzcGktPkluaXQuRGF0YVNpemUgPiBTUElfREFUQVNJWkVfOEJJVCkKKyAgeworICAgIGlmICgoaHNwaS0+SW5pdC5Nb2RlID09IFNQSV9NT0RFX1NMQVZFKSB8fCAoaHNwaS0+VHhYZmVyQ291bnQgPT0gMHgwMVUpKQorICAgIHsKKyAgICAgIGhzcGktPkluc3RhbmNlLT5EUiA9ICooKHVpbnQxNl90ICopcFR4RGF0YSk7CisgICAgICBwVHhEYXRhICs9IHNpemVvZih1aW50MTZfdCk7CisgICAgICBoc3BpLT5UeFhmZXJDb3VudC0tOworICAgIH0KKyAgICB3aGlsZSAoKGhzcGktPlR4WGZlckNvdW50ID4gMFUpIHx8IChoc3BpLT5SeFhmZXJDb3VudCA+IDBVKSkKKyAgICB7CisgICAgICAvKiBDaGVjayBUWEUgZmxhZyAqLworICAgICAgaWYgKHR4YWxsb3dlZCAmJiAoaHNwaS0+VHhYZmVyQ291bnQgPiAwVSkgJiYgKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBTUElfRkxBR19UWEUpKSkKKyAgICAgIHsKKyAgICAgICAgaHNwaS0+SW5zdGFuY2UtPkRSID0gKigodWludDE2X3QgKilwVHhEYXRhKTsKKyAgICAgICAgcFR4RGF0YSArPSBzaXplb2YodWludDE2X3QpOworICAgICAgICBoc3BpLT5UeFhmZXJDb3VudC0tOworICAgICAgICAvKiBOZXh0IERhdGEgaXMgYSByZWNlcHRpb24gKFJ4KS4gVHggbm90IGFsbG93ZWQgKi8KKyAgICAgICAgdHhhbGxvd2VkID0gMFU7CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgICAgICAgIC8qIEVuYWJsZSBDUkMgVHJhbnNtaXNzaW9uICovCisgICAgICAgIGlmICgoaHNwaS0+VHhYZmVyQ291bnQgPT0gMFUpICYmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IE5TUyBTb2Z0IHRvIHJlY2VpdmVkIGNvcnJlY3RseSB0aGUgQ1JDIG9uIHNsYXZlIG1vZGUgd2l0aCBOU1MgcHVsc2UgYWN0aXZhdGVkICovCisgICAgICAgICAgaWYgKCgoaHNwaS0+SW5zdGFuY2UtPkNSMSAmIFNQSV9DUjFfTVNUUikgPT0gMFUpICYmICgoaHNwaS0+SW5zdGFuY2UtPkNSMiAmIFNQSV9DUjJfTlNTUCkgPT0gU1BJX0NSMl9OU1NQKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfU1NNKTsKKyAgICAgICAgICB9CisgICAgICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0NSQ05FWFQpOworICAgICAgICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKyAgICAgIH0KKworICAgICAgLyogQ2hlY2sgUlhORSBmbGFnICovCisgICAgICBpZiAoKGhzcGktPlJ4WGZlckNvdW50ID4gMFUpICYmIChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfUlhORSkpKQorICAgICAgeworICAgICAgICAqKCh1aW50MTZfdCAqKXBSeERhdGEpID0gaHNwaS0+SW5zdGFuY2UtPkRSOworICAgICAgICBwUnhEYXRhICs9IHNpemVvZih1aW50MTZfdCk7CisgICAgICAgIGhzcGktPlJ4WGZlckNvdW50LS07CisgICAgICAgIC8qIE5leHQgRGF0YSBpcyBhIFRyYW5zbWlzc2lvbiAoVHgpLiBUeCBpcyBhbGxvd2VkICovCisgICAgICAgIHR4YWxsb3dlZCA9IDFVOworICAgICAgfQorICAgICAgaWYgKChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpICYmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPj0gIFRpbWVvdXQpKQorICAgICAgeworICAgICAgICBlcnJvcmNvZGUgPSBIQUxfVElNRU9VVDsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogVHJhbnNtaXQgYW5kIFJlY2VpdmUgZGF0YSBpbiA4IEJpdCBtb2RlICovCisgIGVsc2UKKyAgeworICAgIGlmICgoaHNwaS0+SW5pdC5Nb2RlID09IFNQSV9NT0RFX1NMQVZFKSB8fCAoaHNwaS0+VHhYZmVyQ291bnQgPT0gMHgwMVUpKQorICAgIHsKKyAgICAgIGlmIChoc3BpLT5UeFhmZXJDb3VudCA+IDFVKQorICAgICAgeworICAgICAgICBoc3BpLT5JbnN0YW5jZS0+RFIgPSAqKCh1aW50MTZfdCAqKXBUeERhdGEpOworICAgICAgICBwVHhEYXRhICs9IHNpemVvZih1aW50MTZfdCk7CisgICAgICAgIGhzcGktPlR4WGZlckNvdW50IC09IDJVOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFIgPSAoKnBUeERhdGErKyk7CisgICAgICAgIGhzcGktPlR4WGZlckNvdW50LS07CisgICAgICB9CisgICAgfQorICAgIHdoaWxlICgoaHNwaS0+VHhYZmVyQ291bnQgPiAwVSkgfHwgKGhzcGktPlJ4WGZlckNvdW50ID4gMFUpKQorICAgIHsKKyAgICAgIC8qIGNoZWNrIFRYRSBmbGFnICovCisgICAgICBpZiAodHhhbGxvd2VkICYmIChoc3BpLT5UeFhmZXJDb3VudCA+IDBVKSAmJiAoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIFNQSV9GTEFHX1RYRSkpKQorICAgICAgeworICAgICAgICBpZiAoaHNwaS0+VHhYZmVyQ291bnQgPiAxVSkKKyAgICAgICAgeworICAgICAgICAgIGhzcGktPkluc3RhbmNlLT5EUiA9ICooKHVpbnQxNl90ICopcFR4RGF0YSk7CisgICAgICAgICAgcFR4RGF0YSArPSBzaXplb2YodWludDE2X3QpOworICAgICAgICAgIGhzcGktPlR4WGZlckNvdW50IC09IDJVOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICooX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUiA9ICgqcFR4RGF0YSsrKTsKKyAgICAgICAgICBoc3BpLT5UeFhmZXJDb3VudC0tOworICAgICAgICB9CisgICAgICAgIC8qIE5leHQgRGF0YSBpcyBhIHJlY2VwdGlvbiAoUngpLiBUeCBub3QgYWxsb3dlZCAqLworICAgICAgICB0eGFsbG93ZWQgPSAwVTsKKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgICAgICAgLyogRW5hYmxlIENSQyBUcmFuc21pc3Npb24gKi8KKyAgICAgICAgaWYgKChoc3BpLT5UeFhmZXJDb3VudCA9PSAwVSkgJiYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZXQgTlNTIFNvZnQgdG8gcmVjZWl2ZWQgY29ycmVjdGx5IHRoZSBDUkMgb24gc2xhdmUgbW9kZSB3aXRoIE5TUyBwdWxzZSBhY3RpdmF0ZWQgKi8KKyAgICAgICAgICBpZiAoKChoc3BpLT5JbnN0YW5jZS0+Q1IxICYgU1BJX0NSMV9NU1RSKSA9PSAwVSkgJiYgKChoc3BpLT5JbnN0YW5jZS0+Q1IyICYgU1BJX0NSMl9OU1NQKSA9PSBTUElfQ1IyX05TU1ApKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9TU00pOworICAgICAgICAgIH0KKyAgICAgICAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfQ1JDTkVYVCk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworICAgICAgfQorCisgICAgICAvKiBXYWl0IHVudGlsIFJYTkUgZmxhZyBpcyByZXNldCAqLworICAgICAgaWYgKChoc3BpLT5SeFhmZXJDb3VudCA+IDBVKSAmJiAoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIFNQSV9GTEFHX1JYTkUpKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKGhzcGktPlJ4WGZlckNvdW50ID4gMVUpCisgICAgICAgIHsKKyAgICAgICAgICAqKCh1aW50MTZfdCAqKXBSeERhdGEpID0gaHNwaS0+SW5zdGFuY2UtPkRSOworICAgICAgICAgIHBSeERhdGEgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgICAgICAgICBoc3BpLT5SeFhmZXJDb3VudCAtPSAyVTsKKyAgICAgICAgICBpZiAoaHNwaS0+UnhYZmVyQ291bnQgPD0gMVUpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogc2V0IGZpZm9yeHRocmVzb2xkIGJlZm9yZSB0byBzd2l0Y2ggb24gOCBiaXQgZGF0YSBzaXplICovCisgICAgICAgICAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9SWEZJRk9fVEhSRVNIT0xEKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgKCoodWludDhfdCAqKXBSeERhdGErKykgPSAqKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFI7CisgICAgICAgICAgaHNwaS0+UnhYZmVyQ291bnQtLTsKKyAgICAgICAgfQorICAgICAgICAvKiBOZXh0IERhdGEgaXMgYSBUcmFuc21pc3Npb24gKFR4KS4gVHggaXMgYWxsb3dlZCAqLworICAgICAgICB0eGFsbG93ZWQgPSAxVTsKKyAgICAgIH0KKyAgICAgIGlmICgoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKSAmJiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID49ICBUaW1lb3V0KSkKKyAgICAgIHsKKyAgICAgICAgZXJyb3Jjb2RlID0gSEFMX1RJTUVPVVQ7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICB9CisgICAgfQorICB9CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qIFJlYWQgQ1JDIGZyb20gRFIgdG8gY2xvc2UgQ1JDIGNhbGN1bGF0aW9uIHByb2Nlc3MgKi8KKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgeworICAgIC8qIFdhaXQgdW50aWwgVFhFIGZsYWcgKi8KKyAgICBpZiAoU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfUlhORSwgU0VULCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBFcnJvciBvbiB0aGUgQ1JDIHJlY2VwdGlvbiAqLworICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsKKyAgICAgIGVycm9yY29kZSA9IEhBTF9USU1FT1VUOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgLyogUmVhZCBDUkMgKi8KKyAgICBpZiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSA9PSBTUElfREFUQVNJWkVfMTZCSVQpCisgICAgeworICAgICAgdG1wcmVnID0gaHNwaS0+SW5zdGFuY2UtPkRSOworICAgICAgLyogVG8gYXZvaWQgR0NDIHdhcm5pbmcgKi8KKyAgICAgIFVOVVNFRCh0bXByZWcpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgdG1wcmVnID0gKihfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSOworICAgICAgLyogVG8gYXZvaWQgR0NDIHdhcm5pbmcgKi8KKyAgICAgIFVOVVNFRCh0bXByZWcpOworCisgICAgICBpZiAoaHNwaS0+SW5pdC5DUkNMZW5ndGggPT0gU1BJX0NSQ19MRU5HVEhfMTZCSVQpCisgICAgICB7CisgICAgICAgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19SWE5FLCBTRVQsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgLyogRXJyb3Igb24gdGhlIENSQyByZWNlcHRpb24gKi8KKyAgICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9DUkMpOworICAgICAgICAgIGVycm9yY29kZSA9IEhBTF9USU1FT1VUOworICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgdG1wcmVnID0gKihfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSOworICAgICAgICAvKiBUbyBhdm9pZCBHQ0Mgd2FybmluZyAqLworICAgICAgICBVTlVTRUQodG1wcmVnKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBDaGVjayBpZiBDUkMgZXJyb3Igb2NjdXJyZWQgKi8KKyAgaWYgKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBTUElfRkxBR19DUkNFUlIpKQorICB7CisgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsKKyAgICAvKiBDbGVhciBDUkMgRmxhZyAqLworICAgIF9fSEFMX1NQSV9DTEVBUl9DUkNFUlJGTEFHKGhzcGkpOworCisgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOworICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAvKiBDaGVjayB0aGUgZW5kIG9mIHRoZSB0cmFuc2FjdGlvbiAqLworICBpZiAoU1BJX0VuZFJ4VHhUcmFuc2FjdGlvbihoc3BpLCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgeworICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfRkxBRzsKKyAgfQorCisgIGlmIChoc3BpLT5FcnJvckNvZGUgIT0gSEFMX1NQSV9FUlJPUl9OT05FKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOworICB9CisKK2Vycm9yIDoKKyAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworICBfX0hBTF9VTkxPQ0soaHNwaSk7CisgIHJldHVybiBlcnJvcmNvZGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHBhcmFtICBwRGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVHJhbnNtaXRfSVQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBlcnJvcmNvZGUgPSBIQUxfT0s7CisKKworICAvKiBDaGVjayBEaXJlY3Rpb24gcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19TUElfRElSRUNUSU9OXzJMSU5FU19PUl8xTElORShoc3BpLT5Jbml0LkRpcmVjdGlvbikpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNwaSk7CisKKyAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIGlmIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX1JFQURZKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0JVU1k7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIC8qIFNldCB0aGUgdHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gKi8KKyAgaHNwaS0+U3RhdGUgICAgICAgPSBIQUxfU1BJX1NUQVRFX0JVU1lfVFg7CisgIGhzcGktPkVycm9yQ29kZSAgID0gSEFMX1NQSV9FUlJPUl9OT05FOworICBoc3BpLT5wVHhCdWZmUHRyICA9ICh1aW50OF90ICopcERhdGE7CisgIGhzcGktPlR4WGZlclNpemUgID0gU2l6ZTsKKyAgaHNwaS0+VHhYZmVyQ291bnQgPSBTaXplOworCisgIC8qIEluaXQgZmllbGQgbm90IHVzZWQgaW4gaGFuZGxlIHRvIHplcm8gKi8KKyAgaHNwaS0+cFJ4QnVmZlB0ciAgPSAodWludDhfdCAqKU5VTEw7CisgIGhzcGktPlJ4WGZlclNpemUgID0gMFU7CisgIGhzcGktPlJ4WGZlckNvdW50ID0gMFU7CisgIGhzcGktPlJ4SVNSICAgICAgID0gTlVMTDsKKworICAvKiBTZXQgdGhlIGZ1bmN0aW9uIGZvciBJVCB0cmVhdG1lbnQgKi8KKyAgaWYgKGhzcGktPkluaXQuRGF0YVNpemUgPiBTUElfREFUQVNJWkVfOEJJVCkKKyAgeworICAgIGhzcGktPlR4SVNSID0gU1BJX1R4SVNSXzE2QklUOworICB9CisgIGVsc2UKKyAgeworICAgIGhzcGktPlR4SVNSID0gU1BJX1R4SVNSXzhCSVQ7CisgIH0KKworICAvKiBDb25maWd1cmUgY29tbXVuaWNhdGlvbiBkaXJlY3Rpb24gOiAxTGluZSAqLworICBpZiAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8xTElORSkKKyAgeworICAgIFNQSV8xTElORV9UWChoc3BpKTsKKyAgfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBSZXNldCBDUkMgQ2FsY3VsYXRpb24gKi8KKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgeworICAgIFNQSV9SRVNFVF9DUkMoaHNwaSk7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIEVuYWJsZSBUWEUgYW5kIEVSUiBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfU1BJX0VOQUJMRV9JVChoc3BpLCAoU1BJX0lUX1RYRSB8IFNQSV9JVF9FUlIpKTsKKworCisgIC8qIENoZWNrIGlmIHRoZSBTUEkgaXMgYWxyZWFkeSBlbmFibGVkICovCisgIGlmICgoaHNwaS0+SW5zdGFuY2UtPkNSMSAmIFNQSV9DUjFfU1BFKSAhPSBTUElfQ1IxX1NQRSkKKyAgeworICAgIC8qIEVuYWJsZSBTUEkgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX1NQSV9FTkFCTEUoaHNwaSk7CisgIH0KKworZXJyb3IgOgorICBfX0hBTF9VTkxPQ0soaHNwaSk7CisgIHJldHVybiBlcnJvcmNvZGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9SZWNlaXZlX0lUKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgZXJyb3Jjb2RlID0gSEFMX09LOworCisKKyAgaWYgKChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykgJiYgKGhzcGktPkluaXQuTW9kZSA9PSBTUElfTU9ERV9NQVNURVIpKQorICB7CisgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX0JVU1lfUlg7CisgICAgLyogQ2FsbCB0cmFuc21pdC1yZWNlaXZlIGZ1bmN0aW9uIHRvIHNlbmQgRHVtbXkgZGF0YSBvbiBUeCBsaW5lIGFuZCBnZW5lcmF0ZSBjbG9jayBvbiBDTEsgbGluZSAqLworICAgIHJldHVybiBIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZV9JVChoc3BpLCBwRGF0YSwgcERhdGEsIFNpemUpOworICB9CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3BpKTsKKworICBpZiAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9SRUFEWSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9CVVNZOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgLyogU2V0IHRoZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiAqLworICBoc3BpLT5TdGF0ZSAgICAgICA9IEhBTF9TUElfU1RBVEVfQlVTWV9SWDsKKyAgaHNwaS0+RXJyb3JDb2RlICAgPSBIQUxfU1BJX0VSUk9SX05PTkU7CisgIGhzcGktPnBSeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilwRGF0YTsKKyAgaHNwaS0+UnhYZmVyU2l6ZSAgPSBTaXplOworICBoc3BpLT5SeFhmZXJDb3VudCA9IFNpemU7CisKKyAgLyogSW5pdCBmaWVsZCBub3QgdXNlZCBpbiBoYW5kbGUgdG8gemVybyAqLworICBoc3BpLT5wVHhCdWZmUHRyICA9ICh1aW50OF90ICopTlVMTDsKKyAgaHNwaS0+VHhYZmVyU2l6ZSAgPSAwVTsKKyAgaHNwaS0+VHhYZmVyQ291bnQgPSAwVTsKKyAgaHNwaS0+VHhJU1IgICAgICAgPSBOVUxMOworCisgIC8qIENoZWNrIHRoZSBkYXRhIHNpemUgdG8gYWRhcHQgUnggdGhyZXNob2xkIGFuZCB0aGUgc2V0IHRoZSBmdW5jdGlvbiBmb3IgSVQgdHJlYXRtZW50ICovCisgIGlmIChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpCisgIHsKKyAgICAvKiBTZXQgZmlmb3J4dGhyZXNvbGQgYWNjb3JkaW5nIHRoZSByZWNlcHRpb24gZGF0YSBsZW5ndGg6IDE2IGJpdCAqLworICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfUlhGSUZPX1RIUkVTSE9MRCk7CisgICAgaHNwaS0+UnhJU1IgPSBTUElfUnhJU1JfMTZCSVQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogU2V0IGZpZm9yeHRocmVzb2xkIGFjY29yZGluZyB0aGUgcmVjZXB0aW9uIGRhdGEgbGVuZ3RoOiA4IGJpdCAqLworICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworICAgIGhzcGktPlJ4SVNSID0gU1BJX1J4SVNSXzhCSVQ7CisgIH0KKworICAvKiBDb25maWd1cmUgY29tbXVuaWNhdGlvbiBkaXJlY3Rpb24gOiAxTGluZSAqLworICBpZiAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8xTElORSkKKyAgeworICAgIFNQSV8xTElORV9SWChoc3BpKTsKKyAgfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBSZXNldCBDUkMgQ2FsY3VsYXRpb24gKi8KKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgeworICAgIGhzcGktPkNSQ1NpemUgPSAxVTsKKyAgICBpZiAoKGhzcGktPkluaXQuRGF0YVNpemUgPD0gU1BJX0RBVEFTSVpFXzhCSVQpICYmIChoc3BpLT5Jbml0LkNSQ0xlbmd0aCA9PSBTUElfQ1JDX0xFTkdUSF8xNkJJVCkpCisgICAgeworICAgICAgaHNwaS0+Q1JDU2l6ZSA9IDJVOworICAgIH0KKyAgICBTUElfUkVTRVRfQ1JDKGhzcGkpOworICB9CisgIGVsc2UKKyAgeworICAgIGhzcGktPkNSQ1NpemUgPSAwVTsKKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgLyogRW5hYmxlIFRYRSBhbmQgRVJSIGludGVycnVwdCAqLworICBfX0hBTF9TUElfRU5BQkxFX0lUKGhzcGksIChTUElfSVRfUlhORSB8IFNQSV9JVF9FUlIpKTsKKworICAvKiBOb3RlIDogVGhlIFNQSSBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgU1BJIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICBwcm9jZXNzIHVubG9jayAqLworCisgIC8qIENoZWNrIGlmIHRoZSBTUEkgaXMgYWxyZWFkeSBlbmFibGVkICovCisgIGlmICgoaHNwaS0+SW5zdGFuY2UtPkNSMSAmIFNQSV9DUjFfU1BFKSAhPSBTUElfQ1IxX1NQRSkKKyAgeworICAgIC8qIEVuYWJsZSBTUEkgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX1NQSV9FTkFCTEUoaHNwaSk7CisgIH0KKworZXJyb3IgOgorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKyAgcmV0dXJuIGVycm9yY29kZTsKK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBhbmQgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBUeERhdGEgcG9pbnRlciB0byB0cmFuc21pc3Npb24gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIHBSeERhdGEgcG9pbnRlciB0byByZWNlcHRpb24gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudCBhbmQgcmVjZWl2ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlX0lUKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwVHhEYXRhLCB1aW50OF90ICpwUnhEYXRhLCB1aW50MTZfdCBTaXplKQoreworICB1aW50MzJfdCB0bXAgPSAwVSwgdG1wMSA9IDBVOworICBIQUxfU3RhdHVzVHlwZURlZiBlcnJvcmNvZGUgPSBIQUxfT0s7CisKKworICAvKiBDaGVjayBEaXJlY3Rpb24gcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19TUElfRElSRUNUSU9OXzJMSU5FUyhoc3BpLT5Jbml0LkRpcmVjdGlvbikpOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNwaSk7CisKKyAgdG1wICA9IGhzcGktPlN0YXRlOworICB0bXAxID0gaHNwaS0+SW5pdC5Nb2RlOworCisgIGlmICghKCh0bXAgPT0gSEFMX1NQSV9TVEFURV9SRUFEWSkgfHwgXAorICAgICAgICAoKHRtcDEgPT0gU1BJX01PREVfTUFTVEVSKSAmJiAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8yTElORVMpICYmICh0bXAgPT0gSEFMX1NQSV9TVEFURV9CVVNZX1JYKSkpKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0JVU1k7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIGlmICgocFR4RGF0YSA9PSBOVUxMKSB8fCAocFJ4RGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIC8qIERvbid0IG92ZXJ3cml0ZSBpbiBjYXNlIG9mIEhBTF9TUElfU1RBVEVfQlVTWV9SWCAqLworICBpZiAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9CVVNZX1JYKQorICB7CisgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX0JVU1lfVFhfUlg7CisgIH0KKworICAvKiBTZXQgdGhlIHRyYW5zYWN0aW9uIGluZm9ybWF0aW9uICovCisgIGhzcGktPkVycm9yQ29kZSAgID0gSEFMX1NQSV9FUlJPUl9OT05FOworICBoc3BpLT5wVHhCdWZmUHRyICA9ICh1aW50OF90ICopcFR4RGF0YTsKKyAgaHNwaS0+VHhYZmVyU2l6ZSAgPSBTaXplOworICBoc3BpLT5UeFhmZXJDb3VudCA9IFNpemU7CisgIGhzcGktPnBSeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilwUnhEYXRhOworICBoc3BpLT5SeFhmZXJTaXplICA9IFNpemU7CisgIGhzcGktPlJ4WGZlckNvdW50ID0gU2l6ZTsKKworICAvKiBTZXQgdGhlIGZ1bmN0aW9uIGZvciBJVCB0cmVhdG1lbnQgKi8KKyAgaWYgKGhzcGktPkluaXQuRGF0YVNpemUgPiBTUElfREFUQVNJWkVfOEJJVCkKKyAgeworICAgIGhzcGktPlJ4SVNSICAgICA9IFNQSV8ybGluZXNSeElTUl8xNkJJVDsKKyAgICBoc3BpLT5UeElTUiAgICAgPSBTUElfMmxpbmVzVHhJU1JfMTZCSVQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgaHNwaS0+UnhJU1IgICAgID0gU1BJXzJsaW5lc1J4SVNSXzhCSVQ7CisgICAgaHNwaS0+VHhJU1IgICAgID0gU1BJXzJsaW5lc1R4SVNSXzhCSVQ7CisgIH0KKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyogUmVzZXQgQ1JDIENhbGN1bGF0aW9uICovCisgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgIHsKKyAgICBoc3BpLT5DUkNTaXplID0gMVU7CisgICAgaWYgKChoc3BpLT5Jbml0LkRhdGFTaXplIDw9IFNQSV9EQVRBU0laRV84QklUKSAmJiAoaHNwaS0+SW5pdC5DUkNMZW5ndGggPT0gU1BJX0NSQ19MRU5HVEhfMTZCSVQpKQorICAgIHsKKyAgICAgIGhzcGktPkNSQ1NpemUgPSAyVTsKKyAgICB9CisgICAgU1BJX1JFU0VUX0NSQyhoc3BpKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBoc3BpLT5DUkNTaXplID0gMFU7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIENoZWNrIGlmIHBhY2tpbmcgbW9kZSBpcyBlbmFibGVkIGFuZCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gMiBkYXRhIHRvIHJlY2VpdmUgKi8KKyAgaWYgKChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpIHx8IChoc3BpLT5SeFhmZXJDb3VudCA+PSAyVSkpCisgIHsKKyAgICAvKiBTZXQgZmlmb3J4dGhyZXNvbGQgYWNjb3JkaW5nIHRoZSByZWNlcHRpb24gZGF0YSBsZW5ndGg6IDE2IGJpdCAqLworICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfUlhGSUZPX1RIUkVTSE9MRCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogU2V0IGZpZm9yeHRocmVzb2xkIGFjY29yZGluZyB0aGUgcmVjZXB0aW9uIGRhdGEgbGVuZ3RoOiA4IGJpdCAqLworICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworICB9CisKKyAgLyogRW5hYmxlIFRYRSwgUlhORSBhbmQgRVJSIGludGVycnVwdCAqLworICBfX0hBTF9TUElfRU5BQkxFX0lUKGhzcGksIChTUElfSVRfVFhFIHwgU1BJX0lUX1JYTkUgfCBTUElfSVRfRVJSKSk7CisKKyAgLyogQ2hlY2sgaWYgdGhlIFNQSSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKyAgaWYgKChoc3BpLT5JbnN0YW5jZS0+Q1IxICYgU1BJX0NSMV9TUEUpICE9IFNQSV9DUjFfU1BFKQorICB7CisgICAgLyogRW5hYmxlIFNQSSBwZXJpcGhlcmFsICovCisgICAgX19IQUxfU1BJX0VOQUJMRShoc3BpKTsKKyAgfQorCitlcnJvciA6CisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzcGkpOworICByZXR1cm4gZXJyb3Jjb2RlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRyYW5zbWl0IGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggRE1BLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEBwYXJhbSAgcERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1RyYW5zbWl0X0RNQShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGVycm9yY29kZSA9IEhBTF9PSzsKKworICAvKiBjaGVjayB0eCBkbWEgaGFuZGxlICovCisgIGFzc2VydF9wYXJhbShJU19TUElfRE1BX0hBTkRMRShoc3BpLT5oZG1hdHgpKTsKKworICAvKiBDaGVjayBEaXJlY3Rpb24gcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19TUElfRElSRUNUSU9OXzJMSU5FU19PUl8xTElORShoc3BpLT5Jbml0LkRpcmVjdGlvbikpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNwaSk7CisKKyAgaWYgKGhzcGktPlN0YXRlICE9IEhBTF9TUElfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfQlVTWTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIC8qIFNldCB0aGUgdHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gKi8KKyAgaHNwaS0+U3RhdGUgICAgICAgPSBIQUxfU1BJX1NUQVRFX0JVU1lfVFg7CisgIGhzcGktPkVycm9yQ29kZSAgID0gSEFMX1NQSV9FUlJPUl9OT05FOworICBoc3BpLT5wVHhCdWZmUHRyICA9ICh1aW50OF90ICopcERhdGE7CisgIGhzcGktPlR4WGZlclNpemUgID0gU2l6ZTsKKyAgaHNwaS0+VHhYZmVyQ291bnQgPSBTaXplOworCisgIC8qIEluaXQgZmllbGQgbm90IHVzZWQgaW4gaGFuZGxlIHRvIHplcm8gKi8KKyAgaHNwaS0+cFJ4QnVmZlB0ciAgPSAodWludDhfdCAqKU5VTEw7CisgIGhzcGktPlR4SVNSICAgICAgID0gTlVMTDsKKyAgaHNwaS0+UnhJU1IgICAgICAgPSBOVUxMOworICBoc3BpLT5SeFhmZXJTaXplICA9IDBVOworICBoc3BpLT5SeFhmZXJDb3VudCA9IDBVOworCisgIC8qIENvbmZpZ3VyZSBjb21tdW5pY2F0aW9uIGRpcmVjdGlvbiA6IDFMaW5lICovCisgIGlmIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzFMSU5FKQorICB7CisgICAgU1BJXzFMSU5FX1RYKGhzcGkpOworICB9CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qIFJlc2V0IENSQyBDYWxjdWxhdGlvbiAqLworICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICB7CisgICAgU1BJX1JFU0VUX0NSQyhoc3BpKTsKKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgLyogU2V0IHRoZSBTUEkgVHhETUEgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICBoc3BpLT5oZG1hdHgtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gU1BJX0RNQUhhbGZUcmFuc21pdENwbHQ7CisKKyAgLyogU2V0IHRoZSBTUEkgVHhETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaHNwaS0+aGRtYXR4LT5YZmVyQ3BsdENhbGxiYWNrID0gU1BJX0RNQVRyYW5zbWl0Q3BsdDsKKworICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICBoc3BpLT5oZG1hdHgtPlhmZXJFcnJvckNhbGxiYWNrID0gU1BJX0RNQUVycm9yOworCisgIC8qIFNldCB0aGUgRE1BIEFib3J0Q3BsdENhbGxiYWNrICovCisgIGhzcGktPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX0xETUFUWCk7CisgIC8qIFBhY2tpbmcgbW9kZSBpcyBlbmFibGVkIG9ubHkgaWYgdGhlIERNQSBzZXR0aW5nIGlzIEhBTFdPUkQgKi8KKyAgaWYgKChoc3BpLT5Jbml0LkRhdGFTaXplIDw9IFNQSV9EQVRBU0laRV84QklUKSAmJiAoaHNwaS0+aGRtYXR4LT5Jbml0Lk1lbURhdGFBbGlnbm1lbnQgPT0gRE1BX01EQVRBQUxJR05fSEFMRldPUkQpKQorICB7CisgICAgLyogQ2hlY2sgdGhlIGV2ZW4vb2RkIG9mIHRoZSBkYXRhIHNpemUgKyBjcmMgaWYgZW5hYmxlZCAqLworICAgIGlmICgoaHNwaS0+VHhYZmVyQ291bnQgJiAweDFVKSA9PSAwVSkKKyAgICB7CisgICAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9MRE1BVFgpOworICAgICAgaHNwaS0+VHhYZmVyQ291bnQgPSAoaHNwaS0+VHhYZmVyQ291bnQgPj4gMVUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX0xETUFUWCk7CisgICAgICBoc3BpLT5UeFhmZXJDb3VudCA9IChoc3BpLT5UeFhmZXJDb3VudCA+PiAxVSkgKyAxVTsKKyAgICB9CisgIH0KKworICAvKiBFbmFibGUgdGhlIFR4IERNQSBTdHJlYW0vQ2hhbm5lbCAqLworICBIQUxfRE1BX1N0YXJ0X0lUKGhzcGktPmhkbWF0eCwgKHVpbnQzMl90KWhzcGktPnBUeEJ1ZmZQdHIsICh1aW50MzJfdCkmaHNwaS0+SW5zdGFuY2UtPkRSLCBoc3BpLT5UeFhmZXJDb3VudCk7CisKKyAgLyogQ2hlY2sgaWYgdGhlIFNQSSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKyAgaWYgKChoc3BpLT5JbnN0YW5jZS0+Q1IxICYgU1BJX0NSMV9TUEUpICE9IFNQSV9DUjFfU1BFKQorICB7CisgICAgLyogRW5hYmxlIFNQSSBwZXJpcGhlcmFsICovCisgICAgX19IQUxfU1BJX0VOQUJMRShoc3BpKTsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgU1BJIEVycm9yIEludGVycnVwdCBCaXQgKi8KKyAgX19IQUxfU1BJX0VOQUJMRV9JVChoc3BpLCAoU1BJX0lUX0VSUikpOworCisgIC8qIEVuYWJsZSBUeCBETUEgUmVxdWVzdCAqLworICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTik7CisKK2Vycm9yIDoKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHNwaSk7CisgIHJldHVybiBlcnJvcmNvZGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQS4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgTUFTVEVSIG1vZGUgYW5kIFNQSV9ESVJFQ1RJT05fMkxJTkVTIGRpcmVjdGlvbiwgaGRtYXR4IHNoYWxsIGJlIGRlZmluZWQuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHBhcmFtICBwRGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQG5vdGUgICBXaGVuIHRoZSBDUkMgZmVhdHVyZSBpcyBlbmFibGVkIHRoZSBwRGF0YSBMZW5ndGggbXVzdCBiZSBTaXplICsgMS4KKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9SZWNlaXZlX0RNQShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGVycm9yY29kZSA9IEhBTF9PSzsKKworICAvKiBjaGVjayByeCBkbWEgaGFuZGxlICovCisgIGFzc2VydF9wYXJhbShJU19TUElfRE1BX0hBTkRMRShoc3BpLT5oZG1hcngpKTsKKworICBpZiAoKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTKSAmJiAoaHNwaS0+SW5pdC5Nb2RlID09IFNQSV9NT0RFX01BU1RFUikpCisgIHsKKyAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfQlVTWV9SWDsKKworICAgIC8qIGNoZWNrIHR4IGRtYSBoYW5kbGUgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfU1BJX0RNQV9IQU5ETEUoaHNwaS0+aGRtYXR4KSk7CisKKyAgICAvKiBDYWxsIHRyYW5zbWl0LXJlY2VpdmUgZnVuY3Rpb24gdG8gc2VuZCBEdW1teSBkYXRhIG9uIFR4IGxpbmUgYW5kIGdlbmVyYXRlIGNsb2NrIG9uIENMSyBsaW5lICovCisgICAgcmV0dXJuIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlX0RNQShoc3BpLCBwRGF0YSwgcERhdGEsIFNpemUpOworICB9CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3BpKTsKKworICBpZiAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9SRUFEWSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9CVVNZOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgLyogU2V0IHRoZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiAqLworICBoc3BpLT5TdGF0ZSAgICAgICA9IEhBTF9TUElfU1RBVEVfQlVTWV9SWDsKKyAgaHNwaS0+RXJyb3JDb2RlICAgPSBIQUxfU1BJX0VSUk9SX05PTkU7CisgIGhzcGktPnBSeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilwRGF0YTsKKyAgaHNwaS0+UnhYZmVyU2l6ZSAgPSBTaXplOworICBoc3BpLT5SeFhmZXJDb3VudCA9IFNpemU7CisKKyAgLypJbml0IGZpZWxkIG5vdCB1c2VkIGluIGhhbmRsZSB0byB6ZXJvICovCisgIGhzcGktPlJ4SVNSICAgICAgID0gTlVMTDsKKyAgaHNwaS0+VHhJU1IgICAgICAgPSBOVUxMOworICBoc3BpLT5UeFhmZXJTaXplICA9IDBVOworICBoc3BpLT5UeFhmZXJDb3VudCA9IDBVOworCisgIC8qIENvbmZpZ3VyZSBjb21tdW5pY2F0aW9uIGRpcmVjdGlvbiA6IDFMaW5lICovCisgIGlmIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzFMSU5FKQorICB7CisgICAgU1BJXzFMSU5FX1JYKGhzcGkpOworICB9CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qIFJlc2V0IENSQyBDYWxjdWxhdGlvbiAqLworICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICB7CisgICAgU1BJX1JFU0VUX0NSQyhoc3BpKTsKKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyNpZiBkZWZpbmVkIChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZCAoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQgKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkIChTVE0zMkYzNTh4eCkgfHwgZGVmaW5lZCAoU1RNMzJGMzc4eHgpCisgIC8qIFBhY2tpbmcgbW9kZSBtYW5hZ2VtZW50IGlzIGVuYWJsZWQgYnkgdGhlIERNQSBzZXR0aW5ncyAqLworICBpZiAoKGhzcGktPkluaXQuRGF0YVNpemUgPD0gU1BJX0RBVEFTSVpFXzhCSVQpICYmIChoc3BpLT5oZG1hcngtPkluaXQuTWVtRGF0YUFsaWdubWVudCA9PSBETUFfTURBVEFBTElHTl9IQUxGV09SRCkpCisgIHsKKyAgICAvKiBSZXN0cmljdGlvbiB0aGUgRE1BIGRhdGEgcmVjZWl2ZWQgaXMgbm90IGFsbG93ZWQgaW4gdGhpcyBtb2RlICovCisgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOworICAgIGdvdG8gZXJyb3I7CisgIH0KKyNlbmRpZgorCisgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX0xETUFSWCk7CisgIGlmIChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpCisgIHsKKyAgICAvKiBTZXQgZmlmb3J4dGhyZXNvbGQgYWNjb3JkaW5nIHRoZSByZWNlcHRpb24gZGF0YSBsZW5ndGg6IDE2Yml0ICovCisgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9SWEZJRk9fVEhSRVNIT0xEKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBTZXQgZmlmb3J4dGhyZXNvbGQgYWNjb3JkaW5nIHRoZSByZWNlcHRpb24gZGF0YSBsZW5ndGg6IDhiaXQgKi8KKyAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9SWEZJRk9fVEhSRVNIT0xEKTsKKworICAgIGlmIChoc3BpLT5oZG1hcngtPkluaXQuTWVtRGF0YUFsaWdubWVudCA9PSBETUFfTURBVEFBTElHTl9IQUxGV09SRCkKKyAgICB7CisgICAgICAvKiBzZXQgZmlmb3J4dGhyZXNvbGQgYWNjb3JkaW5nIHRoZSByZWNlcHRpb24gZGF0YSBsZW5ndGg6IDE2Yml0ICovCisgICAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworCisgICAgICBpZiAoKGhzcGktPlJ4WGZlckNvdW50ICYgMHgxVSkgPT0gMHgwVSkKKyAgICAgIHsKKyAgICAgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfTERNQVJYKTsKKyAgICAgICAgaHNwaS0+UnhYZmVyQ291bnQgPSBoc3BpLT5SeFhmZXJDb3VudCA+PiAxVTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX0xETUFSWCk7CisgICAgICAgIGhzcGktPlJ4WGZlckNvdW50ID0gKGhzcGktPlJ4WGZlckNvdW50ID4+IDFVKSArIDFVOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFNldCB0aGUgU1BJIFJ4RE1BIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaHNwaS0+aGRtYXJ4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFNQSV9ETUFIYWxmUmVjZWl2ZUNwbHQ7CisKKyAgLyogU2V0IHRoZSBTUEkgUnggRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgIGhzcGktPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayA9IFNQSV9ETUFSZWNlaXZlQ3BsdDsKKworICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICBoc3BpLT5oZG1hcngtPlhmZXJFcnJvckNhbGxiYWNrID0gU1BJX0RNQUVycm9yOworCisgIC8qIFNldCB0aGUgRE1BIEFib3J0Q3BsdENhbGxiYWNrICovCisgIGhzcGktPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgIC8qIEVuYWJsZSB0aGUgUnggRE1BIFN0cmVhbS9DaGFubmVsICAqLworICBIQUxfRE1BX1N0YXJ0X0lUKGhzcGktPmhkbWFyeCwgKHVpbnQzMl90KSZoc3BpLT5JbnN0YW5jZS0+RFIsICh1aW50MzJfdCloc3BpLT5wUnhCdWZmUHRyLCBoc3BpLT5SeFhmZXJDb3VudCk7CisKKyAgLyogQ2hlY2sgaWYgdGhlIFNQSSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKyAgaWYgKChoc3BpLT5JbnN0YW5jZS0+Q1IxICYgU1BJX0NSMV9TUEUpICE9IFNQSV9DUjFfU1BFKQorICB7CisgICAgLyogRW5hYmxlIFNQSSBwZXJpcGhlcmFsICovCisgICAgX19IQUxfU1BJX0VOQUJMRShoc3BpKTsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgU1BJIEVycm9yIEludGVycnVwdCBCaXQgKi8KKyAgX19IQUxfU1BJX0VOQUJMRV9JVChoc3BpLCAoU1BJX0lUX0VSUikpOworCisgIC8qIEVuYWJsZSBSeCBETUEgUmVxdWVzdCAqLworICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhETUFFTik7CisKK2Vycm9yOgorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKyAgcmV0dXJuIGVycm9yY29kZTsKK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBhbmQgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBUeERhdGEgcG9pbnRlciB0byB0cmFuc21pc3Npb24gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIHBSeERhdGEgcG9pbnRlciB0byByZWNlcHRpb24gZGF0YSBidWZmZXIKKyAgKiBAbm90ZSAgIFdoZW4gdGhlIENSQyBmZWF0dXJlIGlzIGVuYWJsZWQgdGhlIHBSeERhdGEgTGVuZ3RoIG11c3QgYmUgU2l6ZSArIDEKKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9UcmFuc21pdFJlY2VpdmVfRE1BKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwVHhEYXRhLCB1aW50OF90ICpwUnhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFNpemUpCit7CisgIHVpbnQzMl90IHRtcCA9IDBVLCB0bXAxID0gMFU7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGVycm9yY29kZSA9IEhBTF9PSzsKKworICAvKiBjaGVjayByeCAmIHR4IGRtYSBoYW5kbGVzICovCisgIGFzc2VydF9wYXJhbShJU19TUElfRE1BX0hBTkRMRShoc3BpLT5oZG1hcngpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9ETUFfSEFORExFKGhzcGktPmhkbWF0eCkpOworCisgIC8qIENoZWNrIERpcmVjdGlvbiBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9ESVJFQ1RJT05fMkxJTkVTKGhzcGktPkluaXQuRGlyZWN0aW9uKSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3BpKTsKKworICB0bXAgID0gaHNwaS0+U3RhdGU7CisgIHRtcDEgPSBoc3BpLT5Jbml0Lk1vZGU7CisgIGlmICghKCh0bXAgPT0gSEFMX1NQSV9TVEFURV9SRUFEWSkgfHwKKyAgICAgICAgKCh0bXAxID09IFNQSV9NT0RFX01BU1RFUikgJiYgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTKSAmJiAodG1wID09IEhBTF9TUElfU1RBVEVfQlVTWV9SWCkpKSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9CVVNZOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICBpZiAoKHBUeERhdGEgPT0gTlVMTCkgfHwgKHBSeERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICAvKiBEb24ndCBvdmVyd3JpdGUgaW4gY2FzZSBvZiBIQUxfU1BJX1NUQVRFX0JVU1lfUlggKi8KKyAgaWYgKGhzcGktPlN0YXRlICE9IEhBTF9TUElfU1RBVEVfQlVTWV9SWCkKKyAgeworICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9CVVNZX1RYX1JYOworICB9CisKKyAgLyogU2V0IHRoZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiAqLworICBoc3BpLT5FcnJvckNvZGUgICA9IEhBTF9TUElfRVJST1JfTk9ORTsKKyAgaHNwaS0+cFR4QnVmZlB0ciAgPSAodWludDhfdCAqKXBUeERhdGE7CisgIGhzcGktPlR4WGZlclNpemUgID0gU2l6ZTsKKyAgaHNwaS0+VHhYZmVyQ291bnQgPSBTaXplOworICBoc3BpLT5wUnhCdWZmUHRyICA9ICh1aW50OF90ICopcFJ4RGF0YTsKKyAgaHNwaS0+UnhYZmVyU2l6ZSAgPSBTaXplOworICBoc3BpLT5SeFhmZXJDb3VudCA9IFNpemU7CisKKyAgLyogSW5pdCBmaWVsZCBub3QgdXNlZCBpbiBoYW5kbGUgdG8gemVybyAqLworICBoc3BpLT5SeElTUiAgICAgICA9IE5VTEw7CisgIGhzcGktPlR4SVNSICAgICAgID0gTlVMTDsKKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyogUmVzZXQgQ1JDIENhbGN1bGF0aW9uICovCisgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgIHsKKyAgICBTUElfUkVTRVRfQ1JDKGhzcGkpOworICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworCisjaWYgZGVmaW5lZCAoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQgKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkIChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZCAoU1RNMzJGMzU4eHgpIHx8IGRlZmluZWQgKFNUTTMyRjM3OHh4KQorICAvKiBwYWNraW5nIG1vZGUgbWFuYWdlbWVudCBpcyBlbmFibGVkIGJ5IHRoZSBETUEgc2V0dGluZ3MgKi8KKyAgaWYgKChoc3BpLT5Jbml0LkRhdGFTaXplIDw9IFNQSV9EQVRBU0laRV84QklUKSAmJiAoaHNwaS0+aGRtYXJ4LT5Jbml0Lk1lbURhdGFBbGlnbm1lbnQgPT0gRE1BX01EQVRBQUxJR05fSEFMRldPUkQpKQorICB7CisgICAgLyogUmVzdHJpY3Rpb24gdGhlIERNQSBkYXRhIHJlY2VpdmVkIGlzIG5vdCBhbGxvd2VkIGluIHRoaXMgbW9kZSAqLworICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgICBnb3RvIGVycm9yOworICB9CisjZW5kaWYKKworICAvKiBSZXNldCB0aGUgdGhyZXNob2xkIGJpdCAqLworICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9MRE1BVFggfCBTUElfQ1IyX0xETUFSWCk7CisKKyAgLyogVGhlIHBhY2tpbmcgbW9kZSBtYW5hZ2VtZW50IGlzIGVuYWJsZWQgYnkgdGhlIERNQSBzZXR0aW5ncyBhY2NvcmRpbmcgdGhlIHNwaSBkYXRhIHNpemUgKi8KKyAgaWYgKGhzcGktPkluaXQuRGF0YVNpemUgPiBTUElfREFUQVNJWkVfOEJJVCkKKyAgeworICAgIC8qIFNldCBmaWZvcnh0aHJlc2hvbGQgYWNjb3JkaW5nIHRoZSByZWNlcHRpb24gZGF0YSBsZW5ndGg6IDE2Yml0ICovCisgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9SWEZJRk9fVEhSRVNIT0xEKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBTZXQgZmlmb3J4dGhyZXNvbGQgYWNjb3JkaW5nIHRoZSByZWNlcHRpb24gZGF0YSBsZW5ndGg6IDhiaXQgKi8KKyAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9SWEZJRk9fVEhSRVNIT0xEKTsKKworICAgIGlmIChoc3BpLT5oZG1hdHgtPkluaXQuTWVtRGF0YUFsaWdubWVudCA9PSBETUFfTURBVEFBTElHTl9IQUxGV09SRCkKKyAgICB7CisgICAgICBpZiAoKGhzcGktPlR4WGZlclNpemUgJiAweDFVKSA9PSAweDBVKQorICAgICAgeworICAgICAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9MRE1BVFgpOworICAgICAgICBoc3BpLT5UeFhmZXJDb3VudCA9IGhzcGktPlR4WGZlckNvdW50ID4+IDFVOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfTERNQVRYKTsKKyAgICAgICAgaHNwaS0+VHhYZmVyQ291bnQgPSAoaHNwaS0+VHhYZmVyQ291bnQgPj4gMVUpICsgMVU7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGhzcGktPmhkbWFyeC0+SW5pdC5NZW1EYXRhQWxpZ25tZW50ID09IERNQV9NREFUQUFMSUdOX0hBTEZXT1JEKQorICAgIHsKKyAgICAgIC8qIFNldCBmaWZvcnh0aHJlc29sZCBhY2NvcmRpbmcgdGhlIHJlY2VwdGlvbiBkYXRhIGxlbmd0aDogMTZiaXQgKi8KKyAgICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfUlhGSUZPX1RIUkVTSE9MRCk7CisKKyAgICAgIGlmICgoaHNwaS0+UnhYZmVyQ291bnQgJiAweDFVKSA9PSAweDBVKQorICAgICAgeworICAgICAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9MRE1BUlgpOworICAgICAgICBoc3BpLT5SeFhmZXJDb3VudCA9IGhzcGktPlJ4WGZlckNvdW50ID4+IDFVOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfTERNQVJYKTsKKyAgICAgICAgaHNwaS0+UnhYZmVyQ291bnQgPSAoaHNwaS0+UnhYZmVyQ291bnQgPj4gMVUpICsgMVU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogQ2hlY2sgaWYgd2UgYXJlIGluIFJ4IG9ubHkgb3IgaW4gUngvVHggTW9kZSBhbmQgY29uZmlndXJlIHRoZSBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaWYgKGhzcGktPlN0YXRlID09IEhBTF9TUElfU1RBVEVfQlVTWV9SWCkKKyAgeworICAgIC8qIFNldCB0aGUgU1BJIFJ4IERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgaHNwaS0+aGRtYXJ4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFNQSV9ETUFIYWxmUmVjZWl2ZUNwbHQ7CisgICAgaHNwaS0+aGRtYXJ4LT5YZmVyQ3BsdENhbGxiYWNrICAgICA9IFNQSV9ETUFSZWNlaXZlQ3BsdDsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBTZXQgdGhlIFNQSSBUeC9SeCBETUEgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGhzcGktPmhkbWFyeC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBTUElfRE1BSGFsZlRyYW5zbWl0UmVjZWl2ZUNwbHQ7CisgICAgaHNwaS0+aGRtYXJ4LT5YZmVyQ3BsdENhbGxiYWNrICAgICA9IFNQSV9ETUFUcmFuc21pdFJlY2VpdmVDcGx0OworICB9CisKKyAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgaHNwaS0+aGRtYXJ4LT5YZmVyRXJyb3JDYWxsYmFjayA9IFNQSV9ETUFFcnJvcjsKKworICAvKiBTZXQgdGhlIERNQSBBYm9ydENwbHRDYWxsYmFjayAqLworICBoc3BpLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAvKiBFbmFibGUgdGhlIFJ4IERNQSBTdHJlYW0vQ2hhbm5lbCAgKi8KKyAgSEFMX0RNQV9TdGFydF9JVChoc3BpLT5oZG1hcngsICh1aW50MzJfdCkmaHNwaS0+SW5zdGFuY2UtPkRSLCAodWludDMyX3QpaHNwaS0+cFJ4QnVmZlB0ciwgaHNwaS0+UnhYZmVyQ291bnQpOworCisgIC8qIEVuYWJsZSBSeCBETUEgUmVxdWVzdCAqLworICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhETUFFTik7CisKKyAgLyogU2V0IHRoZSBTUEkgVHggRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrIGFzIE5VTEwgYmVjYXVzZSB0aGUgY29tbXVuaWNhdGlvbiBjbG9zaW5nCisgIGlzIHBlcmZvcm1lZCBpbiBETUEgcmVjZXB0aW9uIGNvbXBsZXRlIGNhbGxiYWNrICAqLworICBoc3BpLT5oZG1hdHgtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gTlVMTDsKKyAgaHNwaS0+aGRtYXR4LT5YZmVyQ3BsdENhbGxiYWNrICAgICA9IE5VTEw7CisgIGhzcGktPmhkbWF0eC0+WGZlckVycm9yQ2FsbGJhY2sgICAgPSBOVUxMOworICBoc3BpLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrICAgID0gTlVMTDsKKworICAvKiBFbmFibGUgdGhlIFR4IERNQSBTdHJlYW0vQ2hhbm5lbCAgKi8KKyAgSEFMX0RNQV9TdGFydF9JVChoc3BpLT5oZG1hdHgsICh1aW50MzJfdCloc3BpLT5wVHhCdWZmUHRyLCAodWludDMyX3QpJmhzcGktPkluc3RhbmNlLT5EUiwgaHNwaS0+VHhYZmVyQ291bnQpOworCisgIC8qIENoZWNrIGlmIHRoZSBTUEkgaXMgYWxyZWFkeSBlbmFibGVkICovCisgIGlmICgoaHNwaS0+SW5zdGFuY2UtPkNSMSAmIFNQSV9DUjFfU1BFKSAhPSBTUElfQ1IxX1NQRSkKKyAgeworICAgIC8qIEVuYWJsZSBTUEkgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX1NQSV9FTkFCTEUoaHNwaSk7CisgIH0KKyAgLyogRW5hYmxlIHRoZSBTUEkgRXJyb3IgSW50ZXJydXB0IEJpdCAqLworICBfX0hBTF9TUElfRU5BQkxFX0lUKGhzcGksIChTUElfSVRfRVJSKSk7CisKKyAgLyogRW5hYmxlIFR4IERNQSBSZXF1ZXN0ICovCisgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWERNQUVOKTsKKworZXJyb3IgOgorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKyAgcmV0dXJuIGVycm9yY29kZTsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIHRyYW5zZmVyIChibG9ja2luZyBtb2RlKS4KKyAgKiBAcGFyYW0gIGhzcGkgU1BJIGhhbmRsZS4KKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIHRyYW5zZmVyIChUeCBhbmQgUngpLAorICAqICAgICAgICAgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBTUEkgSW50ZXJydXB0cyAoZGVwZW5kaW5nIG9mIHRyYW5zZmVyIGRpcmVjdGlvbikKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBibG9ja2luZyBtb2RlIDogd2hlbiBleGl0aW5nIGZ1bmN0aW9uLCBBYm9ydCBpcyBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX0Fib3J0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBlcnJvcmNvZGU7CisgIF9fSU8gdWludDMyX3QgY291bnQsIHJlc2V0Y291bnQ7CisKKyAgLyogSW5pdGlhbGl6ZWQgbG9jYWwgdmFyaWFibGUgICovCisgIGVycm9yY29kZSA9IEhBTF9PSzsKKyAgcmVzZXRjb3VudCA9IFNQSV9ERUZBVUxUX1RJTUVPVVQgKiAoU3lzdGVtQ29yZUNsb2NrIC8gMjRVIC8gMTAwMFUpOworICBjb3VudCA9IHJlc2V0Y291bnQ7CisKKyAgLyogRGlzYWJsZSBUWEVJRSwgUlhORUlFIGFuZCBFUlJJRShtb2RlIGZhdWx0IGV2ZW50LCBvdmVycnVuIGVycm9yLCBUSSBmcmFtZSBlcnJvcikgaW50ZXJydXB0cyAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWEVJRSkpCisgIHsKKyAgICBoc3BpLT5UeElTUiA9IFNQSV9BYm9ydFR4X0lTUjsKKyAgICAvKiBXYWl0IEhBTF9TUElfU1RBVEVfQUJPUlQgc3RhdGUgKi8KKyAgICBkbworICAgIHsKKyAgICAgIGlmIChjb3VudC0tID09IDBVKQorICAgICAgeworICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9BQk9SVCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9BQk9SVCk7CisgICAgLyogUmVzZXQgVGltZW91dCBDb3VudGVyICovCisgICAgY291bnQgPSByZXNldGNvdW50OworICB9CisKKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhORUlFKSkKKyAgeworICAgIGhzcGktPlJ4SVNSID0gU1BJX0Fib3J0UnhfSVNSOworICAgIC8qIFdhaXQgSEFMX1NQSV9TVEFURV9BQk9SVCBzdGF0ZSAqLworICAgIGRvCisgICAgeworICAgICAgaWYgKGNvdW50LS0gPT0gMFUpCisgICAgICB7CisgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0FCT1JUKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHdoaWxlIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX0FCT1JUKTsKKyAgICAvKiBSZXNldCBUaW1lb3V0IENvdW50ZXIgKi8KKyAgICBjb3VudCA9IHJlc2V0Y291bnQ7CisgIH0KKworICAvKiBDbGVhciBFUlJJRSBpbnRlcnJ1cHRzIGluIGNhc2Ugb2YgRE1BIE1vZGUgKi8KKyAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfRVJSSUUpOworCisgIC8qIERpc2FibGUgdGhlIFNQSSBETUEgVHggb3IgU1BJIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKChIQUxfSVNfQklUX1NFVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4pKSB8fCAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWERNQUVOKSkpCisgIHsKKyAgICAvKiBBYm9ydCB0aGUgU1BJIERNQSBUeCBTdHJlYW0vQ2hhbm5lbCA6IHVzZSBibG9ja2luZyBETUEgQWJvcnQgQVBJIChubyBjYWxsYmFjaykgKi8KKyAgICBpZiAoaHNwaS0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBTUEkgRE1BIEFib3J0IGNhbGxiYWNrIDoKKyAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9TUElfQWJvcnRDcGx0Q2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaHNwaS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIC8qIEFib3J0IERNQSBUeCBIYW5kbGUgbGlua2VkIHRvIFNQSSBQZXJpcGhlcmFsICovCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChoc3BpLT5oZG1hdHgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsKKyAgICAgIH0KKworICAgICAgLyogRGlzYWJsZSBUeCBETUEgUmVxdWVzdCAqLworICAgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIChTUElfQ1IyX1RYRE1BRU4pKTsKKworICAgICAgaWYgKFNQSV9FbmRSeFR4VHJhbnNhY3Rpb24oaHNwaSwgU1BJX0RFRkFVTFRfVElNRU9VVCwgSEFMX0dldFRpY2soKSkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICAgICAgfQorCisgICAgICAvKiBEaXNhYmxlIFNQSSBQZXJpcGhlcmFsICovCisgICAgICBfX0hBTF9TUElfRElTQUJMRShoc3BpKTsKKworICAgICAgLyogRW1wdHkgdGhlIEZSTFZMIGZpZm8gKi8KKyAgICAgIGlmIChTUElfV2FpdEZpZm9TdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19GUkxWTCwgU1BJX0ZSTFZMX0VNUFRZLCBTUElfREVGQVVMVF9USU1FT1VULCBIQUxfR2V0VGljaygpKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7CisgICAgICB9CisgICAgfQorICAgIC8qIEFib3J0IHRoZSBTUEkgRE1BIFJ4IFN0cmVhbS9DaGFubmVsIDogdXNlIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKG5vIGNhbGxiYWNrKSAqLworICAgIGlmIChoc3BpLT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFNQSSBETUEgQWJvcnQgY2FsbGJhY2sgOgorICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX1NQSV9BYm9ydENwbHRDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBoc3BpLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgICAgLyogQWJvcnQgRE1BIFJ4IEhhbmRsZSBsaW5rZWQgdG8gU1BJIFBlcmlwaGVyYWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0KGhzcGktPmhkbWFyeCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICAgICAgfQorCisgICAgICAvKiBEaXNhYmxlIHBlcmlwaGVyYWwgKi8KKyAgICAgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOworCisgICAgICAvKiBDb250cm9sIHRoZSBCU1kgZmxhZyAqLworICAgICAgaWYgKFNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0JTWSwgUkVTRVQsIFNQSV9ERUZBVUxUX1RJTUVPVVQsIEhBTF9HZXRUaWNrKCkpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsKKyAgICAgIH0KKworICAgICAgLyogRW1wdHkgdGhlIEZSTFZMIGZpZm8gKi8KKyAgICAgIGlmIChTUElfV2FpdEZpZm9TdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19GUkxWTCwgU1BJX0ZSTFZMX0VNUFRZLCBTUElfREVGQVVMVF9USU1FT1VULCBIQUxfR2V0VGljaygpKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7CisgICAgICB9CisKKyAgICAgIC8qIERpc2FibGUgUnggRE1BIFJlcXVlc3QgKi8KKyAgICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCAoU1BJX0NSMl9SWERNQUVOKSk7CisgICAgfQorICB9CisgIC8qIFJlc2V0IFR4IGFuZCBSeCB0cmFuc2ZlciBjb3VudGVycyAqLworICBoc3BpLT5SeFhmZXJDb3VudCA9IDBVOworICBoc3BpLT5UeFhmZXJDb3VudCA9IDBVOworCisgIC8qIENoZWNrIGVycm9yIGR1cmluZyBBYm9ydCBwcm9jZWR1cmUgKi8KKyAgaWYgKGhzcGktPkVycm9yQ29kZSA9PSBIQUxfU1BJX0VSUk9SX0FCT1JUKQorICB7CisgICAgLyogcmV0dXJuIEhBTF9FcnJvciBpbiBjYXNlIG9mIGVycm9yIGR1cmluZyBBYm9ydCBwcm9jZWR1cmUgKi8KKyAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUmVzZXQgZXJyb3JDb2RlICovCisgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9OT05FOworICB9CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBTUiByZWdpc3RlciAqLworICBfX0hBTF9TUElfQ0xFQVJfT1ZSRkxBRyhoc3BpKTsKKyAgX19IQUxfU1BJX0NMRUFSX0ZSRUZMQUcoaHNwaSk7CisKKyAgLyogUmVzdG9yZSBoc3BpLT5zdGF0ZSB0byByZWFkeSAqLworICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIGVycm9yY29kZTsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIHRyYW5zZmVyIChJbnRlcnJ1cHQgbW9kZSkuCisgICogQHBhcmFtICBoc3BpIFNQSSBoYW5kbGUuCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyB0cmFuc2ZlciAoVHggYW5kIFJ4KSwKKyAgKiAgICAgICAgIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLgorICAqICAgICAgICAgVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nIG9wZXJhdGlvbnMgOgorICAqICAgICAgICAgICAtIERpc2FibGUgU1BJIEludGVycnVwdHMgKGRlcGVuZGluZyBvZiB0cmFuc2ZlciBkaXJlY3Rpb24pCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnRfSVQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqICAgICAgICAgICAtIEF0IGFib3J0IGNvbXBsZXRpb24sIGNhbGwgdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjaworICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gSW50ZXJydXB0IG1vZGUsIG1lYW5pbmcgdGhhdCBhYm9ydCBwcm9jZWR1cmUgY291bGQgYmUKKyAgKiAgICAgICAgIGNvbnNpZGVyZWQgYXMgY29tcGxldGVkIG9ubHkgd2hlbiB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIChub3Qgd2hlbiBleGl0aW5nIGZ1bmN0aW9uKS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX0Fib3J0X0lUKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBlcnJvcmNvZGU7CisgIHVpbnQzMl90IGFib3J0Y3BsdCA7CisgIF9fSU8gdWludDMyX3QgY291bnQsIHJlc2V0Y291bnQ7CisKKyAgLyogSW5pdGlhbGl6ZWQgbG9jYWwgdmFyaWFibGUgICovCisgIGVycm9yY29kZSA9IEhBTF9PSzsKKyAgYWJvcnRjcGx0ID0gMVU7CisgIHJlc2V0Y291bnQgPSBTUElfREVGQVVMVF9USU1FT1VUICogKFN5c3RlbUNvcmVDbG9jayAvIDI0VSAvIDEwMDBVKTsKKyAgY291bnQgPSByZXNldGNvdW50OworCisgIC8qIENoYW5nZSBSeCBhbmQgVHggSXJxIEhhbmRsZXIgdG8gRGlzYWJsZSBUWEVJRSwgUlhORUlFIGFuZCBFUlJJRSBpbnRlcnJ1cHRzICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRUlFKSkKKyAgeworICAgIGhzcGktPlR4SVNSID0gU1BJX0Fib3J0VHhfSVNSOworICAgIC8qIFdhaXQgSEFMX1NQSV9TVEFURV9BQk9SVCBzdGF0ZSAqLworICAgIGRvCisgICAgeworICAgICAgaWYgKGNvdW50LS0gPT0gMFUpCisgICAgICB7CisgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0FCT1JUKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHdoaWxlIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX0FCT1JUKTsKKyAgICAvKiBSZXNldCBUaW1lb3V0IENvdW50ZXIgKi8KKyAgICBjb3VudCA9IHJlc2V0Y291bnQ7CisgIH0KKworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWE5FSUUpKQorICB7CisgICAgaHNwaS0+UnhJU1IgPSBTUElfQWJvcnRSeF9JU1I7CisgICAgLyogV2FpdCBIQUxfU1BJX1NUQVRFX0FCT1JUIHN0YXRlICovCisgICAgZG8KKyAgICB7CisgICAgICBpZiAoY291bnQtLSA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQUJPUlQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKGhzcGktPlN0YXRlICE9IEhBTF9TUElfU1RBVEVfQUJPUlQpOworICAgIC8qIFJlc2V0IFRpbWVvdXQgQ291bnRlciAqLworICAgIGNvdW50ID0gcmVzZXRjb3VudDsKKyAgfQorCisgIC8qIENsZWFyIEVSUklFIGludGVycnVwdHMgaW4gY2FzZSBvZiBETUEgTW9kZSAqLworICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9FUlJJRSk7CisKKyAgLyogSWYgRE1BIFR4IGFuZC9vciBETUEgUnggSGFuZGxlcyBhcmUgYXNzb2NpYXRlZCB0byBTUEkgSGFuZGxlLCBETUEgQWJvcnQgY29tcGxldGUgY2FsbGJhY2tzIHNob3VsZCBiZSBpbml0aWFsaXNlZAorICAgICBiZWZvcmUgYW55IGNhbGwgdG8gRE1BIEFib3J0IGZ1bmN0aW9ucyAqLworICAvKiBETUEgVHggSGFuZGxlIGlzIHZhbGlkICovCisgIGlmIChoc3BpLT5oZG1hdHggIT0gTlVMTCkKKyAgeworICAgIC8qIFNldCBETUEgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgaWYgVUFSVCBETUEgVHggcmVxdWVzdCBpZiBlbmFibGVkLgorICAgICAgIE90aGVyd2lzZSwgc2V0IGl0IHRvIE5VTEwgKi8KKyAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWERNQUVOKSkKKyAgICB7CisgICAgICBoc3BpLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gU1BJX0RNQVR4QWJvcnRDYWxsYmFjazsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhzcGktPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgIH0KKyAgfQorICAvKiBETUEgUnggSGFuZGxlIGlzIHZhbGlkICovCisgIGlmIChoc3BpLT5oZG1hcnggIT0gTlVMTCkKKyAgeworICAgIC8qIFNldCBETUEgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgaWYgVUFSVCBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkLgorICAgICAgIE90aGVyd2lzZSwgc2V0IGl0IHRvIE5VTEwgKi8KKyAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWERNQUVOKSkKKyAgICB7CisgICAgICBoc3BpLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gU1BJX0RNQVJ4QWJvcnRDYWxsYmFjazsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhzcGktPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgIH0KKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFNQSSBETUEgVHggb3IgdGhlIFNQSSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKChIQUxfSVNfQklUX1NFVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4pKSAmJiAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWERNQUVOKSkpCisgIHsKKyAgICAvKiBBYm9ydCB0aGUgU1BJIERNQSBUeCBTdHJlYW0vQ2hhbm5lbCAqLworICAgIGlmIChoc3BpLT5oZG1hdHggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBBYm9ydCBETUEgVHggSGFuZGxlIGxpbmtlZCB0byBTUEkgUGVyaXBoZXJhbCAqLworICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaHNwaS0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGhzcGktPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBhYm9ydGNwbHQgPSAwVTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogQWJvcnQgdGhlIFNQSSBETUEgUnggU3RyZWFtL0NoYW5uZWwgKi8KKyAgICBpZiAoaHNwaS0+aGRtYXJ4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogQWJvcnQgRE1BIFJ4IEhhbmRsZSBsaW5rZWQgdG8gU1BJIFBlcmlwaGVyYWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhzcGktPmhkbWFyeCkgIT0gIEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaHNwaS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7CisgICAgICAgIGFib3J0Y3BsdCA9IDFVOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBhYm9ydGNwbHQgPSAwVTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBTUEkgRE1BIFR4IG9yIHRoZSBTUEkgUnggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4pKQorICB7CisgICAgLyogQWJvcnQgdGhlIFNQSSBETUEgVHggU3RyZWFtL0NoYW5uZWwgKi8KKyAgICBpZiAoaHNwaS0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogQWJvcnQgRE1BIFR4IEhhbmRsZSBsaW5rZWQgdG8gU1BJIFBlcmlwaGVyYWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhzcGktPmhkbWF0eCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBoc3BpLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgYWJvcnRjcGx0ID0gMFU7CisgICAgICB9CisgICAgfQorICB9CisgIC8qIERpc2FibGUgdGhlIFNQSSBETUEgVHggb3IgdGhlIFNQSSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhETUFFTikpCisgIHsKKyAgICAvKiBBYm9ydCB0aGUgU1BJIERNQSBSeCBTdHJlYW0vQ2hhbm5lbCAqLworICAgIGlmIChoc3BpLT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBBYm9ydCBETUEgUnggSGFuZGxlIGxpbmtlZCB0byBTUEkgUGVyaXBoZXJhbCAqLworICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaHNwaS0+aGRtYXJ4KSAhPSAgSEFMX09LKQorICAgICAgeworICAgICAgICBoc3BpLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgYWJvcnRjcGx0ID0gMFU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGFib3J0Y3BsdCA9PSAxVSkKKyAgeworICAgIC8qIFJlc2V0IFR4IGFuZCBSeCB0cmFuc2ZlciBjb3VudGVycyAqLworICAgIGhzcGktPlJ4WGZlckNvdW50ID0gMFU7CisgICAgaHNwaS0+VHhYZmVyQ291bnQgPSAwVTsKKworICAgIC8qIENoZWNrIGVycm9yIGR1cmluZyBBYm9ydCBwcm9jZWR1cmUgKi8KKyAgICBpZiAoaHNwaS0+RXJyb3JDb2RlID09IEhBTF9TUElfRVJST1JfQUJPUlQpCisgICAgeworICAgICAgLyogcmV0dXJuIEhBTF9FcnJvciBpbiBjYXNlIG9mIGVycm9yIGR1cmluZyBBYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFJlc2V0IGVycm9yQ29kZSAqLworICAgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9OT05FOworICAgIH0KKworICAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgU1IgcmVnaXN0ZXIgKi8KKyAgICBfX0hBTF9TUElfQ0xFQVJfT1ZSRkxBRyhoc3BpKTsKKyAgICBfX0hBTF9TUElfQ0xFQVJfRlJFRkxBRyhoc3BpKTsKKworICAgIC8qIFJlc3RvcmUgaHNwaS0+U3RhdGUgdG8gUmVhZHkgKi8KKyAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBBcyBubyBETUEgdG8gYmUgYWJvcnRlZCwgY2FsbCBkaXJlY3RseSB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgSEFMX1NQSV9BYm9ydENwbHRDYWxsYmFjayhoc3BpKTsKKyAgfQorCisgIHJldHVybiBlcnJvcmNvZGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgUGF1c2UgdGhlIERNQSBUcmFuc2Zlci4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9ETUFQYXVzZShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3BpKTsKKworICAvKiBEaXNhYmxlIHRoZSBTUEkgRE1BIFR4ICYgUnggcmVxdWVzdHMgKi8KKyAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTiB8IFNQSV9DUjJfUlhETUFFTik7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHNwaSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBSZXN1bWUgdGhlIERNQSBUcmFuc2Zlci4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9ETUFSZXN1bWUoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNwaSk7CisKKyAgLyogRW5hYmxlIHRoZSBTUEkgRE1BIFR4ICYgUnggcmVxdWVzdHMgKi8KKyAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4gfCBTUElfQ1IyX1JYRE1BRU4pOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzcGkpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiBTdG9wIHRoZSBETUEgVHJhbnNmZXIuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfRE1BU3RvcChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogVGhlIExvY2sgaXMgbm90IGltcGxlbWVudGVkIG9uIHRoaXMgQVBJIHRvIGFsbG93IHRoZSB1c2VyIGFwcGxpY2F0aW9uCisgICAgIHRvIGNhbGwgdGhlIEhBTCBTUEkgQVBJIHVuZGVyIGNhbGxiYWNrcyBIQUxfU1BJX1R4Q3BsdENhbGxiYWNrKCkgb3IgSEFMX1NQSV9SeENwbHRDYWxsYmFjaygpIG9yIEhBTF9TUElfVHhSeENwbHRDYWxsYmFjaygpOgorICAgICB3aGVuIGNhbGxpbmcgSEFMX0RNQV9BYm9ydCgpIEFQSSB0aGUgRE1BIFRYL1JYIFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBpcyBnZW5lcmF0ZWQKKyAgICAgYW5kIHRoZSBjb3JyZXNwb25kIGNhbGwgYmFjayBpcyBleGVjdXRlZCBIQUxfU1BJX1R4Q3BsdENhbGxiYWNrKCkgb3IgSEFMX1NQSV9SeENwbHRDYWxsYmFjaygpIG9yIEhBTF9TUElfVHhSeENwbHRDYWxsYmFjaygpCisgICAgICovCisKKyAgLyogQWJvcnQgdGhlIFNQSSBETUEgdHggU3RyZWFtL0NoYW5uZWwgICovCisgIGlmIChoc3BpLT5oZG1hdHggIT0gTlVMTCkKKyAgeworICAgIEhBTF9ETUFfQWJvcnQoaHNwaS0+aGRtYXR4KTsKKyAgfQorICAvKiBBYm9ydCB0aGUgU1BJIERNQSByeCBTdHJlYW0vQ2hhbm5lbCAgKi8KKyAgaWYgKGhzcGktPmhkbWFyeCAhPSBOVUxMKQorICB7CisgICAgSEFMX0RNQV9BYm9ydChoc3BpLT5oZG1hcngpOworICB9CisKKyAgLyogRGlzYWJsZSB0aGUgU1BJIERNQSBUeCAmIFJ4IHJlcXVlc3RzICovCisgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4gfCBTUElfQ1IyX1JYRE1BRU4pOworICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIFNQSSBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfU1BJX0lSUUhhbmRsZXIoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIHVpbnQzMl90IGl0c291cmNlID0gaHNwaS0+SW5zdGFuY2UtPkNSMjsKKyAgdWludDMyX3QgaXRmbGFnICAgPSBoc3BpLT5JbnN0YW5jZS0+U1I7CisKKyAgLyogU1BJIGluIG1vZGUgUmVjZWl2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGl0ZmxhZyAmIFNQSV9GTEFHX09WUikgPT0gUkVTRVQpICYmCisgICAgICAoKGl0ZmxhZyAmIFNQSV9GTEFHX1JYTkUpICE9IFJFU0VUKSAmJiAoKGl0c291cmNlICYgU1BJX0lUX1JYTkUpICE9IFJFU0VUKSkKKyAgeworICAgIGhzcGktPlJ4SVNSKGhzcGkpOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIFNQSSBpbiBtb2RlIFRyYW5zbWl0dGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChpdGZsYWcgJiBTUElfRkxBR19UWEUpICE9IFJFU0VUKSAmJiAoKGl0c291cmNlICYgU1BJX0lUX1RYRSkgIT0gUkVTRVQpKQorICB7CisgICAgaHNwaS0+VHhJU1IoaHNwaSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogU1BJIGluIEVycm9yIFRyZWF0bWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGl0ZmxhZyAmIChTUElfRkxBR19NT0RGIHwgU1BJX0ZMQUdfT1ZSIHwgU1BJX0ZMQUdfRlJFKSkgIT0gUkVTRVQpICYmICgoaXRzb3VyY2UgJiBTUElfSVRfRVJSKSAhPSBSRVNFVCkpCisgIHsKKyAgICAvKiBTUEkgT3ZlcnJ1biBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKChpdGZsYWcgJiBTUElfRkxBR19PVlIpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIGlmIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX0JVU1lfVFgpCisgICAgICB7CisgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX09WUik7CisgICAgICAgIF9fSEFMX1NQSV9DTEVBUl9PVlJGTEFHKGhzcGkpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBfX0hBTF9TUElfQ0xFQVJfT1ZSRkxBRyhoc3BpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKworICAgIC8qIFNQSSBNb2RlIEZhdWx0IGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKGl0ZmxhZyAmIFNQSV9GTEFHX01PREYpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX01PREYpOworICAgICAgX19IQUxfU1BJX0NMRUFSX01PREZGTEFHKGhzcGkpOworICAgIH0KKworICAgIC8qIFNQSSBGcmFtZSBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKGl0ZmxhZyAmIFNQSV9GTEFHX0ZSRSkgIT0gUkVTRVQpCisgICAgeworICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRlJFKTsKKyAgICAgIF9fSEFMX1NQSV9DTEVBUl9GUkVGTEFHKGhzcGkpOworICAgIH0KKworICAgIGlmIChoc3BpLT5FcnJvckNvZGUgIT0gSEFMX1NQSV9FUlJPUl9OT05FKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKyAgICAgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIFNQSV9JVF9SWE5FIHwgU1BJX0lUX1RYRSB8IFNQSV9JVF9FUlIpOworCisgICAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisgICAgICAvKiBEaXNhYmxlIHRoZSBTUEkgRE1BIHJlcXVlc3RzIGlmIGVuYWJsZWQgKi8KKyAgICAgIGlmICgoSEFMX0lTX0JJVF9TRVQoaXRzb3VyY2UsIFNQSV9DUjJfVFhETUFFTikpIHx8IChIQUxfSVNfQklUX1NFVChpdHNvdXJjZSwgU1BJX0NSMl9SWERNQUVOKSkpCisgICAgICB7CisgICAgICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCAoU1BJX0NSMl9UWERNQUVOIHwgU1BJX0NSMl9SWERNQUVOKSk7CisKKyAgICAgICAgLyogQWJvcnQgdGhlIFNQSSBETUEgUnggY2hhbm5lbCAqLworICAgICAgICBpZiAoaHNwaS0+aGRtYXJ4ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZXQgdGhlIFNQSSBETUEgQWJvcnQgY2FsbGJhY2sgOgorICAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9TUElfRXJyb3JDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICAgICAgaHNwaS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFNQSV9ETUFBYm9ydE9uRXJyb3I7CisgICAgICAgICAgSEFMX0RNQV9BYm9ydF9JVChoc3BpLT5oZG1hcngpOworICAgICAgICB9CisgICAgICAgIC8qIEFib3J0IHRoZSBTUEkgRE1BIFR4IGNoYW5uZWwgKi8KKyAgICAgICAgaWYgKGhzcGktPmhkbWF0eCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IHRoZSBTUEkgRE1BIEFib3J0IGNhbGxiYWNrIDoKKyAgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgICAgIGhzcGktPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBTUElfRE1BQWJvcnRPbkVycm9yOworICAgICAgICAgIEhBTF9ETUFfQWJvcnRfSVQoaHNwaS0+aGRtYXR4KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBDYWxsIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgSEFMX1NQSV9FcnJvckNhbGxiYWNrKGhzcGkpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TUElfVHhDcGx0Q2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzcGkpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU1BJX1R4Q3BsdENhbGxiYWNrIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NQSV9SeENwbHRDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNwaSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TUElfUnhDcGx0Q2FsbGJhY2sgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiBUeCBhbmQgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NQSV9UeFJ4Q3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc3BpKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NQSV9UeFJ4Q3BsdENhbGxiYWNrIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgVHggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU1BJX1R4SGFsZkNwbHRDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNwaSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TUElfVHhIYWxmQ3BsdENhbGxiYWNrIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgUnggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU1BJX1J4SGFsZkNwbHRDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNwaSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TUElfUnhIYWxmQ3BsdENhbGxiYWNrKCkgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiBUeCBhbmQgUnggSGFsZiBUcmFuc2ZlciBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TUElfVHhSeEhhbGZDcGx0Q2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzcGkpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU1BJX1R4UnhIYWxmQ3BsdENhbGxiYWNrKCkgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiBTUEkgZXJyb3IgY2FsbGJhY2suCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzcGkpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU1BJX0Vycm9yQ2FsbGJhY2sgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCisgIC8qIE5PVEUgOiBUaGUgRXJyb3JDb2RlIHBhcmFtZXRlciBpbiB0aGUgaHNwaSBoYW5kbGUgaXMgdXBkYXRlZCBieSB0aGUgU1BJIHByb2Nlc3NlcworICAgICAgICAgICAgYW5kIHVzZXIgY2FuIHVzZSBIQUxfU1BJX0dldEVycm9yKCkgQVBJIHRvIGNoZWNrIHRoZSBsYXRlc3QgZXJyb3Igb2NjdXJyZWQKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgU1BJIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNwaSBTUEkgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NQSV9BYm9ydENwbHRDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNwaSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TUElfQWJvcnRDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICBTUEkgY29udHJvbCBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gY29udHJvbCB0aGUgU1BJLgorICAgICAoKykgSEFMX1NQSV9HZXRTdGF0ZSgpIEFQSSBjYW4gYmUgaGVscGZ1bCB0byBjaGVjayBpbiBydW4tdGltZSB0aGUgc3RhdGUgb2YgdGhlIFNQSSBwZXJpcGhlcmFsCisgICAgICgrKSBIQUxfU1BJX0dldEVycm9yKCkgY2hlY2sgaW4gcnVuLXRpbWUgRXJyb3JzIG9jY3VycmluZyBkdXJpbmcgY29tbXVuaWNhdGlvbgorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFNQSSBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBTUEkgc3RhdGUKKyAgKi8KK0hBTF9TUElfU3RhdGVUeXBlRGVmIEhBTF9TUElfR2V0U3RhdGUoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFJldHVybiBTUEkgaGFuZGxlIHN0YXRlICovCisgIHJldHVybiBoc3BpLT5TdGF0ZTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFNQSSBlcnJvciBjb2RlLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgU1BJIGVycm9yIGNvZGUgaW4gYml0bWFwIGZvcm1hdAorICAqLwordWludDMyX3QgSEFMX1NQSV9HZXRFcnJvcihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogUmV0dXJuIFNQSSBFcnJvckNvZGUgKi8KKyAgcmV0dXJuIGhzcGktPkVycm9yQ29kZTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFNQSV9Qcml2YXRlX0Z1bmN0aW9ucworICAqIEBicmllZiAgIFByaXZhdGUgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIERNQSBTUEkgdHJhbnNtaXQgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX0RNQVRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkgPSAoU1BJX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gMFU7CisKKyAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdtZW50Ki8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBETUEgTm9ybWFsIE1vZGUgKi8KKyAgaWYgKChoZG1hLT5JbnN0YW5jZS0+Q0NSICYgRE1BX0NDUl9DSVJDKSAhPSBETUFfQ0NSX0NJUkMpCisgIHsKKyAgICAvKiBEaXNhYmxlIEVSUiBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCBTUElfSVRfRVJSKTsKKworICAgIC8qIERpc2FibGUgVHggRE1BIFJlcXVlc3QgKi8KKyAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWERNQUVOKTsKKworICAgIC8qIENoZWNrIHRoZSBlbmQgb2YgdGhlIHRyYW5zYWN0aW9uICovCisgICAgaWYgKFNQSV9FbmRSeFR4VHJhbnNhY3Rpb24oaHNwaSwgU1BJX0RFRkFVTFRfVElNRU9VVCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRkxBRyk7CisgICAgfQorCisgICAgLyogQ2xlYXIgb3ZlcnJ1biBmbGFnIGluIDIgTGluZXMgY29tbXVuaWNhdGlvbiBtb2RlIGJlY2F1c2UgcmVjZWl2ZWQgZGF0YSBpcyBub3QgcmVhZCAqLworICAgIGlmIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykKKyAgICB7CisgICAgICBfX0hBTF9TUElfQ0xFQVJfT1ZSRkxBRyhoc3BpKTsKKyAgICB9CisKKyAgICBoc3BpLT5UeFhmZXJDb3VudCA9IDBVOworICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKworICAgIGlmIChoc3BpLT5FcnJvckNvZGUgIT0gSEFMX1NQSV9FUlJPUl9OT05FKQorICAgIHsKKyAgICAgIEhBTF9TUElfRXJyb3JDYWxsYmFjayhoc3BpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgSEFMX1NQSV9UeENwbHRDYWxsYmFjayhoc3BpKTsKK30KKworLyoqCisgICogQGJyaWVmIERNQSBTUEkgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfRE1BUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpID0gKFNQSV9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDBVOworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgX19JTyB1aW50MTZfdCB0bXByZWcgPSAwVTsKKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIERNQSBOb3JtYWwgTW9kZSAqLworICBpZiAoKGhkbWEtPkluc3RhbmNlLT5DQ1IgJiBETUFfQ0NSX0NJUkMpICE9IERNQV9DQ1JfQ0lSQykKKyAgeworICAgIC8qIERpc2FibGUgRVJSIGludGVycnVwdCAqLworICAgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIFNQSV9JVF9FUlIpOworCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAgIC8qIENSQyBoYW5kbGluZyAqLworICAgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgICAgeworICAgICAgLyogV2FpdCB1bnRpbCBSWE5FIGZsYWcgKi8KKyAgICAgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19SWE5FLCBTUElfRkxBR19SWE5FLCBTUElfREVGQVVMVF9USU1FT1VULCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogRXJyb3Igb24gdGhlIENSQyByZWNlcHRpb24gKi8KKyAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsKKyAgICAgIH0KKyAgICAgIC8qIFJlYWQgQ1JDICovCisgICAgICBpZiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSA+IFNQSV9EQVRBU0laRV84QklUKQorICAgICAgeworICAgICAgICB0bXByZWcgPSBoc3BpLT5JbnN0YW5jZS0+RFI7CisgICAgICAgIC8qIFRvIGF2b2lkIEdDQyB3YXJuaW5nICovCisgICAgICAgIFVOVVNFRCh0bXByZWcpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICB0bXByZWcgPSAqKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFI7CisgICAgICAgIC8qIFRvIGF2b2lkIEdDQyB3YXJuaW5nICovCisgICAgICAgIFVOVVNFRCh0bXByZWcpOworCisgICAgICAgIGlmIChoc3BpLT5Jbml0LkNSQ0xlbmd0aCA9PSBTUElfQ1JDX0xFTkdUSF8xNkJJVCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19SWE5FLCBTUElfRkxBR19SWE5FLCBTUElfREVGQVVMVF9USU1FT1VULCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBFcnJvciBvbiB0aGUgQ1JDIHJlY2VwdGlvbiAqLworICAgICAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsKKyAgICAgICAgICB9CisgICAgICAgICAgdG1wcmVnID0gKihfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSOworICAgICAgICAgIC8qIFRvIGF2b2lkIEdDQyB3YXJuaW5nICovCisgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAgIC8qIERpc2FibGUgUngvVHggRE1BIFJlcXVlc3QgKGRvbmUgYnkgZGVmYXVsdCB0byBoYW5kbGUgdGhlIGNhc2UgbWFzdGVyIHJ4IGRpcmVjdGlvbiAyIGxpbmVzKSAqLworICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4gfCBTUElfQ1IyX1JYRE1BRU4pOworCisgICAgLyogQ2hlY2sgdGhlIGVuZCBvZiB0aGUgdHJhbnNhY3Rpb24gKi8KKyAgICBpZiAoU1BJX0VuZFJ4VHJhbnNhY3Rpb24oaHNwaSwgU1BJX0RFRkFVTFRfVElNRU9VVCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9GTEFHOworICAgIH0KKworICAgIGhzcGktPlJ4WGZlckNvdW50ID0gMFU7CisgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAgIC8qIENoZWNrIGlmIENSQyBlcnJvciBvY2N1cnJlZCAqLworICAgIGlmIChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfQ1JDRVJSKSkKKyAgICB7CisgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9DUkMpOworICAgICAgX19IQUxfU1BJX0NMRUFSX0NSQ0VSUkZMQUcoaHNwaSk7CisgICAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgICBpZiAoaHNwaS0+RXJyb3JDb2RlICE9IEhBTF9TUElfRVJST1JfTk9ORSkKKyAgICB7CisgICAgICBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soaHNwaSk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIEhBTF9TUElfUnhDcGx0Q2FsbGJhY2soaHNwaSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFNQSSB0cmFuc21pdCByZWNlaXZlIHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9ETUFUcmFuc21pdFJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBTUElfSGFuZGxlVHlwZURlZiAqaHNwaSA9IChTUElfSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIF9fSU8gaW50MTZfdCB0bXByZWcgPSAwVTsKKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50Ki8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBETUEgTm9ybWFsIE1vZGUgKi8KKyAgaWYgKChoZG1hLT5JbnN0YW5jZS0+Q0NSICYgRE1BX0NDUl9DSVJDKSAhPSBETUFfQ0NSX0NJUkMpCisgIHsKKyAgICAvKiBEaXNhYmxlIEVSUiBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCBTUElfSVRfRVJSKTsKKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgICAvKiBDUkMgaGFuZGxpbmcgKi8KKyAgICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICAgIHsKKyAgICAgIGlmICgoaHNwaS0+SW5pdC5EYXRhU2l6ZSA9PSBTUElfREFUQVNJWkVfOEJJVCkgJiYgKGhzcGktPkluaXQuQ1JDTGVuZ3RoID09IFNQSV9DUkNfTEVOR1RIXzhCSVQpKQorICAgICAgeworICAgICAgICBpZiAoU1BJX1dhaXRGaWZvU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfRlJMVkwsIFNQSV9GUkxWTF9RVUFSVEVSX0ZVTEwsIFNQSV9ERUZBVUxUX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIC8qIEVycm9yIG9uIHRoZSBDUkMgcmVjZXB0aW9uICovCisgICAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsKKyAgICAgICAgfQorICAgICAgICAvKiBSZWFkIENSQyB0byBGbHVzaCBEUiBhbmQgUlhORSBmbGFnICovCisgICAgICAgIHRtcHJlZyA9ICooX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUjsKKyAgICAgICAgLyogVG8gYXZvaWQgR0NDIHdhcm5pbmcgKi8KKyAgICAgICAgVU5VU0VEKHRtcHJlZyk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmIChTUElfV2FpdEZpZm9TdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19GUkxWTCwgU1BJX0ZSTFZMX0hBTEZfRlVMTCwgU1BJX0RFRkFVTFRfVElNRU9VVCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICAvKiBFcnJvciBvbiB0aGUgQ1JDIHJlY2VwdGlvbiAqLworICAgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0NSQyk7CisgICAgICAgIH0KKyAgICAgICAgLyogUmVhZCBDUkMgdG8gRmx1c2ggRFIgYW5kIFJYTkUgZmxhZyAqLworICAgICAgICB0bXByZWcgPSBoc3BpLT5JbnN0YW5jZS0+RFI7CisgICAgICAgIC8qIFRvIGF2b2lkIEdDQyB3YXJuaW5nICovCisgICAgICAgIFVOVVNFRCh0bXByZWcpOworICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgICAgLyogQ2hlY2sgdGhlIGVuZCBvZiB0aGUgdHJhbnNhY3Rpb24gKi8KKyAgICBpZiAoU1BJX0VuZFJ4VHhUcmFuc2FjdGlvbihoc3BpLCBTUElfREVGQVVMVF9USU1FT1VULCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9GTEFHKTsKKyAgICB9CisKKyAgICAvKiBEaXNhYmxlIFJ4L1R4IERNQSBSZXF1ZXN0ICovCisgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTiB8IFNQSV9DUjJfUlhETUFFTik7CisKKyAgICBoc3BpLT5UeFhmZXJDb3VudCA9IDBVOworICAgIGhzcGktPlJ4WGZlckNvdW50ID0gMFU7CisgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAgIC8qIENoZWNrIGlmIENSQyBlcnJvciBvY2N1cnJlZCAqLworICAgIGlmIChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfQ1JDRVJSKSkKKyAgICB7CisgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9DUkMpOworICAgICAgX19IQUxfU1BJX0NMRUFSX0NSQ0VSUkZMQUcoaHNwaSk7CisgICAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgICBpZiAoaHNwaS0+RXJyb3JDb2RlICE9IEhBTF9TUElfRVJST1JfTk9ORSkKKyAgICB7CisgICAgICBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soaHNwaSk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIEhBTF9TUElfVHhSeENwbHRDYWxsYmFjayhoc3BpKTsKK30KKworLyoqCisgICogQGJyaWVmICBETUEgU1BJIGhhbGYgdHJhbnNtaXQgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX0RNQUhhbGZUcmFuc21pdENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpID0gKFNQSV9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyAgSEFMX1NQSV9UeEhhbGZDcGx0Q2FsbGJhY2soaHNwaSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFNQSSBoYWxmIHJlY2VpdmUgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjaworICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfRE1BSGFsZlJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBTUElfSGFuZGxlVHlwZURlZiAqaHNwaSA9IChTUElfSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCisgIEhBTF9TUElfUnhIYWxmQ3BsdENhbGxiYWNrKGhzcGkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBTUEkgaGFsZiB0cmFuc21pdCByZWNlaXZlIHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9ETUFIYWxmVHJhbnNtaXRSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkgPSAoU1BJX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsKKworICBIQUxfU1BJX1R4UnhIYWxmQ3BsdENhbGxiYWNrKGhzcGkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBTUEkgY29tbXVuaWNhdGlvbiBlcnJvciBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBTUElfSGFuZGxlVHlwZURlZiAqaHNwaSA9IChTUElfSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCisgIC8qIFN0b3AgdGhlIGRpc2FibGUgRE1BIHRyYW5zZmVyIG9uIFNQSSBzaWRlICovCisgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4gfCBTUElfQ1IyX1JYRE1BRU4pOworCisgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0RNQSk7CisgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKyAgSEFMX1NQSV9FcnJvckNhbGxiYWNrKGhzcGkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBTUEkgY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgSEFMIHNlcnZpY2VzIG9uIEVycm9yCisgICogICAgICAgICAoVG8gYmUgY2FsbGVkIGF0IGVuZCBvZiBETUEgQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlbmNlKS4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9ETUFBYm9ydE9uRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpID0gKFNQSV9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisgIGhzcGktPlJ4WGZlckNvdW50ID0gMFU7CisgIGhzcGktPlR4WGZlckNvdW50ID0gMFU7CisKKyAgSEFMX1NQSV9FcnJvckNhbGxiYWNrKGhzcGkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBTUEkgVHggY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgdXNlcgorICAqICAgICAgICAgKFRvIGJlIGNhbGxlZCBhdCBlbmQgb2YgRE1BIFR4IEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgdXNlciBhYm9ydCByZXF1ZXN0KS4KKyAgKiBAbm90ZSAgIFdoZW4gdGhpcyBjYWxsYmFjayBpcyBleGVjdXRlZCwgVXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsIGJhY2sgaXMgY2FsbGVkIG9ubHkgaWYgbm8KKyAgKiAgICAgICAgIEFib3J0IHN0aWxsIG9uZ29pbmcgZm9yIFJ4IERNQSBIYW5kbGUuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfRE1BVHhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBTUElfSGFuZGxlVHlwZURlZiAqaHNwaSA9IChTUElfSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCisgIGhzcGktPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgIC8qIERpc2FibGUgVHggRE1BIFJlcXVlc3QgKi8KKyAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTik7CisKKyAgaWYgKFNQSV9FbmRSeFR4VHJhbnNhY3Rpb24oaHNwaSwgU1BJX0RFRkFVTFRfVElNRU9VVCwgSEFMX0dldFRpY2soKSkgIT0gSEFMX09LKQorICB7CisgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsKKyAgfQorCisgIC8qIERpc2FibGUgU1BJIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfU1BJX0RJU0FCTEUoaHNwaSk7CisKKyAgLyogRW1wdHkgdGhlIEZSTFZMIGZpZm8gKi8KKyAgaWYgKFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0ZSTFZMLCBTUElfRlJMVkxfRU1QVFksIFNQSV9ERUZBVUxUX1RJTUVPVVQsIEhBTF9HZXRUaWNrKCkpICE9IEhBTF9PSykKKyAgeworICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7CisgIH0KKworICAvKiBDaGVjayBpZiBhbiBBYm9ydCBwcm9jZXNzIGlzIHN0aWxsIG9uZ29pbmcgKi8KKyAgaWYgKGhzcGktPmhkbWFyeCAhPSBOVUxMKQorICB7CisgICAgaWYgKGhzcGktPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLyogTm8gQWJvcnQgcHJvY2VzcyBzdGlsbCBvbmdvaW5nIDogQWxsIERNQSBTdHJlYW0vQ2hhbm5lbCBhcmUgYWJvcnRlZCwgY2FsbCB1c2VyIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrICovCisgIGhzcGktPlJ4WGZlckNvdW50ID0gMFU7CisgIGhzcGktPlR4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ2hlY2sgbm8gZXJyb3IgZHVyaW5nIEFib3J0IHByb2NlZHVyZSAqLworICBpZiAoaHNwaS0+RXJyb3JDb2RlICE9IEhBTF9TUElfRVJST1JfQUJPUlQpCisgIHsKKyAgICAvKiBSZXNldCBlcnJvckNvZGUgKi8KKyAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX05PTkU7CisgIH0KKworICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIFNSIHJlZ2lzdGVyICovCisgIF9fSEFMX1NQSV9DTEVBUl9PVlJGTEFHKGhzcGkpOworICBfX0hBTF9TUElfQ0xFQVJfRlJFRkxBRyhoc3BpKTsKKworICAvKiBSZXN0b3JlIGhzcGktPlN0YXRlIHRvIFJlYWR5ICovCisgIGhzcGktPlN0YXRlICA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisKKyAgLyogQ2FsbCB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisgIEhBTF9TUElfQWJvcnRDcGx0Q2FsbGJhY2soaHNwaSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFNQSSBSeCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSB1c2VyCisgICogICAgICAgICAoVG8gYmUgY2FsbGVkIGF0IGVuZCBvZiBETUEgUnggQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyB1c2VyIGFib3J0IHJlcXVlc3QpLgorICAqIEBub3RlICAgV2hlbiB0aGlzIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLCBVc2VyIEFib3J0IGNvbXBsZXRlIGNhbGwgYmFjayBpcyBjYWxsZWQgb25seSBpZiBubworICAqICAgICAgICAgQWJvcnQgc3RpbGwgb25nb2luZyBmb3IgVHggRE1BIEhhbmRsZS4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9ETUFSeEFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpID0gKFNQSV9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyAgLyogRGlzYWJsZSBTUEkgUGVyaXBoZXJhbCAqLworICBfX0hBTF9TUElfRElTQUJMRShoc3BpKTsKKworICBoc3BpLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAvKiBEaXNhYmxlIFJ4IERNQSBSZXF1ZXN0ICovCisgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1JYRE1BRU4pOworCisgIC8qIENvbnRyb2wgdGhlIEJTWSBmbGFnICovCisgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19CU1ksIFJFU0VULCBTUElfREVGQVVMVF9USU1FT1VULCBIQUxfR2V0VGljaygpKSAhPSBIQUxfT0spCisgIHsKKyAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICB9CisKKyAgLyogRW1wdHkgdGhlIEZSTFZMIGZpZm8gKi8KKyAgaWYgKFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0ZSTFZMLCBTUElfRlJMVkxfRU1QVFksIFNQSV9ERUZBVUxUX1RJTUVPVVQsIEhBTF9HZXRUaWNrKCkpICE9IEhBTF9PSykKKyAgeworICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7CisgIH0KKworICAvKiBDaGVjayBpZiBhbiBBYm9ydCBwcm9jZXNzIGlzIHN0aWxsIG9uZ29pbmcgKi8KKyAgaWYgKGhzcGktPmhkbWF0eCAhPSBOVUxMKQorICB7CisgICAgaWYgKGhzcGktPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLyogTm8gQWJvcnQgcHJvY2VzcyBzdGlsbCBvbmdvaW5nIDogQWxsIERNQSBTdHJlYW0vQ2hhbm5lbCBhcmUgYWJvcnRlZCwgY2FsbCB1c2VyIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrICovCisgIGhzcGktPlJ4WGZlckNvdW50ID0gMFU7CisgIGhzcGktPlR4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ2hlY2sgbm8gZXJyb3IgZHVyaW5nIEFib3J0IHByb2NlZHVyZSAqLworICBpZiAoaHNwaS0+RXJyb3JDb2RlICE9IEhBTF9TUElfRVJST1JfQUJPUlQpCisgIHsKKyAgICAvKiBSZXNldCBlcnJvckNvZGUgKi8KKyAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX05PTkU7CisgIH0KKworICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIFNSIHJlZ2lzdGVyICovCisgIF9fSEFMX1NQSV9DTEVBUl9PVlJGTEFHKGhzcGkpOworICBfX0hBTF9TUElfQ0xFQVJfRlJFRkxBRyhoc3BpKTsKKworICAvKiBSZXN0b3JlIGhzcGktPlN0YXRlIHRvIFJlYWR5ICovCisgIGhzcGktPlN0YXRlICA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisKKyAgLyogQ2FsbCB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisgIEhBTF9TUElfQWJvcnRDcGx0Q2FsbGJhY2soaHNwaSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUnggOC1iaXQgaGFuZGxlciBmb3IgVHJhbnNtaXQgYW5kIFJlY2VpdmUgaW4gSW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfMmxpbmVzUnhJU1JfOEJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogUmVjZWl2ZSBkYXRhIGluIHBhY2tpbmcgbW9kZSAqLworICBpZiAoaHNwaS0+UnhYZmVyQ291bnQgPiAxVSkKKyAgeworICAgICooKHVpbnQxNl90ICopaHNwaS0+cFJ4QnVmZlB0cikgPSBoc3BpLT5JbnN0YW5jZS0+RFI7CisgICAgaHNwaS0+cFJ4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOworICAgIGhzcGktPlJ4WGZlckNvdW50IC09IDJVOworICAgIGlmIChoc3BpLT5SeFhmZXJDb3VudCA9PSAxVSkKKyAgICB7CisgICAgICAvKiBzZXQgZmlmb3J4dGhyZXNvbGQgYWNjb3JkaW5nIHRoZSByZWNlcHRpb24gZGF0YSBsZW5ndGg6IDhiaXQgKi8KKyAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworICAgIH0KKyAgfQorICAvKiBSZWNlaXZlIGRhdGEgaW4gOCBCaXQgbW9kZSAqLworICBlbHNlCisgIHsKKyAgICAqaHNwaS0+cFJ4QnVmZlB0cisrID0gKigoX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUik7CisgICAgaHNwaS0+UnhYZmVyQ291bnQtLTsKKyAgfQorCisgIC8qIGNoZWNrIGVuZCBvZiB0aGUgcmVjZXB0aW9uICovCisgIGlmIChoc3BpLT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgeworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICAgIHsKKyAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworICAgICAgaHNwaS0+UnhJU1IgPSAgU1BJXzJsaW5lc1J4SVNSXzhCSVRDUkM7CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgICAvKiBEaXNhYmxlIFJYTkUgIGFuZCBFUlIgaW50ZXJydXB0ICovCisgICAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgKFNQSV9JVF9SWE5FIHwgU1BJX0lUX0VSUikpOworCisgICAgaWYgKGhzcGktPlR4WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIFNQSV9DbG9zZVJ4VHhfSVNSKGhzcGkpOworICAgIH0KKyAgfQorfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorLyoqCisgICogQGJyaWVmICBSeCA4LWJpdCBoYW5kbGVyIGZvciBUcmFuc21pdCBhbmQgUmVjZWl2ZSBpbiBJbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV8ybGluZXNSeElTUl84QklUQ1JDKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICBfX0lPIHVpbnQ4X3QgdG1wcmVnID0gMFU7CisKKyAgLyogUmVhZCBkYXRhIHJlZ2lzdGVyIHRvIGZsdXNoIENSQyAqLworICB0bXByZWcgPSAqKChfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSKTsKKworICAvKiBUbyBhdm9pZCBHQ0Mgd2FybmluZyAqLworICBVTlVTRUQodG1wcmVnKTsKKworICBoc3BpLT5DUkNTaXplLS07CisKKyAgLyogY2hlY2sgZW5kIG9mIHRoZSByZWNlcHRpb24gKi8KKyAgaWYgKGhzcGktPkNSQ1NpemUgPT0gMFUpCisgIHsKKyAgICAvKiBEaXNhYmxlIFJYTkUgYW5kIEVSUiBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCAoU1BJX0lUX1JYTkUgfCBTUElfSVRfRVJSKSk7CisKKyAgICBpZiAoaHNwaS0+VHhYZmVyQ291bnQgPT0gMFUpCisgICAgeworICAgICAgU1BJX0Nsb3NlUnhUeF9JU1IoaHNwaSk7CisgICAgfQorICB9Cit9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworLyoqCisgICogQGJyaWVmICBUeCA4LWJpdCBoYW5kbGVyIGZvciBUcmFuc21pdCBhbmQgUmVjZWl2ZSBpbiBJbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV8ybGluZXNUeElTUl84QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBUcmFuc21pdCBkYXRhIGluIHBhY2tpbmcgQml0IG1vZGUgKi8KKyAgaWYgKGhzcGktPlR4WGZlckNvdW50ID49IDJVKQorICB7CisgICAgaHNwaS0+SW5zdGFuY2UtPkRSID0gKigodWludDE2X3QgKiloc3BpLT5wVHhCdWZmUHRyKTsKKyAgICBoc3BpLT5wVHhCdWZmUHRyICs9IHNpemVvZih1aW50MTZfdCk7CisgICAgaHNwaS0+VHhYZmVyQ291bnQgLT0gMlU7CisgIH0KKyAgLyogVHJhbnNtaXQgZGF0YSBpbiA4IEJpdCBtb2RlICovCisgIGVsc2UKKyAgeworICAgICooX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUiA9ICgqaHNwaS0+cFR4QnVmZlB0cisrKTsKKyAgICBoc3BpLT5UeFhmZXJDb3VudC0tOworICB9CisKKyAgLyogY2hlY2sgdGhlIGVuZCBvZiB0aGUgdHJhbnNtaXNzaW9uICovCisgIGlmIChoc3BpLT5UeFhmZXJDb3VudCA9PSAwVSkKKyAgeworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICAgIHsKKyAgICAgIC8qIFNldCBDUkMgTmV4dCBCaXQgdG8gc2VuZCBDUkMgKi8KKyAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9DUkNORVhUKTsKKyAgICAgIC8qIERpc2FibGUgVFhFIGludGVycnVwdCAqLworICAgICAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgU1BJX0lUX1RYRSk7CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgICAvKiBEaXNhYmxlIFRYRSBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCBTUElfSVRfVFhFKTsKKworICAgIGlmIChoc3BpLT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICBTUElfQ2xvc2VSeFR4X0lTUihoc3BpKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSeCAxNi1iaXQgaGFuZGxlciBmb3IgVHJhbnNtaXQgYW5kIFJlY2VpdmUgaW4gSW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfMmxpbmVzUnhJU1JfMTZCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFJlY2VpdmUgZGF0YSBpbiAxNiBCaXQgbW9kZSAqLworICAqKCh1aW50MTZfdCAqKWhzcGktPnBSeEJ1ZmZQdHIpID0gaHNwaS0+SW5zdGFuY2UtPkRSOworICBoc3BpLT5wUnhCdWZmUHRyICs9IHNpemVvZih1aW50MTZfdCk7CisgIGhzcGktPlJ4WGZlckNvdW50LS07CisKKyAgaWYgKGhzcGktPlJ4WGZlckNvdW50ID09IDBVKQorICB7CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgICAgeworICAgICAgaHNwaS0+UnhJU1IgPSAgU1BJXzJsaW5lc1J4SVNSXzE2QklUQ1JDOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgICAgLyogRGlzYWJsZSBSWE5FIGludGVycnVwdCAqLworICAgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIFNQSV9JVF9SWE5FKTsKKworICAgIGlmIChoc3BpLT5UeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICBTUElfQ2xvc2VSeFR4X0lTUihoc3BpKTsKKyAgICB9CisgIH0KK30KKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKy8qKgorICAqIEBicmllZiAgTWFuYWdlIHRoZSBDUkMgMTYtYml0IHJlY2VpdmUgZm9yIFRyYW5zbWl0IGFuZCBSZWNlaXZlIGluIEludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJXzJsaW5lc1J4SVNSXzE2QklUQ1JDKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBSZWNlaXZlIGRhdGEgaW4gMTYgQml0IG1vZGUgKi8KKyAgX19JTyB1aW50MTZfdCB0bXByZWcgPSAwVTsKKworICAvKiBSZWFkIGRhdGEgcmVnaXN0ZXIgdG8gZmx1c2ggQ1JDICovCisgIHRtcHJlZyA9IGhzcGktPkluc3RhbmNlLT5EUjsKKworICAvKiBUbyBhdm9pZCBHQ0Mgd2FybmluZyAqLworICBVTlVTRUQodG1wcmVnKTsKKworICAvKiBEaXNhYmxlIFJYTkUgaW50ZXJydXB0ICovCisgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIFNQSV9JVF9SWE5FKTsKKworICBTUElfQ2xvc2VSeFR4X0lTUihoc3BpKTsKK30KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisvKioKKyAgKiBAYnJpZWYgIFR4IDE2LWJpdCBoYW5kbGVyIGZvciBUcmFuc21pdCBhbmQgUmVjZWl2ZSBpbiBJbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV8ybGluZXNUeElTUl8xNkJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogVHJhbnNtaXQgZGF0YSBpbiAxNiBCaXQgbW9kZSAqLworICBoc3BpLT5JbnN0YW5jZS0+RFIgPSAqKCh1aW50MTZfdCAqKWhzcGktPnBUeEJ1ZmZQdHIpOworICBoc3BpLT5wVHhCdWZmUHRyICs9IHNpemVvZih1aW50MTZfdCk7CisgIGhzcGktPlR4WGZlckNvdW50LS07CisKKyAgLyogRW5hYmxlIENSQyBUcmFuc21pc3Npb24gKi8KKyAgaWYgKGhzcGktPlR4WGZlckNvdW50ID09IDBVKQorICB7CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgICAgeworICAgICAgLyogU2V0IENSQyBOZXh0IEJpdCB0byBzZW5kIENSQyAqLworICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0NSQ05FWFQpOworICAgICAgLyogRGlzYWJsZSBUWEUgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCBTUElfSVRfVFhFKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAgIC8qIERpc2FibGUgVFhFIGludGVycnVwdCAqLworICAgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIFNQSV9JVF9UWEUpOworCisgICAgaWYgKGhzcGktPlJ4WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIFNQSV9DbG9zZVJ4VHhfSVNSKGhzcGkpOworICAgIH0KKyAgfQorfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorLyoqCisgICogQGJyaWVmICBNYW5hZ2UgdGhlIENSQyA4LWJpdCByZWNlaXZlIGluIEludGVycnVwdCBjb250ZXh0LgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX1J4SVNSXzhCSVRDUkMoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIF9fSU8gdWludDhfdCB0bXByZWcgPSAwVTsKKworICAvKiBSZWFkIGRhdGEgcmVnaXN0ZXIgdG8gZmx1c2ggQ1JDICovCisgIHRtcHJlZyA9ICooKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFIpOworCisgIC8qIFRvIGF2b2lkIEdDQyB3YXJuaW5nICovCisgIFVOVVNFRCh0bXByZWcpOworCisgIGhzcGktPkNSQ1NpemUtLTsKKworICBpZiAoaHNwaS0+Q1JDU2l6ZSA9PSAwVSkKKyAgeworICAgIFNQSV9DbG9zZVJ4X0lTUihoc3BpKTsKKyAgfQorfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKy8qKgorICAqIEBicmllZiAgTWFuYWdlIHRoZSByZWNlaXZlIDgtYml0IGluIEludGVycnVwdCBjb250ZXh0LgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX1J4SVNSXzhCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgICpoc3BpLT5wUnhCdWZmUHRyKysgPSAoKihfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSKTsKKyAgaHNwaS0+UnhYZmVyQ291bnQtLTsKKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyogRW5hYmxlIENSQyBUcmFuc21pc3Npb24gKi8KKyAgaWYgKChoc3BpLT5SeFhmZXJDb3VudCA9PSAxVSkgJiYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkpCisgIHsKKyAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfQ1JDTkVYVCk7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIGlmIChoc3BpLT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgeworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICAgIHsKKyAgICAgIGhzcGktPlJ4SVNSID0gIFNQSV9SeElTUl84QklUQ1JDOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworICAgIFNQSV9DbG9zZVJ4X0lTUihoc3BpKTsKKyAgfQorfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorLyoqCisgICogQGJyaWVmICBNYW5hZ2UgdGhlIENSQyAxNi1iaXQgcmVjZWl2ZSBpbiBJbnRlcnJ1cHQgY29udGV4dC4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9SeElTUl8xNkJJVENSQyhzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgX19JTyB1aW50MTZfdCB0bXByZWcgPSAwVTsKKworICAvKiBSZWFkIGRhdGEgcmVnaXN0ZXIgdG8gZmx1c2ggQ1JDICovCisgIHRtcHJlZyA9IGhzcGktPkluc3RhbmNlLT5EUjsKKworICAvKiBUbyBhdm9pZCBHQ0Mgd2FybmluZyAqLworICBVTlVTRUQodG1wcmVnKTsKKworICAvKiBEaXNhYmxlIFJYTkUgYW5kIEVSUiBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgKFNQSV9JVF9SWE5FIHwgU1BJX0lUX0VSUikpOworCisgIFNQSV9DbG9zZVJ4X0lTUihoc3BpKTsKK30KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisvKioKKyAgKiBAYnJpZWYgIE1hbmFnZSB0aGUgMTYtYml0IHJlY2VpdmUgaW4gSW50ZXJydXB0IGNvbnRleHQuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfUnhJU1JfMTZCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgICooKHVpbnQxNl90ICopaHNwaS0+cFJ4QnVmZlB0cikgPSBoc3BpLT5JbnN0YW5jZS0+RFI7CisgIGhzcGktPnBSeEJ1ZmZQdHIgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgaHNwaS0+UnhYZmVyQ291bnQtLTsKKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyogRW5hYmxlIENSQyBUcmFuc21pc3Npb24gKi8KKyAgaWYgKChoc3BpLT5SeFhmZXJDb3VudCA9PSAxVSkgJiYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkpCisgIHsKKyAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfQ1JDTkVYVCk7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIGlmIChoc3BpLT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgeworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICAgIHsKKyAgICAgIGhzcGktPlJ4SVNSID0gU1BJX1J4SVNSXzE2QklUQ1JDOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworICAgIFNQSV9DbG9zZVJ4X0lTUihoc3BpKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSB0aGUgZGF0YSA4LWJpdCB0cmFuc21pdCBpbiBJbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9UeElTUl84QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAqKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFIgPSAoKmhzcGktPnBUeEJ1ZmZQdHIrKyk7CisgIGhzcGktPlR4WGZlckNvdW50LS07CisKKyAgaWYgKGhzcGktPlR4WGZlckNvdW50ID09IDBVKQorICB7CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgICAgeworICAgICAgLyogRW5hYmxlIENSQyBUcmFuc21pc3Npb24gKi8KKyAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9DUkNORVhUKTsKKyAgICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKyAgICBTUElfQ2xvc2VUeF9JU1IoaHNwaSk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgdGhlIGRhdGEgMTYtYml0IHRyYW5zbWl0IGluIEludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX1R4SVNSXzE2QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBUcmFuc21pdCBkYXRhIGluIDE2IEJpdCBtb2RlICovCisgIGhzcGktPkluc3RhbmNlLT5EUiA9ICooKHVpbnQxNl90ICopaHNwaS0+cFR4QnVmZlB0cik7CisgIGhzcGktPnBUeEJ1ZmZQdHIgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgaHNwaS0+VHhYZmVyQ291bnQtLTsKKworICBpZiAoaHNwaS0+VHhYZmVyQ291bnQgPT0gMFUpCisgIHsKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgICAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgICB7CisgICAgICAvKiBFbmFibGUgQ1JDIFRyYW5zbWlzc2lvbiAqLworICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0NSQ05FWFQpOworICAgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworICAgIFNQSV9DbG9zZVR4X0lTUihoc3BpKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgSGFuZGxlIFNQSSBDb21tdW5pY2F0aW9uIFRpbWVvdXQuCisgICogQHBhcmFtIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEBwYXJhbSBGbGFnIFNQSSBmbGFnIHRvIGNoZWNrCisgICogQHBhcmFtIFN0YXRlIGZsYWcgc3RhdGUgdG8gY2hlY2sKKyAgKiBAcGFyYW0gVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHBhcmFtIFRpY2tzdGFydCB0aWNrIHN0YXJ0IHZhbHVlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQzMl90IEZsYWcsIHVpbnQzMl90IFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IFRpY2tzdGFydCkKK3sKKyAgd2hpbGUgKChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgRmxhZykgPyBTRVQgOiBSRVNFVCkgIT0gU3RhdGUpCisgIHsKKyAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmICgoVGltZW91dCA9PSAwVSkgfHwgKChIQUxfR2V0VGljaygpIC0gVGlja3N0YXJ0KSA+PSBUaW1lb3V0KSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgU1BJIGFuZCByZXNldCB0aGUgQ1JDOiB0aGUgQ1JDIHZhbHVlIHNob3VsZCBiZSBjbGVhcmVkCisgICAgICAgIG9uIGJvdGggbWFzdGVyIGFuZCBzbGF2ZSBzaWRlcyBpbiBvcmRlciB0byByZXN5bmNocm9uaXplIHRoZSBtYXN0ZXIKKyAgICAgICAgYW5kIHNsYXZlIGZvciB0aGVpciByZXNwZWN0aXZlIENSQyBjYWxjdWxhdGlvbiAqLworCisgICAgICAgIC8qIERpc2FibGUgVFhFLCBSWE5FIGFuZCBFUlIgaW50ZXJydXB0cyBmb3IgdGhlIGludGVycnVwdCBwcm9jZXNzICovCisgICAgICAgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIChTUElfSVRfVFhFIHwgU1BJX0lUX1JYTkUgfCBTUElfSVRfRVJSKSk7CisKKyAgICAgICAgaWYgKChoc3BpLT5Jbml0Lk1vZGUgPT0gU1BJX01PREVfTUFTVEVSKSAmJiAoKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMUxJTkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FU19SWE9OTFkpKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIERpc2FibGUgU1BJIHBlcmlwaGVyYWwgKi8KKyAgICAgICAgICBfX0hBTF9TUElfRElTQUJMRShoc3BpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFJlc2V0IENSQyBDYWxjdWxhdGlvbiAqLworICAgICAgICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICAgICAgICB7CisgICAgICAgICAgU1BJX1JFU0VUX0NSQyhoc3BpKTsKKyAgICAgICAgfQorCisgICAgICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIEhhbmRsZSBTUEkgRklGTyBDb21tdW5pY2F0aW9uIFRpbWVvdXQuCisgICogQHBhcmFtIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEBwYXJhbSBGaWZvIEZpZm8gdG8gY2hlY2sKKyAgKiBAcGFyYW0gU3RhdGUgRmlmbyBzdGF0ZSB0byBjaGVjaworICAqIEBwYXJhbSBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcGFyYW0gVGlja3N0YXJ0IHRpY2sgc3RhcnQgdmFsdWUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTUElfV2FpdEZpZm9TdGF0ZVVudGlsVGltZW91dChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDMyX3QgRmlmbywgdWludDMyX3QgU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KQoreworICBfX0lPIHVpbnQ4X3QgdG1wcmVnOworCisgIHdoaWxlICgoaHNwaS0+SW5zdGFuY2UtPlNSICYgRmlmbykgIT0gU3RhdGUpCisgIHsKKyAgICBpZiAoKEZpZm8gPT0gU1BJX1NSX0ZSTFZMKSAmJiAoU3RhdGUgPT0gU1BJX0ZSTFZMX0VNUFRZKSkKKyAgICB7CisgICAgICB0bXByZWcgPSAqKChfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSKTsKKyAgICAgIC8qIFRvIGF2b2lkIEdDQyB3YXJuaW5nICovCisgICAgICBVTlVTRUQodG1wcmVnKTsKKyAgICB9CisKKyAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmICgoVGltZW91dCA9PSAwVSkgfHwgKChIQUxfR2V0VGljaygpIC0gVGlja3N0YXJ0KSA+PSBUaW1lb3V0KSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgU1BJIGFuZCByZXNldCB0aGUgQ1JDOiB0aGUgQ1JDIHZhbHVlIHNob3VsZCBiZSBjbGVhcmVkCisgICAgICAgICAgIG9uIGJvdGggbWFzdGVyIGFuZCBzbGF2ZSBzaWRlcyBpbiBvcmRlciB0byByZXN5bmNocm9uaXplIHRoZSBtYXN0ZXIKKyAgICAgICAgICAgYW5kIHNsYXZlIGZvciB0aGVpciByZXNwZWN0aXZlIENSQyBjYWxjdWxhdGlvbiAqLworCisgICAgICAgIC8qIERpc2FibGUgVFhFLCBSWE5FIGFuZCBFUlIgaW50ZXJydXB0cyBmb3IgdGhlIGludGVycnVwdCBwcm9jZXNzICovCisgICAgICAgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIChTUElfSVRfVFhFIHwgU1BJX0lUX1JYTkUgfCBTUElfSVRfRVJSKSk7CisKKyAgICAgICAgaWYgKChoc3BpLT5Jbml0Lk1vZGUgPT0gU1BJX01PREVfTUFTVEVSKSAmJiAoKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMUxJTkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FU19SWE9OTFkpKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIERpc2FibGUgU1BJIHBlcmlwaGVyYWwgKi8KKyAgICAgICAgICBfX0hBTF9TUElfRElTQUJMRShoc3BpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFJlc2V0IENSQyBDYWxjdWxhdGlvbiAqLworICAgICAgICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICAgICAgICB7CisgICAgICAgICAgU1BJX1JFU0VUX0NSQyhoc3BpKTsKKyAgICAgICAgfQorCisgICAgICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgdGhlIGNoZWNrIG9mIHRoZSBSWCB0cmFuc2FjdGlvbiBjb21wbGV0ZS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEBwYXJhbSAgVGlja3N0YXJ0IHRpY2sgc3RhcnQgdmFsdWUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTUElfRW5kUnhUcmFuc2FjdGlvbihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IFRpY2tzdGFydCkKK3sKKyAgaWYgKChoc3BpLT5Jbml0Lk1vZGUgPT0gU1BJX01PREVfTUFTVEVSKSAmJiAoKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMUxJTkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FU19SWE9OTFkpKSkKKyAgeworICAgIC8qIERpc2FibGUgU1BJIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9TUElfRElTQUJMRShoc3BpKTsKKyAgfQorCisgIC8qIENvbnRyb2wgdGhlIEJTWSBmbGFnICovCisgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19CU1ksIFJFU0VULCBUaW1lb3V0LCBUaWNrc3RhcnQpICE9IEhBTF9PSykKKyAgeworICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0ZMQUcpOworICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgfQorCisgIGlmICgoaHNwaS0+SW5pdC5Nb2RlID09IFNQSV9NT0RFX01BU1RFUikgJiYgKChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzFMSU5FKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8yTElORVNfUlhPTkxZKSkpCisgIHsKKyAgICAvKiBFbXB0eSB0aGUgRlJMVkwgZmlmbyAqLworICAgIGlmIChTUElfV2FpdEZpZm9TdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19GUkxWTCwgU1BJX0ZSTFZMX0VNUFRZLCBUaW1lb3V0LCBUaWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9GTEFHKTsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgdGhlIGNoZWNrIG9mIHRoZSBSWFRYIG9yIFRYIHRyYW5zYWN0aW9uIGNvbXBsZXRlLgorICAqIEBwYXJhbSAgaHNwaSBTUEkgaGFuZGxlCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcGFyYW0gIFRpY2tzdGFydCB0aWNrIHN0YXJ0IHZhbHVlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1BJX0VuZFJ4VHhUcmFuc2FjdGlvbihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KQoreworICAvKiBDb250cm9sIGlmIHRoZSBUWCBmaWZvIGlzIGVtcHR5ICovCisgIGlmIChTUElfV2FpdEZpZm9TdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19GVExWTCwgU1BJX0ZUTFZMX0VNUFRZLCBUaW1lb3V0LCBUaWNrc3RhcnQpICE9IEhBTF9PSykKKyAgeworICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0ZMQUcpOworICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgfQorCisgIC8qIENvbnRyb2wgdGhlIEJTWSBmbGFnICovCisgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19CU1ksIFJFU0VULCBUaW1lb3V0LCBUaWNrc3RhcnQpICE9IEhBTF9PSykKKyAgeworICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0ZMQUcpOworICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgfQorCisgIC8qIENvbnRyb2wgaWYgdGhlIFJYIGZpZm8gaXMgZW1wdHkgKi8KKyAgaWYgKFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0ZSTFZMLCBTUElfRlJMVkxfRU1QVFksIFRpbWVvdXQsIFRpY2tzdGFydCkgIT0gSEFMX09LKQorICB7CisgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRkxBRyk7CisgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIHRoZSBlbmQgb2YgdGhlIFJYVFggdHJhbnNhY3Rpb24uCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfQ2xvc2VSeFR4X0lTUihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gMFU7CisKKyAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdtZW50Ki8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBEaXNhYmxlIEVSUiBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgU1BJX0lUX0VSUik7CisKKyAgLyogQ2hlY2sgdGhlIGVuZCBvZiB0aGUgdHJhbnNhY3Rpb24gKi8KKyAgaWYgKFNQSV9FbmRSeFR4VHJhbnNhY3Rpb24oaHNwaSwgU1BJX0RFRkFVTFRfVElNRU9VVCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgIHsKKyAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9GTEFHKTsKKyAgfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBDaGVjayBpZiBDUkMgZXJyb3Igb2NjdXJyZWQgKi8KKyAgaWYgKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBTUElfRkxBR19DUkNFUlIpICE9IFJFU0VUKQorICB7CisgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0NSQyk7CisgICAgX19IQUxfU1BJX0NMRUFSX0NSQ0VSUkZMQUcoaHNwaSk7CisgICAgSEFMX1NQSV9FcnJvckNhbGxiYWNrKGhzcGkpOworICB9CisgIGVsc2UKKyAgeworI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisgICAgaWYgKGhzcGktPkVycm9yQ29kZSA9PSBIQUxfU1BJX0VSUk9SX05PTkUpCisgICAgeworICAgICAgaWYgKGhzcGktPlN0YXRlID09IEhBTF9TUElfU1RBVEVfQlVTWV9SWCkKKyAgICAgIHsKKyAgICAgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworICAgICAgICBIQUxfU1BJX1J4Q3BsdENhbGxiYWNrKGhzcGkpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisgICAgICAgIEhBTF9TUElfVHhSeENwbHRDYWxsYmFjayhoc3BpKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKyAgICAgIEhBTF9TUElfRXJyb3JDYWxsYmFjayhoc3BpKTsKKyAgICB9CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgdGhlIGVuZCBvZiB0aGUgUlggdHJhbnNhY3Rpb24uCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfQ2xvc2VSeF9JU1IoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIERpc2FibGUgUlhORSBhbmQgRVJSIGludGVycnVwdCAqLworICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCAoU1BJX0lUX1JYTkUgfCBTUElfSVRfRVJSKSk7CisKKyAgLyogQ2hlY2sgdGhlIGVuZCBvZiB0aGUgdHJhbnNhY3Rpb24gKi8KKyAgaWYgKFNQSV9FbmRSeFRyYW5zYWN0aW9uKGhzcGksIFNQSV9ERUZBVUxUX1RJTUVPVVQsIEhBTF9HZXRUaWNrKCkpICE9IEhBTF9PSykKKyAgeworICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0ZMQUcpOworICB9CisgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyogQ2hlY2sgaWYgQ1JDIGVycm9yIG9jY3VycmVkICovCisgIGlmIChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfQ1JDRVJSKSAhPSBSRVNFVCkKKyAgeworICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0NSQyk7CisgICAgX19IQUxfU1BJX0NMRUFSX0NSQ0VSUkZMQUcoaHNwaSk7CisgICAgSEFMX1NQSV9FcnJvckNhbGxiYWNrKGhzcGkpOworICB9CisgIGVsc2UKKyAgeworI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisgICAgaWYgKGhzcGktPkVycm9yQ29kZSA9PSBIQUxfU1BJX0VSUk9SX05PTkUpCisgICAgeworICAgICAgSEFMX1NQSV9SeENwbHRDYWxsYmFjayhoc3BpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIEhBTF9TUElfRXJyb3JDYWxsYmFjayhoc3BpKTsKKyAgICB9CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgdGhlIGVuZCBvZiB0aGUgVFggdHJhbnNhY3Rpb24uCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfQ2xvc2VUeF9JU1IoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDBVOworCisgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIERpc2FibGUgVFhFIGFuZCBFUlIgaW50ZXJydXB0ICovCisgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIChTUElfSVRfVFhFIHwgU1BJX0lUX0VSUikpOworCisgIC8qIENoZWNrIHRoZSBlbmQgb2YgdGhlIHRyYW5zYWN0aW9uICovCisgIGlmIChTUElfRW5kUnhUeFRyYW5zYWN0aW9uKGhzcGksIFNQSV9ERUZBVUxUX1RJTUVPVVQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICB7CisgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRkxBRyk7CisgIH0KKworICAvKiBDbGVhciBvdmVycnVuIGZsYWcgaW4gMiBMaW5lcyBjb21tdW5pY2F0aW9uIG1vZGUgYmVjYXVzZSByZWNlaXZlZCBpcyBub3QgcmVhZCAqLworICBpZiAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8yTElORVMpCisgIHsKKyAgICBfX0hBTF9TUElfQ0xFQVJfT1ZSRkxBRyhoc3BpKTsKKyAgfQorCisgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKyAgaWYgKGhzcGktPkVycm9yQ29kZSAhPSBIQUxfU1BJX0VSUk9SX05PTkUpCisgIHsKKyAgICBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soaHNwaSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgSEFMX1NQSV9UeENwbHRDYWxsYmFjayhoc3BpKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBhYm9ydCBhIFJ4IHRyYW5zYWN0aW9uLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX0Fib3J0UnhfSVNSKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICBfX0lPIHVpbnQzMl90IGNvdW50OworCisgIC8qIERpc2FibGUgU1BJIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfU1BJX0RJU0FCTEUoaHNwaSk7CisKKyAgY291bnQgPSBTUElfREVGQVVMVF9USU1FT1VUICogKFN5c3RlbUNvcmVDbG9jayAvIDI0VSAvIDEwMDBVKTsKKworICAvKiBEaXNhYmxlIFRYRUlFLCBSWE5FSUUgYW5kIEVSUklFKG1vZGUgZmF1bHQgZXZlbnQsIG92ZXJydW4gZXJyb3IsIFRJIGZyYW1lIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCAoU1BJX0NSMl9UWEVJRSB8IFNQSV9DUjJfUlhORUlFIHwgU1BJX0NSMl9FUlJJRSkpOworCisgIC8qIENoZWNrIFJYTkVJRSBpcyBkaXNhYmxlZCAqLworICBkbworICB7CisgICAgaWYgKGNvdW50LS0gPT0gMFUpCisgICAgeworICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQUJPUlQpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHdoaWxlIChIQUxfSVNfQklUX1NFVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1JYTkVJRSkpOworCisgIC8qIENvbnRyb2wgdGhlIEJTWSBmbGFnICovCisgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19CU1ksIFJFU0VULCBTUElfREVGQVVMVF9USU1FT1VULCBIQUxfR2V0VGljaygpKSAhPSBIQUxfT0spCisgIHsKKyAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICB9CisKKyAgLyogRW1wdHkgdGhlIEZSTFZMIGZpZm8gKi8KKyAgaWYgKFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0ZSTFZMLCBTUElfRlJMVkxfRU1QVFksIFNQSV9ERUZBVUxUX1RJTUVPVVQsIEhBTF9HZXRUaWNrKCkpICE9IEhBTF9PSykKKyAgeworICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7CisgIH0KKworICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfQUJPUlQ7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIGFib3J0IGEgVHggb3IgUngvVHggdHJhbnNhY3Rpb24uCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfQWJvcnRUeF9JU1IoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIF9fSU8gdWludDMyX3QgY291bnQ7CisKKyAgY291bnQgPSBTUElfREVGQVVMVF9USU1FT1VUICogKFN5c3RlbUNvcmVDbG9jayAvIDI0VSAvIDEwMDBVKTsKKworICAvKiBEaXNhYmxlIFRYRUlFLCBSWE5FSUUgYW5kIEVSUklFKG1vZGUgZmF1bHQgZXZlbnQsIG92ZXJydW4gZXJyb3IsIFRJIGZyYW1lIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCAoU1BJX0NSMl9UWEVJRSB8IFNQSV9DUjJfUlhORUlFIHwgU1BJX0NSMl9FUlJJRSkpOworCisgIC8qIENoZWNrIFRYRUlFIGlzIGRpc2FibGVkICovCisgIGRvCisgIHsKKyAgICBpZiAoY291bnQtLSA9PSAwVSkKKyAgICB7CisgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9BQk9SVCk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgd2hpbGUgKEhBTF9JU19CSVRfU0VUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhFSUUpKTsKKworICBpZiAoU1BJX0VuZFJ4VHhUcmFuc2FjdGlvbihoc3BpLCBTUElfREVGQVVMVF9USU1FT1VULCBIQUxfR2V0VGljaygpKSAhPSBIQUxfT0spCisgIHsKKyAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICB9CisKKyAgLyogRGlzYWJsZSBTUEkgUGVyaXBoZXJhbCAqLworICBfX0hBTF9TUElfRElTQUJMRShoc3BpKTsKKworICAvKiBFbXB0eSB0aGUgRlJMVkwgZmlmbyAqLworICBpZiAoU1BJX1dhaXRGaWZvU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfRlJMVkwsIFNQSV9GUkxWTF9FTVBUWSwgU1BJX0RFRkFVTFRfVElNRU9VVCwgSEFMX0dldFRpY2soKSkgIT0gSEFMX09LKQorICB7CisgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsKKyAgfQorCisgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9BQk9SVDsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9TUElfTU9EVUxFX0VOQUJMRUQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmYzeHhfaGFsX3NwaV9leC5jIGIvU3JjL3N0bTMyZjN4eF9oYWxfc3BpX2V4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY3YjIwOAotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfaGFsX3NwaV9leC5jCkBAIC0wLDAgKzEsMTMxIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2hhbF9zcGlfZXguYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgRXh0ZW5kZWQgU1BJIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBTUEkgcGVyaXBoZXJhbCBleHRlbmRlZCBmdW5jdGlvbmFsaXRpZXMgOgorICAqICAgICAgICAgICArIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJRXggU1BJRXgKKyAgKiBAYnJpZWYgU1BJIEV4dGVuZGVkIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKyNpZmRlZiBIQUxfU1BJX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTUElFeF9Qcml2YXRlX0NvbnN0YW50cyBTUElFeCBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisjZGVmaW5lIFNQSV9GSUZPX1NJWkUgICAgICAgNAorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgU1BJRXhfRXhwb3J0ZWRfRnVuY3Rpb25zIFNQSUV4IEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogIEBicmllZiAgIERhdGEgdHJhbnNmZXJzIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGV4dGVuZGVkIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIFNQSQorICAgIGRhdGEgdHJhbnNmZXJzLgorCisgICAgKCMpIFJ4IGRhdGEgZmx1c2ggZnVuY3Rpb246CisgICAgICAgICgrKykgSEFMX1NQSUV4X0ZsdXNoUnhGaWZvKCkKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIEZsdXNoIHRoZSBSWCBmaWZvLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJRXhfRmx1c2hSeEZpZm8oU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICB1aW50OF90ICBjb3VudCA9IDBVOworICB3aGlsZSAoKGhzcGktPkluc3RhbmNlLT5TUiAmIFNQSV9GTEFHX0ZSTFZMKSAhPSAgU1BJX0ZSTFZMX0VNUFRZKQorICB7CisgICAgY291bnQrKzsKKyAgICB0bXByZWcgPSBoc3BpLT5JbnN0YW5jZS0+RFI7CisgICAgVU5VU0VEKHRtcHJlZyk7IC8qIFRvIGF2b2lkIEdDQyB3YXJuaW5nICovCisgICAgaWYgKGNvdW50ID09IFNQSV9GSUZPX1NJWkUpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX1NQSV9NT0RVTEVfRU5BQkxFRCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjN4eF9oYWxfc3JhbS5jIGIvU3JjL3N0bTMyZjN4eF9oYWxfc3JhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YzE0MWIKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJmM3h4X2hhbF9zcmFtLmMKQEAgLTAsMCArMSw2OTMgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX3NyYW0uYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgU1JBTSBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgYSBnZW5lcmljIGZpcm13YXJlIHRvIGRyaXZlIFNSQU0gbWVtb3JpZXMgIAorICAqICAgICAgICAgIG1vdW50ZWQgYXMgZXh0ZXJuYWwgZGV2aWNlLgorICAqICAgICAgICAgCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICBbLi5dCisgICAgVGhpcyBkcml2ZXIgaXMgYSBnZW5lcmljIGxheWVyZWQgZHJpdmVyIHdoaWNoIGNvbnRhaW5zIGEgc2V0IG9mIEFQSXMgdXNlZCB0byAKKyAgICBjb250cm9sIFNSQU0gbWVtb3JpZXMuIEl0IHVzZXMgdGhlIEZNQyBsYXllciBmdW5jdGlvbnMgdG8gaW50ZXJmYWNlIAorICAgIHdpdGggU1JBTSBkZXZpY2VzLiAgCisgICAgVGhlIGZvbGxvd2luZyBzZXF1ZW5jZSBzaG91bGQgYmUgZm9sbG93ZWQgdG8gY29uZmlndXJlIHRoZSBGTUMgdG8gaW50ZXJmYWNlCisgICAgd2l0aCBTUkFNL1BTUkFNIG1lbW9yaWVzOiAKKyAgICAgIAorICAgKCMpIERlY2xhcmUgYSBTUkFNX0hhbmRsZVR5cGVEZWYgaGFuZGxlIHN0cnVjdHVyZSwgZm9yIGV4YW1wbGU6CisgICAgICAgICAgU1JBTV9IYW5kbGVUeXBlRGVmICBoc3JhbTsgYW5kOiAKKyAgICAgICAgICAKKyAgICAgICAoKyspIEZpbGwgdGhlIFNSQU1fSGFuZGxlVHlwZURlZiBoYW5kbGUgIkluaXQiIGZpZWxkIHdpdGggdGhlIGFsbG93ZWQgCisgICAgICAgICAgICB2YWx1ZXMgb2YgdGhlIHN0cnVjdHVyZSBtZW1iZXIuCisgICAgICAgICAgICAKKyAgICAgICAoKyspIEZpbGwgdGhlIFNSQU1fSGFuZGxlVHlwZURlZiBoYW5kbGUgIkluc3RhbmNlIiBmaWVsZCB3aXRoIGEgcHJlZGVmaW5lZCAKKyAgICAgICAgICAgIGJhc2UgcmVnaXN0ZXIgaW5zdGFuY2UgZm9yIE5PUiBvciBTUkFNIGRldmljZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAoKyspIEZpbGwgdGhlIFNSQU1fSGFuZGxlVHlwZURlZiBoYW5kbGUgIkV4dGVuZGVkIiBmaWVsZCB3aXRoIGEgcHJlZGVmaW5lZAorICAgICAgICAgICAgYmFzZSByZWdpc3RlciBpbnN0YW5jZSBmb3IgTk9SIG9yIFNSQU0gZXh0ZW5kZWQgbW9kZSAKKyAgICAgICAgICAgICAKKyAgICgjKSBEZWNsYXJlIHR3byBGTUNfTk9SU1JBTV9UaW1pbmdUeXBlRGVmIHN0cnVjdHVyZXMsIGZvciBib3RoIG5vcm1hbCBhbmQgZXh0ZW5kZWQgCisgICAgICAgbW9kZSB0aW1pbmdzOyBmb3IgZXhhbXBsZToKKyAgICAgICAgICBGTUNfTk9SU1JBTV9UaW1pbmdUeXBlRGVmICBUaW1pbmcgYW5kIEZNQ19OT1JTUkFNX1RpbWluZ1R5cGVEZWYgIEV4VGltaW5nOworICAgICAgYW5kIGZpbGwgaXRzIGZpZWxkcyB3aXRoIHRoZSBhbGxvd2VkIHZhbHVlcyBvZiB0aGUgc3RydWN0dXJlIG1lbWJlci4KKyAgICAgIAorICAgKCMpIEluaXRpYWxpemUgdGhlIFNSQU0gQ29udHJvbGxlciBieSBjYWxsaW5nIHRoZSBmdW5jdGlvbiBIQUxfU1JBTV9Jbml0KCkuIFRoaXMgZnVuY3Rpb24KKyAgICAgICBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIHNlcXVlbmNlOgorICAgICAgICAgIAorICAgICAgICgjIykgTVNQIGhhcmR3YXJlIGxheWVyIGNvbmZpZ3VyYXRpb24gdXNpbmcgdGhlIGZ1bmN0aW9uIEhBTF9TUkFNX01zcEluaXQoKQorICAgICAgICgjIykgQ29udHJvbCByZWdpc3RlciBjb25maWd1cmF0aW9uIHVzaW5nIHRoZSBGTUMgTk9SU1JBTSBpbnRlcmZhY2UgZnVuY3Rpb24gCisgICAgICAgICAgICBGTUNfTk9SU1JBTV9Jbml0KCkKKyAgICAgICAoIyMpIFRpbWluZyByZWdpc3RlciBjb25maWd1cmF0aW9uIHVzaW5nIHRoZSBGTUMgTk9SU1JBTSBpbnRlcmZhY2UgZnVuY3Rpb24gCisgICAgICAgICAgICBGTUNfTk9SU1JBTV9UaW1pbmdfSW5pdCgpCisgICAgICAgKCMjKSBFeHRlbmRlZCBtb2RlIFRpbWluZyByZWdpc3RlciBjb25maWd1cmF0aW9uIHVzaW5nIHRoZSBGTUMgTk9SU1JBTSBpbnRlcmZhY2UgZnVuY3Rpb24gCisgICAgICAgICAgICBGTUNfTk9SU1JBTV9FeHRlbmRlZF9UaW1pbmdfSW5pdCgpCisgICAgICAgKCMjKSBFbmFibGUgdGhlIFNSQU0gZGV2aWNlIHVzaW5nIHRoZSBtYWNybyBfX0ZNQ19OT1JTUkFNX0VOQUJMRSgpICAgIAorCisgICAoIykgQXQgdGhpcyBzdGFnZSB5b3UgY2FuIHBlcmZvcm0gcmVhZC93cml0ZSBhY2Nlc3NlcyBmcm9tL3RvIHRoZSBtZW1vcnkgY29ubmVjdGVkIAorICAgICAgIHRvIHRoZSBOT1IvU1JBTSBCYW5rLiBZb3UgY2FuIHBlcmZvcm0gZWl0aGVyIHBvbGxpbmcgb3IgRE1BIHRyYW5zZmVyIHVzaW5nIHRoZQorICAgICAgIGZvbGxvd2luZyBBUElzOgorICAgICAgICgrKykgSEFMX1NSQU1fUmVhZCgpL0hBTF9TUkFNX1dyaXRlKCkgZm9yIHBvbGxpbmcgcmVhZC93cml0ZSBhY2Nlc3MKKyAgICAgICAoKyspIEhBTF9TUkFNX1JlYWRfRE1BKCkvSEFMX1NSQU1fV3JpdGVfRE1BKCkgZm9yIERNQSByZWFkL3dyaXRlIHRyYW5zZmVyCisgICAgICAgCisgICAoIykgWW91IGNhbiBhbHNvIGNvbnRyb2wgdGhlIFNSQU0gZGV2aWNlIGJ5IGNhbGxpbmcgdGhlIGNvbnRyb2wgQVBJcyBIQUxfU1JBTV9Xcml0ZU9wZXJhdGlvbl9FbmFibGUoKS8KKyAgICAgICBIQUxfU1JBTV9Xcml0ZU9wZXJhdGlvbl9EaXNhYmxlKCkgdG8gcmVzcGVjdGl2ZWx5IGVuYWJsZS9kaXNhYmxlIHRoZSBTUkFNIHdyaXRlIG9wZXJhdGlvbiAgCisgICAgICAgCisgICAoIykgWW91IGNhbiBjb250aW51b3VzbHkgbW9uaXRvciB0aGUgU1JBTSBkZXZpY2UgSEFMIHN0YXRlIGJ5IGNhbGxpbmcgdGhlIGZ1bmN0aW9uCisgICAgICAgSEFMX1NSQU1fR2V0U3RhdGUoKSAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovIAorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWwuaCIKKworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfU1JBTV9NT0RVTEVfRU5BQkxFRAorCisvKiogQGRlZmdyb3VwIFNSQU0gU1JBTQorICAqIEBicmllZiBTUkFNIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gICAgCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgU1JBTV9FeHBvcnRlZF9GdW5jdGlvbnMgU1JBTSBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFNSQU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucy4KKyAgKgorICBAdmVyYmF0aW0gICAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAjIyMjIyBTUkFNIEluaXRpYWxpemF0aW9uIGFuZCBkZV9pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplL2RlLWluaXRpYWxpemUKKyAgICAgICAgICB0aGUgU1JBTSBtZW1vcnkKKyAgCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFBlcmZvcm1zIHRoZSBTUkFNIGRldmljZSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZQorICAqIEBwYXJhbSAgaHNyYW0gcG9pbnRlciB0byBhIFNSQU1fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUkFNIG1vZHVsZS4KKyAgKiBAcGFyYW0gIFRpbWluZyBQb2ludGVyIHRvIFNSQU0gY29udHJvbCB0aW1pbmcgc3RydWN0dXJlIAorICAqIEBwYXJhbSAgRXh0VGltaW5nIFBvaW50ZXIgdG8gU1JBTSBleHRlbmRlZCBtb2RlIHRpbWluZyBzdHJ1Y3R1cmUgIAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NSQU1fSW5pdChTUkFNX0hhbmRsZVR5cGVEZWYgKmhzcmFtLCBGTUNfTk9SU1JBTV9UaW1pbmdUeXBlRGVmICpUaW1pbmcsIEZNQ19OT1JTUkFNX1RpbWluZ1R5cGVEZWYgKkV4dFRpbWluZykKK3sgCisgIC8qIENoZWNrIHRoZSBTUkFNIGhhbmRsZSBwYXJhbWV0ZXIgKi8KKyAgaWYoaHNyYW0gPT0gTlVMTCkKKyAgeworICAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIAorICBpZihoc3JhbS0+U3RhdGUgPT0gSEFMX1NSQU1fU1RBVEVfUkVTRVQpCisgIHsgIAorICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBoc3JhbS0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKyAgICAKKyAgICAvKiBJbml0aWFsaXplIHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKE1TUCkgKi8KKyAgICBIQUxfU1JBTV9Nc3BJbml0KGhzcmFtKTsKKyAgfQorICAKKyAgLyogSW5pdGlhbGl6ZSBTUkFNIGNvbnRyb2wgSW50ZXJmYWNlICovCisgIEZNQ19OT1JTUkFNX0luaXQoaHNyYW0tPkluc3RhbmNlLCAmKGhzcmFtLT5Jbml0KSk7CisKKyAgLyogSW5pdGlhbGl6ZSBTUkFNIHRpbWluZyBJbnRlcmZhY2UgKi8KKyAgRk1DX05PUlNSQU1fVGltaW5nX0luaXQoaHNyYW0tPkluc3RhbmNlLCBUaW1pbmcsIGhzcmFtLT5Jbml0Lk5TQmFuayk7IAorCisgIC8qIEluaXRpYWxpemUgU1JBTSBleHRlbmRlZCBtb2RlIHRpbWluZyBJbnRlcmZhY2UgKi8KKyAgRk1DX05PUlNSQU1fRXh0ZW5kZWRfVGltaW5nX0luaXQoaHNyYW0tPkV4dGVuZGVkLCBFeHRUaW1pbmcsIGhzcmFtLT5Jbml0Lk5TQmFuaywgIGhzcmFtLT5Jbml0LkV4dGVuZGVkTW9kZSk7ICAKKyAgCisgIC8qIEVuYWJsZSB0aGUgTk9SU1JBTSBkZXZpY2UgKi8KKyAgX19GTUNfTk9SU1JBTV9FTkFCTEUoaHNyYW0tPkluc3RhbmNlLCBoc3JhbS0+SW5pdC5OU0JhbmspOyAKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgUGVyZm9ybXMgdGhlIFNSQU0gZGV2aWNlIERlLWluaXRpYWxpemF0aW9uIHNlcXVlbmNlLgorICAqIEBwYXJhbSAgaHNyYW0gcG9pbnRlciB0byBhIFNSQU1fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUkFNIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmICBIQUxfU1JBTV9EZUluaXQoU1JBTV9IYW5kbGVUeXBlRGVmICpoc3JhbSkKK3sgCisgIC8qIERlLUluaXRpYWxpemUgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAoTVNQKSAqLworICBIQUxfU1JBTV9Nc3BEZUluaXQoaHNyYW0pOworICAgCisgIC8qIENvbmZpZ3VyZSB0aGUgU1JBTSByZWdpc3RlcnMgd2l0aCB0aGVpciByZXNldCB2YWx1ZXMgKi8KKyAgRk1DX05PUlNSQU1fRGVJbml0KGhzcmFtLT5JbnN0YW5jZSwgaHNyYW0tPkV4dGVuZGVkLCBoc3JhbS0+SW5pdC5OU0JhbmspOworCisgIGhzcmFtLT5TdGF0ZSA9IEhBTF9TUkFNX1NUQVRFX1JFU0VUOworICAKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoc3JhbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTUkFNIE1TUCBJbml0LgorICAqIEBwYXJhbSAgaHNyYW0gcG9pbnRlciB0byBhIFNSQU1fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUkFNIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TUkFNX01zcEluaXQoU1JBTV9IYW5kbGVUeXBlRGVmICpoc3JhbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNyYW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU1JBTV9Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovIAorfQorCisvKioKKyAgKiBAYnJpZWYgIFNSQU0gTVNQIERlSW5pdC4KKyAgKiBAcGFyYW0gIGhzcmFtIHBvaW50ZXIgdG8gYSBTUkFNX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1JBTSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU1JBTV9Nc3BEZUluaXQoU1JBTV9IYW5kbGVUeXBlRGVmICpoc3JhbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNyYW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU1JBTV9Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgU1JBTV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNSQU0gbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NSQU1fRE1BX1hmZXJDcGx0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhkbWEpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU1JBTV9ETUFfWGZlckNwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQGJyaWVmICBETUEgdHJhbnNmZXIgY29tcGxldGUgZXJyb3IgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBTUkFNX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1JBTSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU1JBTV9ETUFfWGZlckVycm9yQ2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhkbWEpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU1JBTV9ETUFfWGZlckVycm9yQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1JBTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElucHV0IE91dHB1dCBhbmQgbWVtb3J5IGNvbnRyb2wgZnVuY3Rpb25zIAorICAqIEBicmllZiAgICBJbnB1dCBPdXRwdXQgYW5kIG1lbW9yeSBjb250cm9sIGZ1bmN0aW9ucyAKKyAgKgorICBAdmVyYmF0aW0gICAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgIyMjIyMgU1JBTSBJbnB1dCBhbmQgT3V0cHV0IGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXSAgCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byB1c2UgYW5kIGNvbnRyb2wgdGhlIFNSQU0gbWVtb3J5CisgIAorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZWFkcyA4LWJpdCBidWZmZXIgZnJvbSBTUkFNIG1lbW9yeS4gCisgICogQHBhcmFtICBoc3JhbSBwb2ludGVyIHRvIGEgU1JBTV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNSQU0gbW9kdWxlLgorICAqIEBwYXJhbSAgcEFkZHJlc3MgUG9pbnRlciB0byByZWFkIHN0YXJ0IGFkZHJlc3MKKyAgKiBAcGFyYW0gIHBEc3RCdWZmZXIgUG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIgIAorICAqIEBwYXJhbSAgQnVmZmVyU2l6ZSBTaXplIG9mIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIG1lbW9yeQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NSQU1fUmVhZF84YihTUkFNX0hhbmRsZVR5cGVEZWYgKmhzcmFtLCB1aW50MzJfdCAqcEFkZHJlc3MsIHVpbnQ4X3QgKnBEc3RCdWZmZXIsIHVpbnQzMl90IEJ1ZmZlclNpemUpCit7CisgIF9fSU8gdWludDhfdCAqIHBzcmFtYWRkcmVzcyA9ICh1aW50OF90ICopcEFkZHJlc3M7CisgIAorICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzcmFtKTsKKyAgCisgIC8qIFVwZGF0ZSB0aGUgU1JBTSBjb250cm9sbGVyIHN0YXRlICovCisgIGhzcmFtLT5TdGF0ZSA9IEhBTF9TUkFNX1NUQVRFX0JVU1k7ICAKKyAgCisgIC8qIFJlYWQgZGF0YSBmcm9tIG1lbW9yeSAqLworICBmb3IoOyBCdWZmZXJTaXplICE9IDBVOyBCdWZmZXJTaXplLS0pCisgIHsKKyAgICAqcERzdEJ1ZmZlciA9ICooX19JTyB1aW50OF90ICopcHNyYW1hZGRyZXNzOworICAgIHBEc3RCdWZmZXIrKzsKKyAgICBwc3JhbWFkZHJlc3MrKzsKKyAgfQorICAKKyAgLyogVXBkYXRlIHRoZSBTUkFNIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaHNyYW0tPlN0YXRlID0gSEFMX1NSQU1fU1RBVEVfUkVBRFk7ICAgIAorCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzcmFtKTsgCisgICAgCisgIHJldHVybiBIQUxfT0s7ICAgCit9CisKKy8qKgorICAqIEBicmllZiAgV3JpdGVzIDgtYml0IGJ1ZmZlciB0byBTUkFNIG1lbW9yeS4gCisgICogQHBhcmFtICBoc3JhbSBwb2ludGVyIHRvIGEgU1JBTV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNSQU0gbW9kdWxlLgorICAqIEBwYXJhbSAgcEFkZHJlc3MgUG9pbnRlciB0byB3cml0ZSBzdGFydCBhZGRyZXNzCisgICogQHBhcmFtICBwU3JjQnVmZmVyIFBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlciB0byB3cml0ZSAgCisgICogQHBhcmFtICBCdWZmZXJTaXplIFNpemUgb2YgdGhlIGJ1ZmZlciB0byB3cml0ZSB0byBtZW1vcnkKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUkFNX1dyaXRlXzhiKFNSQU1fSGFuZGxlVHlwZURlZiAqaHNyYW0sIHVpbnQzMl90ICpwQWRkcmVzcywgdWludDhfdCAqcFNyY0J1ZmZlciwgdWludDMyX3QgQnVmZmVyU2l6ZSkKK3sKKyAgX19JTyB1aW50OF90ICogcHNyYW1hZGRyZXNzID0gKHVpbnQ4X3QgKilwQWRkcmVzczsKKyAgCisgIC8qIENoZWNrIHRoZSBTUkFNIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaWYoaHNyYW0tPlN0YXRlID09IEhBTF9TUkFNX1NUQVRFX1BST1RFQ1RFRCkKKyAgeworICAgIHJldHVybiAgSEFMX0VSUk9SOyAKKyAgfQorICAKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3JhbSk7CisgIAorICAvKiBVcGRhdGUgdGhlIFNSQU0gY29udHJvbGxlciBzdGF0ZSAqLworICBoc3JhbS0+U3RhdGUgPSBIQUxfU1JBTV9TVEFURV9CVVNZOyAKKworICAvKiBXcml0ZSBkYXRhIHRvIG1lbW9yeSAqLworICBmb3IoOyBCdWZmZXJTaXplICE9IDBVOyBCdWZmZXJTaXplLS0pCisgIHsKKyAgICAqKF9fSU8gdWludDhfdCAqKXBzcmFtYWRkcmVzcyA9ICpwU3JjQnVmZmVyOyAKKyAgICBwU3JjQnVmZmVyKys7CisgICAgcHNyYW1hZGRyZXNzKys7ICAgIAorICB9ICAgIAorCisgIC8qIFVwZGF0ZSB0aGUgU1JBTSBjb250cm9sbGVyIHN0YXRlICovCisgIGhzcmFtLT5TdGF0ZSA9IEhBTF9TUkFNX1NUQVRFX1JFQURZOyAKKyAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzcmFtKTsKKyAgICAKKyAgcmV0dXJuIEhBTF9PSzsgICAKK30KKworLyoqCisgICogQGJyaWVmICBSZWFkcyAxNi1iaXQgYnVmZmVyIGZyb20gU1JBTSBtZW1vcnkuIAorICAqIEBwYXJhbSAgaHNyYW0gcG9pbnRlciB0byBhIFNSQU1fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUkFNIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBBZGRyZXNzIFBvaW50ZXIgdG8gcmVhZCBzdGFydCBhZGRyZXNzCisgICogQHBhcmFtICBwRHN0QnVmZmVyIFBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyICAKKyAgKiBAcGFyYW0gIEJ1ZmZlclNpemUgU2l6ZSBvZiB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSBtZW1vcnkKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUkFNX1JlYWRfMTZiKFNSQU1fSGFuZGxlVHlwZURlZiAqaHNyYW0sIHVpbnQzMl90ICpwQWRkcmVzcywgdWludDE2X3QgKnBEc3RCdWZmZXIsIHVpbnQzMl90IEJ1ZmZlclNpemUpCit7CisgIF9fSU8gdWludDE2X3QgKiBwc3JhbWFkZHJlc3MgPSAodWludDE2X3QgKilwQWRkcmVzczsKKyAgCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNyYW0pOworICAKKyAgLyogVXBkYXRlIHRoZSBTUkFNIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaHNyYW0tPlN0YXRlID0gSEFMX1NSQU1fU1RBVEVfQlVTWTsgIAorICAKKyAgLyogUmVhZCBkYXRhIGZyb20gbWVtb3J5ICovCisgIGZvcig7IEJ1ZmZlclNpemUgIT0gMFU7IEJ1ZmZlclNpemUtLSkKKyAgeworICAgICpwRHN0QnVmZmVyID0gKihfX0lPIHVpbnQxNl90ICopcHNyYW1hZGRyZXNzOworICAgIHBEc3RCdWZmZXIrKzsKKyAgICBwc3JhbWFkZHJlc3MrKzsKKyAgfQorICAKKyAgLyogVXBkYXRlIHRoZSBTUkFNIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaHNyYW0tPlN0YXRlID0gSEFMX1NSQU1fU1RBVEVfUkVBRFk7ICAgIAorCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzcmFtKTsgCisgICAgCisgIHJldHVybiBIQUxfT0s7ICAKK30KKworLyoqCisgICogQGJyaWVmICBXcml0ZXMgMTYtYml0IGJ1ZmZlciB0byBTUkFNIG1lbW9yeS4gCisgICogQHBhcmFtICBoc3JhbSBwb2ludGVyIHRvIGEgU1JBTV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNSQU0gbW9kdWxlLgorICAqIEBwYXJhbSAgcEFkZHJlc3MgUG9pbnRlciB0byB3cml0ZSBzdGFydCBhZGRyZXNzCisgICogQHBhcmFtICBwU3JjQnVmZmVyIFBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlciB0byB3cml0ZSAgCisgICogQHBhcmFtICBCdWZmZXJTaXplIFNpemUgb2YgdGhlIGJ1ZmZlciB0byB3cml0ZSB0byBtZW1vcnkKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUkFNX1dyaXRlXzE2YihTUkFNX0hhbmRsZVR5cGVEZWYgKmhzcmFtLCB1aW50MzJfdCAqcEFkZHJlc3MsIHVpbnQxNl90ICpwU3JjQnVmZmVyLCB1aW50MzJfdCBCdWZmZXJTaXplKQoreworICBfX0lPIHVpbnQxNl90ICogcHNyYW1hZGRyZXNzID0gKHVpbnQxNl90ICopcEFkZHJlc3M7IAorICAKKyAgLyogQ2hlY2sgdGhlIFNSQU0gY29udHJvbGxlciBzdGF0ZSAqLworICBpZihoc3JhbS0+U3RhdGUgPT0gSEFMX1NSQU1fU1RBVEVfUFJPVEVDVEVEKQorICB7CisgICAgcmV0dXJuICBIQUxfRVJST1I7IAorICB9CisgIAorICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzcmFtKTsKKyAgCisgIC8qIFVwZGF0ZSB0aGUgU1JBTSBjb250cm9sbGVyIHN0YXRlICovCisgIGhzcmFtLT5TdGF0ZSA9IEhBTF9TUkFNX1NUQVRFX0JVU1k7IAorCisgIC8qIFdyaXRlIGRhdGEgdG8gbWVtb3J5ICovCisgIGZvcig7IEJ1ZmZlclNpemUgIT0gMFU7IEJ1ZmZlclNpemUtLSkKKyAgeworICAgICooX19JTyB1aW50MTZfdCAqKXBzcmFtYWRkcmVzcyA9ICpwU3JjQnVmZmVyOyAKKyAgICBwU3JjQnVmZmVyKys7CisgICAgcHNyYW1hZGRyZXNzKys7ICAgIAorICB9ICAgIAorCisgIC8qIFVwZGF0ZSB0aGUgU1JBTSBjb250cm9sbGVyIHN0YXRlICovCisgIGhzcmFtLT5TdGF0ZSA9IEhBTF9TUkFNX1NUQVRFX1JFQURZOyAKKyAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzcmFtKTsKKyAgICAKKyAgcmV0dXJuIEhBTF9PSzsgIAorfQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWRzIDMyLWJpdCBidWZmZXIgZnJvbSBTUkFNIG1lbW9yeS4gCisgICogQHBhcmFtICBoc3JhbSBwb2ludGVyIHRvIGEgU1JBTV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNSQU0gbW9kdWxlLgorICAqIEBwYXJhbSAgcEFkZHJlc3MgUG9pbnRlciB0byByZWFkIHN0YXJ0IGFkZHJlc3MKKyAgKiBAcGFyYW0gIHBEc3RCdWZmZXIgUG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIgIAorICAqIEBwYXJhbSAgQnVmZmVyU2l6ZSBTaXplIG9mIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIG1lbW9yeQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NSQU1fUmVhZF8zMmIoU1JBTV9IYW5kbGVUeXBlRGVmICpoc3JhbSwgdWludDMyX3QgKnBBZGRyZXNzLCB1aW50MzJfdCAqcERzdEJ1ZmZlciwgdWludDMyX3QgQnVmZmVyU2l6ZSkKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3JhbSk7CisgIAorICAvKiBVcGRhdGUgdGhlIFNSQU0gY29udHJvbGxlciBzdGF0ZSAqLworICBoc3JhbS0+U3RhdGUgPSBIQUxfU1JBTV9TVEFURV9CVVNZOyAgCisgIAorICAvKiBSZWFkIGRhdGEgZnJvbSBtZW1vcnkgKi8KKyAgZm9yKDsgQnVmZmVyU2l6ZSAhPSAwVTsgQnVmZmVyU2l6ZS0tKQorICB7CisgICAgKnBEc3RCdWZmZXIgPSAqKF9fSU8gdWludDMyX3QgKilwQWRkcmVzczsKKyAgICBwRHN0QnVmZmVyKys7CisgICAgcEFkZHJlc3MrKzsKKyAgfQorICAKKyAgLyogVXBkYXRlIHRoZSBTUkFNIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaHNyYW0tPlN0YXRlID0gSEFMX1NSQU1fU1RBVEVfUkVBRFk7ICAgIAorCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzcmFtKTsgCisgICAgCisgIHJldHVybiBIQUxfT0s7ICAKK30KKworLyoqCisgICogQGJyaWVmICBXcml0ZXMgMzItYml0IGJ1ZmZlciB0byBTUkFNIG1lbW9yeS4gCisgICogQHBhcmFtICBoc3JhbSBwb2ludGVyIHRvIGEgU1JBTV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNSQU0gbW9kdWxlLgorICAqIEBwYXJhbSAgcEFkZHJlc3MgUG9pbnRlciB0byB3cml0ZSBzdGFydCBhZGRyZXNzCisgICogQHBhcmFtICBwU3JjQnVmZmVyIFBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlciB0byB3cml0ZSAgCisgICogQHBhcmFtICBCdWZmZXJTaXplIFNpemUgb2YgdGhlIGJ1ZmZlciB0byB3cml0ZSB0byBtZW1vcnkKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUkFNX1dyaXRlXzMyYihTUkFNX0hhbmRsZVR5cGVEZWYgKmhzcmFtLCB1aW50MzJfdCAqcEFkZHJlc3MsIHVpbnQzMl90ICpwU3JjQnVmZmVyLCB1aW50MzJfdCBCdWZmZXJTaXplKQoreworICAvKiBDaGVjayB0aGUgU1JBTSBjb250cm9sbGVyIHN0YXRlICovCisgIGlmKGhzcmFtLT5TdGF0ZSA9PSBIQUxfU1JBTV9TVEFURV9QUk9URUNURUQpCisgIHsKKyAgICByZXR1cm4gIEhBTF9FUlJPUjsgCisgIH0KKyAgCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNyYW0pOworICAKKyAgLyogVXBkYXRlIHRoZSBTUkFNIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaHNyYW0tPlN0YXRlID0gSEFMX1NSQU1fU1RBVEVfQlVTWTsgCisKKyAgLyogV3JpdGUgZGF0YSB0byBtZW1vcnkgKi8KKyAgZm9yKDsgQnVmZmVyU2l6ZSAhPSAwVTsgQnVmZmVyU2l6ZS0tKQorICB7CisgICAgKihfX0lPIHVpbnQzMl90ICopcEFkZHJlc3MgPSAqcFNyY0J1ZmZlcjsgCisgICAgcFNyY0J1ZmZlcisrOworICAgIHBBZGRyZXNzKys7ICAgIAorICB9ICAgIAorCisgIC8qIFVwZGF0ZSB0aGUgU1JBTSBjb250cm9sbGVyIHN0YXRlICovCisgIGhzcmFtLT5TdGF0ZSA9IEhBTF9TUkFNX1NUQVRFX1JFQURZOyAKKyAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzcmFtKTsKKyAgICAKKyAgcmV0dXJuIEhBTF9PSzsgICAKK30KKworLyoqCisgICogQGJyaWVmICBSZWFkcyBhIFdvcmRzIGRhdGEgZnJvbSB0aGUgU1JBTSBtZW1vcnkgdXNpbmcgRE1BIHRyYW5zZmVyLgorICAqIEBwYXJhbSAgaHNyYW0gcG9pbnRlciB0byBhIFNSQU1fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUkFNIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBBZGRyZXNzIFBvaW50ZXIgdG8gcmVhZCBzdGFydCBhZGRyZXNzCisgICogQHBhcmFtICBwRHN0QnVmZmVyIFBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyICAKKyAgKiBAcGFyYW0gIEJ1ZmZlclNpemUgU2l6ZSBvZiB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSBtZW1vcnkKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUkFNX1JlYWRfRE1BKFNSQU1fSGFuZGxlVHlwZURlZiAqaHNyYW0sIHVpbnQzMl90ICpwQWRkcmVzcywgdWludDMyX3QgKnBEc3RCdWZmZXIsIHVpbnQzMl90IEJ1ZmZlclNpemUpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNyYW0pOyAgCisgIAorICAvKiBVcGRhdGUgdGhlIFNSQU0gY29udHJvbGxlciBzdGF0ZSAqLworICBoc3JhbS0+U3RhdGUgPSBIQUxfU1JBTV9TVEFURV9CVVNZOyAgIAorICAKKyAgLyogQ29uZmlndXJlIERNQSB1c2VyIGNhbGxiYWNrcyAqLworICBoc3JhbS0+aGRtYS0+WGZlckNwbHRDYWxsYmFjayAgPSBIQUxfU1JBTV9ETUFfWGZlckNwbHRDYWxsYmFjazsKKyAgaHNyYW0tPmhkbWEtPlhmZXJFcnJvckNhbGxiYWNrID0gSEFMX1NSQU1fRE1BX1hmZXJFcnJvckNhbGxiYWNrOworCisgIC8qIEVuYWJsZSB0aGUgRE1BIENoYW5uZWwgKi8KKyAgSEFMX0RNQV9TdGFydF9JVChoc3JhbS0+aGRtYSwgKHVpbnQzMl90KXBBZGRyZXNzLCAodWludDMyX3QpcERzdEJ1ZmZlciwgKHVpbnQzMl90KUJ1ZmZlclNpemUpOworICAKKyAgLyogVXBkYXRlIHRoZSBTUkFNIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaHNyYW0tPlN0YXRlID0gSEFMX1NSQU1fU1RBVEVfUkVBRFk7IAorICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHNyYW0pOyAgCisgIAorICByZXR1cm4gSEFMX09LOyAKK30KKworLyoqCisgICogQGJyaWVmICBXcml0ZXMgYSBXb3JkcyBkYXRhIGJ1ZmZlciB0byBTUkFNIG1lbW9yeSB1c2luZyBETUEgdHJhbnNmZXIuCisgICogQHBhcmFtICBoc3JhbSBwb2ludGVyIHRvIGEgU1JBTV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNSQU0gbW9kdWxlLgorICAqIEBwYXJhbSAgcEFkZHJlc3MgUG9pbnRlciB0byB3cml0ZSBzdGFydCBhZGRyZXNzCisgICogQHBhcmFtICBwU3JjQnVmZmVyIFBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlciB0byB3cml0ZSAgCisgICogQHBhcmFtICBCdWZmZXJTaXplIFNpemUgb2YgdGhlIGJ1ZmZlciB0byB3cml0ZSB0byBtZW1vcnkKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUkFNX1dyaXRlX0RNQShTUkFNX0hhbmRsZVR5cGVEZWYgKmhzcmFtLCB1aW50MzJfdCAqcEFkZHJlc3MsIHVpbnQzMl90ICpwU3JjQnVmZmVyLCB1aW50MzJfdCBCdWZmZXJTaXplKQoreworICAvKiBDaGVjayB0aGUgU1JBTSBjb250cm9sbGVyIHN0YXRlICovCisgIGlmKGhzcmFtLT5TdGF0ZSA9PSBIQUxfU1JBTV9TVEFURV9QUk9URUNURUQpCisgIHsKKyAgICByZXR1cm4gIEhBTF9FUlJPUjsgCisgIH0KKyAgCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNyYW0pOworICAKKyAgLyogVXBkYXRlIHRoZSBTUkFNIGNvbnRyb2xsZXIgc3RhdGUgKi8KKyAgaHNyYW0tPlN0YXRlID0gSEFMX1NSQU1fU1RBVEVfQlVTWTsgCisgIAorICAvKiBDb25maWd1cmUgRE1BIHVzZXIgY2FsbGJhY2tzICovCisgIGhzcmFtLT5oZG1hLT5YZmVyQ3BsdENhbGxiYWNrICA9IEhBTF9TUkFNX0RNQV9YZmVyQ3BsdENhbGxiYWNrOworICBoc3JhbS0+aGRtYS0+WGZlckVycm9yQ2FsbGJhY2sgPSBIQUxfU1JBTV9ETUFfWGZlckVycm9yQ2FsbGJhY2s7CisKKyAgLyogRW5hYmxlIHRoZSBETUEgQ2hhbm5lbCAqLworICBIQUxfRE1BX1N0YXJ0X0lUKGhzcmFtLT5oZG1hLCAodWludDMyX3QpcFNyY0J1ZmZlciwgKHVpbnQzMl90KXBBZGRyZXNzLCAodWludDMyX3QpQnVmZmVyU2l6ZSk7CisgIAorICAvKiBVcGRhdGUgdGhlIFNSQU0gY29udHJvbGxlciBzdGF0ZSAqLworICBoc3JhbS0+U3RhdGUgPSBIQUxfU1JBTV9TVEFURV9SRUFEWTsgIAorICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHNyYW0pOyAgCisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworICAKKy8qKiBAZGVmZ3JvdXAgU1JBTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIENvbnRyb2wgZnVuY3Rpb25zIAorICogIEBicmllZiAgIENvbnRyb2wgZnVuY3Rpb25zIAorICoKK0B2ZXJiYXRpbSAgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFNSQU0gQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gY29udHJvbCBkeW5hbWljYWxseQorICAgIHRoZSBTUkFNIGludGVyZmFjZS4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKyAgICAKKy8qKgorICAqIEBicmllZiAgRW5hYmxlcyBkeW5hbWljYWxseSBTUkFNIHdyaXRlIG9wZXJhdGlvbi4KKyAgKiBAcGFyYW0gIGhzcmFtIHBvaW50ZXIgdG8gYSBTUkFNX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1JBTSBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1JBTV9Xcml0ZU9wZXJhdGlvbl9FbmFibGUoU1JBTV9IYW5kbGVUeXBlRGVmICpoc3JhbSkKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3JhbSk7CisKKyAgLyogRW5hYmxlIHdyaXRlIG9wZXJhdGlvbiAqLworICBGTUNfTk9SU1JBTV9Xcml0ZU9wZXJhdGlvbl9FbmFibGUoaHNyYW0tPkluc3RhbmNlLCBoc3JhbS0+SW5pdC5OU0JhbmspOyAKKyAgCisgIC8qIFVwZGF0ZSB0aGUgU1JBTSBjb250cm9sbGVyIHN0YXRlICovCisgIGhzcmFtLT5TdGF0ZSA9IEhBTF9TUkFNX1NUQVRFX1JFQURZOworICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHNyYW0pOyAKKyAgCisgIHJldHVybiBIQUxfT0s7ICAKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlcyBkeW5hbWljYWxseSBTUkFNIHdyaXRlIG9wZXJhdGlvbi4KKyAgKiBAcGFyYW0gIGhzcmFtIHBvaW50ZXIgdG8gYSBTUkFNX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1JBTSBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1JBTV9Xcml0ZU9wZXJhdGlvbl9EaXNhYmxlKFNSQU1fSGFuZGxlVHlwZURlZiAqaHNyYW0pCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNyYW0pOworCisgIC8qIFVwZGF0ZSB0aGUgU1JBTSBjb250cm9sbGVyIHN0YXRlICovCisgIGhzcmFtLT5TdGF0ZSA9IEhBTF9TUkFNX1NUQVRFX0JVU1k7CisgICAgCisgIC8qIERpc2FibGUgd3JpdGUgb3BlcmF0aW9uICovCisgIEZNQ19OT1JTUkFNX1dyaXRlT3BlcmF0aW9uX0Rpc2FibGUoaHNyYW0tPkluc3RhbmNlLCBoc3JhbS0+SW5pdC5OU0JhbmspOyAKKyAgCisgIC8qIFVwZGF0ZSB0aGUgU1JBTSBjb250cm9sbGVyIHN0YXRlICovCisgIGhzcmFtLT5TdGF0ZSA9IEhBTF9TUkFNX1NUQVRFX1BST1RFQ1RFRDsKKyAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzcmFtKTsgCisgIAorICByZXR1cm4gSEFMX09LOyAgCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1JBTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zIAorICogIEBicmllZiAgIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zIAorICoKK0B2ZXJiYXRpbSAgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBTUkFNIFN0YXRlIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHBlcm1pdHMgdG8gZ2V0IGluIHJ1bi10aW1lIHRoZSBzdGF0dXMgb2YgdGhlIFNSQU0gY29udHJvbGxlciAKKyAgICBhbmQgdGhlIGRhdGEgZmxvdy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKyAgCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgdGhlIFNSQU0gY29udHJvbGxlciBzdGF0ZQorICAqIEBwYXJhbSAgaHNyYW0gcG9pbnRlciB0byBhIFNSQU1fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUkFNIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLworSEFMX1NSQU1fU3RhdGVUeXBlRGVmIEhBTF9TUkFNX0dldFN0YXRlKFNSQU1fSGFuZGxlVHlwZURlZiAqaHNyYW0pCit7CisgIHJldHVybiBoc3JhbS0+U3RhdGU7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIEhBTF9TUkFNX01PRFVMRV9FTkFCTEVEICovCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmYzeHhfaGFsX3RpbS5jIGIvU3JjL3N0bTMyZjN4eF9oYWxfdGltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg1Y2IzYgotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfaGFsX3RpbS5jCkBAIC0wLDAgKzEsNTUxNiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfdGltLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFRJTSBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nIAorICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgVGltZXIgKFRJTSkgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBUaW1lIEJhc2UgSW5pdGlhbGl6YXRpb24KKyAgKiAgICAgICAgICAgKyBUaW1lIEJhc2UgU3RhcnQKKyAgKiAgICAgICAgICAgKyBUaW1lIEJhc2UgU3RhcnQgSW50ZXJydXB0aW9uCisgICogICAgICAgICAgICsgVGltZSBCYXNlIFN0YXJ0IERNQQorICAqICAgICAgICAgICArIFRpbWUgT3V0cHV0IENvbXBhcmUvUFdNIEluaXRpYWxpemF0aW9uCisgICogICAgICAgICAgICsgVGltZSBPdXRwdXQgQ29tcGFyZS9QV00gQ2hhbm5lbCBDb25maWd1cmF0aW9uCisgICogICAgICAgICAgICsgVGltZSBPdXRwdXQgQ29tcGFyZS9QV00gIFN0YXJ0CisgICogICAgICAgICAgICsgVGltZSBPdXRwdXQgQ29tcGFyZS9QV00gIFN0YXJ0IEludGVycnVwdGlvbgorICAqICAgICAgICAgICArIFRpbWUgT3V0cHV0IENvbXBhcmUvUFdNIFN0YXJ0IERNQQorICAqICAgICAgICAgICArIFRpbWUgSW5wdXQgQ2FwdHVyZSBJbml0aWFsaXphdGlvbgorICAqICAgICAgICAgICArIFRpbWUgSW5wdXQgQ2FwdHVyZSBDaGFubmVsIENvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBUaW1lIElucHV0IENhcHR1cmUgU3RhcnQKKyAgKiAgICAgICAgICAgKyBUaW1lIElucHV0IENhcHR1cmUgU3RhcnQgSW50ZXJydXB0aW9uIAorICAqICAgICAgICAgICArIFRpbWUgSW5wdXQgQ2FwdHVyZSBTdGFydCBETUEKKyAgKiAgICAgICAgICAgKyBUaW1lIE9uZSBQdWxzZSBJbml0aWFsaXphdGlvbgorICAqICAgICAgICAgICArIFRpbWUgT25lIFB1bHNlIENoYW5uZWwgQ29uZmlndXJhdGlvbgorICAqICAgICAgICAgICArIFRpbWUgT25lIFB1bHNlIFN0YXJ0IAorICAqICAgICAgICAgICArIFRpbWUgRW5jb2RlciBJbnRlcmZhY2UgSW5pdGlhbGl6YXRpb24KKyAgKiAgICAgICAgICAgKyBUaW1lIEVuY29kZXIgSW50ZXJmYWNlIFN0YXJ0CisgICogICAgICAgICAgICsgVGltZSBFbmNvZGVyIEludGVyZmFjZSBTdGFydCBJbnRlcnJ1cHRpb24KKyAgKiAgICAgICAgICAgKyBUaW1lIEVuY29kZXIgSW50ZXJmYWNlIFN0YXJ0IERNQQorICAqICAgICAgICAgICArIENvbW11dGF0aW9uIEV2ZW50IGNvbmZpZ3VyYXRpb24gd2l0aCBJbnRlcnJ1cHRpb24gYW5kIERNQQorICAqICAgICAgICAgICArIFRpbWUgT0NSZWYgY2xlYXIgY29uZmlndXJhdGlvbgorICAqICAgICAgICAgICArIFRpbWUgRXh0ZXJuYWwgQ2xvY2sgY29uZmlndXJhdGlvbgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgVElNRVIgR2VuZXJpYyBmZWF0dXJlcyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXSBUaGUgVGltZXIgZmVhdHVyZXMgaW5jbHVkZTogCisgICAgICAgKCMpIDE2LWJpdCB1cCwgZG93biwgdXAvZG93biBhdXRvLXJlbG9hZCBjb3VudGVyLgorICAgICAgICgjKSAxNi1iaXQgcHJvZ3JhbW1hYmxlIHByZXNjYWxlciBhbGxvd2luZyBkaXZpZGluZyAoYWxzbyBvbiB0aGUgZmx5KSB0aGUgCisgICAgICAgICAgIGNvdW50ZXIgY2xvY2sgZnJlcXVlbmN5IGVpdGhlciBieSBhbnkgZmFjdG9yIGJldHdlZW4gMSBhbmQgNjU1MzYuCisgICAgICAgKCMpIFVwIHRvIDQgaW5kZXBlbmRlbnQgY2hhbm5lbHMgZm9yOgorICAgICAgICAgICAoKyspIElucHV0IENhcHR1cmUKKyAgICAgICAgICAgKCsrKSBPdXRwdXQgQ29tcGFyZQorICAgICAgICAgICAoKyspIFBXTSBnZW5lcmF0aW9uIChFZGdlIGFuZCBDZW50ZXItYWxpZ25lZCBNb2RlKQorICAgICAgICAgICAoKyspIE9uZS1wdWxzZSBtb2RlIG91dHB1dCAgICAgICAgICAgICAgIAorICAgCisgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgKCMpIEluaXRpYWxpemUgdGhlIFRJTSBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudGluZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyAKKyAgICAgICAgIGRlcGVuZGluZyBmcm9tIGZlYXR1cmUgdXNlZCA6CisgICAgICAgICAgICgrKykgVGltZSBCYXNlIDogSEFMX1RJTV9CYXNlX01zcEluaXQoKSAKKyAgICAgICAgICAgKCsrKSBJbnB1dCBDYXB0dXJlIDogSEFMX1RJTV9JQ19Nc3BJbml0KCkKKyAgICAgICAgICAgKCsrKSBPdXRwdXQgQ29tcGFyZSA6IEhBTF9USU1fT0NfTXNwSW5pdCgpCisgICAgICAgICAgICgrKykgUFdNIGdlbmVyYXRpb24gOiBIQUxfVElNX1BXTV9Nc3BJbml0KCkKKyAgICAgICAgICAgKCsrKSBPbmUtcHVsc2UgbW9kZSBvdXRwdXQgOiBIQUxfVElNX09uZVB1bHNlX01zcEluaXQoKQorICAgICAgICAgICAoKyspIEVuY29kZXIgbW9kZSBvdXRwdXQgOiBIQUxfVElNX0VuY29kZXJfTXNwSW5pdCgpCisgICAgICAgICAgIAorICAgICAoIykgSW5pdGlhbGl6ZSB0aGUgVElNIGxvdyBsZXZlbCByZXNvdXJjZXMgOgorICAgICAgICAoIyMpIEVuYWJsZSB0aGUgVElNIGludGVyZmFjZSBjbG9jayB1c2luZyBfX0hBTF9SQ0NfVElNeF9DTEtfRU5BQkxFICAoKTsgCisgICAgICAgICgjIykgVElNIHBpbnMgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBjbG9jayBmb3IgdGhlIFRJTSBHUElPcyB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgorICAgICAgICAgICAgIF9fSEFMX1JDQ19HUElPeF9DTEtfRU5BQkxFKCk7ICAgCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlc2UgVElNIHBpbnMgaW4gQWx0ZXJuYXRlIGZ1bmN0aW9uIG1vZGUgdXNpbmcgSEFMX0dQSU9fSW5pdCgpOyAgCisKKyAgICAgKCMpIFRoZSBleHRlcm5hbCBDbG9jayBjYW4gYmUgY29uZmlndXJlZCwgaWYgbmVlZGVkICh0aGUgZGVmYXVsdCBjbG9jayBpcyB0aGUgCisgICAgICAgICBpbnRlcm5hbCBjbG9jayBmcm9tIHRoZSBBUEJ4KSwgdXNpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbjoKKyAgICAgICAgIEhBTF9USU1fQ29uZmlnQ2xvY2tTb3VyY2UsIHRoZSBjbG9jayBjb25maWd1cmF0aW9uIHNob3VsZCBiZSBkb25lIGJlZm9yZSAKKyAgICAgICAgIGFueSBzdGFydCBmdW5jdGlvbi4KKyAgCisgICAgICgjKSBDb25maWd1cmUgdGhlIFRJTSBpbiB0aGUgZGVzaXJlZCBmdW5jdGlvbmluZyBtb2RlIHVzaW5nIG9uZSBvZiB0aGUgCisgICAgICAgSW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gb2YgdGhpcyBkcml2ZXI6CisgICAgICAgKCsrKSBIQUxfVElNX0Jhc2VfSW5pdDogdG8gdXNlIHRoZSBUaW1lciB0byBnZW5lcmF0ZSBhIHNpbXBsZSB0aW1lIGJhc2UKKyAgICAgICAoKyspIEhBTF9USU1fT0NfSW5pdCBhbmQgSEFMX1RJTV9PQ19Db25maWdDaGFubmVsOiB0byB1c2UgdGhlIFRpbWVyIHRvIGdlbmVyYXRlIGFuIAorICAgICAgICAgICAgT3V0cHV0IENvbXBhcmUgc2lnbmFsLgorICAgICAgICgrKykgSEFMX1RJTV9QV01fSW5pdCBhbmQgSEFMX1RJTV9QV01fQ29uZmlnQ2hhbm5lbDogdG8gdXNlIHRoZSBUaW1lciB0byBnZW5lcmF0ZSBhIAorICAgICAgICAgICAgUFdNIHNpZ25hbC4KKyAgICAgICAoKyspIEhBTF9USU1fSUNfSW5pdCBhbmQgSEFMX1RJTV9JQ19Db25maWdDaGFubmVsOiB0byB1c2UgdGhlIFRpbWVyIHRvIG1lYXN1cmUgYW4gCisgICAgICAgICAgICBleHRlcm5hbCBzaWduYWwuCisgICAgICAgICAoKyspIEhBTF9USU1fT25lUHVsc2VfSW5pdCBhbmQgSEFMX1RJTV9PbmVQdWxzZV9Db25maWdDaGFubmVsOiB0byB1c2UgdGhlIFRpbWVyIAorICAgICAgICAgICAgICBpbiBPbmUgUHVsc2UgTW9kZS4KKyAgICAgICAoKyspIEhBTF9USU1fRW5jb2Rlcl9Jbml0OiB0byB1c2UgdGhlIFRpbWVyIEVuY29kZXIgSW50ZXJmYWNlLgorCisgICAgICgjKSBBY3RpdmF0ZSB0aGUgVElNIHBlcmlwaGVyYWwgdXNpbmcgb25lIG9mIHRoZSBzdGFydCBmdW5jdGlvbnMgZGVwZW5kaW5nIGZyb20gdGhlIGZlYXR1cmUgdXNlZDogCisgICAgICAgICAgICgrKykgVGltZSBCYXNlIDogSEFMX1RJTV9CYXNlX1N0YXJ0KCksIEhBTF9USU1fQmFzZV9TdGFydF9ETUEoKSwgSEFMX1RJTV9CYXNlX1N0YXJ0X0lUKCkKKyAgICAgICAgICAgKCsrKSBJbnB1dCBDYXB0dXJlIDogIEhBTF9USU1fSUNfU3RhcnQoKSwgSEFMX1RJTV9JQ19TdGFydF9ETUEoKSwgSEFMX1RJTV9JQ19TdGFydF9JVCgpCisgICAgICAgICAgICgrKykgT3V0cHV0IENvbXBhcmUgOiBIQUxfVElNX09DX1N0YXJ0KCksIEhBTF9USU1fT0NfU3RhcnRfRE1BKCksIEhBTF9USU1fT0NfU3RhcnRfSVQoKQorICAgICAgICAgICAoKyspIFBXTSBnZW5lcmF0aW9uIDogSEFMX1RJTV9QV01fU3RhcnQoKSwgSEFMX1RJTV9QV01fU3RhcnRfRE1BKCksIEhBTF9USU1fUFdNX1N0YXJ0X0lUKCkKKyAgICAgICAgICAgKCsrKSBPbmUtcHVsc2UgbW9kZSBvdXRwdXQgOiBIQUxfVElNX09uZVB1bHNlX1N0YXJ0KCksIEhBTF9USU1fT25lUHVsc2VfU3RhcnRfSVQoKQorICAgICAgICAgICAoKyspIEVuY29kZXIgbW9kZSBvdXRwdXQgOiBIQUxfVElNX0VuY29kZXJfU3RhcnQoKSwgSEFMX1RJTV9FbmNvZGVyX1N0YXJ0X0RNQSgpLCBIQUxfVElNX0VuY29kZXJfU3RhcnRfSVQoKS4KKworICAgICAoIykgVGhlIERNQSBCdXJzdCBpcyBtYW5hZ2VkIHdpdGggdGhlIHR3byBmb2xsb3dpbmcgZnVuY3Rpb25zOgorICAgICAgICAgSEFMX1RJTV9ETUFCdXJzdF9Xcml0ZVN0YXJ0KCkKKyAgICAgICAgIEhBTF9USU1fRE1BQnVyc3RfUmVhZFN0YXJ0KCkKKyAgCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIAorICAqLyAKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNIFRJTQorICAqIEBicmllZiBUSU0gSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX1RJTV9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBUSU1fUHJpdmF0ZV9GdW5jdGlvbnMgVElNIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3N0YXRpYyB2b2lkIFRJTV9USTFfQ29uZmlnSW5wdXRTdGFnZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVElNX0lDUG9sYXJpdHksIHVpbnQzMl90IFRJTV9JQ0ZpbHRlcik7CitzdGF0aWMgdm9pZCBUSU1fVEkyX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVElNX0lDUG9sYXJpdHksIHVpbnQzMl90IFRJTV9JQ1NlbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVElNX0lDRmlsdGVyKTsKK3N0YXRpYyB2b2lkIFRJTV9USTJfQ29uZmlnSW5wdXRTdGFnZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVElNX0lDUG9sYXJpdHksIHVpbnQzMl90IFRJTV9JQ0ZpbHRlcik7CitzdGF0aWMgdm9pZCBUSU1fVEkzX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVElNX0lDUG9sYXJpdHksIHVpbnQzMl90IFRJTV9JQ1NlbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVElNX0lDRmlsdGVyKTsKK3N0YXRpYyB2b2lkIFRJTV9USTRfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBUSU1fSUNQb2xhcml0eSwgdWludDMyX3QgVElNX0lDU2VsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUSU1fSUNGaWx0ZXIpOworc3RhdGljIHZvaWQgVElNX0lUUnhfU2V0Q29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBJbnB1dFRyaWdnZXJTb3VyY2UpOworc3RhdGljIHZvaWQgVElNX0RNQVBlcmlvZEVsYXBzZWRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFRJTV9ETUFUcmlnZ2VyQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBUSU1fU2xhdmVUaW1lcl9TZXRDb25maWcoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX1NsYXZlQ29uZmlnVHlwZURlZiAqIHNTbGF2ZUNvbmZpZyk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnMgVElNIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgVGltZSBCYXNlIGZ1bmN0aW9ucyAKKyAqICBAYnJpZWYgICAgVGltZSBCYXNlIGZ1bmN0aW9ucyAKKyAqCitAdmVyYmF0aW0gICAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBUaW1lIEJhc2UgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dICAKKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICgrKSBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlIFRJTSBiYXNlLiAKKyAgICAoKykgRGUtaW5pdGlhbGl6ZSB0aGUgVElNIGJhc2UuCisgICAgKCspIFN0YXJ0IHRoZSBUaW1lIEJhc2UuCisgICAgKCspIFN0b3AgdGhlIFRpbWUgQmFzZS4KKyAgICAoKykgU3RhcnQgdGhlIFRpbWUgQmFzZSBhbmQgZW5hYmxlIGludGVycnVwdC4KKyAgICAoKykgU3RvcCB0aGUgVGltZSBCYXNlIGFuZCBkaXNhYmxlIGludGVycnVwdC4KKyAgICAoKykgU3RhcnQgdGhlIFRpbWUgQmFzZSBhbmQgZW5hYmxlIERNQSB0cmFuc2Zlci4KKyAgICAoKykgU3RvcCB0aGUgVGltZSBCYXNlIGFuZCBkaXNhYmxlIERNQSB0cmFuc2Zlci4KKyAKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gVGltZSBiYXNlIFVuaXQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFRJTV9IYW5kbGVUeXBlRGVmIGFuZCBjcmVhdGUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBub3RlICAgU3dpdGNoaW5nIGZyb20gQ2VudGVyIEFsaWduZWQgY291bnRlciBtb2RlIHRvIEVkZ2UgY291bnRlciBtb2RlIChvciByZXZlcnNlKQorICAqICAgICAgICAgcmVxdWlyZXMgYSB0aW1lciByZXNldCB0byBhdm9pZCB1bmV4cGVjdGVkIGRpcmVjdGlvbiAKKyAgKiAgICAgICAgIGR1ZSB0byBESVIgYml0IHJlYWRvbmx5IGluIGNlbnRlciBhbGlnbmVkIG1vZGUuCisgICogICAgICAgICBFeDogY2FsbCBAcmVmIEhBTF9USU1fQmFzZV9EZUluaXQoKSBiZWZvcmUgSEFMX1RJTV9CYXNlX0luaXQoKQorICAqIEBwYXJhbSAgaHRpbSBUSU0gQmFzZSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9Jbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreyAKKyAgLyogQ2hlY2sgdGhlIFRJTSBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZihodGltID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7IAorICBhc3NlcnRfcGFyYW0oSVNfVElNX0NPVU5URVJfTU9ERShodGltLT5Jbml0LkNvdW50ZXJNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tESVZJU0lPTl9ESVYoaHRpbS0+SW5pdC5DbG9ja0RpdmlzaW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQVVUT1JFTE9BRF9QUkVMT0FEKGh0aW0tPkluaXQuQXV0b1JlbG9hZFByZWxvYWQpKTsKKyAgCisgIGlmKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVTRVQpCisgIHsgIAorICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBodGltLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgKi8KKyAgICBIQUxfVElNX0Jhc2VfTXNwSW5pdChodGltKTsKKyAgfQorICAKKyAgLyogU2V0IHRoZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGU9IEhBTF9USU1fU1RBVEVfQlVTWTsKKyAgCisgIC8qIFNldCB0aGUgVGltZSBCYXNlIGNvbmZpZ3VyYXRpb24gKi8KKyAgVElNX0Jhc2VfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCAmaHRpbS0+SW5pdCk7IAorICAKKyAgLyogSW5pdGlhbGl6ZSB0aGUgVElNIHN0YXRlKi8KKyAgaHRpbS0+U3RhdGU9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgdGhlIFRJTSBCYXNlIHBlcmlwaGVyYWwgCisgICogQHBhcmFtICBodGltIFRJTSBCYXNlIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAgCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworICAgCisgIC8qIERpc2FibGUgdGhlIFRJTSBQZXJpcGhlcmFsIENsb2NrICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworICAgIAorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMgKi8KKyAgSEFMX1RJTV9CYXNlX01zcERlSW5pdChodGltKTsKKyAgICAKKyAgLyogQ2hhbmdlIFRJTSBzdGF0ZSAqLyAgCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRVNFVDsgCisgIAorICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBCYXNlIE1TUC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9CYXNlX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX0Jhc2VfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgVElNIEJhc2UgTVNQLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVElNX0Jhc2VfTXNwRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9CYXNlX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gQmFzZSBnZW5lcmF0aW9uLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIAorICAvKiBTZXQgdGhlIFRJTSBzdGF0ZSAqLworICBodGltLT5TdGF0ZT0gSEFMX1RJTV9TVEFURV9CVVNZOworICAKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgIAorICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCisgIGh0aW0tPlN0YXRlPSBIQUxfVElNX1NUQVRFX1JFQURZOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gQmFzZSBnZW5lcmF0aW9uLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIFNldCB0aGUgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlPSBIQUxfVElNX1NUQVRFX0JVU1k7CisgIAorICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworICAKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBodGltLT5TdGF0ZT0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBCYXNlIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0Jhc2VfU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgCisgICAvKiBFbmFibGUgdGhlIFRJTSBVcGRhdGUgaW50ZXJydXB0ICovCisgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9VUERBVEUpOworICAgICAgCisgICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgICAgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBCYXNlIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0Jhc2VfU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAvKiBEaXNhYmxlIHRoZSBUSU0gVXBkYXRlIGludGVycnVwdCAqLworICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfVVBEQVRFKTsKKyAgICAgIAorICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworICAgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gQmFzZSBnZW5lcmF0aW9uIGluIERNQSBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBwRGF0YSBUaGUgc291cmNlIEJ1ZmZlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIG1lbW9yeSB0byBwZXJpcGhlcmFsLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90ICpwRGF0YSwgdWludDE2X3QgTGVuZ3RoKQoreyAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsgCisgIAorICBpZigoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9CVVNZKSkKKyAgeworICAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKyAgZWxzZSBpZigoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRUFEWSkpCisgIHsKKyAgICBpZigocERhdGEgPT0gMFUgKSAmJiAoTGVuZ3RoID4gMFUpKSAKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisgICAgfQorICB9ICAKKyAgLyogU2V0IHRoZSBETUEgUGVyaW9kIGVsYXBzZWQgY2FsbGJhY2sgKi8KKyAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BUGVyaW9kRWxhcHNlZENwbHQ7CisgICAgIAorICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICBodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworICAKKyAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICBIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9VUERBVEVdLCAodWludDMyX3QpcERhdGEsICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkFSUiwgTGVuZ3RoKTsKKyAgCisgIC8qIEVuYWJsZSB0aGUgVElNIFVwZGF0ZSBETUEgcmVxdWVzdCAqLworICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX1VQREFURSk7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7ICAKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIEJhc2UgZ2VuZXJhdGlvbiBpbiBETUEgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIERpc2FibGUgdGhlIFRJTSBVcGRhdGUgRE1BIHJlcXVlc3QgKi8KKyAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfVVBEQVRFKTsKKyAgICAgIAorICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworICAgIAorICAvKiBDaGFuZ2UgdGhlIGh0aW0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworICAgICAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFRpbWUgT3V0cHV0IENvbXBhcmUgZnVuY3Rpb25zIAorICogIEBicmllZiAgICBUaW1lIE91dHB1dCBDb21wYXJlIGZ1bmN0aW9ucyAKKyAqCitAdmVyYmF0aW0gICAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgIyMjIyMgVGltZSBPdXRwdXQgQ29tcGFyZSBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICgrKSBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZS4gCisgICAgKCspIERlLWluaXRpYWxpemUgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZS4KKyAgICAoKykgU3RhcnQgdGhlIFRpbWUgT3V0cHV0IENvbXBhcmUuCisgICAgKCspIFN0b3AgdGhlIFRpbWUgT3V0cHV0IENvbXBhcmUuCisgICAgKCspIFN0YXJ0IHRoZSBUaW1lIE91dHB1dCBDb21wYXJlIGFuZCBlbmFibGUgaW50ZXJydXB0LgorICAgICgrKSBTdG9wIHRoZSBUaW1lIE91dHB1dCBDb21wYXJlIGFuZCBkaXNhYmxlIGludGVycnVwdC4KKyAgICAoKykgU3RhcnQgdGhlIFRpbWUgT3V0cHV0IENvbXBhcmUgYW5kIGVuYWJsZSBETUEgdHJhbnNmZXIuCisgICAgKCspIFN0b3AgdGhlIFRpbWUgT3V0cHV0IENvbXBhcmUgYW5kIGRpc2FibGUgRE1BIHRyYW5zZmVyLgorIAorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgVElNX0hhbmRsZVR5cGVEZWYgYW5kIGNyZWF0ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQG5vdGUgICBTd2l0Y2hpbmcgZnJvbSBDZW50ZXIgQWxpZ25lZCBjb3VudGVyIG1vZGUgdG8gRWRnZSBjb3VudGVyIG1vZGUgKG9yIHJldmVyc2UpCisgICogICAgICAgICByZXF1aXJlcyBhIHRpbWVyIHJlc2V0IHRvIGF2b2lkIHVuZXhwZWN0ZWQgZGlyZWN0aW9uIAorICAqICAgICAgICAgZHVlIHRvIERJUiBiaXQgcmVhZG9ubHkgaW4gY2VudGVyIGFsaWduZWQgbW9kZS4KKyAgKiAgICAgICAgIEV4OiBjYWxsIEByZWYgSEFMX1RJTV9PQ19EZUluaXQoKSBiZWZvcmUgSEFMX1RJTV9PQ19Jbml0KCkKKyAgKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19Jbml0KFRJTV9IYW5kbGVUeXBlRGVmKiBodGltKQoreworICAvKiBDaGVjayB0aGUgVElNIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmKGh0aW0gPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQ09VTlRFUl9NT0RFKGh0aW0tPkluaXQuQ291bnRlck1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS0RJVklTSU9OX0RJVihodGltLT5Jbml0LkNsb2NrRGl2aXNpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BVVRPUkVMT0FEX1BSRUxPQUQoaHRpbS0+SW5pdC5BdXRvUmVsb2FkUHJlbG9hZCkpOworCisgIGlmKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVTRVQpCisgIHsgICAKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHRpbS0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDIGFuZCBETUEgKi8KKyAgICBIQUxfVElNX09DX01zcEluaXQoaHRpbSk7CisgIH0KKyAgCisgIC8qIFNldCB0aGUgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogSW5pdCB0aGUgYmFzZSB0aW1lIGZvciB0aGUgT3V0cHV0IENvbXBhcmUgKi8gIAorICBUSU1fQmFzZV9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsICAmaHRpbS0+SW5pdCk7IAorICAKKyAgLyogSW5pdGlhbGl6ZSB0aGUgVElNIHN0YXRlKi8KKyAgaHRpbS0+U3RhdGU9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgdGhlIFRJTSBwZXJpcGhlcmFsIAorICAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAKKyAgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworICAgCisgIC8qIERpc2FibGUgdGhlIFRJTSBQZXJpcGhlcmFsIENsb2NrICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworICAKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IEdQSU8sIENMT0NLLCBOVklDIGFuZCBETUEgKi8KKyAgSEFMX1RJTV9PQ19Nc3BEZUluaXQoaHRpbSk7CisgICAgCisgIC8qIENoYW5nZSBUSU0gc3RhdGUgKi8gIAorICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVTRVQ7IAorICAKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgTVNQLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVElNX09DX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX09DX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIFRJTSBPdXRwdXQgQ29tcGFyZSBNU1AuCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fT0NfTXNwRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9PQ19Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBzaWduYWwgZ2VuZXJhdGlvbi4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZSAgCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkICAgCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKyAgCisgIC8qIEVuYWJsZSB0aGUgT3V0cHV0IGNvbXBhcmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9FTkFCTEUpOworICAKKyAgaWYoSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSAhPSBSRVNFVCkgIAorICB7CisgICAgLyogRW5hYmxlIHRoZSBtYWluIG91dHB1dCAqLworICAgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOworICB9CisgIAorICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0VOQUJMRShodGltKTsgCisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBzaWduYWwgZ2VuZXJhdGlvbi4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBkaXNhYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisgIAorICAvKiBEaXNhYmxlIHRoZSBPdXRwdXQgY29tcGFyZSBjaGFubmVsICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0RJU0FCTEUpOworICAKKyAgaWYoSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSAhPSBSRVNFVCkgIAorICB7CisgICAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXB1dCAqLworICAgIF9fSEFMX1RJTV9NT0VfRElTQUJMRShodGltKTsKKyAgfSAgCisgIAorICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOyAgCisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9ICAKKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE9DIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisgIAorICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeyAgICAgICAKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MxKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOgorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MzKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF80OgorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0M0KTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfSAKKworICAvKiBFbmFibGUgdGhlIE91dHB1dCBjb21wYXJlIGNoYW5uZWwgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRU5BQkxFKTsKKyAgCisgIGlmKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkgIT0gUkVTRVQpICAKKyAgeworICAgIC8qIEVuYWJsZSB0aGUgbWFpbiBvdXRwdXQgKi8KKyAgICBfX0hBTF9USU1fTU9FX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgc2lnbmFsIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZGlzYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworICAKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsgICAgICAgCisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MxKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOworICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMyk7CisgICAgfQorICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgVElNX0NIQU5ORUxfNDoKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0M0KTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgZGVmYXVsdDoKKyAgICBicmVhazsgCisgIH0gCisgIAorICAvKiBEaXNhYmxlIHRoZSBPdXRwdXQgY29tcGFyZSBjaGFubmVsICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0RJU0FCTEUpOyAKKyAgCisgIGlmKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkgIT0gUkVTRVQpICAKKyAgeworICAgIC8qIERpc2FibGUgdGhlIE1haW4gT3VwdXQgKi8KKyAgICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7CisgIH0KKyAgCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7ICAKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBETUEgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEBwYXJhbSAgcERhdGEgVGhlIHNvdXJjZSBCdWZmZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIExlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBtZW1vcnkgdG8gVElNIHBlcmlwaGVyYWwKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhLCB1aW50MTZfdCBMZW5ndGgpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisgIAorICBpZigoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9CVVNZKSkKKyAgeworICAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKyAgZWxzZSBpZigoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRUFEWSkpCisgIHsKKyAgICBpZigoKHVpbnQzMl90KXBEYXRhID09IDBVICkgJiYgKExlbmd0aCA+IDBVKSkgCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworICAgIH0KKyAgfSAgICAKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIFBlcmlvZCBlbGFwc2VkIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsKKyAgICAgCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKyAgICAgIAorICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSwgKHVpbnQzMl90KXBEYXRhLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1IxLCBMZW5ndGgpOworICAgICAgCisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzEpOworICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgUGVyaW9kIGVsYXBzZWQgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworICAgICAgCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLCAodWludDMyX3QpcERhdGEsICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjIsIExlbmd0aCk7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMik7CisgICAgfQorICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBQZXJpb2QgZWxhcHNlZCBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUNwbHQ7CisgICAgIAorICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10sICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMyxMZW5ndGgpOworICAgICAgCisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMyBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzMpOworICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6CisgICAgeworICAgICAvKiBTZXQgdGhlIERNQSBQZXJpb2QgZWxhcHNlZCBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUNwbHQ7CisgICAgIAorICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0sICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSNCwgTGVuZ3RoKTsKKyAgICAgIAorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0M0KTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgT3V0cHV0IGNvbXBhcmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9FTkFCTEUpOworICAKKyAgaWYoSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSAhPSBSRVNFVCkgIAorICB7CisgICAgLyogRW5hYmxlIHRoZSBtYWluIG91dHB1dCAqLworICAgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOworICB9ICAKKyAgCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOyAKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHNpZ25hbCBnZW5lcmF0aW9uIGluIERNQSBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGRpc2FibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisgIAorICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeyAgICAgICAKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MyKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMyBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MzKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF80OgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDNCk7CisgICAgfQorICAgIGJyZWFrOworICAgIAorICAgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0gCisgIAorICAvKiBEaXNhYmxlIHRoZSBPdXRwdXQgY29tcGFyZSBjaGFubmVsICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0RJU0FCTEUpOworICAKKyAgaWYoSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSAhPSBSRVNFVCkgIAorICB7CisgICAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXB1dCAqLworICAgIF9fSEFMX1RJTV9NT0VfRElTQUJMRShodGltKTsKKyAgfQorICAKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKyAgCisgIC8qIENoYW5nZSB0aGUgaHRpbSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgVGltZSBQV00gZnVuY3Rpb25zIAorICogIEBicmllZiAgICBUaW1lIFBXTSBmdW5jdGlvbnMgCisgKgorQHZlcmJhdGltICAgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgVGltZSBQV00gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dICAKKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICgrKSBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlIFRJTSBPUFdNLiAKKyAgICAoKykgRGUtaW5pdGlhbGl6ZSB0aGUgVElNIFBXTS4KKyAgICAoKykgU3RhcnQgdGhlIFRpbWUgUFdNLgorICAgICgrKSBTdG9wIHRoZSBUaW1lIFBXTS4KKyAgICAoKykgU3RhcnQgdGhlIFRpbWUgUFdNIGFuZCBlbmFibGUgaW50ZXJydXB0LgorICAgICgrKSBTdG9wIHRoZSBUaW1lIFBXTSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHQuCisgICAgKCspIFN0YXJ0IHRoZSBUaW1lIFBXTSBhbmQgZW5hYmxlIERNQSB0cmFuc2Zlci4KKyAgICAoKykgU3RvcCB0aGUgVGltZSBQV00gYW5kIGRpc2FibGUgRE1BIHRyYW5zZmVyLgorIAorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBQV00gVGltZSBCYXNlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fSGFuZGxlVHlwZURlZiBhbmQgY3JlYXRlIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAbm90ZSAgIFN3aXRjaGluZyBmcm9tIENlbnRlciBBbGlnbmVkIGNvdW50ZXIgbW9kZSB0byBFZGdlIGNvdW50ZXIgbW9kZSAob3IgcmV2ZXJzZSkKKyAgKiAgICAgICAgIHJlcXVpcmVzIGEgdGltZXIgcmVzZXQgdG8gYXZvaWQgdW5leHBlY3RlZCBkaXJlY3Rpb24gCisgICogICAgICAgICBkdWUgdG8gRElSIGJpdCByZWFkb25seSBpbiBjZW50ZXIgYWxpZ25lZCBtb2RlLgorICAqICAgICAgICAgRXg6IGNhbGwgQHJlZiBIQUxfVElNX1BXTV9EZUluaXQoKSBiZWZvcmUgSEFMX1RJTV9QV01fSW5pdCgpCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX0luaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIENoZWNrIHRoZSBUSU0gaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYoaHRpbSA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DT1VOVEVSX01PREUoaHRpbS0+SW5pdC5Db3VudGVyTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLRElWSVNJT05fRElWKGh0aW0tPkluaXQuQ2xvY2tEaXZpc2lvbikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0FVVE9SRUxPQURfUFJFTE9BRChodGltLT5Jbml0LkF1dG9SZWxvYWRQcmVsb2FkKSk7CisKKyAgaWYoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBodGltLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgYW5kIERNQSAqLworICAgIEhBTF9USU1fUFdNX01zcEluaXQoaHRpbSk7CisgIH0KKworICAvKiBTZXQgdGhlIFRJTSBzdGF0ZSAqLworICBodGltLT5TdGF0ZT0gSEFMX1RJTV9TVEFURV9CVVNZOworIAorICAvKiBJbml0IHRoZSBiYXNlIHRpbWUgZm9yIHRoZSBQV00gKi8gIAorICBUSU1fQmFzZV9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsICZodGltLT5Jbml0KTsgCisgICAKKyAgLyogSW5pdGlhbGl6ZSB0aGUgVElNIHN0YXRlKi8KKyAgaHRpbS0+U3RhdGU9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgdGhlIFRJTSBwZXJpcGhlcmFsIAorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9EZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworICAKKyAgLyogRGlzYWJsZSB0aGUgVElNIFBlcmlwaGVyYWwgQ2xvY2sgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisgICAgCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyBhbmQgRE1BICovCisgIEhBTF9USU1fUFdNX01zcERlSW5pdChodGltKTsKKyAgICAKKyAgLyogQ2hhbmdlIFRJTSBzdGF0ZSAqLyAgCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRVNFVDsgCisgIAorICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBQV00gTVNQLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVElNX1BXTV9Nc3BJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9QV01fTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgVElNIFBXTSBNU1AuCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fUFdNX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fUFdNX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgUFdNIHNpZ25hbCBnZW5lcmF0aW9uLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworICAKKyAgLyogRW5hYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9FTkFCTEUpOworICAKKyAgaWYoSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSAhPSBSRVNFVCkgIAorICB7CisgICAgLyogRW5hYmxlIHRoZSBtYWluIG91dHB1dCAqLworICAgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOworICB9CisgICAgCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfSAKKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgUFdNIHNpZ25hbCBnZW5lcmF0aW9uLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBkaXNhYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreyAgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworICAgIAorICAvKiBEaXNhYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9ESVNBQkxFKTsKKyAgCisgIGlmKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkgIT0gUkVTRVQpICAKKyAgeworICAgIC8qIERpc2FibGUgdGhlIE1haW4gT3VwdXQgKi8KKyAgICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7CisgIH0KKyAgCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisgIAorICAvKiBDaGFuZ2UgdGhlIGh0aW0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfSAKKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFBXTSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKyAgCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7ICAgICAgIAorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOworICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzMpOworICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6CisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzQpOworICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9IAorICAKKyAgLyogRW5hYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9FTkFCTEUpOworICAKKyAgaWYoSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSAhPSBSRVNFVCkgIAorICB7CisgICAgLyogRW5hYmxlIHRoZSBtYWluIG91dHB1dCAqLworICAgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9IAorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBQV00gc2lnbmFsIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGRpc2FibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX1N0b3BfSVQgKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworICAKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsgICAgICAgCisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MxKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOworICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMyk7CisgICAgfQorICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgVElNX0NIQU5ORUxfNDoKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0M0KTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgZGVmYXVsdDoKKyAgICBicmVhazsgCisgIH0KKyAgCisgIC8qIERpc2FibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0RJU0FCTEUpOworICAKKyAgaWYoSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSAhPSBSRVNFVCkgIAorICB7CisgICAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXB1dCAqLworICAgIF9fSEFMX1RJTV9NT0VfRElTQUJMRShodGltKTsKKyAgfQorICAKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30gCisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gUFdNIHNpZ25hbCBnZW5lcmF0aW9uIGluIERNQSBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEBwYXJhbSAgcERhdGEgVGhlIHNvdXJjZSBCdWZmZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIExlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBtZW1vcnkgdG8gVElNIHBlcmlwaGVyYWwKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90ICpwRGF0YSwgdWludDE2X3QgTGVuZ3RoKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworICAKKyAgaWYoKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfQlVTWSkpCisgIHsKKyAgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisgIGVsc2UgaWYoKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVBRFkpKQorICB7CisgICAgaWYoKCh1aW50MzJfdClwRGF0YSA9PSAwVSApICYmIChMZW5ndGggPiAwVSkpIAorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKyAgICB9CisgIH0gICAgCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBQZXJpb2QgZWxhcHNlZCBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUNwbHQ7CisgICAgIAorICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0sICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMSwgTGVuZ3RoKTsKKyAgICAgIAorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIFBlcmlvZCBlbGFwc2VkIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsKKyAgICAgCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKyAgICAgIAorICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSwgKHVpbnQzMl90KXBEYXRhLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1IyLCBMZW5ndGgpOworICAgICAgCisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOworICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgUGVyaW9kIGVsYXBzZWQgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworICAgICAgCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLCAodWludDMyX3QpcERhdGEsICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjMsTGVuZ3RoKTsKKyAgICAgIAorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gT3V0cHV0IENhcHR1cmUvQ29tcGFyZSAzIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MzKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF80OgorICAgIHsKKyAgICAgLyogU2V0IHRoZSBETUEgUGVyaW9kIGVsYXBzZWQgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworICAgICAgCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLCAodWludDMyX3QpcERhdGEsICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjQsIExlbmd0aCk7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSA0IERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDNCk7CisgICAgfQorICAgIGJyZWFrOworICAgIAorICAgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KKworICAvKiBFbmFibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0VOQUJMRSk7CisgIAorICBpZihJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKSAgCisgIHsKKyAgICAvKiBFbmFibGUgdGhlIG1haW4gb3V0cHV0ICovCisgICAgX19IQUxfVElNX01PRV9FTkFCTEUoaHRpbSk7CisgIH0KKyAgCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOyAKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIFBXTSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBETUEgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZGlzYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisgIAorICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeyAgICAgICAKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MyKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMyBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MzKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF80OgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDNCk7CisgICAgfQorICAgIGJyZWFrOworICAgIAorICAgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0gCisgIAorICAvKiBEaXNhYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9ESVNBQkxFKTsKKyAgCisgIGlmKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkgIT0gUkVTRVQpICAKKyAgeworICAgIC8qIERpc2FibGUgdGhlIE1haW4gT3VwdXQgKi8KKyAgICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7CisgIH0KKyAgCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisgIAorICAvKiBDaGFuZ2UgdGhlIGh0aW0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFRpbWUgSW5wdXQgQ2FwdHVyZSBmdW5jdGlvbnMgCisgKiAgQGJyaWVmICAgIFRpbWUgSW5wdXQgQ2FwdHVyZSBmdW5jdGlvbnMgCisgKgorQHZlcmJhdGltICAgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgVGltZSBJbnB1dCBDYXB0dXJlIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyBbLi5dICAKKyAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAoKykgSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZS4gCisgICAoKykgRGUtaW5pdGlhbGl6ZSB0aGUgVElNIElucHV0IENhcHR1cmUuCisgICAoKykgU3RhcnQgdGhlIFRpbWUgSW5wdXQgQ2FwdHVyZS4KKyAgICgrKSBTdG9wIHRoZSBUaW1lIElucHV0IENhcHR1cmUuCisgICAoKykgU3RhcnQgdGhlIFRpbWUgSW5wdXQgQ2FwdHVyZSBhbmQgZW5hYmxlIGludGVycnVwdC4KKyAgICgrKSBTdG9wIHRoZSBUaW1lIElucHV0IENhcHR1cmUgYW5kIGRpc2FibGUgaW50ZXJydXB0LgorICAgKCspIFN0YXJ0IHRoZSBUaW1lIElucHV0IENhcHR1cmUgYW5kIGVuYWJsZSBETUEgdHJhbnNmZXIuCisgICAoKykgU3RvcCB0aGUgVGltZSBJbnB1dCBDYXB0dXJlIGFuZCBkaXNhYmxlIERNQSB0cmFuc2Zlci4KKyAKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBUaW1lIGJhc2UgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFRJTV9IYW5kbGVUeXBlRGVmIGFuZCBjcmVhdGUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBub3RlICAgU3dpdGNoaW5nIGZyb20gQ2VudGVyIEFsaWduZWQgY291bnRlciBtb2RlIHRvIEVkZ2UgY291bnRlciBtb2RlIChvciByZXZlcnNlKQorICAqICAgICAgICAgcmVxdWlyZXMgYSB0aW1lciByZXNldCB0byBhdm9pZCB1bmV4cGVjdGVkIGRpcmVjdGlvbiAKKyAgKiAgICAgICAgIGR1ZSB0byBESVIgYml0IHJlYWRvbmx5IGluIGNlbnRlciBhbGlnbmVkIG1vZGUuCisgICogICAgICAgICBFeDogY2FsbCBAcmVmIEhBTF9USU1fSUNfRGVJbml0KCkgYmVmb3JlIEhBTF9USU1fSUNfSW5pdCgpCisgICogQHBhcmFtICBodGltIFRJTSBJbnB1dCBDYXB0dXJlIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19Jbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBDaGVjayB0aGUgVElNIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmKGh0aW0gPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQ09VTlRFUl9NT0RFKGh0aW0tPkluaXQuQ291bnRlck1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS0RJVklTSU9OX0RJVihodGltLT5Jbml0LkNsb2NrRGl2aXNpb24pKTsgCisgIGFzc2VydF9wYXJhbShJU19USU1fQVVUT1JFTE9BRF9QUkVMT0FEKGh0aW0tPkluaXQuQXV0b1JlbG9hZFByZWxvYWQpKTsKKworICBpZihodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFU0VUKQorICB7ICAKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHRpbS0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDIGFuZCBETUEgKi8KKyAgICBIQUxfVElNX0lDX01zcEluaXQoaHRpbSk7CisgIH0KKyAgCisgIC8qIFNldCB0aGUgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlPSBIQUxfVElNX1NUQVRFX0JVU1k7IAorICAKKyAgLyogSW5pdCB0aGUgYmFzZSB0aW1lIGZvciB0aGUgaW5wdXQgY2FwdHVyZSAqLyAgCisgIFRJTV9CYXNlX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgJmh0aW0tPkluaXQpOyAKKyAgIAorICAvKiBJbml0aWFsaXplIHRoZSBUSU0gc3RhdGUqLworICBodGltLT5TdGF0ZT0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplcyB0aGUgVElNIHBlcmlwaGVyYWwgCisgICogQHBhcmFtICBodGltIFRJTSBJbnB1dCBDYXB0dXJlIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19EZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworICAKKyAgLyogRGlzYWJsZSB0aGUgVElNIFBlcmlwaGVyYWwgQ2xvY2sgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisgICAgCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyBhbmQgRE1BICovCisgIEhBTF9USU1fSUNfTXNwRGVJbml0KGh0aW0pOworICAgIAorICAvKiBDaGFuZ2UgVElNIHN0YXRlICovICAKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFU0VUOworICAgCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIElucHV0IENhcHR1cmUgTVNQLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVElNX0lDX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX0lDX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIFRJTSBJbnB1dCBDYXB0dXJlIE1TUC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9JQ19Nc3BEZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX0lDX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIElucHV0IENhcHR1cmUgbWVhc3VyZW1lbnQuCisgICogQHBhcmFtICBodGltIFRJTSBJbnB1dCBDYXB0dXJlIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX1N0YXJ0IChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKyAgCisgIC8qIEVuYWJsZSB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVsICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0VOQUJMRSk7CisgICAgCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOyAgCisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOyAgCit9IAorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBtZWFzdXJlbWVudC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZGlzYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreyAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKyAgCisgIC8qIERpc2FibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9ESVNBQkxFKTsKKyAgCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7IAorICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIElucHV0IENhcHR1cmUgbWVhc3VyZW1lbnQgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBJbnB1dCBDYXB0dXJlIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX1N0YXJ0X0lUIChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKyAgCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7ICAgICAgIAorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOworICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzMpOworICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6CisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzQpOworICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9ICAKKyAgLyogRW5hYmxlIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWwgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRU5BQkxFKTsKKyAgICAKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7ICAKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7ICAKK30gCisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBJbnB1dCBDYXB0dXJlIG1lYXN1cmVtZW50IGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBkaXNhYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisgIAorICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeyAgICAgICAKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7CisgICAgfQorICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MzKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF80OgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzQpOworICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBkZWZhdWx0OgorICAgIGJyZWFrOyAKKyAgfSAKKyAgCisgIC8qIERpc2FibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9ESVNBQkxFKTsgCisgIAorICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOyAKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBJbnB1dCBDYXB0dXJlIG1lYXN1cmVtZW50IGluIERNQSBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gSW5wdXQgQ2FwdHVyZSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogQHBhcmFtICBwRGF0YSBUaGUgZGVzdGluYXRpb24gQnVmZmVyIGFkZHJlc3MuCisgICogQHBhcmFtICBMZW5ndGggVGhlIGxlbmd0aCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gVElNIHBlcmlwaGVyYWwgdG8gbWVtb3J5LgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfU3RhcnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCAqcERhdGEsIHVpbnQxNl90IExlbmd0aCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfQ0NfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgCisgIGlmKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX0JVU1kpKQorICB7CisgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorICBlbHNlIGlmKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKSkKKyAgeworICAgIGlmKChwRGF0YSA9PSAwVSApICYmIChMZW5ndGggPiAwVSkpIAorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKyAgICB9CisgIH0gIAorICAgCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBQZXJpb2QgZWxhcHNlZCBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUNwbHQ7CisgICAgIAorICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0sICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjEsICh1aW50MzJfdClwRGF0YSwgTGVuZ3RoKTsgCisgICAgICAKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIERNQSByZXF1ZXN0ICovICAgICAgCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMSk7CisgICAgfQorICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBQZXJpb2QgZWxhcHNlZCBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUNwbHQ7CisgICAgIAorICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0sICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjIsICh1aW50MzJfdClwRGF0YSwgTGVuZ3RoKTsKKyAgICAgIAorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMik7CisgICAgfQorICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBQZXJpb2QgZWxhcHNlZCBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUNwbHQ7CisgICAgIAorICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10sICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjMsICh1aW50MzJfdClwRGF0YSwgTGVuZ3RoKTsKKyAgICAgIAorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDMgIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMyk7CisgICAgfQorICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgVElNX0NIQU5ORUxfNDoKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBQZXJpb2QgZWxhcHNlZCBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUNwbHQ7CisgICAgIAorICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0sICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjQsICh1aW50MzJfdClwRGF0YSwgTGVuZ3RoKTsKKyAgICAgIAorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDNCk7CisgICAgfQorICAgIGJyZWFrOworICAgIAorICAgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KKworICAvKiBFbmFibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9FTkFCTEUpOworICAgCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOyAKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIElucHV0IENhcHR1cmUgbWVhc3VyZW1lbnQgaW4gRE1BIG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBJbnB1dCBDYXB0dXJlIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZGlzYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfQ0NfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7ICAgICAgIAorICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzEpOworICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOworICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzICBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MzKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF80OgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgNCAgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDNCk7CisgICAgfQorICAgIGJyZWFrOworICAgIAorICAgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWwgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRElTQUJMRSk7CisgIAorICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOyAKKyAgCisgIC8qIENoYW5nZSB0aGUgaHRpbSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA1IFRpbWUgT25lIFB1bHNlIGZ1bmN0aW9ucyAKKyAqICBAYnJpZWYgICAgVGltZSBPbmUgUHVsc2UgZnVuY3Rpb25zIAorICoKK0B2ZXJiYXRpbSAgICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBUaW1lIE9uZSBQdWxzZSBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0gIAorICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgKCspIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSB0aGUgVElNIE9uZSBQdWxzZS4gCisgICAgKCspIERlLWluaXRpYWxpemUgdGhlIFRJTSBPbmUgUHVsc2UuCisgICAgKCspIFN0YXJ0IHRoZSBUaW1lIE9uZSBQdWxzZS4KKyAgICAoKykgU3RvcCB0aGUgVGltZSBPbmUgUHVsc2UuCisgICAgKCspIFN0YXJ0IHRoZSBUaW1lIE9uZSBQdWxzZSBhbmQgZW5hYmxlIGludGVycnVwdC4KKyAgICAoKykgU3RvcCB0aGUgVGltZSBPbmUgUHVsc2UgYW5kIGRpc2FibGUgaW50ZXJydXB0LgorICAgICgrKSBTdGFydCB0aGUgVGltZSBPbmUgUHVsc2UgYW5kIGVuYWJsZSBETUEgdHJhbnNmZXIuCisgICAgKCspIFN0b3AgdGhlIFRpbWUgT25lIFB1bHNlIGFuZCBkaXNhYmxlIERNQSB0cmFuc2Zlci4KKyAKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gT25lIFB1bHNlIFRpbWUgQmFzZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgVElNX0hhbmRsZVR5cGVEZWYgYW5kIGNyZWF0ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQG5vdGUgICBTd2l0Y2hpbmcgZnJvbSBDZW50ZXIgQWxpZ25lZCBjb3VudGVyIG1vZGUgdG8gRWRnZSBjb3VudGVyIG1vZGUgKG9yIHJldmVyc2UpCisgICogICAgICAgICByZXF1aXJlcyBhIHRpbWVyIHJlc2V0IHRvIGF2b2lkIHVuZXhwZWN0ZWQgZGlyZWN0aW9uIAorICAqICAgICAgICAgZHVlIHRvIERJUiBiaXQgcmVhZG9ubHkgaW4gY2VudGVyIGFsaWduZWQgbW9kZS4KKyAgKiAgICAgICAgIEV4OiBjYWxsIEByZWYgSEFMX1RJTV9PbmVQdWxzZV9EZUluaXQoKSBiZWZvcmUgSEFMX1RJTV9PbmVQdWxzZV9Jbml0KCkKKyAgKiBAcGFyYW0gIGh0aW0gVElNIE9uZVB1bHNlIGhhbmRsZQorICAqIEBwYXJhbSAgT25lUHVsc2VNb2RlIFNlbGVjdCB0aGUgT25lIHB1bHNlIG1vZGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fT1BNT0RFX1NJTkdMRTogT25seSBvbmUgcHVsc2Ugd2lsbCBiZSBnZW5lcmF0ZWQuCisgICogICAgICAgICAgICBAYXJnIFRJTV9PUE1PREVfUkVQRVRJVElWRTogUmVwZXRpdGl2ZSBwdWxzZXMgd2lsIGJlIGdlbmVyYXRlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgT25lUHVsc2VNb2RlKQoreworICAvKiBDaGVjayB0aGUgVElNIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmKGh0aW0gPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQ09VTlRFUl9NT0RFKGh0aW0tPkluaXQuQ291bnRlck1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS0RJVklTSU9OX0RJVihodGltLT5Jbml0LkNsb2NrRGl2aXNpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PUE1fTU9ERShPbmVQdWxzZU1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BVVRPUkVMT0FEX1BSRUxPQUQoaHRpbS0+SW5pdC5BdXRvUmVsb2FkUHJlbG9hZCkpOworCisgIGlmKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVTRVQpCisgIHsgICAKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHRpbS0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKyAgICAKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQyBhbmQgRE1BICovCisgICAgSEFMX1RJTV9PbmVQdWxzZV9Nc3BJbml0KGh0aW0pOworICB9CisgIAorICAvKiBTZXQgdGhlIFRJTSBzdGF0ZSAqLworICBodGltLT5TdGF0ZT0gSEFMX1RJTV9TVEFURV9CVVNZOworICAKKyAgLyogQ29uZmlndXJlIHRoZSBUaW1lIGJhc2UgaW4gdGhlIE9uZSBQdWxzZSBNb2RlICovCisgIFRJTV9CYXNlX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgJmh0aW0tPkluaXQpOworICAKKyAgLyogUmVzZXQgdGhlIE9QTSBCaXQgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkNSMSAmPSB+VElNX0NSMV9PUE07CisKKyAgLyogQ29uZmlndXJlIHRoZSBPUE0gTW9kZSAqLworICBodGltLT5JbnN0YW5jZS0+Q1IxIHw9IE9uZVB1bHNlTW9kZTsKKyAgIAorICAvKiBJbml0aWFsaXplIHRoZSBUSU0gc3RhdGUqLworICBodGltLT5TdGF0ZT0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplcyB0aGUgVElNIE9uZSBQdWxzZSAgCisgICogQHBhcmFtICBodGltIFRJTSBPbmUgUHVsc2UgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisgIAorICAvKiBEaXNhYmxlIHRoZSBUSU0gUGVyaXBoZXJhbCBDbG9jayAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKyAgCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyAqLworICBIQUxfVElNX09uZVB1bHNlX01zcERlSW5pdChodGltKTsKKyAgICAKKyAgLyogQ2hhbmdlIFRJTSBzdGF0ZSAqLyAgCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRVNFVDsgCisgIAorICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBPbmUgUHVsc2UgTVNQLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVElNX09uZVB1bHNlX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX09uZVB1bHNlX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIFRJTSBPbmUgUHVsc2UgTVNQLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVElNX09uZVB1bHNlX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fT25lUHVsc2VfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gT25lIFB1bHNlIHNpZ25hbCBnZW5lcmF0aW9uLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT25lIFB1bHNlIGhhbmRsZQorICAqIEBwYXJhbSAgT3V0cHV0Q2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IE91dHB1dENoYW5uZWwpCit7CisgIC8qIEVuYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGFuZCB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVscyAKKyAgICAoaW4gdGhlIE9QTSBNb2RlIHRoZSB0d28gcG9zc2libGUgY2hhbm5lbHMgdGhhdCBjYW4gYmUgdXNlZCBhcmUgVElNX0NIQU5ORUxfMSBhbmQgVElNX0NIQU5ORUxfMikKKyAgICBpZiBUSU1fQ0hBTk5FTF8xIGlzIHVzZWQgYXMgb3V0cHV0LCB0aGUgVElNX0NIQU5ORUxfMiB3aWxsIGJlIHVzZWQgYXMgaW5wdXQgYW5kCisgICAgaWYgVElNX0NIQU5ORUxfMSBpcyB1c2VkIGFzIGlucHV0LCB0aGUgVElNX0NIQU5ORUxfMiB3aWxsIGJlIHVzZWQgYXMgb3V0cHV0IAorICAgIGluIGFsbCBjb21iaW5hdGlvbnMsIHRoZSBUSU1fQ0hBTk5FTF8xIGFuZCBUSU1fQ0hBTk5FTF8yIHNob3VsZCBiZSBlbmFibGVkIHRvZ2V0aGVyIAorICAgIAorICAgIE5vIG5lZWQgdG8gZW5hYmxlIHRoZSBjb3VudGVyLCBpdCdzIGVuYWJsZWQgYXV0b21hdGljYWxseSBieSBoYXJkd2FyZSAKKyAgICAodGhlIGNvdW50ZXIgc3RhcnRzIGluIHJlc3BvbnNlIHRvIGEgc3RpbXVsdXMgYW5kIGdlbmVyYXRlIGEgcHVsc2UgKi8KKyAgCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0VOQUJMRSk7IAorICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMiwgVElNX0NDeF9FTkFCTEUpOyAKKyAgCisgIGlmKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkgIT0gUkVTRVQpICAKKyAgeworICAgIC8qIEVuYWJsZSB0aGUgbWFpbiBvdXRwdXQgKi8KKyAgICBfX0hBTF9USU1fTU9FX0VOQUJMRShodGltKTsKKyAgfQorICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gT25lIFB1bHNlIHNpZ25hbCBnZW5lcmF0aW9uLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT25lIFB1bHNlIGhhbmRsZQorICAqIEBwYXJhbSAgT3V0cHV0Q2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZGlzYWJsZQorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCkKK3sKKyAgLyogRGlzYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGFuZCB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVscyAKKyAgKGluIHRoZSBPUE0gTW9kZSB0aGUgdHdvIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlIFRJTV9DSEFOTkVMXzEgYW5kIFRJTV9DSEFOTkVMXzIpCisgIGlmIFRJTV9DSEFOTkVMXzEgaXMgdXNlZCBhcyBvdXRwdXQsIHRoZSBUSU1fQ0hBTk5FTF8yIHdpbGwgYmUgdXNlZCBhcyBpbnB1dCBhbmQKKyAgaWYgVElNX0NIQU5ORUxfMSBpcyB1c2VkIGFzIGlucHV0LCB0aGUgVElNX0NIQU5ORUxfMiB3aWxsIGJlIHVzZWQgYXMgb3V0cHV0IAorICBpbiBhbGwgY29tYmluYXRpb25zLCB0aGUgVElNX0NIQU5ORUxfMSBhbmQgVElNX0NIQU5ORUxfMiBzaG91bGQgYmUgZGlzYWJsZWQgdG9nZXRoZXIgKi8KKyAgCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0RJU0FCTEUpOyAKKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRElTQUJMRSk7IAorICAgIAorICBpZihJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKSAgCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBNYWluIE91cHV0ICovCisgICAgX19IQUxfVElNX01PRV9ESVNBQkxFKGh0aW0pOworICB9CisgICAgCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7IAorICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIE9uZSBQdWxzZSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE9uZSBQdWxzZSBoYW5kbGUKKyAgKiBAcGFyYW0gIE91dHB1dENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBPdXRwdXRDaGFubmVsKQoreworICAvKiBFbmFibGUgdGhlIENhcHR1cmUgY29tcGFyZSBhbmQgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbHMgCisgICAgKGluIHRoZSBPUE0gTW9kZSB0aGUgdHdvIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlIFRJTV9DSEFOTkVMXzEgYW5kIFRJTV9DSEFOTkVMXzIpCisgICAgaWYgVElNX0NIQU5ORUxfMSBpcyB1c2VkIGFzIG91dHB1dCwgdGhlIFRJTV9DSEFOTkVMXzIgd2lsbCBiZSB1c2VkIGFzIGlucHV0IGFuZAorICAgIGlmIFRJTV9DSEFOTkVMXzEgaXMgdXNlZCBhcyBpbnB1dCwgdGhlIFRJTV9DSEFOTkVMXzIgd2lsbCBiZSB1c2VkIGFzIG91dHB1dCAKKyAgICBpbiBhbGwgY29tYmluYXRpb25zLCB0aGUgVElNX0NIQU5ORUxfMSBhbmQgVElNX0NIQU5ORUxfMiBzaG91bGQgYmUgZW5hYmxlZCB0b2dldGhlciAKKyAgICAKKyAgICBObyBuZWVkIHRvIGVuYWJsZSB0aGUgY291bnRlciwgaXQncyBlbmFibGVkIGF1dG9tYXRpY2FsbHkgYnkgaGFyZHdhcmUgCisgICAgKHRoZSBjb3VudGVyIHN0YXJ0cyBpbiByZXNwb25zZSB0byBhIHN0aW11bHVzIGFuZCBnZW5lcmF0ZSBhIHB1bHNlICovCisgCisgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCAqLworICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAKKyAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0ICovCisgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7CisgIAorICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9FTkFCTEUpOyAKKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRU5BQkxFKTsgCisgIAorICBpZihJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKSAgCisgIHsKKyAgICAvKiBFbmFibGUgdGhlIG1haW4gb3V0cHV0ICovCisgICAgX19IQUxfVElNX01PRV9FTkFCTEUoaHRpbSk7CisgIH0KKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIE9uZSBQdWxzZSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE9uZSBQdWxzZSBoYW5kbGUKKyAgKiBAcGFyYW0gIE91dHB1dENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IE91dHB1dENoYW5uZWwpCit7CisgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7ICAKKyAgCisgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7CisgIAorICAvKiBEaXNhYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgYW5kIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWxzIAorICAoaW4gdGhlIE9QTSBNb2RlIHRoZSB0d28gcG9zc2libGUgY2hhbm5lbHMgdGhhdCBjYW4gYmUgdXNlZCBhcmUgVElNX0NIQU5ORUxfMSBhbmQgVElNX0NIQU5ORUxfMikKKyAgaWYgVElNX0NIQU5ORUxfMSBpcyB1c2VkIGFzIG91dHB1dCwgdGhlIFRJTV9DSEFOTkVMXzIgd2lsbCBiZSB1c2VkIGFzIGlucHV0IGFuZAorICBpZiBUSU1fQ0hBTk5FTF8xIGlzIHVzZWQgYXMgaW5wdXQsIHRoZSBUSU1fQ0hBTk5FTF8yIHdpbGwgYmUgdXNlZCBhcyBvdXRwdXQgCisgIGluIGFsbCBjb21iaW5hdGlvbnMsIHRoZSBUSU1fQ0hBTk5FTF8xIGFuZCBUSU1fQ0hBTk5FTF8yIHNob3VsZCBiZSBkaXNhYmxlZCB0b2dldGhlciAqLyAgCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0RJU0FCTEUpOyAKKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRElTQUJMRSk7IAorICAgIAorICBpZihJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKSAgCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBNYWluIE91cHV0ICovCisgICAgX19IQUxfVElNX01PRV9ESVNBQkxFKGh0aW0pOworICB9CisgICAgCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOyAgCisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDYgVGltZSBFbmNvZGVyIGZ1bmN0aW9ucyAKKyAqICBAYnJpZWYgICAgVGltZSBFbmNvZGVyIGZ1bmN0aW9ucyAKKyAqCitAdmVyYmF0aW0gICAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBUaW1lIEVuY29kZXIgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAoKykgSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIHRoZSBUSU0gRW5jb2Rlci4gCisgICAgKCspIERlLWluaXRpYWxpemUgdGhlIFRJTSBFbmNvZGVyLgorICAgICgrKSBTdGFydCB0aGUgVGltZSBFbmNvZGVyLgorICAgICgrKSBTdG9wIHRoZSBUaW1lIEVuY29kZXIuCisgICAgKCspIFN0YXJ0IHRoZSBUaW1lIEVuY29kZXIgYW5kIGVuYWJsZSBpbnRlcnJ1cHQuCisgICAgKCspIFN0b3AgdGhlIFRpbWUgRW5jb2RlciBhbmQgZGlzYWJsZSBpbnRlcnJ1cHQuCisgICAgKCspIFN0YXJ0IHRoZSBUaW1lIEVuY29kZXIgYW5kIGVuYWJsZSBETUEgdHJhbnNmZXIuCisgICAgKCspIFN0b3AgdGhlIFRpbWUgRW5jb2RlciBhbmQgZGlzYWJsZSBETUEgdHJhbnNmZXIuCisgCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIEVuY29kZXIgSW50ZXJmYWNlIGFuZCBjcmVhdGUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBub3RlICAgU3dpdGNoaW5nIGZyb20gQ2VudGVyIEFsaWduZWQgY291bnRlciBtb2RlIHRvIEVkZ2UgY291bnRlciBtb2RlIChvciByZXZlcnNlKQorICAqICAgICAgICAgcmVxdWlyZXMgYSB0aW1lciByZXNldCB0byBhdm9pZCB1bmV4cGVjdGVkIGRpcmVjdGlvbiAKKyAgKiAgICAgICAgIGR1ZSB0byBESVIgYml0IHJlYWRvbmx5IGluIGNlbnRlciBhbGlnbmVkIG1vZGUuCisgICogICAgICAgICBFeDogY2FsbCBAcmVmIEhBTF9USU1fRW5jb2Rlcl9EZUluaXQoKSBiZWZvcmUgSEFMX1RJTV9FbmNvZGVyX0luaXQoKQorICAqIEBwYXJhbSAgaHRpbSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgaGFuZGxlCisgICogQHBhcmFtICBzQ29uZmlnIFRJTSBFbmNvZGVyIEludGVyZmFjZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX0luaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sICBUSU1fRW5jb2Rlcl9Jbml0VHlwZURlZiogc0NvbmZpZykKK3sKKyAgdWludDMyX3QgdG1wc21jciA9IDBVOworICB1aW50MzJfdCB0bXBjY21yMSA9IDBVOworICB1aW50MzJfdCB0bXBjY2VyID0gMFU7CisgICAgCisgIC8qIENoZWNrIHRoZSBUSU0gaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYoaHRpbSA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQ09VTlRFUl9NT0RFKGh0aW0tPkluaXQuQ291bnRlck1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS0RJVklTSU9OX0RJVihodGltLT5Jbml0LkNsb2NrRGl2aXNpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BVVRPUkVMT0FEX1BSRUxPQUQoaHRpbS0+SW5pdC5BdXRvUmVsb2FkUHJlbG9hZCkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0VOQ09ERVJfTU9ERShzQ29uZmlnLT5FbmNvZGVyTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1NFTEVDVElPTihzQ29uZmlnLT5JQzFTZWxlY3Rpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19TRUxFQ1RJT04oc0NvbmZpZy0+SUMyU2VsZWN0aW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fSUNfUE9MQVJJVFkoc0NvbmZpZy0+SUMxUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19QT0xBUklUWShzQ29uZmlnLT5JQzJQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1BSRVNDQUxFUihzQ29uZmlnLT5JQzFQcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19QUkVTQ0FMRVIoc0NvbmZpZy0+SUMyUHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fSUNfRklMVEVSKHNDb25maWctPklDMUZpbHRlcikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX0ZJTFRFUihzQ29uZmlnLT5JQzJGaWx0ZXIpKTsKKworICBpZihodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFU0VUKQorICB7IAorICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBodGltLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgYW5kIERNQSAqLworICAgIEhBTF9USU1fRW5jb2Rlcl9Nc3BJbml0KGh0aW0pOworICB9CisgIAorICAvKiBTZXQgdGhlIFRJTSBzdGF0ZSAqLworICBodGltLT5TdGF0ZT0gSEFMX1RJTV9TVEFURV9CVVNZOworICAKKyAgLyogUmVzZXQgdGhlIFNNUyBiaXRzICovCisgIGh0aW0tPkluc3RhbmNlLT5TTUNSICY9IH5USU1fU01DUl9TTVM7CisgIAorICAvKiBDb25maWd1cmUgdGhlIFRpbWUgYmFzZSBpbiB0aGUgRW5jb2RlciBNb2RlICovCisgIFRJTV9CYXNlX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgJmh0aW0tPkluaXQpOyAgCisgIAorICAvKiBHZXQgdGhlIFRJTXggU01DUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1I7CisKKyAgLyogR2V0IHRoZSBUSU14IENDTVIxIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjbXIxID0gaHRpbS0+SW5zdGFuY2UtPkNDTVIxOworCisgIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjZXIgPSBodGltLT5JbnN0YW5jZS0+Q0NFUjsKKworICAvKiBTZXQgdGhlIGVuY29kZXIgTW9kZSAqLworICB0bXBzbWNyIHw9IHNDb25maWctPkVuY29kZXJNb2RlOworCisgIC8qIFNlbGVjdCB0aGUgQ2FwdHVyZSBDb21wYXJlIDEgYW5kIHRoZSBDYXB0dXJlIENvbXBhcmUgMiBhcyBpbnB1dCAqLworICB0bXBjY21yMSAmPSB+KFRJTV9DQ01SMV9DQzFTIHwgVElNX0NDTVIxX0NDMlMpOworICB0bXBjY21yMSB8PSAoc0NvbmZpZy0+SUMxU2VsZWN0aW9uIHwgKHNDb25maWctPklDMlNlbGVjdGlvbiA8PCA4VSkpOworICAKKyAgLyogU2V0IHRoZSB0aGUgQ2FwdHVyZSBDb21wYXJlIDEgYW5kIHRoZSBDYXB0dXJlIENvbXBhcmUgMiBwcmVzY2FsZXJzIGFuZCBmaWx0ZXJzICovCisgIHRtcGNjbXIxICY9IH4oVElNX0NDTVIxX0lDMVBTQyB8IFRJTV9DQ01SMV9JQzJQU0MpOworICB0bXBjY21yMSAmPSB+KFRJTV9DQ01SMV9JQzFGIHwgVElNX0NDTVIxX0lDMkYpOworICB0bXBjY21yMSB8PSBzQ29uZmlnLT5JQzFQcmVzY2FsZXIgfCAoc0NvbmZpZy0+SUMyUHJlc2NhbGVyIDw8IDhVKTsKKyAgdG1wY2NtcjEgfD0gKHNDb25maWctPklDMUZpbHRlciA8PCA0VSkgfCAoc0NvbmZpZy0+SUMyRmlsdGVyIDw8IDEyVSk7CisKKyAgLyogU2V0IHRoZSBUSTEgYW5kIHRoZSBUSTIgUG9sYXJpdGllcyAqLworICB0bXBjY2VyICY9IH4oVElNX0NDRVJfQ0MxUCB8IFRJTV9DQ0VSX0NDMlApOworICB0bXBjY2VyICY9IH4oVElNX0NDRVJfQ0MxTlAgfCBUSU1fQ0NFUl9DQzJOUCk7CisgIHRtcGNjZXIgfD0gc0NvbmZpZy0+SUMxUG9sYXJpdHkgfCAoc0NvbmZpZy0+SUMyUG9sYXJpdHkgPDwgNFUpOworICAKKyAgLyogV3JpdGUgdG8gVElNeCBTTUNSICovCisgIGh0aW0tPkluc3RhbmNlLT5TTUNSID0gdG1wc21jcjsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIxICovCisgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSA9IHRtcGNjbXIxOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiAqLworICBodGltLT5JbnN0YW5jZS0+Q0NFUiA9IHRtcGNjZXI7CisgIAorICAvKiBJbml0aWFsaXplIHRoZSBUSU0gc3RhdGUqLworICBodGltLT5TdGF0ZT0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIHRoZSBUSU0gRW5jb2RlciBpbnRlcmZhY2UgIAorICAqIEBwYXJhbSAgaHRpbSBUSU0gRW5jb2RlciBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9EZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworICAKKyAgLyogRGlzYWJsZSB0aGUgVElNIFBlcmlwaGVyYWwgQ2xvY2sgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisgIAorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMgKi8KKyAgSEFMX1RJTV9FbmNvZGVyX01zcERlSW5pdChodGltKTsKKyAgICAKKyAgLyogQ2hhbmdlIFRJTSBzdGF0ZSAqLyAgCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRVNFVDsgCisgIAorICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBFbmNvZGVyIEludGVyZmFjZSBNU1AuCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fRW5jb2Rlcl9Nc3BJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9FbmNvZGVyX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIFRJTSBFbmNvZGVyIEludGVyZmFjZSBNU1AuCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fRW5jb2Rlcl9Nc3BEZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX0VuY29kZXJfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gRW5jb2RlciBJbnRlcmZhY2UuCisgICogQHBhcmFtICBodGltIFRJTSBFbmNvZGVyIEludGVyZmFjZSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfQUxMOiBUSU0gQ2hhbm5lbCAxIGFuZCBUSU0gQ2hhbm5lbCAyIGFyZSBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIEVuYWJsZSB0aGUgZW5jb2RlciBpbnRlcmZhY2UgY2hhbm5lbHMgKi8KKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9FTkFCTEUpOyAKKyAgICAgIGJyZWFrOyAKKyAgICB9ICAKKyAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsgIAorICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRU5BQkxFKTsgCisgICAgICBicmVhazsKKyAgICB9ICAKKyAgZGVmYXVsdCA6CisgICAgeworICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRU5BQkxFKTsKKyAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0VOQUJMRSk7IAorICAgICAgYnJlYWs7IAorICAgIH0KKyAgfSAgCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gRW5jb2RlciBJbnRlcmZhY2UuCisgICogQHBhcmFtICBodGltIFRJTSBFbmNvZGVyIEludGVyZmFjZSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGRpc2FibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMX0FMTDogVElNIENoYW5uZWwgMSBhbmQgVElNIENoYW5uZWwgMiBhcmUgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIERpc2FibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbHMgMSBhbmQgMgorICAoaW4gdGhlIEVuY29kZXJJbnRlcmZhY2UgdGhlIHR3byBwb3NzaWJsZSBjaGFubmVscyB0aGF0IGNhbiBiZSB1c2VkIGFyZSBUSU1fQ0hBTk5FTF8xIGFuZCBUSU1fQ0hBTk5FTF8yKSAqLyAKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9ESVNBQkxFKTsgCisgICAgICBicmVhazsgCisgICAgfSAgCisgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7ICAKKyAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0RJU0FCTEUpOyAKKyAgICAgIGJyZWFrOworICAgIH0gIAorICBkZWZhdWx0IDoKKyAgICB7CisgICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9ESVNBQkxFKTsgCisgICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMiwgVElNX0NDeF9ESVNBQkxFKTsgCisgICAgICBicmVhazsgCisgICAgfQorICB9CisgIAorICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIEVuY29kZXIgSW50ZXJmYWNlIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMX0FMTDogVElNIENoYW5uZWwgMSBhbmQgVElNIENoYW5uZWwgMiBhcmUgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIAorICAvKiBFbmFibGUgdGhlIGVuY29kZXIgaW50ZXJmYWNlIGNoYW5uZWxzICovCisgIC8qIEVuYWJsZSB0aGUgY2FwdHVyZSBjb21wYXJlIEludGVycnVwdHMgMSBhbmQvb3IgMlUgKi8KKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9FTkFCTEUpOyAKKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisgICAgICBicmVhazsgCisgICAgfSAgCisgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7ICAKKyAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0VOQUJMRSk7IAorICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKyAgICAgIGJyZWFrOworICAgIH0gIAorICBkZWZhdWx0IDoKKyAgICB7CisgICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9FTkFCTEUpOworICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRU5BQkxFKTsgCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKyAgICAgIGJyZWFrOyAKKyAgICB9CisgIH0gICAKKyAgCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBFbmNvZGVyIEludGVyZmFjZSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGRpc2FibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMX0FMTDogVElNIENoYW5uZWwgMSBhbmQgVElNIENoYW5uZWwgMiBhcmUgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIERpc2FibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbHMgMSBhbmQgMgorICAoaW4gdGhlIEVuY29kZXJJbnRlcmZhY2UgdGhlIHR3byBwb3NzaWJsZSBjaGFubmVscyB0aGF0IGNhbiBiZSB1c2VkIGFyZSBUSU1fQ0hBTk5FTF8xIGFuZCBUSU1fQ0hBTk5FTF8yKSAqLyAKKyAgaWYoQ2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8xKQorICB7CisgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRElTQUJMRSk7IAorICAgIAorICAgIC8qIERpc2FibGUgdGhlIGNhcHR1cmUgY29tcGFyZSBJbnRlcnJ1cHRzIDFVICovCisgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisgIH0gIAorICBlbHNlIGlmKENoYW5uZWwgPT0gVElNX0NIQU5ORUxfMikKKyAgeyAgCisgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRElTQUJMRSk7IAorICAgIAorICAgIC8qIERpc2FibGUgdGhlIGNhcHR1cmUgY29tcGFyZSBJbnRlcnJ1cHRzIDJVICovCisgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7CisgIH0gIAorICBlbHNlCisgIHsKKyAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9ESVNBQkxFKTsgCisgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRElTQUJMRSk7IAorICAgIAorICAgIC8qIERpc2FibGUgdGhlIGNhcHR1cmUgY29tcGFyZSBJbnRlcnJ1cHRzIDEgYW5kIDJVICovCisgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7CisgIH0KKyAgCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisgIAorICAvKiBDaGFuZ2UgdGhlIGh0aW0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIEVuY29kZXIgSW50ZXJmYWNlIGluIERNQSBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMX0FMTDogVElNIENoYW5uZWwgMSBhbmQgVElNIENoYW5uZWwgMiBhcmUgc2VsZWN0ZWQKKyAgKiBAcGFyYW0gIHBEYXRhMTogVGhlIGRlc3RpbmF0aW9uIEJ1ZmZlciBhZGRyZXNzIGZvciBJQzEuCisgICogQHBhcmFtICBwRGF0YTI6IFRoZSBkZXN0aW5hdGlvbiBCdWZmZXIgYWRkcmVzcyBmb3IgSUMyLgorICAqIEBwYXJhbSAgTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIFRJTSBwZXJpcGhlcmFsIHRvIG1lbW9yeS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RhcnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCAqcERhdGExLCB1aW50MzJfdCAqcERhdGEyLCB1aW50MTZfdCBMZW5ndGgpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0NDX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIAorICBpZigoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9CVVNZKSkKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorICBlbHNlIGlmKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKSkKKyAgeworICAgIGlmKCgoKHBEYXRhMSA9PSAwVSkgfHwgKHBEYXRhMiA9PSAwVSkgKSkgJiYgKExlbmd0aCA+IDBVKSkgCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworICAgIH0KKyAgfSAgCisgIAorICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIFBlcmlvZCBlbGFwc2VkIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlQ3BsdDsKKyAgICAgIAorICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0sICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjEsICh1aW50MzJfdCApcERhdGExLCBMZW5ndGgpOyAKKyAgICAgIAorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBETUEgcmVxdWVzdCAqLyAgICAgIAorICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzEpOworICAgICAgCisgICAgICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGNoYW5uZWwgKi8KKyAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0VOQUJMRSk7CisgICAgfQorICAgIGJyZWFrOworICAgIAorICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgUGVyaW9kIGVsYXBzZWQgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVDcGx0OworICAgICAgCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yOworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMiwgKHVpbnQzMl90KXBEYXRhMiwgTGVuZ3RoKTsKKyAgICAgIAorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSAgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MyKTsKKyAgICAgIAorICAgICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICAgICAgCisgICAgICAvKiBFbmFibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsICovCisgICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMiwgVElNX0NDeF9FTkFCTEUpOworICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgY2FzZSBUSU1fQ0hBTk5FTF9BTEw6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgUGVyaW9kIGVsYXBzZWQgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVDcGx0OworICAgICAgCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKyAgICAgIAorICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMSwgKHVpbnQzMl90KXBEYXRhMSwgTGVuZ3RoKTsKKyAgICAgIAorICAgICAgLyogU2V0IHRoZSBETUEgUGVyaW9kIGVsYXBzZWQgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVDcGx0OworICAgICAgCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKyAgICAgIAorICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMiwgKHVpbnQzMl90KXBEYXRhMiwgTGVuZ3RoKTsKKyAgICAgIAorICAgICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICAgICAgCisgICAgICAvKiBFbmFibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsICovCisgICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9FTkFCTEUpOworICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRU5BQkxFKTsKKyAgICAgIAorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSAgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIElucHV0IENhcHR1cmUgIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMik7CisgICAgfQorICAgIGJyZWFrOworICAgIAorICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9ICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgaW4gRE1BIG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBFbmNvZGVyIEludGVyZmFjZSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfQUxMOiBUSU0gQ2hhbm5lbCAxIGFuZCBUSU0gQ2hhbm5lbCAyIGFyZSBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfQ0NfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIERpc2FibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbHMgMSBhbmQgMgorICAoaW4gdGhlIEVuY29kZXJJbnRlcmZhY2UgdGhlIHR3byBwb3NzaWJsZSBjaGFubmVscyB0aGF0IGNhbiBiZSB1c2VkIGFyZSBUSU1fQ0hBTk5FTF8xIGFuZCBUSU1fQ0hBTk5FTF8yKSAqLyAKKyAgaWYoQ2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8xKQorICB7CisgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRElTQUJMRSk7IAorICAgIAorICAgIC8qIERpc2FibGUgdGhlIGNhcHR1cmUgY29tcGFyZSBETUEgUmVxdWVzdCAxVSAqLworICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMSk7CisgIH0gIAorICBlbHNlIGlmKENoYW5uZWwgPT0gVElNX0NIQU5ORUxfMikKKyAgeyAgCisgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRElTQUJMRSk7IAorICAgIAorICAgIC8qIERpc2FibGUgdGhlIGNhcHR1cmUgY29tcGFyZSBETUEgUmVxdWVzdCAyVSAqLworICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMik7CisgIH0gIAorICBlbHNlCisgIHsKKyAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9ESVNBQkxFKTsgCisgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRElTQUJMRSk7IAorICAgIAorICAgIC8qIERpc2FibGUgdGhlIGNhcHR1cmUgY29tcGFyZSBETUEgUmVxdWVzdCAxIGFuZCAyVSAqLworICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMSk7CisgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MyKTsKKyAgfQorICAKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKyAgCisgIC8qIENoYW5nZSB0aGUgaHRpbSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA3IFRJTSBJUlEgaGFuZGxlciBtYW5hZ2VtZW50IAorICogIEBicmllZiAgICBJUlEgaGFuZGxlciBtYW5hZ2VtZW50IAorICoKK0B2ZXJiYXRpbSAgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElSUSBoYW5kbGVyIG1hbmFnZW1lbnQgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgWy4uXSAgCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIFRpbWVyIElSUSBoYW5kbGVyIGZ1bmN0aW9uLgorICAgICAgICAgICAgICAgCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgVElNIGludGVycnVwdHMgcmVxdWVzdHMuCisgICogQHBhcmFtICBodGltIFRJTSAgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9USU1fSVJRSGFuZGxlcihUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogQ2FwdHVyZSBjb21wYXJlIDEgZXZlbnQgKi8KKyAgaWYoX19IQUxfVElNX0dFVF9GTEFHKGh0aW0sIFRJTV9GTEFHX0NDMSkgIT0gUkVTRVQpCisgIHsKKyAgICBpZihfX0hBTF9USU1fR0VUX0lUX1NPVVJDRShodGltLCBUSU1fSVRfQ0MxKSAhPVJFU0VUKQorICAgIHsKKyAgICAgIHsKKyAgICAgICAgX19IQUxfVElNX0NMRUFSX0ZMQUcoaHRpbSwgVElNX0ZMQUdfQ0MxKTsKKyAgICAgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMTsKKyAgICAgICAgCisgICAgICAgIC8qIElucHV0IGNhcHR1cmUgZXZlbnQgKi8KKyAgICAgICAgaWYoKGh0aW0tPkluc3RhbmNlLT5DQ01SMSAmIFRJTV9DQ01SMV9DQzFTKSAhPSAweDAwVSkKKyAgICAgICAgeworICAgICAgICAgIEhBTF9USU1fSUNfQ2FwdHVyZUNhbGxiYWNrKGh0aW0pOworICAgICAgICB9CisgICAgICAgIC8qIE91dHB1dCBjb21wYXJlIGV2ZW50ICovCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIEhBTF9USU1fT0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2soaHRpbSk7CisgICAgICAgICAgSEFMX1RJTV9QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrKGh0aW0pOworICAgICAgICB9CisgICAgICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMX0NMRUFSRUQ7CisgICAgICB9CisgICAgfQorICB9CisgIC8qIENhcHR1cmUgY29tcGFyZSAyIGV2ZW50ICovCisgIGlmKF9fSEFMX1RJTV9HRVRfRkxBRyhodGltLCBUSU1fRkxBR19DQzIpICE9IFJFU0VUKQorICB7CisgICAgaWYoX19IQUxfVElNX0dFVF9JVF9TT1VSQ0UoaHRpbSwgVElNX0lUX0NDMikgIT1SRVNFVCkKKyAgICB7CisgICAgICBfX0hBTF9USU1fQ0xFQVJfRkxBRyhodGltLCBUSU1fRkxBR19DQzIpOworICAgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMjsKKyAgICAgIC8qIElucHV0IGNhcHR1cmUgZXZlbnQgKi8KKyAgICAgIGlmKChodGltLT5JbnN0YW5jZS0+Q0NNUjEgJiBUSU1fQ0NNUjFfQ0MyUykgIT0gMHgwMFUpCisgICAgICB7ICAgICAgICAgIAorICAgICAgICBIQUxfVElNX0lDX0NhcHR1cmVDYWxsYmFjayhodGltKTsKKyAgICAgIH0KKyAgICAgIC8qIE91dHB1dCBjb21wYXJlIGV2ZW50ICovCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIEhBTF9USU1fT0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2soaHRpbSk7CisgICAgICAgIEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayhodGltKTsKKyAgICAgIH0KKyAgICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMX0NMRUFSRUQ7CisgICAgfSAKKyAgfQorICAvKiBDYXB0dXJlIGNvbXBhcmUgMyBldmVudCAqLworICBpZihfX0hBTF9USU1fR0VUX0ZMQUcoaHRpbSwgVElNX0ZMQUdfQ0MzKSAhPSBSRVNFVCkKKyAgeworICAgIGlmKF9fSEFMX1RJTV9HRVRfSVRfU09VUkNFKGh0aW0sIFRJTV9JVF9DQzMpICE9UkVTRVQpCisgICAgeworICAgICAgX19IQUxfVElNX0NMRUFSX0ZMQUcoaHRpbSwgVElNX0ZMQUdfQ0MzKTsKKyAgICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzM7CisgICAgICAvKiBJbnB1dCBjYXB0dXJlIGV2ZW50ICovCisgICAgICBpZigoaHRpbS0+SW5zdGFuY2UtPkNDTVIyICYgVElNX0NDTVIyX0NDM1MpICE9IDB4MDBVKQorICAgICAgeyAgICAgICAgICAKKyAgICAgICAgSEFMX1RJTV9JQ19DYXB0dXJlQ2FsbGJhY2soaHRpbSk7CisgICAgICB9CisgICAgICAvKiBPdXRwdXQgY29tcGFyZSBldmVudCAqLworICAgICAgZWxzZQorICAgICAgeworICAgICAgICBIQUxfVElNX09DX0RlbGF5RWxhcHNlZENhbGxiYWNrKGh0aW0pOworICAgICAgICBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2soaHRpbSk7IAorICAgICAgfQorICAgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfQ0xFQVJFRDsKKyAgICB9CisgIH0KKyAgLyogQ2FwdHVyZSBjb21wYXJlIDQgZXZlbnQgKi8KKyAgaWYoX19IQUxfVElNX0dFVF9GTEFHKGh0aW0sIFRJTV9GTEFHX0NDNCkgIT0gUkVTRVQpCisgIHsKKyAgICBpZihfX0hBTF9USU1fR0VUX0lUX1NPVVJDRShodGltLCBUSU1fSVRfQ0M0KSAhPVJFU0VUKQorICAgIHsKKyAgICAgIF9fSEFMX1RJTV9DTEVBUl9GTEFHKGh0aW0sIFRJTV9GTEFHX0NDNCk7CisgICAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF80OworICAgICAgLyogSW5wdXQgY2FwdHVyZSBldmVudCAqLworICAgICAgaWYoKGh0aW0tPkluc3RhbmNlLT5DQ01SMiAmIFRJTV9DQ01SMl9DQzRTKSAhPSAweDAwVSkKKyAgICAgIHsgICAgICAgICAgCisgICAgICAgIEhBTF9USU1fSUNfQ2FwdHVyZUNhbGxiYWNrKGh0aW0pOworICAgICAgfQorICAgICAgLyogT3V0cHV0IGNvbXBhcmUgZXZlbnQgKi8KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgSEFMX1RJTV9PQ19EZWxheUVsYXBzZWRDYWxsYmFjayhodGltKTsKKyAgICAgICAgSEFMX1RJTV9QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrKGh0aW0pOworICAgICAgfQorICAgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfQ0xFQVJFRDsKKyAgICB9IAorICB9CisgIC8qIFRJTSBVcGRhdGUgZXZlbnQgKi8KKyAgaWYoX19IQUxfVElNX0dFVF9GTEFHKGh0aW0sIFRJTV9GTEFHX1VQREFURSkgIT0gUkVTRVQpCisgIHsKKyAgICBpZihfX0hBTF9USU1fR0VUX0lUX1NPVVJDRShodGltLCBUSU1fSVRfVVBEQVRFKSAhPVJFU0VUKQorICAgIHsgCisgICAgICBfX0hBTF9USU1fQ0xFQVJfRkxBRyhodGltLCBUSU1fRkxBR19VUERBVEUpOworICAgICAgSEFMX1RJTV9QZXJpb2RFbGFwc2VkQ2FsbGJhY2soaHRpbSk7CisgICAgfQorICB9CisgIC8qIFRJTSBCcmVhayBpbnB1dCBldmVudCAqLworICBpZihfX0hBTF9USU1fR0VUX0ZMQUcoaHRpbSwgVElNX0ZMQUdfQlJFQUspICE9IFJFU0VUKQorICB7CisgICAgaWYoX19IQUxfVElNX0dFVF9JVF9TT1VSQ0UoaHRpbSwgVElNX0lUX0JSRUFLKSAhPVJFU0VUKQorICAgIHsgCisgICAgICBfX0hBTF9USU1fQ0xFQVJfRkxBRyhodGltLCBUSU1fRkxBR19CUkVBSyk7CisgICAgICBIQUxfVElNRXhfQnJlYWtDYWxsYmFjayhodGltKTsKKyAgICB9CisgIH0KKworI2lmIGRlZmluZWQoVElNX0ZMQUdfQlJFQUsyKQorICAvKiBUSU0gQnJlYWsgaW5wdXQgMiBldmVudCAqLworICBpZihfX0hBTF9USU1fR0VUX0ZMQUcoaHRpbSwgVElNX0ZMQUdfQlJFQUsyKSAhPSBSRVNFVCkKKyAgeworICAgIGlmKF9fSEFMX1RJTV9HRVRfSVRfU09VUkNFKGh0aW0sIFRJTV9JVF9CUkVBSykgIT1SRVNFVCkKKyAgICB7CisgICAgICBfX0hBTF9USU1fQ0xFQVJfRkxBRyhodGltLCBUSU1fRkxBR19CUkVBSzIpOworICAgICAgSEFMX1RJTUV4X0JyZWFrMkNhbGxiYWNrKGh0aW0pOworICAgIH0KKyAgfQorI2VuZGlmCisKKyAgLyogVElNIFRyaWdnZXIgZGV0ZWN0aW9uIGV2ZW50ICovCisgIGlmKF9fSEFMX1RJTV9HRVRfRkxBRyhodGltLCBUSU1fRkxBR19UUklHR0VSKSAhPSBSRVNFVCkKKyAgeworICAgIGlmKF9fSEFMX1RJTV9HRVRfSVRfU09VUkNFKGh0aW0sIFRJTV9JVF9UUklHR0VSKSAhPVJFU0VUKQorICAgIHsgCisgICAgICBfX0hBTF9USU1fQ0xFQVJfRkxBRyhodGltLCBUSU1fRkxBR19UUklHR0VSKTsKKyAgICAgIEhBTF9USU1fVHJpZ2dlckNhbGxiYWNrKGh0aW0pOworICAgIH0KKyAgfQorICAvKiBUSU0gY29tbXV0YXRpb24gZXZlbnQgKi8KKyAgaWYoX19IQUxfVElNX0dFVF9GTEFHKGh0aW0sIFRJTV9GTEFHX0NPTSkgIT0gUkVTRVQpCisgIHsKKyAgICBpZihfX0hBTF9USU1fR0VUX0lUX1NPVVJDRShodGltLCBUSU1fSVRfQ09NKSAhPVJFU0VUKQorICAgIHsgCisgICAgICBfX0hBTF9USU1fQ0xFQVJfRkxBRyhodGltLCBUSU1fRkxBR19DT00pOworICAgICAgSEFMX1RJTUV4X0NvbW11dGF0aW9uQ2FsbGJhY2soaHRpbSk7CisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDggUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICogIEBicmllZiAgIAlQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zIAorICoKK0B2ZXJiYXRpbSAgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgWy4uXSAKKyAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgQ29uZmlndXJlIFRoZSBJbnB1dCBPdXRwdXQgY2hhbm5lbHMgZm9yIE9DLCBQV00sIElDIG9yIE9uZSBQdWxzZSBtb2RlLiAKKyAgICAgICgrKSBDb25maWd1cmUgRXh0ZXJuYWwgQ2xvY2sgc291cmNlLgorICAgICAgKCspIENvbmZpZ3VyZSBDb21wbGVtZW50YXJ5IGNoYW5uZWxzLCBicmVhayBmZWF0dXJlcyBhbmQgZGVhZCB0aW1lLgorICAgICAgKCspIENvbmZpZ3VyZSBNYXN0ZXIgYW5kIHRoZSBTbGF2ZSBzeW5jaHJvbml6YXRpb24uCisgICAgICAoKykgQ29uZmlndXJlIHRoZSBETUEgQnVyc3QgTW9kZS4KKyAgICAgIAorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKyAgCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgQ2hhbm5lbHMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFRJTV9PQ19Jbml0VHlwZURlZi4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZQorICAqIEBwYXJhbSAgc0NvbmZpZyBUSU0gT3V0cHV0IENvbXBhcmUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkIAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworX193ZWFrIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfQ29uZmlnQ2hhbm5lbChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgVElNX09DX0luaXRUeXBlRGVmKiBzQ29uZmlnLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NIQU5ORUxTKENoYW5uZWwpKTsgCisgIGFzc2VydF9wYXJhbShJU19USU1fT0NfTU9ERShzQ29uZmlnLT5PQ01vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ19QT0xBUklUWShzQ29uZmlnLT5PQ1BvbGFyaXR5KSk7CisgIAorICAvKiBDaGVjayBpbnB1dCBzdGF0ZSAqLworICBfX0hBTF9MT0NLKGh0aW0pOyAKKyAgCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworICAKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MxX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgICAgICAvKiBDb25maWd1cmUgdGhlIFRJTSBDaGFubmVsIDEgaW4gT3V0cHV0IENvbXBhcmUgKi8KKyAgICAgIFRJTV9PQzFfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgICAgICAvKiBDb25maWd1cmUgdGhlIFRJTSBDaGFubmVsIDIgaW4gT3V0cHV0IENvbXBhcmUgKi8KKyAgICAgIFRJTV9PQzJfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOgorICAgIHsKKyAgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDM19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAgICAgLyogQ29uZmlndXJlIHRoZSBUSU0gQ2hhbm5lbCAzIGluIE91dHB1dCBDb21wYXJlICovCisgICAgICBUSU1fT0MzX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZyk7CisgICAgfQorICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgVElNX0NIQU5ORUxfNDoKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDNF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAgICAgIC8qIENvbmZpZ3VyZSB0aGUgVElNIENoYW5uZWwgNCBpbiBPdXRwdXQgQ29tcGFyZSAqLworICAgICAgIFRJTV9PQzRfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgZGVmYXVsdDoKKyAgICBicmVhazsgICAgCisgIH0KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworICAKKyAgX19IQUxfVU5MT0NLKGh0aW0pOyAKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBJbnB1dCBDYXB0dXJlIENoYW5uZWxzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fSUNfSW5pdFR5cGVEZWYuCisgICogQHBhcmFtICBodGltIFRJTSBJQyBoYW5kbGUKKyAgKiBAcGFyYW0gIHNDb25maWcgVElNIElucHV0IENhcHR1cmUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkIAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19Db25maWdDaGFubmVsKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fSUNfSW5pdFR5cGVEZWYqIHNDb25maWcsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0MxX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fSUNfUE9MQVJJVFkoc0NvbmZpZy0+SUNQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1NFTEVDVElPTihzQ29uZmlnLT5JQ1NlbGVjdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1BSRVNDQUxFUihzQ29uZmlnLT5JQ1ByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX0ZJTFRFUihzQ29uZmlnLT5JQ0ZpbHRlcikpOworICAKKyAgX19IQUxfTE9DSyhodGltKTsKKyAgCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworICAKKyAgaWYgKENoYW5uZWwgPT0gVElNX0NIQU5ORUxfMSkKKyAgeworICAgIC8qIFRJMSBDb25maWd1cmF0aW9uICovCisgICAgVElNX1RJMV9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsCisgICAgICAgICAgICAgICBzQ29uZmlnLT5JQ1BvbGFyaXR5LAorICAgICAgICAgICAgICAgc0NvbmZpZy0+SUNTZWxlY3Rpb24sCisgICAgICAgICAgICAgICBzQ29uZmlnLT5JQ0ZpbHRlcik7CisgICAgICAgICAgICAgICAKKyAgICAvKiBSZXNldCB0aGUgSUMxUFNDIEJpdHMgKi8KKyAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgJj0gflRJTV9DQ01SMV9JQzFQU0M7CisKKyAgICAvKiBTZXQgdGhlIElDMVBTQyB2YWx1ZSAqLworICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSB8PSBzQ29uZmlnLT5JQ1ByZXNjYWxlcjsKKyAgfQorICBlbHNlIGlmIChDaGFubmVsID09IFRJTV9DSEFOTkVMXzIpCisgIHsKKyAgICAvKiBUSTIgQ29uZmlndXJhdGlvbiAqLworICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgICAgCisgICAgVElNX1RJMl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIAorICAgICAgICAgICAgICAgICAgICAgIHNDb25maWctPklDUG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgc0NvbmZpZy0+SUNTZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgc0NvbmZpZy0+SUNGaWx0ZXIpOworICAgICAgICAgICAgICAgCisgICAgLyogUmVzZXQgdGhlIElDMlBTQyBCaXRzICovCisgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIxICY9IH5USU1fQ0NNUjFfSUMyUFNDOworCisgICAgLyogU2V0IHRoZSBJQzJQU0MgdmFsdWUgKi8KKyAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgfD0gKHNDb25maWctPklDUHJlc2NhbGVyIDw8IDhVKTsKKyAgfQorICBlbHNlIGlmIChDaGFubmVsID09IFRJTV9DSEFOTkVMXzMpCisgIHsKKyAgICAvKiBUSTMgQ29uZmlndXJhdGlvbiAqLworICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MzX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgICAgCisgICAgVElNX1RJM19TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsICAKKyAgICAgICAgICAgICAgIHNDb25maWctPklDUG9sYXJpdHksCisgICAgICAgICAgICAgICBzQ29uZmlnLT5JQ1NlbGVjdGlvbiwKKyAgICAgICAgICAgICAgIHNDb25maWctPklDRmlsdGVyKTsKKyAgICAgICAgICAgICAgIAorICAgIC8qIFJlc2V0IHRoZSBJQzNQU0MgQml0cyAqLworICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMiAmPSB+VElNX0NDTVIyX0lDM1BTQzsKKworICAgIC8qIFNldCB0aGUgSUMzUFNDIHZhbHVlICovCisgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIyIHw9IHNDb25maWctPklDUHJlc2NhbGVyOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFRJNCBDb25maWd1cmF0aW9uICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzRfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgICAKKyAgICBUSU1fVEk0X1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgCisgICAgICAgICAgICAgICBzQ29uZmlnLT5JQ1BvbGFyaXR5LAorICAgICAgICAgICAgICAgc0NvbmZpZy0+SUNTZWxlY3Rpb24sCisgICAgICAgICAgICAgICBzQ29uZmlnLT5JQ0ZpbHRlcik7CisgICAgICAgICAgICAgICAKKyAgICAvKiBSZXNldCB0aGUgSUM0UFNDIEJpdHMgKi8KKyAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjIgJj0gflRJTV9DQ01SMl9JQzRQU0M7CisKKyAgICAvKiBTZXQgdGhlIElDNFBTQyB2YWx1ZSAqLworICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMiB8PSAoc0NvbmZpZy0+SUNQcmVzY2FsZXIgPDwgOFUpOworICB9CisgIAorICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisgICAgCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKyAgCisgIHJldHVybiBIQUxfT0s7IAorfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gUFdNICBjaGFubmVscyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgVElNX09DX0luaXRUeXBlRGVmLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBzQ29uZmlnIFRJTSBQV00gY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitfX3dlYWsgSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fQ29uZmlnQ2hhbm5lbChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgVElNX09DX0luaXRUeXBlRGVmKiBzQ29uZmlnLCB1aW50MzJfdCBDaGFubmVsKQoreworICBfX0hBTF9MT0NLKGh0aW0pOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8gCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0hBTk5FTFMoQ2hhbm5lbCkpOyAKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9QV01fTU9ERShzQ29uZmlnLT5PQ01vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ19QT0xBUklUWShzQ29uZmlnLT5PQ1BvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fRkFTVF9TVEFURShzQ29uZmlnLT5PQ0Zhc3RNb2RlKSk7CisgIAorICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKyAgICAKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MxX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgICAgICAvKiBDb25maWd1cmUgdGhlIENoYW5uZWwgMSBpbiBQV00gbW9kZSAqLworICAgICAgVElNX09DMV9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWcpOworICAgICAgCisgICAgICAvKiBTZXQgdGhlIFByZWxvYWQgZW5hYmxlIGJpdCBmb3IgY2hhbm5lbDEgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSB8PSBUSU1fQ0NNUjFfT0MxUEU7CisgICAgICAKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgT3V0cHV0IEZhc3QgbW9kZSAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIxICY9IH5USU1fQ0NNUjFfT0MxRkU7CisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgfD0gc0NvbmZpZy0+T0NGYXN0TW9kZTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgICAgICAvKiBDb25maWd1cmUgdGhlIENoYW5uZWwgMiBpbiBQV00gbW9kZSAqLworICAgICAgVElNX09DMl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWcpOworICAgICAgCisgICAgICAvKiBTZXQgdGhlIFByZWxvYWQgZW5hYmxlIGJpdCBmb3IgY2hhbm5lbDIgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSB8PSBUSU1fQ0NNUjFfT0MyUEU7CisgICAgICAKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgT3V0cHV0IEZhc3QgbW9kZSAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIxICY9IH5USU1fQ0NNUjFfT0MyRkU7CisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgfD0gc0NvbmZpZy0+T0NGYXN0TW9kZSA8PCA4VTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOgorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MzX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgICAgICAvKiBDb25maWd1cmUgdGhlIENoYW5uZWwgMyBpbiBQV00gbW9kZSAqLworICAgICAgVElNX09DM19TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWcpOworICAgICAgCisgICAgICAvKiBTZXQgdGhlIFByZWxvYWQgZW5hYmxlIGJpdCBmb3IgY2hhbm5lbDMgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMiB8PSBUSU1fQ0NNUjJfT0MzUEU7CisgICAgICAKKyAgICAgLyogQ29uZmlndXJlIHRoZSBPdXRwdXQgRmFzdCBtb2RlICovCisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjIgJj0gflRJTV9DQ01SMl9PQzNGRTsKKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMiB8PSBzQ29uZmlnLT5PQ0Zhc3RNb2RlOyAgCisgICAgfQorICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgVElNX0NIQU5ORUxfNDoKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDNF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAgICAgLyogQ29uZmlndXJlIHRoZSBDaGFubmVsIDQgaW4gUFdNIG1vZGUgKi8KKyAgICAgIFRJTV9PQzRfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsKKyAgICAgIAorICAgICAgLyogU2V0IHRoZSBQcmVsb2FkIGVuYWJsZSBiaXQgZm9yIGNoYW5uZWw0ICovCisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjIgfD0gVElNX0NDTVIyX09DNFBFOworICAgICAgCisgICAgIC8qIENvbmZpZ3VyZSB0aGUgT3V0cHV0IEZhc3QgbW9kZSAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIyICY9IH5USU1fQ0NNUjJfT0M0RkU7CisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjIgfD0gc0NvbmZpZy0+T0NGYXN0TW9kZSA8PCA4VTsgIAorICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBkZWZhdWx0OgorICAgIGJyZWFrOyAgICAKKyAgfQorICAKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworICAgIAorICBfX0hBTF9VTkxPQ0soaHRpbSk7CisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gT25lIFB1bHNlIENoYW5uZWxzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fT25lUHVsc2VfSW5pdFR5cGVEZWYuCisgICogQHBhcmFtICBodGltIFRJTSBPbmUgUHVsc2UgaGFuZGxlCisgICogQHBhcmFtICBzQ29uZmlnIFRJTSBPbmUgUHVsc2UgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gIE91dHB1dENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiBAcGFyYW0gIElucHV0Q2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9Db25maWdDaGFubmVsKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCAgVElNX09uZVB1bHNlX0luaXRUeXBlRGVmKiBzQ29uZmlnLCB1aW50MzJfdCBPdXRwdXRDaGFubmVsLCAgdWludDMyX3QgSW5wdXRDaGFubmVsKQoreworICBUSU1fT0NfSW5pdFR5cGVEZWYgdGVtcDE7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX09QTV9DSEFOTkVMUyhPdXRwdXRDaGFubmVsKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fT1BNX0NIQU5ORUxTKElucHV0Q2hhbm5lbCkpOworCisgIGlmKE91dHB1dENoYW5uZWwgIT0gSW5wdXRDaGFubmVsKSAgCisgIHsKKyAgX19IQUxfTE9DSyhodGltKTsKKyAgCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIEV4dHJhY3QgdGhlIE91cHV0IGNvbXBhcmUgY29uZmlndXJhdGlvbiBmcm9tIHNDb25maWcgc3RydWN0dXJlICovICAKKyAgdGVtcDEuT0NNb2RlID0gc0NvbmZpZy0+T0NNb2RlOworICB0ZW1wMS5QdWxzZSA9IHNDb25maWctPlB1bHNlOworICB0ZW1wMS5PQ1BvbGFyaXR5ID0gc0NvbmZpZy0+T0NQb2xhcml0eTsKKyAgdGVtcDEuT0NOUG9sYXJpdHkgPSBzQ29uZmlnLT5PQ05Qb2xhcml0eTsKKyAgdGVtcDEuT0NJZGxlU3RhdGUgPSBzQ29uZmlnLT5PQ0lkbGVTdGF0ZTsKKyAgdGVtcDEuT0NOSWRsZVN0YXRlID0gc0NvbmZpZy0+T0NOSWRsZVN0YXRlOyAKKyAgICAKKyAgICBzd2l0Y2ggKE91dHB1dENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAgICAgCisgICAgICBUSU1fT0MxX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgJnRlbXAxKTsgCisgICAgfQorICAgIGJyZWFrOworICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgICAgICAKKyAgICAgIFRJTV9PQzJfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCAmdGVtcDEpOworICAgIH0KKyAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgIGJyZWFrOyAgCisgIH0gCisgICAgc3dpdGNoIChJbnB1dENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAgICAgCisgICAgICBUSU1fVEkxX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZy0+SUNQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNDb25maWctPklDU2VsZWN0aW9uLCBzQ29uZmlnLT5JQ0ZpbHRlcik7CisgICAgICAgICAgICAgICAKKyAgICAvKiBSZXNldCB0aGUgSUMxUFNDIEJpdHMgKi8KKyAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgJj0gflRJTV9DQ01SMV9JQzFQU0M7CisKKyAgICAvKiBTZWxlY3QgdGhlIFRyaWdnZXIgc291cmNlICovCisgICAgICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSICY9IH5USU1fU01DUl9UUzsKKyAgICBodGltLT5JbnN0YW5jZS0+U01DUiB8PSBUSU1fVFNfVEkxRlAxOworICAgICAgCisgICAgLyogU2VsZWN0IHRoZSBTbGF2ZSBNb2RlICovICAgICAgCisgICAgICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSICY9IH5USU1fU01DUl9TTVM7CisgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgfD0gVElNX1NMQVZFTU9ERV9UUklHR0VSOworICAgIH0KKyAgICBicmVhazsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAgICAgCisgICAgICBUSU1fVEkyX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZy0+SUNQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgc0NvbmZpZy0+SUNTZWxlY3Rpb24sIHNDb25maWctPklDRmlsdGVyKTsKKyAgICAgICAgICAgICAgIAorICAgICAgLyogUmVzZXQgdGhlIElDMlBTQyBCaXRzICovCisgICAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSAmPSB+VElNX0NDTVIxX0lDMlBTQzsKKyAKKyAgICAgIC8qIFNlbGVjdCB0aGUgVHJpZ2dlciBzb3VyY2UgKi8KKyAgICAgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJj0gflRJTV9TTUNSX1RTOworICAgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgfD0gVElNX1RTX1RJMkZQMjsKKyAgICAgIAorICAgICAgLyogU2VsZWN0IHRoZSBTbGF2ZSBNb2RlICovICAgICAgCisgICAgICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSICY9IH5USU1fU01DUl9TTVM7CisgICAgICBodGltLT5JbnN0YW5jZS0+U01DUiB8PSBUSU1fU0xBVkVNT0RFX1RSSUdHRVI7CisgICAgfQorICAgIGJyZWFrOworICAgIAorICAgIGRlZmF1bHQ6CisgICAgYnJlYWs7ICAKKyAgfQorICAKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworICAgIAorICBfX0hBTF9VTkxPQ0soaHRpbSk7CisgIAorICByZXR1cm4gSEFMX09LOworfSAKKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorfSAKKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIERNQSBCdXJzdCB0byB0cmFuc2ZlciBEYXRhIGZyb20gdGhlIG1lbW9yeSB0byB0aGUgVElNIHBlcmlwaGVyYWwgIAorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBCdXJzdEJhc2VBZGRyZXNzIFRJTSBCYXNlIGFkZHJlc3MgZnJvbSB3aGVyZSB0aGUgRE1BIHdpbGwgc3RhcnQgdGhlIERhdGEgd3JpdGUKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NSMSAgCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NSMgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9TTUNSCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0RJRVIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfU1IKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfRUdSCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDTVIxCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDTVIyCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDRVIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ05UICAgCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX1BTQyAgIAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9BUlIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfUkNSCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjEKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSMgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ1IzICAKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSNAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9CRFRSCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0RDUgorICAqIEBwYXJhbSAgQnVyc3RSZXF1ZXN0U3JjIFRJTSBETUEgUmVxdWVzdCBzb3VyY2VzCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX1VQREFURTogVElNIHVwZGF0ZSBJbnRlcnJ1cHQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MxOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDEgRE1BIHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDMjogVElNIENhcHR1cmUgQ29tcGFyZSAyIERNQSBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzM6IFRJTSBDYXB0dXJlIENvbXBhcmUgMyBETUEgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0M0OiBUSU0gQ2FwdHVyZSBDb21wYXJlIDQgRE1BIHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NPTTogVElNIENvbW11dGF0aW9uIERNQSBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9UUklHR0VSOiBUSU0gVHJpZ2dlciBETUEgc291cmNlCisgICogQHBhcmFtICBCdXJzdEJ1ZmZlciBUaGUgQnVmZmVyIGFkZHJlc3MuCisgICogQHBhcmFtICBCdXJzdExlbmd0aCBETUEgQnVyc3QgbGVuZ3RoLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIHZhbHVlCisgICogICAgICAgICBiZXR3ZWVuOiBUSU1fRE1BQlVSU1RMRU5HVEhfMVRSQU5TRkVSIGFuZCBUSU1fRE1BQlVSU1RMRU5HVEhfMThUUkFOU0ZFUlMuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0RNQUJ1cnN0X1dyaXRlU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IEJ1cnN0QmFzZUFkZHJlc3MsIHVpbnQzMl90IEJ1cnN0UmVxdWVzdFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgKkJ1cnN0QnVmZmVyLCB1aW50MzJfdCAgQnVyc3RMZW5ndGgpCit7CityZXR1cm4gSEFMX1RJTV9ETUFCdXJzdF9NdWx0aVdyaXRlU3RhcnQoaHRpbSwgQnVyc3RCYXNlQWRkcmVzcywgQnVyc3RSZXF1ZXN0U3JjLCBCdXJzdEJ1ZmZlciwgQnVyc3RMZW5ndGgsICgoQnVyc3RMZW5ndGgpID4+IDhVKSArIDFVKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIERNQSBCdXJzdCB0byB0cmFuc2ZlciBtdWx0aXBsZSBEYXRhIGZyb20gdGhlIG1lbW9yeSB0byB0aGUgVElNIHBlcmlwaGVyYWwKKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEBwYXJhbSAgQnVyc3RCYXNlQWRkcmVzcyBUSU0gQmFzZSBhZGRyZXNzIGZyb20gd2hlcmUgdGhlIERNQSB3aWxsIHN0YXJ0IHRoZSBEYXRhIHdyaXRlCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DUjEKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ1IyCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX1NNQ1IKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfRElFUgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9TUgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9FR1IKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NNUjEKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NNUjIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NFUgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DTlQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfUFNDCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0FSUgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9SQ1IKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSMQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ1IyCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjMKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSNAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9CRFRSCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0RDUgorICAqIEBwYXJhbSAgQnVyc3RSZXF1ZXN0U3JjIFRJTSBETUEgUmVxdWVzdCBzb3VyY2VzCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX1VQREFURTogVElNIHVwZGF0ZSBJbnRlcnJ1cHQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MxOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDEgRE1BIHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDMjogVElNIENhcHR1cmUgQ29tcGFyZSAyIERNQSBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzM6IFRJTSBDYXB0dXJlIENvbXBhcmUgMyBETUEgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0M0OiBUSU0gQ2FwdHVyZSBDb21wYXJlIDQgRE1BIHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NPTTogVElNIENvbW11dGF0aW9uIERNQSBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9UUklHR0VSOiBUSU0gVHJpZ2dlciBETUEgc291cmNlCisgICogQHBhcmFtICBCdXJzdEJ1ZmZlciBUaGUgQnVmZmVyIGFkZHJlc3MuCisgICogQHBhcmFtICBCdXJzdExlbmd0aCBETUEgQnVyc3QgbGVuZ3RoLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIHZhbHVlCisgICogICAgICAgICBiZXR3ZWVuOiBUSU1fRE1BQlVSU1RMRU5HVEhfMVRSQU5TRkVSIGFuZCBUSU1fRE1BQlVSU1RMRU5HVEhfMThUUkFOU0ZFUlMuCisgICogQHBhcmFtICBEYXRhTGVuZ3RoIERhdGEgbGVuZ3RoLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIHZhbHVlCisgICogICAgICAgICBiZXR3ZWVuIDEgYW5kIDB4RkZGRi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRE1BQnVyc3RfTXVsdGlXcml0ZVN0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBCdXJzdEJhc2VBZGRyZXNzLCB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogQnVyc3RCdWZmZXIsIHVpbnQzMl90ICBCdXJzdExlbmd0aCwgIHVpbnQzMl90ICBEYXRhTGVuZ3RoKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQUJVUlNUX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0JBU0UoQnVyc3RCYXNlQWRkcmVzcykpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQV9TT1VSQ0UoQnVyc3RSZXF1ZXN0U3JjKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0xFTkdUSChCdXJzdExlbmd0aCkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQV9EQVRBX0xFTkdUSChEYXRhTGVuZ3RoKSk7CisKKyAgaWYoKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfQlVTWSkpCisgIHsKKyAgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisgIGVsc2UgaWYoKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVBRFkpKQorICB7CisgICAgaWYoKEJ1cnN0QnVmZmVyID09IDBVICkgJiYgKEJ1cnN0TGVuZ3RoID4gMFUpKSAKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisgICAgfQorICB9CisgIHN3aXRjaChCdXJzdFJlcXVlc3RTcmMpCisgIHsKKyAgICBjYXNlIFRJTV9ETUFfVVBEQVRFOgorICAgIHsgIAorICAgICAgLyogU2V0IHRoZSBETUEgUGVyaW9kIGVsYXBzZWQgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9VUERBVEVdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQVBlcmlvZEVsYXBzZWRDcGx0OworICAgICAKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworICAKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0sICh1aW50MzJfdClCdXJzdEJ1ZmZlciwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgRGF0YUxlbmd0aCk7CisgICAgfQorICAgIGJyZWFrOworICAgIGNhc2UgVElNX0RNQV9DQzE6CisgICAgeyAgCisgICAgICAvKiBTZXQgdGhlIERNQSBQZXJpb2QgZWxhcHNlZCBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJDcGx0Q2FsbGJhY2sgPSAgVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworICAKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0sICh1aW50MzJfdClCdXJzdEJ1ZmZlciwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgRGF0YUxlbmd0aCk7CisgICAgfQorICAgIGJyZWFrOworICAgIGNhc2UgVElNX0RNQV9DQzI6CisgICAgeyAgCisgICAgICAvKiBTZXQgdGhlIERNQSBQZXJpb2QgZWxhcHNlZCBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJDcGx0Q2FsbGJhY2sgPSAgVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworICAKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0sICh1aW50MzJfdClCdXJzdEJ1ZmZlciwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgRGF0YUxlbmd0aCk7CisgICAgfQorICAgIGJyZWFrOworICAgIGNhc2UgVElNX0RNQV9DQzM6CisgICAgeyAgCisgICAgICAvKiBTZXQgdGhlIERNQSBQZXJpb2QgZWxhcHNlZCBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJDcGx0Q2FsbGJhY2sgPSAgVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworICAKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10sICh1aW50MzJfdClCdXJzdEJ1ZmZlciwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgRGF0YUxlbmd0aCk7CisgICAgfQorICAgIGJyZWFrOworICAgIGNhc2UgVElNX0RNQV9DQzQ6CisgICAgeyAgCisgICAgICAvKiBTZXQgdGhlIERNQSBQZXJpb2QgZWxhcHNlZCBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJDcGx0Q2FsbGJhY2sgPSAgVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworICAKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0sICh1aW50MzJfdClCdXJzdEJ1ZmZlciwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgRGF0YUxlbmd0aCk7CisgICAgfQorICAgIGJyZWFrOworICAgIGNhc2UgVElNX0RNQV9DT006CisgICAgeyAgCisgICAgICAvKiBTZXQgdGhlIERNQSBQZXJpb2QgZWxhcHNlZCBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NPTU1VVEFUSU9OXS0+WGZlckNwbHRDYWxsYmFjayA9ICBUSU1FeF9ETUFDb21tdXRhdGlvbkNwbHQ7CisgICAgIAorICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DT01NVVRBVElPTl0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKyAgCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DT01NVVRBVElPTl0sICh1aW50MzJfdClCdXJzdEJ1ZmZlciwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgRGF0YUxlbmd0aCk7CisgICAgfQorICAgIGJyZWFrOworICAgIGNhc2UgVElNX0RNQV9UUklHR0VSOgorICAgIHsgIAorICAgICAgLyogU2V0IHRoZSBETUEgUGVyaW9kIGVsYXBzZWQgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9UUklHR0VSXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFUcmlnZ2VyQ3BsdDsKKyAgICAgCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1RSSUdHRVJdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisgIAorICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfVFJJR0dFUl0sICh1aW50MzJfdClCdXJzdEJ1ZmZlciwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgRGF0YUxlbmd0aCk7CisgICAgfQorICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgYnJlYWs7ICAKKyAgfQorICAgLyogY29uZmlndXJlIHRoZSBETUEgQnVyc3QgTW9kZSAqLworICAgaHRpbS0+SW5zdGFuY2UtPkRDUiA9IEJ1cnN0QmFzZUFkZHJlc3MgfCBCdXJzdExlbmd0aDsgIAorICAgCisgICAvKiBFbmFibGUgdGhlIFRJTSBETUEgUmVxdWVzdCAqLworICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgQnVyc3RSZXF1ZXN0U3JjKTsgIAorICAKKyAgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIERNQSBCdXJzdCBtb2RlIAorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBCdXJzdFJlcXVlc3RTcmMgVElNIERNQSBSZXF1ZXN0IHNvdXJjZXMgdG8gZGlzYWJsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9ETUFCdXJzdF9Xcml0ZVN0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IEJ1cnN0UmVxdWVzdFNyYykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfU09VUkNFKEJ1cnN0UmVxdWVzdFNyYykpOworICAKKyAgLyogQWJvcnQgdGhlIERNQSB0cmFuc2ZlciAoYXQgbGVhc3QgZGlzYWJsZSB0aGUgRE1BIGNoYW5uZWwpICovCisgIHN3aXRjaChCdXJzdFJlcXVlc3RTcmMpCisgIHsKKyAgICBjYXNlIFRJTV9ETUFfVVBEQVRFOgorICAgIHsgIAorICAgICAgSEFMX0RNQV9BYm9ydChodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXSk7IAorICAgIH0KKyAgICBicmVhazsKKyAgICBjYXNlIFRJTV9ETUFfQ0MxOgorICAgIHsgIAorICAgICAgSEFMX0RNQV9BYm9ydChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSk7ICAgICAKKyAgICB9CisgICAgYnJlYWs7CisgICAgY2FzZSBUSU1fRE1BX0NDMjoKKyAgICB7ICAKKyAgICAgIEhBTF9ETUFfQWJvcnQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0pOyAgICAgCisgICAgfQorICAgIGJyZWFrOworICAgIGNhc2UgVElNX0RNQV9DQzM6CisgICAgeyAgCisgICAgICBIQUxfRE1BX0Fib3J0KGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdKTsgICAgIAorICAgIH0KKyAgICBicmVhazsKKyAgICBjYXNlIFRJTV9ETUFfQ0M0OgorICAgIHsgIAorICAgICAgSEFMX0RNQV9BYm9ydChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSk7ICAgICAKKyAgICB9CisgICAgYnJlYWs7CisgICAgY2FzZSBUSU1fRE1BX0NPTToKKyAgICB7ICAKKyAgICAgIEhBTF9ETUFfQWJvcnQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NPTU1VVEFUSU9OXSk7ICAgICAKKyAgICB9CisgICAgYnJlYWs7CisgICAgY2FzZSBUSU1fRE1BX1RSSUdHRVI6CisgICAgeyAgCisgICAgICBIQUxfRE1BX0Fib3J0KGh0aW0tPmhkbWFbVElNX0RNQV9JRF9UUklHR0VSXSk7ICAgICAKKyAgICB9CisgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICBicmVhazsgIAorICB9CisgIAorICAvKiBEaXNhYmxlIHRoZSBUSU0gVXBkYXRlIERNQSByZXF1ZXN0ICovCisgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBCdXJzdFJlcXVlc3RTcmMpOworICAgICAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsgIAorfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgRE1BIEJ1cnN0IHRvIHRyYW5zZmVyIERhdGEgZnJvbSB0aGUgVElNIHBlcmlwaGVyYWwgdG8gdGhlIG1lbW9yeSAKKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEBwYXJhbSAgQnVyc3RCYXNlQWRkcmVzcyBUSU0gQmFzZSBhZGRyZXNzIGZyb20gd2hlcmUgdGhlIERNQSB3aWxsIHN0YXJ0cyB0aGUgRGF0YSByZWFkCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DUjEgIAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DUjIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfU01DUgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9ESUVSCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX1NSCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0VHUgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ01SMQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ01SMgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ0VSCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NOVCAgIAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9QU0MgICAKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQVJSCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX1JDUgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ1IxCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSMyAgCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQkRUUgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9EQ1IKKyAgKiBAcGFyYW0gIEJ1cnN0UmVxdWVzdFNyYyBUSU0gRE1BIFJlcXVlc3Qgc291cmNlcworICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9VUERBVEU6IFRJTSB1cGRhdGUgSW50ZXJydXB0IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDMTogVElNIENhcHR1cmUgQ29tcGFyZSAxIERNQSBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzI6IFRJTSBDYXB0dXJlIENvbXBhcmUgMiBETUEgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MzOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDMgRE1BIHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDNDogVElNIENhcHR1cmUgQ29tcGFyZSA0IERNQSBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DT006IFRJTSBDb21tdXRhdGlvbiBETUEgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfVFJJR0dFUjogVElNIFRyaWdnZXIgRE1BIHNvdXJjZQorICAqIEBwYXJhbSAgQnVyc3RCdWZmZXIgVGhlIEJ1ZmZlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgQnVyc3RMZW5ndGggRE1BIEJ1cnN0IGxlbmd0aC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSB2YWx1ZQorICAqICAgICAgICAgYmV0d2VlbjogVElNX0RNQUJVUlNUTEVOR1RIXzFUUkFOU0ZFUiBhbmQgVElNX0RNQUJVUlNUTEVOR1RIXzE4VFJBTlNGRVJTLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9ETUFCdXJzdF9SZWFkU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IEJ1cnN0QmFzZUFkZHJlc3MsIHVpbnQzMl90IEJ1cnN0UmVxdWVzdFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAqQnVyc3RCdWZmZXIsIHVpbnQzMl90ICBCdXJzdExlbmd0aCkKK3sKK3JldHVybiBIQUxfVElNX0RNQUJ1cnN0X011bHRpUmVhZFN0YXJ0KGh0aW0sIEJ1cnN0QmFzZUFkZHJlc3MsIEJ1cnN0UmVxdWVzdFNyYywgQnVyc3RCdWZmZXIsIEJ1cnN0TGVuZ3RoLCAoKEJ1cnN0TGVuZ3RoKSA+PiA4VSkgKyAxVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBETUEgQnVyc3QgdG8gdHJhbnNmZXIgbXVsdGlwbGUgRGF0YSBmcm9tIHRoZSBUSU0gcGVyaXBoZXJhbCB0byB0aGUgbWVtb3J5CisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIEJ1cnN0QmFzZUFkZHJlc3MgVElNIEJhc2UgYWRkcmVzcyBmcm9tIHdoZXJlIHRoZSBETUEgd2lsbCBzdGFydHMgdGhlIERhdGEgcmVhZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ1IxCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NSMgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9TTUNSCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0RJRVIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfU1IKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfRUdSCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDTVIxCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDTVIyCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDRVIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ05UCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX1BTQworICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9BUlIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfUkNSCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjEKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSMgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ1IzCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQkRUUgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9EQ1IKKyAgKiBAcGFyYW0gIEJ1cnN0UmVxdWVzdFNyYyBUSU0gRE1BIFJlcXVlc3Qgc291cmNlcworICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9VUERBVEU6IFRJTSB1cGRhdGUgSW50ZXJydXB0IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDMTogVElNIENhcHR1cmUgQ29tcGFyZSAxIERNQSBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzI6IFRJTSBDYXB0dXJlIENvbXBhcmUgMiBETUEgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MzOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDMgRE1BIHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDNDogVElNIENhcHR1cmUgQ29tcGFyZSA0IERNQSBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DT006IFRJTSBDb21tdXRhdGlvbiBETUEgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfVFJJR0dFUjogVElNIFRyaWdnZXIgRE1BIHNvdXJjZQorICAqIEBwYXJhbSAgQnVyc3RCdWZmZXIgVGhlIEJ1ZmZlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgQnVyc3RMZW5ndGggRE1BIEJ1cnN0IGxlbmd0aC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSB2YWx1ZQorICAqICAgICAgICAgYmV0d2VlbjogVElNX0RNQUJVUlNUTEVOR1RIXzFUUkFOU0ZFUiBhbmQgVElNX0RNQUJVUlNUTEVOR1RIXzE4VFJBTlNGRVJTLgorICAqIEBwYXJhbSAgRGF0YUxlbmd0aCBEYXRhIGxlbmd0aC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSB2YWx1ZQorICAqICAgICAgICAgYmV0d2VlbiAxIGFuZCAweEZGRkYuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0RNQUJ1cnN0X011bHRpUmVhZFN0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBCdXJzdEJhc2VBZGRyZXNzLCB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAqQnVyc3RCdWZmZXIsIHVpbnQzMl90ICBCdXJzdExlbmd0aCwgdWludDMyX3QgIERhdGFMZW5ndGgpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BQlVSU1RfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfQkFTRShCdXJzdEJhc2VBZGRyZXNzKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX1NPVVJDRShCdXJzdFJlcXVlc3RTcmMpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfTEVOR1RIKEJ1cnN0TGVuZ3RoKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0RBVEFfTEVOR1RIKERhdGFMZW5ndGgpKTsKKworICBpZigoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9CVVNZKSkKKyAgeworICAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKyAgZWxzZSBpZigoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRUFEWSkpCisgIHsKKyAgICBpZigoQnVyc3RCdWZmZXIgPT0gMFUgKSAmJiAoQnVyc3RMZW5ndGggPiAwVSkpIAorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKyAgICB9CisgIH0gIAorICBzd2l0Y2goQnVyc3RSZXF1ZXN0U3JjKQorICB7CisgICAgY2FzZSBUSU1fRE1BX1VQREFURToKKyAgICB7ICAKKyAgICAgIC8qIFNldCB0aGUgRE1BIFBlcmlvZCBlbGFwc2VkIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFQZXJpb2RFbGFwc2VkQ3BsdDsKKyAgICAgCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKyAgCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICAgSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLCBEYXRhTGVuZ3RoKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgY2FzZSBUSU1fRE1BX0NDMToKKyAgICB7ICAKKyAgICAgIC8qIFNldCB0aGUgRE1BIFBlcmlvZCBlbGFwc2VkIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckNwbHRDYWxsYmFjayA9ICBUSU1fRE1BQ2FwdHVyZUNwbHQ7CisgICAgIAorICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisgIAorICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLCBEYXRhTGVuZ3RoKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgY2FzZSBUSU1fRE1BX0NDMjoKKyAgICB7ICAKKyAgICAgIC8qIFNldCB0aGUgRE1BIFBlcmlvZCBlbGFwc2VkIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckNwbHRDYWxsYmFjayA9ICBUSU1fRE1BQ2FwdHVyZUNwbHQ7CisgICAgIAorICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisgIAorICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLCBEYXRhTGVuZ3RoKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgY2FzZSBUSU1fRE1BX0NDMzoKKyAgICB7ICAKKyAgICAgIC8qIFNldCB0aGUgRE1BIFBlcmlvZCBlbGFwc2VkIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckNwbHRDYWxsYmFjayA9ICBUSU1fRE1BQ2FwdHVyZUNwbHQ7CisgICAgIAorICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisgIAorICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLCBEYXRhTGVuZ3RoKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgY2FzZSBUSU1fRE1BX0NDNDoKKyAgICB7ICAKKyAgICAgIC8qIFNldCB0aGUgRE1BIFBlcmlvZCBlbGFwc2VkIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckNwbHRDYWxsYmFjayA9ICBUSU1fRE1BQ2FwdHVyZUNwbHQ7CisgICAgIAorICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisgIAorICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLCBEYXRhTGVuZ3RoKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgY2FzZSBUSU1fRE1BX0NPTToKKyAgICB7ICAKKyAgICAgIC8qIFNldCB0aGUgRE1BIFBlcmlvZCBlbGFwc2VkIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ09NTVVUQVRJT05dLT5YZmVyQ3BsdENhbGxiYWNrID0gIFRJTUV4X0RNQUNvbW11dGF0aW9uQ3BsdDsKKyAgICAgCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NPTU1VVEFUSU9OXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworICAKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NPTU1VVEFUSU9OXSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLCBEYXRhTGVuZ3RoKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgY2FzZSBUSU1fRE1BX1RSSUdHRVI6CisgICAgeyAgCisgICAgICAvKiBTZXQgdGhlIERNQSBQZXJpb2QgZWxhcHNlZCBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1RSSUdHRVJdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQVRyaWdnZXJDcGx0OworICAgICAKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfVFJJR0dFUl0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKyAgCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9UUklHR0VSXSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLCBEYXRhTGVuZ3RoKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICBicmVhazsgIAorICB9CisKKyAgLyogY29uZmlndXJlIHRoZSBETUEgQnVyc3QgTW9kZSAqLworICBodGltLT5JbnN0YW5jZS0+RENSID0gQnVyc3RCYXNlQWRkcmVzcyB8IEJ1cnN0TGVuZ3RoOyAgCisgIAorICAvKiBFbmFibGUgdGhlIFRJTSBETUEgUmVxdWVzdCAqLworICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBCdXJzdFJlcXVlc3RTcmMpOworICAKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgdGhlIERNQSBidXJzdCByZWFkaW5nIAorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBCdXJzdFJlcXVlc3RTcmMgVElNIERNQSBSZXF1ZXN0IHNvdXJjZXMgdG8gZGlzYWJsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRE1BQnVyc3RfUmVhZFN0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IEJ1cnN0UmVxdWVzdFNyYykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfU09VUkNFKEJ1cnN0UmVxdWVzdFNyYykpOworICAKKyAgLyogQWJvcnQgdGhlIERNQSB0cmFuc2ZlciAoYXQgbGVhc3QgZGlzYWJsZSB0aGUgRE1BIGNoYW5uZWwpICovCisgIHN3aXRjaChCdXJzdFJlcXVlc3RTcmMpCisgIHsKKyAgICBjYXNlIFRJTV9ETUFfVVBEQVRFOgorICAgIHsgIAorICAgICAgSEFMX0RNQV9BYm9ydChodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXSk7IAorICAgIH0KKyAgICBicmVhazsKKyAgICBjYXNlIFRJTV9ETUFfQ0MxOgorICAgIHsgIAorICAgICAgSEFMX0RNQV9BYm9ydChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSk7ICAgICAKKyAgICB9CisgICAgYnJlYWs7CisgICAgY2FzZSBUSU1fRE1BX0NDMjoKKyAgICB7ICAKKyAgICAgIEhBTF9ETUFfQWJvcnQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0pOyAgICAgCisgICAgfQorICAgIGJyZWFrOworICAgIGNhc2UgVElNX0RNQV9DQzM6CisgICAgeyAgCisgICAgICBIQUxfRE1BX0Fib3J0KGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdKTsgICAgIAorICAgIH0KKyAgICBicmVhazsKKyAgICBjYXNlIFRJTV9ETUFfQ0M0OgorICAgIHsgIAorICAgICAgSEFMX0RNQV9BYm9ydChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSk7ICAgICAKKyAgICB9CisgICAgYnJlYWs7CisgICAgY2FzZSBUSU1fRE1BX0NPTToKKyAgICB7ICAKKyAgICAgIEhBTF9ETUFfQWJvcnQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NPTU1VVEFUSU9OXSk7ICAgICAKKyAgICB9CisgICAgYnJlYWs7CisgICAgY2FzZSBUSU1fRE1BX1RSSUdHRVI6CisgICAgeyAgCisgICAgICBIQUxfRE1BX0Fib3J0KGh0aW0tPmhkbWFbVElNX0RNQV9JRF9UUklHR0VSXSk7ICAgICAKKyAgICB9CisgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICBicmVhazsgIAorICB9CisKKyAgLyogRGlzYWJsZSB0aGUgVElNIFVwZGF0ZSBETUEgcmVxdWVzdCAqLworICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgQnVyc3RSZXF1ZXN0U3JjKTsKKyAgICAgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7ICAKK30KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBhIHNvZnR3YXJlIGV2ZW50CisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIEV2ZW50U291cmNlIHNwZWNpZmllcyB0aGUgZXZlbnQgc291cmNlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9FVkVOVFNPVVJDRV9VUERBVEU6IFRpbWVyIHVwZGF0ZSBFdmVudCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0VWRU5UU09VUkNFX0NDMTogVGltZXIgQ2FwdHVyZSBDb21wYXJlIDEgRXZlbnQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9FVkVOVFNPVVJDRV9DQzI6IFRpbWVyIENhcHR1cmUgQ29tcGFyZSAyIEV2ZW50IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRVZFTlRTT1VSQ0VfQ0MzOiBUaW1lciBDYXB0dXJlIENvbXBhcmUgMyBFdmVudCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0VWRU5UU09VUkNFX0NDNDogVGltZXIgQ2FwdHVyZSBDb21wYXJlIDQgRXZlbnQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9FVkVOVFNPVVJDRV9DT006IFRpbWVyIENPTSBldmVudCBzb3VyY2UgIAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRVZFTlRTT1VSQ0VfVFJJR0dFUjogVGltZXIgVHJpZ2dlciBFdmVudCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0VWRU5UU09VUkNFX0JSRUFLOiBUaW1lciBCcmVhayBldmVudCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0VWRU5UU09VUkNFX0JSRUFLMjogVGltZXIgQnJlYWsyIGV2ZW50IHNvdXJjZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqIEBub3RlIFRJTV9FVkVOVFNPVVJDRV9CUkVBSzIgaXNuJ3QgcmVsZXZhbnQgZm9yIFNUTTMyRjM3eHggYW5kIFNUTTMyRjM4eHggCisgICogICAgICAgZGV2aWNlcworICAqLyAKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9HZW5lcmF0ZUV2ZW50KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBFdmVudFNvdXJjZSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0VWRU5UX1NPVVJDRShFdmVudFNvdXJjZSkpOworICAKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodGltKTsKKyAgCisgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworICAKKyAgLyogU2V0IHRoZSBldmVudCBzb3VyY2VzICovCisgIGh0aW0tPkluc3RhbmNlLT5FR1IgPSBFdmVudFNvdXJjZTsKKyAgCisgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKyAgCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKyAgICAgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7ICAKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBPQ1JlZiBjbGVhciBmZWF0dXJlCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIHNDbGVhcklucHV0Q29uZmlnIHBvaW50ZXIgdG8gYSBUSU1fQ2xlYXJJbnB1dENvbmZpZ1R5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgIGNvbnRhaW5zIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGFuZCBwYXJhbWV0ZXJzIGZvciB0aGUgVElNIHBlcmlwaGVyYWwuIAorICAqIEBwYXJhbSAgQ2hhbm5lbCBzcGVjaWZpZXMgdGhlIFRJTSBDaGFubmVsCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMQorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLyAKK19fd2VhayBIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0NvbmZpZ09DcmVmQ2xlYXIoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9DbGVhcklucHV0Q29uZmlnVHlwZURlZiAqIHNDbGVhcklucHV0Q29uZmlnLCB1aW50MzJfdCBDaGFubmVsKQoreyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0MxX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQ0hBTk5FTFMoQ2hhbm5lbCkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMRUFSSU5QVVRfU09VUkNFKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0U291cmNlKSk7CisgICAKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodGltKTsKKyAgCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworICAKKyAgaWYoc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRTb3VyY2UgPT0gVElNX0NMRUFSSU5QVVRTT1VSQ0VfRVRSKQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMRUFSSU5QVVRfUE9MQVJJVFkoc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRQb2xhcml0eSkpOworICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xFQVJJTlBVVF9QUkVTQ0FMRVIoc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRQcmVzY2FsZXIpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMRUFSSU5QVVRfRklMVEVSKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0RmlsdGVyKSk7CisgICAgCisgICAgVElNX0VUUl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIAorICAgICAgICAgICAgICAgICAgICAgIHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0UHJlc2NhbGVyLAorICAgICAgICAgICAgICAgICAgICAgIHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0UG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRGaWx0ZXIpOworICB9CisgIAorICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6ICAgIAorICAgIHsgICAgICAgIAorICAgICAgaWYoc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRTdGF0ZSAhPSBSRVNFVCkgIAorICAgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBPY3JlZiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDFVICovCisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgfD0gVElNX0NDTVIxX09DMUNFOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBPY3JlZiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDFVICovCisgICAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSAmPSB+VElNX0NDTVIxX09DMUNFOyAgICAgIAorICAgICAgfQorICAgIH0gICAgCisgICAgYnJlYWs7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOiAgICAKKyAgICB7IAorICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsgCisgICAgICBpZihzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dFN0YXRlICE9IFJFU0VUKSAgCisgICAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIE9jcmVmIGNsZWFyIGZlYXR1cmUgZm9yIENoYW5uZWwgMlUgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSB8PSBUSU1fQ0NNUjFfT0MyQ0U7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIE9jcmVmIGNsZWFyIGZlYXR1cmUgZm9yIENoYW5uZWwgMlUgKi8KKyAgICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIxICY9IH5USU1fQ0NNUjFfT0MyQ0U7ICAgICAgCisgICAgICB9CisgICAgfSAKKyAgICBicmVhazsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6ICAgIAorICAgIHsgIAorICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzNfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgICAgIGlmKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0U3RhdGUgIT0gUkVTRVQpICAKKyAgICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgT2NyZWYgY2xlYXIgZmVhdHVyZSBmb3IgQ2hhbm5lbCAzVSAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIyIHw9IFRJTV9DQ01SMl9PQzNDRTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgT2NyZWYgY2xlYXIgZmVhdHVyZSBmb3IgQ2hhbm5lbCAzVSAqLworICAgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjIgJj0gflRJTV9DQ01SMl9PQzNDRTsgICAgICAKKyAgICAgIH0KKyAgICB9IAorICAgIGJyZWFrOworICAgIGNhc2UgVElNX0NIQU5ORUxfNDogICAgCisgICAgeyAgCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDNF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAgICAgaWYoc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRTdGF0ZSAhPSBSRVNFVCkgIAorICAgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBPY3JlZiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDRVICovCisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjIgfD0gVElNX0NDTVIyX09DNENFOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBPY3JlZiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDRVICovCisgICAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMiAmPSB+VElNX0NDTVIyX09DNENFOyAgICAgIAorICAgICAgfQorICAgIH0gCisgICAgYnJlYWs7CisgICAgZGVmYXVsdDogIAorICAgIGJyZWFrOworICB9IAorICAKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworICAKKyAgX19IQUxfVU5MT0NLKGh0aW0pOworICAKKyAgcmV0dXJuIEhBTF9PSzsgIAorfSAgCisKKy8qKgorICAqIEBicmllZiAgIENvbmZpZ3VyZXMgdGhlIGNsb2NrIHNvdXJjZSB0byBiZSB1c2VkCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIHNDbG9ja1NvdXJjZUNvbmZpZyBwb2ludGVyIHRvIGEgVElNX0Nsb2NrQ29uZmlnVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqICAgICAgICAgY29udGFpbnMgdGhlIGNsb2NrIHNvdXJjZSBpbmZvcm1hdGlvbiBmb3IgdGhlIFRJTSBwZXJpcGhlcmFsLiAKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8gCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0NvbmZpZ0Nsb2NrU291cmNlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fQ2xvY2tDb25maWdUeXBlRGVmICogc0Nsb2NrU291cmNlQ29uZmlnKSAgICAKK3sKKyAgdWludDMyX3QgdG1wc21jciA9IDBVOworICAKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodGltKTsKKyAgCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS1NPVVJDRShzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrU291cmNlKSk7CisgIAorICAvKiBSZXNldCB0aGUgU01TLCBUUywgRUNFLCBFVFBTIGFuZCBFVFJGIGJpdHMgKi8KKyAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSOworICB0bXBzbWNyICY9IH4oVElNX1NNQ1JfU01TIHwgVElNX1NNQ1JfVFMpOworICB0bXBzbWNyICY9IH4oVElNX1NNQ1JfRVRGIHwgVElNX1NNQ1JfRVRQUyB8IFRJTV9TTUNSX0VDRSB8IFRJTV9TTUNSX0VUUCk7CisgIGh0aW0tPkluc3RhbmNlLT5TTUNSID0gdG1wc21jcjsKKyAgCisgIHN3aXRjaCAoc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1NvdXJjZSkKKyAgeworICBjYXNlIFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTDoKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7ICAgICAgCisgICAgICAvKiBEaXNhYmxlIHNsYXZlIG1vZGUgdG8gY2xvY2sgdGhlIHByZXNjYWxlciBkaXJlY3RseSB3aXRoIHRoZSBpbnRlcm5hbCBjbG9jayAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJj0gflRJTV9TTUNSX1NNUzsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgIGNhc2UgVElNX0NMT0NLU09VUkNFX0VUUk1PREUxOgorICAgIHsKKyAgICAgIC8qIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBleHRlcm5hbCB0cmlnZ2VyIGlucHV0IG1vZGUgMSAoRVRSRikqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAgICAgCisgICAgICAvKiBDaGVjayBFVFIgaW5wdXQgY29uZGl0aW9uaW5nIHJlbGF0ZWQgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS1BSRVNDQUxFUihzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrUHJlc2NhbGVyKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLUE9MQVJJVFkoc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1BvbGFyaXR5KSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLRklMVEVSKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tGaWx0ZXIpKTsKKyAgICAgIAorICAgICAgLyogQ29uZmlndXJlIHRoZSBFVFIgQ2xvY2sgc291cmNlICovCisgICAgICBUSU1fRVRSX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgCisgICAgICAgICAgICAgICAgICAgICAgICBzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrUHJlc2NhbGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQb2xhcml0eSwgCisgICAgICAgICAgICAgICAgICAgICAgICBzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrRmlsdGVyKTsKKyAgICAgIC8qIEdldCB0aGUgVElNeCBTTUNSIHJlZ2lzdGVyIHZhbHVlICovCisgICAgICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1I7CisgICAgICAvKiBSZXNldCB0aGUgU01TIGFuZCBUUyBCaXRzICovCisgICAgICB0bXBzbWNyICY9IH4oVElNX1NNQ1JfU01TIHwgVElNX1NNQ1JfVFMpOworICAgICAgLyogU2VsZWN0IHRoZSBFeHRlcm5hbCBjbG9jayBtb2RlMSBhbmQgdGhlIEVUUkYgdHJpZ2dlciAqLworICAgICAgdG1wc21jciB8PSAoVElNX1NMQVZFTU9ERV9FWFRFUk5BTDEgfCBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTEpOworICAgICAgLyogV3JpdGUgdG8gVElNeCBTTUNSICovCisgICAgICBodGltLT5JbnN0YW5jZS0+U01DUiA9IHRtcHNtY3I7CisgICAgfQorICAgIGJyZWFrOworICAgIAorICBjYXNlIFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMjoKKyAgICB7CisgICAgICAvKiBDaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgZXh0ZXJuYWwgdHJpZ2dlciBpbnB1dCBtb2RlIDIgKEVUUkYpKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgICAgIAorICAgICAgLyogQ2hlY2sgRVRSIGlucHV0IGNvbmRpdGlvbmluZyByZWxhdGVkIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tQUkVTQ0FMRVIoc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1ByZXNjYWxlcikpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS1BPTEFSSVRZKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQb2xhcml0eSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS0ZJTFRFUihzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrRmlsdGVyKSk7CisgICAgICAKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgRVRSIENsb2NrIHNvdXJjZSAqLworICAgICAgVElNX0VUUl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1ByZXNjYWxlciwgCisgICAgICAgICAgICAgICAgICAgICAgICBzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrUG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICBzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrRmlsdGVyKTsKKyAgICAgIC8qIEVuYWJsZSB0aGUgRXh0ZXJuYWwgY2xvY2sgbW9kZTIgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSIHw9IFRJTV9TTUNSX0VDRTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgIGNhc2UgVElNX0NMT0NLU09VUkNFX1RJMToKKyAgICB7CisgICAgICAvKiBDaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgZXh0ZXJuYWwgY2xvY2sgbW9kZSAxVSAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS1NPVVJDRV9USVhfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgICAgIAorICAgICAgLyogQ2hlY2sgVEkxIGlucHV0IGNvbmRpdGlvbmluZyByZWxhdGVkIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tQT0xBUklUWShzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrUG9sYXJpdHkpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tGSUxURVIoc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja0ZpbHRlcikpOworICAgICAgCisgICAgICBUSU1fVEkxX0NvbmZpZ0lucHV0U3RhZ2UoaHRpbS0+SW5zdGFuY2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQb2xhcml0eSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja0ZpbHRlcik7CisgICAgICBUSU1fSVRSeF9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIFRJTV9DTE9DS1NPVVJDRV9USTEpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBUSU1fQ0xPQ0tTT1VSQ0VfVEkyOgorICAgIHsKKyAgICAgIC8qIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBleHRlcm5hbCBjbG9jayBtb2RlIDEgKEVUUkYpKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tTT1VSQ0VfVElYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgICAgICAKKyAgICAgICAvKiBDaGVjayBUSTIgaW5wdXQgY29uZGl0aW9uaW5nIHJlbGF0ZWQgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS1BPTEFSSVRZKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQb2xhcml0eSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS0ZJTFRFUihzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrRmlsdGVyKSk7CisKKyAgICAgIFRJTV9USTJfQ29uZmlnSW5wdXRTdGFnZShodGltLT5JbnN0YW5jZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1BvbGFyaXR5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrRmlsdGVyKTsKKyAgICAgIFRJTV9JVFJ4X1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgVElNX0NMT0NLU09VUkNFX1RJMik7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIFRJTV9DTE9DS1NPVVJDRV9USTFFRDoKKyAgICB7CisgICAgICAvKiBDaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgZXh0ZXJuYWwgY2xvY2sgbW9kZSAxVSAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS1NPVVJDRV9USVhfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgICAgIAorICAgICAgLyogQ2hlY2sgVEkxIGlucHV0IGNvbmRpdGlvbmluZyByZWxhdGVkIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tQT0xBUklUWShzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrUG9sYXJpdHkpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tGSUxURVIoc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja0ZpbHRlcikpOworCisgICAgICBUSU1fVEkxX0NvbmZpZ0lucHV0U3RhZ2UoaHRpbS0+SW5zdGFuY2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrRmlsdGVyKTsKKyAgICAgIFRJTV9JVFJ4X1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgVElNX0NMT0NLU09VUkNFX1RJMUVEKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgVElNX0NMT0NLU09VUkNFX0lUUjA6CisgICAgeworICAgICAgLyogQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGV4dGVybmFsIGNsb2NrIG1vZGUgMVUgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tTT1VSQ0VfSVRSWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAgICAgCisgICAgICBUSU1fSVRSeF9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIFRJTV9DTE9DS1NPVVJDRV9JVFIwKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgVElNX0NMT0NLU09VUkNFX0lUUjE6CisgICAgeworICAgICAgLyogQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGV4dGVybmFsIGNsb2NrIG1vZGUgMVUgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tTT1VSQ0VfSVRSWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAgICAgCisgICAgICBUSU1fSVRSeF9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIFRJTV9DTE9DS1NPVVJDRV9JVFIxKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgVElNX0NMT0NLU09VUkNFX0lUUjI6CisgICAgeworICAgICAgLyogQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGV4dGVybmFsIGNsb2NrIG1vZGUgMVUgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tTT1VSQ0VfSVRSWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAgICAgCisgICAgICBUSU1fSVRSeF9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIFRJTV9DTE9DS1NPVVJDRV9JVFIyKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgVElNX0NMT0NLU09VUkNFX0lUUjM6CisgICAgeworICAgICAgLyogQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGV4dGVybmFsIGNsb2NrIG1vZGUgMVUgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tTT1VSQ0VfSVRSWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAgICAgCisgICAgICBUSU1fSVRSeF9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIFRJTV9DTE9DS1NPVVJDRV9JVFIzKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgIGRlZmF1bHQ6CisgICAgYnJlYWs7ICAgIAorICB9CisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKyAgCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VsZWN0cyB0aGUgc2lnbmFsIGNvbm5lY3RlZCB0byB0aGUgVEkxIGlucHV0OiBkaXJlY3QgZnJvbSBDSDFfaW5wdXQKKyAgKiAgICAgICAgIG9yIGEgWE9SIGNvbWJpbmF0aW9uIGJldHdlZW4gQ0gxX2lucHV0LCBDSDJfaW5wdXQgJiBDSDNfaW5wdXQKKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIFRJMV9TZWxlY3Rpb246IEluZGljYXRlIHdoZXRoZXIgb3Igbm90IGNoYW5uZWwgMSBpcyBjb25uZWN0ZWQgdG8gdGhlCisgICogICAgICAgICBvdXRwdXQgb2YgYSBYT1IgZ2F0ZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVEkxU0VMRUNUSU9OX0NIMTogVGhlIFRJTXhfQ0gxIHBpbiBpcyBjb25uZWN0ZWQgdG8gVEkxIGlucHV0CisgICogICAgICAgICAgICBAYXJnIFRJTV9USTFTRUxFQ1RJT05fWE9SQ09NQklOQVRJT046IFRoZSBUSU14X0NIMSwgQ0gyIGFuZCBDSDMKKyAgKiAgICAgICAgICAgIHBpbnMgYXJlIGNvbm5lY3RlZCB0byB0aGUgVEkxIGlucHV0IChYT1IgY29tYmluYXRpb24pCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0NvbmZpZ1RJMUlucHV0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBUSTFfU2VsZWN0aW9uKQoreworICB1aW50MzJfdCB0bXBjcjIgPSAwVTsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fWE9SX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7IAorICBhc3NlcnRfcGFyYW0oSVNfVElNX1RJMVNFTEVDVElPTihUSTFfU2VsZWN0aW9uKSk7CisKKyAgLyogR2V0IHRoZSBUSU14IENSMiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjcjIgPSBodGltLT5JbnN0YW5jZS0+Q1IyOworCisgIC8qIFJlc2V0IHRoZSBUSTEgc2VsZWN0aW9uICovCisgIHRtcGNyMiAmPSB+VElNX0NSMl9USTFTOworCisgIC8qIFNldCB0aGUgdGhlIFRJMSBzZWxlY3Rpb24gKi8KKyAgdG1wY3IyIHw9IFRJMV9TZWxlY3Rpb247CisgIAorICAvKiBXcml0ZSB0byBUSU14Q1IyICovCisgIGh0aW0tPkluc3RhbmNlLT5DUjIgPSB0bXBjcjI7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU0gaW4gU2xhdmUgbW9kZQorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgc1NsYXZlQ29uZmlnIHBvaW50ZXIgdG8gYSBUSU1fU2xhdmVDb25maWdUeXBlRGVmIHN0cnVjdHVyZSB0aGF0CisgICogICAgICAgICBjb250YWlucyB0aGUgc2VsZWN0ZWQgdHJpZ2dlciAoaW50ZXJuYWwgdHJpZ2dlciBpbnB1dCwgZmlsdGVyZWQKKyAgKiAgICAgICAgIHRpbWVyIGlucHV0IG9yIGV4dGVybmFsIHRyaWdnZXIgaW5wdXQpIGFuZCB0aGUgKSBhbmQgdGhlIFNsYXZlIAorICAqICAgICAgICAgbW9kZSAoRGlzYWJsZSwgUmVzZXQsIEdhdGVkLCBUcmlnZ2VyLCBFeHRlcm5hbCBjbG9jayBtb2RlIDEpLiAKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fU2xhdmVDb25maWdTeW5jaHJvbml6YXRpb24oVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9TbGF2ZUNvbmZpZ1R5cGVEZWYgKiBzU2xhdmVDb25maWcpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fU0xBVkVfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9TTEFWRV9NT0RFKHNTbGF2ZUNvbmZpZy0+U2xhdmVNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fVFJJR0dFUl9TRUxFQ1RJT04oc1NsYXZlQ29uZmlnLT5JbnB1dFRyaWdnZXIpKTsKKyAgCisgIF9fSEFMX0xPQ0soaHRpbSk7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisgIAorICBUSU1fU2xhdmVUaW1lcl9TZXRDb25maWcoaHRpbSwgc1NsYXZlQ29uZmlnKTsKKyAgCisgIC8qIERpc2FibGUgVHJpZ2dlciBJbnRlcnJ1cHQgKi8KKyAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX1RSSUdHRVIpOworICAKKyAgLyogRGlzYWJsZSBUcmlnZ2VyIERNQSByZXF1ZXN0ICovCisgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX1RSSUdHRVIpOworICAKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworICAgICAKKyAgX19IQUxfVU5MT0NLKGh0aW0pOyAgCisgIAorICByZXR1cm4gSEFMX09LOworfSAKKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU0gaW4gU2xhdmUgbW9kZSBpbiBpbnRlcnJ1cHQgbW9kZQorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgc1NsYXZlQ29uZmlnIHBvaW50ZXIgdG8gYSBUSU1fU2xhdmVDb25maWdUeXBlRGVmIHN0cnVjdHVyZSB0aGF0CisgICogICAgICAgICBjb250YWlucyB0aGUgc2VsZWN0ZWQgdHJpZ2dlciAoaW50ZXJuYWwgdHJpZ2dlciBpbnB1dCwgZmlsdGVyZWQKKyAgKiAgICAgICAgIHRpbWVyIGlucHV0IG9yIGV4dGVybmFsIHRyaWdnZXIgaW5wdXQpIGFuZCB0aGUgKSBhbmQgdGhlIFNsYXZlIAorICAqICAgICAgICAgbW9kZSAoRGlzYWJsZSwgUmVzZXQsIEdhdGVkLCBUcmlnZ2VyLCBFeHRlcm5hbCBjbG9jayBtb2RlIDEpLiAKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fU2xhdmVDb25maWdTeW5jaHJvbml6YXRpb25fSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fU2xhdmVDb25maWdUeXBlRGVmICogc1NsYXZlQ29uZmlnKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX1NMQVZFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fU0xBVkVfTU9ERShzU2xhdmVDb25maWctPlNsYXZlTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX1RSSUdHRVJfU0VMRUNUSU9OKHNTbGF2ZUNvbmZpZy0+SW5wdXRUcmlnZ2VyKSk7CisgIAorICBfX0hBTF9MT0NLKGh0aW0pOworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworICAKKyAgVElNX1NsYXZlVGltZXJfU2V0Q29uZmlnKGh0aW0sIHNTbGF2ZUNvbmZpZyk7CisgIAorICAvKiBFbmFibGUgVHJpZ2dlciBJbnRlcnJ1cHQgKi8KKyAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfVFJJR0dFUik7CisgIAorICAvKiBEaXNhYmxlIFRyaWdnZXIgRE1BIHJlcXVlc3QgKi8KKyAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfVFJJR0dFUik7CisgIAorICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisgICAgIAorICBfX0hBTF9VTkxPQ0soaHRpbSk7ICAKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9IAorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgdGhlIGNhcHR1cmVkIHZhbHVlIGZyb20gQ2FwdHVyZSBDb21wYXJlIHVuaXQKKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogQHJldHZhbCBDYXB0dXJlZCB2YWx1ZQorICAqLwordWludDMyX3QgSEFMX1RJTV9SZWFkQ2FwdHVyZWRWYWx1ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgdWludDMyX3QgdG1wcmVnID0gMFU7CisgIAorICBfX0hBTF9MT0NLKGh0aW0pOworICAKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgICAgIAorICAgICAgLyogUmV0dXJuIHRoZSBjYXB0dXJlIDEgdmFsdWUgKi8KKyAgICAgIHRtcHJlZyA9ICBodGltLT5JbnN0YW5jZS0+Q0NSMTsKKyAgICAgIAorICAgICAgYnJlYWs7CisgICAgfQorICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgICAgICAKKyAgICAgIC8qIFJldHVybiB0aGUgY2FwdHVyZSAyIHZhbHVlICovCisgICAgICB0bXByZWcgPSAgIGh0aW0tPkluc3RhbmNlLT5DQ1IyOworICAgICAgCisgICAgICBicmVhazsKKyAgICB9CisgICAgCisgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzNfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgICAgIAorICAgICAgLyogUmV0dXJuIHRoZSBjYXB0dXJlIDMgdmFsdWUgKi8KKyAgICAgIHRtcHJlZyA9ICAgaHRpbS0+SW5zdGFuY2UtPkNDUjM7CisgICAgICAKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAKKyAgY2FzZSBUSU1fQ0hBTk5FTF80OgorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDNF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAgICAgCisgICAgICAvKiBSZXR1cm4gdGhlIGNhcHR1cmUgNCB2YWx1ZSAqLworICAgICAgdG1wcmVnID0gICBodGltLT5JbnN0YW5jZS0+Q0NSNDsKKyAgICAgIAorICAgICAgYnJlYWs7CisgICAgfQorICAgIAorICBkZWZhdWx0OgorICAgIGJyZWFrOyAgCisgIH0KKyAgICAgCisgIF9fSEFMX1VOTE9DSyhodGltKTsgIAorICByZXR1cm4gdG1wcmVnOworfQorCisvKioKKyAgKiBAfQorICAqLworICAKKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDkgVElNIENhbGxiYWNrcyBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgVElNIENhbGxiYWNrcyBmdW5jdGlvbnMgCisgKgorQHZlcmJhdGltICAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgVElNIENhbGxiYWNrcyBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyBbLi5dICAKKyAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBUSU0gY2FsbGJhY2sgZnVuY3Rpb25zOgorICAgKCspIFRpbWVyIFBlcmlvZCBlbGFwc2VkIGNhbGxiYWNrCisgICAoKykgVGltZXIgT3V0cHV0IENvbXBhcmUgY2FsbGJhY2sKKyAgICgrKSBUaW1lciBJbnB1dCBjYXB0dXJlIGNhbGxiYWNrCisgICAoKykgVGltZXIgVHJpZ2dlciBjYWxsYmFjaworICAgKCspIFRpbWVyIEVycm9yIGNhbGxiYWNrCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUGVyaW9kIGVsYXBzZWQgY2FsbGJhY2sgaW4gbm9uIGJsb2NraW5nIG1vZGUgCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fUGVyaW9kRWxhcHNlZENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgX19IQUxfVElNX1BlcmlvZEVsYXBzZWRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworICAKK30KKy8qKgorICAqIEBicmllZiAgT3V0cHV0IENvbXBhcmUgY2FsbGJhY2sgaW4gbm9uIGJsb2NraW5nIG1vZGUgCisgICogQHBhcmFtICBodGltIFRJTSBPQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fT0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBfX0hBTF9USU1fT0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKy8qKgorICAqIEBicmllZiAgSW5wdXQgQ2FwdHVyZSBjYWxsYmFjayBpbiBub24gYmxvY2tpbmcgbW9kZSAKKyAgKiBAcGFyYW0gIGh0aW0gVElNIElDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9JQ19DYXB0dXJlQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBfX0hBTF9USU1fSUNfQ2FwdHVyZUNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgUFdNIFB1bHNlIGZpbmlzaGVkIGNhbGxiYWNrIGluIG5vbiBibG9ja2luZyBtb2RlIAorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBfX0hBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbGwgVHJpZ2dlciBkZXRlY3Rpb24gY2FsbGJhY2sgaW4gbm9uIGJsb2NraW5nIG1vZGUgCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fVHJpZ2dlckNhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9UcmlnZ2VyQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBUaW1lciBlcnJvciBjYWxsYmFjayBpbiBub24gYmxvY2tpbmcgbW9kZSAKKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9FcnJvckNhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9FcnJvckNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEwIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zIAorICogIEBicmllZiAgIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zIAorICoKK0B2ZXJiYXRpbSAgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwZXJtaXQgdG8gZ2V0IGluIHJ1bi10aW1lIHRoZSBzdGF0dXMgb2YgdGhlIHBlcmlwaGVyYWwgCisgICAgYW5kIHRoZSBkYXRhIGZsb3cuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBUSU0gQmFzZSBzdGF0ZQorICAqIEBwYXJhbSAgaHRpbSBUSU0gQmFzZSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLworSEFMX1RJTV9TdGF0ZVR5cGVEZWYgSEFMX1RJTV9CYXNlX0dldFN0YXRlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICByZXR1cm4gaHRpbS0+U3RhdGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBUSU0gT0Mgc3RhdGUKKyAgKiBAcGFyYW0gIGh0aW0gVElNIE91cHV0IENvbXBhcmUgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1fT0NfR2V0U3RhdGUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIHJldHVybiBodGltLT5TdGF0ZTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFRJTSBQV00gc3RhdGUKKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNX1BXTV9HZXRTdGF0ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgcmV0dXJuIGh0aW0tPlN0YXRlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgVElNIElucHV0IENhcHR1cmUgc3RhdGUKKyAgKiBAcGFyYW0gIGh0aW0gVElNIElDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNX0lDX0dldFN0YXRlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICByZXR1cm4gaHRpbS0+U3RhdGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBUSU0gT25lIFB1bHNlIE1vZGUgc3RhdGUKKyAgKiBAcGFyYW0gIGh0aW0gVElNIE9QTSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLworSEFMX1RJTV9TdGF0ZVR5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9HZXRTdGF0ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgcmV0dXJuIGh0aW0tPlN0YXRlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgVElNIEVuY29kZXIgTW9kZSBzdGF0ZQorICAqIEBwYXJhbSAgaHRpbSBUSU0gRW5jb2RlciBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLworSEFMX1RJTV9TdGF0ZVR5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX0dldFN0YXRlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICByZXR1cm4gaHRpbS0+U3RhdGU7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovICAKKworLyoqIEBhZGR0b2dyb3VwIFRJTV9Qcml2YXRlX0Z1bmN0aW9ucyBUSU1fUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLyAKKworLyoqCisgICogQGJyaWVmICBUSU0gRE1BIGVycm9yIGNhbGxiYWNrIAorICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIFRJTV9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVElNX0hhbmRsZVR5cGVEZWYqIGh0aW0gPSAoIFRJTV9IYW5kbGVUeXBlRGVmKiApKChETUFfSGFuZGxlVHlwZURlZiogKWhkbWEpLT5QYXJlbnQ7CisgIAorICBodGltLT5TdGF0ZT0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKyAgIAorICBIQUxfVElNX0Vycm9yQ2FsbGJhY2soaHRpbSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVElNIERNQSBEZWxheSBQdWxzZSBjb21wbGV0ZSBjYWxsYmFjay4gCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgVElNX0RNQURlbGF5UHVsc2VDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBUSU1fSGFuZGxlVHlwZURlZiogaHRpbSA9ICggVElNX0hhbmRsZVR5cGVEZWYqICkoKERNQV9IYW5kbGVUeXBlRGVmKiApaGRtYSktPlBhcmVudDsKKyAgCisgIGh0aW0tPlN0YXRlPSBIQUxfVElNX1NUQVRFX1JFQURZOyAKKyAgCisgIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdKQorICB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMTsKKyAgfQorICBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdKQorICB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMjsKKyAgfQorICBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdKQorICB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMzsKKyAgfQorICBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdKQorICB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfNDsKKyAgfQorCisgIEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayhodGltKTsKKworICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF9DTEVBUkVEOworfQorLyoqCisgICogQGJyaWVmICBUSU0gRE1BIENhcHR1cmUgY29tcGxldGUgY2FsbGJhY2suIAorICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIFRJTV9ETUFDYXB0dXJlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVElNX0hhbmRsZVR5cGVEZWYqIGh0aW0gPSAoIFRJTV9IYW5kbGVUeXBlRGVmKiApKChETUFfSGFuZGxlVHlwZURlZiogKWhkbWEpLT5QYXJlbnQ7CisgIAorICBodGltLT5TdGF0ZT0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKyAgCisgIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdKQorICB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMTsKKyAgfQorICBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdKQorICB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMjsKKyAgfQorICBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdKQorICB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMzsKKyAgfQorICBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdKQorICB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfNDsKKyAgfQorICAKKyAgSEFMX1RJTV9JQ19DYXB0dXJlQ2FsbGJhY2soaHRpbSk7IAorICAKKyAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfQ0xFQVJFRDsKK30KKworLyoqCisgICogQGJyaWVmICBUSU0gRE1BIFBlcmlvZCBFbGFwc2UgY29tcGxldGUgY2FsbGJhY2suIAorICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBUSU1fRE1BUGVyaW9kRWxhcHNlZENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFRJTV9IYW5kbGVUeXBlRGVmKiBodGltID0gKCBUSU1fSGFuZGxlVHlwZURlZiogKSgoRE1BX0hhbmRsZVR5cGVEZWYqICloZG1hKS0+UGFyZW50OworICAKKyAgaHRpbS0+U3RhdGU9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisgIAorICBIQUxfVElNX1BlcmlvZEVsYXBzZWRDYWxsYmFjayhodGltKTsKK30KKworLyoqCisgICogQGJyaWVmICBUSU0gRE1BIFRyaWdnZXIgY2FsbGJhY2suIAorICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBUSU1fRE1BVHJpZ2dlckNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFRJTV9IYW5kbGVUeXBlRGVmKiBodGltID0gKCBUSU1fSGFuZGxlVHlwZURlZiogKSgoRE1BX0hhbmRsZVR5cGVEZWYqICloZG1hKS0+UGFyZW50OyAgCisgIAorICBodGltLT5TdGF0ZT0gSEFMX1RJTV9TVEFURV9SRUFEWTsgCisgIAorICBIQUxfVElNX1RyaWdnZXJDYWxsYmFjayhodGltKTsKK30KKworLyoqCisgICogQGJyaWVmICBUaW1lIEJhc2UgY29uZmlndXJhdGlvbgorICAqIEBwYXJhbSAgVElNeCBUSU0gcGVyaWhlcmFsCisgICogQHBhcmFtICBTdHJ1Y3R1cmUgVElNIEJhc2UgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgVElNX0Jhc2VfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBUSU1fQmFzZV9Jbml0VHlwZURlZiAqU3RydWN0dXJlKQoreworICB1aW50MzJfdCB0bXBjcjEgPSAwVTsKKyAgdG1wY3IxID0gVElNeC0+Q1IxOworICAKKyAgLyogU2V0IFRJTSBUaW1lIEJhc2UgVW5pdCBwYXJhbWV0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmIChJU19USU1fQ09VTlRFUl9NT0RFX1NFTEVDVF9JTlNUQU5DRShUSU14KSkKKyAgeworICAgIC8qIFNlbGVjdCB0aGUgQ291bnRlciBNb2RlICovCisgICAgdG1wY3IxICY9IH4oVElNX0NSMV9ESVIgfCBUSU1fQ1IxX0NNUyk7CisgICAgdG1wY3IxIHw9IFN0cnVjdHVyZS0+Q291bnRlck1vZGU7CisgIH0KKyAKKyAgaWYoSVNfVElNX0NMT0NLX0RJVklTSU9OX0lOU1RBTkNFKFRJTXgpKQorICB7CisgICAgLyogU2V0IHRoZSBjbG9jayBkaXZpc2lvbiAqLworICAgIHRtcGNyMSAmPSB+VElNX0NSMV9DS0Q7CisgICAgdG1wY3IxIHw9ICh1aW50MzJfdClTdHJ1Y3R1cmUtPkNsb2NrRGl2aXNpb247CisgIH0KKworICAvKiBTZXQgdGhlIGF1dG8tcmVsb2FkIHByZWxvYWQgKi8KKyAgTU9ESUZZX1JFRyh0bXBjcjEsIFRJTV9DUjFfQVJQRSwgU3RydWN0dXJlLT5BdXRvUmVsb2FkUHJlbG9hZCk7CisKKyAgVElNeC0+Q1IxID0gdG1wY3IxOworCisgIC8qIFNldCB0aGUgQXV0b3JlbG9hZCB2YWx1ZSAqLworICBUSU14LT5BUlIgPSAodWludDMyX3QpU3RydWN0dXJlLT5QZXJpb2QgOworIAorICAvKiBTZXQgdGhlIFByZXNjYWxlciB2YWx1ZSAqLworICBUSU14LT5QU0MgPSAodWludDMyX3QpU3RydWN0dXJlLT5QcmVzY2FsZXI7CisgICAgCisgIGlmIChJU19USU1fUkVQRVRJVElPTl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpKSAgCisgIHsKKyAgICAvKiBTZXQgdGhlIFJlcGV0aXRpb24gQ291bnRlciB2YWx1ZSAqLworICAgIFRJTXgtPlJDUiA9IFN0cnVjdHVyZS0+UmVwZXRpdGlvbkNvdW50ZXI7CisgIH0KKworICAvKiBHZW5lcmF0ZSBhbiB1cGRhdGUgZXZlbnQgdG8gcmVsb2FkIHRoZSBQcmVzY2FsZXIgCisgICAgIGFuZCB0aGUgcmVwZXRpdGlvbiBjb3VudGVyKG9ubHkgZm9yIFRJTTEgYW5kIFRJTTgpIHZhbHVlIGltbWVkaWF0bHkgKi8KKyAgVElNeC0+RUdSID0gVElNX0VHUl9VRzsKK30KKworLyoqCisgICogQGJyaWVmICBUaW1lIE91cHV0IENvbXBhcmUgMSBjb25maWd1cmF0aW9uCisgICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwKKyAgKiBAcGFyYW0gIE9DX0NvbmZpZyBUaGUgb3VwdXQgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgVElNX09DMV9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIFRJTV9PQ19Jbml0VHlwZURlZiAqT0NfQ29uZmlnKQoreworICB1aW50MzJfdCB0bXBjY21yeCA9IDBVOworICB1aW50MzJfdCB0bXBjY2VyID0gMFU7CisgIHVpbnQzMl90IHRtcGNyMiA9IDBVOyAKKworICAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAxOiBSZXNldCB0aGUgQ0MxRSBCaXQgKi8KKyAgVElNeC0+Q0NFUiAmPSB+VElNX0NDRVJfQ0MxRTsKKyAgCisgIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjZXIgPSBUSU14LT5DQ0VSOworICAvKiBHZXQgdGhlIFRJTXggQ1IyIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNyMiA9ICBUSU14LT5DUjI7IAorICAKKyAgLyogR2V0IHRoZSBUSU14IENDTVIxIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjbXJ4ID0gVElNeC0+Q0NNUjE7CisKKyAgLyogUmVzZXQgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgQml0cyAqLworICB0bXBjY21yeCAmPSB+VElNX0NDTVIxX09DMU07CisgIHRtcGNjbXJ4ICY9IH5USU1fQ0NNUjFfQ0MxUzsKKyAgLyogU2VsZWN0IHRoZSBPdXRwdXQgQ29tcGFyZSBNb2RlICovCisgIHRtcGNjbXJ4IHw9IE9DX0NvbmZpZy0+T0NNb2RlOworICAKKyAgLyogUmVzZXQgdGhlIE91dHB1dCBQb2xhcml0eSBsZXZlbCAqLworICB0bXBjY2VyICY9IH5USU1fQ0NFUl9DQzFQOworICAvKiBTZXQgdGhlIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5ICovCisgIHRtcGNjZXIgfD0gT0NfQ29uZmlnLT5PQ1BvbGFyaXR5OworCisgIGlmKElTX1RJTV9DQ1hOX0lOU1RBTkNFKFRJTXgsIFRJTV9DSEFOTkVMXzEpKQorICB7CisgICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19USU1fT0NOX1BPTEFSSVRZKE9DX0NvbmZpZy0+T0NOUG9sYXJpdHkpKTsKKyAKKyAgICAvKiBSZXNldCB0aGUgT3V0cHV0IE4gUG9sYXJpdHkgbGV2ZWwgKi8KKyAgICB0bXBjY2VyICY9IH5USU1fQ0NFUl9DQzFOUDsKKyAgICAvKiBTZXQgdGhlIE91dHB1dCBOIFBvbGFyaXR5ICovCisgICAgdG1wY2NlciB8PSBPQ19Db25maWctPk9DTlBvbGFyaXR5OworICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgTiBTdGF0ZSAqLworICAgIHRtcGNjZXIgJj0gflRJTV9DQ0VSX0NDMU5FOworICB9CisgIAorICBpZihJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkpCisgIHsKKyAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ05JRExFX1NUQVRFKE9DX0NvbmZpZy0+T0NOSWRsZVN0YXRlKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ0lETEVfU1RBVEUoT0NfQ29uZmlnLT5PQ0lkbGVTdGF0ZSkpOworCisgICAgLyogUmVzZXQgdGhlIE91dHB1dCBDb21wYXJlIGFuZCBPdXRwdXQgQ29tcGFyZSBOIElETEUgU3RhdGUgKi8KKyAgICB0bXBjcjIgJj0gflRJTV9DUjJfT0lTMTsKKyAgICB0bXBjcjIgJj0gflRJTV9DUjJfT0lTMU47CisgICAgLyogU2V0IHRoZSBPdXRwdXQgSWRsZSBzdGF0ZSAqLworICAgIHRtcGNyMiB8PSBPQ19Db25maWctPk9DSWRsZVN0YXRlOworICAgIC8qIFNldCB0aGUgT3V0cHV0IE4gSWRsZSBzdGF0ZSAqLworICAgIHRtcGNyMiB8PSBPQ19Db25maWctPk9DTklkbGVTdGF0ZTsKKyAgfQorICAvKiBXcml0ZSB0byBUSU14IENSMiAqLworICBUSU14LT5DUjIgPSB0bXBjcjI7CisgIAorICAvKiBXcml0ZSB0byBUSU14IENDTVIxICovCisgIFRJTXgtPkNDTVIxID0gdG1wY2Ntcng7CisgIAorICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSAqLworICBUSU14LT5DQ1IxID0gT0NfQ29uZmlnLT5QdWxzZTsKKyAgCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiAqLworICBUSU14LT5DQ0VSID0gdG1wY2NlcjsgIAorfSAKKworLyoqCisgICogQGJyaWVmICBUaW1lIE91cHV0IENvbXBhcmUgMiBjb25maWd1cmF0aW9uCisgICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwKKyAgKiBAcGFyYW0gIE9DX0NvbmZpZyBUaGUgb3VwdXQgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgVElNX09DMl9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIFRJTV9PQ19Jbml0VHlwZURlZiAqT0NfQ29uZmlnKQoreworICB1aW50MzJfdCB0bXBjY21yeCA9IDBVOworICB1aW50MzJfdCB0bXBjY2VyID0gMFU7CisgIHVpbnQzMl90IHRtcGNyMiA9IDBVOyAKKworICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDI6IFJlc2V0IHRoZSBDQzJFIEJpdCAqLworICBUSU14LT5DQ0VSICY9IH5USU1fQ0NFUl9DQzJFOworICAKKyAgLyogR2V0IHRoZSBUSU14IENDRVIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NlciA9IFRJTXgtPkNDRVI7CisgIC8qIEdldCB0aGUgVElNeCBDUjIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY3IyID0gIFRJTXgtPkNSMjsgCisgIAorICAvKiBHZXQgdGhlIFRJTXggQ0NNUjEgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NtcnggPSBUSU14LT5DQ01SMTsKKworICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgbW9kZSBhbmQgQ2FwdHVyZS9Db21wYXJlIHNlbGVjdGlvbiBCaXRzICovCisgIHRtcGNjbXJ4ICY9IH5USU1fQ0NNUjFfT0MyTTsKKyAgdG1wY2NtcnggJj0gflRJTV9DQ01SMV9DQzJTOworICAKKyAgLyogU2VsZWN0IHRoZSBPdXRwdXQgQ29tcGFyZSBNb2RlICovCisgIHRtcGNjbXJ4IHw9IChPQ19Db25maWctPk9DTW9kZSA8PCA4VSk7CisgIAorICAvKiBSZXNldCB0aGUgT3V0cHV0IFBvbGFyaXR5IGxldmVsICovCisgIHRtcGNjZXIgJj0gflRJTV9DQ0VSX0NDMlA7CisgIC8qIFNldCB0aGUgT3V0cHV0IENvbXBhcmUgUG9sYXJpdHkgKi8KKyAgdG1wY2NlciB8PSAoT0NfQ29uZmlnLT5PQ1BvbGFyaXR5IDw8IDRVKTsKKworICBpZihJU19USU1fQ0NYTl9JTlNUQU5DRShUSU14LCBUSU1fQ0hBTk5FTF8yKSkKKyAgeyAgIAorICAgIGFzc2VydF9wYXJhbShJU19USU1fT0NOX1BPTEFSSVRZKE9DX0NvbmZpZy0+T0NOUG9sYXJpdHkpKTsKKworICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgTiBQb2xhcml0eSBsZXZlbCAqLworICAgIHRtcGNjZXIgJj0gflRJTV9DQ0VSX0NDMk5QOworICAgIC8qIFNldCB0aGUgT3V0cHV0IE4gUG9sYXJpdHkgKi8KKyAgICB0bXBjY2VyIHw9IChPQ19Db25maWctPk9DTlBvbGFyaXR5IDw8IDRVKTsKKyAgICAvKiBSZXNldCB0aGUgT3V0cHV0IE4gU3RhdGUgKi8KKyAgICB0bXBjY2VyICY9IH5USU1fQ0NFUl9DQzJORTsKKyAgICAKKyAgfQorCisgIGlmKElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSkKKyAgeworICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DTklETEVfU1RBVEUoT0NfQ29uZmlnLT5PQ05JZGxlU3RhdGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DSURMRV9TVEFURShPQ19Db25maWctPk9DSWRsZVN0YXRlKSk7CisKKyAgICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgSURMRSBTdGF0ZSAqLworICAgIHRtcGNyMiAmPSB+VElNX0NSMl9PSVMyOworI2lmIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisjZWxzZQorICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBOIElETEUgU3RhdGUgKi8KKyAgICB0bXBjcjIgJj0gflRJTV9DUjJfT0lTMk47CisjZW5kaWYKKyAgICAvKiBTZXQgdGhlIE91dHB1dCBJZGxlIHN0YXRlICovCisgICAgdG1wY3IyIHw9IChPQ19Db25maWctPk9DSWRsZVN0YXRlIDw8IDJVKTsKKyAgICAvKiBTZXQgdGhlIE91dHB1dCBOIElkbGUgc3RhdGUgKi8KKyAgICB0bXBjcjIgfD0gKE9DX0NvbmZpZy0+T0NOSWRsZVN0YXRlIDw8IDJVKTsKKyAgfQorCisgIC8qIFdyaXRlIHRvIFRJTXggQ1IyICovCisgIFRJTXgtPkNSMiA9IHRtcGNyMjsKKyAgCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgKi8KKyAgVElNeC0+Q0NNUjEgPSB0bXBjY21yeDsKKyAgCisgIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyIHZhbHVlICovCisgIFRJTXgtPkNDUjIgPSBPQ19Db25maWctPlB1bHNlOworICAKKyAgLyogV3JpdGUgdG8gVElNeCBDQ0VSICovCisgIFRJTXgtPkNDRVIgPSB0bXBjY2VyOyAgCit9CisKKy8qKgorICAqIEBicmllZiAgVGltZSBPdXB1dCBDb21wYXJlIDMgY29uZmlndXJhdGlvbgorICAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsCisgICogQHBhcmFtICBPQ19Db25maWcgVGhlIG91cHV0IGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIFRJTV9PQzNfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBUSU1fT0NfSW5pdFR5cGVEZWYgKk9DX0NvbmZpZykKK3sKKyAgdWludDMyX3QgdG1wY2NtcnggPSAwVTsKKyAgdWludDMyX3QgdG1wY2NlciA9IDBVOworICB1aW50MzJfdCB0bXBjcjIgPSAwVTsgCisKKyAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAzOiBSZXNldCB0aGUgQ0MyRSBCaXQgKi8KKyAgVElNeC0+Q0NFUiAmPSB+VElNX0NDRVJfQ0MzRTsKKyAgCisgIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjZXIgPSBUSU14LT5DQ0VSOworICAvKiBHZXQgdGhlIFRJTXggQ1IyIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNyMiA9ICBUSU14LT5DUjI7IAorICAKKyAgLyogR2V0IHRoZSBUSU14IENDTVIyIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjbXJ4ID0gVElNeC0+Q0NNUjI7CisKKyAgLyogUmVzZXQgdGhlIE91dHB1dCBDb21wYXJlIG1vZGUgYW5kIENhcHR1cmUvQ29tcGFyZSBzZWxlY3Rpb24gQml0cyAqLworICB0bXBjY21yeCAmPSB+VElNX0NDTVIyX09DM007CisgIHRtcGNjbXJ4ICY9IH5USU1fQ0NNUjJfQ0MzUzsgIAorICAvKiBTZWxlY3QgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8KKyAgdG1wY2NtcnggfD0gT0NfQ29uZmlnLT5PQ01vZGU7CisgIAorICAvKiBSZXNldCB0aGUgT3V0cHV0IFBvbGFyaXR5IGxldmVsICovCisgIHRtcGNjZXIgJj0gflRJTV9DQ0VSX0NDM1A7CisgIC8qIFNldCB0aGUgT3V0cHV0IENvbXBhcmUgUG9sYXJpdHkgKi8KKyAgdG1wY2NlciB8PSAoT0NfQ29uZmlnLT5PQ1BvbGFyaXR5IDw8IDhVKTsKKworICBpZihJU19USU1fQ0NYTl9JTlNUQU5DRShUSU14LCBUSU1fQ0hBTk5FTF8zKSkKKyAgeyAgIAorICAgIGFzc2VydF9wYXJhbShJU19USU1fT0NOX1BPTEFSSVRZKE9DX0NvbmZpZy0+T0NOUG9sYXJpdHkpKTsKKworICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgTiBQb2xhcml0eSBsZXZlbCAqLworICAgIHRtcGNjZXIgJj0gflRJTV9DQ0VSX0NDM05QOworICAgIC8qIFNldCB0aGUgT3V0cHV0IE4gUG9sYXJpdHkgKi8KKyAgICB0bXBjY2VyIHw9IChPQ19Db25maWctPk9DTlBvbGFyaXR5IDw8IDhVKTsKKyAgICAvKiBSZXNldCB0aGUgT3V0cHV0IE4gU3RhdGUgKi8KKyAgICB0bXBjY2VyICY9IH5USU1fQ0NFUl9DQzNORTsKKyAgfQorICAKKyAgaWYoSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpKQorICB7CisgICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19USU1fT0NOSURMRV9TVEFURShPQ19Db25maWctPk9DTklkbGVTdGF0ZSkpOworICAgIGFzc2VydF9wYXJhbShJU19USU1fT0NJRExFX1NUQVRFKE9DX0NvbmZpZy0+T0NJZGxlU3RhdGUpKTsKKworI2lmIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisjZWxzZQorICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBhbmQgT3V0cHV0IENvbXBhcmUgTiBJRExFIFN0YXRlICovCisgICAgdG1wY3IyICY9IH5USU1fQ1IyX09JUzM7CisgICAgdG1wY3IyICY9IH5USU1fQ1IyX09JUzNOOworI2VuZGlmCisgICAgLyogU2V0IHRoZSBPdXRwdXQgSWRsZSBzdGF0ZSAqLworICAgIHRtcGNyMiB8PSAoT0NfQ29uZmlnLT5PQ0lkbGVTdGF0ZSA8PCA0VSk7CisgICAgLyogU2V0IHRoZSBPdXRwdXQgTiBJZGxlIHN0YXRlICovCisgICAgdG1wY3IyIHw9IChPQ19Db25maWctPk9DTklkbGVTdGF0ZSA8PCA0VSk7CisgIH0KKworICAvKiBXcml0ZSB0byBUSU14IENSMiAqLworICBUSU14LT5DUjIgPSB0bXBjcjI7CisgIAorICAvKiBXcml0ZSB0byBUSU14IENDTVIyICovCisgIFRJTXgtPkNDTVIyID0gdG1wY2Ntcng7CisgIAorICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSAqLworICBUSU14LT5DQ1IzID0gT0NfQ29uZmlnLT5QdWxzZTsKKyAgCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiAqLworICBUSU14LT5DQ0VSID0gdG1wY2NlcjsgIAorfQorCisvKioKKyAgKiBAYnJpZWYgIFRpbWUgT3VwdXQgQ29tcGFyZSA0IGNvbmZpZ3VyYXRpb24KKyAgKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgT0NfQ29uZmlnIFRoZSBvdXB1dCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBUSU1fT0M0X1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgVElNX09DX0luaXRUeXBlRGVmICpPQ19Db25maWcpCit7CisgIHVpbnQzMl90IHRtcGNjbXJ4ID0gMFU7CisgIHVpbnQzMl90IHRtcGNjZXIgPSAwVTsKKyAgdWludDMyX3QgdG1wY3IyID0gMFU7IAorCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgNDogUmVzZXQgdGhlIENDNEUgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gflRJTV9DQ0VSX0NDNEU7CisgIAorICAvKiBHZXQgdGhlIFRJTXggQ0NFUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY2VyID0gVElNeC0+Q0NFUjsKKyAgLyogR2V0IHRoZSBUSU14IENSMiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjcjIgPSAgVElNeC0+Q1IyOyAKKyAgCisgIC8qIEdldCB0aGUgVElNeCBDQ01SMiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY21yeCA9IFRJTXgtPkNDTVIyOworCisgIC8qIFJlc2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBtb2RlIGFuZCBDYXB0dXJlL0NvbXBhcmUgc2VsZWN0aW9uIEJpdHMgKi8KKyAgdG1wY2NtcnggJj0gflRJTV9DQ01SMl9PQzRNOworICB0bXBjY21yeCAmPSB+VElNX0NDTVIyX0NDNFM7CisgIAorICAvKiBTZWxlY3QgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8KKyAgdG1wY2NtcnggfD0gKE9DX0NvbmZpZy0+T0NNb2RlIDw8IDhVKTsKKyAgCisgIC8qIFJlc2V0IHRoZSBPdXRwdXQgUG9sYXJpdHkgbGV2ZWwgKi8KKyAgdG1wY2NlciAmPSB+VElNX0NDRVJfQ0M0UDsKKyAgLyogU2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBQb2xhcml0eSAqLworICB0bXBjY2VyIHw9IChPQ19Db25maWctPk9DUG9sYXJpdHkgPDwgMTJVKTsKKworICBpZihJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DSURMRV9TVEFURShPQ19Db25maWctPk9DSWRsZVN0YXRlKSk7CisKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorI2Vsc2UKKyAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBJRExFIFN0YXRlICovCisgICAgdG1wY3IyICY9IH5USU1fQ1IyX09JUzQ7CisjZW5kaWYKKyAgICAvKiBTZXQgdGhlIE91dHB1dCBJZGxlIHN0YXRlICovCisgICAgdG1wY3IyIHw9IChPQ19Db25maWctPk9DSWRsZVN0YXRlIDw8IDZVKTsKKyAgfQorCisgIC8qIFdyaXRlIHRvIFRJTXggQ1IyICovCisgIFRJTXgtPkNSMiA9IHRtcGNyMjsKKyAgCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjIgKi8KKyAgVElNeC0+Q0NNUjIgPSB0bXBjY21yeDsKKyAgCisgIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyIHZhbHVlICovCisgIFRJTXgtPkNDUjQgPSBPQ19Db25maWctPlB1bHNlOworICAKKyAgLyogV3JpdGUgdG8gVElNeCBDQ0VSICovCisgIFRJTXgtPkNDRVIgPSB0bXBjY2VyOyAgCit9CisKK3N0YXRpYyB2b2lkIFRJTV9TbGF2ZVRpbWVyX1NldENvbmZpZyhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TbGF2ZUNvbmZpZ1R5cGVEZWYgKiBzU2xhdmVDb25maWcpCit7CisgIHVpbnQzMl90IHRtcHNtY3IgPSAwVTsKKyAgdWludDMyX3QgdG1wY2NtcjEgPSAwVTsKKyAgdWludDMyX3QgdG1wY2NlciA9IDBVOworCisgIC8qIEdldCB0aGUgVElNeCBTTUNSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUjsKKworICAvKiBSZXNldCB0aGUgVHJpZ2dlciBTZWxlY3Rpb24gQml0cyAqLworICB0bXBzbWNyICY9IH5USU1fU01DUl9UUzsKKyAgLyogU2V0IHRoZSBJbnB1dCBUcmlnZ2VyIHNvdXJjZSAqLworICB0bXBzbWNyIHw9IHNTbGF2ZUNvbmZpZy0+SW5wdXRUcmlnZ2VyOworCisgIC8qIFJlc2V0IHRoZSBzbGF2ZSBtb2RlIEJpdHMgKi8KKyAgdG1wc21jciAmPSB+VElNX1NNQ1JfU01TOworICAvKiBTZXQgdGhlIHNsYXZlIG1vZGUgKi8KKyAgdG1wc21jciB8PSBzU2xhdmVDb25maWctPlNsYXZlTW9kZTsKKworICAvKiBXcml0ZSB0byBUSU14IFNNQ1IgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgPSB0bXBzbWNyOworIAorICAvKiBDb25maWd1cmUgdGhlIHRyaWdnZXIgcHJlc2NhbGVyLCBmaWx0ZXIsIGFuZCBwb2xhcml0eSAqLworICBzd2l0Y2ggKHNTbGF2ZUNvbmZpZy0+SW5wdXRUcmlnZ2VyKQorICB7CisgIGNhc2UgVElNX1RTX0VUUkY6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fVFJJR0dFUlBSRVNDQUxFUihzU2xhdmVDb25maWctPlRyaWdnZXJQcmVzY2FsZXIpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fVFJJR0dFUlBPTEFSSVRZKHNTbGF2ZUNvbmZpZy0+VHJpZ2dlclBvbGFyaXR5KSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX1RSSUdHRVJGSUxURVIoc1NsYXZlQ29uZmlnLT5UcmlnZ2VyRmlsdGVyKSk7CisgICAgICAvKiBDb25maWd1cmUgdGhlIEVUUiBUcmlnZ2VyIHNvdXJjZSAqLworICAgICAgVElNX0VUUl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgc1NsYXZlQ29uZmlnLT5UcmlnZ2VyUHJlc2NhbGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNTbGF2ZUNvbmZpZy0+VHJpZ2dlclBvbGFyaXR5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNTbGF2ZUNvbmZpZy0+VHJpZ2dlckZpbHRlcik7CisgICAgfQorICAgIGJyZWFrOworICAgIAorICBjYXNlIFRJTV9UU19USTFGX0VEOgorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9UUklHR0VSRklMVEVSKHNTbGF2ZUNvbmZpZy0+VHJpZ2dlckZpbHRlcikpOworICAKKyAgICAgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMTogUmVzZXQgdGhlIENDMUUgQml0ICovCisgICAgICB0bXBjY2VyID0gaHRpbS0+SW5zdGFuY2UtPkNDRVI7CisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NFUiAmPSB+VElNX0NDRVJfQ0MxRTsKKyAgICAgIHRtcGNjbXIxID0gaHRpbS0+SW5zdGFuY2UtPkNDTVIxOyAgICAKKyAgICAgIAorICAgICAgLyogU2V0IHRoZSBmaWx0ZXIgKi8KKyAgICAgIHRtcGNjbXIxICY9IH5USU1fQ0NNUjFfSUMxRjsKKyAgICAgIHRtcGNjbXIxIHw9ICgoc1NsYXZlQ29uZmlnLT5UcmlnZ2VyRmlsdGVyKSA8PCA0VSk7CisgICAgICAKKyAgICAgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgYW5kIENDRVIgcmVnaXN0ZXJzICovCisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgPSB0bXBjY21yMTsKKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ0VSID0gdG1wY2NlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorICAgIGJyZWFrOworICAgIAorICBjYXNlIFRJTV9UU19USTFGUDE6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MxX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX1RSSUdHRVJQT0xBUklUWShzU2xhdmVDb25maWctPlRyaWdnZXJQb2xhcml0eSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9UUklHR0VSRklMVEVSKHNTbGF2ZUNvbmZpZy0+VHJpZ2dlckZpbHRlcikpOworICAKKyAgICAgIC8qIENvbmZpZ3VyZSBUSTEgRmlsdGVyIGFuZCBQb2xhcml0eSAqLworICAgICAgVElNX1RJMV9Db25maWdJbnB1dFN0YWdlKGh0aW0tPkluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNTbGF2ZUNvbmZpZy0+VHJpZ2dlclBvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNTbGF2ZUNvbmZpZy0+VHJpZ2dlckZpbHRlcik7CisgICAgfQorICAgIGJyZWFrOworICAgIAorICBjYXNlIFRJTV9UU19USTJGUDI6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX1RSSUdHRVJQT0xBUklUWShzU2xhdmVDb25maWctPlRyaWdnZXJQb2xhcml0eSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9UUklHR0VSRklMVEVSKHNTbGF2ZUNvbmZpZy0+VHJpZ2dlckZpbHRlcikpOworICAKKyAgICAgIC8qIENvbmZpZ3VyZSBUSTIgRmlsdGVyIGFuZCBQb2xhcml0eSAqLworICAgICAgVElNX1RJMl9Db25maWdJbnB1dFN0YWdlKGh0aW0tPkluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzU2xhdmVDb25maWctPlRyaWdnZXJQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1NsYXZlQ29uZmlnLT5UcmlnZ2VyRmlsdGVyKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgIGNhc2UgVElNX1RTX0lUUjA6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgIGNhc2UgVElNX1RTX0lUUjE6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgIGNhc2UgVElNX1RTX0lUUjI6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgIGNhc2UgVElNX1RTX0lUUjM6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgICAgCisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJMSBhcyBJbnB1dC4KKyAgKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIFRJTV9JQ1BvbGFyaXR5IFRoZSBJbnB1dCBQb2xhcml0eS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9SSVNJTkcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfRkFMTElORworICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9CT1RIRURHRSAgCisgICogQHBhcmFtICBUSU1fSUNTZWxlY3Rpb24gc3BlY2lmaWVzIHRoZSBpbnB1dCB0byBiZSB1c2VkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9ESVJFQ1RUSTogVElNIElucHV0IDEgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElDMS4KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDU0VMRUNUSU9OX0lORElSRUNUVEk6IFRJTSBJbnB1dCAxIGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBJQzIuCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9UUkM6IFRJTSBJbnB1dCAxIGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBUUkMuCisgICogQHBhcmFtICBUSU1fSUNGaWx0ZXIgU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIEZpbHRlci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGLgorICAqIEByZXR2YWwgTm9uZQorICAqIEBub3RlIFRJTV9JQ0ZpbHRlciBhbmQgVElNX0lDUG9sYXJpdHkgYXJlIG5vdCB1c2VkIGluIElORElSRUNUIG1vZGUgYXMgVEkyRlAxIAorICAqICAgICAgIChvbiBjaGFubmVsMiBwYXRoKSBpcyB1c2VkIGFzIHRoZSBpbnB1dCBzaWduYWwuIFRoZXJlZm9yZSBDQ01SMSBtdXN0IGJlIAorICAqICAgICAgICBwcm90ZWN0ZWQgYWdhaW5zdCB1bi1pbml0aWFsaXplZCBmaWx0ZXIgYW5kIHBvbGFyaXR5IHZhbHVlcy4KKyAgKi8KK3ZvaWQgVElNX1RJMV9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MzJfdCBUSU1fSUNTZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRJTV9JQ0ZpbHRlcikKK3sKKyAgdWludDMyX3QgdG1wY2NtcjEgPSAwVTsKKyAgdWludDMyX3QgdG1wY2NlciA9IDBVOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMTogUmVzZXQgdGhlIENDMUUgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gflRJTV9DQ0VSX0NDMUU7CisgIHRtcGNjbXIxID0gVElNeC0+Q0NNUjE7CisgIHRtcGNjZXIgPSBUSU14LT5DQ0VSOworCisgIC8qIFNlbGVjdCB0aGUgSW5wdXQgKi8KKyAgaWYoSVNfVElNX0NDMl9JTlNUQU5DRShUSU14KSAhPSBSRVNFVCkKKyAgeworICAgIHRtcGNjbXIxICY9IH5USU1fQ0NNUjFfQ0MxUzsKKyAgICB0bXBjY21yMSB8PSBUSU1fSUNTZWxlY3Rpb247CisgIH0gCisgIGVsc2UKKyAgeworICAgIHRtcGNjbXIxIHw9IFRJTV9DQ01SMV9DQzFTXzA7CisgIH0KKyAgCisgIC8qIFNldCB0aGUgZmlsdGVyICovCisgIHRtcGNjbXIxICY9IH5USU1fQ0NNUjFfSUMxRjsKKyAgdG1wY2NtcjEgfD0gKChUSU1fSUNGaWx0ZXIgPDwgNFUpICYgVElNX0NDTVIxX0lDMUYpOworCisgIC8qIFNlbGVjdCB0aGUgUG9sYXJpdHkgYW5kIHNldCB0aGUgQ0MxRSBCaXQgKi8KKyAgdG1wY2NlciAmPSB+KFRJTV9DQ0VSX0NDMVAgfCBUSU1fQ0NFUl9DQzFOUCk7CisgIHRtcGNjZXIgfD0gKFRJTV9JQ1BvbGFyaXR5ICYgKFRJTV9DQ0VSX0NDMVAgfCBUSU1fQ0NFUl9DQzFOUCkpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgYW5kIENDRVIgcmVnaXN0ZXJzICovCisgIFRJTXgtPkNDTVIxID0gdG1wY2NtcjE7CisgIFRJTXgtPkNDRVIgPSB0bXBjY2VyOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgUG9sYXJpdHkgYW5kIEZpbHRlciBmb3IgVEkxLgorICAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgVElNX0lDUG9sYXJpdHkgVGhlIElucHV0IFBvbGFyaXR5LgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX1JJU0lORworICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9GQUxMSU5HCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX0JPVEhFREdFCisgICogQHBhcmFtICBUSU1fSUNGaWx0ZXIgU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIEZpbHRlci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVElNX1RJMV9Db25maWdJbnB1dFN0YWdlKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBUSU1fSUNQb2xhcml0eSwgdWludDMyX3QgVElNX0lDRmlsdGVyKQoreworICB1aW50MzJfdCB0bXBjY21yMSA9IDBVOworICB1aW50MzJfdCB0bXBjY2VyID0gMFU7CisgIAorICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDE6IFJlc2V0IHRoZSBDQzFFIEJpdCAqLworICB0bXBjY2VyID0gVElNeC0+Q0NFUjsKKyAgVElNeC0+Q0NFUiAmPSB+VElNX0NDRVJfQ0MxRTsKKyAgdG1wY2NtcjEgPSBUSU14LT5DQ01SMTsgICAgCisgIAorICAvKiBTZXQgdGhlIGZpbHRlciAqLworICB0bXBjY21yMSAmPSB+VElNX0NDTVIxX0lDMUY7CisgIHRtcGNjbXIxIHw9IChUSU1fSUNGaWx0ZXIgPDwgNFUpOworICAKKyAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSBhbmQgc2V0IHRoZSBDQzFFIEJpdCAqLworICB0bXBjY2VyICY9IH4oVElNX0NDRVJfQ0MxUCB8IFRJTV9DQ0VSX0NDMU5QKTsKKyAgdG1wY2NlciB8PSBUSU1fSUNQb2xhcml0eTsKKyAgCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgYW5kIENDRVIgcmVnaXN0ZXJzICovCisgIFRJTXgtPkNDTVIxID0gdG1wY2NtcjE7CisgIFRJTXgtPkNDRVIgPSB0bXBjY2VyOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVEkyIGFzIElucHV0LgorICAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsCisgICogQHBhcmFtICBUSU1fSUNQb2xhcml0eSBUaGUgSW5wdXQgUG9sYXJpdHkuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfUklTSU5HCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX0ZBTExJTkcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfQk9USEVER0UgICAKKyAgKiBAcGFyYW0gIFRJTV9JQ1NlbGVjdGlvbiBzcGVjaWZpZXMgdGhlIGlucHV0IHRvIGJlIHVzZWQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDU0VMRUNUSU9OX0RJUkVDVFRJOiBUSU0gSW5wdXQgMiBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gSUMyLgorICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNTRUxFQ1RJT05fSU5ESVJFQ1RUSTogVElNIElucHV0IDIgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElDMS4KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDU0VMRUNUSU9OX1RSQzogVElNIElucHV0IDIgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIFRSQy4KKyAgKiBAcGFyYW0gIFRJTV9JQ0ZpbHRlciBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgRmlsdGVyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAgYW5kIDB4MEYuCisgICogQHJldHZhbCBOb25lCisgICogQG5vdGUgVElNX0lDRmlsdGVyIGFuZCBUSU1fSUNQb2xhcml0eSBhcmUgbm90IHVzZWQgaW4gSU5ESVJFQ1QgbW9kZSBhcyBUSTFGUDIgCisgICogICAgICAgKG9uIGNoYW5uZWwxIHBhdGgpIGlzIHVzZWQgYXMgdGhlIGlucHV0IHNpZ25hbC4gVGhlcmVmb3JlIENDTVIxIG11c3QgYmUgCisgICogICAgICAgIHByb3RlY3RlZCBhZ2FpbnN0IHVuLWluaXRpYWxpemVkIGZpbHRlciBhbmQgcG9sYXJpdHkgdmFsdWVzLgorICAqLworc3RhdGljIHZvaWQgVElNX1RJMl9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MzJfdCBUSU1fSUNTZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRJTV9JQ0ZpbHRlcikKK3sKKyAgdWludDMyX3QgdG1wY2NtcjEgPSAwVTsKKyAgdWludDMyX3QgdG1wY2NlciA9IDBVOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMjogUmVzZXQgdGhlIENDMkUgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gflRJTV9DQ0VSX0NDMkU7CisgIHRtcGNjbXIxID0gVElNeC0+Q0NNUjE7CisgIHRtcGNjZXIgPSBUSU14LT5DQ0VSOworCisgIC8qIFNlbGVjdCB0aGUgSW5wdXQgKi8KKyAgdG1wY2NtcjEgJj0gflRJTV9DQ01SMV9DQzJTOworICB0bXBjY21yMSB8PSAoVElNX0lDU2VsZWN0aW9uIDw8IDhVKTsKKworICAvKiBTZXQgdGhlIGZpbHRlciAqLworICB0bXBjY21yMSAmPSB+VElNX0NDTVIxX0lDMkY7CisgIHRtcGNjbXIxIHw9ICgoVElNX0lDRmlsdGVyIDw8IDEyVSkgJiBUSU1fQ0NNUjFfSUMyRik7CisKKyAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSBhbmQgc2V0IHRoZSBDQzJFIEJpdCAqLworICB0bXBjY2VyICY9IH4oVElNX0NDRVJfQ0MyUCB8IFRJTV9DQ0VSX0NDMk5QKTsKKyAgdG1wY2NlciB8PSAoKFRJTV9JQ1BvbGFyaXR5IDw8IDRVKSAmIChUSU1fQ0NFUl9DQzJQIHwgVElNX0NDRVJfQ0MyTlApKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIxIGFuZCBDQ0VSIHJlZ2lzdGVycyAqLworICBUSU14LT5DQ01SMSA9IHRtcGNjbXIxIDsKKyAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBQb2xhcml0eSBhbmQgRmlsdGVyIGZvciBUSTIuCisgICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBUSU1fSUNQb2xhcml0eSBUaGUgSW5wdXQgUG9sYXJpdHkuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfUklTSU5HCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX0ZBTExJTkcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfQk9USEVER0UKKyAgKiBAcGFyYW0gIFRJTV9JQ0ZpbHRlciBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgRmlsdGVyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAgYW5kIDB4MEYuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBUSU1fVEkyX0NvbmZpZ0lucHV0U3RhZ2UoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MzJfdCBUSU1fSUNGaWx0ZXIpCit7CisgIHVpbnQzMl90IHRtcGNjbXIxID0gMFU7CisgIHVpbnQzMl90IHRtcGNjZXIgPSAwVTsKKyAgCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMjogUmVzZXQgdGhlIENDMkUgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gflRJTV9DQ0VSX0NDMkU7CisgIHRtcGNjbXIxID0gVElNeC0+Q0NNUjE7CisgIHRtcGNjZXIgPSBUSU14LT5DQ0VSOworICAKKyAgLyogU2V0IHRoZSBmaWx0ZXIgKi8KKyAgdG1wY2NtcjEgJj0gflRJTV9DQ01SMV9JQzJGOworICB0bXBjY21yMSB8PSAoVElNX0lDRmlsdGVyIDw8IDEyVSk7CisKKyAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSBhbmQgc2V0IHRoZSBDQzJFIEJpdCAqLworICB0bXBjY2VyICY9IH4oVElNX0NDRVJfQ0MyUCB8IFRJTV9DQ0VSX0NDMk5QKTsKKyAgdG1wY2NlciB8PSAoVElNX0lDUG9sYXJpdHkgPDwgNFUpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgYW5kIENDRVIgcmVnaXN0ZXJzICovCisgIFRJTXgtPkNDTVIxID0gdG1wY2NtcjEgOworICBUSU14LT5DQ0VSID0gdG1wY2NlcjsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJMyBhcyBJbnB1dC4KKyAgKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgVElNX0lDUG9sYXJpdHkgVGhlIElucHV0IFBvbGFyaXR5LgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX1JJU0lORworICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9GQUxMSU5HCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX0JPVEhFREdFICAgICAgICAgCisgICogQHBhcmFtICBUSU1fSUNTZWxlY3Rpb24gc3BlY2lmaWVzIHRoZSBpbnB1dCB0byBiZSB1c2VkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9ESVJFQ1RUSTogVElNIElucHV0IDMgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElDMy4KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDU0VMRUNUSU9OX0lORElSRUNUVEk6IFRJTSBJbnB1dCAzIGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBJQzQuCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9UUkM6IFRJTSBJbnB1dCAzIGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBUUkMuCisgICogQHBhcmFtICBUSU1fSUNGaWx0ZXIgU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIEZpbHRlci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGLgorICAqIEByZXR2YWwgTm9uZQorICAqIEBub3RlIFRJTV9JQ0ZpbHRlciBhbmQgVElNX0lDUG9sYXJpdHkgYXJlIG5vdCB1c2VkIGluIElORElSRUNUIG1vZGUgYXMgVEkzRlA0IAorICAqICAgICAgIChvbiBjaGFubmVsMSBwYXRoKSBpcyB1c2VkIGFzIHRoZSBpbnB1dCBzaWduYWwuIFRoZXJlZm9yZSBDQ01SMiBtdXN0IGJlIAorICAqICAgICAgICBwcm90ZWN0ZWQgYWdhaW5zdCB1bi1pbml0aWFsaXplZCBmaWx0ZXIgYW5kIHBvbGFyaXR5IHZhbHVlcy4KKyAgKi8KK3N0YXRpYyB2b2lkIFRJTV9USTNfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBUSU1fSUNQb2xhcml0eSwgdWludDMyX3QgVElNX0lDU2VsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUSU1fSUNGaWx0ZXIpCit7CisgIHVpbnQzMl90IHRtcGNjbXIyID0gMFU7CisgIHVpbnQzMl90IHRtcGNjZXIgPSAwVTsKKworICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDM6IFJlc2V0IHRoZSBDQzNFIEJpdCAqLworICBUSU14LT5DQ0VSICY9IH5USU1fQ0NFUl9DQzNFOworICB0bXBjY21yMiA9IFRJTXgtPkNDTVIyOworICB0bXBjY2VyID0gVElNeC0+Q0NFUjsKKworICAvKiBTZWxlY3QgdGhlIElucHV0ICovCisgIHRtcGNjbXIyICY9IH5USU1fQ0NNUjJfQ0MzUzsKKyAgdG1wY2NtcjIgfD0gVElNX0lDU2VsZWN0aW9uOworCisgIC8qIFNldCB0aGUgZmlsdGVyICovCisgIHRtcGNjbXIyICY9IH5USU1fQ0NNUjJfSUMzRjsKKyAgdG1wY2NtcjIgfD0gKChUSU1fSUNGaWx0ZXIgPDwgNFUpICYgVElNX0NDTVIyX0lDM0YpOworCisgIC8qIFNlbGVjdCB0aGUgUG9sYXJpdHkgYW5kIHNldCB0aGUgQ0MzRSBCaXQgKi8KKyAgdG1wY2NlciAmPSB+KFRJTV9DQ0VSX0NDM1AgfCBUSU1fQ0NFUl9DQzNOUCk7CisgIHRtcGNjZXIgfD0gKChUSU1fSUNQb2xhcml0eSA8PCA4VSkgJiAoVElNX0NDRVJfQ0MzUCB8IFRJTV9DQ0VSX0NDM05QKSk7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ01SMiBhbmQgQ0NFUiByZWdpc3RlcnMgKi8KKyAgVElNeC0+Q0NNUjIgPSB0bXBjY21yMjsKKyAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBUSTQgYXMgSW5wdXQuCisgICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwKKyAgKiBAcGFyYW0gIFRJTV9JQ1BvbGFyaXR5IFRoZSBJbnB1dCBQb2xhcml0eS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9SSVNJTkcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfRkFMTElORworICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9CT1RIRURHRSAgICAgCisgICogQHBhcmFtICBUSU1fSUNTZWxlY3Rpb24gc3BlY2lmaWVzIHRoZSBpbnB1dCB0byBiZSB1c2VkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9ESVJFQ1RUSTogVElNIElucHV0IDQgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElDNC4KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDU0VMRUNUSU9OX0lORElSRUNUVEk6IFRJTSBJbnB1dCA0IGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBJQzMuCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9UUkM6IFRJTSBJbnB1dCA0IGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBUUkMuCisgICogQHBhcmFtICBUSU1fSUNGaWx0ZXIgU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIEZpbHRlci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGLgorICAqIEBub3RlIFRJTV9JQ0ZpbHRlciBhbmQgVElNX0lDUG9sYXJpdHkgYXJlIG5vdCB1c2VkIGluIElORElSRUNUIG1vZGUgYXMgVEk0RlAzIAorICAqICAgICAgIChvbiBjaGFubmVsMSBwYXRoKSBpcyB1c2VkIGFzIHRoZSBpbnB1dCBzaWduYWwuIFRoZXJlZm9yZSBDQ01SMiBtdXN0IGJlIAorICAqICAgICAgICBwcm90ZWN0ZWQgYWdhaW5zdCB1bi1pbml0aWFsaXplZCBmaWx0ZXIgYW5kIHBvbGFyaXR5IHZhbHVlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFRJTV9USTRfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBUSU1fSUNQb2xhcml0eSwgdWludDMyX3QgVElNX0lDU2VsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUSU1fSUNGaWx0ZXIpCit7CisgIHVpbnQzMl90IHRtcGNjbXIyID0gMFU7CisgIHVpbnQzMl90IHRtcGNjZXIgPSAwVTsKKworICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDQ6IFJlc2V0IHRoZSBDQzRFIEJpdCAqLworICBUSU14LT5DQ0VSICY9IH5USU1fQ0NFUl9DQzRFOworICB0bXBjY21yMiA9IFRJTXgtPkNDTVIyOworICB0bXBjY2VyID0gVElNeC0+Q0NFUjsKKworICAvKiBTZWxlY3QgdGhlIElucHV0ICovCisgIHRtcGNjbXIyICY9IH5USU1fQ0NNUjJfQ0M0UzsKKyAgdG1wY2NtcjIgfD0gKFRJTV9JQ1NlbGVjdGlvbiA8PCA4VSk7CisKKyAgLyogU2V0IHRoZSBmaWx0ZXIgKi8KKyAgdG1wY2NtcjIgJj0gflRJTV9DQ01SMl9JQzRGOworICB0bXBjY21yMiB8PSAoKFRJTV9JQ0ZpbHRlciA8PCAxMlUpICYgVElNX0NDTVIyX0lDNEYpOworCisgIC8qIFNlbGVjdCB0aGUgUG9sYXJpdHkgYW5kIHNldCB0aGUgQ0M0RSBCaXQgKi8KKyAgdG1wY2NlciAmPSB+KFRJTV9DQ0VSX0NDNFAgfCBUSU1fQ0NFUl9DQzROUCk7CisgIHRtcGNjZXIgfD0gKChUSU1fSUNQb2xhcml0eSA8PCAxMlUpICYgKFRJTV9DQ0VSX0NDNFAgfCBUSU1fQ0NFUl9DQzROUCkpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjIgYW5kIENDRVIgcmVnaXN0ZXJzICovCisgIFRJTXgtPkNDTVIyID0gdG1wY2NtcjI7CisgIFRJTXgtPkNDRVIgPSB0bXBjY2VyIDsKK30KKworLyoqCisgICogQGJyaWVmICBTZWxlY3RzIHRoZSBJbnB1dCBUcmlnZ2VyIHNvdXJjZQorICAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsCisgICogQHBhcmFtICBJbnB1dFRyaWdnZXJTb3VyY2UgVGhlIElucHV0IFRyaWdnZXIgc291cmNlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIwOiBJbnRlcm5hbCBUcmlnZ2VyIDAKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjE6IEludGVybmFsIFRyaWdnZXIgMQorICAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMjogSW50ZXJuYWwgVHJpZ2dlciAyCisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIzOiBJbnRlcm5hbCBUcmlnZ2VyIDMKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX1RJMUZfRUQ6IFRJMSBFZGdlIERldGVjdG9yCisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19USTFGUDE6IEZpbHRlcmVkIFRpbWVyIElucHV0IDEKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX1RJMkZQMjogRmlsdGVyZWQgVGltZXIgSW5wdXQgMgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfRVRSRjogRXh0ZXJuYWwgVHJpZ2dlciBpbnB1dAorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVElNX0lUUnhfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MTZfdCBJbnB1dFRyaWdnZXJTb3VyY2UpCit7CisgIHVpbnQzMl90IHRtcHNtY3IgPSAwVTsKKyAgCisgICAvKiBHZXQgdGhlIFRJTXggU01DUiByZWdpc3RlciB2YWx1ZSAqLworICAgdG1wc21jciA9IFRJTXgtPlNNQ1I7CisgICAvKiBSZXNldCB0aGUgVFMgQml0cyAqLworICAgdG1wc21jciAmPSB+VElNX1NNQ1JfVFM7CisgICAvKiBTZXQgdGhlIElucHV0IFRyaWdnZXIgc291cmNlIGFuZCB0aGUgc2xhdmUgbW9kZSovCisgICB0bXBzbWNyIHw9IElucHV0VHJpZ2dlclNvdXJjZSB8IFRJTV9TTEFWRU1PREVfRVhURVJOQUwxOworICAgLyogV3JpdGUgdG8gVElNeCBTTUNSICovCisgICBUSU14LT5TTUNSID0gdG1wc21jcjsKK30KKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNeCBFeHRlcm5hbCBUcmlnZ2VyIChFVFIpLgorICAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsCisgICogQHBhcmFtICBUSU1fRXh0VFJHUHJlc2NhbGVyIFRoZSBleHRlcm5hbCBUcmlnZ2VyIFByZXNjYWxlci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRVRSUFJFU0NBTEVSX0RJVjEgOiBFVFJQIFByZXNjYWxlciBPRkYuCisgICogICAgICAgICAgICBAYXJnIFRJTV9FVFJQUkVTQ0FMRVJfRElWMiA6IEVUUlAgZnJlcXVlbmN5IGRpdmlkZWQgYnkgMi4KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0VUUlBSRVNDQUxFUl9ESVY0IDogRVRSUCBmcmVxdWVuY3kgZGl2aWRlZCBieSA0LgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRVRSUFJFU0NBTEVSX0RJVjggOiBFVFJQIGZyZXF1ZW5jeSBkaXZpZGVkIGJ5IDguCisgICogQHBhcmFtICBUSU1fRXh0VFJHUG9sYXJpdHkgVGhlIGV4dGVybmFsIFRyaWdnZXIgUG9sYXJpdHkuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0VUUlBPTEFSSVRZX0lOVkVSVEVEIDogYWN0aXZlIGxvdyBvciBmYWxsaW5nIGVkZ2UgYWN0aXZlLgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRVRSUE9MQVJJVFlfTk9OSU5WRVJURUQgOiBhY3RpdmUgaGlnaCBvciByaXNpbmcgZWRnZSBhY3RpdmUuCisgICogQHBhcmFtICBFeHRUUkdGaWx0ZXIgRXh0ZXJuYWwgVHJpZ2dlciBGaWx0ZXIuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMCBhbmQgMHgwRgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBUSU1fRVRSX1NldENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDMyX3QgVElNX0V4dFRSR1ByZXNjYWxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVElNX0V4dFRSR1BvbGFyaXR5LCB1aW50MzJfdCBFeHRUUkdGaWx0ZXIpCit7CisgIHVpbnQzMl90IHRtcHNtY3IgPSAwVTsKKworICB0bXBzbWNyID0gVElNeC0+U01DUjsKKworICAvKiBSZXNldCB0aGUgRVRSIEJpdHMgKi8KKyAgdG1wc21jciAmPSB+KFRJTV9TTUNSX0VURiB8IFRJTV9TTUNSX0VUUFMgfCBUSU1fU01DUl9FQ0UgfCBUSU1fU01DUl9FVFApOworCisgIC8qIFNldCB0aGUgUHJlc2NhbGVyLCB0aGUgRmlsdGVyIHZhbHVlIGFuZCB0aGUgUG9sYXJpdHkgKi8KKyAgdG1wc21jciB8PSAodWludDMyX3QpKFRJTV9FeHRUUkdQcmVzY2FsZXIgfCAoVElNX0V4dFRSR1BvbGFyaXR5IHwgKEV4dFRSR0ZpbHRlciA8PCA4VSkpKTsKKworICAvKiBXcml0ZSB0byBUSU14IFNNQ1IgKi8KKyAgVElNeC0+U01DUiA9IHRtcHNtY3I7Cit9IAorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFRJTSBDYXB0dXJlIENvbXBhcmUgQ2hhbm5lbCB4LgorICAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsCisgICogQHBhcmFtICBDaGFubmVsIHNwZWNpZmllcyB0aGUgVElNIENoYW5uZWwKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMworICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0CisgICogQHBhcmFtICBDaGFubmVsU3RhdGUgc3BlY2lmaWVzIHRoZSBUSU0gQ2hhbm5lbCBDQ3hFIGJpdCBuZXcgc3RhdGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBUSU1fQ0N4X0VOQUJMRSBvciBUSU1fQ0N4X0Rpc2FibGUuIAorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBUSU1fQ0N4Q2hhbm5lbENtZChUSU1fVHlwZURlZiogVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgQ2hhbm5lbFN0YXRlKQoreworICB1aW50MzJfdCB0bXAgPSAwVTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMV9JTlNUQU5DRShUSU14KSk7IAorICBhc3NlcnRfcGFyYW0oSVNfVElNX0NIQU5ORUxTKENoYW5uZWwpKTsKKworICB0bXAgPSBUSU1fQ0NFUl9DQzFFIDw8IENoYW5uZWw7CisKKyAgLyogUmVzZXQgdGhlIENDeEUgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gfnRtcDsKKworICAvKiBTZXQgb3IgcmVzZXQgdGhlIENDeEUgQml0ICovIAorICBUSU14LT5DQ0VSIHw9ICAodWludDMyX3QpKENoYW5uZWxTdGF0ZSA8PCBDaGFubmVsKTsKK30KKworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX1RJTV9NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8gCisKKy8qKgorICAqIEB9CisgICovIAorLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmYzeHhfaGFsX3RpbV9leC5jIGIvU3JjL3N0bTMyZjN4eF9oYWxfdGltX2V4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVlNWQ5MwotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfaGFsX3RpbV9leC5jCkBAIC0wLDAgKzEsMjcxNiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfdGltX2V4LmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFRJTSBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nIAorICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgVGltZXIgRXh0ZW5kZWQgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBUaW1lIEhhbGwgU2Vuc29yIEludGVyZmFjZSBJbml0aWFsaXphdGlvbgorICAqICAgICAgICAgICArIFRpbWUgSGFsbCBTZW5zb3IgSW50ZXJmYWNlIFN0YXJ0CisgICogICAgICAgICAgICsgVGltZSBDb21wbGVtZW50YXJ5IHNpZ25hbCBicmVhZCBhbmQgZGVhZCB0aW1lIGNvbmZpZ3VyYXRpb24gIAorICAqICAgICAgICAgICArIFRpbWUgTWFzdGVyIGFuZCBTbGF2ZSBzeW5jaHJvbml6YXRpb24gY29uZmlndXJhdGlvbgorICAqICAgICAgICAgICArIFRpbWUgT3V0cHV0IENvbXBhcmUvUFdNIENoYW5uZWwgQ29uZmlndXJhdGlvbiAoZm9yIGNoYW5uZWxzIDUgYW5kIDYpCisgICogICAgICAgICAgICsgVGltZSBPQ1JlZiBjbGVhciBjb25maWd1cmF0aW9uCisgICogICAgICAgICAgICsgVGltZXIgcmVtYXBwaW5nIGNhcGFiaWxpdGllcyBjb25maWd1cmF0aW9uCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBUSU1FUiBFeHRlbmRlZCBmZWF0dXJlcyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXSAKKyAgICBUaGUgVGltZXIgRXh0ZW5kZWQgZmVhdHVyZXMgaW5jbHVkZTogCisgICAgKCMpIENvbXBsZW1lbnRhcnkgb3V0cHV0cyB3aXRoIHByb2dyYW1tYWJsZSBkZWFkLXRpbWUgZm9yIDoKKyAgICAgICAgKCsrKSBPdXRwdXQgQ29tcGFyZQorICAgICAgICAoKyspIFBXTSBnZW5lcmF0aW9uIChFZGdlIGFuZCBDZW50ZXItYWxpZ25lZCBNb2RlKQorICAgICAgICAoKyspIE9uZS1wdWxzZSBtb2RlIG91dHB1dAorICAgICgjKSBTeW5jaHJvbml6YXRpb24gY2lyY3VpdCB0byBjb250cm9sIHRoZSB0aW1lciB3aXRoIGV4dGVybmFsIHNpZ25hbHMgYW5kIHRvIAorICAgICAgICBpbnRlcmNvbm5lY3Qgc2V2ZXJhbCB0aW1lcnMgdG9nZXRoZXIuCisgICAgKCMpIEJyZWFrIGlucHV0IHRvIHB1dCB0aGUgdGltZXIgb3V0cHV0IHNpZ25hbHMgaW4gcmVzZXQgc3RhdGUgb3IgaW4gYSBrbm93biBzdGF0ZS4KKyAgICAoIykgU3VwcG9ydHMgaW5jcmVtZW50YWwgKHF1YWRyYXR1cmUpIGVuY29kZXIgYW5kIGhhbGwtc2Vuc29yIGNpcmN1aXRyeSBmb3IgCisgICAgICAgIHBvc2l0aW9uaW5nIHB1cnBvc2VzICAgICAgICAgICAgICAgIAorCisgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgKCMpIEluaXRpYWxpemUgdGhlIFRJTSBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudGluZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyAKKyAgICAgICAgIGRlcGVuZGluZyBmcm9tIGZlYXR1cmUgdXNlZCA6CisgICAgICAgICAgICgrKykgQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZSA6IEhBTF9USU1fT0NfTXNwSW5pdCgpCisgICAgICAgICAgICgrKykgQ29tcGxlbWVudGFyeSBQV00gZ2VuZXJhdGlvbiA6IEhBTF9USU1fUFdNX01zcEluaXQoKQorICAgICAgICAgICAoKyspIENvbXBsZW1lbnRhcnkgT25lLXB1bHNlIG1vZGUgb3V0cHV0IDogSEFMX1RJTV9PbmVQdWxzZV9Nc3BJbml0KCkKKyAgICAgICAgICAgKCsrKSBIYWxsIFNlbnNvciBvdXRwdXQgOiBIQUxfVElNX0hhbGxTZW5zb3JfTXNwSW5pdCgpCisgICAgICAgICAgIAorICAgICAoIykgSW5pdGlhbGl6ZSB0aGUgVElNIGxvdyBsZXZlbCByZXNvdXJjZXMgOgorICAgICAgICAoIyMpIEVuYWJsZSB0aGUgVElNIGludGVyZmFjZSBjbG9jayB1c2luZyBfX0hBTF9SQ0NfVElNeF9DTEtfRU5BQkxFICAoKTsgCisgICAgICAgICgjIykgVElNIHBpbnMgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBjbG9jayBmb3IgdGhlIFRJTSBHUElPcyB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgorICAgICAgICAgICAgICBfX0hBTF9SQ0NfR1BJT3hfQ0xLX0VOQUJMRSgpOyAgIAorICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZXNlIFRJTSBwaW5zIGluIEFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlIHVzaW5nIEhBTF9HUElPX0luaXQoKTsgIAorCisgICAgICgjKSBUaGUgZXh0ZXJuYWwgQ2xvY2sgY2FuIGJlIGNvbmZpZ3VyZWQsIGlmIG5lZWRlZCAodGhlIGRlZmF1bHQgY2xvY2sgaXMgdGhlIAorICAgICAgICAgaW50ZXJuYWwgY2xvY2sgZnJvbSB0aGUgQVBCeCksIHVzaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246CisgICAgICAgICBIQUxfVElNX0NvbmZpZ0Nsb2NrU291cmNlLCB0aGUgY2xvY2sgY29uZmlndXJhdGlvbiBzaG91bGQgYmUgZG9uZSBiZWZvcmUgCisgICAgICAgICBhbnkgc3RhcnQgZnVuY3Rpb24uCisgIAorICAgICAoIykgQ29uZmlndXJlIHRoZSBUSU0gaW4gdGhlIGRlc2lyZWQgZnVuY3Rpb25pbmcgbW9kZSB1c2luZyBvbmUgb2YgdGhlIAorICAgICAgICAgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gb2YgdGhpcyBkcml2ZXI6CisgICAgICAgICAgKCsrKSBIQUxfVElNRXhfSGFsbFNlbnNvcl9Jbml0IGFuZCBIQUxfVElNRXhfQ29uZmlnQ29tbXV0YXRpb25FdmVudDogdG8gdXNlIHRoZSAKKyAgICAgICAgICAgICAgVGltZXIgSGFsbCBTZW5zb3IgSW50ZXJmYWNlIGFuZCB0aGUgY29tbXV0YXRpb24gZXZlbnQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyAKKyAgICAgICAgICAgICAgSW50ZXJydXB0IGFuZCBETUEgcmVxdWVzdCBpZiBuZWVkZWQgKE5vdGUgdGhhdCBPbmUgVGltZXIgaXMgdXNlZCB0byBpbnRlcmZhY2UgCisgICAgICAgICAgICAgd2l0aCB0aGUgSGFsbCBzZW5zb3IgSW50ZXJmYWNlIGFuZCBhbm90aGVyIFRpbWVyIHNob3VsZCBiZSB1c2VkIHRvIHVzZSAKKyAgICAgICAgICAgICB0aGUgY29tbXV0YXRpb24gZXZlbnQpLgorCisgICAgICgjKSBBY3RpdmF0ZSB0aGUgVElNIHBlcmlwaGVyYWwgdXNpbmcgb25lIG9mIHRoZSBzdGFydCBmdW5jdGlvbnM6IAorICAgICAgICAgICAoKyspIENvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUgOiBIQUxfVElNRXhfT0NOX1N0YXJ0KCksIEhBTF9USU1FeF9PQ05fU3RhcnRfRE1BKCksIEhBTF9USU1FeF9PQ05fU3RhcnRfSVQoKQorICAgICAgICAgICAoKyspIENvbXBsZW1lbnRhcnkgUFdNIGdlbmVyYXRpb24gOiBIQUxfVElNRXhfUFdNTl9TdGFydCgpLCBIQUxfVElNRXhfUFdNTl9TdGFydF9ETUEoKSwgSEFMX1RJTUV4X1BXTU5fU3RhcnRfSVQoKQorICAgICAgICAgICAoKyspIENvbXBsZW1lbnRhcnkgT25lLXB1bHNlIG1vZGUgb3V0cHV0IDogSEFMX1RJTUV4X09uZVB1bHNlTl9TdGFydCgpLCBIQUxfVElNRXhfT25lUHVsc2VOX1N0YXJ0X0lUKCkKKyAgICAgICAgICAgKCsrKSBIYWxsIFNlbnNvciBvdXRwdXQgOiBIQUxfVElNRXhfSGFsbFNlbnNvcl9TdGFydCgpLCBIQUxfVElNRXhfSGFsbFNlbnNvcl9TdGFydF9ETUEoKSwgSEFMX1RJTUV4X0hhbGxTZW5zb3JfU3RhcnRfSVQoKS4KKworICAKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8gCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFRJTUV4IFRJTUV4CisgICogQGJyaWVmIFRJTSBFeHRlbmRlZCBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfVElNX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisgICAgICAKKyNkZWZpbmUgQkRUUl9CS0ZfU0hJRlQgKDE2VSkKKyNkZWZpbmUgQkRUUl9CSzJGX1NISUZUICgyMFUpCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggICAgKi8KKyAgICAgIAorLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFRJTUV4X1ByaXZhdGVfRnVuY3Rpb25zIFRJTUV4IFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3N0YXRpYyB2b2lkIFRJTV9DQ3hOQ2hhbm5lbENtZChUSU1fVHlwZURlZiogVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgQ2hhbm5lbE5TdGF0ZSk7IAorICAgCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKK3N0YXRpYyB2b2lkIFRJTV9PQzVfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX09DX0luaXRUeXBlRGVmICpPQ19Db25maWcpOworCitzdGF0aWMgdm9pZCBUSU1fT0M2X1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fT0NfSW5pdFR5cGVEZWYgKk9DX0NvbmZpZyk7CisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggICAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zIFRJTUV4IEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBUaW1lciBIYWxsIFNlbnNvciBmdW5jdGlvbnMgCisgICogQGJyaWVmICAgIFRpbWVyIEhhbGwgU2Vuc29yIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0gICAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFRpbWVyIEhhbGwgU2Vuc29yIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXSAgCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAoKykgSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIFRJTSBIQUwgU2Vuc29yLiAKKyAgICAoKykgRGUtaW5pdGlhbGl6ZSBUSU0gSEFMIFNlbnNvci4KKyAgICAoKykgU3RhcnQgdGhlIEhhbGwgU2Vuc29yIEludGVyZmFjZS4KKyAgICAoKykgU3RvcCB0aGUgSGFsbCBTZW5zb3IgSW50ZXJmYWNlLgorICAgICgrKSBTdGFydCB0aGUgSGFsbCBTZW5zb3IgSW50ZXJmYWNlIGFuZCBlbmFibGUgaW50ZXJydXB0cy4KKyAgICAoKykgU3RvcCB0aGUgSGFsbCBTZW5zb3IgSW50ZXJmYWNlIGFuZCBkaXNhYmxlIGludGVycnVwdHMuCisgICAgKCspIFN0YXJ0IHRoZSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgYW5kIGVuYWJsZSBETUEgdHJhbnNmZXJzLgorICAgICgrKSBTdG9wIHRoZSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgYW5kIGRpc2FibGUgRE1BIHRyYW5zZmVycy4KKyAKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gSGFsbCBTZW5zb3IgSW50ZXJmYWNlIGFuZCBjcmVhdGUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgaGFuZGxlCisgICogQHBhcmFtICBzQ29uZmlnIFRJTSBIYWxsIFNlbnNvciBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgVElNX0hhbGxTZW5zb3JfSW5pdFR5cGVEZWYqIHNDb25maWcpCit7CisgIFRJTV9PQ19Jbml0VHlwZURlZiBPQ19Db25maWc7CisgICAgCisgIC8qIENoZWNrIHRoZSBUSU0gaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYoaHRpbSA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9IQUxMX1NFTlNPUl9JTlRFUkZBQ0VfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DT1VOVEVSX01PREUoaHRpbS0+SW5pdC5Db3VudGVyTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLRElWSVNJT05fRElWKGh0aW0tPkluaXQuQ2xvY2tEaXZpc2lvbikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0FVVE9SRUxPQURfUFJFTE9BRChodGltLT5Jbml0LkF1dG9SZWxvYWRQcmVsb2FkKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fSUNfUE9MQVJJVFkoc0NvbmZpZy0+SUMxUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19QUkVTQ0FMRVIoc0NvbmZpZy0+SUMxUHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fSUNfRklMVEVSKHNDb25maWctPklDMUZpbHRlcikpOworCisgIGlmKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHRpbS0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDIGFuZCBETUEgKi8KKyAgICBIQUxfVElNRXhfSGFsbFNlbnNvcl9Nc3BJbml0KGh0aW0pOworICB9CisKKyAgLyogU2V0IHRoZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisgIAorICAvKiBDb25maWd1cmUgdGhlIFRpbWUgYmFzZSBpbiB0aGUgRW5jb2RlciBNb2RlICovCisgIFRJTV9CYXNlX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgJmh0aW0tPkluaXQpOworICAKKyAgLyogQ29uZmlndXJlIHRoZSBDaGFubmVsIDEgYXMgSW5wdXQgQ2hhbm5lbCB0byBpbnRlcmZhY2Ugd2l0aCB0aGUgdGhyZWUgT3V0cHV0cyBvZiB0aGUgIEhhbGwgc2Vuc29yICovCisgIFRJTV9USTFfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnLT5JQzFQb2xhcml0eSwgVElNX0lDU0VMRUNUSU9OX1RSQywgc0NvbmZpZy0+SUMxRmlsdGVyKTsKKyAgCisgIC8qIFJlc2V0IHRoZSBJQzFQU0MgQml0cyAqLworICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgJj0gflRJTV9DQ01SMV9JQzFQU0M7CisgIC8qIFNldCB0aGUgSUMxUFNDIHZhbHVlICovCisgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSB8PSBzQ29uZmlnLT5JQzFQcmVzY2FsZXI7CisgIAorICAvKiBFbmFibGUgdGhlIEhhbGwgc2Vuc29yIGludGVyZmFjZSAoWE9SIGZ1bmN0aW9uIG9mIHRoZSB0aHJlZSBpbnB1dHMpICovCisgIGh0aW0tPkluc3RhbmNlLT5DUjIgfD0gVElNX0NSMl9USTFTOworICAKKyAgLyogU2VsZWN0IHRoZSBUSU1fVFNfVEkxRl9FRCBzaWduYWwgYXMgSW5wdXQgdHJpZ2dlciBmb3IgdGhlIFRJTSAqLworICBodGltLT5JbnN0YW5jZS0+U01DUiAmPSB+VElNX1NNQ1JfVFM7CisgIGh0aW0tPkluc3RhbmNlLT5TTUNSIHw9IFRJTV9UU19USTFGX0VEOworICAKKyAgLyogVXNlIHRoZSBUSU1fVFNfVEkxRl9FRCBzaWduYWwgdG8gcmVzZXQgdGhlIFRJTSBjb3VudGVyIGVhY2ggZWRnZSBkZXRlY3Rpb24gKi8gIAorICBodGltLT5JbnN0YW5jZS0+U01DUiAmPSB+VElNX1NNQ1JfU01TOworICBodGltLT5JbnN0YW5jZS0+U01DUiB8PSBUSU1fU0xBVkVNT0RFX1JFU0VUOworICAKKyAgLyogUHJvZ3JhbSBjaGFubmVsIDIgaW4gUFdNIDIgbW9kZSB3aXRoIHRoZSBkZXNpcmVkIENvbW11dGF0aW9uX0RlbGF5Ki8KKyAgT0NfQ29uZmlnLk9DRmFzdE1vZGUgPSBUSU1fT0NGQVNUX0RJU0FCTEU7CisgIE9DX0NvbmZpZy5PQ0lkbGVTdGF0ZSA9IFRJTV9PQ0lETEVTVEFURV9SRVNFVDsKKyAgT0NfQ29uZmlnLk9DTW9kZSA9IFRJTV9PQ01PREVfUFdNMjsKKyAgT0NfQ29uZmlnLk9DTklkbGVTdGF0ZSA9IFRJTV9PQ05JRExFU1RBVEVfUkVTRVQ7CisgIE9DX0NvbmZpZy5PQ05Qb2xhcml0eSA9IFRJTV9PQ05QT0xBUklUWV9ISUdIOworICBPQ19Db25maWcuT0NQb2xhcml0eSA9IFRJTV9PQ1BPTEFSSVRZX0hJR0g7CisgIE9DX0NvbmZpZy5QdWxzZSA9IHNDb25maWctPkNvbW11dGF0aW9uX0RlbGF5OyAKKyAgICAKKyAgVElNX09DMl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsICZPQ19Db25maWcpOworICAKKyAgLyogU2VsZWN0IE9DMlJFRiBhcyB0cmlnZ2VyIG91dHB1dCBvbiBUUkdPOiB3cml0ZSB0aGUgTU1TIGJpdHMgaW4gdGhlIFRJTXhfQ1IyCisgICAgcmVnaXN0ZXIgdG8gMTAxVSAqLworICBodGltLT5JbnN0YW5jZS0+Q1IyICY9IH5USU1fQ1IyX01NUzsKKyAgaHRpbS0+SW5zdGFuY2UtPkNSMiB8PSBUSU1fVFJHT19PQzJSRUY7IAorICAKKyAgLyogSW5pdGlhbGl6ZSB0aGUgVElNIHN0YXRlKi8KKyAgaHRpbS0+U3RhdGU9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIHRoZSBUSU0gSGFsbCBTZW5zb3IgaW50ZXJmYWNlICAKKyAgKiBAcGFyYW0gIGh0aW0gVElNIEhhbGwgU2Vuc29yIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisgIAorICAvKiBEaXNhYmxlIHRoZSBUSU0gUGVyaXBoZXJhbCBDbG9jayAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKyAgICAKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IEdQSU8sIENMT0NLLCBOVklDICovCisgIEhBTF9USU1FeF9IYWxsU2Vuc29yX01zcERlSW5pdChodGltKTsKKyAgICAKKyAgLyogQ2hhbmdlIFRJTSBzdGF0ZSAqLyAgCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRVNFVDsgCisgIAorICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBIYWxsIFNlbnNvciBNU1AuCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1FeF9IYWxsU2Vuc29yX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNRXhfSGFsbFNlbnNvcl9Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplcyBUSU0gSGFsbCBTZW5zb3IgTVNQLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVElNRXhfSGFsbFNlbnNvcl9Nc3BEZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNRXhfSGFsbFNlbnNvcl9Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBIYWxsIFNlbnNvciBJbnRlcmZhY2UuCisgICogQHBhcmFtICBodGltIFRJTSBIYWxsIFNlbnNvciBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0hBTExfU0VOU09SX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAKKyAgLyogRW5hYmxlIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWwgMQorICAgIChpbiB0aGUgSGFsbCBTZW5zb3IgSW50ZXJmYWNlIHRoZSB0aHJlZSBwb3NzaWJsZSBjaGFubmVscyB0aGF0IGNhbiBiZSB1c2VkIGFyZSBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0hBTk5FTF8yIGFuZCBUSU1fQ0hBTk5FTF8zKSAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9FTkFCTEUpOyAKKyAgCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gSGFsbCBzZW5zb3IgSW50ZXJmYWNlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gSGFsbCBTZW5zb3IgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfSGFsbFNlbnNvcl9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0hBTExfU0VOU09SX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAKKyAgLyogRGlzYWJsZSB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVscyAxVSwgMiBhbmQgMworICAgIChpbiB0aGUgSGFsbCBTZW5zb3IgSW50ZXJmYWNlIHRoZSB0aHJlZSBwb3NzaWJsZSBjaGFubmVscyB0aGF0IGNhbiBiZSB1c2VkIGFyZSBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0hBTk5FTF8yIGFuZCBUSU1fQ0hBTk5FTF8zKSAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9ESVNBQkxFKTsgCisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBIYWxsIFNlbnNvciBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreyAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9IQUxMX1NFTlNPUl9JTlRFUkZBQ0VfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIEVuYWJsZSB0aGUgY2FwdHVyZSBjb21wYXJlIEludGVycnVwdHMgMSBldmVudCAqLworICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAKKyAgLyogRW5hYmxlIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWwgMQorICAgIChpbiB0aGUgSGFsbCBTZW5zb3IgSW50ZXJmYWNlIHRoZSB0aHJlZSBwb3NzaWJsZSBjaGFubmVscyB0aGF0IGNhbiBiZSB1c2VkIGFyZSBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0hBTk5FTF8yIGFuZCBUSU1fQ0hBTk5FTF8zKSAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9FTkFCTEUpOyAgCisgIAorICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIEhhbGwgU2Vuc29yIEludGVyZmFjZSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9IQUxMX1NFTlNPUl9JTlRFUkZBQ0VfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIERpc2FibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbCAxCisgICAgKGluIHRoZSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgdGhlIHRocmVlIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlIFRJTV9DSEFOTkVMXzEsIFRJTV9DSEFOTkVMXzIgYW5kIFRJTV9DSEFOTkVMXzMpICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0RJU0FCTEUpOyAKKyAgCisgIC8qIERpc2FibGUgdGhlIGNhcHR1cmUgY29tcGFyZSBJbnRlcnJ1cHRzIGV2ZW50ICovCisgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgaW4gRE1BIG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBIYWxsIFNlbnNvciBoYW5kbGUKKyAgKiBAcGFyYW0gIHBEYXRhIFRoZSBkZXN0aW5hdGlvbiBCdWZmZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIExlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBUSU0gcGVyaXBoZXJhbCB0byBtZW1vcnkuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfSGFsbFNlbnNvcl9TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90ICpwRGF0YSwgdWludDE2X3QgTGVuZ3RoKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0hBTExfU0VOU09SX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAKKyAgIGlmKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX0JVU1kpKQorICB7CisgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorICBlbHNlIGlmKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKSkKKyAgeworICAgIGlmKCgodWludDMyX3QpcERhdGEgPT0gMFUgKSAmJiAoTGVuZ3RoID4gMFUpKSAKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisgICAgfQorICB9CisgIC8qIEVuYWJsZSB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVsIDEKKyAgICAoaW4gdGhlIEhhbGwgU2Vuc29yIEludGVyZmFjZSB0aGUgdGhyZWUgcG9zc2libGUgY2hhbm5lbHMgdGhhdCBjYW4gYmUgdXNlZCBhcmUgVElNX0NIQU5ORUxfMSwgVElNX0NIQU5ORUxfMiBhbmQgVElNX0NIQU5ORUxfMykgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRU5BQkxFKTsgCisgIAorICAvKiBTZXQgdGhlIERNQSBJbnB1dCBDYXB0dXJlIDEgQ2FsbGJhY2sgKi8KKyAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUNwbHQ7ICAgICAKKyAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKyAgCisgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgZm9yIENhcHR1cmUgMVUqLworICBIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1IxLCAodWludDMyX3QpcERhdGEsIExlbmd0aCk7ICAgIAorICAKKyAgLyogRW5hYmxlIHRoZSBjYXB0dXJlIGNvbXBhcmUgMSBJbnRlcnJ1cHQgKi8KKyAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzEpOworIAorICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIEhhbGwgU2Vuc29yIEludGVyZmFjZSBpbiBETUEgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSEFMTF9TRU5TT1JfSU5URVJGQUNFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIAorICAvKiBEaXNhYmxlIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWwgMQorICAgIChpbiB0aGUgSGFsbCBTZW5zb3IgSW50ZXJmYWNlIHRoZSB0aHJlZSBwb3NzaWJsZSBjaGFubmVscyB0aGF0IGNhbiBiZSB1c2VkIGFyZSBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0hBTk5FTF8yIGFuZCBUSU1fQ0hBTk5FTF8zKSAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9ESVNBQkxFKTsgCisgCisgIAorICAvKiBEaXNhYmxlIHRoZSBjYXB0dXJlIGNvbXBhcmUgSW50ZXJydXB0cyAxIGV2ZW50ICovCisgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMSk7CisgCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisgIAorLyoqIEBkZWZncm91cCBUSU1FeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFRpbWVyIENvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUgZnVuY3Rpb25zCisgICogIEBicmllZiAgIFRpbWVyIENvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbSAgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgVGltZXIgQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZSBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgWy4uXSAgCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAoKykgU3RhcnQgdGhlIENvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUuCisgICAgKCspIFN0b3AgdGhlIENvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUuCisgICAgKCspIFN0YXJ0IHRoZSBDb21wbGVtZW50YXJ5IE91dHB1dCBDb21wYXJlIGFuZCBlbmFibGUgaW50ZXJydXB0cy4KKyAgICAoKykgU3RvcCB0aGUgQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzLgorICAgICgrKSBTdGFydCB0aGUgQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZSBhbmQgZW5hYmxlIERNQSB0cmFuc2ZlcnMuCisgICAgKCspIFN0b3AgdGhlIENvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUgYW5kIGRpc2FibGUgRE1BIHRyYW5zZmVycy4KKyAgICAgICAgICAgICAgIAorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKyAgCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHNpZ25hbCBnZW5lcmF0aW9uIG9uIHRoZSBjb21wbGVtZW50YXJ5CisgICogICAgICAgICBvdXRwdXQuCisgICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUgIAorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PQ05fU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOyAKKyAgCisgICAgIC8qIEVuYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGNoYW5uZWwgTiAqLworICAgICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0VOQUJMRSk7CisgICAgCisgIC8qIEVuYWJsZSB0aGUgTWFpbiBPdXB1dCAqLworICAgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfSAKKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHNpZ25hbCBnZW5lcmF0aW9uIG9uIHRoZSBjb21wbGVtZW50YXJ5CisgICogICAgICAgICBvdXRwdXQuCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZGlzYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09DTl9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreyAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7IAorICAKKyAgICAvKiBEaXNhYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgY2hhbm5lbCBOICovCisgIFRJTV9DQ3hOQ2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeE5fRElTQUJMRSk7CisgICAgCisgIC8qIERpc2FibGUgdGhlIE1haW4gT3VwdXQgKi8KKyAgICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30gCisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgc2lnbmFsIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUgCisgICogICAgICAgICBvbiB0aGUgY29tcGxlbWVudGFyeSBvdXRwdXQuCisgICogQHBhcmFtICBodGltIFRJTSBPQyBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT0NOX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWE5fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsgCisgIAorICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeyAgICAgICAKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIE91dHB1dCBDb21wYXJlIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MxKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIE91dHB1dCBDb21wYXJlIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOgorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIE91dHB1dCBDb21wYXJlIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MzKTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9IAorICAKKyAgLyogRW5hYmxlIHRoZSBUSU0gQnJlYWsgaW50ZXJydXB0ICovCisgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0JSRUFLKTsKKyAgCisgIC8qIEVuYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGNoYW5uZWwgTiAqLworICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0VOQUJMRSk7CisgIAorICAvKiBFbmFibGUgdGhlIE1haW4gT3VwdXQgKi8KKyAgICBfX0hBTF9USU1fTU9FX0VOQUJMRShodGltKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30gCisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZSAKKyAgKiAgICAgICAgIG9uIHRoZSBjb21wbGVtZW50YXJ5IG91dHB1dC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBkaXNhYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT0NOX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHVpbnQzMl90IHRtcGNjZXIgPSAwVTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWE5fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsgCisgIAorICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeyAgICAgICAKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIE91dHB1dCBDb21wYXJlIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7CisgICAgfQorICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MzKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgZGVmYXVsdDoKKyAgICBicmVhazsgCisgIH0KKyAgICAKKyAgLyogRGlzYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGNoYW5uZWwgTiAqLworICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0RJU0FCTEUpOworICAgIAorICAvKiBEaXNhYmxlIHRoZSBUSU0gQnJlYWsgaW50ZXJydXB0IChvbmx5IGlmIG5vIG1vcmUgY2hhbm5lbCBpcyBhY3RpdmUpICovCisgIHRtcGNjZXIgPSBodGltLT5JbnN0YW5jZS0+Q0NFUjsKKyAgaWYgKCh0bXBjY2VyICYgKFRJTV9DQ0VSX0NDMU5FIHwgVElNX0NDRVJfQ0MyTkUgfCBUSU1fQ0NFUl9DQzNORSkpID09IFJFU0VUKQorICB7CisgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0JSRUFLKTsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIE1haW4gT3VwdXQgKi8KKyAgX19IQUxfVElNX01PRV9ESVNBQkxFKGh0aW0pOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9IAorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHNpZ25hbCBnZW5lcmF0aW9uIGluIERNQSBtb2RlIAorICAqICAgICAgICAgb24gdGhlIGNvbXBsZW1lbnRhcnkgb3V0cHV0LgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqIEBwYXJhbSAgcERhdGEgVGhlIHNvdXJjZSBCdWZmZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIExlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBtZW1vcnkgdG8gVElNIHBlcmlwaGVyYWwKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PQ05fU3RhcnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCAqcERhdGEsIHVpbnQxNl90IExlbmd0aCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7IAorICAKKyAgaWYoKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfQlVTWSkpCisgIHsKKyAgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisgIGVsc2UgaWYoKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVBRFkpKQorICB7CisgICAgaWYoKCh1aW50MzJfdClwRGF0YSA9PSAwVSApICYmIChMZW5ndGggPiAwVSkpIAorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKyAgICB9CisgIH0gICAgCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7ICAgICAgCisgICAgICAvKiBTZXQgdGhlIERNQSBQZXJpb2QgZWxhcHNlZCBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUNwbHQ7CisgICAgIAorICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0sICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMSwgTGVuZ3RoKTsKKyAgICAgIAorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIFBlcmlvZCBlbGFwc2VkIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsKKyAgICAgCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKyAgICAgIAorICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSwgKHVpbnQzMl90KXBEYXRhLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1IyLCBMZW5ndGgpOworICAgICAgCisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOworICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgUGVyaW9kIGVsYXBzZWQgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworICAgICAgCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLCAodWludDMyX3QpcERhdGEsICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjMsTGVuZ3RoKTsKKyAgICAgIAorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MzKTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgY2hhbm5lbCBOICovCisgIFRJTV9DQ3hOQ2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeE5fRU5BQkxFKTsKKyAgCisgIC8qIEVuYWJsZSB0aGUgTWFpbiBPdXB1dCAqLworICBfX0hBTF9USU1fTU9FX0VOQUJMRShodGltKTsKKyAgCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOyAKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHNpZ25hbCBnZW5lcmF0aW9uIGluIERNQSBtb2RlIAorICAqICAgICAgICAgb24gdGhlIGNvbXBsZW1lbnRhcnkgb3V0cHV0LgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGRpc2FibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PQ05fU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOyAKKyAgCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7ICAgICAgIAorICAgICAgLyogRGlzYWJsZSB0aGUgVElNIE91dHB1dCBDb21wYXJlIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzEpOworICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIE91dHB1dCBDb21wYXJlIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOworICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIE91dHB1dCBDb21wYXJlIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzMpOworICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9IAorICAKKyAgLyogRGlzYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGNoYW5uZWwgTiAqLworICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0RJU0FCTEUpOworICAKKyAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXB1dCAqLworICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7CisgIAorICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworICAKKyAgLyogQ2hhbmdlIHRoZSBodGltIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgVGltZXIgQ29tcGxlbWVudGFyeSBQV00gZnVuY3Rpb25zCisgICogQGJyaWVmICAgIFRpbWVyIENvbXBsZW1lbnRhcnkgUFdNIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0gICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICMjIyMjIFRpbWVyIENvbXBsZW1lbnRhcnkgUFdNIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICBbLi5dICAKKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICgrKSBTdGFydCB0aGUgQ29tcGxlbWVudGFyeSBQV00uCisgICAgKCspIFN0b3AgdGhlIENvbXBsZW1lbnRhcnkgUFdNLgorICAgICgrKSBTdGFydCB0aGUgQ29tcGxlbWVudGFyeSBQV00gYW5kIGVuYWJsZSBpbnRlcnJ1cHRzLgorICAgICgrKSBTdG9wIHRoZSBDb21wbGVtZW50YXJ5IFBXTSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzLgorICAgICgrKSBTdGFydCB0aGUgQ29tcGxlbWVudGFyeSBQV00gYW5kIGVuYWJsZSBETUEgdHJhbnNmZXJzLgorICAgICgrKSBTdG9wIHRoZSBDb21wbGVtZW50YXJ5IFBXTSBhbmQgZGlzYWJsZSBETUEgdHJhbnNmZXJzLgorICAgICgrKSBTdGFydCB0aGUgQ29tcGxlbWVudGFyeSBJbnB1dCBDYXB0dXJlIG1lYXN1cmVtZW50LgorICAgICgrKSBTdG9wIHRoZSBDb21wbGVtZW50YXJ5IElucHV0IENhcHR1cmUuCisgICAgKCspIFN0YXJ0IHRoZSBDb21wbGVtZW50YXJ5IElucHV0IENhcHR1cmUgYW5kIGVuYWJsZSBpbnRlcnJ1cHRzLgorICAgICgrKSBTdG9wIHRoZSBDb21wbGVtZW50YXJ5IElucHV0IENhcHR1cmUgYW5kIGRpc2FibGUgaW50ZXJydXB0cy4KKyAgICAoKykgU3RhcnQgdGhlIENvbXBsZW1lbnRhcnkgSW5wdXQgQ2FwdHVyZSBhbmQgZW5hYmxlIERNQSB0cmFuc2ZlcnMuCisgICAgKCspIFN0b3AgdGhlIENvbXBsZW1lbnRhcnkgSW5wdXQgQ2FwdHVyZSBhbmQgZGlzYWJsZSBETUEgdHJhbnNmZXJzLgorICAgICgrKSBTdGFydCB0aGUgQ29tcGxlbWVudGFyeSBPbmUgUHVsc2UgZ2VuZXJhdGlvbi4KKyAgICAoKykgU3RvcCB0aGUgQ29tcGxlbWVudGFyeSBPbmUgUHVsc2UuCisgICAgKCspIFN0YXJ0IHRoZSBDb21wbGVtZW50YXJ5IE9uZSBQdWxzZSBhbmQgZW5hYmxlIGludGVycnVwdHMuCisgICAgKCspIFN0b3AgdGhlIENvbXBsZW1lbnRhcnkgT25lIFB1bHNlIGFuZCBkaXNhYmxlIGludGVycnVwdHMuCisgICAgICAgICAgICAgICAKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBQV00gc2lnbmFsIGdlbmVyYXRpb24gb24gdGhlIGNvbXBsZW1lbnRhcnkgb3V0cHV0LgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X1BXTU5fU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOyAKKyAgCisgIC8qIEVuYWJsZSB0aGUgY29tcGxlbWVudGFyeSBQV00gb3V0cHV0ICAqLworICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0VOQUJMRSk7CisgIAorICAvKiBFbmFibGUgdGhlIE1haW4gT3VwdXQgKi8KKyAgX19IQUxfVElNX01PRV9FTkFCTEUoaHRpbSk7CisgIAorICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30gCisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFBXTSBzaWduYWwgZ2VuZXJhdGlvbiBvbiB0aGUgY29tcGxlbWVudGFyeSBvdXRwdXQuCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZGlzYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X1BXTU5fU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOyAKKyAgCisgIC8qIERpc2FibGUgdGhlIGNvbXBsZW1lbnRhcnkgUFdNIG91dHB1dCAgKi8KKyAgVElNX0NDeE5DaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4Tl9ESVNBQkxFKTsgIAorICAKKyAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXB1dCAqLworICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7CisgIAorICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfSAKKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFBXTSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZSBvbiB0aGUgCisgICogICAgICAgICBjb21wbGVtZW50YXJ5IG91dHB1dC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBkaXNhYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfUFdNTl9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7IAorICAKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsgICAgICAgCisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisgICAgfQorICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7CisgICAgfQorICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMyk7CisgICAgfQorICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfSAKKyAgCisgIC8qIEVuYWJsZSB0aGUgVElNIEJyZWFrIGludGVycnVwdCAqLworICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9CUkVBSyk7CisgIAorICAvKiBFbmFibGUgdGhlIGNvbXBsZW1lbnRhcnkgUFdNIG91dHB1dCAgKi8KKyAgVElNX0NDeE5DaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4Tl9FTkFCTEUpOworICAKKyAgLyogRW5hYmxlIHRoZSBNYWluIE91cHV0ICovCisgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOworICAKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9IAorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBQV00gc2lnbmFsIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUgb24gdGhlIAorICAqICAgICAgICAgY29tcGxlbWVudGFyeSBvdXRwdXQuCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZGlzYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X1BXTU5fU3RvcF9JVCAoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHVpbnQzMl90IHRtcGNjZXIgPSAwVTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWE5fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsgCisKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsgICAgICAgCisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MxKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOworICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMyk7CisgICAgfQorICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICBicmVhazsgCisgIH0KKyAgCisgIC8qIERpc2FibGUgdGhlIGNvbXBsZW1lbnRhcnkgUFdNIG91dHB1dCAgKi8KKyAgVElNX0NDeE5DaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4Tl9ESVNBQkxFKTsKKyAgCisgIC8qIERpc2FibGUgdGhlIFRJTSBCcmVhayBpbnRlcnJ1cHQgKG9ubHkgaWYgbm8gbW9yZSBjaGFubmVsIGlzIGFjdGl2ZSkgKi8KKyAgdG1wY2NlciA9IGh0aW0tPkluc3RhbmNlLT5DQ0VSOworICBpZiAoKHRtcGNjZXIgJiAoVElNX0NDRVJfQ0MxTkUgfCBUSU1fQ0NFUl9DQzJORSB8IFRJTV9DQ0VSX0NDM05FKSkgPT0gUkVTRVQpCisgIHsKKyAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQlJFQUspOworICB9CisgIAorICAvKiBEaXNhYmxlIHRoZSBNYWluIE91cHV0ICovCisgIF9fSEFMX1RJTV9NT0VfRElTQUJMRShodGltKTsKKyAgCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9IAorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIFBXTSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBETUEgbW9kZSBvbiB0aGUgCisgICogICAgICAgICBjb21wbGVtZW50YXJ5IG91dHB1dAorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqIEBwYXJhbSAgcERhdGEgVGhlIHNvdXJjZSBCdWZmZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIExlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBtZW1vcnkgdG8gVElNIHBlcmlwaGVyYWwKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9QV01OX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhLCB1aW50MTZfdCBMZW5ndGgpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOyAKKyAgCisgIGlmKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX0JVU1kpKQorICB7CisgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorICBlbHNlIGlmKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKSkKKyAgeworICAgIGlmKCgodWludDMyX3QpcERhdGEgPT0gMFUgKSAmJiAoTGVuZ3RoID4gMFUpKSAKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisgICAgfQorICB9ICAgIAorICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeyAgICAgIAorICAgICAgLyogU2V0IHRoZSBETUEgUGVyaW9kIGVsYXBzZWQgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworICAgICAgCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLCAodWludDMyX3QpcERhdGEsICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjEsIExlbmd0aCk7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMSk7CisgICAgfQorICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBQZXJpb2QgZWxhcHNlZCBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUNwbHQ7CisgICAgIAorICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0sICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMiwgTGVuZ3RoKTsKKyAgICAgIAorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MyKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIFBlcmlvZCBlbGFwc2VkIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsKKyAgICAgCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKyAgICAgIAorICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSwgKHVpbnQzMl90KXBEYXRhLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1IzLExlbmd0aCk7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMyk7CisgICAgfQorICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgY29tcGxlbWVudGFyeSBQV00gb3V0cHV0ICAqLworICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0VOQUJMRSk7CisgICAgCisgIC8qIEVuYWJsZSB0aGUgTWFpbiBPdXB1dCAqLworICBfX0hBTF9USU1fTU9FX0VOQUJMRShodGltKTsKKyAgCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOyAKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIFBXTSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBETUEgbW9kZSBvbiB0aGUgY29tcGxlbWVudGFyeQorICAqICAgICAgICAgb3V0cHV0CisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZGlzYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X1BXTU5fU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOyAKKyAgCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7ICAgICAgIAorICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzEpOworICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOworICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzMpOworICAgIH0KKyAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0gCisgIAorICAvKiBEaXNhYmxlIHRoZSBjb21wbGVtZW50YXJ5IFBXTSBvdXRwdXQgKi8KKyAgVElNX0NDeE5DaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4Tl9ESVNBQkxFKTsKKyAgICAgCisgIC8qIERpc2FibGUgdGhlIE1haW4gT3VwdXQgKi8KKyAgX19IQUxfVElNX01PRV9ESVNBQkxFKGh0aW0pOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisgIAorICAvKiBDaGFuZ2UgdGhlIGh0aW0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworICAKKy8qKiBAZGVmZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBUaW1lciBDb21wbGVtZW50YXJ5IE9uZSBQdWxzZSBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgVGltZXIgQ29tcGxlbWVudGFyeSBPbmUgUHVsc2UgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbSAgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAjIyMjIyBUaW1lciBDb21wbGVtZW50YXJ5IE9uZSBQdWxzZSBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgWy4uXSAgCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAoKykgU3RhcnQgdGhlIENvbXBsZW1lbnRhcnkgT25lIFB1bHNlIGdlbmVyYXRpb24uCisgICAgKCspIFN0b3AgdGhlIENvbXBsZW1lbnRhcnkgT25lIFB1bHNlLgorICAgICgrKSBTdGFydCB0aGUgQ29tcGxlbWVudGFyeSBPbmUgUHVsc2UgYW5kIGVuYWJsZSBpbnRlcnJ1cHRzLgorICAgICgrKSBTdG9wIHRoZSBDb21wbGVtZW50YXJ5IE9uZSBQdWxzZSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzLgorICAgICAgICAgICAgICAgCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIE9uZSBQdWxzZSBzaWduYWwgZ2VuZXJhdGlvbiBvbiB0aGUgY29tcGxlbWV0YXJ5IAorICAqICAgICAgICAgb3V0cHV0LgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT25lIFB1bHNlIGhhbmRsZQorICAqIEBwYXJhbSAgT3V0cHV0Q2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT25lUHVsc2VOX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBPdXRwdXRDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWE5fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIE91dHB1dENoYW5uZWwpKTsgCisgIAorICAvKiBFbmFibGUgdGhlIGNvbXBsZW1lbnRhcnkgT25lIFB1bHNlIG91dHB1dCAqLworICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIE91dHB1dENoYW5uZWwsIFRJTV9DQ3hOX0VOQUJMRSk7IAorICAKKyAgLyogRW5hYmxlIHRoZSBNYWluIE91cHV0ICovCisgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gT25lIFB1bHNlIHNpZ25hbCBnZW5lcmF0aW9uIG9uIHRoZSBjb21wbGVtZW50YXJ5IAorICAqICAgICAgICAgb3V0cHV0LgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT25lIFB1bHNlIGhhbmRsZQorICAqIEBwYXJhbSAgT3V0cHV0Q2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBkaXNhYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09uZVB1bHNlTl9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBPdXRwdXRDaGFubmVsKQoreworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgT3V0cHV0Q2hhbm5lbCkpOyAKKworICAvKiBEaXNhYmxlIHRoZSBjb21wbGVtZW50YXJ5IE9uZSBQdWxzZSBvdXRwdXQgKi8KKyAgVElNX0NDeE5DaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBPdXRwdXRDaGFubmVsLCBUSU1fQ0N4Tl9ESVNBQkxFKTsKKyAgCisgIC8qIERpc2FibGUgdGhlIE1haW4gT3VwdXQgKi8KKyAgX19IQUxfVElNX01PRV9ESVNBQkxFKGh0aW0pOworICAKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsgCisgICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIE9uZSBQdWxzZSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZSBvbiB0aGUKKyAgKiAgICAgICAgIGNvbXBsZW1lbnRhcnkgY2hhbm5lbC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE9uZSBQdWxzZSBoYW5kbGUKKyAgKiBAcGFyYW0gIE91dHB1dENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09uZVB1bHNlTl9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBPdXRwdXRDaGFubmVsKSk7IAorCisgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCAqLworICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAKKyAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0ICovCisgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7CisgIAorICAvKiBFbmFibGUgdGhlIGNvbXBsZW1lbnRhcnkgT25lIFB1bHNlIG91dHB1dCAqLworICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIE91dHB1dENoYW5uZWwsIFRJTV9DQ3hOX0VOQUJMRSk7IAorICAKKyAgLyogRW5hYmxlIHRoZSBNYWluIE91cHV0ICovCisgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorICAKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBPbmUgUHVsc2Ugc2lnbmFsIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUgb24gdGhlCisgICogICAgICAgICBjb21wbGVtZW50YXJ5IGNoYW5uZWwuCisgICogQHBhcmFtICBodGltIFRJTSBPbmUgUHVsc2UgaGFuZGxlCisgICogQHBhcmFtICBPdXRwdXRDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGRpc2FibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT25lUHVsc2VOX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IE91dHB1dENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgT3V0cHV0Q2hhbm5lbCkpOyAKKworICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0ICovCisgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAKKyAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCAqLworICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKyAgCisgIC8qIERpc2FibGUgdGhlIGNvbXBsZW1lbnRhcnkgT25lIFB1bHNlIG91dHB1dCAqLworICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIE91dHB1dENoYW5uZWwsIFRJTV9DQ3hOX0RJU0FCTEUpOworICAKKyAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXB1dCAqLworICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7CisgIAorICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOyAgCisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisvKiogQGRlZmdyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDUgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbSAgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICBbLi5dICAKKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICgrKSBDb25maWd1cmUgdGhlIGNvbW11dGF0aW9uIGV2ZW50IGluIGNhc2Ugb2YgdXNlIG9mIHRoZSBIYWxsIHNlbnNvciBpbnRlcmZhY2UuCisgICAgICAoKykgQ29uZmlndXJlIE91dHB1dCBjaGFubmVscyBmb3IgT0MgYW5kIFBXTSBtb2RlLiAKKworICAgICAgKCspIENvbmZpZ3VyZSBDb21wbGVtZW50YXJ5IGNoYW5uZWxzLCBicmVhayBmZWF0dXJlcyBhbmQgZGVhZCB0aW1lLgorICAgICAgKCspIENvbmZpZ3VyZSBNYXN0ZXIgc3luY2hyb25pemF0aW9uLgorICAgICAgKCspIENvbmZpZ3VyZSB0aW1lciByZW1hcHBpbmcgY2FwYWJpbGl0aWVzLgorICAgICAgKCspIEVuYWJsZSBvciBkaXNhYmxlIGNoYW5uZWwgZ3JvdXBpbmcKKyAgICAgIAorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJTSBjb21tdXRhdGlvbiBldmVudCBzZXF1ZW5jZS4KKyAgKiBAbm90ZSB0aGlzIGZ1bmN0aW9uIGlzIG1hbmRhdG9yeSB0byB1c2UgdGhlIGNvbW11dGF0aW9uIGV2ZW50IGluIG9yZGVyIHRvIAorICAqICAgICAgICB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gYXQgZWFjaCBjb21tdXRhdGlvbiBkZXRlY3Rpb24gb24gdGhlIFRSR0kgaW5wdXQgb2YgdGhlIFRpbWVyLAorICAqICAgICAgICB0aGUgdHlwaWNhbCB1c2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHdpdGggdGhlIHVzZSBvZiBhbm90aGVyIFRpbWVyKGludGVyZmFjZSBUaW1lcikgCisgICogICAgICAgIGNvbmZpZ3VyZWQgaW4gSGFsbCBzZW5zb3IgaW50ZXJmYWNlLCB0aGlzIGludGVyZmFjZSBUaW1lciB3aWxsIGdlbmVyYXRlIHRoZSAKKyAgKiAgICAgICAgY29tbXV0YXRpb24gYXQgaXRzIFRSR08gb3V0cHV0IChjb25uZWN0ZWQgdG8gVGltZXIgdXNlZCBpbiB0aGlzIGZ1bmN0aW9uKSBlYWNoIHRpbWUgCisgICogICAgICAgIHRoZSBUSTEgb2YgdGhlIEludGVyZmFjZSBUaW1lciBkZXRlY3QgYSBjb21tdXRhdGlvbiBhdCBpdHMgaW5wdXQgVEkxLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBJbnB1dFRyaWdnZXIgdGhlIEludGVybmFsIHRyaWdnZXIgY29ycmVzcG9uZGluZyB0byB0aGUgVGltZXIgSW50ZXJmYWNpbmcgd2l0aCB0aGUgSGFsbCBzZW5zb3IKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMDogSW50ZXJuYWwgdHJpZ2dlciAwIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIxOiBJbnRlcm5hbCB0cmlnZ2VyIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjI6IEludGVybmFsIHRyaWdnZXIgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMzogSW50ZXJuYWwgdHJpZ2dlciAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19OT05FOiBObyB0cmlnZ2VyIGlzIG5lZWRlZCAKKyAgKiBAcGFyYW0gIENvbW11dGF0aW9uU291cmNlIHRoZSBDb21tdXRhdGlvbiBFdmVudCBzb3VyY2UKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ09NTVVUQVRJT05fVFJHSTogQ29tbXV0YXRpb24gc291cmNlIGlzIHRoZSBUUkdJIG9mIHRoZSBJbnRlcmZhY2UgVGltZXIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NPTU1VVEFUSU9OX1NPRlRXQVJFOiAgQ29tbXV0YXRpb24gc291cmNlIGlzIHNldCBieSBzb2Z0d2FyZSB1c2luZyB0aGUgQ09NRyBiaXQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9Db25maWdDb21tdXRhdGlvbkV2ZW50KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCAgSW5wdXRUcmlnZ2VyLCB1aW50MzJfdCAgQ29tbXV0YXRpb25Tb3VyY2UpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ09NTVVUQVRJT05fRVZFTlRfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlRFUk5BTF9UUklHR0VSRVZFTlRfU0VMRUNUSU9OKElucHV0VHJpZ2dlcikpOworICAKKyAgX19IQUxfTE9DSyhodGltKTsKKyAgCisgIGlmICgoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIwKSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIxKSB8fAorICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMikgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMykpCisgIHsgICAgCisgICAgLyogU2VsZWN0IHRoZSBJbnB1dCB0cmlnZ2VyICovCisgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJj0gflRJTV9TTUNSX1RTOworICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSIHw9IElucHV0VHJpZ2dlcjsKKyAgfQorICAgIAorICAvKiBTZWxlY3QgdGhlIENhcHR1cmUgQ29tcGFyZSBwcmVsb2FkIGZlYXR1cmUgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkNSMiB8PSBUSU1fQ1IyX0NDUEM7CisgIC8qIFNlbGVjdCB0aGUgQ29tbXV0YXRpb24gZXZlbnQgc291cmNlICovCisgIGh0aW0tPkluc3RhbmNlLT5DUjIgJj0gflRJTV9DUjJfQ0NVUzsKKyAgaHRpbS0+SW5zdGFuY2UtPkNSMiB8PSBDb21tdXRhdGlvblNvdXJjZTsKKyAgICAKKyAgX19IQUxfVU5MT0NLKGh0aW0pOworICAKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJTSBjb21tdXRhdGlvbiBldmVudCBzZXF1ZW5jZSB3aXRoIGludGVycnVwdC4KKyAgKiBAbm90ZSB0aGlzIGZ1bmN0aW9uIGlzIG1hbmRhdG9yeSB0byB1c2UgdGhlIGNvbW11dGF0aW9uIGV2ZW50IGluIG9yZGVyIHRvIAorICAqICAgICAgICB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gYXQgZWFjaCBjb21tdXRhdGlvbiBkZXRlY3Rpb24gb24gdGhlIFRSR0kgaW5wdXQgb2YgdGhlIFRpbWVyLAorICAqICAgICAgICB0aGUgdHlwaWNhbCB1c2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHdpdGggdGhlIHVzZSBvZiBhbm90aGVyIFRpbWVyKGludGVyZmFjZSBUaW1lcikgCisgICogICAgICAgIGNvbmZpZ3VyZWQgaW4gSGFsbCBzZW5zb3IgaW50ZXJmYWNlLCB0aGlzIGludGVyZmFjZSBUaW1lciB3aWxsIGdlbmVyYXRlIHRoZSAKKyAgKiAgICAgICAgY29tbXV0YXRpb24gYXQgaXRzIFRSR08gb3V0cHV0IChjb25uZWN0ZWQgdG8gVGltZXIgdXNlZCBpbiB0aGlzIGZ1bmN0aW9uKSBlYWNoIHRpbWUgCisgICogICAgICAgIHRoZSBUSTEgb2YgdGhlIEludGVyZmFjZSBUaW1lciBkZXRlY3QgYSBjb21tdXRhdGlvbiBhdCBpdHMgaW5wdXQgVEkxLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBJbnB1dFRyaWdnZXIgdGhlIEludGVybmFsIHRyaWdnZXIgY29ycmVzcG9uZGluZyB0byB0aGUgVGltZXIgSW50ZXJmYWNpbmcgd2l0aCB0aGUgSGFsbCBzZW5zb3IKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMDogSW50ZXJuYWwgdHJpZ2dlciAwIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIxOiBJbnRlcm5hbCB0cmlnZ2VyIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjI6IEludGVybmFsIHRyaWdnZXIgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMzogSW50ZXJuYWwgdHJpZ2dlciAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19OT05FOiBObyB0cmlnZ2VyIGlzIG5lZWRlZCAKKyAgKiBAcGFyYW0gIENvbW11dGF0aW9uU291cmNlIHRoZSBDb21tdXRhdGlvbiBFdmVudCBzb3VyY2UKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ09NTVVUQVRJT05fVFJHSTogQ29tbXV0YXRpb24gc291cmNlIGlzIHRoZSBUUkdJIG9mIHRoZSBJbnRlcmZhY2UgVGltZXIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NPTU1VVEFUSU9OX1NPRlRXQVJFOiAgQ29tbXV0YXRpb24gc291cmNlIGlzIHNldCBieSBzb2Z0d2FyZSB1c2luZyB0aGUgQ09NRyBiaXQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9Db25maWdDb21tdXRhdGlvbkV2ZW50X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCAgSW5wdXRUcmlnZ2VyLCB1aW50MzJfdCAgQ29tbXV0YXRpb25Tb3VyY2UpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ09NTVVUQVRJT05fRVZFTlRfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlRFUk5BTF9UUklHR0VSRVZFTlRfU0VMRUNUSU9OKElucHV0VHJpZ2dlcikpOworICAKKyAgX19IQUxfTE9DSyhodGltKTsKKyAgCisgIGlmICgoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIwKSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIxKSB8fAorICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMikgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMykpCisgIHsgICAgCisgICAgLyogU2VsZWN0IHRoZSBJbnB1dCB0cmlnZ2VyICovCisgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJj0gflRJTV9TTUNSX1RTOworICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSIHw9IElucHV0VHJpZ2dlcjsKKyAgfQorICAKKyAgLyogU2VsZWN0IHRoZSBDYXB0dXJlIENvbXBhcmUgcHJlbG9hZCBmZWF0dXJlICovCisgIGh0aW0tPkluc3RhbmNlLT5DUjIgfD0gVElNX0NSMl9DQ1BDOworICAvKiBTZWxlY3QgdGhlIENvbW11dGF0aW9uIGV2ZW50IHNvdXJjZSAqLworICBodGltLT5JbnN0YW5jZS0+Q1IyICY9IH5USU1fQ1IyX0NDVVM7CisgIGh0aW0tPkluc3RhbmNlLT5DUjIgfD0gQ29tbXV0YXRpb25Tb3VyY2U7CisgICAgCisgIC8qIEVuYWJsZSB0aGUgQ29tbXV0YXRpb24gSW50ZXJydXB0IFJlcXVlc3QgKi8KKyAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ09NKTsKKworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVElNIGNvbW11dGF0aW9uIGV2ZW50IHNlcXVlbmNlIHdpdGggRE1BLgorICAqIEBub3RlIHRoaXMgZnVuY3Rpb24gaXMgbWFuZGF0b3J5IHRvIHVzZSB0aGUgY29tbXV0YXRpb24gZXZlbnQgaW4gb3JkZXIgdG8gCisgICogICAgICAgIHVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBhdCBlYWNoIGNvbW11dGF0aW9uIGRldGVjdGlvbiBvbiB0aGUgVFJHSSBpbnB1dCBvZiB0aGUgVGltZXIsCisgICogICAgICAgIHRoZSB0eXBpY2FsIHVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgd2l0aCB0aGUgdXNlIG9mIGFub3RoZXIgVGltZXIoaW50ZXJmYWNlIFRpbWVyKSAKKyAgKiAgICAgICAgY29uZmlndXJlZCBpbiBIYWxsIHNlbnNvciBpbnRlcmZhY2UsIHRoaXMgaW50ZXJmYWNlIFRpbWVyIHdpbGwgZ2VuZXJhdGUgdGhlIAorICAqICAgICAgICBjb21tdXRhdGlvbiBhdCBpdHMgVFJHTyBvdXRwdXQgKGNvbm5lY3RlZCB0byBUaW1lciB1c2VkIGluIHRoaXMgZnVuY3Rpb24pIGVhY2ggdGltZSAKKyAgKiAgICAgICAgdGhlIFRJMSBvZiB0aGUgSW50ZXJmYWNlIFRpbWVyIGRldGVjdCBhIGNvbW11dGF0aW9uIGF0IGl0cyBpbnB1dCBUSTEuCisgICogQG5vdGUgVGhlIHVzZXIgc2hvdWxkIGNvbmZpZ3VyZSB0aGUgRE1BIGluIGhpcyBvd24gc29mdHdhcmUsIGluIFRoaXMgZnVuY3Rpb24gb25seSB0aGUgQ09NREUgYml0IGlzIHNldAorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBJbnB1dFRyaWdnZXIgdGhlIEludGVybmFsIHRyaWdnZXIgY29ycmVzcG9uZGluZyB0byB0aGUgVGltZXIgSW50ZXJmYWNpbmcgd2l0aCB0aGUgSGFsbCBzZW5zb3IKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMDogSW50ZXJuYWwgdHJpZ2dlciAwIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIxOiBJbnRlcm5hbCB0cmlnZ2VyIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjI6IEludGVybmFsIHRyaWdnZXIgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMzogSW50ZXJuYWwgdHJpZ2dlciAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19OT05FOiBObyB0cmlnZ2VyIGlzIG5lZWRlZCAKKyAgKiBAcGFyYW0gIENvbW11dGF0aW9uU291cmNlIHRoZSBDb21tdXRhdGlvbiBFdmVudCBzb3VyY2UKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ09NTVVUQVRJT05fVFJHSTogQ29tbXV0YXRpb24gc291cmNlIGlzIHRoZSBUUkdJIG9mIHRoZSBJbnRlcmZhY2UgVGltZXIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NPTU1VVEFUSU9OX1NPRlRXQVJFOiAgQ29tbXV0YXRpb24gc291cmNlIGlzIHNldCBieSBzb2Z0d2FyZSB1c2luZyB0aGUgQ09NRyBiaXQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9Db25maWdDb21tdXRhdGlvbkV2ZW50X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgIElucHV0VHJpZ2dlciwgdWludDMyX3QgIENvbW11dGF0aW9uU291cmNlKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NPTU1VVEFUSU9OX0VWRU5UX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fSU5URVJOQUxfVFJJR0dFUkVWRU5UX1NFTEVDVElPTihJbnB1dFRyaWdnZXIpKTsKKyAgCisgIF9fSEFMX0xPQ0soaHRpbSk7CisgIAorICBpZiAoKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMCkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMSkgfHwKKyAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjIpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjMpKQorICB7ICAgIAorICAgIC8qIFNlbGVjdCB0aGUgSW5wdXQgdHJpZ2dlciAqLworICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSICY9IH5USU1fU01DUl9UUzsKKyAgICBodGltLT5JbnN0YW5jZS0+U01DUiB8PSBJbnB1dFRyaWdnZXI7CisgIH0KKyAgCisgIC8qIFNlbGVjdCB0aGUgQ2FwdHVyZSBDb21wYXJlIHByZWxvYWQgZmVhdHVyZSAqLworICBodGltLT5JbnN0YW5jZS0+Q1IyIHw9IFRJTV9DUjJfQ0NQQzsKKyAgLyogU2VsZWN0IHRoZSBDb21tdXRhdGlvbiBldmVudCBzb3VyY2UgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkNSMiAmPSB+VElNX0NSMl9DQ1VTOworICBodGltLT5JbnN0YW5jZS0+Q1IyIHw9IENvbW11dGF0aW9uU291cmNlOworICAKKyAgLyogRW5hYmxlIHRoZSBDb21tdXRhdGlvbiBETUEgUmVxdWVzdCAqLworICAvKiBTZXQgdGhlIERNQSBDb21tdXRhdGlvbiBDYWxsYmFjayAqLworICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ09NTVVUQVRJT05dLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNRXhfRE1BQ29tbXV0YXRpb25DcGx0OyAgICAgCisgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DT01NVVRBVElPTl0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yOworICAKKyAgLyogRW5hYmxlIHRoZSBDb21tdXRhdGlvbiBETUEgUmVxdWVzdCAqLworICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NPTSk7CisKKyAgX19IQUxfVU5MT0NLKGh0aW0pOworICAKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIENoYW5uZWxzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fT0NfSW5pdFR5cGVEZWYuCisgICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUKKyAgKiBAcGFyYW0gIHNDb25maWcgVElNIE91dHB1dCBDb21wYXJlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBjb25maWd1cmUKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkIAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF81OiBUSU0gQ2hhbm5lbCA1IHNlbGVjdGVkIAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF82OiBUSU0gQ2hhbm5lbCA2IHNlbGVjdGVkCisgICogQG5vdGUgRm9yIFNUTTMyRjMwMnhDLCBTVE0zMkYzMDJ4RSwgU1RNMzJGMzAzeEMsIFNUTTMyRjMwM3hFLCBTVE0zMkYzNTh4eCwKKyAgKiAgICAgICBTVE0zMkYzOTh4eCBhbmQgU1RNMzJGMzAzeDggdXAgdG8gNiBPQyBjaGFubmVscyBjYW4gYmUgY29uZmlndXJlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19Db25maWdDaGFubmVsKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9PQ19Jbml0VHlwZURlZiogc0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKQoreyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0hBTk5FTFMoQ2hhbm5lbCkpOyAKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ19NT0RFKHNDb25maWctPk9DTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX09DX1BPTEFSSVRZKHNDb25maWctPk9DUG9sYXJpdHkpKTsKKyAgCisgIC8qIENoZWNrIGlucHV0IHN0YXRlICovCisgIF9fSEFMX0xPQ0soaHRpbSk7IAorICAKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisgIAorICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MxX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7IAorICAgICAgCisgICAgIC8qIENvbmZpZ3VyZSB0aGUgVElNIENoYW5uZWwgMSBpbiBPdXRwdXQgQ29tcGFyZSAqLworICAgICAgVElNX09DMV9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWcpOworICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7IAorICAgICAgCisgICAgICAvKiBDb25maWd1cmUgdGhlIFRJTSBDaGFubmVsIDIgaW4gT3V0cHV0IENvbXBhcmUgKi8KKyAgICAgIFRJTV9PQzJfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOgorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDM19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOyAKKyAgICAgIAorICAgICAgLyogQ29uZmlndXJlIHRoZSBUSU0gQ2hhbm5lbCAzIGluIE91dHB1dCBDb21wYXJlICovCisgICAgICBUSU1fT0MzX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZyk7CisgICAgfQorICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgVElNX0NIQU5ORUxfNDoKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzRfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsgCisgICAgICAKKyAgICAgICAvKiBDb25maWd1cmUgdGhlIFRJTSBDaGFubmVsIDQgaW4gT3V0cHV0IENvbXBhcmUgKi8KKyAgICAgICBUSU1fT0M0X1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZyk7CisgICAgfQorICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgVElNX0NIQU5ORUxfNToKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzVfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsgCisgICAgICAKKyAgICAgICAvKiBDb25maWd1cmUgdGhlIFRJTSBDaGFubmVsIDUgaW4gT3V0cHV0IENvbXBhcmUgKi8KKyAgICAgICBUSU1fT0M1X1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZyk7CisgICAgfQorICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgVElNX0NIQU5ORUxfNjoKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzZfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsgCisgICAgICAKKyAgICAgICAvKiBDb25maWd1cmUgdGhlIFRJTSBDaGFubmVsIDYgaW4gT3V0cHV0IENvbXBhcmUgKi8KKyAgICAgICBUSU1fT0M2X1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZyk7CisgICAgfQorICAgIGJyZWFrOworICAgICAgICAKKyAgICBkZWZhdWx0OgorICAgIGJyZWFrOyAgICAKKyAgfQorICAKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworICAKKyAgX19IQUxfVU5MT0NLKGh0aW0pOyAKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBQV00gIGNoYW5uZWxzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fT0NfSW5pdFR5cGVEZWYuCisgICogQHBhcmFtICBodGltIFRJTSBQV00gaGFuZGxlCisgICogQHBhcmFtICBzQ29uZmlnIFRJTSBQV00gY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGNvbmZpZ3VyZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzU6IFRJTSBDaGFubmVsIDUgc2VsZWN0ZWQgCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzY6IFRJTSBDaGFubmVsIDYgc2VsZWN0ZWQgCisgICogQG5vdGUgRm9yIFNUTTMyRjMwMnhDLCBTVE0zMkYzMDJ4RSwgU1RNMzJGMzAzeEMsIFNUTTMyRjMwM3hFLCBTVE0zMkYzNTh4eCwKKyAgKiAgICAgICBTVE0zMkYzOTh4eCBhbmQgU1RNMzJGMzAzeDggdXAgdG8gNiBQV00gY2hhbm5lbHMgY2FuIGJlIGNvbmZpZ3VyZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX0NvbmZpZ0NoYW5uZWwoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fT0NfSW5pdFR5cGVEZWYqIHNDb25maWcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NIQU5ORUxTKENoYW5uZWwpKTsgCisgIGFzc2VydF9wYXJhbShJU19USU1fUFdNX01PREUoc0NvbmZpZy0+T0NNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fT0NfUE9MQVJJVFkoc0NvbmZpZy0+T0NQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0ZBU1RfU1RBVEUoc0NvbmZpZy0+T0NGYXN0TW9kZSkpOworICAKKyAgLyogQ2hlY2sgaW5wdXQgc3RhdGUgKi8KKyAgX19IQUxfTE9DSyhodGltKTsKKyAgCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworICAgIAorICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MxX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7IAorICAgICAgCisgICAgICAvKiBDb25maWd1cmUgdGhlIENoYW5uZWwgMSBpbiBQV00gbW9kZSAqLworICAgICAgVElNX09DMV9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWcpOworICAgICAgCisgICAgICAvKiBTZXQgdGhlIFByZWxvYWQgZW5hYmxlIGJpdCBmb3IgY2hhbm5lbDEgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSB8PSBUSU1fQ0NNUjFfT0MxUEU7CisgICAgICAKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgT3V0cHV0IEZhc3QgbW9kZSAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIxICY9IH5USU1fQ0NNUjFfT0MxRkU7CisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgfD0gc0NvbmZpZy0+T0NGYXN0TW9kZTsKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOyAKKyAgICAgIAorICAgICAgLyogQ29uZmlndXJlIHRoZSBDaGFubmVsIDIgaW4gUFdNIG1vZGUgKi8KKyAgICAgIFRJTV9PQzJfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsKKyAgICAgIAorICAgICAgLyogU2V0IHRoZSBQcmVsb2FkIGVuYWJsZSBiaXQgZm9yIGNoYW5uZWwyICovCisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgfD0gVElNX0NDTVIxX09DMlBFOworICAgICAgCisgICAgICAvKiBDb25maWd1cmUgdGhlIE91dHB1dCBGYXN0IG1vZGUgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSAmPSB+VElNX0NDTVIxX09DMkZFOworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIxIHw9IHNDb25maWctPk9DRmFzdE1vZGUgPDwgOFU7CisgICAgfQorICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzNfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsgCisgICAgICAKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgQ2hhbm5lbCAzIGluIFBXTSBtb2RlICovCisgICAgICBUSU1fT0MzX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZyk7CisgICAgICAKKyAgICAgIC8qIFNldCB0aGUgUHJlbG9hZCBlbmFibGUgYml0IGZvciBjaGFubmVsMyAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIyIHw9IFRJTV9DQ01SMl9PQzNQRTsKKyAgICAgIAorICAgICAvKiBDb25maWd1cmUgdGhlIE91dHB1dCBGYXN0IG1vZGUgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMiAmPSB+VElNX0NDTVIyX09DM0ZFOworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIyIHw9IHNDb25maWctPk9DRmFzdE1vZGU7ICAKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF80OgorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDNF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOyAKKyAgICAgIAorICAgICAgLyogQ29uZmlndXJlIHRoZSBDaGFubmVsIDQgaW4gUFdNIG1vZGUgKi8KKyAgICAgIFRJTV9PQzRfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsKKyAgICAgIAorICAgICAgLyogU2V0IHRoZSBQcmVsb2FkIGVuYWJsZSBiaXQgZm9yIGNoYW5uZWw0ICovCisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjIgfD0gVElNX0NDTVIyX09DNFBFOworICAgICAgCisgICAgIC8qIENvbmZpZ3VyZSB0aGUgT3V0cHV0IEZhc3QgbW9kZSAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIyICY9IH5USU1fQ0NNUjJfT0M0RkU7CisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjIgfD0gc0NvbmZpZy0+T0NGYXN0TW9kZSA8PCA4VTsgIAorICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzU6CisgICAgeworICAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDNV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOyAKKyAgICAgIAorICAgICAvKiBDb25maWd1cmUgdGhlIENoYW5uZWwgNSBpbiBQV00gbW9kZSAqLworICAgICAgVElNX09DNV9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWcpOworICAgICAgCisgICAgICAvKiBTZXQgdGhlIFByZWxvYWQgZW5hYmxlIGJpdCBmb3IgY2hhbm5lbDUqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIzIHw9IFRJTV9DQ01SM19PQzVQRTsKKyAgICAgIAorICAgICAvKiBDb25maWd1cmUgdGhlIE91dHB1dCBGYXN0IG1vZGUgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMyAmPSB+VElNX0NDTVIzX09DNUZFOworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIzIHw9IHNDb25maWctPk9DRmFzdE1vZGU7ICAKKyAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF82OgorICAgIHsKKyAgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzZfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsgCisgICAgICAKKyAgICAgLyogQ29uZmlndXJlIHRoZSBDaGFubmVsIDUgaW4gUFdNIG1vZGUgKi8KKyAgICAgIFRJTV9PQzZfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsKKyAgICAgIAorICAgICAgLyogU2V0IHRoZSBQcmVsb2FkIGVuYWJsZSBiaXQgZm9yIGNoYW5uZWw2ICovCisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjMgfD0gVElNX0NDTVIzX09DNlBFOworICAgICAgCisgICAgIC8qIENvbmZpZ3VyZSB0aGUgT3V0cHV0IEZhc3QgbW9kZSAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIzICY9IH5USU1fQ0NNUjNfT0M2RkU7CisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjMgfD0gc0NvbmZpZy0+T0NGYXN0TW9kZSA8PCA4VTsgIAorICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBkZWZhdWx0OgorICAgIGJyZWFrOyAgICAKKyAgfQorICAKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworICAgIAorICBfX0hBTF9VTkxPQ0soaHRpbSk7CisgIAorICByZXR1cm4gSEFMX09LOworfQorCisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNIGluIG1hc3RlciBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlLiAgIAorICAqIEBwYXJhbSAgc01hc3RlckNvbmZpZyBwb2ludGVyIHRvIGEgVElNX01hc3RlckNvbmZpZ1R5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgIGNvbnRhaW5zIHRoZSBzZWxlY3RlZCB0cmlnZ2VyIG91dHB1dCAoVFJHTykgYW5kIHRoZSBNYXN0ZXIvU2xhdmUgCisgICogICAgICAgICBtb2RlLiAKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9NYXN0ZXJDb25maWdTeW5jaHJvbml6YXRpb24oVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX01hc3RlckNvbmZpZ1R5cGVEZWYgKiBzTWFzdGVyQ29uZmlnKQoreworICB1aW50MzJfdCB0bXBjcjI7ICAKKyAgdWludDMyX3QgdG1wc21jcjsgIAorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fU1lOQ0hST19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX1RSR09fU09VUkNFKHNNYXN0ZXJDb25maWctPk1hc3Rlck91dHB1dFRyaWdnZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9NU01fU1RBVEUoc01hc3RlckNvbmZpZy0+TWFzdGVyU2xhdmVNb2RlKSk7CisgIAorICAvKiBDaGVjayBpbnB1dCBzdGF0ZSAqLworICBfX0hBTF9MT0NLKGh0aW0pOworCisgLyogR2V0IHRoZSBUSU14IENSMiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjcjIgPSBodGltLT5JbnN0YW5jZS0+Q1IyOworCisgIC8qIEdldCB0aGUgVElNeCBTTUNSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUjsKKworICAvKiBJZiB0aGUgdGltZXIgc3VwcG9ydHMgQURDIHN5bmNocm9uaXphdGlvbiB0aHJvdWdoIFRSR08yLCBzZXQgdGhlIG1hc3RlciBtb2RlIHNlbGVjdGlvbiAyVSAqLworICBpZiAoSVNfVElNX1RSR08yX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSkKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9UUkdPMl9TT1VSQ0Uoc01hc3RlckNvbmZpZy0+TWFzdGVyT3V0cHV0VHJpZ2dlcjIpKTsKKyAgICAKKyAgICAvKiBDbGVhciB0aGUgTU1TMiBiaXRzICovCisgICAgdG1wY3IyICY9IH5USU1fQ1IyX01NUzI7CisgICAgLyogU2VsZWN0IHRoZSBUUkdPMiBzb3VyY2UqLworICAgIHRtcGNyMiB8PSBzTWFzdGVyQ29uZmlnLT5NYXN0ZXJPdXRwdXRUcmlnZ2VyMjsKKyAgfQorICAKKyAgLyogUmVzZXQgdGhlIE1NUyBCaXRzICovCisgIHRtcGNyMiAmPSB+VElNX0NSMl9NTVM7CisgIC8qIFNlbGVjdCB0aGUgVFJHTyBzb3VyY2UgKi8KKyAgdG1wY3IyIHw9ICBzTWFzdGVyQ29uZmlnLT5NYXN0ZXJPdXRwdXRUcmlnZ2VyOworCisgIC8qIFJlc2V0IHRoZSBNU00gQml0ICovCisgIHRtcHNtY3IgJj0gflRJTV9TTUNSX01TTTsKKyAgLyogU2V0IG1hc3RlciBtb2RlICovCisgIHRtcHNtY3IgfD0gc01hc3RlckNvbmZpZy0+TWFzdGVyU2xhdmVNb2RlOworICAKKyAgLyogVXBkYXRlIFRJTXggQ1IyICovCisgIGh0aW0tPkluc3RhbmNlLT5DUjIgPSB0bXBjcjI7CisgIAorICAvKiBVcGRhdGUgVElNeCBTTUNSICovCisgIGh0aW0tPkluc3RhbmNlLT5TTUNSID0gdG1wc21jcjsKKworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisgIAorICByZXR1cm4gSEFMX09LOworfSAKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNIGluIG1hc3RlciBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlLiAgIAorICAqIEBwYXJhbSAgc01hc3RlckNvbmZpZyBwb2ludGVyIHRvIGEgVElNX01hc3RlckNvbmZpZ1R5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgIGNvbnRhaW5zIHRoZSBzZWxlY3RlZCB0cmlnZ2VyIG91dHB1dCAoVFJHTykgYW5kIHRoZSBNYXN0ZXIvU2xhdmUgCisgICogICAgICAgICBtb2RlLiAKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9NYXN0ZXJDb25maWdTeW5jaHJvbml6YXRpb24oVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9NYXN0ZXJDb25maWdUeXBlRGVmICogc01hc3RlckNvbmZpZykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9NQVNURVJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9UUkdPX1NPVVJDRShzTWFzdGVyQ29uZmlnLT5NYXN0ZXJPdXRwdXRUcmlnZ2VyKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fTVNNX1NUQVRFKHNNYXN0ZXJDb25maWctPk1hc3RlclNsYXZlTW9kZSkpOworICAKKyAgX19IQUxfTE9DSyhodGltKTsKKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKworICAvKiBSZXNldCB0aGUgTU1TIEJpdHMgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkNSMiAmPSB+VElNX0NSMl9NTVM7CisgIC8qIFNlbGVjdCB0aGUgVFJHTyBzb3VyY2UgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkNSMiB8PSAgc01hc3RlckNvbmZpZy0+TWFzdGVyT3V0cHV0VHJpZ2dlcjsKKworICAvKiBSZXNldCB0aGUgTVNNIEJpdCAqLworICBodGltLT5JbnN0YW5jZS0+U01DUiAmPSB+VElNX1NNQ1JfTVNNOworICAvKiBTZXQgb3IgUmVzZXQgdGhlIE1TTSBCaXQgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgfD0gc01hc3RlckNvbmZpZy0+TWFzdGVyU2xhdmVNb2RlOworICAKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworICAKKyAgX19IQUxfVU5MT0NLKGh0aW0pOworICAKKyAgcmV0dXJuIEhBTF9PSzsKK30KKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKy8qKgorICAqIEBicmllZiAgIENvbmZpZ3VyZXMgdGhlIEJyZWFrIGZlYXR1cmUsIGRlYWQgdGltZSwgTG9jayBsZXZlbCwgT1NTSS9PU1NSIFN0YXRlCisgICogICAgICAgICBhbmQgdGhlIEFPRShhdXRvbWF0aWMgb3V0cHV0IGVuYWJsZSkuCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIHNCcmVha0RlYWRUaW1lQ29uZmlnIHBvaW50ZXIgdG8gYSBUSU1fQ29uZmlnQnJlYWtEZWFkQ29uZmlnVHlwZURlZiAKKyAgICAgICAgICAgIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBCRFRSIFJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KKyAgICAgICAgICAgIGZvciB0aGUgVElNIHBlcmlwaGVyYWwuIAorICAqIEBub3RlICAgRm9yIFNUTTMyRjMwMnhDLCBTVE0zMkYzMDJ4RSwgU1RNMzJGMzAzeEMsIFNUTTMyRjM1OHh4LCBTVE0zMkYzMDN4RSwKKyAgICAgICAgICAgIFNUTTMyRjM5OHh4IGFuZCBTVE0zMkYzMDN4OCB0d28gYnJlYWsgaW5wdXRzIGNhbiBiZSBjb25maWd1cmVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0JyZWFrRGVhZFRpbWUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0JyZWFrRGVhZFRpbWVDb25maWdUeXBlRGVmICogc0JyZWFrRGVhZFRpbWVDb25maWcpCit7CisgIHVpbnQzMl90IHRtcGJkdHIgPSAwVTsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PU1NSX1NUQVRFKHNCcmVha0RlYWRUaW1lQ29uZmlnLT5PZmZTdGF0ZVJ1bk1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PU1NJX1NUQVRFKHNCcmVha0RlYWRUaW1lQ29uZmlnLT5PZmZTdGF0ZUlETEVNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fTE9DS19MRVZFTChzQnJlYWtEZWFkVGltZUNvbmZpZy0+TG9ja0xldmVsKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fREVBRFRJTUUoc0JyZWFrRGVhZFRpbWVDb25maWctPkRlYWRUaW1lKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUtfU1RBVEUoc0JyZWFrRGVhZFRpbWVDb25maWctPkJyZWFrU3RhdGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9CUkVBS19QT0xBUklUWShzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWtQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLX0ZJTFRFUihzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWtGaWx0ZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BVVRPTUFUSUNfT1VUUFVUX1NUQVRFKHNCcmVha0RlYWRUaW1lQ29uZmlnLT5BdXRvbWF0aWNPdXRwdXQpKTsKKworICAvKiBDaGVjayBpbnB1dCBzdGF0ZSAqLworICBfX0hBTF9MT0NLKGh0aW0pOworCisgIC8qIFNldCB0aGUgTG9jayBsZXZlbCwgdGhlIEJyZWFrIGVuYWJsZSBCaXQgYW5kIHRoZSBQb2xhcml0eSwgdGhlIE9TU1IgU3RhdGUsCisgIHRoZSBPU1NJIFN0YXRlLCB0aGUgZGVhZCB0aW1lIHZhbHVlIGFuZCB0aGUgQXV0b21hdGljIE91dHB1dCBFbmFibGUgQml0ICovCisKKyAgLyogU2V0IHRoZSBCRFRSIGJpdHMgKi8KKyAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9EVEcsIHNCcmVha0RlYWRUaW1lQ29uZmlnLT5EZWFkVGltZSk7CisgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfTE9DSywgc0JyZWFrRGVhZFRpbWVDb25maWctPkxvY2tMZXZlbCk7CisgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfT1NTSSwgc0JyZWFrRGVhZFRpbWVDb25maWctPk9mZlN0YXRlSURMRU1vZGUpOworICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX09TU1IsIHNCcmVha0RlYWRUaW1lQ29uZmlnLT5PZmZTdGF0ZVJ1bk1vZGUpOworICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX0JLRSwgc0JyZWFrRGVhZFRpbWVDb25maWctPkJyZWFrU3RhdGUpOworICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX0JLUCwgc0JyZWFrRGVhZFRpbWVDb25maWctPkJyZWFrUG9sYXJpdHkpOworICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX0FPRSwgc0JyZWFrRGVhZFRpbWVDb25maWctPkF1dG9tYXRpY091dHB1dCk7CisgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfTU9FLCBzQnJlYWtEZWFkVGltZUNvbmZpZy0+QXV0b21hdGljT3V0cHV0KTsKKyAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9CS0YsIChzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWtGaWx0ZXIgPDwgQkRUUl9CS0ZfU0hJRlQpKTsKKworICBpZiAoSVNfVElNX0JLSU4yX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUsyX1NUQVRFKHNCcmVha0RlYWRUaW1lQ29uZmlnLT5CcmVhazJTdGF0ZSkpOworICAgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUsyX1BPTEFSSVRZKHNCcmVha0RlYWRUaW1lQ29uZmlnLT5CcmVhazJQb2xhcml0eSkpOworICAgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUtfRklMVEVSKHNCcmVha0RlYWRUaW1lQ29uZmlnLT5CcmVhazJGaWx0ZXIpKTsKKworICAgIC8qIFNldCB0aGUgQlJFQUsyIGlucHV0IHJlbGF0ZWQgQkRUUiBiaXRzICovCisgICAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9CSzJGLCAoc0JyZWFrRGVhZFRpbWVDb25maWctPkJyZWFrMkZpbHRlciA8PCBCRFRSX0JLMkZfU0hJRlQpKTsKKyAgICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX0JLMkUsIHNCcmVha0RlYWRUaW1lQ29uZmlnLT5CcmVhazJTdGF0ZSk7CisgICAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9CSzJQLCBzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWsyUG9sYXJpdHkpOworICB9CisKKyAgLyogU2V0IFRJTXhfQkRUUiAqLworICBodGltLT5JbnN0YW5jZS0+QkRUUiA9IHRtcGJkdHI7CisKKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisjZW5kaWYgLyogU1RNMzJGMzAyeEUgfHwgU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzNTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisvKioKKyAgKiBAYnJpZWYgICBDb25maWd1cmVzIHRoZSBCcmVhayBmZWF0dXJlLCBkZWFkIHRpbWUsIExvY2sgbGV2ZWwsIE9TU0kvT1NTUiBTdGF0ZQorICAqICAgICAgICAgIGFuZCB0aGUgQU9FKGF1dG9tYXRpYyBvdXRwdXQgZW5hYmxlKS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEBwYXJhbSAgc0JyZWFrRGVhZFRpbWVDb25maWcgcG9pbnRlciB0byBhIFRJTV9Db25maWdCcmVha0RlYWRDb25maWdUeXBlRGVmIHN0cnVjdHVyZSB0aGF0CisgICogICAgICAgICBjb250YWlucyB0aGUgQkRUUiBSZWdpc3RlciBjb25maWd1cmF0aW9uICBpbmZvcm1hdGlvbiBmb3IgdGhlIFRJTSBwZXJpcGhlcmFsLiAKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8gICAgCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfQ29uZmlnQnJlYWtEZWFkVGltZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fQnJlYWtEZWFkVGltZUNvbmZpZ1R5cGVEZWYgKnNCcmVha0RlYWRUaW1lQ29uZmlnKQoreworICB1aW50MzJfdCB0bXBiZHRyID0gMFU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX09TU1JfU1RBVEUoc0JyZWFrRGVhZFRpbWVDb25maWctPk9mZlN0YXRlUnVuTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX09TU0lfU1RBVEUoc0JyZWFrRGVhZFRpbWVDb25maWctPk9mZlN0YXRlSURMRU1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MT0NLX0xFVkVMKHNCcmVha0RlYWRUaW1lQ29uZmlnLT5Mb2NrTGV2ZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ERUFEVElNRShzQnJlYWtEZWFkVGltZUNvbmZpZy0+RGVhZFRpbWUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9CUkVBS19TVEFURShzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWtTdGF0ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLX1BPTEFSSVRZKHNCcmVha0RlYWRUaW1lQ29uZmlnLT5CcmVha1BvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQVVUT01BVElDX09VVFBVVF9TVEFURShzQnJlYWtEZWFkVGltZUNvbmZpZy0+QXV0b21hdGljT3V0cHV0KSk7CisgIAorICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh0aW0pOworICAKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogU2V0IHRoZSBMb2NrIGxldmVsLCB0aGUgQnJlYWsgZW5hYmxlIEJpdCBhbmQgdGhlIFBvbGFyaXR5LCB0aGUgT1NTUiBTdGF0ZSwKKyAgICAgdGhlIE9TU0kgU3RhdGUsIHRoZSBkZWFkIHRpbWUgdmFsdWUgYW5kIHRoZSBBdXRvbWF0aWMgT3V0cHV0IEVuYWJsZSBCaXQgKi8KKworICAvKiBTZXQgdGhlIEJEVFIgYml0cyAqLworICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX0RURywgc0JyZWFrRGVhZFRpbWVDb25maWctPkRlYWRUaW1lKTsKKyAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9MT0NLLCBzQnJlYWtEZWFkVGltZUNvbmZpZy0+TG9ja0xldmVsKTsKKyAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9PU1NJLCBzQnJlYWtEZWFkVGltZUNvbmZpZy0+T2ZmU3RhdGVJRExFTW9kZSk7CisgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfT1NTUiwgc0JyZWFrRGVhZFRpbWVDb25maWctPk9mZlN0YXRlUnVuTW9kZSk7CisgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfQktFLCBzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWtTdGF0ZSk7CisgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfQktQLCBzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWtQb2xhcml0eSk7CisgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfQU9FLCBzQnJlYWtEZWFkVGltZUNvbmZpZy0+QXV0b21hdGljT3V0cHV0KTsKKyAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9NT0UsIHNCcmVha0RlYWRUaW1lQ29uZmlnLT5BdXRvbWF0aWNPdXRwdXQpOworCisgIC8qIFNldCBUSU14X0JEVFIgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkJEVFIgPSB0bXBiZHRyOworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKyNlbmRpZiAvKiBTVE0zMkYzNzN4QyB8fCBTVE0zMkYzNzh4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKwlkZWZpbmVkKFNUTTMyRjMzNHg4KQorI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTTEsIFRJTTgsIFRJTTE2IGFuZCBUSU0yMCBSZW1hcHBpbmcgaW5wdXQgY2FwYWJpbGl0aWVzLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgUmVtYXAxOiBzcGVjaWZpZXMgdGhlIGZpcnN0IFRJTSByZW1hcHBpbmcgc291cmNlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xX0FEQzFfTk9ORTogVElNMV9FVFIgaXMgbm90IGNvbm5lY3RlZCB0byBhbnkgQURDMSBBV0QgKGFuYWxvZyB3YXRjaGRvZykKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfQURDMV9BV0QxOiBUSU0xX0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDMSBBV0QxCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xX0FEQzFfQVdEMjogVElNMV9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzEgQVdEMiAKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfQURDMV9BV0QzOiBUSU0xX0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDMSBBV0QzIAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNOF9BREMyX05PTkU6IFRJTThfRVRSIGlzIG5vdCBjb25uZWN0ZWQgdG8gYW55IEFEQzIgQVdECisgICogICAgICAgICAgICBAYXJnIFRJTV9USU04X0FEQzJfQVdEMTogVElNOF9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzIgQVdEMQorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNOF9BREMyX0FXRDI6IFRJTThfRVRSIGlzIGNvbm5lY3RlZCB0byBBREMyIEFXRDIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTThfQURDMl9BV0QzOiBUSU04X0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDMiBBV0QzCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xNl9HUElPOiBUSU0xNiBUSTEgaXMgY29ubmVjdGVkIHRvIEdQSU8KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE2X1JUQzogVElNMTYgVEkxIGlzIGNvbm5lY3RlZCB0byBSVEMgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE2X0hTRTogVElNMTYgVEkxIGlzIGNvbm5lY3RlZCB0byBIU0UvMzIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE2X01DTzogVElNMTYgVEkxIGlzIGNvbm5lY3RlZCB0byBNQ08KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTIwX0FEQzNfTk9ORTogVElNMjBfRVRSIGlzIG5vdCBjb25uZWN0ZWQgdG8gYW55IEFXRCAoYW5hbG9nIHdhdGNoZG9nKQorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMjBfQURDM19BV0QxOiBUSU0yMF9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzMgQVdEMQorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMjBfQURDM19BV0QyOiBUSU0yMF9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzMgQVdEMgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMjBfQURDM19BV0QzOiBUSU0yMF9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzMgQVdEMworICAqIEBwYXJhbSAgUmVtYXAyOiBzcGVjaWZpZXMgdGhlICBzZWNvbmQgVElNcmVtYXBwaW5nIHNvdXJjZSAoaWYgYW55KS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMV9BREM0X05PTkU6IFRJTTFfRVRSIGlzIG5vdCBjb25uZWN0ZWQgdG8gYW55IEFEQzQgQVdEIChhbmFsb2cgd2F0Y2hkb2cpCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xX0FEQzRfQVdEMTogVElNMV9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzQgQVdEMQorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMV9BREM0X0FXRDI6IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREM0IEFXRDIgCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xX0FEQzRfQVdEMzogVElNMV9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzQgQVdEMyAKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTThfQURDM19OT05FOiBUSU04X0VUUiBpcyBub3QgY29ubmVjdGVkIHRvIGFueSBBREMzIEFXRAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNOF9BREMzX0FXRDE6IFRJTThfRVRSIGlzIGNvbm5lY3RlZCB0byBBREMzIEFXRDEKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTThfQURDM19BV0QyOiBUSU04X0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDMyBBV0QyCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU04X0FEQzNfQVdEMzogVElNOF9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzMgQVdEMworICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTZfTk9ORTogTm9uIHNpZ25pZmljYW50IHZhbHVlIGZvciBUSU0xNgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMjBfQURDNF9OT05FOiBUSU0yMF9FVFIgaXMgbm90IGNvbm5lY3RlZCB0byBhbnkgQURDNCBBV0QKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTIwX0FEQzRfQVdEMTogVElNMjBfRVRSIGlzIGNvbm5lY3RlZCB0byBBREM0IEFXRDEKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTIwX0FEQzRfQVdEMjogVElNMjBfRVRSIGlzIGNvbm5lY3RlZCB0byBBREM0IEFXRDIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTIwX0FEQzRfQVdEMzogVElNMjBfRVRSIGlzIGNvbm5lY3RlZCB0byBBREM0IEFXRDMKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KKyNlbGlmIGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIAorLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU0xLCBUSU04IGFuZCBUSU0xNiBSZW1hcHBpbmcgaW5wdXQgY2FwYWJpbGl0aWVzLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgUmVtYXAxOiBzcGVjaWZpZXMgdGhlIGZpcnN0IFRJTSByZW1hcHBpbmcgc291cmNlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xX0FEQzFfTk9ORTogVElNMV9FVFIgaXMgbm90IGNvbm5lY3RlZCB0byBhbnkgQVdEIChhbmFsb2cgd2F0Y2hkb2cpCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xX0FEQzFfQVdEMTogVElNMV9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzEgQVdEMQorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMV9BREMxX0FXRDI6IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREMxIEFXRDIgCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xX0FEQzFfQVdEMzogVElNMV9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzEgQVdEMyAKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTThfQURDMl9OT05FOiBUSU04X0VUUiBpcyBub3QgY29ubmVjdGVkIHRvIGFueSBBV0QKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTThfQURDMl9BV0QxOiBUSU04X0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDMiBBV0QxCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU04X0FEQzJfQVdEMjogVElNOF9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzIgQVdEMgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNOF9BREMyX0FXRDM6IFRJTThfRVRSIGlzIGNvbm5lY3RlZCB0byBBREMyIEFXRDMKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE2X0dQSU86IFRJTTE2IFRJMSBpcyBjb25uZWN0ZWQgdG8gR1BJTworICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTZfUlRDOiBUSU0xNiBUSTEgaXMgY29ubmVjdGVkIHRvIFJUQyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTZfSFNFOiBUSU0xNiBUSTEgaXMgY29ubmVjdGVkIHRvIEhTRS8zMgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTZfTUNPOiBUSU0xNiBUSTEgaXMgY29ubmVjdGVkIHRvIE1DTworICAqIEBwYXJhbSAgUmVtYXAyOiBzcGVjaWZpZXMgdGhlICBzZWNvbmQgVElNcmVtYXBwaW5nIHNvdXJjZSAoaWYgYW55KS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMV9BREM0X05PTkU6IFRJTTFfRVRSIGlzIG5vdCBjb25uZWN0ZWQgdG8gYW55IEFXRCAoYW5hbG9nIHdhdGNoZG9nKQorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMV9BREM0X0FXRDE6IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREM0IEFXRDEKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfQURDNF9BV0QyOiBUSU0xX0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDNCBBV0QyIAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMV9BREM0X0FXRDM6IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREM0IEFXRDMgCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU04X0FEQzNfTk9ORTogVElNOF9FVFIgaXMgbm90IGNvbm5lY3RlZCB0byBhbnkgQVdECisgICogICAgICAgICAgICBAYXJnIFRJTV9USU04X0FEQzNfQVdEMTogVElNOF9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzMgQVdEMQorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNOF9BREMzX0FXRDI6IFRJTThfRVRSIGlzIGNvbm5lY3RlZCB0byBBREMzIEFXRDIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTThfQURDM19BV0QzOiBUSU04X0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDMyBBV0QzCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCisjZWxzZSAvKiBTVE0zMkYzMzR4OCAqLworLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU0xLCBUSU04IGFuZCBUSU0xNiBSZW1hcHBpbmcgaW5wdXQgY2FwYWJpbGl0aWVzLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgUmVtYXAxOiBzcGVjaWZpZXMgdGhlIGZpcnN0IFRJTSByZW1hcHBpbmcgc291cmNlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xX0FEQzFfTk9ORTogVElNMV9FVFIgaXMgbm90IGNvbm5lY3RlZCB0byBhbnkgQVdEIChhbmFsb2cgd2F0Y2hkb2cpCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xX0FEQzFfQVdEMTogVElNMV9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzEgQVdEMQorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMV9BREMxX0FXRDI6IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREMxIEFXRDIgCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xX0FEQzFfQVdEMzogVElNMV9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzEgQVdEMyAKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE2X0dQSU86IFRJTTE2IFRJMSBpcyBjb25uZWN0ZWQgdG8gR1BJTworICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTZfUlRDOiBUSU0xNiBUSTEgaXMgY29ubmVjdGVkIHRvIFJUQyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTZfSFNFOiBUSU0xNiBUSTEgaXMgY29ubmVjdGVkIHRvIEhTRS8zMgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTZfTUNPOiBUSU0xNiBUSTEgaXMgY29ubmVjdGVkIHRvIE1DTworICAqIEBwYXJhbSAgUmVtYXAyOiBzcGVjaWZpZXMgdGhlICBzZWNvbmQgVElNcmVtYXBwaW5nIHNvdXJjZSAoaWYgYW55KS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMV9BREMyX05PTkU6IFRJTTFfRVRSIGlzIG5vdCBjb25uZWN0ZWQgdG8gYW55IEFXRCAoYW5hbG9nIHdhdGNoZG9nKQorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMV9BREMyX0FXRDE6IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREMyIEFXRDEKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfQURDMl9BV0QyOiBUSU0xX0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDMiBBV0QyIAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMV9BREMyX0FXRDM6IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREMyIEFXRDMgCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCisjZW5kaWYgLyogU1RNMzJGMzAzeEUgfHwgU1RNMzJGMzk4eHggfHwgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9SZW1hcENvbmZpZyhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgUmVtYXAxLCB1aW50MzJfdCBSZW1hcDIpCit7CisgIF9fSEFMX0xPQ0soaHRpbSk7CisgICAgCisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9SRU1BUF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX1JFTUFQKFJlbWFwMSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX1JFTUFQMihSZW1hcDIpKTsKKyAgCisgIC8qIFNldCB0aGUgVGltZXIgcmVtYXBwaW5nIGNvbmZpZ3VyYXRpb24gKi8KKyAgaHRpbS0+SW5zdGFuY2UtPk9SID0gUmVtYXAxIHwgUmVtYXAyOworICAKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworICAKKyAgX19IQUxfVU5MT0NLKGh0aW0pOyAgCisgIAorICByZXR1cm4gSEFMX09LOworfQorI2VuZGlmIC8qIFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgU1RNMzJGMzM0eDggKi8KKworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNMSBhbmQgVElNMTYgUmVtYXBwaW5nIGlucHV0IGNhcGFiaWxpdGllcy4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIFJlbWFwIHNwZWNpZmllcyB0aGUgVElNIHJlbWFwcGluZyBzb3VyY2UuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfQURDMV9OT05FOiBUSU0xX0VUUiBpcyBub3QgY29ubmVjdGVkIHRvIGFueSBBV0QgKGFuYWxvZyB3YXRjaGRvZykKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfQURDMV9BV0QxOiBUSU0xX0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDMSBBV0QxCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xX0FEQzFfQVdEMjogVElNMV9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzEgQVdEMgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMV9BREMxX0FXRDM6IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREMxIEFXRDMKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE2X0dQSU86IFRJTTE2IFRJMSBpcyBjb25uZWN0ZWQgdG8gR1BJTworICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTZfUlRDOiBUSU0xNiBUSTEgaXMgY29ubmVjdGVkIHRvIFJUQ19jbG9jaworICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTZfSFNFOiBUSU0xNiBUSTEgaXMgY29ubmVjdGVkIHRvIEhTRS8zMgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTZfTUNPOiBUSU0xNiBUSTEgaXMgY29ubmVjdGVkIHRvIE1DTworICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworI2Vsc2UgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8gICAgICAgCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTTIgYW5kIFRJTTE0IFJlbWFwcGluZyBpbnB1dCBjYXBhYmlsaXRpZXMuCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBSZW1hcCBzcGVjaWZpZXMgdGhlIFRJTSByZW1hcHBpbmcgc291cmNlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgU1RNMzJGMzczeEMsIFNUTTMyRjM3OHh4OgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMl9USU04X1RSR086IFRJTTggVFJHT1VUIGlzIGNvbm5lY3RlZCB0byBUSU0yX0lUUjEKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfRVRIX1BUUDogUFRQIHRyaWdnZXIgb3V0cHV0IGlzIGNvbm5lY3RlZCB0byBUSU0yX0lUUjEKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfVVNCRlNfU09GOiBPVEcgRlMgU09GIGlzIGNvbm5lY3RlZCB0byB0aGUgVElNMl9JVFIxIGlucHV0CisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0yX1VTQkhTX1NPRjogT1RHIEhTIFNPRiBpcyBjb25uZWN0ZWQgdG8gdGhlIFRJTTJfSVRSMSBpbnB1dAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTRfR1BJTzogVElNMTQgVEkxIGlzIGNvbm5lY3RlZCB0byBHUElPCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xNF9SVEM6IFRJTTE0IFRJMSBpcyBjb25uZWN0ZWQgdG8gUlRDX2Nsb2NrCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xNF9IU0U6IFRJTTE0IFRJMSBpcyBjb25uZWN0ZWQgdG8gSFNFLzMyCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xNF9NQ086IFRJTTE0IFRJMSBpcyBjb25uZWN0ZWQgdG8gTUNPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCisjZW5kaWYgLyogU1RNMzJGMzAyeEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDJ4QyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjMyOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzAyeDggfHwgU1RNMzJGMzE4eHggfHwgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9SZW1hcENvbmZpZyhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgUmVtYXApCit7CisgIF9fSEFMX0xPQ0soaHRpbSk7CisgICAgCisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9SRU1BUF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX1JFTUFQKFJlbWFwKSk7CisgIAorICAvKiBTZXQgdGhlIFRpbWVyIHJlbWFwcGluZyBjb25maWd1cmF0aW9uICovCisgIGh0aW0tPkluc3RhbmNlLT5PUiA9IFJlbWFwOworICAKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworICAKKyAgX19IQUxfVU5MT0NLKGh0aW0pOyAgCisgIAorICByZXR1cm4gSEFMX09LOworfQorI2VuZGlmIC8qIFNUTTMyRjMwMnhFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggICAgICAgICAgICAgICAgICAgKi8KKworCisjaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKy8qKgorICAqIEBicmllZiAgR3JvdXAgY2hhbm5lbCA1IGFuZCBjaGFubmVsIDEsIDIgb3IgMworICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgQ2hhbm5lbHMgc3BlY2lmaWVzIHRoZSByZWZlcmVuY2Ugc2lnbmFsKHMpIHRoZSBPQzVSRUYgaXMgY29tYmluZWQgd2l0aC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBUSU1fR1JPVVBDSDVfTk9ORTogTm8gZWZmZWN0IG9mIE9DNVJFRiBvbiBPQzFSRUZDLCBPQzJSRUZDIGFuZCBPQzNSRUZDCisgICogICAgICAgICBUSU1fR1JPVVBDSDVfT0MxUkVGQzogT0MxUkVGQyBpcyB0aGUgbG9naWNhbCBBTkQgb2YgT0MxUkVGQyBhbmQgT0M1UkVGCisgICogICAgICAgICBUSU1fR1JPVVBDSDVfT0MyUkVGQzogT0MyUkVGQyBpcyB0aGUgbG9naWNhbCBBTkQgb2YgT0MyUkVGQyBhbmQgT0M1UkVGCisgICogICAgICAgICBUSU1fR1JPVVBDSDVfT0MzUkVGQzogT0MzUkVGQyBpcyB0aGUgbG9naWNhbCBBTkQgb2YgT0MzUkVGQyBhbmQgT0M1UkVGCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfR3JvdXBDaGFubmVsNShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbHMpCit7CisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DT01CSU5FRDNQSEFTRVBXTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0dST1VQQ0g1KENoYW5uZWxzKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodGltKTsKKyAgCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworICAKKyAgLyogQ2xlYXIgR0M1Q3ggYml0IGZpZWxkcyAqLworICBodGltLT5JbnN0YW5jZS0+Q0NSNSAmPSB+KFRJTV9DQ1I1X0dDNUMzfFRJTV9DQ1I1X0dDNUMyfFRJTV9DQ1I1X0dDNUMxKTsKKyAgCisgIC8qIFNldCBHQzVDeCBiaXQgZmllbGRzICovCisgIGh0aW0tPkluc3RhbmNlLT5DQ1I1IHw9IENoYW5uZWxzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAKKyAgX19IQUxfVU5MT0NLKGh0aW0pOworICAKKyAgcmV0dXJuIEhBTF9PSzsKK30KKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDgKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIE9DUmVmIGNsZWFyIGZlYXR1cmUKKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEBwYXJhbSAgc0NsZWFySW5wdXRDb25maWcgcG9pbnRlciB0byBhIFRJTV9DbGVhcklucHV0Q29uZmlnVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqICAgICAgICAgY29udGFpbnMgdGhlIE9DUkVGIGNsZWFyIGZlYXR1cmUgYW5kIHBhcmFtZXRlcnMgZm9yIHRoZSBUSU0gcGVyaXBoZXJhbC4gCisgICogQHBhcmFtICBDaGFubmVsIHNwZWNpZmllcyB0aGUgVElNIENoYW5uZWwKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMworICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0CisgICogICAgICAgICAgICBAYXJnIFRJTV9DaGFubmVsXzU6IFRJTSBDaGFubmVsIDUKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NoYW5uZWxfNjogVElNIENoYW5uZWwgNgorICAqIEBub3RlIEZvciBTVE0zMkYzMDJ4QywgU1RNMzJGMzAyeEUsIFNUTTMyRjMwM3hDLCBTVE0zMkYzMDN4RSwgU1RNMzJGMzU4eHgsCisgICogICAgICAgU1RNMzJGMzk4eHggYW5kIFNUTTMyRjMwM3g4IHVwIHRvIDYgT0MgY2hhbm5lbHMgY2FuIGJlIGNvbmZpZ3VyZWQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8gCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0NvbmZpZ09DcmVmQ2xlYXIoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0NsZWFySW5wdXRDb25maWdUeXBlRGVmICpzQ2xlYXJJbnB1dENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKQoreyAKKyAgdWludDMyX3QgdG1wc21jciA9IDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovIAorICBhc3NlcnRfcGFyYW0oSVNfVElNX09DWFJFRl9DTEVBUl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMRUFSSU5QVVRfU09VUkNFKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0U291cmNlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIC8qIENoZWNrIGlucHV0IHN0YXRlICovCisgIF9fSEFMX0xPQ0soaHRpbSk7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisgIAorICBzd2l0Y2ggKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0U291cmNlKQorICB7CisgICAgY2FzZSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9OT05FOgorICAgIHsKKyAgICAgIC8qIEdldCB0aGUgVElNeCBTTUNSIHJlZ2lzdGVyIHZhbHVlICovCisgICAgICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1I7CisgICAgICAKKyAgICAgIC8qIENsZWFyIHRoZSBPQ1JFRiBjbGVhciBzZWxlY3Rpb24gYml0ICovCisgICAgICB0bXBzbWNyICY9IH5USU1fU01DUl9PQ0NTOworICAgICAgCisgICAgICAvKiBDbGVhciB0aGUgRVRSIEJpdHMgKi8KKyAgICAgIHRtcHNtY3IgJj0gfihUSU1fU01DUl9FVEYgfCBUSU1fU01DUl9FVFBTIHwgVElNX1NNQ1JfRUNFIHwgVElNX1NNQ1JfRVRQKTsKKyAgICAgIAorICAgICAgLyogU2V0IFRJTXhfU01DUiAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgPSB0bXBzbWNyOworICAgfQorICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgVElNX0NMRUFSSU5QVVRTT1VSQ0VfT0NSRUZDTFI6CisgICAgeworICAgICAgLyogQ2xlYXIgdGhlIE9DUkVGIGNsZWFyIHNlbGVjdGlvbiBiaXQgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSICY9IH5USU1fU01DUl9PQ0NTOworICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIFRJTV9DTEVBUklOUFVUU09VUkNFX0VUUjoKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLyAKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xFQVJJTlBVVF9QT0xBUklUWShzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dFBvbGFyaXR5KSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMRUFSSU5QVVRfUFJFU0NBTEVSKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0UHJlc2NhbGVyKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMRUFSSU5QVVRfRklMVEVSKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0RmlsdGVyKSk7CisgICAgICAKKyAgICAgIFRJTV9FVFJfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRQcmVzY2FsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dFBvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRGaWx0ZXIpOworICAgICAgCisgICAgICAvKiBTZXQgdGhlIE9DUkVGIGNsZWFyIHNlbGVjdGlvbiBiaXQgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSIHw9IFRJTV9TTUNSX09DQ1M7CisgICAgfQorICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KKyAgCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeyAKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgICB7CisgICAgICAgIGlmKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0U3RhdGUgIT0gUkVTRVQpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBFbmFibGUgdGhlIE9jcmVmIGNsZWFyIGZlYXR1cmUgZm9yIENoYW5uZWwgMVUgKi8KKyAgICAgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgfD0gVElNX0NDTVIxX09DMUNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIERpc2FibGUgdGhlIE9jcmVmIGNsZWFyIGZlYXR1cmUgZm9yIENoYW5uZWwgMVUgKi8KKyAgICAgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgJj0gflRJTV9DQ01SMV9PQzFDRTsgICAgICAKKyAgICAgICAgfQorICAgICAgfSAgICAKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVElNX0NIQU5ORUxfMjogICAgCisgICAgICB7CisgICAgICAgIGlmKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0U3RhdGUgIT0gUkVTRVQpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBFbmFibGUgdGhlIE9jcmVmIGNsZWFyIGZlYXR1cmUgZm9yIENoYW5uZWwgMlUgKi8KKyAgICAgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgfD0gVElNX0NDTVIxX09DMkNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIERpc2FibGUgdGhlIE9jcmVmIGNsZWFyIGZlYXR1cmUgZm9yIENoYW5uZWwgMlUgKi8KKyAgICAgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgJj0gflRJTV9DQ01SMV9PQzJDRTsgICAgICAKKyAgICAgICAgfQorICAgICAgfSAgICAKKyAgICBicmVhazsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6ICAgIAorICAgICAgeworICAgICAgICBpZihzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dFN0YXRlICE9IFJFU0VUKQorICAgICAgICB7CisgICAgICAgICAgLyogRW5hYmxlIHRoZSBPY3JlZiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDNVICovCisgICAgICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIyIHw9IFRJTV9DQ01SMl9PQzNDRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBPY3JlZiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDNVICovCisgICAgICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIyICY9IH5USU1fQ0NNUjJfT0MzQ0U7ICAgICAgCisgICAgICAgIH0KKyAgICAgIH0gICAgCisgICAgYnJlYWs7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF80OiAgICAKKyAgICAgIHsKKyAgICAgICAgaWYoc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRTdGF0ZSAhPSBSRVNFVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIEVuYWJsZSB0aGUgT2NyZWYgY2xlYXIgZmVhdHVyZSBmb3IgQ2hhbm5lbCA0VSAqLworICAgICAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMiB8PSBUSU1fQ0NNUjJfT0M0Q0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogRGlzYWJsZSB0aGUgT2NyZWYgY2xlYXIgZmVhdHVyZSBmb3IgQ2hhbm5lbCA0VSAqLworICAgICAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMiAmPSB+VElNX0NDTVIyX09DNENFOyAgICAgIAorICAgICAgICB9CisgICAgICB9ICAgIAorICAgIGJyZWFrOworICAgIGNhc2UgVElNX0NIQU5ORUxfNTogICAgCisgICAgICB7CisgICAgICAgIGlmKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0U3RhdGUgIT0gUkVTRVQpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBFbmFibGUgdGhlIE9jcmVmIGNsZWFyIGZlYXR1cmUgZm9yIENoYW5uZWwgMVUgKi8KKyAgICAgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjMgfD0gVElNX0NDTVIzX09DNUNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIERpc2FibGUgdGhlIE9jcmVmIGNsZWFyIGZlYXR1cmUgZm9yIENoYW5uZWwgMVUgKi8KKyAgICAgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjMgJj0gflRJTV9DQ01SM19PQzVDRTsgICAgICAKKyAgICAgICAgfQorICAgICAgfSAgICAKKyAgICBicmVhazsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzY6ICAgIAorICAgICAgeworICAgICAgICBpZihzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dFN0YXRlICE9IFJFU0VUKQorICAgICAgICB7CisgICAgICAgICAgLyogRW5hYmxlIHRoZSBPY3JlZiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDFVICovCisgICAgICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIzIHw9IFRJTV9DQ01SM19PQzZDRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBPY3JlZiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDFVICovCisgICAgICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIzICY9IH5USU1fQ0NNUjNfT0M2Q0U7ICAgICAgCisgICAgICAgIH0KKyAgICAgIH0gICAgCisgICAgYnJlYWs7CisgICAgZGVmYXVsdDogIAorICAgIGJyZWFrOworICB9IAorCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKyAgCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gSEFMX09LOyAgCit9ICAKKyNlbmRpZiAvKiBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzOTh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjM1OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAzeDggfHwgU1RNMzJGMzM0eDggfHwgU1RNMzJGMzI4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMTh4eCAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1FeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA2IEV4dGVuc2lvbiBDYWxsYmFja3MgZnVuY3Rpb25zIAorICogIEBicmllZiAgIEV4dGVuc2lvbiBDYWxsYmFja3MgZnVuY3Rpb25zIAorICAqCitAdmVyYmF0aW0gICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICMjIyMjIEV4dGVuZGVkIENhbGxiYWNrcyBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgWy4uXSAgCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIEV4dGVuZGVkIFRJTSBjYWxsYmFjayBmdW5jdGlvbnM6CisgICAgKCspIFRpbWVyIENvbW11dGF0aW9uIGNhbGxiYWNrCisgICAgKCspIFRpbWVyIEJyZWFrIGNhbGxiYWNrCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSGFsbCBjb21tdXRhdGlvbiBjaGFuZ2VkIGNhbGxiYWNrIGluIG5vbiBibG9ja2luZyBtb2RlIAorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVElNRXhfQ29tbXV0YXRpb25DYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1FeF9Db21tdXRhdGlvbkNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgSGFsbCBCcmVhayBkZXRlY3Rpb24gY2FsbGJhY2sgaW4gbm9uIGJsb2NraW5nIG1vZGUgCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1FeF9CcmVha0NhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTUV4X0JyZWFrQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBIYWxsIEJyZWFrMiBkZXRlY3Rpb24gY2FsbGJhY2sgaW4gbm9uIGJsb2NraW5nIG1vZGUKKyAgKiBAcGFyYW0gIGh0aW06IFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1FeF9CcmVhazJDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1FeF9CcmVhazJDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDcgRXh0ZW5kZWQgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgCisgICogQGJyaWVmICAgIEV4dGVuZGVkIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbSAgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAjIyMjIyBFeHRlbmRlZCBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHBlcm1pdCB0byBnZXQgaW4gcnVuLXRpbWUgdGhlIHN0YXR1cyBvZiB0aGUgcGVyaXBoZXJhbCAKKyAgICBhbmQgdGhlIGRhdGEgZmxvdy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFRJTSBIYWxsIFNlbnNvciBpbnRlcmZhY2Ugc3RhdGUKKyAgKiBAcGFyYW0gIGh0aW0gVElNIEhhbGwgU2Vuc29yIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNRXhfSGFsbFNlbnNvcl9HZXRTdGF0ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgcmV0dXJuIGh0aW0tPlN0YXRlOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqIEBhZGR0b2dyb3VwIFRJTUV4X1ByaXZhdGVfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgVElNIERNQSBDb21tdXRhdGlvbiBjYWxsYmFjay4gCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgVElNRXhfRE1BQ29tbXV0YXRpb25DcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBUSU1fSGFuZGxlVHlwZURlZiogaHRpbSA9ICggVElNX0hhbmRsZVR5cGVEZWYqICkoKERNQV9IYW5kbGVUeXBlRGVmKiApaGRtYSktPlBhcmVudDsKKyAgCisgIGh0aW0tPlN0YXRlPSBIQUxfVElNX1NUQVRFX1JFQURZOworICAgIAorICBIQUxfVElNRXhfQ29tbXV0YXRpb25DYWxsYmFjayhodGltKTsgCit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVElNIENhcHR1cmUgQ29tcGFyZSBDaGFubmVsIHhOLgorICAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsCisgICogQHBhcmFtICBDaGFubmVsIHNwZWNpZmllcyB0aGUgVElNIENoYW5uZWwKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMworICAqIEBwYXJhbSAgQ2hhbm5lbE5TdGF0ZSBzcGVjaWZpZXMgdGhlIFRJTSBDaGFubmVsIENDeE5FIGJpdCBuZXcgc3RhdGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBUSU1fQ0N4Tl9FTkFCTEUgb3IgVElNX0NDeE5fRGlzYWJsZS4gCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBUSU1fQ0N4TkNoYW5uZWxDbWQoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IENoYW5uZWxOU3RhdGUpCit7CisgIHVpbnQzMl90IHRtcCA9IDBVOworCisgIHRtcCA9IFRJTV9DQ0VSX0NDMU5FIDw8IENoYW5uZWw7CisKKyAgLyogUmVzZXQgdGhlIENDeE5FIEJpdCAqLworICBUSU14LT5DQ0VSICY9ICB+dG1wOworCisgIC8qIFNldCBvciByZXNldCB0aGUgQ0N4TkUgQml0ICovIAorICBUSU14LT5DQ0VSIHw9ICAodWludDMyX3QpKENoYW5uZWxOU3RhdGUgPDwgQ2hhbm5lbCk7Cit9CisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDJ4QykgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorLyoqCisgICogQGJyaWVmICBUaW1lciBPdXB1dCBDb21wYXJlIDUgY29uZmlndXJhdGlvbgorICAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsCisgICogQHBhcmFtICBPQ19Db25maWcgVGhlIG91cHV0IGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBUSU1fT0M1X1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fT0NfSW5pdFR5cGVEZWYgKk9DX0NvbmZpZykKK3sKKyAgdWludDMyX3QgdG1wY2NtcnggPSAwVTsKKyAgdWludDMyX3QgdG1wY2NlciA9IDBVOworICB1aW50MzJfdCB0bXBjcjIgPSAwVTsgCisKKyAgLyogRGlzYWJsZSB0aGUgb3V0cHV0OiBSZXNldCB0aGUgQ0N4RSBCaXQgKi8KKyAgVElNeC0+Q0NFUiAmPSB+VElNX0NDRVJfQ0M1RTsKKyAgCisgIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjZXIgPSBUSU14LT5DQ0VSOworICAvKiBHZXQgdGhlIFRJTXggQ1IyIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNyMiA9ICBUSU14LT5DUjI7IAorICAvKiBHZXQgdGhlIFRJTXggQ0NNUjEgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NtcnggPSBUSU14LT5DQ01SMzsKKworICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSBCaXRzICovCisgIHRtcGNjbXJ4ICY9IH4oVElNX0NDTVIzX09DNU0pOworICAvKiBTZWxlY3QgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8KKyAgdG1wY2NtcnggfD0gT0NfQ29uZmlnLT5PQ01vZGU7CisgIAorICAvKiBSZXNldCB0aGUgT3V0cHV0IFBvbGFyaXR5IGxldmVsICovCisgIHRtcGNjZXIgJj0gflRJTV9DQ0VSX0NDNVA7CisgIC8qIFNldCB0aGUgT3V0cHV0IENvbXBhcmUgUG9sYXJpdHkgKi8KKyAgdG1wY2NlciB8PSAoT0NfQ29uZmlnLT5PQ1BvbGFyaXR5IDw8IDE2VSk7CisKKyAgaWYoSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpKQorICB7ICAgCisgICAgLyogUmVzZXQgdGhlIE91dHB1dCBDb21wYXJlIElETEUgU3RhdGUgKi8KKyAgICB0bXBjcjIgJj0gflRJTV9DUjJfT0lTNTsKKyAgICAvKiBTZXQgdGhlIE91dHB1dCBJZGxlIHN0YXRlICovCisgICAgdG1wY3IyIHw9IChPQ19Db25maWctPk9DSWRsZVN0YXRlIDw8IDhVKTsKKyAgfQorICAvKiBXcml0ZSB0byBUSU14IENSMiAqLworICBUSU14LT5DUjIgPSB0bXBjcjI7CisgIAorICAvKiBXcml0ZSB0byBUSU14IENDTVIzICovCisgIFRJTXgtPkNDTVIzID0gdG1wY2Ntcng7CisgIAorICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSAqLworICBUSU14LT5DQ1I1ID0gT0NfQ29uZmlnLT5QdWxzZTsKKyAgCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiAqLworICBUSU14LT5DQ0VSID0gdG1wY2NlcjsgIAorfQorCisvKioKKyAgKiBAYnJpZWYgIFRpbWVyIE91cHV0IENvbXBhcmUgNiBjb25maWd1cmF0aW9uCisgICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwKKyAgKiBAcGFyYW0gIE9DX0NvbmZpZyBUaGUgb3VwdXQgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFRJTV9PQzZfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9PQ19Jbml0VHlwZURlZiAqT0NfQ29uZmlnKQoreworICB1aW50MzJfdCB0bXBjY21yeCA9IDBVOworICB1aW50MzJfdCB0bXBjY2VyID0gMFU7CisgIHVpbnQzMl90IHRtcGNyMiA9IDBVOyAKKworICAvKiBEaXNhYmxlIHRoZSBvdXRwdXQ6IFJlc2V0IHRoZSBDQ3hFIEJpdCAqLworICBUSU14LT5DQ0VSICY9IH5USU1fQ0NFUl9DQzZFOworICAKKyAgLyogR2V0IHRoZSBUSU14IENDRVIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NlciA9IFRJTXgtPkNDRVI7CisgIC8qIEdldCB0aGUgVElNeCBDUjIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY3IyID0gIFRJTXgtPkNSMjsgCisgIC8qIEdldCB0aGUgVElNeCBDQ01SMSByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY21yeCA9IFRJTXgtPkNDTVIzOworICAgIAorICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSBCaXRzICovCisgIHRtcGNjbXJ4ICY9IH4oVElNX0NDTVIzX09DNk0pOworICAvKiBTZWxlY3QgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8KKyAgdG1wY2NtcnggfD0gKE9DX0NvbmZpZy0+T0NNb2RlIDw8IDhVKTsKKyAgCisgIC8qIFJlc2V0IHRoZSBPdXRwdXQgUG9sYXJpdHkgbGV2ZWwgKi8KKyAgdG1wY2NlciAmPSAodWludDMyX3QpflRJTV9DQ0VSX0NDNlA7CisgIC8qIFNldCB0aGUgT3V0cHV0IENvbXBhcmUgUG9sYXJpdHkgKi8KKyAgdG1wY2NlciB8PSAoT0NfQ29uZmlnLT5PQ1BvbGFyaXR5IDw8IDIwVSk7CisKKyAgaWYoSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpKQorICB7ICAgCisgICAgLyogUmVzZXQgdGhlIE91dHB1dCBDb21wYXJlIElETEUgU3RhdGUgKi8KKyAgICB0bXBjcjIgJj0gflRJTV9DUjJfT0lTNjsKKyAgICAvKiBTZXQgdGhlIE91dHB1dCBJZGxlIHN0YXRlICovCisgICAgdG1wY3IyIHw9IChPQ19Db25maWctPk9DSWRsZVN0YXRlIDw8IDEwVSk7CisgIH0KKyAgCisgIC8qIFdyaXRlIHRvIFRJTXggQ1IyICovCisgIFRJTXgtPkNSMiA9IHRtcGNyMjsKKyAgCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjMgKi8KKyAgVElNeC0+Q0NNUjMgPSB0bXBjY21yeDsKKyAgCisgIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyIHZhbHVlICovCisgIFRJTXgtPkNDUjYgPSBPQ19Db25maWctPlB1bHNlOworICAKKyAgLyogV3JpdGUgdG8gVElNeCBDQ0VSICovCisgIFRJTXgtPkNDRVIgPSB0bXBjY2VyOyAgCit9IAorI2VuZGlmIC8qIFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjM5OHh4IHx8ICovCisgICAgICAgLyogU1RNMzJGMzAyeEMgfHwgU1RNMzJGMzAzeEMgfHwgU1RNMzJGMzU4eHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzMjh4eCB8fCAqLworICAgICAgIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMxOHh4ICAgICovCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX1RJTV9NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8gCisKKy8qKgorICAqIEB9CisgICovIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjN4eF9oYWxfdGltZWJhc2VfcnRjX2FsYXJtX3RlbXBsYXRlLmMgYi9TcmMvc3RtMzJmM3h4X2hhbF90aW1lYmFzZV9ydGNfYWxhcm1fdGVtcGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjI4OGI3Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZjN4eF9oYWxfdGltZWJhc2VfcnRjX2FsYXJtX3RlbXBsYXRlLmMKQEAgLTAsMCArMSwzMTUgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX3RpbWViYXNlX3J0Y19hbGFybV90ZW1wbGF0ZS5jCisgICogQGJyaWVmICAgSEFMIHRpbWUgYmFzZSBiYXNlZCBvbiB0aGUgaGFyZHdhcmUgUlRDX0FMQVJNIFRlbXBsYXRlLgorICAqCisgICogICAgICAgICAgVGhpcyBmaWxlIG92ZXJyaWRlIHRoZSBuYXRpdmUgSEFMIHRpbWUgYmFzZSBmdW5jdGlvbnMgKGRlZmluZWQgYXMgd2VhaykKKyAgKiAgICAgICAgICB0byB1c2UgdGhlIFJUQyBBTEFSTSBmb3IgdGltZSBiYXNlIGdlbmVyYXRpb246CisgICogICAgICAgICAgICsgSW50aWFsaXplcyB0aGUgUlRDIHBlcmlwaGVyYWwgdG8gaW5jcmVtZW50IHRoZSBzZWNvbmRzIHJlZ2lzdGVycyBlYWNoIDFtcworICAqICAgICAgICAgICArIFRoZSBhbGFybSBpcyBjb25maWd1cmVkIHRvIGFzc2VydCBhbiBpbnRlcnJ1cHQgd2hlbiB0aGUgUlRDIHJlYWNoZXMgMW1zIAorICAqICAgICAgICAgICArIEhBTF9JbmNUaWNrIGlzIGNhbGxlZCBhdCBlYWNoIEFsYXJtIGV2ZW50IGFuZCB0aGUgdGltZSBpcyByZXNldCB0byAwMDowMDowMAorICAqICAgICAgICAgICArIEhTRSAoZGVmYXVsdCksIExTRSBvciBMU0kgY2FuIGJlIHNlbGVjdGVkIGFzIFJUQyBjbG9jayBzb3VyY2UgIAorIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgZmlsZSBtdXN0IGJlIGNvcGllZCB0byB0aGUgYXBwbGljYXRpb24gZm9sZGVyIGFuZCBtb2RpZmllZCBhcyBmb2xsb3dzOgorICAgICgjKSBSZW5hbWUgaXQgdG8gJ3N0bTMyZjN4eF9oYWxfdGltZWJhc2VfcnRjX2FsYXJtLmMnCisgICAgKCMpIEFkZCB0aGlzIGZpbGUgYW5kIHRoZSBSVEMgSEFMIGRyaXZlcnMgdG8geW91ciBwcm9qZWN0IGFuZCB1bmNvbW1lbnQKKyAgICAgICBIQUxfUlRDX01PRFVMRV9FTkFCTEVEIGRlZmluZSBpbiBzdG0zMmYzeHhfaGFsX2NvbmYuaCAKKworICAgIFsuLl0KKyAgICAoQCkgSEFMIFJUQyBhbGFybSBhbmQgSEFMIFJUQyB3YWtldXAgZHJpdmVycyBjYW6SdCBiZSB1c2VkIHdpdGggbG93IHBvd2VyIG1vZGVzOgorICAgICAgICBUaGUgd2FrZSB1cCBjYXBhYmlsaXR5IG9mIHRoZSBSVEMgbWF5IGJlIGludHJ1c2l2ZSBpbiBjYXNlIG9mIHByaW9yIGxvdyBwb3dlciBtb2RlCisgICAgICAgIGNvbmZpZ3VyYXRpb24gcmVxdWlyaW5nIGRpZmZlcmVudCB3YWtlIHVwIHNvdXJjZXMuCisgICAgICAgIEFwcGxpY2F0aW9uL0V4YW1wbGUgYmVoYXZpb3IgaXMgbm8gbW9yZSBndWFyYW50ZWVkIAorICAgIChAKSBUaGUgc3RtMzJmM3h4X2hhbF90aW1lYmFzZV90aW0gdXNlIGlzIHJlY29tbWVuZGVkIGZvciB0aGUgQXBwbGljYXRpb25zL0V4YW1wbGVzCisgICAgICAgICAgcmVxdWlyaW5nIGxvdyBwb3dlciBtb2RlcworCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsLmgiCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9UaW1lQmFzZV9SVENfQWxhcm1fVGVtcGxhdGUgIEhBTCBUaW1lQmFzZSBSVEMgQWxhcm0gVGVtcGxhdGUKKyAgKiBAeworICAqLyAKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFVuY29tbWVudCB0aGUgbGluZSBiZWxvdyB0byBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIFJUQyBDbG9jayBzb3VyY2UgZm9yIHlvdXIgYXBwbGljYXRpb246IAorICArIFJUQ19DTE9DS19TT1VSQ0VfSFNFOiBjYW4gYmUgc2VsZWN0ZWQgZm9yIGFwcGxpY2F0aW9ucyByZXF1aXJpbmcgdGltaW5nIHByZWNpc2lvbi4KKyAgKyBSVENfQ0xPQ0tfU09VUkNFX0xTRTogY2FuIGJlIHNlbGVjdGVkIGZvciBhcHBsaWNhdGlvbnMgd2l0aCBsb3cgY29uc3RyYWludCBvbiB0aW1pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uLgorICArIFJUQ19DTE9DS19TT1VSQ0VfTFNJOiBjYW4gYmUgc2VsZWN0ZWQgZm9yIGFwcGxpY2F0aW9ucyB3aXRoIGxvdyBjb25zdHJhaW50IG9uIHRpbWluZworICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb24uCisgICovCisjZGVmaW5lIFJUQ19DTE9DS19TT1VSQ0VfSFNFIAorLyogI2RlZmluZSBSVENfQ0xPQ0tfU09VUkNFX0xTRSAqLworLyogI2RlZmluZSBSVENfQ0xPQ0tfU09VUkNFX0xTSSAqLworCisjaWYgZGVmaW5lZChSVENfQ0xPQ0tfU09VUkNFX0hTRSkKKyAgI2RlZmluZSBSVENfQVNZTkNIX1BSRURJViAgICAgICA0OVUKKyAgI2RlZmluZSBSVENfU1lOQ0hfUFJFRElWICAgICAgICA0VQorI2VsaWYgZGVmaW5lZChSVENfQ0xPQ0tfU09VUkNFX0xTRSkgIAorICAjZGVmaW5lIFJUQ19BU1lOQ0hfUFJFRElWICAgICAgIDBVCisgICNkZWZpbmUgUlRDX1NZTkNIX1BSRURJViAgICAgICAgMzFVCisjZWxzZSAvKlJUQ19DTE9DS19TT1VSQ0VfTFNJICovCisgICNkZWZpbmUgUlRDX0FTWU5DSF9QUkVESVYgICAgICAgMFUKKyAgI2RlZmluZSBSVENfU1lOQ0hfUFJFRElWICAgICAgICAzOVUKKyNlbmRpZiAvKiBSVENfQ0xPQ0tfU09VUkNFX0hTRSAqLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1JUQ19IYW5kbGVUeXBlRGVmICAgICAgICBoUlRDX0hhbmRsZTsKKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIFJUQ19BbGFybV9JUlFIYW5kbGVyKHZvaWQpOworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIFJUQ19BTEFSTUEgYXMgYSB0aW1lIGJhc2Ugc291cmNlLiAKKyAgKiAgICAgICAgIFRoZSB0aW1lIHNvdXJjZSBpcyBjb25maWd1cmVkICB0byBoYXZlIDFtcyB0aW1lIGJhc2Ugd2l0aCBhIGRlZGljYXRlZCAKKyAgKiAgICAgICAgIFRpY2sgaW50ZXJydXB0IHByaW9yaXR5LiAKKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkICBhdXRvbWF0aWNhbGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgcHJvZ3JhbSBhZnRlcgorICAqICAgICAgICAgcmVzZXQgYnkgSEFMX0luaXQoKSBvciBhdCBhbnkgdGltZSB3aGVuIGNsb2NrIGlzIGNvbmZpZ3VyZWQsIGJ5IEhBTF9SQ0NfQ2xvY2tDb25maWcoKS4KKyAgKiBAcGFyYW0gIFRpY2tQcmlvcml0eSBUaWNrIGludGVycnVwdCBwcmlvcml0eS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9Jbml0VGljayAodWludDMyX3QgVGlja1ByaW9yaXR5KQoreworICBfX0lPIHVpbnQzMl90IGNvdW50ZXIgPSAwVTsKKworICBSQ0NfT3NjSW5pdFR5cGVEZWYgICAgICAgIFJDQ19Pc2NJbml0U3RydWN0OworICBSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWYgIFBlcmlwaENsa0luaXRTdHJ1Y3Q7CisKKyNpZmRlZiBSVENfQ0xPQ0tfU09VUkNFX0xTRQorICAvKiBDb25maWd1ZSBMU0UgYXMgUlRDIGNsb2NrIHNvdWNyZSAqLworICBSQ0NfT3NjSW5pdFN0cnVjdC5Pc2NpbGxhdG9yVHlwZSA9IFJDQ19PU0NJTExBVE9SVFlQRV9MU0U7CisgIFJDQ19Pc2NJbml0U3RydWN0LlBMTC5QTExTdGF0ZSA9IFJDQ19QTExfTk9ORTsKKyAgUkNDX09zY0luaXRTdHJ1Y3QuTFNFU3RhdGUgPSBSQ0NfTFNFX09OOworICBQZXJpcGhDbGtJbml0U3RydWN0LlJUQ0Nsb2NrU2VsZWN0aW9uID0gUkNDX1JUQ0NMS1NPVVJDRV9MU0U7CisjZWxpZiBkZWZpbmVkIChSVENfQ0xPQ0tfU09VUkNFX0xTSSkKKyAgLyogQ29uZmlndWUgTFNJIGFzIFJUQyBjbG9jayBzb3VjcmUgKi8KKyAgUkNDX09zY0luaXRTdHJ1Y3QuT3NjaWxsYXRvclR5cGUgPSBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNJOworICBSQ0NfT3NjSW5pdFN0cnVjdC5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX05PTkU7CisgIFJDQ19Pc2NJbml0U3RydWN0LkxTSVN0YXRlID0gUkNDX0xTSV9PTjsKKyAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5SVENDbG9ja1NlbGVjdGlvbiA9IFJDQ19SVENDTEtTT1VSQ0VfTFNJOworI2VsaWYgZGVmaW5lZCAoUlRDX0NMT0NLX1NPVVJDRV9IU0UpCisgIC8qIENvbmZpZ3VlIEhTRSBhcyBSVEMgY2xvY2sgc291Y3JlICovCisgIFJDQ19Pc2NJbml0U3RydWN0Lk9zY2lsbGF0b3JUeXBlID0gUkNDX09TQ0lMTEFUT1JUWVBFX0hTRTsKKyAgUkNDX09zY0luaXRTdHJ1Y3QuUExMLlBMTFN0YXRlID0gUkNDX1BMTF9OT05FOworICBSQ0NfT3NjSW5pdFN0cnVjdC5IU0VTdGF0ZSA9IFJDQ19IU0VfT047CisgIFBlcmlwaENsa0luaXRTdHJ1Y3QuUlRDQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUlRDQ0xLU09VUkNFX0hTRV9ESVYzMjsKKyNlbHNlCisjZXJyb3IgUGxlYXNlIHNlbGVjdCB0aGUgUlRDIENsb2NrIHNvdXJjZQorI2VuZGlmIC8qIFJUQ19DTE9DS19TT1VSQ0VfTFNFICovCisKKyAgaWYoSEFMX1JDQ19Pc2NDb25maWcoJlJDQ19Pc2NJbml0U3RydWN0KSA9PSBIQUxfT0spCisgIHsKKyAgICBQZXJpcGhDbGtJbml0U3RydWN0LlBlcmlwaENsb2NrU2VsZWN0aW9uID0gUkNDX1BFUklQSENMS19SVEM7CisgICAgaWYoSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZygmUGVyaXBoQ2xrSW5pdFN0cnVjdCkgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSBSVEMgQ2xvY2sgKi8KKyAgICAgIF9fSEFMX1JDQ19SVENfRU5BQkxFKCk7CisgICAgICAvKiBUaGUgdGltZSBiYXNlIHNob3VsZCBiZSAxbXMKKyAgICAgICAgIFRpbWUgYmFzZSA9ICgoUlRDX0FTWU5DSF9QUkVESVYgKyAxVSkgKiAoUlRDX1NZTkNIX1BSRURJViArIDFVKSkgLyBSVENfQ0xPQ0sgCisgICAgICAgICBIU0UvMzIgYXMgUlRDIGNsb2NrIGFuZCBIU0UgOE1IegorICAgICAgICAgICBUaW1lIGJhc2UgPSAoKDQ5VSArIDFVKSAqICg0VSArIDFVKSkgLyAyNTBrSHoKKyAgICAgICAgICAgICAgICAgICAgID0gMW1zCisgICAgICAgICBMU0UgYXMgUlRDIGNsb2NrIAorICAgICAgICAgICBUaW1lIGJhc2UgPSAoKDMxVSArIDFVKSAqICgwVSArIDFVKSkgLyAzMi43NjhLSHoKKyAgICAgICAgICAgICAgICAgICAgID0gfjFtcworICAgICAgICAgTFNJIGFzIFJUQyBjbG9jayAKKyAgICAgICAgICAgVGltZSBiYXNlID0gKCgzOVUgKyAxVSkgKiAoMFUgKyAxVSkpIC8gNDBLSHoKKyAgICAgICAgICAgICAgICAgICAgID0gMW1zCisgICAgICAqLworICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UgPSBSVEM7CisgICAgICBoUlRDX0hhbmRsZS5Jbml0LkhvdXJGb3JtYXQgPSBSVENfSE9VUkZPUk1BVF8yNDsKKyAgICAgIGhSVENfSGFuZGxlLkluaXQuQXN5bmNoUHJlZGl2ID0gUlRDX0FTWU5DSF9QUkVESVY7CisgICAgICBoUlRDX0hhbmRsZS5Jbml0LlN5bmNoUHJlZGl2ID0gUlRDX1NZTkNIX1BSRURJVjsKKyAgICAgIGhSVENfSGFuZGxlLkluaXQuT3V0UHV0ID0gUlRDX09VVFBVVF9ESVNBQkxFOworICAgICAgaFJUQ19IYW5kbGUuSW5pdC5PdXRQdXRQb2xhcml0eSA9IFJUQ19PVVRQVVRfUE9MQVJJVFlfSElHSDsKKyAgICAgIGhSVENfSGFuZGxlLkluaXQuT3V0UHV0VHlwZSA9IFJUQ19PVVRQVVRfVFlQRV9PUEVORFJBSU47CisgICAgICBIQUxfUlRDX0luaXQoJmhSVENfSGFuZGxlKTsKKworICAgICAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKCZoUlRDX0hhbmRsZSk7CisKKyAgICAgIC8qIERpc2FibGUgdGhlIEFsYXJtIEEgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9SVENfQUxBUk1BX0RJU0FCTEUoJmhSVENfSGFuZGxlKTsKKworICAgICAgLyogQ2xlYXIgZmxhZyBhbGFybSBBICovCisgICAgICBfX0hBTF9SVENfQUxBUk1fQ0xFQVJfRkxBRygmaFJUQ19IYW5kbGUsIFJUQ19GTEFHX0FMUkFGKTsKKworICAgICAgY291bnRlciA9IDBVOworICAgICAgLyogV2FpdCB0aWxsIFJUQyBBTFJBV0YgZmxhZyBpcyBzZXQgYW5kIGlmIFRpbWUgb3V0IGlzIHJlYWNoZWQgZXhpdCAqLworICAgICAgd2hpbGUoX19IQUxfUlRDX0FMQVJNX0dFVF9GTEFHKCZoUlRDX0hhbmRsZSwgUlRDX0ZMQUdfQUxSQVdGKSA9PSBSRVNFVCkKKyAgICAgIHsKKyAgICAgICAgaWYoY291bnRlcisrID09IChTeXN0ZW1Db3JlQ2xvY2sgLzQ4VSkpIC8qIFRpbWVvdXQgPSB+IDFzICovCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGhSVENfSGFuZGxlLkluc3RhbmNlLT5BTFJNQVIgPSAweDAxVTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBBbGFybSBzdGF0ZTogRW5hYmxlIEFsYXJtICovCisgICAgICBfX0hBTF9SVENfQUxBUk1BX0VOQUJMRSgmaFJUQ19IYW5kbGUpOworICAgICAgLyogQ29uZmlndXJlIHRoZSBBbGFybSBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1JUQ19BTEFSTV9FTkFCTEVfSVQoJmhSVENfSGFuZGxlLCBSVENfSVRfQUxSQSk7CisKKyAgICAgIC8qIFJUQyBBbGFybSBJbnRlcnJ1cHQgQ29uZmlndXJhdGlvbjogRVhUSSBjb25maWd1cmF0aW9uICovCisgICAgICBfX0hBTF9SVENfQUxBUk1fRVhUSV9FTkFCTEVfSVQoKTsKKyAgICAgIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpOworCisgICAgICAvKiBDaGVjayBpZiB0aGUgSW5pdGlhbGl6YXRpb24gbW9kZSBpcyBzZXQgKi8KKyAgICAgIGlmKChoUlRDX0hhbmRsZS5JbnN0YW5jZS0+SVNSICYgUlRDX0lTUl9JTklURikgPT0gKHVpbnQzMl90KVJFU0VUKQorICAgICAgeworICAgICAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPklTUiA9ICh1aW50MzJfdClSVENfSU5JVF9NQVNLOworICAgICAgICBjb3VudGVyID0gMFU7CisgICAgICAgIHdoaWxlKChoUlRDX0hhbmRsZS5JbnN0YW5jZS0+SVNSICYgUlRDX0lTUl9JTklURikgPT0gKHVpbnQzMl90KVJFU0VUKQorICAgICAgICB7CisgICAgICAgICAgaWYoY291bnRlcisrID09IChTeXN0ZW1Db3JlQ2xvY2sgLzQ4VSkpIC8qIFRpbWVvdXQgPSB+IDFzICovCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGhSVENfSGFuZGxlLkluc3RhbmNlLT5EUiA9IDBVOworICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPlRSID0gMFU7CisKKyAgICAgIGhSVENfSGFuZGxlLkluc3RhbmNlLT5JU1IgJj0gKHVpbnQzMl90KX5SVENfSVNSX0lOSVQ7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoJmhSVENfSGFuZGxlKTsKKworICAgICAgSEFMX05WSUNfU2V0UHJpb3JpdHkoUlRDX0FsYXJtX0lSUW4sIFRpY2tQcmlvcml0eSwgMFUpOworICAgICAgSEFMX05WSUNfRW5hYmxlSVJRKFJUQ19BbGFybV9JUlFuKTsKKyAgICAgIHJldHVybiBIQUxfT0s7CisgICAgfQorICB9CisgIHJldHVybiBIQUxfRVJST1I7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3VzcGVuZCBUaWNrIGluY3JlbWVudC4KKyAgKiBAbm90ZSAgIERpc2FibGUgdGhlIHRpY2sgaW5jcmVtZW50IGJ5IGRpc2FibGluZyBSVEMgQUxBUk0gaW50ZXJydXB0LgorICAqIEBwYXJhbSAgTm9uZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfU3VzcGVuZFRpY2sodm9pZCkKK3sKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoJmhSVENfSGFuZGxlKTsKKyAgLyogRGlzYWJsZSBSVEMgQUxBUk0gdXBkYXRlIEludGVycnVwdCAqLworICBfX0hBTF9SVENfQUxBUk1fRElTQUJMRV9JVCgmaFJUQ19IYW5kbGUsIFJUQ19JVF9BTFJBKTsKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKCZoUlRDX0hhbmRsZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVzdW1lIFRpY2sgaW5jcmVtZW50LgorICAqIEBub3RlICAgRW5hYmxlIHRoZSB0aWNrIGluY3JlbWVudCBieSBFbmFibGluZyBSVEMgQUxBUk0gaW50ZXJydXB0LgorICAqIEBwYXJhbSAgTm9uZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUmVzdW1lVGljayh2b2lkKQoreworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRSgmaFJUQ19IYW5kbGUpOworICAvKiBFbmFibGUgUlRDIEFMQVJNIFVwZGF0ZSBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfUlRDX0FMQVJNX0VOQUJMRV9JVCgmaFJUQ19IYW5kbGUsIFJUQ19JVF9BTFJBKTsKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKCZoUlRDX0hhbmRsZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQUxBUk0gQSBFdmVudCBDYWxsYmFjayBpbiBub24gYmxvY2tpbmcgbW9kZQorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgIHdoZW4gUlRDX0FMQVJNIGludGVycnVwdCB0b29rIHBsYWNlLCBpbnNpZGUKKyAgKiBSVENfQWxhcm1fSVJRSGFuZGxlcigpLiBJdCBtYWtlcyBhIGRpcmVjdCBjYWxsIHRvIEhBTF9JbmNUaWNrKCkgdG8gaW5jcmVtZW50CisgICogYSBnbG9iYWwgdmFyaWFibGUgInV3VGljayIgdXNlZCBhcyBhcHBsaWNhdGlvbiB0aW1lIGJhc2UuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1JUQ19BbGFybUFFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreworICBfX0lPIHVpbnQzMl90IGNvdW50ZXIgPSAwVTsKKworICBIQUxfSW5jVGljaygpOworCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKworICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgaHJ0Yy0+SW5zdGFuY2UtPklTUiA9ICh1aW50MzJfdClSVENfSU5JVF9NQVNLOworCisgIHdoaWxlKChocnRjLT5JbnN0YW5jZS0+SVNSICYgUlRDX0lTUl9JTklURikgPT0gKHVpbnQzMl90KVJFU0VUKQorICB7CisgICAgaWYoY291bnRlcisrID09IChTeXN0ZW1Db3JlQ2xvY2sgLzQ4VSkpIC8qIFRpbWVvdXQgPSB+IDFzICovCisgICAgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaHJ0Yy0+SW5zdGFuY2UtPkRSID0gMFU7CisgIGhydGMtPkluc3RhbmNlLT5UUiA9IDBVOworCisgIGhydGMtPkluc3RhbmNlLT5JU1IgJj0gKHVpbnQzMl90KX5SVENfSVNSX0lOSVQ7CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBSVEMgQUxBUk0gaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBOb25lCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIFJUQ19BbGFybV9JUlFIYW5kbGVyKHZvaWQpCit7CisgIEhBTF9SVENfQWxhcm1JUlFIYW5kbGVyKCZoUlRDX0hhbmRsZSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmM3h4X2hhbF90aW1lYmFzZV9ydGNfd2FrZXVwX3RlbXBsYXRlLmMgYi9TcmMvc3RtMzJmM3h4X2hhbF90aW1lYmFzZV9ydGNfd2FrZXVwX3RlbXBsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgyM2M5ZgotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfaGFsX3RpbWViYXNlX3J0Y193YWtldXBfdGVtcGxhdGUuYwpAQCAtMCwwICsxLDI5NCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfdGltZWJhc2VfcnRjX3dha2V1cF90ZW1wbGF0ZS5jIAorICAqIEBicmllZiAgIEhBTCB0aW1lIGJhc2UgYmFzZWQgb24gdGhlIGhhcmR3YXJlIFJUQ19XQUtFVVAgVGVtcGxhdGUuCisgICogICAgCisgICogICAgICAgICAgVGhpcyBmaWxlIG92ZXJyaWRlcyB0aGUgbmF0aXZlIEhBTCB0aW1lIGJhc2UgZnVuY3Rpb25zIChkZWZpbmVkIGFzIHdlYWspCisgICogICAgICAgICAgdG8gdXNlIHRoZSBSVEMgV0FLRVVQIGZvciB0aGUgdGltZSBiYXNlIGdlbmVyYXRpb246CisgICogICAgICAgICAgICsgSW50aWFsaXplcyB0aGUgUlRDIHBlcmlwaGVyYWwgYW5kIGNvbmZpZ3VyZXMgdGhlIHdha2V1cCB0aW1lciB0byBiZQorICAqICAgICAgICAgICAgIGluY3JlbWVudGVkIGVhY2ggMW1zCisgICogICAgICAgICAgICsgVGhlIHdha2V1cCBmZWF0dXJlIGlzIGNvbmZpZ3VyZWQgdG8gYXNzZXJ0IGFuIGludGVycnVwdCBlYWNoIDFtcyAKKyAgKiAgICAgICAgICAgKyBIQUxfSW5jVGljayBpcyBjYWxsZWQgaW5zaWRlIHRoZSBIQUxfUlRDRXhfV2FrZVVwVGltZXJFdmVudENhbGxiYWNrCisgICogICAgICAgICAgICsgSFNFIChkZWZhdWx0KSwgTFNFIG9yIExTSSBjYW4gYmUgc2VsZWN0ZWQgYXMgUlRDIGNsb2NrIHNvdXJjZQorIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgZmlsZSBtdXN0IGJlIGNvcGllZCB0byB0aGUgYXBwbGljYXRpb24gZm9sZGVyIGFuZCBtb2RpZmllZCBhcyBmb2xsb3dzOgorICAgICgjKSBSZW5hbWUgaXQgdG8gJ3N0bTMyZjN4eF9oYWxfdGltZWJhc2VfcnRjX3dha2V1cC5jJworICAgICgjKSBBZGQgdGhpcyBmaWxlIGFuZCB0aGUgUlRDIEhBTCBkcml2ZXJzIHRvIHlvdXIgcHJvamVjdCBhbmQgdW5jb21tZW50CisgICAgICAgSEFMX1JUQ19NT0RVTEVfRU5BQkxFRCBkZWZpbmUgaW4gc3RtMzJmM3h4X2hhbF9jb25mLmggCisKKyAgICBbLi5dCisgICAgKEApIEhBTCBSVEMgYWxhcm0gYW5kIEhBTCBSVEMgd2FrZXVwIGRyaXZlcnMgY2FuknQgYmUgdXNlZCB3aXRoIGxvdyBwb3dlciBtb2RlczoKKyAgICAgICAgVGhlIHdha2UgdXAgY2FwYWJpbGl0eSBvZiB0aGUgUlRDIG1heSBiZSBpbnRydXNpdmUgaW4gY2FzZSBvZiBwcmlvciBsb3cgcG93ZXIgbW9kZQorICAgICAgICBjb25maWd1cmF0aW9uIHJlcXVpcmluZyBkaWZmZXJlbnQgd2FrZSB1cCBzb3VyY2VzLgorICAgICAgICBBcHBsaWNhdGlvbi9FeGFtcGxlIGJlaGF2aW9yIGlzIG5vIG1vcmUgZ3VhcmFudGVlZCAKKyAgICAoQCkgVGhlIHN0bTMyZjN4eF9oYWxfdGltZWJhc2VfdGltIHVzZSBpcyByZWNvbW1lbmRlZCBmb3IgdGhlIEFwcGxpY2F0aW9ucy9FeGFtcGxlcworICAgICAgICAgIHJlcXVpcmluZyBsb3cgcG93ZXIgbW9kZXMKKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbC5oIgorLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfVGltZUJhc2VfUlRDX1dha2VVcF9UZW1wbGF0ZSAgSEFMIFRpbWVCYXNlIFJUQyBXYWtlVXAgVGVtcGxhdGUKKyAgKiBAeworICAqLyAKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFVuY29tbWVudCB0aGUgbGluZSBiZWxvdyB0byBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIFJUQyBDbG9jayBzb3VyY2UgZm9yIHlvdXIgYXBwbGljYXRpb246IAorICArIFJUQ19DTE9DS19TT1VSQ0VfSFNFOiBjYW4gYmUgc2VsZWN0ZWQgZm9yIGFwcGxpY2F0aW9ucyByZXF1aXJpbmcgdGltaW5nIHByZWNpc2lvbi4KKyAgKyBSVENfQ0xPQ0tfU09VUkNFX0xTRTogY2FuIGJlIHNlbGVjdGVkIGZvciBhcHBsaWNhdGlvbnMgd2l0aCBsb3cgY29uc3RyYWludCBvbiB0aW1pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uLgorICArIFJUQ19DTE9DS19TT1VSQ0VfTFNJOiBjYW4gYmUgc2VsZWN0ZWQgZm9yIGFwcGxpY2F0aW9ucyB3aXRoIGxvdyBjb25zdHJhaW50IG9uIHRpbWluZworICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb24uCisgICovCisjZGVmaW5lIFJUQ19DTE9DS19TT1VSQ0VfSFNFCisvKiAjZGVmaW5lIFJUQ19DTE9DS19TT1VSQ0VfTFNFICovCisvKiAjZGVmaW5lIFJUQ19DTE9DS19TT1VSQ0VfTFNJICovCisKKyNpZiBkZWZpbmVkKFJUQ19DTE9DS19TT1VSQ0VfSFNFKQorICAjZGVmaW5lIFJUQ19BU1lOQ0hfUFJFRElWICAgICAgIDQ5VQorICAjZGVmaW5lIFJUQ19TWU5DSF9QUkVESVYgICAgICAgIDRVCisjZWxpZiBkZWZpbmUoUlRDX0NMT0NLX1NPVVJDRV9MU0UpCisgICNkZWZpbmUgUlRDX0FTWU5DSF9QUkVESVYgICAgICAgMFUKKyAgI2RlZmluZSBSVENfU1lOQ0hfUFJFRElWICAgICAgICAzMVUKKyNlbHNlICAvKiBSVENfQ0xPQ0tfU09VUkNFX0xTSSAqLworICAjZGVmaW5lIFJUQ19BU1lOQ0hfUFJFRElWICAgICAgIDBVCisgICNkZWZpbmUgUlRDX1NZTkNIX1BSRURJViAgICAgICAgMzlVCisjZW5kaWYgLyogUlRDX0NMT0NLX1NPVVJDRV9IU0UgKi8KKworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitSVENfSGFuZGxlVHlwZURlZiAgICAgICAgaFJUQ19IYW5kbGU7CisKKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIFJUQ19XS1VQX0lSUUhhbmRsZXIodm9pZCk7CisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSBSVENfV0tVUCBhcyBhIHRpbWUgYmFzZSBzb3VyY2UuIAorICAqICAgICAgICAgVGhlIHRpbWUgc291cmNlIGlzIGNvbmZpZ3VyZWQgIHRvIGhhdmUgMW1zIHRpbWUgYmFzZSB3aXRoIGEgZGVkaWNhdGVkIAorICAqICAgICAgICAgVGljayBpbnRlcnJ1cHQgcHJpb3JpdHkuIAorICAqICAgICAgICAgV2FrZXVwIFRpbWUgYmFzZSA9ICgoUlRDX0FTWU5DSF9QUkVESVYgKyAxKSAqIChSVENfU1lOQ0hfUFJFRElWICsgMSkpIC8gUlRDX0NMT0NLIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDFtcworICAqICAgICAgICAgV2FrZXVwIFRpbWUgPSBXYWtldXBUaW1lYmFzZSAqIFdha2VVcENvdW50ZXIgKDAgKyAxKSAKKyAgICAgICAgICAgICAgICAgICAgICAgID0gMSBtcworICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgIGF1dG9tYXRpY2FsbHkgYXQgdGhlIGJlZ2lubmluZyBvZiBwcm9ncmFtIGFmdGVyCisgICogICAgICAgICByZXNldCBieSBIQUxfSW5pdCgpIG9yIGF0IGFueSB0aW1lIHdoZW4gY2xvY2sgaXMgY29uZmlndXJlZCwgYnkgSEFMX1JDQ19DbG9ja0NvbmZpZygpLiAKKyAgKiBAcGFyYW0gIFRpY2tQcmlvcml0eSBUaWNrIGludGVycnVwdCBwcmlvcml0eS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9Jbml0VGljayAodWludDMyX3QgVGlja1ByaW9yaXR5KQoreworICBfX0lPIHVpbnQzMl90IGNvdW50ZXIgPSAwVTsKKworICBSQ0NfT3NjSW5pdFR5cGVEZWYgICAgICAgIFJDQ19Pc2NJbml0U3RydWN0OworICBSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWYgIFBlcmlwaENsa0luaXRTdHJ1Y3Q7CisKKyNpZmRlZiBSVENfQ0xPQ0tfU09VUkNFX0xTRQorICAvKiBDb25maWd1ZSBMU0UgYXMgUlRDIGNsb2NrIHNvdWNyZSAqLworICBSQ0NfT3NjSW5pdFN0cnVjdC5Pc2NpbGxhdG9yVHlwZSA9IFJDQ19PU0NJTExBVE9SVFlQRV9MU0U7CisgIFJDQ19Pc2NJbml0U3RydWN0LlBMTC5QTExTdGF0ZSA9IFJDQ19QTExfTk9ORTsKKyAgUkNDX09zY0luaXRTdHJ1Y3QuTFNFU3RhdGUgPSBSQ0NfTFNFX09OOworICBQZXJpcGhDbGtJbml0U3RydWN0LlJUQ0Nsb2NrU2VsZWN0aW9uID0gUkNDX1JUQ0NMS1NPVVJDRV9MU0U7CisjZWxpZiBkZWZpbmVkIChSVENfQ0xPQ0tfU09VUkNFX0xTSSkKKyAgLyogQ29uZmlndWUgTFNJIGFzIFJUQyBjbG9jayBzb3VjcmUgKi8KKyAgUkNDX09zY0luaXRTdHJ1Y3QuT3NjaWxsYXRvclR5cGUgPSBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNJOworICBSQ0NfT3NjSW5pdFN0cnVjdC5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX05PTkU7CisgIFJDQ19Pc2NJbml0U3RydWN0LkxTSVN0YXRlID0gUkNDX0xTSV9PTjsKKyAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5SVENDbG9ja1NlbGVjdGlvbiA9IFJDQ19SVENDTEtTT1VSQ0VfTFNJOworI2VsaWYgZGVmaW5lZCAoUlRDX0NMT0NLX1NPVVJDRV9IU0UpCisgIC8qIENvbmZpZ3VlIEhTRSBhcyBSVEMgY2xvY2sgc291Y3JlICovCisgIFJDQ19Pc2NJbml0U3RydWN0Lk9zY2lsbGF0b3JUeXBlID0gUkNDX09TQ0lMTEFUT1JUWVBFX0hTRTsKKyAgUkNDX09zY0luaXRTdHJ1Y3QuUExMLlBMTFN0YXRlID0gUkNDX1BMTF9OT05FOworICBSQ0NfT3NjSW5pdFN0cnVjdC5IU0VTdGF0ZSA9IFJDQ19IU0VfT047CisgIFBlcmlwaENsa0luaXRTdHJ1Y3QuUlRDQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUlRDQ0xLU09VUkNFX0hTRV9ESVYzMjsKKyNlbHNlCisjZXJyb3IgUGxlYXNlIHNlbGVjdCB0aGUgUlRDIENsb2NrIHNvdXJjZQorI2VuZGlmIC8qIFJUQ19DTE9DS19TT1VSQ0VfTFNFICovCisKKyAgaWYoSEFMX1JDQ19Pc2NDb25maWcoJlJDQ19Pc2NJbml0U3RydWN0KSA9PSBIQUxfT0spCisgIHsgCisgICAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5QZXJpcGhDbG9ja1NlbGVjdGlvbiA9IFJDQ19QRVJJUEhDTEtfUlRDOworICAgIGlmKEhBTF9SQ0NFeF9QZXJpcGhDTEtDb25maWcoJlBlcmlwaENsa0luaXRTdHJ1Y3QpID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBFbmFibGUgUlRDIENsb2NrICovCisgICAgICBfX0hBTF9SQ0NfUlRDX0VOQUJMRSgpOworICAgICAgLyogVGhlIHRpbWUgYmFzZSBzaG91bGQgYmUgMW1zIAorICAgICAgICAgVGltZSBiYXNlID0gKChSVENfQVNZTkNIX1BSRURJViArIDFVKSAqIChSVENfU1lOQ0hfUFJFRElWICsgMVUpKSAvIFJUQ19DTE9DSyAKKyAgICAgICAgIEhTRS8zMiBhcyBSVEMgY2xvY2sgYW5kIEhTRSA4TUh6CisgICAgICAgICAgIFRpbWUgYmFzZSA9ICgoNDlVICsgMVUpICogKDRVICsgMVUpKSAvIDI1MGtIegorICAgICAgICAgICAgICAgICAgICAgPSAxbXMKKyAgICAgICAgIExTRSBhcyBSVEMgY2xvY2sgCisgICAgICAgICAgIFRpbWUgYmFzZSA9ICgoMzFVICsgMVUpICogKDBVICsgMVUpKSAvIDMyLjc2OEtoegorICAgICAgICAgICAgICAgICAgICAgPSB+MW1zCisgICAgICAgICBMU0kgYXMgUlRDIGNsb2NrIAorICAgICAgICAgICBUaW1lIGJhc2UgPSAoKDM5VSArIDFVKSAqICgwVSArIDFVKSkgLyA0MEtoegorICAgICAgICAgICAgICAgICAgICAgPSAxbXMKKyAgICAgICovCisgICAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZSA9IFJUQzsKKyAgICAgIGhSVENfSGFuZGxlLkluaXQuSG91ckZvcm1hdCA9IFJUQ19IT1VSRk9STUFUXzI0OworICAgICAgaFJUQ19IYW5kbGUuSW5pdC5Bc3luY2hQcmVkaXYgPSBSVENfQVNZTkNIX1BSRURJVjsKKyAgICAgIGhSVENfSGFuZGxlLkluaXQuU3luY2hQcmVkaXYgPSBSVENfU1lOQ0hfUFJFRElWOworICAgICAgaFJUQ19IYW5kbGUuSW5pdC5PdXRQdXQgPSBSVENfT1VUUFVUX0RJU0FCTEU7CisgICAgICBoUlRDX0hhbmRsZS5Jbml0Lk91dFB1dFBvbGFyaXR5ID0gUlRDX09VVFBVVF9QT0xBUklUWV9ISUdIOworICAgICAgaFJUQ19IYW5kbGUuSW5pdC5PdXRQdXRUeXBlID0gUlRDX09VVFBVVF9UWVBFX09QRU5EUkFJTjsKKyAgICAgIEhBTF9SVENfSW5pdCgmaFJUQ19IYW5kbGUpOworCisgICAgICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoJmhSVENfSGFuZGxlKTsKKworICAgICAgLyogRGlzYWJsZSB0aGUgV2FrZS11cCBUaW1lciAqLworICAgICAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0RJU0FCTEUoJmhSVENfSGFuZGxlKTsKKworICAgICAgLyogSW4gY2FzZSBvZiBpbnRlcnJ1cHQgbW9kZSBpcyB1c2VkLCB0aGUgaW50ZXJydXB0IHNvdXJjZSBtdXN0IGRpc2FibGVkICovIAorICAgICAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0RJU0FCTEVfSVQoJmhSVENfSGFuZGxlLFJUQ19JVF9XVVQpOworCisgICAgICAvKiBXYWl0IHRpbGwgUlRDIFdVVFdGIGZsYWcgaXMgc2V0ICAqLworICAgICAgd2hpbGUoX19IQUxfUlRDX1dBS0VVUFRJTUVSX0dFVF9GTEFHKCZoUlRDX0hhbmRsZSwgUlRDX0ZMQUdfV1VUV0YpID09IFJFU0VUKQorICAgICAgeworICAgICAgICBpZihjb3VudGVyKysgPT0gKFN5c3RlbUNvcmVDbG9jayAvNDhVKSkgCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIENsZWFyIFBXUiB3YWtlIHVwIEZsYWcgKi8KKyAgICAgIF9fSEFMX1BXUl9DTEVBUl9GTEFHKFBXUl9GTEFHX1dVKTsKKworICAgICAgLyogQ2xlYXIgUlRDIFdha2UgVXAgdGltZXIgRmxhZyAqLworICAgICAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0NMRUFSX0ZMQUcoJmhSVENfSGFuZGxlLCBSVENfRkxBR19XVVRGKTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBXYWtlLXVwIFRpbWVyIGNvdW50ZXIgKi8KKyAgICAgIGhSVENfSGFuZGxlLkluc3RhbmNlLT5XVVRSID0gMFU7CisKKyAgICAgIC8qIENsZWFyIHRoZSBXYWtlLXVwIFRpbWVyIGNsb2NrIHNvdXJjZSBiaXRzIGluIENSIHJlZ2lzdGVyICovCisgICAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZS0+Q1IgJj0gKHVpbnQzMl90KX5SVENfQ1JfV1VDS1NFTDsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBjbG9jayBzb3VyY2UgKi8KKyAgICAgIGhSVENfSGFuZGxlLkluc3RhbmNlLT5DUiB8PSAodWludDMyX3QpUlRDX1dBS0VVUENMT0NLX0NLX1NQUkVfMTZCSVRTOworCisgICAgICAvKiBSVEMgV2FrZVVwVGltZXIgSW50ZXJydXB0IENvbmZpZ3VyYXRpb246IEVYVEkgY29uZmlndXJhdGlvbiAqLworICAgICAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfRU5BQkxFX0lUKCk7CisKKyAgICAgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIEludGVycnVwdCBpbiB0aGUgUlRDX0NSIHJlZ2lzdGVyICovCisgICAgICBfX0hBTF9SVENfV0FLRVVQVElNRVJfRU5BQkxFX0lUKCZoUlRDX0hhbmRsZSxSVENfSVRfV1VUKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBXYWtlLXVwIFRpbWVyICovCisgICAgICBfX0hBTF9SVENfV0FLRVVQVElNRVJfRU5BQkxFKCZoUlRDX0hhbmRsZSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoJmhSVENfSGFuZGxlKTsKKworICAgICAgSEFMX05WSUNfU2V0UHJpb3JpdHkoUlRDX1dLVVBfSVJRbiwgVGlja1ByaW9yaXR5LCAwVSk7CisgICAgICBIQUxfTlZJQ19FbmFibGVJUlEoUlRDX1dLVVBfSVJRbik7IAorICAgICAgcmV0dXJuIEhBTF9PSzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEhBTF9FUlJPUjsKK30KKworLyoqCisgICogQGJyaWVmICBTdXNwZW5kIFRpY2sgaW5jcmVtZW50LgorICAqIEBub3RlICAgRGlzYWJsZSB0aGUgdGljayBpbmNyZW1lbnQgYnkgZGlzYWJsaW5nIFJUQ19XS1VQIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIE5vbmUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1N1c3BlbmRUaWNrKHZvaWQpCit7CisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKCZoUlRDX0hhbmRsZSk7CisgIC8qIERpc2FibGUgV0FLRSBVUCBUSU1FUiBJbnRlcnJ1cHQgKi8KKyAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0RJU0FCTEVfSVQoJmhSVENfSGFuZGxlLCBSVENfSVRfV1VUKTsKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKCZoUlRDX0hhbmRsZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVzdW1lIFRpY2sgaW5jcmVtZW50LgorICAqIEBub3RlICAgRW5hYmxlIHRoZSB0aWNrIGluY3JlbWVudCBieSBFbmFibGluZyBSVENfV0tVUCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBOb25lCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9SZXN1bWVUaWNrKHZvaWQpCit7CisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKCZoUlRDX0hhbmRsZSk7CisgIC8qIEVuYWJsZSAgV0FLRSBVUCBUSU1FUiAgaW50ZXJydXB0ICovCisgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FTkFCTEVfSVQoJmhSVENfSGFuZGxlLCBSVENfSVRfV1VUKTsKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKCZoUlRDX0hhbmRsZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgV2FrZSBVcCBUaW1lciBFdmVudCBDYWxsYmFjayBpbiBub24gYmxvY2tpbmcgbW9kZQorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgIHdoZW4gUlRDX1dLVVAgaW50ZXJydXB0IHRvb2sgcGxhY2UsIGluc2lkZQorICAqIFJUQ19XS1VQX0lSUUhhbmRsZXIoKS4gSXQgbWFrZXMgYSBkaXJlY3QgY2FsbCB0byBIQUxfSW5jVGljaygpIHRvIGluY3JlbWVudAorICAqIGEgZ2xvYmFsIHZhcmlhYmxlICJ1d1RpY2siIHVzZWQgYXMgYXBwbGljYXRpb24gdGltZSBiYXNlLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9SVENFeF9XYWtlVXBUaW1lckV2ZW50Q2FsbGJhY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpCit7CisgIEhBTF9JbmNUaWNrKCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzICBXQUtFIFVQIFRJTUVSICBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIE5vbmUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgUlRDX1dLVVBfSVJRSGFuZGxlcih2b2lkKQoreworICBIQUxfUlRDRXhfV2FrZVVwVGltZXJJUlFIYW5kbGVyKCZoUlRDX0hhbmRsZSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmM3h4X2hhbF90aW1lYmFzZV90aW1fdGVtcGxhdGUuYyBiL1NyYy9zdG0zMmYzeHhfaGFsX3RpbWViYXNlX3RpbV90ZW1wbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzM2RkODIKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJmM3h4X2hhbF90aW1lYmFzZV90aW1fdGVtcGxhdGUuYwpAQCAtMCwwICsxLDE4NCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfdGltZWJhc2VfdGltX3RlbXBsYXRlLmMgCisgICogQGJyaWVmICAgSEFMIHRpbWUgYmFzZSBiYXNlZCBvbiB0aGUgaGFyZHdhcmUgVElNIFRlbXBsYXRlLgorICAqICAgIAorICAqICAgICAgICAgIFRoaXMgZmlsZSBvdmVycmlkZSB0aGUgbmF0aXZlIEhBTCB0aW1lIGJhc2UgZnVuY3Rpb25zIChkZWZpbmVkIGFzIHdlYWspCisgICogICAgICAgICAgdGhlIFRJTSB0aW1lIGJhc2U6CisgICogICAgICAgICAgICsgSW50aWFsaXplcyB0aGUgVElNIHBlcmlwaGVyYWwgZ2VuZXJhdGUgYSBQZXJpb2QgZWxhcHNlZCBFdmVudCBlYWNoIDFtcworICAqICAgICAgICAgICArIEhBTF9JbmNUaWNrIGlzIGNhbGxlZCBpbnNpZGUgSEFMX1RJTV9QZXJpb2RFbGFwc2VkQ2FsbGJhY2sgaWUgZWFjaCAxbXMKKyAgKiAKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgSEFMX1RpbWVCYXNlX1RJTQorICAqIEB7CisgICovIAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVElNX0hhbmRsZVR5cGVEZWYgICAgICAgIFRpbUhhbmRsZTsKKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIFRJTTZfREFDX0lSUUhhbmRsZXIodm9pZCk7CisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgVElNNiBhcyBhIHRpbWUgYmFzZSBzb3VyY2UuIAorICAqICAgICAgICAgVGhlIHRpbWUgc291cmNlIGlzIGNvbmZpZ3VyZWQgIHRvIGhhdmUgMW1zIHRpbWUgYmFzZSB3aXRoIGEgZGVkaWNhdGVkIAorICAqICAgICAgICAgVGljayBpbnRlcnJ1cHQgcHJpb3JpdHkuIAorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgIGF1dG9tYXRpY2FsbHkgYXQgdGhlIGJlZ2lubmluZyBvZiBwcm9ncmFtIGFmdGVyCisgICogICAgICAgICByZXNldCBieSBIQUxfSW5pdCgpIG9yIGF0IGFueSB0aW1lIHdoZW4gY2xvY2sgaXMgY29uZmlndXJlZCwgYnkgSEFMX1JDQ19DbG9ja0NvbmZpZygpLiAKKyAgKiBAcGFyYW0gIFRpY2tQcmlvcml0eSBUaWNrIGludGVycnVwdCBwcmlvcml0eS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9Jbml0VGljayAodWludDMyX3QgVGlja1ByaW9yaXR5KQoreworICBSQ0NfQ2xrSW5pdFR5cGVEZWYgICAgY2xrY29uZmlnOworICB1aW50MzJfdCAgICAgICAgICAgICAgdXdUaW1jbG9jaywgdXdBUEIxUHJlc2NhbGVyID0gMFU7CisgIHVpbnQzMl90ICAgICAgICAgICAgICB1d1ByZXNjYWxlclZhbHVlID0gMFU7CisgIHVpbnQzMl90ICAgICAgICAgICAgICBwRkxhdGVuY3k7CisgIAorICAgIC8qQ29uZmlndXJlIHRoZSBUSU02IElSUSBwcmlvcml0eSAqLworICBIQUxfTlZJQ19TZXRQcmlvcml0eShUSU02X0RBQ19JUlFuLCBUaWNrUHJpb3JpdHkgLDBVKTsKKyAgCisgIC8qIEVuYWJsZSB0aGUgVElNNiBnbG9iYWwgSW50ZXJydXB0ICovCisgIEhBTF9OVklDX0VuYWJsZUlSUShUSU02X0RBQ19JUlFuKTsKKyAgCisgIC8qIEVuYWJsZSBUSU02IGNsb2NrICovCisgIF9fSEFMX1JDQ19USU02X0NMS19FTkFCTEUoKTsKKyAgCisgIC8qIEdldCBjbG9jayBjb25maWd1cmF0aW9uICovCisgIEhBTF9SQ0NfR2V0Q2xvY2tDb25maWcoJmNsa2NvbmZpZywgJnBGTGF0ZW5jeSk7CisgIAorICAvKiBHZXQgQVBCMSBwcmVzY2FsZXIgKi8KKyAgdXdBUEIxUHJlc2NhbGVyID0gY2xrY29uZmlnLkFQQjFDTEtEaXZpZGVyOworICAKKyAgLyogQ29tcHV0ZSBUSU02IGNsb2NrICovCisgIGlmICh1d0FQQjFQcmVzY2FsZXIgPT0gUkNDX0hDTEtfRElWMSkgCisgIHsKKyAgICB1d1RpbWNsb2NrID0gSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICB1d1RpbWNsb2NrID0gMlUqSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKTsKKyAgfQorICAKKyAgLyogQ29tcHV0ZSB0aGUgcHJlc2NhbGVyIHZhbHVlIHRvIGhhdmUgVElNNiBjb3VudGVyIGNsb2NrIGVxdWFsIHRvIDFNSHogKi8KKyAgdXdQcmVzY2FsZXJWYWx1ZSA9ICh1aW50MzJfdCkgKCh1d1RpbWNsb2NrIC8gMTAwMDAwMFUpIC0gMVUpOworICAKKyAgLyogSW5pdGlhbGl6ZSBUSU02ICovCisgIFRpbUhhbmRsZS5JbnN0YW5jZSA9IFRJTTY7CisgIAorICAvKiBJbml0aWFsaXplIFRJTXggcGVyaXBoZXJhbCBhcyBmb2xsb3c6CisgICsgUGVyaW9kID0gWyhUSU02Q0xLLzEwMDBVKSAtIDFdLiB0byBoYXZlIGEgKDFVLzEwMDBVKSBzIHRpbWUgYmFzZS4KKyAgKyBQcmVzY2FsZXIgPSAodXdUaW1jbG9jay8xMDAwMDAwVSAtIDFVKSB0byBoYXZlIGEgMU1IeiBjb3VudGVyIGNsb2NrLgorICArIENsb2NrRGl2aXNpb24gPSAwCisgICsgQ291bnRlciBkaXJlY3Rpb24gPSBVcAorICAqLworICBUaW1IYW5kbGUuSW5pdC5QZXJpb2QgPSAoMTAwMDAwMFUgLyAxMDAwVSkgLSAxVTsKKyAgVGltSGFuZGxlLkluaXQuUHJlc2NhbGVyID0gdXdQcmVzY2FsZXJWYWx1ZTsKKyAgVGltSGFuZGxlLkluaXQuQ2xvY2tEaXZpc2lvbiA9IDBVOworICBUaW1IYW5kbGUuSW5pdC5Db3VudGVyTW9kZSA9IFRJTV9DT1VOVEVSTU9ERV9VUDsKKyAgVGltSGFuZGxlLkluaXQuQXV0b1JlbG9hZFByZWxvYWQgPSBUSU1fQVVUT1JFTE9BRF9QUkVMT0FEX0RJU0FCTEU7CisgIGlmKEhBTF9USU1fQmFzZV9Jbml0KCZUaW1IYW5kbGUpID09IEhBTF9PSykKKyAgeworICAgIC8qIFN0YXJ0IHRoZSBUSU0gdGltZSBCYXNlIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUgKi8KKyAgICByZXR1cm4gSEFMX1RJTV9CYXNlX1N0YXJ0X0lUKCZUaW1IYW5kbGUpOworICB9CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfRVJST1I7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3VzcGVuZCBUaWNrIGluY3JlbWVudC4KKyAgKiBAbm90ZSAgIERpc2FibGUgdGhlIHRpY2sgaW5jcmVtZW50IGJ5IGRpc2FibGluZyBUSU02IHVwZGF0ZSBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBOb25lCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9TdXNwZW5kVGljayh2b2lkKQoreworICAvKiBEaXNhYmxlIFRJTTYgdXBkYXRlIEludGVycnVwdCAqLworICBfX0hBTF9USU1fRElTQUJMRV9JVCgmVGltSGFuZGxlLCBUSU1fSVRfVVBEQVRFKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXN1bWUgVGljayBpbmNyZW1lbnQuCisgICogQG5vdGUgICBFbmFibGUgdGhlIHRpY2sgaW5jcmVtZW50IGJ5IEVuYWJsaW5nIFRJTTYgdXBkYXRlIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIE5vbmUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1Jlc3VtZVRpY2sodm9pZCkKK3sKKyAgLyogRW5hYmxlIFRJTTYgVXBkYXRlIGludGVycnVwdCAqLworICBfX0hBTF9USU1fRU5BQkxFX0lUKCZUaW1IYW5kbGUsIFRJTV9JVF9VUERBVEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFBlcmlvZCBlbGFwc2VkIGNhbGxiYWNrIGluIG5vbiBibG9ja2luZyBtb2RlCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAgd2hlbiBUSU02IGludGVycnVwdCB0b29rIHBsYWNlLCBpbnNpZGUKKyAgKiBIQUxfVElNX0lSUUhhbmRsZXIoKS4gSXQgbWFrZXMgYSBkaXJlY3QgY2FsbCB0byBIQUxfSW5jVGljaygpIHRvIGluY3JlbWVudAorICAqIGEgZ2xvYmFsIHZhcmlhYmxlICJ1d1RpY2siIHVzZWQgYXMgYXBwbGljYXRpb24gdGltZSBiYXNlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9USU1fUGVyaW9kRWxhcHNlZENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICBIQUxfSW5jVGljaygpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBUSU0gaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBOb25lCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIFRJTTZfREFDX0lSUUhhbmRsZXIodm9pZCkKK3sKKyAgSEFMX1RJTV9JUlFIYW5kbGVyKCZUaW1IYW5kbGUpOworfQorCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqCisgICogQH0KKyAgKi8gCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmM3h4X2hhbF90c2MuYyBiL1NyYy9zdG0zMmYzeHhfaGFsX3RzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNzA0YTAKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJmM3h4X2hhbF90c2MuYwpAQCAtMCwwICsxLDg3MyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfdHNjLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcgCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBUb3VjaCBTZW5zaW5nIENvbnRyb2xsZXIgKFRTQykgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgRGUtaW5pdGlhbGl6YXRpb24KKyAgKiAgICAgICAgICAgKyBDaGFubmVsIElPcywgU2hpZWxkIElPcyBhbmQgU2FtcGxpbmcgSU9zIGNvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBTdGFydCBhbmQgU3RvcCBhbiBhY3F1aXNpdGlvbgorICAqICAgICAgICAgICArIFJlYWQgYWNxdWlzaXRpb24gcmVzdWx0CisgICogICAgICAgICAgICsgSW50ZXJydXB0cyBhbmQgZmxhZ3MgbWFuYWdlbWVudAorICAqICAgICAgICAgCisgIEB2ZXJiYXRpbQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgVFNDIHNwZWNpZmljIGZlYXR1cmVzICMjIyMjCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICgjKSBQcm92ZW4gYW5kIHJvYnVzdCBzdXJmYWNlIGNoYXJnZSB0cmFuc2ZlciBhY3F1aXNpdGlvbiBwcmluY2lwbGUKKyAgICAKKyAgKCMpIFN1cHBvcnRzIHVwIHRvIDMgY2FwYWNpdGl2ZSBzZW5zaW5nIGNoYW5uZWxzIHBlciBncm91cAorICAgIAorICAoIykgQ2FwYWNpdGl2ZSBzZW5zaW5nIGNoYW5uZWxzIGNhbiBiZSBhY3F1aXJlZCBpbiBwYXJhbGxlbCBvZmZlcmluZyBhIHZlcnkgZ29vZAorICAgICAgcmVzcG9uc2UgdGltZQorICAgICAgCisgICgjKSBTcHJlYWQgc3BlY3RydW0gZmVhdHVyZSB0byBpbXByb3ZlIHN5c3RlbSByb2J1c3RuZXNzIGluIG5vaXN5IGVudmlyb25tZW50cworICAgCisgICgjKSBGdWxsIGhhcmR3YXJlIG1hbmFnZW1lbnQgb2YgdGhlIGNoYXJnZSB0cmFuc2ZlciBhY3F1aXNpdGlvbiBzZXF1ZW5jZQorICAgCisgICgjKSBQcm9ncmFtbWFibGUgY2hhcmdlIHRyYW5zZmVyIGZyZXF1ZW5jeQorICAgCisgICgjKSBQcm9ncmFtbWFibGUgc2FtcGxpbmcgY2FwYWNpdG9yIEkvTyBwaW4KKyAgIAorICAoIykgUHJvZ3JhbW1hYmxlIGNoYW5uZWwgSS9PIHBpbgorICAgCisgICgjKSBQcm9ncmFtbWFibGUgbWF4IGNvdW50IHZhbHVlIHRvIGF2b2lkIGxvbmcgYWNxdWlzaXRpb24gd2hlbiBhIGNoYW5uZWwgaXMgZmF1bHR5CisgICAKKyAgKCMpIERlZGljYXRlZCBlbmQgb2YgYWNxdWlzaXRpb24gYW5kIG1heCBjb3VudCBlcnJvciBmbGFncyB3aXRoIGludGVycnVwdCBjYXBhYmlsaXR5CisgICAKKyAgKCMpIE9uZSBzYW1wbGluZyBjYXBhY2l0b3IgZm9yIHVwIHRvIDMgY2FwYWNpdGl2ZSBzZW5zaW5nIGNoYW5uZWxzIHRvIHJlZHVjZSB0aGUgc3lzdGVtCisgICAgICBjb21wb25lbnRzCisgICAKKyAgKCMpIENvbXBhdGlibGUgd2l0aCBwcm94aW1pdHksIHRvdWNoa2V5LCBsaW5lYXIgYW5kIHJvdGFyeSB0b3VjaCBzZW5zb3IgaW1wbGVtZW50YXRpb24KKworICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICAoIykgRW5hYmxlIHRoZSBUU0MgaW50ZXJmYWNlIGNsb2NrIHVzaW5nIF9fSEFMX1JDQ19UU0NfQ0xLX0VOQUJMRSgpIG1hY3JvLgorCisgICAgKCMpIEdQSU8gcGlucyBjb25maWd1cmF0aW9uCisgICAgICAoKyspIEVuYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBUU0MgR1BJT3MgdXNpbmcgX19IQUxfUkNDX0dQSU94X0NMS19FTkFCTEUoKSBtYWNyby4KKyAgICAgICgrKykgQ29uZmlndXJlIHRoZSBUU0MgcGlucyB1c2VkIGFzIHNhbXBsaW5nIElPcyBpbiBhbHRlcm5hdGUgZnVuY3Rpb24gb3V0cHV0IE9wZW4tRHJhaW4gbW9kZSwKKyAgICAgICAgICAgYW5kIFRTQyBwaW5zIHVzZWQgYXMgY2hhbm5lbC9zaGllbGQgSU9zIGluIGFsdGVybmF0ZSBmdW5jdGlvbiBvdXRwdXQgUHVzaC1QdWxsIG1vZGUKKyAgICAgICAgICAgdXNpbmcgSEFMX0dQSU9fSW5pdCgpIGZ1bmN0aW9uLgorCisgICAgKCMpIEludGVycnVwdHMgY29uZmlndXJhdGlvbgorICAgICAgKCsrKSBDb25maWd1cmUgdGhlIE5WSUMgKGlmIHRoZSBpbnRlcnJ1cHQgbW9kZWwgaXMgdXNlZCkgdXNpbmcgSEFMX05WSUNfU2V0UHJpb3JpdHkoKSAKKyAgICAgICAgICAgYW5kIEhBTF9OVklDX0VuYWJsZUlSUSgpIGFuZCBmdW5jdGlvbi4KKworICAgICgjKSBUU0MgY29uZmlndXJhdGlvbgorICAgICAgKCsrKSBDb25maWd1cmUgYWxsIFRTQyBwYXJhbWV0ZXJzIGFuZCB1c2VkIFRTQyBJT3MgdXNpbmcgSEFMX1RTQ19Jbml0KCkgZnVuY3Rpb24uCisKKyAKKyAgICoqKiBBY3F1aXNpdGlvbiBzZXF1ZW5jZSAqKioKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgICgrKSBEaXNjaGFyZ2UgYWxsIElPcyB1c2luZyBIQUxfVFNDX0lPRGlzY2hhcmdlKCkgZnVuY3Rpb24uCisgICAgKCspIFdhaXQgYSBjZXJ0YWluIHRpbWUgYWxsb3dpbmcgYSBnb29kIGRpc2NoYXJnZSBvZiBhbGwgY2FwYWNpdG9ycy4gVGhpcyBkZWxheSBkZXBlbmRzCisgICAgICAgIG9mIHRoZSBzYW1wbGluZyBjYXBhY2l0b3IgYW5kIGVsZWN0cm9kZXMgZGVzaWduLgorICAgICgrKSBTZWxlY3QgdGhlIGNoYW5uZWwgSU9zIHRvIGJlIGFjcXVpcmVkIHVzaW5nIEhBTF9UU0NfSU9Db25maWcoKSBmdW5jdGlvbi4KKyAgICAoKykgTGF1bmNoIHRoZSBhY3F1aXNpdGlvbiB1c2luZyBlaXRoZXIgSEFMX1RTQ19TdGFydCgpIG9yIEhBTF9UU0NfU3RhcnRfSVQoKSBmdW5jdGlvbi4KKyAgICAgICAgSWYgdGhlIHN5bmNocm9uaXplZCBtb2RlIGlzIHNlbGVjdGVkLCB0aGUgYWNxdWlzaXRpb24gd2lsbCBzdGFydCBhcyBzb29uIGFzIHRoZSBzaWduYWwKKyAgICAgICAgaXMgcmVjZWl2ZWQgb24gdGhlIHN5bmNocm8gcGluLgorICAgICgrKSBXYWl0IHRoZSBlbmQgb2YgYWNxdWlzaXRpb24gdXNpbmcgZWl0aGVyIEhBTF9UU0NfUG9sbEZvckFjcXVpc2l0aW9uKCkgb3IKKyAgICAgICAgSEFMX1RTQ19HZXRTdGF0ZSgpIGZ1bmN0aW9uIG9yIHVzaW5nIFdGSSBpbnN0cnVjdGlvbiBmb3IgZXhhbXBsZS4KKyAgICAoKykgQ2hlY2sgdGhlIGdyb3VwIGFjcXVpc2l0aW9uIHN0YXR1cyB1c2luZyBIQUxfVFNDX0dyb3VwR2V0U3RhdHVzKCkgZnVuY3Rpb24uCisgICAgKCspIFJlYWQgdGhlIGFjcXVpc2l0aW9uIHZhbHVlIHVzaW5nIEhBTF9UU0NfR3JvdXBHZXRWYWx1ZSgpIGZ1bmN0aW9uLgorICAgICAgCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyoKKyAgQWRkaXRpb24gVGFibGU6CisgICAgVGFibGUgMS4gSU9zIGZvciB0aGUgU1RNMzJGM3h4IGRldmljZXMKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAgICAKKyAgICB8ICAgICAgIElPcyAgICB8ICAgVFNDIGZ1bmN0aW9ucyB8IAorICAgIHwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgUEEwICAoQUYpICB8ICAgVFNDX0cxX0lPMSAgICB8IAorICAgIHwgICBQQTEgIChBRikgIHwgICBUU0NfRzFfSU8yICAgIHwgCisgICAgfCAgIFBBMiAgKEFGKSAgfCAgIFRTQ19HMV9JTzMgICAgfCAKKyAgICB8ICAgUEEzICAoQUYpICB8ICAgVFNDX0cxX0lPNCAgICB8IAorICAgIHwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgUEE0IChBRikgICB8ICAgVFNDX0cyX0lPMSAgICB8IAorICAgIHwgICBQQTUgKEFGKSAgIHwgICBUU0NfRzJfSU8yICAgIHwgCisgICAgfCAgIFBBNiAoQUYpICAgfCAgIFRTQ19HMl9JTzMgICAgfCAKKyAgICB8ICAgUEE3IChBRikgICB8ICAgVFNDX0cyX0lPNCAgICB8IAorICAgIHwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgUEM1ICAoQUYpICB8ICAgVFNDX0czX0lPMSAgICB8IAorICAgIHwgICBQQjAgIChBRikgIHwgICBUU0NfRzNfSU8yICAgIHwgCisgICAgfCAgIFBCMSAgKEFGKSAgfCAgIFRTQ19HM19JTzMgICAgfCAKKyAgICB8ICAgUEIyICAoQUYpICB8ICAgVFNDX0czX0lPNCAgICB8IAorICAgIHwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgUEE5ICAoQUYpICB8ICAgVFNDX0c0X0lPMSAgICB8IAorICAgIHwgICBQQTEwIChBRikgIHwgICBUU0NfRzRfSU8yICAgIHwgCisgICAgfCAgIFBBMTMgKEFGKSAgfCAgIFRTQ19HNF9JTzMgICAgfCAKKyAgICB8ICAgUEExNCAoQUYpICB8ICAgVFNDX0c0X0lPNCAgICB8IAorICAgIHwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgUEIzICAoQUYpICB8ICAgVFNDX0c1X0lPMSAgICB8IAorICAgIHwgICBQQjQgIChBRikgIHwgICBUU0NfRzVfSU8yICAgIHwgCisgICAgfCAgIFBCNiAgKEFGKSAgfCAgIFRTQ19HNV9JTzMgICAgfCAKKyAgICB8ICAgUEI3ICAoQUYpICB8ICAgVFNDX0c1X0lPNCAgICB8IAorICAgIHwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgUEIxMSAoQUYpICB8ICAgVFNDX0c2X0lPMSAgICB8IAorICAgIHwgICBQQjEyIChBRikgIHwgICBUU0NfRzZfSU8yICAgIHwgCisgICAgfCAgIFBCMTMgKEFGKSAgfCAgIFRTQ19HNl9JTzMgICAgfCAKKyAgICB8ICAgUEIxNCAoQUYpICB8ICAgVFNDX0c2X0lPNCAgICB8IAorICAgIHwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgUEUyICAoQUYpICB8ICAgVFNDX0c3X0lPMSAgICB8IAorICAgIHwgICBQRTMgIChBRikgIHwgICBUU0NfRzdfSU8yICAgIHwgCisgICAgfCAgIFBFNCAgKEFGKSAgfCAgIFRTQ19HN19JTzMgICAgfCAKKyAgICB8ICAgUEU1ICAoQUYpICB8ICAgVFNDX0c3X0lPNCAgICB8IAorICAgIHwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgUEQxMiAoQUYpICB8ICAgVFNDX0c4X0lPMSAgICB8IAorICAgIHwgICBQRDEzIChBRikgIHwgICBUU0NfRzhfSU8yICAgIHwgCisgICAgfCAgIFBEMTQgKEFGKSAgfCAgIFRTQ19HOF9JTzMgICAgfCAKKyAgICB8ICAgUEQxNSAoQUYpICB8ICAgVFNDX0c4X0lPNCAgICB8IAorICAgIHwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgUEI4ICAoQUYpICB8ICAgVFNDX1NZTkMgICAgICB8IAorICAgIHwgICBQQjEwIChBRikgIHwgICAgICAgICAgICAgICAgIHwgCisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIFRTQyBwZXJpcGhlcmFsIGFsdGVybmF0ZSBmdW5jdGlvbnMgYXJlIG1hcHBlZCBvbiBBRjMuCisKKyovCisKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVFNDIFRTQworICAqIEBicmllZiBIQUwgVFNDIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX1RTQ19NT0RVTEVfRU5BQkxFRAorICAgIAorLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdWludDMyX3QgVFNDX2V4dHJhY3RfZ3JvdXBzKHVpbnQzMl90IGlvbWFzayk7CisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgVFNDX0V4cG9ydGVkX0Z1bmN0aW9ucyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLyAKKworLyoqIEBkZWZncm91cCBUU0NfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAKKyAqCitAdmVyYmF0aW0gICAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIHRoZSBUU0MuCisgICAgICAoKykgRGUtaW5pdGlhbGl6ZSB0aGUgVFNDLgorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBUU0MgcGVyaXBoZXJhbCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIAorICAqICAgICAgICAgaW4gdGhlIFRTQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgYW5kIGluaXRpYWxpemUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBwYXJhbSAgaHRzYyBUU0MgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVFNDX0luaXQoVFNDX0hhbmRsZVR5cGVEZWYqIGh0c2MpCit7CisgIC8qIENoZWNrIFRTQyBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHRzYyA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19UU0NfQUxMX0lOU1RBTkNFKGh0c2MtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19UU0NfQ1RQSChodHNjLT5Jbml0LkNUUHVsc2VIaWdoTGVuZ3RoKSk7CisgIGFzc2VydF9wYXJhbShJU19UU0NfQ1RQTChodHNjLT5Jbml0LkNUUHVsc2VMb3dMZW5ndGgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19TUyhodHNjLT5Jbml0LlNwcmVhZFNwZWN0cnVtKSk7CisgIGFzc2VydF9wYXJhbShJU19UU0NfU1NEKGh0c2MtPkluaXQuU3ByZWFkU3BlY3RydW1EZXZpYXRpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19TU19QUkVTQyhodHNjLT5Jbml0LlNwcmVhZFNwZWN0cnVtUHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19UU0NfUEdfUFJFU0MoaHRzYy0+SW5pdC5QdWxzZUdlbmVyYXRvclByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfVFNDX01DVihodHNjLT5Jbml0Lk1heENvdW50VmFsdWUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19JT0RFRihodHNjLT5Jbml0LklPRGVmYXVsdE1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19TWU5DX1BPTChodHNjLT5Jbml0LlN5bmNocm9QaW5Qb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfVFNDX0FDUV9NT0RFKGh0c2MtPkluaXQuQWNxdWlzaXRpb25Nb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19UU0NfTUNFX0lUKGh0c2MtPkluaXQuTWF4Q291bnRJbnRlcnJ1cHQpKTsKKyAgICAKKyAgaWYoaHRzYy0+U3RhdGUgPT0gSEFMX1RTQ19TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBodHNjLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworICB9CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgVFNDIHN0YXRlICovCisgIGh0c2MtPlN0YXRlID0gSEFMX1RTQ19TVEFURV9CVVNZOworCisgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBDT1JURVggKi8KKyAgSEFMX1RTQ19Nc3BJbml0KGh0c2MpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgCisgIC8qIFNldCBUU0MgcGFyYW1ldGVycyAqLworCisgIC8qIEVuYWJsZSBUU0MgKi8KKyAgaHRzYy0+SW5zdGFuY2UtPkNSID0gVFNDX0NSX1RTQ0U7CisgIAorICAvKiBTZXQgYWxsIGZ1bmN0aW9ucyAqLworICBodHNjLT5JbnN0YW5jZS0+Q1IgfD0gKGh0c2MtPkluaXQuQ1RQdWxzZUhpZ2hMZW5ndGggfAorICAgICAgICAgICAgICAgICAgICAgICAgIGh0c2MtPkluaXQuQ1RQdWxzZUxvd0xlbmd0aCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KShodHNjLT5Jbml0LlNwcmVhZFNwZWN0cnVtRGV2aWF0aW9uIDw8IDE3VSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgIGh0c2MtPkluaXQuU3ByZWFkU3BlY3RydW1QcmVzY2FsZXIgfAorICAgICAgICAgICAgICAgICAgICAgICAgIGh0c2MtPkluaXQuUHVsc2VHZW5lcmF0b3JQcmVzY2FsZXIgfAorICAgICAgICAgICAgICAgICAgICAgICAgIGh0c2MtPkluaXQuTWF4Q291bnRWYWx1ZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgaHRzYy0+SW5pdC5TeW5jaHJvUGluUG9sYXJpdHkgfAorICAgICAgICAgICAgICAgICAgICAgICAgIGh0c2MtPkluaXQuQWNxdWlzaXRpb25Nb2RlKTsKKworICAvKiBTcHJlYWQgc3BlY3RydW0gKi8KKyAgaWYgKGh0c2MtPkluaXQuU3ByZWFkU3BlY3RydW0gPT0gRU5BQkxFKQorICB7CisgICAgaHRzYy0+SW5zdGFuY2UtPkNSIHw9IFRTQ19DUl9TU0U7CisgIH0KKyAgCisgIC8qIERpc2FibGUgU2NobWl0dCB0cmlnZ2VyIGh5c3RlcmVzaXMgb24gYWxsIHVzZWQgVFNDIElPcyAqLworICBodHNjLT5JbnN0YW5jZS0+SU9IQ1IgPSAodWludDMyX3QpKH4oaHRzYy0+SW5pdC5DaGFubmVsSU9zIHwgaHRzYy0+SW5pdC5TaGllbGRJT3MgfCBodHNjLT5Jbml0LlNhbXBsaW5nSU9zKSk7CisKKyAgLyogU2V0IGNoYW5uZWwgYW5kIHNoaWVsZCBJT3MgKi8KKyAgaHRzYy0+SW5zdGFuY2UtPklPQ0NSID0gKGh0c2MtPkluaXQuQ2hhbm5lbElPcyB8IGh0c2MtPkluaXQuU2hpZWxkSU9zKTsKKyAgCisgIC8qIFNldCBzYW1wbGluZyBJT3MgKi8KKyAgaHRzYy0+SW5zdGFuY2UtPklPU0NSID0gaHRzYy0+SW5pdC5TYW1wbGluZ0lPczsKKyAgCisgIC8qIFNldCB0aGUgZ3JvdXBzIHRvIGJlIGFjcXVpcmVkICovCisgIGh0c2MtPkluc3RhbmNlLT5JT0dDU1IgPSBUU0NfZXh0cmFjdF9ncm91cHMoaHRzYy0+SW5pdC5DaGFubmVsSU9zKTsKKyAgCisgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLworICBodHNjLT5JbnN0YW5jZS0+SUVSICY9ICh1aW50MzJfdCkofihUU0NfSVRfRU9BIHwgVFNDX0lUX01DRSkpOworICAKKyAgLyogQ2xlYXIgZmxhZ3MgKi8KKyAgaHRzYy0+SW5zdGFuY2UtPklDUiA9IChUU0NfRkxBR19FT0EgfCBUU0NfRkxBR19NQ0UpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAKKyAgLyogSW5pdGlhbGl6ZSB0aGUgVFNDIHN0YXRlICovCisgIGh0c2MtPlN0YXRlID0gSEFMX1RTQ19TVEFURV9SRUFEWTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZWluaXRpYWxpemUgdGhlIFRTQyBwZXJpcGhlcmFsIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IHJlc2V0IHZhbHVlcy4KKyAgKiBAcGFyYW0gIGh0c2MgVFNDIGhhbmRsZSAgCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVFNDX0RlSW5pdChUU0NfSGFuZGxlVHlwZURlZiogaHRzYykKK3sKKyAgLyogQ2hlY2sgVFNDIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChodHNjID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19BTExfSU5TVEFOQ0UoaHRzYy0+SW5zdGFuY2UpKTsKKyAgIAorICAvKiBDaGFuZ2UgVFNDIHN0YXRlICovCisgIGh0c2MtPlN0YXRlID0gSEFMX1RTQ19TVEFURV9CVVNZOworIAorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICBIQUxfVFNDX01zcERlSW5pdChodHNjKTsKKyAgCisgIC8qIENoYW5nZSBUU0Mgc3RhdGUgKi8KKyAgaHRzYy0+U3RhdGUgPSBIQUxfVFNDX1NUQVRFX1JFU0VUOworCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh0c2MpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBUU0MgTVNQLgorICAqIEBwYXJhbSAgaHRzYyBwb2ludGVyIHRvIGEgVFNDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFRTQy4gIAorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RTQ19Nc3BJbml0KFRTQ19IYW5kbGVUeXBlRGVmKiBodHNjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodHNjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RTQ19Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLyAKK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIFRTQyBNU1AuCisgICogQHBhcmFtICBodHNjIHBvaW50ZXIgdG8gYSBUU0NfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVFNDLiAgCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVFNDX01zcERlSW5pdChUU0NfSGFuZGxlVHlwZURlZiogaHRzYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRzYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9UU0NfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLyAKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUU0NfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgSW5wdXQgYW5kIE91dHB1dCBvcGVyYXRpb24gZnVuY3Rpb25zIAorICoKK0B2ZXJiYXRpbSAgIAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAjIyMjIyBJTyBPcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBTdGFydCBhY3F1aXNpdGlvbiBpbiBwb2xsaW5nIG1vZGUuCisgICAgICAoKykgU3RhcnQgYWNxdWlzaXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICAgICAoKykgU3RvcCBjb252ZXJzaW9uIGluIHBvbGxpbmcgbW9kZS4KKyAgICAgICgrKSBTdG9wIGNvbnZlcnNpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICAgICAoKykgUG9sbCBmb3IgYWNxdWlzaXRpb24gY29tcGxldGVkLgorICAgICAgKCspIEdldCBncm91cCBhY3F1aXNpdGlvbiBzdGF0dXMuCisgICAgICAoKykgR2V0IGdyb3VwIGFjcXVpc2l0aW9uIHZhbHVlLgorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgYWNxdWlzaXRpb24uCisgICogQHBhcmFtICBodHNjIHBvaW50ZXIgdG8gYSBUU0NfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVFNDLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RTQ19TdGFydChUU0NfSGFuZGxlVHlwZURlZiogaHRzYykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19BTExfSU5TVEFOQ0UoaHRzYy0+SW5zdGFuY2UpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGh0c2MpOworCisgIC8qIENoYW5nZSBUU0Mgc3RhdGUgKi8KKyAgaHRzYy0+U3RhdGUgPSBIQUxfVFNDX1NUQVRFX0JVU1k7CisKKyAgLyogQ2xlYXIgaW50ZXJydXB0cyAqLworICBfX0hBTF9UU0NfRElTQUJMRV9JVChodHNjLCAoVFNDX0lUX0VPQSB8IFRTQ19JVF9NQ0UpKTsKKworICAvKiBDbGVhciBmbGFncyAqLworICBfX0hBTF9UU0NfQ0xFQVJfRkxBRyhodHNjLCAoVFNDX0ZMQUdfRU9BIHwgVFNDX0ZMQUdfTUNFKSk7CisKKyAgLyogU2V0IHRvdWNoIHNlbnNpbmcgSU9zIG5vdCBhY3F1aXJlZCB0byB0aGUgc3BlY2lmaWVkIElPRGVmYXVsdE1vZGUgKi8KKyAgaWYgKGh0c2MtPkluaXQuSU9EZWZhdWx0TW9kZSA9PSBUU0NfSU9ERUZfT1VUX1BQX0xPVykKKyAgeworICAgIF9fSEFMX1RTQ19TRVRfSU9ERUZfT1VUUFBMT1coaHRzYyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgX19IQUxfVFNDX1NFVF9JT0RFRl9JTkZMT0FUKGh0c2MpOworICB9CisKKyAgLyogTGF1bmNoIHRoZSBhY3F1aXNpdGlvbiAqLworICBfX0hBTF9UU0NfU1RBUlRfQUNRKGh0c2MpOworCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh0c2MpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgYWNxdWlzaXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBodHNjIHBvaW50ZXIgdG8gYSBUU0NfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVFNDLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cy4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9UU0NfU3RhcnRfSVQoVFNDX0hhbmRsZVR5cGVEZWYqIGh0c2MpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19UU0NfQUxMX0lOU1RBTkNFKGh0c2MtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19UU0NfTUNFX0lUKGh0c2MtPkluaXQuTWF4Q291bnRJbnRlcnJ1cHQpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGh0c2MpOworCisgIC8qIENoYW5nZSBUU0Mgc3RhdGUgKi8KKyAgaHRzYy0+U3RhdGUgPSBIQUxfVFNDX1NUQVRFX0JVU1k7CisKKyAgLyogRW5hYmxlIGVuZCBvZiBhY3F1aXNpdGlvbiBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfVFNDX0VOQUJMRV9JVChodHNjLCBUU0NfSVRfRU9BKTsKKworICAvKiBFbmFibGUgbWF4IGNvdW50IGVycm9yIGludGVycnVwdCAob3B0aW9uYWwpICovCisgIGlmIChodHNjLT5Jbml0Lk1heENvdW50SW50ZXJydXB0ID09IEVOQUJMRSkKKyAgeworICAgIF9fSEFMX1RTQ19FTkFCTEVfSVQoaHRzYywgVFNDX0lUX01DRSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgX19IQUxfVFNDX0RJU0FCTEVfSVQoaHRzYywgVFNDX0lUX01DRSk7CisgIH0KKworICAvKiBDbGVhciBmbGFncyAqLworICBfX0hBTF9UU0NfQ0xFQVJfRkxBRyhodHNjLCAoVFNDX0ZMQUdfRU9BIHwgVFNDX0ZMQUdfTUNFKSk7CisKKyAgLyogU2V0IHRvdWNoIHNlbnNpbmcgSU9zIG5vdCBhY3F1aXJlZCB0byB0aGUgc3BlY2lmaWVkIElPRGVmYXVsdE1vZGUgKi8KKyAgaWYgKGh0c2MtPkluaXQuSU9EZWZhdWx0TW9kZSA9PSBUU0NfSU9ERUZfT1VUX1BQX0xPVykKKyAgeworICAgIF9fSEFMX1RTQ19TRVRfSU9ERUZfT1VUUFBMT1coaHRzYyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgX19IQUxfVFNDX1NFVF9JT0RFRl9JTkZMT0FUKGh0c2MpOworICB9CisKKyAgLyogTGF1bmNoIHRoZSBhY3F1aXNpdGlvbiAqLworICBfX0hBTF9UU0NfU1RBUlRfQUNRKGh0c2MpOworCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh0c2MpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIHRoZSBhY3F1aXNpdGlvbiBwcmV2aW91c2x5IGxhdW5jaGVkIGluIHBvbGxpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGh0c2MgcG9pbnRlciB0byBhIFRTQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBUU0MuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVFNDX1N0b3AoVFNDX0hhbmRsZVR5cGVEZWYqIGh0c2MpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19UU0NfQUxMX0lOU1RBTkNFKGh0c2MtPkluc3RhbmNlKSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodHNjKTsKKworICAvKiBTdG9wIHRoZSBhY3F1aXNpdGlvbiAqLworICBfX0hBTF9UU0NfU1RPUF9BQ1EoaHRzYyk7CisKKyAgLyogU2V0IHRvdWNoIHNlbnNpbmcgSU9zIGluIGxvdyBwb3dlciBtb2RlIChvdXRwdXQgcHVzaC1wdWxsKSAqLworICBfX0hBTF9UU0NfU0VUX0lPREVGX09VVFBQTE9XKGh0c2MpOworCisgIC8qIENsZWFyIGZsYWdzICovCisgIF9fSEFMX1RTQ19DTEVBUl9GTEFHKGh0c2MsIChUU0NfRkxBR19FT0EgfCBUU0NfRkxBR19NQ0UpKTsKKworICAvKiBDaGFuZ2UgVFNDIHN0YXRlICovCisgIGh0c2MtPlN0YXRlID0gSEFMX1RTQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodHNjKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcCB0aGUgYWNxdWlzaXRpb24gcHJldmlvdXNseSBsYXVuY2hlZCBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGh0c2MgcG9pbnRlciB0byBhIFRTQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBUU0MuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVFNDX1N0b3BfSVQoVFNDX0hhbmRsZVR5cGVEZWYqIGh0c2MpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19UU0NfQUxMX0lOU1RBTkNFKGh0c2MtPkluc3RhbmNlKSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodHNjKTsKKworICAvKiBTdG9wIHRoZSBhY3F1aXNpdGlvbiAqLworICBfX0hBTF9UU0NfU1RPUF9BQ1EoaHRzYyk7CisKKyAgLyogU2V0IHRvdWNoIHNlbnNpbmcgSU9zIGluIGxvdyBwb3dlciBtb2RlIChvdXRwdXQgcHVzaC1wdWxsKSAqLworICBfX0hBTF9UU0NfU0VUX0lPREVGX09VVFBQTE9XKGh0c2MpOworCisgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLworICBfX0hBTF9UU0NfRElTQUJMRV9JVChodHNjLCAoVFNDX0lUX0VPQSB8IFRTQ19JVF9NQ0UpKTsKKworICAvKiBDbGVhciBmbGFncyAqLworICBfX0hBTF9UU0NfQ0xFQVJfRkxBRyhodHNjLCAoVFNDX0ZMQUdfRU9BIHwgVFNDX0ZMQUdfTUNFKSk7CisKKyAgLyogQ2hhbmdlIFRTQyBzdGF0ZSAqLworICBodHNjLT5TdGF0ZSA9IEhBTF9UU0NfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHRzYyk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IGFjcXVpc2l0aW9uIGFuZCB3YWl0IHVudGlsIGNvbXBsZXRpb24uCisgICogQG5vdGUgICBUaGVyZSBpcyBubyBuZWVkIG9mIGEgdGltZW91dCBwYXJhbWV0ZXIgYXMgdGhlIG1heCBjb3VudCBlcnJvciBpcyBhbHJlYWR5CisgICogICAgICAgICBtYW5hZ2VkIGJ5IHRoZSBUU0MgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIGh0c2MgcG9pbnRlciB0byBhIFRTQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBUU0MuCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9UU0NfUG9sbEZvckFjcXVpc2l0aW9uKFRTQ19IYW5kbGVUeXBlRGVmKiBodHNjKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVFNDX0FMTF9JTlNUQU5DRShodHNjLT5JbnN0YW5jZSkpOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHRzYyk7CisKKyAgLyogQ2hlY2sgZW5kIG9mIGFjcXVpc2l0aW9uICovCisgIHdoaWxlIChIQUxfVFNDX0dldFN0YXRlKGh0c2MpID09IEhBTF9UU0NfU1RBVEVfQlVTWSkKKyAgeworICAgIC8qIFRoZSB0aW1lb3V0IChtYXggY291bnQgZXJyb3IpIGlzIG1hbmFnZWQgYnkgdGhlIFRTQyBwZXJpcGhlcmFsIGl0c2VsZi4gKi8KKyAgfQorCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh0c2MpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBhY3F1aXNpdGlvbiBzdGF0dXMgZm9yIGEgZ3JvdXAuCisgICogQHBhcmFtICBodHNjIHBvaW50ZXIgdG8gYSBUU0NfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVFNDLgorICAqIEBwYXJhbSAgZ3hfaW5kZXggSW5kZXggb2YgdGhlIGdyb3VwCisgICogQHJldHZhbCBHcm91cCBzdGF0dXMKKyAgKi8KK1RTQ19Hcm91cFN0YXR1c1R5cGVEZWYgSEFMX1RTQ19Hcm91cEdldFN0YXR1cyhUU0NfSGFuZGxlVHlwZURlZiogaHRzYywgdWludDMyX3QgZ3hfaW5kZXgpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19UU0NfQUxMX0lOU1RBTkNFKGh0c2MtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19UU0NfR1JPVVBfSU5ERVgoZ3hfaW5kZXgpKTsKKworICAvKiBSZXR1cm4gdGhlIGdyb3VwIHN0YXR1cyAqLyAKKyAgcmV0dXJuKF9fSEFMX1RTQ19HRVRfR1JPVVBfU1RBVFVTKGh0c2MsIGd4X2luZGV4KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBhY3F1aXNpdGlvbiBtZWFzdXJlIGZvciBhIGdyb3VwLgorICAqIEBwYXJhbSAgaHRzYyBwb2ludGVyIHRvIGEgVFNDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFRTQy4KKyAgKiBAcGFyYW0gIGd4X2luZGV4IEluZGV4IG9mIHRoZSBncm91cAorICAqIEByZXR2YWwgQWNxdWlzaXRpb24gbWVhc3VyZQorICAqLwordWludDMyX3QgSEFMX1RTQ19Hcm91cEdldFZhbHVlKFRTQ19IYW5kbGVUeXBlRGVmKiBodHNjLCB1aW50MzJfdCBneF9pbmRleCkKK3sgICAgICAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19UU0NfQUxMX0lOU1RBTkNFKGh0c2MtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19UU0NfR1JPVVBfSU5ERVgoZ3hfaW5kZXgpKTsKKworICAvKiBSZXR1cm4gdGhlIGdyb3VwIGFjcXVpc2l0aW9uIGNvdW50ZXIgKi8gCisgIHJldHVybiBodHNjLT5JbnN0YW5jZS0+SU9HWENSW2d4X2luZGV4XTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIFRTQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAKKyAqCitAdmVyYmF0aW0gICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgQ29uZmlndXJlIFRTQyBJT3MKKyAgICAgICgrKSBEaXNjaGFyZ2UgVFNDIElPcworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgVFNDIElPcy4KKyAgKiBAcGFyYW0gIGh0c2MgcG9pbnRlciB0byBhIFRTQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBUU0MuCisgICogQHBhcmFtICBjb25maWcgcG9pbnRlciB0byB0aGUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVFNDX0lPQ29uZmlnKFRTQ19IYW5kbGVUeXBlRGVmKiBodHNjLCBUU0NfSU9Db25maWdUeXBlRGVmKiBjb25maWcpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19UU0NfQUxMX0lOU1RBTkNFKGh0c2MtPkluc3RhbmNlKSk7CisgCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHRzYyk7CisKKyAgLyogU3RvcCBhY3F1aXNpdGlvbiAqLworICBfX0hBTF9UU0NfU1RPUF9BQ1EoaHRzYyk7CisKKyAgLyogRGlzYWJsZSBTY2htaXR0IHRyaWdnZXIgaHlzdGVyZXNpcyBvbiBhbGwgdXNlZCBUU0MgSU9zICovCisgIGh0c2MtPkluc3RhbmNlLT5JT0hDUiA9ICh1aW50MzJfdCkofihjb25maWctPkNoYW5uZWxJT3MgfCBjb25maWctPlNoaWVsZElPcyB8IGNvbmZpZy0+U2FtcGxpbmdJT3MpKTsKKworICAvKiBTZXQgY2hhbm5lbCBhbmQgc2hpZWxkIElPcyAqLworICBodHNjLT5JbnN0YW5jZS0+SU9DQ1IgPSAoY29uZmlnLT5DaGFubmVsSU9zIHwgY29uZmlnLT5TaGllbGRJT3MpOworICAKKyAgLyogU2V0IHNhbXBsaW5nIElPcyAqLworICBodHNjLT5JbnN0YW5jZS0+SU9TQ1IgPSBjb25maWctPlNhbXBsaW5nSU9zOworICAKKyAgLyogU2V0IGdyb3VwcyB0byBiZSBhY3F1aXJlZCAqLworICBodHNjLT5JbnN0YW5jZS0+SU9HQ1NSID0gVFNDX2V4dHJhY3RfZ3JvdXBzKGNvbmZpZy0+Q2hhbm5lbElPcyk7CisgICAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh0c2MpOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2NoYXJnZSBUU0MgSU9zLgorICAqIEBwYXJhbSAgaHRzYyBwb2ludGVyIHRvIGEgVFNDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFRTQy4KKyAgKiBAcGFyYW0gIGNob2ljZSBlbmFibGUgb3IgZGlzYWJsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RTQ19JT0Rpc2NoYXJnZShUU0NfSGFuZGxlVHlwZURlZiogaHRzYywgdWludDMyX3QgY2hvaWNlKQoreyAgICAgICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19BTExfSU5TVEFOQ0UoaHRzYy0+SW5zdGFuY2UpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGh0c2MpOworICAKKyAgaWYgKGNob2ljZSA9PSBFTkFCTEUpCisgIHsKKyAgICBfX0hBTF9UU0NfU0VUX0lPREVGX09VVFBQTE9XKGh0c2MpOworICB9CisgIGVsc2UKKyAgeworICAgIF9fSEFMX1RTQ19TRVRfSU9ERUZfSU5GTE9BVChodHNjKTsKKyAgfQorCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh0c2MpOworICAKKyAgLyogUmV0dXJuIHRoZSBncm91cCBhY3F1aXNpdGlvbiBjb3VudGVyICovIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRTQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zIAorICoKK0B2ZXJiYXRpbSAgIAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICMjIyMjIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8KKyAgICAgICgrKSBHZXQgVFNDIHN0YXRlLgorICAgICAgICAgCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgVFNDIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIGh0c2MgcG9pbnRlciB0byBhIFRTQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBUU0MuCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9UU0NfU3RhdGVUeXBlRGVmIEhBTF9UU0NfR2V0U3RhdGUoVFNDX0hhbmRsZVR5cGVEZWYqIGh0c2MpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19UU0NfQUxMX0lOU1RBTkNFKGh0c2MtPkluc3RhbmNlKSk7CisgIAorICBpZiAoaHRzYy0+U3RhdGUgPT0gSEFMX1RTQ19TVEFURV9CVVNZKQorICB7CisgICAgLyogQ2hlY2sgZW5kIG9mIGFjcXVpc2l0aW9uIGZsYWcgKi8KKyAgICBpZiAoX19IQUxfVFNDX0dFVF9GTEFHKGh0c2MsIFRTQ19GTEFHX0VPQSkgIT0gUkVTRVQpCisgICAgeworICAgICAgLyogQ2hlY2sgbWF4IGNvdW50IGVycm9yIGZsYWcgKi8KKyAgICAgIGlmIChfX0hBTF9UU0NfR0VUX0ZMQUcoaHRzYywgVFNDX0ZMQUdfTUNFKSAhPSBSRVNFVCkKKyAgICAgIHsKKyAgICAgICAgLyogQ2hhbmdlIFRTQyBzdGF0ZSAqLworICAgICAgICBodHNjLT5TdGF0ZSA9IEhBTF9UU0NfU1RBVEVfRVJST1I7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIENoYW5nZSBUU0Mgc3RhdGUgKi8KKyAgICAgICAgaHRzYy0+U3RhdGUgPSBIQUxfVFNDX1NUQVRFX1JFQURZOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgLyogUmV0dXJuIFRTQyBzdGF0ZSAqLworICByZXR1cm4gaHRzYy0+U3RhdGU7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVFNDX0lSUV9IYW5kbGVyX2FuZF9DYWxsYmFja3MgSVJRIEhhbmRsZXIgYW5kIENhbGxiYWNrcworICogQHsKKyAqLyAgIAorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBUU0MgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBodHNjIHBvaW50ZXIgdG8gYSBUU0NfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVFNDLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfVFNDX0lSUUhhbmRsZXIoVFNDX0hhbmRsZVR5cGVEZWYqIGh0c2MpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19UU0NfQUxMX0lOU1RBTkNFKGh0c2MtPkluc3RhbmNlKSk7CisKKyAgLyogQ2hlY2sgaWYgdGhlIGVuZCBvZiBhY3F1aXNpdGlvbiBvY2N1cnJlZCAqLworICBpZiAoX19IQUxfVFNDX0dFVF9GTEFHKGh0c2MsIFRTQ19GTEFHX0VPQSkgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBDbGVhciBFT0EgZmxhZyAqLworICAgIF9fSEFMX1RTQ19DTEVBUl9GTEFHKGh0c2MsIFRTQ19GTEFHX0VPQSk7CisgIH0KKyAgCisgIC8qIENoZWNrIGlmIG1heCBjb3VudCBlcnJvciBvY2N1cnJlZCAqLworICBpZiAoX19IQUxfVFNDX0dFVF9GTEFHKGh0c2MsIFRTQ19GTEFHX01DRSkgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBDbGVhciBNQ0UgZmxhZyAqLworICAgIF9fSEFMX1RTQ19DTEVBUl9GTEFHKGh0c2MsIFRTQ19GTEFHX01DRSk7CisgICAgLyogQ2hhbmdlIFRTQyBzdGF0ZSAqLworICAgIGh0c2MtPlN0YXRlID0gSEFMX1RTQ19TVEFURV9FUlJPUjsKKyAgICAvKiBDb252ZXJzaW9uIGNvbXBsZXRlZCBjYWxsYmFjayAqLworICAgIEhBTF9UU0NfRXJyb3JDYWxsYmFjayhodHNjKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDaGFuZ2UgVFNDIHN0YXRlICovCisgICAgaHRzYy0+U3RhdGUgPSBIQUxfVFNDX1NUQVRFX1JFQURZOworICAgIC8qIENvbnZlcnNpb24gY29tcGxldGVkIGNhbGxiYWNrICovCisgICAgSEFMX1RTQ19Db252Q3BsdENhbGxiYWNrKGh0c2MpOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgQWNxdWlzaXRpb24gY29tcGxldGVkIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHRzYyBwb2ludGVyIHRvIGEgVFNDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFRTQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9UU0NfQ29udkNwbHRDYWxsYmFjayhUU0NfSGFuZGxlVHlwZURlZiogaHRzYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRzYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9UU0NfQ29udkNwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBFcnJvciBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGh0c2MgcG9pbnRlciB0byBhIFRTQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBUU0MuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVFNDX0Vycm9yQ2FsbGJhY2soVFNDX0hhbmRsZVR5cGVEZWYqIGh0c2MpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0c2MpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVFNDX0Vycm9yQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFRTQ19Qcml2YXRlX0Z1bmN0aW9ucyBQcml2YXRlIEZ1bmN0aW9ucworICogIEB7CisgKi8KKyAgICAgIAorLyoqCisgICogQGJyaWVmICBVdGlsaXR5IGZ1bmN0aW9uIHVzZWQgdG8gc2V0IHRoZSBhY3F1aXJlZCBncm91cHMgbWFzay4KKyAgKiBAcGFyYW0gIGlvbWFzayBDaGFubmVscyBJT3MgbWFzaworICAqIEByZXR2YWwgQWNxdWlyZWQgZ3JvdXBzIG1hc2sKKyAgKi8KK3N0YXRpYyB1aW50MzJfdCBUU0NfZXh0cmFjdF9ncm91cHModWludDMyX3QgaW9tYXNrKQoreworICB1aW50MzJfdCBncm91cHMgPSAwVTsKKyAgdWludDMyX3QgaWR4OworICAKKyAgZm9yIChpZHggPSAwVTsgaWR4IDwgVFNDX05CX09GX0dST1VQUzsgaWR4KyspCisgIHsKKyAgICBpZiAoKGlvbWFzayAmICgweDBGVSA8PCAoaWR4ICogNFUpKSkgIT0gUkVTRVQpCisgICAgeworICAgICAgZ3JvdXBzIHw9ICgxVSA8PCBpZHgpOworICAgIH0KKyAgfQorICAKKyAgcmV0dXJuIGdyb3VwczsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9UU0NfTU9EVUxFX0VOQUJMRUQgKi8KKworLyoqCisgICogQH0KKyAgKi8gCisKKy8qKgorICAqIEB9CisgICovIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjN4eF9oYWxfdWFydC5jIGIvU3JjL3N0bTMyZjN4eF9oYWxfdWFydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZjRkZDkKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJmM3h4X2hhbF91YXJ0LmMKQEAgLTAsMCArMSwyNzk1IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2hhbF91YXJ0LmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFVBUlQgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZyAKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFVuaXZlcnNhbCBBc3luY2hyb25vdXMgUmVjZWl2ZXIgVHJhbnNtaXR0ZXIgKFVBUlQpIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGUgVUFSVCBIQUwgZHJpdmVyIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CisKKyAgICAoIykgRGVjbGFyZSBhIFVBUlRfSGFuZGxlVHlwZURlZiBoYW5kbGUgc3RydWN0dXJlIChlZy4gVUFSVF9IYW5kbGVUeXBlRGVmIGh1YXJ0KS4KKyAgICAoIykgSW5pdGlhbGl6ZSB0aGUgVUFSVCBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudGluZyB0aGUgSEFMX1VBUlRfTXNwSW5pdCgpIEFQSToKKyAgICAgICAgKCsrKSBFbmFibGUgdGhlIFVTQVJUeCBpbnRlcmZhY2UgY2xvY2suCisgICAgICAgICgrKykgVUFSVCBwaW5zIGNvbmZpZ3VyYXRpb246CisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgVUFSVCBHUElPcy4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGVzZSBVQVJUIHBpbnMgYXMgYWx0ZXJuYXRlIGZ1bmN0aW9uIHB1bGwtdXAuCisgICAgICAgICgrKykgTlZJQyBjb25maWd1cmF0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBpbnRlcnJ1cHQgcHJvY2VzcyAoSEFMX1VBUlRfVHJhbnNtaXRfSVQoKQorICAgICAgICAgICAgIGFuZCBIQUxfVUFSVF9SZWNlaXZlX0lUKCkgQVBJcyk6CisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIFVTQVJUeCBpbnRlcnJ1cHQgcHJpb3JpdHkuCisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIE5WSUMgVVNBUlQgSVJRIGhhbmRsZS4KKyAgICAgICAgKCsrKSBVQVJUIGludGVycnVwdHMgaGFuZGxpbmc6CisgICAgICAgICAgICAgIC1AQC0gIFRoZSBzcGVjaWZpYyBVQVJUIGludGVycnVwdHMgKFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQsCisgICAgICAgICAgICAgICAgUlhORSBpbnRlcnJ1cHQgYW5kIEVycm9yIEludGVycnVwdHMpIGFyZSBtYW5hZ2VkIHVzaW5nIHRoZSBtYWNyb3MKKyAgICAgICAgICAgICAgICBfX0hBTF9VQVJUX0VOQUJMRV9JVCgpIGFuZCBfX0hBTF9VQVJUX0RJU0FCTEVfSVQoKSBpbnNpZGUgdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIHByb2Nlc3Nlcy4KKyAgICAgICAgKCsrKSBETUEgQ29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgRE1BIHByb2Nlc3MgKEhBTF9VQVJUX1RyYW5zbWl0X0RNQSgpCisgICAgICAgICAgICAgYW5kIEhBTF9VQVJUX1JlY2VpdmVfRE1BKCkgQVBJcyk6CisgICAgICAgICAgICAoKysrKSBEZWNsYXJlIGEgRE1BIGhhbmRsZSBzdHJ1Y3R1cmUgZm9yIHRoZSBUeC9SeCBjaGFubmVsLgorICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBETUF4IGludGVyZmFjZSBjbG9jay4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgZGVjbGFyZWQgRE1BIGhhbmRsZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgcmVxdWlyZWQgVHgvUnggcGFyYW1ldGVycy4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgRE1BIFR4L1J4IGNoYW5uZWwuCisgICAgICAgICAgICAoKysrKSBBc3NvY2lhdGUgdGhlIGluaXRpYWxpemVkIERNQSBoYW5kbGUgdG8gdGhlIFVBUlQgRE1BIFR4L1J4IGhhbmRsZS4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgcHJpb3JpdHkgYW5kIGVuYWJsZSB0aGUgTlZJQyBmb3IgdGhlIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBvbiB0aGUgRE1BIFR4L1J4IGNoYW5uZWwuCisKKyAgICAoIykgUHJvZ3JhbSB0aGUgQmF1ZCBSYXRlLCBXb3JkIExlbmd0aCwgU3RvcCBCaXQsIFBhcml0eSwgSGFyZHdhcmUKKyAgICAgICAgZmxvdyBjb250cm9sIGFuZCBNb2RlIChSZWNlaXZlci9UcmFuc21pdHRlcikgaW4gdGhlIGh1YXJ0IGhhbmRsZSBJbml0IHN0cnVjdHVyZS4KKworICAgICgjKSBJZiByZXF1aXJlZCwgcHJvZ3JhbSBVQVJUIGFkdmFuY2VkIGZlYXR1cmVzIChUWC9SWCBwaW5zIHN3YXAsIGF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiwuLi4pCisgICAgICAgIGluIHRoZSBodWFydCBoYW5kbGUgQWR2YW5jZWRJbml0IHN0cnVjdHVyZS4KKworICAgICgjKSBGb3IgdGhlIFVBUlQgYXN5bmNocm9ub3VzIG1vZGUsIGluaXRpYWxpemUgdGhlIFVBUlQgcmVnaXN0ZXJzIGJ5IGNhbGxpbmcKKyAgICAgICAgdGhlIEhBTF9VQVJUX0luaXQoKSBBUEkuCisKKyAgICAoIykgRm9yIHRoZSBVQVJUIEhhbGYgZHVwbGV4IG1vZGUsIGluaXRpYWxpemUgdGhlIFVBUlQgcmVnaXN0ZXJzIGJ5IGNhbGxpbmcKKyAgICAgICAgdGhlIEhBTF9IYWxmRHVwbGV4X0luaXQoKSBBUEkuCisKKyAgICAoIykgRm9yIHRoZSBVQVJUIExJTiAoTG9jYWwgSW50ZXJjb25uZWN0aW9uIE5ldHdvcmspIG1vZGUsIGluaXRpYWxpemUgdGhlIFVBUlQgcmVnaXN0ZXJzCisgICAgICAgIGJ5IGNhbGxpbmcgdGhlIEhBTF9MSU5fSW5pdCgpIEFQSS4KKworICAgICgjKSBGb3IgdGhlIFVBUlQgTXVsdGlwcm9jZXNzb3IgbW9kZSwgaW5pdGlhbGl6ZSB0aGUgVUFSVCByZWdpc3RlcnMKKyAgICAgICAgYnkgY2FsbGluZyB0aGUgSEFMX011bHRpUHJvY2Vzc29yX0luaXQoKSBBUEkuCisKKyAgICAoIykgRm9yIHRoZSBVQVJUIFJTNDg1IERyaXZlciBFbmFibGVkIG1vZGUsIGluaXRpYWxpemUgdGhlIFVBUlQgcmVnaXN0ZXJzCisgICAgICAgIGJ5IGNhbGxpbmcgdGhlIEhBTF9SUzQ4NUV4X0luaXQoKSBBUEkuCisKKyAgIFsuLl0KKyAgICAoQCkgVGhlc2UgQVBJcyAoSEFMX1VBUlRfSW5pdCgpLCBIQUxfSGFsZkR1cGxleF9Jbml0KCksIEhBTF9NdWx0aVByb2Nlc3Nvcl9Jbml0KCksCisgICAgICAgIGFsc28gY29uZmlndXJlIHRoZSBsb3cgbGV2ZWwgSGFyZHdhcmUgKEdQSU8sIENMT0NLLCBDT1JURVguLi5ldGMpIGJ5CisgICAgICAgIGNhbGxpbmcgdGhlIGN1c3RvbWl6ZWQgSEFMX1VBUlRfTXNwSW5pdCgpIEFQSS4KKworICAgWy4uXQorICAgWy4uXSBUaHJlZSBvcGVyYXRpb24gbW9kZXMgYXJlIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBkcml2ZXIgOgorICAKKyAgICAgKioqIFBvbGxpbmcgbW9kZSBJTyBvcGVyYXRpb24gKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisgICAgICAgKCspIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfVUFSVF9UcmFuc21pdCgpCisgICAgICAgKCspIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfVUFSVF9SZWNlaXZlKCkKKworICAgICAqKiogSW50ZXJydXB0IG1vZGUgSU8gb3BlcmF0aW9uICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisgICAgICAgKCspIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uIGJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX1VBUlRfVHJhbnNtaXRfSVQoKQorICAgICAgICgrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIGhhbGYgdHJhbnNmZXIgSEFMX1VBUlRfVHhIYWxmQ3BsdENhbGxiYWNrIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX1VBUlRfVHhIYWxmQ3BsdENhbGxiYWNrCisgICAgICAgKCspIEF0IHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIgSEFMX1VBUlRfVHhDcGx0Q2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfVUFSVF9UeENwbHRDYWxsYmFjaworICAgICAgICgrKSBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbiBibG9ja2luZyBtb2RlIHVzaW5nIEhBTF9VQVJUX1JlY2VpdmVfSVQoKQorICAgICAgICgrKSBBdCByZWNlcHRpb24gZW5kIG9mIGhhbGYgdHJhbnNmZXIgSEFMX1VBUlRfUnhIYWxmQ3BsdENhbGxiYWNrIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX1VBUlRfUnhIYWxmQ3BsdENhbGxiYWNrCisgICAgICAgKCspIEF0IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIgSEFMX1VBUlRfUnhDcGx0Q2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfVUFSVF9SeENwbHRDYWxsYmFjaworICAgICAgICgrKSBJbiBjYXNlIG9mIHRyYW5zZmVyIEVycm9yLCBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfVUFSVF9FcnJvckNhbGxiYWNrCisKKyAgICAgKioqIERNQSBtb2RlIElPIG9wZXJhdGlvbiAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0KKyAgICAgICAoKykgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24gYmxvY2tpbmcgbW9kZSAoRE1BKSB1c2luZyBIQUxfVUFSVF9UcmFuc21pdF9ETUEoKQorICAgICAgICgrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIGhhbGYgdHJhbnNmZXIgSEFMX1VBUlRfVHhIYWxmQ3BsdENhbGxiYWNrIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX1VBUlRfVHhIYWxmQ3BsdENhbGxiYWNrCisgICAgICAgKCspIEF0IHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIgSEFMX1VBUlRfVHhDcGx0Q2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfVUFSVF9UeENwbHRDYWxsYmFjaworICAgICAgICgrKSBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbiBibG9ja2luZyBtb2RlIChETUEpIHVzaW5nIEhBTF9VQVJUX1JlY2VpdmVfRE1BKCkKKyAgICAgICAoKykgQXQgcmVjZXB0aW9uIGVuZCBvZiBoYWxmIHRyYW5zZmVyIEhBTF9VQVJUX1J4SGFsZkNwbHRDYWxsYmFjayBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9VQVJUX1J4SGFsZkNwbHRDYWxsYmFjaworICAgICAgICgrKSBBdCByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyIEhBTF9VQVJUX1J4Q3BsdENhbGxiYWNrIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX1VBUlRfUnhDcGx0Q2FsbGJhY2sKKyAgICAgICAoKykgSW4gY2FzZSBvZiB0cmFuc2ZlciBFcnJvciwgSEFMX1VBUlRfRXJyb3JDYWxsYmFjaygpIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX1VBUlRfRXJyb3JDYWxsYmFjaworICAgICAgICgrKSBQYXVzZSB0aGUgRE1BIFRyYW5zZmVyIHVzaW5nIEhBTF9VQVJUX0RNQVBhdXNlKCkKKyAgICAgICAoKykgUmVzdW1lIHRoZSBETUEgVHJhbnNmZXIgdXNpbmcgSEFMX1VBUlRfRE1BUmVzdW1lKCkKKyAgICAgICAoKykgU3RvcCB0aGUgRE1BIFRyYW5zZmVyIHVzaW5nIEhBTF9VQVJUX0RNQVN0b3AoKQorCisgICAgICoqKiBVQVJUIEhBTCBkcml2ZXIgbWFjcm9zIGxpc3QgKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisgICAgICAgQmVsb3cgdGhlIGxpc3Qgb2YgbW9zdCB1c2VkIG1hY3JvcyBpbiBVQVJUIEhBTCBkcml2ZXIuCisKKyAgICAgICgrKSBfX0hBTF9VQVJUX0VOQUJMRTogRW5hYmxlIHRoZSBVQVJUIHBlcmlwaGVyYWwKKyAgICAgICgrKSBfX0hBTF9VQVJUX0RJU0FCTEU6IERpc2FibGUgdGhlIFVBUlQgcGVyaXBoZXJhbAorICAgICAgKCspIF9fSEFMX1VBUlRfR0VUX0ZMQUcgOiBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVUFSVCBmbGFnIGlzIHNldCBvciBub3QKKyAgICAgICgrKSBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcgOiBDbGVhciB0aGUgc3BlY2lmaWVkIFVBUlQgcGVuZGluZyBmbGFnCisgICAgICAoKykgX19IQUxfVUFSVF9FTkFCTEVfSVQ6IEVuYWJsZSB0aGUgc3BlY2lmaWVkIFVBUlQgaW50ZXJydXB0CisgICAgICAoKykgX19IQUxfVUFSVF9ESVNBQkxFX0lUOiBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgVUFSVCBpbnRlcnJ1cHQKKworICAgICBbLi5dCisgICAgICAgKEApIFlvdSBjYW4gcmVmZXIgdG8gdGhlIFVBUlQgSEFMIGRyaXZlciBoZWFkZXIgZmlsZSBmb3IgbW9yZSB1c2VmdWwgbWFjcm9zCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUIFVBUlQKKyAgKiBAYnJpZWYgVUFSVCBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfVUFSVF9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVUFSVF9Qcml2YXRlX0NvbnN0YW50cyBVQVJUIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9DUjFfRklFTERTICAoKHVpbnQzMl90KShVU0FSVF9DUjFfTSB8IFVTQVJUX0NSMV9QQ0UgfCBVU0FSVF9DUjFfUFMgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1RFIHwgVVNBUlRfQ1IxX1JFIHwgVVNBUlRfQ1IxX09WRVI4KSkgLyohPCBVQVJUIG9yIFVTQVJUIENSMSBmaWVsZHMgb2YgcGFyYW1ldGVycyBzZXQgYnkgVUFSVF9TZXRDb25maWcgQVBJICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVUFSVF9Qcml2YXRlX0Z1bmN0aW9ucworICAqIEB7CisgICovCitzdGF0aWMgdm9pZCBVQVJUX0VuZFR4VHJhbnNmZXIoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitzdGF0aWMgdm9pZCBVQVJUX0VuZFJ4VHJhbnNmZXIoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQVRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQVR4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVUFSVF9ETUFSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQVJ4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVUFSVF9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQUFib3J0T25FcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQVR4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQVJ4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQVR4T25seUFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVUFSVF9ETUFSeE9ubHlBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK0hBTF9TdGF0dXNUeXBlRGVmIFVBUlRfVHJhbnNtaXRfSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitIQUxfU3RhdHVzVHlwZURlZiBVQVJUX0VuZFRyYW5zbWl0X0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgVUFSVF9SZWNlaXZlX0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0V4cG9ydGVkX0Z1bmN0aW9ucyBVQVJUIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIHRoZSBVU0FSVHggb3IgdGhlIFVBUlR5CisgICAgaW4gYXN5bmNocm9ub3VzIG1vZGUuCisgICAgICAoKykgRm9yIHRoZSBhc3luY2hyb25vdXMgbW9kZSB0aGUgcGFyYW1ldGVycyBiZWxvdyBjYW4gYmUgY29uZmlndXJlZDoKKyAgICAgICAgKCsrKSBCYXVkIFJhdGUKKyAgICAgICAgKCsrKSBXb3JkIExlbmd0aAorICAgICAgICAoKyspIFN0b3AgQml0CisgICAgICAgICgrKykgUGFyaXR5CisgICAgICAgICgrKykgSGFyZHdhcmUgZmxvdyBjb250cm9sCisgICAgICAgICgrKykgUmVjZWl2ZXIvdHJhbnNtaXR0ZXIgbW9kZXMKKyAgICAgICAgKCsrKSBPdmVyIFNhbXBsaW5nIE1ldGhvZAorICAgICAgICAoKyspIE9uZS1CaXQgU2FtcGxpbmcgTWV0aG9kCisgICAgICAoKykgRm9yIHRoZSBhc3luY2hyb25vdXMgbW9kZSwgdGhlIGZvbGxvd2luZyBhZHZhbmNlZCBmZWF0dXJlcyBjYW4gYmUgY29uZmlndXJlZCBhcyB3ZWxsOgorICAgICAgICAoKyspIFRYIGFuZC9vciBSWCBwaW4gbGV2ZWwgaW52ZXJzaW9uCisgICAgICAgICgrKykgZGF0YSBsb2dpY2FsIGxldmVsIGludmVyc2lvbgorICAgICAgICAoKyspIFJYIGFuZCBUWCBwaW5zIHN3YXAKKyAgICAgICAgKCsrKSBSWCBvdmVycnVuIGRldGVjdGlvbiBkaXNhYmxpbmcKKyAgICAgICAgKCsrKSBETUEgZGlzYWJsaW5nIG9uIFJYIGVycm9yCisgICAgICAgICgrKykgTVNCIGZpcnN0IG9uIGNvbW11bmljYXRpb24gbGluZQorICAgICAgICAoKyspIGF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbgorICAgIFsuLl0KKyAgICBUaGUgSEFMX1VBUlRfSW5pdCgpLCBIQUxfSGFsZkR1cGxleF9Jbml0KCksIEhBTF9MSU5fSW5pdCgpIGFuZCBIQUxfTXVsdGlQcm9jZXNzb3JfSW5pdCgpCisgICAgQVBJIGZvbGxvdyByZXNwZWN0aXZlbHkgdGhlIFVBUlQgYXN5bmNocm9ub3VzLCBVQVJUIEhhbGYgZHVwbGV4LCBVQVJUIExJTiBtb2RlIGFuZAorICAgIG11bHRpcHJvY2Vzc29yIGNvbmZpZ3VyYXRpb24gcHJvY2VkdXJlcyAoZGV0YWlscyBmb3IgdGhlIHByb2NlZHVyZXMgYXJlIGF2YWlsYWJsZSBpbiByZWZlcmVuY2UgbWFudWFsKS4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoKKyAgQWRkaXRpb25hbCBUYWJsZTogSWYgdGhlIHBhcml0eSBpcyBlbmFibGVkLCB0aGVuIHRoZSBNU0IgYml0IG9mIHRoZSBkYXRhIHdyaXR0ZW4KKyAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGRhdGEgcmVnaXN0ZXIgaXMgdHJhbnNtaXR0ZWQgYnV0IGlzIGNoYW5nZWQgYnkgdGhlIHBhcml0eSBiaXQuCisgICAgICAgICAgICAgICAgICAgIEFjY29yZGluZyB0byBkZXZpY2UgY2FwYWJpbGl0eSAoc3VwcG9ydCBvciBub3Qgb2YgNy1iaXQgd29yZCBsZW5ndGgpLAorICAgICAgICAgICAgICAgICAgICBmcmFtZSBsZW5ndGggaXMgZWl0aGVyIGRlZmluZWQgYnkgdGhlIE0gYml0ICg4LWJpdHMgb3IgOS1iaXRzKQorICAgICAgICAgICAgICAgICAgICBvciBieSB0aGUgTTEgYW5kIE0wIGJpdHMgKDctYml0LCA4LWJpdCBvciA5LWJpdCkuCisgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlIFVBUlQgZnJhbWUgZm9ybWF0cyBhcmUgYXMgbGlzdGVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKKyAgICAgIFRhYmxlIDEuIFVBUlQgZnJhbWUgZm9ybWF0LiAgICAgICAgICAgICAKKyAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgIHwgICAgICAgTSBiaXQgICAgICAgfCAgUENFIGJpdCAgfCAgICAgICAgICAgICBVQVJUIGZyYW1lICAgICAgICAgICAgICAgIHwKKyAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgIHwgICAgICAgICAwICAgICAgICAgfCAgICAgMCAgICAgfCAgICB8IFNCIHwgICAgOC1iaXQgZGF0YSAgIHwgU1RCIHwgICAgIHwKKyAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgIHwgICAgICAgICAwICAgICAgICAgfCAgICAgMSAgICAgfCAgICB8IFNCIHwgNy1iaXQgZGF0YSB8IFBCIHwgU1RCIHwgICAgIHwKKyAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgIHwgICAgICAgICAxICAgICAgICAgfCAgICAgMCAgICAgfCAgICB8IFNCIHwgICAgOS1iaXQgZGF0YSAgIHwgU1RCIHwgICAgIHwKKyAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgIHwgICAgICAgICAxICAgICAgICAgfCAgICAgMSAgICAgfCAgICB8IFNCIHwgOC1iaXQgZGF0YSB8IFBCIHwgU1RCIHwgICAgIHwKKyAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgIHwgIE0xIGJpdCB8ICBNMCBiaXQgfCAgUENFIGJpdCAgfCAgICAgICAgICAgICBVQVJUIGZyYW1lICAgICAgICAgICAgICAgIHwKKyAgICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgIHwgICAgMCAgICB8ICAgIDAgICAgfCAgICAgMCAgICAgfCAgICB8IFNCIHwgICAgOCBiaXQgZGF0YSAgIHwgU1RCIHwgICAgIHwKKyAgICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgIHwgICAgMCAgICB8ICAgIDAgICAgfCAgICAgMSAgICAgfCAgICB8IFNCIHwgNyBiaXQgZGF0YSB8IFBCIHwgU1RCIHwgICAgIHwKKyAgICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgIHwgICAgMCAgICB8ICAgIDEgICAgfCAgICAgMCAgICAgfCAgICB8IFNCIHwgICAgOSBiaXQgZGF0YSAgIHwgU1RCIHwgICAgIHwKKyAgICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgIHwgICAgMCAgICB8ICAgIDEgICAgfCAgICAgMSAgICAgfCAgICB8IFNCIHwgOCBiaXQgZGF0YSB8IFBCIHwgU1RCIHwgICAgIHwKKyAgICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgIHwgICAgMSAgICB8ICAgIDAgICAgfCAgICAgMCAgICAgfCAgICB8IFNCIHwgICAgNyBiaXQgZGF0YSAgIHwgU1RCIHwgICAgIHwKKyAgICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgIHwgICAgMSAgICB8ICAgIDAgICAgfCAgICAgMSAgICAgfCAgICB8IFNCIHwgNiBiaXQgZGF0YSB8IFBCIHwgU1RCIHwgICAgIHwKKyAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKworKi8KKworLyoqCisgICogQGJyaWVmIEluaXRpYWxpemUgdGhlIFVBUlQgbW9kZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBVQVJUX0luaXRUeXBlRGVmIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9Jbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIENoZWNrIHRoZSBVQVJUIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmKGh1YXJ0ID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgaWYoaHVhcnQtPkluaXQuSHdGbG93Q3RsICE9IFVBUlRfSFdDT05UUk9MX05PTkUpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19VQVJUX0hXRkxPV19JTlNUQU5DRShodWFydC0+SW5zdGFuY2UpKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19VQVJUX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpOworICB9CisKKyAgaWYoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBodWFydC0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLICovCisgICAgSEFMX1VBUlRfTXNwSW5pdChodWFydCk7CisgIH0KKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1VBUlRfRElTQUJMRShodWFydCk7CisKKyAgLyogU2V0IHRoZSBVQVJUIENvbW11bmljYXRpb24gcGFyYW1ldGVycyAqLworICBpZiAoVUFSVF9TZXRDb25maWcoaHVhcnQpID09IEhBTF9FUlJPUikKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICBpZiAoaHVhcnQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCAhPSBVQVJUX0FEVkZFQVRVUkVfTk9fSU5JVCkKKyAgeworICAgIFVBUlRfQWR2RmVhdHVyZUNvbmZpZyhodWFydCk7CisgIH0KKworICAvKiBJbiBhc3luY2hyb25vdXMgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAtIExJTkVOIGFuZCBDTEtFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgIC0gU0NFTiwgSERTRUwgYW5kIElSRU4gIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4qLworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjIsIChVU0FSVF9DUjJfTElORU4gfCBVU0FSVF9DUjJfQ0xLRU4pKTsKKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCAoVVNBUlRfQ1IzX1NDRU4gfCBVU0FSVF9DUjNfSERTRUwgfCBVU0FSVF9DUjNfSVJFTikpOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VQVJUX0VOQUJMRShodWFydCk7CisKKyAgLyogVEVBQ0sgYW5kL29yIFJFQUNLIHRvIGNoZWNrIGJlZm9yZSBtb3ZpbmcgaHVhcnQtPmdTdGF0ZSBhbmQgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgcmV0dXJuIChVQVJUX0NoZWNrSWRsZVN0YXRlKGh1YXJ0KSk7Cit9CisKKy8qKgorICAqIEBicmllZiBJbml0aWFsaXplIHRoZSBoYWxmLWR1cGxleCBtb2RlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFVBUlRfSW5pdFR5cGVEZWYgYW5kIGNyZWF0ZXMgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IYWxmRHVwbGV4X0luaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogQ2hlY2sgdGhlIFVBUlQgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYoaHVhcnQgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayBVQVJUIGluc3RhbmNlICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0hBTEZEVVBMRVhfSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSk7CisKKyAgaWYoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBodWFydC0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLICovCisgICAgSEFMX1VBUlRfTXNwSW5pdChodWFydCk7CisgIH0KKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1VBUlRfRElTQUJMRShodWFydCk7CisKKyAgLyogU2V0IHRoZSBVQVJUIENvbW11bmljYXRpb24gcGFyYW1ldGVycyAqLworICBpZiAoVUFSVF9TZXRDb25maWcoaHVhcnQpID09IEhBTF9FUlJPUikKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICBpZiAoaHVhcnQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCAhPSBVQVJUX0FEVkZFQVRVUkVfTk9fSU5JVCkKKyAgeworICAgIFVBUlRfQWR2RmVhdHVyZUNvbmZpZyhodWFydCk7CisgIH0KKworICAvKiBJbiBoYWxmLWR1cGxleCBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CisgIC0gTElORU4gYW5kIENMS0VOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgLSBTQ0VOIGFuZCBJUkVOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4qLworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjIsIChVU0FSVF9DUjJfTElORU4gfCBVU0FSVF9DUjJfQ0xLRU4pKTsKKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCAoVVNBUlRfQ1IzX0lSRU4gfCBVU0FSVF9DUjNfU0NFTikpOworCisgIC8qIEVuYWJsZSB0aGUgSGFsZi1EdXBsZXggbW9kZSBieSBzZXR0aW5nIHRoZSBIRFNFTCBiaXQgaW4gdGhlIENSMyByZWdpc3RlciAqLworICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfSERTRUwpOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VQVJUX0VOQUJMRShodWFydCk7CisKKyAgLyogVEVBQ0sgYW5kL29yIFJFQUNLIHRvIGNoZWNrIGJlZm9yZSBtb3ZpbmcgaHVhcnQtPmdTdGF0ZSBhbmQgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgcmV0dXJuIChVQVJUX0NoZWNrSWRsZVN0YXRlKGh1YXJ0KSk7Cit9CisKKworLyoqCisgICogQGJyaWVmIEluaXRpYWxpemUgdGhlIExJTiBtb2RlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFVBUlRfSW5pdFR5cGVEZWYgYW5kIGNyZWF0ZXMgdGhlIGFzc29jaWF0ZWQgaGFuZGxlIC4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHBhcmFtIEJyZWFrRGV0ZWN0TGVuZ3RoIHNwZWNpZmllcyB0aGUgTElOIGJyZWFrIGRldGVjdGlvbiBsZW5ndGguCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIFVBUlRfTElOQlJFQUtERVRFQ1RMRU5HVEhfMTBCIDEwLWJpdCBicmVhayBkZXRlY3Rpb24KKyAgKiAgICAgICAgICBAYXJnIEByZWYgVUFSVF9MSU5CUkVBS0RFVEVDVExFTkdUSF8xMUIgMTEtYml0IGJyZWFrIGRldGVjdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xJTl9Jbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQzMl90IEJyZWFrRGV0ZWN0TGVuZ3RoKQoreworICAvKiBDaGVjayB0aGUgVUFSVCBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZihodWFydCA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBMSU4gVUFSVCBpbnN0YW5jZSAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9MSU5fSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSk7CisgIC8qIENoZWNrIHRoZSBCcmVhayBkZXRlY3Rpb24gbGVuZ3RoIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9MSU5fQlJFQUtfREVURUNUX0xFTkdUSChCcmVha0RldGVjdExlbmd0aCkpOworCisgIC8qIExJTiBtb2RlIGxpbWl0ZWQgdG8gMTYtYml0IG92ZXJzYW1wbGluZyBvbmx5ICovCisgIGlmKGh1YXJ0LT5Jbml0Lk92ZXJTYW1wbGluZyA9PSBVQVJUX09WRVJTQU1QTElOR184KQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAvKiBMSU4gbW9kZSBsaW1pdGVkIHRvIDgtYml0IGRhdGEgbGVuZ3RoICovCisgIGlmKGh1YXJ0LT5Jbml0LldvcmRMZW5ndGggIT0gVUFSVF9XT1JETEVOR1RIXzhCKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIGlmKGh1YXJ0LT5nU3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHVhcnQtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSyAqLworICAgIEhBTF9VQVJUX01zcEluaXQoaHVhcnQpOworICB9CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOworCisgIC8qIFNldCB0aGUgVUFSVCBDb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgKi8KKyAgaWYgKFVBUlRfU2V0Q29uZmlnKGh1YXJ0KSA9PSBIQUxfRVJST1IpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgaWYgKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQgIT0gVUFSVF9BRFZGRUFUVVJFX05PX0lOSVQpCisgIHsKKyAgICBVQVJUX0FkdkZlYXR1cmVDb25maWcoaHVhcnQpOworICB9CisKKyAgLyogSW4gTElOIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgLSBMSU5FTiBhbmQgQ0xLRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAtIFNDRU4gYW5kIElSRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLiovCisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0NMS0VOKTsKKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCAoVVNBUlRfQ1IzX0hEU0VMIHwgVVNBUlRfQ1IzX0lSRU4gfCBVU0FSVF9DUjNfU0NFTikpOworCisgIC8qIEVuYWJsZSB0aGUgTElOIG1vZGUgYnkgc2V0dGluZyB0aGUgTElORU4gYml0IGluIHRoZSBDUjIgcmVnaXN0ZXIgKi8KKyAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0xJTkVOKTsKKworICAvKiBTZXQgdGhlIFVTQVJUIExJTiBCcmVhayBkZXRlY3Rpb24gbGVuZ3RoLiAqLworICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfTEJETCwgQnJlYWtEZXRlY3RMZW5ndGgpOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VQVJUX0VOQUJMRShodWFydCk7CisKKyAgLyogVEVBQ0sgYW5kL29yIFJFQUNLIHRvIGNoZWNrIGJlZm9yZSBtb3ZpbmcgaHVhcnQtPmdTdGF0ZSBhbmQgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgcmV0dXJuIChVQVJUX0NoZWNrSWRsZVN0YXRlKGh1YXJ0KSk7Cit9CisKKworLyoqCisgICogQGJyaWVmIEluaXRpYWxpemUgdGhlIG11bHRpcHJvY2Vzc29yIG1vZGUgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgVUFSVF9Jbml0VHlwZURlZiBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEBwYXJhbSBBZGRyZXNzIFVBUlQgbm9kZSBhZGRyZXNzICg0LSwgNi0sIDctIG9yIDgtYml0IGxvbmcpLgorICAqIEBwYXJhbSBXYWtlVXBNZXRob2Qgc3BlY2lmaWVzIHRoZSBVQVJUIHdha2V1cCBtZXRob2QuCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIFVBUlRfV0FLRVVQTUVUSE9EX0lETEVMSU5FIFdha2VVcCBieSBhbiBpZGxlIGxpbmUgZGV0ZWN0aW9uCisgICogICAgICAgICAgQGFyZyBAcmVmIFVBUlRfV0FLRVVQTUVUSE9EX0FERFJFU1NNQVJLIFdha2VVcCBieSBhbiBhZGRyZXNzIG1hcmsKKyAgKiBAbm90ZSAgSWYgdGhlIHVzZXIgcmVzb3J0cyB0byBpZGxlIGxpbmUgZGV0ZWN0aW9uIHdha2UgdXAsIHRoZSBBZGRyZXNzIHBhcmFtZXRlcgorICAqICAgICAgICBpcyB1c2VsZXNzIGFuZCBpZ25vcmVkIGJ5IHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4KKyAgKiBAbm90ZSAgSWYgdGhlIHVzZXIgcmVzb3J0cyB0byBhZGRyZXNzIG1hcmsgd2FrZSB1cCwgdGhlIGFkZHJlc3MgbGVuZ3RoIGRldGVjdGlvbgorICAqICAgICAgICBpcyBjb25maWd1cmVkIGJ5IGRlZmF1bHQgdG8gNCBiaXRzIG9ubHkuIEZvciB0aGUgVUFSVCB0byBiZSBhYmxlIHRvCisgICogICAgICAgIG1hbmFnZSA2LSwgNy0gb3IgOC1iaXQgbG9uZyBhZGRyZXNzZXMgZGV0ZWN0aW9uLCB0aGUgQVBJCisgICogICAgICAgIEhBTF9NdWx0aVByb2Nlc3NvckV4X0FkZHJlc3NMZW5ndGhfU2V0KCkgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIKKyAgKiAgICAgICAgSEFMX011bHRpUHJvY2Vzc29yX0luaXQoKS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9NdWx0aVByb2Nlc3Nvcl9Jbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQ4X3QgQWRkcmVzcywgdWludDMyX3QgV2FrZVVwTWV0aG9kKQoreworICAvKiBDaGVjayB0aGUgVUFSVCBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZihodWFydCA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSB3YWtlIHVwIG1ldGhvZCBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfV0FLRVVQTUVUSE9EKFdha2VVcE1ldGhvZCkpOworCisgIGlmKGh1YXJ0LT5nU3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHVhcnQtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSyAqLworICAgIEhBTF9VQVJUX01zcEluaXQoaHVhcnQpOworICB9CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOworCisgIC8qIFNldCB0aGUgVUFSVCBDb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgKi8KKyAgaWYgKFVBUlRfU2V0Q29uZmlnKGh1YXJ0KSA9PSBIQUxfRVJST1IpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgaWYgKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQgIT0gVUFSVF9BRFZGRUFUVVJFX05PX0lOSVQpCisgIHsKKyAgICBVQVJUX0FkdkZlYXR1cmVDb25maWcoaHVhcnQpOworICB9CisKKyAgLyogSW4gbXVsdGlwcm9jZXNzb3IgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAtIExJTkVOIGFuZCBDTEtFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgIC0gU0NFTiwgSERTRUwgYW5kIElSRU4gIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4gKi8KKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCAoVVNBUlRfQ1IyX0xJTkVOIHwgVVNBUlRfQ1IyX0NMS0VOKSk7CisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgKFVTQVJUX0NSM19TQ0VOIHwgVVNBUlRfQ1IzX0hEU0VMIHwgVVNBUlRfQ1IzX0lSRU4pKTsKKworICBpZiAoV2FrZVVwTWV0aG9kID09IFVBUlRfV0FLRVVQTUVUSE9EX0FERFJFU1NNQVJLKQorICB7CisgICAgLyogSWYgYWRkcmVzcyBtYXJrIHdha2UgdXAgbWV0aG9kIGlzIGNob3Nlbiwgc2V0IHRoZSBVU0FSVCBhZGRyZXNzIG5vZGUgKi8KKyAgICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfQURELCAoKHVpbnQzMl90KUFkZHJlc3MgPDwgVUFSVF9DUjJfQUREUkVTU19MU0JfUE9TKSk7CisgIH0KKworICAvKiBTZXQgdGhlIHdha2UgdXAgbWV0aG9kIGJ5IHNldHRpbmcgdGhlIFdBS0UgYml0IGluIHRoZSBDUjEgcmVnaXN0ZXIgKi8KKyAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1dBS0UsIFdha2VVcE1ldGhvZCk7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1VBUlRfRU5BQkxFKGh1YXJ0KTsKKworICAvKiBURUFDSyBhbmQvb3IgUkVBQ0sgdG8gY2hlY2sgYmVmb3JlIG1vdmluZyBodWFydC0+Z1N0YXRlIGFuZCBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICByZXR1cm4gKFVBUlRfQ2hlY2tJZGxlU3RhdGUoaHVhcnQpKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgRGVJbml0aWFsaXplIHRoZSBVQVJUIHBlcmlwaGVyYWwuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfRGVJbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIENoZWNrIHRoZSBVQVJUIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmKGh1YXJ0ID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSk7CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOworCisgIGh1YXJ0LT5JbnN0YW5jZS0+Q1IxID0gMHgwVTsKKyAgaHVhcnQtPkluc3RhbmNlLT5DUjIgPSAweDBVOworICBodWFydC0+SW5zdGFuY2UtPkNSMyA9IDB4MFU7CisKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgSEFMX1VBUlRfTXNwRGVJbml0KGh1YXJ0KTsKKworICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfTk9ORTsKKyAgaHVhcnQtPmdTdGF0ZSAgICA9IEhBTF9VQVJUX1NUQVRFX1JFU0VUOworICBodWFydC0+UnhTdGF0ZSAgID0gSEFMX1VBUlRfU1RBVEVfUkVTRVQ7CisKKyAgLyogUHJvY2VzcyBVbmxvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgVUFSVCBNU1AuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VBUlRfTXNwSW5pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodWFydCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9VQVJUX01zcEluaXQgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiBEZUluaXRpYWxpemUgdGhlIFVBUlQgTVNQLgorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9VQVJUX01zcERlSW5pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodWFydCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9VQVJUX01zcERlSW5pdCBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqIEBicmllZiBVQVJUIFRyYW5zbWl0L1JlY2VpdmUgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gbWFuYWdlIHRoZSBVQVJUIGFzeW5jaHJvbm91cworICAgIGFuZCBIYWxmIGR1cGxleCBkYXRhIHRyYW5zZmVycy4KKworICAgICgjKSBUaGVyZSBhcmUgdHdvIG1vZGUgb2YgdHJhbnNmZXI6CisgICAgICAgKCsrKSBCbG9ja2luZyBtb2RlOiBUaGUgY29tbXVuaWNhdGlvbiBpcyBwZXJmb3JtZWQgaW4gcG9sbGluZyBtb2RlLgorICAgICAgICAgICBUaGUgSEFMIHN0YXR1cyBvZiBhbGwgZGF0YSBwcm9jZXNzaW5nIGlzIHJldHVybmVkIGJ5IHRoZSBzYW1lIGZ1bmN0aW9uCisgICAgICAgICAgIGFmdGVyIGZpbmlzaGluZyB0cmFuc2Zlci4KKyAgICAgICAoKyspIE5vbi1CbG9ja2luZyBtb2RlOiBUaGUgY29tbXVuaWNhdGlvbiBpcyBwZXJmb3JtZWQgdXNpbmcgSW50ZXJydXB0cworICAgICAgICAgICBvciBETUEsIFRoZXNlIEFQSSdzIHJldHVybiB0aGUgSEFMIHN0YXR1cy4KKyAgICAgICAgICAgVGhlIGVuZCBvZiB0aGUgZGF0YSBwcm9jZXNzaW5nIHdpbGwgYmUgaW5kaWNhdGVkIHRocm91Z2ggdGhlCisgICAgICAgICAgIGRlZGljYXRlZCBVQVJUIElSUSB3aGVuIHVzaW5nIEludGVycnVwdCBtb2RlIG9yIHRoZSBETUEgSVJRIHdoZW4KKyAgICAgICAgICAgdXNpbmcgRE1BIG1vZGUuCisgICAgICAgICAgIFRoZSBIQUxfVUFSVF9UeENwbHRDYWxsYmFjaygpLCBIQUxfVUFSVF9SeENwbHRDYWxsYmFjaygpIHVzZXIgY2FsbGJhY2tzCisgICAgICAgICAgIHdpbGwgYmUgZXhlY3V0ZWQgcmVzcGVjdGl2ZWx5IGF0IHRoZSBlbmQgb2YgdGhlIHRyYW5zbWl0IG9yIFJlY2VpdmUgcHJvY2VzcworICAgICAgICAgICBUaGUgSEFMX1VBUlRfRXJyb3JDYWxsYmFjaygpdXNlciBjYWxsYmFjayB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gYSBjb21tdW5pY2F0aW9uIGVycm9yIGlzIGRldGVjdGVkCisKKyAgICAoIykgQmxvY2tpbmcgbW9kZSBBUEkncyBhcmUgOgorICAgICAgICAoKyspIEhBTF9VQVJUX1RyYW5zbWl0KCkKKyAgICAgICAgKCsrKSBIQUxfVUFSVF9SZWNlaXZlKCkKKworICAgICgjKSBOb24tQmxvY2tpbmcgbW9kZSBBUEkncyB3aXRoIEludGVycnVwdCBhcmUgOgorICAgICAgICAoKyspIEhBTF9VQVJUX1RyYW5zbWl0X0lUKCkKKyAgICAgICAgKCsrKSBIQUxfVUFSVF9SZWNlaXZlX0lUKCkKKyAgICAgICAgKCsrKSBIQUxfVUFSVF9JUlFIYW5kbGVyKCkKKworICAgICgjKSBOb24tQmxvY2tpbmcgbW9kZSBBUEkncyB3aXRoIERNQSBhcmUgOgorICAgICAgICAoKyspIEhBTF9VQVJUX1RyYW5zbWl0X0RNQSgpCisgICAgICAgICgrKykgSEFMX1VBUlRfUmVjZWl2ZV9ETUEoKQorICAgICAgICAoKyspIEhBTF9VQVJUX0RNQVBhdXNlKCkKKyAgICAgICAgKCsrKSBIQUxfVUFSVF9ETUFSZXN1bWUoKQorICAgICAgICAoKyspIEhBTF9VQVJUX0RNQVN0b3AoKQorCisgICAgKCMpIEEgc2V0IG9mIFRyYW5zZmVyIENvbXBsZXRlIENhbGxiYWNrcyBhcmUgcHJvdmlkZWQgaW4gTm9uX0Jsb2NraW5nIG1vZGU6CisgICAgICAgICgrKykgSEFMX1VBUlRfVHhIYWxmQ3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfVUFSVF9UeENwbHRDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX1VBUlRfUnhIYWxmQ3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfVUFSVF9SeENwbHRDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX1VBUlRfRXJyb3JDYWxsYmFjaygpCisKKyAgICAoIykgTm9uLUJsb2NraW5nIG1vZGUgdHJhbnNmZXJzIGNvdWxkIGJlIGFib3J0ZWQgdXNpbmcgQWJvcnQgQVBJJ3MgOgorICAgICAgICAoKyspIEhBTF9VQVJUX0Fib3J0KCkKKyAgICAgICAgKCsrKSBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0KCkKKyAgICAgICAgKCsrKSBIQUxfVUFSVF9BYm9ydFJlY2VpdmUoKQorICAgICAgICAoKyspIEhBTF9VQVJUX0Fib3J0X0lUKCkKKyAgICAgICAgKCsrKSBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0X0lUKCkKKyAgICAgICAgKCsrKSBIQUxfVUFSVF9BYm9ydFJlY2VpdmVfSVQoKQorCisgICAgKCMpIEZvciBBYm9ydCBzZXJ2aWNlcyBiYXNlZCBvbiBpbnRlcnJ1cHRzIChIQUxfVUFSVF9BYm9ydHh4eF9JVCksIGEgc2V0IG9mIEFib3J0IENvbXBsZXRlIENhbGxiYWNrcyBhcmUgcHJvdmlkZWQ6CisgICAgICAgICgrKykgSEFMX1VBUlRfQWJvcnRDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9VQVJUX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjaygpCisKKyAgICAoIykgSW4gTm9uLUJsb2NraW5nIG1vZGUgdHJhbnNmZXJzLCBwb3NzaWJsZSBlcnJvcnMgYXJlIHNwbGl0IGludG8gMiBjYXRlZ29yaWVzLgorICAgICAgICBFcnJvcnMgYXJlIGhhbmRsZWQgYXMgZm9sbG93cyA6CisgICAgICAgICgrKykgRXJyb3IgaXMgY29uc2lkZXJlZCBhcyBSZWNvdmVyYWJsZSBhbmQgbm9uIGJsb2NraW5nIDogVHJhbnNmZXIgY291bGQgZ28gdGlsbCBlbmQsIGJ1dCBlcnJvciBzZXZlcml0eSBpcyAKKyAgICAgICAgICAgICB0byBiZSBldmFsdWF0ZWQgYnkgdXNlciA6IHRoaXMgY29uY2VybnMgRnJhbWUgRXJyb3IsIFBhcml0eSBFcnJvciBvciBOb2lzZSBFcnJvciBpbiBJbnRlcnJ1cHQgbW9kZSByZWNlcHRpb24gLgorICAgICAgICAgICAgIFJlY2VpdmVkIGNoYXJhY3RlciBpcyB0aGVuIHJldHJpZXZlZCBhbmQgc3RvcmVkIGluIFJ4IGJ1ZmZlciwgRXJyb3IgY29kZSBpcyBzZXQgdG8gYWxsb3cgdXNlciB0byBpZGVudGlmeSBlcnJvciB0eXBlLAorICAgICAgICAgICAgIGFuZCBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKCkgdXNlciBjYWxsYmFjayBpcyBleGVjdXRlZC4gVHJhbnNmZXIgaXMga2VwdCBvbmdvaW5nIG9uIFVBUlQgc2lkZS4KKyAgICAgICAgICAgICBJZiB1c2VyIHdhbnRzIHRvIGFib3J0IGl0LCBBYm9ydCBzZXJ2aWNlcyBzaG91bGQgYmUgY2FsbGVkIGJ5IHVzZXIuCisgICAgICAgICgrKykgRXJyb3IgaXMgY29uc2lkZXJlZCBhcyBCbG9ja2luZyA6IFRyYW5zZmVyIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgcHJvcGVybHkgYW5kIGlzIGFib3J0ZWQuCisgICAgICAgICAgICAgVGhpcyBjb25jZXJucyBPdmVycnVuIEVycm9yIEluIEludGVycnVwdCBtb2RlIHJlY2VwdGlvbiBhbmQgYWxsIGVycm9ycyBpbiBETUEgbW9kZS4KKyAgICAgICAgICAgICBFcnJvciBjb2RlIGlzIHNldCB0byBhbGxvdyB1c2VyIHRvIGlkZW50aWZ5IGVycm9yIHR5cGUsIGFuZCBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKCkgdXNlciBjYWxsYmFjayBpcyBleGVjdXRlZC4KKworICAgIC1ALSBJbiB0aGUgSGFsZiBkdXBsZXggY29tbXVuaWNhdGlvbiwgaXQgaXMgZm9yYmlkZGVuIHRvIHJ1biB0aGUgdHJhbnNtaXQKKyAgICAgICAgYW5kIHJlY2VpdmUgcHJvY2VzcyBpbiBwYXJhbGxlbCwgdGhlIFVBUlQgc3RhdGUgSEFMX1VBUlRfU1RBVEVfQlVTWV9UWF9SWCBjYW4ndCBiZSB1c2VmdWwuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEBwYXJhbSBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQuCisgICogQHBhcmFtIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX1RyYW5zbWl0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MTZfdCogdG1wOworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKworICAvKiBDaGVjayB0aGF0IGEgVHggcHJvY2VzcyBpcyBub3QgYWxyZWFkeSBvbmdvaW5nICovCisgIGlmKGh1YXJ0LT5nU3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZigocERhdGEgPT0gTlVMTCApIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHVhcnQpOworCisgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CisgICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1lfVFg7CisKKyAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ21lbnQqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICBodWFydC0+VHhYZmVyU2l6ZSA9IFNpemU7CisgICAgaHVhcnQtPlR4WGZlckNvdW50ID0gU2l6ZTsKKyAgICB3aGlsZShodWFydC0+VHhYZmVyQ291bnQgPiAwVSkKKyAgICB7CisgICAgICBodWFydC0+VHhYZmVyQ291bnQtLTsKKyAgICAgIGlmKFVBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodWFydCwgVUFSVF9GTEFHX1RYRSwgUkVTRVQsIHRpY2tzdGFydCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgICBpZiAoKGh1YXJ0LT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVhcnQtPkluaXQuUGFyaXR5ID09IFVBUlRfUEFSSVRZX05PTkUpKQorICAgICAgeworICAgICAgICB0bXAgPSAodWludDE2X3QqKSBwRGF0YTsKKyAgICAgICAgaHVhcnQtPkluc3RhbmNlLT5URFIgPSAoKnRtcCAmICh1aW50MTZfdCkweDAxRkZVKTsKKyAgICAgICAgcERhdGEgKz0gMlU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGh1YXJ0LT5JbnN0YW5jZS0+VERSID0gKCpwRGF0YSsrICYgKHVpbnQ4X3QpMHhGRlUpOworICAgICAgfQorICAgIH0KKyAgICBpZihVQVJUX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaHVhcnQsIFVBUlRfRkxBR19UQywgUkVTRVQsIHRpY2tzdGFydCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisKKyAgICAvKiBBdCBlbmQgb2YgVHggcHJvY2VzcywgcmVzdG9yZSBodWFydC0+Z1N0YXRlIHRvIFJlYWR5ICovCisgICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gcERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZC4KKyAgKiBAcGFyYW0gVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfUmVjZWl2ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDE2X3QqIHRtcDsKKyAgdWludDE2X3QgdWhNYXNrOworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKworICAvKiBDaGVjayB0aGF0IGEgUnggcHJvY2VzcyBpcyBub3QgYWxyZWFkeSBvbmdvaW5nICovCisgIGlmKGh1YXJ0LT5SeFN0YXRlID09IEhBTF9VQVJUX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYoKHBEYXRhID09IE5VTEwgKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOworICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWV9SWDsKKworICAgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnbWVudCovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIGh1YXJ0LT5SeFhmZXJTaXplID0gU2l6ZTsKKyAgICBodWFydC0+UnhYZmVyQ291bnQgPSBTaXplOworCisgICAgLyogQ29tcHV0YXRpb24gb2YgVUFSVCBtYXNrIHRvIGFwcGx5IHRvIFJEUiByZWdpc3RlciAqLworICAgIFVBUlRfTUFTS19DT01QVVRBVElPTihodWFydCk7CisgICAgdWhNYXNrID0gaHVhcnQtPk1hc2s7CisKKyAgICAvKiBhcyBsb25nIGFzIGRhdGEgaGF2ZSB0byBiZSByZWNlaXZlZCAqLworICAgIHdoaWxlKGh1YXJ0LT5SeFhmZXJDb3VudCA+IDBVKQorICAgIHsKKyAgICAgIGh1YXJ0LT5SeFhmZXJDb3VudC0tOworICAgICAgaWYoVUFSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGh1YXJ0LCBVQVJUX0ZMQUdfUlhORSwgUkVTRVQsIHRpY2tzdGFydCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgICBpZiAoKGh1YXJ0LT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVhcnQtPkluaXQuUGFyaXR5ID09IFVBUlRfUEFSSVRZX05PTkUpKQorICAgICAgeworICAgICAgICB0bXAgPSAodWludDE2X3QqKSBwRGF0YSA7CisgICAgICAgICp0bXAgPSAodWludDE2X3QpKGh1YXJ0LT5JbnN0YW5jZS0+UkRSICYgdWhNYXNrKTsKKyAgICAgICAgcERhdGEgKz0yVTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgKnBEYXRhKysgPSAodWludDhfdCkoaHVhcnQtPkluc3RhbmNlLT5SRFIgJiAodWludDhfdCl1aE1hc2spOworICAgICAgfQorICAgIH0KKworICAgIC8qIEF0IGVuZCBvZiBSeCBwcm9jZXNzLCByZXN0b3JlIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEBwYXJhbSBwRGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9UcmFuc21pdF9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgLyogQ2hlY2sgdGhhdCBhIFR4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZihodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYoKHBEYXRhID09IE5VTEwgKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHVhcnQpOworCisgICAgaHVhcnQtPnBUeEJ1ZmZQdHIgPSBwRGF0YTsKKyAgICBodWFydC0+VHhYZmVyU2l6ZSA9IFNpemU7CisgICAgaHVhcnQtPlR4WGZlckNvdW50ID0gU2l6ZTsKKworICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOworICAgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZX1RYOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgICAvKiBFbmFibGUgdGhlIFVBUlQgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBFbXB0eSBJbnRlcnJ1cHQgKi8KKyAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVFhFSUUpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEBwYXJhbSBwRGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfUmVjZWl2ZV9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZihodWFydC0+UnhTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmKChwRGF0YSA9PSBOVUxMICkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICAgIGh1YXJ0LT5wUnhCdWZmUHRyID0gcERhdGE7CisgICAgaHVhcnQtPlJ4WGZlclNpemUgPSBTaXplOworICAgIGh1YXJ0LT5SeFhmZXJDb3VudCA9IFNpemU7CisKKyAgICAvKiBDb21wdXRhdGlvbiBvZiBVQVJUIG1hc2sgdG8gYXBwbHkgdG8gUkRSIHJlZ2lzdGVyICovCisgICAgVUFSVF9NQVNLX0NPTVBVVEFUSU9OKGh1YXJ0KTsKKworICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOworICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWV9SWDsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgICAgLyogRW5hYmxlIHRoZSBVQVJUIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgIC8qIEVuYWJsZSB0aGUgVUFSVCBQYXJpdHkgRXJyb3IgYW5kIERhdGEgUmVnaXN0ZXIgbm90IGVtcHR5IEludGVycnVwdHMgKi8KKyAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9SWE5FSUUpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gRE1BIG1vZGUuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEBwYXJhbSBwRGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQuCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBzdGFydHMgYSBETUEgdHJhbnNmZXIgaW4gaW50ZXJydXB0IG1vZGUgbWVhbmluZyB0aGF0CisgICogICAgICAgRE1BIGhhbGYgdHJhbnNmZXIgY29tcGxldGUsIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBhbmQgRE1BIHRyYW5zZmVyCisgICogICAgICAgZXJyb3IgaW50ZXJydXB0cyBhcmUgZW5hYmxlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfVHJhbnNtaXRfRE1BKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICAvKiBDaGVjayBpZiBVQVJUIGluc3RhbmNlIHN1cHBvcnRzIGNvbnRpbnVvdXMgY29tbXVuaWNhdGlvbiB1c2luZyBETUEgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfRE1BX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpOworCisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmKChwRGF0YSA9PSBOVUxMICkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICAgIGh1YXJ0LT5wVHhCdWZmUHRyID0gcERhdGE7CisgICAgaHVhcnQtPlR4WGZlclNpemUgPSBTaXplOworICAgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IFNpemU7CisKKyAgICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfTk9ORTsKKyAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWV9UWDsKKworICAgIC8qIFNldCB0aGUgVUFSVCBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBodWFydC0+aGRtYXR4LT5YZmVyQ3BsdENhbGxiYWNrID0gVUFSVF9ETUFUcmFuc21pdENwbHQ7CisKKyAgICAvKiBTZXQgdGhlIFVBUlQgRE1BIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBodWFydC0+aGRtYXR4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFVBUlRfRE1BVHhIYWxmQ3BsdDsKKworICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgaHVhcnQtPmhkbWF0eC0+WGZlckVycm9yQ2FsbGJhY2sgPSBVQVJUX0RNQUVycm9yOworCisgICAgLyogU2V0IHRoZSBETUEgYWJvcnQgY2FsbGJhY2sgKi8KKyAgICBodWFydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAvKiBFbmFibGUgdGhlIFVBUlQgdHJhbnNtaXQgRE1BIGNoYW5uZWwgKi8KKyAgICBIQUxfRE1BX1N0YXJ0X0lUKGh1YXJ0LT5oZG1hdHgsICh1aW50MzJfdClodWFydC0+cFR4QnVmZlB0ciwgKHVpbnQzMl90KSZodWFydC0+SW5zdGFuY2UtPlREUiwgU2l6ZSk7CisKKyAgICAvKiBDbGVhciB0aGUgVEMgZmxhZyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX1RDRik7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICAgIC8qIEVuYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0cmFuc21pdCByZXF1ZXN0IGJ5IHNldHRpbmcgdGhlIERNQVQgYml0CisgICAgICAgaW4gdGhlIFVBUlQgQ1IzIHJlZ2lzdGVyICovCisgICAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gRE1BIG1vZGUuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEBwYXJhbSBwRGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkLgorICAqIEBub3RlICAgV2hlbiB0aGUgVUFSVCBwYXJpdHkgaXMgZW5hYmxlZCAoUENFID0gMSksIHRoZSByZWNlaXZlZCBkYXRhIGNvbnRhaW4KKyAgKiAgICAgICAgIHRoZSBwYXJpdHkgYml0IChNU0IgcG9zaXRpb24pLgorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gc3RhcnRzIGEgRE1BIHRyYW5zZmVyIGluIGludGVycnVwdCBtb2RlIG1lYW5pbmcgdGhhdAorICAqICAgICAgIERNQSBoYWxmIHRyYW5zZmVyIGNvbXBsZXRlLCBETUEgdHJhbnNmZXIgY29tcGxldGUgYW5kIERNQSB0cmFuc2ZlcgorICAqICAgICAgIGVycm9yIGludGVycnVwdHMgYXJlIGVuYWJsZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX1JlY2VpdmVfRE1BKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICAvKiBDaGVjayBpZiBVQVJUIGluc3RhbmNlIHN1cHBvcnRzIGNvbnRpbnVvdXMgY29tbXVuaWNhdGlvbiB1c2luZyBETUEgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfRE1BX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpOworCisgIC8qIENoZWNrIHRoYXQgYSBSeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYoaHVhcnQtPlJ4U3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZigocERhdGEgPT0gTlVMTCApIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgICBodWFydC0+cFJ4QnVmZlB0ciA9IHBEYXRhOworICAgIGh1YXJ0LT5SeFhmZXJTaXplID0gU2l6ZTsKKworICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOworICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWV9SWDsKKworICAgIC8qIFNldCB0aGUgVUFSVCBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBodWFydC0+aGRtYXJ4LT5YZmVyQ3BsdENhbGxiYWNrID0gVUFSVF9ETUFSZWNlaXZlQ3BsdDsKKworICAgIC8qIFNldCB0aGUgVUFSVCBETUEgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGh1YXJ0LT5oZG1hcngtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVUFSVF9ETUFSeEhhbGZDcGx0OworCisgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICBodWFydC0+aGRtYXJ4LT5YZmVyRXJyb3JDYWxsYmFjayA9IFVBUlRfRE1BRXJyb3I7CisKKyAgICAvKiBTZXQgdGhlIERNQSBhYm9ydCBjYWxsYmFjayAqLworICAgIGh1YXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICBIQUxfRE1BX1N0YXJ0X0lUKGh1YXJ0LT5oZG1hcngsICh1aW50MzJfdCkmaHVhcnQtPkluc3RhbmNlLT5SRFIsICh1aW50MzJfdClodWFydC0+cFJ4QnVmZlB0ciwgU2l6ZSk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICAgIC8qIEVuYWJsZSB0aGUgVUFSVCBQYXJpdHkgRXJyb3IgSW50ZXJydXB0ICovCisgICAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworCisgICAgLyogRW5hYmxlIHRoZSBVQVJUIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgIC8qIEVuYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0aGUgcmVjZWl2ZXIgcmVxdWVzdCBieSBzZXR0aW5nIHRoZSBETUFSIGJpdAorICAgICAgIGluIHRoZSBVQVJUIENSMyByZWdpc3RlciAqLworICAgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUGF1c2UgdGhlIERNQSBUcmFuc2Zlci4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfRE1BUGF1c2UoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgaWYgKChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfVFgpICYmCisgICAgICAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIERNQSBUeCByZXF1ZXN0ICovCisgICAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisgIH0KKyAgaWYgKChodWFydC0+UnhTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9CVVNZX1JYKSAmJgorICAgICAgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpKQorICB7CisgICAgLyogRGlzYWJsZSBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBETUEgUnggcmVxdWVzdCAqLworICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworICB9CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVzdW1lIHRoZSBETUEgVHJhbnNmZXIuCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0RNQVJlc3VtZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICBpZihodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfVFgpCisgIHsKKyAgICAvKiBFbmFibGUgdGhlIFVBUlQgRE1BIFR4IHJlcXVlc3QgKi8KKyAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisgIH0KKyAgaWYoaHVhcnQtPlJ4U3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfQlVTWV9SWCkKKyAgeworICAgIC8qIENsZWFyIHRoZSBPdmVycnVuIGZsYWcgYmVmb3JlIHJlc3VtaW5nIHRoZSBSeCB0cmFuc2ZlciAqLworICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9PUkVGKTsKKworICAgIC8qIFJlZW5hYmxlIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICAgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKyAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgIC8qIEVuYWJsZSB0aGUgVUFSVCBETUEgUnggcmVxdWVzdCAqLworICAgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgdGhlIERNQSBUcmFuc2Zlci4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfRE1BU3RvcChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBUaGUgTG9jayBpcyBub3QgaW1wbGVtZW50ZWQgb24gdGhpcyBBUEkgdG8gYWxsb3cgdGhlIHVzZXIgYXBwbGljYXRpb24KKyAgICAgdG8gY2FsbCB0aGUgSEFMIFVBUlQgQVBJIHVuZGVyIGNhbGxiYWNrcyBIQUxfVUFSVF9UeENwbHRDYWxsYmFjaygpIC8gSEFMX1VBUlRfUnhDcGx0Q2FsbGJhY2soKSAvCisgICAgIEhBTF9VQVJUX1R4SGFsZkNwbHRDYWxsYmFjayAvIEhBTF9VQVJUX1J4SGFsZkNwbHRDYWxsYmFjazogCisgICAgIGluZGVlZCwgd2hlbiBIQUxfRE1BX0Fib3J0KCkgQVBJIGlzIGNhbGxlZCwgdGhlIERNQSBUWC9SWCBUcmFuc2ZlciBvciBIYWxmIFRyYW5zZmVyIGNvbXBsZXRlICAKKyAgICAgaW50ZXJydXB0IGlzIGdlbmVyYXRlZCBpZiB0aGUgRE1BIHRyYW5zZmVyIGludGVycnVwdGlvbiBvY2N1cnMgYXQgdGhlIG1pZGRsZSBvciBhdCB0aGUgZW5kIG9mIAorICAgICB0aGUgc3RyZWFtIGFuZCB0aGUgY29ycmVzcG9uZGluZyBjYWxsIGJhY2sgaXMgZXhlY3V0ZWQuICovCisKKyAgLyogU3RvcCBVQVJUIERNQSBUeCByZXF1ZXN0IGlmIG9uZ29pbmcgKi8KKyAgaWYgKChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfVFgpICYmCisgICAgICAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkpCisgIHsKKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBUeCBjaGFubmVsICovCisgICAgaWYoaHVhcnQtPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIEhBTF9ETUFfQWJvcnQoaHVhcnQtPmhkbWF0eCk7CisgICAgfQorCisgICAgVUFSVF9FbmRUeFRyYW5zZmVyKGh1YXJ0KTsKKyAgfQorCisgIC8qIFN0b3AgVUFSVCBETUEgUnggcmVxdWVzdCBpZiBvbmdvaW5nICovCisgIGlmICgoaHVhcnQtPlJ4U3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfQlVTWV9SWCkgJiYKKyAgICAgIChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKSkKKyAgeworICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgLyogQWJvcnQgdGhlIFVBUlQgRE1BIFJ4IGNoYW5uZWwgKi8KKyAgICBpZihodWFydC0+aGRtYXJ4ICE9IE5VTEwpCisgICAgeworICAgICAgSEFMX0RNQV9BYm9ydChodWFydC0+aGRtYXJ4KTsKKyAgICB9CisKKyAgICBVQVJUX0VuZFJ4VHJhbnNmZXIoaHVhcnQpOworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIHRyYW5zZmVycyAoYmxvY2tpbmcgbW9kZSkuCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIHRyYW5zZmVyIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLiAKKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIFVBUlQgSW50ZXJydXB0cyAoVHggYW5kIFJ4KQorICAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkKKyAgKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0IChpbiBjYXNlIG9mIHRyYW5zZmVyIGluIERNQSBtb2RlKQorICAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIGJsb2NraW5nIG1vZGUgOiB3aGVuIGV4aXRpbmcgZnVuY3Rpb24sIEFib3J0IGlzIGNvbnNpZGVyZWQgYXMgY29tcGxldGVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIERpc2FibGUgVFhFSUUsIFRDSUUsIFJYTkUsIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFIHwgVVNBUlRfQ1IxX1BFSUUgfCBVU0FSVF9DUjFfVFhFSUUgfCBVU0FSVF9DUjFfVENJRSkpOworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgIC8qIERpc2FibGUgdGhlIFVBUlQgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgeworICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgLyogQWJvcnQgdGhlIFVBUlQgRE1BIFR4IGNoYW5uZWwgOiB1c2UgYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAobm8gY2FsbGJhY2spICovCisgICAgaWYoaHVhcnQtPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgVUFSVCBETUEgQWJvcnQgY2FsbGJhY2sgdG8gTnVsbC4gCisgICAgICAgICBObyBjYWxsIGJhY2sgZXhlY3V0aW9uIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBodWFydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIEhBTF9ETUFfQWJvcnQoaHVhcnQtPmhkbWF0eCk7CisgICAgfQorICB9CisKKyAgLyogRGlzYWJsZSB0aGUgVUFSVCBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICB7CisgICAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBBYm9ydCB0aGUgVUFSVCBETUEgUnggY2hhbm5lbCA6IHVzZSBibG9ja2luZyBETUEgQWJvcnQgQVBJIChubyBjYWxsYmFjaykgKi8KKyAgICBpZihodWFydC0+aGRtYXJ4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBVQVJUIERNQSBBYm9ydCBjYWxsYmFjayB0byBOdWxsLiAKKyAgICAgICAgIE5vIGNhbGwgYmFjayBleGVjdXRpb24gYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgIGh1YXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgICAgSEFMX0RNQV9BYm9ydChodWFydC0+aGRtYXJ4KTsKKyAgICB9CisgIH0KKworICAvKiBSZXNldCBUeCBhbmQgUnggdHJhbnNmZXIgY291bnRlcnMgKi8KKyAgaHVhcnQtPlR4WGZlckNvdW50ID0gMFU7IAorICBodWFydC0+UnhYZmVyQ291bnQgPSAwVTsgCisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX09SRUYgfCBVQVJUX0NMRUFSX05FRiB8IFVBUlRfQ0xFQVJfUEVGIHwgVUFSVF9DTEVBUl9GRUYpOworCisgIC8qIFJlc3RvcmUgaHVhcnQtPmdTdGF0ZSBhbmQgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaHVhcnQtPmdTdGF0ZSAgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKyAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAvKiBSZXNldCBIYW5kbGUgRXJyb3JDb2RlIHRvIE5vIEVycm9yICovCisgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgb25nb2luZyBUcmFuc21pdCB0cmFuc2ZlciAoYmxvY2tpbmcgbW9kZSkuCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIFR4IHRyYW5zZmVyIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLiAKKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIFVBUlQgSW50ZXJydXB0cyAoVHgpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gYmxvY2tpbmcgbW9kZSA6IHdoZW4gZXhpdGluZyBmdW5jdGlvbiwgQWJvcnQgaXMgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfQWJvcnRUcmFuc21pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBEaXNhYmxlIFRYRUlFIGFuZCBUQ0lFIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1RYRUlFIHwgVVNBUlRfQ1IxX1RDSUUpKTsKKworICAvKiBEaXNhYmxlIHRoZSBVQVJUIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgIHsKKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBUeCBjaGFubmVsIDogdXNlIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKG5vIGNhbGxiYWNrKSAqLworICAgIGlmKGh1YXJ0LT5oZG1hdHggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFVBUlQgRE1BIEFib3J0IGNhbGxiYWNrIHRvIE51bGwuIAorICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaHVhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICBIQUxfRE1BX0Fib3J0KGh1YXJ0LT5oZG1hdHgpOworICAgIH0KKyAgfQorCisgIC8qIFJlc2V0IFR4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgaHVhcnQtPlR4WGZlckNvdW50ID0gMFU7IAorCisgIC8qIFJlc3RvcmUgaHVhcnQtPmdTdGF0ZSB0byBSZWFkeSAqLworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIFJlY2VpdmUgdHJhbnNmZXIgKGJsb2NraW5nIG1vZGUpLgorICAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyBSeCB0cmFuc2ZlciBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4gCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBVQVJUIEludGVycnVwdHMgKFJ4KQorICAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkKKyAgKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0IChpbiBjYXNlIG9mIHRyYW5zZmVyIGluIERNQSBtb2RlKQorICAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIGJsb2NraW5nIG1vZGUgOiB3aGVuIGV4aXRpbmcgZnVuY3Rpb24sIEFib3J0IGlzIGNvbnNpZGVyZWQgYXMgY29tcGxldGVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBEaXNhYmxlIFJYTkUsIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFIHwgVVNBUlRfQ1IxX1BFSUUpKTsKKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAvKiBEaXNhYmxlIHRoZSBVQVJUIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgIHsKKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBSeCBjaGFubmVsIDogdXNlIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKG5vIGNhbGxiYWNrKSAqLworICAgIGlmKGh1YXJ0LT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFVBUlQgRE1BIEFib3J0IGNhbGxiYWNrIHRvIE51bGwuIAorICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICBIQUxfRE1BX0Fib3J0KGh1YXJ0LT5oZG1hcngpOworICAgIH0KKyAgfQorCisgIC8qIFJlc2V0IFJ4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgaHVhcnQtPlJ4WGZlckNvdW50ID0gMFU7IAorCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9PUkVGIHwgVUFSVF9DTEVBUl9ORUYgfCBVQVJUX0NMRUFSX1BFRiB8IFVBUlRfQ0xFQVJfRkVGKTsKKworICAvKiBSZXN0b3JlIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIHRyYW5zZmVycyAoSW50ZXJydXB0IG1vZGUpLgorICAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyB0cmFuc2ZlciBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4gCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBVQVJUIEludGVycnVwdHMgKFR4IGFuZCBSeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydF9JVCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogICAgICAgICAgIC0gQXQgYWJvcnQgY29tcGxldGlvbiwgY2FsbCB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBJbnRlcnJ1cHQgbW9kZSwgbWVhbmluZyB0aGF0IGFib3J0IHByb2NlZHVyZSBjb3VsZCBiZQorICAqICAgICAgICAgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQgb25seSB3aGVuIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgKG5vdCB3aGVuIGV4aXRpbmcgZnVuY3Rpb24pLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0X0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIHVpbnQzMl90IGFib3J0Y3BsdCA9IDFVOworICAKKyAgLyogRGlzYWJsZSBUWEVJRSwgVENJRSwgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUUgfCBVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9UWEVJRSB8IFVTQVJUX0NSMV9UQ0lFKSk7CisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgLyogSWYgRE1BIFR4IGFuZC9vciBETUEgUnggSGFuZGxlcyBhcmUgYXNzb2NpYXRlZCB0byBVQVJUIEhhbmRsZSwgRE1BIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrcyBzaG91bGQgYmUgaW5pdGlhbGlzZWQKKyAgICAgYmVmb3JlIGFueSBjYWxsIHRvIERNQSBBYm9ydCBmdW5jdGlvbnMgKi8KKyAgLyogRE1BIFR4IEhhbmRsZSBpcyB2YWxpZCAqLworICBpZihodWFydC0+aGRtYXR4ICE9IE5VTEwpCisgIHsKKyAgICAvKiBTZXQgRE1BIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrIGlmIFVBUlQgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZC4KKyAgICAgICBPdGhlcndpc2UsIHNldCBpdCB0byBOVUxMICovCisgICAgaWYoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgICB7CisgICAgICBodWFydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFVBUlRfRE1BVHhBYm9ydENhbGxiYWNrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHVhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgIH0KKyAgfQorICAvKiBETUEgUnggSGFuZGxlIGlzIHZhbGlkICovCisgIGlmKGh1YXJ0LT5oZG1hcnggIT0gTlVMTCkKKyAgeworICAgIC8qIFNldCBETUEgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgaWYgVUFSVCBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkLgorICAgICAgIE90aGVyd2lzZSwgc2V0IGl0IHRvIE5VTEwgKi8KKyAgICBpZihIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICAgIHsKKyAgICAgIGh1YXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gVUFSVF9ETUFSeEFib3J0Q2FsbGJhY2s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBodWFydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgfQorICB9CisgIAorICAvKiBEaXNhYmxlIHRoZSBVQVJUIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgeworICAgIC8qIERpc2FibGUgRE1BIFR4IGF0IFVBUlQgbGV2ZWwgKi8KKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBUeCBjaGFubmVsIDogdXNlIG5vbiBibG9ja2luZyBETUEgQWJvcnQgQVBJIChjYWxsYmFjaykgKi8KKyAgICBpZihodWFydC0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogVUFSVCBUeCBETUEgQWJvcnQgY2FsbGJhY2sgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXNlZCA6IAorICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX1VBUlRfQWJvcnRDcGx0Q2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworCisgICAgICAvKiBBYm9ydCBETUEgVFggKi8KKyAgICAgIGlmKEhBTF9ETUFfQWJvcnRfSVQoaHVhcnQtPmhkbWF0eCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBodWFydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGFib3J0Y3BsdCA9IDBVOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFVBUlQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgeworICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgLyogQWJvcnQgdGhlIFVBUlQgRE1BIFJ4IGNoYW5uZWwgOiB1c2Ugbm9uIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKGNhbGxiYWNrKSAqLworICAgIGlmKGh1YXJ0LT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBVQVJUIFJ4IERNQSBBYm9ydCBjYWxsYmFjayBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpc2VkIDogCisgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisKKyAgICAgIC8qIEFib3J0IERNQSBSWCAqLworICAgICAgaWYoSEFMX0RNQV9BYm9ydF9JVChodWFydC0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGh1YXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgYWJvcnRjcGx0ID0gMVU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGFib3J0Y3BsdCA9IDBVOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIGlmIG5vIERNQSBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjayBleGVjdXRpb24gaXMgcmVxdWlyZWQgPT4gY2FsbCB1c2VyIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrICovCisgIGlmIChhYm9ydGNwbHQgPT0gMVUpCisgIHsKKyAgICAvKiBSZXNldCBUeCBhbmQgUnggdHJhbnNmZXIgY291bnRlcnMgKi8KKyAgICBodWFydC0+VHhYZmVyQ291bnQgPSAwVTsgCisgICAgaHVhcnQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgICAvKiBSZXNldCBlcnJvckNvZGUgKi8KKyAgICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfTk9ORTsKKworICAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX09SRUYgfCBVQVJUX0NMRUFSX05FRiB8IFVBUlRfQ0xFQVJfUEVGIHwgVUFSVF9DTEVBUl9GRUYpOworCisgICAgLyogUmVzdG9yZSBodWFydC0+Z1N0YXRlIGFuZCBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICAgIGh1YXJ0LT5nU3RhdGUgID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjayhodWFydCk7CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IG9uZ29pbmcgVHJhbnNtaXQgdHJhbnNmZXIgKEludGVycnVwdCBtb2RlKS4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgVHggdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuIAorICAqICAgICAgICAgVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nIG9wZXJhdGlvbnMgOgorICAqICAgICAgICAgICAtIERpc2FibGUgVUFSVCBJbnRlcnJ1cHRzIChUeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydF9JVCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogICAgICAgICAgIC0gQXQgYWJvcnQgY29tcGxldGlvbiwgY2FsbCB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBJbnRlcnJ1cHQgbW9kZSwgbWVhbmluZyB0aGF0IGFib3J0IHByb2NlZHVyZSBjb3VsZCBiZQorICAqICAgICAgICAgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQgb25seSB3aGVuIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgKG5vdCB3aGVuIGV4aXRpbmcgZnVuY3Rpb24pLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0VHJhbnNtaXRfSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogRGlzYWJsZSBUWEVJRSBhbmQgVENJRSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9UWEVJRSB8IFVTQVJUX0NSMV9UQ0lFKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgVUFSVCBETUEgVHggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICB7CisgICAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICAvKiBBYm9ydCB0aGUgVUFSVCBETUEgVHggY2hhbm5lbCA6IHVzZSBub24gYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAoY2FsbGJhY2spICovCisgICAgaWYoaHVhcnQtPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgVUFSVCBETUEgQWJvcnQgY2FsbGJhY2sgOiAKKyAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9VQVJUX0Fib3J0Q3BsdENhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgIGh1YXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gVUFSVF9ETUFUeE9ubHlBYm9ydENhbGxiYWNrOworCisgICAgICAvKiBBYm9ydCBETUEgVFggKi8KKyAgICAgIGlmKEhBTF9ETUFfQWJvcnRfSVQoaHVhcnQtPmhkbWF0eCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICAvKiBDYWxsIERpcmVjdGx5IGh1YXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKi8KKyAgICAgICAgaHVhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2soaHVhcnQtPmhkbWF0eCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBSZXNldCBUeCB0cmFuc2ZlciBjb3VudGVyICovCisgICAgICBodWFydC0+VHhYZmVyQ291bnQgPSAwVTsgCisKKyAgICAgIC8qIFJlc3RvcmUgaHVhcnQtPmdTdGF0ZSB0byBSZWFkeSAqLworICAgICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgICAgICAvKiBBcyBubyBETUEgdG8gYmUgYWJvcnRlZCwgY2FsbCBkaXJlY3RseSB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKGh1YXJ0KTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUmVzZXQgVHggdHJhbnNmZXIgY291bnRlciAqLworICAgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IDBVOyAKKworICAgIC8qIFJlc3RvcmUgaHVhcnQtPmdTdGF0ZSB0byBSZWFkeSAqLworICAgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKGh1YXJ0KTsKKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgb25nb2luZyBSZWNlaXZlIHRyYW5zZmVyIChJbnRlcnJ1cHQgbW9kZSkuCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIFJ4IHRyYW5zZmVyIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLiAKKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIFVBUlQgSW50ZXJydXB0cyAoUngpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnRfSVQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqICAgICAgICAgICAtIEF0IGFib3J0IGNvbXBsZXRpb24sIGNhbGwgdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjaworICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gSW50ZXJydXB0IG1vZGUsIG1lYW5pbmcgdGhhdCBhYm9ydCBwcm9jZWR1cmUgY291bGQgYmUKKyAgKiAgICAgICAgIGNvbnNpZGVyZWQgYXMgY29tcGxldGVkIG9ubHkgd2hlbiB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIChub3Qgd2hlbiBleGl0aW5nIGZ1bmN0aW9uKS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9BYm9ydFJlY2VpdmVfSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogRGlzYWJsZSBSWE5FLCBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRSB8IFVTQVJUX0NSMV9QRUlFKSk7CisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgLyogRGlzYWJsZSB0aGUgVUFSVCBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICB7CisgICAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBBYm9ydCB0aGUgVUFSVCBETUEgUnggY2hhbm5lbCA6IHVzZSBub24gYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAoY2FsbGJhY2spICovCisgICAgaWYoaHVhcnQtPmhkbWFyeCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgVUFSVCBETUEgQWJvcnQgY2FsbGJhY2sgOiAKKyAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9VQVJUX0Fib3J0Q3BsdENhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgIGh1YXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gVUFSVF9ETUFSeE9ubHlBYm9ydENhbGxiYWNrOworCisgICAgICAvKiBBYm9ydCBETUEgUlggKi8KKyAgICAgIGlmKEhBTF9ETUFfQWJvcnRfSVQoaHVhcnQtPmhkbWFyeCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICAvKiBDYWxsIERpcmVjdGx5IGh1YXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKi8KKyAgICAgICAgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2soaHVhcnQtPmhkbWFyeCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBSZXNldCBSeCB0cmFuc2ZlciBjb3VudGVyICovCisgICAgICBodWFydC0+UnhYZmVyQ291bnQgPSAwVTsgCisKKyAgICAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgICAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfT1JFRiB8IFVBUlRfQ0xFQVJfTkVGIHwgVUFSVF9DTEVBUl9QRUYgfCBVQVJUX0NMRUFSX0ZFRik7CisKKyAgICAgIC8qIFJlc3RvcmUgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhodWFydCk7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJlc2V0IFJ4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgICBodWFydC0+UnhYZmVyQ291bnQgPSAwVTsgCisKKyAgICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9PUkVGIHwgVUFSVF9DTEVBUl9ORUYgfCBVQVJUX0NMRUFSX1BFRiB8IFVBUlRfQ0xFQVJfRkVGKTsKKworICAgIC8qIFJlc3RvcmUgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgICAgLyogQXMgbm8gRE1BIHRvIGJlIGFib3J0ZWQsIGNhbGwgZGlyZWN0bHkgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhodWFydCk7CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgSGFuZGxlIFVBUlQgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfVUFSVF9JUlFIYW5kbGVyKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIHVpbnQzMl90IGlzcmZsYWdzICAgPSBSRUFEX1JFRyhodWFydC0+SW5zdGFuY2UtPklTUik7CisgIHVpbnQzMl90IGNyMWl0cyAgICAgPSBSRUFEX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMSk7CisgIHVpbnQzMl90IGNyM2l0czsKKyAgdWludDMyX3QgZXJyb3JmbGFnczsKKworICAvKiBJZiBubyBlcnJvciBvY2N1cnMgKi8KKyAgZXJyb3JmbGFncyA9IChpc3JmbGFncyAmICh1aW50MzJfdCkoVVNBUlRfSVNSX1BFIHwgVVNBUlRfSVNSX0ZFIHwgVVNBUlRfSVNSX09SRSB8IFVTQVJUX0lTUl9ORSkpOworICBpZiAoZXJyb3JmbGFncyA9PSBSRVNFVCkKKyAgeworICAgIC8qIFVBUlQgaW4gbW9kZSBSZWNlaXZlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUlhORSkgIT0gUkVTRVQpICYmICgoY3IxaXRzICYgVVNBUlRfQ1IxX1JYTkVJRSkgIT0gUkVTRVQpKQorICAgIHsKKyAgICAgIFVBUlRfUmVjZWl2ZV9JVChodWFydCk7CisgICAgICByZXR1cm47CisgICAgfQorICB9ICAKKworICAvKiBJZiBzb21lIGVycm9ycyBvY2N1ciAqLworICBjcjNpdHMgPSBSRUFEX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMyk7CisgIGlmKCAgIChlcnJvcmZsYWdzICE9IFJFU0VUKQorICAgICAmJiAoICAgKChjcjNpdHMgJiBVU0FSVF9DUjNfRUlFKSAhPSBSRVNFVCkKKyAgICAgICAgIHx8ICgoY3IxaXRzICYgKFVTQVJUX0NSMV9SWE5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpICE9IFJFU0VUKSkgKQorICB7CisgICAgLyogVUFSVCBwYXJpdHkgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUEUpICE9IFJFU0VUKSAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9QRUlFKSAhPSBSRVNFVCkpCisgICAgeworICAgICAgX19IQUxfVUFSVF9DTEVBUl9JVChodWFydCwgVUFSVF9DTEVBUl9QRUYpOworCisgICAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX1BFOworICAgIH0KKworICAgIC8qIFVBUlQgZnJhbWUgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZigoKGlzcmZsYWdzICYgVVNBUlRfSVNSX0ZFKSAhPSBSRVNFVCkgJiYgKChjcjNpdHMgJiBVU0FSVF9DUjNfRUlFKSAhPSBSRVNFVCkpCisgICAgeworICAgICAgX19IQUxfVUFSVF9DTEVBUl9JVChodWFydCwgVUFSVF9DTEVBUl9GRUYpOworCisgICAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX0ZFOworICAgIH0KKworICAgIC8qIFVBUlQgbm9pc2UgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZigoKGlzcmZsYWdzICYgVVNBUlRfSVNSX05FKSAhPSBSRVNFVCkgJiYgKChjcjNpdHMgJiBVU0FSVF9DUjNfRUlFKSAhPSBSRVNFVCkpCisgICAgeworICAgICAgX19IQUxfVUFSVF9DTEVBUl9JVChodWFydCwgVUFSVF9DTEVBUl9ORUYpOworCisgICAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX05FOworICAgIH0KKyAgICAKKyAgICAvKiBVQVJUIE92ZXItUnVuIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9PUkUpICE9IFJFU0VUKSAmJgorICAgICAgICgoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWE5FSUUpICE9IFJFU0VUKSB8fCAoKGNyM2l0cyAmIFVTQVJUX0NSM19FSUUpICE9IFJFU0VUKSkpCisgICAgeworICAgICAgX19IQUxfVUFSVF9DTEVBUl9JVChodWFydCwgVUFSVF9DTEVBUl9PUkVGKTsKKworICAgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9PUkU7CisgICAgfQorCisgICAgLyogQ2FsbCBVQVJUIEVycm9yIENhbGwgYmFjayBmdW5jdGlvbiBpZiBuZWVkIGJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZihodWFydC0+RXJyb3JDb2RlICE9IEhBTF9VQVJUX0VSUk9SX05PTkUpCisgICAgeworICAgICAgLyogVUFSVCBpbiBtb2RlIFJlY2VpdmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICBpZigoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1JYTkUpICE9IFJFU0VUKSAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWE5FSUUpICE9IFJFU0VUKSkKKyAgICAgIHsKKyAgICAgICAgVUFSVF9SZWNlaXZlX0lUKGh1YXJ0KTsKKyAgICAgIH0KKworICAgICAgLyogSWYgT3ZlcnJ1biBlcnJvciBvY2N1cnMsIG9yIGlmIGFueSBlcnJvciBvY2N1cnMgaW4gRE1BIG1vZGUgcmVjZXB0aW9uLAorICAgICAgICAgY29uc2lkZXIgZXJyb3IgYXMgYmxvY2tpbmcgKi8KKyAgICAgIGlmICgoKGh1YXJ0LT5FcnJvckNvZGUgJiBIQUxfVUFSVF9FUlJPUl9PUkUpICE9IFJFU0VUKSB8fAorICAgICAgICAgIChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKSkKKyAgICAgIHsgIAorICAgICAgICAvKiBCbG9ja2luZyBlcnJvciA6IHRyYW5zZmVyIGlzIGFib3J0ZWQKKyAgICAgICAgICAgU2V0IHRoZSBVQVJUIHN0YXRlIHJlYWR5IHRvIGJlIGFibGUgdG8gc3RhcnQgYWdhaW4gdGhlIHByb2Nlc3MsCisgICAgICAgICAgIERpc2FibGUgUnggSW50ZXJydXB0cywgYW5kIGRpc2FibGUgUnggRE1BIHJlcXVlc3QsIGlmIG9uZ29pbmcgKi8KKyAgICAgICAgVUFSVF9FbmRSeFRyYW5zZmVyKGh1YXJ0KTsKKworICAgICAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgICAgICAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgICAgICAgIHsKKyAgICAgICAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgICAgICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBSeCBjaGFubmVsICovCisgICAgICAgICAgaWYoaHVhcnQtPmhkbWFyeCAhPSBOVUxMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNldCB0aGUgVUFSVCBETUEgQWJvcnQgY2FsbGJhY2sgOiAKKyAgICAgICAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgICAgICAgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBVQVJUX0RNQUFib3J0T25FcnJvcjsKKworICAgICAgICAgICAgLyogQWJvcnQgRE1BIFJYICovCisgICAgICAgICAgICBpZihIQUxfRE1BX0Fib3J0X0lUKGh1YXJ0LT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogQ2FsbCBEaXJlY3RseSBodWFydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayBmdW5jdGlvbiBpbiBjYXNlIG9mIGVycm9yICovCisgICAgICAgICAgICAgIGh1YXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrKGh1YXJ0LT5oZG1hcngpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgICAgICBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKGh1YXJ0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgICAgSEFMX1VBUlRfRXJyb3JDYWxsYmFjayhodWFydCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogTm9uIEJsb2NraW5nIGVycm9yIDogdHJhbnNmZXIgY291bGQgZ28gb24uIAorICAgICAgICAgICBFcnJvciBpcyBub3RpZmllZCB0byB1c2VyIHRocm91Z2ggdXNlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKGh1YXJ0KTsKKyAgICAgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybjsKKworICB9IC8qIEVuZCBpZiBzb21lIGVycm9yIG9jY3VycyAqLworCisgIC8qIFVBUlQgd2FrZXVwIGZyb20gU3RvcCBtb2RlIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZigoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1dVRikgIT0gUkVTRVQpICYmICgoY3IzaXRzICYgVVNBUlRfQ1IzX1dVRklFKSAhPSBSRVNFVCkpCisgIHsKKyAgICBfX0hBTF9VQVJUX0NMRUFSX0lUKGh1YXJ0LCBVQVJUX0NMRUFSX1dVRik7CisgICAgLyogU2V0IHRoZSBVQVJUIHN0YXRlIHJlYWR5IHRvIGJlIGFibGUgdG8gc3RhcnQgYWdhaW4gdGhlIHByb2Nlc3MgKi8KKyAgICBodWFydC0+Z1N0YXRlICA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisgICAgSEFMX1VBUlRFeF9XYWtldXBDYWxsYmFjayhodWFydCk7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogVUFSVCBpbiBtb2RlIFRyYW5zbWl0dGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfVFhFKSAhPSBSRVNFVCkgJiYgKChjcjFpdHMgJiBVU0FSVF9DUjFfVFhFSUUpICE9IFJFU0VUKSkKKyAgeworICAgIFVBUlRfVHJhbnNtaXRfSVQoaHVhcnQpOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIFVBUlQgaW4gbW9kZSBUcmFuc21pdHRlciAodHJhbnNtaXNzaW9uIGVuZCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZigoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1RDKSAhPSBSRVNFVCkgJiYgKChjcjFpdHMgJiBVU0FSVF9DUjFfVENJRSkgIT0gUkVTRVQpKQorICB7CisgICAgVUFSVF9FbmRUcmFuc21pdF9JVChodWFydCk7CisgICAgcmV0dXJuOworICB9CisKK30KKworLyoqCisgICogQGJyaWVmIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVUFSVF9UeENwbHRDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodWFydCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBUeCBIYWxmIFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VBUlRfVHhIYWxmQ3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1YXJ0KTsKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgdGhlIEhBTF9VQVJUX1R4SGFsZkNwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VBUlRfUnhDcGx0Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVUFSVF9SeENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgUnggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9VQVJUX1J4SGFsZkNwbHRDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodWFydCk7CisKKyAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgIHRoZSBIQUxfVUFSVF9SeEhhbGZDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgVUFSVCBlcnJvciBjYWxsYmFjay4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1YXJ0KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1VBUlRfRXJyb3JDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgVUFSVCBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VBUlRfQWJvcnRDcGx0Q2FsbGJhY2sgKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1YXJ0KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1VBUlRfQWJvcnRDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFVBUlQgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9VQVJUX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1YXJ0KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1VBUlRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgVUFSVCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVUFSVF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1YXJ0KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1VBUlRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBVQVJUIGNvbnRyb2wgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbnRyb2wgdGhlIFVBUlQuCisgICAgICgrKSBIQUxfTXVsdGlQcm9jZXNzb3JfRW5hYmxlTXV0ZU1vZGUoKSBBUEkgZW5hYmxlcyBtdXRlIG1vZGUKKyAgICAgKCspIEhBTF9NdWx0aVByb2Nlc3Nvcl9EaXNhYmxlTXV0ZU1vZGUoKSBBUEkgZGlzYWJsZXMgbXV0ZSBtb2RlCisgICAgICgrKSBIQUxfTXVsdGlQcm9jZXNzb3JfRW50ZXJNdXRlTW9kZSgpIEFQSSBlbnRlcnMgbXV0ZSBtb2RlCisgICAgICgrKSBIQUxfSGFsZkR1cGxleF9FbmFibGVUcmFuc21pdHRlcigpIEFQSSBkaXNhYmxlcyByZWNlaXZlciBhbmQgZW5hYmxlcyB0cmFuc21pdHRlcgorICAgICAoKykgSEFMX0hhbGZEdXBsZXhfRW5hYmxlUmVjZWl2ZXIoKSBBUEkgZGlzYWJsZXMgdHJhbnNtaXR0ZXIgYW5kIGVuYWJsZXMgcmVjZWl2ZXIKKyAgICAgKCspIEhBTF9MSU5fU2VuZEJyZWFrKCkgQVBJIHRyYW5zbWl0cyB0aGUgYnJlYWsgY2hhcmFjdGVycworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIEVuYWJsZSBVQVJUIGluIG11dGUgbW9kZSAoZG9lcyBub3QgbWVhbiBVQVJUIGVudGVycyBtdXRlIG1vZGU7CisgICogdG8gZW50ZXIgbXV0ZSBtb2RlLCBIQUxfTXVsdGlQcm9jZXNzb3JfRW50ZXJNdXRlTW9kZSgpIEFQSSBtdXN0IGJlIGNhbGxlZCkuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX011bHRpUHJvY2Vzc29yX0VuYWJsZU11dGVNb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHVhcnQpOworCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZOworCisgIC8qIEVuYWJsZSBVU0FSVCBtdXRlIG1vZGUgYnkgc2V0dGluZyB0aGUgTU1FIGJpdCBpbiB0aGUgQ1IxIHJlZ2lzdGVyICovCisgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9NTUUpOworCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICByZXR1cm4gKFVBUlRfQ2hlY2tJZGxlU3RhdGUoaHVhcnQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFVBUlQgbXV0ZSBtb2RlIChkb2VzIG5vdCBtZWFuIHRoZSBVQVJUIGFjdHVhbGx5IGV4aXRzIG11dGUgbW9kZQorICAqICAgICAgICAgYXMgaXQgbWF5IG5vdCBoYXZlIGJlZW4gaW4gbXV0ZSBtb2RlIGF0IHRoaXMgdmVyeSBtb21lbnQpLgorICAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTXVsdGlQcm9jZXNzb3JfRGlzYWJsZU11dGVNb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHVhcnQpOworCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZOworCisgICAvKiBEaXNhYmxlIFVTQVJUIG11dGUgbW9kZSBieSBjbGVhcmluZyB0aGUgTU1FIGJpdCBpbiB0aGUgQ1IxIHJlZ2lzdGVyICovCisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX01NRSk7CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgIHJldHVybiAoVUFSVF9DaGVja0lkbGVTdGF0ZShodWFydCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgRW50ZXIgVUFSVCBtdXRlIG1vZGUgKG1lYW5zIFVBUlQgYWN0dWFsbHkgZW50ZXJzIG11dGUgbW9kZSkuCisgICogQG5vdGUgIFRvIGV4aXQgZnJvbSBtdXRlIG1vZGUsIEhBTF9NdWx0aVByb2Nlc3Nvcl9EaXNhYmxlTXV0ZU1vZGUoKSBBUEkgbXVzdCBiZSBjYWxsZWQuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfTXVsdGlQcm9jZXNzb3JfRW50ZXJNdXRlTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICBfX0hBTF9VQVJUX1NFTkRfUkVRKGh1YXJ0LCBVQVJUX01VVEVfTU9ERV9SRVFVRVNUKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFVBUlQgdHJhbnNtaXR0ZXIgYW5kIGRpc2FibGUgdGhlIFVBUlQgcmVjZWl2ZXIuCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IYWxmRHVwbGV4X0VuYWJsZVRyYW5zbWl0dGVyKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHVhcnQpOworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAvKiBDbGVhciBURSBhbmQgUkUgYml0cyAqLworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfVEUgfCBVU0FSVF9DUjFfUkUpKTsKKyAgLyogRW5hYmxlIHRoZSBVU0FSVCdzIHRyYW5zbWl0IGludGVyZmFjZSBieSBzZXR0aW5nIHRoZSBURSBiaXQgaW4gdGhlIFVTQVJUIENSMSByZWdpc3RlciAqLworICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVEUpOworCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFVBUlQgcmVjZWl2ZXIgYW5kIGRpc2FibGUgdGhlIFVBUlQgdHJhbnNtaXR0ZXIuCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMuCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSGFsZkR1cGxleF9FbmFibGVSZWNlaXZlcihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1YXJ0KTsKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogQ2xlYXIgVEUgYW5kIFJFIGJpdHMgKi8KKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1RFIHwgVVNBUlRfQ1IxX1JFKSk7CisgIC8qIEVuYWJsZSB0aGUgVVNBUlQncyByZWNlaXZlIGludGVyZmFjZSBieSBzZXR0aW5nIHRoZSBSRSBiaXQgaW4gdGhlIFVTQVJUIENSMSByZWdpc3RlciAqLworICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUkUpOworCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBicmVhayBjaGFyYWN0ZXJzLgorICAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTElOX1NlbmRCcmVhayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9MSU5fSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogU2VuZCBicmVhayBjaGFyYWN0ZXJzICovCisgIGh1YXJ0LT5JbnN0YW5jZS0+UlFSIHw9IFVBUlRfU0VOREJSRUFLX1JFUVVFU1Q7CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucworICogIEBicmllZiAgIFVBUlQgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gOgorICAgICAgKCspIFJldHVybiB0aGUgVUFSVCBoYW5kbGUgc3RhdGUuCisgICAgICAoKykgUmV0dXJuIHRoZSBVQVJUIGhhbmRsZSBlcnJvciBjb2RlCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBVQVJUIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIGh1YXJ0IFBvaW50ZXIgdG8gYSBVQVJUX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVBUlQuCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9VQVJUX1N0YXRlVHlwZURlZiBIQUxfVUFSVF9HZXRTdGF0ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICB1aW50MzJfdCB0ZW1wMT0gMHgwMFUsIHRlbXAyID0gMHgwMFU7CisgIHRlbXAxID0gaHVhcnQtPmdTdGF0ZTsKKyAgdGVtcDIgPSBodWFydC0+UnhTdGF0ZTsKKworICByZXR1cm4gKEhBTF9VQVJUX1N0YXRlVHlwZURlZikodGVtcDEgfCB0ZW1wMik7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBVQVJUIGhhbmRsZSBlcnJvciBjb2RlLgorICAqIEBwYXJhbSAgaHVhcnQgUG9pbnRlciB0byBhIFVBUlRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVUFSVC4KKyAgKiBAcmV0dmFsIFVBUlQgRXJyb3IgQ29kZQorICAqLwordWludDMyX3QgSEFMX1VBUlRfR2V0RXJyb3IoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgcmV0dXJuIGh1YXJ0LT5FcnJvckNvZGU7Cit9CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfUHJpdmF0ZV9GdW5jdGlvbnMgVUFSVCBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBDb25maWd1cmUgdGhlIFVBUlQgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBVQVJUX1NldENvbmZpZyhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICB1aW50MzJfdCB0bXByZWcgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDBVOworICBVQVJUX0Nsb2NrU291cmNlVHlwZURlZiBjbG9ja3NvdXJjZSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOworICB1aW50MTZfdCBicnJ0ZW1wICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMFU7CisgIHVpbnQxNl90IHVzYXJ0ZGl2ICAgICAgICAgICAgICAgICAgID0gMHgwMDAwVTsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgcmV0ICAgICAgICAgICAgICAgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfQkFVRFJBVEUoaHVhcnQtPkluaXQuQmF1ZFJhdGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfV09SRF9MRU5HVEgoaHVhcnQtPkluaXQuV29yZExlbmd0aCkpOworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9TVE9QQklUUyhodWFydC0+SW5pdC5TdG9wQml0cykpOworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9QQVJJVFkoaHVhcnQtPkluaXQuUGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19VQVJUX01PREUoaHVhcnQtPkluaXQuTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9IQVJEV0FSRV9GTE9XX0NPTlRST0woaHVhcnQtPkluaXQuSHdGbG93Q3RsKSk7CisgIGFzc2VydF9wYXJhbShJU19VQVJUX09ORV9CSVRfU0FNUExFKGh1YXJ0LT5Jbml0Lk9uZUJpdFNhbXBsaW5nKSk7CisgIGFzc2VydF9wYXJhbShJU19VQVJUX09WRVJTQU1QTElORyhodWFydC0+SW5pdC5PdmVyU2FtcGxpbmcpKTsKKworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDbGVhciBNLCBQQ0UsIFBTLCBURSwgUkUgYW5kIE9WRVI4IGJpdHMgYW5kIGNvbmZpZ3VyZQorICAgKiAgdGhlIFVBUlQgV29yZCBMZW5ndGgsIFBhcml0eSwgTW9kZSBhbmQgb3ZlcnNhbXBsaW5nOgorICAgKiAgc2V0IHRoZSBNIGJpdHMgYWNjb3JkaW5nIHRvIGh1YXJ0LT5Jbml0LldvcmRMZW5ndGggdmFsdWUKKyAgICogIHNldCBQQ0UgYW5kIFBTIGJpdHMgYWNjb3JkaW5nIHRvIGh1YXJ0LT5Jbml0LlBhcml0eSB2YWx1ZQorICAgKiAgc2V0IFRFIGFuZCBSRSBiaXRzIGFjY29yZGluZyB0byBodWFydC0+SW5pdC5Nb2RlIHZhbHVlCisgICAqICBzZXQgT1ZFUjggYml0IGFjY29yZGluZyB0byBodWFydC0+SW5pdC5PdmVyU2FtcGxpbmcgdmFsdWUgKi8KKyAgdG1wcmVnID0gKHVpbnQzMl90KWh1YXJ0LT5Jbml0LldvcmRMZW5ndGggfCBodWFydC0+SW5pdC5QYXJpdHkgfCBodWFydC0+SW5pdC5Nb2RlIHwgaHVhcnQtPkluaXQuT3ZlclNhbXBsaW5nIDsKKyAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMSwgVUFSVF9DUjFfRklFTERTLCB0bXByZWcpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDb25maWd1cmUgdGhlIFVBUlQgU3RvcCBCaXRzOiBTZXQgU1RPUFsxMzoxMl0gYml0cyBhY2NvcmRpbmcKKyAgICogdG8gaHVhcnQtPkluaXQuU3RvcEJpdHMgdmFsdWUgKi8KKyAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX1NUT1AsIGh1YXJ0LT5Jbml0LlN0b3BCaXRzKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ29uZmlndXJlCisgICAqIC0gVUFSVCBIYXJkV2FyZSBGbG93IENvbnRyb2w6IHNldCBDVFNFIGFuZCBSVFNFIGJpdHMgYWNjb3JkaW5nCisgICAqICAgdG8gaHVhcnQtPkluaXQuSHdGbG93Q3RsIHZhbHVlCisgICAqIC0gb25lLWJpdCBzYW1wbGluZyBtZXRob2QgdmVyc3VzIHRocmVlIHNhbXBsZXMnIG1ham9yaXR5IHJ1bGUgYWNjb3JkaW5nCisgICAqICAgdG8gaHVhcnQtPkluaXQuT25lQml0U2FtcGxpbmcgKi8KKyAgdG1wcmVnID0gKHVpbnQzMl90KWh1YXJ0LT5Jbml0Lkh3Rmxvd0N0bCB8IGh1YXJ0LT5Jbml0Lk9uZUJpdFNhbXBsaW5nIDsKKyAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMywgKFVTQVJUX0NSM19SVFNFIHwgVVNBUlRfQ1IzX0NUU0UgfCBVU0FSVF9DUjNfT05FQklUKSwgdG1wcmVnKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIEJSUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgVUFSVF9HRVRDTE9DS1NPVVJDRShodWFydCwgY2xvY2tzb3VyY2UpOworCisgIC8qIENoZWNrIFVBUlQgT3ZlciBTYW1wbGluZyB0byBzZXQgQmF1ZCBSYXRlIFJlZ2lzdGVyICovCisgIGlmIChodWFydC0+SW5pdC5PdmVyU2FtcGxpbmcgPT0gVUFSVF9PVkVSU0FNUExJTkdfOCkKKyAgeworICAgIHN3aXRjaCAoY2xvY2tzb3VyY2UpCisgICAgeworICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOgorICAgICAgICB1c2FydGRpdiA9ICh1aW50MTZfdCkoVUFSVF9ESVZfU0FNUExJTkc4KEhBTF9SQ0NfR2V0UENMSzFGcmVxKCksIGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX1BDTEsyOgorICAgICAgICB1c2FydGRpdiA9ICh1aW50MTZfdCkoVUFSVF9ESVZfU0FNUExJTkc4KEhBTF9SQ0NfR2V0UENMSzJGcmVxKCksIGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX0hTSToKKyAgICAgICAgdXNhcnRkaXYgPSAodWludDE2X3QpKFVBUlRfRElWX1NBTVBMSU5HOChIU0lfVkFMVUUsIGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzoKKyAgICAgICAgdXNhcnRkaXYgPSAodWludDE2X3QpKFVBUlRfRElWX1NBTVBMSU5HOChIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpLCBodWFydC0+SW5pdC5CYXVkUmF0ZSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9MU0U6CisgICAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQxNl90KShVQVJUX0RJVl9TQU1QTElORzgoTFNFX1ZBTFVFLCBodWFydC0+SW5pdC5CYXVkUmF0ZSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ6CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJycnRlbXAgPSB1c2FydGRpdiAmIDB4RkZGMFU7CisgICAgYnJydGVtcCB8PSAodWludDE2X3QpKCh1c2FydGRpdiAmICh1aW50MTZfdCkweDAwMEZVKSA+PiAxVSk7CisgICAgaHVhcnQtPkluc3RhbmNlLT5CUlIgPSBicnJ0ZW1wOworICB9CisgIGVsc2UKKyAgeworICAgIHN3aXRjaCAoY2xvY2tzb3VyY2UpCisgICAgeworICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOgorICAgICAgICBodWFydC0+SW5zdGFuY2UtPkJSUiA9ICh1aW50MTZfdCkoVUFSVF9ESVZfU0FNUExJTkcxNihIQUxfUkNDX0dldFBDTEsxRnJlcSgpLCBodWFydC0+SW5pdC5CYXVkUmF0ZSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMjoKKyAgICAgICAgaHVhcnQtPkluc3RhbmNlLT5CUlIgPSAodWludDE2X3QpKFVBUlRfRElWX1NBTVBMSU5HMTYoSEFMX1JDQ19HZXRQQ0xLMkZyZXEoKSwgaHVhcnQtPkluaXQuQmF1ZFJhdGUpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOgorICAgICAgICBodWFydC0+SW5zdGFuY2UtPkJSUiA9ICh1aW50MTZfdCkoVUFSVF9ESVZfU0FNUExJTkcxNihIU0lfVkFMVUUsIGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzoKKyAgICAgICAgaHVhcnQtPkluc3RhbmNlLT5CUlIgPSAodWludDE2X3QpKFVBUlRfRElWX1NBTVBMSU5HMTYoSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKSwgaHVhcnQtPkluaXQuQmF1ZFJhdGUpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOgorICAgICAgICBodWFydC0+SW5zdGFuY2UtPkJSUiA9ICh1aW50MTZfdCkoVUFSVF9ESVZfU0FNUExJTkcxNihMU0VfVkFMVUUsIGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDoKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJldDsKKworfQorCisvKioKKyAgKiBAYnJpZWYgQ29uZmlndXJlIHRoZSBVQVJUIHBlcmlwaGVyYWwgYWR2YW5jZWQgZmVhdHVyZXMuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBVQVJUX0FkdkZlYXR1cmVDb25maWcoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogQ2hlY2sgd2hldGhlciB0aGUgc2V0IG9mIGFkdmFuY2VkIGZlYXR1cmVzIHRvIGNvbmZpZ3VyZSBpcyBwcm9wZXJseSBzZXQgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfQURWRkVBVFVSRV9JTklUKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQpKTsKKworICAvKiBpZiByZXF1aXJlZCwgY29uZmlndXJlIFRYIHBpbiBhY3RpdmUgbGV2ZWwgaW52ZXJzaW9uICovCisgIGlmKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsIFVBUlRfQURWRkVBVFVSRV9UWElOVkVSVF9JTklUKSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19VQVJUX0FEVkZFQVRVUkVfVFhJTlYoaHVhcnQtPkFkdmFuY2VkSW5pdC5UeFBpbkxldmVsSW52ZXJ0KSk7CisgICAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX1RYSU5WLCBodWFydC0+QWR2YW5jZWRJbml0LlR4UGluTGV2ZWxJbnZlcnQpOworICB9CisKKyAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBSWCBwaW4gYWN0aXZlIGxldmVsIGludmVyc2lvbiAqLworICBpZihIQUxfSVNfQklUX1NFVChodWFydC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0LCBVQVJUX0FEVkZFQVRVUkVfUlhJTlZFUlRfSU5JVCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9BRFZGRUFUVVJFX1JYSU5WKGh1YXJ0LT5BZHZhbmNlZEluaXQuUnhQaW5MZXZlbEludmVydCkpOworICAgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9SWElOViwgaHVhcnQtPkFkdmFuY2VkSW5pdC5SeFBpbkxldmVsSW52ZXJ0KTsKKyAgfQorCisgIC8qIGlmIHJlcXVpcmVkLCBjb25maWd1cmUgZGF0YSBpbnZlcnNpb24gKi8KKyAgaWYoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCwgVUFSVF9BRFZGRUFUVVJFX0RBVEFJTlZFUlRfSU5JVCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9BRFZGRUFUVVJFX0RBVEFJTlYoaHVhcnQtPkFkdmFuY2VkSW5pdC5EYXRhSW52ZXJ0KSk7CisgICAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0RBVEFJTlYsIGh1YXJ0LT5BZHZhbmNlZEluaXQuRGF0YUludmVydCk7CisgIH0KKworICAvKiBpZiByZXF1aXJlZCwgY29uZmlndXJlIFJYL1RYIHBpbnMgc3dhcCAqLworICBpZihIQUxfSVNfQklUX1NFVChodWFydC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0LCBVQVJUX0FEVkZFQVRVUkVfU1dBUF9JTklUKSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19VQVJUX0FEVkZFQVRVUkVfU1dBUChodWFydC0+QWR2YW5jZWRJbml0LlN3YXApKTsKKyAgICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfU1dBUCwgaHVhcnQtPkFkdmFuY2VkSW5pdC5Td2FwKTsKKyAgfQorCisgIC8qIGlmIHJlcXVpcmVkLCBjb25maWd1cmUgUlggb3ZlcnJ1biBkZXRlY3Rpb24gZGlzYWJsaW5nICovCisgIGlmKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsIFVBUlRfQURWRkVBVFVSRV9SWE9WRVJSVU5ESVNBQkxFX0lOSVQpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfT1ZFUlJVTihodWFydC0+QWR2YW5jZWRJbml0Lk92ZXJydW5EaXNhYmxlKSk7CisgICAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX09WUkRJUywgaHVhcnQtPkFkdmFuY2VkSW5pdC5PdmVycnVuRGlzYWJsZSk7CisgIH0KKworICAvKiBpZiByZXF1aXJlZCwgY29uZmlndXJlIERNQSBkaXNhYmxpbmcgb24gcmVjZXB0aW9uIGVycm9yICovCisgIGlmKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsIFVBUlRfQURWRkVBVFVSRV9ETUFESVNBQkxFT05FUlJPUl9JTklUKSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19VQVJUX0FEVkZFQVRVUkVfRE1BT05SWEVSUk9SKGh1YXJ0LT5BZHZhbmNlZEluaXQuRE1BRGlzYWJsZW9uUnhFcnJvcikpOworICAgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ERFJFLCBodWFydC0+QWR2YW5jZWRJbml0LkRNQURpc2FibGVvblJ4RXJyb3IpOworICB9CisKKyAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBhdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24gc2NoZW1lICovCisgIGlmKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsIFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfSU5JVCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQVVUT0JBVURSQVRFX0RFVEVDVElPTl9JTlNUQU5DRShodWFydC0+SW5zdGFuY2UpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURShodWFydC0+QWR2YW5jZWRJbml0LkF1dG9CYXVkUmF0ZUVuYWJsZSkpOworICAgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9BQlJFTiwgaHVhcnQtPkFkdmFuY2VkSW5pdC5BdXRvQmF1ZFJhdGVFbmFibGUpOworICAgIC8qIHNldCBhdXRvIEJhdWRyYXRlIGRldGVjdGlvbiBwYXJhbWV0ZXJzIGlmIGRldGVjdGlvbiBpcyBlbmFibGVkICovCisgICAgaWYoaHVhcnQtPkFkdmFuY2VkSW5pdC5BdXRvQmF1ZFJhdGVFbmFibGUgPT0gVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9FTkFCTEUpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVNT0RFKGh1YXJ0LT5BZHZhbmNlZEluaXQuQXV0b0JhdWRSYXRlTW9kZSkpOworICAgICAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0FCUk1PREUsIGh1YXJ0LT5BZHZhbmNlZEluaXQuQXV0b0JhdWRSYXRlTW9kZSk7CisgICAgfQorICB9CisKKyAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBNU0IgZmlyc3Qgb24gY29tbXVuaWNhdGlvbiBsaW5lICovCisgIGlmKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsIFVBUlRfQURWRkVBVFVSRV9NU0JGSVJTVF9JTklUKSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19VQVJUX0FEVkZFQVRVUkVfTVNCRklSU1QoaHVhcnQtPkFkdmFuY2VkSW5pdC5NU0JGaXJzdCkpOworICAgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9NU0JGSVJTVCwgaHVhcnQtPkFkdmFuY2VkSW5pdC5NU0JGaXJzdCk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIENoZWNrIHRoZSBVQVJUIElkbGUgU3RhdGUuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgVUFSVF9DaGVja0lkbGVTdGF0ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKworICAvKiBJbml0aWFsaXplIHRoZSBVQVJUIEVycm9yQ29kZSAqLworICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfTk9ORTsKKworICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ21lbnQqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIENoZWNrIGlmIHRoZSBUcmFuc21pdHRlciBpcyBlbmFibGVkICovCisgIGlmKChodWFydC0+SW5zdGFuY2UtPkNSMSAmIFVTQVJUX0NSMV9URSkgPT0gVVNBUlRfQ1IxX1RFKQorICB7CisgICAgLyogV2FpdCB1bnRpbCBURUFDSyBmbGFnIGlzIHNldCAqLworICAgIGlmKFVBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodWFydCwgVVNBUlRfSVNSX1RFQUNLLCBSRVNFVCwgdGlja3N0YXJ0LCBIQUxfVUFSVF9USU1FT1VUX1ZBTFVFKSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogVGltZW91dCBPY2N1cmVkICovCisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICB9CisgIC8qIENoZWNrIGlmIHRoZSBSZWNlaXZlciBpcyBlbmFibGVkICovCisgIGlmKChodWFydC0+SW5zdGFuY2UtPkNSMSAmIFVTQVJUX0NSMV9SRSkgPT0gVVNBUlRfQ1IxX1JFKQorICB7CisgICAgLyogV2FpdCB1bnRpbCBSRUFDSyBmbGFnIGlzIHNldCAqLworICAgIGlmKFVBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodWFydCwgVVNBUlRfSVNSX1JFQUNLLCBSRVNFVCwgdGlja3N0YXJ0LCBIQUxfVUFSVF9USU1FT1VUX1ZBTFVFKSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogVGltZW91dCBPY2N1cmVkICovCisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICB9CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgVUFSVCBTdGF0ZSAqLworICBodWFydC0+Z1N0YXRlICA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBVQVJUIENvbW11bmljYXRpb24gVGltZW91dC4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEBwYXJhbSAgRmxhZyBTcGVjaWZpZXMgdGhlIFVBUlQgZmxhZyB0byBjaGVjaworICAqIEBwYXJhbSAgU3RhdHVzIEZsYWcgc3RhdHVzIChTRVQgb3IgUkVTRVQpCisgICogQHBhcmFtICBUaWNrc3RhcnQgVGljayBzdGFydCB2YWx1ZQorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBVQVJUX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDMyX3QgRmxhZywgRmxhZ1N0YXR1cyBTdGF0dXMsIHVpbnQzMl90IFRpY2tzdGFydCwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgLyogV2FpdCB1bnRpbCBmbGFnIGlzIHNldCAqLworICB3aGlsZSgoX19IQUxfVUFSVF9HRVRfRkxBRyhodWFydCwgRmxhZykgPyBTRVQgOiBSRVNFVCkgPT0gU3RhdHVzKQorICB7CisgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCisgICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmKChUaW1lb3V0ID09IDBVKSB8fCAoKEhBTF9HZXRUaWNrKCktVGlja3N0YXJ0KSA+IFRpbWVvdXQpKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIFRYRSwgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzIGZvciB0aGUgaW50ZXJydXB0IHByb2Nlc3MgKi8KKyAgICAgICAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRSB8IFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1RYRUlFKSk7CisgICAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAgICAgaHVhcnQtPmdTdGF0ZSAgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKyAgICAgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhodWFydCk7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIEVuZCBvbmdvaW5nIFR4IHRyYW5zZmVyIG9uIFVBUlQgcGVyaXBoZXJhbCAoZm9sbG93aW5nIGVycm9yIGRldGVjdGlvbiBvciBUcmFuc21pdCBjb21wbGV0aW9uKS4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVUFSVF9FbmRUeFRyYW5zZmVyKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIERpc2FibGUgVFhFSUUgYW5kIFRDSUUgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfVFhFSUUgfCBVU0FSVF9DUjFfVENJRSkpOworCisgIC8qIEF0IGVuZCBvZiBUeCBwcm9jZXNzLCByZXN0b3JlIGh1YXJ0LT5nU3RhdGUgdG8gUmVhZHkgKi8KKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworfQorCisKKy8qKgorICAqIEBicmllZiAgRW5kIG9uZ29pbmcgUnggdHJhbnNmZXIgb24gVUFSVCBwZXJpcGhlcmFsIChmb2xsb3dpbmcgZXJyb3IgZGV0ZWN0aW9uIG9yIFJlY2VwdGlvbiBjb21wbGV0aW9uKS4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVUFSVF9FbmRSeFRyYW5zZmVyKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIERpc2FibGUgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpOworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgIC8qIEF0IGVuZCBvZiBSeCBwcm9jZXNzLCByZXN0b3JlIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7Cit9CisKKworLyoqCisgICogQGJyaWVmIERNQSBVQVJUIHRyYW5zbWl0IHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVBUlRfRE1BVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBVQVJUX0hhbmRsZVR5cGVEZWYqIGh1YXJ0ID0gKFVBUlRfSGFuZGxlVHlwZURlZiopKGhkbWEtPlBhcmVudCk7CisgIAorICAvKiBETUEgTm9ybWFsIG1vZGUgKi8KKyAgaWYgKCBIQUxfSVNfQklUX0NMUihoZG1hLT5JbnN0YW5jZS0+Q0NSLCBETUFfQ0NSX0NJUkMpICkKKyAgeworICAgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IDBVOworCisgICAgLyogRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0cmFuc21pdCByZXF1ZXN0IGJ5IHJlc2V0dGluZyB0aGUgRE1BVCBiaXQKKyAgICAgICBpbiB0aGUgVUFSVCBDUjMgcmVnaXN0ZXIgKi8KKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEVuYWJsZSB0aGUgVUFSVCBUcmFuc21pdCBDb21wbGV0ZSBJbnRlcnJ1cHQgKi8KKyAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVENJRSk7CisgIH0KKyAgLyogRE1BIENpcmN1bGFyIG1vZGUgKi8KKyAgZWxzZQorICB7CisgICAgSEFMX1VBUlRfVHhDcGx0Q2FsbGJhY2soaHVhcnQpOworICB9CisKK30KKworLyoqCisgICogQGJyaWVmIERNQSBVQVJUIHRyYW5zbWl0IHByb2Nlc3MgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVUFSVF9ETUFUeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBVQVJUX0hhbmRsZVR5cGVEZWYqIGh1YXJ0ID0gKFVBUlRfSGFuZGxlVHlwZURlZiopKGhkbWEtPlBhcmVudCk7CisKKyAgSEFMX1VBUlRfVHhIYWxmQ3BsdENhbGxiYWNrKGh1YXJ0KTsKK30KKworLyoqCisgICogQGJyaWVmIERNQSBVQVJUIHJlY2VpdmUgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVUFSVF9ETUFSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVUFSVF9IYW5kbGVUeXBlRGVmKiBodWFydCA9IChVQVJUX0hhbmRsZVR5cGVEZWYqKShoZG1hLT5QYXJlbnQpOworCisgIC8qIERNQSBOb3JtYWwgbW9kZSAqLworICBpZiAoIEhBTF9JU19CSVRfQ0xSKGhkbWEtPkluc3RhbmNlLT5DQ1IsIERNQV9DQ1JfQ0lSQykgKQorICB7CisgICAgaHVhcnQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgICAvKiBEaXNhYmxlIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRoZSByZWNlaXZlciByZXF1ZXN0IGJ5IHJlc2V0dGluZyB0aGUgRE1BUiBiaXQKKyAgICAgICBpbiB0aGUgVUFSVCBDUjMgcmVnaXN0ZXIgKi8KKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEF0IGVuZCBvZiBSeCBwcm9jZXNzLCByZXN0b3JlIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKyAgfQorCisgIEhBTF9VQVJUX1J4Q3BsdENhbGxiYWNrKGh1YXJ0KTsKK30KKworLyoqCisgICogQGJyaWVmIERNQSBVQVJUIHJlY2VpdmUgcHJvY2VzcyBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJUX0RNQVJ4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFVBUlRfSGFuZGxlVHlwZURlZiogaHVhcnQgPSAoVUFSVF9IYW5kbGVUeXBlRGVmKikoaGRtYS0+UGFyZW50KTsKKworICBIQUxfVUFSVF9SeEhhbGZDcGx0Q2FsbGJhY2soaHVhcnQpOworfQorCisvKioKKyAgKiBAYnJpZWYgRE1BIFVBUlQgY29tbXVuaWNhdGlvbiBlcnJvciBjYWxsYmFjay4KKyAgKiBAcGFyYW0gaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVUFSVF9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVUFSVF9IYW5kbGVUeXBlRGVmKiBodWFydCA9IChVQVJUX0hhbmRsZVR5cGVEZWYqKShoZG1hLT5QYXJlbnQpOworCisgIC8qIFN0b3AgVUFSVCBETUEgVHggcmVxdWVzdCBpZiBvbmdvaW5nICovCisgIGlmICggIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfVFgpCisgICAgICAmJihIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKSApCisgIHsKKyAgICBodWFydC0+VHhYZmVyQ291bnQgPSAwVTsKKyAgICBVQVJUX0VuZFR4VHJhbnNmZXIoaHVhcnQpOworICB9CisKKyAgLyogU3RvcCBVQVJUIERNQSBSeCByZXF1ZXN0IGlmIG9uZ29pbmcgKi8KKyAgaWYgKCAgKGh1YXJ0LT5SeFN0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfUlgpCisgICAgICAmJihIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKSApCisgIHsKKyAgICBodWFydC0+UnhYZmVyQ291bnQgPSAwVTsKKyAgICBVQVJUX0VuZFJ4VHJhbnNmZXIoaHVhcnQpOworICB9CisKKyAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9ETUE7CisgIEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2soaHVhcnQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBVQVJUIGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IEhBTCBzZXJ2aWNlcyBvbiBFcnJvcgorICAqICAgICAgICAgKFRvIGJlIGNhbGxlZCBhdCBlbmQgb2YgRE1BIEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJyZW5jZSkuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJUX0RNQUFib3J0T25FcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVUFSVF9IYW5kbGVUeXBlRGVmKiBodWFydCA9IChVQVJUX0hhbmRsZVR5cGVEZWYqKShoZG1hLT5QYXJlbnQpOworICBodWFydC0+UnhYZmVyQ291bnQgPSAwVTsKKyAgaHVhcnQtPlR4WGZlckNvdW50ID0gMFU7CisKKyAgSEFMX1VBUlRfRXJyb3JDYWxsYmFjayhodWFydCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFVBUlQgVHggY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgdXNlcgorICAqICAgICAgICAgKFRvIGJlIGNhbGxlZCBhdCBlbmQgb2YgRE1BIFR4IEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgdXNlciBhYm9ydCByZXF1ZXN0KS4KKyAgKiBAbm90ZSAgIFdoZW4gdGhpcyBjYWxsYmFjayBpcyBleGVjdXRlZCwgVXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsIGJhY2sgaXMgY2FsbGVkIG9ubHkgaWYgbm8KKyAgKiAgICAgICAgIEFib3J0IHN0aWxsIG9uZ29pbmcgZm9yIFJ4IERNQSBIYW5kbGUuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJUX0RNQVR4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVUFSVF9IYW5kbGVUeXBlRGVmKiBodWFydCA9IChVQVJUX0hhbmRsZVR5cGVEZWYqICkoaGRtYS0+UGFyZW50KTsKKyAgCisgIGh1YXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAvKiBDaGVjayBpZiBhbiBBYm9ydCBwcm9jZXNzIGlzIHN0aWxsIG9uZ29pbmcgKi8KKyAgaWYoaHVhcnQtPmhkbWFyeCAhPSBOVUxMKQorICB7CisgICAgaWYoaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIAorICAvKiBObyBBYm9ydCBwcm9jZXNzIHN0aWxsIG9uZ29pbmcgOiBBbGwgRE1BIGNoYW5uZWxzIGFyZSBhYm9ydGVkLCBjYWxsIHVzZXIgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaHVhcnQtPlR4WGZlckNvdW50ID0gMFU7CisgIGh1YXJ0LT5SeFhmZXJDb3VudCA9IDBVOworCisgIC8qIFJlc2V0IGVycm9yQ29kZSAqLworICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfTk9ORTsKKworICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfT1JFRiB8IFVBUlRfQ0xFQVJfTkVGIHwgVUFSVF9DTEVBUl9QRUYgfCBVQVJUX0NMRUFSX0ZFRik7CisKKyAgLyogUmVzdG9yZSBodWFydC0+Z1N0YXRlIGFuZCBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICBodWFydC0+Z1N0YXRlICA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgIC8qIENhbGwgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjayhodWFydCk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBETUEgVUFSVCBSeCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSB1c2VyCisgICogICAgICAgICAoVG8gYmUgY2FsbGVkIGF0IGVuZCBvZiBETUEgUnggQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyB1c2VyIGFib3J0IHJlcXVlc3QpLgorICAqIEBub3RlICAgV2hlbiB0aGlzIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLCBVc2VyIEFib3J0IGNvbXBsZXRlIGNhbGwgYmFjayBpcyBjYWxsZWQgb25seSBpZiBubworICAqICAgICAgICAgQWJvcnQgc3RpbGwgb25nb2luZyBmb3IgVHggRE1BIEhhbmRsZS4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVBUlRfRE1BUnhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBVQVJUX0hhbmRsZVR5cGVEZWYqIGh1YXJ0ID0gKFVBUlRfSGFuZGxlVHlwZURlZiogKShoZG1hLT5QYXJlbnQpOworICAKKyAgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgIC8qIENoZWNrIGlmIGFuIEFib3J0IHByb2Nlc3MgaXMgc3RpbGwgb25nb2luZyAqLworICBpZihodWFydC0+aGRtYXR4ICE9IE5VTEwpCisgIHsKKyAgICBpZihodWFydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayAhPSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgCisgIC8qIE5vIEFib3J0IHByb2Nlc3Mgc3RpbGwgb25nb2luZyA6IEFsbCBETUEgY2hhbm5lbHMgYXJlIGFib3J0ZWQsIGNhbGwgdXNlciBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayAqLworICBodWFydC0+VHhYZmVyQ291bnQgPSAwVTsKKyAgaHVhcnQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgLyogUmVzZXQgZXJyb3JDb2RlICovCisgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOworCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9PUkVGIHwgVUFSVF9DTEVBUl9ORUYgfCBVQVJUX0NMRUFSX1BFRiB8IFVBUlRfQ0xFQVJfRkVGKTsKKworICAvKiBSZXN0b3JlIGh1YXJ0LT5nU3RhdGUgYW5kIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIGh1YXJ0LT5nU3RhdGUgID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogQ2FsbCB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisgIEhBTF9VQVJUX0Fib3J0Q3BsdENhbGxiYWNrKGh1YXJ0KTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIERNQSBVQVJUIFR4IGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IHVzZXIgYnkgYSBjYWxsIHRvCisgICogICAgICAgICBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0X0lUIEFQSSAoQWJvcnQgb25seSBUeCB0cmFuc2ZlcikKKyAgKiAgICAgICAgIChUaGlzIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIGF0IGVuZCBvZiBETUEgVHggQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyB1c2VyIGFib3J0IHJlcXVlc3QsCisgICogICAgICAgICBhbmQgbGVhZHMgdG8gdXNlciBUeCBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayBleGVjdXRpb24pLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVUFSVF9ETUFUeE9ubHlBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBVQVJUX0hhbmRsZVR5cGVEZWYqIGh1YXJ0ID0gKFVBUlRfSGFuZGxlVHlwZURlZiopKGhkbWEtPlBhcmVudCk7CisKKyAgaHVhcnQtPlR4WGZlckNvdW50ID0gMFU7CisKKyAgLyogUmVzdG9yZSBodWFydC0+Z1N0YXRlIHRvIFJlYWR5ICovCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAvKiBDYWxsIHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgSEFMX1VBUlRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhodWFydCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFVBUlQgUnggY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgdXNlciBieSBhIGNhbGwgdG8KKyAgKiAgICAgICAgIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZV9JVCBBUEkgKEFib3J0IG9ubHkgUnggdHJhbnNmZXIpCisgICogICAgICAgICAoVGhpcyBjYWxsYmFjayBpcyBleGVjdXRlZCBhdCBlbmQgb2YgRE1BIFJ4IEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgdXNlciBhYm9ydCByZXF1ZXN0LAorICAqICAgICAgICAgYW5kIGxlYWRzIHRvIHVzZXIgUnggQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgZXhlY3V0aW9uKS4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVBUlRfRE1BUnhPbmx5QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVUFSVF9IYW5kbGVUeXBlRGVmKiBodWFydCA9ICggVUFSVF9IYW5kbGVUeXBlRGVmKiApKChETUFfSGFuZGxlVHlwZURlZiogKWhkbWEpLT5QYXJlbnQ7CisKKyAgaHVhcnQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX09SRUYgfCBVQVJUX0NMRUFSX05FRiB8IFVBUlRfQ0xFQVJfUEVGIHwgVUFSVF9DTEVBUl9GRUYpOworCisgIC8qIFJlc3RvcmUgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAvKiBDYWxsIHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgSEFMX1VBUlRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKGh1YXJ0KTsKK30KKworLyoqCisgICogQGJyaWVmICBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIGludGVycnVwdCBtb2RlLgorICAqIEBub3RlICAgRnVuY3Rpb24gaXMgY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9VQVJUX1RyYW5zbWl0X0lUKCkuCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVBUlRfVHJhbnNtaXRfSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgdWludDE2X3QqIHRtcDsKKworICAvKiBDaGVjayB0aGF0IGEgVHggcHJvY2VzcyBpcyBvbmdvaW5nICovCisgIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfVFgpCisgIHsKKyAgICBpZihodWFydC0+VHhYZmVyQ291bnQgPT0gMFUpCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIEVtcHR5IEludGVycnVwdCAqLworICAgICAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVFhFSUUpOworCisgICAgICAvKiBFbmFibGUgdGhlIFVBUlQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovCisgICAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVENJRSk7CisKKyAgICAgIHJldHVybiBIQUxfT0s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAoKGh1YXJ0LT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVhcnQtPkluaXQuUGFyaXR5ID09IFVBUlRfUEFSSVRZX05PTkUpKQorICAgICAgeworICAgICAgICB0bXAgPSAodWludDE2X3QqKSBodWFydC0+cFR4QnVmZlB0cjsKKyAgICAgICAgaHVhcnQtPkluc3RhbmNlLT5URFIgPSAoKnRtcCAmICh1aW50MTZfdCkweDAxRkZVKTsKKyAgICAgICAgaHVhcnQtPnBUeEJ1ZmZQdHIgKz0gMlU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGh1YXJ0LT5JbnN0YW5jZS0+VERSID0gKHVpbnQ4X3QpKCpodWFydC0+cFR4QnVmZlB0cisrICYgKHVpbnQ4X3QpMHhGRlUpOworICAgICAgfQorICAgICAgaHVhcnQtPlR4WGZlckNvdW50LS07CisKKyAgICAgIHJldHVybiBIQUxfT0s7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFdyYXAgdXAgdHJhbnNtaXNzaW9uIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHVhcnQgcG9pbnRlciB0byBhIFVBUlRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVUFSVCBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBVQVJUX0VuZFRyYW5zbWl0X0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIERpc2FibGUgdGhlIFVBUlQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovCisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RDSUUpOworCisgIC8qIFR4IHByb2Nlc3MgaXMgZW5kZWQsIHJlc3RvcmUgaHVhcnQtPmdTdGF0ZSB0byBSZWFkeSAqLworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgSEFMX1VBUlRfVHhDcGx0Q2FsbGJhY2soaHVhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAbm90ZSAgIEZ1bmN0aW9uIGlzIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZQorICAqICAgICAgICAgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfVUFSVF9SZWNlaXZlX0lUKCkKKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgVUFSVF9SZWNlaXZlX0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIHVpbnQxNl90KiB0bXA7CisgIHVpbnQxNl90ICB1aE1hc2sgPSBodWFydC0+TWFzazsKKyAgdWludDE2X3QgIHVoZGF0YTsKKworICAvKiBDaGVjayB0aGF0IGEgUnggcHJvY2VzcyBpcyBvbmdvaW5nICovCisgIGlmKGh1YXJ0LT5SeFN0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfUlgpCisgIHsKKyAgICB1aGRhdGEgPSAodWludDE2X3QpIFJFQURfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+UkRSKTsKKyAgICBpZiAoKGh1YXJ0LT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVhcnQtPkluaXQuUGFyaXR5ID09IFVBUlRfUEFSSVRZX05PTkUpKQorICAgIHsKKyAgICAgIHRtcCA9ICh1aW50MTZfdCopIGh1YXJ0LT5wUnhCdWZmUHRyIDsKKyAgICAgICp0bXAgPSAodWludDE2X3QpKHVoZGF0YSAmIHVoTWFzayk7CisgICAgICBodWFydC0+cFJ4QnVmZlB0ciArPTJVOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgKmh1YXJ0LT5wUnhCdWZmUHRyKysgPSAodWludDhfdCkodWhkYXRhICYgKHVpbnQ4X3QpdWhNYXNrKTsKKyAgICB9CisKKyAgICBpZigtLWh1YXJ0LT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQgYW5kIFJYTkUgaW50ZXJydXB0Ki8KKyAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpOworCisgICAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAgIC8qIFJ4IHByb2Nlc3MgaXMgY29tcGxldGVkLCByZXN0b3JlIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgICAgICBIQUxfVUFSVF9SeENwbHRDYWxsYmFjayhodWFydCk7CisKKyAgICAgIHJldHVybiBIQUxfT0s7CisgICAgfQorCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDbGVhciBSWE5FIGludGVycnVwdCBmbGFnICovCisgICAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIEluaXRpYWxpemUgdGhlIFVBUlQgd2FrZS11cCBmcm9tIHN0b3AgbW9kZSBwYXJhbWV0ZXJzIHdoZW4gdHJpZ2dlcmVkIGJ5IGFkZHJlc3MgZGV0ZWN0aW9uLgorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gV2FrZVVwU2VsZWN0aW9uIFVBUlQgd2FrZSB1cCBmcm9tIHN0b3AgbW9kZSBwYXJhbWV0ZXJzLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBVQVJUX1dha2V1cF9BZGRyZXNzQ29uZmlnKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIFVBUlRfV2FrZVVwVHlwZURlZiBXYWtlVXBTZWxlY3Rpb24pCit7CisgIGFzc2VydF9wYXJhbShJU19VQVJUX0FERFJFU1NMRU5HVEhfREVURUNUKFdha2VVcFNlbGVjdGlvbi5BZGRyZXNzTGVuZ3RoKSk7CisKKyAgLyogU2V0IHRoZSBVU0FSVCBhZGRyZXNzIGxlbmd0aCAqLworICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfQURETTcsIFdha2VVcFNlbGVjdGlvbi5BZGRyZXNzTGVuZ3RoKTsKKworICAvKiBTZXQgdGhlIFVTQVJUIGFkZHJlc3Mgbm9kZSAqLworICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfQURELCAoKHVpbnQzMl90KVdha2VVcFNlbGVjdGlvbi5BZGRyZXNzIDw8IFVBUlRfQ1IyX0FERFJFU1NfTFNCX1BPUykpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX1VBUlRfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmM3h4X2hhbF91YXJ0X2V4LmMgYi9TcmMvc3RtMzJmM3h4X2hhbF91YXJ0X2V4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk0YzczOAotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfaGFsX3VhcnRfZXguYwpAQCAtMCwwICsxLDQ2OSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfdWFydF9leC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBFeHRlbmRlZCBVQVJUIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcgZXh0ZW5kZWQKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFVuaXZlcnNhbCBBc3luY2hyb25vdXMgUmVjZWl2ZXIgVHJhbnNtaXR0ZXIgUGVyaXBoZXJhbCAoVUFSVCkuCisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKgorICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICMjIyMjIFVBUlQgcGVyaXBoZXJhbCBleHRlbmRlZCBmZWF0dXJlcyAgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAoIykgRGVjbGFyZSBhIFVBUlRfSGFuZGxlVHlwZURlZiBoYW5kbGUgc3RydWN0dXJlLgorCisgICAgKCMpIEZvciB0aGUgVUFSVCBSUzQ4NSBEcml2ZXIgRW5hYmxlIG1vZGUsIGluaXRpYWxpemUgdGhlIFVBUlQgcmVnaXN0ZXJzCisgICAgICAgIGJ5IGNhbGxpbmcgdGhlIEhBTF9SUzQ4NUV4X0luaXQoKSBBUEkuCisKKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRFeCBVQVJURXgKKyAgKiBAYnJpZWYgVUFSVCBFeHRlbnNpb24gSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX1VBUlRfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFVBUlRFeF9FeHBvcnRlZF9GdW5jdGlvbnMgVUFSVEV4IEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVEV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgRXh0ZW5kZWQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBFeHRlbmRlZCBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBGdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIHRoZSBVU0FSVHggb3IgdGhlIFVBUlR5CisgICAgaW4gYXN5bmNocm9ub3VzIG1vZGUuCisgICAgICAoKykgRm9yIHRoZSBhc3luY2hyb25vdXMgbW9kZSB0aGUgcGFyYW1ldGVycyBiZWxvdyBjYW4gYmUgY29uZmlndXJlZDoKKyAgICAgICAgKCsrKSBCYXVkIFJhdGUKKyAgICAgICAgKCsrKSBXb3JkIExlbmd0aCAoRml4ZWQgdG8gOC1iaXRzIG9ubHkgZm9yIExJTiBtb2RlKQorICAgICAgICAoKyspIFN0b3AgQml0CisgICAgICAgICgrKykgUGFyaXR5CisgICAgICAgICgrKykgSGFyZHdhcmUgZmxvdyBjb250cm9sCisgICAgICAgICgrKykgUmVjZWl2ZXIvdHJhbnNtaXR0ZXIgbW9kZXMKKyAgICAgICAgKCsrKSBPdmVyIFNhbXBsaW5nIE1ldGhvZAorICAgICAgICAoKyspIE9uZS1CaXQgU2FtcGxpbmcgTWV0aG9kCisgICAgICAoKykgRm9yIHRoZSBhc3luY2hyb25vdXMgbW9kZSwgdGhlIGZvbGxvd2luZyBhZHZhbmNlZCBmZWF0dXJlcyBjYW4gYmUgY29uZmlndXJlZCBhcyB3ZWxsOgorICAgICAgICAoKyspIFRYIGFuZC9vciBSWCBwaW4gbGV2ZWwgaW52ZXJzaW9uCisgICAgICAgICgrKykgZGF0YSBsb2dpY2FsIGxldmVsIGludmVyc2lvbgorICAgICAgICAoKyspIFJYIGFuZCBUWCBwaW5zIHN3YXAKKyAgICAgICAgKCsrKSBSWCBvdmVycnVuIGRldGVjdGlvbiBkaXNhYmxpbmcKKyAgICAgICAgKCsrKSBETUEgZGlzYWJsaW5nIG9uIFJYIGVycm9yCisgICAgICAgICgrKykgTVNCIGZpcnN0IG9uIGNvbW11bmljYXRpb24gbGluZQorICAgICAgICAoKyspIGF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbgorICAgIFsuLl0KKyAgICBUaGUgSEFMX1JTNDg1RXhfSW5pdCgpIEFQSSBmb2xsb3dzIHJlc3BlY3RpdmVseSB0aGUgVUFSVCBSUzQ4NSBtb2RlCisgICAgY29uZmlndXJhdGlvbiBwcm9jZWR1cmVzIChkZXRhaWxzIGZvciB0aGUgcHJvY2VkdXJlcyBhcmUgYXZhaWxhYmxlIGluIHJlZmVyZW5jZSBtYW51YWwpLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKgorICBBZGRpdGlvbmFsIFRhYmxlOiAgSWYgdGhlIHBhcml0eSBpcyBlbmFibGVkLCB0aGVuIHRoZSBNU0IgYml0IG9mIHRoZSBkYXRhIHdyaXR0ZW4KKyAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBkYXRhIHJlZ2lzdGVyIGlzIHRyYW5zbWl0dGVkIGJ1dCBpcyBjaGFuZ2VkIGJ5IHRoZSBwYXJpdHkgYml0LgorICAgICAgICAgICAgICAgICAgICAgQWNjb3JkaW5nIHRvIGRldmljZSBjYXBhYmlsaXR5IChzdXBwb3J0IG9yIG5vdCBvZiA3LWJpdCB3b3JkIGxlbmd0aCksCisgICAgICAgICAgICAgICAgICAgICBmcmFtZSBsZW5ndGggaXMgZWl0aGVyIGRlZmluZWQgYnkgdGhlIE0gYml0ICg4LWJpdHMgb3IgOS1iaXRzKQorICAgICAgICAgICAgICAgICAgICAgb3IgYnkgdGhlIE0xIGFuZCBNMCBiaXRzICg3LWJpdCwgOC1iaXQgb3IgOS1iaXQpLgorICAgICAgICAgICAgICAgICAgICAgUG9zc2libGUgVUFSVCBmcmFtZSBmb3JtYXRzIGFyZSBhcyBsaXN0ZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZToKKyAgICAgICAgICAgIAorICAgICAgVGFibGUgMS4gVUFSVCBmcmFtZSBmb3JtYXQuICAgICAgICAgICAgIAorICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgfCAgICAgICBNIGJpdCAgICAgICB8ICBQQ0UgYml0ICB8ICAgICAgICAgICAgIFVBUlQgZnJhbWUgICAgICAgICAgICAgICAgfAorICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAgfCAgICAgICAgIDAgICAgICAgICB8ICAgICAwICAgICB8ICAgIHwgU0IgfCAgICA4LWJpdCBkYXRhICAgfCBTVEIgfCAgICAgfAorICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAgfCAgICAgICAgIDAgICAgICAgICB8ICAgICAxICAgICB8ICAgIHwgU0IgfCA3LWJpdCBkYXRhIHwgUEIgfCBTVEIgfCAgICAgfAorICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAgfCAgICAgICAgIDEgICAgICAgICB8ICAgICAwICAgICB8ICAgIHwgU0IgfCAgICA5LWJpdCBkYXRhICAgfCBTVEIgfCAgICAgfAorICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAgfCAgICAgICAgIDEgICAgICAgICB8ICAgICAxICAgICB8ICAgIHwgU0IgfCA4LWJpdCBkYXRhIHwgUEIgfCBTVEIgfCAgICAgfAorICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgfCAgTTEgYml0IHwgIE0wIGJpdCB8ICBQQ0UgYml0ICB8ICAgICAgICAgICAgIFVBUlQgZnJhbWUgICAgICAgICAgICAgICAgfAorICAgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAgfCAgICAwICAgIHwgICAgMCAgICB8ICAgICAwICAgICB8ICAgIHwgU0IgfCAgICA4IGJpdCBkYXRhICAgfCBTVEIgfCAgICAgfAorICAgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAgfCAgICAwICAgIHwgICAgMCAgICB8ICAgICAxICAgICB8ICAgIHwgU0IgfCA3IGJpdCBkYXRhIHwgUEIgfCBTVEIgfCAgICAgfAorICAgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAgfCAgICAwICAgIHwgICAgMSAgICB8ICAgICAwICAgICB8ICAgIHwgU0IgfCAgICA5IGJpdCBkYXRhICAgfCBTVEIgfCAgICAgfAorICAgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAgfCAgICAwICAgIHwgICAgMSAgICB8ICAgICAxICAgICB8ICAgIHwgU0IgfCA4IGJpdCBkYXRhIHwgUEIgfCBTVEIgfCAgICAgfAorICAgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAgfCAgICAxICAgIHwgICAgMCAgICB8ICAgICAwICAgICB8ICAgIHwgU0IgfCAgICA3IGJpdCBkYXRhICAgfCBTVEIgfCAgICAgfAorICAgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAgfCAgICAxICAgIHwgICAgMCAgICB8ICAgICAxICAgICB8ICAgIHwgU0IgfCA2IGJpdCBkYXRhIHwgUEIgfCBTVEIgfCAgICAgfAorICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisqLworCisvKioKKyAgKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgUlM0ODUgRHJpdmVyIGVuYWJsZSBmZWF0dXJlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBVQVJUX0luaXRUeXBlRGVmIGFuZCBjcmVhdGVzIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHBhcmFtIFBvbGFyaXR5IHNlbGVjdCB0aGUgZHJpdmVyIGVuYWJsZSBwb2xhcml0eS4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgVUFSVF9ERV9QT0xBUklUWV9ISUdIIERFIHNpZ25hbCBpcyBhY3RpdmUgaGlnaAorICAqICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0RFX1BPTEFSSVRZX0xPVyAgREUgc2lnbmFsIGlzIGFjdGl2ZSBsb3cKKyAgKiBAcGFyYW0gQXNzZXJ0aW9uVGltZSBEcml2ZXIgRW5hYmxlIGFzc2VydGlvbiB0aW1lOgorICAqICAgICAgICAgICAgICAgICAgICAgICAgIDUtYml0IHZhbHVlIGRlZmluaW5nIHRoZSB0aW1lIGJldHdlZW4gdGhlIGFjdGl2YXRpb24gb2YgdGhlIERFIChEcml2ZXIgRW5hYmxlKQorICAqICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbCBhbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RhcnQgYml0LiBJdCBpcyBleHByZXNzZWQgaW4gc2FtcGxlIHRpbWUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyAoMS84IG9yIDEvMTYgYml0IHRpbWUsIGRlcGVuZGluZyBvbiB0aGUgb3ZlcnNhbXBsaW5nIHJhdGUpCisgICogQHBhcmFtIERlYXNzZXJ0aW9uVGltZSBEcml2ZXIgRW5hYmxlIGRlYXNzZXJ0aW9uIHRpbWU6CisgICogICAgICAgICAgICAgICAgICAgICAgICAgNS1iaXQgdmFsdWUgZGVmaW5pbmcgdGhlIHRpbWUgYmV0d2VlbiB0aGUgZW5kIG9mIHRoZSBsYXN0IHN0b3AgYml0LCBpbiBhCisgICogICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNtaXR0ZWQgbWVzc2FnZSwgYW5kIHRoZSBkZS1hY3RpdmF0aW9uIG9mIHRoZSBERSAoRHJpdmVyIEVuYWJsZSkgc2lnbmFsLgorICAqICAgICAgICAgICAgICAgICAgICAgICAgIEl0IGlzIGV4cHJlc3NlZCBpbiBzYW1wbGUgdGltZSB1bml0cyAoMS84IG9yIDEvMTYgYml0IHRpbWUsIGRlcGVuZGluZyBvbiB0aGUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyc2FtcGxpbmcgcmF0ZSkuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlM0ODVFeF9Jbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQzMl90IFBvbGFyaXR5LCB1aW50MzJfdCBBc3NlcnRpb25UaW1lLCB1aW50MzJfdCBEZWFzc2VydGlvblRpbWUpCit7CisgIHVpbnQzMl90IHRlbXAgPSAweDBVOworCisgIC8qIENoZWNrIHRoZSBVQVJUIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmKGh1YXJ0ID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIC8qIENoZWNrIHRoZSBEcml2ZXIgRW5hYmxlIFVBUlQgaW5zdGFuY2UgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfRFJJVkVSX0VOQUJMRV9JTlNUQU5DRShodWFydC0+SW5zdGFuY2UpKTsKKworICAvKiBDaGVjayB0aGUgRHJpdmVyIEVuYWJsZSBwb2xhcml0eSAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9ERV9QT0xBUklUWShQb2xhcml0eSkpOworCisgIC8qIENoZWNrIHRoZSBEcml2ZXIgRW5hYmxlIGFzc2VydGlvbiB0aW1lICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0FTU0VSVElPTlRJTUUoQXNzZXJ0aW9uVGltZSkpOworCisgIC8qIENoZWNrIHRoZSBEcml2ZXIgRW5hYmxlIGRlYXNzZXJ0aW9uIHRpbWUgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfREVBU1NFUlRJT05USU1FKERlYXNzZXJ0aW9uVGltZSkpOworCisgIGlmKGh1YXJ0LT5nU3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHVhcnQtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgQ09SVEVYICovCisgICAgSEFMX1VBUlRfTXNwSW5pdChodWFydCk7CisgIH0KKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1VBUlRfRElTQUJMRShodWFydCk7CisKKyAgLyogU2V0IHRoZSBVQVJUIENvbW11bmljYXRpb24gcGFyYW1ldGVycyAqLworICBpZiAoVUFSVF9TZXRDb25maWcoaHVhcnQpID09IEhBTF9FUlJPUikKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICBpZihodWFydC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0ICE9IFVBUlRfQURWRkVBVFVSRV9OT19JTklUKQorICB7CisgICAgVUFSVF9BZHZGZWF0dXJlQ29uZmlnKGh1YXJ0KTsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgRHJpdmVyIEVuYWJsZSBtb2RlIGJ5IHNldHRpbmcgdGhlIERFTSBiaXQgaW4gdGhlIENSMyByZWdpc3RlciAqLworICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfREVNKTsKKworICAvKiBTZXQgdGhlIERyaXZlciBFbmFibGUgcG9sYXJpdHkgKi8KKyAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RFUCwgUG9sYXJpdHkpOworCisgIC8qIFNldCB0aGUgRHJpdmVyIEVuYWJsZSBhc3NlcnRpb24gYW5kIGRlYXNzZXJ0aW9uIHRpbWVzICovCisgIHRlbXAgPSAoQXNzZXJ0aW9uVGltZSA8PCBVQVJUX0NSMV9ERUFUX0FERFJFU1NfTFNCX1BPUyk7CisgIHRlbXAgfD0gKERlYXNzZXJ0aW9uVGltZSA8PCBVQVJUX0NSMV9ERURUX0FERFJFU1NfTFNCX1BPUyk7CisgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfREVEVHxVU0FSVF9DUjFfREVBVCksIHRlbXApOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VQVJUX0VOQUJMRShodWFydCk7CisKKyAgLyogVEVBQ0sgYW5kL29yIFJFQUNLIHRvIGNoZWNrIGJlZm9yZSBtb3ZpbmcgaHVhcnQtPmdTdGF0ZSBhbmQgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgcmV0dXJuIChVQVJUX0NoZWNrSWRsZVN0YXRlKGh1YXJ0KSk7Cit9CisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJURXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBFeHRlbmRlZCBJTyBvcGVyYXRpb24gZnVuY3Rpb24gCisgICogQGJyaWVmICAgIEV4dGVuZGVkIFVBUlQgSW50ZXJydXB0IGhhbmRsaW5nIGZ1bmN0aW9uIAorICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9uICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgVUFSVCBpbnRlcnJ1cHRzCisgICAgYW5kIHRvIGhhbmRsZSBXYWtlIHVwIGludGVycnVwdCBjYWxsLWJhY2suCisgICAgICAgIAorICAgICgjKSBDYWxsYmFjayBwcm92aWRlZCBpbiBOb19CbG9ja2luZyBtb2RlOgorICAgICAgICAoKyspIEhBTF9VQVJURXhfV2FrZXVwQ2FsbGJhY2soKQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisKKy8qKgorICAqIEBicmllZiAgVUFSVCB3YWtldXAgZnJvbSBTdG9wIG1vZGUgY2FsbGJhY2suCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9VQVJURXhfV2FrZXVwQ2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVUFSVEV4X1dha2V1cENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIFVBUlRFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGV4dGVuZGVkIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb250cm9sIHRoZSBVQVJULiAgICAgICAgIAorICAgICAoKykgSEFMX1VBUlRFeF9TdG9wTW9kZVdha2VVcFNvdXJjZUNvbmZpZygpIEFQSSBzZXRzIFdha2V1cCBmcm9tIFN0b3AgbW9kZSBpbnRlcnJ1cHQgZmxhZyBzZWxlY3Rpb24KKyAgICAgKCspIEhBTF9VQVJURXhfRW5hYmxlU3RvcE1vZGUoKSBBUEkgYWxsb3dzIHRoZSBVQVJUIHRvIHdha2UgdXAgdGhlIE1DVSBmcm9tIFN0b3AgbW9kZSBhcyAKKyAgICAgICAgIGxvbmcgYXMgVUFSVCBjbG9jayBpcyBIU0kgb3IgTFNFIAorICAgICAoKykgSEFMX1VBUlRFeF9EaXNhYmxlU3RvcE1vZGUoKSBBUEkgZGlzYWJsZXMgdGhlIGFib3ZlIGZlYXR1cmUgCisgICAgICgrKSBIQUxfTXVsdGlQcm9jZXNzb3JFeF9BZGRyZXNzTGVuZ3RoX1NldCgpIEFQSSBvcHRpb25hbGx5IHNldHMgdGhlIFVBUlQgbm9kZSBhZGRyZXNzCisgICAgICAgICBkZXRlY3Rpb24gbGVuZ3RoIHRvIG1vcmUgdGhhbiA0IGJpdHMgZm9yIG11bHRpcHJvY2Vzc29yIGFkZHJlc3MgbWFyayB3YWtlIHVwLgorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIFNldCBXYWtldXAgZnJvbSBTdG9wIG1vZGUgaW50ZXJydXB0IGZsYWcgc2VsZWN0aW9uLgorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gV2FrZVVwU2VsZWN0aW9uIGFkZHJlc3MgbWF0Y2gsIFN0YXJ0IEJpdCBkZXRlY3Rpb24gb3IgUlhORSBiaXQgc3RhdHVzLgorICAqIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICBAYXJnIEByZWYgVUFSVF9XQUtFVVBfT05fQUREUkVTUworICAqICAgICAgQGFyZyBAcmVmIFVBUlRfV0FLRVVQX09OX1NUQVJUQklUCisgICogICAgICBAYXJnIEByZWYgVUFSVF9XQUtFVVBfT05fUkVBRERBVEFfTk9ORU1QVFkKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJURXhfU3RvcE1vZGVXYWtlVXBTb3VyY2VDb25maWcoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgVUFSVF9XYWtlVXBUeXBlRGVmIFdha2VVcFNlbGVjdGlvbikKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKworICAvKiBjaGVjayB0aGUgd2FrZS11cCBmcm9tIHN0b3AgbW9kZSBVQVJUIGluc3RhbmNlICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShodWFydC0+SW5zdGFuY2UpKTsKKyAgLyogY2hlY2sgdGhlIHdha2UtdXAgc2VsZWN0aW9uIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9XQUtFVVBfU0VMRUNUSU9OKFdha2VVcFNlbGVjdGlvbi5XYWtlVXBFdmVudCkpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHVhcnQpOworCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVUFSVF9ESVNBQkxFKGh1YXJ0KTsKKworICAvKiBTZXQgdGhlIHdha2UtdXAgc2VsZWN0aW9uIHNjaGVtZSAqLworICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfV1VTLCBXYWtlVXBTZWxlY3Rpb24uV2FrZVVwRXZlbnQpOworCisgIGlmIChXYWtlVXBTZWxlY3Rpb24uV2FrZVVwRXZlbnQgPT0gVUFSVF9XQUtFVVBfT05fQUREUkVTUykKKyAgeworICAgIFVBUlRfV2FrZXVwX0FkZHJlc3NDb25maWcoaHVhcnQsIFdha2VVcFNlbGVjdGlvbik7CisgIH0KKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVUFSVF9FTkFCTEUoaHVhcnQpOworCisgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnbWVudCovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCB1bnRpbCBSRUFDSyBmbGFnIGlzIHNldCAqLworICBpZihVQVJUX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaHVhcnQsIFVTQVJUX0lTUl9SRUFDSywgUkVTRVQsIHRpY2tzdGFydCwgSEFMX1VBUlRfVElNRU9VVF9WQUxVRSkgIT0gSEFMX09LKQorICB7CisgICAgc3RhdHVzID0gSEFMX1RJTUVPVVQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogSW5pdGlhbGl6ZSB0aGUgVUFSVCBTdGF0ZSAqLworICAgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgVUFSVCBTdG9wIE1vZGUuCisgICogQG5vdGUgIFRoZSBVQVJUIGlzIGFibGUgdG8gd2FrZSB1cCB0aGUgTUNVIGZyb20gU3RvcCBtb2RlIGFzIGxvbmcgYXMgVUFSVCBjbG9jayBpcyBIU0kgb3IgTFNFLgorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJURXhfRW5hYmxlU3RvcE1vZGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogQ2hlY2sgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShodWFydC0+SW5zdGFuY2UpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAvKiBTZXQgVUVTTSBiaXQgKi8KKyAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1VFU00pOworCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIERpc2FibGUgVUFSVCBTdG9wIE1vZGUuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9EaXNhYmxlU3RvcE1vZGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogQ2hlY2sgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShodWFydC0+SW5zdGFuY2UpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAvKiBDbGVhciBVRVNNIGJpdCAqLworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRVNNKTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiBCeSBkZWZhdWx0IGluIG11bHRpcHJvY2Vzc29yIG1vZGUsIHdoZW4gdGhlIHdha2UgdXAgbWV0aG9kIGlzIHNldAorICAqICAgICAgICB0byBhZGRyZXNzIG1hcmssIHRoZSBVQVJUIGhhbmRsZXMgb25seSA0LWJpdCBsb25nIGFkZHJlc3NlcyBkZXRlY3Rpb247CisgICogICAgICAgIHRoaXMgQVBJIGFsbG93cyB0byBlbmFibGUgbG9uZ2VyIGFkZHJlc3NlcyBkZXRlY3Rpb24gKDYtLCA3LSBvciA4LWJpdAorICAqICAgICAgICBsb25nKS4KKyAgKiBAbm90ZSAgQWRkcmVzc2VzIGRldGVjdGlvbiBsZW5ndGhzIGFyZTogNi1iaXQgYWRkcmVzcyBkZXRlY3Rpb24gaW4gNy1iaXQgZGF0YSBtb2RlLCAKKyAgKiAgICAgICAgNy1iaXQgYWRkcmVzcyBkZXRlY3Rpb24gaW4gOC1iaXQgZGF0YSBtb2RlLCA4LWJpdCBhZGRyZXNzIGRldGVjdGlvbiBpbiA5LWJpdCBkYXRhIG1vZGUuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEBwYXJhbSBBZGRyZXNzTGVuZ3RoIHRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQUREUkVTU19ERVRFQ1RfNEIgNC1iaXQgbG9uZyBhZGRyZXNzCisgICogICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQUREUkVTU19ERVRFQ1RfN0IgNi0sIDctIG9yIDgtYml0IGxvbmcgYWRkcmVzcworICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX011bHRpUHJvY2Vzc29yRXhfQWRkcmVzc0xlbmd0aF9TZXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDMyX3QgQWRkcmVzc0xlbmd0aCkKK3sKKyAgLyogQ2hlY2sgdGhlIFVBUlQgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYoaHVhcnQgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgYWRkcmVzcyBsZW5ndGggcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0FERFJFU1NMRU5HVEhfREVURUNUKEFkZHJlc3NMZW5ndGgpKTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1VBUlRfRElTQUJMRShodWFydCk7CisKKyAgLyogU2V0IHRoZSBhZGRyZXNzIGxlbmd0aCAqLworICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfQURETTcsIEFkZHJlc3NMZW5ndGgpOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VQVJUX0VOQUJMRShodWFydCk7CisKKyAgLyogVEVBQ0sgYW5kL29yIFJFQUNLIHRvIGNoZWNrIGJlZm9yZSBtb3ZpbmcgaHVhcnQtPmdTdGF0ZSB0byBSZWFkeSAqLworICByZXR1cm4gKFVBUlRfQ2hlY2tJZGxlU3RhdGUoaHVhcnQpKTsKK30KKworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfVUFSVF9NT0RVTEVfRU5BQkxFRCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjN4eF9oYWxfdXNhcnQuYyBiL1NyYy9zdG0zMmYzeHhfaGFsX3VzYXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGExMTgxZgotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfaGFsX3VzYXJ0LmMKQEAgLTAsMCArMSwyMzgzIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2hhbF91c2FydC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBVU0FSVCBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBVbml2ZXJzYWwgU3luY2hyb25vdXMgQXN5bmNocm9ub3VzIFJlY2VpdmVyIFRyYW5zbWl0dGVyCisgICogICAgICAgICAgUGVyaXBoZXJhbCAoVVNBUlQpLgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgVGhlIFVTQVJUIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKKworICAgICAgKCMpIERlY2xhcmUgYSBVU0FSVF9IYW5kbGVUeXBlRGVmIGhhbmRsZSBzdHJ1Y3R1cmUgKGVnLiBVU0FSVF9IYW5kbGVUeXBlRGVmIGh1c2FydCkuCisgICAgICAoIykgSW5pdGlhbGl6ZSB0aGUgVVNBUlQgbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIEhBTF9VU0FSVF9Nc3BJbml0KCkgQVBJOgorICAgICAgICAgICgrKykgRW5hYmxlIHRoZSBVU0FSVHggaW50ZXJmYWNlIGNsb2NrLgorICAgICAgICAgICgrKykgVVNBUlQgcGlucyBjb25maWd1cmF0aW9uOgorICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBjbG9jayBmb3IgdGhlIFVTQVJUIEdQSU9zLgorICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZXNlIFVTQVJUIHBpbnMgYXMgYWx0ZXJuYXRlIGZ1bmN0aW9uIHB1bGwtdXAuCisgICAgICAgICAgKCsrKSBOVklDIGNvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIGludGVycnVwdCBwcm9jZXNzIChIQUxfVVNBUlRfVHJhbnNtaXRfSVQoKSwKKyAgICAgICAgICAgICAgICBIQUxfVVNBUlRfUmVjZWl2ZV9JVCgpIGFuZCBIQUxfVVNBUlRfVHJhbnNtaXRSZWNlaXZlX0lUKCkgQVBJcyk6CisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIFVTQVJUeCBpbnRlcnJ1cHQgcHJpb3JpdHkuCisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIE5WSUMgVVNBUlQgSVJRIGhhbmRsZS4KKyAgICAgICAgICAgICgrKykgVVNBUlQgaW50ZXJydXB0cyBoYW5kbGluZzoKKyAgICAgICAgICAgICAgLUBALSAgIFRoZSBzcGVjaWZpYyBVU0FSVCBpbnRlcnJ1cHRzIChUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0LAorICAgICAgICAgICAgICAgICAgUlhORSBpbnRlcnJ1cHQgYW5kIEVycm9yIEludGVycnVwdHMpIHdpbGwgYmUgbWFuYWdlZCB1c2luZyB0aGUgbWFjcm9zCisgICAgICAgICAgICAgICAgICBfX0hBTF9VU0FSVF9FTkFCTEVfSVQoKSBhbmQgX19IQUxfVVNBUlRfRElTQUJMRV9JVCgpIGluc2lkZSB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgcHJvY2Vzcy4KKyAgICAgICAgICAoKyspIERNQSBDb25maWd1cmF0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBETUEgcHJvY2VzcyAoSEFMX1VTQVJUX1RyYW5zbWl0X0RNQSgpCisgICAgICAgICAgICAgICBIQUxfVVNBUlRfUmVjZWl2ZV9ETUEoKSBhbmQgSEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZV9ETUEoKSBBUElzKToKKyAgICAgICAgICAgICgrKyspIERlY2xhcmUgYSBETUEgaGFuZGxlIHN0cnVjdHVyZSBmb3IgdGhlIFR4L1J4IGNoYW5uZWwuCisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIERNQXggaW50ZXJmYWNlIGNsb2NrLgorICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBkZWNsYXJlZCBETUEgaGFuZGxlIHN0cnVjdHVyZSB3aXRoIHRoZSByZXF1aXJlZCBUeC9SeCBwYXJhbWV0ZXJzLgorICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBETUEgVHgvUnggY2hhbm5lbC4KKyAgICAgICAgICAgICgrKyspIEFzc29jaWF0ZSB0aGUgaW5pdGlhbGl6ZWQgRE1BIGhhbmRsZSB0byB0aGUgVVNBUlQgRE1BIFR4L1J4IGhhbmRsZS4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgcHJpb3JpdHkgYW5kIGVuYWJsZSB0aGUgTlZJQyBmb3IgdGhlIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBvbiB0aGUgRE1BIFR4L1J4IGNoYW5uZWwuCisKKyAgICAgICgjKSBQcm9ncmFtIHRoZSBCYXVkIFJhdGUsIFdvcmQgTGVuZ3RoLCBTdG9wIEJpdCwgUGFyaXR5LCBIYXJkd2FyZQorICAgICAgICAgIGZsb3cgY29udHJvbCBhbmQgTW9kZSAoUmVjZWl2ZXIvVHJhbnNtaXR0ZXIpIGluIHRoZSBodXNhcnQgaGFuZGxlIEluaXQgc3RydWN0dXJlLgorCisgICAgICAoIykgSW5pdGlhbGl6ZSB0aGUgVVNBUlQgcmVnaXN0ZXJzIGJ5IGNhbGxpbmcgdGhlIEhBTF9VU0FSVF9Jbml0KCkgQVBJOgorICAgICAgICAgICgrKykgVGhpcyBBUEkgY29uZmlndXJlcyBhbHNvIHRoZSBsb3cgbGV2ZWwgSGFyZHdhcmUgKEdQSU8sIENMT0NLLCBDT1JURVguLi5ldGMpCisgICAgICAgICAgICAgICBieSBjYWxsaW5nIHRoZSBjdXN0b21pemVkIEhBTF9VU0FSVF9Nc3BJbml0KCZodXNhcnQpIEFQSS4KKworICAgICgjKSBUaHJlZSBvcGVyYXRpb24gbW9kZXMgYXJlIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBkcml2ZXIgOgorCisgICAgICoqKiBQb2xsaW5nIG1vZGUgSU8gb3BlcmF0aW9uICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgWy4uXQorICAgICAgICgrKSBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX1VTQVJUX1RyYW5zbWl0KCkKKyAgICAgICAoKykgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlIHVzaW5nIEhBTF9VU0FSVF9SZWNlaXZlKCkKKworICAgICAqKiogSW50ZXJydXB0IG1vZGUgSU8gb3BlcmF0aW9uICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisgICAgICAgKCspIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uIGJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX1VTQVJUX1RyYW5zbWl0X0lUKCkKKyAgICAgICAoKykgQXQgdHJhbnNtaXNzaW9uIGVuZCBvZiBoYWxmIHRyYW5zZmVyIEhBTF9VU0FSVF9UeEhhbGZDcGx0Q2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfVVNBUlRfVHhIYWxmQ3BsdENhbGxiYWNrCisgICAgICAgKCspIEF0IHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIgSEFMX1VTQVJUX1R4Q3BsdENhbGxiYWNrIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX1VTQVJUX1R4Q3BsdENhbGxiYWNrCisgICAgICAgKCspIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uIGJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX1VTQVJUX1JlY2VpdmVfSVQoKQorICAgICAgICgrKSBBdCByZWNlcHRpb24gZW5kIG9mIGhhbGYgdHJhbnNmZXIgSEFMX1VTQVJUX1J4SGFsZkNwbHRDYWxsYmFjayBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9VU0FSVF9SeEhhbGZDcGx0Q2FsbGJhY2sKKyAgICAgICAoKykgQXQgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2ZlciBIQUxfVVNBUlRfUnhDcGx0Q2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfVVNBUlRfUnhDcGx0Q2FsbGJhY2sKKyAgICAgICAoKykgSW4gY2FzZSBvZiB0cmFuc2ZlciBFcnJvciwgSEFMX1VTQVJUX0Vycm9yQ2FsbGJhY2soKSBmdW5jdGlvbiBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9VU0FSVF9FcnJvckNhbGxiYWNrCisKKyAgICAgKioqIERNQSBtb2RlIElPIG9wZXJhdGlvbiAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0KKyAgICAgICAoKykgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24gYmxvY2tpbmcgbW9kZSAoRE1BKSB1c2luZyBIQUxfVVNBUlRfVHJhbnNtaXRfRE1BKCkKKyAgICAgICAoKykgQXQgdHJhbnNtaXNzaW9uIGVuZCBvZiBoYWxmIHRyYW5zZmVyIEhBTF9VU0FSVF9UeEhhbGZDcGx0Q2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfVVNBUlRfVHhIYWxmQ3BsdENhbGxiYWNrCisgICAgICAgKCspIEF0IHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIgSEFMX1VTQVJUX1R4Q3BsdENhbGxiYWNrIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX1VTQVJUX1R4Q3BsdENhbGxiYWNrCisgICAgICAgKCspIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uIGJsb2NraW5nIG1vZGUgKERNQSkgdXNpbmcgSEFMX1VTQVJUX1JlY2VpdmVfRE1BKCkKKyAgICAgICAoKykgQXQgcmVjZXB0aW9uIGVuZCBvZiBoYWxmIHRyYW5zZmVyIEhBTF9VU0FSVF9SeEhhbGZDcGx0Q2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfVVNBUlRfUnhIYWxmQ3BsdENhbGxiYWNrCisgICAgICAgKCspIEF0IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIgSEFMX1VTQVJUX1J4Q3BsdENhbGxiYWNrIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX1VTQVJUX1J4Q3BsdENhbGxiYWNrCisgICAgICAgKCspIEluIGNhc2Ugb2YgdHJhbnNmZXIgRXJyb3IsIEhBTF9VU0FSVF9FcnJvckNhbGxiYWNrKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfVVNBUlRfRXJyb3JDYWxsYmFjaworICAgICAgICgrKSBQYXVzZSB0aGUgRE1BIFRyYW5zZmVyIHVzaW5nIEhBTF9VU0FSVF9ETUFQYXVzZSgpCisgICAgICAgKCspIFJlc3VtZSB0aGUgRE1BIFRyYW5zZmVyIHVzaW5nIEhBTF9VU0FSVF9ETUFSZXN1bWUoKQorICAgICAgICgrKSBTdG9wIHRoZSBETUEgVHJhbnNmZXIgdXNpbmcgSEFMX1VTQVJUX0RNQVN0b3AoKQorCisgICAgICoqKiBVU0FSVCBIQUwgZHJpdmVyIG1hY3JvcyBsaXN0ICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgWy4uXQorICAgICAgIEJlbG93IHRoZSBsaXN0IG9mIG1vc3QgdXNlZCBtYWNyb3MgaW4gVVNBUlQgSEFMIGRyaXZlci4KKworICAgICAgICgrKSBfX0hBTF9VU0FSVF9FTkFCTEU6IEVuYWJsZSB0aGUgVVNBUlQgcGVyaXBoZXJhbAorICAgICAgICgrKSBfX0hBTF9VU0FSVF9ESVNBQkxFOiBEaXNhYmxlIHRoZSBVU0FSVCBwZXJpcGhlcmFsCisgICAgICAgKCspIF9fSEFMX1VTQVJUX0dFVF9GTEFHIDogQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFVTQVJUIGZsYWcgaXMgc2V0IG9yIG5vdAorICAgICAgICgrKSBfX0hBTF9VU0FSVF9DTEVBUl9GTEFHIDogQ2xlYXIgdGhlIHNwZWNpZmllZCBVU0FSVCBwZW5kaW5nIGZsYWcKKyAgICAgICAoKykgX19IQUxfVVNBUlRfRU5BQkxFX0lUOiBFbmFibGUgdGhlIHNwZWNpZmllZCBVU0FSVCBpbnRlcnJ1cHQKKyAgICAgICAoKykgX19IQUxfVVNBUlRfRElTQUJMRV9JVDogRGlzYWJsZSB0aGUgc3BlY2lmaWVkIFVTQVJUIGludGVycnVwdAorCisgICAgIFsuLl0KKyAgICAgICAoQCkgWW91IGNhbiByZWZlciB0byB0aGUgVVNBUlQgSEFMIGRyaXZlciBoZWFkZXIgZmlsZSBmb3IgbW9yZSB1c2VmdWwgbWFjcm9zCisgICAgIFsuLl0KKyAgICAgICAoQCkgVG8gY29uZmlndXJlIGFuZCBlbmFibGUvZGlzYWJsZSB0aGUgVVNBUlQgdG8gd2FrZSB1cCB0aGUgTUNVIGZyb20gc3RvcCBtb2RlLCByZXNvcnQgdG8gVUFSVCBBUEkncworICAgICAgICAgICBIQUxfVUFSVEV4X1N0b3BNb2RlV2FrZVVwU291cmNlQ29uZmlnKCksIEhBTF9VQVJURXhfRW5hYmxlU3RvcE1vZGUoKSBhbmQKKyAgICAgICAgICAgSEFMX1VBUlRFeF9EaXNhYmxlU3RvcE1vZGUoKSBpbiBjYXN0aW5nIHRoZSBVU0FSVCBoYW5kbGUgdG8gVUFSVCB0eXBlIFVBUlRfSGFuZGxlVHlwZURlZi4KKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUIFVTQVJUCisgICogQGJyaWVmIFVTQVJUIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9VU0FSVF9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVVNBUlRfUHJpdmF0ZV9Db25zdGFudHMgVVNBUlQgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworI2RlZmluZSBVU0FSVF9EVU1NWV9EQVRBICAgICAgICAgICgodWludDE2X3QpIDB4RkZGRlUpICAgICAgICAgICAvKiE8IFVTQVJUIHRyYW5zbWl0dGVkIGR1bW15IGRhdGEgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9URUFDS19SRUFDS19USU1FT1VUICggMTAwMFUpICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVTQVJUIFRYIG9yIFJYIGVuYWJsZSBhY2tub3dsZWRnZSB0aW1lLW91dCB2YWx1ZSAqLworI2RlZmluZSBVU0FSVF9DUjFfRklFTERTICAgICAgICAgICgodWludDMyX3QpKFVTQVJUX0NSMV9NIHwgVVNBUlRfQ1IxX1BDRSB8IFVTQVJUX0NSMV9QUyB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfVEUgfCBVU0FSVF9DUjFfUkUgIHwgVVNBUlRfQ1IxX09WRVI4KSkgICAgLyohPCBVU0FSVCBDUjEgZmllbGRzIG9mIHBhcmFtZXRlcnMgc2V0IGJ5IFVTQVJUX1NldENvbmZpZyBBUEkgKi8KKyNkZWZpbmUgVVNBUlRfQ1IyX0ZJRUxEUyAgICAgICAgICAoKHVpbnQzMl90KShVU0FSVF9DUjJfQ1BIQSB8IFVTQVJUX0NSMl9DUE9MIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMl9DTEtFTiB8IFVTQVJUX0NSMl9MQkNMIHwgVVNBUlRfQ1IyX1NUT1ApKSAvKiE8IFVTQVJUIENSMiBmaWVsZHMgb2YgcGFyYW1ldGVycyBzZXQgYnkgVVNBUlRfU2V0Q29uZmlnIEFQSSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFVTQVJUX1ByaXZhdGVfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3N0YXRpYyB2b2lkIFVTQVJUX0VuZFRyYW5zZmVyKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CitzdGF0aWMgdm9pZCBVU0FSVF9ETUFUcmFuc21pdENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVVNBUlRfRE1BUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVVNBUlRfRE1BVHhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVU0FSVF9ETUFSeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFVTQVJUX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFVTQVJUX0RNQUFib3J0T25FcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVU0FSVF9ETUFUeEFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVVNBUlRfRE1BUnhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBVU0FSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDMyX3QgRmxhZywgRmxhZ1N0YXR1cyBTdGF0dXMsIHVpbnQzMl90IFRpY2tzdGFydCwgdWludDMyX3QgVGltZW91dCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgVVNBUlRfU2V0Q29uZmlnKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgVVNBUlRfQ2hlY2tJZGxlU3RhdGUoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBVU0FSVF9UcmFuc21pdF9JVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFVTQVJUX0VuZFRyYW5zbWl0X0lUKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgVVNBUlRfUmVjZWl2ZV9JVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFVTQVJUX1RyYW5zbWl0UmVjZWl2ZV9JVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9FeHBvcnRlZF9GdW5jdGlvbnMgVVNBUlQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIHRoZSBVU0FSVAorICAgIGluIGFzeW5jaHJvbm91cyBhbmQgaW4gc3luY2hyb25vdXMgbW9kZXMuCisgICAgICAoKykgRm9yIHRoZSBhc3luY2hyb25vdXMgbW9kZSBvbmx5IHRoZXNlIHBhcmFtZXRlcnMgY2FuIGJlIGNvbmZpZ3VyZWQ6CisgICAgICAgICgrKykgQmF1ZCBSYXRlCisgICAgICAgICgrKykgV29yZCBMZW5ndGgKKyAgICAgICAgKCsrKSBTdG9wIEJpdAorICAgICAgICAoKyspIFBhcml0eQorICAgICAgICAoKyspIFVTQVJUIHBvbGFyaXR5CisgICAgICAgICgrKykgVVNBUlQgcGhhc2UKKyAgICAgICAgKCsrKSBVU0FSVCBMYXN0Qml0CisgICAgICAgICgrKykgUmVjZWl2ZXIvdHJhbnNtaXR0ZXIgbW9kZXMKKworICAgIFsuLl0KKyAgICBUaGUgSEFMX1VTQVJUX0luaXQoKSBmdW5jdGlvbiBmb2xsb3dzIHRoZSBVU0FSVCAgc3luY2hyb25vdXMgY29uZmlndXJhdGlvbgorICAgIHByb2NlZHVyZSAoZGV0YWlscyBmb3IgdGhlIHByb2NlZHVyZSBhcmUgYXZhaWxhYmxlIGluIHJlZmVyZW5jZSBtYW51YWwpLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKgorICBBZGRpdGlvbmFsIFRhYmxlOiAgSWYgdGhlIHBhcml0eSBpcyBlbmFibGVkLCB0aGVuIHRoZSBNU0IgYml0IG9mIHRoZSBkYXRhIHdyaXR0ZW4KKyAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBkYXRhIHJlZ2lzdGVyIGlzIHRyYW5zbWl0dGVkIGJ1dCBpcyBjaGFuZ2VkIGJ5IHRoZSBwYXJpdHkgYml0LgorICAgICAgICAgICAgICAgICAgICAgQWNjb3JkaW5nIHRvIGRldmljZSBjYXBhYmlsaXR5IChzdXBwb3J0IG9yIG5vdCBvZiA3LWJpdCB3b3JkIGxlbmd0aCksCisgICAgICAgICAgICAgICAgICAgICBmcmFtZSBsZW5ndGggaXMgZWl0aGVyIGRlZmluZWQgYnkgdGhlIE0gYml0ICg4LWJpdHMgb3IgOS1iaXRzKQorICAgICAgICAgICAgICAgICAgICAgb3IgYnkgdGhlIE0xIGFuZCBNMCBiaXRzICg3LWJpdCwgOC1iaXQgb3IgOS1iaXQpLgorICAgICAgICAgICAgICAgICAgICAgUG9zc2libGUgVVNBUlQgZnJhbWUgZm9ybWF0cyBhcmUgYXMgbGlzdGVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKKyAgICAgIFRhYmxlIDEuIFVTQVJUIGZyYW1lIGZvcm1hdC4gICAgICAgICAgICAgCisgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICB8ICAgICAgIE0gYml0ICAgICAgIHwgIFBDRSBiaXQgIHwgICAgICAgICAgICAgVVNBUlQgZnJhbWUgICAgICAgICAgICAgICAgfAorICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAgfCAgICAgICAgIDAgICAgICAgICB8ICAgICAwICAgICB8ICAgIHwgU0IgfCAgICA4LWJpdCBkYXRhICAgfCBTVEIgfCAgICAgfAorICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAgfCAgICAgICAgIDAgICAgICAgICB8ICAgICAxICAgICB8ICAgIHwgU0IgfCA3LWJpdCBkYXRhIHwgUEIgfCBTVEIgfCAgICAgfAorICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAgfCAgICAgICAgIDEgICAgICAgICB8ICAgICAwICAgICB8ICAgIHwgU0IgfCAgICA5LWJpdCBkYXRhICAgfCBTVEIgfCAgICAgfAorICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAgfCAgICAgICAgIDEgICAgICAgICB8ICAgICAxICAgICB8ICAgIHwgU0IgfCA4LWJpdCBkYXRhIHwgUEIgfCBTVEIgfCAgICAgfAorICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgfCAgTTEgYml0IHwgIE0wIGJpdCB8ICBQQ0UgYml0ICB8ICAgICAgICAgICAgIFVTQVJUIGZyYW1lICAgICAgICAgICAgICAgIHwKKyAgICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgIHwgICAgMCAgICB8ICAgIDAgICAgfCAgICAgMCAgICAgfCAgICB8IFNCIHwgICAgOCBiaXQgZGF0YSAgIHwgU1RCIHwgICAgIHwKKyAgICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgIHwgICAgMCAgICB8ICAgIDAgICAgfCAgICAgMSAgICAgfCAgICB8IFNCIHwgNyBiaXQgZGF0YSB8IFBCIHwgU1RCIHwgICAgIHwKKyAgICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgIHwgICAgMCAgICB8ICAgIDEgICAgfCAgICAgMCAgICAgfCAgICB8IFNCIHwgICAgOSBiaXQgZGF0YSAgIHwgU1RCIHwgICAgIHwKKyAgICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgIHwgICAgMCAgICB8ICAgIDEgICAgfCAgICAgMSAgICAgfCAgICB8IFNCIHwgOCBiaXQgZGF0YSB8IFBCIHwgU1RCIHwgICAgIHwKKyAgICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgIHwgICAgMSAgICB8ICAgIDAgICAgfCAgICAgMCAgICAgfCAgICB8IFNCIHwgICAgNyBiaXQgZGF0YSAgIHwgU1RCIHwgICAgIHwKKyAgICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgIHwgICAgMSAgICB8ICAgIDAgICAgfCAgICAgMSAgICAgfCAgICB8IFNCIHwgNiBiaXQgZGF0YSB8IFBCIHwgU1RCIHwgICAgIHwKKyAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKworKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBVU0FSVCBtb2RlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBVU0FSVF9Jbml0VHlwZURlZiBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX0luaXQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICAvKiBDaGVjayB0aGUgVVNBUlQgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYoaHVzYXJ0ID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0lOU1RBTkNFKGh1c2FydC0+SW5zdGFuY2UpKTsKKworICBpZihodXNhcnQtPlN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBodXNhcnQtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSyAqLworICAgIEhBTF9VU0FSVF9Nc3BJbml0KGh1c2FydCk7CisgIH0KKworICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VU0FSVF9ESVNBQkxFKGh1c2FydCk7CisKKyAgLyogU2V0IHRoZSBVc2FydCBDb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgKi8KKyAgaWYgKFVTQVJUX1NldENvbmZpZyhodXNhcnQpID09IEhBTF9FUlJPUikKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBJbiBTeW5jaHJvbm91cyBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CisgIC0gTElORU4gYml0IGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIKKyAgLSBIRFNFTCwgU0NFTiBhbmQgSVJFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuKi8KKyAgaHVzYXJ0LT5JbnN0YW5jZS0+Q1IyICY9IH5VU0FSVF9DUjJfTElORU47CisgIGh1c2FydC0+SW5zdGFuY2UtPkNSMyAmPSB+KFVTQVJUX0NSM19TQ0VOIHwgVVNBUlRfQ1IzX0hEU0VMIHwgVVNBUlRfQ1IzX0lSRU4pOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VU0FSVF9FTkFCTEUoaHVzYXJ0KTsKKworICAvKiBURUFDSyBhbmQvb3IgUkVBQ0sgdG8gY2hlY2sgYmVmb3JlIG1vdmluZyBodXNhcnQtPlN0YXRlIHRvIFJlYWR5ICovCisgIHJldHVybiAoVVNBUlRfQ2hlY2tJZGxlU3RhdGUoaHVzYXJ0KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplIHRoZSBVU0FSVCBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9EZUluaXQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICAvKiBDaGVjayB0aGUgVVNBUlQgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYoaHVzYXJ0ID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0lOU1RBTkNFKGh1c2FydC0+SW5zdGFuY2UpKTsKKworICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX0JVU1k7CisKKyAgaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxID0gMHgwVTsKKyAgaHVzYXJ0LT5JbnN0YW5jZS0+Q1IyID0gMHgwVTsKKyAgaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzID0gMHgwVTsKKworICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICBIQUxfVVNBUlRfTXNwRGVJbml0KGh1c2FydCk7CisKKyAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfTk9ORTsKKyAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRVNFVDsKKworICAvKiBQcm9jZXNzIFVubG9jayAqLworICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFVTQVJUIE1TUC4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVVNBUlRfTXNwSW5pdChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1c2FydCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9VU0FSVF9Nc3BJbml0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgVVNBUlQgTVNQLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9VU0FSVF9Nc3BEZUluaXQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodXNhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVVNBUlRfTXNwRGVJbml0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBVU0FSVCBUcmFuc21pdCBhbmQgUmVjZWl2ZSBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgVVNBUlQgc3luY2hyb25vdXMKKyAgICBkYXRhIHRyYW5zZmVycy4KKworICAgIFsuLl0gVGhlIFVTQVJUIHN1cHBvcnRzIG1hc3RlciBtb2RlIG9ubHk6IGl0IGNhbm5vdCByZWNlaXZlIG9yIHNlbmQgZGF0YSByZWxhdGVkIHRvIGFuIGlucHV0CisgICAgICAgICBjbG9jayAoU0NMSyBpcyBhbHdheXMgYW4gb3V0cHV0KS4KKworICAgICgjKSBUaGVyZSBhcmUgdHdvIG1vZGVzIG9mIHRyYW5zZmVyOgorICAgICAgICgrKykgQmxvY2tpbmcgbW9kZTogVGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIGluIHBvbGxpbmcgbW9kZS4KKyAgICAgICAgICAgIFRoZSBIQUwgc3RhdHVzIG9mIGFsbCBkYXRhIHByb2Nlc3NpbmcgaXMgcmV0dXJuZWQgYnkgdGhlIHNhbWUgZnVuY3Rpb24KKyAgICAgICAgICAgIGFmdGVyIGZpbmlzaGluZyB0cmFuc2Zlci4KKyAgICAgICAoKyspIE5vLUJsb2NraW5nIG1vZGU6IFRoZSBjb21tdW5pY2F0aW9uIGlzIHBlcmZvcm1lZCB1c2luZyBJbnRlcnJ1cHRzCisgICAgICAgICAgIG9yIERNQSwgVGhlc2UgQVBJcyByZXR1cm4gdGhlIEhBTCBzdGF0dXMuCisgICAgICAgICAgIFRoZSBlbmQgb2YgdGhlIGRhdGEgcHJvY2Vzc2luZyB3aWxsIGJlIGluZGljYXRlZCB0aHJvdWdoIHRoZQorICAgICAgICAgICBkZWRpY2F0ZWQgVVNBUlQgSVJRIHdoZW4gdXNpbmcgSW50ZXJydXB0IG1vZGUgb3IgdGhlIERNQSBJUlEgd2hlbgorICAgICAgICAgICB1c2luZyBETUEgbW9kZS4KKyAgICAgICAgICAgVGhlIEhBTF9VU0FSVF9UeENwbHRDYWxsYmFjaygpLCBIQUxfVVNBUlRfUnhDcGx0Q2FsbGJhY2soKSBhbmQgSEFMX1VTQVJUX1R4UnhDcGx0Q2FsbGJhY2soKSB1c2VyIGNhbGxiYWNrcworICAgICAgICAgICB3aWxsIGJlIGV4ZWN1dGVkIHJlc3BlY3RpdmVseSBhdCB0aGUgZW5kIG9mIHRoZSB0cmFuc21pdCBvciBSZWNlaXZlIHByb2Nlc3MKKyAgICAgICAgICAgVGhlIEhBTF9VU0FSVF9FcnJvckNhbGxiYWNrKCl1c2VyIGNhbGxiYWNrIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiBhIGNvbW11bmljYXRpb24gZXJyb3IgaXMgZGV0ZWN0ZWQKKworICAgICgjKSBCbG9ja2luZyBtb2RlIEFQSXMgYXJlIDoKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfVHJhbnNtaXQoKSBpbiBzaW1wbGV4IG1vZGUKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfUmVjZWl2ZSgpIGluIGZ1bGwgZHVwbGV4IHJlY2VpdmUgb25seQorICAgICAgICAoKyspIEhBTF9VU0FSVF9UcmFuc21pdFJlY2VpdmUoKSBpbiBmdWxsIGR1cGxleCBtb2RlCisKKyAgICAoIykgTm8tQmxvY2tpbmcgbW9kZSBBUElzIHdpdGggSW50ZXJydXB0IGFyZSA6CisgICAgICAgICgrKykgSEFMX1VTQVJUX1RyYW5zbWl0X0lUKCkgaW4gc2ltcGxleCBtb2RlCisgICAgICAgICgrKykgSEFMX1VTQVJUX1JlY2VpdmVfSVQoKSBpbiBmdWxsIGR1cGxleCByZWNlaXZlIG9ubHkKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfVHJhbnNtaXRSZWNlaXZlX0lUKClpbiBmdWxsIGR1cGxleCBtb2RlCisgICAgICAgICgrKykgSEFMX1VTQVJUX0lSUUhhbmRsZXIoKQorCisgICAgKCMpIE5vLUJsb2NraW5nIG1vZGUgQVBJcyB3aXRoIERNQSBhcmUgOgorICAgICAgICAoKyspIEhBTF9VU0FSVF9UcmFuc21pdF9ETUEoKSBpbiBzaW1wbGV4IG1vZGUKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfUmVjZWl2ZV9ETUEoKSBpbiBmdWxsIGR1cGxleCByZWNlaXZlIG9ubHkKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfVHJhbnNtaXRSZWNlaXZlX0RNQSgpIGluIGZ1bGwgZHVwbGV4IG1vZGUKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfRE1BUGF1c2UoKQorICAgICAgICAoKyspIEhBTF9VU0FSVF9ETUFSZXN1bWUoKQorICAgICAgICAoKyspIEhBTF9VU0FSVF9ETUFTdG9wKCkKKworICAgICgjKSBBIHNldCBvZiBUcmFuc2ZlciBDb21wbGV0ZSBDYWxsYmFja3MgYXJlIHByb3ZpZGVkIGluIE5vLUJsb2NraW5nIG1vZGU6CisgICAgICAgICgrKykgSEFMX1VTQVJUX1R4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfUnhDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9VU0FSVF9UeEhhbGZDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9VU0FSVF9SeEhhbGZDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9VU0FSVF9FcnJvckNhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfVHhSeENwbHRDYWxsYmFjaygpCisKKyAgICAoIykgTm9uLUJsb2NraW5nIG1vZGUgdHJhbnNmZXJzIGNvdWxkIGJlIGFib3J0ZWQgdXNpbmcgQWJvcnQgQVBJJ3MgOgorICAgICAgICAoKyspIEhBTF9VU0FSVF9BYm9ydCgpCisgICAgICAgICgrKykgSEFMX1VTQVJUX0Fib3J0X0lUKCkKKworICAgICgjKSBGb3IgQWJvcnQgc2VydmljZXMgYmFzZWQgb24gaW50ZXJydXB0cyAoSEFMX1VTQVJUX0Fib3J0X0lUKSwgYSBBYm9ydCBDb21wbGV0ZSBDYWxsYmFja3MgaXMgcHJvdmlkZWQ6CisgICAgICAgICgrKykgSEFMX1VTQVJUX0Fib3J0Q3BsdENhbGxiYWNrKCkKKworICAgICgjKSBJbiBOb24tQmxvY2tpbmcgbW9kZSB0cmFuc2ZlcnMsIHBvc3NpYmxlIGVycm9ycyBhcmUgc3BsaXQgaW50byAyIGNhdGVnb3JpZXMuCisgICAgICAgIEVycm9ycyBhcmUgaGFuZGxlZCBhcyBmb2xsb3dzIDoKKyAgICAgICAgKCsrKSBFcnJvciBpcyBjb25zaWRlcmVkIGFzIFJlY292ZXJhYmxlIGFuZCBub24gYmxvY2tpbmcgOiBUcmFuc2ZlciBjb3VsZCBnbyB0aWxsIGVuZCwgYnV0IGVycm9yIHNldmVyaXR5IGlzIAorICAgICAgICAgICAgIHRvIGJlIGV2YWx1YXRlZCBieSB1c2VyIDogdGhpcyBjb25jZXJucyBGcmFtZSBFcnJvciwgUGFyaXR5IEVycm9yIG9yIE5vaXNlIEVycm9yIGluIEludGVycnVwdCBtb2RlIHJlY2VwdGlvbiAuCisgICAgICAgICAgICAgUmVjZWl2ZWQgY2hhcmFjdGVyIGlzIHRoZW4gcmV0cmlldmVkIGFuZCBzdG9yZWQgaW4gUnggYnVmZmVyLCBFcnJvciBjb2RlIGlzIHNldCB0byBhbGxvdyB1c2VyIHRvIGlkZW50aWZ5IGVycm9yIHR5cGUsCisgICAgICAgICAgICAgYW5kIEhBTF9VU0FSVF9FcnJvckNhbGxiYWNrKCkgdXNlciBjYWxsYmFjayBpcyBleGVjdXRlZC4gVHJhbnNmZXIgaXMga2VwdCBvbmdvaW5nIG9uIFVTQVJUIHNpZGUuCisgICAgICAgICAgICAgSWYgdXNlciB3YW50cyB0byBhYm9ydCBpdCwgQWJvcnQgc2VydmljZXMgc2hvdWxkIGJlIGNhbGxlZCBieSB1c2VyLgorICAgICAgICAoKyspIEVycm9yIGlzIGNvbnNpZGVyZWQgYXMgQmxvY2tpbmcgOiBUcmFuc2ZlciBjb3VsZCBub3QgYmUgY29tcGxldGVkIHByb3Blcmx5IGFuZCBpcyBhYm9ydGVkLgorICAgICAgICAgICAgIFRoaXMgY29uY2VybnMgT3ZlcnJ1biBFcnJvciBJbiBJbnRlcnJ1cHQgbW9kZSByZWNlcHRpb24gYW5kIGFsbCBlcnJvcnMgaW4gRE1BIG1vZGUuCisgICAgICAgICAgICAgRXJyb3IgY29kZSBpcyBzZXQgdG8gYWxsb3cgdXNlciB0byBpZGVudGlmeSBlcnJvciB0eXBlLCBhbmQgSEFMX1VTQVJUX0Vycm9yQ2FsbGJhY2soKSB1c2VyIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNpbXBsZXggc2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBUeERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudC4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9UcmFuc21pdChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQxNl90KiB0bXA9MFU7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDBVOworCisgIGlmKGh1c2FydC0+U3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYoKHBUeERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhodXNhcnQpOworCisgICAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfTk9ORTsKKyAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFg7CisKKyAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ21lbnQqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICBodXNhcnQtPlR4WGZlclNpemUgPSBTaXplOworICAgIGh1c2FydC0+VHhYZmVyQ291bnQgPSBTaXplOworCisgICAgLyogQ2hlY2sgdGhlIHJlbWFpbmluZyBkYXRhIHRvIGJlIHNlbnQgKi8KKyAgICB3aGlsZShodXNhcnQtPlR4WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgaHVzYXJ0LT5UeFhmZXJDb3VudC0tOworICAgICAgaWYoVVNBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodXNhcnQsIFVTQVJUX0ZMQUdfVEMsIFJFU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgICAgaWYoKGh1c2FydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVTQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodXNhcnQtPkluaXQuUGFyaXR5ID09IFVTQVJUX1BBUklUWV9OT05FKSkKKyAgICAgIHsKKyAgICAgICAgdG1wID0gKHVpbnQxNl90KikgcFR4RGF0YTsKKyAgICAgICAgaHVzYXJ0LT5JbnN0YW5jZS0+VERSID0gKCp0bXAgJiAodWludDE2X3QpMHgwMUZGVSk7CisgICAgICAgIHBUeERhdGEgKz0gMlU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGh1c2FydC0+SW5zdGFuY2UtPlREUiA9ICgqcFR4RGF0YSsrICYgKHVpbnQ4X3QpMHhGRlUpOworICAgICAgfQorICAgIH0KKworICAgIGlmKFVTQVJUX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaHVzYXJ0LCBVU0FSVF9GTEFHX1RDLCBSRVNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKworICAgIC8qIEF0IGVuZCBvZiBUeCBwcm9jZXNzLCByZXN0b3JlIGh1c2FydC0+U3RhdGUgdG8gUmVhZHkgKi8KKyAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuCisgICogQG5vdGUgICBUbyByZWNlaXZlIHN5bmNocm9ub3VzIGRhdGEsIGR1bW15IGRhdGEgYXJlIHNpbXVsdGFuZW91c2x5IHRyYW5zbWl0dGVkLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBSeERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgcmVjZWl2ZWQuCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfUmVjZWl2ZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQxNl90KiB0bXA9MFU7CisgIHVpbnQxNl90IHVoTWFzazsKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gMFU7CisKKyAgaWYoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZigocFJ4RGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGh1c2FydCk7CisKKyAgICBodXNhcnQtPkVycm9yQ29kZSA9IEhBTF9VU0FSVF9FUlJPUl9OT05FOworICAgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9SWDsKKworICAgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnbWVudCovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIGh1c2FydC0+UnhYZmVyU2l6ZSA9IFNpemU7CisgICAgaHVzYXJ0LT5SeFhmZXJDb3VudCA9IFNpemU7CisKKyAgICAvKiBDb21wdXRhdGlvbiBvZiBVU0FSVCBtYXNrIHRvIGFwcGx5IHRvIFJEUiByZWdpc3RlciAqLworICAgIFVTQVJUX01BU0tfQ09NUFVUQVRJT04oaHVzYXJ0KTsKKyAgICB1aE1hc2sgPSBodXNhcnQtPk1hc2s7CisKKyAgICAvKiBhcyBsb25nIGFzIGRhdGEgaGF2ZSB0byBiZSByZWNlaXZlZCAqLworICAgIHdoaWxlKGh1c2FydC0+UnhYZmVyQ291bnQgPiAwVSkKKyAgICB7CisgICAgICBodXNhcnQtPlJ4WGZlckNvdW50LS07CisKKyAgICAgIC8qIFdhaXQgdW50aWwgVEMgZmxhZyBpcyBzZXQgdG8gc2VuZCBkdW1teSBieXRlIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZQorICAgICAgKiBjbG9jayBmb3IgdGhlIHNsYXZlIHRvIHNlbmQgZGF0YS4KKyAgICAgICAqIFdoYXRldmVyIHRoZSBmcmFtZSBsZW5ndGggKDcsIDggb3IgOS1iaXQgbG9uZyksIHRoZSBzYW1lIGR1bW15IHZhbHVlCisgICAgICAgKiBjYW4gYmUgd3JpdHRlbiBmb3IgYWxsIHRoZSBjYXNlcy4gKi8KKyAgICAgIGlmKFVTQVJUX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaHVzYXJ0LCBVU0FSVF9GTEFHX1RDLCBSRVNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICAgIGh1c2FydC0+SW5zdGFuY2UtPlREUiA9IChVU0FSVF9EVU1NWV9EQVRBICYgKHVpbnQxNl90KTB4MEZGVSk7CisKKyAgICAgIC8qIFdhaXQgZm9yIFJYTkUgRmxhZyAqLworICAgICAgaWYoVVNBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodXNhcnQsIFVTQVJUX0ZMQUdfUlhORSwgUkVTRVQsIHRpY2tzdGFydCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisKKyAgICAgIGlmKChodXNhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVzYXJ0LT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkpCisgICAgICB7CisgICAgICAgIHRtcCA9ICh1aW50MTZfdCopIHBSeERhdGEgOworICAgICAgICAqdG1wID0gKHVpbnQxNl90KShodXNhcnQtPkluc3RhbmNlLT5SRFIgJiB1aE1hc2spOworICAgICAgICBwUnhEYXRhICs9MlU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICpwUnhEYXRhKysgPSAodWludDhfdCkoaHVzYXJ0LT5JbnN0YW5jZS0+UkRSICYgKHVpbnQ4X3QpdWhNYXNrKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBBdCBlbmQgb2YgUnggcHJvY2VzcywgcmVzdG9yZSBodXNhcnQtPlN0YXRlIHRvIFJlYWR5ICovCisgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgRnVsbC1EdXBsZXggU2VuZCBhbmQgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBUeERhdGEgcG9pbnRlciB0byBUWCBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIHBSeERhdGEgcG9pbnRlciB0byBSWCBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudCAoc2FtZSBhbW91bnQgdG8gYmUgcmVjZWl2ZWQpLgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQxNl90KiB0bXA9MFU7CisgIHVpbnQxNl90IHVoTWFzazsKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gMFU7CisKKyAgaWYoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZigocFR4RGF0YSA9PSBOVUxMKSB8fCAocFJ4RGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGh1c2FydCk7CisKKyAgICBodXNhcnQtPkVycm9yQ29kZSA9IEhBTF9VU0FSVF9FUlJPUl9OT05FOworICAgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9SWDsKKworICAgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnbWVudCovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIGh1c2FydC0+UnhYZmVyU2l6ZSA9IFNpemU7CisgICAgaHVzYXJ0LT5UeFhmZXJTaXplID0gU2l6ZTsKKyAgICBodXNhcnQtPlR4WGZlckNvdW50ID0gU2l6ZTsKKyAgICBodXNhcnQtPlJ4WGZlckNvdW50ID0gU2l6ZTsKKworICAgIC8qIENvbXB1dGF0aW9uIG9mIFVTQVJUIG1hc2sgdG8gYXBwbHkgdG8gUkRSIHJlZ2lzdGVyICovCisgICAgVVNBUlRfTUFTS19DT01QVVRBVElPTihodXNhcnQpOworICAgIHVoTWFzayA9IGh1c2FydC0+TWFzazsKKworICAgIC8qIENoZWNrIHRoZSByZW1haW4gZGF0YSB0byBiZSBzZW50ICovCisgICAgd2hpbGUoaHVzYXJ0LT5UeFhmZXJDb3VudCA+IDBVKQorICAgIHsKKyAgICAgIGh1c2FydC0+VHhYZmVyQ291bnQtLTsKKyAgICAgIGh1c2FydC0+UnhYZmVyQ291bnQtLTsKKworICAgICAgLyogV2FpdCB1bnRpbCBUQyBmbGFnIGlzIHNldCB0byBzZW5kIGRhdGEgKi8KKyAgICAgIGlmKFVTQVJUX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaHVzYXJ0LCBVU0FSVF9GTEFHX1RDLCBSRVNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICAgIGlmKChodXNhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVzYXJ0LT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkpCisgICAgICB7CisgICAgICAgIHRtcCA9ICh1aW50MTZfdCopIHBUeERhdGE7CisgICAgICAgIGh1c2FydC0+SW5zdGFuY2UtPlREUiA9ICgqdG1wICYgdWhNYXNrKTsKKyAgICAgICAgcFR4RGF0YSArPSAyVTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5JbnN0YW5jZS0+VERSID0gKCpwVHhEYXRhKysgJiAodWludDhfdCl1aE1hc2spOworICAgICAgfQorCisgICAgICAvKiBXYWl0IGZvciBSWE5FIEZsYWcgKi8KKyAgICAgIGlmKFVTQVJUX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaHVzYXJ0LCBVU0FSVF9GTEFHX1JYTkUsIFJFU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorCisgICAgICBpZigoaHVzYXJ0LT5Jbml0LldvcmRMZW5ndGggPT0gVVNBUlRfV09SRExFTkdUSF85QikgJiYgKGh1c2FydC0+SW5pdC5QYXJpdHkgPT0gVVNBUlRfUEFSSVRZX05PTkUpKQorICAgICAgeworICAgICAgICB0bXAgPSAodWludDE2X3QqKSBwUnhEYXRhIDsKKyAgICAgICAgKnRtcCA9ICh1aW50MTZfdCkoaHVzYXJ0LT5JbnN0YW5jZS0+UkRSICYgdWhNYXNrKTsKKyAgICAgICAgcFJ4RGF0YSArPTJVOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAqcFJ4RGF0YSsrID0gKHVpbnQ4X3QpKGh1c2FydC0+SW5zdGFuY2UtPlJEUiAmICh1aW50OF90KXVoTWFzayk7CisgICAgICB9CisgICAgfQorCisgICAgLyogQXQgZW5kIG9mIFR4UnggcHJvY2VzcywgcmVzdG9yZSBodXNhcnQtPlN0YXRlIHRvIFJlYWR5ICovCisgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHBhcmFtICBwVHhEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfVHJhbnNtaXRfSVQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50OF90ICpwVHhEYXRhLCB1aW50MTZfdCBTaXplKQoreworICBpZihodXNhcnQtPlN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmKChwVHhEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhodXNhcnQpOworCisgICAgaHVzYXJ0LT5wVHhCdWZmUHRyID0gcFR4RGF0YTsKKyAgICBodXNhcnQtPlR4WGZlclNpemUgPSBTaXplOworICAgIGh1c2FydC0+VHhYZmVyQ291bnQgPSBTaXplOworCisgICAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfTk9ORTsKKyAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFg7CisKKyAgICAvKiBUaGUgVVNBUlQgRXJyb3IgSW50ZXJydXB0czogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikKKyAgICBhcmUgbm90IG1hbmFnZWQgYnkgdGhlIFVTQVJUIFRyYW5zbWl0IFByb2Nlc3MgdG8gYXZvaWQgdGhlIG92ZXJydW4gaW50ZXJydXB0CisgICAgd2hlbiB0aGUgdXNhcnQgbW9kZSBpcyBjb25maWd1cmVkIGZvciB0cmFuc21pdCBhbmQgcmVjZWl2ZSAiVVNBUlRfTU9ERV9UWF9SWCIKKyAgICB0byBiZW5lZml0IGZvciB0aGUgZnJhbWUgZXJyb3IgYW5kIG5vaXNlIGludGVycnVwdHMgdGhlIHVzYXJ0IG1vZGUgc2hvdWxkIGJlCisgICAgY29uZmlndXJlZCBvbmx5IGZvciB0cmFuc21pdCAiVVNBUlRfTU9ERV9UWCIgKi8KKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBFbXB0eSBJbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9VU0FSVF9FTkFCTEVfSVQoaHVzYXJ0LCBVU0FSVF9JVF9UWEUpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGludGVycnVwdCBtb2RlLgorICAqIEBub3RlICAgVG8gcmVjZWl2ZSBzeW5jaHJvbm91cyBkYXRhLCBkdW1teSBkYXRhIGFyZSBzaW11bHRhbmVvdXNseSB0cmFuc21pdHRlZC4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHBhcmFtICBwUnhEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1JlY2VpdmVfSVQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50OF90ICpwUnhEYXRhLCB1aW50MTZfdCBTaXplKQoreworICBpZihodXNhcnQtPlN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmKChwUnhEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhodXNhcnQpOworCisgICAgaHVzYXJ0LT5wUnhCdWZmUHRyID0gcFJ4RGF0YTsKKyAgICBodXNhcnQtPlJ4WGZlclNpemUgPSBTaXplOworICAgIGh1c2FydC0+UnhYZmVyQ291bnQgPSBTaXplOworCisgICAgVVNBUlRfTUFTS19DT01QVVRBVElPTihodXNhcnQpOworCisgICAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfTk9ORTsKKyAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfUlg7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgICAvKiBFbmFibGUgdGhlIFVTQVJUIFBhcml0eSBFcnJvciBhbmQgRGF0YSBSZWdpc3RlciBub3QgZW1wdHkgSW50ZXJydXB0cyAqLworICAgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9SWE5FSUUpOworCisgICAgLyogRW5hYmxlIHRoZSBVU0FSVCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpICovCisgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgLyogU2VuZCBkdW1teSBieXRlIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBjbG9jayBmb3IgdGhlIFNsYXZlIHRvIHNlbmQgdGhlIG5leHQgZGF0YSAqLworICAgIGlmKGh1c2FydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVTQVJUX1dPUkRMRU5HVEhfOUIpCisgICAgeworICAgICAgaHVzYXJ0LT5JbnN0YW5jZS0+VERSID0gKFVTQVJUX0RVTU1ZX0RBVEEgJiAodWludDE2X3QpMHgwMUZGVSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBodXNhcnQtPkluc3RhbmNlLT5URFIgPSAoVVNBUlRfRFVNTVlfREFUQSAmICh1aW50MTZfdCkweDAwRkZVKTsKKyAgICB9CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEZ1bGwtRHVwbGV4IFNlbmQgYW5kIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEBwYXJhbSAgcFR4RGF0YSBwb2ludGVyIHRvIFRYIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgcFJ4RGF0YSBwb2ludGVyIHRvIFJYIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSBzZW50IChzYW1lIGFtb3VudCB0byBiZSByZWNlaXZlZCkuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfVHJhbnNtaXRSZWNlaXZlX0lUKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDhfdCAqcFR4RGF0YSwgdWludDhfdCAqcFJ4RGF0YSwgIHVpbnQxNl90IFNpemUpCit7CisKKyAgaWYoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZigocFR4RGF0YSA9PSBOVUxMKSB8fCAocFJ4RGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHVzYXJ0KTsKKworICAgIGh1c2FydC0+cFJ4QnVmZlB0ciA9IHBSeERhdGE7CisgICAgaHVzYXJ0LT5SeFhmZXJTaXplID0gU2l6ZTsKKyAgICBodXNhcnQtPlJ4WGZlckNvdW50ID0gU2l6ZTsKKyAgICBodXNhcnQtPnBUeEJ1ZmZQdHIgPSBwVHhEYXRhOworICAgIGh1c2FydC0+VHhYZmVyU2l6ZSA9IFNpemU7CisgICAgaHVzYXJ0LT5UeFhmZXJDb3VudCA9IFNpemU7CisKKyAgICAvKiBDb21wdXRhdGlvbiBvZiBVU0FSVCBtYXNrIHRvIGFwcGx5IHRvIFJEUiByZWdpc3RlciAqLworICAgIFVTQVJUX01BU0tfQ09NUFVUQVRJT04oaHVzYXJ0KTsKKworICAgIGh1c2FydC0+RXJyb3JDb2RlID0gSEFMX1VTQVJUX0VSUk9SX05PTkU7CisgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYX1JYOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgICAgLyogRW5hYmxlIHRoZSBVU0FSVCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpICovCisgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgLyogRW5hYmxlIHRoZSBVU0FSVCBQYXJpdHkgRXJyb3IgYW5kIFVTQVJUIERhdGEgUmVnaXN0ZXIgbm90IGVtcHR5IEludGVycnVwdHMgKi8KKyAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUgfCBVU0FSVF9DUjFfUlhORUlFKTsKKworICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBFbXB0eSBJbnRlcnJ1cHQgKi8KKyAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RYRUlFKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBETUEgbW9kZS4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHBhcmFtICBwVHhEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHN0YXJ0cyBhIERNQSB0cmFuc2ZlciBpbiBpbnRlcnJ1cHQgbW9kZSBtZWFuaW5nIHRoYXQKKyAgKiAgICAgICAgIERNQSBoYWxmIHRyYW5zZmVyIGNvbXBsZXRlLCBETUEgdHJhbnNmZXIgY29tcGxldGUgYW5kIERNQSB0cmFuc2ZlcgorICAqICAgICAgICAgZXJyb3IgaW50ZXJydXB0cyBhcmUgZW5hYmxlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0X0RNQShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIHVpbnQzMl90ICp0bXA9MFU7CisKKyAgaWYoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZigocFR4RGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHVzYXJ0KTsKKworICAgIGh1c2FydC0+cFR4QnVmZlB0ciA9IHBUeERhdGE7CisgICAgaHVzYXJ0LT5UeFhmZXJTaXplID0gU2l6ZTsKKyAgICBodXNhcnQtPlR4WGZlckNvdW50ID0gU2l6ZTsKKworICAgIGh1c2FydC0+RXJyb3JDb2RlID0gSEFMX1VTQVJUX0VSUk9SX05PTkU7CisgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYOworCisgICAgLyogU2V0IHRoZSBVU0FSVCBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBodXNhcnQtPmhkbWF0eC0+WGZlckNwbHRDYWxsYmFjayA9IFVTQVJUX0RNQVRyYW5zbWl0Q3BsdDsKKworICAgIC8qIFNldCB0aGUgVVNBUlQgRE1BIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBodXNhcnQtPmhkbWF0eC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBVU0FSVF9ETUFUeEhhbGZDcGx0OworCisgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICBodXNhcnQtPmhkbWF0eC0+WGZlckVycm9yQ2FsbGJhY2sgPSBVU0FSVF9ETUFFcnJvcjsKKworICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgdHJhbnNtaXQgRE1BIGNoYW5uZWwgKi8KKyAgICB0bXAgPSAodWludDMyX3QqKSZwVHhEYXRhOworICAgIEhBTF9ETUFfU3RhcnRfSVQoaHVzYXJ0LT5oZG1hdHgsICoodWludDMyX3QqKXRtcCwgKHVpbnQzMl90KSZodXNhcnQtPkluc3RhbmNlLT5URFIsIFNpemUpOworCisgICAgLyogQ2xlYXIgdGhlIFRDIGZsYWcgaW4gdGhlIElDUiByZWdpc3RlciAqLworICAgIF9fSEFMX1VTQVJUX0NMRUFSX0ZMQUcoaHVzYXJ0LCBVU0FSVF9DTEVBUl9UQ0YpOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgICAgLyogRW5hYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRyYW5zbWl0IHJlcXVlc3QgYnkgc2V0dGluZyB0aGUgRE1BVCBiaXQKKyAgICAgICBpbiB0aGUgVVNBUlQgQ1IzIHJlZ2lzdGVyICovCisgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBETUEgbW9kZS4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHBhcmFtICBwUnhEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkLgorICAqIEBub3RlICAgV2hlbiB0aGUgVVNBUlQgcGFyaXR5IGlzIGVuYWJsZWQgKFBDRSA9IDEpLCB0aGUgcmVjZWl2ZWQgZGF0YSBjb250YWluCisgICogICAgICAgICB0aGUgcGFyaXR5IGJpdCAoTVNCIHBvc2l0aW9uKS4KKyAgKiBAbm90ZSAgIFRoZSBVU0FSVCBETUEgdHJhbnNtaXQgY2hhbm5lbCBtdXN0IGJlIGNvbmZpZ3VyZWQgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIGNsb2NrIGZvciB0aGUgc2xhdmUuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHN0YXJ0cyBhIERNQSB0cmFuc2ZlciBpbiBpbnRlcnJ1cHQgbW9kZSBtZWFuaW5nIHRoYXQKKyAgKiAgICAgICAgIERNQSBoYWxmIHRyYW5zZmVyIGNvbXBsZXRlLCBETUEgdHJhbnNmZXIgY29tcGxldGUgYW5kIERNQSB0cmFuc2ZlcgorICAqICAgICAgICAgZXJyb3IgaW50ZXJydXB0cyBhcmUgZW5hYmxlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1JlY2VpdmVfRE1BKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDhfdCAqcFJ4RGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgdWludDMyX3QgKnRtcDsKKworICAvKiBDaGVjayB0aGF0IGEgUnggcHJvY2VzcyBpcyBub3QgYWxyZWFkeSBvbmdvaW5nICovCisgIGlmKGh1c2FydC0+U3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYoKHBSeERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGh1c2FydCk7CisKKyAgICBodXNhcnQtPnBSeEJ1ZmZQdHIgPSBwUnhEYXRhOworICAgIGh1c2FydC0+UnhYZmVyU2l6ZSA9IFNpemU7CisgICAgaHVzYXJ0LT5wVHhCdWZmUHRyID0gcFJ4RGF0YTsKKyAgICBodXNhcnQtPlR4WGZlclNpemUgPSBTaXplOworCisgICAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfTk9ORTsKKyAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfUlg7CisKKyAgICAvKiBTZXQgdGhlIFVTQVJUIERNQSBSeCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGh1c2FydC0+aGRtYXJ4LT5YZmVyQ3BsdENhbGxiYWNrID0gVVNBUlRfRE1BUmVjZWl2ZUNwbHQ7CisKKyAgICAvKiBTZXQgdGhlIFVTQVJUIERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgaHVzYXJ0LT5oZG1hcngtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVVNBUlRfRE1BUnhIYWxmQ3BsdDsKKworICAgIC8qIFNldCB0aGUgVVNBUlQgRE1BIFJ4IHRyYW5zZmVyIGVycm9yIGNhbGxiYWNrICovCisgICAgaHVzYXJ0LT5oZG1hcngtPlhmZXJFcnJvckNhbGxiYWNrID0gVVNBUlRfRE1BRXJyb3I7CisKKyAgICAvKiBFbmFibGUgdGhlIFVTQVJUIHJlY2VpdmUgRE1BIGNoYW5uZWwgKi8KKyAgICB0bXAgPSAodWludDMyX3QqKSZwUnhEYXRhOworICAgIEhBTF9ETUFfU3RhcnRfSVQoaHVzYXJ0LT5oZG1hcngsICh1aW50MzJfdCkmaHVzYXJ0LT5JbnN0YW5jZS0+UkRSLCAqKHVpbnQzMl90Kil0bXAsIFNpemUpOworCisgICAgLyogRW5hYmxlIHRoZSBVU0FSVCB0cmFuc21pdCBETUEgY2hhbm5lbDogdGhlIHRyYW5zbWl0IGNoYW5uZWwgaXMgdXNlZCBpbiBvcmRlcgorICAgICAgIHRvIGdlbmVyYXRlIGluIHRoZSBub24tYmxvY2tpbmcgbW9kZSB0aGUgY2xvY2sgdG8gdGhlIHNsYXZlIGRldmljZSwKKyAgICAgICB0aGlzIG1vZGUgaXNuJ3QgYSBzaW1wbGV4IHJlY2VpdmUgbW9kZSBidXQgYSBmdWxsLWR1cGxleCByZWNlaXZlIG1vZGUgKi8KKyAgICAvKiBTZXQgdGhlIFVTQVJUIERNQSBUeCBDb21wbGV0ZSBhbmQgRXJyb3IgY2FsbGJhY2sgdG8gTnVsbCAqLworICAgIGh1c2FydC0+aGRtYXR4LT5YZmVyRXJyb3JDYWxsYmFjayA9IE5VTEw7CisgICAgaHVzYXJ0LT5oZG1hdHgtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gTlVMTDsKKyAgICBodXNhcnQtPmhkbWF0eC0+WGZlckNwbHRDYWxsYmFjayA9IE5VTEw7CisgICAgSEFMX0RNQV9TdGFydF9JVChodXNhcnQtPmhkbWF0eCwgKih1aW50MzJfdCopdG1wLCAodWludDMyX3QpJmh1c2FydC0+SW5zdGFuY2UtPlREUiwgU2l6ZSk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgICAvKiBFbmFibGUgdGhlIFVTQVJUIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQgKi8KKyAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworCisgICAgLyogRW5hYmxlIHRoZSBVU0FSVCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpICovCisgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgLyogRW5hYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRoZSByZWNlaXZlciByZXF1ZXN0IGJ5IHNldHRpbmcgdGhlIERNQVIgYml0CisgICAgICAgaW4gdGhlIFVTQVJUIENSMyByZWdpc3RlciAqLworICAgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBFbmFibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgdHJhbnNtaXQgcmVxdWVzdCBieSBzZXR0aW5nIHRoZSBETUFUIGJpdAorICAgICAgIGluIHRoZSBVU0FSVCBDUjMgcmVnaXN0ZXIgKi8KKyAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBGdWxsLUR1cGxleCBUcmFuc21pdCBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBUeERhdGEgcG9pbnRlciB0byBUWCBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIHBSeERhdGEgcG9pbnRlciB0byBSWCBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgcmVjZWl2ZWQvc2VudC4KKyAgKiBAbm90ZSAgIFdoZW4gdGhlIFVTQVJUIHBhcml0eSBpcyBlbmFibGVkIChQQ0UgPSAxKSB0aGUgZGF0YSByZWNlaXZlZCBjb250YWluIHRoZSBwYXJpdHkgYml0LgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzdGFydHMgYSAyIERNQSB0cmFuc2ZlcnMgaW4gaW50ZXJydXB0IG1vZGUgbWVhbmluZyB0aGF0CisgICogICAgICAgICBETUEgaGFsZiB0cmFuc2ZlciBjb21wbGV0ZSwgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGFuZCBETUEgdHJhbnNmZXIKKyAgKiAgICAgICAgIGVycm9yIGludGVycnVwdHMgYXJlIGVuYWJsZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9UcmFuc21pdFJlY2VpdmVfRE1BKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDhfdCAqcFR4RGF0YSwgdWludDhfdCAqcFJ4RGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgdWludDMyX3QgKnRtcDsKKworICBpZihodXNhcnQtPlN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmKChwVHhEYXRhID09IE5VTEwpIHx8IChwUnhEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhodXNhcnQpOworCisgICAgaHVzYXJ0LT5wUnhCdWZmUHRyID0gcFJ4RGF0YTsKKyAgICBodXNhcnQtPlJ4WGZlclNpemUgPSBTaXplOworICAgIGh1c2FydC0+cFR4QnVmZlB0ciA9IHBUeERhdGE7CisgICAgaHVzYXJ0LT5UeFhmZXJTaXplID0gU2l6ZTsKKworICAgIGh1c2FydC0+RXJyb3JDb2RlID0gSEFMX1VTQVJUX0VSUk9SX05PTkU7CisgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYX1JYOworCisgICAgLyogU2V0IHRoZSBVU0FSVCBETUEgUnggdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBodXNhcnQtPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayA9IFVTQVJUX0RNQVJlY2VpdmVDcGx0OworCisgICAgLyogU2V0IHRoZSBVU0FSVCBETUEgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGh1c2FydC0+aGRtYXJ4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFVTQVJUX0RNQVJ4SGFsZkNwbHQ7CisKKyAgICAvKiBTZXQgdGhlIFVTQVJUIERNQSBUeCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGh1c2FydC0+aGRtYXR4LT5YZmVyQ3BsdENhbGxiYWNrID0gVVNBUlRfRE1BVHJhbnNtaXRDcGx0OworCisgICAgLyogU2V0IHRoZSBVU0FSVCBETUEgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGh1c2FydC0+aGRtYXR4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFVTQVJUX0RNQVR4SGFsZkNwbHQ7CisKKyAgICAvKiBTZXQgdGhlIFVTQVJUIERNQSBUeCB0cmFuc2ZlciBlcnJvciBjYWxsYmFjayAqLworICAgIGh1c2FydC0+aGRtYXR4LT5YZmVyRXJyb3JDYWxsYmFjayA9IFVTQVJUX0RNQUVycm9yOworCisgICAgLyogU2V0IHRoZSBVU0FSVCBETUEgUnggdHJhbnNmZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICBodXNhcnQtPmhkbWFyeC0+WGZlckVycm9yQ2FsbGJhY2sgPSBVU0FSVF9ETUFFcnJvcjsKKworICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgcmVjZWl2ZSBETUEgY2hhbm5lbCAqLworICAgIHRtcCA9ICh1aW50MzJfdCopJnBSeERhdGE7CisgICAgSEFMX0RNQV9TdGFydF9JVChodXNhcnQtPmhkbWFyeCwgKHVpbnQzMl90KSZodXNhcnQtPkluc3RhbmNlLT5SRFIsICoodWludDMyX3QqKXRtcCwgU2l6ZSk7CisKKyAgICAvKiBFbmFibGUgdGhlIFVTQVJUIHRyYW5zbWl0IERNQSBjaGFubmVsICovCisgICAgdG1wID0gKHVpbnQzMl90KikmcFR4RGF0YTsKKyAgICBIQUxfRE1BX1N0YXJ0X0lUKGh1c2FydC0+aGRtYXR4LCAqKHVpbnQzMl90Kil0bXAsICh1aW50MzJfdCkmaHVzYXJ0LT5JbnN0YW5jZS0+VERSLCBTaXplKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgUGFyaXR5IEVycm9yIEludGVycnVwdCAqLworICAgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisKKyAgICAvKiBFbmFibGUgdGhlIFVTQVJUIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAvKiBDbGVhciB0aGUgVEMgZmxhZyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgICAgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRyhodXNhcnQsIFVTQVJUX0NMRUFSX1RDRik7CisKKyAgICAvKiBFbmFibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgdGhlIHJlY2VpdmVyIHJlcXVlc3QgYnkgc2V0dGluZyB0aGUgRE1BUiBiaXQKKyAgICAgICBpbiB0aGUgVVNBUlQgQ1IzIHJlZ2lzdGVyICovCisgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEVuYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0cmFuc21pdCByZXF1ZXN0IGJ5IHNldHRpbmcgdGhlIERNQVQgYml0CisgICAgICAgaW4gdGhlIFVTQVJUIENSMyByZWdpc3RlciAqLworICAgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFBhdXNlIHRoZSBETUEgVHJhbnNmZXIuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX0RNQVBhdXNlKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodXNhcnQpOworCisgIGlmKCAoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWCkgJiYKKyAgICAgIChIQUxfSVNfQklUX1NFVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBETUEgVHggcmVxdWVzdCAqLworICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKyAgfQorICBlbHNlIGlmKCAoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9SWCkgfHwKKyAgICAgICAgICAgKGh1c2FydC0+U3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFhfUlgpICkKKyAgeworICAgIGlmIChIQUxfSVNfQklUX1NFVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBETUEgVHggcmVxdWVzdCAqLworICAgICAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworICAgIH0KKyAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgICAgeworICAgICAgLyogRGlzYWJsZSBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKyAgICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBETUEgUnggcmVxdWVzdCAqLworICAgICAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworICAgIH0KKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBSZXN1bWUgdGhlIERNQSBUcmFuc2Zlci4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfRE1BUmVzdW1lKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodXNhcnQpOworCisgIGlmKGh1c2FydC0+U3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFgpCisgIHsKKyAgICAvKiBFbmFibGUgdGhlIFVTQVJUIERNQSBUeCByZXF1ZXN0ICovCisgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKyAgfQorICBlbHNlIGlmKCAoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9SWCkgfHwKKyAgICAgICAgICAgKGh1c2FydC0+U3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFhfUlgpICkKKyAgeworICAgIC8qIENsZWFyIHRoZSBPdmVycnVuIGZsYWcgYmVmb3JlIHJlc3VtaW5nIHRoZSBSeCB0cmFuc2ZlciovCisgICAgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRyhodXNhcnQsIFVTQVJUX0NMRUFSX09SRUYpOworCisgICAgLyogUmVlbmFibGUgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKyAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAvKiBFbmFibGUgdGhlIFVTQVJUIERNQSBSeCByZXF1ZXN0ICBiZWZvcmUgdGhlIERNQSBUeCByZXF1ZXN0ICovCisgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgRE1BIFR4IHJlcXVlc3QgKi8KKyAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworICB9CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgdGhlIERNQSBUcmFuc2Zlci4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfRE1BU3RvcChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIFRoZSBMb2NrIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIEFQSSB0byBhbGxvdyB0aGUgdXNlciBhcHBsaWNhdGlvbgorICAgICB0byBjYWxsIHRoZSBIQUwgVVNBUlQgQVBJIHVuZGVyIGNhbGxiYWNrcyBIQUxfVVNBUlRfVHhDcGx0Q2FsbGJhY2soKSAvIEhBTF9VU0FSVF9SeENwbHRDYWxsYmFjaygpIC8KKyAgICAgSEFMX1VTQVJUX1R4SGFsZkNwbHRDYWxsYmFjaygpIC8gSEFMX1VTQVJUX1J4SGFsZkNwbHRDYWxsYmFjayAoKTogCisgICAgIGluZGVlZCwgd2hlbiBIQUxfRE1BX0Fib3J0KCkgQVBJIGlzIGNhbGxlZCwgdGhlIERNQSBUWC9SWCBUcmFuc2ZlciBvciBIYWxmIFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBpcyAKKyAgICAgZ2VuZXJhdGVkIGlmIHRoZSBETUEgdHJhbnNmZXIgaW50ZXJydXB0aW9uIG9jY3VycyBhdCB0aGUgbWlkZGxlIG9yIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbQorICAgICBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbCBiYWNrIGlzIGV4ZWN1dGVkLiAKKyAgICAgKi8KKworICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBUeC9SeCBETUEgcmVxdWVzdHMgKi8KKyAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgLyogQWJvcnQgdGhlIFVTQVJUIERNQSB0eCBjaGFubmVsICovCisgIGlmKGh1c2FydC0+aGRtYXR4ICE9IE5VTEwpCisgIHsKKyAgICBIQUxfRE1BX0Fib3J0KGh1c2FydC0+aGRtYXR4KTsKKyAgfQorICAvKiBBYm9ydCB0aGUgVVNBUlQgRE1BIHJ4IGNoYW5uZWwgKi8KKyAgaWYoaHVzYXJ0LT5oZG1hcnggIT0gTlVMTCkKKyAgeworICAgIEhBTF9ETUFfQWJvcnQoaHVzYXJ0LT5oZG1hcngpOworICB9CisKKyAgVVNBUlRfRW5kVHJhbnNmZXIoaHVzYXJ0KTsKKyAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IG9uZ29pbmcgdHJhbnNmZXJzIChibG9ja2luZyBtb2RlKS4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyB0cmFuc2ZlciBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4gCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBVU0FSVCBJbnRlcnJ1cHRzIChUeCBhbmQgUngpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gYmxvY2tpbmcgbW9kZSA6IHdoZW4gZXhpdGluZyBmdW5jdGlvbiwgQWJvcnQgaXMgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX0Fib3J0KFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgLyogRGlzYWJsZSBUWEVJRSwgVENJRSwgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFIHwgVVNBUlRfQ1IxX1BFSUUgfCBVU0FSVF9DUjFfVFhFSUUgfCBVU0FSVF9DUjFfVENJRSkpOworICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBETUEgVHggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgeworICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBVU0FSVCBETUEgVHggY2hhbm5lbCA6IHVzZSBibG9ja2luZyBETUEgQWJvcnQgQVBJIChubyBjYWxsYmFjaykgKi8KKyAgICBpZihodXNhcnQtPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgVVNBUlQgRE1BIEFib3J0IGNhbGxiYWNrIHRvIE51bGwuIAorICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaHVzYXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgICAgSEFMX0RNQV9BYm9ydChodXNhcnQtPmhkbWF0eCk7CisgICAgfQorICB9CisKKyAgLyogRGlzYWJsZSB0aGUgVVNBUlQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgIHsKKyAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBBYm9ydCB0aGUgVVNBUlQgRE1BIFJ4IGNoYW5uZWwgOiB1c2UgYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAobm8gY2FsbGJhY2spICovCisgICAgaWYoaHVzYXJ0LT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFVTQVJUIERNQSBBYm9ydCBjYWxsYmFjayB0byBOdWxsLiAKKyAgICAgICAgIE5vIGNhbGwgYmFjayBleGVjdXRpb24gYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgIGh1c2FydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIEhBTF9ETUFfQWJvcnQoaHVzYXJ0LT5oZG1hcngpOworICAgIH0KKyAgfQorCisgIC8qIFJlc2V0IFR4IGFuZCBSeCB0cmFuc2ZlciBjb3VudGVycyAqLworICBodXNhcnQtPlR4WGZlckNvdW50ID0gMFU7IAorICBodXNhcnQtPlJ4WGZlckNvdW50ID0gMFU7IAorCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgIF9fSEFMX1VTQVJUX0NMRUFSX0ZMQUcoaHVzYXJ0LCBVU0FSVF9DTEVBUl9PUkVGIHwgVVNBUlRfQ0xFQVJfTkVGIHwgVVNBUlRfQ0xFQVJfUEVGIHwgVVNBUlRfQ0xFQVJfRkVGKTsKKworICAvKiBSZXN0b3JlIGh1c2FydC0+U3RhdGUgdG8gUmVhZHkgKi8KKyAgaHVzYXJ0LT5TdGF0ZSAgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogUmVzZXQgSGFuZGxlIEVycm9yQ29kZSB0byBObyBFcnJvciAqLworICBodXNhcnQtPkVycm9yQ29kZSA9IEhBTF9VU0FSVF9FUlJPUl9OT05FOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgb25nb2luZyB0cmFuc2ZlcnMgKEludGVycnVwdCBtb2RlKS4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyB0cmFuc2ZlciBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4gCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBVU0FSVCBJbnRlcnJ1cHRzIChUeCBhbmQgUngpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnRfSVQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqICAgICAgICAgICAtIEF0IGFib3J0IGNvbXBsZXRpb24sIGNhbGwgdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjaworICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gSW50ZXJydXB0IG1vZGUsIG1lYW5pbmcgdGhhdCBhYm9ydCBwcm9jZWR1cmUgY291bGQgYmUKKyAgKiAgICAgICAgIGNvbnNpZGVyZWQgYXMgY29tcGxldGVkIG9ubHkgd2hlbiB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIChub3Qgd2hlbiBleGl0aW5nIGZ1bmN0aW9uKS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfQWJvcnRfSVQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICB1aW50MzJfdCBhYm9ydGNwbHQgPSAxVTsKKyAgCisgIC8qIERpc2FibGUgVFhFSUUsIFRDSUUsIFJYTkUsIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRSB8IFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1RYRUlFIHwgVVNBUlRfQ1IxX1RDSUUpKTsKKyAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgLyogSWYgRE1BIFR4IGFuZC9vciBETUEgUnggSGFuZGxlcyBhcmUgYXNzb2NpYXRlZCB0byBVU0FSVCBIYW5kbGUsIERNQSBBYm9ydCBjb21wbGV0ZSBjYWxsYmFja3Mgc2hvdWxkIGJlIGluaXRpYWxpc2VkCisgICAgIGJlZm9yZSBhbnkgY2FsbCB0byBETUEgQWJvcnQgZnVuY3Rpb25zICovCisgIC8qIERNQSBUeCBIYW5kbGUgaXMgdmFsaWQgKi8KKyAgaWYoaHVzYXJ0LT5oZG1hdHggIT0gTlVMTCkKKyAgeworICAgIC8qIFNldCBETUEgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgaWYgVVNBUlQgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZC4KKyAgICAgICBPdGhlcndpc2UsIHNldCBpdCB0byBOVUxMICovCisgICAgaWYoSEFMX0lTX0JJVF9TRVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgICAgeworICAgICAgaHVzYXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gVVNBUlRfRE1BVHhBYm9ydENhbGxiYWNrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHVzYXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICB9CisgIH0KKyAgLyogRE1BIFJ4IEhhbmRsZSBpcyB2YWxpZCAqLworICBpZihodXNhcnQtPmhkbWFyeCAhPSBOVUxMKQorICB7CisgICAgLyogU2V0IERNQSBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayBpZiBVU0FSVCBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkLgorICAgICAgIE90aGVyd2lzZSwgc2V0IGl0IHRvIE5VTEwgKi8KKyAgICBpZihIQUxfSVNfQklUX1NFVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgICB7CisgICAgICBodXNhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBVU0FSVF9ETUFSeEFib3J0Q2FsbGJhY2s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBodXNhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgIH0KKyAgfQorICAKKyAgLyogRGlzYWJsZSB0aGUgVVNBUlQgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZihIQUxfSVNfQklUX1NFVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgeworICAgIC8qIERpc2FibGUgRE1BIFR4IGF0IFVTQVJUIGxldmVsICovCisgICAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgLyogQWJvcnQgdGhlIFVTQVJUIERNQSBUeCBjaGFubmVsIDogdXNlIG5vbiBibG9ja2luZyBETUEgQWJvcnQgQVBJIChjYWxsYmFjaykgKi8KKyAgICBpZihodXNhcnQtPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFVTQVJUIFR4IERNQSBBYm9ydCBjYWxsYmFjayBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpc2VkIDogCisgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfVVNBUlRfQWJvcnRDcGx0Q2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworCisgICAgICAvKiBBYm9ydCBETUEgVFggKi8KKyAgICAgIGlmKEhBTF9ETUFfQWJvcnRfSVQoaHVzYXJ0LT5oZG1hdHgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgYWJvcnRjcGx0ID0gMFU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogRGlzYWJsZSB0aGUgVVNBUlQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgIHsKKyAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBBYm9ydCB0aGUgVVNBUlQgRE1BIFJ4IGNoYW5uZWwgOiB1c2Ugbm9uIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKGNhbGxiYWNrKSAqLworICAgIGlmKGh1c2FydC0+aGRtYXJ4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogVVNBUlQgUnggRE1BIEFib3J0IGNhbGxiYWNrIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGlzZWQgOiAKKyAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9VU0FSVF9BYm9ydENwbHRDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisKKyAgICAgIC8qIEFib3J0IERNQSBSWCAqLworICAgICAgaWYoSEFMX0RNQV9BYm9ydF9JVChodXNhcnQtPmhkbWFyeCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBodXNhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgICBhYm9ydGNwbHQgPSAxVTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgYWJvcnRjcGx0ID0gMFU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogaWYgbm8gRE1BIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrIGV4ZWN1dGlvbiBpcyByZXF1aXJlZCA9PiBjYWxsIHVzZXIgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaWYgKGFib3J0Y3BsdCA9PSAxVSkKKyAgeworICAgIC8qIFJlc2V0IFR4IGFuZCBSeCB0cmFuc2ZlciBjb3VudGVycyAqLworICAgIGh1c2FydC0+VHhYZmVyQ291bnQgPSAwVTsgCisgICAgaHVzYXJ0LT5SeFhmZXJDb3VudCA9IDBVOworCisgICAgLyogUmVzZXQgZXJyb3JDb2RlICovCisgICAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfTk9ORTsKKworICAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgICAgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRyhodXNhcnQsIFVTQVJUX0NMRUFSX09SRUYgfCBVU0FSVF9DTEVBUl9ORUYgfCBVU0FSVF9DTEVBUl9QRUYgfCBVU0FSVF9DTEVBUl9GRUYpOworCisgICAgLyogUmVzdG9yZSBodXNhcnQtPlN0YXRlIHRvIFJlYWR5ICovCisgICAgaHVzYXJ0LT5TdGF0ZSAgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBBcyBubyBETUEgdG8gYmUgYWJvcnRlZCwgY2FsbCBkaXJlY3RseSB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgSEFMX1VTQVJUX0Fib3J0Q3BsdENhbGxiYWNrKGh1c2FydCk7CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBVU0FSVCBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9VU0FSVF9JUlFIYW5kbGVyKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgdWludDMyX3QgaXNyZmxhZ3MgICA9IFJFQURfUkVHKGh1c2FydC0+SW5zdGFuY2UtPklTUik7CisgIHVpbnQzMl90IGNyMWl0cyAgICAgPSBSRUFEX1JFRyhodXNhcnQtPkluc3RhbmNlLT5DUjEpOworICB1aW50MzJfdCBjcjNpdHM7CisgIHVpbnQzMl90IGVycm9yZmxhZ3M7CisKKyAgLyogSWYgbm8gZXJyb3Igb2NjdXJzICovCisgIGVycm9yZmxhZ3MgPSAoaXNyZmxhZ3MgJiAodWludDMyX3QpKFVTQVJUX0lTUl9QRSB8IFVTQVJUX0lTUl9GRSB8IFVTQVJUX0lTUl9PUkUgfCBVU0FSVF9JU1JfTkUpKTsKKyAgaWYgKGVycm9yZmxhZ3MgPT0gUkVTRVQpCisgIHsKKyAgICAvKiBVU0FSVCBpbiBtb2RlIFJlY2VpdmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9SWE5FKSAhPSBSRVNFVCkgJiYgKChjcjFpdHMgJiBVU0FSVF9DUjFfUlhORUlFKSAhPSBSRVNFVCkpCisgICAgeworICAgICAgaWYoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9SWCkKKyAgICAgIHsKKyAgICAgICAgVVNBUlRfUmVjZWl2ZV9JVChodXNhcnQpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBVU0FSVF9UcmFuc21pdFJlY2VpdmVfSVQoaHVzYXJ0KTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvKiBJZiBzb21lIGVycm9ycyBvY2N1ciAqLworICBjcjNpdHMgPSBSRUFEX1JFRyhodXNhcnQtPkluc3RhbmNlLT5DUjMpOworICBpZiggICAoZXJyb3JmbGFncyAhPSBSRVNFVCkKKyAgICAgJiYgKCAgICgoY3IzaXRzICYgVVNBUlRfQ1IzX0VJRSkgIT0gUkVTRVQpCisgICAgICAgICB8fCAoKGNyMWl0cyAmIChVU0FSVF9DUjFfUlhORUlFIHwgVVNBUlRfQ1IxX1BFSUUpKSAhPSBSRVNFVCkpICkKKyAgeworICAgIC8qIFVTQVJUIHBhcml0eSBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9QRSkgIT0gUkVTRVQpICYmICgoY3IxaXRzICYgVVNBUlRfQ1IxX1BFSUUpICE9IFJFU0VUKSkKKyAgICB7CisgICAgICBfX0hBTF9VU0FSVF9DTEVBUl9JVChodXNhcnQsIFVTQVJUX0NMRUFSX1BFRik7CisKKyAgICAgIGh1c2FydC0+RXJyb3JDb2RlIHw9IEhBTF9VU0FSVF9FUlJPUl9QRTsKKyAgICB9CisKKyAgICAvKiBVU0FSVCBmcmFtZSBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfRkUpICE9IFJFU0VUKSAmJiAoKGNyM2l0cyAmIFVTQVJUX0NSM19FSUUpICE9IFJFU0VUKSkKKyAgICB7CisgICAgICBfX0hBTF9VU0FSVF9DTEVBUl9JVChodXNhcnQsIFVTQVJUX0NMRUFSX0ZFRik7CisKKyAgICAgIGh1c2FydC0+RXJyb3JDb2RlIHw9IEhBTF9VU0FSVF9FUlJPUl9GRTsKKyAgICB9CisKKyAgICAvKiBVU0FSVCBub2lzZSBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfTkUpICE9IFJFU0VUKSAmJiAoKGNyM2l0cyAmIFVTQVJUX0NSM19FSUUpICE9IFJFU0VUKSkKKyAgICB7CisgICAgICBfX0hBTF9VU0FSVF9DTEVBUl9JVChodXNhcnQsIFVTQVJUX0NMRUFSX05FRik7CisKKyAgICAgIGh1c2FydC0+RXJyb3JDb2RlIHw9IEhBTF9VU0FSVF9FUlJPUl9ORTsKKyAgICB9CisKKyAgICAvKiBVU0FSVCBPdmVyLVJ1biBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfT1JFKSAhPSBSRVNFVCkgJiYKKyAgICAgICAoKChjcjFpdHMgJiBVU0FSVF9DUjFfUlhORUlFKSAhPSBSRVNFVCkgfHwgKChjcjNpdHMgJiBVU0FSVF9DUjNfRUlFKSAhPSBSRVNFVCkpKQorICAgIHsKKyAgICAgIF9fSEFMX1VTQVJUX0NMRUFSX0lUKGh1c2FydCwgVVNBUlRfQ0xFQVJfT1JFRik7CisKKyAgICAgIGh1c2FydC0+RXJyb3JDb2RlIHw9IEhBTF9VU0FSVF9FUlJPUl9PUkU7CisgICAgfQorCisgICAgLyogQ2FsbCBVU0FSVCBFcnJvciBDYWxsIGJhY2sgZnVuY3Rpb24gaWYgbmVlZCBiZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYoaHVzYXJ0LT5FcnJvckNvZGUgIT0gSEFMX1VTQVJUX0VSUk9SX05PTkUpCisgICAgeworICAgICAgLyogVVNBUlQgaW4gbW9kZSBSZWNlaXZlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgaWYoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9SWE5FKSAhPSBSRVNFVCkgJiYgKChjcjFpdHMgJiBVU0FSVF9DUjFfUlhORUlFKSAhPSBSRVNFVCkpCisgICAgICB7CisgICAgICAgIGlmKGh1c2FydC0+U3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfUlgpCisgICAgICAgIHsKKyAgICAgICAgICBVU0FSVF9SZWNlaXZlX0lUKGh1c2FydCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgVVNBUlRfVHJhbnNtaXRSZWNlaXZlX0lUKGh1c2FydCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogSWYgT3ZlcnJ1biBlcnJvciBvY2N1cnMsIG9yIGlmIGFueSBlcnJvciBvY2N1cnMgaW4gRE1BIG1vZGUgcmVjZXB0aW9uLAorICAgICAgICAgY29uc2lkZXIgZXJyb3IgYXMgYmxvY2tpbmcgKi8KKyAgICAgIGlmICgoKGh1c2FydC0+RXJyb3JDb2RlICYgSEFMX1VTQVJUX0VSUk9SX09SRSkgIT0gUkVTRVQpIHx8CisgICAgICAgICAgKEhBTF9JU19CSVRfU0VUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKSkKKyAgICAgIHsgIAorICAgICAgICAvKiBCbG9ja2luZyBlcnJvciA6IHRyYW5zZmVyIGlzIGFib3J0ZWQKKyAgICAgICAgICAgU2V0IHRoZSBVU0FSVCBzdGF0ZSByZWFkeSB0byBiZSBhYmxlIHRvIHN0YXJ0IGFnYWluIHRoZSBwcm9jZXNzLAorICAgICAgICAgICBEaXNhYmxlIEludGVycnVwdHMsIGFuZCBkaXNhYmxlIERNQSByZXF1ZXN0cywgaWYgb25nb2luZyAqLworICAgICAgICBVU0FSVF9FbmRUcmFuc2ZlcihodXNhcnQpOworCisgICAgICAgIC8qIERpc2FibGUgdGhlIFVTQVJUIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgICAgICAgaWYgKEhBTF9JU19CSVRfU0VUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICAgICAgICB7CisgICAgICAgICAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIgfCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAgICAgICAvKiBBYm9ydCB0aGUgVVNBUlQgRE1BIFR4IGNoYW5uZWwgKi8KKyAgICAgICAgICBpZihodXNhcnQtPmhkbWF0eCAhPSBOVUxMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNldCB0aGUgVVNBUlQgVHggRE1BIEFib3J0IGNhbGxiYWNrIHRvIE5VTEwgOiBubyBjYWxsYmFjaworICAgICAgICAgICAgICAgZXhlY3V0ZWQgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgICAgICAgIGh1c2FydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIEFib3J0IERNQSBUWCAqLworICAgICAgICAgICAgSEFMX0RNQV9BYm9ydF9JVChodXNhcnQtPmhkbWF0eCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogQWJvcnQgdGhlIFVTQVJUIERNQSBSeCBjaGFubmVsICovCisgICAgICAgICAgaWYoaHVzYXJ0LT5oZG1hcnggIT0gTlVMTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBTZXQgdGhlIFVTQVJUIFJ4IERNQSBBYm9ydCBjYWxsYmFjayA6IAorICAgICAgICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX1VTQVJUX0Vycm9yQ2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgICAgICAgaHVzYXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gVVNBUlRfRE1BQWJvcnRPbkVycm9yOworCisgICAgICAgICAgICAvKiBBYm9ydCBETUEgUlggKi8KKyAgICAgICAgICAgIGlmKEhBTF9ETUFfQWJvcnRfSVQoaHVzYXJ0LT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogQ2FsbCBEaXJlY3RseSBodXNhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgICAgICAgICBodXNhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2soaHVzYXJ0LT5oZG1hcngpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgICAgICBIQUxfVVNBUlRfRXJyb3JDYWxsYmFjayhodXNhcnQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBDYWxsIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgICBIQUxfVVNBUlRfRXJyb3JDYWxsYmFjayhodXNhcnQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIE5vbiBCbG9ja2luZyBlcnJvciA6IHRyYW5zZmVyIGNvdWxkIGdvIG9uLiAKKyAgICAgICAgICAgRXJyb3IgaXMgbm90aWZpZWQgdG8gdXNlciB0aHJvdWdoIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgSEFMX1VTQVJUX0Vycm9yQ2FsbGJhY2soaHVzYXJ0KTsKKyAgICAgICAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfTk9ORTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworCisgIH0gLyogRW5kIGlmIHNvbWUgZXJyb3Igb2NjdXJzICovCisKKworICAvKiBVU0FSVCBpbiBtb2RlIFRyYW5zbWl0dGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfVFhFKSAhPSBSRVNFVCkgJiYgKChjcjFpdHMgJiBVU0FSVF9DUjFfVFhFSUUpICE9IFJFU0VUKSkKKyAgeworICAgIGlmKGh1c2FydC0+U3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFgpCisgICAgeworICAgICAgVVNBUlRfVHJhbnNtaXRfSVQoaHVzYXJ0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIFVTQVJUX1RyYW5zbWl0UmVjZWl2ZV9JVChodXNhcnQpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICAvKiBVU0FSVCBpbiBtb2RlIFRyYW5zbWl0dGVyICh0cmFuc21pc3Npb24gZW5kKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfVEMpICE9IFJFU0VUKSAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9UQ0lFKSAhPSBSRVNFVCkpCisgIHsKKyAgICBVU0FSVF9FbmRUcmFuc21pdF9JVChodXNhcnQpOworICAgIHJldHVybjsKKyAgfQorCit9CisKKy8qKgorICAqIEBicmllZiAgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9VU0FSVF9UeENwbHRDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1c2FydCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9VU0FSVF9UeENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgVHggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VTQVJUX1R4SGFsZkNwbHRDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1c2FydCk7CisKKyAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgIHRoZSBIQUxfVVNBUlRfVHhIYWxmQ3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VTQVJUX1J4Q3BsdENhbGxiYWNrKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVzYXJ0KTsKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgdGhlIEhBTF9VU0FSVF9SeENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgUnggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VTQVJUX1J4SGFsZkNwbHRDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1c2FydCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9VU0FSVF9SeEhhbGZDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgVHgvUnggVHJhbnNmZXJzIGNvbXBsZXRlZCBjYWxsYmFjayBmb3IgdGhlIG5vbi1ibG9ja2luZyBwcm9jZXNzLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9VU0FSVF9UeFJ4Q3BsdENhbGxiYWNrKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVzYXJ0KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1VTQVJUX1R4UnhDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgVVNBUlQgZXJyb3IgY2FsbGJhY2suCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VTQVJUX0Vycm9yQ2FsbGJhY2soVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodXNhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVVNBUlRfRXJyb3JDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgVVNBUlQgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VTQVJUX0Fib3J0Q3BsdENhbGxiYWNrIChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1c2FydCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9VU0FSVF9BYm9ydENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBVU0FSVCBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gOgorICAgICAgKCspIFJldHVybiB0aGUgVVNBUlQgaGFuZGxlIHN0YXRlCisgICAgICAoKykgUmV0dXJuIHRoZSBVU0FSVCBoYW5kbGUgZXJyb3IgY29kZQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBVU0FSVCBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBodXNhcnQgcG9pbnRlciB0byBhIFVTQVJUX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVTQVJULgorICAqIEByZXR2YWwgVVNBUlQgaGFuZGxlIHN0YXRlCisgICovCitIQUxfVVNBUlRfU3RhdGVUeXBlRGVmIEhBTF9VU0FSVF9HZXRTdGF0ZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIHJldHVybiBodXNhcnQtPlN0YXRlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgVVNBUlQgZXJyb3IgY29kZS4KKyAgKiBAcGFyYW0gIGh1c2FydCBwb2ludGVyIHRvIGEgVVNBUlRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVVNBUlQuCisgICogQHJldHZhbCBVU0FSVCBoYW5kbGUgRXJyb3IgQ29kZQorICAqLwordWludDMyX3QgSEFMX1VTQVJUX0dldEVycm9yKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgcmV0dXJuIGh1c2FydC0+RXJyb3JDb2RlOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX1ByaXZhdGVfRnVuY3Rpb25zIFVTQVJUIFByaXZhdGUgRnVuY3Rpb25zCisgICogQGJyaWVmICAgVVNBUlQgUHJpdmF0ZSBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gY29udHJvbCB0aGUgVVNBUlQuCisgICAgICgrKSBVU0FSVF9TZXRDb25maWcoKSBBUEkgaXMgdXNlZCB0byBzZXQgdGhlIFVTQVJUIGNvbW11bmljYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKCspIFVTQVJUX0NoZWNrSWRsZVN0YXRlKCkgQVBpIGVuc3VyZXMgdGhhdCBURUFDSyBhbmQvb3IgUkVBQ0sgYml0cyBhcmUgc2V0IGFmdGVyIGluaXRpYWxpemF0aW9uCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEVuZCBvbmdvaW5nIHRyYW5zZmVyIG9uIFVTQVJUIHBlcmlwaGVyYWwgKGZvbGxvd2luZyBlcnJvciBkZXRlY3Rpb24gb3IgVHJhbnNmZXIgY29tcGxldGlvbikuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVVNBUlRfRW5kVHJhbnNmZXIoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICAvKiBEaXNhYmxlIFRYRUlFIGFuZCBUQ0lFIGludGVycnVwdHMgKi8KKyAgLyogRGlzYWJsZSBSWE5FLCBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9UWEVJRSB8IFVTQVJUX0NSMV9UQ0lFIHwgVVNBUlRfQ1IxX1JYTkVJRSB8IFVTQVJUX0NSMV9QRUlFKSk7CisgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgIC8qIEF0IGVuZCBvZiBwcm9jZXNzLCByZXN0b3JlIGh1c2FydC0+U3RhdGUgdG8gUmVhZHkgKi8KKyAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKK30KKworLyoqCisgICogQGJyaWVmICBETUEgVVNBUlQgdHJhbnNtaXQgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVTQVJUX0RNQVRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVVNBUlRfSGFuZGxlVHlwZURlZiogaHVzYXJ0ID0gKFVTQVJUX0hhbmRsZVR5cGVEZWYqKShoZG1hLT5QYXJlbnQpOworCisgIC8qIERNQSBOb3JtYWwgbW9kZSAqLworICBpZiAoIEhBTF9JU19CSVRfQ0xSKGhkbWEtPkluc3RhbmNlLT5DQ1IsIERNQV9DQ1JfQ0lSQykgKQorICB7CisgICAgaHVzYXJ0LT5UeFhmZXJDb3VudCA9IDBVOworCisgICAgaWYoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWCkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRyYW5zbWl0IHJlcXVlc3QgYnkgcmVzZXR0aW5nIHRoZSBETUFUIGJpdAorICAgICAgICAgaW4gdGhlIFVTQVJUIENSMyByZWdpc3RlciAqLworICAgICAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgICAvKiBFbmFibGUgdGhlIFVTQVJUIFRyYW5zbWl0IENvbXBsZXRlIEludGVycnVwdCAqLworICAgICAgX19IQUxfVVNBUlRfRU5BQkxFX0lUKGh1c2FydCwgVVNBUlRfSVRfVEMpOworICAgIH0KKyAgfQorICAvKiBETUEgQ2lyY3VsYXIgbW9kZSAqLworICBlbHNlCisgIHsKKyAgICBpZihodXNhcnQtPlN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYKQorICAgIHsKKyAgICAgIEhBTF9VU0FSVF9UeENwbHRDYWxsYmFjayhodXNhcnQpOworICAgIH0KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBVU0FSVCB0cmFuc21pdCBwcm9jZXNzIGhhbGYgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVU0FSVF9ETUFUeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBVU0FSVF9IYW5kbGVUeXBlRGVmKiBodXNhcnQgPSAoVVNBUlRfSGFuZGxlVHlwZURlZiopKGhkbWEtPlBhcmVudCk7CisKKyAgSEFMX1VTQVJUX1R4SGFsZkNwbHRDYWxsYmFjayhodXNhcnQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBVU0FSVCByZWNlaXZlIHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVU0FSVF9ETUFSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVVNBUlRfSGFuZGxlVHlwZURlZiogaHVzYXJ0ID0gKFVTQVJUX0hhbmRsZVR5cGVEZWYqKShoZG1hLT5QYXJlbnQpOworCisgIC8qIERNQSBOb3JtYWwgbW9kZSAqLworICBpZiAoIEhBTF9JU19CSVRfQ0xSKGhkbWEtPkluc3RhbmNlLT5DQ1IsIERNQV9DQ1JfQ0lSQykgKQorICB7CisgICAgaHVzYXJ0LT5SeFhmZXJDb3VudCA9IDBVOworCisgICAgLyogRGlzYWJsZSBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisgICAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBETUEgUlggdHJhbnNmZXIgZm9yIHRoZSByZWNlaXZlciByZXF1ZXN0IGJ5IHJlc2V0dGluZyB0aGUgRE1BUiBiaXQKKyAgICAgICBpbiBVU0FSVCBDUjMgcmVnaXN0ZXIgKi8KKyAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisgICAgLyogc2ltaWxhcmx5LCBkaXNhYmxlIHRoZSBETUEgVFggdHJhbnNmZXIgdGhhdCB3YXMgc3RhcnRlZCB0byBwcm92aWRlIHRoZQorICAgICAgIGNsb2NrIHRvIHRoZSBzbGF2ZSBkZXZpY2UgKi8KKyAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICBpZihodXNhcnQtPlN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1JYKQorICAgIHsKKyAgICAgIEhBTF9VU0FSVF9SeENwbHRDYWxsYmFjayhodXNhcnQpOworICAgIH0KKyAgICAvKiBUaGUgVVNBUlQgc3RhdGUgaXMgSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFhfUlggKi8KKyAgICBlbHNlCisgICAgeworICAgICAgSEFMX1VTQVJUX1R4UnhDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyAgICB9CisgICAgaHVzYXJ0LT5TdGF0ZT0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworICB9CisgIC8qIERNQSBjaXJjdWxhciBtb2RlICovCisgIGVsc2UKKyAgeworICAgIGlmKGh1c2FydC0+U3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfUlgpCisgICAgeworICAgICAgSEFMX1VTQVJUX1J4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisgICAgfQorICAgIC8qIFRoZSBVU0FSVCBzdGF0ZSBpcyBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWF9SWCAqLworICAgIGVsc2UKKyAgICB7CisgICAgICBIQUxfVVNBUlRfVHhSeENwbHRDYWxsYmFjayhodXNhcnQpOworICAgIH0KKyAgfSAgICAKKworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBVU0FSVCByZWNlaXZlIHByb2Nlc3MgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVTQVJUX0RNQVJ4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFVTQVJUX0hhbmRsZVR5cGVEZWYqIGh1c2FydCA9IChVU0FSVF9IYW5kbGVUeXBlRGVmKikoaGRtYS0+UGFyZW50KTsKKworICBIQUxfVVNBUlRfUnhIYWxmQ3BsdENhbGxiYWNrKGh1c2FydCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFVTQVJUIGNvbW11bmljYXRpb24gZXJyb3IgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVU0FSVF9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVVNBUlRfSGFuZGxlVHlwZURlZiogaHVzYXJ0ID0gKFVTQVJUX0hhbmRsZVR5cGVEZWYqKShoZG1hLT5QYXJlbnQpOworCisgIGh1c2FydC0+UnhYZmVyQ291bnQgPSAwVTsKKyAgaHVzYXJ0LT5UeFhmZXJDb3VudCA9IDBVOworICBVU0FSVF9FbmRUcmFuc2ZlcihodXNhcnQpOworCisgIGh1c2FydC0+RXJyb3JDb2RlIHw9IEhBTF9VU0FSVF9FUlJPUl9ETUE7CisgIGh1c2FydC0+U3RhdGU9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworICBIQUxfVVNBUlRfRXJyb3JDYWxsYmFjayhodXNhcnQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBVU0FSVCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSBIQUwgc2VydmljZXMgb24gRXJyb3IKKyAgKiAgICAgICAgIChUbyBiZSBjYWxsZWQgYXQgZW5kIG9mIERNQSBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIGVycm9yIG9jY3VycmVuY2UpLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVVNBUlRfRE1BQWJvcnRPbkVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBVU0FSVF9IYW5kbGVUeXBlRGVmKiBodXNhcnQgPSAoVVNBUlRfSGFuZGxlVHlwZURlZiopKGhkbWEtPlBhcmVudCk7CisgIGh1c2FydC0+UnhYZmVyQ291bnQgPSAwVTsKKyAgaHVzYXJ0LT5UeFhmZXJDb3VudCA9IDBVOworCisgIEhBTF9VU0FSVF9FcnJvckNhbGxiYWNrKGh1c2FydCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFVTQVJUIFR4IGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IHVzZXIKKyAgKiAgICAgICAgIChUbyBiZSBjYWxsZWQgYXQgZW5kIG9mIERNQSBUeCBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIHVzZXIgYWJvcnQgcmVxdWVzdCkuCisgICogQG5vdGUgICBXaGVuIHRoaXMgY2FsbGJhY2sgaXMgZXhlY3V0ZWQsIFVzZXIgQWJvcnQgY29tcGxldGUgY2FsbCBiYWNrIGlzIGNhbGxlZCBvbmx5IGlmIG5vCisgICogICAgICAgICBBYm9ydCBzdGlsbCBvbmdvaW5nIGZvciBSeCBETUEgSGFuZGxlLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVVNBUlRfRE1BVHhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBVU0FSVF9IYW5kbGVUeXBlRGVmKiBodXNhcnQgPSAoVVNBUlRfSGFuZGxlVHlwZURlZiogKShoZG1hLT5QYXJlbnQpOworICAKKyAgaHVzYXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAvKiBDaGVjayBpZiBhbiBBYm9ydCBwcm9jZXNzIGlzIHN0aWxsIG9uZ29pbmcgKi8KKyAgaWYoaHVzYXJ0LT5oZG1hcnggIT0gTlVMTCkKKyAgeworICAgIGlmKGh1c2FydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayAhPSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgCisgIC8qIE5vIEFib3J0IHByb2Nlc3Mgc3RpbGwgb25nb2luZyA6IEFsbCBETUEgY2hhbm5lbHMgYXJlIGFib3J0ZWQsIGNhbGwgdXNlciBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayAqLworICBodXNhcnQtPlR4WGZlckNvdW50ID0gMFU7CisgIGh1c2FydC0+UnhYZmVyQ291bnQgPSAwVTsKKworICAvKiBSZXNldCBlcnJvckNvZGUgKi8KKyAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfTk9ORTsKKworICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICBfX0hBTF9VU0FSVF9DTEVBUl9GTEFHKGh1c2FydCwgVVNBUlRfQ0xFQVJfT1JFRiB8IFVTQVJUX0NMRUFSX05FRiB8IFVTQVJUX0NMRUFSX1BFRiB8IFVTQVJUX0NMRUFSX0ZFRik7CisKKyAgLyogUmVzdG9yZSBodXNhcnQtPlN0YXRlIHRvIFJlYWR5ICovCisgIGh1c2FydC0+U3RhdGUgID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworCisgIC8qIENhbGwgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBIQUxfVVNBUlRfQWJvcnRDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIERNQSBVU0FSVCBSeCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSB1c2VyCisgICogICAgICAgICAoVG8gYmUgY2FsbGVkIGF0IGVuZCBvZiBETUEgUnggQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyB1c2VyIGFib3J0IHJlcXVlc3QpLgorICAqIEBub3RlICAgV2hlbiB0aGlzIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLCBVc2VyIEFib3J0IGNvbXBsZXRlIGNhbGwgYmFjayBpcyBjYWxsZWQgb25seSBpZiBubworICAqICAgICAgICAgQWJvcnQgc3RpbGwgb25nb2luZyBmb3IgVHggRE1BIEhhbmRsZS4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVTQVJUX0RNQVJ4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVVNBUlRfSGFuZGxlVHlwZURlZiogaHVzYXJ0ID0gKFVTQVJUX0hhbmRsZVR5cGVEZWYqICkoaGRtYS0+UGFyZW50KTsKKyAgCisgIGh1c2FydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgLyogQ2hlY2sgaWYgYW4gQWJvcnQgcHJvY2VzcyBpcyBzdGlsbCBvbmdvaW5nICovCisgIGlmKGh1c2FydC0+aGRtYXR4ICE9IE5VTEwpCisgIHsKKyAgICBpZihodXNhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIAorICAvKiBObyBBYm9ydCBwcm9jZXNzIHN0aWxsIG9uZ29pbmcgOiBBbGwgRE1BIGNoYW5uZWxzIGFyZSBhYm9ydGVkLCBjYWxsIHVzZXIgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaHVzYXJ0LT5UeFhmZXJDb3VudCA9IDBVOworICBodXNhcnQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgLyogUmVzZXQgZXJyb3JDb2RlICovCisgIGh1c2FydC0+RXJyb3JDb2RlID0gSEFMX1VTQVJUX0VSUk9SX05PTkU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRyhodXNhcnQsIFVTQVJUX0NMRUFSX09SRUYgfCBVU0FSVF9DTEVBUl9ORUYgfCBVU0FSVF9DTEVBUl9QRUYgfCBVU0FSVF9DTEVBUl9GRUYpOworCisgIC8qIFJlc3RvcmUgaHVzYXJ0LT5TdGF0ZSB0byBSZWFkeSAqLworICBodXNhcnQtPlN0YXRlICA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworICAvKiBDYWxsIHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgSEFMX1VTQVJUX0Fib3J0Q3BsdENhbGxiYWNrKGh1c2FydCk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgVVNBUlQgQ29tbXVuaWNhdGlvbiBUaW1lb3V0LgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gIEZsYWcgU3BlY2lmaWVzIHRoZSBVU0FSVCBmbGFnIHRvIGNoZWNrLgorICAqIEBwYXJhbSAgU3RhdHVzIHRoZSBGbGFnIHN0YXR1cyAoU0VUIG9yIFJFU0VUKS4KKyAgKiBAcGFyYW0gIFRpY2tzdGFydCBUaWNrIHN0YXJ0IHZhbHVlCisgICogQHBhcmFtICBUaW1lb3V0IHRpbWVvdXQgZHVyYXRpb24uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgVVNBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdHVzLCB1aW50MzJfdCBUaWNrc3RhcnQsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIC8qIFdhaXQgdW50aWwgZmxhZyBpcyBzZXQgKi8KKyAgd2hpbGUoKF9fSEFMX1VTQVJUX0dFVF9GTEFHKGh1c2FydCwgRmxhZykgPyBTRVQgOiBSRVNFVCkgPT0gU3RhdHVzKQorICB7CisgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCisgICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmKChUaW1lb3V0ID09IDBVKSB8fCAoKEhBTF9HZXRUaWNrKCktVGlja3N0YXJ0KSA+IFRpbWVvdXQpKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIFRYRSwgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzIGZvciB0aGUgaW50ZXJydXB0IHByb2Nlc3MgKi8KKyAgICAgICAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUUgfCBVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9UWEVJRSkpOworICAgICAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgICAgICBodXNhcnQtPlN0YXRlPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKworLyoqCisgICogQGJyaWVmIENvbmZpZ3VyZSB0aGUgVVNBUlQgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBVU0FSVF9TZXRDb25maWcoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICB1aW50MzJfdCB0bXByZWcgICAgICAgICAgICAgICAgICAgICAgPSAweDBVOworICBVU0FSVF9DbG9ja1NvdXJjZVR5cGVEZWYgY2xvY2tzb3VyY2UgPSBVU0FSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHJldCAgICAgICAgICAgICAgICA9IEhBTF9PSzsKKyAgdWludDE2X3QgYnJydGVtcCAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwVTsKKyAgdWludDE2X3QgdXNhcnRkaXYgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwVTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfUE9MQVJJVFkoaHVzYXJ0LT5Jbml0LkNMS1BvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19VU0FSVF9QSEFTRShodXNhcnQtPkluaXQuQ0xLUGhhc2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0xBU1RCSVQoaHVzYXJ0LT5Jbml0LkNMS0xhc3RCaXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0JBVURSQVRFKGh1c2FydC0+SW5pdC5CYXVkUmF0ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfV09SRF9MRU5HVEgoaHVzYXJ0LT5Jbml0LldvcmRMZW5ndGgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX1NUT1BCSVRTKGh1c2FydC0+SW5pdC5TdG9wQml0cykpOworICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfUEFSSVRZKGh1c2FydC0+SW5pdC5QYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX01PREUoaHVzYXJ0LT5Jbml0Lk1vZGUpKTsKKworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgLyogQ2xlYXIgTSwgUENFLCBQUywgVEUgYW5kIFJFIGJpdHMgYW5kIGNvbmZpZ3VyZQorICAgKiAgdGhlIFVTQVJUIFdvcmQgTGVuZ3RoLCBQYXJpdHkgYW5kIE1vZGU6CisgICAqICBzZXQgdGhlIE0gYml0cyBhY2NvcmRpbmcgdG8gaHVzYXJ0LT5Jbml0LldvcmRMZW5ndGggdmFsdWUKKyAgICogIHNldCBQQ0UgYW5kIFBTIGJpdHMgYWNjb3JkaW5nIHRvIGh1c2FydC0+SW5pdC5QYXJpdHkgdmFsdWUKKyAgICogIHNldCBURSBhbmQgUkUgYml0cyBhY2NvcmRpbmcgdG8gaHVzYXJ0LT5Jbml0Lk1vZGUgdmFsdWUKKyAgICogIGZvcmNlIE9WRVI4IHRvIDEgdG8gYWxsb3cgdG8gcmVhY2ggdGhlIG1heGltdW0gc3BlZWQgKEZjbG9jay84KSAgKi8KKyAgdG1wcmVnID0gKHVpbnQzMl90KWh1c2FydC0+SW5pdC5Xb3JkTGVuZ3RoIHwgaHVzYXJ0LT5Jbml0LlBhcml0eSB8IGh1c2FydC0+SW5pdC5Nb2RlIHwgVVNBUlRfQ1IxX09WRVI4OworICBNT0RJRllfUkVHKGh1c2FydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX0ZJRUxEUywgdG1wcmVnKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ2xlYXIgYW5kIGNvbmZpZ3VyZSB0aGUgVVNBUlQgQ2xvY2ssIENQT0wsIENQSEEsIExCQ0wgYW5kIFNUT1AgYml0czoKKyAgICogc2V0IENQT0wgYml0IGFjY29yZGluZyB0byBodXNhcnQtPkluaXQuQ0xLUG9sYXJpdHkgdmFsdWUKKyAgICogc2V0IENQSEEgYml0IGFjY29yZGluZyB0byBodXNhcnQtPkluaXQuQ0xLUGhhc2UgdmFsdWUKKyAgICogc2V0IExCQ0wgYml0IGFjY29yZGluZyB0byBodXNhcnQtPkluaXQuQ0xLTGFzdEJpdCB2YWx1ZQorICAgKiBzZXQgU1RPUFsxMzoxMl0gYml0cyBhY2NvcmRpbmcgdG8gaHVzYXJ0LT5Jbml0LlN0b3BCaXRzIHZhbHVlICovCisgIHRtcHJlZyA9ICh1aW50MzJfdCkoVVNBUlRfQ0xPQ0tfRU5BQkxFKTsKKyAgdG1wcmVnIHw9ICgodWludDMyX3QpaHVzYXJ0LT5Jbml0LkNMS1BvbGFyaXR5IHwgKHVpbnQzMl90KWh1c2FydC0+SW5pdC5DTEtQaGFzZSk7CisgIHRtcHJlZyB8PSAoKHVpbnQzMl90KWh1c2FydC0+SW5pdC5DTEtMYXN0Qml0IHwgKHVpbnQzMl90KWh1c2FydC0+SW5pdC5TdG9wQml0cyk7CisgIE1PRElGWV9SRUcoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfRklFTERTLCB0bXByZWcpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IzIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBubyBDUjMgcmVnaXN0ZXIgY29uZmlndXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIEJSUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQlJSIGlzIGZpbGxlZC11cCBhY2NvcmRpbmcgdG8gT1ZFUjggYml0IHNldHRpbmcgd2hpY2ggaXMgZm9yY2VkIHRvIDEgICAgICovCisgIFVTQVJUX0dFVENMT0NLU09VUkNFKGh1c2FydCwgY2xvY2tzb3VyY2UpOworICBzd2l0Y2ggKGNsb2Nrc291cmNlKQorICB7CisgICAgY2FzZSBVU0FSVF9DTE9DS1NPVVJDRV9QQ0xLMToKKyAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQxNl90KSgoKDJVKkhBTF9SQ0NfR2V0UENMSzFGcmVxKCkpICsgKGh1c2FydC0+SW5pdC5CYXVkUmF0ZS8yVSkpIC8gaHVzYXJ0LT5Jbml0LkJhdWRSYXRlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVVNBUlRfQ0xPQ0tTT1VSQ0VfUENMSzI6CisgICAgICB1c2FydGRpdiA9ICh1aW50MTZfdCkoKCgyVSpIQUxfUkNDX0dldFBDTEsyRnJlcSgpKSArIChodXNhcnQtPkluaXQuQmF1ZFJhdGUvMlUpKSAvIGh1c2FydC0+SW5pdC5CYXVkUmF0ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVTQVJUX0NMT0NLU09VUkNFX0hTSToKKyAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQxNl90KSgoKDJVKkhTSV9WQUxVRSkgKyAoaHVzYXJ0LT5Jbml0LkJhdWRSYXRlLzJVKSkgLyBodXNhcnQtPkluaXQuQmF1ZFJhdGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBVU0FSVF9DTE9DS1NPVVJDRV9TWVNDTEs6CisgICAgICB1c2FydGRpdiA9ICh1aW50MTZfdCkoKCgyVSpIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpKSArIChodXNhcnQtPkluaXQuQmF1ZFJhdGUvMlUpKSAvIGh1c2FydC0+SW5pdC5CYXVkUmF0ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVTQVJUX0NMT0NLU09VUkNFX0xTRToKKyAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQxNl90KSgoKDJVKkxTRV9WQUxVRSkgKyAoaHVzYXJ0LT5Jbml0LkJhdWRSYXRlLzJVKSkgLyBodXNhcnQtPkluaXQuQmF1ZFJhdGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBVU0FSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgYnJydGVtcCA9IHVzYXJ0ZGl2ICYgMHhGRkYwVTsKKyAgYnJydGVtcCB8PSAodWludDE2X3QpKCh1c2FydGRpdiAmICh1aW50MTZfdCkweDAwMEZVKSA+PiAxVSk7CisgIGh1c2FydC0+SW5zdGFuY2UtPkJSUiA9IGJycnRlbXA7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoqCisgICogQGJyaWVmIENoZWNrIHRoZSBVU0FSVCBJZGxlIFN0YXRlLgorICAqIEBwYXJhbSBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFVTQVJUX0NoZWNrSWRsZVN0YXRlKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gMFU7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgVVNBUlQgRXJyb3JDb2RlICovCisgIGh1c2FydC0+RXJyb3JDb2RlID0gSEFMX1VTQVJUX0VSUk9SX05PTkU7CisKKyAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdtZW50Ki8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBDaGVjayBpZiB0aGUgVHJhbnNtaXR0ZXIgaXMgZW5hYmxlZCAqLworICBpZigoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxICYgVVNBUlRfQ1IxX1RFKSA9PSBVU0FSVF9DUjFfVEUpCisgIHsKKyAgICAvKiBXYWl0IHVudGlsIFRFQUNLIGZsYWcgaXMgc2V0ICovCisgICAgaWYoVVNBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodXNhcnQsIFVTQVJUX0lTUl9URUFDSywgUkVTRVQsIHRpY2tzdGFydCwgVVNBUlRfVEVBQ0tfUkVBQ0tfVElNRU9VVCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFRpbWVvdXQgT2NjdXJlZCAqLworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorCisgIC8qIFJFQUNLIGJpdCBpbiBJU1IgaXMgY2hlY2tlZCBvbmx5IHdoZW4gYXZhaWxhYmxlIChub3QgdG8gYmUgY2hlY2tlZCBvbiBhbGwgaW5zdGFuY2VzKS4KKyAgICAgQml0IGlzIGRlZmluZWQgb25seSBmb3IgVVNBUlQgaW5zdGFuY2VzIHN1cHBvcnRpbmcgV2FrZVVwIGZyb20gU3RvcCBNb2RlIGZlYXR1cmUuIAorICAqLworICBpZiAoSVNfVUFSVF9XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoaHVzYXJ0LT5JbnN0YW5jZSkpCisgIHsKKyAgICAvKiBDaGVjayBpZiB0aGUgUmVjZWl2ZXIgaXMgZW5hYmxlZCAqLworICAgIGlmKChodXNhcnQtPkluc3RhbmNlLT5DUjEgJiBVU0FSVF9DUjFfUkUpID09IFVTQVJUX0NSMV9SRSkKKyAgICB7CisgICAgICAvKiBXYWl0IHVudGlsIFJFQUNLIGZsYWcgaXMgc2V0ICovCisgICAgICBpZihVU0FSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGh1c2FydCwgVVNBUlRfSVNSX1JFQUNLLCBSRVNFVCwgdGlja3N0YXJ0LCBVU0FSVF9URUFDS19SRUFDS19USU1FT1VUKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIFRpbWVvdXQgb2NjdXJyZWQgKi8KKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIEluaXRpYWxpemUgdGhlIFVTQVJUIHN0YXRlKi8KKyAgaHVzYXJ0LT5TdGF0ZT0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIFNpbXBsZXggc2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAbm90ZSAgIEZ1bmN0aW9uIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZQorICAqICAgICAgICAgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfVVNBUlRfVHJhbnNtaXRfSVQoKS4KKyAgKiBAbm90ZSAgIFRoZSBVU0FSVCBlcnJvcnMgYXJlIG5vdCBtYW5hZ2VkIHRvIGF2b2lkIHRoZSBvdmVycnVuIGVycm9yLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBVU0FSVF9UcmFuc21pdF9JVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIHVpbnQxNl90KiB0bXA9MFU7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFR4IHByb2Nlc3MgaXMgb25nb2luZyAqLworICBpZihodXNhcnQtPlN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYKQorICB7CisKKyAgICBpZihodXNhcnQtPlR4WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFVTQVJUIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9VU0FSVF9ESVNBQkxFX0lUKGh1c2FydCwgVVNBUlRfSVRfVFhFKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBVU0FSVCBUcmFuc21pdCBDb21wbGV0ZSBJbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1VTQVJUX0VOQUJMRV9JVChodXNhcnQsIFVTQVJUX0lUX1RDKTsKKworICAgICAgcmV0dXJuIEhBTF9PSzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmKChodXNhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVzYXJ0LT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkpCisgICAgICB7CisgICAgICAgIHRtcCA9ICh1aW50MTZfdCopIGh1c2FydC0+cFR4QnVmZlB0cjsKKyAgICAgICAgaHVzYXJ0LT5JbnN0YW5jZS0+VERSID0gKCp0bXAgJiAodWludDE2X3QpMHgwMUZGVSk7CisgICAgICAgIGh1c2FydC0+cFR4QnVmZlB0ciArPSAyVTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5JbnN0YW5jZS0+VERSID0gKHVpbnQ4X3QpKCpodXNhcnQtPnBUeEJ1ZmZQdHIrKyAmICh1aW50OF90KTB4RkZVKTsKKyAgICAgIH0KKworICAgICAgaHVzYXJ0LT5UeFhmZXJDb3VudC0tOworCisgICAgICByZXR1cm4gSEFMX09LOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworCisvKioKKyAgKiBAYnJpZWYgIFdyYXBzIHVwIHRyYW5zbWlzc2lvbiBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGh1c2FydCBQb2ludGVyIHRvIGEgVVNBUlRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVTQVJUIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBVU0FSVF9FbmRUcmFuc21pdF9JVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIERpc2FibGUgdGhlIFVTQVJUIFRyYW5zbWl0IENvbXBsZXRlIEludGVycnVwdCAqLworICBfX0hBTF9VU0FSVF9ESVNBQkxFX0lUKGh1c2FydCwgVVNBUlRfSVRfVEMpOworCisgIC8qIERpc2FibGUgdGhlIFVTQVJUIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgX19IQUxfVVNBUlRfRElTQUJMRV9JVChodXNhcnQsIFVTQVJUX0lUX0VSUik7CisKKyAgLyogVHggcHJvY2VzcyBpcyBlbmRlZCwgcmVzdG9yZSBodXNhcnQtPlN0YXRlIHRvIFJlYWR5ICovCisgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyAgSEFMX1VTQVJUX1R4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIFNpbXBsZXggcmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAbm90ZSAgIEZ1bmN0aW9uIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZQorICAqICAgICAgICAgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfVVNBUlRfUmVjZWl2ZV9JVCgpLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFVTQVJUX1JlY2VpdmVfSVQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICB1aW50MTZfdCogdG1wPTBVOworICB1aW50MTZfdCB1aE1hc2sgPSBodXNhcnQtPk1hc2s7CisKKyAgaWYoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9SWCkKKyAgeworCisgICAgaWYoKGh1c2FydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVTQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodXNhcnQtPkluaXQuUGFyaXR5ID09IFVTQVJUX1BBUklUWV9OT05FKSkKKyAgICB7CisgICAgICB0bXAgPSAodWludDE2X3QqKSBodXNhcnQtPnBSeEJ1ZmZQdHI7CisgICAgICAqdG1wID0gKHVpbnQxNl90KShodXNhcnQtPkluc3RhbmNlLT5SRFIgJiB1aE1hc2spOworICAgICAgaHVzYXJ0LT5wUnhCdWZmUHRyICs9IDJVOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgKmh1c2FydC0+cFJ4QnVmZlB0cisrID0gKHVpbnQ4X3QpKGh1c2FydC0+SW5zdGFuY2UtPlJEUiAmICh1aW50OF90KXVoTWFzayk7CisgICAgfQorCisgICAgLyogU2VuZCBkdW1teSBieXRlIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBjbG9jayBmb3IgdGhlIFNsYXZlIHRvIFNlbmQgdGhlIG5leHQgZGF0YSAqLworICAgIGh1c2FydC0+SW5zdGFuY2UtPlREUiA9IChVU0FSVF9EVU1NWV9EQVRBICYgKHVpbnQxNl90KTB4MDBGRlUpOworCisgICAgaWYoLS1odXNhcnQtPlJ4WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFVTQVJUIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQgYW5kIFJYTkUgaW50ZXJydXB0Ki8KKyAgICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFIHwgVVNBUlRfQ1IxX1BFSUUpKTsKKworICAgICAgLyogRGlzYWJsZSB0aGUgVVNBUlQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSAqLworICAgICAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAgIC8qIFJ4IHByb2Nlc3MgaXMgY29tcGxldGVkLCByZXN0b3JlIGh1c2FydC0+U3RhdGUgdG8gUmVhZHkgKi8KKyAgICAgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAgIEhBTF9VU0FSVF9SeENwbHRDYWxsYmFjayhodXNhcnQpOworCisgICAgICByZXR1cm4gSEFMX09LOworICAgIH0KKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgRnVsbC1EdXBsZXggU2VuZCByZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGZ1bGwtZHVwbGV4IG1vZGUgKG5vbi1ibG9ja2luZykuCisgICogQG5vdGUgICBGdW5jdGlvbiBjYWxsZWQgdW5kZXIgaW50ZXJydXB0aW9uIG9ubHksIG9uY2UKKyAgKiAgICAgICAgIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgSEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZV9JVCgpLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBVU0FSVF9UcmFuc21pdFJlY2VpdmVfSVQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICB1aW50MTZfdCogdG1wPTBVOworICB1aW50MTZfdCB1aE1hc2sgPSBodXNhcnQtPk1hc2s7CisKKyAgaWYoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWF9SWCkKKyAgeworCisgICAgaWYoaHVzYXJ0LT5UeFhmZXJDb3VudCAhPSAweDAwVSkKKyAgICB7CisgICAgICBpZihfX0hBTF9VU0FSVF9HRVRfRkxBRyhodXNhcnQsIFVTQVJUX0ZMQUdfVFhFKSAhPSBSRVNFVCkKKyAgICAgIHsKKyAgICAgICAgaWYoKGh1c2FydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVTQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodXNhcnQtPkluaXQuUGFyaXR5ID09IFVTQVJUX1BBUklUWV9OT05FKSkKKyAgICAgICAgeworICAgICAgICAgIHRtcCA9ICh1aW50MTZfdCopIGh1c2FydC0+cFR4QnVmZlB0cjsKKyAgICAgICAgICBodXNhcnQtPkluc3RhbmNlLT5URFIgPSAodWludDE2X3QpKCp0bXAgJiB1aE1hc2spOworICAgICAgICAgIGh1c2FydC0+cFR4QnVmZlB0ciArPSAyVTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBodXNhcnQtPkluc3RhbmNlLT5URFIgPSAodWludDhfdCkoKmh1c2FydC0+cFR4QnVmZlB0cisrICYgKHVpbnQ4X3QpdWhNYXNrKTsKKyAgICAgICAgfQorICAgICAgICBodXNhcnQtPlR4WGZlckNvdW50LS07CisKKyAgICAgICAgLyogQ2hlY2sgdGhlIGxhdGVzdCBkYXRhIHRyYW5zbWl0dGVkICovCisgICAgICAgIGlmKGh1c2FydC0+VHhYZmVyQ291bnQgPT0gMFUpCisgICAgICAgIHsKKyAgICAgICAgICAgX19IQUxfVVNBUlRfRElTQUJMRV9JVChodXNhcnQsIFVTQVJUX0lUX1RYRSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZihodXNhcnQtPlJ4WGZlckNvdW50ICE9IDB4MDBVKQorICAgIHsKKyAgICAgIGlmKF9fSEFMX1VTQVJUX0dFVF9GTEFHKGh1c2FydCwgVVNBUlRfRkxBR19SWE5FKSAhPSBSRVNFVCkKKyAgICAgIHsKKyAgICAgICAgaWYoKGh1c2FydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVTQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodXNhcnQtPkluaXQuUGFyaXR5ID09IFVTQVJUX1BBUklUWV9OT05FKSkKKyAgICAgICAgeworICAgICAgICAgIHRtcCA9ICh1aW50MTZfdCopIGh1c2FydC0+cFJ4QnVmZlB0cjsKKyAgICAgICAgICAqdG1wID0gKHVpbnQxNl90KShodXNhcnQtPkluc3RhbmNlLT5SRFIgJiB1aE1hc2spOworICAgICAgICAgIGh1c2FydC0+cFJ4QnVmZlB0ciArPSAyVTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAqaHVzYXJ0LT5wUnhCdWZmUHRyKysgPSAodWludDhfdCkoaHVzYXJ0LT5JbnN0YW5jZS0+UkRSICYgKHVpbnQ4X3QpdWhNYXNrKTsKKyAgICAgICAgfQorICAgICAgICBodXNhcnQtPlJ4WGZlckNvdW50LS07CisgICAgICB9CisgICAgfQorCisgICAgLyogQ2hlY2sgdGhlIGxhdGVzdCBkYXRhIHJlY2VpdmVkICovCisgICAgaWYoaHVzYXJ0LT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBQYXJpdHkgRXJyb3IgSW50ZXJydXB0IGFuZCBSWE5FIGludGVycnVwdCovCisgICAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRSB8IFVTQVJUX0NSMV9QRUlFKSk7CisKKyAgICAgIC8qIERpc2FibGUgdGhlIFVTQVJUIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgICAvKiBSeCBwcm9jZXNzIGlzIGNvbXBsZXRlZCwgcmVzdG9yZSBodXNhcnQtPlN0YXRlIHRvIFJlYWR5ICovCisgICAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworCisgICAgICBIQUxfVVNBUlRfVHhSeENwbHRDYWxsYmFjayhodXNhcnQpOworCisgICAgICByZXR1cm4gSEFMX09LOworICAgIH0KKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfVVNBUlRfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmM3h4X2hhbF93d2RnLmMgYi9TcmMvc3RtMzJmM3h4X2hhbF93d2RnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYyZWY1ZAotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfaGFsX3d3ZGcuYwpAQCAtMCwwICsxLDMxOSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9oYWxfd3dkZy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBXV0RHIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcgCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBXaW5kb3cgV2F0Y2hkb2cgKFdXREcpIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb24KKyAgKiAgICAgICAgICAgKyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBXV0RHIHNwZWNpZmljIGZlYXR1cmVzICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgT25jZSBlbmFibGVkIHRoZSBXV0RHIGdlbmVyYXRlcyBhIHN5c3RlbSByZXNldCBvbiBleHBpcnkgb2YgYSBwcm9ncmFtbWVkCisgICAgdGltZSBwZXJpb2QsIHVubGVzcyB0aGUgcHJvZ3JhbSByZWZyZXNoZXMgdGhlIGNvdW50ZXIgKFRbNlU7MF0gZG93bmNvdW50ZXIpCisgICAgYmVmb3JlIHJlYWNoaW5nIDB4M0YgdmFsdWUgKGkuZS4gYSByZXNldCBpcyBnZW5lcmF0ZWQgd2hlbiB0aGUgY291bnRlcgorICAgIHZhbHVlIHJvbGxzIG92ZXIgZnJvbSAweDQwIHRvIDB4M0ZVKS4KKworICAgICgrKSBBbiBNQ1UgcmVzZXQgaXMgYWxzbyBnZW5lcmF0ZWQgaWYgdGhlIGNvdW50ZXIgdmFsdWUgaXMgcmVmcmVzaGVkCisgICAgICAgIGJlZm9yZSB0aGUgY291bnRlciBoYXMgcmVhY2hlZCB0aGUgcmVmcmVzaCB3aW5kb3cgdmFsdWUuIFRoaXMKKyAgICAgICAgaW1wbGllcyB0aGF0IHRoZSBjb3VudGVyIG11c3QgYmUgcmVmcmVzaGVkIGluIGEgbGltaXRlZCB3aW5kb3cuCisKKyAgICAoKykgT25jZSBlbmFibGVkIHRoZSBXV0RHIGNhbm5vdCBiZSBkaXNhYmxlZCBleGNlcHQgYnkgYSBzeXN0ZW0gcmVzZXQuCisKKyAgICAoKykgV1dER1JTVCBmbGFnIGluIFJDQ19DU1IgcmVnaXN0ZXIgaW5mb3JtcyB3aGVuIGEgV1dERyByZXNldCBoYXMgCisgICAgICAgIG9jY3VycmVkIChjaGVjayBhdmFpbGFibGUgd2l0aCBfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfV1dER1JTVCkpLgorCisgICAgKCspIFRoZSBXV0RHIGRvd25jb3VudGVyIGlucHV0IGNsb2NrIGlzIGRlcml2ZWQgZnJvbSB0aGUgQVBCIGNsb2NrIGRpdmlkZWQKKyAgICAgICAgYnkgYSBwcm9ncmFtbWFibGUgcHJlc2NhbGVyLgorCisgICAgKCspIFdXREcgZG93bmNvdW50ZXIgY2xvY2sgKEh6KSA9IFBDTEsxIC8gKDQwOTZVICogUHJlc2NhbGVyKQorCisgICAgKCspIFdXREcgdGltZW91dCAobXMpID0gKDEwMDBVICogKFRbNVU7MF0gKyAxVSkpIC8gKFdXREcgZG93bmNvdW50ZXIgY2xvY2spCisgICAgICAgIHdoZXJlIFRbNVU7MF0gYXJlIHRoZSBsb3dlc3QgNiBiaXRzIG9mIGRvd25jb3VudGVyLgorCisgICAgKCspIFdXREcgQ291bnRlciByZWZyZXNoIGlzIGFsbG93ZWQgYmV0d2VlbiB0aGUgZm9sbG93aW5nIGxpbWl0cyA6CisgICAgICAgICgrKykgbWluIHRpbWUgKG1zKSA9ICgxMDAwVSAqIChUWzVVOzBdIC0gV2luZG93KSkgLyAoV1dERyBkb3duY291bnRlciBjbG9jaykKKyAgICAgICAgKCsrKSBtYXggdGltZSAobXMpID0gKDEwMDBVICogKFRbNVU7MF0gLSAweDQwVSkpIC8gKFdXREcgZG93bmNvdW50ZXIgY2xvY2spCisKKyAgICAoKykgTWluLW1heCB0aW1lb3V0IHZhbHVlIEA0MiBNSHooUENMSzEpOiB+OTcuNSB1cyAvIH40OS45IG1zCisKKyAgICAoKykgVGhlIEVhcmx5IFdha2V1cCBJbnRlcnJ1cHQgKEVXSSkgY2FuIGJlIHVzZWQgaWYgc3BlY2lmaWMgc2FmZXR5IAorICAgICAgICBvcGVyYXRpb25zIG9yIGRhdGEgbG9nZ2luZyBtdXN0IGJlIHBlcmZvcm1lZCBiZWZvcmUgdGhlIGFjdHVhbCByZXNldCBpcworICAgICAgICBnZW5lcmF0ZWQuIFdoZW4gdGhlIGRvd25jb3VudGVyIHJlYWNoZXMgdGhlIHZhbHVlIDB4NDBVLCBhbiBFV0kgaW50ZXJydXB0CisgICAgICAgIGlzIGdlbmVyYXRlZCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSAoSVNSKSBjYW4gCisgICAgICAgIGJlIHVzZWQgdG8gdHJpZ2dlciBzcGVjaWZpYyBhY3Rpb25zIChzdWNoIGFzIGNvbW11bmljYXRpb25zIG9yIGRhdGEgCisgICAgICAgIGxvZ2dpbmcpLCBiZWZvcmUgcmVzZXR0aW5nIHRoZSBkZXZpY2UuCisgICAgICAgIEluIHNvbWUgYXBwbGljYXRpb25zLCB0aGUgRVdJIGludGVycnVwdCBjYW4gYmUgdXNlZCB0byBtYW5hZ2UgYSBzb2Z0d2FyZQorICAgICAgICBzeXN0ZW0gY2hlY2sgYW5kL29yIHN5c3RlbSByZWNvdmVyeS9ncmFjZWZ1bCBkZWdyYWRhdGlvbiwgd2l0aG91dCAKKyAgICAgICAgZ2VuZXJhdGluZyBhIFdXREcgcmVzZXQuIEluIHRoaXMgY2FzZSwgdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJydXB0IAorICAgICAgICBzZXJ2aWNlIHJvdXRpbmUgKElTUikgc2hvdWxkIHJlbG9hZCB0aGUgV1dERyBjb3VudGVyIHRvIGF2b2lkIHRoZSBXV0RHIAorICAgICAgICByZXNldCwgdGhlbiB0cmlnZ2VyIHRoZSByZXF1aXJlZCBhY3Rpb25zLgorICAgICAgICBOb3RlOldoZW4gdGhlIEVXSSBpbnRlcnJ1cHQgY2Fubm90IGJlIHNlcnZlZCwgZS5nLiBkdWUgdG8gYSBzeXN0ZW0gbG9jayAKKyAgICAgICAgaW4gYSBoaWdoZXIgcHJpb3JpdHkgdGFzaywgdGhlIFdXREcgcmVzZXQgd2lsbCBldmVudHVhbGx5IGJlIGdlbmVyYXRlZC4KKworICAgICgrKSBEZWJ1ZyBtb2RlIDogV2hlbiB0aGUgbWljcm9jb250cm9sbGVyIGVudGVycyBkZWJ1ZyBtb2RlIChjb3JlIGhhbHRlZCksCisgICAgICAgIHRoZSBXV0RHIGNvdW50ZXIgZWl0aGVyIGNvbnRpbnVlcyB0byB3b3JrIG5vcm1hbGx5IG9yIHN0b3BzLCBkZXBlbmRpbmcgCisgICAgICAgIG9uIERCR19XV0RHX1NUT1AgY29uZmlndXJhdGlvbiBiaXQgaW4gREJHIG1vZHVsZSwgYWNjZXNzaWJsZSB0aHJvdWdoCisgICAgICAgIF9fSEFMX0RCR01DVV9GUkVFWkVfV1dERygpIGFuZCBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfV1dERygpIG1hY3JvcworCisgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgKCspIEVuYWJsZSBXV0RHIEFQQjEgY2xvY2sgdXNpbmcgX19IQUxfUkNDX1dXREdfQ0xLX0VOQUJMRSgpLgorCisgICAgKCspIFNldCB0aGUgV1dERyBwcmVzY2FsZXIsIHJlZnJlc2ggd2luZG93LCBjb3VudGVyIHZhbHVlIGFuZCBFYXJseSBXYWtldXAgCisgICAgICAgIEludGVycnVwdCBtb2RlIHVzaW5nIHVzaW5nIEhBTF9XV0RHX0luaXQoKSBmdW5jdGlvbi4KKyAgICAgICAgVGhpcyBlbmFibGVzIFdXREcgcGVyaXBoZXJhbCBhbmQgdGhlIGRvd25jb3VudGVyIHN0YXJ0cyBkb3duY291bnRpbmcgCisgICAgICAgIGZyb20gZ2l2ZW4gY291bnRlciB2YWx1ZS4KKyAgICAgICAgSW5pdCBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGFnYWluIHRvIG1vZGlmeSBhbGwgd2F0Y2hkb2cgcGFyYW1ldGVycywgCisgICAgICAgIGhvd2V2ZXIgaWYgRVdJIG1vZGUgaGFzIGJlZW4gc2V0IG9uY2UsIGl0IGNhbid0IGJlIGNsZWFyIHVudGlsIG5leHQgCisgICAgICAgIHJlc2V0LgorCisgICAgKCspIFRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtIG11c3QgcmVmcmVzaCB0aGUgV1dERyBjb3VudGVyIGF0IHJlZ3VsYXIKKyAgICAgICAgaW50ZXJ2YWxzIGR1cmluZyBub3JtYWwgb3BlcmF0aW9uIHRvIHByZXZlbnQgYW4gTUNVIHJlc2V0IHVzaW5nCisgICAgICAgIEhBTF9XV0RHX1JlZnJlc2goKSBmdW5jdGlvbi4gVGhpcyBvcGVyYXRpb24gbXVzdCBvY2N1ciBvbmx5IHdoZW4KKyAgICAgICAgdGhlIGNvdW50ZXIgaXMgbG93ZXIgdGhhbiB0aGUgd2luZG93IHZhbHVlIGFscmVhZHkgcHJvZ3JhbW1lZC4KKworICAgICgrKSBpZiBFYXJseSBXYWtldXAgSW50ZXJydXB0IG1vZGUgaXMgZW5hYmxlIGFuIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgd2hlbiAKKyAgICAgICAgdGhlIGNvdW50ZXIgcmVhY2hlcyAweDQwLiBVc2VyIGNhbiBhZGQgaGlzIG93biBjb2RlIGluIHdlYWsgZnVuY3Rpb24gCisgICAgICAgIEhBTF9XV0RHX0Vhcmx5V2FrZXVwQ2FsbGJhY2soKS4KKworICAgICAqKiogV1dERyBIQUwgZHJpdmVyIG1hY3JvcyBsaXN0ICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0KKyAgICAgICBCZWxvdyB0aGUgbGlzdCBvZiBtb3N0IHVzZWQgbWFjcm9zIGluIFdXREcgSEFMIGRyaXZlci4KKworICAgICAgKCspIF9fSEFMX1dXREdfR0VUX0lUX1NPVVJDRTogQ2hlY2sgdGhlIHNlbGVjdGVkIFdXREcncyBpbnRlcnJ1cHQgc291cmNlLgorICAgICAgKCspIF9fSEFMX1dXREdfR0VUX0ZMQUc6IEdldCB0aGUgc2VsZWN0ZWQgV1dERydzIGZsYWcgc3RhdHVzLgorICAgICAgKCspIF9fSEFMX1dXREdfQ0xFQVJfRkxBRzogQ2xlYXIgdGhlIFdXREcncyBwZW5kaW5nIGZsYWdzLgorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfV1dER19NT0RVTEVfRU5BQkxFRAorLyoqIEBkZWZncm91cCBXV0RHIFdXREcKKyAgKiBAYnJpZWYgV1dERyBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgV1dER19FeHBvcnRlZF9GdW5jdGlvbnMgV1dERyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFdXREdfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zLgorICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0gIAorICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgSW5pdGlhbGl6ZSBhbmQgc3RhcnQgdGhlIFdXREcgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycworICAgICAgICAgIGluIHRoZSBXV0RHX0luaXRUeXBlRGVmIG9mIGFzc29jaWF0ZWQgaGFuZGxlLgorICAgICAgKCspIEluaXRpYWxpemUgdGhlIFdXREcgTVNQLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFdXREcgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQuCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBXV0RHX0luaXRUeXBlRGVmIG9mICBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGh3d2RnICBwb2ludGVyIHRvIGEgV1dER19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgV1dERyBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfV1dER19Jbml0KFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcpCit7CisgIC8qIENoZWNrIHRoZSBXV0RHIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmKGh3d2RnID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1dXREdfQUxMX0lOU1RBTkNFKGh3d2RnLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfV1dER19QUkVTQ0FMRVIoaHd3ZGctPkluaXQuUHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19XV0RHX1dJTkRPVyhod3dkZy0+SW5pdC5XaW5kb3cpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1dXREdfQ09VTlRFUihod3dkZy0+SW5pdC5Db3VudGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19XV0RHX0VXSV9NT0RFKGh3d2RnLT5Jbml0LkVXSU1vZGUpKTsKKworICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgSEFMX1dXREdfTXNwSW5pdChod3dkZyk7CisKKyAgLyogU2V0IFdXREcgQ291bnRlciAqLworICBXUklURV9SRUcoaHd3ZGctPkluc3RhbmNlLT5DUiwgKFdXREdfQ1JfV0RHQSB8IGh3d2RnLT5Jbml0LkNvdW50ZXIpKTsKKworICAvKiBTZXQgV1dERyBQcmVzY2FsZXIgYW5kIFdpbmRvdyAqLworICBXUklURV9SRUcoaHd3ZGctPkluc3RhbmNlLT5DRlIsIChod3dkZy0+SW5pdC5FV0lNb2RlIHwgaHd3ZGctPkluaXQuUHJlc2NhbGVyIHwgaHd3ZGctPkluaXQuV2luZG93KSk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgV1dERyBNU1AuCisgICogQHBhcmFtICBod3dkZyAgcG9pbnRlciB0byBhIFdXREdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFdXREcgbW9kdWxlLgorICAqIEBub3RlICAgV2hlbiByZXdyaXRpbmcgdGhpcyBmdW5jdGlvbiBpbiB1c2VyIGZpbGUsIG1lY2hhbmlzbSBtYXkgYmUgYWRkZWQKKyAgKiAgICAgICAgIHRvIGF2b2lkIG11bHRpcGxlIGluaXRpYWxpemUgd2hlbiBIQUxfV1dER19Jbml0IGZ1bmN0aW9uIGlzIGNhbGxlZAorICAqICAgICAgICAgYWdhaW4gdG8gY2hhbmdlIHBhcmFtZXRlcnMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfV1dER19Nc3BJbml0KFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh3d2RnKTsKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgdGhlIEhBTF9XV0RHX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBXV0RHX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgICBJTyBvcGVyYXRpb24gZnVuY3Rpb25zIAorICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgIFsuLl0KKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICgrKSBSZWZyZXNoIHRoZSBXV0RHLgorICAgICgrKSBIYW5kbGUgV1dERyBpbnRlcnJ1cHQgcmVxdWVzdCBhbmQgYXNzb2NpYXRlZCBmdW5jdGlvbiBjYWxsYmFjay4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZWZyZXNoIHRoZSBXV0RHLgorICAqIEBwYXJhbSAgaHd3ZGcgIHBvaW50ZXIgdG8gYSBXV0RHX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBXV0RHIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9XV0RHX1JlZnJlc2goV1dER19IYW5kbGVUeXBlRGVmICpod3dkZykKK3sKKyAgLyogV3JpdGUgdG8gV1dERyBDUiB0aGUgV1dERyBDb3VudGVyIHZhbHVlIHRvIHJlZnJlc2ggd2l0aCAqLworICBXUklURV9SRUcoaHd3ZGctPkluc3RhbmNlLT5DUiwgKGh3d2RnLT5Jbml0LkNvdW50ZXIpKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIFdXREcgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQG5vdGUgICBUaGUgRWFybHkgV2FrZXVwIEludGVycnVwdCAoRVdJKSBjYW4gYmUgdXNlZCBpZiBzcGVjaWZpYyBzYWZldHkgb3BlcmF0aW9ucworICAqICAgICAgICAgb3IgZGF0YSBsb2dnaW5nIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSB0aGUgYWN0dWFsIHJlc2V0IGlzIGdlbmVyYXRlZC4KKyAgKiAgICAgICAgIFRoZSBFV0kgaW50ZXJydXB0IGlzIGVuYWJsZWQgYnkgY2FsbGluZyBIQUxfV1dER19Jbml0IGZ1bmN0aW9uIHdpdGggCisgICogICAgICAgICBFV0lNb2RlIHNldCB0byBXV0RHX0VXSV9FTkFCTEUuCisgICogICAgICAgICBXaGVuIHRoZSBkb3duY291bnRlciByZWFjaGVzIHRoZSB2YWx1ZSAweDQwLCBhbmQgRVdJIGludGVycnVwdCBpcworICAqICAgICAgICAgZ2VuZXJhdGVkIGFuZCB0aGUgY29ycmVzcG9uZGluZyBJbnRlcnJ1cHQgU2VydmljZSBSb3V0aW5lIChJU1IpIGNhbgorICAqICAgICAgICAgYmUgdXNlZCB0byB0cmlnZ2VyIHNwZWNpZmljIGFjdGlvbnMgKHN1Y2ggYXMgY29tbXVuaWNhdGlvbnMgb3IgZGF0YQorICAqICAgICAgICAgbG9nZ2luZyksIGJlZm9yZSByZXNldHRpbmcgdGhlIGRldmljZS4KKyAgKiBAcGFyYW0gIGh3d2RnICBwb2ludGVyIHRvIGEgV1dER19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgV1dERyBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9XV0RHX0lSUUhhbmRsZXIoV1dER19IYW5kbGVUeXBlRGVmICpod3dkZykKK3sKKyAgLyogQ2hlY2sgaWYgRWFybHkgV2FrZXVwIEludGVycnVwdCBpcyBlbmFibGUgKi8KKyAgaWYoX19IQUxfV1dER19HRVRfSVRfU09VUkNFKGh3d2RnLCBXV0RHX0lUX0VXSSkgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBDaGVjayBpZiBXV0RHIEVhcmx5IFdha2V1cCBJbnRlcnJ1cHQgb2NjdXJyZWQgKi8KKyAgICBpZihfX0hBTF9XV0RHX0dFVF9GTEFHKGh3d2RnLCBXV0RHX0ZMQUdfRVdJRikgIT0gUkVTRVQpCisgICAgeworICAgICAgLyogQ2xlYXIgdGhlIFdXREcgRWFybHkgV2FrZXVwIGZsYWcgKi8KKyAgICAgIF9fSEFMX1dXREdfQ0xFQVJfRkxBRyhod3dkZywgV1dER19GTEFHX0VXSUYpOworCisgICAgICAvKiBFYXJseSBXYWtldXAgY2FsbGJhY2sgKi8gCisgICAgICBIQUxfV1dER19FYXJseVdha2V1cENhbGxiYWNrKGh3d2RnKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBXV0RHIEVhcmx5IFdha2V1cCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGh3d2RnICBwb2ludGVyIHRvIGEgV1dER19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgV1dERyBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfV1dER19FYXJseVdha2V1cENhbGxiYWNrKFdXREdfSGFuZGxlVHlwZURlZiogaHd3ZGcpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh3d2RnKTsKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgdGhlIEhBTF9XV0RHX0Vhcmx5V2FrZXVwQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9XV0RHX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjN4eF9sbF9hZGMuYyBiL1NyYy9zdG0zMmYzeHhfbGxfYWRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRjMzQ4NwotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfbGxfYWRjLmMKQEAgLTAsMCArMSwyMDA5IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2xsX2FkYy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBBREMgTEwgbW9kdWxlIGRyaXZlcgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfbGxfYWRjLmgiCisjaW5jbHVkZSAic3RtMzJmM3h4X2xsX2J1cy5oIgorCisjaWZkZWYgIFVTRV9GVUxMX0FTU0VSVAorICAjaW5jbHVkZSAic3RtMzJfYXNzZXJ0LmgiCisjZWxzZQorICAjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiBOb3RlOiBEZXZpY2VzIG9mIFNUTTMyRjMgc2VyaWUgZW1iZWQgMSBvdXQgb2YgMiBkaWZmZXJlbnQgQURDIElQLiAgIGIgICAgICAqLworLyogICAgICAgLSBTVE0zMkYzMHgsIFNUTTMyRjMxeCwgU1RNMzJGMzJ4LCBTVE0zMkYzM3gsIFNUTTMyRjM1eCwgU1RNMzJGMzl4OiAgKi8KKy8qICAgICAgICAgQURDIElQIDVNc2FtcGxlcy9zZWMsIGZyb20gMSB0byA0IEFEQyBpbnN0YW5jZXMgYW5kIG90aGVyIHNwZWNpZmljICovCisvKiAgICAgICAgIGZlYXR1cmVzIChyZWZlciB0byByZWZlcmVuY2UgbWFudWFsKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgLSBTVE0zMkYzN3g6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgQURDIElQIDFNc2FtcGxlcy9zZWMsIDEgQURDIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRyaXZlcnMgb2YgdGhlc2UgQURDIElQLCBsb2NhdGVkIGluIDIgYXJlYSAgICAqLworLyogICAgICAgZGVsaW1pdGVkIGJ5IGNvbXBpbGF0aW9uIHN3aXRjaGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2lmIGRlZmluZWQoQURDNV9WMV8xKQorCisjaWYgZGVmaW5lZCAoQURDMSkgfHwgZGVmaW5lZCAoQURDMikgfHwgZGVmaW5lZCAoQURDMykgfHwgZGVmaW5lZCAoQURDNCkKKworLyoqIEBhZGR0b2dyb3VwIEFEQ19MTCBBREMKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgQURDX0xMX1ByaXZhdGVfQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyogRGVmaW5pdGlvbnMgb2YgQURDIGhhcmR3YXJlIGNvbnN0cmFpbnRzIGRlbGF5cyAqLworLyogTm90ZTogT25seSBBREMgSVAgSFcgZGVsYXlzIGFyZSBkZWZpbmVkIGluIEFEQyBMTCBkcml2ZXIgZHJpdmVyLCAgICAgICAgICAgKi8KKy8qICAgICAgIG5vdCB0aW1lb3V0IHZhbHVlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBUaW1lb3V0IHZhbHVlcyBmb3IgQURDIG9wZXJhdGlvbnMgYXJlIGRlcGVuZGVudCB0byBkZXZpY2UgY2xvY2sgICAgICAqLworLyogICAgICAgY29uZmlndXJhdGlvbiAoc3lzdGVtIGNsb2NrIHZlcnN1cyBBREMgY2xvY2spLCAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIGFuZCB0aGVyZWZvcmUgbXVzdCBiZSBkZWZpbmVkIGluIHVzZXIgYXBwbGljYXRpb24uICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBSZWZlciB0byBAcmVmIEFEQ19MTF9FQ19IV19ERUxBWVMgZm9yIGRlc2NyaXB0aW9uIG9mIEFEQyB0aW1lb3V0ICAgICAqLworLyogICAgICAgdmFsdWVzIGRlZmluaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5vdGU6IEFEQyB0aW1lb3V0IHZhbHVlcyBhcmUgZGVmaW5lZCBoZXJlIGluIENQVSBjeWNsZXMgdG8gYmUgaW5kZXBlbmRlbnQgICovCisvKiAgICAgICBvZiBkZXZpY2UgY2xvY2sgc2V0dGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgSW4gdXNlciBhcHBsaWNhdGlvbiwgQURDIHRpbWVvdXQgdmFsdWVzIHNob3VsZCBiZSBkZWZpbmVkIHdpdGggICAgICAgKi8KKy8qICAgICAgIHRlbXBvcmFsIHZhbHVlcywgaW4gZnVuY3Rpb24gb2YgZGV2aWNlIGNsb2NrIHNldHRpbmdzLiAgICAgICAgICAgICAgICovCisvKiAgICAgICBIaWdoZXN0IHJhdGlvIENQVSBjbG9jayBmcmVxdWVuY3kgdnMgQURDIGNsb2NrIGZyZXF1ZW5jeTogICAgICAgICAgICAqLworLyogICAgICAgIC0gQURDIGNsb2NrIGZyb20gc3luY2hyb25vdXMgY2xvY2sgd2l0aCBBSEIgcHJlc2NhbGVyIDUxMiwgICAgICAgICAgKi8KKy8qICAgICAgICAgIEFQQiBwcmVzY2FsZXIgMTYsIEFEQyBwcmVzY2FsZXIgNC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgLSBBREMgY2xvY2sgZnJvbSBhc3luY2hyb25vdXMgY2xvY2sgKFBMTCkgd2l0aCBwcmVzY2FsZXIgMSwgICAgICAgICAqLworLyogICAgICAgICAgd2l0aCBoaWdoZXN0IHJhdGlvIENQVSBjbG9jayBmcmVxdWVuY3kgdnMgSFNJIGNsb2NrIGZyZXF1ZW5jeTogICAgKi8KKy8qICAgICAgICAgIENQVSBjbG9jayBmcmVxdWVuY3kgbWF4IDcyTUh6LCBQTEwgZnJlcXVlbmN5IDcyTUh6OiByYXRpbyAxLiAgICAgICovCisvKiBVbml0OiBDUFUgY3ljbGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRENfQ0xPQ0tfUkFUSU9fVlNfQ1BVX0hJR0hFU1QgICAgICAgICAgKCh1aW50MzJfdCkgNTEyVSAqIDE2VSAqIDRVKQorI2RlZmluZSBBRENfVElNRU9VVF9ESVNBQkxFX0NQVV9DWUNMRVMgICAgICAgICAgKEFEQ19DTE9DS19SQVRJT19WU19DUFVfSElHSEVTVCAqIDFVKQorI2RlZmluZSBBRENfVElNRU9VVF9TVE9QX0NPTlZFUlNJT05fQ1BVX0NZQ0xFUyAgKEFEQ19DTE9DS19SQVRJT19WU19DUFVfSElHSEVTVCAqIDFVKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgQURDX0xMX1ByaXZhdGVfTWFjcm9zCisgICogQHsKKyAgKi8KKworLyogQ2hlY2sgb2YgcGFyYW1ldGVycyBmb3IgY29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiAgICAgICAgICAgKi8KKy8qIGNvbW1vbiB0byBzZXZlcmFsIEFEQyBpbnN0YW5jZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTX0xMX0FEQ19DT01NT05fQ0xPQ0soX19DTE9DS19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoICAgKChfX0NMT0NLX18pID09IExMX0FEQ19DTE9DS19TWU5DX1BDTEtfRElWMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fQ0xPQ0tfXykgPT0gTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVY0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0NMT0NLX18pID09IExMX0FEQ19DTE9DS19BU1lOQ19ESVYxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisvKiBDaGVjayBvZiBwYXJhbWV0ZXJzIGZvciBjb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6ICAgICAgICAgICAqLworLyogQURDIGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVNfTExfQURDX1JFU09MVVRJT04oX19SRVNPTFVUSU9OX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fUkVTT0xVVElPTl9fKSA9PSBMTF9BRENfUkVTT0xVVElPTl8xMkIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFU09MVVRJT05fXykgPT0gTExfQURDX1JFU09MVVRJT05fMTBCKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRVNPTFVUSU9OX18pID09IExMX0FEQ19SRVNPTFVUSU9OXzhCKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVTT0xVVElPTl9fKSA9PSBMTF9BRENfUkVTT0xVVElPTl82QikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKyNkZWZpbmUgSVNfTExfQURDX0RBVEFfQUxJR04oX19EQVRBX0FMSUdOX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fREFUQV9BTElHTl9fKSA9PSBMTF9BRENfREFUQV9BTElHTl9SSUdIVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0RBVEFfQUxJR05fXykgPT0gTExfQURDX0RBVEFfQUxJR05fTEVGVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisjZGVmaW5lIElTX0xMX0FEQ19MT1dfUE9XRVIoX19MT1dfUE9XRVJfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoICAgKChfX0xPV19QT1dFUl9fKSA9PSBMTF9BRENfTFBfTU9ERV9OT05FKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19MT1dfUE9XRVJfXykgPT0gTExfQURDX0xQX0FVVE9XQUlUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKworLyogQ2hlY2sgb2YgcGFyYW1ldGVycyBmb3IgY29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiAgICAgICAgICAgKi8KKy8qIEFEQyBncm91cCByZWd1bGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkKKyNkZWZpbmUgSVNfTExfQURDX1JFR19UUklHX1NPVVJDRShfX0FEQ19JTlNUQU5DRV9fLCBfX1JFR19UUklHX1NPVVJDRV9fKSAgICAgICBcCisgICgoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMxKSB8fCAoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzIpKSAgICAgICAgICAgICAgXAorICAgID8gKCAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX1NPRlRXQVJFKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDFfQURDMTIpICAgICAgICBcCisgICAgICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gyX0FEQzEyKSAgICAgICAgXAorICAgICAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMykgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDJfQURDMTIpICAgICAgICBcCisgICAgICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfVFJHT19BREMxMikgICAgICAgXAorICAgICAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU00X0NINF9BREMxMikgICAgICAgIFwKKyAgICAgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfRVhUSV9MSU5FMTFfQURDMTIpICAgICBcCisgICAgICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfVFJHT19BREMxMikgICAgICAgXAorICAgICAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU04X1RSR08yKSAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9UUkdPKSAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfVFJHTzIpICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yX1RSR09fQURDMTIpICAgICAgIFwKKyAgICAgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9UUkdPKSAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTZfVFJHT19BREMxMikgICAgICAgXAorICAgICAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xNV9UUkdPKSAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19DSDRfQURDMTIpICAgICAgICBcCisgICAgICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX1RSRzBfQURDMTIpICAgICAgXAorICAgICAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9UUkcwMl9BREMxMikgICAgIFwKKyAgICAgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjBfQ0gxX0FEQzEyKSAgICAgICBcCisgICAgICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX0NIMl9BREMxMikgICAgICAgXAorICAgICAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9DSDNfQURDMTIpICAgICAgIFwKKyAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKCAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX1NPRlRXQVJFKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19DSDFfQURDMzQpICAgICAgICBcCisgICAgICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfQ0gzX0FEQzM0KSAgICAgICAgXAorICAgICAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMykgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNOF9DSDFfQURDMzQpICAgICAgICBcCisgICAgICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfVFJHT19fQURDMzQpICAgICAgXAorICAgICAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9FWFRJX0xJTkUyX0FEQzM0KSAgICAgIFwKKyAgICAgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9DSDFfQURDMzQpICAgICAgICBcCisgICAgICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfVFJHT19fQURDMzQpICAgICAgXAorICAgICAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU04X1RSR08yKSAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9UUkdPKSAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfVFJHTzIpICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0zX1RSR09fX0FEQzM0KSAgICAgIFwKKyAgICAgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9UUkdPKSAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTdfVFJHT19BREMzNCkgICAgICAgXAorICAgICAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xNV9UUkdPKSAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDFfQURDMzQpICAgICAgICBcCisgICAgICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX1RSRzBfQURDMzQpICAgICAgXAorICAgICAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9UUkcwMl9BREMzNCkgICAgIFwKKyAgICAgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjBfQ0gxX0FEQzM0KSAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisjZWxpZiBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorI2RlZmluZSBJU19MTF9BRENfUkVHX1RSSUdfU09VUkNFKF9fQURDX0lOU1RBTkNFX18sIF9fUkVHX1RSSUdfU09VUkNFX18pICAgICAgIFwKKyAgKCgoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzEpIHx8ICgoX19BRENfSU5TVEFOQ0VfXykgPT0gQURDMikpICAgICAgICAgICAgICBcCisgICAgPyAoICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfU09GVFdBUkUpICAgICAgICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMV9BREMxMikgICAgICAgIFwKKyAgICAgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDJfQURDMTIpICAgICAgICBcCisgICAgICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gzKSAgICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMl9BREMxMikgICAgICAgIFwKKyAgICAgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19UUkdPX0FEQzEyKSAgICAgICBcCisgICAgICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfQ0g0X0FEQzEyKSAgICAgICAgXAorICAgICAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9FWFRJX0xJTkUxMV9BREMxMikgICAgIFwKKyAgICAgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNOF9UUkdPX0FEQzEyKSAgICAgICBcCisgICAgICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfVFJHTzIpICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08pICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9UUkdPMikgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfVFJHT19BREMxMikgICAgICAgXAorICAgICAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU00X1RSR08pICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNNl9UUkdPX0FEQzEyKSAgICAgICBcCisgICAgICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTE1X1RSR08pICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0zX0NINF9BREMxMikgICAgICAgIFwKKyAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKCAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX1NPRlRXQVJFKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19DSDFfQURDMzQpICAgICAgICBcCisgICAgICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfQ0gzX0FEQzM0KSAgICAgICAgXAorICAgICAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMykgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNOF9DSDFfQURDMzQpICAgICAgICBcCisgICAgICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfVFJHT19fQURDMzQpICAgICAgXAorICAgICAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9FWFRJX0xJTkUyX0FEQzM0KSAgICAgIFwKKyAgICAgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9DSDFfQURDMzQpICAgICAgICBcCisgICAgICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfVFJHT19fQURDMzQpICAgICAgXAorICAgICAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU04X1RSR08yKSAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9UUkdPKSAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfVFJHTzIpICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0zX1RSR09fX0FEQzM0KSAgICAgIFwKKyAgICAgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9UUkdPKSAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTdfVFJHT19BREMzNCkgICAgICAgXAorICAgICAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xNV9UUkdPKSAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDFfQURDMzQpICAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisjZWxpZiBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KQorI2RlZmluZSBJU19MTF9BRENfUkVHX1RSSUdfU09VUkNFKF9fUkVHX1RSSUdfU09VUkNFX18pICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX1NPRlRXQVJFKSAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDEpICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gyKSAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMykgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDIpICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfVFJHTykgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU00X0NINCkgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfRVhUSV9MSU5FMTEpICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfVFJHTykgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08pICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9UUkdPMikgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfVFJHTykgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU00X1RSR08pICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNNl9UUkdPKSAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTE1X1RSR08pICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0zX0NINCkgICAgICAgICAgICAgICAgICBcCisgICkKKyNlbGlmIGRlZmluZWQoU1RNMzJGMzM0eDgpCisjZGVmaW5lIElTX0xMX0FEQ19SRUdfVFJJR19TT1VSQ0UoX19SRUdfVFJJR19TT1VSQ0VfXykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfU09GVFdBUkUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMSkgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDIpICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gzKSAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMikgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19UUkdPKSAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX0VYVElfTElORTExKSAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkcxKSAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHMykgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfVFJHTykgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08yKSAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9UUkdPKSAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTZfVFJHTykgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xNV9UUkdPKSAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19DSDQpICAgICAgICAgICAgICAgICAgXAorICApCisjZWxpZiBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwMnhFKQorI2RlZmluZSBJU19MTF9BRENfUkVHX1RSSUdfU09VUkNFKF9fUkVHX1RSSUdfU09VUkNFX18pICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX1NPRlRXQVJFKSAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDEpICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gyKSAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMykgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDIpICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfVFJHTykgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU00X0NINCkgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfRVhUSV9MSU5FMTEpICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfVFJHTykgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08yKSAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9UUkdPKSAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfVFJHTykgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU02X1RSR08pICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMTVfVFJHTykgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfQ0g0KSAgICAgICAgICAgICAgICAgIFwKKyAgKQorI2VsaWYgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkKKyNkZWZpbmUgSVNfTExfQURDX1JFR19UUklHX1NPVVJDRShfX1JFR19UUklHX1NPVVJDRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gxKSAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMikgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDMpICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX0VYVElfTElORTExKSAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08pICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9UUkdPMikgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfVFJHTykgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU02X1RSR08pICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMTVfVFJHTykgICAgICAgICAgICAgICAgXAorICApCisjZW5kaWYKKworI2RlZmluZSBJU19MTF9BRENfUkVHX0NPTlRJTlVPVVNfTU9ERShfX1JFR19DT05USU5VT1VTX01PREVfXykgICAgICAgICAgICAgICAgIFwKKyAgKCAgICgoX19SRUdfQ09OVElOVU9VU19NT0RFX18pID09IExMX0FEQ19SRUdfQ09OVl9TSU5HTEUpICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX0NPTlRJTlVPVVNfTU9ERV9fKSA9PSBMTF9BRENfUkVHX0NPTlZfQ09OVElOVU9VUykgICAgICAgICAgICAgICAgXAorICApCisKKyNkZWZpbmUgSVNfTExfQURDX1JFR19ETUFfVFJBTlNGRVIoX19SRUdfRE1BX1RSQU5TRkVSX18pICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fUkVHX0RNQV9UUkFOU0ZFUl9fKSA9PSBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9OT05FKSAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19ETUFfVFJBTlNGRVJfXykgPT0gTExfQURDX1JFR19ETUFfVFJBTlNGRVJfTElNSVRFRCkgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfRE1BX1RSQU5TRkVSX18pID09IExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX1VOTElNSVRFRCkgICAgICAgICAgICBcCisgICkKKworI2RlZmluZSBJU19MTF9BRENfUkVHX09WUl9EQVRBX0JFSEFWSU9SKF9fUkVHX09WUl9EQVRBX0JFSEFWSU9SX18pICAgICAgICAgICAgIFwKKyAgKCAgICgoX19SRUdfT1ZSX0RBVEFfQkVIQVZJT1JfXykgPT0gTExfQURDX1JFR19PVlJfREFUQV9QUkVTRVJWRUQpICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX09WUl9EQVRBX0JFSEFWSU9SX18pID09IExMX0FEQ19SRUdfT1ZSX0RBVEFfT1ZFUldSSVRURU4pICAgICAgICAgXAorICApCisKKyNkZWZpbmUgSVNfTExfQURDX1JFR19TRVFfU0NBTl9MRU5HVEgoX19SRUdfU0VRX1NDQU5fTEVOR1RIX18pICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fUkVHX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfUkVHX1NFUV9TQ0FOX0RJU0FCTEUpICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMlJBTktTKSAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfU0VRX1NDQU5fTEVOR1RIX18pID09IExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzNSQU5LUykgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV80UkFOS1MpICAgICAgICAgXAorICAgfHwgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfNVJBTktTKSAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfU0VRX1NDQU5fTEVOR1RIX18pID09IExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzZSQU5LUykgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV83UkFOS1MpICAgICAgICAgXAorICAgfHwgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfOFJBTktTKSAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfU0VRX1NDQU5fTEVOR1RIX18pID09IExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzlSQU5LUykgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xMFJBTktTKSAgICAgICAgXAorICAgfHwgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTFSQU5LUykgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfU0VRX1NDQU5fTEVOR1RIX18pID09IExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzEyUkFOS1MpICAgICAgICBcCisgICB8fCAoKF9fUkVHX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xM1JBTktTKSAgICAgICAgXAorICAgfHwgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTRSQU5LUykgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfU0VRX1NDQU5fTEVOR1RIX18pID09IExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzE1UkFOS1MpICAgICAgICBcCisgICB8fCAoKF9fUkVHX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xNlJBTktTKSAgICAgICAgXAorICApCisKKyNkZWZpbmUgSVNfTExfQURDX1JFR19TRVFfU0NBTl9ESVNDT05UX01PREUoX19SRUdfU0VRX0RJU0NPTlRfTU9ERV9fKSAgICAgICAgICBcCisgICggICAoKF9fUkVHX1NFUV9ESVNDT05UX01PREVfXykgPT0gTExfQURDX1JFR19TRVFfRElTQ09OVF9ESVNBQkxFKSAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19TRVFfRElTQ09OVF9NT0RFX18pID09IExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfMVJBTkspICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfU0VRX0RJU0NPTlRfTU9ERV9fKSA9PSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzJSQU5LUykgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1NFUV9ESVNDT05UX01PREVfXykgPT0gTExfQURDX1JFR19TRVFfRElTQ09OVF8zUkFOS1MpICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19TRVFfRElTQ09OVF9NT0RFX18pID09IExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfNFJBTktTKSAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfU0VRX0RJU0NPTlRfTU9ERV9fKSA9PSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzVSQU5LUykgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1NFUV9ESVNDT05UX01PREVfXykgPT0gTExfQURDX1JFR19TRVFfRElTQ09OVF82UkFOS1MpICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19TRVFfRElTQ09OVF9NT0RFX18pID09IExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfN1JBTktTKSAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfU0VRX0RJU0NPTlRfTU9ERV9fKSA9PSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzhSQU5LUykgICAgICAgICAgICBcCisgICkKKworLyogQ2hlY2sgb2YgcGFyYW1ldGVycyBmb3IgY29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiAgICAgICAgICAgKi8KKy8qIEFEQyBncm91cCBpbmplY3RlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkKKyNkZWZpbmUgSVNfTExfQURDX0lOSl9UUklHX1NPVVJDRShfX0FEQ19JTlNUQU5DRV9fLCBfX0lOSl9UUklHX1NPVVJDRV9fKSAgICAgICBcCisgICgoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMxKSB8fCAoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzIpKSAgICAgICAgICAgICAgXAorICAgID8gKCAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX1NPRlRXQVJFKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPKSAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfQ0g0KSAgICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0yX1RSR09fQURDMTIpICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9DSDFfQURDMTIpICAgICAgICBcCisgICAgICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0g0X0FEQzEyKSAgICAgICAgXAorICAgICAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU00X1RSR09fQURDMTIpICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfRVhUSV9MSU5FMTVfQURDMTIpICAgICBcCisgICAgICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfQ0g0X0FEQzEyKSAgICAgICAgXAorICAgICAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xX1RSR08yKSAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9UUkdPKSAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfVFJHTzIpICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NIM19BREMxMikgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19UUkdPKSAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0gxX0FEQzEyKSAgICAgICAgXAorICAgICAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU02X1RSR09fQURDMTIpICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMTVfVFJHTykgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTIwX1RSR09fQURDMTIpICAgICAgXAorICAgICAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9UUkdPMl9BREMxMikgICAgIFwKKyAgICAgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfQ0g0X0FEQzEyKSAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICggICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSkgICAgICAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfVFJHTykgICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xX0NINCkgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9DSDNfQURDMzQpICAgICAgICBcCisgICAgICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfQ0gyX0FEQzM0KSAgICAgICAgXAorICAgICAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NINF9fQURDMzQpICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9DSDRfQURDMzQpICAgICAgICBcCisgICAgICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTRfVFJHT19fQURDMzQpICAgICAgXAorICAgICAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xX1RSR08yKSAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9UUkdPKSAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfVFJHTzIpICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xX0NIM19BREMzNCkgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19UUkdPKSAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfVFJHT19fQURDMzQpICAgICAgXAorICAgICAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU03X1RSR09fQURDMzQpICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMTVfVFJHTykgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTIwX1RSR19BREMzNCkgICAgICAgXAorICAgICAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9UUkcyX0FEQzM0KSAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfQ0gyKSAgICAgICAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisjZWxpZiBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorI2RlZmluZSBJU19MTF9BRENfSU5KX1RSSUdfU09VUkNFKF9fQURDX0lOU1RBTkNFX18sIF9fSU5KX1RSSUdfU09VUkNFX18pICAgICAgIFwKKyAgKCgoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzEpIHx8ICgoX19BRENfSU5TVEFOQ0VfXykgPT0gQURDMikpICAgICAgICAgICAgICBcCisgICAgPyAoICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfU09GVFdBUkUpICAgICAgICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xX1RSR08pICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9DSDQpICAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfVFJHT19BREMxMikgICAgICAgXAorICAgICAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0yX0NIMV9BREMxMikgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDRfQURDMTIpICAgICAgICBcCisgICAgICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTRfVFJHT19BREMxMikgICAgICAgXAorICAgICAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9FWFRJX0xJTkUxNV9BREMxMikgICAgIFwKKyAgICAgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9DSDRfQURDMTIpICAgICAgICBcCisgICAgICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfVFJHTzIpICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU04X1RSR08pICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9UUkdPMikgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0gzX0FEQzEyKSAgICAgICAgXAorICAgICAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0zX1RSR08pICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDFfQURDMTIpICAgICAgICBcCisgICAgICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTZfVFJHT19BREMxMikgICAgICAgXAorICAgICAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xNV9UUkdPKSAgICAgICAgICAgIFwKKyAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKCAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX1NPRlRXQVJFKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPKSAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfQ0g0KSAgICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU00X0NIM19BREMzNCkgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9DSDJfQURDMzQpICAgICAgICBcCisgICAgICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfQ0g0X19BREMzNCkgICAgICAgXAorICAgICAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU00X0NINF9BREMzNCkgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9UUkdPX19BREMzNCkgICAgICBcCisgICAgICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfVFJHTzIpICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU04X1RSR08pICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9UUkdPMikgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfQ0gzX0FEQzM0KSAgICAgICAgXAorICAgICAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0zX1RSR08pICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9UUkdPX19BREMzNCkgICAgICBcCisgICAgICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTdfVFJHT19BREMzNCkgICAgICAgXAorICAgICAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xNV9UUkdPKSAgICAgICAgICAgIFwKKyAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKworI2VsaWYgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkKKyNkZWZpbmUgSVNfTExfQURDX0lOSl9UUklHX1NPVVJDRShfX0lOSl9UUklHX1NPVVJDRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19TT0ZUV0FSRSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfVFJHTykgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xX0NINCkgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9UUkdPKSAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfQ0gxKSAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NINCkgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9UUkdPKSAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX0VYVElfTElORTE1KSAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NINCkgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPMikgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfVFJHTykgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU04X1RSR08yKSAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDMpICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfVFJHTykgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NIMSkgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNNl9UUkdPKSAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTE1X1RSR08pICAgICAgICAgICAgICAgIFwKKyAgKQorI2VsaWYgZGVmaW5lZChTVE0zMkYzMzR4OCkKKyNkZWZpbmUgSVNfTExfQURDX0lOSl9UUklHX1NPVVJDRShfX0lOSl9UUklHX1NPVVJDRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19TT0ZUV0FSRSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfVFJHTykgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xX0NINCkgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9UUkdPKSAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfQ0gxKSAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NINCkgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfRVhUSV9MSU5FMTUpICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfVFJHTzIpICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkcyKSAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHNCkgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0gzKSAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0zX1RSR08pICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDEpICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTZfVFJHTykgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xNV9UUkdPKSAgICAgICAgICAgICAgICBcCisgICkKKyNlbGlmIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAyeEUpCisjZGVmaW5lIElTX0xMX0FEQ19JTkpfVFJJR19TT1VSQ0UoX19JTkpfVFJJR19TT1VSQ0VfXykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xX1RSR08pICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9DSDQpICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfVFJHTykgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0yX0NIMSkgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDQpICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTRfVFJHTykgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9FWFRJX0xJTkUxNSkgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPMikgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0gzKSAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0zX1RSR08pICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDEpICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTZfVFJHTykgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xNV9UUkdPKSAgICAgICAgICAgICAgICBcCisgICkKKyNlbGlmIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisjZGVmaW5lIElTX0xMX0FEQ19JTkpfVFJJR19TT1VSQ0UoX19JTkpfVFJJR19TT1VSQ0VfXykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xX1RSR08pICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9DSDQpICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX0VYVElfTElORTE1KSAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xX1RSR08yKSAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNNl9UUkdPKSAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTE1X1RSR08pICAgICAgICAgICAgICAgIFwKKyAgKQorI2VuZGlmCisKKyNkZWZpbmUgSVNfTExfQURDX0lOSl9UUklHX0VYVF9FREdFKF9fSU5KX1RSSUdfRVhUX0VER0VfXykgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fSU5KX1RSSUdfRVhUX0VER0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9SSVNJTkcpICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOSl9UUklHX0VYVF9FREdFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfRkFMTElORykgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTkpfVFJJR19FWFRfRURHRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1JJU0lOR0ZBTExJTkcpICAgICAgICAgICBcCisgICkKKworI2RlZmluZSBJU19MTF9BRENfSU5KX1RSSUdfQVVUTyhfX0lOSl9UUklHX0FVVE9fXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCAgICgoX19JTkpfVFJJR19BVVRPX18pID09IExMX0FEQ19JTkpfVFJJR19JTkRFUEVOREVOVCkgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5KX1RSSUdfQVVUT19fKSA9PSBMTF9BRENfSU5KX1RSSUdfRlJPTV9HUlBfUkVHVUxBUikgICAgICAgICAgICAgICAgXAorICApCisKKyNkZWZpbmUgSVNfTExfQURDX0lOSl9TRVFfU0NBTl9MRU5HVEgoX19JTkpfU0VRX1NDQU5fTEVOR1RIX18pICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fSU5KX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfSU5KX1NFUV9TQ0FOX0RJU0FCTEUpICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOSl9TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX0lOSl9TRVFfU0NBTl9FTkFCTEVfMlJBTktTKSAgICAgICAgIFwKKyAgIHx8ICgoX19JTkpfU0VRX1NDQU5fTEVOR1RIX18pID09IExMX0FEQ19JTkpfU0VRX1NDQU5fRU5BQkxFXzNSQU5LUykgICAgICAgICBcCisgICB8fCAoKF9fSU5KX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfSU5KX1NFUV9TQ0FOX0VOQUJMRV80UkFOS1MpICAgICAgICAgXAorICApCisKKyNkZWZpbmUgSVNfTExfQURDX0lOSl9TRVFfU0NBTl9ESVNDT05UX01PREUoX19JTkpfU0VRX0RJU0NPTlRfTU9ERV9fKSAgICAgICAgICBcCisgICggICAoKF9fSU5KX1NFUV9ESVNDT05UX01PREVfXykgPT0gTExfQURDX0lOSl9TRVFfRElTQ09OVF9ESVNBQkxFKSAgICAgICAgICAgXAorICAgfHwgKChfX0lOSl9TRVFfRElTQ09OVF9NT0RFX18pID09IExMX0FEQ19JTkpfU0VRX0RJU0NPTlRfMVJBTkspICAgICAgICAgICAgIFwKKyAgKQorCisjaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpCisvKiBDaGVjayBvZiBwYXJhbWV0ZXJzIGZvciBjb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6ICAgICAgICAgICAqLworLyogbXVsdGltb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVNfTExfQURDX01VTFRJX01PREUoX19NVUxUSV9NT0RFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fTVVMVElfTU9ERV9fKSA9PSBMTF9BRENfTVVMVElfSU5ERVBFTkRFTlQpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX01VTFRJX01PREVfXykgPT0gTExfQURDX01VTFRJX0RVQUxfUkVHX1NJTVVMVCkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19NVUxUSV9NT0RFX18pID09IExMX0FEQ19NVUxUSV9EVUFMX1JFR19JTlRFUkwpICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fTVVMVElfTU9ERV9fKSA9PSBMTF9BRENfTVVMVElfRFVBTF9JTkpfU0lNVUxUKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX01VTFRJX01PREVfXykgPT0gTExfQURDX01VTFRJX0RVQUxfSU5KX0FMVEVSTikgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19NVUxUSV9NT0RFX18pID09IExMX0FEQ19NVUxUSV9EVUFMX1JFR19TSU1fSU5KX1NJTSkgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fTVVMVElfTU9ERV9fKSA9PSBMTF9BRENfTVVMVElfRFVBTF9SRUdfU0lNX0lOSl9BTFQpICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX01VTFRJX01PREVfXykgPT0gTExfQURDX01VTFRJX0RVQUxfUkVHX0lOVF9JTkpfU0lNKSAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisjZGVmaW5lIElTX0xMX0FEQ19NVUxUSV9ETUFfVFJBTlNGRVIoX19NVUxUSV9ETUFfVFJBTlNGRVJfXykgICAgICAgICAgICAgICAgICAgXAorICAoICAgKChfX01VTFRJX0RNQV9UUkFOU0ZFUl9fKSA9PSBMTF9BRENfTVVMVElfUkVHX0RNQV9FQUNIX0FEQykgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19NVUxUSV9ETUFfVFJBTlNGRVJfXykgPT0gTExfQURDX01VTFRJX1JFR19ETUFfTElNSVRfUkVTMTJfMTBCKSAgICAgICBcCisgICB8fCAoKF9fTVVMVElfRE1BX1RSQU5TRkVSX18pID09IExMX0FEQ19NVUxUSV9SRUdfRE1BX0xJTUlUX1JFUzhfNkIpICAgICAgICAgXAorICAgfHwgKChfX01VTFRJX0RNQV9UUkFOU0ZFUl9fKSA9PSBMTF9BRENfTVVMVElfUkVHX0RNQV9VTkxNVF9SRVMxMl8xMEIpICAgICAgIFwKKyAgIHx8ICgoX19NVUxUSV9ETUFfVFJBTlNGRVJfXykgPT0gTExfQURDX01VTFRJX1JFR19ETUFfVU5MTVRfUkVTOF82QikgICAgICAgICBcCisgICkKKworI2RlZmluZSBJU19MTF9BRENfTVVMVElfVFdPU01QX0RFTEFZKF9fTVVMVElfVFdPU01QX0RFTEFZX18pICAgICAgICAgICAgICAgICAgIFwKKyAgKCAgICgoX19NVUxUSV9UV09TTVBfREVMQVlfXykgPT0gTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV8xQ1lDTEUpICAgICAgICAgICBcCisgICB8fCAoKF9fTVVMVElfVFdPU01QX0RFTEFZX18pID09IExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfMkNZQ0xFUykgICAgICAgICAgXAorICAgfHwgKChfX01VTFRJX1RXT1NNUF9ERUxBWV9fKSA9PSBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzNDWUNMRVMpICAgICAgICAgIFwKKyAgIHx8ICgoX19NVUxUSV9UV09TTVBfREVMQVlfXykgPT0gTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV80Q1lDTEVTKSAgICAgICAgICBcCisgICB8fCAoKF9fTVVMVElfVFdPU01QX0RFTEFZX18pID09IExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfNUNZQ0xFUykgICAgICAgICAgXAorICAgfHwgKChfX01VTFRJX1RXT1NNUF9ERUxBWV9fKSA9PSBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzZDWUNMRVMpICAgICAgICAgIFwKKyAgIHx8ICgoX19NVUxUSV9UV09TTVBfREVMQVlfXykgPT0gTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV83Q1lDTEVTKSAgICAgICAgICBcCisgICB8fCAoKF9fTVVMVElfVFdPU01QX0RFTEFZX18pID09IExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfOENZQ0xFUykgICAgICAgICAgXAorICAgfHwgKChfX01VTFRJX1RXT1NNUF9ERUxBWV9fKSA9PSBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzlDWUNMRVMpICAgICAgICAgIFwKKyAgIHx8ICgoX19NVUxUSV9UV09TTVBfREVMQVlfXykgPT0gTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV8xMENZQ0xFUykgICAgICAgICBcCisgICB8fCAoKF9fTVVMVElfVFdPU01QX0RFTEFZX18pID09IExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfMTFDWUNMRVMpICAgICAgICAgXAorICAgfHwgKChfX01VTFRJX1RXT1NNUF9ERUxBWV9fKSA9PSBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzEyQ1lDTEVTKSAgICAgICAgIFwKKyAgKQorCisjZGVmaW5lIElTX0xMX0FEQ19NVUxUSV9NQVNURVJfU0xBVkUoX19NVUxUSV9NQVNURVJfU0xBVkVfXykgICAgICAgICAgICAgICAgICAgXAorICAoICAgKChfX01VTFRJX01BU1RFUl9TTEFWRV9fKSA9PSBMTF9BRENfTVVMVElfTUFTVEVSKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19NVUxUSV9NQVNURVJfU0xBVkVfXykgPT0gTExfQURDX01VTFRJX1NMQVZFKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fTVVMVElfTUFTVEVSX1NMQVZFX18pID09IExMX0FEQ19NVUxUSV9NQVNURVJfU0xBVkUpICAgICAgICAgICAgICAgICAgXAorICApCisKKyNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8KKy8qKgorICAqIEB9CisgICovCisKKworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBBRENfTExfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEFEQ19MTF9FRl9Jbml0CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBEZS1pbml0aWFsaXplIHJlZ2lzdGVycyBvZiBhbGwgQURDIGluc3RhbmNlcyBiZWxvbmdpbmcgdG8KKyAgKiAgICAgICAgIHRoZSBzYW1lIEFEQyBjb21tb24gaW5zdGFuY2UgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIHBlcmZvcm1pbmcgYSBoYXJkIHJlc2V0LCB1c2luZyBoaWdoIGxldmVsCisgICogICAgICAgICBjbG9jayBzb3VyY2UgUkNDIEFEQyByZXNldC4KKyAgKiAgICAgICAgIENhdXRpb246IE9uIHRoaXMgU1RNMzIgc2VyaWUsIGlmIHNldmVyYWwgQURDIGluc3RhbmNlcyBhcmUgYXZhaWxhYmxlCisgICogICAgICAgICBvbiB0aGUgc2VsZWN0ZWQgZGV2aWNlLCBSQ0MgQURDIHJlc2V0IHdpbGwgcmVzZXQKKyAgKiAgICAgICAgIGFsbCBBREMgaW5zdGFuY2VzIGJlbG9uZ2luZyB0byB0aGUgY29tbW9uIEFEQyBpbnN0YW5jZS4KKyAgKiAgICAgICAgIFRvIGRlLWluaXRpYWxpemUgb25seSAxIEFEQyBpbnN0YW5jZSwgdXNlCisgICogICAgICAgICBmdW5jdGlvbiBAcmVmIExMX0FEQ19EZUluaXQoKS4KKyAgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBBREMgY29tbW9uIHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBub3QgYXBwbGljYWJsZQorICAqLworRXJyb3JTdGF0dXMgTExfQURDX0NvbW1vbkRlSW5pdChBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTikKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19DT01NT05fSU5TVEFOQ0UoQURDeHlfQ09NTU9OKSk7CisgIAorICAvKiBGb3JjZSByZXNldCBvZiBBREMgY2xvY2sgKGNvcmUgY2xvY2spICovCisgICNpZiBkZWZpbmVkKEFEQzEpICYmIGRlZmluZWQoQURDMikgJiYgZGVmaW5lZChBREMzKSAmJiBkZWZpbmVkKEFEQzQpCisgIGlmKEFEQ3h5X0NPTU1PTiA9PSBBREMxMl9DT01NT04pCisgIHsKKyAgICBMTF9BSEIxX0dSUDFfRm9yY2VSZXNldCAgKExMX0FIQjFfR1JQMV9QRVJJUEhfQURDMTIpOworICB9CisgIGVsc2UKKyAgeworICAgIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0ICAoTExfQUhCMV9HUlAxX1BFUklQSF9BREMzNCk7CisgIH0KKyAgI2VsaWYgZGVmaW5lZChBREMxKSAmJiBkZWZpbmVkKEFEQzIpCisgIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0ICAoTExfQUhCMV9HUlAxX1BFUklQSF9BREMxMik7CisgICNlbGlmIGRlZmluZWQoQURDMSkKKyAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXQgIChMTF9BSEIxX0dSUDFfUEVSSVBIX0FEQzEpOworICAjZW5kaWYKKyAgCisgIC8qIFJlbGVhc2UgcmVzZXQgb2YgQURDIGNsb2NrIChjb3JlIGNsb2NrKSAqLworICAjaWYgZGVmaW5lZChBREMxKSAmJiBkZWZpbmVkKEFEQzIpICYmIGRlZmluZWQoQURDMykgJiYgZGVmaW5lZChBREM0KQorICBpZihBREN4eV9DT01NT04gPT0gQURDMTJfQ09NTU9OKQorICB7CisgICAgTExfQUhCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BSEIxX0dSUDFfUEVSSVBIX0FEQzEyKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBMTF9BSEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FIQjFfR1JQMV9QRVJJUEhfQURDMzQpOworICB9CisgICNlbGlmIGRlZmluZWQoQURDMSkgJiYgZGVmaW5lZChBREMyKQorICBMTF9BSEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FIQjFfR1JQMV9QRVJJUEhfQURDMTIpOworICAjZWxpZiBkZWZpbmVkKEFEQzEpCisgIExMX0FIQjFfR1JQMV9SZWxlYXNlUmVzZXQoTExfQUhCMV9HUlAxX1BFUklQSF9BREMxKTsKKyAgI2VuZGlmCisgIAorICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHNvbWUgZmVhdHVyZXMgb2YgQURDIGNvbW1vbiBwYXJhbWV0ZXJzCisgICogICAgICAgICAoYWxsIEFEQyBpbnN0YW5jZXMgYmVsb25naW5nIHRvIHRoZSBzYW1lIEFEQyBjb21tb24gaW5zdGFuY2UpCisgICogICAgICAgICBhbmQgbXVsdGltb2RlIChmb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDIGluc3RhbmNlcyBhdmFpbGFibGUpLgorICAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgQURDIGNvbW1vbiBwYXJhbWV0ZXJzIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgaW5zdGFuY2VzIHN0YXRlOgorICAqICAgICAgICAgQWxsIEFEQyBpbnN0YW5jZXMgYmVsb25naW5nIHRvIHRoZSBzYW1lIEFEQyBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIG11c3QgYmUgZGlzYWJsZWQuCisgICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAgKiBAcGFyYW0gIEFEQ19Db21tb25Jbml0U3RydWN0IFBvaW50ZXIgdG8gYSBAcmVmIExMX0FEQ19Db21tb25Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogQURDIGNvbW1vbiByZWdpc3RlcnMgYXJlIGluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogQURDIGNvbW1vbiByZWdpc3RlcnMgYXJlIG5vdCBpbml0aWFsaXplZAorICAqLworRXJyb3JTdGF0dXMgTExfQURDX0NvbW1vbkluaXQoQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04sIExMX0FEQ19Db21tb25Jbml0VHlwZURlZiAqQURDX0NvbW1vbkluaXRTdHJ1Y3QpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0NPTU1PTl9JTlNUQU5DRShBREN4eV9DT01NT04pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19DT01NT05fQ0xPQ0soQURDX0NvbW1vbkluaXRTdHJ1Y3QtPkNvbW1vbkNsb2NrKSk7CisgIAorI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQorICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX01VTFRJX01PREUoQURDX0NvbW1vbkluaXRTdHJ1Y3QtPk11bHRpbW9kZSkpOworICBpZihBRENfQ29tbW9uSW5pdFN0cnVjdC0+TXVsdGltb2RlICE9IExMX0FEQ19NVUxUSV9JTkRFUEVOREVOVCkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19MTF9BRENfTVVMVElfRE1BX1RSQU5TRkVSKEFEQ19Db21tb25Jbml0U3RydWN0LT5NdWx0aURNQVRyYW5zZmVyKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19NVUxUSV9UV09TTVBfREVMQVkoQURDX0NvbW1vbkluaXRTdHJ1Y3QtPk11bHRpVHdvU2FtcGxpbmdEZWxheSkpOworICB9CisjZW5kaWYgLyogQURDX01VTFRJTU9ERV9TVVBQT1JUICovCisKKyAgLyogTm90ZTogSGFyZHdhcmUgY29uc3RyYWludCAocmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgZnVuY3Rpb25zICAgICAgICAgICAgICovCisgIC8qICAgICAgICJMTF9BRENfU2V0Q29tbW9uWFhYKCkiIGFuZCAiTExfQURDX1NldE11bHRpWFhYKCkiKTogICAgICAgICAgICAgICAqLworICAvKiAgICAgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoZXNlIGZlYXR1cmVzIGlzIGNvbmRpdGlvbmVkIHRvICAgKi8KKyAgLyogICAgICAgQURDIHN0YXRlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgIEFsbCBBREMgaW5zdGFuY2VzIG9mIHRoZSBBREMgY29tbW9uIGdyb3VwIG11c3QgYmUgZGlzYWJsZWQuICAgICAgICAqLworICBpZihfX0xMX0FEQ19JU19FTkFCTEVEX0FMTF9DT01NT05fSU5TVEFOQ0UoQURDeHlfQ09NTU9OKSA9PSAwVSkKKyAgeworICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgQURDIGhpZXJhcmNoaWNhbCBzY29wZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBjb21tb24gdG8gc2V2ZXJhbCBBREMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgKGFsbCBBREMgaW5zdGFuY2VzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBBREMgY29tbW9uIGluc3RhbmNlKSAgICAgICAqLworICAgIC8qICAgIC0gU2V0IEFEQyBjbG9jayAoY29udmVyc2lvbiBjbG9jaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBtdWx0aW1vZGUgKGlmIHNldmVyYWwgQURDIGluc3RhbmNlcyBhdmFpbGFibGUgb24gdGhlICAgICAgICAgICAgICAgICovCisgICAgLyogICAgc2VsZWN0ZWQgZGV2aWNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIC0gU2V0IEFEQyBtdWx0aW1vZGUgY29uZmlndXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAtIFNldCBBREMgbXVsdGltb2RlIERNQSB0cmFuc2ZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgLSBTZXQgQURDIG11bHRpbW9kZTogZGVsYXkgYmV0d2VlbiAyIHNhbXBsaW5nIHBoYXNlcyAgICAgICAgICAgICAgICAqLworI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQorICAgIGlmKEFEQ19Db21tb25Jbml0U3RydWN0LT5NdWx0aW1vZGUgIT0gTExfQURDX01VTFRJX0lOREVQRU5ERU5UKQorICAgIHsKKyAgICAgIE1PRElGWV9SRUcoQURDeHlfQ09NTU9OLT5DQ1IsCisgICAgICAgICAgICAgICAgICAgQURDX0NDUl9DS01PREUKKyAgICAgICAgICAgICAgICAgfCBBRENfQ0NSX0RVQUwKKyAgICAgICAgICAgICAgICAgfCBBRENfQ0NSX01ETUEKKyAgICAgICAgICAgICAgICAgfCBBRENfQ0NSX0RFTEFZCisgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAgIEFEQ19Db21tb25Jbml0U3RydWN0LT5Db21tb25DbG9jaworICAgICAgICAgICAgICAgICB8IEFEQ19Db21tb25Jbml0U3RydWN0LT5NdWx0aW1vZGUKKyAgICAgICAgICAgICAgICAgfCBBRENfQ29tbW9uSW5pdFN0cnVjdC0+TXVsdGlETUFUcmFuc2ZlcgorICAgICAgICAgICAgICAgICB8IEFEQ19Db21tb25Jbml0U3RydWN0LT5NdWx0aVR3b1NhbXBsaW5nRGVsYXkKKyAgICAgICAgICAgICAgICApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgTU9ESUZZX1JFRyhBREN4eV9DT01NT04tPkNDUiwKKyAgICAgICAgICAgICAgICAgICBBRENfQ0NSX0NLTU9ERQorICAgICAgICAgICAgICAgICB8IEFEQ19DQ1JfRFVBTAorICAgICAgICAgICAgICAgICB8IEFEQ19DQ1JfTURNQQorICAgICAgICAgICAgICAgICB8IEFEQ19DQ1JfREVMQVkKKyAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgQURDX0NvbW1vbkluaXRTdHJ1Y3QtPkNvbW1vbkNsb2NrCisgICAgICAgICAgICAgICAgIHwgTExfQURDX01VTFRJX0lOREVQRU5ERU5UCisgICAgICAgICAgICAgICAgKTsKKyAgICB9CisjZWxzZQorICAgIExMX0FEQ19TZXRDb21tb25DbG9jayhBREN4eV9DT01NT04sIEFEQ19Db21tb25Jbml0U3RydWN0LT5Db21tb25DbG9jayk7CisjZW5kaWYKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBJbml0aWFsaXphdGlvbiBlcnJvcjogT25lIG9yIHNldmVyYWwgQURDIGluc3RhbmNlcyBiZWxvbmdpbmcgdG8gICAgICAgICovCisgICAgLyogdGhlIHNhbWUgQURDIGNvbW1vbiBpbnN0YW5jZSBhcmUgbm90IGRpc2FibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHN0YXR1cyA9IEVSUk9SOworICB9CisgIAorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBlYWNoIEByZWYgTExfQURDX0NvbW1vbkluaXRUeXBlRGVmIGZpZWxkIHRvIGRlZmF1bHQgdmFsdWUuCisgICogQHBhcmFtICBBRENfQ29tbW9uSW5pdFN0cnVjdCBQb2ludGVyIHRvIGEgQHJlZiBMTF9BRENfQ29tbW9uSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aG9zZSBmaWVsZHMgd2lsbCBiZSBzZXQgdG8gZGVmYXVsdCB2YWx1ZXMuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX0FEQ19Db21tb25TdHJ1Y3RJbml0KExMX0FEQ19Db21tb25Jbml0VHlwZURlZiAqQURDX0NvbW1vbkluaXRTdHJ1Y3QpCit7CisgIC8qIFNldCBBRENfQ29tbW9uSW5pdFN0cnVjdCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8KKyAgLyogU2V0IGZpZWxkcyBvZiBBREMgY29tbW9uICovCisgIC8qIChhbGwgQURDIGluc3RhbmNlcyBiZWxvbmdpbmcgdG8gdGhlIHNhbWUgQURDIGNvbW1vbiBpbnN0YW5jZSkgKi8KKyAgQURDX0NvbW1vbkluaXRTdHJ1Y3QtPkNvbW1vbkNsb2NrID0gTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVYyOworICAKKyNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkKKyAgLyogU2V0IGZpZWxkcyBvZiBBREMgbXVsdGltb2RlICovCisgIEFEQ19Db21tb25Jbml0U3RydWN0LT5NdWx0aW1vZGUgICAgICAgICAgICAgPSBMTF9BRENfTVVMVElfSU5ERVBFTkRFTlQ7CisgIEFEQ19Db21tb25Jbml0U3RydWN0LT5NdWx0aURNQVRyYW5zZmVyICAgICAgPSBMTF9BRENfTVVMVElfUkVHX0RNQV9FQUNIX0FEQzsKKyAgQURDX0NvbW1vbkluaXRTdHJ1Y3QtPk11bHRpVHdvU2FtcGxpbmdEZWxheSA9IExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfMUNZQ0xFOworI2VuZGlmIC8qIEFEQ19NVUxUSU1PREVfU1VQUE9SVCAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgcmVnaXN0ZXJzIG9mIHRoZSBzZWxlY3RlZCBBREMgaW5zdGFuY2UKKyAgKiAgICAgICAgIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLgorICAqIEBub3RlICAgVG8gcmVzZXQgYWxsIEFEQyBpbnN0YW5jZXMgcXVpY2tseSAocGVyZm9ybSBhIGhhcmQgcmVzZXQpLAorICAqICAgICAgICAgdXNlIGZ1bmN0aW9uIEByZWYgTExfQURDX0NvbW1vbkRlSW5pdCgpLgorICAqIEBub3RlICAgSWYgdGhpcyBmdW5jdGlvbnMgcmV0dXJucyBlcnJvciBzdGF0dXMsIGl0IG1lYW5zIHRoYXQgQURDIGluc3RhbmNlCisgICogICAgICAgICBpcyBpbiBhbiB1bmtub3duIHN0YXRlLgorICAqICAgICAgICAgSW4gdGhpcyBjYXNlLCBwZXJmb3JtIGEgaGFyZCByZXNldCB1c2luZyBoaWdoIGxldmVsCisgICogICAgICAgICBjbG9jayBzb3VyY2UgUkNDIEFEQyByZXNldC4KKyAgKiAgICAgICAgIENhdXRpb246IE9uIHRoaXMgU1RNMzIgc2VyaWUsIGlmIHNldmVyYWwgQURDIGluc3RhbmNlcyBhcmUgYXZhaWxhYmxlCisgICogICAgICAgICBvbiB0aGUgc2VsZWN0ZWQgZGV2aWNlLCBSQ0MgQURDIHJlc2V0IHdpbGwgcmVzZXQKKyAgKiAgICAgICAgIGFsbCBBREMgaW5zdGFuY2VzIGJlbG9uZ2luZyB0byB0aGUgY29tbW9uIEFEQyBpbnN0YW5jZS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX0NvbW1vbkRlSW5pdCgpLgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogQURDIHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBBREMgcmVnaXN0ZXJzIGFyZSBub3QgZGUtaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0FEQ19EZUluaXQoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisgIAorICBfX0lPIHVpbnQzMl90IHRpbWVvdXRfY3B1X2N5Y2xlcyA9IDBVOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoQURDeCkpOworICAKKyAgLyogRGlzYWJsZSBBREMgaW5zdGFuY2UgaWYgbm90IGFscmVhZHkgZGlzYWJsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmKExMX0FEQ19Jc0VuYWJsZWQoQURDeCkgPT0gMVUpCisgIHsKKyAgICAvKiBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgdHJpZ2dlciBzb3VyY2UgdG8gU1cgc3RhcnQgdG8gZW5zdXJlIHRvIG5vdCAgICAgICovCisgICAgLyogaGF2ZSBhbiBleHRlcm5hbCB0cmlnZ2VyIGV2ZW50IG9jY3VycmluZyBkdXJpbmcgdGhlIGNvbnZlcnNpb24gc3RvcCAgICAqLworICAgIC8qIEFEQyBkaXNhYmxlIHByb2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMTF9BRENfUkVHX1NldFRyaWdnZXJTb3VyY2UoQURDeCwgTExfQURDX1JFR19UUklHX1NPRlRXQVJFKTsKKyAgICAKKyAgICAvKiBTdG9wIHBvdGVudGlhbCBBREMgY29udmVyc2lvbiBvbiBnb2luZyBvbiBBREMgZ3JvdXAgcmVndWxhci4gICAgICAgICAgICovCisgICAgaWYoTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKEFEQ3gpICE9IDBVKQorICAgIHsKKyAgICAgIGlmKExMX0FEQ19SRUdfSXNTdG9wQ29udmVyc2lvbk9uZ29pbmcoQURDeCkgPT0gMFUpCisgICAgICB7CisgICAgICAgIExMX0FEQ19SRUdfU3RvcENvbnZlcnNpb24oQURDeCk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIFNldCBBREMgZ3JvdXAgaW5qZWN0ZWQgdHJpZ2dlciBzb3VyY2UgdG8gU1cgc3RhcnQgdG8gZW5zdXJlIHRvIG5vdCAgICAgKi8KKyAgICAvKiBoYXZlIGFuIGV4dGVybmFsIHRyaWdnZXIgZXZlbnQgb2NjdXJyaW5nIGR1cmluZyB0aGUgY29udmVyc2lvbiBzdG9wICAgICovCisgICAgLyogQURDIGRpc2FibGUgcHJvY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExMX0FEQ19JTkpfU2V0VHJpZ2dlclNvdXJjZShBREN4LCBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUpOworICAgIAorICAgIC8qIFN0b3AgcG90ZW50aWFsIEFEQyBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIEFEQyBncm91cCBpbmplY3RlZC4gICAgICAgICAgKi8KKyAgICBpZihMTF9BRENfSU5KX0lzQ29udmVyc2lvbk9uZ29pbmcoQURDeCkgIT0gMFUpCisgICAgeworICAgICAgaWYoTExfQURDX0lOSl9Jc1N0b3BDb252ZXJzaW9uT25nb2luZyhBREN4KSA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgTExfQURDX0lOSl9TdG9wQ29udmVyc2lvbihBREN4KTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogV2FpdCBmb3IgQURDIGNvbnZlcnNpb25zIGFyZSBlZmZlY3RpdmVseSBzdG9wcGVkICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHRpbWVvdXRfY3B1X2N5Y2xlcyA9IEFEQ19USU1FT1VUX1NUT1BfQ09OVkVSU0lPTl9DUFVfQ1lDTEVTOworICAgIHdoaWxlICgoICBMTF9BRENfUkVHX0lzU3RvcENvbnZlcnNpb25PbmdvaW5nKEFEQ3gpIAorICAgICAgICAgICAgfCBMTF9BRENfSU5KX0lzU3RvcENvbnZlcnNpb25PbmdvaW5nKEFEQ3gpKSA9PSAxVSkKKyAgICB7CisgICAgICBpZih0aW1lb3V0X2NwdV9jeWNsZXMtLSA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogVGltZS1vdXQgZXJyb3IgKi8KKyAgICAgICAgc3RhdHVzID0gRVJST1I7CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIEZsdXNoIGdyb3VwIGluamVjdGVkIGNvbnRleHRzIHF1ZXVlIChyZWdpc3RlciBKU1FSKTogICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBOb3RlOiBCaXQgSlFNIG11c3QgYmUgc2V0IHRvIGVtcHR5IHRoZSBjb250ZXh0cyBxdWV1ZSAob3RoZXJ3aXNlICAgICAgICovCisgICAgLyogICAgICAgY29udGV4dHMgcXVldWUgaXMgbWFpbnRhaW5lZCB3aXRoIHRoZSBsYXN0IGFjdGl2ZSBjb250ZXh0KS4gICAgICAqLworICAgIExMX0FEQ19JTkpfU2V0UXVldWVNb2RlKEFEQ3gsIExMX0FEQ19JTkpfUVVFVUVfMkNPTlRFWFRTX0VORF9FTVBUWSk7CisgICAgCisgICAgLyogRGlzYWJsZSB0aGUgQURDIGluc3RhbmNlICovCisgICAgTExfQURDX0Rpc2FibGUoQURDeCk7CisgICAgCisgICAgLyogV2FpdCBmb3IgQURDIGluc3RhbmNlIGlzIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovCisgICAgdGltZW91dF9jcHVfY3ljbGVzID0gQURDX1RJTUVPVVRfRElTQUJMRV9DUFVfQ1lDTEVTOworICAgIHdoaWxlIChMTF9BRENfSXNEaXNhYmxlT25nb2luZyhBREN4KSA9PSAxVSkKKyAgICB7CisgICAgICBpZih0aW1lb3V0X2NwdV9jeWNsZXMtLSA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogVGltZS1vdXQgZXJyb3IgKi8KKyAgICAgICAgc3RhdHVzID0gRVJST1I7CisgICAgICB9CisgICAgfQorICB9CisgIAorICAvKiBDaGVjayB3aGV0aGVyIEFEQyBzdGF0ZSBpcyBjb21wbGlhbnQgd2l0aCBleHBlY3RlZCBzdGF0ZSAqLworICBpZihSRUFEX0JJVChBREN4LT5DUiwKKyAgICAgICAgICAgICAgKCAgQURDX0NSX0pBRFNUUCB8IEFEQ19DUl9BRFNUUCB8IEFEQ19DUl9KQURTVEFSVCB8IEFEQ19DUl9BRFNUQVJUCisgICAgICAgICAgICAgICB8IEFEQ19DUl9BRERJUyB8IEFEQ19DUl9BREVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICApCisgICAgID09IDBVKQorICB7CisgICAgLyogPT09PT09PT09PSBSZXNldCBBREMgcmVnaXN0ZXJzID09PT09PT09PT0gKi8KKyAgICAvKiBSZXNldCByZWdpc3RlciBJRVIgKi8KKyAgICBDTEVBUl9CSVQoQURDeC0+SUVSLAorICAgICAgICAgICAgICAoICBMTF9BRENfSVRfQURSRFkKKyAgICAgICAgICAgICAgIHwgTExfQURDX0lUX0VPQworICAgICAgICAgICAgICAgfCBMTF9BRENfSVRfRU9TCisgICAgICAgICAgICAgICB8IExMX0FEQ19JVF9PVlIKKyAgICAgICAgICAgICAgIHwgTExfQURDX0lUX0VPU01QCisgICAgICAgICAgICAgICB8IExMX0FEQ19JVF9KRU9DCisgICAgICAgICAgICAgICB8IExMX0FEQ19JVF9KRU9TCisgICAgICAgICAgICAgICB8IExMX0FEQ19JVF9KUU9WRgorICAgICAgICAgICAgICAgfCBMTF9BRENfSVRfQVdEMQorICAgICAgICAgICAgICAgfCBMTF9BRENfSVRfQVdEMgorICAgICAgICAgICAgICAgfCBMTF9BRENfSVRfQVdEMyApCisgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBJU1IgKi8KKyAgICBTRVRfQklUKEFEQ3gtPklTUiwKKyAgICAgICAgICAgICggIExMX0FEQ19GTEFHX0FEUkRZCisgICAgICAgICAgICAgfCBMTF9BRENfRkxBR19FT0MKKyAgICAgICAgICAgICB8IExMX0FEQ19GTEFHX0VPUworICAgICAgICAgICAgIHwgTExfQURDX0ZMQUdfT1ZSCisgICAgICAgICAgICAgfCBMTF9BRENfRkxBR19FT1NNUAorICAgICAgICAgICAgIHwgTExfQURDX0ZMQUdfSkVPQworICAgICAgICAgICAgIHwgTExfQURDX0ZMQUdfSkVPUworICAgICAgICAgICAgIHwgTExfQURDX0ZMQUdfSlFPVkYKKyAgICAgICAgICAgICB8IExMX0FEQ19GTEFHX0FXRDEKKyAgICAgICAgICAgICB8IExMX0FEQ19GTEFHX0FXRDIKKyAgICAgICAgICAgICB8IExMX0FEQ19GTEFHX0FXRDMgKQorICAgICAgICAgICApOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIENSICovCisgICAgLyogIC0gQml0cyBBRENfQ1JfSkFEU1RQLCBBRENfQ1JfQURTVFAsIEFEQ19DUl9KQURTVEFSVCwgQURDX0NSX0FEU1RBUlQsICAqLworICAgIC8qICAgIEFEQ19DUl9BRENBTCwgQURDX0NSX0FERElTLCBBRENfQ1JfQURFTiBhcmUgaW4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICBhY2Nlc3MgbW9kZSAicmVhZC1zZXQiOiBubyBkaXJlY3QgcmVzZXQgYXBwbGljYWJsZS4gICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gUmVzZXQgQ2FsaWJyYXRpb24gbW9kZSB0byBkZWZhdWx0IHNldHRpbmcgKHNpbmdsZSBlbmRlZCkuICAgICAgICAgICAqLworICAgIC8qICAtIERpc2FibGUgQURDIGludGVybmFsIHZvbHRhZ2UgcmVndWxhdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICBOb3RlOiBBREMgaW50ZXJuYWwgdm9sdGFnZSByZWd1bGF0b3IgZGlzYWJsZSBpcyBjb25kaXRpb25lZCB0byAgICAgICovCisgICAgLyogICAgICAgICAgQURDIHN0YXRlIGRpc2FibGVkOiBhbHJlYWR5IGRvbmUgYWJvdmUuICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIFNlcXVlbmNlIHRvIGRpc2FibGUgdm9sdGFnZSByZWd1bGF0b3I6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAxLiBTZXQgdGhlIGludGVybWVkaWF0ZSBzdGF0ZSBiZWZvcmUgbW92aW5nIHRoZSBBREMgdm9sdGFnZSByZWd1bGF0b3IgICovCisgICAgLyogICAgdG8gZGlzYWJsZSBzdGF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIENMRUFSX0JJVChBREN4LT5DUiwgQURDX0NSX0FEVlJFR0VOXzEgfCBBRENfQ1JfQURWUkVHRU5fMCB8IEFEQ19DUl9BRENBTERJRik7CisgICAgLyogMi4gU2V0IEFEVlJFR0VOIGJpdHMgdG8gMHgxMCAqLworICAgIFNFVF9CSVQoQURDeC0+Q1IsIEFEQ19DUl9BRFZSRUdFTl8xKTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBDRkdSICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPkNGR1IsCisgICAgICAgICAgICAgICggIEFEQ19DRkdSX0FXRDFDSCAgfCBBRENfQ0ZHUl9KQVVUTyAgIHwgQURDX0NGR1JfSkFXRDFFTgorICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9BV0QxRU4gIHwgQURDX0NGR1JfQVdEMVNHTCB8IEFEQ19DRkdSX0pRTQorICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9KRElTQ0VOIHwgQURDX0NGR1JfRElTQ05VTSB8IEFEQ19DRkdSX0RJU0NFTgorICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9BVVRETFkgIHwgQURDX0NGR1JfQ09OVCAgICB8IEFEQ19DRkdSX09WUk1PRAorICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9FWFRFTiAgIHwgQURDX0NGR1JfRVhUU0VMICB8IEFEQ19DRkdSX0FMSUdOCisgICAgICAgICAgICAgICB8IEFEQ19DRkdSX1JFUyAgICAgfCBBRENfQ0ZHUl9ETUFDRkcgIHwgQURDX0NGR1JfRE1BRU4gICkKKyAgICAgICAgICAgICApOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFNNUFIxICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPlNNUFIxLAorICAgICAgICAgICAgICAoICBBRENfU01QUjFfU01QOSB8IEFEQ19TTVBSMV9TTVA4IHwgQURDX1NNUFIxX1NNUDcKKyAgICAgICAgICAgICAgIHwgQURDX1NNUFIxX1NNUDYgfCBBRENfU01QUjFfU01QNSB8IEFEQ19TTVBSMV9TTVA0CisgICAgICAgICAgICAgICB8IEFEQ19TTVBSMV9TTVAzIHwgQURDX1NNUFIxX1NNUDIgfCBBRENfU01QUjFfU01QMSkKKyAgICAgICAgICAgICApOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFNNUFIyICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPlNNUFIyLAorICAgICAgICAgICAgICAoICBBRENfU01QUjJfU01QMTggfCBBRENfU01QUjJfU01QMTcgfCBBRENfU01QUjJfU01QMTYKKyAgICAgICAgICAgICAgIHwgQURDX1NNUFIyX1NNUDE1IHwgQURDX1NNUFIyX1NNUDE0IHwgQURDX1NNUFIyX1NNUDEzCisgICAgICAgICAgICAgICB8IEFEQ19TTVBSMl9TTVAxMiB8IEFEQ19TTVBSMl9TTVAxMSB8IEFEQ19TTVBSMl9TTVAxMCkKKyAgICAgICAgICAgICApOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFRSMSAqLworICAgIE1PRElGWV9SRUcoQURDeC0+VFIxLCBBRENfVFIxX0hUMSB8IEFEQ19UUjFfTFQxLCBBRENfVFIxX0hUMSk7CisgICAgCisgICAgLyogUmVzZXQgcmVnaXN0ZXIgVFIyICovCisgICAgTU9ESUZZX1JFRyhBREN4LT5UUjIsIEFEQ19UUjJfSFQyIHwgQURDX1RSMl9MVDIsIEFEQ19UUjJfSFQyKTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBUUjMgKi8KKyAgICBNT0RJRllfUkVHKEFEQ3gtPlRSMywgQURDX1RSM19IVDMgfCBBRENfVFIzX0xUMywgQURDX1RSM19IVDMpOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFNRUjEgKi8KKyAgICBDTEVBUl9CSVQoQURDeC0+U1FSMSwKKyAgICAgICAgICAgICAgKCAgQURDX1NRUjFfU1E0IHwgQURDX1NRUjFfU1EzIHwgQURDX1NRUjFfU1EyCisgICAgICAgICAgICAgICB8IEFEQ19TUVIxX1NRMSB8IEFEQ19TUVIxX0wpCisgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBTUVIyICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPlNRUjIsCisgICAgICAgICAgICAgICggIEFEQ19TUVIyX1NROSB8IEFEQ19TUVIyX1NROCB8IEFEQ19TUVIyX1NRNworICAgICAgICAgICAgICAgfCBBRENfU1FSMl9TUTYgfCBBRENfU1FSMl9TUTUpCisgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBTUVIzICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPlNRUjMsCisgICAgICAgICAgICAgICggIEFEQ19TUVIzX1NRMTQgfCBBRENfU1FSM19TUTEzIHwgQURDX1NRUjNfU1ExMgorICAgICAgICAgICAgICAgfCBBRENfU1FSM19TUTExIHwgQURDX1NRUjNfU1ExMCkKKyAgICAgICAgICAgICApOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFNRUjQgKi8KKyAgICBDTEVBUl9CSVQoQURDeC0+U1FSNCwgQURDX1NRUjRfU1ExNiB8IEFEQ19TUVI0X1NRMTUpOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIEpTUVIgKi8KKyAgICBDTEVBUl9CSVQoQURDeC0+SlNRUiwKKyAgICAgICAgICAgICAgKCAgQURDX0pTUVJfSkwKKyAgICAgICAgICAgICAgIHwgQURDX0pTUVJfSkVYVFNFTCB8IEFEQ19KU1FSX0pFWFRFTgorICAgICAgICAgICAgICAgfCBBRENfSlNRUl9KU1E0ICAgIHwgQURDX0pTUVJfSlNRMworICAgICAgICAgICAgICAgfCBBRENfSlNRUl9KU1EyICAgIHwgQURDX0pTUVJfSlNRMSAgKQorICAgICAgICAgICAgICk7CisgICAgCisgICAgLyogRmx1c2ggQURDIGdyb3VwIGluamVjdGVkIGNvbnRleHRzIHF1ZXVlICovCisgICAgU0VUX0JJVChBREN4LT5DRkdSLCBBRENfQ0ZHUl9KUU0pOworICAgIENMRUFSX0JJVChBREN4LT5DRkdSLCBBRENfQ0ZHUl9KUU0pOworICAgIC8qIFJlc2V0IHJlZ2lzdGVyIElTUiBiaXQgSlFPVkYgKHNldCBieSBwcmV2aW91cyBvcGVyYXRpb24gb24gSlNRUikgKi8KKyAgICBTRVRfQklUKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfSlFPVkYpOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIERSICovCisgICAgLyogTm90ZTogYml0cyBpbiBhY2Nlc3MgbW9kZSByZWFkIG9ubHksIG5vIGRpcmVjdCByZXNldCBhcHBsaWNhYmxlICovCisgICAgCisgICAgLyogUmVzZXQgcmVnaXN0ZXIgT0ZSMSAqLworICAgIENMRUFSX0JJVChBREN4LT5PRlIxLCBBRENfT0ZSMV9PRkZTRVQxX0VOIHwgQURDX09GUjFfT0ZGU0VUMV9DSCB8IEFEQ19PRlIxX09GRlNFVDEpOworICAgIC8qIFJlc2V0IHJlZ2lzdGVyIE9GUjIgKi8KKyAgICBDTEVBUl9CSVQoQURDeC0+T0ZSMiwgQURDX09GUjJfT0ZGU0VUMl9FTiB8IEFEQ19PRlIyX09GRlNFVDJfQ0ggfCBBRENfT0ZSMl9PRkZTRVQyKTsKKyAgICAvKiBSZXNldCByZWdpc3RlciBPRlIzICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPk9GUjMsIEFEQ19PRlIzX09GRlNFVDNfRU4gfCBBRENfT0ZSM19PRkZTRVQzX0NIIHwgQURDX09GUjNfT0ZGU0VUMyk7CisgICAgLyogUmVzZXQgcmVnaXN0ZXIgT0ZSNCAqLworICAgIENMRUFSX0JJVChBREN4LT5PRlI0LCBBRENfT0ZSNF9PRkZTRVQ0X0VOIHwgQURDX09GUjRfT0ZGU0VUNF9DSCB8IEFEQ19PRlI0X09GRlNFVDQpOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVycyBKRFIxLCBKRFIyLCBKRFIzLCBKRFI0ICovCisgICAgLyogTm90ZTogYml0cyBpbiBhY2Nlc3MgbW9kZSByZWFkIG9ubHksIG5vIGRpcmVjdCByZXNldCBhcHBsaWNhYmxlICovCisgICAgCisgICAgLyogUmVzZXQgcmVnaXN0ZXIgQVdEMkNSICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPkFXRDJDUiwgQURDX0FXRDJDUl9BV0QyQ0gpOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIEFXRDNDUiAqLworICAgIENMRUFSX0JJVChBREN4LT5BV0QzQ1IsIEFEQ19BV0QzQ1JfQVdEM0NIKTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBESUZTRUwgKi8KKyAgICBDTEVBUl9CSVQoQURDeC0+RElGU0VMLCBBRENfRElGU0VMX0RJRlNFTCk7CisgICAgCisgICAgLyogUmVzZXQgcmVnaXN0ZXIgQ0FMRkFDVCAqLworICAgIENMRUFSX0JJVChBREN4LT5DQUxGQUNULCBBRENfQ0FMRkFDVF9DQUxGQUNUX0QgfCBBRENfQ0FMRkFDVF9DQUxGQUNUX1MpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIEFEQyBpbnN0YW5jZSBpcyBpbiBhbiB1bmtub3duIHN0YXRlICovCisgICAgLyogTmVlZCB0byBwZXJmb3JtaW5nIGEgaGFyZCByZXNldCBvZiBBREMgaW5zdGFuY2UsIHVzaW5nIGhpZ2ggbGV2ZWwgICAgICAqLworICAgIC8qIGNsb2NrIHNvdXJjZSBSQ0MgQURDIHJlc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBDYXV0aW9uOiBPbiB0aGlzIFNUTTMyIHNlcmllLCBpZiBzZXZlcmFsIEFEQyBpbnN0YW5jZXMgYXJlIGF2YWlsYWJsZSAgICovCisgICAgLyogICAgICAgICAgb24gdGhlIHNlbGVjdGVkIGRldmljZSwgUkNDIEFEQyByZXNldCB3aWxsIHJlc2V0ICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgICAgIGFsbCBBREMgaW5zdGFuY2VzIGJlbG9uZ2luZyB0byB0aGUgY29tbW9uIEFEQyBpbnN0YW5jZS4gICAgICAgKi8KKyAgICAvKiBDYXV0aW9uOiBPbiB0aGlzIFNUTTMyIHNlcmllLCBpZiBzZXZlcmFsIEFEQyBpbnN0YW5jZXMgYXJlIGF2YWlsYWJsZSAgICovCisgICAgLyogICAgICAgICAgb24gdGhlIHNlbGVjdGVkIGRldmljZSwgUkNDIEFEQyByZXNldCB3aWxsIHJlc2V0ICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgICAgIGFsbCBBREMgaW5zdGFuY2VzIGJlbG9uZ2luZyB0byB0aGUgY29tbW9uIEFEQyBpbnN0YW5jZS4gICAgICAgKi8KKyAgICBzdGF0dXMgPSBFUlJPUjsKKyAgfQorICAKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHNvbWUgZmVhdHVyZXMgb2YgQURDIGluc3RhbmNlLgorICAqIEBub3RlICAgVGhlc2UgcGFyYW1ldGVycyBoYXZlIGFuIGltcGFjdCBvbiBBREMgc2NvcGU6IEFEQyBpbnN0YW5jZS4KKyAgKiAgICAgICAgIEFmZmVjdHMgYm90aCBncm91cCByZWd1bGFyIGFuZCBncm91cCBpbmplY3RlZCAoYXZhaWxhYmlsaXR5CisgICogICAgICAgICBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQgZGVwZW5kcyBvbiBTVE0zMiBmYW1pbGllcykuCisgICogICAgICAgICBSZWZlciB0byBjb3JyZXNwb25kaW5nIHVuaXRhcnkgZnVuY3Rpb25zIGludG8KKyAgKiAgICAgICAgIEByZWYgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX0luc3RhbmNlIC4KKyAgKiBAbm90ZSAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgYnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfSW5pdCgpCisgICogICAgICAgICBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgaW5zdGFuY2UgbXVzdCBiZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgY29uZGl0aW9uIGlzIGFwcGxpZWQgdG8gYWxsIEFEQyBmZWF0dXJlcywgZm9yIGVmZmljaWVuY3kKKyAgKiAgICAgICAgIGFuZCBjb21wYXRpYmlsaXR5IG92ZXIgYWxsIFNUTTMyIGZhbWlsaWVzLiBIb3dldmVyLCB0aGUgZGlmZmVyZW50CisgICogICAgICAgICBmZWF0dXJlcyBjYW4gYmUgc2V0IHVuZGVyIGRpZmZlcmVudCBBREMgc3RhdGUgY29uZGl0aW9ucworICAqICAgICAgICAgKHNldHRpbmcgcG9zc2libGUgd2l0aCBBREMgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcsCisgICogICAgICAgICBBREMgZW5hYmxlZCB3aXRoIGNvbnZlcnNpb24gb24gZ29pbmcsIC4uLikKKyAgKiAgICAgICAgIEVhY2ggZmVhdHVyZSBjYW4gYmUgdXBkYXRlZCBhZnRlcndhcmRzIHdpdGggYSB1bml0YXJ5IGZ1bmN0aW9uCisgICogICAgICAgICBhbmQgcG90ZW50aWFsbHkgd2l0aCBBREMgaW4gYSBkaWZmZXJlbnQgc3RhdGUgdGhhbiBkaXNhYmxlZCwKKyAgKiAgICAgICAgIHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIGVhY2ggZnVuY3Rpb24gZm9yIHNldHRpbmcKKyAgKiAgICAgICAgIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZS4KKyAgKiBAbm90ZSAgIEFmdGVyIHVzaW5nIHRoaXMgZnVuY3Rpb24sIHNvbWUgb3RoZXIgZmVhdHVyZXMgbXVzdCBiZSBjb25maWd1cmVkCisgICogICAgICAgICB1c2luZyBMTCB1bml0YXJ5IGZ1bmN0aW9ucy4KKyAgKiAgICAgICAgIFRoZSBtaW5pbXVtIGNvbmZpZ3VyYXRpb24gcmVtYWluaW5nIHRvIGJlIGRvbmUgaXM6CisgICogICAgICAgICAgLSBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgb3IgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyOgorICAqICAgICAgICAgICAgbWFwIGNoYW5uZWwgb24gdGhlIHNlbGVjdGVkIHNlcXVlbmNlciByYW5rLgorICAqICAgICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzKCkuCisgICogICAgICAgICAgLSBTZXQgQURDIGNoYW5uZWwgc2FtcGxpbmcgdGltZQorICAqICAgICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb24gTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWUoKTsKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBBRENfSW5pdFN0cnVjdCBQb2ludGVyIHRvIGEgQHJlZiBMTF9BRENfUkVHX0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBBREMgcmVnaXN0ZXJzIGFyZSBpbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IEFEQyByZWdpc3RlcnMgYXJlIG5vdCBpbml0aWFsaXplZAorICAqLworRXJyb3JTdGF0dXMgTExfQURDX0luaXQoQURDX1R5cGVEZWYgKkFEQ3gsIExMX0FEQ19Jbml0VHlwZURlZiAqQURDX0luaXRTdHJ1Y3QpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShBREN4KSk7CisgIAorICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX1JFU09MVVRJT04oQURDX0luaXRTdHJ1Y3QtPlJlc29sdXRpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19EQVRBX0FMSUdOKEFEQ19Jbml0U3RydWN0LT5EYXRhQWxpZ25tZW50KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9BRENfTE9XX1BPV0VSKEFEQ19Jbml0U3RydWN0LT5Mb3dQb3dlck1vZGUpKTsKKyAgCisgIC8qIE5vdGU6IEhhcmR3YXJlIGNvbnN0cmFpbnQgKHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHRoaXMgZnVuY3Rpb24pOiAgICAgICAqLworICAvKiAgICAgICBBREMgaW5zdGFuY2UgbXVzdCBiZSBkaXNhYmxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYoTExfQURDX0lzRW5hYmxlZChBREN4KSA9PSAwVSkKKyAgeworICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgQURDIGhpZXJhcmNoaWNhbCBzY29wZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBBREMgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgLSBTZXQgQURDIGRhdGEgcmVzb2x1dGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIC0gU2V0IEFEQyBjb252ZXJzaW9uIGRhdGEgYWxpZ25tZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAtIFNldCBBREMgbG93IHBvd2VyIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTU9ESUZZX1JFRyhBREN4LT5DRkdSLAorICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9SRVMKKyAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQUxJR04KKyAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVVURExZCisgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgQURDX0luaXRTdHJ1Y3QtPlJlc29sdXRpb24KKyAgICAgICAgICAgICAgIHwgQURDX0luaXRTdHJ1Y3QtPkRhdGFBbGlnbm1lbnQKKyAgICAgICAgICAgICAgIHwgQURDX0luaXRTdHJ1Y3QtPkxvd1Bvd2VyTW9kZQorICAgICAgICAgICAgICApOworICAgIAorICB9CisgIGVsc2UKKyAgeworICAgIC8qIEluaXRpYWxpemF0aW9uIGVycm9yOiBBREMgaW5zdGFuY2UgaXMgbm90IGRpc2FibGVkLiAqLworICAgIHN0YXR1cyA9IEVSUk9SOworICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGVhY2ggQHJlZiBMTF9BRENfSW5pdFR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZS4KKyAgKiBAcGFyYW0gIEFEQ19Jbml0U3RydWN0IFBvaW50ZXIgdG8gYSBAcmVmIExMX0FEQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIHdob3NlIGZpZWxkcyB3aWxsIGJlIHNldCB0byBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfQURDX1N0cnVjdEluaXQoTExfQURDX0luaXRUeXBlRGVmICpBRENfSW5pdFN0cnVjdCkKK3sKKyAgLyogU2V0IEFEQ19Jbml0U3RydWN0IGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICAvKiBTZXQgZmllbGRzIG9mIEFEQyBpbnN0YW5jZSAqLworICBBRENfSW5pdFN0cnVjdC0+UmVzb2x1dGlvbiAgICA9IExMX0FEQ19SRVNPTFVUSU9OXzEyQjsKKyAgQURDX0luaXRTdHJ1Y3QtPkRhdGFBbGlnbm1lbnQgPSBMTF9BRENfREFUQV9BTElHTl9SSUdIVDsKKyAgQURDX0luaXRTdHJ1Y3QtPkxvd1Bvd2VyTW9kZSAgPSBMTF9BRENfTFBfTU9ERV9OT05FOworICAKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHNvbWUgZmVhdHVyZXMgb2YgQURDIGdyb3VwIHJlZ3VsYXIuCisgICogQG5vdGUgICBUaGVzZSBwYXJhbWV0ZXJzIGhhdmUgYW4gaW1wYWN0IG9uIEFEQyBzY29wZTogQURDIGdyb3VwIHJlZ3VsYXIuCisgICogICAgICAgICBSZWZlciB0byBjb3JyZXNwb25kaW5nIHVuaXRhcnkgZnVuY3Rpb25zIGludG8KKyAgKiAgICAgICAgIEByZWYgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX0dyb3VwX1JlZ3VsYXIKKyAgKiAgICAgICAgIChmdW5jdGlvbnMgd2l0aCBwcmVmaXggIlJFRyIpLgorICAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBieSBmdW5jdGlvbiBAcmVmIExMX0FEQ19Jbml0KCkKKyAgKiAgICAgICAgIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBpbnN0YW5jZSBtdXN0IGJlIGRpc2FibGVkLgorICAqICAgICAgICAgVGhpcyBjb25kaXRpb24gaXMgYXBwbGllZCB0byBhbGwgQURDIGZlYXR1cmVzLCBmb3IgZWZmaWNpZW5jeQorICAqICAgICAgICAgYW5kIGNvbXBhdGliaWxpdHkgb3ZlciBhbGwgU1RNMzIgZmFtaWxpZXMuIEhvd2V2ZXIsIHRoZSBkaWZmZXJlbnQKKyAgKiAgICAgICAgIGZlYXR1cmVzIGNhbiBiZSBzZXQgdW5kZXIgZGlmZmVyZW50IEFEQyBzdGF0ZSBjb25kaXRpb25zCisgICogICAgICAgICAoc2V0dGluZyBwb3NzaWJsZSB3aXRoIEFEQyBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZywKKyAgKiAgICAgICAgIEFEQyBlbmFibGVkIHdpdGggY29udmVyc2lvbiBvbiBnb2luZywgLi4uKQorICAqICAgICAgICAgRWFjaCBmZWF0dXJlIGNhbiBiZSB1cGRhdGVkIGFmdGVyd2FyZHMgd2l0aCBhIHVuaXRhcnkgZnVuY3Rpb24KKyAgKiAgICAgICAgIGFuZCBwb3RlbnRpYWxseSB3aXRoIEFEQyBpbiBhIGRpZmZlcmVudCBzdGF0ZSB0aGFuIGRpc2FibGVkLAorICAqICAgICAgICAgcmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgZWFjaCBmdW5jdGlvbiBmb3Igc2V0dGluZworICAqICAgICAgICAgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLgorICAqIEBub3RlICAgQWZ0ZXIgdXNpbmcgdGhpcyBmdW5jdGlvbiwgb3RoZXIgZmVhdHVyZXMgbXVzdCBiZSBjb25maWd1cmVkCisgICogICAgICAgICB1c2luZyBMTCB1bml0YXJ5IGZ1bmN0aW9ucy4KKyAgKiAgICAgICAgIFRoZSBtaW5pbXVtIGNvbmZpZ3VyYXRpb24gcmVtYWluaW5nIHRvIGJlIGRvbmUgaXM6CisgICogICAgICAgICAgLSBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgb3IgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyOgorICAqICAgICAgICAgICAgbWFwIGNoYW5uZWwgb24gdGhlIHNlbGVjdGVkIHNlcXVlbmNlciByYW5rLgorICAqICAgICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzKCkuCisgICogICAgICAgICAgLSBTZXQgQURDIGNoYW5uZWwgc2FtcGxpbmcgdGltZQorICAqICAgICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb24gTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWUoKTsKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBBRENfUkVHX0luaXRTdHJ1Y3QgUG9pbnRlciB0byBhIEByZWYgTExfQURDX1JFR19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogQURDIHJlZ2lzdGVycyBhcmUgaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBBREMgcmVnaXN0ZXJzIGFyZSBub3QgaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0FEQ19SRUdfSW5pdChBRENfVHlwZURlZiAqQURDeCwgTExfQURDX1JFR19Jbml0VHlwZURlZiAqQURDX1JFR19Jbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoQURDeCkpOworI2lmIGRlZmluZWQoQURDMSkgJiYgZGVmaW5lZChBREMyKSAmJiBkZWZpbmVkKEFEQzMpICYmIGRlZmluZWQoQURDNCkKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19SRUdfVFJJR19TT1VSQ0UoQURDeCwgQURDX1JFR19Jbml0U3RydWN0LT5UcmlnZ2VyU291cmNlKSk7CisjZWxzZQorICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX1JFR19UUklHX1NPVVJDRShBRENfUkVHX0luaXRTdHJ1Y3QtPlRyaWdnZXJTb3VyY2UpKTsKKyNlbmRpZgorICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX1JFR19TRVFfU0NBTl9MRU5HVEgoQURDX1JFR19Jbml0U3RydWN0LT5TZXF1ZW5jZXJMZW5ndGgpKTsKKyAgaWYoQURDX1JFR19Jbml0U3RydWN0LT5TZXF1ZW5jZXJMZW5ndGggIT0gTExfQURDX1JFR19TRVFfU0NBTl9ESVNBQkxFKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19SRUdfU0VRX1NDQU5fRElTQ09OVF9NT0RFKEFEQ19SRUdfSW5pdFN0cnVjdC0+U2VxdWVuY2VyRGlzY29udCkpOworICB9CisgIGFzc2VydF9wYXJhbShJU19MTF9BRENfUkVHX0NPTlRJTlVPVVNfTU9ERShBRENfUkVHX0luaXRTdHJ1Y3QtPkNvbnRpbnVvdXNNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9BRENfUkVHX0RNQV9UUkFOU0ZFUihBRENfUkVHX0luaXRTdHJ1Y3QtPkRNQVRyYW5zZmVyKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9BRENfUkVHX09WUl9EQVRBX0JFSEFWSU9SKEFEQ19SRUdfSW5pdFN0cnVjdC0+T3ZlcnJ1bikpOworICAKKyAgLyogTm90ZTogSGFyZHdhcmUgY29uc3RyYWludCAocmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgdGhpcyBmdW5jdGlvbik6ICAgICAgICovCisgIC8qICAgICAgIEFEQyBpbnN0YW5jZSBtdXN0IGJlIGRpc2FibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZihMTF9BRENfSXNFbmFibGVkKEFEQ3gpID09IDBVKQorICB7CisgICAgLyogQ29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIEFEQyBncm91cCByZWd1bGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAtIFNldCBBREMgZ3JvdXAgcmVndWxhciB0cmlnZ2VyIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgLSBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIC0gU2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAtIFNldCBBREMgZ3JvdXAgcmVndWxhciBjb250aW51b3VzIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgLSBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhIHRyYW5zZmVyOiBubyB0cmFuc2ZlciBvciAgICAqLworICAgIC8qICAgICAgdHJhbnNmZXIgYnkgRE1BLCBhbmQgRE1BIHJlcXVlc3RzIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAtIFNldCBBREMgZ3JvdXAgcmVndWxhciBvdmVycnVuIGJlaGF2aW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZSwgQURDIHRyaWdnZXIgZWRnZSBpcyBzZXQgdG8gdmFsdWUgMHgwIGJ5ICAgICAqLworICAgIC8qICAgICAgIHNldHRpbmcgb2YgdHJpZ2dlciBzb3VyY2UgdG8gU1cgc3RhcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZihBRENfUkVHX0luaXRTdHJ1Y3QtPlNlcXVlbmNlckxlbmd0aCAhPSBMTF9BRENfUkVHX1NFUV9TQ0FOX0RJU0FCTEUpCisgICAgeworICAgICAgTU9ESUZZX1JFRyhBREN4LT5DRkdSLAorICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0VYVFNFTAorICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0VYVEVOCisgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfRElTQ0VOCisgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfRElTQ05VTQorICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0NPTlQKKyAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9ETUFFTgorICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0RNQUNGRworICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX09WUk1PRAorICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgICBBRENfUkVHX0luaXRTdHJ1Y3QtPlRyaWdnZXJTb3VyY2UKKyAgICAgICAgICAgICAgICAgfCBBRENfUkVHX0luaXRTdHJ1Y3QtPlNlcXVlbmNlckRpc2NvbnQKKyAgICAgICAgICAgICAgICAgfCBBRENfUkVHX0luaXRTdHJ1Y3QtPkNvbnRpbnVvdXNNb2RlCisgICAgICAgICAgICAgICAgIHwgQURDX1JFR19Jbml0U3RydWN0LT5ETUFUcmFuc2ZlcgorICAgICAgICAgICAgICAgICB8IEFEQ19SRUdfSW5pdFN0cnVjdC0+T3ZlcnJ1bgorICAgICAgICAgICAgICAgICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IsCisgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfRVhUU0VMCisgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfRVhURU4KKyAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9ESVNDRU4KKyAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9ESVNDTlVNCisgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQ09OVAorICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0RNQUVOCisgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfRE1BQ0ZHCisgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfT1ZSTU9ECisgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAgIEFEQ19SRUdfSW5pdFN0cnVjdC0+VHJpZ2dlclNvdXJjZQorICAgICAgICAgICAgICAgICB8IExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfRElTQUJMRQorICAgICAgICAgICAgICAgICB8IEFEQ19SRUdfSW5pdFN0cnVjdC0+Q29udGludW91c01vZGUKKyAgICAgICAgICAgICAgICAgfCBBRENfUkVHX0luaXRTdHJ1Y3QtPkRNQVRyYW5zZmVyCisgICAgICAgICAgICAgICAgIHwgQURDX1JFR19Jbml0U3RydWN0LT5PdmVycnVuCisgICAgICAgICAgICAgICAgKTsKKyAgICB9CisgICAgCisgICAgLyogU2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBsZW5ndGggYW5kIHNjYW4gZGlyZWN0aW9uICovCisgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJMZW5ndGgoQURDeCwgQURDX1JFR19Jbml0U3RydWN0LT5TZXF1ZW5jZXJMZW5ndGgpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIEluaXRpYWxpemF0aW9uIGVycm9yOiBBREMgaW5zdGFuY2UgaXMgbm90IGRpc2FibGVkLiAqLworICAgIHN0YXR1cyA9IEVSUk9SOworICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGVhY2ggQHJlZiBMTF9BRENfUkVHX0luaXRUeXBlRGVmIGZpZWxkIHRvIGRlZmF1bHQgdmFsdWUuCisgICogQHBhcmFtICBBRENfUkVHX0luaXRTdHJ1Y3QgUG9pbnRlciB0byBhIEByZWYgTExfQURDX1JFR19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aG9zZSBmaWVsZHMgd2lsbCBiZSBzZXQgdG8gZGVmYXVsdCB2YWx1ZXMuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX0FEQ19SRUdfU3RydWN0SW5pdChMTF9BRENfUkVHX0luaXRUeXBlRGVmICpBRENfUkVHX0luaXRTdHJ1Y3QpCit7CisgIC8qIFNldCBBRENfUkVHX0luaXRTdHJ1Y3QgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzICovCisgIC8qIFNldCBmaWVsZHMgb2YgQURDIGdyb3VwIHJlZ3VsYXIgKi8KKyAgLyogTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZSwgQURDIHRyaWdnZXIgZWRnZSBpcyBzZXQgdG8gdmFsdWUgMHgwIGJ5ICAgICAgICovCisgIC8qICAgICAgIHNldHRpbmcgb2YgdHJpZ2dlciBzb3VyY2UgdG8gU1cgc3RhcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBBRENfUkVHX0luaXRTdHJ1Y3QtPlRyaWdnZXJTb3VyY2UgICAgPSBMTF9BRENfUkVHX1RSSUdfU09GVFdBUkU7CisgIEFEQ19SRUdfSW5pdFN0cnVjdC0+U2VxdWVuY2VyTGVuZ3RoICA9IExMX0FEQ19SRUdfU0VRX1NDQU5fRElTQUJMRTsKKyAgQURDX1JFR19Jbml0U3RydWN0LT5TZXF1ZW5jZXJEaXNjb250ID0gTExfQURDX1JFR19TRVFfRElTQ09OVF9ESVNBQkxFOworICBBRENfUkVHX0luaXRTdHJ1Y3QtPkNvbnRpbnVvdXNNb2RlICAgPSBMTF9BRENfUkVHX0NPTlZfU0lOR0xFOworICBBRENfUkVHX0luaXRTdHJ1Y3QtPkRNQVRyYW5zZmVyICAgICAgPSBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9OT05FOworICBBRENfUkVHX0luaXRTdHJ1Y3QtPk92ZXJydW4gICAgICAgICAgPSBMTF9BRENfUkVHX09WUl9EQVRBX09WRVJXUklUVEVOOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgc29tZSBmZWF0dXJlcyBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQuCisgICogQG5vdGUgICBUaGVzZSBwYXJhbWV0ZXJzIGhhdmUgYW4gaW1wYWN0IG9uIEFEQyBzY29wZTogQURDIGdyb3VwIGluamVjdGVkLgorICAqICAgICAgICAgUmVmZXIgdG8gY29ycmVzcG9uZGluZyB1bml0YXJ5IGZ1bmN0aW9ucyBpbnRvCisgICogICAgICAgICBAcmVmIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0FEQ19Hcm91cF9SZWd1bGFyCisgICogICAgICAgICAoZnVuY3Rpb25zIHdpdGggcHJlZml4ICJJTkoiKS4KKyAgKiBAbm90ZSAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgYnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfSW5pdCgpCisgICogICAgICAgICBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgaW5zdGFuY2UgbXVzdCBiZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgY29uZGl0aW9uIGlzIGFwcGxpZWQgdG8gYWxsIEFEQyBmZWF0dXJlcywgZm9yIGVmZmljaWVuY3kKKyAgKiAgICAgICAgIGFuZCBjb21wYXRpYmlsaXR5IG92ZXIgYWxsIFNUTTMyIGZhbWlsaWVzLiBIb3dldmVyLCB0aGUgZGlmZmVyZW50CisgICogICAgICAgICBmZWF0dXJlcyBjYW4gYmUgc2V0IHVuZGVyIGRpZmZlcmVudCBBREMgc3RhdGUgY29uZGl0aW9ucworICAqICAgICAgICAgKHNldHRpbmcgcG9zc2libGUgd2l0aCBBREMgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcsCisgICogICAgICAgICBBREMgZW5hYmxlZCB3aXRoIGNvbnZlcnNpb24gb24gZ29pbmcsIC4uLikKKyAgKiAgICAgICAgIEVhY2ggZmVhdHVyZSBjYW4gYmUgdXBkYXRlZCBhZnRlcndhcmRzIHdpdGggYSB1bml0YXJ5IGZ1bmN0aW9uCisgICogICAgICAgICBhbmQgcG90ZW50aWFsbHkgd2l0aCBBREMgaW4gYSBkaWZmZXJlbnQgc3RhdGUgdGhhbiBkaXNhYmxlZCwKKyAgKiAgICAgICAgIHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIGVhY2ggZnVuY3Rpb24gZm9yIHNldHRpbmcKKyAgKiAgICAgICAgIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZS4KKyAgKiBAbm90ZSAgIEFmdGVyIHVzaW5nIHRoaXMgZnVuY3Rpb24sIG90aGVyIGZlYXR1cmVzIG11c3QgYmUgY29uZmlndXJlZAorICAqICAgICAgICAgdXNpbmcgTEwgdW5pdGFyeSBmdW5jdGlvbnMuCisgICogICAgICAgICBUaGUgbWluaW11bSBjb25maWd1cmF0aW9uIHJlbWFpbmluZyB0byBiZSBkb25lIGlzOgorICAqICAgICAgICAgIC0gU2V0IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXI6CisgICogICAgICAgICAgICBtYXAgY2hhbm5lbCBvbiB0aGUgc2VsZWN0ZWQgc2VxdWVuY2VyIHJhbmsuCisgICogICAgICAgICAgICBSZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19JTkpfU2V0U2VxdWVuY2VyUmFua3MoKS4KKyAgKiAgICAgICAgICAtIFNldCBBREMgY2hhbm5lbCBzYW1wbGluZyB0aW1lCisgICogICAgICAgICAgICBSZWZlciB0byBmdW5jdGlvbiBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZSgpOworICAqIEBub3RlICAgQ2F1dGlvbiB0byBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udGV4dHMgcXVldWU6IE9uIHRoaXMgU1RNMzIgc2VyaWUsIAorICAqICAgICAgICAgdXNpbmcgc3VjY2Vzc2l2ZWx5IHNldmVyYWwgdGltZXMgdGhpcyBmdW5jdGlvbiB3aWxsIGFwcGVhciBoYXMKKyAgKiAgICAgICAgIGhhdmluZyBubyBlZmZlY3QuCisgICogICAgICAgICBUaGlzIGlzIGR1ZSB0byBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udGV4dHMgcXVldWUgKHRoaXMgZmVhdHVyZQorICAqICAgICAgICAgY2Fubm90IGJlIGRpc2FibGVkIG9uIHRoaXMgU1RNMzIgc2VyaWUpLgorICAqICAgICAgICAgVG8gc2V0IHNldmVyYWwgZmVhdHVyZXMgb2YgQURDIGdyb3VwIGluamVjdGVkLCB1c2UKKyAgKiAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfQURDX0lOSl9Db25maWdRdWV1ZUNvbnRleHQoKS4KKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBBRENfSU5KX0luaXRTdHJ1Y3QgUG9pbnRlciB0byBhIEByZWYgTExfQURDX0lOSl9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogQURDIHJlZ2lzdGVycyBhcmUgaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBBREMgcmVnaXN0ZXJzIGFyZSBub3QgaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0FEQ19JTkpfSW5pdChBRENfVHlwZURlZiAqQURDeCwgTExfQURDX0lOSl9Jbml0VHlwZURlZiAqQURDX0lOSl9Jbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoQURDeCkpOworI2lmIGRlZmluZWQoQURDMSkgJiYgZGVmaW5lZChBREMyKSAmJiBkZWZpbmVkKEFEQzMpICYmIGRlZmluZWQoQURDNCkKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19JTkpfVFJJR19TT1VSQ0UoQURDeCwgQURDX0lOSl9Jbml0U3RydWN0LT5UcmlnZ2VyU291cmNlKSk7CisjZWxzZQorICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX0lOSl9UUklHX1NPVVJDRShBRENfSU5KX0luaXRTdHJ1Y3QtPlRyaWdnZXJTb3VyY2UpKTsKKyNlbmRpZgorICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX0lOSl9TRVFfU0NBTl9MRU5HVEgoQURDX0lOSl9Jbml0U3RydWN0LT5TZXF1ZW5jZXJMZW5ndGgpKTsKKyAgaWYoQURDX0lOSl9Jbml0U3RydWN0LT5TZXF1ZW5jZXJMZW5ndGggIT0gTExfQURDX0lOSl9TRVFfU0NBTl9ESVNBQkxFKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19JTkpfU0VRX1NDQU5fRElTQ09OVF9NT0RFKEFEQ19JTkpfSW5pdFN0cnVjdC0+U2VxdWVuY2VyRGlzY29udCkpOworICB9CisgIGFzc2VydF9wYXJhbShJU19MTF9BRENfSU5KX1RSSUdfQVVUTyhBRENfSU5KX0luaXRTdHJ1Y3QtPlRyaWdBdXRvKSk7CisgIAorICAvKiBOb3RlOiBIYXJkd2FyZSBjb25zdHJhaW50IChyZWZlciB0byBkZXNjcmlwdGlvbiBvZiB0aGlzIGZ1bmN0aW9uKTogICAgICAgKi8KKyAgLyogICAgICAgQURDIGluc3RhbmNlIG11c3QgYmUgZGlzYWJsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmKExMX0FEQ19Jc0VuYWJsZWQoQURDeCkgPT0gMFUpCisgIHsKKyAgICAvKiBDb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gQURDIGdyb3VwIGluamVjdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIC0gU2V0IEFEQyBncm91cCBpbmplY3RlZCB0cmlnZ2VyIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAtIFNldCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgLSBTZXQgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUgICAgICAgICAgICAgICAqLworICAgIC8qICAgIC0gU2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXI6IGluZGVwZW5kZW50IG9yICAgICAgICAgKi8KKyAgICAvKiAgICAgIGZyb20gQURDIGdyb3VwIHJlZ3VsYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZSwgQURDIHRyaWdnZXIgZWRnZSBpcyBzZXQgdG8gdmFsdWUgMHgwIGJ5ICAgICAqLworICAgIC8qICAgICAgIHNldHRpbmcgb2YgdHJpZ2dlciBzb3VyY2UgdG8gU1cgc3RhcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZihBRENfSU5KX0luaXRTdHJ1Y3QtPlNlcXVlbmNlckxlbmd0aCAhPSBMTF9BRENfUkVHX1NFUV9TQ0FOX0RJU0FCTEUpCisgICAgeworICAgICAgTU9ESUZZX1JFRyhBREN4LT5DRkdSLAorICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0pESVNDRU4KKyAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9KQVVUTworICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgICBBRENfSU5KX0luaXRTdHJ1Y3QtPlNlcXVlbmNlckRpc2NvbnQKKyAgICAgICAgICAgICAgICAgfCBBRENfSU5KX0luaXRTdHJ1Y3QtPlRyaWdBdXRvCisgICAgICAgICAgICAgICAgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUiwKKyAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9KRElTQ0VOCisgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfSkFVVE8KKyAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgTExfQURDX1JFR19TRVFfRElTQ09OVF9ESVNBQkxFCisgICAgICAgICAgICAgICAgIHwgQURDX0lOSl9Jbml0U3RydWN0LT5UcmlnQXV0bworICAgICAgICAgICAgICAgICk7CisgICAgfQorICAgIAorICAgIE1PRElGWV9SRUcoQURDeC0+SlNRUiwKKyAgICAgICAgICAgICAgICAgQURDX0pTUVJfSkVYVFNFTAorICAgICAgICAgICAgICAgfCBBRENfSlNRUl9KRVhURU4KKyAgICAgICAgICAgICAgIHwgQURDX0pTUVJfSkwKKyAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICBBRENfSU5KX0luaXRTdHJ1Y3QtPlRyaWdnZXJTb3VyY2UKKyAgICAgICAgICAgICAgIHwgQURDX0lOSl9Jbml0U3RydWN0LT5TZXF1ZW5jZXJMZW5ndGgKKyAgICAgICAgICAgICAgKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBJbml0aWFsaXphdGlvbiBlcnJvcjogQURDIGluc3RhbmNlIGlzIG5vdCBkaXNhYmxlZC4gKi8KKyAgICBzdGF0dXMgPSBFUlJPUjsKKyAgfQorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBlYWNoIEByZWYgTExfQURDX0lOSl9Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSAgQURDX0lOSl9Jbml0U3RydWN0IFBvaW50ZXIgdG8gYSBAcmVmIExMX0FEQ19JTkpfSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hvc2UgZmllbGRzIHdpbGwgYmUgc2V0IHRvIGRlZmF1bHQgdmFsdWVzLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9BRENfSU5KX1N0cnVjdEluaXQoTExfQURDX0lOSl9Jbml0VHlwZURlZiAqQURDX0lOSl9Jbml0U3RydWN0KQoreworICAvKiBTZXQgQURDX0lOSl9Jbml0U3RydWN0IGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICAvKiBTZXQgZmllbGRzIG9mIEFEQyBncm91cCBpbmplY3RlZCAqLworICBBRENfSU5KX0luaXRTdHJ1Y3QtPlRyaWdnZXJTb3VyY2UgICAgPSBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkU7CisgIEFEQ19JTkpfSW5pdFN0cnVjdC0+U2VxdWVuY2VyTGVuZ3RoICA9IExMX0FEQ19JTkpfU0VRX1NDQU5fRElTQUJMRTsKKyAgQURDX0lOSl9Jbml0U3RydWN0LT5TZXF1ZW5jZXJEaXNjb250ID0gTExfQURDX0lOSl9TRVFfRElTQ09OVF9ESVNBQkxFOworICBBRENfSU5KX0luaXRTdHJ1Y3QtPlRyaWdBdXRvICAgICAgICAgPSBMTF9BRENfSU5KX1RSSUdfSU5ERVBFTkRFTlQ7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBBREMxIHx8IEFEQzIgfHwgQURDMyB8fCBBREM0ICovCisKKworI2VuZGlmIC8qIFNUTTMyRjMwMXg4IHx8IFNUTTMyRjMwMng4IHx8IFNUTTMyRjMwMnhDIHx8IFNUTTMyRjMwMnhFIHx8IFNUTTMyRjMwM3g4IHx8IFNUTTMyRjMwM3hDIHx8IFNUTTMyRjMwM3hFIHx8IFNUTTMyRjMxOHh4IHx8IFNUTTMyRjMyOHh4IHx8IFNUTTMyRjMzNHg4IHx8IFNUTTMyRjM1OHh4IHx8IFNUTTMyRjM5OHh4ICovCisKKyNpZiBkZWZpbmVkIChBREMxX1YyXzUpCisKKyNpZiBkZWZpbmVkIChBREMxKQorCisvKiogQGFkZHRvZ3JvdXAgQURDX0xMIEFEQworICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAYWRkdG9ncm91cCBBRENfTExfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworCisvKiBDaGVjayBvZiBwYXJhbWV0ZXJzIGZvciBjb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6ICAgICAgICAgICAqLworLyogY29tbW9uIHRvIHNldmVyYWwgQURDIGluc3RhbmNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIENoZWNrIG9mIHBhcmFtZXRlcnMgZm9yIGNvbmZpZ3VyYXRpb24gb2YgQURDIGhpZXJhcmNoaWNhbCBzY29wZTogICAgICAgICAgICovCisvKiBBREMgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJU19MTF9BRENfREFUQV9BTElHTihfX0RBVEFfQUxJR05fXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCAgICgoX19EQVRBX0FMSUdOX18pID09IExMX0FEQ19EQVRBX0FMSUdOX1JJR0hUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fREFUQV9BTElHTl9fKSA9PSBMTF9BRENfREFUQV9BTElHTl9MRUZUKSApCisKKyNkZWZpbmUgSVNfTExfQURDX1NDQU5fU0VMRUNUSU9OKF9fU0NBTl9TRUxFQ1RJT05fXykgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fU0NBTl9TRUxFQ1RJT05fXykgPT0gTExfQURDX1NFUV9TQ0FOX0RJU0FCTEUpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1NDQU5fU0VMRUNUSU9OX18pID09IExMX0FEQ19TRVFfU0NBTl9FTkFCTEUpICkKKworI2RlZmluZSBJU19MTF9BRENfU0VRX1NDQU5fTU9ERShfX1NFUV9TQ0FOX01PREVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCAgICgoX19TQ0FOX01PREVfXykgPT0gTExfQURDX1NFUV9TQ0FOX0RJU0FCTEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fU0NBTl9NT0RFX18pID09IExMX0FEQ19TRVFfU0NBTl9FTkFCTEUpICkKKworLyogQ2hlY2sgb2YgcGFyYW1ldGVycyBmb3IgY29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiAgICAgICAgICAgKi8KKy8qIEFEQyBncm91cCByZWd1bGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTX0xMX0FEQ19SRUdfVFJJR19TT1VSQ0UoX19SRUdfVFJJR19TT1VSQ0VfXykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfU09GVFdBUkUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMikgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19UUkdPKSAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfQ0gyKSAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xOV9UUkdPKSAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMTlfQ0gzKSAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTE5X0NINCkgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9FWFRJX0xJTkUxMSkpCisKKyNkZWZpbmUgSVNfTExfQURDX1JFR19DT05USU5VT1VTX01PREUoX19SRUdfQ09OVElOVU9VU19NT0RFX18pICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fUkVHX0NPTlRJTlVPVVNfTU9ERV9fKSA9PSBMTF9BRENfUkVHX0NPTlZfU0lOR0xFKSAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19DT05USU5VT1VTX01PREVfXykgPT0gTExfQURDX1JFR19DT05WX0NPTlRJTlVPVVMpKQorCisjZGVmaW5lIElTX0xMX0FEQ19SRUdfRE1BX1RSQU5TRkVSKF9fUkVHX0RNQV9UUkFOU0ZFUl9fKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAoICAgKChfX1JFR19ETUFfVFJBTlNGRVJfXykgPT0gTExfQURDX1JFR19ETUFfVFJBTlNGRVJfTk9ORSkgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfRE1BX1RSQU5TRkVSX18pID09IExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX1VOTElNSVRFRCkpCisKKyNkZWZpbmUgSVNfTExfQURDX1JFR19TRVFfU0NBTl9MRU5HVEgoX19SRUdfU0VRX1NDQU5fTEVOR1RIX18pICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fUkVHX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfUkVHX1NFUV9TQ0FOX0RJU0FCTEUpICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMlJBTktTKSAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfU0VRX1NDQU5fTEVOR1RIX18pID09IExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzNSQU5LUykgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV80UkFOS1MpICAgICAgICAgXAorICAgfHwgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfNVJBTktTKSAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfU0VRX1NDQU5fTEVOR1RIX18pID09IExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzZSQU5LUykgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV83UkFOS1MpICAgICAgICAgXAorICAgfHwgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfOFJBTktTKSAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfU0VRX1NDQU5fTEVOR1RIX18pID09IExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzlSQU5LUykgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xMFJBTktTKSAgICAgICAgXAorICAgfHwgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTFSQU5LUykgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfU0VRX1NDQU5fTEVOR1RIX18pID09IExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzEyUkFOS1MpICAgICAgICBcCisgICB8fCAoKF9fUkVHX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xM1JBTktTKSAgICAgICAgXAorICAgfHwgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTRSQU5LUykgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfU0VRX1NDQU5fTEVOR1RIX18pID09IExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzE1UkFOS1MpICAgICAgICBcCisgICB8fCAoKF9fUkVHX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xNlJBTktTKSkKKworI2RlZmluZSBJU19MTF9BRENfUkVHX1NFUV9TQ0FOX0RJU0NPTlRfTU9ERShfX1JFR19TRVFfRElTQ09OVF9NT0RFX18pICAgICAgICAgIFwKKyAgKCAgICgoX19SRUdfU0VRX0RJU0NPTlRfTU9ERV9fKSA9PSBMTF9BRENfUkVHX1NFUV9ESVNDT05UX0RJU0FCTEUpICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1NFUV9ESVNDT05UX01PREVfXykgPT0gTExfQURDX1JFR19TRVFfRElTQ09OVF8xUkFOSykgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19TRVFfRElTQ09OVF9NT0RFX18pID09IExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfMlJBTktTKSAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfU0VRX0RJU0NPTlRfTU9ERV9fKSA9PSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzNSQU5LUykgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1NFUV9ESVNDT05UX01PREVfXykgPT0gTExfQURDX1JFR19TRVFfRElTQ09OVF80UkFOS1MpICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19TRVFfRElTQ09OVF9NT0RFX18pID09IExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfNVJBTktTKSAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfU0VRX0RJU0NPTlRfTU9ERV9fKSA9PSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzZSQU5LUykgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1NFUV9ESVNDT05UX01PREVfXykgPT0gTExfQURDX1JFR19TRVFfRElTQ09OVF83UkFOS1MpICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19TRVFfRElTQ09OVF9NT0RFX18pID09IExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfOFJBTktTKSApCisKKy8qIENoZWNrIG9mIHBhcmFtZXRlcnMgZm9yIGNvbmZpZ3VyYXRpb24gb2YgQURDIGhpZXJhcmNoaWNhbCBzY29wZTogICAgICAgICAgICovCisvKiBBREMgZ3JvdXAgaW5qZWN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJU19MTF9BRENfSU5KX1RSSUdfU09VUkNFKF9fSU5KX1RSSUdfU09VUkNFX18pICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX1NPRlRXQVJFKSAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9UUkdPKSAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfQ0gxKSAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NINCkgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9UUkdPKSAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xOV9DSDEpICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMTlfQ0gyKSAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX0VYVElfTElORTE1KSkKKworI2RlZmluZSBJU19MTF9BRENfSU5KX1RSSUdfQVVUTyhfX0lOSl9UUklHX0FVVE9fXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCAgICgoX19JTkpfVFJJR19BVVRPX18pID09IExMX0FEQ19JTkpfVFJJR19JTkRFUEVOREVOVCkgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5KX1RSSUdfQVVUT19fKSA9PSBMTF9BRENfSU5KX1RSSUdfRlJPTV9HUlBfUkVHVUxBUikpCisKKyNkZWZpbmUgSVNfTExfQURDX0lOSl9TRVFfU0NBTl9MRU5HVEgoX19JTkpfU0VRX1NDQU5fTEVOR1RIX18pICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fSU5KX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfSU5KX1NFUV9TQ0FOX0RJU0FCTEUpICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOSl9TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX0lOSl9TRVFfU0NBTl9FTkFCTEVfMlJBTktTKSAgICAgICAgIFwKKyAgIHx8ICgoX19JTkpfU0VRX1NDQU5fTEVOR1RIX18pID09IExMX0FEQ19JTkpfU0VRX1NDQU5fRU5BQkxFXzNSQU5LUykgICAgICAgICBcCisgICB8fCAoKF9fSU5KX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfSU5KX1NFUV9TQ0FOX0VOQUJMRV80UkFOS1MpKQorCisjZGVmaW5lIElTX0xMX0FEQ19JTkpfU0VRX1NDQU5fRElTQ09OVF9NT0RFKF9fSU5KX1NFUV9ESVNDT05UX01PREVfXykgICAgICAgICAgXAorICAoICAgKChfX0lOSl9TRVFfRElTQ09OVF9NT0RFX18pID09IExMX0FEQ19JTkpfU0VRX0RJU0NPTlRfRElTQUJMRSkgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTkpfU0VRX0RJU0NPTlRfTU9ERV9fKSA9PSBMTF9BRENfSU5KX1NFUV9ESVNDT05UXzFSQU5LKSAgKQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgQURDX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBBRENfTExfRUZfSW5pdAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRGUtaW5pdGlhbGl6ZSByZWdpc3RlcnMgb2YgYWxsIEFEQyBpbnN0YW5jZXMgYmVsb25naW5nIHRvCisgICogICAgICAgICB0aGUgc2FtZSBBREMgY29tbW9uIGluc3RhbmNlIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLgorICAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IEFEQyBjb21tb24gcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IG5vdCBhcHBsaWNhYmxlCisgICovCitFcnJvclN0YXR1cyBMTF9BRENfQ29tbW9uRGVJbml0KEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0NPTU1PTl9JTlNUQU5DRShBREN4eV9DT01NT04pKTsKKyAgCisgIC8qIEZvcmNlIHJlc2V0IG9mIEFEQyBjbG9jayAoY29yZSBjbG9jaykgKi8KKyAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXQgIChMTF9BUEIyX0dSUDFfUEVSSVBIX0FEQzEpOworICAKKyAgLyogUmVsZWFzZSByZXNldCBvZiBBREMgY2xvY2sgKGNvcmUgY2xvY2spICovCisgIExMX0FQQjJfR1JQMV9SZWxlYXNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9BREMxKTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQGJyaWVmICBEZS1pbml0aWFsaXplIHJlZ2lzdGVycyBvZiB0aGUgc2VsZWN0ZWQgQURDIGluc3RhbmNlCisgICogICAgICAgICB0byB0aGVpciBkZWZhdWx0IHJlc2V0IHZhbHVlcy4KKyAgKiBAbm90ZSAgIFRvIHJlc2V0IGFsbCBBREMgaW5zdGFuY2VzIHF1aWNrbHkgKHBlcmZvcm0gYSBoYXJkIHJlc2V0KSwKKyAgKiAgICAgICAgIHVzZSBmdW5jdGlvbiBAcmVmIExMX0FEQ19Db21tb25EZUluaXQoKS4KKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IEFEQyByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogQURDIHJlZ2lzdGVycyBhcmUgbm90IGRlLWluaXRpYWxpemVkCisgICovCitFcnJvclN0YXR1cyBMTF9BRENfRGVJbml0KEFEQ19UeXBlRGVmICpBREN4KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoQURDeCkpOworICAKKyAgLyogRGlzYWJsZSBBREMgaW5zdGFuY2UgaWYgbm90IGFscmVhZHkgZGlzYWJsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmKExMX0FEQ19Jc0VuYWJsZWQoQURDeCkgPT0gMVUpCisgIHsKKyAgICAvKiBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgdHJpZ2dlciBzb3VyY2UgdG8gU1cgc3RhcnQgdG8gZW5zdXJlIHRvIG5vdCAgICAgICovCisgICAgLyogaGF2ZSBhbiBleHRlcm5hbCB0cmlnZ2VyIGV2ZW50IG9jY3VycmluZyBkdXJpbmcgdGhlIGNvbnZlcnNpb24gc3RvcCAgICAqLworICAgIC8qIEFEQyBkaXNhYmxlIHByb2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMTF9BRENfUkVHX1NldFRyaWdnZXJTb3VyY2UoQURDeCwgTExfQURDX1JFR19UUklHX1NPRlRXQVJFKTsKKyAgICAKKyAgICAvKiBTZXQgQURDIGdyb3VwIGluamVjdGVkIHRyaWdnZXIgc291cmNlIHRvIFNXIHN0YXJ0IHRvIGVuc3VyZSB0byBub3QgICAgICovCisgICAgLyogaGF2ZSBhbiBleHRlcm5hbCB0cmlnZ2VyIGV2ZW50IG9jY3VycmluZyBkdXJpbmcgdGhlIGNvbnZlcnNpb24gc3RvcCAgICAqLworICAgIC8qIEFEQyBkaXNhYmxlIHByb2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMTF9BRENfSU5KX1NldFRyaWdnZXJTb3VyY2UoQURDeCwgTExfQURDX0lOSl9UUklHX1NPRlRXQVJFKTsKKyAgICAKKyAgICAvKiBEaXNhYmxlIHRoZSBBREMgaW5zdGFuY2UgKi8KKyAgICBMTF9BRENfRGlzYWJsZShBREN4KTsKKyAgfQorICAKKyAgLyogQ2hlY2sgd2hldGhlciBBREMgc3RhdGUgaXMgY29tcGxpYW50IHdpdGggZXhwZWN0ZWQgc3RhdGUgKi8KKyAgLyogKGhhcmR3YXJlIHJlcXVpcmVtZW50cyBvZiBiaXRzIHN0YXRlIHRvIHJlc2V0IHJlZ2lzdGVycyBiZWxvdykgKi8KKyAgaWYoUkVBRF9CSVQoQURDeC0+Q1IyLCBBRENfQ1IyX0FET04pID09IDBVKQorICB7CisgICAgLyogPT09PT09PT09PSBSZXNldCBBREMgcmVnaXN0ZXJzID09PT09PT09PT0gKi8KKyAgICAvKiBSZXNldCByZWdpc3RlciBTUiAqLworICAgIENMRUFSX0JJVChBREN4LT5TUiwKKyAgICAgICAgICAgICAgKCAgTExfQURDX0ZMQUdfU1RSVAorICAgICAgICAgICAgICAgfCBMTF9BRENfRkxBR19KU1RSVAorICAgICAgICAgICAgICAgfCBMTF9BRENfRkxBR19FT1MKKyAgICAgICAgICAgICAgIHwgTExfQURDX0ZMQUdfSkVPUworICAgICAgICAgICAgICAgfCBMTF9BRENfRkxBR19BV0QxICkKKyAgICAgICAgICAgICApOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIENSMSAqLworICAgIENMRUFSX0JJVChBREN4LT5DUjEsCisgICAgICAgICAgICAgICggIEFEQ19DUjFfQVdERU4gICB8IEFEQ19DUjFfSkFXREVOCisgICAgICAgICAgICAgICB8IEFEQ19DUjFfRElTQ05VTSB8IEFEQ19DUjFfSkRJU0NFTiB8IEFEQ19DUjFfRElTQ0VOCisgICAgICAgICAgICAgICB8IEFEQ19DUjFfSkFVVE8gICB8IEFEQ19DUjFfQVdEU0dMICB8IEFEQ19DUjFfU0NBTgorICAgICAgICAgICAgICAgfCBBRENfQ1IxX0pFT0NJRSAgfCBBRENfQ1IxX0FXRElFICAgfCBBRENfQ1IxX0VPQ0lFCisgICAgICAgICAgICAgICB8IEFEQ19DUjFfQVdEQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICk7CisgICAgCisgICAgLyogUmVzZXQgcmVnaXN0ZXIgQ1IyICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPkNSMiwKKyAgICAgICAgICAgICAgKCAgQURDX0NSMl9UU1ZSRUZFCisgICAgICAgICAgICAgICB8IEFEQ19DUjJfU1dTVEFSVCAgfCBBRENfQ1IyX0VYVFRSSUcgIHwgQURDX0NSMl9FWFRTRUwKKyAgICAgICAgICAgICAgIHwgQURDX0NSMl9KU1dTVEFSVCB8IEFEQ19DUjJfSkVYVFRSSUcgfCBBRENfQ1IyX0pFWFRTRUwKKyAgICAgICAgICAgICAgIHwgQURDX0NSMl9BTElHTiAgICB8IEFEQ19DUjJfRE1BCisgICAgICAgICAgICAgICB8IEFEQ19DUjJfUlNUQ0FMICAgfCBBRENfQ1IyX0NBTAorICAgICAgICAgICAgICAgfCBBRENfQ1IyX0NPTlQgICAgIHwgQURDX0NSMl9BRE9OICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICApOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFNNUFIxICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPlNNUFIxLAorICAgICAgICAgICAgICAoICBBRENfU01QUjFfU01QMTcgfCBBRENfU01QUjFfU01QMTYKKyAgICAgICAgICAgICAgIHwgQURDX1NNUFIxX1NNUDE1IHwgQURDX1NNUFIxX1NNUDE0IHwgQURDX1NNUFIxX1NNUDEzCisgICAgICAgICAgICAgICB8IEFEQ19TTVBSMV9TTVAxMiB8IEFEQ19TTVBSMV9TTVAxMSB8IEFEQ19TTVBSMV9TTVAxMCkKKyAgICAgICAgICAgICApOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFNNUFIyICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPlNNUFIyLAorICAgICAgICAgICAgICAoICBBRENfU01QUjJfU01QOQorICAgICAgICAgICAgICAgfCBBRENfU01QUjJfU01QOCB8IEFEQ19TTVBSMl9TTVA3IHwgQURDX1NNUFIyX1NNUDYKKyAgICAgICAgICAgICAgIHwgQURDX1NNUFIyX1NNUDUgfCBBRENfU01QUjJfU01QNCB8IEFEQ19TTVBSMl9TTVAzCisgICAgICAgICAgICAgICB8IEFEQ19TTVBSMl9TTVAyIHwgQURDX1NNUFIyX1NNUDEgfCBBRENfU01QUjJfU01QMCkKKyAgICAgICAgICAgICApOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIEpPRlIxICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPkpPRlIxLCBBRENfSk9GUjFfSk9GRlNFVDEpOworICAgIC8qIFJlc2V0IHJlZ2lzdGVyIEpPRlIyICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPkpPRlIyLCBBRENfSk9GUjJfSk9GRlNFVDIpOworICAgIC8qIFJlc2V0IHJlZ2lzdGVyIEpPRlIzICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPkpPRlIzLCBBRENfSk9GUjNfSk9GRlNFVDMpOworICAgIC8qIFJlc2V0IHJlZ2lzdGVyIEpPRlI0ICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPkpPRlI0LCBBRENfSk9GUjRfSk9GRlNFVDQpOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIEhUUiAqLworICAgIFNFVF9CSVQoQURDeC0+SFRSLCBBRENfSFRSX0hUKTsKKyAgICAvKiBSZXNldCByZWdpc3RlciBMVFIgKi8KKyAgICBDTEVBUl9CSVQoQURDeC0+TFRSLCBBRENfTFRSX0xUKTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBTUVIxICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPlNRUjEsCisgICAgICAgICAgICAgICggIEFEQ19TUVIxX0wKKyAgICAgICAgICAgICAgIHwgQURDX1NRUjFfU1ExNgorICAgICAgICAgICAgICAgfCBBRENfU1FSMV9TUTE1IHwgQURDX1NRUjFfU1ExNCB8IEFEQ19TUVIxX1NRMTMpCisgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBTUVIyICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPlNRUjIsCisgICAgICAgICAgICAgICggIEFEQ19TUVIyX1NRMTIgfCBBRENfU1FSMl9TUTExIHwgQURDX1NRUjJfU1ExMAorICAgICAgICAgICAgICAgfCBBRENfU1FSMl9TUTkgfCBBRENfU1FSMl9TUTggfCBBRENfU1FSMl9TUTcpCisgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBKU1FSICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPkpTUVIsCisgICAgICAgICAgICAgICggIEFEQ19KU1FSX0pMCisgICAgICAgICAgICAgICB8IEFEQ19KU1FSX0pTUTQgfCBBRENfSlNRUl9KU1EzCisgICAgICAgICAgICAgICB8IEFEQ19KU1FSX0pTUTIgfCBBRENfSlNRUl9KU1ExICApCisgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBEUiAqLworICAgIC8qIGJpdHMgaW4gYWNjZXNzIG1vZGUgcmVhZCBvbmx5LCBubyBkaXJlY3QgcmVzZXQgYXBwbGljYWJsZSAqLworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVycyBKRFIxLCBKRFIyLCBKRFIzLCBKRFI0ICovCisgICAgLyogYml0cyBpbiBhY2Nlc3MgbW9kZSByZWFkIG9ubHksIG5vIGRpcmVjdCByZXNldCBhcHBsaWNhYmxlICovCisgICAgCisgIH0KKyAgCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSBzb21lIGZlYXR1cmVzIG9mIEFEQyBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFRoZXNlIHBhcmFtZXRlcnMgaGF2ZSBhbiBpbXBhY3Qgb24gQURDIHNjb3BlOiBBREMgaW5zdGFuY2UuCisgICogICAgICAgICBBZmZlY3RzIGJvdGggZ3JvdXAgcmVndWxhciBhbmQgZ3JvdXAgaW5qZWN0ZWQgKGF2YWlsYWJpbGl0eQorICAqICAgICAgICAgb2YgQURDIGdyb3VwIGluamVjdGVkIGRlcGVuZHMgb24gU1RNMzIgZmFtaWxpZXMpLgorICAqICAgICAgICAgUmVmZXIgdG8gY29ycmVzcG9uZGluZyB1bml0YXJ5IGZ1bmN0aW9ucyBpbnRvCisgICogICAgICAgICBAcmVmIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0FEQ19JbnN0YW5jZSAuCisgICogQG5vdGUgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX0luaXQoKQorICAqICAgICAgICAgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIGluc3RhbmNlIG11c3QgYmUgZGlzYWJsZWQuCisgICogICAgICAgICBUaGlzIGNvbmRpdGlvbiBpcyBhcHBsaWVkIHRvIGFsbCBBREMgZmVhdHVyZXMsIGZvciBlZmZpY2llbmN5CisgICogICAgICAgICBhbmQgY29tcGF0aWJpbGl0eSBvdmVyIGFsbCBTVE0zMiBmYW1pbGllcy4gSG93ZXZlciwgdGhlIGRpZmZlcmVudAorICAqICAgICAgICAgZmVhdHVyZXMgY2FuIGJlIHNldCB1bmRlciBkaWZmZXJlbnQgQURDIHN0YXRlIGNvbmRpdGlvbnMKKyAgKiAgICAgICAgIChzZXR0aW5nIHBvc3NpYmxlIHdpdGggQURDIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nLAorICAqICAgICAgICAgQURDIGVuYWJsZWQgd2l0aCBjb252ZXJzaW9uIG9uIGdvaW5nLCAuLi4pCisgICogICAgICAgICBFYWNoIGZlYXR1cmUgY2FuIGJlIHVwZGF0ZWQgYWZ0ZXJ3YXJkcyB3aXRoIGEgdW5pdGFyeSBmdW5jdGlvbgorICAqICAgICAgICAgYW5kIHBvdGVudGlhbGx5IHdpdGggQURDIGluIGEgZGlmZmVyZW50IHN0YXRlIHRoYW4gZGlzYWJsZWQsCisgICogICAgICAgICByZWZlciB0byBkZXNjcmlwdGlvbiBvZiBlYWNoIGZ1bmN0aW9uIGZvciBzZXR0aW5nCisgICogICAgICAgICBjb25kaXRpb25lZCB0byBBREMgc3RhdGUuCisgICogQG5vdGUgICBBZnRlciB1c2luZyB0aGlzIGZ1bmN0aW9uLCBzb21lIG90aGVyIGZlYXR1cmVzIG11c3QgYmUgY29uZmlndXJlZAorICAqICAgICAgICAgdXNpbmcgTEwgdW5pdGFyeSBmdW5jdGlvbnMuCisgICogICAgICAgICBUaGUgbWluaW11bSBjb25maWd1cmF0aW9uIHJlbWFpbmluZyB0byBiZSBkb25lIGlzOgorICAqICAgICAgICAgIC0gU2V0IEFEQyBncm91cCByZWd1bGFyIG9yIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlcjoKKyAgKiAgICAgICAgICAgIG1hcCBjaGFubmVsIG9uIHRoZSBzZWxlY3RlZCBzZXF1ZW5jZXIgcmFuay4KKyAgKiAgICAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rcygpLgorICAqICAgICAgICAgIC0gU2V0IEFEQyBjaGFubmVsIHNhbXBsaW5nIHRpbWUKKyAgKiAgICAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9uIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lKCk7CisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgQURDX0luaXRTdHJ1Y3QgUG9pbnRlciB0byBhIEByZWYgTExfQURDX1JFR19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogQURDIHJlZ2lzdGVycyBhcmUgaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBBREMgcmVnaXN0ZXJzIGFyZSBub3QgaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0FEQ19Jbml0KEFEQ19UeXBlRGVmICpBREN4LCBMTF9BRENfSW5pdFR5cGVEZWYgKkFEQ19Jbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoQURDeCkpOworICAKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19EQVRBX0FMSUdOKEFEQ19Jbml0U3RydWN0LT5EYXRhQWxpZ25tZW50KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9BRENfU0NBTl9TRUxFQ1RJT04oQURDX0luaXRTdHJ1Y3QtPlNlcXVlbmNlcnNTY2FuTW9kZSkpOworICAKKyAgLyogTm90ZTogSGFyZHdhcmUgY29uc3RyYWludCAocmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgdGhpcyBmdW5jdGlvbik6ICAgICAgICovCisgIC8qICAgICAgIEFEQyBpbnN0YW5jZSBtdXN0IGJlIGRpc2FibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZihMTF9BRENfSXNFbmFibGVkKEFEQ3gpID09IDBVKQorICB7CisgICAgLyogQ29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIEFEQyBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAtIFNldCBBREMgY29udmVyc2lvbiBkYXRhIGFsaWdubWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTU9ESUZZX1JFRyhBREN4LT5DUjEsCisgICAgICAgICAgICAgICAgIEFEQ19DUjFfU0NBTgorICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIEFEQ19Jbml0U3RydWN0LT5TZXF1ZW5jZXJzU2Nhbk1vZGUKKyAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICBNT0RJRllfUkVHKEFEQ3gtPkNSMiwKKyAgICAgICAgICAgICAgICAgQURDX0NSMl9BTElHTgorICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIEFEQ19Jbml0U3RydWN0LT5EYXRhQWxpZ25tZW50CisgICAgICAgICAgICAgICk7CisKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBJbml0aWFsaXphdGlvbiBlcnJvcjogQURDIGluc3RhbmNlIGlzIG5vdCBkaXNhYmxlZC4gKi8KKyAgICBzdGF0dXMgPSBFUlJPUjsKKyAgfQorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBlYWNoIEByZWYgTExfQURDX0luaXRUeXBlRGVmIGZpZWxkIHRvIGRlZmF1bHQgdmFsdWUuCisgICogQHBhcmFtICBBRENfSW5pdFN0cnVjdCBQb2ludGVyIHRvIGEgQHJlZiBMTF9BRENfSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogICAgICAgICAgICAgICAgICAgICAgICB3aG9zZSBmaWVsZHMgd2lsbCBiZSBzZXQgdG8gZGVmYXVsdCB2YWx1ZXMuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX0FEQ19TdHJ1Y3RJbml0KExMX0FEQ19Jbml0VHlwZURlZiAqQURDX0luaXRTdHJ1Y3QpCit7CisgIC8qIFNldCBBRENfSW5pdFN0cnVjdCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8KKyAgLyogU2V0IGZpZWxkcyBvZiBBREMgaW5zdGFuY2UgKi8KKyAgQURDX0luaXRTdHJ1Y3QtPkRhdGFBbGlnbm1lbnQgPSBMTF9BRENfREFUQV9BTElHTl9SSUdIVDsKKyAgCisgIC8qIEVuYWJsZSBzY2FuIG1vZGUgdG8gaGF2ZSBhIGdlbmVyaWMgYmVoYXZpb3Igd2l0aCBBREMgb2Ygb3RoZXIgICAgICAgICAgICAqLworICAvKiBTVE0zMiBmYW1pbGllcywgd2l0aG91dCB0aGlzIHNldHRpbmcgYXZhaWxhYmxlOiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGFuZCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGRlcGVuZCAgICAgICovCisgIC8qIG9ubHkgb2YgdGhlaXIgb3duIGNvbmZpZ3VyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBBRENfSW5pdFN0cnVjdC0+U2VxdWVuY2Vyc1NjYW5Nb2RlICAgICAgPSBMTF9BRENfU0VRX1NDQU5fRU5BQkxFOworICAKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHNvbWUgZmVhdHVyZXMgb2YgQURDIGdyb3VwIHJlZ3VsYXIuCisgICogQG5vdGUgICBUaGVzZSBwYXJhbWV0ZXJzIGhhdmUgYW4gaW1wYWN0IG9uIEFEQyBzY29wZTogQURDIGdyb3VwIHJlZ3VsYXIuCisgICogICAgICAgICBSZWZlciB0byBjb3JyZXNwb25kaW5nIHVuaXRhcnkgZnVuY3Rpb25zIGludG8KKyAgKiAgICAgICAgIEByZWYgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX0dyb3VwX1JlZ3VsYXIKKyAgKiAgICAgICAgIChmdW5jdGlvbnMgd2l0aCBwcmVmaXggIlJFRyIpLgorICAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBieSBmdW5jdGlvbiBAcmVmIExMX0FEQ19Jbml0KCkKKyAgKiAgICAgICAgIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBpbnN0YW5jZSBtdXN0IGJlIGRpc2FibGVkLgorICAqICAgICAgICAgVGhpcyBjb25kaXRpb24gaXMgYXBwbGllZCB0byBhbGwgQURDIGZlYXR1cmVzLCBmb3IgZWZmaWNpZW5jeQorICAqICAgICAgICAgYW5kIGNvbXBhdGliaWxpdHkgb3ZlciBhbGwgU1RNMzIgZmFtaWxpZXMuIEhvd2V2ZXIsIHRoZSBkaWZmZXJlbnQKKyAgKiAgICAgICAgIGZlYXR1cmVzIGNhbiBiZSBzZXQgdW5kZXIgZGlmZmVyZW50IEFEQyBzdGF0ZSBjb25kaXRpb25zCisgICogICAgICAgICAoc2V0dGluZyBwb3NzaWJsZSB3aXRoIEFEQyBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZywKKyAgKiAgICAgICAgIEFEQyBlbmFibGVkIHdpdGggY29udmVyc2lvbiBvbiBnb2luZywgLi4uKQorICAqICAgICAgICAgRWFjaCBmZWF0dXJlIGNhbiBiZSB1cGRhdGVkIGFmdGVyd2FyZHMgd2l0aCBhIHVuaXRhcnkgZnVuY3Rpb24KKyAgKiAgICAgICAgIGFuZCBwb3RlbnRpYWxseSB3aXRoIEFEQyBpbiBhIGRpZmZlcmVudCBzdGF0ZSB0aGFuIGRpc2FibGVkLAorICAqICAgICAgICAgcmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgZWFjaCBmdW5jdGlvbiBmb3Igc2V0dGluZworICAqICAgICAgICAgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLgorICAqIEBub3RlICAgQWZ0ZXIgdXNpbmcgdGhpcyBmdW5jdGlvbiwgb3RoZXIgZmVhdHVyZXMgbXVzdCBiZSBjb25maWd1cmVkCisgICogICAgICAgICB1c2luZyBMTCB1bml0YXJ5IGZ1bmN0aW9ucy4KKyAgKiAgICAgICAgIFRoZSBtaW5pbXVtIGNvbmZpZ3VyYXRpb24gcmVtYWluaW5nIHRvIGJlIGRvbmUgaXM6CisgICogICAgICAgICAgLSBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgb3IgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyOgorICAqICAgICAgICAgICAgbWFwIGNoYW5uZWwgb24gdGhlIHNlbGVjdGVkIHNlcXVlbmNlciByYW5rLgorICAqICAgICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzKCkuCisgICogICAgICAgICAgLSBTZXQgQURDIGNoYW5uZWwgc2FtcGxpbmcgdGltZQorICAqICAgICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb24gTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWUoKTsKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBBRENfUkVHX0luaXRTdHJ1Y3QgUG9pbnRlciB0byBhIEByZWYgTExfQURDX1JFR19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogQURDIHJlZ2lzdGVycyBhcmUgaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBBREMgcmVnaXN0ZXJzIGFyZSBub3QgaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0FEQ19SRUdfSW5pdChBRENfVHlwZURlZiAqQURDeCwgTExfQURDX1JFR19Jbml0VHlwZURlZiAqQURDX1JFR19Jbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoQURDeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX1JFR19UUklHX1NPVVJDRShBRENfUkVHX0luaXRTdHJ1Y3QtPlRyaWdnZXJTb3VyY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19SRUdfU0VRX1NDQU5fTEVOR1RIKEFEQ19SRUdfSW5pdFN0cnVjdC0+U2VxdWVuY2VyTGVuZ3RoKSk7CisgIGlmKEFEQ19SRUdfSW5pdFN0cnVjdC0+U2VxdWVuY2VyTGVuZ3RoICE9IExMX0FEQ19SRUdfU0VRX1NDQU5fRElTQUJMRSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19MTF9BRENfUkVHX1NFUV9TQ0FOX0RJU0NPTlRfTU9ERShBRENfUkVHX0luaXRTdHJ1Y3QtPlNlcXVlbmNlckRpc2NvbnQpKTsKKyAgfQorICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX1JFR19DT05USU5VT1VTX01PREUoQURDX1JFR19Jbml0U3RydWN0LT5Db250aW51b3VzTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX1JFR19ETUFfVFJBTlNGRVIoQURDX1JFR19Jbml0U3RydWN0LT5ETUFUcmFuc2ZlcikpOworICAKKyAgLyogTm90ZTogSGFyZHdhcmUgY29uc3RyYWludCAocmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgdGhpcyBmdW5jdGlvbik6ICAgICAgICovCisgIC8qICAgICAgIEFEQyBpbnN0YW5jZSBtdXN0IGJlIGRpc2FibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZihMTF9BRENfSXNFbmFibGVkKEFEQ3gpID09IDBVKQorICB7CisgICAgLyogQ29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIEFEQyBncm91cCByZWd1bGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAtIFNldCBBREMgZ3JvdXAgcmVndWxhciB0cmlnZ2VyIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgLSBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIC0gU2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAtIFNldCBBREMgZ3JvdXAgcmVndWxhciBjb250aW51b3VzIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgLSBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhIHRyYW5zZmVyOiBubyB0cmFuc2ZlciBvciAgICAqLworICAgIC8qICAgICAgdHJhbnNmZXIgYnkgRE1BLCBhbmQgRE1BIHJlcXVlc3RzIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllLCBBREMgdHJpZ2dlciBlZGdlIGlzIHNldCB3aGVuIHN0YXJ0aW5nICAgICAgICAqLworICAgIC8qICAgICAgIEFEQyBjb252ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICBSZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU3RhcnRDb252ZXJzaW9uRXh0VHJpZygpLiAgICAgICovCisgICAgaWYoQURDX1JFR19Jbml0U3RydWN0LT5TZXF1ZW5jZXJMZW5ndGggIT0gTExfQURDX1JFR19TRVFfU0NBTl9ESVNBQkxFKQorICAgIHsKKyAgICAgIE1PRElGWV9SRUcoQURDeC0+Q1IxLAorICAgICAgICAgICAgICAgICAgIEFEQ19DUjFfRElTQ0VOCisgICAgICAgICAgICAgICAgIHwgQURDX0NSMV9ESVNDTlVNCisgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAgIEFEQ19SRUdfSW5pdFN0cnVjdC0+U2VxdWVuY2VyTGVuZ3RoCisgICAgICAgICAgICAgICAgIHwgQURDX1JFR19Jbml0U3RydWN0LT5TZXF1ZW5jZXJEaXNjb250CisgICAgICAgICAgICAgICAgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIE1PRElGWV9SRUcoQURDeC0+Q1IxLAorICAgICAgICAgICAgICAgICAgIEFEQ19DUjFfRElTQ0VOCisgICAgICAgICAgICAgICAgIHwgQURDX0NSMV9ESVNDTlVNCisgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAgIEFEQ19SRUdfSW5pdFN0cnVjdC0+U2VxdWVuY2VyTGVuZ3RoCisgICAgICAgICAgICAgICAgIHwgTExfQURDX1JFR19TRVFfRElTQ09OVF9ESVNBQkxFCisgICAgICAgICAgICAgICAgKTsKKyAgICB9CisgICAgCisgICAgTU9ESUZZX1JFRyhBREN4LT5DUjIsCisgICAgICAgICAgICAgICAgIEFEQ19DUjJfRVhUU0VMCisgICAgICAgICAgICAgICB8IEFEQ19DUjJfQ09OVAorICAgICAgICAgICAgICAgfCBBRENfQ1IyX0RNQQorICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIEFEQ19SRUdfSW5pdFN0cnVjdC0+VHJpZ2dlclNvdXJjZQorICAgICAgICAgICAgICAgfCBBRENfUkVHX0luaXRTdHJ1Y3QtPkNvbnRpbnVvdXNNb2RlCisgICAgICAgICAgICAgICB8IEFEQ19SRUdfSW5pdFN0cnVjdC0+RE1BVHJhbnNmZXIKKyAgICAgICAgICAgICAgKTsKKworICAgIC8qIFNldCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBzY2FuIGRpcmVjdGlvbiAqLworICAgIC8qIE5vdGU6IEhhcmR3YXJlIGNvbnN0cmFpbnQgKHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHRoaXMgZnVuY3Rpb24pOiAgICAgKi8KKyAgICAvKiBOb3RlOiBJZiBBREMgaW5zdGFuY2UgZmVhdHVyZSBzY2FuIG1vZGUgaXMgZGlzYWJsZWQgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgKHJlZmVyIHRvICBBREMgaW5zdGFuY2UgaW5pdGlhbGl6YXRpb24gc3RydWN0dXJlICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgIHBhcmFtZXRlciBAcmVmIFNlcXVlbmNlcnNTY2FuTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICBvciBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRTZXF1ZW5jZXJzU2Nhbk1vZGUoKSApLCAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgdGhpcyBwYXJhbWV0ZXIgaXMgZGlzY2FyZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyTGVuZ3RoKEFEQ3gsIEFEQ19SRUdfSW5pdFN0cnVjdC0+U2VxdWVuY2VyTGVuZ3RoKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBJbml0aWFsaXphdGlvbiBlcnJvcjogQURDIGluc3RhbmNlIGlzIG5vdCBkaXNhYmxlZC4gKi8KKyAgICBzdGF0dXMgPSBFUlJPUjsKKyAgfQorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBlYWNoIEByZWYgTExfQURDX1JFR19Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSAgQURDX1JFR19Jbml0U3RydWN0IFBvaW50ZXIgdG8gYSBAcmVmIExMX0FEQ19SRUdfSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hvc2UgZmllbGRzIHdpbGwgYmUgc2V0IHRvIGRlZmF1bHQgdmFsdWVzLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9BRENfUkVHX1N0cnVjdEluaXQoTExfQURDX1JFR19Jbml0VHlwZURlZiAqQURDX1JFR19Jbml0U3RydWN0KQoreworICAvKiBTZXQgQURDX1JFR19Jbml0U3RydWN0IGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICAvKiBTZXQgZmllbGRzIG9mIEFEQyBncm91cCByZWd1bGFyICovCisgIC8qIE5vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWUsIEFEQyB0cmlnZ2VyIGVkZ2UgaXMgc2V0IHdoZW4gc3RhcnRpbmcgICAgICAgICAqLworICAvKiAgICAgICBBREMgY29udmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgUmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1N0YXJ0Q29udmVyc2lvbkV4dFRyaWcoKS4gICAgICAgICovCisgIEFEQ19SRUdfSW5pdFN0cnVjdC0+VHJpZ2dlclNvdXJjZSAgICA9IExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRTsKKyAgQURDX1JFR19Jbml0U3RydWN0LT5TZXF1ZW5jZXJMZW5ndGggID0gTExfQURDX1JFR19TRVFfU0NBTl9ESVNBQkxFOworICBBRENfUkVHX0luaXRTdHJ1Y3QtPlNlcXVlbmNlckRpc2NvbnQgPSBMTF9BRENfUkVHX1NFUV9ESVNDT05UX0RJU0FCTEU7CisgIEFEQ19SRUdfSW5pdFN0cnVjdC0+Q29udGludW91c01vZGUgICA9IExMX0FEQ19SRUdfQ09OVl9TSU5HTEU7CisgIEFEQ19SRUdfSW5pdFN0cnVjdC0+RE1BVHJhbnNmZXIgICAgICA9IExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX05PTkU7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSBzb21lIGZlYXR1cmVzIG9mIEFEQyBncm91cCBpbmplY3RlZC4KKyAgKiBAbm90ZSAgIFRoZXNlIHBhcmFtZXRlcnMgaGF2ZSBhbiBpbXBhY3Qgb24gQURDIHNjb3BlOiBBREMgZ3JvdXAgaW5qZWN0ZWQuCisgICogICAgICAgICBSZWZlciB0byBjb3JyZXNwb25kaW5nIHVuaXRhcnkgZnVuY3Rpb25zIGludG8KKyAgKiAgICAgICAgIEByZWYgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX0dyb3VwX1JlZ3VsYXIKKyAgKiAgICAgICAgIChmdW5jdGlvbnMgd2l0aCBwcmVmaXggIklOSiIpLgorICAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBieSBmdW5jdGlvbiBAcmVmIExMX0FEQ19Jbml0KCkKKyAgKiAgICAgICAgIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBpbnN0YW5jZSBtdXN0IGJlIGRpc2FibGVkLgorICAqICAgICAgICAgVGhpcyBjb25kaXRpb24gaXMgYXBwbGllZCB0byBhbGwgQURDIGZlYXR1cmVzLCBmb3IgZWZmaWNpZW5jeQorICAqICAgICAgICAgYW5kIGNvbXBhdGliaWxpdHkgb3ZlciBhbGwgU1RNMzIgZmFtaWxpZXMuIEhvd2V2ZXIsIHRoZSBkaWZmZXJlbnQKKyAgKiAgICAgICAgIGZlYXR1cmVzIGNhbiBiZSBzZXQgdW5kZXIgZGlmZmVyZW50IEFEQyBzdGF0ZSBjb25kaXRpb25zCisgICogICAgICAgICAoc2V0dGluZyBwb3NzaWJsZSB3aXRoIEFEQyBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZywKKyAgKiAgICAgICAgIEFEQyBlbmFibGVkIHdpdGggY29udmVyc2lvbiBvbiBnb2luZywgLi4uKQorICAqICAgICAgICAgRWFjaCBmZWF0dXJlIGNhbiBiZSB1cGRhdGVkIGFmdGVyd2FyZHMgd2l0aCBhIHVuaXRhcnkgZnVuY3Rpb24KKyAgKiAgICAgICAgIGFuZCBwb3RlbnRpYWxseSB3aXRoIEFEQyBpbiBhIGRpZmZlcmVudCBzdGF0ZSB0aGFuIGRpc2FibGVkLAorICAqICAgICAgICAgcmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgZWFjaCBmdW5jdGlvbiBmb3Igc2V0dGluZworICAqICAgICAgICAgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLgorICAqIEBub3RlICAgQWZ0ZXIgdXNpbmcgdGhpcyBmdW5jdGlvbiwgb3RoZXIgZmVhdHVyZXMgbXVzdCBiZSBjb25maWd1cmVkCisgICogICAgICAgICB1c2luZyBMTCB1bml0YXJ5IGZ1bmN0aW9ucy4KKyAgKiAgICAgICAgIFRoZSBtaW5pbXVtIGNvbmZpZ3VyYXRpb24gcmVtYWluaW5nIHRvIGJlIGRvbmUgaXM6CisgICogICAgICAgICAgLSBTZXQgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlcjoKKyAgKiAgICAgICAgICAgIG1hcCBjaGFubmVsIG9uIHRoZSBzZWxlY3RlZCBzZXF1ZW5jZXIgcmFuay4KKyAgKiAgICAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX0lOSl9TZXRTZXF1ZW5jZXJSYW5rcygpLgorICAqICAgICAgICAgIC0gU2V0IEFEQyBjaGFubmVsIHNhbXBsaW5nIHRpbWUKKyAgKiAgICAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9uIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lKCk7CisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgQURDX0lOSl9Jbml0U3RydWN0IFBvaW50ZXIgdG8gYSBAcmVmIExMX0FEQ19JTkpfSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IEFEQyByZWdpc3RlcnMgYXJlIGluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogQURDIHJlZ2lzdGVycyBhcmUgbm90IGluaXRpYWxpemVkCisgICovCitFcnJvclN0YXR1cyBMTF9BRENfSU5KX0luaXQoQURDX1R5cGVEZWYgKkFEQ3gsIExMX0FEQ19JTkpfSW5pdFR5cGVEZWYgKkFEQ19JTkpfSW5pdFN0cnVjdCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gU1VDQ0VTUzsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKEFEQ3gpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19JTkpfVFJJR19TT1VSQ0UoQURDX0lOSl9Jbml0U3RydWN0LT5UcmlnZ2VyU291cmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9BRENfSU5KX1NFUV9TQ0FOX0xFTkdUSChBRENfSU5KX0luaXRTdHJ1Y3QtPlNlcXVlbmNlckxlbmd0aCkpOworICBpZihBRENfSU5KX0luaXRTdHJ1Y3QtPlNlcXVlbmNlckxlbmd0aCAhPSBMTF9BRENfSU5KX1NFUV9TQ0FOX0RJU0FCTEUpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX0lOSl9TRVFfU0NBTl9ESVNDT05UX01PREUoQURDX0lOSl9Jbml0U3RydWN0LT5TZXF1ZW5jZXJEaXNjb250KSk7CisgIH0KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19JTkpfVFJJR19BVVRPKEFEQ19JTkpfSW5pdFN0cnVjdC0+VHJpZ0F1dG8pKTsKKyAgCisgIC8qIE5vdGU6IEhhcmR3YXJlIGNvbnN0cmFpbnQgKHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHRoaXMgZnVuY3Rpb24pOiAgICAgICAqLworICAvKiAgICAgICBBREMgaW5zdGFuY2UgbXVzdCBiZSBkaXNhYmxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYoTExfQURDX0lzRW5hYmxlZChBREN4KSA9PSAwVSkKKyAgeworICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgQURDIGhpZXJhcmNoaWNhbCBzY29wZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBBREMgZ3JvdXAgaW5qZWN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgLSBTZXQgQURDIGdyb3VwIGluamVjdGVkIHRyaWdnZXIgc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIC0gU2V0IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAtIFNldCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZSAgICAgICAgICAgICAgICovCisgICAgLyogICAgLSBTZXQgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlcjogaW5kZXBlbmRlbnQgb3IgICAgICAgICAqLworICAgIC8qICAgICAgZnJvbSBBREMgZ3JvdXAgcmVndWxhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllLCBBREMgdHJpZ2dlciBlZGdlIGlzIHNldCB3aGVuIHN0YXJ0aW5nICAgICAgICovCisgICAgLyogICAgICAgQURDIGNvbnZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX0lOSl9TdGFydENvbnZlcnNpb25FeHRUcmlnKCkuICAgICAgKi8KKyAgICBpZihBRENfSU5KX0luaXRTdHJ1Y3QtPlNlcXVlbmNlckxlbmd0aCAhPSBMTF9BRENfUkVHX1NFUV9TQ0FOX0RJU0FCTEUpCisgICAgeworICAgICAgTU9ESUZZX1JFRyhBREN4LT5DUjEsCisgICAgICAgICAgICAgICAgICAgQURDX0NSMV9KRElTQ0VOCisgICAgICAgICAgICAgICAgIHwgQURDX0NSMV9KQVVUTworICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgICBBRENfSU5KX0luaXRTdHJ1Y3QtPlNlcXVlbmNlckRpc2NvbnQKKyAgICAgICAgICAgICAgICAgfCBBRENfSU5KX0luaXRTdHJ1Y3QtPlRyaWdBdXRvCisgICAgICAgICAgICAgICAgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIE1PRElGWV9SRUcoQURDeC0+Q1IxLAorICAgICAgICAgICAgICAgICAgIEFEQ19DUjFfSkRJU0NFTgorICAgICAgICAgICAgICAgICB8IEFEQ19DUjFfSkFVVE8KKyAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgTExfQURDX1JFR19TRVFfRElTQ09OVF9ESVNBQkxFCisgICAgICAgICAgICAgICAgIHwgQURDX0lOSl9Jbml0U3RydWN0LT5UcmlnQXV0bworICAgICAgICAgICAgICAgICk7CisgICAgfQorICAgIAorICAgIE1PRElGWV9SRUcoQURDeC0+Q1IyLAorICAgICAgICAgICAgICAgQURDX0NSMl9KRVhUU0VMCisgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgIEFEQ19JTkpfSW5pdFN0cnVjdC0+VHJpZ2dlclNvdXJjZQorICAgICAgICAgICAgICApOworICAgIAorICAgIC8qIE5vdGU6IEhhcmR3YXJlIGNvbnN0cmFpbnQgKHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHRoaXMgZnVuY3Rpb24pOiAgICAgKi8KKyAgICAvKiBOb3RlOiBJZiBBREMgaW5zdGFuY2UgZmVhdHVyZSBzY2FuIG1vZGUgaXMgZGlzYWJsZWQgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgKHJlZmVyIHRvICBBREMgaW5zdGFuY2UgaW5pdGlhbGl6YXRpb24gc3RydWN0dXJlICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgIHBhcmFtZXRlciBAcmVmIFNlcXVlbmNlcnNTY2FuTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICBvciBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRTZXF1ZW5jZXJzU2Nhbk1vZGUoKSApLCAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgdGhpcyBwYXJhbWV0ZXIgaXMgZGlzY2FyZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExMX0FEQ19JTkpfU2V0U2VxdWVuY2VyTGVuZ3RoKEFEQ3gsIEFEQ19JTkpfSW5pdFN0cnVjdC0+U2VxdWVuY2VyTGVuZ3RoKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBJbml0aWFsaXphdGlvbiBlcnJvcjogQURDIGluc3RhbmNlIGlzIG5vdCBkaXNhYmxlZC4gKi8KKyAgICBzdGF0dXMgPSBFUlJPUjsKKyAgfQorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBlYWNoIEByZWYgTExfQURDX0lOSl9Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSAgQURDX0lOSl9Jbml0U3RydWN0IFBvaW50ZXIgdG8gYSBAcmVmIExMX0FEQ19JTkpfSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hvc2UgZmllbGRzIHdpbGwgYmUgc2V0IHRvIGRlZmF1bHQgdmFsdWVzLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9BRENfSU5KX1N0cnVjdEluaXQoTExfQURDX0lOSl9Jbml0VHlwZURlZiAqQURDX0lOSl9Jbml0U3RydWN0KQoreworICAvKiBTZXQgQURDX0lOSl9Jbml0U3RydWN0IGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICAvKiBTZXQgZmllbGRzIG9mIEFEQyBncm91cCBpbmplY3RlZCAqLworICBBRENfSU5KX0luaXRTdHJ1Y3QtPlRyaWdnZXJTb3VyY2UgICAgPSBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkU7CisgIEFEQ19JTkpfSW5pdFN0cnVjdC0+U2VxdWVuY2VyTGVuZ3RoICA9IExMX0FEQ19JTkpfU0VRX1NDQU5fRElTQUJMRTsKKyAgQURDX0lOSl9Jbml0U3RydWN0LT5TZXF1ZW5jZXJEaXNjb250ID0gTExfQURDX0lOSl9TRVFfRElTQ09OVF9ESVNBQkxFOworICBBRENfSU5KX0luaXRTdHJ1Y3QtPlRyaWdBdXRvICAgICAgICAgPSBMTF9BRENfSU5KX1RSSUdfSU5ERVBFTkRFTlQ7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBBREMxICovCisKKworI2VuZGlmIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmYzeHhfbGxfY29tcC5jIGIvU3JjL3N0bTMyZjN4eF9sbF9jb21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThiN2ZmZAotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfbGxfY29tcC5jCkBAIC0wLDAgKzEsMTA1MSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9sbF9jb21wLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIENPTVAgTEwgbW9kdWxlIGRyaXZlcgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfbGxfY29tcC5oIgorCisjaWZkZWYgIFVTRV9GVUxMX0FTU0VSVAorICAjaW5jbHVkZSAic3RtMzJfYXNzZXJ0LmgiCisjZWxzZQorICAjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiBOb3RlOiBEZXZpY2VzIG9mIFNUTTMyRjMgc2VyaWUgZW1iZWQgMSBvdXQgb2YgMiBkaWZmZXJlbnQgY29tcGFyYXRvciBJUC4gICAqLworLyogICAgICAgLSBTVE0zMkYzMHgsIFNUTTMyRjMxeCwgU1RNMzJGMzJ4LCBTVE0zMkYzM3gsIFNUTTMyRjM1eCwgU1RNMzJGMzl4OiAgKi8KKy8qICAgICAgICAgQ09NUCBJUCBmcm9tIDMgdG8gNyBpbnN0YW5jZXMgYW5kIG90aGVyIHNwZWNpZmljIGZlYXR1cmVzICAgICAgICAgICovCisvKiAgICAgICAgIChjb21wYXJhdG9yIG91dHB1dCBibGFua2luZywgLi4uKSAocmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCkuICAgICAqLworLyogICAgICAgLSBTVE0zMkYzN3g6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgQ09NUCBJUCB3aXRoIDIgaW5zdGFuY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRyaXZlcnMgb2YgdGhlc2UgQ09NUCBJUCwgbG9jYXRlZCBpbiAyIGFyZWEgICAgKi8KKy8qICAgICAgIGRlbGltaXRlZCBieSBjb21waWxhdGlvbiBzd2l0Y2hlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNpZiBkZWZpbmVkKENPTVBfVjFfM18wXzApCisKKyNpZiBkZWZpbmVkIChDT01QMSkgfHwgZGVmaW5lZCAoQ09NUDIpIHx8IGRlZmluZWQgKENPTVAzKSB8fCBkZWZpbmVkIChDT01QNCkgfHwgZGVmaW5lZCAoQ09NUDUpIHx8IGRlZmluZWQgKENPTVA2KSB8fCBkZWZpbmVkIChDT01QNykKKworLyoqIEBhZGR0b2dyb3VwIENPTVBfTEwgQ09NUAorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAYWRkdG9ncm91cCBDT01QX0xMX1ByaXZhdGVfTWFjcm9zCisgICogQHsKKyAgKi8KKworLyogQ2hlY2sgb2YgcGFyYW1ldGVycyBmb3IgY29uZmlndXJhdGlvbiBvZiBDT01QIGhpZXJhcmNoaWNhbCBzY29wZTogICAgICAgICAgKi8KKy8qIENPTVAgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNpZiBkZWZpbmVkKENPTVBfQ1NSX0NPTVB4TU9ERSkKKyNkZWZpbmUgSVNfTExfQ09NUF9QT1dFUl9NT0RFKF9fUE9XRVJfTU9ERV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fUE9XRVJfTU9ERV9fKSA9PSBMTF9DT01QX1BPV0VSTU9ERV9ISUdIU1BFRUQpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1BPV0VSX01PREVfXykgPT0gTExfQ09NUF9QT1dFUk1PREVfTUVESVVNU1BFRUQpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19QT1dFUl9NT0RFX18pID09IExMX0NPTVBfUE9XRVJNT0RFX0xPV1BPV0VSKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUE9XRVJfTU9ERV9fKSA9PSBMTF9DT01QX1BPV0VSTU9ERV9VTFRSQUxPV1BPV0VSKSAgICAgICAgICAgICAgICAgICAgXAorICApCisjZWxzZQorI2RlZmluZSBJU19MTF9DT01QX1BPV0VSX01PREUoX19QT1dFUl9NT0RFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChfX1BPV0VSX01PREVfXykgPT0gTExfQ09NUF9QT1dFUk1PREVfSElHSFNQRUVEKQorI2VuZGlmCisKKy8qIE5vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWUsIGNvbXBhcmF0b3IgaW5wdXQgcGx1cyBwYXJhbWV0ZXJzIGFyZSAgICAgICAgICAgICovCisvKiAgICAgICB0aGUgc2FtZSBvbiBhbGwgQ09NUCBpbnN0YW5jZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgSG93ZXZlciwgY29tcGFyYXRvciBpbnN0YW5jZSBrZXB0IGFzIG1hY3JvIHBhcmFtZXRlciBmb3IgICAgICAgICAgICAgKi8KKy8qICAgICAgIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBTVE0zMiBmYW1pbGllcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWYgZGVmaW5lZChDT01QX0NTUl9DT01QeE5PTklOU0VMKSAmJiBkZWZpbmVkKExMX0NPTVBfSU5QVVRfUExVU19EQUMxX0NIMV9DT01QMSkKKy8qIE5vdGU6IE9uIGRldmljZXMgd2hlcmUgYml0IENPTVBfQ1NSX0NPTVB4Tk9OSU5TRUwgaXMgYXZhaWxhYmxlLCAgICAgICAgICAgICovCisvKiAgICAgICBmZWF0dXJlIExMX0NPTVBfSU5QVVRfUExVU19EQUMxX0NIMV9DT01QMSBpcyBhbHNvIGF2YWlsYWJsZS4gICAgICAgICAqLworI2RlZmluZSBJU19MTF9DT01QX0lOUFVUX1BMVVMoX19DT01QX0lOU1RBTkNFX18sIF9fSU5QVVRfUExVU19fKSAgICAgICAgICAgICAgIFwKKyAgKCAgICgoX19JTlBVVF9QTFVTX18pID09IExMX0NPTVBfSU5QVVRfUExVU19JTzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfUExVU19fKSA9PSBMTF9DT01QX0lOUFVUX1BMVVNfSU8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX1BMVVNfXykgPT0gTExfQ09NUF9JTlBVVF9QTFVTX0RBQzFfQ0gxX0NPTVAxKSAgICAgICAgICAgICAgICAgIFwKKyAgKQorI2VsaWYgZGVmaW5lZChDT01QX0NTUl9DT01QeE5PTklOU0VMKSAmJiBkZWZpbmVkKExMX0NPTVBfSU5QVVRfUExVU19EQUMxX0NIMV9DT01QMikKKy8qIE5vdGU6IE9uIGRldmljZXMgd2hlcmUgYml0IENPTVBfQ1NSX0NPTVB4Tk9OSU5TRUwgaXMgYXZhaWxhYmxlLCAgICAgICAgICAgICovCisvKiAgICAgICBmZWF0dXJlIExMX0NPTVBfSU5QVVRfUExVU19EQUMxX0NIMV9DT01QMSBpcyBhbHNvIGF2YWlsYWJsZS4gICAgICAgICAqLworI2RlZmluZSBJU19MTF9DT01QX0lOUFVUX1BMVVMoX19DT01QX0lOU1RBTkNFX18sIF9fSU5QVVRfUExVU19fKSAgICAgICAgICAgICAgIFwKKyAgKCAgICgoX19JTlBVVF9QTFVTX18pID09IExMX0NPTVBfSU5QVVRfUExVU19JTzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfUExVU19fKSA9PSBMTF9DT01QX0lOUFVUX1BMVVNfSU8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX1BMVVNfXykgPT0gTExfQ09NUF9JTlBVVF9QTFVTX0RBQzFfQ0gxX0NPTVAyKSAgICAgICAgICAgICAgICAgIFwKKyAgKQorI2VsaWYgZGVmaW5lZChDT01QX0NTUl9DT01QeE5PTklOU0VMKQorI2RlZmluZSBJU19MTF9DT01QX0lOUFVUX1BMVVMoX19DT01QX0lOU1RBTkNFX18sIF9fSU5QVVRfUExVU19fKSAgICAgICAgICAgICAgIFwKKyAgKCAgICgoX19JTlBVVF9QTFVTX18pID09IExMX0NPTVBfSU5QVVRfUExVU19JTzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfUExVU19fKSA9PSBMTF9DT01QX0lOUFVUX1BMVVNfSU8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisjZWxpZiBkZWZpbmVkKExMX0NPTVBfSU5QVVRfUExVU19EQUMxX0NIMV9DT01QMikKKy8qIE5vdGU6IE9uIGRldmljZXMgd2hlcmUgYml0IENPTVBfQ1NSX0NPTVB4Tk9OSU5TRUwgaXMgYXZhaWxhYmxlLCAgICAgICAgICAgICovCisvKiAgICAgICBmZWF0dXJlIExMX0NPTVBfSU5QVVRfUExVU19EQUMxX0NIMV9DT01QMSBpcyBhbHNvIGF2YWlsYWJsZS4gICAgICAgICAqLworI2RlZmluZSBJU19MTF9DT01QX0lOUFVUX1BMVVMoX19DT01QX0lOU1RBTkNFX18sIF9fSU5QVVRfUExVU19fKSAgICAgICAgICAgICAgIFwKKyAgKCAgICgoX19JTlBVVF9QTFVTX18pID09IExMX0NPTVBfSU5QVVRfUExVU19JTzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfUExVU19fKSA9PSBMTF9DT01QX0lOUFVUX1BMVVNfREFDMV9DSDFfQ09NUDIpICAgICAgICAgICAgICAgICAgXAorICApCisjZWxzZQorLyogTm90ZTogRGV2aWNlIHdpdGhvdXQgY29tcGFyYXRvciBpbnB1dCBwbHVzIGNvbmZpZ3VyYWJsZTogY29ycmVzcG9uZHMgdG8gICAgKi8KKy8qICAgICAgIHNldHRpbmcgIkxMX0NPTVBfSU5QVVRfUExVU19JTzEiIG9yICJMTF9DT01QX0lOUFVUX1BMVVNfSU8yIiAgICAgICAgICovCisvKiAgICAgICBjb21wYXJlZCB0byBvdGhlciBTVE0zMkYzIGRldmljZXMsIGRlcGVuZGluZyBvbiBjb21wYXJhdG9yIGluc3RhbmNlICAqLworLyogICAgICAgKHJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVNfTExfQ09NUF9JTlBVVF9QTFVTKF9fQ09NUF9JTlNUQU5DRV9fLCBfX0lOUFVUX1BMVVNfXykgICAgICAgICAgICAgICBcCisgICgoX19JTlBVVF9QTFVTX18pID09IExMX0NPTVBfSU5QVVRfUExVU19JTzEpCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IGRlZmluZWQoU1RNMzJGMzU4eHgpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpCisjZGVmaW5lIElTX0xMX0NPTVBfSU5QVVRfTUlOVVMoX19DT01QX0lOU1RBTkNFX18sIF9fSU5QVVRfTUlOVVNfXykgICAgICAgICAgICAgXAorICAoICAgKChfX0lOUFVUX01JTlVTX18pID09IExMX0NPTVBfSU5QVVRfTUlOVVNfMV80VlJFRklOVCkgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTlBVVF9NSU5VU19fKSA9PSBMTF9DT01QX0lOUFVUX01JTlVTXzFfMlZSRUZJTlQpICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfTUlOVVNfXykgPT0gTExfQ09NUF9JTlBVVF9NSU5VU18zXzRWUkVGSU5UKSAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX01JTlVTX18pID09IExMX0NPTVBfSU5QVVRfTUlOVVNfVlJFRklOVCkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTlBVVF9NSU5VU19fKSA9PSBMTF9DT01QX0lOUFVUX01JTlVTX0RBQzFfQ0gxKSAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfTUlOVVNfXykgPT0gTExfQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMikgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX01JTlVTX18pID09IExMX0NPTVBfSU5QVVRfTUlOVVNfSU8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTlBVVF9NSU5VU19fKSA9PSBMTF9DT01QX0lOUFVUX01JTlVTX0lPMikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfTUlOVVNfXykgPT0gTExfQ09NUF9JTlBVVF9NSU5VU19JTzMpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX01JTlVTX18pID09IExMX0NPTVBfSU5QVVRfTUlOVVNfSU80KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorI2VsaWYgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkKKyNkZWZpbmUgSVNfTExfQ09NUF9JTlBVVF9NSU5VUyhfX0NPTVBfSU5TVEFOQ0VfXywgX19JTlBVVF9NSU5VU19fKSAgICAgICAgICAgICBcCisgICggICAoKF9fSU5QVVRfTUlOVVNfXykgPT0gTExfQ09NUF9JTlBVVF9NSU5VU18xXzRWUkVGSU5UKSAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX01JTlVTX18pID09IExMX0NPTVBfSU5QVVRfTUlOVVNfMV8yVlJFRklOVCkgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTlBVVF9NSU5VU19fKSA9PSBMTF9DT01QX0lOUFVUX01JTlVTXzNfNFZSRUZJTlQpICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfTUlOVVNfXykgPT0gTExfQ09NUF9JTlBVVF9NSU5VU19WUkVGSU5UKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX01JTlVTX18pID09IExMX0NPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDEpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTlBVVF9NSU5VU19fKSA9PSBMTF9DT01QX0lOUFVUX01JTlVTX0RBQzFfQ0gyKSAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfTUlOVVNfXykgPT0gTExfQ09NUF9JTlBVVF9NSU5VU19JTzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX01JTlVTX18pID09IExMX0NPTVBfSU5QVVRfTUlOVVNfSU8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTlBVVF9NSU5VU19fKSA9PSBMTF9DT01QX0lOUFVUX01JTlVTX0lPNCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfTUlOVVNfXykgPT0gTExfQ09NUF9JTlBVVF9NSU5VU19EQUMyX0NIMSkgICAgICAgICAgICAgICAgICAgICAgXAorICApCisjZWxpZiBkZWZpbmVkKFNUTTMyRjMwMnhDKSB8fCBkZWZpbmVkKFNUTTMyRjMwMnhFKQorI2RlZmluZSBJU19MTF9DT01QX0lOUFVUX01JTlVTKF9fQ09NUF9JTlNUQU5DRV9fLCBfX0lOUFVUX01JTlVTX18pICAgICAgICAgICAgIFwKKyAgKCAgICgoX19JTlBVVF9NSU5VU19fKSA9PSBMTF9DT01QX0lOUFVUX01JTlVTXzFfNFZSRUZJTlQpICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfTUlOVVNfXykgPT0gTExfQ09NUF9JTlBVVF9NSU5VU18xXzJWUkVGSU5UKSAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX01JTlVTX18pID09IExMX0NPTVBfSU5QVVRfTUlOVVNfM180VlJFRklOVCkgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTlBVVF9NSU5VU19fKSA9PSBMTF9DT01QX0lOUFVUX01JTlVTX1ZSRUZJTlQpICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfTUlOVVNfXykgPT0gTExfQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX01JTlVTX18pID09IExMX0NPTVBfSU5QVVRfTUlOVVNfSU8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTlBVVF9NSU5VU19fKSA9PSBMTF9DT01QX0lOUFVUX01JTlVTX0lPMikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfTUlOVVNfXykgPT0gTExfQ09NUF9JTlBVVF9NSU5VU19JTzMpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX01JTlVTX18pID09IExMX0NPTVBfSU5QVVRfTUlOVVNfSU80KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorI2Vsc2UgLyogU1RNMzJGMzAxeDggfHwgU1RNMzJGMzE4eHggfHwgU1RNMzJGMzAyeDggKi8KKyNkZWZpbmUgSVNfTExfQ09NUF9JTlBVVF9NSU5VUyhfX0NPTVBfSU5TVEFOQ0VfXywgX19JTlBVVF9NSU5VU19fKSAgICAgICAgICAgICBcCisgICggICAoKF9fSU5QVVRfTUlOVVNfXykgPT0gTExfQ09NUF9JTlBVVF9NSU5VU18xXzRWUkVGSU5UKSAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX01JTlVTX18pID09IExMX0NPTVBfSU5QVVRfTUlOVVNfMV8yVlJFRklOVCkgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTlBVVF9NSU5VU19fKSA9PSBMTF9DT01QX0lOUFVUX01JTlVTXzNfNFZSRUZJTlQpICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfTUlOVVNfXykgPT0gTExfQ09NUF9JTlBVVF9NSU5VU19WUkVGSU5UKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX01JTlVTX18pID09IExMX0NPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDEpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTlBVVF9NSU5VU19fKSA9PSBMTF9DT01QX0lOUFVUX01JTlVTX0lPMSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfTUlOVVNfXykgPT0gTExfQ09NUF9JTlBVVF9NSU5VU19JTzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX01JTlVTX18pID09IExMX0NPTVBfSU5QVVRfTUlOVVNfSU80KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTVBfQ1NSX0NPTVB4SFlTVCkKKyNkZWZpbmUgSVNfTExfQ09NUF9JTlBVVF9IWVNURVJFU0lTKF9fSU5QVVRfSFlTVEVSRVNJU19fKSAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fSU5QVVRfSFlTVEVSRVNJU19fKSA9PSBMTF9DT01QX0hZU1RFUkVTSVNfTk9ORSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX0hZU1RFUkVTSVNfXykgPT0gTExfQ09NUF9IWVNURVJFU0lTX0xPVykgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTlBVVF9IWVNURVJFU0lTX18pID09IExMX0NPTVBfSFlTVEVSRVNJU19NRURJVU0pICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfSFlTVEVSRVNJU19fKSA9PSBMTF9DT01QX0hZU1RFUkVTSVNfSElHSCkgICAgICAgICAgICAgICAgICAgICAgXAorICApCisjZWxzZQorI2RlZmluZSBJU19MTF9DT01QX0lOUFVUX0hZU1RFUkVTSVMoX19JTlBVVF9IWVNURVJFU0lTX18pICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChfX0lOUFVUX0hZU1RFUkVTSVNfXykgPT0gTExfQ09NUF9IWVNURVJFU0lTX05PTkUpCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpCisjZGVmaW5lIElTX0xMX0NPTVBfT1VUUFVUX1NFTEVDVElPTihfX0NPTVBfSU5TVEFOQ0VfXywgX19PVVRQVVRfU0VMRUNUSU9OX18pICAgXAorICAoKCAgICAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9OT05FKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMV9CS0lOKSAgICAgICAgICAgICAgICAgICBcCisgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTFfQktJTjIpICAgICAgICAgICAgICAgICAgXAorICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKDFVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoKChfX0NPTVBfSU5TVEFOQ0VfXykgPT0gQ09NUDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMV9JQzFfQ09NUDIpICAgICAgICBcCisgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTJfSUM0X0NPTVAyKSAgICAgICAgXAorICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0xX09DQ0xSX0NPTVAyKSAgICAgIFwKKyAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMl9PQ0NMUl9DT01QMikgICAgICBcCisgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoKChfX0NPTVBfSU5TVEFOQ0VfXykgPT0gQ09NUDQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMTVfSUMyX0NPTVA0KSAgIFwKKyAgICAgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTE1X09DQ0xSX0NPTVA0KSBcCisgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0yX0lDMl9DT01QNikgICAgXAorICAgICAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMl9PQ0NMUl9DT01QNikgIFwKKyAgICAgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTE2X0lDMV9DT01QNikgICBcCisgICAgICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0xNl9PQ0NMUl9DT01QNikgXAorICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisjZWxpZiBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KQorI2RlZmluZSBJU19MTF9DT01QX09VVFBVVF9TRUxFQ1RJT04oX19DT01QX0lOU1RBTkNFX18sIF9fT1VUUFVUX1NFTEVDVElPTl9fKSAgIFwKKyAgKCggICAgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfTk9ORSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTFfQktJTikgICAgICAgICAgICAgICAgICAgXAorICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0xX0JLSU4yKSAgICAgICAgICAgICAgICAgIFwKKyAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgPyAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICgxVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKCgoX19DT01QX0lOU1RBTkNFX18pID09IENPTVAyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgPyAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTNfT0NDTFJfQ09NUDJfNCkgICAgXAorICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0xX0lDMV9DT01QMikgICAgICAgIFwKKyAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMl9JQzRfQ09NUDIpICAgICAgICBcCisgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTFfT0NDTFJfQ09NUDIpICAgICAgXAorICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0yX09DQ0xSX0NPTVAyKSAgICAgIFwKKyAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNM19JQzFfQ09NUDIpICAgICAgICBcCisgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoKChfX0NPTVBfSU5TVEFOQ0VfXykgPT0gQ09NUDQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNM19PQ0NMUl9DT01QMl80KVwKKyAgICAgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTNfSUMzX0NPTVA0KSAgICBcCisgICAgICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0xNV9JQzJfQ09NUDQpICAgXAorICAgICAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMTVfT0NDTFJfQ09NUDQpIFwKKyAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTJfSUMyX0NPTVA2KSAgICBcCisgICAgICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0yX09DQ0xSX0NPTVA2KSAgXAorICAgICAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMTZfSUMxX0NPTVA2KSAgIFwKKyAgICAgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTE2X09DQ0xSX0NPTVA2KSBcCisgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKyNlbGlmIGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAyeEUpCisjZGVmaW5lIElTX0xMX0NPTVBfT1VUUFVUX1NFTEVDVElPTihfX0NPTVBfSU5TVEFOQ0VfXywgX19PVVRQVVRfU0VMRUNUSU9OX18pICAgICAgXAorICAoKCAgICAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9OT05FKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMV9CS0lOKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTFfQktJTjIpICAgICAgICAgICAgICAgICAgICAgXAorICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKDFVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoKCgoX19DT01QX0lOU1RBTkNFX18pID09IENPTVAxKSB8fCAoKF9fQ09NUF9JTlNUQU5DRV9fKSA9PSBDT01QMikpICAgICAgICAgXAorICAgICAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNM19PQ0NMUl9DT01QMV8yXzQpICAgICBcCisgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTFfSUMxX0NPTVAxXzIpICAgICAgICAgXAorICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0yX0lDNF9DT01QMV8yKSAgICAgICAgIFwKKyAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMV9PQ0NMUl9DT01QMV8yKSAgICAgICBcCisgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTJfT0NDTFJfQ09NUDFfMikgICAgICAgXAorICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0zX0lDMV9DT01QMV8yKSAgICAgICAgIFwKKyAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICgoKF9fQ09NUF9JTlNUQU5DRV9fKSA9PSBDT01QNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgID8gKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0zX09DQ0xSX0NPTVAxXzJfNCkgXAorICAgICAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNM19JQzNfQ09NUDQpICAgICAgIFwKKyAgICAgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTRfSUMyX0NPTVA0KSAgICAgICBcCisgICAgICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0xNV9JQzJfQ09NUDQpICAgICAgXAorICAgICAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMTVfT0NDTFJfQ09NUDQpICAgIFwKKyAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTNfT0NDTFJfQ09NUDFfMl80KSBcCisgICAgICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0yX0lDMl9DT01QNikgICAgICAgXAorICAgICAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMl9PQ0NMUl9DT01QNikgICAgIFwKKyAgICAgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTRfSUM0X0NPTVA2KSAgICAgICBcCisgICAgICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0xNl9JQzFfQ09NUDYpICAgICAgXAorICAgICAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMTZfT0NDTFJfQ09NUDYpICAgIFwKKyAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorI2VsaWYgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkKKyNkZWZpbmUgSVNfTExfQ09NUF9PVVRQVVRfU0VMRUNUSU9OKF9fQ09NUF9JTlNUQU5DRV9fLCBfX09VVFBVVF9TRUxFQ1RJT05fXykgICAgICAgICAgICAgICAgICAgICBcCisgICgoICAgICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX05PTkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0xX0JLSU4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMV9CS0lOMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTFfVElNOF9CS0lOMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKDFVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoKCgoX19DT01QX0lOU1RBTkNFX18pID09IENPTVAxKSB8fCAoKF9fQ09NUF9JTlNUQU5DRV9fKSA9PSBDT01QMikpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMV9PQ0NMUl9DT01QMV8yXzNfNykgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTJfT0NDTFJfQ09NUDFfMl8zKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0zX09DQ0xSX0NPTVAxXzJfNF81KSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMV9JQzFfQ09NUDFfMikgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTJfSUM0X0NPTVAxXzIpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0zX0lDMV9DT01QMV8yKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICgoKF9fQ09NUF9JTlNUQU5DRV9fKSA9PSBDT01QMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgID8gKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0xX09DQ0xSX0NPTVAxXzJfM183KSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMl9PQ0NMUl9DT01QMV8yXzMpICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTNfSUMyX0NPTVAzKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU00X0lDMV9DT01QMykgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMTVfSUMxX0NPTVAzKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTE1X0JLSU4pICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKCgoX19DT01QX0lOU1RBTkNFX18pID09IENPTVA0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgPyAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTNfT0NDTFJfQ09NUDFfMl80XzUpICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0zX0lDM19DT01QNCkgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNNF9JQzJfQ09NUDQpICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTE1X0lDMl9DT01QNCkgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0xNV9PQ0NMUl9DT01QNCkgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICgoKF9fQ09NUF9JTlNUQU5DRV9fKSA9PSBDT01QNSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgID8gKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0zX09DQ0xSX0NPTVAxXzJfNF81KSAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNOF9PQ0NMUl9DT01QNF81XzZfNykgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTJfSUMxX0NPTVA1KSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU00X0lDM19DT01QNSkgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMTdfSUMxX0NPTVA1KSAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTE2X0JLSU4pICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKCgoX19DT01QX0lOU1RBTkNFX18pID09IENPTVA2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgPyAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTThfT0NDTFJfQ09NUDRfNV82XzcpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0yX0lDMl9DT01QNikgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMl9PQ0NMUl9DT01QNikgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTRfSUM0X0NPTVA2KSAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0xNl9JQzFfQ09NUDYpICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMTZfT0NDTFJfQ09NUDYpICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTFfT0NDTFJfQ09NUDFfMl8zXzcpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU04X09DQ0xSX0NPTVA0XzVfNl83KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMV9JQzJfQ09NUDcpICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTJfSUMzX0NPTVA3KSAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0xN19PQ0NMUl9DT01QNykgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMTdfQktJTikgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorI2VsaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkKKyNkZWZpbmUgSVNfTExfQ09NUF9PVVRQVVRfU0VMRUNUSU9OKF9fQ09NUF9JTlNUQU5DRV9fLCBfX09VVFBVVF9TRUxFQ1RJT05fXykgICAgICAgICAgICAgICAgICAgICBcCisgICgoICAgICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX05PTkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0xX0JLSU4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMV9CS0lOMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTFfVElNOF9CS0lOMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0yMF9CS0lOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMjBfQktJTjIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTFfVElNOF9USU0yMF9CS0lOMikgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKDFVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoKCgoX19DT01QX0lOU1RBTkNFX18pID09IENPTVAxKSB8fCAoKF9fQ09NUF9JTlNUQU5DRV9fKSA9PSBDT01QMikpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMV9PQ0NMUl9DT01QMV8yXzNfNykgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTJfT0NDTFJfQ09NUDFfMl8zKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0zX09DQ0xSX0NPTVAxXzJfNF81KSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMV9JQzFfQ09NUDFfMikgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTJfSUM0X0NPTVAxXzIpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0zX0lDMV9DT01QMV8yKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgfHwgKCgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTIwX09DQ0xSX0NPTVAyKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAmJiAoKF9fQ09NUF9JTlNUQU5DRV9fKSA9PSBDT01QMikgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKCgoX19DT01QX0lOU1RBTkNFX18pID09IENPTVAzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgPyAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTFfT0NDTFJfQ09NUDFfMl8zXzcpICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0yX09DQ0xSX0NPTVAxXzJfMykgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNM19JQzJfQ09NUDMpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTRfSUMxX0NPTVAzKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0xNV9JQzFfQ09NUDMpICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMTVfQktJTikgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoKChfX0NPTVBfSU5TVEFOQ0VfXykgPT0gQ09NUDQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNM19PQ0NMUl9DT01QMV8yXzRfNSkgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTNfSUMzX0NPTVA0KSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU00X0lDMl9DT01QNCkgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMTVfSUMyX0NPTVA0KSAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTE1X09DQ0xSX0NPTVA0KSAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgKCgoX19DT01QX0lOU1RBTkNFX18pID09IENPTVA1KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgPyAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTNfT0NDTFJfQ09NUDFfMl80XzUpICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU04X09DQ0xSX0NPTVA0XzVfNl83KSAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMl9JQzFfQ09NUDUpICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTRfSUMzX0NPTVA1KSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0xN19JQzFfQ09NUDUpICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMTZfQktJTikgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAoKChfX0NPTVBfSU5TVEFOQ0VfXykgPT0gQ09NUDYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNOF9PQ0NMUl9DT01QNF81XzZfNykgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTJfSUMyX0NPTVA2KSAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0yX09DQ0xSX0NPTVA2KSAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNNF9JQzRfQ09NUDYpICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTE2X0lDMV9DT01QNikgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0xNl9PQ0NMUl9DT01QNikgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMV9PQ0NMUl9DT01QMV8yXzNfNykgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTThfT0NDTFJfQ09NUDRfNV82XzcpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0xX0lDMl9DT01QNykgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMl9JQzNfQ09NUDcpICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTE3X09DQ0xSX0NPTVA3KSAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0xN19CS0lOKSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisjZW5kaWYKKworI2RlZmluZSBJU19MTF9DT01QX09VVFBVVF9QT0xBUklUWShfX1BPTEFSSVRZX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCAgICgoX19QT0xBUklUWV9fKSA9PSBMTF9DT01QX09VVFBVVFBPTF9OT05JTlZFUlRFRCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUE9MQVJJVFlfXykgPT0gTExfQ09NUF9PVVRQVVRQT0xfSU5WRVJURUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKyNpZiBkZWZpbmVkKENPTVBfQ1NSX0NPTVB4QkxBTktJTkcpCisjaWYgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkgfHwgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkKKyNkZWZpbmUgSVNfTExfQ09NUF9PVVRQVVRfQkxBTktJTkdfU09VUkNFKF9fQ09NUF9JTlNUQU5DRV9fLCBfX09VVFBVVF9CTEFOS0lOR19TT1VSQ0VfXykgICAgICAgXAorICAoKChfX09VVFBVVF9CTEFOS0lOR19TT1VSQ0VfXykgPT0gTExfQ09NUF9CTEFOS0lOR1NSQ19OT05FKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgPyAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAoMVUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICgoKF9fQ09NUF9JTlNUQU5DRV9fKSA9PSBDT01QMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICgoX19PVVRQVVRfQkxBTktJTkdfU09VUkNFX18pID09IExMX0NPTVBfQkxBTktJTkdTUkNfVElNMV9PQzVfQ09NUDIpICAgICAgICAgICAgIFwKKyAgICAgICAgICAgfHwgKChfX09VVFBVVF9CTEFOS0lOR19TT1VSQ0VfXykgPT0gTExfQ09NUF9CTEFOS0lOR1NSQ19USU0yX09DM19DT01QMikgICAgICAgICAgICAgXAorICAgICAgICAgICB8fCAoKF9fT1VUUFVUX0JMQU5LSU5HX1NPVVJDRV9fKSA9PSBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTNfT0MzX0NPTVAyKSAgICAgICAgICAgICBcCisgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICgoKF9fQ09NUF9JTlNUQU5DRV9fKSA9PSBDT01QNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICgoX19PVVRQVVRfQkxBTktJTkdfU09VUkNFX18pID09IExMX0NPTVBfQkxBTktJTkdTUkNfVElNM19PQzRfQ09NUDQpICAgICAgICAgXAorICAgICAgICAgICAgICAgfHwgKChfX09VVFBVVF9CTEFOS0lOR19TT1VSQ0VfXykgPT0gTExfQ09NUF9CTEFOS0lOR1NSQ19USU0xNV9PQzFfQ09NUDQpICAgICAgICBcCisgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKCgoX19DT01QX0lOU1RBTkNFX18pID09IENPTVA2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgID8gKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKChfX09VVFBVVF9CTEFOS0lOR19TT1VSQ0VfXykgPT0gTExfQ09NUF9CTEFOS0lOR1NSQ19USU0yX09DNF9DT01QNikgICBcCisgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fT1VUUFVUX0JMQU5LSU5HX1NPVVJDRV9fKSA9PSBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTE1X09DMl9DT01QNikgIFwKKyAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICgwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorI2VsaWYgZGVmaW5lZChTVE0zMkYzMDJ4RSkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4QykKKyNkZWZpbmUgSVNfTExfQ09NUF9PVVRQVVRfQkxBTktJTkdfU09VUkNFKF9fQ09NUF9JTlNUQU5DRV9fLCBfX09VVFBVVF9CTEFOS0lOR19TT1VSQ0VfXykgICAgICAgXAorICAoKChfX09VVFBVVF9CTEFOS0lOR19TT1VSQ0VfXykgPT0gTExfQ09NUF9CTEFOS0lOR1NSQ19OT05FKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgPyAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAoMVUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICgoKChfX0NPTVBfSU5TVEFOQ0VfXykgPT0gQ09NUDEpIHx8ICgoX19DT01QX0lOU1RBTkNFX18pID09IENPTVAyKSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICgoX19PVVRQVVRfQkxBTktJTkdfU09VUkNFX18pID09IExMX0NPTVBfQkxBTktJTkdTUkNfVElNMV9PQzVfQ09NUDFfMikgICAgICAgICAgIFwKKyAgICAgICAgICAgfHwgKChfX09VVFBVVF9CTEFOS0lOR19TT1VSQ0VfXykgPT0gTExfQ09NUF9CTEFOS0lOR1NSQ19USU0yX09DM19DT01QMV8yKSAgICAgICAgICAgXAorICAgICAgICAgICB8fCAoKF9fT1VUUFVUX0JMQU5LSU5HX1NPVVJDRV9fKSA9PSBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTNfT0MzX0NPTVAxXzIpICAgICAgICAgICBcCisgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICgoKF9fQ09NUF9JTlNUQU5DRV9fKSA9PSBDT01QNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICgoX19PVVRQVVRfQkxBTktJTkdfU09VUkNFX18pID09IExMX0NPTVBfQkxBTktJTkdTUkNfVElNM19PQzRfQ09NUDQpICAgICAgICAgXAorICAgICAgICAgICAgICAgfHwgKChfX09VVFBVVF9CTEFOS0lOR19TT1VSQ0VfXykgPT0gTExfQ09NUF9CTEFOS0lOR1NSQ19USU0xNV9PQzFfQ09NUDQpICAgICAgICBcCisgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKCgoX19DT01QX0lOU1RBTkNFX18pID09IENPTVA2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgID8gKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKChfX09VVFBVVF9CTEFOS0lOR19TT1VSQ0VfXykgPT0gTExfQ09NUF9CTEFOS0lOR1NSQ19USU0yX09DNF9DT01QNikgICBcCisgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fT1VUUFVUX0JMQU5LSU5HX1NPVVJDRV9fKSA9PSBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTE1X09DMl9DT01QNikgIFwKKyAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICgwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorI2VsaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkKKyNkZWZpbmUgSVNfTExfQ09NUF9PVVRQVVRfQkxBTktJTkdfU09VUkNFKF9fQ09NUF9JTlNUQU5DRV9fLCBfX09VVFBVVF9CTEFOS0lOR19TT1VSQ0VfXykgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19PVVRQVVRfQkxBTktJTkdfU09VUkNFX18pID09IExMX0NPTVBfQkxBTktJTkdTUkNfTk9ORSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAoMVUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICgoKChfX0NPTVBfSU5TVEFOQ0VfXykgPT0gQ09NUDEpIHx8ICgoX19DT01QX0lOU1RBTkNFX18pID09IENPTVAyKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgPyAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKChfX09VVFBVVF9CTEFOS0lOR19TT1VSQ0VfXykgPT0gTExfQ09NUF9CTEFOS0lOR1NSQ19USU0xX09DNV9DT01QMV8yXzcpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgfHwgKChfX09VVFBVVF9CTEFOS0lOR19TT1VSQ0VfXykgPT0gTExfQ09NUF9CTEFOS0lOR1NSQ19USU0yX09DM19DT01QMV8yKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgfHwgKChfX09VVFBVVF9CTEFOS0lOR19TT1VSQ0VfXykgPT0gTExfQ09NUF9CTEFOS0lOR1NSQ19USU0zX09DM19DT01QMV8yKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoKChfX0NPTVBfSU5TVEFOQ0VfXykgPT0gQ09NUDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgID8gKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICgoX19PVVRQVVRfQkxBTktJTkdfU09VUkNFX18pID09IExMX0NPTVBfQkxBTktJTkdTUkNfVElNMl9PQzRfQ09NUDNfNikgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKCgoX19DT01QX0lOU1RBTkNFX18pID09IENPTVA0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAoKF9fT1VUUFVUX0JMQU5LSU5HX1NPVVJDRV9fKSA9PSBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTThfT0M1X0NPTVA0XzVfNl83KSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICB8fCAoKF9fT1VUUFVUX0JMQU5LSU5HX1NPVVJDRV9fKSA9PSBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTNfT0M0X0NPTVA0KSAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICB8fCAoKF9fT1VUUFVUX0JMQU5LSU5HX1NPVVJDRV9fKSA9PSBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTE1X09DMV9DT01QNCkgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICgoKF9fQ09NUF9JTlNUQU5DRV9fKSA9PSBDT01QNSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgPyAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX09VVFBVVF9CTEFOS0lOR19TT1VSQ0VfXykgPT0gTExfQ09NUF9CTEFOS0lOR1NSQ19USU04X09DNV9DT01QNF81XzZfNykgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAoKChfX0NPTVBfSU5TVEFOQ0VfXykgPT0gQ09NUDYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgID8gKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19PVVRQVVRfQkxBTktJTkdfU09VUkNFX18pID09IExMX0NPTVBfQkxBTktJTkdTUkNfVElNOF9PQzVfQ09NUDRfNV82XzcpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19PVVRQVVRfQkxBTktJTkdfU09VUkNFX18pID09IExMX0NPTVBfQkxBTktJTkdTUkNfVElNMl9PQzRfQ09NUDNfNikgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19PVVRQVVRfQkxBTktJTkdfU09VUkNFX18pID09IExMX0NPTVBfQkxBTktJTkdTUkNfVElNMTVfT0MyX0NPTVA2XzcpICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19PVVRQVVRfQkxBTktJTkdfU09VUkNFX18pID09IExMX0NPTVBfQkxBTktJTkdTUkNfVElNOF9PQzVfQ09NUDRfNV82XzcpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19PVVRQVVRfQkxBTktJTkdfU09VUkNFX18pID09IExMX0NPTVBfQkxBTktJTkdTUkNfVElNMV9PQzVfQ09NUDFfMl83KSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19PVVRQVVRfQkxBTktJTkdfU09VUkNFX18pID09IExMX0NPTVBfQkxBTktJTkdTUkNfVElNMTVfT0MyX0NPTVA2XzcpICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorI2VuZGlmCisjZWxzZQorI2RlZmluZSBJU19MTF9DT01QX09VVFBVVF9CTEFOS0lOR19TT1VSQ0UoX19DT01QX0lOU1RBTkNFX18sIF9fT1VUUFVUX0JMQU5LSU5HX1NPVVJDRV9fKSBcCisgICgoX19PVVRQVVRfQkxBTktJTkdfU09VUkNFX18pID09IExMX0NPTVBfQkxBTktJTkdTUkNfTk9ORSkKKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIENPTVBfTExfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIENPTVBfTExfRUZfSW5pdAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRGUtaW5pdGlhbGl6ZSByZWdpc3RlcnMgb2YgdGhlIHNlbGVjdGVkIENPTVAgaW5zdGFuY2UKKyAgKiAgICAgICAgIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLgorICAqIEBub3RlICAgSWYgY29tcGFyYXRvciBpcyBsb2NrZWQsIGRlLWluaXRpYWxpemF0aW9uIGJ5IHNvZnR3YXJlIGlzCisgICogICAgICAgICBub3QgcG9zc2libGUuCisgICogICAgICAgICBUaGUgb25seSB3YXkgdG8gdW5sb2NrIHRoZSBjb21wYXJhdG9yIGlzIGEgZGV2aWNlIGhhcmR3YXJlIHJlc2V0LgorICAqIEBwYXJhbSAgQ09NUHggQ09NUCBpbnN0YW5jZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBDT01QIHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBDT01QIHJlZ2lzdGVycyBhcmUgbm90IGRlLWluaXRpYWxpemVkCisgICovCitFcnJvclN0YXR1cyBMTF9DT01QX0RlSW5pdChDT01QX1R5cGVEZWYgKkNPTVB4KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19DT01QX0FMTF9JTlNUQU5DRShDT01QeCkpOworCisgIC8qIE5vdGU6IEhhcmR3YXJlIGNvbnN0cmFpbnQgKHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHRoaXMgZnVuY3Rpb24pOiAgICAgICAqLworICAvKiAgICAgICBDT01QIGluc3RhbmNlIG11c3Qgbm90IGJlIGxvY2tlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYgKExMX0NPTVBfSXNMb2NrZWQoQ09NUHgpID09IDBVKQorICB7CisgICAgTExfQ09NUF9Xcml0ZVJlZyhDT01QeCwgQ1NSLCAweDAwMDAwMDAwVSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ29tcGFyYXRvciBpbnN0YW5jZSBpcyBsb2NrZWQ6IGRlLWluaXRpYWxpemF0aW9uIGJ5IHNvZnR3YXJlIGlzICAgICAgICAgKi8KKyAgICAvKiBub3QgcG9zc2libGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIFRoZSBvbmx5IHdheSB0byB1bmxvY2sgdGhlIGNvbXBhcmF0b3IgaXMgYSBkZXZpY2UgaGFyZHdhcmUgcmVzZXQuICAgICAgICovCisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgc29tZSBmZWF0dXJlcyBvZiBDT01QIGluc3RhbmNlLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIGZlYXR1cmVzIG9mIHRoZSBzZWxlY3RlZCBDT01QIGluc3RhbmNlLgorICAqICAgICAgICAgU29tZSBmZWF0dXJlcyBhcmUgYWxzbyBhdmFpbGFibGUgYXQgc2NvcGUgQ09NUCBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIChjb21tb24gdG8gc2V2ZXJhbCBDT01QIGluc3RhbmNlcykuCisgICogICAgICAgICBSZWZlciB0byBmdW5jdGlvbnMgaGF2aW5nIGFyZ3VtZW50ICJDT01QeHlfQ09NTU9OIiBhcyBwYXJhbWV0ZXIuCisgICogQHBhcmFtICBDT01QeCBDT01QIGluc3RhbmNlCisgICogQHBhcmFtICBDT01QX0luaXRTdHJ1Y3QgUG9pbnRlciB0byBhIEByZWYgTExfQ09NUF9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogQ09NUCByZWdpc3RlcnMgYXJlIGluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogQ09NUCByZWdpc3RlcnMgYXJlIG5vdCBpbml0aWFsaXplZAorICAqLworRXJyb3JTdGF0dXMgTExfQ09NUF9Jbml0KENPTVBfVHlwZURlZiAqQ09NUHgsIExMX0NPTVBfSW5pdFR5cGVEZWYgKkNPTVBfSW5pdFN0cnVjdCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gU1VDQ0VTUzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQ09NUF9BTExfSU5TVEFOQ0UoQ09NUHgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0NPTVBfUE9XRVJfTU9ERShDT01QX0luaXRTdHJ1Y3QtPlBvd2VyTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfQ09NUF9JTlBVVF9QTFVTKENPTVB4LCBDT01QX0luaXRTdHJ1Y3QtPklucHV0UGx1cykpOworICBhc3NlcnRfcGFyYW0oSVNfTExfQ09NUF9JTlBVVF9NSU5VUyhDT01QeCwgQ09NUF9Jbml0U3RydWN0LT5JbnB1dE1pbnVzKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9DT01QX0lOUFVUX0hZU1RFUkVTSVMoQ09NUF9Jbml0U3RydWN0LT5JbnB1dEh5c3RlcmVzaXMpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0NPTVBfT1VUUFVUX1NFTEVDVElPTihDT01QeCwgQ09NUF9Jbml0U3RydWN0LT5PdXRwdXRTZWxlY3Rpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0NPTVBfT1VUUFVUX1BPTEFSSVRZKENPTVBfSW5pdFN0cnVjdC0+T3V0cHV0UG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0NPTVBfT1VUUFVUX0JMQU5LSU5HX1NPVVJDRShDT01QeCwgQ09NUF9Jbml0U3RydWN0LT5PdXRwdXRCbGFua2luZ1NvdXJjZSkpOworCisgIC8qIE5vdGU6IEhhcmR3YXJlIGNvbnN0cmFpbnQgKHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHRoaXMgZnVuY3Rpb24pICAgICAgICAqLworICAvKiAgICAgICBDT01QIGluc3RhbmNlIG11c3Qgbm90IGJlIGxvY2tlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYgKExMX0NPTVBfSXNMb2NrZWQoQ09NUHgpID09IDBVKQorICB7CisgICAgLyogQ29uZmlndXJhdGlvbiBvZiBjb21wYXJhdG9yIGluc3RhbmNlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIFBvd2VyTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBJbnB1dFBsdXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gSW5wdXRNaW51cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIElucHV0SHlzdGVyZXNpcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBPdXRwdXRTZWxlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gT3V0cHV0UG9sYXJpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIE91dHB1dEJsYW5raW5nU291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBNT0RJRllfUkVHKENPTVB4LT5DU1IsCisgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisjaWYgZGVmaW5lZChDT01QX0NTUl9DT01QeE1PREUpCisgICAgICAgICAgICAgICB8IENPTVBfQ1NSX0NPTVB4TU9ERQorI2VuZGlmCisjaWYgZGVmaW5lZChDT01QX0NTUl9DT01QeE5PTklOU0VMKQorICAgICAgICAgICAgICAgfCBDT01QX0NTUl9DT01QeE5PTklOU0VMCisjZW5kaWYKKyAgICAgICAgICAgICAgIHwgQ09NUF9DU1JfQ09NUHhJTlNFTAorI2lmIGRlZmluZWQoQ09NUF9DU1JfQ09NUHhIWVNUKQorICAgICAgICAgICAgICAgfCBDT01QX0NTUl9DT01QeEhZU1QKKyNlbmRpZgorICAgICAgICAgICAgICAgfCBDT01QX0NTUl9DT01QeE9VVFNFTAorICAgICAgICAgICAgICAgfCBDT01QX0NTUl9DT01QeFBPTAorICAgICAgICAgICAgICAgfCBDT01QX0NTUl9DT01QeEJMQU5LSU5HCisgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNpZiBkZWZpbmVkKENPTVBfQ1NSX0NPTVB4TU9ERSkKKyAgICAgICAgICAgICAgIHwgQ09NUF9Jbml0U3RydWN0LT5Qb3dlck1vZGUKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09NUF9DU1JfQ09NUHhOT05JTlNFTCkKKyAgICAgICAgICAgICAgIHwgQ09NUF9Jbml0U3RydWN0LT5JbnB1dFBsdXMKKyNlbmRpZgorICAgICAgICAgICAgICAgfCBDT01QX0luaXRTdHJ1Y3QtPklucHV0TWludXMKKyNpZiBkZWZpbmVkKENPTVBfQ1NSX0NPTVB4SFlTVCkKKyAgICAgICAgICAgICAgIHwgQ09NUF9Jbml0U3RydWN0LT5JbnB1dEh5c3RlcmVzaXMKKyNlbmRpZgorICAgICAgICAgICAgICAgfCBDT01QX0luaXRTdHJ1Y3QtPk91dHB1dFNlbGVjdGlvbgorICAgICAgICAgICAgICAgfCBDT01QX0luaXRTdHJ1Y3QtPk91dHB1dFBvbGFyaXR5CisgICAgICAgICAgICAgICB8IENPTVBfSW5pdFN0cnVjdC0+T3V0cHV0QmxhbmtpbmdTb3VyY2UKKyAgICAgICAgICAgICAgKTsKKworICB9CisgIGVsc2UKKyAgeworICAgIC8qIEluaXRpYWxpemF0aW9uIGVycm9yOiBDT01QIGluc3RhbmNlIGlzIGxvY2tlZC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBzdGF0dXMgPSBFUlJPUjsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiBTZXQgZWFjaCBAcmVmIExMX0NPTVBfSW5pdFR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZS4KKyAgKiBAcGFyYW0gQ09NUF9Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX0NPTVBfSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogICAgICAgICAgICAgICAgICAgICAgICAgd2hvc2UgZmllbGRzIHdpbGwgYmUgc2V0IHRvIGRlZmF1bHQgdmFsdWVzLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9DT01QX1N0cnVjdEluaXQoTExfQ09NUF9Jbml0VHlwZURlZiAqQ09NUF9Jbml0U3RydWN0KQoreworICAvKiBTZXQgQ09NUF9Jbml0U3RydWN0IGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICAvKiBOb3RlOiBDb21wYXJhdG9yIHBvd2VyIG1vZGUgImhpZ2ggc3BlZWQiIGlzIHRoZSBvbmx5IG1vZGUgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgYXZhaWxhYmxlIG9uIGFsbCBTVE1GMyBkZXZpY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIENPTVBfSW5pdFN0cnVjdC0+UG93ZXJNb2RlICAgICAgICAgICAgPSBMTF9DT01QX1BPV0VSTU9ERV9ISUdIU1BFRUQ7CisgIENPTVBfSW5pdFN0cnVjdC0+SW5wdXRQbHVzICAgICAgICAgICAgPSBMTF9DT01QX0lOUFVUX1BMVVNfSU8xOworICBDT01QX0luaXRTdHJ1Y3QtPklucHV0TWludXMgICAgICAgICAgID0gTExfQ09NUF9JTlBVVF9NSU5VU19WUkVGSU5UOworICBDT01QX0luaXRTdHJ1Y3QtPklucHV0SHlzdGVyZXNpcyAgICAgID0gTExfQ09NUF9IWVNURVJFU0lTX05PTkU7CisgIENPTVBfSW5pdFN0cnVjdC0+T3V0cHV0U2VsZWN0aW9uICAgICAgPSBMTF9DT01QX09VVFBVVF9OT05FOworICBDT01QX0luaXRTdHJ1Y3QtPk91dHB1dFBvbGFyaXR5ICAgICAgID0gTExfQ09NUF9PVVRQVVRQT0xfTk9OSU5WRVJURUQ7CisgIENPTVBfSW5pdFN0cnVjdC0+T3V0cHV0QmxhbmtpbmdTb3VyY2UgPSBMTF9DT01QX0JMQU5LSU5HU1JDX05PTkU7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBDT01QMSB8fCBDT01QMiB8fCBDT01QMyB8fCBDT01QNCB8fCBDT01QNSB8fCBDT01QNiB8fCBDT01QNyAqLworCisKKyNlbmRpZiAvKiBTVE0zMkYzMDF4OCB8fCBTVE0zMkYzMDJ4OCB8fCBTVE0zMkYzMDJ4QyB8fCBTVE0zMkYzMDJ4RSB8fCBTVE0zMkYzMDN4OCB8fCBTVE0zMkYzMDN4QyB8fCBTVE0zMkYzMDN4RSB8fCBTVE0zMkYzMTh4eCB8fCBTVE0zMkYzMjh4eCB8fCBTVE0zMkYzMzR4OCB8fCBTVE0zMkYzNTh4eCB8fCBTVE0zMkYzOTh4eCAqLworCisjaWYgZGVmaW5lZCAoQ09NUF9WMV8xXzBfMCkKKworI2lmIGRlZmluZWQgKENPTVAxKSB8fCBkZWZpbmVkIChDT01QMikKKworLyoqIEBhZGR0b2dyb3VwIENPTVBfTEwgQ09NUAorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAYWRkdG9ncm91cCBDT01QX0xMX1ByaXZhdGVfTWFjcm9zCisgICogQHsKKyAgKi8KKworLyogQ2hlY2sgb2YgcGFyYW1ldGVycyBmb3IgY29uZmlndXJhdGlvbiBvZiBDT01QIGhpZXJhcmNoaWNhbCBzY29wZTogICAgICAgICAgKi8KKy8qIENPTVAgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgSVNfTExfQ09NUF9QT1dFUl9NT0RFKF9fUE9XRVJfTU9ERV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fUE9XRVJfTU9ERV9fKSA9PSBMTF9DT01QX1BPV0VSTU9ERV9ISUdIU1BFRUQpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1BPV0VSX01PREVfXykgPT0gTExfQ09NUF9QT1dFUk1PREVfTUVESVVNU1BFRUQpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19QT1dFUl9NT0RFX18pID09IExMX0NPTVBfUE9XRVJNT0RFX0xPV1BPV0VSKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUE9XRVJfTU9ERV9fKSA9PSBMTF9DT01QX1BPV0VSTU9ERV9VTFRSQUxPV1BPV0VSKSAgICAgICAgICAgICAgICAgICAgXAorICApCisKKy8qIE5vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWUsIGNvbXBhcmF0b3IgaW5wdXQgcGx1cyBwYXJhbWV0ZXJzIGFyZSAgICAgICAgICAgICovCisvKiAgICAgICB0aGUgZGlmZmVyZW50IGRlcGVuZGluZyBvbiBDT01QIGluc3RhbmNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJU19MTF9DT01QX0lOUFVUX1BMVVMoX19DT01QX0lOU1RBTkNFX18sIF9fSU5QVVRfUExVU19fKSAgICAgICAgICAgICAgIFwKKyAgKCgoX19DT01QX0lOU1RBTkNFX18pID09IENPTVAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgPyAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICgoX19JTlBVVF9QTFVTX18pID09IExMX0NPTVBfSU5QVVRfUExVU19JTzEpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5QVVRfUExVU19fKSA9PSBMTF9DT01QX0lOUFVUX1BMVVNfREFDMV9DSDEpICAgICAgICAgICAgICAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKChfX0lOUFVUX1BMVVNfXykgPT0gTExfQ09NUF9JTlBVVF9QTFVTX0lPMSkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisvKiBOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllLCBjb21wYXJhdG9yIGlucHV0IG1pbnVzIHBhcmFtZXRlcnMgYXJlICAgICAgICAgICAqLworLyogICAgICAgdGhlIHNhbWUgb24gYWxsIENPTVAgaW5zdGFuY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIEhvd2V2ZXIsIGNvbXBhcmF0b3IgaW5zdGFuY2Uga2VwdCBhcyBtYWNybyBwYXJhbWV0ZXIgZm9yICAgICAgICAgICAgICovCisvKiAgICAgICBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgU1RNMzIgZmFtaWxpZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJU19MTF9DT01QX0lOUFVUX01JTlVTKF9fQ09NUF9JTlNUQU5DRV9fLCBfX0lOUFVUX01JTlVTX18pICAgICAgICAgICAgIFwKKyAgKCAgICgoX19JTlBVVF9NSU5VU19fKSA9PSBMTF9DT01QX0lOUFVUX01JTlVTXzFfNFZSRUZJTlQpICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfTUlOVVNfXykgPT0gTExfQ09NUF9JTlBVVF9NSU5VU18xXzJWUkVGSU5UKSAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX01JTlVTX18pID09IExMX0NPTVBfSU5QVVRfTUlOVVNfM180VlJFRklOVCkgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTlBVVF9NSU5VU19fKSA9PSBMTF9DT01QX0lOUFVUX01JTlVTX1ZSRUZJTlQpICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfTUlOVVNfXykgPT0gTExfQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX01JTlVTX18pID09IExMX0NPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDIpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTlBVVF9NSU5VU19fKSA9PSBMTF9DT01QX0lOUFVUX01JTlVTX0lPMSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfTUlOVVNfXykgPT0gTExfQ09NUF9JTlBVVF9NSU5VU19JTzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX01JTlVTX18pID09IExMX0NPTVBfSU5QVVRfTUlOVVNfSU8zKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTlBVVF9NSU5VU19fKSA9PSBMTF9DT01QX0lOUFVUX01JTlVTX0lPNCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfTUlOVVNfXykgPT0gTExfQ09NUF9JTlBVVF9NSU5VU19EQUMyX0NIMSkgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKyNkZWZpbmUgSVNfTExfQ09NUF9JTlBVVF9IWVNURVJFU0lTKF9fSU5QVVRfSFlTVEVSRVNJU19fKSAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fSU5QVVRfSFlTVEVSRVNJU19fKSA9PSBMTF9DT01QX0hZU1RFUkVTSVNfTk9ORSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX0hZU1RFUkVTSVNfXykgPT0gTExfQ09NUF9IWVNURVJFU0lTX0xPVykgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTlBVVF9IWVNURVJFU0lTX18pID09IExMX0NPTVBfSFlTVEVSRVNJU19NRURJVU0pICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfSFlTVEVSRVNJU19fKSA9PSBMTF9DT01QX0hZU1RFUkVTSVNfSElHSCkgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKy8qIE5vdGU6IE91dHB1dCByZWRpcmVjdGlvbiBpcyBzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlcyBidXQgaXMgY2hlY2tlZCAgICAgICovCisvKiAgICAgICB3aXRoIGxpdGVyYWxzIG9mIGluc3RhbmNlIENPTVAyIChubyBkaWZmZXJlbnRpYXRpb24gcG9zc2libGUgc2luY2UgICAqLworLyogICAgICAgbGl0ZXJhbHMgb2YgQ09NUDEgYW5kIENPTVAyIHNoYXJlIHRoZSBzYW1lIHZhbHVlcyByYW5nZSkuICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVNfTExfQ09NUF9PVVRQVVRfU0VMRUNUSU9OKF9fT1VUUFVUX1NFTEVDVElPTl9fKSAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9OT05FKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMTZfQktJTikgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTRfSUMxKSAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU00X09DQ0xSKSAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNMl9JQzQpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19PVVRQVVRfU0VMRUNUSU9OX18pID09IExMX0NPTVBfT1VUUFVUX1RJTTJfT0NDTFIpICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fT1VUUFVUX1NFTEVDVElPTl9fKSA9PSBMTF9DT01QX09VVFBVVF9USU0zX0lDMV9DT01QMikgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX09VVFBVVF9TRUxFQ1RJT05fXykgPT0gTExfQ09NUF9PVVRQVVRfVElNM19PQ0NMUl9DT01QMikgICAgICAgICAgICAgIFwKKyAgKQorCisjZGVmaW5lIElTX0xMX0NPTVBfT1VUUFVUX1BPTEFSSVRZKF9fUE9MQVJJVFlfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoICAgKChfX1BPTEFSSVRZX18pID09IExMX0NPTVBfT1VUUFVUUE9MX05PTklOVkVSVEVEKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19QT0xBUklUWV9fKSA9PSBMTF9DT01QX09VVFBVVFBPTF9JTlZFUlRFRCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIENPTVBfTExfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIENPTVBfTExfRUZfSW5pdAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRGUtaW5pdGlhbGl6ZSByZWdpc3RlcnMgb2YgdGhlIHNlbGVjdGVkIENPTVAgaW5zdGFuY2UKKyAgKiAgICAgICAgIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLgorICAqIEBub3RlICAgSWYgY29tcGFyYXRvciBpcyBsb2NrZWQsIGRlLWluaXRpYWxpemF0aW9uIGJ5IHNvZnR3YXJlIGlzCisgICogICAgICAgICBub3QgcG9zc2libGUuCisgICogICAgICAgICBUaGUgb25seSB3YXkgdG8gdW5sb2NrIHRoZSBjb21wYXJhdG9yIGlzIGEgZGV2aWNlIGhhcmR3YXJlIHJlc2V0LgorICAqIEBwYXJhbSAgQ09NUHggQ09NUCBpbnN0YW5jZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBDT01QIHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBDT01QIHJlZ2lzdGVycyBhcmUgbm90IGRlLWluaXRpYWxpemVkCisgICovCitFcnJvclN0YXR1cyBMTF9DT01QX0RlSW5pdChDT01QX1R5cGVEZWYgKkNPTVB4KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19DT01QX0FMTF9JTlNUQU5DRShDT01QeCkpOworCisgIC8qIE5vdGU6IEhhcmR3YXJlIGNvbnN0cmFpbnQgKHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHRoaXMgZnVuY3Rpb24pOiAgICAgICAqLworICAvKiAgICAgICBDT01QIGluc3RhbmNlIG11c3Qgbm90IGJlIGxvY2tlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYgKExMX0NPTVBfSXNMb2NrZWQoQ09NUHgpID09IDBVKQorICB7CisgICAgLyogTm90ZTogQ29ubmVjdGlvbiBzd2l0Y2ggaXMgYXBwbGljYWJsZSBvbmx5IHRvIENPTVAgaW5zdGFuY2UgQ09NUDEsICAgICAqLworICAgIC8qICAgICAgIHRoZXJlZm9yZSBpcyBDT01QMiBpcyBzZWxlY3RlZCB0aGUgZXF1aXZhbGVudCBiaXQgaXMgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICBrZXB0IHVubW9kaWZpZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKENPTVB4ID09IENPTVAxKQorICAgIHsKKyAgICAgIENMRUFSX0JJVChDT01QLT5DU1IsCisgICAgICAgICAgICAgICAgKCAgQ09NUF9DU1JfQ09NUDFNT0RFCisgICAgICAgICAgICAgICAgIHwgQ09NUF9DU1JfQ09NUDFJTlNFTAorICAgICAgICAgICAgICAgICB8IENPTVBfQ1NSX0NPTVAxU1cxCisgICAgICAgICAgICAgICAgIHwgQ09NUF9DU1JfQ09NUDFPVVRTRUwKKyAgICAgICAgICAgICAgICAgfCBDT01QX0NTUl9DT01QMUhZU1QKKyAgICAgICAgICAgICAgICAgfCBDT01QX0NTUl9DT01QMVBPTAorICAgICAgICAgICAgICAgICB8IENPTVBfQ1NSX0NPTVAxRU4KKyAgICAgICAgICAgICAgICApIDw8IF9fQ09NUF9CSVRPRkZTRVRfSU5TVEFOQ0UoQ09NUHgpCisgICAgICAgICAgICAgICApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgQ0xFQVJfQklUKENPTVAtPkNTUiwKKyAgICAgICAgICAgICAgICAoICBDT01QX0NTUl9DT01QMU1PREUKKyAgICAgICAgICAgICAgICAgfCBDT01QX0NTUl9DT01QMUlOU0VMCisgICAgICAgICAgICAgICAgIHwgQ09NUF9DU1JfQ09NUDFPVVRTRUwKKyAgICAgICAgICAgICAgICAgfCBDT01QX0NTUl9DT01QMUhZU1QKKyAgICAgICAgICAgICAgICAgfCBDT01QX0NTUl9DT01QMVBPTAorICAgICAgICAgICAgICAgICB8IENPTVBfQ1NSX0NPTVAxRU4KKyAgICAgICAgICAgICAgICApIDw8IF9fQ09NUF9CSVRPRkZTRVRfSU5TVEFOQ0UoQ09NUHgpCisgICAgICAgICAgICAgICApOworICAgIH0KKworICB9CisgIGVsc2UKKyAgeworICAgIC8qIENvbXBhcmF0b3IgaW5zdGFuY2UgaXMgbG9ja2VkOiBkZS1pbml0aWFsaXphdGlvbiBieSBzb2Z0d2FyZSBpcyAgICAgICAgICovCisgICAgLyogbm90IHBvc3NpYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBUaGUgb25seSB3YXkgdG8gdW5sb2NrIHRoZSBjb21wYXJhdG9yIGlzIGEgZGV2aWNlIGhhcmR3YXJlIHJlc2V0LiAgICAgICAqLworICAgIHN0YXR1cyA9IEVSUk9SOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHNvbWUgZmVhdHVyZXMgb2YgQ09NUCBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyBmZWF0dXJlcyBvZiB0aGUgc2VsZWN0ZWQgQ09NUCBpbnN0YW5jZS4KKyAgKiAgICAgICAgIFNvbWUgZmVhdHVyZXMgYXJlIGFsc28gYXZhaWxhYmxlIGF0IHNjb3BlIENPTVAgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY29tbW9uIHRvIHNldmVyYWwgQ09NUCBpbnN0YW5jZXMpLgorICAqICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb25zIGhhdmluZyBhcmd1bWVudCAiQ09NUHh5X0NPTU1PTiIgYXMgcGFyYW1ldGVyLgorICAqIEBwYXJhbSAgQ09NUHggQ09NUCBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ09NUF9Jbml0U3RydWN0IFBvaW50ZXIgdG8gYSBAcmVmIExMX0NPTVBfSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IENPTVAgcmVnaXN0ZXJzIGFyZSBpbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IENPTVAgcmVnaXN0ZXJzIGFyZSBub3QgaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0NPTVBfSW5pdChDT01QX1R5cGVEZWYgKkNPTVB4LCBMTF9DT01QX0luaXRUeXBlRGVmICpDT01QX0luaXRTdHJ1Y3QpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0NPTVBfQUxMX0lOU1RBTkNFKENPTVB4KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9DT01QX1BPV0VSX01PREUoQ09NUF9Jbml0U3RydWN0LT5Qb3dlck1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0NPTVBfSU5QVVRfUExVUyhDT01QeCwgQ09NUF9Jbml0U3RydWN0LT5JbnB1dFBsdXMpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0NPTVBfSU5QVVRfTUlOVVMoQ09NUHgsIENPTVBfSW5pdFN0cnVjdC0+SW5wdXRNaW51cykpOworICBhc3NlcnRfcGFyYW0oSVNfTExfQ09NUF9JTlBVVF9IWVNURVJFU0lTKENPTVBfSW5pdFN0cnVjdC0+SW5wdXRIeXN0ZXJlc2lzKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9DT01QX09VVFBVVF9TRUxFQ1RJT04oQ09NUF9Jbml0U3RydWN0LT5PdXRwdXRTZWxlY3Rpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0NPTVBfT1VUUFVUX1BPTEFSSVRZKENPTVBfSW5pdFN0cnVjdC0+T3V0cHV0UG9sYXJpdHkpKTsKKworICAvKiBOb3RlOiBIYXJkd2FyZSBjb25zdHJhaW50IChyZWZlciB0byBkZXNjcmlwdGlvbiBvZiB0aGlzIGZ1bmN0aW9uKSAgICAgICAgKi8KKyAgLyogICAgICAgQ09NUCBpbnN0YW5jZSBtdXN0IG5vdCBiZSBsb2NrZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmIChMTF9DT01QX0lzTG9ja2VkKENPTVB4KSA9PSAwVSkKKyAgeworICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgY29tcGFyYXRvciBpbnN0YW5jZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBQb3dlck1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gSW5wdXRQbHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIElucHV0TWludXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBJbnB1dEh5c3RlcmVzaXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gT3V0cHV0U2VsZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIE91dHB1dFBvbGFyaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBOb3RlOiBDb25uZWN0aW9uIHN3aXRjaCBpcyBhcHBsaWNhYmxlIG9ubHkgdG8gQ09NUCBpbnN0YW5jZSBDT01QMSwgICAgICovCisgICAgLyogICAgICAgdGhlcmVmb3JlIGlzIENPTVAyIGlzIHNlbGVjdGVkIHRoZSBlcXVpdmFsZW50IGJpdCBpcyAgICAgICAgICAgICAqLworICAgIC8qICAgICAgIGtlcHQgdW5tb2RpZmllZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoQ09NUHggPT0gQ09NUDEpCisgICAgeworICAgICAgTU9ESUZZX1JFRyhDT01QLT5DU1IsCisgICAgICAgICAgICAgICAgICggIENPTVBfQ1NSX0NPTVAxTU9ERQorICAgICAgICAgICAgICAgICAgfCBDT01QX0NTUl9DT01QMUlOU0VMCisgICAgICAgICAgICAgICAgICB8IENPTVBfQ1NSX0NPTVAxU1cxCisgICAgICAgICAgICAgICAgICB8IENPTVBfQ1NSX0NPTVAxT1VUU0VMCisgICAgICAgICAgICAgICAgICB8IENPTVBfQ1NSX0NPTVAxSFlTVAorICAgICAgICAgICAgICAgICAgfCBDT01QX0NTUl9DT01QMVBPTAorICAgICAgICAgICAgICAgICApIDw8IF9fQ09NUF9CSVRPRkZTRVRfSU5TVEFOQ0UoQ09NUHgpCisgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAoICBDT01QX0luaXRTdHJ1Y3QtPlBvd2VyTW9kZQorICAgICAgICAgICAgICAgICAgfCBDT01QX0luaXRTdHJ1Y3QtPklucHV0UGx1cworICAgICAgICAgICAgICAgICAgfCBDT01QX0luaXRTdHJ1Y3QtPklucHV0TWludXMKKyAgICAgICAgICAgICAgICAgIHwgQ09NUF9Jbml0U3RydWN0LT5JbnB1dEh5c3RlcmVzaXMKKyAgICAgICAgICAgICAgICAgIHwgQ09NUF9Jbml0U3RydWN0LT5PdXRwdXRTZWxlY3Rpb24KKyAgICAgICAgICAgICAgICAgIHwgQ09NUF9Jbml0U3RydWN0LT5PdXRwdXRQb2xhcml0eQorICAgICAgICAgICAgICAgICApIDw8IF9fQ09NUF9CSVRPRkZTRVRfSU5TVEFOQ0UoQ09NUHgpCisgICAgICAgICAgICAgICAgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIE1PRElGWV9SRUcoQ09NUC0+Q1NSLAorICAgICAgICAgICAgICAgICAoICBDT01QX0NTUl9DT01QMU1PREUKKyAgICAgICAgICAgICAgICAgIHwgQ09NUF9DU1JfQ09NUDFJTlNFTAorICAgICAgICAgICAgICAgICAgfCBDT01QX0NTUl9DT01QMU9VVFNFTAorICAgICAgICAgICAgICAgICAgfCBDT01QX0NTUl9DT01QMUhZU1QKKyAgICAgICAgICAgICAgICAgIHwgQ09NUF9DU1JfQ09NUDFQT0wKKyAgICAgICAgICAgICAgICAgKSA8PCBfX0NPTVBfQklUT0ZGU0VUX0lOU1RBTkNFKENPTVB4KQorICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgKCAgQ09NUF9Jbml0U3RydWN0LT5Qb3dlck1vZGUKKyAgICAgICAgICAgICAgICAgIHwgQ09NUF9Jbml0U3RydWN0LT5JbnB1dFBsdXMKKyAgICAgICAgICAgICAgICAgIHwgQ09NUF9Jbml0U3RydWN0LT5JbnB1dE1pbnVzCisgICAgICAgICAgICAgICAgICB8IENPTVBfSW5pdFN0cnVjdC0+SW5wdXRIeXN0ZXJlc2lzCisgICAgICAgICAgICAgICAgICB8IENPTVBfSW5pdFN0cnVjdC0+T3V0cHV0U2VsZWN0aW9uCisgICAgICAgICAgICAgICAgICB8IENPTVBfSW5pdFN0cnVjdC0+T3V0cHV0UG9sYXJpdHkKKyAgICAgICAgICAgICAgICAgKSA8PCBfX0NPTVBfQklUT0ZGU0VUX0lOU1RBTkNFKENPTVB4KQorICAgICAgICAgICAgICAgICk7CisgICAgfQorCisgIH0KKyAgZWxzZQorICB7CisgICAgLyogSW5pdGlhbGl6YXRpb24gZXJyb3I6IENPTVAgaW5zdGFuY2UgaXMgbG9ja2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHN0YXR1cyA9IEVSUk9SOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmIFNldCBlYWNoIEByZWYgTExfQ09NUF9Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSBDT01QX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfQ09NUF9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICB3aG9zZSBmaWVsZHMgd2lsbCBiZSBzZXQgdG8gZGVmYXVsdCB2YWx1ZXMuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX0NPTVBfU3RydWN0SW5pdChMTF9DT01QX0luaXRUeXBlRGVmICpDT01QX0luaXRTdHJ1Y3QpCit7CisgIC8qIFNldCBDT01QX0luaXRTdHJ1Y3QgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzICovCisgIENPTVBfSW5pdFN0cnVjdC0+UG93ZXJNb2RlICAgICAgICAgICAgPSBMTF9DT01QX1BPV0VSTU9ERV9VTFRSQUxPV1BPV0VSOworICBDT01QX0luaXRTdHJ1Y3QtPklucHV0UGx1cyAgICAgICAgICAgID0gTExfQ09NUF9JTlBVVF9QTFVTX0lPMTsKKyAgQ09NUF9Jbml0U3RydWN0LT5JbnB1dE1pbnVzICAgICAgICAgICA9IExMX0NPTVBfSU5QVVRfTUlOVVNfVlJFRklOVDsKKyAgQ09NUF9Jbml0U3RydWN0LT5JbnB1dEh5c3RlcmVzaXMgICAgICA9IExMX0NPTVBfSFlTVEVSRVNJU19OT05FOworICBDT01QX0luaXRTdHJ1Y3QtPk91dHB1dFNlbGVjdGlvbiAgICAgID0gTExfQ09NUF9PVVRQVVRfTk9ORTsKKyAgQ09NUF9Jbml0U3RydWN0LT5PdXRwdXRQb2xhcml0eSAgICAgICA9IExMX0NPTVBfT1VUUFVUUE9MX05PTklOVkVSVEVEOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogQ09NUDEgfHwgQ09NUDIgKi8KKworCisjZW5kaWYgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjN4eF9sbF9jcmMuYyBiL1NyYy9zdG0zMmYzeHhfbGxfY3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJiNzkyNQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfbGxfY3JjLmMKQEAgLTAsMCArMSwxMzUgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfbGxfY3JjLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIENSQyBMTCBtb2R1bGUgZHJpdmVyLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfbGxfY3JjLmgiCisKKyNpZmRlZiAgVVNFX0ZVTExfQVNTRVJUCisjaW5jbHVkZSAic3RtMzJfYXNzZXJ0LmgiCisjZWxzZQorI2RlZmluZSBhc3NlcnRfcGFyYW0oZXhwcikgKCh2b2lkKTBVKQorI2VuZGlmCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKENSQykKKworLyoqIEBhZGR0b2dyb3VwIENSQ19MTAorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIENSQ19MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgQ1JDX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgQ1JDIHJlZ2lzdGVycyAoUmVnaXN0ZXJzIHJlc3RvcmVkIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzKS4KKyAgKiBAcGFyYW0gIENSQ3ggQ1JDIEluc3RhbmNlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IENSQyByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogQ1JDIHJlZ2lzdGVycyBhcmUgbm90IGRlLWluaXRpYWxpemVkCisgICovCitFcnJvclN0YXR1cyBMTF9DUkNfRGVJbml0KENSQ19UeXBlRGVmICpDUkN4KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19DUkNfQUxMX0lOU1RBTkNFKENSQ3gpKTsKKworICBpZiAoQ1JDeCA9PSBDUkMpCisgIHsKKyAgICAvKiBTZXQgcHJvZ3JhbW1hYmxlIHBvbHlub21pYWwgc2l6ZSBpbiBDUiByZWdpc3RlciB0byByZXNldCB2YWx1ZSAoMzIgYml0cykqLworICAgIExMX0NSQ19TZXRQb2x5bm9taWFsU2l6ZShDUkN4LCBMTF9DUkNfUE9MWUxFTkdUSF8zMkIpOworCisgICAgLyogU2V0IHByb2dyYW1tYWJsZSBwb2x5bm9taWFsIGluIFBPTCByZWdpc3RlciB0byByZXNldCB2YWx1ZSAqLworICAgIExMX0NSQ19TZXRQb2x5bm9taWFsQ29lZihDUkN4LCBMTF9DUkNfREVGQVVMVF9DUkMzMl9QT0xZKTsKKworICAgIC8qIFNldCBJTklUIHJlZ2lzdGVyIHRvIHJlc2V0IHZhbHVlICovCisgICAgTExfQ1JDX1NldEluaXRpYWxEYXRhKENSQ3gsIExMX0NSQ19ERUZBVUxUX0NSQ19JTklUVkFMVUUpOworCisgICAgLyogU2V0IFJldmVyc2liaWxpdHkgb3B0aW9ucyBvbiBJL08gZGF0YSB2YWx1ZXMgaW4gQ1IgcmVnaXN0ZXIgdG8gcmVzZXQgdmFsdWUgKi8KKyAgICBMTF9DUkNfU2V0SW5wdXREYXRhUmV2ZXJzZU1vZGUoQ1JDeCwgTExfQ1JDX0lOREFUQV9SRVZFUlNFX05PTkUpOworICAgIExMX0NSQ19TZXRPdXRwdXREYXRhUmV2ZXJzZU1vZGUoQ1JDeCwgTExfQ1JDX09VVERBVEFfUkVWRVJTRV9OT05FKTsKKworICAgIC8qIFJlc2V0IHRoZSBDUkMgY2FsY3VsYXRpb24gdW5pdCAqLworICAgIExMX0NSQ19SZXNldENSQ0NhbGN1bGF0aW9uVW5pdChDUkN4KTsKKworICAgIC8qIFJlc2V0IElEUiByZWdpc3RlciAqLworICAgIExMX0NSQ19Xcml0ZV9JRFIoQ1JDeCwgMHgwMFUpOworICB9CisgIGVsc2UKKyAgeworICAgIHN0YXR1cyA9IEVSUk9SOworICB9CisKKyAgcmV0dXJuIChzdGF0dXMpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogZGVmaW5lZCAoQ1JDKSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCisKZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmYzeHhfbGxfZGFjLmMgYi9TcmMvc3RtMzJmM3h4X2xsX2RhYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNWYzOTMKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJmM3h4X2xsX2RhYy5jCkBAIC0wLDAgKzEsMzUyIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2xsX2RhYy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBEQUMgTEwgbW9kdWxlIGRyaXZlcgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfbGxfZGFjLmgiCisjaW5jbHVkZSAic3RtMzJmM3h4X2xsX2J1cy5oIgorCisjaWZkZWYgVVNFX0ZVTExfQVNTRVJUCisgICNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisgICNkZWZpbmUgYXNzZXJ0X3BhcmFtKGV4cHIpICgodm9pZCkwVSkKKyNlbmRpZgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkIChEQUMxKSB8fCBkZWZpbmVkIChEQUMyKQorCisvKiogQGFkZHRvZ3JvdXAgREFDX0xMIERBQworICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAYWRkdG9ncm91cCBEQUNfTExfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChEQUNfQ0hBTk5FTDJfU1VQUE9SVCkKKyNkZWZpbmUgSVNfTExfREFDX0NIQU5ORUwoX19EQUNYX18sIF9fREFDX0NIQU5ORUxfXykgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKChfX0RBQ19DSEFOTkVMX18pID09IExMX0RBQ19DSEFOTkVMXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19EQUNfQ0hBTk5FTF9fKSA9PSBMTF9EQUNfQ0hBTk5FTF8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKyNlbHNlCisjZGVmaW5lIElTX0xMX0RBQ19DSEFOTkVMKF9fREFDWF9fLCBfX0RBQ19DSEFOTkVMX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19EQUNfQ0hBTk5FTF9fKSA9PSBMTF9EQUNfQ0hBTk5FTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKyNlbmRpZiAvKiBEQUNfQ0hBTk5FTDJfU1VQUE9SVCAqLworCisjaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkKKyNkZWZpbmUgSVNfTExfREFDX1RSSUdHRVJfU09VUkNFKF9fVFJJR0dFUl9TT1VSQ0VfXykgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fVFJJR0dFUl9TT1VSQ0VfXykgPT0gTExfREFDX1RSSUdfU09GVFdBUkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1RSSUdHRVJfU09VUkNFX18pID09IExMX0RBQ19UUklHX0VYVF9USU0yX1RSR08pICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19UUklHR0VSX1NPVVJDRV9fKSA9PSBMTF9EQUNfVFJJR19FWFRfVElNM19UUkdPKSAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fVFJJR0dFUl9TT1VSQ0VfXykgPT0gTExfREFDX1RSSUdfRVhUX1RJTTRfVFJHTykgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1RSSUdHRVJfU09VUkNFX18pID09IExMX0RBQ19UUklHX0VYVF9USU0xNV9UUkdPKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19UUklHR0VSX1NPVVJDRV9fKSA9PSBMTF9EQUNfVFJJR19FWFRfVElNNl9UUkdPKSAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fVFJJR0dFUl9TT1VSQ0VfXykgPT0gTExfREFDX1RSSUdfRVhUX1RJTTdfVFJHTykgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1RSSUdHRVJfU09VUkNFX18pID09IExMX0RBQ19UUklHX0VYVF9FWFRJX0xJTkU5KSAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisjZWxpZiBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KSAKKyNkZWZpbmUgSVNfTExfREFDX1RSSUdHRVJfU09VUkNFKF9fVFJJR0dFUl9TT1VSQ0VfXykgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fVFJJR0dFUl9TT1VSQ0VfXykgPT0gTExfREFDX1RSSUdfU09GVFdBUkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1RSSUdHRVJfU09VUkNFX18pID09IExMX0RBQ19UUklHX0VYVF9USU0yX1RSR08pICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19UUklHR0VSX1NPVVJDRV9fKSA9PSBMTF9EQUNfVFJJR19FWFRfVElNM19UUkdPKSAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fVFJJR0dFUl9TT1VSQ0VfXykgPT0gTExfREFDX1RSSUdfRVhUX1RJTTE1X1RSR08pICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1RSSUdHRVJfU09VUkNFX18pID09IExMX0RBQ19UUklHX0VYVF9USU02X1RSR08pICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19UUklHR0VSX1NPVVJDRV9fKSA9PSBMTF9EQUNfVFJJR19FWFRfVElNN19UUkdPKSAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fVFJJR0dFUl9TT1VSQ0VfXykgPT0gTExfREFDX1RSSUdfRVhUX0VYVElfTElORTkpICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKyNlbGlmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAyeEMpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpCisjZGVmaW5lIElTX0xMX0RBQ19UUklHR0VSX1NPVVJDRShfX1RSSUdHRVJfU09VUkNFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoICAgKChfX1RSSUdHRVJfU09VUkNFX18pID09IExMX0RBQ19UUklHX1NPRlRXQVJFKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19UUklHR0VSX1NPVVJDRV9fKSA9PSBMTF9EQUNfVFJJR19FWFRfVElNMl9UUkdPKSAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fVFJJR0dFUl9TT1VSQ0VfXykgPT0gTExfREFDX1RSSUdfRVhUX1RJTTNfVFJHTykgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1RSSUdHRVJfU09VUkNFX18pID09IExMX0RBQ19UUklHX0VYVF9USU00X1RSR08pICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19UUklHR0VSX1NPVVJDRV9fKSA9PSBMTF9EQUNfVFJJR19FWFRfVElNMTVfVFJHTykgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fVFJJR0dFUl9TT1VSQ0VfXykgPT0gTExfREFDX1RSSUdfRVhUX1RJTTZfVFJHTykgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1RSSUdHRVJfU09VUkNFX18pID09IExMX0RBQ19UUklHX0VYVF9FWFRJX0xJTkU5KSAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisjZWxpZiBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KQorI2RlZmluZSBJU19MTF9EQUNfVFJJR0dFUl9TT1VSQ0UoX19UUklHR0VSX1NPVVJDRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCAgICgoX19UUklHR0VSX1NPVVJDRV9fKSA9PSBMTF9EQUNfVFJJR19TT0ZUV0FSRSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fVFJJR0dFUl9TT1VSQ0VfXykgPT0gTExfREFDX1RSSUdfRVhUX1RJTTJfVFJHTykgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1RSSUdHRVJfU09VUkNFX18pID09IExMX0RBQ19UUklHX0VYVF9USU02X1RSR08pICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19UUklHR0VSX1NPVVJDRV9fKSA9PSBMTF9EQUNfVFJJR19FWFRfVElNMTVfVFJHTykgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fVFJJR0dFUl9TT1VSQ0VfXykgPT0gTExfREFDX1RSSUdfRVhUX0VYVElfTElORTkpICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKyNlbGlmIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisjZGVmaW5lIElTX0xMX0RBQ19UUklHR0VSX1NPVVJDRShfX1RSSUdHRVJfU09VUkNFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoICAgKChfX1RSSUdHRVJfU09VUkNFX18pID09IExMX0RBQ19UUklHX1NPRlRXQVJFKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19UUklHR0VSX1NPVVJDRV9fKSA9PSBMTF9EQUNfVFJJR19FWFRfVElNMl9UUkdPKSAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fVFJJR0dFUl9TT1VSQ0VfXykgPT0gTExfREFDX1RSSUdfRVhUX1RJTTNfVFJHTykgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1RSSUdHRVJfU09VUkNFX18pID09IExMX0RBQ19UUklHX0VYVF9USU00X1RSR08pICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19UUklHR0VSX1NPVVJDRV9fKSA9PSBMTF9EQUNfVFJJR19FWFRfVElNNV9UUkdPKSAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fVFJJR0dFUl9TT1VSQ0VfXykgPT0gTExfREFDX1RSSUdfRVhUX1RJTTZfVFJHTykgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1RSSUdHRVJfU09VUkNFX18pID09IExMX0RBQ19UUklHX0VYVF9USU03X1RSR08pICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19UUklHR0VSX1NPVVJDRV9fKSA9PSBMTF9EQUNfVFJJR19FWFRfRVhUSV9MSU5FOSkgICAgICAgICAgICAgICAgICAgICBcCisgICkKKworI2VsaWYgZGVmaW5lZChTVE0zMkYzMzR4OCkKKyNkZWZpbmUgSVNfTExfREFDX1RSSUdHRVJfU09VUkNFKF9fVFJJR0dFUl9TT1VSQ0VfXykgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fVFJJR0dFUl9TT1VSQ0VfXykgPT0gTExfREFDX1RSSUdfU09GVFdBUkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1RSSUdHRVJfU09VUkNFX18pID09IExMX0RBQ19UUklHX0VYVF9USU02X1RSR08pICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19UUklHR0VSX1NPVVJDRV9fKSA9PSBMTF9EQUNfVFJJR19FWFRfVElNM19UUkdPKSAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fVFJJR0dFUl9TT1VSQ0VfXykgPT0gTExfREFDX1RSSUdfRVhUX1RJTTdfVFJHTykgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1RSSUdHRVJfU09VUkNFX18pID09IExMX0RBQ19UUklHX0VYVF9USU0xNV9UUkdPKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19UUklHR0VSX1NPVVJDRV9fKSA9PSBMTF9EQUNfVFJJR19FWFRfVElNMl9UUkdPKSAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fVFJJR0dFUl9TT1VSQ0VfXykgPT0gTExfREFDX1RSSUdHRVJfSFJUSU0xX0RBQ1RSRzIpICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1RSSUdHRVJfU09VUkNFX18pID09IExMX0RBQ19UUklHR0VSX0hSVElNMV9EQUNUUkczKSAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19UUklHR0VSX1NPVVJDRV9fKSA9PSBMTF9EQUNfVFJJR19FWFRfRVhUSV9MSU5FOSkgICAgICAgICAgICAgICAgICAgICBcCisgICkKKyNlbmRpZgorCisjZGVmaW5lIElTX0xMX0RBQ19XQVZFX0FVVE9fR0VORVJfTU9ERShfX1dBVkVfQVVUT19HRU5FUkFUSU9OX01PREVfXykgICAgICAgICAgIFwKKyAgKCAgICgoX19XQVZFX0FVVE9fR0VORVJBVElPTl9NT0RFX18pID09IExMX0RBQ19XQVZFX0FVVE9fR0VORVJBVElPTl9OT05FKSAgICAgXAorICAgfHwgKChfX1dBVkVfQVVUT19HRU5FUkFUSU9OX01PREVfXykgPT0gTExfREFDX1dBVkVfQVVUT19HRU5FUkFUSU9OX05PSVNFKSAgICBcCisgICB8fCAoKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fTU9ERV9fKSA9PSBMTF9EQUNfV0FWRV9BVVRPX0dFTkVSQVRJT05fVFJJQU5HTEUpIFwKKyAgKQorCisjZGVmaW5lIElTX0xMX0RBQ19XQVZFX0FVVE9fR0VORVJfQ09ORklHKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fQ09ORklHX18pICAgICAgXAorICAoICAgKChfX1dBVkVfQVVUT19HRU5FUkFUSU9OX0NPTkZJR19fKSA9PSBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUMCkgICAgIFwKKyAgIHx8ICgoX19XQVZFX0FVVE9fR0VORVJBVElPTl9DT05GSUdfXykgPT0gTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFMxXzApICBcCisgICB8fCAoKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fQ09ORklHX18pID09IExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTMl8wKSAgXAorICAgfHwgKChfX1dBVkVfQVVUT19HRU5FUkFUSU9OX0NPTkZJR19fKSA9PSBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzNfMCkgIFwKKyAgIHx8ICgoX19XQVZFX0FVVE9fR0VORVJBVElPTl9DT05GSUdfXykgPT0gTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFM0XzApICBcCisgICB8fCAoKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fQ09ORklHX18pID09IExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTNV8wKSAgXAorICAgfHwgKChfX1dBVkVfQVVUT19HRU5FUkFUSU9OX0NPTkZJR19fKSA9PSBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzZfMCkgIFwKKyAgIHx8ICgoX19XQVZFX0FVVE9fR0VORVJBVElPTl9DT05GSUdfXykgPT0gTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFM3XzApICBcCisgICB8fCAoKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fQ09ORklHX18pID09IExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTOF8wKSAgXAorICAgfHwgKChfX1dBVkVfQVVUT19HRU5FUkFUSU9OX0NPTkZJR19fKSA9PSBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzlfMCkgIFwKKyAgIHx8ICgoX19XQVZFX0FVVE9fR0VORVJBVElPTl9DT05GSUdfXykgPT0gTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFMxMF8wKSBcCisgICB8fCAoKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fQ09ORklHX18pID09IExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTMTFfMCkgXAorICAgfHwgKChfX1dBVkVfQVVUT19HRU5FUkFUSU9OX0NPTkZJR19fKSA9PSBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzEpICAgICAgIFwKKyAgIHx8ICgoX19XQVZFX0FVVE9fR0VORVJBVElPTl9DT05GSUdfXykgPT0gTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8zKSAgICAgICBcCisgICB8fCAoKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fQ09ORklHX18pID09IExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfNykgICAgICAgXAorICAgfHwgKChfX1dBVkVfQVVUT19HRU5FUkFUSU9OX0NPTkZJR19fKSA9PSBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzE1KSAgICAgIFwKKyAgIHx8ICgoX19XQVZFX0FVVE9fR0VORVJBVElPTl9DT05GSUdfXykgPT0gTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8zMSkgICAgICBcCisgICB8fCAoKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fQ09ORklHX18pID09IExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfNjMpICAgICAgXAorICAgfHwgKChfX1dBVkVfQVVUT19HRU5FUkFUSU9OX0NPTkZJR19fKSA9PSBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzEyNykgICAgIFwKKyAgIHx8ICgoX19XQVZFX0FVVE9fR0VORVJBVElPTl9DT05GSUdfXykgPT0gTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8yNTUpICAgICBcCisgICB8fCAoKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fQ09ORklHX18pID09IExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfNTExKSAgICAgXAorICAgfHwgKChfX1dBVkVfQVVUT19HRU5FUkFUSU9OX0NPTkZJR19fKSA9PSBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzEwMjMpICAgIFwKKyAgIHx8ICgoX19XQVZFX0FVVE9fR0VORVJBVElPTl9DT05GSUdfXykgPT0gTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8yMDQ3KSAgICBcCisgICB8fCAoKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fQ09ORklHX18pID09IExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfNDA5NSkgICAgXAorICApCisKKyNkZWZpbmUgSVNfTExfREFDX09VVFBVVF9CVUZGRVIoX19PVVRQVVRfQlVGRkVSX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fT1VUUFVUX0JVRkZFUl9fKSA9PSBMTF9EQUNfT1VUUFVUX0JVRkZFUl9FTkFCTEUpICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX09VVFBVVF9CVUZGRVJfXykgPT0gTExfREFDX09VVFBVVF9CVUZGRVJfRElTQUJMRSkgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgREFDX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBEQUNfTExfRUZfSW5pdAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRGUtaW5pdGlhbGl6ZSByZWdpc3RlcnMgb2YgdGhlIHNlbGVjdGVkIERBQyBpbnN0YW5jZQorICAqICAgICAgICAgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBEQUMgcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IG5vdCBhcHBsaWNhYmxlCisgICovCitFcnJvclN0YXR1cyBMTF9EQUNfRGVJbml0KERBQ19UeXBlRGVmICpEQUN4KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfREFDX0FMTF9JTlNUQU5DRShEQUN4KSk7CisgIAorICBpZihEQUN4ID09IERBQzEpCisgIHsKKyAgICAvKiBGb3JjZSByZXNldCBvZiBEQUMgY2xvY2sgKi8KKyAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX0RBQzEpOworICAgIAorICAgIC8qIFJlbGVhc2UgcmVzZXQgb2YgREFDIGNsb2NrICovCisgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX0RBQzEpOworICB9CisjaWYgZGVmaW5lZChEQUMyKQorICBlbHNlCisgIHsKKyAgICAvKiBGb3JjZSByZXNldCBvZiBEQUMgY2xvY2sgKi8KKyAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX0RBQzIpOworICAgIAorICAgIC8qIFJlbGVhc2UgcmVzZXQgb2YgREFDIGNsb2NrICovCisgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX0RBQzIpOworICB9CisjZW5kaWYKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSBzb21lIGZlYXR1cmVzIG9mIERBQyBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgYnkgZnVuY3Rpb24gQHJlZiBMTF9EQUNfSW5pdCgpCisgICogICAgICAgICBpcyBjb25kaXRpb25lZCB0byBEQUMgc3RhdGU6CisgICogICAgICAgICBEQUMgaW5zdGFuY2UgbXVzdCBiZSBkaXNhYmxlZC4KKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gdGhpcyBTVE0zMiBzZXJpZSwgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuCisgICogICAgICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LgorICAqIEBwYXJhbSAgREFDX0luaXRTdHJ1Y3QgUG9pbnRlciB0byBhIEByZWYgTExfREFDX0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBEQUMgcmVnaXN0ZXJzIGFyZSBpbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IERBQyByZWdpc3RlcnMgYXJlIG5vdCBpbml0aWFsaXplZAorICAqLworRXJyb3JTdGF0dXMgTExfREFDX0luaXQoREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERBQ19DaGFubmVsLCBMTF9EQUNfSW5pdFR5cGVEZWYgKkRBQ19Jbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19BTExfSU5TVEFOQ0UoREFDeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfREFDX0NIQU5ORUwoREFDeCwgREFDX0NoYW5uZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0RBQ19UUklHR0VSX1NPVVJDRShEQUNfSW5pdFN0cnVjdC0+VHJpZ2dlclNvdXJjZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfREFDX09VVFBVVF9CVUZGRVIoREFDX0luaXRTdHJ1Y3QtPk91dHB1dEJ1ZmZlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfREFDX1dBVkVfQVVUT19HRU5FUl9NT0RFKERBQ19Jbml0U3RydWN0LT5XYXZlQXV0b0dlbmVyYXRpb24pKTsKKyAgaWYgKERBQ19Jbml0U3RydWN0LT5XYXZlQXV0b0dlbmVyYXRpb24gIT0gTExfREFDX1dBVkVfQVVUT19HRU5FUkFUSU9OX05PTkUpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfREFDX1dBVkVfQVVUT19HRU5FUl9DT05GSUcoREFDX0luaXRTdHJ1Y3QtPldhdmVBdXRvR2VuZXJhdGlvbkNvbmZpZykpOworICB9CisgIAorICAvKiBOb3RlOiBIYXJkd2FyZSBjb25zdHJhaW50IChyZWZlciB0byBkZXNjcmlwdGlvbiBvZiB0aGlzIGZ1bmN0aW9uKSAgICAgICAgKi8KKyAgLyogICAgICAgREFDIGluc3RhbmNlIG11c3QgYmUgZGlzYWJsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmKExMX0RBQ19Jc0VuYWJsZWQoREFDeCwgREFDX0NoYW5uZWwpID09IDBVKQorICB7CisgICAgLyogQ29uZmlndXJhdGlvbiBvZiBEQUMgY2hhbm5lbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIFRyaWdnZXJTb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBXYXZlQXV0b0dlbmVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gT3V0cHV0QnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmIChEQUNfSW5pdFN0cnVjdC0+V2F2ZUF1dG9HZW5lcmF0aW9uICE9IExMX0RBQ19XQVZFX0FVVE9fR0VORVJBVElPTl9OT05FKQorICAgIHsKKyAgICAgIE1PRElGWV9SRUcoREFDeC0+Q1IsCisgICAgICAgICAgICAgICAgICggIERBQ19DUl9UU0VMMQorICAgICAgICAgICAgICAgICAgfCBEQUNfQ1JfV0FWRTEKKyAgICAgICAgICAgICAgICAgIHwgREFDX0NSX01BTVAxCisgICAgICAgICAgICAgICAgICB8IERBQ19DUl9CT0ZGMQorICAgICAgICAgICAgICAgICApIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spCisgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAoICBEQUNfSW5pdFN0cnVjdC0+VHJpZ2dlclNvdXJjZQorICAgICAgICAgICAgICAgICAgfCBEQUNfSW5pdFN0cnVjdC0+V2F2ZUF1dG9HZW5lcmF0aW9uCisgICAgICAgICAgICAgICAgICB8IERBQ19Jbml0U3RydWN0LT5XYXZlQXV0b0dlbmVyYXRpb25Db25maWcKKyAgICAgICAgICAgICAgICAgIHwgREFDX0luaXRTdHJ1Y3QtPk91dHB1dEJ1ZmZlcgorICAgICAgICAgICAgICAgICApIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spCisgICAgICAgICAgICAgICAgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIE1PRElGWV9SRUcoREFDeC0+Q1IsCisgICAgICAgICAgICAgICAgICggIERBQ19DUl9UU0VMMQorICAgICAgICAgICAgICAgICAgfCBEQUNfQ1JfV0FWRTEKKyAgICAgICAgICAgICAgICAgIHwgREFDX0NSX0JPRkYxCisgICAgICAgICAgICAgICAgICkgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykKKyAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICggIERBQ19Jbml0U3RydWN0LT5UcmlnZ2VyU291cmNlCisgICAgICAgICAgICAgICAgICB8IExMX0RBQ19XQVZFX0FVVE9fR0VORVJBVElPTl9OT05FCisgICAgICAgICAgICAgICAgICB8IERBQ19Jbml0U3RydWN0LT5PdXRwdXRCdWZmZXIKKyAgICAgICAgICAgICAgICAgKSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKQorICAgICAgICAgICAgICAgICk7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIEluaXRpYWxpemF0aW9uIGVycm9yOiBEQUMgaW5zdGFuY2UgaXMgbm90IGRpc2FibGVkLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBzdGF0dXMgPSBFUlJPUjsKKyAgfQorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgU2V0IGVhY2ggQHJlZiBMTF9EQUNfSW5pdFR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZS4KKyAgKiBAcGFyYW0gREFDX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfREFDX0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICAqICAgICAgICAgICAgICAgICAgICAgICB3aG9zZSBmaWVsZHMgd2lsbCBiZSBzZXQgdG8gZGVmYXVsdCB2YWx1ZXMuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX0RBQ19TdHJ1Y3RJbml0KExMX0RBQ19Jbml0VHlwZURlZiAqREFDX0luaXRTdHJ1Y3QpCit7CisgIC8qIFNldCBEQUNfSW5pdFN0cnVjdCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8KKyAgREFDX0luaXRTdHJ1Y3QtPlRyaWdnZXJTb3VyY2UgICAgICAgICAgICA9IExMX0RBQ19UUklHX1NPRlRXQVJFOworICBEQUNfSW5pdFN0cnVjdC0+V2F2ZUF1dG9HZW5lcmF0aW9uICAgICAgID0gTExfREFDX1dBVkVfQVVUT19HRU5FUkFUSU9OX05PTkU7CisgIC8qIE5vdGU6IFBhcmFtZXRlciBkaXNjYXJkZWQgaWYgd2F2ZSBhdXRvIGdlbmVyYXRpb24gaXMgZGlzYWJsZWQsICAgICAgICAgICAqLworICAvKiAgICAgICBzZXQgYW55d2F5IHRvIGl0cyBkZWZhdWx0IHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgREFDX0luaXRTdHJ1Y3QtPldhdmVBdXRvR2VuZXJhdGlvbkNvbmZpZyA9IExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVQwOworICBEQUNfSW5pdFN0cnVjdC0+T3V0cHV0QnVmZmVyICAgICAgICAgICAgID0gTExfREFDX09VVFBVVF9CVUZGRVJfRU5BQkxFOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogREFDMSB8fCBEQUMyICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmYzeHhfbGxfZG1hLmMgYi9TcmMvc3RtMzJmM3h4X2xsX2RtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YjFkNWQKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJmM3h4X2xsX2RtYS5jCkBAIC0wLDAgKzEsMzUyIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2xsX2RtYS5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBETUEgTEwgbW9kdWxlIGRyaXZlci4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2xsX2RtYS5oIgorI2luY2x1ZGUgInN0bTMyZjN4eF9sbF9idXMuaCIKKyNpZmRlZiAgVVNFX0ZVTExfQVNTRVJUCisjaW5jbHVkZSAic3RtMzJfYXNzZXJ0LmgiCisjZWxzZQorI2RlZmluZSBhc3NlcnRfcGFyYW0oZXhwcikgKCh2b2lkKTBVKQorI2VuZGlmCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKERNQTEpIHx8IGRlZmluZWQgKERNQTIpCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0xMIERNQQorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgRE1BX0xMX1ByaXZhdGVfTWFjcm9zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfTExfRE1BX0RJUkVDVElPTihfX1ZBTFVFX18pICAgICAgICAgICgoKF9fVkFMVUVfXykgPT0gTExfRE1BX0RJUkVDVElPTl9QRVJJUEhfVE9fTUVNT1JZKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX1BFUklQSCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19NRU1PUlkpKQorCisjZGVmaW5lIElTX0xMX0RNQV9NT0RFKF9fVkFMVUVfXykgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pID09IExMX0RNQV9NT0RFX05PUk1BTCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9ETUFfTU9ERV9DSVJDVUxBUikpCisKKyNkZWZpbmUgSVNfTExfRE1BX1BFUklQSElOQ01PREUoX19WQUxVRV9fKSAgICAgICgoKF9fVkFMVUVfXykgPT0gTExfRE1BX1BFUklQSF9JTkNSRU1FTlQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfRE1BX1BFUklQSF9OT0lOQ1JFTUVOVCkpCisKKyNkZWZpbmUgSVNfTExfRE1BX01FTU9SWUlOQ01PREUoX19WQUxVRV9fKSAgICAgICgoKF9fVkFMVUVfXykgPT0gTExfRE1BX01FTU9SWV9JTkNSRU1FTlQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfRE1BX01FTU9SWV9OT0lOQ1JFTUVOVCkpCisKKyNkZWZpbmUgSVNfTExfRE1BX1BFUklQSERBVEFTSVpFKF9fVkFMVUVfXykgICAgICgoKF9fVkFMVUVfXykgPT0gTExfRE1BX1BEQVRBQUxJR05fQllURSkgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9QREFUQUFMSUdOX0hBTEZXT1JEKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9ETUFfUERBVEFBTElHTl9XT1JEKSkKKworI2RlZmluZSBJU19MTF9ETUFfTUVNT1JZREFUQVNJWkUoX19WQUxVRV9fKSAgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9ETUFfTURBVEFBTElHTl9CWVRFKSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfRE1BX01EQVRBQUxJR05fSEFMRldPUkQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9NREFUQUFMSUdOX1dPUkQpKQorCisjZGVmaW5lIElTX0xMX0RNQV9OQkRBVEEoX19WQUxVRV9fKSAgICAgICAgICAgICAoKF9fVkFMVUVfXykgIDw9IDB4MDAwMEZGRkZVKQorCisKKyNkZWZpbmUgSVNfTExfRE1BX1BSSU9SSVRZKF9fVkFMVUVfXykgICAgICAgICAgICgoKF9fVkFMVUVfXykgPT0gTExfRE1BX1BSSU9SSVRZX0xPVykgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9ETUFfUFJJT1JJVFlfTUVESVVNKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9QUklPUklUWV9ISUdIKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfRE1BX1BSSU9SSVRZX1ZFUllISUdIKSkKKworI2lmIGRlZmluZWQgKERNQTIpCisjaWYgZGVmaW5lZCAoRE1BMl9DaGFubmVsNikgJiYgZGVmaW5lZCAoRE1BMl9DaGFubmVsNykKKyNkZWZpbmUgSVNfTExfRE1BX0FMTF9DSEFOTkVMX0lOU1RBTkNFKElOU1RBTkNFLCBDSEFOTkVMKSAgKCgoKElOU1RBTkNFKSA9PSBETUExKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8zKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF80KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF81KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF82KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF83KSkpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKElOU1RBTkNFKSA9PSBETUEyKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8zKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF80KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF81KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF82KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF83KSkpKQorI2Vsc2UKKyNkZWZpbmUgSVNfTExfRE1BX0FMTF9DSEFOTkVMX0lOU1RBTkNFKElOU1RBTkNFLCBDSEFOTkVMKSAgKCgoKElOU1RBTkNFKSA9PSBETUExKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8zKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF80KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF81KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF82KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF83KSkpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKElOU1RBTkNFKSA9PSBETUEyKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8zKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF80KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF81KSkpKQorI2VuZGlmCisjZWxzZQorI2RlZmluZSBJU19MTF9ETUFfQUxMX0NIQU5ORUxfSU5TVEFOQ0UoSU5TVEFOQ0UsIENIQU5ORUwpICAoKCgoSU5TVEFOQ0UpID09IERNQTEpICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKENIQU5ORUwpID09IExMX0RNQV9DSEFOTkVMXzEpfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IExMX0RNQV9DSEFOTkVMXzMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gTExfRE1BX0NIQU5ORUxfNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF81KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IExMX0RNQV9DSEFOTkVMXzYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gTExfRE1BX0NIQU5ORUxfNykpKSkKKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBETUFfTExfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIERNQV9MTF9FRl9Jbml0CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBEZS1pbml0aWFsaXplIHRoZSBETUEgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBETUEgcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IERNQSByZWdpc3RlcnMgYXJlIG5vdCBkZS1pbml0aWFsaXplZAorICAqLwordWludDMyX3QgTExfRE1BX0RlSW5pdChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgRE1BX0NoYW5uZWxfVHlwZURlZiAqdG1wID0gKERNQV9DaGFubmVsX1R5cGVEZWYgKilETUExX0NoYW5uZWwxOworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworCisgIC8qIENoZWNrIHRoZSBETUEgSW5zdGFuY2UgRE1BeCBhbmQgQ2hhbm5lbCBwYXJhbWV0ZXJzKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0RNQV9BTExfQ0hBTk5FTF9JTlNUQU5DRShETUF4LCBDaGFubmVsKSk7CisKKyAgICB0bXAgPSAoRE1BX0NoYW5uZWxfVHlwZURlZiAqKShfX0xMX0RNQV9HRVRfQ0hBTk5FTF9JTlNUQU5DRShETUF4LCBDaGFubmVsKSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBETUF4X0NoYW5uZWx5ICovCisgICAgQ0xFQVJfQklUKHRtcC0+Q0NSLCBETUFfQ0NSX0VOKTsKKworICAgIC8qIFJlc2V0IERNQXhfQ2hhbm5lbHkgY29udHJvbCByZWdpc3RlciAqLworICAgIExMX0RNQV9Xcml0ZVJlZyh0bXAsIENDUiwgMFUpOworCisgICAgLyogUmVzZXQgRE1BeF9DaGFubmVseSByZW1haW5pbmcgYnl0ZXMgcmVnaXN0ZXIgKi8KKyAgICBMTF9ETUFfV3JpdGVSZWcodG1wLCBDTkRUUiwgMFUpOworCisgICAgLyogUmVzZXQgRE1BeF9DaGFubmVseSBwZXJpcGhlcmFsIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKyAgICBMTF9ETUFfV3JpdGVSZWcodG1wLCBDUEFSLCAwVSk7CisKKyAgICAvKiBSZXNldCBETUF4X0NoYW5uZWx5IG1lbW9yeSBhZGRyZXNzIHJlZ2lzdGVyICovCisgICAgTExfRE1BX1dyaXRlUmVnKHRtcCwgQ01BUiwgMFUpOworCisKKyAgICBpZiAoQ2hhbm5lbCA9PSBMTF9ETUFfQ0hBTk5FTF8xKQorICAgIHsKKyAgICAgIC8qIFJlc2V0IGludGVycnVwdCBwZW5kaW5nIGJpdHMgZm9yIERNQXggQ2hhbm5lbDEgKi8KKyAgICAgIExMX0RNQV9DbGVhckZsYWdfR0kxKERNQXgpOworICAgIH0KKyAgICBlbHNlIGlmIChDaGFubmVsID09IExMX0RNQV9DSEFOTkVMXzIpCisgICAgeworICAgICAgLyogUmVzZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0cyBmb3IgRE1BeCBDaGFubmVsMiAqLworICAgICAgTExfRE1BX0NsZWFyRmxhZ19HSTIoRE1BeCk7CisgICAgfQorICAgIGVsc2UgaWYgKENoYW5uZWwgPT0gTExfRE1BX0NIQU5ORUxfMykKKyAgICB7CisgICAgICAvKiBSZXNldCBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzIGZvciBETUF4IENoYW5uZWwzICovCisgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0dJMyhETUF4KTsKKyAgICB9CisgICAgZWxzZSBpZiAoQ2hhbm5lbCA9PSBMTF9ETUFfQ0hBTk5FTF80KQorICAgIHsKKyAgICAgIC8qIFJlc2V0IGludGVycnVwdCBwZW5kaW5nIGJpdHMgZm9yIERNQXggQ2hhbm5lbDQgKi8KKyAgICAgIExMX0RNQV9DbGVhckZsYWdfR0k0KERNQXgpOworICAgIH0KKyAgICBlbHNlIGlmIChDaGFubmVsID09IExMX0RNQV9DSEFOTkVMXzUpCisgICAgeworICAgICAgLyogUmVzZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0cyBmb3IgRE1BeCBDaGFubmVsNSAqLworICAgICAgTExfRE1BX0NsZWFyRmxhZ19HSTUoRE1BeCk7CisgICAgfQorCisgICAgZWxzZSBpZiAoQ2hhbm5lbCA9PSBMTF9ETUFfQ0hBTk5FTF82KQorICAgIHsKKyAgICAgIC8qIFJlc2V0IGludGVycnVwdCBwZW5kaW5nIGJpdHMgZm9yIERNQXggQ2hhbm5lbDYgKi8KKyAgICAgIExMX0RNQV9DbGVhckZsYWdfR0k2KERNQXgpOworICAgIH0KKyAgICBlbHNlIGlmIChDaGFubmVsID09IExMX0RNQV9DSEFOTkVMXzcpCisgICAgeworICAgICAgLyogUmVzZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0cyBmb3IgRE1BeCBDaGFubmVsNyAqLworICAgICAgTExfRE1BX0NsZWFyRmxhZ19HSTcoRE1BeCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzdGF0dXMgPSBFUlJPUjsKKyAgICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBETUEgcmVnaXN0ZXJzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gRE1BX0luaXRTdHJ1Y3QuCisgICogQG5vdGUgICBUbyBjb252ZXJ0IERNQXhfQ2hhbm5lbHkgSW5zdGFuY2UgdG8gRE1BeCBJbnN0YW5jZSBhbmQgQ2hhbm5lbHksIHVzZSBoZWxwZXIgbWFjcm9zIDoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBfX0xMX0RNQV9HRVRfSU5TVEFOQ0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBfX0xMX0RNQV9HRVRfQ0hBTk5FTAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEBwYXJhbSAgRE1BX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfRE1BX0luaXRUeXBlRGVmIHN0cnVjdHVyZS4KKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogRE1BIHJlZ2lzdGVycyBhcmUgaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBOb3QgYXBwbGljYWJsZQorICAqLwordWludDMyX3QgTExfRE1BX0luaXQoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsIExMX0RNQV9Jbml0VHlwZURlZiAqRE1BX0luaXRTdHJ1Y3QpCit7CisgIC8qIENoZWNrIHRoZSBETUEgSW5zdGFuY2UgRE1BeCBhbmQgQ2hhbm5lbCBwYXJhbWV0ZXJzKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0RNQV9BTExfQ0hBTk5FTF9JTlNUQU5DRShETUF4LCBDaGFubmVsKSk7CisKKyAgLyogQ2hlY2sgdGhlIERNQSBwYXJhbWV0ZXJzIGZyb20gRE1BX0luaXRTdHJ1Y3QgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0RNQV9ESVJFQ1RJT04oRE1BX0luaXRTdHJ1Y3QtPkRpcmVjdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfRE1BX01PREUoRE1BX0luaXRTdHJ1Y3QtPk1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0RNQV9QRVJJUEhJTkNNT0RFKERNQV9Jbml0U3RydWN0LT5QZXJpcGhPck0yTVNyY0luY01vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0RNQV9NRU1PUllJTkNNT0RFKERNQV9Jbml0U3RydWN0LT5NZW1vcnlPck0yTURzdEluY01vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0RNQV9QRVJJUEhEQVRBU0laRShETUFfSW5pdFN0cnVjdC0+UGVyaXBoT3JNMk1TcmNEYXRhU2l6ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfRE1BX01FTU9SWURBVEFTSVpFKERNQV9Jbml0U3RydWN0LT5NZW1vcnlPck0yTURzdERhdGFTaXplKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9ETUFfTkJEQVRBKERNQV9Jbml0U3RydWN0LT5OYkRhdGEpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0RNQV9QUklPUklUWShETUFfSW5pdFN0cnVjdC0+UHJpb3JpdHkpKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRE1BeCBDQ1IgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogQ29uZmlndXJlIERNQXhfQ2hhbm5lbHk6IGRhdGEgdHJhbnNmZXIgZGlyZWN0aW9uLCBkYXRhIHRyYW5zZmVyIG1vZGUsCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpcGhlcmFsIGFuZCBtZW1vcnkgaW5jcmVtZW50IG1vZGUsCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIHNpemUgYWxpZ25tZW50IGFuZCAgcHJpb3JpdHkgbGV2ZWwgd2l0aCBwYXJhbWV0ZXJzIDoKKyAgICogLSBEaXJlY3Rpb246ICAgICAgRE1BX0NDUl9ESVIgYW5kIERNQV9DQ1JfTUVNMk1FTSBiaXRzCisgICAqIC0gTW9kZTogICAgICAgICAgIERNQV9DQ1JfQ0lSQyBiaXQKKyAgICogLSBQZXJpcGhPck0yTVNyY0luY01vZGU6ICBETUFfQ0NSX1BJTkMgYml0CisgICAqIC0gTWVtb3J5T3JNMk1Ec3RJbmNNb2RlOiAgRE1BX0NDUl9NSU5DIGJpdAorICAgKiAtIFBlcmlwaE9yTTJNU3JjRGF0YVNpemU6IERNQV9DQ1JfUFNJWkVbMTowXSBiaXRzCisgICAqIC0gTWVtb3J5T3JNMk1Ec3REYXRhU2l6ZTogRE1BX0NDUl9NU0laRVsxOjBdIGJpdHMKKyAgICogLSBQcmlvcml0eTogICAgICAgICAgICAgICBETUFfQ0NSX1BMWzE6MF0gYml0cworICAgKi8KKyAgTExfRE1BX0NvbmZpZ1RyYW5zZmVyKERNQXgsIENoYW5uZWwsIERNQV9Jbml0U3RydWN0LT5EaXJlY3Rpb24gICAgICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgRE1BX0luaXRTdHJ1Y3QtPk1vZGUgICAgICAgICAgICAgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICBETUFfSW5pdFN0cnVjdC0+UGVyaXBoT3JNMk1TcmNJbmNNb2RlICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERNQV9Jbml0U3RydWN0LT5NZW1vcnlPck0yTURzdEluY01vZGUgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgRE1BX0luaXRTdHJ1Y3QtPlBlcmlwaE9yTTJNU3JjRGF0YVNpemUgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICBETUFfSW5pdFN0cnVjdC0+TWVtb3J5T3JNMk1Ec3REYXRhU2l6ZSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERNQV9Jbml0U3RydWN0LT5Qcmlvcml0eSk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBETUF4IENNQVIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAqIENvbmZpZ3VyZSB0aGUgbWVtb3J5IG9yIGRlc3RpbmF0aW9uIGJhc2UgYWRkcmVzcyB3aXRoIHBhcmFtZXRlciA6CisgICAqIC0gTWVtb3J5T3JNMk1Ec3RBZGRyZXNzOiBETUFfQ01BUl9NQVszMTowXSBiaXRzCisgICAqLworICBMTF9ETUFfU2V0TWVtb3J5QWRkcmVzcyhETUF4LCBDaGFubmVsLCBETUFfSW5pdFN0cnVjdC0+TWVtb3J5T3JNMk1Ec3RBZGRyZXNzKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERNQXggQ1BBUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogQ29uZmlndXJlIHRoZSBwZXJpcGhlcmFsIG9yIHNvdXJjZSBiYXNlIGFkZHJlc3Mgd2l0aCBwYXJhbWV0ZXIgOgorICAgKiAtIFBlcmlwaE9yTTJNU3JjQWRkcmVzczogRE1BX0NQQVJfUEFbMzE6MF0gYml0cworICAgKi8KKyAgTExfRE1BX1NldFBlcmlwaEFkZHJlc3MoRE1BeCwgQ2hhbm5lbCwgRE1BX0luaXRTdHJ1Y3QtPlBlcmlwaE9yTTJNU3JjQWRkcmVzcyk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRE1BeCBDTkRUUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAqIENvbmZpZ3VyZSB0aGUgcGVyaXBoZXJhbCBiYXNlIGFkZHJlc3Mgd2l0aCBwYXJhbWV0ZXIgOgorICAgKiAtIE5iRGF0YTogRE1BX0NORFRSX05EVFsxNTowXSBiaXRzCisgICAqLworICBMTF9ETUFfU2V0RGF0YUxlbmd0aChETUF4LCBDaGFubmVsLCBETUFfSW5pdFN0cnVjdC0+TmJEYXRhKTsKKworCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBlYWNoIEByZWYgTExfRE1BX0luaXRUeXBlRGVmIGZpZWxkIHRvIGRlZmF1bHQgdmFsdWUuCisgICogQHBhcmFtICBETUFfSW5pdFN0cnVjdCBQb2ludGVyIHRvIGEgQHJlZiBMTF9ETUFfSW5pdFR5cGVEZWYgc3RydWN0dXJlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9ETUFfU3RydWN0SW5pdChMTF9ETUFfSW5pdFR5cGVEZWYgKkRNQV9Jbml0U3RydWN0KQoreworICAvKiBTZXQgRE1BX0luaXRTdHJ1Y3QgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzICovCisgIERNQV9Jbml0U3RydWN0LT5QZXJpcGhPck0yTVNyY0FkZHJlc3MgID0gMHgwMDAwMDAwMFU7CisgIERNQV9Jbml0U3RydWN0LT5NZW1vcnlPck0yTURzdEFkZHJlc3MgID0gMHgwMDAwMDAwMFU7CisgIERNQV9Jbml0U3RydWN0LT5EaXJlY3Rpb24gICAgICAgICAgICAgID0gTExfRE1BX0RJUkVDVElPTl9QRVJJUEhfVE9fTUVNT1JZOworICBETUFfSW5pdFN0cnVjdC0+TW9kZSAgICAgICAgICAgICAgICAgICA9IExMX0RNQV9NT0RFX05PUk1BTDsKKyAgRE1BX0luaXRTdHJ1Y3QtPlBlcmlwaE9yTTJNU3JjSW5jTW9kZSAgPSBMTF9ETUFfUEVSSVBIX05PSU5DUkVNRU5UOworICBETUFfSW5pdFN0cnVjdC0+TWVtb3J5T3JNMk1Ec3RJbmNNb2RlICA9IExMX0RNQV9NRU1PUllfTk9JTkNSRU1FTlQ7CisgIERNQV9Jbml0U3RydWN0LT5QZXJpcGhPck0yTVNyY0RhdGFTaXplID0gTExfRE1BX1BEQVRBQUxJR05fQllURTsKKyAgRE1BX0luaXRTdHJ1Y3QtPk1lbW9yeU9yTTJNRHN0RGF0YVNpemUgPSBMTF9ETUFfTURBVEFBTElHTl9CWVRFOworICBETUFfSW5pdFN0cnVjdC0+TmJEYXRhICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDBVOworICBETUFfSW5pdFN0cnVjdC0+UHJpb3JpdHkgICAgICAgICAgICAgICA9IExMX0RNQV9QUklPUklUWV9MT1c7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBETUExIHx8IERNQTIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjN4eF9sbF9leHRpLmMgYi9TcmMvc3RtMzJmM3h4X2xsX2V4dGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjFmZmVkCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZjN4eF9sbF9leHRpLmMKQEAgLTAsMCArMSwzMTcgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfbGxfZXh0aS5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBFWFRJIExMIG1vZHVsZSBkcml2ZXIuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9sbF9leHRpLmgiCisjaWZkZWYgIFVTRV9GVUxMX0FTU0VSVAorI2luY2x1ZGUgInN0bTMyX2Fzc2VydC5oIgorI2Vsc2UKKyNkZWZpbmUgYXNzZXJ0X3BhcmFtKGV4cHIpICgodm9pZCkwVSkKKyNlbmRpZgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkIChFWFRJKQorCisvKiogQGRlZmdyb3VwIEVYVElfTEwgRVhUSQorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgRVhUSV9MTF9Qcml2YXRlX01hY3JvcworICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfTExfRVhUSV9MSU5FXzBfMzEoX19WQUxVRV9fKSAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIH5MTF9FWFRJX0xJTkVfQUxMXzBfMzEpID09IDB4MDAwMDAwMDBVKQorI2lmIGRlZmluZWQoRVhUSV8zMl82M19TVVBQT1JUKQorI2RlZmluZSBJU19MTF9FWFRJX0xJTkVfMzJfNjMoX19WQUxVRV9fKSAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgfkxMX0VYVElfTElORV9BTExfMzJfNjMpID09IDB4MDAwMDAwMDBVKQorI2VuZGlmCisKKyNkZWZpbmUgSVNfTExfRVhUSV9NT0RFKF9fVkFMVUVfXykgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9FWFRJX01PREVfSVQpICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0VYVElfTU9ERV9FVkVOVCkgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfRVhUSV9NT0RFX0lUX0VWRU5UKSkKKworCisjZGVmaW5lIElTX0xMX0VYVElfVFJJR0dFUihfX1ZBTFVFX18pICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgPT0gTExfRVhUSV9UUklHR0VSX05PTkUpICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9FWFRJX1RSSUdHRVJfUklTSU5HKSAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0VYVElfVFJJR0dFUl9GQUxMSU5HKSAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfRVhUSV9UUklHR0VSX1JJU0lOR19GQUxMSU5HKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBFWFRJX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBFWFRJX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgdGhlIEVYVEkgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLgorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBFWFRJIHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBub3QgYXBwbGljYWJsZQorICAqLwordWludDMyX3QgTExfRVhUSV9EZUluaXQodm9pZCkKK3sKKyAgLyogSW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgc2V0IHRvIGRlZmF1bHQgcmVzZXQgdmFsdWVzICovCisgIExMX0VYVElfV3JpdGVSZWcoSU1SLCAgIDB4MUY4MDAwMDBVKTsKKyAgLyogRXZlbnQgbWFzayByZWdpc3RlciBzZXQgdG8gZGVmYXVsdCByZXNldCB2YWx1ZXMgKi8KKyAgTExfRVhUSV9Xcml0ZVJlZyhFTVIsICAgMHgwMDAwMDAwMFUpOworICAvKiBSaXNpbmcgVHJpZ2dlciBzZWxlY3Rpb24gcmVnaXN0ZXIgc2V0IHRvIGRlZmF1bHQgcmVzZXQgdmFsdWVzICovCisgIExMX0VYVElfV3JpdGVSZWcoUlRTUiwgIDB4MDAwMDAwMDBVKTsKKyAgLyogRmFsbGluZyBUcmlnZ2VyIHNlbGVjdGlvbiByZWdpc3RlciBzZXQgdG8gZGVmYXVsdCByZXNldCB2YWx1ZXMgKi8KKyAgTExfRVhUSV9Xcml0ZVJlZyhGVFNSLCAgMHgwMDAwMDAwMFUpOworICAvKiBTb2Z0d2FyZSBpbnRlcnJ1cHQgZXZlbnQgcmVnaXN0ZXIgc2V0IHRvIGRlZmF1bHQgcmVzZXQgdmFsdWVzICovCisgIExMX0VYVElfV3JpdGVSZWcoU1dJRVIsIDB4MDAwMDAwMDBVKTsKKyAgLyogUGVuZGluZyByZWdpc3RlciBjbGVhciAqLworICBMTF9FWFRJX1dyaXRlUmVnKFBSLCAgICAweDAwN0ZGRkZGVSk7CisKKyNpZiBkZWZpbmVkKEVYVElfMzJfNjNfU1VQUE9SVCkKKyAgLyogSW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgMiBzZXQgdG8gZGVmYXVsdCByZXNldCB2YWx1ZXMgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjMzNHg4KQorICBMTF9FWFRJX1dyaXRlUmVnKElNUjIsICAgICAgICAweEZGRkZGRkZFVSk7CisjZWxzZQorICBMTF9FWFRJX1dyaXRlUmVnKElNUjIsICAgICAgICAweEZGRkZGRkZDVSk7CisjZW5kaWYgIAorICAvKiBFdmVudCBtYXNrIHJlZ2lzdGVyIDIgc2V0IHRvIGRlZmF1bHQgcmVzZXQgdmFsdWVzICovCisgIExMX0VYVElfV3JpdGVSZWcoRU1SMiwgICAgICAgIDB4MDAwMDAwMDBVKTsKKyAgLyogUmlzaW5nIFRyaWdnZXIgc2VsZWN0aW9uIHJlZ2lzdGVyIDIgc2V0IHRvIGRlZmF1bHQgcmVzZXQgdmFsdWVzICovCisgIExMX0VYVElfV3JpdGVSZWcoUlRTUjIsICAgICAgIDB4MDAwMDAwMDBVKTsKKyAgLyogRmFsbGluZyBUcmlnZ2VyIHNlbGVjdGlvbiByZWdpc3RlciAyIHNldCB0byBkZWZhdWx0IHJlc2V0IHZhbHVlcyAqLworICBMTF9FWFRJX1dyaXRlUmVnKEZUU1IyLCAgICAgICAweDAwMDAwMDAwVSk7CisgIC8qIFNvZnR3YXJlIGludGVycnVwdCBldmVudCByZWdpc3RlciAyIHNldCB0byBkZWZhdWx0IHJlc2V0IHZhbHVlcyAqLworICBMTF9FWFRJX1dyaXRlUmVnKFNXSUVSMiwgICAgICAweDAwMDAwMDAwVSk7CisgIC8qIFBlbmRpbmcgcmVnaXN0ZXIgMiBjbGVhciAqLworICBMTF9FWFRJX1dyaXRlUmVnKFBSMiwgICAgICAgICAweDAwMDAwMDAzVSk7CisKKyNlbmRpZgorICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBFWFRJIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIEVYVElfSW5pdFN0cnVjdC4KKyAgKiBAcGFyYW0gIEVYVElfSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9FWFRJX0luaXRUeXBlRGVmIHN0cnVjdHVyZS4KKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogRVhUSSByZWdpc3RlcnMgYXJlIGluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK3VpbnQzMl90IExMX0VYVElfSW5pdChMTF9FWFRJX0luaXRUeXBlRGVmICpFWFRJX0luaXRTdHJ1Y3QpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MTF9FWFRJX0xJTkVfMF8zMShFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMF8zMSkpOworI2lmIGRlZmluZWQoRVhUSV8zMl82M19TVVBQT1JUKQorICBhc3NlcnRfcGFyYW0oSVNfTExfRVhUSV9MSU5FXzMyXzYzKEVYVElfSW5pdFN0cnVjdC0+TGluZV8zMl82MykpOworI2VuZGlmCisgIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKEVYVElfSW5pdFN0cnVjdC0+TGluZUNvbW1hbmQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0VYVElfTU9ERShFWFRJX0luaXRTdHJ1Y3QtPk1vZGUpKTsKKworICAvKiBFTkFCTEUgTGluZUNvbW1hbmQgKi8KKyAgaWYgKEVYVElfSW5pdFN0cnVjdC0+TGluZUNvbW1hbmQgIT0gRElTQUJMRSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19MTF9FWFRJX1RSSUdHRVIoRVhUSV9Jbml0U3RydWN0LT5UcmlnZ2VyKSk7CisKKyAgICAvKiBDb25maWd1cmUgRVhUSSBMaW5lcyBpbiByYW5nZSBmcm9tIDAgdG8gMzEgKi8KKyAgICBpZiAoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzBfMzEgIT0gTExfRVhUSV9MSU5FX05PTkUpCisgICAgeworICAgICAgc3dpdGNoIChFWFRJX0luaXRTdHJ1Y3QtPk1vZGUpCisgICAgICB7CisgICAgICAgIGNhc2UgTExfRVhUSV9NT0RFX0lUOgorICAgICAgICAgIC8qIEZpcnN0IERpc2FibGUgRXZlbnQgb24gcHJvdmlkZWQgTGluZXMgKi8KKyAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVFdmVudF8wXzMxKEVYVElfSW5pdFN0cnVjdC0+TGluZV8wXzMxKTsKKyAgICAgICAgICAvKiBUaGVuIEVuYWJsZSBJVCBvbiBwcm92aWRlZCBMaW5lcyAqLworICAgICAgICAgIExMX0VYVElfRW5hYmxlSVRfMF8zMShFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMF8zMSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTExfRVhUSV9NT0RFX0VWRU5UOgorICAgICAgICAgIC8qIEZpcnN0IERpc2FibGUgSVQgb24gcHJvdmlkZWQgTGluZXMgKi8KKyAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVJVF8wXzMxKEVYVElfSW5pdFN0cnVjdC0+TGluZV8wXzMxKTsKKyAgICAgICAgICAvKiBUaGVuIEVuYWJsZSBFdmVudCBvbiBwcm92aWRlZCBMaW5lcyAqLworICAgICAgICAgIExMX0VYVElfRW5hYmxlRXZlbnRfMF8zMShFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMF8zMSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTExfRVhUSV9NT0RFX0lUX0VWRU5UOgorICAgICAgICAgIC8qIERpcmVjdGx5IEVuYWJsZSBJVCAmIEV2ZW50IG9uIHByb3ZpZGVkIExpbmVzICovCisgICAgICAgICAgTExfRVhUSV9FbmFibGVJVF8wXzMxKEVYVElfSW5pdFN0cnVjdC0+TGluZV8wXzMxKTsKKyAgICAgICAgICBMTF9FWFRJX0VuYWJsZUV2ZW50XzBfMzEoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzBfMzEpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHN0YXR1cyA9IEVSUk9SOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKEVYVElfSW5pdFN0cnVjdC0+VHJpZ2dlciAhPSBMTF9FWFRJX1RSSUdHRVJfTk9ORSkKKyAgICAgIHsKKyAgICAgICAgc3dpdGNoIChFWFRJX0luaXRTdHJ1Y3QtPlRyaWdnZXIpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIExMX0VYVElfVFJJR0dFUl9SSVNJTkc6CisgICAgICAgICAgICAvKiBGaXJzdCBEaXNhYmxlIEZhbGxpbmcgVHJpZ2dlciBvbiBwcm92aWRlZCBMaW5lcyAqLworICAgICAgICAgICAgTExfRVhUSV9EaXNhYmxlRmFsbGluZ1RyaWdfMF8zMShFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMF8zMSk7CisgICAgICAgICAgICAvKiBUaGVuIEVuYWJsZSBSaXNpbmcgVHJpZ2dlciBvbiBwcm92aWRlZCBMaW5lcyAqLworICAgICAgICAgICAgTExfRVhUSV9FbmFibGVSaXNpbmdUcmlnXzBfMzEoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzBfMzEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBMTF9FWFRJX1RSSUdHRVJfRkFMTElORzoKKyAgICAgICAgICAgIC8qIEZpcnN0IERpc2FibGUgUmlzaW5nIFRyaWdnZXIgb24gcHJvdmlkZWQgTGluZXMgKi8KKyAgICAgICAgICAgIExMX0VYVElfRGlzYWJsZVJpc2luZ1RyaWdfMF8zMShFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMF8zMSk7CisgICAgICAgICAgICAvKiBUaGVuIEVuYWJsZSBGYWxsaW5nIFRyaWdnZXIgb24gcHJvdmlkZWQgTGluZXMgKi8KKyAgICAgICAgICAgIExMX0VYVElfRW5hYmxlRmFsbGluZ1RyaWdfMF8zMShFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMF8zMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIExMX0VYVElfVFJJR0dFUl9SSVNJTkdfRkFMTElORzoKKyAgICAgICAgICAgIExMX0VYVElfRW5hYmxlUmlzaW5nVHJpZ18wXzMxKEVYVElfSW5pdFN0cnVjdC0+TGluZV8wXzMxKTsKKyAgICAgICAgICAgIExMX0VYVElfRW5hYmxlRmFsbGluZ1RyaWdfMF8zMShFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMF8zMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3RhdHVzID0gRVJST1I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyNpZiBkZWZpbmVkKEVYVElfMzJfNjNfU1VQUE9SVCkKKyAgICAvKiBDb25maWd1cmUgRVhUSSBMaW5lcyBpbiByYW5nZSBmcm9tIDMyIHRvIDYzICovCisgICAgaWYgKEVYVElfSW5pdFN0cnVjdC0+TGluZV8zMl82MyAhPSBMTF9FWFRJX0xJTkVfTk9ORSkKKyAgICB7CisgICAgICBzd2l0Y2ggKEVYVElfSW5pdFN0cnVjdC0+TW9kZSkKKyAgICAgIHsKKyAgICAgICAgY2FzZSBMTF9FWFRJX01PREVfSVQ6CisgICAgICAgICAgLyogRmlyc3QgRGlzYWJsZSBFdmVudCBvbiBwcm92aWRlZCBMaW5lcyAqLworICAgICAgICAgIExMX0VYVElfRGlzYWJsZUV2ZW50XzMyXzYzKEVYVElfSW5pdFN0cnVjdC0+TGluZV8zMl82Myk7CisgICAgICAgICAgLyogVGhlbiBFbmFibGUgSVQgb24gcHJvdmlkZWQgTGluZXMgKi8KKyAgICAgICAgICBMTF9FWFRJX0VuYWJsZUlUXzMyXzYzKEVYVElfSW5pdFN0cnVjdC0+TGluZV8zMl82Myk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTExfRVhUSV9NT0RFX0VWRU5UOgorICAgICAgICAgIC8qIEZpcnN0IERpc2FibGUgSVQgb24gcHJvdmlkZWQgTGluZXMgKi8KKyAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVJVF8zMl82MyhFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMzJfNjMpOworICAgICAgICAgIC8qIFRoZW4gRW5hYmxlIEV2ZW50IG9uIHByb3ZpZGVkIExpbmVzICovCisgICAgICAgICAgTExfRVhUSV9FbmFibGVFdmVudF8zMl82MyhFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMzJfNjMpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExMX0VYVElfTU9ERV9JVF9FVkVOVDoKKyAgICAgICAgICAvKiBEaXJlY3RseSBFbmFibGUgSVQgJiBFdmVudCBvbiBwcm92aWRlZCBMaW5lcyAqLworICAgICAgICAgIExMX0VYVElfRW5hYmxlSVRfMzJfNjMoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzMyXzYzKTsKKyAgICAgICAgICBMTF9FWFRJX0VuYWJsZUV2ZW50XzMyXzYzKEVYVElfSW5pdFN0cnVjdC0+TGluZV8zMl82Myk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgc3RhdHVzID0gRVJST1I7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoRVhUSV9Jbml0U3RydWN0LT5UcmlnZ2VyICE9IExMX0VYVElfVFJJR0dFUl9OT05FKQorICAgICAgeworICAgICAgICBzd2l0Y2ggKEVYVElfSW5pdFN0cnVjdC0+VHJpZ2dlcikKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgTExfRVhUSV9UUklHR0VSX1JJU0lORzoKKyAgICAgICAgICAgIC8qIEZpcnN0IERpc2FibGUgRmFsbGluZyBUcmlnZ2VyIG9uIHByb3ZpZGVkIExpbmVzICovCisgICAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVGYWxsaW5nVHJpZ18zMl82MyhFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMzJfNjMpOworICAgICAgICAgICAgLyogVGhlbiBFbmFibGUgSVQgb24gcHJvdmlkZWQgTGluZXMgKi8KKyAgICAgICAgICAgIExMX0VYVElfRW5hYmxlUmlzaW5nVHJpZ18zMl82MyhFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMzJfNjMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBMTF9FWFRJX1RSSUdHRVJfRkFMTElORzoKKyAgICAgICAgICAgIC8qIEZpcnN0IERpc2FibGUgUmlzaW5nIFRyaWdnZXIgb24gcHJvdmlkZWQgTGluZXMgKi8KKyAgICAgICAgICAgIExMX0VYVElfRGlzYWJsZVJpc2luZ1RyaWdfMzJfNjMoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzMyXzYzKTsKKyAgICAgICAgICAgIC8qIFRoZW4gRW5hYmxlIEZhbGxpbmcgVHJpZ2dlciBvbiBwcm92aWRlZCBMaW5lcyAqLworICAgICAgICAgICAgTExfRVhUSV9FbmFibGVGYWxsaW5nVHJpZ18zMl82MyhFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMzJfNjMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBMTF9FWFRJX1RSSUdHRVJfUklTSU5HX0ZBTExJTkc6CisgICAgICAgICAgICBMTF9FWFRJX0VuYWJsZVJpc2luZ1RyaWdfMzJfNjMoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzMyXzYzKTsKKyAgICAgICAgICAgIExMX0VYVElfRW5hYmxlRmFsbGluZ1RyaWdfMzJfNjMoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzMyXzYzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzdGF0dXMgPSBFUlJPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorI2VuZGlmCisgIH0KKyAgLyogRElTQUJMRSBMaW5lQ29tbWFuZCAqLworICBlbHNlCisgIHsKKyAgICAvKiBEZS1jb25maWd1cmUgRVhUSSBMaW5lcyBpbiByYW5nZSBmcm9tIDAgdG8gMzEgKi8KKyAgICBMTF9FWFRJX0Rpc2FibGVJVF8wXzMxKEVYVElfSW5pdFN0cnVjdC0+TGluZV8wXzMxKTsKKyAgICBMTF9FWFRJX0Rpc2FibGVFdmVudF8wXzMxKEVYVElfSW5pdFN0cnVjdC0+TGluZV8wXzMxKTsKKyNpZiBkZWZpbmVkKEVYVElfMzJfNjNfU1VQUE9SVCkKKyAgICAvKiBEZS1jb25maWd1cmUgRVhUSSBMaW5lcyBpbiByYW5nZSBmcm9tIDMyIHRvIDYzICovCisgICAgTExfRVhUSV9EaXNhYmxlSVRfMzJfNjMoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzMyXzYzKTsKKyAgICBMTF9FWFRJX0Rpc2FibGVFdmVudF8zMl82MyhFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMzJfNjMpOworI2VuZGlmCisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgZWFjaCBAcmVmIExMX0VYVElfSW5pdFR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZS4KKyAgKiBAcGFyYW0gIEVYVElfSW5pdFN0cnVjdCBQb2ludGVyIHRvIGEgQHJlZiBMTF9FWFRJX0luaXRUeXBlRGVmIHN0cnVjdHVyZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfRVhUSV9TdHJ1Y3RJbml0KExMX0VYVElfSW5pdFR5cGVEZWYgKkVYVElfSW5pdFN0cnVjdCkKK3sKKyAgRVhUSV9Jbml0U3RydWN0LT5MaW5lXzBfMzEgICAgICA9IExMX0VYVElfTElORV9OT05FOworI2lmIGRlZmluZWQoRVhUSV8zMl82M19TVVBQT1JUKQorICBFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMzJfNjMgICAgID0gTExfRVhUSV9MSU5FX05PTkU7CisjZW5kaWYKKyAgRVhUSV9Jbml0U3RydWN0LT5MaW5lQ29tbWFuZCAgICA9IERJU0FCTEU7CisgIEVYVElfSW5pdFN0cnVjdC0+TW9kZSAgICAgICAgICAgPSBMTF9FWFRJX01PREVfSVQ7CisgIEVYVElfSW5pdFN0cnVjdC0+VHJpZ2dlciAgICAgICAgPSBMTF9FWFRJX1RSSUdHRVJfRkFMTElORzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIGRlZmluZWQgKEVYVEkpICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmYzeHhfbGxfZm1jLmMgYi9TcmMvc3RtMzJmM3h4X2xsX2ZtYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MjU5NzkKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJmM3h4X2xsX2ZtYy5jCkBAIC0wLDAgKzEsOTk3IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2xsX2ZtYy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBGTUMgTG93IExheWVyIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgRmxleGlibGUgTWVtb3J5IENvbnRyb2xsZXIgKEZNQykgcGVyaXBoZXJhbCBtZW1vcmllczoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEZNQyBwZXJpcGhlcmFsIGZlYXR1cmVzICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSBUaGUgRmxleGlibGUgbWVtb3J5IGNvbnRyb2xsZXIgKEZNQykgaW5jbHVkZXMgZm9sbG93aW5nIG1lbW9yeSBjb250cm9sbGVyczoKKyAgICAgICAgICgrKSBUaGUgTk9SL1BTUkFNIG1lbW9yeSBjb250cm9sbGVyCisgICAgICAgICAoKykgVGhlIFBDIENhcmQgbWVtb3J5IGNvbnRyb2xsZXIKKyAgICAgICAgICgrKSBUaGUgTkFORCBtZW1vcnkgY29udHJvbGxlcgorCisgICAgWy4uXSBUaGUgRk1DIGZ1bmN0aW9uYWwgYmxvY2sgbWFrZXMgdGhlIGludGVyZmFjZSB3aXRoIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgc3RhdGljCisgICAgICAgICBtZW1vcmllcyBhbmQgMTYtYml0IFBDIG1lbW9yeSBjYXJkcy4gSXRzIG1haW4gcHVycG9zZXMgYXJlOgorICAgICAgICAgKCspIHRvIHRyYW5zbGF0ZSBBSEIgdHJhbnNhY3Rpb25zIGludG8gdGhlIGFwcHJvcHJpYXRlIGV4dGVybmFsIGRldmljZSBwcm90b2NvbC4KKyAgICAgICAgICgrKSB0byBtZWV0IHRoZSBhY2Nlc3MgdGltZSByZXF1aXJlbWVudHMgb2YgdGhlIGV4dGVybmFsIG1lbW9yeSBkZXZpY2VzLgorCisgICAgWy4uXSBBbGwgZXh0ZXJuYWwgbWVtb3JpZXMgc2hhcmUgdGhlIGFkZHJlc3NlcywgZGF0YSBhbmQgY29udHJvbCBzaWduYWxzIHdpdGggdGhlIGNvbnRyb2xsZXIuCisgICAgICAgICBFYWNoIGV4dGVybmFsIGRldmljZSBpcyBhY2Nlc3NlZCBieSBtZWFucyBvZiBhIHVuaXF1ZSBDaGlwIFNlbGVjdC4gVGhlIEZNQyBwZXJmb3JtcworICAgICAgICAgb25seSBvbmUgYWNjZXNzIGF0IGEgdGltZSB0byBhbiBleHRlcm5hbCBkZXZpY2UuCisgICAgICAgICBUaGUgbWFpbiBmZWF0dXJlcyBvZiB0aGUgRk1DIGNvbnRyb2xsZXIgYXJlIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAgKCspIEludGVyZmFjZSB3aXRoIHN0YXRpYy1tZW1vcnkgbWFwcGVkIGRldmljZXMgaW5jbHVkaW5nOgorICAgICAgICAgICAgICgrKykgU3RhdGljIHJhbmRvbSBhY2Nlc3MgbWVtb3J5IChTUkFNKS4KKyAgICAgICAgICAgICAoKyspIE5PUiBGbGFzaCBtZW1vcnkuCisgICAgICAgICAgICAgKCsrKSBQU1JBTSAoNCBtZW1vcnkgYmFua3MpLgorICAgICAgICAgICAgICgrKykgMTYtYml0IFBDIENhcmQgY29tcGF0aWJsZSBkZXZpY2VzCisgICAgICAgICAgICAgKCsrKSBUd28gYmFua3Mgb2YgTkFORCBGbGFzaCBtZW1vcnkgd2l0aCBFQ0MgaGFyZHdhcmUgdG8gY2hlY2sgdXAgdG8gOCBLYnl0ZXMgb2YKKyAgICAgICAgICAgICAgICBkYXRhCisgICAgICAgICAgKCspIEluZGVwZW5kZW50IENoaXAgU2VsZWN0IGNvbnRyb2wgZm9yIGVhY2ggbWVtb3J5IGJhbmsKKyAgICAgICAgICAoKykgSW5kZXBlbmRlbnQgY29uZmlndXJhdGlvbiBmb3IgZWFjaCBtZW1vcnkgYmFuaworCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKEZNQ19CQU5LMSkKKworI2lmIGRlZmluZWQoSEFMX1NSQU1fTU9EVUxFX0VOQUJMRUQpIHx8IGRlZmluZWQoSEFMX05PUl9NT0RVTEVfRU5BQkxFRCkgfHwgZGVmaW5lZChIQUxfUENDQVJEX01PRFVMRV9FTkFCTEVEKSB8fCBkZWZpbmVkKEhBTF9OQU5EX01PRFVMRV9FTkFCTEVEKQorCisvKiogQGRlZmdyb3VwIEZNQ19MTCBGTUMgTG93IExheWVyCisgICogQGJyaWVmIEZNQyBkcml2ZXIgbW9kdWxlcworICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBGTUNfTExfUHJpdmF0ZV9Db25zdGFudHMgRk1DIExvdyBMYXllciBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZNQyByZWdpc3RlcnMgYml0IG1hc2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0gUENSIFJlZ2lzdGVyIC0tLSovCisvKiBQQ1IgcmVnaXN0ZXIgY2xlYXIgbWFzayAqLworI2RlZmluZSBQQ1JfQ0xFQVJfTUFTSyAgICAoKHVpbnQzMl90KShGTUNfUENSeF9QV0FJVEVOIHwgRk1DX1BDUnhfUEJLRU4gIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTUNfUENSeF9QVFlQICAgIHwgRk1DX1BDUnhfUFdJRCAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTUNfUENSeF9FQ0NFTiAgIHwgRk1DX1BDUnhfVENMUiAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTUNfUENSeF9UQVIgICAgIHwgRk1DX1BDUnhfRUNDUFMpKQorCisvKiAtLS0gUE1FTSBSZWdpc3RlciAtLS0qLworLyogUE1FTSByZWdpc3RlciBjbGVhciBtYXNrICovCisjZGVmaW5lIFBNRU1fQ0xFQVJfTUFTSyAgICgodWludDMyX3QpKEZNQ19QTUVNeF9NRU1TRVR4ICB8IEZNQ19QTUVNeF9NRU1XQUlUeCB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTUNfUE1FTXhfTUVNSE9MRHggfCBGTUNfUE1FTXhfTUVNSElaeCkpCisKKy8qIC0tLSBQQVRUIFJlZ2lzdGVyIC0tLSovCisvKiBQQVRUIHJlZ2lzdGVyIGNsZWFyIG1hc2sgKi8KKyNkZWZpbmUgUEFUVF9DTEVBUl9NQVNLICAgKCh1aW50MzJfdCkoRk1DX1BBVFR4X0FUVFNFVHggIHwgRk1DX1BBVFR4X0FUVFdBSVR4IHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZNQ19QQVRUeF9BVFRIT0xEeCB8IEZNQ19QQVRUeF9BVFRISVp4KSkKKworLyogLS0tIEJDUiBSZWdpc3RlciAtLS0qLworLyogQkNSIHJlZ2lzdGVyIGNsZWFyIG1hc2sgKi8KKyNkZWZpbmUgQkNSX0NMRUFSX01BU0sgICAgICAgICAgICAgICAgICgodWludDMyX3QpKEZNQ19CQ1J4X01CS0VOICAgICB8IEZNQ19CQ1J4X01VWEVOICAgIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTUNfQkNSeF9NVFlQICAgICAgfCBGTUNfQkNSeF9NV0lEICAgICB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk1DX0JDUnhfRkFDQ0VOICAgIHwgRk1DX0JDUnhfQlVSU1RFTiAgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZNQ19CQ1J4X1dBSVRQT0wgICB8IEZNQ19CQ1J4X1dSQVBNT0QgIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTUNfQkNSeF9XQUlUQ0ZHICAgfCBGTUNfQkNSeF9XUkVOICAgICB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk1DX0JDUnhfV0FJVEVOICAgIHwgRk1DX0JDUnhfRVhUTU9EICAgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZNQ19CQ1J4X0FTWU5DV0FJVCB8IEZNQ19CQ1J4X0NCVVJTVFJXIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTUNfQkNSMV9DQ0xLRU4pKQorCisvKiAtLS0gQlRSIFJlZ2lzdGVyIC0tLSovCisvKiBCVFIgcmVnaXN0ZXIgY2xlYXIgbWFzayAqLworI2RlZmluZSBCVFJfQ0xFQVJfTUFTSyAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoRk1DX0JUUnhfQUREU0VUIHwgRk1DX0JUUnhfQURESExEICB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk1DX0JUUnhfREFUQVNUIHwgRk1DX0JUUnhfQlVTVFVSTiB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk1DX0JUUnhfQ0xLRElWIHwgRk1DX0JUUnhfREFUTEFUICB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk1DX0JUUnhfQUNDTU9EKSkKKworLyogLS0tIEJXVFIgUmVnaXN0ZXIgLS0tKi8KKy8qIEJXVFIgcmVnaXN0ZXIgY2xlYXIgbWFzayAqLworI2RlZmluZSBCV1RSX0NMRUFSX01BU0sgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoRk1DX0JXVFJ4X0FERFNFVCB8IEZNQ19CV1RSeF9BRERITEQgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZNQ19CV1RSeF9EQVRBU1QgfCBGTUNfQldUUnhfQUNDTU9EKSkKKworLyogLS0tIFBJTzQgUmVnaXN0ZXIgLS0tKi8KKy8qIFBJTzQgcmVnaXN0ZXIgY2xlYXIgbWFzayAqLworI2RlZmluZSBQSU80X0NMRUFSX01BU0sgICAoKHVpbnQzMl90KShGTUNfUElPNF9JT1NFVDQgICAgfCBGTUNfUElPNF9JT1dBSVQ0ICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZNQ19QSU80X0lPSE9MRDQgICB8IEZNQ19QSU80X0lPSElaNCkpCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBGTUNfTExfUHJpdmF0ZV9NYWNyb3MgRk1DIExvdyBMYXllciBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBGTUNfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIEZNQyBMb3cgTGF5ZXIgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBGTUNfTk9SU1JBTSBGTUMgTk9SU1JBTSBDb250cm9sbGVyIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBOT1JTUkFNIENvbnRyb2xsZXIgZnVuY3Rpb25zCisgICoKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgTk9SU1JBTSBkZXZpY2UgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIFsuLl0KKyAgICBUaGlzIGRyaXZlciBjb250YWlucyBhIHNldCBvZiBBUElzIHRvIGludGVyZmFjZSB3aXRoIHRoZSBGTUMgTk9SU1JBTSBiYW5rcyBpbiBvcmRlcgorICAgIHRvIHJ1biB0aGUgTk9SU1JBTSBleHRlcm5hbCBkZXZpY2VzLgorCisgICAgKCspIEZNQyBOT1JTUkFNIGJhbmsgcmVzZXQgdXNpbmcgdGhlIGZ1bmN0aW9uIEZNQ19OT1JTUkFNX0RlSW5pdCgpCisgICAgKCspIEZNQyBOT1JTUkFNIGJhbmsgY29udHJvbCBjb25maWd1cmF0aW9uIHVzaW5nIHRoZSBmdW5jdGlvbiBGTUNfTk9SU1JBTV9Jbml0KCkKKyAgICAoKykgRk1DIE5PUlNSQU0gYmFuayB0aW1pbmcgY29uZmlndXJhdGlvbiB1c2luZyB0aGUgZnVuY3Rpb24gRk1DX05PUlNSQU1fVGltaW5nX0luaXQoKQorICAgICgrKSBGTUMgTk9SU1JBTSBiYW5rIGV4dGVuZGVkIHRpbWluZyBjb25maWd1cmF0aW9uIHVzaW5nIHRoZSBmdW5jdGlvbgorICAgICAgICBGTUNfTk9SU1JBTV9FeHRlbmRlZF9UaW1pbmdfSW5pdCgpCisgICAgKCspIEZNQyBOT1JTUkFNIGJhbmsgZW5hYmxlL2Rpc2FibGUgd3JpdGUgb3BlcmF0aW9uIHVzaW5nIHRoZSBmdW5jdGlvbnMKKyAgICAgICAgRk1DX05PUlNSQU1fV3JpdGVPcGVyYXRpb25fRW5hYmxlKCkvRk1DX05PUlNSQU1fV3JpdGVPcGVyYXRpb25fRGlzYWJsZSgpCisKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBGTUNfTk9SU1JBTV9Hcm91cDEgSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlX2luaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgKCspIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSB0aGUgRk1DIE5PUlNSQU0gaW50ZXJmYWNlCisgICAgKCspIERlLWluaXRpYWxpemUgdGhlIEZNQyBOT1JTUkFNIGludGVyZmFjZQorICAgICgrKSBDb25maWd1cmUgdGhlIEZNQyBjbG9jayBhbmQgYXNzb2NpYXRlZCBHUElPcworCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIEZNQ19OT1JTUkFNIGRldmljZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgY29udHJvbCBwYXJhbWV0ZXJzIGluIHRoZSBGTUNfTk9SU1JBTV9Jbml0VHlwZURlZgorICAqIEBwYXJhbSAgRGV2aWNlIFBvaW50ZXIgdG8gTk9SU1JBTSBkZXZpY2UgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEluaXQgUG9pbnRlciB0byBOT1JTUkFNIEluaXRpYWxpemF0aW9uIHN0cnVjdHVyZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgIEZNQ19OT1JTUkFNX0luaXQoRk1DX05PUlNSQU1fVHlwZURlZiAqRGV2aWNlLCBGTUNfTk9SU1JBTV9Jbml0VHlwZURlZiAqSW5pdCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19OT1JTUkFNX0RFVklDRShEZXZpY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19OT1JTUkFNX0JBTksoSW5pdC0+TlNCYW5rKSk7CisgIGFzc2VydF9wYXJhbShJU19GTUNfTVVYKEluaXQtPkRhdGFBZGRyZXNzTXV4KSk7CisgIGFzc2VydF9wYXJhbShJU19GTUNfTUVNT1JZKEluaXQtPk1lbW9yeVR5cGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19OT1JTUkFNX01FTU9SWV9XSURUSChJbml0LT5NZW1vcnlEYXRhV2lkdGgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19CVVJTVE1PREUoSW5pdC0+QnVyc3RBY2Nlc3NNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19GTUNfV0FJVF9QT0xBUklUWShJbml0LT5XYWl0U2lnbmFsUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19XUkFQX01PREUoSW5pdC0+V3JhcE1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19XQUlUX1NJR05BTF9BQ1RJVkUoSW5pdC0+V2FpdFNpZ25hbEFjdGl2ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRk1DX1dSSVRFX09QRVJBVElPTihJbml0LT5Xcml0ZU9wZXJhdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfRk1DX1dBSVRFX1NJR05BTChJbml0LT5XYWl0U2lnbmFsKSk7CisgIGFzc2VydF9wYXJhbShJU19GTUNfRVhURU5ERURfTU9ERShJbml0LT5FeHRlbmRlZE1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19BU1lOV0FJVChJbml0LT5Bc3luY2hyb25vdXNXYWl0KSk7CisgIGFzc2VydF9wYXJhbShJU19GTUNfV1JJVEVfQlVSU1QoSW5pdC0+V3JpdGVCdXJzdCkpOworICBhc3NlcnRfcGFyYW0oSVNfRk1DX0NPTlRJTk9VU19DTE9DSyhJbml0LT5Db250aW51b3VzQ2xvY2spKTsKKworICAvKiBEaXNhYmxlIE5PUlNSQU0gRGV2aWNlICovCisgIF9fRk1DX05PUlNSQU1fRElTQUJMRShEZXZpY2UsIEluaXQtPk5TQmFuayk7CisKKyAgLyogU2V0IE5PUlNSQU0gZGV2aWNlIGNvbnRyb2wgcGFyYW1ldGVycyAqLworICBpZiAoSW5pdC0+TWVtb3J5VHlwZSA9PSBGTUNfTUVNT1JZX1RZUEVfTk9SKQorICB7CisgICAgTU9ESUZZX1JFRyhEZXZpY2UtPkJUQ1JbSW5pdC0+TlNCYW5rXSwgQkNSX0NMRUFSX01BU0ssICh1aW50MzJfdCkoRk1DX05PUlNSQU1fRkxBU0hfQUNDRVNTX0VOQUJMRQorICAgICAgICAgICAgICAgfCBJbml0LT5EYXRhQWRkcmVzc011eAorICAgICAgICAgICAgICAgfCBJbml0LT5NZW1vcnlUeXBlCisgICAgICAgICAgICAgICB8IEluaXQtPk1lbW9yeURhdGFXaWR0aAorICAgICAgICAgICAgICAgfCBJbml0LT5CdXJzdEFjY2Vzc01vZGUKKyAgICAgICAgICAgICAgIHwgSW5pdC0+V2FpdFNpZ25hbFBvbGFyaXR5CisgICAgICAgICAgICAgICB8IEluaXQtPldyYXBNb2RlCisgICAgICAgICAgICAgICB8IEluaXQtPldhaXRTaWduYWxBY3RpdmUKKyAgICAgICAgICAgICAgIHwgSW5pdC0+V3JpdGVPcGVyYXRpb24KKyAgICAgICAgICAgICAgIHwgSW5pdC0+V2FpdFNpZ25hbAorICAgICAgICAgICAgICAgfCBJbml0LT5FeHRlbmRlZE1vZGUKKyAgICAgICAgICAgICAgIHwgSW5pdC0+QXN5bmNocm9ub3VzV2FpdAorICAgICAgICAgICAgICAgfCBJbml0LT5Xcml0ZUJ1cnN0CisgICAgICAgICAgICAgICB8IEluaXQtPkNvbnRpbnVvdXNDbG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICApOworICB9CisgIGVsc2UKKyAgeworICAgIE1PRElGWV9SRUcoRGV2aWNlLT5CVENSW0luaXQtPk5TQmFua10sIEJDUl9DTEVBUl9NQVNLLCAodWludDMyX3QpKEZNQ19OT1JTUkFNX0ZMQVNIX0FDQ0VTU19ESVNBQkxFCisgICAgICAgICAgICAgICB8IEluaXQtPkRhdGFBZGRyZXNzTXV4CisgICAgICAgICAgICAgICB8IEluaXQtPk1lbW9yeVR5cGUKKyAgICAgICAgICAgICAgIHwgSW5pdC0+TWVtb3J5RGF0YVdpZHRoCisgICAgICAgICAgICAgICB8IEluaXQtPkJ1cnN0QWNjZXNzTW9kZQorICAgICAgICAgICAgICAgfCBJbml0LT5XYWl0U2lnbmFsUG9sYXJpdHkKKyAgICAgICAgICAgICAgIHwgSW5pdC0+V3JhcE1vZGUKKyAgICAgICAgICAgICAgIHwgSW5pdC0+V2FpdFNpZ25hbEFjdGl2ZQorICAgICAgICAgICAgICAgfCBJbml0LT5Xcml0ZU9wZXJhdGlvbgorICAgICAgICAgICAgICAgfCBJbml0LT5XYWl0U2lnbmFsCisgICAgICAgICAgICAgICB8IEluaXQtPkV4dGVuZGVkTW9kZQorICAgICAgICAgICAgICAgfCBJbml0LT5Bc3luY2hyb25vdXNXYWl0CisgICAgICAgICAgICAgICB8IEluaXQtPldyaXRlQnVyc3QKKyAgICAgICAgICAgICAgIHwgSW5pdC0+Q29udGludW91c0Nsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICk7CisgIH0KKworICAvKiBDb25maWd1cmUgc3luY2hyb25vdXMgbW9kZSB3aGVuIENvbnRpbnVvdXMgY2xvY2sgaXMgZW5hYmxlZCBmb3IgYmFuazIuLjQgKi8KKyAgaWYgKChJbml0LT5Db250aW51b3VzQ2xvY2sgPT0gRk1DX0NPTlRJTlVPVVNfQ0xPQ0tfU1lOQ19BU1lOQykgJiYgKEluaXQtPk5TQmFuayAhPSBGTUNfTk9SU1JBTV9CQU5LMSkpCisgIHsKKyAgICBNT0RJRllfUkVHKERldmljZS0+QlRDUltGTUNfTk9SU1JBTV9CQU5LMV0sIEZNQ19CQ1IxX0NDTEtFTiwgSW5pdC0+Q29udGludW91c0Nsb2NrKTsKKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIEZNQ19OT1JTUkFNIHBlcmlwaGVyYWwKKyAgKiBAcGFyYW0gIERldmljZSBQb2ludGVyIHRvIE5PUlNSQU0gZGV2aWNlIGluc3RhbmNlCisgICogQHBhcmFtICBFeERldmljZSBQb2ludGVyIHRvIE5PUlNSQU0gZXh0ZW5kZWQgbW9kZSBkZXZpY2UgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEJhbmsgTk9SU1JBTSBiYW5rIG51bWJlcgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgRk1DX05PUlNSQU1fRGVJbml0KEZNQ19OT1JTUkFNX1R5cGVEZWYgKkRldmljZSwgRk1DX05PUlNSQU1fRVhURU5ERURfVHlwZURlZiAqRXhEZXZpY2UsIHVpbnQzMl90IEJhbmspCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19GTUNfTk9SU1JBTV9ERVZJQ0UoRGV2aWNlKSk7CisgIGFzc2VydF9wYXJhbShJU19GTUNfTk9SU1JBTV9FWFRFTkRFRF9ERVZJQ0UoRXhEZXZpY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19OT1JTUkFNX0JBTksoQmFuaykpOworCisgIC8qIERpc2FibGUgdGhlIEZNQ19OT1JTUkFNIGRldmljZSAqLworICBfX0ZNQ19OT1JTUkFNX0RJU0FCTEUoRGV2aWNlLCBCYW5rKTsKKworICAvKiBEZS1pbml0aWFsaXplIHRoZSBGTUNfTk9SU1JBTSBkZXZpY2UgKi8KKyAgLyogRk1DX05PUlNSQU1fQkFOSzEgKi8KKyAgaWYgKEJhbmsgPT0gRk1DX05PUlNSQU1fQkFOSzEpCisgIHsKKyAgICBEZXZpY2UtPkJUQ1JbQmFua10gPSAweDAwMDAzMERCOworICB9CisgIC8qIEZNQ19OT1JTUkFNX0JBTksyLCBGTUNfTk9SU1JBTV9CQU5LMyBvciBGTUNfTk9SU1JBTV9CQU5LNCAqLworICBlbHNlCisgIHsKKyAgICBEZXZpY2UtPkJUQ1JbQmFua10gPSAweDAwMDAzMEQyOworICB9CisKKyAgRGV2aWNlLT5CVENSW0JhbmsgKyAxXSA9IDB4MEZGRkZGRkY7CisgIEV4RGV2aWNlLT5CV1RSW0JhbmtdICAgPSAweDBGRkZGRkZGOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBGTUNfTk9SU1JBTSBUaW1pbmcgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIEZNQ19OT1JTUkFNX1RpbWluZ1R5cGVEZWYKKyAgKiBAcGFyYW0gIERldmljZSBQb2ludGVyIHRvIE5PUlNSQU0gZGV2aWNlIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1pbmcgUG9pbnRlciB0byBOT1JTUkFNIFRpbWluZyBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gIEJhbmsgTk9SU1JBTSBiYW5rIG51bWJlcgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgRk1DX05PUlNSQU1fVGltaW5nX0luaXQoRk1DX05PUlNSQU1fVHlwZURlZiAqRGV2aWNlLCBGTUNfTk9SU1JBTV9UaW1pbmdUeXBlRGVmICpUaW1pbmcsIHVpbnQzMl90IEJhbmspCit7CisgIHVpbnQzMl90IHRtcHIgPSAwOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19GTUNfTk9SU1JBTV9ERVZJQ0UoRGV2aWNlKSk7CisgIGFzc2VydF9wYXJhbShJU19GTUNfQUREUkVTU19TRVRVUF9USU1FKFRpbWluZy0+QWRkcmVzc1NldHVwVGltZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRk1DX0FERFJFU1NfSE9MRF9USU1FKFRpbWluZy0+QWRkcmVzc0hvbGRUaW1lKSk7CisgIGFzc2VydF9wYXJhbShJU19GTUNfREFUQVNFVFVQX1RJTUUoVGltaW5nLT5EYXRhU2V0dXBUaW1lKSk7CisgIGFzc2VydF9wYXJhbShJU19GTUNfVFVSTkFST1VORF9USU1FKFRpbWluZy0+QnVzVHVybkFyb3VuZER1cmF0aW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19GTUNfQ0xLX0RJVihUaW1pbmctPkNMS0RpdmlzaW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19GTUNfREFUQV9MQVRFTkNZKFRpbWluZy0+RGF0YUxhdGVuY3kpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19BQ0NFU1NfTU9ERShUaW1pbmctPkFjY2Vzc01vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19OT1JTUkFNX0JBTksoQmFuaykpOworCisgIC8qIFNldCBGTUNfTk9SU1JBTSBkZXZpY2UgdGltaW5nIHBhcmFtZXRlcnMgKi8KKyAgTU9ESUZZX1JFRyhEZXZpY2UtPkJUQ1JbQmFuayArIDFdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgQlRSX0NMRUFSX01BU0ssICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICh1aW50MzJfdCkoVGltaW5nLT5BZGRyZXNzU2V0dXBUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoVGltaW5nLT5BZGRyZXNzSG9sZFRpbWUpICAgICAgICA8PCBQT1NJVElPTl9WQUwoRk1DX0JUUnhfQURESExEKSkgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgKChUaW1pbmctPkRhdGFTZXR1cFRpbWUpICAgICAgICAgIDw8IFBPU0lUSU9OX1ZBTChGTUNfQlRSeF9EQVRBU1QpKSAgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAoKFRpbWluZy0+QnVzVHVybkFyb3VuZER1cmF0aW9uKSAgPDwgUE9TSVRJT05fVkFMKEZNQ19CVFJ4X0JVU1RVUk4pKSAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKFRpbWluZy0+Q0xLRGl2aXNpb24pIC0gMSkgICAgICAgIDw8IFBPU0lUSU9OX1ZBTChGTUNfQlRSeF9DTEtESVYpKSAgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAoKChUaW1pbmctPkRhdGFMYXRlbmN5KSAtIDIpICAgICAgICA8PCBQT1NJVElPTl9WQUwoRk1DX0JUUnhfREFUTEFUKSkgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgKFRpbWluZy0+QWNjZXNzTW9kZSkpKTsKKworICAvKiBDb25maWd1cmUgQ2xvY2sgZGl2aXNpb24gdmFsdWUgKGluIE5PUlNSQU0gYmFuayAxKSB3aGVuIGNvbnRpbnVvdXMgY2xvY2sgaXMgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoRGV2aWNlLT5CVENSW0ZNQ19OT1JTUkFNX0JBTksxXSwgRk1DX0JDUjFfQ0NMS0VOKSkKKyAgeworICAgIHRtcHIgPSAodWludDMyX3QpKERldmljZS0+QlRDUltGTUNfTk9SU1JBTV9CQU5LMSArIDFdICYgfigoKHVpbnQzMl90KTB4MEYpIDw8IFBPU0lUSU9OX1ZBTChGTUNfQlRSeF9DTEtESVYpKSk7CisgICAgdG1wciB8PSAodWludDMyX3QpKCgoVGltaW5nLT5DTEtEaXZpc2lvbikgLSAxKSA8PCBQT1NJVElPTl9WQUwoRk1DX0JUUnhfQ0xLRElWKSk7CisgICAgTU9ESUZZX1JFRyhEZXZpY2UtPkJUQ1JbRk1DX05PUlNSQU1fQkFOSzEgKyAxXSwgRk1DX0JUUnhfQ0xLRElWLCB0bXByKTsKKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgRk1DX05PUlNSQU0gRXh0ZW5kZWQgbW9kZSBUaW1pbmcgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIEZNQ19OT1JTUkFNX1RpbWluZ1R5cGVEZWYKKyAgKiBAcGFyYW0gIERldmljZSBQb2ludGVyIHRvIE5PUlNSQU0gZGV2aWNlIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1pbmcgUG9pbnRlciB0byBOT1JTUkFNIFRpbWluZyBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gIEJhbmsgTk9SU1JBTSBiYW5rIG51bWJlcgorICAqIEBwYXJhbSAgRXh0ZW5kZWRNb2RlIEZNQyBFeHRlbmRlZCBNb2RlCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgRk1DX0VYVEVOREVEX01PREVfRElTQUJMRQorICAqICAgICAgICAgICAgQGFyZyBGTUNfRVhURU5ERURfTU9ERV9FTkFCTEUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmICBGTUNfTk9SU1JBTV9FeHRlbmRlZF9UaW1pbmdfSW5pdChGTUNfTk9SU1JBTV9FWFRFTkRFRF9UeXBlRGVmICpEZXZpY2UsIEZNQ19OT1JTUkFNX1RpbWluZ1R5cGVEZWYgKlRpbWluZywgdWludDMyX3QgQmFuaywgdWludDMyX3QgRXh0ZW5kZWRNb2RlKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRk1DX0VYVEVOREVEX01PREUoRXh0ZW5kZWRNb2RlKSk7CisKKyAgLyogU2V0IE5PUlNSQU0gZGV2aWNlIHRpbWluZyByZWdpc3RlciBmb3Igd3JpdGUgY29uZmlndXJhdGlvbiwgaWYgZXh0ZW5kZWQgbW9kZSBpcyB1c2VkICovCisgIGlmIChFeHRlbmRlZE1vZGUgPT0gRk1DX0VYVEVOREVEX01PREVfRU5BQkxFKQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfRk1DX05PUlNSQU1fRVhURU5ERURfREVWSUNFKERldmljZSkpOworICAgIGFzc2VydF9wYXJhbShJU19GTUNfQUREUkVTU19TRVRVUF9USU1FKFRpbWluZy0+QWRkcmVzc1NldHVwVGltZSkpOworICAgIGFzc2VydF9wYXJhbShJU19GTUNfQUREUkVTU19IT0xEX1RJTUUoVGltaW5nLT5BZGRyZXNzSG9sZFRpbWUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfRk1DX0RBVEFTRVRVUF9USU1FKFRpbWluZy0+RGF0YVNldHVwVGltZSkpOworICAgIGFzc2VydF9wYXJhbShJU19GTUNfQUNDRVNTX01PREUoVGltaW5nLT5BY2Nlc3NNb2RlKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19OT1JTUkFNX0JBTksoQmFuaykpOworCisgICAgLyogU2V0IE5PUlNSQU0gZGV2aWNlIHRpbWluZyByZWdpc3RlciBmb3Igd3JpdGUgY29uZmlndXJhdGlvbiwgaWYgZXh0ZW5kZWQgbW9kZSBpcyB1c2VkICovCisgICAgTU9ESUZZX1JFRyhEZXZpY2UtPkJXVFJbQmFua10sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBCV1RSX0NMRUFSX01BU0ssICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAodWludDMyX3QpKFRpbWluZy0+QWRkcmVzc1NldHVwVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICgoVGltaW5nLT5BZGRyZXNzSG9sZFRpbWUpICAgICAgICA8PCBQT1NJVElPTl9WQUwoRk1DX0JXVFJ4X0FEREhMRCkpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRpbWluZy0+RGF0YVNldHVwVGltZSkgICAgICAgICAgPDwgUE9TSVRJT05fVkFMKEZNQ19CV1RSeF9EQVRBU1QpKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKFRpbWluZy0+QWNjZXNzTW9kZSkpKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBEZXZpY2UtPkJXVFJbQmFua10gPSAweDBGRkZGRkZGOworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgRk1DX05PUlNSQU1fR3JvdXAyIENvbnRyb2wgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgbWFuYWdlbWVudCBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgRk1DX05PUlNSQU0gQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbnRyb2wgZHluYW1pY2FsbHkKKyAgICB0aGUgRk1DIE5PUlNSQU0gaW50ZXJmYWNlLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgZHluYW1pY2FsbHkgRk1DX05PUlNSQU0gd3JpdGUgb3BlcmF0aW9uLgorICAqIEBwYXJhbSAgRGV2aWNlIFBvaW50ZXIgdG8gTk9SU1JBTSBkZXZpY2UgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEJhbmsgTk9SU1JBTSBiYW5rIG51bWJlcgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgRk1DX05PUlNSQU1fV3JpdGVPcGVyYXRpb25fRW5hYmxlKEZNQ19OT1JTUkFNX1R5cGVEZWYgKkRldmljZSwgdWludDMyX3QgQmFuaykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19OT1JTUkFNX0RFVklDRShEZXZpY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19OT1JTUkFNX0JBTksoQmFuaykpOworCisgIC8qIEVuYWJsZSB3cml0ZSBvcGVyYXRpb24gKi8KKyAgU0VUX0JJVChEZXZpY2UtPkJUQ1JbQmFua10sIEZNQ19XUklURV9PUEVSQVRJT05fRU5BQkxFKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGVzIGR5bmFtaWNhbGx5IEZNQ19OT1JTUkFNIHdyaXRlIG9wZXJhdGlvbi4KKyAgKiBAcGFyYW0gIERldmljZSBQb2ludGVyIHRvIE5PUlNSQU0gZGV2aWNlIGluc3RhbmNlCisgICogQHBhcmFtICBCYW5rIE5PUlNSQU0gYmFuayBudW1iZXIKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEZNQ19OT1JTUkFNX1dyaXRlT3BlcmF0aW9uX0Rpc2FibGUoRk1DX05PUlNSQU1fVHlwZURlZiAqRGV2aWNlLCB1aW50MzJfdCBCYW5rKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRk1DX05PUlNSQU1fREVWSUNFKERldmljZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRk1DX05PUlNSQU1fQkFOSyhCYW5rKSk7CisKKyAgLyogRGlzYWJsZSB3cml0ZSBvcGVyYXRpb24gKi8KKyAgQ0xFQVJfQklUKERldmljZS0+QlRDUltCYW5rXSwgRk1DX1dSSVRFX09QRVJBVElPTl9FTkFCTEUpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisvKiogQGRlZmdyb3VwIEZNQ19OQU5EIEZNQyBOQU5EIENvbnRyb2xsZXIgZnVuY3Rpb25zCisgICogQGJyaWVmICAgIE5BTkQgQ29udHJvbGxlciBmdW5jdGlvbnMKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgTkFORCBkZXZpY2UgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhpcyBkcml2ZXIgY29udGFpbnMgYSBzZXQgb2YgQVBJcyB0byBpbnRlcmZhY2Ugd2l0aCB0aGUgRk1DIE5BTkQgYmFua3MgaW4gb3JkZXIKKyAgICB0byBydW4gdGhlIE5BTkQgZXh0ZXJuYWwgZGV2aWNlcy4KKworICAgICgrKSBGTUMgTkFORCBiYW5rIHJlc2V0IHVzaW5nIHRoZSBmdW5jdGlvbiBGTUNfTkFORF9EZUluaXQoKQorICAgICgrKSBGTUMgTkFORCBiYW5rIGNvbnRyb2wgY29uZmlndXJhdGlvbiB1c2luZyB0aGUgZnVuY3Rpb24gRk1DX05BTkRfSW5pdCgpCisgICAgKCspIEZNQyBOQU5EIGJhbmsgY29tbW9uIHNwYWNlIHRpbWluZyBjb25maWd1cmF0aW9uIHVzaW5nIHRoZSBmdW5jdGlvbgorICAgICAgICBGTUNfTkFORF9Db21tb25TcGFjZV9UaW1pbmdfSW5pdCgpCisgICAgKCspIEZNQyBOQU5EIGJhbmsgYXR0cmlidXRlIHNwYWNlIHRpbWluZyBjb25maWd1cmF0aW9uIHVzaW5nIHRoZSBmdW5jdGlvbgorICAgICAgICBGTUNfTkFORF9BdHRyaWJ1dGVTcGFjZV9UaW1pbmdfSW5pdCgpCisgICAgKCspIEZNQyBOQU5EIGJhbmsgZW5hYmxlL2Rpc2FibGUgRUNDIGNvcnJlY3Rpb24gZmVhdHVyZSB1c2luZyB0aGUgZnVuY3Rpb25zCisgICAgICAgIEZNQ19OQU5EX0VDQ19FbmFibGUoKS9GTUNfTkFORF9FQ0NfRGlzYWJsZSgpCisgICAgKCspIEZNQyBOQU5EIGJhbmsgZ2V0IEVDQyBjb3JyZWN0aW9uIGNvZGUgdXNpbmcgdGhlIGZ1bmN0aW9uIEZNQ19OQU5EX0dldEVDQygpCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRk1DX05BTkRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlX2luaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgKCspIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSB0aGUgRk1DIE5BTkQgaW50ZXJmYWNlCisgICAgKCspIERlLWluaXRpYWxpemUgdGhlIEZNQyBOQU5EIGludGVyZmFjZQorICAgICgrKSBDb25maWd1cmUgdGhlIEZNQyBjbG9jayBhbmQgYXNzb2NpYXRlZCBHUElPcworCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBGTUNfTkFORCBkZXZpY2UgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIGNvbnRyb2wgcGFyYW1ldGVycyBpbiB0aGUgRk1DX05BTkRfSGFuZGxlVHlwZURlZgorICAqIEBwYXJhbSAgRGV2aWNlIFBvaW50ZXIgdG8gTkFORCBkZXZpY2UgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEluaXQgUG9pbnRlciB0byBOQU5EIEluaXRpYWxpemF0aW9uIHN0cnVjdHVyZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgRk1DX05BTkRfSW5pdChGTUNfTkFORF9UeXBlRGVmICpEZXZpY2UsIEZNQ19OQU5EX0luaXRUeXBlRGVmICpJbml0KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRk1DX05BTkRfREVWSUNFKERldmljZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRk1DX05BTkRfQkFOSyhJbml0LT5OYW5kQmFuaykpOworICBhc3NlcnRfcGFyYW0oSVNfRk1DX1dBSVRfRkVBVFVSRShJbml0LT5XYWl0ZmVhdHVyZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRk1DX05BTkRfTUVNT1JZX1dJRFRIKEluaXQtPk1lbW9yeURhdGFXaWR0aCkpOworICBhc3NlcnRfcGFyYW0oSVNfRk1DX0VDQ19TVEFURShJbml0LT5FY2NDb21wdXRhdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfRk1DX0VDQ1BBR0VfU0laRShJbml0LT5FQ0NQYWdlU2l6ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRk1DX1RDTFJfVElNRShJbml0LT5UQ0xSU2V0dXBUaW1lKSk7CisgIGFzc2VydF9wYXJhbShJU19GTUNfVEFSX1RJTUUoSW5pdC0+VEFSU2V0dXBUaW1lKSk7CisKKyAgLyogU2V0IE5BTkQgZGV2aWNlIGNvbnRyb2wgcGFyYW1ldGVycyAqLworICBpZiAoSW5pdC0+TmFuZEJhbmsgPT0gRk1DX05BTkRfQkFOSzIpCisgIHsKKyAgICAvKiBOQU5EIGJhbmsgMiByZWdpc3RlcnMgY29uZmlndXJhdGlvbiAqLworICAgIE1PRElGWV9SRUcoRGV2aWNlLT5QQ1IyLCBQQ1JfQ0xFQVJfTUFTSywgKEluaXQtPldhaXRmZWF0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTUNfUENSX01FTU9SWV9UWVBFX05BTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbml0LT5NZW1vcnlEYXRhV2lkdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdC0+RWNjQ29tcHV0YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluaXQtPkVDQ1BhZ2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEluaXQtPlRDTFJTZXR1cFRpbWUpIDw8IFBPU0lUSU9OX1ZBTChGTUNfUENSeF9UQ0xSKSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSW5pdC0+VEFSU2V0dXBUaW1lKSA8PCBQT1NJVElPTl9WQUwoRk1DX1BDUnhfVEFSKSkpKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBOQU5EIGJhbmsgMyByZWdpc3RlcnMgY29uZmlndXJhdGlvbiAqLworICAgIE1PRElGWV9SRUcoRGV2aWNlLT5QQ1IzLCBQQ1JfQ0xFQVJfTUFTSywgKEluaXQtPldhaXRmZWF0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTUNfUENSX01FTU9SWV9UWVBFX05BTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbml0LT5NZW1vcnlEYXRhV2lkdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdC0+RWNjQ29tcHV0YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluaXQtPkVDQ1BhZ2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEluaXQtPlRDTFJTZXR1cFRpbWUpIDw8IFBPU0lUSU9OX1ZBTChGTUNfUENSeF9UQ0xSKSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSW5pdC0+VEFSU2V0dXBUaW1lKSA8PCBQT1NJVElPTl9WQUwoRk1DX1BDUnhfVEFSKSkpKTsKKyAgfQorCisgIHJldHVybiBIQUxfT0s7CisKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgRk1DX05BTkQgQ29tbW9uIHNwYWNlIFRpbWluZyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgRk1DX05BTkRfUENDX1RpbWluZ1R5cGVEZWYKKyAgKiBAcGFyYW0gIERldmljZSBQb2ludGVyIHRvIE5BTkQgZGV2aWNlIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1pbmcgUG9pbnRlciB0byBOQU5EIHRpbWluZyBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gIEJhbmsgTkFORCBiYW5rIG51bWJlcgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgRk1DX05BTkRfQ29tbW9uU3BhY2VfVGltaW5nX0luaXQoRk1DX05BTkRfVHlwZURlZiAqRGV2aWNlLCBGTUNfTkFORF9QQ0NfVGltaW5nVHlwZURlZiAqVGltaW5nLCB1aW50MzJfdCBCYW5rKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRk1DX05BTkRfREVWSUNFKERldmljZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRk1DX1NFVFVQX1RJTUUoVGltaW5nLT5TZXR1cFRpbWUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19XQUlUX1RJTUUoVGltaW5nLT5XYWl0U2V0dXBUaW1lKSk7CisgIGFzc2VydF9wYXJhbShJU19GTUNfSE9MRF9USU1FKFRpbWluZy0+SG9sZFNldHVwVGltZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRk1DX0hJWl9USU1FKFRpbWluZy0+SGlaU2V0dXBUaW1lKSk7CisgIGFzc2VydF9wYXJhbShJU19GTUNfTkFORF9CQU5LKEJhbmspKTsKKworICAvKiBTZXQgRk1DX05BTkQgZGV2aWNlIHRpbWluZyBwYXJhbWV0ZXJzICovCisgIGlmIChCYW5rID09IEZNQ19OQU5EX0JBTksyKQorICB7CisgICAgLyogTkFORCBiYW5rIDIgcmVnaXN0ZXJzIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBNT0RJRllfUkVHKERldmljZS0+UE1FTTIsIFBNRU1fQ0xFQVJfTUFTSywgKFRpbWluZy0+U2V0dXBUaW1lICAgICAgICAgICAgICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUaW1pbmctPldhaXRTZXR1cFRpbWUpIDw8IFBPU0lUSU9OX1ZBTChGTUNfUE1FTXhfTUVNV0FJVHgpKSAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUaW1pbmctPkhvbGRTZXR1cFRpbWUpIDw8IFBPU0lUSU9OX1ZBTChGTUNfUE1FTXhfTUVNSE9MRHgpKSAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUaW1pbmctPkhpWlNldHVwVGltZSkgPDwgUE9TSVRJT05fVkFMKEZNQ19QTUVNeF9NRU1ISVp4KSkpKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBOQU5EIGJhbmsgMyByZWdpc3RlcnMgY29uZmlndXJhdGlvbiAqLworICAgIE1PRElGWV9SRUcoRGV2aWNlLT5QTUVNMywgUE1FTV9DTEVBUl9NQVNLLCAoVGltaW5nLT5TZXR1cFRpbWUgICAgICAgICAgICAgICAgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRpbWluZy0+V2FpdFNldHVwVGltZSkgPDwgUE9TSVRJT05fVkFMKEZNQ19QTUVNeF9NRU1XQUlUeCkpICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRpbWluZy0+SG9sZFNldHVwVGltZSkgPDwgUE9TSVRJT05fVkFMKEZNQ19QTUVNeF9NRU1IT0xEeCkpICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRpbWluZy0+SGlaU2V0dXBUaW1lKSA8PCBQT1NJVElPTl9WQUwoRk1DX1BNRU14X01FTUhJWngpKSkpOworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgRk1DX05BTkQgQXR0cmlidXRlIHNwYWNlIFRpbWluZyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgRk1DX05BTkRfUENDX1RpbWluZ1R5cGVEZWYKKyAgKiBAcGFyYW0gIERldmljZSBQb2ludGVyIHRvIE5BTkQgZGV2aWNlIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1pbmcgUG9pbnRlciB0byBOQU5EIHRpbWluZyBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gIEJhbmsgTkFORCBiYW5rIG51bWJlcgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgRk1DX05BTkRfQXR0cmlidXRlU3BhY2VfVGltaW5nX0luaXQoRk1DX05BTkRfVHlwZURlZiAqRGV2aWNlLCBGTUNfTkFORF9QQ0NfVGltaW5nVHlwZURlZiAqVGltaW5nLCB1aW50MzJfdCBCYW5rKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRk1DX05BTkRfREVWSUNFKERldmljZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRk1DX1NFVFVQX1RJTUUoVGltaW5nLT5TZXR1cFRpbWUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19XQUlUX1RJTUUoVGltaW5nLT5XYWl0U2V0dXBUaW1lKSk7CisgIGFzc2VydF9wYXJhbShJU19GTUNfSE9MRF9USU1FKFRpbWluZy0+SG9sZFNldHVwVGltZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRk1DX0hJWl9USU1FKFRpbWluZy0+SGlaU2V0dXBUaW1lKSk7CisgIGFzc2VydF9wYXJhbShJU19GTUNfTkFORF9CQU5LKEJhbmspKTsKKworICAvKiBTZXQgRk1DX05BTkQgZGV2aWNlIHRpbWluZyBwYXJhbWV0ZXJzICovCisgIGlmIChCYW5rID09IEZNQ19OQU5EX0JBTksyKQorICB7CisgICAgLyogTkFORCBiYW5rIDIgcmVnaXN0ZXJzIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBNT0RJRllfUkVHKERldmljZS0+UEFUVDIsIFBBVFRfQ0xFQVJfTUFTSywgKFRpbWluZy0+U2V0dXBUaW1lICAgICAgICAgICAgICAgICAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVGltaW5nLT5XYWl0U2V0dXBUaW1lKSA8PCBQT1NJVElPTl9WQUwoRk1DX1BBVFR4X0FUVFdBSVR4KSkgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRpbWluZy0+SG9sZFNldHVwVGltZSkgPDwgUE9TSVRJT05fVkFMKEZNQ19QQVRUeF9BVFRIT0xEeCkpICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUaW1pbmctPkhpWlNldHVwVGltZSkgPDwgUE9TSVRJT05fVkFMKEZNQ19QQVRUeF9BVFRISVp4KSkpKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBOQU5EIGJhbmsgMyByZWdpc3RlcnMgY29uZmlndXJhdGlvbiAqLworICAgIE1PRElGWV9SRUcoRGV2aWNlLT5QQVRUMywgUEFUVF9DTEVBUl9NQVNLLCAoVGltaW5nLT5TZXR1cFRpbWUgICAgICAgICAgICAgICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUaW1pbmctPldhaXRTZXR1cFRpbWUpIDw8IFBPU0lUSU9OX1ZBTChGTUNfUEFUVHhfQVRUV0FJVHgpKSAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVGltaW5nLT5Ib2xkU2V0dXBUaW1lKSA8PCBQT1NJVElPTl9WQUwoRk1DX1BBVFR4X0FUVEhPTER4KSkgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRpbWluZy0+SGlaU2V0dXBUaW1lKSA8PCBQT1NJVElPTl9WQUwoRk1DX1BBVFR4X0FUVEhJWngpKSkpOworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgRk1DX05BTkQgZGV2aWNlCisgICogQHBhcmFtICBEZXZpY2UgUG9pbnRlciB0byBOQU5EIGRldmljZSBpbnN0YW5jZQorICAqIEBwYXJhbSAgQmFuayBOQU5EIGJhbmsgbnVtYmVyCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBGTUNfTkFORF9EZUluaXQoRk1DX05BTkRfVHlwZURlZiAqRGV2aWNlLCB1aW50MzJfdCBCYW5rKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRk1DX05BTkRfREVWSUNFKERldmljZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRk1DX05BTkRfQkFOSyhCYW5rKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgTkFORCBCYW5rICovCisgIF9fRk1DX05BTkRfRElTQUJMRShEZXZpY2UsIEJhbmspOworCisgIC8qIERlLWluaXRpYWxpemUgdGhlIE5BTkQgQmFuayAqLworICBpZiAoQmFuayA9PSBGTUNfTkFORF9CQU5LMikKKyAgeworICAgIC8qIFNldCB0aGUgRk1DX05BTkRfQkFOSzIgcmVnaXN0ZXJzIHRvIHRoZWlyIHJlc2V0IHZhbHVlcyAqLworICAgIFdSSVRFX1JFRyhEZXZpY2UtPlBDUjIsICAweDAwMDAwMDE4KTsKKyAgICBXUklURV9SRUcoRGV2aWNlLT5TUjIsICAgMHgwMDAwMDA0MCk7CisgICAgV1JJVEVfUkVHKERldmljZS0+UE1FTTIsIDB4RkNGQ0ZDRkMpOworICAgIFdSSVRFX1JFRyhEZXZpY2UtPlBBVFQyLCAweEZDRkNGQ0ZDKTsKKyAgfQorICAvKiBGTUNfQmFuazNfTkFORCAqLworICBlbHNlCisgIHsKKyAgICAvKiBTZXQgdGhlIEZNQ19OQU5EX0JBTkszIHJlZ2lzdGVycyB0byB0aGVpciByZXNldCB2YWx1ZXMgKi8KKyAgICBXUklURV9SRUcoRGV2aWNlLT5QQ1IzLCAgMHgwMDAwMDAxOCk7CisgICAgV1JJVEVfUkVHKERldmljZS0+U1IzLCAgIDB4MDAwMDAwNDApOworICAgIFdSSVRFX1JFRyhEZXZpY2UtPlBNRU0zLCAweEZDRkNGQ0ZDKTsKKyAgICBXUklURV9SRUcoRGV2aWNlLT5QQVRUMywgMHhGQ0ZDRkNGQyk7CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgRk1DX05BTkRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgbWFuYWdlbWVudCBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEZNQ19OQU5EIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb250cm9sIGR5bmFtaWNhbGx5CisgICAgdGhlIEZNQyBOQU5EIGludGVyZmFjZS4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgZHluYW1pY2FsbHkgRk1DX05BTkQgRUNDIGZlYXR1cmUuCisgICogQHBhcmFtICBEZXZpY2UgUG9pbnRlciB0byBOQU5EIGRldmljZSBpbnN0YW5jZQorICAqIEBwYXJhbSAgQmFuayBOQU5EIGJhbmsgbnVtYmVyCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBGTUNfTkFORF9FQ0NfRW5hYmxlKEZNQ19OQU5EX1R5cGVEZWYgKkRldmljZSwgdWludDMyX3QgQmFuaykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19OQU5EX0RFVklDRShEZXZpY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19OQU5EX0JBTksoQmFuaykpOworCisgIC8qIEVuYWJsZSBFQ0MgZmVhdHVyZSAqLworICBpZiAoQmFuayA9PSBGTUNfTkFORF9CQU5LMikKKyAgeworICAgIFNFVF9CSVQoRGV2aWNlLT5QQ1IyLCBGTUNfUENSeF9FQ0NFTik7CisgIH0KKyAgZWxzZQorICB7CisgICAgU0VUX0JJVChEZXZpY2UtPlBDUjMsIEZNQ19QQ1J4X0VDQ0VOKTsKKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlcyBkeW5hbWljYWxseSBGTUNfTkFORCBFQ0MgZmVhdHVyZS4KKyAgKiBAcGFyYW0gIERldmljZSBQb2ludGVyIHRvIE5BTkQgZGV2aWNlIGluc3RhbmNlCisgICogQHBhcmFtICBCYW5rIE5BTkQgYmFuayBudW1iZXIKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEZNQ19OQU5EX0VDQ19EaXNhYmxlKEZNQ19OQU5EX1R5cGVEZWYgKkRldmljZSwgdWludDMyX3QgQmFuaykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19OQU5EX0RFVklDRShEZXZpY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19OQU5EX0JBTksoQmFuaykpOworCisgIC8qIERpc2FibGUgRUNDIGZlYXR1cmUgKi8KKyAgaWYgKEJhbmsgPT0gRk1DX05BTkRfQkFOSzIpCisgIHsKKyAgICBDTEVBUl9CSVQoRGV2aWNlLT5QQ1IyLCBGTUNfUENSeF9FQ0NFTik7CisgIH0KKyAgZWxzZQorICB7CisgICAgQ0xFQVJfQklUKERldmljZS0+UENSMywgRk1DX1BDUnhfRUNDRU4pOworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlcyBkeW5hbWljYWxseSBGTUNfTkFORCBFQ0MgZmVhdHVyZS4KKyAgKiBAcGFyYW0gIERldmljZSBQb2ludGVyIHRvIE5BTkQgZGV2aWNlIGluc3RhbmNlCisgICogQHBhcmFtICBFQ0N2YWwgUG9pbnRlciB0byBFQ0MgdmFsdWUKKyAgKiBAcGFyYW0gIEJhbmsgTkFORCBiYW5rIG51bWJlcgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IHdhaXQgdmFsdWUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEZNQ19OQU5EX0dldEVDQyhGTUNfTkFORF9UeXBlRGVmICpEZXZpY2UsIHVpbnQzMl90ICpFQ0N2YWwsIHVpbnQzMl90IEJhbmssIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDA7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19OQU5EX0RFVklDRShEZXZpY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19OQU5EX0JBTksoQmFuaykpOworCisgIC8qIEdldCB0aWNrICovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCB1bnRpbCBGSUZPIGlzIGVtcHR5ICovCisgIHdoaWxlIChfX0ZNQ19OQU5EX0dFVF9GTEFHKERldmljZSwgQmFuaywgRk1DX0ZMQUdfRkVNUFQpID09IFJFU0VUKQorICB7CisgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCisgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZiAoKFRpbWVvdXQgPT0gMCkgfHwgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKEJhbmsgPT0gRk1DX05BTkRfQkFOSzIpCisgIHsKKyAgICAvKiBHZXQgdGhlIEVDQ1IyIHJlZ2lzdGVyIHZhbHVlICovCisgICAgKkVDQ3ZhbCA9ICh1aW50MzJfdClEZXZpY2UtPkVDQ1IyOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIEdldCB0aGUgRUNDUjMgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgICAqRUNDdmFsID0gKHVpbnQzMl90KURldmljZS0+RUNDUjM7CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZNQ19QQ0NBUkQgRk1DIFBDQ0FSRCBDb250cm9sbGVyIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBQQ0NBUkQgQ29udHJvbGxlciBmdW5jdGlvbnMKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgUENDQVJEIGRldmljZSBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGlzIGRyaXZlciBjb250YWlucyBhIHNldCBvZiBBUElzIHRvIGludGVyZmFjZSB3aXRoIHRoZSBGTUMgUENDQVJEIGJhbmsgaW4gb3JkZXIKKyAgICB0byBydW4gdGhlIFBDQ0FSRC9jb21wYWN0IGZsYXNoIGV4dGVybmFsIGRldmljZXMuCisKKyAgICAoKykgRk1DIFBDQ0FSRCBiYW5rIHJlc2V0IHVzaW5nIHRoZSBmdW5jdGlvbiBGTUNfUENDQVJEX0RlSW5pdCgpCisgICAgKCspIEZNQyBQQ0NBUkQgYmFuayBjb250cm9sIGNvbmZpZ3VyYXRpb24gdXNpbmcgdGhlIGZ1bmN0aW9uIEZNQ19QQ0NBUkRfSW5pdCgpCisgICAgKCspIEZNQyBQQ0NBUkQgYmFuayBjb21tb24gc3BhY2UgdGltaW5nIGNvbmZpZ3VyYXRpb24gdXNpbmcgdGhlIGZ1bmN0aW9uCisgICAgICAgIEZNQ19QQ0NBUkRfQ29tbW9uU3BhY2VfVGltaW5nX0luaXQoKQorICAgICgrKSBGTUMgUENDQVJEIGJhbmsgYXR0cmlidXRlIHNwYWNlIHRpbWluZyBjb25maWd1cmF0aW9uIHVzaW5nIHRoZSBmdW5jdGlvbgorICAgICAgICBGTUNfUENDQVJEX0F0dHJpYnV0ZVNwYWNlX1RpbWluZ19Jbml0KCkKKyAgICAoKykgRk1DIFBDQ0FSRCBiYW5rIElPIHNwYWNlIHRpbWluZyBjb25maWd1cmF0aW9uIHVzaW5nIHRoZSBmdW5jdGlvbgorICAgICAgICBGTUNfUENDQVJEX0lPU3BhY2VfVGltaW5nX0luaXQoKQorCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRk1DX1BDQ0FSRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGVfaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAoKykgSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIHRoZSBGTUMgUENDQVJEIGludGVyZmFjZQorICAgICgrKSBEZS1pbml0aWFsaXplIHRoZSBGTUMgUENDQVJEIGludGVyZmFjZQorICAgICgrKSBDb25maWd1cmUgdGhlIEZNQyBjbG9jayBhbmQgYXNzb2NpYXRlZCBHUElPcworCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBGTUNfUENDQVJEIGRldmljZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgY29udHJvbCBwYXJhbWV0ZXJzIGluIHRoZSBGTUNfUENDQVJEX0hhbmRsZVR5cGVEZWYKKyAgKiBAcGFyYW0gIERldmljZSBQb2ludGVyIHRvIFBDQ0FSRCBkZXZpY2UgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEluaXQgUG9pbnRlciB0byBQQ0NBUkQgSW5pdGlhbGl6YXRpb24gc3RydWN0dXJlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBGTUNfUENDQVJEX0luaXQoRk1DX1BDQ0FSRF9UeXBlRGVmICpEZXZpY2UsIEZNQ19QQ0NBUkRfSW5pdFR5cGVEZWYgKkluaXQpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19GTUNfUENDQVJEX0RFVklDRShEZXZpY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19XQUlUX0ZFQVRVUkUoSW5pdC0+V2FpdGZlYXR1cmUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19UQ0xSX1RJTUUoSW5pdC0+VENMUlNldHVwVGltZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRk1DX1RBUl9USU1FKEluaXQtPlRBUlNldHVwVGltZSkpOworCisgIC8qIFNldCBGTUNfUENDQVJEIGRldmljZSBjb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgTU9ESUZZX1JFRyhEZXZpY2UtPlBDUjQsCisgICAgICAgICAgICAgKEZNQ19QQ1J4X1BUWVAgfCBGTUNfUENSeF9QV0FJVEVOIHwgIEZNQ19QQ1J4X1BXSUQgIHwKKyAgICAgICAgICAgICAgRk1DX1BDUnhfVENMUiB8IEZNQ19QQ1J4X1RBUiksCisgICAgICAgICAgICAgKEZNQ19QQ1JfTUVNT1JZX1RZUEVfUENDQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICBJbml0LT5XYWl0ZmVhdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgIEZNQ19OQU5EX1BDQ19NRU1fQlVTX1dJRFRIXzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAoSW5pdC0+VENMUlNldHVwVGltZSA8PCBQT1NJVElPTl9WQUwoRk1DX1BDUnhfVENMUikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAoSW5pdC0+VEFSU2V0dXBUaW1lIDw8IFBPU0lUSU9OX1ZBTChGTUNfUENSeF9UQVIpKSkpOworCisgIHJldHVybiBIQUxfT0s7CisKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgRk1DX1BDQ0FSRCBDb21tb24gc3BhY2UgVGltaW5nIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBGTUNfTkFORF9QQ0NfVGltaW5nVHlwZURlZgorICAqIEBwYXJhbSAgRGV2aWNlIFBvaW50ZXIgdG8gUENDQVJEIGRldmljZSBpbnN0YW5jZQorICAqIEBwYXJhbSAgVGltaW5nIFBvaW50ZXIgdG8gUENDQVJEIHRpbWluZyBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEZNQ19QQ0NBUkRfQ29tbW9uU3BhY2VfVGltaW5nX0luaXQoRk1DX1BDQ0FSRF9UeXBlRGVmICpEZXZpY2UsIEZNQ19OQU5EX1BDQ19UaW1pbmdUeXBlRGVmICpUaW1pbmcpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19GTUNfUENDQVJEX0RFVklDRShEZXZpY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19TRVRVUF9USU1FKFRpbWluZy0+U2V0dXBUaW1lKSk7CisgIGFzc2VydF9wYXJhbShJU19GTUNfV0FJVF9USU1FKFRpbWluZy0+V2FpdFNldHVwVGltZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRk1DX0hPTERfVElNRShUaW1pbmctPkhvbGRTZXR1cFRpbWUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19ISVpfVElNRShUaW1pbmctPkhpWlNldHVwVGltZSkpOworCisgIC8qIFNldCBQQ0NBUkQgdGltaW5nIHBhcmFtZXRlcnMgKi8KKyAgTU9ESUZZX1JFRyhEZXZpY2UtPlBNRU00LCBQTUVNX0NMRUFSX01BU0ssCisgICAgICAgICAgICAgKFRpbWluZy0+U2V0dXBUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICgoVGltaW5nLT5XYWl0U2V0dXBUaW1lKSA8PCBQT1NJVElPTl9WQUwoRk1DX1BNRU14X01FTVdBSVR4KSkgIHwKKyAgICAgICAgICAgICAgKChUaW1pbmctPkhvbGRTZXR1cFRpbWUpIDw8IFBPU0lUSU9OX1ZBTChGTUNfUE1FTXhfTUVNSE9MRHgpKSAgfAorICAgICAgICAgICAgICAoKFRpbWluZy0+SGlaU2V0dXBUaW1lKSA8PCBQT1NJVElPTl9WQUwoRk1DX1BNRU14X01FTUhJWngpKSkpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIEZNQ19QQ0NBUkQgQXR0cmlidXRlIHNwYWNlIFRpbWluZyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgRk1DX05BTkRfUENDX1RpbWluZ1R5cGVEZWYKKyAgKiBAcGFyYW0gIERldmljZSBQb2ludGVyIHRvIFBDQ0FSRCBkZXZpY2UgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWluZyBQb2ludGVyIHRvIFBDQ0FSRCB0aW1pbmcgc3RydWN0dXJlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBGTUNfUENDQVJEX0F0dHJpYnV0ZVNwYWNlX1RpbWluZ19Jbml0KEZNQ19QQ0NBUkRfVHlwZURlZiAqRGV2aWNlLCBGTUNfTkFORF9QQ0NfVGltaW5nVHlwZURlZiAqVGltaW5nKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRk1DX1BDQ0FSRF9ERVZJQ0UoRGV2aWNlKSk7CisgIGFzc2VydF9wYXJhbShJU19GTUNfU0VUVVBfVElNRShUaW1pbmctPlNldHVwVGltZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRk1DX1dBSVRfVElNRShUaW1pbmctPldhaXRTZXR1cFRpbWUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19IT0xEX1RJTUUoVGltaW5nLT5Ib2xkU2V0dXBUaW1lKSk7CisgIGFzc2VydF9wYXJhbShJU19GTUNfSElaX1RJTUUoVGltaW5nLT5IaVpTZXR1cFRpbWUpKTsKKworICAvKiBTZXQgUENDQVJEIHRpbWluZyBwYXJhbWV0ZXJzICovCisgIE1PRElGWV9SRUcoRGV2aWNlLT5QQVRUNCwgUEFUVF9DTEVBUl9NQVNLLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIChUaW1pbmctPlNldHVwVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFwKKyAgICAgICAgICAgICAgKChUaW1pbmctPldhaXRTZXR1cFRpbWUpIDw8IFBPU0lUSU9OX1ZBTChGTUNfUEFUVHhfQVRUV0FJVHgpKSAgfCBcCisgICAgICAgICAgICAgICgoVGltaW5nLT5Ib2xkU2V0dXBUaW1lKSA8PCBQT1NJVElPTl9WQUwoRk1DX1BBVFR4X0FUVEhPTER4KSkgICB8IFwKKyAgICAgICAgICAgICAgKChUaW1pbmctPkhpWlNldHVwVGltZSkgPDwgUE9TSVRJT05fVkFMKEZNQ19QQVRUeF9BVFRISVp4KSkpKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBGTUNfUENDQVJEIElPIHNwYWNlIFRpbWluZyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgRk1DX05BTkRfUENDX1RpbWluZ1R5cGVEZWYKKyAgKiBAcGFyYW0gIERldmljZSBQb2ludGVyIHRvIFBDQ0FSRCBkZXZpY2UgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWluZyBQb2ludGVyIHRvIFBDQ0FSRCB0aW1pbmcgc3RydWN0dXJlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBGTUNfUENDQVJEX0lPU3BhY2VfVGltaW5nX0luaXQoRk1DX1BDQ0FSRF9UeXBlRGVmICpEZXZpY2UsIEZNQ19OQU5EX1BDQ19UaW1pbmdUeXBlRGVmICpUaW1pbmcpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19GTUNfUENDQVJEX0RFVklDRShEZXZpY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19TRVRVUF9USU1FKFRpbWluZy0+U2V0dXBUaW1lKSk7CisgIGFzc2VydF9wYXJhbShJU19GTUNfV0FJVF9USU1FKFRpbWluZy0+V2FpdFNldHVwVGltZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRk1DX0hPTERfVElNRShUaW1pbmctPkhvbGRTZXR1cFRpbWUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19ISVpfVElNRShUaW1pbmctPkhpWlNldHVwVGltZSkpOworCisgIC8qIFNldCBGTUNfUENDQVJEIGRldmljZSB0aW1pbmcgcGFyYW1ldGVycyAqLworICBNT0RJRllfUkVHKERldmljZS0+UElPNCwgUElPNF9DTEVBUl9NQVNLLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKFRpbWluZy0+U2V0dXBUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFwKKyAgICAgICAgICAgICAgKFRpbWluZy0+V2FpdFNldHVwVGltZSAgIDw8IFBPU0lUSU9OX1ZBTChGTUNfUElPNF9JT1dBSVQ0KSkgfCBcCisgICAgICAgICAgICAgIChUaW1pbmctPkhvbGRTZXR1cFRpbWUgICA8PCBQT1NJVElPTl9WQUwoRk1DX1BJTzRfSU9IT0xENCkpIHwgXAorICAgICAgICAgICAgICAoVGltaW5nLT5IaVpTZXR1cFRpbWUgICAgPDwgUE9TSVRJT05fVkFMKEZNQ19QSU80X0lPSElaNCkpKSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIEZNQ19QQ0NBUkQgZGV2aWNlCisgICogQHBhcmFtICBEZXZpY2UgUG9pbnRlciB0byBQQ0NBUkQgZGV2aWNlIGluc3RhbmNlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBGTUNfUENDQVJEX0RlSW5pdChGTUNfUENDQVJEX1R5cGVEZWYgKkRldmljZSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZNQ19QQ0NBUkRfREVWSUNFKERldmljZSkpOworCisgIC8qIERpc2FibGUgdGhlIEZNQ19QQ0NBUkQgZGV2aWNlICovCisgIF9fRk1DX1BDQ0FSRF9ESVNBQkxFKERldmljZSk7CisKKyAgLyogRGUtaW5pdGlhbGl6ZSB0aGUgRk1DX1BDQ0FSRCBkZXZpY2UgKi8KKyAgV1JJVEVfUkVHKERldmljZS0+UENSNCwgIDB4MDAwMDAwMTgpOworICBXUklURV9SRUcoRGV2aWNlLT5TUjQsICAgMHgwMDAwMDA0MCk7CisgIFdSSVRFX1JFRyhEZXZpY2UtPlBNRU00LCAweEZDRkNGQ0ZDKTsKKyAgV1JJVEVfUkVHKERldmljZS0+UEFUVDQsIDB4RkNGQ0ZDRkMpOworICBXUklURV9SRUcoRGV2aWNlLT5QSU80LCAgMHhGQ0ZDRkNGQyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIGRlZmluZWQoSEFMX1NSQU1fTU9EVUxFX0VOQUJMRUQpIHx8IGRlZmluZWQoSEFMX05PUl9NT0RVTEVfRU5BQkxFRCkgfHwgZGVmaW5lZChIQUxfUENDQVJEX01PRFVMRV9FTkFCTEVEKSB8fCBkZWZpbmVkKEhBTF9OQU5EX01PRFVMRV9FTkFCTEVEKSAqLworCisjZW5kaWYgLyogRk1DX0JBTksxICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmM3h4X2xsX2dwaW8uYyBiL1NyYy9zdG0zMmYzeHhfbGxfZ3Bpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NjZlZWQKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJmM3h4X2xsX2dwaW8uYwpAQCAtMCwwICsxLDMwMSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9sbF9ncGlvLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEdQSU8gTEwgbW9kdWxlIGRyaXZlci4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2xsX2dwaW8uaCIKKyNpbmNsdWRlICJzdG0zMmYzeHhfbGxfYnVzLmgiCisjaWZkZWYgIFVTRV9GVUxMX0FTU0VSVAorI2luY2x1ZGUgInN0bTMyX2Fzc2VydC5oIgorI2Vsc2UKKyNkZWZpbmUgYXNzZXJ0X3BhcmFtKGV4cHIpICgodm9pZCkwVSkKKyNlbmRpZgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkIChHUElPQSkgfHwgZGVmaW5lZCAoR1BJT0IpIHx8IGRlZmluZWQgKEdQSU9DKSB8fCBkZWZpbmVkIChHUElPRCkgfHwgZGVmaW5lZCAoR1BJT0UpIHx8IGRlZmluZWQgKEdQSU9GKSB8fCBkZWZpbmVkIChHUElPRykgfHwgZGVmaW5lZCAoR1BJT0gpCisKKy8qKiBAYWRkdG9ncm91cCBHUElPX0xMCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBHUElPX0xMX1ByaXZhdGVfTWFjcm9zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfTExfR1BJT19QSU4oX19WQUxVRV9fKSAgICAgICAgICAoKCgweDAwMDAwMDAwVSkgPCAoX19WQUxVRV9fKSkgJiYgKChfX1ZBTFVFX18pIDw9IChMTF9HUElPX1BJTl9BTEwpKSkKKworI2RlZmluZSBJU19MTF9HUElPX01PREUoX19WQUxVRV9fKSAgICAgICAgICgoKF9fVkFMVUVfXykgPT0gTExfR1BJT19NT0RFX0lOUFVUKSAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9HUElPX01PREVfT1VUUFVUKSAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0dQSU9fTU9ERV9BTFRFUk5BVEUpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfR1BJT19NT0RFX0FOQUxPRykpCisKKyNkZWZpbmUgSVNfTExfR1BJT19PVVRQVVRfVFlQRShfX1ZBTFVFX18pICAoKChfX1ZBTFVFX18pID09IExMX0dQSU9fT1VUUFVUX1BVU0hQVUxMKSAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9HUElPX09VVFBVVF9PUEVORFJBSU4pKQorCisjZGVmaW5lIElTX0xMX0dQSU9fU1BFRUQoX19WQUxVRV9fKSAgICAgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9HUElPX1NQRUVEX0ZSRVFfTE9XKSAgICAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0dQSU9fU1BFRURfRlJFUV9NRURJVU0pICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfR1BJT19TUEVFRF9GUkVRX0hJR0gpKQorCisjZGVmaW5lIElTX0xMX0dQSU9fUFVMTChfX1ZBTFVFX18pICAgICAgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9HUElPX1BVTExfTk8pICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9HUElPX1BVTExfVVApICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9HUElPX1BVTExfRE9XTikpCisKKyNkZWZpbmUgSVNfTExfR1BJT19BTFRFUk5BVEUoX19WQUxVRV9fKSAgICAoKChfX1ZBTFVFX18pID09IExMX0dQSU9fQUZfMCAgKSAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfR1BJT19BRl8xICApICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9HUElPX0FGXzIgICkgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0dQSU9fQUZfMyAgKSAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfR1BJT19BRl80ICApICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9HUElPX0FGXzUgICkgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0dQSU9fQUZfNiAgKSAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfR1BJT19BRl83ICApICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9HUElPX0FGXzggICkgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0dQSU9fQUZfOSAgKSAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfR1BJT19BRl8xMCApICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9HUElPX0FGXzExICkgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0dQSU9fQUZfMTIgKSAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfR1BJT19BRl8xMyApICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9HUElPX0FGXzE0ICkgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0dQSU9fQUZfMTUgKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgR1BJT19MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgR1BJT19MTF9FRl9Jbml0CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBEZS1pbml0aWFsaXplIEdQSU8gcmVnaXN0ZXJzIChSZWdpc3RlcnMgcmVzdG9yZWQgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMpLgorICAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IEdQSU8gcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6ICAgV3JvbmcgR1BJTyBQb3J0CisgICovCitFcnJvclN0YXR1cyBMTF9HUElPX0RlSW5pdChHUElPX1R5cGVEZWYgKkdQSU94KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19HUElPX0FMTF9JTlNUQU5DRShHUElPeCkpOworCisgIC8qIEZvcmNlIGFuZCBSZWxlYXNlIHJlc2V0IG9uIGNsb2NrIG9mIEdQSU94IFBvcnQgKi8KKyAgaWYgKEdQSU94ID09IEdQSU9BKQorICB7CisgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQUhCMV9HUlAxX1BFUklQSF9HUElPQSk7CisgICAgTExfQUhCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BSEIxX0dSUDFfUEVSSVBIX0dQSU9BKTsKKyAgfQorICBlbHNlIGlmIChHUElPeCA9PSBHUElPQikKKyAgeworICAgIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FIQjFfR1JQMV9QRVJJUEhfR1BJT0IpOworICAgIExMX0FIQjFfR1JQMV9SZWxlYXNlUmVzZXQoTExfQUhCMV9HUlAxX1BFUklQSF9HUElPQik7CisgIH0KKyAgZWxzZSBpZiAoR1BJT3ggPT0gR1BJT0MpCisgIHsKKyAgICBMTF9BSEIxX0dSUDFfRm9yY2VSZXNldChMTF9BSEIxX0dSUDFfUEVSSVBIX0dQSU9DKTsKKyAgICBMTF9BSEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FIQjFfR1JQMV9QRVJJUEhfR1BJT0MpOworICB9CisjaWYgZGVmaW5lZChHUElPRCkKKyAgZWxzZSBpZiAoR1BJT3ggPT0gR1BJT0QpCisgIHsKKyAgICBMTF9BSEIxX0dSUDFfRm9yY2VSZXNldChMTF9BSEIxX0dSUDFfUEVSSVBIX0dQSU9EKTsKKyAgICBMTF9BSEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FIQjFfR1JQMV9QRVJJUEhfR1BJT0QpOworICB9CisjZW5kaWYgLyogR1BJT0QgKi8KKyNpZiBkZWZpbmVkKEdQSU9FKQorICBlbHNlIGlmIChHUElPeCA9PSBHUElPRSkKKyAgeworICAgIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FIQjFfR1JQMV9QRVJJUEhfR1BJT0UpOworICAgIExMX0FIQjFfR1JQMV9SZWxlYXNlUmVzZXQoTExfQUhCMV9HUlAxX1BFUklQSF9HUElPRSk7CisgIH0KKyNlbmRpZiAvKiBHUElPRSAqLworI2lmIGRlZmluZWQoR1BJT0YpCisgIGVsc2UgaWYgKEdQSU94ID09IEdQSU9GKQorICB7CisgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQUhCMV9HUlAxX1BFUklQSF9HUElPRik7CisgICAgTExfQUhCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BSEIxX0dSUDFfUEVSSVBIX0dQSU9GKTsKKyAgfQorI2VuZGlmIC8qIEdQSU9GICovCisjaWYgZGVmaW5lZChHUElPRykKKyAgZWxzZSBpZiAoR1BJT3ggPT0gR1BJT0cpCisgIHsKKyAgICBMTF9BSEIxX0dSUDFfRm9yY2VSZXNldChMTF9BSEIxX0dSUDFfUEVSSVBIX0dQSU9HKTsKKyAgICBMTF9BSEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FIQjFfR1JQMV9QRVJJUEhfR1BJT0cpOworICB9CisjZW5kaWYgLyogR1BJT0cgKi8KKyNpZiBkZWZpbmVkKEdQSU9IKQorICBlbHNlIGlmIChHUElPeCA9PSBHUElPSCkKKyAgeworICAgIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FIQjFfR1JQMV9QRVJJUEhfR1BJT0gpOworICAgIExMX0FIQjFfR1JQMV9SZWxlYXNlUmVzZXQoTExfQUhCMV9HUlAxX1BFUklQSF9HUElPSCk7CisgIH0KKyNlbmRpZiAvKiBHUElPSCAqLworICBlbHNlCisgIHsKKyAgICBzdGF0dXMgPSBFUlJPUjsKKyAgfQorCisgIHJldHVybiAoc3RhdHVzKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIEdQSU8gcmVnaXN0ZXJzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gR1BJT19Jbml0U3RydWN0LgorICAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgICogQHBhcmFtICBHUElPX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfR1BJT19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgR1BJTyBwZXJpcGhlcmFsLgorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBHUElPIHJlZ2lzdGVycyBhcmUgaW5pdGlhbGl6ZWQgYWNjb3JkaW5nIHRvIEdQSU9fSW5pdFN0cnVjdCBjb250ZW50CisgICogICAgICAgICAgLSBFUlJPUjogICBOb3QgYXBwbGljYWJsZQorICAqLworRXJyb3JTdGF0dXMgTExfR1BJT19Jbml0KEdQSU9fVHlwZURlZiAqR1BJT3gsIExMX0dQSU9fSW5pdFR5cGVEZWYgKkdQSU9fSW5pdFN0cnVjdCkKK3sKKyAgdWludDMyX3QgcGlucG9zICAgICA9IDB4MDAwMDAwMDBVOworICB1aW50MzJfdCBjdXJyZW50cGluID0gMHgwMDAwMDAwMFU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fQUxMX0lOU1RBTkNFKEdQSU94KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9HUElPX1BJTihHUElPX0luaXRTdHJ1Y3QtPlBpbikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfR1BJT19NT0RFKEdQSU9fSW5pdFN0cnVjdC0+TW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfR1BJT19QVUxMKEdQSU9fSW5pdFN0cnVjdC0+UHVsbCkpOworCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uZmlndXJlIHRoZSBwb3J0IHBpbnMgLS0tLS0tLS0tLS0tLS0tLSAqLworICAvKiBJbml0aWFsaXplICBwaW5wb3Mgb24gZmlyc3QgcGluIHNldCAqLworICBwaW5wb3MgPSBQT1NJVElPTl9WQUwoR1BJT19Jbml0U3RydWN0LT5QaW4pOworCisgIC8qIENvbmZpZ3VyZSB0aGUgcG9ydCBwaW5zICovCisgIHdoaWxlICgoKEdQSU9fSW5pdFN0cnVjdC0+UGluKSA+PiBwaW5wb3MpICE9IDB4MDAwMDAwMDBVKQorICB7CisgICAgLyogR2V0IGN1cnJlbnQgaW8gcG9zaXRpb24gKi8KKyAgICBjdXJyZW50cGluID0gKEdQSU9fSW5pdFN0cnVjdC0+UGluKSAmICgweDAwMDAwMDAxVSA8PCBwaW5wb3MpOworCisgICAgaWYgKGN1cnJlbnRwaW4pCisgICAgeworICAgICAgLyogUGluIE1vZGUgY29uZmlndXJhdGlvbiAqLworICAgICAgTExfR1BJT19TZXRQaW5Nb2RlKEdQSU94LCBjdXJyZW50cGluLCBHUElPX0luaXRTdHJ1Y3QtPk1vZGUpOworCisgICAgICBpZiAoKEdQSU9fSW5pdFN0cnVjdC0+TW9kZSA9PSBMTF9HUElPX01PREVfT1VUUFVUKSB8fCAoR1BJT19Jbml0U3RydWN0LT5Nb2RlID09IExMX0dQSU9fTU9ERV9BTFRFUk5BVEUpKQorICAgICAgeworICAgICAgICAvKiBDaGVjayBTcGVlZCBtb2RlIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX0dQSU9fU1BFRUQoR1BJT19Jbml0U3RydWN0LT5TcGVlZCkpOworCisgICAgICAgIC8qIFNwZWVkIG1vZGUgY29uZmlndXJhdGlvbiAqLworICAgICAgICBMTF9HUElPX1NldFBpblNwZWVkKEdQSU94LCBjdXJyZW50cGluLCBHUElPX0luaXRTdHJ1Y3QtPlNwZWVkKTsKKyAgICAgIH0KKworICAgICAgLyogUHVsbC11cCBQdWxsIGRvd24gcmVzaXN0b3IgY29uZmlndXJhdGlvbiovCisgICAgICBMTF9HUElPX1NldFBpblB1bGwoR1BJT3gsIGN1cnJlbnRwaW4sIEdQSU9fSW5pdFN0cnVjdC0+UHVsbCk7CisKKyAgICAgIGlmIChHUElPX0luaXRTdHJ1Y3QtPk1vZGUgPT0gTExfR1BJT19NT0RFX0FMVEVSTkFURSkKKyAgICAgIHsKKyAgICAgICAgLyogQ2hlY2sgQWx0ZXJuYXRlIHBhcmFtZXRlciAqLworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfR1BJT19BTFRFUk5BVEUoR1BJT19Jbml0U3RydWN0LT5BbHRlcm5hdGUpKTsKKworICAgICAgICAvKiBTcGVlZCBtb2RlIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgICAgaWYgKFBPU0lUSU9OX1ZBTChjdXJyZW50cGluKSA8IDB4MDAwMDAwMDhVKQorICAgICAgICB7CisgICAgICAgICAgTExfR1BJT19TZXRBRlBpbl8wXzcoR1BJT3gsIGN1cnJlbnRwaW4sIEdQSU9fSW5pdFN0cnVjdC0+QWx0ZXJuYXRlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBMTF9HUElPX1NldEFGUGluXzhfMTUoR1BJT3gsIGN1cnJlbnRwaW4sIEdQSU9fSW5pdFN0cnVjdC0+QWx0ZXJuYXRlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBwaW5wb3MrKzsKKyAgfQorCisgIGlmICgoR1BJT19Jbml0U3RydWN0LT5Nb2RlID09IExMX0dQSU9fTU9ERV9PVVRQVVQpIHx8IChHUElPX0luaXRTdHJ1Y3QtPk1vZGUgPT0gTExfR1BJT19NT0RFX0FMVEVSTkFURSkpCisgIHsKKyAgICAvKiBDaGVjayBPdXRwdXQgbW9kZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX0dQSU9fT1VUUFVUX1RZUEUoR1BJT19Jbml0U3RydWN0LT5PdXRwdXRUeXBlKSk7CisKKyAgICAvKiBPdXRwdXQgbW9kZSBjb25maWd1cmF0aW9uKi8KKyAgICBMTF9HUElPX1NldFBpbk91dHB1dFR5cGUoR1BJT3gsIEdQSU9fSW5pdFN0cnVjdC0+UGluLCBHUElPX0luaXRTdHJ1Y3QtPk91dHB1dFR5cGUpOworCisgIH0KKyAgcmV0dXJuIChTVUNDRVNTKTsKK30KKworLyoqCisgICogQGJyaWVmIFNldCBlYWNoIEByZWYgTExfR1BJT19Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSBHUElPX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfR1BJT19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2hvc2UgZmllbGRzIHdpbGwgYmUgc2V0IHRvIGRlZmF1bHQgdmFsdWVzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworCit2b2lkIExMX0dQSU9fU3RydWN0SW5pdChMTF9HUElPX0luaXRUeXBlRGVmICpHUElPX0luaXRTdHJ1Y3QpCit7CisgIC8qIFJlc2V0IEdQSU8gaW5pdCBzdHJ1Y3R1cmUgcGFyYW1ldGVycyB2YWx1ZXMgKi8KKyAgR1BJT19Jbml0U3RydWN0LT5QaW4gICAgICAgID0gTExfR1BJT19QSU5fQUxMOworICBHUElPX0luaXRTdHJ1Y3QtPk1vZGUgICAgICAgPSBMTF9HUElPX01PREVfQU5BTE9HOworICBHUElPX0luaXRTdHJ1Y3QtPlNwZWVkICAgICAgPSBMTF9HUElPX1NQRUVEX0ZSRVFfTE9XOworICBHUElPX0luaXRTdHJ1Y3QtPk91dHB1dFR5cGUgPSBMTF9HUElPX09VVFBVVF9QVVNIUFVMTDsKKyAgR1BJT19Jbml0U3RydWN0LT5QdWxsICAgICAgID0gTExfR1BJT19QVUxMX05POworICBHUElPX0luaXRTdHJ1Y3QtPkFsdGVybmF0ZSAgPSBMTF9HUElPX0FGXzA7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBkZWZpbmVkIChHUElPQSkgfHwgZGVmaW5lZCAoR1BJT0IpIHx8IGRlZmluZWQgKEdQSU9DKSB8fCBkZWZpbmVkIChHUElPRCkgfHwgZGVmaW5lZCAoR1BJT0UpIHx8IGRlZmluZWQgKEdQSU9GKSB8fCBkZWZpbmVkIChHUElPRykgfHwgZGVmaW5lZCAoR1BJT0gpICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmYzeHhfbGxfaHJ0aW0uYyBiL1NyYy9zdG0zMmYzeHhfbGxfaHJ0aW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDg4YjY0Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZjN4eF9sbF9ocnRpbS5jCkBAIC0wLDAgKzEsMTAxIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2xsX2hydGltLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhSVElNIExMIG1vZHVsZSBkcml2ZXIuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9sbF9ocnRpbS5oIgorI2luY2x1ZGUgInN0bTMyZjN4eF9sbF9idXMuaCIKKworI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoSFJUSU0xKQorCisvKiogQGFkZHRvZ3JvdXAgSFJUSU1fTEwKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgSFJUSU1fTExfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgU2V0IEhSVElNIGluc3RhbmNlIHJlZ2lzdGVycyB0byB0aGVpciByZXNldCB2YWx1ZXMuCisgICogQHBhcmFtICBIUlRJTXggSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IEhSVElNeCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogaW52YWxpZCBIUlRJTXggaW5zdGFuY2UKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0hSVElNX0RlSW5pdChIUlRJTV9UeXBlRGVmKiBIUlRJTXgpCit7CisgIEVycm9yU3RhdHVzIHJlc3VsdCA9IFNVQ0NFU1M7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hSVElNX0FMTF9JTlNUQU5DRShIUlRJTXgpKTsgCisKKyAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9IUlRJTTEpOworICBMTF9BUEIyX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjJfR1JQMV9QRVJJUEhfSFJUSU0xKTsgIAorICAKKyAgcmV0dXJuIHJlc3VsdDsKK30KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIUlRJTTEgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjN4eF9sbF9pMmMuYyBiL1NyYy9zdG0zMmYzeHhfbGxfaTJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ0ZTYzNQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfbGxfaTJjLmMKQEAgLTAsMCArMSwyNTUgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfbGxfaTJjLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEkyQyBMTCBtb2R1bGUgZHJpdmVyLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfbGxfaTJjLmgiCisjaW5jbHVkZSAic3RtMzJmM3h4X2xsX2J1cy5oIgorI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoSTJDMSkgfHwgZGVmaW5lZCAoSTJDMikgfHwgZGVmaW5lZCAoSTJDMykKKworLyoqIEBkZWZncm91cCBJMkNfTEwgSTJDCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBJMkNfTExfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX0xMX0kyQ19QRVJJUEhFUkFMX01PREUoX19WQUxVRV9fKSAgICAoKChfX1ZBTFVFX18pID09IExMX0kyQ19NT0RFX0kyQykgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9JMkNfTU9ERV9TTUJVU19IT1NUKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfSTJDX01PREVfU01CVVNfREVWSUNFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0kyQ19NT0RFX1NNQlVTX0RFVklDRV9BUlApKQorCisjZGVmaW5lIElTX0xMX0kyQ19BTkFMT0dfRklMVEVSKF9fVkFMVUVfXykgICAgICAoKChfX1ZBTFVFX18pID09IExMX0kyQ19BTkFMT0dGSUxURVJfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0kyQ19BTkFMT0dGSUxURVJfRElTQUJMRSkpCisKKyNkZWZpbmUgSVNfTExfSTJDX0RJR0lUQUxfRklMVEVSKF9fVkFMVUVfXykgICAgICgoX19WQUxVRV9fKSA8PSAweDAwMDAwMDBGVSkKKworI2RlZmluZSBJU19MTF9JMkNfT1dOX0FERFJFU1MxKF9fVkFMVUVfXykgICAgICAgKChfX1ZBTFVFX18pIDw9IDB4MDAwMDAzRkZVKQorCisjZGVmaW5lIElTX0xMX0kyQ19UWVBFX0FDS05PV0xFREdFKF9fVkFMVUVfXykgICAoKChfX1ZBTFVFX18pID09IExMX0kyQ19BQ0spIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfSTJDX05BQ0spKQorCisjZGVmaW5lIElTX0xMX0kyQ19PV05fQUREUlNJWkUoX19WQUxVRV9fKSAgICAgICAoKChfX1ZBTFVFX18pID09IExMX0kyQ19PV05BRERSRVNTMV83QklUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0kyQ19PV05BRERSRVNTMV8xMEJJVCkpCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEkyQ19MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgSTJDX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgdGhlIEkyQyByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogSTJDIHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBJMkMgcmVnaXN0ZXJzIGFyZSBub3QgZGUtaW5pdGlhbGl6ZWQKKyAgKi8KK3VpbnQzMl90IExMX0kyQ19EZUluaXQoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisKKyAgLyogQ2hlY2sgdGhlIEkyQyBJbnN0YW5jZSBJMkN4ICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX0lOU1RBTkNFKEkyQ3gpKTsKKworICBpZiAoSTJDeCA9PSBJMkMxKQorICB7CisgICAgLyogRm9yY2UgcmVzZXQgb2YgSTJDIGNsb2NrICovCisgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9JMkMxKTsKKworICAgIC8qIFJlbGVhc2UgcmVzZXQgb2YgSTJDIGNsb2NrICovCisgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzEpOworICB9CisjaWYgZGVmaW5lZChJMkMyKQorICBlbHNlIGlmIChJMkN4ID09IEkyQzIpCisgIHsKKyAgICAvKiBGb3JjZSByZXNldCBvZiBJMkMgY2xvY2sgKi8KKyAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzIpOworCisgICAgLyogUmVsZWFzZSByZXNldCBvZiBJMkMgY2xvY2sgKi8KKyAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMik7CisKKyAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChJMkMzKQorICBlbHNlIGlmIChJMkN4ID09IEkyQzMpCisgIHsKKyAgICAvKiBGb3JjZSByZXNldCBvZiBJMkMgY2xvY2sgKi8KKyAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzMpOworCisgICAgLyogUmVsZWFzZSByZXNldCBvZiBJMkMgY2xvY2sgKi8KKyAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMyk7CisgIH0KKyNlbmRpZgorICBlbHNlCisgIHsKKyAgICBzdGF0dXMgPSBFUlJPUjsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgSTJDIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIEkyQ19Jbml0U3RydWN0LgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBJMkNfSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9JMkNfSW5pdFR5cGVEZWYgc3RydWN0dXJlLgorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBJMkMgcmVnaXN0ZXJzIGFyZSBpbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IE5vdCBhcHBsaWNhYmxlCisgICovCit1aW50MzJfdCBMTF9JMkNfSW5pdChJMkNfVHlwZURlZiAqSTJDeCwgTExfSTJDX0luaXRUeXBlRGVmICpJMkNfSW5pdFN0cnVjdCkKK3sKKyAgLyogQ2hlY2sgdGhlIEkyQyBJbnN0YW5jZSBJMkN4ICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX0lOU1RBTkNFKEkyQ3gpKTsKKworICAvKiBDaGVjayB0aGUgSTJDIHBhcmFtZXRlcnMgZnJvbSBJMkNfSW5pdFN0cnVjdCAqLworICBhc3NlcnRfcGFyYW0oSVNfTExfSTJDX1BFUklQSEVSQUxfTU9ERShJMkNfSW5pdFN0cnVjdC0+UGVyaXBoZXJhbE1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0kyQ19BTkFMT0dfRklMVEVSKEkyQ19Jbml0U3RydWN0LT5BbmFsb2dGaWx0ZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0kyQ19ESUdJVEFMX0ZJTFRFUihJMkNfSW5pdFN0cnVjdC0+RGlnaXRhbEZpbHRlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfSTJDX09XTl9BRERSRVNTMShJMkNfSW5pdFN0cnVjdC0+T3duQWRkcmVzczEpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0kyQ19UWVBFX0FDS05PV0xFREdFKEkyQ19Jbml0U3RydWN0LT5UeXBlQWNrbm93bGVkZ2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0kyQ19PV05fQUREUlNJWkUoSTJDX0luaXRTdHJ1Y3QtPk93bkFkZHJTaXplKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgSTJDeCBQZXJpcGhlcmFsICovCisgIExMX0kyQ19EaXNhYmxlKEkyQ3gpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJMkN4IENSMSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgKiBDb25maWd1cmUgdGhlIGFuYWxvZyBhbmQgZGlnaXRhbCBub2lzZSBmaWx0ZXJzIHdpdGggcGFyYW1ldGVycyA6CisgICAqIC0gQW5hbG9nRmlsdGVyOiBJMkNfQ1IxX0FORk9GRiBiaXQKKyAgICogLSBEaWdpdGFsRmlsdGVyOiBJMkNfQ1IxX0RORlszOjBdIGJpdHMKKyAgICovCisgIExMX0kyQ19Db25maWdGaWx0ZXJzKEkyQ3gsIEkyQ19Jbml0U3RydWN0LT5BbmFsb2dGaWx0ZXIsIEkyQ19Jbml0U3RydWN0LT5EaWdpdGFsRmlsdGVyKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTJDeCBUSU1JTkdSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogQ29uZmlndXJlIHRoZSBTREEgc2V0dXAsIGhvbGQgdGltZSBhbmQgdGhlIFNDTCBoaWdoLCBsb3cgcGVyaW9kIHdpdGggcGFyYW1ldGVyIDoKKyAgICogLSBUaW1pbmc6IEkyQ19USU1JTkdSX1BSRVNDWzM6MF0sIEkyQ19USU1JTkdSX1NDTERFTFszOjBdLCBJMkNfVElNSU5HUl9TREFERUxbMzowXSwKKyAgICogICAgICAgICAgIEkyQ19USU1JTkdSX1NDTEhbNzowXSBhbmQgSTJDX1RJTUlOR1JfU0NMTFs3OjBdIGJpdHMKKyAgICovCisgIExMX0kyQ19TZXRUaW1pbmcoSTJDeCwgSTJDX0luaXRTdHJ1Y3QtPlRpbWluZyk7CisKKyAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBJMkN4IFBlcmlwaGVyYWwgKi8KKyAgTExfSTJDX0VuYWJsZShJMkN4KTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTJDeCBPQVIxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogRGlzYWJsZSwgQ29uZmlndXJlIGFuZCBFbmFibGUgSTJDeCBkZXZpY2Ugb3duIGFkZHJlc3MgMSB3aXRoIHBhcmFtZXRlcnMgOgorICAgKiAtIE93bkFkZHJlc3MxOiAgSTJDX09BUjFfT0ExWzk6MF0gYml0cworICAgKiAtIE93bkFkZHJTaXplOiAgSTJDX09BUjFfT0ExTU9ERSBiaXQKKyAgICovCisgIExMX0kyQ19EaXNhYmxlT3duQWRkcmVzczEoSTJDeCk7CisgIExMX0kyQ19TZXRPd25BZGRyZXNzMShJMkN4LCBJMkNfSW5pdFN0cnVjdC0+T3duQWRkcmVzczEsIEkyQ19Jbml0U3RydWN0LT5Pd25BZGRyU2l6ZSk7CisKKyAgLyogT3duQWRyZXNzMSA9PSAwIGlzIHJlc2VydmVkIGZvciBHZW5lcmFsIENhbGwgYWRkcmVzcyAqLworICBpZiAoSTJDX0luaXRTdHJ1Y3QtPk93bkFkZHJlc3MxICE9IDBVKQorICB7CisgICAgTExfSTJDX0VuYWJsZU93bkFkZHJlc3MxKEkyQ3gpOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkyQ3ggTU9ERSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICogQ29uZmlndXJlIEkyQ3ggcGVyaXBoZXJhbCBtb2RlIHdpdGggcGFyYW1ldGVyIDoKKyAgICogLSBQZXJpcGhlcmFsTW9kZTogSTJDX0NSMV9TTUJERU4gYW5kIEkyQ19DUjFfU01CSEVOIGJpdHMKKyAgICovCisgIExMX0kyQ19TZXRNb2RlKEkyQ3gsIEkyQ19Jbml0U3RydWN0LT5QZXJpcGhlcmFsTW9kZSk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkyQ3ggQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAqIENvbmZpZ3VyZSB0aGUgQUNLbm93bGVkZ2Ugb3IgTm9uIEFDS25vd2xlZGdlIGNvbmRpdGlvbgorICAgKiBhZnRlciB0aGUgYWRkcmVzcyByZWNlaXZlIG1hdGNoIGNvZGUgb3IgbmV4dCByZWNlaXZlZCBieXRlIHdpdGggcGFyYW1ldGVyIDoKKyAgICogLSBUeXBlQWNrbm93bGVkZ2U6IEkyQ19DUjJfTkFDSyBiaXQKKyAgICovCisgIExMX0kyQ19BY2tub3dsZWRnZU5leHREYXRhKEkyQ3gsIEkyQ19Jbml0U3RydWN0LT5UeXBlQWNrbm93bGVkZ2UpOworCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBlYWNoIEByZWYgTExfSTJDX0luaXRUeXBlRGVmIGZpZWxkIHRvIGRlZmF1bHQgdmFsdWUuCisgICogQHBhcmFtICBJMkNfSW5pdFN0cnVjdCBQb2ludGVyIHRvIGEgQHJlZiBMTF9JMkNfSW5pdFR5cGVEZWYgc3RydWN0dXJlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9JMkNfU3RydWN0SW5pdChMTF9JMkNfSW5pdFR5cGVEZWYgKkkyQ19Jbml0U3RydWN0KQoreworICAvKiBTZXQgSTJDX0luaXRTdHJ1Y3QgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzICovCisgIEkyQ19Jbml0U3RydWN0LT5QZXJpcGhlcmFsTW9kZSAgPSBMTF9JMkNfTU9ERV9JMkM7CisgIEkyQ19Jbml0U3RydWN0LT5UaW1pbmcgICAgICAgICAgPSAwVTsKKyAgSTJDX0luaXRTdHJ1Y3QtPkFuYWxvZ0ZpbHRlciAgICA9IExMX0kyQ19BTkFMT0dGSUxURVJfRU5BQkxFOworICBJMkNfSW5pdFN0cnVjdC0+RGlnaXRhbEZpbHRlciAgID0gMFU7CisgIEkyQ19Jbml0U3RydWN0LT5Pd25BZGRyZXNzMSAgICAgPSAwVTsKKyAgSTJDX0luaXRTdHJ1Y3QtPlR5cGVBY2tub3dsZWRnZSA9IExMX0kyQ19OQUNLOworICBJMkNfSW5pdFN0cnVjdC0+T3duQWRkclNpemUgICAgID0gTExfSTJDX09XTkFERFJFU1MxXzdCSVQ7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBJMkMxIHx8IEkyQzIgfHwgSTJDMyAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmM3h4X2xsX29wYW1wLmMgYi9TcmMvc3RtMzJmM3h4X2xsX29wYW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZlYTFjZQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfbGxfb3BhbXAuYwpAQCAtMCwwICsxLDI1NCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9sbF9vcGFtcC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBPUEFNUCBMTCBtb2R1bGUgZHJpdmVyCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9sbF9vcGFtcC5oIgorCisjaWZkZWYgIFVTRV9GVUxMX0FTU0VSVAorICAjaW5jbHVkZSAic3RtMzJfYXNzZXJ0LmgiCisjZWxzZQorICAjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoT1BBTVAxKSB8fCBkZWZpbmVkIChPUEFNUDIpIHx8IGRlZmluZWQgKE9QQU1QMykgfHwgZGVmaW5lZCAoT1BBTVA0KQorCisvKiogQGFkZHRvZ3JvdXAgT1BBTVBfTEwgT1BBTVAKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgT1BBTVBfTExfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworCisvKiBDaGVjayBvZiBwYXJhbWV0ZXJzIGZvciBjb25maWd1cmF0aW9uIG9mIE9QQU1QIGhpZXJhcmNoaWNhbCBzY29wZTogICAgICAgICAqLworLyogT1BBTVAgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBJU19MTF9PUEFNUF9GVU5DVElPTkFMX01PREUoX19GVU5DVElPTkFMX01PREVfXykgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCAgICgoX19GVU5DVElPTkFMX01PREVfXykgPT0gTExfT1BBTVBfTU9ERV9TVEFOREFMT05FKSAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fRlVOQ1RJT05BTF9NT0RFX18pID09IExMX09QQU1QX01PREVfRk9MTE9XRVIpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0ZVTkNUSU9OQUxfTU9ERV9fKSA9PSBMTF9PUEFNUF9NT0RFX1BHQSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisvKiBOb3RlOiBDb21wYXJhdG9yIG5vbi1pbnZlcnRpbmcgaW5wdXRzIHBhcmFtZXRlcnMgYXJlIHRoZSBzYW1lIG9uIGFsbCAgICAgICAqLworLyogICAgICAgT1BBTVAgaW5zdGFuY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIEhvd2V2ZXIsIGNvbXBhcmF0b3IgaW5zdGFuY2Uga2VwdCBhcyBtYWNybyBwYXJhbWV0ZXIgZm9yICAgICAgICAgICAgICovCisvKiAgICAgICBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgU1RNMzIgZmFtaWxpZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJU19MTF9PUEFNUF9JTlBVVF9OT05JTlZFUlRJTkcoX19PUEFNUFhfXywgX19JTlBVVF9OT05JTlZFUlRJTkdfXykgICAgIFwKKyAgKCAgICgoX19JTlBVVF9OT05JTlZFUlRJTkdfXykgPT0gTExfT1BBTVBfSU5QVVRfTk9OSU5WRVJUX0lPMCkgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfTk9OSU5WRVJUSU5HX18pID09IExMX09QQU1QX0lOUFVUX05PTklOVkVSVF9JTzEpICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX05PTklOVkVSVElOR19fKSA9PSBMTF9PUEFNUF9JTlBVVF9OT05JTlZFUlRfSU8yKSAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTlBVVF9OT05JTlZFUlRJTkdfXykgPT0gTExfT1BBTVBfSU5QVVRfTk9OSU5WRVJUX0lPMykgICAgICAgICAgICAgICBcCisgICkKKyAgCisvKiBOb3RlOiBDb21wYXJhdG9yIG5vbi1pbnZlcnRpbmcgaW5wdXRzIHBhcmFtZXRlcnMgYXJlIHRoZSBzYW1lIG9uIGFsbCAgICAgICAqLworLyogICAgICAgT1BBTVAgaW5zdGFuY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIEhvd2V2ZXIsIGNvbXBhcmF0b3IgaW5zdGFuY2Uga2VwdCBhcyBtYWNybyBwYXJhbWV0ZXIgZm9yICAgICAgICAgICAgICovCisvKiAgICAgICBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgU1RNMzIgZmFtaWxpZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJU19MTF9PUEFNUF9JTlBVVF9JTlZFUlRJTkcoX19PUEFNUFhfXywgX19JTlBVVF9JTlZFUlRJTkdfXykgICAgICAgICAgIFwKKyAgKCAgICgoX19JTlBVVF9JTlZFUlRJTkdfXykgPT0gTExfT1BBTVBfSU5QVVRfSU5WRVJUX0lPMCkgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfSU5WRVJUSU5HX18pID09IExMX09QQU1QX0lOUFVUX0lOVkVSVF9JTzEpICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX0lOVkVSVElOR19fKSA9PSBMTF9PUEFNUF9JTlBVVF9JTlZFUlRfQ09OTkVDVF9OTykgICAgICAgICAgICAgIFwKKyAgKQorICAKKy8qKgorICAqIEB9CisgICovCisKKworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBPUEFNUF9MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgT1BBTVBfTExfRUZfSW5pdAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRGUtaW5pdGlhbGl6ZSByZWdpc3RlcnMgb2YgdGhlIHNlbGVjdGVkIE9QQU1QIGluc3RhbmNlCisgICogICAgICAgICB0byB0aGVpciBkZWZhdWx0IHJlc2V0IHZhbHVlcy4KKyAgKiBAbm90ZSAgIElmIGNvbXBhcmF0b3IgaXMgbG9ja2VkLCBkZS1pbml0aWFsaXphdGlvbiBieSBzb2Z0d2FyZSBpcworICAqICAgICAgICAgbm90IHBvc3NpYmxlLgorICAqICAgICAgICAgVGhlIG9ubHkgd2F5IHRvIHVubG9jayB0aGUgY29tcGFyYXRvciBpcyBhIGRldmljZSBoYXJkd2FyZSByZXNldC4KKyAgKiBAcGFyYW0gIE9QQU1QeCBPUEFNUCBpbnN0YW5jZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBPUEFNUCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogT1BBTVAgcmVnaXN0ZXJzIGFyZSBub3QgZGUtaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX09QQU1QX0RlSW5pdChPUEFNUF9UeXBlRGVmKiBPUEFNUHgpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfT1BBTVBfQUxMX0lOU1RBTkNFKE9QQU1QeCkpOworICAKKyAgLyogTm90ZTogSGFyZHdhcmUgY29uc3RyYWludCAocmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgdGhpcyBmdW5jdGlvbik6ICAgICAgICovCisgIC8qICAgICAgIE9QQU1QIGluc3RhbmNlIG11c3Qgbm90IGJlIGxvY2tlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZihMTF9PUEFNUF9Jc0xvY2tlZChPUEFNUHgpID09IDBVKQorICB7CisgIExMX09QQU1QX1dyaXRlUmVnKE9QQU1QeCwgQ1NSLCAweDAwMDAwMDAwVSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogT1BBTVAgaW5zdGFuY2UgaXMgbG9ja2VkOiBkZS1pbml0aWFsaXphdGlvbiBieSBzb2Z0d2FyZSBpcyAgICAgICAgICAgICAgKi8KKyAgICAvKiBub3QgcG9zc2libGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIFRoZSBvbmx5IHdheSB0byB1bmxvY2sgdGhlIE9QQU1QIGlzIGEgZGV2aWNlIGhhcmR3YXJlIHJlc2V0LiAgICAgICAgICAgICovCisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKyAgCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSBzb21lIGZlYXR1cmVzIG9mIE9QQU1QIGluc3RhbmNlLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiByZXNldCBiaXQgb2YgY2FsaWJyYXRpb24gbW9kZSB0byBlbnN1cmUKKyAgKiAgICAgICAgIHRvIGJlIGluIGZ1bmN0aW9uYWwgbW9kZSwgaW4gb3JkZXIgdG8gaGF2ZSBPUEFNUCBwYXJhbWV0ZXJzCisgICogICAgICAgICAoaW5wdXRzIHNlbGVjdGlvbiwgLi4uKSBzZXQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBPUEFNUCBtb2RlCisgICogICAgICAgICB0byBiZSBlZmZlY3RpdmUuCisgICogQHBhcmFtICBPUEFNUHggT1BBTVAgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIE9QQU1QX0luaXRTdHJ1Y3QgUG9pbnRlciB0byBhIEByZWYgTExfT1BBTVBfSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IE9QQU1QIHJlZ2lzdGVycyBhcmUgaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBPUEFNUCByZWdpc3RlcnMgYXJlIG5vdCBpbml0aWFsaXplZAorICAqLworRXJyb3JTdGF0dXMgTExfT1BBTVBfSW5pdChPUEFNUF9UeXBlRGVmICpPUEFNUHgsIExMX09QQU1QX0luaXRUeXBlRGVmICpPUEFNUF9Jbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX09QQU1QX0FMTF9JTlNUQU5DRShPUEFNUHgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX09QQU1QX0ZVTkNUSU9OQUxfTU9ERShPUEFNUF9Jbml0U3RydWN0LT5GdW5jdGlvbmFsTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfT1BBTVBfSU5QVVRfTk9OSU5WRVJUSU5HKE9QQU1QeCwgT1BBTVBfSW5pdFN0cnVjdC0+SW5wdXROb25JbnZlcnRpbmcpKTsKKyAgCisgIC8qIE5vdGU6IE9QQU1QIGludmVydGluZyBpbnB1dCBjYW4gYmUgdXNlZCB3aXRoIE9QQU1QIGluIG1vZGUgc3RhbmRhbG9uZSAgICAqLworICAvKiAgICAgICBvciBQR0Egd2l0aCBleHRlcm5hbCBjYXBhY2l0b3JzIGZvciBmaWx0ZXJpbmcgY2lyY3VpdC4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgT3RoZXJ3aXNlIChPUEFNUCBpbiBtb2RlIGZvbGxvd2VyKSwgT1BBTVAgaW52ZXJ0aW5nIGlucHV0IGlzICAgICAgICovCisgIC8qICAgICAgIG5vdCB1c2VkIChub3QgY29ubmVjdGVkIHRvIEdQSU8gcGluKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZihPUEFNUF9Jbml0U3RydWN0LT5GdW5jdGlvbmFsTW9kZSAhPSBMTF9PUEFNUF9NT0RFX0ZPTExPV0VSKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX09QQU1QX0lOUFVUX0lOVkVSVElORyhPUEFNUHgsIE9QQU1QX0luaXRTdHJ1Y3QtPklucHV0SW52ZXJ0aW5nKSk7CisgIH0KKyAgCisgIC8qIE5vdGU6IEhhcmR3YXJlIGNvbnN0cmFpbnQgKHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHRoaXMgZnVuY3Rpb24pOiAgICAgICAqLworICAvKiAgICAgICBPUEFNUCBpbnN0YW5jZSBtdXN0IG5vdCBiZSBsb2NrZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYoTExfT1BBTVBfSXNMb2NrZWQoT1BBTVB4KSA9PSAwVSkKKyAgeworICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgT1BBTVAgaW5zdGFuY2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBGdW5jdGlvbmFsIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gSW5wdXQgbm9uLWludmVydGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIElucHV0IGludmVydGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBOb3RlOiBCaXQgT1BBTVBfQ1NSX0NBTE9OIHJlc2V0IHRvIGVuc3VyZSB0byBiZSBpbiBmdW5jdGlvbmFsIG1vZGUuICAgICovCisgICAgaWYoT1BBTVBfSW5pdFN0cnVjdC0+RnVuY3Rpb25hbE1vZGUgIT0gTExfT1BBTVBfTU9ERV9GT0xMT1dFUikKKyAgICB7CisgICAgICBNT0RJRllfUkVHKE9QQU1QeC0+Q1NSLAorICAgICAgICAgICAgICAgICAgIE9QQU1QX0NTUl9DQUxPTgorICAgICAgICAgICAgICAgICB8IE9QQU1QX0NTUl9WTVNFTAorICAgICAgICAgICAgICAgICB8IE9QQU1QX0NTUl9WUFNFTAorICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgICBPUEFNUF9Jbml0U3RydWN0LT5GdW5jdGlvbmFsTW9kZQorICAgICAgICAgICAgICAgICB8IE9QQU1QX0luaXRTdHJ1Y3QtPklucHV0Tm9uSW52ZXJ0aW5nCisgICAgICAgICAgICAgICAgIHwgT1BBTVBfSW5pdFN0cnVjdC0+SW5wdXRJbnZlcnRpbmcKKyAgICAgICAgICAgICAgICApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgTU9ESUZZX1JFRyhPUEFNUHgtPkNTUiwKKyAgICAgICAgICAgICAgICAgICBPUEFNUF9DU1JfQ0FMT04KKyAgICAgICAgICAgICAgICAgfCBPUEFNUF9DU1JfVk1TRUwKKyAgICAgICAgICAgICAgICAgfCBPUEFNUF9DU1JfVlBTRUwKKyAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgTExfT1BBTVBfTU9ERV9GT0xMT1dFUgorICAgICAgICAgICAgICAgICB8IE9QQU1QX0luaXRTdHJ1Y3QtPklucHV0Tm9uSW52ZXJ0aW5nCisgICAgICAgICAgICAgICAgKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogSW5pdGlhbGl6YXRpb24gZXJyb3I6IE9QQU1QIGluc3RhbmNlIGlzIGxvY2tlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHN0YXR1cyA9IEVSUk9SOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmIFNldCBlYWNoIEByZWYgTExfT1BBTVBfSW5pdFR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZS4KKyAgKiBAcGFyYW0gT1BBTVBfSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9PUEFNUF9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICB3aG9zZSBmaWVsZHMgd2lsbCBiZSBzZXQgdG8gZGVmYXVsdCB2YWx1ZXMuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX09QQU1QX1N0cnVjdEluaXQoTExfT1BBTVBfSW5pdFR5cGVEZWYgKk9QQU1QX0luaXRTdHJ1Y3QpCit7CisgIC8qIFNldCBPUEFNUF9Jbml0U3RydWN0IGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICBPUEFNUF9Jbml0U3RydWN0LT5GdW5jdGlvbmFsTW9kZSAgICA9IExMX09QQU1QX01PREVfRk9MTE9XRVI7CisgIE9QQU1QX0luaXRTdHJ1Y3QtPklucHV0Tm9uSW52ZXJ0aW5nID0gTExfT1BBTVBfSU5QVVRfTk9OSU5WRVJUX0lPMDsKKyAgLyogTm90ZTogUGFyYW1ldGVyIGRpc2NhcmRlZCBpZiBPUEFNUCBpbiBmdW5jdGlvbmFsIG1vZGUgZm9sbG93ZXIsICAgICAgICAgICovCisgIC8qICAgICAgIHNldCBhbnl3YXkgdG8gaXRzIGRlZmF1bHQgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBPUEFNUF9Jbml0U3RydWN0LT5JbnB1dEludmVydGluZyAgICA9IExMX09QQU1QX0lOUFVUX0lOVkVSVF9DT05ORUNUX05POworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogT1BBTVAxIHx8IE9QQU1QMiB8fCBPUEFNUDMgfHwgT1BBTVA0ICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmYzeHhfbGxfcHdyLmMgYi9TcmMvc3RtMzJmM3h4X2xsX3B3ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYTEyYmQKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJmM3h4X2xsX3B3ci5jCkBAIC0wLDAgKzEsMTAxIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2xsX3B3ci5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBQV1IgTEwgbW9kdWxlIGRyaXZlci4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2xsX3B3ci5oIgorI2luY2x1ZGUgInN0bTMyZjN4eF9sbF9idXMuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChQV1IpCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMIFBXUgorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFBXUl9MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgUFdSX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgdGhlIFBXUiByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFBXUiByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1BXUl9EZUluaXQodm9pZCkKK3sKKyAgLyogRm9yY2UgcmVzZXQgb2YgUFdSIGNsb2NrICovCisgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfUFdSKTsKKworICAvKiBSZWxlYXNlIHJlc2V0IG9mIFBXUiBjbG9jayAqLworICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfUFdSKTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKFBXUikgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmYzeHhfbGxfcmNjLmMgYi9TcmMvc3RtMzJmM3h4X2xsX3JjYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZjVhMTkKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJmM3h4X2xsX3JjYy5jCkBAIC0wLDAgKzEsMTEzNCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9sbF9yY2MuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgUkNDIExMIG1vZHVsZSBkcml2ZXIuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9sbF9yY2MuaCIKKyNpZmRlZiAgVVNFX0ZVTExfQVNTRVJUCisgICNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisgICNkZWZpbmUgYXNzZXJ0X3BhcmFtKGV4cHIpICgodm9pZCkwVSkKKyNlbmRpZiAvKiBVU0VfRlVMTF9BU1NFUlQgKi8KKy8qKiBAYWRkdG9ncm91cCBTVE0zMkYzeHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoUkNDKQorCisvKiogQGRlZmdyb3VwIFJDQ19MTCBSQ0MKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBSQ0NfTExfUHJpdmF0ZV9WYXJpYWJsZXMKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoUkNDX0NGR1IyX0FEQzFQUkVTKSB8fCBkZWZpbmVkKFJDQ19DRkdSMl9BRENQUkUxMikgfHwgZGVmaW5lZChSQ0NfQ0ZHUjJfQURDUFJFMzQpCitjb25zdCB1aW50MTZfdCBhQURDUHJlc2NUYWJsZVsxNl0gICAgICAgPSB7MVUsIDJVLCA0VSwgNlUsIDhVLCAxMFUsIDEyVSwgMTZVLCAzMlUsIDY0VSwgMTI4VSwgMjU2VSwgMjU2VSwgMjU2VSwgMjU2VSwgMjU2VX07CisjZW5kaWYgLyogUkNDX0NGR1IyX0FEQzFQUkVTIHx8IFJDQ19DRkdSMl9BRENQUkUxMiB8fCBSQ0NfQ0ZHUjJfQURDUFJFMzQgKi8KKyNpZiBkZWZpbmVkKFJDQ19DRkdSX1NEUFJFKQorY29uc3QgdWludDhfdCBhU0RBRENQcmVzY1RhYmxlWzE2XSAgICAgICA9IHsyVSwgNFUsIDZVLCA4VSwgMTBVLCAxMlUsIDE0VSwgMTZVLCAyMFUsIDI0VSwgMjhVLCAzMlUsIDM2VSwgNDBVLCA0NFUsIDQ4VX07CisjZW5kaWYgLyogUkNDX0NGR1JfU0RQUkUgKi8KKy8qKgorICAqIEB9CisgICovCisKKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgUkNDX0xMX1ByaXZhdGVfTWFjcm9zCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFJDQ19DRkdSM19VU0FSVDJTVykgJiYgZGVmaW5lZChSQ0NfQ0ZHUjNfVVNBUlQzU1cpCisjZGVmaW5lIElTX0xMX1JDQ19VU0FSVF9DTEtTT1VSQ0UoX19WQUxVRV9fKSAgKCgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1VTQVJUMl9DTEtTT1VSQ0UpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19VU0FSVDNfQ0xLU09VUkNFKSkKKyNlbGlmIGRlZmluZWQoUkNDX0NGR1IzX1VTQVJUMlNXKSAmJiAhZGVmaW5lZChSQ0NfQ0ZHUjNfVVNBUlQzU1cpCisjZGVmaW5lIElTX0xMX1JDQ19VU0FSVF9DTEtTT1VSQ0UoX19WQUxVRV9fKSAgKCgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1VTQVJUMl9DTEtTT1VSQ0UpKQorI2VsaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfVVNBUlQzU1cpICYmICFkZWZpbmVkKFJDQ19DRkdSM19VU0FSVDJTVykKKyNkZWZpbmUgSVNfTExfUkNDX1VTQVJUX0NMS1NPVVJDRShfX1ZBTFVFX18pICAoKChfX1ZBTFVFX18pID09IExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfVVNBUlQzX0NMS1NPVVJDRSkpCisjZWxzZQorI2RlZmluZSBJU19MTF9SQ0NfVVNBUlRfQ0xLU09VUkNFKF9fVkFMVUVfXykgICgoKF9fVkFMVUVfXykgPT0gTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0UpKQorI2VuZGlmIC8qIFJDQ19DRkdSM19VU0FSVDJTVyAmJiBSQ0NfQ0ZHUjNfVVNBUlQzU1cgKi8KKworI2lmIGRlZmluZWQoVUFSVDQpICYmIGRlZmluZWQoVUFSVDUpCisjZGVmaW5lIElTX0xMX1JDQ19VQVJUX0NMS1NPVVJDRShfX1ZBTFVFX18pICAgICgoKF9fVkFMVUVfXykgPT0gTExfUkNDX1VBUlQ0X0NMS1NPVVJDRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19VQVJUNV9DTEtTT1VSQ0UpKQorI2VsaWYgZGVmaW5lZChVQVJUNCkKKyNkZWZpbmUgSVNfTExfUkNDX1VBUlRfSU5TVEFOQ0UoX19WQUxVRV9fKSAgICAgKChfX1ZBTFVFX18pID09IExMX1JDQ19VQVJUNF9DTEtTT1VSQ0UpCisjZWxpZiBkZWZpbmVkKFVBUlQ1KQorI2RlZmluZSBJU19MTF9SQ0NfVUFSVF9JTlNUQU5DRShfX1ZBTFVFX18pICAgICAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1VBUlQ1X0NMS1NPVVJDRSkKKyNlbmRpZiAvKiBVQVJUNCAmJiBVQVJUNSovCisKKyNpZiBkZWZpbmVkKFJDQ19DRkdSM19JMkMyU1cpICYmIGRlZmluZWQoUkNDX0NGR1IzX0kyQzNTVykKKyNkZWZpbmUgSVNfTExfUkNDX0kyQ19DTEtTT1VSQ0UoX19WQUxVRV9fKSAgICAoKChfX1ZBTFVFX18pID09IExMX1JDQ19JMkMxX0NMS1NPVVJDRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX0kyQzJfQ0xLU09VUkNFKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfSTJDM19DTEtTT1VSQ0UpKQorCisjZWxpZiBkZWZpbmVkKFJDQ19DRkdSM19JMkMyU1cpICYmICFkZWZpbmVkKFJDQ19DRkdSM19JMkMzU1cpCisjZGVmaW5lIElTX0xMX1JDQ19JMkNfQ0xLU09VUkNFKF9fVkFMVUVfXykgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0UpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19JMkMyX0NMS1NPVVJDRSkpCisKKyNlbGlmIGRlZmluZWQoUkNDX0NGR1IzX0kyQzNTVykgJiYgIWRlZmluZWQoUkNDX0NGR1IzX0kyQzJTVykKKyNkZWZpbmUgSVNfTExfUkNDX0kyQ19DTEtTT1VSQ0UoX19WQUxVRV9fKSAgICAoKChfX1ZBTFVFX18pID09IExMX1JDQ19JMkMxX0NMS1NPVVJDRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX0kyQzNfQ0xLU09VUkNFKSkKKworI2Vsc2UKKyNkZWZpbmUgSVNfTExfUkNDX0kyQ19DTEtTT1VSQ0UoX19WQUxVRV9fKSAgICAgKChfX1ZBTFVFX18pID09IExMX1JDQ19JMkMxX0NMS1NPVVJDRSkKKyNlbmRpZiAvKiBSQ0NfQ0ZHUjNfSTJDMlNXICYmIFJDQ19DRkdSM19JMkMzU1cgKi8KKworI2RlZmluZSBJU19MTF9SQ0NfSTJTX0NMS1NPVVJDRShfX1ZBTFVFX18pICAgICAoKF9fVkFMVUVfXykgPT0gTExfUkNDX0kyU19DTEtTT1VSQ0UpCisKKyNpZiBkZWZpbmVkKFVTQikKKyNkZWZpbmUgSVNfTExfUkNDX1VTQl9DTEtTT1VSQ0UoX19WQUxVRV9fKSAgICAoKChfX1ZBTFVFX18pID09IExMX1JDQ19VU0JfQ0xLU09VUkNFKSkKKyNlbmRpZiAvKiBVU0IgKi8KKworI2lmIGRlZmluZWQoUkNDX0NGR1JfQURDUFJFKQorI2RlZmluZSBJU19MTF9SQ0NfQURDX0NMS1NPVVJDRShfX1ZBTFVFX18pICAgICgoKF9fVkFMVUVfXykgPT0gTExfUkNDX0FEQ19DTEtTT1VSQ0UpKQorI2Vsc2UKKyNpZiBkZWZpbmVkKFJDQ19DRkdSMl9BREMxUFJFUykKKyNkZWZpbmUgSVNfTExfUkNDX0FEQ19DTEtTT1VSQ0UoX19WQUxVRV9fKSAgICAoKChfX1ZBTFVFX18pID09IExMX1JDQ19BREMxX0NMS1NPVVJDRSkpCisjZWxpZiAgZGVmaW5lZChSQ0NfQ0ZHUjJfQURDUFJFMTIpICYmIGRlZmluZWQoUkNDX0NGR1IyX0FEQ1BSRTM0KQorI2RlZmluZSBJU19MTF9SQ0NfQURDX0NMS1NPVVJDRShfX1ZBTFVFX18pICAgICgoKF9fVkFMVUVfXykgPT0gTExfUkNDX0FEQzEyX0NMS1NPVVJDRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX0FEQzM0X0NMS1NPVVJDRSkpCisjZWxzZSAvKiBSQ0NfQ0ZHUjJfQURDUFJFMTIgKi8KKyNkZWZpbmUgSVNfTExfUkNDX0FEQ19DTEtTT1VSQ0UoX19WQUxVRV9fKSAgICAoKChfX1ZBTFVFX18pID09IExMX1JDQ19BREMxMl9DTEtTT1VSQ0UpKQorI2VuZGlmIC8qIFJDQ19DRkdSMl9BREMxUFJFUyAqLworI2VuZGlmIC8qIFJDQ19DRkdSX0FEQ1BSRSAqLworCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUl9TRFBSRSkKKyNkZWZpbmUgSVNfTExfUkNDX1NEQURDX0NMS1NPVVJDRShfX1ZBTFVFX18pICAoKChfX1ZBTFVFX18pID09IExMX1JDQ19TREFEQ19DTEtTT1VSQ0UpKQorI2VuZGlmIC8qIFJDQ19DRkdSX1NEUFJFICovCisKKyNpZiBkZWZpbmVkKENFQykKKyNkZWZpbmUgSVNfTExfUkNDX0NFQ19DTEtTT1VSQ0UoX19WQUxVRV9fKSAgICAoKChfX1ZBTFVFX18pID09IExMX1JDQ19DRUNfQ0xLU09VUkNFKSkKKyNlbmRpZiAvKiBDRUMgKi8KKworI2lmIGRlZmluZWQoUkNDX0NGR1IzX1RJTVNXKQorI2lmIGRlZmluZWQoUkNDX0NGR1IzX1RJTThTVykgJiYgZGVmaW5lZChSQ0NfQ0ZHUjNfVElNMTVTVykgJiYgZGVmaW5lZChSQ0NfQ0ZHUjNfVElNMTZTVykgXAorICYmIGRlZmluZWQoUkNDX0NGR1IzX1RJTTE3U1cpICYmIGRlZmluZWQoUkNDX0NGR1IzX1RJTTIwU1cpICYmIGRlZmluZWQoUkNDX0NGR1IzX1RJTTJTVykgXAorICYmIGRlZmluZWQoUkNDX0NGR1IzX1RJTTM0U1cpCisKKyNkZWZpbmUgSVNfTExfUkNDX1RJTV9DTEtTT1VSQ0UoX19WQUxVRV9fKSAgICAoKChfX1ZBTFVFX18pID09IExMX1JDQ19USU0xX0NMS1NPVVJDRSkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19USU0yX0NMS1NPVVJDRSkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19USU04X0NMS1NPVVJDRSkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19USU0xNV9DTEtTT1VSQ0UpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19USU0xNl9DTEtTT1VSQ0UpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19USU0xN19DTEtTT1VSQ0UpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19USU0yMF9DTEtTT1VSQ0UpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19USU0zNF9DTEtTT1VSQ0UpKQorCisjZWxpZiAhZGVmaW5lZChSQ0NfQ0ZHUjNfVElNOFNXKSAmJiBkZWZpbmVkKFJDQ19DRkdSM19USU0xNVNXKSAmJiBkZWZpbmVkKFJDQ19DRkdSM19USU0xNlNXKSBcCisgJiYgZGVmaW5lZChSQ0NfQ0ZHUjNfVElNMTdTVykgJiYgIWRlZmluZWQoUkNDX0NGR1IzX1RJTTIwU1cpICYmIGRlZmluZWQoUkNDX0NGR1IzX1RJTTJTVykgXAorICYmIGRlZmluZWQoUkNDX0NGR1IzX1RJTTM0U1cpCisKKyNkZWZpbmUgSVNfTExfUkNDX1RJTV9DTEtTT1VSQ0UoX19WQUxVRV9fKSAgICAoKChfX1ZBTFVFX18pID09IExMX1JDQ19USU0xX0NMS1NPVVJDRSkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19USU0yX0NMS1NPVVJDRSkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19USU0xNV9DTEtTT1VSQ0UpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19USU0xNl9DTEtTT1VSQ0UpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19USU0xN19DTEtTT1VSQ0UpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19USU0zNF9DTEtTT1VSQ0UpKQorCisjZWxpZiBkZWZpbmVkKFJDQ19DRkdSM19USU04U1cpICYmICFkZWZpbmVkKFJDQ19DRkdSM19USU0xNVNXKSAmJiAhZGVmaW5lZChSQ0NfQ0ZHUjNfVElNMTZTVykgXAorICYmICFkZWZpbmVkKFJDQ19DRkdSM19USU0xN1NXKSAmJiAhZGVmaW5lZChSQ0NfQ0ZHUjNfVElNMjBTVykgJiYgIWRlZmluZWQoUkNDX0NGR1IzX1RJTTJTVykgXAorICYmICFkZWZpbmVkKFJDQ19DRkdSM19USU0zNFNXKQorCisjZGVmaW5lIElTX0xMX1JDQ19USU1fQ0xLU09VUkNFKF9fVkFMVUVfXykgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfVElNMV9DTEtTT1VSQ0UpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfVElNOF9DTEtTT1VSQ0UpKQorCisjZWxpZiAhZGVmaW5lZChSQ0NfQ0ZHUjNfVElNOFNXKSAmJiBkZWZpbmVkKFJDQ19DRkdSM19USU0xNVNXKSAmJiBkZWZpbmVkKFJDQ19DRkdSM19USU0xNlNXKSBcCisgJiYgZGVmaW5lZChSQ0NfQ0ZHUjNfVElNMTdTVykgJiYgIWRlZmluZWQoUkNDX0NGR1IzX1RJTTIwU1cpICYmICFkZWZpbmVkKFJDQ19DRkdSM19USU0yU1cpIFwKKyAmJiAhZGVmaW5lZChSQ0NfQ0ZHUjNfVElNMzRTVykKKworI2RlZmluZSBJU19MTF9SQ0NfVElNX0NMS1NPVVJDRShfX1ZBTFVFX18pICAgICgoKF9fVkFMVUVfXykgPT0gTExfUkNDX1RJTTFfQ0xLU09VUkNFKSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1RJTTE1X0NMS1NPVVJDRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1RJTTE2X0NMS1NPVVJDRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1RJTTE3X0NMS1NPVVJDRSkpCisKKyNlbGlmICFkZWZpbmVkKFJDQ19DRkdSM19USU04U1cpICYmICFkZWZpbmVkKFJDQ19DRkdSM19USU0xNVNXKSAmJiAhZGVmaW5lZChSQ0NfQ0ZHUjNfVElNMTZTVykgXAorICYmICFkZWZpbmVkKFJDQ19DRkdSM19USU0xN1NXKSAmJiAhZGVmaW5lZChSQ0NfQ0ZHUjNfVElNMjBTVykgJiYgIWRlZmluZWQoUkNDX0NGR1IzX1RJTTJTVykgXAorICYmICFkZWZpbmVkKFJDQ19DRkdSM19USU0zNFNXKQorCisjZGVmaW5lIElTX0xMX1JDQ19USU1fQ0xLU09VUkNFKF9fVkFMVUVfXykgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfVElNMV9DTEtTT1VSQ0UpKQorCisjZWxzZQorI2Vycm9yICJNaXNzIG1hY3JvIgorI2VuZGlmIC8qIFJDQ19DRkdSM19USU14U1cgKi8KKyNlbmRpZiAvKiBSQ0NfQ0ZHUjNfVElNU1cgKi8KKworI2lmIGRlZmluZWQoSFJUSU0xKQorI2RlZmluZSBJU19MTF9SQ0NfSFJUSU1fQ0xLU09VUkNFKF9fVkFMVUVfXykgICgoKF9fVkFMVUVfXykgPT0gTExfUkNDX0hSVElNMV9DTEtTT1VSQ0UpKQorI2VuZGlmIC8qIEhSVElNMSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSQ0NfTExfUHJpdmF0ZV9GdW5jdGlvbnMgUkNDIFByaXZhdGUgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3VpbnQzMl90IFJDQ19HZXRTeXN0ZW1DbG9ja0ZyZXEodm9pZCk7Cit1aW50MzJfdCBSQ0NfR2V0SENMS0Nsb2NrRnJlcSh1aW50MzJfdCBTWVNDTEtfRnJlcXVlbmN5KTsKK3VpbnQzMl90IFJDQ19HZXRQQ0xLMUNsb2NrRnJlcSh1aW50MzJfdCBIQ0xLX0ZyZXF1ZW5jeSk7Cit1aW50MzJfdCBSQ0NfR2V0UENMSzJDbG9ja0ZyZXEodWludDMyX3QgSENMS19GcmVxdWVuY3kpOwordWludDMyX3QgUkNDX1BMTF9HZXRGcmVxRG9tYWluX1NZUyh2b2lkKTsKKy8qKgorICAqIEB9CisgICovCisKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBSQ0NfTExfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFJDQ19MTF9FRl9Jbml0CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXNldCB0aGUgUkNDIGNsb2NrIGNvbmZpZ3VyYXRpb24gdG8gdGhlIGRlZmF1bHQgcmVzZXQgc3RhdGUuCisgICogQG5vdGUgICBUaGUgZGVmYXVsdCByZXNldCBzdGF0ZSBvZiB0aGUgY2xvY2sgY29uZmlndXJhdGlvbiBpcyBnaXZlbiBiZWxvdzoKKyAgKiAgICAgICAgIC0gSFNJIE9OIGFuZCB1c2VkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UKKyAgKiAgICAgICAgIC0gSFNFIGFuZCBQTEwgT0ZGCisgICogICAgICAgICAtIEFIQiwgQVBCMSBhbmQgQVBCMiBwcmVzY2FsZXIgc2V0IHRvIDEuCisgICogICAgICAgICAtIENTUywgTUNPIE9GRgorICAqICAgICAgICAgLSBBbGwgaW50ZXJydXB0cyBkaXNhYmxlZAorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IG1vZGlmeSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUKKyAgKiAgICAgICAgIC0gUGVyaXBoZXJhbCBjbG9ja3MKKyAgKiAgICAgICAgIC0gTFNJLCBMU0UgYW5kIFJUQyBjbG9ja3MKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogUkNDIHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBub3QgYXBwbGljYWJsZQorICAqLworRXJyb3JTdGF0dXMgTExfUkNDX0RlSW5pdCh2b2lkKQoreworICB1aW50MzJfdCB2bF9tYXNrID0gMFU7CisKKyAgLyogU2V0IEhTSU9OIGJpdCAqLworICBMTF9SQ0NfSFNJX0VuYWJsZSgpOworCisgIC8qIFdhaXQgZm9yIEhTSSBSRUFEWSBiaXQgKi8KKyAgd2hpbGUoTExfUkNDX0hTSV9Jc1JlYWR5KCkgIT0gMVUpCisgIHt9CisKKyAgLyogU2V0IEhTSVRSSU0gYml0cyB0byB0aGUgcmVzZXQgdmFsdWUqLworICBMTF9SQ0NfSFNJX1NldENhbGliVHJpbW1pbmcoMHgxMFUpOworCisgIC8qIFJlc2V0IFNXLCBIUFJFLCBQUFJFIGFuZCBNQ09TRUwgYml0cyAqLworICB2bF9tYXNrID0gMHhGRkZGRkZGRlU7CisgIENMRUFSX0JJVCh2bF9tYXNrLCAoUkNDX0NGR1JfU1cgfCBSQ0NfQ0ZHUl9IUFJFIHwgUkNDX0NGR1JfUFBSRTEgfCBSQ0NfQ0ZHUl9QUFJFMiB8IFJDQ19DRkdSX01DT1NFTCkpOworICBMTF9SQ0NfV3JpdGVSZWcoQ0ZHUiwgdmxfbWFzayk7CisKKyAgLyogV2FpdCB0aWxsIHN5c3RlbSBjbG9jayBzb3VyY2UgaXMgcmVhZHkgKi8KKyAgd2hpbGUoTExfUkNDX0dldFN5c0Nsa1NvdXJjZSgpICE9IExMX1JDQ19TWVNfQ0xLU09VUkNFX1NUQVRVU19IU0kpCisgIHt9CisKKyAgLyogUmVzZXQgSFNFT04sIENTU09OLCBQTExPTiBiaXRzICovCisgIHZsX21hc2sgPSAweEZGRkZGRkZGVTsKKyAgQ0xFQVJfQklUKHZsX21hc2ssIChSQ0NfQ1JfUExMT04gfCBSQ0NfQ1JfQ1NTT04gfCBSQ0NfQ1JfSFNFT04pKTsKKyAgTExfUkNDX1dyaXRlUmVnKENSLCB2bF9tYXNrKTsKKworICAvKiBXYWl0IGZvciBQTEwgUkVBRFkgYml0IHRvIGJlIHJlc2V0ICovCisgIHdoaWxlKExMX1JDQ19QTExfSXNSZWFkeSgpICE9IDBVKQorICB7fQorCisgIC8qIFJlc2V0IEhTRUJZUCBiaXQgKi8KKyAgTExfUkNDX0hTRV9EaXNhYmxlQnlwYXNzKCk7CisKKyAgLyogUmVzZXQgQ0ZHUiByZWdpc3RlciAqLworICBMTF9SQ0NfV3JpdGVSZWcoQ0ZHUiwgMHgwMDAwMDAwMFUpOworCisgIC8qIFJlc2V0IENGR1IyIHJlZ2lzdGVyICovCisgIExMX1JDQ19Xcml0ZVJlZyhDRkdSMiwgMHgwMDAwMDAwMFUpOworCisgIC8qIFJlc2V0IENGR1IzIHJlZ2lzdGVyICovCisgIExMX1JDQ19Xcml0ZVJlZyhDRkdSMywgMHgwMDAwMDAwMFUpOworCisgIC8qIENsZWFyIHBlbmRpbmcgZmxhZ3MgKi8KKyAgdmxfbWFzayA9IChMTF9SQ0NfQ0lSX0xTSVJEWUMgfCBMTF9SQ0NfQ0lSX0xTRVJEWUMgfCBMTF9SQ0NfQ0lSX0hTSVJEWUMgfCBMTF9SQ0NfQ0lSX0hTRVJEWUMgfCBMTF9SQ0NfQ0lSX1BMTFJEWUMgfCBMTF9SQ0NfQ0lSX0NTU0MpOworICBTRVRfQklUKFJDQy0+Q0lSLCB2bF9tYXNrKTsKKworICAvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisgIExMX1JDQ19Xcml0ZVJlZyhDSVIsIDB4MDAwMDAwMDBVKTsKKworICAvKiBDbGVhciByZXNldCBmbGFncyAqLworICBMTF9SQ0NfQ2xlYXJSZXNldEZsYWdzKCk7CisKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBSQ0NfTExfRUZfR2V0X0ZyZXEKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgZnJlcXVlbmNpZXMgb2YgZGlmZmVyZW50IG9uIGNoaXAgY2xvY2tzOyAgU3lzdGVtLCBBSEIsIEFQQjEgYW5kIEFQQjIgYnVzZXMgY2xvY2tzCisgICogICAgICAgICBhbmQgZGlmZmVyZW50IHBlcmlwaGVyYWwgY2xvY2tzIGF2YWlsYWJsZSBvbiB0aGUgZGV2aWNlLgorICAqIEBub3RlICAgSWYgU1lTQ0xLIHNvdXJjZSBpcyBIU0ksIGZ1bmN0aW9uIHJldHVybnMgdmFsdWVzIGJhc2VkIG9uIEhTSV9WQUxVRSgqKikKKyAgKiBAbm90ZSAgIElmIFNZU0NMSyBzb3VyY2UgaXMgSFNFLCBmdW5jdGlvbiByZXR1cm5zIHZhbHVlcyBiYXNlZCBvbiBIU0VfVkFMVUUoKioqKQorICAqIEBub3RlICAgSWYgU1lTQ0xLIHNvdXJjZSBpcyBQTEwsIGZ1bmN0aW9uIHJldHVybnMgdmFsdWVzIGJhc2VkIG9uIAorICAqICAgICAgICAgSFNJX1ZBTFVFKCoqKSBvciBIU0VfVkFMVUUoKioqKSBtdWx0aXBsaWVkL2RpdmlkZWQgYnkgdGhlIFBMTCBmYWN0b3JzLgorICAqIEBub3RlICAgKCoqKSBIU0lfVkFMVUUgaXMgYSBkZWZpbmVkIGNvbnN0YW50IGJ1dCB0aGUgcmVhbCB2YWx1ZSBtYXkgdmFyeSAKKyAgKiAgICAgICAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSB2YXJpYXRpb25zIGluIHZvbHRhZ2UgYW5kIHRlbXBlcmF0dXJlLgorICAqIEBub3RlICAgKCoqKikgSFNFX1ZBTFVFIGlzIGEgZGVmaW5lZCBjb25zdGFudCwgdXNlciBoYXMgdG8gZW5zdXJlIHRoYXQKKyAgKiAgICAgICAgICAgICAgIEhTRV9WQUxVRSBpcyBzYW1lIGFzIHRoZSByZWFsIGZyZXF1ZW5jeSBvZiB0aGUgY3J5c3RhbCB1c2VkLgorICAqICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGlzIGZ1bmN0aW9uIG1heSBoYXZlIHdyb25nIHJlc3VsdC4KKyAgKiBAbm90ZSAgIFRoZSByZXN1bHQgb2YgdGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBpbmNvcnJlY3Qgd2hlbiB1c2luZyBmcmFjdGlvbmFsCisgICogICAgICAgICB2YWx1ZSBmb3IgSFNFIGNyeXN0YWwuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGJ5IHRoZSB1c2VyIGFwcGxpY2F0aW9uIHRvIGNvbXB1dGUgdGhlCisgICogICAgICAgICBiYXVkLXJhdGUgZm9yIHRoZSBjb21tdW5pY2F0aW9uIHBlcmlwaGVyYWxzIG9yIGNvbmZpZ3VyZSBvdGhlciBwYXJhbWV0ZXJzLgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBmcmVxdWVuY2llcyBvZiBkaWZmZXJlbnQgb24gY2hpcCBjbG9ja3M7ICBTeXN0ZW0sIEFIQiwgQVBCMSBhbmQgQVBCMiBidXNlcyBjbG9ja3MKKyAgKiBAbm90ZSAgIEVhY2ggdGltZSBTWVNDTEssIEhDTEssIFBDTEsxIGFuZC9vciBQQ0xLMiBjbG9jayBjaGFuZ2VzLCB0aGlzIGZ1bmN0aW9uCisgICogICAgICAgICBtdXN0IGJlIGNhbGxlZCB0byB1cGRhdGUgc3RydWN0dXJlIGZpZWxkcy4gT3RoZXJ3aXNlLCBhbnkKKyAgKiAgICAgICAgIGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGluY29ycmVjdC4KKyAgKiBAcGFyYW0gIFJDQ19DbG9ja3MgcG9pbnRlciB0byBhIEByZWYgTExfUkNDX0Nsb2Nrc1R5cGVEZWYgc3RydWN0dXJlIHdoaWNoIHdpbGwgaG9sZCB0aGUgY2xvY2tzIGZyZXF1ZW5jaWVzCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX1JDQ19HZXRTeXN0ZW1DbG9ja3NGcmVxKExMX1JDQ19DbG9ja3NUeXBlRGVmICpSQ0NfQ2xvY2tzKQoreworICAvKiBHZXQgU1lTQ0xLIGZyZXF1ZW5jeSAqLworICBSQ0NfQ2xvY2tzLT5TWVNDTEtfRnJlcXVlbmN5ID0gUkNDX0dldFN5c3RlbUNsb2NrRnJlcSgpOworCisgIC8qIEhDTEsgY2xvY2sgZnJlcXVlbmN5ICovCisgIFJDQ19DbG9ja3MtPkhDTEtfRnJlcXVlbmN5ICAgPSBSQ0NfR2V0SENMS0Nsb2NrRnJlcShSQ0NfQ2xvY2tzLT5TWVNDTEtfRnJlcXVlbmN5KTsKKworICAvKiBQQ0xLMSBjbG9jayBmcmVxdWVuY3kgKi8KKyAgUkNDX0Nsb2Nrcy0+UENMSzFfRnJlcXVlbmN5ICA9IFJDQ19HZXRQQ0xLMUNsb2NrRnJlcShSQ0NfQ2xvY2tzLT5IQ0xLX0ZyZXF1ZW5jeSk7CisKKyAgLyogUENMSzIgY2xvY2sgZnJlcXVlbmN5ICovCisgIFJDQ19DbG9ja3MtPlBDTEsyX0ZyZXF1ZW5jeSAgPSBSQ0NfR2V0UENMSzJDbG9ja0ZyZXEoUkNDX0Nsb2Nrcy0+SENMS19GcmVxdWVuY3kpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBVU0FSVHggY2xvY2sgZnJlcXVlbmN5CisgICogQHBhcmFtICBVU0FSVHhTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDNfQ0xLU09VUkNFICgqKQorICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgICogQHJldHZhbCBVU0FSVCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05PIGluZGljYXRlcyB0aGF0IG9zY2lsbGF0b3IgKEhTSSBvciBMU0UpIGlzIG5vdCByZWFkeQorICAqLwordWludDMyX3QgTExfUkNDX0dldFVTQVJUQ2xvY2tGcmVxKHVpbnQzMl90IFVTQVJUeFNvdXJjZSkKK3sKKyAgdWludDMyX3QgdXNhcnRfZnJlcXVlbmN5ID0gTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk87CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19MTF9SQ0NfVVNBUlRfQ0xLU09VUkNFKFVTQVJUeFNvdXJjZSkpOworI2lmIGRlZmluZWQoUkNDX0NGR1IzX1VTQVJUMVNXKQorICBpZiAoVVNBUlR4U291cmNlID09IExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFKQorICB7CisgICAgLyogVVNBUlQxQ0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICAgIHN3aXRjaCAoTExfUkNDX0dldFVTQVJUQ2xvY2tTb3VyY2UoVVNBUlR4U291cmNlKSkKKyAgICB7CisgICAgICBjYXNlIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX1NZU0NMSzogLyogVVNBUlQxIENsb2NrIGlzIFN5c3RlbSBDbG9jayAqLworICAgICAgICB1c2FydF9mcmVxdWVuY3kgPSBSQ0NfR2V0U3lzdGVtQ2xvY2tGcmVxKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX0hTSTogICAgLyogVVNBUlQxIENsb2NrIGlzIEhTSSBPc2MuICovCisgICAgICAgIGlmIChMTF9SQ0NfSFNJX0lzUmVhZHkoKSkKKyAgICAgICAgeworICAgICAgICAgIHVzYXJ0X2ZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9MU0U6ICAgIC8qIFVTQVJUMSBDbG9jayBpcyBMU0UgT3NjLiAqLworICAgICAgICBpZiAoTExfUkNDX0xTRV9Jc1JlYWR5KCkpCisgICAgICAgIHsKKyAgICAgICAgICB1c2FydF9mcmVxdWVuY3kgPSBMU0VfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyNpZiBkZWZpbmVkKFJDQ19DRkdSM19VU0FSVDFTV19QQ0xLMSkKKyAgICAgIGNhc2UgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfUENMSzE6ICAvKiBVU0FSVDEgQ2xvY2sgaXMgUENMSzEgKi8KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHVzYXJ0X2ZyZXF1ZW5jeSA9IFJDQ19HZXRQQ0xLMUNsb2NrRnJlcShSQ0NfR2V0SENMS0Nsb2NrRnJlcShSQ0NfR2V0U3lzdGVtQ2xvY2tGcmVxKCkpKTsKKyNlbHNlCisgICAgICBjYXNlIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX1BDTEsyOiAgLyogVVNBUlQxIENsb2NrIGlzIFBDTEsyICovCisgICAgICBkZWZhdWx0OgorICAgICAgICB1c2FydF9mcmVxdWVuY3kgPSBSQ0NfR2V0UENMSzJDbG9ja0ZyZXEoUkNDX0dldEhDTEtDbG9ja0ZyZXEoUkNDX0dldFN5c3RlbUNsb2NrRnJlcSgpKSk7CisjZW5kaWYgLyogUkNDX0NGR1IzX1VTQVJUMVNXX1BDTEsxICovCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorI2VuZGlmIC8qIFJDQ19DRkdSM19VU0FSVDFTVyAgKi8KKworI2lmIGRlZmluZWQoUkNDX0NGR1IzX1VTQVJUMlNXKQorICBpZiAoVVNBUlR4U291cmNlID09IExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFKQorICB7CisgICAgLyogVVNBUlQyQ0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICAgIHN3aXRjaCAoTExfUkNDX0dldFVTQVJUQ2xvY2tTb3VyY2UoVVNBUlR4U291cmNlKSkKKyAgICB7CisgICAgICBjYXNlIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFX1NZU0NMSzogLyogVVNBUlQyIENsb2NrIGlzIFN5c3RlbSBDbG9jayAqLworICAgICAgICB1c2FydF9mcmVxdWVuY3kgPSBSQ0NfR2V0U3lzdGVtQ2xvY2tGcmVxKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFX0hTSTogICAgLyogVVNBUlQyIENsb2NrIGlzIEhTSSBPc2MuICovCisgICAgICAgIGlmIChMTF9SQ0NfSFNJX0lzUmVhZHkoKSkKKyAgICAgICAgeworICAgICAgICAgIHVzYXJ0X2ZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRV9MU0U6ICAgIC8qIFVTQVJUMiBDbG9jayBpcyBMU0UgT3NjLiAqLworICAgICAgICBpZiAoTExfUkNDX0xTRV9Jc1JlYWR5KCkpCisgICAgICAgIHsKKyAgICAgICAgICB1c2FydF9mcmVxdWVuY3kgPSBMU0VfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTExfUkNDX1VTQVJUMl9DTEtTT1VSQ0VfUENMSzE6ICAvKiBVU0FSVDIgQ2xvY2sgaXMgUENMSzEgKi8KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHVzYXJ0X2ZyZXF1ZW5jeSA9IFJDQ19HZXRQQ0xLMUNsb2NrRnJlcShSQ0NfR2V0SENMS0Nsb2NrRnJlcShSQ0NfR2V0U3lzdGVtQ2xvY2tGcmVxKCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisjZW5kaWYgLyogUkNDX0NGR1IzX1VTQVJUMlNXICovCisKKyNpZiBkZWZpbmVkKFJDQ19DRkdSM19VU0FSVDNTVykKKyAgaWYgKFVTQVJUeFNvdXJjZSA9PSBMTF9SQ0NfVVNBUlQzX0NMS1NPVVJDRSkKKyAgeworICAgIC8qIFVTQVJUM0NMSyBjbG9jayBmcmVxdWVuY3kgKi8KKyAgICBzd2l0Y2ggKExMX1JDQ19HZXRVU0FSVENsb2NrU291cmNlKFVTQVJUeFNvdXJjZSkpCisgICAgeworICAgICAgY2FzZSBMTF9SQ0NfVVNBUlQzX0NMS1NPVVJDRV9TWVNDTEs6IC8qIFVTQVJUMyBDbG9jayBpcyBTeXN0ZW0gQ2xvY2sgKi8KKyAgICAgICAgdXNhcnRfZnJlcXVlbmN5ID0gUkNDX0dldFN5c3RlbUNsb2NrRnJlcSgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBMTF9SQ0NfVVNBUlQzX0NMS1NPVVJDRV9IU0k6ICAgIC8qIFVTQVJUMyBDbG9jayBpcyBIU0kgT3NjLiAqLworICAgICAgICBpZiAoTExfUkNDX0hTSV9Jc1JlYWR5KCkpCisgICAgICAgIHsKKyAgICAgICAgICB1c2FydF9mcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTExfUkNDX1VTQVJUM19DTEtTT1VSQ0VfTFNFOiAgICAvKiBVU0FSVDMgQ2xvY2sgaXMgTFNFIE9zYy4gKi8KKyAgICAgICAgaWYgKExMX1JDQ19MU0VfSXNSZWFkeSgpKQorICAgICAgICB7CisgICAgICAgICAgdXNhcnRfZnJlcXVlbmN5ID0gTFNFX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIExMX1JDQ19VU0FSVDNfQ0xLU09VUkNFX1BDTEsxOiAgLyogVVNBUlQzIENsb2NrIGlzIFBDTEsxICovCisgICAgICBkZWZhdWx0OgorICAgICAgICB1c2FydF9mcmVxdWVuY3kgPSBSQ0NfR2V0UENMSzFDbG9ja0ZyZXEoUkNDX0dldEhDTEtDbG9ja0ZyZXEoUkNDX0dldFN5c3RlbUNsb2NrRnJlcSgpKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisjZW5kaWYgLyogUkNDX0NGR1IzX1VTQVJUM1NXICovCisgIHJldHVybiB1c2FydF9mcmVxdWVuY3k7Cit9CisKKyNpZiBkZWZpbmVkKFVBUlQ0KSB8fCBkZWZpbmVkKFVBUlQ1KQorLyoqCisgICogQGJyaWVmICBSZXR1cm4gVUFSVHggY2xvY2sgZnJlcXVlbmN5CisgICogQHBhcmFtICBVQVJUeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VQVJUNF9DTEtTT1VSQ0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVUFSVDVfQ0xLU09VUkNFCisgICogQHJldHZhbCBVQVJUIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk8gaW5kaWNhdGVzIHRoYXQgb3NjaWxsYXRvciAoSFNJIG9yIExTRSkgaXMgbm90IHJlYWR5CisgICovCit1aW50MzJfdCBMTF9SQ0NfR2V0VUFSVENsb2NrRnJlcSh1aW50MzJfdCBVQVJUeFNvdXJjZSkKK3sKKyAgdWludDMyX3QgdWFydF9mcmVxdWVuY3kgPSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTzsKKworICAvKiBDaGVjayBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JDQ19VQVJUX0NMS1NPVVJDRShVQVJUeFNvdXJjZSkpOworCisjaWYgZGVmaW5lZChVQVJUNCkKKyAgaWYgKFVBUlR4U291cmNlID09IExMX1JDQ19VQVJUNF9DTEtTT1VSQ0UpCisgIHsKKyAgICAvKiBVQVJUNENMSyBjbG9jayBmcmVxdWVuY3kgKi8KKyAgICBzd2l0Y2ggKExMX1JDQ19HZXRVQVJUQ2xvY2tTb3VyY2UoVUFSVHhTb3VyY2UpKQorICAgIHsKKyAgICAgIGNhc2UgTExfUkNDX1VBUlQ0X0NMS1NPVVJDRV9TWVNDTEs6IC8qIFVBUlQ0IENsb2NrIGlzIFN5c3RlbSBDbG9jayAqLworICAgICAgICB1YXJ0X2ZyZXF1ZW5jeSA9IFJDQ19HZXRTeXN0ZW1DbG9ja0ZyZXEoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTExfUkNDX1VBUlQ0X0NMS1NPVVJDRV9IU0k6ICAgIC8qIFVBUlQ0IENsb2NrIGlzIEhTSSBPc2MuICovCisgICAgICAgIGlmIChMTF9SQ0NfSFNJX0lzUmVhZHkoKSkKKyAgICAgICAgeworICAgICAgICAgIHVhcnRfZnJlcXVlbmN5ID0gSFNJX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIExMX1JDQ19VQVJUNF9DTEtTT1VSQ0VfTFNFOiAgICAvKiBVQVJUNCBDbG9jayBpcyBMU0UgT3NjLiAqLworICAgICAgICBpZiAoTExfUkNDX0xTRV9Jc1JlYWR5KCkpCisgICAgICAgIHsKKyAgICAgICAgICB1YXJ0X2ZyZXF1ZW5jeSA9IExTRV9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBMTF9SQ0NfVUFSVDRfQ0xLU09VUkNFX1BDTEsxOiAgLyogVUFSVDQgQ2xvY2sgaXMgUENMSzEgKi8KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHVhcnRfZnJlcXVlbmN5ID0gUkNDX0dldFBDTEsxQ2xvY2tGcmVxKFJDQ19HZXRIQ0xLQ2xvY2tGcmVxKFJDQ19HZXRTeXN0ZW1DbG9ja0ZyZXEoKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBVQVJUNCAqLworCisjaWYgZGVmaW5lZChVQVJUNSkKKyAgaWYgKFVBUlR4U291cmNlID09IExMX1JDQ19VQVJUNV9DTEtTT1VSQ0UpCisgIHsKKyAgICAvKiBVQVJUNUNMSyBjbG9jayBmcmVxdWVuY3kgKi8KKyAgICBzd2l0Y2ggKExMX1JDQ19HZXRVQVJUQ2xvY2tTb3VyY2UoVUFSVHhTb3VyY2UpKQorICAgIHsKKyAgICAgIGNhc2UgTExfUkNDX1VBUlQ1X0NMS1NPVVJDRV9TWVNDTEs6IC8qIFVBUlQ1IENsb2NrIGlzIFN5c3RlbSBDbG9jayAqLworICAgICAgICB1YXJ0X2ZyZXF1ZW5jeSA9IFJDQ19HZXRTeXN0ZW1DbG9ja0ZyZXEoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTExfUkNDX1VBUlQ1X0NMS1NPVVJDRV9IU0k6ICAgIC8qIFVBUlQ1IENsb2NrIGlzIEhTSSBPc2MuICovCisgICAgICAgIGlmIChMTF9SQ0NfSFNJX0lzUmVhZHkoKSkKKyAgICAgICAgeworICAgICAgICAgIHVhcnRfZnJlcXVlbmN5ID0gSFNJX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIExMX1JDQ19VQVJUNV9DTEtTT1VSQ0VfTFNFOiAgICAvKiBVQVJUNSBDbG9jayBpcyBMU0UgT3NjLiAqLworICAgICAgICBpZiAoTExfUkNDX0xTRV9Jc1JlYWR5KCkpCisgICAgICAgIHsKKyAgICAgICAgICB1YXJ0X2ZyZXF1ZW5jeSA9IExTRV9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBMTF9SQ0NfVUFSVDVfQ0xLU09VUkNFX1BDTEsxOiAgLyogVUFSVDUgQ2xvY2sgaXMgUENMSzEgKi8KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHVhcnRfZnJlcXVlbmN5ID0gUkNDX0dldFBDTEsxQ2xvY2tGcmVxKFJDQ19HZXRIQ0xLQ2xvY2tGcmVxKFJDQ19HZXRTeXN0ZW1DbG9ja0ZyZXEoKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBVQVJUNSAqLworCisgIHJldHVybiB1YXJ0X2ZyZXF1ZW5jeTsKK30KKyNlbmRpZiAvKiBVQVJUNCB8fCBVQVJUNSAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBJMkN4IGNsb2NrIGZyZXF1ZW5jeQorICAqIEBwYXJhbSAgSTJDeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMxX0NMS1NPVVJDRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMyX0NMS1NPVVJDRSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDM19DTEtTT1VSQ0UgKCopCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcworICAqIEByZXR2YWwgSTJDIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk8gaW5kaWNhdGVzIHRoYXQgSFNJIG9zY2lsbGF0b3IgaXMgbm90IHJlYWR5CisgICovCit1aW50MzJfdCBMTF9SQ0NfR2V0STJDQ2xvY2tGcmVxKHVpbnQzMl90IEkyQ3hTb3VyY2UpCit7CisgIHVpbnQzMl90IGkyY19mcmVxdWVuY3kgPSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTzsKKworICAvKiBDaGVjayBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JDQ19JMkNfQ0xLU09VUkNFKEkyQ3hTb3VyY2UpKTsKKworICAvKiBJMkMxIENMSyBjbG9jayBmcmVxdWVuY3kgKi8KKyAgaWYgKEkyQ3hTb3VyY2UgPT0gTExfUkNDX0kyQzFfQ0xLU09VUkNFKQorICB7CisgICAgc3dpdGNoIChMTF9SQ0NfR2V0STJDQ2xvY2tTb3VyY2UoSTJDeFNvdXJjZSkpCisgICAgeworICAgICAgY2FzZSBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0VfU1lTQ0xLOiAvKiBJMkMxIENsb2NrIGlzIFN5c3RlbSBDbG9jayAqLworICAgICAgICBpMmNfZnJlcXVlbmN5ID0gUkNDX0dldFN5c3RlbUNsb2NrRnJlcSgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0VfSFNJOiAgICAvKiBJMkMxIENsb2NrIGlzIEhTSSBPc2MuICovCisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAoTExfUkNDX0hTSV9Jc1JlYWR5KCkpCisgICAgICAgIHsKKyAgICAgICAgICBpMmNfZnJlcXVlbmN5ID0gSFNJX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfSTJDMlNXKQorICAvKiBJMkMyIENMSyBjbG9jayBmcmVxdWVuY3kgKi8KKyAgaWYgKEkyQ3hTb3VyY2UgPT0gTExfUkNDX0kyQzJfQ0xLU09VUkNFKQorICB7CisgICAgc3dpdGNoIChMTF9SQ0NfR2V0STJDQ2xvY2tTb3VyY2UoSTJDeFNvdXJjZSkpCisgICAgeworICAgICAgY2FzZSBMTF9SQ0NfSTJDMl9DTEtTT1VSQ0VfU1lTQ0xLOiAvKiBJMkMyIENsb2NrIGlzIFN5c3RlbSBDbG9jayAqLworICAgICAgICBpMmNfZnJlcXVlbmN5ID0gUkNDX0dldFN5c3RlbUNsb2NrRnJlcSgpOworICAgICAgICBicmVhazsKKwkKKyAgICAgIGNhc2UgTExfUkNDX0kyQzJfQ0xLU09VUkNFX0hTSTogICAgLyogSTJDMiBDbG9jayBpcyBIU0kgT3NjLiAqLworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKExMX1JDQ19IU0lfSXNSZWFkeSgpKQorICAgICAgICB7CisgICAgICAgICAgaTJjX2ZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyNlbmRpZiAvKlJDQ19DRkdSM19JMkMyU1cqLworCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfSTJDM1NXKQorICAvKiBJMkMzIENMSyBjbG9jayBmcmVxdWVuY3kgKi8KKyAgaWYgKEkyQ3hTb3VyY2UgPT0gTExfUkNDX0kyQzNfQ0xLU09VUkNFKQorICB7CisgICAgc3dpdGNoIChMTF9SQ0NfR2V0STJDQ2xvY2tTb3VyY2UoSTJDeFNvdXJjZSkpCisgICAgeworICAgICAgY2FzZSBMTF9SQ0NfSTJDM19DTEtTT1VSQ0VfU1lTQ0xLOiAvKiBJMkMzIENsb2NrIGlzIFN5c3RlbSBDbG9jayAqLworICAgICAgICBpMmNfZnJlcXVlbmN5ID0gUkNDX0dldFN5c3RlbUNsb2NrRnJlcSgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBMTF9SQ0NfSTJDM19DTEtTT1VSQ0VfSFNJOiAgICAvKiBJMkMzIENsb2NrIGlzIEhTSSBPc2MuICovCisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAoTExfUkNDX0hTSV9Jc1JlYWR5KCkpCisgICAgICAgIHsKKyAgICAgICAgICBpMmNfZnJlcXVlbmN5ID0gSFNJX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorI2VuZGlmIC8qUkNDX0NGR1IzX0kyQzNTVyovCisKKyAgcmV0dXJuIGkyY19mcmVxdWVuY3k7Cit9CisKKyNpZiAgZGVmaW5lZChSQ0NfQ0ZHUl9JMlNTUkMpCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBJMlN4IGNsb2NrIGZyZXF1ZW5jeQorICAqIEBwYXJhbSAgSTJTeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMlNfQ0xLU09VUkNFCisgICogQHJldHZhbCBJMlMgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OQSBpbmRpY2F0ZXMgdGhhdCBleHRlcm5hbCBjbG9jayBpcyB1c2VkICovCit1aW50MzJfdCBMTF9SQ0NfR2V0STJTQ2xvY2tGcmVxKHVpbnQzMl90IEkyU3hTb3VyY2UpCit7CisgIHVpbnQzMl90IGkyc19mcmVxdWVuY3kgPSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTzsKKworICAvKiBDaGVjayBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JDQ19JMlNfQ0xLU09VUkNFKEkyU3hTb3VyY2UpKTsKKworICAvKiBJMlMxQ0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICBzd2l0Y2ggKExMX1JDQ19HZXRJMlNDbG9ja1NvdXJjZShJMlN4U291cmNlKSkKKyAgeworICAgIGNhc2UgTExfUkNDX0kyU19DTEtTT1VSQ0VfU1lTQ0xLOiAvKiE8IFN5c3RlbSBjbG9jayBzZWxlY3RlZCBhcyBJMlMgY2xvY2sgc291cmNlICovCisgICAgICBpMnNfZnJlcXVlbmN5ID0gUkNDX0dldFN5c3RlbUNsb2NrRnJlcSgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19JMlNfQ0xLU09VUkNFX1BJTjogICAgLyohPCBFeHRlcm5hbCBjbG9jayBzZWxlY3RlZCBhcyBJMlMgY2xvY2sgc291cmNlICovCisgICAgZGVmYXVsdDoKKyAgICAgIGkyc19mcmVxdWVuY3kgPSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OQTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGkyc19mcmVxdWVuY3k7Cit9CisjZW5kaWYgLyogUkNDX0NGR1JfSTJTU1JDICovCisjaWYgZGVmaW5lZChVU0IpCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBVU0J4IGNsb2NrIGZyZXF1ZW5jeQorICAqIEBwYXJhbSAgVVNCeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0JfQ0xLU09VUkNFCisgICogQHJldHZhbCBVU0IgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTyBpbmRpY2F0ZXMgdGhhdCBvc2NpbGxhdG9yIChIU0k0OCkgb3IgUExMIGlzIG5vdCByZWFkeQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05BIGluZGljYXRlcyB0aGF0IG5vIGNsb2NrIHNvdXJjZSBzZWxlY3RlZAorICAqLwordWludDMyX3QgTExfUkNDX0dldFVTQkNsb2NrRnJlcSh1aW50MzJfdCBVU0J4U291cmNlKQoreworICB1aW50MzJfdCB1c2JfZnJlcXVlbmN5ID0gTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk87CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19MTF9SQ0NfVVNCX0NMS1NPVVJDRShVU0J4U291cmNlKSk7CisKKyAgLyogVVNCQ0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICBzd2l0Y2ggKExMX1JDQ19HZXRVU0JDbG9ja1NvdXJjZShVU0J4U291cmNlKSkKKyAgeworICAgIGNhc2UgTExfUkNDX1VTQl9DTEtTT1VSQ0VfUExMOiAgICAgICAgLyogUExMIGNsb2NrIHVzZWQgYXMgVVNCIGNsb2NrIHNvdXJjZSAqLworICAgICAgaWYgKExMX1JDQ19QTExfSXNSZWFkeSgpKQorICAgICAgeworICAgICAgICB1c2JfZnJlcXVlbmN5ID0gUkNDX1BMTF9HZXRGcmVxRG9tYWluX1NZUygpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19VU0JfQ0xLU09VUkNFX1BMTF9ESVZfMV81OiAgICAgICAgLyogUExMIGNsb2NrIHVzZWQgYXMgVVNCIGNsb2NrIHNvdXJjZSAqLworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoTExfUkNDX1BMTF9Jc1JlYWR5KCkpCisgICAgICB7CisgICAgICAgIHVzYl9mcmVxdWVuY3kgPSAoUkNDX1BMTF9HZXRGcmVxRG9tYWluX1NZUygpICogM1UpIC8gMlU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiB1c2JfZnJlcXVlbmN5OworfQorI2VuZGlmIC8qIFVTQiAqLworCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUl9BRENQUkUpIHx8IGRlZmluZWQoUkNDX0NGR1IyX0FEQzFQUkVTKSB8fCBkZWZpbmVkKFJDQ19DRkdSMl9BRENQUkUxMikgfHwgZGVmaW5lZChSQ0NfQ0ZHUjJfQURDUFJFMzQpCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBBREN4IGNsb2NrIGZyZXF1ZW5jeQorICAqIEBwYXJhbSAgQURDeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BRENfQ0xLU09VUkNFICAgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzFfQ0xLU09VUkNFICAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMTJfQ0xLU09VUkNFICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMzNF9DTEtTT1VSQ0UgKCopCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcworICAqIEByZXR2YWwgQURDIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICovCit1aW50MzJfdCBMTF9SQ0NfR2V0QURDQ2xvY2tGcmVxKHVpbnQzMl90IEFEQ3hTb3VyY2UpCit7CisgIHVpbnQzMl90IGFkY19wcmVzY2FsZXIgPSAwVTsKKyAgdWludDMyX3QgYWRjX2ZyZXF1ZW5jeSA9IExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05POworCisgIC8qIENoZWNrIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfTExfUkNDX0FEQ19DTEtTT1VSQ0UoQURDeFNvdXJjZSkpOworCisgIC8qIEdldCBBREMgcHJlc2NhbGVyICovCisgIGFkY19wcmVzY2FsZXIgPSBMTF9SQ0NfR2V0QURDQ2xvY2tTb3VyY2UoQURDeFNvdXJjZSk7CisKKyNpZiBkZWZpbmVkKFJDQ19DRkdSX0FEQ1BSRSkKKyAgLyogQURDIGZyZXF1ZW5jeSA9IFBDTEsyIGZyZXF1ZW5jeSAvIEFEQyBwcmVzY2FsZXIgKDIsIDQsIDYgb3IgOCkgKi8KKyAgYWRjX2ZyZXF1ZW5jeSA9IFJDQ19HZXRQQ0xLMkNsb2NrRnJlcShSQ0NfR2V0SENMS0Nsb2NrRnJlcShSQ0NfR2V0U3lzdGVtQ2xvY2tGcmVxKCkpKQorICAgICAgICAgICAgICAgICAgLyAoKChhZGNfcHJlc2NhbGVyID4+IFBPU0lUSU9OX1ZBTChBREN4U291cmNlKSkgKyAxVSkgKiAyVSk7CisjZWxzZQorICBpZiAoKGFkY19wcmVzY2FsZXIgJiAweDAwMDBGRkZGVSkgPT0gKCh1aW50MzJfdCkweDAwMDAwMDAwVSkpCisgIHsKKyAgICAvKiBBREMgZnJlcXVlbmN5ID0gSENMSyBmcmVxdWVuY3kgKi8KKyAgICBhZGNfZnJlcXVlbmN5ID0gUkNDX0dldEhDTEtDbG9ja0ZyZXEoUkNDX0dldFN5c3RlbUNsb2NrRnJlcSgpKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBBREMgZnJlcXVlbmN5ID0gUENMSzIgZnJlcXVlbmN5IC8gQURDIHByZXNjYWxlciAoZnJvbSAxIHRvIDI1NikgKi8KKyAgICBhZGNfZnJlcXVlbmN5ID0gUkNDX0dldFBDTEsyQ2xvY2tGcmVxKFJDQ19HZXRIQ0xLQ2xvY2tGcmVxKFJDQ19HZXRTeXN0ZW1DbG9ja0ZyZXEoKSkpCisgICAgICAgICAgICAgICAgICAgIC8gKGFBRENQcmVzY1RhYmxlWygoYWRjX3ByZXNjYWxlciAmIDB4MDAwMEZGRkZVKSA+PiBQT1NJVElPTl9WQUwoQURDeFNvdXJjZSkpICYgMHhGVV0pOworICB9CisjZW5kaWYgLyogUkNDX0NGR1JfQURDUFJFICovCisKKyAgcmV0dXJuIGFkY19mcmVxdWVuY3k7Cit9CisjZW5kaWYgLypSQ0NfQ0ZHUl9BRENQUkUgfHwgUkNDX0NGR1IyX0FEQzFQUkVTIHx8IFJDQ19DRkdSMl9BRENQUkUxMiB8fCBSQ0NfQ0ZHUjJfQURDUFJFMzQgKi8KKworI2lmIGRlZmluZWQoUkNDX0NGR1JfU0RQUkUpCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBTREFEQ3ggY2xvY2sgZnJlcXVlbmN5CisgICogQHBhcmFtICBTREFEQ3hTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU0RBRENfQ0xLU09VUkNFCisgICogQHJldHZhbCBTREFEQyBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqLwordWludDMyX3QgTExfUkNDX0dldFNEQURDQ2xvY2tGcmVxKHVpbnQzMl90IFNEQURDeFNvdXJjZSkKK3sKKyAgdWludDMyX3Qgc2RhZGNfcHJlc2NhbGVyID0gMFU7CisgIHVpbnQzMl90IHNkYWRjX2ZyZXF1ZW5jeSA9IExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05POworCisgIC8qIENoZWNrIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfTExfUkNDX1NEQURDX0NMS1NPVVJDRShTREFEQ3hTb3VyY2UpKTsKKworICAvKiBHZXQgU0RBREMgcHJlc2NhbGVyICovCisgIHNkYWRjX3ByZXNjYWxlciA9IExMX1JDQ19HZXRTREFEQ0Nsb2NrU291cmNlKFNEQURDeFNvdXJjZSk7CisKKyAgLyogU0RBREMgZnJlcXVlbmN5ID0gU1lTVEVNIGZyZXF1ZW5jeSAvIFNEQURDIHByZXNjYWxlciAoZnJvbSAyIHRvIDQ4KSAqLworICBzZGFkY19mcmVxdWVuY3kgPSBSQ0NfR2V0U3lzdGVtQ2xvY2tGcmVxKCkKKyAgICAgICAgICAgICAgICAgICAgLyAoYVNEQURDUHJlc2NUYWJsZVsoc2RhZGNfcHJlc2NhbGVyID4+IFBPU0lUSU9OX1ZBTChTREFEQ3hTb3VyY2UpKSAmIDB4RlVdKTsKKworICByZXR1cm4gc2RhZGNfZnJlcXVlbmN5OworfQorI2VuZGlmIC8qUkNDX0NGR1JfU0RQUkUgKi8KKworI2lmIGRlZmluZWQoQ0VDKQorLyoqCisgICogQGJyaWVmICBSZXR1cm4gQ0VDeCBjbG9jayBmcmVxdWVuY3kKKyAgKiBAcGFyYW0gIENFQ3hTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQ0VDX0NMS1NPVVJDRQorICAqIEByZXR2YWwgQ0VDIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICogICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTyBpbmRpY2F0ZXMgdGhhdCBvc2NpbGxhdG9ycyAoSFNJIG9yIExTRSkgYXJlIG5vdCByZWFkeQorICAqLwordWludDMyX3QgTExfUkNDX0dldENFQ0Nsb2NrRnJlcSh1aW50MzJfdCBDRUN4U291cmNlKQoreworICB1aW50MzJfdCBjZWNfZnJlcXVlbmN5ID0gTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk87CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19MTF9SQ0NfQ0VDX0NMS1NPVVJDRShDRUN4U291cmNlKSk7CisKKyAgLyogQ0VDQ0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICBzd2l0Y2ggKExMX1JDQ19HZXRDRUNDbG9ja1NvdXJjZShDRUN4U291cmNlKSkKKyAgeworICAgIGNhc2UgTExfUkNDX0NFQ19DTEtTT1VSQ0VfSFNJX0RJVjI0NDogICAvKiBIU0kgLyAyNDQgY2xvY2sgdXNlZCBhcyBDRUMgY2xvY2sgc291cmNlICovCisgICAgICBpZiAoTExfUkNDX0hTSV9Jc1JlYWR5KCkpCisgICAgICB7CisgICAgICAgIGNlY19mcmVxdWVuY3kgPSBIU0lfVkFMVUUgLyAyNDRVOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19DRUNfQ0xLU09VUkNFX0xTRTogICAgICAgICAgLyogTFNFIGNsb2NrIHVzZWQgYXMgQ0VDIGNsb2NrIHNvdXJjZSAqLworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoTExfUkNDX0xTRV9Jc1JlYWR5KCkpCisgICAgICB7CisgICAgICAgIGNlY19mcmVxdWVuY3kgPSBMU0VfVkFMVUU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBjZWNfZnJlcXVlbmN5OworfQorI2VuZGlmIC8qIENFQyAqLworCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfVElNU1cpCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBUSU14IGNsb2NrIGZyZXF1ZW5jeQorICAqIEBwYXJhbSAgVElNeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19USU0xX0NMS1NPVVJDRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19USU04X0NMS1NPVVJDRSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVElNMTVfQ0xLU09VUkNFICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19USU0xNl9DTEtTT1VSQ0UgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1RJTTE3X0NMS1NPVVJDRSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVElNMjBfQ0xLU09VUkNFICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19USU0yX0NMS1NPVVJDRSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVElNMzRfQ0xLU09VUkNFICgqKQorICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMKKyAgKiBAcmV0dmFsIFRJTSBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqLwordWludDMyX3QgTExfUkNDX0dldFRJTUNsb2NrRnJlcSh1aW50MzJfdCBUSU14U291cmNlKQoreworICB1aW50MzJfdCB0aW1fZnJlcXVlbmN5ID0gTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk87CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19MTF9SQ0NfVElNX0NMS1NPVVJDRShUSU14U291cmNlKSk7CisKKyAgaWYgKFRJTXhTb3VyY2UgPT0gTExfUkNDX1RJTTFfQ0xLU09VUkNFKQorICB7CisgICAgLyogVElNMUNMSyBjbG9jayBmcmVxdWVuY3kgKi8KKyAgICBpZiAoTExfUkNDX0dldFRJTUNsb2NrU291cmNlKExMX1JDQ19USU0xX0NMS1NPVVJDRSkgPT0gTExfUkNDX1RJTTFfQ0xLU09VUkNFX1BDTEsyKQorICAgIHsKKyAgICAgIC8qIFBDTEsyIHVzZWQgYXMgVElNMSBjbG9jayBzb3VyY2UgKi8KKyAgICAgIHRpbV9mcmVxdWVuY3kgPSBSQ0NfR2V0UENMSzJDbG9ja0ZyZXEoUkNDX0dldEhDTEtDbG9ja0ZyZXEoUkNDX0dldFN5c3RlbUNsb2NrRnJlcSgpKSk7CisgICAgfQorICAgIGVsc2UgLyogTExfUkNDX1RJTTFfQ0xLU09VUkNFX1BMTCAqLworICAgIHsKKyAgICAgIC8qIFBMTCBjbG9jayB1c2VkIGFzIFRJTTEgY2xvY2sgc291cmNlICovCisgICAgICB0aW1fZnJlcXVlbmN5ID0gUkNDX1BMTF9HZXRGcmVxRG9tYWluX1NZUygpOworICAgIH0KKyAgfQorCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfVElNOFNXKQorICBpZiAoVElNeFNvdXJjZSA9PSBMTF9SQ0NfVElNOF9DTEtTT1VSQ0UpCisgIHsKKyAgICAvKiBUSU04Q0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICAgIGlmIChMTF9SQ0NfR2V0VElNQ2xvY2tTb3VyY2UoTExfUkNDX1RJTThfQ0xLU09VUkNFKSA9PSBMTF9SQ0NfVElNOF9DTEtTT1VSQ0VfUENMSzIpCisgICAgeworICAgICAgLyogUENMSzIgdXNlZCBhcyBUSU04IGNsb2NrIHNvdXJjZSAqLworICAgICAgdGltX2ZyZXF1ZW5jeSA9IFJDQ19HZXRQQ0xLMkNsb2NrRnJlcShSQ0NfR2V0SENMS0Nsb2NrRnJlcShSQ0NfR2V0U3lzdGVtQ2xvY2tGcmVxKCkpKTsKKyAgICB9CisgICAgZWxzZSAvKiBMTF9SQ0NfVElNOF9DTEtTT1VSQ0VfUExMICovCisgICAgeworICAgICAgLyogUExMIGNsb2NrIHVzZWQgYXMgVElNOCBjbG9jayBzb3VyY2UgKi8KKyAgICAgIHRpbV9mcmVxdWVuY3kgPSBSQ0NfUExMX0dldEZyZXFEb21haW5fU1lTKCk7CisgICAgfQorICB9CisjZW5kaWYgLypSQ0NfQ0ZHUjNfVElNOFNXKi8KKworI2lmIGRlZmluZWQoUkNDX0NGR1IzX1RJTTE1U1cpCisgIGlmIChUSU14U291cmNlID09IExMX1JDQ19USU0xNV9DTEtTT1VSQ0UpCisgIHsKKyAgICAvKiBUSU0xNUNMSyBjbG9jayBmcmVxdWVuY3kgKi8KKyAgICBpZiAoTExfUkNDX0dldFRJTUNsb2NrU291cmNlKExMX1JDQ19USU0xNV9DTEtTT1VSQ0UpID09IExMX1JDQ19USU0xNV9DTEtTT1VSQ0VfUENMSzIpCisgICAgeworICAgICAgLyogUENMSzIgdXNlZCBhcyBUSU0xNSBjbG9jayBzb3VyY2UgKi8KKyAgICAgIHRpbV9mcmVxdWVuY3kgPSBSQ0NfR2V0UENMSzJDbG9ja0ZyZXEoUkNDX0dldEhDTEtDbG9ja0ZyZXEoUkNDX0dldFN5c3RlbUNsb2NrRnJlcSgpKSk7CisgICAgfQorICAgIGVsc2UgLyogTExfUkNDX1RJTTE1X0NMS1NPVVJDRV9QTEwgKi8KKyAgICB7CisgICAgICAvKiBQTEwgY2xvY2sgdXNlZCBhcyBUSU0xNSBjbG9jayBzb3VyY2UgKi8KKyAgICAgIHRpbV9mcmVxdWVuY3kgPSBSQ0NfUExMX0dldEZyZXFEb21haW5fU1lTKCk7CisgICAgfQorICB9CisjZW5kaWYgLypSQ0NfQ0ZHUjNfVElNMTVTVyovCisKKyNpZiBkZWZpbmVkKFJDQ19DRkdSM19USU0xNlNXKQorICBpZiAoVElNeFNvdXJjZSA9PSBMTF9SQ0NfVElNMTZfQ0xLU09VUkNFKQorICB7CisgICAgLyogVElNMTZDTEsgY2xvY2sgZnJlcXVlbmN5ICovCisgICAgaWYgKExMX1JDQ19HZXRUSU1DbG9ja1NvdXJjZShMTF9SQ0NfVElNMTZfQ0xLU09VUkNFKSA9PSBMTF9SQ0NfVElNMTZfQ0xLU09VUkNFX1BDTEsyKQorICAgIHsKKyAgICAgIC8qIFBDTEsyIHVzZWQgYXMgVElNMTYgY2xvY2sgc291cmNlICovCisgICAgICB0aW1fZnJlcXVlbmN5ID0gUkNDX0dldFBDTEsyQ2xvY2tGcmVxKFJDQ19HZXRIQ0xLQ2xvY2tGcmVxKFJDQ19HZXRTeXN0ZW1DbG9ja0ZyZXEoKSkpOworICAgIH0KKyAgICBlbHNlIC8qIExMX1JDQ19USU0xNl9DTEtTT1VSQ0VfUExMICovCisgICAgeworICAgICAgLyogUExMIGNsb2NrIHVzZWQgYXMgVElNMTYgY2xvY2sgc291cmNlICovCisgICAgICB0aW1fZnJlcXVlbmN5ID0gUkNDX1BMTF9HZXRGcmVxRG9tYWluX1NZUygpOworICAgIH0KKyAgfQorI2VuZGlmIC8qUkNDX0NGR1IzX1RJTTE2U1cqLworCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfVElNMTdTVykKKyAgaWYgKFRJTXhTb3VyY2UgPT0gTExfUkNDX1RJTTE3X0NMS1NPVVJDRSkKKyAgeworICAgIC8qIFRJTTE3Q0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICAgIGlmIChMTF9SQ0NfR2V0VElNQ2xvY2tTb3VyY2UoTExfUkNDX1RJTTE3X0NMS1NPVVJDRSkgPT0gTExfUkNDX1RJTTE3X0NMS1NPVVJDRV9QQ0xLMikKKyAgICB7CisgICAgICAvKiBQQ0xLMiB1c2VkIGFzIFRJTTE3IGNsb2NrIHNvdXJjZSAqLworICAgICAgdGltX2ZyZXF1ZW5jeSA9IFJDQ19HZXRQQ0xLMkNsb2NrRnJlcShSQ0NfR2V0SENMS0Nsb2NrRnJlcShSQ0NfR2V0U3lzdGVtQ2xvY2tGcmVxKCkpKTsKKyAgICB9CisgICAgZWxzZSAvKiBMTF9SQ0NfVElNMTdfQ0xLU09VUkNFX1BMTCAqLworICAgIHsKKyAgICAgIC8qIFBMTCBjbG9jayB1c2VkIGFzIFRJTTE3IGNsb2NrIHNvdXJjZSAqLworICAgICAgdGltX2ZyZXF1ZW5jeSA9IFJDQ19QTExfR2V0RnJlcURvbWFpbl9TWVMoKTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKlJDQ19DRkdSM19USU0xN1NXKi8KKworI2lmIGRlZmluZWQoUkNDX0NGR1IzX1RJTTIwU1cpCisgIGlmIChUSU14U291cmNlID09IExMX1JDQ19USU0yMF9DTEtTT1VSQ0UpCisgIHsKKyAgICAvKiBUSU0yMENMSyBjbG9jayBmcmVxdWVuY3kgKi8KKyAgICBpZiAoTExfUkNDX0dldFRJTUNsb2NrU291cmNlKExMX1JDQ19USU0yMF9DTEtTT1VSQ0UpID09IExMX1JDQ19USU0yMF9DTEtTT1VSQ0VfUENMSzIpCisgICAgeworICAgICAgLyogUENMSzIgdXNlZCBhcyBUSU0yMCBjbG9jayBzb3VyY2UgKi8KKyAgICAgIHRpbV9mcmVxdWVuY3kgPSBSQ0NfR2V0UENMSzJDbG9ja0ZyZXEoUkNDX0dldEhDTEtDbG9ja0ZyZXEoUkNDX0dldFN5c3RlbUNsb2NrRnJlcSgpKSk7CisgICAgfQorICAgIGVsc2UgLyogTExfUkNDX1RJTTIwX0NMS1NPVVJDRV9QTEwgKi8KKyAgICB7CisgICAgICAvKiBQTEwgY2xvY2sgdXNlZCBhcyBUSU0yMCBjbG9jayBzb3VyY2UgKi8KKyAgICAgIHRpbV9mcmVxdWVuY3kgPSBSQ0NfUExMX0dldEZyZXFEb21haW5fU1lTKCk7CisgICAgfQorICB9CisjZW5kaWYgLypSQ0NfQ0ZHUjNfVElNMjBTVyovCisKKyNpZiBkZWZpbmVkKFJDQ19DRkdSM19USU0yU1cpCisgIGlmIChUSU14U291cmNlID09IExMX1JDQ19USU0yX0NMS1NPVVJDRSkKKyAgeworICAgIC8qIFRJTTJDTEsgY2xvY2sgZnJlcXVlbmN5ICovCisgICAgaWYgKExMX1JDQ19HZXRUSU1DbG9ja1NvdXJjZShMTF9SQ0NfVElNMl9DTEtTT1VSQ0UpID09IExMX1JDQ19USU0yX0NMS1NPVVJDRV9QQ0xLMSkKKyAgICB7CisgICAgICAvKiBQQ0xLMSB1c2VkIGFzIFRJTTIgY2xvY2sgc291cmNlICovCisgICAgICB0aW1fZnJlcXVlbmN5ID0gUkNDX0dldFBDTEsxQ2xvY2tGcmVxKFJDQ19HZXRIQ0xLQ2xvY2tGcmVxKFJDQ19HZXRTeXN0ZW1DbG9ja0ZyZXEoKSkpOworICAgIH0KKyAgICBlbHNlIC8qIExMX1JDQ19USU0yX0NMS1NPVVJDRV9QTEwgKi8KKyAgICB7CisgICAgICAvKiBQTEwgY2xvY2sgdXNlZCBhcyBUSU0yIGNsb2NrIHNvdXJjZSAqLworICAgICAgdGltX2ZyZXF1ZW5jeSA9IFJDQ19QTExfR2V0RnJlcURvbWFpbl9TWVMoKTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKlJDQ19DRkdSM19USU0yU1cqLworCisjaWYgZGVmaW5lZChSQ0NfQ0ZHUjNfVElNMzRTVykKKyAgaWYgKFRJTXhTb3VyY2UgPT0gTExfUkNDX1RJTTM0X0NMS1NPVVJDRSkKKyAgeworICAgIC8qIFRJTTMvNCBDTEsgY2xvY2sgZnJlcXVlbmN5ICovCisgICAgaWYgKExMX1JDQ19HZXRUSU1DbG9ja1NvdXJjZShMTF9SQ0NfVElNMzRfQ0xLU09VUkNFKSA9PSBMTF9SQ0NfVElNMzRfQ0xLU09VUkNFX1BDTEsxKQorICAgIHsKKyAgICAgIC8qIFBDTEsxIHVzZWQgYXMgVElNMy80IGNsb2NrIHNvdXJjZSAqLworICAgICAgdGltX2ZyZXF1ZW5jeSA9IFJDQ19HZXRQQ0xLMUNsb2NrRnJlcShSQ0NfR2V0SENMS0Nsb2NrRnJlcShSQ0NfR2V0U3lzdGVtQ2xvY2tGcmVxKCkpKTsKKyAgICB9CisgICAgZWxzZSAvKiBMTF9SQ0NfVElNMzRfQ0xLU09VUkNFX1BMTCAqLworICAgIHsKKyAgICAgIC8qIFBMTCBjbG9jayB1c2VkIGFzIFRJTTMvNCBjbG9jayBzb3VyY2UgKi8KKyAgICAgIHRpbV9mcmVxdWVuY3kgPSBSQ0NfUExMX0dldEZyZXFEb21haW5fU1lTKCk7CisgICAgfQorICB9CisjZW5kaWYgLypSQ0NfQ0ZHUjNfVElNMzRTVyovCisKKyAgcmV0dXJuIHRpbV9mcmVxdWVuY3k7Cit9CisjZW5kaWYgLypSQ0NfQ0ZHUjNfVElNU1cqLworCisjaWYgZGVmaW5lZChIUlRJTTEpCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBIUlRJTXggY2xvY2sgZnJlcXVlbmN5CisgICogQHBhcmFtICBIUlRJTXhTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSFJUSU0xX0NMS1NPVVJDRQorICAqIEByZXR2YWwgSFJUSU0gY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKi8KK3VpbnQzMl90IExMX1JDQ19HZXRIUlRJTUNsb2NrRnJlcSh1aW50MzJfdCBIUlRJTXhTb3VyY2UpCit7CisgIHVpbnQzMl90IGhydGltX2ZyZXF1ZW5jeSA9IExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05POworCisgIC8qIENoZWNrIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfTExfUkNDX0hSVElNX0NMS1NPVVJDRShIUlRJTXhTb3VyY2UpKTsKKworICAvKiBIUlRJTTFDTEsgY2xvY2sgZnJlcXVlbmN5ICovCisgIGlmIChMTF9SQ0NfR2V0SFJUSU1DbG9ja1NvdXJjZShMTF9SQ0NfSFJUSU0xX0NMS1NPVVJDRSkgPT0gTExfUkNDX0hSVElNMV9DTEtTT1VSQ0VfUENMSzIpCisgIHsKKyAgICAvKiBQQ0xLMiB1c2VkIGFzIEhSVElNMSBjbG9jayBzb3VyY2UgKi8KKyAgICBocnRpbV9mcmVxdWVuY3kgPSBSQ0NfR2V0UENMSzJDbG9ja0ZyZXEoUkNDX0dldEhDTEtDbG9ja0ZyZXEoUkNDX0dldFN5c3RlbUNsb2NrRnJlcSgpKSk7CisgIH0KKyAgZWxzZSAvKiBMTF9SQ0NfSFJUSU0xX0NMS1NPVVJDRV9QTEwgKi8KKyAgeworICAgIC8qIFBMTCBjbG9jayB1c2VkIGFzIEhSVElNMSBjbG9jayBzb3VyY2UgKi8KKyAgICBocnRpbV9mcmVxdWVuY3kgPSBSQ0NfUExMX0dldEZyZXFEb21haW5fU1lTKCk7CisgIH0KKworICByZXR1cm4gaHJ0aW1fZnJlcXVlbmN5OworfQorI2VuZGlmIC8qIEhSVElNMSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgUkNDX0xMX1ByaXZhdGVfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gU1lTVEVNIGNsb2NrIGZyZXF1ZW5jeQorICAqIEByZXR2YWwgU1lTVEVNIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICovCit1aW50MzJfdCBSQ0NfR2V0U3lzdGVtQ2xvY2tGcmVxKHZvaWQpCit7CisgIHVpbnQzMl90IGZyZXF1ZW5jeSA9IDBVOworCisgIC8qIEdldCBTWVNDTEsgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBzd2l0Y2ggKExMX1JDQ19HZXRTeXNDbGtTb3VyY2UoKSkKKyAgeworICAgIGNhc2UgTExfUkNDX1NZU19DTEtTT1VSQ0VfU1RBVFVTX0hTSTogIC8qIEhTSSB1c2VkIGFzIHN5c3RlbSBjbG9jayAgc291cmNlICovCisgICAgICBmcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTExfUkNDX1NZU19DTEtTT1VSQ0VfU1RBVFVTX0hTRTogIC8qIEhTRSB1c2VkIGFzIHN5c3RlbSBjbG9jayAgc291cmNlICovCisgICAgICBmcmVxdWVuY3kgPSBIU0VfVkFMVUU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTExfUkNDX1NZU19DTEtTT1VSQ0VfU1RBVFVTX1BMTDogIC8qIFBMTCB1c2VkIGFzIHN5c3RlbSBjbG9jayAgc291cmNlICovCisgICAgICBmcmVxdWVuY3kgPSBSQ0NfUExMX0dldEZyZXFEb21haW5fU1lTKCk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBmcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBmcmVxdWVuY3k7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIEhDTEsgY2xvY2sgZnJlcXVlbmN5CisgICogQHBhcmFtICBTWVNDTEtfRnJlcXVlbmN5IFNZU0NMSyBjbG9jayBmcmVxdWVuY3kKKyAgKiBAcmV0dmFsIEhDTEsgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKi8KK3VpbnQzMl90IFJDQ19HZXRIQ0xLQ2xvY2tGcmVxKHVpbnQzMl90IFNZU0NMS19GcmVxdWVuY3kpCit7CisgIC8qIEhDTEsgY2xvY2sgZnJlcXVlbmN5ICovCisgIHJldHVybiBfX0xMX1JDQ19DQUxDX0hDTEtfRlJFUShTWVNDTEtfRnJlcXVlbmN5LCBMTF9SQ0NfR2V0QUhCUHJlc2NhbGVyKCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBQQ0xLMSBjbG9jayBmcmVxdWVuY3kKKyAgKiBAcGFyYW0gIEhDTEtfRnJlcXVlbmN5IEhDTEsgY2xvY2sgZnJlcXVlbmN5CisgICogQHJldHZhbCBQQ0xLMSBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqLwordWludDMyX3QgUkNDX0dldFBDTEsxQ2xvY2tGcmVxKHVpbnQzMl90IEhDTEtfRnJlcXVlbmN5KQoreworICAvKiBQQ0xLMSBjbG9jayBmcmVxdWVuY3kgKi8KKyAgcmV0dXJuIF9fTExfUkNDX0NBTENfUENMSzFfRlJFUShIQ0xLX0ZyZXF1ZW5jeSwgTExfUkNDX0dldEFQQjFQcmVzY2FsZXIoKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFBDTEsyIGNsb2NrIGZyZXF1ZW5jeQorICAqIEBwYXJhbSAgSENMS19GcmVxdWVuY3kgSENMSyBjbG9jayBmcmVxdWVuY3kKKyAgKiBAcmV0dmFsIFBDTEsyIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICovCit1aW50MzJfdCBSQ0NfR2V0UENMSzJDbG9ja0ZyZXEodWludDMyX3QgSENMS19GcmVxdWVuY3kpCit7CisgIC8qIFBDTEsyIGNsb2NrIGZyZXF1ZW5jeSAqLworICByZXR1cm4gX19MTF9SQ0NfQ0FMQ19QQ0xLMl9GUkVRKEhDTEtfRnJlcXVlbmN5LCBMTF9SQ0NfR2V0QVBCMlByZXNjYWxlcigpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gUExMIGNsb2NrIGZyZXF1ZW5jeSB1c2VkIGZvciBzeXN0ZW0gZG9tYWluCisgICogQHJldHZhbCBQTEwgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKi8KK3VpbnQzMl90IFJDQ19QTExfR2V0RnJlcURvbWFpbl9TWVModm9pZCkKK3sKKyAgdWludDMyX3QgcGxsaW5wdXRmcmVxID0gMFUsIHBsbHNvdXJjZSA9IDBVOworCisgIC8qIFBMTF9WQ08gPSAoSFNFX1ZBTFVFIG9yIEhTSV9WQUxVRSAvIFBMTCBkaXZpZGVyKSAqIFBMTCBNdWx0aXBsaWNhdG9yICovCisKKyAgLyogR2V0IFBMTCBzb3VyY2UgKi8KKyAgcGxsc291cmNlID0gTExfUkNDX1BMTF9HZXRNYWluU291cmNlKCk7CisKKyAgc3dpdGNoIChwbGxzb3VyY2UpCisgIHsKKyNpZiBkZWZpbmVkKFJDQ19QTExTUkNfUFJFRElWMV9TVVBQT1JUKQorICAgIGNhc2UgTExfUkNDX1BMTFNPVVJDRV9IU0k6ICAgICAgIC8qIEhTSSB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UgKi8KKyAgICAgIHBsbGlucHV0ZnJlcSA9IEhTSV9WQUxVRTsKKyNlbHNlCisgICAgY2FzZSBMTF9SQ0NfUExMU09VUkNFX0hTSV9ESVZfMjogLyogSFNJIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZSAqLworICAgICAgcGxsaW5wdXRmcmVxID0gSFNJX1ZBTFVFIC8gMlU7CisjZW5kaWYgLyogUkNDX1BMTFNSQ19QUkVESVYxX1NVUFBPUlQgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTF9SQ0NfUExMU09VUkNFX0hTRTogICAgICAgLyogSFNFIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZSAqLworICAgICAgcGxsaW5wdXRmcmVxID0gSFNFX1ZBTFVFOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorI2lmIGRlZmluZWQoUkNDX1BMTFNSQ19QUkVESVYxX1NVUFBPUlQpCisgICAgICBwbGxpbnB1dGZyZXEgPSBIU0lfVkFMVUU7CisjZWxzZQorICAgICAgcGxsaW5wdXRmcmVxID0gSFNJX1ZBTFVFIC8gMlU7CisjZW5kaWYgLyogUkNDX1BMTFNSQ19QUkVESVYxX1NVUFBPUlQgKi8KKyAgICAgIGJyZWFrOworICB9CisjaWYgZGVmaW5lZChSQ0NfUExMU1JDX1BSRURJVjFfU1VQUE9SVCkKKyAgcmV0dXJuIF9fTExfUkNDX0NBTENfUExMQ0xLX0ZSRVEocGxsaW5wdXRmcmVxLCBMTF9SQ0NfUExMX0dldE11bHRpcGxpY2F0b3IoKSwgTExfUkNDX1BMTF9HZXRQcmVkaXYoKSk7CisjZWxzZQorICByZXR1cm4gX19MTF9SQ0NfQ0FMQ19QTExDTEtfRlJFUSgocGxsaW5wdXRmcmVxIC8gKExMX1JDQ19QTExfR2V0UHJlZGl2KCkgKyAxVSkpLCBMTF9SQ0NfUExMX0dldE11bHRpcGxpY2F0b3IoKSk7CisjZW5kaWYgLyogUkNDX1BMTFNSQ19QUkVESVYxX1NVUFBPUlQgKi8KK30KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBkZWZpbmVkKFJDQykgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjN4eF9sbF9ydGMuYyBiL1NyYy9zdG0zMmYzeHhfbGxfcnRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI2Y2M4ZAotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfbGxfcnRjLmMKQEAgLTAsMCArMSw4OTIgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfbGxfcnRjLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFJUQyBMTCBtb2R1bGUgZHJpdmVyLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmYzeHhfbGxfcnRjLmgiCisjaW5jbHVkZSAic3RtMzJmM3h4X2xsX2NvcnRleC5oIgorI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChSVEMpCisKKy8qKiBAYWRkdG9ncm91cCBSVENfTEwKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgUlRDX0xMX1ByaXZhdGVfQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKy8qIERlZmF1bHQgdmFsdWVzIHVzZWQgZm9yIHByZXNjYWxlciAqLworI2RlZmluZSBSVENfQVNZTkNIX1BSRVNDX0RFRkFVTFQgICAgIDB4MDAwMDAwN0ZVCisjZGVmaW5lIFJUQ19TWU5DSF9QUkVTQ19ERUZBVUxUICAgICAgMHgwMDAwMDBGRlUKKworLyogVmFsdWVzIHVzZWQgZm9yIHRpbWVvdXQgKi8KKyNkZWZpbmUgUlRDX0lOSVRNT0RFX1RJTUVPVVQgICAgICAgICAxMDAwVSAvKiAxcyB3aGVuIHRpY2sgc2V0IHRvIDFtcyAqLworI2RlZmluZSBSVENfU1lOQ0hST19USU1FT1VUICAgICAgICAgIDEwMDBVIC8qIDFzIHdoZW4gdGljayBzZXQgdG8gMW1zICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFJUQ19MTF9Qcml2YXRlX01hY3JvcworICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfTExfUlRDX0hPVVJGT1JNQVQoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1JUQ19IT1VSRk9STUFUXzI0SE9VUikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX0hPVVJGT1JNQVRfQU1QTSkpCisKKyNkZWZpbmUgSVNfTExfUlRDX0FTWU5DSF9QUkVESVYoX19WQUxVRV9fKSAgICgoX19WQUxVRV9fKSA8PSAweDdGVSkKKworI2RlZmluZSBJU19MTF9SVENfU1lOQ0hfUFJFRElWKF9fVkFMVUVfXykgICAgKChfX1ZBTFVFX18pIDw9IDB4N0ZGRlUpCisKKyNkZWZpbmUgSVNfTExfUlRDX0ZPUk1BVChfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfUlRDX0ZPUk1BVF9CSU4pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX0ZPUk1BVF9CQ0QpKQorCisjZGVmaW5lIElTX0xMX1JUQ19USU1FX0ZPUk1BVChfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfUlRDX1RJTUVfRk9STUFUX0FNX09SXzI0KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX1RJTUVfRk9STUFUX1BNKSkKKworI2RlZmluZSBJU19MTF9SVENfSE9VUjEyKF9fSE9VUl9fKSAgICAgICAgICAgICgoKF9fSE9VUl9fKSA+IDBVKSAmJiAoKF9fSE9VUl9fKSA8PSAxMlUpKQorI2RlZmluZSBJU19MTF9SVENfSE9VUjI0KF9fSE9VUl9fKSAgICAgICAgICAgICgoX19IT1VSX18pIDw9IDIzVSkKKyNkZWZpbmUgSVNfTExfUlRDX01JTlVURVMoX19NSU5VVEVTX18pICAgICAgICAoKF9fTUlOVVRFU19fKSA8PSA1OVUpCisjZGVmaW5lIElTX0xMX1JUQ19TRUNPTkRTKF9fU0VDT05EU19fKSAgICAgICAgKChfX1NFQ09ORFNfXykgPD0gNTlVKQorCisjZGVmaW5lIElTX0xMX1JUQ19XRUVLREFZKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9SVENfV0VFS0RBWV9NT05EQVkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19XRUVLREFZX1RVRVNEQVkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19XRUVLREFZX1dFRE5FU0RBWSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX1dFRUtEQVlfVEhVUlNEQVkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19XRUVLREFZX0ZSSURBWSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX1dFRUtEQVlfU0FUVVJEQVkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19XRUVLREFZX1NVTkRBWSkpCisKKyNkZWZpbmUgSVNfTExfUlRDX0RBWShfX0RBWV9fKSAgICAoKChfX0RBWV9fKSA+PSAxVSkgJiYgKChfX0RBWV9fKSA8PSAzMVUpKQorCisjZGVmaW5lIElTX0xMX1JUQ19NT05USChfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfUlRDX01PTlRIX0pBTlVBUlkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfTU9OVEhfRkVCUlVBUlkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfTU9OVEhfTUFSQ0gpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfTU9OVEhfQVBSSUwpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfTU9OVEhfTUFZKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX01PTlRIX0pVTkUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfTU9OVEhfSlVMWSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19NT05USF9BVUdVU1QpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfTU9OVEhfU0VQVEVNQkVSKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX01PTlRIX09DVE9CRVIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfTU9OVEhfTk9WRU1CRVIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfTU9OVEhfREVDRU1CRVIpKQorCisjZGVmaW5lIElTX0xMX1JUQ19ZRUFSKF9fWUVBUl9fKSAoKF9fWUVBUl9fKSA8PSA5OVUpCisKKyNkZWZpbmUgSVNfTExfUlRDX0FMTUFfTUFTSyhfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfUlRDX0FMTUFfTUFTS19OT05FKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19BTE1BX01BU0tfREFURVdFRUtEQVkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX0FMTUFfTUFTS19IT1VSUykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfQUxNQV9NQVNLX01JTlVURVMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX0FMTUFfTUFTS19TRUNPTkRTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19BTE1BX01BU0tfQUxMKSkKKworI2RlZmluZSBJU19MTF9SVENfQUxNQl9NQVNLKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9SVENfQUxNQl9NQVNLX05PTkUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX0FMTUJfTUFTS19EQVRFV0VFS0RBWSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfQUxNQl9NQVNLX0hPVVJTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19BTE1CX01BU0tfTUlOVVRFUykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfQUxNQl9NQVNLX1NFQ09ORFMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX0FMTUJfTUFTS19BTEwpKQorCisKKyNkZWZpbmUgSVNfTExfUlRDX0FMTUFfREFURV9XRUVLREFZX1NFTChfX1NFTF9fKSAoKChfX1NFTF9fKSA9PSBMTF9SVENfQUxNQV9EQVRFV0VFS0RBWVNFTF9EQVRFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TRUxfXykgPT0gTExfUlRDX0FMTUFfREFURVdFRUtEQVlTRUxfV0VFS0RBWSkpCisKKyNkZWZpbmUgSVNfTExfUlRDX0FMTUJfREFURV9XRUVLREFZX1NFTChfX1NFTF9fKSAoKChfX1NFTF9fKSA9PSBMTF9SVENfQUxNQl9EQVRFV0VFS0RBWVNFTF9EQVRFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TRUxfXykgPT0gTExfUlRDX0FMTUJfREFURVdFRUtEQVlTRUxfV0VFS0RBWSkpCisKKworLyoqCisgICogQH0KKyAgKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFJUQ19MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgUlRDX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERlLUluaXRpYWxpemVzIHRoZSBSVEMgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IHJlc2V0IHRoZSBSVEMgQ2xvY2sgc291cmNlIGFuZCBSVEMgQmFja3VwIERhdGEKKyAgKiAgICAgICAgIHJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFJUQyByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogUlRDIHJlZ2lzdGVycyBhcmUgbm90IGRlLWluaXRpYWxpemVkCisgICovCitFcnJvclN0YXR1cyBMTF9SVENfRGVJbml0KFJUQ19UeXBlRGVmICpSVEN4KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBFUlJPUjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19SVENfQUxMX0lOU1RBTkNFKFJUQ3gpKTsKKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uKFJUQ3gpOworCisgIC8qIFNldCBJbml0aWFsaXphdGlvbiBtb2RlICovCisgIGlmIChMTF9SVENfRW50ZXJJbml0TW9kZShSVEN4KSAhPSBFUlJPUikKKyAgeworICAgIC8qIFJlc2V0IFRSLCBEUiBhbmQgQ1IgcmVnaXN0ZXJzICovCisgICAgTExfUlRDX1dyaXRlUmVnKFJUQ3gsIFRSLCAgICAgICAweDAwMDAwMDAwVSk7CisjaWYgZGVmaW5lZChSVENfV0FLRVVQX1NVUFBPUlQpCisgICAgTExfUlRDX1dyaXRlUmVnKFJUQ3gsIFdVVFIsICAgICBSVENfV1VUUl9XVVQpOworI2VuZGlmIC8qIFJUQ19XQUtFVVBfU1VQUE9SVCAqLworICAgIExMX1JUQ19Xcml0ZVJlZyhSVEN4LCBEUiAgLCAgICAgKFJUQ19EUl9XRFVfMCB8IFJUQ19EUl9NVV8wIHwgUlRDX0RSX0RVXzApKTsKKyAgICAvKiBSZXNldCBBbGwgQ1IgYml0cyBleGNlcHQgQ1JbMjowXSAqLworI2lmIGRlZmluZWQoUlRDX1dBS0VVUF9TVVBQT1JUKQorICAgIExMX1JUQ19Xcml0ZVJlZyhSVEN4LCBDUiwgKExMX1JUQ19SZWFkUmVnKFJUQ3gsIENSKSAmIFJUQ19DUl9XVUNLU0VMKSk7CisjZWxzZQorICAgIExMX1JUQ19Xcml0ZVJlZyhSVEN4LCBDUiwgMHgwMDAwMDAwMFUpOworI2VuZGlmIC8qIFJUQ19XQUtFVVBfU1VQUE9SVCAqLworICAgIExMX1JUQ19Xcml0ZVJlZyhSVEN4LCBQUkVSLCAgICAgKFJUQ19QUkVSX1BSRURJVl9BIHwgUlRDX1NZTkNIX1BSRVNDX0RFRkFVTFQpKTsKKyAgICBMTF9SVENfV3JpdGVSZWcoUlRDeCwgQUxSTUFSLCAgIDB4MDAwMDAwMDBVKTsKKyAgICBMTF9SVENfV3JpdGVSZWcoUlRDeCwgQUxSTUJSLCAgIDB4MDAwMDAwMDBVKTsKKyAgICBMTF9SVENfV3JpdGVSZWcoUlRDeCwgU0hJRlRSLCAgIDB4MDAwMDAwMDBVKTsKKyAgICBMTF9SVENfV3JpdGVSZWcoUlRDeCwgQ0FMUiwgICAgIDB4MDAwMDAwMDBVKTsKKyAgICBMTF9SVENfV3JpdGVSZWcoUlRDeCwgQUxSTUFTU1IsIDB4MDAwMDAwMDBVKTsKKyAgICBMTF9SVENfV3JpdGVSZWcoUlRDeCwgQUxSTUJTU1IsIDB4MDAwMDAwMDBVKTsKKworICAgIC8qIFJlc2V0IElTUiByZWdpc3RlciBhbmQgZXhpdCBpbml0aWFsaXphdGlvbiBtb2RlICovCisgICAgTExfUlRDX1dyaXRlUmVnKFJUQ3gsIElTUiwgICAgICAweDAwMDAwMDAwVSk7CisKKyAgICAvKiBSZXNldCBUYW1wZXIgYW5kIGFsdGVybmF0ZSBmdW5jdGlvbnMgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworICAgIExMX1JUQ19Xcml0ZVJlZyhSVEN4LCBUQUZDUiwgMHgwMDAwMDAwMFUpOworCisgICAgLyogV2FpdCB0aWxsIHRoZSBSVEMgUlNGIGZsYWcgaXMgc2V0ICovCisgICAgc3RhdHVzID0gTExfUlRDX1dhaXRGb3JTeW5jaHJvKFJUQ3gpOworICB9CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIExMX1JUQ19FbmFibGVXcml0ZVByb3RlY3Rpb24oUlRDeCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgUlRDIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzCisgICogICAgICAgICBpbiBSVENfSW5pdFN0cnVjdC4KKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBSVENfSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9SVENfSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgUlRDIHBlcmlwaGVyYWwuCisgICogQG5vdGUgICBUaGUgUlRDIFByZXNjYWxlciByZWdpc3RlciBpcyB3cml0ZSBwcm90ZWN0ZWQgYW5kIGNhbiBiZSB3cml0dGVuIGluCisgICogICAgICAgICBpbml0aWFsaXphdGlvbiBtb2RlIG9ubHkuCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFJUQyByZWdpc3RlcnMgYXJlIGluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogUlRDIHJlZ2lzdGVycyBhcmUgbm90IGluaXRpYWxpemVkCisgICovCitFcnJvclN0YXR1cyBMTF9SVENfSW5pdChSVENfVHlwZURlZiAqUlRDeCwgTExfUlRDX0luaXRUeXBlRGVmICpSVENfSW5pdFN0cnVjdCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gRVJST1I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTExfSU5TVEFOQ0UoUlRDeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0hPVVJGT1JNQVQoUlRDX0luaXRTdHJ1Y3QtPkhvdXJGb3JtYXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19BU1lOQ0hfUFJFRElWKFJUQ19Jbml0U3RydWN0LT5Bc3luY2hQcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19TWU5DSF9QUkVESVYoUlRDX0luaXRTdHJ1Y3QtPlN5bmNoUHJlc2NhbGVyKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbihSVEN4KTsKKworICAvKiBTZXQgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICBpZiAoTExfUlRDX0VudGVySW5pdE1vZGUoUlRDeCkgIT0gRVJST1IpCisgIHsKKyAgICAvKiBTZXQgSG91ciBGb3JtYXQgKi8KKyAgICBMTF9SVENfU2V0SG91ckZvcm1hdChSVEN4LCBSVENfSW5pdFN0cnVjdC0+SG91ckZvcm1hdCk7CisKKyAgICAvKiBDb25maWd1cmUgU3luY2hyb25vdXMgYW5kIEFzeW5jaHJvbm91cyBwcmVzY2FsZXIgZmFjdG9yICovCisgICAgTExfUlRDX1NldFN5bmNoUHJlc2NhbGVyKFJUQ3gsIFJUQ19Jbml0U3RydWN0LT5TeW5jaFByZXNjYWxlcik7CisgICAgTExfUlRDX1NldEFzeW5jaFByZXNjYWxlcihSVEN4LCBSVENfSW5pdFN0cnVjdC0+QXN5bmNoUHJlc2NhbGVyKTsKKworICAgIC8qIEV4aXQgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICAgIExMX1JUQ19EaXNhYmxlSW5pdE1vZGUoUlRDeCk7CisKKyAgICBzdGF0dXMgPSBTVUNDRVNTOworICB9CisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBMTF9SVENfRW5hYmxlV3JpdGVQcm90ZWN0aW9uKFJUQ3gpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGVhY2ggQHJlZiBMTF9SVENfSW5pdFR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZS4KKyAgKiBAcGFyYW0gIFJUQ19Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1JUQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgd2hpY2ggd2lsbCBiZSBpbml0aWFsaXplZC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfUlRDX1N0cnVjdEluaXQoTExfUlRDX0luaXRUeXBlRGVmICpSVENfSW5pdFN0cnVjdCkKK3sKKyAgLyogU2V0IFJUQ19Jbml0U3RydWN0IGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICBSVENfSW5pdFN0cnVjdC0+SG91ckZvcm1hdCAgICAgID0gTExfUlRDX0hPVVJGT1JNQVRfMjRIT1VSOworICBSVENfSW5pdFN0cnVjdC0+QXN5bmNoUHJlc2NhbGVyID0gUlRDX0FTWU5DSF9QUkVTQ19ERUZBVUxUOworICBSVENfSW5pdFN0cnVjdC0+U3luY2hQcmVzY2FsZXIgID0gUlRDX1NZTkNIX1BSRVNDX0RFRkFVTFQ7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBSVEMgY3VycmVudCB0aW1lLgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJUQ19Gb3JtYXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfRk9STUFUX0JJTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19GT1JNQVRfQkNECisgICogQHBhcmFtICBSVENfVGltZVN0cnVjdCBwb2ludGVyIHRvIGEgUlRDX1RpbWVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGltZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgUlRDLgorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBSVEMgVGltZSByZWdpc3RlciBpcyBjb25maWd1cmVkCisgICogICAgICAgICAgLSBFUlJPUjogUlRDIFRpbWUgcmVnaXN0ZXIgaXMgbm90IGNvbmZpZ3VyZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1JUQ19USU1FX0luaXQoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFJUQ19Gb3JtYXQsIExMX1JUQ19UaW1lVHlwZURlZiAqUlRDX1RpbWVTdHJ1Y3QpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IEVSUk9SOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfQUxMX0lOU1RBTkNFKFJUQ3gpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19GT1JNQVQoUlRDX0Zvcm1hdCkpOworCisgIGlmIChSVENfRm9ybWF0ID09IExMX1JUQ19GT1JNQVRfQklOKQorICB7CisgICAgaWYgKExMX1JUQ19HZXRIb3VyRm9ybWF0KFJUQ3gpICE9IExMX1JUQ19IT1VSRk9STUFUXzI0SE9VUikKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0hPVVIxMihSVENfVGltZVN0cnVjdC0+SG91cnMpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfVElNRV9GT1JNQVQoUlRDX1RpbWVTdHJ1Y3QtPlRpbWVGb3JtYXQpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIFJUQ19UaW1lU3RydWN0LT5UaW1lRm9ybWF0ID0gMHgwMFU7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0hPVVIyNChSVENfVGltZVN0cnVjdC0+SG91cnMpKTsKKyAgICB9CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19NSU5VVEVTKFJUQ19UaW1lU3RydWN0LT5NaW51dGVzKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19TRUNPTkRTKFJUQ19UaW1lU3RydWN0LT5TZWNvbmRzKSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKExMX1JUQ19HZXRIb3VyRm9ybWF0KFJUQ3gpICE9IExMX1JUQ19IT1VSRk9STUFUXzI0SE9VUikKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0hPVVIxMihfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4oUlRDX1RpbWVTdHJ1Y3QtPkhvdXJzKSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19USU1FX0ZPUk1BVChSVENfVGltZVN0cnVjdC0+VGltZUZvcm1hdCkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgUlRDX1RpbWVTdHJ1Y3QtPlRpbWVGb3JtYXQgPSAweDAwVTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfSE9VUjI0KF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihSVENfVGltZVN0cnVjdC0+SG91cnMpKSk7CisgICAgfQorICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfTUlOVVRFUyhfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4oUlRDX1RpbWVTdHJ1Y3QtPk1pbnV0ZXMpKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19TRUNPTkRTKF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihSVENfVGltZVN0cnVjdC0+U2Vjb25kcykpKTsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24oUlRDeCk7CisKKyAgLyogU2V0IEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgaWYgKExMX1JUQ19FbnRlckluaXRNb2RlKFJUQ3gpICE9IEVSUk9SKQorICB7CisgICAgLyogQ2hlY2sgdGhlIGlucHV0IHBhcmFtZXRlcnMgZm9ybWF0ICovCisgICAgaWYgKFJUQ19Gb3JtYXQgIT0gTExfUlRDX0ZPUk1BVF9CSU4pCisgICAgeworICAgICAgTExfUlRDX1RJTUVfQ29uZmlnKFJUQ3gsIFJUQ19UaW1lU3RydWN0LT5UaW1lRm9ybWF0LCBSVENfVGltZVN0cnVjdC0+SG91cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX1RpbWVTdHJ1Y3QtPk1pbnV0ZXMsIFJUQ19UaW1lU3RydWN0LT5TZWNvbmRzKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIExMX1JUQ19USU1FX0NvbmZpZyhSVEN4LCBSVENfVGltZVN0cnVjdC0+VGltZUZvcm1hdCwgX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEKFJUQ19UaW1lU3RydWN0LT5Ib3VycyksCisgICAgICAgICAgICAgICAgICAgICAgICAgX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEKFJUQ19UaW1lU3RydWN0LT5NaW51dGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QoUlRDX1RpbWVTdHJ1Y3QtPlNlY29uZHMpKTsKKyAgICB9CisKKyAgICAvKiBFeGl0IEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgICBMTF9SVENfRGlzYWJsZUluaXRNb2RlKFJUQyk7CisKKyAgICAvKiBJZiAgUlRDX0NSX0JZUFNIQUQgYml0ID0gMCwgd2FpdCBmb3Igc3luY2hybyBlbHNlIHRoaXMgY2hlY2sgaXMgbm90IG5lZWRlZCAqLworICAgIGlmIChMTF9SVENfSXNTaGFkb3dSZWdCeXBhc3NFbmFibGVkKFJUQ3gpID09IDBVKQorICAgIHsKKyAgICAgIHN0YXR1cyA9IExMX1JUQ19XYWl0Rm9yU3luY2hybyhSVEN4KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHN0YXR1cyA9IFNVQ0NFU1M7CisgICAgfQorICB9CisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBMTF9SVENfRW5hYmxlV3JpdGVQcm90ZWN0aW9uKFJUQ3gpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGVhY2ggQHJlZiBMTF9SVENfVGltZVR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZSAoVGltZSA9IDAwaDowMG1pbjowMHNlYykuCisgICogQHBhcmFtICBSVENfVGltZVN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9SVENfVGltZVR5cGVEZWYgc3RydWN0dXJlIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX1JUQ19USU1FX1N0cnVjdEluaXQoTExfUlRDX1RpbWVUeXBlRGVmICpSVENfVGltZVN0cnVjdCkKK3sKKyAgLyogVGltZSA9IDAwaDowMG1pbjowMHNlYyAqLworICBSVENfVGltZVN0cnVjdC0+VGltZUZvcm1hdCA9IExMX1JUQ19USU1FX0ZPUk1BVF9BTV9PUl8yNDsKKyAgUlRDX1RpbWVTdHJ1Y3QtPkhvdXJzICAgICAgPSAwVTsKKyAgUlRDX1RpbWVTdHJ1Y3QtPk1pbnV0ZXMgICAgPSAwVTsKKyAgUlRDX1RpbWVTdHJ1Y3QtPlNlY29uZHMgICAgPSAwVTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFJUQyBjdXJyZW50IGRhdGUuCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgUlRDX0Zvcm1hdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19GT1JNQVRfQklOCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0ZPUk1BVF9CQ0QKKyAgKiBAcGFyYW0gIFJUQ19EYXRlU3RydWN0IHBvaW50ZXIgdG8gYSBSVENfRGF0ZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGF0ZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgUlRDLgorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBSVEMgRGF5IHJlZ2lzdGVyIGlzIGNvbmZpZ3VyZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBSVEMgRGF5IHJlZ2lzdGVyIGlzIG5vdCBjb25maWd1cmVkCisgICovCitFcnJvclN0YXR1cyBMTF9SVENfREFURV9Jbml0KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBSVENfRm9ybWF0LCBMTF9SVENfRGF0ZVR5cGVEZWYgKlJUQ19EYXRlU3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBFUlJPUjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMTF9JTlNUQU5DRShSVEN4KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9SVENfRk9STUFUKFJUQ19Gb3JtYXQpKTsKKworICBpZiAoKFJUQ19Gb3JtYXQgPT0gTExfUlRDX0ZPUk1BVF9CSU4pICYmICgoUlRDX0RhdGVTdHJ1Y3QtPk1vbnRoICYgMHgxMFUpID09IDB4MTBVKSkKKyAgeworICAgIFJUQ19EYXRlU3RydWN0LT5Nb250aCA9IChSVENfRGF0ZVN0cnVjdC0+TW9udGggJiAodWludDMyX3QpfigweDEwVSkpICsgMHgwQVU7CisgIH0KKyAgaWYgKFJUQ19Gb3JtYXQgPT0gTExfUlRDX0ZPUk1BVF9CSU4pCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX1lFQVIoUlRDX0RhdGVTdHJ1Y3QtPlllYXIpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX01PTlRIKFJUQ19EYXRlU3RydWN0LT5Nb250aCkpOworICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfREFZKFJUQ19EYXRlU3RydWN0LT5EYXkpKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX1lFQVIoX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOKFJUQ19EYXRlU3RydWN0LT5ZZWFyKSkpOworICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfTU9OVEgoX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOKFJUQ19EYXRlU3RydWN0LT5Nb250aCkpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0RBWShfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4oUlRDX0RhdGVTdHJ1Y3QtPkRheSkpKTsKKyAgfQorICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX1dFRUtEQVkoUlRDX0RhdGVTdHJ1Y3QtPldlZWtEYXkpKTsKKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uKFJUQ3gpOworCisgIC8qIFNldCBJbml0aWFsaXphdGlvbiBtb2RlICovCisgIGlmIChMTF9SVENfRW50ZXJJbml0TW9kZShSVEN4KSAhPSBFUlJPUikKKyAgeworICAgIC8qIENoZWNrIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGZvcm1hdCAqLworICAgIGlmIChSVENfRm9ybWF0ICE9IExMX1JUQ19GT1JNQVRfQklOKQorICAgIHsKKyAgICAgIExMX1JUQ19EQVRFX0NvbmZpZyhSVEN4LCBSVENfRGF0ZVN0cnVjdC0+V2Vla0RheSwgUlRDX0RhdGVTdHJ1Y3QtPkRheSwgUlRDX0RhdGVTdHJ1Y3QtPk1vbnRoLCBSVENfRGF0ZVN0cnVjdC0+WWVhcik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBMTF9SVENfREFURV9Db25maWcoUlRDeCwgUlRDX0RhdGVTdHJ1Y3QtPldlZWtEYXksIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRChSVENfRGF0ZVN0cnVjdC0+RGF5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QoUlRDX0RhdGVTdHJ1Y3QtPk1vbnRoKSwgX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEKFJUQ19EYXRlU3RydWN0LT5ZZWFyKSk7CisgICAgfQorCisgICAgLyogRXhpdCBJbml0aWFsaXphdGlvbiBtb2RlICovCisgICAgTExfUlRDX0Rpc2FibGVJbml0TW9kZShSVEMpOworCisgICAgLyogSWYgIFJUQ19DUl9CWVBTSEFEIGJpdCA9IDAsIHdhaXQgZm9yIHN5bmNocm8gZWxzZSB0aGlzIGNoZWNrIGlzIG5vdCBuZWVkZWQgKi8KKyAgICBpZiAoTExfUlRDX0lzU2hhZG93UmVnQnlwYXNzRW5hYmxlZChSVEN4KSA9PSAwVSkKKyAgICB7CisgICAgICBzdGF0dXMgPSBMTF9SVENfV2FpdEZvclN5bmNocm8oUlRDeCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzdGF0dXMgPSBTVUNDRVNTOworICAgIH0KKyAgfQorICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgTExfUlRDX0VuYWJsZVdyaXRlUHJvdGVjdGlvbihSVEN4KTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBlYWNoIEByZWYgTExfUlRDX0RhdGVUeXBlRGVmIGZpZWxkIHRvIGRlZmF1bHQgdmFsdWUgKGRhdGUgPSBNb25kYXksIEphbnVhcnkgMDEgeHgwMCkKKyAgKiBAcGFyYW0gIFJUQ19EYXRlU3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1JUQ19EYXRlVHlwZURlZiBzdHJ1Y3R1cmUgd2hpY2ggd2lsbCBiZSBpbml0aWFsaXplZC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfUlRDX0RBVEVfU3RydWN0SW5pdChMTF9SVENfRGF0ZVR5cGVEZWYgKlJUQ19EYXRlU3RydWN0KQoreworICAvKiBNb25kYXksIEphbnVhcnkgMDEgeHgwMCAqLworICBSVENfRGF0ZVN0cnVjdC0+V2Vla0RheSA9IExMX1JUQ19XRUVLREFZX01PTkRBWTsKKyAgUlRDX0RhdGVTdHJ1Y3QtPkRheSAgICAgPSAxVTsKKyAgUlRDX0RhdGVTdHJ1Y3QtPk1vbnRoICAgPSBMTF9SVENfTU9OVEhfSkFOVUFSWTsKKyAgUlRDX0RhdGVTdHJ1Y3QtPlllYXIgICAgPSAwVTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFJUQyBBbGFybSBBLgorICAqIEBub3RlICAgVGhlIEFsYXJtIHJlZ2lzdGVyIGNhbiBvbmx5IGJlIHdyaXR0ZW4gd2hlbiB0aGUgY29ycmVzcG9uZGluZyBBbGFybQorICAqICAgICAgICAgaXMgZGlzYWJsZWQgKFVzZSBAcmVmIExMX1JUQ19BTE1BX0Rpc2FibGUgZnVuY3Rpb24pLgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJUQ19Gb3JtYXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfRk9STUFUX0JJTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19GT1JNQVRfQkNECisgICogQHBhcmFtICBSVENfQWxhcm1TdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfUlRDX0FsYXJtVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBhbGFybSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IEFMQVJNQSByZWdpc3RlcnMgYXJlIGNvbmZpZ3VyZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBBTEFSTUEgcmVnaXN0ZXJzIGFyZSBub3QgY29uZmlndXJlZAorICAqLworRXJyb3JTdGF0dXMgTExfUlRDX0FMTUFfSW5pdChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgUlRDX0Zvcm1hdCwgTExfUlRDX0FsYXJtVHlwZURlZiAqUlRDX0FsYXJtU3RydWN0KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMTF9JTlNUQU5DRShSVEN4KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9SVENfRk9STUFUKFJUQ19Gb3JtYXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19BTE1BX01BU0soUlRDX0FsYXJtU3RydWN0LT5BbGFybU1hc2spKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19BTE1BX0RBVEVfV0VFS0RBWV9TRUwoUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5U2VsKSk7CisKKyAgaWYgKFJUQ19Gb3JtYXQgPT0gTExfUlRDX0ZPUk1BVF9CSU4pCisgIHsKKyAgICBpZiAoTExfUlRDX0dldEhvdXJGb3JtYXQoUlRDeCkgIT0gTExfUlRDX0hPVVJGT1JNQVRfMjRIT1VSKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfSE9VUjEyKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLkhvdXJzKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX1RJTUVfRk9STUFUKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlRpbWVGb3JtYXQpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlRpbWVGb3JtYXQgPSAweDAwVTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfSE9VUjI0KFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLkhvdXJzKSk7CisgICAgfQorICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfTUlOVVRFUyhSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5NaW51dGVzKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19TRUNPTkRTKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlNlY29uZHMpKTsKKworICAgIGlmIChSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXlTZWwgPT0gTExfUlRDX0FMTUFfREFURVdFRUtEQVlTRUxfREFURSkKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0RBWShSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXkpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfV0VFS0RBWShSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXkpKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKExMX1JUQ19HZXRIb3VyRm9ybWF0KFJUQ3gpICE9IExMX1JUQ19IT1VSRk9STUFUXzI0SE9VUikKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0hPVVIxMihfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4oUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuSG91cnMpKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX1RJTUVfRk9STUFUKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlRpbWVGb3JtYXQpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlRpbWVGb3JtYXQgPSAweDAwVTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfSE9VUjI0KF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5Ib3VycykpKTsKKyAgICB9CisKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX01JTlVURVMoX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLk1pbnV0ZXMpKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19TRUNPTkRTKF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5TZWNvbmRzKSkpOworCisgICAgaWYgKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheVNlbCA9PSBMTF9SVENfQUxNQV9EQVRFV0VFS0RBWVNFTF9EQVRFKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfREFZKF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXkpKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX1dFRUtEQVkoX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheSkpKTsKKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uKFJUQ3gpOworCisgIC8qIFNlbGVjdCB3ZWVrZGF5IHNlbGVjdGlvbiAqLworICBpZiAoUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5U2VsID09IExMX1JUQ19BTE1BX0RBVEVXRUVLREFZU0VMX0RBVEUpCisgIHsKKyAgICAvKiBTZXQgdGhlIGRhdGUgZm9yIEFMQVJNICovCisgICAgTExfUlRDX0FMTUFfRGlzYWJsZVdlZWtkYXkoUlRDeCk7CisgICAgaWYgKFJUQ19Gb3JtYXQgIT0gTExfUlRDX0ZPUk1BVF9CSU4pCisgICAgeworICAgICAgTExfUlRDX0FMTUFfU2V0RGF5KFJUQ3gsIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBMTF9SVENfQUxNQV9TZXREYXkoUlRDeCwgX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheSkpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBTZXQgdGhlIHdlZWsgZGF5IGZvciBBTEFSTSAqLworICAgIExMX1JUQ19BTE1BX0VuYWJsZVdlZWtkYXkoUlRDeCk7CisgICAgTExfUlRDX0FMTUFfU2V0V2Vla0RheShSVEN4LCBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXkpOworICB9CisKKyAgLyogQ29uZmlndXJlIHRoZSBBbGFybSByZWdpc3RlciAqLworICBpZiAoUlRDX0Zvcm1hdCAhPSBMTF9SVENfRk9STUFUX0JJTikKKyAgeworICAgIExMX1JUQ19BTE1BX0NvbmZpZ1RpbWUoUlRDeCwgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuVGltZUZvcm1hdCwgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuSG91cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5NaW51dGVzLCBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5TZWNvbmRzKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBMTF9SVENfQUxNQV9Db25maWdUaW1lKFJUQ3gsIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlRpbWVGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QoUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuSG91cnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLk1pbnV0ZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlNlY29uZHMpKTsKKyAgfQorICAvKiBTZXQgQUxBUk0gbWFzayAqLworICBMTF9SVENfQUxNQV9TZXRNYXNrKFJUQ3gsIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1NYXNrKTsKKworICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgTExfUlRDX0VuYWJsZVdyaXRlUHJvdGVjdGlvbihSVEN4KTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFJUQyBBbGFybSBCLgorICAqIEBub3RlICAgVGhlIEFsYXJtIHJlZ2lzdGVyIGNhbiBvbmx5IGJlIHdyaXR0ZW4gd2hlbiB0aGUgY29ycmVzcG9uZGluZyBBbGFybQorICAqICAgICAgICAgaXMgZGlzYWJsZWQgKEByZWYgTExfUlRDX0FMTUJfRGlzYWJsZSBmdW5jdGlvbikuCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgUlRDX0Zvcm1hdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19GT1JNQVRfQklOCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0ZPUk1BVF9CQ0QKKyAgKiBAcGFyYW0gIFJUQ19BbGFybVN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9SVENfQWxhcm1UeXBlRGVmIHN0cnVjdHVyZSB0aGF0CisgICogICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgdGhlIGFsYXJtIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogQUxBUk1CIHJlZ2lzdGVycyBhcmUgY29uZmlndXJlZAorICAqICAgICAgICAgIC0gRVJST1I6IEFMQVJNQiByZWdpc3RlcnMgYXJlIG5vdCBjb25maWd1cmVkCisgICovCitFcnJvclN0YXR1cyBMTF9SVENfQUxNQl9Jbml0KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBSVENfRm9ybWF0LCBMTF9SVENfQWxhcm1UeXBlRGVmICpSVENfQWxhcm1TdHJ1Y3QpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfQUxMX0lOU1RBTkNFKFJUQ3gpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19GT1JNQVQoUlRDX0Zvcm1hdCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0FMTUJfTUFTSyhSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtTWFzaykpOworICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0FMTUJfREFURV9XRUVLREFZX1NFTChSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXlTZWwpKTsKKworICBpZiAoUlRDX0Zvcm1hdCA9PSBMTF9SVENfRk9STUFUX0JJTikKKyAgeworICAgIGlmIChMTF9SVENfR2V0SG91ckZvcm1hdChSVEN4KSAhPSBMTF9SVENfSE9VUkZPUk1BVF8yNEhPVVIpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19IT1VSMTIoUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuSG91cnMpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfVElNRV9GT1JNQVQoUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuVGltZUZvcm1hdCkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuVGltZUZvcm1hdCA9IDB4MDBVOworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19IT1VSMjQoUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuSG91cnMpKTsKKyAgICB9CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19NSU5VVEVTKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLk1pbnV0ZXMpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX1NFQ09ORFMoUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuU2Vjb25kcykpOworCisgICAgaWYgKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheVNlbCA9PSBMTF9SVENfQUxNQl9EQVRFV0VFS0RBWVNFTF9EQVRFKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfREFZKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19XRUVLREFZKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheSkpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiAoTExfUlRDX0dldEhvdXJGb3JtYXQoUlRDeCkgIT0gTExfUlRDX0hPVVJGT1JNQVRfMjRIT1VSKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfSE9VUjEyKF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5Ib3VycykpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfVElNRV9GT1JNQVQoUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuVGltZUZvcm1hdCkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuVGltZUZvcm1hdCA9IDB4MDBVOworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19IT1VSMjQoX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLkhvdXJzKSkpOworICAgIH0KKworICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfTUlOVVRFUyhfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4oUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuTWludXRlcykpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX1NFQ09ORFMoX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlNlY29uZHMpKSk7CisKKyAgICBpZiAoUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5U2VsID09IExMX1JUQ19BTE1CX0RBVEVXRUVLREFZU0VMX0RBVEUpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19EQVkoX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheSkpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfV0VFS0RBWShfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4oUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5KSkpOworICAgIH0KKyAgfQorCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24oUlRDeCk7CisKKyAgLyogU2VsZWN0IHdlZWtkYXkgc2VsZWN0aW9uICovCisgIGlmIChSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXlTZWwgPT0gTExfUlRDX0FMTUJfREFURVdFRUtEQVlTRUxfREFURSkKKyAgeworICAgIC8qIFNldCB0aGUgZGF0ZSBmb3IgQUxBUk0gKi8KKyAgICBMTF9SVENfQUxNQl9EaXNhYmxlV2Vla2RheShSVEN4KTsKKyAgICBpZiAoUlRDX0Zvcm1hdCAhPSBMTF9SVENfRk9STUFUX0JJTikKKyAgICB7CisgICAgICBMTF9SVENfQUxNQl9TZXREYXkoUlRDeCwgUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIExMX1JUQ19BTE1CX1NldERheShSVEN4LCBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QoUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5KSk7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFNldCB0aGUgd2VlayBkYXkgZm9yIEFMQVJNICovCisgICAgTExfUlRDX0FMTUJfRW5hYmxlV2Vla2RheShSVEN4KTsKKyAgICBMTF9SVENfQUxNQl9TZXRXZWVrRGF5KFJUQ3gsIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheSk7CisgIH0KKworICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIHJlZ2lzdGVyICovCisgIGlmIChSVENfRm9ybWF0ICE9IExMX1JUQ19GT1JNQVRfQklOKQorICB7CisgICAgTExfUlRDX0FMTUJfQ29uZmlnVGltZShSVEN4LCBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5UaW1lRm9ybWF0LCBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5Ib3VycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLk1pbnV0ZXMsIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlNlY29uZHMpOworICB9CisgIGVsc2UKKyAgeworICAgIExMX1JUQ19BTE1CX0NvbmZpZ1RpbWUoUlRDeCwgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuVGltZUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRChSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5Ib3VycyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QoUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuTWludXRlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QoUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuU2Vjb25kcykpOworICB9CisgIC8qIFNldCBBTEFSTSBtYXNrICovCisgIExMX1JUQ19BTE1CX1NldE1hc2soUlRDeCwgUlRDX0FsYXJtU3RydWN0LT5BbGFybU1hc2spOworCisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBMTF9SVENfRW5hYmxlV3JpdGVQcm90ZWN0aW9uKFJUQ3gpOworCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBlYWNoIEByZWYgTExfUlRDX0FsYXJtVHlwZURlZiBvZiBBTEFSTUEgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZSAoVGltZSA9IDAwaDowMG1uOjAwc2VjIC8KKyAgKiAgICAgICAgIERheSA9IDFzdCBkYXkgb2YgdGhlIG1vbnRoL01hc2sgPSBhbGwgZmllbGRzIGFyZSBtYXNrZWQpLgorICAqIEBwYXJhbSAgUlRDX0FsYXJtU3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1JUQ19BbGFybVR5cGVEZWYgc3RydWN0dXJlIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX1JUQ19BTE1BX1N0cnVjdEluaXQoTExfUlRDX0FsYXJtVHlwZURlZiAqUlRDX0FsYXJtU3RydWN0KQoreworICAvKiBBbGFybSBUaW1lIFNldHRpbmdzIDogVGltZSA9IDAwaDowMG1uOjAwc2VjICovCisgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlRpbWVGb3JtYXQgPSBMTF9SVENfQUxNQV9USU1FX0ZPUk1BVF9BTTsKKyAgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuSG91cnMgICAgICA9IDBVOworICBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5NaW51dGVzICAgID0gMFU7CisgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlNlY29uZHMgICAgPSAwVTsKKworICAvKiBBbGFybSBEYXkgU2V0dGluZ3MgOiBEYXkgPSAxc3QgZGF5IG9mIHRoZSBtb250aCAqLworICBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXlTZWwgPSBMTF9SVENfQUxNQV9EQVRFV0VFS0RBWVNFTF9EQVRFOworICBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXkgICAgPSAxVTsKKworICAvKiBBbGFybSBNYXNrcyBTZXR0aW5ncyA6IE1hc2sgPSAgYWxsIGZpZWxkcyBhcmUgbm90IG1hc2tlZCAqLworICBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtTWFzayAgICAgICAgICAgPSBMTF9SVENfQUxNQV9NQVNLX05PTkU7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGVhY2ggQHJlZiBMTF9SVENfQWxhcm1UeXBlRGVmIG9mIEFMQVJNQSBmaWVsZCB0byBkZWZhdWx0IHZhbHVlIChUaW1lID0gMDBoOjAwbW46MDBzZWMgLworICAqICAgICAgICAgRGF5ID0gMXN0IGRheSBvZiB0aGUgbW9udGgvTWFzayA9IGFsbCBmaWVsZHMgYXJlIG1hc2tlZCkuCisgICogQHBhcmFtICBSVENfQWxhcm1TdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfUlRDX0FsYXJtVHlwZURlZiBzdHJ1Y3R1cmUgd2hpY2ggd2lsbCBiZSBpbml0aWFsaXplZC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfUlRDX0FMTUJfU3RydWN0SW5pdChMTF9SVENfQWxhcm1UeXBlRGVmICpSVENfQWxhcm1TdHJ1Y3QpCit7CisgIC8qIEFsYXJtIFRpbWUgU2V0dGluZ3MgOiBUaW1lID0gMDBoOjAwbW46MDBzZWMgKi8KKyAgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuVGltZUZvcm1hdCA9IExMX1JUQ19BTE1CX1RJTUVfRk9STUFUX0FNOworICBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5Ib3VycyAgICAgID0gMFU7CisgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLk1pbnV0ZXMgICAgPSAwVTsKKyAgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuU2Vjb25kcyAgICA9IDBVOworCisgIC8qIEFsYXJtIERheSBTZXR0aW5ncyA6IERheSA9IDFzdCBkYXkgb2YgdGhlIG1vbnRoICovCisgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheVNlbCA9IExMX1JUQ19BTE1CX0RBVEVXRUVLREFZU0VMX0RBVEU7CisgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheSAgICA9IDFVOworCisgIC8qIEFsYXJtIE1hc2tzIFNldHRpbmdzIDogTWFzayA9ICBhbGwgZmllbGRzIGFyZSBub3QgbWFza2VkICovCisgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1NYXNrICAgICAgICAgICA9IExMX1JUQ19BTE1CX01BU0tfTk9ORTsKK30KKworLyoqCisgICogQGJyaWVmICBFbnRlcnMgdGhlIFJUQyBJbml0aWFsaXphdGlvbiBtb2RlLgorICAqIEBub3RlICAgVGhlIFJUQyBJbml0aWFsaXphdGlvbiBtb2RlIGlzIHdyaXRlIHByb3RlY3RlZCwgdXNlIHRoZQorICAqICAgICAgICAgQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogUlRDIGlzIGluIEluaXQgbW9kZQorICAqICAgICAgICAgIC0gRVJST1I6IFJUQyBpcyBub3QgaW4gSW5pdCBtb2RlCisgICovCitFcnJvclN0YXR1cyBMTF9SVENfRW50ZXJJbml0TW9kZShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgX19JTyB1aW50MzJfdCB0aW1lb3V0ID0gUlRDX0lOSVRNT0RFX1RJTUVPVVQ7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisgIHVpbnQzMl90IHRtcCA9IDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTExfSU5TVEFOQ0UoUlRDeCkpOworCisgIC8qIENoZWNrIGlmIHRoZSBJbml0aWFsaXphdGlvbiBtb2RlIGlzIHNldCAqLworICBpZiAoTExfUlRDX0lzQWN0aXZlRmxhZ19JTklUKFJUQ3gpID09IDBVKQorICB7CisgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBtb2RlICovCisgICAgTExfUlRDX0VuYWJsZUluaXRNb2RlKFJUQ3gpOworCisgICAgLyogV2FpdCB0aWxsIFJUQyBpcyBpbiBJTklUIHN0YXRlIGFuZCBpZiBUaW1lIG91dCBpcyByZWFjaGVkIGV4aXQgKi8KKyAgICB0bXAgPSBMTF9SVENfSXNBY3RpdmVGbGFnX0lOSVQoUlRDeCk7CisgICAgd2hpbGUgKCh0aW1lb3V0ICE9IDBVKSAmJiAodG1wICE9IDFVKSkKKyAgICB7CisgICAgICBpZiAoTExfU1lTVElDS19Jc0FjdGl2ZUNvdW50ZXJGbGFnKCkgPT0gMVUpCisgICAgICB7CisgICAgICAgIHRpbWVvdXQgLS07CisgICAgICB9CisgICAgICB0bXAgPSBMTF9SVENfSXNBY3RpdmVGbGFnX0lOSVQoUlRDeCk7CisgICAgICBpZiAodGltZW91dCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgc3RhdHVzID0gRVJST1I7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgRXhpdCB0aGUgUlRDIEluaXRpYWxpemF0aW9uIG1vZGUuCisgICogQG5vdGUgICBXaGVuIHRoZSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSBpcyBjb21wbGV0ZSwgdGhlIGNhbGVuZGFyIHJlc3RhcnRzCisgICogICAgICAgICBjb3VudGluZyBhZnRlciA0IFJUQ0NMSyBjeWNsZXMuCisgICogQG5vdGUgICBUaGUgUlRDIEluaXRpYWxpemF0aW9uIG1vZGUgaXMgd3JpdGUgcHJvdGVjdGVkLCB1c2UgdGhlCisgICogICAgICAgICBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBSVEMgZXhpdGVkIGZyb20gaW4gSW5pdCBtb2RlCisgICogICAgICAgICAgLSBFUlJPUjogTm90IGFwcGxpY2FibGUKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1JUQ19FeGl0SW5pdE1vZGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTExfSU5TVEFOQ0UoUlRDeCkpOworCisgIC8qIERpc2FibGUgaW5pdGlhbGl6YXRpb24gbW9kZSAqLworICBMTF9SVENfRGlzYWJsZUluaXRNb2RlKFJUQ3gpOworCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAYnJpZWYgIFdhaXRzIHVudGlsIHRoZSBSVEMgVGltZSBhbmQgRGF5IHJlZ2lzdGVycyAoUlRDX1RSIGFuZCBSVENfRFIpIGFyZQorICAqICAgICAgICAgc3luY2hyb25pemVkIHdpdGggUlRDIEFQQiBjbG9jay4KKyAgKiBAbm90ZSAgIFRoZSBSVEMgUmVzeW5jaHJvbml6YXRpb24gbW9kZSBpcyB3cml0ZSBwcm90ZWN0ZWQsIHVzZSB0aGUKKyAgKiAgICAgICAgIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAgKiBAbm90ZSAgIFRvIHJlYWQgdGhlIGNhbGVuZGFyIHRocm91Z2ggdGhlIHNoYWRvdyByZWdpc3RlcnMgYWZ0ZXIgQ2FsZW5kYXIKKyAgKiAgICAgICAgIGluaXRpYWxpemF0aW9uLCBjYWxlbmRhciB1cGRhdGUgb3IgYWZ0ZXIgd2FrZXVwIGZyb20gbG93IHBvd2VyIG1vZGVzCisgICogICAgICAgICB0aGUgc29mdHdhcmUgbXVzdCBmaXJzdCBjbGVhciB0aGUgUlNGIGZsYWcuCisgICogICAgICAgICBUaGUgc29mdHdhcmUgbXVzdCB0aGVuIHdhaXQgdW50aWwgaXQgaXMgc2V0IGFnYWluIGJlZm9yZSByZWFkaW5nCisgICogICAgICAgICB0aGUgY2FsZW5kYXIsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGNhbGVuZGFyIHJlZ2lzdGVycyBoYXZlIGJlZW4KKyAgKiAgICAgICAgIGNvcnJlY3RseSBjb3BpZWQgaW50byB0aGUgUlRDX1RSIGFuZCBSVENfRFIgc2hhZG93IHJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFJUQyByZWdpc3RlcnMgYXJlIHN5bmNocm9uaXNlZAorICAqICAgICAgICAgIC0gRVJST1I6IFJUQyByZWdpc3RlcnMgYXJlIG5vdCBzeW5jaHJvbmlzZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1JUQ19XYWl0Rm9yU3luY2hybyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgX19JTyB1aW50MzJfdCB0aW1lb3V0ID0gUlRDX1NZTkNIUk9fVElNRU9VVDsKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gU1VDQ0VTUzsKKyAgdWludDMyX3QgdG1wID0gMFU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMTF9JTlNUQU5DRShSVEN4KSk7CisKKyAgLyogQ2xlYXIgUlNGIGZsYWcgKi8KKyAgTExfUlRDX0NsZWFyRmxhZ19SUyhSVEN4KTsKKworICAvKiBXYWl0IHRoZSByZWdpc3RlcnMgdG8gYmUgc3luY2hyb25pc2VkICovCisgIHRtcCA9IExMX1JUQ19Jc0FjdGl2ZUZsYWdfUlMoUlRDeCk7CisgIHdoaWxlICgodGltZW91dCAhPSAwVSkgJiYgKHRtcCAhPSAwVSkpCisgIHsKKyAgICBpZiAoTExfU1lTVElDS19Jc0FjdGl2ZUNvdW50ZXJGbGFnKCkgPT0gMVUpCisgICAgeworICAgICAgdGltZW91dC0tOworICAgIH0KKyAgICB0bXAgPSBMTF9SVENfSXNBY3RpdmVGbGFnX1JTKFJUQ3gpOworICAgIGlmICh0aW1lb3V0ID09IDBVKQorICAgIHsKKyAgICAgIHN0YXR1cyA9IEVSUk9SOworICAgIH0KKyAgfQorCisgIGlmIChzdGF0dXMgIT0gRVJST1IpCisgIHsKKyAgICB0aW1lb3V0ID0gUlRDX1NZTkNIUk9fVElNRU9VVDsKKyAgICB0bXAgPSBMTF9SVENfSXNBY3RpdmVGbGFnX1JTKFJUQ3gpOworICAgIHdoaWxlICgodGltZW91dCAhPSAwVSkgJiYgKHRtcCAhPSAxVSkpCisgICAgeworICAgICAgaWYgKExMX1NZU1RJQ0tfSXNBY3RpdmVDb3VudGVyRmxhZygpID09IDFVKQorICAgICAgeworICAgICAgICB0aW1lb3V0LS07CisgICAgICB9CisgICAgICB0bXAgPSBMTF9SVENfSXNBY3RpdmVGbGFnX1JTKFJUQ3gpOworICAgICAgaWYgKHRpbWVvdXQgPT0gMFUpCisgICAgICB7CisgICAgICAgIHN0YXR1cyA9IEVSUk9SOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiAoc3RhdHVzKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIGRlZmluZWQoUlRDKSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmM3h4X2xsX3NwaS5jIGIvU3JjL3N0bTMyZjN4eF9sbF9zcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjJlMjIyCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZjN4eF9sbF9zcGkuYwpAQCAtMCwwICsxLDYzNSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjN4eF9sbF9zcGkuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgU1BJIExMIG1vZHVsZSBkcml2ZXIuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9sbF9zcGkuaCIKKyNpbmNsdWRlICJzdG0zMmYzeHhfbGxfYnVzLmgiCisjaW5jbHVkZSAic3RtMzJmM3h4X2xsX3JjYy5oIgorCisjaWZkZWYgIFVTRV9GVUxMX0FTU0VSVAorI2luY2x1ZGUgInN0bTMyX2Fzc2VydC5oIgorI2Vsc2UKKyNkZWZpbmUgYXNzZXJ0X3BhcmFtKGV4cHIpICgodm9pZCkwVSkKKyNlbmRpZgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkIChTUEkxKSB8fCBkZWZpbmVkIChTUEkyKSB8fCBkZWZpbmVkIChTUEkzKSB8fCBkZWZpbmVkIChTUEk0KQorCisvKiogQGFkZHRvZ3JvdXAgU1BJX0xMCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNQSV9MTF9Qcml2YXRlX0NvbnN0YW50cyBTUEkgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworLyogU1BJIHJlZ2lzdGVycyBNYXNrcyAqLworI2RlZmluZSBTUElfQ1IxX0NMRUFSX01BU0sgICAgICAgICAgICAgICAgIChTUElfQ1IxX0NQSEEgICAgfCBTUElfQ1IxX0NQT0wgICAgIHwgU1BJX0NSMV9NU1RSICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSV9DUjFfQlIgICAgICB8IFNQSV9DUjFfTFNCRklSU1QgfCBTUElfQ1IxX1NTSSAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0NSMV9TU00gICAgIHwgU1BJX0NSMV9SWE9OTFkgICB8IFNQSV9DUjFfQ1JDTCAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUElfQ1IxX0NSQ05FWFQgfCBTUElfQ1IxX0NSQ0VOICAgIHwgU1BJX0NSMV9CSURJT0UgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSV9DUjFfQklESU1PREUpCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTUElfTExfUHJpdmF0ZV9NYWNyb3MgU1BJIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfTExfU1BJX1RSQU5TRkVSX0RJUkVDVElPTihfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfU1BJX0ZVTExfRFVQTEVYKSAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9TSU1QTEVYX1JYKSAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfSEFMRl9EVVBMRVhfUlgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX0hBTEZfRFVQTEVYX1RYKSkKKworI2RlZmluZSBJU19MTF9TUElfTU9ERShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfU1BJX01PREVfTUFTVEVSKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfTU9ERV9TTEFWRSkpCisKKyNkZWZpbmUgSVNfTExfU1BJX0RBVEFXSURUSChfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfU1BJX0RBVEFXSURUSF80QklUKSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfREFUQVdJRFRIXzVCSVQpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9EQVRBV0lEVEhfNkJJVCkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX0RBVEFXSURUSF83QklUKSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfREFUQVdJRFRIXzhCSVQpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9EQVRBV0lEVEhfOUJJVCkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX0RBVEFXSURUSF8xMEJJVCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfREFUQVdJRFRIXzExQklUKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9EQVRBV0lEVEhfMTJCSVQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX0RBVEFXSURUSF8xM0JJVCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfREFUQVdJRFRIXzE0QklUKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9EQVRBV0lEVEhfMTVCSVQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX0RBVEFXSURUSF8xNkJJVCkpCisKKyNkZWZpbmUgSVNfTExfU1BJX1BPTEFSSVRZKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9TUElfUE9MQVJJVFlfTE9XKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX1BPTEFSSVRZX0hJR0gpKQorCisjZGVmaW5lIElTX0xMX1NQSV9QSEFTRShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfU1BJX1BIQVNFXzFFREdFKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX1BIQVNFXzJFREdFKSkKKworI2RlZmluZSBJU19MTF9TUElfTlNTKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9TUElfTlNTX1NPRlQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX05TU19IQVJEX0lOUFVUKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9OU1NfSEFSRF9PVVRQVVQpKQorCisjZGVmaW5lIElTX0xMX1NQSV9CQVVEUkFURShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjIpICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVY0KSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWOCkgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjE2KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVYzMikgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWNjQpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjEyOCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVYyNTYpKQorCisjZGVmaW5lIElTX0xMX1NQSV9CSVRPUkRFUihfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfU1BJX0xTQl9GSVJTVCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9NU0JfRklSU1QpKQorCisjZGVmaW5lIElTX0xMX1NQSV9DUkNDQUxDVUxBVElPTihfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9DUkNDQUxDVUxBVElPTl9ESVNBQkxFKSkKKworI2RlZmluZSBJU19MTF9TUElfQ1JDX1BPTFlOT01JQUwoX19WQUxVRV9fKSAoKF9fVkFMVUVfXykgPj0gMHgxVSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBTUElfTExfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFNQSV9MTF9FRl9Jbml0CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBEZS1pbml0aWFsaXplIHRoZSBTUEkgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogU1BJIHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBTUEkgcmVnaXN0ZXJzIGFyZSBub3QgZGUtaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1NQSV9EZUluaXQoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IEVSUk9SOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TUElfQUxMX0lOU1RBTkNFKFNQSXgpKTsKKworI2lmIGRlZmluZWQoU1BJMSkKKyAgaWYgKFNQSXggPT0gU1BJMSkKKyAgeworICAgIC8qIEZvcmNlIHJlc2V0IG9mIFNQSSBjbG9jayAqLworICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjJfR1JQMV9QRVJJUEhfU1BJMSk7CisKKyAgICAvKiBSZWxlYXNlIHJlc2V0IG9mIFNQSSBjbG9jayAqLworICAgIExMX0FQQjJfR1JQMV9SZWxlYXNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9TUEkxKTsKKworICAgIHN0YXR1cyA9IFNVQ0NFU1M7CisgIH0KKyNlbmRpZiAvKiBTUEkxICovCisjaWYgZGVmaW5lZChTUEkyKQorICBpZiAoU1BJeCA9PSBTUEkyKQorICB7CisgICAgLyogRm9yY2UgcmVzZXQgb2YgU1BJIGNsb2NrICovCisgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9TUEkyKTsKKworICAgIC8qIFJlbGVhc2UgcmVzZXQgb2YgU1BJIGNsb2NrICovCisgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX1NQSTIpOworCisgICAgc3RhdHVzID0gU1VDQ0VTUzsKKyAgfQorI2VuZGlmIC8qIFNQSTIgKi8KKyNpZiBkZWZpbmVkKFNQSTMpCisgIGlmIChTUEl4ID09IFNQSTMpCisgIHsKKyAgICAvKiBGb3JjZSByZXNldCBvZiBTUEkgY2xvY2sgKi8KKyAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX1NQSTMpOworCisgICAgLyogUmVsZWFzZSByZXNldCBvZiBTUEkgY2xvY2sgKi8KKyAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMyk7CisKKyAgICBzdGF0dXMgPSBTVUNDRVNTOworICB9CisjZW5kaWYgLyogU1BJMyAqLworI2lmIGRlZmluZWQoU1BJNCkKKyAgaWYgKFNQSXggPT0gU1BJNCkKKyAgeworICAgIC8qIEZvcmNlIHJlc2V0IG9mIFNQSSBjbG9jayAqLworICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjJfR1JQMV9QRVJJUEhfU1BJNCk7CisKKyAgICAvKiBSZWxlYXNlIHJlc2V0IG9mIFNQSSBjbG9jayAqLworICAgIExMX0FQQjJfR1JQMV9SZWxlYXNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9TUEk0KTsKKworICAgIHN0YXR1cyA9IFNVQ0NFU1M7CisgIH0KKyNlbmRpZiAvKiBTUEk0ICovCisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBTUEkgcmVnaXN0ZXJzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gU1BJX0luaXRTdHJ1Y3QuCisgICogQG5vdGUgICBBcyBzb21lIGJpdHMgaW4gU1BJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIGNhbiBvbmx5IGJlIHdyaXR0ZW4gd2hlbiB0aGUgU1BJIGlzIGRpc2FibGVkIChTUElfQ1IxX1NQRSBiaXQgPTApLAorICAqICAgICAgICAgU1BJIElQIHNob3VsZCBiZSBpbiBkaXNhYmxlZCBzdGF0ZSBwcmlvciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIE90aGVyd2lzZSwgRVJST1IgcmVzdWx0IHdpbGwgYmUgcmV0dXJuZWQuCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEBwYXJhbSAgU1BJX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfU1BJX0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWUuIChSZXR1cm4gYWx3YXlzIFNVQ0NFU1MpCisgICovCitFcnJvclN0YXR1cyBMTF9TUElfSW5pdChTUElfVHlwZURlZiAqU1BJeCwgTExfU1BJX0luaXRUeXBlRGVmICpTUElfSW5pdFN0cnVjdCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gRVJST1I7CisKKyAgLyogQ2hlY2sgdGhlIFNQSSBJbnN0YW5jZSBTUEl4Ki8KKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9BTExfSU5TVEFOQ0UoU1BJeCkpOworCisgIC8qIENoZWNrIHRoZSBTUEkgcGFyYW1ldGVycyBmcm9tIFNQSV9Jbml0U3RydWN0Ki8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1NQSV9UUkFOU0ZFUl9ESVJFQ1RJT04oU1BJX0luaXRTdHJ1Y3QtPlRyYW5zZmVyRGlyZWN0aW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9TUElfTU9ERShTUElfSW5pdFN0cnVjdC0+TW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfU1BJX0RBVEFXSURUSChTUElfSW5pdFN0cnVjdC0+RGF0YVdpZHRoKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9TUElfUE9MQVJJVFkoU1BJX0luaXRTdHJ1Y3QtPkNsb2NrUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1NQSV9QSEFTRShTUElfSW5pdFN0cnVjdC0+Q2xvY2tQaGFzZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfU1BJX05TUyhTUElfSW5pdFN0cnVjdC0+TlNTKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9TUElfQkFVRFJBVEUoU1BJX0luaXRTdHJ1Y3QtPkJhdWRSYXRlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9TUElfQklUT1JERVIoU1BJX0luaXRTdHJ1Y3QtPkJpdE9yZGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9TUElfQ1JDQ0FMQ1VMQVRJT04oU1BJX0luaXRTdHJ1Y3QtPkNSQ0NhbGN1bGF0aW9uKSk7CisKKyAgaWYgKExMX1NQSV9Jc0VuYWJsZWQoU1BJeCkgPT0gMHgwMDAwMDAwMFUpCisgIHsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1BJeCBDUjEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiBDb25maWd1cmUgU1BJeCBDUjEgd2l0aCBwYXJhbWV0ZXJzOgorICAgICAqIC0gVHJhbnNmZXJEaXJlY3Rpb246ICBTUElfQ1IxX0JJRElNT0RFLCBTUElfQ1IxX0JJRElPRSBhbmQgU1BJX0NSMV9SWE9OTFkgYml0cworICAgICAqIC0gTWFzdGVyL1NsYXZlIE1vZGU6ICBTUElfQ1IxX01TVFIgYml0CisgICAgICogLSBDbG9ja1BvbGFyaXR5OiAgICAgIFNQSV9DUjFfQ1BPTCBiaXQKKyAgICAgKiAtIENsb2NrUGhhc2U6ICAgICAgICAgU1BJX0NSMV9DUEhBIGJpdAorICAgICAqIC0gTlNTIG1hbmFnZW1lbnQ6ICAgICBTUElfQ1IxX1NTTSBiaXQKKyAgICAgKiAtIEJhdWRSYXRlIHByZXNjYWxlcjogU1BJX0NSMV9CUlsyOjBdIGJpdHMKKyAgICAgKiAtIEJpdE9yZGVyOiAgICAgICAgICAgU1BJX0NSMV9MU0JGSVJTVCBiaXQKKyAgICAgKiAtIENSQ0NhbGN1bGF0aW9uOiAgICAgU1BJX0NSMV9DUkNFTiBiaXQKKyAgICAgKi8KKyAgICBNT0RJRllfUkVHKFNQSXgtPkNSMSwKKyAgICAgICAgICAgICAgIFNQSV9DUjFfQ0xFQVJfTUFTSywKKyAgICAgICAgICAgICAgIFNQSV9Jbml0U3RydWN0LT5UcmFuc2ZlckRpcmVjdGlvbiB8IFNQSV9Jbml0U3RydWN0LT5Nb2RlIHwKKyAgICAgICAgICAgICAgIFNQSV9Jbml0U3RydWN0LT5DbG9ja1BvbGFyaXR5IHwgU1BJX0luaXRTdHJ1Y3QtPkNsb2NrUGhhc2UgfAorICAgICAgICAgICAgICAgU1BJX0luaXRTdHJ1Y3QtPk5TUyB8IFNQSV9Jbml0U3RydWN0LT5CYXVkUmF0ZSB8CisgICAgICAgICAgICAgICBTUElfSW5pdFN0cnVjdC0+Qml0T3JkZXIgfCBTUElfSW5pdFN0cnVjdC0+Q1JDQ2FsY3VsYXRpb24pOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNQSXggQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ29uZmlndXJlIFNQSXggQ1IyIHdpdGggcGFyYW1ldGVyczoKKyAgICAgKiAtIERhdGFXaWR0aDogICAgICAgICAgRFNbMzowXSBiaXRzCisgICAgICogLSBOU1MgbWFuYWdlbWVudDogICAgIFNTT0UgYml0CisgICAgICovCisgICAgTU9ESUZZX1JFRyhTUEl4LT5DUjIsCisgICAgICAgICAgICAgICBTUElfQ1IyX0RTIHwgU1BJX0NSMl9TU09FLAorICAgICAgICAgICAgICAgU1BJX0luaXRTdHJ1Y3QtPkRhdGFXaWR0aCB8IChTUElfSW5pdFN0cnVjdC0+TlNTID4+IDE2VSkpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNQSXggQ1JDUFIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ29uZmlndXJlIFNQSXggQ1JDUFIgd2l0aCBwYXJhbWV0ZXJzOgorICAgICAqIC0gQ1JDUG9seTogICAgICAgICAgICBDUkNQT0xZWzE1OjBdIGJpdHMKKyAgICAgKi8KKyAgICBpZiAoU1BJX0luaXRTdHJ1Y3QtPkNSQ0NhbGN1bGF0aW9uID09IExMX1NQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1NQSV9DUkNfUE9MWU5PTUlBTChTUElfSW5pdFN0cnVjdC0+Q1JDUG9seSkpOworICAgICAgTExfU1BJX1NldENSQ1BvbHlub21pYWwoU1BJeCwgU1BJX0luaXRTdHJ1Y3QtPkNSQ1BvbHkpOworICAgIH0KKyAgICBzdGF0dXMgPSBTVUNDRVNTOworICB9CisKKyNpZiBkZWZpbmVkIChTUElfSTJTX1NVUFBPUlQpCisgIC8qIEFjdGl2YXRlIHRoZSBTUEkgbW9kZSAoUmVzZXQgSTJTTU9EIGJpdCBpbiBJMlNDRkdSIHJlZ2lzdGVyKSAqLworICBDTEVBUl9CSVQoU1BJeC0+STJTQ0ZHUiwgU1BJX0kyU0NGR1JfSTJTTU9EKTsKKyNlbmRpZiAvKiBTUElfSTJTX1NVUFBPUlQgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgZWFjaCBAcmVmIExMX1NQSV9Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSAgU1BJX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfU1BJX0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICAqIHdob3NlIGZpZWxkcyB3aWxsIGJlIHNldCB0byBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfU1BJX1N0cnVjdEluaXQoTExfU1BJX0luaXRUeXBlRGVmICpTUElfSW5pdFN0cnVjdCkKK3sKKyAgLyogU2V0IFNQSV9Jbml0U3RydWN0IGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICBTUElfSW5pdFN0cnVjdC0+VHJhbnNmZXJEaXJlY3Rpb24gPSBMTF9TUElfRlVMTF9EVVBMRVg7CisgIFNQSV9Jbml0U3RydWN0LT5Nb2RlICAgICAgICAgICAgICA9IExMX1NQSV9NT0RFX1NMQVZFOworICBTUElfSW5pdFN0cnVjdC0+RGF0YVdpZHRoICAgICAgICAgPSBMTF9TUElfREFUQVdJRFRIXzhCSVQ7CisgIFNQSV9Jbml0U3RydWN0LT5DbG9ja1BvbGFyaXR5ICAgICA9IExMX1NQSV9QT0xBUklUWV9MT1c7CisgIFNQSV9Jbml0U3RydWN0LT5DbG9ja1BoYXNlICAgICAgICA9IExMX1NQSV9QSEFTRV8xRURHRTsKKyAgU1BJX0luaXRTdHJ1Y3QtPk5TUyAgICAgICAgICAgICAgID0gTExfU1BJX05TU19IQVJEX0lOUFVUOworICBTUElfSW5pdFN0cnVjdC0+QmF1ZFJhdGUgICAgICAgICAgPSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMjsKKyAgU1BJX0luaXRTdHJ1Y3QtPkJpdE9yZGVyICAgICAgICAgID0gTExfU1BJX01TQl9GSVJTVDsKKyAgU1BJX0luaXRTdHJ1Y3QtPkNSQ0NhbGN1bGF0aW9uICAgID0gTExfU1BJX0NSQ0NBTENVTEFUSU9OX0RJU0FCTEU7CisgIFNQSV9Jbml0U3RydWN0LT5DUkNQb2x5ICAgICAgICAgICA9IDdVOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChTUElfSTJTX1NVUFBPUlQpCisvKiogQGFkZHRvZ3JvdXAgSTJTX0xMCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJMlNfTExfUHJpdmF0ZV9Db25zdGFudHMgSTJTIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKy8qIEkyUyByZWdpc3RlcnMgTWFza3MgKi8KKyNkZWZpbmUgSTJTX0kyU0NGR1JfQ0xFQVJfTUFTSyAgICAgICAgICAgICAoU1BJX0kyU0NGR1JfQ0hMRU4gICB8IFNQSV9JMlNDRkdSX0RBVExFTiB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0kyU0NGR1JfQ0tQT0wgICB8IFNQSV9JMlNDRkdSX0kyU1NURCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0kyU0NGR1JfSTJTQ0ZHICB8IFNQSV9JMlNDRkdSX0kyU01PRCApCisKKyNkZWZpbmUgSTJTX0kyU1BSX0NMRUFSX01BU0sgICAgICAgICAgICAgICAweDAwMDJVCisvKioKKyAgKiBAfQorICAqLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX1ByaXZhdGVfTWFjcm9zIEkyUyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfTExfSTJTX0RBVEFGT1JNQVQoX19WQUxVRV9fKSAgKCgoX19WQUxVRV9fKSA9PSBMTF9JMlNfREFUQUZPUk1BVF8xNkIpICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9JMlNfREFUQUZPUk1BVF8xNkJfRVhURU5ERUQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9JMlNfREFUQUZPUk1BVF8yNEIpICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9JMlNfREFUQUZPUk1BVF8zMkIpKQorCisjZGVmaW5lIElTX0xMX0kyU19DUE9MKF9fVkFMVUVfXykgICAgICAgICgoKF9fVkFMVUVfXykgPT0gTExfSTJTX1BPTEFSSVRZX0xPVykgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9JMlNfUE9MQVJJVFlfSElHSCkpCisKKyNkZWZpbmUgSVNfTExfSTJTX1NUQU5EQVJEKF9fVkFMVUVfXykgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9JMlNfU1RBTkRBUkRfUEhJTElQUykgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfSTJTX1NUQU5EQVJEX01TQikgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0kyU19TVEFOREFSRF9MU0IpICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9JMlNfU1RBTkRBUkRfUENNX1NIT1JUKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfSTJTX1NUQU5EQVJEX1BDTV9MT05HKSkKKworI2RlZmluZSBJU19MTF9JMlNfTU9ERShfX1ZBTFVFX18pICAgICAgICAoKChfX1ZBTFVFX18pID09IExMX0kyU19NT0RFX1NMQVZFX1RYKSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0kyU19NT0RFX1NMQVZFX1JYKSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0kyU19NT0RFX01BU1RFUl9UWCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0kyU19NT0RFX01BU1RFUl9SWCkpCisKKyNkZWZpbmUgSVNfTExfSTJTX01DTEtfT1VUUFVUKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9JMlNfTUNMS19PVVRQVVRfRU5BQkxFKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfSTJTX01DTEtfT1VUUFVUX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX0xMX0kyU19BVURJT19GUkVRKF9fVkFMVUVfXykgKCgoKF9fVkFMVUVfXykgPj0gTExfSTJTX0FVRElPRlJFUV84SykgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChfX1ZBTFVFX18pIDw9IExMX0kyU19BVURJT0ZSRVFfMTkySykpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9JMlNfQVVESU9GUkVRX0RFRkFVTFQpKQorCisjZGVmaW5lIElTX0xMX0kyU19QUkVTQ0FMRVJfTElORUFSKF9fVkFMVUVfXykgICgoX19WQUxVRV9fKSA+PSAweDJVKQorCisjZGVmaW5lIElTX0xMX0kyU19QUkVTQ0FMRVJfUEFSSVRZKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9JMlNfUFJFU0NBTEVSX1BBUklUWV9FVkVOKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0kyU19QUkVTQ0FMRVJfUEFSSVRZX09ERCkpCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEkyU19MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgSTJTX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgdGhlIFNQSS9JMlMgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogU1BJIHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBTUEkgcmVnaXN0ZXJzIGFyZSBub3QgZGUtaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0kyU19EZUluaXQoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiBMTF9TUElfRGVJbml0KFNQSXgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBTUEkvSTJTIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIEkyU19Jbml0U3RydWN0LgorICAqIEBub3RlICAgQXMgc29tZSBiaXRzIGluIFNQSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIFNQSSBpcyBkaXNhYmxlZCAoU1BJX0NSMV9TUEUgYml0ID0wKSwKKyAgKiAgICAgICAgIFNQSSBJUCBzaG91bGQgYmUgaW4gZGlzYWJsZWQgc3RhdGUgcHJpb3IgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiBPdGhlcndpc2UsIEVSUk9SIHJlc3VsdCB3aWxsIGJlIHJldHVybmVkLgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEkyU19Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX0kyU19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogU1BJIHJlZ2lzdGVycyBhcmUgSW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBTUEkgcmVnaXN0ZXJzIGFyZSBub3QgSW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0kyU19Jbml0KFNQSV9UeXBlRGVmICpTUEl4LCBMTF9JMlNfSW5pdFR5cGVEZWYgKkkyU19Jbml0U3RydWN0KQoreworICB1aW50MTZfdCBpMnNkaXYgPSAyVSwgaTJzb2RkID0gMFUsIHBhY2tldGxlbmd0aCA9IDFVOworICB1aW50MzJfdCB0bXAgPSAwVTsKKyAgTExfUkNDX0Nsb2Nrc1R5cGVEZWYgcmNjX2Nsb2NrczsKKyAgdWludDMyX3Qgc291cmNlY2xvY2sgPSAwVTsKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gRVJST1I7CisKKyAgLyogQ2hlY2sgdGhlIEkyUyBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMlNfQUxMX0lOU1RBTkNFKFNQSXgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0kyU19NT0RFKEkyU19Jbml0U3RydWN0LT5Nb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9JMlNfU1RBTkRBUkQoSTJTX0luaXRTdHJ1Y3QtPlN0YW5kYXJkKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9JMlNfREFUQUZPUk1BVChJMlNfSW5pdFN0cnVjdC0+RGF0YUZvcm1hdCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfSTJTX01DTEtfT1VUUFVUKEkyU19Jbml0U3RydWN0LT5NQ0xLT3V0cHV0KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9JMlNfQVVESU9fRlJFUShJMlNfSW5pdFN0cnVjdC0+QXVkaW9GcmVxKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9JMlNfQ1BPTChJMlNfSW5pdFN0cnVjdC0+Q2xvY2tQb2xhcml0eSkpOworCisgIGlmIChMTF9JMlNfSXNFbmFibGVkKFNQSXgpID09IDB4MDAwMDAwMDBVKQorICB7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNQSXggSTJTQ0ZHUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ29uZmlndXJlIFNQSXggSTJTQ0ZHUiB3aXRoIHBhcmFtZXRlcnM6CisgICAgICogLSBNb2RlOiAgICAgICAgICBTUElfSTJTQ0ZHUl9JMlNDRkdbMTowXSBiaXQKKyAgICAgKiAtIFN0YW5kYXJkOiAgICAgIFNQSV9JMlNDRkdSX0kyU1NURFsxOjBdIGFuZCBTUElfSTJTQ0ZHUl9QQ01TWU5DIGJpdHMKKyAgICAgKiAtIERhdGFGb3JtYXQ6ICAgIFNQSV9JMlNDRkdSX0NITEVOIGFuZCBTUElfSTJTQ0ZHUl9EQVRMRU4gYml0cworICAgICAqIC0gQ2xvY2tQb2xhcml0eTogU1BJX0kyU0NGR1JfQ0tQT0wgYml0CisgICAgICovCisKKyAgICAvKiBXcml0ZSB0byBTUEl4IEkyU0NGR1IgKi8KKyAgICBNT0RJRllfUkVHKFNQSXgtPkkyU0NGR1IsCisgICAgICAgICAgICAgICBJMlNfSTJTQ0ZHUl9DTEVBUl9NQVNLLAorICAgICAgICAgICAgICAgSTJTX0luaXRTdHJ1Y3QtPk1vZGUgfCBJMlNfSW5pdFN0cnVjdC0+U3RhbmRhcmQgfAorICAgICAgICAgICAgICAgSTJTX0luaXRTdHJ1Y3QtPkRhdGFGb3JtYXQgfCBJMlNfSW5pdFN0cnVjdC0+Q2xvY2tQb2xhcml0eSB8CisgICAgICAgICAgICAgICBTUElfSTJTQ0ZHUl9JMlNNT0QpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNQSXggSTJTUFIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ29uZmlndXJlIFNQSXggSTJTUFIgd2l0aCBwYXJhbWV0ZXJzOgorICAgICAqIC0gTUNMS091dHB1dDogICAgU1BJX0kyU1BSX01DS09FIGJpdAorICAgICAqIC0gQXVkaW9GcmVxOiAgICAgU1BJX0kyU1BSX0kyU0RJVls3OjBdIGFuZCBTUElfSTJTUFJfT0REIGJpdHMKKyAgICAgKi8KKworICAgIC8qIElmIHRoZSByZXF1ZXN0ZWQgYXVkaW8gZnJlcXVlbmN5IGlzIG5vdCB0aGUgZGVmYXVsdCwgY29tcHV0ZSB0aGUgcHJlc2NhbGVyIChpMnNvZGQsIGkyc2RpdikKKyAgICAgKiBlbHNlLCBkZWZhdWx0IHZhbHVlcyBhcmUgdXNlZDogIGkyc29kZCA9IDBVLCBpMnNkaXYgPSAyVS4KKyAgICAgKi8KKyAgICBpZiAoSTJTX0luaXRTdHJ1Y3QtPkF1ZGlvRnJlcSAhPSBMTF9JMlNfQVVESU9GUkVRX0RFRkFVTFQpCisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIGZyYW1lIGxlbmd0aCAoRm9yIHRoZSBQcmVzY2FsZXIgY29tcHV0aW5nKQorICAgICAgICogRGVmYXVsdCB2YWx1ZTogTExfSTJTX0RBVEFGT1JNQVRfMTZCIChwYWNrZXRsZW5ndGggPSAxVSkuCisgICAgICAgKi8KKyAgICAgIGlmIChJMlNfSW5pdFN0cnVjdC0+RGF0YUZvcm1hdCAhPSBMTF9JMlNfREFUQUZPUk1BVF8xNkIpCisgICAgICB7CisgICAgICAgIC8qIFBhY2tldCBsZW5ndGggaXMgMzIgYml0cyAqLworICAgICAgICBwYWNrZXRsZW5ndGggPSAyVTsKKyAgICAgIH0KKworICAgICAgLyogSTJTIENsb2NrIHNvdXJjZSBpcyBTeXN0ZW0gY2xvY2s6IEdldCBTeXN0ZW0gQ2xvY2sgZnJlcXVlbmN5ICovCisgICAgICBMTF9SQ0NfR2V0U3lzdGVtQ2xvY2tzRnJlcSgmcmNjX2Nsb2Nrcyk7CisKKyAgICAgIC8qIEdldCB0aGUgc291cmNlIGNsb2NrIHZhbHVlOiBiYXNlZCBvbiBTeXN0ZW0gQ2xvY2sgdmFsdWUgKi8KKyAgICAgIHNvdXJjZWNsb2NrID0gcmNjX2Nsb2Nrcy5TWVNDTEtfRnJlcXVlbmN5OworCisgICAgICAvKiBDb21wdXRlIHRoZSBSZWFsIGRpdmlkZXIgZGVwZW5kaW5nIG9uIHRoZSBNQ0xLIG91dHB1dCBzdGF0ZSB3aXRoIGEgZmxvYXRpbmcgcG9pbnQgKi8KKyAgICAgIGlmIChJMlNfSW5pdFN0cnVjdC0+TUNMS091dHB1dCA9PSBMTF9JMlNfTUNMS19PVVRQVVRfRU5BQkxFKQorICAgICAgeworICAgICAgICAvKiBNQ0xLIG91dHB1dCBpcyBlbmFibGVkICovCisgICAgICAgIHRtcCA9ICh1aW50MTZfdCkoKCgoKHNvdXJjZWNsb2NrIC8gMjU2VSkgKiAxMFUpIC8gSTJTX0luaXRTdHJ1Y3QtPkF1ZGlvRnJlcSkpICsgNVUpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBNQ0xLIG91dHB1dCBpcyBkaXNhYmxlZCAqLworICAgICAgICB0bXAgPSAodWludDE2X3QpKCgoKChzb3VyY2VjbG9jayAvICgzMlUgKiBwYWNrZXRsZW5ndGgpKSAqIDEwVSkgLyBJMlNfSW5pdFN0cnVjdC0+QXVkaW9GcmVxKSkgKyA1VSk7CisgICAgICB9CisKKyAgICAgIC8qIFJlbW92ZSB0aGUgZmxvYXRpbmcgcG9pbnQgKi8KKyAgICAgIHRtcCA9IHRtcCAvIDEwVTsKKworICAgICAgLyogQ2hlY2sgdGhlIHBhcml0eSBvZiB0aGUgZGl2aWRlciAqLworICAgICAgaTJzb2RkID0gKHVpbnQxNl90KSh0bXAgJiAodWludDE2X3QpMHgwMDAxVSk7CisKKyAgICAgIC8qIENvbXB1dGUgdGhlIGkyc2RpdiBwcmVzY2FsZXIgKi8KKyAgICAgIGkyc2RpdiA9ICh1aW50MTZfdCkoKHRtcCAtIGkyc29kZCkgLyAyVSk7CisKKyAgICAgIC8qIEdldCB0aGUgTWFzayBmb3IgdGhlIE9kZCBiaXQgKFNQSV9JMlNQUls4XSkgcmVnaXN0ZXIgKi8KKyAgICAgIGkyc29kZCA9ICh1aW50MTZfdCkoaTJzb2RkIDw8IDhVKTsKKyAgICB9CisKKyAgICAvKiBUZXN0IGlmIHRoZSBkaXZpZGVyIGlzIDEgb3IgMCBvciBncmVhdGVyIHRoYW4gMHhGRiAqLworICAgIGlmICgoaTJzZGl2IDwgMlUpIHx8IChpMnNkaXYgPiAweEZGVSkpCisgICAgeworICAgICAgLyogU2V0IHRoZSBkZWZhdWx0IHZhbHVlcyAqLworICAgICAgaTJzZGl2ID0gMlU7CisgICAgICBpMnNvZGQgPSAwVTsKKyAgICB9CisKKyAgICAvKiBXcml0ZSB0byBTUEl4IEkyU1BSIHJlZ2lzdGVyIHRoZSBjb21wdXRlZCB2YWx1ZSAqLworICAgIFdSSVRFX1JFRyhTUEl4LT5JMlNQUiwgaTJzZGl2IHwgaTJzb2RkIHwgSTJTX0luaXRTdHJ1Y3QtPk1DTEtPdXRwdXQpOworCisgICAgc3RhdHVzID0gU1VDQ0VTUzsKKyAgfQorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBlYWNoIEByZWYgTExfSTJTX0luaXRUeXBlRGVmIGZpZWxkIHRvIGRlZmF1bHQgdmFsdWUuCisgICogQHBhcmFtICBJMlNfSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9JMlNfSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogICAgICAgICB3aG9zZSBmaWVsZHMgd2lsbCBiZSBzZXQgdG8gZGVmYXVsdCB2YWx1ZXMuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX0kyU19TdHJ1Y3RJbml0KExMX0kyU19Jbml0VHlwZURlZiAqSTJTX0luaXRTdHJ1Y3QpCit7CisgIC8qLS0tLS0tLS0tLS0tLS0tIFJlc2V0IEkyUyBpbml0IHN0cnVjdHVyZSBwYXJhbWV0ZXJzIHZhbHVlcyAtLS0tLS0tLS0tLS0tLS0tLSovCisgIEkyU19Jbml0U3RydWN0LT5Nb2RlICAgICAgICAgICAgICA9IExMX0kyU19NT0RFX1NMQVZFX1RYOworICBJMlNfSW5pdFN0cnVjdC0+U3RhbmRhcmQgICAgICAgICAgPSBMTF9JMlNfU1RBTkRBUkRfUEhJTElQUzsKKyAgSTJTX0luaXRTdHJ1Y3QtPkRhdGFGb3JtYXQgICAgICAgID0gTExfSTJTX0RBVEFGT1JNQVRfMTZCOworICBJMlNfSW5pdFN0cnVjdC0+TUNMS091dHB1dCAgICAgICAgPSBMTF9JMlNfTUNMS19PVVRQVVRfRElTQUJMRTsKKyAgSTJTX0luaXRTdHJ1Y3QtPkF1ZGlvRnJlcSAgICAgICAgID0gTExfSTJTX0FVRElPRlJFUV9ERUZBVUxUOworICBJMlNfSW5pdFN0cnVjdC0+Q2xvY2tQb2xhcml0eSAgICAgPSBMTF9JMlNfUE9MQVJJVFlfTE9XOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBsaW5lYXIgYW5kIHBhcml0eSBwcmVzY2FsZXIuCisgICogQG5vdGUgICBUbyBjYWxjdWxhdGUgdmFsdWUgb2YgUHJlc2NhbGVyTGluZWFyKEkyU0RJVls3OjBdIGJpdHMpIGFuZCBQcmVzY2FsZXJQYXJpdHkoT0REIGJpdClcbgorICAqICAgICAgICAgQ2hlY2sgQXVkaW8gZnJlcXVlbmN5IHRhYmxlIGFuZCBmb3JtdWxhcyBpbnNpZGUgUmVmZXJlbmNlIE1hbnVhbCAoU1BJL0kyUykuCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEBwYXJhbSAgUHJlc2NhbGVyTGluZWFyIHZhbHVlOiBNaW5fRGF0YT0weDAyIGFuZCBNYXhfRGF0YT0weEZGLgorICAqIEBwYXJhbSAgUHJlc2NhbGVyUGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1BSRVNDQUxFUl9QQVJJVFlfRVZFTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19QUkVTQ0FMRVJfUEFSSVRZX09ERAorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9JMlNfQ29uZmlnUHJlc2NhbGVyKFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBQcmVzY2FsZXJMaW5lYXIsIHVpbnQzMl90IFByZXNjYWxlclBhcml0eSkKK3sKKyAgLyogQ2hlY2sgdGhlIEkyUyBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMlNfQUxMX0lOU1RBTkNFKFNQSXgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0kyU19QUkVTQ0FMRVJfTElORUFSKFByZXNjYWxlckxpbmVhcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfSTJTX1BSRVNDQUxFUl9QQVJJVFkoUHJlc2NhbGVyUGFyaXR5KSk7CisKKyAgLyogV3JpdGUgdG8gU1BJeCBJMlNQUiAqLworICBNT0RJRllfUkVHKFNQSXgtPkkyU1BSLCBTUElfSTJTUFJfSTJTRElWIHwgU1BJX0kyU1BSX09ERCwgUHJlc2NhbGVyTGluZWFyIHwgKFByZXNjYWxlclBhcml0eSA8PCA4VSkpOworfQorCisjaWYgZGVmaW5lZCAoU1BJX0kyU19GVUxMRFVQTEVYX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIGZ1bGwgZHVwbGV4IG1vZGUgZm9yIHRoZSBJMlN4IHBlcmlwaGVyYWwgdXNpbmcgaXRzIGV4dGVuc2lvbgorICAqICAgICAgICAgSTJTeGV4dCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIHRoZSBJMlNfSW5pdFN0cnVjdC4KKyAgKiBAbm90ZSAgIFRoZSBzdHJ1Y3R1cmUgcG9pbnRlZCBieSBJMlNfSW5pdFN0cnVjdCBwYXJhbWV0ZXIgc2hvdWxkIGJlIHRoZSBzYW1lCisgICogICAgICAgICB1c2VkIGZvciB0aGUgbWFzdGVyIEkyUyBwZXJpcGhlcmFsLiBJbiB0aGlzIGNhc2UsIGlmIHRoZSBtYXN0ZXIgaXMKKyAgKiAgICAgICAgIGNvbmZpZ3VyZWQgYXMgdHJhbnNtaXR0ZXIsIHRoZSBzbGF2ZSB3aWxsIGJlIHJlY2VpdmVyIGFuZCB2aWNlIHZlcnNhLgorICAqICAgICAgICAgT3IgeW91IGNhbiBmb3JjZSBhIGRpZmZlcmVudCBtb2RlIGJ5IG1vZGlmeWluZyB0aGUgZmllbGQgSTJTX01vZGUgdG8gdGhlCisgICogICAgICAgICB2YWx1ZSBJMlNfU2xhdmVSeCBvciBJMlNfU2xhdmVUeCBpbmRlcGVuZGVudGx5IG9mIHRoZSBtYXN0ZXIgY29uZmlndXJhdGlvbi4KKyAgKiBAcGFyYW0gIEkyU3hleHQgU1BJIEluc3RhbmNlCisgICogQHBhcmFtICBJMlNfSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9JMlNfSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IEkyU3hleHQgcmVnaXN0ZXJzIGFyZSBJbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IEkyU3hleHQgcmVnaXN0ZXJzIGFyZSBub3QgSW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzICBMTF9JMlNfSW5pdEZ1bGxEdXBsZXgoU1BJX1R5cGVEZWYgKkkyU3hleHQsIExMX0kyU19Jbml0VHlwZURlZiAqSTJTX0luaXRTdHJ1Y3QpCit7CisgIHVpbnQxNl90IG1vZGUgPSAwVTsKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gRVJST1I7CisKKyAgLyogQ2hlY2sgdGhlIEkyUyBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMlNfRVhUX0FMTF9JTlNUQU5DRShJMlN4ZXh0KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9JMlNfTU9ERShJMlNfSW5pdFN0cnVjdC0+TW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfSTJTX1NUQU5EQVJEKEkyU19Jbml0U3RydWN0LT5TdGFuZGFyZCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfSTJTX0RBVEFGT1JNQVQoSTJTX0luaXRTdHJ1Y3QtPkRhdGFGb3JtYXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0kyU19DUE9MKEkyU19Jbml0U3RydWN0LT5DbG9ja1BvbGFyaXR5KSk7CisKKyAgaWYgKExMX0kyU19Jc0VuYWJsZWQoSTJTeGV4dCkgPT0gMHgwMDAwMDAwMFUpCisgIHsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1BJeCBJMlNDRkdSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiBDb25maWd1cmUgU1BJeCBJMlNDRkdSIHdpdGggcGFyYW1ldGVyczoKKyAgICAgKiAtIE1vZGU6ICAgICAgICAgIFNQSV9JMlNDRkdSX0kyU0NGR1sxOjBdIGJpdAorICAgICAqIC0gU3RhbmRhcmQ6ICAgICAgU1BJX0kyU0NGR1JfSTJTU1REWzE6MF0gYW5kIFNQSV9JMlNDRkdSX1BDTVNZTkMgYml0cworICAgICAqIC0gRGF0YUZvcm1hdDogICAgU1BJX0kyU0NGR1JfQ0hMRU4gYW5kIFNQSV9JMlNDRkdSX0RBVExFTiBiaXRzCisgICAgICogLSBDbG9ja1BvbGFyaXR5OiBTUElfSTJTQ0ZHUl9DS1BPTCBiaXQKKyAgICAgKi8KKworICAgIC8qIFJlc2V0IEkyU1BSIHJlZ2lzdGVycyAqLworICAgIFdSSVRFX1JFRyhJMlN4ZXh0LT5JMlNQUiwgSTJTX0kyU1BSX0NMRUFSX01BU0spOworCisgICAgLyogR2V0IHRoZSBtb2RlIHRvIGJlIGNvbmZpZ3VyZWQgZm9yIHRoZSBleHRlbmRlZCBJMlMgKi8KKyAgICBpZiAoKEkyU19Jbml0U3RydWN0LT5Nb2RlID09IExMX0kyU19NT0RFX01BU1RFUl9UWCkgfHwgKEkyU19Jbml0U3RydWN0LT5Nb2RlID09IExMX0kyU19NT0RFX1NMQVZFX1RYKSkKKyAgICB7CisgICAgICBtb2RlID0gTExfSTJTX01PREVfU0xBVkVfUlg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAoKEkyU19Jbml0U3RydWN0LT5Nb2RlID09IExMX0kyU19NT0RFX01BU1RFUl9SWCkgfHwgKEkyU19Jbml0U3RydWN0LT5Nb2RlID09IExMX0kyU19NT0RFX1NMQVZFX1JYKSkKKyAgICAgIHsKKyAgICAgICAgbW9kZSA9IExMX0kyU19NT0RFX1NMQVZFX1RYOworICAgICAgfQorICAgIH0KKworICAgIC8qIFdyaXRlIHRvIFNQSXggSTJTQ0ZHUiAqLworICAgIE1PRElGWV9SRUcoSTJTeGV4dC0+STJTQ0ZHUiwKKyAgICAgICAgICAgICAgIEkyU19JMlNDRkdSX0NMRUFSX01BU0ssCisgICAgICAgICAgICAgICBJMlNfSW5pdFN0cnVjdC0+U3RhbmRhcmQgfAorICAgICAgICAgICAgICAgSTJTX0luaXRTdHJ1Y3QtPkRhdGFGb3JtYXQgfCBJMlNfSW5pdFN0cnVjdC0+Q2xvY2tQb2xhcml0eSB8CisgICAgICAgICAgICAgICBTUElfSTJTQ0ZHUl9JMlNNT0QgfCBtb2RlKTsKKworICAgIHN0YXR1cyA9IFNVQ0NFU1M7CisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiBTUElfSTJTX0ZVTExEVVBMRVhfU1VQUE9SVCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFNQSV9JMlNfU1VQUE9SVCAqLworCisjZW5kaWYgLyogZGVmaW5lZCAoU1BJMSkgfHwgZGVmaW5lZCAoU1BJMikgfHwgZGVmaW5lZCAoU1BJMykgfHwgZGVmaW5lZCAoU1BJNCkgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjN4eF9sbF90aW0uYyBiL1NyYy9zdG0zMmYzeHhfbGxfdGltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRjOTM0NgotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmYzeHhfbGxfdGltLmMKQEAgLTAsMCArMSwxNDY1IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2xsX3RpbS5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBUSU0gTEwgbW9kdWxlIGRyaXZlci4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmM3h4X2xsX3RpbS5oIgorI2luY2x1ZGUgInN0bTMyZjN4eF9sbF9idXMuaCIKKworI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoVElNMSkgfHwgZGVmaW5lZCAoVElNMikgfHwgZGVmaW5lZCAoVElNMykgfHwgZGVmaW5lZCAoVElNNCkgfHwgZGVmaW5lZCAoVElNNSkgfHwgZGVmaW5lZCAoVElNNikgfHwgZGVmaW5lZCAoVElNNykgfHwgZGVmaW5lZCAoVElNOCkgfHwgZGVmaW5lZCAoVElNMTIpIHx8IGRlZmluZWQgKFRJTTEzKSB8fCBkZWZpbmVkIChUSU0xNCkgfHwgZGVmaW5lZCAoVElNMTUpIHx8IGRlZmluZWQgKFRJTTE2KSB8fCBkZWZpbmVkIChUSU0xNykgfHwgZGVmaW5lZCAoVElNMTgpIHx8IGRlZmluZWQgKFRJTTE5KSB8fCBkZWZpbmVkIChUSU0yMCkKKworLyoqIEBhZGR0b2dyb3VwIFRJTV9MTAorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVElNX0xMX1ByaXZhdGVfTWFjcm9zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfTExfVElNX0NPVU5URVJNT0RFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fQ09VTlRFUk1PREVfVVApIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQ09VTlRFUk1PREVfRE9XTikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9DT1VOVEVSTU9ERV9DRU5URVJfVVApIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQ09VTlRFUk1PREVfQ0VOVEVSX0RPV04pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQ09VTlRFUk1PREVfQ0VOVEVSX1VQX0RPV04pKQorCisjZGVmaW5lIElTX0xMX1RJTV9DTE9DS0RJVklTSU9OKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVYxKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVYyKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVY0KSkKKworI2lmIGRlZmluZWQoVElNX0NDTVIxX09DMU1fMykKKyNkZWZpbmUgSVNfTExfVElNX09DTU9ERShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX09DTU9ERV9GUk9aRU4pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX09DTU9ERV9BQ1RJVkUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX09DTU9ERV9JTkFDVElWRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX1RPR0dMRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX0ZPUkNFRF9JTkFDVElWRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX0ZPUkNFRF9BQ1RJVkUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX09DTU9ERV9QV00xKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ01PREVfUFdNMikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX1JFVFJJR19PUE0xKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ01PREVfUkVUUklHX09QTTIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX09DTU9ERV9DT01CSU5FRF9QV00xKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ01PREVfQ09NQklORURfUFdNMikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX0FTU1lNRVRSSUNfUFdNMSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX0FTU1lNRVRSSUNfUFdNMikpCisjZWxzZQorI2RlZmluZSBJU19MTF9USU1fT0NNT0RFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX0ZST1pFTikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX0FDVElWRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX0lOQUNUSVZFKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ01PREVfVE9HR0xFKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ01PREVfRk9SQ0VEX0lOQUNUSVZFKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ01PREVfRk9SQ0VEX0FDVElWRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX1BXTTEpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX09DTU9ERV9QV00yKSkKKyNlbmRpZgorCisjZGVmaW5lIElTX0xMX1RJTV9PQ1NUQVRFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NTVEFURV9ESVNBQkxFKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NTVEFURV9FTkFCTEUpKQorCisjZGVmaW5lIElTX0xMX1RJTV9PQ1BPTEFSSVRZKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NQT0xBUklUWV9ISUdIKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NQT0xBUklUWV9MT1cpKQorCisjZGVmaW5lIElTX0xMX1RJTV9PQ0lETEVTVEFURShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX09DSURMRVNUQVRFX0xPVykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ0lETEVTVEFURV9ISUdIKSkKKworI2RlZmluZSBJU19MTF9USU1fQUNUSVZFSU5QVVQoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9BQ1RJVkVJTlBVVF9ESVJFQ1RUSSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9BQ1RJVkVJTlBVVF9JTkRJUkVDVFRJKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0FDVElWRUlOUFVUX1RSQykpCisKKyNkZWZpbmUgSVNfTExfVElNX0lDUFNDKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNQU0NfRElWMSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ1BTQ19ESVYyKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDUFNDX0RJVjQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNQU0NfRElWOCkpCisKKyNkZWZpbmUgSVNfTExfVElNX0lDX0ZJTFRFUihfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWMSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVYxX04yKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjFfTjQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWMV9OOCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVYyX042KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjJfTjgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWNF9ONikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVY0X044KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjhfTjYpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWOF9OOCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVYxNl9ONSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVYxNl9ONikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVYxNl9OOCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVYzMl9ONSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVYzMl9ONikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVYzMl9OOCkpCisKKyNkZWZpbmUgSVNfTExfVElNX0lDX1BPTEFSSVRZKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfUE9MQVJJVFlfUklTSU5HKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX1BPTEFSSVRZX0ZBTExJTkcpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfUE9MQVJJVFlfQk9USEVER0UpKQorCisjZGVmaW5lIElTX0xMX1RJTV9FTkNPREVSTU9ERShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0VOQ09ERVJNT0RFX1gyX1RJMSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9FTkNPREVSTU9ERV9YMl9USTIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fRU5DT0RFUk1PREVfWDRfVEkxMikpCisKKyNkZWZpbmUgSVNfTExfVElNX0lDX1BPTEFSSVRZX0VOQ09ERVIoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19QT0xBUklUWV9SSVNJTkcpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19QT0xBUklUWV9GQUxMSU5HKSkKKworI2RlZmluZSBJU19MTF9USU1fT1NTUl9TVEFURShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX09TU1JfRElTQUJMRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT1NTUl9FTkFCTEUpKQorCisjZGVmaW5lIElTX0xMX1RJTV9PU1NJX1NUQVRFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fT1NTSV9ESVNBQkxFKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT1NTSV9FTkFCTEUpKQorCisjZGVmaW5lIElTX0xMX1RJTV9MT0NLX0xFVkVMKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fTE9DS0xFVkVMX09GRikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0xPQ0tMRVZFTF8xKSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9MT0NLTEVWRUxfMikgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fTE9DS0xFVkVMXzMpKQorCisjZGVmaW5lIElTX0xMX1RJTV9CUkVBS19TVEFURShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLX0RJU0FCTEUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRU5BQkxFKSkKKworI2RlZmluZSBJU19MTF9USU1fQlJFQUtfUE9MQVJJVFkoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBS19QT0xBUklUWV9MT1cpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfUE9MQVJJVFlfSElHSCkpCisjaWYgZGVmaW5lZChUSU1fQkRUUl9CS0YpCisKKyNkZWZpbmUgSVNfTExfVElNX0JSRUFLX0ZJTFRFUihfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMSkgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMV9OMikgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMV9ONCkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMV9OOCkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMl9ONikgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMl9OOCkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWNF9ONikgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWNF9OOCkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWOF9ONikgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWOF9OOCkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMTZfTjUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMTZfTjYpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMTZfTjgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMzJfTjUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMzJfTjYpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMzJfTjgpKQorI2VuZGlmIC8qIFRJTV9CRFRSX0JLRiAqLworI2lmIGRlZmluZWQoVElNX0JEVFJfQksyRSkKKworI2RlZmluZSBJU19MTF9USU1fQlJFQUsyX1NUQVRFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0RJU0FCTEUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9FTkFCTEUpKQorCisjZGVmaW5lIElTX0xMX1RJTV9CUkVBSzJfUE9MQVJJVFkoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfUE9MQVJJVFlfTE9XKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfUE9MQVJJVFlfSElHSCkpCisKKyNkZWZpbmUgSVNfTExfVElNX0JSRUFLMl9GSUxURVIoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxKSAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMV9OMikgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxX040KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjFfTjgpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMl9ONikgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYyX044KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjRfTjYpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWNF9OOCkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVY4X042KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjhfTjgpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMTZfTjUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxNl9ONikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjE2X044KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMzJfTjUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYzMl9ONikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjMyX044KSkKKyNlbmRpZiAvKiBUSU1fQkRUUl9CSzJFICovCisKKyNkZWZpbmUgSVNfTExfVElNX0FVVE9NQVRJQ19PVVRQVVRfU1RBVEUoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9BVVRPTUFUSUNPVVRQVVRfRElTQUJMRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0FVVE9NQVRJQ09VVFBVVF9FTkFCTEUpKQorLyoqCisgICogQH0KKyAgKi8KKworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1fTExfUHJpdmF0ZV9GdW5jdGlvbnMgVElNIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3N0YXRpYyBFcnJvclN0YXR1cyBPQzFDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9PQ19Jbml0VHlwZURlZiAqVElNX09DSW5pdFN0cnVjdCk7CitzdGF0aWMgRXJyb3JTdGF0dXMgT0MyQ29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fT0NfSW5pdFR5cGVEZWYgKlRJTV9PQ0luaXRTdHJ1Y3QpOworc3RhdGljIEVycm9yU3RhdHVzIE9DM0NvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX09DX0luaXRUeXBlRGVmICpUSU1fT0NJbml0U3RydWN0KTsKK3N0YXRpYyBFcnJvclN0YXR1cyBPQzRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9PQ19Jbml0VHlwZURlZiAqVElNX09DSW5pdFN0cnVjdCk7CisjaWYgZGVmaW5lZChUSU1fQ0NFUl9DQzVFKQorc3RhdGljIEVycm9yU3RhdHVzIE9DNUNvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX09DX0luaXRUeXBlRGVmICpUSU1fT0NJbml0U3RydWN0KTsKKyNlbmRpZiAvKiBUSU1fQ0NFUl9DQzVFICovCisjaWYgZGVmaW5lZChUSU1fQ0NFUl9DQzZFKQorc3RhdGljIEVycm9yU3RhdHVzIE9DNkNvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX09DX0luaXRUeXBlRGVmICpUSU1fT0NJbml0U3RydWN0KTsKKyNlbmRpZiAvKiBUSU1fQ0NFUl9DQzZFICovCitzdGF0aWMgRXJyb3JTdGF0dXMgSUMxQ29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fSUNfSW5pdFR5cGVEZWYgKlRJTV9JQ0luaXRTdHJ1Y3QpOworc3RhdGljIEVycm9yU3RhdHVzIElDMkNvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX0lDX0luaXRUeXBlRGVmICpUSU1fSUNJbml0U3RydWN0KTsKK3N0YXRpYyBFcnJvclN0YXR1cyBJQzNDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9JQ19Jbml0VHlwZURlZiAqVElNX0lDSW5pdFN0cnVjdCk7CitzdGF0aWMgRXJyb3JTdGF0dXMgSUM0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fSUNfSW5pdFR5cGVEZWYgKlRJTV9JQ0luaXRTdHJ1Y3QpOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBUSU1fTExfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTV9MTF9FRl9Jbml0CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgVElNeCByZWdpc3RlcnMgdG8gdGhlaXIgcmVzZXQgdmFsdWVzLgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBUSU14IHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBpbnZhbGlkIFRJTXggaW5zdGFuY2UKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1RJTV9EZUluaXQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIEVycm9yU3RhdHVzIHJlc3VsdCA9IFNVQ0NFU1M7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShUSU14KSk7CisKKworICBpZiAoVElNeCA9PSBUSU0yKQorICB7CisgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9USU0yKTsKKyAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMik7CisgIH0KKworI2lmIGRlZmluZWQoVElNMSkKKyAgZWxzZSBpZiAoVElNeCA9PSBUSU0xKQorICB7CisgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9USU0xKTsKKyAgICBMTF9BUEIyX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMSk7CisgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoVElNMykKKyAgZWxzZSBpZiAoVElNeCA9PSBUSU0zKQorICB7CisgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9USU0zKTsKKyAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMyk7CisgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoVElNNCkKKyAgZWxzZSBpZiAoVElNeCA9PSBUSU00KQorICB7CisgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9USU00KTsKKyAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNCk7CisgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoVElNNSkKKyAgZWxzZSBpZiAoVElNeCA9PSBUSU01KQorICB7CisgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9USU01KTsKKyAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNSk7CisgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoVElNNikKKyAgZWxzZSBpZiAoVElNeCA9PSBUSU02KQorICB7CisgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9USU02KTsKKyAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNik7CisgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoVElNNykKKyAgZWxzZSBpZiAoVElNeCA9PSBUSU03KQorICB7CisgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9USU03KTsKKyAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNyk7CisgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoVElNOCkKKyAgZWxzZSBpZiAoVElNeCA9PSBUSU04KQorICB7CisgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9USU04KTsKKyAgICBMTF9BUEIyX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjJfR1JQMV9QRVJJUEhfVElNOCk7CisgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoVElNMTIpCisgIGVsc2UgaWYgKFRJTXggPT0gVElNMTIpCisgIHsKKyAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTEyKTsKKyAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMTIpOworICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFRJTTEzKQorICBlbHNlIGlmIChUSU14ID09IFRJTTEzKQorICB7CisgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9USU0xMyk7CisgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTEzKTsKKyAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChUSU0xNCkKKyAgZWxzZSBpZiAoVElNeCA9PSBUSU0xNCkKKyAgeworICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMTQpOworICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9USU0xNCk7CisgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoVElNMTUpCisgIGVsc2UgaWYgKFRJTXggPT0gVElNMTUpCisgIHsKKyAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldChMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE1KTsKKyAgICBMTF9BUEIyX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTUpOworICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFRJTTE2KQorICBlbHNlIGlmIChUSU14ID09IFRJTTE2KQorICB7CisgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNik7CisgICAgTExfQVBCMl9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE2KTsKKyAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChUSU0xNykKKyAgZWxzZSBpZiAoVElNeCA9PSBUSU0xNykKKyAgeworICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTcpOworICAgIExMX0FQQjJfR1JQMV9SZWxlYXNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNyk7CisgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoVElNMTgpCisgIGVsc2UgaWYgKFRJTXggPT0gVElNMTgpCisgIHsKKyAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTE4KTsKKyAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMTgpOworICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFRJTTE5KQorICBlbHNlIGlmIChUSU14ID09IFRJTTE5KQorICB7CisgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9USU0xOSk7CisgICAgTExfQVBCMl9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE5KTsKKyAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChUSU0yMCkKKyAgZWxzZSBpZiAoVElNeCA9PSBUSU0yMCkKKyAgeworICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMjApOworICAgIExMX0FQQjJfR1JQMV9SZWxlYXNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9USU0yMCk7CisgIH0KKyNlbmRpZgorICBlbHNlCisgIHsKKyAgICByZXN1bHQgPSBFUlJPUjsKKyAgfQorCisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGZpZWxkcyBvZiB0aGUgdGltZSBiYXNlIHVuaXQgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZQorICAqICAgICAgICAgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICogQHBhcmFtICBUSU1fSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9USU1fSW5pdFR5cGVEZWYgc3RydWN0dXJlICh0aW1lIGJhc2UgdW5pdCBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlKQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9USU1fU3RydWN0SW5pdChMTF9USU1fSW5pdFR5cGVEZWYgKlRJTV9Jbml0U3RydWN0KQoreworICAvKiBTZXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiAqLworICBUSU1fSW5pdFN0cnVjdC0+UHJlc2NhbGVyICAgICAgICAgPSAodWludDE2X3QpMHgwMDAwVTsKKyAgVElNX0luaXRTdHJ1Y3QtPkNvdW50ZXJNb2RlICAgICAgID0gTExfVElNX0NPVU5URVJNT0RFX1VQOworICBUSU1fSW5pdFN0cnVjdC0+QXV0b3JlbG9hZCAgICAgICAgPSAweEZGRkZGRkZGVTsKKyAgVElNX0luaXRTdHJ1Y3QtPkNsb2NrRGl2aXNpb24gICAgID0gTExfVElNX0NMT0NLRElWSVNJT05fRElWMTsKKyAgVElNX0luaXRTdHJ1Y3QtPlJlcGV0aXRpb25Db3VudGVyID0gKHVpbnQ4X3QpMHgwMFU7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBUSU14IHRpbWUgYmFzZSB1bml0LgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBJbnN0YW5jZQorICAqIEBwYXJhbSAgVElNX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVElNX0luaXRUeXBlRGVmIHN0cnVjdHVyZSAoVElNeCB0aW1lIGJhc2UgdW5pdCBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlKQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBUSU14IHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBub3QgYXBwbGljYWJsZQorICAqLworRXJyb3JTdGF0dXMgTExfVElNX0luaXQoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9Jbml0VHlwZURlZiAqVElNX0luaXRTdHJ1Y3QpCit7CisgIHVpbnQzMl90IHRtcGNyMSA9IDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoVElNeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0NPVU5URVJNT0RFKFRJTV9Jbml0U3RydWN0LT5Db3VudGVyTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0NMT0NLRElWSVNJT04oVElNX0luaXRTdHJ1Y3QtPkNsb2NrRGl2aXNpb24pKTsKKworICB0bXBjcjEgPSBMTF9USU1fUmVhZFJlZyhUSU14LCBDUjEpOworCisgIGlmIChJU19USU1fQ09VTlRFUl9NT0RFX1NFTEVDVF9JTlNUQU5DRShUSU14KSkKKyAgeworICAgIC8qIFNlbGVjdCB0aGUgQ291bnRlciBNb2RlICovCisgICAgTU9ESUZZX1JFRyh0bXBjcjEsIChUSU1fQ1IxX0RJUiB8IFRJTV9DUjFfQ01TKSwgVElNX0luaXRTdHJ1Y3QtPkNvdW50ZXJNb2RlKTsKKyAgfQorCisgIGlmIChJU19USU1fQ0xPQ0tfRElWSVNJT05fSU5TVEFOQ0UoVElNeCkpCisgIHsKKyAgICAvKiBTZXQgdGhlIGNsb2NrIGRpdmlzaW9uICovCisgICAgTU9ESUZZX1JFRyh0bXBjcjEsIFRJTV9DUjFfQ0tELCBUSU1fSW5pdFN0cnVjdC0+Q2xvY2tEaXZpc2lvbik7CisgIH0KKworICAvKiBXcml0ZSB0byBUSU14IENSMSAqLworICBMTF9USU1fV3JpdGVSZWcoVElNeCwgQ1IxLCB0bXBjcjEpOworCisgIC8qIFNldCB0aGUgQXV0b3JlbG9hZCB2YWx1ZSAqLworICBMTF9USU1fU2V0QXV0b1JlbG9hZChUSU14LCBUSU1fSW5pdFN0cnVjdC0+QXV0b3JlbG9hZCk7CisKKyAgLyogU2V0IHRoZSBQcmVzY2FsZXIgdmFsdWUgKi8KKyAgTExfVElNX1NldFByZXNjYWxlcihUSU14LCBUSU1fSW5pdFN0cnVjdC0+UHJlc2NhbGVyKTsKKworICBpZiAoSVNfVElNX1JFUEVUSVRJT05fQ09VTlRFUl9JTlNUQU5DRShUSU14KSkKKyAgeworICAgIC8qIFNldCB0aGUgUmVwZXRpdGlvbiBDb3VudGVyIHZhbHVlICovCisgICAgTExfVElNX1NldFJlcGV0aXRpb25Db3VudGVyKFRJTXgsIFRJTV9Jbml0U3RydWN0LT5SZXBldGl0aW9uQ291bnRlcik7CisgIH0KKworICAvKiBHZW5lcmF0ZSBhbiB1cGRhdGUgZXZlbnQgdG8gcmVsb2FkIHRoZSBQcmVzY2FsZXIKKyAgICAgYW5kIHRoZSByZXBldGl0aW9uIGNvdW50ZXIgdmFsdWUgKGlmIGFwcGxpY2FibGUpIGltbWVkaWF0ZWx5ICovCisgIExMX1RJTV9HZW5lcmF0ZUV2ZW50X1VQREFURShUSU14KTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGZpZWxkcyBvZiB0aGUgVElNeCBvdXRwdXQgY2hhbm5lbCBjb25maWd1cmF0aW9uIGRhdGEKKyAgKiAgICAgICAgIHN0cnVjdHVyZSB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcGFyYW0gIFRJTV9PQ19Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1RJTV9PQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgKHRoZSBvdXRwdXQgY2hhbm5lbCBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlKQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9USU1fT0NfU3RydWN0SW5pdChMTF9USU1fT0NfSW5pdFR5cGVEZWYgKlRJTV9PQ19Jbml0U3RydWN0KQoreworICAvKiBTZXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiAqLworICBUSU1fT0NfSW5pdFN0cnVjdC0+T0NNb2RlICAgICAgID0gTExfVElNX09DTU9ERV9GUk9aRU47CisgIFRJTV9PQ19Jbml0U3RydWN0LT5PQ1N0YXRlICAgICAgPSBMTF9USU1fT0NTVEFURV9ESVNBQkxFOworICBUSU1fT0NfSW5pdFN0cnVjdC0+T0NOU3RhdGUgICAgID0gTExfVElNX09DU1RBVEVfRElTQUJMRTsKKyAgVElNX09DX0luaXRTdHJ1Y3QtPkNvbXBhcmVWYWx1ZSA9IDB4MDAwMDAwMDBVOworICBUSU1fT0NfSW5pdFN0cnVjdC0+T0NQb2xhcml0eSAgID0gTExfVElNX09DUE9MQVJJVFlfSElHSDsKKyAgVElNX09DX0luaXRTdHJ1Y3QtPk9DTlBvbGFyaXR5ICA9IExMX1RJTV9PQ1BPTEFSSVRZX0hJR0g7CisgIFRJTV9PQ19Jbml0U3RydWN0LT5PQ0lkbGVTdGF0ZSAgPSBMTF9USU1fT0NJRExFU1RBVEVfTE9XOworICBUSU1fT0NfSW5pdFN0cnVjdC0+T0NOSWRsZVN0YXRlID0gTExfVElNX09DSURMRVNUQVRFX0xPVzsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJTXggb3V0cHV0IGNoYW5uZWwuCisgICogQHBhcmFtICBUSU14IFRpbWVyIEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgICogQHBhcmFtICBUSU1fT0NfSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9USU1fT0NfSW5pdFR5cGVEZWYgc3RydWN0dXJlIChUSU14IG91dHB1dCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUpCisgICogQG5vdGUgICBPQzUgYW5kIE9DNiBhcmUgbm90IGF2YWlsYWJsZSBmb3IgYWxsIEYzIGRldmljZXMKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVElNeCBvdXRwdXQgY2hhbm5lbCBpcyBpbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IFRJTXggb3V0cHV0IGNoYW5uZWwgaXMgbm90IGluaXRpYWxpemVkCisgICovCitFcnJvclN0YXR1cyBMTF9USU1fT0NfSW5pdChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgTExfVElNX09DX0luaXRUeXBlRGVmICpUSU1fT0NfSW5pdFN0cnVjdCkKK3sKKyAgRXJyb3JTdGF0dXMgcmVzdWx0ID0gRVJST1I7CisKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBMTF9USU1fQ0hBTk5FTF9DSDE6CisgICAgICByZXN1bHQgPSBPQzFDb25maWcoVElNeCwgVElNX09DX0luaXRTdHJ1Y3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMTF9USU1fQ0hBTk5FTF9DSDI6CisgICAgICByZXN1bHQgPSBPQzJDb25maWcoVElNeCwgVElNX09DX0luaXRTdHJ1Y3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMTF9USU1fQ0hBTk5FTF9DSDM6CisgICAgICByZXN1bHQgPSBPQzNDb25maWcoVElNeCwgVElNX09DX0luaXRTdHJ1Y3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMTF9USU1fQ0hBTk5FTF9DSDQ6CisgICAgICByZXN1bHQgPSBPQzRDb25maWcoVElNeCwgVElNX09DX0luaXRTdHJ1Y3QpOworICAgICAgYnJlYWs7CisjaWYgZGVmaW5lZChUSU1fQ0NFUl9DQzVFKQorICAgIGNhc2UgTExfVElNX0NIQU5ORUxfQ0g1OgorICAgICAgcmVzdWx0ID0gT0M1Q29uZmlnKFRJTXgsIFRJTV9PQ19Jbml0U3RydWN0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTExfVElNX0NIQU5ORUxfQ0g2OgorICAgICAgcmVzdWx0ID0gT0M2Q29uZmlnKFRJTXgsIFRJTV9PQ19Jbml0U3RydWN0KTsKKyAgICAgIGJyZWFrOworI2VuZGlmIC8qIFRJTV9DQ0VSX0NDNUUgKi8KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgZmllbGRzIG9mIHRoZSBUSU14IGlucHV0IGNoYW5uZWwgY29uZmlndXJhdGlvbiBkYXRhCisgICogICAgICAgICBzdHJ1Y3R1cmUgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICogQHBhcmFtICBUSU1fSUNJbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1RJTV9JQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgKHRoZSBpbnB1dCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUpCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX1RJTV9JQ19TdHJ1Y3RJbml0KExMX1RJTV9JQ19Jbml0VHlwZURlZiAqVElNX0lDSW5pdFN0cnVjdCkKK3sKKyAgLyogU2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8KKyAgVElNX0lDSW5pdFN0cnVjdC0+SUNQb2xhcml0eSAgICA9IExMX1RJTV9JQ19QT0xBUklUWV9SSVNJTkc7CisgIFRJTV9JQ0luaXRTdHJ1Y3QtPklDQWN0aXZlSW5wdXQgPSBMTF9USU1fQUNUSVZFSU5QVVRfRElSRUNUVEk7CisgIFRJTV9JQ0luaXRTdHJ1Y3QtPklDUHJlc2NhbGVyICAgPSBMTF9USU1fSUNQU0NfRElWMTsKKyAgVElNX0lDSW5pdFN0cnVjdC0+SUNGaWx0ZXIgICAgICA9IExMX1RJTV9JQ19GSUxURVJfRkRJVjE7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBUSU14IGlucHV0IGNoYW5uZWwuCisgICogQHBhcmFtICBUSU14IFRpbWVyIEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogQHBhcmFtICBUSU1fSUNfSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9USU1fSUNfSW5pdFR5cGVEZWYgc3RydWN0dXJlIChUSU14IGlucHV0IGNoYW5uZWwgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZSkKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVElNeCBvdXRwdXQgY2hhbm5lbCBpcyBpbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IFRJTXggb3V0cHV0IGNoYW5uZWwgaXMgbm90IGluaXRpYWxpemVkCisgICovCitFcnJvclN0YXR1cyBMTF9USU1fSUNfSW5pdChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgTExfVElNX0lDX0luaXRUeXBlRGVmICpUSU1fSUNfSW5pdFN0cnVjdCkKK3sKKyAgRXJyb3JTdGF0dXMgcmVzdWx0ID0gRVJST1I7CisKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBMTF9USU1fQ0hBTk5FTF9DSDE6CisgICAgICByZXN1bHQgPSBJQzFDb25maWcoVElNeCwgVElNX0lDX0luaXRTdHJ1Y3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMTF9USU1fQ0hBTk5FTF9DSDI6CisgICAgICByZXN1bHQgPSBJQzJDb25maWcoVElNeCwgVElNX0lDX0luaXRTdHJ1Y3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMTF9USU1fQ0hBTk5FTF9DSDM6CisgICAgICByZXN1bHQgPSBJQzNDb25maWcoVElNeCwgVElNX0lDX0luaXRTdHJ1Y3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMTF9USU1fQ0hBTk5FTF9DSDQ6CisgICAgICByZXN1bHQgPSBJQzRDb25maWcoVElNeCwgVElNX0lDX0luaXRTdHJ1Y3QpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgICogQGJyaWVmICBGaWxscyBlYWNoIFRJTV9FbmNvZGVySW5pdFN0cnVjdCBmaWVsZCB3aXRoIGl0cyBkZWZhdWx0IHZhbHVlCisgICogQHBhcmFtICBUSU1fRW5jb2RlckluaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVElNX0VOQ09ERVJfSW5pdFR5cGVEZWYgc3RydWN0dXJlIChlbmNvZGVyIGludGVyZmFjZSBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlKQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9USU1fRU5DT0RFUl9TdHJ1Y3RJbml0KExMX1RJTV9FTkNPREVSX0luaXRUeXBlRGVmICpUSU1fRW5jb2RlckluaXRTdHJ1Y3QpCit7CisgIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uICovCisgIFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+RW5jb2Rlck1vZGUgICAgPSBMTF9USU1fRU5DT0RFUk1PREVfWDJfVEkxOworICBUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMVBvbGFyaXR5ICAgID0gTExfVElNX0lDX1BPTEFSSVRZX1JJU0lORzsKKyAgVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzFBY3RpdmVJbnB1dCA9IExMX1RJTV9BQ1RJVkVJTlBVVF9ESVJFQ1RUSTsKKyAgVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzFQcmVzY2FsZXIgICA9IExMX1RJTV9JQ1BTQ19ESVYxOworICBUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMUZpbHRlciAgICAgID0gTExfVElNX0lDX0ZJTFRFUl9GRElWMTsKKyAgVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzJQb2xhcml0eSAgICA9IExMX1RJTV9JQ19QT0xBUklUWV9SSVNJTkc7CisgIFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMyQWN0aXZlSW5wdXQgPSBMTF9USU1fQUNUSVZFSU5QVVRfRElSRUNUVEk7CisgIFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMyUHJlc2NhbGVyICAgPSBMTF9USU1fSUNQU0NfRElWMTsKKyAgVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzJGaWx0ZXIgICAgICA9IExMX1RJTV9JQ19GSUxURVJfRkRJVjE7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBlbmNvZGVyIGludGVyZmFjZSBvZiB0aGUgdGltZXIgaW5zdGFuY2UuCisgICogQHBhcmFtICBUSU14IFRpbWVyIEluc3RhbmNlCisgICogQHBhcmFtICBUSU1fRW5jb2RlckluaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVElNX0VOQ09ERVJfSW5pdFR5cGVEZWYgc3RydWN0dXJlIChUSU14IGVuY29kZXIgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUpCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFRJTXggcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IG5vdCBhcHBsaWNhYmxlCisgICovCitFcnJvclN0YXR1cyBMTF9USU1fRU5DT0RFUl9Jbml0KFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fRU5DT0RFUl9Jbml0VHlwZURlZiAqVElNX0VuY29kZXJJbml0U3RydWN0KQoreworICB1aW50MzJfdCB0bXBjY21yMSA9IDBVOworICB1aW50MzJfdCB0bXBjY2VyID0gMFU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FTkNPREVSX0lOVEVSRkFDRV9JTlNUQU5DRShUSU14KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fRU5DT0RFUk1PREUoVElNX0VuY29kZXJJbml0U3RydWN0LT5FbmNvZGVyTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0lDX1BPTEFSSVRZX0VOQ09ERVIoVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzFQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0FDVElWRUlOUFVUKFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMxQWN0aXZlSW5wdXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9JQ1BTQyhUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMVByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0lDX0ZJTFRFUihUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMUZpbHRlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0lDX1BPTEFSSVRZX0VOQ09ERVIoVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzJQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0FDVElWRUlOUFVUKFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMyQWN0aXZlSW5wdXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9JQ1BTQyhUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMlByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0lDX0ZJTFRFUihUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMkZpbHRlcikpOworCisgIC8qIERpc2FibGUgdGhlIENDMSBhbmQgQ0MyOiBSZXNldCB0aGUgQ0MxRSBhbmQgQ0MyRSBCaXRzICovCisgIFRJTXgtPkNDRVIgJj0gKHVpbnQzMl90KX4oVElNX0NDRVJfQ0MxRSB8IFRJTV9DQ0VSX0NDMkUpOworCisgIC8qIEdldCB0aGUgVElNeCBDQ01SMSByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY21yMSA9IExMX1RJTV9SZWFkUmVnKFRJTXgsIENDTVIxKTsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NFUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY2VyID0gTExfVElNX1JlYWRSZWcoVElNeCwgQ0NFUik7CisKKyAgLyogQ29uZmlndXJlIFRJMSAqLworICB0bXBjY21yMSAmPSAodWludDMyX3QpfihUSU1fQ0NNUjFfQ0MxUyB8IFRJTV9DQ01SMV9JQzFGICB8IFRJTV9DQ01SMV9JQzFQU0MpOworICB0bXBjY21yMSB8PSAodWludDMyX3QpKFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMxQWN0aXZlSW5wdXQgPj4gMTZVKTsKKyAgdG1wY2NtcjEgfD0gKHVpbnQzMl90KShUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMUZpbHRlciA+PiAxNlUpOworICB0bXBjY21yMSB8PSAodWludDMyX3QpKFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMxUHJlc2NhbGVyID4+IDE2VSk7CisKKyAgLyogQ29uZmlndXJlIFRJMiAqLworICB0bXBjY21yMSAmPSAodWludDMyX3QpfihUSU1fQ0NNUjFfQ0MyUyB8IFRJTV9DQ01SMV9JQzJGICB8IFRJTV9DQ01SMV9JQzJQU0MpOworICB0bXBjY21yMSB8PSAodWludDMyX3QpKFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMyQWN0aXZlSW5wdXQgPj4gOFUpOworICB0bXBjY21yMSB8PSAodWludDMyX3QpKFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMyRmlsdGVyID4+IDhVKTsKKyAgdG1wY2NtcjEgfD0gKHVpbnQzMl90KShUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMlByZXNjYWxlciA+PiA4VSk7CisKKyAgLyogU2V0IFRJMSBhbmQgVEkyIHBvbGFyaXR5IGFuZCBlbmFibGUgVEkxIGFuZCBUSTIgKi8KKyAgdG1wY2NlciAmPSAodWludDMyX3QpfihUSU1fQ0NFUl9DQzFQIHwgVElNX0NDRVJfQ0MxTlAgfCBUSU1fQ0NFUl9DQzJQIHwgVElNX0NDRVJfQ0MyTlApOworICB0bXBjY2VyIHw9ICh1aW50MzJfdCkoVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzFQb2xhcml0eSk7CisgIHRtcGNjZXIgfD0gKHVpbnQzMl90KShUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMlBvbGFyaXR5IDw8IDRVKTsKKyAgdG1wY2NlciB8PSAodWludDMyX3QpKFRJTV9DQ0VSX0NDMUUgfCBUSU1fQ0NFUl9DQzJFKTsKKworICAvKiBTZXQgZW5jb2RlciBtb2RlICovCisgIExMX1RJTV9TZXRFbmNvZGVyTW9kZShUSU14LCBUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPkVuY29kZXJNb2RlKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIxICovCisgIExMX1RJTV9Xcml0ZVJlZyhUSU14LCBDQ01SMSwgdG1wY2NtcjEpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiAqLworICBMTF9USU1fV3JpdGVSZWcoVElNeCwgQ0NFUiwgdG1wY2Nlcik7CisKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKKyNpZiBkZWZpbmVkIFRJTV9DUjJfTU1TMgorLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGZpZWxkcyBvZiB0aGUgVElNeCBIYWxsIHNlbnNvciBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBkYXRhCisgICogICAgICAgICBzdHJ1Y3R1cmUgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICogQHBhcmFtICBUSU1fSGFsbFNlbnNvckluaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVElNX0hBTExTRU5TT1JfSW5pdFR5cGVEZWYgc3RydWN0dXJlIChIQUxMIHNlbnNvciBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfVElNX0hBTExTRU5TT1JfU3RydWN0SW5pdChMTF9USU1fSEFMTFNFTlNPUl9Jbml0VHlwZURlZiAqVElNX0hhbGxTZW5zb3JJbml0U3RydWN0KQoreworICAvKiBTZXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiAqLworICBUSU1fSGFsbFNlbnNvckluaXRTdHJ1Y3QtPklDMVBvbGFyaXR5ICAgICAgID0gTExfVElNX0lDX1BPTEFSSVRZX1JJU0lORzsKKyAgVElNX0hhbGxTZW5zb3JJbml0U3RydWN0LT5JQzFQcmVzY2FsZXIgICAgICA9IExMX1RJTV9JQ1BTQ19ESVYxOworICBUSU1fSGFsbFNlbnNvckluaXRTdHJ1Y3QtPklDMUZpbHRlciAgICAgICAgID0gTExfVElNX0lDX0ZJTFRFUl9GRElWMTsKKyAgVElNX0hhbGxTZW5zb3JJbml0U3RydWN0LT5Db21tdXRhdGlvbkRlbGF5ICA9IDBVOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgSGFsbCBzZW5zb3IgaW50ZXJmYWNlIG9mIHRoZSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAbm90ZSBUSU14IENIMSwgQ0gyIGFuZCBDSDMgaW5wdXRzIGNvbm5lY3RlZCB0aHJvdWdoIGEgWE9SCisgICogICAgICAgdG8gdGhlIFRJMSBpbnB1dCBjaGFubmVsCisgICogQG5vdGUgVElNeCBzbGF2ZSBtb2RlIGNvbnRyb2xsZXIgaXMgY29uZmlndXJlZCBpbiByZXNldCBtb2RlLgorICAgICAgICAgIFNlbGVjdGVkIGludGVybmFsIHRyaWdnZXIgaXMgVEkxRl9FRC4KKyAgKiBAbm90ZSBDaGFubmVsIDEgaXMgY29uZmlndXJlZCBhcyBpbnB1dCwgSUMxIGlzIG1hcHBlZCBvbiBUUkMuCisgICogQG5vdGUgQ2FwdHVyZWQgdmFsdWUgc3RvcmVkIGluIFRJTXhfQ0NSMSBjb3JyZXNwb25kIHRvIHRoZSB0aW1lIGVsYXBzZWQKKyAgKiAgICAgICBiZXR3ZWVuIDIgY2hhbmdlcyBvbiB0aGUgaW5wdXRzLiBJdCBnaXZlcyBpbmZvcm1hdGlvbiBhYm91dCBtb3RvciBzcGVlZC4KKyAgKiBAbm90ZSBDaGFubmVsIDIgaXMgY29uZmlndXJlZCBpbiBvdXRwdXQgUFdNIDIgbW9kZS4KKyAgKiBAbm90ZSBDb21wYXJlIHZhbHVlIHN0b3JlZCBpbiBUSU14X0NDUjIgY29ycmVzcG9uZHMgdG8gdGhlIGNvbW11dGF0aW9uIGRlbGF5LgorICAqIEBub3RlIE9DMlJFRiBpcyBzZWxlY3RlZCBhcyB0cmlnZ2VyIG91dHB1dCBvbiBUUkdPLgorICAqIEBub3RlIExMX1RJTV9JQ19QT0xBUklUWV9CT1RIRURHRSBtdXN0IG5vdCBiZSB1c2VkIGZvciBUSTEgd2hlbiBpdCBpcyB1c2VkCisgICogICAgICAgd2hlbiBUSU14IG9wZXJhdGVzIGluIEhhbGwgc2Vuc29yIGludGVyZmFjZSBtb2RlLgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBJbnN0YW5jZQorICAqIEBwYXJhbSAgVElNX0hhbGxTZW5zb3JJbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1RJTV9IQUxMU0VOU09SX0luaXRUeXBlRGVmIHN0cnVjdHVyZSAoVElNeCBIQUxMIHNlbnNvciBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZSkKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVElNeCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1RJTV9IQUxMU0VOU09SX0luaXQoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9IQUxMU0VOU09SX0luaXRUeXBlRGVmICpUSU1fSGFsbFNlbnNvckluaXRTdHJ1Y3QpCit7CisgIHVpbnQzMl90IHRtcGNyMiA9IDBVOworICB1aW50MzJfdCB0bXBjY21yMSA9IDBVOworICB1aW50MzJfdCB0bXBjY2VyID0gMFU7CisgIHVpbnQzMl90IHRtcHNtY3IgPSAwVTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0hBTExfU0VOU09SX0lOVEVSRkFDRV9JTlNUQU5DRShUSU14KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fSUNfUE9MQVJJVFlfRU5DT0RFUihUSU1fSGFsbFNlbnNvckluaXRTdHJ1Y3QtPklDMVBvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fSUNQU0MoVElNX0hhbGxTZW5zb3JJbml0U3RydWN0LT5JQzFQcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9JQ19GSUxURVIoVElNX0hhbGxTZW5zb3JJbml0U3RydWN0LT5JQzFGaWx0ZXIpKTsKKworICAvKiBEaXNhYmxlIHRoZSBDQzEgYW5kIENDMjogUmVzZXQgdGhlIENDMUUgYW5kIENDMkUgQml0cyAqLworICBUSU14LT5DQ0VSICY9ICh1aW50MzJfdCl+KFRJTV9DQ0VSX0NDMUUgfCBUSU1fQ0NFUl9DQzJFKTsKKworICAvKiBHZXQgdGhlIFRJTXggQ1IyIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNyMiA9IExMX1RJTV9SZWFkUmVnKFRJTXgsIENSMik7CisKKyAgLyogR2V0IHRoZSBUSU14IENDTVIxIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjbXIxID0gTExfVElNX1JlYWRSZWcoVElNeCwgQ0NNUjEpOworCisgIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjZXIgPSBMTF9USU1fUmVhZFJlZyhUSU14LCBDQ0VSKTsKKworICAvKiBHZXQgdGhlIFRJTXggU01DUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBzbWNyID0gTExfVElNX1JlYWRSZWcoVElNeCwgU01DUik7CisKKyAgLyogQ29ubmVjdCBUSU14X0NIMSwgQ0gyIGFuZCBDSDMgcGlucyB0byB0aGUgVEkxIGlucHV0ICovCisgIHRtcGNyMiB8PSBUSU1fQ1IyX1RJMVM7CisKKyAgLyogT0MyUkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IChUUkdPKSAqLworICB0bXBjcjIgfD0gTExfVElNX1RSR09fT0MyUkVGOworCisgIC8qIENvbmZpZ3VyZSB0aGUgc2xhdmUgbW9kZSBjb250cm9sbGVyICovCisgIHRtcHNtY3IgJj0gKHVpbnQzMl90KX4oVElNX1NNQ1JfVFMgfCBUSU1fU01DUl9TTVMpOworICB0bXBzbWNyIHw9IExMX1RJTV9UU19USTFGX0VEOworICB0bXBzbWNyIHw9IExMX1RJTV9TTEFWRU1PREVfUkVTRVQ7CisKKyAgLyogQ29uZmlndXJlIGlucHV0IGNoYW5uZWwgMSAqLworICB0bXBjY21yMSAmPSAodWludDMyX3QpfihUSU1fQ0NNUjFfQ0MxUyB8IFRJTV9DQ01SMV9JQzFGICB8IFRJTV9DQ01SMV9JQzFQU0MpOworICB0bXBjY21yMSB8PSAodWludDMyX3QpKExMX1RJTV9BQ1RJVkVJTlBVVF9UUkMgPj4gMTZVKTsKKyAgdG1wY2NtcjEgfD0gKHVpbnQzMl90KShUSU1fSGFsbFNlbnNvckluaXRTdHJ1Y3QtPklDMUZpbHRlciA+PiAxNlUpOworICB0bXBjY21yMSB8PSAodWludDMyX3QpKFRJTV9IYWxsU2Vuc29ySW5pdFN0cnVjdC0+SUMxUHJlc2NhbGVyID4+IDE2VSk7CisKKyAgLyogQ29uZmlndXJlIGlucHV0IGNoYW5uZWwgMiAqLworICB0bXBjY21yMSAmPSAodWludDMyX3QpfihUSU1fQ0NNUjFfT0MyTSB8IFRJTV9DQ01SMV9PQzJGRSAgfCBUSU1fQ0NNUjFfT0MyUEUgIHwgVElNX0NDTVIxX09DMkNFKTsKKyAgdG1wY2NtcjEgfD0gKHVpbnQzMl90KShMTF9USU1fT0NNT0RFX1BXTTIgPDwgOFUpOworCisgIC8qIFNldCBDaGFubmVsIDEgcG9sYXJpdHkgYW5kIGVuYWJsZSBDaGFubmVsIDEgYW5kIENoYW5uZWwyICovCisgIHRtcGNjZXIgJj0gKHVpbnQzMl90KX4oVElNX0NDRVJfQ0MxUCB8IFRJTV9DQ0VSX0NDMU5QIHwgVElNX0NDRVJfQ0MyUCB8IFRJTV9DQ0VSX0NDMk5QKTsKKyAgdG1wY2NlciB8PSAodWludDMyX3QpKFRJTV9IYWxsU2Vuc29ySW5pdFN0cnVjdC0+SUMxUG9sYXJpdHkpOworICB0bXBjY2VyIHw9ICh1aW50MzJfdCkoVElNX0NDRVJfQ0MxRSB8IFRJTV9DQ0VSX0NDMkUpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ1IyICovCisgIExMX1RJTV9Xcml0ZVJlZyhUSU14LCBDUjIsIHRtcGNyMik7CisKKyAgLyogV3JpdGUgdG8gVElNeCBTTUNSICovCisgIExMX1RJTV9Xcml0ZVJlZyhUSU14LCBTTUNSLCB0bXBzbWNyKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIxICovCisgIExMX1RJTV9Xcml0ZVJlZyhUSU14LCBDQ01SMSwgdG1wY2NtcjEpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiAqLworICBMTF9USU1fV3JpdGVSZWcoVElNeCwgQ0NFUiwgdG1wY2Nlcik7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ1IyICovCisgIExMX1RJTV9PQ19TZXRDb21wYXJlQ0gyKFRJTXgsIFRJTV9IYWxsU2Vuc29ySW5pdFN0cnVjdC0+Q29tbXV0YXRpb25EZWxheSk7CisKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisjZW5kaWYgLyogVElNX0NSMl9NTVMyICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBmaWVsZHMgb2YgdGhlIEJyZWFrIGFuZCBEZWFkIFRpbWUgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZQorICAqICAgICAgICAgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICogQHBhcmFtICBUSU1fQkRUUkluaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVElNX0JEVFJfSW5pdFR5cGVEZWYgc3RydWN0dXJlIChCcmVhayBhbmQgRGVhZCBUaW1lIGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUpCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX1RJTV9CRFRSX1N0cnVjdEluaXQoTExfVElNX0JEVFJfSW5pdFR5cGVEZWYgKlRJTV9CRFRSSW5pdFN0cnVjdCkKK3sKKyAgLyogU2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8KKyAgVElNX0JEVFJJbml0U3RydWN0LT5PU1NSU3RhdGUgICAgICAgPSBMTF9USU1fT1NTUl9ESVNBQkxFOworICBUSU1fQkRUUkluaXRTdHJ1Y3QtPk9TU0lTdGF0ZSAgICAgICA9IExMX1RJTV9PU1NJX0RJU0FCTEU7CisgIFRJTV9CRFRSSW5pdFN0cnVjdC0+TG9ja0xldmVsICAgICAgID0gTExfVElNX0xPQ0tMRVZFTF9PRkY7CisgIFRJTV9CRFRSSW5pdFN0cnVjdC0+RGVhZFRpbWUgICAgICAgID0gKHVpbnQ4X3QpMHgwMFU7CisgIFRJTV9CRFRSSW5pdFN0cnVjdC0+QnJlYWtTdGF0ZSAgICAgID0gTExfVElNX0JSRUFLX0RJU0FCTEU7CisgIFRJTV9CRFRSSW5pdFN0cnVjdC0+QnJlYWtQb2xhcml0eSAgID0gTExfVElNX0JSRUFLX1BPTEFSSVRZX0xPVzsKKyNpZiBkZWZpbmVkKFRJTV9CRFRSX0JLRikKKyAgVElNX0JEVFJJbml0U3RydWN0LT5CcmVha0ZpbHRlciAgICAgPSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxOworI2VuZGlmIC8qIFRJTV9CRFRSX0JLRiAqLworI2lmIGRlZmluZWQoVElNX0JEVFJfQksyRSkKKyAgVElNX0JEVFJJbml0U3RydWN0LT5CcmVhazJTdGF0ZSAgICAgPSBMTF9USU1fQlJFQUsyX0RJU0FCTEU7CisgIFRJTV9CRFRSSW5pdFN0cnVjdC0+QnJlYWsyUG9sYXJpdHkgID0gTExfVElNX0JSRUFLMl9QT0xBUklUWV9MT1c7CisgIFRJTV9CRFRSSW5pdFN0cnVjdC0+QnJlYWsyRmlsdGVyICAgID0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjE7CisjZW5kaWYgLyogVElNX0JEVFJfQksyRSAqLworICBUSU1fQkRUUkluaXRTdHJ1Y3QtPkF1dG9tYXRpY091dHB1dCA9IExMX1RJTV9BVVRPTUFUSUNPVVRQVVRfRElTQUJMRTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIEJyZWFrIGFuZCBEZWFkIFRpbWUgZmVhdHVyZSBvZiB0aGUgdGltZXIgaW5zdGFuY2UuCisgICogQG5vdGUgQXMgdGhlIGJpdHMgQksyUCwgQksyRSwgQksyRlszOjBdLCBCS0ZbMzowXSwgQU9FLCBCS1AsIEJLRSwgT1NTSSwgT1NTUgorICAqICBhbmQgRFRHWzc6MF0gY2FuIGJlIHdyaXRlLWxvY2tlZCBkZXBlbmRpbmcgb24gdGhlIExPQ0sgY29uZmlndXJhdGlvbiwgaXQKKyAgKiAgY2FuIGJlIG5lY2Vzc2FyeSB0byBjb25maWd1cmUgYWxsIG9mIHRoZW0gZHVyaW5nIHRoZSBmaXJzdCB3cml0ZSBhY2Nlc3MgdG8KKyAgKiAgdGhlIFRJTXhfQkRUUiByZWdpc3Rlci4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBicmVhayBpbnB1dC4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9CS0lOMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBzZWNvbmQgYnJlYWsgaW5wdXQuCisgICogQHBhcmFtICBUSU14IFRpbWVyIEluc3RhbmNlCisgICogQHBhcmFtICBUSU1fQkRUUkluaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVElNX0JEVFJfSW5pdFR5cGVEZWYgc3RydWN0dXJlKEJyZWFrIGFuZCBEZWFkIFRpbWUgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZSkKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogQnJlYWsgYW5kIERlYWQgVGltZSBpcyBpbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IG5vdCBhcHBsaWNhYmxlCisgICovCitFcnJvclN0YXR1cyBMTF9USU1fQkRUUl9Jbml0KFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fQkRUUl9Jbml0VHlwZURlZiAqVElNX0JEVFJJbml0U3RydWN0KQoreworICB1aW50MzJfdCB0bXBiZHRyID0gMDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PU1NSX1NUQVRFKFRJTV9CRFRSSW5pdFN0cnVjdC0+T1NTUlN0YXRlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT1NTSV9TVEFURShUSU1fQkRUUkluaXRTdHJ1Y3QtPk9TU0lTdGF0ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0xPQ0tfTEVWRUwoVElNX0JEVFJJbml0U3RydWN0LT5Mb2NrTGV2ZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9CUkVBS19TVEFURShUSU1fQkRUUkluaXRTdHJ1Y3QtPkJyZWFrU3RhdGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9CUkVBS19QT0xBUklUWShUSU1fQkRUUkluaXRTdHJ1Y3QtPkJyZWFrUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9BVVRPTUFUSUNfT1VUUFVUX1NUQVRFKFRJTV9CRFRSSW5pdFN0cnVjdC0+QXV0b21hdGljT3V0cHV0KSk7CisKKyAgLyogU2V0IHRoZSBMb2NrIGxldmVsLCB0aGUgQnJlYWsgZW5hYmxlIEJpdCBhbmQgdGhlIFBvbGFyaXR5LCB0aGUgT1NTUiBTdGF0ZSwKKyAgdGhlIE9TU0kgU3RhdGUsIHRoZSBkZWFkIHRpbWUgdmFsdWUgYW5kIHRoZSBBdXRvbWF0aWMgT3V0cHV0IEVuYWJsZSBCaXQgKi8KKworICAvKiBTZXQgdGhlIEJEVFIgYml0cyAqLworICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX0RURywgVElNX0JEVFJJbml0U3RydWN0LT5EZWFkVGltZSk7CisgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfTE9DSywgVElNX0JEVFJJbml0U3RydWN0LT5Mb2NrTGV2ZWwpOworICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX09TU0ksIFRJTV9CRFRSSW5pdFN0cnVjdC0+T1NTSVN0YXRlKTsKKyAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9PU1NSLCBUSU1fQkRUUkluaXRTdHJ1Y3QtPk9TU1JTdGF0ZSk7CisgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfQktFLCBUSU1fQkRUUkluaXRTdHJ1Y3QtPkJyZWFrU3RhdGUpOworICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX0JLUCwgVElNX0JEVFJJbml0U3RydWN0LT5CcmVha1BvbGFyaXR5KTsKKyAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9BT0UsIFRJTV9CRFRSSW5pdFN0cnVjdC0+QXV0b21hdGljT3V0cHV0KTsKKyAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9NT0UsIFRJTV9CRFRSSW5pdFN0cnVjdC0+QXV0b21hdGljT3V0cHV0KTsKKyNpZiBkZWZpbmVkKFRJTV9CRFRSX0JLRikKKyAgaWYgKElTX1RJTV9BRFZBTkNFRF9JTlNUQU5DRShUSU14KSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19MTF9USU1fQlJFQUtfRklMVEVSKFRJTV9CRFRSSW5pdFN0cnVjdC0+QnJlYWtGaWx0ZXIpKTsKKyAgICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX0JLRiwgVElNX0JEVFJJbml0U3RydWN0LT5CcmVha0ZpbHRlcik7CisgIH0KKyNlbmRpZiAvKiBUSU1fQkRUUl9CS0YgKi8KKyNpZiBkZWZpbmVkKFRJTV9CRFRSX0JLMkUpCisKKyAgaWYgKElTX1RJTV9CS0lOMl9JTlNUQU5DRShUSU14KSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19MTF9USU1fQlJFQUsyX1NUQVRFKFRJTV9CRFRSSW5pdFN0cnVjdC0+QnJlYWsyU3RhdGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0JSRUFLMl9QT0xBUklUWShUSU1fQkRUUkluaXRTdHJ1Y3QtPkJyZWFrMlBvbGFyaXR5KSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9CUkVBSzJfRklMVEVSKFRJTV9CRFRSSW5pdFN0cnVjdC0+QnJlYWsyRmlsdGVyKSk7CisKKyAgICAvKiBTZXQgdGhlIEJSRUFLMiBpbnB1dCByZWxhdGVkIEJEVFIgYml0LWZpZWxkcyAqLworICAgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfQksyRiwgKFRJTV9CRFRSSW5pdFN0cnVjdC0+QnJlYWsyRmlsdGVyKSk7CisgICAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9CSzJFLCBUSU1fQkRUUkluaXRTdHJ1Y3QtPkJyZWFrMlN0YXRlKTsKKyAgICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX0JLMlAsIFRJTV9CRFRSSW5pdFN0cnVjdC0+QnJlYWsyUG9sYXJpdHkpOworICB9CisjZW5kaWYgLyogVElNX0JEVFJfQksyRSAqLworCisgIC8qIFNldCBUSU14X0JEVFIgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIEJEVFIsIHRtcGJkdHIpOworCisgIHJldHVybiBTVUNDRVNTOworfQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTV9MTF9Qcml2YXRlX0Z1bmN0aW9ucyBUSU0gUHJpdmF0ZSBGdW5jdGlvbnMKKyAqICBAYnJpZWYgICBQcml2YXRlIGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVElNeCBvdXRwdXQgY2hhbm5lbCAxLgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBJbnN0YW5jZQorICAqIEBwYXJhbSAgVElNX09DSW5pdFN0cnVjdCBwb2ludGVyIHRvIHRoZSB0aGUgVElNeCBvdXRwdXQgY2hhbm5lbCAxIGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVElNeCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK3N0YXRpYyBFcnJvclN0YXR1cyBPQzFDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9PQ19Jbml0VHlwZURlZiAqVElNX09DSW5pdFN0cnVjdCkKK3sKKyAgdWludDMyX3QgdG1wY2NtcjEgPSAwVTsKKyAgdWludDMyX3QgdG1wY2NlciA9IDBVOworICB1aW50MzJfdCB0bXBjcjIgPSAwVTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMV9JTlNUQU5DRShUSU14KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NNT0RFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NTdGF0ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DUE9MQVJJVFkoVElNX09DSW5pdFN0cnVjdC0+T0NQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NOU3RhdGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ1BPTEFSSVRZKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTlBvbGFyaXR5KSk7CisKKyAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAxOiBSZXNldCB0aGUgQ0MxRSBCaXQgKi8KKyAgQ0xFQVJfQklUKFRJTXgtPkNDRVIsIFRJTV9DQ0VSX0NDMUUpOworCisgIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjZXIgPSBMTF9USU1fUmVhZFJlZyhUSU14LCBDQ0VSKTsKKworICAvKiBHZXQgdGhlIFRJTXggQ1IyIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNyMiA9IExMX1RJTV9SZWFkUmVnKFRJTXgsIENSMik7CisKKyAgLyogR2V0IHRoZSBUSU14IENDTVIxIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjbXIxID0gTExfVElNX1JlYWRSZWcoVElNeCwgQ0NNUjEpOworCisgIC8qIFJlc2V0IENhcHR1cmUvQ29tcGFyZSBzZWxlY3Rpb24gQml0cyAqLworICBDTEVBUl9CSVQodG1wY2NtcjEsIFRJTV9DQ01SMV9DQzFTKTsKKworICAvKiBTZXQgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8KKyAgTU9ESUZZX1JFRyh0bXBjY21yMSwgVElNX0NDTVIxX09DMU0sIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTW9kZSk7CisKKyAgLyogU2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBQb2xhcml0eSAqLworICBNT0RJRllfUkVHKHRtcGNjZXIsIFRJTV9DQ0VSX0NDMVAsIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DUG9sYXJpdHkpOworCisgIC8qIFNldCB0aGUgT3V0cHV0IFN0YXRlICovCisgIE1PRElGWV9SRUcodG1wY2NlciwgVElNX0NDRVJfQ0MxRSwgVElNX09DSW5pdFN0cnVjdC0+T0NTdGF0ZSk7CisKKyAgaWYgKElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NJRExFU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NOSWRsZVN0YXRlKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ0lETEVTVEFURShUSU1fT0NJbml0U3RydWN0LT5PQ0lkbGVTdGF0ZSkpOworCisgICAgLyogU2V0IHRoZSBjb21wbGVtZW50YXJ5IG91dHB1dCBQb2xhcml0eSAqLworICAgIE1PRElGWV9SRUcodG1wY2NlciwgVElNX0NDRVJfQ0MxTlAsIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTlBvbGFyaXR5IDw8IDJVKTsKKworICAgIC8qIFNldCB0aGUgY29tcGxlbWVudGFyeSBvdXRwdXQgU3RhdGUgKi8KKyAgICBNT0RJRllfUkVHKHRtcGNjZXIsIFRJTV9DQ0VSX0NDMU5FLCBUSU1fT0NJbml0U3RydWN0LT5PQ05TdGF0ZSA8PCAyVSk7CisKKyAgICAvKiBTZXQgdGhlIE91dHB1dCBJZGxlIHN0YXRlICovCisgICAgTU9ESUZZX1JFRyh0bXBjcjIsIFRJTV9DUjJfT0lTMSwgVElNX09DSW5pdFN0cnVjdC0+T0NJZGxlU3RhdGUpOworCisgICAgLyogU2V0IHRoZSBjb21wbGVtZW50YXJ5IG91dHB1dCBJZGxlIHN0YXRlICovCisgICAgTU9ESUZZX1JFRyh0bXBjcjIsIFRJTV9DUjJfT0lTMU4sIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTklkbGVTdGF0ZSA8PCAxVSk7CisgIH0KKworICAvKiBXcml0ZSB0byBUSU14IENSMiAqLworICBMTF9USU1fV3JpdGVSZWcoVElNeCwgQ1IyLCB0bXBjcjIpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENDTVIxLCB0bXBjY21yMSk7CisKKyAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgKi8KKyAgTExfVElNX09DX1NldENvbXBhcmVDSDEoVElNeCwgVElNX09DSW5pdFN0cnVjdC0+Q29tcGFyZVZhbHVlKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENDRVIsIHRtcGNjZXIpOworCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVElNeCBvdXRwdXQgY2hhbm5lbCAyLgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBJbnN0YW5jZQorICAqIEBwYXJhbSAgVElNX09DSW5pdFN0cnVjdCBwb2ludGVyIHRvIHRoZSB0aGUgVElNeCBvdXRwdXQgY2hhbm5lbCAyIGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVElNeCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK3N0YXRpYyBFcnJvclN0YXR1cyBPQzJDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9PQ19Jbml0VHlwZURlZiAqVElNX09DSW5pdFN0cnVjdCkKK3sKKyAgdWludDMyX3QgdG1wY2NtcjEgPSAwVTsKKyAgdWludDMyX3QgdG1wY2NlciA9IDBVOworICB1aW50MzJfdCB0bXBjcjIgPSAwVTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMl9JTlNUQU5DRShUSU14KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NNT0RFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NTdGF0ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DUE9MQVJJVFkoVElNX09DSW5pdFN0cnVjdC0+T0NQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NOU3RhdGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ1BPTEFSSVRZKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTlBvbGFyaXR5KSk7CisKKyAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAyOiBSZXNldCB0aGUgQ0MyRSBCaXQgKi8KKyAgQ0xFQVJfQklUKFRJTXgtPkNDRVIsIFRJTV9DQ0VSX0NDMkUpOworCisgIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjZXIgPSAgTExfVElNX1JlYWRSZWcoVElNeCwgQ0NFUik7CisKKyAgLyogR2V0IHRoZSBUSU14IENSMiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjcjIgPSBMTF9USU1fUmVhZFJlZyhUSU14LCBDUjIpOworCisgIC8qIEdldCB0aGUgVElNeCBDQ01SMSByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY21yMSA9IExMX1RJTV9SZWFkUmVnKFRJTXgsIENDTVIxKTsKKworICAvKiBSZXNldCBDYXB0dXJlL0NvbXBhcmUgc2VsZWN0aW9uIEJpdHMgKi8KKyAgQ0xFQVJfQklUKHRtcGNjbXIxLCBUSU1fQ0NNUjFfQ0MyUyk7CisKKyAgLyogU2VsZWN0IHRoZSBPdXRwdXQgQ29tcGFyZSBNb2RlICovCisgIE1PRElGWV9SRUcodG1wY2NtcjEsIFRJTV9DQ01SMV9PQzJNLCBUSU1fT0NJbml0U3RydWN0LT5PQ01vZGUgPDwgOFUpOworCisgIC8qIFNldCB0aGUgT3V0cHV0IENvbXBhcmUgUG9sYXJpdHkgKi8KKyAgTU9ESUZZX1JFRyh0bXBjY2VyLCBUSU1fQ0NFUl9DQzJQLCBUSU1fT0NJbml0U3RydWN0LT5PQ1BvbGFyaXR5IDw8IDRVKTsKKworICAvKiBTZXQgdGhlIE91dHB1dCBTdGF0ZSAqLworICBNT0RJRllfUkVHKHRtcGNjZXIsIFRJTV9DQ0VSX0NDMkUsIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DU3RhdGUgPDwgNFUpOworCisgIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DSURMRVNUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTklkbGVTdGF0ZSkpOworICAgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NJRExFU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NJZGxlU3RhdGUpKTsKKworICAgIC8qIFNldCB0aGUgY29tcGxlbWVudGFyeSBvdXRwdXQgUG9sYXJpdHkgKi8KKyAgICBNT0RJRllfUkVHKHRtcGNjZXIsIFRJTV9DQ0VSX0NDMk5QLCBUSU1fT0NJbml0U3RydWN0LT5PQ05Qb2xhcml0eSA8PCA2VSk7CisKKyAgICAvKiBTZXQgdGhlIGNvbXBsZW1lbnRhcnkgb3V0cHV0IFN0YXRlICovCisgICAgTU9ESUZZX1JFRyh0bXBjY2VyLCBUSU1fQ0NFUl9DQzJORSwgVElNX09DSW5pdFN0cnVjdC0+T0NOU3RhdGUgPDwgNlUpOworCisgICAgLyogU2V0IHRoZSBPdXRwdXQgSWRsZSBzdGF0ZSAqLworICAgIE1PRElGWV9SRUcodG1wY3IyLCBUSU1fQ1IyX09JUzIsIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DSWRsZVN0YXRlIDw8IDJVKTsKKworI2lmIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpCisjZWxzZQorICAgIC8qIFNldCB0aGUgY29tcGxlbWVudGFyeSBvdXRwdXQgSWRsZSBzdGF0ZSAqLworICAgIE1PRElGWV9SRUcodG1wY3IyLCBUSU1fQ1IyX09JUzJOLCBUSU1fT0NJbml0U3RydWN0LT5PQ05JZGxlU3RhdGUgPDwgM1UpOworI2VuZGlmCisgIH0KKworICAvKiBXcml0ZSB0byBUSU14IENSMiAqLworICBMTF9USU1fV3JpdGVSZWcoVElNeCwgQ1IyLCB0bXBjcjIpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENDTVIxLCB0bXBjY21yMSk7CisKKyAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgKi8KKyAgTExfVElNX09DX1NldENvbXBhcmVDSDIoVElNeCwgVElNX09DSW5pdFN0cnVjdC0+Q29tcGFyZVZhbHVlKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENDRVIsIHRtcGNjZXIpOworCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVElNeCBvdXRwdXQgY2hhbm5lbCAzLgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBJbnN0YW5jZQorICAqIEBwYXJhbSAgVElNX09DSW5pdFN0cnVjdCBwb2ludGVyIHRvIHRoZSB0aGUgVElNeCBvdXRwdXQgY2hhbm5lbCAzIGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVElNeCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK3N0YXRpYyBFcnJvclN0YXR1cyBPQzNDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9PQ19Jbml0VHlwZURlZiAqVElNX09DSW5pdFN0cnVjdCkKK3sKKyAgdWludDMyX3QgdG1wY2NtcjIgPSAwVTsKKyAgdWludDMyX3QgdG1wY2NlciA9IDBVOworICB1aW50MzJfdCB0bXBjcjIgPSAwVTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDM19JTlNUQU5DRShUSU14KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NNT0RFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NTdGF0ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DUE9MQVJJVFkoVElNX09DSW5pdFN0cnVjdC0+T0NQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NOU3RhdGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ1BPTEFSSVRZKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTlBvbGFyaXR5KSk7CisKKyAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAzOiBSZXNldCB0aGUgQ0MzRSBCaXQgKi8KKyAgQ0xFQVJfQklUKFRJTXgtPkNDRVIsIFRJTV9DQ0VSX0NDM0UpOworCisgIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjZXIgPSAgTExfVElNX1JlYWRSZWcoVElNeCwgQ0NFUik7CisKKyAgLyogR2V0IHRoZSBUSU14IENSMiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjcjIgPSBMTF9USU1fUmVhZFJlZyhUSU14LCBDUjIpOworCisgIC8qIEdldCB0aGUgVElNeCBDQ01SMiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY21yMiA9IExMX1RJTV9SZWFkUmVnKFRJTXgsIENDTVIyKTsKKworICAvKiBSZXNldCBDYXB0dXJlL0NvbXBhcmUgc2VsZWN0aW9uIEJpdHMgKi8KKyAgQ0xFQVJfQklUKHRtcGNjbXIyLCBUSU1fQ0NNUjJfQ0MzUyk7CisKKyAgLyogU2VsZWN0IHRoZSBPdXRwdXQgQ29tcGFyZSBNb2RlICovCisgIE1PRElGWV9SRUcodG1wY2NtcjIsIFRJTV9DQ01SMl9PQzNNLCBUSU1fT0NJbml0U3RydWN0LT5PQ01vZGUpOworCisgIC8qIFNldCB0aGUgT3V0cHV0IENvbXBhcmUgUG9sYXJpdHkgKi8KKyAgTU9ESUZZX1JFRyh0bXBjY2VyLCBUSU1fQ0NFUl9DQzNQLCBUSU1fT0NJbml0U3RydWN0LT5PQ1BvbGFyaXR5IDw8IDhVKTsKKworICAvKiBTZXQgdGhlIE91dHB1dCBTdGF0ZSAqLworICBNT0RJRllfUkVHKHRtcGNjZXIsIFRJTV9DQ0VSX0NDM0UsIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DU3RhdGUgPDwgOFUpOworCisgIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DSURMRVNUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTklkbGVTdGF0ZSkpOworICAgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NJRExFU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NJZGxlU3RhdGUpKTsKKworICAgIC8qIFNldCB0aGUgY29tcGxlbWVudGFyeSBvdXRwdXQgUG9sYXJpdHkgKi8KKyAgICBNT0RJRllfUkVHKHRtcGNjZXIsIFRJTV9DQ0VSX0NDM05QLCBUSU1fT0NJbml0U3RydWN0LT5PQ05Qb2xhcml0eSA8PCAxMFUpOworCisgICAgLyogU2V0IHRoZSBjb21wbGVtZW50YXJ5IG91dHB1dCBTdGF0ZSAqLworICAgIE1PRElGWV9SRUcodG1wY2NlciwgVElNX0NDRVJfQ0MzTkUsIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTlN0YXRlIDw8IDEwVSk7CisKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorI2Vsc2UKKyAgICAvKiBTZXQgdGhlIE91dHB1dCBJZGxlIHN0YXRlICovCisgICAgTU9ESUZZX1JFRyh0bXBjcjIsIFRJTV9DUjJfT0lTMywgVElNX09DSW5pdFN0cnVjdC0+T0NJZGxlU3RhdGUgPDwgNFUpOworCisgICAgLyogU2V0IHRoZSBjb21wbGVtZW50YXJ5IG91dHB1dCBJZGxlIHN0YXRlICovCisgICAgTU9ESUZZX1JFRyh0bXBjcjIsIFRJTV9DUjJfT0lTM04sIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTklkbGVTdGF0ZSA8PCA1VSk7CisjZW5kaWYKKyAgfQorCisgIC8qIFdyaXRlIHRvIFRJTXggQ1IyICovCisgIExMX1RJTV9Xcml0ZVJlZyhUSU14LCBDUjIsIHRtcGNyMik7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ01SMiAqLworICBMTF9USU1fV3JpdGVSZWcoVElNeCwgQ0NNUjIsIHRtcGNjbXIyKTsKKworICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSAqLworICBMTF9USU1fT0NfU2V0Q29tcGFyZUNIMyhUSU14LCBUSU1fT0NJbml0U3RydWN0LT5Db21wYXJlVmFsdWUpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiAqLworICBMTF9USU1fV3JpdGVSZWcoVElNeCwgQ0NFUiwgdG1wY2Nlcik7CisKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBUSU14IG91dHB1dCBjaGFubmVsIDQuCisgICogQHBhcmFtICBUSU14IFRpbWVyIEluc3RhbmNlCisgICogQHBhcmFtICBUSU1fT0NJbml0U3RydWN0IHBvaW50ZXIgdG8gdGhlIHRoZSBUSU14IG91dHB1dCBjaGFubmVsIDQgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBUSU14IHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBub3QgYXBwbGljYWJsZQorICAqLworc3RhdGljIEVycm9yU3RhdHVzIE9DNENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX09DX0luaXRUeXBlRGVmICpUSU1fT0NJbml0U3RydWN0KQoreworICB1aW50MzJfdCB0bXBjY21yMiA9IDBVOworICB1aW50MzJfdCB0bXBjY2VyID0gMFU7CisgIHVpbnQzMl90IHRtcGNyMiA9IDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0M0X0lOU1RBTkNFKFRJTXgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ01PREUoVElNX09DSW5pdFN0cnVjdC0+T0NNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NTVEFURShUSU1fT0NJbml0U3RydWN0LT5PQ1N0YXRlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NQT0xBUklUWShUSU1fT0NJbml0U3RydWN0LT5PQ1BvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NQT0xBUklUWShUSU1fT0NJbml0U3RydWN0LT5PQ05Qb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NOU3RhdGUpKTsKKworICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDQ6IFJlc2V0IHRoZSBDQzRFIEJpdCAqLworICBDTEVBUl9CSVQoVElNeC0+Q0NFUiwgVElNX0NDRVJfQ0M0RSk7CisKKyAgLyogR2V0IHRoZSBUSU14IENDRVIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NlciA9IExMX1RJTV9SZWFkUmVnKFRJTXgsIENDRVIpOworCisgIC8qIEdldCB0aGUgVElNeCBDUjIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY3IyID0gIExMX1RJTV9SZWFkUmVnKFRJTXgsIENSMik7CisKKyAgLyogR2V0IHRoZSBUSU14IENDTVIyIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjbXIyID0gTExfVElNX1JlYWRSZWcoVElNeCwgQ0NNUjIpOworCisgIC8qIFJlc2V0IENhcHR1cmUvQ29tcGFyZSBzZWxlY3Rpb24gQml0cyAqLworICBDTEVBUl9CSVQodG1wY2NtcjIsIFRJTV9DQ01SMl9DQzRTKTsKKworICAvKiBTZWxlY3QgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8KKyAgTU9ESUZZX1JFRyh0bXBjY21yMiwgVElNX0NDTVIyX09DNE0sIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTW9kZSA8PCA4VSk7CisKKyAgLyogU2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBQb2xhcml0eSAqLworICBNT0RJRllfUkVHKHRtcGNjZXIsIFRJTV9DQ0VSX0NDNFAsIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DUG9sYXJpdHkgPDwgMTJVKTsKKworICAvKiBTZXQgdGhlIE91dHB1dCBTdGF0ZSAqLworICBNT0RJRllfUkVHKHRtcGNjZXIsIFRJTV9DQ0VSX0NDNEUsIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DU3RhdGUgPDwgMTJVKTsKKworICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ0lETEVTVEFURShUSU1fT0NJbml0U3RydWN0LT5PQ05JZGxlU3RhdGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DSURMRVNUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DSWRsZVN0YXRlKSk7CisKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorI2Vsc2UKKyAgICAvKiBTZXQgdGhlIE91dHB1dCBJZGxlIHN0YXRlICovCisgICAgTU9ESUZZX1JFRyh0bXBjcjIsIFRJTV9DUjJfT0lTNCwgVElNX09DSW5pdFN0cnVjdC0+T0NJZGxlU3RhdGUgPDwgNlUpOworI2VuZGlmCisgIH0KKworICAvKiBXcml0ZSB0byBUSU14IENSMiAqLworICBMTF9USU1fV3JpdGVSZWcoVElNeCwgQ1IyLCB0bXBjcjIpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjIgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENDTVIyLCB0bXBjY21yMik7CisKKyAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgKi8KKyAgTExfVElNX09DX1NldENvbXBhcmVDSDQoVElNeCwgVElNX09DSW5pdFN0cnVjdC0+Q29tcGFyZVZhbHVlKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENDRVIsIHRtcGNjZXIpOworCisgIHJldHVybiBTVUNDRVNTOworfQorCisjaWYgZGVmaW5lZChUSU1fQ0NFUl9DQzVFKQorLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJTXggb3V0cHV0IGNoYW5uZWwgNS4KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRJTV9PQ0luaXRTdHJ1Y3QgcG9pbnRlciB0byB0aGUgdGhlIFRJTXggb3V0cHV0IGNoYW5uZWwgNSBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlCisgICogQG5vdGUgICBPQzUgaXMgbm90IGF2YWlsYWJsZSBmb3IgYWxsIEYzIGRldmljZXMKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVElNeCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK3N0YXRpYyBFcnJvclN0YXR1cyBPQzVDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9PQ19Jbml0VHlwZURlZiAqVElNX09DSW5pdFN0cnVjdCkKK3sKKyAgdWludDMyX3QgdG1wY2NtcjMgPSAwVTsKKyAgdWludDMyX3QgdG1wY2NlciA9IDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0M1X0lOU1RBTkNFKFRJTXgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ01PREUoVElNX09DSW5pdFN0cnVjdC0+T0NNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NTVEFURShUSU1fT0NJbml0U3RydWN0LT5PQ1N0YXRlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NQT0xBUklUWShUSU1fT0NJbml0U3RydWN0LT5PQ1BvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NQT0xBUklUWShUSU1fT0NJbml0U3RydWN0LT5PQ05Qb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NOU3RhdGUpKTsKKworICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDU6IFJlc2V0IHRoZSBDQzVFIEJpdCAqLworICBDTEVBUl9CSVQoVElNeC0+Q0NFUiwgVElNX0NDRVJfQ0M1RSk7CisKKyAgLyogR2V0IHRoZSBUSU14IENDRVIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NlciA9IExMX1RJTV9SZWFkUmVnKFRJTXgsIENDRVIpOworCisgIC8qIEdldCB0aGUgVElNeCBDQ01SMyByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY21yMyA9IExMX1RJTV9SZWFkUmVnKFRJTXgsIENDTVIzKTsKKworICAvKiBTZWxlY3QgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8KKyAgTU9ESUZZX1JFRyh0bXBjY21yMywgVElNX0NDTVIzX09DNU0sIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTW9kZSk7CisKKyAgLyogU2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBQb2xhcml0eSAqLworICBNT0RJRllfUkVHKHRtcGNjZXIsIFRJTV9DQ0VSX0NDNVAsIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DUG9sYXJpdHkgPDwgMTZVKTsKKworICAvKiBTZXQgdGhlIE91dHB1dCBTdGF0ZSAqLworICBNT0RJRllfUkVHKHRtcGNjZXIsIFRJTV9DQ0VSX0NDNUUsIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DU3RhdGUgPDwgMTZVKTsKKworICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ0lETEVTVEFURShUSU1fT0NJbml0U3RydWN0LT5PQ05JZGxlU3RhdGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DSURMRVNUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DSWRsZVN0YXRlKSk7CisKKyAgICAvKiBTZXQgdGhlIE91dHB1dCBJZGxlIHN0YXRlICovCisgICAgTU9ESUZZX1JFRyhUSU14LT5DUjIsIFRJTV9DUjJfT0lTNSwgVElNX09DSW5pdFN0cnVjdC0+T0NJZGxlU3RhdGUgPDwgOFUpOworCisgIH0KKworICAvKiBXcml0ZSB0byBUSU14IENDTVIzICovCisgIExMX1RJTV9Xcml0ZVJlZyhUSU14LCBDQ01SMywgdG1wY2NtcjMpOworCisgIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyIHZhbHVlICovCisgIExMX1RJTV9PQ19TZXRDb21wYXJlQ0g1KFRJTXgsIFRJTV9PQ0luaXRTdHJ1Y3QtPkNvbXBhcmVWYWx1ZSk7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ0VSICovCisgIExMX1RJTV9Xcml0ZVJlZyhUSU14LCBDQ0VSLCB0bXBjY2VyKTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJTXggb3V0cHV0IGNoYW5uZWwgNi4KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRJTV9PQ0luaXRTdHJ1Y3QgcG9pbnRlciB0byB0aGUgdGhlIFRJTXggb3V0cHV0IGNoYW5uZWwgNiBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlCisgICogQG5vdGUgICBPQzYgaXMgbm90IGF2YWlsYWJsZSBmb3IgYWxsIEYzIGRldmljZXMKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVElNeCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK3N0YXRpYyBFcnJvclN0YXR1cyBPQzZDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9PQ19Jbml0VHlwZURlZiAqVElNX09DSW5pdFN0cnVjdCkKK3sKKyAgdWludDMyX3QgdG1wY2NtcjMgPSAwVTsKKyAgdWludDMyX3QgdG1wY2NlciA9IDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0M2X0lOU1RBTkNFKFRJTXgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ01PREUoVElNX09DSW5pdFN0cnVjdC0+T0NNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NTVEFURShUSU1fT0NJbml0U3RydWN0LT5PQ1N0YXRlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NQT0xBUklUWShUSU1fT0NJbml0U3RydWN0LT5PQ1BvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NQT0xBUklUWShUSU1fT0NJbml0U3RydWN0LT5PQ05Qb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NOU3RhdGUpKTsKKworICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDU6IFJlc2V0IHRoZSBDQzZFIEJpdCAqLworICBDTEVBUl9CSVQoVElNeC0+Q0NFUiwgVElNX0NDRVJfQ0M2RSk7CisKKyAgLyogR2V0IHRoZSBUSU14IENDRVIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NlciA9IExMX1RJTV9SZWFkUmVnKFRJTXgsIENDRVIpOworCisgIC8qIEdldCB0aGUgVElNeCBDQ01SMyByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY21yMyA9IExMX1RJTV9SZWFkUmVnKFRJTXgsIENDTVIzKTsKKworICAvKiBTZWxlY3QgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8KKyAgTU9ESUZZX1JFRyh0bXBjY21yMywgVElNX0NDTVIzX09DNk0sIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTW9kZSA8PCA4VSk7CisKKyAgLyogU2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBQb2xhcml0eSAqLworICBNT0RJRllfUkVHKHRtcGNjZXIsIFRJTV9DQ0VSX0NDNlAsIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DUG9sYXJpdHkgPDwgMjBVKTsKKworICAvKiBTZXQgdGhlIE91dHB1dCBTdGF0ZSAqLworICBNT0RJRllfUkVHKHRtcGNjZXIsIFRJTV9DQ0VSX0NDNkUsIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DU3RhdGUgPDwgMjBVKTsKKworICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ0lETEVTVEFURShUSU1fT0NJbml0U3RydWN0LT5PQ05JZGxlU3RhdGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DSURMRVNUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DSWRsZVN0YXRlKSk7CisKKyAgICAvKiBTZXQgdGhlIE91dHB1dCBJZGxlIHN0YXRlICovCisgICAgTU9ESUZZX1JFRyhUSU14LT5DUjIsIFRJTV9DUjJfT0lTNiwgVElNX09DSW5pdFN0cnVjdC0+T0NJZGxlU3RhdGUgPDwgMTBVKTsKKyAgfQorCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjMgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENDTVIzLCB0bXBjY21yMyk7CisKKyAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgKi8KKyAgTExfVElNX09DX1NldENvbXBhcmVDSDYoVElNeCwgVElNX09DSW5pdFN0cnVjdC0+Q29tcGFyZVZhbHVlKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENDRVIsIHRtcGNjZXIpOworCisgIHJldHVybiBTVUNDRVNTOworfQorI2VuZGlmIC8qIFRJTV9DQ0VSX0NDNUUgKi8KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJTXggaW5wdXQgY2hhbm5lbCAxLgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBJbnN0YW5jZQorICAqIEBwYXJhbSAgVElNX0lDSW5pdFN0cnVjdCBwb2ludGVyIHRvIHRoZSB0aGUgVElNeCBpbnB1dCBjaGFubmVsIDEgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBUSU14IHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBub3QgYXBwbGljYWJsZQorICAqLworc3RhdGljIEVycm9yU3RhdHVzIElDMUNvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX0lDX0luaXRUeXBlRGVmICpUSU1fSUNJbml0U3RydWN0KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMV9JTlNUQU5DRShUSU14KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fSUNfUE9MQVJJVFkoVElNX0lDSW5pdFN0cnVjdC0+SUNQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0FDVElWRUlOUFVUKFRJTV9JQ0luaXRTdHJ1Y3QtPklDQWN0aXZlSW5wdXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9JQ1BTQyhUSU1fSUNJbml0U3RydWN0LT5JQ1ByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0lDX0ZJTFRFUihUSU1fSUNJbml0U3RydWN0LT5JQ0ZpbHRlcikpOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMTogUmVzZXQgdGhlIENDMUUgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gKHVpbnQzMl90KX5USU1fQ0NFUl9DQzFFOworCisgIC8qIFNlbGVjdCB0aGUgSW5wdXQgYW5kIHNldCB0aGUgZmlsdGVyIGFuZCB0aGUgcHJlc2NhbGVyIHZhbHVlICovCisgIE1PRElGWV9SRUcoVElNeC0+Q0NNUjEsCisgICAgICAgICAgICAgKFRJTV9DQ01SMV9DQzFTIHwgVElNX0NDTVIxX0lDMUYgfCBUSU1fQ0NNUjFfSUMxUFNDKSwKKyAgICAgICAgICAgICAoVElNX0lDSW5pdFN0cnVjdC0+SUNBY3RpdmVJbnB1dCB8IFRJTV9JQ0luaXRTdHJ1Y3QtPklDRmlsdGVyIHwgVElNX0lDSW5pdFN0cnVjdC0+SUNQcmVzY2FsZXIpID4+IDE2VSk7CisKKyAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSBhbmQgc2V0IHRoZSBDQzFFIEJpdCAqLworICBNT0RJRllfUkVHKFRJTXgtPkNDRVIsCisgICAgICAgICAgICAgKFRJTV9DQ0VSX0NDMVAgfCBUSU1fQ0NFUl9DQzFOUCksCisgICAgICAgICAgICAgKFRJTV9JQ0luaXRTdHJ1Y3QtPklDUG9sYXJpdHkgfCBUSU1fQ0NFUl9DQzFFKSk7CisKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBUSU14IGlucHV0IGNoYW5uZWwgMi4KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRJTV9JQ0luaXRTdHJ1Y3QgcG9pbnRlciB0byB0aGUgdGhlIFRJTXggaW5wdXQgY2hhbm5lbCAyIGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVElNeCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK3N0YXRpYyBFcnJvclN0YXR1cyBJQzJDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9JQ19Jbml0VHlwZURlZiAqVElNX0lDSW5pdFN0cnVjdCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzJfSU5TVEFOQ0UoVElNeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0lDX1BPTEFSSVRZKFRJTV9JQ0luaXRTdHJ1Y3QtPklDUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9BQ1RJVkVJTlBVVChUSU1fSUNJbml0U3RydWN0LT5JQ0FjdGl2ZUlucHV0KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fSUNQU0MoVElNX0lDSW5pdFN0cnVjdC0+SUNQcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9JQ19GSUxURVIoVElNX0lDSW5pdFN0cnVjdC0+SUNGaWx0ZXIpKTsKKworICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDI6IFJlc2V0IHRoZSBDQzJFIEJpdCAqLworICBUSU14LT5DQ0VSICY9ICh1aW50MzJfdCl+VElNX0NDRVJfQ0MyRTsKKworICAvKiBTZWxlY3QgdGhlIElucHV0IGFuZCBzZXQgdGhlIGZpbHRlciBhbmQgdGhlIHByZXNjYWxlciB2YWx1ZSAqLworICBNT0RJRllfUkVHKFRJTXgtPkNDTVIxLAorICAgICAgICAgICAgIChUSU1fQ0NNUjFfQ0MyUyB8IFRJTV9DQ01SMV9JQzJGIHwgVElNX0NDTVIxX0lDMlBTQyksCisgICAgICAgICAgICAgKFRJTV9JQ0luaXRTdHJ1Y3QtPklDQWN0aXZlSW5wdXQgfCBUSU1fSUNJbml0U3RydWN0LT5JQ0ZpbHRlciB8IFRJTV9JQ0luaXRTdHJ1Y3QtPklDUHJlc2NhbGVyKSA+PiA4VSk7CisKKyAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSBhbmQgc2V0IHRoZSBDQzJFIEJpdCAqLworICBNT0RJRllfUkVHKFRJTXgtPkNDRVIsCisgICAgICAgICAgICAgKFRJTV9DQ0VSX0NDMlAgfCBUSU1fQ0NFUl9DQzJOUCksCisgICAgICAgICAgICAgKChUSU1fSUNJbml0U3RydWN0LT5JQ1BvbGFyaXR5IDw8IDRVKSB8IFRJTV9DQ0VSX0NDMkUpKTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJTXggaW5wdXQgY2hhbm5lbCAzLgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBJbnN0YW5jZQorICAqIEBwYXJhbSAgVElNX0lDSW5pdFN0cnVjdCBwb2ludGVyIHRvIHRoZSB0aGUgVElNeCBpbnB1dCBjaGFubmVsIDMgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBUSU14IHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBub3QgYXBwbGljYWJsZQorICAqLworc3RhdGljIEVycm9yU3RhdHVzIElDM0NvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX0lDX0luaXRUeXBlRGVmICpUSU1fSUNJbml0U3RydWN0KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDM19JTlNUQU5DRShUSU14KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fSUNfUE9MQVJJVFkoVElNX0lDSW5pdFN0cnVjdC0+SUNQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0FDVElWRUlOUFVUKFRJTV9JQ0luaXRTdHJ1Y3QtPklDQWN0aXZlSW5wdXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9JQ1BTQyhUSU1fSUNJbml0U3RydWN0LT5JQ1ByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0lDX0ZJTFRFUihUSU1fSUNJbml0U3RydWN0LT5JQ0ZpbHRlcikpOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMzogUmVzZXQgdGhlIENDM0UgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gKHVpbnQzMl90KX5USU1fQ0NFUl9DQzNFOworCisgIC8qIFNlbGVjdCB0aGUgSW5wdXQgYW5kIHNldCB0aGUgZmlsdGVyIGFuZCB0aGUgcHJlc2NhbGVyIHZhbHVlICovCisgIE1PRElGWV9SRUcoVElNeC0+Q0NNUjIsCisgICAgICAgICAgICAgKFRJTV9DQ01SMl9DQzNTIHwgVElNX0NDTVIyX0lDM0YgfCBUSU1fQ0NNUjJfSUMzUFNDKSwKKyAgICAgICAgICAgICAoVElNX0lDSW5pdFN0cnVjdC0+SUNBY3RpdmVJbnB1dCB8IFRJTV9JQ0luaXRTdHJ1Y3QtPklDRmlsdGVyIHwgVElNX0lDSW5pdFN0cnVjdC0+SUNQcmVzY2FsZXIpID4+IDE2VSk7CisKKyAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSBhbmQgc2V0IHRoZSBDQzNFIEJpdCAqLworICBNT0RJRllfUkVHKFRJTXgtPkNDRVIsCisgICAgICAgICAgICAgKFRJTV9DQ0VSX0NDM1AgfCBUSU1fQ0NFUl9DQzNOUCksCisgICAgICAgICAgICAgKChUSU1fSUNJbml0U3RydWN0LT5JQ1BvbGFyaXR5IDw8IDhVKSB8IFRJTV9DQ0VSX0NDM0UpKTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJTXggaW5wdXQgY2hhbm5lbCA0LgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBJbnN0YW5jZQorICAqIEBwYXJhbSAgVElNX0lDSW5pdFN0cnVjdCBwb2ludGVyIHRvIHRoZSB0aGUgVElNeCBpbnB1dCBjaGFubmVsIDQgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBUSU14IHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBub3QgYXBwbGljYWJsZQorICAqLworc3RhdGljIEVycm9yU3RhdHVzIElDNENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX0lDX0luaXRUeXBlRGVmICpUSU1fSUNJbml0U3RydWN0KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDNF9JTlNUQU5DRShUSU14KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fSUNfUE9MQVJJVFkoVElNX0lDSW5pdFN0cnVjdC0+SUNQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0FDVElWRUlOUFVUKFRJTV9JQ0luaXRTdHJ1Y3QtPklDQWN0aXZlSW5wdXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9JQ1BTQyhUSU1fSUNJbml0U3RydWN0LT5JQ1ByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0lDX0ZJTFRFUihUSU1fSUNJbml0U3RydWN0LT5JQ0ZpbHRlcikpOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgNDogUmVzZXQgdGhlIENDNEUgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gKHVpbnQzMl90KX5USU1fQ0NFUl9DQzRFOworCisgIC8qIFNlbGVjdCB0aGUgSW5wdXQgYW5kIHNldCB0aGUgZmlsdGVyIGFuZCB0aGUgcHJlc2NhbGVyIHZhbHVlICovCisgIE1PRElGWV9SRUcoVElNeC0+Q0NNUjIsCisgICAgICAgICAgICAgKFRJTV9DQ01SMl9DQzRTIHwgVElNX0NDTVIyX0lDNEYgfCBUSU1fQ0NNUjJfSUM0UFNDKSwKKyAgICAgICAgICAgICAoVElNX0lDSW5pdFN0cnVjdC0+SUNBY3RpdmVJbnB1dCB8IFRJTV9JQ0luaXRTdHJ1Y3QtPklDRmlsdGVyIHwgVElNX0lDSW5pdFN0cnVjdC0+SUNQcmVzY2FsZXIpID4+IDhVKTsKKworICAvKiBTZWxlY3QgdGhlIFBvbGFyaXR5IGFuZCBzZXQgdGhlIENDMkUgQml0ICovCisgIE1PRElGWV9SRUcoVElNeC0+Q0NFUiwKKyAgICAgICAgICAgICAoVElNX0NDRVJfQ0M0UCB8IFRJTV9DQ0VSX0NDNE5QKSwKKyAgICAgICAgICAgICAoKFRJTV9JQ0luaXRTdHJ1Y3QtPklDUG9sYXJpdHkgPDwgMTJVKSB8IFRJTV9DQ0VSX0NDNEUpKTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogVElNMSB8fCBUSU0yIHx8IFRJTTMgfHwgVElNNCB8fCBUSU01IHx8IFRJTTYgfHwgVElNNyB8fCBUSU04IHx8IFRJTTEyIHx8IFRJTTEzIHx8IFRJTTE0IHx8IFRJTTE1IHx8IFRJTTE2IHx8IFRJTTE3IHx8IFRJTTE4IHx8IFRJTTE5IHx8IFRJTTIwICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmYzeHhfbGxfdXNhcnQuYyBiL1NyYy9zdG0zMmYzeHhfbGxfdXNhcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGQwOWRkCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZjN4eF9sbF91c2FydC5jCkBAIC0wLDAgKzEsNDU4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmM3h4X2xsX3VzYXJ0LmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFVTQVJUIExMIG1vZHVsZSBkcml2ZXIuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9sbF91c2FydC5oIgorI2luY2x1ZGUgInN0bTMyZjN4eF9sbF9yY2MuaCIKKyNpbmNsdWRlICJzdG0zMmYzeHhfbGxfYnVzLmgiCisjaWZkZWYgIFVTRV9GVUxMX0FTU0VSVAorI2luY2x1ZGUgInN0bTMyX2Fzc2VydC5oIgorI2Vsc2UKKyNkZWZpbmUgYXNzZXJ0X3BhcmFtKGV4cHIpICgodm9pZCkwVSkKKyNlbmRpZgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGM3h4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkIChVU0FSVDEpIHx8IGRlZmluZWQgKFVTQVJUMikgfHwgZGVmaW5lZCAoVVNBUlQzKSB8fCBkZWZpbmVkIChVQVJUNCkgfHwgZGVmaW5lZCAoVUFSVDUpCisKKy8qKiBAYWRkdG9ncm91cCBVU0FSVF9MTAorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBVU0FSVF9MTF9Qcml2YXRlX0NvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBVU0FSVF9MTF9Qcml2YXRlX01hY3JvcworICAqIEB7CisgICovCisKKy8qIF9fQkFVRFJBVEVfXyBUaGUgbWF4aW11bSBCYXVkIFJhdGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBtYXhpbXVtIGNsb2NrIGF2YWlsYWJsZQorICogICAgICAgICAgICAgIGRpdmlkZWQgYnkgdGhlIHNtYWxsZXN0IG92ZXJzYW1wbGluZyB1c2VkIG9uIHRoZSBVU0FSVCAoaS5lLiA4KSAgICAqLworI2RlZmluZSBJU19MTF9VU0FSVF9CQVVEUkFURShfX0JBVURSQVRFX18pICgoX19CQVVEUkFURV9fKSA8PSA5MDAwMDAwVSkKKworLyogX19WQUxVRV9fIEluIGNhc2Ugb2Ygb3ZlcnNhbXBsaW5nIGJ5IDE2IGFuZCA4LCBCUlIgY29udGVudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxNmQuICovCisjZGVmaW5lIElTX0xMX1VTQVJUX0JSUl9NSU4oX19WQUxVRV9fKSAoKF9fVkFMVUVfXykgPj0gMTZVKQorCisvKiBfX1ZBTFVFX18gQlJSIGNvbnRlbnQgbXVzdCBiZSBsb3dlciB0aGFuIG9yIGVxdWFsIHRvIDB4RkZGRi4gKi8KKyNkZWZpbmUgSVNfTExfVVNBUlRfQlJSX01BWChfX1ZBTFVFX18pICgoX19WQUxVRV9fKSA8PSAweDAwMDBGRkZGVSkKKworI2RlZmluZSBJU19MTF9VU0FSVF9ESVJFQ1RJT04oX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1VTQVJUX0RJUkVDVElPTl9OT05FKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfRElSRUNUSU9OX1JYKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfRElSRUNUSU9OX1RYKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfRElSRUNUSU9OX1RYX1JYKSkKKworI2RlZmluZSBJU19MTF9VU0FSVF9QQVJJVFkoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1VTQVJUX1BBUklUWV9OT05FKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfUEFSSVRZX0VWRU4pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9QQVJJVFlfT0REKSkKKworI2lmIGRlZmluZWQoVVNBUlRfN0JJVFNfU1VQUE9SVCkKKyNkZWZpbmUgSVNfTExfVVNBUlRfREFUQVdJRFRIKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9EQVRBV0lEVEhfN0IpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9EQVRBV0lEVEhfOEIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9EQVRBV0lEVEhfOUIpKQorI2Vsc2UKKyNkZWZpbmUgSVNfTExfVVNBUlRfREFUQVdJRFRIKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9EQVRBV0lEVEhfOEIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9EQVRBV0lEVEhfOUIpKQorI2VuZGlmCisKKyNkZWZpbmUgSVNfTExfVVNBUlRfT1ZFUlNBTVBMSU5HKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9PVkVSU0FNUExJTkdfMTYpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9PVkVSU0FNUExJTkdfOCkpCisKKyNkZWZpbmUgSVNfTExfVVNBUlRfTEFTVEJJVENMS09VVFBVVChfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfTEFTVENMS1BVTFNFX05PX09VVFBVVCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9MQVNUQ0xLUFVMU0VfT1VUUFVUKSkKKworI2RlZmluZSBJU19MTF9VU0FSVF9DTE9DS1BIQVNFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9QSEFTRV8xRURHRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9QSEFTRV8yRURHRSkpCisKKyNkZWZpbmUgSVNfTExfVVNBUlRfQ0xPQ0tQT0xBUklUWShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfUE9MQVJJVFlfTE9XKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX1BPTEFSSVRZX0hJR0gpKQorCisjZGVmaW5lIElTX0xMX1VTQVJUX0NMT0NLT1VUUFVUKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9DTE9DS19ESVNBQkxFKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9DTE9DS19FTkFCTEUpKQorCisjZGVmaW5lIElTX0xMX1VTQVJUX1NUT1BCSVRTKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9TVE9QQklUU18wXzUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX1NUT1BCSVRTXzEpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX1NUT1BCSVRTXzFfNSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfU1RPUEJJVFNfMikpCisKKyNkZWZpbmUgSVNfTExfVVNBUlRfSFdDT05UUk9MKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9IV0NPTlRST0xfTk9ORSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX0hXQ09OVFJPTF9SVFMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9IV0NPTlRST0xfQ1RTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfSFdDT05UUk9MX1JUU19DVFMpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFVTQVJUX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBVU0FSVF9MTF9FRl9Jbml0CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBEZS1pbml0aWFsaXplIFVTQVJUIHJlZ2lzdGVycyAoUmVnaXN0ZXJzIHJlc3RvcmVkIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzKS4KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBVU0FSVCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogVVNBUlQgcmVnaXN0ZXJzIGFyZSBub3QgZGUtaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1VTQVJUX0RlSW5pdChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfSU5TVEFOQ0UoVVNBUlR4KSk7CisKKyAgaWYgKFVTQVJUeCA9PSBVU0FSVDEpCisgIHsKKyAgICAvKiBGb3JjZSByZXNldCBvZiBVU0FSVCBjbG9jayAqLworICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjJfR1JQMV9QRVJJUEhfVVNBUlQxKTsKKworICAgIC8qIFJlbGVhc2UgcmVzZXQgb2YgVVNBUlQgY2xvY2sgKi8KKyAgICBMTF9BUEIyX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjJfR1JQMV9QRVJJUEhfVVNBUlQxKTsKKyAgfQorICBlbHNlIGlmIChVU0FSVHggPT0gVVNBUlQyKQorICB7CisgICAgLyogRm9yY2UgcmVzZXQgb2YgVVNBUlQgY2xvY2sgKi8KKyAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUMik7CisKKyAgICAvKiBSZWxlYXNlIHJlc2V0IG9mIFVTQVJUIGNsb2NrICovCisgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUMik7CisgIH0KKyAgZWxzZSBpZiAoVVNBUlR4ID09IFVTQVJUMykKKyAgeworICAgIC8qIEZvcmNlIHJlc2V0IG9mIFVTQVJUIGNsb2NrICovCisgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDMpOworCisgICAgLyogUmVsZWFzZSByZXNldCBvZiBVU0FSVCBjbG9jayAqLworICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDMpOworICB9CisjaWYgZGVmaW5lZChVQVJUNCkKKyAgZWxzZSBpZiAoVVNBUlR4ID09IFVBUlQ0KQorICB7CisgICAgLyogRm9yY2UgcmVzZXQgb2YgVUFSVCBjbG9jayAqLworICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfVUFSVDQpOworCisgICAgLyogUmVsZWFzZSByZXNldCBvZiBVQVJUIGNsb2NrICovCisgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX1VBUlQ0KTsKKyAgfQorI2VuZGlmIC8qIFVBUlQ0ICovCisjaWYgZGVmaW5lZChVQVJUNSkKKyAgZWxzZSBpZiAoVVNBUlR4ID09IFVBUlQ1KQorICB7CisgICAgLyogRm9yY2UgcmVzZXQgb2YgVUFSVCBjbG9jayAqLworICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfVUFSVDUpOworCisgICAgLyogUmVsZWFzZSByZXNldCBvZiBVQVJUIGNsb2NrICovCisgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX1VBUlQ1KTsKKyAgfQorI2VuZGlmIC8qIFVBUlQ1ICovCisgIGVsc2UKKyAgeworICAgIHN0YXR1cyA9IEVSUk9SOworICB9CisKKyAgcmV0dXJuIChzdGF0dXMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgVVNBUlQgcmVnaXN0ZXJzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIFVTQVJUX0luaXRTdHJ1Y3QuCisgICogQG5vdGUgICBBcyBzb21lIGJpdHMgaW4gVVNBUlQgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgY2FuIG9ubHkgYmUgd3JpdHRlbiB3aGVuIHRoZSBVU0FSVCBpcyBkaXNhYmxlZCAoVVNBUlRfQ1IxX1VFIGJpdCA9MCksCisgICogICAgICAgICBVU0FSVCBJUCBzaG91bGQgYmUgaW4gZGlzYWJsZWQgc3RhdGUgcHJpb3IgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiBPdGhlcndpc2UsIEVSUk9SIHJlc3VsdCB3aWxsIGJlIHJldHVybmVkLgorICAqIEBub3RlICAgQmF1ZCByYXRlIHZhbHVlIHN0b3JlZCBpbiBVU0FSVF9Jbml0U3RydWN0IEJhdWRSYXRlIGZpZWxkLCBzaG91bGQgYmUgdmFsaWQgKGRpZmZlcmVudCBmcm9tIDApLgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBVU0FSVF9Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBMTF9VU0FSVF9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVVNBUlQgcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVVNBUlQgcmVnaXN0ZXJzIGFyZSBpbml0aWFsaXplZCBhY2NvcmRpbmcgdG8gVVNBUlRfSW5pdFN0cnVjdCBjb250ZW50CisgICogICAgICAgICAgLSBFUlJPUjogUHJvYmxlbSBvY2N1cnJlZCBkdXJpbmcgVVNBUlQgUmVnaXN0ZXJzIGluaXRpYWxpemF0aW9uCisgICovCitFcnJvclN0YXR1cyBMTF9VU0FSVF9Jbml0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgTExfVVNBUlRfSW5pdFR5cGVEZWYgKlVTQVJUX0luaXRTdHJ1Y3QpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IEVSUk9SOworICB1aW50MzJfdCBwZXJpcGhjbGsgPSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTzsKKyNpZiBkZWZpbmVkKFNUTTMyRjMwM3g4KXx8ZGVmaW5lZChTVE0zMkYzMzR4OCl8fGRlZmluZWQoU1RNMzJGMzI4eHgpfHxkZWZpbmVkKFNUTTMyRjMwMXg4KXx8ZGVmaW5lZChTVE0zMkYzMDJ4OCl8fGRlZmluZWQoU1RNMzJGMzE4eHgpCisgIExMX1JDQ19DbG9ja3NUeXBlRGVmIFJDQ19DbG9ja3M7CisjZW5kaWYKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9JTlNUQU5DRShVU0FSVHgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1VTQVJUX0JBVURSQVRFKFVTQVJUX0luaXRTdHJ1Y3QtPkJhdWRSYXRlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9VU0FSVF9EQVRBV0lEVEgoVVNBUlRfSW5pdFN0cnVjdC0+RGF0YVdpZHRoKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9VU0FSVF9TVE9QQklUUyhVU0FSVF9Jbml0U3RydWN0LT5TdG9wQml0cykpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVVNBUlRfUEFSSVRZKFVTQVJUX0luaXRTdHJ1Y3QtPlBhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVVNBUlRfRElSRUNUSU9OKFVTQVJUX0luaXRTdHJ1Y3QtPlRyYW5zZmVyRGlyZWN0aW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9VU0FSVF9IV0NPTlRST0woVVNBUlRfSW5pdFN0cnVjdC0+SGFyZHdhcmVGbG93Q29udHJvbCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVVNBUlRfT1ZFUlNBTVBMSU5HKFVTQVJUX0luaXRTdHJ1Y3QtPk92ZXJTYW1wbGluZykpOworCisgIC8qIFVTQVJUIG5lZWRzIHRvIGJlIGluIGRpc2FibGVkIHN0YXRlLCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGNvbmZpZ3VyZSBzb21lIGJpdHMgaW4KKyAgICAgQ1J4IHJlZ2lzdGVycyAqLworICBpZiAoTExfVVNBUlRfSXNFbmFibGVkKFVTQVJUeCkgPT0gMFUpCisgIHsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ29uZmlndXJlIFVTQVJUeCBDUjEgKFVTQVJUIFdvcmQgTGVuZ3RoLCBQYXJpdHksIE1vZGUgYW5kIE92ZXJzYW1wbGluZyBiaXRzKSB3aXRoIHBhcmFtZXRlcnM6CisgICAgICogLSBEYXRhV2lkdGg6ICAgICAgICAgIFVTQVJUX0NSMV9NIGJpdHMgYWNjb3JkaW5nIHRvIFVTQVJUX0luaXRTdHJ1Y3QtPkRhdGFXaWR0aCB2YWx1ZQorICAgICAqIC0gUGFyaXR5OiAgICAgICAgICAgICBVU0FSVF9DUjFfUENFLCBVU0FSVF9DUjFfUFMgYml0cyBhY2NvcmRpbmcgdG8gVVNBUlRfSW5pdFN0cnVjdC0+UGFyaXR5IHZhbHVlCisgICAgICogLSBUcmFuc2ZlckRpcmVjdGlvbjogIFVTQVJUX0NSMV9URSwgVVNBUlRfQ1IxX1JFIGJpdHMgYWNjb3JkaW5nIHRvIFVTQVJUX0luaXRTdHJ1Y3QtPlRyYW5zZmVyRGlyZWN0aW9uIHZhbHVlCisgICAgICogLSBPdmVyc2FtcGxpbmc6ICAgICAgIFVTQVJUX0NSMV9PVkVSOCBiaXQgYWNjb3JkaW5nIHRvIFVTQVJUX0luaXRTdHJ1Y3QtPk92ZXJTYW1wbGluZyB2YWx1ZS4KKyAgICAgKi8KKyAgICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IxLAorICAgICAgICAgICAgICAgKFVTQVJUX0NSMV9NIHwgVVNBUlRfQ1IxX1BDRSB8IFVTQVJUX0NSMV9QUyB8CisgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1RFIHwgVVNBUlRfQ1IxX1JFIHwgVVNBUlRfQ1IxX09WRVI4KSwKKyAgICAgICAgICAgICAgIChVU0FSVF9Jbml0U3RydWN0LT5EYXRhV2lkdGggfCBVU0FSVF9Jbml0U3RydWN0LT5QYXJpdHkgfAorICAgICAgICAgICAgICAgIFVTQVJUX0luaXRTdHJ1Y3QtPlRyYW5zZmVyRGlyZWN0aW9uIHwgVVNBUlRfSW5pdFN0cnVjdC0+T3ZlclNhbXBsaW5nKSk7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ29uZmlndXJlIFVTQVJUeCBDUjIgKFN0b3AgYml0cykgd2l0aCBwYXJhbWV0ZXJzOgorICAgICAqIC0gU3RvcCBCaXRzOiAgICAgICAgICBVU0FSVF9DUjJfU1RPUCBiaXRzIGFjY29yZGluZyB0byBVU0FSVF9Jbml0U3RydWN0LT5TdG9wQml0cyB2YWx1ZS4KKyAgICAgKiAtIENMS0VOLCBDUE9MLCBDUEhBIGFuZCBMQkNMIGJpdHMgYXJlIHRvIGJlIGNvbmZpZ3VyZWQgdXNpbmcgTExfVVNBUlRfQ2xvY2tJbml0KCkuCisgICAgICovCisgICAgTExfVVNBUlRfU2V0U3RvcEJpdHNMZW5ndGgoVVNBUlR4LCBVU0FSVF9Jbml0U3RydWN0LT5TdG9wQml0cyk7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IzIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ29uZmlndXJlIFVTQVJUeCBDUjMgKEhhcmR3YXJlIEZsb3cgQ29udHJvbCkgd2l0aCBwYXJhbWV0ZXJzOgorICAgICAqIC0gSGFyZHdhcmVGbG93Q29udHJvbDogVVNBUlRfQ1IzX1JUU0UsIFVTQVJUX0NSM19DVFNFIGJpdHMgYWNjb3JkaW5nIHRvIFVTQVJUX0luaXRTdHJ1Y3QtPkhhcmR3YXJlRmxvd0NvbnRyb2wgdmFsdWUuCisgICAgICovCisgICAgTExfVVNBUlRfU2V0SFdGbG93Q3RybChVU0FSVHgsIFVTQVJUX0luaXRTdHJ1Y3QtPkhhcmR3YXJlRmxvd0NvbnRyb2wpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIEJSUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIFJldHJpZXZlIENsb2NrIGZyZXF1ZW5jeSB1c2VkIGZvciBVU0FSVCBQZXJpcGhlcmFsCisgICAgICovCisgICAgaWYgKFVTQVJUeCA9PSBVU0FSVDEpCisgICAgeworICAgICAgcGVyaXBoY2xrID0gTExfUkNDX0dldFVTQVJUQ2xvY2tGcmVxKExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFKTsKKyAgICB9CisgICAgZWxzZSBpZiAoVVNBUlR4ID09IFVTQVJUMikKKyAgICB7CisjaWYgZGVmaW5lZCAoUkNDX0NGR1IzX1VTQVJUMlNXKQorICAgICAgcGVyaXBoY2xrID0gTExfUkNDX0dldFVTQVJUQ2xvY2tGcmVxKExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFKTsKKyNlbHNlCisgICAgICAvKiBVU0FSVDIgY2xvY2sgaXMgUENMSyAqLworICAgICAgTExfUkNDX0dldFN5c3RlbUNsb2Nrc0ZyZXEoJlJDQ19DbG9ja3MpOworICAgICAgcGVyaXBoY2xrID0gUkNDX0Nsb2Nrcy5QQ0xLMV9GcmVxdWVuY3k7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZSBpZiAoVVNBUlR4ID09IFVTQVJUMykKKyAgICB7CisjaWYgZGVmaW5lZCAoUkNDX0NGR1IzX1VTQVJUM1NXKQorICAgICAgcGVyaXBoY2xrID0gTExfUkNDX0dldFVTQVJUQ2xvY2tGcmVxKExMX1JDQ19VU0FSVDNfQ0xLU09VUkNFKTsKKyNlbHNlCisgICAgICAvKiBVU0FSVDMgY2xvY2sgaXMgUENMSyAqLworICAgICAgTExfUkNDX0dldFN5c3RlbUNsb2Nrc0ZyZXEoJlJDQ19DbG9ja3MpOworICAgICAgcGVyaXBoY2xrID0gUkNDX0Nsb2Nrcy5QQ0xLMV9GcmVxdWVuY3k7CisjZW5kaWYKKyAgICB9CisjaWYgZGVmaW5lZChVQVJUNCkKKyAgICBlbHNlIGlmIChVU0FSVHggPT0gVUFSVDQpCisgICAgeworICAgICAgcGVyaXBoY2xrID0gTExfUkNDX0dldFVBUlRDbG9ja0ZyZXEoTExfUkNDX1VBUlQ0X0NMS1NPVVJDRSk7CisgICAgfQorI2VuZGlmIC8qIFVBUlQ0ICovCisjaWYgZGVmaW5lZChVQVJUNSkKKyAgICBlbHNlIGlmIChVU0FSVHggPT0gVUFSVDUpCisgICAgeworICAgICAgcGVyaXBoY2xrID0gTExfUkNDX0dldFVBUlRDbG9ja0ZyZXEoTExfUkNDX1VBUlQ1X0NMS1NPVVJDRSk7CisgICAgfQorI2VuZGlmIC8qIFVBUlQ1ICovCisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIE5vdGhpbmcgdG8gZG8sIGFzIGVycm9yIGNvZGUgaXMgYWxyZWFkeSBhc3NpZ25lZCB0byBFUlJPUiB2YWx1ZSAqLworICAgIH0KKworICAgIC8qIENvbmZpZ3VyZSB0aGUgVVNBUlQgQmF1ZCBSYXRlIDoKKyAgICAgICAtIHZhbGlkIGJhdWQgcmF0ZSB2YWx1ZSAoZGlmZmVyZW50IGZyb20gMCkgaXMgcmVxdWlyZWQKKyAgICAgICAtIFBlcmlwaGVyYWwgY2xvY2sgYXMgcmV0dXJuZWQgYnkgUkNDIHNlcnZpY2UsIHNob3VsZCBiZSB2YWxpZCAoZGlmZmVyZW50IGZyb20gMCkuCisgICAgKi8KKyAgICBpZiAoKHBlcmlwaGNsayAhPSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTykKKyAgICAgICAgJiYgKFVTQVJUX0luaXRTdHJ1Y3QtPkJhdWRSYXRlICE9IDBVKSkKKyAgICB7CisgICAgICBzdGF0dXMgPSBTVUNDRVNTOworICAgICAgTExfVVNBUlRfU2V0QmF1ZFJhdGUoVVNBUlR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaXBoY2xrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSW5pdFN0cnVjdC0+T3ZlclNhbXBsaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSW5pdFN0cnVjdC0+QmF1ZFJhdGUpOworCisgICAgICAvKiBDaGVjayBCUlIgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDE2ZCAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1VTQVJUX0JSUl9NSU4oVVNBUlR4LT5CUlIpKTsKKworICAgICAgLyogQ2hlY2sgQlJSIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxNmQgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9VU0FSVF9CUlJfTUFYKFVTQVJUeC0+QlJSKSk7CisgICAgfQorICB9CisgIC8qIEVuZGlmICg9PiBVU0FSVCBub3QgaW4gRGlzYWJsZWQgc3RhdGUgPT4gcmV0dXJuIEVSUk9SKSAqLworCisgIHJldHVybiAoc3RhdHVzKTsKK30KKworLyoqCisgICogQGJyaWVmIFNldCBlYWNoIEByZWYgTExfVVNBUlRfSW5pdFR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZS4KKyAgKiBAcGFyYW0gVVNBUlRfSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9VU0FSVF9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2hvc2UgZmllbGRzIHdpbGwgYmUgc2V0IHRvIGRlZmF1bHQgdmFsdWVzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworCit2b2lkIExMX1VTQVJUX1N0cnVjdEluaXQoTExfVVNBUlRfSW5pdFR5cGVEZWYgKlVTQVJUX0luaXRTdHJ1Y3QpCit7CisgIC8qIFNldCBVU0FSVF9Jbml0U3RydWN0IGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICBVU0FSVF9Jbml0U3RydWN0LT5CYXVkUmF0ZSAgICAgICAgICAgID0gOTYwMFU7CisgIFVTQVJUX0luaXRTdHJ1Y3QtPkRhdGFXaWR0aCAgICAgICAgICAgPSBMTF9VU0FSVF9EQVRBV0lEVEhfOEI7CisgIFVTQVJUX0luaXRTdHJ1Y3QtPlN0b3BCaXRzICAgICAgICAgICAgPSBMTF9VU0FSVF9TVE9QQklUU18xOworICBVU0FSVF9Jbml0U3RydWN0LT5QYXJpdHkgICAgICAgICAgICAgID0gTExfVVNBUlRfUEFSSVRZX05PTkUgOworICBVU0FSVF9Jbml0U3RydWN0LT5UcmFuc2ZlckRpcmVjdGlvbiAgID0gTExfVVNBUlRfRElSRUNUSU9OX1RYX1JYOworICBVU0FSVF9Jbml0U3RydWN0LT5IYXJkd2FyZUZsb3dDb250cm9sID0gTExfVVNBUlRfSFdDT05UUk9MX05PTkU7CisgIFVTQVJUX0luaXRTdHJ1Y3QtPk92ZXJTYW1wbGluZyAgICAgICAgPSBMTF9VU0FSVF9PVkVSU0FNUExJTkdfMTY7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSBVU0FSVCBDbG9jayByZWxhdGVkIHNldHRpbmdzIGFjY29yZGluZyB0byB0aGUKKyAgKiAgICAgICAgIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIHRoZSBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QuCisgICogQG5vdGUgICBBcyBzb21lIGJpdHMgaW4gVVNBUlQgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgY2FuIG9ubHkgYmUgd3JpdHRlbiB3aGVuIHRoZSBVU0FSVCBpcyBkaXNhYmxlZCAoVVNBUlRfQ1IxX1VFIGJpdCA9MCksCisgICogICAgICAgICBVU0FSVCBJUCBzaG91bGQgYmUgaW4gZGlzYWJsZWQgc3RhdGUgcHJpb3IgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiBPdGhlcndpc2UsIEVSUk9SIHJlc3VsdCB3aWxsIGJlIHJldHVybmVkLgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVVNBUlRfQ2xvY2tJbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgIHRoYXQgY29udGFpbnMgdGhlIENsb2NrIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVVNBUlQgcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVVNBUlQgcmVnaXN0ZXJzIHJlbGF0ZWQgdG8gQ2xvY2sgc2V0dGluZ3MgYXJlIGluaXRpYWxpemVkIGFjY29yZGluZyB0byBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QgY29udGVudAorICAqICAgICAgICAgIC0gRVJST1I6IFByb2JsZW0gb2NjdXJyZWQgZHVyaW5nIFVTQVJUIFJlZ2lzdGVycyBpbml0aWFsaXphdGlvbgorICAqLworRXJyb3JTdGF0dXMgTExfVVNBUlRfQ2xvY2tJbml0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgTExfVVNBUlRfQ2xvY2tJbml0VHlwZURlZiAqVVNBUlRfQ2xvY2tJbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworCisgIC8qIENoZWNrIFVTQVJUIEluc3RhbmNlIGFuZCBDbG9jayBzaWduYWwgb3V0cHV0IHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfSU5TVEFOQ0UoVVNBUlR4KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9VU0FSVF9DTE9DS09VVFBVVChVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPkNsb2NrT3V0cHV0KSk7CisKKyAgLyogVVNBUlQgbmVlZHMgdG8gYmUgaW4gZGlzYWJsZWQgc3RhdGUsIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gY29uZmlndXJlIHNvbWUgYml0cyBpbgorICAgICBDUnggcmVnaXN0ZXJzICovCisgIGlmIChMTF9VU0FSVF9Jc0VuYWJsZWQoVVNBUlR4KSA9PSAwVSkKKyAgeworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBDUjIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogSWYgQ2xvY2sgc2lnbmFsIGhhcyB0byBiZSBvdXRwdXQgKi8KKyAgICBpZiAoVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5DbG9ja091dHB1dCA9PSBMTF9VU0FSVF9DTE9DS19ESVNBQkxFKQorICAgIHsKKyAgICAgIC8qIERlYWN0aXZhdGUgQ2xvY2sgc2lnbmFsIGRlbGl2ZXJ5IDoKKyAgICAgICAqIC0gRGlzYWJsZSBDbG9jayBPdXRwdXQ6ICAgICAgICBVU0FSVF9DUjJfQ0xLRU4gY2xlYXJlZAorICAgICAgICovCisgICAgICBMTF9VU0FSVF9EaXNhYmxlU0NMS091dHB1dChVU0FSVHgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogRW5zdXJlIFVTQVJUIGluc3RhbmNlIGlzIFVTQVJUIGNhcGFibGUgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19VU0FSVF9JTlNUQU5DRShVU0FSVHgpKTsKKworICAgICAgLyogQ2hlY2sgY2xvY2sgcmVsYXRlZCBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfVVNBUlRfQ0xPQ0tQT0xBUklUWShVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPkNsb2NrUG9sYXJpdHkpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9VU0FSVF9DTE9DS1BIQVNFKFVTQVJUX0Nsb2NrSW5pdFN0cnVjdC0+Q2xvY2tQaGFzZSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1VTQVJUX0xBU1RCSVRDTEtPVVRQVVQoVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5MYXN0Qml0Q2xvY2tQdWxzZSkpOworCisgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAqIENvbmZpZ3VyZSBVU0FSVHggQ1IyIChDbG9jayBzaWduYWwgcmVsYXRlZCBiaXRzKSB3aXRoIHBhcmFtZXRlcnM6CisgICAgICAgKiAtIEVuYWJsZSBDbG9jayBPdXRwdXQ6ICAgICAgICAgVVNBUlRfQ1IyX0NMS0VOIHNldAorICAgICAgICogLSBDbG9jayBQb2xhcml0eTogICAgICAgICAgICAgIFVTQVJUX0NSMl9DUE9MIGJpdCBhY2NvcmRpbmcgdG8gVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5DbG9ja1BvbGFyaXR5IHZhbHVlCisgICAgICAgKiAtIENsb2NrIFBoYXNlOiAgICAgICAgICAgICAgICAgVVNBUlRfQ1IyX0NQSEEgYml0IGFjY29yZGluZyB0byBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPkNsb2NrUGhhc2UgdmFsdWUKKyAgICAgICAqIC0gTGFzdCBCaXQgQ2xvY2sgUHVsc2UgT3V0cHV0OiBVU0FSVF9DUjJfTEJDTCBiaXQgYWNjb3JkaW5nIHRvIFVTQVJUX0Nsb2NrSW5pdFN0cnVjdC0+TGFzdEJpdENsb2NrUHVsc2UgdmFsdWUuCisgICAgICAgKi8KKyAgICAgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjIsCisgICAgICAgICAgICAgICAgIFVTQVJUX0NSMl9DTEtFTiB8IFVTQVJUX0NSMl9DUEhBIHwgVVNBUlRfQ1IyX0NQT0wgfCBVU0FSVF9DUjJfTEJDTCwKKyAgICAgICAgICAgICAgICAgVVNBUlRfQ1IyX0NMS0VOIHwgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5DbG9ja1BvbGFyaXR5IHwKKyAgICAgICAgICAgICAgICAgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5DbG9ja1BoYXNlIHwgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5MYXN0Qml0Q2xvY2tQdWxzZSk7CisgICAgfQorICB9CisgIC8qIEVsc2UgKFVTQVJUIG5vdCBpbiBEaXNhYmxlZCBzdGF0ZSA9PiByZXR1cm4gRVJST1IgKi8KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKworICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qKgorICAqIEBicmllZiBTZXQgZWFjaCBmaWVsZCBvZiBhIEByZWYgTExfVVNBUlRfQ2xvY2tJbml0VHlwZURlZiB0eXBlIHN0cnVjdHVyZSB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVVNBUlRfQ2xvY2tJbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aG9zZSBmaWVsZHMgd2lsbCBiZSBzZXQgdG8gZGVmYXVsdCB2YWx1ZXMuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX1VTQVJUX0Nsb2NrU3RydWN0SW5pdChMTF9VU0FSVF9DbG9ja0luaXRUeXBlRGVmICpVU0FSVF9DbG9ja0luaXRTdHJ1Y3QpCit7CisgIC8qIFNldCBMTF9VU0FSVF9DbG9ja0luaXRTdHJ1Y3QgZmllbGRzIHdpdGggZGVmYXVsdCB2YWx1ZXMgKi8KKyAgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5DbG9ja091dHB1dCAgICAgICA9IExMX1VTQVJUX0NMT0NLX0RJU0FCTEU7CisgIFVTQVJUX0Nsb2NrSW5pdFN0cnVjdC0+Q2xvY2tQb2xhcml0eSAgICAgPSBMTF9VU0FSVF9QT0xBUklUWV9MT1c7ICAgICAgICAgICAgLyogTm90IHJlbGV2YW50IHdoZW4gQ2xvY2tPdXRwdXQgPSBMTF9VU0FSVF9DTE9DS19ESVNBQkxFICovCisgIFVTQVJUX0Nsb2NrSW5pdFN0cnVjdC0+Q2xvY2tQaGFzZSAgICAgICAgPSBMTF9VU0FSVF9QSEFTRV8xRURHRTsgICAgICAgICAgICAgLyogTm90IHJlbGV2YW50IHdoZW4gQ2xvY2tPdXRwdXQgPSBMTF9VU0FSVF9DTE9DS19ESVNBQkxFICovCisgIFVTQVJUX0Nsb2NrSW5pdFN0cnVjdC0+TGFzdEJpdENsb2NrUHVsc2UgPSBMTF9VU0FSVF9MQVNUQ0xLUFVMU0VfTk9fT1VUUFVUOyAgLyogTm90IHJlbGV2YW50IHdoZW4gQ2xvY2tPdXRwdXQgPSBMTF9VU0FSVF9DTE9DS19ESVNBQkxFICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0FSVDEgfHwgVVNBUlQyfHwgVVNBUlQzIHx8IFVBUlQ0IHx8IFVBUlQ1ICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KKwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjN4eF9sbF91dGlscy5jIGIvU3JjL3N0bTMyZjN4eF9sbF91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllOWUxMWYKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJmM3h4X2xsX3V0aWxzLmMKQEAgLTAsMCArMSw1ODMgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmYzeHhfbGxfdXRpbHMuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgVVRJTFMgTEwgbW9kdWxlIGRyaXZlci4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZjN4eF9sbF9yY2MuaCIKKyNpbmNsdWRlICJzdG0zMmYzeHhfbGxfdXRpbHMuaCIKKyNpbmNsdWRlICJzdG0zMmYzeHhfbGxfc3lzdGVtLmgiCisjaW5jbHVkZSAic3RtMzJmM3h4X2xsX3B3ci5oIgorI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVVRJTFNfTEwKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVVRJTFNfTExfUHJpdmF0ZV9Db25zdGFudHMKKyAgKiBAeworICAqLworCisvKiBEZWZpbmVzIHVzZWQgZm9yIFBMTCByYW5nZSAqLworI2RlZmluZSBVVElMU19QTExfT1VUUFVUX01BWCAgICAgICAgNzIwMDAwMDBVICAgIC8qITwgRnJlcXVlbmN5IG1heCBmb3IgUExMIG91dHB1dCwgaW4gSHogICovCisKKy8qIERlZmluZXMgdXNlZCBmb3IgSFNFIHJhbmdlICovCisjZGVmaW5lIFVUSUxTX0hTRV9GUkVRVUVOQ1lfTUlOICAgICAgNDAwMDAwMFUgICAgICAgLyohPCBGcmVxdWVuY3kgbWluIGZvciBIU0UgZnJlcXVlbmN5LCBpbiBIeiAgICovCisjZGVmaW5lIFVUSUxTX0hTRV9GUkVRVUVOQ1lfTUFYICAgICAzMjAwMDAwMFUgICAgICAgLyohPCBGcmVxdWVuY3kgbWF4IGZvciBIU0UgZnJlcXVlbmN5LCBpbiBIeiAgICovCisKKy8qIERlZmluZXMgdXNlZCBmb3IgRkxBU0ggbGF0ZW5jeSBhY2NvcmRpbmcgdG8gU1lTQ0xLIEZyZXF1ZW5jeSAqLworI2RlZmluZSBVVElMU19MQVRFTkNZMV9GUkVRICAgICAgICAgMjQwMDAwMDBVICAgICAgICAvKiE8IFNZU0NMSyBmcmVxdWVuY3kgdG8gc2V0IEZMQVNIIGxhdGVuY3kgMSAqLworI2RlZmluZSBVVElMU19MQVRFTkNZMl9GUkVRICAgICAgICAgNDgwMDAwMDBVICAgICAgICAvKiE8IFNZU0NMSyBmcmVxdWVuY3kgdG8gc2V0IEZMQVNIIGxhdGVuY3kgMiAqLworLyoqCisgICogQH0KKyAgKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVVRJTFNfTExfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19MTF9VVElMU19TWVNDTEtfRElWKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfU1lTQ0xLX0RJVl8xKSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1NZU0NMS19ESVZfMikgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19TWVNDTEtfRElWXzQpICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfU1lTQ0xLX0RJVl84KSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1NZU0NMS19ESVZfMTYpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19TWVNDTEtfRElWXzY0KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfU1lTQ0xLX0RJVl8xMjgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1NZU0NMS19ESVZfMjU2KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19TWVNDTEtfRElWXzUxMikpCisKKyNkZWZpbmUgSVNfTExfVVRJTFNfQVBCMV9ESVYoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1JDQ19BUEIxX0RJVl8xKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfQVBCMV9ESVZfMikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX0FQQjFfRElWXzQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19BUEIxX0RJVl84KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfQVBCMV9ESVZfMTYpKQorCisjZGVmaW5lIElTX0xMX1VUSUxTX0FQQjJfRElWKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfQVBCMl9ESVZfMSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX0FQQjJfRElWXzIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19BUEIyX0RJVl80KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfQVBCMl9ESVZfOCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX0FQQjJfRElWXzE2KSkKKworI2RlZmluZSBJU19MTF9VVElMU19QTExNVUxfVkFMVUUoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1JDQ19QTExfTVVMXzIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfUExMX01VTF8zKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1BMTF9NVUxfNCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19QTExfTVVMXzUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfUExMX01VTF82KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1BMTF9NVUxfNykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19QTExfTVVMXzgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfUExMX01VTF85KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1BMTF9NVUxfMTApIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfUExMX01VTF8xMSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19QTExfTVVMXzEyKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1BMTF9NVUxfMTMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfUExMX01VTF8xNCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19QTExfTVVMXzE1KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1BMTF9NVUxfMTYpKQorCisjZGVmaW5lIElTX0xMX1VUSUxTX1BSRURJVl9WQUxVRShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfUkNDX1BSRURJVl9ESVZfMSkgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfUFJFRElWX0RJVl8yKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfUFJFRElWX0RJVl8zKSAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19QUkVESVZfRElWXzQpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX1JDQ19QUkVESVZfRElWXzUpICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1BSRURJVl9ESVZfNikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1BSRURJVl9ESVZfNykgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfUFJFRElWX0RJVl84KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfUFJFRElWX0RJVl85KSAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19QUkVESVZfRElWXzEwKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX1JDQ19QUkVESVZfRElWXzExKSB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1BSRURJVl9ESVZfMTIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1BSRURJVl9ESVZfMTMpIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfUFJFRElWX0RJVl8xNCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfUFJFRElWX0RJVl8xNSkgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19QUkVESVZfRElWXzE2KSkKKworI2RlZmluZSBJU19MTF9VVElMU19QTExfRlJFUVVFTkNZKF9fVkFMVUVfXykgKChfX1ZBTFVFX18pIDw9IFVUSUxTX1BMTF9PVVRQVVRfTUFYKQorCisKKyNkZWZpbmUgSVNfTExfVVRJTFNfSFNFX0JZUEFTUyhfX1NUQVRFX18pICgoKF9fU1RBVEVfXykgPT0gTExfVVRJTFNfSFNFQllQQVNTX09OKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1NUQVRFX18pID09IExMX1VUSUxTX0hTRUJZUEFTU19PRkYpKQorCisjZGVmaW5lIElTX0xMX1VUSUxTX0hTRV9GUkVRVUVOQ1koX19GUkVRVUVOQ1lfXykgKCgoX19GUkVRVUVOQ1lfXykgPj0gVVRJTFNfSFNFX0ZSRVFVRU5DWV9NSU4pICYmICgoX19GUkVRVUVOQ1lfXykgPD0gVVRJTFNfSFNFX0ZSRVFVRU5DWV9NQVgpKQorLyoqCisgICogQH0KKyAgKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVUSUxTX0xMX1ByaXZhdGVfRnVuY3Rpb25zIFVUSUxTIFByaXZhdGUgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3N0YXRpYyB1aW50MzJfdCAgICBVVElMU19HZXRQTExPdXRwdXRGcmVxdWVuY3kodWludDMyX3QgUExMX0lucHV0RnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9VVElMU19QTExJbml0VHlwZURlZiAqVVRJTFNfUExMSW5pdFN0cnVjdCk7CisjaWYgZGVmaW5lZChGTEFTSF9BQ1JfTEFURU5DWSkKK3N0YXRpYyBFcnJvclN0YXR1cyBVVElMU19TZXRGbGFzaExhdGVuY3kodWludDMyX3QgRnJlcXVlbmN5KTsKKyNlbmRpZiAvKiBGTEFTSF9BQ1JfTEFURU5DWSAqLworc3RhdGljIEVycm9yU3RhdHVzIFVUSUxTX0VuYWJsZVBMTEFuZFN3aXRjaFN5c3RlbSh1aW50MzJfdCBTWVNDTEtfRnJlcXVlbmN5LCBMTF9VVElMU19DbGtJbml0VHlwZURlZiAqVVRJTFNfQ2xrSW5pdFN0cnVjdCk7CitzdGF0aWMgRXJyb3JTdGF0dXMgVVRJTFNfUExMX0lzQnVzeSh2b2lkKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVVRJTFNfTExfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVUSUxTX0xMX0VGX0RFTEFZCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIENvcnRleC1NIFN5c1RpY2sgc291cmNlIHRvIGhhdmUgMW1zIHRpbWUgYmFzZS4KKyAgKiBAbm90ZSAgIFdoZW4gYSBSVE9TIGlzIHVzZWQsIGl0IGlzIHJlY29tbWVuZGVkIHRvIGF2b2lkIGNoYW5naW5nIHRoZSBTeXN0aWNrCisgICogICAgICAgICBjb25maWd1cmF0aW9uIGJ5IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgZm9yIGEgZGVsYXkgdXNlIHJhdGhlciBvc0RlbGF5IFJUT1Mgc2VydmljZS4KKyAgKiBAcGFyYW0gIEhDTEtGcmVxdWVuY3kgSENMSyBmcmVxdWVuY3kgaW4gSHoKKyAgKiBAbm90ZSAgIEhDTEsgZnJlcXVlbmN5IGNhbiBiZSBjYWxjdWxhdGVkIHRoYW5rcyB0byBSQ0MgaGVscGVyIG1hY3JvIG9yIGZ1bmN0aW9uIEByZWYgTExfUkNDX0dldFN5c3RlbUNsb2Nrc0ZyZXEKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfSW5pdDFtc1RpY2sodWludDMyX3QgSENMS0ZyZXF1ZW5jeSkKK3sKKyAgLyogVXNlIGZyZXF1ZW5jeSBwcm92aWRlZCBpbiBhcmd1bWVudCAqLworICBMTF9Jbml0VGljayhIQ0xLRnJlcXVlbmN5LCAxMDAwVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhY2N1cmF0ZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKSBiYXNlZAorICAqICAgICAgICAgb24gU3lzVGljayBjb3VudGVyIGZsYWcKKyAgKiBAbm90ZSAgIFdoZW4gYSBSVE9TIGlzIHVzZWQsIGl0IGlzIHJlY29tbWVuZGVkIHRvIGF2b2lkIHVzaW5nIGJsb2NraW5nIGRlbGF5CisgICogICAgICAgICBhbmQgdXNlIHJhdGhlciBvc0RlbGF5IHNlcnZpY2UuCisgICogQG5vdGUgICBUbyByZXNwZWN0IDFtcyB0aW1lYmFzZSwgdXNlciBzaG91bGQgY2FsbCBAcmVmIExMX0luaXQxbXNUaWNrIGZ1bmN0aW9uIHdoaWNoCisgICogICAgICAgICB3aWxsIGNvbmZpZ3VyZSBTeXN0aWNrIHRvIDFtcworICAqIEBwYXJhbSAgRGVsYXkgc3BlY2lmaWVzIHRoZSBkZWxheSB0aW1lIGxlbmd0aCwgaW4gbWlsbGlzZWNvbmRzLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9tRGVsYXkodWludDMyX3QgRGVsYXkpCit7CisgIF9fSU8gdWludDMyX3QgIHRtcCA9IFN5c1RpY2stPkNUUkw7ICAvKiBDbGVhciB0aGUgQ09VTlRGTEFHIGZpcnN0ICovCisgIC8qIEFkZCB0aGlzIGNvZGUgdG8gaW5kaWNhdGUgdGhhdCBsb2NhbCB2YXJpYWJsZSBpcyBub3QgdXNlZCAqLworICAoKHZvaWQpdG1wKTsKKworICAvKiBBZGQgYSBwZXJpb2QgdG8gZ3VhcmFudHkgbWluaW11bSB3YWl0ICovCisgIGlmIChEZWxheSA8IExMX01BWF9ERUxBWSkKKyAgeworICAgIERlbGF5Kys7CisgIH0KKworICB3aGlsZSAoRGVsYXkpCisgIHsKKyAgICBpZiAoKFN5c1RpY2stPkNUUkwgJiBTeXNUaWNrX0NUUkxfQ09VTlRGTEFHX01zaykgIT0gMFUpCisgICAgeworICAgICAgRGVsYXktLTsKKyAgICB9CisgIH0KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVUSUxTX0VGX1NZU1RFTQorICAqICBAYnJpZWYgICAgU3lzdGVtIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICoKKyAgQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAjIyMjIyBTeXN0ZW0gQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgICAgU3lzdGVtLCBBSEIgYW5kIEFQQiBidXNlcyBjbG9ja3MgY29uZmlndXJhdGlvbgorCisgICAgICAgICAoKykgVGhlIG1heGltdW0gZnJlcXVlbmN5IG9mIHRoZSBTWVNDTEssIEhDTEssIFBDTEsxIGFuZCBQQ0xLMiBpcyA3MjAwMDAwMCBIei4KKyAgQGVuZHZlcmJhdGltCisgIEBpbnRlcm5hbAorICAgICAgICAgICAgIERlcGVuZGluZyBvbiB0aGUgU1lTQ0xLIGZyZXF1ZW5jeSwgdGhlIGZsYXNoIGxhdGVuY3kgc2hvdWxkIGJlIGFkYXB0ZWQgYWNjb3JkaW5nbHk6CisgICAgICAgICAgICAgKCsrKSArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgKCsrKSB8IExhdGVuY3kgICAgICAgfCBTWVNDTEsgY2xvY2sgZnJlcXVlbmN5IChNSHopICB8CisgICAgICAgICAgICAgKCsrKSB8LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICAgICAgICAgKCsrKSB8MFdTKDFDUFUgY3ljbGUpfCAgICAgICAwIDwgU1lTQ0xLIDw9IDI0ICAgICAgICB8CisgICAgICAgICAgICAgKCsrKSB8LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICAgICAgICAgKCsrKSB8MVdTKDJDUFUgY3ljbGUpfCAgICAgIDI0IDwgU1lTQ0xLIDw9IDQ4ICAgICAgICB8CisgICAgICAgICAgICAgKCsrKSB8LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICAgICAgICAgKCsrKSB8MldTKDNDUFUgY3ljbGUpfCAgICAgIDQ4IDwgU1lTQ0xLIDw9IDcyICAgICAgICB8CisgICAgICAgICAgICAgKCsrKSArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIEBlbmRpbnRlcm5hbAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBzZXRzIGRpcmVjdGx5IFN5c3RlbUNvcmVDbG9jayBDTVNJUyB2YXJpYWJsZS4KKyAgKiBAbm90ZSAgIFZhcmlhYmxlIGNhbiBiZSBjYWxjdWxhdGVkIGFsc28gdGhyb3VnaCBTeXN0ZW1Db3JlQ2xvY2tVcGRhdGUgZnVuY3Rpb24uCisgICogQHBhcmFtICBIQ0xLRnJlcXVlbmN5IEhDTEsgZnJlcXVlbmN5IGluIEh6IChjYW4gYmUgY2FsY3VsYXRlZCB0aGFua3MgdG8gUkNDIGhlbHBlciBtYWNybykKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfU2V0U3lzdGVtQ29yZUNsb2NrKHVpbnQzMl90IEhDTEtGcmVxdWVuY3kpCit7CisgIC8qIEhDTEsgY2xvY2sgZnJlcXVlbmN5ICovCisgIFN5c3RlbUNvcmVDbG9jayA9IEhDTEtGcmVxdWVuY3k7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIHN5c3RlbSBjbG9jayB3aXRoIEhTSSBhcyBjbG9jayBzb3VyY2Ugb2YgdGhlIFBMTAorICAqIEBub3RlICAgVGhlIGFwcGxpY2F0aW9uIG5lZWQgdG8gZW5zdXJlIHRoYXQgUExMIGlzIGRpc2FibGVkLgorICAqIEBub3RlICAgRnVuY3Rpb24gaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBmb3JtdWxhOgorICAqICAgICAgICAgLSBQTEwgb3V0cHV0IGZyZXF1ZW5jeSA9ICgoSFNJIGZyZXF1ZW5jeSAvIFBSRURJVikgKiBQTExNVUwpCisgICogICAgICAgICAtIFBSRURJVjogU2V0IHRvIDIgZm9yIGZldyBkZXZpY2VzCisgICogICAgICAgICAtIFBMTE1VTDogVGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIG11c3Qgc2V0IGNvcnJlY3RseSB0aGUgUExMIG11bHRpcGxpY2F0aW9uIGZhY3RvciB0byAKKyAgKiAgICAgICAgICAgICAgICAgICBub3QgZXhjZWVkIDcyTUh6CisgICogQG5vdGUgICBGTEFTSCBsYXRlbmN5IGNhbiBiZSBtb2RpZmllZCB0aHJvdWdoIHRoaXMgZnVuY3Rpb24uIAorICAqIEBwYXJhbSAgVVRJTFNfUExMSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9VVElMU19QTExJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIFBMTC4KKyAgKiBAcGFyYW0gIFVUSUxTX0Nsa0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVVRJTFNfQ2xrSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBCVVMgcHJlc2NhbGVycy4KKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogTWF4IGZyZXF1ZW5jeSBjb25maWd1cmF0aW9uIGRvbmUKKyAgKiAgICAgICAgICAtIEVSUk9SOiBNYXggZnJlcXVlbmN5IGNvbmZpZ3VyYXRpb24gbm90IGRvbmUKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1BMTF9Db25maWdTeXN0ZW1DbG9ja19IU0koTExfVVRJTFNfUExMSW5pdFR5cGVEZWYgKlVUSUxTX1BMTEluaXRTdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX1VUSUxTX0Nsa0luaXRUeXBlRGVmICpVVElMU19DbGtJbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworICB1aW50MzJfdCBwbGxmcmVxID0gMFU7CisKKyAgLyogQ2hlY2sgaWYgb25lIG9mIHRoZSBQTEwgaXMgZW5hYmxlZCAqLworICBpZiAoVVRJTFNfUExMX0lzQnVzeSgpID09IFNVQ0NFU1MpCisgIHsKKyNpZiBkZWZpbmVkKFJDQ19QTExTUkNfUFJFRElWMV9TVVBQT1JUKQorICAgIC8qIENoZWNrIFBSRURJViB2YWx1ZSAqLworICAgIGFzc2VydF9wYXJhbShJU19MTF9VVElMU19QUkVESVZfVkFMVUUoVVRJTFNfUExMSW5pdFN0cnVjdC0+UExMRGl2KSk7CisjZWxzZQorICAgIC8qIEZvcmNlIFBSRURJViB2YWx1ZSB0byAyICovCisgICAgVVRJTFNfUExMSW5pdFN0cnVjdC0+UHJlZGl2ID0gTExfUkNDX1BSRURJVl9ESVZfMjsKKyNlbmRpZiAvKlJDQ19QTExTUkNfUFJFRElWMV9TVVBQT1JUKi8KKyAgICAvKiBDYWxjdWxhdGUgdGhlIG5ldyBQTEwgb3V0cHV0IGZyZXF1ZW5jeSAqLworICAgIHBsbGZyZXEgPSBVVElMU19HZXRQTExPdXRwdXRGcmVxdWVuY3koSFNJX1ZBTFVFLCBVVElMU19QTExJbml0U3RydWN0KTsKKworICAgIC8qIEVuYWJsZSBIU0kgaWYgbm90IGVuYWJsZWQgKi8KKyAgICBpZiAoTExfUkNDX0hTSV9Jc1JlYWR5KCkgIT0gMVUpCisgICAgeworICAgICAgTExfUkNDX0hTSV9FbmFibGUoKTsKKyAgICAgIHdoaWxlIChMTF9SQ0NfSFNJX0lzUmVhZHkoKSAhPSAxVSkKKyAgICAgIHsKKyAgICAgICAgLyogV2FpdCBmb3IgSFNJIHJlYWR5ICovCisgICAgICB9CisgICAgfQorCisgICAgLyogQ29uZmlndXJlIFBMTCAqLworI2lmIGRlZmluZWQoUkNDX1BMTFNSQ19QUkVESVYxX1NVUFBPUlQpCisgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fU1lTKExMX1JDQ19QTExTT1VSQ0VfSFNJLCBVVElMU19QTExJbml0U3RydWN0LT5QTExNdWwsIFVUSUxTX1BMTEluaXRTdHJ1Y3QtPlBMTERpdik7CisjZWxzZQorICAgIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1NZUyhMTF9SQ0NfUExMU09VUkNFX0hTSV9ESVZfMiwgVVRJTFNfUExMSW5pdFN0cnVjdC0+UExMTXVsKTsKKyNlbmRpZiAvKlJDQ19QTExTUkNfUFJFRElWMV9TVVBQT1JUKi8KKworICAgIC8qIEVuYWJsZSBQTEwgYW5kIHN3aXRjaCBzeXN0ZW0gY2xvY2sgdG8gUExMICovCisgICAgc3RhdHVzID0gVVRJTFNfRW5hYmxlUExMQW5kU3dpdGNoU3lzdGVtKHBsbGZyZXEsIFVUSUxTX0Nsa0luaXRTdHJ1Y3QpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIEN1cnJlbnQgUExMIGNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIG1vZGlmaWVkICovCisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyBzeXN0ZW0gY2xvY2sgd2l0aCBIU0UgYXMgY2xvY2sgc291cmNlIG9mIHRoZSBQTEwKKyAgKiBAbm90ZSAgIFRoZSBhcHBsaWNhdGlvbiBuZWVkIHRvIGVuc3VyZSB0aGF0IFBMTCBpcyBkaXNhYmxlZC4KKyAgKiBAbm90ZSAgIEZ1bmN0aW9uIGlzIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgZm9ybXVsYToKKyAgKiAgICAgICAgIC0gUExMIG91dHB1dCBmcmVxdWVuY3kgPSAoKEhTSSBmcmVxdWVuY3kgLyBQUkVESVYpICogUExMTVVMKQorICAqICAgICAgICAgLSBQUkVESVY6IFNldCB0byAyIGZvciBmZXcgZGV2aWNlcworICAqICAgICAgICAgLSBQTExNVUw6IFRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBtdXN0IHNldCBjb3JyZWN0bHkgdGhlIFBMTCBtdWx0aXBsaWNhdGlvbiBmYWN0b3IgdG8gCisgICogICAgICAgICAgICAgICAgICAgbm90IGV4Y2VlZCBAcmVmIFVUSUxTX1BMTF9PVVRQVVRfTUFYCisgICogQG5vdGUgICBGTEFTSCBsYXRlbmN5IGNhbiBiZSBtb2RpZmllZCB0aHJvdWdoIHRoaXMgZnVuY3Rpb24uIAorICAqIEBwYXJhbSAgSFNFRnJlcXVlbmN5IFZhbHVlIGJldHdlZW4gTWluX0RhdGEgPSA0MDAwMDAwIGFuZCBNYXhfRGF0YSA9IDMyMDAwMDAwCisgICogQHBhcmFtICBIU0VCeXBhc3MgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VVElMU19IU0VCWVBBU1NfT04KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VVElMU19IU0VCWVBBU1NfT0ZGCisgICogQHBhcmFtICBVVElMU19QTExJbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1VUSUxTX1BMTEluaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgUExMLgorICAqIEBwYXJhbSAgVVRJTFNfQ2xrSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9VVElMU19DbGtJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIEJVUyBwcmVzY2FsZXJzLgorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBNYXggZnJlcXVlbmN5IGNvbmZpZ3VyYXRpb24gZG9uZQorICAqICAgICAgICAgIC0gRVJST1I6IE1heCBmcmVxdWVuY3kgY29uZmlndXJhdGlvbiBub3QgZG9uZQorICAqLworRXJyb3JTdGF0dXMgTExfUExMX0NvbmZpZ1N5c3RlbUNsb2NrX0hTRSh1aW50MzJfdCBIU0VGcmVxdWVuY3ksIHVpbnQzMl90IEhTRUJ5cGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfVVRJTFNfUExMSW5pdFR5cGVEZWYgKlVUSUxTX1BMTEluaXRTdHJ1Y3QsIExMX1VUSUxTX0Nsa0luaXRUeXBlRGVmICpVVElMU19DbGtJbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworICB1aW50MzJfdCBwbGxmcmVxID0gMFU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1VUSUxTX0hTRV9GUkVRVUVOQ1koSFNFRnJlcXVlbmN5KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9VVElMU19IU0VfQllQQVNTKEhTRUJ5cGFzcykpOworCisgIC8qIENoZWNrIGlmIG9uZSBvZiB0aGUgUExMIGlzIGVuYWJsZWQgKi8KKyAgaWYgKFVUSUxTX1BMTF9Jc0J1c3koKSA9PSBTVUNDRVNTKQorICB7CisgICAgLyogQ2hlY2sgUFJFRElWIHZhbHVlICovCisjaWYgZGVmaW5lZChSQ0NfUExMU1JDX1BSRURJVjFfU1VQUE9SVCkKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfVVRJTFNfUFJFRElWX1ZBTFVFKFVUSUxTX1BMTEluaXRTdHJ1Y3QtPlBMTERpdikpOworI2Vsc2UKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfVVRJTFNfUFJFRElWX1ZBTFVFKFVUSUxTX1BMTEluaXRTdHJ1Y3QtPlByZWRpdikpOworI2VuZGlmIC8qUkNDX1BMTFNSQ19QUkVESVYxX1NVUFBPUlQqLworCisgICAgLyogQ2FsY3VsYXRlIHRoZSBuZXcgUExMIG91dHB1dCBmcmVxdWVuY3kgKi8KKyAgICBwbGxmcmVxID0gVVRJTFNfR2V0UExMT3V0cHV0RnJlcXVlbmN5KEhTRUZyZXF1ZW5jeSwgVVRJTFNfUExMSW5pdFN0cnVjdCk7CisKKyAgICAvKiBFbmFibGUgSFNFIGlmIG5vdCBlbmFibGVkICovCisgICAgaWYgKExMX1JDQ19IU0VfSXNSZWFkeSgpICE9IDFVKQorICAgIHsKKyAgICAgIC8qIENoZWNrIGlmIG5lZWQgdG8gZW5hYmxlIEhTRSBieXBhc3MgZmVhdHVyZSBvciBub3QgKi8KKyAgICAgIGlmIChIU0VCeXBhc3MgPT0gTExfVVRJTFNfSFNFQllQQVNTX09OKQorICAgICAgeworICAgICAgICBMTF9SQ0NfSFNFX0VuYWJsZUJ5cGFzcygpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBMTF9SQ0NfSFNFX0Rpc2FibGVCeXBhc3MoKTsKKyAgICAgIH0KKworICAgICAgLyogRW5hYmxlIEhTRSAqLworICAgICAgTExfUkNDX0hTRV9FbmFibGUoKTsKKyAgICAgIHdoaWxlIChMTF9SQ0NfSFNFX0lzUmVhZHkoKSAhPSAxVSkKKyAgICAgIHsKKyAgICAgICAgLyogV2FpdCBmb3IgSFNFIHJlYWR5ICovCisgICAgICB9CisgICAgfQorCisgICAgICAvKiBDb25maWd1cmUgUExMICovCisjaWYgZGVmaW5lZChSQ0NfUExMU1JDX1BSRURJVjFfU1VQUE9SVCkKKyAgICAgIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1NZUyhMTF9SQ0NfUExMU09VUkNFX0hTRSwgVVRJTFNfUExMSW5pdFN0cnVjdC0+UExMTXVsLCBVVElMU19QTExJbml0U3RydWN0LT5QTExEaXYpOworI2Vsc2UKKyAgICBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl9TWVMoKFJDQ19DRkdSX1BMTFNSQ19IU0VfUFJFRElWIHwgVVRJTFNfUExMSW5pdFN0cnVjdC0+UHJlZGl2KSwgVVRJTFNfUExMSW5pdFN0cnVjdC0+UExMTXVsKTsKKyNlbmRpZiAvKlJDQ19QTExTUkNfUFJFRElWMV9TVVBQT1JUKi8KKworICAgIC8qIEVuYWJsZSBQTEwgYW5kIHN3aXRjaCBzeXN0ZW0gY2xvY2sgdG8gUExMICovCisgICAgc3RhdHVzID0gVVRJTFNfRW5hYmxlUExMQW5kU3dpdGNoU3lzdGVtKHBsbGZyZXEsIFVUSUxTX0Nsa0luaXRTdHJ1Y3QpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIEN1cnJlbnQgUExMIGNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIG1vZGlmaWVkICovCisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVVRJTFNfTExfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBVcGRhdGUgbnVtYmVyIG9mIEZsYXNoIHdhaXQgc3RhdGVzIGluIGxpbmUgd2l0aCBuZXcgZnJlcXVlbmN5IGFuZCBjdXJyZW50CisgICAgICAgICAgICB2b2x0YWdlIHJhbmdlLgorICAqIEBwYXJhbSAgRnJlcXVlbmN5ICBTWVNDTEsgZnJlcXVlbmN5CisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IExhdGVuY3kgaGFzIGJlZW4gbW9kaWZpZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBMYXRlbmN5IGNhbm5vdCBiZSBtb2RpZmllZAorICAqLworI2lmIGRlZmluZWQoRkxBU0hfQUNSX0xBVEVOQ1kpCitzdGF0aWMgRXJyb3JTdGF0dXMgVVRJTFNfU2V0Rmxhc2hMYXRlbmN5KHVpbnQzMl90IEZyZXF1ZW5jeSkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gU1VDQ0VTUzsKKworICB1aW50MzJfdCBsYXRlbmN5ID0gTExfRkxBU0hfTEFURU5DWV8wOyAgLyogZGVmYXVsdCB2YWx1ZSAwV1MgKi8KKworICAvKiBGcmVxdWVuY3kgY2Fubm90IGJlIGVxdWFsIHRvIDAgKi8KKyAgaWYgKEZyZXF1ZW5jeSA9PSAwVSkKKyAgeworICAgIHN0YXR1cyA9IEVSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIGlmIChGcmVxdWVuY3kgPiBVVElMU19MQVRFTkNZMl9GUkVRKQorICAgIHsKKyAgICAgIC8qIDQ4IDwgU1lTQ0xLIDw9IDcyID0+IDJXUyAoMyBDUFUgY3ljbGVzKSAqLworICAgICAgbGF0ZW5jeSA9IExMX0ZMQVNIX0xBVEVOQ1lfMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChGcmVxdWVuY3kgPiBVVElMU19MQVRFTkNZMV9GUkVRKQorICAgICAgeworICAgICAgICAvKiAyNCA8IFNZU0NMSyA8PSA0OCA9PiAxV1MgKDIgQ1BVIGN5Y2xlcykgKi8KKyAgICAgICAgbGF0ZW5jeSA9IExMX0ZMQVNIX0xBVEVOQ1lfMTsKKyAgICAgIH0KKyAgICAgIC8qIGVsc2UgU1lTQ0xLIDwgMjRNSHogZGVmYXVsdCBMTF9GTEFTSF9MQVRFTkNZXzAgMFdTICovCisgICAgfQorCisgICAgTExfRkxBU0hfU2V0TGF0ZW5jeShsYXRlbmN5KTsKKworICAgIC8qIENoZWNrIHRoYXQgdGhlIG5ldyBudW1iZXIgb2Ygd2FpdCBzdGF0ZXMgaXMgdGFrZW4gaW50byBhY2NvdW50IHRvIGFjY2VzcyB0aGUgRmxhc2gKKyAgICAgICBtZW1vcnkgYnkgcmVhZGluZyB0aGUgRkxBU0hfQUNSIHJlZ2lzdGVyICovCisgICAgaWYgKExMX0ZMQVNIX0dldExhdGVuY3koKSAhPSBsYXRlbmN5KQorICAgIHsKKyAgICAgIHN0YXR1cyA9IEVSUk9SOworICAgIH0KKyAgfQorICByZXR1cm4gc3RhdHVzOworfQorI2VuZGlmIC8qIEZMQVNIX0FDUl9MQVRFTkNZICovCisKKy8qKgorICAqIEBicmllZiAgRnVuY3Rpb24gdG8gY2hlY2sgdGhhdCBQTEwgY2FuIGJlIG1vZGlmaWVkCisgICogQHBhcmFtICBQTExfSW5wdXRGcmVxdWVuY3kgIFBMTCBpbnB1dCBmcmVxdWVuY3kgKGluIEh6KQorICAqIEBwYXJhbSAgVVRJTFNfUExMSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9VVElMU19QTExJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIFBMTC4KKyAgKiBAcmV0dmFsIFBMTCBvdXRwdXQgZnJlcXVlbmN5IChpbiBIeikKKyAgKi8KK3N0YXRpYyB1aW50MzJfdCBVVElMU19HZXRQTExPdXRwdXRGcmVxdWVuY3kodWludDMyX3QgUExMX0lucHV0RnJlcXVlbmN5LCBMTF9VVElMU19QTExJbml0VHlwZURlZiAqVVRJTFNfUExMSW5pdFN0cnVjdCkKK3sKKyAgdWludDMyX3QgcGxsZnJlcSA9IDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MTF9VVElMU19QTExNVUxfVkFMVUUoVVRJTFNfUExMSW5pdFN0cnVjdC0+UExMTXVsKSk7CisKKyAgLyogQ2hlY2sgZGlmZmVyZW50IFBMTCBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBSTSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIG11c3Qgc2V0IGNvcnJlY3RseSB0aGUgUExMIG11bHRpcGxpY2F0aW9uIGZhY3RvciB0byAKKyAgICAgbm90IGV4Y2VlZCBAcmVmIFVUSUxTX1BMTF9PVVRQVVRfTUFYICovCisjaWYgZGVmaW5lZChSQ0NfUExMU1JDX1BSRURJVjFfU1VQUE9SVCkKKyAgcGxsZnJlcSA9IF9fTExfUkNDX0NBTENfUExMQ0xLX0ZSRVEoUExMX0lucHV0RnJlcXVlbmN5LCBVVElMU19QTExJbml0U3RydWN0LT5QTExNdWwsIFVUSUxTX1BMTEluaXRTdHJ1Y3QtPlBMTERpdik7CisjZWxzZQorICBwbGxmcmVxID0gX19MTF9SQ0NfQ0FMQ19QTExDTEtfRlJFUShQTExfSW5wdXRGcmVxdWVuY3kgLyAoVVRJTFNfUExMSW5pdFN0cnVjdC0+UHJlZGl2ICsgMVUpLCBVVElMU19QTExJbml0U3RydWN0LT5QTExNdWwpOworI2VuZGlmIC8qUkNDX1BMTFNSQ19QUkVESVYxX1NVUFBPUlQqLworICBhc3NlcnRfcGFyYW0oSVNfTExfVVRJTFNfUExMX0ZSRVFVRU5DWShwbGxmcmVxKSk7CisKKyAgcmV0dXJuIHBsbGZyZXE7Cit9CisKKy8qKgorICAqIEBicmllZiAgRnVuY3Rpb24gdG8gY2hlY2sgdGhhdCBQTEwgY2FuIGJlIG1vZGlmaWVkCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFBMTCBtb2RpZmljYXRpb24gY2FuIGJlIGRvbmUKKyAgKiAgICAgICAgICAtIEVSUk9SOiBQTEwgaXMgYnVzeQorICAqLworc3RhdGljIEVycm9yU3RhdHVzIFVUSUxTX1BMTF9Jc0J1c3kodm9pZCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gU1VDQ0VTUzsKKworICAvKiBDaGVjayBpZiBQTEwgaXMgYnVzeSovCisgIGlmIChMTF9SQ0NfUExMX0lzUmVhZHkoKSAhPSAwVSkKKyAgeworICAgIC8qIFBMTCBjb25maWd1cmF0aW9uIGNhbm5vdCBiZSBtb2RpZmllZCAqLworICAgIHN0YXR1cyA9IEVSUk9SOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBGdW5jdGlvbiB0byBlbmFibGUgUExMIGFuZCBzd2l0Y2ggc3lzdGVtIGNsb2NrIHRvIFBMTAorICAqIEBwYXJhbSAgU1lTQ0xLX0ZyZXF1ZW5jeSBTWVNDTEsgZnJlcXVlbmN5CisgICogQHBhcmFtICBVVElMU19DbGtJbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1VUSUxTX0Nsa0luaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgQlVTIHByZXNjYWxlcnMuCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IE5vIHByb2JsZW0gdG8gc3dpdGNoIHN5c3RlbSB0byBQTEwKKyAgKiAgICAgICAgICAtIEVSUk9SOiBQcm9ibGVtIHRvIHN3aXRjaCBzeXN0ZW0gdG8gUExMCisgICovCitzdGF0aWMgRXJyb3JTdGF0dXMgVVRJTFNfRW5hYmxlUExMQW5kU3dpdGNoU3lzdGVtKHVpbnQzMl90IFNZU0NMS19GcmVxdWVuY3ksIExMX1VUSUxTX0Nsa0luaXRUeXBlRGVmICpVVElMU19DbGtJbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworICB1aW50MzJfdCBzeXNjbGtfZnJlcXVlbmN5X2N1cnJlbnQgPSAwVTsKKworICBhc3NlcnRfcGFyYW0oSVNfTExfVVRJTFNfU1lTQ0xLX0RJVihVVElMU19DbGtJbml0U3RydWN0LT5BSEJDTEtEaXZpZGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9VVElMU19BUEIxX0RJVihVVElMU19DbGtJbml0U3RydWN0LT5BUEIxQ0xLRGl2aWRlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVVRJTFNfQVBCMl9ESVYoVVRJTFNfQ2xrSW5pdFN0cnVjdC0+QVBCMkNMS0RpdmlkZXIpKTsKKworICAvKiBDYWxjdWxhdGUgY3VycmVudCBTWVNDTEsgZnJlcXVlbmN5ICovCisgIHN5c2Nsa19mcmVxdWVuY3lfY3VycmVudCA9IChTeXN0ZW1Db3JlQ2xvY2sgPDwgQUhCUHJlc2NUYWJsZVtMTF9SQ0NfR2V0QUhCUHJlc2NhbGVyKCkgPj4gUkNDX1BPU0lUSU9OX0hQUkVdKTsKKworICAvKiBJbmNyZWFzaW5nIHRoZSBudW1iZXIgb2Ygd2FpdCBzdGF0ZXMgYmVjYXVzZSBvZiBoaWdoZXIgQ1BVIGZyZXF1ZW5jeSAqLworICBpZiAoc3lzY2xrX2ZyZXF1ZW5jeV9jdXJyZW50IDwgU1lTQ0xLX0ZyZXF1ZW5jeSkKKyAgeworICAgIC8qIFNldCBGTEFTSCBsYXRlbmN5IHRvIGhpZ2hlc3QgbGF0ZW5jeSAqLworICAgIHN0YXR1cyA9IFVUSUxTX1NldEZsYXNoTGF0ZW5jeShTWVNDTEtfRnJlcXVlbmN5KTsKKyAgfQorCisgIC8qIFVwZGF0ZSBzeXN0ZW0gY2xvY2sgY29uZmlndXJhdGlvbiAqLworICBpZiAoc3RhdHVzID09IFNVQ0NFU1MpCisgIHsKKyAgICAvKiBFbmFibGUgUExMICovCisgICAgTExfUkNDX1BMTF9FbmFibGUoKTsKKyAgICB3aGlsZSAoTExfUkNDX1BMTF9Jc1JlYWR5KCkgIT0gMVUpCisgICAgeworICAgICAgLyogV2FpdCBmb3IgUExMIHJlYWR5ICovCisgICAgfQorCisgICAgLyogU3lzY2xrIGFjdGl2YXRpb24gb24gdGhlIG1haW4gUExMICovCisgICAgTExfUkNDX1NldEFIQlByZXNjYWxlcihVVElMU19DbGtJbml0U3RydWN0LT5BSEJDTEtEaXZpZGVyKTsKKyAgICBMTF9SQ0NfU2V0U3lzQ2xrU291cmNlKExMX1JDQ19TWVNfQ0xLU09VUkNFX1BMTCk7CisgICAgd2hpbGUgKExMX1JDQ19HZXRTeXNDbGtTb3VyY2UoKSAhPSBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9TVEFUVVNfUExMKQorICAgIHsKKyAgICAgIC8qIFdhaXQgZm9yIHN5c3RlbSBjbG9jayBzd2l0Y2ggdG8gUExMICovCisgICAgfQorCisgICAgLyogU2V0IEFQQjEgJiBBUEIyIHByZXNjYWxlciovCisgICAgTExfUkNDX1NldEFQQjFQcmVzY2FsZXIoVVRJTFNfQ2xrSW5pdFN0cnVjdC0+QVBCMUNMS0RpdmlkZXIpOworICAgIExMX1JDQ19TZXRBUEIyUHJlc2NhbGVyKFVUSUxTX0Nsa0luaXRTdHJ1Y3QtPkFQQjJDTEtEaXZpZGVyKTsKKyAgfQorCisgIC8qIERlY3JlYXNpbmcgdGhlIG51bWJlciBvZiB3YWl0IHN0YXRlcyBiZWNhdXNlIG9mIGxvd2VyIENQVSBmcmVxdWVuY3kgKi8KKyAgaWYgKHN5c2Nsa19mcmVxdWVuY3lfY3VycmVudCA+IFNZU0NMS19GcmVxdWVuY3kpCisgIHsKKyAgICAvKiBTZXQgRkxBU0ggbGF0ZW5jeSB0byBsb3dlc3QgbGF0ZW5jeSAqLworICAgIHN0YXR1cyA9IFVUSUxTX1NldEZsYXNoTGF0ZW5jeShTWVNDTEtfRnJlcXVlbmN5KTsKKyAgfQorCisgIC8qIFVwZGF0ZSBTeXN0ZW1Db3JlQ2xvY2sgdmFyaWFibGUgKi8KKyAgaWYgKHN0YXR1cyA9PSBTVUNDRVNTKQorICB7CisgICAgTExfU2V0U3lzdGVtQ29yZUNsb2NrKF9fTExfUkNDX0NBTENfSENMS19GUkVRKFNZU0NMS19GcmVxdWVuY3ksIFVUSUxTX0Nsa0luaXRTdHJ1Y3QtPkFIQkNMS0RpdmlkZXIpKTsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9faHRtcmVzYy9taW5pLXN0LmNzcyBiL19odG1yZXNjL21pbmktc3QuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZmJjMTQKLS0tIC9kZXYvbnVsbAorKysgYi9faHRtcmVzYy9taW5pLXN0LmNzcwpAQCAtMCwwICsxLDE3MDAgQEAKK0BjaGFyc2V0ICJVVEYtOCI7CisvKgorICBGbGF2b3IgbmFtZTogRGVmYXVsdCAobWluaS1kZWZhdWx0KQorICBBdXRob3I6IEFuZ2Vsb3MgQ2hhbGFyaXMgKGNoYWxhcmFuZ2Vsb0BnbWFpbC5jb20pCisgIE1haW50YWluZXJzOiBBbmdlbG9zIENoYWxhcmlzCisgIG1pbmkuY3NzIHZlcnNpb246IHYzLjAuMC1hbHBoYS4zCisqLworLyoKKyAgQnJvd3NlcnMgcmVzZXRzIGFuZCBiYXNlIHR5cG9ncmFwaHkuCisqLworLyogQ29yZSBtb2R1bGUgQ1NTIHZhcmlhYmxlIGRlZmluaXRpb25zICovCis6cm9vdCB7CisgIC0tZm9yZS1jb2xvcjogIzExMTsKKyAgLS1zZWNvbmRhcnktZm9yZS1jb2xvcjogIzQ0NDsKKyAgLS1iYWNrLWNvbG9yOiAjZjhmOGY4OworICAtLXNlY29uZGFyeS1iYWNrLWNvbG9yOiAjZjBmMGYwOworICAtLWJsb2NrcXVvdGUtY29sb3I6ICNmNTdjMDA7CisgIC0tcHJlLWNvbG9yOiAjMTU2NWMwOworICAtLWJvcmRlci1jb2xvcjogI2FhYTsKKyAgLS1zZWNvbmRhcnktYm9yZGVyLWNvbG9yOiAjZGRkOworICAtLWhlYWRpbmctcmF0aW86IDEuMTk7CisgIC0tdW5pdmVyc2FsLW1hcmdpbjogMC41cmVtOworICAtLXVuaXZlcnNhbC1wYWRkaW5nOiAwLjEyNXJlbTsKKyAgLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1czogMC4xMjVyZW07CisgIC0tYS1saW5rLWNvbG9yOiAjMDI3N2JkOworICAtLWEtdmlzaXRlZC1jb2xvcjogIzAxNTc5YjsgfQorCitodG1sIHsKKyAgZm9udC1zaXplOiAxNHB4OyB9CisKK2EsIGIsIGRlbCwgZW0sIGksIGlucywgcSwgc3Bhbiwgc3Ryb25nLCB1IHsKKyAgZm9udC1zaXplOiAxZW07IH0KKworaHRtbCwgKiB7CisgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICJTZWdvZSBVSSIsIFJvYm90bywgVWJ1bnR1LCAiSGVsdmV0aWNhIE5ldWUiLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CisgIGxpbmUtaGVpZ2h0OiAxLjQ7CisgIC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogMTAwJTsgfQorCisqIHsKKyAgZm9udC1zaXplOiAxcmVtOyB9CisKK2JvZHkgeworICBtYXJnaW46IDA7CisgIGNvbG9yOiB2YXIoLS1mb3JlLWNvbG9yKTsKKyAgYmFja2dyb3VuZDogdmFyKC0tYmFjay1jb2xvcik7IH0KKworZGV0YWlscyB7CisgIGRpc3BsYXk6IGJsb2NrOyB9CisKK3N1bW1hcnkgeworICBkaXNwbGF5OiBsaXN0LWl0ZW07IH0KKworYWJiclt0aXRsZV0geworICBib3JkZXItYm90dG9tOiBub25lOworICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSBkb3R0ZWQ7IH0KKworaW5wdXQgeworICBvdmVyZmxvdzogdmlzaWJsZTsgfQorCitpbWcgeworICBtYXgtd2lkdGg6IDEwMCU7CisgIGhlaWdodDogYXV0bzsgfQorCitoMSwgaDIsIGgzLCBoNCwgaDUsIGg2IHsKKyAgbGluZS1oZWlnaHQ6IDEuMjsKKyAgbWFyZ2luOiBjYWxjKDEuNSAqIHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pKSB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsKKyAgZm9udC13ZWlnaHQ6IDUwMDsgfQorICBoMSBzbWFsbCwgaDIgc21hbGwsIGgzIHNtYWxsLCBoNCBzbWFsbCwgaDUgc21hbGwsIGg2IHNtYWxsIHsKKyAgICBjb2xvcjogdmFyKC0tc2Vjb25kYXJ5LWZvcmUtY29sb3IpOworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIG1hcmdpbi10b3A6IC0wLjI1cmVtOyB9CisKK2gxIHsKKyAgZm9udC1zaXplOiBjYWxjKDFyZW0gKiB2YXIoLS1oZWFkaW5nLXJhdGlvKSAqIHZhcigtLWhlYWRpbmctcmF0aW8pICogdmFyKC0taGVhZGluZy1yYXRpbykpOyB9CisKK2gyIHsKKyAgZm9udC1zaXplOiBjYWxjKDFyZW0gKiB2YXIoLS1oZWFkaW5nLXJhdGlvKSAqIHZhcigtLWhlYWRpbmctcmF0aW8pOyApOworICBiYWNrZ3JvdW5kOiB2YXIoLS1tYXJrLWJhY2stY29sb3IpOworICBmb250LXdlaWdodDogNjAwOworICBwYWRkaW5nOiAwLjFlbSAwLjVlbSAwLjJlbSAwLjVlbTsKKyAgY29sb3I6IHZhcigtLW1hcmstZm9yZS1jb2xvcik7IH0KKworaDMgeworICBmb250LXNpemU6IGNhbGMoMXJlbSAqIHZhcigtLWhlYWRpbmctcmF0aW8pKTsKKyAgcGFkZGluZy1sZWZ0OiBjYWxjKDIgKiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSk7IAorICAvKiBiYWNrZ3JvdW5kOiB2YXIoLS1ib3JkZXItY29sb3IpOyAqLworICAgIH0KKworaDQgeworICBmb250LXNpemU6IDFyZW07KTsKKyAgcGFkZGluZy1sZWZ0OiBjYWxjKDQgKiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSk7ICB9CisKK2g1IHsKKyAgZm9udC1zaXplOiAxcmVtOyB9CisKK2g2IHsKKyAgZm9udC1zaXplOiBjYWxjKDFyZW0gLyB2YXIoLS1oZWFkaW5nLXJhdGlvKSk7IH0KKworcCB7CisgIG1hcmdpbjogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7IH0KKworb2wsIHVsIHsKKyAgbWFyZ2luOiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsKKyAgcGFkZGluZy1sZWZ0OiBjYWxjKDYgKiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSk7IH0KKworYiwgc3Ryb25nIHsKKyAgZm9udC13ZWlnaHQ6IDcwMDsgfQorCitociB7CisgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94OworICBib3JkZXI6IDA7CisgIGxpbmUtaGVpZ2h0OiAxLjI1ZW07CisgIG1hcmdpbjogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7CisgIGhlaWdodDogMC4wNjI1cmVtOworICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHRyYW5zcGFyZW50LCB2YXIoLS1ib3JkZXItY29sb3IpIDIwJSwgdmFyKC0tYm9yZGVyLWNvbG9yKSA4MCUsIHRyYW5zcGFyZW50KTsgfQorCitibG9ja3F1b3RlIHsKKyAgZGlzcGxheTogYmxvY2s7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgZm9udC1zdHlsZTogaXRhbGljOworICBjb2xvcjogdmFyKC0tc2Vjb25kYXJ5LWZvcmUtY29sb3IpOworICBtYXJnaW46IHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOworICBwYWRkaW5nOiBjYWxjKDMgKiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykpOworICBib3JkZXI6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1zZWNvbmRhcnktYm9yZGVyLWNvbG9yKTsKKyAgYm9yZGVyLWxlZnQ6IDAuMzc1cmVtIHNvbGlkIHZhcigtLWJsb2NrcXVvdGUtY29sb3IpOworICBib3JkZXItcmFkaXVzOiAwIHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKSB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cykgMDsgfQorICBibG9ja3F1b3RlOmJlZm9yZSB7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDogY2FsYygwcmVtIC0gdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKTsKKyAgICBsZWZ0OiAwOworICAgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOworICAgIGZvbnQtc2l6ZTogM3JlbTsKKyAgICBmb250LXdlaWdodDogNzAwOworICAgIGNvbnRlbnQ6ICJcMjAxYyI7CisgICAgY29sb3I6IHZhcigtLWJsb2NrcXVvdGUtY29sb3IpOyB9CisgIGJsb2NrcXVvdGVbY2l0ZV06YWZ0ZXIgeworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXNpemU6IDAuNzVlbTsKKyAgICBmb250LXdlaWdodDogNzAwOworICAgIGNvbnRlbnQ6ICJcYeKAlCAgIiBhdHRyKGNpdGUpOworICAgIHdoaXRlLXNwYWNlOiBwcmU7IH0KKworY29kZSwga2JkLCBwcmUsIHNhbXAgeworICBmb250LWZhbWlseTogTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2U7CisgIGZvbnQtc2l6ZTogMC44NWVtOyB9CisKK2NvZGUgeworICBiYWNrZ3JvdW5kOiB2YXIoLS1zZWNvbmRhcnktYmFjay1jb2xvcik7CisgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKTsKKyAgcGFkZGluZzogY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyA0KSBjYWxjKHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDIpOyB9CisKK2tiZCB7CisgIGJhY2tncm91bmQ6IHZhcigtLWZvcmUtY29sb3IpOworICBjb2xvcjogdmFyKC0tYmFjay1jb2xvcik7CisgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKTsKKyAgcGFkZGluZzogY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyA0KSBjYWxjKHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDIpOyB9CisKK3ByZSB7CisgIG92ZXJmbG93OiBhdXRvOworICBiYWNrZ3JvdW5kOiB2YXIoLS1zZWNvbmRhcnktYmFjay1jb2xvcik7CisgIHBhZGRpbmc6IGNhbGMoMS41ICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKTsKKyAgbWFyZ2luOiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsKKyAgYm9yZGVyOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tc2Vjb25kYXJ5LWJvcmRlci1jb2xvcik7CisgIGJvcmRlci1sZWZ0OiAwLjI1cmVtIHNvbGlkIHZhcigtLXByZS1jb2xvcik7CisgIGJvcmRlci1yYWRpdXM6IDAgdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpIHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKSAwOyB9CisKK3N1cCwgc3ViLCBjb2RlLCBrYmQgeworICBsaW5lLWhlaWdodDogMDsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7IH0KKworc21hbGwsIHN1cCwgc3ViLCBmaWdjYXB0aW9uIHsKKyAgZm9udC1zaXplOiAwLjc1ZW07IH0KKworc3VwIHsKKyAgdG9wOiAtMC41ZW07IH0KKworc3ViIHsKKyAgYm90dG9tOiAtMC4yNWVtOyB9CisKK2ZpZ3VyZSB7CisgIG1hcmdpbjogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7IH0KKworZmlnY2FwdGlvbiB7CisgIGNvbG9yOiB2YXIoLS1zZWNvbmRhcnktZm9yZS1jb2xvcik7IH0KKworYSB7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfQorICBhOmxpbmsgeworICAgIGNvbG9yOiB2YXIoLS1hLWxpbmstY29sb3IpOyB9CisgIGE6dmlzaXRlZCB7CisgICAgY29sb3I6IHZhcigtLWEtdmlzaXRlZC1jb2xvcik7IH0KKyAgYTpob3ZlciwgYTpmb2N1cyB7CisgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KKworLyoKKyAgRGVmaW5pdGlvbnMgZm9yIHRoZSBncmlkIHN5c3RlbSwgY2FyZHMgYW5kIGNvbnRhaW5lcnMuCisqLworLmNvbnRhaW5lciB7CisgIG1hcmdpbjogMCBhdXRvOworICBwYWRkaW5nOiAwIGNhbGMoMS41ICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKTsgfQorCisucm93IHsKKyAgYm94LXNpemluZzogYm9yZGVyLWJveDsKKyAgZGlzcGxheTogZmxleDsKKyAgZmxleDogMCAxIGF1dG87CisgIGZsZXgtZmxvdzogcm93IHdyYXA7IH0KKworLmNvbC1zbSwKK1tjbGFzc149J2NvbC1zbS0nXSwKK1tjbGFzc149J2NvbC1zbS1vZmZzZXQtJ10sCisucm93W2NsYXNzKj0nY29scy1zbS0nXSA+ICogeworICBib3gtc2l6aW5nOiBib3JkZXItYm94OworICBmbGV4OiAwIDAgYXV0bzsKKyAgcGFkZGluZzogMCBjYWxjKHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDIpOyB9CisKKy5jb2wtc20sCisucm93LmNvbHMtc20gPiAqIHsKKyAgbWF4LXdpZHRoOiAxMDAlOworICBmbGV4LWdyb3c6IDE7CisgIGZsZXgtYmFzaXM6IDA7IH0KKworLmNvbC1zbS0xLAorLnJvdy5jb2xzLXNtLTEgPiAqIHsKKyAgbWF4LXdpZHRoOiA4LjMzMzMzMzMzMzMlOworICBmbGV4LWJhc2lzOiA4LjMzMzMzMzMzMzMlOyB9CisKKy5jb2wtc20tb2Zmc2V0LTAgeworICBtYXJnaW4tbGVmdDogMDsgfQorCisuY29sLXNtLTIsCisucm93LmNvbHMtc20tMiA+ICogeworICBtYXgtd2lkdGg6IDE2LjY2NjY2NjY2NjclOworICBmbGV4LWJhc2lzOiAxNi42NjY2NjY2NjY3JTsgfQorCisuY29sLXNtLW9mZnNldC0xIHsKKyAgbWFyZ2luLWxlZnQ6IDguMzMzMzMzMzMzMyU7IH0KKworLmNvbC1zbS0zLAorLnJvdy5jb2xzLXNtLTMgPiAqIHsKKyAgbWF4LXdpZHRoOiAyNSU7CisgIGZsZXgtYmFzaXM6IDI1JTsgfQorCisuY29sLXNtLW9mZnNldC0yIHsKKyAgbWFyZ2luLWxlZnQ6IDE2LjY2NjY2NjY2NjclOyB9CisKKy5jb2wtc20tNCwKKy5yb3cuY29scy1zbS00ID4gKiB7CisgIG1heC13aWR0aDogMzMuMzMzMzMzMzMzMyU7CisgIGZsZXgtYmFzaXM6IDMzLjMzMzMzMzMzMzMlOyB9CisKKy5jb2wtc20tb2Zmc2V0LTMgeworICBtYXJnaW4tbGVmdDogMjUlOyB9CisKKy5jb2wtc20tNSwKKy5yb3cuY29scy1zbS01ID4gKiB7CisgIG1heC13aWR0aDogNDEuNjY2NjY2NjY2NyU7CisgIGZsZXgtYmFzaXM6IDQxLjY2NjY2NjY2NjclOyB9CisKKy5jb2wtc20tb2Zmc2V0LTQgeworICBtYXJnaW4tbGVmdDogMzMuMzMzMzMzMzMzMyU7IH0KKworLmNvbC1zbS02LAorLnJvdy5jb2xzLXNtLTYgPiAqIHsKKyAgbWF4LXdpZHRoOiA1MCU7CisgIGZsZXgtYmFzaXM6IDUwJTsgfQorCisuY29sLXNtLW9mZnNldC01IHsKKyAgbWFyZ2luLWxlZnQ6IDQxLjY2NjY2NjY2NjclOyB9CisKKy5jb2wtc20tNywKKy5yb3cuY29scy1zbS03ID4gKiB7CisgIG1heC13aWR0aDogNTguMzMzMzMzMzMzMyU7CisgIGZsZXgtYmFzaXM6IDU4LjMzMzMzMzMzMzMlOyB9CisKKy5jb2wtc20tb2Zmc2V0LTYgeworICBtYXJnaW4tbGVmdDogNTAlOyB9CisKKy5jb2wtc20tOCwKKy5yb3cuY29scy1zbS04ID4gKiB7CisgIG1heC13aWR0aDogNjYuNjY2NjY2NjY2NyU7CisgIGZsZXgtYmFzaXM6IDY2LjY2NjY2NjY2NjclOyB9CisKKy5jb2wtc20tb2Zmc2V0LTcgeworICBtYXJnaW4tbGVmdDogNTguMzMzMzMzMzMzMyU7IH0KKworLmNvbC1zbS05LAorLnJvdy5jb2xzLXNtLTkgPiAqIHsKKyAgbWF4LXdpZHRoOiA3NSU7CisgIGZsZXgtYmFzaXM6IDc1JTsgfQorCisuY29sLXNtLW9mZnNldC04IHsKKyAgbWFyZ2luLWxlZnQ6IDY2LjY2NjY2NjY2NjclOyB9CisKKy5jb2wtc20tMTAsCisucm93LmNvbHMtc20tMTAgPiAqIHsKKyAgbWF4LXdpZHRoOiA4My4zMzMzMzMzMzMzJTsKKyAgZmxleC1iYXNpczogODMuMzMzMzMzMzMzMyU7IH0KKworLmNvbC1zbS1vZmZzZXQtOSB7CisgIG1hcmdpbi1sZWZ0OiA3NSU7IH0KKworLmNvbC1zbS0xMSwKKy5yb3cuY29scy1zbS0xMSA+ICogeworICBtYXgtd2lkdGg6IDkxLjY2NjY2NjY2NjclOworICBmbGV4LWJhc2lzOiA5MS42NjY2NjY2NjY3JTsgfQorCisuY29sLXNtLW9mZnNldC0xMCB7CisgIG1hcmdpbi1sZWZ0OiA4My4zMzMzMzMzMzMzJTsgfQorCisuY29sLXNtLTEyLAorLnJvdy5jb2xzLXNtLTEyID4gKiB7CisgIG1heC13aWR0aDogMTAwJTsKKyAgZmxleC1iYXNpczogMTAwJTsgfQorCisuY29sLXNtLW9mZnNldC0xMSB7CisgIG1hcmdpbi1sZWZ0OiA5MS42NjY2NjY2NjY3JTsgfQorCisuY29sLXNtLW5vcm1hbCB7CisgIG9yZGVyOiBpbml0aWFsOyB9CisKKy5jb2wtc20tZmlyc3QgeworICBvcmRlcjogLTk5OTsgfQorCisuY29sLXNtLWxhc3QgeworICBvcmRlcjogOTk5OyB9CisKK0BtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDUwMHB4KSB7CisgIC5jb2wtbWQsCisgIFtjbGFzc149J2NvbC1tZC0nXSwKKyAgW2NsYXNzXj0nY29sLW1kLW9mZnNldC0nXSwKKyAgLnJvd1tjbGFzcyo9J2NvbHMtbWQtJ10gPiAqIHsKKyAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OworICAgIGZsZXg6IDAgMCBhdXRvOworICAgIHBhZGRpbmc6IDAgY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyAyKTsgfQorCisgIC5jb2wtbWQsCisgIC5yb3cuY29scy1tZCA+ICogeworICAgIG1heC13aWR0aDogMTAwJTsKKyAgICBmbGV4LWdyb3c6IDE7CisgICAgZmxleC1iYXNpczogMDsgfQorCisgIC5jb2wtbWQtMSwKKyAgLnJvdy5jb2xzLW1kLTEgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDguMzMzMzMzMzMzMyU7CisgICAgZmxleC1iYXNpczogOC4zMzMzMzMzMzMzJTsgfQorCisgIC5jb2wtbWQtb2Zmc2V0LTAgeworICAgIG1hcmdpbi1sZWZ0OiAwOyB9CisKKyAgLmNvbC1tZC0yLAorICAucm93LmNvbHMtbWQtMiA+ICogeworICAgIG1heC13aWR0aDogMTYuNjY2NjY2NjY2NyU7CisgICAgZmxleC1iYXNpczogMTYuNjY2NjY2NjY2NyU7IH0KKworICAuY29sLW1kLW9mZnNldC0xIHsKKyAgICBtYXJnaW4tbGVmdDogOC4zMzMzMzMzMzMzJTsgfQorCisgIC5jb2wtbWQtMywKKyAgLnJvdy5jb2xzLW1kLTMgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDI1JTsKKyAgICBmbGV4LWJhc2lzOiAyNSU7IH0KKworICAuY29sLW1kLW9mZnNldC0yIHsKKyAgICBtYXJnaW4tbGVmdDogMTYuNjY2NjY2NjY2NyU7IH0KKworICAuY29sLW1kLTQsCisgIC5yb3cuY29scy1tZC00ID4gKiB7CisgICAgbWF4LXdpZHRoOiAzMy4zMzMzMzMzMzMzJTsKKyAgICBmbGV4LWJhc2lzOiAzMy4zMzMzMzMzMzMzJTsgfQorCisgIC5jb2wtbWQtb2Zmc2V0LTMgeworICAgIG1hcmdpbi1sZWZ0OiAyNSU7IH0KKworICAuY29sLW1kLTUsCisgIC5yb3cuY29scy1tZC01ID4gKiB7CisgICAgbWF4LXdpZHRoOiA0MS42NjY2NjY2NjY3JTsKKyAgICBmbGV4LWJhc2lzOiA0MS42NjY2NjY2NjY3JTsgfQorCisgIC5jb2wtbWQtb2Zmc2V0LTQgeworICAgIG1hcmdpbi1sZWZ0OiAzMy4zMzMzMzMzMzMzJTsgfQorCisgIC5jb2wtbWQtNiwKKyAgLnJvdy5jb2xzLW1kLTYgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDUwJTsKKyAgICBmbGV4LWJhc2lzOiA1MCU7IH0KKworICAuY29sLW1kLW9mZnNldC01IHsKKyAgICBtYXJnaW4tbGVmdDogNDEuNjY2NjY2NjY2NyU7IH0KKworICAuY29sLW1kLTcsCisgIC5yb3cuY29scy1tZC03ID4gKiB7CisgICAgbWF4LXdpZHRoOiA1OC4zMzMzMzMzMzMzJTsKKyAgICBmbGV4LWJhc2lzOiA1OC4zMzMzMzMzMzMzJTsgfQorCisgIC5jb2wtbWQtb2Zmc2V0LTYgeworICAgIG1hcmdpbi1sZWZ0OiA1MCU7IH0KKworICAuY29sLW1kLTgsCisgIC5yb3cuY29scy1tZC04ID4gKiB7CisgICAgbWF4LXdpZHRoOiA2Ni42NjY2NjY2NjY3JTsKKyAgICBmbGV4LWJhc2lzOiA2Ni42NjY2NjY2NjY3JTsgfQorCisgIC5jb2wtbWQtb2Zmc2V0LTcgeworICAgIG1hcmdpbi1sZWZ0OiA1OC4zMzMzMzMzMzMzJTsgfQorCisgIC5jb2wtbWQtOSwKKyAgLnJvdy5jb2xzLW1kLTkgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDc1JTsKKyAgICBmbGV4LWJhc2lzOiA3NSU7IH0KKworICAuY29sLW1kLW9mZnNldC04IHsKKyAgICBtYXJnaW4tbGVmdDogNjYuNjY2NjY2NjY2NyU7IH0KKworICAuY29sLW1kLTEwLAorICAucm93LmNvbHMtbWQtMTAgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDgzLjMzMzMzMzMzMzMlOworICAgIGZsZXgtYmFzaXM6IDgzLjMzMzMzMzMzMzMlOyB9CisKKyAgLmNvbC1tZC1vZmZzZXQtOSB7CisgICAgbWFyZ2luLWxlZnQ6IDc1JTsgfQorCisgIC5jb2wtbWQtMTEsCisgIC5yb3cuY29scy1tZC0xMSA+ICogeworICAgIG1heC13aWR0aDogOTEuNjY2NjY2NjY2NyU7CisgICAgZmxleC1iYXNpczogOTEuNjY2NjY2NjY2NyU7IH0KKworICAuY29sLW1kLW9mZnNldC0xMCB7CisgICAgbWFyZ2luLWxlZnQ6IDgzLjMzMzMzMzMzMzMlOyB9CisKKyAgLmNvbC1tZC0xMiwKKyAgLnJvdy5jb2xzLW1kLTEyID4gKiB7CisgICAgbWF4LXdpZHRoOiAxMDAlOworICAgIGZsZXgtYmFzaXM6IDEwMCU7IH0KKworICAuY29sLW1kLW9mZnNldC0xMSB7CisgICAgbWFyZ2luLWxlZnQ6IDkxLjY2NjY2NjY2NjclOyB9CisKKyAgLmNvbC1tZC1ub3JtYWwgeworICAgIG9yZGVyOiBpbml0aWFsOyB9CisKKyAgLmNvbC1tZC1maXJzdCB7CisgICAgb3JkZXI6IC05OTk7IH0KKworICAuY29sLW1kLWxhc3QgeworICAgIG9yZGVyOiA5OTk7IH0gfQorQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMTI4MHB4KSB7CisgIC5jb2wtbGcsCisgIFtjbGFzc149J2NvbC1sZy0nXSwKKyAgW2NsYXNzXj0nY29sLWxnLW9mZnNldC0nXSwKKyAgLnJvd1tjbGFzcyo9J2NvbHMtbGctJ10gPiAqIHsKKyAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OworICAgIGZsZXg6IDAgMCBhdXRvOworICAgIHBhZGRpbmc6IDAgY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyAyKTsgfQorCisgIC5jb2wtbGcsCisgIC5yb3cuY29scy1sZyA+ICogeworICAgIG1heC13aWR0aDogMTAwJTsKKyAgICBmbGV4LWdyb3c6IDE7CisgICAgZmxleC1iYXNpczogMDsgfQorCisgIC5jb2wtbGctMSwKKyAgLnJvdy5jb2xzLWxnLTEgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDguMzMzMzMzMzMzMyU7CisgICAgZmxleC1iYXNpczogOC4zMzMzMzMzMzMzJTsgfQorCisgIC5jb2wtbGctb2Zmc2V0LTAgeworICAgIG1hcmdpbi1sZWZ0OiAwOyB9CisKKyAgLmNvbC1sZy0yLAorICAucm93LmNvbHMtbGctMiA+ICogeworICAgIG1heC13aWR0aDogMTYuNjY2NjY2NjY2NyU7CisgICAgZmxleC1iYXNpczogMTYuNjY2NjY2NjY2NyU7IH0KKworICAuY29sLWxnLW9mZnNldC0xIHsKKyAgICBtYXJnaW4tbGVmdDogOC4zMzMzMzMzMzMzJTsgfQorCisgIC5jb2wtbGctMywKKyAgLnJvdy5jb2xzLWxnLTMgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDI1JTsKKyAgICBmbGV4LWJhc2lzOiAyNSU7IH0KKworICAuY29sLWxnLW9mZnNldC0yIHsKKyAgICBtYXJnaW4tbGVmdDogMTYuNjY2NjY2NjY2NyU7IH0KKworICAuY29sLWxnLTQsCisgIC5yb3cuY29scy1sZy00ID4gKiB7CisgICAgbWF4LXdpZHRoOiAzMy4zMzMzMzMzMzMzJTsKKyAgICBmbGV4LWJhc2lzOiAzMy4zMzMzMzMzMzMzJTsgfQorCisgIC5jb2wtbGctb2Zmc2V0LTMgeworICAgIG1hcmdpbi1sZWZ0OiAyNSU7IH0KKworICAuY29sLWxnLTUsCisgIC5yb3cuY29scy1sZy01ID4gKiB7CisgICAgbWF4LXdpZHRoOiA0MS42NjY2NjY2NjY3JTsKKyAgICBmbGV4LWJhc2lzOiA0MS42NjY2NjY2NjY3JTsgfQorCisgIC5jb2wtbGctb2Zmc2V0LTQgeworICAgIG1hcmdpbi1sZWZ0OiAzMy4zMzMzMzMzMzMzJTsgfQorCisgIC5jb2wtbGctNiwKKyAgLnJvdy5jb2xzLWxnLTYgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDUwJTsKKyAgICBmbGV4LWJhc2lzOiA1MCU7IH0KKworICAuY29sLWxnLW9mZnNldC01IHsKKyAgICBtYXJnaW4tbGVmdDogNDEuNjY2NjY2NjY2NyU7IH0KKworICAuY29sLWxnLTcsCisgIC5yb3cuY29scy1sZy03ID4gKiB7CisgICAgbWF4LXdpZHRoOiA1OC4zMzMzMzMzMzMzJTsKKyAgICBmbGV4LWJhc2lzOiA1OC4zMzMzMzMzMzMzJTsgfQorCisgIC5jb2wtbGctb2Zmc2V0LTYgeworICAgIG1hcmdpbi1sZWZ0OiA1MCU7IH0KKworICAuY29sLWxnLTgsCisgIC5yb3cuY29scy1sZy04ID4gKiB7CisgICAgbWF4LXdpZHRoOiA2Ni42NjY2NjY2NjY3JTsKKyAgICBmbGV4LWJhc2lzOiA2Ni42NjY2NjY2NjY3JTsgfQorCisgIC5jb2wtbGctb2Zmc2V0LTcgeworICAgIG1hcmdpbi1sZWZ0OiA1OC4zMzMzMzMzMzMzJTsgfQorCisgIC5jb2wtbGctOSwKKyAgLnJvdy5jb2xzLWxnLTkgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDc1JTsKKyAgICBmbGV4LWJhc2lzOiA3NSU7IH0KKworICAuY29sLWxnLW9mZnNldC04IHsKKyAgICBtYXJnaW4tbGVmdDogNjYuNjY2NjY2NjY2NyU7IH0KKworICAuY29sLWxnLTEwLAorICAucm93LmNvbHMtbGctMTAgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDgzLjMzMzMzMzMzMzMlOworICAgIGZsZXgtYmFzaXM6IDgzLjMzMzMzMzMzMzMlOyB9CisKKyAgLmNvbC1sZy1vZmZzZXQtOSB7CisgICAgbWFyZ2luLWxlZnQ6IDc1JTsgfQorCisgIC5jb2wtbGctMTEsCisgIC5yb3cuY29scy1sZy0xMSA+ICogeworICAgIG1heC13aWR0aDogOTEuNjY2NjY2NjY2NyU7CisgICAgZmxleC1iYXNpczogOTEuNjY2NjY2NjY2NyU7IH0KKworICAuY29sLWxnLW9mZnNldC0xMCB7CisgICAgbWFyZ2luLWxlZnQ6IDgzLjMzMzMzMzMzMzMlOyB9CisKKyAgLmNvbC1sZy0xMiwKKyAgLnJvdy5jb2xzLWxnLTEyID4gKiB7CisgICAgbWF4LXdpZHRoOiAxMDAlOworICAgIGZsZXgtYmFzaXM6IDEwMCU7IH0KKworICAuY29sLWxnLW9mZnNldC0xMSB7CisgICAgbWFyZ2luLWxlZnQ6IDkxLjY2NjY2NjY2NjclOyB9CisKKyAgLmNvbC1sZy1ub3JtYWwgeworICAgIG9yZGVyOiBpbml0aWFsOyB9CisKKyAgLmNvbC1sZy1maXJzdCB7CisgICAgb3JkZXI6IC05OTk7IH0KKworICAuY29sLWxnLWxhc3QgeworICAgIG9yZGVyOiA5OTk7IH0gfQorLyogQ2FyZCBjb21wb25lbnQgQ1NTIHZhcmlhYmxlIGRlZmluaXRpb25zICovCis6cm9vdCB7CisgIC0tY2FyZC1iYWNrLWNvbG9yOiAjZjhmOGY4OworICAtLWNhcmQtZm9yZS1jb2xvcjogIzExMTsKKyAgLS1jYXJkLWJvcmRlci1jb2xvcjogI2RkZDsgfQorCisuY2FyZCB7CisgIGRpc3BsYXk6IGZsZXg7CisgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CisgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKKyAgYWxpZ24tc2VsZjogY2VudGVyOworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIHdpZHRoOiAxMDAlOworICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhY2stY29sb3IpOworICBjb2xvcjogdmFyKC0tY2FyZC1mb3JlLWNvbG9yKTsKKyAgYm9yZGVyOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tY2FyZC1ib3JkZXItY29sb3IpOworICBib3JkZXItcmFkaXVzOiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cyk7CisgIG1hcmdpbjogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7CisgIG92ZXJmbG93OiBoaWRkZW47IH0KKyAgQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMzIwcHgpIHsKKyAgICAuY2FyZCB7CisgICAgICBtYXgtd2lkdGg6IDMyMHB4OyB9IH0KKyAgLmNhcmQgPiAuc2VjdGlvbmUgeworICAgIGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFjay1jb2xvcik7CisgICAgY29sb3I6IHZhcigtLWNhcmQtZm9yZS1jb2xvcik7CisgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKKyAgICBtYXJnaW46IDA7CisgICAgYm9yZGVyOiAwOworICAgIGJvcmRlci1yYWRpdXM6IDA7CisgICAgYm9yZGVyLWJvdHRvbTogMC4wNjI1cmVtIHNvbGlkIHZhcigtLWNhcmQtYm9yZGVyLWNvbG9yKTsKKyAgICBwYWRkaW5nOiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZyk7CisgICAgd2lkdGg6IDEwMCU7IH0KKyAgICAuY2FyZCA+IC5zZWN0aW9uZS5tZWRpYSB7CisgICAgICBoZWlnaHQ6IDIwMHB4OworICAgICAgcGFkZGluZzogMDsKKyAgICAgIC1vLW9iamVjdC1maXQ6IGNvdmVyOworICAgICAgb2JqZWN0LWZpdDogY292ZXI7IH0KKyAgLmNhcmQgPiAuc2VjdGlvbmU6bGFzdC1jaGlsZCB7CisgICAgYm9yZGVyLWJvdHRvbTogMDsgfQorCisvKgorICBDdXN0b20gZWxlbWVudHMgZm9yIGNhcmQgZWxlbWVudHMuCisqLworQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMjQwcHgpIHsKKyAgLmNhcmQuc21hbGwgeworICAgIG1heC13aWR0aDogMjQwcHg7IH0gfQorQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNDgwcHgpIHsKKyAgLmNhcmQubGFyZ2UgeworICAgIG1heC13aWR0aDogNDgwcHg7IH0gfQorLmNhcmQuZmx1aWQgeworICBtYXgtd2lkdGg6IDEwMCU7CisgIHdpZHRoOiBhdXRvOyB9CisKKy5jYXJkLndhcm5pbmcgeworLyogIC0tY2FyZC1iYWNrLWNvbG9yOiAjZmZjYTI4OyAqLworICAtLWNhcmQtYmFjay1jb2xvcjogI2U1YjhiNzsKKyAgLS1jYXJkLWJvcmRlci1jb2xvcjogI2U4YjgyNTsgfQorCisuY2FyZC5lcnJvciB7CisgIC0tY2FyZC1iYWNrLWNvbG9yOiAjYjcxYzFjOworICAtLWNhcmQtZm9yZS1jb2xvcjogI2Y4ZjhmODsKKyAgLS1jYXJkLWJvcmRlci1jb2xvcjogI2E3MWExYTsgfQorCisuY2FyZCA+IC5zZWN0aW9uZS5kYXJrIHsKKyAgLS1jYXJkLWJhY2stY29sb3I6ICNlMGUwZTA7IH0KKworLmNhcmQgPiAuc2VjdGlvbmUuZG91YmxlLXBhZGRlZCB7CisgIHBhZGRpbmc6IGNhbGMoMS41ICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKTsgfQorCisvKgorICBEZWZpbml0aW9ucyBmb3IgZm9ybXMgYW5kIGlucHV0IGVsZW1lbnRzLgorKi8KKy8qIElucHV0X2NvbnRyb2wgbW9kdWxlIENTUyB2YXJpYWJsZSBkZWZpbml0aW9ucyAqLworOnJvb3QgeworICAtLWZvcm0tYmFjay1jb2xvcjogI2YwZjBmMDsKKyAgLS1mb3JtLWZvcmUtY29sb3I6ICMxMTE7CisgIC0tZm9ybS1ib3JkZXItY29sb3I6ICNkZGQ7CisgIC0taW5wdXQtYmFjay1jb2xvcjogI2Y4ZjhmODsKKyAgLS1pbnB1dC1mb3JlLWNvbG9yOiAjMTExOworICAtLWlucHV0LWJvcmRlci1jb2xvcjogI2RkZDsKKyAgLS1pbnB1dC1mb2N1cy1jb2xvcjogIzAyODhkMTsKKyAgLS1pbnB1dC1pbnZhbGlkLWNvbG9yOiAjZDMyZjJmOworICAtLWJ1dHRvbi1iYWNrLWNvbG9yOiAjZTJlMmUyOworICAtLWJ1dHRvbi1ob3Zlci1iYWNrLWNvbG9yOiAjZGNkY2RjOworICAtLWJ1dHRvbi1mb3JlLWNvbG9yOiAjMjEyMTIxOworICAtLWJ1dHRvbi1ib3JkZXItY29sb3I6IHRyYW5zcGFyZW50OworICAtLWJ1dHRvbi1ob3Zlci1ib3JkZXItY29sb3I6IHRyYW5zcGFyZW50OworICAtLWJ1dHRvbi1ncm91cC1ib3JkZXItY29sb3I6IHJnYmEoMTI0LCAxMjQsIDEyNCwgMC41NCk7IH0KKworZm9ybSB7CisgIGJhY2tncm91bmQ6IHZhcigtLWZvcm0tYmFjay1jb2xvcik7CisgIGNvbG9yOiB2YXIoLS1mb3JtLWZvcmUtY29sb3IpOworICBib3JkZXI6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1mb3JtLWJvcmRlci1jb2xvcik7CisgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKTsKKyAgbWFyZ2luOiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsKKyAgcGFkZGluZzogY2FsYygyICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKSB2YXIoLS11bml2ZXJzYWwtcGFkZGluZyk7IH0KKworZmllbGRzZXQgeworICBib3JkZXI6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1mb3JtLWJvcmRlci1jb2xvcik7CisgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKTsKKyAgbWFyZ2luOiBjYWxjKHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pIC8gNCk7CisgIHBhZGRpbmc6IHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKTsgfQorCitsZWdlbmQgeworICBib3gtc2l6aW5nOiBib3JkZXItYm94OworICBkaXNwbGF5OiB0YWJsZTsKKyAgbWF4LXdpZHRoOiAxMDAlOworICB3aGl0ZS1zcGFjZTogbm9ybWFsOworICBmb250LXdlaWdodDogNzAwOworICBwYWRkaW5nOiBjYWxjKHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDIpOyB9CisKK2xhYmVsIHsKKyAgcGFkZGluZzogY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyAyKSB2YXIoLS11bml2ZXJzYWwtcGFkZGluZyk7IH0KKworLmlucHV0LWdyb3VwIHsKKyAgZGlzcGxheTogaW5saW5lLWJsb2NrOyB9CisgIC5pbnB1dC1ncm91cC5mbHVpZCB7CisgICAgZGlzcGxheTogZmxleDsKKyAgICBhbGlnbi1pdGVtczogY2VudGVyOworICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOyB9CisgICAgLmlucHV0LWdyb3VwLmZsdWlkID4gaW5wdXQgeworICAgICAgbWF4LXdpZHRoOiAxMDAlOworICAgICAgZmxleC1ncm93OiAxOworICAgICAgZmxleC1iYXNpczogMHB4OyB9CisgICAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDk5cHgpIHsKKyAgICAgIC5pbnB1dC1ncm91cC5mbHVpZCB7CisgICAgICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOworICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyB9IH0KKyAgLmlucHV0LWdyb3VwLnZlcnRpY2FsIHsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOworICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IH0KKyAgICAuaW5wdXQtZ3JvdXAudmVydGljYWwgPiBpbnB1dCB7CisgICAgICBtYXgtd2lkdGg6IDEwMCU7CisgICAgICBmbGV4LWdyb3c6IDE7CisgICAgICBmbGV4LWJhc2lzOiAwcHg7IH0KKworW3R5cGU9Im51bWJlciJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLCBbdHlwZT0ibnVtYmVyIl06Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24geworICBoZWlnaHQ6IGF1dG87IH0KKworW3R5cGU9InNlYXJjaCJdIHsKKyAgLXdlYmtpdC1hcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7CisgIG91dGxpbmUtb2Zmc2V0OiAtMnB4OyB9CisKK1t0eXBlPSJzZWFyY2giXTo6LXdlYmtpdC1zZWFyY2gtY2FuY2VsLWJ1dHRvbiwKK1t0eXBlPSJzZWFyY2giXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbiB7CisgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsgfQorCitpbnB1dDpub3QoW3R5cGVdKSwgW3R5cGU9InRleHQiXSwgW3R5cGU9ImVtYWlsIl0sIFt0eXBlPSJudW1iZXIiXSwgW3R5cGU9InNlYXJjaCJdLAorW3R5cGU9InBhc3N3b3JkIl0sIFt0eXBlPSJ1cmwiXSwgW3R5cGU9InRlbCJdLCBbdHlwZT0iY2hlY2tib3giXSwgW3R5cGU9InJhZGlvIl0sIHRleHRhcmVhLCBzZWxlY3QgeworICBib3gtc2l6aW5nOiBib3JkZXItYm94OworICBiYWNrZ3JvdW5kOiB2YXIoLS1pbnB1dC1iYWNrLWNvbG9yKTsKKyAgY29sb3I6IHZhcigtLWlucHV0LWZvcmUtY29sb3IpOworICBib3JkZXI6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1pbnB1dC1ib3JkZXItY29sb3IpOworICBib3JkZXItcmFkaXVzOiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cyk7CisgIG1hcmdpbjogY2FsYyh2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSAvIDIpOworICBwYWRkaW5nOiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgY2FsYygxLjUgKiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykpOyB9CisKK2lucHV0Om5vdChbdHlwZT0iYnV0dG9uIl0pOm5vdChbdHlwZT0ic3VibWl0Il0pOm5vdChbdHlwZT0icmVzZXQiXSk6aG92ZXIsIGlucHV0Om5vdChbdHlwZT0iYnV0dG9uIl0pOm5vdChbdHlwZT0ic3VibWl0Il0pOm5vdChbdHlwZT0icmVzZXQiXSk6Zm9jdXMsIHRleHRhcmVhOmhvdmVyLCB0ZXh0YXJlYTpmb2N1cywgc2VsZWN0OmhvdmVyLCBzZWxlY3Q6Zm9jdXMgeworICBib3JkZXItY29sb3I6IHZhcigtLWlucHV0LWZvY3VzLWNvbG9yKTsKKyAgYm94LXNoYWRvdzogbm9uZTsgfQoraW5wdXQ6bm90KFt0eXBlPSJidXR0b24iXSk6bm90KFt0eXBlPSJzdWJtaXQiXSk6bm90KFt0eXBlPSJyZXNldCJdKTppbnZhbGlkLCBpbnB1dDpub3QoW3R5cGU9ImJ1dHRvbiJdKTpub3QoW3R5cGU9InN1Ym1pdCJdKTpub3QoW3R5cGU9InJlc2V0Il0pOmZvY3VzOmludmFsaWQsIHRleHRhcmVhOmludmFsaWQsIHRleHRhcmVhOmZvY3VzOmludmFsaWQsIHNlbGVjdDppbnZhbGlkLCBzZWxlY3Q6Zm9jdXM6aW52YWxpZCB7CisgIGJvcmRlci1jb2xvcjogdmFyKC0taW5wdXQtaW52YWxpZC1jb2xvcik7CisgIGJveC1zaGFkb3c6IG5vbmU7IH0KK2lucHV0Om5vdChbdHlwZT0iYnV0dG9uIl0pOm5vdChbdHlwZT0ic3VibWl0Il0pOm5vdChbdHlwZT0icmVzZXQiXSlbcmVhZG9ubHldLCB0ZXh0YXJlYVtyZWFkb25seV0sIHNlbGVjdFtyZWFkb25seV0geworICBiYWNrZ3JvdW5kOiB2YXIoLS1zZWNvbmRhcnktYmFjay1jb2xvcik7IH0KKworc2VsZWN0IHsKKyAgbWF4LXdpZHRoOiAxMDAlOyB9CisKK29wdGlvbiB7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyB9CisKK1t0eXBlPSJjaGVja2JveCJdLCBbdHlwZT0icmFkaW8iXSB7CisgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKKyAgLW1vei1hcHBlYXJhbmNlOiBub25lOworICBhcHBlYXJhbmNlOiBub25lOworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIGhlaWdodDogY2FsYygxcmVtICsgdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gMik7CisgIHdpZHRoOiBjYWxjKDFyZW0gKyB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyAyKTsKKyAgdmVydGljYWwtYWxpZ246IHRleHQtYm90dG9tOworICBwYWRkaW5nOiAwOworICBmbGV4LWJhc2lzOiBjYWxjKDFyZW0gKyB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyAyKSAhaW1wb3J0YW50OworICBmbGV4LWdyb3c6IDAgIWltcG9ydGFudDsgfQorICBbdHlwZT0iY2hlY2tib3giXTpjaGVja2VkOmJlZm9yZSwgW3R5cGU9InJhZGlvIl06Y2hlY2tlZDpiZWZvcmUgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsgfQorCitbdHlwZT0iY2hlY2tib3giXTpjaGVja2VkOmJlZm9yZSB7CisgIGNvbnRlbnQ6ICdcMjcxMyc7CisgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOworICBmb250LXNpemU6IGNhbGMoMXJlbSArIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDIpOworICB0b3A6IGNhbGMoMHJlbSAtIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSk7CisgIGxlZnQ6IGNhbGModmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gNCk7IH0KKworW3R5cGU9InJhZGlvIl0geworICBib3JkZXItcmFkaXVzOiAxMDAlOyB9CisgIFt0eXBlPSJyYWRpbyJdOmNoZWNrZWQ6YmVmb3JlIHsKKyAgICBib3JkZXItcmFkaXVzOiAxMDAlOworICAgIGNvbnRlbnQ6ICcnOworICAgIHRvcDogY2FsYygwLjA2MjVyZW0gKyB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyAyKTsKKyAgICBsZWZ0OiBjYWxjKDAuMDYyNXJlbSArIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDIpOworICAgIGJhY2tncm91bmQ6IHZhcigtLWlucHV0LWZvcmUtY29sb3IpOworICAgIHdpZHRoOiAwLjVyZW07CisgICAgaGVpZ2h0OiAwLjVyZW07IH0KKworOnBsYWNlaG9sZGVyLXNob3duIHsKKyAgY29sb3I6IHZhcigtLWlucHV0LWZvcmUtY29sb3IpOyB9CisKKzo6LW1zLXBsYWNlaG9sZGVyIHsKKyAgY29sb3I6IHZhcigtLWlucHV0LWZvcmUtY29sb3IpOworICBvcGFjaXR5OiAwLjU0OyB9CisKK2J1dHRvbjo6LW1vei1mb2N1cy1pbm5lciwgW3R5cGU9ImJ1dHRvbiJdOjotbW96LWZvY3VzLWlubmVyLCBbdHlwZT0icmVzZXQiXTo6LW1vei1mb2N1cy1pbm5lciwgW3R5cGU9InN1Ym1pdCJdOjotbW96LWZvY3VzLWlubmVyIHsKKyAgYm9yZGVyLXN0eWxlOiBub25lOworICBwYWRkaW5nOiAwOyB9CisKK2J1dHRvbiwgaHRtbCBbdHlwZT0iYnV0dG9uIl0sIFt0eXBlPSJyZXNldCJdLCBbdHlwZT0ic3VibWl0Il0geworICAtd2Via2l0LWFwcGVhcmFuY2U6IGJ1dHRvbjsgfQorCitidXR0b24geworICBvdmVyZmxvdzogdmlzaWJsZTsKKyAgdGV4dC10cmFuc2Zvcm06IG5vbmU7IH0KKworYnV0dG9uLCBbdHlwZT0iYnV0dG9uIl0sIFt0eXBlPSJzdWJtaXQiXSwgW3R5cGU9InJlc2V0Il0sCithLmJ1dHRvbiwgbGFiZWwuYnV0dG9uLCAuYnV0dG9uLAorYVtyb2xlPSJidXR0b24iXSwgbGFiZWxbcm9sZT0iYnV0dG9uIl0sIFtyb2xlPSJidXR0b24iXSB7CisgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgYmFja2dyb3VuZDogdmFyKC0tYnV0dG9uLWJhY2stY29sb3IpOworICBjb2xvcjogdmFyKC0tYnV0dG9uLWZvcmUtY29sb3IpOworICBib3JkZXI6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1idXR0b24tYm9yZGVyLWNvbG9yKTsKKyAgYm9yZGVyLXJhZGl1czogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpOworICBwYWRkaW5nOiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgY2FsYygxLjUgKiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykpOworICBtYXJnaW46IHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgIGN1cnNvcjogcG9pbnRlcjsKKyAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjNzOyB9CisgIGJ1dHRvbjpob3ZlciwgYnV0dG9uOmZvY3VzLCBbdHlwZT0iYnV0dG9uIl06aG92ZXIsIFt0eXBlPSJidXR0b24iXTpmb2N1cywgW3R5cGU9InN1Ym1pdCJdOmhvdmVyLCBbdHlwZT0ic3VibWl0Il06Zm9jdXMsIFt0eXBlPSJyZXNldCJdOmhvdmVyLCBbdHlwZT0icmVzZXQiXTpmb2N1cywKKyAgYS5idXR0b246aG92ZXIsCisgIGEuYnV0dG9uOmZvY3VzLCBsYWJlbC5idXR0b246aG92ZXIsIGxhYmVsLmJ1dHRvbjpmb2N1cywgLmJ1dHRvbjpob3ZlciwgLmJ1dHRvbjpmb2N1cywKKyAgYVtyb2xlPSJidXR0b24iXTpob3ZlciwKKyAgYVtyb2xlPSJidXR0b24iXTpmb2N1cywgbGFiZWxbcm9sZT0iYnV0dG9uIl06aG92ZXIsIGxhYmVsW3JvbGU9ImJ1dHRvbiJdOmZvY3VzLCBbcm9sZT0iYnV0dG9uIl06aG92ZXIsIFtyb2xlPSJidXR0b24iXTpmb2N1cyB7CisgICAgYmFja2dyb3VuZDogdmFyKC0tYnV0dG9uLWhvdmVyLWJhY2stY29sb3IpOworICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYnV0dG9uLWhvdmVyLWJvcmRlci1jb2xvcik7IH0KKworaW5wdXQ6ZGlzYWJsZWQsIGlucHV0W2Rpc2FibGVkXSwgdGV4dGFyZWE6ZGlzYWJsZWQsIHRleHRhcmVhW2Rpc2FibGVkXSwgc2VsZWN0OmRpc2FibGVkLCBzZWxlY3RbZGlzYWJsZWRdLCBidXR0b246ZGlzYWJsZWQsIGJ1dHRvbltkaXNhYmxlZF0sIC5idXR0b246ZGlzYWJsZWQsIC5idXR0b25bZGlzYWJsZWRdLCBbcm9sZT0iYnV0dG9uIl06ZGlzYWJsZWQsIFtyb2xlPSJidXR0b24iXVtkaXNhYmxlZF0geworICBjdXJzb3I6IG5vdC1hbGxvd2VkOworICBvcGFjaXR5OiAwLjc1OyB9CisKKy5idXR0b24tZ3JvdXAgeworICBkaXNwbGF5OiBmbGV4OworICBib3JkZXI6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1idXR0b24tZ3JvdXAtYm9yZGVyLWNvbG9yKTsKKyAgYm9yZGVyLXJhZGl1czogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpOworICBtYXJnaW46IHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOyB9CisgIC5idXR0b24tZ3JvdXAgPiBidXR0b24sIC5idXR0b24tZ3JvdXAgW3R5cGU9ImJ1dHRvbiJdLCAuYnV0dG9uLWdyb3VwID4gW3R5cGU9InN1Ym1pdCJdLCAuYnV0dG9uLWdyb3VwID4gW3R5cGU9InJlc2V0Il0sIC5idXR0b24tZ3JvdXAgPiAuYnV0dG9uLCAuYnV0dG9uLWdyb3VwID4gW3JvbGU9ImJ1dHRvbiJdIHsKKyAgICBtYXJnaW46IDA7CisgICAgbWF4LXdpZHRoOiAxMDAlOworICAgIGZsZXg6IDEgMSBhdXRvOworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICBib3JkZXI6IDA7CisgICAgYm9yZGVyLXJhZGl1czogMDsKKyAgICBib3gtc2hhZG93OiBub25lOyB9CisgIC5idXR0b24tZ3JvdXAgPiA6bm90KDpmaXJzdC1jaGlsZCkgeworICAgIGJvcmRlci1sZWZ0OiAwLjA2MjVyZW0gc29saWQgdmFyKC0tYnV0dG9uLWdyb3VwLWJvcmRlci1jb2xvcik7IH0KKyAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDk5cHgpIHsKKyAgICAuYnV0dG9uLWdyb3VwIHsKKyAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IH0KKyAgICAgIC5idXR0b24tZ3JvdXAgPiA6bm90KDpmaXJzdC1jaGlsZCkgeworICAgICAgICBib3JkZXI6IDA7CisgICAgICAgIGJvcmRlci10b3A6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1idXR0b24tZ3JvdXAtYm9yZGVyLWNvbG9yKTsgfSB9CisKKy8qCisgIEN1c3RvbSBlbGVtZW50cyBmb3IgZm9ybXMgYW5kIGlucHV0IGVsZW1lbnRzLgorKi8KK2J1dHRvbi5wcmltYXJ5LCBbdHlwZT0iYnV0dG9uIl0ucHJpbWFyeSwgW3R5cGU9InN1Ym1pdCJdLnByaW1hcnksIFt0eXBlPSJyZXNldCJdLnByaW1hcnksIC5idXR0b24ucHJpbWFyeSwgW3JvbGU9ImJ1dHRvbiJdLnByaW1hcnkgeworICAtLWJ1dHRvbi1iYWNrLWNvbG9yOiAjMTk3NmQyOworICAtLWJ1dHRvbi1mb3JlLWNvbG9yOiAjZjhmOGY4OyB9CisgIGJ1dHRvbi5wcmltYXJ5OmhvdmVyLCBidXR0b24ucHJpbWFyeTpmb2N1cywgW3R5cGU9ImJ1dHRvbiJdLnByaW1hcnk6aG92ZXIsIFt0eXBlPSJidXR0b24iXS5wcmltYXJ5OmZvY3VzLCBbdHlwZT0ic3VibWl0Il0ucHJpbWFyeTpob3ZlciwgW3R5cGU9InN1Ym1pdCJdLnByaW1hcnk6Zm9jdXMsIFt0eXBlPSJyZXNldCJdLnByaW1hcnk6aG92ZXIsIFt0eXBlPSJyZXNldCJdLnByaW1hcnk6Zm9jdXMsIC5idXR0b24ucHJpbWFyeTpob3ZlciwgLmJ1dHRvbi5wcmltYXJ5OmZvY3VzLCBbcm9sZT0iYnV0dG9uIl0ucHJpbWFyeTpob3ZlciwgW3JvbGU9ImJ1dHRvbiJdLnByaW1hcnk6Zm9jdXMgeworICAgIC0tYnV0dG9uLWhvdmVyLWJhY2stY29sb3I6ICMxNTY1YzA7IH0KKworYnV0dG9uLnNlY29uZGFyeSwgW3R5cGU9ImJ1dHRvbiJdLnNlY29uZGFyeSwgW3R5cGU9InN1Ym1pdCJdLnNlY29uZGFyeSwgW3R5cGU9InJlc2V0Il0uc2Vjb25kYXJ5LCAuYnV0dG9uLnNlY29uZGFyeSwgW3JvbGU9ImJ1dHRvbiJdLnNlY29uZGFyeSB7CisgIC0tYnV0dG9uLWJhY2stY29sb3I6ICNkMzJmMmY7CisgIC0tYnV0dG9uLWZvcmUtY29sb3I6ICNmOGY4Zjg7IH0KKyAgYnV0dG9uLnNlY29uZGFyeTpob3ZlciwgYnV0dG9uLnNlY29uZGFyeTpmb2N1cywgW3R5cGU9ImJ1dHRvbiJdLnNlY29uZGFyeTpob3ZlciwgW3R5cGU9ImJ1dHRvbiJdLnNlY29uZGFyeTpmb2N1cywgW3R5cGU9InN1Ym1pdCJdLnNlY29uZGFyeTpob3ZlciwgW3R5cGU9InN1Ym1pdCJdLnNlY29uZGFyeTpmb2N1cywgW3R5cGU9InJlc2V0Il0uc2Vjb25kYXJ5OmhvdmVyLCBbdHlwZT0icmVzZXQiXS5zZWNvbmRhcnk6Zm9jdXMsIC5idXR0b24uc2Vjb25kYXJ5OmhvdmVyLCAuYnV0dG9uLnNlY29uZGFyeTpmb2N1cywgW3JvbGU9ImJ1dHRvbiJdLnNlY29uZGFyeTpob3ZlciwgW3JvbGU9ImJ1dHRvbiJdLnNlY29uZGFyeTpmb2N1cyB7CisgICAgLS1idXR0b24taG92ZXItYmFjay1jb2xvcjogI2M2MjgyODsgfQorCitidXR0b24udGVydGlhcnksIFt0eXBlPSJidXR0b24iXS50ZXJ0aWFyeSwgW3R5cGU9InN1Ym1pdCJdLnRlcnRpYXJ5LCBbdHlwZT0icmVzZXQiXS50ZXJ0aWFyeSwgLmJ1dHRvbi50ZXJ0aWFyeSwgW3JvbGU9ImJ1dHRvbiJdLnRlcnRpYXJ5IHsKKyAgLS1idXR0b24tYmFjay1jb2xvcjogIzMwODczMjsKKyAgLS1idXR0b24tZm9yZS1jb2xvcjogI2Y4ZjhmODsgfQorICBidXR0b24udGVydGlhcnk6aG92ZXIsIGJ1dHRvbi50ZXJ0aWFyeTpmb2N1cywgW3R5cGU9ImJ1dHRvbiJdLnRlcnRpYXJ5OmhvdmVyLCBbdHlwZT0iYnV0dG9uIl0udGVydGlhcnk6Zm9jdXMsIFt0eXBlPSJzdWJtaXQiXS50ZXJ0aWFyeTpob3ZlciwgW3R5cGU9InN1Ym1pdCJdLnRlcnRpYXJ5OmZvY3VzLCBbdHlwZT0icmVzZXQiXS50ZXJ0aWFyeTpob3ZlciwgW3R5cGU9InJlc2V0Il0udGVydGlhcnk6Zm9jdXMsIC5idXR0b24udGVydGlhcnk6aG92ZXIsIC5idXR0b24udGVydGlhcnk6Zm9jdXMsIFtyb2xlPSJidXR0b24iXS50ZXJ0aWFyeTpob3ZlciwgW3JvbGU9ImJ1dHRvbiJdLnRlcnRpYXJ5OmZvY3VzIHsKKyAgICAtLWJ1dHRvbi1ob3Zlci1iYWNrLWNvbG9yOiAjMjc3NTI5OyB9CisKK2J1dHRvbi5pbnZlcnNlLCBbdHlwZT0iYnV0dG9uIl0uaW52ZXJzZSwgW3R5cGU9InN1Ym1pdCJdLmludmVyc2UsIFt0eXBlPSJyZXNldCJdLmludmVyc2UsIC5idXR0b24uaW52ZXJzZSwgW3JvbGU9ImJ1dHRvbiJdLmludmVyc2UgeworICAtLWJ1dHRvbi1iYWNrLWNvbG9yOiAjMjEyMTIxOworICAtLWJ1dHRvbi1mb3JlLWNvbG9yOiAjZjhmOGY4OyB9CisgIGJ1dHRvbi5pbnZlcnNlOmhvdmVyLCBidXR0b24uaW52ZXJzZTpmb2N1cywgW3R5cGU9ImJ1dHRvbiJdLmludmVyc2U6aG92ZXIsIFt0eXBlPSJidXR0b24iXS5pbnZlcnNlOmZvY3VzLCBbdHlwZT0ic3VibWl0Il0uaW52ZXJzZTpob3ZlciwgW3R5cGU9InN1Ym1pdCJdLmludmVyc2U6Zm9jdXMsIFt0eXBlPSJyZXNldCJdLmludmVyc2U6aG92ZXIsIFt0eXBlPSJyZXNldCJdLmludmVyc2U6Zm9jdXMsIC5idXR0b24uaW52ZXJzZTpob3ZlciwgLmJ1dHRvbi5pbnZlcnNlOmZvY3VzLCBbcm9sZT0iYnV0dG9uIl0uaW52ZXJzZTpob3ZlciwgW3JvbGU9ImJ1dHRvbiJdLmludmVyc2U6Zm9jdXMgeworICAgIC0tYnV0dG9uLWhvdmVyLWJhY2stY29sb3I6ICMxMTE7IH0KKworYnV0dG9uLnNtYWxsLCBbdHlwZT0iYnV0dG9uIl0uc21hbGwsIFt0eXBlPSJzdWJtaXQiXS5zbWFsbCwgW3R5cGU9InJlc2V0Il0uc21hbGwsIC5idXR0b24uc21hbGwsIFtyb2xlPSJidXR0b24iXS5zbWFsbCB7CisgIHBhZGRpbmc6IGNhbGMoMC41ICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKSBjYWxjKDAuNzUgKiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykpOworICBtYXJnaW46IHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOyB9CisKK2J1dHRvbi5sYXJnZSwgW3R5cGU9ImJ1dHRvbiJdLmxhcmdlLCBbdHlwZT0ic3VibWl0Il0ubGFyZ2UsIFt0eXBlPSJyZXNldCJdLmxhcmdlLCAuYnV0dG9uLmxhcmdlLCBbcm9sZT0iYnV0dG9uIl0ubGFyZ2UgeworICBwYWRkaW5nOiBjYWxjKDEuNSAqIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSkgY2FsYygyICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKTsKKyAgbWFyZ2luOiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsgfQorCisvKgorICBEZWZpbml0aW9ucyBmb3IgbmF2aWdhdGlvbiBlbGVtZW50cy4KKyovCisvKiBOYXZpZ2F0aW9uIG1vZHVsZSBDU1MgdmFyaWFibGUgZGVmaW5pdGlvbnMgKi8KKzpyb290IHsKKyAgLS1oZWFkZXItYmFjay1jb2xvcjogI2Y4ZjhmODsKKyAgLS1oZWFkZXItaG92ZXItYmFjay1jb2xvcjogI2YwZjBmMDsKKyAgLS1oZWFkZXItZm9yZS1jb2xvcjogIzQ0NDsKKyAgLS1oZWFkZXItYm9yZGVyLWNvbG9yOiAjZGRkOworICAtLW5hdi1iYWNrLWNvbG9yOiAjZjhmOGY4OworICAtLW5hdi1ob3Zlci1iYWNrLWNvbG9yOiAjZjBmMGYwOworICAtLW5hdi1mb3JlLWNvbG9yOiAjNDQ0OworICAtLW5hdi1ib3JkZXItY29sb3I6ICNkZGQ7CisgIC0tbmF2LWxpbmstY29sb3I6ICMwMjc3YmQ7CisgIC0tZm9vdGVyLWZvcmUtY29sb3I6ICM0NDQ7CisgIC0tZm9vdGVyLWJhY2stY29sb3I6ICNmOGY4Zjg7CisgIC0tZm9vdGVyLWJvcmRlci1jb2xvcjogI2RkZDsKKyAgLS1mb290ZXItbGluay1jb2xvcjogIzAyNzdiZDsKKyAgLS1kcmF3ZXItYmFjay1jb2xvcjogI2Y4ZjhmODsKKyAgLS1kcmF3ZXItaG92ZXItYmFjay1jb2xvcjogI2YwZjBmMDsKKyAgLS1kcmF3ZXItYm9yZGVyLWNvbG9yOiAjZGRkOworICAtLWRyYXdlci1jbG9zZS1jb2xvcjogIzQ0NDsgfQorCitoZWFkZXIgeworICBoZWlnaHQ6IDMuMTg3NXJlbTsKKyAgYmFja2dyb3VuZDogdmFyKC0taGVhZGVyLWJhY2stY29sb3IpOworICBjb2xvcjogdmFyKC0taGVhZGVyLWZvcmUtY29sb3IpOworICBib3JkZXItYm90dG9tOiAwLjA2MjVyZW0gc29saWQgdmFyKC0taGVhZGVyLWJvcmRlci1jb2xvcik7CisgIHBhZGRpbmc6IGNhbGModmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gNCkgMDsKKyAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgb3ZlcmZsb3cteDogYXV0bzsKKyAgb3ZlcmZsb3cteTogaGlkZGVuOyB9CisgIGhlYWRlci5yb3cgeworICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94OyB9CisgIGhlYWRlciAubG9nbyB7CisgICAgY29sb3I6IHZhcigtLWhlYWRlci1mb3JlLWNvbG9yKTsKKyAgICBmb250LXNpemU6IDEuNzVyZW07CisgICAgcGFkZGluZzogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIGNhbGMoMiAqIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSk7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9CisgIGhlYWRlciBidXR0b24sIGhlYWRlciBbdHlwZT0iYnV0dG9uIl0sIGhlYWRlciAuYnV0dG9uLCBoZWFkZXIgW3JvbGU9ImJ1dHRvbiJdIHsKKyAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICB0b3A6IGNhbGMoMHJlbSAtIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDQpOworICAgIGhlaWdodDogY2FsYygzLjE4NzVyZW0gKyB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyAyKTsKKyAgICBiYWNrZ3JvdW5kOiB2YXIoLS1oZWFkZXItYmFjay1jb2xvcik7CisgICAgbGluZS1oZWlnaHQ6IGNhbGMoMy4xODc1cmVtIC0gdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpICogMS41KTsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgY29sb3I6IHZhcigtLWhlYWRlci1mb3JlLWNvbG9yKTsKKyAgICBib3JkZXI6IDA7CisgICAgYm9yZGVyLXJhZGl1czogMDsKKyAgICBtYXJnaW46IDA7CisgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgfQorICAgIGhlYWRlciBidXR0b246aG92ZXIsIGhlYWRlciBidXR0b246Zm9jdXMsIGhlYWRlciBbdHlwZT0iYnV0dG9uIl06aG92ZXIsIGhlYWRlciBbdHlwZT0iYnV0dG9uIl06Zm9jdXMsIGhlYWRlciAuYnV0dG9uOmhvdmVyLCBoZWFkZXIgLmJ1dHRvbjpmb2N1cywgaGVhZGVyIFtyb2xlPSJidXR0b24iXTpob3ZlciwgaGVhZGVyIFtyb2xlPSJidXR0b24iXTpmb2N1cyB7CisgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1oZWFkZXItaG92ZXItYmFjay1jb2xvcik7IH0KKworbmF2IHsKKyAgYmFja2dyb3VuZDogdmFyKC0tbmF2LWJhY2stY29sb3IpOworICBjb2xvcjogdmFyKC0tbmF2LWZvcmUtY29sb3IpOworICBib3JkZXI6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1uYXYtYm9yZGVyLWNvbG9yKTsKKyAgYm9yZGVyLXJhZGl1czogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpOworICBtYXJnaW46IHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOyB9CisgIG5hdiAqIHsKKyAgICBwYWRkaW5nOiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgY2FsYygxLjUgKiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykpOyB9CisgIG5hdiBhLCBuYXYgYTp2aXNpdGVkIHsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBjb2xvcjogdmFyKC0tbmF2LWxpbmstY29sb3IpOworICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKTsKKyAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuM3M7IH0KKyAgICBuYXYgYTpob3ZlciwgbmF2IGE6Zm9jdXMsIG5hdiBhOnZpc2l0ZWQ6aG92ZXIsIG5hdiBhOnZpc2l0ZWQ6Zm9jdXMgeworICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgICAgYmFja2dyb3VuZDogdmFyKC0tbmF2LWhvdmVyLWJhY2stY29sb3IpOyB9CisgIG5hdiAuc3VibGluay0xIHsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgbWFyZ2luLWxlZnQ6IGNhbGMoMiAqIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSk7IH0KKyAgICBuYXYgLnN1YmxpbmstMTpiZWZvcmUgeworICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgbGVmdDogY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLSAxICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKTsKKyAgICAgIHRvcDogLTAuMDYyNXJlbTsKKyAgICAgIGNvbnRlbnQ6ICcnOworICAgICAgaGVpZ2h0OiAxMDAlOworICAgICAgYm9yZGVyOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tbmF2LWJvcmRlci1jb2xvcik7CisgICAgICBib3JkZXItbGVmdDogMDsgfQorICBuYXYgLnN1YmxpbmstMiB7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIG1hcmdpbi1sZWZ0OiBjYWxjKDQgKiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykpOyB9CisgICAgbmF2IC5zdWJsaW5rLTI6YmVmb3JlIHsKKyAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgIGxlZnQ6IGNhbGModmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC0gMyAqIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSk7CisgICAgICB0b3A6IC0wLjA2MjVyZW07CisgICAgICBjb250ZW50OiAnJzsKKyAgICAgIGhlaWdodDogMTAwJTsKKyAgICAgIGJvcmRlcjogMC4wNjI1cmVtIHNvbGlkIHZhcigtLW5hdi1ib3JkZXItY29sb3IpOworICAgICAgYm9yZGVyLWxlZnQ6IDA7IH0KKworZm9vdGVyIHsKKyAgYmFja2dyb3VuZDogdmFyKC0tZm9vdGVyLWJhY2stY29sb3IpOworICBjb2xvcjogdmFyKC0tZm9vdGVyLWZvcmUtY29sb3IpOworICBib3JkZXItdG9wOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tZm9vdGVyLWJvcmRlci1jb2xvcik7CisgIHBhZGRpbmc6IGNhbGMoMiAqIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSkgdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpOworICBmb250LXNpemU6IDAuODc1cmVtOyB9CisgIGZvb3RlciBhLCBmb290ZXIgYTp2aXNpdGVkIHsKKyAgICBjb2xvcjogdmFyKC0tZm9vdGVyLWxpbmstY29sb3IpOyB9CisKK2hlYWRlci5zdGlja3kgeworICBwb3NpdGlvbjogLXdlYmtpdC1zdGlja3k7CisgIHBvc2l0aW9uOiBzdGlja3k7CisgIHotaW5kZXg6IDExMDE7CisgIHRvcDogMDsgfQorCitmb290ZXIuc3RpY2t5IHsKKyAgcG9zaXRpb246IC13ZWJraXQtc3RpY2t5OworICBwb3NpdGlvbjogc3RpY2t5OworICB6LWluZGV4OiAxMTAxOworICBib3R0b206IDA7IH0KKworLmRyYXdlci10b2dnbGU6YmVmb3JlIHsKKyAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIHZlcnRpY2FsLWFsaWduOiBib3R0b207CisgIGNvbnRlbnQ6ICdcMDBhMFwyMjYxXDAwYTAnOworICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsKKyAgZm9udC1zaXplOiAxLjVlbTsgfQorQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNTAwcHgpIHsKKyAgLmRyYXdlci10b2dnbGU6bm90KC5wZXJzaXN0ZW50KSB7CisgICAgZGlzcGxheTogbm9uZTsgfSB9CisKK1t0eXBlPSJjaGVja2JveCJdLmRyYXdlciB7CisgIGhlaWdodDogMXB4OworICB3aWR0aDogMXB4OworICBtYXJnaW46IC0xcHg7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgY2xpcDogcmVjdCgwIDAgMCAwKTsKKyAgLXdlYmtpdC1jbGlwLXBhdGg6IGluc2V0KDEwMCUpOworICBjbGlwLXBhdGg6IGluc2V0KDEwMCUpOyB9CisgIFt0eXBlPSJjaGVja2JveCJdLmRyYXdlciArICogeworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgICAgcG9zaXRpb246IGZpeGVkOworICAgIHRvcDogMDsKKyAgICB3aWR0aDogMzIwcHg7CisgICAgaGVpZ2h0OiAxMDB2aDsKKyAgICBvdmVyZmxvdy15OiBhdXRvOworICAgIGJhY2tncm91bmQ6IHZhcigtLWRyYXdlci1iYWNrLWNvbG9yKTsKKyAgICBib3JkZXI6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1kcmF3ZXItYm9yZGVyLWNvbG9yKTsKKyAgICBib3JkZXItcmFkaXVzOiAwOworICAgIG1hcmdpbjogMDsKKyAgICB6LWluZGV4OiAxMTEwOworICAgIHJpZ2h0OiAtMzIwcHg7CisgICAgdHJhbnNpdGlvbjogcmlnaHQgMC4zczsgfQorICAgIFt0eXBlPSJjaGVja2JveCJdLmRyYXdlciArICogLmRyYXdlci1jbG9zZSB7CisgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICB0b3A6IHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOworICAgICAgcmlnaHQ6IHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOworICAgICAgei1pbmRleDogMTExMTsKKyAgICAgIHdpZHRoOiAycmVtOworICAgICAgaGVpZ2h0OiAycmVtOworICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpOworICAgICAgcGFkZGluZzogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpOworICAgICAgbWFyZ2luOiAwOworICAgICAgY3Vyc29yOiBwb2ludGVyOworICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjNzOyB9CisgICAgICBbdHlwZT0iY2hlY2tib3giXS5kcmF3ZXIgKyAqIC5kcmF3ZXItY2xvc2U6YmVmb3JlIHsKKyAgICAgICAgZGlzcGxheTogYmxvY2s7CisgICAgICAgIGNvbnRlbnQ6ICdcMDBENyc7CisgICAgICAgIGNvbG9yOiB2YXIoLS1kcmF3ZXItY2xvc2UtY29sb3IpOworICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgICAgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOworICAgICAgICBmb250LXNpemU6IDJyZW07CisgICAgICAgIGxpbmUtaGVpZ2h0OiAxOworICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7IH0KKyAgICAgIFt0eXBlPSJjaGVja2JveCJdLmRyYXdlciArICogLmRyYXdlci1jbG9zZTpob3ZlciwgW3R5cGU9ImNoZWNrYm94Il0uZHJhd2VyICsgKiAuZHJhd2VyLWNsb3NlOmZvY3VzIHsKKyAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tZHJhd2VyLWhvdmVyLWJhY2stY29sb3IpOyB9CisgICAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMzIwcHgpIHsKKyAgICAgIFt0eXBlPSJjaGVja2JveCJdLmRyYXdlciArICogeworICAgICAgICB3aWR0aDogMTAwJTsgfSB9CisgIFt0eXBlPSJjaGVja2JveCJdLmRyYXdlcjpjaGVja2VkICsgKiB7CisgICAgcmlnaHQ6IDA7IH0KKyAgQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNTAwcHgpIHsKKyAgICBbdHlwZT0iY2hlY2tib3giXS5kcmF3ZXI6bm90KC5wZXJzaXN0ZW50KSArICogeworICAgICAgcG9zaXRpb246IHN0YXRpYzsKKyAgICAgIGhlaWdodDogMTAwJTsKKyAgICAgIHotaW5kZXg6IDExMDA7IH0KKyAgICAgIFt0eXBlPSJjaGVja2JveCJdLmRyYXdlcjpub3QoLnBlcnNpc3RlbnQpICsgKiAuZHJhd2VyLWNsb3NlIHsKKyAgICAgICAgZGlzcGxheTogbm9uZTsgfSB9CisKKy8qCisgIERlZmluaXRpb25zIGZvciB0aGUgcmVzcG9uc2l2ZSB0YWJsZSBjb21wb25lbnQuCisqLworLyogVGFibGUgbW9kdWxlIENTUyB2YXJpYWJsZSBkZWZpbml0aW9ucy4gKi8KKzpyb290IHsKKyAgLS10YWJsZS1ib3JkZXItY29sb3I6ICNhYWE7CisgIC0tdGFibGUtYm9yZGVyLXNlcGFyYXRvci1jb2xvcjogIzY2NjsKKyAgLS10YWJsZS1oZWFkLWJhY2stY29sb3I6ICNlNmU2ZTY7CisgIC0tdGFibGUtaGVhZC1mb3JlLWNvbG9yOiAjMTExOworICAtLXRhYmxlLWJvZHktYmFjay1jb2xvcjogI2Y4ZjhmODsKKyAgLS10YWJsZS1ib2R5LWZvcmUtY29sb3I6ICMxMTE7CisgIC0tdGFibGUtYm9keS1hbHQtYmFjay1jb2xvcjogI2VlZTsgfQorCit0YWJsZSB7CisgIGJvcmRlci1jb2xsYXBzZTogc2VwYXJhdGU7CisgIGJvcmRlci1zcGFjaW5nOiAwOworICA6IG1hcmdpbjogY2FsYygxLjUgKiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSkgdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7CisgIGRpc3BsYXk6IGZsZXg7CisgIGZsZXg6IDAgMSBhdXRvOworICBmbGV4LWZsb3c6IHJvdyB3cmFwOworICBwYWRkaW5nOiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZyk7CisgIHBhZGRpbmctdG9wOiAwOworCW1hcmdpbjogY2FsYygxLjUgKiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSkgdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7CX0KKyAgdGFibGUgY2FwdGlvbiB7CisgICAgZm9udC1zaXplOiAxLjI1ICogcmVtOworICAgIG1hcmdpbjogY2FsYygyICogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbikpIDA7CisgICAgbWF4LXdpZHRoOiAxMDAlOworICAgIGZsZXg6IDAgMCAxMDAlOworCQl0ZXh0LWFsaWduOiBsZWZ0O30KKyAgdGFibGUgdGhlYWQsIHRhYmxlIHRib2R5IHsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGZsZXgtZmxvdzogcm93IHdyYXA7CisgICAgYm9yZGVyOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tdGFibGUtYm9yZGVyLWNvbG9yKTsgfQorICB0YWJsZSB0aGVhZCB7CisgICAgei1pbmRleDogOTk5OworICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKSB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cykgMCAwOworICAgIGJvcmRlci1ib3R0b206IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS10YWJsZS1ib3JkZXItc2VwYXJhdG9yLWNvbG9yKTsgfQorICB0YWJsZSB0Ym9keSB7CisgICAgYm9yZGVyLXRvcDogMDsKKyAgICBtYXJnaW4tdG9wOiBjYWxjKDAgLSB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSk7CisgICAgYm9yZGVyLXJhZGl1czogMCAwIHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKSB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cyk7IH0KKyAgdGFibGUgdHIgeworICAgIGRpc3BsYXk6IGZsZXg7CisgICAgcGFkZGluZzogMDsgfQorICB0YWJsZSB0aCwgdGFibGUgdGQgeworICAgIHBhZGRpbmc6IGNhbGMoMC41ICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKTsKKwkJZm9udC1zaXplOiAwLjlyZW07IH0KKyAgdGFibGUgdGggeworICAgIHRleHQtYWxpZ246IGxlZnQ7CisgICAgYmFja2dyb3VuZDogdmFyKC0tdGFibGUtaGVhZC1iYWNrLWNvbG9yKTsKKyAgICBjb2xvcjogdmFyKC0tdGFibGUtaGVhZC1mb3JlLWNvbG9yKTsgfQorICB0YWJsZSB0ZCB7CisgICAgYmFja2dyb3VuZDogdmFyKC0tdGFibGUtYm9keS1iYWNrLWNvbG9yKTsKKyAgICBjb2xvcjogdmFyKC0tdGFibGUtYm9keS1mb3JlLWNvbG9yKTsKKyAgICBib3JkZXItdG9wOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tdGFibGUtYm9yZGVyLWNvbG9yKTsgfQorCit0YWJsZTpub3QoLmhvcml6b250YWwpIHsKKyAgb3ZlcmZsb3c6IGF1dG87CisgIG1heC1oZWlnaHQ6IDg1MHB4OyB9CisgIHRhYmxlOm5vdCguaG9yaXpvbnRhbCkgdGhlYWQsIHRhYmxlOm5vdCguaG9yaXpvbnRhbCkgdGJvZHkgeworICAgIG1heC13aWR0aDogMTAwJTsKKyAgICBmbGV4OiAwIDAgMTAwJTsgfQorICB0YWJsZTpub3QoLmhvcml6b250YWwpIHRyIHsKKyAgICBmbGV4LWZsb3c6IHJvdyB3cmFwOworICAgIGZsZXg6IDAgMCAxMDAlOyB9CisgIHRhYmxlOm5vdCguaG9yaXpvbnRhbCkgdGgsIHRhYmxlOm5vdCguaG9yaXpvbnRhbCkgdGQgeworICAgIGZsZXg6IDEgMCAwJTsKKyAgICBvdmVyZmxvdzogaGlkZGVuOworICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyB9CisgIHRhYmxlOm5vdCguaG9yaXpvbnRhbCkgdGhlYWQgeworICAgIHBvc2l0aW9uOiBzdGlja3k7CisgICAgdG9wOiAwOyB9CisgIHRhYmxlOm5vdCguaG9yaXpvbnRhbCkgdGJvZHkgdHI6Zmlyc3QtY2hpbGQgdGQgeworICAgIGJvcmRlci10b3A6IDA7IH0KKwordGFibGUuaG9yaXpvbnRhbCB7CisgIGJvcmRlcjogMDsgfQorICB0YWJsZS5ob3Jpem9udGFsIHRoZWFkLCB0YWJsZS5ob3Jpem9udGFsIHRib2R5IHsKKyAgICBib3JkZXI6IDA7CisgICAgZmxleC1mbG93OiByb3cgbm93cmFwOyB9CisgIHRhYmxlLmhvcml6b250YWwgdGJvZHkgeworICAgIG92ZXJmbG93OiBhdXRvOworICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKKyAgICBmbGV4OiAxIDAgMDsKKyAgICBtYXJnaW4tbGVmdDogY2FsYyggNCAqIHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pKTsKKyAgICBwYWRkaW5nLWJvdHRvbTogY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyA0KTsgfQorICB0YWJsZS5ob3Jpem9udGFsIHRyIHsKKyAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOworICAgIGZsZXg6IDEgMCBhdXRvOyB9CisgIHRhYmxlLmhvcml6b250YWwgdGgsIHRhYmxlLmhvcml6b250YWwgdGQgeworICAgIHdpZHRoOiAxMDAlOworICAgIGJvcmRlcjogMDsKKyAgICBib3JkZXItYm90dG9tOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tdGFibGUtYm9yZGVyLWNvbG9yKTsgfQorICAgIHRhYmxlLmhvcml6b250YWwgdGg6bm90KDpmaXJzdC1jaGlsZCksIHRhYmxlLmhvcml6b250YWwgdGQ6bm90KDpmaXJzdC1jaGlsZCkgeworICAgICAgYm9yZGVyLXRvcDogMDsgfQorICB0YWJsZS5ob3Jpem9udGFsIHRoIHsKKyAgICB0ZXh0LWFsaWduOiByaWdodDsKKyAgICBib3JkZXItbGVmdDogMC4wNjI1cmVtIHNvbGlkIHZhcigtLXRhYmxlLWJvcmRlci1jb2xvcik7CisgICAgYm9yZGVyLXJpZ2h0OiAwLjA2MjVyZW0gc29saWQgdmFyKC0tdGFibGUtYm9yZGVyLXNlcGFyYXRvci1jb2xvcik7IH0KKyAgdGFibGUuaG9yaXpvbnRhbCB0aGVhZCB0cjpmaXJzdC1jaGlsZCB7CisgICAgcGFkZGluZy1sZWZ0OiAwOyB9CisgIHRhYmxlLmhvcml6b250YWwgdGg6Zmlyc3QtY2hpbGQsIHRhYmxlLmhvcml6b250YWwgdGQ6Zmlyc3QtY2hpbGQgeworICAgIGJvcmRlci10b3A6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS10YWJsZS1ib3JkZXItY29sb3IpOyB9CisgIHRhYmxlLmhvcml6b250YWwgdGJvZHkgdHI6bGFzdC1jaGlsZCB0ZCB7CisgICAgYm9yZGVyLXJpZ2h0OiAwLjA2MjVyZW0gc29saWQgdmFyKC0tdGFibGUtYm9yZGVyLWNvbG9yKTsgfQorICAgIHRhYmxlLmhvcml6b250YWwgdGJvZHkgdHI6bGFzdC1jaGlsZCB0ZDpmaXJzdC1jaGlsZCB7CisgICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMC4yNXJlbTsgfQorICAgIHRhYmxlLmhvcml6b250YWwgdGJvZHkgdHI6bGFzdC1jaGlsZCB0ZDpsYXN0LWNoaWxkIHsKKyAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwLjI1cmVtOyB9CisgIHRhYmxlLmhvcml6b250YWwgdGhlYWQgdHI6Zmlyc3QtY2hpbGQgdGg6Zmlyc3QtY2hpbGQgeworICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDAuMjVyZW07IH0KKyAgdGFibGUuaG9yaXpvbnRhbCB0aGVhZCB0cjpmaXJzdC1jaGlsZCB0aDpsYXN0LWNoaWxkIHsKKyAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwLjI1cmVtOyB9CisKK0BtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ5OXB4KSB7CisgIHRhYmxlLCB0YWJsZS5ob3Jpem9udGFsIHsKKyAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworICAgIGJvcmRlcjogMDsKKyAgICB3aWR0aDogMTAwJTsKKyAgICBkaXNwbGF5OiB0YWJsZTsgfQorICAgIHRhYmxlIHRoZWFkLCB0YWJsZSB0aCwgdGFibGUuaG9yaXpvbnRhbCB0aGVhZCwgdGFibGUuaG9yaXpvbnRhbCB0aCB7CisgICAgICBib3JkZXI6IDA7CisgICAgICBoZWlnaHQ6IDFweDsKKyAgICAgIHdpZHRoOiAxcHg7CisgICAgICBtYXJnaW46IC0xcHg7CisgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICAgcGFkZGluZzogMDsKKyAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgIGNsaXA6IHJlY3QoMCAwIDAgMCk7CisgICAgICAtd2Via2l0LWNsaXAtcGF0aDogaW5zZXQoMTAwJSk7CisgICAgICBjbGlwLXBhdGg6IGluc2V0KDEwMCUpOyB9CisgICAgdGFibGUgdGJvZHksIHRhYmxlLmhvcml6b250YWwgdGJvZHkgeworICAgICAgYm9yZGVyOiAwOworICAgICAgZGlzcGxheTogdGFibGUtcm93LWdyb3VwOyB9CisgICAgdGFibGUgdHIsIHRhYmxlLmhvcml6b250YWwgdHIgeworICAgICAgZGlzcGxheTogYmxvY2s7CisgICAgICBib3JkZXI6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS10YWJsZS1ib3JkZXItY29sb3IpOworICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpOworICAgICAgYmFja2dyb3VuZDogI2ZhZmFmYTsKKyAgICAgIHBhZGRpbmc6IHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKTsKKyAgICAgIG1hcmdpbjogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7CisgICAgICBtYXJnaW4tYm90dG9tOiBjYWxjKDIgKiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSk7IH0KKyAgICB0YWJsZSB0aCwgdGFibGUgdGQsIHRhYmxlLmhvcml6b250YWwgdGgsIHRhYmxlLmhvcml6b250YWwgdGQgeworICAgICAgd2lkdGg6IGF1dG87IH0KKyAgICB0YWJsZSB0ZCwgdGFibGUuaG9yaXpvbnRhbCB0ZCB7CisgICAgICBkaXNwbGF5OiBibG9jazsKKyAgICAgIGJvcmRlcjogMDsKKyAgICAgIHRleHQtYWxpZ246IHJpZ2h0OyB9CisgICAgdGFibGUgdGQ6YmVmb3JlLCB0YWJsZS5ob3Jpem9udGFsIHRkOmJlZm9yZSB7CisgICAgICBjb250ZW50OiBhdHRyKGRhdGEtbGFiZWwpOworICAgICAgZmxvYXQ6IGxlZnQ7CisgICAgICBmb250LXdlaWdodDogNjAwOyB9CisgICAgdGFibGUgdGg6Zmlyc3QtY2hpbGQsIHRhYmxlIHRkOmZpcnN0LWNoaWxkLCB0YWJsZS5ob3Jpem9udGFsIHRoOmZpcnN0LWNoaWxkLCB0YWJsZS5ob3Jpem9udGFsIHRkOmZpcnN0LWNoaWxkIHsKKyAgICAgIGJvcmRlci10b3A6IDA7IH0KKyAgICB0YWJsZSB0Ym9keSB0cjpsYXN0LWNoaWxkIHRkLCB0YWJsZS5ob3Jpem9udGFsIHRib2R5IHRyOmxhc3QtY2hpbGQgdGQgeworICAgICAgYm9yZGVyLXJpZ2h0OiAwOyB9IH0KKzpyb290IHsKKyAgLS10YWJsZS1ib2R5LWFsdC1iYWNrLWNvbG9yOiAjZWVlOyB9CisKK3RhYmxlIHRyOm50aC1vZi10eXBlKDJuKSA+IHRkIHsKKyAgYmFja2dyb3VuZDogdmFyKC0tdGFibGUtYm9keS1hbHQtYmFjay1jb2xvcik7IH0KKworQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNTAwcHgpIHsKKyAgdGFibGUgdHI6bnRoLW9mLXR5cGUoMm4pIHsKKyAgICBiYWNrZ3JvdW5kOiB2YXIoLS10YWJsZS1ib2R5LWFsdC1iYWNrLWNvbG9yKTsgfSB9Cis6cm9vdCB7CisgIC0tdGFibGUtYm9keS1ob3Zlci1iYWNrLWNvbG9yOiAjOTBjYWY5OyB9CisKK3RhYmxlLmhvdmVyYWJsZSB0cjpob3ZlciwgdGFibGUuaG92ZXJhYmxlIHRyOmhvdmVyID4gdGQsIHRhYmxlLmhvdmVyYWJsZSB0cjpmb2N1cywgdGFibGUuaG92ZXJhYmxlIHRyOmZvY3VzID4gdGQgeworICBiYWNrZ3JvdW5kOiB2YXIoLS10YWJsZS1ib2R5LWhvdmVyLWJhY2stY29sb3IpOyB9CisKK0BtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDUwMHB4KSB7CisgIHRhYmxlLmhvdmVyYWJsZSB0cjpob3ZlciwgdGFibGUuaG92ZXJhYmxlIHRyOmhvdmVyID4gdGQsIHRhYmxlLmhvdmVyYWJsZSB0cjpmb2N1cywgdGFibGUuaG92ZXJhYmxlIHRyOmZvY3VzID4gdGQgeworICAgIGJhY2tncm91bmQ6IHZhcigtLXRhYmxlLWJvZHktaG92ZXItYmFjay1jb2xvcik7IH0gfQorLyoKKyAgRGVmaW5pdGlvbnMgZm9yIGNvbnRleHR1YWwgYmFja2dyb3VuZCBlbGVtZW50cywgdG9hc3RzIGFuZCB0b29sdGlwcy4KKyovCisvKiBDb250ZXh0dWFsIG1vZHVsZSBDU1MgdmFyaWFibGUgZGVmaW5pdGlvbnMgKi8KKzpyb290IHsKKyAgLS1tYXJrLWJhY2stY29sb3I6ICMwMjc3YmQ7CisgIC0tbWFyay1mb3JlLWNvbG9yOiAjZmFmYWZhOyB9CisKK21hcmsgeworICBiYWNrZ3JvdW5kOiB2YXIoLS1tYXJrLWJhY2stY29sb3IpOworICBjb2xvcjogdmFyKC0tbWFyay1mb3JlLWNvbG9yKTsKKyAgZm9udC1zaXplOiAwLjk1ZW07CisgIGxpbmUtaGVpZ2h0OiAxZW07CisgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKTsKKyAgcGFkZGluZzogY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyA0KSBjYWxjKHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDIpOyB9CisgIG1hcmsuaW5saW5lLWJsb2NrIHsKKyAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgZm9udC1zaXplOiAxZW07CisgICAgbGluZS1oZWlnaHQ6IDEuNTsKKyAgICBwYWRkaW5nOiBjYWxjKHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDIpIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKTsgfQorCis6cm9vdCB7CisgIC0tdG9hc3QtYmFjay1jb2xvcjogIzQyNDI0MjsKKyAgLS10b2FzdC1mb3JlLWNvbG9yOiAjZmFmYWZhOyB9CisKKy50b2FzdCB7CisgIHBvc2l0aW9uOiBmaXhlZDsKKyAgYm90dG9tOiBjYWxjKHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pICogMyk7CisgIGxlZnQ6IDUwJTsKKyAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CisgIHotaW5kZXg6IDExMTE7CisgIGNvbG9yOiB2YXIoLS10b2FzdC1mb3JlLWNvbG9yKTsKKyAgYmFja2dyb3VuZDogdmFyKC0tdG9hc3QtYmFjay1jb2xvcik7CisgIGJvcmRlci1yYWRpdXM6IGNhbGModmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpICogMTYpOworICBwYWRkaW5nOiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgKiAzKTsgfQorCis6cm9vdCB7CisgIC0tdG9vbHRpcC1iYWNrLWNvbG9yOiAjMjEyMTIxOworICAtLXRvb2x0aXAtZm9yZS1jb2xvcjogI2ZhZmFmYTsgfQorCisudG9vbHRpcCB7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgZGlzcGxheTogaW5saW5lLWJsb2NrOyB9CisgIC50b29sdGlwOmJlZm9yZSwgLnRvb2x0aXA6YWZ0ZXIgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICBvcGFjaXR5OiAwOworICAgIGNsaXA6IHJlY3QoMCAwIDAgMCk7CisgICAgLXdlYmtpdC1jbGlwLXBhdGg6IGluc2V0KDEwMCUpOworICAgIGNsaXAtcGF0aDogaW5zZXQoMTAwJSk7CisgICAgdHJhbnNpdGlvbjogYWxsIDAuM3M7CisgICAgei1pbmRleDogMTAxMDsKKyAgICBsZWZ0OiA1MCU7IH0KKyAgLnRvb2x0aXA6bm90KC5ib3R0b20pOmJlZm9yZSwgLnRvb2x0aXA6bm90KC5ib3R0b20pOmFmdGVyIHsKKyAgICBib3R0b206IDc1JTsgfQorICAudG9vbHRpcC5ib3R0b206YmVmb3JlLCAudG9vbHRpcC5ib3R0b206YWZ0ZXIgeworICAgIHRvcDogNzUlOyB9CisgIC50b29sdGlwOmhvdmVyOmJlZm9yZSwgLnRvb2x0aXA6aG92ZXI6YWZ0ZXIsIC50b29sdGlwOmZvY3VzOmJlZm9yZSwgLnRvb2x0aXA6Zm9jdXM6YWZ0ZXIgeworICAgIG9wYWNpdHk6IDE7CisgICAgY2xpcDogYXV0bzsKKyAgICAtd2Via2l0LWNsaXAtcGF0aDogaW5zZXQoMCUpOworICAgIGNsaXAtcGF0aDogaW5zZXQoMCUpOyB9CisgIC50b29sdGlwOmJlZm9yZSB7CisgICAgY29udGVudDogJyc7CisgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CisgICAgYm9yZGVyOiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSBzb2xpZCB0cmFuc3BhcmVudDsKKyAgICBsZWZ0OiBjYWxjKDUwJSAtIHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pKTsgfQorICAudG9vbHRpcDpub3QoLmJvdHRvbSk6YmVmb3JlIHsKKyAgICBib3JkZXItdG9wLWNvbG9yOiAjMjEyMTIxOyB9CisgIC50b29sdGlwLmJvdHRvbTpiZWZvcmUgeworICAgIGJvcmRlci1ib3R0b20tY29sb3I6ICMyMTIxMjE7IH0KKyAgLnRvb2x0aXA6YWZ0ZXIgeworICAgIGNvbnRlbnQ6IGF0dHIoYXJpYS1sYWJlbCk7CisgICAgY29sb3I6IHZhcigtLXRvb2x0aXAtZm9yZS1jb2xvcik7CisgICAgYmFja2dyb3VuZDogdmFyKC0tdG9vbHRpcC1iYWNrLWNvbG9yKTsKKyAgICBib3JkZXItcmFkaXVzOiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cyk7CisgICAgcGFkZGluZzogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpOworICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOyB9CisgIC50b29sdGlwOm5vdCguYm90dG9tKTphZnRlciB7CisgICAgbWFyZ2luLWJvdHRvbTogY2FsYygyICogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbikpOyB9CisgIC50b29sdGlwLmJvdHRvbTphZnRlciB7CisgICAgbWFyZ2luLXRvcDogY2FsYygyICogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbikpOyB9CisKKzpyb290IHsKKyAgLS1tb2RhbC1vdmVybGF5LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNDUpOworICAtLW1vZGFsLWNsb3NlLWNvbG9yOiAjNDQ0OworICAtLW1vZGFsLWNsb3NlLWhvdmVyLWNvbG9yOiAjZjBmMGYwOyB9CisKK1t0eXBlPSJjaGVja2JveCJdLm1vZGFsIHsKKyAgaGVpZ2h0OiAxcHg7CisgIHdpZHRoOiAxcHg7CisgIG1hcmdpbjogLTFweDsKKyAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgcG9zaXRpb246IGFic29sdXRlOworICBjbGlwOiByZWN0KDAgMCAwIDApOworICAtd2Via2l0LWNsaXAtcGF0aDogaW5zZXQoMTAwJSk7CisgIGNsaXAtcGF0aDogaW5zZXQoMTAwJSk7IH0KKyAgW3R5cGU9ImNoZWNrYm94Il0ubW9kYWwgKyBkaXYgeworICAgIHBvc2l0aW9uOiBmaXhlZDsKKyAgICB0b3A6IDA7CisgICAgbGVmdDogMDsKKyAgICBkaXNwbGF5OiBub25lOworICAgIHdpZHRoOiAxMDB2dzsKKyAgICBoZWlnaHQ6IDEwMHZoOworICAgIGJhY2tncm91bmQ6IHZhcigtLW1vZGFsLW92ZXJsYXktY29sb3IpOyB9CisgICAgW3R5cGU9ImNoZWNrYm94Il0ubW9kYWwgKyBkaXYgLmNhcmQgeworICAgICAgbWFyZ2luOiAwIGF1dG87CisgICAgICBtYXgtaGVpZ2h0OiA1MHZoOworICAgICAgb3ZlcmZsb3c6IGF1dG87IH0KKyAgICAgIFt0eXBlPSJjaGVja2JveCJdLm1vZGFsICsgZGl2IC5jYXJkIC5tb2RhbC1jbG9zZSB7CisgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgdG9wOiAwOworICAgICAgICByaWdodDogMDsKKyAgICAgICAgd2lkdGg6IDEuNzVyZW07CisgICAgICAgIGhlaWdodDogMS43NXJlbTsKKyAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpOworICAgICAgICBwYWRkaW5nOiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZyk7CisgICAgICAgIG1hcmdpbjogMDsKKyAgICAgICAgY3Vyc29yOiBwb2ludGVyOworICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuM3M7IH0KKyAgICAgICAgW3R5cGU9ImNoZWNrYm94Il0ubW9kYWwgKyBkaXYgLmNhcmQgLm1vZGFsLWNsb3NlOmJlZm9yZSB7CisgICAgICAgICAgZGlzcGxheTogYmxvY2s7CisgICAgICAgICAgY29udGVudDogJ1wwMEQ3JzsKKyAgICAgICAgICBjb2xvcjogdmFyKC0tbW9kYWwtY2xvc2UtY29sb3IpOworICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsKKyAgICAgICAgICBmb250LXNpemU6IDEuNzVyZW07CisgICAgICAgICAgbGluZS1oZWlnaHQ6IDE7CisgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOyB9CisgICAgICAgIFt0eXBlPSJjaGVja2JveCJdLm1vZGFsICsgZGl2IC5jYXJkIC5tb2RhbC1jbG9zZTpob3ZlciwgW3R5cGU9ImNoZWNrYm94Il0ubW9kYWwgKyBkaXYgLmNhcmQgLm1vZGFsLWNsb3NlOmZvY3VzIHsKKyAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tb2RhbC1jbG9zZS1ob3Zlci1jb2xvcik7IH0KKyAgW3R5cGU9ImNoZWNrYm94Il0ubW9kYWw6Y2hlY2tlZCArIGRpdiB7CisgICAgZGlzcGxheTogZmxleDsKKyAgICBmbGV4OiAwIDEgYXV0bzsKKyAgICB6LWluZGV4OiAxMjAwOyB9CisgICAgW3R5cGU9ImNoZWNrYm94Il0ubW9kYWw6Y2hlY2tlZCArIGRpdiAuY2FyZCAubW9kYWwtY2xvc2UgeworICAgICAgei1pbmRleDogMTIxMTsgfQorCis6cm9vdCB7CisgIC0tY29sbGFwc2UtbGFiZWwtYmFjay1jb2xvcjogI2U4ZThlODsKKyAgLS1jb2xsYXBzZS1sYWJlbC1mb3JlLWNvbG9yOiAjMjEyMTIxOworICAtLWNvbGxhcHNlLWxhYmVsLWhvdmVyLWJhY2stY29sb3I6ICNmMGYwZjA7CisgIC0tY29sbGFwc2Utc2VsZWN0ZWQtbGFiZWwtYmFjay1jb2xvcjogI2VjZWNlYzsKKyAgLS1jb2xsYXBzZS1ib3JkZXItY29sb3I6ICNkZGQ7CisgIC0tY29sbGFwc2UtY29udGVudC1iYWNrLWNvbG9yOiAjZmFmYWZhOworICAtLWNvbGxhcHNlLXNlbGVjdGVkLWxhYmVsLWJvcmRlci1jb2xvcjogIzAyNzdiZDsgfQorCisuY29sbGFwc2UgeworICB3aWR0aDogY2FsYygxMDAlIC0gMiAqIHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pKTsKKyAgb3BhY2l0eTogMTsKKyAgZGlzcGxheTogZmxleDsKKyAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKKyAgbWFyZ2luOiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsKKyAgYm9yZGVyLXJhZGl1czogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpOyB9CisgIC5jb2xsYXBzZSA+IFt0eXBlPSJyYWRpbyJdLCAuY29sbGFwc2UgPiBbdHlwZT0iY2hlY2tib3giXSB7CisgICAgaGVpZ2h0OiAxcHg7CisgICAgd2lkdGg6IDFweDsKKyAgICBtYXJnaW46IC0xcHg7CisgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgY2xpcDogcmVjdCgwIDAgMCAwKTsKKyAgICAtd2Via2l0LWNsaXAtcGF0aDogaW5zZXQoMTAwJSk7CisgICAgY2xpcC1wYXRoOiBpbnNldCgxMDAlKTsgfQorICAuY29sbGFwc2UgPiBsYWJlbCB7CisgICAgZmxleC1ncm93OiAxOworICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICBoZWlnaHQ6IDEuNXJlbTsKKyAgICBjdXJzb3I6IHBvaW50ZXI7CisgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjNzOworICAgIGNvbG9yOiB2YXIoLS1jb2xsYXBzZS1sYWJlbC1mb3JlLWNvbG9yKTsKKyAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xsYXBzZS1sYWJlbC1iYWNrLWNvbG9yKTsKKyAgICBib3JkZXI6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1jb2xsYXBzZS1ib3JkZXItY29sb3IpOworICAgIHBhZGRpbmc6IGNhbGMoMS41ICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKTsgfQorICAgIC5jb2xsYXBzZSA+IGxhYmVsOmhvdmVyLCAuY29sbGFwc2UgPiBsYWJlbDpmb2N1cyB7CisgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xsYXBzZS1sYWJlbC1ob3Zlci1iYWNrLWNvbG9yKTsgfQorICAgIC5jb2xsYXBzZSA+IGxhYmVsICsgZGl2IHsKKyAgICAgIGZsZXgtYmFzaXM6IGF1dG87CisgICAgICBoZWlnaHQ6IDFweDsKKyAgICAgIHdpZHRoOiAxcHg7CisgICAgICBtYXJnaW46IC0xcHg7CisgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgY2xpcDogcmVjdCgwIDAgMCAwKTsKKyAgICAgIC13ZWJraXQtY2xpcC1wYXRoOiBpbnNldCgxMDAlKTsKKyAgICAgIGNsaXAtcGF0aDogaW5zZXQoMTAwJSk7CisgICAgICB0cmFuc2l0aW9uOiBtYXgtaGVpZ2h0IDAuM3M7CisgICAgICBtYXgtaGVpZ2h0OiAxcHg7IH0KKyAgLmNvbGxhcHNlID4gOmNoZWNrZWQgKyBsYWJlbCB7CisgICAgYmFja2dyb3VuZDogdmFyKC0tY29sbGFwc2Utc2VsZWN0ZWQtbGFiZWwtYmFjay1jb2xvcik7CisgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdmFyKC0tY29sbGFwc2Utc2VsZWN0ZWQtbGFiZWwtYm9yZGVyLWNvbG9yKTsgfQorICAgIC5jb2xsYXBzZSA+IDpjaGVja2VkICsgbGFiZWwgKyBkaXYgeworICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKKyAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgIHdpZHRoOiAxMDAlOworICAgICAgaGVpZ2h0OiBhdXRvOworICAgICAgb3ZlcmZsb3c6IGF1dG87CisgICAgICBtYXJnaW46IDA7CisgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xsYXBzZS1jb250ZW50LWJhY2stY29sb3IpOworICAgICAgYm9yZGVyOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tY29sbGFwc2UtYm9yZGVyLWNvbG9yKTsKKyAgICAgIGJvcmRlci10b3A6IDA7CisgICAgICBwYWRkaW5nOiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZyk7CisgICAgICBjbGlwOiBhdXRvOworICAgICAgLXdlYmtpdC1jbGlwLXBhdGg6IGluc2V0KDAlKTsKKyAgICAgIGNsaXAtcGF0aDogaW5zZXQoMCUpOworICAgICAgbWF4LWhlaWdodDogODUwcHg7IH0KKyAgLmNvbGxhcHNlID4gbGFiZWw6bm90KDpmaXJzdC1vZi10eXBlKSB7CisgICAgYm9yZGVyLXRvcDogMDsgfQorICAuY29sbGFwc2UgPiBsYWJlbDpmaXJzdC1vZi10eXBlIHsKKyAgICBib3JkZXItcmFkaXVzOiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cykgdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpIDAgMDsgfQorICAuY29sbGFwc2UgPiBsYWJlbDpsYXN0LW9mLXR5cGU6bm90KDpmaXJzdC1vZi10eXBlKSB7CisgICAgYm9yZGVyLXJhZGl1czogMCAwIHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKSB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cyk7IH0KKyAgLmNvbGxhcHNlID4gbGFiZWw6bGFzdC1vZi10eXBlOmZpcnN0LW9mLXR5cGUgeworICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKTsgfQorICAuY29sbGFwc2UgPiA6Y2hlY2tlZDpsYXN0LW9mLXR5cGU6bm90KDpmaXJzdC1vZi10eXBlKSArIGxhYmVsIHsKKyAgICBib3JkZXItcmFkaXVzOiAwOyB9CisgIC5jb2xsYXBzZSA+IDpjaGVja2VkOmxhc3Qtb2YtdHlwZSArIGxhYmVsICsgZGl2IHsKKyAgICBib3JkZXItcmFkaXVzOiAwIDAgdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpIHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKTsgfQorCisvKgorICBDdXN0b20gZWxlbWVudHMgZm9yIGNvbnRleHR1YWwgYmFja2dyb3VuZCBlbGVtZW50cywgdG9hc3RzIGFuZCB0b29sdGlwcy4KKyovCittYXJrLnNlY29uZGFyeSB7CisgIC0tbWFyay1iYWNrLWNvbG9yOiAjZDMyZjJmOyB9CisKK21hcmsudGVydGlhcnkgeworICAtLW1hcmstYmFjay1jb2xvcjogIzMwODczMjsgfQorCittYXJrLnRhZyB7CisgIHBhZGRpbmc6IGNhbGModmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpLzIpIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKTsKKyAgYm9yZGVyLXJhZGl1czogMWVtOyB9CisKKy8qCisgIERlZmluaXRpb25zIGZvciBwcm9ncmVzcyBlbGVtZW50cyBhbmQgc3Bpbm5lcnMuCisqLworLyogUHJvZ2VzcyBtb2R1bGUgQ1NTIHZhcmlhYmxlIGRlZmluaXRpb25zICovCis6cm9vdCB7CisgIC0tcHJvZ3Jlc3MtYmFjay1jb2xvcjogI2RkZDsKKyAgLS1wcm9ncmVzcy1mb3JlLWNvbG9yOiAjNTU1OyB9CisKK3Byb2dyZXNzIHsKKyAgZGlzcGxheTogYmxvY2s7CisgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKKyAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOworICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7CisgIGFwcGVhcmFuY2U6IG5vbmU7CisgIGhlaWdodDogMC43NXJlbTsKKyAgd2lkdGg6IGNhbGMoMTAwJSAtIDIgKiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSk7CisgIG1hcmdpbjogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7CisgIGJvcmRlcjogMDsKKyAgYm9yZGVyLXJhZGl1czogY2FsYygyICogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpKTsKKyAgYmFja2dyb3VuZDogdmFyKC0tcHJvZ3Jlc3MtYmFjay1jb2xvcik7CisgIGNvbG9yOiB2YXIoLS1wcm9ncmVzcy1mb3JlLWNvbG9yKTsgfQorICBwcm9ncmVzczo6LXdlYmtpdC1wcm9ncmVzcy12YWx1ZSB7CisgICAgYmFja2dyb3VuZDogdmFyKC0tcHJvZ3Jlc3MtZm9yZS1jb2xvcik7CisgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogY2FsYygyICogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpKTsKKyAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiBjYWxjKDIgKiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cykpOyB9CisgIHByb2dyZXNzOjotd2Via2l0LXByb2dyZXNzLWJhciB7CisgICAgYmFja2dyb3VuZDogdmFyKC0tcHJvZ3Jlc3MtYmFjay1jb2xvcik7IH0KKyAgcHJvZ3Jlc3M6Oi1tb3otcHJvZ3Jlc3MtYmFyIHsKKyAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wcm9ncmVzcy1mb3JlLWNvbG9yKTsKKyAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiBjYWxjKDIgKiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cykpOworICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IGNhbGMoMiAqIHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKSk7IH0KKyAgcHJvZ3Jlc3NbdmFsdWU9IjEwMDAiXTo6LXdlYmtpdC1wcm9ncmVzcy12YWx1ZSB7CisgICAgYm9yZGVyLXJhZGl1czogY2FsYygyICogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpKTsgfQorICBwcm9ncmVzc1t2YWx1ZT0iMTAwMCJdOjotbW96LXByb2dyZXNzLWJhciB7CisgICAgYm9yZGVyLXJhZGl1czogY2FsYygyICogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpKTsgfQorICBwcm9ncmVzcy5pbmxpbmUgeworICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworICAgIHdpZHRoOiA2MCU7IH0KKworOnJvb3QgeworICAtLXNwaW5uZXItYmFjay1jb2xvcjogI2RkZDsKKyAgLS1zcGlubmVyLWZvcmUtY29sb3I6ICM1NTU7IH0KKworQGtleWZyYW1lcyBzcGlubmVyLWRvbnV0LWFuaW0geworICAwJSB7CisgICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7IH0KKyAgMTAwJSB7CisgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfSB9Cisuc3Bpbm5lciB7CisgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgbWFyZ2luOiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsKKyAgYm9yZGVyOiAwLjI1cmVtIHNvbGlkIHZhcigtLXNwaW5uZXItYmFjay1jb2xvcik7CisgIGJvcmRlci1sZWZ0OiAwLjI1cmVtIHNvbGlkIHZhcigtLXNwaW5uZXItZm9yZS1jb2xvcik7CisgIGJvcmRlci1yYWRpdXM6IDUwJTsKKyAgd2lkdGg6IDEuMjVyZW07CisgIGhlaWdodDogMS4yNXJlbTsKKyAgYW5pbWF0aW9uOiBzcGlubmVyLWRvbnV0LWFuaW0gMS4ycyBsaW5lYXIgaW5maW5pdGU7IH0KKworLyoKKyAgQ3VzdG9tIGVsZW1lbnRzIGZvciBwcm9ncmVzcyBiYXJzIGFuZCBzcGlubmVycy4KKyovCitwcm9ncmVzcy5wcmltYXJ5IHsKKyAgLS1wcm9ncmVzcy1mb3JlLWNvbG9yOiAjMTk3NmQyOyB9CisKK3Byb2dyZXNzLnNlY29uZGFyeSB7CisgIC0tcHJvZ3Jlc3MtZm9yZS1jb2xvcjogI2QzMmYyZjsgfQorCitwcm9ncmVzcy50ZXJ0aWFyeSB7CisgIC0tcHJvZ3Jlc3MtZm9yZS1jb2xvcjogIzMwODczMjsgfQorCisuc3Bpbm5lci5wcmltYXJ5IHsKKyAgLS1zcGlubmVyLWZvcmUtY29sb3I6ICMxOTc2ZDI7IH0KKworLnNwaW5uZXIuc2Vjb25kYXJ5IHsKKyAgLS1zcGlubmVyLWZvcmUtY29sb3I6ICNkMzJmMmY7IH0KKworLnNwaW5uZXIudGVydGlhcnkgeworICAtLXNwaW5uZXItZm9yZS1jb2xvcjogIzMwODczMjsgfQorCisvKgorICBEZWZpbml0aW9ucyBmb3IgaWNvbnMgLSBwb3dlcmVkIGJ5IEZlYXRoZXIgKGh0dHBzOi8vZmVhdGhlcmljb25zLmNvbS8pLgorKi8KK3NwYW5bY2xhc3NePSdpY29uLSddIHsKKyAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICBoZWlnaHQ6IDFlbTsKKyAgd2lkdGg6IDFlbTsKKyAgdmVydGljYWwtYWxpZ246IC0wLjEyNWVtOworICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47CisgIG1hcmdpbjogMCBjYWxjKHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pIC8gNCk7IH0KKyAgc3BhbltjbGFzc149J2ljb24tJ10uc2Vjb25kYXJ5IHsKKyAgICAtd2Via2l0LWZpbHRlcjogaW52ZXJ0KDI1JSk7CisgICAgZmlsdGVyOiBpbnZlcnQoMjUlKTsgfQorICBzcGFuW2NsYXNzXj0naWNvbi0nXS5pbnZlcnNlIHsKKyAgICAtd2Via2l0LWZpbHRlcjogaW52ZXJ0KDEwMCUpOworICAgIGZpbHRlcjogaW52ZXJ0KDEwMCUpOyB9CisKK3NwYW4uaWNvbi1hbGVydCB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyMzExMScgc3Ryb2tlLXdpZHRoPScyJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnJTNFJTNDY2lyY2xlIGN4PScxMicgY3k9JzEyJyByPScxMCclM0UlM0MvY2lyY2xlJTNFJTNDbGluZSB4MT0nMTInIHkxPSc4JyB4Mj0nMTInIHkyPScxMiclM0UlM0MvbGluZSUzRSUzQ2xpbmUgeDE9JzEyJyB5MT0nMTYnIHgyPScxMicgeTI9JzE2JyUzRSUzQy9saW5lJTNFJTNDL3N2ZyUzRSIpOyB9CitzcGFuLmljb24tYm9va21hcmsgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxMTEnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ3BhdGggZD0nTTE5IDIxbC03LTUtNyA1VjVhMiAyIDAgMCAxIDItMmgxMGEyIDIgMCAwIDEgMiAyeiclM0UlM0MvcGF0aCUzRSUzQy9zdmclM0UiKTsgfQorc3Bhbi5pY29uLWNhbGVuZGFyIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NyZWN0IHg9JzMnIHk9JzQnIHdpZHRoPScxOCcgaGVpZ2h0PScxOCcgcng9JzInIHJ5PScyJyUzRSUzQy9yZWN0JTNFJTNDbGluZSB4MT0nMTYnIHkxPScyJyB4Mj0nMTYnIHkyPSc2JyUzRSUzQy9saW5lJTNFJTNDbGluZSB4MT0nOCcgeTE9JzInIHgyPSc4JyB5Mj0nNiclM0UlM0MvbGluZSUzRSUzQ2xpbmUgeDE9JzMnIHkxPScxMCcgeDI9JzIxJyB5Mj0nMTAnJTNFJTNDL2xpbmUlM0UlM0Mvc3ZnJTNFIik7IH0KK3NwYW4uaWNvbi1jcmVkaXQgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxMTEnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ3JlY3QgeD0nMScgeT0nNCcgd2lkdGg9JzIyJyBoZWlnaHQ9JzE2JyByeD0nMicgcnk9JzInJTNFJTNDL3JlY3QlM0UlM0NsaW5lIHgxPScxJyB5MT0nMTAnIHgyPScyMycgeTI9JzEwJyUzRSUzQy9saW5lJTNFJTNDL3N2ZyUzRSIpOyB9CitzcGFuLmljb24tZWRpdCB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyMzExMScgc3Ryb2tlLXdpZHRoPScyJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnJTNFJTNDcGF0aCBkPSdNMjAgMTQuNjZWMjBhMiAyIDAgMCAxLTIgMkg0YTIgMiAwIDAgMS0yLTJWNmEyIDIgMCAwIDEgMi0yaDUuMzQnJTNFJTNDL3BhdGglM0UlM0Nwb2x5Z29uIHBvaW50cz0nMTggMiAyMiA2IDEyIDE2IDggMTYgOCAxMiAxOCAyJyUzRSUzQy9wb2x5Z29uJTNFJTNDL3N2ZyUzRSIpOyB9CitzcGFuLmljb24tbGluayB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyMzExMScgc3Ryb2tlLXdpZHRoPScyJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnJTNFJTNDcGF0aCBkPSdNMTggMTN2NmEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMlY4YTIgMiAwIDAgMSAyLTJoNiclM0UlM0MvcGF0aCUzRSUzQ3BvbHlsaW5lIHBvaW50cz0nMTUgMyAyMSAzIDIxIDknJTNFJTNDL3BvbHlsaW5lJTNFJTNDbGluZSB4MT0nMTAnIHkxPScxNCcgeDI9JzIxJyB5Mj0nMyclM0UlM0MvbGluZSUzRSUzQy9zdmclM0UiKTsgfQorc3Bhbi5pY29uLWhlbHAgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxMTEnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ3BhdGggZD0nTTkuMDkgOWEzIDMgMCAwIDEgNS44MyAxYzAgMi0zIDMtMyAzJyUzRSUzQy9wYXRoJTNFJTNDY2lyY2xlIGN4PScxMicgY3k9JzEyJyByPScxMCclM0UlM0MvY2lyY2xlJTNFJTNDbGluZSB4MT0nMTInIHkxPScxNycgeDI9JzEyJyB5Mj0nMTcnJTNFJTNDL2xpbmUlM0UlM0Mvc3ZnJTNFIik7IH0KK3NwYW4uaWNvbi1ob21lIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NwYXRoIGQ9J00zIDlsOS03IDkgN3YxMWEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnonJTNFJTNDL3BhdGglM0UlM0Nwb2x5bGluZSBwb2ludHM9JzkgMjIgOSAxMiAxNSAxMiAxNSAyMiclM0UlM0MvcG9seWxpbmUlM0UlM0Mvc3ZnJTNFIik7IH0KK3NwYW4uaWNvbi1pbmZvIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NjaXJjbGUgY3g9JzEyJyBjeT0nMTInIHI9JzEwJyUzRSUzQy9jaXJjbGUlM0UlM0NsaW5lIHgxPScxMicgeTE9JzE2JyB4Mj0nMTInIHkyPScxMiclM0UlM0MvbGluZSUzRSUzQ2xpbmUgeDE9JzEyJyB5MT0nOCcgeDI9JzEyJyB5Mj0nOCclM0UlM0MvbGluZSUzRSUzQy9zdmclM0UiKTsgfQorc3Bhbi5pY29uLWxvY2sgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxMTEnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ3JlY3QgeD0nMycgeT0nMTEnIHdpZHRoPScxOCcgaGVpZ2h0PScxMScgcng9JzInIHJ5PScyJyUzRSUzQy9yZWN0JTNFJTNDcGF0aCBkPSdNNyAxMVY3YTUgNSAwIDAgMSAxMCAwdjQnJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIik7IH0KK3NwYW4uaWNvbi1tYWlsIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NwYXRoIGQ9J000IDRoMTZjMS4xIDAgMiAuOSAyIDJ2MTJjMCAxLjEtLjkgMi0yIDJINGMtMS4xIDAtMi0uOS0yLTJWNmMwLTEuMS45LTIgMi0yeiclM0UlM0MvcGF0aCUzRSUzQ3BvbHlsaW5lIHBvaW50cz0nMjIsNiAxMiwxMyAyLDYnJTNFJTNDL3BvbHlsaW5lJTNFJTNDL3N2ZyUzRSIpOyB9CitzcGFuLmljb24tbG9jYXRpb24geworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxMTEnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ3BhdGggZD0nTTIxIDEwYzAgNy05IDEzLTkgMTNzLTktNi05LTEzYTkgOSAwIDAgMSAxOCAweiclM0UlM0MvcGF0aCUzRSUzQ2NpcmNsZSBjeD0nMTInIGN5PScxMCcgcj0nMyclM0UlM0MvY2lyY2xlJTNFJTNDL3N2ZyUzRSIpOyB9CitzcGFuLmljb24tcGhvbmUgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxMTEnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ3BhdGggZD0nTTIyIDE2LjkydjNhMiAyIDAgMCAxLTIuMTggMiAxOS43OSAxOS43OSAwIDAgMS04LjYzLTMuMDcgMTkuNSAxOS41IDAgMCAxLTYtNiAxOS43OSAxOS43OSAwIDAgMS0zLjA3LTguNjdBMiAyIDAgMCAxIDQuMTEgMmgzYTIgMiAwIDAgMSAyIDEuNzIgMTIuODQgMTIuODQgMCAwIDAgLjcgMi44MSAyIDIgMCAwIDEtLjQ1IDIuMTFMOC4wOSA5LjkxYTE2IDE2IDAgMCAwIDYgNmwxLjI3LTEuMjdhMiAyIDAgMCAxIDIuMTEtLjQ1IDEyLjg0IDEyLjg0IDAgMCAwIDIuODEuN0EyIDIgMCAwIDEgMjIgMTYuOTJ6JyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSIpOyB9CitzcGFuLmljb24tcnNzIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NwYXRoIGQ9J000IDExYTkgOSAwIDAgMSA5IDknJTNFJTNDL3BhdGglM0UlM0NwYXRoIGQ9J000IDRhMTYgMTYgMCAwIDEgMTYgMTYnJTNFJTNDL3BhdGglM0UlM0NjaXJjbGUgY3g9JzUnIGN5PScxOScgcj0nMSclM0UlM0MvY2lyY2xlJTNFJTNDL3N2ZyUzRSIpOyB9CitzcGFuLmljb24tc2VhcmNoIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NjaXJjbGUgY3g9JzExJyBjeT0nMTEnIHI9JzgnJTNFJTNDL2NpcmNsZSUzRSUzQ2xpbmUgeDE9JzIxJyB5MT0nMjEnIHgyPScxNi42NScgeTI9JzE2LjY1JyUzRSUzQy9saW5lJTNFJTNDL3N2ZyUzRSIpOyB9CitzcGFuLmljb24tc2V0dGluZ3MgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxMTEnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ2NpcmNsZSBjeD0nMTInIGN5PScxMicgcj0nMyclM0UlM0MvY2lyY2xlJTNFJTNDcGF0aCBkPSdNMTkuNCAxNWExLjY1IDEuNjUgMCAwIDAgLjMzIDEuODJsLjA2LjA2YTIgMiAwIDAgMSAwIDIuODMgMiAyIDAgMCAxLTIuODMgMGwtLjA2LS4wNmExLjY1IDEuNjUgMCAwIDAtMS44Mi0uMzMgMS42NSAxLjY1IDAgMCAwLTEgMS41MVYyMWEyIDIgMCAwIDEtMiAyIDIgMiAwIDAgMS0yLTJ2LS4wOUExLjY1IDEuNjUgMCAwIDAgOSAxOS40YTEuNjUgMS42NSAwIDAgMC0xLjgyLjMzbC0uMDYuMDZhMiAyIDAgMCAxLTIuODMgMCAyIDIgMCAwIDEgMC0yLjgzbC4wNi0uMDZhMS42NSAxLjY1IDAgMCAwIC4zMy0xLjgyIDEuNjUgMS42NSAwIDAgMC0xLjUxLTFIM2EyIDIgMCAwIDEtMi0yIDIgMiAwIDAgMSAyLTJoLjA5QTEuNjUgMS42NSAwIDAgMCA0LjYgOWExLjY1IDEuNjUgMCAwIDAtLjMzLTEuODJsLS4wNi0uMDZhMiAyIDAgMCAxIDAtMi44MyAyIDIgMCAwIDEgMi44MyAwbC4wNi4wNmExLjY1IDEuNjUgMCAwIDAgMS44Mi4zM0g5YTEuNjUgMS42NSAwIDAgMCAxLTEuNTFWM2EyIDIgMCAwIDEgMi0yIDIgMiAwIDAgMSAyIDJ2LjA5YTEuNjUgMS42NSAwIDAgMCAxIDEuNTEgMS42NSAxLjY1IDAgMCAwIDEuODItLjMzbC4wNi0uMDZhMiAyIDAgMCAxIDIuODMgMCAyIDIgMCAwIDEgMCAyLjgzbC0uMDYuMDZhMS42NSAxLjY1IDAgMCAwLS4zMyAxLjgyVjlhMS42NSAxLjY1IDAgMCAwIDEuNTEgMUgyMWEyIDIgMCAwIDEgMiAyIDIgMiAwIDAgMS0yIDJoLS4wOWExLjY1IDEuNjUgMCAwIDAtMS41MSAxeiclM0UlM0MvcGF0aCUzRSUzQy9zdmclM0UiKTsgfQorc3Bhbi5pY29uLXNoYXJlIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NjaXJjbGUgY3g9JzE4JyBjeT0nNScgcj0nMyclM0UlM0MvY2lyY2xlJTNFJTNDY2lyY2xlIGN4PSc2JyBjeT0nMTInIHI9JzMnJTNFJTNDL2NpcmNsZSUzRSUzQ2NpcmNsZSBjeD0nMTgnIGN5PScxOScgcj0nMyclM0UlM0MvY2lyY2xlJTNFJTNDbGluZSB4MT0nOC41OScgeTE9JzEzLjUxJyB4Mj0nMTUuNDInIHkyPScxNy40OSclM0UlM0MvbGluZSUzRSUzQ2xpbmUgeDE9JzE1LjQxJyB5MT0nNi41MScgeDI9JzguNTknIHkyPScxMC40OSclM0UlM0MvbGluZSUzRSUzQy9zdmclM0UiKTsgfQorc3Bhbi5pY29uLWNhcnQgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxMTEnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ2NpcmNsZSBjeD0nOScgY3k9JzIxJyByPScxJyUzRSUzQy9jaXJjbGUlM0UlM0NjaXJjbGUgY3g9JzIwJyBjeT0nMjEnIHI9JzEnJTNFJTNDL2NpcmNsZSUzRSUzQ3BhdGggZD0nTTEgMWg0bDIuNjggMTMuMzlhMiAyIDAgMCAwIDIgMS42MWg5LjcyYTIgMiAwIDAgMCAyLTEuNjFMMjMgNkg2JyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSIpOyB9CitzcGFuLmljb24tdXBsb2FkIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NwYXRoIGQ9J00yMSAxNXY0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi00JyUzRSUzQy9wYXRoJTNFJTNDcG9seWxpbmUgcG9pbnRzPScxNyA4IDEyIDMgNyA4JyUzRSUzQy9wb2x5bGluZSUzRSUzQ2xpbmUgeDE9JzEyJyB5MT0nMycgeDI9JzEyJyB5Mj0nMTUnJTNFJTNDL2xpbmUlM0UlM0Mvc3ZnJTNFIik7IH0KK3NwYW4uaWNvbi11c2VyIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NwYXRoIGQ9J00yMCAyMXYtMmE0IDQgMCAwIDAtNC00SDhhNCA0IDAgMCAwLTQgNHYyJyUzRSUzQy9wYXRoJTNFJTNDY2lyY2xlIGN4PScxMicgY3k9JzcnIHI9JzQnJTNFJTNDL2NpcmNsZSUzRSUzQy9zdmclM0UiKTsgfQorCisvKgorICBEZWZpbml0aW9ucyBmb3IgdXRpbGl0aWVzIGFuZCBoZWxwZXIgY2xhc3Nlcy4KKyovCisvKiBVdGlsaXR5IG1vZHVsZSBDU1MgdmFyaWFibGUgZGVmaW5pdGlvbnMgKi8KKzpyb290IHsKKyAgLS1nZW5lcmljLWJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjMpOworICAtLWdlbmVyaWMtYm94LXNoYWRvdzogMCAwLjI1cmVtIDAuMjVyZW0gMCByZ2JhKDAsIDAsIDAsIDAuMTI1KSwgMCAwLjEyNXJlbSAwLjEyNXJlbSAtMC4xMjVyZW0gcmdiYSgwLCAwLCAwLCAwLjI1KTsgfQorCisuaGlkZGVuIHsKKyAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9CisKKy52aXN1YWxseS1oaWRkZW4geworICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsKKyAgd2lkdGg6IDFweCAhaW1wb3J0YW50OworICBoZWlnaHQ6IDFweCAhaW1wb3J0YW50OworICBtYXJnaW46IC0xcHggIWltcG9ydGFudDsKKyAgYm9yZGVyOiAwICFpbXBvcnRhbnQ7CisgIHBhZGRpbmc6IDAgIWltcG9ydGFudDsKKyAgY2xpcDogcmVjdCgwIDAgMCAwKSAhaW1wb3J0YW50OworICAtd2Via2l0LWNsaXAtcGF0aDogaW5zZXQoMTAwJSkgIWltcG9ydGFudDsKKyAgY2xpcC1wYXRoOiBpbnNldCgxMDAlKSAhaW1wb3J0YW50OworICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7IH0KKworLmJvcmRlcmVkIHsKKyAgYm9yZGVyOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tZ2VuZXJpYy1ib3JkZXItY29sb3IpICFpbXBvcnRhbnQ7IH0KKworLnJvdW5kZWQgeworICBib3JkZXItcmFkaXVzOiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cykgIWltcG9ydGFudDsgfQorCisuY2lyY3VsYXIgeworICBib3JkZXItcmFkaXVzOiA1MCUgIWltcG9ydGFudDsgfQorCisuc2hhZG93ZWQgeworICBib3gtc2hhZG93OiB2YXIoLS1nZW5lcmljLWJveC1zaGFkb3cpICFpbXBvcnRhbnQ7IH0KKworLnJlc3BvbnNpdmUtbWFyZ2luIHsKKyAgbWFyZ2luOiBjYWxjKHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pIC8gNCkgIWltcG9ydGFudDsgfQorICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA1MDBweCkgeworICAgIC5yZXNwb25zaXZlLW1hcmdpbiB7CisgICAgICBtYXJnaW46IGNhbGModmFyKC0tdW5pdmVyc2FsLW1hcmdpbikgLyAyKSAhaW1wb3J0YW50OyB9IH0KKyAgQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMTI4MHB4KSB7CisgICAgLnJlc3BvbnNpdmUtbWFyZ2luIHsKKyAgICAgIG1hcmdpbjogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbikgIWltcG9ydGFudDsgfSB9CisKKy5yZXNwb25zaXZlLXBhZGRpbmcgeworICBwYWRkaW5nOiBjYWxjKHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDQpICFpbXBvcnRhbnQ7IH0KKyAgQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNTAwcHgpIHsKKyAgICAucmVzcG9uc2l2ZS1wYWRkaW5nIHsKKyAgICAgIHBhZGRpbmc6IGNhbGModmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gMikgIWltcG9ydGFudDsgfSB9CisgIEBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDEyODBweCkgeworICAgIC5yZXNwb25zaXZlLXBhZGRpbmcgeworICAgICAgcGFkZGluZzogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpICFpbXBvcnRhbnQ7IH0gfQorCitAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0OTlweCkgeworICAuaGlkZGVuLXNtIHsKKyAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0gfQorQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNTAwcHgpIGFuZCAobWF4LXdpZHRoOiAxMjc5cHgpIHsKKyAgLmhpZGRlbi1tZCB7CisgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9IH0KK0BtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDEyODBweCkgeworICAuaGlkZGVuLWxnIHsKKyAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0gfQorQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDk5cHgpIHsKKyAgLnZpc3VhbGx5LWhpZGRlbi1zbSB7CisgICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7CisgICAgd2lkdGg6IDFweCAhaW1wb3J0YW50OworICAgIGhlaWdodDogMXB4ICFpbXBvcnRhbnQ7CisgICAgbWFyZ2luOiAtMXB4ICFpbXBvcnRhbnQ7CisgICAgYm9yZGVyOiAwICFpbXBvcnRhbnQ7CisgICAgcGFkZGluZzogMCAhaW1wb3J0YW50OworICAgIGNsaXA6IHJlY3QoMCAwIDAgMCkgIWltcG9ydGFudDsKKyAgICAtd2Via2l0LWNsaXAtcGF0aDogaW5zZXQoMTAwJSkgIWltcG9ydGFudDsKKyAgICBjbGlwLXBhdGg6IGluc2V0KDEwMCUpICFpbXBvcnRhbnQ7CisgICAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50OyB9IH0KK0BtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDUwMHB4KSBhbmQgKG1heC13aWR0aDogMTI3OXB4KSB7CisgIC52aXN1YWxseS1oaWRkZW4tbWQgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50OworICAgIHdpZHRoOiAxcHggIWltcG9ydGFudDsKKyAgICBoZWlnaHQ6IDFweCAhaW1wb3J0YW50OworICAgIG1hcmdpbjogLTFweCAhaW1wb3J0YW50OworICAgIGJvcmRlcjogMCAhaW1wb3J0YW50OworICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDsKKyAgICBjbGlwOiByZWN0KDAgMCAwIDApICFpbXBvcnRhbnQ7CisgICAgLXdlYmtpdC1jbGlwLXBhdGg6IGluc2V0KDEwMCUpICFpbXBvcnRhbnQ7CisgICAgY2xpcC1wYXRoOiBpbnNldCgxMDAlKSAhaW1wb3J0YW50OworICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDsgfSB9CitAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAxMjgwcHgpIHsKKyAgLnZpc3VhbGx5LWhpZGRlbi1sZyB7CisgICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7CisgICAgd2lkdGg6IDFweCAhaW1wb3J0YW50OworICAgIGhlaWdodDogMXB4ICFpbXBvcnRhbnQ7CisgICAgbWFyZ2luOiAtMXB4ICFpbXBvcnRhbnQ7CisgICAgYm9yZGVyOiAwICFpbXBvcnRhbnQ7CisgICAgcGFkZGluZzogMCAhaW1wb3J0YW50OworICAgIGNsaXA6IHJlY3QoMCAwIDAgMCkgIWltcG9ydGFudDsKKyAgICAtd2Via2l0LWNsaXAtcGF0aDogaW5zZXQoMTAwJSkgIWltcG9ydGFudDsKKyAgICBjbGlwLXBhdGg6IGluc2V0KDEwMCUpICFpbXBvcnRhbnQ7CisgICAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50OyB9IH0KKworLyojIHNvdXJjZU1hcHBpbmdVUkw9bWluaS1kZWZhdWx0LmNzcy5tYXAgKi8KZGlmZiAtLWdpdCBhL19odG1yZXNjL3N0X2xvZ28ucG5nIGIvX2h0bXJlc2Mvc3RfbG9nby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI4MDA1NwotLS0gL2Rldi9udWxsCisrKyBiL19odG1yZXNjL3N0X2xvZ28ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIK